首页 文章

绘制ROC曲线并在特定截止信息下计算R中的AUC

提问于
浏览
2

给出这样的数据:SN =灵敏度; SP =特异性

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

如何绘制ROC曲线并计算AUC . 并比较两种不同ROC曲线之间的AUC . 在诸如pROC或ROCR的大多数包中,数据的输入与上面所示的不同 . 任何人都可以建议在R或其他方面解决这个问题的方法吗?

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)

2 回答

  • 3

    首先,我建议您访问当地的图书馆,找一本关于R的入门书籍 . 在您编写自己的代码和在互联网上找到的复制粘贴代码之前,有一个坚实的基础是很重要的,而不是真正理解什么是充其量是冒险的 .

    关于你的问题,我相信(0,0)和(1,1)坐标是ROC曲线的一部分,所以我将它们包含在数据中:

    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

    我强烈建议您在R训练的这个阶段不要设置自己的梯形积分功能 . 它太容易出错并容易搞砸一个小的(语法)错误 .

    相反,使用完善的集成代码,如 pracma 中的 trapz 函数:

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

    绘图

    我认为你们大部分时间都在进行策划,尽管我会稍微改写一下:

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

    比较

    为了比较,假设您在 auc1auc2 中有两个AUC . if / else语法如下所示:

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

    我想你可以手动计算它:

    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
    

    您需要让 tprfpr 向量以0开头并以1结束以正确计算AUC .

相关问题