ROC 曲线与 AUC 计算器(含 Hanley-McNeil 置信区间)
单个阈值下的敏感度和特异度只描述了一个点。换一个阈值,这两个数就变了, 而哪个阈值更好本身就是要回答的问题。ROC 曲线把所有阈值一次性画出来, 曲线下面积(AUC)则把整条曲线压成一个数。
AUC 有一个很干净的含义:随机取一个阳性个体和一个阴性个体, 阳性那个评分更高的概率。0.5 等于抛硬币,1.0 是完全分开。
两条独立的算法,结果必须相同
梯形法: 按每个可能的阈值算出 (1−特异度, 敏感度),连点成线,梯形积分
一致对法: AUC = [ #(阳性>阴性) + 0.5 × #(阳性=阴性) ] ÷ (n₁ × n₂)
这两条路径毫无共同之处,但 Hanley 与 McNeil(Radiology 1982;143:29-36)证明 它们恒等——第二条正好是 Mann-Whitney 统计量归一化后的值。 本工具把两个都算出来并排列出,对不上说明实现坏了。 并列值按 0.5 计权,这是标准做法。
置信区间
SE(AUC) = √{ [AUC(1−AUC) + (N₁−1)(Q₁−AUC²) + (N₂−1)(Q₂−AUC²)] ÷ (N₁N₂) }
Q₁ = AUC ÷ (2−AUC) Q₂ = 2·AUC² ÷ (1+AUC)
CI = AUC ± z(α/2) × SE(AUC)
同样出自 Hanley & McNeil 1982。N₁ 是阳性数、N₂ 是阴性数—— 注意它不是总样本量,这一点很容易填错,而它在分母上。
可以验算
锚点一,已发表的算例。 把模式切到「已知 AUC 与样本量」,填 AUC 0.6、 N₁ = N₂ = 976、双侧 95%,区间宽度应得 0.0500——这正是 NCSS/PASS 文档 《Confidence Intervals for the Area Under an ROC Curve》里那个例子的答案。 填 245 得 0.0998,也对得上它那张表。
锚点二,恒等式。 点开工具就是一组 12 vs 12 的演示数据(含一处并列值):
| 量 | 值 |
|---|---|
| U(一致对计数) | 115.5 |
| AUC = U ÷ 144 | 0.802083 |
| 梯形积分 AUC | 0.802083(逐位相同) |
| SE | 0.092213 |
| 95% CI | 0.621350 – 0.982817 |
| Youden J 最大 | 0.416667(7 个阈值并列,工具会全列出来) |
| Mann-Whitney 双侧 p | 0.012023 |
两种 AUC 算法逐位相同这件事,比任何单独一个数字对得上都更能说明实现是对的。
适用边界
- AUC < 0.5 不代表「没用」,多半是方向填反了。 如果低分才对应阳性, 把方向选项改掉,别把 0.3 当成「比随机还差」——那只是坐标系反了。
- 正态近似的区间在 AUC 接近 1 时会越过 1(AUC 0.965、每组 12 例时上限 1.043)。 这是方法的局限。本工具把显示值夹到 1.0 并告警,不悄悄夹断; 真要在这种情形下报区间,该换 bootstrap 或 logit 变换法。
- Youden J 最大的阈值常常不止一个。J = 敏感度 + 特异度 − 1 在样本量小的时候 是阶梯函数,多个阈值可以并列最优。工具会报出有几个并列, 而选哪个要看漏诊和误诊的代价谁更重——这件事统计量替不了你决定。
- 单个样本的 AUC 不能和另一个样本的 AUC 直接比大小。 比较两条 ROC 需要配对方法(DeLong,或 Hanley-McNeil 1983 的配对公式), 它要用到两个评分在同一批个体上的相关性,本工具不做。
- AUC 对阈值无关的整体区分能力是好指标,但它对临床决策的信息量有限: 两条 AUC 相同的曲线可以在你真正关心的那段特异度上差很远。 要选阈值就看 ROC 表,不要只看 AUC。
- 不做多类别 ROC、不做协变量调整、不处理缺失值。
常见问题
AUC 到底是什么意思?
**随机取一个阳性个体和一个阴性个体,阳性那个评分更高的概率。**0.5 等于抛硬币,1.0 是两组完全分开。这个解释不是类比,是精确的:Hanley 与 McNeil(Radiology 1982;143:29-36)证明经验 ROC 的梯形面积恰好等于 Mann-Whitney 统计量归一化后的值,而后者就是这个概率的无偏估计。本工具把两条路径都算出来并列,正是为了让这件事看得见。
算出来的 AUC 小于 0.5,是指标比随机还差吗?
几乎总是**方向填反了**。AUC 0.3 意味着「低分那组更像阳性」——把方向选项改成「评分越低越像阳性」,你会得到 0.7。真正「比随机还差」的指标在实践中极少见,看到 < 0.5 先检查方向,而不是下结论说这个标志物没用。
SE 公式里的 N₁ N₂ 填什么?
**N₁ 是阳性(患病)例数,N₂ 是阴性(对照)例数,不是总样本量。**它们分别出现在分母和两个括号里,填成总数会把标准误算小、区间算窄,看起来比实际更有把握。这是这个公式最常见的填错方式,所以工具把两个数分开要。
置信区间上限超过 1 了,怎么办?
那是正态近似在 AUC 接近端点时的局限。实测 AUC 0.965、每组 12 例时上限会到 1.043。本工具把显示值夹到 1.0 **并明确告警**——悄悄夹断会让人以为区间真的到 1.0 为止,那是另一个说法。真要在这种情形下报区间,该换 bootstrap 或先做 logit 变换再反变换。
Youden J 最优阈值可以直接拿去用吗?
**不建议直接用。** J = 敏感度 + 特异度 − 1 隐含一个假设:漏诊和误诊的代价一样重。筛查里漏诊往往严重得多,这时候该先定住一个可接受的敏感度(比如 ≥ 95%),再在满足它的阈值里挑特异度最高的。另外样本量小的时候 J 是阶梯函数,常有多个阈值并列最优,工具会报出并列个数——并列说明数据分不出它们,不是让你随便挑一个。
能比较两个模型的 AUC 吗?
本工具不做。两条 ROC 的比较要看它们是否来自**同一批个体**:同一批的话需要配对方法(DeLong,或 Hanley-McNeil 1983 的配对公式),它要用到两个评分之间的相关性;不同批次才能当独立样本比。直接拿两个 AUC 和各自的区间看「有没有重叠」是错的,那会把配对数据里被抵消掉的共同变异重复计算一遍。
AUC 高就说明临床上好用吗?
不一定。AUC 是**阈值无关**的整体区分能力,而临床用的是某一个阈值。两条 AUC 相同的曲线完全可以在你真正关心的那段(比如特异度 > 90% 的区域)差很远。要选阈值就看 ROC 表逐行比,不要只看一个 AUC。另外 AUC 不受患病率影响,而阳性预测值受——低患病率人群里一个 AUC 0.9 的指标,阳性结果仍可能大半是假阳性。本站的 [诊断试验 2×2 分析](../diagnostic-2x2/) 可以算那一侧。
相关工具
诊断试验四格表计算器:灵敏度 / 特异度 / 阳性预测值
输入 TP/FP/FN/TN 四格,一次算出灵敏度、特异度、阳性与阴性预测值、似然比与约登指数,给出 95% Wilson 置信区间,并可用贝叶斯公式更新后验概率。
哈迪-温伯格平衡计算器:等位基因频率、基因型频率与 HWE 偏离检验
输入次等位基因频率或观测基因型计数,给出 HWE 期望频率与 χ² 偏离检验,适用于 GWAS 质控、隐性遗传病携带率估算与遗传风险计算。
多重检验校正在线计算:BH (FDR)、BY 与 Bonferroni
粘贴一列 p 值,一次得到 BH 的 q 值、BY 与 Bonferroni 校正值,三者并列对照。