在科研分析时,常使用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")

r语言栅格数据处理 r语言egarch_ci

a <- roc(aSAH$outcome, aSAH$s100b)

使用str函数,简单查看函数结果输出中所包含的内容

str(a)

r语言栅格数据处理 r语言egarch_数据_02


为了提高绘图灵活性,我们从roc()的结果中提取出绘制ROC图像所需的灵敏度、特异度原始值:

分别保存1-特异度与灵敏度,根据roc函数计算结果,可能同时存在多个相同的灵敏度/特异度,因此需要对横坐标排序,否则画图会很奇怪

df <- tibble(x = 1-a$specificities,  
       y = a$sensitivities) %>% 
  ## 根据roc函数计算结果,可能同时存在多个相同的灵敏度/特异度,因此需要对横坐标排序,否则画图会很奇怪
  arrange(x, y)

r语言栅格数据处理 r语言egarch_ci_03


提前设定绘图风格

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)

r语言栅格数据处理 r语言egarch_数据_04


基于geom_line绘制roc折线

p + 
  geom_line(aes(x = x, y = y), size = 1.1, data = df)

r语言栅格数据处理 r语言egarch_ci_05


基于ggalt包的geom_xspline绘制相对平滑的roc曲线

p +
  geom_xspline(aes(x = x, y = y), size = 1.1, spline_shape = 0.9, data = df)

r语言栅格数据处理 r语言egarch_ci_06


以上作图仅针对一条ROC曲线的绘制,若需同时绘制多条ROC曲线,则可将其对应的roc()函数输出的灵敏度与特异度,整理至同一个数据框中,调用ggplot的参数进行分组、分面等操作,即从最底层开始自定义绘图。此时图像的绘制具有较高的灵活性,可满足大多数科研人员对图像的个性化修改。

实际上,不仅仅是roc()函数,时间相依ROC、评价诊断试验的校准曲线等图像,均可尝试从已经封装好的函数输出中提取实际绘图所需的数据,从而实现科研绘图的个性化修改。