Main Data Set
pitches <- read_csv("Downloads/pitches.csv")
## Rows: 2867154 Columns: 40
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): code, type, pitch_type
## dbl (37): px, pz, start_speed, end_speed, spin_rate, spin_dir, break_angle, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
pitch <- pitches
pitches <- data.frame(
px=pitch$px, pz=pitch$pz,
start_speed=pitch$start_speed,
spin_rate=pitch$spin_rate,
spin_dir=pitch$spin_dir,
break_angle=pitch$break_angle,
break_length=pitch$break_length,
break_y=pitch$break_y,
type_confidence=pitch$type_confidence,
pfx_x=pitch$pfx_x,
pfx_z=pitch$pfx_z,
nasty=pitch$nasty,
zone=pitch$zone,
code=pitch$code,
type=pitch$type,
pitch_type=pitch$pitch_type,
b_count=pitch$b_count,
s_count=pitch$s_count,
outs=pitch$outs,
pitch_num=pitch$pitch_num,
on_1b=pitch$on_1b,
on_2b=pitch$on_2b,
on_3b=pitch$on_3b
)
# Only Last Pitch in AB w/ Certainty in Call
last_pitches <- pitches %>%
filter(code=="X"|code=="D"|code=="E"|code=="H",type_confidence==2) %>%
na.omit(pitches)
#last_pitches$pitch_type<-factor(last_pitches$pitch_type, levels=orderPitch$pitch_type[order(orderPitch$avg)])
last_pitches <- last_pitches %>%
filter(break_length<50000)
curveballs <- last_pitches %>%
filter(pitch_type=="CU")
#last_pitches$pitch_type<-factor(last_pitches$pitch_type, levels=orderPitch$pitch_type[order(orderPitch$avg)])
Option 1
We selected start_speed, spin_rate, spin_dir, break_angle, and pz to predict the break_length, or how much a pitch moves vertically and horizontally in total, of curveballs, a pitch whose main purpose is to break as much as possible. Start_speed is how fast the ball is moving from the pitchers hand to home plate. We expected faster pitches to correlate with less pitch break, as our models had been showing for other pitches. Spin_rate is how many rotations per minute the baseball has on its way to home plate. Because pitches move based on how the ball is spinning, we expected a higher spin rate to correlate with higher break length. Spin_dir shows which direction the ball is spinning in. It’s possible that balls spinning more vertically than horizontally have more movement. Break_angle tells what direction the pitch moves in. While this is similar to spin direction, spin direction is only one of many factors that goes into the angle in which a pitch breaks. Other factors include arm slot, which is whether the pitcher releases the ball more over his head or more to his side. Finally, pz shows the vertical location of the pitch when it hits the catcher’s glove. We believed that it’s possible pitches that are lower in the zone, or have a lower pz, have more movement than higher pitches.
# First, I will perform forward selection.
mod1 <- lm(break_length~start_speed, data=curveballs)
summary(mod1)
##
## Call:
## lm(formula = break_length ~ start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.7261 -0.8796 0.0623 0.9523 5.2502
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.616507 0.184714 225.3 <2e-16 ***
## start_speed -0.376202 0.002364 -159.1 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.308 on 21510 degrees of freedom
## Multiple R-squared: 0.5407, Adjusted R-squared: 0.5406
## F-statistic: 2.532e+04 on 1 and 21510 DF, p-value: < 2.2e-16
mod2 <- lm(break_length~spin_rate, data=curveballs)
summary(mod2)
##
## Call:
## lm(formula = break_length ~ spin_rate, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.0133 -0.7884 0.0416 0.8737 20.3724
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.9859649 0.0272939 329.2 <2e-16 ***
## spin_rate 0.0026250 0.0000204 128.7 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.451 on 21510 degrees of freedom
## Multiple R-squared: 0.435, Adjusted R-squared: 0.4349
## F-statistic: 1.656e+04 on 1 and 21510 DF, p-value: < 2.2e-16
mod3 <- lm(break_length~spin_dir, data=curveballs)
summary(mod3)
##
## Call:
## lm(formula = break_length ~ spin_dir, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.5762 -1.3382 -0.0195 1.2805 17.6352
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.222e+01 1.876e-02 650.994 < 2e-16 ***
## spin_dir 3.516e-04 1.074e-04 3.274 0.00106 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.93 on 21510 degrees of freedom
## Multiple R-squared: 0.0004982, Adjusted R-squared: 0.0004518
## F-statistic: 10.72 on 1 and 21510 DF, p-value: 0.00106
mod4 <- lm(break_length~break_angle, data=curveballs)
summary(mod4)
##
## Call:
## lm(formula = break_length ~ break_angle, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.6635 -1.3480 0.0159 1.3132 17.5611
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.365602 0.014706 840.84 <2e-16 ***
## break_angle 0.020547 0.001299 15.82 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.919 on 21510 degrees of freedom
## Multiple R-squared: 0.01151, Adjusted R-squared: 0.01146
## F-statistic: 250.4 on 1 and 21510 DF, p-value: < 2.2e-16
mod5 <- lm(break_length~pz, data=curveballs)
summary(mod5)
##
## Call:
## lm(formula = break_length ~ pz, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.5710 -1.3559 0.0162 1.3225 17.7453
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.35508 0.04718 261.867 <2e-16 ***
## pz -0.04560 0.02159 -2.112 0.0347 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.93 on 21510 degrees of freedom
## Multiple R-squared: 0.0002074, Adjusted R-squared: 0.0001609
## F-statistic: 4.462 on 1 and 21510 DF, p-value: 0.03468
# Because there was a three-way tie for lowest p-value, I picked the first variable to be added based on highest adjusted r-squared, which meant start_speed.
mod1 <- lm(break_length~spin_rate+start_speed, data=curveballs)
summary(mod1)
##
## Call:
## lm(formula = break_length ~ spin_rate + start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.6215 -0.3476 0.1969 0.5745 9.3874
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.433e+01 1.306e-01 262.8 <2e-16 ***
## spin_rate 2.068e-03 1.257e-05 164.5 <2e-16 ***
## start_speed -3.159e-01 1.615e-03 -195.6 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8705 on 21509 degrees of freedom
## Multiple R-squared: 0.7966, Adjusted R-squared: 0.7966
## F-statistic: 4.213e+04 on 2 and 21509 DF, p-value: < 2.2e-16
mod2 <- lm(break_length~spin_dir+start_speed, data=curveballs)
summary(mod2)
##
## Call:
## lm(formula = break_length ~ spin_dir + start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.6841 -0.8685 0.0583 0.9351 4.9924
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.249e+01 1.869e-01 227.28 <2e-16 ***
## spin_dir -1.602e-03 7.298e-05 -21.95 <2e-16 ***
## start_speed -3.848e-01 2.371e-03 -162.30 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.294 on 21509 degrees of freedom
## Multiple R-squared: 0.5507, Adjusted R-squared: 0.5507
## F-statistic: 1.318e+04 on 2 and 21509 DF, p-value: < 2.2e-16
mod3 <- lm(break_length~break_angle+start_speed, data=curveballs)
summary(mod3)
##
## Call:
## lm(formula = break_length ~ break_angle + start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.8077 -0.8769 0.0590 0.9445 5.1421
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.9041307 0.1872971 223.731 <2e-16 ***
## break_angle -0.0078912 0.0009018 -8.751 <2e-16 ***
## start_speed -0.3804109 0.0024087 -157.935 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.306 on 21509 degrees of freedom
## Multiple R-squared: 0.5423, Adjusted R-squared: 0.5423
## F-statistic: 1.274e+04 on 2 and 21509 DF, p-value: < 2.2e-16
mod4 <- lm(break_length~pz+start_speed, data=curveballs)
summary(mod4)
##
## Call:
## lm(formula = break_length ~ pz + start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.5991 -0.8830 0.0571 0.9519 5.4896
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 41.890633 0.187930 222.906 < 2e-16 ***
## pz -0.111618 0.014618 -7.635 2.34e-14 ***
## start_speed -0.376713 0.002362 -159.483 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.306 on 21509 degrees of freedom
## Multiple R-squared: 0.5419, Adjusted R-squared: 0.5419
## F-statistic: 1.272e+04 on 2 and 21509 DF, p-value: < 2.2e-16
# The next variable to be added is spin_rate
mod1 <- lm(break_length~spin_dir+spin_rate+start_speed, data=curveballs)
summary(mod1)
##
## Call:
## lm(formula = break_length ~ spin_dir + spin_rate + start_speed,
## data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.6136 -0.3494 0.1949 0.5754 9.3439
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.446e+01 1.352e-01 254.794 < 2e-16 ***
## spin_dir -1.725e-04 4.988e-05 -3.458 0.000545 ***
## spin_rate 2.060e-03 1.277e-05 161.345 < 2e-16 ***
## start_speed -3.171e-01 1.649e-03 -192.285 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8703 on 21508 degrees of freedom
## Multiple R-squared: 0.7967, Adjusted R-squared: 0.7967
## F-statistic: 2.81e+04 on 3 and 21508 DF, p-value: < 2.2e-16
mod2 <- lm(break_length~break_angle+spin_rate+start_speed, data=curveballs)
summary(mod2)
##
## Call:
## lm(formula = break_length ~ break_angle + spin_rate + start_speed,
## data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.4418 -0.3287 0.2019 0.5464 9.9996
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.297e+01 1.312e-01 251.21 <2e-16 ***
## break_angle 2.347e-02 6.087e-04 38.55 <2e-16 ***
## spin_rate 2.213e-03 1.272e-05 173.91 <2e-16 ***
## start_speed -2.992e-01 1.622e-03 -184.49 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8419 on 21508 degrees of freedom
## Multiple R-squared: 0.8098, Adjusted R-squared: 0.8097
## F-statistic: 3.052e+04 on 3 and 21508 DF, p-value: < 2.2e-16
mod3 <- lm(break_length~pz+spin_rate+start_speed, data=curveballs)
summary(mod3)
##
## Call:
## lm(formula = break_length ~ pz + spin_rate + start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.4699 -0.3413 0.1962 0.5711 9.6799
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.465e+01 1.321e-01 262.30 <2e-16 ***
## pz -1.341e-01 9.698e-03 -13.83 <2e-16 ***
## spin_rate 2.070e-03 1.251e-05 165.44 <2e-16 ***
## start_speed -3.165e-01 1.609e-03 -196.72 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8667 on 21508 degrees of freedom
## Multiple R-squared: 0.7984, Adjusted R-squared: 0.7984
## F-statistic: 2.84e+04 on 3 and 21508 DF, p-value: < 2.2e-16
# The next variable to be added, again, based on adjusted r-squared, is break_angle
mod1 <- lm(break_length~spin_dir+break_angle+spin_rate+start_speed, data=curveballs)
summary(mod1)
##
## Call:
## lm(formula = break_length ~ spin_dir + break_angle + spin_rate +
## start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.0260 -0.2565 0.1409 0.4307 9.9774
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.351e+01 1.243e-01 269.66 <2e-16 ***
## spin_dir -3.524e-03 6.841e-05 -51.51 <2e-16 ***
## break_angle 5.664e-02 8.628e-04 65.64 <2e-16 ***
## spin_rate 2.258e-03 1.204e-05 187.59 <2e-16 ***
## start_speed -2.990e-01 1.530e-03 -195.44 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7944 on 21507 degrees of freedom
## Multiple R-squared: 0.8307, Adjusted R-squared: 0.8306
## F-statistic: 2.638e+04 on 4 and 21507 DF, p-value: < 2.2e-16
mod1 <- lm(break_length~pz+break_angle+spin_rate+start_speed, data=curveballs)
summary(mod1)
##
## Call:
## lm(formula = break_length ~ pz + break_angle + spin_rate + start_speed,
## data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.2786 -0.3203 0.2014 0.5416 10.3169
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.330e+01 1.323e-01 251.66 <2e-16 ***
## pz -1.428e-01 9.374e-03 -15.24 <2e-16 ***
## break_angle 2.369e-02 6.056e-04 39.11 <2e-16 ***
## spin_rate 2.217e-03 1.266e-05 175.11 <2e-16 ***
## start_speed -2.996e-01 1.613e-03 -185.71 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8374 on 21507 degrees of freedom
## Multiple R-squared: 0.8118, Adjusted R-squared: 0.8118
## F-statistic: 2.319e+04 on 4 and 21507 DF, p-value: < 2.2e-16
# Continuing the process, we add spin direction
mod1 <- lm(break_length~pz+spin_dir+break_angle+spin_rate+start_speed, data=curveballs)
summary(mod1)
##
## Call:
## lm(formula = break_length ~ pz + spin_dir + break_angle + spin_rate +
## start_speed, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.8595 -0.2482 0.1434 0.4257 10.2999
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.385e+01 1.252e-01 270.39 <2e-16 ***
## pz -1.452e-01 8.837e-03 -16.43 <2e-16 ***
## spin_dir -3.529e-03 6.798e-05 -51.91 <2e-16 ***
## break_angle 5.692e-02 8.577e-04 66.36 <2e-16 ***
## spin_rate 2.262e-03 1.197e-05 189.06 <2e-16 ***
## start_speed -2.995e-01 1.521e-03 -196.92 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7894 on 21506 degrees of freedom
## Multiple R-squared: 0.8328, Adjusted R-squared: 0.8327
## F-statistic: 2.142e+04 on 5 and 21506 DF, p-value: < 2.2e-16
Because all variables are still significant, this is our final model for forward selection. Our model uses spin rate, spin direction, pitch speed, break angle, and vertical location to predict the total break length for curveballs. Our model has a fairly high adjusted r-squared value of 0.8327, meaning that a good amount of the variation in break length of curveballs can be explained by these variables. While having this many explanatory variables might not seem parsimonious, each variable individually increased the adjusted r-squared and was significant.
# Next, I perform backwards selection starting with all variables in the model
mod1 <- lm(break_length~start_speed+spin_rate+spin_dir+break_angle+pz, data=curveballs)
summary(mod1)
##
## Call:
## lm(formula = break_length ~ start_speed + spin_rate + spin_dir +
## break_angle + pz, data = curveballs)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.8595 -0.2482 0.1434 0.4257 10.2999
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.385e+01 1.252e-01 270.39 <2e-16 ***
## start_speed -2.995e-01 1.521e-03 -196.92 <2e-16 ***
## spin_rate 2.262e-03 1.197e-05 189.06 <2e-16 ***
## spin_dir -3.529e-03 6.798e-05 -51.91 <2e-16 ***
## break_angle 5.692e-02 8.577e-04 66.36 <2e-16 ***
## pz -1.452e-01 8.837e-03 -16.43 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7894 on 21506 degrees of freedom
## Multiple R-squared: 0.8328, Adjusted R-squared: 0.8327
## F-statistic: 2.142e+04 on 5 and 21506 DF, p-value: < 2.2e-16
Because all five variables we selected were significant, our model requires no alterations. We have the same model for both forward and backward selection. To reiterate, we wanted to use spin rate, spin direction, pitch speed, break angle, and vertical location to try and predict the total break length for curveballs. We feel as though we were successful in our goal, creating a model with a high adjusted r-squared of 0.8327, which shows that a solid amount of the variation in break length of curveballs can be explained by these variables.
str(curveballs)
## 'data.frame': 21512 obs. of 23 variables:
## $ px : num -0.08 0.72 -0.58 0.08 -0.17 -0.85 -0.45 0.48 -0.231 -0.469 ...
## $ pz : num 2.2 1.56 2.53 2.2 2.78 ...
## $ start_speed : num 78.6 65.6 67.2 64.5 65.6 79 66.1 68.9 77.9 77.3 ...
## $ spin_rate : num 2760 1930 1879 1920 2174 ...
## $ spin_dir : num 34.7 45.7 40.1 39.9 36.3 ...
## $ break_angle : num -14.5 -13.4 -11.7 -11.6 -11.8 -13.8 -9 8.5 -13.3 9.4 ...
## $ break_length : num 15.9 18.6 17.8 19.3 19.6 15 17.5 19.5 13.1 13.3 ...
## $ break_y : num 23.8 23.8 23.8 23.8 23.7 23.8 23.8 23.7 23.7 23.7 ...
## $ type_confidence: num 2 2 2 2 2 2 2 2 2 2 ...
## $ pfx_x : num 9.49 10.02 8.53 9.08 9.41 ...
## $ pfx_z : num -13.76 -9.86 -10.2 -10.95 -12.87 ...
## $ nasty : num 18 47 32 19 18 58 40 28 35 47 ...
## $ zone : num 8 14 4 5 5 13 7 6 13 13 ...
## $ code : chr "X" "X" "X" "D" ...
## $ type : chr "X" "X" "X" "X" ...
## $ pitch_type : chr "CU" "CU" "CU" "CU" ...
## $ b_count : num 2 1 0 1 3 1 2 0 1 2 ...
## $ s_count : num 1 1 1 1 2 2 1 2 2 2 ...
## $ outs : num 2 0 1 2 2 0 1 1 1 0 ...
## $ pitch_num : num 4 3 2 3 6 4 4 3 4 7 ...
## $ on_1b : num 0 0 0 0 0 0 0 0 0 0 ...
## $ on_2b : num 0 0 0 0 1 0 0 0 0 0 ...
## $ on_3b : num 0 0 0 0 0 0 0 0 0 0 ...
names(curveballs)
## [1] "px" "pz" "start_speed" "spin_rate"
## [5] "spin_dir" "break_angle" "break_length" "break_y"
## [9] "type_confidence" "pfx_x" "pfx_z" "nasty"
## [13] "zone" "code" "type" "pitch_type"
## [17] "b_count" "s_count" "outs" "pitch_num"
## [21] "on_1b" "on_2b" "on_3b"
# Now to automate the process.
#install.packages("leaps", repo = 'https://mac.R-project.org')
library(leaps)
selectDat<-curveballs[,-16]
regfit.full<-regsubsets(break_length~., data=selectDat)
## Warning in leaps.setup(x, y, wt = wt, nbest = nbest, nvmax = nvmax, force.in =
## force.in, : 2 linear dependencies found
## Reordering variables and trying again:
summary(regfit.full)
## Subset selection object
## Call: regsubsets.formula(break_length ~ ., data = selectDat)
## 23 Variables (and intercept)
## Forced in Forced out
## px FALSE FALSE
## pz FALSE FALSE
## start_speed FALSE FALSE
## spin_rate FALSE FALSE
## spin_dir FALSE FALSE
## break_angle FALSE FALSE
## break_y FALSE FALSE
## pfx_x FALSE FALSE
## pfx_z FALSE FALSE
## nasty FALSE FALSE
## zone FALSE FALSE
## codeE FALSE FALSE
## codeH FALSE FALSE
## codeX FALSE FALSE
## b_count FALSE FALSE
## s_count FALSE FALSE
## outs FALSE FALSE
## pitch_num FALSE FALSE
## on_1b FALSE FALSE
## on_2b FALSE FALSE
## on_3b FALSE FALSE
## type_confidence FALSE FALSE
## typeX FALSE FALSE
## 1 subsets of each size up to 9
## Selection Algorithm: exhaustive
## px pz start_speed spin_rate spin_dir break_angle break_y
## 1 ( 1 ) " " " " " " " " " " " " " "
## 2 ( 1 ) " " " " "*" " " " " " " " "
## 3 ( 1 ) " " " " "*" "*" " " " " " "
## 4 ( 1 ) " " " " "*" "*" " " " " "*"
## 5 ( 1 ) " " "*" "*" "*" " " " " "*"
## 6 ( 1 ) "*" "*" "*" "*" " " " " "*"
## 7 ( 1 ) "*" "*" "*" "*" " " "*" "*"
## 8 ( 1 ) "*" "*" "*" "*" " " "*" "*"
## 9 ( 1 ) "*" "*" "*" "*" " " "*" "*"
## type_confidence pfx_x pfx_z nasty zone codeE codeH codeX typeX b_count
## 1 ( 1 ) " " " " "*" " " " " " " " " " " " " " "
## 2 ( 1 ) " " " " "*" " " " " " " " " " " " " " "
## 3 ( 1 ) " " " " "*" " " " " " " " " " " " " " "
## 4 ( 1 ) " " " " "*" " " " " " " " " " " " " " "
## 5 ( 1 ) " " " " "*" " " " " " " " " " " " " " "
## 6 ( 1 ) " " " " "*" " " " " " " " " " " " " " "
## 7 ( 1 ) " " " " "*" " " " " " " " " " " " " " "
## 8 ( 1 ) " " " " "*" "*" " " " " " " " " " " " "
## 9 ( 1 ) " " " " "*" "*" " " " " "*" " " " " " "
## s_count outs pitch_num on_1b on_2b on_3b
## 1 ( 1 ) " " " " " " " " " " " "
## 2 ( 1 ) " " " " " " " " " " " "
## 3 ( 1 ) " " " " " " " " " " " "
## 4 ( 1 ) " " " " " " " " " " " "
## 5 ( 1 ) " " " " " " " " " " " "
## 6 ( 1 ) " " " " " " " " " " " "
## 7 ( 1 ) " " " " " " " " " " " "
## 8 ( 1 ) " " " " " " " " " " " "
## 9 ( 1 ) " " " " " " " " " " " "