关于 tooluniverse-diagnostic-test-evaluation
面向分析诊断检测或生物标志物数据的 ToolUniverse 技能,涵盖固定阈值指标、ROC 分析和贝叶斯后验概率计算。可从 2×2 表、连续评分或检测性能与患病率出发,选择相应方法评估结果。
主要功能
- 01计算灵敏度、特异度及预测值
- 02连续评分的 ROC、AUC 与 Youden 阈值分析
- 03根据患病率计算后验患病概率
- 04提供阈值选择与结果解读注意事项
适用场景
- 01汇总固定阈值检测的 2×2 表
- 02评估连续生物标志物的区分能力
- 03结合检测性能和患病率估算阳性后的患病概率
MCP 相关
该技能通过 ToolUniverse 工具执行诊断分析,包括 Epidemiology_diagnostic、ROC_analysis 和 Epidemiology_bayesian。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mims-harvard/ tooluniverse --skill tooluniverse-diagnostic-test-evaluation安装后在 Claude Code 中输入/tooluniverse-diagnostic-test-evaluation确认已加载。
附带文件scripts/roc_analysis.pytest_roc_analysis.py
详细介绍
诊断检测 / 生物标志物准确性评估
评估检测或生物标志物区分疾病的能力——在固定阈值下(2×2),或在所有阈值下(ROC)——并将检测结果转换为患病概率。
你属于哪种情况?
| 你有…… | 前往 |
|---|---|
| 固定阈值下的 2×2 表(TP/FP/TN/FN) | 步骤 1(Epidemiology_diagnostic) |
| 连续型生物标志物评分 + 真实标签 | 步骤 2(ROC / AUC / Youden,Python) |
| 检测的敏感度/特异度 + 患者的检测前概率 | 步骤 3(Epidemiology_bayesian) |
步骤 1 — 根据 2×2 表计算固定阈值指标
tu run Epidemiology_diagnostic '{"operation":"diagnostic","tp":90,"fp":10,"tn":180,"fn":20}'
返回 sensitivity、specificity、PPV、NPV、accuracy、LR_pos、LR_neg 和样本的 prevalence。
| 指标 | 回答的问题 | 是否受患病率影响? |
|---|---|---|
| Sensitivity = TP/(TP+FN) | 在患病者中,有多少比例检测结果为阳性? | 否 |
| Specificity = TN/(TN+FP) | 在未患病者中,有多少比例检测结果为阴性? | 否 |
| PPV = TP/(TP+FP) | 如果结果为阳性,患病的概率是多少? | 是——影响很大 |
| NPV = TN/(TN+FN) | 如果结果为阴性,未患病的概率是多少? | 是 |
| LR+ = sens/(1−spec) | 阳性结果会使患病几率提高多少 | 否 |
| LR− = (1−sens)/spec | 阴性结果会使患病几率降低多少 | 否 |
PPV/NPV 陷阱。 敏感度和特异度是检测本身的属性;PPV 和 NPV 取决于受检人群中的疾病患病率。 敏感度/特异度很高的检测,在低患病率(筛查)场景下,PPV 仍可能很低。切勿引用病例对照研究中的 PPV/NPV(其 50/50 的患病率是人为设定的)——应使用
Epidemiology_bayesian(步骤 3),按真实患病率计算。作为不受患病率影响的摘要,应报告敏感度、特异度和似然比。
步骤 2 — 连续型生物标志物的 ROC / AUC / 最优阈值
当检测结果是连续评分时,应评估所有阈值:
优先使用 ROC_analysis 工具——一次调用即可返回结构化 JSON(AUC + bootstrap 95% CI、Youden 最优阈值及其敏感度/特异度、固定阈值下的可选指标,以及 ROC 曲线),并且无需 shell 即可在 MCP 服务下运行:
ROC_analysis(scores=[...], labels=[0,1,...]) # inline arrays
ROC_analysis(csv_path="scores.csv", cutoff=0.6) # or a CSV (cols: label, score)
附带的脚本提供等效的 CLI 形式:
python skills/tooluniverse-diagnostic-test-evaluation/scripts/roc_analysis.py --input scores.csv
# scores.csv columns: label (1=disease, 0=healthy), score (continuous biomarker)
两者都会报告 AUC(含 bootstrap 95% CI)、Youden 最优阈值(使敏感度 + 特异度 − 1 最大的阈值)及其敏感度/特异度。
| AUC | 区分能力 |
|---|---|
| 0.5 | 不优于随机猜测 |
| 0.7–0.8 | 可接受 |
| 0.8–0.9 | 优秀 |
| >0.9 | 卓越 |
- Youden 阈值对敏感度和特异度赋予相同权重;如果假阴性和假阳性的代价不同,应根据临床权衡选择阈值,而不是使用 Youden 阈值。
- 选择阈值后,构建相应的 2×2 表,并执行步骤 1,计算该工作点下的固定阈值指标。
步骤 3 — 检测后概率(贝叶斯)
根据给定的检测前概率/患病率,将检测结果转换为患病概率:
tu run Epidemiology_bayesian '{"operation":"bayesian","prevalence":0.10,
"sensitivity":0.90,"specificity":0.95,"test_result":"positive"}'
返回 pre_test_odds、LR 和 post_test_probability。这就是计算现实世界 PPV 的方法:代入真实患病率。(例如:敏感度为 90%、特异度为 95% 的检测,在患病率为 10% 时,阳性后的患病概率仅约为 67%,而不是 95%。)
注意事项(应明确说明)
- 未说明患病率的 PPV/NPV 毫无意义——务必注明其假设的患病率。
- AUC 不考虑工作点。 AUC 高并不代表检测在实际采用的阈值下有用——还应报告所选阈值下的敏感度/特异度。
- 类别不平衡。 阳性样本极少时,ROC/AUC 可能看起来不错,但 PPV 却很低;可考虑精确率-召回率曲线,并务必报告真实患病率下的 PPV。
- 谱系偏倚。 在明确患病者与明确健康者中测得的敏感度/特异度,会高估检测在现实世界边界病例中的表现。
- 在同一数据上选择并评估单一阈值会导致结果过于乐观——应在留出集上验证该阈值。
局限性说明
- 这些是区分能力/准确性指标,而非校准指标——区分能力强的模型仍可能输出校准不佳的概率。
- 单个 AUC 无法用于比较;若要比较同一批患者的两项测试,请使用配对 AUC 检验(DeLong)——这超出了此处基础脚本的范围。
相关技能
tooluniverse-statistical-modeling— 生成评分和 OR 的逻辑回归。tooluniverse-epidemiological-analysis— 群体层面的风险、筛查项目指标。tooluniverse-meta-analysis— 汇总多项研究中的诊断准确性。