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.
Median interval width
±2.5 pts/100
One public season cannot separate the 5th-best player from the 30th.
Cross-model agreement
0.97
Spearman correlation between two independently built models.
Stints parsed
62,658
Substitution-to-substitution units from all 1,230 games of play-by-play.
Home-court advantage
+2.2 pts/100
Estimated as a byproduct of the stint model, not assumed.
The method
Shrinkage chosen by prediction, not by hand
Both models in this study turn basketball into rows of a regression, one row
per unit of play, and differ in what a row holds. The diagram below draws one
real row of each.
One real row from each model. The lineup model sees a five-man unit's season total and its five players; the stint model sees one stretch without substitutions, both fives, and which team was at home. Both are fitted the same way, by possession-weighted ridge regression.
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.
The cross-validation curve that picks the ridge penalty. Necessary because shrinkage is the entire difference between this model and raw on/off. This figure is the evidence that the amount of shrinkage was chosen by held-out prediction, not by hand.Raw on/off versus the regularized estimate for every qualifying player. The before/after of the method: the players pulled hardest toward zero are exactly the low-minute, star-adjacent profiles whose raw numbers are most contaminated: visible teammate-context correction, one dot per player.
The ranking
The error bars are the real headline
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.
The 2023-24 player values with their bootstrap intervals: the study's most important figure precisely because of the error bars. The ordering is the headline everywhere else; here the honest message is how much the intervals overlap, which is what a front office actually needs to know before acting on a single-season number.
The replication
Two models, no shared plumbing, one answer
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:
62,658 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.
The two builds side by side. Each starts from its own source, passes its own audit against the NBA's totals or feed, and is fitted on its own rows; they meet only at the end, where their player rankings are compared.
Correction, October 19, 2026. The first stint build put events in the
feed's numbering order, which is not the order they happened, and gave free
throws to whoever was on the floor at the free throw instead of at the foul.
Its league totals still checked out, so nothing flagged it. Checked player by
player against the NBA's own feeds, it now matches: plus-minus is exact for
99.8% of player-games, up from 41%. The ranking barely moved (the two models
now agree at 0.97, up from 0.96), and the figures here are from the
corrected build.
Stint-level RAPM against the aggregate lineup model, one dot per player (Spearman 0.97). The convergent-validity figure: two independently built models, different units of observation, different feeds, near-identical player ordering. Agreement this strong is the best public-data evidence that the values reflect the players rather than the plumbing.
Five-man units
Lineup claims are gated by an audit
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
Trust the tier, not the rank
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.
What the intervals allow. Top: most players cannot be told apart from league average in one season, and only a small group sits clearly above or below it. Bottom: the 5th-ranked player's interval holds the estimates of a long run of ranks, including the 30th, which is why the tier is the claim to trust and the rank is not.
Additional figures
Player values (2025-26)Shrinkage (2025-26)Cv curve (2025-26)
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.