如何在没有基础数据的情况下从 ROC 图计算 AUC?
How to calculate the AUC from a ROC plot without the underlying data?
我正在对某些风险评估工具的性能进行荟萃分析。我的目标是汇集特定工具的几个有效性研究的 AUC 估计值。然而,我遇到了一些不提供 AUC 估计本身,而只提供 ROC 曲线的研究。
在这种情况下,我使用 https://apps.automeris.io/wpd/ 来获取与每个数据点对应的值。 然而,问题是,即使我有灵敏度和 1-特异性的值,并且可以使用 R 自己绘制 ROC 曲线,但我不知道要使用哪个函数来计算下面积曲线 (AUC). 这是因为所有允许我计算 AUC 的 R packages/functions 都使用基础数据作为输入。也就是说,预测变量和响应而不是灵敏度和 1-特异性的值。
我已阅读 R 中 'pROC' 包的文档,但没有找到任何有用的信息。
我想我可以使用 integrate() 对绘图曲线下的区域进行积分?然而,问题是我不会收到 AUC 的置信区间(我在元分析中需要它)。
这是我从其中一条 ROC 曲线生成的数据(通过使用 https://apps.automeris.io/wpd/):
# data table:
AUC_data_1 <- tibble("1-specificity" = c(-0.0031751800795011,
0.05421559172249585, 0.12174003874893036,0.20579144833428253,
0.3012443157265138, 0.502266554865223, 0.6205366469297053,
0.8417661384716209,
sensitivity = c(0.002260831241825745, 0.16879823941344285,
0.45899739288954267, 0.5804040305755962, 0.7849062327396981,
0.8634686874873007, 0.9710785309748188, 0.9977448923815709))
# roc curve generated from data:
plot(AUC_data_1)
我想根据这个 ROC 曲线计算 AUC。但是,由于我没有基础数据(即响应和预测变量),我无法在 R 中使用 pROC 包。
您需要做的第一件事是清理数据。 ROC 曲线从 (0, 0) 开始,到 (1, 1) 结束。如果您的曲线中缺少这些点,则 AUC 将被低估。这是一个尝试修复:
AUC_data_1 <- tibble("one.minus.specificity" = c(0,
0.05421559172249585, 0.12174003874893036,0.20579144833428253,
0.3012443157265138, 0.502266554865223, 0.6205366469297053,
0.8417661384716209, 1),
sensitivity = c(0, 0.16879823941344285,
0.45899739288954267, 0.5804040305755962, 0.7849062327396981,
0.8634686874873007, 0.9710785309748188, 0.9977448923815709, 1))
确保您了解从该服务获得的数据的质量和可靠性。
那么如你所料,这只是一个整合游戏。我喜欢 pracma 的 trapz 函数,它使用梯形规则:
library(pracma)
trapz(AUC_data_1$one.minus.specificity, AUC_data_1$sensitivity)
[1] 0.6268943
关于不确定性,您应该看看 Obuchowski (1) 的工作,该工作将 ROC 曲线的方差表示为 AUC、样本量和双正态拟合参数的函数,您可以使用仅灵敏度和特异性:
model <- lm(1-one.minus.specificity~sensitivity, AUC_data_1)
你会find the code directly in the pROC source。虽然它是私有的,但您应该自行承担使用它的风险(函数不会导出并且可能随时消失)。像这样:
A <- coefficients(model)[1]
B <- coefficients(model)[2]
kappa <- n.controls / n.cases # number of case and control observations
# use internal function at your own risk
pROC:::var.params.obuchowski(A, B, kappa) / n.cases
[1] 0.1125403
他们还提出了一种不需要双正态系数的方法:
A <- qnorm(theta) * 1.414
(0.0099 * exp(-A^2/2)) * ((5 * A^2 + 8) + (A^2 + 8)/kappa) / n.cases
[1] 0.7846169
其中 theta 是您在上面计算的曲线的 AUC。
- Nancy A. Obuchowski、Donna K. McClish (1997)。 “涉及双正态 ROC 曲线指数的诊断准确度研究的样本量确定”。医学统计,16(13),1529--1542。 DOI:(SICI)1097-0258(19970715)16:13<1529::AID-SIM565>3.0.CO;2-H.
- Nancy A. Obuchowski、Micharl L. Lieber 和 Frank H. Wians Jr.(2004 年)“临床化学中的 ROC 曲线:使用、误用和可能的解决方案”。临床化学,50, 1118–1125。 DOI:10.1373/clinchem.2004.031823.
我正在对某些风险评估工具的性能进行荟萃分析。我的目标是汇集特定工具的几个有效性研究的 AUC 估计值。然而,我遇到了一些不提供 AUC 估计本身,而只提供 ROC 曲线的研究。 在这种情况下,我使用 https://apps.automeris.io/wpd/ 来获取与每个数据点对应的值。 然而,问题是,即使我有灵敏度和 1-特异性的值,并且可以使用 R 自己绘制 ROC 曲线,但我不知道要使用哪个函数来计算下面积曲线 (AUC). 这是因为所有允许我计算 AUC 的 R packages/functions 都使用基础数据作为输入。也就是说,预测变量和响应而不是灵敏度和 1-特异性的值。
我已阅读 R 中 'pROC' 包的文档,但没有找到任何有用的信息。 我想我可以使用 integrate() 对绘图曲线下的区域进行积分?然而,问题是我不会收到 AUC 的置信区间(我在元分析中需要它)。
这是我从其中一条 ROC 曲线生成的数据(通过使用 https://apps.automeris.io/wpd/):
# data table:
AUC_data_1 <- tibble("1-specificity" = c(-0.0031751800795011,
0.05421559172249585, 0.12174003874893036,0.20579144833428253,
0.3012443157265138, 0.502266554865223, 0.6205366469297053,
0.8417661384716209,
sensitivity = c(0.002260831241825745, 0.16879823941344285,
0.45899739288954267, 0.5804040305755962, 0.7849062327396981,
0.8634686874873007, 0.9710785309748188, 0.9977448923815709))
# roc curve generated from data:
plot(AUC_data_1)
我想根据这个 ROC 曲线计算 AUC。但是,由于我没有基础数据(即响应和预测变量),我无法在 R 中使用 pROC 包。
您需要做的第一件事是清理数据。 ROC 曲线从 (0, 0) 开始,到 (1, 1) 结束。如果您的曲线中缺少这些点,则 AUC 将被低估。这是一个尝试修复:
AUC_data_1 <- tibble("one.minus.specificity" = c(0,
0.05421559172249585, 0.12174003874893036,0.20579144833428253,
0.3012443157265138, 0.502266554865223, 0.6205366469297053,
0.8417661384716209, 1),
sensitivity = c(0, 0.16879823941344285,
0.45899739288954267, 0.5804040305755962, 0.7849062327396981,
0.8634686874873007, 0.9710785309748188, 0.9977448923815709, 1))
确保您了解从该服务获得的数据的质量和可靠性。
那么如你所料,这只是一个整合游戏。我喜欢 pracma 的 trapz 函数,它使用梯形规则:
library(pracma)
trapz(AUC_data_1$one.minus.specificity, AUC_data_1$sensitivity)
[1] 0.6268943
关于不确定性,您应该看看 Obuchowski (1) 的工作,该工作将 ROC 曲线的方差表示为 AUC、样本量和双正态拟合参数的函数,您可以使用仅灵敏度和特异性:
model <- lm(1-one.minus.specificity~sensitivity, AUC_data_1)
你会find the code directly in the pROC source。虽然它是私有的,但您应该自行承担使用它的风险(函数不会导出并且可能随时消失)。像这样:
A <- coefficients(model)[1]
B <- coefficients(model)[2]
kappa <- n.controls / n.cases # number of case and control observations
# use internal function at your own risk
pROC:::var.params.obuchowski(A, B, kappa) / n.cases
[1] 0.1125403
他们还提出了一种不需要双正态系数的方法:
A <- qnorm(theta) * 1.414
(0.0099 * exp(-A^2/2)) * ((5 * A^2 + 8) + (A^2 + 8)/kappa) / n.cases
[1] 0.7846169
其中 theta 是您在上面计算的曲线的 AUC。
- Nancy A. Obuchowski、Donna K. McClish (1997)。 “涉及双正态 ROC 曲线指数的诊断准确度研究的样本量确定”。医学统计,16(13),1529--1542。 DOI:(SICI)1097-0258(19970715)16:13<1529::AID-SIM565>3.0.CO;2-H.
- Nancy A. Obuchowski、Micharl L. Lieber 和 Frank H. Wians Jr.(2004 年)“临床化学中的 ROC 曲线:使用、误用和可能的解决方案”。临床化学,50, 1118–1125。 DOI:10.1373/clinchem.2004.031823.