From fdb92f6b5761f0998633c91a6266ac6565581984 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Mon, 25 Mar 2024 17:36:00 +0000 Subject: [PATCH 1/3] remove extra files that should have been removed when we set up r cmd check CI --- .github/workflows/tests.yaml | 21 --------------------- ci/run/test-vignette.R | 1 - ci/run/unit-tests.R | 2 -- ci/setup/install-cmdstan.R | 2 -- ci/setup/install-package.R | 9 --------- 5 files changed, 35 deletions(-) delete mode 100644 .github/workflows/tests.yaml delete mode 100644 ci/run/test-vignette.R delete mode 100644 ci/run/unit-tests.R delete mode 100644 ci/setup/install-cmdstan.R delete mode 100644 ci/setup/install-package.R diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml deleted file mode 100644 index 1c91db43..00000000 --- a/.github/workflows/tests.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: Run Tests - -on: - pull_request: - push: - branches: [main] - -jobs: - tests: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: r-lib/actions/setup-r@v2 - with: - r-version: '4.3.2' - - run: sudo apt install -y pandoc git pandoc-citeproc make libssl-dev libfreetype6-dev libfribidi-dev libharfbuzz-dev libfontconfig1-dev libudunits2-dev zlib1g-dev libcurl4-openssl-dev libxml2-dev libgit2-dev libjpeg-dev libpng-dev libtiff-dev libicu-dev libglpk-dev libgmp3-dev libgdal-dev gdal-bin libgeos-dev libproj-dev libsqlite3-dev - - uses: ./.github/actions/setup-r - - run: Rscript ci/run/unit-tests.R - shell: bash -# - run: Rscript ci/run/test-vignette.R -# shell: bash diff --git a/ci/run/test-vignette.R b/ci/run/test-vignette.R deleted file mode 100644 index f0b305cd..00000000 --- a/ci/run/test-vignette.R +++ /dev/null @@ -1 +0,0 @@ -rmarkdown::render("cfaforecastrenewalww/vignettes/toy_data_vignette.Rmd") diff --git a/ci/run/unit-tests.R b/ci/run/unit-tests.R deleted file mode 100644 index 6a2999f7..00000000 --- a/ci/run/unit-tests.R +++ /dev/null @@ -1,2 +0,0 @@ -library(devtools) -devtools::test("cfaforecastrenewalww") diff --git a/ci/setup/install-cmdstan.R b/ci/setup/install-cmdstan.R deleted file mode 100644 index 5bf34cf8..00000000 --- a/ci/setup/install-cmdstan.R +++ /dev/null @@ -1,2 +0,0 @@ -options(repos = c(CRAN = "https://packagemanager.posit.co/cran/__linux__/jammy/latest")) -install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos"))) diff --git a/ci/setup/install-package.R b/ci/setup/install-package.R deleted file mode 100644 index e5e72d53..00000000 --- a/ci/setup/install-package.R +++ /dev/null @@ -1,9 +0,0 @@ -options(repos = c(CRAN = "https://packagemanager.posit.co/cran/__linux__/jammy/latest")) - -library(cmdstanr) -check_cmdstan_toolchain() -install_cmdstan(cores = 2) - -install.packages("remotes") -install.packages("devtools") -remotes::install_local("cfaforecastrenewalww", upgrade = TRUE) From 6f666ccf1287a2b8d100e51e7ec0b33ed2647f70 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Mon, 25 Mar 2024 17:38:42 +0000 Subject: [PATCH 2/3] update codebase to reflect changes from 2024-03-25 run --- _targets.R | 102 +++++++++++-- cfaforecastrenewalww/NAMESPACE | 3 +- cfaforecastrenewalww/R/fit_model.R | 92 ++++++++++-- .../R/generate_simulated_data.R | 138 ++++++++++-------- cfaforecastrenewalww/R/get_data.R | 38 +++-- cfaforecastrenewalww/R/get_output_metadata.R | 19 +++ cfaforecastrenewalww/R/model_params.R | 2 +- cfaforecastrenewalww/R/plots.R | 47 ++++-- cfaforecastrenewalww/R/pre_processing.R | 33 +++++ .../R/process_model_outputs.R | 16 +- cfaforecastrenewalww/R/sysdata.rda | Bin 60198 -> 66316 bytes cfaforecastrenewalww/data/example_df.rda | Bin 2729 -> 2766 bytes cfaforecastrenewalww/data/param_df.rda | Bin 1366 -> 2325 bytes ...newal_ww_hosp_site_level_inf_dynamics.stan | 118 +++++++-------- cfaforecastrenewalww/man/get_loc_model_map.Rd | 3 + .../man/get_location_notes_table.Rd | 6 + cfaforecastrenewalww/man/get_metadata_yaml.Rd | 6 + cfaforecastrenewalww/man/get_plot_draws.Rd | 4 + .../man/get_rt_subpop_level.Rd | 30 ++++ cfaforecastrenewalww/man/subsample_sites.Rd | 27 ++++ .../vignettes/toy_data_vignette.Rmd | 10 +- model_definition.md | 41 ++++-- src/write_config.R | 15 +- 23 files changed, 552 insertions(+), 198 deletions(-) create mode 100644 cfaforecastrenewalww/man/get_rt_subpop_level.Rd create mode 100644 cfaforecastrenewalww/man/subsample_sites.Rd diff --git a/_targets.R b/_targets.R index 2f77ddd4..aa304e3d 100644 --- a/_targets.R +++ b/_targets.R @@ -93,6 +93,11 @@ list( command = c(), deployment = "main" ), + tar_target( + name = exclude_states, + command = c(), + deployment = "main" + ), # If want to enforce a global change, need to tar_destroy to # regenerate run_id tar_target( @@ -112,7 +117,7 @@ list( command = write_config( save_config = TRUE, location = NULL, - prod_run = TRUE, + prod_run = FALSE, run_id = run_id, ww_geo_type = "state", date_run = date_run, @@ -132,7 +137,7 @@ list( command = write_config( save_config = TRUE, location = "US", - prod_run = TRUE, + prod_run = FALSE, run_id = run_id, ww_geo_type = "state", date_run = date_run, @@ -152,7 +157,7 @@ list( command = write_config( save_config = TRUE, location = NULL, - prod_run = TRUE, + prod_run = FALSE, run_id = run_id, date_run = date_run, model_type = "site-level infection dynamics", @@ -250,10 +255,10 @@ list( ), - # # Fit the model ------------------------------------------------------------ - # # get a stacked long dataframe containing the quantiles(estimated - # # from all draws) and 100 samples of the draws from the posterior for the - # # generated quantities and the parameters + ## Fit the model ------------------------------------------------------------ + # get a stacked long dataframe containing the quantiles(estimated + # from all draws) and 100 samples of the draws from the posterior for the + # generated quantities and the parameters tar_target( name = df_of_filepaths_id, command = do.call( @@ -292,6 +297,18 @@ list( iteration = "list", deployment = "main" ), + tar_target( + name = plot_single_location_hosp_draws_log_id, + command = get_plot_draws(grouped_df_id, + "pred_hosp", + figure_output_subdirectory, + log_scale = TRUE, + show_calibration_data = FALSE + ), + pattern = map(grouped_df_id), + iteration = "list", + deployment = "main" + ), tar_target( name = plot_single_location_comb_quantiles_id, command = get_combo_quantile_plot( @@ -333,8 +350,8 @@ list( deployment = "main" ), tar_target( - name = plot_rt_site_level, - command = get_rt_site_level( + name = plot_rt_subpop_level, + command = get_rt_subpop_level( grouped_df_id, figure_output_subdirectory ), @@ -470,6 +487,18 @@ list( iteration = "list", deployment = "main" ), + tar_target( + name = plot_single_location_hosp_draws_log_ho, + command = get_plot_draws(grouped_df, + "pred_hosp", + figure_output_subdirectory, + log_scale = TRUE, + show_calibration_data = FALSE + ), + pattern = map(grouped_df), + iteration = "list", + deployment = "main" + ), tar_target( name = plot_rt_ho, command = get_rt_from_draws( @@ -617,6 +646,18 @@ list( iteration = "list", deployment = "main" ), + tar_target( + name = plot_single_location_hosp_draws_log_sa, + command = get_plot_draws(grouped_df_sa, + "pred_hosp", + figure_output_subdirectory, + log_scale = TRUE, + show_calibration_data = FALSE + ), + pattern = map(grouped_df_sa), + iteration = "list", + deployment = "main" + ), tar_target( name = plot_single_location_ww_draws_sa, command = get_plot_draws(df_of_filepaths_us, @@ -687,6 +728,20 @@ list( iteration = "list", deployment = "main" ), + tar_target( + name = plot_mult_models_log, + command = get_plot_draws( + grouped_df_comb, + "pred_hosp", + grouping_var = "model_type", + figure_output_subdirectory, + log_scale = TRUE, + show_calibration_data = FALSE + ), + pattern = map(grouped_df_comb), + iteration = "list", + deployment = "main" + ), tar_target( name = rt_box_plot_id, command = get_rt_boxplot_across_states( @@ -782,6 +837,24 @@ list( ), deployment = "main" ), + tar_target( + name = pdf_of_forecast_comparisons_log, + command = do.call( + save_to_pdf, + c(list(list_of_plots = plot_mult_models_log), + type_of_output = "forecasts_from_mult_model_types_log", + pdf_file_path = file.path( + pdf_output_subdirectory, + "internal" + ), + model_name = config_vars_id$submitting_model_name, + n_row = 3, + n_col = 1, + config_vars_id + ) + ), + deployment = "main" + ), # Get model run diagnostics for submission ------------------------------------- tar_target( name = full_diagnostics_df, @@ -798,8 +871,9 @@ list( tar_target( name = loc_model_map_submission, command = get_loc_model_map( - df_of_filepaths_id, - hosp_only_states + df_of_filepaths = df_of_filepaths_id, + hosp_only_states = hosp_only_states, + exclude_states = exclude_states ), deployment = "main" ), @@ -844,6 +918,7 @@ list( command = get_location_notes_table( full_diagnostics_df, hosp_only_states, + exclude_states, output_dir = repo_file_path, prod_run = config_vars_id$prod_run ), @@ -854,6 +929,7 @@ list( command = get_metadata_yaml( data_diagnostics_df = full_diagnostics_df, hosp_only_states = hosp_only_states, + exclude_states = exclude_states, output_dir = repo_file_path, prod_run = config_vars_id$prod_run ) @@ -933,6 +1009,7 @@ list( command = get_loc_model_map( df_of_filepaths_ho |> dplyr::filter(location != "US"), hosp_only_states, + exclude_states = c(), us_model_type = "hospital admissions only" ), deployment = "main" @@ -1002,7 +1079,8 @@ list( tar_target( name = loc_model_map_ww, command = get_loc_model_map(df_of_filepaths_id, - hosp_only_states = c() + hosp_only_states = c(), + exclude_states = c() ), deployment = "main" ), diff --git a/cfaforecastrenewalww/NAMESPACE b/cfaforecastrenewalww/NAMESPACE index c89805c6..35d9eb4a 100644 --- a/cfaforecastrenewalww/NAMESPACE +++ b/cfaforecastrenewalww/NAMESPACE @@ -66,7 +66,7 @@ export(get_regions_for_mapping) export(get_relative_forecast_dir) export(get_rt_boxplot_across_states) export(get_rt_from_draws) -export(get_rt_site_level) +export(get_rt_subpop_level) export(get_scores) export(get_secret) export(get_site_county_map) @@ -108,6 +108,7 @@ export(site_level_inf_inits) export(soql_is_in) export(standardize) export(state_agg_inits) +export(subsample_sites) export(summarize_scores) export(to_simplex) export(trajectories_to_quantiles) diff --git a/cfaforecastrenewalww/R/fit_model.R b/cfaforecastrenewalww/R/fit_model.R index d99b69d6..6a4caf9f 100644 --- a/cfaforecastrenewalww/R/fit_model.R +++ b/cfaforecastrenewalww/R/fit_model.R @@ -582,18 +582,78 @@ fit_site_level_model <- function(train_data, ww = NA, site = NA, site_index = NA, + subpop_index = NA, lab = NA, lab_wwtp_unique_id = NA, + subpop = NA, below_LOD = NA, flag_as_ww_outlier = NA, lod_sewage = NA, - ww_pop = NA + ww_pop = NA, + subpop_size = NA ) - # This should be at the lab site level + # From train_data, identify whether we need to fit an additional subpop + pop_ww <- train_data %>% + select(site_index, ww_pop) %>% + filter(!is.na(site_index)) %>% + group_by(site_index) %>% + summarise(pop_avg = mean(ww_pop)) %>% + arrange(site_index, "desc") %>% + pull(pop_avg) + pop <- train_data %>% + select(pop) %>% + unique() %>% + pull(pop) + + add_auxiliary_site <- ifelse(pop >= sum(pop_ww), TRUE, FALSE) + + # From the input data, which labs align with which sites and + # which population sizes + site_map_raw <- train_data %>% + select( + lab_site_index, lab_wwtp_unique_id, site_index, + lab, site, ww_pop + ) %>% + distinct() %>% + filter(!is.na(site_index)) + + # Create a new variable called subpop, link it to site indexes + site_subpop_map <- site_map_raw %>% + mutate(subpop = paste0("Site: ", site)) %>% + select(site_index, subpop, ww_pop) %>% + rename( + subpop_index = site_index, + subpop_size = ww_pop + ) + # Link subpops to the rest of the site and lab metadata + site_map <- site_map_raw %>% + left_join(site_subpop_map, by = c("site_index" = "subpop_index")) %>% + mutate(subpop_index = site_index) + + # If we add an auxiliary site, this means we need to track an additional + # subpopulation whose population is the difference between the state pop + # and the sum of the wastewater site populations + if (isTRUE(add_auxiliary_site)) { + extra_subpop <- data.frame( + subpop_index = max(site_map$site_index) + 1, + subpop = "Pop not on wastewater", + subpop_size = pop - sum(pop_ww) + ) + + subpop_map <- rbind(site_subpop_map, extra_subpop) + } else { + subpop_map <- site_subpop_map + } + + + + + # This should be at the lab site level, but you want to map to + # sites and subpops gen_quants_draws_w_ww <- gen_quants_draws %>% filter(name == "pred_ww") %>% - select(-site_index) %>% + select(-subpop_index) %>% mutate( include_ww = include_ww, forecast_date = forecast_date, @@ -603,13 +663,7 @@ fit_site_level_model <- function(train_data, ) %>% left_join(date_df, by = "t") %>% ungroup() %>% - left_join( - train_data %>% - select( - lab_site_index, lab_wwtp_unique_id, site_index, - lab, site - ) %>% - distinct(), + left_join(site_map, by = c("lab_site_index") ) %>% left_join( @@ -626,12 +680,15 @@ fit_site_level_model <- function(train_data, ungroup() %>% select( lab_site_index, date, ww, - below_LOD, flag_as_ww_outlier, lod_sewage, ww_pop + below_LOD, flag_as_ww_outlier, lod_sewage ) %>% filter(!is.na(ww)) %>% unique(), by = c("date", "lab_site_index") ) %>% + mutate( + subpop_index = site_index + ) %>% select(colnames(gen_quants_draws_non_ww)) if (model_type != "site-level infection dynamics") { @@ -652,12 +709,15 @@ fit_site_level_model <- function(train_data, ) %>% left_join(date_df, by = "t") %>% ungroup() %>% - left_join( - train_data %>% - select(site_index, site, ww_pop) %>% - distinct(), - by = c("site_index") + left_join(subpop_map, + by = c("subpop_index") ) %>% + left_join(site_map %>% + select( + subpop_index, + site_index, site, ww_pop + ) %>% + distinct(), by = "subpop_index") %>% mutate( lab_site_index = NA, lab_wwtp_unique_id = NA, diff --git a/cfaforecastrenewalww/R/generate_simulated_data.R b/cfaforecastrenewalww/R/generate_simulated_data.R index 9e1d32a3..a88f2a8a 100644 --- a/cfaforecastrenewalww/R/generate_simulated_data.R +++ b/cfaforecastrenewalww/R/generate_simulated_data.R @@ -110,6 +110,9 @@ generate_simulated_data <- function(site_level_inf_dynamics = TRUE, map_site_to_lab <- 1:n_sites } + # Get pop fractrions of each subpop + pop_fraction <- c(ww_pop_sites / pop_size, (pop_size - sum(ww_pop_sites)) / pop_size) + # Expose the stan functions (can use any of the models here) model <- cmdstan_model( stan_file = system.file( @@ -202,16 +205,74 @@ generate_simulated_data <- function(site_level_inf_dynamics = TRUE, ind_m <- get_ind_m(ot + ht, n_weeks) unadj_r <- ind_m %*% unadj_r_weeks + + # Generate the site-level expected observed concentrations ----------------- + # first by adding + # variation to the site-level R(t) in each site, and then by adding time varying + # deviations in true concentration in each site, and then adding a site level + # true variability, and then adding lab-site level multiplier and obersvation + # error + + + ### Generate the site level infection dynamics---------------------------------- + new_i_over_n_site <- matrix(nrow = n_sites + 1, ncol = (uot + ot + ht)) + r_site <- matrix(nrow = n_sites + 1, ncol = (ot + ht)) + # Generate site-level R(t) + if (isTRUE(site_level_inf_dynamics)) { + log_r_state_week <- log(unadj_r_weeks) + log_r_site <- matrix(nrow = n_sites + 1, ncol = n_weeks) + initial_growth_site <- vector(length = n_sites + 1) + log_i0_over_n_site <- vector(length = n_sites + 1) + for (i in 1:(n_sites + 1)) { + if (i <= n_sites) { + log_r_site[i, ] <- rnorm( + n = n_weeks, + mean = log_r_state_week, + sd = 0.05 + ) # sigma_rt + initial_growth_site[i] <- rnorm( + n = 1, mean = initial_growth, + sd = initial_growth_prior_sd + ) + log_i0_over_n_site[i] <- rnorm( + n = 1, mean = log_i0_over_n, + sd = 0.5 + ) + } else { + log_r_site[i, ] <- log_r_state_week + initial_growth_site[i] <- initial_growth + log_i0_over_n_site[i] <- log_i0_over_n + } + } + + new_i_over_n <- rep(0, (uot + ot + ht)) + for (i in 1:(n_sites + 1)) { + unadj_r_site <- ind_m %*% exp(log_r_site[i, ]) # daily R site + site_output <- model$functions$generate_infections( + unadj_r_site, uot, rev(generation_interval), log_i0_over_n_site[i], + initial_growth_site[i], ht, + infection_feedback, infection_feedback_rev_pmf + ) + new_i_over_n_site[i, ] <- site_output[[1]] + new_i_over_n <- new_i_over_n + pop_fraction[i] * site_output[[1]] + r_site[i, ] <- site_output[[2]] + } + } else { # site level R(t) and infections = state level R(t) and infections + for (i in 1:n_sites) { + new_i_over_n_site[i, ] <- new_i_over_n + r_site[i, ] <- rt + } + } + + rt <- (new_i_over_n / model$functions$convolve_dot_product( + new_i_over_n, rev(generation_interval), uot + ot + ht + ))[(uot + 1):(uot + ot + ht)] + + + # Generate expected state level hospitalizations from subpop incident infections----- # generate state-level incident infections using renewal equation for # all time points - state_output <- model$functions$generate_infections( - unadj_r, uot, rev(generation_interval), log_i0_over_n, initial_growth, ht, - infection_feedback, infection_feedback_rev_pmf - ) - new_i_over_n <- state_output[[1]] - rt <- state_output[[2]] # Because infection feedback can damp R(t), get adj R - # Generate expected state level hospitalizations from incident infections----- # Generate a time varying P(hosp|infection), p_hosp_int_logit <- qlogis(p_hosp_mean) # p_hosp_mean is declared in linear scale p_hosp_m <- get_ind_m(uot + ot + ht, tot_weeks) # matrix needed to convert @@ -229,7 +290,7 @@ generate_simulated_data <- function(site_level_inf_dynamics = TRUE, p_hosp_int_logit, p_hosp_w_logit ) # convert to days - p_hosp_days <- inv.logit(p_hosp_logit_days) # convert back to linear scale + p_hosp_days <- plogis(p_hosp_logit_days) # convert back to linear scale # Corresponds to a standard deviation in linear scale of 0.0003 # Get expected trajectory of hospital admissions from incident infections @@ -251,56 +312,6 @@ generate_simulated_data <- function(site_level_inf_dynamics = TRUE, size = 1 / ((inv_sqrt_phi_prior_mean)^2) ) - # Generate the site-level expected observed concentrations ----------------- - # first by adding - # variation to the site-level R(t) in each site, and then by adding time varying - # deviations in true concentration in each site, and then adding a site level - # true variability, and then adding lab-site level multiplier and obersvation - # error - - - ## Generate the site level infection dynamics---------------------------------- - new_i_over_n_site <- matrix(nrow = n_sites, ncol = (uot + ot + ht)) - r_site <- matrix(nrow = n_sites, ncol = (ot + ht)) - # Generate site-level R(t) - if (isTRUE(site_level_inf_dynamics)) { - log_r_state_week <- log(unadj_r_weeks) - log_r_site <- matrix(nrow = n_sites, ncol = n_weeks) - initial_growth_site <- vector(length = n_sites) - log_i0_over_n_site <- vector(length = n_sites) - for (i in 1:n_sites) { - log_r_site[i, ] <- rnorm( - n = n_weeks, - mean = log_r_state_week, - sd = 0.05 - ) # sigma_rt - initial_growth_site[i] <- rnorm( - n = 1, mean = initial_growth, - sd = initial_growth_prior_sd - ) - log_i0_over_n_site[i] <- rnorm( - n = 1, mean = log_i0_over_n, - sd = 0.5 - ) # sigma_I0 - } - - for (i in 1:n_sites) { - unadj_r_site <- ind_m %*% exp(log_r_site[i, ]) # daily R site - site_output <- model$functions$generate_infections( - unadj_r_site, uot, rev(generation_interval), log_i0_over_n_site[i], - initial_growth_site[i], ht, - infection_feedback, infection_feedback_rev_pmf - ) - new_i_over_n_site[i, ] <- site_output[[1]] - r_site[i, ] <- site_output[[2]] - } - } else { # site level R(t) and infections = state level R(t) and infections - for (i in 1:n_sites) { - new_i_over_n_site[i, ] <- new_i_over_n - r_site[i, ] <- rt - } - } - ## Generate site-level mean genomes from infections in each site------- @@ -388,6 +399,12 @@ generate_simulated_data <- function(site_level_inf_dynamics = TRUE, daily_hosp_admits_for_eval = exp_obs_hosp ) + # State infections per capita + df_inf <- data.frame( + t = 1:(ot + ht), + inf_per_capita = new_i_over_n[(uot + 1):(uot + ot + ht)] + ) + example_df <- df_long %>% dplyr::left_join(df_hosp, by = "t" @@ -399,6 +416,9 @@ generate_simulated_data <- function(site_level_inf_dynamics = TRUE, ) %>% dplyr::left_join(site_lab_map, by = c("lab_wwtp_unique_id" = "lab_site") + ) %>% + dplyr::left_join(df_inf, + by = "t" ) @@ -411,7 +431,7 @@ generate_simulated_data <- function(site_level_inf_dynamics = TRUE, index_cols = seq_along(p_hosp_days) ) r_df <- data.frame( - name = "R", true_value = rt, + name = "rt", true_value = rt, index_rows = NA, index_cols = seq_along(rt) ) diff --git a/cfaforecastrenewalww/R/get_data.R b/cfaforecastrenewalww/R/get_data.R index b389035e..606e0ee5 100644 --- a/cfaforecastrenewalww/R/get_data.R +++ b/cfaforecastrenewalww/R/get_data.R @@ -387,11 +387,32 @@ get_stan_data_site_level_model <- function(train_data, select(pop) %>% unique() %>% pull(pop) + stopifnot( "More than one population size in training data" = length(pop) == 1 ) + message("Prop of population size covered by wastewater: ", sum(pop_ww) / pop) + + # Logic to determine the number of subpopulations to estimate R(t) for + add_auxiliary_site <- ifelse(pop >= sum(pop_ww), TRUE, FALSE) + if (add_auxiliary_site) { + # In most cases, wastewater catchment coverage < entire state. + # So here we add a subpopulation that represents the population not + # covered by wastewater surveillance + norm_pop <- pop + n_subpops <- n_ww_sites + 1 + subpop_size <- c(pop_ww, pop - sum(pop_ww)) + } else { + message("Sum of wastewater catchment areas is greater than state pop") + norm_pop <- sum(pop_ww) + # If sum catchment areas > state pop, + # use sum of catchment area pop to normalize + n_subpops <- n_ww_sites # Only divide the state into n_site subpops + subpop_size <- pop_ww + } + # Estimate of number of initial infections i0 <- mean(train_data$daily_hosp_admits[1:7], na.rm = TRUE) / p_hosp_mean @@ -418,7 +439,7 @@ get_stan_data_site_level_model <- function(train_data, dur_inf = dur_inf, mwpd = ml_of_ww_per_person_day, ot = ot, - n_ww_sites = n_ww_sites, + n_subpops = n_subpops, n_ww_lab_sites = n_ww_lab_sites, owt = owt, oht = oht, @@ -432,7 +453,9 @@ get_stan_data_site_level_model <- function(train_data, p_hosp_m = p_hosp_m, generation_interval = generation_interval, ts = 1:gt_max, - n = pop, + state_pop = pop, # state population (needed for hospital admissions) + subpop_size = subpop_size, # population size in each site/subpop + norm_pop = norm_pop, # used to normalize the sum of infections from each subpop ww_sampled_times = ww_sampled_times, hosp_times = hosp_times, ww_sampled_lab_sites = ww_sampled_lab_sites, @@ -706,7 +729,7 @@ site_level_inf_inits <- function(train_data, params, stan_data) { n_weeks <- as.numeric(stan_data$n_weeks) tot_weeks <- as.numeric(stan_data$tot_weeks) - n_ww_sites <- as.numeric(stan_data$n_ww_sites) + n_subpops <- as.numeric(stan_data$n_subpops) n_ww_lab_sites <- as.numeric(stan_data$n_ww_lab_sites) ot <- as.numeric(stan_data$ot) ht <- as.numeric(stan_data$ht) @@ -718,16 +741,13 @@ site_level_inf_inits <- function(train_data, params, stan_data) { init_list <- list( w = rnorm(n_weeks - 1, 0, 0.01), eta_sd = abs(rnorm(1, 0, 0.01)), - eta_i0 = abs(rnorm(n_ww_sites, 0, 0.01)), + eta_i0 = abs(rnorm(n_subpops, 0, 0.01)), sigma_i0 = abs(rnorm(1, 0, 0.01)), - eta_growth = abs(rnorm(n_ww_sites, 0, 0.01)), + eta_growth = abs(rnorm(n_subpops, 0, 0.01)), sigma_growth = abs(rnorm(1, 0, 0.01)), autoreg_rt = abs(rnorm(1, autoreg_rt_a / (autoreg_rt_a + autoreg_rt_b), 0.05)), log_r_mu_intercept = rnorm(1, convert_to_logmean(1, 0.1), convert_to_logsd(1, 0.1)), - error_site = matrix( - rnorm(n_ww_sites * n_weeks, mean = 0, sd = 0.1), - n_ww_sites, n_weeks - ), + error_site = matrix(rnorm(n_subpops * n_weeks, mean = 0, sd = 0.1), n_subpops, n_weeks), autoreg_rt_site = abs(rnorm(1, 0.5, 0.05)), sigma_rt = abs(rnorm(1, 0, 0.01)), i0_over_n = plogis(rnorm(1, qlogis(i0 / pop), 0.05)), diff --git a/cfaforecastrenewalww/R/get_output_metadata.R b/cfaforecastrenewalww/R/get_output_metadata.R index 03049a1a..1cb24e0b 100644 --- a/cfaforecastrenewalww/R/get_output_metadata.R +++ b/cfaforecastrenewalww/R/get_output_metadata.R @@ -10,6 +10,10 @@ #' to use the hospitalization only model, as a vector #' with states coded identically to how they are in #' the `location` column of `full_diagnostics_df` +#' @param exclude_states States for which we chose to +#' not submit a forecast for this week, as a vector with states +#' coded identically to how they are in the `location` columnd +#' of `full_diagnostics_df` #' @param output_dir Path to a directory in which to save #' the metadata table. Only used if `prod_run = TRUE`. #' Default `NULL`. @@ -21,6 +25,7 @@ #' @export get_location_notes_table <- function(full_diagnostics_df, hosp_only_states, + exclude_states, output_dir = NULL, prod_run = FALSE) { metadata_df <- full_diagnostics_df %>% @@ -53,6 +58,10 @@ get_location_notes_table <- function(full_diagnostics_df, "Hospital admissions only model was run ", "due to either issues with input data or model" ), + location %in% c(exclude_states) ~ paste0( + "No forecast was submitted ", + "due to either issues with input data or model" + ), TRUE ~ "None" )) %>% dplyr::select(location, additional_notes) @@ -87,6 +96,10 @@ get_location_notes_table <- function(full_diagnostics_df, #' to use the hospitalization only model, as a vector #' with states coded identically to how they are in #' the `location` column of `full_diagnostics_df` +#' @param exclude_states States for which we chose to +#' not submit a forecast for this week, as a vector with states +#' coded identically to how they are in the `location` columnd +#' of `full_diagnostics_df #' @param output_dir Path to a directory in which to save #' the metadata table. Only used if `prod_run = TRUE`. #' Default `NULL`. @@ -98,6 +111,7 @@ get_location_notes_table <- function(full_diagnostics_df, #' @export get_metadata_yaml <- function(data_diagnostics_df, hosp_only_states, + exclude_states, output_dir = NULL, prod_run = FALSE) { summary_list <- get_summary_stats(data_diagnostics_df) @@ -116,6 +130,11 @@ get_metadata_yaml <- function(data_diagnostics_df, ifelse(rlang::is_empty(hosp_only_states), "None", list(hosp_only_states) + ), + "States we chose to not submit a forecast for" = + ifelse(rlang::is_empty(exclude_states), + "None", + list(exclude_states) ) ) if (isTRUE(prod_run)) { diff --git a/cfaforecastrenewalww/R/model_params.R b/cfaforecastrenewalww/R/model_params.R index 0a0970ab..2659ce0c 100644 --- a/cfaforecastrenewalww/R/model_params.R +++ b/cfaforecastrenewalww/R/model_params.R @@ -99,7 +99,7 @@ get_model_param_df <- function(x) { "p_hosp_w_sd", "t_peak", "dur_shed", "ww_site_mod_sd", "infection_feedback" ) - daily_params <- c("rt", "new_i", "p_hosp") + daily_params <- c("rt", "state_inf_per_capita", "p_hosp") weekly_params <- c("w", "p_hosp_w") day_of_week_params <- c("hosp_wday_effect") diff --git a/cfaforecastrenewalww/R/plots.R b/cfaforecastrenewalww/R/plots.R index 0166c6e5..f8b560aa 100644 --- a/cfaforecastrenewalww/R/plots.R +++ b/cfaforecastrenewalww/R/plots.R @@ -148,6 +148,8 @@ plot_combined_data <- function(comb, figure_file_path, #' @param y outcome variable for the y-axis of plots, options are 'pred_hosp' #' and 'pred_ww' #' @param figure_file_path directory to save the figure +#' @param log_scale whether or not to transform the y-axis to log scale, +#' default is FALSE #' @param grouping_var what to group by, default is NA, options are 'model_type' #' and 'location' #' @param from_full_df if TRUE, df is a draws dataframe, if FALSE, df is a data @@ -166,6 +168,7 @@ plot_combined_data <- function(comb, figure_file_path, #' @examples get_plot_draws <- function(df, y, figure_file_path, + log_scale = FALSE, grouping_var = NA, from_full_df = FALSE, days_pre_forecast_date_plot = 90, @@ -266,7 +269,15 @@ get_plot_draws <- function(df, y, ) } + last_obs_data <- y_draws %>% + filter( + !is.na(obs_data), + date == max(date) + ) %>% + distinct(obs_data) %>% + pull() max_obs_data <- max(y_draws$obs_data, na.rm = TRUE) + y_axis_lim <- max(3 * last_obs_data, 1.5 * max_obs_data) # Make a plot with the draws and the median plot <- ggplot() + geom_line( @@ -336,8 +347,15 @@ get_plot_draws <- function(df, y, vjust = 0.5, hjust = 0.5 ) ) + - coord_cartesian(ylim = c(0, 3 * max_obs_data)) + guides(color = "none") + trans <- if (log_scale) "log" else "linear" + + if (isFALSE(log_scale)) { + plot <- plot + + coord_cartesian(ylim = c(0, y_axis_lim)) + } else { + plot <- plot + scale_y_continuous(trans = "log10") + } if (y == "pred_ww") { # Fill in the WW data point @@ -386,7 +404,7 @@ get_plot_draws <- function(df, y, ggsave( file.path( full_file_path, - glue::glue("{y}_draws_{model_file_name}.png") + glue::glue("{y}_draws_{model_file_name}_{trans}.png") ), plot = p, width = 12, # 8 @@ -412,7 +430,8 @@ get_plot_draws <- function(df, y, create_dir(full_file_path) ggsave( file.path( - full_file_path, "mult_models_hosp_forecast.png" + full_file_path, + glue::glue("mult_models_hosp_forecast_{trans}.png") ), plot = p, width = 15, @@ -624,10 +643,10 @@ get_plot_param_distribs <- function(df, #' then don't #' @return plot object of R(t)s in each site with state level median overlaid #' @export -get_rt_site_level <- function(df, - figure_file_path, - from_full_df = FALSE, - write_files = TRUE) { +get_rt_subpop_level <- function(df, + figure_file_path, + from_full_df = FALSE, + write_files = TRUE) { if (isFALSE(from_full_df)) { model_draws <- arrow::read_parquet( file = @@ -644,7 +663,7 @@ get_rt_site_level <- function(df, ) rt_draws <- rt_draws %>% left_join( rt_draws %>% - group_by(date, site) %>% + group_by(date, subpop) %>% summarise(median_Rt = quantile(value, 0.5, na.rm = TRUE)) ) @@ -672,14 +691,14 @@ get_rt_site_level <- function(df, model_file_name <- plot_metadata$model_file_name n_sites <- length(unique(rt_draws$site)) - title <- glue::glue("Site-level R(t) as of {forecast_date} in {location}") + title <- glue::glue("Subpopulation R(t) as of {forecast_date} in {location}") plot <- ggplot(rt_draws) + - geom_line(aes(x = date, y = value, group = draw, color = as.factor(site)), + geom_line(aes(x = date, y = value, group = draw, color = as.factor(subpop)), show.legend = FALSE, alpha = 0.05, size = 0.5 ) + - geom_line(aes(x = date, y = median_Rt, color = as.factor(site)), + geom_line(aes(x = date, y = median_Rt, color = as.factor(subpop)), show.legend = FALSE, size = 1.3 ) + geom_line( @@ -687,7 +706,7 @@ get_rt_site_level <- function(df, aes(x = date, y = median_Rt_state), color = "black" ) + geom_vline(aes(xintercept = forecast_date), linetype = "dashed") + - facet_wrap(~site) + + facet_wrap(~subpop) + xlab("") + ylab("R(t)") + theme_bw() + @@ -718,7 +737,7 @@ get_rt_site_level <- function(df, ggsave( file.path( full_file_path, - glue::glue("site_level_Rt_from_{model_file_name}.png") + glue::glue("subpop_level_Rt_from_{model_file_name}.png") ), plot = plot, width = max(3 * round(sqrt(n_sites)), 6), @@ -807,7 +826,7 @@ get_rt_from_draws <- function(df, labels = scales::date_format("%Y-%m-%d") ) + ggtitle(title) + - scale_y_continuous(trans = scales::log_trans()) + + scale_y_continuous(trans = "log10") + theme( axis.text.x = element_text( size = 10, vjust = 1, diff --git a/cfaforecastrenewalww/R/pre_processing.R b/cfaforecastrenewalww/R/pre_processing.R index 086305c1..0affb057 100644 --- a/cfaforecastrenewalww/R/pre_processing.R +++ b/cfaforecastrenewalww/R/pre_processing.R @@ -753,6 +753,39 @@ save_timestamped_nwss_data <- function(ww_path_to_save) { return(ww_data_path) } +#' Subsample wastewater sites +#' +#' @param ww_data Site-level wastewater data, extracted and trnsformed from +#' the raw NWSS data to contain only the relevant columns. This will be for all +#' time points +#' @param prop_sites Proportion of all sites that we want to keep in the input +#' data. default is 0.2 +#' @param sampled_sites The list of sites that you want to keep, so that we +#' can compare the exact same subsample if desired. Default is NULL, then +#' random sampling is done according to the proportion +#' +#' @return a data frame structured the same way as the ww_data but with only +#' prop_sites included. These sites are chosen randomly +#' @export +#' +#' @examples +subsample_sites <- function(ww_data, prop_sites = 0.2, + sampled_sites = NULL) { + if (is.null(sampled_sites)) { + site_list <- ww_data %>% + select(site) %>% + unique() %>% + filter(!is.na(site)) %>% + pull() + n_sites <- length(site_list) + + sampled_sites <- sample(site_list, max(1, round(prop_sites * n_sites))) + } + + ww_data_subsampled <- ww_data %>% filter(site %in% c(sampled_sites)) + + return(ww_data_subsampled) +} #' Initial subsetting of NWSS data diff --git a/cfaforecastrenewalww/R/process_model_outputs.R b/cfaforecastrenewalww/R/process_model_outputs.R index 7d51ed63..3ddb17e5 100644 --- a/cfaforecastrenewalww/R/process_model_outputs.R +++ b/cfaforecastrenewalww/R/process_model_outputs.R @@ -801,11 +801,11 @@ get_gen_quants_draws <- function(all_draws, p_hosp_draws ) model_draws <- model_draws %>% - mutate(site_index = NA) + mutate(subpop_index = NA) if (model_type == "site-level infection dynamics") { site_level_rt <- all_draws %>% - spread_draws(r_site_t[site_index, t]) %>% + spread_draws(r_site_t[subpop_index, t]) %>% rename(value = r_site_t) %>% mutate( draw = `.draw`, @@ -1124,6 +1124,7 @@ get_parameter_draws <- function(model_draws, pars, train_data) { #' of those outputs #' @param hosp_only_states the states we want to manually replace with the #' hospital admissions only model for submission +#' @param exclude_states the states we don't want to submit this week #' @param us_model_type The default model type for the US #' #' @return @@ -1132,6 +1133,7 @@ get_parameter_draws <- function(model_draws, pars, train_data) { #' @examples get_loc_model_map <- function(df_of_filepaths, hosp_only_states, + exclude_states, us_model_type = "state-level aggregated wastewater") { # Specify the desired model type loc_model_map_states <- df_of_filepaths |> @@ -1142,7 +1144,15 @@ get_loc_model_map <- function(df_of_filepaths, (location %in% hosp_only_states) ~ "hospital admissions only", TRUE ~ model_type ) - ) + ) |> + dplyr::mutate( + keep_state = dplyr::case_when( + (location %in% exclude_states) ~ FALSE, + TRUE ~ TRUE + ) + ) |> + dplyr::filter(keep_state == TRUE) |> + dplyr::select(location, model_type) us_df <- data.frame(location = "US", model_type = us_model_type) loc_model_map <- rbind(loc_model_map_states, us_df) diff --git a/cfaforecastrenewalww/R/sysdata.rda b/cfaforecastrenewalww/R/sysdata.rda index d489b77b4b03eb3280ade5fafa0cc484ff9309eb..971754ff1b9ba7b7c945accfa2f0f9d44d936a0f 100755 GIT binary patch literal 66316 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 z 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 W7-1@x-6f)2* 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 literal 60198 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 B#Jf`%FEkyiI7A+Hj-ofV$=jO?S&F$LX} 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 diff --git a/cfaforecastrenewalww/data/example_df.rda b/cfaforecastrenewalww/data/example_df.rda index 42e35e30b681850b625b4dcecf143b76084aba03..f8cc566f7a52ba0e5f2663334c4c9a6715b9c2fc 100755 GIT binary patch literal 2766 zcmbV^dpHw}9>P=?KA=#3fMNn)8L^->sPnM>}3WvC&QyCfl&dt+`*Z@HU!-6^-} zf?P{$4Jjf@?=poZm&)m!zs_^sKhE=<-}8HZpU?Aqe!s7|C-tblnFrd*1M5ct11R@* z{$ABrkCC@eL<@I>zi%&pUYp(X6R-gyyQ37V4&;@H_gtBrm9_Y+j*?~{R?FGz5Xi)3 zfld9-*kboOfYD5dS{1?Gf#O@kB-jFNfiH1@z*ZX5L>`(NSdM1;4`TgQOh}1U%)omr zEStu}so?s6Xj&0SS)Rnj`g6^brnRBnQOHTU88-u>Q|g^i`zg zNu*m49Dqv)Fr0JC#~g#=nG8)dEdjt4P@fM10;{f@f)lu@K(s9c0sz`Os8V?da28-H z0Rm?JiU-?b{i$eHrG~cPY)*9r7J_?HT@fh2#Zqyv?6qF560&LpIG+6v7nPcFg63fy zkHiE7mH>DnLc$>MC1h8*SqTmR4pLPGIOj?x**gcOa?7m*h)3AitQrR1e*X}C%GMwV zEypcU#rhgn$xGA#c%)*H6Nz9dE3yb=kP-q*fO0$yIz&y3mCf7|ZH>6rdA0@dYyU5V z1ev#>{`Pv>L1zeq?k-!cZS(Pn8Y%0v8L4Lq^rj<6M)l_6l9t^fx`#IvS8bkR807uk zQ_B;>^(%4Bn~{s~D!N;G)FoqoiO5$cYugQP>&TH~w?gjF8PE*r8_<5;MC59~6K=L) z23gymkrCh-njTP!)*{t!{V3+GbSB4ivU?l(&=Jf)$lrtp4y*6%VOE zoq_sb+@ywYepoM}_}v<~kAh|(i}aMv6G~p1k7n)42%V081?-E5-Gt6{r?aw^%+o|Y zCtKPQ$GR)SYxZ{<|I`8e6>jY;2#?|?L>y(aKYC3onU1!P&FaU8cI1rvXg9XLTBHD6od_bJ3Ff1Iz#E;vU0IA5I=BY<@H z*j@Q~_pCWGqD=~Md;22t*)1Zlgx_jr9PQEmEcmJQF52MOp^BTKo=|9F@G<<13cNxiuL+~eT zq897ki@RkDZB}jfmn+1%Q=exZ^nY&5B;V=M{khQ@s<>$)T!}zBI|iPj)*!VhJDGgp z);7&xxk)CVXCNabML+&q!?p|@r+@9-E&kM%&qkLx7k|bs!xQI^el+sweS0`+r)|DN zU>7hG`TI;?Qb%F!;&9NgGUv{V$%U8;)oWHOnT{mC;?BctVk{=R=baujB1oto54K@? zjdZ;$gv~|2k$u_!cqnFx0PQ%{omg9Qt4gQJ^yR(+vRmt~u`PCB*X$FL0qy0}+%5mrC3o^O=1nMvUC65ML z$THmyYKH?NOvh>>LKoH!xrr4VD(F4hZMpL%dpV$T!7YP*q#4SaSfA7hh|lELZc z_0Lj1xOW@s(QH!kn&J!U2PF1rQ@${}F*TbvO-4z6)1JrwaYc%{y`kC4ddXU8UbruX zBtq10WL_j;C$l0Q#y9h5Dk;-^$qS=KCQ?BA-K9yrp0_@Yj9z0*KLEi>gDMR!X)JmM zH2C6rU9&#no#|G}(ohGvBK_ce4T#sQ1|7j()Sjm}Nqa{%RpU{N92hx!8c zxg!-Q)7Mw}l2BUyV(G;GvGHL^*P5e{-Z7&@m3&*)4YRzkaQM(-npQE=dc9HYi!7Kk zRm4&Mogb?fFcEWC^N(u!(&h}NZmIj~IK9wfP2!Tj>lvzM|UnSM>Lt~c}edPBb4fF+;PGcjEbWghxVB09z0;_P=|c`M73B1apRbu)+&_J@kO1)I+r)!&xRt- z?|%H=aebYhLQ@h=!Mq7`KZGy~z246DshHQ@=dxnPROXG(Wv=iEF*D_*H~sdV4}KCO zn14@*SwB^)Zf6+!NA#@Ds|KGg(dMTI-nlE0%N2?<)^hUyxM=qNL+9Cxz#?lcI&50v zH^nJbrYhm!+m6z2#9?)%5#gC+=Glw)Zns-nb1FkKuX|dAH?IOfNf9}FVyVld zZ(JYjyA+l8{m+E3jjfX-h3ZQKE(+6XT9M<5dtF~Qj9?8i6{60a=ZqiGp`6|p1=>Il z;)#;xawW+clI99>$r>_!zvN%E(17^=QYg#{kmd3372H;;+39=Srw@70P6vBHyB6Cm zcoV3F^|pZKPc0LV&`3XV&NB@l@zsip?DBIT^Xv0G z$4^b>5=%=cBGBCT@uQlx-rL&TYX0(;#pJpcdz literal 2729 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 diff --git a/cfaforecastrenewalww/data/param_df.rda b/cfaforecastrenewalww/data/param_df.rda index 3f8de6e652c0b442f3070d7d71a1ead2ce82f860..c462b650458e20f53d3e5110cab5bc60b5f4b4bd 100755 GIT binary patch literal 2325 zcmV+w3F`JjT4*^jL0KkKS-O}Y82}2sfB*mg|NsC0|NsC0|NsC0|NsC0|NsC0|6lL_ z|NsC0|Nr0yefOi+)7{^99Qp5eS$Es6+dh4_7l_qQCZ#-~rkWn3(FTnJMn;-?O*9Pv z14ck(G|{2zX^_#OpfUge00w|nqe3-6h@PWB z@{FFKXaS~x9-~2_>H(l=Jwwz3)Otou9*Fe@YCS_kO+1OG>J!prF*I#Qsp@S&0iXth zOn_;iGy$L*XaMyFl~WT&hKxp-nj1!gO(&Gbj3$#1X`}T+H4Ooy0WxGT5vG`$Gy~BZ zG5|7Zrh@`9Gf-j%5C)7*88p))O&JX|(?OtQh=|ahQMEMC&<2K?G&E=c0iZGs00000 z226ke4FC-d8UQqC00w~2Gynk5000k22Gt;@Q9Y^YG6cXHo=NB)sp+5qGz5A9piCMj z4HEzj00J=>Xb{N33A~8U?%w zv$C2!1QQ^H07z~Tz^?+LH73L~;A~DuVdR<*MCf=YWbmGo;(kyH2|^yq7;G_yK*||` zz|IbafszdX@IEqOq%{VxfHnjHv>^zBFpxeKvba8#(!4(v^1xV25o0Wa`DHA{oPZma zg3?-xS!^InX#`t~c?Lok0^(eYnRG6t*t?g4@?MBi_FoI>elO+#z?dTjVGJpTFyA1O!@>BQ;vRWNx-QT+yt2hQ3E&jFgm~pY}DtK*JfCTjdL;QPv~4kH z5@x0vO%<-^9#d%zQ9+f}R}r*}L{{k-UrI8v=+^mA@egLmo8lcq5hGpKq9+202~4aE2?la;mQ7_Bg|q^-rzL z*grM&^O?2iY|)5UVk;|C#kQY&+v;AI++_@J-^*h47d{TtOmD8C61OtIvOpI=$-T)5&e+hlo1TTSP5V{B?aR}hW)T3 z<=R{MZRVsLR{P+60W~j9f>I&7p95s zM%99LcFL7O5z*>MstN-XgNYVWdmL#xf-F!yQ9X(iYN>U`?7_vb2u75Q=kf;EcpUw~ zlR=bqei$e=)HHjrSk(n6Hj=X4hyakw9SeMG1mmcmL< znv@AVE;~V#_Y>^-`0aDnq9MUBb5Pb+a@09~L_qi<$ze6}%D4~da+1$e>Yc954(fDC z0Nn#(=5ge!(*d7`a@{(-i z1NB;v0Ejdi8Pov~hidrU07M)#AwSPM_DZZ9)7>@oUy%_4y`u=}(>?`0*4SbMkSEy5 zpizGSm(?7O&Lw3+Z#@fZ{r z)d~ecWVa)WE)^{#l^NAC63_w}#X|-tG!P?Oi3Tnk01%aZMXrK9xzd>MHcd1v!(rG{ zaChoz9yXveUos^*djll-%gDJswULpf|5U_+dPr8XJ zb5q}Fk0PP-s%TnWG{Xczta||FfJl$xZhBiPH)*2h8!87zF;qNLksl`tVvzZhq54d2 z@BBnjy8ehZ0Yh{ucB{c8?Q}9IUi6?Vb7~&dV}dzMO`@F^^&T9>wyzNYPW0~1sNV6P8tstwl z$gRQio~zu@836gA&PisLxXrHuRdzdWx%I0pBY2kvG<47ltr-Xu!1sA6FO^A!gr$Z6 z>`y=okPwPq@lVels17EQ8w*#wkW4_sKAGF9{uY0#$z?D*-6<&iYMR~zSXbAB_QeJL z$o()_DEB;IOgvJ1=DxnLb+PVS^dS}P$5H}&4-^=1m8om{j7KY;8MpZ`vIiaFX@I5} zfoY-xPTjAr(l&Y)l0*h2a!e4e_*R5pfr3%&4(2R6Hh;7aO!yn%BNccf^#DD6K#^Yv vrS)wf5)7ayK>I_|yUjCN*P;WKKDHU{ELHVMAd(0|Fa9p%ig2MJbud6O-2WE} literal 1366 zcma)&eLT|%9LIn15RyFPWFC5z8OCO_rO3n_-KGuO>Rwz##Kw|}a_gmZ=$u(J+h|d{ zFif7xRUT5wFu7$9Im#D3U;Lm|%X{C$7i=a2X2`+2=Se|*1RY&g{u=@$kehfR;s zSAlJoS2q4z-==2ER-XFg|6SX!vpzZiX!KD_pzW*iT^UpWq;Yq2hX$Gf0Jd+^D1++T zFB9}{Mm;_i*sK9)Jw8a=ceA2_UWS$c-SdBY)~~^AMqn{ZPgu!$6CA?0U8ckkc2}_g z%)T9=Dy=fHT_vYy5t4T;A6G~NFnffzLbg{=F|MjWv39RL3jGNfe?o8W9 zs4^7c0WHD5Tl8q)tHEZ}7zl{nJOTig?>7xg7hsT!+9pO;%nKgjKN-f1zTIj}>Ey7@ zzdJ@Vv@+Cpknp_{iiHwrQn8~!uay^3(YfRktkl)ThA0Cp0z;MA4tP@k)JaP-Dn04KEt#Ow&?Y)tRSN>7UOhAGj!KQy1Z-yt{ zooaNcaja)TOqws9T|PE(&4 z{7q|jTmC3ckYQ$$({uQo1<&N_7Jd8J*c{XJow`HrDzIY&V{&b{T~cL`sgEO-S5$FH zBB-E%$G*ug%sC^4y_qVS8v@@zS=f4#{M_;UiFMvwt}k0XJM)RyCF|qbkV=~asnx?= zk3fbZ+8e8oa2;C?1eD8cO=;fR`0zspN2X z8Qgm&h!|Dvc6)fRi0J&gs*X<*9+vL2#4m7R=oQ`aH+O)hlFX2BdLLGiMH#jAqfHR0 z;~?zfFxM+a&MREGMN*(9?2mR{-?(HO+2L_X|5-kHU=b-E@6MEU_sRp7TL}YQ@hwa> zlh16}&`Gsw`yfK8`L6=ctwlwxIrRs`bi-Z-X8KvJ541p$2Ubi&n_J*B4{wBWlhCxU zjSNKVHrZ9_m7LawyaP3|vcB}3m*Nw7yPeT(d*v4@2+w&iWJ1z*94&x|Bu7#t2Mbdo z9Bov6=Ts;$ade}i{IgVx_U_f?@bk~o;*X}3tdQ{(wK2V^+w+A3TwREh4D$hZA4gE!~9kk5e;I{E<;A8yg*kmxrG^Lf(3a5k1X3(vCb>0tCx(h}Wzfsxk2t1|L6PAV^TKtoLyU!#o7Ttcg2PsO`RvMM%6p3* z4~LbMyOrRHB0DVx{rYelL%x(do%_-7acx+OH%ax_S+E+f^Hn@|{70jDezH2K%;XDX zW;J^jN4j{et?5s0t(PK+F3tL@M3tK;y*FgZGW}-cuP!l&k%3T8;0G6OdphnKyL0>n zs%@wP)$Js=KHrLpOYTLoJe4;g%Wth8l$Sa`@+KqF7rc`Rrtf!9aEBy^BPnL7AF>9E r?Am7fP@Ht_JMOGT9>O^9t+oH6O<6y2c|$(379rU=hV`${e(>=h+|PcR diff --git a/cfaforecastrenewalww/inst/stan/renewal_ww_hosp_site_level_inf_dynamics.stan b/cfaforecastrenewalww/inst/stan/renewal_ww_hosp_site_level_inf_dynamics.stan index 82744ed3..fa56c445 100644 --- a/cfaforecastrenewalww/inst/stan/renewal_ww_hosp_site_level_inf_dynamics.stan +++ b/cfaforecastrenewalww/inst/stan/renewal_ww_hosp_site_level_inf_dynamics.stan @@ -18,7 +18,7 @@ data { vector[if_l] infection_feedback_pmf; // infection feedback pmf int ot; // number of days of observed hospital admissions int oht; // number of days with observed hospital admissions - int n_ww_sites; // number of WW sites + int n_subpops; // number of WW sites int n_ww_lab_sites; // number of unique ww-lab combos int n_censored; // numer of observed WW data points that are below the LOD int n_uncensored; //number not below LOD @@ -30,17 +30,19 @@ data { int tot_weeks; // number of weeks for the weekly random walk on IHR (includes unobserved time) matrix [uot+ot+ht, tot_weeks] p_hosp_m; // matrix to convert p_hosp from weekly to daily vector[gt_max] generation_interval; // generation interval distribution - real n; // population size + real state_pop; // population size + vector[n_subpops] subpop_size; // the population sizes for each subpopulation + real norm_pop; array[owt] int ww_sampled_times; // a list of all of the days on which WW is sampled // will be mapped to the corresponding sites (ww_sampled_sites) array[oht] int hosp_times; // the days on which hospital admissions are observed - array[owt] int ww_sampled_sites; // vector of unique sites in order of the sampled times + array[owt] int ww_sampled_sites; // vector of unique sites in order of the sampled times array[owt] int ww_sampled_lab_sites; // vector of unique lab-site combos i // n order of the sampled times array[n_censored] int ww_censored; // times that the WW data is below the LOD array[n_uncensored] int ww_uncensored; // time that WW data is above LOD vector[owt] ww_log_lod; // The limit of detection in that site at that time point - array[n_ww_lab_sites] int lab_site_to_site_map; // which lab sites correspond to which sites + array[n_ww_lab_sites] int lab_site_to_site_map; // which lab sites correspond to which sites array[oht] int hosp; // observed hospital admissions array[ot + ht] int day_of_week; // integer vector with 1-7 corresponding to the weekday vector[owt] log_conc; // observed concentration of viral genomes in WW @@ -109,14 +111,14 @@ parameters { real log_r_mu_intercept; // state-level mean baseline reproduction number estimate (log) at t=0 real sigma_rt; // magnitude of site level variation from state level real autoreg_rt_site; - matrix[n_ww_sites, n_weeks] error_site; // matrix of w_sites + matrix[n_subpops, n_weeks] error_site; // matrix of w_sites real i0_over_n; // initial per capita // infection incidence - vector[n_ww_sites] eta_i0; // z-score on logit scale of state + vector[n_subpops] eta_i0; // z-score on logit scale of state // initial per capita infection incidence relative to state value real sigma_i0; // stdev between logit state and site initial // per capita infection incidence - vector[n_ww_sites] eta_growth; + vector[n_subpops] eta_growth; real sigma_growth; real initial_growth; // initial growth from I0 to first observed time real inv_sqrt_phi_h; @@ -140,11 +142,10 @@ parameters { } // transformed parameters { - vector[ot + uot + ht] new_i; // daily incident infections /n (state level average) vector[ot + uot + ht] p_hosp; // probability of hospitalization - vector[ot + uot + ht] model_hosp; // model estimated hospital admissions + vector[ot + uot + ht] model_hosp_per_capita; // model estimated hospital admissions per capita vector[oht] exp_obs_hosp; // expected observed hospital admissions - vector[ot] exp_obs_hosp_no_wday_effect; // expected observed hospital admissions before weekday effect + vector[ot] exp_obs_hosp_per_capita_no_wday_effect; // expected observed hospital admissions per capita before weekday effect vector[gt_max] s; // viral kinetics trajectory (normalized) vector[owt] exp_obs_log_v_true = rep_vector(0, owt); // expected observations at each site in log scale vector[owt] exp_obs_log_v = rep_vector(0, owt); // expected observations at each site with modifier in log scale @@ -154,61 +155,32 @@ transformed parameters { vector[n_ww_lab_sites] sigma_ww_site; vector[n_weeks] log_r_mu_t_in_weeks; // log of state level mean R(t) in weeks vector[n_weeks] log_r_site_t_in_weeks; // log of site level mean R(t) in weeks, used as a placeholder in loop - vector[ot + ht] rt; // state level R(t) vector[ot + ht] unadj_r; // state level R(t) before damping - matrix[n_ww_sites, ot+ht] r_site_t; // site_level R(t) + matrix[n_subpops, ot+ht] r_site_t; // site_level R(t) row_vector[ot + ht] unadj_r_site_t; // site_level R(t) before damping - row_vector[ot + uot + ht] new_i_site; // site level incident infections - matrix[n_ww_sites, ot + ht] model_log_v_ot; // expected observed viral genomes/mL at all observed and forecasted times + row_vector[ot + uot + ht] new_i_site; // site level incident infections per capita + real pop_fraction; // proportion of state population that the subpopulation represents + vector[ot + uot + ht] state_inf_per_capita = rep_vector(0, uot + ot + ht); // state level incident infections per capita + matrix[n_subpops, ot + ht] model_log_v_ot; // expected observed viral genomes/mL at all observed and forecasted times real g = pow(log10_g, 10); // Estimated genomes shed per infected individual - real i0 = i0_over_n * n; // Initial absolute infection incidence - vector[n_ww_sites] i0_site_over_n; // site-level initial + real i0 = i0_over_n * state_pop; // Initial absolute infection incidence + vector[n_subpops] i0_site_over_n; // site-level initial // per capita infection incidence - vector[n_ww_sites] growth_site; + vector[n_subpops] growth_site; + - // AR + RW implementation: - // AR + RW implementation: + // State-leve R(t) AR + RW implementation: log_r_mu_t_in_weeks = biased_rw(log_r_mu_intercept, autoreg_rt, eta_sd, w); unadj_r = ind_m*log_r_mu_t_in_weeks; unadj_r = exp(unadj_r); - // Expected daily number of new infections (per capita), using EpiNow2 assumptions re pre and post observation time - // Using pop = 1 so that damping is normalized to per capita - (new_i, rt) = generate_infections( - unadj_r, - uot, - gt_rev_pmf, - log(i0_over_n), - initial_growth, - ht, - infection_feedback, - infection_feedback_rev_pmf); - - // Assemble a daily vector of p_hosp from the initial value, random walk increments, and scaling SD - p_hosp = assemble_p_hosp(p_hosp_m, p_hosp_int, p_hosp_w_sd, p_hosp_w); - - // Expected hospitalizations: - // This is a convolution of incident infections and the hospital-admission delay distribution - // generates all hospitalizations, across unobserved time, observed time, and forecast time - model_hosp = convolve_dot_product(p_hosp .* new_i, reverse(inf_to_hosp), - ot + uot + ht); - - // just get the expected observed hospitalizations - exp_obs_hosp_no_wday_effect = model_hosp[uot + 1 : uot + ot]; - // apply the weekday effect so these are distributed with fewer admits on Sat & Sun - // multiply by n because data must be integer so need this to be in actual numbers not proportions - exp_obs_hosp = n * day_of_week_effect( - exp_obs_hosp_no_wday_effect[hosp_times], - day_of_week[hosp_times], - hosp_wday_effect); - // Shedding kinetics trajectory s = get_vl_trajectory(t_peak, viral_peak, dur_shed, gt_max); // Site level disease dynamic estimates! i0_site_over_n = inv_logit(logit(i0_over_n) + eta_i0 * sigma_i0); growth_site = initial_growth + eta_growth * sigma_growth; // site level growth rate - for (i in 1:n_ww_sites) { + for (i in 1:n_subpops) { // Let site-level R(t) vary around the hierarchical mean R(t) // with a biased random walk towards the previous time // steps deviation @@ -221,10 +193,10 @@ transformed parameters { unadj_r_site_t = exp(to_row_vector(ind_m*(log_r_site_t_in_weeks))); { - tuple(vector[num_elements(new_i)], vector[num_elements(unadj_r)]) output; + tuple(vector[num_elements(state_inf_per_capita)], vector[num_elements(unadj_r)]) output; output = generate_infections( to_vector(unadj_r_site_t), - uot, + uot, gt_rev_pmf, log(i0_site_over_n[i]), growth_site[i], @@ -236,14 +208,40 @@ transformed parameters { r_site_t[i] = to_row_vector(output.2); } + // For each site, tack on number of state infections + // site level infection dynamics sum to the total state infections: + pop_fraction = subpop_size[i] / norm_pop; + state_inf_per_capita += pop_fraction * to_vector(new_i_site); + model_net_i = to_row_vector(convolve_dot_product(to_vector(new_i_site), reverse(s), (uot + ot + ht))); + model_log_v_ot[i] = log(10) * log10_g + log(model_net_i[(uot+1):(uot + ot + ht) ] + 1e-8) - log(mwpd); } + + // Assemble a daily vector of p_hosp from the initial value, random walk increments, and scaling SD + p_hosp = assemble_p_hosp(p_hosp_m, p_hosp_int, p_hosp_w_sd, p_hosp_w); + + // Expected hospital admissions per capita: + // This is a convolution of incident infections and the hospital-admission delay distribution + // generates all hospitalizations, across unobserved time, observed time, and forecast time + model_hosp_per_capita = convolve_dot_product(p_hosp .* state_inf_per_capita, reverse(inf_to_hosp), + ot + uot + ht); + + // predicted hospital admissions per capita + exp_obs_hosp_per_capita_no_wday_effect = model_hosp_per_capita[uot + 1 : uot + ot]; + // apply the weekday effect so these are distributed with fewer admits on Sat & Sun + // multiply by state population to convert from predicted per capita admissions to + // predicted absolute admissions + exp_obs_hosp = state_pop * day_of_week_effect( + exp_obs_hosp_per_capita_no_wday_effect[hosp_times], + day_of_week[hosp_times], + hosp_wday_effect); + // Observations at the site level (genomes/person/day) are: // get a vector of genomes/person/day on the days WW was measured // These are the true expected genomes at the site level before observation error @@ -324,19 +322,20 @@ generated quantities { vector[ot + ht] exp_state_ww_conc; vector[ot + ht] state_log_c; vector[uot + ot + ht] state_model_net_i; - vector [n_ww_sites] site_i0_over_n_start; + vector [n_subpops] site_i0_over_n_start; + vector[ot + ht] rt; // state level R(t) - for(i in 1:n_ww_sites) { + for(i in 1:n_subpops) { site_i0_over_n_start[i] = i0_site_over_n[i] * exp(growth_site[i] * uot); } - pred_hosp = neg_binomial_2_rng(n * day_of_week_effect(model_hosp[uot + 1 : + pred_hosp = neg_binomial_2_rng(state_pop * day_of_week_effect(model_hosp_per_capita[uot + 1 : uot + ot + ht], day_of_week, hosp_wday_effect), phi_h); - pred_new_i = neg_binomial_2_rng(n * new_i[uot + 1 : uot + ot + ht], phi_h); + pred_new_i = neg_binomial_2_rng(state_pop * state_inf_per_capita[uot + 1 : uot + ot + ht], phi_h); // Here need to iterate through each lab-site, find the corresponding site // and apply the expected lab-site error @@ -345,11 +344,16 @@ generated quantities { sigma_ww_site[i]); } - state_model_net_i = convolve_dot_product(to_vector(new_i), + state_model_net_i = convolve_dot_product(state_inf_per_capita, reverse(s), (uot + ot + ht)); state_log_c = log(10) * log10_g + log(state_model_net_i[(uot + 1): (uot + ot + ht)] + 1e-8) - log(mwpd); exp_state_ww_conc = exp(state_log_c); + + // Deterministic calculation of state level R(t) from incident infections + // and the generation interval + rt = (state_inf_per_capita ./ convolve_dot_product(state_inf_per_capita, gt_rev_pmf, uot + ot + ht))[uot+1: uot + ot + ht]; + } diff --git a/cfaforecastrenewalww/man/get_loc_model_map.Rd b/cfaforecastrenewalww/man/get_loc_model_map.Rd index e81d0ec4..063f4048 100644 --- a/cfaforecastrenewalww/man/get_loc_model_map.Rd +++ b/cfaforecastrenewalww/man/get_loc_model_map.Rd @@ -7,6 +7,7 @@ get_loc_model_map( df_of_filepaths, hosp_only_states, + exclude_states, us_model_type = "state-level aggregated wastewater" ) } @@ -18,6 +19,8 @@ of those outputs} \item{hosp_only_states}{the states we want to manually replace with the hospital admissions only model for submission} +\item{exclude_states}{the states we don't want to submit this week} + \item{us_model_type}{The default model type for the US} } \description{ diff --git a/cfaforecastrenewalww/man/get_location_notes_table.Rd b/cfaforecastrenewalww/man/get_location_notes_table.Rd index 9dc7f201..fb68fce5 100644 --- a/cfaforecastrenewalww/man/get_location_notes_table.Rd +++ b/cfaforecastrenewalww/man/get_location_notes_table.Rd @@ -11,6 +11,7 @@ model} get_location_notes_table( full_diagnostics_df, hosp_only_states, + exclude_states, output_dir = NULL, prod_run = FALSE ) @@ -24,6 +25,11 @@ to use the hospitalization only model, as a vector with states coded identically to how they are in the `location` column of `full_diagnostics_df`} +\item{exclude_states}{States for which we chose to +not submit a forecast for this week, as a vector with states +coded identically to how they are in the `location` columnd +of `full_diagnostics_df`} + \item{output_dir}{Path to a directory in which to save the metadata table. Only used if `prod_run = TRUE`. Default `NULL`.} diff --git a/cfaforecastrenewalww/man/get_metadata_yaml.Rd b/cfaforecastrenewalww/man/get_metadata_yaml.Rd index eea4924d..f007fcd8 100644 --- a/cfaforecastrenewalww/man/get_metadata_yaml.Rd +++ b/cfaforecastrenewalww/man/get_metadata_yaml.Rd @@ -11,6 +11,7 @@ admissions only model.} get_metadata_yaml( data_diagnostics_df, hosp_only_states, + exclude_states, output_dir = NULL, prod_run = FALSE ) @@ -24,6 +25,11 @@ to use the hospitalization only model, as a vector with states coded identically to how they are in the `location` column of `full_diagnostics_df`} +\item{exclude_states}{States for which we chose to +not submit a forecast for this week, as a vector with states +coded identically to how they are in the `location` columnd +of `full_diagnostics_df} + \item{output_dir}{Path to a directory in which to save the metadata table. Only used if `prod_run = TRUE`. Default `NULL`.} diff --git a/cfaforecastrenewalww/man/get_plot_draws.Rd b/cfaforecastrenewalww/man/get_plot_draws.Rd index 4bf27176..fb132060 100644 --- a/cfaforecastrenewalww/man/get_plot_draws.Rd +++ b/cfaforecastrenewalww/man/get_plot_draws.Rd @@ -8,6 +8,7 @@ get_plot_draws( df, y, figure_file_path, + log_scale = FALSE, grouping_var = NA, from_full_df = FALSE, days_pre_forecast_date_plot = 90, @@ -28,6 +29,9 @@ and 'pred_ww'} \item{figure_file_path}{directory to save the figure} +\item{log_scale}{whether or not to transform the y-axis to log scale, +default is FALSE} + \item{grouping_var}{what to group by, default is NA, options are 'model_type' and 'location'} diff --git a/cfaforecastrenewalww/man/get_rt_subpop_level.Rd b/cfaforecastrenewalww/man/get_rt_subpop_level.Rd new file mode 100644 index 00000000..87ac9f61 --- /dev/null +++ b/cfaforecastrenewalww/man/get_rt_subpop_level.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plots.R +\name{get_rt_subpop_level} +\alias{get_rt_subpop_level} +\title{Plot of site-level Rt} +\usage{ +get_rt_subpop_level( + df, + figure_file_path, + from_full_df = FALSE, + write_files = TRUE +) +} +\arguments{ +\item{df}{dataframe of either model draws or filepath to load in model draws} + +\item{figure_file_path}{where to save the figure} + +\item{from_full_df}{if TRUE then df is draws object, if FALSE then df is a +dataframe of filepaths to load in the parameter object} + +\item{write_files}{if TRUE then write files to specified location, if FALSE +then don't} +} +\value{ +plot object of R(t)s in each site with state level median overlaid +} +\description{ +Plot of site-level Rt +} diff --git a/cfaforecastrenewalww/man/subsample_sites.Rd b/cfaforecastrenewalww/man/subsample_sites.Rd new file mode 100644 index 00000000..5e78777c --- /dev/null +++ b/cfaforecastrenewalww/man/subsample_sites.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/pre_processing.R +\name{subsample_sites} +\alias{subsample_sites} +\title{Subsample wastewater sites} +\usage{ +subsample_sites(ww_data, prop_sites = 0.2, sampled_sites = NULL) +} +\arguments{ +\item{ww_data}{Site-level wastewater data, extracted and trnsformed from +the raw NWSS data to contain only the relevant columns. This will be for all +time points} + +\item{prop_sites}{Proportion of all sites that we want to keep in the input +data. default is 0.2} + +\item{sampled_sites}{The list of sites that you want to keep, so that we +can compare the exact same subsample if desired. Default is NULL, then +random sampling is done according to the proportion} +} +\value{ +a data frame structured the same way as the ww_data but with only +prop_sites included. These sites are chosen randomly +} +\description{ +Subsample wastewater sites +} diff --git a/cfaforecastrenewalww/vignettes/toy_data_vignette.Rmd b/cfaforecastrenewalww/vignettes/toy_data_vignette.Rmd index 4dbb7c6d..8b9f2bb0 100644 --- a/cfaforecastrenewalww/vignettes/toy_data_vignette.Rmd +++ b/cfaforecastrenewalww/vignettes/toy_data_vignette.Rmd @@ -92,7 +92,7 @@ ggplot(example_df) + geom_point(aes(x = date, y = daily_hosp_admits)) + geom_vline(aes(xintercept = forecast_date), linetype = "dashed") + xlab("") + - ylab("Daily hospital admssions") + + ylab("Daily hospital admissions") + ggtitle("State level hospital admissions") + theme_bw() ``` @@ -212,7 +212,7 @@ exp_obs_hosp <- all_draws %>% select(pred_hosp, `.draw`, t) %>% rename(draw = `.draw`) -# Predicted observed wastewaster concentrations in each lab site +# Predicted observed wastewater concentrations in each lab site exp_obs_conc <- all_draws %>% spread_draws(pred_ww[lab_wwtp_unique_id, t]) %>% select(pred_ww, `.draw`, t, lab_wwtp_unique_id) %>% @@ -237,7 +237,7 @@ ggplot(output_df) + geom_point(aes(x = date, y = daily_hosp_admits)) + geom_vline(aes(xintercept = forecast_date), linetype = "dashed") + xlab("") + - ylab("Daily hospital admssions") + + ylab("Daily hospital admissions") + ggtitle("State level hospital admissions estimated with wastewater") + theme_bw() @@ -296,7 +296,7 @@ ggplot(output_df) +
# Model outputs: parameters -Get a dataframe of all of the key estimate model paramters combined with the key +Get a dataframe of all of the key estimate model parameters combined with the key "known" model parameters to get a sense of which parameters we can recover and which might be unidentifiable (just as a first pass, eventually we will probably want to do a full sensitivity analysis @@ -313,7 +313,7 @@ static_params <- c( "infection_feedback" ) vector_params <- c( - "w", "p_hosp_w", "rt", "new_i", "p_hosp", + "w", "p_hosp_w", "rt", "state_inf_per_capita", "p_hosp", "sigma_ww_site_raw", "ww_site_mod_raw", "ww_site_mod", "sigma_ww_site", "hosp_wday_effect" diff --git a/model_definition.md b/model_definition.md index c66d20e6..b840fe68 100644 --- a/model_definition.md +++ b/model_definition.md @@ -185,48 +185,59 @@ Future iterations of this model will evaluate the utility of mechanistic modelin ## Model 1: Site-level infection dynamics -In this model, we represent hospital admissions at the state-level, and viral genome concentrations at the site-level. We represent site-level infection dynamics using a hierarchical model: site-level infection dynamics are distributed about a central state-level infection dynamic. +In this model, we represent hospital admissions at the state-level, and viral genome concentrations at the site-level. +We divide the population into subpopulations, with each site representing a subpopulation of the state total, plus an additional subpopulation that represents the portion of the state population not covered by wastewater surveillance. +We represent subpopulation infection dynamics using a hierarchical model: subpopulation infection dynamics are distributed about a central state-level infection dynamic and the total infections in each subpopulation sum up to the total state infections. This model uses all of the components described above with following modifications. -### Site-level infections +### Subpopulation-level infections We couple the site- and state-level dynamics at the level of the un-damped instantaneous reproduction number $\mathcal{R}^\mathrm{u}(t)$. We assume that the populations represented by wastewater treatment sites have infection dynamics that are _similar_ to one another but can vary from the state-level mean. -We represent this with a hierarchical model where we first model a state-level un-damped effective reproductive number $\mathcal{R}^\mathrm{u}(t)$, but then allow individual sites $i$ to have individual site-level values of $\mathcal{R}^\mathrm{u}_{i}(t)$ +We represent this with a hierarchical model where we first model a state-level un-damped effective reproductive number $\mathcal{R}^\mathrm{u}(t)$, but then allow individual subpopulations $k$ to have individual subpopulation values of $\mathcal{R}^\mathrm{u}_{k}(t)$ -The state-level model for $\mathcal{R}^\mathrm{u}(t)$ is the same as the infection model described above, with $\mathcal{R}^\mathrm{u}(t)$ generating the state-level hospital admissions. -Site-level deviations from the state-level reproduction number are modeled via a log-scale AR(1) process. Specifically, for site $i$: +The state-level model for the undamped instantaneous reproductive number $\mathcal{R}^\mathrm{u}(t)$ follows the time-evolution described above. +Subpopulation deviations from the state-level reproduction number are modeled via a log-scale AR(1) process. Specifically, for subpopulation $k$: $$ -\log[\mathcal{R}^\mathrm{u}_{i}(t)] = \log[\mathcal{R}^\mathrm{u}(t)] + \delta_i(t) +\log[\mathcal{R}^\mathrm{u}_{k}(t)] = \log[\mathcal{R}^\mathrm{u}(t)] + \delta_k(t) $$ -where $\delta_i(t)$ is the time-varying site effect on $\mathcal{R}(t)$, modeled as, +where $\delta_k(t)$ is the time-varying subpopulation effect on $\mathcal{R}(t)$, modeled as, -$$\delta_i(t) = \varphi \delta_i(t-1) + \epsilon_{it}$$ +$$\delta_k(t) = \varphi \delta_k(t-1) + \epsilon_{kt}$$ -where $0 < \varphi < 1$ and $\epsilon_{it} \sim \mathrm{Normal}(0, \sigma_\delta)$. +where $0 < \varphi < 1$ and $\epsilon_{kt} \sim \mathrm{Normal}(0, \sigma_\delta)$. -The site-level $\mathcal{R}_{i}(t)$ is also subject to the infection feedback described above such that: +The subpopulation $\mathcal{R}_{i}(t)$ is subject to the infection feedback described above such that: ```math -\mathcal{R}_i(t) = \mathcal{R}^\mathrm{u}_i(t) \exp \left(-\gamma \sum_{\tau = 1}^{T_f} I_i(t-\tau) g(\tau) \right) +\mathcal{R}_k(t) = \mathcal{R}^\mathrm{u}_k(t) \exp \left(-\gamma \sum_{\tau = 1}^{T_f} I_k(t-\tau) g(\tau) \right) ``` -From $\mathcal{R}_{i}(t)$, we generate estimates of site-level _expected_ latent incident infections per capita $I_i(t)$ using the renewal process described in [the infection component](#infection-component). +From $\mathcal{R}_{k}(t)$, we generate estimates of site-level _expected_ latent incident infections per capita $I_k(t)$ using the renewal process described in [the infection component](#infection-component). -We infer the site level initial per capita incidence $I_i(0)$ hierarchically. Specifically, we treat $\mathrm{logit}[I_i(0)]$ as Normally distributed about the corresponding state-level value $\mathrm{logit}[I(0)]$, with an estimated standard deviation $\sigma_{i0}$: +To obtain the state-level _expected_ latent incident infections per capita $I(t)$, we assume that wastewater catchment area population sizess are non-overlapping subsets of the total state population, and represent the remaining state population not represented by wastewater surveillance as an additional subpopulation. +To obtain the total state infections, we divide the population into the $n_k$ subpopulations and we sum the subpopulation per capita infections weighted by the proportion of the state population they represent: + +```math +I(t) = \frac{1}{\sum n_k} \sum_{k=1}^{k=n_{k}} n_k I_k(t) +``` + +In the rare case where the sum of the site populations exceeds the state population, we do not add an additional subpopulation (so $n_{sites} = n_{k}$) and assume that the population sizes in each catchment area are representative of the population fraction in the state, assuming that the reported populations represented by each wastewater catchment area are non-overlapping. + +We infer the site level initial per capita incidence $I_k(0)$ hierarchically. Specifically, we treat $\mathrm{logit}[I_k(0)]$ as Normally distributed about the corresponding state-level value $\mathrm{logit}[I(0)]$, with an estimated standard deviation $\sigma_{i0}$: $$ -\mathrm{logit}[I_i(0)] \sim \mathrm{Normal}(\mathrm{logit}[I(0)], \sigma_{i0}) +\mathrm{logit}[I_k(0)] \sim \mathrm{Normal}(\mathrm{logit}[I(0)], \sigma_{k0}) $$ ### Viral genome concentration in wastewater -We model site-specific viral genome concentrations in wastewater $C_i(t)$ independently for each site $i$ using the same model as described in [the wastewater component](#wastewater-viral-concentration-component) +We model site-specific viral genome concentrations in wastewater $C_i(t)$ independently for each site $i$ using the same model as described in [the wastewater component](#wastewater-viral-concentration-component). The latent incident infections in subpopulation $k$ are mapped to the corresponding site $i$. Genome concentration measurements can vary between sites, and even within a site through time, because of differences in sample collection and lab processing methods. To account for this variability, we add a scaling term $M_{ij}$ and a variablity term $\sigma_{cij}$ that vary across sites $i$ and also within sites across labs $j$: diff --git a/src/write_config.R b/src/write_config.R index e9e8b21f..4eb0d31a 100644 --- a/src/write_config.R +++ b/src/write_config.R @@ -101,21 +101,24 @@ write_config <- function(run_id, # Assign the dates and locations for hospital admissions to be manually # removed - last_1 <- lubridate::ymd("2024-03-08") dates_for_hosp_removal <- c( - lubridate::ymd("2024-03-07"), # IA 2nd to last + seq( + from = lubridate::ymd("2024-03-13"), + to = lubridate::ymd("2024-03-14"), + by = "days" + ), # OR exclude two repeats seq( from = lubridate::ymd("2024-02-27"), to = lubridate::ymd("2024-02-29"), by = "days" - ), # NM 4th to last to second to last repeated data points - last_1 # SC + ), # NM exclude repeats, + lubridate::ymd("2023-03-14") # second to last MS data point ) states_for_hosp_removal <- c( - rep("IA", 1), + rep("OR", 2), rep("NM", 3), - rep("SC", 1) + "MS" ) From b969cb206dac79a742c27d55750459baa0c52f69 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Tue, 26 Mar 2024 13:27:51 +0000 Subject: [PATCH 3/3] update model definition --- model_definition.md | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/model_definition.md b/model_definition.md index b840fe68..d194de67 100644 --- a/model_definition.md +++ b/model_definition.md @@ -47,7 +47,7 @@ The models differ in the data they use as input, in whether or not they include [**Model 1**](#model-1) is wastewater-informed, site-level infection dynamics model. It uses genome concentrations at the site level and admissions at the state level as input and produces forecasts of admissions at the state level. We use Model 1 to generate forecasts for states with any wastewater data available. -However, if a state has not reported any genome concentration data in the past 21 days or if there are less than 5 data points per site in any site, we flag this in our metadata, as it is unlikely that the wastewater data is meaningfully informing the forecast in that location. +However, if a state has not reported any genome concentration data in the past 21 days or if there are fewer than 5 data points per site in any site, we flag this in our metadata, as it is unlikely that the wastewater data is meaningfully informing the forecast in that location. [**Model 2**](#model-2) is a no-wastewater, state-level infection dynamics model. It uses state-level admissions as input and produces forecasts of state-level admissions as output. @@ -65,8 +65,7 @@ Of the forecasts being submitted to the [COVID-19 Forecast Hub](https://github.c | Model 3 | Nationally aggregated | Nationally aggregated | National | National | -We provide a metadata table alongside the forecasts that indicate notes on the wastewater data for each state, indicating if it does not have any wastewater data from the past 90 days. -For states with minimal or delayed wastewater data, we will still fit Model 1, but the metadata will indicate that the wastewater data is likely insufficient to be inform the forecast. +Alongside each forecast, we publish a corresponding metadata table with state-by-state notes on wastewater data status and model used. If a state has no wastewater data during the fitting period (the past 90 days), we fit Model 2 and indicate this in the metadata. If a state has minimal wastewater data or no recent wastewater measurements, we still fit Model 1, but we indicate in the metadata that the wastewater data may be insufficient to inform the forecast. ### Model components @@ -185,17 +184,32 @@ Future iterations of this model will evaluate the utility of mechanistic modelin ## Model 1: Site-level infection dynamics -In this model, we represent hospital admissions at the state-level, and viral genome concentrations at the site-level. -We divide the population into subpopulations, with each site representing a subpopulation of the state total, plus an additional subpopulation that represents the portion of the state population not covered by wastewater surveillance. -We represent subpopulation infection dynamics using a hierarchical model: subpopulation infection dynamics are distributed about a central state-level infection dynamic and the total infections in each subpopulation sum up to the total state infections. +In this model, we represent hospital admissions at the state-level and viral genome concentrations at the site-level. We use the components described above but divide the state population into subpopulations representing sampled wastewater sites' catchment populations, with an additional subpopulation to represent individuals who do not contribute to sampled wastewater. -This model uses all of the components described above with following modifications. +We model infection dynamics in these subpopulations hierarchically: subpopulation infection dynamics are distributed about a central state-level infection dynamic, and total state infections are simply the sum of the subpopulation-level infections. -### Subpopulation-level infections +### Subpopulation definition +In Model 1, a state consists of $K_\mathrm{total}$ subpopulations $k$ with corresponding population sizes $n_k$. We associate one subpopulation to each of the $K_\mathrm{sites}$ wastewater sampling sites in the state and assign that subpopulation a population size $n_k$ equal to the wastewater catchment population size reported to NWSS for that site. -We couple the site- and state-level dynamics at the level of the un-damped instantaneous reproduction number $\mathcal{R}^\mathrm{u}(t)$. +Whenever the sum of the wastewater catchment population sizes $\sum\nolimits_{k=1}^{K_\mathrm{sites}} n_k$ is less than the total state population size $n$, we use an additional subpopulation of size $n - \sum\nolimits_{k=1}^{K_\mathrm{sites}} n_k$ to model individuals in the state who are not covered by wastewater sampling. -We assume that the populations represented by wastewater treatment sites have infection dynamics that are _similar_ to one another but can vary from the state-level mean. +The total number of subpopulations is then $K_\mathrm{total} = K_\mathrm{sites} + 1$: the $K_\mathrm{sites}$ subpopulations with sampled wastewater, and the final subpopulation to account for individuals not covered by wastewater sampling. + +This amounts to modeling the wastewater catchments populations as approximately non-overlapping; every infected individual either does not contribute to measured wastewater or contributes principally to one wastewater catchment. +This approximation is reasonable because we only use samples taken from primary wastewaster treatment plants, which avoids the possibility that an individual might be sampled once in a sample taken upstream and then sampled again in a more aggregated sample taken further downstream; see [data filtering](#appendix-wastewater-data-pre-processing) for further details. + +If the sum of the wastewater site catchment populations meets or exceeds the reported state population ($\sum\nolimits_{k=1}^{K_\mathrm{sites}} n_k \ge n$) we do not use a final subpopulation without sampled wastewater. In that case, the total number of subpopulations $K_\mathrm{total} = K_\mathrm{sites}$. In our data, this is true only for the District of Columbia. + +When converting from predicted per capita incident hospital admissions $H(t)$ to predicted hospitalization counts, we use the state population size $n$, even in the case of the District of Columbia where $\sum n_k > n$. + +This amounts to making two key additional modeling assumptions: +- Any individuals who contribute to wastewaster measurements but are not part of the state population are distributed among the catchment populations approximately proportional to catchment population size. +- Whenever $\sum n_k \ge n$, the fraction of individuals in the state not covered by wastewater is small enough to have minimal impact on the statewide per capita infection dynamics. + +### Subpopulation-level infection dynamics +We couple the subpopulation- and state-level infection dynamics at the level of the un-damped instantaneous reproduction number $\mathcal{R}^\mathrm{u}(t)$. + +We model the subpopulations as having infection dynamics that are _similar_ to one another but can differ from the overall state-level dynamic. We represent this with a hierarchical model where we first model a state-level un-damped effective reproductive number $\mathcal{R}^\mathrm{u}(t)$, but then allow individual subpopulations $k$ to have individual subpopulation values of $\mathcal{R}^\mathrm{u}_{k}(t)$ @@ -212,23 +226,20 @@ $$\delta_k(t) = \varphi \delta_k(t-1) + \epsilon_{kt}$$ where $0 < \varphi < 1$ and $\epsilon_{kt} \sim \mathrm{Normal}(0, \sigma_\delta)$. -The subpopulation $\mathcal{R}_{i}(t)$ is subject to the infection feedback described above such that: +The subpopulation $\mathcal{R}_{k}(t)$ is subject to the infection feedback described above such that: ```math \mathcal{R}_k(t) = \mathcal{R}^\mathrm{u}_k(t) \exp \left(-\gamma \sum_{\tau = 1}^{T_f} I_k(t-\tau) g(\tau) \right) ``` -From $\mathcal{R}_{k}(t)$, we generate estimates of site-level _expected_ latent incident infections per capita $I_k(t)$ using the renewal process described in [the infection component](#infection-component). +From $\mathcal{R}_{k}(t)$, we generate values of the supopulation-level _expected_ latent incident infections per capita $I_k(t)$ using the renewal process described in [the infection component](#infection-component). -To obtain the state-level _expected_ latent incident infections per capita $I(t)$, we assume that wastewater catchment area population sizess are non-overlapping subsets of the total state population, and represent the remaining state population not represented by wastewater surveillance as an additional subpopulation. -To obtain the total state infections, we divide the population into the $n_k$ subpopulations and we sum the subpopulation per capita infections weighted by the proportion of the state population they represent: +To obtain the number of statewide infections per capita $I(t)$, we sum the $K_\mathrm{total}$ subpopulation per capita infection counts $I_k(t)$ weighted by their population sizes: ```math -I(t) = \frac{1}{\sum n_k} \sum_{k=1}^{k=n_{k}} n_k I_k(t) +I(t) = \frac{1}{\sum\nolimits_{k=1}^{K_\mathrm{total}} n_k} \sum_{k=1}^{K_\mathrm{total}} n_k I_k(t) ``` -In the rare case where the sum of the site populations exceeds the state population, we do not add an additional subpopulation (so $n_{sites} = n_{k}$) and assume that the population sizes in each catchment area are representative of the population fraction in the state, assuming that the reported populations represented by each wastewater catchment area are non-overlapping. - We infer the site level initial per capita incidence $I_k(0)$ hierarchically. Specifically, we treat $\mathrm{logit}[I_k(0)]$ as Normally distributed about the corresponding state-level value $\mathrm{logit}[I(0)]$, with an estimated standard deviation $\sigma_{i0}$: $$