9.2 Transition Matrices

9.2.1 Transition states

  • 24 state labels
  • 25 new_state labels
# transition matrix
T_matrix <- retro2016_complete |> select(state, new_state) |> table()
Play State Transition Matrix
2016 Season
state 000 0 000 1 000 2 001 0 001 1 001 2 010 0 010 1 010 2 011 0 011 1 011 2 100 0 100 1 100 2 101 0 101 1 101 2 110 0 110 1 110 2 111 0 111 1 111 2 3
000 0 1512 30632 0 255 0 0 2278 0 0 0 0 0 10641 0 0 0 0 0 0 0 0 0 0 0 0
000 1 0 950 22530 0 169 0 0 1520 0 0 0 0 0 7675 0 0 0 0 0 0 0 0 0 0 0
000 2 0 0 831 0 0 122 0 0 1193 0 0 0 0 0 6213 0 0 0 0 0 0 0 0 0 18042
001 0 12 109 3 5 224 0 25 1 0 0 0 0 72 4 0 54 0 0 0 0 0 0 0 0 0
001 1 0 39 372 0 10 644 0 85 10 0 0 0 0 331 35 0 270 0 0 0 0 0 0 0 14
001 2 0 0 61 0 0 17 0 0 115 0 0 0 0 0 358 0 0 446 0 0 0 0 0 0 1776
010 0 99 13 19 17 806 0 174 1270 0 15 0 0 171 52 0 303 0 0 326 0 0 0 0 0 0
010 1 0 151 22 0 28 958 0 240 2269 0 15 0 0 311 55 0 336 0 0 681 0 0 0 0 32
010 2 0 0 155 0 0 39 0 0 383 0 0 3 0 0 495 0 0 216 0 0 1035 0 0 0 4321
011 0 24 1 1 5 99 2 20 50 1 1 242 0 30 3 0 52 6 0 6 6 0 95 0 0 0
011 1 0 36 6 0 13 190 0 60 141 0 9 480 0 87 6 0 131 23 0 9 16 0 306 0 23
011 2 0 0 38 0 0 12 0 0 87 0 0 1 0 0 125 0 0 53 0 0 1 0 0 328 1237
100 0 314 4 1223 46 22 0 157 943 0 372 0 0 0 4479 0 421 0 0 1966 0 0 0 0 0 0
100 1 0 353 13 0 80 47 0 178 825 0 382 0 0 2 5543 0 497 0 0 2414 0 0 0 0 1564
100 2 0 0 338 0 0 67 0 0 255 0 0 255 0 0 9 0 0 505 0 0 2261 0 0 0 7926
101 0 28 1 89 11 3 10 8 41 2 30 37 0 0 138 3 31 232 0 132 22 0 63 0 0 0
101 1 0 72 2 0 14 7 0 20 127 0 69 46 0 0 324 0 75 456 0 260 26 0 148 0 253
101 2 0 0 63 0 0 16 0 0 53 0 0 46 0 0 1 0 0 129 0 0 230 0 0 235 1689
110 0 81 1 0 8 5 219 27 6 28 88 281 0 0 7 22 55 266 0 82 830 0 417 0 0 5
110 1 0 127 3 0 32 7 0 63 11 0 146 313 0 1 10 0 129 421 0 214 1598 0 716 0 544
110 2 0 0 156 0 0 28 0 0 125 0 0 146 0 0 2 0 0 242 0 0 249 0 0 648 3794
111 0 18 0 0 2 0 46 9 1 3 20 27 18 0 7 0 24 64 2 27 49 4 113 242 0 2
111 1 0 44 3 0 13 1 0 18 2 0 57 84 0 0 5 0 41 169 0 86 123 0 254 531 211
111 2 0 0 46 0 0 15 0 0 31 0 0 61 0 0 0 0 0 87 0 0 100 0 0 204 1370
table code
T_df <- T_matrix |> 
  as.data.frame() |>
  pivot_wider(names_from = new_state, values_from = Freq)

T_df |>
  gt() |>
  cols_align(align = "center") |>
  data_color(columns = -state,
             palette = "inferno") |>
  tab_header(title = "Play State Transition Matrix",
             subtitle = "2016 Season")

9.2.2 Absorbing states

When the inning reaches 3 outs, then it stays at 3 outs, so the probability of staying in this state is 1

# probability matrix
P_matrix <- prop.table(T_matrix, 1)
P_matrix <- P_matrix |> rbind("3" = c(rep(0, 24), 1))
Play State Transition Probability Matrix
2016 Season
state 000 0 000 1 000 2 001 0 001 1 001 2 010 0 010 1 010 2 011 0 011 1 011 2 100 0 100 1 100 2 101 0 101 1 101 2 110 0 110 1 110 2 111 0 111 1 111 2 3
000 0 0.033 0.676 0.000 0.006 0.000 0.000 0.050 0.000 0.000 0.000 0.000 0.000 0.235 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
000 1 0.000 0.029 0.686 0.000 0.005 0.000 0.000 0.046 0.000 0.000 0.000 0.000 0.000 0.234 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
000 2 0.000 0.000 0.031 0.000 0.000 0.005 0.000 0.000 0.045 0.000 0.000 0.000 0.000 0.000 0.235 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.683
001 0 0.024 0.214 0.006 0.010 0.440 0.000 0.049 0.002 0.000 0.000 0.000 0.000 0.141 0.008 0.000 0.106 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
001 1 0.000 0.022 0.206 0.000 0.006 0.356 0.000 0.047 0.006 0.000 0.000 0.000 0.000 0.183 0.019 0.000 0.149 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.008
001 2 0.000 0.000 0.022 0.000 0.000 0.006 0.000 0.000 0.041 0.000 0.000 0.000 0.000 0.000 0.129 0.000 0.000 0.161 0.000 0.000 0.000 0.000 0.000 0.000 0.640
010 0 0.030 0.004 0.006 0.005 0.247 0.000 0.053 0.389 0.000 0.005 0.000 0.000 0.052 0.016 0.000 0.093 0.000 0.000 0.100 0.000 0.000 0.000 0.000 0.000 0.000
010 1 0.000 0.030 0.004 0.000 0.005 0.188 0.000 0.047 0.445 0.000 0.003 0.000 0.000 0.061 0.011 0.000 0.066 0.000 0.000 0.134 0.000 0.000 0.000 0.000 0.006
010 2 0.000 0.000 0.023 0.000 0.000 0.006 0.000 0.000 0.058 0.000 0.000 0.000 0.000 0.000 0.074 0.000 0.000 0.032 0.000 0.000 0.156 0.000 0.000 0.000 0.650
011 0 0.037 0.002 0.002 0.008 0.154 0.003 0.031 0.078 0.002 0.002 0.376 0.000 0.047 0.005 0.000 0.081 0.009 0.000 0.009 0.009 0.000 0.148 0.000 0.000 0.000
011 1 0.000 0.023 0.004 0.000 0.008 0.124 0.000 0.039 0.092 0.000 0.006 0.312 0.000 0.057 0.004 0.000 0.085 0.015 0.000 0.006 0.010 0.000 0.199 0.000 0.015
011 2 0.000 0.000 0.020 0.000 0.000 0.006 0.000 0.000 0.046 0.000 0.000 0.001 0.000 0.000 0.066 0.000 0.000 0.028 0.000 0.000 0.001 0.000 0.000 0.174 0.657
100 0 0.032 0.000 0.123 0.005 0.002 0.000 0.016 0.095 0.000 0.037 0.000 0.000 0.000 0.450 0.000 0.042 0.000 0.000 0.198 0.000 0.000 0.000 0.000 0.000 0.000
100 1 0.000 0.030 0.001 0.000 0.007 0.004 0.000 0.015 0.069 0.000 0.032 0.000 0.000 0.000 0.466 0.000 0.042 0.000 0.000 0.203 0.000 0.000 0.000 0.000 0.131
100 2 0.000 0.000 0.029 0.000 0.000 0.006 0.000 0.000 0.022 0.000 0.000 0.022 0.000 0.000 0.001 0.000 0.000 0.043 0.000 0.000 0.195 0.000 0.000 0.000 0.682
101 0 0.032 0.001 0.101 0.012 0.003 0.011 0.009 0.047 0.002 0.034 0.042 0.000 0.000 0.157 0.003 0.035 0.263 0.000 0.150 0.025 0.000 0.072 0.000 0.000 0.000
101 1 0.000 0.038 0.001 0.000 0.007 0.004 0.000 0.011 0.067 0.000 0.036 0.024 0.000 0.000 0.171 0.000 0.039 0.240 0.000 0.137 0.014 0.000 0.078 0.000 0.133
101 2 0.000 0.000 0.026 0.000 0.000 0.006 0.000 0.000 0.022 0.000 0.000 0.019 0.000 0.000 0.000 0.000 0.000 0.052 0.000 0.000 0.093 0.000 0.000 0.095 0.686
110 0 0.033 0.000 0.000 0.003 0.002 0.090 0.011 0.002 0.012 0.036 0.116 0.000 0.000 0.003 0.009 0.023 0.110 0.000 0.034 0.342 0.000 0.172 0.000 0.000 0.002
110 1 0.000 0.029 0.001 0.000 0.007 0.002 0.000 0.015 0.003 0.000 0.034 0.072 0.000 0.000 0.002 0.000 0.030 0.097 0.000 0.049 0.369 0.000 0.165 0.000 0.125
110 2 0.000 0.000 0.029 0.000 0.000 0.005 0.000 0.000 0.023 0.000 0.000 0.027 0.000 0.000 0.000 0.000 0.000 0.045 0.000 0.000 0.046 0.000 0.000 0.120 0.704
111 0 0.027 0.000 0.000 0.003 0.000 0.068 0.013 0.001 0.004 0.029 0.040 0.027 0.000 0.010 0.000 0.035 0.094 0.003 0.040 0.072 0.006 0.167 0.357 0.000 0.003
111 1 0.000 0.027 0.002 0.000 0.008 0.001 0.000 0.011 0.001 0.000 0.035 0.051 0.000 0.000 0.003 0.000 0.025 0.103 0.000 0.052 0.075 0.000 0.155 0.323 0.129
111 2 0.000 0.000 0.024 0.000 0.000 0.008 0.000 0.000 0.016 0.000 0.000 0.032 0.000 0.000 0.000 0.000 0.000 0.045 0.000 0.000 0.052 0.000 0.000 0.107 0.716
3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000
table code
P_df <- P_matrix |> as.data.frame()
P_df <- cbind(c(as.character(T_df$state), "3"), P_df)
colnames(P_df)[1] <- "state"

P_df |>
  gt() |>
  cols_align(align = "center") |>
  data_color(columns = -state,
             palette = "inferno") |>
  fmt_number(columns = -state,
             decimals = 3) |>
  tab_header(title = "Play State Transition Probability Matrix",
             subtitle = "2016 Season")

9.2.3 Examples

we display the transition probabilities starting at the “000 0” state, no runners and no outs below

Play State Transition Probability Matrix
2016 Season
state new_state Prob
000 0 000 1 0.676
000 0 100 0 0.235
000 0 010 0 0.050
000 0 000 0 0.033
000 0 001 0 0.006
table code
P_matrix |>
  as_tibble(rownames = "state") |>
  filter(state == "000 0") |>
  pivot_longer(
    cols = -state, 
    names_to = "new_state", 
    values_to = "Prob" 
  ) |>
  filter(Prob > 0) |>
  arrange(desc(Prob)) |>
  gt() |>
  cols_align(align = "center") |>
  data_color(columns = Prob,
             palette = "inferno") |>
  fmt_number(columns = Prob,
             decimals = 3) |>
  tab_header(title = "Play State Transition Probability Matrix",
             subtitle = "2016 Season")

starting from the “010 2” state, runner on second with two outs

Play State Transition Probability Matrix
2016 Season
state new_state Prob
010 2 3 0.650
010 2 110 2 0.156
010 2 100 2 0.074
010 2 010 2 0.058
010 2 101 2 0.032
010 2 000 2 0.023
010 2 001 2 0.006
010 2 011 2 0.000
table code
P_matrix |>
  as_tibble(rownames = "state") |>
  filter(state == "010 2") |>
  pivot_longer(
    cols = -state, 
    names_to = "new_state", 
    values_to = "Prob" 
  ) |>
  filter(Prob > 0) |>
  arrange(desc(Prob)) |>
  gt() |>
  cols_align(align = "center") |>
  data_color(columns = Prob,
             palette = "inferno") |>
  fmt_number(columns = Prob,
             decimals = 3) |>
  tab_header(title = "Play State Transition Probability Matrix",
             subtitle = "2016 Season")