【发布时间】: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