Skip to content

Commit 387279e

Browse files
committed
scale scores by selected baseline
1 parent bf26577 commit 387279e

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

app.R

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,18 @@ shinyApp(
6868
multiple = TRUE
6969
),
7070
selectInput("baseline",
71-
"Baseline:",
71+
"Baseline forecaster:",
7272
choices = forecaster_options,
7373
multiple = FALSE
7474
),
7575
checkboxInput(
7676
"scale_by_baseline",
77-
"Scale by baseline",
77+
"Scale by baseline forecaster",
7878
value = FALSE,
7979
),
8080
radioButtons(
8181
"selected_metric",
82-
"Metric:",
82+
"Error metric:",
8383
c(
8484
"Mean WIS" = "wis",
8585
# "Mean WIS per 100k" = "wis_per_100k",
@@ -133,9 +133,10 @@ shinyApp(
133133
},
134134
server = function(input, output, session) {
135135
filtered_scorecards_reactive <- reactive({
136-
if (length(input$selected_forecasters) == 0) { return(data.frame()) }
136+
agg_forecasters <- unique(c(input$selected_forecasters, input$baseline))
137+
if (length(agg_forecasters) == 0) { return(data.frame()) }
137138

138-
processed_evaluations_internal <- lapply(input$selected_forecasters, function(forecaster) {
139+
processed_evaluations_internal <- lapply(agg_forecasters, function(forecaster) {
139140
load_forecast_data(forecaster) %>>%
140141
filter(
141142
.data$forecast_date %>>% between(.env$input$selected_forecast_date_range[[1L]], .env$input$selected_forecast_date_range[[2L]]),
@@ -149,8 +150,33 @@ shinyApp(
149150
input_df <- filtered_scorecards_reactive()
150151
if (nrow(input_df) == 0) { return() }
151152

153+
# Normalize by baseline scores. This is not relevant for coverage, which is compared
154+
# to the nominal confidence level.
155+
if (input$scale_by_baseline && input$selected_metric != "ic80") {
156+
# Load selected baseline
157+
merge_keys <- c("forecast_date", "target_end_date", "ahead", "issue", "geo_value")
158+
baseline_scores <- load_forecast_data(input$baseline)[, c(merge_keys, input$selected_metric)]
159+
160+
baseline_scores$score_baseline <- baseline_scores[[input$selected_metric]]
161+
baseline_scores[[input$selected_metric]] <- NULL
162+
163+
# Add on reference scores from baseline forecaster
164+
input_df <- inner_join(
165+
input_df, baseline_scores,
166+
by = merge_keys, suffix = c("", "")
167+
)
168+
# Scale score by baseline forecaster
169+
input_df[[input$selected_metric]] <- input_df[[input$selected_metric]] / input_df$score_baseline
170+
}
171+
172+
152173
x_tick_angle <- list(tickangle = -30)
153174
facet_x_tick_angles <- setNames(rep(list(x_tick_angle), 10), paste0("xaxis", 1:10))
175+
scale_type <- switch(
176+
input$facets_share_scale,
177+
"TRUE" = "fixed",
178+
"FALSE" = "free_y"
179+
)
154180

155181
input_df %>>%
156182
# Aggregate scores over all geos
@@ -188,11 +214,9 @@ shinyApp(
188214
`+`(if (length(input$facet_vars) == 0L) {
189215
theme()
190216
} else if (length(input$facet_vars) == 1L) {
191-
facet_wrap(input$facet_vars, scales = switch(
192-
input$facets_share_scale, "TRUE" = "fixed", "FALSE" = "free_y"
193-
))
217+
facet_wrap(input$facet_vars, scales = scale_type)
194218
} else {
195-
facet_grid(as.formula(paste0(input$facet_vars[[1L]], " ~ ", paste(collapse = " + ", input$facet_vars[-1L]))), scales = input$facets_share_scale)
219+
facet_grid(as.formula(paste0(input$facet_vars[[1L]], " ~ ", paste(collapse = " + ", input$facet_vars[-1L]))), scales = scale_type)
196220
}) %>>%
197221
ggplotly() %>>%
198222
{inject(layout(., hovermode = "x unified", legend = list(orientation = "h", title = list(text = "forecaster")), xaxis = x_tick_angle, !!!facet_x_tick_angles))}

0 commit comments

Comments
 (0)