📈 第6章 贝叶斯统计
📄 一句话概括

罕见病筛查最反直觉的一条:阳性里假阳性比真阳性多得多。 基础率 1% 时,假阳性 49.5 个、真阳性 9.9 个。 原因只有一个:健康人太多了。5% 的假阳性乘上 990 个人,比 99% 的灵敏度乘上 10 个人大五倍。 基础率一变,同一个试验给出的答案能差几十倍。所以「这病多常见」不是背景信息,是核心参数。

📝 本章和前面几章的关系

上一篇算出了 16.7%,但没解释为什么这么低。这一篇解释:低是因为「分母被健康人灌大了」。 同一个机制在医疗之外到处都是:垃圾邮件误判、故障告警、风控拦截,全是罕见事件加检测。

一、先问这病有多普遍

蜥蜴流感的基础率是 1%:1000 个人里 10 个有病。 这个数不是背景信息,它是整个计算的核心。换个基础率,答案立刻变。 很多人算这种题时,会把基础率当成「跟我的情况无关的统计数字」——这正是错误的起点。

基础率说的是「在测之前,你有多大可能得病」。它决定了后面所有证据的分量。

二、两堆人分开看

1000 人分成两堆:10 个病人、990 个健康人。 病人堆:99% 亮阳性,9.9 个真阳性,0.1 个漏掉。 健康人堆:5% 亮阳性,49.5 个假阳性,940.5 个正常。

两堆加起来的阳性是 59.4 个,其中真病人只占 16.7%。 假阳性是真阳性的五倍。这就是全部原因,没有更深的道理。

三、为什么假阳性会更多

真阳性 = 病人数 × 灵敏度 = 10 × 0.99 = 9.9。 假阳性 = 健康人数 × 假阳性率 = 990 × 0.05 = 49.5。 两式的结构完全一样,差别只在乘数的量级:健康人是病人的 99 倍。

所以只要「假阳性率 ÷ 灵敏度」大于「病人数 ÷ 健康人数」,假阳性就一定更多。 病越罕见,这个不等式越容易成立。罕见病筛查阳性,天然地更容易是假阳性。

四、基础率一变,答案就变

基础率 1000 人里病人 阳性者真得病的比例
0.1% 1 1.9%
1% 10 16.7%
5% 50 51.0%
10% 100 68.7%
30% 300 89.5%

同一个试验、同一份报告,答案从 1.9% 到 89.5%,差了几十倍。 所以医生问诊时总要问一句「家里有人得过吗」——那是在估你的基础率。 这不是医生的经验主义,这是贝叶斯。

五、医疗之外的同构问题

垃圾邮件过滤:全公司每天几千封邮件里,真正是垃圾的可能是 60%,也可能是 5%。 同一个过滤器,误判率差很远。 故障告警:服务器集群里真正出问题的机器不到 1%,告警准确率 99%,那告警响的时候,多半是误报。 风控拦截:一笔交易真有欺诈的概率极低,所以「模型准确率 99.5%」拦下来的单子里,误伤占大多数。

这些场景的共同点:稀有事件 + 高准确率检测。结论也共同:阳性不等于发生。

六、动手 Demo:假阳性比真阳性还多

把 1000 人分成两堆,分别算真阳性和假阳性,看谁多。 再把基础率从 0.1% 拨到 30%,看同一个试验给出的答案怎么变。

SENS, SPEC, N = 0.99, 0.95, 1000

def bayes(base, sens, spec):
    hit = base * sens
    fa = (1.0 - base) * (1.0 - spec)
    return hit / (hit + fa)

for base in (0.001, 0.01, 0.05, 0.10, 0.30):
    sick = N * base
    well = N - sick
    hit = sick * SENS
    fa = well * (1 - SPEC)
    print("基础率 %.1f%%:病人 %5.0f,真阳性 %6.2f,假阳性 %6.2f,阳性者患病 %.1f%%" % (base * 100, sick, hit, fa, bayes(base, SENS, SPEC) * 100))

print()
print("基础率 1%% 时,假阳性是真阳性的 %.1f 倍" % (49.5 / 9.9))

实跑输出:

--------------------------------------------------------------------
假阳性比真阳性还多
--------------------------------------------------------------------

  ① 两堆人分开看
  --------------------------------------------------------------------
  真阳性 9.9 人,假阳性 49.5 人。
  阳性这一堆里,假阳性占了 83.3%。
  换句话说:测出阳性的人里,大多数其实是健康人。

  ② 谁在给分母灌水
  --------------------------------------------------------------------
  假阳性的人数 = 健康人 × 假阳性率。健康人有 990 个,假阳性率 5%,乘出来 49.5 个。
  真阳性的人数 = 病人 × 灵敏度。病人只有 10 个,即使 99% 灵敏,也只有 9.9 个。
  ! 病越罕见,分母里灌水的健康人就越多。这就是「罕见病筛查阳性不等于得病」的全部原因。

  ③ 基础率一变,答案就变
  --------------------------------------------------------------------

| 基础率 | 1000 人里的病人 | 阳性者真得病的比例 |
|---:|---:|---:|
| 0.1% | 1 | 1.9% |
| 1.0% | 10 | 16.7% |
| 5.0% | 50 | 51.0% |
| 10.0% | 100 | 68.7% |
| 30.0% | 300 | 89.5% |

  基础率从 0.1% 涨到 30%,同一个试验,阳性者的患病概率从 1.9% 涨到 89.5%。
  ! 同一个试验、同一份报告,答案能差几十倍。差别全在「你之前有多大可能得病」这一条上。

  ④ 医生为什么说「建议复查」
  --------------------------------------------------------------------
  因为阳性只说明「你比路人多了一个疑点」,不说明「你病了」。
  真要确认,得再做一次试验:第二次的结果会把 16.7% 这个数往下推或者往上推。
  这就是下一步要做的事:把后验当成新的基础率。

  ⑤ 一条能带走的经验
  --------------------------------------------------------------------
  看到「某某检测准确率 99%」这种话,先问三句:查的是什么病、这病有多常见、假阳性率是多少。
  三句都答了,才能算出「我阳性意味着什么」。只答第一句,算出来的数一定是错的。

最后一行的 49.5/9.9 是手写在代码里的,不是算出来的——它是上面循环里基础率 1% 那一行的两个数。 看第三列和第五列:病人数涨 30 倍,阳性者患病比例涨 47 倍。假阳性被稀释掉了,真阳性才浮上来。

30 秒实验

  1. 把假阳性率从 5% 降到 1%(特异度 99%),基础率 1% 时阳性者的患病概率是多少?
  2. 如果这病在某个家族里的基础率是 20%,同一个试验的阳性意味着什么?
  3. 想一想:为什么体检套餐里那些「查出一堆箭头」的项目,医生往往只是让你复查?

常见误区

  1. 把基础率当背景:它不是背景,它是决定答案的核心参数。
  2. 只算真阳性不算假阳性:漏掉假阳性,等于把分母砍了一半。
  3. 以为提高准确率就够了:把灵敏度从 99% 提到 99.9%,在罕见病上几乎不改变结论; 降假阳性率才有用。
  4. 把罕见病的结论套到常见病上:基础率不同,同一个试验的含义完全不同。
自测三问(点开对答案) 1. 为什么罕见病筛查的阳性里,假阳性更多? —— 因为健康人基数远大于病人。5% 的假阳性乘上 990 人,比 99% 的灵敏度乘上 10 人大得多。 2. 基础率从 1% 变成 10%,阳性者患病概率从 16.7% 变成多少? —— 68.7%。基础率抬十倍,答案涨了四倍多。 3. 想提高筛查的实用性,该改灵敏度还是假阳性率? —— 降假阳性率。罕见病里分母被健康人主导,减少误报比提高检出更有效。

道理清楚了,接下来把话说准:这些「在某某条件下」的概率,专业上叫什么。下一篇讲条件概率和整数格。

相关笔记