在R中用pROC包绘制3条ROC曲线仅显示两条的问题
问题分析
你的代码里,obese变量完全由weight的排序生成,和weight1没有任何关联。用weight1拟合的逻辑回归模型(glm.fit1)预测能力极差,对应的ROC曲线和代表随机猜测的对角线重合,所以视觉上只看到两条曲线。另外,原代码里的lines()调用是绘制模型拟合值的曲线,和ROC曲线绘制无关,会干扰ROC图的显示。
修正方案
- 调整数据生成逻辑,让
weight1和obese建立关联 - 调整ROC曲线的AUC标注位置,避免重叠
- 移除无关的
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
相关产品推荐
相关产品推荐

