Methodology · 2026
How these statistics are computed
None of the constants on this site are copied from a published table. Run expectancy is measured from the season's own play-by-play, linear weights are derived from that measurement, and the wOBA scale is solved so that league wOBA equals league OBP — which is its definition, not an approximation. That makes every rate statistic era-correct automatically: a 1968 weight and a 2019 weight genuinely differ, because the run environments did.
Step 1 — Run expectancy
For every plate appearance we reconstruct the base-out state before the pitch by simulating each half-inning forward. Averaging the runs that actually scored from each state to the end of the inning gives the matrix below. Only innings that ended with three outs are counted; walk-off fragments would bias it downward.
| Bases | 0 out | 1 out | 2 out |
|---|---|---|---|
| Empty | 0.499 | 0.265 | 0.103 |
| 1st | 0.886 | 0.527 | 0.233 |
| 2nd | 1.159 | 0.671 | 0.316 |
| 3rd | 1.433 | 0.915 | 0.385 |
| 1st & 2nd | 1.541 | 0.895 | 0.437 |
| 1st & 3rd | 1.755 | 1.153 | 0.501 |
| 2nd & 3rd | 2.011 | 1.370 | 0.519 |
| Loaded | 2.448 | 1.605 | 0.731 |
Step 2 — Linear weights
The run value of an event is the change in run expectancy it causes, plus any runs that scored on the play: RV(e) = mean(runs + REafter − REbefore). Measured across 181,807 plate appearances:
| Event | Run value | Observations |
|---|---|---|
| home run | +1.4046 | 5,439 |
| triple | +1.0851 | 654 |
| fielders choice | +0.7783 | 392 |
| double | +0.7674 | 7,343 |
| single | +0.4704 | 25,607 |
| field error | +0.4448 | 1,021 |
| hit by pitch | +0.3504 | 2,085 |
| walk | +0.3309 | 15,539 |
| catcher interf | +0.3209 | 81 |
| intent walk | +0.1967 | 487 |
| sac fly | -0.0063 | 1,257 |
| sac bunt | -0.0369 | 645 |
Step 3 — wOBA weights
Shifting those values so a generic out is worth zero, then scaling so league wOBA equals league OBP, produces the weights actually used on every player page:
- wBB
- 0.725
- wHBP
- 0.748
- w1B
- 0.894
- w2B
- 1.254
- w3B
- 1.639
- wHR
- 2.026
League wOBA is .318, the wOBA scale 1.212, and league runs per plate appearance 0.1183.
Step 4 — Pitching
FIP uses the conventional (13·HR + 3·(BB+HBP) − 2·K) / IP + c, where the constant c is solved each season so that league FIP equals league ERA. For 2026 that gives league ERA 4.18 and a FIP constant of 3.10.
xFIP is left blank rather than approximated: it needs a league fly-ball rate that the box score does not carry, and inventing one would be worse than showing nothing. DRS and UZR are proprietary and are not reproduced here. Where a statistic cannot be computed honestly for a given era, it is empty rather than estimated.
Step 5 — dbWAR
The structure follows Baseball-Reference's position-player WAR: six run terms, five measured against league average and one measuring the distance from average down to replacement.
RAR = batting + baserunning + double plays + fielding + position + replacement
Five of the six are computed here. Fielding is not, and that is the honest headline of this section rather than a footnote to it — see below. Where B-R states a constant, it is measured here from this season's own play-by-play instead, because the run expectancy matrix in step 1 already contains what those constants summarise, and measuring keeps them era-correct rather than fixed at a modern average.
Replacement level
Replacement level used to be the one number on this site that was stated rather than solved. It is now an identity, and B-R's: a team of replacement players wins .294 of its games, so a season has team-games × (.500 − .294) wins above replacement to distribute — 1,001 across a full 30-team, 162-game season, and 990 across the 2026 games played so far. Nothing special-cases a short season: 2020's sixty games come to 370, which is what B-R publishes for that year. Position players take 59% of them and pitchers the rest, B-R's split, from what free-agent hitters and pitchers are paid.
The runs that implies are now an output. Solving so that position players end the season holding their share gives 18.6 runs per 600 plate appearances, against the 20.5 B-R publishes. The gap is not noise: with no fielding term, this WAR has fewer runs to spread over the same number of wins.
Measuring the marginal pool directly instead — everyone under 130 plate appearances, pitchers excluded — gives 27.3, and using it would be worse: a player gets few plate appearances precisely when he hits badly in them, so the pool measures failed auditions rather than available talent. It is published as marginal_runs_per_600 beside the identity it did not replace.
The five terms
- Batting — wRAA, from the weights in step 3.
- Ballpark — runs debited or credited for where the games were played. The park factor compares home scoring to road scoring, and a season is played half at home, so the effective multiplier is the mean of the park and a neutral road. Across a league it nets to zero: it moves value between players rather than creating it.
- Baserunning — stolen-base runs against the league rate, with the cost of being caught derived from this season's own runs-per-out. B-R's baserunning also credits going first-to-third, tagging up and being thrown out on the bases; ours does not yet.
- Double plays — B-R's definition of an opportunity, exactly: an infield ground ball with a runner on first, fewer than two out, at least one out recorded, not scored a hit. There were 7,356 of them in 2026 and 42.6% became two. Beating that rate pays 0.522 runs a double play, measured as the gap between an opportunity that stayed one out and one that did not — where B-R states 0.44 and notes it moves with the run environment.
- Position — B-R's current adjustment (catcher +9, shortstop +7, down to first base −9.5 and designated hitter −15), weighted by plate appearances taken at each position, which is what B-R does too. The league total is then re-centred to zero, so the adjustment moves runs between players without moving the league's total. Pitchers are the exception: their adjustment is solved, set so that pitchers as a group are worth zero WAR as hitters.
Pitchers use FIP against a replacement baseline that sits further below average for starters than for relievers, because a replacement arm is easier to find for one inning than for six. That shape is stated; the level it scales to is solved from the same identity, so the two halves of the league add up to the whole rather than to whatever they happened to come to.
Runs become wins through PythagenPat rather than a flat ten. At 4.48 runs per team per game, 2026 converts at 9.59 runs to the win — the rule of thumb of 10 is this model evaluated at a 4.5 R/G league, and it stops being right as soon as the run environment moves.
No fielding runs. This is the one component of B-R's recipe that cannot be reproduced here. From 2003 onward — every season this archive covers — B-R uses Defensive Runs Saved, which is Sports Info Solutions' proprietary system and rests on trained scorer observations no public feed carries. Total Zone, which B-R uses before 2003, is a published method but a pre-2003 one. So a position player here is batting, baserunning, double plays and position, which understates good defenders and flatters bad ones by however much their glove was worth. Expect the gap against bWAR to be roughly the size of a player's fielding runs, and no smaller.
Baserunning is steals only. The feed does carry every runner's origin and destination and the fielder credited with the ball, so first-to-third and outs on the bases are computable; they are not extracted yet.
Sources
Method follows Tango, Lichtman & Dolphin, The Book: Playing the Percentages in Baseball (2007), chapter 1. Historical play-by-play comes from Retrosheet, player identity from the Chadwick Bureau register, and season aggregates are cross-checked against the Lahman database.