Calculating Position Player WAR, A Complete Example by Neil Weinberg September 19, 2014 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!