Teams score — or don’t — event by event. Events change the state of the game. Solo home runs aside, whether a score results from any event depends upon prior events: a batter’s double only “drives in a score” when an earlier batter made it on base. By the collection of events a player generates, or more accurately, by the change in expected runs to which they contribute, we can measure players offensive values.

In an earlier post, we walked through the steps for estimating the expected runs in a half-inning for each of the twenty-four unique game states. We build on that work here, estimating distributions of the possible differences in expected runs from each type of event. Later, we’ll aggregate the distributions corresponding to realized events for each player to estimate their realized, offensive contributions.

As before, we will use event data from Retrosheets.

library(dplyr)
rs <- readRDS("rs2018.RDS")
desc <- readRDS("event_description.RDS")
rs <- left_join(rs, desc)

Several transformations come next. We calculate the accumulated batting team runs before each event to the end of the half inning, ignoring incomplete innings and identifying the game state at the start and end of the event.

library(dplyr)
# identify runs accumulated for batting team before event
rs <- rs %>% 
  mutate(SCORE_CT = ifelse(BAT_HOME_ID == 1, 
                           HOME_SCORE_CT, 
                           AWAY_SCORE_CT))

# calculate runs scored for batting team in the event
rs <- rs %>% 
  mutate(RUNS_SCORED = (BAT_DEST_ID > 3) +
                       (RUN1_DEST_ID > 3) + 
                       (RUN2_DEST_ID > 3) + 
                       (RUN3_DEST_ID > 3))

# accumulated runs before event to end of half inning
rs <- rs %>% 
  arrange(GAME_ID, EVENT_ID) %>%
  group_by(GAME_ID, INN_CT, BAT_HOME_ID) %>% 
  mutate(Complete = last(EVENT_OUTS_CT) + last(OUTS_CT) == 3) %>%
  filter(Complete) %>% select(-Complete) %>%
  mutate(RUNS_END_HALF = 
         last(SCORE_CT) + last(RUNS_SCORED) - SCORE_CT)

# create variable game states
runners <- 
  c("000", "100", "010", "001",
    "110", "101", "011", "111")
states <- c(paste0(rep(0:2, each = 8), runners), "3000")

# identify state at start of each event
rs <- rs %>% 
  mutate(STATE = paste0(OUTS_CT, 
         as.integer(BASE1_RUN_ID != ""),
         as.integer(BASE2_RUN_ID != ""),
         as.integer(BASE3_RUN_ID != ""))) 

# identify state after each event completes
rs <- rs %>% 
  mutate(STATE_after = 
         paste0(OUTS_CT + EVENT_OUTS_CT, 
         as.numeric(RUN1_DEST_ID==1 | BAT_DEST_ID==1), 
         as.numeric(RUN1_DEST_ID==2 | RUN2_DEST_ID==2 | 
                    BAT_DEST_ID==2),
         as.numeric(RUN1_DEST_ID==3 | RUN2_DEST_ID==3 | 
                    RUN3_DEST_ID==3 | BAT_DEST_ID==3))) %>%
  mutate(STATE_after = 
         ifelse(OUTS_CT + EVENT_OUTS_CT == 3, 
                "3000", STATE_after)) %>%
  mutate(STATE = factor(STATE, levels = states),
         STATE_after = factor(STATE_after, levels = states))

Then, we fit the data to a model using Stan. In the earlier post, we fit data with the R package rstanarm. This time, we code a model directly in Stan to provide more flexibility in how we obtain posterior distributions of marginal expected runs for each event type from the model itself.

data {
  int<lower=0> N;
  vector[N] runs_event;
  int<lower=0> runs_half[N];
  int<lower=1, upper=24> state[N];
  int<lower=1, upper=25> state_after[N];
  int<lower=1> event[N];
}

parameters {
  vector<lower=0>[24] a_state;
  real<lower=0> phi;
}

model {
  target += normal_lpdf(a_state | .5, 5);
  target += neg_binomial_2_lpmf(runs_half | a_state[state], phi);
}

generated quantities {
  vector[max(event)] ER_event = rep_vector(0, max(event));
  
  {
  vector[max(event)] event_ct = rep_vector(0, max(event));
    
  for(i in 1:N) {
    ER_event[event[i]] += state_after[i] != 25 ? 
      runs_event[i] + neg_binomial_2_rng(a_state[state_after[i]], phi) -  
      neg_binomial_2_rng(a_state[state[i]], phi) : 
      runs_event[i] - neg_binomial_2_rng(a_state[state[i]], phi);
    event_ct[event[i]] += 1;  
  }
  
  ER_event = ER_event ./ event_ct;
  }
}

In the model, \(\alpha_{\textrm{state}}\) or a_state is vector of random variables, one for each unique game state. We include a prior for these, \(\textrm{Normal}(\alpha_{\textrm{game state}} \mid 0.5, 5)\). The likelihood we code as a \(\textrm{Negative Binomial}(\textrm{runs}_{\textrm{after event}} \mid \alpha_{\textrm{game state}}, \phi)\), where \(\phi\) represents an overdispersion parameter. In generated quantities, we compute the marginal change in expected runs for each event type. Next, we fit the data to the model,

dat <- list(
  N = NROW(rs),
  runs_event = rs$RUNS_SCORED,
  runs_half = rs$RUNS_END_HALF,
  state = as.integer(rs$STATE),
  state_after = as.integer(rs$STATE_after),
  event = as.integer(factor(rs$EVENT_CD))
)

library(rstan)
fit_re <- sampling(m_event, data = dat, 
                   iter = 1000, chains = 4, cores = 4)

and extract the posterior estimates of the average expected runs for each event type,

post <- as.data.frame(fit_re, pars = "ER_event")
colnames(post) <- desc %>% 
  mutate(EVENT_DESC = gsub("\\.", " ", EVENT_DESC)) %>%
  filter(EVENT_CD %in% unique(rs$EVENT_CD)) %>% 
  .$EVENT_DESC

The marginal differences in expected runs for some events, like strike outs, are more certain than others:

event_ord <- post %>%
  tidyr::gather(key = 'event', value = 'runs') %>%
  group_by(event) %>% 
  summarise(avg_runs = mean(runs)) %>% 
  arrange(avg_runs) %>%
  ungroup() %>% .$event
  
event_runs <- post %>%
  tidyr::gather(key = 'event', value = 'runs') %>%
  mutate(event = factor(event, levels = event_ord, ordered = T))

library(ggplot2); library(ggthemes)
ggplot(event_runs) +
  theme_tufte(base_family = 'sans') +
  geom_density(aes(runs), fill = '#B9D9EB') +
  geom_vline(xintercept = 0, color = "#000000", lwd = .4) +
  facet_wrap(~event, nrow = 7, scales = 'free_y', dir = 'v') +
  theme(axis.ticks.y = element_blank(),
        axis.text.y = element_blank(),
        axis.title = element_blank())
Distribution of marginal difference in expected runs by event.

Figure 1: Distribution of marginal difference in expected runs by event.

Next, we can aggregate these distributions per player to obtain their contributions to expected runs. Let’s focus on a subset of the events, those that more closely reflect skills of batters and baserunners: strike out, fielder choice, caught stealing, stolen base, walk, single, double, triple, and home run.

# identify batter events
bat_events <- c("Caught stealing", "Fielder choice", "Strikeout", 
                "Pickoff", "Stolen base", "Walk", "Single", 
                "Double", "Triple", "Home run")

# aggregate events by player
player_summaries <- rs %>% 
  mutate(EVENT_DESC = gsub("\\.", " ", EVENT_DESC)) %>%
  mutate(EVENT_DESC = factor(EVENT_DESC, levels = event_ord, ordered = T)) %>%
  group_by(BAT_ID, EVENT_DESC) %>%
  summarise(n = n()) %>%
  ungroup() %>%
  filter(EVENT_DESC %in% bat_events) %>%
  tidyr::spread(key = EVENT_DESC, value = n, fill = 0) 

# multiply event counts by distributions
player_value <- 
  as.matrix(player_summaries[-1]) %*% t(post[,bat_events]) %>% 
  as.data.frame() %>% 
  bind_cols(BAT_ID = player_summaries$BAT_ID, .) %>%
  tidyr::gather(key = draw, value = runs, -BAT_ID) %>%
  mutate(draw = as.integer(gsub("V", "", draw)))

# calculate summary statistics
player_probs <- 
  player_value %>% 
  group_by(BAT_ID) %>% 
  summarise(p25 = quantile(runs, probs = .25), 
            p50 = quantile(runs, probs = .5), 
            p75 = quantile(runs, probs = .75)) %>%
  arrange(desc(p50))

# get names from Chadwick register and merge with retro ids
register <- 
  read.csv(paste0("https://raw.githubusercontent.com/", 
                  "chadwickbureau/register/master/data/people.csv"), 
           stringsAsFactors = F) %>%
  select(key_retro, name_last, name_first) %>%
  filter(key_retro != "")
  
player_probs <- left_join(player_probs, register, 
                          by = c("BAT_ID" = "key_retro"))

Players sorted by their descending average of total expected runs contributed are

library(kableExtra)
player_probs %>% 
  select(name_first, name_last, p25, p50,p75) %>% 
  knitr::kable(digits = 0, full_width = F, 
               align = c("l", "l", "r", "r", "r"), 
               col.names = c("First", "Last", "25%", "50%", "75%"),
               caption = "Expected runs contributed in 2018.") %>%
  add_header_above(c("Player Name" = 2, "Range of Expected Runs Contributed" = 3)) %>%
  kable_styling() %>%
  scroll_box(width = "90%", height = "450px")
Table 1: Expected runs contributed in 2018.
Player Name
Range of Expected Runs Contributed
First Last 25% 50% 75%
Jose Ramirez 125 127 128
Mookie Betts 125 126 128
Alex Bregman 123 125 126
Francisco Lindor 122 124 125
Manny Machado 117 119 120
J. D. Martinez 115 117 118
Christian Yelich 112 114 115
Nolan Arenado 112 113 115
Mike Trout 107 109 110
Freddie Freeman 105 106 108
Nick Markakis 105 106 108
Michael Brantley 104 105 106
Anthony Rendon 103 105 106
Charlie Blackmon 101 103 104
Paul Goldschmidt 99 100 102
Whit Merrifield 98 100 102
Andrew Benintendi 97 99 100
Anthony Rizzo 97 98 99
Miguel Andujar 96 97 98
Trea Turner 94 96 97
Nick Castellanos 94 95 97
Trevor Story 94 95 96
Carlos Santana 94 95 96
Bryce Harper 93 94 96
Jose Peraza 93 94 95
Matt Carpenter 92 94 95
Jed Lowrie 91 93 94
Ozzie Albies 91 92 93
Jose Altuve 91 92 93
Andrelton Simmons 91 92 93
Rhys Hoskins 90 92 93
Didi Gregorius 90 91 92
David Peralta 89 91 92
Scooter Gennett 89 90 92
Xander Bogaerts 89 90 91
Joey Votto 89 90 92
Jean Segura 89 90 91
Javier Baez 88 90 91
Lorenzo Cain 88 89 91
Mitch Haniger 87 89 90
Mike Moustakas 86 87 88
Eduardo Escobar 85 86 88
Jurickson Profar 85 86 87
Ketel Marte 84 85 87
Matt Chapman 84 85 87
Jose Martinez 84 85 86
Eugenio Suarez 84 85 86
Stephen Piscotty 83 84 85
Ender Inciarte 82 84 85
Travis Shaw 83 84 85
Yuli Gurriel 82 83 84
Khris Davis 82 83 84
Eddie Rosario 81 83 84
Nelson Cruz 81 82 83
Starling Marte 80 81 82
Shin-Soo Choo 79 80 82
Ben Zobrist 79 80 81
Aaron Hicks 79 80 81
Andrew McCutchen 78 80 81
Marcell Ozuna 78 79 81
Marcus Semien 78 79 81
DJ LeMahieu 78 79 80
Cody Bellinger 78 79 80
George Springer 77 79 80
Giancarlo Stanton 77 78 80
Adam Jones 77 78 79
Corey Dickerson 77 78 79
Max Kepler 76 78 79
Jesus Aguilar 76 77 78
Josh Bell 76 77 78
Cesar Hernandez 75 77 78
Matt Olson 75 77 78
Juan Soto 75 76 77
Brian Anderson 75 76 78
Edwin Encarnacion 75 76 78
Starlin Castro 75 76 77
Eric Hosmer 74 76 77
Asdrubal Cabrera 73 75 76
Max Muncy 73 74 75
Justin Turner 73 74 75
J. T. Realmuto 72 73 74
Tommy Pham 72 73 74
Gregory Polanco 71 73 74
Ronald Acuna 71 72 74
Michael Conforto 71 72 74
Jose Abreu 70 71 72
Justin Upton 69 70 72
Odubel Herrera 69 70 71
Joey Wendle 68 70 71
Brett Gardner 68 69 70
Brian Dozier 68 69 70
Ian Kinsler 68 69 70
Trey Mancini 67 69 70
Yadier Molina 67 68 69
Justin Smoak 67 68 69
Maikel Franco 67 68 69
Denard Span 66 67 68
Matt Duffy 66 67 69
Yonder Alonso 66 67 68
Jason Kipnis 66 67 68
Joe Mauer 66 67 68
Carlos Sanchez 65 67 68
Mallex Smith 65 66 68
Joc Pederson 65 66 67
Albert Pujols 65 66 67
Aaron Judge 64 66 67
C. J. Cron 64 65 66
Matt Kemp 64 65 66
Enrique Hernandez 64 65 66
Nick Ahmed 64 65 66
Carlos Gonzalez 63 64 65
Yasiel Puig 63 64 65
Ian Desmond 63 64 65
Kyle Seager 63 64 65
Yasmani Grandal 63 64 65
Johan Camargo 62 63 64
Freddy Galvis 62 63 65
Brandon Nimmo 62 63 64
Aledmys Diaz 62 63 64
Jason Heyward 61 62 63
Victor Martinez 62 62 63
Chris Taylor 61 62 64
Nomar Mazara 61 62 63
Eduardo Nunez 61 62 63
Kevin Pillar 61 62 63
Jon Jay 60 62 63
Jose Iglesias 60 61 62
Dee Gordon 60 61 62
Salvador Perez 60 61 62
Wilson Ramos 60 61 61
Buster Posey 59 60 61
Amed Rosario 59 60 61
Brandon Crawford 59 60 61
Josh Reddick 59 60 61
Ryan Braun 59 59 60
Yangervis Solarte 58 59 60
Tucker Barnhart 58 59 60
Marwin Gonzalez 58 59 60
Joey Gallo 57 59 60
A. J. Pollock 58 59 60
Wilmer Flores 58 59 60
Kendrys Morales 58 59 59
Adrian Beltre 58 59 59
Tim Anderson 57 58 59
Gleyber Torres 57 58 59
Robbie Grossman 57 58 59
Rougned Odor 56 57 58
Evan Longoria 56 57 58
Miguel Rojas 55 56 57
Mitch Moreland 55 56 57
Manuel Margot 55 56 57
Colin Moran 55 56 57
Willson Contreras 55 56 57
Randal Grichuk 55 56 57
Jeimer Candelario 54 55 57
Hunter Renfroe 54 55 56
Kyle Schwarber 54 55 56
Ryon Healy 54 55 56
Derek Dietrich 54 55 56
Daniel Murphy 54 54 55
Kurt Suzuki 54 54 55
Robinson Cano 53 54 55
Alex Gordon 53 54 55
Justin Bour 53 54 55
Shohei Ohtani 53 54 54
Teoscar Hernandez 52 53 54
Rafael Devers 52 53 54
Kris Bryant 52 53 54
Evan Gattis 52 52 53
Albert Almora 51 52 53
Niko Goodrum 51 52 53
Yoan Moncada 50 51 53
Scott Schebler 50 51 52
Jonathan Schoop 50 51 52
Jackie Bradley 50 51 52
Jedd Gyorko 50 50 51
Gerardo Parra 49 50 51
Paul DeJong 49 50 51
Carlos Correa 49 50 51
Brandon Belt 49 50 51
Adam Frazier 49 50 50
Mark Canha 49 49 50
Kole Calhoun 48 49 50
Francisco Cervelli 48 49 50
Alcides Escobar 48 49 50
Joe Panik 48 49 50
Jesse Winker 48 49 50
Elvis Andrus 47 48 49
Dansby Swanson 47 48 49
Daniel Descalso 47 48 49
Adam Eaton 47 48 49
Ryan Zimmerman 47 48 48
Nick Williams 47 48 49
Jonathan Villar 46 47 48
Jose Pirela 45 46 47
Jonathan Lucroy 44 45 46
Wilmer Difo 44 45 46
Addison Russell 44 45 46
Curtis Granderson 44 45 46
Brock Holt 44 45 45
Todd Frazier 44 44 45
Billy Hamilton 43 44 45
Isiah Kiner-Falefa 43 44 45
Jorge Polanco 43 44 45
Kolten Wong 43 43 44
Yan Gomes 42 43 44
Mark Trumbo 42 43 44
Jordy Mercer 42 43 44
Matt Adams 42 43 43
Omar Narvaez 41 42 43
Travis Jankowski 41 41 42
Elias Diaz 41 41 42
Jeff McNeil 40 41 42
Matt Davidson 40 41 42
Daniel Palka 40 41 42
Steve Pearce 40 41 41
Devon Travis 40 41 41
Leonys Martin 40 40 41
Gorkys Hernandez 39 40 41
Christian Villanueva 38 39 40
Ronald Guzman 38 39 40
David Freese 38 39 39
Jay Bruce 38 39 39
Avisail Garcia 38 38 39
Melky Cabrera 37 38 38
David Dahl 37 38 38
David Fletcher 37 38 38
Cameron Maybin 37 37 38
Wil Myers 37 37 38
Tim Beckham 36 37 38
Gary Sanchez 36 37 38
Daniel Robertson 36 37 38
Manny Pina 36 37 37
Mitch Garver 36 37 37
Josh Harrison 36 37 37
Tony Kemp 36 37 37
Guillermo Heredia 36 37 37
Jose Bautista 35 36 37
Harrison Bader 35 36 37
Yairo Munoz 35 36 36
Tyler White 35 35 36
Ehire Adrianza 35 35 36
Chris Iannetta 35 35 36
Adalberto Mondesi 35 35 36
Chad Pinder 34 35 36
Hunter Dozier 34 35 36
Logan Morrison 34 34 35
Lucas Duda 34 34 35
Ian Happ 33 34 35
Franmil Reyes 34 34 35
JT Riddle 33 34 35
Scott Kingery 33 34 35
Danny Valencia 33 34 34
Logan Forsythe 33 34 34
Hernan Perez 33 33 34
Charlie Culberson 33 33 34
Neil Walker 33 33 34
Robinson Chirinos 32 33 34
Jake Bauers 32 33 34
Alen Hanson 32 33 33
Ben Gamel 31 32 33
Adam Duvall 31 32 33
Russell Martin 31 32 33
Austin Hedges 31 31 32
Adeiny Hechavarria 31 31 32
Jorge Soler 30 31 32
James McCann 30 31 32
Martin Maldonado 30 31 31
Kevin Kiermaier 29 30 31
Matt Wieters 30 30 31
John Hicks 29 30 31
Delino DeShields 29 30 31
Luke Voit 29 30 30
Lourdes Gurriel 29 29 30
Devin Mesoraco 29 29 30
Jake Cave 28 29 30
JaCoby Jones 28 29 30
Adam Engel 28 29 30
Nick Delmonico 28 28 29
Renato Nunez 27 28 29
Ji-Man Choi 27 28 28
Willy Adames 27 28 29
Pablo Sandoval 27 28 28
Greg Bird 27 28 28
Carlos Gomez 26 27 28
Austin Romine 26 27 27
Nick Hundley 26 27 27
Tyler Flowers 26 27 27
Michael Taylor 26 27 27
Rosell Herrera 26 26 27
Josh Donaldson 25 26 26
Orlando Arcia 25 26 26
Mark Reynolds 25 25 26
Ryan O’Hearn 25 25 26
Kevan Smith 25 25 26
Leury Garcia 24 25 26
Kevin Plawecki 24 25 25
Austin Meadows 24 25 25
Tyler Austin 24 25 25
Matthew Joyce 23 24 24
Eric Thames 23 24 25
Zack Cozart 23 24 24
Jose Reyes 23 24 24
Steven Souza 23 23 24
Mike Zunino 23 23 24
Jorge Bonifacio 23 23 24
Joey Rickard 23 23 24
Phil Ervin 23 23 24
Greg Allen 22 23 24
Howie Kendrick 22 23 23
Hanley Ramirez 22 23 23
Nick Martini 22 22 23
Dexter Fowler 22 22 23
Miguel Cabrera 22 22 23
Cory Spangenberg 21 22 23
Brad Miller 21 22 22
Jorge Alfaro 21 22 23
Christian Vazquez 21 22 22
Lewis Brinson 20 21 22
Tommy La Stella 20 21 21
Jace Peterson 20 21 21
Ramon Laureano 20 21 21
Jefry Marte 20 20 21
Chris Owings 20 20 21
Erik Kratz 20 20 21
Cedric Mullins 20 20 21
Domingo Santana 20 20 21
Caleb Joseph 20 20 21
Jarrod Dyson 20 20 20
Brian McCann 20 20 20
Brandon Guyer 19 20 20
Max Stassi 19 20 20
Curt Casali 19 20 20
Adrian Gonzalez 19 19 20
Mikie Mahtook 19 19 20
A. J. Ellis 18 19 19
Martin Prado 18 19 19
Preston Tucker 18 19 19
Tony Wolters 18 19 19
Jake Lamb 18 18 19
Ronny Rodriguez 18 18 18
Craig Gentry 18 18 18
Miguel Sano 17 18 19
Luke Maile 17 18 18
Hunter Pence 17 18 18
Welington Castillo 18 18 18
Willians Astudillo 18 18 18
Greg Garcia 17 18 18
Dixon Machado 17 18 18
Austin Jackson 17 17 18
Yandy Diaz 17 17 18
Jim Adduci 17 17 18
Aaron Altherr 16 17 18
Brandon Lowe 17 17 17
Yoenis Cespedes 16 17 17
Johnny Field 16 17 17
Chase Utley 16 16 17
Tyler Naquin 16 16 17
Dustin Fowler 16 16 17
Jose Fernandez 16 16 16
Carlos Asuaje 15 16 16
Billy McKinney 16 16 16
Roman Quinn 15 16 16
Ryan LaMarre 14 15 15
Blake Swihart 14 15 15
Brian Goodwin 14 15 15
Jake Marisnick 14 15 15
Lonnie Chisenhall 14 15 15
Victor Caratini 14 14 15
Noel Cuevas 14 14 15
Chris Davis 13 14 15
Corey Seager 14 14 14
Austin Barnes 13 14 14
Ryan McMahon 13 14 14
David Bote 13 14 14
Victor Reyes 13 14 14
Mason Williams 13 14 14
Rajai Davis 13 14 14
Spencer Kieboom 13 13 14
Jesus Sucre 13 13 14
Drew Butera 13 13 13
J. R. Murphy 13 13 13
Franchy Cordero 13 13 13
Erik Gonzalez 13 13 13
Pedro Alvarez 12 13 13
Austin Slater 12 13 13
Luis Valbuena 12 12 13
Rafael Ortega 12 12 13
Gregor Blanco 12 12 13
Jose Rondon 12 12 12
Sandy Leon 12 12 13
Tyler Saladino 12 12 12
Ronald Torreyes 12 12 12
Austin Dean 12 12 12
Steven Duggar 11 12 12
Austin Wynns 11 12 12
Dominic Smith 11 12 12
J. P. Crawford 11 12 12
Charlie Tilson 11 11 12
Ryan Flaherty 11 11 11
Jose Osuna 11 11 11
Rowdy Tellez 11 11 11
Jordan Luplow 11 11 11
Alex Verdugo 10 11 11
Danny Jansen 10 11 11
Abraham Almonte 10 10 11
Tyler O’Neill 10 10 10
Mac Williamson 10 10 10
Bryan Holaday 10 10 10
Dwight Smith 10 10 10
Jose Briceno 10 10 10
Victor Robles 10 10 10
Dan Vogelbach 9 10 10
Pablo Reyes 10 10 10
Alex Avila 9 10 10
Francisco Arcia 9 10 10
Pedro Severino 9 9 10
Peter O’Brien 9 9 9
Dawel Lugo 9 9 9
Christin Stewart 9 9 9
Jeff Mathis 9 9 9
JB Shuck 9 9 9
Cheslor Cuthbert 9 9 9
Willie Calhoun 9 9 9
Chris Young 8 9 9
Tzu-Wei Lin 8 9 9
Alex Blandino 8 9 9
Kelby Tomlinson 8 9 9
Richard Urena 8 9 9
Matt Holliday 8 8 9
Bobby Wilson 8 8 9
Luis Guillorme 8 8 8
Anthony Santander 8 8 8
Juan Lagares 8 8 8
Grayson Greiner 8 8 8
Sean Rodriguez 7 8 8
Rob Refsnyder 8 8 8
Josh Phegley 8 8 8
Chris Herrmann 8 8 8
Michael Perez 8 8 8
Ryan Goins 7 8 8
Keon Broxton 7 7 8
Eric Young 7 7 8
Andrew Knapp 7 7 8
Pat Valaika 7 7 7
David Freitas 7 7 7
Roberto Perez 6 7 7
Taylor Ward 6 7 7
Patrick Wisdom 7 7 7
Kyle Higashioka 6 6 6
Adrian Sanchez 6 6 7
Kyle Farmer 6 6 6
DJ Stewart 6 6 6
Michael Lorenzen 6 6 6
Pete Kozma 6 6 6
Breyvic Valera 6 6 6
Brandon Dixon 6 6 6
Franklin Barreto 6 6 6
Rene Rivera 6 6 6
Ryan Rua 6 6 6
Carlos Tocci 6 6 6
German Marquez 6 6 6
Andrew Stevenson 6 6 6
Isaac Galloway 5 6 6
Jesmuel Valentin 5 5 6
Luis Urias 5 5 5
Gregorio Petit 5 5 5
Christian Arroyo 5 5 5
Reese McGuire 5 5 5
Garrett Hampson 5 5 5
J. D. Davis 5 5 5
Chris Gimenez 5 5 5
Cam Gallagher 5 5 5
Zack Greinke 5 5 5
Clayton Kershaw 4 5 5
Pedro Florimon 4 5 5
Bradley Zimmer 4 5 5
Aramis Garcia 4 4 5
Brandon Drury 4 4 5
Matt Szczur 4 4 5
Chase d’Arnaud 4 4 5
Max Scherzer 4 4 4
Shane Robinson 4 4 4
Andrew Romine 4 4 4
Dilson Herrera 4 4 4
Chance Sisco 4 4 4
Michael Hermosillo 4 4 4
Bruce Maxwell 4 4 4
Magneuris Sierra 3 4 4
Francisco Pena 3 4 4
Max Moroff 4 4 4
Lane Adams 4 4 4
Gio Urshela 3 4 4
John Andreoli 3 4 4
Eric Sogard 3 4 4
Brett Phillips 3 3 4
Rafael Lopez 3 3 4
Raimel Tapia 3 3 3
Sam Travis 3 3 3
Francisco Mejia 3 3 3
Kyle Tucker 3 3 3
Kevin Newman 3 3 3
Brent Suter 3 3 3
Ichiro Suzuki 3 3 3
Tom Murphy 3 3 3
Peter Bourjos 3 3 3
Jose Lobaton 3 3 3
Daniel Castro 3 3 3
Clint Frazier 3 3 3
Brandon Barnes 3 3 3
Drew Robinson 2 3 3
Socrates Brito 3 3 3
Myles Straw 3 3 3
Jason Castro 2 2 3
Tyler Wade 2 2 3
Yadiel Rivera 2 2 3
Tomas Nido 2 2 3
Paulo Orlando 2 2 2
Hanser Alberto 2 2 2
Gordon Beckham 2 2 2
Derek Fisher 2 2 2
Tim Federowicz 2 2 2
Andrew Toles 2 2 2
Christian Walker 2 2 2
Ramon Torres 2 2 2
Steven Matz 2 2 2
Kaleb Cowart 2 2 2
Jon Berti 2 2 2
Taylor Motter 2 2 2
Adam Rosales 2 2 2
Carlos Martinez 2 2 2
Julio Teheran 2 2 2
Ildemaro Vargas 2 2 2
Juan Centeno 2 2 2
Deven Marrero 2 2 2
Ryder Jones 2 2 2
Brandon Woodruff 2 2 2
Jett Bandy 2 2 2
Chris Shaw 2 2 2
Brandon Phillips 2 2 2
Kristopher Negron 2 2 2
Meibrys Viloria 2 2 2
Matt Skole 2 2 2
Steve Wilkerson 1 2 2
Tomas Telis 1 1 2
Adam Moore 1 1 2
Tanner Roark 1 1 2
Travis d’Arnaud 1 1 1
Vince Velasquez 1 1 1
Nick Ciuffo 1 1 2
Ryan Lavarnway 1 1 1
Juan Graterol 1 1 1
Mike Marjama 1 1 1
Jonathan Davis 1 1 1
Mark Zagunis 1 1 1
Jacob Stallings 1 1 1
Carlos Perez 1 1 1
Joe Hudson 1 1 1
Garrett Cooper 1 1 1
Ryan Schimpf 1 1 1
Danny Santana 1 1 1
Rick Porcello 1 1 1
Andrew Velazquez 1 1 1
A. J. Cole 1 1 1
Luis Sardinas 1 1 1
Chris Stewart 1 1 1
Jack Reinheimer 1 1 1
Philip Gosselin 1 1 1
Patrick Kivlehan 1 1 1
Carson Kelly 1 1 1
Jacob Nottingham 1 1 1
Dan Jennings 1 1 1
Dustin Garneau 1 1 1
Kyle Gibson 1 1 1
Vidal Nuno 1 1 1
Corban Joseph 1 1 1
Jake Smolinski 1 1 1
Harold Castro 1 1 1
Dustin Pedroia 1 1 1
Hyun-Jin Ryu 1 1 1
Jesse Biddle 1 1 1
Enny Romero 1 1 1
Randy Rosario 1 1 1
Abiatal Avelino 1 1 1
Byron Buxton 0 1 1
Jhoulys Chacin 1 1 1
Steven Brault 1 1 1
Taylor Davis 1 1 1
Jung Ho Kang 1 1 1
Chris Rusin 1 1 1
Zach Vincej 1 1 1
Darnell Sweeney 1 1 1
Ranger Suarez 1 1 1
Tyson Ross 0 1 1
Shane Bieber 1 1 1
Beau Taylor 1 1 1
Sam Gaviglio 0 0 1
Jorge Lopez 0 0 1
Mike Minor 0 0 1
Dennis Santana 0 0 1
Tim Locastro 0 0 1
Miguel Gomez 0 0 0
Kolby Allard 0 0 0
Brett Anderson 0 0 0
Christian Bergman 0 0 0
P. J. Conlon 0 0 0
Matt Grace 0 0 0
Ian Kennedy 0 0 0
Derek Law 0 0 0
Sean Manaea 0 0 0
Chad Sobotka 0 0 0
Christopher Bostick 0 0 0
Dillon Peters 0 0 0
Austin Gomber 0 0 0
Eddie Butler 0 0 0
Jorge De La Rosa 0 0 0
Luke Jackson 0 0 0
David Wright 0 0 0
Brandon Snyder 0 0 0
Drew Hutchison 0 0 0
Ty Kelly 0 0 0
Tyler Chatwood 0 0 0
Nate Orf 0 0 0
Jerry Blevins 0 0 0
Jeff Brigham 0 0 0
Odrisamer Despaigne 0 0 0
Roenis Elias 0 0 0
Terrance Gore 0 0 0
Josh Hader 0 0 0
Brian Johnson 0 0 0
Brad Keller 0 0 0
Deck McGuire 0 0 0
Daniel Mengden 0 0 0
Mike Soroka 0 0 0
Marcus Stroman 0 0 0
Jose Trevino 0 0 0
Gabriel Guerrero 0 0 0
Matt Reynolds 0 0 0
Dan Straily 0 0 0
Tony Cruz 0 0 0
Luis Perdomo 0 0 0
Michael Reed 0 0 0
Boog Powell 0 0 0
Nolan Fontana 0 0 0
Seranthony Dominguez 0 0 0
Brian Duensing 0 0 0
Domingo German 0 0 0
Kevin Kaczmarski 0 0 0
Mike Mayers 0 0 0
Shelby Miller 0 0 0
Blake Snell 0 0 0
Edmundo Sosa 0 0 0
Jackson Stephens 0 0 0
Robert Stephenson 0 0 0
Cliff Pennington 0 0 0
Daniel Poncedeleon 0 0 0
David Hess 0 0 0
Chad Kuhl 0 0 0
J. A. Happ 0 0 0
Jason Vargas 0 0 0
Zach Wheeler 0 0 0
Heath Fillmyer 0 0 0
Colby Rasmus 0 0 0
Chad Wallach 0 0 0
Steven Baron 0 0 0
Dylan Bundy 0 0 0
Dan Butler 0 0 0
Carlos Carrasco 0 0 0
Steve Cishek 0 0 0
Alex Cobb 0 0 0
Merandy Gonzalez 0 0 0
Wade LeBlanc 0 0 0
Alec Mills 0 0 0
Justin Verlander 0 0 0
Brandon Morrow 0 0 0
Brad Peacock 0 0 0
Justin Wilson 0 0 0
Dylan Cozens 0 0 0
Chase Headley 0 0 0
Phillip Evans 0 0 0
Jacob deGrom 0 0 0
Blake Trahan 0 0 0
Drew Anderson 0 0 0
Matt Andriese 0 0 0
Aristides Aquino 0 0 0
Luis Avilan 0 0 0
Tyler Bashlor 0 0 0
Trevor Bauer 0 0 0
Rafael Bautista 0 0 0
Jalen Beeks 0 0 0
Dellin Betances 0 0 0
John Brebbia 0 0 0
Austin Brice 0 0 0
Andrew Cashner 0 0 0
Diego Castillo 0 0 0
Luis Cessa 0 0 0
Jesse Chavez 0 0 0
Yonny Chirinos 0 0 0
Daniel Corcino 0 0 0
Dylan Covey 0 0 0
Zach Duke 0 0 0
Jerad Eickhoff 0 0 0
Marco Estrada 0 0 0
Michael Feliz 0 0 0
Brandon Finnegan 0 0 0
Sam Freeman 0 0 0
Rocky Gale 0 0 0
Amir Garrett 0 0 0
Brett Graves 0 0 0
Heath Hembree 0 0 0
Jordan Hicks 0 0 0
Tim Hill 0 0 0
Daniel Hudson 0 0 0
Raisel Iglesias 0 0 0
Shawn Kelley 0 0 0
Brandon Kintzler 0 0 0
Andrew Kittredge 0 0 0
Reynaldo Lopez 0 0 0
Matt Magill 0 0 0
Lance McCullers 0 0 0
Kris Medlen 0 0 0
Adalberto Mejia 0 0 0
Yohander Mendez 0 0 0
Andrew Miller 0 0 0
Reyes Moronta 0 0 0
Harrison Musgrave 0 0 0
Hector Neris 0 0 0
Daniel Norris 0 0 0
James Norwood 0 0 0
Wes Parsons 0 0 0
Felix Pena 0 0 0
Wandy Peralta 0 0 0
Dustin Peterson 0 0 0
Tim Peterson 0 0 0
Jake Petricka 0 0 0
Neil Ramirez 0 0 0
Yefry Ramirez 0 0 0
A. J. Reed 0 0 0
Alex Reyes 0 0 0
Jacob Rhame 0 0 0
Yacksel Rios 0 0 0
Felipe Vazquez 0 0 0
Hansel Robles 0 0 0
Eduardo Rodriguez 0 0 0
Sergio Romo 0 0 0
Casey Sadler 0 0 0
Warwick Saupold 0 0 0
Troy Scribner 0 0 0
Kevin Shackelford 0 0 0
Chasen Shreve 0 0 0
Lucas Sims 0 0 0
D. J. Snelten 0 0 0
Wander Suero 0 0 0
Masahiro Tanaka 0 0 0
Spencer Turnbull 0 0 0
Julio Urias 0 0 0
Austin Voth 0 0 0
Taijuan Walker 0 0 0
Tyler Webb 0 0 0
Ryan Weber 0 0 0
Aaron Wilkerson 0 0 0
Rio Ruiz 0 0 0
Kyle McGowin 0 0 0
Engelb Vielma 0 0 0
Caleb Ferguson 0 0 0
Max Fried 0 0 0
James Shields 0 0 0
Taylor Williams 0 0 0
Patrick Corbin 0 0 0
Dallas Keuchel 0 0 0
Jake Odorizzi 0 0 0
Robbie Erlin 0 0 0
Chris Archer 0 0 0
Tyler Mahle 0 0 0
Dalton Pompey 0 0 0
Kirby Yates 0 0 0
Cole Hamels -1 0 0
Jefry Rodriguez -1 0 0
Braxton Lee -1 0 0
Pablo Lopez -1 0 0
Tommy Milone -1 0 0
Miguel Montero -1 0 0
Pedro Baez -1 -1 -1
Chris Beck -1 -1 -1
Tyler Beede -1 -1 -1
Jose Berrios -1 -1 -1
Matt Boyd -1 -1 -1
Tyler Cloyd -1 -1 -1
Enyel De Los Santos -1 -1 -1
Danny Duffy -1 -1 -1
Dylan Floro -1 -1 -1
Luiz Gohara -1 -1 -1
Roberto Gomez -1 -1 -1
Marco Gonzales -1 -1 -1
Robert Gsellman -1 -1 -1
Jason Hammel -1 -1 -1
Justin Hancock -1 -1 -1
Clay Holmes -1 -1 -1
Mark Leiter -1 -1 -1
Ben Lively -1 -1 -1
Jonathan Loaisiga -1 -1 -1
Lance Lynn -1 -1 -1
Kazuhisa Makita -1 -1 -1
Keury Mella -1 -1 -1
Erasmo Ramirez -1 -1 -1
Richard Rodriguez -1 -1 -1
Chris Sale -1 -1 -1
Paul Sewald -1 -1 -1
Eric Skoglund -1 -1 -1
Brock Stewart -1 -1 -1
Jake Thompson -1 -1 -1
Ryan Yarbrough -1 -1 -1
Jordan Zimmermann -1 -1 -1
Jakob Junis -1 -1 0
Erick Fedde -1 -1 -1
Stephen Strasburg -1 -1 -1
Trevor Williams -1 -1 -1
Alfredo Gonzalez -1 -1 -1
Efren Navarro -1 -1 -1
Casey Kelly -1 -1 -1
Joe Musgrove -1 -1 -1
Adolis Garcia -1 -1 -1
Moises Sierra -1 -1 -1
Eric Haase -1 -1 -1
Trevor Plouffe -1 -1 -1
Hector Santiago -1 -1 -1
Walker Lockett -1 -1 -1
Jarrod Saltalamacchia -1 -1 -1
Adam Cimber -1 -1 -1
Bartolo Colon -1 -1 -1
Johnny Cueto -1 -1 -1
Austin Davis -1 -1 -1
Luke Farrell -1 -1 -1
Tyler Glasnow -1 -1 -1
Martin Perez -1 -1 -1
Sean Reid-Foley -1 -1 -1
Fernando Romero -1 -1 -1
Joe Ross -1 -1 -1
Drew Rucinski -1 -1 -1
Wade Miley -1 -1 -1
Jaime Barria -1 -1 -1
Charlie Morton -1 -1 -1
Touki Toussaint -1 -1 -1
Anthony Alford -1 -1 -1
Javy Guerra -1 -1 -1
Corey Kluber -1 -1 -1
Nick Kingham -1 -1 -1
John Gant -1 -1 -1
Junior Guerra -1 -1 -1
Luke Weaver -1 -1 -1
Shane Carle -1 -1 -1
Mike Clevinger -1 -1 -1
Michael Fulmer -1 -1 -1
Jaime Garcia -1 -1 -1
Lucas Giolito -1 -1 -1
Sherman Johnson -1 -1 -1
Brett Kennedy -1 -1 -1
Mike Leake -1 -1 -1
Luis Severino -1 -1 -1
Matt Wisler -1 -1 -1
Yu Darvish -1 -1 -1
Mike Tauchman -1 -1 -1
Nathan Eovaldi -1 -1 -1
Andrew Heaney -1 -1 -1
Jeff Samardzija -1 -1 -1
Mitch Walding -1 -1 -1
Ryan Cordell -1 -1 -1
Kevin Gausman -1 -1 -1
Scott Alexander -1 -1 -1
Frankie Montas -1 -1 -1
Adam Wainwright -1 -1 -1
Seth Lugo -1 -1 -1
Michael Wacha -2 -1 -1
Kenta Maeda -2 -1 -1
Matt Strahm -2 -1 -1
Madison Bumgarner -2 -2 -1
Andrew Susac -2 -2 -1
Jarlin Garcia -2 -2 -2
Matt Koch -2 -2 -2
T. J. McFarland -2 -2 -2
Sandy Alcantara -2 -2 -2
Jack Flaherty -2 -2 -2
Zach Davies -2 -2 -2
Bryan Mitchell -2 -2 -2
Jordan Lyles -2 -2 -2
Jeremy Hellickson -2 -2 -2
Homer Bailey -2 -2 -2
Elieser Hernandez -2 -2 -2
Jon Lester -2 -2 -2
Gift Ngoepe -2 -2 -2
Matt den Dekker -2 -2 -2
Walker Buehler -2 -2 -2
Caleb Smith -2 -2 -2
Ross Stripling -2 -2 -2
Gerrit Cole -2 -2 -2
Miles Mikolas -2 -2 -2
Antonio Senzatela -2 -2 -2
Mike Gerber -2 -2 -2
Wei-Yin Chen -2 -2 -2
Trayce Thompson -3 -2 -2
Cody Reed -2 -2 -2
Nick Pivetta -3 -2 -2
Eric Lauer -3 -2 -2
Rich Hill -3 -2 -2
Luis Castillo -3 -3 -2
Dereck Rodriguez -3 -3 -3
Kevin Kramer -3 -3 -3
Jake Arrieta -3 -3 -3
Clayton Richard -3 -3 -3
Jabari Blash -3 -3 -3
Chad Bettis -3 -3 -3
Corey Oswalt -3 -3 -3
Matt Harvey -3 -3 -3
Brandon McCarthy -3 -3 -3
Jacob Nix -3 -3 -3
Ty Blach -3 -3 -3
Freddy Peralta -3 -3 -3
Anthony DeSclafani -3 -3 -3
Trevor Richards -3 -3 -3
Mike Montgomery -4 -4 -3
Jameson Taillon -4 -4 -4
Clay Buchholz -4 -4 -4
Joey Lucchesi -4 -4 -4
Chris Stratton -4 -4 -4
Chase Anderson -4 -4 -4
Robbie Ray -5 -5 -4
Noah Syndergaard -5 -5 -5
Jon Gray -5 -5 -5
Andrew Suarez -5 -5 -5
Jose Quintana -5 -5 -5
Zack Godley -5 -5 -5
Sal Romano -5 -5 -5
Tyler Anderson -6 -6 -5
Alex Wood -6 -6 -5
Anibal Sanchez -6 -6 -6
Zach Eflin -6 -6 -6
Kyle Hendricks -6 -6 -6
Gio Gonzalez -6 -6 -6
Sean Newcomb -7 -7 -7
Derek Holland -7 -7 -7
Kyle Freeland -7 -7 -7
Ivan Nova -8 -8 -7
Aaron Nola -8 -8 -7
Jose Urena -8 -8 -7
Mike Foltynewicz -10 -9 -9

In a future post, we’ll estimate the expected runs from events we would expect players to contribute.