我正在学习rstan
,目前我正在解决Gelmans“贝叶斯数据分析”中的练习。作为参考,这是关于第3章中的示例5.
它始终失败:
Initialization failed after 100 attempts.
Try specifying initial values, reducing ranges of constrained values, or reparameterizing the model.
error occurred during calling the sampler; sampling not done
这是我的R代码:
library(rstan)
scode <- "
transformed data {
real o_data[5];
o_data[1] <- 10;
o_data[2] <- 10;
o_data[3] <- 12;
o_data[4] <- 11;
o_data[5] <- 9;
}
parameters {
real mu;
real<lower=0> sigma;
real tru_val[5];
}
model {
mu ~ uniform(0.0,20.0);
sigma ~ gamma(2,1);
for (i in 1:5) {
tru_val[i] ~ normal(mu,sigma);
tru_val[i] ~ uniform(o_data[i]-0.5, o_data[i]+0.5);
}
}
"
afit <- stan(model_code = scode, verbose=TRUE)
有趣的是 - 如果我将第二个tru_val采样更改为tru_val[i] ~ normal(o_data[i],0.5);
,模型将评估得很好。
到目前为止,我尝试使用stan代码:
increment_log_p
陈述我注意到了一些令人惊讶的事情,因为我打印了tru_val的值 - 无论语句的顺序是什么 - 我使它打印的值大约介于0和+2之间 - 即使我设置mu <- 10; sigma <- 1;
(in数据部分)和抽样声明tru_val[i] ~ uniform(9.5,10.5)
。我真的不明白它是如何得到这些数字的。
我真的希望有人可以对此发表一些看法。
答案 0 :(得分:3)
变量的约束需要匹配您正在使用的分发的支持。对于tru_val[i] ~ uniform(9.5, 10.5)
,tru_val
必须定义为real<lower=9.5,upper=10.5> tru_val[5]
。
在本声明tru_val[i] ~ normal(mu, sigma)
中,Stan并未从正态分布中抽取样本并将其设置为tru_val[i]
。它正在计算联合分布函数(在对数空间中);在这种情况下,它评估tru_val[i]
给定mu
和sigma
(在日志空间中)的正态概率分布函数。
(提问的最佳地点是Stan用户邮件列表。)