1

我正在学习贝叶斯数据分析。我尝试复制 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)

上下文是关于检测田间的湿疹。有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];

问题变成我无法将伯努利的变量设置为整数......

No matches for: 

  real ~ bernoulli(real)

我对斯坦很陌生。如果这个问题非常愚蠢,请原谅我。

4

2 回答 2

4

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

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

于 2017-06-30T20:31:05.320 回答
0

我在回答Statistical Rethinkingulam中的练习题时遇到了这个神秘的错误。当您构造 a以传递给要确保使用而不是赋值的参数时。如果您不这样做,则您构造的组件将没有命名组件,并且缺少名称会产生此错误。listdataulam=<-list

于 2021-10-02T17:16:37.500 回答