我想用我的PyMC3 LR模型在新数据可用时为预测变量y的值获得80%的HPD范围。
因此,对于不在我原始数据集中的新值y推断x的可信值分布。

模型:

with pm.Model() as model_tlr:
    alpha = pm.Normal('alpha', mu=0, sd=10)
    beta = pm.Normal('beta', mu=0, sd=10)
    epsilon = pm.Uniform('epsilon', 0, 25)

    nu = pm.Deterministic('nu', pm.Exponential('nu_', 1/29) + 1)
    mu = pm.Deterministic('mu', alpha + beta * x)

    yl = pm.StudentT('yl', mu=mu, sd=epsilon, nu=nu, observed=y)

    trace_tlr = pm.sample(50000, njobs=3)


烧伤后,我从后部取样并获得HPD

ppc_tlr = pm.sample_ppc(btrace_tlr, samples=10000, model=model_tlr)
ys = ppc_tlr['yl']
y_hpd = pm.stats.hpd(ys, alpha=0.2)


这对于可视化集中趋势周围的HPD非常有用(使用fill_between)
linear-regression - PyMC3的基本贝叶斯线性回归预测-LMLPHP

但是我现在想使用模型为y(例如)x=126.2和初始数据集不包含观察到的x=126.2时获取HPD。

我从后方理解采样的方式是,数据集中每个可用的x值都有1万个采样,因此ys中没有相应的x=126.2采样,因为没有观察到。

基本上,是否有一种方法可以使用我的模型从仅在建立模型后可用的预测值x=126.2中获得可信值的分布(基于模型)?
如果是这样,怎么办?

谢谢

编辑:
找到SO Post其中提到


正在开发的功能(最终可能会添加到pymc3中)可以预测新数据的后继功能。


是否存在?

最佳答案

好的,所以有可能(或多或少)如上述SO帖子中所述。
但是,此后已将sample_ppc函数添加到PyMC3中,这使作者的run_ppc变得多余。

首先,为x设置Theano共享变量。

from theano import shared
x_shared = shared(x)


然后在构建模型时使用x_shared。

构建模型后,添加新基准并更新共享变量

x_updated = np.append(x, 126.2)
x_shared.set_value(x_updated)


使用原始跟踪和模型对象重新运行PPC样本生成器

new_ppc = pm.sample_ppc(btrace_tlr, samples=10000, model=model_tlr)


找到新基准的后验采样

sample = new_ppc['yl'][:,-1]


然后,我可以使用

pm.stats.hpd(sample)



数组([124.56126638,128.63795388])


Sklearn让我觉得应该有一个简单的predict界面...

10-08 00:30