为什么pROC包不同函数计算出的95%CI值不一样?
Why the 95%CI value calculated by different functions of pROC Package were different?
我正在使用 pROC 包来计算特异性值和 95%CI 作为“最佳”阈值,我的程序代码是
data(aSAH)
myroc <- roc(aSAH$outcome, aSAH$s100b)
ci.thresholds(myroc, thresholds = "best")
95% CI (2000 stratified bootstrap replicates):
thresholds sp.low sp.median sp.high se.low se.median se.high
0.205 0.7083 0.8056 0.8889 0.4878 0.6341 0.7805
我通过函数 ci.coords 得到的值是:
ci.coords(myroc, x = "best", ret = c("specificity"))
95% CI (2000 stratified bootstrap replicates):
threshold specificity.low specificity.median specificity.high
best 0.6663 0.8194 0.9865
通过函数 ci.thresholds 的值是:
ci.thresholds(myroc)
95% CI (2000 stratified bootstrap replicates):
thresholds sp.low sp.median sp.high se.low se.median se.high
-Inf 0.00000 0.0000 0.0000 1.0000 1.0000 1.0000
0.065 0.06944 0.1389 0.2222 0.9268 0.9756 1.0000
0.075 0.12500 0.2222 0.3194 0.8049 0.9024 0.9756
0.085 0.19440 0.3056 0.4167 0.7805 0.8780 0.9756
0.095 0.27780 0.3889 0.5000 0.7073 0.8293 0.9268
0.105 0.37500 0.4861 0.5972 0.6579 0.7805 0.9024
0.115 0.43060 0.5417 0.6528 0.6098 0.7561 0.8780
0.135 0.47220 0.5833 0.6944 0.5366 0.6829 0.8293
0.155 0.58330 0.6944 0.7917 0.5122 0.6585 0.8049
0.205 0.70830 0.8056 0.8889 0.4878 0.6341 0.7805
0.245 0.72220 0.8194 0.9028 0.4390 0.5854 0.7317
0.290 0.75000 0.8333 0.9167 0.3659 0.5122 0.6585
0.325 0.76390 0.8472 0.9306 0.3171 0.4634 0.6098
0.345 0.79170 0.8750 0.9444 0.2927 0.4390 0.5854
0.395 0.81910 0.8889 0.9583 0.2683 0.4146 0.5610
0.435 0.83330 0.9028 0.9583 0.2439 0.3902 0.5366
0.475 0.90280 0.9583 1.0000 0.1951 0.3415 0.4878
0.485 0.93060 0.9722 1.0000 0.1707 0.3171 0.4634
0.510 1.00000 1.0000 1.0000 0.1707 0.2927 0.4390
当thresholds为0.205时,specificity的值为0.8056(ci.thresholds(myroc, thresholds = "best")),但是通过ci.coords(myroc, x = "best") ", ret = c("specificity")) 为 0.8194,此时阈值为 0.245。为什么不同函数得到的thresholds值不一样?
然后ci.coords(myroc, x = "best", ret = c("specificity"))得到的specificity值为0.8194,95%CI为0.6806-0.9861,但通过ci.thresholds(myroc)的值为0.8194, 95%CI: 0.7222-0.9028.
更新:
> coords(myroc, x = "best", ret="all", transpose = FALSE)
threshold specificity sensitivity accuracy tn tp fn fp npv ppv fdr fpr tpr tnr
threshold 0.205 0.8055556 0.6341463 0.7433628 58 26 15 14 0.7945205 0.65 0.35 0.1944444 0.6341463 0.8055556
fnr 1-specificity 1-sensitivity 1-accuracy 1-npv 1-ppv precision recall youden
threshold 0.3658537 0.1944444 0.3658537 0.2566372 0.2054795 0.35 0.65 0.6341463 1.439702
closest.topleft
threshold 0.1716575
> ci.coords(myroc, x = "best", ret = "all", transpose = TRUE)
95% CI (2000 stratified bootstrap replicates):
threshold threshold.low threshold.median threshold.high specificity.low specificity.median specificity.high
best best 0.12 0.205 0.51 0.6663 0.8194 1
sensitivity.low sensitivity.median sensitivity.high accuracy.low accuracy.median accuracy.high tn.low tn.median
best 0.3902 0.6341 0.8049 0.6637 0.7522 0.823 47.98 59
tn.high tp.low tp.median tp.high fn.low fn.median fn.high fp.low fp.median fp.high npv.low npv.median npv.high
best 72 16 26 33 8 15 25 0 13 24.02 0.7273 0.7973 0.8732
ppv.low ppv.median ppv.high fdr.low fdr.median fdr.high fpr.low fpr.median fpr.high tpr.low tpr.median tpr.high
best 0.5366 0.6667 1 0 0.3333 0.4634 0 0.1806 0.3337 0.3902 0.6341 0.8049
tnr.low tnr.median tnr.high fnr.low fnr.median fnr.high 1-specificity.low 1-specificity.median 1-specificity.high
best 0.6663 0.8194 1 0.1951 0.3659 0.6098 0 0.1806 0.3337
1-sensitivity.low 1-sensitivity.median 1-sensitivity.high 1-accuracy.low 1-accuracy.median 1-accuracy.high
best 0.1951 0.3659 0.6098 0.177 0.2478 0.3363
1-npv.low 1-npv.median 1-npv.high 1-ppv.low 1-ppv.median 1-ppv.high precision.low precision.median precision.high
best 0.1268 0.2027 0.2727 0 0.3333 0.4634 0.5366 0.6667 1
recall.low recall.median recall.high youden.low youden.median youden.high closest.topleft.low
best 0.3902 0.6341 0.8049 1.279 1.447 1.61 0.08148
closest.topleft.median closest.topleft.high
best 0.1717 0.4021
坐标和 ci.coords 的特异性分别为 0.8055556 和 0.8194,上面还有一些其他不同的结果。
当你运行
ci.coords(myroc, x = "best" [...]
您正在有效地计算最佳阈值本身的置信区间。
在内部,pROC 对数据重新采样,确定重新采样曲线上的最佳阈值,计算该阈值处的坐标,并重复 2000 次。
这不同于将阈值 设置为完整 ROC 曲线上的最佳点 并在该给定阈值处重新采样。
如果您关注阈值置信区间,您可以看到这一点:
ci.coords(myroc, x = "best", ret = "all", transpose = TRUE)
95% CI (2000 stratified bootstrap replicates):
threshold threshold.low threshold.median threshold.high [...]
best best 0.12 0.205 0.51
看到“最佳”阈值在 0.12 和 0.51 之间如何在 0.205 左右变化吗?因此,所有坐标也将具有更宽的置信区间。
ci.thresholds
函数的行为不同,它使用我上面提到的第二个选项,在完整的 ROC 曲线上设置“最佳”阈值:
ci.thresholds(myroc, thresholds = "best")
95% CI (2000 stratified bootstrap replicates):
thresholds
0.205
看看阈值附近怎么没有置信区间?它在重采样之前设置。如果将 x
设置为数字阈值(这恰好是完整 ROC 曲线上的最佳值,即此处为 0.205),则可以使用 ci.coords
获得相同的行为:
> ci.coords(myroc, x = 0.205)
95% CI (2000 stratified bootstrap replicates):
threshold threshold.low threshold.median threshold.high specificity.low specificity.median specificity.high sensitivity.low sensitivity.median sensitivity.high
0.205 0.205 0.205 0.205 0.205 0.7083 0.8056 0.8889 0.4878 0.6341 0.7805
您可以看到阈值没有重新采样(置信区间没有在 0.205 值附近变化)并且置信区间与使用 ci.thresholds
.
获得的相似
我意识到这可以在 ?ci.coords
中得到更好的记录,并打算在未来的版本中做到这一点。
我正在使用 pROC 包来计算特异性值和 95%CI 作为“最佳”阈值,我的程序代码是
data(aSAH)
myroc <- roc(aSAH$outcome, aSAH$s100b)
ci.thresholds(myroc, thresholds = "best")
95% CI (2000 stratified bootstrap replicates):
thresholds sp.low sp.median sp.high se.low se.median se.high
0.205 0.7083 0.8056 0.8889 0.4878 0.6341 0.7805
我通过函数 ci.coords 得到的值是:
ci.coords(myroc, x = "best", ret = c("specificity"))
95% CI (2000 stratified bootstrap replicates):
threshold specificity.low specificity.median specificity.high
best 0.6663 0.8194 0.9865
通过函数 ci.thresholds 的值是:
ci.thresholds(myroc)
95% CI (2000 stratified bootstrap replicates):
thresholds sp.low sp.median sp.high se.low se.median se.high
-Inf 0.00000 0.0000 0.0000 1.0000 1.0000 1.0000
0.065 0.06944 0.1389 0.2222 0.9268 0.9756 1.0000
0.075 0.12500 0.2222 0.3194 0.8049 0.9024 0.9756
0.085 0.19440 0.3056 0.4167 0.7805 0.8780 0.9756
0.095 0.27780 0.3889 0.5000 0.7073 0.8293 0.9268
0.105 0.37500 0.4861 0.5972 0.6579 0.7805 0.9024
0.115 0.43060 0.5417 0.6528 0.6098 0.7561 0.8780
0.135 0.47220 0.5833 0.6944 0.5366 0.6829 0.8293
0.155 0.58330 0.6944 0.7917 0.5122 0.6585 0.8049
0.205 0.70830 0.8056 0.8889 0.4878 0.6341 0.7805
0.245 0.72220 0.8194 0.9028 0.4390 0.5854 0.7317
0.290 0.75000 0.8333 0.9167 0.3659 0.5122 0.6585
0.325 0.76390 0.8472 0.9306 0.3171 0.4634 0.6098
0.345 0.79170 0.8750 0.9444 0.2927 0.4390 0.5854
0.395 0.81910 0.8889 0.9583 0.2683 0.4146 0.5610
0.435 0.83330 0.9028 0.9583 0.2439 0.3902 0.5366
0.475 0.90280 0.9583 1.0000 0.1951 0.3415 0.4878
0.485 0.93060 0.9722 1.0000 0.1707 0.3171 0.4634
0.510 1.00000 1.0000 1.0000 0.1707 0.2927 0.4390
当thresholds为0.205时,specificity的值为0.8056(ci.thresholds(myroc, thresholds = "best")),但是通过ci.coords(myroc, x = "best") ", ret = c("specificity")) 为 0.8194,此时阈值为 0.245。为什么不同函数得到的thresholds值不一样?
然后ci.coords(myroc, x = "best", ret = c("specificity"))得到的specificity值为0.8194,95%CI为0.6806-0.9861,但通过ci.thresholds(myroc)的值为0.8194, 95%CI: 0.7222-0.9028.
更新:
> coords(myroc, x = "best", ret="all", transpose = FALSE)
threshold specificity sensitivity accuracy tn tp fn fp npv ppv fdr fpr tpr tnr
threshold 0.205 0.8055556 0.6341463 0.7433628 58 26 15 14 0.7945205 0.65 0.35 0.1944444 0.6341463 0.8055556
fnr 1-specificity 1-sensitivity 1-accuracy 1-npv 1-ppv precision recall youden
threshold 0.3658537 0.1944444 0.3658537 0.2566372 0.2054795 0.35 0.65 0.6341463 1.439702
closest.topleft
threshold 0.1716575
> ci.coords(myroc, x = "best", ret = "all", transpose = TRUE)
95% CI (2000 stratified bootstrap replicates):
threshold threshold.low threshold.median threshold.high specificity.low specificity.median specificity.high
best best 0.12 0.205 0.51 0.6663 0.8194 1
sensitivity.low sensitivity.median sensitivity.high accuracy.low accuracy.median accuracy.high tn.low tn.median
best 0.3902 0.6341 0.8049 0.6637 0.7522 0.823 47.98 59
tn.high tp.low tp.median tp.high fn.low fn.median fn.high fp.low fp.median fp.high npv.low npv.median npv.high
best 72 16 26 33 8 15 25 0 13 24.02 0.7273 0.7973 0.8732
ppv.low ppv.median ppv.high fdr.low fdr.median fdr.high fpr.low fpr.median fpr.high tpr.low tpr.median tpr.high
best 0.5366 0.6667 1 0 0.3333 0.4634 0 0.1806 0.3337 0.3902 0.6341 0.8049
tnr.low tnr.median tnr.high fnr.low fnr.median fnr.high 1-specificity.low 1-specificity.median 1-specificity.high
best 0.6663 0.8194 1 0.1951 0.3659 0.6098 0 0.1806 0.3337
1-sensitivity.low 1-sensitivity.median 1-sensitivity.high 1-accuracy.low 1-accuracy.median 1-accuracy.high
best 0.1951 0.3659 0.6098 0.177 0.2478 0.3363
1-npv.low 1-npv.median 1-npv.high 1-ppv.low 1-ppv.median 1-ppv.high precision.low precision.median precision.high
best 0.1268 0.2027 0.2727 0 0.3333 0.4634 0.5366 0.6667 1
recall.low recall.median recall.high youden.low youden.median youden.high closest.topleft.low
best 0.3902 0.6341 0.8049 1.279 1.447 1.61 0.08148
closest.topleft.median closest.topleft.high
best 0.1717 0.4021
坐标和 ci.coords 的特异性分别为 0.8055556 和 0.8194,上面还有一些其他不同的结果。
当你运行
ci.coords(myroc, x = "best" [...]
您正在有效地计算最佳阈值本身的置信区间。
在内部,pROC 对数据重新采样,确定重新采样曲线上的最佳阈值,计算该阈值处的坐标,并重复 2000 次。 这不同于将阈值 设置为完整 ROC 曲线上的最佳点 并在该给定阈值处重新采样。
如果您关注阈值置信区间,您可以看到这一点:
ci.coords(myroc, x = "best", ret = "all", transpose = TRUE)
95% CI (2000 stratified bootstrap replicates):
threshold threshold.low threshold.median threshold.high [...]
best best 0.12 0.205 0.51
看到“最佳”阈值在 0.12 和 0.51 之间如何在 0.205 左右变化吗?因此,所有坐标也将具有更宽的置信区间。
ci.thresholds
函数的行为不同,它使用我上面提到的第二个选项,在完整的 ROC 曲线上设置“最佳”阈值:
ci.thresholds(myroc, thresholds = "best")
95% CI (2000 stratified bootstrap replicates):
thresholds
0.205
看看阈值附近怎么没有置信区间?它在重采样之前设置。如果将 x
设置为数字阈值(这恰好是完整 ROC 曲线上的最佳值,即此处为 0.205),则可以使用 ci.coords
获得相同的行为:
> ci.coords(myroc, x = 0.205)
95% CI (2000 stratified bootstrap replicates):
threshold threshold.low threshold.median threshold.high specificity.low specificity.median specificity.high sensitivity.low sensitivity.median sensitivity.high
0.205 0.205 0.205 0.205 0.205 0.7083 0.8056 0.8889 0.4878 0.6341 0.7805
您可以看到阈值没有重新采样(置信区间没有在 0.205 值附近变化)并且置信区间与使用 ci.thresholds
.
我意识到这可以在 ?ci.coords
中得到更好的记录,并打算在未来的版本中做到这一点。