@@ -68,18 +68,18 @@ shinyApp(
68
68
multiple = TRUE
69
69
),
70
70
selectInput(" baseline" ,
71
- " Baseline:" ,
71
+ " Baseline forecaster :" ,
72
72
choices = forecaster_options ,
73
73
multiple = FALSE
74
74
),
75
75
checkboxInput(
76
76
" scale_by_baseline" ,
77
- " Scale by baseline" ,
77
+ " Scale by baseline forecaster " ,
78
78
value = FALSE ,
79
79
),
80
80
radioButtons(
81
81
" selected_metric" ,
82
- " Metric :" ,
82
+ " Error metric :" ,
83
83
c(
84
84
" Mean WIS" = " wis" ,
85
85
# "Mean WIS per 100k" = "wis_per_100k",
@@ -133,9 +133,10 @@ shinyApp(
133
133
},
134
134
server = function (input , output , session ) {
135
135
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 ()) }
137
138
138
- processed_evaluations_internal <- lapply(input $ selected_forecasters , function (forecaster ) {
139
+ processed_evaluations_internal <- lapply(agg_forecasters , function (forecaster ) {
139
140
load_forecast_data(forecaster ) %>> %
140
141
filter(
141
142
.data $ forecast_date %>> % between(.env $ input $ selected_forecast_date_range [[1L ]], .env $ input $ selected_forecast_date_range [[2L ]]),
@@ -149,8 +150,33 @@ shinyApp(
149
150
input_df <- filtered_scorecards_reactive()
150
151
if (nrow(input_df ) == 0 ) { return () }
151
152
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
+
152
173
x_tick_angle <- list (tickangle = - 30 )
153
174
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
+ )
154
180
155
181
input_df %>> %
156
182
# Aggregate scores over all geos
@@ -188,11 +214,9 @@ shinyApp(
188
214
`+`(if (length(input $ facet_vars ) == 0L ) {
189
215
theme()
190
216
} 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 )
194
218
} 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 )
196
220
}) %>> %
197
221
ggplotly() %>> %
198
222
{inject(layout(. , hovermode = " x unified" , legend = list (orientation = " h" , title = list (text = " forecaster" )), xaxis = x_tick_angle , !!! facet_x_tick_angles ))}
0 commit comments