Savage-Dickey、桥接还是BIC近似?bayestestR四种贝叶斯因子计算方法深度解析
2026/8/22 13:06:30 网站建设 项目流程

Savage-Dickey、桥接还是BIC近似?bayestestR四种贝叶斯因子计算方法深度解析

【免费下载链接】bayestestR:ghost: Utilities for analyzing Bayesian models and posterior distributions项目地址: https://gitcode.com/gh_mirrors/ba/bayestestR

在贝叶斯统计中,贝叶斯因子(Bayes Factor)是量化"数据支持哪个假设"的核心指标。R 语言开源包bayestestR是分析贝叶斯模型与后验分布的常用工具,它把四类主流贝叶斯因子计算方法整合进统一的bayesfactor()函数:Savage-Dickey 密度比、ROPE 区间法、桥接采样(Bridge Sampling)与 BIC 近似。本文将用通俗的语言带你逐一拆解这四种方法的原理、适用场景与源码位置,帮你做出正确的选型。

![bayestestR 贝叶斯因子计算中的概率密度对比:先验密度在零假设处的取值是 Savage-Dickey 方法的关键](https://raw.gitcode.com/gh_mirrors/ba/bayestestR/raw/77d649a2f55481e0b863c0d35b2a14dba7f44afb/paper/JOSS paper files/Figure1.png?utm_source=gitcode_repo_files)

什么是贝叶斯因子?一分钟搞懂

按贝叶斯定理,观察数据后,两个假设的后验概率之比 = 似然比 × 先验概率之比。中间的"似然比"就是贝叶斯因子(BF)

BF = 数据在假设1下出现的可能性 ÷ 数据在假设0下出现的可能性

  • BF > 1:数据更支持假设1(备择假设)
  • BF < 1:数据更支持假设0(零假设)
  • BF = 1:数据对两个假设"无偏向"

bayestestR 的入口函数 bayesfactor() 会根据你的输入自动分派到四种计算方法——这正是它"智能"的地方:

# 输入向量 → Savage-Dickey;输入多个模型 → 模型比较 bayesfactor(posterior, prior = prior) # 单参数 bayesfactor(model1, model2, model3) # 模型比较

方法一:Savage-Dickey 密度比 —— 单参数点零假设检验

适用问题:"某个参数是否显著不为 0?"

这是最常用的贝叶斯因子计算方式。原理非常直观:

  1. 在零假设值(默认null = 0)处,读取先验密度的高度
  2. 在同一位置,读取后验密度的高度
  3. 两者相除,就得到贝叶斯因子

如果数据让后验分布"避开"了零值,零值处的后验密度就会低于先验密度,BF 就会大于 1,说明数据支持"参数不为 0"。

💡 通俗理解:就像比较"赌局开始前"和"开奖后",零值这个位置被压中的概率变化了多少倍。

该方法的实现位于 bayesfactor_parameters(),依赖logspline包对 MCMC 样本做密度估计。它还支持单侧检验(direction = "left"/"right")和分裂假设,方便你做有方向性的预测。

方法二:ROPE 区间法 —— 检验"效应是否小到可忽略"

适用问题:"这个效应是否在实践可忽略的范围内?"

当零假设是一个区间而非单点时(比如"相关系数在 -0.1 到 0.1 之间即视为无效应"),Savage-Dickey 不再适用。此时 bayestestR 采用Morey & Rouder(2011)的区间零假设方法

比较参数落在 ROPE 区间内外的先验概率比值后验概率比值,其变化量即为贝叶斯因子。

配合 rope_range() 可以为常见效应量自动设定默认 ROPE 范围,例如:

bayesfactor_rope(model) # 自动使用建议的 ROPE 范围做贝叶斯因子检验

这种方法与p_rope()rope()函数家族一脉相承,是"效应存在性"分析(Existence 而非 Significance)的核心工具。

方法三:桥接采样 —— brms / rstanarm 模型的精确比较

适用问题:"模型 A 和模型 B,哪个更好地解释了我的数据?"

当你用brmsrstanarm拟合了两个(或多个)贝叶斯模型,最严谨的比较方式是计算各自的边缘似然(marginal likelihood),再取比值。直接积分高维参数空间是困难的,bridgesampling包用"桥接采样"技术巧妙地绕过了这个计算瓶颈。

bayestestR 在 bayesfactor_models() 中检测到brmsfit/stanreg对象时会自动走这条路径。使用前有两个注意事项:

模型类型拟合时必须设置
brms::brm()save_pars = save_pars(all = TRUE)
rstanarm::stan_glm()指定diagnostic_file

⚠️ 另外,BF 估计对样本量敏感,建议比常规后验推断多抽10 倍的 MCMC 迭代(官方手册页 bayesfactor_models.Rd 有完整示例)。

方法四:BIC 近似 —— 频率派模型的快速贝叶斯化

适用问题:"我没有拟合贝叶斯模型,只有 lm / lmer 等频率派模型,也能比较吗?"

可以。利用BIC(贝叶斯信息准则)近似

BF₁₀ ≈ exp((BIC₀ − BIC₁) / 2)

两个模型 BIC 每相差 10,BF 就相差约 100 倍——这个近似在大样本下相当可靠。转换逻辑就封装在 10 行代码的 bic_to_bf() 中。

bayestestR 对"其他所有类型"的模型(如lmlmerMod)默认都走 BIC 近似路径,因此你可以直接把lm()拟合对象塞进bayesfactor_models(),零门槛完成模型比较:

bayesfactor_models(lm(mpg ~ 1, data = mtcars), lm(mpg ~ hp, data = mtcars), denominator = 1) # 以第一个模型为参照

不过请留意:BIC 近似无法表达"参数先验分布形状"的差异,它假设参数要么被限制为 0、要么不被限制。想要精细的先验建模,还是应回到方法三。

进阶:纳入贝叶斯因子(Inclusion BF)—— 跨模型平均证据

适用问题:"在所有候选模型中,变量 X 总体上该不该被纳入?"

bayesfactor_inclusion() 回答的问题更宏观:"包含预测变量 X 的一组模型,平均而言比不包含 X 的一组模型,更能产生观测数据吗?"

它基于模型后验概率,比较先验纳入概率与后验纳入概率的比值变化,相当于对一族模型做贝叶斯模型平均(BMA)后的"变量重要性检验"。设置match_models = TRUE可以只在结构可比的模型间做对比(排除高阶交互干扰),这与 JASP 中 Bayesian ANOVA 的 "Effects" 输出逻辑一致。

新手选型指南:一张表选对方法

你的场景推荐方法调用方式
检验单个参数是否 ≠ 0Savage-Dickey 密度比bayesfactor_parameters()
检验效应是否可忽略(ROPE)区间零假设法bayesfactor_rope()
比较 brms / rstanarm 模型桥接采样bayesfactor_models()(自动)
比较 lm / lmer 等频率派模型BIC 近似bayesfactor_models()(自动)
变量该不该进模型纳入 BFbayesfactor_inclusion()

🎯新手建议:直接把结果交给 bayesfactor() 自动分派,它会按输入类型选择合适方法,无需手动判断。

延伸阅读与验证

  • 概念推导与完整案例:bayes_factors.Rmd(官方贝叶斯因子手册,含先验设定、传递性、模型平均等内容)
  • 单元测试可验证各方法输出:test-bayesfactor_models.R、test-bayesfactor_parameters.R
  • BF 的数值解释等级("强证据""中等证据")由effectsize::interpret_bf()提供

小结:bayestestR 用"一个入口、四种引擎"的设计,让新手无需纠结数学细节,也能在点零假设检验、ROPE 检验、精确模型比较与快速近似比较之间游刃有余。理解了每种方法的适用边界,你的贝叶斯分析就会又快又稳。

【免费下载链接】bayestestR:ghost: Utilities for analyzing Bayesian models and posterior distributions项目地址: https://gitcode.com/gh_mirrors/ba/bayestestR

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询