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(无法区分)

### 如何在R语言中生成ROC曲线 #### 函数说明 在R语言中,`pROC`包提供了强大的功能用于计算和绘制ROC曲线。以下是主要使用的两个函数: 1. **`roc()`**: 该函数用来计算接收者操作特性(ROC曲线的相关统计数据,包括真阳性率(TPR)、假阳性率(FPR),以及最佳阈值等[^2]。 2. **`plot()`**: 这是一个通用绘图函数,在这里可以用来绘制由`roc()`返回的对象。 #### 示例代码 下面提供了一个完整的示例代码,展示如何使用R语言生成一条ROC曲线,并对其进行标注和美化。 ```r # 加载必要的库 library(pROC) # 假设数据集如下: labels <- c(1, 0, 1, 1, 0, 1, 0, 0, 1, 0) # 实际标签 (1表示正类,0表示负类) predictions <- c(0.9, 0.3, 0.8, 0.75, 0.2, 0.85, 0.4, 0.1, 0.95, 0.3) # 预测概率 # 使用roc()函数计算ROC对象 roc_obj <- roc(labels, predictions) # 打印AUC值 cat("AUC:", auc(roc_obj), "\n") # 绘制ROC曲线 plot(roc_obj, print.thres = "best", # 显示最佳阈值 print.auc = TRUE, # 显示AUC值 print.auc.y = 0.3, # AUC显示位置的y坐标 print.auc.x = 0.7, # AUC显示位置的x坐标 main = "ROC Curve Example", # 图形标题 xlab = "False Positive Rate", # X轴标签 ylab = "True Positive Rate") # Y轴标签 ``` 以上代码实现了以下几个目标: - 定义了一组实际标签 (`labels`) 和预测的概率值 (`predictions`)。 - 调用了 `roc()` 函数来创建 ROC 对象,并通过 `auc()` 获取曲线下面积(AUC)。 - 利用 `plot()` 方法绘制了 ROC 曲线,并设置了额外选项以便更清晰地呈现结果。 #### 多条ROC曲线对比 如果需要在同一张图表上比较多个模型的表现,则可以通过多次调用`roc()`函数分别获取各模型对应的ROC对象,再依次加入到同一个图形中。例如: ```r # 创建第二个模型的数据 predictions_model2 <- c(0.8, 0.4, 0.7, 0.65, 0.3, 0.75, 0.5, 0.2, 0.85, 0.4) # 计算第二条ROC曲线 roc_obj_2 <- roc(labels, predictions_model2) # 初始化画布并绘制第一条ROC曲线 plot(roc_obj, col="blue", lwd=2, main="Comparison of Two Models", xlab="False Positive Rate", ylab="True Positive Rate") # 添加第二条ROC曲线至同一幅图 lines(roc_obj_2, col="red", lwd=2) # 添加图例 legend(x = 0.6, y = 0.6, legend=c("Model 1", "Model 2"), col=c("blue","red"), lty=1, lwd=2) ``` 此部分展示了如何利用`lines()`命令叠加其他模型的ROC曲线,并借助`legend()`增加区分度更高的图例描述[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值