From d14c8b5f61d39ee16dd621da5c9184623c942bc4 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Thu, 17 Oct 2024 17:19:06 +0000 Subject: [PATCH 01/10] rename function and replace in loc where its called --- R/get_stan_data.R | 2 +- R/validate.R | 16 ++++++++-------- ...both_datasets.Rd => validate_data_jointly.Rd} | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) rename man/{validate_both_datasets.Rd => validate_data_jointly.Rd} (93%) diff --git a/R/get_stan_data.R b/R/get_stan_data.R index 797209e3..20dd5565 100644 --- a/R/get_stan_data.R +++ b/R/get_stan_data.R @@ -433,7 +433,7 @@ get_stan_data <- function(input_count_data, # Validate both datasets if both are used---------------------------------- if (include_ww == 1) { - validate_both_datasets( + validate_data_jointly( input_count_data = input_count_data, input_ww_data = input_ww_data, date_time_spine = date_time_spine, diff --git a/R/validate.R b/R/validate.R index b9b5633b..7962d52b 100644 --- a/R/validate.R +++ b/R/validate.R @@ -167,14 +167,14 @@ validate_count_data <- function(count_data, #' @param forecast_date IS08 formatted date indicating the forecast date #' #' @return NULL, invisibly -validate_both_datasets <- function(input_count_data, - input_ww_data, - date_time_spine, - lab_site_site_spine, - site_subpop_spine, - lab_site_subpop_spine, - calibration_time, - forecast_date) { +validate_data_jointly <- function(input_count_data, + input_ww_data, + date_time_spine, + lab_site_site_spine, + site_subpop_spine, + lab_site_subpop_spine, + calibration_time, + forecast_date) { # check that you have sufficient count data for the calibration time assert_sufficient_days_of_data( input_count_data$date, diff --git a/man/validate_both_datasets.Rd b/man/validate_data_jointly.Rd similarity index 93% rename from man/validate_both_datasets.Rd rename to man/validate_data_jointly.Rd index 8224586b..fe79a687 100644 --- a/man/validate_both_datasets.Rd +++ b/man/validate_data_jointly.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/validate.R -\name{validate_both_datasets} -\alias{validate_both_datasets} +\name{validate_data_jointly} +\alias{validate_data_jointly} \title{Validate that both count data and wastewater data are coherent and compatible with one another and the the user-specified parameters} \usage{ -validate_both_datasets( +validate_data_jointly( input_count_data, input_ww_data, date_time_spine, From 9a7ff271f36b90211a1ba62162cb9db26fe5ec07 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Thu, 17 Oct 2024 18:48:19 +0000 Subject: [PATCH 02/10] add function tof ormat subpop hosp data, generate ww data for eval --- R/generate_simulated_data.R | 108 ++++++++++++++++++++++++++++++++- R/model_component_fwd_sim.R | 46 ++++++++++++++ man/format_subpop_hosp_data.Rd | 31 ++++++++++ 3 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 man/format_subpop_hosp_data.Rd diff --git a/R/generate_simulated_data.R b/R/generate_simulated_data.R index c3582bd5..d0bf8269 100644 --- a/R/generate_simulated_data.R +++ b/R/generate_simulated_data.R @@ -328,6 +328,19 @@ generate_simulated_data <- function(r_in_weeks = # nolint uot + ot + ht )[(uot + 1):(uot + ot + ht)] + # Also compute per capita hosps for each subpopulation + model_hosp_subpop_over_n <- matrix( + nrow = n_subpops, + ncol = (ot + ht) + ) + for (i in 1:n_subpops) { + model_hosp_subpop_over_n[i, ] <- model$functions$convolve_dot_product( + p_hosp_days * new_i_over_n_site[i, ], + rev(inf_to_hosp), + uot + ot + ht + )[(uot + 1):(uot + ot + ht)] + } + ## Add weekday effect on hospital admissions------------------------------- pred_hosp <- pop_size * model$functions$day_of_week_effect( @@ -335,6 +348,21 @@ generate_simulated_data <- function(r_in_weeks = # nolint day_of_week_vector, hosp_wday_effect ) + + pred_hosp_subpop <- matrix( + nrow = n_subpops, + ncol = (ot + ht) + ) + for (i in 1:n_subpops) { + pred_hosp_subpop[i, ] <- pop_fraction[i] * pop_size * + model$functions$day_of_week_effect( + model_hosp_subpop_over_n[i, ], + day_of_week_vector, + hosp_wday_effect + ) + } + + ## Add observation error--------------------------------------------------- # This is negative binomial but could swap out for a different obs error pred_obs_hosp <- rnbinom( @@ -342,6 +370,17 @@ generate_simulated_data <- function(r_in_weeks = # nolint size = 1 / ((params$inv_sqrt_phi_prior_mean)^2) ) + pred_obs_hosp_subpop <- matrix( + nrow = n_subpops, + ncol = (ot + ht) + ) + for (i in 1:n_subpops) { + pred_obs_hosp_subpop[i, ] <- rnbinom( + n = length(pred_hosp_subpop[i, ]), mu = pred_hosp_subpop[i, ], + size = 1 / ((params$inv_sqrt_phi_prior_mean)^2) + ) + } + # Generate expected observed concentrations from infections in each site----- @@ -381,6 +420,18 @@ generate_simulated_data <- function(r_in_weeks = # nolint lab_site_reporting_latency = lab_site_reporting_latency ) + # Create evaluation data with same reporting freq but go through the entire + # time period + log_obs_conc_lab_site_eval <- downsample_ww_obs( + log_conc_lab_site = log_conc_lab_site, + n_lab_sites = n_lab_sites, + ot = ot + ht, + ht = 0, + nt = 0, + lab_site_reporting_freq = lab_site_reporting_freq, + lab_site_reporting_latency = rep(0, n_lab_sites) + ) + # Global adjusted R(t) -------------------------------------------------- @@ -406,6 +457,15 @@ generate_simulated_data <- function(r_in_weeks = # nolint lod_lab_site = lod_lab_site ) + ww_data_eval <- format_ww_data( + log_obs_conc_lab_site = log_obs_conc_lab_site_eval, + ot = ot + ht, + ht = 0, + date_df = date_df, + site_lab_map = site_lab_map, + lod_lab_site = lod_lab_site + ) + # Artificially add values below the LOD---------------------------------- # Replace it with an NA, will be used as an example of how to format data # properly. @@ -419,16 +479,27 @@ generate_simulated_data <- function(r_in_weeks = # nolint TRUE ~ .data$log_genome_copies_per_ml ) ) + ww_data_eval <- ww_data_eval |> + dplyr::mutate( + "log_genome_copies_per_ml" = + dplyr::case_when( + .data$log_genome_copies_per_ml == + !!min_ww_val ~ 0.5 * .data$log_lod, + TRUE ~ .data$log_genome_copies_per_ml + ) + ) # Make a hospital admissions dataframe for model calibration - hosp_data <- format_hosp_data(pred_obs_hosp, + hosp_data <- format_hosp_data( + pred_obs_hosp = pred_obs_hosp, dur_obs = ot, pop_size = pop_size, date_df = date_df ) - hosp_data_eval <- format_hosp_data(pred_obs_hosp, + hosp_data_eval <- format_hosp_data( + pred_obs_hosp = pred_obs_hosp, dur_obs = (ot + ht), pop_size = pop_size, date_df = date_df @@ -437,6 +508,36 @@ generate_simulated_data <- function(r_in_weeks = # nolint "daily_hosp_admits_for_eval" = "daily_hosp_admits" ) + # Make a subpopulation level hospital admissions data + # For now this will only be used for evaluation, eventually, can add + # feature to use this in calibration + subpop_map <- tibble::tibble( + subpop_index = as.character(1:n_subpops), + subpop_pop = pop_size * pop_fraction, + subpop_name = c(1:n_sites, NA) + ) |> + dplyr::mutate(subpop_name = ifelse(!is.na(subpop_name), + glue::glue("Site: {subpop_name}"), + "remainder of population" + )) + + subpop_hosp_data <- format_subpop_hosp_data( + pred_obs_hosp_subpop = pred_obs_hosp_subpop, + dur_obs = ot, + subpop_map = subpop_map, + date_df = date_df + ) + + subpop_hosp_data_eval <- format_subpop_hosp_data( + pred_obs_hosp_subpop = pred_obs_hosp_subpop, + dur_obs = (ot + ht), + subpop_map = subpop_map, + date_df = date_df + ) |> + dplyr::rename( + "daily_hosp_admits_for_eval" = "daily_hosp_admits" + ) + # Global R(t) true_rt <- tibble::tibble( unadj_rt_daily = as.numeric(unadj_r_daily), @@ -453,8 +554,11 @@ generate_simulated_data <- function(r_in_weeks = # nolint example_data <- list( ww_data = ww_data, + ww_data_eval = ww_data_eval, hosp_data = hosp_data, hosp_data_eval = hosp_data_eval, + subpop_hosp_data = subpop_hosp_data, + subpop_hosp_data_eval = subpop_hosp_data_eval, true_global_rt = true_rt ) diff --git a/R/model_component_fwd_sim.R b/R/model_component_fwd_sim.R index b5449646..956e574d 100644 --- a/R/model_component_fwd_sim.R +++ b/R/model_component_fwd_sim.R @@ -422,6 +422,52 @@ format_hosp_data <- function(pred_obs_hosp, return(hosp_data) } + +#' Format the subpopulation-level hospital admissions data into a tidy +#' dataframe +#' +#' @param pred_obs_hosp_subpop matrix of non-negative integers indicating the +#' number of hospital admissions on each day in each subpopulation. Rows are +#' subpopulations, columns are time points +#' @param dur_obs integer indicating the number of days we want the +#' observations for +#' @param subpop_map tibble mapping the numbered subpopulations to the +#' wastewater sites, must contain columns "subpop_index" and "subpop_name" +#' @param date_df tibble of columns `date` and `t` that map time in days to +#' dates +#' +#' @return a tidy dataframe containing counts of admissions by date alongside +#' population size for each subpopulation +format_subpop_hosp_data <- function(pred_obs_hosp_subpop, + dur_obs, + subpop_map, + date_df) { + subpop_hosp_data <- as.data.frame(t(pred_obs_hosp_subpop)) |> + dplyr::mutate(t = seq_len(ncol(pred_obs_hosp_subpop))) |> + dplyr::filter(t <= dur_obs) |> + tidyr::pivot_longer(!t, + names_to = "subpop_index", + names_prefix = "V", + values_to = "daily_hosp_admits" + ) |> + dplyr::left_join( + date_df, + by = "t" + ) |> + dplyr::left_join( + subpop_map, + by = "subpop_index" + ) |> + dplyr::select( + "date", + "subpop_name", + "daily_hosp_admits", + "subpop_pop" + ) + return(subpop_hosp_data) +} + + #' Back- calculate R(t) from incident infections and the generation interval #' #' @description diff --git a/man/format_subpop_hosp_data.Rd b/man/format_subpop_hosp_data.Rd new file mode 100644 index 00000000..ed97afba --- /dev/null +++ b/man/format_subpop_hosp_data.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/model_component_fwd_sim.R +\name{format_subpop_hosp_data} +\alias{format_subpop_hosp_data} +\title{Format the subpopulation-level hospital admissions data into a tidy +dataframe} +\usage{ +format_subpop_hosp_data(pred_obs_hosp_subpop, dur_obs, subpop_map, date_df) +} +\arguments{ +\item{pred_obs_hosp_subpop}{matrix of non-negative integers indicating the +number of hospital admissions on each day in each subpopulation. Rows are +subpopulations, columns are time points} + +\item{dur_obs}{integer indicating the number of days we want the +observations for} + +\item{subpop_map}{tibble mapping the numbered subpopulations to the +wastewater sites, must contain columns "subpop_index" and "subpop_name"} + +\item{date_df}{tibble of columns \code{date} and \code{t} that map time in days to +dates} +} +\value{ +a tidy dataframe containing counts of admissions by date alongside +population size for each subpopulation +} +\description{ +Format the subpopulation-level hospital admissions data into a tidy +dataframe +} From 96cbf4a95087e7f9bb8d3f6ce5318937c9346813 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Thu, 17 Oct 2024 18:49:04 +0000 Subject: [PATCH 03/10] modify vignette data, removing tinkering with site info --- data-raw/vignette_data.R | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/data-raw/vignette_data.R b/data-raw/vignette_data.R index 38c61081..8f4c2dbd 100644 --- a/data-raw/vignette_data.R +++ b/data-raw/vignette_data.R @@ -1,22 +1,19 @@ set.seed(1) simulated_data <- wwinference::generate_simulated_data() hosp_data_from_sim <- simulated_data$hosp_data -ww_data_from_sim <- simulated_data$ww_data -# Add some columns and reorder sites to ensure package works as expected -# even if sites are not in order -ww_data <- ww_data_from_sim |> - dplyr::mutate( - "location" = "example state", - "site" = .data$site + 1 - ) |> - dplyr::ungroup() |> - dplyr::arrange(desc(.data$site)) +ww_data <- simulated_data$ww_data +ww_data_eval <- simulated_data$ww_data_eval hosp_data <- hosp_data_from_sim |> dplyr::mutate("location" = "example state") hosp_data_eval <- simulated_data$hosp_data_eval +subpop_hosp_data <- simulated_data$subpop_hosp_data +subpop_hosp_data_eval <- simulated_data$subpop_hosp_data_eval true_global_rt <- simulated_data$true_global_rt usethis::use_data(hosp_data, overwrite = TRUE) usethis::use_data(hosp_data_eval, overwrite = TRUE) usethis::use_data(ww_data, overwrite = TRUE) +usethis::use_data(ww_data_eval, overwrite = TRUE) +usethis::use_data(subpop_hosp_data, overwrite = TRUE) +usethis::use_data(subpop_hosp_data_eval, overwrite = TRUE) usethis::use_data(true_global_rt, overwrite = TRUE) From ef5273981d4f1d1fb3492a8bb8df1d6baf09b1f5 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Thu, 17 Oct 2024 19:19:16 +0000 Subject: [PATCH 04/10] update package data to include new outputs and document --- R/data.R | 120 ++++++++++++++++++++++++++++++++- R/generate_simulated_data.R | 11 +-- data/hosp_data.rda | Bin 607 -> 606 bytes data/hosp_data_eval.rda | Bin 655 -> 661 bytes data/subpop_hosp_data.rda | Bin 0 -> 1133 bytes data/subpop_hosp_data_eval.rda | Bin 0 -> 1400 bytes data/true_global_rt.rda | Bin 2169 -> 2182 bytes data/ww_data.rda | Bin 1657 -> 1538 bytes data/ww_data_eval.rda | Bin 0 -> 1910 bytes man/hosp_data.Rd | 4 +- man/subpop_hosp_data.Rd | 49 ++++++++++++++ man/subpop_hosp_data_eval.Rd | 49 ++++++++++++++ man/ww_data_eval.Rd | 55 +++++++++++++++ 13 files changed, 280 insertions(+), 8 deletions(-) create mode 100644 data/subpop_hosp_data.rda create mode 100644 data/subpop_hosp_data_eval.rda create mode 100644 data/ww_data_eval.rda create mode 100644 man/subpop_hosp_data.Rd create mode 100644 man/subpop_hosp_data_eval.Rd create mode 100644 man/ww_data_eval.Rd diff --git a/R/data.R b/R/data.R index b196dcf6..3ab438d0 100644 --- a/R/data.R +++ b/R/data.R @@ -39,6 +39,47 @@ #' @source vignette_data.R "ww_data" +#' Example evaluation wastewater dataset. +#' +#' A dataset containing the simulated retrospective wastewater concentrations +#' (labeled here as `log_genome_copies_per_ml_eval`) by sample collection date +#' (`date`), the site where the sample was collected (`site`) and the lab +#' where the samples were processed (`lab`). Additional columns that are +#' required attributes needed for the model are the limit of detection for +#' that lab on each day (labeled here as `log_lod`) and the population size of +#' the wastewater catchment area represented by the wastewater concentrations +#' in each `site`. +#' +#' This data is generated via the default values in the +#' `generate_simulated_data()` function. They represent the bare minumum +#' required fields needed to pass to the model, and we recommend that users +#' try to format their own data to match this format. +#' +#' The variables are as follows: +#' +#' @format ## ww_data_eval +#' A tibble with 126 rows and 6 columns +#' \describe{ +#' \item{date}{Sample collection date, formatted in ISO8601 standards as +#' YYYY-MM-DD} +#' \item{site}{The wastewater treatment plant where the sample was collected} +#' \item{lab}{The lab where the sample was processed} +#' \item{log_genome_copies_per_ml_eval}{The natural log of the wastewater +#' concentration measured on the date specified, collected in the site +#' specified, and processed in the lab specified. The package expects +#' this quantity in units of log estimated genome copies per mL.} +#' \item{log_lod}{The log of the limit of detection in the site and lab on a +#' particular day of the quantification device (e.g. PCR). This should be in +#' units of log estimated genome copies per mL.} +#' \item{site_pop}{The population size of the wastewater catchment area +#' represented by the site variable} +#' \item{location}{ A string indicating the location that all of the +#' data is coming from. This is not a necessary column, but instead is +#' included to more realistically mirror a typical workflow} +#' } +#' @source vignette_data.R +"ww_data_eval" + @@ -57,9 +98,9 @@ #' to match this format. #' #' This data is generated via the default values in the -#' `generate_simulated_data()` function. They represent the bare minumum +#' `generate_simulated_data()` function. They represent the bare minimumum #' required fields needed to pass to the model, and we recommend that users -#' try to format their own data to match this formate. +#' try to format their own data to match this format. #' #' The variables are as follows: #' \describe{ @@ -132,6 +173,81 @@ #' @source vignette_data.R "hosp_data_eval" + + + +#' Example subpopulation level hospital admissions dataset +#' +#' A dataset containing the simulated daily hospital admissions +#' (labeled here as `daily_hosp_admits`) by date of admission (`date`) in +#' each subpopulation. +#' Additional columns that are required are the population size of the +#' population contributing to the hospital admissions. It is assumed that +#' the wastewater sites are subsets of this larger population, which +#' is in the package data assumed to be from a hypothetical US state. +#' The data generated are daily hospital admissions but they could be any other +#' epidemiological count dataset e.g. cases. This data should only contain +#' hospital admissions that would have been available as of the date that +#' the forecast was made. We recommend that users try to format their data +#' to match this format. +#' +#' This data is generated via the default values in the +#' `generate_simulated_data()` function. They represent the bare minimumum +#' required fields needed to pass to the model, and we recommend that users +#' try to format their own data to match this format. +#' +#' The variables are as follows: +#' \describe{ +#' \item{date}{Date the hospital admissions occurred, formatted in ISO8601 +#' standards as YYYY-MM-DD} +#' \item{subpop_name}{A string indicating the subpopulation the hospital +#' admissiosn corresponds to. This is either a wastewater site, or the +#' remainder of the population} +#' \item{daily_hosp_admits}{The number of individuals admitted to the +#' hospital on that date, available as of the forecast date} +#' \item{subpop_pop}{The number of people contributing to the daily hospital +#' admissions in each subpopulation} +#' } +#' @source vignette_data.R +"subpop_hosp_data" + + +#' Example subpopulation level retrospective hospital admissions dataset +#' +#' A dataset containing the simulated daily hospital admissions +#' (labeled here as `daily_hosp_admits`) by date of admission (`date`) in +#' each subpopulation observed retrospectively. +#' Additional columns that are required are the population size of the +#' population contributing to the hospital admissions. It is assumed that +#' the wastewater sites are subsets of this larger population, which +#' is in the package data assumed to be from a hypothetical US state. +#' The data generated are daily hospital admissions but they could be any other +#' epidemiological count dataset e.g. cases. This data should only contain +#' hospital admissions that would have been available as of the date that +#' the forecast was made. We recommend that users try to format their data +#' to match this format. +#' +#' This data is generated via the default values in the +#' `generate_simulated_data()` function. They represent the bare minimumum +#' required fields needed to pass to the model, and we recommend that users +#' try to format their own data to match this format. +#' +#' The variables are as follows: +#' \describe{ +#' \item{date}{Date the hospital admissions occurred, formatted in ISO8601 +#' standards as YYYY-MM-DD} +#' \item{subpop_name}{A string indicating the subpopulation the hospital +#' admissions corresponds to. This is either a wastewater site, or the +#' remainder of the population} +#' \item{daily_hosp_admits_for_eval}{The number of individuals admitted to the +#' hospital on that date, available as of the forecast date} +#' \item{subpop_pop}{The number of people contributing to the daily hospital +#' admissions in each subpopulation} +#' } +#' @source vignette_data.R +"subpop_hosp_data_eval" + + #' COVID-19 post-Omicron generation interval probability mass function #' #' \describe{ diff --git a/R/generate_simulated_data.R b/R/generate_simulated_data.R index d0bf8269..7814db73 100644 --- a/R/generate_simulated_data.R +++ b/R/generate_simulated_data.R @@ -464,7 +464,10 @@ generate_simulated_data <- function(r_in_weeks = # nolint date_df = date_df, site_lab_map = site_lab_map, lod_lab_site = lod_lab_site - ) + ) |> + dplyr::rename( + "log_genome_copies_per_ml_eval" = "log_genome_copies_per_ml" + ) # Artificially add values below the LOD---------------------------------- # Replace it with an NA, will be used as an example of how to format data @@ -481,11 +484,11 @@ generate_simulated_data <- function(r_in_weeks = # nolint ) ww_data_eval <- ww_data_eval |> dplyr::mutate( - "log_genome_copies_per_ml" = + "log_genome_copies_per_ml_eval" = dplyr::case_when( - .data$log_genome_copies_per_ml == + .data$log_genome_copies_per_ml_eval == !!min_ww_val ~ 0.5 * .data$log_lod, - TRUE ~ .data$log_genome_copies_per_ml + TRUE ~ .data$log_genome_copies_per_ml_eval ) ) diff --git a/data/hosp_data.rda b/data/hosp_data.rda index 7595c3bb63da37ec0c78e995b9ea137bb3e08967..8818ebf607b7846bf51d913e1dde7f57527f3e6a 100644 GIT binary patch literal 606 zcmZ>Y%CIzaj8qGbT<@~~3Ipqb`s@FTGZ@_e13~zvsZO;%qvtATxm&BB+=|3ejwGA=OwU$x+WC{IJi1zRVT|5rmAq!=<7#M(v zLHpLKs%5hbe3=>498M%Kuw0xV$#CT41Xq>b70V}1)?C)?!0=UWf#g>AmCIMYv~`fm zsOpuQ9dhBvFQ8s9SgXTW?Rwu- z+0z1vZ-Z}l?e)|-7<9zou-MnRf6`sOq{?2L$iKJ0UF}NFnZs{S&$i2!e0+F!k0`(Y z1eK;It!}G@R_jV%5mVqbP@45LCNM#it3rOGO<1USlF{*VQpsOWD+YKaFj#z!YWn}l z^{=@=aF=eok=Ts|2NtNP?$p@gD!^sb;`->QO33C#K8w_pW*zVeYz~>a=uYEAMjnO_ za?FPhRL^5ReE4wdu{0p?IV)`*uWwto?w;&}`>Xr9%>8aXYJKm(vQSBagCmKfp^ZVJ zkwJ}f?Tct977hUghejqODqHHIVW;6?VVScNWSBG=>>|Y03eBiEFSe(&W7%eZwOw6D zg6=jaC24B>cZ`kSJ;Us2$m>>-T}l&`9lBzV+ert{*Q_pZwbY(n#1hPUM||bh$elLN zPIToKJa`$|W2~Pg=#>(*Xx`fpuB9(;3wrd+aFty1PIMswll)Q^3aNc;`ZvLQv&{r7r9ylOaP@P04z)bX8-^I literal 607 zcmV-l0-*guT4*^jL0KkKS%deh4FCna|JVO>XaGn5|NDRc{qX;1+~7a}0RTV%2mlBG z00F=Pa^SebA*rP`Jf?utLqUq$N(A`ngGZKh9QUmGzg-hwM|bH^q!#5Gy_58fIT%DdNn;w z00x>KkT%sb{=WbK00000002582u3iO2tp}|N-~sWLJ3}8-(TQl(WRA_Pct_=KSM`L zPg7S~h5UFr^Y0{U>KPNZBbN22%e5S$NVuen3Qh%9OwoSUQ+k`Zv-YwA!Gi`27%*VLg9Z#B;V3C6?(9hC5l98^LOAxOfwE%LhOrdVX#MHNRw9<{ zm#89>AJ{9$!E*;LaniU^OQIY%CIzaj8qGb3|GrkV_;odfBe6(M*#bOAc+6t@IU?Tf(Hx^3>-knz<7XZ@)D^> z?>ID9)vcVsz~;d0*8XqRj9H8eU)dU0t(3}OYkVc>U$tUhS5@Y+$+kX|9T*rFyEU9# zz`)jPQq^R$YNmq;TLS}|v*N-9M=}_A8JIaHP4+Y~;c>X^V9U_U#i4-X5L(#{%_L`u_(CDb#&n{P;zKw(&2FEWMbi1({TcbPW1G2oH|`3(4r`#(lX)g zbUW+9FSn*`nRNU8;cmM((ccsKL+_YHHmh6Y%(f!bq`|Qwl`Y%CIzaj8qGbG{4@whkcHn7T?7*YIxPU>@B*~zG!DXsi@K=ruwuX}nC;PG~U*gH&Two;8 z)9_a_>+1&wtblJzvcxfMi5|yAS{p;VIGQdr$#j{lys~<7wAS8k%gUKMZ~l_93fuD4 zG&?){_QtfHTSZwHW^K4W-K%){nJHT|{gvN1G%YcbJ-Aiz!pHa9!rq?ki8A_Ix;Zv` z2JfxS>Dl?!vzK-C?ftMY6xGT)DZ|G3bJ^0!xDji~8-~UNMb23swlR zC^#{=ajXk*1;L_4TDuSKoH={r8q=_Bser4Sxs9E#i|$x-=IhJqy~gu*%)I<-^O{L4 z5=k>Ax;9Pa6jNbwP;zMG=m=<3ahb7UVq57!ub?SQHBpEq$6MAIp3dE|@m5EtlGfgR zUhcA?37s!GUe{>-e17p?*6o$8p}Cg!5#G9<`YK!d&Pi`x;;=ckGca()uiJ6uZXx?- z7@GF)?{{A;yO@<=qIAW`}M(l1^_{uAeR6D diff --git a/data/subpop_hosp_data.rda b/data/subpop_hosp_data.rda new file mode 100644 index 0000000000000000000000000000000000000000..39d31dc96039928651e00e6efab5590c97385556 GIT binary patch literal 1133 zcmZ>Y%CIzaj8qGbWKO)jgF)K7{`mjjHFv`QgTN1m{pI%-I5-3_a4;}9I5=Kl-S=va z@!^I`5?LYN1XdX^FfcIwS^y-$KxyUA$&Rdyuk1s<2$-<7H7;DZeB}bL%w#W*Wi1CX zeAH$zFd8NJnk0Zk-2}BVJ)cdfGHPo8@-F+zEo*l89||;af>c$bS7%72;#OWMUV~nv z`ju`orPv%7T&VJyeWihceM+vc)#P8ZKN}+h!$dTYh6Ykw(Lm4ak3LdKvy##+Kc~;N z+uUVhMl4Rco$l-=I_WG23)2;sp9elNY)@=jlBpo2 zYUg_DSo@kY-e+C6s1)dQ+$d$-lRi}HO} z>sRyhUH{vjWu6OKWjIToOm{pjne?g2iFcP`(u#F+7{j;bcJQa~_L-vFuxO${i&)m* zw8&|f4Hddv1LY_BN-=5OeUKv#Mra41*RV6_fsxA5tA&)R0F$+|4_oE9{DmayxhV3jkc zf>lm4B{n4;G)S0XaVS`G#Ca z)?L{4DD9XZtHvp}6Q?ts1a{9_ds4KMSSZlYmE***RHJFmmSvrOzjn*oth#&njnIro zfB%MWJv@8Yzw-Z=G?z}?pINfORbT3z|2!Ux4;)L4;t#7Zitd>5XsJnZtLCNKxtC^V z`Y~#5zvopJH228zO3k|kA1}>)w=1~IFiFtoO?37l%@s-$T+N+UPC38-p>kR25wDCX zcf86hgl3yON}jmoaoI1Mv$AqLdkS0?x_tO9xavI&)tc(HG-zeWs!**tEI^BIyks+IJ7_zZ-+o5cjTID*`~A3rfmi@=B2A|E9+|h a({U(x$KS%!=juO}s|2@lGMLHkZU6uz+Vvs; literal 0 HcmV?d00001 diff --git a/data/subpop_hosp_data_eval.rda b/data/subpop_hosp_data_eval.rda new file mode 100644 index 0000000000000000000000000000000000000000..f4c5a2123d2c70acd364e625df46de4cfdf25d39 GIT binary patch literal 1400 zcmZ>Y%CIzaj8qGboRw(&j6qGT{`mjjad*Q1gTN1m{pI&pI5{{la4;}9I5O;8hn z)YiMq*@a#%n@(G1_RZuh)LZ5i=ddrgK?X}(T}gr>R5beWJV$6b6+FOQ#809_6wjP*qX-7s*||iz=s2X| zKYd@$+1U6FyZ9dw3*sN!SSrZ;~>Ev%e;Q7 zUho8I@36)#Tc>Q+Or5fE%BD@z!c!TyY*$odRB-Tc@Ng|}-j(1H+d6R~bCOWASdF)h z*C7vu4U=M)D7~A@;UVUB!b2#aRpI3_k$p3QBMp`C9y8++VqusgJW(L|@pBih6DoY1 z7AkK-)C6)EH+VApi1MybTk6i_^1?GcQxd zbtaU&O!Ru1d{}5xw;}hrq#Z|C&NKuED~E?P#R|<6O;rfwQ#?35q(#Sbtypos(}mko zlHF`N5*v~Zl0YddSnBP%V7YTaS>w5#4M(;#d8h!9QpFYx?bZAST5CeT+AKT$by>;c zA6wqsV_=Y(u)=E6q$wT;7+5$St)9B7>Iy@Ce)Xv{r$yByvv zu&PO@J78ZRXJA!hIZwZiz5i3=`PjJ))%VWpFX2DK#`s(`{N=}c@e@C;skH4^;B%;S zNUz?(|M2X+^X7}*zWY+AuYK{|?fni3l23L&C}+F(EFn~Ds@Kw>l_9G_wPtdHNH`b5 z*f;BC$Ofim@$DY{krzW8cFZ;E{j>g)=hJh*!Z5*&1&m_3TMs=f*b$>Aj?U1ZvFGc9 g_4Wt%d}6&Q*ib$H=!3ieAHDNf&Lt%5qgHbO03U>0s{jB1 literal 0 HcmV?d00001 diff --git a/data/true_global_rt.rda b/data/true_global_rt.rda index 399520388d6873a1278e61be94909519651c969b..c1a6d882047826236a0403955ff3e97b28ea2134 100644 GIT binary patch literal 2182 zcmah@c{J1u8~%+M%P_+rOp7&ks6>{KYD6;Du}=)fzJ^Mu zkgUtf*008I* z-~!=z>b?@70f06caUiG29E}DmLz5|LJlsJHrXAn`@@%Rs4i9@=f&t@Yf19arp#OIV zEx`dX8=&eyBJ`y|xG`HG!8VsI3k za5(1RK@4b#x*snKcrFQ+tPSt4;(mL7KSV`S2iPGrs!&j`x|vGS|0!Iy^%d0*PA4es zsowRyuLsRZ<(|Z!&j-Jw)Z;JeN0;v(d=ASeDA53oc(S7a%Rd~=$V)_~!M*0@Ad&C3 zG=(!}6C`!^T0Kcg$&p^;wha|EZ|IMYXFYS{R7DW}6U_jqjX*k4x4f<6927aAZF}>J zvJX;DT2#-_1giXq)Rw|3C}Unjj|Shdlf=ease9d$iS@;Pn_Zst*1IdeB6FCo^J6y{ zCZw$XP|t^rba!!6kpSGGFucJzLHd~oj>c@b4UNsGAS5yic}NgO2=(LwbpOAeBV#sY z7X4!`r5T)f6c%gx5Z1#pm*eBS<1zD-fxhOr{yu|(YAE-IqEiZLx1?ZP;-AAlO>+T5 zF6}-q`12m1a-dwd!9x2ZCqd98ZD!c|Wm~^1PqRS8!u3Liufi(_`k3w-Eqz@#{KZgd zVjSOK-8$f}cT9n?S-TmEFh}sGy+jMWwurw+b^tHbrO>W7Go5+st>_J-kWk`HLEvVl zQeqI9J)NDjD#tHQ?uHresOChjU9N{rCmm;HlJuhU&{<31wDT=-H!$SgKh?~=?%%lc zu7l7)IK{Yp>1#u!5o6(Lwa9Id>!VgLa4&P#{?J9nY?_e3i{a&r(T5w#XKtuTy)HMY zmpYcRp2tr{9B?vxBMFI+WXsp0E``_XZW+g*(JjkO<-|{wCVq%ewWDCC?jQSIN0t-No+n7h#!xow%Y(2mS$VRHsy$i$fhW}cClXU3^EjE%inqO0NpUG zbmBG^5)8?R(5li8t>F~oab>7RU@24nDpL7FnSQpv<;VayH#C8U(0S%#2+b_|@dvM8 z?kmvjqiwWUTzG*M;>SUYcD2nVk6pH7Mh&A_5}tL5+e6l78kxj^yYrV_^ZL?LYAudM z^gLau_^Ir7%Y~i~@T#?^UZVmTlKEcXEy4|}9l*ox*II+9^Q2Q9pXkw0v5V$H36i|m zlPrqx$}MsHO^**$a zpu90Dk5!tZ>=PA7O9iRbzsi(kcgij?{ThY?qkWFtljgt>0FrvPL%U4MaC<^#4m++N zo6dpJO}E^s|a$qN~9<_xZkE7sQ#KG;<*l z--``OHznecoUaq(G`T4oE%{jphw%gg>E@=KS^#xjwztR%R#$cCo~}R;GWY;$3mwuf z@hR`Uk}i@7ZHSy^{m|O|=x71E@LkE2d$4tCh1aMTAd%HCPIC&=?#in8jG<}+Hj6p* RKX;GMM*HL{FdfP2{{pa};P?Ol literal 2169 zcmaKnc{tRI8pnUL7<*x?W7n8LcHnr?NXXNx z3~{p*j4_#SjKRR@1Xs-11JVqc9K{F5*t70VoC@{kmRZ|5vXOCGE0f8|Zoz~xBz}^j zhQo+tB0wij8yQp54OQ3bDI7!v?--h0fkNejFhdey1oUpp7!3u$!C@!{#xMh5h#LZM zwW+zP3a6YxZ-*8N2UV$vs>1M$#GzCihBwBc@epKy2P&~8&=3j$nFnehFcctoHY~#x zMk8YoWJ=L3X-?_yG@dvB%g2G(00IGsBLD;j-~j-P1{`v@1R%CJ2#zccC?JuQD(vk_ z7@fw4WgNbsaPZeSGyui`5U`9nqeg&?Fh0D&02B@bgMbidkQg$E&6{b;d*4{>g#7<1 z`4cL(o7VmL{Hymn3rDB6Bn*iGCK;Jo6!D{RIsfW4?*jm1pVUseG@uf^z*_$>bumr5 z$tYaxlE$;9$HJpKS_5Of7zE7FhFkdEUr6@fDBa43!)7*j=-D~JA)&Cp%lrrE(4h%1 zg={1}0LW4MyvC8)sMFDBH0Q{a7}Ub^my1jDU$9vIxVd?s#dqb}H!30h1_^}&&6`W- z_Cb>{kt0&F2-SW`nc}?B^7IpL00}#1p}V;tx^un_UJbVD7*W?%Wab>%R&5T#*??(6 zG&MEQx(yEM<&jmC%>_Ug`~@@=#;7-UEz`y|AsFn+t`7}N8_pqLz3(Q_dfdFbWWN0* z&7bKAk781Wk~~lX2q$>8k+r&8icq6=9^O%Hqo8Ri~ z>(+$PMTL%c*4*j-a@Mj}t0)@dys4mF-IXLZHnQvxI>Ey$kuHCHm=91nI^l^a-hnyL ze5Hi#SK-SBxs&&3H3Hc|c|Y&T3s$&@MxA>)Q052(S=dY}B*4}eei2ocwO<<|Qj)Ap zKFfoXhAX&HqHBJmneS5I-LdL<1-5IkIP*>ujZMX9NC;O;E43jcVTl&2g6Ex5*6@K} zX>YE8jy#&nU+7-yHvU%Z4gRpkP`_0cT|azERPn;cp7jUS*S#kzgzrMR!IvVcGk*a~ zy3PCVi}KXGv+|L+^a0ll->xxy%4;t`HpQiWWMiInBL!_MaZ29(T$pT+4qg#;Z$(Td zCa^?see%v})|C4V)n0c)18i->R}p!6_e^Ca__X6j#lC4J5d^Ve&1r|5eby5B^4cL~ znbq}G!mg$Lt&!DP*@>U}$4+ge#x=@4b7|mD)$gxQ$R)-Zu0IT6+AcX+hnrx_hS>UF zeGQ;TL_BY|=+`OS^Z(8#-8vBv=*%xRfXZA*fC}b_jki(Nth+;ezT&C0bB#sDhB1(5>P+S1$=^sp}sp8tUv^>`kVL1 zIS>VFJ>HWP^lPM|wK6;VP#vwI2u|P-d`B}i)zq>%fbY#6A-@+6d3~kJprknwbO-AF z6KUx{j`b)z@km^~)Gki%h(9Fv8CuUTBt>y#km+)bKcj=QM}FP&_9_l5Y;^Boe|2c~ z0L%BPisc;pYxb0#+7y`6l(OZwD|*F7ag-iS z^q#cB$(uf&Pw+mp+-Ch8nYPL?_G05}>csVbE<);A7OY5F@z3%UIEZMMr{q|t%kol% zN(n<^^)?OQ`SGiB+FgD}oy_%SHuln38qd_+CcOsVDa?R9VZpMQ*&am|=T1I)(%UiE zV0JQSOU@cAaI^i!@tbA^^#;D+G27`-`YWtbGIzYP6+Ts5-JwJ9{K(QRU`phP>qIQ_anA=mgj`1Lp z*_j^`51wZSUv=@L*Y5_+y3;PQV3Lc&_84_5SM$BjP2{BqvA-5trEiu4YnG3G{fCpp zk$%6MmVPKUbS?4tcwEg;FX&-gbi4q5e058zyVqaCUogTJ$pX)6Ab_|vN10NAgz9k~ za`!b!8gM<3`}U)gL6Q0`wW#3Z{?q9LoLws=a^}9tZ|t(h+0hr_gg_|nysNgdJ~*1~ zWS_nQvDBj`1;#6{An$laR}p4RedF^6bWOICc_QDKK7f`Rgz`j&tRjK{pWsdO$Lh8Z%#m463QcXuwtTZD9@C;S&4#?IE^3WL)yCwA3jOc;QGZUPqzra z#4sQUoe|ra#V*r14qQcK)u;#sSBT z?0Y>JRgLem9OTJX&oxfV+oJ>nR{92ee$fKEbjT&a5*Cmmn zlxK>xhi1wvN=$Z)E76M^4J zeCh{_#A1<9BwkwD5SPCGA{Lz#NQMAlx8!>-S2`7oDb%aQGYw$+}uu(rOP}yev37PMc0GMa@-x~1az)$zP*z9Zu+W=h5b;Y_YYQ zTO7ZwD6YnsnJ?IQD`mk-Pr;u#?y@C)MN4A5^%3Gy7y|a*6KZW1Tae@3b|gSNI<`Xu`;E}xN>Tc>$YK3 z%&yQx%&d+^cI^Hf{P4boaCbI&N0Y^1ehZE4XQV_hlD2Den)ZwXhH4=rm!AfJf{&a| z>z=r6riH#a)`BBUP+lNAPrG!DUqK~=y{mJ~Fl_M3C>aSFImC19Z)y)MWim%0k0(Zr z@7%0Ov+^3AE!T36N4EBQGCBjgo?WjGl$U>yd^J2aMq_I0;*<26NtgQ0Lr33m7?8Y< z{-|{Y&1Cgct`GL2T6(@{tFoQeE(09K)~R-WDE3X6yvqxyHy)uikWhJ*mVDR!oI0`# ztwzj@ypif~=~ekucc5nx{oyAnTMP`2PGzIU*b|D?Zhw}xC!N+a635u0UU$4r^xWR3 z*5fYpscIp#L3;ap|8|3AlS%$hm-z_2_1p{&f2&KHw>`krgu*zw;YE`(wCE$Y79H>zr7(Ph#8z%%-nB?8!sQ% zmP`ITsFcuCxH^Wly!@%OD?EU%+&UlJUEjiW7Pw6Ua`Gxf&D+(tOLZE(*Y*#GXd!n8 ziPB>m(C|Vf5xXX6^a+)07j_xq+Gi!-4E}j0h&F>s8^+i0hT15VFlFp zK{0yeu%xd&!YIW~c3Dz4W9R$6D(xkmNquzop8KE$^08wjby;?{Xs9MYRI9ZIVE$Xm zCe=}<%l6XDb-t$8nLtO?J+_s3A0)b>m6ylOMIVu@adRq7h7#n=9w3+P57&M;DAsJql8a>bgL+7Zm{Vyj;x#W!bA-Q(D|H18C8(4T@2 zsOH-2%wL^*8)gtE`q~m?aK4ACCNUR5voL0c+PMdCES~Ghh8x+Abwm?u`;dZ(`H*KwOQH)tqs}n_uOZr zSXoJU8y{PKzNIK)u_FzDX4I!RKb6gw*sb3PwTBbFZGJUbdAp4|gNJ6awA{S=v;B^o z*NBD1gw{hi-Ws0OFtl{yzC+e4(HLo9cg^%l9jTG?*B+i!epU?3#^brJlkbdjuH+S= mpNmh_z`W6iQ*OUps#Cl&Ly26w;~|&!+Y`kJJpLFc_07LaiKuS? literal 1657 zcmV-<28Q`UT4*^jL0KkKSzZ)W;{XW_fB*mg|NsC0|NsC0|NsC0|NH;1|GxeIzyJUL z{_4B`|NYPe+2C|$&T`u6#;Qa~N#xB)+D$g2BhwVq(qtZ{)X)z^4F{-tLFzq5Ky6Hq zNr(U%dNl!{9-z}2LFqKn`k>Hynd+Gzr96q`jDe@7lhpD?CV}FE(maq#N-62006kAg z1JpG1ntGW4+6_VKXk^gZntFi32AVxXKpFv{0009)pn8A?K+pgH4Lv|KGy$eVOqvWz zQ~(c9&@?un4IZOF(0Yc{007VcX`lcA0MkZ;AO?T{F#|vu05Sof00006fDixx0iXte z0000D0000oXbgY=0MGyc00000000000004#Kq8V6Ae$8SsBI>L)Y0kUpm{(Cr~?qw zKn(x}gG_+*o})uR$N&RFO#^Bg13&-(4F{+IWXNa_Q$RgPo>CSdk|-d>1d2?_nSw=- zW+9U^CLtunGG;-UFlZWqc=8IU6;`na2KKjIYV;w*f&ea`{vd)P5Djhx2vn-BrhpWn z)d50#P>>4iFbD=Jc_0O`t4c`(Rh~n63Iq6m-jw(eMSv(%t~{AxQiT8u7_F3&fKrRj z>Od&(FoLz<6dE~ctR|6C@>zSiO+bL%-QdE;6}b>t1O^~)pao=*CmGpV_-pO zo9AB2teXs2S4;k1 zvx*ul^xFl*xp?uoiYCjbV`LW)j^Lm$bMT+M0j@^+t+a;^0GLQu*8zuBg8r1Em1&>;s+v#m$-MFc7|d}ozK|De&pN+{DFp!Vj@tSBh*91H)s?` zURj5c9ttr}V%#rd7+Vn0QmS~Odlb2Dzg)0uJOV5UH6oOrhx$YU1&eu1tY;<(q=cR^ zLnpIuof&Pw+ZmEGM_-!b^Cx4A$>FTB3K0UOc>sqoQb026g}}xLOT<*5S||XUp;V=N zYf9?FN2S7W`CII#qd4gOB&-poxgsN6R{j%OGo+ws*7H$TW^1I*<>kZPr)t_|{gTV3 zkm(AeGlH*xpmm92Rjk28Mm?<`<mN_IAnH!l6tX{p~X<_n$0j)zTE9pcny2zyk~< zf4$@BUPn&s-L$g_#rBm|i5o|zbL=!%^TK+I zCJpyWJUt#SH;MX;9t%Q!Y6CaAQl%&m9oG?{n8&T}$C2*lm2KKtH+8ADjSxUCi2xR7 z`DX_kAV>h}rf<^px82Cwd+?u4A6aD`T2()_Z~$*mHWd?3uUcqv9~EfM*0E3$%!JGJ7ORr=!atwC51zg6YAt23$p8RS4nP1~2sm%l3Ds2e-F^gE?MaZ;$^nKyYp z3j4Eid;Y0mr$|R}B!$^W-yEqsU3tUN+rE^G#j%)jh!$53mq$qQ*fRe3=(7`CKE~MD zJK|fkz#|H~r;_sU)9n8UfC{DY_o-m44HlPU0V2Ot&M%B008u7#WV&4HhR27~7>Bv- z-l9YyKH+!EPkLQ5pnPuI0OBf>HUXMo0#UtSw|2#~&-0`}+`iY>>D}4vAQ65S_<5<1 zm;`+*3tmoVI{X4q;TtlgcX&WLaTYhoIm7}cXTVsMA*+gxtVFmBf5qI9P81{;g%vo! DlbG>! diff --git a/data/ww_data_eval.rda b/data/ww_data_eval.rda new file mode 100644 index 0000000000000000000000000000000000000000..efd0c7475cee140a4b22667e24aa16d86e99a56a GIT binary patch literal 1910 zcmV-+2Z{JXT4*^jL0KkKSs(2SfH5olj z69EjGX@MS7(HKKajXfq!FafC0GeAJ}CK)E4o{)?~AZhAtOpT}>pwk4z^q4~$h7dhN zO*WHFF)|rb^o>l>rkWEPG%{#tM$iGE1k)za0GeW9FaQED00cC^&?W&Gj1lODjF<@1 z1YpDofKNokX@CKzsZ|(ngs9 z>KY!P14ASAL4-e4@gVgydQVV#hM0$_G-5Fdo52T8IOC)`0C!G1h;bpEJFxEV&Yc5* z={j@?IO#f1P@E_xok79RRQi6393>KpWB9CtniBq3~TyvLwIGV$(Zf(TI_D3S#iJJG(Kx0ae= z0>Ll?;c{1OUu?FID#R=26)la`I_rPNBm(v8(3DT9gs6Wp2YmZ1o4a1Rug3MhTe+;m zaGpeI5OPe|hd-d6p#%^s2yI{xLdXrq2TP>DQN<9bm=J1Yxd}w`q|UzM3+315XYOoh z!6Q)~M)2tx-bDeUfZEwOF%#~MWbLajLrUQ(f)fY=BO~2wD3u6FmI@KZjSTfSZ4k;Z ze&8Ryy7omBcvmtSlI){2s1_2ogK)^aVP@FhwJttJ%xST2(CQs=vOqgmj&$uikKUok zp>24eqFpD>ysAF!@D)3R?8}c2*z#rI7fiH?cs4Gg28J3KZ}wB7?$8~J!ni=ey+Y)C zEMKwp+)lprtYz2;8H5WjZ6xQdZC8(*v{Q9OrJ}AanWZUOY5DBcAc$cc}p9f>2X&zHU1$(&clw+xYZaCffTrHD{l&H0UV$&iK^rX&SpOi0+rc36PD8 ztGg`xuZ5a@^}4=lWlgD=wl?~`Mw~v*F|kh{f1`pXy7F1-ffu9HCIKDvyb>i%GvzhrjP(Y8M(CT zIZhAba7s_^$eJD)su9b&pNH7(@@0PPEoy16pE#O*%Ykn~dL$|j`#rydE4d73NbMS% z`EM@=Uui!i^U{DWX*p+6bu%^tbzY!%Fc^YeQ4J^ z|HZ{{UXSJC>onwH34{E%=W^O13NE&`^q94CJUs@}DAKygoJO#jSYoH-$O?>@b@($U z@o$N-tmc#5^Sz7rdd9_Gtzl0ct;DybVFfpWeo(Q!lnW?$%BK&1r=n^@OLM!=koD_Q zWWC4|)F;5?@ReeXMqSe9BPId$Xrrgbt9`zC&eQe3GX0+}ky zInBTb4W(T~3NQfx80(al&3Z);w03ZpoCl(^EO4h#D z{d4597C5tyC?O0~1sVj@X5$(NAPSH%0*PV983tpIMZf6vQkXyiZ;3HA6^WgMjKiF~ ziO2T5^K{7~ycVgsjGW#DA56AX5v~{Tg;-HNtt+gr2#t?SWfTiAOr## zs}v Date: Wed, 23 Oct 2024 18:19:18 +0000 Subject: [PATCH 05/10] modify changelog --- NEWS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS.md b/NEWS.md index 49dcb767..fec01d09 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +# wwinference dev +- Add wastewater data into the forecast period to output in `generate_simulated_data()` function and as package data. Also adds subpopulation-level +hospital admissions to output of function and package data. ([#184](https://github.com/CDCgov/ww-inference-model/issues/184)) + # wwinference 0.1.0 This is the first major release, focused on providing an initial version of the package. From 9583da1e8a5fd2cf8cf2a6100c57a01ae08badfd Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson <94390107+kaitejohnson@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:00:50 -0400 Subject: [PATCH 06/10] Update R/data.R Co-authored-by: Dylan H. Morris --- R/data.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/data.R b/R/data.R index 3ab438d0..cbb7d92e 100644 --- a/R/data.R +++ b/R/data.R @@ -98,7 +98,7 @@ #' to match this format. #' #' This data is generated via the default values in the -#' `generate_simulated_data()` function. They represent the bare minimumum +#' `generate_simulated_data()` function. They represent the bare minimum #' required fields needed to pass to the model, and we recommend that users #' try to format their own data to match this format. #' From b1193de470ba9dbc31cc725ffb3abb53c3d985b9 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Thu, 24 Oct 2024 15:23:08 +0000 Subject: [PATCH 07/10] fix documentation on subpopulation level admissions data --- R/data.R | 38 ++++++++++++++++-------------------- man/hosp_data.Rd | 2 +- man/subpop_hosp_data.Rd | 21 +++++++++----------- man/subpop_hosp_data_eval.Rd | 21 ++++++++++---------- 4 files changed, 37 insertions(+), 45 deletions(-) diff --git a/R/data.R b/R/data.R index cbb7d92e..3baeeff7 100644 --- a/R/data.R +++ b/R/data.R @@ -181,20 +181,17 @@ #' A dataset containing the simulated daily hospital admissions #' (labeled here as `daily_hosp_admits`) by date of admission (`date`) in #' each subpopulation. -#' Additional columns that are required are the population size of the -#' population contributing to the hospital admissions. It is assumed that -#' the wastewater sites are subsets of this larger population, which -#' is in the package data assumed to be from a hypothetical US state. -#' The data generated are daily hospital admissions but they could be any other -#' epidemiological count dataset e.g. cases. This data should only contain -#' hospital admissions that would have been available as of the date that -#' the forecast was made. We recommend that users try to format their data -#' to match this format. +#' Additional columns that are the population size of the +#' population contributing to the hospital admissions. In this instance, +#' the subpopulations here are each of the wastewater catchment areas plus +#' an additional subpopulation for the portion of the population not captured +#' by wastewater surveillance. The data generated are daily hospital +#' admissions but they could be any other epidemiological count dataset e.g. +#' cases. This data should only contain hospital admissions that would have +#' been available as of the date that the forecast was made. #' #' This data is generated via the default values in the -#' `generate_simulated_data()` function. They represent the bare minimumum -#' required fields needed to pass to the model, and we recommend that users -#' try to format their own data to match this format. +#' `generate_simulated_data()` function. #' #' The variables are as follows: #' \describe{ @@ -218,16 +215,15 @@ #' (labeled here as `daily_hosp_admits`) by date of admission (`date`) in #' each subpopulation observed retrospectively. #' Additional columns that are required are the population size of the -#' population contributing to the hospital admissions. It is assumed that -#' the wastewater sites are subsets of this larger population, which -#' is in the package data assumed to be from a hypothetical US state. -#' The data generated are daily hospital admissions but they could be any other -#' epidemiological count dataset e.g. cases. This data should only contain -#' hospital admissions that would have been available as of the date that -#' the forecast was made. We recommend that users try to format their data -#' to match this format. +#' population contributing to the hospital admissions. In this instance, +#' the subpopulations here are each of the wastewater catchment areas plus +#' an additional subpopulation for the portion of the population not captured +#' by wastewater surveillance. The data generated are daily hospital +#' admissions but they could be any other epidemiological count dataset e.g. +#' cases.This data should contain hospital admissions retrospectively beyond +#' the forecast date in order to evaluate the forecasts. #' -#' This data is generated via the default values in the +#' This data is generated via the default values in the #' `generate_simulated_data()` function. They represent the bare minimumum #' required fields needed to pass to the model, and we recommend that users #' try to format their own data to match this format. diff --git a/man/hosp_data.Rd b/man/hosp_data.Rd index fbb169b2..10811a61 100644 --- a/man/hosp_data.Rd +++ b/man/hosp_data.Rd @@ -28,7 +28,7 @@ to match this format. } \details{ This data is generated via the default values in the -\code{generate_simulated_data()} function. They represent the bare minimumum +\code{generate_simulated_data()} function. They represent the bare minimum required fields needed to pass to the model, and we recommend that users try to format their own data to match this format. diff --git a/man/subpop_hosp_data.Rd b/man/subpop_hosp_data.Rd index a5623b85..4267b5a0 100644 --- a/man/subpop_hosp_data.Rd +++ b/man/subpop_hosp_data.Rd @@ -17,21 +17,18 @@ subpop_hosp_data A dataset containing the simulated daily hospital admissions (labeled here as \code{daily_hosp_admits}) by date of admission (\code{date}) in each subpopulation. -Additional columns that are required are the population size of the -population contributing to the hospital admissions. It is assumed that -the wastewater sites are subsets of this larger population, which -is in the package data assumed to be from a hypothetical US state. -The data generated are daily hospital admissions but they could be any other -epidemiological count dataset e.g. cases. This data should only contain -hospital admissions that would have been available as of the date that -the forecast was made. We recommend that users try to format their data -to match this format. +Additional columns that are the population size of the +population contributing to the hospital admissions. In this instance, +the subpopulations here are each of the wastewater catchment areas plus +an additional subpopulation for the portion of the population not captured +by wastewater surveillance. The data generated are daily hospital +admissions but they could be any other epidemiological count dataset e.g. +cases. This data should only contain hospital admissions that would have +been available as of the date that the forecast was made. } \details{ This data is generated via the default values in the -\code{generate_simulated_data()} function. They represent the bare minimumum -required fields needed to pass to the model, and we recommend that users -try to format their own data to match this format. +\code{generate_simulated_data()} function. The variables are as follows: \describe{ diff --git a/man/subpop_hosp_data_eval.Rd b/man/subpop_hosp_data_eval.Rd index aee0f19c..1fa7de49 100644 --- a/man/subpop_hosp_data_eval.Rd +++ b/man/subpop_hosp_data_eval.Rd @@ -18,21 +18,20 @@ A dataset containing the simulated daily hospital admissions (labeled here as \code{daily_hosp_admits}) by date of admission (\code{date}) in each subpopulation observed retrospectively. Additional columns that are required are the population size of the -population contributing to the hospital admissions. It is assumed that -the wastewater sites are subsets of this larger population, which -is in the package data assumed to be from a hypothetical US state. -The data generated are daily hospital admissions but they could be any other -epidemiological count dataset e.g. cases. This data should only contain -hospital admissions that would have been available as of the date that -the forecast was made. We recommend that users try to format their data -to match this format. -} -\details{ +population contributing to the hospital admissions. In this instance, +the subpopulations here are each of the wastewater catchment areas plus +an additional subpopulation for the portion of the population not captured +by wastewater surveillance. The data generated are daily hospital +admissions but they could be any other epidemiological count dataset e.g. +cases.This data should contain hospital admissions retrospectively beyond +the forecast date in order to evaluate the forecasts. + This data is generated via the default values in the \code{generate_simulated_data()} function. They represent the bare minimumum required fields needed to pass to the model, and we recommend that users try to format their own data to match this format. - +} +\details{ The variables are as follows: \describe{ \item{date}{Date the hospital admissions occurred, formatted in ISO8601 From 262be42efba5846f7bebeb4a3e66626a54121079 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Thu, 24 Oct 2024 18:37:08 +0000 Subject: [PATCH 08/10] sum over subpops to get total, add subpop phi --- R/generate_simulated_data.R | 19 ++++++++++++++----- scratch/sim_data_script.R | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/R/generate_simulated_data.R b/R/generate_simulated_data.R index 7814db73..57ff4987 100644 --- a/R/generate_simulated_data.R +++ b/R/generate_simulated_data.R @@ -59,6 +59,9 @@ #' infection feedback into the infection process, default is `FALSE`, which #' sets the strength of the infection feedback to 0. #' If `TRUE`, this will apply an infection feedback drawn from the prior. +#' @param subpop_phi Vector of numeric values indicating the overdispersion +#' parameter phi in the hospital admissions observation process in each +#' subpopulation #' @param input_params_path path to the toml file with the parameters to use #' to generate the simulated data #' @@ -121,6 +124,7 @@ generate_simulated_data <- function(r_in_weeks = # nolint sigma_eps = 0.05, sd_i0_over_n = 0.5, if_feedback = FALSE, + subpop_phi = c(25, 50, 70, 40, 100), input_params_path = fs::path_package("extdata", "example_params.toml", @@ -341,6 +345,10 @@ generate_simulated_data <- function(r_in_weeks = # nolint )[(uot + 1):(uot + ot + ht)] } + if (rowSums(model_hosp_subpop_over_n) != model_hosp_subpop_over_n) { + cli::cli_abort("Sum of convolutions not equal to convolution of sums") + } + ## Add weekday effect on hospital admissions------------------------------- pred_hosp <- pop_size * model$functions$day_of_week_effect( @@ -365,10 +373,10 @@ generate_simulated_data <- function(r_in_weeks = # nolint ## Add observation error--------------------------------------------------- # This is negative binomial but could swap out for a different obs error - pred_obs_hosp <- rnbinom( - n = length(pred_hosp), mu = pred_hosp, - size = 1 / ((params$inv_sqrt_phi_prior_mean)^2) - ) + # pred_obs_hosp <- rnbinom( + # n = length(pred_hosp), mu = pred_hosp, + # size = 1 / ((params$inv_sqrt_phi_prior_mean)^2) + # ) pred_obs_hosp_subpop <- matrix( nrow = n_subpops, @@ -377,9 +385,10 @@ generate_simulated_data <- function(r_in_weeks = # nolint for (i in 1:n_subpops) { pred_obs_hosp_subpop[i, ] <- rnbinom( n = length(pred_hosp_subpop[i, ]), mu = pred_hosp_subpop[i, ], - size = 1 / ((params$inv_sqrt_phi_prior_mean)^2) + size = subpop_phi[i] ) } + pred_obs_hosp <- rowSums(pred_obs_hosp_subpop) diff --git a/scratch/sim_data_script.R b/scratch/sim_data_script.R index af84d369..337ec169 100644 --- a/scratch/sim_data_script.R +++ b/scratch/sim_data_script.R @@ -37,6 +37,7 @@ global_rt_sd <- 0.03 sigma_eps <- 0.05 sd_i0_over_n <- 0.5 infection_feedback <- TRUE +subpop_phi <- c(25, 50, 70, 40, 100) input_params_path <- fs::path_package("extdata", "example_params.toml", From 207a1becd7f234ee761867e68571b57ab94f9c62 Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Fri, 25 Oct 2024 13:43:29 +0000 Subject: [PATCH 09/10] get total hosp by summing subpop hosps --- R/generate_simulated_data.R | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/R/generate_simulated_data.R b/R/generate_simulated_data.R index 57ff4987..df74cfd5 100644 --- a/R/generate_simulated_data.R +++ b/R/generate_simulated_data.R @@ -326,6 +326,7 @@ generate_simulated_data <- function(r_in_weeks = # nolint ) ## Latent per capita admissions-------------------------------------------- + # This won't be used other than for the unit test model_hosp_over_n <- model$functions$convolve_dot_product( p_hosp_days * new_i_over_n, # individuals who will be hospitalized rev(inf_to_hosp), @@ -345,7 +346,12 @@ generate_simulated_data <- function(r_in_weeks = # nolint )[(uot + 1):(uot + ot + ht)] } - if (rowSums(model_hosp_subpop_over_n) != model_hosp_subpop_over_n) { + # unit test to make sure these are equivalent + if (!all.equal( + colSums(model_hosp_subpop_over_n * pop_fraction), + model_hosp_over_n, + tolerance = 1e-8 + )) { cli::cli_abort("Sum of convolutions not equal to convolution of sums") } @@ -372,12 +378,9 @@ generate_simulated_data <- function(r_in_weeks = # nolint ## Add observation error--------------------------------------------------- - # This is negative binomial but could swap out for a different obs error - # pred_obs_hosp <- rnbinom( - # n = length(pred_hosp), mu = pred_hosp, - # size = 1 / ((params$inv_sqrt_phi_prior_mean)^2) - # ) - + # Use negative binomial but could swap out for a different obs error. + # Each subpopulation has its own dispersion parameter, then we sum + # the observations to get the population total pred_obs_hosp_subpop <- matrix( nrow = n_subpops, ncol = (ot + ht) @@ -388,7 +391,7 @@ generate_simulated_data <- function(r_in_weeks = # nolint size = subpop_phi[i] ) } - pred_obs_hosp <- rowSums(pred_obs_hosp_subpop) + pred_obs_hosp <- colSums(pred_obs_hosp_subpop) From ceefec1068d5200b290e101a0a50059d0ccaf81e Mon Sep 17 00:00:00 2001 From: Kaitlyn Johnson Date: Fri, 25 Oct 2024 13:47:55 +0000 Subject: [PATCH 10/10] update vignette data, update docs --- data/hosp_data.rda | Bin 606 -> 612 bytes data/hosp_data_eval.rda | Bin 661 -> 644 bytes data/subpop_hosp_data.rda | Bin 1133 -> 1122 bytes data/subpop_hosp_data_eval.rda | Bin 1400 -> 1349 bytes data/ww_data.rda | Bin 1538 -> 1577 bytes data/ww_data_eval.rda | Bin 1910 -> 1925 bytes man/generate_simulated_data.Rd | 5 +++++ man/subpop_hosp_data_eval.Rd | 6 +++--- 8 files changed, 8 insertions(+), 3 deletions(-) diff --git a/data/hosp_data.rda b/data/hosp_data.rda index 8818ebf607b7846bf51d913e1dde7f57527f3e6a..83e0eeb833d8928bc8825143775be9bd48780ed4 100644 GIT binary patch literal 612 zcmZ>Y%CIzaj8qGb+*?=kn}Ky-{q_IF84T|K!QjLH^g9n67#JBG7&w5Cf$;!S(Ssd_ z6&J01m8@}DK+5C-TmRos6S)N@8O(n}(qApeV4QFvL&^Vds0Ras2?GPe1t123v{lPj z@HjhM7UsC@z;NUcuZa{dg9$GKOOVU0S<5F?nY1-4Fz|a^kYAA{m1x2sCAX|UI5$}R z@e7D<2Ig6TLR0*vxTtk5R|@v!aJg1CZS&g|$rn$YJazia*>mTYE?iWy^3mOcJU^3c zJ%yF_Tf_~{%{w`0jF&Je9V(%}i`A5NS< z=@VD&q79Fou4x#o;N*;HiBjrdm2^`2{CktD_v}rnf`%eznlkE_Y!eV<6g{EJ;KHzq zX;A|RFLY{=UH1+M-bZcu_5Q-ey>-!b(%=3pP0#FPic&6jX5nyVU~pnw;LzA1EzriG z!o|*3-H>pwnT3^m0NU(E0 zztxkBGY6-*YE2C4%1d1k;%FA)$fPjm3=o`koe2V~xTo#UE4cEn`Oz!spoQCW*Q}kf nTR|wNv}%&43K*H_=$9%q3Iua3-+1MU>VNSfSBroNpi~6_!R!j3 literal 606 zcmZ>Y%CIzaj8qGbT<@~~3Ipqb`s@FTGZ@_e13~zvsZO;%qvtATxm&BB+=|3ejwGA=OwU$x+WC{IJi1zRVT|5rmAq!=<7#M(v zLHpLKs%5hbe3=>498M%Kuw0xV$#CT41Xq>b70V}1)?C)?!0=UWf#g>AmCIMYv~`fm zsOpuQ9dhBvFQ8s9SgXTW?Rwu- z+0z1vZ-Z}l?e)|-7<9zou-MnRf6`sOq{?2L$iKJ0UF}NFnZs{S&$i2!e0+F!k0`(Y z1eK;It!}G@R_jV%5mVqbP@45LCNM#it3rOGO<1USlF{*VQpsOWD+YKaFj#z!YWn}l z^{=@=aF=eok=Ts|2NtNP?$p@gD!^sb;`->QO33C#K8w_pW*zVeYz~>a=uYEAMjnO_ za?FPhRL^5ReE4wdu{0p?IV)`*uWwto?w;&}`>Xr9%>8aXYJKm(vQSBagCmKfp^ZVJ zkwJ}f?Tct977hUghejqODqHHIVW;6?VVScNWSBG=>>|Y03eBiEFSe(&W7%eZwOw6D zg6=jaC24B>cZ`kSJ;Us2$m>>-T}l&`9lBzV+ert{*Q_pZwbY(n#1hPUM||bh$elLN zPIToKJa`$|W2~Pg=#>(*Xx`fpuB9(;3wrd+aFty1PIMswll)Q^3aNc;`ZvLQv&{r7r9ylOaP@P04z)bX8-^I diff --git a/data/hosp_data_eval.rda b/data/hosp_data_eval.rda index fb93b78835692f8c1437ce79a2a3b6929d768530..4ec7bf76543e141b536ca48fe0b291d63882751a 100644 GIT binary patch literal 644 zcmZ>Y%CIzaj8qGbJhO3=Dg*24`s4qNJp|bQgTaIU>30`AU~pjI073@F15BI!_?nXx zmFBOwB*nnXz-uD^YgGobLgtIFzVAa7Y!#$D<)7z`)C_>^6(dfkDdT z;wz4s0U5juj0+ebfX$I>iV~P9WpV;&^a94kL2n;GCDACpDXN-=Ee9B!m}WE_QgCq4 zmD-l~@bvP0xdlJ}a2PB+(k*4vX|(jr?Cy=5gVpscMNNv_{ggPTYDaz9wDa_|(4#yd z&t#sS=zhBO#r?Llb=@29FF6r$)UrbG#3|p^(QKRjxV~nDKXlq9^%>_Z*ShIbIX$~?mW+ks9y4Ez3Sf1S^n9A+x9Pv@tBmCw`r26%H%noDnM#df2LNRG3w!_o literal 661 zcmZ>Y%CIzaj8qGb3|GrkV_;odfBe6(M*#bOAc+6t@IU?Tf(Hx^3>-knz<7XZ@)D^> z?>ID9)vcVsz~;d0*8XqRj9H8eU)dU0t(3}OYkVc>U$tUhS5@Y+$+kX|9T*rFyEU9# zz`)jPQq^R$YNmq;TLS}|v*N-9M=}_A8JIaHP4+Y~;c>X^V9U_U#i4-X5L(#{%_L`u_(CDb#&n{P;zKw(&2FEWMbi1({TcbPW1G2oH|`3(4r`#(lX)g zbUW+9FSn*`nRNU8;cmM((ccsKL+_YHHmh6Y%(f!bq`|Qwl`Y%CIzaj8qGb6f`V7#~`g+fBgUNnk(V|f#CcfhyCUE7C1NrFmNz1I5;?7VBKT$ z@STO$SvCW?+{0SSS8j2eG0Wsc=464(3~fHMQZ6o=$^SRhkeP!=z(i@DbFf43SC+ql zvlJIQFi7&+Dm%Vn00O4qOPwB74g3Le8YYYjfC9D-KtfQ|6-@sRWnj1f0|zhb#HtI~n3;o_@|zrj}+j7&1l`UlUNpYli5YpPbr%AlpBQfvBI zg2jB4ZG3lLoHympT+NqfgO^)PUTt-Gy{+es*_*G5!$ zuU{wfz5ml{j;?mn>CH1%AW$9Bfy4-rzEzjC!bHjnY#XLoa@xwMuVM+1{z4|2FP#)%2GZSiJj7#^LNN%|~~=N-oVUS$4dB z;ra8@oxbK1TfH(v!n6dAT%MwJUh>fjNrSGrBC}umtm^u^!EFw&eAuBir)?x%Tb7A# zm~!gGydP6Os9L`Cd9KW-ppwAJ!Q{p{!&PBzlIEs=VUiDK?B?|8oODuixly{YSAe%m zP*Vh_f{F*%*$9rM8jUk~3)cj@x+!V6D4Vxz>P(xW;_2=5*fY^X;Kjvxy;{Z>uPwHf z=`uavl|Ad(&b?NXi%Qj29<)$DZF;tNwe=mz-UF#Vy;>$qGCpsSoE^tp8CtfcUrsRS zh1--hQXEQs0y^hiWvewO_S!`-((!y0MCPokmIfQ0zm~!4?*{fia<%-t3e=@J_ zKjD@5_`~n@`Q6$_-v6-C^snBU^GRk-%9IO_cE`R8o4YP3*zVf7Imt}HUcu9*ob6Lt zp6=|bxlr>Tr>{(=FA(~fEblye-mCD>Nx#Um&z4%wxv%XMylu*%;B%oCcX{VM7FVB{ zv((rt)2ke4_;%YlmAiS@$-dold!Njlhng+REW<4|Prg(VY%CIzaj8qGbWKO)jgF)K7{`mjjHFv`QgTN1m{pI%-I5-3_a4;}9I5=Kl-S=va z@!^I`5?LYN1XdX^FfcIwS^y-$KxyUA$&Rdyuk1s<2$-<7H7;DZeB}bL%w#W*Wi1CX zeAH$zFd8NJnk0Zk-2}BVJ)cdfGHPo8@-F+zEo*l89||;af>c$bS7%72;#OWMUV~nv z`ju`orPv%7T&VJyeWihceM+vc)#P8ZKN}+h!$dTYh6Ykw(Lm4ak3LdKvy##+Kc~;N z+uUVhMl4Rco$l-=I_WG23)2;sp9elNY)@=jlBpo2 zYUg_DSo@kY-e+C6s1)dQ+$d$-lRi}HO} z>sRyhUH{vjWu6OKWjIToOm{pjne?g2iFcP`(u#F+7{j;bcJQa~_L-vFuxO${i&)m* zw8&|f4Hddv1LY_BN-=5OeUKv#Mra41*RV6_fsxA5tA&)R0F$+|4_oE9{DmayxhV3jkc zf>lm4B{n4;G)S0XaVS`G#Ca z)?L{4DD9XZtHvp}6Q?ts1a{9_ds4KMSSZlYmE***RHJFmmSvrOzjn*oth#&njnIro zfB%MWJv@8Yzw-Z=G?z}?pINfORbT3z|2!Ux4;)L4;t#7Zitd>5XsJnZtLCNKxtC^V z`Y~#5zvopJH228zO3k|kA1}>)w=1~IFiFtoO?37l%@s-$T+N+UPC38-p>kR25wDCX zcf86hgl3yON}jmoaoI1Mv$AqLdkS0?x_tO9xavI&)tc(HG-zeWs!**tEI^BIyks+IJ7_zZ-+o5cjTID*`~A3rfmi@=B2A|E9+|h a({U(x$KS%!=juO}s|2@lGMLHkZU6uz+Vvs; diff --git a/data/subpop_hosp_data_eval.rda b/data/subpop_hosp_data_eval.rda index f4c5a2123d2c70acd364e625df46de4cfdf25d39..66dda2ddf441b0205af717f29f70d84ee3ebb6ee 100644 GIT binary patch literal 1349 zcmZ>Y%CIzaj8qGboWI{!ok5MG{`mjjaaY3s1Ht(}4*SdRuW)j3VBlb2aBy&bz%C(v z?}P6L#(540URWrKddw77Yi2aLxO}nV{!k7R6Qc|h>0th#`d2F#vq&Pz!Dnr|8Hmj<6;M?Bwhw1HZ>-o90NlJo8*#?B}ohnJPiyc zyhaQR7o>oqzFw19X1jb^?91>KD010Bis51huT(}=xhxfEXD@ zm*33lRGH*SIbvI|>fDxV9H9%XH7CtovSFs@v}r+?($uojRkyU9_bEByGv$=emNPzA z&iQ<~;OVJr67*0_ZIatsli9g@-=*vKu08QLLU(@fl8kt_^^524ycRlZx1qp>35WbS zB+n+OcB&uoaQqaawmvMBDPVz7TUN@1B|fdCYI}W}>zx*yvk?&1+%c>ZX-$(UH>ID#5o!YZIe@Zc6epfs`*QeiOwPYX$^HMFdF; zCt67<3aopYS;@hDGEi3C!9`51bm5^@(;b%Y_bzMX3RFomT(hlnn;w%V+u78e!Kyzt z$lG1m!_dgUC_ZnB;{xRlvp`|hWtVQfG5R+9teb|B>dR;O>pi2M>fQ@o_e5D>MhoAS zo@FQ2rm;>o*!S3S*^O3_1s#GeSDG|bUK%R3+^rNmp>lv>)sbxJKlQoq@{8xKp0{ev zEzY>Br#}{nhL+p9%l`dYV-u?Xc~2EX@rxxNe$BOd`?m4%7lxk)Y89-kukU&Mxbb-O z-ld_jNh_0>POop7^mJ#cU}46p^{iT793Cz8zICMZRmrctEIZwGE!tMC_IknG^&q~j z;oE`l3yLhaK3SQ%DsolSTD=Ani>Rfm_4)go)&&Qh`jt@V-CDq2JykDwf=tlE12RF6 zu54YIx-vKD?i6;B9apw3-Kx7X>+sp7)3{AUI-CSlJgz9&?A*3>smlVxfP5+;lr zr50)ha=Dm_`>s{n$s06p$x@R^Q$DC_KJ*ISGi}nLC~wWz{z=)(4h79zxoKX>E#DijLBQzZ4l`cuPSxj{ z9NfoM@(xdx_H+z5)y3K3BFd??!c*XaA}14zg7b#A0TWkpYFyS#%)WIevQI2T%jM9M zW4GMY%x7>htuzqoJEGgG9hI_GM)c9%fEh7f3~K~gJQ6INUhj@9uNAzu;WQ8NXiEm4 z_pAqec^R?`iq|C=J->8Tcj;OU0gv+29Sn2%CWJDq?^H58e*1das&y0W-!fi)%6tO|PqF*= z=c~_QpMH&b-fnA#&(${nCfF7j$n&h)pFi#M@A*>ajW^z5o*?_dJiLQHefH`ax$f;p zzwVJ)?|d}iAZzHt(2TtWpBl2_P`_k`NXk{AB&CeNDeiU%ks@dLEKsyFc~QkH>e#i(D-N ICV+}f0BMI-kN^Mx literal 1400 zcmZ>Y%CIzaj8qGboRw(&j6qGT{`mjjad*Q1gTN1m{pI&pI5{{la4;}9I5O;8hn z)YiMq*@a#%n@(G1_RZuh)LZ5i=ddrgK?X}(T}gr>R5beWJV$6b6+FOQ#809_6wjP*qX-7s*||iz=s2X| zKYd@$+1U6FyZ9dw3*sN!SSrZ;~>Ev%e;Q7 zUho8I@36)#Tc>Q+Or5fE%BD@z!c!TyY*$odRB-Tc@Ng|}-j(1H+d6R~bCOWASdF)h z*C7vu4U=M)D7~A@;UVUB!b2#aRpI3_k$p3QBMp`C9y8++VqusgJW(L|@pBih6DoY1 z7AkK-)C6)EH+VApi1MybTk6i_^1?GcQxd zbtaU&O!Ru1d{}5xw;}hrq#Z|C&NKuED~E?P#R|<6O;rfwQ#?35q(#Sbtypos(}mko zlHF`N5*v~Zl0YddSnBP%V7YTaS>w5#4M(;#d8h!9QpFYx?bZAST5CeT+AKT$by>;c zA6wqsV_=Y(u)=E6q$wT;7+5$St)9B7>Iy@Ce)Xv{r$yByvv zu&PO@J78ZRXJA!hIZwZiz5i3=`PjJ))%VWpFX2DK#`s(`{N=}c@e@C;skH4^;B%;S zNUz?(|M2X+^X7}*zWY+AuYK{|?fni3l23L&C}+F(EFn~Ds@Kw>l_9G_wPtdHNH`b5 z*f;BC$Ofim@$DY{krzW8cFZ;E{j>g)=hJh*!Z5*&1&m_3TMs=f*b$>Aj?U1ZvFGc9 g_4Wt%d}6&Q*ib$H=!3ieAHDNf&Lt%5qgHbO03U>0s{jB1 diff --git a/data/ww_data.rda b/data/ww_data.rda index 179b1f0698b491c08846257bebe51877c0f6eba3..c58ab9ddd2558901165bc824e9269395b77914b7 100644 GIT binary patch literal 1577 zcmV+^2G;pPT4*^jL0KkKS#j7&Hvk6j|NsC0fB*mg|NZ{+|NZ~}|G)F!pa1v&|G)qH z|NsB`@BPpOT<`#Qx$Wx>>jD(jC+eP&qfb+69wgJ$H1v9q%|lHaP|#_hdW|v26UDUb|}JrmPV#TpF&00001 zpa1{>&;S|%rkZ9`3|nrQ7QeJBNp?6DCT`A|eYv@el^RL@WenqzFoD z;3!J8BmldtAfbPrNQL;XhC~<{1-gT#A&7t@)MbYuPIFbVp2XMxi=N%GU>Cn$Yn27Plvaf|4obdp&Rk7)8hCeuY8@Yu5zfoU2AWe`kND5>0yLmA2Cwg z00kk;7j_vNW`dZ3n7R7bbTfefEFNH?@*9wzIH4Tu$a?Typ$QPw5TRrsgrJDYQ4<=S zC6Pdw@?#1ryRz%VkKT<`bS^@f11#AMh*%Y2DQ1byQqRnno>SbRko}Tbt z4&>mnS9SUO*jJ_yx1#@L?70WcN}FhtxP`UC((W`?JO8oe**AYEkX<{M=2oFiDgpwEAwohQO7Lc_e$fKEbjT&a5*Cmmn zlxK>xhi1wvN=$Z)E76M^4J zeCh{_#A1<9BwkwD5SPCGA{Lz#NQMAlx8!>-S2`7oDb%aQGYw$+}uu(rOP}yev37PMc0GMa@-x~1az)$zP*z9Zu+W=h5b;Y_YYQ zTO7ZwD6YnsnJ?IQD`mk-Pr;u#?y@C)MN4A5^%3Gy7y|a*6KZW1Tae@3b|gSNI<`Xu`;E}xN>Tc>$YK3 z%&yQx%&d+^cI^Hf{P4boaCbI&N0Y^1ehZE4XQV_hlD2Den)ZwXhH4=rm!AfJf{&a| z>z=r6riH#a)`BBUP+lNAPrG!DUqK~=y{mJ~Fl_M3C>aSFImC19Z)y)MWim%0k0(Zr z@7%0Ov+^3AE!T36N4EBQGCBjgo?WjGl$U>yd^J2aMq_I0;*<26NtgQ0Lr33m7?8Y< z{-|{Y&1Cgct`GL2T6(@{tFoQeE(09K)~R-WDE3X6yvqxyHy)uikWhJ*mVDR!oI0`# ztwzj@ypif~=~ekucc5nx{oyAnTMP`2PGzIU*b|D?Zhw}xC!N+a635u0UU$4r^xWR3 z*5fYpscIp#L3;ap|8|3AlS%$hm-z_2_1p{&f2&KHw>`krgu*zw;YE`(wCE$Y79H>zr7(Ph#8z%%-nB?8!sQ% zmP`ITsFcuCxH^Wly!@%OD?EU%+&UlJUEjiW7Pw6Ua`Gxf&D+(tOLZE(*Y*#GXd!n8 ziPB>m(C|Vf5xXX6^a+)07j_xq+Gi!-4E}j0h&F>s8^+i0hT15VFlFp zK{0yeu%xd&!YIW~c3Dz4W9R$6D(xkmNquzop8KE$^08wjby;?{Xs9MYRI9ZIVE$Xm zCe=}<%l6XDb-t$8nLtO?J+_s3A0)b>m6ylOMIVu@adRq7h7#n=9w3+P57&M;DAsJql8a>bgL+7Zm{Vyj;x#W!bA-Q(D|H18C8(4T@2 zsOH-2%wL^*8)gtE`q~m?aK4ACCNUR5voL0c+PMdCES~Ghh8x+Abwm?u`;dZ(`H*KwOQH)tqs}n_uOZr zSXoJU8y{PKzNIK)u_FzDX4I!RKb6gw*sb3PwTBbFZGJUbdAp4|gNJ6awA{S=v;B^o z*NBD1gw{hi-Ws0OFtl{yzC+e4(HLo9cg^%l9jTG?*B+i!epU?3#^brJlkbdjuH+S= mpNmh_z`W6iQ*OUps#Cl&Ly26w;~|&!+Y`kJJpLFc_07LaiKuS? diff --git a/data/ww_data_eval.rda b/data/ww_data_eval.rda index efd0c7475cee140a4b22667e24aa16d86e99a56a..176a52b471dbadb3a38f39b5d9c98f9beb7ba6ef 100644 GIT binary patch literal 1925 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