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!



Print This Post

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.


newest oldest most voted
AC_Butcha_AC
Member
AC_Butcha_AC

How do you arrive at 2431 MLB games, when there are only 2430 games every year in MLB?

Gabes
Guest
Gabes

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.

AC_Butcha_AC
Member
AC_Butcha_AC

My bad. I didnt check it was 2013. Thanks, Gabes.

Leo
Guest
Leo

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.

Bravos4evr
Guest
Bravos4evr

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

Leo
Guest
Leo

Should be “natural enough thing.”

AC_Butcha_AC
Member
AC_Butcha_AC

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?

David Appelman
Admin
Member

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.

David
Guest
David

When a position player pitches, and let’s say, he gives up 6 runs, does that bring down his overall WAR?