做药物警戒信号检测时,绕不开的问题是:手上有一张 2×2 列联表,用哪个统计量。
三者其实在测不同的事
| 方法 | 直觉含义 | 何时失灵 |
|---|---|---|
| PRR 比例报告比 | 这个药物-反应组合的报告率,是背景率的多少倍 | 分母极小时不稳定;稀有事件下大样本也会显得”不显著” |
| ROR 报告比值比 | 报告了该反应的人里,暴露于该药的比例 vs 未暴露者 | 与 PRR 数学上高度相关,同时用不提供独立信息 |
| BCPNN 贝叶斯置信传播网络 | 观测到的关联强度 vs 随机期望,点估计是 IC | 依赖先验;低计数下方差近似公式会失真 |
关键认知:PRR 和 ROR 几乎不是两个独立证据。在同一个列联表上,它们给出的是同一 个方向、量级接近的数值。所以实务里”PRR 和 ROR 都超阈值”并不构成”两种方法互相印证”, 只是同一个量的两次近似。
判据为什么要三条同时满足
EU 标准要求 PRR ≥ 2 且 χ² ≥ 4 且 N ≥ 3。三条不是冗余,各挡一类误报:
PRR ≥ 2—— 挡住效应量太小的χ² ≥ 4—— 挡住统计显著性不足的。一个 PRR 很高的组合可能只对应 3 个报告, 此时 PRR 再高也没有意义N ≥ 3—— 挡住单个报告造成的假信号。一例报告被报成 100%,在 χ² 上不显著, 但在某些实现里会被”比值”指标误判
ROR 的判据是下限 > 1(而不是点估计 > 1),BCPNN 的判据是 IC025 > 0 —— 都是用区间 下界而不是点估计做判断,理由相同:点估计容易赢在运气上。
零值必须显式处理
2×2 表里只要有一个单元格为 0,对数、比值、标准误全部分母为零。常规做法是 Haldane–Anscombe 连续性校正:全表加 0.5。
但这必须写进文档。同一份数据,加不加 0.5,结论可能不一样;不说明校正方式, 别人就没法复现你的结果。校正是一个需要被声明的选择,不是一个默认行为。
χ² 用不用 Yates 校正
在药物警戒的量级下(报告数动辄上万),Yates 校正与 Pearson χ² 的差别远小于判据阈值 (χ² ≥ 4),对结论没有影响。但在小型研究中会。如果报告明确说”χ²”,最好顺带说明 是否校正,否则”χ² = 4.1”这种临界值无法判断。
一个便宜得多的验证方法
实现完算法之后,怎么知道自己写对了?
拿一个临床上公认的信号当基准答案。 在 FAERSSignal 里,二甲双胍 → 乳酸酸中毒 是说明书明确警示的风险。实测得到 PRR 157.38、IC/IC025 = 5.86/5.83。
一个信号检测算法如果在真实全库数据上复现不出这个信号,那它一定是错的 —— 这比任何 单元测试都有说服力,因为基准答案来自完全独立的外部知识。
反过来,这条思路也限制了过度解读:复现出了,不等于找到了新东西。
最容易被跳过的限制
FAERS 是自发报告系统,没有分母。你永远算不出发生率,只能算”不成比例”。 因此:
- 不相称性 ≠ 因果关系
- 报告数受报告偏倚、媒体关注、诉讼影响
- 存在重复报告与信息不全
这些限制必须写进报告里,不是免责声明,而是使用者判断下一步动作的依据。
延伸:FAERSSignal —— 纯标准库实现, 每个公式在 README 中给出,统计函数用手工计算的期望值做断言而非自造快照。