我正在学习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
陈述 - 更改变量名以防我不小心使用了关键字
- 在 stan 代码中添加打印语句
- 将 mu 设置为 10
- 放松/扩大均匀分布中的约束
- 以及以上的组合
我注意到一些令人惊讶的事情,因为我打印了 tru_val 的值 - 无论语句的顺序如何 - 我都让它打印大约 0 的值,通常在 -2 和 +2 之间 - 即使我设置mu <- 10; sigma <- 1;
(在数据部分)和采样语句tru_val[i] ~ uniform(9.5,10.5)
. 我真的不明白它是如何获得这些数字的。
我真的希望有人可以对此有所启发。