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 = se q(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曲线比较等内容。好啦,本次的讲解就到此为止了,大家多多练习,掌握该项绘图技能~~~
|