Plot ROC curve and calculate AUC in R at specific cutoff info

僤鯓⒐⒋嵵緔 提交于 2020-03-02 06:58:48

问题


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)

回答1:


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")
}



回答2:


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.



来源:https://stackoverflow.com/questions/22413349/plot-roc-curve-and-calculate-auc-in-r-at-specific-cutoff-info

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!