Fixing xFIP, Pt. 1: Line Drives and Pop-Ups
One might argue that xFIP is slightly misaligned. One might make that argument in blog form, on the website FanGraphs, today, here, now.
One only might argue that xFIP is slightly misaligned because xFIP is commonly understood to serve a purpose distinct from FIP. FIP, aka Fielding Independent Pitching, is calculated as a function of strikeouts, walks, and home runs — that is, outcomes over which fielders bear no influence. The equation that underpins FIP is derived from a linear regression equation intended to resemble ERA, for ease of interpretation. Because it is based exclusively on outcomes, its purpose is more descriptive than predictive. In other word, it finds greater purpose describing what should have happened but not necessarily what will happen.
xFIP, on the other hand, seeks to achieve the inverse. A large swath of evidence exists to suggest home run-to-fly ball rate (HR/FB) for pitchers is incredibly noisy season to season. Sure, certain pitchers might anecdotally buck the norm — apparently, Michael Pineda was born to be a cafeteria lunch lady, serving up meatballs and taters — but, by and large, HR/FB is a fool’s errand to predict. Accordingly, xFIP replaced home runs with expected home runs, by way of multiplying the number of fly balls allowed by a pitcher by the league-average HR/FB, thereby normalizing home run damage, making it, in theory, a better descriptor (and perhaps a better predictor) of pitcher performance over time.
And therein lies the rub, although, if you missed it, you mustn’t be blamed.
HR/FB, the backbone of xFIP, is inherently flawed because:
- Home runs are never hit on infield fly balls (aka pop-ups), yet pop-ups are included in HR/FB (because pop-ups are included in all fly balls*); and
- Home runs occasionally are hit on line drives, yet line drives are not included in HR/FB.
*Fly ball percentage (FB%) includes both infield and outfield fly balls.
This has bothered me a long time, this seemingly minor but potentially substantial ideological discrepancy. If we seek to normalize home run behavior for pitchers, we should endeavor to do so in a way that is most theoretically appropriate. I’m not here to reinvent the wheel — there are significantly more complex ways to normalize home run behavior — but I, at least, can pick the low-hanging fruit and make subtle adjustments to existing metrics.
I sampled all qualified pitcher-seasons from 2010 through 2018 (n = 709) and calculated unique ratios of home runs to outfield fly balls and line drives. This abbreviates to HR/(oFB+LD), which doesn’t quite roll off the tongue, but it’ll do in a pinch.
Although HR/(oFB+LD) generally behaves proportionally to HR/FB…
Season | HR/FB | HR/(oFB+LD) |
---|---|---|
2010 | 9.4% | 6.8% |
2011 | 9.7% | 6.7% |
2012 | 11.3% | 7.5% |
2013 | 10.5% | 6.9% |
2014 | 9.5% | 6.3% |
2015 | 11.4% | 7.5% |
2016 | 12.8% | 8.5% |
2017 | 13.7% | 9.3% |
2018 | 12.7% | 8.5% |
… HR/(oFB+LD) cannot be directly substituted for HR/FB in FIP or else it breaks the equation. If I simply plug in HR/(oFB+LD), all pitchers would suddenly “underperform” their ERA because their xFIPs would improve by several tenths of a run without merit.
To account for this difference, I ran a fresh regression, setting up the equation exactly as specified by xFIP, by virtue of FIP. (I also included year fixed effects, which is a component of FIP and xFIP, too, appearing in the form of the “year constant” term.) However, in lieu of normalizing home runs by all fly balls, I normalized home runs by, yes, outfield fly balls and line drives — the only batted ball events that can produce home runs (inside-the-park home runs notwithstanding).
The regression produced an adjusted r2 of 0.55 — weaker than FIP (r2 = 0.62) but a good deal stronger than the original xFIP (r2 = 0.42). What this means is, from a purely descriptive standpoint, xFIP that relies on outfield fly balls and line drives is a better description of “skill” (or “deserved” outcomes) than xFIP that relies on outfield fly balls and also pop-ups but not line drives.
From a predictive standpoint (by measure of correlation to next-year ERA), the original xFIP outperforms the new xFIP, but not significantly, resulting in r2 values of 0.20 and 0.18, respectively. Even SIERA hardly outperforms the new xFIP (r2 = 0.20), and its descriptive (same-year) value is notably weaker (r2 = 0.36).
ERA | y+1 ERA | |
---|---|---|
FIP | 0.62 | 0.17 |
xFIP | 0.42 | 0.20 |
SIERA | 0.45 | 0.20 |
New xFIP | 0.55 | 0.18 |
FIP, xFIP, and SIERA all boast ideological differences, yet none prevails as a superior predictive option. That “new xFIP” lands in the middle of an indistinguishable pack predictively while also prevailing above xFIP and SIERA descriptively lends merit to the original argument — the argument that xFIP might be theoretically misaligned, such that it artificially restricts its descriptive power.
You could calculate New xFIP manually using the equation above, if you’d like. (The constant term for 2019, as of now, is something like 0.834. I say “as of now” because it’s a moving target — as league-wide ERA changes, so, too, does the constant term.)
If not, you could make mental adjustments to xFIP in its current state according to a couple of intuitive rules of thumb. How does a pitcher’s line drive rate (LD%) compare to the league average? If it’s higher, then xFIP might be overrating his performance; if lower, then underrating. Same with infield fly ball percentage (IFFB%): if it’s higher, xFIP might be underrating his performance, and vice versa. It’s inexact, but, to be fair, all of this (gesturing broadly to sabermetrics) is inexact.
* * *
Here’s the “New xFIP” leaderboard, as of Sunday, May 12.
Name | Team | IP | ERA | Old xFIP | New xFIP | diff |
---|---|---|---|---|---|---|
Blake Snell | Rays | 43.0 | 3.56 | 2.49 | 2.62 | 0.13 |
Tyler Glasnow | Rays | 48.3 | 1.86 | 2.78 | 2.71 | -0.07 |
Hyun-Jin Ryu | Dodgers | 52.3 | 1.72 | 2.50 | 2.77 | 0.27 |
Stephen Strasburg | Nationals | 57.0 | 3.63 | 2.71 | 2.89 | 0.18 |
Gerrit Cole | Astros | 55.7 | 3.88 | 2.33 | 2.94 | 0.61 |
Luis Castillo | Reds | 56.3 | 1.76 | 3.08 | 2.99 | -0.09 |
Cole Hamels | Cubs | 49.7 | 3.08 | 3.57 | 3.30 | -0.27 |
Caleb Smith | Marlins | 42.7 | 2.11 | 2.98 | 3.32 | 0.34 |
German Marquez | Rockies | 57.7 | 3.43 | 3.16 | 3.32 | 0.16 |
Max Scherzer | Nationals | 59.3 | 3.64 | 2.75 | 3.37 | 0.62 |
Noah Syndergaard | Mets | 49.0 | 5.14 | 3.41 | 3.37 | -0.04 |
Carlos Carrasco | Indians | 40.3 | 4.91 | 3.14 | 3.50 | 0.36 |
Jacob deGrom | Mets | 47.0 | 3.26 | 2.93 | 3.51 | 0.58 |
Zack Greinke | Diamondbacks | 57.0 | 3.16 | 3.19 | 3.53 | 0.34 |
Max Fried | Braves | 44.3 | 3.25 | 3.32 | 3.59 | 0.27 |
Matthew Boyd | Tigers | 54.3 | 3.15 | 3.38 | 3.61 | 0.23 |
Luke Weaver | Diamondbacks | 45.3 | 2.98 | 3.53 | 3.66 | 0.13 |
Zack Wheeler | Mets | 49.7 | 4.35 | 3.34 | 3.66 | 0.32 |
Marcus Stroman | Blue Jays | 52.0 | 3.12 | 3.81 | 3.71 | -0.10 |
Tyler Mahle | Reds | 45.3 | 3.97 | 3.02 | 3.71 | 0.69 |
Chris Sale | Red Sox | 44.0 | 4.50 | 3.46 | 3.72 | 0.26 |
Charlie Morton | Rays | 44.3 | 2.64 | 3.53 | 3.73 | 0.20 |
Jose Quintana | Cubs | 46.3 | 3.50 | 3.39 | 3.75 | 0.36 |
Justin Verlander | Astros | 57.3 | 2.51 | 3.56 | 3.77 | 0.21 |
Jon Lester | Cubs | 38.7 | 1.16 | 3.40 | 3.82 | 0.42 |
Frankie Montas | Athletics | 45.3 | 2.78 | 3.63 | 3.83 | 0.20 |
Mike Minor | Rangers | 53.7 | 2.68 | 4.17 | 3.86 | -0.31 |
Pablo Lopez | Marlins | 41.0 | 5.93 | 3.82 | 3.87 | 0.05 |
Yusei Kikuchi | Mariners | 54.3 | 3.64 | 4.00 | 3.92 | -0.08 |
Patrick Corbin | Nationals | 50.7 | 3.20 | 3.85 | 3.94 | 0.09 |
Zach Eflin | Phillies | 51.0 | 2.47 | 4.41 | 3.94 | -0.47 |
Shane Bieber | Indians | 49.7 | 3.81 | 3.99 | 3.99 | 0.00 |
Jack Flaherty | Cardinals | 41.7 | 4.32 | 3.56 | 4.01 | 0.45 |
Masahiro Tanaka | Yankees | 52.3 | 3.44 | 4.00 | 4.05 | 0.05 |
Joey Lucchesi | Padres | 41.3 | 4.57 | 3.92 | 4.06 | 0.14 |
Madison Bumgarner | Giants | 55.7 | 4.04 | 3.47 | 4.08 | 0.61 |
Domingo German | Yankees | 43.3 | 2.70 | 3.94 | 4.10 | 0.16 |
Kyle Hendricks | Cubs | 42.3 | 3.19 | 3.81 | 4.11 | 0.30 |
Jon Gray | Rockies | 48.7 | 4.25 | 3.72 | 4.13 | 0.41 |
Jose Berrios | Twins | 59.0 | 3.05 | 4.13 | 4.13 | 0.00 |
Robbie Ray | Diamondbacks | 48.7 | 3.14 | 3.77 | 4.19 | 0.42 |
Walker Buehler | Dodgers | 43.3 | 4.15 | 3.96 | 4.22 | 0.26 |
Adam Wainwright | Cardinals | 43.3 | 4.15 | 4.17 | 4.24 | 0.07 |
Miles Mikolas | Cardinals | 54.0 | 3.83 | 4.33 | 4.30 | -0.03 |
Yonny Chirinos | Rays | 42.3 | 3.61 | 4.42 | 4.35 | -0.07 |
Jordan Lyles | Pirates | 38.7 | 2.09 | 4.48 | 4.36 | -0.12 |
Eduardo Rodriguez | Red Sox | 43.7 | 4.53 | 3.76 | 4.38 | 0.62 |
Homer Bailey | Royals | 41.0 | 4.83 | 4.01 | 4.38 | 0.37 |
Trevor Bauer | Indians | 59.7 | 3.02 | 3.84 | 4.39 | 0.55 |
Kevin Gausman | Braves | 42.0 | 4.50 | 4.05 | 4.40 | 0.35 |
Trevor Williams | Pirates | 50.3 | 3.40 | 4.31 | 4.45 | 0.14 |
Jose Urena | Marlins | 46.7 | 4.82 | 4.52 | 4.48 | -0.04 |
Wade Miley | Astros | 45.3 | 3.18 | 4.43 | 4.48 | 0.05 |
Anthony DeSclafani | Reds | 41.0 | 4.17 | 4.26 | 4.50 | 0.24 |
Andrew Cashner | Orioles | 42.3 | 4.25 | 4.84 | 4.53 | -0.31 |
Martin Perez | Twins | 46.3 | 3.11 | 4.28 | 4.53 | 0.25 |
Brad Peacock | Astros | 42.7 | 4.01 | 4.19 | 4.54 | 0.35 |
Jake Arrieta | Phillies | 50.0 | 3.78 | 4.44 | 4.55 | 0.11 |
Jake Odorizzi | Twins | 42.7 | 2.32 | 4.49 | 4.58 | 0.09 |
Julio Teheran | Braves | 50.7 | 4.26 | 4.50 | 4.68 | 0.18 |
Zach Davies | Brewers | 46.7 | 1.54 | 4.72 | 4.69 | -0.03 |
Joe Musgrove | Pirates | 40.7 | 4.20 | 4.43 | 4.72 | 0.29 |
Aaron Nola | Phillies | 46.3 | 4.86 | 3.88 | 4.73 | 0.85 |
Mike Fiers | Athletics | 51.0 | 5.12 | 5.18 | 4.74 | -0.44 |
Mike Leake | Mariners | 47.3 | 4.37 | 4.69 | 4.79 | 0.10 |
Spencer Turnbull | Tigers | 44.7 | 2.42 | 4.46 | 4.80 | 0.34 |
Marco Gonzales | Mariners | 56.7 | 3.18 | 4.89 | 4.86 | -0.03 |
Nick Margevicius | Padres | 41.3 | 4.14 | 4.87 | 4.90 | 0.03 |
J.A. Happ | Yankees | 43.3 | 4.36 | 4.91 | 4.91 | 0.00 |
Collin McHugh | Astros | 42.7 | 6.33 | 4.21 | 4.94 | 0.73 |
Rick Porcello | Red Sox | 43.7 | 5.15 | 4.97 | 4.98 | 0.01 |
Kenta Maeda | Dodgers | 44.7 | 4.03 | 4.66 | 5.01 | 0.35 |
Merrill Kelly | Diamondbacks | 46.0 | 4.70 | 4.66 | 5.02 | 0.36 |
Kyle Freeland | Rockies | 44.7 | 5.84 | 4.92 | 5.03 | 0.11 |
Aaron Sanchez | Blue Jays | 48.0 | 3.75 | 4.72 | 5.06 | 0.34 |
Jakob Junis | Royals | 48.3 | 5.77 | 4.63 | 5.08 | 0.45 |
Lance Lynn | Rangers | 47.7 | 5.48 | 4.53 | 5.14 | 0.61 |
Ivan Nova | White Sox | 44.3 | 6.29 | 4.44 | 5.15 | 0.71 |
Jeff Samardzija | Giants | 41.0 | 3.51 | 5.08 | 5.17 | 0.09 |
Jhoulys Chacin | Brewers | 45.3 | 4.57 | 5.43 | 5.23 | -0.20 |
Brett Anderson | Athletics | 43.0 | 4.19 | 5.24 | 5.26 | 0.02 |
Michael Pineda | Twins | 40.0 | 5.85 | 4.71 | 5.27 | 0.56 |
Dylan Bundy | Orioles | 40.7 | 5.31 | 5.13 | 5.32 | 0.19 |
Reynaldo Lopez | White Sox | 50.0 | 5.58 | 5.46 | 5.38 | -0.08 |
Brad Keller | Royals | 52.3 | 4.47 | 5.09 | 5.43 | 0.34 |
Dereck Rodriguez | Giants | 41.0 | 5.05 | 5.06 | 5.45 | 0.39 |
Jorge Lopez | Royals | 43.0 | 6.07 | 4.59 | 5.45 | 0.86 |
Sandy Alcantara | Marlins | 44.0 | 5.11 | 5.54 | 5.45 | -0.09 |
Trevor Richards | Marlins | 42.3 | 4.46 | 5.57 | 5.52 | -0.05 |
Tanner Roark | Reds | 41.3 | 3.27 | 4.81 | 5.58 | 0.77 |
Anibal Sanchez | Nationals | 41.0 | 5.27 | 5.37 | 6.21 | 0.84 |
* * *
[Edit (5/21/19 8:32 pm ET)] It should be noted all calculations below relied on Statcast data rather than FanGraphs data. I had a moment of panic when I realized FanGraphs and Statcast data do not perfectly align in terms of how batted ball events (fly balls, etc.) are strung/coded. Fortunately, I am also able cross-validate the results below using FanGraphs data. The change to xFIP I recommended below still bears a substantial improvement in xFIP’s correlation with same-year ERA; its adjusted r2 improving from 0.44 to 0.53 — not exactly the same values shown below, but darn close. That’s all. Thanks![/Edit]
Carson got the job with Toronto despite this annoying writing style, not because of it.
That you even thought to compare me to Carson is considerably high praise I don’t deserve — thank you!