pymc3中的多元线性回归

露西德废话

我已经pymc3专门使用emcee了很长时间,最近才开始学习并且遇到了一些概念上的问题。

我正在霍格的《将模型拟合到数据》的第7章中进行练习这涉及到具有任意2d不确定性的直线拟合的mcmc。在中emcee我已经很轻松地完成了此任务,但是pymc却给我带来了一些问题。

本质上可以归结为使用多元高斯似然。

到目前为止,这就是我所拥有的。

from pymc3 import  *

import numpy as np
import matplotlib.pyplot as plt

size = 200
true_intercept = 1
true_slope = 2

true_x = np.linspace(0, 1, size)
# y = a + b*x
true_regression_line = true_intercept + true_slope * true_x
# add noise

# here the errors are all the same but the real world they are usually not!
std_y, std_x = 0.1, 0.1 
y = true_regression_line + np.random.normal(scale=std_y, size=size)
x = true_x + np.random.normal(scale=std_x, size=size)

y_err = np.ones_like(y) * std_y
x_err = np.ones_like(x) * std_x

data = dict(x=x, y=y)

with Model() as model: # model specifications in PyMC3 are wrapped in a with-statement
    # Define priors
    intercept = Normal('Intercept', 0, sd=20)
    gradient = Normal('gradient', 0, sd=20)


    # Define likelihood
    likelihood = MvNormal('y', mu=intercept + gradient * x,
                        tau=1./(np.stack((y_err, x_err))**2.), observed=y)

    # start the mcmc!
    start = find_MAP() # Find starting value by optimization
    step = NUTS(scaling=start) # Instantiate MCMC sampling algorithm
    trace = sample(2000, step, start=start, progressbar=False) # draw 2000 posterior samples using NUTS sampling

这引发了错误: LinAlgError: Last 2 dimensions of the array must be square

因此,我试图传递MvNormalx和y(mus)的测量值及其相关的测量不确定性(y_errx_err)。但似乎并不喜欢2dtau参数。

有任何想法吗?这一定是可能的

谢谢

Aloctavodia

您可以尝试采用以下模型。是“常规”线性回归。但是xy已被高斯分布代替。在这里,我不仅假设输入和输出变量的测量值,而且还假设它们的误差是可靠的(例如,由测量设备提供)。如果您不信任这些错误值,则可以尝试从数据中估计它们。

with pm.Model() as model:
    intercept = pm.Normal('intercept', 0, sd=20)
    gradient = pm.Normal('gradient', 0, sd=20)
    epsilon = pm.HalfCauchy('epsilon', 5)
    obs_x = pm.Normal('obs_x', mu=x, sd=x_err, shape=len(x))
    obs_y = pm.Normal('obs_y', mu=y, sd=y_err, shape=len(y))

    likelihood = pm.Normal('y', mu=intercept + gradient * obs_x,
                    sd=epsilon, observed=obs_y)

    trace = pm.sample(2000)

如果您要从数据中估计误差,则可以合理地假设它们可以相关,因此,可以使用多元高斯代替使用两个单独的高斯函数。在这种情况下,您将最终得到如下模型:

df_data = pd.DataFrame(data)
cov = df_data.cov()

with pm.Model() as model:
    intercept = pm.Normal('intercept', 0, sd=20)
    gradient = pm.Normal('gradient', 0, sd=20)
    epsilon = pm.HalfCauchy('epsilon', 5)

    obs_xy = pm.MvNormal('obs_xy', mu=df_data, tau=pm.matrix_inverse(cov), shape=df_data.shape)

    yl = pm.Normal('yl', mu=intercept + gradient * obs_xy[:,0],
                    sd=epsilon, observed=obs_xy[:,1])

mu, sds, elbo = pm.variational.advi(n=20000)
step =  pm.NUTS(scaling=model.dict_to_array(sds), is_cov=True)
trace = pm.sample(1000, step=step, start=mu)

注意,在以前的模型中,协方差矩阵是从数据中计算出来的。如果您打算这样做,那么我认为最好使用第一个模型,但是相反,如果您要估计协方差矩阵,则第二个模型可能是明智的选择。

对于第二个模型,我使用ADVI对其进行初始化。ADVI是初始化模型的好方法,通常比find_MAP()更好。

您可能还需要检查David Hogg的存储库在《统计反思》一书中,McElreath讨论了进行线性回归的问题,包括输入和输出变量中的误差。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用pymc3和信念进行线性回归

来自分类Dev

具有sklearn.datasets的PyMC3贝叶斯线性回归预测

来自分类Dev

使用PYMC3进行回归

来自分类Dev

R中的约束多元线性回归

来自分类Dev

SAS中的非线性多元回归

来自分类Dev

无法在Tensorflow中优化多元线性回归

来自分类Dev

多元线性回归模型中的R

来自分类Dev

R中的多元线性回归的交叉验证

来自分类Dev

带有变化点的PyMC3回归

来自分类Dev

使用scatter3D在R中绘制多元线性回归

来自分类Dev

Python中的多元线性回归-MATLAB中mvregress的模拟?

来自分类Dev

PyMC3中的模型比较

来自分类Dev

Pymc3中的分类混合模型

来自分类Dev

在PyMC3中使用BetaBinomial

来自分类Dev

熊猫统计模型中的多元线性回归:ValueError

来自分类Dev

R中多元时间序列的线性回归

来自分类Dev

如何在多元线性回归模型中预测y值?

来自分类Dev

GSL中的多元线性回归正确吗?

来自分类Dev

多元线性回归:用户定义函数中的错误

来自分类Dev

多元线性回归 Python statsmodel 在输出中显示 predictorVariable[Tx]

来自分类Dev

多元线性回归成本过高

来自分类Dev

计算多元线性回归的预测

来自分类Dev

PYMC线性回归入门

来自分类Dev

处理pymc3中的实际假设-将示例从ThinkBayes移植到pymc3

来自分类Dev

使用Tensorflow的多元线性回归模型

来自分类Dev

多元线性回归列表上的Wald检验

来自分类Dev

GEKKO多元非线性回归

来自分类Dev

Python多元线性回归无法绘制

来自分类Dev

多元线性回归。Coeffs不匹配