R语言|R语言基于ggplot绘制多条ROC曲线(2)

ROC曲线也叫受试者工作曲线,原来用在军事雷达中,后面广泛应用于医学统计中。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。ROC曲线主要应用于二分类结局,比如是否死亡,疾病诊断,肿瘤复发等等,可以用于自变量为连续变量的截点判定。
R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

既往我们已经介绍了R语言基于ggplot和pROC包绘制多条ROC曲线,但是在我们实际绘制操作中还是有许多对于细节的调整,比如我们在论文中需要对两个预测模型进行比较需要制作出一个类似上图这样的ROC曲线,今天继续聊聊ggplot制作ROC曲线的一些细节操作。
假设我们有一个数据,我们已经做出来了两个模型,一个是机器学习的xgboost模型,一个是Logisti回归模型我们想比较一下这两模型的ROC曲线并绘图。
先导入R包

library(pROC) library(ggplot2)

得出预测数据后,机器学习的模型的ROC为
xgboost_roc <- roc(bc$placenta.accreta,as.numeric(pre_xgb))

Logisti回归模型的ROC为
roc1<-roc(as.ordered(bc$placenta.accreta) ,as.ordered(bc$pre))

我们先可以使用混淆矩阵比较两个模型的准确率
table(bc$placenta.accreta,pre_xgb,dnn=c("真实值","预测值"))

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

confusionMatrix(bc$placenta.accreta,pre)#使用混淆矩阵进行分类

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

这样两个模型的准确率比较就算出来了,数据可以放到论文中,我们现在可以使用得到ROC绘图,我们可以要把两个ROC放在list中绘图
这里xgboost=xgboost_roc中,xgboost将成为图例的名字,可以自己取
ggroc(list(xgboost=xgboost_roc, Logistic=roc1))

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

这个图有几个问题X轴刻度是1-0,我们需要的是0-1,x轴标题需要改成1-特异度,需要添加对角线,图例需要放进图中,我们一步步来修改
更改X轴的刻度,更改线条大小
ggroc(list(xgboost=xgboost_roc, Logistic=roc1),legacy.axes = TRUE,size = 1)

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

添加对角线和采用空白背景
g2 <- ggroc(list(xgboost=xgboost_roc, Logistic=roc1),legacy.axes = TRUE,size = 1) g2+annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1,color = "blue",size=1)+ theme_minimal()+theme_bw()

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

如果想在0点位置相交
g2+annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1,color = "blue",size=1)+ theme_minimal()+theme_bw()+ scale_y_continuous(expand = c(0, 0))+scale_x_continuous(expand = c(0, 0))

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

我这图0点相交对于不好看,我就不这样弄了,可以自定义曲线的颜色
g2+annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1,color = "blue",size=1)+ theme_minimal()+theme_bw()+ scale_colour_manual(values=c("green", "yellow"))

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

修改X轴和Y轴标题
g2+annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1,color = "blue",size=1)+ theme_minimal()+theme_bw()+ xlab("1-特异度")+ ylab("灵敏度")

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

修改图例位置
g2+annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1,color = "blue",size=1)+ theme_minimal()+theme_bw()+ xlab("1-特异度")+ ylab("灵敏度")+ theme(legend.position = c(.8,.2), legend.key.width = unit(2,"cm"),panel.grid.major = element_blank(), panel.grid.minor = element_blank())

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

更改图例标题
g2+annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1,color = "blue",size=1)+ theme_minimal()+theme_bw()+ xlab("1-特异度")+ ylab("灵敏度")+ theme(legend.position = c(.8,.2), legend.key.width = unit(2,"cm"),panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ guides(color=guide_legend(title = "预测模型"))

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

加上AUC值
g2+annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1,color = "blue",size=1)+ theme_minimal()+theme_bw()+ xlab("1-特异度")+ ylab("灵敏度")+ theme(legend.position = c(.8,.2), legend.key.width = unit(2,"cm"),panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ guides(color=guide_legend(title = "预测模型"))+ annotate("text", x=0.2, y=0.88, label="AUC = 0.92",size=5)+ annotate("text", x=0.5, y=0.7, label="AUC = 0.67",size=5)

R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

这样基本就算做好了,最后对两个auc进行比较,比较的结果也要附在论文中
roc.test(xgboost_roc,roc1)

【R语言|R语言基于ggplot绘制多条ROC曲线(2)】R语言|R语言基于ggplot绘制多条ROC曲线(2)
文章图片

    推荐阅读