R语言pROC与ggplot2绘制高质量ROC曲线及AUC可视化

桃夭
桃夭
发布时间:2026-10-15 | 2人浏览过
原创

本文演示如何在R语言中利用 pROC 包结合 ggplot2 绘制高质量的ROC曲线。文章涵盖从基础理论(TPR/FPR)到实战代码的全流程,包括批量计算AUC及其95%置信区间(CI),生成平滑与非平滑曲线,并使用 cowplot 和 ggsci 将多个模型的ROC结果整合为专业的组合图表。

什么是ROC曲线与AUC

ROC曲线(受试者工作特征曲线)是评估分类模型性能的重要工具,广泛应用于医学诊断和机器学习领域。其核心逻辑如下:

  • 坐标轴定义:横坐标为假阳性率(FPR),纵坐标为真阳性率(TPR)。
  • 计算公式:TPR = TP / (TP + FN),FPR = FP / (FP + TN)。其中TP为真阳性,FN为假阴性,FP为假阳性,TN为真阴性。
  • AUC值:即ROC曲线下的面积。一般认为AUC在0.7~1之间表示模型具有较好的预测有效性,AUC越接近1,模型区分能力越强。

假设一个示例场景,当截断值(cutoff)设为0.5时:

  • TPR = 5 / (5 + 0) = 1
  • FPR = 2 / (2 + 3) = 0.4
  • 预测准确性 = (TP + TN) / 总样本数 = (5 + 3) / 10 = 0.8

准备条件与数据读取

第1步:安装并加载必要的R包

操作目的:确保环境已安装数据处理、ROC分析及绘图所需的依赖库。

请在R控制台执行以下安装命令(若未安装):

install.packages(c("openxlsx", "pROC", "ggplot2", "cowplot", "ggsci"))

加载库:

library(openxlsx)
library(pROC)
library(ggplot2)
library(cowplot)
library(ggsci)

第2步:读取输入数据

操作入口:RStudio控制台或脚本编辑器。

动作:使用 read.xlsx 读取包含特征列(如a, b, c)和结果列(outcome)的数据表。假设文件名为 ROC曲线.xlsx。

ROC <- read.xlsx("ROC曲线.xlsx")

注意:确保数据中结果变量(outcome)的分类水平顺序正确,通常需通过 levels() 指定参考组(group1)和测试组(group2),以保证方向正确。

AUC计算与ROC曲线分析

第3步:计算单组与平滑ROC结果

目的:获取AUC值、95%置信区间,并生成用于绘图的平滑曲线对象。

在pROC中,可使用公式接口一次性对多列进行ROC分析。关键参数说明:

  • aur=TRUE:显示AUC估计值。
  • ci=TRUE:计算并显示95%置信区间(默认使用DeLong方法)。
  • smooth=TRUE:启用平滑处理,使曲线更连续美观。
  • levels=c('group1','group2'):指定因子水平的顺序,确保分母正确。
  • direction=">":指定预测值越大,属于阳性组的可能性越高(反之可选 "<")。

代码示例:

# 非平滑ROC(阶梯状)
res <- roc(outcome ~ a + b + c, data = ROC, aur = TRUE, ci = TRUE,
           levels = c('group1', 'group2'), direction = ">")

# 平滑ROC(用于绘图优化)
smooth <- roc(outcome ~ a + b + c, data = ROC, aur = TRUE, ci = TRUE,
              smooth = TRUE,
              levels = c('group1', 'group2'), direction = ">")

查看结果(以非平滑为例):

res
Call:
roc.formula(formula = outcome ~ a, data = ROC, aur = TRUE, ci = TRUE, levels = c("group1", "group2"), direction = ">")
Data: a in 40 controls (outcome group1) > 32 cases (outcome group2).
Area under the curve: 0.7328
95% CI: 0.6171-0.8485 (DeLong)

该输出显示了各变量的AUC估算值及其置信区间下限和上限。

基于ggplot2的美化绘图

第4步:绘制单个ROC曲线

目的:使用 ggplot2 扩展 ggroc 函数,添加参考线、主题背景和标题。

重要参数:legacy.axes = TRUE 将X轴从默认的 (1-FPR) 改为标准的 FPR (0到1),符合学术出版习惯。

# 变量a的ROC图
pa <- ggroc(smooth$a, legacy.axes = TRUE) +
  geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), color = "darkgrey", linetype = 4) +
  theme_bw() +
  ggtitle('a-ROC')

# 变量b和c同理...
pb <- ggroc(smooth$b, legacy.axes = TRUE) +
  geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), color = "darkgrey", linetype = 4) +
  theme_bw() +
  ggtitle('b-ROC')

pc <- ggroc(smooth$c, legacy.axes = TRUE) +
  geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), color = "darkgrey", linetype = 4) +
  theme_bw() +
  ggtitle('c-ROC')

第5步:合并并美化多组ROC曲线

目的:将多个模型的ROC曲线叠加在同一图中,并标注AUC值,便于直接比较。

步骤:

  1. 调用 ggroc(smooth) 绘制所有平滑曲线。
  2. 使用 ggsci::scale_color_lancet() 应用好看的配色方案(也可替换为其他 ggsci 调色板)。
  3. 使用 annotate("text", ...) 在图上手动添加AUC数值标签,定位需根据实际坐标系调整x,y参数。
  4. 添加对角参考线表示随机猜测水平。

完整代码:

ggroc(smooth, legacy.axes = TRUE) +
  geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), color = "darkgrey", linetype = 4) +
  theme_bw() +
  ggtitle('Comparison of ROC Curves') +
  ggsci::scale_color_lancet() +
  annotate("text", x = 0.75, y = 0.125, label = paste("a-AUC = ", round(res$a$auc, 3))) +
  annotate("text", x = 0.75, y = 0.25, label = paste("b-AUC = ", round(res$b$auc, 3))) +
  annotate("text", x = 0.75, y = 0.375, label = paste("c-AUC = ", round(res$c$auc, 3)))

完成判断与注意事项

成功完成的标准:

  • 控制台无错误报错,顺利输出AUC及CI数值。
  • 图形窗口或文件中生成清晰的ROC曲线,包含对角线参考线及AUC标注。
  • 多组曲线颜色分明,图例清晰可辨。

常见排错:

  • 分组方向错误:若发现AUC远小于0.5且置信区间不包含0.5,可能是 levels 顺序颠倒或 direction 设置不符数据分布。可尝试改为 direction="<" 或交换 levels 向量。
  • 平滑失败:若数据点过少或存在重复值,平滑算法可能无法收敛。此时可使用非平滑结果 res 绘图,或使用 str(smooth) 检查对象结构。
  • 坐标轴反转:务必确认 legacy.axes=TRUE,否则X轴将从1递减至0,不符合常规阅读习惯。

以上就是利用R语言pROC与ggplot2绘制高质量ROC曲线及AUC可视化的详细内容,更多关于R语言统计分析、ROC曲线解读及ggplot2高级绘图技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表