How to Run Statistics over LLM Judges and Trust the Results: Calibrated Inference for Small-Sample AI Evaluation with evalstats
Organizations: Department of Computer Science and Operations Research (DIRO) Université de Montréal Montréal, Quebec, Canada
Abstract
Researchers across academia increasingly base significance claims on LLM judge scores and small-sample AI evaluations. Yet without well-calibrated confidence intervals (CIs), hypothesis tests, and judge-bias corrections, such claims are unreliable. We address these issues in several contributions. First, we find that running statistics over raw LLM judge scores leads to inflated false positives: counterintuitively, for many inter-rater agreement metrics, false positive risk peaks at "almost perfect" human-LLM agreement. To help researchers understand how to run statistics over LLM judges responsibly, we present guidance and tooling for the statistical analysis of mixed human-AI judge designs, and implement nine hypothesis tests via prediction-powered inference (PPI), including the first known PPI corrections for four rank-based tests (Wilcoxon signed-rank, Mann-Whitney U, and omnibus variants). To keep PPI++ stable with small human-labeled calibration sets, we introduce bootstrap-adaptive power tuning, which shrinks the estimated weight toward a target estimated from the labeled data, and accounts for that weight's own sampling variance. Second, through Monte Carlo simulations, we derive recommendations for what CI, p-value, and FWER correction methods to use for small-sample AI evaluations (N<100), and warn researchers against bootstrap CIs. We package these recommendations into evalstats, an open-source Python package that selects calibrated methods automatically, and demonstrate it in three scenarios, including one where a real LLM judge validated at "substantial agreement" would have led a researcher to publish a spurious finding. evalstats is publicly available at https://github.com/ianarawjo/evalstats.
Figures & tables
| What users need to know | Common practice without evalstats | With evalstats |
| Is the best-scoring condition really best? | Read overlapping error bars by eye, which does not answer the question; or run pairwise tests and correct them via a familiar correction like Bonferroni when comparisons share items and are therefore strongly dependent. | compare(factors=...) : pairwise CIs already widened for simultaneous coverage, plus rank bands marking statistical ties. |
| Does the result hold if I run it again? | Averaging or pass@k ( Hariri et al., 2026 ) across runs, which hides per-item disagreement that caused the instability. Even if trying to accommodate runs, struggle to pick an estimator that respects the nesting. | Multi-run data is detected; per-input variance is reported alongside the means, or in isolation via stability() . |
| Which condition wins once cost or latency counts? | Rank on the primary metric and inspect the secondary one informally, eyeballing means. | Simply passing secondary_metric= on compare() to get an uncertainty-aware Pareto front labeling each condition frontier , dominated , or ambiguous . |
| Which combination of two factors is best? | Test every factor level against every other—e.g., grid of model-prompt pairs, for 780 comparisons—then choose a basic FWER correction that is overly conservative under strong correlation between conditions. | The same call with two factors: Šidák simultaneous CIs and step-down FWER correction (Shaffer or Romano–Wolf) over the full grid. |
| My metric is an LLM judge. Can I trust the comparison? | Compute pooled inter-rater reliability once against a hand-labeled sample collected by convenience. | label from the CLI to randomly sample items for labeling, then run judge_alignment() . |
| Only part of my data is human-labeled, and I need to run statistics over LLM judge scores. | Analyze the labeled subset alone and discard the judge scores, losing power—or keep the judge scores, inherit their bias, and argue with reviewers or managers that high IRR with human raters warrants running familiar statistics over LLM judge scores, potentially leading to spurious findings. | alignment= on compare() propagates the labeled sample into every estimate, CI and -value via PPI correction. PPI tests recover power from the unlabeled items while remaining calibrated, worth the human labels at (§ 6.3 ). |
Appendix figures & tables18 assets
Supplementary material from the paper’s appendix.
Appendix
| Model | Benchmark | Model | Benchmark |
|---|---|---|---|
| falcon-7b-instruct | mmlu-pro | gpt-4.1-mini | hi-tom |
| gpt-4o | culturalbench | gemma-3-27b-it | ifeval c |
| o4-mini | opentom | falcon-40b-instruct | imdb |
| llama-65b | bbq | qwen-2.5-72b-instruct | omni-math |
| vicuna-13b-v1.3 | cnndm c | kimi-k2 | salad-bench |
| DeepSeek-V3-0324 | do-not-answer c | llama-2-70b | xsum c |
| Overall | Type-I error by | Real evals data | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Method | Type-I | Max | Power | Type-I | Max | Power | ||||||||
| Binary | ||||||||||||||
| bootstrap | .029 | .110 | .370 | .019 | .025 | .026 | .040 | .040 | .047 | .127 | .368 | .037 | .045 | .049 |
| bayes_bootstrap | .043 | .143 | .408 | .047 | .041 | .043 | .046 | .046 | .064 | .173 | .402 | .074 | .059 | .056 |
| smooth_bootstrap | .020 | .070 | .342 | .013 | .017 | .022 | .029 | .030 | .033 | .093 | .341 | .028 | .035 | .040 |
| bootstrap_t | .062 | .190 | .374 | .050 | .033 | .076 | .069 | .065 | .059 | .213 | .368 | .052 | .051 | .050 |
| Correction | FWER | Best-arm power | Time (ms) | Type | n=15 | n=30 | n=50 | n=100 | n=200 | n=500 | n=1000 | k=3 | k=5 | k=10 | k=20 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| holm (bin) | 0.023 | 0.219 | 0.0 | bin | 0.002 | 0.010 | 0.018 | 0.026 | 0.031 | 0.036 | 0.038 | 0.029 | 0.023 | 0.022 | 0.018 |
| bonferroni (bin) | 0.023 | 0.210 | 0.0 | bin | 0.002 | 0.010 | 0.018 | 0.026 | 0.031 | 0.036 | 0.038 | 0.029 | 0.023 | 0.022 | 0.018 |
| fdr_bh (bin) | 0.025 | 0.260 | 0.0 | bin | 0.003 | 0.011 | 0.020 | 0.028 | 0.033 | 0.040 | 0.041 | 0.031 | 0.026 | 0.024 | 0.021 |
| hochberg (bin) | 0.023 | 0.220 | 0.0 | bin | 0.002 | 0.010 | 0.018 | 0.026 | 0.031 | 0.037 | 0.038 | 0.029 | 0.024 | 0.022 | 0.018 |
| shaffer (bin) | 0.023 | 0.228 | 0.1 | bin | 0.002 | 0.010 | 0.018 | 0.026 | 0.031 | 0.036 | 0.038 | 0.029 | 0.023 | 0.022 | 0.018 |
| friedman_nemenyi (bin) | 0.000 | 0.078 | 12.7 | bin | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 |
| Eval type | Population SD |
|---|---|
| Binary | 0.5000 |
| Continuous | 0.1206 |
| Likert (1–5) | 1.1447 |
| Synthetic, MCAR | Synthetic, MNAR | Real judge data | Power at | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Test | PPI | Unc. | Max | PPI | Unc. | Max | PPI | Unc. | Max | PPI | Subset |
| -test (indep) | .047 | .153 | .100 | .063 | .153 | .210 | .059 | .571 | .120 | .438 | .165 |
| Welch’s | .048 | .153 | .110 | .063 | .153 | .210 | .058 | .571 | .115 | .363 | .148 |
| paired | .053 | .154 | .120 | .054 | .154 | .220 | .053 | .788 | .110 | .477 | .232 |
| Mann-Whitney | .049 | .154 | .120 | .051 | .154 | .255 | .052 | .637 | .110 | .383 | .165 |
| Wilcoxon | .044 | .156 | .125 | .047 | .157 | .180 | .043 | .855 | .080 | .328 | .145 |
| Planned test | Use | Computed between LLM judge & humans on… |
| Estimation and two-condition tests | ||
| Mean, proportion, CI | raw scores, per measure | |
| Independent-samples -test | raw scores, within each condition | |
| Paired -test | difference scores ( ) | |
| Mann–Whitney | each item’s mid-rank placement against the other condition | |
| Wilcoxon signed-rank | difference scores, via their Hájek projection | |
| CI coverage (target ) | PPI power gain over labels-only (points) | ||||||
| Data type | Per-arm | Pairwise | Family | Type-I | Peak | at | at |
| Binary | 0.957 | 0.952 | 0.969 | 0.031 | +18.9 | 100 | +0.5 |
| Continuous | 0.952 | 0.949 | 0.962 | 0.040 | +11.7 | 40 | +0.0 |
| Likert | 0.952 | 0.950 | 0.958 | 0.040 | +13.1 | 40 | +4.1 |
| All | 0.954 | 0.950 | 0.963 | 0.037 | +14.0 | 40 | +1.6 |
Statistical Hypothesis Testing
Statistical hypothesis testing develops methods for assessing evidence against a stated null while controlling false-positive and false-negative rates.
See all 101 papers