Wins Above Replacement (WAR), FanGraphs’ hallmark statistic, attempts to estimate a player’s total value relative to a free available player, such as a minor league free agent. Below is a breakdown of exactly how we calculate WAR for position players. If you would like to learn about WAR for pitchers, you can find the necessary details over at this Library page (which will be updated shortly) and if you want to know about WAR in general and how to use it, check out this page. Below is the method for calculating WAR for position players.
Compared to WAR for pitchers, calculating position player WAR is a walk in the park. It’s simpler, both conceptually and mathematically, and it’s relatively straightforward to calculate. WAR combines a number of inputs, but all of which are available on the site. The overall equation for WAR is:
WAR = (Batting Runs + Base Running Runs + Fielding Runs + Positional Adjustment + League Adjustment +Replacement Runs) / (Runs Per Win)
We will consider each aspect of the equation in turn, but the basic structure is that we take Batting, Base Running, and Fielding runs above average, add in a positional adjustment, a league adjustment, and then add in runs so that we are comparing to replacement level instead of average. That provides use with Runs Above Replacement (RAR), which we convert to WAR by dividing it by Runs Per Win. RAR and WAR communicate the same thing on different scales.
Below you will find a section on each of these components as well as links to entries that relate to those parts of the calculation. It would be unwieldy to included everything about how we calculate the precise value of taking an extra base in this post, for example, but the links will fill in the gaps. Also, on the site we have a statistic called Off which is Batting + Base Running and Def which is Fielding + Positional Adjustment.
To calculate Batting Runs Above Average you only need to know three things about a player and several things about the league in general. You need the player’s wOBA, PA, and home park factor and you need League Average wOBA (lgwOBA), the wOBA Scale, MLB R/PA (lgR/PA), and the specific league (AL or NL) wRC and PA for non-pitchers. League wOBA, wOBA Scale, and R/PA can be found here. Park Factors can be found here and wRC and PA for the leagues can be found using the leaderboards.
The first step is to find Weighted Runs Above Average (wRAA) from the player’s wOBA, or you may simply find their wRAA on FanGraphs. To calculate their wRAA, do the following:
wRAA = ((wOBA – lgwOBA)/wOBA Scale) * PA
wRAA is simply a non-adjusted Batting Runs. To adjust wRAA for park and league, you do the following with the park factor expressed as a decimal (i.e. 0.95 for 95):
Batting Runs = wRAA + (lgR/PA – (PF*lgR/PA))*PA + (lgR/PA – (AL or NL non-pitcher wRC/PA))*PA
Essentially, you are talking wRAA and adding or subtracting in runs based on their home park and their league.
Base Running Runs
Base Running Runs (BsR) at FanGraphs is the combination of Ultimate Base Running (UBR) for non-stolen base type base running, Weighted Stolen Base Runs (wSB) for stolen base and cost stealing value, and Weighted Grounded into Double Play Runs (wGDP) for runs added or subtract due to a hitters knack for avoiding or hitting into double plays. UBR and wGDP are statistics developed by Mitchell Lichtman and provided to FanGraphs. You won’t be able to calculate UBR yourself because it requires video tracking data from Baseball Info Solutions, but wGDP is essentially a comparison between a player’s expected number of double plays and their true number of double plays measured in runs. Check it out here.
Base Running = UBR + wSB + wGDP
You can calculate wSB yourself, however. The calculation is as follows:
wSB = SB * runSB + CS * runCS – lgwSB * (1B + BB + HBP – IBB)
League stolen base runs (lgwSB) is:
lgwSB = (lgSB * runSB + lgCS * runCS) / (lg1B + lgBB + lgHBP – lgIBB)
As with all linear weights-based metrics, the runs values are estimates. In this case, the run value of a stolen base is set at .2 runs for all seasons. The run value of a caught stealing changes from year to year to reflect the changing value of runs and outs over the season.
runCS = 2 x RunsPerOut + 0.075
Taking the value of a player’s stolen base runs and their runs on the bases in other situations provides us with the player’s base running runs above average.
For fielding runs above average, we use Ultimate Zone Rating (UZR) for all non-catchers. UZR is calculated using video tracking data from Baseball Info Solutions as developed by Mitchell Lichtman. You can read about UZR here and about defensive statistics more generally here.
For catchers we use the Stolen Base Runs (rSB) aspect of Defensive Runs Saved and Runs Saved on Passed Pitches (RPP) because there is no UZR for catchers. We currently do not include framing runs in WAR for catchers, and catcher defense is admittedly the most difficult to measure in general.
Fielding runs above average are relative to positional average, so a +10 first baseman is 10 runs better than the average first baseman and a +5 shortstop is five runs better than the average shortstop. For players who play multiple positions simply add their fielding runs from all positions.
The positional adjustment is necessary for putting all defensive positions on the same scale. Fielding runs are relative to position average, but we need to include the fact that it is harder to play average shortstop than it is to play average first base. As a result, we add an adjustment for this.
Here are the full FanGraphs positional adjustments used in WAR:
Catcher: +12.5 runs (all are per 162 defensive games)
First Base: -12.5 runs
Second Base: +2.5 runs
Third Base: +2.5 runs
Shortstop: +7.5 runs
Left Field: -7.5 runs
Center Field: +2.5 runs
Right Field: -7.5 runs
Designated Hitter: -17.5 runs
A defensive game for these purposes is simply nine innings played at that position. So to calculate the positional adjustment:
Positional Adjustment = ((Innings Played/9) / 162) * position specific run value listed above
If a player has played multiple positions, you simply calculate the adjustment separately and add them together. The run value of the positional adjustments are based on empirically derived comparisons from a number of years ago. It is entirely possible that the positional adjustments could change over time, so it is important to understand that these are estimates.
The league adjustment is a small correction to make it so that each league’s runs above average balances out to zero. Each league’s Batting Runs + Base Running Runs + Fielding Runs + Positional Adjustment often total to something slightly different from zero. The league adjustment fixes this and has a very tiny impact on player value.
To find the league adjustment find the league specific values (AL or NL) and do the following:
League Adjustment = ((-1)*(lgBatting Runs + lgBase Running Runs + lgFielding Runs + lgPositional Adjustment) / lgPA)*PA
This will tell you how many extra runs you need to add to the entire league per PA and then you multiply that by the specific player’s PA. This will add between 0 and 5 runs to a player’s value per season based on their league and PA.
Replacement Level Runs
So far, all of the components have been relative to league average. However, using average is not an ideal baseline because being an average player has value and because using Wins Above Average would not allow you to distinguish between a player who had one PA and a player who had 600 average PA. To this end, we compare players to replacement level, which you can think of as a freely available player such as a minor league free agent or very poor MLB bench player.
FanGraphs and Baseball-Reference have the same replacement level (1,000 WAR per 2,430 games played) and we allocate 57% of the WAR to position players and 43% to pitchers.
To that end, calculating replacement level runs proceeds like this.
Replacement Level Runs = (570 * (MLB Games/2,430)) * (Runs Per Win/lgPA) * PA
That 570 represents the 57% of 1,000 available WAR, which you multiply by the percentage of total games played to that point in the season. Then you multiple that by the runs per win value divided by PA to put it on a scale of runs per PA, and then you multiply that by the number of PA the player had that year.
Essentially, you are calculating the difference between a replacement level player and an average player in that season given the number of PA.
Runs Per Win
Runs per win is the value that allows us to convert runs to wins. It is based on the run environment and is usually between 9 and 10. The empirical derivation isn’t useful here, but the process reflects the average number of runs a team needs to score in order to add one win to their total. You can find the values for each year here.
● WAR is park and league adjusted.
● WAR is context neutral, meaning players do not get additional credit for hitting with men on base or in high leverage situations.
● WAR is an estimate of value and should be treated as the center of a range of possibilities rather than a precise measure.
● If you apply this method, you may not return the exact same result that is shown on the site. This is because of rounding. Our park factors carry on for more digits than just the two or three that are shown, as does the R/PA, etc. You’ll never miss by more than a run or so if you do the calculation properly, but if you get a 6.1 WAR and we list 6.0 WAR, it is almost certainly just a function of rounding.
Below you can also find links to the original WAR series. Some of the specifics have changed since then, but they are still quite useful if you have additional inquiries. WAR for Position Players introduction series: