stan / R中的均匀分布导致采样误差

时间:2014-09-03 13:08:14

标签: r stan

我正在学习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代码中添加print语句
  • 将mu设置为10
  • 放宽/扩大统一分布中的约束
  • 及以上的组合

我注意到了一些令人惊讶的事情,因为我打印了tru_val的值 - 无论语句的顺序是什么 - 我使它打印的值大约介于0和+2之间 - 即使我设置mu <- 10; sigma <- 1;(in数据部分)和抽样声明tru_val[i] ~ uniform(9.5,10.5)。我真的不明白它是如何得到这些数字的。

我真的希望有人可以对此发表一些看法。

1 个答案:

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

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