3

我正在学习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). 我真的不明白它是如何获得这些数字的。

我真的希望有人可以对此有所启发。

4

1 回答 1

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]给定musigma(在对数空间中)的正态概率分布函数。

(提问的最佳地点是 Stan 用户邮件列表。)

于 2014-09-03T17:42:49.277 回答