You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:53:02