敏感性、特异度、α、β、阳性预测值(PPV)、阴性预测值(NPV)等指标及置信区间计算(附R语言代码)

本文详细介绍了医学诊断中的敏感性、特异度、假阳性率(α)、假阴性率(β)、阳性预测值(PPV)和阴性预测值(NPV)等概念,并通过2×2混淆矩阵阐述其计算方式。此外,还讨论了敏感性和特异度之间的权衡,以及在不同患病率下PPV和NPV的变化。文章提供了R语言代码帮助理解并计算这些指标。

这个虽然简单但老是被绕进去,所以整理一下方便查阅。

首先画一个2×2的混淆矩阵confusion matrix:

在这里插入图片描述


TP = True positive(真阳性)

FP = False positive (假阳性)

FN = False negative(假阴性)

TN = True negative(真阴性)


敏感性(sensitivity)= 真阳性率 = 真阳/实际为阳 = TP/(TP+FN)

特异度(specificity)= 真阴性率 = 真阴/实际为阴 = TN/(TN+FP)

α = 假阳性率(误诊) = 假阳/实际为阴 = FP/(FP+TN) = 1-spe

β = 假阴性率(漏诊) = 假阴/实际为阳 = FN/(FN+TP) = 1-sen

约登指数(Youden index)= sen+spe-1


正确分类率(accuracy) = (TP+TN)/(TP+TN+FP+FN)

患病率(prevalence, p)= (TP+FN)/(TP+TN+FP+FN)


阳性预测值(PPV)= 真阳/预测为阳 = TP/(TP+FP)

阴性预测值(NPV)= 真阳/预测为阳 = TN/(TN+FN)

错误发现率(FDR)= 假阳/预测为阳 = FP/(F

你希望看到 **完整的最优参数筛选表格**,包含以下性能指标: - 灵敏度(Sensitivity) - 异度(Specificity) - 阳性预测值PPV) - 阴性预测值NPV) - 阳性似然比(PLR) - 阴性似然比(NLR) - 马修相关系数(MCC) - 约登指数(Youden's Index) --- ## ✅ 目标 我们将: 1. 使用 `roc.analysis()` 生成完整 ROC 分析数据 2. 提取并整理成一个 **清晰、可读性强的性能评估表** 3. 按 **约登指数从高到低排序**,标记出最优参数组合 4. 输出为 R 控制台显示 + 可导出的 `data.frame` --- ### ✅ 第一步:确保正确运行 `roc.analysis()` 并生成完整网格 ```r # 定义参数搜索范围(必须是向量!) delta_grid <- seq(2.0, 3.0, by = 0.1) # δ 参数(基线波动阈值) detect_grid <- seq(2.1, 2.9, by = 0.1) # detection 阈值 # 执行 ROC 分析 parms <- roc.analysis( flucyl_yours, # 你的时间序列对象(ts 类型) i.param.values = delta_grid, i.detection.values = detect_grid, i.min.seasons = 6, # 至少6个流行季用于建模 i.graph = TRUE, # 绘制 ROC 曲线 i.graph.file = TRUE, i.graph.file.name = "roc_curve_optimal_delta", i.output = ".", i.mem.info = TRUE ) ``` > ⚠️ 注意:如果 `parms$roc.data` 中没有 `i.param.value` `i.detection.value`,说明输入不是向量,请检查上面代码。 --- ### ✅ 第二步:提取并整理完整性能评估表 ```r # 获取原始结果 roc_full <- as.data.frame(parms$roc.data) # 查看列名(用于映射) cat("🔍 实际列名:\n") print(names(roc_full)) # 标准化列名映射(自动识别) col_map <- list( sensitivity = grep("sens|SENS", names(roc_full), value = TRUE)[1], specificity = grep("spec|SPEC", names(roc_full), value = TRUE)[1], ppv = grep("pos.pred|PPV|positive.predictive", names(roc_full), value = TRUE)[1], npv = grep("neg.pred|NPV|negative.predictive", names(roc_full), value = TRUE)[1], plr = grep("pos.like|PLR|positive.likehood", names(roc_full), value = TRUE)[1], nlr = grep("neg.like|NLR|negative.likehood", names(roc_full), value = TRUE)[1], mcc = grep("matthew|correlation.coefficient|MCC", names(roc_full), value = TRUE)[1], youden = grep("you|You|jou|YI|youdens.index", names(roc_full), value = TRUE)[1] ) # 构建最终表格 performance_table <- data.frame((i.param.value)` = roc_full$i.param.value, `Detection Threshold` = roc_full$i.detection.value, Sensitivity = round(roc_full[[col_map$sensitivity]], 3), Specificity = round(roc_full[[col_map$specificity]], 3), `Positive Predictive Value (PPV)` = round(roc_full[[col_map$ppv]], 3), `Negative Predictive Value (NPV)` = round(roc_full[[col_map$npv]], 3), `Positive Likelihood Ratio (PLR)` = round(roc_full[[col_map$plr]], 3), `Negative Likelihood Ratio (NLR)` = round(roc_full[[col_map$nlr]], 3), `Matthews Correlation Coefficient (MCC)` = round(roc_full[[col_map$mcc]], 3), `Youden's Index (J)` = round(roc_full[[col_map$youden]], 3) ) # 排序:按 Youden 指数降序 performance_table <- performance_table[order(-performance_table$`Youden's Index (J)`), ] # 添加一列表示“是否最优” performance_table$`Optimal?` <- "" performance_table$`Optimal?`[1] <- "⭐ Best" # 重置行名 rownames(performance_table) <- NULL ``` --- ### ✅ 第三步:在控制台打印美观表格(前10行示例) ```r # 显示前10个最佳参数组合 cat("🏆 最优参数组合(按 Youden 指数排序,Top 10):\n\n") print(head(performance_table, 10)) ``` #### 示例输出(模拟): ``` δ (i.param.value) Detection Threshold Sensitivity Specificity PPV NPV PLR NLR MCC Youden's Index (J) Optimal? 1 2.5 2.5 0.880 0.920 0.78 0.96 11.0 0.13 0.76 0.800 ⭐ Best 2 2.4 2.5 0.860 0.930 0.79 0.95 12.3 0.15 0.75 0.790 3 2.6 2.6 0.870 0.910 0.77 0.96 9.7 0.14 0.74 0.780 ... ``` --- ### ✅ 第四步:导出为 CSV 文件(便于 Excel 查看) ```r # 导出完整表格 write.csv(performance_table, "mem_roc_performance_full.csv", row.names = FALSE, fileEncoding = "UTF-8") cat("\n✅ 完整性能表已保存为:mem_roc_performance_full.csv\n") ``` --- ### ✅ 第五步:可视化 —— 绘制 Youden Index 热图(可选) ```r library(ggplot2) library(reshape2) # 提取 δ detection 的组合与 Youden 值 heatmap_data <- data.frame( Delta = performance_table$`δ (i.param.value)`, Detection = performance_table$`Detection Threshold`, Youden = performance_table$`Youden's Index (J)` ) # 热图 ggplot(heatmap_data, aes(x = Detection, y = Delta, fill = Youden)) + geom_tile() + scale_fill_gradient(low = "white", high = "red", name = "Youden Index") + theme_minimal() + labs(title = "Youden Index Heatmap: Optimal δ vs Detection Threshold", x = "Detection Threshold", y = "Delta (Base Threshold)") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 保存图像 ggsave("youden_heatmap.png", width = 8, height = 6, dpi = 150) ``` --- ## ✅ 总结:你现在可以做到 | 功能 | 是否实现 | |------|----------| | 展示所有参数组合的性能 | ✅ | | 包含全部8项关键指标 | ✅ | | 按 Youden 指数排序 | ✅ | | 标记最优参数 | ✅ | | 导出为 CSV | ✅ | | 可视化热图 | ✅ | --- ##
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrrunsen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值