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

如何从拟合好的logistic glm模型计算sensitivity和specificity?

计算Logistic回归模型的灵敏度(Sensitivity)与特异度(Specificity)

你完全没必要随机选择阈值,灵敏度和特异度确实依赖单一阈值,但这个阈值需要根据统计指标或业务需求来确定,而非随机选取。结合你已使用的pROC包,就能轻松算出对应阈值的这两个指标,以下是具体方法:

一、常用的阈值选择逻辑

  • 约登指数(Youden's J):这是统计上最常用的最优阈值,公式为 J = 灵敏度 + 特异度 - 1,取J值最大时的阈值,能平衡两类错误的影响。
  • 自定义阈值:比如行业默认的0.5,或者根据业务场景调整(比如疾病筛查时为了尽可能不漏诊,会把阈值设低以提升灵敏度)。

二、用pROC包计算对应阈值的指标

你已经生成了ROC对象Roc1,直接从这个对象中就能提取所有阈值对应的灵敏度、特异度,再筛选你需要的结果:

1. 获取约登指数最优阈值的指标

# 提取约登指数最大时的阈值、灵敏度、特异度
best_thresh <- coords(Roc1, "best", ret=c("threshold", "sensitivity", "specificity"))
best_thresh

2. 获取自定义阈值(比如0.5)的指标

如果想用固定阈值,直接指定数值即可:

# 指定阈值为0.5,提取对应指标
custom_thresh <- coords(Roc1, x=0.5, ret=c("sensitivity", "specificity"))
custom_thresh

3. 查看所有阈值的对应指标

如果想了解所有可能的阈值结果,可以提取ROC对象中存储的完整数据:

# 把所有阈值、灵敏度、特异度整理成数据框
roc_all_results <- data.frame(
  threshold = Roc1$thresholds,
  sensitivity = Roc1$sensitivities,
  specificity = Roc1$specificities
)
# 查看前几行结果
head(roc_all_results)

这里的阈值数量等于你的预测概率中不同值的数量,ROC曲线会在每个独特的概率值处计算一次指标。

三、用caret包快速计算

如果你习惯用caret包,也可以通过混淆矩阵直接提取指标:

library(caret)
# 根据阈值将预测概率转为分类结果(这里用0.5作为阈值)
pred_class <- ifelse(Pred1 >= 0.5, 1, 0)
# 生成混淆矩阵
conf_mat <- confusionMatrix(factor(pred_class), factor(dat$y), positive="1")
# 提取灵敏度和特异度
conf_mat$byClass[c("Sensitivity", "Specificity")]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:12:57