使用PyMC3预测贝叶斯线性回归中新数据的后验分布

3
使用PyMC3进行贝叶斯线性回归。我建立了我的模型,并希望使用相同的模型预测新X值的后验分布。我一直在尝试按照文档网站上的说明进行操作:https://pymc-devs.github.io/pymc3/notebooks/posterior_predictive.html(请参见“Prediction”)。这需要将您的X值作为theano共享变量进行分析,然后在模型构建后更改这些值,并运行run_ppc()。我只是举了一个例子,运行了200次迭代(实际分析需要运行更多次)。
X1_shared = theano.shared(final_df['poll_diff'].values)
Y1 = final_df['rd_diff'].values

basic_model = pm.Model()
with basic_model:

    # Priors for unknown model parameters
    sigma = HalfCauchy('sigma', beta=10, testval=1.)
    intercept = Normal('Intercept', 0, sd=20)
    x_coeff = Normal('x', 0, sd=20)

    # Define likelihood
    likelihood = Normal('y', mu=intercept + x_coeff * X1_shared,
                        sd=sigma, observed= Y1)

    #start = find_MAP()
    start = find_MAP() # Find starting value by optimization
    step = NUTS(scaling=start) # Instantiate MCMC sampling algorithm
    trace = sample(200, step, start=start)
pm.traceplot(trace)
plt.show()

enter image description here

sns.lmplot(x="poll_diff", y="rd_diff", data=final_df, size=10)
x = np.array(range(-1, 2))
pm.glm.plot_posterior_predictive(trace, samples=100, eval=x)
plt.show()

enter image description here

X1_shared.set_value(ana_2016_df['poll_diff'].values)
ppc = pm.sample_ppc(trace, model=model, samples=100)

但是我收到了以下错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-73-9c1eb48d987f> in <module>()
----> 1 ppc = pm.sample_ppc(trace, model=model, samples=100)

C:\Users\W\Anaconda3\lib\site-packages\pymc3\sampling.py in sample_ppc(trace, samples, model, vars, size, random_seed)
    349 
    350     if vars is None:
--> 351         vars = model.observed_RVs
    352 
    353     seed(random_seed)

AttributeError: module 'pymc3.model' has no attribute 'observed_RVs'

值得注意的是,如果我使用patsy符号版本而不更改变量,就不会出现此错误,但我不知道patsy格式如何接受theano共享变量。因此,解决方案要么解决我的错误消息,要么展示如何将theano共享变量引入模型的patsy版本。谢谢!

2
我无法重现你的错误。我注意到你的模型名称是 basic_model,但是你在使用 ppc = pm.sample_ppc(trace, model=model, samples=100) 时却使用了 model 变量。难道你混淆了变量吗?(可能是因为你正在使用 Jupyter 笔记本)。 - aloctavodia
哇,这解决了我的问题。感谢您抽出时间来查看它,有时候另一双眼睛的帮助真的很有用! - Flow Nuwen
1个回答

2
正如aloctavodia指出的那样,这是一个简单的变量设置错误。在ppc = pm.sample_ppc(trace, model=model, samples=100)中,model应该是model = basic_model

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接