查看原文
其他

超详细的ROC曲线绘制教程(5000余字),真正的保姆级教程

段湘杰 R语言统计与绘图 2023-01-01

ROC曲线是临床中常用的统计分析之一,R中可以绘制ROC曲线的包也有很多,pROC包就是其中的佼佼者。

pROC包可以计算AUC和95%置信区间,可以可视化、平滑和比较ROC曲线。下面是pROC包中的常用缩写:

缩写解释
ROC曲线受试者操作特征曲线
AUCROC曲线下面积
pAUC部分ROC曲线下面积
CI置信区间
SP特异度specificity
SE灵敏度sensitivity

今天来学习下怎么使用pROC包来绘制多条ROC曲线。

1. 加载数据

使用pROC包自带的aSAH数据集来演示。该数据集包括了113例动脉瘤蛛网膜下腔出血患者的临床和实验室资料。

library(pROC) # 加载pROC包
data(aSAH)   # 加载内置数据集
head(aSAH)   # 查看数据集

2. 拟合曲线

在pROC包中,使用roc()来建立ROC对象。默认情况下roc()会输出AUC的值。

roc1 <- roc(aSAH$outcome, aSAH$s100b,
levels=c("Good", "Poor"))
roc2 <- roc(aSAH$outcome, aSAH$ndka,
levels=c("Good", "Poor"))
roc1; roc2

3. 绘制多条ROC曲线

使用plot()来绘制ROC曲线,可以使用很多参数来调整ROC曲线外观。

# 先绘制1条ROC曲线
plot(roc1, 
     print.auc=TRUE# 图像上输出AUC的值
     print.auc.x=0.4, print.auc.y=0.5# 设置AUC值坐标为(x,y)
     auc.polygon=TRUE# 将ROC曲线下面积转化为多边形
     auc.polygon.col="#fff7f7",  # 设置ROC曲线下填充色
     grid=c(0.50.2), # 设置两轴网格线的间隔为0.5,0.2
     grid.col=c("black""black"),  # 设置两轴间隔线条的颜色
     print.thres=TRUE# 图像上输出最佳截断值
     main="Comparison of two ROC curves",  # 添加图形标题
     col="#FF2E63",    # 设置ROC曲线颜色
     legacy.axes=TRUE)   # 使x轴从0到1,表示为1-特异度
# 再添加1条ROC曲线
plot.roc(roc2,
         add=TRUE# 增加曲线
         col="#252A34"# 设置ROC曲线颜色
         print.thres=TRUE# 图像上输出最佳截断值
         print.auc=TRUE,   # 图像上输出AUC
         print.auc.x=0.4,print.auc.y=0.4# AUC的坐标为(x,y)
# 两曲线比较并添加p值
testp <- roc.test(roc1,roc2)   # 检验两条曲线
text(0.40.2,  # 设置添加p值的位置(x,y)
     labels=paste("P value =", format.pval(testp$p.value)), 
     adj=c(00.5)) # 在图上添加P值
# 添加图例
legend(0.350.20,  # 图例位置x,y
       bty = "n",   # 图例样式
       legend=c("roc1","roc2"),  # 添加分组
       col=c("#FF2E63","#252A34"),  # 颜色跟前面一致
       lwd=2)  # 线条粗细

4. plot()解释

plot()是用来绘制ROC曲线的,函数中的许多参数可以调整ROC曲线外观。

函数调用方法:

plot.roc(x, add=FALSE,  reuse.auc=TRUE
         axes=TRUE,  legacy.axes=FALSE...

## 参数解释
x  # 通过roc()构建的ROC对象,如上面的roc1。
add  # 逻辑词;如为TRUE,则ROC曲线将添加到现有图形中;
#  为FALSE(默认),则创建一个新的ROC曲线图形
axes # 逻辑词;是否绘制X,Y轴,默认为TRUE。
legacy.axes  # 逻辑词;为TRUE,则x轴为“1-specificity”;
# 为FALSE,则x轴表示为“specificity”

4.1 调整坐标轴

绘图用的通用参数,仅在add= FALSE时使用。

xlim、ylim # 指定x轴、y轴范围最大值 
# 使用示例
# xlim=c(100, 0) 或 c(1, 0) 
# ylim=c(0, 100) 或 c(0, 1) 

xlab、ylab # 指定x轴、y轴标签
# 若legacy.axes为TRUE,则 xlab="100-Specificity(%)" 或 "1-Specificity"
# 若legacy.axes为FALSE,则 xlab="Specificity(%)" 或 "Specificity"
# ylab = "Sensitivity (%)" 或 "Sensitivity"

asp # 一个数值,图形中Y轴与X轴的比值,一般为1。 
mar # 以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英分。
# 如 mar = c(4, 4, 2, 2) + 0.1
mgp # 坐标轴与ROC曲线图的距离,如 mgp=c(2.5, 1, 0)

4.2 ROC曲线颜色、线型和线宽

只能用于来设置ROC曲线的颜色、线型、线宽,也就是图上的那根曲线。

col, lty, lwd # 曲线的颜色、线型和线宽

# 使用示例:
# col=par("col")
# lty=par("lty")
# lwd=2

4.3 对角参考线颜色、线型和线宽

参考线也就是对角线(45°那根线),仅在add= FALSE时使用。

identity # 逻辑词;是否显示参考线;
identity.col, identity.lty, identity.lwd
# 参考线的颜色、线型和线宽
# 仅在 identity = TRUE 时生效。

# 使用示例:
# identity.col="darkgrey"
# identity.lty=1
# identity.lwd=1

4.4 ROC曲线的阈值

print.thres # 是否在ROC曲线上显示阈值;
# FALSE、NULL或"no":表示在图上不显示阈值
# TRUE或"best":在图上显示约等指数最大时的阈值(可能不止1个阈值)
# "all":在ROC曲线上显示所有的点
# "local maximas":所有的local maximas
# 数字向量:直接指定要显示的阈值
# 请注意:平滑ROC曲线仅支持"best"参数
print.thres.pch  # 阈值点的绘图符号
print.thres.adj  # 阈值文本字符的位置调整
print.thres.col  # 阈值文本数字的颜色
print.thres.cex  # 阈值文本数字的字符缩放倍数 
print.thres.pattern # 阈值的文本模式,为sprintf格式。
# 三个数字传递给sprintf:阈值、特异度和灵敏度。
print.thres.pattern.cex = print.thres.cex 

4.5 AUC数值文本的位置、颜色和大小

print.auc # 逻辑词;是否在图上显示AUC的值
print.auc.pattern=NULL # AUC的文本模式,为sprintf格式
print.auc.x,  print.auc.y  # 图示AUC的坐标位置
print.auc.adj # AUC数字的文本调整 
print.auc.col # 调整AUC的颜色
print.auc.cex # 调整AUC的缩放倍数

4.6 调整背景网格线

grid=FALSE# 如为逻辑词,则表示是否在图上显示背景网格线;
# 如为数字向量,则表示显示网格线的间隔宽度;
# 数字向量长度为1,则表示垂直和水平网格线间隔宽度相同;
# 数字向量长度为2,如c(0.2,0.5),则分别指定垂直和水平网格线的间隔宽度。
# 请注意:如果grid显示的数字向量,这些值是用来计算grid.v和grid.h的;
# 如果指定了grid.v和grid.h的值,则grid会被忽略。
grid.v,grid.h # 数字;指定绘制垂直网格线和水平网格线间隔的值;
# 如果grid = FALSE,则为NULL。
grid.lty # 网格线线型,如grid.lty=3
grid.lwd # 网格线宽度,如grid.lwd=1
grid.col # 网格线颜色,如grid.col="#DDDDDD"
# 线型、颜色和宽度可以输入长度为2的向量,则分别指定垂直(第1个数字)和水平网格线。

4.7 将AUC面积转化为多边形

auc.polygon  # 逻辑词;是否将曲线下面积转化为多边形;
auc.polygon.col  # 填充多边形的颜色;
auc.polygon.lty  # 多边形边框的线型
auc.polygon.density  # 阴影线的密度,默认为NULL,表示不绘制阴影线;
# 为0则表示既没有阴影也没有填充,而负值和NA则表示抑制阴影,可以填充颜色;
# 如果为正值,则会显示阴影线的颜色。
auc.polygon.angle # 输入数值,表示阴影线的角度
auc.polygon.border # 设置多边形边框的颜色,默认为NULL;为NA则可以省略边框。

4.8 将背景四边形转化为四边形

max.auc.polygon  # 逻辑词;是否将背景四边形转化为四边形
max.auc.polygon.col="#EEEEEE"  # 填充四边形的颜色; 
max.auc.polygon.lty=par("lty"# 四边形边框的线型
max.auc.polygon.density=NULL# 阴影线的密度,默认不绘制阴影线;
# 为0则表示既没有阴影也没有填充,而负值和NA则表示抑制阴影,可以填充颜色;
# 如果为正值,则会显示阴影线的颜色。
max.auc.polygon.angle=45 # 输入数值,表示阴影线的角度
max.auc.polygon.border=NULL # 设置多边形边框的颜色,默认为NULL;
# 为NA则可以省略边框。

4.9 ROC曲线的置信区间

ci # 逻辑词;是否在ROC曲线上绘制置信区间
ci.type # CI的类型,有"no"、"bars"和"shape"两种,可以缩写为"b"或"s"。
# "shape"形状只用于ci.se和ci.sp,不用于ci.thresholds。
ci.col # 当CI类型为bars时,通过此参数设置CI的颜色。

pROC包是目前功能最全面的ROC曲线专业绘制包,可以多探索探索。

其他pROC包的教程:

基于R语言的多指标联合预测ROC曲线分析

R语言统计与绘图:基于ggplot2绘制ROC曲线

R语言统计与绘图:ROC曲线的统计计算

R语言统计与绘图:可视化ROC曲线的置信区间

R语言统计与绘图:绘制平滑ROC曲线

参考资料
1.pROC包帮助文件

《完》


关注下方公众号,分享更多更好玩的R语言知识。

如果需要进群,请在公众号菜单栏处添加作者微信,邀请入群,请记得附上备注,谢谢

点个在看,SCI马上发表。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存