Forward priors / regularized adjusted plus-minus
Prior-Centered RAPM
Prior-centered RAPM keeps the canonical one-number lineup design but shrinks each player toward a forward-looking estimate instead of toward zero. The first exemplar uses only prior-season RAPM; a second, directly comparable ablation uses the frozen output of the RAPM aging model.
Estimand
For target-season lineup stint (j), let (X_j) contain +1 for home players
and -1 for away players, (y_j) be home net rating, and (mu_i) be player
(i)'s prior-season RAPM. The estimator is
The intercept (b) remains an unpenalized home-court term. Stint possessions are the weights (w_j), normalized to mean one before fitting, consistent with canonical Ridge RAPM.
First Exemplar
The prior for season (t) is the completed RAPM estimate from season (t-1). 1996-97 is fitted as ordinary zero-centered Ridge RAPM; its player estimates become the 1997-98 priors, then the procedure repeats forward through 2025-26. The target season's games, box-score outcomes, and RAPM estimates are not inputs to its prior. Each historical season uses only its audited pass/warning curated-game subset; unresolved legacy identity placeholders are excluded from the separate player-history panel, not silently mapped to real players.
Players absent from the frozen prior table are explicit cold starts and receive
a zero prior. The output records prior_available so
missing prior coverage cannot be mistaken for an observed zero estimate.
This first ablation intentionally excludes age, experience, box-score, and draft information. The age-informed extension below evaluates whether a pre-season aging forecast improves this simple lagged prior.
Implementation
The sparse solver fits the equivalent residualized problem:
This is exactly the original objective, not an approximation. It retains the
project's SciPy CSR representation and scikit-learn lsqr Ridge solver. The
published player table will include the final RAPM estimate, prior mean, and
the fitted adjustment from the prior.
Selection And Evaluation
The historical pass/warning panel from 1996-97 through 2024-25 is used only to construct frozen lagged-RAPM priors. It does not change the Leaderboard evaluation split: the final model trains on the same first 1,044 2025-26 regular-season games used by the other exemplars and predicts the same final 186 regular-season holdout games. The prior is frozen before every target season fold; lambda is selected only by chronological validation within those 1,044 training games.
The Leaderboard row uses the same possession-level and eligible-game-margin metrics as canonical Ridge RAPM, on exactly the same holdout game IDs.
Age-Informed Prior Exemplar
The second exemplar replaces the completed prior-season coefficient with the frozen player-specific forecast from the RAPM Aging Model:
The aging run is trained only through 2024-25 and publishes its 2025-26
player_priors.parquet before any 2025-26 RAPM fitting. The current run uses
the full 1996-97 through 2024-25 history, the same chronological lambda
selection, and the same 1,044-game fit as the lagged-prior model.
| Prior definition | Holdout stint RMSE | Holdout game-margin RMSE | Frozen playoff possession RMSE | Frozen playoff game-margin RMSE |
|---|---|---|---|---|
| Completed 2024-25 RAPM | 103.7747 | 15.2350 | 1.191755 | 15.3103 |
| Full-history aging forecast | 103.8514 | 15.3933 | 1.191519 | 15.2805 |
The age-informed prior is weaker on the locked regular-season holdout, while
the frozen playoff result is better on this 85-game cohort. This remains an
informative negative regular-season ablation, not sufficient evidence to
override the prespecified regular-season selection target. The immutable RAPM
artifact is aging-prior-rapm-2025-26-20260803T214725Z-9df2aa04; it pins aging
run aging-2025-26-20260803T214653Z-94ce6277 and all game assignments.
Blended Aging And Lagged Prior
The next ablation gives each frozen prior an explicit nonnegative share:
The candidate grid is \(w \in \{0,0.25,0.5,0.75,1\}\), crossed with the standard RAPM lambda grid and selected by pooled chronological validation MSE within the first 1,044 2025-26 regular-season games. The endpoints reproduce the two earlier prior definitions exactly.
The selected weight is \(w=1\) on lagged RAPM and \(w=0\) on the aging forecast, with \(\lambda=0.03\). In the full-history selection surface, the best interior candidate, \(w=0.75\), has validation weighted MSE 10,838.03 versus 10,836.97 for lagged-only. Consequently, its regular-holdout and frozen-playoff metrics exactly match the lagged-prior model. There is no evidence here that a linear blend adds information beyond the recursive lagged-RAPM prior.
The selection surface and frozen outputs are retained in
blended-prior-rapm-2025-26-20260803T214825Z-2dbb1766.
2025-26 All-Season Ranking
This is the completed-season counterpart to the frozen forecast. It uses the
same completed 2024-25 regular-only lagged RAPM prior, selects lambda on
chronological folds in 2025-26, and refits all 1,230 regular-season games.
It is a descriptive ranking, not a forecast, and does not modify the frozen
Preseason Leaderboard. RAPM = Prior + Adjustment; the 500-possession floor
applies to the published list. Click any table header to sort it.
Top 25 Lagged RAPM
| Rank | Player | Team | RAPM | Prior | Adjustment | Possessions |
|---|---|---|---|---|---|---|
| 1 | Nikola Jokić | DEN | 12.88 | 11.47 | 1.41 | 4,786 |
| 2 | Shai Gilgeous-Alexander | OKC | 10.18 | 7.85 | 2.33 | 4,730 |
| 3 | Giannis Antetokounmpo | MIL | 8.62 | 7.76 | 0.86 | 2,129 |
| 4 | Victor Wembanyama | SAS | 8.49 | 1.91 | 6.58 | 3,896 |
| 5 | Jimmy Butler III | GSW | 8.45 | 7.41 | 1.04 | 2,449 |
| 6 | Joel Embiid | PHI | 8.08 | 7.73 | 0.35 | 2,479 |
| 7 | Stephen Curry | GSW | 7.80 | 9.47 | -1.66 | 2,822 |
| 8 | Kawhi Leonard | LAC | 7.71 | 4.02 | 3.69 | 4,167 |
| 9 | Derrick White | BOS | 7.54 | 3.91 | 3.63 | 5,181 |
| 10 | Alex Caruso | OKC | 7.49 | 5.71 | 1.78 | 2,125 |
| 11 | Donovan Mitchell | CLE | 7.05 | 5.96 | 1.09 | 4,925 |
| 12 | Bam Adebayo | MIA | 6.92 | 3.40 | 3.52 | 5,031 |
| 13 | Jrue Holiday | POR | 6.81 | 5.71 | 1.10 | 3,295 |
| 14 | Devin Booker | PHX | 6.81 | 4.79 | 2.02 | 4,442 |
| 15 | Chet Holmgren | OKC | 6.31 | 2.86 | 3.45 | 4,129 |
| 16 | Marcus Smart | LAL | 6.09 | 3.77 | 2.32 | 3,607 |
| 17 | Rudy Gobert | MIN | 5.98 | 5.92 | 0.06 | 4,951 |
| 18 | Jayson Tatum | BOS | 5.98 | 5.76 | 0.22 | 1,046 |
| 19 | Aaron Gordon | DEN | 5.82 | 4.73 | 1.09 | 2,057 |
| 20 | Jarrett Allen | CLE | 5.78 | 5.73 | 0.05 | 3,191 |
| 21 | Cade Cunningham | DET | 5.72 | 2.66 | 3.05 | 4,490 |
| 22 | Lauri Markkanen | UTA | 5.68 | 3.40 | 2.28 | 3,080 |
| 23 | Luka Dončić | LAL | 5.62 | 5.07 | 0.55 | 4,759 |
| 24 | Karl-Anthony Towns | NYK | 5.49 | 5.53 | -0.05 | 4,716 |
| 25 | Dyson Daniels | ATL | 5.48 | 1.28 | 4.19 | 5,317 |
The immutable run is
all-season-lagged-rapm-2025-26-20260805T125907Z-236e5954 under
artifacts/models/prior_rapm_rankings/2025-26/. It contains full-season
coefficients, rankings, lambda-selection evidence, the frozen prior table, and
hashes that pin the source forward-lagged RAPM run.
Run it with:
uv run nba-rank-lagged-rapm --season 2025-26
2025-26 Holdout-Fit Ranking
This table is the regular-only forward-prior fit on the first 1,044 2025-26
regular-season games. RAPM = Prior + Adjustment, where the prior is the
frozen 2024-25 lagged-RAPM estimate. These values use a prior-centered scale
and are not directly interchangeable with zero-centered one-season RAPM.
Top 25 Holdout-Fit RAPM
| Rank | Player | Team | RAPM | Prior | Adjustment | Possessions |
|---|---|---|---|---|---|---|
| 1 | Nikola Jokić | DEN | 13.07 | 11.47 | 1.61 | 4,786 |
| 2 | Shai Gilgeous-Alexander | OKC | 9.76 | 7.85 | 1.91 | 4,730 |
| 3 | Victor Wembanyama | SAS | 8.62 | 1.91 | 6.71 | 3,896 |
| 4 | Giannis Antetokounmpo | MIL | 8.56 | 7.76 | 0.80 | 2,129 |
| 5 | Jimmy Butler III | GSW | 8.37 | 7.41 | 0.95 | 2,449 |
| 6 | Derrick White | BOS | 8.25 | 3.91 | 4.34 | 5,180 |
| 7 | Alex Caruso | OKC | 7.75 | 5.71 | 2.04 | 2,125 |
| 8 | Donovan Mitchell | CLE | 7.64 | 5.96 | 1.69 | 4,925 |
| 9 | Joel Embiid | PHI | 7.58 | 7.73 | -0.14 | 2,479 |
| 10 | Stephen Curry | GSW | 7.40 | 9.47 | -2.06 | 2,822 |
| 11 | Bam Adebayo | MIA | 7.12 | 3.40 | 3.71 | 5,031 |
| 12 | Kawhi Leonard | LAC | 7.00 | 4.02 | 2.98 | 4,167 |
| 13 | Marcus Smart | LAL | 6.67 | 3.77 | 2.90 | 3,607 |
| 14 | Aaron Gordon | DEN | 6.65 | 4.73 | 1.92 | 2,057 |
| 15 | Karl-Anthony Towns | NYK | 6.43 | 5.53 | 0.90 | 4,716 |
| 16 | Devin Booker | PHX | 6.39 | 4.79 | 1.60 | 4,442 |
| 17 | Cade Cunningham | DET | 6.27 | 2.66 | 3.61 | 4,490 |
| 18 | Jayson Tatum | BOS | 6.25 | 5.76 | 0.50 | 1,046 |
| 19 | Rudy Gobert | MIN | 6.15 | 5.92 | 0.23 | 4,951 |
| 20 | Jrue Holiday | POR | 6.12 | 5.71 | 0.41 | 3,295 |
| 21 | Chris Paul | LAC | 5.82 | 8.57 | -2.75 | 457 |
| 22 | Lauri Markkanen | UTA | 5.77 | 3.40 | 2.37 | 3,080 |
| 23 | Chet Holmgren | OKC | 5.73 | 2.86 | 2.87 | 4,129 |
| 24 | Paul George | PHI | 5.72 | 6.52 | -0.80 | 2,328 |
| 25 | De'Anthony Melton | GSW | 5.67 | 2.56 | 3.12 | 2,311 |
Largest 2025-26 Adjustments
The lists below rank players by the fitted movement from the frozen prior, with a 500-possession floor. They are not literal measures of improvement or regression: an adjustment can reflect real change, different health or role, lineup context, or estimation noise.
Largest Positive Adjustments
| Player | Team | RAPM | Prior | Adjustment | Possessions |
|---|---|---|---|---|---|
| Victor Wembanyama | SAS | 8.62 | 1.91 | 6.71 | 3,896 |
| Devin Vassell | SAS | 3.79 | -1.35 | 5.14 | 4,258 |
| Moussa Diabaté | CHA | 5.14 | 0.43 | 4.71 | 3,790 |
| Derrick White | BOS | 8.25 | 3.91 | 4.34 | 5,180 |
| Julian Champagnie | SAS | 4.35 | 0.09 | 4.26 | 4,745 |
| Collin Gillespie | PHX | 3.80 | -0.12 | 3.93 | 4,626 |
| Josh Green | CHA | 3.41 | -0.43 | 3.84 | 1,804 |
| Hugo González | BOS | 3.80 | 0.00 | 3.80 | 2,133 |
| LaMelo Ball | CHA | 5.43 | 1.64 | 3.79 | 4,101 |
| Bam Adebayo | MIA | 7.12 | 3.40 | 3.71 | 5,031 |
| Cade Cunningham | DET | 6.27 | 2.66 | 3.61 | 4,490 |
| Davion Mitchell | MIA | 4.82 | 1.27 | 3.55 | 4,265 |
| Oso Ighodaro | PHX | 3.35 | 0.04 | 3.31 | 3,634 |
| Kon Knueppel | CHA | 3.31 | 0.00 | 3.31 | 5,207 |
| Donte DiVincenzo | MIN | 3.22 | -0.02 | 3.24 | 5,223 |
| Brandon Miller | CHA | 2.58 | -0.65 | 3.23 | 3,968 |
| Jalen Smith | CHI | 3.97 | 0.76 | 3.21 | 2,316 |
| Dyson Daniels | ATL | 4.40 | 1.28 | 3.12 | 5,317 |
| De'Anthony Melton | GSW | 5.67 | 2.56 | 3.12 | 2,311 |
| Scottie Barnes | TOR | 3.39 | 0.31 | 3.07 | 5,512 |
| Neemias Queta | BOS | 3.13 | 0.07 | 3.06 | 3,752 |
| Kawhi Leonard | LAC | 7.00 | 4.02 | 2.98 | 4,167 |
| Marcus Smart | LAL | 6.67 | 3.77 | 2.90 | 3,607 |
| Amen Thompson | HOU | 4.43 | 1.56 | 2.88 | 5,936 |
| Chet Holmgren | OKC | 5.73 | 2.86 | 2.87 | 4,129 |
Largest Negative Adjustments
| Player | Team | RAPM | Prior | Adjustment | Possessions |
|---|---|---|---|---|---|
| Draymond Green | GSW | 0.14 | 4.23 | -4.10 | 3,874 |
| Isaiah Collier | UTA | -4.84 | -0.78 | -4.06 | 3,237 |
| Drake Powell | BKN | -4.02 | 0.00 | -4.02 | 2,655 |
| Gary Trent Jr. | MIL | -5.41 | -1.51 | -3.90 | 2,800 |
| Kobe Brown | IND | -4.19 | -0.43 | -3.76 | 1,960 |
| Tre Mann | CHA | -3.07 | 0.50 | -3.58 | 1,319 |
| LeBron James | LAL | 3.23 | 6.78 | -3.56 | 4,077 |
| Royce O'Neale | PHX | -1.35 | 1.98 | -3.33 | 4,548 |
| Andrew Nembhard | IND | -2.19 | 1.13 | -3.31 | 3,732 |
| Patrick Williams | CHI | -4.25 | -0.95 | -3.30 | 3,168 |
| Mike Conley | MIN | 1.91 | 5.13 | -3.22 | 2,071 |
| Luguentz Dort | OKC | 1.36 | 4.36 | -2.99 | 3,809 |
| Nic Claxton | BKN | -3.97 | -1.13 | -2.84 | 3,868 |
| Bub Carrington | WAS | -4.51 | -1.68 | -2.83 | 4,827 |
| Jarace Walker | IND | -3.33 | -0.50 | -2.82 | 4,157 |
| De'Andre Hunter | CLE | -0.94 | 1.87 | -2.81 | 2,489 |
| Bruce Brown | DEN | -4.58 | -1.79 | -2.79 | 4,097 |
| Buddy Hield | GSW | 0.09 | 2.83 | -2.74 | 1,718 |
| DeMar DeRozan | SAC | -0.25 | 2.45 | -2.70 | 4,983 |
| Tyus Jones | ORL | -2.74 | -0.04 | -2.69 | 2,021 |
| Darius Garland | CLE | 1.73 | 4.39 | -2.66 | 2,806 |
| Brooks Barnhizer | OKC | -2.64 | 0.00 | -2.64 | 703 |
| Myles Turner | MIL | 1.50 | 4.11 | -2.61 | 3,938 |
| Rayan Rupert | POR | -3.24 | -0.66 | -2.58 | 2,244 |
| Caris LeVert | DET | -0.75 | 1.82 | -2.57 | 2,370 |
Historical Coverage Boundary
Historical NBA Stats V3 processing retains named failed games rather than silently repairing or dropping them. The approved first-exemplar policy uses the audited pass/warning subset, records excluded IDs and their source coverage in the model manifest, and evaluates the final 2025-26 model only on the shared Leaderboard holdout.
Historical Playoff Ablation
The initial six-season comparison also fits a second prior chain that appends each completed historical season's available playoff stints to its regular-season stints before forming the next season's prior. Both variants use the identical 2025-26 first-1,044-game fit and are evaluated with that frozen state. It has not yet been regenerated over the full 1996-97 history because historical playoff coverage is a separate acquisition/quality boundary.
| Historical prior source | 2025-26 holdout stint RMSE | Holdout game-margin RMSE | Frozen-state playoff possession RMSE | Frozen-state playoff game-margin RMSE |
|---|---|---|---|---|
| Regular season only | 103.8090 | 15.4400 | 1.191612 | 15.4165 |
| Regular season plus playoffs | 103.8118 | 15.4367 | 1.191635 | 15.4357 |
The playoff-inclusive chain used 372 successfully processed historical playoff games: 74, 65, 76, 65, 56, and 36 from 2019-20 through 2024-25 respectively. At this coverage level, it does not improve the frozen 2025-26 prediction task. The result is an ablation rather than a reason to discard historical playoffs permanently; coverage should be completed before drawing a stronger conclusion.
Correctness Checks
tests/test_prior_rapm.py verifies that residualization restores the
prior-centered coefficient exactly, that chronological lambda selection works,
and that an unseen player receives the explicit zero cold-start prior.
Next Extensions
- use returning and cold-start error scales as prior precision weights;
- add box-score plus-minus and draft-position inputs to cold-start priors;
- replace the two-stage pipeline with the joint dynamic RAPM design in the Modeling Roadmap.