什么才算「没有效应」?bayestestR ROPE 实际等价区域完整实战指南
【免费下载链接】bayestestR:ghost: Utilities for analyzing Bayesian models and posterior distributions项目地址: https://gitcode.com/gh_mirrors/ba/bayestestR
一句话读懂 bayestestR 的 ROPE:贝叶斯分析如何判断"没有效应"
做贝叶斯回归时,很多新手都会卡在一个问题上:p 值消失了,那我怎么证明"两个变量之间确实没有效应"?R 语言bayestestR包给出的答案就是ROPE(Region of Practical Equivalence,实际等价区域)——在后验分布上圈出一小块"可以视为零效应"的范围,再计算 95% 可信区间落在其中的比例,从而用rope()和equivalence_test()两个函数完成一次完整的"无效应"检验。本指南面向零基础读者,讲清 ROPE 的判断逻辑、自动范围设置(rope_range())以及如何避免常见陷阱,帮助你快速上手。
ROPE 到底在解决什么问题?
在频率派框架里,"效应为零"意味着后验落在某一个具体数值(比如 0)上的概率——而在连续分布里这个概率永远是 0,问它没有意义。
ROPE 的思路是:与其纠结"是否恰好等于 0",不如定义一个"小得可以忽略"的区间。只要参数落在这个区间内,就认为它在实践中等同于"无效应"。这个区间的理念由 Kruschke 提出,并被 bayestestR 完整实现。
| 传统提问 | ROPE 式提问 |
|---|---|
| 效应是否显著不等于 0? | 效应落在"可忽略区间"内的比例有多大? |
| p < .05 才算有 | 97.5% 以上的后验落在 ROPE 内才算"接受无" |
| 结论只有"显著/不显著" | 结论分"拒绝 / 接受 / 未决定"三档 |
三步完成 ROPE 分析:rope() 快速上手
以stanreg、brmsfit或一组后验采样值为例,分析只需三步:
第 1 步:准备模型或后验采样任何 Bayesian 模型对象,或者一列 MCMC 采样值,都可以直接传入。
第 2 步:调用rope()计算落入比例
library(bayestestR) # 最简用法:自动选择默认 ROPE 范围 rope(model) # 手动指定范围:把 ±0.1 视为"无实际意义" rope(model, range = c(-0.1, 0.1)) # 想看整个后验落入 ROPE 的比例(推荐) rope(model, ci = 1)第 3 步:解读输出结果表里最关键的列是ROPE_Percentage:
- 数值很低(趋近 0%)→ 后验基本都在 ROPE 之外 → 效应存在且有意义
- 数值很高(接近 100%)→ 后验几乎全在 ROPE 之内 → 效应可视为无
- 中间值→ 证据不足,结论"未决定"
官方教程中用鸢尾花数据演示:Sepal.Length ~ Sepal.Width的回归里,约 15.95% 的后验落入 ROPE,结论是"效应不确定、不显著"。
相关函数定义在源码 rope.R,官方图文教程见 region_of_practical_equivalence.Rmd。
自动范围设置:rope_range() 帮你决定"多大算无"
ROPE 最容易被质疑的地方是:区间边界是谁定的?bayestestR 的rope_range()会按模型类型自动给出合理默认值,你甚至不用手动传range参数。
不同模型族的自动规则如下:
| 模型类型 | 自动 ROPE 范围 | 依据 |
|---|---|---|
| 线性模型(identity 链接) | ±0.1 × SD_y | 响应变量标准差的 10% |
| 逻辑回归(logit) | ±0.18(即 0.1 × π/√3) | 将 log-odds 转为标准化差异 |
| Probit 模型 | ±0.1 | 潜变量标准差为 1 |
| 相关系数分析 | ±0.05 | Cohen"可忽略相关"值的一半 |
| 计数模型 | ±0.1 × 残差标准差 | 实验性规则,需谨慎 |
| 对数变换 / lognormal | ±0.01(约 1% 变化) | 见 issue #487 |
| 其他模型 | ±0.1 | 强烈建议手动指定 |
# 查看当前模型的自动 ROPE 边界 rope_range(model) # 手动覆盖:按参数名精确指定 rope(model, range = list(gear = c(-3, 2), wt = c(-0.2, 0.2)))规则的具体实现可以在 rope_range.R 里看到,核心逻辑是读取模型信息与响应变量尺度,再套用上表公式。
从比例到结论:equivalence_test() 做正式等价检验
rope()只给比例,equivalence_test()直接给判定结果。它执行的是 Kruschke 提出的 "HDI + ROPE 决策规则":
- 拒绝"无效应":95% HDI 完全落在 ROPE 之外;
- 接受"无效应":ROPE 完全覆盖 95% HDI(所有最可信的值都在无意义区间里);
- 未决定:两者部分重叠。
如果使用"完整 ROPE"(ci = 1,即考察 100% 后验),判据为:落入比例小于 2.5% 则拒绝、大于 97.5% 则接受。
equivalence_test(model) equivalence_test(model, range = c(-0.1, 0.1))输出的ROPE_Equivalence列会直接显示 rejected / accepted / undecided,方便写报告。源码位于 equivalence_test.R,测试用例可参考 test-rope.R 与 test-equivalence_test.R。
避坑清单:3 个新手最容易踩的坑
坑 1:忽视预测变量的单位(最常见!)ROPE 是固定在响应变量尺度上的区间,而回归系数的含义随预测变量单位变化。官方教程用"长毛猴婴儿生长"举例:按"天"计时系数约 10 cm/天,显得微不足道;换成"年",系数变成约 3550 cm/年,立刻"显著"。同样地,把 iris 的Sepal.Width除以 100 重跑模型,落入 ROPE 的比例会从约 16% 骤降到接近 0,结论完全反转。
经验法则:报告 ROPE 结果前,先确认预测变量的单位是否合理、是否做过缩放。
坑 2:高多重共线性会让 ROPE 结论失效当自变量之间高度相关时,单个参数的边缘后验会"漂移",基于单变量边缘的 ROPE 概率不再可靠(Kruschke, 2014)。bayestestR 在rope()和equivalence_test()中会自动做成对相关性检查并给出警告,但多变量共线性建议再看成对散点图或使用投影预测变量选择法。
坑 3:默认范围"自动"但不等于"合适"rope_range()的规则源于 Cohen (1988) 的效应量经验值,对多数常见模型是合理起点;但对计数模型、二元结果模型,官方文档都明确建议手动指定range。研究"什么程度的变化算无意义"本身就是个科学问题,值得在方法部分写明理由。
延伸阅读与项目资料
| 资料 | 路径 |
|---|---|
| ROPE 官方图文教程(含完整案例) | region_of_practical_equivalence.Rmd |
| rope() 函数源码 | rope.R |
| rope_range() 自动范围源码 | rope_range.R |
| equivalence_test() 等价检验源码 | equivalence_test.R |
| 函数参考文档 | rope.Rd、rope_range.Rd、equivalence_test.Rd |
| 贝叶斯因子与 ROPE 的对比视角 | bayes_factors.Rmd |
| 包描述与依赖 | DESCRIPTION |
| ROPE 单元测试 | test-rope.R |
写在最后
p 值只能告诉你"效应可能不是零",而bayestestR 的 ROPE 体系让你第一次能正面回答"什么才算没有效应":
- 用
rope()看后验落入实际等价区域的比例; - 用
rope_range()让默认边界随模型类型自动适配; - 用
equivalence_test()输出"拒绝 / 接受 / 未决定"的三档结论; - 报告时注明 ROPE 边界的选择依据与变量单位。
掌握这套组合拳,你的贝叶斯分析报告将从"这个效应显著吗"进化为"这个效应在实践中值得重视吗"——这才是"没有效应"问题的完整答案。
【免费下载链接】bayestestR:ghost: Utilities for analyzing Bayesian models and posterior distributions项目地址: https://gitcode.com/gh_mirrors/ba/bayestestR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考