Calculating Position Player WAR, A Complete Example
One of the hallmark statistics available at FanGraphs is Wins Above Replacement (WAR) and we’ve just rolled out an updated Library entry that spells out the precise calculations in more detail than ever before. There’s always been a clear sense of the the kinds of things that go into our WAR calculation, but we’re never just dropped an equation in front of you and said, “Here!”
As of today, we’ve done that and I encourage you to go check out our basic primer on WAR and our detailed breakdown of how we calculate it for position players. If you’re a hands on learner, grab a pen and paper or spreadsheet and follow along. I’m going to walk you through a complete examples of how to calculate WAR for position players. Let’s use the 2013 version of Joey Votto as our exemplar.
The basic WAR equation is:
WAR = (Batting Runs + Base Running Runs + Fielding Runs + Positional Adjustment + League Adjustment +Replacement Runs) / (Runs Per Win)
You can simply go to the value section of his player page and find everything that goes into the numerator and go to the Guts! page to get Runs Per Win for the denominator, but that’s probably not why you’re here. Let’s break it down component by component.
Batting Runs
To calculate Batting Runs, you want Weighted Runs Above Average (wRAA) and then you want to park and league adjust it. So let’s start by calculating his wRAA, although you can also find this pre-calculated on the site.
To find his wRAA, you need his wOBA (.400), his PA (726), and some data about the league, specifically the league average wOBA (.314) and the wOBA Scale (1.277). Those values can be found here.
wRAA = ((wOBA – lgwOBA)/wOBA Scale) * PA
48.9 = ((.400-.314)/1.277)*726
On the site, it’s listed as 49.1, which is just a matter of rounding on the league constants. This will come up again, so keep it in mind. Some of the constants and park factors you see are rounded off so that the site isn’t a giant string of numbers. Try not to sweat it.
So if we have 48.9 wRAA, let’s now go through the process of adjusting it for his home park (Park Factor = 101) and for the National League. To do this, we need the MLB R/PA (.110), the NL non-pitcher wRC (9783), and the NL non-pitcher PA (86,959).
To convert wRAA into Batting Runs, you do the following:
Batting Runs = wRAA + (lgR/PA – (PF*lgR/PA))*PA + (lgR/PA – (AL or NL non-pitcher wRC/PA))*PA
46.3 = 48.9 + (.110 – (1.01*.110))*726 + (.110 – (9783/86959))*726
Again, the number listed on the site is 45.9, which is the the result of not rounding until the end, but no one wants to see strings of nine digits. We now have Votto with 46.3 Batting Runs Above Average.
Base Running Runs
Base Running (BsR) is the sum of Ultimate Base Running (UBR) and Weighted Stolen Base Runs (wSB). You can’t calculate UBR by hand because it requires video tracking data from Baseball Info Solutions, but we provide it on the site. You can calculate wSB, however. The equation is as follows:
wSB = SB * runSB + CS * runCS – lgwSB * (1B + BB + HBP – IBB)
-0.8 = (6*0.2) + (3*-0.384) – 0.0035*(120 + 135 + 4 -19)
League stolen base runs (lgwSB) is:
lgwSB = (lgSB * runSB + lgCS * runCS) / (lg1B + lgBB + lgHBP – lgIBB)
0.0035 = ((2693*0.2) + (1007*(-0.384))) / (28438 + 14640 + 1536 – 1018)
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
-0.384 = -1*(2 * (20255/130969) + 0.075)
Runs Per Out is simply runs scored in the season divided by outs in the season. This leaves us with a runSB of 0.2, a runCS of -0.384, and a lgwSB of about .0035 to use as constants in the wSB equation.
If we locate his UBR on the site (0.2) and add it to his wSB (-0.8) we arrive at -0.6 Base Running Runs Above Average. The site lists -0.5, again because of simple rounding differences.
Fielding Runs
FanGraphs uses Ultimate Zone Rating (UZR) for our fielding runs above average for each non-catcher position and Votto had a 2.2 UZR in 2013 at first base. That means he had 2.2 Fielding Runs Above Average in 2013.
Positional Adjustment
The positional adjustment allows us to compare players who played different positions, as fielding runs only compares players to the average player at their specific position. To calculate the positional adjustment for each player, you do the following:
Positional Adjustment = ((Innings Played/9) / 162) * position specific run value
-12.3 = ((1430.66/9) / 162) * -12.5
You can find the positional run values per 162 games here and we are left with Votto with -12.3 positional runs relative to league average.
League Adjustment
Adjusting for league only has a small impact on player value, but it is done so that each league has exactly zero Runs Above Average for hitting, fielding, base running, and position.
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
0.8 = (-1)*((-653.1 – 11.7 +74.0 +491.4)/92116)*726
This leaves us with a league adjustment for Votto of 0.8 runs above average.
Replacement Runs
So far we’ve been talking in runs above or below average, but now we need to shift and refer to Votto’s performance relative to replacement level. To do this, we start with 570 WAR (or 57% of the total 1,000 WAR) and multiply it by the number of games in the season divided by 2,430 because position players make up 570 WAR per 2,430 games. We then multiply that by Runs Per Win divided by League PA to convert WAR into runs per PA and then we multiple that by the player’s PA to determine their share of runs.
Replacement Level Runs = (570 * (MLB Games/2,430)) * (Runs Per Win/lgPA) * PA
20.7 = (570 * (2,431/2,430)) * (9.264/184873) * 726
This leaves Joey Votto with 20.7 replacement level runs.
Putting it all together
We’ve calculated all of the Votto specific numbers so far and need just one more piece of data. We need the MLB Runs Per Win, which is essentially the number of extra runs a team needs to score to add one win to their total. It varies yearly with the run environment and can be found here. For 2013, as we saw a moment ago, it is 9.264. The WAR equation listed at the top is as follows:
WAR = (Batting Runs + Base Running Runs + Fielding Runs + Positional Adjustment + League Adjustment +Replacement Runs) / (Runs Per Win)
6.2 = (46.3 – 0.6 + 2.2 – 12.3 + 0.8 +20.7) / (9.264)
You’ll notice his WAR comes out to 6.2 instead of the listed 6.1, which is a simple rounding issue because I didn’t type out the long chain of digits that go with each of the various constants.
So go ahead and try this yourself. It takes several steps because it’s an all-inclusive metric, but it’s all doable with basic addition, subtraction, multiplication, and division. No calculus or regression needed on your end. I’ll work on creating a file to share that does the arithmetic for you, but for now, you can use this post as a model for calculating WAR and as a framework if you want to vary the calculations in any way.
Think the positional adjustment is wrong? Think UZR isn’t trustworthy? Want to give more credit to hitters than 57%? Want to swap in RE24 for Batting and wSB? You can do all of these things now and work from the same WAR framework. Enjoy.
Questions? Ask them in the comments!
Neil Weinberg is the Site Educator at FanGraphs and can be found writing enthusiastically about the Detroit Tigers at New English D. Follow and interact with him on Twitter @NeilWeinberg44.
How do you arrive at 2431 MLB games, when there are only 2430 games every year in MLB?
In 2013 there was a game 163 between Tampa and Texas for the final playoff spot. MLB counts those as regular season games, not playoff games, so they count toward regular season stats, constants, etc.
My bad. I didnt check it was 2013. Thanks, Gabes.
This is great. It also seems like a good place to ask a question I’ve been wondering about for a while:
Why isn’t there a rate stat comparable to WAR?
WAR is fabulous as a counting stat, but when you want to compare two players who have played different amounts of time it requires adjustment. It’s easy enough to do this kind of adjustment on your own, but it still seems like a natural enough think for Fangraphs to include in its stats.
Should be “natural enough thing.”
I reckon you could divide WAR by innings or plate appearances or wtvr you want to get a an actual “production/participation” rate if you wanted to and compare to your hearts content. (Now granted , the resulting number would probably be out 7-10 decimal places, but you would have a pretty darn accurate number to compare.
EXAMPLE: Votto’s 2013 WAR was 6.1 if you divide that by 726 you get .008402 WAR per plate appearance, compare to Paul Goldschmidt who had 6.4 WAR in 710 PA’s for a WAR per PA of .00901
Yeah, you would just divide by PA or IP for your rate stat. More typically, we might express it as WAR per 600 PA or WAR per 200 IP or whatever. So it’s really more a matter of “is this something that would be useful to have listed on the site?” And your rec is noted!
Yep, it isn’t that hard to calculate on your own, but the same thing is true of a lot of stats on the site (WAR itself is just adding up a few other numbers and dividing by ~10). But at least for me, it comes up often enough to want an automated calculation.
Anyway, your noting of my rec is noted (and appreciated)!
I formally note Leo’s noting of neil’s noting.
What is the positional adjustment for pitchers hitting? Is it based on PA or IP? There was never a number thrown out here.
I know B-Ref calculates the positional adjustment for pithcers y-t-y based on their hitting stats so they arrive at replacement level as a group.
So how is this handled here at FG, Neil Weinberg?
I think it’s like 60 runs per 600 PA or thereabouts. I don’t think it changes every year. Can’t say for sure. Will have to look into it.
Well it seems like it changes year to year. The r² of batting runs and the pos. adj. for pitchers y-t-y is .98.
linear regression formula is:
pos.adj(wraa)=.86(wraa)-101.2
so if all the pitchers were lg avg hitters their pos. adj. would be something like -100 runs.
formula based on this:
http://www.fangraphs.com/leaders.aspx?pos=p&stats=bat&lg=all&qual=0&type=6&season=2014&month=0&season1=1999&ind=0&team=0,ss&rost=0&age=0&filter=&players=0
Yeah, you might be right. I’ll have to see.
The positional adjustment for pitchers is whatever it takes to zero out pitchers RAR on a plate appearance basis. Basically we assume that pitchers, as a whole, should have about 0 WAR as a positional player. It’s a little tricky to zero out completely, but it’s pretty close.
When a position player pitches, and let’s say, he gives up 6 runs, does that bring down his overall WAR?
It goes in as WAR as a pitcher. So you can find Adam Dunn or Danny Worth listed separately as pitchers with WAR from their time on the mound.