【问题标题】:bayesian survival analysis wth rstanrstan的贝叶斯生存分析
【发布时间】:2018-09-15 21:49:20
【问题描述】:

我想构建 stan(rstan) 代码以使用 weibull 分布进行生存分析。 但我的 stan 代码总是无法工作。 如果有人知道如何处理我的问题,请教我。

我的数据是这样的

运动:(oranisum行为所花费的时间) 治疗:具有两个分类变量“A”、“B”的实验治疗 r_Day:考虑特定日期影响的随机影响

我的 stan 代码如下所示。

data {
     int N; // all data
     int D; // day
     int <lower = 0, upper = 1> Treat[N]; 
     int <lower = 0> Movment[N];
     int <lower = 1, upper = D> Day[N];
     }

 parameters {
      real <lower = 0> shape; // shape parameter
      vector[2] beta; 
      real r_Day[D];
      real <lower = 0> sigma_D; 
      }

transformed parameters{
    vector[N] scale; // scale parameter
    for(n in 1:N) scale[n] = beta[1] + beta[2]*Treat[n] + r_Day[Day[n]];
    }


model {
    for(n in 1:N) Movment[n] ~  weibull(shape, exp(-(scale[n]/shape))) ;
    for (d in 1:D) r_Day[d] ~ normal(0, sigma_D);
}

但是这段代码总是得到错误“对数概率计算为 log(0),即负无穷大。 Stan 无法从这个初始值开始采样。 拒绝初始值:”并且采样停止。

请教我如何处理这个错误。

【问题讨论】:

  • 如果在data块中定义Density,则可以将transformed parameters块与vector[N] scale = beta[1] + beta[2] * Density + sigma_D *r_Day[Day];写成一行。
  • 另外,您可以将可能性写为stay ~ weibull(shape, exp(-scale / shape));
  • 对不起。我编辑了一些代码,因为我写错了代码。是的,我要确认的是语法。这是合适的代码吗?
  • 我认为它是有效的语法,但它比必要的要慢,并且由于公共参数缺乏适当的先验,它仍然可能定义不正确的后验分布。
  • 对于线性预测器中的系数和随机效应中的标准差,我将非信息性先验(uniform(0, 10e+4)) 定义为 stan 默认设置。但我不知道什么类型的先验适合形状参数。你评论了指数先验的使用,有推荐的先验吗?这是第一次使用威布尔分布分析数据。而我的专业是生态学,很少有人用威布尔分布分析数据。所以如果你给我一些建议,对分析很有帮助。

标签: r bayesian survival-analysis stan rstan


【解决方案1】:

这可能是因为您在参数块中声明了sigma_D,但没有使用它,也没有在其上放置先验。因此,您定义的分布是不正确的。我猜你的意思是用sigma_D 缩放r_Day,但你仍然应该对所有参数进行适当的先验。

【讨论】:

  • 这是 OPs 模型,因此先验必须反映 OP 在查看数据之前对参数的看法。我对这个数据生成过程没有任何特别的见解,但我通常对作为标准偏差的超参数使用指数先验。
  • 我明白你的意思了。 @Lc_decg 你问的是语法吗?
猜你喜欢
  • 2021-10-12
  • 2019-07-24
  • 2020-02-28
  • 2012-11-01
  • 2019-04-01
  • 1970-01-01
  • 2015-08-27
  • 2013-07-19
  • 2012-06-29
相关资源
最近更新 更多