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

在R中用pROC包绘制3条ROC曲线仅显示两条的问题

问题分析

你的代码里,obese变量完全由weight的排序生成,和weight1没有任何关联。用weight1拟合的逻辑回归模型(glm.fit1)预测能力极差,对应的ROC曲线和代表随机猜测的对角线重合,所以视觉上只看到两条曲线。另外,原代码里的lines()调用是绘制模型拟合值的曲线,和ROC曲线绘制无关,会干扰ROC图的显示。

修正方案
  1. 调整数据生成逻辑,让weight1和obese建立关联
  2. 调整ROC曲线的AUC标注位置,避免重叠
  3. 移除无关的lines()代码

修正后的完整代码:

library(pROC)
library(randomForest)
set.seed(420)
num.samples <- 100

# 让weight1随obese取值变化,建立关联
weight <- sort(rnorm(n=num.samples, mean=172, sd=29))
obese <- ifelse(test=(runif(n=num.samples) < (rank(weight)/num.samples)), 
                yes=1, no=0)
weight1 <- sort(rnorm(n=num.samples, mean=112 + 50*obese, sd=11))

# 拟合三个模型
glm.fit <- glm(obese ~ weight, family=binomial)
glm.fit1 <- glm(obese ~ weight1, family=binomial)
rf.model <- randomForest(factor(obese) ~ weight)

# 绘制第一条ROC曲线作为基础图
roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE, 
    xlab="假阳性百分比", ylab="真阳性百分比", col="#377eb8", lwd=4, print.auc=TRUE) 
# 添加随机森林的ROC曲线,调整AUC标注位置
plot.roc(obese, rf.model$votes[,1], percent=TRUE, col="#4daf4a", lwd=4, 
         print.auc=TRUE, add=TRUE, print.auc.y=40)
# 添加基于weight1的逻辑回归ROC曲线,再次调整AUC标注位置避免重叠
plot.roc(obese, glm.fit1$fitted.values, percent=TRUE, col="#b237b8", lwd=4, 
         print.auc=TRUE, add=TRUE, print.auc.y=20)

# 添加图例
legend("bottomright", legend=c("逻辑回归", "随机森林","基于weight1的逻辑回归"), 
       col=c("#377eb8", "#4daf4a","#b237b8"), lwd=4)
额外说明

如果不想修改数据,也可以在第三条plot.roc里添加identity=TRUE参数,强制显示对角线,就能看到第三条曲线其实就是随机猜测的基准线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:06:45