## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.align = "center", message = FALSE, warning = FALSE ) ## ----message=FALSE, warning=FALSE--------------------------------------------- library(EpiExposure) library(dplyr) library(ggplot2) library(patchwork) ## ----------------------------------------------------------------------------- data("epi_data") head(epi_data, 10L ) ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # library(future) # # future::plan( # future::multisession, # workers = 4 # ) ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # # future::plan(future::sequential ) # ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # best_models <- find_bestfit( # data = epi_data, # response = "y", # group = "epi_id", # time = "time", # vars = c("tmean","rain","wetness"), # max_lag = 85, # df_var_grid = c(2,3,4), # df_lag_grid = c(2,3,4), # model_engine = "glmmTMB", # family = "beta", # keep_fits = TRUE) ## ----include=FALSE------------------------------------------------------------ #best_models = readRDS("best_models.rds") best_models = readxl::read_xlsx("data/ensemble/best_models.xlsx") ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # plot_performance( # object = best_models, # model_id = c(5,12,19,26,28,33,35,40,42,47,49,54,56,61,63), # metrics = c("CCC"), # x = "observed", # y = "predicted", # scale_factor = 1, # ncol = 5, # x_lab = "Observed ", # y_lab = "Predicted", # size = 1.4 # ) + # ggplot2::theme( # text = ggplot2::element_text( # size = 10, # face = "bold" # ) # ) ## ----echo=FALSE--------------------------------------------------------------- knitr::kable( utils::head( best_models, 10L ), digits = 4, align = "c" ) ## ----------------------------------------------------------------------------- best_models %>% arrange(desc(CCC)) %>% select( model_id, vars, CCC, RMSE, MAE ) %>% head(10) ## ----------------------------------------------------------------------------- best_models %>% mutate( splines = paste( df_var, df_lag, sep = " × " ) ) %>% ggplot( aes( Cb, CCC, color = splines ) ) + geom_point(size = 3) + theme_bw() ## ----------------------------------------------------------------------------- top_model <- best_models |> dplyr::arrange( dplyr::desc( CCC ) ) |> dplyr::slice( 1L ) ## ----------------------------------------------------------------------------- candidate_models <- c( 63, 23, 44 ) ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # ens_unweighted <- ensemble_bestfit( # bestfit = best_models, # # ensemble_scope = "model", # # method = "unweighted", # # model_id = candidate_models) ## ----eval = FALSE------------------------------------------------------------- # ens_unweighted$ensemble_summary ## ----include=FALSE------------------------------------------------------------ ens_unweighted <- readxl::read_xlsx("data/ensemble/ens_unweighted.xlsx") ## ----echo=FALSE--------------------------------------------------------------- knitr::kable( ens_unweighted, digits = 4, align = "c" ) ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # ens_weighted <- ensemble_bestfit( # bestfit = best_models, # # ensemble_scope = "model", # # method = "weighted", # # model_id = candidate_models, # # weight_metric = "CCC", # # weight_transform = "rank_inverse" # ) ## ----eval = FALSE------------------------------------------------------------- # ens_weighted$ensemble_summary ## ----include=FALSE------------------------------------------------------------ ens_weighted <- readxl::read_xlsx("data/ensemble/ens_weighted.xlsx") ## ----echo=FALSE--------------------------------------------------------------- knitr::kable( ens_weighted, digits = 4, align = "c" ) ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # ens_stacked <- ensemble_bestfit( # bestfit = best_models, # # ensemble_scope = "model", # # method = "stacked", # # model_id = candidate_models, # # stacking_model = "ridge", # # stack_objective = "regularized" # ) ## ----eval = FALSE------------------------------------------------------------- # ens_stacked$ensemble_summary ## ----include=FALSE------------------------------------------------------------ ens_stacked <- readxl::read_xlsx("data/ensemble/ens_stacked.xlsx") ## ----echo=FALSE--------------------------------------------------------------- knitr::kable( ens_stacked, digits = 4, align = "c" ) ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # ensemble_metrics <- dplyr::bind_rows( # Unweighted = ens_unweighted$ensemble_summary, # Weighted = ens_weighted$ensemble_summary, # Stacked = ens_stacked$ensemble_summary, # .id = "method" # ) |> # dplyr::select( # method, # CCC, # RMSE, # MAE # ) ## ----include=FALSE------------------------------------------------------------ ensemble_metrics <- readxl::read_xlsx("data/ensemble/ensemble_metrics.xlsx") ## ----------------------------------------------------------------------------- ensemble_metrics ## ----echo=TRUE, eval=FALSE---------------------------------------------------- # # ens_unweighted$ensemble_predictions$method = "unweighted" # ens_weighted$ensemble_predictions$method = "weighted" # ens_stacked$ensemble_predictions$method = "stacked" # # ensemble_all = rbind(ens_unweighted$ensemble_predictions,ens_weighted$ensemble_predictions, ens_stacked$ensemble_predictions) ## ----include=FALSE------------------------------------------------------------ ensemble_all <- readxl::read_xlsx("data/ensemble/ensemble_all.xlsx") ## ----------------------------------------------------------------------------- knitr::kable(utils::head(ensemble_all, 10L), digits = 4, align = "c" ) ## ----------------------------------------------------------------------------- ensemble_metrics$method = c("unweighted","weighted","stacked") ordem_methods <- c( "unweighted", "weighted", "stacked" ) ensemble_plot <- ensemble_all %>% filter(!is.na(method)) %>% mutate( method = as.character(method) ) %>% filter(method %in% ordem_methods) %>% mutate( method = factor( method, levels = ordem_methods ) ) CCC_plot <- ensemble_metrics %>% mutate( method = factor( method, levels = ordem_methods ) ) pos_CCC <- ensemble_plot %>% group_by(method) %>% summarise( x = min(observed, na.rm = TRUE) + 0.05 * diff(range(observed, na.rm = TRUE)), y = max(predicted_ensemble, na.rm = TRUE) - 0.05 * diff(range(predicted_ensemble, na.rm = TRUE)), .groups = "drop" ) %>% left_join( CCC_plot %>% select(method, CCC), by = "method" ) ensemble_gg = ggplot(ensemble_plot, aes(observed, predicted_ensemble)) + geom_point()+ geom_smooth(method = "lm",se = FALSE, color = "orange") + geom_abline( intercept = 0, slope = 1, color = "red", linetype = "dashed", linewidth = 1) + geom_text( data = pos_CCC, aes( x = 0.02, y = 0.97, label = sprintf("CCC = %.2f", CCC) ), inherit.aes = FALSE, hjust = 0, vjust = 1, size = 4) + facet_wrap( ~method, ncol = 1) + theme_bw() + scale_x_continuous( limits = c(0, 1), breaks = seq(0, 1, 0.20), expand = expansion(mult = 0.03) ) + scale_y_continuous( limits = c(0, 1), breaks = seq(0, 1, 0.20), expand = expansion(mult = 0.03) ) + labs( x = "Observed", y = "Predicted") + theme(text = element_text(size = 10,face = "bold"),legend.position = "none") ensemble_gg ## ----------------------------------------------------------------------------- best_models_plot <- best_models %>% mutate( splines = paste(df_lag, df_var, sep = " x ") ) best_plot <- best_models_plot %>% ggplot(aes( Cb, CCC, color = as.factor(splines), shape = as.factor(vars) )) + geom_point(size = 4) + scale_color_viridis_d() + labs( x = "Cb", y = "CCC", color = "Splines", shape = "Predictors" ) + guides( color = guide_legend( position = "top", nrow = 1, byrow = TRUE, title.position = "left", theme = theme( legend.key.height = unit(0.25, "cm"), legend.key.width = unit(0.45, "cm"), legend.spacing.y = unit(0, "cm"), legend.margin = margin( t = -3, r = 0, b = -3, l = 0 ) ) ), shape = guide_legend( position = "right" ) ) + theme_bw() + theme( text = element_text( size = 10, face = "bold" ) ) ## ----------------------------------------------------------------------------- final_plot <- ensemble_gg + best_plot + plot_layout(ncol = 2) + plot_annotation( tag_levels = "a", tag_prefix = "(", tag_suffix = ")" ) & theme( plot.tag = element_text( size = 12, face = "bold" ), plot.tag.position = c(0.02, 0.94) ) final_plot ## ----------------------------------------------------------------------------- epi_data1 = epi_data |> filter(epi_id == 1) ## ----fit-lag-ensembles, eval = FALSE------------------------------------------ # lag_ensemble <- ensemble_bestfit( # bestfit = best_models, # data = epi_data1, # group = "epi_id", # var = c( # "tmean", # "rain", # "wetness" # ), # ensemble_scope = "lag", # method = c( # "unweighted", # "weighted" # ), # top_n = 3, # weight_metric = NULL, # weight_transform = "softmax", # lag_group_cols = c( # "epi_id", # "var", # "lag" # ), # lg_strategy = "requested_available", # rl_weights = TRUE, # compute_ecilag_args = list( # uncertainty = FALSE # ), # verbose = TRUE # ) # ## ----eval = FALSE------------------------------------------------------------- # lag_ensemble$selected_models ## ----echo=FALSE--------------------------------------------------------------- selected_models = readxl::read_xlsx("data/ensemble/selected_models.xlsx") ## ----inspect-lag-selected-models, echo=FALSE---------------------------------- knitr::kable( selected_models, digits = 4, align = "c" ) ## ----eval = FALSE------------------------------------------------------------- # lag_ensemble$model_weights ## ----echo=FALSE--------------------------------------------------------------- model_weights = readxl::read_xlsx("data/ensemble/model_weights.xlsx") ## ----inspect-lag-model-weights, echo=FALSE------------------------------------ knitr::kable( model_weights, digits = 4, align = "c" ) ## ----eval = FALSE------------------------------------------------------------- # lag_ensemble$ensemble_by_lag ## ----echo=FALSE--------------------------------------------------------------- ensemble_by_lag = readxl::read_xlsx("data/ensemble/ensemble_by_lag.xlsx") ## ----inspect-lag-ensemble, echo=FALSE----------------------------------------- knitr::kable( utils::head( ensemble_by_lag, 12L ), digits = 4, align = "c" ) ## ----eval = FALSE------------------------------------------------------------- # ensemble_by_lag = lag_ensemble$ensemble_by_lag ## ----plot-lag-ensemble-signed, fig.width=10, fig.height=7--------------------- lag_ensemble_signed_plot <- ggplot( ensemble_by_lag, aes( x = lag, y = ECI_weighted_ens, color = method ) ) + geom_hline( yintercept = 0, color = "grey50", linetype = "dashed", linewidth = 0.5 ) + geom_line( linewidth = 1 ) + facet_wrap( vars(var), ncol = 1, scales = "free_y", labeller = as_labeller( c( tmean = "Mean temperature", rain = "Rainfall", wetness = "Leaf wetness" ) ) ) + scale_x_reverse( breaks = seq( 0, 85, by = 15 ) ) + scale_color_manual( values = c( unweighted = "#4C72B0", weighted = "#C44E52" ), labels = c( unweighted = "Unweighted", weighted = "Weighted" ) ) + theme_bw() + labs( x = "Retrospective lag", y = "Ensemble weighted ECI", color = "Ensemble method" ) + theme( text = element_text( size = 10, face = "bold" ), strip.background = element_rect( fill = "white", color = "black" ), strip.text = element_text( face = "bold" ), legend.position = "top" ) ## ----------------------------------------------------------------------------- lag_ensemble_signed_plot ## ----plot-lag-ensemble-percent, fig.width=10, fig.height=7-------------------- lag_ensemble_percent_plot <- ggplot( ensemble_by_lag, aes( x = lag, y = ECI_percent_ens, color = method ) ) + geom_line( linewidth = 1 ) + facet_wrap( vars(var), ncol = 1, scales = "free_y", labeller = as_labeller( c( tmean = "Mean temperature", rain = "Rainfall", wetness = "Leaf wetness" ) ) ) + scale_x_reverse( breaks = seq( 0, 85, by = 15 ) ) + scale_color_manual( values = c( unweighted = "#4C72B0", weighted = "#C44E52" ), labels = c( unweighted = "Unweighted", weighted = "Weighted" ) ) + theme_bw() + labs( x = "Retrospective lag", y = "Absolute lag contribution (%)", color = "Ensemble method" ) + theme( text = element_text( size = 10, face = "bold" ), strip.background = element_rect( fill = "white", color = "black" ), strip.text = element_text( face = "bold" ), legend.position = "top" ) ## ----------------------------------------------------------------------------- lag_ensemble_percent_plot ## ----strict-lag-ensemble, eval=FALSE------------------------------------------ # lag_ensemble_strict <- ensemble_bestfit( # bestfit = best_models, # data = epi_data1, # group = "epi_id", # var = c( # "tmean", # "rain", # "wetness" # ), # ensemble_scope = "lag", # method = c( # "unweighted", # "weighted" # ), # top_n = 3, # weight_transform = "softmax", # lag_group_cols = c( # "epi_id", # "var", # "lag" # ), # lg_strategy = "strict", # rl_weights = TRUE, # compute_ecilag_args = list( # uncertainty = FALSE # ) # )