Skip to content

Looking At FanGraphs’ Position Player WAR

September 19, 2010

Really, the last thing I want to do right now is write about the Giants.  Heading in to today, they were ahead of the Padres by half a game, and this was after being shut out by Randy Frickin’ Wolf.  Now they’ve lost 2-1 to Yovani Gallardo- which is, to be honest, somewhat expected- and that lead is gone.

I was over at FanGraphs’ forum earlier tonight, and there was a thread in which a poster asked how WAR is calculated.  Since nobody picked it up, I jumped in and gave step-by-step instructions.  I thought I’d re-post it here, along with some comments:

I’ll use MLB 2009 as an example to explain WAR for hitters (pitcher hitting is included; sorry for being a bit lazy):

1. Find the league runs per out. This is defined as (Runs/IP*3). You’ll get .173. This is how you get your run values.

2. The run values are as follows:

NIBB = R/O + .14 = .31
HBP = NIBB + .025 = .34
1B = NIBB + .155 = .47
2B = 1B + .3 = .77
3B = 2B + .27 = 1.04
HR = 1.40
SB = .20
CS = -1*(2*R/O + .075) = -.42

3. Multiply the run values by the frequency of the event, and then divide by (AB – H + SF) *-1. This is the value of the out.

4. Apply these coefficients to the player’s batting line. Let’s say we have +65.4 runs for Albert Pujols in 700 PA. Divide the +65.4 into his PA, for +.093 runs per PA. Multiply this by his intentional walks (44) and his sacrifice hits (0), and then add this to the original total. This gives you +69.5 runs above the average.

Right off the bat, you may be thinking “this doesn’t look anything like wRAA” (which is FanGraphs’ run estimator of choice for WAR).  That’s because it’s hidden.  Add the run value of the out (in this case, 0.27).  We do this in order to absorb the value of the out in the numerator, so we can rewrite it as a rate.  This gives us coefficients of .74 for the single, 1.04 for the double, etc. (SB/CS remain untouched, however, because they’re not batting events).  Multiply by the frequency of the event, and divide by plate appearances sans the intentional walk.  This gives you something like .270.  Solve for the OBP scale- let’s say you want .330 as your average- so Scale = .330/.270 = 1.22.  Multiply the coefficients by the scale and you have your wOBA equation:

wOBA = (.72*NIBB + .75*HBP + .90*1B + 1.27*2B + 1.60*3B + 2.04*HR + .24*SB – .51*CS) / (PA – IBB)

wRAA (Weighted Runs Above Average), then, would be (wOBA – League wOBA) / Scale * PA.  In this case, League wOBA is .330 and the Scale is 1.22.  I’m actually a bit bothered by the fact that FanGraphs doesn’t point this out- the value of the scale isn’t always 1.15, as Dave Cameron writes.  It’s probably closer to 1.18-1.22.  People commonly cite 1.15, because it’s the value listed in The Book.  But because it’s so dependent on the run environment/the scale you want to reach, it’s going to vary quite a bit.  Anyways, when we divide by the scale, we put it back to runs above the out- and when you multiply it by plate appearances, then you have total runs above average.  What I did in step four is what Terpsfan suggested to me in one of my older posts a while back- we treat the run value of an intentional walk and a sacrifice hit as equal to the player’s overall rate of performance.  This is because the player has no control over being intentionally walked (that’s the choice of the opposition) or a sacrifice hit (the choice of the manager).  So we assume he’ll perform the same in those plate appearances as he would in all others.

I’m actually not a big fan of the way FanGraphs calculates their batting runs.  That’s not because it’s not a sound design- it is.  Linear Weights are the ideal method for assessing an individual player’s offense.  But the way they generate the weights is exceptionally lazy, in my opinion.  The “proper” way of going about this would be to use the “value-added” method, by looking at the average change in run expectancy per event.  They have the data at hand.  What they’re doing is approximating the weights based on assumptions of what the weights should be.  All in all, we’re probably not going to see a huge difference between empirically-derived weights and these- but I’d rather be more theoretically accurate than work with assumptions that won’t always hold up.  Also, I’m of the opinion that ROE should be included.  For some players, we’re talking about +/- five runs per season- and for a guy like Derek Jeter, who has accumulated approximately 35 runs over the course of his career by reaching base on an error- is being shorted about 3.5 wins off of his career value.

The beautiful thing about WAR is that it’s a framework, and the components can be altered.  But for a site like FanGraphs, which is often cited for their WAR, it would behoove them to try and tighten up their run estimator a bit.

5. Apply a park factor. I’m not sure how FanGraphs does it- I use League Runs per PA * (1 – Park Factor) * Player PA. Doing this with a PF of .98 (that’s my guess for STL’s PF, I don’t have FG’s or my PF in front of me) gives us +1.68 runs. Add this to #4, and we get a total of +71.2 runs above the average.

I’m always fascinated by park factors, as some are extremely comprehensive.  I can’t comment on their PF, as I don’t know how they go about it.  I assume they park adjust the player’s runs above average by dividing their wOBA by the square root of the park factor.  The method I use is the same one outlined in The Hidden Game of Baseball.

6. Add a replacement level. FanGraphs calculates Replacement level of +20 runs per 600 plate appearances (the equivalent of 150 games). Albert had 700 PA; that’s +23.3 runs of replacement. Add this to step 5 and we have +94.5 runs above replacement. But we’re not done.

Replacement Level varies from WAR to WAR.  I believe FanGraphs implements an overall replacement level around .290; Sean Smith’s WAR over at is around .350, if I remember right.  FanGraphs doesn’t adjust for league quality, which I would recommend.  I use the same one Tango suggests- 20 runs per 650 PA for the NL, 25 per 650 for the AL.  Again, no complaints here.

7. Add in the player’s positional adjustment. Per 162 games (I don’t know if they do it by innings or by games participated in; I assume it’s the former), we have the following values: +12.5 C, -12.5 1B, +2.5 2B/3B/CF, -7.5 LF/RF, +7.5 SS, -17.5 DH. Albert had a positional adjustment of -11.9 runs for playing first base. Add this to step 6; that’s 94.5 – 11.9 = +82.6 runs.

8. Add the player’s UZR. Albert was a +3.1; that’s +85.7 Runs Above Replacement.

I’ve got no qualms with the positional adjustments, as they seem right to me.  I do find it interesting, though, that they’re still using straight UZR rather than averaging it with the Plus/Minus system.  I don’t know why they choose one over the other, as it appears to favor one over the other.  I’m assuming they keep it to UZR simply for consistency, as that’s what they began WAR with- but there’s nothing wrong with making a change.  Also, MGL recently suggested in a post over at The Book Blog that if we’re looking to measure WAR and if we incorporate UZR, we should regress the UZR figure.  I wonder if they’ll begin doing that…just some food for thought.

9. Divide Step 8 by 10 to convert from runs to wins. 85.7/10 = 8.6 Wins Above Replacement.

FanGraphs has Albert at 8.7 WAR. That’s pretty close, as I didn’t make an adjustment for pitcher hitting or for the leagues, and we’re likely using a different park factor (I pulled that number out of my rear).

I hope that helps some.

Again, working under an assumption- the conversion of runs to wins isn’t always 10; that’s a rule of thumb.  If I remember right, the PythagenPat method of runs to wins is something like (0.75*Runs per Game +2.75).  For 2009 MLB, that means a 4.6 runs per game environment would yield a runs to wins conversion of 9.7.  If Albert is 86.6 RAR, that would make him 9.0 WAR, not 8.7.

Anyways, those are just some of my thoughts (ramblings) on their WAR.  I love FanGraphs, but I think they could tighten things up a little bit.  Baseball Prospectus is about to make a pretty big push with all of the changes Colin Wyers is bringing, and FanGraphs might have to up the ante a little bit- at least, in my eyes- to keep going there as my major source of statistics (aside from Baseball-Reference, of course).

16 Comments leave one →
  1. Patriot permalink
    September 19, 2010 2:39 PM

    I believe that Fangraphs uses .75*RPG + 3 for their RPW. Tango came up with that formula at some point, independently of Pythagenpat. The Pythagenpat derivation for .75*RPG + 2.75 that I found served as more of an affirmation of the former formula rather than its genesis.

  2. jmatrix permalink
    October 3, 2010 7:13 PM

    I tried this exact formula on Troy Tulowitzki’s 2009 WAR. I came up with 4.7 yet fangraphs has 5.7. Please tell me what you get so I can try to figure out where I went wrong, if I did. Thx


    • triplesalley permalink*
      October 3, 2010 10:47 PM

      It’d have to be in the offensive calculation. If I apply those values to Tulo’s 2009, I get +34.3 runs for offense- and when I add in FG’s park adjustment, it drops it down to +28.5, which is about a run and a half off from what they use. Remember, I’m not excluding pitcher hitting- that changes things a little bit.

      Anyways, so if you have +28.5, you add the replacement level (+20.9), the defense (+2.4) and the position adjustment (+6.7), and you get +58.5 Runs Above Replacement. Divide by 10, and you have +5.9 WAR.

      Try re-doing the hitting value and you should come much closer. If not, let me know and I’ll walk you through it.

      • jmatrix permalink
        October 5, 2010 12:41 AM

        Ok m y first problem is at position adjustment. I thought a ss was + 7.5. That is obviously my first problem. Ok I get 34.4 runs for offense which is close. I would really appreciate if you could walk me through it because I keep getting lost in the middle. If you could show me step by step the calculations you used I would really appreciate it. Thanks so much.


      • triplesalley permalink*
        October 5, 2010 7:23 AM

        Our initial calculation is:

        .31*NIBB + .34*HBP + .47*1B + .77*2B + 1.04*3B + 1.40*HR + .20*SB – .42*CS – .27* (AB – H + SF)

        NIBB, of course, are total walks minus intentional walks. Plug in Tulo’s line- this gives you about +34.3 runs. Now divide by plate appearances sans intentional walks and sacrifice hits. This gives you something like +.05 runs per PA or something like that. Multiply this by his intentional walks and sac hits, and add this total back to his original offensive runs- this gives you +34.5 runs (forgot to do that in my previous example). So, that’s the offense part of it.

        I don’t know what FanGraphs’ exact park factor for Coors Field is. I think it’s about -6 runs per 650 plate appearances, so that brings Tulo down to +28.7.

        Now add in his replacement level. This is 20 runs per 600 PA, so Tulo gets +20.9 runs for playing a lot. Add the two together, and that gives us +49.6 runs. A shortstop gets a +7.5 run bonus for about 1450 innings afield, which is the equivalent of around 162 games. Tulo played 1294, so he gets +6.7 runs. Add this to our original total, and we now have +56.3 runs. Add in the player’s defensive rating (+2.4 runs) and that gives us a grand total of +58.7 runs. Divide by around 10 and you have +5.9 Wins.

        We’re a few runs off here, but that’s okay. I think the difference is probably the inclusion of pitcher hitting in my examples. I hope that helps.

  3. jmatrix permalink
    October 5, 2010 10:06 PM

    Ok so I followed you step by step and it worked. I only had one hickup. After we came up with the initial +34.3 for runs you said “Now divide by plate appearances sans intentional walks and sacrifice hits. This gives you something like +.05 runs per PA or something like that. Multiply this by his intentional walks and sac hits, and add this total back to his original offensive runs- this gives you +34.5 runs (forgot to do that in my previous example). So, that’s the offense part of it.” I came up with +0.5 but when I multiplied I came up with +2 which added to +34.3 gives me +36.3. You had +34.5. Can you please explain that calculation again.

    Also where did you get the park factor for coors. Is there a list of park factors for each park in each year. If not can you explain park factor for me.
    Thank you for all of your help I really appreciate this. It is driving me crazy.

    • triplesalley permalink*
      October 5, 2010 10:18 PM

      You should be getting +.05, not +.5. That’s the difference. It’s 34.3/624 (plate appearances – intentional walks – sac hits) = +.05. Multiply this by intentional walks (+.05*4 = +.2) and sac hits (+.05*0 = +0) and add this to the 34.3, and that’s how you get +34.5.

      You can get park factors at different places. You can go to, say, and go to the individual team pages. Then look at the “Multi-year park factor,” and divide by 100. You can also go to ESPN for simple park factors, but you’ll have to divide by two (they don’t account for the fact that a team plays half its games at home).

      • jmatrix permalink
        October 5, 2010 10:36 PM

        Ok I realized the problem with +.05 that worked. I went to baseball-reference and got 1.15 after I divided for coors park factor. I am getting confused here though because in the original post you use the formula League Runs per PA * (1 – Park Factor) * Player PA and in the reply to me you had -6 runs for every 650 at bats. Can you explain how you turned it into runs like in the reply.

        You have really been a great help thanks for everything so far and I am sorry for being a pain just thursting for knowledge.


      • triplesalley permalink*
        October 6, 2010 12:29 AM

        I back-calculated the Coors Park Factor by subtracting Tulowitzki’s park adjusted runs above average from his raw runs above average, divided by his plate appearances to find the runs per plate appearance, and multiplied by 650 to figure out how many runs Coors adds to a player’s line over a full season. That was how I found the -6 runs per 650 PA.

        If you’re applying a different PF, like B-Ref’s- if it’s something like 1.15, then it’s about -11 runs per 650 PA. Really, all you need is the PF and the league R/PA. Then you plug the desired plate appearances to see how big of an impact it has.

  4. jmatrix permalink
    October 6, 2010 12:39 AM

    Can you please write out the calculation. For instance what were his park adjusted runs and how did you calculate them raw runs above average. This way I can back track my calculations. Thanks again.


    • triplesalley permalink*
      October 6, 2010 4:00 AM

      If you go to Tulowitzki’s FanGraphs page, you’ll see that he’s +33.4 runs (under the label “wRAA”). If you scroll all the way down to “Value,” where their WAR calculation is, his “Batting” value is listed as +26.9. That means he lost 26.9 – 33.4 = -6.5 runs of value. This occurred in his 628 plate appearances.

      If we divide -6.5 into 628 (to see the rate of runs being added/subtracted by the park factor), we get -.0104. Multiply this by 650 to get the amount of runs added/subtracted over a full season, and we get -6.7. This means that in a full season, a hitter that plays in Coors will be docked 6.7 runs (this figure is different than the one I posted before; FanGraphs has apparently updated their park factors- and this explains why his park adjusted runs are different than the ones I posted earlier).

  5. Matrix permalink
    October 12, 2010 5:27 AM

    Thanks for all of your help!!!


    • triplesalley permalink*
      October 12, 2010 8:37 AM

      You’re welcome!

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: