OwenStOnge commited on
Commit
dea9c02
·
verified ·
1 Parent(s): de658e2

Update app.R

Browse files
Files changed (1) hide show
  1. app.R +29 -57
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
- combined <- dplyr::bind_rows(
2210
- reference_data_for_stuff$spring,
2211
- reference_data_for_stuff$p5,
2212
- reference_data_for_stuff$sbc
2213
- )
2214
-
2215
- preflight_predictor_check(stuffplus_model, pitcher_data)
2216
-
2217
- message("Predicting Stuff+ for ", nrow(pitcher_data), " pitches...")
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
- 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
- message("Scores will NOT be comparable to Document 1.")
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 <- stats::quantile(finite_raw, probs = c(0.01, 0.99), na.rm = TRUE, names = FALSE)
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[is.finite(pitcher_data$raw_stuff_winz)])
2251
- raw_sd <- stats::sd(pitcher_data$raw_stuff_winz[is.finite(pitcher_data$raw_stuff_winz)])
2252
- if (!is.finite(raw_sd) || raw_sd == 0) raw_sd <- 1e-8 {
2253
-
2254
- message("Standardizing (winsorized, local): mean=", round(raw_mean, 2), " sd=", round(raw_sd, 2))
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
- if (is.null(stuffplus_model)) message("Stuff+ model not loaded")
2276
- if (nrow(pitcher_data) == 0) message("No pitcher data for Stuff+ prediction")
 
 
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) %>%