CBB · Methodology

LNet+ - How It Works

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

  1. 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).
  2. 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.
  3. 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).
  4. Team rating - usage-weighted sum of player loadings → the cbb.team_strength board, the team-page LNet+ chip, and the possession sim.

Design Choices & Biases

#1

The player is the unit - which dissolves lineup sparsity

Why

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.

Bias

A player who only ever shares the floor with the same four teammates is still hard to separate from them - collinearity (see Limitations).

#2

Lineup-level opponent adjustment, not team-level

Why

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.

Bias

Small samples against specific lineups are noisy; the prior + leverage weighting absorb most of it.

#3

Leverage-weighted, capped at 2×

Why
Each possession is weighted by its win-probability swing - close-and-late counts more than a 25-point blowout - and the weight is capped at 2.0× so no single shot can dominate a season.
Bias

Garbage time naturally fades out (intended). Late blowout minutes barely move a star's number.

#4

Recency-weighted

Why

Possessions decay with age (exp(−days/τ), τ ≈ 90 days), so the rating tracks the team a coach actually has now, not in November.

Bias

Very early season is prior-dominated until enough recent possessions accumulate.

#5

Prior-season + recruiting priors

Why

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.

Bias

Portal-era roster churn is hard to prior; incoming transfers are the rough edge.

#6

Box-production prior - the collinearity attack

Why
Before the lineup fit runs, each player's offensive loading is anchored to his OWN box production - points scored over what an average-efficiency player would manage on the same shot volume, plus partial assist credit. It's zero-sum (separates teammates without inflating the team total), and the production baseline is opponent-adjusted - judged against the defenses he actually faced, so a soft schedule doesn't pad it. Two players who always share the floor now start from different places, so the regression can finally pull them apart.
Bias

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.

#7

Position-blind rating

Why

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.

Bias

Loses position context - a +5 means different things for a lead guard vs. a rim-running five.

#8

Team-pooled player defense

Why
Individual defense isn't identifiable from play-by-play - we don't know who contested a shot. A star who never subs would otherwise absorb his whole team's defensive credit (one mid-major guard read +10/100 on defense - best-in-country territory - on a merely-decent defense; collinearity, not skill). So each player's DEFENSIVE number is pooled to his team's average; OFFENSE stays fully individual. The team ratings + matchup sim still run on the full lineup-level fit (defense is conserved at the team level), so only a single player's defensive read changes - and a tough-schedule star like Boozer jumps from ~#47 to the top-15.
Bias

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.

#9

Sign convention (positive = good, both sides)

Why

Offense positive = points added per 100. Defense positive = points prevented per 100 (flipped so good always reads positive). Net = offense + defense.

Bias

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.

See the leaderboard →