PyMC中的复合模型

时间:2014-10-13 07:41:00

标签: python model nested pymc mcmc

我正在尝试使用PyMC 2.3来获得compound model参数的估计值。 “复合”是指跟随分布的随机变量,分布的参数是另一个随机变量。 (“嵌套”或“分层”有时用于指代这种情况,但我认为它们不那么具体,在这种情况下会产生更多混淆)。

让我们举一个具体的例子。 “实际”数据是从化合物分布生成的,该分布是泊松,其参数以指数分布。在简单的scipy中,数据生成如下:

import numpy as np
from scipy.stats import distributions
np.random.seed(3)  # for repeatability

nsamples = 1000
tau_true = 50
orig_lambda_sample = distributions.expon(scale=tau_true).rvs(nsamples)
data = distributions.poisson(orig_lambda_sample).rvs(nsamples)

我想获得模型参数tau_true的估计值。 到目前为止,我在PyMC中对此问题进行建模的方法如下:

tau = pm.Uniform('tau', 0, 100)
count_rates = pm.Exponential('count_rates', beta=1/tau, size=nsamples)
counts = pm.Poisson('counts', mu=count_rates, value=data, observed=True)

请注意,我使用size=nsamples为每个样本创建一个新的随机变量。

最后我将MCMC作为:

运行
model = pm.Model([count_rates, counts, tau])
mcmc = pm.MCMC(model)
mcmc.sample(40000, 10000)

模型收敛(尽管缓慢地,> 10 ^ 5次迭代)到以50(tau_true)为中心的分布。然而,定义1000个随机变量以适合具有单个参数的单个分布似乎是一种过度的做法。

有没有更好的方法在PyMC中描述复合模型?

PS 我还尝试了更具信息性的先验(tau = pm.Normal('tau', mu=51, tau=1/2**2)),但结果相似,收敛速度仍然很慢。

1 个答案:

答案 0 :(得分:1)

您尝试建模的内容似乎是过度分散的数据。事实上,负二项分布只是一个泊松,其平均值是根据伽马分布(指数的一般形式)分布的。因此,绕过定义1000个变量的一种方法是直接使用负二项式。但请记住,尽管名义上有1000个变量,但变量的有效数量介于1到1000之间,具体取决于均值分布的约束程度。你实际上是在这里定义一个随机效应。