From 7c7bfac291f315248a2804d5d7f2ad67d4591e59 Mon Sep 17 00:00:00 2001 From: ConnorDonegan Date: Wed, 13 Mar 2024 07:21:59 -0500 Subject: [PATCH] allow missing y --- .gitignore | 1 + DESCRIPTION | 2 +- NEWS.md | 8 +- R/convenience-functions.R | 6 +- R/geostan_fit-methods.R | 4 +- R/internal-functions.R | 29 +- R/prep-censored-data.R | 13 +- R/stan_car.R | 39 +- R/stan_esf.R | 34 +- R/stan_glm.R | 45 +- R/stan_icar.R | 36 +- R/stan_sar.R | 40 +- README.Rmd | 2 +- README.html | 702 ------------------ README.md | 31 +- cran-comments.md~ | 3 - docs/404.html | 2 +- docs/LICENSE-text.html | 2 +- docs/LICENSE.html | 77 +- docs/articles/custom-spatial-models.html | 695 +++++++++-------- docs/articles/index.html | 2 +- docs/articles/measuring-sa.html | 424 ++++++++--- .../figure-html/unnamed-chunk-14-1.png | Bin 144936 -> 145694 bytes docs/articles/raster-regression.html | 155 ++-- docs/articles/spatial-me-models.html | 409 +++++++--- .../figure-html/unnamed-chunk-14-1.png | Bin 41497 -> 41014 bytes .../figure-html/unnamed-chunk-9-1.png | Bin 162008 -> 161507 bytes docs/authors.html | 2 +- docs/index.html | 32 +- docs/news/index.html | 15 +- docs/pkgdown.yml | 4 +- docs/reference/aple.html | 2 +- docs/reference/auto_gaussian.html | 2 +- docs/reference/edges.html | 2 +- docs/reference/eigen_grid.html | 2 +- docs/reference/expected_mc.html | 2 +- .../figures/README-unnamed-chunk-5-1.png | Bin 57432 -> 57740 bytes docs/reference/georgia.html | 2 +- docs/reference/geostan-package.html | 2 +- docs/reference/get_shp.html | 2 +- docs/reference/gr.html | 2 +- docs/reference/index.html | 2 +- docs/reference/lg.html | 2 +- docs/reference/lisa.html | 2 +- docs/reference/make_EV.html | 2 +- docs/reference/mc.html | 2 +- docs/reference/me_diag.html | 2 +- docs/reference/moran_plot.html | 2 +- docs/reference/n_eff.html | 2 +- docs/reference/posterior_predict.html | 2 +- docs/reference/predict.geostan_fit.html | 2 +- docs/reference/prep_car_data.html | 4 +- docs/reference/prep_car_data2.html | 2 +- docs/reference/prep_icar_data.html | 2 +- docs/reference/prep_me_data.html | 2 +- docs/reference/prep_sar_data.html | 2 +- docs/reference/prep_sar_data2.html | 2 +- docs/reference/print_geostan_fit.html | 10 +- docs/reference/priors.html | 10 +- docs/reference/resid_geostan_fit.html | 14 +- docs/reference/row_standardize.html | 2 +- docs/reference/samples_geostan_fit.html | 2 +- docs/reference/se_log.html | 2 +- docs/reference/sentencing.html | 2 +- docs/reference/shape2mat.html | 2 +- docs/reference/sim_sar.html | 2 +- docs/reference/sp_diag.html | 2 +- docs/reference/stan_car.html | 6 +- docs/reference/stan_esf.html | 6 +- docs/reference/stan_glm.html | 10 +- docs/reference/stan_icar.html | 86 +-- docs/reference/stan_sar.html | 6 +- docs/reference/waic.html | 2 +- inst/stan/parts/data.stan | 4 +- inst/stan/parts/gen_quants_declaration.stan | 2 +- inst/stan/parts/gen_quants_expression.stan | 10 +- inst/stan/parts/model.stan | 13 +- man/figures/README-unnamed-chunk-5-1.png | Bin 57432 -> 57740 bytes tests/testthat/test-missing-y.R | 76 ++ tests/testthat/test-stan-glm.R | 2 +- vignettes/custom-spatial-models.Rmd | 5 +- vignettes/custom-spatial-models.Rmd~ | 483 ------------ 82 files changed, 1621 insertions(+), 2004 deletions(-) delete mode 100644 README.html delete mode 100644 cran-comments.md~ create mode 100644 tests/testthat/test-missing-y.R delete mode 100644 vignettes/custom-spatial-models.Rmd~ diff --git a/.gitignore b/.gitignore index a5c47354..43f75f04 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ cran-comments.md /doc/ /Meta/ CRAN-RELEASE +CRAN-SUBMISSION diff --git a/DESCRIPTION b/DESCRIPTION index 197ff1f6..834934ed 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: geostan Title: Bayesian Spatial Analysis -Version: 0.5.4 +Version: 0.6.0 Date: 2024-03-01 URL: https://connordonegan.github.io/geostan/ BugReports: https://github.com/ConnorDonegan/geostan/issues diff --git a/NEWS.md b/NEWS.md index 3a13e1ae..bd168f6f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,10 +1,16 @@ +# geostan 0.6.0 + +## New Additions + +The model fitting functions (`stan_glm`, `stan_car`, etc.) now allow for missing data in the outcome variable and a new vignette provides the details. This functionality is not available for auto-Gaussian models - that is, CAR and SAR models that have been fit to continuous outcome variables - but is available for all other available models (including eigenvector spatial filtering `stan_esf` models for continuous outcomes, and all models for count outcomes [binomial and Poisson models]). + # geostan 0.5.4 Minor updates to the vignettees and documentation, also re-compiled geostan models using the latest StanHeaders (fixing an error on CRAN). # geostan 0.5.3 -### Minor changes +## Minor changes The `gamma` function (which is available to help set prior distributions) has been renamed to `geostan::gamma2` to avoid conflict with `base::gamma`. diff --git a/R/convenience-functions.R b/R/convenience-functions.R index 5448c614..05d12278 100644 --- a/R/convenience-functions.R +++ b/R/convenience-functions.R @@ -1306,9 +1306,11 @@ exp_pars <- function(formula, data, C) { MCM <- M %*% C %*% M eigens <- eigen(MCM, symmetric = TRUE) npos <- sum(eigens$values > 0) - sa <- mc(residuals(lm(formula, data = data)), C) + res <- residuals(lm(formula, data = data)) + obs_idx <- which(!is.na(res)) + sa <- mc(res[obs_idx], C[obs_idx, obs_idx]) X <- model.matrix(formula, data) - E_sa <- expected_mc(X, C) + E_sa <- expected_mc(X, C[obs_idx, obs_idx]) Sigma_sa <- sqrt( 2 / nlinks ) z_sa <- (sa - E_sa) / Sigma_sa if (z_sa < -.59) { diff --git a/R/geostan_fit-methods.R b/R/geostan_fit-methods.R index 5bc972da..136947f5 100644 --- a/R/geostan_fit-methods.R +++ b/R/geostan_fit-methods.R @@ -32,7 +32,7 @@ #' @method print geostan_fit #' @rdname print_geostan_fit print.geostan_fit <- function(x, - probs = c(0.025, 0.25, 0.5, 0.75, 0.975), + probs = c(0.025, 0.2, 0.5, 0.8, 0.975), digits = 3, pars = NULL, ...) { pars <- c(pars, "intercept") @@ -61,7 +61,7 @@ print.geostan_fit <- function(x, cat("Link function: ", x$family$link, "\n") cat("Residual Moran Coefficient: ", x$diagnostic["Residual_MC"], "\n") if (!is.na(x$diagnostic["WAIC"])) cat("WAIC: ", x$diagnostic["WAIC"], "\n") - cat("Observations: ", nrow(x$data), "\n") + cat("Observations: ", x$N, "\n") cat("Data models (ME): ") if (x$ME$has_me) { cat(paste(names(x$ME$se), sep = ", ")) diff --git a/R/internal-functions.R b/R/internal-functions.R index e7dfa8fb..7de40761 100644 --- a/R/internal-functions.R +++ b/R/internal-functions.R @@ -79,7 +79,6 @@ SLX <- function(f, DF, x, W) { #' @param y_mis_idx Index of censored counts in the outcome, if any. make_data <- function(frame, x, y_mis_idx) { y <- model.response(frame) - if (length(y_mis_idx) > 0) y[y_mis_idx] <- NA offset <- model.offset(frame) if (is.null(offset)) return(cbind(y, x)) return(cbind(y, offset, x)) @@ -127,25 +126,37 @@ inv_logit <- function(x) exp(x)/(1 + exp(x)) #' #' @importFrom stats sd #' @noRd -make_priors <- function(user_priors = NULL, y, x, hs_global_scale, scaling_factor = 2, link = c("identity", "log", "logit"), EV, offset) { +make_priors <- function(user_priors = NULL, y, trials, x, hs_global_scale, scaling_factor = 2, link = c("identity", "log", "logit"), EV, offset) { link <- match.arg(link) if (link == "identity") { - scale.y <- sd(y) + y <- na.omit(y) + scale.y <- max(sd(y), .1) alpha_scale <- max(4 * sd(y), 5) alpha_mean <- mean(y) } if (link == "log") { if (any(y == 0)) y[which(y == 0)] <- 1 # local assignment only, not returned y <- log(y / exp(offset)) + if (any(is.infinite(y))) { + any_inf <- which(is.infinite(y)) + y[any_inf] <- NA + } + y <- na.omit(y) alpha_mean <- mean(y) - scale.y <- sd(y) + scale.y <- max(sd(y), .1, na.rm = T) alpha_scale <- max(4 * scale.y, 5) } - if (link == "logit") { - y <- y[,1] / (y[,1] + y[,2]) - alpha_mean <- 0 - scale.y <- sd(y) - alpha_scale <- 5 + if (link == "logit") { + p <- y / trials + y <- log( p / (1-p)) + if (any(is.infinite(y))) { + any_inf <- which(is.infinite(y)) + y[any_inf] <- NA + } + y <- na.omit(y) + alpha_mean <- mean(y) + scale.y <- max(sd(y), 0.1) + alpha_scale <- max(4 * scale.y, 5) } priors <- list() priors$intercept <- normal(location = alpha_mean, scale = alpha_scale) diff --git a/R/prep-censored-data.R b/R/prep-censored-data.R index ea0cb6d4..5143e48a 100644 --- a/R/prep-censored-data.R +++ b/R/prep-censored-data.R @@ -1,11 +1,6 @@ - - - - - #' @description Return index of observed, censored y; elsewhere, use results to replace NAs with zeros #' This will stop if there are missing values and the censor_point argument is not being used; outside of this call, must check that censor_point argument is only used with Poisson likelihood. #' @@ -14,10 +9,12 @@ #' @noRd #' handle_censored_y <- function(censor, frame) { - y_raw <- as.numeric(model.response(frame)) + y_raw <- model.response(frame) + if (inherits(y_raw, "matrix")) { + y_raw <- y_raw[,1] + y_raw[,2] + } y_mis_idx <- which(is.na(y_raw)) y_obs_idx <- which(!is.na(y_raw)) - if (censor == FALSE & length(y_mis_idx) > 0) stop("Missing values in y. If these are censored counts, you may want to use the censor_point argument.") return (list(n_mis = length(y_mis_idx), n_obs = length(y_obs_idx), y_mis_idx = y_mis_idx, @@ -29,5 +26,5 @@ handle_censored_y <- function(censor, frame) { #' @noRd handle_missing_x <- function(frame) { check_NAs <- apply(as.matrix(frame[,-1]), 2, function(c) any(is.na(c))) - if (any(check_NAs)) stop("Missing values found in covariates or offset term. Even when using the censor_point argument, missing values are only permitted in the outcome variable.") + if (any(check_NAs)) stop("Missing values found in covariates or offset term. Missing values are only permitted in the outcome variable.") } diff --git a/R/stan_car.R b/R/stan_car.R index 0d876bf3..90e3b775 100644 --- a/R/stan_car.R +++ b/R/stan_car.R @@ -250,7 +250,7 @@ stan_car <- function(formula, if (family$family == "gaussian" | family$family == "auto_gaussian") family <- auto_gaussian(type = "CAR") stopifnot(!missing(data)) check_car_parts(car_parts) - stopifnot(length(car_parts$Delta_inv) == nrow(data)) + stopifnot(car_parts$n == nrow(data)) if (!missing(C)) { stopifnot(inherits(C, "Matrix") | inherits(C, "matrix")) stopifnot(all(dim(C) == nrow(data))) @@ -267,13 +267,25 @@ stan_car <- function(formula, if (missing(censor_point)) censor_point <- FALSE mod_frame <- model.frame(formula, tmpdf, na.action = NULL) handle_missing_x(mod_frame) + ## prep Y for missingness // y_index_list <- handle_censored_y(censor_point, mod_frame) - y <- y_int <- model.response(mod_frame) - ## CAR: INCLUDE AUTO-GAUSSIAN AS family_int=5 ------------- - if (family_int %in% c(1,2,5)) y_int <- rep(0, length(y)) - ## ------------- - y[y_index_list$y_mis_idx] <- y_int[y_index_list$y_mis_idx] <- 0 - mod_frame[y_index_list$y_mis_idx, 1] <- 0 + mi_idx <- y_index_list$y_mis_idx + y_tmp <- model.response(mod_frame) + if (family$family == "binomial") { + trials <- y_tmp[,1] + y_tmp[,2] + y <- y_int <- y_tmp[,1] + } + if (family$family == "poisson") { + y <- y_int <- y_tmp + trials <- rep(0, n) + } + if (family$family %in% c("gaussian", "auto_gaussian")) { + y <- y_tmp + y_int <- trials <- rep(0, n) + if ( length(y_index_list$y_mis_idx) > 0) stop("Missing values in y; missing values are not allow for CAR/SAR models with continuous (non-count) outcomes. You may want to try stan_esf.") + } + y[mi_idx] <- y_int[mi_idx] <- trials[mi_idx] <- 0 + ## // if (is.null(model.offset(mod_frame))) { offset <- rep(0, times = n) } else { @@ -339,7 +351,7 @@ stan_car <- function(formula, prior_only = prior_only, y = y, y_int = y_int, - trials = rep(0, length(y)), + trials = trials, #n = n, # getting n from car_parts, below input_offset = offset, has_re = has_re, @@ -359,10 +371,11 @@ stan_car <- function(formula, ## PRIORS & CAR DATA ------------- is_student <- FALSE ##family$family == "student_t" priors_made <- make_priors(user_priors = prior, - y = y, + y = y[y_index_list$y_obs_idx], + trials = trials[y_index_list$y_obs_idx], x = x_full, link = family$link, - offset = offset) + offset = offset[y_index_list$y_obs_idx]) if (is.null(prior$car_scale)) { priors_made$car_scale <- priors_made$sigma } else { @@ -390,11 +403,6 @@ stan_car <- function(formula, # append me.list to standata standata <- c(standata, me.list) - ## INTEGER OUTCOMES ------------- - if (family$family == "binomial") { - standata$y <- standata$y_int <- y[,1] - standata$trials <- y[,1] + y[,2] - } ## PARAMETERS TO KEEP, with CAR PARAMETERS [START] ------------- pars <- c(pars, 'intercept', 'car_scale', 'car_rho', 'fitted', 'log_lik') if (family_int < 5) pars <- c(pars, 'log_lambda_mu') @@ -451,6 +459,7 @@ stan_car <- function(formula, R <- resid(out, summary = FALSE) out$diagnostic["Residual_MC"] <- mean( apply(R, 1, mc, w = C, warn = FALSE, na.rm = TRUE) ) } + out$N <- length( y_index_list$y_obs_idx ) return (out) } diff --git a/R/stan_esf.R b/R/stan_esf.R index b517b579..00f2a507 100644 --- a/R/stan_esf.R +++ b/R/stan_esf.R @@ -229,11 +229,24 @@ stan_esf <- function(formula, if (missing(censor_point)) censor_point <- FALSE mod_frame <- model.frame(formula, tmpdf, na.action = NULL) handle_missing_x(mod_frame) + ## prep Y for missingness // y_index_list <- handle_censored_y(censor_point, mod_frame) - y <- y_int <- model.response(mod_frame) - if (family_int %in% c(1,2)) y_int <- rep(0, length(y)) - y[y_index_list$y_mis_idx] <- y_int[y_index_list$y_mis_idx] <- 0 - mod_frame[y_index_list$y_mis_idx, 1] <- 0 + mi_idx <- y_index_list$y_mis_idx + y_tmp <- model.response(mod_frame) + if (family$family == "binomial") { + trials <- y_tmp[,1] + y_tmp[,2] + y <- y_int <- y_tmp[,1] + } + if (family$family == "poisson") { + y <- y_int <- y_tmp + trials <- rep(0, n) + } + if (family$family %in% c("gaussian", "student_t")) { + y <- y_tmp + y_int <- trials <- rep(0, n) + } + y[mi_idx] <- y_int[mi_idx] <- trials[mi_idx] <- 0 + ## // if (is.null(model.offset(mod_frame))) { offset <- rep(0, times = n) } else { @@ -289,7 +302,7 @@ stan_esf <- function(formula, prior_only = prior_only, y = y, y_int = y_int, - trials = rep(0, length(y)), + trials = trials, n = n, input_offset = offset, has_re = has_re, @@ -316,12 +329,13 @@ stan_esf <- function(formula, hs_global_scale <- min(1, p0/(dev-p0) / sqrt(n)) } priors_made <- make_priors(user_priors = prior, - y = y, + y = y[y_index_list$y_obs_idx], + trials = trials[y_index_list$y_obs_idx], x = x_full, hs_global_scale = hs_global_scale, EV = EV, link = family$link, - offset = offset) + offset = offset[y_index_list$y_obs_idx]) standata <- append_priors(standata, priors_made) esf_dl <- list( dev = dev, @@ -337,11 +351,6 @@ stan_esf <- function(formula, ## ME MODEL STUFF ------------- me.list <- make_me_data(ME, xraw) standata <- c(standata, me.list) - ## INTEGER OUTCOMES ------------- - if (family$family == "binomial") { - standata$y <- standata$y_int <- y[,1] - standata$trials <- y[,1] + y[,2] - } ## PARAMETERS TO KEEP ------------- pars <- c(pars, 'intercept', 'esf', 'beta_ev', 'log_lik', 'fitted') if (!intercept_only) pars <- c(pars, 'beta') @@ -393,6 +402,7 @@ stan_esf <- function(formula, R <- resid(out, summary = FALSE) out$diagnostic["Residual_MC"] <- mean( apply(R, 1, mc, w = C, warn = FALSE, na.rm = TRUE) ) } + out$N <- length( y_index_list$y_obs_idx ) return (out) } diff --git a/R/stan_glm.R b/R/stan_glm.R index 221cd8ba..6baffb3f 100644 --- a/R/stan_glm.R +++ b/R/stan_glm.R @@ -244,11 +244,24 @@ stan_glm <- function(formula, if (missing(censor_point)) censor_point <- FALSE mod_frame <- model.frame(formula, tmpdf, na.action = NULL) handle_missing_x(mod_frame) + ## prep Y for missingness // y_index_list <- handle_censored_y(censor_point, mod_frame) - y <- y_int <- model.response(mod_frame) - if (family_int %in% c(1,2)) y_int <- rep(0, length(y)) - y[y_index_list$y_mis_idx] <- y_int[y_index_list$y_mis_idx] <- 0 - mod_frame[y_index_list$y_mis_idx, 1] <- 0 + mi_idx <- y_index_list$y_mis_idx + y_tmp <- model.response(mod_frame) + if (family$family == "binomial") { + trials <- y_tmp[,1] + y_tmp[,2] + y <- y_int <- y_tmp[,1] + } + if (family$family == "poisson") { + y <- y_int <- y_tmp + trials <- rep(0, n) + } + if (family$family %in% c("gaussian", "student_t")) { + y <- y_tmp + y_int <- trials <- rep(0, n) + } + y[mi_idx] <- y_int[mi_idx] <- trials[mi_idx] <- 0 + ## // if (is.null(model.offset(mod_frame))) { offset <- rep(0, times = n) } else { @@ -314,7 +327,7 @@ stan_glm <- function(formula, prior_only = prior_only, y = y, y_int = y_int, - trials = rep(0, length(y)), + trials = trials, n = n, input_offset = offset, has_re = has_re, @@ -331,24 +344,20 @@ stan_glm <- function(formula, ) ## ADD MISSING/OBSERVED INDICES ------------- standata <- c(y_index_list, standata) - ## PRIORS ------------- - is_student <- family$family == "student_t" + ## PRIORS ------------- + is_student <- family$family == "student_t" priors_made <- make_priors(user_priors = prior, - y = y, + y = y[y_index_list$y_obs_idx], + trials = trials[y_index_list$y_obs_idx], x = x_full, link = family$link, - offset = offset) - standata <- append_priors(standata, priors_made) + offset = offset[y_index_list$y_obs_idx]) + standata <- append_priors(standata, priors_made) ## EMPTY PLACEHOLDERS standata <- c(standata, empty_icar_data(n), empty_esf_data(n), empty_car_data(), empty_sar_data(n)) ## ME MODEL ------------- me.list <- make_me_data(ME, xraw) standata <- c(standata, me.list) - ## INTEGER OUTCOMES ------------- - if (family$family == "binomial") { - standata$y <- standata$y_int <- y[,1] - standata$trials <- y[,1] + y[,2] - } ## PARAMETERS TO KEEP ------------- pars <- c(pars, 'intercept', 'fitted', 'log_lik') if (!intercept_only) pars <- c(pars, 'beta') @@ -391,7 +400,7 @@ stan_glm <- function(formula, out$re <- re_list out$priors <- priors_made_slim out$x_center <- get_x_center(standata, samples) - out$ME <- list(has_me = me.list$has_me, spatial_me = me.list$spatial_me) + out$ME <- list(has_me = me.list$has_me, spatial_me = me.list$spatial_me) if (out$ME$has_me) out$ME <- c(out$ME, ME) if (has_re) { out$spatial <- data.frame(par = "alpha_re", method = "Exchangeable") @@ -402,8 +411,8 @@ stan_glm <- function(formula, out$C <- as(C, "sparseMatrix") R <- resid(out, summary = FALSE) out$diagnostic["Residual_MC"] <- mean( apply(R, 1, mc, w = C, warn = FALSE, na.rm = TRUE) ) - } + } + out$N <- length( y_index_list$y_obs_idx ) return(out) } - diff --git a/R/stan_icar.R b/R/stan_icar.R index c5a5ec14..52bf7503 100644 --- a/R/stan_icar.R +++ b/R/stan_icar.R @@ -286,11 +286,24 @@ stan_icar <- function(formula, if (missing(censor_point)) censor_point <- FALSE mod_frame <- model.frame(formula, tmpdf, na.action = NULL) handle_missing_x(mod_frame) + ## prep Y for missingness // y_index_list <- handle_censored_y(censor_point, mod_frame) - y <- y_int <- model.response(mod_frame) - if (family_int %in% c(1,2)) y_int <- rep(0, length(y)) - y[y_index_list$y_mis_idx] <- y_int[y_index_list$y_mis_idx] <- 0 - mod_frame[y_index_list$y_mis_idx, 1] <- 0 + mi_idx <- y_index_list$y_mis_idx + y_tmp <- model.response(mod_frame) + if (family$family == "binomial") { + trials <- y_tmp[,1] + y_tmp[,2] + y <- y_int <- y_tmp[,1] + } + if (family$family == "poisson") { + y <- y_int <- y_tmp + trials <- rep(0, n) + } + if (family$family %in% c("gaussian", "student_t")) { + y <- y_tmp + y_int <- trials <- rep(0, n) + } + y[mi_idx] <- y_int[mi_idx] <- trials[mi_idx] <- 0 + ## // if (is.null(model.offset(mod_frame))) { offset <- rep(0, times = n) } else { @@ -346,7 +359,7 @@ stan_icar <- function(formula, prior_only = prior_only, y = y, y_int = y_int, - trials = rep(0, length(y)), + trials = trials, n = n, input_offset = offset, has_re = has_re, @@ -363,13 +376,14 @@ stan_icar <- function(formula, ) ## ADD MISSING/OBSERVED INDICES ------------- standata <- c(y_index_list, standata) - ## PRIORS ------------- + ## PRIORS ------------- is_student <- family$family == "student_t" priors_made <- make_priors(user_priors = prior, - y = y, + y = y[y_index_list$y_obs_idx], + trials = trials[y_index_list$y_obs_idx], x = x_full, link = family$link, - offset = offset) + offset = offset[y_index_list$y_obs_idx]) standata <- append_priors(standata, priors_made) ## ICAR DATA [START] ------------- iar.list <- prep_icar_data(C, scale_factor = scale_factor) @@ -382,11 +396,6 @@ stan_icar <- function(formula, ## ME MODEL ------------- me.list <- make_me_data(ME, xraw) standata <- c(standata, me.list) - ## INTEGER OUTCOMES ------------- - if (family$family == "binomial") { - standata$y <- standata$y_int <- y[,1] - standata$trials <- y[,1] + y[,2] - } ## PARAMETERS TO KEEP with ICAR [START] ------------- pars <- c(pars, 'intercept', 'spatial_scale', 'fitted', 'phi', 'log_lik') if (type == "bym2") pars <- c(pars, 'theta', 'rho') @@ -442,6 +451,7 @@ stan_icar <- function(formula, R <- resid(out, summary = FALSE) out$diagnostic["Residual_MC"] <- mean( apply(R, 1, mc, w = C, warn = FALSE, na.rm = TRUE) ) } + out$N <- length( y_index_list$y_obs_idx ) return (out) } diff --git a/R/stan_sar.R b/R/stan_sar.R index 99a6fa6b..d4663bb8 100644 --- a/R/stan_sar.R +++ b/R/stan_sar.R @@ -247,6 +247,7 @@ stan_sar <- function(formula, if (family$family == "gaussian" | family$family == "auto_gaussian") family <- auto_gaussian(type = "SAR") stopifnot(!missing(data)) check_sar_parts(sar_parts) + stopifnot(sar_parts$n == nrow(data)) if (!missing(C)) { stopifnot(inherits(C, "Matrix") | inherits(C, "matrix")) stopifnot(all(dim(C) == nrow(data))) @@ -260,13 +261,25 @@ stan_sar <- function(formula, if (missing(censor_point)) censor_point <- FALSE mod_frame <- model.frame(formula, tmpdf, na.action = NULL) handle_missing_x(mod_frame) + ## prep Y for missingness // y_index_list <- handle_censored_y(censor_point, mod_frame) - y <- y_int <- model.response(mod_frame) - ## SAR: INCLUDE AUTO-GAUSSIAN AS family_int=6 ------------- - if (family_int %in% c(1,2,6)) y_int <- rep(0, length(y)) - ## ------------- - y[y_index_list$y_mis_idx] <- y_int[y_index_list$y_mis_idx] <- 0 - mod_frame[y_index_list$y_mis_idx, 1] <- 0 + mi_idx <- y_index_list$y_mis_idx + y_tmp <- model.response(mod_frame) + if (family$family == "binomial") { + trials <- y_tmp[,1] + y_tmp[,2] + y <- y_int <- y_tmp[,1] + } + if (family$family == "poisson") { + y <- y_int <- y_tmp + trials <- rep(0, n) + } + if (family$family %in% c("gaussian", "auto_gaussian")) { + y <- y_tmp + y_int <- trials <- rep(0, n) + if ( length(y_index_list$y_mis_idx) > 0) stop("Missing values in y; missing values are not allow for CAR/SAR models with continuous (non-count) outcomes. You may want to try stan_esf.") + } + y[mi_idx] <- y_int[mi_idx] <- trials[mi_idx] <- 0 + ## // if (is.null(model.offset(mod_frame))) { offset <- rep(0, times = n) } else { @@ -332,7 +345,7 @@ stan_sar <- function(formula, prior_only = prior_only, y = y, y_int = y_int, - trials = rep(0, length(y)), + trials = trials, #n = n, # getting n from sar_parts, below input_offset = offset, has_re = has_re, @@ -352,10 +365,11 @@ stan_sar <- function(formula, ## PRIORS & SAR DATA ------------- is_student <- FALSE ##family$family == "student_t" priors_made <- make_priors(user_priors = prior, - y = y, + y = y[y_index_list$y_obs_idx], + trials = trials[y_index_list$y_obs_idx], x = x_full, link = family$link, - offset = offset) + offset = offset[y_index_list$y_obs_idx]) if (is.null(prior$sar_scale)) { priors_made$sar_scale <- priors_made$sigma } else { @@ -375,11 +389,6 @@ stan_sar <- function(formula, ## ME MODEL ------------- me.list <- make_me_data(ME, xraw) standata <- c(standata, me.list) - ## INTEGER OUTCOMES ------------- - if (family$family == "binomial") { - standata$y <- standata$y_int <- y[,1] - standata$trials <- y[,1] + y[,2] - } ## PARAMETERS TO KEEP, with SAR PARAMETERS [START] ------------- pars <- c(pars, 'intercept', 'sar_scale', 'sar_rho', 'fitted', 'log_lik') if (family_int < 6) pars <- c(pars, 'log_lambda_mu') @@ -433,7 +442,8 @@ stan_sar <- function(formula, out$C <- as(C, "sparseMatrix") R <- resid(out, summary = FALSE) out$diagnostic["Residual_MC"] <- mean( apply(R, 1, mc, w = C, warn = FALSE, na.rm = TRUE) ) - } + } + out$N <- length( y_index_list$y_obs_idx ) return (out) } diff --git a/README.Rmd b/README.Rmd index dab402ef..5fb011b7 100644 --- a/README.Rmd +++ b/README.Rmd @@ -20,7 +20,7 @@ knitr::opts_chunk$set( ## geostan: Bayesian spatial analysis -The [**geostan**](https://connordonegan.github.io/geostan/) R package supports a complete spatial analysis workflow with Bayesian models for areal data, including a suite of functions for visualizing spatial data and model results. For demonstrations and discussion, see the package [help pages](https://connordonegan.github.io/geostan/reference/index.html) and [vignettes](https://connordonegan.github.io/geostan/articles/index.html) on spatial autocorrelation, spatial measurement error models, and spatial regression with raster layers. +The [**geostan**](https://connordonegan.github.io/geostan/) R package supports a complete spatial analysis workflow with Bayesian models for areal data, including a suite of functions for visualizing spatial data and model results. For demonstrations and discussion, see the package [help pages](https://connordonegan.github.io/geostan/reference/index.html) and [vignettes](https://connordonegan.github.io/geostan/articles/index.html) on spatial autocorrelation, spatial measurement error models, spatial regression with raster layers, and building custom spatial model in Stan. The package is particularly suitable for public health research with spatial data, and complements the [**surveil**](https://connordonegan.github.io/surveil/) R package for time series analysis of public health surveillance data. diff --git a/README.html b/README.html deleted file mode 100644 index 1561109b..00000000 --- a/README.html +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -

geostan: Bayesian spatial analysis

-

The geostan R package supports a complete spatial analysis workflow with Bayesian models for areal data, including a suite of functions for visualizing spatial data and model results. For demonstrations and discussion, see the package help pages and vignettes on spatial autocorrelation, spatial measurement error models, and spatial regression with raster layers.

-

The package is particularly suitable for public health research with spatial data, and complements the surveil R package for time series analysis of public health surveillance data.

-

geostan models were built using Stan, a state-of-the-art platform for Bayesian modeling.

-

DOI

-

Disease mapping and spatial regression

-

Statistical models for data recorded across areal units like states, counties, or census tracts.

-

Observational uncertainty

-

Incorporate information on data reliability, such as standard errors of American Community Survey estimates, into any geostan model.

-

Censored observations

-

Vital statistics and disease surveillance systems like CDC Wonder censor case counts that fall below a threshold number; geostan can model disease or mortality risk with censored observations.

-

Spatial analysis tools

-

Tools for visualizing and measuring spatial autocorrelation and map patterns, for exploratory analysis and model diagnostics.

-

The RStan ecosystem

-

Interfaces easily with many high-quality R packages for Bayesian modeling.

-

Custom spatial models

-

Tools for building custom spatial models in Stan.

-

Installation

-

Install geostan from CRAN using:

-
install.packages("geostan")
-

Support

-

All functions and methods are documented (with examples) on the website reference page. See the package vignettes for more on exploratory spatial data analysis, spatial measurement error models, and spatial regression with large raster layers.

-

To ask questions, report a bug, or discuss ideas for improvements or new features please visit the issues page, start a discussion, or submit a pull request.

-

Usage

-

Load the package and the georgia county mortality data set (ages 55-64, years 2014-2018):

-
library(geostan)
-data(georgia)
-

The sp_diag function provides visual summaries of spatial data, including a histogram, Moran scatter plot, and map:

-
A <- shape2mat(georgia, style = "B")
-sp_diag(georgia$rate.female, georgia, w = A)
-#> 3 NA values found in x; they will be dropped from the data before creating the Moran plot. If matrix w was row-standardized, it no longer is. You may want to use a binary connectivity matrix using style = 'B' in shape2mat.
-#> Warning: Removed 3 rows containing non-finite values (`stat_bin()`).
- - -

There are three censored observations in the georgia female mortality data, which means there were 9 or fewer deaths in those counties. The following code fits a spatial conditional autoregressive (CAR) model to female county mortality data. By using the censor_point argument we include our information on the censored observations to obtain results for all counties:

-
cars <- prep_car_data(A)
-#> Range of permissible rho values:  -1.661134 1
-fit <- stan_car(deaths.female ~ offset(log(pop.at.risk.female)),
-                censor_point = 9,
-        data = georgia,
-        car_parts = cars,
-        family = poisson(),
-        cores = 4, # for multi-core processing
-        refresh = 0) # to silence some printing
-#> 
-#> *Setting prior parameters for intercept
-#> Distribution: normal
-#>   location scale
-#> 1     -4.7     5
-#> 
-#> *Setting prior for CAR scale parameter (car_scale)
-#> Distribution: student_t
-#>   df location scale
-#> 1 10        0     3
-#> 
-#> *Setting prior for CAR spatial autocorrelation parameter (car_rho)
-#> Distribution: uniform
-#>   lower upper
-#> 1  -1.7     1
-

Passing a fitted model to the sp_diag function will return a set of diagnostics for spatial models:

-
sp_diag(fit, georgia, w = A)
-#> Using sp_diag(y, shape, rates = TRUE, ...). To examine data as (unstandardized) counts, use rates = FALSE.
-#> 3 NA values found in x; they will be dropped from the data before creating the Moran plot. If matrix w was row-standardized, it no longer is. You may want to use a binary connectivity matrix using style = 'B' in shape2mat.
-#> Warning: Removed 3 rows containing missing values
-#> (`geom_pointrange()`).
- - -

The print method returns a summary of the probability distributions for model parameters, as well as Markov chain Monte Carlo (MCMC) diagnostics from Stan (Monte Carlo standard errors of the mean se_mean, effective sample size n_eff, and the R-hat statistic Rhat):

-
print(fit)
-#> Spatial Model Results 
-#> Formula: deaths.female ~ offset(log(pop.at.risk.female))
-#> Spatial method (outcome):  CAR 
-#> Likelihood function:  poisson 
-#> Link function:  log 
-#> Residual Moran Coefficient:  0.0021755 
-#> WAIC:  1291.91 
-#> Observations:  159 
-#> Data models (ME): none
-#> Inference for Stan model: foundation.
-#> 4 chains, each with iter=2000; warmup=1000; thin=1; 
-#> post-warmup draws per chain=1000, total post-warmup draws=4000.
-#> 
-#>             mean se_mean    sd   2.5%    25%    50%    75%  97.5% n_eff  Rhat
-#> intercept -4.673   0.002 0.093 -4.843 -4.716 -4.674 -4.630 -4.497  1636 1.000
-#> car_rho    0.922   0.001 0.058  0.778  0.893  0.935  0.967  0.995  3214 1.001
-#> car_scale  0.458   0.001 0.035  0.393  0.433  0.455  0.481  0.532  3867 1.000
-#> 
-#> Samples were drawn using NUTS(diag_e) at Wed Oct  4 12:20:45 2023.
-#> For each parameter, n_eff is a crude measure of effective sample size,
-#> and Rhat is the potential scale reduction factor on split chains (at 
-#> convergence, Rhat=1).
-

More demonstrations can be found in the package help pages and vignettes.

- - - diff --git a/README.md b/README.md index 2ab76a71..775418be 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,9 @@ and model results. For demonstrations and discussion, see the package [help pages](https://connordonegan.github.io/geostan/reference/index.html) and [vignettes](https://connordonegan.github.io/geostan/articles/index.html) -on spatial autocorrelation, spatial measurement error models, and -spatial regression with raster layers. +on spatial autocorrelation, spatial measurement error models, spatial +regression with raster layers, and building custom spatial model in +Stan. The package is particularly suitable for public health research with spatial data, and complements the @@ -86,6 +87,7 @@ Load the package and the `georgia` county mortality data set (ages ``` r library(geostan) +#> This is geostan version 0.5.3 data(georgia) ``` @@ -95,7 +97,7 @@ including a histogram, Moran scatter plot, and map: ``` r A <- shape2mat(georgia, style = "B") sp_diag(georgia$rate.female, georgia, w = A) -#> 3 NA values found in x; they will be dropped from the data before creating the Moran plot. If matrix w was row-standardized, it no longer is. You may want to use a binary connectivity matrix using style = 'B' in shape2mat. +#> 3 NA values found in x will be dropped from data x and matrix w #> Warning: Removed 3 rows containing non-finite values (`stat_bin()`). ``` @@ -133,6 +135,12 @@ fit <- stan_car(deaths.female ~ offset(log(pop.at.risk.female)), #> Distribution: uniform #> lower upper #> 1 -1.7 1 +#> Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable. +#> Running the chains for more iterations may help. See +#> https://mc-stan.org/misc/warnings.html#bulk-ess +#> Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable. +#> Running the chains for more iterations may help. See +#> https://mc-stan.org/misc/warnings.html#tail-ess ``` Passing a fitted model to the `sp_diag` function will return a set of @@ -141,9 +149,8 @@ diagnostics for spatial models: ``` r sp_diag(fit, georgia, w = A) #> Using sp_diag(y, shape, rates = TRUE, ...). To examine data as (unstandardized) counts, use rates = FALSE. -#> 3 NA values found in x; they will be dropped from the data before creating the Moran plot. If matrix w was row-standardized, it no longer is. You may want to use a binary connectivity matrix using style = 'B' in shape2mat. -#> Warning: Removed 3 rows containing missing values -#> (`geom_pointrange()`). +#> 3 NA values found in x will be dropped from data x and matrix w +#> Warning: Removed 3 rows containing missing values (`geom_pointrange()`). ``` @@ -161,8 +168,8 @@ print(fit) #> Spatial method (outcome): CAR #> Likelihood function: poisson #> Link function: log -#> Residual Moran Coefficient: 0.0021755 -#> WAIC: 1291.91 +#> Residual Moran Coefficient: -0.0004015 +#> WAIC: 1290.5 #> Observations: 159 #> Data models (ME): none #> Inference for Stan model: foundation. @@ -170,11 +177,11 @@ print(fit) #> post-warmup draws per chain=1000, total post-warmup draws=4000. #> #> mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat -#> intercept -4.673 0.002 0.093 -4.843 -4.716 -4.674 -4.630 -4.497 1636 1.000 -#> car_rho 0.922 0.001 0.058 0.778 0.893 0.935 0.967 0.995 3214 1.001 -#> car_scale 0.458 0.001 0.035 0.393 0.433 0.455 0.481 0.532 3867 1.000 +#> intercept -4.620 0.055 0.418 -4.851 -4.719 -4.674 -4.627 -4.334 57 1.074 +#> car_rho 0.926 0.001 0.057 0.783 0.896 0.937 0.968 0.999 1494 1.002 +#> car_scale 0.457 0.001 0.035 0.394 0.433 0.455 0.479 0.529 3559 1.000 #> -#> Samples were drawn using NUTS(diag_e) at Wed Oct 4 12:20:45 2023. +#> Samples were drawn using NUTS(diag_e) at Tue Mar 19 14:14:50 2024. #> For each parameter, n_eff is a crude measure of effective sample size, #> and Rhat is the potential scale reduction factor on split chains (at #> convergence, Rhat=1). diff --git a/cran-comments.md~ b/cran-comments.md~ deleted file mode 100644 index 88d6be0e..00000000 --- a/cran-comments.md~ +++ /dev/null @@ -1,3 +0,0 @@ - - -Package was archived on CRAN due to gcc-UBSAN issues which stem from StanHeaders. StanHeaders has since been updated to fix this issue. diff --git a/docs/404.html b/docs/404.html index 7d80cb4f..f40cf104 100644 --- a/docs/404.html +++ b/docs/404.html @@ -39,7 +39,7 @@ geostan - 0.5.4 + 0.6.0 diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index dfd4bb61..99c4be3b 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 9298d5e7..665d0f87 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 @@ -50,6 +50,7 @@

GNU General Public License

+

Version 3, 29 June 2007
Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

@@ -68,7 +69,7 @@

Preamble

TERMS AND CONDITIONS

-

0. Definitions

+

0. Definitions

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

@@ -79,7 +80,7 @@

0. DefinitionsAn interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

-

1. Source Code

+

1. Source Code

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

@@ -88,23 +89,23 @@

1. Source CodeThe Corresponding Source for a work in source code form is that same work.

-

2. Basic Permissions

+

2. Basic Permissions

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

- +

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work’s users, your or third parties’ legal rights to forbid circumvention of technological measures.

-

4. Conveying Verbatim Copies

+

4. Conveying Verbatim Copies

You may convey verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

-

5. Conveying Modified Source Versions

+

5. Conveying Modified Source Versions

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

  • a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
  • @@ -117,7 +118,7 @@

    5. Conveying Modified Source Versi

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation’s users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

-

6. Conveying Non-Source Forms

+

6. Conveying Non-Source Forms

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

  • a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
  • @@ -137,7 +138,7 @@

    6. Conveying Non-Source Forms -

    7. Additional Terms

    +

    7. Additional Terms

    “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

    When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

    Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

    @@ -158,24 +159,24 @@

    7. Additional Terms -

    8. Termination

    +

    8. Termination

    You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

-

9. Acceptance Not Required for Having Copies

+

9. Acceptance Not Required for Having Copies

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

-

10. Automatic Licensing of Downstream Recipients

+

10. Automatic Licensing of Downstream Recipients

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party’s predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

-

11. Patents

+

11. Patents

A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor’s “contributor version”.

A contributor’s “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor’s essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

@@ -186,30 +187,30 @@

11. Patents -

12. No Surrender of Others’ Freedom

+

12. No Surrender of Others’ Freedom

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

-

13. Use with the GNU Affero General Public License

+

13. Use with the GNU Affero General Public License

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

-

14. Revised Versions of this License

+

14. Revised Versions of this License

The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

-

15. Disclaimer of Warranty

+

15. Disclaimer of Warranty

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

-

16. Limitation of Liability

+

16. Limitation of Liability

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

-

17. Interpretation of Sections 15 and 16

+

17. Interpretation of Sections 15 and 16

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

@@ -218,27 +219,27 @@

17. Interpretation of Sections

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

-
<one line to give the program's name and a brief idea of what it does.>
-Copyright (C) <year>  <name of author>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
<one line to give the program's name and a brief idea of what it does.>
+Copyright (C) <year>  <name of author>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

-
<program>  Copyright (C) <year>  <name of author>
-This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
-This is free software, and you are welcome to redistribute it
-under certain conditions; type 'show c' for details.
+
<program>  Copyright (C) <year>  <name of author>
+This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type 'show c' for details.

The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, your program’s commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

diff --git a/docs/articles/custom-spatial-models.html b/docs/articles/custom-spatial-models.html index 999e4e46..1825b657 100644 --- a/docs/articles/custom-spatial-models.html +++ b/docs/articles/custom-spatial-models.html @@ -40,7 +40,7 @@ geostan - 0.5.4 + 0.6.0
@@ -73,11 +73,13 @@ -
+
@@ -97,14 +97,14 @@

Arguments

Details

When rates = FALSE and the model is Poisson or Binomial, the fitted values returned by the fitted method are the expected value of the response variable. The rates argument is used to translate count outcomes to rates by dividing by the appropriate denominator. The behavior of the rates argument depends on the model specification. Consider a Poisson model of disease incidence, such as the following intercept-only case:

-

fit <- stan_glm(y ~ offset(log(E)),
-               data = data,
-               family = poisson())

+

fit <- stan_glm(y ~ offset(log(E)),
+               data = data,
+               family = poisson())

If the fitted values are extracted using rates = FALSE, then fitted(fit) will return the expectation of \(y\). If rates = TRUE (the default), then fitted(fit) will return the expected value of the rate \(\frac{y}{E}\).

If a binomial model is used instead of the Poisson, then using rates = TRUE will return the expectation of \(\frac{y}{N}\) where \(N\) is the sum of the number of 'successes' and 'failures', as in:

-

fit <- stan_glm(cbind(successes, failures) ~ 1,
-               data = data,
-               family = binomial())

+

fit <- stan_glm(cbind(successes, failures) ~ 1,
+               data = data,
+               family = binomial())

diff --git a/docs/reference/row_standardize.html b/docs/reference/row_standardize.html index b88c9dd7..1067c486 100644 --- a/docs/reference/row_standardize.html +++ b/docs/reference/row_standardize.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0
diff --git a/docs/reference/samples_geostan_fit.html b/docs/reference/samples_geostan_fit.html index 4a0089f1..1dc5459a 100644 --- a/docs/reference/samples_geostan_fit.html +++ b/docs/reference/samples_geostan_fit.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0
diff --git a/docs/reference/se_log.html b/docs/reference/se_log.html index cad91cd8..771180ff 100644 --- a/docs/reference/se_log.html +++ b/docs/reference/se_log.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0
diff --git a/docs/reference/sentencing.html b/docs/reference/sentencing.html index b694b4a0..bcdc98d3 100644 --- a/docs/reference/sentencing.html +++ b/docs/reference/sentencing.html @@ -18,7 +18,7 @@ geostan - 0.5.4 + 0.6.0
diff --git a/docs/reference/shape2mat.html b/docs/reference/shape2mat.html index 3d45fe40..b058e336 100644 --- a/docs/reference/shape2mat.html +++ b/docs/reference/shape2mat.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0
diff --git a/docs/reference/sim_sar.html b/docs/reference/sim_sar.html index 97b6c0a7..d60bf599 100644 --- a/docs/reference/sim_sar.html +++ b/docs/reference/sim_sar.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 diff --git a/docs/reference/sp_diag.html b/docs/reference/sp_diag.html index 4013a256..6aa8b6bf 100644 --- a/docs/reference/sp_diag.html +++ b/docs/reference/sp_diag.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 diff --git a/docs/reference/stan_car.html b/docs/reference/stan_car.html index 53fa676e..ade85f4a 100644 --- a/docs/reference/stan_car.html +++ b/docs/reference/stan_car.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 @@ -103,8 +103,8 @@

Arguments

re

To include a varying intercept (or "random effects") term, alpha_re, specify the grouping variable here using formula syntax, as in ~ ID. Then, alpha_re is a vector of parameters added to the linear predictor of the model, and:

-

alpha_re ~ N(0, alpha_tau)
-alpha_tau ~ Student_t(d.f., location, scale).

+

alpha_re ~ N(0, alpha_tau)
+alpha_tau ~ Student_t(d.f., location, scale).

With the CAR model, any alpha_re term should be at a different level or scale than the observations; that is, at a different scale than the autocorrelation structure of the CAR model itself.

diff --git a/docs/reference/stan_esf.html b/docs/reference/stan_esf.html index 548cca55..85d5f473 100644 --- a/docs/reference/stan_esf.html +++ b/docs/reference/stan_esf.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 @@ -110,8 +110,8 @@

Arguments

re

To include a varying intercept (or "random effects") term, alpha_re, specify the grouping variable here using formula syntax, as in ~ ID. Then, alpha_re is a vector of parameters added to the linear predictor of the model, and:

-

alpha_re ~ N(0, alpha_tau)
-alpha_tau ~ Student_t(d.f., location, scale).

+

alpha_re ~ N(0, alpha_tau)
+alpha_tau ~ Student_t(d.f., location, scale).

data
diff --git a/docs/reference/stan_glm.html b/docs/reference/stan_glm.html index 0377e74c..6dcc5e1a 100644 --- a/docs/reference/stan_glm.html +++ b/docs/reference/stan_glm.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 @@ -98,8 +98,8 @@

Arguments

re

To include a varying intercept (or "random effects") term, alpha_re, specify the grouping variable here using formula syntax, as in ~ ID. Then, alpha_re is a vector of parameters added to the linear predictor of the model, and:

-

alpha_re ~ N(0, alpha_tau)
-alpha_tau ~ Student_t(d.f., location, scale).

+

alpha_re ~ N(0, alpha_tau)
+alpha_tau ~ Student_t(d.f., location, scale).

data
@@ -278,9 +278,9 @@

Spatially lagged covariates (SLX)shape2mat), \(WX\) is the mean neighboring value of \(X\), and \(\gamma\) is a coefficient vector. This specifies a regression with spatially lagged covariates. SLX terms can specified by providing a formula to the slx argument:

-

stan_glm(y ~ x1 + x2, slx = ~ x1 + x2, \...),

+

stan_glm(y ~ x1 + x2, slx = ~ x1 + x2, \...),

which is a shortcut for

-

stan_glm(y ~ I(W \%*\% x1) + I(W \%*\% x2) + x1 + x2, \...)

+

stan_glm(y ~ I(W \%*\% x1) + I(W \%*\% x2) + x1 + x2, \...)

SLX terms will always be prepended to the design matrix, as above, which is important to know when setting prior distributions for regression coefficients.

For measurement error (ME) models, the SLX argument is the only way to include spatially lagged covariates since the SLX term needs to be re-calculated on each iteration of the MCMC algorithm.

diff --git a/docs/reference/stan_icar.html b/docs/reference/stan_icar.html index eb7e5e58..957b6e08 100644 --- a/docs/reference/stan_icar.html +++ b/docs/reference/stan_icar.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 @@ -106,8 +106,8 @@

Arguments

re

To include a varying intercept (or "random effects") term, alpha_re, specify the grouping variable here using formula syntax, as in ~ ID. Then, alpha_re is a vector of parameters added to the linear predictor of the model, and:

-

alpha_re ~ N(0, alpha_tau)
-alpha_tau ~ Student_t(d.f., location, scale).

+

alpha_re ~ N(0, alpha_tau)
+alpha_tau ~ Student_t(d.f., location, scale).

Before using this term, read the Details section and the type argument. Specifically, if you use type = bym, then an observational-level re term is already included in the model. (Similar for type = bym2.)

@@ -315,48 +315,48 @@

BYM2

$$ \tau \sim Gaussian(0, 1) $$

The terms \(\tilde{\phi}\), \(\tilde{\theta}\) are standard normal deviates, \(\rho\) is restricted to values between zero and one, and \(S\) is the 'scale_factor' (a constant term provided by the user). By default, the 'scale_factor' is equal to one, so that it does nothing. Riebler et al. (2016) argue that the interpretation or meaning of the scale of the ICAR model depends on the graph structure of the connectivity matrix \(C\). This implies that the same prior distribution assigned to \(\tau_s\) will differ in its implications if \(C\) is changed; in other words, the priors are not transportable across models, and models that use the same nominal prior actually have different priors assigned to \(\tau_s\).

Borrowing R code from Morris (2017) and following Freni-Sterrantino et al. (2018), the following R code can be used to create the 'scale_factor' \(S\) for the BYM2 model (note, this requires the INLA R package), given a spatial adjacency matrix, \(C\):

-

## create a list of data for stan_icar
-icar.data <- geostan::prep_icar_data(C)
-## calculate scale_factor for each of k connected group of nodes
-k <- icar.data$k
-scale_factor <- vector(mode = "numeric", length = k)
-for (j in 1:k) {
-  g.idx <- which(icar.data$comp_id == j) 
-  if (length(g.idx) == 1) {
-       scale_factor[j] <- 1
-       next
-    }    
-  Cg <- C[g.idx, g.idx] 
-  scale_factor[j] <- scale_c(Cg) 
-}

+

## create a list of data for stan_icar
+icar.data <- geostan::prep_icar_data(C)
+## calculate scale_factor for each of k connected group of nodes
+k <- icar.data$k
+scale_factor <- vector(mode = "numeric", length = k)
+for (j in 1:k) {
+  g.idx <- which(icar.data$comp_id == j) 
+  if (length(g.idx) == 1) {
+       scale_factor[j] <- 1
+       next
+    }    
+  Cg <- C[g.idx, g.idx] 
+  scale_factor[j] <- scale_c(Cg) 
+}

This code adjusts for 'islands' or areas with zero neighbors, and it also handles disconnected graph structures (see Donegan and Morris 2021). Following Freni-Sterrantino (2018), disconnected components of the graph structure are given their own intercept term; however, this value is added to \(\phi\) automatically inside the Stan model. Therefore, the user never needs to make any adjustments for this term. (To avoid complications from using a disconnected graph structure, you can apply a proper CAR model instead of the ICAR: stan_car).

Note, the code above requires the scale_c function; it has package dependencies that are not included in geostan. To use scale_c, you have to load the following R function:

-

#' compute scaling factor for adjacency matrix, accounting for differences in spatial connectivity 
-#'
-#' @param C connectivity matrix
-#'
-#' @details
-#'
-#' Requires the following packages: 
-#'
-#' library(Matrix)
-#' library(INLA);
-#' library(spdep)
-#' library(igraph)
-#'  
-#' @source
-#'
-#'   Morris, Mitzi (2017). Spatial Models in Stan: Intrinsic Auto-Regressive Models for Areal Data. <https://mc-stan.org/users/documentation/case-studies/icar_stan.html>
-#'
-scale_c <- function(C) {
- geometric_mean <- function(x) exp(mean(log(x))) 
- N = dim(C)[1]
- Q =  Diagonal(N, rowSums(C)) - C
- Q_pert = Q + Diagonal(N) * max(diag(Q)) * sqrt(.Machine$double.eps)
- Q_inv = inla.qinv(Q_pert, constr=list(A = matrix(1,1,N),e=0))
- scaling_factor <- geometric_mean(Matrix::diag(Q_inv)) 
- return(scaling_factor) 
-}

+

#' compute scaling factor for adjacency matrix, accounting for differences in spatial connectivity 
+#'
+#' @param C connectivity matrix
+#'
+#' @details
+#'
+#' Requires the following packages: 
+#'
+#' library(Matrix)
+#' library(INLA);
+#' library(spdep)
+#' library(igraph)
+#'  
+#' @source
+#'
+#'   Morris, Mitzi (2017). Spatial Models in Stan: Intrinsic Auto-Regressive Models for Areal Data. <https://mc-stan.org/users/documentation/case-studies/icar_stan.html>
+#'
+scale_c <- function(C) {
+ geometric_mean <- function(x) exp(mean(log(x))) 
+ N = dim(C)[1]
+ Q =  Diagonal(N, rowSums(C)) - C
+ Q_pert = Q + Diagonal(N) * max(diag(Q)) * sqrt(.Machine$double.eps)
+ Q_inv = inla.qinv(Q_pert, constr=list(A = matrix(1,1,N),e=0))
+ scaling_factor <- geometric_mean(Matrix::diag(Q_inv)) 
+ return(scaling_factor) 
+}

diff --git a/docs/reference/stan_sar.html b/docs/reference/stan_sar.html index 3e2393e6..3bb59861 100644 --- a/docs/reference/stan_sar.html +++ b/docs/reference/stan_sar.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0
@@ -103,8 +103,8 @@

Arguments

re

To include a varying intercept (or "random effects") term, alpha_re, specify the grouping variable here using formula syntax, as in ~ ID. Then, alpha_re is a vector of parameters added to the linear predictor of the model, and:

-

alpha_re ~ N(0, alpha_tau)
-alpha_tau ~ Student_t(d.f., location, scale).

+

alpha_re ~ N(0, alpha_tau)
+alpha_tau ~ Student_t(d.f., location, scale).

With the SAR model, any alpha_re term should be at a different level or scale than the observations; that is, at a different scale than the autocorrelation structure of the SAR model itself.

diff --git a/docs/reference/waic.html b/docs/reference/waic.html index 83e318d3..4e7f7083 100644 --- a/docs/reference/waic.html +++ b/docs/reference/waic.html @@ -17,7 +17,7 @@ geostan - 0.5.4 + 0.6.0 diff --git a/inst/stan/parts/data.stan b/inst/stan/parts/data.stan index d63670f0..ec03310e 100644 --- a/inst/stan/parts/data.stan +++ b/inst/stan/parts/data.stan @@ -6,11 +6,13 @@ int center_x; -// censored counts +// missing y int n_mis; int n_obs; array[n_mis] int y_mis_idx; array[n_obs] int y_obs_idx; + +// censored counts int censor_point; // outcome diff --git a/inst/stan/parts/gen_quants_declaration.stan b/inst/stan/parts/gen_quants_declaration.stan index aa261023..4a23b0cc 100644 --- a/inst/stan/parts/gen_quants_declaration.stan +++ b/inst/stan/parts/gen_quants_declaration.stan @@ -1,5 +1,5 @@ // any other declarations in this block must be made *before* this included file - vector[is_auto_gaussian ? 1 : n] log_lik; + vector[is_auto_gaussian ? 1 : n_obs] log_lik; diff --git a/inst/stan/parts/gen_quants_expression.stan b/inst/stan/parts/gen_quants_expression.stan index a476e662..6795bd96 100644 --- a/inst/stan/parts/gen_quants_expression.stan +++ b/inst/stan/parts/gen_quants_expression.stan @@ -18,17 +18,17 @@ eigenvalues_w, n); } - for (i in 1:n) { + for (i in 1:n_obs) { if (is_student) { - log_lik[i] = student_t_lpdf(y[i] | nu[1], fitted[i], sigma[has_sigma]); + log_lik[i] = student_t_lpdf(y[y_obs_idx[i]] | nu[1], fitted[y_obs_idx[i]], sigma[has_sigma]); } if (is_gaussian) { - log_lik[i] = normal_lpdf(y[i] | fitted[i], sigma[has_sigma]); + log_lik[i] = normal_lpdf(y[y_obs_idx[i]] | fitted[y_obs_idx[i]], sigma[has_sigma]); } if (is_poisson) { - log_lik[i] = poisson_lpmf(y_int[i] | fitted[i]); + log_lik[i] = poisson_lpmf(y_int[y_obs_idx[i]] | fitted[y_obs_idx[i]]); } if (is_binomial) { - log_lik[i] = binomial_lpmf(y_int[i] | trials[i], fitted[i]); + log_lik[i] = binomial_lpmf(y_int[y_obs_idx[i]] | trials[y_obs_idx[i]], fitted[y_obs_idx[i]]); } } diff --git a/inst/stan/parts/model.stan b/inst/stan/parts/model.stan index 7b03b88f..1d8b9680 100644 --- a/inst/stan/parts/model.stan +++ b/inst/stan/parts/model.stan @@ -5,6 +5,7 @@ if (dx_all) target += normal_lpdf(append_row(gamma, beta) | prior_beta_location, prior_beta_scale); if (has_sigma) target += student_t_lpdf(sigma | prior_sigma[1], prior_sigma[2], prior_sigma[3]); if (is_student) target += gamma_lpdf(nu[1] | prior_t_nu[1], prior_t_nu[2]); + // data models (observational uncertainty) if (dx_me) { if (spatial_me) { @@ -32,20 +33,24 @@ target += normal_lpdf(mu_x_true | prior_mux_true_location, prior_mux_true_scale); target += student_t_lpdf(sigma_x_true | prior_sigmax_true_df, prior_sigmax_true_location, prior_sigmax_true_scale); } + // partial pooling of observations across all groups/geographies (varying intercept) if (has_re) { target += normal_lpdf(alpha_re | 0, alpha_tau[has_re]); target += student_t_lpdf(alpha_tau[has_re] | prior_alpha_tau[1], prior_alpha_tau[2], prior_alpha_tau[3]); } + // process model (likelihood) if (!prior_only) { - if (is_student) target += student_t_lpdf(y | nu[1], fitted, sigma[has_sigma]); - if (is_gaussian) target += normal_lpdf(y | fitted, sigma[has_sigma]); + if (is_student) target += student_t_lpdf(y[y_obs_idx] | nu[1], fitted[y_obs_idx], sigma[has_sigma]); + if (is_gaussian) target += normal_lpdf(y[y_obs_idx] | fitted[y_obs_idx], sigma[has_sigma]); if (is_poisson) { target += poisson_lpmf(y_int[y_obs_idx] | fitted[y_obs_idx]); if (censor_point > 0) target += poisson_lcdf(censor_point | fitted[y_mis_idx]); } - if (is_binomial) target += binomial_lpmf(y_int | trials, fitted); + if (is_binomial) { + target += binomial_lpmf(y_int[y_obs_idx] | trials[y_obs_idx], fitted[y_obs_idx]); + } } // ICAR @@ -59,6 +64,7 @@ phi_tilde ~ icar_normal(spatial_scale[1], node1, node2, k, group_size, group_idx, has_theta); if (m) target += normal_lpdf(alpha_phi | 0, prior_alpha[2]); } + // ESF if (dev) { target += std_normal_lpdf(z); @@ -68,6 +74,7 @@ target += inv_gamma_lpdf(aux2_global[1] | 0.5, 0.5); // .5 * nu_local, .5 * nu_global, both = 1 target += inv_gamma_lpdf(caux[1] | 0.5*slab_df, 0.5*slab_df); } + // CAR if (car) { target += student_t_lpdf(car_scale[1] | prior_sigma[1], prior_sigma[2], prior_sigma[3]); diff --git a/man/figures/README-unnamed-chunk-5-1.png b/man/figures/README-unnamed-chunk-5-1.png index 29d309fcf89669878b08b3733ed9260e39635347..703ce6e820e78c39791ae51e458241348003e063 100644 GIT binary patch literal 57740 zcma&Obx>7b_%FOcxqizRDO%Hx8(T($w!UC{ zqj$slT-j9VMPtKUsaBQV#dPVUo*kaPRYM-t$B)H*MsI08FyqJ|m_I)75liB~?ep!* z_Pyob_FF#7LS&{J_M%lN8izrGgAEd+j0=KmErJgeqr?LL-?h(yg#&kDA(?-J!K3`2 zM?AwQhQ$B-Gm)bhJkryXu=)a@F^WAsBS;K^)K3S-v_=P&fR&k<`M^e;GOiOQQ9(La z&BDSWEJPslPj4?`s6^tIFO)A?SXi?CE@$IjNFICoiiv$gr11T=eb%OiR-xVIb!Hh5 z5Fn7*>3*o!pl4@s5{6Dvpi%NrUt8;Zc`!>(PHxV56T`bSf_k~=v7C!mU01g+5%dB} zuB!l(Nh~HN#%eeV4<%HX1qp7HZ;p7 z|6~d_<>tPip|M!*^oyksHEMNb;MCI9<+u3#xHFm$1NHRu2xQt1B(b0&NK)hM5`dEl8+07-cokqs z6{1m6phh2#Ng<;WaDVZJfPkPx)3*NLsOvF{*C8t;mCEC}bpFe-*bXXGF&?y=} zoNL%0R~2>h@R(*hK0g<7KS-&na!5u}GcXujKl!SX`7uK!m9wy>hC@(r-kJy_oJ7R; z`tGR9flrPS>+8nG7kF{J#b%a0FDOWmR0OxVFEc?QWTD=&8VT&2Bw$7475p~n;~7%i>I$A>FX zD=RBZ%-FuZK5*$+z5Z1%PokKZt zO-+r=062*Aeq9TSR(7E4N0Wq>FG&LLz5}!QCVGG-P)>0@#z_K ze0AmF?96#V!D8I$J6mfZ69UdU4?5%EzyOyX&%3GeFakJ4#Mkt=nJPu9#>sNj&MgZv z>Erpbv1qSn@R@Z2d)JQ^+pOx*!n;Rz&nuM|!@&i`{O^Kd{6tLxtH^GSn-rsnLN()D^$CUl_4nTm{r&xy zmzPKFXDZs-+A=b~-c@zr6B7$~pYNQk_eM$O(I_S@G&`;TU2Hqs9>&DP%;vOExC`I_ zWfKZIw1J_-lJi*K-Q@=>?e6MGHCtrS`lA@7kl(HA_*Z3cfy>Lw3r4M97pdHz4zOX9 z^G6n6q1_KKSu95Z4PD|Nh_jg1XOz`qml z;W-Eg!7+Ry7v9@>x;=fEQCSKW-CDS)9+fPio557BFsCU{q)kykxxc7KBco|!a`SWUF76=^S%ui6-N5-i@&wF@Q|9@*~1y@vz%;rYTBR@?qo{puU3&t#v@);~o zx^mIDj~lrg%*5!Q&7NCR ziUNtn#Adtfey*#k61fe>AwX=P0B18)jDWCU`Nygwtx5){+@Q7n-P)QOUlW^KS)De1 zIfn@a-tDOGwz!O|W}ZfWLV!kkW71FdtArUy0VePeL&Yixpu&lyRZc6=WCTS)HdoDC zk5q16&ej%9HC?BCCXs3RcmHTCSS_IO=a04;a)Wop48o_BdtALfS%2~31q8Jii1=K- z#|U@1*wYFKc+5&dHGO{Ww2r3g*Bi^LcMSI74;@zUG_9w%dmNdW(NR~=)hO8-N>9$r z^t->kNJ&Y_!bdS>a(Xwdz@PDXIY4%PzBk~uWVt|I2KC`A`?1fwmOLIETyarQBz7H` z4O`E_vk6!Y2w&N1st&-~AX*EyA>Uo8&U7u01%npx_X{F;w8PV*-&i-yftr&g;AXow zQ3B5D(~|aP1FQU;qSBxxZ+y4&@!?K73jd;>`Ds_|PJW}bmaC!^6!Zay25=48((1RM zXT0_cV)>(>h`c30LD?(j8zS|Hu2QwY4?gW#76Y_=CrZiHZ99dOm)B zqL_CLdfdbn8YQj*nH?R%oW*MNBi8kqnVJ5n2CTiSj(so)Ax@5taSDYWrrekl6$({~ zTpS&%4NF^F1#lwaAZr^Nb;d+@cXt&P70y(&*k1iEwfs@;SFiX51D?xe=h8(P9ol=2K%Q$@^-Kb#}t&!&>oMDsWQU8Lxf)ZEZ_6O6qH6Sd$g0 zKdUV5oNf*PIHX^1t!`jIsu_3-vq`{4HHRs&6e~)Fg7rRR&aQaVS(IYkTM;x(HMSy+ zJ^-DIehm-Lk8LJe6q;jtK#80=v5h|#9&gb%#D@+VKS&4evlE19v_OSAm(v2o>IaMdh0VTu~VUhA9j zL{yiynrcb}AM%zKmxfLLLPQ#YN7yX`*hW5q_U8K9pu@Xih!T>c2wpktV1IS7+v&%G zj{elty%t>C}cdeNxnITaDVJPq2AXbCSvpF*uiTu$J$zXDGOAOvo%P@4J zU{ax>KeRX{m6dFVsu^>{6udt5c4F#SEaxc#go0cE;jUV^KOAs*Vaet3s_Y)w&hUC9*IUdcI)hw+^FYoMJ z`o6?Bg}D9UP1)q(=if_zK7FW5qUJC^Hc4&QsyL<cdlG1m&j6+9gJ&+q9-$@6b5l-r}}C^!$w@Uq)S>i>e|AB>=kR&yR)WsW<9d z)9|>=n^$2yFflE48)Pbe&FlsT2cNGm8Cm98ef$`epBF}gu2C|v?0?_&y{1CK1#BFN z-18zYpXT&{GV%No+XmvOhKuw88N0B7ZJ%32z5X|$=Zc`7c+s$@4uVbirp5)_q@_bO zO3p7Xr1i2T5RgXxjoX1e-N@Y)UGyS;R|YkMG&7@Eg)#A?*6T_N-+$Lm)+T|Y3b|@K zhh*9N}>9EGrSPc zPm}W}Z5@_7h4}+%AT)HKIW9^lo_w=V zmJ)`h0=!uM{j+w0&I=w$j4Gb}%sCkLpYn9n&kHHWp~b~TSCp}%AkfNR4y?%v zg*cH?usy!k?ooL?)7{-;VQ~-W(U-wGlKG#k&SKJxuwzI zw4W|JgU@LVpni5Na}%nBegR{i=VM0odKFROH*$hc6yTb#0R;{oUN5?lBYCfIe3x%B z)Rp3_75m3ZN{U_rT}bon%)i%kI4_PQFuAxSgG0~<-l~;oVzjlkv=Bj{IXrY`UQ*K` z-k5K1!9d)^=)d5NpBvp<3|0eIS$N6TFl1O!D@MSvI2 zjg4t+c;24xGHI9ZIIF*~1N#hs?4z9>LUQt@hEVskv@}LW#(($sJ*G99jCL;f1jfEK zpsOvmc|3tjKwAyzkqfG-oi~4j#W^@Qn1yeilQX`nMn7>Mjv4+drm=P~YQsQZzf6rD zPa!lpIoW5weDEs*>(IQ;=<3AOj>~j~No+SSH&1J4#2*`bdmhFbdMuPsDtRaQP`&(< zt1}+-PoIdnBiL|nZ*K+o_^7)c!u$;iHJtb|76uXP2s)O&62?6!5aMK@Tw4&a(r|u7w(@@lMN=i%RO^xWDtx2C%}a9Go@> zzS8I2-m-_ZhkyM_i_!FFc{rdi?(K;avgN+Qa=>+*3h$>C1ZZY<7O-n{65%QDDss8U zuTgk885yKFk+@`JhdVobE?a~3_1yZF9tSfg0HXJAI^Qc4-)z>}ULhN*n7{Dc+ z0RV()E~9sy#h{s;m$#`~Fhj)8`(ker@cswzx!Tm&<+5KgFfj1*w-gl;($CD#GvO%| zYDCuXZ!g4!g@rA&pYEh!YodPV<>BO`ZA}`G{DgjQtWbEmntw17x4mlu+We#eadLJ* zPGJ~{Kql+DJ$^zzx9>?98hz^wJS`T|`5sTE3IR%J<6xzJ69&W{@Zfu|Kpu+->C{=q z$WfzUVj4HtCU(vkN=kMEo&^H|-G$w?3z6S-2gp5}Wu1zEILteA3Hw|g+}~Yw?fC%Z z=%xL#JO!`6Eh4L{o12|I>rOiaC)BA)b#hKEU#Ri45K6>kJctvm7s!TkEf z0|bw`5hKj>A#x61H2kQcA=WcgYM*avJ3+Ew^-$wPJ_PWAO$@HeycN1SJuWsjwz2O? z51@LEd<(1H;TNxoW5T*u0in-Tv-aUb*lLLKh)cdQ@woo`0q>=5piAM zHV&o_uySgg{tw89cM4&ygv2pZl@sB4c@m-l0kYxS@U3!2ols!#4_IkMt}HPmG$aY! zPerN}X6%>H%$!q4eRRLw=g@Fz9bL1LrhL4HSIox7#^X*kItP+IL?jz~dtbH7$gS|> z`aB&R9ABfK*p$n8S51=`fy{Q6x z%}`8Qx(BE?#hQCh?N(YHtR@UnK9dyquh!O{^=9FebiG^x0{)8vvNJf9W#3KMW3xp7 zpA*Pb$sdKFgTupk1S1`0?OZiV2U?U+iL%Mo=4JuDw-aJLKg&^nnfflTQ=Szv`7c+mL!C7;s$>ejSOIt{JdwY9& z{_HqM3kXvdT+hfL7xs_tFh3~|%l4nl`OP(P0ZCh1TWxLpknemxm*u+$V37ip{CG1Q;O_Yd#NJR;f~4eR&;tdz zx$B>QmM}t|EGh9m1PZFd_}9OhfoS6Cz8t&jZCpil9yjc9?#J3Qa8&a_&=H@05q?U3+j~epbnwxl|3yvyiLw;&mx@?jPMOmEO zWkxLuqakDAps&x7Dn8|&T9lI!?vnJN_ZxGmKWupSY`x9v^uwBuQBgopy#M#FobBxR z`1-gT6WweW9UCR|O_k9r<$+e$U7S#fQ6{ml(9HMdH>aDi@aX$(?s}b&1lcEjUg#jvGJjiON)36Q#`T)xai`{AubWC#R!~F33k;Fw}$ODU>U3 z%7ID<1$M8_9M}qxt5V~{Px11R+8@X1ye2EIRMAn_#U{cQ3izuu?#HM*%p%W>AJx4I zK>z?tQI%8?w6(N6gC=aFakSDnu@7zGKoE_!283A3+)hGUqJOW1-;v<=f;1K?-HyEaOD} z?CGI-Ap%3Bqy+hjbhX#c3{9d#D+4*9VesijB*Z)Wl3c82hTZENgpKe5;@-kfssM^g zwg@`()Uw;X&b;;TBcu)f-ERXMp<`Gy*{S7W{Ae}IPPLlU)u4WtP2Sug)_dqj7W6AbO2E<4(Lou+B>F@jLE8#h1u~15kcyjI4CW9M zJ^RRST7Q3kqN}4`4078qlhU*aBzqQ?`U@|G{7zdD|_}E`NA`$NQ#gOVsc8b+0HbnaBao z$lt0%7$l7F=P03HQ9xTSR6$%=l$WByCSqV=sA{yzAKh75!J-<~?W*nUG-6GD;iu&$ zKt>!>`TRth3LAU7uZ*U-*=zQ*h2;leRfMbpWusKPLB|+Sz2IO;!MJhqoo&0u>(b<+ zA~DM2(^K1{us9<#p26PN>)9>U(baHp(BPFXSm_cs%>7w1D%6C97CPEFc9PS=@l;b~ z^1th`U@Zg4J!ILdJ4E)54agp*kp-x{AI>S&VD`!!TNa+vskGm0rE8WteYT>zx!KOH zaAg?Xb$voy-Ql3J9{lTogN1=i{$%h2Nf}(2l)Q0UuEzJH*&=f_W;?PJs|;T*|Gs{s z7HBPsv=EM|#hIEZZY2B@C(LOC0K2kD4nlwJDMgyGYl2apBtRbIP{&3fW2n4vWIsJ1 zb!}yZ(x$Y@xk8Gu&`aOd*^Mw-WqNE3wyygY=IIElXAds+r|D>D+*)9NuAh|8d%6l3 zf?M)JSxycFRf8@7q-fSztg&G=`9kNQZ;n#GHr>Tws2V?6_Pj1}ubyzY^EzJn-WQ)= zQ6-)~uR>Z!Rw2_}!kFB@2|?}sqC`cFQ;S1G8hr6|k(zH?-qyv?d{WAd>z{0BfEfv$ zy9(0ELO>yovF!PXheHzG1k|zWb8BlGj&&zCM#eM_GZ~-FlG0LGsJXcrf=u#XN6;K( zW|o|=84_|LBE}-U6V7E8&l$xLxl;-dxSV$gLPuW0f}piQSV*o=Bj6F*k37+`+O_s`P|4ZwqwF3T zZiy6=S*3|qHa2icNbZ1++~h$KDgh9Lv$L~OQH0dmP&)5?TdqvLc&^&5J-;0+UQQ4w zV88^5&_(}+6fb9PQ(9Al-F_VGCX)hm0{|(&r54neOCRKOp*5M~ro%xdAd+8h#vUJK zWX|t;@Yc2eTV7|C{6<@bS$C{K;?j&BSK;kj>~zDISV$EG$}fPF7T@1EyWJ`WW1*#` zn_f{Op3B}t)ARN9V+wnG4`+a#n_FUfSy`d5n}DI2+4{Qd@Eo1>BNYe7$to(VVJj{v z=|3PQg56zUm~O(J0^Cf!lJJ|-AXfGWj?K-@DFWbh>Ekjef`wr-{&n@l6QI1xA1{z_ zA`8Gy&L90|ANmZAAmFj(O{HtUc0n<{hNfon`&W*@c9WtSou6-}`lMT+5y{(d2-HEG zX>H5-@ScnLc&W37&fsz?yL<+jq)QP>E(K;H~WvTQfECk_HUSNjKVO&tQNX_TfWvyph?jXeTG9 z7N_-JBe|Bgh&r%QJ^ojV9#vuj`cL|@AiM3zILrr$RRBPN-XlxlH&HWyh)%4jrPX6u zH!v_zS2w@Iu&78+Pp{MAeWCBraj_mNnx?(aBlyn!80=DjVg1)*czGO_m~m0!zk^fu z$NM|DzwI!559bR`+G+byHqClGfUg8EWu5dT@fowEk|0-%)diq71 zJoV?_rKROX@J5=Cz#j!3x{r^KyjkyOo9ds?|IPv|Kf5CWR@A3YpX6FT0BPWAIUxJH z3D_@#8T@ry(u8+~ipdC=d>P3FTlQIcGYFb)aIyy63wHU5V>;(Y&0VUkc%`M>Z zzNv7`c8cHYlsc+M;?tz9n}mb}XyaB=dkFsrjXyul$SA;5 ze^&eK|3m2&C~Qf}wMr_Pb!&%by|SYQHhZEP7`0Rt;cAc&#(S1=hggQReU*5qaH6`Y zs0R1+m1xJ2kJff=zUswxbolxHi_mYf*VfdALktI=%8PY-`@c?3C&jYF(QnCv;>ZEPM>#s^M5b(*03JNwh`V&e@ zN`O%bY*L`5nbhb2Z|}+2^Y*?4s=VmK^*SPg8~uj!%}kBiE8?M^C<0!)x$~-k`?8^< zG~GJOSFc`Wium3B2t@_HK7eUtaip!^Zn@}GGWdXR3?TTNffsfinSFXH7Q;<&8-C@CwG z@!Drx=+=dVhK7!gj>`G;0sW&2u=RE%#c6{4eMuof*W#TChK=Uya~oUVeB7A1Zs=#Ri*`0@o;R8%xk;bO_>2p$0egM^2fit5MwynetM8y>IhH*fO_6`hrvL^#KaIJN83XOj9}27=c%?qw4>8* zo<~x>?I#eTu#w(l}|GuaE(t59*(J2tO@d*g#v({jC89|{-PfwqJZ#1gKJ}?l{{R0^e7Ro6t zpRm?mS{N*QKDOgp+G30JRF%PbMnpuU`aYMRpVXT-J|A%;ov6bd<`-)WbDCfg82z^0<41fmWZ0&aUi-$+P!ihw)_7Utwoiij8) z>zz?NUWZ?_<*OBIm1!Hcd!B&($jHjt>9()ks}Y$CJ3#?b8@}(4@8i?c?-*Y z!-L{}RR{3LI9N4Rn{bn$~!MD$0cw9Hq6#cb{Fz_0|KR)ujFIh3PDPenxqJl)l` zwOWs(rS5Rdm+KG|FIV8eGUmg0byi!ObugR%xxcz%zi;;Q!UG8Il;jkZ(*eL(T4~vk z3Ol7`LY9ej*vky!C-%;@dKG_s&q0Ur^zz<2d!eA9h|B{(6^IRi1M?$C{DMghOK z&w#;ux0!5wnIk7-(B*#*#ARUakHk`bau*KUQrlOf|1vT%^6QsOjLaD*LPpl}>_AXD zzVY2?ZfTj_>9=>E8l%C9GzSF&RAW%~r1dny!@}%ms$o(yIm~_mkMly%$I~-I$O{Jo zUCBp2O4mugpA7+nIri95T^$<=6tQ0z!4!RecDj`R3tcQa_-fMjRrc_7Z^z!MQ;SHw z`_&~U_1$cpI6@Xfp$3D4{Zvu34R=~=SQsS)G>+rdNGNb^4F@bzT$G;evuq(2C6&eo zS|ak;CezEty1INd;g$tG#>u(-$PIBEq-#R7U&S1KV$Zw+qk7i*`s75ijWsoK$;mOG z6-U0atsz0@4LJZqEiJb|#!DuK_yU|A(2}zGoFuBC(C}~yVQ)>Uc*>=JVA+$TO<{S! zKw=cTzIT_0KYmD%$A%YY6&dl3&!d8_HO#=u^O`aL45;?7&@l*15ch0T1+dHEu97&k zbChQ)vjS=j(m_X09=tiHF2yxax8D`qq&}@kjS|rIN%8O+oYrMJt~%=LaiKss1R%I{ z8%JbjlAWRf1YR}anD=?$sN7KB|AzC=z`Kp93YhUCeZ795&UL>Ij#WL)4gkC%IOMJF z4;G=viR zV`*t=U_h~Kl82icia~)^c6N%j%fJo{2?^nf-`UuZ%2OjlQxFc7!Z77b6%e6_?e_BW zs+l>sZq^?DSY55Q5h(GZson$yH8nDlwNZ%3oHNyJ06kI)uuQ6&zV1c64|&N1soj+| zsMY&C1aFT%$Weck%8QG`Drgu5h5GRD@bPZ>QK4`Q7~<#W=OD_EAxBM1LxYEp|Fx)y zWbVBYh@dHhz(KZX09fYe=;**^<1n4D~IT80VIDkaFty%9jGqvkCnq0{|NQwA(5sIhQ7W{3KuQg)a?16>!a^XUS^{(-;(7e7zkfH=V~OLRA#&&s z5cdFnJ$NYSy5O0AA7PH{XO0iTDX8D`JoYD?aam3zC+h0iXm(@mudLwXtl{IpHe@eh z#%z({@l!K8BgJg3uS;HCe#MUb13r^xDR1JQa?u?XBA3-5I%brN2n?FQ(&!(eqn)F5 zVQTM@bFDqr5 z;g~u*tZ`JJ`&o?=D=bt-O8Qs9V(Wlq-R%3u3ni)=o#=Lco$t%b##9x_3iI?is`)o5 zZntRk02N@83BW;oUZ)!$ke>syL@cZMx zZPD9zPJE=NzX3d{2mBA%dWOq3PxuBj8-N%RXqCs9#9qooUq5jLpfbhDrzh#zw_~mxFRYLXRVZ&BdA`1;{dr9UA^(x3vyvXG)qt*eXjm$ z(c_++oXE=$r&|IX0(2U?)z#Inb(U;zIa7fx0#XYStRC*}4`7$ed?M}NJ_9@u>^)O6 zGaqX7&b?c=?$YxOYRlvs$+BDf4Aspv^p;>u=M4qe_Lq8$e8h5bW~T{Ix-_eSOmPJK)5Ku znvPP3;Nb7DBjMgmCvOEMCE>>xS2h<=zIZV@5(VN9I?VX9p?wt&QXi-KHfs^k^-HMR z^c$Y>&tUKG?a6I9Pu)^PI4mOhxx-?F3wj>s?D7tTKP5fhsq*4SO*R>#prEwcA5*7t zSz$P{gEN(vM-?goXlX`f=9_Yzpy+_hS*vU!?xs=M_{Opx5>UMGLHugrV75-sodp2v z2U(CQ%g2K+E+~M5s)1_zDI82tg5TH2P%h|6BvVCj4Hx}N=~eF`@1 zf3V}_uE37 z=YPv*^UoR*d;L0J$6$GZN}iNF{C#?SJT?xFhQ7XHwWQ#4B&U!cFi@v!_FS56q8=F@ zZeWk;JHCuwRmNc05VQt*$p|S^Ew@cbJ+PGmbd>Ng!uVyz-c;uG1f%b;1Z_NB8&!Oc%+IyyaX;Tab6bWwP1?jfb?X=zGHi|rg^S9HiU#5AXJhLi zMmKiBY}~mpIoVKIsZuol;zkzWHxUs2G7mZ8c_~Sw;U)sId7wdRw>twx%x|F?j~Rb| ziiHlRKj1g6rXZ@bHSR|)v)TiaO~ZK$fhdW^ISpd(bCFKjvA39 zTAvyd6M`1QlZm{HPq*iSR)2k+@1YhWDYp>lf<7 zat>Z4nyua!w%v(Ic>y0kel)6yj;jopE0XQJ(EfJ5dpHR??<-b|82=>x$62`5u6y0yi8eSEI$We!d-8g!Y<~ud$ zWu~U)vNjhndVW1pv}l*f=Ml75c>VhI?P6Oex8C~+Nfp!^5)nR=3w&=`=yO zS6r@t^}MCuJ&%z|$jr3!QI?kTSrzv8^`0nxmX)<#r0Q^B!2GGTCH3*Vq`ncKpC?0O zV%o#fs;}&staZ0%z9u7pH#SR4=BRk-NN~Y9ZZxhh|1Pwwubf=K|tt;yQh3KD?EwQ2bVtf><1+4(MC8}+hDYh08ViMNLb zKQHp8@pYI8V;VEA8E_)Q&|Y1-OMeI#9UMf%M7OCMGXYncW3(GEt9S3-SvX^_*+)en z`G4_Po?rJ`=E%r5D>yn6h{5!K;PCXW&CaIK7%vW*mLYG`C^1h;?7@6R5&pr&83!d) z4iyO$9uMBC-@g?KUgH%^gMdumfIvE#%zqjGH;jog($c$8ZdAS?M)1^A1&`Y60v`Pp zlkcvt%k>%Jo|mTORrmQGqHn6g8GpnHplAh@l3ievo_k}}xqg;g%rN$tMrX_#q+ z(fvwFr1k`305cc9?Rn3UM`YRU7kMVEOh@Gy05AP7GP22ta7)|=k6%^Gxz_wR*3v?Ayk;(3dqva)g?hX%>H7BCh& zLB8b~A_fEj5f^xc3+TLLYFOyKyIvdjKa8J`~Zn7+t!2rz`7&0n9$Wp=ky1Y|gE zDb2jAO11Av;j6j*g??Z1GIB!W>h#?O#og62sNUAi%%bpl_apQG9~jTMc9 zdTg5mvM2kMeSI@zV@~%`oCE;2X$NT_( zP@-Usp_Y@(bOneagv@pY1OT5qRAM(P9fSVY!3=h-NlHDmszQGt_5Qn6Nv{W{ z%^`-5`-R50-;+ro7iMl@5mTGnA59l|&R*qteT@C}HE=0=*Fn&IO)0PF4!^L_4e?U+ zV1qVahJ%?w3}_98EzTB(hKqU9QSN^iY&3bs56Wl1KSfsN8p;X_Eq;7J25MivI;ySk z2t1G2E>1$Z8ak-Jv-wfbpT?c1Zu(|92^`_F^cco1?aoOq?vV1weMiQH8&?z zx;;7yR|W;WG@g*qlrJowZ(0|*cb$uTu1GFSe7EQU1?p4y)BBI6@tO_b`+fG+(!v|7 z2V};QdQ^X&2=wdg79C@DdRmZc;1UseAtDmAMdG+S_sT{Q zHB#aP6-7b>XcUE`z<-Vbn8MeWn1tkLsf_@ezgYPY@dYKNSgs~$3n*}~Zw)h*mgwu# zw7(X$2lwZM=Z)_Cycyu9ieLQ_&ZSO`uiujNcmLf03j_se;uwG96$B$(1F2eir~$Zs z@IV;palH(YN#~sgdOgrSK@2>(-`vu|B9q_c>kyD5`T6<5Xj3bwlVF8q4=;E4G!;@H zGK$^D;4x_%I4q`@7*^{vrhz#YOR!h1t&43!ooUD0+sMYckQG$iIj&11yhocQe^_!o z{;OjZH5TphAKfPx*Hpu*ab=)k#o)&yE}(~nKD4y-eFrpg$$K9pjaS*acC7Xl72o|` z-2YASY|ITLI)DKui#o~$cy%(Xp@N)T{durGK0*jKA?^fqJlypi-Ot`K&D!WYyMLIV zZsQGoo1KM+Rt^p%NHfg&nBJ))c`mehjI)%8b2GkTx=UrL_4+J_x4D^Q84?`K#KdGb zTQnUE3x&vdT$+71_Bz{AHa1=cV3Ow2XWy~x5x8Aykk4WM^mR-@kvuNaX`6iwng7{>tfWDk5Ucb6$w%N~~Oc}qT3#}f=j+W647 zSL`FN=y$MUXe%l%(uKUhz6J5+ccwL1QKKn`^A{*_OXI}%!vRb4&Di|3($b^168#}R z66mTrZ)lx`Zh9&5m;9QnHg^fZxT1|)DqYFs6>pRw1J-dKVmLymcU$YsMn5bhG-JzRWJ-n=h>PHuz>HQ*s| zwyD$&m$d>(N!h#CjKUT;2BdHze zo~TGJ;@j+h?_Hryf{p!Fp0OCZ@B&2g{dusy>|B-@3ODhSopJYr7X}*Hbq#CC;vhuB zvE&Af253MYM(yOQK#K>-#_QpLhlIGeK$(0X?VWdHiUQS$*SW>F_Y)aTBp6!g+_fR{ zc|{!hV%fqmX-$TZ z(81ttP9zCWGdyCQ{Sx)<_0LMZP&+2kmfq1)&Hti3_Z?S12-tpg{{Degg~W_shG{jm zFU%n+;n>Xcafgs9QQ^i{TnXfdr&HX(Tm`%7wW5oPw1tK5KSu}(m2h%)R_IC>F}+6W zC;{M5frgQS!psLPaV_()o^Qk;SAr@CYgunJRn+cxVR{qWayuR#_U_J1<1c)%lj4d^ zPoHrJa&!AJ7MyWht;V?Ng+e$ALxUf6XD^dt@O6S>zg~a@U4muEHu2PJr9{s{1nc+E zkn&L_knZd&xWtD3=(U)GNjI z0T^m`KTMONdRsROg7xf*NeYF|e54@K2BJcpWf1WC4*{9J?X(1q){>nNR2>E2B?);R zgZxSkY=P_#%jM-(Edv83WhK&1n}m=kR0vvMSrIms0tt~mVk=|g;T`J@!kC`hPZXF? zpQ!(WWA@nC2Plas1@=t|?FKw7RqBM*I5)?8J!LK`HNYR{a_ z5Tq@(w+y-xL>z9p$A4beo}LQS%tVoYiT8dfBoy3RNhs)jUW{E)D%jf6s;#Ycr4BEb zKc=13^zlorI*h4S$9t!BU^jjsguVe~4(P_(+LmAR&D^IBRzR{$o_eg-VgQ1GZ6P`` zM{5V-E4M5_>{3PdR&vh*SzJ2RtQ}QgMLjd(`{V55GCn@;=jR9fXc!3Cx!_r<^71yx z`V|Bk>gsQAWh4IKfVmKF>hTJXJgpLquPPNxfOtD{a_$ZM-ZE$oR8oH2Ozr|%w!I0> z;hi1i$Ghwf`I5n;sW5v27vmVDuE&QqHTr|72CPUC5!Q!?7&arVOh3Phe<>ZLRs=$! zO8ehJQ9{>%$uT<0VR=^o3&L9$aZ_Ij8uSdcH9m;vu7#sl6qlQG4uFufr%sB$_^T*9 z@}*KfK9tbYtFz>R&4aYkBul&@!4Zw0IH^kg0p3hbI`b7C8$gHZpp`nw$UThFUL&PI!hb8iJ1fz`RZ0G~>dcMbl_|$$OskB>|jD z)j)~->XbiQD!OB-v`Q&YGQOpim8`5Rn9&5Y+C6=qmX?-MQXggk%y1RB2i`5&D_h)1 zDFKl81_M#d^00N^ZiR?rfHRj`N-X<{R9;?w_Xi1?fNS3|D;PjOKL2-fh7t-ZFRrSr z{OT@jdK*lK&b7LgEmeVBTi5kk6cCvEHcvsSRi=yGQcNl|G~zNu&Hp4%fmQaC;lF!= zh2|RVA|EEYUaLXEeAGHjQaSxL?SMU{qS*PC@i9YkVQ*K!2wCyk)5UT}x%}@ZUkZ^z zKxyW@pI}g&th{6L70DjhM5hq>@%hpWpBbOY-rCvC4F?9uzybW9?*&LVTM%A~=vB?$jk*E@Bzv1+@)izub+2MR+wRVC zXf9toUa~~fK?r2*9f8P4iePA@qXuwp(-MyQ(IRpFm+cz;t40slrniC+b z047ttK;CvBneD1RFjKl{+)Z94-9{fR+O9-c_3G~{A+jz9idpBj!ptPMm;2n>T8j_Y zW)BH;S)-%!Z5~$(6TZu>_uI1X)`5>R<{--Ls~A_5QvN zkSmraCkHW%+rHfJ)KtmvU-~WhA$IvRpTY$rhu^p~8>DTPRwp|wH=c@(TXW~oOij=0 zQ{&uR*RLBVfhkF3xJ;E^=Ds3$xXVP?NP1k9aU0aQLS}a88yH#766UJp%eiuXGB%q* zlm_@C4GfW9@bvurx&h1y{c%+?)a7{L-SBX58x5=zFuOR6Oia@i`d2^$4-1>qoUb^l+ZLV`T)A=jY3Gi$jbrF!LSq+*&o)jpWV`E@Q zdJbq2%l1jmfxtj@1YZ)-DzNSz()I6j0Q5@17XI`h9wA^(^ss$AoU;z8sHm8HCkk@% z!LW)9<#zaP$|@={X}{hOaT6XjM1!?DS*rCkR|1kmQdH``zCw{wdx&6XQu6U#gC_j_ z`*-l&6}pm=lD)hVxt5v2f`=RZKGyy+XQ8re$_u>;ZN|jL`g#zO!<^psGI!T8aH(6cE=(sND>1Nu$4HLyIEz!T z@cTg!HUYD@QPjjF<_*3_p&n3UkYfQe6U_L)j+=QhmrnAcg?~m&OlX4daA2*vNKH<@ z+GE@Y8@RiEAzRmevDLz}RJ*Ljpz;BIusUt_c(tOIJbLBC6MVVBVRAiUUw?mOZ0r?x z;CGXm>;1jw??EALZ}$axKoIi8KtluY&?ZOj^x_v}spu(4sS1e{_&YI0Q1oJV ze@e@s0|kmhg?mc13j4pmYrulUWPS;Ib;PahX&7plUzad5^7;Lvqs#R6Two9Qbq2du z6N2D`=8DZY>l-^J9v|=3G7PpWa6`%$^tu_F{cdxlOzqHNTZLDvVUtK;gozeE2WtP! z9UZ0!WR*%&UnGVCDY`{_OPdPn>jyE84)zC3*#F&1!T8~pqB4r-`zXJd<$0JaD=Uks ze-FOaV!n+Aja!pZ3jl)fwhl@M2sS83G1T@M6D&#SU5XwOkT3KqfUS;-j0{Xv5&%m- z|9mSf@(rMe0o$X^rEc)G7huQ*MDizXF8~$+u`lp#1G64=w?h(C@$Nw1(9qxn!WhW; zhkp1#D(qdasMj+K`)esn#Jzk@Y~OUTy~I!524Tl_YziS4H>CDs*uwom9Ysj6zoNn| zKW*5gzz6L89lpJ?s`IB>QD4^Wdl-VKt%6AFe%Y9`^rx?xfP@@)A6~CZWGE$|GMfl7I z20(WI7ft5@&2|6&|F;n`L)n{TWp6^16~b-r?Ci2PS(U7W5RtvIm6g4+GqbZ-viJC3 z{=f6>IQQLsPPe1?=ly=auIqU{pO4E$R+qdy`SaD^8#hELQ6gkBPT!$^h>qTd*Q+8E z(IU79&W{?dl;!0;4qo9sif-U%N8yJq7_ggZPkb+TpKp%I$VRIB@)*kC5w}-!WWAf_iMwzw*?T|F5 z9-}_|UTxA5okn-@U#{}``8m4ySLvNPvQj1H0!z)SA1k$?9Y*7z&m-dxao%@UTh{E|7hUP_d01K33W|TA zUQZS(jwZHRySi?Aj)#PXl8}&~BJ&Fi5e9)5Z$Kcw_AG%-0s3O_4p2+@2&?~Hi-Q3^ z@3HaKug~kl>pk|9`-6i2MbQXg>sTgPTjCX=or6!Rk?GSbxX^o-XERzU<(A~-zO~)q zda8s^;*Xyu{+gjarM0O%-3^%}?VrsB6K2s8nIHHjWAEt-EVbELs+mWBz6-*>6cbTF zL6HbCFCU+w;e@pWoCY!CmrB*p@7h$3Mbe<&^}HGL=Xg{g+wcv#qo=*!A7ZLOPT^rL z_!4y6E=lKNM+U7W`geEnxYY7ByzwtI)k8Dhled`7K9YFD^CXt&N+JEZOXEBIMd^LP zgI6es^^8Omo?=R0g@Jj6+FYZaHG5g*?k#t*AK z9o6TJo$sb@VPr7Xec1G6fBzc}c6N&RO|OW9ADBCbhuP}ZK@4Hmclz!V$+ZyZEwtx3 zY^M*dN=OJ7yg`M)-j{-cyR}egKbJB6vTvWtkq%Mbmp0Ne3?h}E^4Ig}>6^4j&M?uv zz9)0xTpLtXynmBqR9ByL?(DygMlYZ7;UY3La5Qq|+qhBw?VJ12Zro4cX1(xzpwE&d zY;Q^HYxf0NeMPrwv?ny|wwR!v_b6QzJYZt(TY#F`IC^@u1p|)<@+uyVjqQ?8ZexRF zR|xa9TbKDR+__g4CSO-Oz;DZU@7@YDpzs;UgyQO! znJXm79Z}AY=)K|DOi;0z?p8hCUwhLO^v~xs@5d-Zs$xpYdubmvZSA`Wq)_yB(KQst zj{k9z$dL2aamW)MaB^|cVB@H2#N8&iGd`L!&_5Cw3qQMMP%(>6<3#WiKPFlb}VfL(io17$6sy9Ip zN5_ewO)CMaNP`R<+|3pe^h|tJD?^i%W2<$&iRhqS%WHE7*mLBkS|p*Zgdq(`Zw@i` zX-+U9)t=~ilBKTO`6O9Wgmik%A|5mN`u39RM8W9}-Vn)?MPfO*4sd@!)5OWh zxKQ3NvGKgR2CQ@!qxz0O`vNh2>LGhp=qkQX>+&yHm))} zP@g%M8!*R~+S=&Y3D#!Ia(oqf`)JgrQgdV^fy*+@wLknQI80W=^{Xl|ei$u}U(zGn ztA#hUmp|-TYD;;RZJ&!0Uw*FNi?p4;ygI&@%ppxe|4wRLrZMpKm-%Mhf=ZRbQ9b(t z`^t&W8Id-&wv}5p4KSZ}6UkRE7_Gs4{hGl$in|$`PYTOC`uy_yOPVeV1VwGnXYtR% z)?Rh3!QxBLS?{`;^PfMl-()KKzwLFVA0R^w{DTj0it@(_spKDxG+u3aE0IZoE=I<0 zt?KD1vTy5tdG3iH22PnI36XCJ6kyBGI^2}aEh?&a|CgHnPt#{5pJW_?*`@5J3%FZi zzVw1&eE*!T9&g_jw12Sgd@C=f9R97n(=5XfBXPQ#(cIh&?2z+wa37|oPJVL?!(ps> zTUckHryRI!^knxE9A=^w6>vjQii7GOxdTj1O|^=RB3drA_rVoc0mThG z)ccoj>Nk5*A9#aI2Gy&;52(+B=>L$w^l|7b4nju~?)tV9_c_l-hZtE3F%g969UrY| z829b8rBzmH8oOOsG>(oQ?)6Ld_xBrDSPw!q^*~%4pIX#hrCnzS!T|AH4ds@~G7ejk zIHZ36Hhp@!H_Sae?lsXA3A*hq(;65$0+lEs&SEHiYKVns1h^m`bs+?_HOfhkUbxB9 zBo3dv%G^C^`u78;IP!cRhokAyJ#_Z^;PP_)`+B0>Y~tQ$n^WQ*mDCvpojoSpXy+Ih z$9Nh)|3=bAao!0J$ENgVefMiXwOA|hM}Dc!C)u<8tsM0(TS{!Bq z3gY5t3_ioIR(^Jp^uj_r@PUA_SFo%X%&uoJQuMgs=; zG{}Pc-S871re5Fa-*2Olv~54b2o~Ho$-L)~ilocE{+rYzYdd0Yq6i`&2_U|loi*ib*EP@4T@o3h&{t)D=_?Cfml~8>t{Wbedvcgd< zXPK9u+)o&oVeV3LH3c z?tNcy$S_%ZN1n8~=gx=vO^80+eu^aie`)Q(Eg1n;Vs zDvg5b(fXJ{G-YOVbX|;2ry-0HJ-PR5;bs)Ztwxe~!oaI}xrDtQ|GXozskaTL#}HE{f*iG9gLSXYak`3dzgY;QxF4H1)V)C-hRRN+C>&J4kq)+C^7OEsQqjGxO%~8VHRoQg$?j%+$QQg5ZZhncko>u8DeW75c`3cn&l=V* zLsL`x8>O})tk|5BT|I`IWK((No3qAZTiw%+lam`>MGzK!@q8_zR*QcA9w$0S1~-@c z@pcIc8Y*N-%6_S>DlI zGJjhX{mteY1Fv;+FpS#U*@0?90@#4!;`esP>(cSQgQ6W(tEdkR-2`7|3O=Z>F2uF2 z)In{6sG9j-JzNs~gt#o{p0bZ0yZ2VKC46*JKKUFiL=6Ff%A2-EKlrw&X zKT%|d{;?qc?b|1B6&2ao*j7dLOYnv({H;`es<$@`EU ztu|e>hP~J>$j+Y%Y?&|n2vx6dc9#P)iQ21nvMMp~SE8Yzo%mcrySOhYw$8CW2QGd% zzQ^qjTi*~z?0@B^My>TdbAwO7%}p?G({XHc6-GJB z&*I?Pd`Bzk(@kF9e!*RMs;tns*_7XTBP?Fy~ z5OPiCU#o1m3O%b>aUYfE`0m2$^t){4bWuw*W6(P7-dU2KLP7qh+FYYEAu7_BBFSgg z%tASw2#1Z$)$IT5!4q9zn~xwA%3>tpGM6|=BcfC* z8zke*-8p&N<<$*-gAe&t*~_O=juHOB+Uj04<+0&?7$YO^VTOwM@1JTV7XF_7x5gQS zLBUb=ZRI5jlJ!MepM;W??82_e1OfG zEfFrNV_!SEdFFJ60}ed9-(}Dtxo!mM z^WenDGbMDp`tV(+fc>u|D(YZpYAzZ{$WNjCE!iEA4w;4mCXL9kvL@S|{4NVeNAUZ} zXACa)rBD(R0|^L%W8%-6gD>}P2!?@DOPNT`jXV~(vcL#xs=GYh;Ir%jNKPv-R7q~% zt^kF;U*fC>VixX~KBy7#?psuWiqv&Bce*>Qn!n9fvB!Prd-#+$tel1QCU$W3JMtjL znDZ}RelEOly(`d_`ugY`Q8S&xXge1vIs7 z1Ss(0i$`ou?B+Ilm6a681>8RM5kd@L>cXxl(0FAxNzcL1KKTn?5FCeO^7gM4)1^*> z+uBYJ)TstgL+|5+@sR|X4L-?!bZ%9dtC3=G8-$tfnXeT~7xwUGwjf5Ffd0t9z<|xx z=B)pMIH+mAF0@+}eG|rW5J~|%FA@N;8)`{Es^>_0-xvJ$wzddLA$(rF(XWP-G&ByY zN&{C!yosBDZ$$ziiMTcSjX(sl9!l}dx@+{1%B-)S{v?$bqlnU}52iwxY}^zT^>kG* zm+lyu8Xo>IP52S|P;zqeQ%(yi{FSXOd;|*zCp;novTYC<6mm$*%{a9B6(Q(U^$MFN z3L-?mA)W>gVIA1G0W4V$FT-m@W(RvQ-C0XZ{qJPOCvYTNgVzO@fVS!dW1u2DRySvG zgW6;vb@}mu_shOd)uG$-SWe$VrwkU)K(MA$P_%&p`5CXi*v7vQvei#EZLi>6SaZ4# z+Wm2-nqUg0s?^6lZ>~7OvT=iyGZ2kmy17BYJ`-6(E|@!D&CiS(lwgYT;njb4)$&Kc zeUd|pG^(xkwXg-AH?$@-3u;PWaQAsDgm--qIoo5Bag)jK*m3Xh{y_ckgzNjP9< zzm*bLWhDe&NFf2C_<2IYRX5N`zqGt4`1<8P?&4Ut>4^zNo~hN2pWQbTmEg&}fF2TR zQ(qW}{9pL#8gw9PA2n=mzrw7X-`|CTe3+>o(l8J|_%^#AC7U)#6^j2jvIGqk{(b+^ z_tm#wjqD!}8I;h9e>6K7Ibc@IDyz#5Rw^UE{p&xGA#t@oWX3pH_Ci7ega}D^)4aX> zLmBCJ?$i+G6V;?nlSy(N=XN^x|K@_5W~mz#V7y{-wcj$obIijSnqwtVvE*&~LYOTs zThKrQ2Z>gsG%!@gqF-NFUWS+$!_ewQx+{O85}D9io~*W>x`j-=Zf|v1l-pgRt0!!2 z3xl8kf;oPU!dW!s>yQo}TtT1*N(+60h6JJjee#Xi)5!eGY5_YN`Kk!mfoZ`augKckvoC$q8HM|_Ak2W=CUL&q z0xudns5#+5IC0q+t^O~2pxOX64jai;P{{k&NrZ-&UtD@`|BO?yPEo9W_>j?k^Lv9U zI})(AByibDC`J&Kw7*~Hyn-NK7djHAYC^p5{q|Olep;3PLJ4arrRU}N^42u3EUnb6 zooV*_)_kxLb7*UJDGu8oYzy{Stwq|+o|W{EUV(l;-sC->32Gl58>z0P?2d`+)~^$v z?(sJUi$S-$leI%UOh&*iZq8flg^u$@HP_71{rzjcA^HzaS9xL`EnyFsdUX9MnPYEm z^a}_HZTP4U>&nyuDEPi%jRpsaalO}wd;4>81P9KrV6zl~n_5u~*>2r59lhm3-% z4k*>M=}xQ>hfXUhFx2UH_poVw4Rid*W@cNT{g>tB3J7O9O2A)LTx9q@W=G4C`5qnO zXtuZhyS%`nOu*j$G9|)9MJix2Q{lX%M%l&OYMq}?nJDNEc#q@Nkh_`m-MV|8%0Fk7i%-ob8z%B8-pj)<5z!d<^?8F|15 zTqKZfpmX`kH#0B**9fIpOG5*A%7Kk02ISLdu;_yR<(2j+e z1DH$&s$%p&Q0&Fu34xTOSIS>585d2mJ})dRlm|;Wq0M0<4QNj8d&|CVZq75_{jSZy z?~{dM^s_IwgI0fKwa=R($Yj4`)5Vz}wQi5OU~-S8<78FQ_wUCE#(t1lOJzzZHB)eN zdyAi5HV{Fn))rW}Z#8TqfNxbgy6T22n-!E%@wL5AODG8QW_VL)Z|}hlkIv}~hb@`N zOk~L2vfjP#CVFi8i*{^Ta#1PFrCCGvYy0a-6hI%EGnp8)c)?9J;H@wK`m_Jp-)~Ur zfz!Z1x+=#fx#B_XimH~&3tehNJe!)PJBu;FLui5~r4<$nkmXQFtCGYLMS9Z6> zY5X@viy#rkB8m|wNhh?ox7Xd-89*>UH;0f*ffG2ib;8(#h=}N&BSQLEk0&f?Sc4Rq zxj{z|z>f5IUtQ3C$#CBqPq(%!^g1V-DO?|9>^wz5hApgeXdZ~-rpu+N73hY9v`$S` z(E5>WkLs%?hkq~9f3^{}JQvVYRkd3et<8c>;ZUNIQ(c|-WJ?e4!{?}{N_LeggZ7<* znTi<<2L)sO@m=O^&$}!sq>Q#4L^K7kA5(@u-?qCyf-0S*zGS6Uc~Z4@EPsls#KruO z7%LdKEI$rL^}%BVxI9Q%gto&w!xL1`?QN$E-C;uzAge9L*suC1UdHbw(6K!aITiE8hoW9BvYitP7;14n$q}8L^0WB*2hYGp!Pvh zu!Yq<#V35`2%$oIUk4LJ=|%3wwH#Jv#Wec!-t{dajwlVr%xw^op$7c;)y3@9U&y1U zp`<8o5IfOkEX*k=D!%fO6y4!qf+Be!vQsiX=C7+@32^nlq>Yc9HSdL}5Zq#dI5(6Y zzWb|c#;N^#_(PN43SKo8X#qV;?|<7tStO-X{c;JW`<~Fm!iO^>>gOYn@&lkagmH1? z_f#rINAquu88yxNi><~z$iIV)NR4MJkBNyk)+&GM{1(c5M#2_1F~N2()|)MikT#a` zw#n$M3UfbSJs}bor`db|h4XgI_93iTVUEp(jpwo#qY^*Lnh?iDX zCAcaim2;;q&MGAGk7?iRjhB>36&|=ekdRwlwU&wJ%%A@qE(h2^D3kv1K0yKuIQ=nR z9IeoD(Dd&fglKE>>P|#S3dY5Ak_kCn9&FUYxU<1=_Gs4k+w;BUqw;e9qdnV4WKz9Z zSyy#C7>%Y6JKB17_q;2-g<5*=AJ-p!Z)%#ab+E(JJ z%A+ctBdohwrsDWH|F&h{fB3Y?wm*-FkI~yMy$z7Uva&ZdTnME5ygboY znD2@PyZ+8}`?H5*L!pL8C-d#UBCX`)&s??+7;uNxxdC_3t*9tAJ9CDHm@u%(WS*vV z@>j4*WX(ODVSbz8T=2=Pk9)~l z(!%T)$cj3?f*>z_g61+r%q4AKZ9mLFMeUDOpl;5MHqhn@nSKS(a z(wwhZ02aW@i!<#aJy%F@iqkZJPZ=2TR=!3T;qm$TH9bn%Q3TY3Llqp%%xl|!+_HZ8 z|B?RO_v*%9#ig~^SPJSy$Xr)b5Q5MmmjnT}ic6sf8w51M+LqJ?&#-hWf(*v+NXj%ZlDLRSED@x(MQQ{v!q0giAZ5+hV!SQtI%BY zpmn81oMxP^}dsQY6a20A|2uIEjE~KBoJoQk+xe%b4sK zet;)ZIAZhL)iq~v*B3EI0!|BZr7BRqDk?o1jUi7r%-j6gQT8hb{d91#sNJhOIp`4s zD;p~o2cXi&#xn51|a!@~QaeVX2;YO=SyN=9X>?N*`5N z@<+h{!x8Twc+?V%o}L^Q8_S0h^(z23sEJ>m(%{Bc?kEA$*dF>RL36}j$X}@BHNL8U zKZ-Q?Y<58m<|9Z*O8WW73FIRLf$IMHhWf~3rqs7JQ!mEDL-^ZZ==en;KvN*TIW<+N zo~LAV0m~us^RXe>`ZozsH+n_jlH=zsLlfi>)~~F>a6_hxP;HG5)Ymjm3}dQnrhv{y#Hpf4u;(-1Z!@IBP6W1 z+YkekIa2t?N9=&U1(EFXXTuH^C*VxgQ+2Y~nSXoip%2}-(5y$_$7iQOx;&IwdRp&2 z2t7O9yv3Gcc`>!Z|B1l&75r~eeE%3ems}^2pKYk z=-iYdL9S4@sgWND5OEwHu5r6qTgVZKPR`Q4_3tVuc=B(GzFgS$ z35@@Wh}*3k)mYi6CO|=4c|$%ol%hYw#FX%D9%lEKbaB3TI`DgJOkZzSK7)dXRc42=aK-POymeSC za0!~>4Ekrr;Ztk}twU_r0B@pF=$ULHpY3uyT7zW?4e`p|~wEyx=7p)mXj4&)T zamLRwJ~g-e_drszq5Jjn2QDIDP!#9qzm1IaI~dW9Q@jh<`yW0h*Z*f$kP9Q{R7;aY z(9adV`cy&5vO8F5npcm*SFt?b2eNB395MV_Yr?3r9`GgPJ-EFzqGDG>w_QZouzzU`+wfbY z#P#II#@^rVDsnL~Gm|;u&&??$cq4DlO(r2B0dP9_1qhRE<(}T&`z*ot?fK)YH%%P- zSJLYY{<1J@c7Tc6czZwed54L%W&*`;npY}jred>{aW<}AZjqPqYrjRJ{!{0pm9Vz8 z4WTi9($=QCb|R7(B3{MaXl0;o`a7c|3Pup;tAh)2QM5yL)Dic%7Z)v^$Fn0`ITOaL zBv5fl=C(i5{4ml%1FLt_4Mlk2L`OI-7bfZhL>=}Kfa!l0KsEVFqeCSx2q5|SG*vvW zxY%FoUZZ7s`aM6HxXA}Qn4448<&$R;#ALXkwcbax!}~k?`#nE@>cRaS5zz}UNLZEt z^O0|0yX2%sk6f7;A6NP;VVDz(yKYB-sdj>%o{x)M!@j`(aHCjIP*7G@mchLN8eens zOrjXka$w&qT8&xrLr$)WUAye!96^AHn}A2j{4^ON7gihV6n994OeY2Ze&o5cw;~oI zIdTHdp=Iz3*$?W~3P+Otd0)(G^w$;qWt*j(QKusr}E>+ zuDZHUfrEQCVcSdnN~i4SPtYDd{g>m1i!)@yPsS0y_BXdQe# zs9<9dczR{G%1oMG!SL;-5iAIadiU;8zEcW#c_Bj6X?RUlg3Sia1wbx>zq|a&E|diD zmtu4mnH6DquKV4t_c9AHCmYm5carO+xK+np1 zJdvjvQe3PZJ~ihoj2rQjg#>bdaqriMdp2LScDUI*)-sYn=-9a=C3Y10GJ<=;2t3Fl z?nP{N{t@o%h8ycznfn^w;k>v*RjNaEjUoN5UcaWnrJwZe{>bEFZ=w>v5Z!n}GrtZ; zb{Ln^l~BMn0t!BY>o5dBCy)S<6rKvwsE(l81Z@qCZBh3qJ_&fT<ZR+k!`l!RSr_5`A6@axGF_|1I|j@wx1 z8f4MT6J~1-4F7QUYgo?Ew^B@DP#o%FF23$^CmLc_V^qJOn=?2 z%-GXWlEcR&No|M3%<`|Z6@R9ARSvT8jo8?`yziS>^S&}1y|gNI*j8tH*#Aj{*u@%m zd}0D_m?5S5z`40OuoKHN5mi@L8`gUXFfgD}^mlhVzj(pJZ+rQ|NDtSw1{CP%zq3NV zwWl0s$G=T==?5HIL%fBtV7PgpDCfulRMX4`Oa$Ui^owjkO|Y{F$gJ98y3`N+K?o1(U&AJU^fVdTige93yZs1Irn@IMskaPP=F@Ae;kay zb^klS`}P+)V!`B0IC!$vbojTiv8Wv*KmmD&(1kvFTTpz39k7GoVj={{8x`#|Pr9ul zSoS6a>KK`yy2?hzBEF=>vo==iK+qW z%7=EPN<=OVtU+=@0WhH{-lE12Yq6jDzB7<61AKmdejuro4je;O0g>0Wm6b42`1lG} zRi_5U%Nz~TN_g|a!sKY{rpuelq|;z4!IpJ61?lMLzkle0i;C{=;}{wleI>qH$M}8k z>1DYSeZ{Apz5Z|-N#@_bN3wGmzvaoGJET$xbKA9Gm>jFfm6hY@!lXB@{ognW0UPeh z4e0?CoyI>@wJ*%NRtFRE^G#7cqBouz*4o6z?r|9mE0-AQ0Q)och-mpM%%-Lv zRHvMoWQwyn&!xNMnv`$SE_Zli2kqyW@KaRgmX&F-jaXMACa>z1W-qW?Eq=7DkUiaL zTG&Y>zY&T{x3^%NMj&Itr9)H^QqYJX5G)iWNI;&crT0mH+Tb8DHSZ?9BR_ddK!|Gh zgS2+F4hIdtb+p1~s)X)J6DcML2-DFaTOwAG?5~xWfiE`sAnb3ViO?CmvjEX!y!ZjA z5LI@GeU&y;z?EBJ&S(!gu!83Vpp0}vQeIv)F<+T2QElNg%DizSB!TO!VFyE~bFM$M zuBOH?t2t5emt2kiYur#G!X5@^;Z6x-?(=k+2X%E@Z`w$Y{+^w#e15vJYzf^5m{_#^ zt{xz1`=dq4w0>A!OzYbo{i)9=g(gaL+MjkQ9+{lsAqOP2e{Lmb-VVFsw6wwuBT~?N zE>d4n2MeNrQT%ozpv~0NfHS+QN|-S(Qqg%IuL7v|NM=qB?_b=*Hc-+2tEwb?v#N{! z<^4Mz#+14au23QbXpn8O4S2M-Ocod86yrvpaVOe|286UMs8y2SVDFN><21;H;Tmd1 zooIMa6Y_-R;SniXu5pe_oe4O>F%xsGv4&k}7foz!3*?!2pCjb!U#A`bf66u1@B6hj z0tLi28%7Y1Tuv!1M8#kO!8f2AT@TJSdH{nK!9>`5KPP)H8^O~A>yG$t=rCqX3owAUZpAjr6n7G|NhYM9;-JMEh9;SWzJZx z21XorHI?6U&mWf_aha{%<*sXAVt&j#C5{J7e}P)~R!%mhf;R)vO`FP_o@`i-{Q+;^ z@?N}%)5{ukDH?n}D;&s8hD$OwMA}|*^A7OJ$;dia_QnczGd>>&irShdKpvA)`)z3* zX6IY_Du-#dTUZdpc_VrTr28aertT8U42Q31Po$lU8z@|FH?8k)}qD3UTVD$?d)NyV>Ms2#AftzUxAQz;^q zkoNLq1#CYkxY?E2vRZ0^HQG%fIB4-4fkCzac7*&D$Rhn&b_3m9*6+k( zw76m3&hB3V{4Ns5h?DlJr*89Yh25}SRtIzDs~+=HSozF z(a@~R$i+&vnwAzfoM^c!EB~CHjHD7wcr(8kf2Zx+OAlu6PtQunvqd#ovmedPV-pDS z4^RFg&-(HRd%Cynckd@FdGSC9k>8ICvOveh*f+vb%2Ed##`RvmmQcK8{^!47*AuB* z@HAd8#qYaZT>qd(<78#!c`xiJ5Ri%orAPERV-Nfp`kY9>I)2#21-%H8{5$p>kwt^= z8c1Md?)w^C9k9k`ZDAQW@}ub&WL#YSdt>1kL9~ZDK9cGjZY(u`Gps>L4i>EiwN zxyE72qhYy@4sb%<2-4}>t_ivVlwn3#D1#sjF{KkvG;U+x(D)9>69x#pm^20?B~j#Q zU?X50Yqza_^T@Q{_D84r^%BC^0e($9`zX=NKVh_o;tiRzyE?`F8us>op^Bk(Wg%>M zWWxQhI{`D1o^|G~k%;R$Sk^}r6h1XJ4n)2$eMfxn-9J~y77T`zJ|}0K>5{;$d4}Sz zoZ%5|sNA>#O-SqWN>Vtq;hSAA(uBnl1>lrR65=AI?>EzYwRP8Sx_+l8r(M~*wuXs4 z#m+2)I3;EwqD_`o(r+_zc`h(rjddwbQ^hAN(tS{4MB~4|^>*)S^f54Q7}lnCFA0-P zG>-JL-uu^e{#$0VnmB?=4pT5(!1c0u!|Lgzr)R!EQpLGXSR<>7Y+K<$dNeB@UXf4s z`;AVNS2@yhz_;AYRV&@uQF)c#{x|v1%@wYns;a6Zd)$6L<~6IVkMm$}kNy6A0TEm4 z1em*^wn*x8YoX=JNoh($2YC7)tSFL%I1!ZY@5H$E_4MdoxR}d#d+e6MvW{xr8kF!h zJy7j__7T-vzB+%@Vzeqd1w95Rc5;HsvE56)qi!o9>GMrN+3$(`bjUI?ZgAnosH}vA z3MRy}B_}V9j4+9bApsK~e2qtAjtqSk+UGNw#ODR&5EERagNT@bTI>)S&vO9e!I(?` zcu=kcr4A%5Qokm||H~FTX@Y;2FrU5xs$!I~A3SeGIU0H#hC1 zV{hAzU!Wl-18acm>s^}LIVPzV7tG=o_j%VR2+7lx_VA7cJeRQ>6h+zT>G2ar{I;^u z^=gyd!Y5f-uju*g<(d6lTvgfbJYrDD({K`5jo6UGqouhz=INFQconZ%G+3dn5r1}C zQcb1u(2XSQU*~!+zdtI<%GSmH@q27t{Q}+JDt!)aPKOorXt}WbH&O&JY1GdhhjkZf zKei^JPwT^qtxpfUN6%aN7vq=RkJ?PQ2acvX_fS6ff95d@?UE`>jKc3XQ+NKRTWNDA zL>gEy4SGd0ph81zuiC%?)_|5v6tBFo?T$~uC1{|!bC6N%ooaMo(6=@;SX}oWRweJo zFj_G(f=2`enXwEXu4ifb20yh=VzU}dNe!6sT2MAvm^|K;AD>SxNvR$YPjHk z{Ot6zKc|vB9ocBww_n7-*(1TRA^g2zz)5Q3*(AIAOq~U0kOa0i-R5N=H$Lh3A?d&G z--ljU5WA)!?M|A|e185mKYxGT%Xb44Q8m)drmb9=$jH3^gmOdAcD|)f1^ z;gB6l9zbZWENdA@rB+A1RV-pFX0f+%C@f@SoR9b`?6W#Bn%%sf#Fp|Rui{6xpsmJt zf`k?n1Z#S#LNSCzDCa1NICoNDo`LmToo(1MUsC&nV6(S?z?YRMzC@*Q!hxx&p3TD3 z2vJ)f(pVk5w3!=WEuajv9}5DR5+GNn>V3;(Pk~O%Yv46=vmb<}eOWGYNFzg?a&0e$ zSCR--A6RgX;QD}r8T9ymyvnt;wbv2^N1`kBCf;4C&wW21{(G$S;!?_y%UDP|_U$jch=@Bx3L%fA z8Ho1o?gk(qFmi1wYv?4yzFI9qOJx2+E2u(CkA|<6nopPxsR_q8@z7QrsCD|dIC~t7 zDi9^lf3*I-TfZ;mhgx)2pHlpi1Fm;dFSOPX84ZvYGLYJWEgS z?6q5SA+@s7_4Vb_?1F=cgJyClAu!B7T@@?GAF@Lm#}jH+5&uky3Q){>VC@R1ACn{X z!#0%~Y`tAwJio|$g$;}Rf;lCq1t`G!WUFJikQJiDEaQHcmX{9wJx*fOVwyF{Rmx=vx|pU zx9j{_LVWsg3u9?1eFPRB^`fIOtDm|$+wQJ;4Y`NS(jGP2lP9%f02uK-k?=x612Y)%_+9bd)B$UxdG0~<}h!NceYOUu(fsJPeW0P?|!^GTE zBi>c)9acRnedkZEBOxJQNuPOJ0FlyC+lh_p7s73ilBO@tTZ2k}?5iOfqLjq{99T`K z);a9#Cxy9w!DAt3NJ!F3THLyM`~JZE;1p81w8R$I^y&S* zHasKhloeLqJ5N9wlLT zo6!%0|J1T57k^$J$;Rz7Ii{-9#RpSZ@_K})mi0eBcNo*GMR?3JPG z*$-CQmX-15sAcS*z1PF$4deR<-Wpo}DGh^7DncF<`g?eP_}n?K2QluEQaJ>db7(c; z-Sw^;H2`W*So_%1uDis>aIF`{J3;6uM?* zC8y5^o5TDGJ!9J27Z$h}03k*}1O!Gn`&K<$xj8xYFo~K%S1qlB;B;O(EJ`fL6Fip{ z;ZdkemO3JW6~-t(U`Z6y{awp@a)Bx*7sf09u&6LsH>K(ME`{UHW_a21kE8LI#qS-- zhHcJhy`teUMW1p+FfJ_~r97q%mMVI>?!wI6H>^mDn#gQPL96;#N2reQ@{*ZiGjZ+J zypu3U@P@wbA3>U){{EsxDes+C2t@U@v_>Hd0gm&n*#>{GWqtoHd_nTDpH}a0$e59s zq{Yw5rS2%09;QB+^mbe#A}nR$*}0gQfbQzQ18jc;X=eS88Th{6gD~mopD%WOe3#Hf zlifZ)&-7@_ohnAyYegk9-o;rrQJ5LSx)QLwu-j8tR~HN~Z=jmN!t#K98SJ>PIg_5k zAYHN0Vfd57GpZiXcod<5e&Gk#a;<8zZdo>_O7L`R9pQ6#09#953>( z+mcuRG!vx?KVI$CmXMoVgGkIuFc8jTWi1i{ViWQ-h9b=73_*+<)f@_oI#j*!v=`P{ zJdr~~u2W;M_}*}OqdEiDGyp3d9M7a_VkEszTd)m}K2({ndd8(etc zJrSWeCKeKQ<`#UC(%d5FUg6}JSNO++2}lcI{sL>0Z)Waz4-KkMu2d^$p9D^YcOyTvyI zL!5@Uw6z4kRRBx;rKj{W`+$a0zpQIQs+oAyvBJxje~N4me#s91W_Uq9Y5O_?&*IT| zr&oD#@UJr7r|xFHP5b_TuTI1wWd(HdB3qIUlvda0P0NPE+e{Cp%EnNBp{%bJ%nDzg zb$g0);gWIBK`=?^hjIc36GjkYnBOAt`PQwr^~~`12!GPlfBNmyKb{+V@uk`=Yzhq7AtbW6fHYp19?lGb5 zf%J*@M7fCxGV-098)MHDWE@nZ?=#R3TlA2jMjYm+S{1PI@GQqZozrBCtAV*M3>%MT zydAGDFCbY7)V#GBVwJ{ZM+R-*Wf%I;-FbLXZLgg=Tlus8*l{P0>-q9t_tC32*|$VX zSQgvEj)?nGSc`I59GXM$sU2RDrUzIsWpc8yVchr~X%{cds5y(l#>r*ni61zbpf${T zd)eYv$K4O)Q42WJVh1cmMFp1S5w7=rop31XM$nFW zq9U!&_Cp;V9oQoRdkkH-rbJ@o`GJf|Fz973VSKJFG7>o1$|*m4NTk|E!batPHO6Ud zl$7FoRQvBXHLHszAUouupdqp4-M%Kf_R6Z+}i@!oh09aROhezvR- z=%>~AdSIYz_vOOm_6feJT6!WTKMro=;m1oel!Jsl51MKy5#TBPGtw_wBMJ6shlz@{ z(fdK^*9)2X2Gj2_*s>nJ3& zmDkbTA3mO{ssr#Lk7U^(QQAhH5Q0>YyzIo2CCu^kgn5RIYw~FDtH6h^(S5!h3A9ds zBukwhI=t;eQqFY$Mp@u`R)p}^96!p4S7jKnuPUHYHr)H1ZlI?7p6h2PsRfq7#IeuG zl&;LI0olWxA;VAGW$`)Wk2BhjNl7HN3I?a2jJPs*XH*)>L!v%gS#5T}#D|X}Zo*R0 zu*(NzJp9=q?f%*~x^MkbV7E0euz;cw7!OefUIz9Uc~w{64~k1L_@|+uNQ#a|A^=T8 zy#UD!SWBO>fZ_kcX2SF&VpcxCBDMl@uKS(##YP%b*`jgZGSj9*^m zV1xDeqzM!5jjDz#_IpoX!iG0g)N4O7$RrRr?MV_~=isn|`V5j)@n>mV5*lm=1wlA( z-@f&`kO-Gr)icJziqOJ2>K?XHzS7Ab$zP{X@bgpg(8-aL1DgOO>MSe@y>4cg`(u>_ zmY`v-jIzrFvz)}B1%-XkCaEPW+M6rUnXkjFKKQ_<@cZmv-xt@u1;9+bUtb@Hjy~HV zu;Ar|_G3Ua0YfSDet-O-@fDtOZOxNYMwQ6(kKZvfIwE=Ig`kQB zAuc{2E663l%PZP%!K0KyDjsABl|>{tNU&4my10c+rCx{; zP40~%T9!}?m8`5d*qh)302w3zW=9ADu9#Yw2LWoW%02VD-pG57$8*23{@UB?He5yC ziw*PHSA*$Rw$BkY67XkP&}~+t`jNVQ+AqzpeX|bPzf%fpQ-jYp1JR!8SFvQOhpJ-L z&Q7jxaMc}BR2U@0xq_)hNbHLlF#KOfMAZA7>_U{S9S}C)sVn|*Y6AvAlCugf6hLaX zbqqVYb*Oh5Zm7^XYL3$z%n70!xJI<5cJo!#%Vu<`RExdT$^E>in!+kSTAi8Jh;v`G z-HNB2_AXY(k5DfiD*Oa}b=y|N#?D63=av`;i#0c56OmS3t=oa*7Ze}u9AY5vsAw<{ zWUisLx9%0HoF5i4cQN7&tAUk&#gphhUaxOO{aL7coyK@_c{%upk*y&A-SAbx{iG;@ zHRNEM?&99f2@n_GK{+aoF#tpRO4wK`VyznuHqvMvh7^^sA}V=zxq^}A%S@viY(ma1 z{NqlTTU?<(tL!HoX6jBLZ+`Hz>wpgsHX6pplHP}Qi*ul*rQZP7iuq>^_6O#3KjWO9 zaKVsPM&eS3GsX!MpGlRa{Yi_9s-U3yzMdW!EO~2VQ6nO4OqKPLYAWyi);@^SHcEu0 zI`E*uzMv|4nb00sfC27QAW;~eX>jovaB3HAHPhlFszU<->|7|X-R`;&9P2NBo=Ln*|XH0vQzixy1$Wi+vQK^oWCQl*b zr?(xZ`olGDq0)nSTpYMDQr3>z3r<%T$Gmob$*SB&62Bi=e$Usi|8{x#BxCRxk212! zgo>KV>+1*R82LIh7lE*vh!B?mj+dMyjc_?}$2)|r`lw>Hi=v_khIymqnQUMPrZ+u4 zZvA`fKG*<8`?V5b{}e3znte@V?F)7#6O%dE4&=2n|M&t(YuDqVFFJBT_CS zFtVKg11w56SA#fEAt8x*?Ya z8c(-6JZiAVE&1&q-xcQO7N~8GneDPNqva;bEx0K>B}MCqAl5djw)_dETRk5eZXM83 zL@+-P)6Y{C_C9^xdgqiTt>)BAH~EzmoxDB=D`{|(Ny&plkb!{w*2VEcl=s)}qc5;|f!#jZ%lm|^I`;hH=!S~r z=stkt0r@|RcNRUoCH{WC%gMg;GV}0}Qd~zxftSY(Ayd)tkgrew&U08t zD<)Fk93Bx6@O<8dc5z;F5!qNG+Ykw{iSVUzk^3)2;&%BT>N6*-EUh>j2HRAM3cH~1 z|7I5pH$g#KmzIPXZq|%I;3aeIw~P@tfhtt|q*xKMz)4qLSjUN=7T|(ctka#3F@Gb3 zDbw6cRC%%Y_i$$kNw|!Bt}cC3{w69d!`)%Vgib<5h5H5r7IQJjLZv4C|JZs9s4ly$ z?e|Xzh?Gc&AShDO-Q6YK2m;bdBaMiFw1{+vw9*YKA|fE&-Q6YqP4>IrZ=5sEaqRJI z_ZZJ6?*F>inrqJM`duw)K6B}^&=w?O){O?OEF!wY9PC5YRaF)hVxqB^`?_U6z0 zh_SPrLO(Gk=IOtMP|=I8^z4rFxT03$6BFIrNc@Z0Q4kg`@oto1ws)$6?1N&UfVV>ReHu_KrW>dE~glLXxz6tuPiD_s_!C97Mn z%E)E*+V8rJCEj9S04tC@X<|XColtIjT@#LyrC!%9$qLZi7SxdC!64Klx+RWHTeGf>ij}XEr5b65i!v`gYcbgp+Kll6t zlR6*p0H#Q-unLq3fyM_&K_D9Jeu;5_UMJZBOgl9B`*CTjtmE)k_{P;Cd3IJlaM z-jAB8w7v%lH|WP#h_uJwd9B=?8YS{a&>e?gZs8ymW}jf+aEPTtLV$g~$4x6Vx5$`rio~yq`q)U^cph>@Sl;ocMP%e%u%|8$AKZhak8eI-W3X*3 z^p)j9Ypdg=%5Tp;rJmBS?8)*9D=qv~TTAjsdDtg}1}}u8l3HxON${VJafLGhhBx-| zUhSQ!&i8kyW&5&!N?m`Wrj+Nub5_Dm;@^5Q`0~wG8E%I zkQma$MBn9ttS( zq*`>bzkn08pDs?9KI|cXX%5EeC$gJkoQKy}U*c8P_L_avrT{}ZeRj0zk2s06yA%OF zq#2toXGuEDgEb1kYGyDx_`&y-?2z_JY=<@$r=pZW1n204>`AfapOkVAgunWb%EQ?V zzf3JbvRhGYw<0*`nm6aRu@Urm?a#?N`6U7|RXr%0!KONIk%=NS*y(pMsp2 zm`DWw(YOWwXYL%-sn)jY2R-u{Up1`pJ@aGihQZo~RW z-##-9BB1fY$nPbq>|o;lbZ> zt1HxA=v=ZKBhgpcDH#|5-^EIojv!0U@TraID1cc9~HZsyP9rFsP_yMK9`A#{I;<7?m|_GPGfaB zPo0r`eZzju1+scq`RHKY%_meH%qn@GI!=L*kkECtHxt$mTt(AGe8v~yvF6{*bdamC zS#wSXBC<&_g<7jlbeWH{qeR~H&%-q_&Y>}gkVI9r2hvg`Iw4DI0WS@VtZy@@?->=8 z9HzJh&F|<{M1CEU)h+fTVxg#ejxMxx{fj&-_CxeGRfxRkB`P_RhVNTmI@KLnQ~iMbdPjfs7kPk&PJ*nQ(vUtgbF_}*o$sQhvesb`v9n5p6M zOLWAyXRi<>;Rb~9AwrX{CnJvuN|6HwzKP#vus+H&n^+KvCD)NomFJE&VDkRV)@y1px<7Sz4Bb6gy_1)-s|59&SzrBwRns+d) zHy=r6_dPqMS}ezjwg^-T8*U#P8(UBLim}slG7Z)X$hZZNGI%pZFAp^k{tCGeI<#JD z)DTI*zhA7n+qTk?DS1j+zYY>LBE#BQ5!b@=N^3hmzj*fNYVLQ#DbL-EjkD#X+#MhE zuOa;VCu)v(1C{VxZ8uKguE2NqbQ#uXHc z&^0RkcQn%VrN!ZQr!xh+8CTYw;I=YCj88eaac#fmfx6I_&E6xCZJ4PR9pdviGN^UV z!p6;7uTHz@5xy(cU4z9EO-xb*^^U{i;(7d-WTuJciu^pvKz56(H|t4B!8HzVQE$y- z|J)p(;C{zJdSex}-Tkug&Dka7qDPgLi1^;`aST?f-&G468}Vsr+e<-d9b%scn3y_q z)eBM!m`Hlzwv#;70gBeXY$2_?H}6nfwJLhY4YZl+9z7q{Z z_OAVcwaGF$nixQhfx;@2s9uAfV09ioQMg>*%*RMB`B-p*4~~w8W~LNg?n1*6Kod)l z`O^fqG+@ipsit8eLf*fJH1A(fz#V+ZeO3sZ#G_Vq$gRJc!}pAy^S6s>O(wkOfDu zYT85c@wSNxUIvCXb6gz^xFg_U)a%DYA^`(N$j7vDxf#!k6jKh+z2AkCR$V-eR#F%T z^$yUV-gFJ-K$G^0@>Aq%99N#9I{FwBUn^45<{?~lmgaJD$ z1hUjRJ_kY?C`lqCXFK8ltEiv=n(0aH4tR<5 zz#j6mZHo6XZhdp}G|epya}F(cW1_C8L{1+hvatjg>67&x&~~E-X0jR`3#RxOGP1Z4ehoJeWy2A= z-_fDhXDair{*LN(Vp77#ln-gX>n{6MMvwIX30w;BnkR2BHzKxC?Wi_kMW@t;;hxB(nTp3~LDfCuz4pzf|swyrp@_=09otAAM2$TI?bnl0ndWFcV zqyrEom_A?q7Jve7a@po{2sG&ydN%VFdgVI;n)1cE?6GHmFa7IK(CcMnBsyJ)SBLP;WcV)2_zt(j)210o~zC(ZI=zn(FE+Kd%+a zk-?*@y;ylU|A%67{$Fd#Z%MU1Eg^U8(I;#$s+z&68a}HqvAwJwwkd*|`<3@)VU_-i z4I*L|0;F50=5%kreh_nW^7Au{cu+?w_Csh#$GCA@cx5{F@!a%c2Y=6jHyUnK;e2A) zBKNPc(CM^FIs&2TCkMyafH9XY_<}p2u!H^xVt|<*f2k~AH+GnAeG$3skapynW-bxV z6x*FK03sgg*RQ2tp9XGjdgDw7^TW!}Dciwfi_Ib5t+N?dfXwKHZfWSq|xuUi)g_LaEvZCYxJNq82 z4Uk_LRM`vxs3sVf>gEM3Wz(}|dYk*G+4DmR1ukx6aQl{BKyroY!%s5VbjT7eQtx${ z-@o@WZiHSTDclDI1=~+>yg>Lz<^8Pct<+bR{QV zUY|_-;}~0eN{e3g=Un^=>uikHLzYB}O|!$+;TQ?WMF{3Frij!pDJ{<5edX-+@xbu* zx7dYl4*dErM7s-F#=}0xSZlU@Xe=XeJ6lCI`E6bv73Bxg2Z$Uh%PttQ0XCOwuCV^C zEa}P;)+2Mov=kl$p9nxS4`{G88B^Ize?TNg?=d8sz`;n z-noF{7J&Aa6l6HTKwj3{rP)L@iJ2l3qvEq!D($~WwU+?NfFo3{;xV)K;ez3>%NVy?0s(dd%8SrBkW@R}1j!?cwp!V@ZjU zvv=NVga{B{{jT z&9e;eeV6a*`}c+GOz49t0osgC1`%ihmBGNZI!6gIvwr^kW3HWGPtHRZ$tSUtq}(>{ zuXeYiqg%f;7yjtiL`J;A$G0?UA`@}8TpcXf+iCe?OI79kxI;#NY#1CxmVZ-DL2m`a z-kDlQS`LnV$V~mtOgCpq%1s291uhl@JM8XYVKoth@LeNUb0aH*z7UKTLcZ?qo`zhvm>_@ICtNFQF1 zpU+_hZUUGv@q1NEi-?2n%Su;w!tW(5Fn}jc*$7dm_P&u)llv3>85p|!$@~)wL5+to z{BQpuerV^?@Su>Yy_n=JS9L4|f~#*ZT*TW}zFHNP9<`qb!<-{PX*lkvmCs*7UeM+D zT3gR5`b2eHs%Vr$yh*(a1T!zHina;G2%2NK|Hg9>T#Hp*-`}4+JM4=Xh>4cVxtZ5a zH@=3x&MDx;j)8*-RUG6E=rYgub6an*3WPxl`QqXt`e)_!%IsZR+W_*SMMoBd{|vQ) zk`h;B2_(h{R(FZlSU6cf9V;0f)$KY-?6!nndwBbbmtH?{;a$w@e>0SRGZ=-mGIcM6 z=0cfbkr1!4^m=!J@htss((hG+i6LkiTIw0;`qd7(a{cC0yNb$Cf;Z;H*-a}ThU_;*2&>vaUqAxL5=-{rE&rfYJbx%rHGKt+z*Q4)vKH+Q5*%ufvw@HuGa+> zDl~sU_)x2+h7MN_po(6?coMG1rjTz9g{OX*SsP3@?fH`X0~wa~-pt=yWBn8P?^ToH zopcN-v%=?LU3!^ntDU}SEo*X_o@}&d$K0e^pcw<>xwf`(Wa}KCU3HmYt{T1XsOMzZ zz1bb|0Dg%I&6E_9U&mjW+0hVqgBVPOw^ay^EBeh!Yody;NV~};kAxX`j(^4Zo#9g1 z%Fy+hK3O{?^@A^07g(2U2OJ@C)25P$8CbBS|Z1Xo4(q&%v~raCnuXB zR10p-aKhZ!6(2l!04h?4z(T9XS(=458)c5+R|M(ET&|Crk~V zmpJXM@#4ICJ5Nia_17*#e$LCDMwBYK^YY@71-Z^IG7t~!n+ATs|8nizf1x$ELhP|M zesuOO9@9n3bG-zjgtk~01E@o^v#nQ9`rP77HhYoEKY=;|I8w?*L&GB@Juv6^Xc>fK zLM$4x%_Pv zmKWt?bDS^m^-HgRHJ=#&3sV~TO3FFEnKh0s>2a+skcRhOeun{i%H%NJ4EVwg} zNuBHy#SwtOe7--lMS*I%ePoD>A@P1%=zV5qTX`v(g3?mu_nHW~rT5iZ-nmaxS&ZvH z9=&<2s#F*Xt^{lnwv4>$$hGAN5h1=S1_sHlD5}+$`Ia`AWm5C4K53}I?e~K7!te47 z*xD$+6UHXzqCV&+<#dI}9srCkYu*0Si7ng+@)EbdmqM~(RzvGS=7-gbDI~ZSuc7J2xToTKjp-%^22j+Dr@D4()FmE ztoihs86G}_Dorj#yD5^Bed6I#;&Tak=9!qW0d#_NC}LsPhnBH&s(|Y^f24R;lWn`~ z;y2ri1f&Ecl=zEl%Q8O~a+eZ`R2`iymX`Eb#)3nYGQW!KbRk4{_&CzSL_7#b+wP8s zA63Ogd~Vlu*qp>KsI_o>;e$r^klvQ*%k@EgB4$%&W+v9V^X}vt1;uoz2za@;c0Ggy z0!?L7r#WeV)ia`8 zzg*4dHOTGu|Me;NQu@&&#$q->bhK>jH+e>}aJX8Un}c&&fi4y@guKDZH@tZ0CQEU9 z`t@*|9cjjp%{XC~Ew7EO9-dbnD@Ag5C}UW+h=B3N^081#&j{y z;)Al)=x^Var@*OcYy|M+o3(YDdpqa|1FbjjaMauvz`qEg@ICM@#K(_-d?x%z!S#37 z`W&gpCHRkHe1{W2Kge>`*VFUGhfb2(2w7G~XXVp(^sZroS$BH|l+EGKxVIIl@>bY= zFa7~Z5`6BwaMnV;JcPUJpDW&({=vc3k{~ zZ`&8{;eVhfctQSa5YAg0?k#U>jBr?+5UB)8Ye&8mP%eQ$p}6{ZslUpQrKh8V;j4sd zj2Lx>6OlPbo!|8p!XF+qWa>ax^j&4!bRK(sh$Hvh%@7aV+*hEE#z6}vzdY#q%laNW z64dRJNnd^57uk--&~mA&BK*T;$j{Gr+}O(%-?T4)wB!i($L?fam>G-E(A=1g-&FfT zMlMdUBvxeaiAR>Cq{js&=jT;w{7`MogbCDwNoJ}~Rv+uMT@!0(zexD_597UC-$j)-s2*+U@i5HTZIG3{KsJB%@Y zDqP4$LDm#CBZK4Kk$v1rAijXT{%($Z@bPAWP7%MS6KNAFN8$yLcUcWe?p$dpQ4!E$Znm8S1CYN&gSCFUj^TgcdW+RNjz~ukMq~+>{wjW6;cvEytd+m&UrL*yZ ztx>$yxTL3kYjqZZh-Qkzel+s-7TF6jLd33=+$;ANws3uY@s2n+tX=eaJ%(vfOG{Oi zN&^M)P&rFn(%>JFf_smU_M5&>@Rl5&ja{i#cNA9+?F&n>sVJN9}0tNqG< zj=Bj|;-7#;(j0&_c+ZA&?`aHwUDQROqyZBYB_SALb75p33o&uREYxn5W#lKcdEeh7 zA{?a2{gvFdZ&{Xes^?A97rS7+F~*&9DGvwf`Y)@haoBH@`M- zISfi%R51fwWY-T4Htt~Rva`GRT}S#lpt3)r8O{Z-!arCHHy=NY!o2^@1w&=32Tfss z8af>4ciDdf=fa7rVy+tgS>vJQ+YlON)CC=iwg7xGiXaEtkm1fEX)T99BNVnUEa^tM zaQjaRFQ=X?lvfdyqonzxBl3rAaPu&uYN!QEBm;|14wcIHpK(H}o7Qbq^~A}UnjsAi z7velJHrAO=#m$A~()eT6B1U(M#A0bwpz+e<{-roFtbMCcVWIvIZi(y1f?{lF`4jMB z>sk7o!pp7Y7hj^|6QD%*xhenI2DnQB%Xm#pbqEs=624c@ys!)!J=oKGYP=~>`yX`} zwp_)Bge=6;T~gphpHIA`JZ@wxI6R!JOWyrQ#h-FM<1=E~GjSgo85s)m^tiYoIKUvJ z9wv(kU;d7>g9Tb)iRUllOHM9E*U=1WS#->iiO#Urz4=$(b%wwUz}rQA!x-^M7(GJ9 zzO{h+CC|j|C;}m$LiMWLW(zsBnGM{uqBaZRKd)aM;ZF?hzcf`#hn@E;l5;Z^@S*TbZh@)ok4`}1qpK4$aWwGwewjfpGNfurV zy1;|YEUvNl814}sExixU=EGQF)@xzX@F2SMJ?yh*N!;~Q;c-k6qK^Qu08~NytHGM# z5-%rME9urGb4YHzQssTrP#g7vkwUn*POXDWgBiv^e2nz_Nx zVDeoy-jnY`ipG3T;@fEOnR}i)P8z0KsZ^(uNkvDpyvA=`pmc67T9baPYaWZpE1x;uDPE8c{(w z*-~6w$z>#U%x^6zzr6BDGozA&q<6nohh>eE+v)V4mAvm{VPXmk@hBC9*xRSZ#tvm8 zgA5?2M?$RXNWb9}8-*gzXDbZmC8QJ?te=65RcO%Bf0u;BN~Vq&Ibc;XM~&`c$1lH_ z!Topi;HP_2^q`k@_1Hxm0fm1lo@EN!K2x7CQ3astiat5tQ7Ee#QbQ{-`0VTn2PsZ6 zdv^DiEawM!7@?u>_$MesWwJvf!w=SZhXqYjbXv;#p600jdVS;?t%n~$HLU#>d8`?evMM`2bL>>bU$ly*(DRFss$zyRYhxV4rC zNwHviP&F%qoX_t!MD*HcY+mf-oSdAv6nttX-~l11gljJs$u&%98ND-^Zz@jrdi&Da z7f$<)#mooogUid+qum|iyn{0RNMuEd&g^djA5(}JCdPbU8;KG$m#g`GYa?m)6`#hz zlQ~l#DiM!)DUdE&Rq0dU$mJ?y<{}%tg@9)B@<9C(Q1xMS)RmU1ASkNX-jk26F0H#d${l2r}YA2C;{XLgRa+Ul3FwVQLKH{ta|6^EAiH=$`+weRx_ z0WpXw!dL7pTYeDR0h^nOswxDzf}QOgI*fovfITKbDGwr`_?^rr-hqjCV1$74R*=MP zEUZnMC1L6M{^!5 z3s1LDA!g@Scu#-c{$$+!#1vq=uH28=WBTdl_NL#FZrx#w<9VePhWY6c@pY$l%%4Lc z7Q&DvF=kXmEi&Sx*{;Nz_$a+X5}UMNz)l|F+cEgsq5=Fs38+^D|&5PzBdKO(6YQNEp!as(P^m#1BD{XcrCM~(77 zOMf@2^Oy~?kNy*4@#_589v3$X^m|AM0?anJ<-+Y30zp6fvBfEHH=7=sawI~#=0Ej7a2@z3LqJVhE!N!I@6UgqR za&>xL&|bWF0U~Ok`)V(~b1_j#7fDsleA|;2v5gi+by!|Z3eAa;%iY$#LRdYr!cz01q65gC_iGhJ zI=G0L{S1MV8E%nQTuE^L{`GY{2b!Y+P0X|7B!RYsG=7vpU(o$R`mXYnQV%qw=#-OC z0b`!)RCfW)4zve7q8Gc8;G^?j+wH);`Fj(tt=vu~G#FQc2=b$%qI|I(HQ;e}KmZ-9 zCiVNUFu0Z@5MbR!_*-<|u;Qepq?nBxYte~Yg`g!5)h^s&*ye+&@T!subxiLd#7sGY zD@9Do%Pi`Sp}p^t4Qt%!35~pTTU?ZA+NGK2?Kkp(uTL(DkaTb*(B7AcWY=MDsrsm; z$;Z#9rmR^I@je6(d*b5goK;t_>e^CDC!OFFpi(SmAK`=M#k7sNZ6+2|IA!M0%qnZrFWv*d-SgQuB#nXR`02BB`u5N{q)l% zAE9Rs9L>PzvQoz5`u|KidUWtL)YVH3>o~yNxnQjE8Ri@rD~638jxhK<*_n||O#tzJ zW1~FiNO~VETDWQ)XD~xfzR3D>y=dZRhKhx<%2l5K%)SLR{+=JM~KnI zk`Csr=fSRmGWDu*O3DAlHBsOFX;y-ewkHFd(yS7g)OnCnf`e0{(OCYD(KJ(9nz$J~*S(QwGV_+jD%Cm&t4V5W-@ z3j0dA+m!w5WsYqStWs=l#lkQPROl_yT7lw!7P7su$-pU{OS-@Cg%E*D|S;uob| zvkc{POULyLv=7=u$P_Ktb9%U%MaXD8c`XChQiULtvAMY>d|6q>5kWD!0Z%Ul>pY#j z`K&Xd{nx(DSK7@Ketvd|cXW8|7&Lr#J-p37iXzGG?sFB7Z!WK2{b7=<%9#GgOo2m8 zM5f>R>^I^2&5FlJh=<7RT|Mog>-6}ct8@}A6Nzav+i{K{C@yN)Tm^fZl^pXG(4e%-8v5a309TQ~D_zFTS6*uNBan>z=QZj+7 zZvjP2+FV-Nmv-pC;Mx3+|E(Z~uiCu1OE%$E!%*&&Dtf;{OEvJkOHa@n& zT1Dzv^jpbTtKxny&zqYt5FmniTU7->3vjubw7R#_x%|P3zVsLG{d5Xg8F(Y3eB*0t zYq31pQjWcr%Hzz6b4;2e+8E)sTK*92qu=f>Upi0|}k9Iqz%%46>##1djFctwn#F-W(> z4~)O$_T19YF!~|$bi6@vld`Ypcy`(+!G0N`%G1y|o7U#|UNMb}YZy;i$>+7F=cl+m zwnrimhNq`D))5=8n%3A=WcT9`>feiXMkbVV3Q9^JAMe`f>3RyUO9Wdn4d3)1|P(U0@e_yP(_-Bqobohq^zhg zwnT@n);I{v;b}EJPh$a~l&A1oS%ZmRgkIX+H#D={UQQ%uPwJv7?l>h?>0^uGHKzGx zXfuUMafo?WA)}(dQm^yS@1)_IG^O3DdXtSFAoeXrQt{6pluIR*PhY*y^(lfoT$VhO z?@<7Bq&dma;^*$%S%gCF{$K&qk3keSX!UnJ^9U@{Fkx7=1j zZkq{-#tXk-Yysx1UXR`X$z^SG`{f3C_LmW~rmocbPyXfwsV+Xb^IO5z)}GJfrC3p4 zEuUUu_$3EtMqw#S+IKeReC$m1)OB*qZa%SLwX@F%EZg5S%{tI=J-iaMdLUd zQigTTCq@$!BFEKbV%_pZ3{vM=uJ2;JMO^!jjy_B@bUqs#f(pts_XLi#pEk8GLjXGw4QyElwLVTJIjJkV`~NTwzxt0iRm<-T1gv@62f}x2uaF z=`gw`ygRm!(=N|H0~KuQW%E<{+_?(NwkJk5v8G;(%#qpJMfOpmF-Mgi=4S?Og|p}g zkBde2*twZPjekM`>ZR5M+#IBI*{=*!42wLph#m(Z5PTGWXL?LZ)cYt(j-Gm4ynoRn z=X0)a9EySnk)q)UGKVTK}sBP)Q{N*eW*q=66&yG)v>2z5Vh{ z^k?dHcq;nklcgrp-Pq&r3HB7xo$O!+#Ll@1d zrs^e*Yk;L;Q{1EnxIBju3=GcdnjbQvB9}37b8|Ds{dv|lmYdrf6-J3l{XiRkfR#_M zXtXvVf?F;}y}?ryAjXc)+@Dk4@2~E~eodGwNo_Z);0HfD)6MFa_m{sH3)3^u>)(AMbxu`n9}|A3SjDqj8x??DVlXSjMTjvri!_ zD@)}E56h;tE>z=1^}0uyZr8JC#Bx7#o`$q{%}L`)6?oR=fuhA;x9#Bg@NQ_yka+9d zD>6lqx9SWnuQ%57GaUtz*IeRrev6P<$A+PF#4kDEt!Aq+3Vu6B;!z0P>EINDK@vz@ zV}UOSb2ZT3V6)J58F&4HMmffleKZ7#sPDy%Ri?WF>_#A8hg4m31e@pKDu@*HQ>;IB zE}dQDf}m5osHv$blSB};KUcTWqfAQmOsu_VqNbfie^68Jw#9@X<;#~l;fg1e1)30` ztzJMTJ!FO4sGTjto0LpGNXCtL_G9tNN}37P@vbd*zrKZ$J-A6@{^T%frGEbWxuT+? z?334VtDO-;pXXEOS8Q%u6ew@2;CK+8K%q5g3tVzta#;H+rOFWs31{^+EGvexrs4&- zBkg1>9c^t(-!GHP%6goGrL%th_^g^x>R<)pm|tgESwHanmUGxqB6?h%U2h@y1o^f0 zJ+QH{;c{eOQN2YSf?fEp(hH|Udvp{D?$Qudxdp)il9H0(;z^E)VYeG)JAf`0_=h0; zOsvAV#JvNTQs5AXeJ+FSP3mJSI0knZAKitWxbv(k*zHo)LVY%zSF27T`Sw~q`4o(MPClg z$^Up&y&qlm6%y(37N>^L%1J-5$-rV+ADS#AM9-i1v=R$(3T*>F@DcuZv^azweK1>F z;T`EL$}HR4Zt@DfeH(#DNez=(7pr7L`^^Py7wE36j`zO3eGm5hj2(n2R6>82oDlxa z!=-TmdfC{~*USZ&LO0C0Tx7SQ=?jS;aG`-I3BrHG*vlSBLdPs}m;qwc!e|TD27^(`^PSKn7vrF%Z5a(+%#zj?Z2cx4Gag)&mWDHxqLac0TQEu+cP~$Vu zV`2tDs~r5w0b+c9%OW_l{`y851{2J2bJoW8VWvM8_V~w6hxx=12x4MSb4|Ii3Uw+f zKTVP_CAZy0q4W&=;eDTC`jQ{!Y(QL$3lIMofFf92No^KJy?Q_SmbQk*!oqTpq+w6)Gk5dpHo}A_E9Nh@D;RA!B#Y#Ps8=`iTnl zr?y|qP#(s}xx`$+{eJ$Fqv=iQh8dIv-38EBMkQWprITpLQ>pObQ0Dmglq9kokRM<2gB-M0X`fpve* zUmjF5BvkR@YoeEg>u#!|YV`(V{ALT}JiOb2+-;a8XFYi$5#u~fv z-OTz?_ot|eTV4KQmSQ~&`(_KwY=HT7Il{cDUa`vaZ`yPa#Hn4PzqG!tK#d3Nprazr zhPpcVX`sOJ0hvlkK>>U9cgWox8Q~QYGSqpmmaAS@Uw?Hx@$wh?#{8O)aCh8mcn?$m zf)4+9NXNvrnh@^}uyoT93$ZZFJaKrL@~Nf8FI#Rf?JiAgYabz+61WhuQ;HiKH_>r- zmX|E<1icxK+*w%I`7^7n>1KsdpxFxVb?t6FCOxMzDs9051y9ysw)3C9<@*dx1FOVFdi=v1XsC;iS_D+2F z-wMMC#wueHE*=DBAb`2FdwTKV1AdA2Ii!K$l5(Khv;N=m9qin2)rNyjzvLMF&CszZ zsmiIZ_beFeKZ1et2n1QN!#x`GD-KWw*YiCDiAq2v1O=HGSItd^DzQ8sGn?!9VzJiA zqh@j(-m_xhY_4P|=aq(mzFCfAr8Lr~vtvBUhZZ76T@0fbP~rnQn1NvpoY3MEI>owW z5KkErg0W!SrGbV`_7D#PhL|Pl1&}ieXm{m_@z^%7_z6-ggx$e!hBs(L|nkoadNtwP}mUk}@{^8|D*9v+|}fYeq~&HH#V9pg=x*Oo9% z%;I+&ojPhSwYHV>chb5dIA&5`dXWWv&bSb>Fuj3bO;{;#^#qYQjKw93m?fyA9lnDL z0=URG_VAmxh|tJwKIcQbpSCekqR?)4ZYLWqpd`|L&k9&NN4vYR5wDihX@M0{R<>7i zh&wsSEH|u}ocsu%{Y_=*e7eMgmsZ6KPWrrUxkEN{;NSlsDUWq z+y@>`YHBI~@F9y;V1f%i;I%RmX01ApleLGE`qV^so{mRAa?jNHQ(+>zUp;nXY+bW(Ex^4~>9J&9o@yCy+ z8hJ^g%M&kK+FbnAfby5#bFjC^$%$OAF5}cIm&BxLLx}K~dYDNLd2B_}Z@J&}e!HsY z7Oyk>wNI1LhBY-c)n;C<_7E8%xAC@ADX+p>&%w9q+hZ&Pc(^fXYY6DN6B7}^)gE}M z8zT}w=U%~}^!TMaJ`${Rv95)=xu-6?1Iev-F>J>I_KY4bQq$87&$AOP6i1~_UXK^M zPZ~a9e#@_3@ZiCyQ;GY|RNre+{gQWcnMX%QBS-bMwL-)XcK1L-#Zr|2%F)fTckS1^ z0&bhIH#2w|huFlI9rGk1=dbeW18*G6O(2k7M4l|0@n2sI-~t{eN*0S?{VNGCm2eS8uG_c3&{Byy7!0+jCKU znW<@Ptf$wpV9iB_5Q|XD*DOfDk~ud~`I3w783{8PvL>fBZxK;=9YNFzt!z+GY)iF* zWFbcf?tD+RwU^s+4+KQaRP4KoF9;?&V@>|pf2xbW7+s`rXXNWeg_X<2DA6Y+9$ zXNv0GMHRn9Fm@MwFo}S&fbmh1!nDoogl!60f?5D8)>*|`qCGEB9fu4Qhn@NaEm@+Pp>*6o>upioIkR|+7 zS2qFr05LITp!D&(+%QSCCq_lKCI+PnUX?03X8(`}>1GysyzSrM-8&d?dj?0kx9O8_ z`}esNf)q*$=UWIaek?eu0Df0tNV)Ri&tDe@D}A>sEGNEl-Mt^ho3O;lOuyv$ypgC* zVtMl)hodmx4+-YGKUEIJ&@m8rgoJTvY0WSI2Nolo4Xk?Qr~+bm0Itx{yWiglyCKlZ zlo;+^XFR(!LKO$euM|z+qg+}H{CEyNPR;>c)Q-NsyQ8ELZwgz^i!%bcEd}}bM$cbA zKs!`|FAoDS6gVGY4y&me*kS&o^A0R|&j)-IIL?K)l?8dl7~@KfoAm7obPqsRLyoIR z7kd=@wfOEeOs~)eRG5i^dsbQx7b9<`LXRPK16q$Ua#E~%U?f;rgh?Z+*l88WI#JZqY{WzrL@8*0b=7F@Bu+gW5`_|yur6(aEFs=au8fk1l^MT^%eZW0J^YuZe|7Wd#QZfBEtSdi(HCC9FX9dQ4#(wEX;h zE2wWFDg|~85zrfACB7BB(;iEqaXCa-P*CfJZQ-8-Q(5Y|Kuy!_NsAf+RibF>mXAM19r|mLC;?yN{ zjMK7o@orGGAUwlS21iHv947g4)n7x?5+`_IY#H_o7Sxj5f9%-4QepzQ@aL()EiUTn z+{b)k>IGcf+*Os8hj4{PLVDMC1h0Ag!oeRV=;^MxX$*hak$O(u1lbu%*;NU@VJV{` zXI5;kb-SFCP*>^S%ukDpi{a2}`=$TsG)Rnk>LZ*{dmfD-;;KBBqPQ=5y4X>Eu#)`G zdq&6Daqpla_%&V#H>`px{oEOKgU2E3=vwuH0S-F|`_Zp+a8Ce_tg5{HnwCyU=5gR@iWO)*Av0%Z!j$br4f6oz4VKIl_wblj0=>8Pb@}cq@>o%UyXe)C8-l!b{?_e1V2~!C-D#;2?4Ss7;ui1$y9-t zt!K%pp*9BOw;SS6?KtmQDUfHgx?BKuxTJ!mEIx6W49##l_6%0axGNB0c zU%0qlSjHL}z{K1nK>N9{2Ql57chPdRi*6wY0FtGRjT*KRu_#x6_|`XTNeLt8m~#Q<}~`L;077w;s=7{f?>XSxaARu&cqka$+7 zE;$6o(1ZCBK32HGtvW!eAKbOqH#T6X2v6B&LdwE`lmQO|$VJ+4_aq^yHEVlcYT}t8 zJi5N$deJj}j3#xh3|A2z(t+B(`@`!jg${cn>F{~MsSkj7Iy%d>{@ho&SjeyCAAg>! z!LQO!1=Ut+D$I;-B646)I z1;xd%pISOQbJjD#v;3Q)r=|v1H~6`3kR2>m@SGqm$Q?54pppQ1cbVU{FFD!R(AS}* z;M4S~E$oo1WWeSt|Kf6}46dpVD>P{A0ed(#>dCIm&PFcuP;_a;TMVr zr#CI2&S7LgNk*oSsRnalUEsIfis<_L7knw9p>UM$Met5TK4c1Z#HP)EALTCE;AJv6 z#_c)s9J7Usw~Tk3U0sj9nzlmimYM=c-VgAxcWj^`ulcxCJo*X-D-cn+O#HX4!0oCa zDcK5WZ0IoACllLO#Kk~VIDGmrtOPR|FwLm|$-hE&8=+ffcFT%EEIB151q{^=5KT2v zJ(^S!zIbp7aa=I&bOj?2V3r`d(^`_Yfvmdzg6+D3rxD5ZnhyGqvFs7#Tc-9Wp6Td- ze0=r|5hJImuMgJtA@ED0V4&{5ap3t+KVY2*`T=HTqh_p@v~Q@P%df1eS|fW^R}v1d z3Yb2wAjk%AI?P02vf(6sbuwn~N%VRo-H?J{F95LW+8Y@jZf*-pOB~RU!)Ac^&)l*1 zcj>zl7SXQj;u5qGNKWdYdrrnX-l~7_xyE!C$0Pj?CML{B9>sUM-p5BpMwhdP=yW;hoIp3=2(R&NXTL3!$WQc$I)NzegdGPfb<0F zI3qX*08L5E^+6%`T~H919MlSc3Ni@yxv~HLF#bpBRdcffaE<%#0$WynIWc?en+~z; zH##+l$b@@U$6)784K&q-WL7aIAWwTgs@<~U3G}=~V6+T<80d#y0V4^9%0SnRP;b z?3@4hM|~d}I(KjiuL@k^LG5v$!yIGWSXY-mw&SK}0zL&_DD|L?;|p0Qz_o_I^DsNx zG0{SY6Sf-gf;<2KB*Zik5m_?bnXr6F_kV|a4{(AjGGA8%vX!U0u#izyluA4rBxZ0Yi4qQmo7$oYXB8p- zpA%utRSZ3!^J#(R#>f{agE9x!;MalG^|!NAvcX}d**>cO&DQs^F+CkEA{ZZl;733O z7nn;hV+1uojT=RfL_q6Yc|}D;!?>F~P%$ZR+#x=6I1M8}teya5)La04xmnuw6A(Ax z2301ICf>Kr17TsTI+_}_-$!0W<*)a5K(|UtNLT_Y8rZAa*b>xuB4?|xuUkB(eE@Y) z(C8RMkN_?hE*tR8TqQ)|>Z1#;-7M)aJEn_Bnm7elLOYPBA_ab5ooQ)t0CnO67lBK7 zcJO9a_~OyTSQ$Jpg<6f%pHnPVQcG(HewBLDRy35v*6Z_@>*s7F|EIHa4~nvk!uW@a ziYeXmv&htEnuru$IISie1bAz}6 z@RF;3$QLf!zMVV)Isz#wT6*RqJL;)Ho9(UdEHfAA-&wkJ>#-{JeNNlAP{pVT*im(# z)`0~cP4O*BOdq%b#|Qrig=Z0sZOBYr_bCZ{V`dc3a^F^7E>&zYOK-^@C#C62HDoNx z=h{dQcXw!ei)9Uz_3hOOSs~ZYoJmK*ryo>NN|cY0887$ZAmO4b@(OD=_L$8pI9JME zhmNa`;UM5=cs0isifb9E8xVllqnmN2K|w*(pu^_zQ*SipP81Zt#>hAzZ!SNPW9IqX zAAkb;y~c4uc~j1g{It^0=X9T2qi)oPbC;l}`gS-**B zp(NW$79u$&u<8UI>w`R zyB*9}YHi?BN%AGQsQMiI(P$@2D4uWXtLg#NChs}~j&j53y)d?5Q^Iq_x#8e*Mac zseQ@Bj;ld;KJ{<{ zZLJlP1x0S1d37_ssw2aN8ih&{d>#alff4T|C#$i_OZM=y_EbtQoli=wSyU+n#6Vv5 z5LGYdQ8#uXW{crXCsR1YW`dUbFS{L=$59M;Hpf&JJi&0C{dqHwQ6>KjbRO*ga+&{6 zXcus~VQnGVHvmxXL4gmSJv)<{kBrP2rOlpq@Aia^Ib8a9b^bf!E9mL6NbHjc2h9(< zGX){pHa{+oi!qve;}8Wfj;tHh!-lz(^EAF{t4Op}M;$HuDu;L3) z7$XVwc>C-%7!s$Qeze}Ddi9laNjc4WgTcUba55U(i8Lw?&GGj0bKP;aDp0AKBq_b{ z)S(o)X$o6$+L>_B(SbSQ^a%O0mdSJ3kMhWT{kc^Ih$vlj3(A6~2L}&Rl3+)PnV5?1 z1G`7(Eoh16gLCh4XCmQIm(*sOBaSyTT(elzuxjA)hi-bTQK@`N61N0K?G&#>q7JYT zsM2iMF#n6|iU3YRtcPfob@#`IQ~0>8mo8z^xcktd0Ko{v%Ya!yi}f4DEJIT}7{-}c zgMXMOd1iQ$QPff9}*t`IW0 z{OhxQTjPG`CbU@@<)X{yoqCDSc6R1=*RSEwbJi%o+njV!8^?t@M=RI-If2yKD0%Lb z*1xZswA4Bd80>jQ-6&JIyz0oTlK4ZS|9*7*w?qBPrrH}vs literal 57432 zcmb4rby(D0)a{RuF6k}-krL@{X^`#^>2B$g66tP`25IRQknWZikuK?mdw9S5J=0wbxpkFeODPbQEF~2!haMq$N}!2o8J;Lx}_n{)re5>;?ZIJ4kCg zLl8#y(|<61_QfU;L}R^^scPQ-c!wV(k`h2eV`Ojg#h=n{ul~#IZ2d>A z@)^b3n(`T)gQ_|mpB|0!`nqxrpVAM8n&qxkgV-=cY~6H0G(jTxCXWw|X(3Fo-+5Ot zvwaT*x0al^KgIa53IxZiSfVTpEjcNbbcoLyXM%gf87qsN+E_jpJZg}>xzlnURUsoLAyBLr4E zu1glESehO8QTQ?8hu0O=)z!TdzOM}rM@^OYT?;0t{gg@^3NEc0@%~wHUf%j}D!Tx= zeetsZ5lJ+9++FZv^9x>HUK=i5uZ8(}A`+5Y@Jg*03)TcIdcVNcb#xZWv}^KJEd2(m zjQgVC5Ha@WYqrL7#9zM4TB@~-FG(aKBI0*DOc*ffFVQJiR8+LHw|}Rgu-xJIcz=7T zS)pfXMhezrIESbj7Y`2xnw*>r`JYdnqeQ2W2JS21Z**Mm&CjQSL_9p2B=hF$ZPSa2 zUS^NYvHW&w`uOpq@WYjHM?Yoq&@0@*weHZ^srZ-g_;`3e_k3tGeY`szn=Ft6D+B|9 z|MkC@kwJ$1N6cOnNkx;t&6~gu`#J62frJJ=FXM|}umttFVp|MyL&VAy2IVw{VW{X*w|oZW_I2heXF=NoH{izp{%6z zwIM=;Qa*#{IFfs1oUFE{Mova1M~S|_Brq^AGcz+WF|p*>_cw`|Q5k%^yw8z> zl9KS-OvC=Wd3boddi82S^xeBLw-paW$l?CxJU2JD&Fj)`xfw6KCyn^%bt)BBe=)p{ zKV?jH&v(*ai5x+8V?_zY=KIhPPslMb{Hucnb-Mq3~~W20|Vcy ze`|@1np|957d#l?^n^Se86w@r#zy&ct^*KX1qB7?=jRI!q>z6@LqlYwf}~`~3a#~Q zna4(=<{5(dSe7lJnwFkkS%b|)?%RXt@e`&gSm>lE)RDKs{~Jn z+3V};-Hui`Iqe3rz-b$X1&7vTIKaJAMOAfcBwdOUt9IRj!xO9}`0O^ewlf&Bv$F;* z9~DSm=5OrIl+wd>b#; zc3{KlZ^GD?T!9L9n2A*@_an{I6=D9nVztRY+}+*X3#lkVNpAbq_T}DQIzGOe9|3R; zcFTMYzkk$PP8F-|-X3*SHaN|eY3n2W-PlO&;KUEt2M++j@x7+T+1Xk6>UZEwspjIs z0xaZve?BK3ijms%@%T@VhK5F|M)}~#$Vh*``^CID92{JHT%3I5d^}o-jL7D3{IflgXU0MkD{X0M2^;YK;qH1UiP_oJwaxRK zfjpXv~`L{z0f3ANVxi{DZNm@{)Rcdp%A!dHMMb+dO9` zCLD`<0?tH^-wEsM*C6ml`EF(Iyn2NpBs5fMILA_4UhWEtf`bDgHOy18g9XVh4+n&s z^(+%8@COT=Y^eg%e?&aR@|s#)OD~xG9v`Bb`Pyg$0s=ryAX6&=rF;9?)3aitqM|_F zZ>Xy)C@S*u^u(y+iOEv_=qjV5<03_4Qy-X|eAo{%)!qF)qB_&l9tMCtw8#Soajh$O zW@ZMIH)IqPVk<{V{D8XZoR_qg@5owP(ZsVrs$W}Md(-G7N*SY!`V`WbpiUCJHeh05 zX$Nlzyl8JUh43`CsAuOL&P%)2`;X2VNva}0Y9H?q&8_*tFDPRs&_L|wg)S{E>9>5$ znb@8xdiU<>;DE)!pbo6Q@_Qr!n}^k}1=IY467H>;*(N|0!D4G)myi7(Z?h%yt^q8F zkB>(@D2x#`zC2uRYHAW^eg?LdRsz)1M-I)6&wKo11NHY|eUTtT>4yHRy4PBYOu2QHVhCx8NWS z?Y2yoDNun8@F#uG3gX1NTFb`Vyr?Bnk7dq+10>ZXxtWCpS?X8_(%08_Y9bBop8xer zng)9@tF?e3QI;NeVR6xzl`v5@STYY>0TP*={o+k+g3cD+`F;WZ;7xoHc-zzB(_ z07mzIyualCxSzsqK3Zoz7ovkNE&Nr3Vd(L8HEKcU=I=m6-->*bo=~kyBpI$s*vrU5 zZu&%753)=(6e8%y2Tl(U6$O2Rp|adY9soB_457g*m9BN;peU|-b^}of-EUA`eO(DI z$~RH=#tg4Z(*30o!%~f*g*0+cDM^4x5w2&&!4rc&c(=)-*JW2jE&-w;ap!w;V<~Uo zpdVYOrza@PrpiKFY0&}ga$)gceC{AnP0hH>hVsIpL}N8W%eUl zodgyH(bF^KtH?75>R4G>Wn^S{>J_RmD$^%yxV777G zNJOxWnB>#?ZQlgj8oVyCP}sRTf1hU>w$5r`+J}FU1t`P|Rp+QAK^CoO+)rqLZc@nGt)CuXk~^m%E%yO;lvyr9YsYuMOHUv z%XPei=4JYj$_lkF?s4WN2Wm;MF4H_GM;C!mU^P${}W8!={>pgG-S+3z_Xp zz$#G;%-YW|8~}}{{8z;2;%Q&LlzRL2{<7mS7_)2wo|dk+vro#4`0nnM9t{Cv1vqDV zdO9cG8ZAI9hl4osBB6WZ=GpFC0moq5lAhbQ_H=nlEG^xgz8fqXn?zaD%KYzLYtrzo zsm~^qm9a}C+$8!-KYlO6q>LUTfUC{UrtnTA=Kn!y(f?V3C7GLxD`%32ztB(z_kcPXc^C_7OiNXaQW5w?00C#F6cu=ig}8l472RI=}z@ z>G46+{@-+osyOv9A$)Y7+wRY)MwK)Em|wqbZHl>2f^%~MO2}IM9(`l7D_3O6qqh$2 zS_2m+%?(~Lk7f}PlyZ-*9owxAWnx?BufT-;Rp~K7NVju*5q}Kx^+n&o!GVpU+zOn( zSWfN>d7UbE?{@ZX94ldCEYL4W5(2<3Pp6tU0f4rWyh*hfWlX0;xyEX8r;) zIofzjiw98)i?Zl+EMp$UkFIs$k*3w@mIx~xxG1#o1H;l?c9yZy{$ea}7PSqSuGeyv zu#g1x^P2qrvA#tI!43tH{6>CIfD}a~1;HXfIZB{wK+o3e#>!FRF&`x@P}$kpL0q53v5MxNeU4?~(v$Gm^Tsjj)v%UaF9H}Uu@=Y!0?#^4G7lTCZeA0qL;k>}5*>M?(ih(*eb!3*rW^eL! z$o#^>mju_*(E;RtmvdIa5X6u;XjOK!zYhVgsR?{bH5sEU z^T;TINg?EYd(dF$d%Xeh4DxkbtpgW3yK0V-#XD}hrN-?yp_mkhZoE{1aM69bEgx;c zdtJG*@3`OG-)F)_nYXDIp=9+eXJJU(?IAE69vtLzJ0y+pBu|eS_zRFKdL6DY63ufa zcK&ol^Av5#kJaX!+;g+DiJEG)M0d=ni|2`i5LDXqijJ>Y3dR9`@gfT2z!DS@ip+t7)S=-29Wh-Wk!r> z9%z;OV_zsJD7^a~CYk2}fc99n@FM`{;FVfBOaddAKrh1ss%K8phcb~IC9IhM*~>TC zM280iyMKDWvU#_8i_^sU)r@aAT`xz-OPRkg4N#(wAAPMaASf_sy;oP{9Y9IXs^rCh zi;}J-@cQ-9_IAoIWJk$8S#vXUc0$QoZc>b`jSW0@OO*Xewxk{NXT?=jF%s0lp`q)? zSHY+Rg#`uLY_}uatF4zSULfbUV83y}36mhj2<={bubX5v)DunsAcoMm+dSy6Uw7O& zfws#$%fsyJ(KDj@GJ`fgCMKKW0zyVDZS8@-PEC4I)jV5z1fpJEMvkuT60nJr;(08m z5|TmOHM%jz`j5$aEMtQMm}u?^7`%-V9v-)8R*g9m7HmhGAe5I0?E6!4v+*cd zl1tSah|myDU?%*-PL1J~=(!UzkD$Mfdd2g@yPa~1lPZ5IpvD}Y+rj!nusR6GbrSpU2I zYi9o9FYK@Rh59cNC1;7YWOL8r@aA~+a9V#-icFV`|z(8?X*(cJ0 z+jb#H{`mS1tTiSyK0m)>Hcmu1*-@X5HA2JK(*lp`jFA{INSpu-K^m zI%A?NE>uy`=4B@(CCN54M7)?Eh8$lTs7iNPmNY*#rODZe3POn)4vzR6?0F82&(8LahwXoKaZzEw^JpqysepHLyEO2z>hCWAam1Ed zhHh(TXE$q|W$vqyJUA!|a9V!%hw5fLL$Isd_A6)*Jqyc9jrqIBLCiOUQDpqEaBu*V z^QLgOx$I0bRWiaQLsixFjg9lmRX+grpAl7-m6@;-7Mh{2 z9lHwyj%75HUxo(oUCDpe*Kaiy`&nNyGVV2PWu>#34i3b>G(r-959nUo4tDu_xZ-o$ zjTyT>FZ@VaZ#ART&uIltDnr4b1%4tqD0-cpR77rUKCMg(sUlTPZjVCv;k3#EKi2bE zgH<|BXN;<~swMu&8p&te*)v8I7D}FyEG+W>yOso?Sx=8R{k-kHY{B>DZ?9}J93#JU z{$pY){v1YzC|4fkd7}-}^`14I%T`uKCU(H2y1II*P(i#`_+~q=vi*jEhv(OJ85JP3 zNHNU8nLr7qW@E!H?9}Z7ome!v;LV(&A9@|-J6UDriM#95zDSbGt!%%pPoY@Mo<6H4 z2M0O_fcY{%-5gIg5W9S3iu?g(IqRRd8U}|}N^s33C9iDs;8`Qp7??ek$T@{@KZZ~&pFMU{)6>(_ z(!RC-HzxeZ!5;1aD7)pUzyIBQ3G8b@lw9o3$7g2?Pk*`#*J3*CR+p!926wse-B)%z zu;I`m1bo(FT2_4(I@Pmj?7WG*S+r2Lj_1)ao zuL;1>E^lkQ->dA1%DBjBMo1sY;&-bkFFyda&&aE5Ev&JL_j1wxZDb_*RAF$(!wr^> zUdG-1fuLaUc{IvKteAMt#njQ)@!s(5?aA3$d@MpxH@A=MExnt|%QKaJ8JPi6#KNWw zbk(%jVbZ?*0V1EtDJ+ZO>grFdtgL&3Z-nDp#~rd4LZp)NLqZVn!=C{}!a-fFL}}sd zo>0x5JQ7-C&g z{*O#FH2G4`wn4l+JUoQFIs}YOWMpI^?$>aF*DCb5<*?I;Nle<*$wNmgZE~F3u;@e> z^fYl(Q$-ExY5*CHW#P@vy?fY97j3!yg2!m!ecS`cuop#yjHSUv?+m@x(d|S7yu`Xx zrJ~T%Xt0>Ya>l!-P$7^9(fE~9a-_C&_JhJ?3vvsB^O*k`TU+xB(R~>*c5Jd;7Xx|) zc9>Q{oMQTi)gr{$;^8ygOetrkxRWXFo4pp(fP^&-(=56H*_?-H9hVOigC`*&p`KVlnPXP`EJEq-=?SoglSi3X6R#N6Sl|A7*U(UDZrSw6 z4Els?ZOnklOR1Ltj^<6++C`2MLr{)cvIC8VD{@=BCE_2qh z&DQo`Gnu4RasUgnvJ5aVqGaD5fKv;Com+&$JZF_h3&8xQX>`=U|L(1#;}@j5cj-y zzq#_7qC94eMJHb91%0$(@!Fbf@i9d>f&;(&HgR#sM1 zn~q;a^=Q^_^K@Nqc16S>bw5F;fB_ubpK&s6qj0C7~9 zlaphJOGy`x3|;NljDbMUf#sn7!Oz>{cQWvP<+yjz-a49H=$_+jBl*Bf+Z6#CpJ~f+ z($p0`+aV1!F*T)Clx6EcuoeB2vSE?%ZS%$|ObrF9;{0b)otB=NnIRvH(-bGoSyxBr zR$ulrmI{}xsl92wudm2HSv&-j6^WQFfrEnsg0g%r<^k!;Ca=thOSat6&1YqGQx!d@ z`fexdM)3X&CyX;mBtsj5s-r|hS#I5Fn3BWsoD6IxnYIvh1@r_IlHCXI82xNZaHFW052x;iW(Lcr(7#r_hM zNFexCRgF7*k*2xGnJbbl5X(^lnjC&bC<>N|g-CPPIn~2+wnCA0hv`PU2i&=T|Ah9} zNeQop>#QS6RP|p_W7pe9do5WLO}@ZIDX1+gt1bx}TA#2GbWaEpqe_*pwlJ*ulCZ%s zJC~YjYheWo=^H59@o+l#mW3d!&&|%w@$&MeEr34U#l>Z*>& z^LxZ&)BsY%xfKo?LJiOx+0R)KiML?`x2ML(ziO05DmwB2p++)qqK^FZ`VPowEV}i> zC%SjnTiHd5U_GvGZ}(S+%JW68ji1= z2NNtOqNc&8FW>Bg1thQ|pFJHA6#=Q-`0-%j>Uf=b6+XP@5TJM{zXsO=hL{lm{f(hy z)Zi|1O|W3;ldOQNgi(=Ire9rJS z6BEJPT2qX%M=R!i%0({H|_}>e^fA3mAAi@1ZK)7#xWTC2|d{wm%(>cmO zMHSn#2FP(MH=MAab*`>W*9CTJM?~yq0L?KnGAbjMA)g_EZv@Dr6XdW^g6&(6LyC%u z0t36df>G1SL#qv2-QO@Ud;!Vd%L`~hm@aMsZ&HVOoi~A&C;9fRexn0SlLU3_S0(y# zoEo4}2aCD7xKQo^UR$0n9*{j?zpbXDXJ3rNa%h0!Z9bZDd~(9ZH)K`==-^nCAXit{ zLM~Azk#}N>ilcF~a@aUH$t?OefMmY7H~}*6IuM`XA;2ZGB&Wy5#-^lP1yQ5J0#4#? zEtDci%m^?i-_%Rb+NmN&iOGgXM}-{!NL;)m&HG<3fUa(OW#!SLeMe+U6zFU~XB%e2 z>GyC~7nqp#5LCs+##V0|&%y0AlFGgl{@TGzoCSgifBC)N{_+0iTD_^JbZTHn29Hvx zgPE1*XK{Ov3EMF|VqQBQBV#Et4&6$tNB7X;;;QhEp*>}zXD?rFA>({-P0~(InEB}H z`fbMQHKtRG^xD?m*6eaq(EYlw9^f`D#ZFPRU-e+rLb8)c9 z?RBvq5rLMY)MzvR9f1DFC-of&iGUya^XE@)US2F&zRFI*D^)QuF+k#uFD%^5>e>UA z{ghk3*5Y}v7_aLtE=ur1yU%SJr#0xJ=X3{hVBujP|BlB8ep=dR6N6rNBYW($w6v$2 zBcQ3}1*-uXh1)9eU`3)2(2u1i=kW0GP!ChjMAQ6xc zwZZehWRIogA+_rY3Y+0fjE$vJ)wV4=AoP8FD2$E36UtXA24Xx14qfrY2w1Ih>yEzn ztRVbAlLRs*;B?oVn!tI6{6RUNu&AA$R(t*Wb+A~q=eZRSrczQ;Vq&nCVgCRL6m-e* z3JPz($QiMw0H!3psRhtH2X%9C@$s?A7l4riyU~G}{lP?lg$gbbAiiDvLRfz$&|UEW zKCzBUT~kx|d|DNh+J+H+Y?L?w5v-DI}DecJgRRU zI4V+-l4jS-COUx$;@`i2{{A32J)TXyd-2#2Gm8ayOF-Q?G{&B=EhJ=BccU5{^@Qi*OCTTWfUbT!ICD`+Hg!@T}zWy6;I+WCQ zd)VT0i#rYrU;P;ST z@XJiAQ~{5ZB0w_&md8@cljJSOl|z%B?RS#E&fmxGg5ZcpL`O%5g^417obKb}0|SA* zhx`G96gswrh=|w$)G0;9XixHz8LMh7G$=-zrhA0VWU8(1Q?TO*9vW3;oXtw5&-E_~WSb$hkd^KNP5>IvxoHMymNR{f>vjnG-17(cT$u1%0A|-T@Gu1`BH)DfyNd`7 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 - %\VignetteIndexEntry{Custom spatial models with RStan and geostan} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} -bibliography: spatial-me.bib -link-citations: yes ---- - -```{r, include=FALSE} -knitr::opts_chunk$set(eval = FALSE, echo = TRUE) -``` - -The spatial models in geostan use custom Stan functions that are far more efficient than using built-in functions, including the conditional (CAR) and simultaneous spatial autoregressive (SAR) models (both are particular specifications of the multivariate normal distribution). This vignette shows how you can use those custom functions together with some R functions in geostan to build custom spatial models using RStan. - -This tutorial is written with the assumption that the reader is already familiar with [RStan](https://mc-stan.org/users/documentation/). Users are expected to make adjustments to the code as needed, including to prior distributions. For more details and an explanation of the computational approach, see @donegan_2022. For more background on spatial modeling see @haining_2020. - -# CAR models - -The CAR model is a multivariate normal distribution with covariance matrix $$\Sigma = (I - \rho \cdot C)^{-1} M,$$ where $I$ is the identity matrix, $\rho$ a spatial autocorrelation parameter which may be positive or negative, $C$ is a sparse connectivity matrix, and $M$ is a diagonal matrix with scale parameters $\tau_i^2$. There is typically a single scale parameter $\tau$ multiplied by weights $\delta_i$. The term $\tau^2 \cdot \delta_i$ is the conditional variance pertaining to $y_i | y_{n(i)}$ where $n(i)$ lists the areas that neighbor the $i^{th}$ one. - -The defining feature of the CAR model is that, similar to time-series autoregression, the expectation for the value at the $i^{th}$ site given any or all other values of $y$ besides $i$ ($y_{-i}$) are known, is a function of the neighboring values: $$\mathbb{E}[y_i | y_{-i}] = \mu_ + \sum_{j \in n(i)} \rho \cdot c_{ij} (y_j - \mu).$$ - -The CAR function presented here is valid for what is sometimes called the WCAR specification. This is the most commonly employed CAR specification. The connectivity matrix is row-standardized. Let $A$ be a symmetric binary connectivity matrix where $a_{ij}= 1$ only if the $i^{th}$ and $j^{th}$ sites are neighbors, all other entries are zero (including the diagonal entries $i=j$). The elements of $C$ are -$$c_{ij} = \frac{a_{ij}}{\sum_j^n a_{ij}} = \frac{a_{ij}}{|n(i)|}.$$ - -The diagonal of matrix $M$ then is specified by the n-length vector of weights $\delta_i = \tau^2 \cdot \frac{1}{|n(i)|}$. - -The `geostan::prep_car_data` function will complete all of this for you. The user passes in a binary connectivity matrix $A$ and and specifies `style = "WCAR"`, then the function returns a list of data inputs for the Stan model. - -## Autonormal model - -This first example is an autonormal model: $$y \sim Normal(\alpha + x \beta, \Sigma).$$ Here you have $n$ observations of a continuously measured outcome $y$, possibly $k=1$ or more covariates $x$, and you're accounting for spatial autocorrelation in $y$ using the covariance matrix of an $n$-dimensional multivariate normal distribution. - -The following Stan code implements the above model; if you're following along, copy the Stan code and save it in a file inside your working directory; I'll name it "autonormal.stan" and I'll save the name as an R variable: - -```{r} -autonormal_file <- "autonormal.stan" -``` - -Here's the Stan code: - -```{stan output.var= "auto_normal"} -functions { -#include wcar-lpdf.stan -} - -data { - // data - int n; - int k; - vector[n] y; - matrix[n, k] x; - - // CAR parts - int nAx_w; - int nC; - vector[nAx_w] Ax_w; - array[nAx_w] int Ax_v; - array[n + 1] int Ax_u; - array[nC] int Cidx; - vector[n] Delta_inv; - real log_det_Delta_inv; - vector[n] lambda; -} - -parameters { - // spatial autocorrelation (SA) parameter - real rho; - - // scale parameter - real tau; - - // intercept - real alpha; - - // coefficients - vector[k] beta; -} - -model { - vector[n] mu = alpha + x * beta; - - // Likelihood: y ~ Normal(Mu, Sigma) - target += wcar_normal_lpdf(y | - mu, tau, rho, // mean, scale, SA - Ax_w, Ax_v, Ax_u, // stuff from prep_car_data - Delta_inv, - log_det_Delta_inv, - lambda, - n); - - // prior for scale parameter - target += student_t_lpdf(tau | 10, 0, 5); - - // prior for beta - target += normal_lpdf(beta | 0, 5); - - // prior for intercept - target += normal_lpdf(alpha | 0, 5); -} - -``` - -The input file "wcar-lpdf.stan" contains the following code (save this code inside your working directory and name it "wcar-lpdf.stan"): - -```{stan output.var = 'wcar_fun', eval = FALSE} -/** - * Log probability density of the conditional autoregressive (CAR) model: WCAR specifications only - * - * @param y Process to model - * @param mu Mean vector - * @param tau Scale parameter - * @param rho Spatial dependence parameter - * @param A_w Sparse representation of the symmetric connectivity matrix, A - * @param A_v Column indices for values in A_w - * @param A_u Row starting indices for values in A_u - * @param D_inv The row sums of A; i.e., the diagonal elements from the inverse of Delta, where M = Delta * tau^2 is a diagonal matrix containing the conditional variances. - * @param log_det_D_inv Log determinant of Delta inverse. - * @param lambda Eigenvalues of C (or of the symmetric, scaled matrix Delta^{-1/2}*C*Delta^{1/2}); for the WCAR specification, C is the row-standardized version of W. - * @param n Length of y - * - * @return Log probability density of CAR prior up to additive constant - */ -real wcar_normal_lpdf(vector y, vector mu, - real tau, real rho, - vector A_w, array[] int A_v, array[] int A_u, - vector D_inv, real log_det_D_inv, - vector lambda, - int n) { - vector[n] z = y - mu; - real ztDz; - real ztAz; - vector[n] ldet_ImrhoC; - ztDz = (z .* D_inv)' * z; - ztAz = z' * csr_matrix_times_vector(n, n, A_w, A_v, A_u, z); - for (i in 1:n) ldet_ImrhoC[i] = log1m(rho * lambda[i]); - return 0.5 * ( - -n * log( 2 * pi() ) - -2 * n * log(tau) - + log_det_D_inv - + sum(ldet_ImrhoC) - - (1 / tau^2) * (ztDz - rho * ztAz)); -} -``` - -From R, you can use the following code to prepare the input data ($y$, $x$, etc.). I use `prep_car_data` to get a list of parts for the CAR model, then I append the outcome data to the same list and pass it all to a Stan model to draw samples. - -```{r} -library(rstan) -library(geostan) -data(georgia) - -A <- shape2mat(georgia, "B") -car_list <- prep_car_data(A, style = "WCAR") - -# add data -car_list$y <- log(georgia$income / 10e3) -car_list$x <- matrix(log(georgia$population / 10e3), ncol = 1) -car_list$k <- ncol(car_list$x) - -# compile Stan model from file -car_model <- stan_model(autonormal_file) - -# sample from model -samples <- sampling(car_model, data = car_list, iter = 1e3) -``` - -The same results can be obtained using `geostan::stan_car`: - -```{r} -fit <- stan_car(log(income / 10e3) ~ log(population / 10e3), - data = georgia, car = car_list, iter = 1e3) -``` - - -## Poisson models - -Disease mapping is a common use for CAR models, though these models have many applications. In this class of models, the CAR model is assigned as the prior distribution to a parameter vector $\phi$, which is used to model disease incidence rates across small areas like counties. The disease data consist of counts $y$ together with the size of population at risk $p$, or possibly a different denominator such as the expected number of cases $E$ (which occurs when using indirect age-standardization). These models have the form -\begin{equation} -\begin{aligned} - &y \sim Poisson(e^\phi) \\ - &\phi \sim Normal(\mu, \Sigma) \\ - &\mu = log(p) + \alpha + x \beta. -\end{aligned} -\end{equation} - -Here you see that the linear predictor $\mu$ is embedded with the CAR model. - -Here is another way of writing down the very same model: -\begin{equation} -\begin{aligned} - &y \sim Poisson(e^\eta) \\ - &\eta = log(p) + \alpha + x \beta + \phi \\ - &\phi \sim Normal(0, \Sigma) \\ -\end{aligned} -\end{equation} - -It is possible to build a Stan modeling using either one of these two formulations. They are substantively equivalent, *but* you may find that one is far more amenable to Stan's MCMC algorithm. The former specification ($\mu$ inside the CAR model) is less commonly presented in papers, but in this author's experience it is often far more stable computationally than forcing the CAR model to have zero mean. (You may very well encounter a case where the opposite is true.) - -The purpose of the offset term is sometimes unclear in introductory texts. The offset term $p$ is from the denominator of the rates $\frac{y}{p}$. The expectation or mean of the model is -\begin{equation} -\begin{aligned} - &\mathbb{E}[y] = e^{log(p) + \mu} = e^{log(p)} \cdot e^{\mu} = p \cdot e^\mu \\ - &\mathbb{E}\Bigl[ \frac{y}{p} \Bigr] = e^\mu -\end{aligned} -\end{equation} -The smaller is the denominator, the less informative is the rate with respect to the characteristic level of risk bearing upon the population of the given period and place. With small denominators, chance renders the rates uninformative (and unstable over time and space), and the Poisson model accounts for this. - -The following Stan code provides a template for a simple disease mapping model using the CAR model as a prior for $\phi$. As before, you can save the code in your working directory and give it a name like "car_poisson.stan". I'll store the file name in my R environment: - -```{r} -car_poisson_file <- "car_poisson.stan" -``` - -```{stan output.var = "car_poisson"} -functions { -#include wcar-lpdf.stan -} - -data { - // data - int n; - int k; - array[n] int y; - matrix[n, k] x; - vector[n] const_offset; - - // CAR parts - int nAx_w; - int nC; - vector[nAx_w] Ax_w; - array[nAx_w] int Ax_v; - array[n + 1] int Ax_u; - array[nC] int Cidx; - vector[n] Delta_inv; - real log_det_Delta_inv; - vector[n] lambda; -} - -parameters { - // spatial autocorrelation (SA) parameter - real rho; - - // scale parameter - real tau; - - // intercept - real alpha; - - // coefficients - vector[k] beta; - - // SA trend component - vector[n] phi; -} - - -model { - vector[n] mu = const_offset + alpha + x * beta; - - // Likelihood: y ~ Poisson(e^[phi]) - target += poisson_lpmf(y | exp(phi)); - - // phi ~ Normal(Mu, Sigma) - target += wcar_normal_lpdf(phi | - mu, tau, rho, // mean, scale, SA - Ax_w, Ax_v, Ax_u, // stuff from prep_car_data - Delta_inv, - log_det_Delta_inv, - lambda, - n); - - // prior for scale parameter - target += student_t_lpdf(tau | 10, 0, 1); - - // prior for beta - target += normal_lpdf(beta | 0, 5); - - // prior for intercept - target += normal_lpdf(alpha | 0, 5); -} - -``` - -Again, you can use `geostan::prep_car_data` to easily convert the spatial weights matrix into the list of required inputs for the CAR model: - -```{r} -library(rstan) -library(geostan) -data(georgia) - -A <- shape2mat(georgia, "B") -car_list <- prep_car_data(A, style = "WCAR") - -# add data -car_list$y <- georgia$deaths.male -car_list$const_offset <- log(georgia$pop.at.risk.male) -car_list$x <- matrix(log(georgia$income / 10e3), ncol = 1) -car_list$k <- ncol(car_list$x) - -# compile Stan model from file -car_poisson <- stan_model(car_poisson_file) - -# sample from model -samples <- sampling(car_poisson, - data = car_list, - iter = 1e3) -``` - -The same results can be obtained using `geostan::stan_car`: - -```{r} -fit <- stan_car(deaths.male ~ offset(log(pop.at.risk.male)) + log(income / 10e3), - data = georgia, car = car_list, family = poisson(), iter = 1e3) -``` - -# SAR models - -The simultaneously-specified spatial autoregression (SAR) is written as -\begin{equation} - \begin{aligned} - y = \mu + (I - \rho \cdot W)^{-1} \epsilon \\ - \epsilon \sim Normal(0, \sigma^2 \cdot I) - \end{aligned} -\end{equation} -where $W$ is a row-standardized spatial weights matrix, $I$ is the n-by-n identity matrix, and $\rho$ is a spatial autocorrelation parameter. This is also a multivariate normal distribution but with a different covariance matrix than the CAR model: -\begin{equation} - \Sigma = \sigma^2 \cdot (I - \rho \cdot W)^{-1} (I - \rho \cdot W^T)^{-1}, -\end{equation} -where $T$ is the matrix transpose operator. The SA parameter $\rho$ for the SAR model has a more intuitive connection to the degree of SA than the CAR model (which is usually above .95 for moderately high SA). - -The Stan function that is used by `geostan::stan_sar` is as follows (the R code below will assume that you have saved this as "sar-lpdf.stan"): - -```{stan output.var = "sar_fun", eval = FALSE} -/** - * Log probability density of the simultaneous autoregressive (SAR) model (spatial error model) - * - * @param y Process to model - * @param mu Mean vector - * @param sigma Scale parameter - * @param rho Spatial dependence parameter - * @param ImW Sparse representation of (I - W): non-zero values only - * @param ImW_v Column indices for values in ImW - * @param ImW_u Row starting indices for values in ImW - * @param Widx Indices for the off-diagonal elements in ImC - * @param lambda Eigenvalues of W - * @param n Length of y - * - * @return Log probability density of SAR model up to additive constant -*/ - real sar_normal_lpdf(vector y, - vector mu, - real sigma, - real rho, - vector ImW, - array[] int ImW_v, - array[] int ImW_u, - array[] int Widx, - vector lambda, - int n) { - vector[n] z = y - mu; - real tau = 1 / sigma^2; - vector[num_elements(ImW)] ImrhoW = ImW; // (I - rho W) - vector[n] ImrhoWz; // (I - rho * W) * z - real zVz; - real ldet_V = 2 * sum(log1m(rho * lambda)) - 2 * n * log(sigma); - ImrhoW[Widx] = rho * ImW[Widx]; - ImrhoWz = csr_matrix_times_vector(n, n, ImrhoW, ImW_v , ImW_u , z); - zVz = tau * dot_self(ImrhoWz); - return 0.5 * (-n * log(2 * pi()) + ldet_V - zVz); - } - -``` - -The following Stan model provides an example of how to use this function to build a SAR model. Again, its an autonormal model for continuous outcome variable with $k$ covariates. - -```{r} -sar_model_file <- "sar_model.stan" -``` - -```{stan output.var = "auto_sar"} -functions { -#include sar-lpdf.stan -} - -data { - // data - int n; - int k; - vector[n] y; - matrix[n, k] x; - - -// SAR - int nImW_w; - int nW; - vector[nImW_w] ImW_w; - array[nImW_w] int ImW_v; - array[n + 1] int ImW_u; - array[nW] int Widx; - vector[n] eigenvalues_w; -} - -parameters { - // SA parameter - real rho; - - // scale parameter - real sigma; - - // intercept - real alpha; - - // coefficients - vector[k] beta; -} - -model{ - vector[n] mu = alpha + x * beta; - - // Likelihood: Y ~ Normal(Mu, Sigma) - target += sar_normal_lpdf(y | - mu, sigma, rho, - ImW_w, - ImW_v, - ImW_u, - Widx, - eigenvalues_w, - n); - - // prior for scale parameter - target += student_t_lpdf(sigma | 10, 0, 5); - - // prior for beta - target += normal_lpdf(beta | 0, 5); - - // prior for intercept - target += normal_lpdf(alpha | 0, 5); -} - -``` - - -```{r} -library(geostan) -library(rstan) -data(georgia) - -W <- shape2mat(georgia, "W") -sar_list <- prep_sar_data(W) - -# add data -sar_list$y <- log(georgia$income / 10e3) -sar_list$x <- matrix(log(georgia$population / 10e3), ncol = 1) -sar_list$k <- ncol(sar_list$x) - -# compile Stan model from file -sar_model <- stan_model(sar_model_file) - -# sample from model -samples <- sampling(sar_model, data = sar_list, iter = 1e3) -``` - -We can draw samples from the same model using `geostan::stan_sar`: - -```{r} -sar_dl <- prep_sar_data(W) -fit <- stan_sar(log(income / 10e3) ~ log(population / 10e3), data = georgia, - sar_parts = sar_dl, iter = 1e3) -``` - -One can also use the SAR model as a prior distribution for a parameter vector, just as was done above with the CAR model. - -# References