【问题标题】:Specifying integer latent variable in stan在 stan 中指定整数潜在变量
【发布时间】:2017-06-30 07:52:52
【问题描述】:

我正在学习贝叶斯数据分析。我尝试复制 stan Trond Reitan 的教程,这些教程最初是由 WinBugs 创建的。

具体来说,我有以下数据和模型

weta.windata<-list(numdet=c(0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 0, 3, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1, 0, 3, 1, 1, 3, 1, 1, 2, 0, 2, 1, 1, 1, 1,0, 0, 0, 2, 0, 2, 4, 3, 1, 0, 0, 2, 0, 2, 2, 1, 0, 0, 1),
           numvisit=c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,4, 4, 4, 4, 4, 4, 4 ,4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3),
           nsites=72)

model_string1="
data{
int nsites;
real<lower=0> numdet[nsites];
real<lower=0> numvisit[nsites];
}
parameters{
real<lower=0> p;
real<lower=0> psi;
int<lower=0> z[nsites];
}
model{
p~uniform(0,1);
psi~uniform(0,1);

for(i in 1:nsites){
z[i]~ bernoulli(psi);
p.site[i]~z[i]*p;
numdet[i]~binomial(numvisit[i],p.site[i]);
}
}
"

mcmc_samples <- stan(model_code=model_string1, 
                      data=weta.windata, 
                      pars=c("p","psi","z"), 
                      chains=3, iter=30000, warmup=10000)

上下文是关于在田野中检测wetas。有72个站点。对于每个站点,研究人员访问了几次(即 numvisit)并记录了 weta 发现的次数(即 numdet)。

有一个潜在变量 z,描述一个站点是否有湿。 psi 是一个站点有weta的概率。 p是检测率。

我的问题是我不能将 z 声明为整数

parameters or transformed parameters cannot be integer or integer array;  found declared type int, parameter name=z
Problem with declaration.

但是,如果我将 z 设置为实数,即

real<lower=0> z[nsites];

问题变成了我无法将 bernoulli 中的变量设置为整数...

No matches for: 

  real ~ bernoulli(real)

我对 stan 很陌生。如果这个问题很傻,请见谅。

【问题讨论】:

    标签: bayesian stan rstan


    【解决方案1】:

    Stan 不支持整数参数或让您假装实变量是整数的技巧。它所支持的是将整数变量从密度中边缘化。然后,您可以以更高的效率和更高的尾部分辨率重建它们。

    手册中关于潜在离散参数的章节是开始的地方。它包括 CJS 人口模型的实现,这可能很熟悉。我实施了 Dorazio 和 Royle 占用模型作为案例研究,Hiroki Ito 将整个 Kery 和 Schaub 的书翻译给了 Stan。它们都链接在网站上的用户 >> 文档下。

    【讨论】:

      【解决方案2】:

      我在回答Statistical Rethinking 的练习题时遇到了ulam 的这个神秘错误。当您构建 list 以传递给 ulamdata 参数时,请务必使用 = 而不是 &lt;- 进行赋值。如果您不使用list,则您构造的组件将没有命名组件,并且缺少名称会产生此错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-29
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多