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
相关产品推荐
相关产品推荐

