1
$\begingroup$

I am trying to understand the link between the threshold in ROC-analysis and the threshold defined in classification table. Criterion is binary with 0 or 1.

1) Someone can determine a confusion table for a binary classification task:

threshold=0.5
predicted_values<-ifelse(predict(model,type="response")>threshold,1,0)
actual_values<-df$Criterion
conf_matrix<-table(predicted_values,actual_values)
conf_matrix

Threshold-value can range between 0 and 1 here. Above 1, it causes errors / implausible values.

2) Someone can compute a ROC-analysis and determine an optimal cut-off value like shown in the answer below in this posting: https://stackoverflow.com/questions/53868036/specificity-sensitivity-vs-cut-off-points-using-proc-package

1: https://stackoverflow.com/questions/53868036/specificity-sensitivity-vs-cut-off-points-using-proc-package

Question:

The obtained threshold in ROC-analysis can exceed one (or is even larger, see example linked). Thus, it cannot be used as threshold in confusion table.

Can someone tell explain me: why are those values not fitting to each other?

Edit/ Addition:

Thanks to feedback! Below I am posting my code and kindly ask for some feedback about plausibility / interpretation of threshold of 1.347756.

Data:

structure(list(predictor1 = c(0.6875, 0.666666666666667, 0.9375, 
0.6875, 0.625, 0.75, 0.5, 0.625, 0.666666666666667, 0.229166666666667, 
0.833333333333333, 0.854166666666667, 0.645833333333333, 0.479166666666667, 
0.833333333333333, 0.4375, 0.0833333333333333, 0.3125, 0.9375, 
0.583333333333333, 0.645833333333333, 0.416666666666667, 0.854166666666667, 
0.5, 0.645833333333333, 0.708333333333333, 0.645833333333333, 
0.791666666666667, 0.666666666666667, 0.625, 0.479166666666667, 
0.375, 0.4375, 0.645833333333333, 0.666666666666667, 0.291666666666667, 
0.583333333333333, 0.8125, 0.625, 0.3125, 0.5, 0.895833333333333, 
0.8125, 0.270833333333333, 0.958333333333333, 0.833333333333333, 
0.729166666666667, 0.75, 0.645833333333333, 0.625, 0.583333333333333, 
0.729166666666667, 0.75, 0.604166666666667, 0.604166666666667, 
0.520833333333333, 0.208333333333333, 0.791666666666667, 0.666666666666667, 
0.666666666666667, 0.416666666666667, 0.6875, 0.291666666666667, 
0.375, 0.625, 0.416666666666667, 0.6875, 0.520833333333333, 0.604166666666667, 
0.729166666666667, 0.8125, 0.541666666666667, 0.333333333333333, 
0.708333333333333, 0.666666666666667, 0.708333333333333, 0.625, 
0.979166666666667, 0.604166666666667, 0.5, 0.354166666666667, 
0.604166666666667, 0.520833333333333, 0.75, 0.395833333333333, 
0.395833333333333, 0.4375, 0.6875, 0.8125, 0.625, 0.666666666666667, 
0.416666666666667, 0.833333333333333, 0.625, 0.729166666666667, 
0.75, 0.625, 0.395833333333333, 0.333333333333333, 0.520833333333333, 
0, 0.770833333333333, 0.5625, 0.583333333333333, 0.708333333333333, 
0.645833333333333, 0.666666666666667, 0.458333333333333, 0.625, 
0.645833333333333, 0.604166666666667, 0.416666666666667, 0.770833333333333, 
0.354166666666667, 0.6875, 0.75, 0.958333333333333, 0.958333333333333, 
0.520833333333333, 0.708333333333333, 0.708333333333333, 0.166666666666667, 
0.729166666666667, 0.916666666666667, 0.625, 0.541666666666667, 
0.604166666666667, 0.375, 0.479166666666667, 0.729166666666667, 
0.541666666666667, 0.5625, 0.458333333333333, 0.354166666666667, 
0.791666666666667, 0.416666666666667, 0.104166666666667, 0.645833333333333, 
0.6875, 0.6875, 0.708333333333333, 0.833333333333333, 0.854166666666667, 
0.916666666666667, 0.416666666666667, 0.708333333333333, 0.375, 
1, 0.416666666666667, 0.375, 0.729166666666667, 0.625, 0.333333333333333, 
0.541666666666667, 0.770833333333333, 0.416666666666667, 0.541666666666667, 
0.4375, 0.708333333333333, 0.458333333333333, 0.291666666666667, 
0.416666666666667, 0.666666666666667, 0.479166666666667, 0.583333333333333, 
0.729166666666667, 0.604166666666667, 0.645833333333333, 0.666666666666667, 
0.416666666666667, 0.583333333333333, 0.4375, 0.854166666666667, 
0.5625, 0.708333333333333, 0.4375, 0.791666666666667, 0.583333333333333, 
0.541666666666667, 0.708333333333333, 0.4375, 0.458333333333333, 
0.458333333333333, 0.25, 0.6875, 0.354166666666667, 0.333333333333333, 
0.145833333333333, 0.770833333333333, 0.625, 0.416666666666667, 
0.479166666666667, 0.479166666666667, 0.104166666666667, 0.458333333333333, 
0.729166666666667, 0.458333333333333, 0.520833333333333, 0.708333333333333, 
0.625, 0.75, 0.5625, 0.5, 0.875, 0.541666666666667, 0.5, 0.625, 
0.583333333333333, 0.645833333333333, 0.479166666666667, 0.541666666666667, 
0.458333333333333, 0.208333333333333, 0.645833333333333, 0.458333333333333, 
0.416666666666667, 0.375, 0.104166666666667, 0.520833333333333, 
0.5, 0.479166666666667, 0.604166666666667, 0.8125, 0.4375, 0.395833333333333, 
0.791666666666667, 0.583333333333333), predictor2 = c(0.423076923076923, 
0.692307692307692, 0.076923076923077, 0.115384615384615, 0.615384615384615, 
0.307692307692308, 0.346153846153846, 0.230769230769231, 0.153846153846154, 
0.615384615384615, 0.730769230769231, 0.307692307692308, 0.884615384615385, 
0.615384615384615, 0.153846153846154, 0.153846153846154, 0, 0.076923076923077, 
0.461538461538462, 0.423076923076923, 0.384615384615385, 0.423076923076923, 
0.346153846153846, 0.346153846153846, 0.423076923076923, 0.153846153846154, 
0.153846153846154, 0.076923076923077, 0.423076923076923, 0.423076923076923, 
0.923076923076923, 0.461538461538462, 0.5, 0.230769230769231, 
0.307692307692308, 0.730769230769231, 0.346153846153846, 0.423076923076923, 
0.384615384615385, 0.461538461538462, 0.230769230769231, 0, 0.692307692307692, 
0.5, 0.461538461538462, 0.653846153846154, 0.423076923076923, 
0.769230769230769, 0.615384615384615, 0.5, 0.653846153846154, 
0.615384615384615, 0.769230769230769, 0.346153846153846, 0.692307692307692, 
0.230769230769231, 0.730769230769231, 0.5, 0, 0.115384615384615, 
0.538461538461538, 0.576923076923077, 0.653846153846154, 0.576923076923077, 
0.692307692307692, 0.615384615384615, 0.423076923076923, 0.461538461538462, 
0.615384615384615, 0.615384615384615, 0.5, 0.538461538461538, 
0.653846153846154, 0, 0.615384615384615, 0.346153846153846, 0.153846153846154, 
0.307692307692308, 0.153846153846154, 0.5, 0.615384615384615, 
0.461538461538462, 0.615384615384615, 0.730769230769231, 0.769230769230769, 
0.423076923076923, 0.576923076923077, 0.653846153846154, 0, 0.307692307692308, 
0.192307692307692, 0.192307692307692, 0.269230769230769, 0.5, 
0.423076923076923, 0.538461538461538, 0, 0.153846153846154, 0.423076923076923, 
0.384615384615385, 0.692307692307692, 0.115384615384615, 0.423076923076923, 
0.5, 0.576923076923077, 0.692307692307692, 0.423076923076923, 
0.5, 0.576923076923077, 0.115384615384615, 0.076923076923077, 
0.192307692307692, 0.269230769230769, 0.846153846153846, 0.192307692307692, 
0.230769230769231, 0.230769230769231, 0.0384615384615385, 0.730769230769231, 
0.0384615384615385, 0.192307692307692, 0.115384615384615, 0.307692307692308, 
0.153846153846154, 0.538461538461538, 0.730769230769231, 0.423076923076923, 
0.461538461538462, 0.346153846153846, 0.923076923076923, 0.692307692307692, 
0.615384615384615, 0.461538461538462, 0.538461538461538, 0.230769230769231, 
0.576923076923077, 0.576923076923077, 0.615384615384615, 0.538461538461538, 
0.653846153846154, 0, 0.307692307692308, 0.769230769230769, 0.076923076923077, 
0.538461538461538, 0.346153846153846, 0, 0.692307692307692, 0.692307692307692, 
0.115384615384615, 0.423076923076923, 0.692307692307692, 0.423076923076923, 
0.307692307692308, 0.423076923076923, 0.576923076923077, 0.423076923076923, 
0.653846153846154, 0.307692307692308, 0.230769230769231, 0.153846153846154, 
0.5, 0.153846153846154, 0.730769230769231, 0.423076923076923, 
0.615384615384615, 0.769230769230769, 1, 0.846153846153846, 0.423076923076923, 
0.538461538461538, 0.807692307692308, 0.192307692307692, 0.769230769230769, 
0.0384615384615385, 0.769230769230769, 0.5, 0.846153846153846, 
0.384615384615385, 0.5, 0.384615384615385, 0.576923076923077, 
0.653846153846154, 0, 0.538461538461538, 0.653846153846154, 0.115384615384615, 
0.692307692307692, 0.384615384615385, 0.692307692307692, 0.576923076923077, 
0.153846153846154, 0.653846153846154, 0.538461538461538, 0.807692307692308, 
0.769230769230769, 0.461538461538462, 0.538461538461538, 0.461538461538462, 
0.461538461538462, 0.153846153846154, 0.230769230769231, 0.769230769230769, 
0.538461538461538, 0.423076923076923, 0.615384615384615, 0.153846153846154, 
0.576923076923077, 0.846153846153846, 0.846153846153846, 0.653846153846154, 
0.076923076923077, 0.230769230769231, 0.846153846153846, 0.576923076923077, 
0.730769230769231, 0.269230769230769, 0.576923076923077, 0.461538461538462, 
0.423076923076923, 0.807692307692308, 0.5, 0.5, 0.423076923076923, 
0.769230769230769, 0.269230769230769, 0.269230769230769), predictor3 = c(0.5, 
0.583333333333333, 0, 0.666666666666667, 0.333333333333333, 0.5, 
0.333333333333333, 0.583333333333333, 0.333333333333333, 0.833333333333333, 
0.5, 0.5, 0.416666666666667, 0.333333333333333, 0.333333333333333, 
0.5, 0.416666666666667, 0.416666666666667, 0.5, 0.25, 0.5, 0.5, 
0.5, 0.5, 0.583333333333333, 0, 0.333333333333333, 0.333333333333333, 
0.25, 0.5, 0.5, 0.25, 0.416666666666667, 0.416666666666667, 0.666666666666667, 
0.666666666666667, 0.5, 0.166666666666667, 0.25, 0.5, 0.5, 0.416666666666667, 
0.583333333333333, 0.5, 0.25, 0.333333333333333, 0.416666666666667, 
0.333333333333333, 0.25, 0.833333333333333, 0.5, 0.166666666666667, 
0.416666666666667, 0.5, 0.25, 0.416666666666667, 0.583333333333333, 
0.5, 0.333333333333333, 0.25, 0.5, 0.583333333333333, 0.166666666666667, 
0.25, 0.5, 0.5, 0.166666666666667, 0.5, 0, 0.333333333333333, 
0.416666666666667, 0.583333333333333, 0.5, 0.666666666666667, 
0, 0.666666666666667, 0.5, 0.166666666666667, 0.25, 0.25, 0.25, 
0.416666666666667, 0.5, 0.333333333333333, 0.583333333333333, 
0.5, 0.666666666666667, 0.416666666666667, 0.333333333333333, 
0.25, 0.333333333333333, 0.333333333333333, 0.166666666666667, 
0.25, 0.0833333333333333, 0.583333333333333, 0.5, 0.583333333333333, 
0.25, 0.333333333333333, 0.333333333333333, 0.166666666666667, 
0.333333333333333, 0.0833333333333333, 0.5, 0.25, 0.416666666666667, 
0.75, 0.666666666666667, 0.583333333333333, 0.333333333333333, 
0.416666666666667, 0.5, 0.5, 0.583333333333333, 0.583333333333333, 
0.333333333333333, 0.25, 0.25, 0.416666666666667, 0.833333333333333, 
0.5, 0.5, 0.5, 0.416666666666667, 0.416666666666667, 0.25, 0.5, 
0.416666666666667, 0.416666666666667, 0.25, 0.333333333333333, 
0.416666666666667, 0.25, 0.25, 0.333333333333333, 0.333333333333333, 
0.166666666666667, 0.416666666666667, 0.5, 0.0833333333333333, 
0.166666666666667, 0.416666666666667, 0.333333333333333, 0.25, 
0.5, 0.5, 0.416666666666667, 0.333333333333333, 0.166666666666667, 
0.166666666666667, 0.583333333333333, 0.5, 0.5, 0.666666666666667, 
0.5, 0.5, 0.5, 0.583333333333333, 0.333333333333333, 0, 0.416666666666667, 
0.416666666666667, 0.666666666666667, 0.5, 0.25, 0, 0.416666666666667, 
0.5, 0.75, 0.666666666666667, 0.5, 0.25, 0.583333333333333, 0.5, 
0.583333333333333, 0.333333333333333, 0.416666666666667, 0.333333333333333, 
0.5, 0.166666666666667, 0.583333333333333, 0.583333333333333, 
1, 0.5, 0.416666666666667, 0.333333333333333, 0.333333333333333, 
0.333333333333333, 0.5, 0.5, 0.333333333333333, 0.416666666666667, 
0.666666666666667, 0.5, 0.75, 0.583333333333333, 0.583333333333333, 
0.333333333333333, 0.583333333333333, 0.5, 0.75, 0.333333333333333, 
0.333333333333333, 0.583333333333333, 0.416666666666667, 0.583333333333333, 
0.25, 0.416666666666667, 0.25, 0.416666666666667, 0.5, 0.333333333333333, 
0.416666666666667, 0.5, 0.666666666666667, 0.333333333333333, 
0.416666666666667, 0.333333333333333, 0.583333333333333, 0.75, 
0.333333333333333, 0.416666666666667, 0.5, 0.75, 0.333333333333333, 
0.5), criterion = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0)), variable.labels = structure(character(0), .Names = character(0)), codepage = 65001L, row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 
55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 
68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 
81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 
94L, 95L, 96L, 97L, 98L, 99L, 100L, 101L, 102L, 103L, 104L, 105L, 
106L, 107L, 108L, 109L, 110L, 111L, 112L, 113L, 114L, 115L, 116L, 
117L, 118L, 120L, 121L, 122L, 123L, 124L, 125L, 126L, 127L, 128L, 
129L, 130L, 131L, 132L, 133L, 134L, 135L, 136L, 137L, 138L, 139L, 
140L, 141L, 142L, 143L, 144L, 145L, 146L, 147L, 148L, 149L, 150L, 
151L, 152L, 153L, 154L, 155L, 156L, 157L, 158L, 159L, 160L, 161L, 
162L, 163L, 164L, 165L, 166L, 167L, 168L, 169L, 170L, 171L, 172L, 
173L, 174L, 175L, 176L, 177L, 178L, 179L, 180L, 181L, 182L, 183L, 
184L, 185L, 186L, 187L, 188L, 189L, 190L, 191L, 192L, 193L, 194L, 
195L, 196L, 197L, 198L, 200L, 201L, 202L, 203L, 204L, 205L, 206L, 
207L, 208L, 209L, 210L, 211L, 212L, 213L, 214L, 215L, 216L, 217L, 
218L, 219L, 220L, 221L, 222L, 223L, 224L, 225L, 226L, 227L, 228L, 
229L), class = "data.frame")

Prediction model:

model<-glm(formula = criterion ~ predictor1+predictor2+predictor3, 
              family = binomial, data = df)
model

Confusion matrix:

threshold=0.5
predicted_values<-ifelse(predict(model,type="response")>threshold,1,0)
actual_values<-df$criterion
conf_matrix<-table(predicted_values,actual_values)
conf_matrix

ROC analysis:

library(pROC)

roc <- plot.roc(df$criterion, df$predictor1+df$predictor2+df$predictor3,
                 main="Confidence intervals", percent=TRUE,
                 ci=TRUE, # compute AUC (of AUC by default)
                 print.auc=TRUE) # print the AUC (will contain the CI)

mycoords <- coords(roc, "all", transpose = TRUE)

plot(mycoords["threshold",], mycoords["specificity",], type="l", 
     col="red", xlab="Cutoff", ylab="Performance")
lines(mycoords["threshold",], mycoords["sensitivity",], type="l", 
      col="blue")
legend(100, 0.4, c("Specificity", "Sensitivity"), 
       col=c("red", "blue"), lty=1)

best.coords <- coords(roc, "best", best.method="youden", 
                      transpose = TRUE)

abline(v=best.coords["threshold"], lty=2, col="grey")
abline(h=best.coords["specificity"], lty=2, col="red")
abline(h=best.coords["sensitivity"], lty=2, col="blue")

enter image description here

best.coords

Output:

> threshold specificity sensitivity 
> 1.347756   75.000000   45.695364 

Question:

Is this threshold plausible? To what is this threshold referring / how do I interpret this threshold regarding my 3 predictors?

$\endgroup$

1 Answer 1

2
$\begingroup$

In the linked answer, the ROC curve is being calculated directly from one of the features (ndka), not from a model's probability predictions. So the thresholds are in the scale of that feature. You might think of this as corresponding to a linear model with a positive coefficient on that feature: you'd end up with the same ROC curve, just with a transformed set of thresholds.


Update after question edited to include code:

R is not my main language, but it looks like your problem is in:

roc <- plot.roc(df$criterion, df$predictor1+df$predictor2+df$predictor3,
                 main="Confidence intervals", percent=TRUE,
                 ci=TRUE, # compute AUC (of AUC by default)
                 print.auc=TRUE) # print the AUC (will contain the CI)

That second argument is not being treated as a formula the way it is in the modeling code, it's the literal sum of the three predictors. You should instead pass your model's probability predictions.

$\endgroup$
5
  • $\begingroup$ Thanks! Is there any way to rescale thresholds from ROC model back to model's probabiliy predictions? $\endgroup$
    – Jens
    Jun 5, 2020 at 15:20
  • 1
    $\begingroup$ @Jens you'll need to rescale the features themselves. $\endgroup$
    – Calimo
    Jun 5, 2020 at 16:28
  • $\begingroup$ In my case, I have 3 predictors which are normalized between 0 and 1. How do I interpret a threshold of 1.34 in my case? $\endgroup$
    – Jens
    Jun 5, 2020 at 18:26
  • 1
    $\begingroup$ @Jens What kind of model? Do you have any predictions of 1.34? $\endgroup$ Jun 5, 2020 at 18:27
  • $\begingroup$ @BenReiniger, I added the code because I am unsure about the correct answer to your question! Thanks a lot for your great support. I am looking forward to your feedback! :-) $\endgroup$
    – Jens
    Jun 5, 2020 at 18:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.