在科研分析时,常使用ROC曲线评价诊断试验效果,对应使用R软件pROC包中的roc()函数计算AUC值及置信区间等信息,同时使用ggroc()函数在ggplot框架下进行可视化。虽然ggroc()兼容ggplot()语法,但在使用ggroc()时,实际上需使用roc()函数的分析结果整体作为参数进行绘图。若想在同一张图上添加其他图层、修改默认ggroc()默认输出图形等可能存在困难。例如,可能在图层叠加时出现“Can’t add ggroc(roc_yh)
to a ggplot object”的报错。因此,我们推荐一种灵活性较高的ROC图像绘制方法。
加载所需R包
library(pROC)
library(tidyverse)
library(ggalt)
基于pROC包的示例数据aSAH,计算roc
data("aSAH")
a <- roc(aSAH$outcome, aSAH$s100b)
使用str函数,简单查看函数结果输出中所包含的内容
str(a)
为了提高绘图灵活性,我们从roc()的结果中提取出绘制ROC图像所需的灵敏度、特异度原始值:
分别保存1-特异度与灵敏度,根据roc函数计算结果,可能同时存在多个相同的灵敏度/特异度,因此需要对横坐标排序,否则画图会很奇怪
df <- tibble(x = 1-a$specificities,
y = a$sensitivities) %>%
## 根据roc函数计算结果,可能同时存在多个相同的灵敏度/特异度,因此需要对横坐标排序,否则画图会很奇怪
arrange(x, y)
提前设定绘图风格
p <- ggplot() +
geom_line(aes(x = c(0, 1), y = c(0, 1)), color = "gray20") +
xlab("1-Specificity") +
ylab("Sensitivity") +
theme_classic() +
theme(axis.text.x = element_text(size = 15),
axis.text.y = element_text(size = 15),
axis.title.x = element_text(size = 18),
axis.title.y = element_text(size = 18),
text = element_text(family = windowsFont("serif"))) +
annotate("text", x = 0.6, y = 0.2, label = "AUC: 73.14%", size = 8, family = windowsFont("serif"))
此时,可以使用灵敏度、特异度的原始数据点,在ggplot框架下,采用geom函数进行自定义绘图,例如:
基于geom_step绘制传统roc阶梯线
p +
geom_step(aes(x = x, y = y), size = 1.1, data = df)
基于geom_line绘制roc折线
p +
geom_line(aes(x = x, y = y), size = 1.1, data = df)
基于ggalt包的geom_xspline绘制相对平滑的roc曲线
p +
geom_xspline(aes(x = x, y = y), size = 1.1, spline_shape = 0.9, data = df)
以上作图仅针对一条ROC曲线的绘制,若需同时绘制多条ROC曲线,则可将其对应的roc()函数输出的灵敏度与特异度,整理至同一个数据框中,调用ggplot的参数进行分组、分面等操作,即从最底层开始自定义绘图。此时图像的绘制具有较高的灵活性,可满足大多数科研人员对图像的个性化修改。
实际上,不仅仅是roc()函数,时间相依ROC、评价诊断试验的校准曲线等图像,均可尝试从已经封装好的函数输出中提取实际绘图所需的数据,从而实现科研绘图的个性化修改。