我想用我的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)
但是我现在想使用模型为
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
界面...