njucm njucm.org
← Notes

不相称性分析的三种方法与选型边界

做药物警戒信号检测时,绕不开的问题是:手上有一张 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 中给出,统计函数用手工计算的期望值做断言而非自造快照。

相关:openFDA 接口实战中的两个坑