除了任何贝叶斯 MCMC 分析的陷阱之外,您的方法没有任何根本性的错误:(1) 不收敛,(2) 先验,(3) 模型。
不收敛:我找到了一个如下所示的跟踪图:
这不是一件好事,为了更清楚地了解原因,我将更改 Traceplot 代码以仅显示跟踪的后半部分,traceplot(success_samples[10000:])
:
院长:融合的一个主要挑战是您的先决条件total_lambda_tau
,这是贝叶斯建模中的一个典型陷阱。尽管使用先前的方法可能看起来毫无意义Uniform('total_lambda_tau', lower=0, upper=100000)
,这样做的效果是说你非常确定total_lambda_tau
很大。例如,小于 10 的概率为 0.0001。更改之前的
total_lambda_tau= Uniform('total_lambda_tau', lower=0, upper=100)
total_lambda_mu = Uniform('total_lambda_mu', lower=0, upper=1000)
结果是更有希望的跟踪图:
然而,这仍然不是我在跟踪图中寻找的内容,为了获得更令人满意的结果,我建议使用“顺序扫描 Metropolis”步骤(这是 PyMC2 对于类似模型的默认设置)。您可以按如下方式指定:
step = pm.CompoundStep([pm.Metropolis([total_lambda_mu]),
pm.Metropolis([total_lambda_tau]),
pm.Metropolis([total_lambda]),
pm.Metropolis([loss_lambda_factor]),
])
这会产生一个似乎可以接受的跟踪图:
该模型:正如 @KaiLondenberg 回应的那样,您对先验采取的方法total_lambda_tau
and total_lambda_mu
不是标准方法。您描述了差异很大的事件总数(一小时 1,000 个,下一小时 1,000,000 个),但您的模型假定它呈正态分布。在空间流行病学中,我看到的类似数据的方法更像是这样的模型:
import pymc as pm, theano.tensor as T
with Model() as success_model:
loss_lambda_rate = pm.Flat('loss_lambda_rate')
error = Poisson('error', mu=totalCounts*T.exp(loss_lambda_rate),
observed=successCounts)
我确信还有其他方法在其他研究社区中也会显得更熟悉。
Here is 收集这些评论的笔记本.