MLB Ratings (Beta)

Check out the blog for projections and ongoing coverage of the 2016 MLB Playoffs.

RPScore
  • This is my best guess of each team's "true" record, or the record one would expect a team to post if it played an infinite number of games against a .500 team on a neutral field.
    • Because the breadth of the distributions of its two components, Elo Win and Xº Win', RPScore is an average of the two components weighted by the other component's standard distribution.
    • This ensures that neither component "outweighs" the other solely due to the breadth of their distribution.
    • Since Elo Avg is seeded with preseason projections by FanGraphs, this has the effect of regressing early season ratings heavily towards preseason expectations.
  • RPScore = ((Elo Avg * Elo WeightXº Win') / (Elo Weight + 1)) + Adjustment
    • Elo Weight is the amount that Elo Avg is weighted against Xº Win' to determine RPScore
      • Elo Weight is based on the relative standard deviations of Elo Avg and Xº Win' as well as how many regular season games have transpired.
      • Elo Weight = (SD of all Xº Win' scores / SD of all Elo Avg scores)^((162 - regular season games played) / 162 + 1)
    • Adjustment is the value that ensures that the average of RPScores equals .500.
    • If the mean of all team RPScores deviates from .500, the difference between the initial mean and .500 is added to each final score to ensure that the mean of all RPScores.
Elo Avg
  • Based on the Elo rating system most commonly used in chess, RP's version of Elo differs in several ways.
    • First, my system uses Brandon Heipp's (cached) version (the second of his three) of David Smyth's Base Runs formula to predict the expected run differential for each game, calculates the Pythagenpat estimated win-loss record for that game, and then assigns a fraction of a win or loss to each team based on their Pythagenpat score. For instance, if the Nationals beat the Yankees 2-1,  would assign a full win to Washington and a full loss to New York. Instead, RP's system assigns them a fraction of a win based on their expected run differential if the two teams had played each other an infinite number of times.
    • Second, my system adjusts for home field advantage (based on Matt Swartz's work) when calculating the expectation that either team will win the contest. The home team is awarded ~23 points for divisional match-ups, ~29 points for intraleague and ~35 points for interleague match-ups.
    • Third, instead of starting each team out at 1000 at the beginning of the season, it adjusts their initial Elo to match FanGraphs WAR depth charts before Game 1.
  • RP's Elo system assumes a K-factor of 16. This was arrived at by determining which K-factor produces estimations of next-game wins with the lowest RMSE.
  • The Elo Avg metric converts the Elo rating to a rate.
  • Elo Avg = 1 / (1 + 10^((1000 - Elo Rating) / 400))
Xº Win'
  • This is Xº Win adjusted for the difference in league talent levels. This metric is inspired by Baseball Prospectus' Adjusted Hit List Factor.
  • Xº Win' is adjusted for strength of league by multiplying the odds ratio of a team's Xº Win by the odds ratio of its Lg value.
  • Xº Win' = (Xº Win / (1 - Xº Win))*(Lg / (1 - Lg)) / (1 + (Xº Win / (1 - Xº Win))*(Lg / (1 - Lg)))
Lg
  • This is the Xº Win average in each team's league
  • Lg = League Mean of Xº Win
Xº Win
  • This is the simple average of Win Avg, 1º Win, 2º Win and 3º Win. It is inspired by Baseball Prospectus' Hit List Factor.
  • Xº Win = (Win Avg + 1º Win + 2º Win + 3º Win) / 4
Win Avg
  • This is simple win percentage.
  • Win Avg = W / (W + L)
1º Win
  • Pythagenpat, developed by Dave Smyth and Patriot, is a method for estimating true record using runs scored and allowed.
  • 1º Win = Scored^X / (Scored^X + Allowed^X) where X = ((Scored + Allowed) / Games)^.287
    2º Win
    • This is Pythagenpat estimated win percentage but with the run differential replaced with Base Runs differential. It is inspired by Baseball Prospectus' 2nd Order Win Percentage.
    • As per David Smyth and Brandon Heipp, Base Runs = A *  B / (B + C) + D
      • A = H + BB - HR - CS
      • B = 0.76*1B + 2.28*2B + 3.8*3B + 2.28*HR + 0.038*BB + 1.14*SB
      • C = AB - H
      • D = HR
    SOS
    • This is the 2º Win of a team's opponents, weighted for frequency, discounting stats logged against the team in question, and adjusted for park effects on H, 2B, 3B, HR and BB.
        3º Win
        • This is 2º Win adjusted for strength of schedule (and, by extension, park effects). It is inspired by Baseball Prospectus' 3rd Order Win Percentage.
        • 3º Win is adjusted for strength of schedule by multiplying the odds ratio of a team's 2º Win by the odds ratio of its strength of schedule.
        • 3º Win = (2º Win / 1 - 2º Win) * (SOS / 1 - SOS) / (1 + (2º Win / 1 - 2º Win) * (SOS / 1 - SOS))

        Those who are interested in access to my data may request it via email. I download all of the data I use to calculate ratings via Zach Panzarino's excellent mlbgame package for Python. I encourage anyone with questions, comments or criticisms to share them in the comments below.

          1 comment:

          1. Note on suspended Cubs/Pirates game from 9/29/2016: though the MLB will be considering this game a tie and counting all stats, the RPScore model (including RP Elo) will not. I will be treating this as a cancelled game in all stats, ratings and simulations.

            ReplyDelete

          Please Be Civil.