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

如何为EYETESTS数据集各预测变量与LEVEL的混淆矩阵计算敏感度、特异度的95%置信区间

解决敏感度与特异度95%置信区间计算问题

针对你的EYETESTS数据集,这里提供两种可靠的R代码方案,直接计算四个预测变量与LEVEL的混淆矩阵、敏感度/特异度及其95%置信区间:

方案1:用epiR包直接输出诊断试验指标及置信区间

epiR的epi.tests()函数专门用于诊断试验的统计分析,能直接输出混淆矩阵、敏感度、特异度及对应置信区间,以下是正确流程:

  1. 安装并加载包:
install.packages("epiR")
library(epiR)
  1. 批量处理四个预测变量:
# 定义待评估的变量列表
pred_vars <- c("MAD", "SAD", "RED", "BLUE")

# 循环遍历每个变量
for (var in pred_vars) {
  # 提取参考标准(LEVEL)和当前预测变量
  ref <- EYETESTS$LEVEL
  pred <- EYETESTS[[var]]
  
  # 构建列联表:行=参考标准,列=预测结果(顺序不能反)
  contingency_table <- table(ref, pred)
  
  # 计算指标及95%置信区间
  test_result <- epi.tests(contingency_table, conf.level = 0.95)
  
  # 打印结果
  cat("\n=== 变量", var, "与LEVEL的分析结果 ===\n")
  print(test_result$tab)  # 混淆矩阵
  cat("\n敏感度(Sensitivity):", 
      round(test_result$stats$se, 4), 
      " | 95%置信区间:", 
      round(test_result$stats$se.lower, 4), "-", round(test_result$stats$se.upper, 4), "\n", sep = "")
  cat("特异度(Specificity):", 
      round(test_result$stats$sp, 4), 
      " | 95%置信区间:", 
      round(test_result$stats$sp.lower, 4), "-", round(test_result$stats$sp.upper, 4), "\n", sep = "")
}

方案2:结合caret与binom包计算置信区间

如果习惯用caret的confusionMatrix()输出,可搭配binom包单独计算敏感度和特异度的置信区间:

  1. 安装并加载包:
install.packages(c("caret", "binom"))
library(caret)
library(binom)
  1. 批量处理代码:
pred_vars <- c("MAD", "SAD", "RED", "BLUE")

for (var in pred_vars) {
  pred <- EYETESTS[[var]]
  ref <- EYETESTS$LEVEL
  
  # 生成caret混淆矩阵,指定阳性类别为"1"(对应yes)
  cm <- confusionMatrix(pred, ref, positive = "1")
  
  # 提取敏感度、特异度的分子分母
  sens_true_pos <- cm$table[2, 2]  # 真阳性数
  sens_total_pos <- sum(cm$table[2, ])  # 总阳性数
  spec_true_neg <- cm$table[1, 1]  # 真阴性数
  spec_total_neg <- sum(cm$table[1, ])  # 总阴性数
  
  # 用Wilson法计算95%置信区间(稳健性优于正态近似)
  sens_ci <- binom.confint(sens_true_pos, sens_total_pos, conf.level = 0.95, method = "wilson")
  spec_ci <- binom.confint(spec_true_neg, spec_total_neg, conf.level = 0.95, method = "wilson")
  
  # 输出结果
  cat("\n=== 变量", var, "与LEVEL的分析结果 ===\n")
  print(cm$table)
  cat("\n敏感度:", round(cm$byClass["Sensitivity"], 4), 
      " | 95%CI:(", round(sens_ci$lower, 4), "-", round(sens_ci$upper, 4), ")\n", sep = "")
  cat("特异度:", round(cm$byClass["Specificity"], 4), 
      " | 95%CI:(", round(spec_ci$lower, 4), "-", round(spec_ci$upper, 4), ")\n", sep = "")
}

关键注意事项

  • 确保所有变量为因子类型,若为数值型需先转换:EYETESTS$LEVEL <- factor(EYETESTS$LEVEL, levels = c("0", "1")),其他变量同理,避免类别识别错误。
  • 必须指定positive = "1",保证阳性类别对应你定义的"yes",否则敏感度和特异度会反转。
  • Wilson法是二分类比例置信区间的推荐方法,尤其适合样本量较小的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:15:21