NBAValuation

Model Lab

Gradient boosting (selected on validation) · statistically tied with random forest

How well the salary model holds up on seasons it never saw. Its estimates miss actual pay by $3.82M on average, and 80% of salaries land inside the 80% range it states. Everything below is evidence for or against those two numbers.

How to read the Lab
MAE
Mean absolute error: the average dollar gap between the model's estimate and the actual salary. Lower is better.
Validation seasons
2017-18 → 2020-21, each predicted by a model trained only on earlier seasons. Used to tune the models and choose one.
Held-out seasons
2021-22: kept aside and scored once, after the model was chosen. The fairest test of accuracy.
OLS
Ordinary linear regression, the baseline the tree models are measured against. It gets the same features they do.
Ablation
Rerunning the whole evaluation with one group of features removed, to see how much of the model's accuracy depended on it.
R²
The share of the variation in salaries the model accounts for (1 would be perfect).
80% range · coverage
Every estimate carries a range built to contain 80% of actual salaries. Coverage is how often it really did, on seasons that played no part in setting the width.
SHAP
Splits one estimate into how much each input pushed it up or down, in dollars.
Held-out MAE
$3.82M 95% CI $3.37M – $4.28M
Lower error than OLS
17.3% 12.6% – 21.9%
Held-out R²
0.628
Coverage of the 80% range
80.4% held out

Does the salary benchmark say anything about later pay?

Reading under rules fixed before the estimates: The benchmark is associated with later pay at the same current salary, with little out-of-sample forecast gain.

For every modeled player-season from 2017-18 through 2021-22, the salary one and two seasons later is looked up by exact season in the salary records, including players who no longer meet the playing-time rule. The benchmark is the model's estimate for that season from a model whose fitted parameters never saw that season's salaries. Its settings were chosen on validation seasons that include them; re-selecting the settings with earlier seasons only gives a coefficient of 0.47.

A later salary was found for 1,651 of 1,903 origins one season ahead and 1,443 two seasons ahead. The rest are unknown, not zero: the salary workbook lists about 450 players a season, fewer than are paid. Every estimate below is conditional on a later salary being observed.

At the same current salary, a higher benchmark goes with higher later pay

One season ahead, each extra point of cap in the benchmark goes with 0.45 more points of cap the next season on average (95% CI 0.37 to 0.55; n = 1,651), holding current cap share, career stage and season fixed.

Per point of benchmark the coefficient is 1.78 for players 0–3 years from their debut against 0.40 and 0.34 for 4–7 and 8+ years. Early-career benchmarks vary much less (standard deviation 1.2 points against 3.8 and 4.3), so per standard deviation the contrast is smaller: 2.15 against 1.52 and 1.44 points of later cap share (post hoc). On both scales the association is largest early in careers. Two seasons ahead the overall coefficient is 0.86 (95% CI 0.72 to 1.01). Years since debut are not contract status: rookie-scale years, options and extensions are not in the public data.

0.00.51.01.52.02.53.03.5Points of later cap share per point of benchmarkAll players, 1 seasonAll players, 1 season: 0.45 (95% CI 0.37 to 0.55); n = 1,6510-3 years since debut0-3 years since debut: 1.78 (95% CI 1.52 to 2.10); n = 8064-7 years since debut4-7 years since debut: 0.40 (95% CI 0.27 to 0.53); n = 4728+ years since debut8+ years since debut: 0.34 (95% CI 0.20 to 0.48); n = 373All players, 2 seasonsAll players, 2 seasons: 0.86 (95% CI 0.72 to 1.01); n = 1,4430-3 years since debut0-3 years since debut: 2.62 (95% CI 2.28 to 3.00); n = 7284-7 years since debut4-7 years since debut: 0.82 (95% CI 0.62 to 1.02); n = 4188+ years since debut8+ years since debut: 0.64 (95% CI 0.40 to 0.90); n = 297

Why current salary must be held fixed: growth and the gap (benchmark minus salary) both contain current salary. Regressing growth on the gap alone gives 0.27, which also carries current pay's own relationship with growth. With current salary controlled, the gap coefficient equals the one above. It measures extra information in the benchmark, not a share of any “mispricing” that later closes.

How sturdy the one-season coefficient is

The sign and an interval excluding zero survive every pre-specified check listed below. It is an average that leans on large pay changes. Dropping the 111 most influential rows moves it to 0.28, and the median response (a post hoc median regression) is 0.09 (95% CI 0.06 to 0.13). For the median player the association is much weaker, though still above zero; most of the average comes from the minority whose pay changes a lot. Refitting the benchmark inside the bootstrap gives 0.34 to 0.55.

0.00.20.40.60.8Coefficient, one season aheadMain estimateMain estimate: 0.45 (95% CI 0.37 to 0.55); n = 1,651Log scale (nominal = cap-share)Log scale (nominal = cap-share): 0.67 (95% CI 0.57 to 0.77); n = 1,651Drop partial-pay outcomesDrop partial-pay outcomes: 0.43 (95% CI 0.34 to 0.52); n = 1,614Drop suspect-release (to 2021-22)Drop suspect-release (to 2021-22): 0.40 (95% CI 0.30 to 0.49); n = 1,260Benchmark from earlier seasonsBenchmark from earlier seasons: 0.47 (95% CI 0.38 to 0.57); n = 1,651Random-forest benchmarkRandom-forest benchmark: 0.47 (95% CI 0.38 to 0.57); n = 1,651Drop influential rowsDrop influential rows: 0.28 (95% CI 0.23 to 0.34); n = 1,540Refit benchmark in bootstrapRefit benchmark in bootstrap: 0.45 (95% CI 0.34 to 0.55); n = 1,651Median regression (post hoc)Median regression (post hoc): 0.09 (95% CI 0.06 to 0.13); n = 1,651

It adds little to a one-season forecast

Adding the benchmark to a regression on current salary and career stage moves mean absolute error from 2.66 to 2.65 points of cap (difference −0.003, 95% CI −0.065 to 0.061). Repeating this season's cap share scores 2.33 on the same metric.

Each forecast is made at the end of the origin season and trained only on pairs whose later salary was already known then. All four are scored on the same 1,325 player-seasons (2018-19 to 2021-22). The regressions are fitted by least squares, which targets the mean, while mean absolute error rewards the median. Refitted by median regression (post hoc) they score 2.35 (salary and stage), 2.31 (with the benchmark), 2.30 (with minutes and WAR), at or below repetition, so repetition's edge largely reflects the loss function. In that refit the benchmark lowers mean absolute error by 0.035 points (95% CI 0.022 to 0.049), a gain that is consistent but small. On root mean squared error, which weights large misses, the benchmark forecast scores 4.43 against 4.68 without it (a supplementary comparison added after the first run; 95% CI of the difference −0.33 to −0.15).

One season ahead

0123Mean absolute error, points of capRepeat current cap share2.33Current salary + career stage2.66+ salary benchmark2.65+ minutes and WAR2.61
012345Root mean squared error, points of capRepeat current cap share4.89Current salary + career stage4.68+ salary benchmark4.43+ minutes and WAR4.33

Two seasons ahead

012345Mean absolute error, points of capRepeat current cap share4.23Current salary + career stage4.38+ salary benchmark4.08+ minutes and WAR3.87
02468Root mean squared error, points of capRepeat current cap share6.95Current salary + career stage6.21+ salary benchmark5.62+ minutes and WAR5.45

Two seasons ahead, adding the benchmark to the salary-and-stage regression changes mean absolute error by −0.31 points (95% CI −0.51 to −0.09); against simply repeating current pay the difference is −0.15 (95% CI −0.42 to 0.13). Adding minutes and WAR instead of the benchmark changes it by −0.51 (95% CI −0.68 to −0.34).

Pay and production by years since debut

Among the most productive third of players each season, those 0–3 years from their debut averaged 4.5% of the cap; those 8+ years in averaged 17.9%.

0%5%10%15%20%012345678910+Years since NBA debutBottom third, 0 years since debut: 2.3% of the cap (95% CI 2.1–2.6), n = 237Bottom third, 1 years since debut: 2.3% of the cap (95% CI 2.0–2.5), n = 184Bottom third, 2 years since debut: 2.8% of the cap (95% CI 2.5–3.1), n = 116Bottom third, 3 years since debut: 3.6% of the cap (95% CI 3.1–4.2), n = 95Bottom third, 4 years since debut: 6.2% of the cap (95% CI 5.1–7.5), n = 57Bottom third, 5 years since debut: 6.8% of the cap (95% CI 5.2–8.4), n = 45Bottom third, 6 years since debut: 7.2% of the cap (95% CI 5.6–8.9), n = 37Bottom third, 7 years since debut: 9.6% of the cap (95% CI 7.6–11.8), n = 39Bottom third, 8 years since debut: 6.5% of the cap (95% CI 4.9–8.3), n = 34Bottom third, 9 years since debut: 7.1% of the cap (95% CI 5.3–9.4), n = 36Bottom third, 10+ years since debut: 7.2% of the cap (95% CI 5.8–8.7), n = 139Bottom thirdMiddle third, 0 years since debut: 2.7% of the cap (95% CI 2.3–3.1), n = 109Middle third, 1 years since debut: 2.6% of the cap (95% CI 2.3–2.9), n = 134Middle third, 2 years since debut: 2.9% of the cap (95% CI 2.6–3.3), n = 125Middle third, 3 years since debut: 3.8% of the cap (95% CI 3.3–4.4), n = 97Middle third, 4 years since debut: 8.1% of the cap (95% CI 6.7–9.6), n = 78Middle third, 5 years since debut: 9.0% of the cap (95% CI 7.6–10.4), n = 84Middle third, 6 years since debut: 10.0% of the cap (95% CI 8.5–11.6), n = 73Middle third, 7 years since debut: 9.7% of the cap (95% CI 8.1–11.4), n = 58Middle third, 8 years since debut: 10.5% of the cap (95% CI 8.6–12.4), n = 45Middle third, 9 years since debut: 11.4% of the cap (95% CI 9.2–13.8), n = 45Middle third, 10+ years since debut: 10.0% of the cap (95% CI 8.5–11.6), n = 169Middle thirdTop third, 0 years since debut: 3.4% of the cap (95% CI 2.7–4.3), n = 30Top third, 1 years since debut: 3.5% of the cap (95% CI 3.0–4.1), n = 71Top third, 2 years since debut: 3.6% of the cap (95% CI 3.0–4.2), n = 111Top third, 3 years since debut: 6.3% of the cap (95% CI 5.4–7.2), n = 121Top third, 4 years since debut: 15.1% of the cap (95% CI 13.7–16.5), n = 115Top third, 5 years since debut: 14.5% of the cap (95% CI 13.1–16.1), n = 97Top third, 6 years since debut: 15.4% of the cap (95% CI 13.9–17.0), n = 90Top third, 7 years since debut: 16.2% of the cap (95% CI 14.5–17.8), n = 79Top third, 8 years since debut: 18.0% of the cap (95% CI 15.7–20.3), n = 70Top third, 9 years since debut: 19.2% of the cap (95% CI 16.8–21.6), n = 59Top third, 10+ years since debut: 17.5% of the cap (95% CI 14.6–20.3), n = 176Top third
  • Bottom third of WAR (within season)
  • Middle third of WAR (within season)
  • Top third of WAR (within season)

Within a season, each win above replacement goes with 0.37 points of cap for players 0–3 years in (95% CI 0.28 to 0.47) and 1.52 for 8+ years (95% CI 1.36 to 1.67). This is descriptive: consistent with rookie-scale and restricted free agency rules, not proof of them. Because the salary model uses years since debut, it prices early-career players at early-career rates.

Where the 80% range fails: expensive players

On the held-out season the range held 14 of 26 salaries at 20–30% of the cap and 3 of 15 at 30% or more. In both tiers every miss was a salary above the range.

Actual salary tier (% of cap)Inside the saved rangeAbove the rangePer-quartile variant
<2% (min-level)95 of 114091 of 114
2-5%93 of 98082 of 98
5-10%57 of 67850 of 67
10-20%46 of 631748 of 63
20-30%14 of 261217 of 26
30%+ (max-level)3 of 15125 of 15

A variant with one width per quartile of the predicted salary (known at prediction time, calibrated on the validation seasons only) gives 17 and 5 in those tiers, with overall coverage 76.5%. The saved ranges are unchanged. That maximum contracts explain the misses is a hypothesis, not a fix. Actual-salary tiers are a diagnostic, never a calibration group.

What this does not show

  • No causal effect: nothing here identifies how pay responds to production, or whether any player was mispriced.
  • Selection: later salaries are observed for 87% of origins one season ahead; players who leave the data are missing, not zero.
  • The prospective forecast uses a benchmark re-selected each year with earlier seasons only; the association estimates use the site's benchmark, whose settings were tuned on seasons that overlap later outcomes.
  • Contract status, options, waivers and dead money are not observed. See Methodology & Data.