Wednesday, March 21, 2012

BA/OBA/SLG Calculus, pt. 2

The ease of figuring OPS given OBA and SLG, along with the fact that the metrics are reasonably well-accepted by the general baseball community and the fact that, when taken alone, they do at least approximate fundamental baseball values (especially in the case of OBA), has made equations of the form a*OBA + b*SLG common in sabermetrics. OPS is the most obvious example, with a = b = 1.

The way OPS+ does its weighting is a little different; rather than placing a fixed coefficient on OBA and SLG, it adds relative OBA and SLG, which essentially makes the league SLG/OBA ratio the weighting for OBA. For any given league OBA and SLG:

x = 1/LgOBA
y = 1/LgSLG
OPS+ = x*OBA + y*SLG - 1
dOPS+ = x*dOBA + y*dSLG = x*1 + y*TBw/AB% = x + y*TBw/AB%

For the 2010 majors taken as a whole, OBA was .3421 and SLG was .4028, so x = 2.923 and y = 2.483. The subtraction of one is a constant, and thus has no derivative and has no effect on the intrinsic weight of each event. It still needs to be subtracted at the end of the process, though.

Given the x and y values for the 2010 majors and the 88.59 AB%, OPS+ can be written as:

OPS+ = (2.92W + 5.73S + 8.53D + 11.3T + 14.1HR)/(AB + W) - 1

Just as with the derivatives for standard OPS, the coefficients vary for each possible AB%. The extreme AB%s in the 2010 AL were turned in by AJ Pierzysnki and Jim Thome:

It is helpful to restate these values relative to each other; I will dispense with using walks as the reference point as I did last time and go straight to singles. Also included are the relative coefficients in wOBA, the most comparable alternate metric, and for OPS with a 88.59 AB% (OPS avg):

As you can see, OPS+ values walks more highly than OPS, and also reduces the extent to which extra base hits are valued relative to singles. However, the adjustment is fairly small in magnitude (usually equivalent to a weight of around 1.2 on OBA), and thus doesn't significantly improve the relative weights.

It is only natural, then, that other constructs of the form a*OBA + b*SLG have put additional weight on OBA. A typical value, like that used in GPA, is 1.8; there are various other similar OBA weights in use, generally established through regression against team run scored or attempts to match linear weight values. I'll refer to the general form as mOPS. The differentiation is cleaner than for OPS+:

mOPS = a*OBA + b*SLG
d(mOPS) = a*dOBA + b*dSLG = a(1) + b(TBw/AB%) = a + b(TBw/AB%)

If a = 1.8 and b = 1, then the weight for any event is 1.8 + TBw/AB%. For the 2010 average AB%, this is the resulting equivalent equation:

mOPS = (1.8W + 2.93S + 4.06D + 5.19T + 6.32HR)/(AB + W)

Here are the values for the extremes, and the relative weights:

The relative weights for mOPS match wOBA fairly closely, except for the walk. The difference in weighting caused by extreme AB%s is also reduced greatly, since more weight is given to OBA which uses PA as the denominator. Unfortunately, the match for the hit weights is so close that it would be difficult to keep the form a*OBA + b*SLG and get much improvement...which of course speaks to why sabermetricians have settled on an OBA multiplier around 1.8.

If you are hellbent on matching the wOBA weights, one can get pretty close by introducing a third statistic into the mix--batting average. Including BA allows the intrinsic weight of each hit to vary by a fixed amount without having any effect on the BA rate. To get a rough estimate of the optimal weights, I ran a regression of dBA, dOBA, and dSLG for each event against the coefficient from the pared-down wOBA version discussed in part one:

wOBA = (.62W + .77S + 1.08D + 1.37T + 1.70HR)/(AB + W)

I've already discussed how to find the derivatives for OBA and SLG, but not BA:

dBA = Hw/AB%, where Hw = 1 if a hit, 0 otherwise
= 1/AB% for a hit, 0 otherwise

I ran this regression only on the results at one particular AB% (the 2010 major league average). Obviously it would be preferable to examine the function across the range of observed AB%s, but I'm just doing this as a demonstration--I certainly don't actually to propagate the usage of OPS and OPS-like metrics. The regression to fit a function to x*OBA + y*SLG + z*BA gave this result:

.620(OBA) + .273(SLG) - .160(BA)

I fiddled with this a little bit to 1) force the SLG coefficient to 1 so that it is the form of mOPS and 2) make the OBA and BA coefficients multiples of .05:

bOPS = 2.25(OBA) + SLG - .5(BA)
d(bOPS) = 2.25(dOBA) + dSLG - .5(dBA)

or generally bOPS = x(OBA) + y(SLG) + z(BA)
d(bOPS) = x(dOBA) + y(dSLG) + z(dBA)

For the 2010 average AB%, this differentiation results in:

(2.25W + 2.81S + 3.94D + 5.07T + 6.20HR)/(AB + W)

Here are the intrinsic weights relative to a single, with Pierzynski and Thome-level AB% as well:

Now the weights are pretty good matches for wOBA, although introducing BA, yet another metric with a different denominator, has apparently pushed the values for extreme AB%s further away from each other than was the case with mOPS.

While I find the "linear weight test" a more compelling way to evaluate a metric than a test on aggregate seasonal team batting stats, I'll throw in the correlation with R/(AB - H) for OPS, mOPS, and bOPS in 1955-2008:

This goes to show that just about any reasonable metric will give acceptable results when applied to team-seasons. bOPS performs a little worse than mOPS, which performs a little better than OPS. Whatever added accuracy comes from using mOPS or bOPS will be at the player level, where the distribution of outcomes is more extreme, and will be most evident for players with high walk rates.

It is tempting to look at the bOPS formula, see the negative coefficient for BA, and make a statement about the merits of BA as a metric. While we could all spend the rest of our lives taking potshots at BA (and rightly so), that should not be the takeaway from this exercise. The introduction of BA here allows us to improve the intrinsic weights by changing each hit weight by an equal amount while leaving walks untouched; the alternative of changing the weight on SLG affects all hit types differently (based on how many bases they are worth, of course).

In doing so, the OBA weight has been raised above its optimum level (around 1.8), but this has been offset by removing .5*BA so that walks can get an extra boost. It is therefore much more of a statement about how metrics based only on linear combinations of OBA and SLG are incapable of valuing walks properly without distorting the relationship between intrinsic weights for the other events.

The writing in the last two posts has been dry and choppy even by my usual standards, which is largely because the material is math-y without telling us much about baseball. In writing them, it was not my intention to in anyway encourage the use of OPS-type metrics for anything other than quick-and-dirty uses. Hopefully, looking at the mathematical properties of OPS in a slightly different manner than I have before will add to the body of evidence of why OPS fails when it is used for more involved purposes.


  1. Interesting stuff, Patriot. Maybe you'll want to analyze the following formula:

    2*BA + (BB/PA) + .8*ISO

    Just a formula I've played around with.

  2. Let’s write David’s formula in the same format I used in the post:

    2*BA + BB/PA + .8*ISO = w + (2*s + 2.8*d + 3.6*t + 4.4*hr)/AB%

    Differentiating, we get a coefficient of 1 for a walk, 2/AB% for a single, 2.8/AB% for a double, 3.6/AB% for a triple, and 4.4/AB% for a homer. Weights for the three examples:

    Avg 1,2.26,3.16,4.06,4.97
    Thome 1,2.43,3.41,4.38,5.36
    Pierzynski 1,2.06,2.89,3.71,4.54

    With a single = 1:
    Avg .442,1,1.4,1.8,2.2
    Thome .411,1,1.4,1.8,2.2
    Pierzysnki0.484663 1 1.4 1.8 2.2

    The hit weights are a very good match for wOBA; the walks less so. Something like 2*BA + 1.8*BB/PA + .8*ISO would yield:

    Avg .80,1,1.4,1.8,2.2
    Thome .74,1,1.4,1.8,2.2
    Pierzynski .87,1,1.4,1.8,2.2

    The walk is always going to bounce around in value due to the different denominator, but this is pretty close to the wOBA weights. David’s version is more stable than OPS because he only has one variable (walks) over a different denominator than for the rest of the events (at bats), whereas OPS puts all the variables except one (walks) over different denominators (all hit types in OPS are divided by PA in OBA and AB in SLG).

  3. Re: walks. When I do the "plus 1 event" method (poor man's differentiation?) for an avg batter using my 2/1/.8 weights,, I get that a BB is worth .66 of a 1b, which is what it should be. When I do it using your 2/1.8/.8 proposal, I get a BB value which is 1.02 times a 1b.

    Am I doing something wrong?

  4. No, you're not.

    The technique I used here "freezes" AB%, and thus is not directly comparable with a normal +1 method. I assume that when you add a single to your +1, the player's ISO and walk rate go down (since there is an additional AB/PA as well).

    The differentiation I've done here assumes that AB% is fixed, and determines the coefficients at that particular AB%. As soon as the player completes his next PA, his AB% will either go up (if he doesn't draw a walk) or go down (if he draws a walk).

    For example, Pierzynski had 474 AB and 15 walks, so his AB% is 474/(474+15) = .96932. If he were to draw a walk in his next PA, his AB% would drop to 474/(474+16) = .9673, and the weights for every event would change.

    In the past when I've differentiated OPS, I've taken a similar approach to the +1 method. By freezing the AB% here, I'm able to give a precise formula for OPS at any particular AB%.

    To put it another way, the +1 method (and the other way to differentiate) asks "What would happen to the player's OPS if he hit an additional single?" This method asks "Given the fixed, observed AB%, how can we express the player's OPS as a function of his per PA event frequencies?"

    This explanation leaves a lot to be desired, but it's something I struggled with myself for a long time and I still have trouble articulating the distinction between the two approaches.

  5. The other complicating factor here is what the rate output should be. I've assumed that it should be analogous to RAA/PA like wOBA. But if you want something that tracks R/PA, you'll get a different answer.

    If 2*BA + x*(BB/PA) + .8*ISO is correlated with R/O on the team seasonal level, it is optimized somewhere close to x = 1 like Dave is using.


I reserve the right to reject any comment for any reason.