Several weeks ago, the crew at baseball prospectus put out a new pitching metric called DRA, or Deserved Run Average. It is distinctive in building in controls for lots of different factors, for including
pitcher catcher framing, and for applying the technique of mixed-effect statistical modeling. The authors have put forth a tremendous amount of effort in explaining their metric, in both technical and non-technical terms, even going so far as to post the R commands they used! I can’t emphasize enough how much I appreciate their general openness, and especially posting actual code. That’s why I called my work on this broadDRA instead of openDRA, because DRA is already essentially open.
In any case, I was curious about the ins and outs of the ambitious new metric and so I’ve been working on reproducing the results starting from retrosheet data. This post just provides a few links to some jupyter notebooks, written in Python and R that show the code for this. If you want to use this code as written, you will need a retrosheet database, with at least year_id and woba_pts columns added (and playoff_flag, but you could probably just comment the selection based on that out of the sql query). You can create a retrosheet database, if you don’t already have one, using py-retrosheet from Wells Oliver, and you can add the additional columns using the retrosheet_sql_tools script that I contributed.
Following are links to my code, as jupyter notebooks, and a tarball that includes the fitted models for 2003-2004 as an example.
I mocked up my own estimate of FRAA, based off of baseball-reference defensive-runs-above-average. This means that running that piece of the code has the additional requirement of having an rWAR database (e.g. from the excellent daily war-update by baseball-reference http://www.baseball-reference.com/data/war_daily_bat.txt), and a Lahman database, or some other way to make the conversion from retrosheet ID to baseball-reference ID. Because of these extra dependencies, I write the “pull data for DRA from retrosheet” code below to have both “use FRAA” and “ignore FRAA” options.
Here are the IPython notebooks,
pull data for CSAA from retrosheet
the results for 1997-2004, are available as a Google doc here,
icpt stands for “intercept”, the ranef intercept of the fitted model. “0” is the baseline model lwts ~ (1|pitcher). The additional columns icpt_dra_X are the model lwts ~ (1|pitcher) + X. icpt_dra_full is the full model, as quoted in the baseball prospectus article.
example of the CSAA and DRA models for 2003-2004, saved as R workspaces, are available in dropbox here,
Finally, here are a couple visualizations, shamelessly adopted from Jason Davies parallel coordinates example.