如何在 PYMC3 中为层次模型生成后验预测分布

机器算法验证 贝叶斯 Python 分层贝叶斯 pymc
2022-04-17 13:20:04

有关完整示例,请参阅iPython 笔记本

下面的随机节点y_pred使我能够生成后验预测分布:

with pm.Model() as model:
    alpha = pm.Gamma('alpha', alpha=.1, beta=.1)
    mu = pm.Gamma('mu', alpha=.1, beta=.1)
    y_pred = pm.NegativeBinomial('y_pred', mu=mu, alpha=alpha)
    y_est = pm.NegativeBinomial('y_est', mu=mu, alpha=alpha, observed=messages['time_delay_seconds'].values)

    start = pm.find_MAP()
    step = pm.Metropolis(start=start)
    trace = pm.sample(20000, step, start=start, progressbar=True)

和后验预测分布图:

在此处输入图像描述

解决方案#1:@inversion 指出必须提供 shape 参数。

问题 #2:后验预测的样本不正确。他们被困在 0 或 1。任何想法如何解决这个问题?我只能用分层模型重现这个问题。

请参阅 ipython 笔记本,问题已重现

在此处输入图像描述

2个回答

如果您指定 的形状,分层模型将起作用y_pred

y_pred = pm.NegativeBinomial('y_pred', 
                             mu=mu[people_idx], 
                             alpha=alpha[people_idx],
                             shape=people.shape)

这是跟踪:

在此处输入图像描述

和后验预测图(在适当的展平之后):

y_pred = trace[burn::thin].get_values('y_pred').ravel()

在此处输入图像描述

当然,您可以people_idx 用来比较特定个体的后验预测图。

编辑:注意到y_pred需要很长时间才能摆脱 1 的值。

在此处输入图像描述

第二个@inversion 的答案。请注意,(截至 5 分钟前)直接从随机变量中抽取随机样本得到了适当的支持。这是如何执行此操作的示例:http: //pymc-devs.github.io/pymc3/postterior_predictive/