同一个风险模型,阈值 5% 时干预 75.7% 的人,NNT 19.9,覆盖 95% 的收益; 阈值提到 30%,NNT 降到 7.8(更划算),但只覆盖 44% 的收益。 「效率」和「总量」在这里是反的,选哪个取决于谁付钱。
上一节是「已经来看病的人」。 这一节是「还没生病的人」——健康管理的对象是整个人群, 所以它面对的第一个问题不是「准不准」,是「值不值得治」。
一、从治病到管风险
临床诊疗的输入是「症状 + 检查」,输出是「诊断 + 方案」。 健康管理的输入只有「风险评分」,输出是「干预强度」。 这个转变有两个后果。 ① 对象变成整个人群。 一个人没病,你也要给他一个判断: 「你未来十年发生心血管事件的概率是 12%」。 这个数不是诊断,是一个概率估计。 ② 决策变成「治不治」。 诊断错了可以复诊, 而「让一个健康人吃十年降压药」这个决定,错了的代价是长期的、隐性的、很难归因的。 所以健康管理的模型评价,不能只看 AUC。 要看的是「按这个模型分层之后,干预的收益和成本怎么变」。这就是 NNT 要解决的问题。
二、NNT:把概率翻译成人数
NNT(需治疗人数)= 1 ÷ 绝对风险降低。意思是「要治多少人,才能避免 1 起事件」。 它是把「相对风险降低 25%」这种抽象说法,翻译成「治 20 个人救 1 个」。 举个例子:某人的十年风险是 20%,干预能相对降低 25%, 绝对风险降低就是 5 个百分点,NNT = 1 ÷ 0.05 = 20。 同一个人如果风险只有 4%,绝对降低 1 个百分点,NNT = 100。 这就是 NNT 的核心性质:它只由绝对风险决定,所以高危人群的 NNT 天然更小。 「同一种药,给不同的人吃,划算程度差 5 倍」——这句话就是 NNT 说的。 Demo 造 20 万人,十年风险服从对数正态(中位 10%),干预相对降低 25%,扫五个干预阈值:
| 干预阈值 | 被干预比例 | 避免事件数 | NNT | 覆盖收益 |
|---|---|---|---|---|
| 5% | 75.7% | 7589 | 19.9 | 95% |
| 10% | 50.2% | 6656 | 15.1 | 84% |
| 15% | 34.4% | 5683 | 12.1 | 71% |
| 20% | 24.4% | 4824 | 10.1 | 61% |
| 30% | 13.6% | 3509 | 7.8 | 44% |
| 先看 NNT 这一列:19.9 → 15.1 → 12.1 → 10.1 → 7.8。 | ||||
| 阈值越高,NNT 越小——因为干预的都是高危的人,同样治一批人,避免的事件更多。 | ||||
| 但「避免事件数」那一列是反的:7589 → 3509。 | ||||
| 阈值从 5% 提到 30%,被干预比例从 75.7% 降到 13.6%,避免的事件从 7589 例降到 3509 例。 | ||||
| 这就是「效率」和「总量」的冲突。 | ||||
| NNT 小说明每一份投入更划算,避免事件少说明总收益更小。 | ||||
| 两个指标都对,但它们回答的是两个不同的问题。 |
三、两个口径,两种决策
公共卫生决策通常不看 NNT,看最后一列「覆盖收益」。 预算固定时,真正重要的是「总共能救多少人」,不是「人均多划算」。 因为公卫的钱是「必须花完的预算」,不是「必须回本的投资」。所以它会把阈值压到 5%, 吃下 75.7% 的人群,换 95% 的收益。 医保谈判反过来,看 NNT。 因为要按人头付费,治一个不该治的人,是实打实的支出。 这时阈值会提到 20% 甚至 30%,宁可只覆盖 44% 的收益,也不为那 56% 付钱。 同一个模型,两套评价口径,服务两种决策。 这不是「谁对谁错」,是「谁承担成本」。 这一点在医疗 AI 商业化的讨论里经常被含糊掉——厂商喜欢报「覆盖率」,支付方喜欢看「NNT」。 双方拿同一个模型说两种话,谈不拢是必然的。 还有第三种口径:患者自己。 一个风险 6% 的人,被建议吃十年药,他的判断标准既不是覆盖率也不是 NNT, 是「我这十年会不会是那 6%」。 而这恰恰是「绝对风险」这个数字最不会表达的东西—— 6% 和 12% 在他看来可能一样抽象。所以临床上好的沟通方式往往是换一种说法: 「100 个像你这样的人,6 个会在十年内发病;吃药能减到 4.5 个。」 这句朴素的话,就是 NNT 的原始形态。
四、落地:一条曲线不能用在一个场景
① 风险模型输出必须带「这是几年风险」。十年风险和五年风险的数值完全不可比, 混着用会让 NNT 算错一倍以上。 ② 阈值不是模型参数,是业务参数。同一个模型,给体检中心用和给医保控费用, 阈值应该差一倍以上。 所以交付物不该是「一个模型 + 一个推荐阈值」,而是「一个模型 + 一条阈值-收益曲线」。 ③ 相对风险降低必须来自试验,不能来自假设。Demo 里的 25% 是我设的,真实数字来自临床试验。 而这个数一旦高估,NNT 就会成比例地低报——风险模型的错误会被干预效果的假设放大。 ④ 报收益的时候,同时报被干预人数。只说「避免 7589 起事件」听起来很好, 但它背后是 15 万人吃药。 换算成「每避免 1 起事件,有 19.9 个人吃了十年药」——这句话才完整。 最后一句:健康管理的核心矛盾不是「模型准不准」,是「干预谁」。 而「干预谁」这个问题,技术答不了,得由成本和伦理一起答。
五、动手 Demo:风险分层:阈值 5% 时 NNT 20,提到 20% 只剩 10
造 20 万人的十年风险,服从对数正态分布(中位 10%),截断到 0.1% 至 95%。 设干预能把相对风险降低 25%(这是个假设值)。 扫五个干预阈值,算被干预比例、避免的事件数、NNT,以及「这些收益占全部潜在收益的比例」。
r = np.exp(rg.normal(np.log(0.10), 1.0, n)) # 十年风险,中位 10%
r = np.clip(r, 0.001, 0.95)
rrr = 0.25 # 相对风险降低(设的)
treat = r > th
nt = int(treat.sum())
avoided = float((r[treat] * rrr).sum()) # 避免的事件数
nnt = nt / avoided # 需治疗人数
cover = 100.0 * avoided / float((r * rrr).sum())
实跑输出:
--------------------------------------------------------------------
风险分层:阈值 5% 时 NNT 20,提到 20% 只剩 10
--------------------------------------------------------------------
人群 200000 人,10 年风险中位 10%
干预效果 相对风险降低 25%(设的)
NNT 需治疗人数 = 1 ÷ 绝对风险降低
干预阈值 被干预比例 避免事件数 NNT 覆盖收益
---------------------------------------------------
5% 75.7% 7589 19.9 95%
10% 50.2% 6656 15.1 84%
15% 34.4% 5683 12.1 71%
20% 24.4% 4824 10.1 61%
30% 13.6% 3509 7.8 44%
先看 NNT 这一列:**19.9 → 15.1 → 12.1 → 10.1 → 7.8。**
**阈值越高,NNT 越小——因为干预的都是高危的人,同样治一批人,避免的事件更多。**
但「避免事件数」那一列是反的:**7589 → 3509。**
**阈值从 5% 提到 30%,被干预比例从 75.7% 降到 13.6%,避免的事件从 7589 例降到 3509 例。**
**这就是「效率」和「总量」的冲突。**
**NNT 小说明每一份投入更划算,避免事件少说明总收益更小。**
公共卫生决策通常**不看 NNT,看最后一列「覆盖收益」**。
**预算固定时,真正重要的是「总共能救多少人」,不是「人均多划算」。**
反过来,**医保谈判看 NNT**——因为要按人头付费,**治一个不该治的人,是实打实的浪费。**
**同一个模型,两套评价口径,服务两种决策。**
再看阈值 5% 那一行:**NNT 19.9,覆盖 95% 的收益。**
**NNT 19.9 意味着「治 19.9 个人才避免 1 起事件」——听着很差,但它换来的是几乎全部的收益。**
**所以「NNT 太大就不值得做」这个判断,只在预算受限时成立;预算够的时候,它会让最该救的人漏掉。**
要说明:风险分布、相对风险降低 25% 都是我**设的**。
**真实的相对风险降低来自临床试验,不是假设。**
**而 NNT 的定义、算法和这里的取舍逻辑是真的。**
NNT 19.9 这个数换算成人话是「治 19.9 个人,避免 1 起事件」。 而它对应的是 75.7% 的被干预比例——15 万人。 15 万人吃十年药,避免 7589 起事件。这两个数必须一起看。 阈值提到 30%,NNT 掉到 7.8,效率翻了一倍半。 但避免的事件从 7589 掉到 3509——总收益少了一半多。 这就是那个取舍:同样的预算,你可以「救得划算」或者「救得多」。 「覆盖收益」这一列是最容易被忽略、但最适合跟决策者沟通的指标。 它直接说「你这么做,能抓到全部收益里的百分之多少」。 5% 阈值抓 95%,30% 阈值只抓 44%——差距一眼就看出来了。 注意这个 Demo 里有个反直觉的细节:阈值从 20% 到 30%,NNT 只从 10.1 掉到 7.8, 但覆盖收益从 61% 掉到 44%。 效率只改善 23%,收益却少了 17 个百分点。 过了某个点之后,再收紧阈值就非常不划算了。 而那个点在哪,取决于风险分布的尾巴有多厚。 要说明:风险分布、相对风险降低 25% 都是我设的。真实的相对风险降低来自临床试验,不是假设; 而 NNT 的定义、算法和这里的取舍逻辑是真的。 换个真实人群,曲线的具体位置会变,但形状不会变。
30 秒实验
- 把相对风险降低从 25% 改成 40%(药更有效),重跑。 所有 NNT 会成比例下降,但覆盖收益那一列不变——它和药效无关。
- 把风险分布的中位从 10% 抬到 20%,重跑。 同样阈值下 NNT 会降,被干预比例会升——人群整体变危险,干预更划算。
- 把干预阈值加到 40%,看会发生什么。 NNT 继续降,但覆盖收益可能掉到 20% 以下——这就是「过度收紧」。
常见误区
- 「NNT 越小越好」。NNT 从 19.9 降到 7.8 的代价,是覆盖收益从 95% 掉到 44%。
- 「拦截率越高越好」。那是公卫口径。医保按人头付费时,看的是 NNT,不是覆盖率。
- 「十年风险和五年风险可以混着算 NNT」。 时间窗不同,绝对风险不可比,算出来的 NNT 会错一倍以上。
自测三问(点开对答案)
1. NNT 的定义是什么,它为什么只由绝对风险决定? —— NNT = 1 ÷ 绝对风险降低。 相对风险降低还得乘上基线风险,所以同一个药给不同基线的人,NNT 差很多。 2. 为什么公卫看覆盖收益、医保看 NNT? —— 公卫的预算必须花完,目标是总收益最大;医保按人头付费,目标是每份支出都划算。 3. 阈值从 20% 到 30%,NNT 只改善 23%,覆盖收益却少了 17 个百分点,说明什么? —— 过了某个点之后收紧阈值极不划算。那个拐点取决于风险分布的尾部厚度。诊疗和健康管理都是「对病人」的决策。 医院里还有另一类决策,对象不是病人,是资源。这类问题的答案,藏在「平均」这个词的陷阱里。
- ☐ (本节完,下一节 11.2.3 医院管理优化)