A technical specification of every rating system on this site, written so a data analyst can check the math against the code (scraper/ratings.py, scraper/forecast.py, scraper/backtest.py). Notation is consistent throughout; known approximations are stated explicitly.
1 · Data & notation
The input is the set of completed Division I women's volleyball matches for a season. For match k we observe home team h(k), away team a(k), and set counts hs(k), as(k); the set margin is m(k) = hs(k) − as(k) and the home team wins iff hs(k) > as(k). Ties are impossible (best-of-5). We also observe each set's point score, so for match k the point differential pd(k) = points_home(k) − points_away(k) (summed across sets) and each team's point percentage are available; the margin models (PAVE, Massey) fit pd and PABLO fits point%, on 99% of games. For a team i, w(i)/l(i) are raw wins/losses, and O(i) is the multiset of its opponents (an opponent played twice appears twice). Neutral sites are detected geographically: each team's home city is the most common venue among its home games, and any match whose venue city matches neither team is flagged neutral (about 16% of games) - those get no home-court term in any model. Venue coverage is complete for the current season and partial for older ones.
2 · Turning a rating into a win probability
Every model produces a team rating r(i). To predict a game and to score accuracy we map the rating gap to a probability with a logistic link:
P(home win) = σ(α·(r_h − r_a) + β), σ(x) = 1 / (1 + e^−x)
α (slope) and β (home-court intercept) are fit by gradient descent on past games. This same calibration is used by the forecast to simulate remaining games and by the backtest in §11.
3 · RPI - Rating Percentage Index
The NCAA's official index. Location-weighted winning percentage plus two strength-of-schedule terms. A home win contributes weight 0.6, a road win 1.4 (and symmetrically, a home loss 1.4, a road loss 0.6):
WP(i) = Wʷ(i) / (Wʷ(i) + Lʷ(i)) # weighted win %
OWP(i) = mean over o∈O(i) of rawWP(o) # opponents' win %
OOWP(i) = mean over o∈O(i) of OWP(o) # opponents' opponents'
RPI(i) = 0.25·WP(i) + 0.50·OWP(i) + 0.25·OOWP(i)
Approximation: the exact NCAA OWP excludes the games played against i when averaging an opponent's record. We use the opponent's full raw win percentage. The effect is small and systematic; it does not change the qualitative ordering. Margin is ignored entirely, so RPI cannot be gamed by running up scores.
4 · KPI - Kevin Pauga Index (approximation)
A resume metric: every game is scored on [−1, +1] and the rating is the season average. Opponent quality is q(o) = 0.6·rawWP(o) + 0.4·OWP(o) ∈ [0,1]. For a game with set margin m:
win: s = clip( q + loc_w + 0.02·(m−2), 0, 1), loc_w = +0.05 road, −0.03 home
loss: s = clip( −(1−q) + loc_l − 0.02·(m−2), −1, 0), loc_l = +0.05 road, −0.05 home
KPI(i) = mean of s over i's games
Approximation: the official KPI is proprietary and also incorporates possession pace and opponents' KPI rank. This is a transparent stand-in built from quality, margin, and location only.
5 · PAVE - Point-Adjusted Volleyball Efficiency
Ridge-regularized least squares on point differential - the true Massey "point-spread" input. Stack one row per game into design matrix X: +1 in the home team's column, −1 in the away team's column, +1 in a home-court column; target y(k) = points_home(k) − points_away(k) (the sum of a team's set points across the match). Solve the penalized normal equations:
β = (XᵀX + λ·I′)⁻¹ Xᵀy (I′ penalizes team columns, not the home-court term)
r(i) = β(i) − mean(β) # ratings centered to 0; last β = home-court value
Ridge shrinkage stabilizes teams with few or lopsided games and prevents undefeated/winless blow-ups. It fits point differential, so a decisive 3-0 counts more than a five-set nail-biter; because volleyball scoring is capped (sets to 25, win by two; best-of-five), that margin is tightly bounded and reflects genuine dominance rather than run-up-the-score gaming - the sportsmanship objection common to margin models in other sports barely applies here. Point differential is a sharper signal than set margin: a backtest confirms it (point-based Brier .154 vs set-based .165 for the same model).
Adaptive regularization. A ridge sweep on point data shows accuracy improves monotonically as λ falls (Brier: λ=8→.165, λ=2→.158, λ=1→.156, λ=0=Massey→.153): the penalty that stabilizes thin early-season data costs accuracy once a full slate is in. PAVE therefore uses a sample-size-dependent penalty that starts strong and decays to zero as games accrue, with gpt = average games per team:
λ(gpt) = 8·exp(−gpt/6) # ≈8 preseason · ≈3 quarter-season · ≈0.6 midseason · ≈0 full slate
Decaying λ all the way to 0 lets PAVE reach the pure-least-squares (Massey) ceiling at a full slate (.153) while still holding a strong penalty when only a few games are in; across the 2025 backtest PAVE's Brier improves from .156 to .154. PAVE and Massey are the same model - PAVE is the version that is also stable in the opening weeks.
Open question - for reviewers
PAVE is used two ways on this site: as a predictor (the forecast engine) and as a candidate selection/seeding criterion. Adaptive λ is unambiguously right for prediction. But if PAVE were an official selection metric, a changing regularization parameter means the rule itself shifts week to week - a team's rating can move because the penalty moved, not because it played. Two defensible positions: (A) hold λ fixed at a single principled value (e.g., the full-season optimum) for the whole season and simply decline to publish or use the metric until the sample is large enough to be stable - the rule never changes, at the cost of no early-season number; or (B) let λ adapt so the metric is as accurate as the data allows at every point in the season - best accuracy throughout, at the cost of a time-varying rule. Prediction favors (B); a selection criterion may favor (A). We currently adapt (B); we would value an analyst's view on whether a published selection metric should instead fix λ and gate on sample size.
6 · Massey - least-squares point margin
Identical construction to PAVE with λ → 0 (ordinary least squares on point differential, plus 1e−6·I for numerical stability). This is the canonical Massey "point-spread" method - the maximum-likelihood margin model under Gaussian errors; PAVE is its regularized cousin. At a full slate it is the single most accurate model on this page.
7 · PABLO - point-percentage rating
Rich Kern's PABLO, built the way he defines it: from each match's point percentage, not its win or loss. For a game, the home team's game score is 25650·(pt% − ½), where pt% = points_for / (points_for + points_against), capped at about ±2500 (~59%) so a single blowout can't dominate. A team's rating iterates to the recency-weighted average of (opponent rating + its game score), discounted 200 points for home court and centered at 5000:
gameScore(i,g) = clip( 25650·(pt%(i,g) − ½), ±2500 ) # blended lightly with a win/loss score
r(i) ← weighted_mean over g of [ r(opp) + gameScore(i,g) ∓ 200 ] # recency: 42-day half-life
Opponent adjustment lets the field spread well past the per-game cap - beat a 7000-rated team by 59% and you land near 9500. Because point% is capped and win-by-two, the score-running incentive is minimal. It needs a connected schedule to rate everyone. (Our earlier build used a win/loss Bradley-Terry stand-in; this is now the real point% method.)
8 · Elo - sequential win/loss
Games are processed in date order; after each, both ratings update toward the result. Home edge H = 55 Elo points, update rate K = 40:
E_home = 1 / (1 + 10^((R_a − R_h − H)/400))
R_h ← R_h + K·(S − E_home), S = 1 if home wins else 0 (away updates symmetrically)
Order-dependent and margin-free; naturally rewards finishing strong, and can lag a fast-improving team.
9 · WAB - Wins Above Bubble
A resume/access metric. Let b be the Elo rating of the team at the at-large cut line (rank 45). The expected number of games a bubble-quality team would win on i's exact schedule is the sum of neutral-court win probabilities against each of i's opponents:
expBubble(i) = Σ over o∈O(i) of 1/(1 + 10^((Elo(o) − b)/400))
WAB(i) = actualWins(i) − expBubble(i)
It answers "how many more games did you win than a bubble team would have, playing what you played?" - excellent for selection, weaker for seeding, and it gives no credit for a hard schedule you keep losing.
10 · MERIT - our balanced selection metric
Every metric above answers one of the two questions a selection committee weighs. The quality models (PAVE, Massey, PABLO, Elo) ask how good are you; the resume metrics (RPI, KPI, WAB) ask how much did you earn. Picked in isolation, each has a failure mode: seed purely by quality (PAVE) and a genuine 25-win mid-major that never drew an elite opponent can miss the field despite doing everything asked of it; select purely by resume (WAB) and - validated on 2023-25 - the field floods with mid-majors whose gaudy records never beat anyone good. MERIT is built to weigh both at once.
Construction is deliberately simple and transparent: take two ratings already defined on this page, PAVE (§5) and WAB (§9), put them on a common scale by standardizing each across the ranked D1 field, and add a fractional weight of resume onto quality:
z(x)_i = (x_i − mean_D1(x)) / stdev_D1(x) # standardize over ranked teams
MERIT(i) = z(PAVE_i) + w · z(WAB_i), w = 0.4
Quality leads (weight 1.0); resume adjusts (weight w = 0.4). A team is rewarded for being genuinely good and for banking wins that a bubble team wouldn't - but a hollow record against weak opposition scores near zero on both terms, so it cannot buy its way in.
Choosing the weight. We swept w from 0 (pure PAVE) upward and scored two things on each of the 2023, 2024 and 2025 seasons: out-of-sample Brier (does the blend still predict?) and mid-major at-large count (does it open access without flooding the field?). The count of mid-major at-large bids rises monotonically with w - roughly 2 bids at w=0, ~3 at w=0.3-0.4, climbing toward WAB's ~8 as w grows - while Brier degrades only slightly across that low range. We fixed w = 0.4 as the point that admits the deserving 25-win mid-major (about one extra bid over pure quality) while holding predictive accuracy well inside the pack and keeping empty records out. The choice is a transparent value judgment, published so it can be argued with - not a hidden tuning.
Scheduling incentives. Because quality dominates, MERIT keeps the property RPI lacks: a marquee top-25 vs top-25 game is worth playing, since a competitive loss to an elite team barely dents the PAVE term. The 0.4 resume term adds a second, aligned incentive - bank the winnable games against tournament-caliber opponents - without rewarding cupcakes, which carry ~0 WAB. The Scheduling tab shows MERIT's marginal-value curve tracks PAVE's with a modest upward resume tilt, so it steers toward the ambitious-but-winnable slates the sport wants.
MERIT scores a Brier of 0.163 - 4th of the eight models and comfortably ahead of every pure resume metric (RPI .177, WAB .182, KPI .185) despite being resume-aware itself. On this site MERIT is the default selection metric (who makes the 64-team field) while PAVE, a touch sharper as a pure predictor, is used for seeding (the order). Selection sets who's in; seeding sets the line.
Open question - for reviewers
MERIT hard-codes a single resume weight w = 0.4 and z-scores over the full ranked D1 field. Two choices are worth challenging. First, the weight: 0.4 encodes a specific answer to "how many mid-majors should an at-large process admit?" - a values question as much as a statistical one, and a committee might legitimately prefer 0.3 or 0.5. Second, the standardization pool: z-scoring over all ranked teams means a team's MERIT can shift slightly as the field's spread changes, even week to week - the same time-varying-rule concern raised for PAVE's adaptive λ in §5. A fixed historical scale would freeze the rule at the cost of drifting from the current field. We currently standardize on the live field; we'd value a reviewer's view on both the weight and the pool.
11 · Predictive accuracy - backtest & Brier
Accuracy is measured out-of-sample. Games are sorted by date and split at three calendar cutoffs (70 / 78 / 86 % of match-days). For each split: (a) fit every model's ratings on the training games only; (b) fit the logistic calibration of §2 on the training games; (c) predict each held-out game where both teams have ≥ 5 training games; (d) score with the Brier score, the mean squared error of the probability forecast:
Brier = (1/N) · Σ (p_k − y_k)², y_k = 1 if home won else 0 (lower is better)
Results are averaged across the three splits (5,094 games, home-win base rate 0.584). The naive baseline predicts the constant home-win rate for every game.
| # | Model | Brier | vs. baseline |
| 1 | Massey | 0.153 | −36% |
| 2 | PAVE (adaptive λ→0) | 0.154 | −36% |
| 3 | PABLO | 0.158 | −34% |
| 4 | MERIT (selection blend) | 0.163 | −32% |
| 5 | RPI | 0.177 | −26% |
| 6 | WAB | 0.182 | −24% |
| 7 | Elo | 0.183 | −24% |
| 8 | KPI | 0.185 | −23% |
| baseline (home base rate) | 0.240 | - |
All eight beat the baseline by 23-32 %. Margin-aware models (Massey, PAVE) predict best; the resume metrics (WAB, KPI) predict least well - expected, since they are built to reward what happened rather than to forecast. Reproduce with python scraper/backtest.py.
12 · Known limitations
Neutral sites are detected from published venue data (venue city vs each team's home city) and drop the home-court term in every model - complete for the current season, partial for older ones (~1-2% flagged there vs 16% when fully covered). PAVE/Massey fit point differential and PABLO point percentage; a per-rally model would be marginally sharper still. RPI's OWP/OOWP use the full-record approximation of §3. KPI is a public approximation of a proprietary formula. None of these change the qualitative conclusions, but they are the first places a reviewer should probe.