进阶版ROC曲线来了!教你优雅地给ROC“添油加醋”!你一定会爱上!(附代码)

R语言绘图之ROC曲线进阶版

大家好,我是阿琛。在上一期的内容中,从SPSS和R软件出发,我给大家介绍了ROC曲线的简单绘制方法(临床生信SCI加分必备!ROC可视化教程看这篇就够了!你一定要试试!)。今天我们一起来看看如何将得到的ROC曲线进行美化,以及更进一步衍生。

下面,我们一起来看下ROC曲线各种进阶版本的绘制方法。

R包的安装与引用

首先,自然是R包的安装与引用过程。特定的分析功能,需要相应的程序包来实现。在上周的内容中,我们给大家介绍了ROCR包的使用方法。在此,我们以pROC包为例,给大家讲解一下整个的绘制过程。
#install.packages('pROC')library(pROC)

数据的整理与载入

rt <- read.table('exp.txt', header=T,sep='  ', check.names=F, row.names=1)head(rt)   #查看数据集前6行内容
可以发现,该数据集包含病人名称(ID),组织类型(Type),以及两个不同的基因表达水平(VCAN和TP53)等变量内容。
str(rt) #查看变量相关信息
同时,使用str()函数,提示数据集中一共有407例样本,其中32例为正常样品,375例为肿瘤样品。本次分析的目的是为了探究VCAN和TP53基因对区分患者正常和肿瘤的能力,并比较两者之间是否存在差异。

构建ROC预测模型

随后,利用roc()函数,分别构建两个不同的预测模型。
ROC1 <- roc(rt$Type, rt$VCAN,           levels = c('Normal', 'Tumor'))ROC2 <- roc(rt$Type, rt$TP53,           levels = c('Normal', 'Tumor'))ROC1   #查看模型的预测效能ROC2   #查看模型的预测效能
结果显示,对于预测375例肿瘤组织和32例正常样品,VCAN和TP53基因的ROC曲线下面积分别为0.8535和0.7582。
▲ ROC1的分析结果展示
▲ ROC2的分析结果展示

绘制ROC曲线

1、绘制ROC曲线及平滑拟合

#绘制ROC曲线plot(ROC1, col = 'red', #设置曲线颜色 legacy.axes = TRUE, #使x轴变为1-Specificity xlab = '1-Specificity')
首先,我们先通过plot()函数,将ROC曲线的最简图形绘制出来。
#拟合平滑的ROC曲线plot(smooth(ROC1, method='density'),   #使用smooth()函数进行平滑拟合    add = FALSE,   #不添加到上一个图层    col = 'red',   #设置曲线颜色    legacy.axes = TRUE,   #使x轴变为1-Specificity    xlab = '1-Specificity')
柔美的线条总是更具优势,也符合大家的审美需求。通过smooth()函数,对上图中的曲线进行简单的拟合,从而得到了一个新的ROC曲线。
2、添加可信区间

plot(ROC1)ROC3 <- ci.sp(ROC1, sensitivities = seq(0, 1, 0.01), #评估CI的敏感性 boot.n = 2000) #重复计算次数,默认为2000次plot(ROC3, add = FALSE, #不添加到上一个图层 type = 'shape', #置信区间的类型 col = 'red')
接着,基于ci.sp()函数,通过2000次重复计算,对预测模型进行不断的拟合,最终得到ROC曲线在不同取值时所对应的95%可信区间。
3、添加AUC,阈值等参数

plot(ROC1,    add = FALSE,   #不添加至上一图层    col = 'red',   #设置曲线颜色    legacy.axes = TRUE,   #使x轴变为1-Specificity    xlab = '1-Specificity',    print.auc =TRUE,    print.auc.x = 0.5,   #输出auc值的x轴位置    print.auc.y = 0.5,   #输出auc值的y轴位置    print.thres = TRUE)
结果显示,在VCAN表达预测患者正常和肿瘤组织时,取其表达量为5.835时为最佳的截断值(cut-off value),且其特异性为0.938,灵敏性为0.739。
4、绘制两条曲线并比较p值

#绘制2条ROC曲线plot(ROC1, col = 'red', #设置曲线颜色 legacy.axes = TRUE, #使x轴变为1-Specificity xlab = '1-Specificity')plot(ROC2, add = TRUE, #添加至上一图层 col = 'blue', #设置曲线颜色 legacy.axes = TRUE, #使x轴变为1-Specificity xlab = '1-Specificity')legend(0.2, 0.2, lwd = 2, legend = c('VCAN', 'TP53'), col = c('red', 'blue'))
与之前介绍的内容一样,通过将add参数的值修改为TRUE,即可将两个曲线显示哥同一个图层中,其中红色和蓝色曲线分别代表VCAN和TP53两个基因。
#比较并添加p值test <- roc.test(ROC1, ROC2)   #对两条ROC曲线进行比较text(0.6, 0.2,   #设置坐标轴位置    adj = c(0, 0.5),    labels = paste0('P value =', format.pval(test$p.value)))   #添加p值
对两条曲线进行比较,结果显示,P = 0.00875 <0.05,即两条曲线之间存在显著性差异,说明VCAN的预测效能显著高于TP53基因,结果图如下图所示。

终极版本

plot(ROC1, add = FALSE, #不添加至上一图层 col = 'red', #设置曲线颜色 legacy.axes = TRUE, #使x轴变为1-Specificity xlab = '1-Specificity', main = 'ROC Curve for VCAN', #添加标题 print.auc =TRUE, auc.polygon = TRUE, #将auc曲线下面积转换为多边形 auc.polygon.col = '#fff7f7', #设置多边形的填充色 grid = c(0.5, 0.2), #设置两轴网格线的间隔为0.5,0.2 grid.col = c('black', 'black'), #设置两轴网格线的颜色 print.thres = TRUE)legend(0.25, 0.2, #设置位置的x轴和y轴坐标 lwd = 2, legend = 'VCAN', col = 'red') #颜色与ROC曲线的颜色一致
除了讲解提到的添加,在plot()函数中还有许多参数可供大家进行修改。在此,我们将前面的内容进行综合,并增加了一些其他相关图形美化的参数,得到了最终版本的ROC曲线。
回顾一下,在上一期ROC内容的基础上,我们通过pROC包为演示,展示了曲线平滑化,cut-off值的添加,两条ROC曲线比较等内容。好啦,本次的讲解就到此为止了,大家多多练习,掌握该项绘图技能~~~
—END—
(0)

相关推荐