查看: 143|回覆: 1

[教程] R语言实现漂亮的ROC图效果

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2010-8-29
發表於 2022-6-7 14:49:51 | 顯示全部樓層 |閲讀模式

pROC是一个专门用来计算和绘制ROC曲线的R包,目前已被CRAN收录,因此安装也非常简单,同时该包也兼容ggplot2函数绘图,本次就教大家怎么用pROC来快速画出ROC图。在医学领域主要用于判断某种因素对于某种疾病的诊断是否有诊断价值。什么是ROC曲线和AUC,以及如何去看ROC曲线的结果,可以这样总结:ROC曲线呢,其实就是每个对应的cutoff值都有一个对应的真阳性率(纵坐标)和假阳性率(横坐标),比如选择了10个cutoff值,那就相当于有个10个点,把这些点连成一条线就是ROC曲线。AUC值就是ROC曲线下的面积,一般认为AUC值在0.7~1之间,模型预测的结果才有效。TPR(真阳性率) = TP(真阳)/(TP(真阳) + FN(假阴)),FPR(假阳性率) = FP(假阳) / (FP(假阳) + TN(真阴))。 比如下面的一个模型预测后的数据结果:

上图中如果选cutoff值为0.5时
TPR = 5 /(5 + 0)= 1,
FPR = 2 / (2 + 3) = 0.4, 
预测的准确性 = (TP + TN )/ 总的样本数 = (5 + 3)/10 = 0.8

好了,话不多说,我们直接上代码

1.读取数据

library(openxlsx)
ROC <- read.xlsx("ROC曲线.xlsx")

2.AUC和CI的计算

library(pROC)
## roc的计算,可以一次性批量计算a、b、c三组数据
res<-roc(outcome~a+b+c,data=ROC,aur=TRUE,
         ci=TRUE, # 显示95%CI
         # percent=TRUE, ##是否需要以百分比显示
         levels=c('group1','group2'),direction=">" #设置分组方向
         )
## 平滑曲线的ROC结果
smooth<-roc(outcome~a+b+c,data=ROC,aur=TRUE,
         ci=TRUE, # 显示95%CI
         # percent=TRUE, ##是否需要以百分比显示
         smooth=TRUE,
         levels=c('group1','group2'),direction=">" #设置分组方向
         )

显示非平滑ROC曲线的结果

res
Call:
roc.formula(formula = outcome ~ a, data = ROC, aur = TRUE, ci = TRUE,     levels = c("group1", "group2"), direction = ">")
Data: a in 40 controls (outcome group1) > 32 cases (outcome group2).
Area under the curve: 0.7328
95% CI: 0.6171-0.8485 (DeLong)
$b
Call:
roc.formula(formula = outcome ~ b, data = ROC, aur = TRUE, ci = TRUE,     levels = c("group1", "group2"), direction = ">")

Data: b in 40 controls (outcome group1) > 32 cases (outcome group2).
Area under the curve: 0.8234
95% CI: 0.7303-0.9165 (DeLong)
$c
Call:
roc.formula(formula = outcome ~ c, data = ROC, aur = TRUE, ci = TRUE,     levels = c("group1", "group2"), direction = ">")

Data: c in 40 controls (outcome group1) > 32 cases (outcome group2).
Area under the curve: 0.9242
95% CI: 0.8679-0.9805 (DeLong)

3.利用ggplot2绘图

library(ggplot2)
pa<- ggroc(smooth$a, 
       legacy.axes = TRUE # 将X轴改为0-1,(默认是1-0)
       )+
   geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), 
                color="darkgrey", linetype=4)+
 theme_bw() +# 设置背景
 ggtitle('a-ROC')
pb<- ggroc(smooth$b, legacy.axes = TRUE)+geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), color="darkgrey", linetype=4)+theme_bw() +ggtitle('b-ROC')
pc<- ggroc(smooth$c, legacy.axes = TRUE)+geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), color="darkgrey", linetype=4)+theme_bw() +ggtitle('c-ROC')
cowplot::plot_grid(pa,pb,pc,labels = "AUTO",nrow = 1)

4.合并多个ROC曲线结果

ggroc(smooth, legacy.axes = TRUE)+
    geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), color="darkgrey", linetype=4)+
    theme_bw()+ggtitle('ROC')+ggsci::scale_color_lancet()+
    annotate("text",x=0.75,y=0.125,label=paste("a-AUC = ", round(res$a$auc,3)))+
    annotate("text",x=0.75,y=0.25,label=paste("b-AUC = ", round(res$b$auc,3)))+
    annotate("text",x=0.75,y=0.375,label=paste("c-AUC = ", round(res$c$auc,3)))

到此这篇关于R语言实现漂亮的ROC图的文章就介绍到这了,更多相关R语言 ROC图内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!

您可能感兴趣的文章:
  • R语言利用caret包比较ROC曲线的操作
  • 用R语言绘制ROC曲线的实例讲解
  • R语言逻辑回归、ROC曲线与十折交叉验证详解
  • 详解R语言中生存分析模型与时间依赖性ROC曲线可视化
回覆

使用道具 舉報

0

主題

2092

回帖

1萬

積分

琼殿精英

金币
10581
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-10-11
發表於 2026-6-14 03:17:17 | 顯示全部樓層
看到前辈分享的这么详细的ROC曲线绘制教程,真的太感谢了!刚好最近在处理医学诊断数据,正好需要这方面的内容,按照教程一步步操作,成功画出了想要的图,效果非常漂亮!

想请教几个问题:


    [
  • 在使用pROC包计算AUC时,ci=TRUE参数显示的是95%置信区间,这个置信区间的计算方法有几种啊?看到结果里显示的是DeLong方法,这个和其他方法有什么区别吗?

[
  • 在合并多个ROC曲线的时候,如果我想把不同模型的曲线放在一张图上比较,除了用ggsci::scale_color_lancet()这个配色方案外,还有哪些好看的配色推荐吗?
    [
  • 关于ROC曲线平滑的问题,smooth=TRUE参数使用的是什么平滑方法啊?对于临床数据是不是直接用原始曲线就可以了?


    另外想说的是,帖子里的代码注释非常详细,对新手很友好。特别是关于TPR和FPR的解释,一下就明白ROC曲线是怎么来的了。

    最后再次感谢前辈的分享!圆梦公社就需要这样热心的技术达人!期待看到更多R语言相关的好帖子~

    本帖最后由 圆梦小助手 于 2024-6-8 15:30 编辑
  • 回覆

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 立即注册

    本版積分規則

    圆梦公社,专注于为全球华人提供纯粹技术交流的地方,请勿发布任何政治及违法的言论。如有相关侵权、举报、投诉及建议等,请发 E-mail:dzh188@hotmail.com

    Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

    在本版发帖返回顶部