The 60-Second Version
LNet+ treats the player as the fundamental unit. College basketball doesn't play enough distinct 5-man lineups to rate lineups directly, so instead of fitting lineups we fit each player's offensive and defensive loading straight from every possession they're on the floor for - estimated jointly with everyone else out there. A team's rating is then the usage-weighted sum of its players' loadings. It's a hierarchical Bayesian model (Pyro / SVI). Net = offense + defense, in points per 100 possessions vs. an average opponent - the exact number the matchup sim runs on.
The Pipeline
- Possessions - from cached play-by-play we know, for every possession, the 5 players on offense, the 5 on defense, the points scored, plus the score margin and clock (for leverage).
- Joint Bayesian fit - stochastic variational inference estimates every player's off + def loading at once:
points ≈ baseline + Σ offense loadings − Σ defense loadings. Opponent quality is handled by conditioning on the 5 defenders actually on the floor - strength-of-schedule is per-floor, not a blanket team number. - Priors - returning players are seeded on last season's loading (shrunk); ranked freshmen are seeded by recruiting tier (RSCI); a fixed prior keeps thin-sample players from running wild; and each player's offensive loading is anchored to his own opponent-adjusted box production (the box prior, design #6).
- Team rating - usage-weighted sum of player loadings → the
cbb.team_strengthboard, the team-page LNet+ chip, and the possession sim.
Design Choices & Biases
The player is the unit - which dissolves lineup sparsity
CBB teams play too few distinct 5-man lineups to fit lineups directly (and bench units barely repeat). Estimating players instead pools every possession a player appears in, so even rarely-seen combinations contribute.
A player who only ever shares the floor with the same four teammates is still hard to separate from them - collinearity (see Limitations).
Lineup-level opponent adjustment, not team-level
Each possession conditions on the actual five defenders on the floor, so a player's rating is adjusted for exactly who guarded those possessions - not a single season-long team-defense number applied uniformly.
Small samples against specific lineups are noisy; the prior + leverage weighting absorb most of it.
Leverage-weighted, capped at 2×
Garbage time naturally fades out (intended). Late blowout minutes barely move a star's number.
Recency-weighted
Possessions decay with age (exp(−days/τ), τ ≈ 90 days), so the rating tracks the team a coach actually has now, not in November.
Very early season is prior-dominated until enough recent possessions accumulate.
Prior-season + recruiting priors
Returning players start near last year's loading (shrunk ~0.75); top-ranked freshmen start higher than walk-ons via tiered RSCI. Lets the preseason board mean something before any games tip.
Portal-era roster churn is hard to prior; incoming transfers are the rough edge.
Box-production prior - the collinearity attack
A pure floor-spacer who scores little but opens the court starts low and has to earn it back through the lineup fit - the prior under-rates him at tip-off.
Position-blind rating
The rating doesn't know guard from center - a +5 is a +5. Surfaces undersized rim creators and stretch bigs without a positional thumb on the scale. A derived position + offensive-role grouping now ships as a filter/comparison tool (leaderboard + player pages), but the rating itself stays blind.
Loses position context - a +5 means different things for a lead guard vs. a rim-running five.
Team-pooled player defense
Teammates share one defensive number - a genuine individual stopper on a deep team is undersold. On/off can recover some of it for rotation players (a follow-up); a never-sub star is unidentifiable on defense by any method.
Sign convention (positive = good, both sides)
Offense positive = points added per 100. Defense positive = points prevented per 100 (flipped so good always reads positive). Net = offense + defense.
None - display ergonomics.
Known Limitations (Will Lie To You)
- Lineup collinearity within a team. When four teammates rotate together nearly every possession, the model can't fully separate one's contribution from the group's. We attack it three ways: the player-as-unit approach, the zero-sum box prior (design #6) on offense, and team-pooling on defense (design #8, where it was worst). What remains is offensive collinearity on the very thinnest rotations - the main source of residual inflation.
- Full-game team prediction is roughly one-dimensional. For whole-game margins, the single rating is hard to beat - the component and matchup detail mostly wash out (we've confirmed this several ways). LNet+ earns its keep via injuries, lineup simulation, and player-level ratings, not by predicting team margins better than the one number does.
- Lineup data only exists from 2025 on. ESPN's pre-2025 play-by-play is missing reliable starter flags + substitutions, so we can't reconstruct who was on the floor for older seasons.
- Position-blind. Our box prior (design #6) is itself position-blind - no positional adjustment, where BPM-style box priors use one. Useful and lossy at the same time - see design choice #7.
- Sample-size gating. The player Impact panel grays out players below 300 total possessions ("Low Sample · Unreliable"), and goes 45% opacity under 100. The Impact tab on /cbb/players defaults to a 600-possession floor.
Reading the Numbers
- Net = +15 → this player adds 15 pts/100 (offense plus defense) vs. an average opponent. It's the same loading the matchup sim sums into a team rating.
- O-LNet+ = +8, D-LNet+ = +2 → offensive star on a roughly average defense. O-LNet+ is individual; D-LNet+ is his team's defense(team-pooled, design #8), so every teammate shares it. Read the two sides as separate stories before collapsing to Net.
- Sample size → possessions on the floor. A full-time starter is ~1,500+; trust those. Below ~500, treat with caution (and the UI grays the thinnest).
- The "v2 RAPM detail" panel → a separate, older metric kept for reference (it splits FG vs. FT and adds a havoc bonus). When it disagrees with LNet+, LNet+ is the canonical number.
What This Is Not
LNet+ measures on-floor scoring impact in the contexts a player actually played. It is silent on: full playmaking value (only partially credited - the box prior gives partial assist credit, but pure shot-creation for teammates isn't isolated), clutch shot-making in isolation (we weight by leverage but don't isolate close-and-late), leadership, scheme fit, or NBA transferability. A volume rim-attacker and a complementary screener can land at the same Net for very different reasons - which is exactly why the creator/receiver and position read ship as separate context on the player pages.
Does It Actually Work?
Backtested on the NCAA Tournament, the team ratings pick 68.9% of games straight up with a 0.192 Brier score and well-calibrated win probabilities (a 70% favorite wins ~70% of the time). Modern home-court edge is small (~2.5 pts) because 3-point variance dilutes it.