R语言 ROC曲线

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


    img_11b13a4d5da146447cfb527ef65a8e18.jpe
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)
img_275e294b32a85b32f6f1c09b25e40008.png
  • 使用pROC包 Affairs(婚外情数据)数据取于1969年,该数据包括9个变量,601个样本


    img_73ac4394190dadcabc4c0cd3dd35a68c.jpe
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)
img_c0434e42e62148b81722fe83535bd1d4.png
  • 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(无法区分)

ROC曲线通常用来评估二元分类模型的性能,ROC曲线下面积(AUC)可以用来衡量模型的预测准确性。在确定最佳截点时,我们可以选择不同的标准,例如,最大化敏感性和特异性之和,或者最大化Youden指数等。而R语言中有多个包可以用于计算ROC曲线和确定最佳截点,例如pROC、ROCR和caret等。 下面以pROC包为例,介绍如何在R语言中计算ROC曲线并确定最佳截点。 首先,我们需要准备二元分类模型预测结果和真实标签。在这里,我们使用一个模拟数据集作为例子: ```r library(pROC) set.seed(123) # 设置随机种子以保证结果的可重复性 # 模拟预测结果和真实标签 n <- rbeta(n, 2, 5) # 模拟预测的概率 label <- rbinom(n, 1, prob) # 模拟真实标签 # 计算ROC曲线和AUC roc <- roc(label, prob) plot(roc) ``` 通过上述代码,我们可以得到ROC曲线,并且计算出了AUC。 接下来,我们可以使用`coords`函数查看ROC曲线上每个点的坐标: ```r coords(roc) ``` 这个函数会返回一组坐标,其中包括每个点的假阳性率、真阳性率和相应的阈值。我们可以进一步使用`coords`函数获取ROC曲线上特定点的坐标,例如,查找最靠近左上角的点: ```r # 查找最靠近左上角的点 coords <- coords(roc, "best", best.method = "closest.topleft") coords ``` 最后,我们可以使用`threshold`函数获取最佳截点的阈值: ```r # 获取最佳截点的阈值 threshold(roc, "best", best.method = "closest.topleft") ``` 这个函数会返回最佳截点的阈值。在这里,最佳截点是指最靠近ROC曲线左上角的点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值