Почему значение 95% ДИ, рассчитанное разными функциями пакета pRO C, отличается - PullRequest
1 голос
/ 03 августа 2020

Я использую пакет pRO C для расчета значения специфичности и 95% доверительного интервала для «наилучшего» порога, мой программный код:

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

Когда порог равен 0,205, значение специфичности равно 0,8056 (ci. thresholds (myro c, thresholds = "best")), но значение через ci.coords (myro c, x = "best", ret = c ("специфичность")) было 0,8194, в этом время пороговое значение составляет 0,245. Почему значения порогов не совпадают, полученные разными функциями?

А затем значение специфичности, полученное ci.coords (myro c, x = "best", ret = c ( «специфичность»)) составляла 0,8194, а 95% ДИ составлял 0,6806-0,9861, но значение через пороги КИ (myro c) составляло 0,8194 , 95% ДИ: 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

специфичность была 0,8055556 и 0,8194 соответственно для coords и ci.coords, и выше приведены некоторые другие результаты.

1 Ответ

1 голос
/ 05 августа 2020

Когда вы запускаете

ci.coords(myroc, x = "best" [...]

, вы фактически вычисляете доверительный интервал самого лучшего порогового значения .

Внутренне, pRO C выполняет повторную выборку данных, определяет наилучший порог на пересчитанной кривой , вычисляет координаты на этом пороге и повторяет 2000 раз. Это отличается от установки порога в любую точку, которая лучше всего подходит для полной RO C кривой , и повторной выборки на этом заданном пороге.

Вы можете увидеть это, если сосредоточитесь на достоверности порога interval:

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,205, от 0,12 до 0,51? Как следствие, все координаты также будут иметь более широкие доверительные интервалы.

Функция ci.thresholds ведет себя по-другому и использует второй вариант, о котором я упоминал выше, устанавливая «лучший» порог на полной кривой RO C :

ci.thresholds(myroc, thresholds = "best")

95% CI (2000 stratified bootstrap replicates):
 thresholds 
      0.205

Видите, нет ли доверительного интервала около порога? Устанавливается перед передискретизацией. Вы можете получить такое же поведение с ci.coords, если вы установите x на числовое c пороговое значение (которое оказывается лучшим для полной кривой RO C, ie 0.205 здесь):

> 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, и мы постараемся сделать это в будущем выпуске.

...