在 stan 中指定整数潜在变量
Specifying integer latent variable in stan
我正在学习贝叶斯数据分析。我尝试复制 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];
问题变成我无法将 bernoulli 的变量设置为整数...
No matches for:
real ~ bernoulli(real)
我对 stan 很陌生。如果这个问题很傻,请原谅我。
Stan 不支持整数参数或让您假装真实变量是整数的技巧。它支持的是将整数变量边缘化到密度之外。然后,您可以以更高的效率和更高的尾部分辨率重建它们。
手册中有关潜在离散参数的章节是起点。它包括 CJS 人口模型的实现,这可能很熟悉。我实施了 Dorazio 和 Royle 占用模型作为案例研究,Hiroki Ito 将整个 Kery 和 Schaub 的书翻译给了 Stan。它们都链接在用户 >> 网站上的文档下。
我 运行 在回答 Statistical Rethinking 中的练习题时遇到 ulam
这个神秘的错误。当您构建 list
以传递给 ulam
的 data
参数时,请务必使用 =
而不是 <-
进行赋值。如果您不这样做,您构造的 list
将没有命名组件,并且缺少名称会产生此错误。
我正在学习贝叶斯数据分析。我尝试复制 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];
问题变成我无法将 bernoulli 的变量设置为整数...
No matches for:
real ~ bernoulli(real)
我对 stan 很陌生。如果这个问题很傻,请原谅我。
Stan 不支持整数参数或让您假装真实变量是整数的技巧。它支持的是将整数变量边缘化到密度之外。然后,您可以以更高的效率和更高的尾部分辨率重建它们。
手册中有关潜在离散参数的章节是起点。它包括 CJS 人口模型的实现,这可能很熟悉。我实施了 Dorazio 和 Royle 占用模型作为案例研究,Hiroki Ito 将整个 Kery 和 Schaub 的书翻译给了 Stan。它们都链接在用户 >> 网站上的文档下。
我 运行 在回答 Statistical Rethinking 中的练习题时遇到 ulam
这个神秘的错误。当您构建 list
以传递给 ulam
的 data
参数时,请务必使用 =
而不是 <-
进行赋值。如果您不这样做,您构造的 list
将没有命名组件,并且缺少名称会产生此错误。