R语言 ROC曲线

  • ROC曲线(受试者工作特征, Receiver Operating Characteristic) 可以简单、直观得观察分析方法的临床准确性,并可用肉眼作出判断。ROC以真阳性率(灵敏度FPR)为纵坐标,假阳性率(1-特异度TPR)为横坐标绘制的曲线,可准确反映某分析方法特异性和敏感性的关系,是试验准确性的综合代表。ROC曲线不固定分类界值,允许中间状态存在,利于使用者结合专业知识,权衡漏诊与误诊的影响,选择一更佳截断点作为诊断参考值。提供不同试验之间在共同标尺下的直观的比较,ROC曲线越凸越近左上角表明其诊断价值越大,利于不同指标间的比较。曲线下面积可评价诊断准确性。
  • 相关定义及计算公式(用混淆矩阵的形式将分类结果展示出来)


    R语言 ROC曲线
setwd("E:\\Rwork")
library(ROCR)
data(ROCR.simple)
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels) 
#ROCR.simple$predictions为预测标签,ROCR.simple$labels为真实标签
perf <- performance(pred,"tpr","fpr")
auc <- performance(pred,'auc')
auc = unlist(slot(auc,"y.values"))
plot(perf,
     xlim=c(0,1), ylim=c(0,1),col='red', 
     main=paste("ROC curve (", "AUC = ",auc,")"),
     lwd = 2, cex.main=1.3, cex.lab=1.2, cex.axis=1.2, font=1.2)
abline(0,1)
R语言 ROC曲线
  • 使用pROC包 Affairs(婚外情数据)数据取于1969年,该数据包括9个变量,601个样本


    R语言 ROC曲线
data(Affairs, package="AER")
summary(Affairs)

Affairs$ynaffair[Affairs$affairs > 0] <- 1
Affairs$ynaffair[Affairs$affairs == 0] <- 0
Affairs$ynaffair <- factor(Affairs$ynaffair,
                             levels=c(0,1),
                             labels=c("No","Yes"))
table(Affairs$ynaffair)
fit.full <- glm(ynaffair ~ gender + age + yearsmarried + children +
                  religiousness + education + occupation +rating,
                data=Affairs, family=binomial())
summary(fit.full)

# 做一个logistic回归,生成概率预测值

pre <- predict(fit.full,type='response')
# 将预测概率prob和实际结果y放在一个数据框中
data <- data.frame(prob=pre,obs=Affairs$ynaffair)
# 按预测概率从低到高排序

library(pROC)
modelroc <- roc(Affairs$ynaffair,pre)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
     grid.col=c("green", "red"), max.auc.polygon=TRUE,
     auc.polygon.col="skyblue", print.thres=TRUE)
R语言 ROC曲线
  • ROC曲线下的面积(area under ROC curve)值在1.0和0.5之间。
  • 在AUC>0.5的情况下,AUC越接近于1,说明诊断效果越好。
  • AUC在 0.5~0.7时有较低准确性,AUC在0.7~0.9时有一定准确性,AUC在0.9以上时有较高准确性。
  • AUC=0.5时,说明诊断方法完全不起作用,无诊断价值。
  • AUC<0.5不符合真实情况,在实际中极少出现。

0.9 ~ 1.0 ( 优秀)
0.8 ~ 0.9 (良好)
0.7 ~ 0.8(一般)
0.6 ~ 0.7(很差)
0.5 ~ 0.6(无法区分)

上一篇:癌症免疫系列(4)


下一篇:R语言for循环①