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 近似。本文将用通俗的语言带你逐一拆解这四种方法的原理、适用场景与源码位置,帮你做出正确的选型。

什么是贝叶斯因子?一分钟搞懂
按贝叶斯定理,观察数据后,两个假设的后验概率之比 = 似然比 × 先验概率之比。中间的"似然比"就是贝叶斯因子(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?"
这是最常用的贝叶斯因子计算方式。原理非常直观:
- 在零假设值(默认
null = 0)处,读取先验密度的高度 - 在同一位置,读取后验密度的高度
- 两者相除,就得到贝叶斯因子
如果数据让后验分布"避开"了零值,零值处的后验密度就会低于先验密度,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,哪个更好地解释了我的数据?"
当你用brms或rstanarm拟合了两个(或多个)贝叶斯模型,最严谨的比较方式是计算各自的边缘似然(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 对"其他所有类型"的模型(如lm、lmerMod)默认都走 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" 输出逻辑一致。
新手选型指南:一张表选对方法
| 你的场景 | 推荐方法 | 调用方式 |
|---|---|---|
| 检验单个参数是否 ≠ 0 | Savage-Dickey 密度比 | bayesfactor_parameters() |
| 检验效应是否可忽略(ROPE) | 区间零假设法 | bayesfactor_rope() |
| 比较 brms / rstanarm 模型 | 桥接采样 | bayesfactor_models()(自动) |
| 比较 lm / lmer 等频率派模型 | BIC 近似 | bayesfactor_models()(自动) |
| 变量该不该进模型 | 纳入 BF | bayesfactor_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),仅供参考