罕见病筛查最反直觉的一条:阳性里假阳性比真阳性多得多。 基础率 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 秒实验
- 把假阳性率从 5% 降到 1%(特异度 99%),基础率 1% 时阳性者的患病概率是多少?
- 如果这病在某个家族里的基础率是 20%,同一个试验的阳性意味着什么?
- 想一想:为什么体检套餐里那些「查出一堆箭头」的项目,医生往往只是让你复查?
常见误区
- 把基础率当背景:它不是背景,它是决定答案的核心参数。
- 只算真阳性不算假阳性:漏掉假阳性,等于把分母砍了一半。
- 以为提高准确率就够了:把灵敏度从 99% 提到 99.9%,在罕见病上几乎不改变结论; 降假阳性率才有用。
- 把罕见病的结论套到常见病上:基础率不同,同一个试验的含义完全不同。
自测三问(点开对答案)
1. 为什么罕见病筛查的阳性里,假阳性更多? —— 因为健康人基数远大于病人。5% 的假阳性乘上 990 人,比 99% 的灵敏度乘上 10 人大得多。 2. 基础率从 1% 变成 10%,阳性者患病概率从 16.7% 变成多少? —— 68.7%。基础率抬十倍,答案涨了四倍多。 3. 想提高筛查的实用性,该改灵敏度还是假阳性率? —— 降假阳性率。罕见病里分母被健康人主导,减少误报比提高检出更有效。道理清楚了,接下来把话说准:这些「在某某条件下」的概率,专业上叫什么。下一篇讲条件概率和整数格。
- ☐ (本篇完,下一篇 6.3 条件概率与整数格)