Question

Given such data: SN = Sensitivity; SP = Specificity

Cutpoint        SN   1-SP
       1       0.5    0.1
       2       0.7    0.2
       3       0.9    0.6

How can i plot the ROC curve and calculate AUC. And compare the AUC between two different ROC curves. In the most of the packages such pROC or ROCR, the input of the data is different from those shown above. Can anybody suggest the way to solve this problem in R or by something else?

ROCsdat <- data.frame(cutpoint = c(5, 7, 9), TPR = c(0.56, 0.78, 0.91), FPR = c(0.01, 0.19, 0.58))

## plot version 1
op <- par(xaxs = "i", yaxs = "i")
plot(TPR ~ FPR, data = dat, xlim = c(0,1), ylim = c(0,1), type = "n")
with(dat, lines(c(0, FPR, 1), c(0, TPR, 1), type = "o", pch = 25, bg = "black"))
text(TPR ~ FPR, data = dat, pos = 3, labels = dat$cutpoint)
abline(0, 1)
par(op)
Was it helpful?

Solution

First off, I would recommend to visit your local library and find an introductory book on R. It is important to have a solid base before you can write your own code, and copy-pasting code found on the internet without really understanding what is means is risky at best.

Regarding your question, I believe the (0,0) and (1,1) cooordinates are part of the ROC curve so I included them in the data:

ROCsdat <- data.frame(cutpoint = c(-Inf, 5, 7, 9, Inf), TPR = c(0, 0.56, 0.78, 0.91, 1), FPR = c(0, 0.01, 0.19, 0.58, 1)) 

AUC

I strongly recommend against setting up your own trapezoid integration function at this stage of your training in R. It's too error-prone and easy to screw up with a small (syntax) mistake.

Instead, use a well established integration code like the trapz function in pracma:

library(pracma)
trapz(ROCsdat$FPR, ROCsdat$TPR)

Plotting

I think you mostly got the plotting, although I would write it slightly differently:

plot(TPR ~ FPR, data = ROCsdat, xlim = c(0,1), ylim = c(0,1), type="b", pch = 25, bg = "black")
text(TPR ~ FPR, data = ROCsdat, pos = 3, labels = ROCsdat$cutpoint)
abline(0, 1, col="lightgrey")

Comparison

For the comparison, let's say you have two AUCs in auc1 and auc2. The if/else syntax looks like this:

if (auc1 < auc2) {
    cat("auc1 < auc2!\n")
} else if (auc1 == auc2) {
    cat("aucs are identical!\n")
} else {
    cat("auc1 > auc2!\n")
}

OTHER TIPS

I suppose you could just compute it manually:

dat <- data.frame(tpr=c(0, .5, .7, .9, 1), fpr=c(0, .1, .2, .6, 1))
sum(diff(dat$fpr) * (dat$tpr[-1] + dat$tpr[-length(dat$tpr)]) / 2)
# [1] 0.785

You need to have the tpr and fpr vectors begin with 0 and end with 1 to compute the AUC properly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top