Comparing models without manufacturing a winner
A sweep of 5 models across 4 workloads and 5 metrics is 100 simultaneous tests. At p < 0.05 that produces about 5 "significant" results from pure noise, and those are the ones that end up in the summary.
The refusal
Do not name a winner that does not survive correction. If nothing survives, the finding is "these models are indistinguishable on this evidence", and that is a real, useful, publishable result.
Also refuse to compare unpaired when the models saw the same items. Throwing the pairing away discards most of the available power.
Procedure
- Same items, every model. If they saw different items, stop. That is a different and much weaker study, and it should be labelled as one.
- Count the comparisons before you run them. Models times workloads times metrics. Write the number down. It goes in the output.
- Use McNemar on the discordant pairs for accuracy-style outcomes. Items every model got right, or every model got wrong, carry no information about which is better.
- Correct with Holm across the full sweep, not per workload. See
holm()inlib/stats.ts. - Report the effect size next to the p-value. Significant and tiny is a real category and it usually means "do not switch".
- Check the practical gates separately. Latency, cost, and failure modes disqualify models regardless of accuracy. A model that wins by 2 points at 30x the latency has not won. Say so with the measured number, do not just drop it silently.
Output contract
- number of comparisons run, including the ones not reported
- per comparison: discordant counts, p, Holm threshold, survives yes/no
- the winner, or an explicit "no winner survives correction"
- disqualifications on latency or cost, with the measurement that disqualified them
- per-slice results wherever an aggregate could be hiding a reversal
What this prevents
"Model B beat Model A on the extraction workload, p = 0.03." True, correctly computed, and drawn from a sweep of 100 tests where nothing survives Holm. The sentence is accurate. The finding is not there.