You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言绘制ROC曲线置信区间 调整X轴为1-特异度异常求解

ROC曲线置信区间显示异常的排查与修正

异常原因

置信区间错位、显示异常由三个代码逻辑错误导致:

  • X轴值未做对应转换:开启legacy.axes=TRUE时ggroc使用的X轴为1-特异度(假阳性率,范围0~1),但提取置信区间时直接将原始特异度作为x值映射,和坐标轴刻度完全不匹配。
  • 循环索引越界:roc.list仅包含Logistic回归、随机森林2个模型对象,循环硬编码为1:3会读取不存在的空数据,生成异常的错位图层。
  • 参考线参数错误:X轴切换为0~1范围的1-特异度后,随机猜测的参考线应为y=x,原代码截距设为1,位置完全错误。

修正后可直接运行的代码

library(pROC)
library(ggplot2)

# 拟合两个模型的ROC对象
roc.list <- roc(test_df$extry ~ Logistic_Regression + Random_Forest)

# 计算敏感度的置信区间,将序列密度调高让置信带更平滑
ci.list <- lapply(roc.list, ci.se, specificities = seq(0, 1, l = 100))

# 转换置信区间数据:将原始特异度转换为1-特异度匹配X轴
dat.ci.list <- lapply(ci.list, function(ciobj) 
  data.frame(
    x = 1 - as.numeric(rownames(ciobj)),
    lower = ciobj[, 1],
    upper = ciobj[, 3]
  ))

# 初始化ROC底图
p <- ggroc(roc.list, legacy.axes = TRUE) + 
  theme_minimal() + 
  # 修正参考线为y=x
  geom_abline(slope=1, intercept = 0, linetype = "dashed", alpha=0.7, color = "grey") + 
  coord_equal() +
  labs(x = "1-特异度(假阳性率)", y = "敏感度(真阳性率)")

# 按实际模型数量循环添加置信带,避免硬编码索引越界
for(i in seq_along(roc.list)) {
  p <- p + geom_ribbon(
    data = dat.ci.list[[i]],
    aes(x = x, ymin = lower, ymax = upper),
    fill = i + 1,
    alpha = 0.2,
    inherit.aes = FALSE
  ) 
} 

p

可选优化

  • 若需要自定义模型配色,可添加scale_color_manual、scale_fill_manual层统一指定线条和置信带的颜色,避免默认自动取色导致的颜色不匹配。
  • 若需要调整置信带平滑度,可修改seq(0,1,l=100)中的数值,数值越大置信带边缘越顺滑。

内容的提问来源于stack exchange,提问作者lola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:30:48