Who actually moves the scoreboard? Player value with honest error bars
Every plus-minus argument has the same flaw: the players you share the floor with. A bench guard who rides shotgun with the MVP posts a glowing on/off number; a good starter marooned on a bad roster posts a grim one. This study builds the standard remedy, RAPM-family regularized regression over every five-man lineup. It builds it twice, in R and Python, for 2023-24 and the just-completed 2025-26 season. Then it does the two things public plus-minus work most often skips: it reports uncertainty honestly, and it rebuilds the whole thing from a second, independent unit of observation to see if the answer holds.
Terms used in this analysis
- RAPM: Regularized adjusted plus-minus: a ridge regression crediting each player with net points per 100 possessions while adjusting for the other nine players on the floor.
- stint: A stretch of game time with no substitution at either end - the unit of observation for the stint-level RAPM model.
- plus-minus: Points scored minus points allowed while a player or lineup is on the floor.
- ridge: Ridge regression: least squares with an L2 penalty that keeps many-parameter models stable at the cost of a little bias.
- shrinkage weight: The fraction of an observed number that survives empirical-Bayes regression: 1 means fully trusted, 0 means replaced by the league mean.
- CI: Confidence interval.
- Spearman: Rank correlation: correlation of the orderings rather than the raw values.
The model's one free knob, how hard to shrink, is not a taste decision. Cross-validation chooses the ridge penalty (λ = 3200 in both seasons). The figure below shows why that choice is defensible rather than decorative: predictive error falls, bottoms out, and rises again as the penalty grows. The model simply takes the minimum.
What comes out the other side passes the eye test at the top: Jokić (+5.5 per 100), Anunoby, Brunson, George, Gilgeous-Alexander lead 2023-24; Wembanyama (+6.5) and Gilgeous-Alexander lead 2025-26. But the study's real headline is the width of the intervals: the median 95% bootstrap CI spans about ±2.5 points per 100 possessions. One season of lineup data genuinely cannot separate the 5th-best player from the 30th, and a model that pretends otherwise is selling something.
A ranking with intervals still deserves suspicion if it only exists in one model. So the study rebuilds valuation from scratch at a different grain: 69,767 substitution-to-substitution stints parsed from all 1,230 games of play-by-play, with an opponent-adjusted design. Its unpenalized intercept lands at +2.2 points per 100. That is the home-court advantage, estimated as a byproduct rather than assumed, and a built-in sanity check that the design matrix means what it claims. The two models share no code path and no data feed.
Lineups themselves get the descriptive treatment, where the volume filter does the honest work: among five-man units with 1,000+ possessions, the best of 2023-24 was Milwaukee's Lopez–Lillard–Middleton–Antetokounmpo– Beasley at +15.3 per 100 over 1,302 possessions. Every lineup total is gated by exact reconstruction of official team totals. The model is not allowed to describe a season it cannot re-add.
The takeaway for a decision-maker is deliberately modest: with one public season, trust the tier, not the rank; trust a value more when two independent constructions agree on it; and treat any lineup-value claim without an error bar as marketing.
Additional figures
Method, code, and verification
The full technical write-up (data provenance, model specification, validation gates, and stated limitations) is the README. The analysis is implemented independently in R and Python and reconciled to numeric tolerance; run_checks.sh replays every gate.