Spaces:
Running
Running
Update app.R
Browse files
app.R
CHANGED
|
@@ -2205,78 +2205,50 @@ create_advanced_pitch_characteristics <- function(data, player_name) {
|
|
| 2205 |
}
|
| 2206 |
|
| 2207 |
if (!is.null(stuffplus_model) && nrow(pitcher_data) > 0) {
|
| 2208 |
-
|
| 2209 |
-
|
| 2210 |
-
|
| 2211 |
-
|
| 2212 |
-
|
| 2213 |
-
|
| 2214 |
-
|
| 2215 |
-
|
| 2216 |
-
|
| 2217 |
-
|
| 2218 |
-
|
| 2219 |
-
|
| 2220 |
-
|
| 2221 |
pitcher_data <- standardize_stuffplus_to_league(pitcher_data, combined)
|
| 2222 |
-
|
| 2223 |
-
actual_mean <- mean(pitcher_data$stuff_plus, na.rm = TRUE)
|
| 2224 |
-
actual_sd <- sd(pitcher_data$stuff_plus, na.rm = TRUE)
|
| 2225 |
-
|
| 2226 |
-
suppressWarnings(message(
|
| 2227 |
-
"Stuff+ summary for ", player_name, ":",
|
| 2228 |
-
"\n Min=", round(min(pitcher_data$stuff_plus, na.rm = TRUE), 1),
|
| 2229 |
-
" | Max=", round(max(pitcher_data$stuff_plus, na.rm = TRUE), 1),
|
| 2230 |
-
"\n Mean=", round(actual_mean, 1),
|
| 2231 |
-
" | SD=", round(actual_sd, 1),
|
| 2232 |
-
"\n 25th=", round(quantile(pitcher_data$stuff_plus, 0.25, na.rm = TRUE), 1),
|
| 2233 |
-
" | 50th=", round(quantile(pitcher_data$stuff_plus, 0.50, na.rm = TRUE), 1),
|
| 2234 |
-
" | 75th=", round(quantile(pitcher_data$stuff_plus, 0.75, na.rm = TRUE), 1)
|
| 2235 |
-
))
|
| 2236 |
-
|
| 2237 |
} else {
|
|
|
|
| 2238 |
message("WARNING: No reference data available. Using local standardization.")
|
| 2239 |
-
|
| 2240 |
-
|
| 2241 |
finite_raw <- pitcher_data$raw_stuff[is.finite(pitcher_data$raw_stuff)]
|
| 2242 |
if (length(finite_raw) == 0) {
|
| 2243 |
-
message("No valid Stuff+ predictions — all NA")
|
| 2244 |
pitcher_data$stuff_plus <- NA_real_
|
| 2245 |
} else {
|
| 2246 |
-
q <-
|
| 2247 |
lo <- q[1]; hi <- q[2]
|
| 2248 |
pitcher_data$raw_stuff_winz <- pmin(pmax(pitcher_data$raw_stuff, lo), hi)
|
| 2249 |
-
|
| 2250 |
-
raw_mean <- mean(pitcher_data$raw_stuff_winz
|
| 2251 |
-
raw_sd <-
|
| 2252 |
-
if (!is.finite(raw_sd) || raw_sd == 0) raw_sd <- 1e-8
|
| 2253 |
-
|
| 2254 |
-
|
| 2255 |
-
pitcher_data <- pitcher_data %>%
|
| 2256 |
-
dplyr::mutate(
|
| 2257 |
-
stuff_plus = dplyr::case_when(
|
| 2258 |
-
!is.finite(raw_stuff_winz) ~ NA_real_,
|
| 2259 |
-
TRUE ~ ((raw_stuff_winz - raw_mean) / raw_sd) * 10 + 100
|
| 2260 |
-
)
|
| 2261 |
-
)
|
| 2262 |
-
|
| 2263 |
-
actual_mean <- mean(pitcher_data$stuff_plus, na.rm = TRUE)
|
| 2264 |
-
actual_sd <- sd(pitcher_data$stuff_plus, na.rm = TRUE)
|
| 2265 |
-
|
| 2266 |
-
suppressWarnings(message(
|
| 2267 |
-
"Stuff+ summary (LOCAL scale): Min=", round(min(pitcher_data$stuff_plus, na.rm = TRUE), 1),
|
| 2268 |
-
" | Max=", round(max(pitcher_data$stuff_plus, na.rm = TRUE), 1),
|
| 2269 |
-
" | Mean=", round(actual_mean, 1),
|
| 2270 |
-
" | SD=", round(actual_sd, 1)
|
| 2271 |
-
))
|
| 2272 |
}
|
| 2273 |
}
|
|
|
|
| 2274 |
} else {
|
| 2275 |
-
|
| 2276 |
-
if (
|
|
|
|
|
|
|
| 2277 |
pitcher_data$raw_stuff <- NA_real_
|
| 2278 |
pitcher_data$stuff_plus <- NA_real_
|
| 2279 |
}
|
|
|
|
| 2280 |
|
| 2281 |
pitch_stats <- pitcher_data %>%
|
| 2282 |
dplyr::group_by(Pitch = TaggedPitchType) %>%
|
|
|
|
| 2205 |
}
|
| 2206 |
|
| 2207 |
if (!is.null(stuffplus_model) && nrow(pitcher_data) > 0) {
|
| 2208 |
+
|
| 2209 |
+
if (!is.null(reference_data_for_stuff)) {
|
| 2210 |
+
|
| 2211 |
+
combined <- dplyr::bind_rows(
|
| 2212 |
+
reference_data_for_stuff$spring,
|
| 2213 |
+
reference_data_for_stuff$p5,
|
| 2214 |
+
reference_data_for_stuff$sbc
|
| 2215 |
+
)
|
| 2216 |
+
|
| 2217 |
+
preflight_predictor_check(stuffplus_model, pitcher_data)
|
| 2218 |
+
raw_predictions <- safe_predict_stuff(stuffplus_model, pitcher_data)
|
| 2219 |
+
pitcher_data$raw_stuff <- raw_predictions
|
| 2220 |
+
|
| 2221 |
pitcher_data <- standardize_stuffplus_to_league(pitcher_data, combined)
|
| 2222 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2223 |
} else {
|
| 2224 |
+
|
| 2225 |
message("WARNING: No reference data available. Using local standardization.")
|
| 2226 |
+
|
|
|
|
| 2227 |
finite_raw <- pitcher_data$raw_stuff[is.finite(pitcher_data$raw_stuff)]
|
| 2228 |
if (length(finite_raw) == 0) {
|
|
|
|
| 2229 |
pitcher_data$stuff_plus <- NA_real_
|
| 2230 |
} else {
|
| 2231 |
+
q <- quantile(finite_raw, probs = c(0.01, 0.99), na.rm = TRUE)
|
| 2232 |
lo <- q[1]; hi <- q[2]
|
| 2233 |
pitcher_data$raw_stuff_winz <- pmin(pmax(pitcher_data$raw_stuff, lo), hi)
|
| 2234 |
+
|
| 2235 |
+
raw_mean <- mean(pitcher_data$raw_stuff_winz)
|
| 2236 |
+
raw_sd <- sd(pitcher_data$raw_stuff_winz)
|
| 2237 |
+
if (!is.finite(raw_sd) || raw_sd == 0) raw_sd <- 1e-8
|
| 2238 |
+
|
| 2239 |
+
pitcher_data$stuff_plus <- ((pitcher_data$raw_stuff_winz - raw_mean) / raw_sd) * 10 + 100
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2240 |
}
|
| 2241 |
}
|
| 2242 |
+
|
| 2243 |
} else {
|
| 2244 |
+
|
| 2245 |
+
if (is.null(stuffplus_model)) message("Stuff+ model not loaded")
|
| 2246 |
+
if (nrow(pitcher_data) == 0) message("No pitcher data for Stuff+ prediction")
|
| 2247 |
+
|
| 2248 |
pitcher_data$raw_stuff <- NA_real_
|
| 2249 |
pitcher_data$stuff_plus <- NA_real_
|
| 2250 |
}
|
| 2251 |
+
|
| 2252 |
|
| 2253 |
pitch_stats <- pitcher_data %>%
|
| 2254 |
dplyr::group_by(Pitch = TaggedPitchType) %>%
|