Tool · Module 3
Diagnostic Metrics Playground
A cohort of 1,000 patients. Set how common the condition is and how the model behaves on cases and non-cases, then read what a positive result actually means to the clinician who receives it.
Share of the 1,000 patients who actually have the condition.
Of patients who have the condition, the share the model flags.
Of patients who do not have the condition, the share the model correctly leaves alone.
| Has condition | Does not | Total | |
|---|---|---|---|
| Model positive | 45 true positives | 95 false positives | 140 |
| Model negative | 5 false negatives | 855 true negatives | 860 |
| Total | 50 | 950 | 1000 |
Positive predictive value
32.1%
Of 140 alerts, 45 are real.
Negative predictive value
99.4%
Of 860 patients not flagged, 855 truly do not have the condition; 5 still do.
False alarms
95
Per 1,000 patients screened.
Alerts per confirmed case
3.1
Workload each true case costs the team.
The 1,000-person display is a deterministic integer allocation: whole patients are assigned to each cell so every row, column and total reconciles exactly. PPV, NPV and the alert counts are computed from those same integer counts, shown to one decimal place. Because whole patients cannot be split, the realised rates can differ from the sliders. At moderate prevalence the difference is small, but at very low prevalence it can be substantial: at the lowest prevalence setting the "has condition" column holds a single patient, so a requested sensitivity of 50% is realised as 100%. The sliders always state the requested rates; the table always shows the realised integer counts. Nothing here is simulated or random.
Leave sensitivity and specificity at 90%. Set prevalence to 20% and note the PPV, then move prevalence to 2%, changing nothing else. PPV falls sharply. A vendor says this means the model "degraded" when it moved from a high-acuity ward to a general ward. What is the more accurate reading?