从逻辑回归生成ROC曲线及分析的操作疑问求助
你的ROC曲线绘制问题分析与修正方案
现有代码的核心问题
- 真实标签与预测概率对应关系错乱:你排序了
predicted.data但调用roc()时,用的是原始未排序的dataname$Infected和排序后的predicted.data$prob.inf,导致每个预测概率对应的真实标签完全不匹配,ROC计算结果必然错误。 - 多余的rank列:ROC曲线计算不需要手动给预测概率排名,
pROC包会自动处理不同阈值下的灵敏度、特异度,这一步完全没必要。
正确的逻辑回归→ROC曲线流程
1. 基础步骤(这部分你是对的)
加载包、准备数据、拟合逻辑回归:
library(pROC) dataname <- data.frame(Dose = c(rep(0.2, 8), rep(0.3, 7), rep(0.7, 10)), Infected = c(rep(0, 20), rep(1, 5))) # 拟合logistic回归 logistic <- glm( formula = Infected ~ Dose, data = dataname, family = binomial(link = 'logit') )
可以先查看模型结果,确认剂量对感染的影响是否显著:
summary(logistic)
2. 提取匹配的真实标签与预测概率
glm的fitted.values和原始数据行顺序完全对应,直接提取即可,无需手动排序:
# 提取真实标签和对应的预测感染概率 true_labels <- dataname$Infected pred_probs <- logistic$fitted.values
3. 计算ROC并绘制曲线
直接调用roc()函数,确保真实标签和预测概率一一对应:
# 计算ROC数据 roc_data <- roc(response = true_labels, predictor = pred_probs) # 绘制ROC曲线(注意xlim/ylim要用c(0,1)而非0:1,避免语法问题) plot(roc_data, main = "ROC Curve", print.auc = TRUE, xlim = c(0, 1), ylim = c(0, 1))
额外的ROC分析技巧
- 查看所有阈值对应的灵敏度、特异度:
# 输出阈值列表及对应指标 roc_data$thresholds roc_data$sensitivities roc_data$specificities
- 找到最优阈值(基于Youden指数,即灵敏度+特异度-1的最大值):
youden_index <- roc_data$sensitivities + roc_data$specificities - 1 best_threshold <- roc_data$thresholds[which.max(youden_index)] cat("最优阈值:", best_threshold, "\n")
- 提取特定阈值下的灵敏度和特异度:
coords(roc_data, x = best_threshold, input = "threshold", ret = c("sensitivity", "specificity"))
内容的提问来源于stack exchange,提问作者K.W
相关产品推荐
相关产品推荐

