我正在研究零膨胀计数时间数据。我建立了一个stan
模型,该模型使用if
块中的model
语句处理了零膨胀数据。正如他们在《 Stan参考指南》中所建议的那样。例如,
model {
for (n in 1:N) {
if (y[n] == 0)
target += log_sum_exp(bernoulli_lpmf(1 | theta), bernoulli_lpmf(0 | theta) + poisson_lpmf(y[n] | lambda));
else
target += bernoulli_lpmf(0 | theta) + poisson_lpmf(y[n] | lambda);
}
}
此if
语句显然是必要的,因为Stan使用NUTS作为不处理离散变量的采样器(,因此我们对这个离散随机变量进行了边际处理,而不是从中进行采样 )。我对pymc3
并没有太多的经验,但是我的理解是,它可以处理Gibbs更新步骤(从离散的bernoulli可能性中采样)。然后以零膨胀值为条件,它可以对依赖于泊松可能性的参数执行Metropolis或NUTS更新。
我的问题是:可以(,如果可以,如何)pymc3
以这样的方式从具有零值的离散零变量中采样:使用NUTS更新对连续变量进行更新?如果可以的话,性能是否比stan
中的上述实现显着提高(边缘化了离散随机变量)?此外,如果pymc3
仅支持Gibbs + Metropolis更新,那么此更改是否值得考虑?