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

从逻辑回归生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:31:24