如何在brms/Stan中为贝叶斯线性模型指定条件先验?
使用brms实现带条件先验的贝叶斯线性模型
步骤1:定义自定义先验
在brms中支持直接设定依赖于其他参数的条件先验,只需在prior()函数中引用目标参数即可。针对你的需求:
- sigma服从
Inverse Gamma(4, 10)(brms中逆伽马参数为shape和rate,与Stan一致) - beta0(截距)服从
Normal(5, 1.2*sigma) - beta1(x的斜率)服从
Normal(3, 2*sigma)
先验定义代码如下:
custom_priors <- prior(inv_gamma(4, 10), class = sigma) + prior(normal(5, 1.2 * sigma), class = b, coef = Intercept) + prior(normal(3, 2 * sigma), class = b, coef = x)
步骤2:拟合模型
将自定义先验传入brm()函数,同时建议设置多链以检查收敛性:
fit <- brm( formula = y ~ ., data = dat, prior = custom_priors, chains = 4, iter = 2000 )
验证先验设定
可以用prior_summary()确认先验是否正确应用:
prior_summary(fit)
补充:直接用Stan实现
如果你偏好直接编写Stan代码,模型结构如下:
data { int<lower=0> n; vector[n] y; vector[n] x; } parameters { real beta0; real beta1; real<lower=0> sigma; } model { // 先验分布 sigma ~ inv_gamma(4, 10); beta0 ~ normal(5, 1.2 * sigma); beta1 ~ normal(3, 2 * sigma); // 似然分布 y ~ normal(beta0 + beta1 * x, sigma); }
用rstan调用的代码:
library(rstan) # 编译模型 stan_mod <- stan_model(model_code = "上述Stan代码内容") # 准备输入数据 stan_dat <- list(n = nrow(dat), y = dat$y, x = dat$x) # 拟合模型 fit_stan <- sampling(stan_mod, data = stan_dat, chains = 4, iter = 2000)
注意事项
- 逆伽马参数化:不同工具对逆伽马的参数定义可能不同(shape+rate或shape+scale),brms和Stan使用的是shape+rate。如果你的
Inverse Gamma(4,10)实际是shape=4、scale=10,需要将先验改为inv_gamma(4, 1/10)。 - brms参数命名:截距对应的
coef是Intercept,自变量x对应的coef是x,可通过prior_summary(fit)确认参数名称。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

