tooluniverse-diagnostic-test-evaluation
tooluniverse-diagnostic-test-evaluation について
固定カットオフ指標、ROC解析、ベイズ推定による検査後確率を扱う ToolUniverse スキルです。2×2表、連続スコア、または検査性能と有病率に応じた分析方法を案内します。
主な機能
- 01感度、特異度、予測値の算出
- 02連続スコアの ROC、AUC、Youden 閾値解析
- 03有病率から検査後確率を推定
- 04閾値選択と結果解釈の注意点
活用シーン
- 01固定カットオフ検査の2×2表を要約
- 02連続バイオマーカーの識別能を評価
- 03検査性能と有病率から陽性後の疾患確率を推定
MCP 対応
Epidemiology_diagnostic、ROC_analysis、Epidemiology_bayesian などの ToolUniverse ツールで診断分析を実行します。
インストール
コマンドをコピーしてターミナルで実行します。
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を返します。
| 指標 | 答える質問 | 有病率に依存するか? |
|---|---|---|
| 感度 = TP/(TP+FN) | 疾患がある人のうち、検査陽性となる割合は? | いいえ |
| 特異度 = TN/(TN+FP) | 疾患がない人のうち、検査陰性となる割合は? | いいえ |
| PPV = TP/(TP+FP) | 陽性の場合、疾患がある確率は? | はい — 大きく依存します |
| NPV = TN/(TN+FN) | 陰性の場合、疾患がない確率は? | はい |
| LR+ = 感度/(1−特異度) | 陽性によって疾患のオッズがどれだけ上がるか | いいえ |
| LR− = (1−感度)/特異度 | 陰性によって疾患のオッズがどれだけ下がるか | いいえ |
PPV/NPVの落とし穴。 感度と特異度は検査の特性ですが、PPVとNPVは検査対象集団の疾患有病率に依存します。 感度・特異度が非常に高い検査でも、有病率の低い(スクリーニング)状況ではPPVが低くなります。症例対照デザインのPPV/NPVを引用してはいけません(その50/50の有病率は人為的なものです)。
Epidemiology_bayesian(ステップ3)を使って、実際の有病率に基づいて計算してください。有病率に依存しない要約として、感度、特異度、尤度比を報告してください。
ステップ2 — 連続値のバイオマーカーに対するROC/AUC/最適カットオフ
検査スコアが連続値の場合、すべての閾値で評価します。
**ROC_analysis**ツールを優先してください。1回の呼び出しで構造化JSON(AUC+ブートストラップ95%信頼区間、Youden最適カットオフとその感度・特異度、任意の固定カットオフでの指標、ROC曲線)を返し、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(ブートストラップ95%信頼区間付き)、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を求められます。実際の有病率を入力してください。(例:有病率10%の場合、感度90%/特異度95%の検査で陽性となった後の確率は、95%ではなく約67%にすぎません。)
注意点(明記してください)
- 有病率が示されていないPPV/NPVには意味がありません — 前提とする有病率を必ず示してください。
- AUCは運用点を考慮しません。 AUCが高くても、実際に使用する閾値で検査が有用とは限りません。選択したカットオフでの感度・特異度も報告してください。
- クラス不均衡。 陽性例が非常に少ない場合、ROC/AUCが良好でもPPVが低いことがあります。適合率–再現率曲線を検討し、実際の有病率におけるPPVを必ず報告してください。
- スペクトラムバイアス。 明らかな患者と明らかな健常者を対象に測定した感度・特異度は、境界例を含む実世界の性能を過大評価します。
- 評価に使用したものと同じデータで単一のカットオフを選ぶと、性能を楽観的に評価してしまいます — 保留データセットで閾値を検証してください。
正直な制限事項
- これらは識別力/精度の指標であり、較正ではありません。識別力の高いモデルでも、較正の不十分な確率を出力することがあります。
- AUC が1つだけでは比較できません。同じ患者を対象とした2つの検査を比較するには、対応のある AUC 検定(DeLong)を使用します。これはここで紹介する基本的なスクリプトの範囲を超えています。
関連するスキル
tooluniverse-statistical-modeling— スコアとオッズ比(OR)を算出するロジスティック回帰。tooluniverse-epidemiological-analysis— 集団レベルのリスク、スクリーニングプログラムの指標。tooluniverse-meta-analysis— 複数の研究にわたる診断精度を統合します。