brms/0000755000176200001440000000000013624533242011221 5ustar liggesusersbrms/NAMESPACE0000644000176200001440000003661413623751614012456 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("+",bform) S3method("+",brmsprior) S3method("+",stanvars) S3method(.compute_point_estimate,brmsdraws) S3method(.compute_point_estimate,mvbrmsdraws) S3method(.ndraws,brmsdraws) S3method(.ndraws,mvbrmsdraws) S3method(.thin_draws,brmsdraws) S3method(.thin_draws,mvbrmsdraws) S3method(LOO,brmsfit) S3method(VarCorr,brmsfit) S3method(WAIC,brmsfit) S3method(add_criterion,brmsfit) S3method(add_ic,brmsfit) S3method(as.array,brmsfit) S3method(as.data.frame,brmsfit) S3method(as.matrix,brmsfit) S3method(as.mcmc,brmsfit) S3method(autocor,brmsfit) S3method(bayes_R2,brmsfit) S3method(bayes_factor,brmsfit) S3method(bridge_sampler,brmsfit) S3method(c,brmsprior) S3method(c,stanvars) S3method(change_effects,brmsterms) S3method(change_effects,btl) S3method(change_effects,default) S3method(change_effects,mvbrmsterms) S3method(check_prior_special,brmsprior) S3method(check_prior_special,brmsterms) S3method(check_prior_special,btl) S3method(check_prior_special,btnl) S3method(check_prior_special,default) S3method(check_prior_special,mvbrmsterms) S3method(coef,brmsfit) S3method(compute_xi,brmsdraws) S3method(compute_xi,brmsfit) S3method(compute_xi,mvbrmsdraws) S3method(conditional_effects,brmsfit) S3method(conditional_effects,brmsterms) S3method(conditional_effects,mvbrmsterms) S3method(conditional_smooths,brmsfit) S3method(conditional_smooths,brmsterms) S3method(conditional_smooths,btl) S3method(conditional_smooths,default) S3method(conditional_smooths,mvbrmsterms) S3method(control_params,brmsfit) S3method(data_predictor,brmsterms) S3method(data_predictor,btl) S3method(data_predictor,btnl) S3method(data_predictor,mvbrmsterms) S3method(data_response,brmsterms) S3method(data_response,mvbrmsterms) S3method(def_scale_prior,brmsterms) S3method(def_scale_prior,mvbrmsterms) S3method(dpar_family,default) S3method(dpar_family,mixfamily) S3method(duplicated,brmsprior) S3method(exclude_pars,brmsfit) S3method(exclude_pars,brmsterms) S3method(exclude_pars,btl) S3method(exclude_pars,default) S3method(exclude_pars,mvbrmsterms) S3method(exclude_terms,brmsfit) S3method(exclude_terms,brmsformula) S3method(exclude_terms,mvbrmsformula) S3method(expose_functions,brmsfit) S3method(extract_draws,brmsfit) S3method(extract_draws,brmsterms) S3method(extract_draws,btl) S3method(extract_draws,btnl) S3method(extract_draws,default) S3method(extract_old_standata,brmsterms) S3method(extract_old_standata,btl) S3method(extract_old_standata,btnl) S3method(extract_old_standata,default) S3method(extract_old_standata,mvbrmsterms) S3method(family,brmsfit) S3method(family_bounds,brmsterms) S3method(family_bounds,mvbrmsterms) S3method(family_info,brmsfamily) S3method(family_info,brmsfit) S3method(family_info,brmsformula) S3method(family_info,brmsterms) S3method(family_info,btl) S3method(family_info,btnl) S3method(family_info,default) S3method(family_info,family) S3method(family_info,list) S3method(family_info,mixfamily) S3method(family_info,mvbrmsformula) S3method(family_info,mvbrmsterms) S3method(fitted,brmsfit) S3method(fixef,brmsfit) S3method(formula,brmsfit) S3method(getCall,brmsfit) S3method(get_ad_vars,brmsterms) S3method(get_ad_vars,mvbrmsterms) S3method(get_all_effects,brmsterms) S3method(get_all_effects,btl) S3method(get_all_effects,btnl) S3method(get_all_effects,default) S3method(get_all_effects,mvbrmsterms) S3method(get_data2_autocor,brmsformula) S3method(get_data2_autocor,mvbrmsformula) S3method(get_effect,brmsfit) S3method(get_effect,brmsformula) S3method(get_effect,brmsterms) S3method(get_effect,btl) S3method(get_effect,btnl) S3method(get_effect,default) S3method(get_effect,mvbrmsformula) S3method(get_effect,mvbrmsterms) S3method(get_element,default) S3method(get_element,mvbrmsformula) S3method(get_element,mvbrmsterms) S3method(get_group_vars,brmsfit) S3method(get_group_vars,brmsterms) S3method(get_group_vars,default) S3method(get_group_vars,mvbrmsterms) S3method(get_int_vars,brmsterms) S3method(get_int_vars,mvbrmsterms) S3method(get_re,brmsterms) S3method(get_re,btl) S3method(get_re,default) S3method(get_re,mvbrmsterms) S3method(hypothesis,brmsfit) S3method(hypothesis,default) S3method(kfold,brmsfit) S3method(launch_shinystan,brmsfit) S3method(logLik,brmsfit) S3method(log_lik,brmsdraws) S3method(log_lik,brmsfit) S3method(log_lik,mvbrmsdraws) S3method(log_posterior,brmsfit) S3method(loo,brmsfit) S3method(loo_R2,brmsfit) S3method(loo_compare,brmsfit) S3method(loo_linpred,brmsfit) S3method(loo_model_weights,brmsfit) S3method(loo_predict,brmsfit) S3method(loo_predictive_interval,brmsfit) S3method(loo_subsample,brmsfit) S3method(marginal_effects,brmsfit) S3method(marginal_smooths,brmsfit) S3method(mcmc_plot,brmsfit) S3method(model.frame,brmsfit) S3method(model_weights,brmsfit) S3method(neff_ratio,brmsfit) S3method(ngrps,brmsfit) S3method(nobs,brmsfit) S3method(nsamples,brmsfit) S3method(nuts_params,brmsfit) S3method(pairs,brmsfit) S3method(parnames,brmsfit) S3method(parnames,default) S3method(parse_bf,brmsformula) S3method(parse_bf,default) S3method(parse_bf,mvbrmsformula) S3method(plot,brmsMarginalEffects) S3method(plot,brms_conditional_effects) S3method(plot,brmsfit) S3method(plot,brmshypothesis) S3method(post_prob,brmsfit) S3method(posterior_average,brmsfit) S3method(posterior_interval,brmsfit) S3method(posterior_linpred,brmsfit) S3method(posterior_predict,brmsdraws) S3method(posterior_predict,brmsfit) S3method(posterior_predict,mvbrmsdraws) S3method(posterior_samples,brmsfit) S3method(posterior_samples,default) S3method(posterior_summary,brmsfit) S3method(posterior_summary,default) S3method(pp_average,brmsfit) S3method(pp_check,brmsfit) S3method(pp_expect,brmsdraws) S3method(pp_expect,brmsfit) S3method(pp_expect,mvbrmsdraws) S3method(pp_mixture,brmsfit) S3method(predict,brmsfit) S3method(predictive_error,brmsfit) S3method(predictive_interval,brmsfit) S3method(predictor,bdrawsl) S3method(predictor,bdrawsnl) S3method(print,brmsMarginalEffects) S3method(print,brms_conditional_effects) S3method(print,brmsfamily) S3method(print,brmsfit) S3method(print,brmsformula) S3method(print,brmshypothesis) S3method(print,brmsmodel) S3method(print,brmsprior) S3method(print,brmssummary) S3method(print,cor_arma) S3method(print,cor_brms_formula) S3method(print,cor_car) S3method(print,cor_cosy) S3method(print,cor_empty) S3method(print,cor_fixed) S3method(print,cor_sar) S3method(print,cov_fixed) S3method(print,customfamily) S3method(print,iclist) S3method(print,loolist) S3method(print,mixfamily) S3method(print,mvbrmsformula) S3method(prior_predictor,btl) S3method(prior_predictor,btnl) S3method(prior_predictor,default) S3method(prior_samples,brmsfit) S3method(prior_samples,default) S3method(prior_summary,brmsfit) S3method(ranef,brmsfit) S3method(reloo,brmsfit) S3method(reloo,loo) S3method(rescale_old_mo,brmsfit) S3method(rescale_old_mo,brmsterms) S3method(rescale_old_mo,btl) S3method(rescale_old_mo,btnl) S3method(rescale_old_mo,mvbrmsterms) S3method(residuals,brmsfit) S3method(rhat,brmsfit) S3method(stan_llh,brmsterms) S3method(stan_llh,default) S3method(stan_llh,mixfamily) S3method(stan_llh,mvbrmsterms) S3method(stan_predictor,brmsterms) S3method(stan_predictor,btl) S3method(stan_predictor,btnl) S3method(stan_predictor,mvbrmsterms) S3method(stancode,brmsfit) S3method(standata,brmsfit) S3method(stanplot,brmsfit) S3method(summarise_families,brmsformula) S3method(summarise_families,mvbrmsformula) S3method(summarise_links,brmsformula) S3method(summarise_links,mvbrmsformula) S3method(summary,brmsfit) S3method(summary,customfamily) S3method(summary,family) S3method(summary,mixfamily) S3method(tidy_acef,"NULL") S3method(tidy_acef,acef) S3method(tidy_acef,brmsterms) S3method(tidy_acef,btl) S3method(tidy_acef,btnl) S3method(tidy_acef,default) S3method(tidy_acef,mvbrmsterms) S3method(trunc_bounds,brmsterms) S3method(trunc_bounds,mvbrmsterms) S3method(update,brmsfit) S3method(update,brmsfit_multiple) S3method(update,brmsformula) S3method(update,mvbrmsformula) S3method(update_old_family,brmsfamily) S3method(update_old_family,brmsformula) S3method(update_old_family,customfamily) S3method(update_old_family,default) S3method(update_old_family,mixfamily) S3method(update_old_family,mvbrmsformula) S3method(update_re_terms,brmsformula) S3method(update_re_terms,formula) S3method(update_re_terms,mvbrmsformula) S3method(valid_dpars,brmsfit) S3method(valid_dpars,brmsformula) S3method(valid_dpars,brmsterms) S3method(valid_dpars,default) S3method(valid_dpars,mixfamily) S3method(valid_dpars,mvbrmsformula) S3method(valid_dpars,mvbrmsterms) S3method(validate_formula,brmsformula) S3method(validate_formula,default) S3method(validate_formula,mvbrmsformula) S3method(vars_keep_na,brmsterms) S3method(vars_keep_na,mvbrmsterms) S3method(vcov,brmsfit) S3method(waic,brmsfit) export("add_ic<-") export(Beta) export(LOO) export(VarCorr) export(WAIC) export(acat) export(acformula) export(add_criterion) export(add_ic) export(add_loo) export(add_waic) export(ar) export(arma) export(as.mcmc) export(asym_laplace) export(autocor) export(bayes_R2) export(bayes_factor) export(bernoulli) export(bf) export(bridge_sampler) export(brm) export(brm_multiple) export(brmsfamily) export(brmsformula) export(car) export(categorical) export(combine_models) export(compare_ic) export(conditional_effects) export(conditional_smooths) export(control_params) export(cor_ar) export(cor_arma) export(cor_arr) export(cor_bsts) export(cor_car) export(cor_cosy) export(cor_errorsar) export(cor_fixed) export(cor_icar) export(cor_lagsar) export(cor_ma) export(cor_sar) export(cosy) export(cratio) export(cs) export(cse) export(cumulative) export(custom_family) export(dasym_laplace) export(data_predictor) export(data_response) export(ddirichlet) export(density_ratio) export(dexgaussian) export(dfrechet) export(dgen_extreme_value) export(dhurdle_gamma) export(dhurdle_lognormal) export(dhurdle_negbinomial) export(dhurdle_poisson) export(dinv_gaussian) export(dirichlet) export(dmulti_normal) export(dmulti_student_t) export(do_call) export(dshifted_lnorm) export(dskew_normal) export(dstudent_t) export(dvon_mises) export(dwiener) export(dzero_inflated_beta) export(dzero_inflated_binomial) export(dzero_inflated_negbinomial) export(dzero_inflated_poisson) export(empty_prior) export(exgaussian) export(exponential) export(expose_functions) export(expp1) export(extract_draws) export(fcor) export(fixef) export(frechet) export(gen_extreme_value) export(geometric) export(get_prior) export(get_y) export(gp) export(gr) export(horseshoe) export(hurdle_gamma) export(hurdle_lognormal) export(hurdle_negbinomial) export(hurdle_poisson) export(hypothesis) export(inv_logit_scaled) export(is.brmsfit) export(is.brmsfit_multiple) export(is.brmsformula) export(is.brmsprior) export(is.brmsterms) export(is.cor_arma) export(is.cor_brms) export(is.cor_car) export(is.cor_cosy) export(is.cor_fixed) export(is.cor_sar) export(is.mvbrmsformula) export(is.mvbrmsterms) export(kfold) export(kfold_predict) export(lasso) export(launch_shinystan) export(lf) export(log_lik) export(log_posterior) export(logit_scaled) export(logm1) export(lognormal) export(loo) export(loo_R2) export(loo_compare) export(loo_linpred) export(loo_model_weights) export(loo_predict) export(loo_predictive_interval) export(loo_subsample) export(ma) export(make_conditions) export(make_stancode) export(make_standata) export(marginal_effects) export(marginal_smooths) export(mcmc_plot) export(me) export(mi) export(mixture) export(mm) export(mmc) export(mo) export(model_weights) export(multinomial) export(mvbf) export(mvbind) export(mvbrmsformula) export(neff_ratio) export(negbinomial) export(ngrps) export(nlf) export(nsamples) export(nuts_params) export(parnames) export(parse_bf) export(pasym_laplace) export(pexgaussian) export(pfrechet) export(pgen_extreme_value) export(phurdle_gamma) export(phurdle_lognormal) export(phurdle_negbinomial) export(phurdle_poisson) export(pinv_gaussian) export(post_prob) export(posterior_average) export(posterior_interval) export(posterior_linpred) export(posterior_predict) export(posterior_samples) export(posterior_summary) export(posterior_table) export(pp_average) export(pp_check) export(pp_expect) export(pp_mixture) export(predictive_error) export(predictive_interval) export(prior) export(prior_) export(prior_samples) export(prior_string) export(prior_summary) export(pshifted_lnorm) export(pskew_normal) export(pstudent_t) export(pvon_mises) export(pzero_inflated_beta) export(pzero_inflated_binomial) export(pzero_inflated_negbinomial) export(pzero_inflated_poisson) export(qasym_laplace) export(qfrechet) export(qshifted_lnorm) export(qskew_normal) export(qstudent_t) export(ranef) export(rasym_laplace) export(rdirichlet) export(reloo) export(resp_cat) export(resp_cens) export(resp_dec) export(resp_mi) export(resp_rate) export(resp_se) export(resp_subset) export(resp_thres) export(resp_trials) export(resp_trunc) export(resp_vint) export(resp_vreal) export(resp_weights) export(restructure) export(rexgaussian) export(rfrechet) export(rgen_extreme_value) export(rhat) export(rinv_gaussian) export(rmulti_normal) export(rmulti_student_t) export(rows2labels) export(rshifted_lnorm) export(rskew_normal) export(rstudent_t) export(rvon_mises) export(rwiener) export(s) export(sar) export(set_mecor) export(set_nl) export(set_prior) export(set_rescor) export(shifted_lognormal) export(skew_normal) export(sratio) export(stancode) export(standata) export(stanplot) export(stanvar) export(student) export(t2) export(theme_black) export(theme_default) export(update_adterms) export(validate_newdata) export(von_mises) export(waic) export(weibull) export(wiener) export(zero_inflated_beta) export(zero_inflated_binomial) export(zero_inflated_negbinomial) export(zero_inflated_poisson) export(zero_one_inflated_beta) import(Rcpp) import(abind) import(ggplot2) import(methods) import(parallel) import(stats) importFrom(bayesplot,log_posterior) importFrom(bayesplot,neff_ratio) importFrom(bayesplot,nuts_params) importFrom(bayesplot,pp_check) importFrom(bayesplot,rhat) importFrom(bayesplot,theme_default) importFrom(bridgesampling,bayes_factor) importFrom(bridgesampling,bridge_sampler) importFrom(bridgesampling,post_prob) importFrom(coda,as.mcmc) importFrom(grDevices,devAskNewPage) importFrom(graphics,plot) importFrom(loo,.compute_point_estimate) importFrom(loo,.ndraws) importFrom(loo,.thin_draws) importFrom(loo,is.loo) importFrom(loo,kfold) importFrom(loo,loo) importFrom(loo,loo_compare) importFrom(loo,loo_model_weights) importFrom(loo,loo_subsample) importFrom(loo,waic) importFrom(nlme,VarCorr) importFrom(nlme,fixef) importFrom(nlme,ranef) importFrom(rstantools,bayes_R2) importFrom(rstantools,log_lik) importFrom(rstantools,loo_linpred) importFrom(rstantools,loo_predict) importFrom(rstantools,loo_predictive_interval) importFrom(rstantools,nsamples) importFrom(rstantools,posterior_interval) importFrom(rstantools,posterior_linpred) importFrom(rstantools,posterior_predict) importFrom(rstantools,predictive_error) importFrom(rstantools,predictive_interval) importFrom(rstantools,prior_summary) importFrom(shinystan,launch_shinystan) importMethodsFrom(rstan,summary) brms/README.md0000644000176200001440000003623513606573732012521 0ustar liggesusers brms Logo[Stan Logo](http://mc-stan.org) brms ==== [![Build Status](https://travis-ci.org/paul-buerkner/brms.svg?branch=master)](https://travis-ci.org/paul-buerkner/brms) [![Coverage Status](https://codecov.io/github/paul-buerkner/brms/coverage.svg?branch=master)](https://codecov.io/github/paul-buerkner/brms?branch=master) [![CRAN Version](http://www.r-pkg.org/badges/version/brms)](https://cran.r-project.org/package=brms) [![Downloads](http://cranlogs.r-pkg.org/badges/brms?color=brightgreen)](https://CRAN.R-project.org/package=brms) Overview -------- The **brms** package provides an interface to fit Bayesian generalized (non-)linear multivariate multilevel models using Stan, which is a C++ package for performing full Bayesian inference (see http://mc-stan.org/). The formula syntax is very similar to that of the package lme4 to provide a familiar and simple interface for performing regression analyses. A wide range of response distributions are supported, allowing users to fit – among others – linear, robust linear, count data, survival, response times, ordinal, zero-inflated, and even self-defined mixture models all in a multilevel context. Further modeling options include non-linear and smooth terms, auto-correlation structures, censored data, missing value imputation, and quite a few more. In addition, all parameters of the response distribution can be predicted in order to perform distributional regression. Multivariate models (i.e., models with multiple response variables) can be fit, as well. Prior specifications are flexible and explicitly encourage users to apply prior distributions that actually reflect their beliefs. Model fit can easily be assessed and compared with posterior predictive checks, cross-validation, and Bayes factors. Resources --------- - [Introduction to brms](https://www.jstatsoft.org/article/view/v080i01) (Journal of Statistical Software) - [Advanced multilevel modeling with brms](https://journal.r-project.org/archive/2018/RJ-2018-017/index.html) (The R Journal) - [Website](https://paul-buerkner.github.io/brms) (Website of brms with documentation and vignettes) - [Blog posts](https://paul-buerkner.github.io/blog/brms-blogposts/) (List of blog posts about brms) - [Ask a question](http://discourse.mc-stan.org/) (Stan Forums on Discourse) - [Open an issue](https://github.com/paul-buerkner/brms/issues) (GitHub issues for bug reports and feature requests) How to use brms --------------- ``` r library(brms) ``` As a simple example, we use poisson regression to model the seizure counts in epileptic patients to investigate whether the treatment (represented by variable `Trt`) can reduce the seizure counts and whether the effect of the treatment varies with the (standardized) baseline number of seizures a person had before treatment (variable `zBase`). As we have multiple observations per person, a group-level intercept is incorporated to account for the resulting dependency in the data. ``` r fit1 <- brm(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = poisson()) ``` The results (i.e., posterior samples) can be investigated using ``` r summary(fit1) #> Family: poisson #> Links: mu = log #> Formula: count ~ zAge + zBase * Trt + (1 | patient) #> Data: epilepsy (Number of observations: 236) #> Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; #> total post-warmup samples = 4000 #> #> Group-Level Effects: #> ~patient (Number of levels: 59) #> Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS #> sd(Intercept) 0.58 0.07 0.46 0.73 1.01 757 1812 #> #> Population-Level Effects: #> Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS #> Intercept 1.77 0.12 1.54 2.01 1.01 719 946 #> zAge 0.10 0.08 -0.07 0.27 1.00 778 1318 #> zBase 0.71 0.12 0.47 0.95 1.01 593 1323 #> Trt1 -0.27 0.17 -0.61 0.05 1.01 756 1270 #> zBase:Trt1 0.05 0.16 -0.26 0.37 1.01 764 1131 #> #> Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample #> is a crude measure of effective sample size, and Rhat is the potential #> scale reduction factor on split chains (at convergence, Rhat = 1). ``` On the top of the output, some general information on the model is given, such as family, formula, number of iterations and chains. Next, group-level effects are displayed seperately for each grouping factor in terms of standard deviations and (in case of more than one group-level effect per grouping factor; not displayed here) correlations between group-level effects. On the bottom of the output, population-level effects (i.e. regression coefficients) are displayed. If incorporated, autocorrelation effects and family specific parameters (e.g. the residual standard deviation ‘sigma’ in normal models) are also given. In general, every parameter is summarized using the mean (‘Estimate’) and the standard deviation (‘Est.Error’) of the posterior distribution as well as two-sided 95% credible intervals (‘l-95% CI’ and ‘u-95% CI’) based on quantiles. We see that the coefficient of `Trt` is negative with a zero overlapping 95%-CI. This indicates that, on average, the treatment may reduce seizure counts by some amount but the evidence based on the data and applied model is not very strong and still insufficient by standard decision rules. Further, we find little evidence that the treatment effect varies with the baseline number of seizures. The last two values (‘Eff.Sample’ and ‘Rhat’) provide information on how well the algorithm could estimate the posterior distribution of this parameter. If ‘Rhat’ is considerably greater than 1, the algorithm has not yet converged and it is necessary to run more iterations and / or set stronger priors. To visually investigate the chains as well as the posterior distributions, we can use the `plot` method. If we just want to see results of the regression coefficients of `Trt` and `zBase`, we go for ``` r plot(fit1, pars = c("Trt", "zBase")) ``` A more detailed investigation can be performed by running `launch_shinystan(fit1)`. To better understand the relationship of the predictors with the response, I recommend the `conditional_effects` method: ``` r plot(conditional_effects(fit1, effects = "zBase:Trt")) ``` This method uses some prediction functionality behind the scenes, which can also be called directly. Suppose that we want to predict responses (i.e. seizure counts) of a person in the treatment group (`Trt = 1`) and in the control group (`Trt = 0`) with average age and average number of previous seizures. Than we can use ``` r newdata <- data.frame(Trt = c(0, 1), zAge = 0, zBase = 0) predict(fit1, newdata = newdata, re_formula = NA) #> Estimate Est.Error Q2.5 Q97.5 #> [1,] 5.92175 2.487403 2 11 #> [2,] 4.57475 2.168084 1 9 ``` We need to set `re_formula = NA` in order not to condition of the group-level effects. While the `predict` method returns predictions of the responses, the `fitted` method returns predictions of the regression line. ``` r fitted(fit1, newdata = newdata, re_formula = NA) #> Estimate Est.Error Q2.5 Q97.5 #> [1,] 5.932893 0.6985409 4.663774 7.447649 #> [2,] 4.545819 0.5293890 3.574081 5.647261 ``` Both methods return the same estimate (up to random error), while the latter has smaller variance, because the uncertainty in the regression line is smaller than the uncertainty in each response. If we want to predict values of the original data, we can just leave the `newdata` argument empty. Suppose, we want to investigate whether there is overdispersion in the model, that is residual variation not accounted for by the response distribution. For this purpose, we include a second group-level intercept that captures possible overdispersion. ``` r fit2 <- brm(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson()) ``` We can then go ahead and compare both models via approximate leave-one-out (LOO) cross-validation. ``` r loo(fit1, fit2) #> Output of model 'fit1': #> #> Computed from 4000 by 236 log-likelihood matrix #> #> Estimate SE #> elpd_loo -672.1 36.5 #> p_loo 94.5 14.2 #> looic 1344.2 73.1 #> ------ #> Monte Carlo SE of elpd_loo is NA. #> #> Pareto k diagnostic values: #> Count Pct. Min. n_eff #> (-Inf, 0.5] (good) 209 88.6% 368 #> (0.5, 0.7] (ok) 19 8.1% 128 #> (0.7, 1] (bad) 6 2.5% 35 #> (1, Inf) (very bad) 2 0.8% 5 #> See help('pareto-k-diagnostic') for details. #> #> Output of model 'fit2': #> #> Computed from 4000 by 236 log-likelihood matrix #> #> Estimate SE #> elpd_loo -594.9 13.8 #> p_loo 107.5 6.9 #> looic 1189.8 27.5 #> ------ #> Monte Carlo SE of elpd_loo is NA. #> #> Pareto k diagnostic values: #> Count Pct. Min. n_eff #> (-Inf, 0.5] (good) 84 35.6% 675 #> (0.5, 0.7] (ok) 100 42.4% 209 #> (0.7, 1] (bad) 45 19.1% 42 #> (1, Inf) (very bad) 7 3.0% 11 #> See help('pareto-k-diagnostic') for details. #> #> Model comparisons: #> elpd_diff se_diff #> fit2 0.0 0.0 #> fit1 -77.2 27.1 ``` The `loo` output when comparing models is a little verbose. We first see the individual LOO summaries of the two models and then the comparison between them. Since higher `elpd` (i.e., expected log posterior density) values indicate better fit, we see that the model accounting for overdispersion (i.e., `fit2`) fits substantially better. However, we also see in the individual LOO outputs that there are several problematic observations for which the approximations may have not have been very accurate. To deal with this appropriately, we need to fall back to other methods such as `reloo` or `kfold` but this requires the model to be refit several times which takes too long for the purpose of a quick example. The post-processing methods we have shown above are just the tip of the iceberg. For a full list of methods to apply on fitted model objects, type `methods(class = "brmsfit")`. Citing brms and related software -------------------------------- Developing and maintaining open source software is an important yet often underappreciated contribution to scientific progress. Thus, whenever you are using open source software (or software in general), please make sure to cite it appropriately so that developers get credit for their work. When using brms, please cite one or more of the following publications: - Bürkner P. C. (2017). brms: An R Package for Bayesian Multilevel Models using Stan. *Journal of Statistical Software*. 80(1), 1-28. doi.org/10.18637/jss.v080.i01 - Bürkner P. C. (2018). Advanced Bayesian Multilevel Modeling with the R Package brms. *The R Journal*. 10(1), 395-411. doi.org/10.32614/RJ-2018-017 As brms is a high-level interface to Stan, please additionally cite Stan: - Carpenter B., Gelman A., Hoffman M. D., Lee D., Goodrich B., Betancourt M., Brubaker M., Guo J., Li P., and Riddell A. (2017). Stan: A probabilistic programming language. *Journal of Statistical Software*. 76(1). 10.18637/jss.v076.i01 Further, brms relies on several other R packages and, of course, on R itself. To find out how to cite R and its packages, use the `citation` function. There are some features of brms which specifically rely on certain packages. The **rstan** package together with **Rcpp** makes Stan conveniently accessible in R. Visualizations and posterior-predictive checks are based on **bayesplot** and **ggplot2**. Approximate leave-one-out cross-validation using `loo` and related methods is done via the **loo** package. Marginal likelihood based methods such as `bayes_factor` are realized by means of the **bridgesampling** package. Splines specified via the `s` and `t2` functions rely on **mgcv**. If you use some of these features, please also consider citing the related packages. FAQ --- ### How do I install brms? To install the latest release version from CRAN use ``` r install.packages("brms") ``` The current developmental version can be downloaded from github via ``` r if (!requireNamespace("remotes")) { install.packages("remotes") } remotes::install_github("paul-buerkner/brms") ``` Because brms is based on Stan, a C++ compiler is required. The program Rtools (available on https://cran.r-project.org/bin/windows/Rtools/) comes with a C++ compiler for Windows. On Mac, you should install Xcode. For further instructions on how to get the compilers running, see the prerequisites section on https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started. ### I am new to brms. Where can I start? Detailed instructions and case studies are given in the package’s extensive vignettes. See `vignette(package = "brms")` for an overview. For documentation on formula syntax, families, and prior distributions see `help("brm")`. ### Where do I ask questions, propose a new feature, or report a bug? Questions can be asked on the [Stan forums](http://discourse.mc-stan.org/) on Discourse. To propose a new feature or report a bug, please open an issue on [GitHub](https://github.com/paul-buerkner/brms). ### How can I extract the generated Stan code? If you have already fitted a model, just apply the `stancode` method on the fitted model object. If you just want to generate the Stan code without any model fitting, use the `make_stancode` function. ### Can I avoid compiling models? When you fit your model for the first time with brms, there is currently no way to avoid compilation. However, if you have already fitted your model and want to run it again, for instance with more samples, you can do this without recompilation by using the `update` method. For more details see `help("update.brmsfit")`. ### What is the difference between brms and rstanarm? The rstanarm package is similar to brms in that it also allows to fit regression models using Stan for the backend estimation. Contrary to brms, rstanarm comes with precompiled code to save the compilation time (and the need for a C++ compiler) when fitting a model. However, as brms generates its Stan code on the fly, it offers much more flexibility in model specification than rstanarm. Also, multilevel models are currently fitted a bit more efficiently in brms. For detailed comparisons of brms with other common R packages implementing multilevel models, see `vignette("brms_multilevel")` and `vignette("brms_overview")`. brms/data/0000755000176200001440000000000013450600656012133 5ustar liggesusersbrms/data/epilepsy.rda0000644000176200001440000000542713442002443014454 0ustar liggesusersBZh91AY&SY 4>w@h4L*zzAꪦ?O424hh24&&44hL! MF@ M  FL@рahd2ih4L@""&&ELLhڛDGbjD6)4̦G=LDOO&d4z=Fe4<Ѧi3)R%w4jm{\ ̛<0gc1ɑYrr~.&5:kYtsKvN"xLSUPv' ƗSi|SXdgj=w([zDܗ˫n̶}fnMɞr2& Ѿcdh&֛.k &SPg::Pjތ_.olYQ4MQfٰ3L I\79cV83SJi9l4Ɖ8Pf1333i1ߵ->¤-U$ p* FB*IQ\^8 RI%Ta0IQY-kF*82+B8ۦY%i"ʹtlie}dzs-UV,G$#OG#z4d2FTr!TBFh) 4CQ $i@CY Dii! HBC d2B$'9iM]UP%l123456789:9:;<=>?@ABCDDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcddefghiS5Uu6V KO͐B,U})@]B@x>]y#<-L $̤%TBJfLoƜ""""""""""""""""""""""""*5~-@)zI $JO$,T"BLbRWI!#*@ ‰! ֕'[GdJ{!dD*8rW$TG:WŨ$PPPT'^sĘI3 Eʏ*LEj9#t,tPFTh2^7gl-TmGKF2J- F1.TkHۅȴg #wGxØ5+^=zM&۞ sܪI$I$]vи\/˥۷n!UYB(TUUE {.{)e )`EYeMir {^ZZ۲Z[qJR 0 1x^zUUWd oL0ֲֲֲֲYjU*4 YY]uZ*+Yp0J뮺UUZʡ!!!!!!!!4@”0,0 ",UU[/I$I$@2[Bд/KKKmUUU}1ZI$I$ƀҁm KmUUV$I$I?`Ja/뮵UU\ *I$I$P ,Ey` r'F:c:AkD4ώ~=#xGfSpp=ޝ6 1QԚάOr'2A >6f3%'Y^U%𴪲UMAklMz "*"cQ/UDI(Q@¡b-hK PQ% Eh BT% T+-CJ;M>k 7IV'8Poǽ/#!~--:q~F]֍,|U#\Q7eo+tWb\{nc?T ђ|c|~811Oh NM0't^GcYv'x=0 zN :GmOKy{;S'DN?@|9# ϳY?g0Hek m;\kWVd > 啪HO4s7#)b|ڔ_a˚}dv% {3:pɵ9" v oZS?H"ŹV-瞼y+=i3OH/G"aCW0ݖy%Ke^o 僨%L}𮔯vJt!Q}AIƓ+*8i,Ri- Af@N\:ӷ;;H|8SVvtyGݞGNj!=@͉?k>ٝAMrjMA3AMl &йϟPN"`Gt=L.E8i o,3v\_bd9ŻZۜ`` w-8pS wfra͓:!9jGt2ī|830b8n蘓/ ܔ_9r;AU;S|O0b2`G2`P珸q%mfEx& ”e9xo?F{*V4F6/r:4M]jI.X^ZhDEJ)_ H`hჃIR(Zqr D M-j׊><̃L4nbhV36IB)p7$M_l$# 0`H0qٹ`X8Bg|cD Tv$ūR$v5$Xbix_2S!0Yj**"ł$@PY"X1U`,X1F( RR#"jL'SHa Hmdd< h'/pg4:r$xLX5bԚ2?fR_!uʮjRbE°q AZ 㲆LحEΟJ4f[DTA(S229}՜b h۔1P.WLВ.p Jbrms/man/0000755000176200001440000000000013612312340011763 5ustar liggesusersbrms/man/restructure.Rd0000644000176200001440000000147213565500270014655 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/restructure.R \name{restructure} \alias{restructure} \title{Restructure Old \code{brmsfit} Objects} \usage{ restructure(x, rstr_summary = FALSE) } \arguments{ \item{x}{An object of class \code{brmsfit}.} \item{rstr_summary}{Logical; If \code{TRUE}, the cached summary stored by \pkg{rstan} is restructured as well.} } \value{ A \code{brmsfit} object compatible with the latest version of \pkg{brms}. } \description{ Restructure old \code{brmsfit} objects to work with the latest \pkg{brms} version. This function is called internally when applying post-processing methods. However, in order to avoid unnecessary run time caused by the restructuring, I recommend explicitly calling \code{restructure} once per model after updating \pkg{brms}. } brms/man/make_conditions.Rd0000644000176200001440000000212713601107424015425 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/conditional_effects.R \name{make_conditions} \alias{make_conditions} \title{Prepare Fully Crossed Conditions} \usage{ make_conditions(x, vars, ...) } \arguments{ \item{x}{An \R object from which to extract the variables that should be part of the conditions.} \item{vars}{Names of the variables that should be part of the conditions.} \item{...}{Arguments passed to \code{\link{rows2labels}}.} } \value{ A \code{data.frame} where each row indicates a condition. } \description{ This is a helper function to prepare fully crossed conditions primarily for use with the \code{conditions} argument of \code{\link{conditional_effects}}. Automatically creates labels for each row in the \code{cond__} column. } \details{ For factor like variables, all levels are used as conditions. For numeric variables, \code{mean + (-1:1) * SD} are used as conditions. } \examples{ df <- data.frame(x = c("a", "b"), y = rnorm(10)) make_conditions(df, vars = c("x", "y")) } \seealso{ \code{\link{conditional_effects}}, \code{\link{rows2labels}} } brms/man/sar.Rd0000644000176200001440000000351313611651307013051 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ac.R \name{sar} \alias{sar} \title{Spatial simultaneous autoregressive (SAR) structures} \usage{ sar(M, type = "lag") } \arguments{ \item{M}{An object specifying the spatial weighting matrix. Can be either the spatial weight matrix itself or an object of class \code{listw} or \code{nb}, from which the spatial weighting matrix can be computed.} \item{type}{Type of the SAR structure. Either \code{"lag"} (for SAR of the response values) or \code{"error"} (for SAR of the residuals). More information is provided in the 'Details' section.} } \value{ An object of class \code{'sar_term'}, which is a list of arguments to be interpreted by the formula parsing functions of \pkg{brms}. } \description{ Set up an spatial simultaneous autoregressive (SAR) term in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with SAR terms. } \details{ The \code{lagsar} structure implements SAR of the response values: \deqn{y = \rho W y + \eta + e} The \code{errorsar} structure implements SAR of the residuals: \deqn{y = \eta + u, u = \rho W u + e} In the above equations, \eqn{\eta} is the predictor term and \eqn{e} are independent normally or t-distributed residuals. Currently, only families \code{gaussian} and \code{student} support SAR structures. } \examples{ \dontrun{ data(oldcol, package = "spdep") fit1 <- brm(CRIME ~ INC + HOVAL + sar(COL.nb, type = "lag"), data = COL.OLD, data2 = list(COL.nb = COL.nb), chains = 2, cores = 2) summary(fit1) plot(fit1) fit2 <- brm(CRIME ~ INC + HOVAL + sar(COL.nb, type = "error"), data = COL.OLD, data2 = list(COL.nb = COL.nb), chains = 2, cores = 2) summary(fit2) plot(fit2) } } \seealso{ \code{\link{autocor-terms}} } brms/man/AsymLaplace.Rd0000644000176200001440000000267013565500267014470 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{AsymLaplace} \alias{AsymLaplace} \alias{dasym_laplace} \alias{pasym_laplace} \alias{qasym_laplace} \alias{rasym_laplace} \title{The Asymmetric Laplace Distribution} \usage{ dasym_laplace(x, mu = 0, sigma = 1, quantile = 0.5, log = FALSE) pasym_laplace( q, mu = 0, sigma = 1, quantile = 0.5, lower.tail = TRUE, log.p = FALSE ) qasym_laplace( p, mu = 0, sigma = 1, quantile = 0.5, lower.tail = TRUE, log.p = FALSE ) rasym_laplace(n, mu = 0, sigma = 1, quantile = 0.5) } \arguments{ \item{x, q}{Vector of quantiles.} \item{mu}{Vector of locations.} \item{sigma}{Vector of scales.} \item{quantile}{Asymmetry parameter corresponding to quantiles in quantile regression (hence the name).} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{p}{Vector of probabilities.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, quantile function and random generation for the asymmetric Laplace distribution with location \code{mu}, scale \code{sigma} and asymmetry parameter \code{quantile}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/coef.brmsfit.Rd0000644000176200001440000000346313605605651014655 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{coef.brmsfit} \alias{coef.brmsfit} \title{Extract Model Coefficients} \usage{ \method{coef}{brmsfit}(object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{...}{Further arguments passed to \code{\link{fixef.brmsfit}} and \code{\link{ranef.brmsfit}}.} } \value{ A list of 3D arrays (one per grouping factor). If \code{summary} is \code{TRUE}, the 1st dimension contains the factor levels, the 2nd dimension contains the summary statistics (see \code{\link{posterior_summary}}), and the 3rd dimension contains the group-level effects. If \code{summary} is \code{FALSE}, the 1st dimension contains the posterior draws, the 2nd dimension contains the factor levels, and the 3rd dimension contains the group-level effects. } \description{ Extract model coefficients, which are the sum of population-level effects and corresponding group-level effects } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), data = epilepsy, family = gaussian(), chains = 2) ## extract population and group-level coefficients separately fixef(fit) ranef(fit) ## extract combined coefficients coef(fit) } } brms/man/mi.Rd0000644000176200001440000000144013606623217012671 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-sp.R \name{mi} \alias{mi} \title{Predictors with Missing Values in \pkg{brms} Models} \usage{ mi(x) } \arguments{ \item{x}{The variable containing missings.} } \description{ Specify predictor term with missing values in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model. } \details{ For detailed documentation see \code{help(brmsformula)}. } \examples{ \dontrun{ data("nhanes", package = "mice") bform <- bf(bmi | mi() ~ age * mi(chl)) + bf(chl | mi() ~ age) + set_rescor(FALSE) fit <- brm(bform, data = nhanes) summary(fit) plot(marginal_effects(fit, resp = "bmi"), ask = FALSE) LOO(fit, newdata = na.omit(fit$data)) } } \seealso{ \code{\link{brmsformula}} } brms/man/Frechet.Rd0000644000176200001440000000235613565500267013656 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{Frechet} \alias{Frechet} \alias{dfrechet} \alias{pfrechet} \alias{qfrechet} \alias{rfrechet} \title{The Frechet Distribution} \usage{ dfrechet(x, loc = 0, scale = 1, shape = 1, log = FALSE) pfrechet(q, loc = 0, scale = 1, shape = 1, lower.tail = TRUE, log.p = FALSE) qfrechet(p, loc = 0, scale = 1, shape = 1, lower.tail = TRUE, log.p = FALSE) rfrechet(n, loc = 0, scale = 1, shape = 1) } \arguments{ \item{x, q}{Vector of quantiles.} \item{loc}{Vector of locations.} \item{scale}{Vector of scales.} \item{shape}{Vector of shapes.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{p}{Vector of probabilities.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, quantile function and random generation for the Frechet distribution with location \code{loc}, scale \code{scale}, and shape \code{shape}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/predictive_error.brmsfit.Rd0000644000176200001440000000454313601114646017303 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predictive_error.R \name{predictive_error.brmsfit} \alias{predictive_error.brmsfit} \alias{predictive_error} \title{Posterior Samples of Predictive Errors} \usage{ \method{predictive_error}{brmsfit}( object, newdata = NULL, re_formula = NULL, re.form = NULL, resp = NULL, nsamples = NULL, subset = NULL, sort = FALSE, ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{re.form}{Alias of \code{re_formula}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{sort}{Logical. Only relevant for time series models. Indicating whether to return predicted values in the original order (\code{FALSE}; default) or in the order of the time series (\code{TRUE}).} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ An S x N \code{array} of predictive error samples, where S is the number of posterior samples and N is the number of observations. } \description{ Compute posterior samples of predictive errors, that is, observed minus predicted responses. Can be performed for the data used to fit the model (posterior predictive checks) or for new data. } \examples{ \dontrun{ ## fit a model fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler, cores = 2) ## extract predictive errors pe <- predictive_error(fit) str(pe) } } brms/man/update.brmsfit.Rd0000644000176200001440000000345113601151454015211 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/update.R \name{update.brmsfit} \alias{update.brmsfit} \title{Update \pkg{brms} models} \usage{ \method{update}{brmsfit}(object, formula., newdata = NULL, recompile = NULL, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{formula.}{Changes to the formula; for details see \code{\link{update.formula}} and \code{\link{brmsformula}}.} \item{newdata}{Optional \code{data.frame} to update the model with new data.} \item{recompile}{Logical, indicating whether the Stan model should be recompiled. If \code{NULL} (the default), \code{update} tries to figure out internally, if recompilation is necessary. Setting it to \code{FALSE} will cause all Stan code changing arguments to be ignored.} \item{...}{Other arguments passed to \code{\link{brm}}.} } \description{ This method allows to update an existing \code{brmsfit} object. } \details{ Sometimes, when updating the model formula, it may happen that \R complains about a mismatch between \code{model frame} and \code{formula}. This error can be avoided by supplying your original data again via argument \code{newdata}. } \examples{ \dontrun{ fit1 <- brm(time | cens(censored) ~ age * sex + disease + (1|patient), data = kidney, family = gaussian("log")) summary(fit1) ## remove effects of 'disease' fit2 <- update(fit1, formula. = ~ . - disease) summary(fit2) ## remove the group specific term of 'patient' and ## change the data (just take a subset in this example) fit3 <- update(fit1, formula. = ~ . - (1|patient), newdata = kidney[1:38, ]) summary(fit3) ## use another family and add population-level priors fit4 <- update(fit1, family = weibull(), inits = "0", prior = set_prior("normal(0,5)")) summary(fit4) } } brms/man/plot.brmsfit.Rd0000644000176200001440000000431413601164263014706 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{plot.brmsfit} \alias{plot.brmsfit} \title{Trace and Density Plots for MCMC Samples} \usage{ \method{plot}{brmsfit}( x, pars = NA, combo = c("dens", "trace"), N = 5, fixed = FALSE, exact_match = FALSE, theme = NULL, plot = TRUE, ask = TRUE, newpage = TRUE, ... ) } \arguments{ \item{x}{An object of class \code{brmsfit}.} \item{pars}{Names of the parameters to plot, as given by a character vector or a regular expression. By default, all parameters except for group-level and smooth effects are plotted.} \item{combo}{A character vector with at least two elements. Each element of \code{combo} corresponds to a column in the resulting graphic and should be the name of one of the available \code{\link[bayesplot:MCMC-overview]{MCMC}} functions (omitting the \code{mcmc_} prefix).} \item{N}{The number of parameters plotted per page.} \item{fixed}{Indicates whether parameter names should be matched exactly (\code{TRUE}) or treated as regular expressions (\code{FALSE}). Default is \code{FALSE}.} \item{exact_match}{Deprecated alias of argument \code{fixed}.} \item{theme}{A \code{\link[ggplot2:theme]{theme}} object modifying the appearance of the plots. For some basic themes see \code{\link[ggplot2:ggtheme]{ggtheme}} and \code{\link[bayesplot:theme_default]{theme_default}}.} \item{plot}{Logical; indicates if plots should be plotted directly in the active graphic device. Defaults to \code{TRUE}.} \item{ask}{Logical; indicates if the user is prompted before a new page is plotted. Only used if \code{plot} is \code{TRUE}.} \item{newpage}{Logical; indicates if the first set of plots should be plotted to a new page. Only used if \code{plot} is \code{TRUE}.} \item{...}{Further arguments passed to \code{\link[bayesplot:mcmc_combo]{mcmc_combo}}.} } \value{ An invisible list of \code{\link[gtable:gtable]{gtable}} objects. } \description{ Trace and Density Plots for MCMC Samples } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1|patient) + (1|visit), data = epilepsy, family = "poisson") plot(fit) ## plot population-level effects only plot(fit, pars = "^b_") } } brms/man/summary.brmsfit.Rd0000644000176200001440000000237513601151454015430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.R \name{summary.brmsfit} \alias{summary.brmsfit} \title{Create a summary of a fitted model represented by a \code{brmsfit} object} \usage{ \method{summary}{brmsfit}(object, priors = FALSE, prob = 0.95, mc_se = FALSE, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}} \item{priors}{Logical; Indicating if priors should be included in the summary. Default is \code{FALSE}.} \item{prob}{A value between 0 and 1 indicating the desired probability to be covered by the uncertainty intervals. The default is 0.95.} \item{mc_se}{Logical; Indicating if the uncertainty caused by the MCMC sampling should be shown in the summary. Defaults to \code{FALSE}.} \item{...}{Other potential arguments} } \description{ Create a summary of a fitted model represented by a \code{brmsfit} object } \details{ The convergence diagnostics \code{Rhat}, \code{Bulk_ESS}, and \code{Tail_ESS} are described in detail in Vehtari et al. (2019). } \references{ Aki Vehtari, Andrew Gelman, Daniel Simpson, Bob Carpenter, and Paul-Christian Bürkner (2019). Rank-normalization, folding, and localization: An improved R-hat for assessing convergence of MCMC. *arXiv preprint* `arXiv:1903.08008`. } brms/man/custom_family.Rd0000644000176200001440000001072613565500267015151 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/families.R \name{custom_family} \alias{custom_family} \alias{customfamily} \title{Custom Families in \pkg{brms} Models} \usage{ custom_family( name, dpars = "mu", links = "identity", type = c("real", "int"), lb = NA, ub = NA, vars = NULL, specials = NULL, threshold = c("flexible", "equidistant"), log_lik = NULL, predict = NULL, fitted = NULL, env = parent.frame() ) } \arguments{ \item{name}{Name of the custom family.} \item{dpars}{Names of the distributional parameters of the family. One parameter must be named \code{"mu"} and the main formula of the model will correspond to that parameter.} \item{links}{Names of the link functions of the distributional parameters.} \item{type}{Indicates if the response distribution is continuous (\code{"real"}) or discrete (\code{"int"}).} \item{lb}{Vector of lower bounds of the distributional parameters. Defaults to \code{NA} that is no lower bound.} \item{ub}{Vector of upper bounds of the distributional parameters. Defaults to \code{NA} that is no upper bound.} \item{vars}{Names of variables, which are part of the likelihood function without being distributional parameters. That is, \code{vars} can be used to pass data to the likelihood. See \code{\link{stanvar}} for details about adding self-defined data to the generated \pkg{Stan} model.} \item{specials}{A character vector of special options to enable for this custom family. Currently for internal use only.} \item{threshold}{Optional threshold type for custom ordinal families. Ignored for non-ordinal families.} \item{log_lik}{Optional function to compute log-likelihood values of the model in \R. This is only relevant if one wants to ensure compatibility with method \code{\link[brms:log_lik.brmsfit]{log_lik}}.} \item{predict}{Optional function to compute predicted values of the model in \R. This is only relevant if one wants to ensure compatibility with method \code{\link[brms:predict.brmsfit]{predict}}.} \item{fitted}{Optional function to compute fitted values of the model in \R. This is only relevant if one wants to ensure compatibility with method \code{\link[brms:fitted.brmsfit]{fitted}}.} \item{env}{An \code{\link{environment}} in which certain post-processing functions related to the custom family can be found, if there were not directly passed to \code{custom_family}. This is only relevant if one wants to ensure compatibility with the methods \code{\link[brms:predict.brmsfit]{predict}}, \code{\link[brms:fitted.brmsfit]{fitted}}, or \code{\link[brms:log_lik.brmsfit]{log_lik}}. By default, \code{env} is the enviroment from which \code{custom_family} is called.} } \value{ An object of class \code{customfamily} inheriting from class \code{\link{brmsfamily}}. } \description{ Define custom families (i.e. response distribution) for use in \pkg{brms} models. It allows users to benefit from the modeling flexibility of \pkg{brms}, while applying their self-defined likelihood functions. All of the post-processing methods for \code{brmsfit} objects can be made compatible with custom families. See \code{vignette("brms_customfamilies")} for more details. For a list of built-in families see \code{\link{brmsfamily}}. } \details{ The corresponding probability density or mass \code{Stan} functions need to have the same name as the custom family. That is if a family is called \code{myfamily}, then the \pkg{Stan} functions should be called \code{myfamily_lpdf} or \code{myfamily_lpmf} depending on whether it defines a continuous or discrete distribution. } \examples{ \dontrun{ ## demonstrate how to fit a beta-binomial model ## generate some fake data phi <- 0.7 n <- 300 z <- rnorm(n, sd = 0.2) ntrials <- sample(1:10, n, replace = TRUE) eta <- 1 + z mu <- exp(eta) / (1 + exp(eta)) a <- mu * phi b <- (1 - mu) * phi p <- rbeta(n, a, b) y <- rbinom(n, ntrials, p) dat <- data.frame(y, z, ntrials) # define a custom family beta_binomial2 <- custom_family( "beta_binomial2", dpars = c("mu", "phi"), links = c("logit", "log"), lb = c(NA, 0), type = "int", vars = "trials[n]" ) # define the corresponding Stan density function stan_funs <- " real beta_binomial2_lpmf(int y, real mu, real phi, int N) { return beta_binomial_lpmf(y | N, mu * phi, (1 - mu) * phi); } " # fit the model fit <- brm(y | trials(ntrials) ~ z, data = dat, family = beta_binomial2, stan_funs = stan_funs) summary(fit) } } \seealso{ \code{\link{brmsfamily}}, \code{\link{stanvar}} } brms/man/s.Rd0000644000176200001440000000224513606623217012532 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-sm.R \name{s} \alias{s} \alias{t2} \title{Defining smooths in \pkg{brms} formulas} \usage{ s(...) t2(...) } \arguments{ \item{...}{Arguments passed to \code{\link[mgcv:s]{mgcv::s}} or \code{\link[mgcv:t2]{mgcv::t2}}.} } \description{ Functions used in definition of smooth terms within a model formulas. The function does not evaluate a (spline) smooth - it exists purely to help set up a model using spline based smooths. } \details{ The function defined here are just simple wrappers of the respective functions of the \pkg{mgcv} package. } \examples{ \dontrun{ # simulate some data dat <- mgcv::gamSim(1, n = 200, scale = 2) # fit univariate smooths for all predictors fit1 <- brm(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat, chains = 2) summary(fit1) plot(marginal_smooths(fit1), ask = FALSE) # fit a more complicated smooth model fit2 <- brm(y ~ t2(x0, x1) + s(x2, by = x3), data = dat, chains = 2) summary(fit2) plot(marginal_smooths(fit2), ask = FALSE) } } \seealso{ \code{\link{brmsformula}}, \code{\link[mgcv:s]{mgcv::s}}, \code{\link[mgcv:t2]{mgcv::t2}} } brms/man/get_y.Rd0000644000176200001440000000130113567776477013416 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data-response.R \name{get_y} \alias{get_y} \title{Extract response values} \usage{ get_y(x, resp = NULL, warn = FALSE, ...) } \arguments{ \item{x}{A \code{\link{brmsfit}} object.} \item{resp}{Optional names of response variables for which to extract values.} \item{warn}{For internal use only.} \item{...}{Further arguments passed to \code{\link{standata}}.} } \value{ Returns a vector of response values for univariate models and a matrix of response values with one column per response variable for multivariate models. } \description{ Extract response values from a \code{\link{brmsfit}} object. } \keyword{internal} brms/man/post_prob.brmsfit.Rd0000644000176200001440000000532113601151454015734 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bridgesampling.R \name{post_prob.brmsfit} \alias{post_prob.brmsfit} \alias{post_prob} \title{Posterior Model Probabilities from Marginal Likelihoods} \usage{ \method{post_prob}{brmsfit}(x, ..., prior_prob = NULL, model_names = NULL) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{prior_prob}{Numeric vector with prior model probabilities. If omitted, a uniform prior is used (i.e., all models are equally likely a priori). The default \code{NULL} corresponds to equal prior model weights.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} } \description{ Compute posterior model probabilities from marginal likelihoods. The \code{brmsfit} method is just a thin wrapper around the corresponding method for \code{bridge} objects. } \details{ Computing the marginal likelihood requires samples of all variables defined in Stan's \code{parameters} block to be saved. Otherwise \code{post_prob} cannot be computed. Thus, please set \code{save_all_pars = TRUE} in the call to \code{brm}, if you are planning to apply \code{post_prob} to your models. The computation of model probabilities based on bridge sampling requires a lot more posterior samples than usual. A good conservative rule of thump is perhaps 10-fold more samples (read: the default of 4000 samples may not be enough in many cases). If not enough posterior samples are provided, the bridge sampling algorithm tends to be unstable leading to considerably different results each time it is run. We thus recommend running \code{post_prob} multiple times to check the stability of the results. More details are provided under \code{\link[bridgesampling:post_prob]{bridgesampling:post_prob}}. } \examples{ \dontrun{ # model with the treatment effect fit1 <- brm( count ~ zAge + zBase + Trt, data = epilepsy, family = negbinomial(), prior = prior(normal(0, 1), class = b), save_all_pars = TRUE ) summary(fit1) # model without the treatent effect fit2 <- brm( count ~ zAge + zBase, data = epilepsy, family = negbinomial(), prior = prior(normal(0, 1), class = b), save_all_pars = TRUE ) summary(fit2) # compute the posterior model probabilities post_prob(fit1, fit2) # specify prior model probabilities post_prob(fit1, fit2, prior_prob = c(0.8, 0.2)) } } \seealso{ \code{ \link[brms:bridge_sampler]{bridge_sampler}, \link[brms:bayes_factor]{bayes_factor} } } brms/man/brm_multiple.Rd0000644000176200001440000001715313611651306014763 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brm_multiple.R \name{brm_multiple} \alias{brm_multiple} \title{Run the same \pkg{brms} model on multiple datasets} \usage{ brm_multiple( formula, data, family = gaussian(), prior = NULL, data2 = NULL, autocor = NULL, cov_ranef = NULL, sample_prior = c("no", "yes", "only"), sparse = NULL, knots = NULL, stanvars = NULL, stan_funs = NULL, combine = TRUE, fit = NA, seed = NA, file = NULL, ... ) } \arguments{ \item{formula}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in \code{\link{brmsformula}}.} \item{data}{A list of data.frames each of which will be used to fit a separate model. Alternatively, a \code{mids} object from the \pkg{mice} package.} \item{family}{A description of the response distribution and link function to be used in the model. This can be a family function, a call to a family function or a character string naming the family. Every family function has a \code{link} argument allowing to specify the link function to be applied on the response variable. If not specified, default links are used. For details of supported families see \code{\link{brmsfamily}}. By default, a linear \code{gaussian} model is applied. In multivariate models, \code{family} might also be a list of families.} \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the \code{c} method or the \code{+} operator. See also \code{\link{get_prior}} for more help.} \item{data2}{A named \code{list} of objects containing data, which cannot be passed via argument \code{data}. Required for some objects used in autocorrelation structures to specify dependency structures.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object describing the correlation structure within the response variable (i.e., the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for a description of the available correlation structures. Defaults to \code{NULL}, corresponding to no correlations. In multivariate models, \code{autocor} might also be a list of autocorrelation structures. It is now recommend to specify autocorrelation terms directly within \code{formula}. See \code{\link{brmsformula}} for more details.} \item{cov_ranef}{A list of matrices that are proportional to the (within) covariance structure of the group-level effects. The names of the matrices should correspond to columns in \code{data} that are used as grouping factors. All levels of the grouping factor should appear as rownames of the corresponding matrix. This argument can be used, among others to model pedigrees and phylogenetic effects. See \code{vignette("brms_phylogenetics")} for more details.} \item{sample_prior}{Indicate if samples from priors should be drawn additionally to the posterior samples (defaults to \code{"no"}). Among others, these samples can be used to calculate Bayes factors for point hypotheses via \code{\link{hypothesis}}. Please note that improper priors are not sampled, including the default improper priors used by \code{brm}. See \code{\link{set_prior}} on how to set (proper) priors. Please also note that prior samples for the overall intercept are not obtained by default for technical reasons. See \code{\link{brmsformula}} how to obtain prior samples for the intercept. If \code{sample_prior} is set to \code{"only"}, samples are drawn solely from the priors ignoring the likelihood, which allows among others to generate samples from the prior predictive distribution. In this case, all parameters must have proper priors.} \item{sparse}{(Deprecated) Logical; indicates whether the population-level design matrices should be treated as sparse (defaults to \code{FALSE}). For design matrices with many zeros, this can considerably reduce required memory. Sampling speed is currently not improved or even slightly decreased. It is now recommended to use the \code{sparse} argument of \code{\link{brmsformula}} and related functions.} \item{knots}{Optional list containing user specified knot values to be used for basis construction of smoothing terms. See \code{\link[mgcv:gamm]{gamm}} for more details.} \item{stanvars}{An optional \code{stanvars} object generated by function \code{\link{stanvar}} to define additional variables for use in \pkg{Stan}'s program blocks.} \item{stan_funs}{(Deprecated) An optional character string containing self-defined \pkg{Stan} functions, which will be included in the functions block of the generated \pkg{Stan} code. It is now recommended to use the \code{stanvars} argument for this purpose, instead.} \item{combine}{Logical; Indicates if the fitted models should be combined into a single fitted model object via \code{\link{combine_models}}. Defaults to \code{TRUE}.} \item{fit}{An instance of S3 class \code{brmsfit_multiple} derived from a previous fit; defaults to \code{NA}. If \code{fit} is of class \code{brmsfit_multiple}, the compiled model associated with the fitted result is re-used and all arguments modifying the model code or data are ignored. It is not recommended to use this argument directly, but to call the \code{\link[brms:update.brmsfit_multiple]{update}} method, instead.} \item{seed}{The seed for random number generation to make results reproducible. If \code{NA} (the default), \pkg{Stan} will set the seed randomly.} \item{file}{Either \code{NULL} or a character string. In the latter case, the fitted model object is saved via \code{\link{saveRDS}} in a file named after the string supplied in \code{file}. The \code{.rds} extension is added automatically. If the file already exists, \code{brm} will load and return the saved model object instead of refitting the model. As existing files won't be overwritten, you have to manually remove the file in order to refit and save the model under an existing file name. The file name is stored in the \code{brmsfit} object for later usage.} \item{...}{Further arguments passed to \code{\link{brm}}.} } \value{ If \code{combine = TRUE} a \code{brmsfit_multiple} object, which inherits from class \code{brmsfit} and behaves essentially the same. If \code{combine = FALSE} a list of \code{brmsfit} objects. } \description{ Run the same \pkg{brms} model on multiple datasets and then combine the results into one fitted model object. This is useful in particular for multiple missing value imputation, where the same model is fitted on multiple imputed data sets. Models can be run in parallel using the \pkg{future} package. } \details{ The combined model may issue false positive convergence warnings, as the MCMC chains corresponding to different datasets may not necessarily overlap, even if each of the original models did converge. To find out whether each of the original models converged, investigate \code{fit$rhats}, where \code{fit} denotes the output of \code{brm_multiple}. } \examples{ \dontrun{ library(mice) imp <- mice(nhanes2) # fit the model using mice and lm fit_imp1 <- with(lm(bmi ~ age + hyp + chl), data = imp) summary(pool(fit_imp1)) # fit the model using brms fit_imp2 <- brm_multiple(bmi ~ age + hyp + chl, data = imp, chains = 1) summary(fit_imp2) plot(fit_imp2, pars = "^b_") # investigate convergence of the original models fit_imp2$rhats # use the future package for parallelization library(future) plan(multiprocess) fit_imp3 <- brm_multiple(bmi~age+hyp+chl, data = imp, chains = 1) summary(fit_imp3) } } \author{ Paul-Christian Buerkner \email{paul.buerkner@gmail.com} } brms/man/do_call.Rd0000644000176200001440000000132413565500270013657 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/misc.R \name{do_call} \alias{do_call} \title{Execute a Function Call} \usage{ do_call(what, args, pkg = NULL) } \arguments{ \item{what}{Either a function or a non-empty character string naming the function to be called.} \item{args}{A list of arguments to the function call. The names attribute of \code{args} gives the argument names.} \item{pkg}{Optional name of the package in which to search for the function if \code{what} is a character string.} } \value{ The result of the (evaluated) function call. } \description{ Execute a function call similar to \code{\link{do.call}}, but without deparsing function arguments. } \keyword{internal} brms/man/lasso.Rd0000644000176200001440000000355113565500270013407 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R \name{lasso} \alias{lasso} \title{Set up a lasso prior in \pkg{brms}} \usage{ lasso(df = 1, scale = 1) } \arguments{ \item{df}{Degrees of freedom of the chi-square prior of the inverse tuning parameter. Defaults to \code{1}.} \item{scale}{Scale of the lasso prior. Defaults to \code{1}.} } \value{ A character string obtained by \code{match.call()} with additional arguments. } \description{ Function used to set up a lasso prior for population-level effects in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up the model. } \details{ The lasso prior is the Bayesian equivalent to the LASSO method for performing variable selection (Park & Casella, 2008). With this prior, independent Laplace (i.e. double exponential) priors are placed on the population-level effects. The scale of the Laplace priors depends on a tuning parameter that controls the amount of shrinkage. In \pkg{brms}, the inverse of the tuning parameter is used so that smaller values imply more shrinkage. The inverse tuning parameter has a chi-square distribution and with degrees of freedom controlled via argument \code{df} of function \code{lasso} (defaults to \code{1}). For instance, one can specify a lasso prior using \code{set_prior("lasso(1)")}. To make sure that shrinkage can equally affect all coefficients, predictors should be one the same scale. If you do not want to standardized all variables, you can adjust the general scale of the lasso prior via argument \code{scale}, for instance, \code{lasso(1, scale = 10)}. } \examples{ set_prior(lasso(df = 1, scale = 10)) } \references{ Park, T., & Casella, G. (2008). The Bayesian Lasso. Journal of the American Statistical Association, 103(482), 681-686. } \seealso{ \code{\link{set_prior}} } brms/man/ExGaussian.Rd0000644000176200001440000000243313565500267014341 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{ExGaussian} \alias{ExGaussian} \alias{dexgaussian} \alias{pexgaussian} \alias{rexgaussian} \title{The Exponentially Modified Gaussian Distribution} \usage{ dexgaussian(x, mu, sigma, beta, log = FALSE) pexgaussian(q, mu, sigma, beta, lower.tail = TRUE, log.p = FALSE) rexgaussian(n, mu, sigma, beta) } \arguments{ \item{x, q}{Vector of quantiles.} \item{mu}{Vector of means of the combined distribution.} \item{sigma}{Vector of standard deviations of the gaussian component.} \item{beta}{Vector of scales of the exponential component.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, and random generation for the exponentially modified Gaussian distribution with mean \code{mu} and standard deviation \code{sigma} of the gaussian component, as well as scale \code{beta} of the exponential component. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/get_prior.Rd0000644000176200001440000000677013611651307014266 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R \name{get_prior} \alias{get_prior} \title{Overview on Priors for \pkg{brms} Models} \usage{ get_prior( formula, data, family = gaussian(), autocor = NULL, sparse = NULL, internal = FALSE, ... ) } \arguments{ \item{formula}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in \code{\link{brmsformula}}.} \item{data}{An object of class \code{data.frame} (or one that can be coerced to that class) containing data of all variables used in the model.} \item{family}{A description of the response distribution and link function to be used in the model. This can be a family function, a call to a family function or a character string naming the family. Every family function has a \code{link} argument allowing to specify the link function to be applied on the response variable. If not specified, default links are used. For details of supported families see \code{\link{brmsfamily}}. By default, a linear \code{gaussian} model is applied. In multivariate models, \code{family} might also be a list of families.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object describing the correlation structure within the response variable (i.e., the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for a description of the available correlation structures. Defaults to \code{NULL}, corresponding to no correlations. In multivariate models, \code{autocor} might also be a list of autocorrelation structures. It is now recommend to specify autocorrelation terms directly within \code{formula}. See \code{\link{brmsformula}} for more details.} \item{sparse}{(Deprecated) Logical; indicates whether the population-level design matrices should be treated as sparse (defaults to \code{FALSE}). For design matrices with many zeros, this can considerably reduce required memory. Sampling speed is currently not improved or even slightly decreased. It is now recommended to use the \code{sparse} argument of \code{\link{brmsformula}} and related functions.} \item{internal}{A flag indicating if the names of additional internal parameters should be displayed. Setting priors on these parameters is not recommended} \item{...}{Currently ignored.} } \value{ A data.frame with columns \code{prior}, \code{class}, \code{coef}, and \code{group} and several rows, each providing information on a parameter (or parameter class) on which priors can be specified. The prior column is empty except for internal default priors. } \description{ Get information on all parameters (and parameter classes) for which priors may be specified including default priors. } \examples{ ## get all parameters and parameters classes to define priors on (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson())) ## define a prior on all population-level effects a once prior$prior[1] <- "normal(0,10)" ## define a specific prior on the population-level effect of Trt prior$prior[5] <- "student_t(10, 0, 5)" ## verify that the priors indeed found their way into Stan's model code make_stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson(), prior = prior) } \seealso{ \code{\link{set_prior}} } brms/man/extract_draws.Rd0000644000176200001440000001061613611651307015140 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/extract_draws.R \name{extract_draws.brmsfit} \alias{extract_draws.brmsfit} \alias{extract_draws} \title{Extract Data and Posterior Draws} \usage{ \method{extract_draws}{brmsfit}( x, newdata = NULL, re_formula = NULL, allow_new_levels = FALSE, sample_new_levels = "uncertainty", incl_autocor = TRUE, oos = NULL, resp = NULL, nsamples = NULL, subset = NULL, nug = NULL, smooths_only = FALSE, offset = TRUE, newdata2 = NULL, new_objects = NULL, point = NULL, ... ) extract_draws(x, ...) } \arguments{ \item{x}{An \R object typically of class \code{'brmsfit'}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{allow_new_levels}{A flag indicating if new levels of group-level effects are allowed (defaults to \code{FALSE}). Only relevant if \code{newdata} is provided.} \item{sample_new_levels}{Indicates how to sample new levels for grouping factors specified in \code{re_formula}. This argument is only relevant if \code{newdata} is provided and \code{allow_new_levels} is set to \code{TRUE}. If \code{"uncertainty"} (default), include group-level uncertainty in the predictions based on the variation of the existing levels. If \code{"gaussian"}, sample new levels from the (multivariate) normal distribution implied by the group-level standard deviations and correlations. This options may be useful for conducting Bayesian power analysis. If \code{"old_levels"}, directly sample new levels from the existing levels.} \item{incl_autocor}{A flag indicating if correlation structures originally specified via \code{autocor} should be included in the predictions. Defaults to \code{TRUE}.} \item{oos}{Optional indices of observations for which to compute out-of-sample rather than in-sample predictions. Only required in models that make use of response values to make predictions, that is currently only ARMA models.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{nug}{Small positive number for Gaussian process terms only. For numerical reasons, the covariance matrix of a Gaussian process might not be positive definite. Adding a very small number to the matrix's diagonal often solves this problem. If \code{NULL} (the default), \code{nug} is chosen internally.} \item{smooths_only}{Logical; If \code{TRUE} only draws related to the computation of smooth terms will be extracted.} \item{offset}{Logical; Indicates if offsets should be included in the predictions. Defaults to \code{TRUE}.} \item{newdata2}{A named \code{list} of objects containing new data, which cannot be passed via argument \code{newdata}. Required for some objects used in autocorrelation structures, or \code{\link{stanvars}}.} \item{new_objects}{Deprecated alias of \code{newdata2}.} \item{point}{Shall the returned object contain only point estimates of the parameters instead of their posterior samples? Defaults to \code{NULL} in which case no point estimate is computed. Alternatively, may be set to \code{"mean"} or \code{"median"}. This argument is primarily implemented to ensure compatibility with the \code{\link{loo_subsample}} method.} \item{...}{Further arguments passed to \code{\link{validate_newdata}}.} } \value{ An object of class \code{'brmsdraws'} or \code{'mvbrmsdraws'}, depending on whether a univariate or multivariate model is passed. } \description{ This method helps in preparing \pkg{brms} models for certin post-processing tasks most notably various forms of predictions. Unless you are a package developer, you will rarely need to call \code{extract_draws} directly. } brms/man/pp_mixture.brmsfit.Rd0000644000176200001440000000752113601201144016115 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pp_mixture.R \name{pp_mixture.brmsfit} \alias{pp_mixture.brmsfit} \alias{pp_mixture} \title{Posterior Probabilities of Mixture Component Memberships} \usage{ \method{pp_mixture}{brmsfit}( x, newdata = NULL, re_formula = NULL, resp = NULL, nsamples = NULL, subset = NULL, log = FALSE, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ... ) pp_mixture(x, ...) } \arguments{ \item{x}{An \R object usually of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{log}{Logical; Indicates whether to return probabilities on the log-scale.} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ If \code{summary = TRUE}, an N x E x K array, where N is the number of observations, K is the number of mixture components, and E is equal to \code{length(probs) + 2}. If \code{summary = FALSE}, an S x N x K array, where S is the number of posterior samples. } \description{ Compute the posterior probabilities of mixture component memberships for each observation including uncertainty estimates. } \details{ The returned probabilities can be written as \eqn{P(Kn = k | Yn)}, that is the posterior probability that observation n originates from component k. They are computed using Bayes' Theorem \deqn{P(Kn = k | Yn) = P(Yn | Kn = k) P(Kn = k) / P(Yn),} where \eqn{P(Yn | Kn = k)} is the (posterior) likelihood of observation n for component k, \eqn{P(Kn = k)} is the (posterior) mixing probability of component k (i.e. parameter \code{theta}), and \deqn{P(Yn) = \sum (k=1,...,K) P(Yn | Kn = k) P(Kn = k)} is a normalizing constant. } \examples{ \dontrun{ ## simulate some data set.seed(1234) dat <- data.frame( y = c(rnorm(100), rnorm(50, 2)), x = rnorm(150) ) ## fit a simple normal mixture model mix <- mixture(gaussian, nmix = 2) prior <- c( prior(normal(0, 5), Intercept, nlpar = mu1), prior(normal(0, 5), Intercept, nlpar = mu2), prior(dirichlet(2, 2), theta) ) fit1 <- brm(bf(y ~ x), dat, family = mix, prior = prior, chains = 2, inits = 0) summary(fit1) ## compute the membership probabilities ppm <- pp_mixture(fit1) str(ppm) ## extract point estimates for each observation head(ppm[, 1, ]) ## classify every observation according to ## the most likely component apply(ppm[, 1, ], 1, which.max) } } brms/man/posterior_linpred.brmsfit.Rd0000644000176200001440000000576213614033436017504 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pp_expect.R \name{posterior_linpred.brmsfit} \alias{posterior_linpred.brmsfit} \alias{posterior_linpred} \title{Posterior Samples of the Linear Predictor} \usage{ \method{posterior_linpred}{brmsfit}( object, transform = FALSE, newdata = NULL, re_formula = NULL, re.form = NULL, resp = NULL, dpar = NULL, nlpar = NULL, nsamples = NULL, subset = NULL, sort = FALSE, ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{transform}{(Deprecated) Logical; if \code{FALSE} (the default), samples of the linear predictor are returned. If \code{TRUE}, samples of transformed linear predictor, that is, the mean of the posterior predictive distribution are returned instead (see \code{\link{pp_expect}} for details). Only implemented for compatibility with the \code{\link[rstantools:posterior_linpred]{posterior_linpred}} generic.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{re.form}{Alias of \code{re_formula}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{dpar}{Optional name of a predicted distributional parameter. If specified, fitted values of this parameters are returned.} \item{nlpar}{Optional name of a predicted non-linear parameter. If specified, fitted values of this parameters are returned.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{sort}{Logical. Only relevant for time series models. Indicating whether to return predicted values in the original order (\code{FALSE}; default) or in the order of the time series (\code{TRUE}).} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \description{ Compute posterior samples of the linear predictor, that is samples before applying any link functions or other transformations. Can be performed for the data used to fit the model (posterior predictive checks) or for new data. } \examples{ \dontrun{ ## fit a model fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler) ## extract linear predictor values pl <- posterior_linpred(fit) str(pl) } } \seealso{ \code{\link{pp_expect.brmsfit}} } brms/man/validate_newdata.Rd0000644000176200001440000000322613565500267015567 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data-helpers.R \name{validate_newdata} \alias{validate_newdata} \title{Validate New Data} \usage{ validate_newdata( newdata, object, re_formula = NULL, allow_new_levels = FALSE, resp = NULL, check_response = TRUE, incl_autocor = TRUE, all_group_vars = NULL, ... ) } \arguments{ \item{newdata}{A \code{data.frame} containing new data to be validated.} \item{object}{A \code{brmsfit} object.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{allow_new_levels}{A flag indicating if new levels of group-level effects are allowed (defaults to \code{FALSE}). Only relevant if \code{newdata} is provided.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{check_response}{Logical; Indicates if response variables should be checked as well. Defaults to \code{TRUE}.} \item{incl_autocor}{A flag indicating if correlation structures originally specified via \code{autocor} should be included in the predictions. Defaults to \code{TRUE}.} \item{all_group_vars}{Optional names of grouping variables to be validated. Defaults to all grouping variables in the model.} \item{...}{Currently ignored.} } \value{ A validated \code{'data.frame'} based on \code{newdata}. } \description{ Validate new data passed to post-processing methods of \pkg{brms}. Unless you are a package developer, you will rarely need to call \code{validate_newdata} directly. } brms/man/cs.Rd0000644000176200001440000000161713606623217012677 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-cs.R \name{cs} \alias{cs} \alias{cse} \title{Category Specific Predictors in \pkg{brms} Models} \usage{ cs(expr) } \arguments{ \item{expr}{Expression containing predictors, for which category specific effects should be estimated. For evaluation, \R formula syntax is applied.} } \description{ Category Specific Predictors in \pkg{brms} Models } \details{ For detailed documentation see \code{help(brmsformula)} as well as \code{vignette("brms_overview")}. This function is almost solely useful when called in formulas passed to the \pkg{brms} package. } \examples{ \dontrun{ fit <- brm(rating ~ period + carry + cs(treat), data = inhaler, family = sratio("cloglog"), prior = set_prior("normal(0,5)"), chains = 2) summary(fit) plot(fit, ask = FALSE) } } \seealso{ \code{\link{brmsformula}} } brms/man/stanvar.Rd0000644000176200001440000000435713600756616013760 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stanvars.R \name{stanvar} \alias{stanvar} \alias{stanvars} \title{User-defined variables passed to Stan} \usage{ stanvar(x = NULL, name = NULL, scode = NULL, block = "data") } \arguments{ \item{x}{An \R object containing data to be passed to Stan. Only required if \code{block = 'data'} and ignored otherwise.} \item{name}{Optional character string providing the desired variable name of the object in \code{x}. If \code{NULL} (the default) the variable name is directly infered from \code{x}.} \item{scode}{Line of Stan code to define the variable in Stan language. If \code{block = 'data'}, the Stan code is inferred based on the class of \code{x} by default.} \item{block}{Name of one of Stan's program blocks in which the variable should be defined. Can be \code{'data'}, \code{'tdata'} (transformed data), \code{'parameters'}, \code{'tparameters'} (transformed parameters), \code{'model'}, \code{'genquant'} (generated quantities) or \code{'functions'}.} } \value{ An object of class \code{stanvars}. } \description{ Prepare user-defined variables to be passed to one of Stan's program blocks. This is primarily useful for defining more complex priors, for refitting models without recompilation despite changing priors, or for defining custom Stan functions. } \examples{ bprior <- prior(normal(mean_intercept, 10), class = "Intercept") stanvars <- stanvar(5, name = "mean_intercept") make_stancode(count ~ Trt, epilepsy, prior = bprior, stanvars = stanvars) # define a multi-normal prior with known covariance matrix bprior <- prior(multi_normal(M, V), class = "b") stanvars <- stanvar(rep(0, 2), "M", scode = " vector[K] M;") + stanvar(diag(2), "V", scode = " matrix[K, K] V;") make_stancode(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) # define a hierachical prior on the regression coefficients bprior <- set_prior("normal(0, tau)", class = "b") + set_prior("target += normal_lpdf(tau | 0, 10)", check = FALSE) stanvars <- stanvar(scode = "real tau;", block = "parameters") make_stancode(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) } brms/man/mmc.Rd0000644000176200001440000000203213606623217013036 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-re.R \name{mmc} \alias{mmc} \title{Multi-Membership Covariates} \usage{ mmc(...) } \arguments{ \item{...}{One or more terms containing covariates corresponding to the grouping levels specified in \code{\link{mm}}.} } \value{ A matrix with covariates as columns. } \description{ Specify covarariates that vary over different levels of multi-membership grouping factors thus requiring special treatment. This function is almost solely useful, when called in combination with \code{\link{mm}}. Outside of multi-membership terms it will behave very much like \code{\link{cbind}}. } \examples{ \dontrun{ # simulate some data dat <- data.frame( y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), g1 = sample(1:10, 100, TRUE), g2 = sample(1:10, 100, TRUE) ) # multi-membership model with level specific covariate values dat$xc <- (dat$x1 + dat$x2) / 2 fit <- brm(y ~ xc + (1 + mmc(x1, x2) | mm(g1, g2)), data = dat) summary(fit) } } \seealso{ \code{\link{mm}} } brms/man/loo_model_weights.brmsfit.Rd0000644000176200001440000000243513601151454017433 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo.R \name{loo_model_weights.brmsfit} \alias{loo_model_weights.brmsfit} \alias{loo_model_weights} \title{Model averaging via stacking or pseudo-BMA weighting.} \usage{ \method{loo_model_weights}{brmsfit}(x, ..., model_names = NULL) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} } \value{ A named vector of model weights. } \description{ Compute model weights for \code{brmsfit} objects via stacking or pseudo-BMA weighting. For more details, see \code{\link[loo:loo_model_weights]{loo::loo_model_weights}}. } \examples{ \dontrun{ # model with population-level effects only fit1 <- brm(rating ~ treat + period + carry, data = inhaler, family = "gaussian") # model with an additional varying intercept for subjects fit2 <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "gaussian") loo_model_weights(fit1, fit2) } } brms/man/rows2labels.Rd0000644000176200001440000000155013601107424014515 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/conditional_effects.R \name{rows2labels} \alias{rows2labels} \title{Convert Rows to Labels} \usage{ rows2labels(x, digits = 2, sep = " & ", incl_vars = TRUE, ...) } \arguments{ \item{x}{A \code{data.frame} for which to extract labels.} \item{digits}{Minimal number of decimal places shown in the labels of numeric variables.} \item{sep}{A single character string defining the separator between variables used in the labels.} \item{incl_vars}{Indicates if variable names should be part of the labels. Defaults to \code{TRUE}.} \item{...}{Currently unused.} } \value{ A character vector of the same length as the number of rows of \code{x}. } \description{ Convert information in rows to labels for each row. } \seealso{ \code{\link{make_conditions}}, \code{\link{conditional_effects}} } brms/man/mixture.Rd0000644000176200001440000000677313565500267014002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/families.R \name{mixture} \alias{mixture} \title{Finite Mixture Families in \pkg{brms}} \usage{ mixture(..., flist = NULL, nmix = 1, order = NULL) } \arguments{ \item{...}{One or more objects providing a description of the response distributions to be combined in the mixture model. These can be family functions, calls to family functions or character strings naming the families. For details of supported families see \code{\link{brmsfamily}}.} \item{flist}{Optional list of objects, which are treated in the same way as objects passed via the \code{...} argument.} \item{nmix}{Optional numeric vector specifying the number of times each family is repeated. If specified, it must have the same length as the number of families passed via \code{...} and \code{flist}.} \item{order}{Ordering constraint to identify mixture components. If \code{'mu'} or \code{TRUE}, population-level intercepts of the mean parameters are ordered in non-ordinal models and fixed to the same value in ordinal models (see details). If \code{'none'} or \code{FALSE}, no ordering constraint is applied. If \code{NULL} (the default), \code{order} is set to \code{'mu'} if all families are the same and \code{'none'} otherwise. Other ordering constraints may be implemented in the future.} } \value{ An object of class \code{mixfamily}. } \description{ Set up a finite mixture family for use in \pkg{brms}. } \details{ Most families supported by \pkg{brms} can be used to form mixtures. The response variable has to be valid for all components of the mixture family. Currently, the number of mixture components has to be specified by the user. It is not yet possible to estimate the number of mixture components from the data. Ordering intercepts in mixtures of ordinal families is not possible as each family has itself a set of vector of intercepts (i.e. ordinal thresholds). Instead, \pkg{brms} will fix the vector of intercepts across components in ordinal mixtures, if desired, so that users can try to identify the mixture model via selective inclusion of predictors. For most mixture models, you may want to specify priors on the population-level intercepts via \code{\link{set_prior}} to improve convergence. In addition, it is sometimes necessary to set \code{inits = 0} in the call to \code{\link{brm}} to allow chains to initialize properly. For more details on the specification of mixture models, see \code{\link{brmsformula}}. } \examples{ \dontrun{ ## simulate some data set.seed(1234) dat <- data.frame( y = c(rnorm(200), rnorm(100, 6)), x = rnorm(300), z = sample(0:1, 300, TRUE) ) ## fit a simple normal mixture model mix <- mixture(gaussian, gaussian) prior <- c( prior(normal(0, 7), Intercept, dpar = mu1), prior(normal(5, 7), Intercept, dpar = mu2) ) fit1 <- brm(bf(y ~ x + z), dat, family = mix, prior = prior, chains = 2) summary(fit1) pp_check(fit1) ## use different predictors for the components fit2 <- brm(bf(y ~ 1, mu1 ~ x, mu2 ~ z), dat, family = mix, prior = prior, chains = 2) summary(fit2) ## fix the mixing proportions fit3 <- brm(bf(y ~ x + z, theta1 = 1, theta2 = 2), dat, family = mix, prior = prior, inits = 0, chains = 2) summary(fit3) pp_check(fit3) ## predict the mixing proportions fit4 <- brm(bf(y ~ x + z, theta2 ~ x), dat, family = mix, prior = prior, inits = 0, chains = 2) summary(fit4) pp_check(fit4) ## compare model fit LOO(fit1, fit2, fit3, fit4) } } brms/man/mcmc_plot.brmsfit.Rd0000644000176200001440000000507713601213552015710 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{mcmc_plot.brmsfit} \alias{mcmc_plot.brmsfit} \alias{stanplot} \alias{stanplot.brmsfit} \alias{mcmc_plot} \title{MCMC Plots Implemented in \pkg{bayesplot}} \usage{ \method{mcmc_plot}{brmsfit}( object, pars = NA, type = "intervals", fixed = FALSE, exact_match = FALSE, ... ) mcmc_plot(object, ...) } \arguments{ \item{object}{An \R object typically of class \code{brmsfit}} \item{pars}{Names of parameters to be plotted, as given by a character vector or regular expressions. By default, all parameters except for group-level and smooth effects are plotted. May be ignored for some plots.} \item{type}{The type of the plot. Supported types are (as names) \code{hist}, \code{dens}, \code{hist_by_chain}, \code{dens_overlay}, \code{violin}, \code{intervals}, \code{areas}, \code{acf}, \code{acf_bar},\code{trace}, \code{trace_highlight}, \code{scatter}, \code{rhat}, \code{rhat_hist}, \code{neff}, \code{neff_hist} \code{nuts_acceptance}, \code{nuts_divergence}, \code{nuts_stepsize}, \code{nuts_treedepth}, and \code{nuts_energy}. For an overview on the various plot types see \code{\link[bayesplot:MCMC-overview]{MCMC-overview}}.} \item{fixed}{Indicates whether parameter names should be matched exactly (\code{TRUE}) or treated as regular expressions (\code{FALSE}). Default is \code{FALSE}.} \item{exact_match}{Deprecated alias of argument \code{fixed}.} \item{...}{Additional arguments passed to the plotting functions. See \code{\link[bayesplot:MCMC-overview]{MCMC-overview}} for more details.} } \value{ A \code{\link[ggplot2:ggplot]{ggplot}} object that can be further customized using the \pkg{ggplot2} package. } \description{ Convenient way to call MCMC plotting functions implemented in the \pkg{bayesplot} package. } \details{ Also consider using the \pkg{shinystan} package available via method \code{\link{launch_shinystan}} in \pkg{brms} for flexible and interactive visual analysis. } \examples{ \dontrun{ model <- brm(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = "poisson") # plot posterior intervals mcmc_plot(model) # only show population-level effects in the plots mcmc_plot(model, pars = "^b_") # show histograms of the posterior distributions mcmc_plot(model, type = "hist") # plot some diagnostics of the sampler mcmc_plot(model, type = "neff") mcmc_plot(model, type = "rhat") # plot some diagnostics specific to the NUTS sampler mcmc_plot(model, type = "nuts_acceptance") mcmc_plot(model, type = "nuts_divergence") } } brms/man/pairs.brmsfit.Rd0000644000176200001440000000240113601164263015041 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{pairs.brmsfit} \alias{pairs.brmsfit} \title{Create a matrix of output plots from a \code{brmsfit} object} \usage{ \method{pairs}{brmsfit}(x, pars = NA, fixed = FALSE, exact_match = FALSE, ...) } \arguments{ \item{x}{An object of class \code{brmsfit}} \item{pars}{Names of the parameters to plot, as given by a character vector or a regular expression. By default, all parameters except for group-level and smooth effects are plotted.} \item{fixed}{Indicates whether parameter names should be matched exactly (\code{TRUE}) or treated as regular expressions (\code{FALSE}). Default is \code{FALSE}.} \item{exact_match}{Deprecated alias of argument \code{fixed}.} \item{...}{Further arguments to be passed to \code{\link[bayesplot:mcmc_pairs]{mcmc_pairs}}.} } \description{ A \code{\link[graphics:pairs]{pairs}} method that is customized for MCMC output. } \details{ For a detailed description see \code{\link[bayesplot:mcmc_pairs]{mcmc_pairs}}. } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1|patient) + (1|visit), data = epilepsy, family = "poisson") pairs(fit, pars = parnames(fit)[1:3], fixed = TRUE) pairs(fit, pars = "^sd_") } } brms/man/addition-terms.Rd0000644000176200001440000001034513621206171015204 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ad.R \name{addition-terms} \alias{addition-terms} \alias{resp_se} \alias{resp_weights} \alias{resp_trials} \alias{resp_thres} \alias{resp_cat} \alias{resp_dec} \alias{resp_cens} \alias{resp_trunc} \alias{resp_mi} \alias{resp_rate} \alias{resp_subset} \alias{resp_vreal} \alias{resp_vint} \title{Additional Response Information} \usage{ resp_se(x, sigma = FALSE) resp_weights(x, scale = FALSE) resp_trials(x) resp_thres(x, gr = NA) resp_cat(x) resp_dec(x) resp_cens(x, y2 = NA) resp_trunc(lb = -Inf, ub = Inf) resp_mi(sdy = NA) resp_rate(denom) resp_subset(x) resp_vreal(...) resp_vint(...) } \arguments{ \item{x}{A vector; usually a variable defined in the data. Allowed values depend on the function: \code{resp_se} and \code{resp_weights} require positive numeric values. \code{resp_trials}, \code{resp_thres}, and \code{resp_cat} require positive integers. \code{resp_dec} requires \code{0} and \code{1}, or alternatively \code{'lower'} and \code{'upper'}. \code{resp_subset} requires \code{0} and \code{1}, or alternatively \code{FALSE} and \code{TRUE}. \code{resp_cens} requires \code{'left'}, \code{'none'}, \code{'right'}, and \code{'interval'} (or equivalently \code{-1}, \code{0}, \code{1}, and \code{2}) to indicate left, no, right, or interval censoring.} \item{sigma}{Logical; Indicates whether the residual standard deviation parameter \code{sigma} should be included in addition to the known measurement error. Defaults to \code{FALSE} for backwards compatibility, but setting it to \code{TRUE} is usually the better choice.} \item{scale}{Logical; Indicates whether weights should be scaled so that the average weight equals one. Defaults to \code{FALSE}.} \item{gr}{A vector of grouping indicators.} \item{y2}{A vector specifying the upper bounds in interval censoring. Will be ignored for non-interval censored observations. However, it should NOT be \code{NA} even for non-interval censored observations to avoid accidental exclusion of these observations.} \item{lb}{A numeric vector or single numeric value specifying the lower truncation bound.} \item{ub}{A numeric vector or single numeric value specifying the upper truncation bound.} \item{sdy}{Optional known measurement error of the response treated as standard deviation. If specified, handles measurement error and (completely) missing values at the same time using the plausible-values-technique.} \item{denom}{A vector of positive numeric values specifying the denominator values from which the response rates are computed.} \item{...}{For \code{resp_vreal}, vectors of real values. For \code{resp_vint}, vectors of integer values.} } \value{ A list of additional response information to be processed further by \pkg{brms}. } \description{ Provide additional information on the response variable in \pkg{brms} models, such as censoring, truncation, or known measurement error. } \details{ These functions are almost solely useful when called in formulas passed to the \pkg{brms} package. Within formulas, the \code{resp_} prefix may be omitted. More information is given in the 'Details' section of \code{\link{brmsformula}}. } \examples{ \dontrun{ ## Random effects meta-analysis nstudies <- 20 true_effects <- rnorm(nstudies, 0.5, 0.2) sei <- runif(nstudies, 0.05, 0.3) outcomes <- rnorm(nstudies, true_effects, sei) data1 <- data.frame(outcomes, sei) fit1 <- brm(outcomes | se(sei, sigma = TRUE) ~ 1, data = data1) summary(fit1) ## Probit regression using the binomial family n <- sample(1:10, 100, TRUE) # number of trials success <- rbinom(100, size = n, prob = 0.4) x <- rnorm(100) data2 <- data.frame(n, success, x) fit2 <- brm(success | trials(n) ~ x, data = data2, family = binomial("probit")) summary(fit2) ## Survival regression modeling the time between the first ## and second recurrence of an infection in kidney patients. fit3 <- brm(time | cens(censored) ~ age * sex + disease + (1|patient), data = kidney, family = lognormal()) summary(fit3) ## Poisson model with truncated counts fit4 <- brm(count | trunc(ub = 104) ~ zBase * Trt, data = epilepsy, family = poisson()) summary(fit4) } } \seealso{ \code{\link{brm}}, \code{\link{brmsformula}} } brms/man/posterior_table.Rd0000644000176200001440000000156713601151454015465 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.R \name{posterior_table} \alias{posterior_table} \title{Table Creation for Posterior Samples} \usage{ posterior_table(x, levels = NULL) } \arguments{ \item{x}{A matrix of posterior samples where rows indicate samples and columns indicate parameters.} \item{levels}{Optional values of possible posterior values. Defaults to all unique values in \code{x}.} } \value{ A matrix where rows indicate parameters and columns indicate the unique values of posterior samples. } \description{ Create a table for unique values of posterior samples. This is usually only useful when summarizing predictions of ordinal models. } \examples{ \dontrun{ fit <- brm(rating ~ period + carry + treat, data = inhaler, family = cumulative()) pr <- predict(fit, summary = FALSE) posterior_table(pr) } } brms/man/fixef.brmsfit.Rd0000644000176200001440000000311113605606050015022 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{fixef.brmsfit} \alias{fixef.brmsfit} \alias{fixef} \title{Extract Population-Level Estimates} \usage{ \method{fixef}{brmsfit}( object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), pars = NULL, ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{pars}{Optional names of coefficients to extract. By default, all coefficients are extracted.} \item{...}{Currently ignored.} } \value{ If \code{summary} is \code{TRUE}, a matrix returned by \code{\link{posterior_summary}} for the population-level effects. If \code{summary} is \code{FALSE}, a matrix with one row per posterior draw and one column per population-level effect. } \description{ Extract the population-level ('fixed') effects from a \code{brmsfit} object. } \examples{ \dontrun{ fit <- brm(time | cens(censored) ~ age + sex + disease, data = kidney, family = "exponential") fixef(fit) # extract only some coefficients fixef(fit, pars = c("age", "sex")) } } brms/man/cor_cosy.Rd0000644000176200001440000000231113611651306014076 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_cosy} \alias{cor_cosy} \alias{cor_cosy-class} \title{(Deprecated) Compound Symmetry (COSY) Correlation Structure} \usage{ cor_cosy(formula = ~1) } \arguments{ \item{formula}{A one sided formula of the form \code{~ t}, or \code{~ t | g}, specifying a time covariate \code{t} and, optionally, a grouping factor \code{g}. A covariate for this correlation structure must be integer valued. When a grouping factor is present in \code{formula}, the correlation structure is assumed to apply only to observations within the same grouping level; observations with different grouping levels are assumed to be uncorrelated. Defaults to \code{~ 1}, which corresponds to using the order of the observations in the data as a covariate, and no groups.} } \value{ An object of class \code{cor_cosy}, representing a compound symmetry correlation structure. } \description{ This function is deprecated. Please see \code{\link{cosy}} for the new syntax. This functions is a constructor for the \code{cor_cosy} class, representing a compound symmetry structure corresponding to uniform correlation. } \examples{ cor_cosy(~ visit | patient) } brms/man/is.brmsformula.Rd0000644000176200001440000000050713623751613015233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsformula.R \name{is.brmsformula} \alias{is.brmsformula} \title{Checks if argument is a \code{brmsformula} object} \usage{ is.brmsformula(x) } \arguments{ \item{x}{An \R object} } \description{ Checks if argument is a \code{brmsformula} object } brms/man/MultiStudentT.Rd0000644000176200001440000000227113565500267015057 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{MultiStudentT} \alias{MultiStudentT} \alias{dmulti_student_t} \alias{rmulti_student_t} \title{The Multivariate Student-t Distribution} \usage{ dmulti_student_t(x, df, mu, Sigma, log = FALSE, check = FALSE) rmulti_student_t(n, df, mu, Sigma, check = FALSE) } \arguments{ \item{x}{Vector or matrix of quantiles. If \code{x} is a matrix, each row is taken to be a quantile.} \item{df}{Vector of degrees of freedom.} \item{mu}{Location vector with length equal to the number of dimensions.} \item{Sigma}{Covariance matrix.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{check}{Logical; Indicates whether several input checks should be performed. Defaults to \code{FALSE} to improve efficiency.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density function and random generation for the multivariate Student-t distribution with location vector \code{mu}, covariance matrix \code{Sigma}, and degrees of freedom \code{df}. } \details{ See the Stan user's manual \url{http://mc-stan.org/documentation/} for details on the parameterization } brms/man/update_adterms.Rd0000644000176200001440000000202213565500267015265 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsformula.R \name{update_adterms} \alias{update_adterms} \title{Update Formula Addition Terms} \usage{ update_adterms(formula, adform, action = c("update", "replace")) } \arguments{ \item{formula}{Two-sided formula to be updated.} \item{adform}{One-sided formula containing addition terms to update \code{formula} with.} \item{action}{Indicates what should happen to the existing addition terms in \code{formula}. If \code{"update"} (the default), old addition terms that have no corresponding term in \code{adform} will be kept. If \code{"replace"}, all old addition terms will be removed.} } \value{ An object of class \code{formula}. } \description{ Update additions terms used in formulas of \pkg{brms}. See \code{\link{addition-terms}} for details. } \examples{ form <- y | trials(size) ~ x update_adterms(form, ~ trials(10)) update_adterms(form, ~ weights(w)) update_adterms(form, ~ weights(w), action = "replace") update_adterms(y ~ x, ~ trials(10)) } brms/man/loo_R2.brmsfit.Rd0000644000176200001440000000203113601151454015054 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo_predict.R \name{loo_R2.brmsfit} \alias{loo_R2.brmsfit} \alias{loo_R2} \title{Compute a LOO-adjusted R-squared for regression models} \usage{ \method{loo_R2}{brmsfit}(object, resp = NULL, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{...}{Further arguments passed to \code{\link[brms:pp_expect.brmsfit]{pp_expect}} and \code{\link[brms:log_lik.brmsfit]{log_lik}}, which are used in the computation of the R-squared values.} } \value{ A real value per response variable indicating the LOO-adjusted R-squared. } \description{ Compute a LOO-adjusted R-squared for regression models } \examples{ \dontrun{ fit <- brm(mpg ~ wt + cyl, data = mtcars) summary(fit) loo_R2(fit) # compute R2 with new data nd <- data.frame(mpg = c(10, 20, 30), wt = c(4, 3, 2), cyl = c(8, 6, 4)) loo_R2(fit, newdata = nd) } } brms/man/brms-package.Rd0000644000176200001440000000750213565500266014627 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brms-package.R \docType{package} \name{brms-package} \alias{brms-package} \alias{brms} \title{Bayesian Regression Models using 'Stan'} \description{ \if{html}{ \figure{stanlogo.png}{options: width="50px" alt="http://mc-stan.org/about/logo/"} \emph{Stan Development Team} } The \pkg{brms} package provides an interface to fit Bayesian generalized multivariate (non-)linear multilevel models using \pkg{Stan}, which is a C++ package for obtaining full Bayesian inference (see \url{http://mc-stan.org/}). The formula syntax is an extended version of the syntax applied in the \pkg{lme4} package to provide a familiar and simple interface for performing regression analyses. } \details{ The main function of \pkg{brms} is \code{\link{brm}}, which uses formula syntax to specify a wide range of complex Bayesian models (see \code{\link{brmsformula}} for details). Based on the supplied formulas, data, and additional information, it writes the Stan code on the fly via \code{\link{make_stancode}}, prepares the data via \code{\link{make_standata}}, and fits the model using \pkg{\link[rstan:rstan]{Stan}}. Subsequently, a large number of post-processing methods can be applied: To get an overview on the estimated parameters, \code{\link[brms:summary.brmsfit]{summary}} or \code{\link[brms:conditional_effects.brmsfit]{conditional_effects}} are perfectly suited. Detailed visual analyses can be performed by applying the \code{\link{pp_check}} and \code{\link{stanplot}} methods, which both rely on the \pkg{\link[bayesplot:bayesplot-package]{bayesplot}} package. Model comparsions can be done via \code{\link{loo}} and \code{\link{waic}}, which make use of the \pkg{\link[loo:loo-package]{loo}} package as well as via \code{\link{bayes_factor}} which relies on the \pkg{bridgesampling} package. For a full list of methods to apply, type \code{methods(class = "brmsfit")}. Because \pkg{brms} is based on \pkg{Stan}, a C++ compiler is required. The program Rtools (available on \url{https://cran.r-project.org/bin/windows/Rtools/}) comes with a C++ compiler for Windows. On Mac, you should use Xcode. For further instructions on how to get the compilers running, see the prerequisites section at the \href{https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started}{RStan-Getting-Started} page. When comparing other packages fitting multilevel models to \pkg{brms}, keep in mind that the latter needs to compile models before actually fitting them, which will require between 20 and 40 seconds depending on your machine, operating system and overall model complexity. Thus, fitting smaller models may be relatively slow as compilation time makes up the majority of the whole running time. For larger / more complex models however, fitting my take several minutes or even hours, so that the compilation time won't make much of a difference for these models. See \code{vignette("brms_overview")} and \code{vignette("brms_multilevel")} for a general introduction and overview of \pkg{brms}. For a full list of available vignettes, type \code{vignette(package = "brms")}. } \references{ Paul-Christian Buerkner (2017). brms: An R Package for Bayesian Multilevel Models Using Stan. \emph{Journal of Statistical Software}, 80(1), 1-28. \code{doi:10.18637/jss.v080.i01} Paul-Christian Buerkner (2018). Advanced Bayesian Multilevel Modeling with the R Package brms. \emph{The R Journal}. 10(1), 395–411. \code{doi:10.32614/RJ-2018-017} The Stan Development Team. \emph{Stan Modeling Language User's Guide and Reference Manual}. \url{http://mc-stan.org/users/documentation}. Stan Development Team (2018). RStan: the R interface to Stan. R package version 2.18.1. \url{http://mc-stan.org} } \seealso{ \code{\link{brm}}, \code{\link{brmsformula}}, \code{\link{brmsfamily}}, \code{\link{brmsfit}} } brms/man/ma.Rd0000644000176200001440000000326213611651307012662 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ac.R \name{ma} \alias{ma} \title{Set up MA(q) correlation structures} \usage{ ma(time = NA, gr = NA, q = 1, cov = FALSE) } \arguments{ \item{time}{An optional time variable specifying the time ordering of the observations. By default, the existing order of the observations in the data is used.} \item{gr}{An optional grouping variable. If specified, the correlation structure is assumed to apply only to observations within the same grouping level.} \item{q}{A non-negative integer specifying the moving average (MA) order of the ARMA structure. Default is \code{1}.} \item{cov}{A flag indicating whether ARMA effects should be estimated by means of residual covariance matrices. This is currently only possible for stationary ARMA effects of order 1. If the model family does not have natural residuals, latent residuals are added automatically. If \code{FALSE} (the default), a regression formulation is used that is considerably faster and allows for ARMA effects of order higher than 1 but is only available for \code{gaussian} models and some of its generalizations.} } \value{ An object of class \code{'arma_term'}, which is a list of arguments to be interpreted by the formula parsing functions of \pkg{brms}. } \description{ Set up a moving average (MA) term of order q in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with MA terms. } \examples{ \dontrun{ data("LakeHuron") LakeHuron <- as.data.frame(LakeHuron) fit <- brm(x ~ ma(p = 2), data = LakeHuron) summary(fit) } } \seealso{ \code{\link{autocor-terms}}, \code{\link{arma}}, \code{\link{ar}} } brms/man/print.brmsfit.Rd0000644000176200001440000000133713601151454015064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.R \name{print.brmsfit} \alias{print.brmsfit} \alias{print.brmssummary} \title{Print a summary for a fitted model represented by a \code{brmsfit} object} \usage{ \method{print}{brmsfit}(x, digits = 2, ...) } \arguments{ \item{x}{An object of class \code{brmsfit}} \item{digits}{The number of significant digits for printing out the summary; defaults to 2. The effective sample size is always rounded to integers.} \item{...}{Additional arguments that would be passed to method \code{summary} of \code{brmsfit}.} } \description{ Print a summary for a fitted model represented by a \code{brmsfit} object } \seealso{ \code{\link{summary.brmsfit}} } brms/man/inv_logit_scaled.Rd0000644000176200001440000000077313565500270015576 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/numeric-helpers.R \name{inv_logit_scaled} \alias{inv_logit_scaled} \title{Scaled inverse logit-link} \usage{ inv_logit_scaled(x, lb = 0, ub = 1) } \arguments{ \item{x}{A numeric or complex vector.} \item{lb}{Lower bound defaulting to \code{0}.} \item{ub}{Upper bound defaulting to \code{1}.} } \value{ A numeric or complex vector between \code{lb} and \code{ub}. } \description{ Computes \code{inv_logit(x) * (ub - lb) + lb} } brms/man/posterior_samples.brmsfit.Rd0000644000176200001440000000552713601162150017502 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_samples.R \name{posterior_samples.brmsfit} \alias{posterior_samples.brmsfit} \alias{posterior_samples} \alias{as.data.frame.brmsfit} \alias{as.matrix.brmsfit} \alias{as.array.brmsfit} \title{Extract Posterior Samples} \usage{ \method{posterior_samples}{brmsfit}( x, pars = NA, fixed = FALSE, add_chain = FALSE, subset = NULL, as.matrix = FALSE, as.array = FALSE, ... ) posterior_samples(x, pars = NA, ...) \method{as.data.frame}{brmsfit}(x, row.names = NULL, optional = TRUE, ...) \method{as.matrix}{brmsfit}(x, ...) \method{as.array}{brmsfit}(x, ...) } \arguments{ \item{x}{An \code{R} object typically of class \code{brmsfit}} \item{pars}{Names of parameters for which posterior samples should be returned, as given by a character vector or regular expressions. By default, all posterior samples of all parameters are extracted.} \item{fixed}{Indicates whether parameter names should be matched exactly (\code{TRUE}) or treated as regular expressions (\code{FALSE}). Default is \code{FALSE}.} \item{add_chain}{A flag indicating if the returned \code{data.frame} should contain two additional columns. The \code{chain} column indicates the chain in which each sample was generated, the \code{iter} column indicates the iteration number within each chain.} \item{subset}{A numeric vector indicating the rows (i.e., posterior samples) to be returned. If \code{NULL} (the default), all posterior samples are returned.} \item{as.matrix}{Should the output be a \code{matrix} instead of a \code{data.frame}? Defaults to \code{FALSE}.} \item{as.array}{Should the output be an \code{array} instead of a \code{data.frame}? Defaults to \code{FALSE}.} \item{...}{For \code{as.data.frame}, \code{as.matrix}, and \code{as.array}: Further arguments to be passed to \code{posterior_samples}.} \item{row.names, optional}{See \code{\link[base:as.data.frame]{as.data.frame}}.} } \value{ A data.frame (matrix or array) containing the posterior samples, with one column per parameter. In case an array is returned, it contains one additional dimension for the chains. } \description{ Extract posterior samples of specified parameters. } \details{ Currently there are methods for \code{brmsfit} objects. \code{as.data.frame.brmsfit}, \code{as.matrix.brmsfit}, and \code{as.array.brmsfit} are basically aliases of \code{posterior_samples.brmsfit} and differ from each other only in type of the returned object. } \examples{ \dontrun{ fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "cumulative") # extract posterior samples of population-level effects samples1 <- posterior_samples(fit, "^b") head(samples1) # extract posterior samples of group-level standard deviations samples2 <- posterior_samples(fit, "^sd_") head(samples2) } } brms/man/is.brmsfit.Rd0000644000176200001440000000046513623751613014353 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-class.R \name{is.brmsfit} \alias{is.brmsfit} \title{Checks if argument is a \code{brmsfit} object} \usage{ is.brmsfit(x) } \arguments{ \item{x}{An \R object} } \description{ Checks if argument is a \code{brmsfit} object } brms/man/epilepsy.Rd0000644000176200001440000000373113565500267014126 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets.R \docType{data} \name{epilepsy} \alias{epilepsy} \title{Epileptic seizure counts} \format{A data frame of 236 observations containing information on the following 9 variables. \describe{ \item{Age}{The age of the patients in years} \item{Base}{The seizure count at 8-weeks baseline} \item{Trt}{Either \code{0} or \code{1} indicating if the patient received anti-convulsant therapy} \item{patient}{The patient number} \item{visit}{The session number from \code{1} (first visit) to \code{4} (last visit)} \item{count}{The seizure count between two visits} \item{obs}{The observation number, that is a unique identifier for each observation} \item{zAge}{Standardized \code{Age}} \item{zBase}{Standardized \code{Base}} }} \source{ Thall, P. F., & Vail, S. C. (1990). Some covariance models for longitudinal count data with overdispersion. \emph{Biometrics, 46(2)}, 657-671. \cr Breslow, N. E., & Clayton, D. G. (1993). Approximate inference in generalized linear mixed models. \emph{Journal of the American Statistical Association, 88(421)}, 9-25. } \usage{ epilepsy } \description{ Breslow and Clayton (1993) analyze data initially provided by Thall and Vail (1990) concerning seizure counts in a randomized trial of anti-convulsant therapy in epilepsy. Covariates are treatment, 8-week baseline seizure counts, and age of the patients in years. } \examples{ \dontrun{ ## poisson regression without random effects. fit1 <- brm(count ~ zAge + zBase * Trt, data = epilepsy, family = poisson()) summary(fit1) plot(fit1) ## poisson regression with varying intercepts of patients ## as well as normal priors for overall effects parameters. fit2 <- brm(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = poisson(), prior = set_prior("normal(0,5)")) summary(fit2) plot(fit2) } } \keyword{datasets} brms/man/cor_arr.Rd0000644000176200001440000000162513567776477013747 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_arr} \alias{cor_arr} \title{(Defunct) ARR correlation structure} \usage{ cor_arr(formula = ~1, r = 1) } \arguments{ \item{formula}{A one sided formula of the form \code{~ t}, or \code{~ t | g}, specifying a time covariate \code{t} and, optionally, a grouping factor \code{g}. A covariate for this correlation structure must be integer valued. When a grouping factor is present in \code{formula}, the correlation structure is assumed to apply only to observations within the same grouping level; observations with different grouping levels are assumed to be uncorrelated. Defaults to \code{~ 1}, which corresponds to using the order of the observations in the data as a covariate, and no groups.} \item{r}{No longer supported.} } \description{ The ARR correlation structure is no longer supported. } \keyword{internal} brms/man/GenExtremeValue.Rd0000644000176200001440000000230313565500267015326 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{GenExtremeValue} \alias{GenExtremeValue} \alias{dgen_extreme_value} \alias{pgen_extreme_value} \alias{rgen_extreme_value} \title{The Generalized Extreme Value Distribution} \usage{ dgen_extreme_value(x, mu = 0, sigma = 1, xi = 0, log = FALSE) pgen_extreme_value( q, mu = 0, sigma = 1, xi = 0, lower.tail = TRUE, log.p = FALSE ) rgen_extreme_value(n, mu = 0, sigma = 1, xi = 0) } \arguments{ \item{x, q}{Vector of quantiles.} \item{mu}{Vector of locations.} \item{sigma}{Vector of scales.} \item{xi}{Vector of shapes.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, and random generation for the generalized extreme value distribution with location \code{mu}, scale \code{sigma} and shape \code{xi}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/cor_ar.Rd0000644000176200001440000000376313611651306013537 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_ar} \alias{cor_ar} \title{(Deprecated) AR(p) correlation structure} \usage{ cor_ar(formula = ~1, p = 1, cov = FALSE) } \arguments{ \item{formula}{A one sided formula of the form \code{~ t}, or \code{~ t | g}, specifying a time covariate \code{t} and, optionally, a grouping factor \code{g}. A covariate for this correlation structure must be integer valued. When a grouping factor is present in \code{formula}, the correlation structure is assumed to apply only to observations within the same grouping level; observations with different grouping levels are assumed to be uncorrelated. Defaults to \code{~ 1}, which corresponds to using the order of the observations in the data as a covariate, and no groups.} \item{p}{A non-negative integer specifying the autoregressive (AR) order of the ARMA structure. Default is 1.} \item{cov}{A flag indicating whether ARMA effects should be estimated by means of residual covariance matrices. This is currently only possible for stationary ARMA effects of order 1. If the model family does not have natural residuals, latent residuals are added automatically. If \code{FALSE} (the default) a regression formulation is used that is considerably faster and allows for ARMA effects of order higher than 1 but is only available for \code{gaussian} models and some of its generalizations.} } \value{ An object of class \code{cor_arma} containing solely autoregression terms. } \description{ This function is deprecated. Please see \code{\link{ar}} for the new syntax. This function is a constructor for the \code{cor_arma} class, allowing for autoregression terms only. } \details{ AR refers to autoregressive effects of residuals, which is what is typically understood as autoregressive effects. However, one may also model autoregressive effects of the response variable, which is called ARR in \pkg{brms}. } \examples{ cor_ar(~visit|patient, p = 2) } \seealso{ \code{\link{cor_arma}} } brms/man/parse_bf.Rd0000644000176200001440000000647313611651307014055 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsterms.R \name{parse_bf} \alias{parse_bf} \alias{parse_bf.default} \alias{parse_bf.brmsformula} \alias{parse_bf.mvbrmsformula} \title{Parse Formulas of \pkg{brms} Models} \usage{ parse_bf(formula, ...) \method{parse_bf}{default}(formula, family = NULL, autocor = NULL, ...) \method{parse_bf}{brmsformula}( formula, family = NULL, autocor = NULL, check_response = TRUE, resp_rhs_all = TRUE, mv = FALSE, ... ) \method{parse_bf}{mvbrmsformula}(formula, family = NULL, autocor = NULL, ...) } \arguments{ \item{formula}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in \code{\link{brmsformula}}.} \item{...}{Further arguments passed to or from other methods.} \item{family}{A description of the response distribution and link function to be used in the model. This can be a family function, a call to a family function or a character string naming the family. Every family function has a \code{link} argument allowing to specify the link function to be applied on the response variable. If not specified, default links are used. For details of supported families see \code{\link{brmsfamily}}. By default, a linear \code{gaussian} model is applied. In multivariate models, \code{family} might also be a list of families.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object describing the correlation structure within the response variable (i.e., the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for a description of the available correlation structures. Defaults to \code{NULL}, corresponding to no correlations. In multivariate models, \code{autocor} might also be a list of autocorrelation structures. It is now recommend to specify autocorrelation terms directly within \code{formula}. See \code{\link{brmsformula}} for more details.} \item{check_response}{Logical; Indicates whether the left-hand side of \code{formula} (i.e. response variables and addition arguments) should be parsed. If \code{FALSE}, \code{formula} may also be one-sided.} \item{resp_rhs_all}{Logical; Indicates whether to also include response variables on the right-hand side of formula \code{.$allvars}, where \code{.} represents the output of \code{parse_bf}.} \item{mv}{Indicates if the univariate model is part of a multivariate model.} } \value{ An object of class \code{brmsterms} or \code{mvbrmsterms} (for multivariate models), which is a \code{list} containing all required information initially stored in \code{formula} in an easier to use format, basically a list of formulas (not an abstract syntax tree). } \description{ Parse formulas objects for use in \pkg{brms}. } \details{ This is the main formula parsing function of \pkg{brms}. It should usually not be called directly, but is exported to allow package developers making use of the formula syntax implemented in \pkg{brms}. As long as no other packages depend on this functions, it may be changed without deprecation warnings, when new features make this necessary. } \seealso{ \code{\link{brm}}, \code{\link{brmsformula}}, \code{\link{mvbrmsformula}} } brms/man/brmsformula.Rd0000644000176200001440000010103713612573705014623 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsformula.R \name{brmsformula} \alias{brmsformula} \alias{bf} \title{Set up a model formula for use in \pkg{brms}} \usage{ brmsformula( formula, ..., flist = NULL, family = NULL, autocor = NULL, nl = NULL, loop = NULL, center = NULL, cmc = NULL, sparse = NULL, decomp = NULL ) } \arguments{ \item{formula}{An object of class \code{formula} (or one that can be coerced to that class): a symbolic description of the model to be fitted. The details of model specification are given in 'Details'.} \item{...}{Additional \code{formula} objects to specify predictors of non-linear and distributional parameters. Formulas can either be named directly or contain names on their left-hand side. Alternatively, it is possible to fix parameters to certain values by passing numbers or character strings in which case arguments have to be named to provide the parameter names. See 'Details' for more information.} \item{flist}{Optional list of formulas, which are treated in the same way as formulas passed via the \code{...} argument.} \item{family}{Same argument as in \code{\link{brm}}. If \code{family} is specified in \code{brmsformula}, it will overwrite the value specified in other functions.} \item{autocor}{An optional \code{formula} which contains autocorrelation terms as described in \code{\link{autocor-terms}} or alternatively a \code{\link{cor_brms}} object (deprecated). If \code{autocor} is specified in \code{brmsformula}, it will overwrite the value specified in other functions.} \item{nl}{Logical; Indicates whether \code{formula} should be treated as specifying a non-linear model. By default, \code{formula} is treated as an ordinary linear model formula.} \item{loop}{Logical; Only used in non-linear models. Indicates if the computation of the non-linear formula should be done inside (\code{TRUE}) or outside (\code{FALSE}) a loop over observations. Defaults to \code{TRUE}.} \item{center}{Logical; Indicates if the population-level design matrix should be centered, which usually increases sampling efficiency. See the 'Details' section for more information. Defaults to \code{TRUE} for distributional parameters and to \code{FALSE} for non-linear parameters.} \item{cmc}{Logical; Indicates whether automatic cell-mean coding should be enabled when removing the intercept by adding \code{0} to the right-hand of model formulas. Defaults to \code{TRUE} to mirror the behavior of standard \R formula parsing.} \item{sparse}{Logical; indicates whether the population-level design matrices should be treated as sparse (defaults to \code{FALSE}). For design matrices with many zeros, this can considerably reduce required memory. Sampling speed is currently not improved or even slightly decreased.} \item{decomp}{Optional name of the decomposition used for the population-level design matrix. Defaults to \code{NULL} that is no decomposition. Other options currently available are \code{"QR"} for the QR decomposition that helps in fitting models with highly correlated predictors.} } \value{ An object of class \code{brmsformula}, which is essentially a \code{list} containing all model formulas as well as some additional information. } \description{ Set up a model formula for use in the \pkg{brms} package allowing to define (potentially non-linear) additive multilevel models for all parameters of the assumed response distribution. } \details{ \bold{General formula structure} The \code{formula} argument accepts formulas of the following syntax: \code{response | aterms ~ pterms + (gterms | group)} The \code{pterms} part contains effects that are assumed to be the same across observations. We call them 'population-level' effects or (adopting frequentist vocabulary) 'fixed' effects. The optional \code{gterms} part may contain effects that are assumed to vary across grouping variables specified in \code{group}. We call them 'group-level' effects or (adopting frequentist vocabulary) 'random' effects, although the latter name is misleading in a Bayesian context. For more details type \code{vignette("brms_overview")} and \code{vignette("brms_multilevel")}. \bold{Group-level terms} Multiple grouping factors each with multiple group-level effects are possible. (Of course we can also run models without any group-level effects.) Instead of \code{|} you may use \code{||} in grouping terms to prevent correlations from being modeled. Alternatively, it is possible to model different group-level terms of the same grouping factor as correlated (even across different formulas, e.g., in non-linear models) by using \code{||} instead of \code{|}. All group-level terms sharing the same ID will be modeled as correlated. If, for instance, one specifies the terms \code{(1+x|2|g)} and \code{(1+z|2|g)} somewhere in the formulas passed to \code{brmsformula}, correlations between the corresponding group-level effects will be estimated. If levels of the grouping factor belong to different sub-populations, it may be reasonable to assume a different covariance matrix for each of the sub-populations. For instance, the variation within the treatment group and within the control group in a randomized control trial might differ. Suppose that \code{y} is the outcome, and \code{x} is the factor indicating the treatment and control group. Then, we could estimate different hyper-parameters of the varying effects (in this case a varying intercept) for treatment and control group via \code{y ~ x + (1 | gr(subject, by = x))}. You can specify multi-membership terms using the \code{\link{mm}} function. For instance, a multi-membership term with two members could be \code{(1 | mm(g1, g2))}, where \code{g1} and \code{g2} specify the first and second member, respectively. Moreover, if a covariate \code{x} varies across the levels of the grouping-factors \code{g1} and \code{g2}, we can save the respective covariate values in the variables \code{x1} and \code{x2} and then model the varying effect as \code{(1 + mmc(x1, x2) | mm(g1, g2))}. \bold{Special predictor terms} Smoothing terms can modeled using the \code{\link{s}} and \code{\link{t2}} functions in the \code{pterms} part of the model formula. This allows to fit generalized additive mixed models (GAMMs) with \pkg{brms}. The implementation is similar to that used in the \pkg{gamm4} package. For more details on this model class see \code{\link[mgcv:gam]{gam}} and \code{\link[mgcv:gamm]{gamm}}. Gaussian process terms can be fitted using the \code{\link{gp}} function in the \code{pterms} part of the model formula. Similar to smooth terms, Gaussian processes can be used to model complex non-linear relationships, for instance temporal or spatial autocorrelation. However, they are computationally demanding and are thus not recommended for very large datasets. The \code{pterms} and \code{gterms} parts may contain four non-standard effect types namely monotonic, measurement error, missing value, and category specific effects, which can be specified using terms of the form \code{mo(predictor)}, \code{me(predictor, sd_predictor)}, \code{mi(predictor)}, and \code{cs()}, respectively. Category specific effects can only be estimated in ordinal models and are explained in more detail in the package's main vignette (type \code{vignette("brms_overview")}). The other three effect types are explained in the following. A monotonic predictor must either be integer valued or an ordered factor, which is the first difference to an ordinary continuous predictor. More importantly, predictor categories (or integers) are not assumed to be equidistant with respect to their effect on the response variable. Instead, the distance between adjacent predictor categories (or integers) is estimated from the data and may vary across categories. This is realized by parameterizing as follows: One parameter takes care of the direction and size of the effect similar to an ordinary regression parameter, while an additional parameter vector estimates the normalized distances between consecutive predictor categories. A main application of monotonic effects are ordinal predictors that can this way be modeled without (falsely) treating them as continuous or as unordered categorical predictors. For more details and examples see \code{vignette("brms_monotonic")}. Quite often, predictors are measured and as such naturally contain measurement error. Although most researchers are well aware of this problem, measurement error in predictors is ignored in most regression analyses, possibly because only few packages allow for modeling it. Notably, measurement error can be handled in structural equation models, but many more general regression models (such as those featured by \pkg{brms}) cannot be transferred to the SEM framework. In \pkg{brms}, effects of noise-free predictors can be modeled using the \code{me} (for 'measurement error') function. If, say, \code{y} is the response variable and \code{x} is a measured predictor with known measurement error \code{sdx}, we can simply include it on the right-hand side of the model formula via \code{y ~ me(x, sdx)}. This can easily be extended to more general formulas. If \code{x2} is another measured predictor with corresponding error \code{sdx2} and \code{z} is a predictor without error (e.g., an experimental setting), we can model all main effects and interactions of the three predictors in the well known manner: \code{y ~ me(x, sdx) * me(x2, sdx2) * z}. In future version of \pkg{brms}, a vignette will be added to explain more details about these so called 'error-in-variables' models and provide real world examples. When a variable contains missing values, the corresponding rows will be excluded from the data by default (row-wise exclusion). However, quite often we want to keep these rows and instead estimate the missing values. There are two approaches for this: (a) Impute missing values before the model fitting for instance via multiple imputation (see \code{\link{brm_multiple}} for a way to handle multiple imputed datasets). (b) Impute missing values on the fly during model fitting. The latter approach is explained in the following. Using a variable with missing values as predictors requires two things, First, we need to specify that the predictor contains missings that should to be imputed. If, say, \code{y} is the primary response, \code{x} is a predictor with missings and \code{z} is a predictor without missings, we go for \code{y ~ mi(x) + z}. Second, we need to model \code{x} as an additional response with corresponding predictors and the addition term \code{mi()}. In our example, we could write \code{x | mi() ~ z}. See \code{\link{mi}} for examples with real data. \bold{Autocorrelation terms} Autocorrelation terms can be directly specified inside the formula as well. Details can be found in \code{\link{autocor-terms}}. \bold{Additional response information} Another special of the \pkg{brms} formula syntax is the optional \code{aterms} part, which may contain multiple terms of the form \code{fun()} separated by \code{+} each providing special information on the response variable. \code{fun} can be replaced with either \code{se}, \code{weights}, \code{subset}, \code{cens}, \code{trunc}, \code{trials}, \code{cat}, \code{dec}, \code{rate}, \code{vreal}, or \code{vint}. Their meanings are explained below. (see also \code{\link{addition-terms}}). For families \code{gaussian}, \code{student} and \code{skew_normal}, it is possible to specify standard errors of the observations, thus allowing to perform meta-analysis. Suppose that the variable \code{yi} contains the effect sizes from the studies and \code{sei} the corresponding standard errors. Then, fixed and random effects meta-analyses can be conducted using the formulas \code{yi | se(sei) ~ 1} and \code{yi | se(sei) ~ 1 + (1|study)}, respectively, where \code{study} is a variable uniquely identifying every study. If desired, meta-regression can be performed via \code{yi | se(sei) ~ 1 + mod1 + mod2 + (1|study)} or \cr \code{yi | se(sei) ~ 1 + mod1 + mod2 + (1 + mod1 + mod2|study)}, where \code{mod1} and \code{mod2} represent moderator variables. By default, the standard errors replace the parameter \code{sigma}. To model \code{sigma} in addition to the known standard errors, set argument \code{sigma} in function \code{se} to \code{TRUE}, for instance, \code{yi | se(sei, sigma = TRUE) ~ 1}. For all families, weighted regression may be performed using \code{weights} in the \code{aterms} part. Internally, this is implemented by multiplying the log-posterior values of each observation by their corresponding weights. Suppose that variable \code{wei} contains the weights and that \code{yi} is the response variable. Then, formula \code{yi | weights(wei) ~ predictors} implements a weighted regression. For multivariate models, \code{subset} may be used in the \code{aterms} part, to use different subsets of the data in different univariate models. For instance, if \code{sub} is a logical variable and \code{y} is the response of one of the univariate models, we may write \code{y | subset(sub) ~ predictors} so that \code{y} is predicted only for those observations for which \code{sub} evaluates to \code{TRUE}. For log-linear models such as poisson models, \code{rate} may be used in the \code{aterms} part to specify the denomintor of a response that is expressed as a rate. The numerator is given by the actual response variable and has a distribution according to the family as usual. Using \code{rate(denom)} is equivalent to adding \code{offset(log(denom))} to the linear predictor of the main parameter but the former is arguably more convenient and explicit. With the exception of categorical, ordinal, and mixture families, left, right, and interval censoring can be modeled through \code{y | cens(censored) ~ predictors}. The censoring variable (named \code{censored} in this example) should contain the values \code{'left'}, \code{'none'}, \code{'right'}, and \code{'interval'} (or equivalently \code{-1}, \code{0}, \code{1}, and \code{2}) to indicate that the corresponding observation is left censored, not censored, right censored, or interval censored. For interval censored data, a second variable (let's call it \code{y2}) has to be passed to \code{cens}. In this case, the formula has the structure \code{y | cens(censored, y2) ~ predictors}. While the lower bounds are given in \code{y}, the upper bounds are given in \code{y2} for interval censored data. Intervals are assumed to be open on the left and closed on the right: \code{(y, y2]}. With the exception of categorical, ordinal, and mixture families, the response distribution can be truncated using the \code{trunc} function in the addition part. If the response variable is truncated between, say, 0 and 100, we can specify this via \code{yi | trunc(lb = 0, ub = 100) ~ predictors}. Instead of numbers, variables in the data set can also be passed allowing for varying truncation points across observations. Defining only one of the two arguments in \code{trunc} leads to one-sided truncation. For all continuous families, missing values in the responses can be imputed within Stan by using the addition term \code{mi}. This is mostly useful in combination with \code{mi} predictor terms as explained above under 'Special predictor terms'. For families \code{binomial} and \code{zero_inflated_binomial}, addition should contain a variable indicating the number of trials underlying each observation. In \code{lme4} syntax, we may write for instance \code{cbind(success, n - success)}, which is equivalent to \code{success | trials(n)} in \pkg{brms} syntax. If the number of trials is constant across all observations, say \code{10}, we may also write \code{success | trials(10)}. \bold{Please note that the \code{cbind()} syntax will not work in \pkg{brms} in the expected way because this syntax is reserved for other purposes.} For all ordinal families, \code{aterms} may contain a term \code{thres(number)} to specify the number thresholds (e.g, \code{thres(6)}), which should be equal to the total number of response categories - 1. If not given, the number of thresholds is calculated from the data. If different threshold vectors should be used for different subsets of the data, the \code{gr} argument can be used to provide the grouping variable (e.g, \code{thres(6, gr = item)}, if \code{item} is the grouping variable). In this case, the number of thresholds can also be a variable in the data with different values per group. A deprecated quasi alias of \code{thres()} is \code{cat()} with which the total number of response categories (i.e., number of thresholds + 1) can be specified. In Wiener diffusion models (family \code{wiener}) the addition term \code{dec} is mandatory to specify the (vector of) binary decisions corresponding to the reaction times. Non-zero values will be treated as a response on the upper boundary of the diffusion process and zeros will be treated as a response on the lower boundary. Alternatively, the variable passed to \code{dec} might also be a character vector consisting of \code{'lower'} and \code{'upper'}. For custom families, it is possible to pass an abitrary number of real and integer vectors via the addition terms \code{vreal} and \code{vint}, respectively. An example is provided in \code{vignette('brms_customfamilies')}. Multiple addition terms may be specified at the same time using the \code{+} operator. For example, the formula \code{formula = yi | se(sei) + cens(censored) ~ 1} implies a censored meta-analytic model. The addition argument \code{disp} (short for dispersion) has been removed in version 2.0. You may instead use the distributional regression approach by specifying \code{sigma ~ 1 + offset(log(xdisp))} or \code{shape ~ 1 + offset(log(xdisp))}, where \code{xdisp} is the variable being previously passed to \code{disp}. \bold{Parameterization of the population-level intercept} By default, the population-level intercept (if incorporated) is estimated separately and not as part of population-level parameter vector \code{b} As a result, priors on the intercept also have to be specified separately. Furthermore, to increase sampling efficiency, the population-level design matrix \code{X} is centered around its column means \code{X_means} if the intercept is incorporated. This leads to a temporary bias in the intercept equal to \code{}, where \code{<,>} is the scalar product. The bias is corrected after fitting the model, but be aware that you are effectively defining a prior on the intercept of the centered design matrix not on the real intercept. You can turn off this special handling of the intercept by setting argument \code{center} to \code{FALSE}. For more details on setting priors on population-level intercepts, see \code{\link{set_prior}}. This behavior can be avoided by using the reserved (and internally generated) variable \code{Intercept}. Instead of \code{y ~ x}, you may write \code{y ~ 0 + Intercept + x}. This way, priors can be defined on the real intercept, directly. In addition, the intercept is just treated as an ordinary population-level effect and thus priors defined on \code{b} will also apply to it. Note that this parameterization may be less efficient than the default parameterization discussed above. \bold{Formula syntax for non-linear models} In \pkg{brms}, it is possible to specify non-linear models of arbitrary complexity. The non-linear model can just be specified within the \code{formula} argument. Suppose, that we want to predict the response \code{y} through the predictor \code{x}, where \code{x} is linked to \code{y} through \code{y = alpha - beta * lambda^x}, with parameters \code{alpha}, \code{beta}, and \code{lambda}. This is certainly a non-linear model being defined via \code{formula = y ~ alpha - beta * lambda^x} (addition arguments can be added in the same way as for ordinary formulas). To tell \pkg{brms} that this is a non-linear model, we set argument \code{nl} to \code{TRUE}. Now we have to specify a model for each of the non-linear parameters. Let's say we just want to estimate those three parameters with no further covariates or random effects. Then we can pass \code{alpha + beta + lambda ~ 1} or equivalently (and more flexible) \code{alpha ~ 1, beta ~ 1, lambda ~ 1} to the \code{...} argument. This can, of course, be extended. If we have another predictor \code{z} and observations nested within the grouping factor \code{g}, we may write for instance \code{alpha ~ 1, beta ~ 1 + z + (1|g), lambda ~ 1}. The formula syntax described above applies here as well. In this example, we are using \code{z} and \code{g} only for the prediction of \code{beta}, but we might also use them for the other non-linear parameters (provided that the resulting model is still scientifically reasonable). By default, non-linear covariates are treated as real vectors in Stan. However, if the data of the covariates is of type `integer` in \R (which can be enforced by the `as.integer` function), the Stan type will be changed to an integer array. That way, covariates can also be used for indexing purposes in Stan. Non-linear models may not be uniquely identified and / or show bad convergence. For this reason it is mandatory to specify priors on the non-linear parameters. For instructions on how to do that, see \code{\link{set_prior}}. For some examples of non-linear models, see \code{vignette("brms_nonlinear")}. \bold{Formula syntax for predicting distributional parameters} It is also possible to predict parameters of the response distribution such as the residual standard deviation \code{sigma} in gaussian models or the hurdle probability \code{hu} in hurdle models. The syntax closely resembles that of a non-linear parameter, for instance \code{sigma ~ x + s(z) + (1+x|g)}. For some examples of distributional models, see \code{vignette("brms_distreg")}. Parameter \code{mu} exists for every family and can be used as an alternative to specifying terms in \code{formula}. If both \code{mu} and \code{formula} are given, the right-hand side of \code{formula} is ignored. Accordingly, specifying terms on the right-hand side of both \code{formula} and \code{mu} at the same time is deprecated. In future versions, \code{formula} might be updated by \code{mu}. The following are distributional parameters of specific families (all other parameters are treated as non-linear parameters): \code{sigma} (residual standard deviation or scale of the \code{gaussian}, \code{student}, \code{skew_normal}, \code{lognormal} \code{exgaussian}, and \code{asym_laplace} families); \code{shape} (shape parameter of the \code{Gamma}, \code{weibull}, \code{negbinomial}, and related zero-inflated / hurdle families); \code{nu} (degrees of freedom parameter of the \code{student} and \code{frechet} families); \code{phi} (precision parameter of the \code{beta} and \code{zero_inflated_beta} families); \code{kappa} (precision parameter of the \code{von_mises} family); \code{beta} (mean parameter of the exponential component of the \code{exgaussian} family); \code{quantile} (quantile parameter of the \code{asym_laplace} family); \code{zi} (zero-inflation probability); \code{hu} (hurdle probability); \code{zoi} (zero-one-inflation probability); \code{coi} (conditional one-inflation probability); \code{disc} (discrimination) for ordinal models; \code{bs}, \code{ndt}, and \code{bias} (boundary separation, non-decision time, and initial bias of the \code{wiener} diffusion model). By default, distributional parameters are modeled on the log scale if they can be positive only or on the logit scale if the can only be within the unit interval. Alternatively, one may fix distributional parameters to certain values. However, this is mainly useful when models become too complicated and otherwise have convergence issues. We thus suggest to be generally careful when making use of this option. The \code{quantile} parameter of the \code{asym_laplace} distribution is a good example where it is useful. By fixing \code{quantile}, one can perform quantile regression for the specified quantile. For instance, \code{quantile = 0.25} allows predicting the 25\%-quantile. Furthermore, the \code{bias} parameter in drift-diffusion models, is assumed to be \code{0.5} (i.e. no bias) in many applications. To achieve this, simply write \code{bias = 0.5}. Other possible applications are the Cauchy distribution as a special case of the Student-t distribution with \code{nu = 1}, or the geometric distribution as a special case of the negative binomial distribution with \code{shape = 1}. Furthermore, the parameter \code{disc} ('discrimination') in ordinal models is fixed to \code{1} by default and not estimated, but may be modeled as any other distributional parameter if desired (see examples). For reasons of identification, \code{'disc'} can only be positive, which is achieved by applying the log-link. In categorical models, distributional parameters do not have fixed names. Instead, they are named after the response categories (excluding the first one, which serves as the reference category), with the prefix \code{'mu'}. If, for instance, categories are named \code{cat1}, \code{cat2}, and \code{cat3}, the distributional parameters will be named \code{mucat2} and \code{mucat3}. Some distributional parameters currently supported by \code{brmsformula} have to be positive (a negative standard deviation or precision parameter does not make any sense) or are bounded between 0 and 1 (for zero-inflated / hurdle probabilities, quantiles, or the initial bias parameter of drift-diffusion models). However, linear predictors can be positive or negative, and thus the log link (for positive parameters) or logit link (for probability parameters) are used by default to ensure that distributional parameters are within their valid intervals. This implies that, by default, effects for such distributional parameters are estimated on the log / logit scale and one has to apply the inverse link function to get to the effects on the original scale. Alternatively, it is possible to use the identity link to predict parameters on their original scale, directly. However, this is much more likely to lead to problems in the model fitting, if the parameter actually has a restricted range. See also \code{\link{brmsfamily}} for an overview of valid link functions. \bold{Formula syntax for mixture models} The specification of mixture models closely resembles that of non-mixture models. If not specified otherwise (see below), all mean parameters of the mixture components are predicted using the right-hand side of \code{formula}. All types of predictor terms allowed in non-mixture models are allowed in mixture models as well. Distributional parameters of mixture distributions have the same name as those of the corresponding ordinary distributions, but with a number at the end to indicate the mixture component. For instance, if you use family \code{mixture(gaussian, gaussian)}, the distributional parameters are \code{sigma1} and \code{sigma2}. Distributional parameters of the same class can be fixed to the same value. For the above example, we could write \code{sigma2 = "sigma1"} to make sure that both components have the same residual standard deviation, which is in turn estimated from the data. In addition, there are two types of special distributional parameters. The first are named \code{mu}, that allow for modeling different predictors for the mean parameters of different mixture components. For instance, if you want to predict the mean of the first component using predictor \code{x} and the mean of the second component using predictor \code{z}, you can write \code{mu1 ~ x} as well as \code{mu2 ~ z}. The second are named \code{theta}, which constitute the mixing proportions. If the mixing proportions are fixed to certain values, they are internally normalized to form a probability vector. If one seeks to predict the mixing proportions, all but one of the them has to be predicted, while the remaining one is used as the reference category to identify the model. The \code{softmax} function is applied on the linear predictor terms to form a probability vector. For more information on mixture models, see the documentation of \code{\link{mixture}}. \bold{Formula syntax for multivariate models} Multivariate models may be specified using \code{mvbind} notation or with help of the \code{\link{mvbf}} function. Suppose that \code{y1} and \code{y2} are response variables and \code{x} is a predictor. Then \code{mvbind(y1, y2) ~ x} specifies a multivariate model. The effects of all terms specified at the RHS of the formula are assumed to vary across response variables. For instance, two parameters will be estimated for \code{x}, one for the effect on \code{y1} and another for the effect on \code{y2}. This is also true for group-level effects. When writing, for instance, \code{mvbind(y1, y2) ~ x + (1+x|g)}, group-level effects will be estimated separately for each response. To model these effects as correlated across responses, use the ID syntax (see above). For the present example, this would look as follows: \code{mvbind(y1, y2) ~ x + (1+x|2|g)}. Of course, you could also use any value other than \code{2} as ID. It is also possible to specify different formulas for different responses. If, for instance, \code{y1} should be predicted by \code{x} and \code{y2} should be predicted by \code{z}, we could write \code{mvbf(y1 ~ x, y2 ~ z)}. Alternatively, multiple \code{brmsformula} objects can be added to specify a joint multivariate model (see 'Examples'). } \examples{ # multilevel model with smoothing terms brmsformula(y ~ x1*x2 + s(z) + (1+x1|1) + (1|g2)) # additionally predict 'sigma' brmsformula(y ~ x1*x2 + s(z) + (1+x1|1) + (1|g2), sigma ~ x1 + (1|g2)) # use the shorter alias 'bf' (formula1 <- brmsformula(y ~ x + (x|g))) (formula2 <- bf(y ~ x + (x|g))) # will be TRUE identical(formula1, formula2) # incorporate censoring bf(y | cens(censor_variable) ~ predictors) # define a simple non-linear model bf(y ~ a1 - a2^x, a1 + a2 ~ 1, nl = TRUE) # predict a1 and a2 differently bf(y ~ a1 - a2^x, a1 ~ 1, a2 ~ x + (x|g), nl = TRUE) # correlated group-level effects across parameters bf(y ~ a1 - a2^x, a1 ~ 1 + (1|2|g), a2 ~ x + (x|2|g), nl = TRUE) # define a multivariate model bf(mvbind(y1, y2) ~ x * z + (1|g)) # define a zero-inflated model # also predicting the zero-inflation part bf(y ~ x * z + (1+x|ID1|g), zi ~ x + (1|ID1|g)) # specify a predictor as monotonic bf(y ~ mo(x) + more_predictors) # for ordinal models only # specify a predictor as category specific bf(y ~ cs(x) + more_predictors) # add a category specific group-level intercept bf(y ~ cs(x) + (cs(1)|g)) # specify parameter 'disc' bf(y ~ person + item, disc ~ item) # specify variables containing measurement error bf(y ~ me(x, sdx)) # specify predictors on all parameters of the wiener diffusion model # the main formula models the drift rate 'delta' bf(rt | dec(decision) ~ x, bs ~ x, ndt ~ x, bias ~ x) # fix the bias parameter to 0.5 bf(rt | dec(decision) ~ x, bias = 0.5) # specify different predictors for different mixture components mix <- mixture(gaussian, gaussian) bf(y ~ 1, mu1 ~ x, mu2 ~ z, family = mix) # fix both residual standard deviations to the same value bf(y ~ x, sigma2 = "sigma1", family = mix) # use the '+' operator to specify models bf(y ~ 1) + nlf(sigma ~ a * exp(b * x), a ~ x) + lf(b ~ z + (1|g), dpar = "sigma") + gaussian() # specify a multivariate model using the '+' operator bf(y1 ~ x + (1|g)) + gaussian() + cor_ar(~1|g) + bf(y2 ~ z) + poisson() # model missing values in predictors bf(bmi ~ age * mi(chl)) + bf(chl | mi() ~ age) + set_rescor(FALSE) # model sigma as a function of the mean bf(y ~ eta, nl = TRUE) + lf(eta ~ 1 + x) + nlf(sigma ~ tau * sqrt(eta)) + lf(tau ~ 1) } \seealso{ \code{\link{mvbrmsformula}}, \code{\link{brmsformula-helpers}} } brms/man/brm.Rd0000644000176200001440000004344313611651306013051 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brm.R \name{brm} \alias{brm} \title{Fit Bayesian Generalized (Non-)Linear Multivariate Multilevel Models} \usage{ brm( formula, data, family = gaussian(), prior = NULL, autocor = NULL, data2 = NULL, cov_ranef = NULL, sample_prior = c("no", "yes", "only"), sparse = NULL, knots = NULL, stanvars = NULL, stan_funs = NULL, fit = NA, save_ranef = TRUE, save_mevars = FALSE, save_all_pars = FALSE, inits = "random", chains = 4, iter = 2000, warmup = floor(iter/2), thin = 1, cores = getOption("mc.cores", 1L), control = NULL, algorithm = c("sampling", "meanfield", "fullrank"), future = getOption("future", FALSE), silent = TRUE, seed = NA, save_model = NULL, stan_model_args = list(), save_dso = TRUE, file = NULL, ... ) } \arguments{ \item{formula}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in \code{\link{brmsformula}}.} \item{data}{An object of class \code{data.frame} (or one that can be coerced to that class) containing data of all variables used in the model.} \item{family}{A description of the response distribution and link function to be used in the model. This can be a family function, a call to a family function or a character string naming the family. Every family function has a \code{link} argument allowing to specify the link function to be applied on the response variable. If not specified, default links are used. For details of supported families see \code{\link{brmsfamily}}. By default, a linear \code{gaussian} model is applied. In multivariate models, \code{family} might also be a list of families.} \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the \code{c} method or the \code{+} operator. See also \code{\link{get_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object describing the correlation structure within the response variable (i.e., the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for a description of the available correlation structures. Defaults to \code{NULL}, corresponding to no correlations. In multivariate models, \code{autocor} might also be a list of autocorrelation structures. It is now recommend to specify autocorrelation terms directly within \code{formula}. See \code{\link{brmsformula}} for more details.} \item{data2}{A named \code{list} of objects containing data, which cannot be passed via argument \code{data}. Required for some objects used in autocorrelation structures to specify dependency structures.} \item{cov_ranef}{A list of matrices that are proportional to the (within) covariance structure of the group-level effects. The names of the matrices should correspond to columns in \code{data} that are used as grouping factors. All levels of the grouping factor should appear as rownames of the corresponding matrix. This argument can be used, among others to model pedigrees and phylogenetic effects. See \code{vignette("brms_phylogenetics")} for more details.} \item{sample_prior}{Indicate if samples from priors should be drawn additionally to the posterior samples (defaults to \code{"no"}). Among others, these samples can be used to calculate Bayes factors for point hypotheses via \code{\link{hypothesis}}. Please note that improper priors are not sampled, including the default improper priors used by \code{brm}. See \code{\link{set_prior}} on how to set (proper) priors. Please also note that prior samples for the overall intercept are not obtained by default for technical reasons. See \code{\link{brmsformula}} how to obtain prior samples for the intercept. If \code{sample_prior} is set to \code{"only"}, samples are drawn solely from the priors ignoring the likelihood, which allows among others to generate samples from the prior predictive distribution. In this case, all parameters must have proper priors.} \item{sparse}{(Deprecated) Logical; indicates whether the population-level design matrices should be treated as sparse (defaults to \code{FALSE}). For design matrices with many zeros, this can considerably reduce required memory. Sampling speed is currently not improved or even slightly decreased. It is now recommended to use the \code{sparse} argument of \code{\link{brmsformula}} and related functions.} \item{knots}{Optional list containing user specified knot values to be used for basis construction of smoothing terms. See \code{\link[mgcv:gamm]{gamm}} for more details.} \item{stanvars}{An optional \code{stanvars} object generated by function \code{\link{stanvar}} to define additional variables for use in \pkg{Stan}'s program blocks.} \item{stan_funs}{(Deprecated) An optional character string containing self-defined \pkg{Stan} functions, which will be included in the functions block of the generated \pkg{Stan} code. It is now recommended to use the \code{stanvars} argument for this purpose, instead.} \item{fit}{An instance of S3 class \code{brmsfit} derived from a previous fit; defaults to \code{NA}. If \code{fit} is of class \code{brmsfit}, the compiled model associated with the fitted result is re-used and all arguments modifying the model code or data are ignored. It is not recommended to use this argument directly, but to call the \code{\link[brms:update.brmsfit]{update}} method, instead.} \item{save_ranef}{A flag to indicate if group-level effects for each level of the grouping factor(s) should be saved (default is \code{TRUE}). Set to \code{FALSE} to save memory. The argument has no impact on the model fitting itself.} \item{save_mevars}{A flag to indicate if samples of latent noise-free variables obtained by using \code{me} and \code{mi} terms should be saved (default is \code{FALSE}). Saving these samples allows to better use methods such as \code{predict} with the latent variables but leads to very large \R objects even for models of moderate size and complexity.} \item{save_all_pars}{A flag to indicate if samples from all variables defined in Stan's \code{parameters} block should be saved (default is \code{FALSE}). Saving these samples is required in order to apply the methods \code{bridge_sampler}, \code{bayes_factor}, and \code{post_prob}.} \item{inits}{Either \code{"random"} or \code{"0"}. If inits is \code{"random"} (the default), Stan will randomly generate initial values for parameters. If it is \code{"0"}, all parameters are initialized to zero. This option is sometimes useful for certain families, as it happens that default (\code{"random"}) inits cause samples to be essentially constant. Generally, setting \code{inits = "0"} is worth a try, if chains do not behave well. Alternatively, \code{inits} can be a list of lists containing the initial values, or a function (or function name) generating initial values. The latter options are mainly implemented for internal testing.} \item{chains}{Number of Markov chains (defaults to 4).} \item{iter}{Number of total iterations per chain (including warmup; defaults to 2000).} \item{warmup}{A positive integer specifying number of warmup (aka burnin) iterations. This also specifies the number of iterations used for stepsize adaptation, so warmup samples should not be used for inference. The number of warmup should not be larger than \code{iter} and the default is \code{iter/2}.} \item{thin}{Thinning rate. Must be a positive integer. Set \code{thin > 1} to save memory and computation time if \code{iter} is large.} \item{cores}{Number of cores to use when executing the chains in parallel, which defaults to 1 but we recommend setting the \code{mc.cores} option to be as many processors as the hardware and RAM allow (up to the number of chains). For non-Windows OS in non-interactive \R sessions, forking is used instead of PSOCK clusters.} \item{control}{A named \code{list} of parameters to control the sampler's behavior. It defaults to \code{NULL} so all the default values are used. The most important control parameters are discussed in the 'Details' section below. For a comprehensive overview see \code{\link[rstan:stan]{stan}}.} \item{algorithm}{Character string indicating the estimation approach to use. Can be \code{"sampling"} for MCMC (the default), \code{"meanfield"} for variational inference with independent normal distributions, or \code{"fullrank"} for variational inference with a multivariate normal distribution.} \item{future}{Logical; If \code{TRUE}, the \pkg{\link[future:future]{future}} package is used for parallel execution of the chains and argument \code{cores} will be ignored. Can be set globally for the current \R session via the \code{future} option. The execution type is controlled via \code{\link[future:plan]{plan}} (see the examples section below).} \item{silent}{logical; If \code{TRUE} (the default), most of the informational messages of compiler and sampler are suppressed. The actual sampling progress is still printed. Set \code{refresh = 0} to turn this off as well. To stop Stan from opening additional progress bars, set \code{open_progress = FALSE}.} \item{seed}{The seed for random number generation to make results reproducible. If \code{NA} (the default), \pkg{Stan} will set the seed randomly.} \item{save_model}{Either \code{NULL} or a character string. In the latter case, the model's Stan code is saved via \code{\link{cat}} in a text file named after the string supplied in \code{save_model}.} \item{stan_model_args}{A \code{list} of further arguments passed to \code{\link[rstan:stan_model]{stan_model}}.} \item{save_dso}{Logical, defaulting to \code{TRUE}, indicating whether the dynamic shared object (DSO) compiled from the C++ code for the model will be saved or not. If \code{TRUE}, we can draw samples from the same model in another \R session using the saved DSO (i.e., without compiling the C++ code again).} \item{file}{Either \code{NULL} or a character string. In the latter case, the fitted model object is saved via \code{\link{saveRDS}} in a file named after the string supplied in \code{file}. The \code{.rds} extension is added automatically. If the file already exists, \code{brm} will load and return the saved model object instead of refitting the model. As existing files won't be overwritten, you have to manually remove the file in order to refit and save the model under an existing file name. The file name is stored in the \code{brmsfit} object for later usage.} \item{...}{Further arguments passed to Stan that is to \code{\link[rstan:sampling]{sampling}} or \code{\link[rstan:vb]{vb}}.} } \value{ An object of class \code{brmsfit}, which contains the posterior samples along with many other useful information about the model. Use \code{methods(class = "brmsfit")} for an overview on available methods. } \description{ Fit Bayesian generalized (non-)linear multivariate multilevel models using Stan for full Bayesian inference. A wide range of distributions and link functions are supported, allowing users to fit -- among others -- linear, robust linear, count data, survival, response times, ordinal, zero-inflated, hurdle, and even self-defined mixture models all in a multilevel context. Further modeling options include non-linear and smooth terms, auto-correlation structures, censored data, meta-analytic standard errors, and quite a few more. In addition, all parameters of the response distributions can be predicted in order to perform distributional regression. Prior specifications are flexible and explicitly encourage users to apply prior distributions that actually reflect their beliefs. In addition, model fit can easily be assessed and compared with posterior predictive checks and leave-one-out cross-validation. } \details{ Fit a generalized (non-)linear multivariate multilevel model via full Bayesian inference using Stan. A general overview is provided in the vignettes \code{vignette("brms_overview")} and \code{vignette("brms_multilevel")}. For a full list of available vignettes see \code{vignette(package = "brms")}. \bold{Formula syntax of brms models} Details of the formula syntax applied in \pkg{brms} can be found in \code{\link{brmsformula}}. \bold{Families and link functions} Details of families supported by \pkg{brms} can be found in \code{\link{brmsfamily}}. \bold{Prior distributions} Priors should be specified using the \code{\link[brms:set_prior]{set_prior}} function. Its documentation contains detailed information on how to correctly specify priors. To find out on which parameters or parameter classes priors can be defined, use \code{\link[brms:get_prior]{get_prior}}. Default priors are chosen to be non or very weakly informative so that their influence on the results will be negligible and you usually don't have to worry about them. However, after getting more familiar with Bayesian statistics, I recommend you to start thinking about reasonable informative priors for your model parameters: Nearly always, there is at least some prior information available that can be used to improve your inference. \bold{Adjusting the sampling behavior of \pkg{Stan}} In addition to choosing the number of iterations, warmup samples, and chains, users can control the behavior of the NUTS sampler, by using the \code{control} argument. The most important reason to use \code{control} is to decrease (or eliminate at best) the number of divergent transitions that cause a bias in the obtained posterior samples. Whenever you see the warning "There were x divergent transitions after warmup." you should really think about increasing \code{adapt_delta}. To do this, write \code{control = list(adapt_delta = )}, where \code{} should usually be value between \code{0.8} (current default) and \code{1}. Increasing \code{adapt_delta} will slow down the sampler but will decrease the number of divergent transitions threatening the validity of your posterior samples. Another problem arises when the depth of the tree being evaluated in each iteration is exceeded. This is less common than having divergent transitions, but may also bias the posterior samples. When it happens, \pkg{Stan} will throw out a warning suggesting to increase \code{max_treedepth}, which can be accomplished by writing \code{control = list(max_treedepth = )} with a positive integer \code{} that should usually be larger than the current default of \code{10}. For more details on the \code{control} argument see \code{\link[rstan:stan]{stan}}. } \examples{ \dontrun{ # Poisson regression for the number of seizures in epileptic patients # using student_t priors for population-level effects # and half cauchy priors for standard deviations of group-level effects bprior1 <- prior(student_t(5,0,10), class = b) + prior(cauchy(0,2), class = sd) fit1 <- brm(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = poisson(), prior = bprior1) # generate a summary of the results summary(fit1) # plot the MCMC chains as well as the posterior distributions plot(fit1, ask = FALSE) # predict responses based on the fitted model head(predict(fit1)) # plot conditional effects for each predictor plot(conditional_effects(fit1), ask = FALSE) # investigate model fit loo(fit1) pp_check(fit1) # Ordinal regression modeling patient's rating of inhaler instructions # category specific effects are estimated for variable 'treat' fit2 <- brm(rating ~ period + carry + cs(treat), data = inhaler, family = sratio("logit"), prior = set_prior("normal(0,5)"), chains = 2) summary(fit2) plot(fit2, ask = FALSE) WAIC(fit2) # Survival regression modeling the time between the first # and second recurrence of an infection in kidney patients. fit3 <- brm(time | cens(censored) ~ age * sex + disease + (1|patient), data = kidney, family = lognormal()) summary(fit3) plot(fit3, ask = FALSE) plot(conditional_effects(fit3), ask = FALSE) # Probit regression using the binomial family ntrials <- sample(1:10, 100, TRUE) success <- rbinom(100, size = ntrials, prob = 0.4) x <- rnorm(100) data4 <- data.frame(ntrials, success, x) fit4 <- brm(success | trials(ntrials) ~ x, data = data4, family = binomial("probit")) summary(fit4) # Simple non-linear gaussian model x <- rnorm(100) y <- rnorm(100, mean = 2 - 1.5^x, sd = 1) data5 <- data.frame(x, y) bprior5 <- prior(normal(0, 2), nlpar = a1) + prior(normal(0, 2), nlpar = a2) fit5 <- brm(bf(y ~ a1 - a2^x, a1 + a2 ~ 1, nl = TRUE), data = data5, prior = bprior5) summary(fit5) plot(conditional_effects(fit5), ask = FALSE) # Normal model with heterogeneous variances data_het <- data.frame( y = c(rnorm(50), rnorm(50, 1, 2)), x = factor(rep(c("a", "b"), each = 50)) ) fit6 <- brm(bf(y ~ x, sigma ~ 0 + x), data = data_het) summary(fit6) plot(fit6) conditional_effects(fit6) # extract estimated residual SDs of both groups sigmas <- exp(posterior_samples(fit6, "^b_sigma_")) ggplot(stack(sigmas), aes(values)) + geom_density(aes(fill = ind)) # Quantile regression predicting the 25\%-quantile fit7 <- brm(bf(y ~ x, quantile = 0.25), data = data_het, family = asym_laplace()) summary(fit7) conditional_effects(fit7) # use the future package for more flexible parallelization library(future) plan(multiprocess) fit7 <- update(fit7, future = TRUE) } } \references{ Paul-Christian Buerkner (2017). brms: An R Package for Bayesian Multilevel Models Using Stan. \emph{Journal of Statistical Software}, 80(1), 1-28. \code{doi:10.18637/jss.v080.i01} Paul-Christian Buerkner (2018). Advanced Bayesian Multilevel Modeling with the R Package brms. \emph{The R Journal}. 10(1), 395–411. \code{doi:10.32614/RJ-2018-017} } \seealso{ \code{\link{brms}}, \code{\link{brmsformula}}, \code{\link{brmsfamily}}, \code{\link{brmsfit}} } \author{ Paul-Christian Buerkner \email{paul.buerkner@gmail.com} } brms/man/inhaler.Rd0000644000176200001440000000323613565500267013716 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets.R \docType{data} \name{inhaler} \alias{inhaler} \title{Clarity of inhaler instructions} \format{A data frame of 572 observations containing information on the following 5 variables. \describe{ \item{subject}{The subject number} \item{rating}{The rating of the inhaler instructions on a scale ranging from 1 to 4} \item{treat}{A contrast to indicate which of the two inhaler devices was used} \item{period}{A contrast to indicate the time of administration} \item{carry}{A contrast to indicate possible carry over effects} }} \source{ Ezzet, F., & Whitehead, J. (1991). A random effects model for ordinal responses from a crossover trial. \emph{Statistics in Medicine, 10(6)}, 901-907. } \usage{ inhaler } \description{ Ezzet and Whitehead (1991) analyze data from a two-treatment, two-period crossover trial to compare 2 inhalation devices for delivering the drug salbutamol in 286 asthma patients. Patients were asked to rate the clarity of leaflet instructions accompanying each device, using a 4-point ordinal scale. } \examples{ \dontrun{ ## ordinal regression with family "sratio" fit1 <- brm(rating ~ treat + period + carry, data = inhaler, family = sratio(), prior = set_prior("normal(0,5)")) summary(fit1) plot(fit1) ## ordinal regression with family "cumulative" ## and random intercept over subjects fit2 <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler, family = cumulative(), prior = set_prior("normal(0,5)")) summary(fit2) plot(fit2) } } \keyword{datasets} brms/man/brmsfit-class.Rd0000644000176200001440000000435213611651306015036 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-class.R \docType{class} \name{brmsfit-class} \alias{brmsfit-class} \alias{brmsfit} \title{Class \code{brmsfit} of models fitted with the \pkg{brms} package} \description{ Models fitted with the \code{\link[brms:brms]{brms}} package are represented as a \code{brmsfit} object, which contains the posterior samples, model formula, Stan code, relevant data, and other information. } \details{ See \code{methods(class = "brmsfit")} for an overview of available methods. } \section{Slots}{ \describe{ \item{\code{formula}}{A \code{\link{brmsformula}} object} \item{\code{family}}{(Deprecated) A \code{\link{brmsfamily}} object} \item{\code{data}}{A \code{data.frame} containing all variables used in the model} \item{\code{data.name}}{The name of \code{data} as specified by the user} \item{\code{data2}}{An optional \code{list} of data objects which cannot be passed via \code{data}} \item{\code{model}}{The model code in \pkg{Stan} language} \item{\code{prior}}{A \code{\link{brmsprior}} object containing information on the priors used in the model} \item{\code{autocor}}{(Deprecated) An \code{\link{cor_brms}} object containing the autocorrelation structure if specified} \item{\code{ranef}}{A \code{data.frame} containing the group-level structure} \item{\code{cov_ranef}}{A \code{list} of customized group-level covariance matrices} \item{\code{stanvars}}{A \code{\link{stanvars}} object or \code{NULL}} \item{\code{stan_funs}}{A character string of length one or \code{NULL}} \item{\code{criteria}}{An empty \code{list} for adding model fit criteria after estimation of the model.} \item{\code{fit}}{An object of class \code{\link[rstan:stanfit]{stanfit}} among others containing the posterior samples} \item{\code{exclude}}{The names of the parameters for which samples are not saved} \item{\code{algorithm}}{The name of the algorithm used to fit the model} \item{\code{version}}{The versions of \pkg{brms} and \pkg{rstan} with which the model was fitted} \item{\code{file}}{Optional name of a file in which the model object was stored in or loaded from} }} \seealso{ \code{\link{brms}}, \code{\link{brm}}, \code{\link{brmsformula}}, \code{\link{brmsfamily}} } brms/man/cor_fixed.Rd0000644000176200001440000000151613611651306014226 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_fixed} \alias{cor_fixed} \alias{cov_fixed} \title{(Deprecated) Fixed user-defined covariance matrices} \usage{ cor_fixed(V) } \arguments{ \item{V}{Known covariance matrix of the response variable. If a vector is passed, it will be used as diagonal entries (variances) and covariances will be set to zero.} } \value{ An object of class \code{cor_fixed}. } \description{ This function is deprecated. Please see \code{\link{fcor}} for the new syntax. Define a fixed covariance matrix of the response variable for instance to model multivariate effect sizes in meta-analysis. } \examples{ \dontrun{ dat <- data.frame(y = rnorm(3)) V <- cbind(c(0.5, 0.3, 0.2), c(0.3, 1, 0.1), c(0.2, 0.1, 0.2)) fit <- brm(y~1, data = dat, autocor = cor_fixed(V)) } } brms/man/gr.Rd0000644000176200001440000000254013606623217012676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-re.R \name{gr} \alias{gr} \title{Set up basic grouping terms in \pkg{brms}} \usage{ gr(..., by = NULL, dist = "gaussian") } \arguments{ \item{...}{One or more terms containing grouping factors.} \item{by}{An optional factor variable, specifying sub-populations of the groups. For each level of the \code{by} variable, a separate variance-covariance matrix will be fitted. Levels of the grouping factor must be nested in levels of the \code{by} variable.} \item{dist}{Name of the distribution of the group-level effects. Currently \code{"gaussian"} is the only option.} } \description{ Function used to set up a basic grouping term in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with grouping terms. \code{gr} is called implicitly inside the package and there is usually no need to call it directly. } \examples{ \dontrun{ # model using basic lme4-style formula fit1 <- brm(count ~ Trt + (1|patient), data = epilepsy) summary(fit1) # equivalent model using 'gr' which is called anyway internally fit2 <- brm(count ~ Trt + (1|gr(patient)), data = epilepsy) summary(fit2) # include Trt as a by variable fit3 <- brm(count ~ Trt + (1|gr(patient, by = Trt)), data = epilepsy) summary(fit3) } } \seealso{ \code{\link{brmsformula}} } brms/man/MultiNormal.Rd0000644000176200001440000000211113565500267014526 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{MultiNormal} \alias{MultiNormal} \alias{dmulti_normal} \alias{rmulti_normal} \title{The Multivariate Normal Distribution} \usage{ dmulti_normal(x, mu, Sigma, log = FALSE, check = FALSE) rmulti_normal(n, mu, Sigma, check = FALSE) } \arguments{ \item{x}{Vector or matrix of quantiles. If \code{x} is a matrix, each row is taken to be a quantile.} \item{mu}{Mean vector with length equal to the number of dimensions.} \item{Sigma}{Covariance matrix.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{check}{Logical; Indicates whether several input checks should be performed. Defaults to \code{FALSE} to improve efficiency.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density function and random generation for the multivariate normal distribution with mean vector \code{mu} and covariance matrix \code{Sigma}. } \details{ See the Stan user's manual \url{http://mc-stan.org/documentation/} for details on the parameterization } brms/man/standata.brmsfit.Rd0000644000176200001440000000346513611651307015536 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/make_standata.R \name{standata.brmsfit} \alias{standata.brmsfit} \alias{standata} \title{Extract data passed to Stan} \usage{ \method{standata}{brmsfit}( object, newdata = NULL, re_formula = NULL, newdata2 = NULL, new_objects = NULL, incl_autocor = TRUE, internal = FALSE, control = list(), ... ) standata(object, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{newdata2}{A named \code{list} of objects containing new data, which cannot be passed via argument \code{newdata}. Required for some objects used in autocorrelation structures, or \code{\link{stanvars}}.} \item{new_objects}{Deprecated alias of \code{newdata2}.} \item{incl_autocor}{A flag indicating if correlation structures originally specified via \code{autocor} should be included in the predictions. Defaults to \code{TRUE}.} \item{internal}{Logical, indicates if the data should be prepared for internal use in other post-processing methods.} \item{control}{A named list currently for internal usage only.} \item{...}{More arguments passed to \code{\link{make_standata}}.} } \value{ A named list containing the data originally passed to Stan. } \description{ Extract all data that was used by Stan to fit the model. } brms/man/me.Rd0000644000176200001440000000267713606623217012702 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-sp.R \name{me} \alias{me} \title{Predictors with Measurement Error in \pkg{brms} Models} \usage{ me(x, sdx, gr = NULL) } \arguments{ \item{x}{The variable measured with error.} \item{sdx}{Known measurement error of \code{x} treated as standard deviation.} \item{gr}{Optional grouping factor to specify which values of \code{x} correspond to the same value of the latent variable. If \code{NULL} (the default) each observation will have its own value of the latent variable.} } \description{ Specify predictors with measurement error. The function does not evaluate its arguments -- it exists purely to help set up a model. } \details{ For detailed documentation see \code{help(brmsformula)}. By default, latent noise-free variables are assumed to be correlated. To change that, add \code{set_mecor(FALSE)} to your model formula object (see examples). } \examples{ \dontrun{ # sample some data N <- 100 dat <- data.frame( y = rnorm(N), x1 = rnorm(N), x2 = rnorm(N), sdx = abs(rnorm(N, 1)) ) # fit a simple error-in-variables model fit1 <- brm(y ~ me(x1, sdx) + me(x2, sdx), data = dat, save_mevars = TRUE) summary(fit1) # turn off modeling of correlations bform <- bf(y ~ me(x1, sdx) + me(x2, sdx)) + set_mecor(FALSE) fit2 <- brm(bform, data = dat, save_mevars = TRUE) summary(fit2) } } \seealso{ \code{\link{brmsformula}}, \code{\link{brmsformula-helpers}} } brms/man/control_params.Rd0000644000176200001440000000135313601151454015304 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/diagnostics.R \name{control_params} \alias{control_params} \alias{control_params.brmsfit} \title{Extract Control Parameters of the NUTS Sampler} \usage{ control_params(x, ...) \method{control_params}{brmsfit}(x, pars = NULL, ...) } \arguments{ \item{x}{An \R object} \item{...}{Currently ignored.} \item{pars}{Optional names of the control parameters to be returned. If \code{NULL} (the default) all control parameters are returned. See \code{\link[rstan:stan]{stan}} for more details.} } \value{ A named \code{list} with control parameter values. } \description{ Extract control parameters of the NUTS sampler such as \code{adapt_delta} or \code{max_treedepth}. } brms/man/bayes_R2.brmsfit.Rd0000644000176200001440000000432013601167650015376 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bayes_R2.R \name{bayes_R2.brmsfit} \alias{bayes_R2.brmsfit} \alias{bayes_R2} \title{Compute a Bayesian version of R-squared for regression models} \usage{ \method{bayes_R2}{brmsfit}( object, resp = NULL, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{...}{Further arguments passed to \code{\link[brms:pp_expect.brmsfit]{pp_expect}}, which is used in the computation of the R-squared values.} } \value{ If \code{summary = TRUE} a 1 x C matrix is returned (\code{C = length(probs) + 2}) containing summary statistics of Bayesian R-squared values. If \code{summary = FALSE} the posterior samples of the R-squared values are returned in a S x 1 matrix (S is the number of samples). } \description{ Compute a Bayesian version of R-squared for regression models } \details{ For an introduction to the approach, see Gelman et al. (2018) and \url{https://github.com/jgabry/bayes_R2/}. } \examples{ \dontrun{ fit <- brm(mpg ~ wt + cyl, data = mtcars) summary(fit) bayes_R2(fit) # compute R2 with new data nd <- data.frame(mpg = c(10, 20, 30), wt = c(4, 3, 2), cyl = c(8, 6, 4)) bayes_R2(fit, newdata = nd) } } \references{ Andrew Gelman, Ben Goodrich, Jonah Gabry & Aki Vehtari. (2018). R-squared for Bayesian regression models, \emph{The American Statistician}. \url{https://doi.org/10.1080/00031305.2018.1549100}. (Preprint available at \url{https://stat.columbia.edu/~gelman/research/published/bayes_R2_v3.pdf}.) } brms/man/kidney.Rd0000644000176200001440000000354713565500267013564 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets.R \docType{data} \name{kidney} \alias{kidney} \title{Infections in kidney patients} \format{A data frame of 76 observations containing information on the following 7 variables. \describe{ \item{time}{The time to first or second recurrence of the infection, or the time of censoring} \item{recur}{A factor of levels \code{1} or \code{2} indicating if the infection recurred for the first or second time for this patient} \item{censored}{Either \code{0} or \code{1}, where \code{0} indicates no censoring of recurrence time and \code{1} indicates right censoring} \item{patient}{The patient number} \item{age}{The age of the patient} \item{sex}{The sex of the patient} \item{disease}{A factor of levels \code{other, GN, AN}, and \code{PKD} specifying the type of disease} }} \source{ McGilchrist, C. A., & Aisbett, C. W. (1991). Regression with frailty in survival analysis. \emph{Biometrics, 47(2)}, 461-466. } \usage{ kidney } \description{ This dataset, originally discussed in McGilchrist and Aisbett (1991), describes the first and second (possibly right censored) recurrence time of infection in kidney patients using portable dialysis equipment. In addition, information on the risk variables age, sex and disease type is provided. } \examples{ \dontrun{ ## performing surivival analysis using the "weibull" family fit1 <- brm(time | cens(censored) ~ age + sex + disease, data = kidney, family = weibull, inits = "0") summary(fit1) plot(fit1) ## adding random intercepts over patients fit2 <- brm(time | cens(censored) ~ age + sex + disease + (1|patient), data = kidney, family = weibull(), inits = "0", prior = set_prior("cauchy(0,2)", class = "sd")) summary(fit2) plot(fit2) } } \keyword{datasets} brms/man/data_response.Rd0000644000176200001440000000076713567776477015155 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data-response.R \name{data_response} \alias{data_response} \title{Prepare Response Data} \usage{ data_response(x, ...) } \arguments{ \item{x}{An \R object.} \item{...}{Further arguments passed to or from other methods.} } \value{ A named list of data related to response variables. } \description{ Prepare data related to response variables in \pkg{brms}. Only exported for use in package development. } \keyword{internal} brms/man/Hurdle.Rd0000644000176200001440000000320313565500267013511 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{Hurdle} \alias{Hurdle} \alias{dhurdle_poisson} \alias{phurdle_poisson} \alias{dhurdle_negbinomial} \alias{phurdle_negbinomial} \alias{dhurdle_gamma} \alias{phurdle_gamma} \alias{dhurdle_lognormal} \alias{phurdle_lognormal} \title{Hurdle Distributions} \usage{ dhurdle_poisson(x, lambda, hu, log = FALSE) phurdle_poisson(q, lambda, hu, lower.tail = TRUE, log.p = FALSE) dhurdle_negbinomial(x, mu, shape, hu, log = FALSE) phurdle_negbinomial(q, mu, shape, hu, lower.tail = TRUE, log.p = FALSE) dhurdle_gamma(x, shape, scale, hu, log = FALSE) phurdle_gamma(q, shape, scale, hu, lower.tail = TRUE, log.p = FALSE) dhurdle_lognormal(x, mu, sigma, hu, log = FALSE) phurdle_lognormal(q, mu, sigma, hu, lower.tail = TRUE, log.p = FALSE) } \arguments{ \item{x}{Vector of quantiles.} \item{hu}{hurdle propability} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{q}{Vector of quantiles.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{mu, lambda}{location parameter} \item{shape}{shape parameter} \item{sigma, scale}{scale parameter} } \description{ Density and distribution functions for hurdle distributions. } \details{ The density of a hurdle distribution can be specified as follows. If \eqn{x = 0} set \eqn{f(x) = \theta}. Else set \eqn{f(x) = (1 - \theta) * g(x) / (1 - G(0))} where \eqn{g(x)} and \eqn{G(x)} are the density and distribution function of the non-hurdle part, respectively. } brms/man/combine_models.Rd0000644000176200001440000000173113565500266015250 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brm_multiple.R \name{combine_models} \alias{combine_models} \title{Combine Models fitted with \pkg{brms}} \usage{ combine_models(..., mlist = NULL, check_data = TRUE) } \arguments{ \item{...}{One or more \code{brmsfit} objects.} \item{mlist}{Optional list of one or more \code{brmsfit} objects.} \item{check_data}{Logical; indicates if the data should be checked for being the same across models (defaults to \code{TRUE}). Setting it to \code{FALSE} may be useful for instance when combining models fitted on multiple imputed data sets.} } \value{ A \code{brmsfit} object. } \description{ Combine multiple \code{brmsfit} objects, which fitted the same model. This is usefuly for instance when having manually run models in parallel. } \details{ This function just takes the first model and replaces its \code{stanfit} object (slot \code{fit}) by the combined \code{stanfit} objects of all models. } brms/man/mvbind.Rd0000644000176200001440000000102713565500267013547 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsformula.R \name{mvbind} \alias{mvbind} \title{Bind response variables in multivariate models} \usage{ mvbind(...) } \arguments{ \item{...}{Same as in \code{\link{cbind}}} } \description{ Can be used to specify a multivariate \pkg{brms} model within a single formula. Outside of \code{\link{brmsformula}}, it just behaves like \code{\link{cbind}}. } \examples{ bf(mvbind(y1, y2) ~ x) } \seealso{ \code{\link{brmsformula}}, \code{\link{mvbrmsformula}} } brms/man/theme_black.Rd0000644000176200001440000000230513565500270014520 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ggplot-themes.R \name{theme_black} \alias{theme_black} \title{Black Theme for \pkg{ggplot2} Graphics} \usage{ theme_black(base_size = 12, base_family = "") } \arguments{ \item{base_size}{base font size} \item{base_family}{base font family} } \value{ A \code{theme} object used in \pkg{ggplot2} graphics. } \description{ A black theme for ggplot graphics inspired by a blog post of Jon Lefcheck (\url{https://jonlefcheck.net/2013/03/11/black-theme-for-ggplot2-2/}). } \details{ When using \code{theme_black} in plots powered by the \pkg{bayesplot} package such as \code{pp_check} or \code{stanplot}, I recommend using the \code{"viridisC"} color scheme (see examples). } \examples{ \dontrun{ # change default ggplot theme ggplot2::theme_set(theme_black()) # change default bayesplot color scheme bayesplot::color_scheme_set("viridisC") # fit a simple model fit <- brm(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = poisson(), chains = 2) summary(fit) # create various plots plot(marginal_effects(fit), ask = FALSE) pp_check(fit) stanplot(fit, type = "hex", pars = c("b_Intercept", "b_Trt1")) } } brms/man/ranef.brmsfit.Rd0000644000176200001440000000352713605605651015035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{ranef.brmsfit} \alias{ranef.brmsfit} \alias{ranef} \title{Extract Group-Level Estimates} \usage{ \method{ranef}{brmsfit}( object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), pars = NULL, groups = NULL, ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{pars}{Optional names of coefficients to extract. By default, all coefficients are extracted.} \item{groups}{Optional names of grouping variables for which to extract effects.} \item{...}{Currently ignored.} } \value{ A list of 3D arrays (one per grouping factor). If \code{summary} is \code{TRUE}, the 1st dimension contains the factor levels, the 2nd dimension contains the summary statistics (see \code{\link{posterior_summary}}), and the 3rd dimension contains the group-level effects. If \code{summary} is \code{FALSE}, the 1st dimension contains the posterior draws, the 2nd dimension contains the factor levels, and the 3rd dimension contains the group-level effects. } \description{ Extract the group-level ('random') effects of each level from a \code{brmsfit} object. } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), data = epilepsy, family = gaussian(), chains = 2) ranef(fit) } } brms/man/make_stancode.Rd0000644000176200001440000001210113611651307015052 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/make_stancode.R \name{make_stancode} \alias{make_stancode} \title{Stan Code for \pkg{brms} Models} \usage{ make_stancode( formula, data, family = gaussian(), prior = NULL, autocor = NULL, cov_ranef = NULL, sparse = NULL, sample_prior = c("no", "yes", "only"), stanvars = NULL, stan_funs = NULL, save_model = NULL, silent = FALSE, ... ) } \arguments{ \item{formula}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in \code{\link{brmsformula}}.} \item{data}{An object of class \code{data.frame} (or one that can be coerced to that class) containing data of all variables used in the model.} \item{family}{A description of the response distribution and link function to be used in the model. This can be a family function, a call to a family function or a character string naming the family. Every family function has a \code{link} argument allowing to specify the link function to be applied on the response variable. If not specified, default links are used. For details of supported families see \code{\link{brmsfamily}}. By default, a linear \code{gaussian} model is applied. In multivariate models, \code{family} might also be a list of families.} \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the \code{c} method or the \code{+} operator. See also \code{\link{get_prior}} for more help.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object describing the correlation structure within the response variable (i.e., the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for a description of the available correlation structures. Defaults to \code{NULL}, corresponding to no correlations. In multivariate models, \code{autocor} might also be a list of autocorrelation structures. It is now recommend to specify autocorrelation terms directly within \code{formula}. See \code{\link{brmsformula}} for more details.} \item{cov_ranef}{A list of matrices that are proportional to the (within) covariance structure of the group-level effects. The names of the matrices should correspond to columns in \code{data} that are used as grouping factors. All levels of the grouping factor should appear as rownames of the corresponding matrix. This argument can be used, among others to model pedigrees and phylogenetic effects. See \code{vignette("brms_phylogenetics")} for more details.} \item{sparse}{(Deprecated) Logical; indicates whether the population-level design matrices should be treated as sparse (defaults to \code{FALSE}). For design matrices with many zeros, this can considerably reduce required memory. Sampling speed is currently not improved or even slightly decreased. It is now recommended to use the \code{sparse} argument of \code{\link{brmsformula}} and related functions.} \item{sample_prior}{Indicate if samples from priors should be drawn additionally to the posterior samples (defaults to \code{"no"}). Among others, these samples can be used to calculate Bayes factors for point hypotheses via \code{\link{hypothesis}}. Please note that improper priors are not sampled, including the default improper priors used by \code{brm}. See \code{\link{set_prior}} on how to set (proper) priors. Please also note that prior samples for the overall intercept are not obtained by default for technical reasons. See \code{\link{brmsformula}} how to obtain prior samples for the intercept. If \code{sample_prior} is set to \code{"only"}, samples are drawn solely from the priors ignoring the likelihood, which allows among others to generate samples from the prior predictive distribution. In this case, all parameters must have proper priors.} \item{stanvars}{An optional \code{stanvars} object generated by function \code{\link{stanvar}} to define additional variables for use in \pkg{Stan}'s program blocks.} \item{stan_funs}{(Deprecated) An optional character string containing self-defined \pkg{Stan} functions, which will be included in the functions block of the generated \pkg{Stan} code. It is now recommended to use the \code{stanvars} argument for this purpose, instead.} \item{save_model}{Either \code{NULL} or a character string. In the latter case, the model's Stan code is saved via \code{\link{cat}} in a text file named after the string supplied in \code{save_model}.} \item{silent}{logical; If \code{TRUE}, warnings of the Stan parser will be suppressed.} \item{...}{Other arguments for internal usage only} } \value{ A character string containing the fully commented \pkg{Stan} code to fit a \pkg{brms} model. } \description{ Generate Stan code for \pkg{brms} models } \examples{ make_stancode(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "cumulative") make_stancode(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = "poisson") } brms/man/reloo.brmsfit.Rd0000644000176200001440000000543313601151454015051 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo.R \name{reloo.brmsfit} \alias{reloo.brmsfit} \alias{reloo.loo} \alias{reloo} \title{Compute exact cross-validation for problematic observations} \usage{ \method{reloo}{brmsfit}( x, loo, k_threshold = 0.7, newdata = NULL, resp = NULL, check = TRUE, ... ) \method{reloo}{loo}(x, fit, ...) reloo(x, ...) } \arguments{ \item{x}{An \R object of class \code{brmsfit} or \code{loo} depending on the method.} \item{loo}{An \R object of class \code{loo}.} \item{k_threshold}{The threshold at which pareto \eqn{k} estimates are treated as problematic. Defaults to \code{0.7}. See \code{\link[loo:pareto_k_ids]{pareto_k_ids}} for more details.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{check}{Logical; If \code{TRUE} (the default), some checks check are performed if the \code{loo} object was generated from the \code{brmsfit} object passed to argument \code{fit}.} \item{...}{Further arguments passed to \code{\link{update.brmsfit}} and \code{\link{log_lik.brmsfit}}.} \item{fit}{An \R object of class \code{brmsfit}.} } \value{ An object of the class \code{loo}. } \description{ Compute exact cross-validation for problematic observations for which approximate leave-one-out cross-validation may return incorrect results. Models for problematic observations can be run in parallel using the \pkg{future} package. } \details{ Warnings about Pareto \eqn{k} estimates indicate observations for which the approximation to LOO is problematic (this is described in detail in Vehtari, Gelman, and Gabry (2017) and the \pkg{\link[loo:loo-package]{loo}} package documentation). If there are \eqn{J} observations with \eqn{k} estimates above \code{k_threshold}, then \code{reloo} will refit the original model \eqn{J} times, each time leaving out one of the \eqn{J} problematic observations. The pointwise contributions of these observations to the total ELPD are then computed directly and substituted for the previous estimates from these \eqn{J} observations that are stored in the original \code{loo} object. } \examples{ \dontrun{ fit1 <- brm(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = poisson()) # throws warning about some pareto k estimates being too high (loo1 <- loo(fit1)) (reloo1 <- reloo(fit1, loo = loo1, chains = 1)) } } \seealso{ \code{\link{loo}}, \code{\link{kfold}} } brms/man/posterior_interval.brmsfit.Rd0000644000176200001440000000221213601151454017653 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.R \name{posterior_interval.brmsfit} \alias{posterior_interval.brmsfit} \alias{posterior_interval} \title{Compute posterior uncertainty intervals} \usage{ \method{posterior_interval}{brmsfit}(object, pars = NA, prob = 0.95, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}} \item{pars}{Names of parameters for which posterior samples should be returned, as given by a character vector or regular expressions. By default, all posterior samples of all parameters are extracted.} \item{prob}{A value between 0 and 1 indicating the desired probability to be covered by the uncertainty intervals. The default is 0.95.} \item{...}{More arguments passed to \code{\link[brms:as.matrix.brmsfit]{as.matrix.brmsfit}}.} } \value{ A \code{matrix} with lower and upper interval bounds as columns and as many rows as selected parameters. } \description{ Compute posterior uncertainty intervals for \code{brmsfit} objects. } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt, data = epilepsy, family = negbinomial()) posterior_interval(fit) } } brms/man/launch_shinystan.brmsfit.Rd0000644000176200001440000000220213601201144017262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/launch_shinystan.R \name{launch_shinystan.brmsfit} \alias{launch_shinystan.brmsfit} \alias{launch_shinystan} \title{Interface to \pkg{shinystan}} \usage{ \method{launch_shinystan}{brmsfit}(object, rstudio = getOption("shinystan.rstudio"), ...) } \arguments{ \item{object}{A fitted model object typically of class \code{brmsfit}.} \item{rstudio}{Only relevant for RStudio users. The default (\code{rstudio=FALSE}) is to launch the app in the default web browser rather than RStudio's pop-up Viewer. Users can change the default to \code{TRUE} by setting the global option \cr \code{options(shinystan.rstudio = TRUE)}.} \item{...}{Optional arguments to pass to \code{\link[shiny:runApp]{runApp}}} } \value{ An S4 shinystan object } \description{ Provide an interface to \pkg{shinystan} for models fitted with \pkg{brms} } \examples{ \dontrun{ fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "gaussian") launch_shinystan(fit) } } \seealso{ \code{\link[shinystan:launch_shinystan]{launch_shinystan}} } brms/man/cor_arma.Rd0000644000176200001440000000405713611651306014052 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_arma} \alias{cor_arma} \alias{cor_arma-class} \title{(Deprecated) ARMA(p,q) correlation structure} \usage{ cor_arma(formula = ~1, p = 0, q = 0, r = 0, cov = FALSE) } \arguments{ \item{formula}{A one sided formula of the form \code{~ t}, or \code{~ t | g}, specifying a time covariate \code{t} and, optionally, a grouping factor \code{g}. A covariate for this correlation structure must be integer valued. When a grouping factor is present in \code{formula}, the correlation structure is assumed to apply only to observations within the same grouping level; observations with different grouping levels are assumed to be uncorrelated. Defaults to \code{~ 1}, which corresponds to using the order of the observations in the data as a covariate, and no groups.} \item{p}{A non-negative integer specifying the autoregressive (AR) order of the ARMA structure. Default is 0.} \item{q}{A non-negative integer specifying the moving average (MA) order of the ARMA structure. Default is 0.} \item{r}{No longer supported.} \item{cov}{A flag indicating whether ARMA effects should be estimated by means of residual covariance matrices. This is currently only possible for stationary ARMA effects of order 1. If the model family does not have natural residuals, latent residuals are added automatically. If \code{FALSE} (the default) a regression formulation is used that is considerably faster and allows for ARMA effects of order higher than 1 but is only available for \code{gaussian} models and some of its generalizations.} } \value{ An object of class \code{cor_arma}, representing an autoregression-moving-average correlation structure. } \description{ This function is deprecated. Please see \code{\link{arma}} for the new syntax. This functions is a constructor for the \code{cor_arma} class, representing an autoregression-moving average correlation structure of order (p, q). } \examples{ cor_arma(~ visit | patient, p = 2, q = 2) } \seealso{ \code{\link{cor_ar}}, \code{\link{cor_ma}} } brms/man/model_weights.brmsfit.Rd0000644000176200001440000000372413601157431016565 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_weights.R \name{model_weights.brmsfit} \alias{model_weights.brmsfit} \alias{model_weights} \title{Model Weighting Methods} \usage{ \method{model_weights}{brmsfit}(x, ..., weights = "stacking", model_names = NULL) model_weights(x, ...) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{weights}{Name of the criterion to compute weights from. Should be one of \code{"loo"}, \code{"waic"}, \code{"kfold"}, \code{"stacking"} (current default), or \code{"bma"}, \code{"pseudobma"}, For the former three options, Akaike weights will be computed based on the information criterion values returned by the respective methods. For \code{"stacking"} and \code{"pseudobma"} method \code{\link{loo_model_weights}} will be used to obtain weights. For \code{"bma"}, method \code{\link{post_prob}} will be used to compute Bayesian model averaging weights based on log marginal likelihood values (make sure to specify reasonable priors in this case). Some some method, \code{weights} may also be be a numeric vector of pre-specified weights.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} } \value{ A numeric vector of weights for the models. } \description{ Compute model weights in various ways, for instance via stacking of predictive distributions, Akaike weights, or marginal likelihoods. } \examples{ \dontrun{ # model with 'treat' as predictor fit1 <- brm(rating ~ treat + period + carry, data = inhaler) summary(fit1) # model without 'treat' as predictor fit2 <- brm(rating ~ period + carry, data = inhaler) summary(fit2) # obtain Akaike weights based on the WAIC model_weights(fit1, fit2, weights = "waic") } } brms/man/log_lik.brmsfit.Rd0000644000176200001440000000545613605603155015362 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/log_lik.R \name{log_lik.brmsfit} \alias{log_lik.brmsfit} \alias{log_lik} \alias{logLik.brmsfit} \title{Compute the Pointwise Log-Likelihood} \usage{ \method{log_lik}{brmsfit}( object, newdata = NULL, re_formula = NULL, resp = NULL, nsamples = NULL, subset = NULL, pointwise = FALSE, combine = TRUE, add_point_draws = FALSE, ... ) } \arguments{ \item{object}{A fitted model object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{pointwise}{A flag indicating whether to compute the full log-likelihood matrix at once (the default), or just return the likelihood function along with all data and samples required to compute the log-likelihood separately for each observation. The latter option is rarely useful when calling \code{log_lik} directly, but rather when computing \code{\link{waic}} or \code{\link{loo}}.} \item{combine}{Only relevant in multivariate models. Indicates if the log-likelihoods of the submodels should be combined per observation (i.e. added together; the default) or if the log-likelihoods should be returned separately.} \item{add_point_draws}{For internal use only. Ensures compatibility with the \code{\link{loo_subsample}} method.} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ Usually, an S x N matrix containing the pointwise log-likelihood samples, where S is the number of samples and N is the number of observations in the data. For multivariate models and if \code{combine} is \code{FALSE}, an S x N x R array is returned, where R is the number of response variables. If \code{pointwise = TRUE}, the output is a function with a \code{draws} attribute containing all relevant data and posterior samples. } \description{ Compute the Pointwise Log-Likelihood } brms/man/gp.Rd0000644000176200001440000001174513611651307012700 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-gp.R \name{gp} \alias{gp} \title{Set up Gaussian process terms in \pkg{brms}} \usage{ gp( ..., by = NA, k = NA, cov = "exp_quad", iso = TRUE, gr = FALSE, cmc = TRUE, scale = TRUE, c = NULL ) } \arguments{ \item{...}{One or more predictors for the GP.} \item{by}{A numeric or factor variable of the same length as each predictor. In the numeric vector case, the elements multiply the values returned by the GP. In the factor variable case, a separate GP is fitted for each factor level.} \item{k}{Optional number of basis functions for computing approximate GPs. If \code{NA} (the default), exact GPs are computed.} \item{cov}{Name of the covariance kernel. By default, the exponentiated-quadratic kernel \code{"exp_quad"} is used.} \item{iso}{A flag to indicate whether an isotropic (\code{TRUE}; the default) of a non-isotropic GP should be used. In the former case, the same amount of smoothing is applied to all predictors. In the latter case, predictors may have different smoothing. Ignored if only a single predictors is supplied.} \item{gr}{Logical; Indicates if auto-grouping should be used (defaults to \code{FALSE}). If enabled, observations sharing the same predictor values will be represented by the same latent variable in the GP. This will improve sampling efficiency drastically if the number of unique predictor combinations is small relative to the number of observations.} \item{cmc}{Logical; Only relevant if \code{by} is a factor. If \code{TRUE} (the default), cell-mean coding is used for the \code{by}-factor, that is one GP per level is estimated. If \code{FALSE}, contrast GPs are estimated according to the contrasts set for the \code{by}-factor.} \item{scale}{Logical; If \code{TRUE} (the default), predictors are scaled so that the maximum Euclidean distance between two points is 1. This often improves sampling speed and convergence.} \item{c}{Numeric value only used in approximate GPs. Defines the multiplicative constant of the predictors' range over which predictions should be computed. A good default could be \code{c = 5/4} but we are still working on providing better recommendations.} } \value{ An object of class \code{'gp_term'}, which is a list of arguments to be interpreted by the formula parsing functions of \pkg{brms}. } \description{ Set up a Gaussian process (GP) term in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with GP terms. } \details{ A GP is a stochastic process, which describes the relation between one or more predictors \eqn{x = (x_1, ..., x_d)} and a response \eqn{f(x)}, where \eqn{d} is the number of predictors. A GP is the generalization of the multivariate normal distribution to an infinite number of dimensions. Thus, it can be interpreted as a prior over functions. Any finite sample realized from this stochastic process is jointly multivariate normal, with a covariance matrix defined by the covariance kernel \eqn{k_p(x)}, where \eqn{p} is the vector of parameters of the GP: \deqn{f(x) ~ MVN(0, k_p(x))} The smoothness and general behavior of the function \eqn{f} depends only on the choice of covariance kernel. For a more detailed introduction to Gaussian processes, see \url{https://en.wikipedia.org/wiki/Gaussian_process}. Below, we describe the currently supported covariance kernels: \itemize{ \item{"exp_quad": }{The exponentiated-quadratic kernel is defined as \eqn{k(x_i, x_j) = sdgp^2 exp(- || x_i - x_j ||^2 / (2 lscale^2))}, where \eqn{|| . ||} is the Euclidean norm, \eqn{sdgp} is a standard deviation parameter, and \eqn{lscale} is characteristic length-scale parameter. The latter practically measures how close two points \eqn{x_i} and \eqn{x_j} have to be to influence each other substantially.} } In the current implementation, \code{"exp_quad"} is the only supported covariance kernel. More options will follow in the future. } \examples{ \dontrun{ # simulate data using the mgcv package dat <- mgcv::gamSim(1, n = 30, scale = 2) # fit a simple GP model fit1 <- brm(y ~ gp(x2), dat, chains = 2) summary(fit1) me1 <- marginal_effects(fit1, nsamples = 200, spaghetti = TRUE) plot(me1, ask = FALSE, points = TRUE) # fit a more complicated GP model fit2 <- brm(y ~ gp(x0) + x1 + gp(x2) + x3, dat, chains = 2) summary(fit2) me2 <- marginal_effects(fit2, nsamples = 200, spaghetti = TRUE) plot(me2, ask = FALSE, points = TRUE) # fit a multivariate GP model fit3 <- brm(y ~ gp(x1, x2), dat, chains = 2) summary(fit3) me3 <- marginal_effects(fit3, nsamples = 200, spaghetti = TRUE) plot(me3, ask = FALSE, points = TRUE) # compare model fit LOO(fit1, fit2, fit3) # simulate data with a factor covariate dat2 <- mgcv::gamSim(4, n = 90, scale = 2) # fit separate gaussian processes for different levels of 'fac' fit4 <- brm(y ~ gp(x2, by = fac), dat2, chains = 2) summary(fit4) plot(marginal_effects(fit4), points = TRUE) } } \seealso{ \code{\link{brmsformula}} } brms/man/bayes_factor.brmsfit.Rd0000644000176200001440000000417413601151454016373 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bridgesampling.R \name{bayes_factor.brmsfit} \alias{bayes_factor.brmsfit} \alias{bayes_factor} \title{Bayes Factors from Marginal Likelihoods} \usage{ \method{bayes_factor}{brmsfit}(x1, x2, log = FALSE, ...) } \arguments{ \item{x1}{A \code{brmsfit} object} \item{x2}{Another \code{brmsfit} object based on the same responses.} \item{log}{Report Bayes factors on the log-scale?} \item{...}{Additional arguments passed to \code{\link[brms:bridge_sampler]{bridge_sampler}}.} } \description{ Compute Bayes factors from marginal likelihoods. } \details{ Computing the marginal likelihood requires samples of all variables defined in Stan's \code{parameters} block to be saved. Otherwise \code{bayes_factor} cannot be computed. Thus, please set \code{save_all_pars = TRUE} in the call to \code{brm}, if you are planning to apply \code{bayes_factor} to your models. The computation of Bayes factors based on bridge sampling requires a lot more posterior samples than usual. A good conservative rule of thumb is perhaps 10-fold more samples (read: the default of 4000 samples may not be enough in many cases). If not enough posterior samples are provided, the bridge sampling algorithm tends to be unstable, leading to considerably different results each time it is run. We thus recommend running \code{bayes_factor} multiple times to check the stability of the results. More details are provided under \code{\link[bridgesampling:bayes_factor]{bridgesampling:bayes_factor}}. } \examples{ \dontrun{ # model with the treatment effect fit1 <- brm( count ~ zAge + zBase + Trt, data = epilepsy, family = negbinomial(), prior = prior(normal(0, 1), class = b), save_all_pars = TRUE ) summary(fit1) # model without the treatment effect fit2 <- brm( count ~ zAge + zBase, data = epilepsy, family = negbinomial(), prior = prior(normal(0, 1), class = b), save_all_pars = TRUE ) summary(fit2) # compute the bayes factor bayes_factor(fit1, fit2) } } \seealso{ \code{ \link[brms:bridge_sampler]{bridge_sampler}, \link[brms:post_prob]{post_prob} } } brms/man/predictive_interval.brmsfit.Rd0000644000176200001440000000161713601107425017772 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_predict.R \name{predictive_interval.brmsfit} \alias{predictive_interval.brmsfit} \alias{predictive_interval} \title{Predictive Intervals} \usage{ \method{predictive_interval}{brmsfit}(object, prob = 0.9, ...) } \arguments{ \item{object}{An \R object of class \code{brmsfit}.} \item{prob}{A number p (0 < p < 1) indicating the desired probability mass to include in the intervals. Defaults to \code{0.9}.} \item{...}{Further arguments passed to \code{\link{posterior_predict}}.} } \value{ A matrix with 2 columns for the lower and upper bounds of the intervals, respectively, and as many rows as observations being predicted. } \description{ Compute intervals from the posterior predictive distribution. } \examples{ \dontrun{ fit <- brm(count ~ zBase, data = epilepsy, family = poisson()) predictive_interval(fit) } } brms/man/expose_functions.brmsfit.Rd0000644000176200001440000000165513601201144017316 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{expose_functions.brmsfit} \alias{expose_functions.brmsfit} \alias{expose_functions} \title{Expose user-defined \pkg{Stan} functions} \usage{ \method{expose_functions}{brmsfit}(x, vectorize = FALSE, env = globalenv(), ...) expose_functions(x, ...) } \arguments{ \item{x}{An object of class \code{brmsfit}.} \item{vectorize}{Logical; Indicates if the exposed functions should be vectorized via \code{\link{Vectorize}}. Defaults to \code{FALSE}.} \item{env}{Environment where the functions should be made available. Defaults to the global environment.} \item{...}{Further arguments passed to \code{\link[rstan:expose_stan_functions]{expose_stan_functions}}.} } \description{ Export user-defined \pkg{Stan} function and optionally vectorize them. For more details see \code{\link[rstan:expose_stan_functions]{expose_stan_functions}}. } brms/man/VonMises.Rd0000644000176200001440000000211413565500267014031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{VonMises} \alias{VonMises} \alias{dvon_mises} \alias{pvon_mises} \alias{rvon_mises} \title{The von Mises Distribution} \usage{ dvon_mises(x, mu, kappa, log = FALSE) pvon_mises(q, mu, kappa, lower.tail = TRUE, log.p = FALSE, acc = 1e-20) rvon_mises(n, mu, kappa) } \arguments{ \item{x, q}{Vector of quantiles.} \item{mu}{Vector of location values.} \item{kappa}{Vector of precision values.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{acc}{Accuracy of numerical approximations.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, and random generation for the von Mises distribution with location \code{mu}, and precision \code{kappa}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/conditional_effects.brmsfit.Rd0000644000176200001440000003104313601164263017731 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/conditional_effects.R \name{conditional_effects.brmsfit} \alias{conditional_effects.brmsfit} \alias{marginal_effects} \alias{marginal_effects.brmsfit} \alias{conditional_effects} \alias{plot.brms_conditional_effects} \title{Display Conditional Effects of Predictors} \usage{ \method{conditional_effects}{brmsfit}( x, effects = NULL, conditions = NULL, int_conditions = NULL, re_formula = NA, robust = TRUE, probs = c(0.025, 0.975), method = "pp_expect", spaghetti = FALSE, surface = FALSE, categorical = FALSE, ordinal = FALSE, transform = NULL, resolution = 100, select_points = 0, too_far = 0, ... ) conditional_effects(x, ...) \method{plot}{brms_conditional_effects}( x, ncol = NULL, points = FALSE, rug = FALSE, mean = TRUE, jitter_width = 0, stype = c("contour", "raster"), line_args = list(), cat_args = list(), errorbar_args = list(), surface_args = list(), spaghetti_args = list(), point_args = list(), rug_args = list(), facet_args = list(), theme = NULL, ask = TRUE, plot = TRUE, ... ) } \arguments{ \item{x}{An object of class \code{brmsfit}.} \item{effects}{An optional character vector naming effects (main effects or interactions) for which to compute conditional plots. Interactions are specified by a \code{:} between variable names. If \code{NULL} (the default), plots are generated for all main effects and two-way interactions estimated in the model. When specifying \code{effects} manually, \emph{all} two-way interactions may be plotted even if not originally modeled.} \item{conditions}{An optional \code{data.frame} containing variable values to condition on. Each effect defined in \code{effects} will be plotted separately for each row of \code{conditions}. Values in the \code{cond__} column will be used as titles of the subplots. If \code{cond__} is not given, the row names will be used for this purpose instead. It is recommended to only define a few rows in order to keep the plots clear. See \code{\link{make_conditions}} for an easy way to define conditions. If \code{NULL} (the default), numeric variables will be conditionalized by using their means and factors will get their reference level assigned. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{int_conditions}{An optional named \code{list} whose elements are numeric vectors of values of the second variables in two-way interactions. At these values, predictions are evaluated. The names of \code{int_conditions} have to match the variable names exactly. Additionally, the elements of the numeric vectors may be named themselves, in which case their names appear as labels for the conditions in the plots. Instead of vectors, functions returning vectors may be passed and are applied on the original values of the corresponding variable. If \code{NULL} (the default), predictions are evaluated at the \eqn{mean} and at \eqn{mean +/- sd}.} \item{re_formula}{A formula containing random effects to be considered in the conditional predictions. If \code{NULL}, include all random effects; if \code{NA} (default), include no random effects.} \item{robust}{If \code{TRUE} (the default) the median is used as the measure of central tendency. If \code{FALSE} the mean is used instead.} \item{probs}{The quantiles to be used in the computation of credible intervals (defaults to 2.5 and 97.5 percent quantiles)} \item{method}{Method use to obtain predictions. Either \code{"pp_expect"} (the default) or \code{"posterior_predict"}.} \item{spaghetti}{Logical. Indicates if predictions should be visualized via spaghetti plots. Only applied for numeric predictors. If \code{TRUE}, it is recommended to set argument \code{nsamples} to a relatively small value (e.g. \code{100}) in order to reduce computation time.} \item{surface}{Logical. Indicates if interactions or two-dimensional smooths should be visualized as a surface. Defaults to \code{FALSE}. The surface type can be controlled via argument \code{stype} of the related plotting method.} \item{categorical}{Logical. Indicates if effects of categorical or ordinal models should be shown in terms of probabilities of response categories. Defaults to \code{FALSE}.} \item{ordinal}{Deprecated! Please use argument \code{categorical}. Logical. Indicates if effects in ordinal models should be visualized as a raster with the response categories on the y-axis. Defaults to \code{FALSE}.} \item{transform}{A function or a character string naming a function to be applied on the predicted responses before summary statistics are computed. Only allowed if \code{method = "posterior_predict"}.} \item{resolution}{Number of support points used to generate the plots. Higher resolution leads to smoother plots. Defaults to \code{100}. If \code{surface} is \code{TRUE}, this implies \code{10000} support points for interaction terms, so it might be necessary to reduce \code{resolution} when only few RAM is available.} \item{select_points}{Positive number. Only relevant if \code{points} or \code{rug} are set to \code{TRUE}: Actual data points of numeric variables that are too far away from the values specified in \code{conditions} can be excluded from the plot. Values are scaled into the unit interval and then points more than \code{select_points} from the values in \code{conditions} are excluded. By default, all points are used.} \item{too_far}{Positive number. For surface plots only: Grid points that are too far away from the actual data points can be excluded from the plot. \code{too_far} determines what is too far. The grid is scaled into the unit square and then grid points more than \code{too_far} from the predictor variables are excluded. By default, all grid points are used. Ignored for non-surface plots.} \item{...}{Further arguments such as \code{subset} or \code{nsamples} passed to \code{\link[brms:posterior_predict.brmsfit]{posterior_predict}} or \code{\link[brms:pp_expect.brmsfit]{pp_expect}}.} \item{ncol}{Number of plots to display per column for each effect. If \code{NULL} (default), \code{ncol} is computed internally based on the number of rows of \code{conditions}.} \item{points}{Logical; indicating whether the original data points should be added via \code{\link[ggplot2:geom_jitter]{geom_jitter}}. Default is \code{FALSE}. Note that only those data points will be added that match the specified conditions defined in \code{conditions}. For categorical predictors, the conditions have to match exactly. For numeric predictors, argument \code{select_points} is used to determine, which points do match a condition.} \item{rug}{Logical; indicating whether a rug representation of predictor values should be added via \code{\link[ggplot2:geom_rug]{geom_rug}}. Default is \code{FALSE}. Depends on \code{select_points} in the same way as \code{points} does.} \item{mean}{Logical; only relevant for spaghetti plots. If \code{TRUE} (the default), display the mean regression line on top of the regression lines for each sample.} \item{jitter_width}{Only used if \code{points = TRUE}: Amount of horizontal jittering of the data points. Mainly useful for ordinal models. Defaults to \code{0} that is no jittering.} \item{stype}{Indicates how surface plots should be displayed. Either \code{"contour"} or \code{"raster"}.} \item{line_args}{Only used in plots of continuous predictors: A named list of arguments passed to \code{\link[ggplot2:geom_smooth]{geom_smooth}}.} \item{cat_args}{Only used in plots of categorical predictors: A named list of arguments passed to \code{\link[ggplot2:geom_point]{geom_point}}.} \item{errorbar_args}{Only used in plots of categorical predictors: A named list of arguments passed to \code{\link[ggplot2:geom_errorbar]{geom_errorbar}}.} \item{surface_args}{Only used in surface plots: A named list of arguments passed to \code{\link[ggplot2:geom_contour]{geom_contour}} or \code{\link[ggplot2:geom_raster]{geom_raster}} (depending on argument \code{stype}).} \item{spaghetti_args}{Only used in spaghetti plots: A named list of arguments passed to \code{\link[ggplot2:geom_smooth]{geom_smooth}}.} \item{point_args}{Only used if \code{points = TRUE}: A named list of arguments passed to \code{\link[ggplot2:geom_jitter]{geom_jitter}}.} \item{rug_args}{Only used if \code{rug = TRUE}: A named list of arguments passed to \code{\link[ggplot2:geom_rug]{geom_rug}}.} \item{facet_args}{Only used if if multiple condtions are provided: A named list of arguments passed to \code{\link[ggplot2:facet_wrap]{facet_wrap}}.} \item{theme}{A \code{\link[ggplot2:theme]{theme}} object modifying the appearance of the plots. For some basic themes see \code{\link[ggplot2:ggtheme]{ggtheme}} and \code{\link[bayesplot:theme_default]{theme_default}}.} \item{ask}{Logical; indicates if the user is prompted before a new page is plotted. Only used if \code{plot} is \code{TRUE}.} \item{plot}{Logical; indicates if plots should be plotted directly in the active graphic device. Defaults to \code{TRUE}.} } \value{ An object of class \code{'brms_conditional_effects'}, which is a named list with one data.frame per effect containing all information required to generate conditional effects plots. Among others, these data.frames contain some special variables, namely \code{estimate__} (predicted values of the response), \code{se__} (standard error of the predicted response), \code{lower__} and \code{upper__} (lower and upper bounds of the uncertainty interval of the response), as well as \code{cond__} (used in faceting when \code{conditions} contains multiple rows). The corresponding \code{plot} method returns a named list of \code{\link[ggplot2:ggplot]{ggplot}} objects, which can be further customized using the \pkg{ggplot2} package. } \description{ Display conditional effects of one or more numeric and/or categorical predictors including two-way interaction effects. } \details{ When creating \code{conditional_effects} for a particular predictor (or interaction of two predictors), one has to choose the values of all other predictors to condition on. By default, the mean is used for continuous variables and the reference category is used for factors, but you may change these values via argument \code{conditions}. This also has an implication for the \code{points} argument: In the created plots, only those points will be shown that correspond to the factor levels actually used in the conditioning, in order not to create the false impression of bad model fit, where it is just due to conditioning on certain factor levels. To fully change colors of the created plots, one has to amend both \code{scale_colour} and \code{scale_fill}. See \code{\link[ggplot2:scale_colour_grey]{scale_colour_grey}} or \code{\link[ggplot2:scale_colour_gradient]{scale_colour_gradient}} for more details. } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1 | patient), data = epilepsy, family = poisson()) ## plot all conditional effects plot(conditional_effects(fit), ask = FALSE) ## change colours to grey scale library(ggplot2) me <- conditional_effects(fit, "zBase:Trt") plot(me, plot = FALSE)[[1]] + scale_color_grey() + scale_fill_grey() ## only plot the conditional interaction effect of 'zBase:Trt' ## for different values for 'zAge' conditions <- data.frame(zAge = c(-1, 0, 1)) plot(conditional_effects(fit, effects = "zBase:Trt", conditions = conditions)) ## also incorporate random effects variance over patients ## also add data points and a rug representation of predictor values plot(conditional_effects(fit, effects = "zBase:Trt", conditions = conditions, re_formula = NULL), points = TRUE, rug = TRUE) ## change handling of two-way interactions int_conditions <- list( zBase = setNames(c(-2, 1, 0), c("b", "c", "a")) ) conditional_effects(fit, effects = "Trt:zBase", int_conditions = int_conditions) conditional_effects(fit, effects = "Trt:zBase", int_conditions = list(zBase = quantile)) ## fit a model to illustrate how to plot 3-way interactions fit3way <- brm(count ~ zAge * zBase * Trt, data = epilepsy) conditions <- make_conditions(fit3way, "zAge") conditional_effects(fit3way, "zBase:Trt", conditions = conditions) ## only include points close to the specified values of zAge me <- conditional_effects( fit3way, "zBase:Trt", conditions = conditions, select_points = 0.1 ) plot(me, points = TRUE) } } brms/man/horseshoe.Rd0000644000176200001440000001240413565500270014262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R \name{horseshoe} \alias{horseshoe} \title{Regularized horseshoe priors in \pkg{brms}} \usage{ horseshoe( df = 1, scale_global = 1, df_global = 1, scale_slab = 2, df_slab = 4, par_ratio = NULL, autoscale = TRUE ) } \arguments{ \item{df}{Degrees of freedom of student-t prior of the local shrinkage parameters. Defaults to \code{1}.} \item{scale_global}{Scale of the student-t prior of the global shrinkage parameter. Defaults to \code{1}. In linear models, \code{scale_global} will internally be multiplied by the residual standard deviation parameter \code{sigma}.} \item{df_global}{Degrees of freedom of student-t prior of the global shrinkage parameter. Defaults to \code{1}. If \code{df_global} is greater \code{1}, the shape of the prior will no longer resemble a horseshoe and it may be more appropriately called an hierarchical shrinkage prior in this case.} \item{scale_slab}{Scale of the student-t prior of the regularization parameter. Defaults to \code{2}. The original unregularized horseshoe prior is obtained by setting \code{scale_slab} to infinite, which we can approximate in practice by setting it to a very large real value.} \item{df_slab}{Degrees of freedom of the student-t prior of the regularization parameter. Defaults to \code{4}.} \item{par_ratio}{Ratio of the expected number of non-zero coefficients to the expected number of zero coefficients. If specified, \code{scale_global} is ignored and internally computed as \code{par_ratio / sqrt(N)}, where \code{N} is the total number of observations in the data.} \item{autoscale}{Logical; indicating whether the horseshoe prior should be scaled using the residual standard deviation \code{sigma} if possible and sensible (defaults to \code{TRUE}). Autoscaling is not applied for distributional parameters or when the model does not contain the parameter \code{sigma}.} } \value{ A character string obtained by \code{match.call()} with additional arguments. } \description{ Function used to set up regularized horseshoe priors and related hierarchical shrinkage priors for population-level effects in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up the model. } \details{ The horseshoe prior is a special shrinkage prior initially proposed by Carvalho et al. (2009). It is symmetric around zero with fat tails and an infinitely large spike at zero. This makes it ideal for sparse models that have many regression coefficients, although only a minority of them is non-zero. The horseshoe prior can be applied on all population-level effects at once (excluding the intercept) by using \code{set_prior("horseshoe(1)")}. The \code{1} implies that the student-t prior of the local shrinkage parameters has 1 degrees of freedom. This may, however, lead to an increased number of divergent transition in \pkg{Stan}. Accordingly, increasing the degrees of freedom to slightly higher values (e.g., \code{3}) may often be a better option, although the prior no longer resembles a horseshoe in this case. Further, the scale of the global shrinkage parameter plays an important role in amount of shrinkage applied. It defaults to \code{1}, but this may result in too few shrinkage (Piironen & Vehtari, 2016). It is thus possible to change the scale using argument \code{scale_global} of the horseshoe prior, for instance \code{horseshoe(1, scale_global = 0.5)}. In linear models, \code{scale_global} will internally be multiplied by the residual standard deviation parameter \code{sigma}. See Piironen and Vehtari (2016) for recommendations how to properly set the global scale. The degrees of freedom of the global shrinkage prior may also be adjusted via argument \code{df_global}. Piironen and Vehtari (2017) recommend to specifying the ratio of the expected number of non-zero coefficients to the expected number of zero coefficients \code{par_ratio} rather than \code{scale_global} directly. As proposed by Piironen and Vehtari (2017), an additional regularization is applied that only affects non-zero coefficients. The amount of regularization can be controlled via \code{scale_slab} and \code{df_slab}. To make sure that shrinkage can equally affect all coefficients, predictors should be one the same scale. Generally, models with horseshoe priors a more likely than other models to have divergent transitions so that increasing \code{adapt_delta} from \code{0.8} to values closer to \code{1} will often be necessary. See the documentation of \code{\link{brm}} for instructions on how to increase \code{adapt_delta}. } \examples{ set_prior(horseshoe(df = 3, par_ratio = 0.1)) } \references{ Carvalho, C. M., Polson, N. G., & Scott, J. G. (2009). Handling sparsity via the horseshoe. In International Conference on Artificial Intelligence and Statistics (pp. 73-80). Piironen J. & Vehtari A. (2016). On the Hyperprior Choice for the Global Shrinkage Parameter in the Horseshoe Prior. \url{https://arxiv.org/pdf/1610.05559v1.pdf} Piironen, J., and Vehtari, A. (2017). Sparsity information and regularization in the horseshoe and other shrinkage priors. \url{https://arxiv.org/abs/1707.01694} } \seealso{ \code{\link{set_prior}} } brms/man/density_ratio.Rd0000644000176200001440000000276113565500270015145 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hypothesis.R \name{density_ratio} \alias{density_ratio} \title{Compute Density Ratios} \usage{ density_ratio(x, y = NULL, point = 0, n = 4096, ...) } \arguments{ \item{x}{Vector of samples from the first distribution, usually the posterior distribution of the quantity of interest.} \item{y}{Optional vector of samples from the second distribution, usually the prior distribution of the quantity of interest. If \code{NULL} (the default), only the density of \code{x} will be evaluated.} \item{point}{Numeric values at which to evaluate and compare the densities. Defaults to \code{0}.} \item{n}{Single numeric value. Influences the accuracy of the density estimation. See \code{\link[stats:density]{density}} for details.} \item{...}{Further arguments passed to \code{\link[stats:density]{density}}.} } \value{ A vector of length equal to \code{length(point)}. If \code{y} is provided, the density ratio of \code{x} against \code{y} is returned. Else, only the density of \code{x} is returned. } \description{ Compute the ratio of two densities at given points based on samples of the corresponding distributions. } \details{ In order to achieve sufficient accuracy in the density estimation, more samples than usual are required. That is you may need an effective sample size of 10,000 or more to reliably estimate the densities. } \examples{ x <- rnorm(10000) y <- rnorm(10000, mean = 1) density_ratio(x, y, point = c(0, 1)) } brms/man/brmsfamily.Rd0000644000176200001440000003024013565500267014434 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/families.R \name{brmsfamily} \alias{brmsfamily} \alias{student} \alias{bernoulli} \alias{negbinomial} \alias{geometric} \alias{lognormal} \alias{shifted_lognormal} \alias{skew_normal} \alias{exponential} \alias{weibull} \alias{frechet} \alias{gen_extreme_value} \alias{exgaussian} \alias{wiener} \alias{Beta} \alias{dirichlet} \alias{von_mises} \alias{asym_laplace} \alias{hurdle_poisson} \alias{hurdle_negbinomial} \alias{hurdle_gamma} \alias{hurdle_lognormal} \alias{zero_inflated_beta} \alias{zero_one_inflated_beta} \alias{zero_inflated_poisson} \alias{zero_inflated_negbinomial} \alias{zero_inflated_binomial} \alias{categorical} \alias{multinomial} \alias{cumulative} \alias{sratio} \alias{cratio} \alias{acat} \title{Special Family Functions for \pkg{brms} Models} \usage{ brmsfamily( family, link = NULL, link_sigma = "log", link_shape = "log", link_nu = "logm1", link_phi = "log", link_kappa = "log", link_beta = "log", link_zi = "logit", link_hu = "logit", link_zoi = "logit", link_coi = "logit", link_disc = "log", link_bs = "log", link_ndt = "log", link_bias = "logit", link_xi = "log1p", link_alpha = "identity", link_quantile = "logit", threshold = c("flexible", "equidistant"), refcat = NULL, bhaz = NULL ) student(link = "identity", link_sigma = "log", link_nu = "logm1") bernoulli(link = "logit") negbinomial(link = "log", link_shape = "log") geometric(link = "log") lognormal(link = "identity", link_sigma = "log") shifted_lognormal(link = "identity", link_sigma = "log", link_ndt = "log") skew_normal(link = "identity", link_sigma = "log", link_alpha = "identity") exponential(link = "log") weibull(link = "log", link_shape = "log") frechet(link = "log", link_nu = "logm1") gen_extreme_value(link = "identity", link_sigma = "log", link_xi = "log1p") exgaussian(link = "identity", link_sigma = "log", link_beta = "log") wiener( link = "identity", link_bs = "log", link_ndt = "log", link_bias = "logit" ) Beta(link = "logit", link_phi = "log") dirichlet(link = "logit", link_phi = "log", refcat = NULL) von_mises(link = "tan_half", link_kappa = "log") asym_laplace(link = "identity", link_sigma = "log", link_quantile = "logit") hurdle_poisson(link = "log") hurdle_negbinomial(link = "log", link_shape = "log", link_hu = "logit") hurdle_gamma(link = "log", link_shape = "log", link_hu = "logit") hurdle_lognormal(link = "identity", link_sigma = "log", link_hu = "logit") zero_inflated_beta(link = "logit", link_phi = "log", link_zi = "logit") zero_one_inflated_beta( link = "logit", link_phi = "log", link_zoi = "logit", link_coi = "logit" ) zero_inflated_poisson(link = "log", link_zi = "logit") zero_inflated_negbinomial(link = "log", link_shape = "log", link_zi = "logit") zero_inflated_binomial(link = "logit", link_zi = "logit") categorical(link = "logit", refcat = NULL) multinomial(link = "logit", refcat = NULL) cumulative( link = "logit", link_disc = "log", threshold = c("flexible", "equidistant") ) sratio( link = "logit", link_disc = "log", threshold = c("flexible", "equidistant") ) cratio( link = "logit", link_disc = "log", threshold = c("flexible", "equidistant") ) acat( link = "logit", link_disc = "log", threshold = c("flexible", "equidistant") ) } \arguments{ \item{family}{A character string naming the distribution of the response variable be used in the model. Currently, the following families are supported: \code{gaussian}, \code{student}, \code{binomial}, \code{bernoulli}, \code{poisson}, \code{negbinomial}, \code{geometric}, \code{Gamma}, \code{skew_normal}, \code{lognormal}, \code{shifted_lognormal}, \code{exgaussian}, \code{wiener}, \code{inverse.gaussian}, \code{exponential}, \code{weibull}, \code{frechet}, \code{Beta}, \code{dirichlet}, \code{von_mises}, \code{asym_laplace}, \code{gen_extreme_value}, \code{categorical}, \code{multinomial}, \code{cumulative}, \code{cratio}, \code{sratio}, \code{acat}, \code{hurdle_poisson}, \code{hurdle_negbinomial}, \code{hurdle_gamma}, \code{hurdle_lognormal}, \code{zero_inflated_binomial}, \code{zero_inflated_beta}, \code{zero_inflated_negbinomial}, \code{zero_inflated_poisson}, and \code{zero_one_inflated_beta}.} \item{link}{A specification for the model link function. This can be a name/expression or character string. See the 'Details' section for more information on link functions supported by each family.} \item{link_sigma}{Link of auxiliary parameter \code{sigma} if being predicted.} \item{link_shape}{Link of auxiliary parameter \code{shape} if being predicted.} \item{link_nu}{Link of auxiliary parameter \code{nu} if being predicted.} \item{link_phi}{Link of auxiliary parameter \code{phi} if being predicted.} \item{link_kappa}{Link of auxiliary parameter \code{kappa} if being predicted.} \item{link_beta}{Link of auxiliary parameter \code{beta} if being predicted.} \item{link_zi}{Link of auxiliary parameter \code{zi} if being predicted.} \item{link_hu}{Link of auxiliary parameter \code{hu} if being predicted.} \item{link_zoi}{Link of auxiliary parameter \code{zoi} if being predicted.} \item{link_coi}{Link of auxiliary parameter \code{coi} if being predicted.} \item{link_disc}{Link of auxiliary parameter \code{disc} if being predicted.} \item{link_bs}{Link of auxiliary parameter \code{bs} if being predicted.} \item{link_ndt}{Link of auxiliary parameter \code{ndt} if being predicted.} \item{link_bias}{Link of auxiliary parameter \code{bias} if being predicted.} \item{link_xi}{Link of auxiliary parameter \code{xi} if being predicted.} \item{link_alpha}{Link of auxiliary parameter \code{alpha} if being predicted.} \item{link_quantile}{Link of auxiliary parameter \code{quantile} if being predicted.} \item{threshold}{A character string indicating the type of thresholds (i.e. intercepts) used in an ordinal model. \code{"flexible"} provides the standard unstructured thresholds and \code{"equidistant"} restricts the distance between consecutive thresholds to the same value.} \item{refcat}{Optional name of the reference response category used in categorical, multinomial, and dirichlet models. If \code{NULL} (the default), the first category is used as the reference. If \code{NA}, all categories will be predicted, which requires strong priors or carefully specified predictor terms in order to lead to an identified model.} \item{bhaz}{Currently for experimental purposes only.} } \description{ Family objects provide a convenient way to specify the details of the models used by many model fitting functions. The family functions presented here are for use with \pkg{brms} only and will **not** work with other model fitting functions such as \code{glm} or \code{glmer}. However, the standard family functions as described in \code{\link[stats:family]{family}} will work with \pkg{brms}. You can also specify custom families for use in \pkg{brms} with the \code{\link{custom_family}} function. } \details{ Below, we list common use cases for the different families. This list is not ment to be exhaustive. \itemize{ \item{Family \code{gaussian} can be used for linear regression.} \item{Family \code{student} can be used for robust linear regression that is less influenced by outliers.} \item{Family \code{skew_normal} can handle skewed responses in linear regression.} \item{Families \code{poisson}, \code{negbinomial}, and \code{geometric} can be used for regression of unbounded count data.} \item{Families \code{bernoulli} and \code{binomial} can be used for binary regression (i.e., most commonly logistic regression).} \item{Families \code{categorical} and \code{multinomial} can be used for multi-logistic regression when there are more than two possible outcomes.} \item{Families \code{cumulative}, \code{cratio} ('continuation ratio'), \code{sratio} ('stopping ratio'), and \code{acat} ('adjacent category') leads to ordinal regression.} \item{Families \code{Gamma}, \code{weibull}, \code{exponential}, \code{lognormal}, \code{frechet}, and \code{inverse.gaussian} can be used (among others) for survival regression.} \item{Families \code{weibull}, \code{frechet}, and \code{gen_extreme_value} ('generalized extreme value') allow for modeling extremes.} \item{Families \code{beta} and \code{dirichlet} can be used to model responses representing rates or propabilities.} \item{Family \code{asym_laplace} allows for quantile regression when fixing the auxiliary \code{quantile} parameter to the quantile of interest.} \item{Family \code{exgaussian} ('exponentially modified Gaussian') and \code{shifted_lognormal} are especially suited to model reaction times.} \item{Family \code{wiener} provides an implementation of the Wiener diffusion model. For this family, the main formula predicts the drift parameter 'delta' and all other parameters are modeled as auxiliary parameters (see \code{\link{brmsformula}} for details).} \item{Families \code{hurdle_poisson}, \code{hurdle_negbinomial}, \code{hurdle_gamma}, \code{hurdle_lognormal}, \code{zero_inflated_poisson}, \code{zero_inflated_negbinomial}, \code{zero_inflated_binomial}, \code{zero_inflated_beta}, and \code{zero_one_inflated_beta} allow to estimate zero-inflated and hurdle models. These models can be very helpful when there are many zeros in the data (or ones in case of one-inflated models) that cannot be explained by the primary distribution of the response.} } Below, we list all possible links for each family. The first link mentioned for each family is the default. \itemize{ \item{Families \code{gaussian}, \code{student}, \code{skew_normal}, \code{exgaussian}, \code{asym_laplace}, and \code{gen_extreme_value} support the links (as names) \code{identity}, \code{log}, \code{inverse}, and \code{softplus}.} \item{Families \code{poisson}, \code{negbinomial}, \code{geometric}, \code{zero_inflated_poisson}, \code{zero_inflated_negbinomial}, \code{hurdle_poisson}, and \code{hurdle_negbinomial} support \code{log}, \code{identity}, \code{sqrt}, and \code{softplus}.} \item{Families \code{binomial}, \code{bernoulli}, \code{Beta}, \code{zero_inflated_binomial}, \code{zero_inflated_beta}, and \code{zero_one_inflated_beta} support \code{logit}, \code{probit}, \code{probit_approx}, \code{cloglog}, \code{cauchit}, and \code{identity}.} \item{Families \code{cumulative}, \code{cratio}, \code{sratio}, and \code{acat} support \code{logit}, \code{probit}, \code{probit_approx}, \code{cloglog}, and \code{cauchit}.} \item{Families \code{categorical}, \code{multinomial}, and \code{dirichlet} support \code{logit}.} \item{Families \code{Gamma}, \code{weibull}, \code{exponential}, \code{frechet}, and \code{hurdle_gamma} support \code{log}, \code{identity}, \code{inverse}, and \code{softplus}.} \item{Families \code{lognormal} and \code{hurdle_lognormal} support \code{identity} and \code{inverse}.} \item{Family \code{inverse.gaussian} supports \code{1/mu^2}, \code{inverse}, \code{identity}, \code{log}, and \code{softplus}.} \item{Family \code{von_mises} supports \code{tan_half} and \code{identity}.} \item{Family \code{wiener} supports \code{identity}, \code{log}, and \code{softplus} for the main parameter which represents the drift rate.} } Please note that when calling the \code{\link[stats:family]{Gamma}} family function of the \pkg{stats} package, the default link will be \code{inverse} instead of \code{log} although the latter is the default in \pkg{brms}. Also, when using the family functions \code{gaussian}, \code{binomial}, \code{poisson}, and \code{Gamma} of the \pkg{stats} package (see \code{\link[stats:family]{family}}), special link functions such as \code{softplus} or \code{cauchit} won't work. In this case, you have to use \code{brmsfamily} to specify the family with corresponding link function. } \examples{ # create a family object (fam1 <- student("log")) # alternatively use the brmsfamily function (fam2 <- brmsfamily("student", "log")) # both leads to the same object identical(fam1, fam2) } \seealso{ \code{\link[brms:brm]{brm}}, \code{\link[stats:family]{family}}, \code{\link{customfamily}} } brms/man/is.brmsterms.Rd0000644000176200001440000000055513623751613014723 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsterms.R \name{is.brmsterms} \alias{is.brmsterms} \title{Checks if argument is a \code{brmsterms} object} \usage{ is.brmsterms(x) } \arguments{ \item{x}{An \R object} } \description{ Checks if argument is a \code{brmsterms} object } \seealso{ \code{\link[brms:parse_bf]{parse_bf}} } brms/man/cor_ma.Rd0000644000176200001440000000337713611651306013533 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_ma} \alias{cor_ma} \title{(Deprecated) MA(q) correlation structure} \usage{ cor_ma(formula = ~1, q = 1, cov = FALSE) } \arguments{ \item{formula}{A one sided formula of the form \code{~ t}, or \code{~ t | g}, specifying a time covariate \code{t} and, optionally, a grouping factor \code{g}. A covariate for this correlation structure must be integer valued. When a grouping factor is present in \code{formula}, the correlation structure is assumed to apply only to observations within the same grouping level; observations with different grouping levels are assumed to be uncorrelated. Defaults to \code{~ 1}, which corresponds to using the order of the observations in the data as a covariate, and no groups.} \item{q}{A non-negative integer specifying the moving average (MA) order of the ARMA structure. Default is 1.} \item{cov}{A flag indicating whether ARMA effects should be estimated by means of residual covariance matrices. This is currently only possible for stationary ARMA effects of order 1. If the model family does not have natural residuals, latent residuals are added automatically. If \code{FALSE} (the default) a regression formulation is used that is considerably faster and allows for ARMA effects of order higher than 1 but is only available for \code{gaussian} models and some of its generalizations.} } \value{ An object of class \code{cor_arma} containing solely moving average terms. } \description{ This function is deprecated. Please see \code{\link{ma}} for the new syntax. This function is a constructor for the \code{cor_arma} class, allowing for moving average terms only. } \examples{ cor_ma(~visit|patient, q = 2) } \seealso{ \code{\link{cor_arma}} } brms/man/is.mvbrmsformula.Rd0000644000176200001440000000052113623751613015572 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsformula.R \name{is.mvbrmsformula} \alias{is.mvbrmsformula} \title{Checks if argument is a \code{mvbrmsformula} object} \usage{ is.mvbrmsformula(x) } \arguments{ \item{x}{An \R object} } \description{ Checks if argument is a \code{mvbrmsformula} object } brms/man/data_predictor.Rd0000644000176200001440000000077613565500267015266 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data-predictor.R \name{data_predictor} \alias{data_predictor} \title{Prepare Predictor Data} \usage{ data_predictor(x, ...) } \arguments{ \item{x}{An \R object.} \item{...}{Further arguments passed to or from other methods.} } \value{ A named list of data related to predictor variables. } \description{ Prepare data related to predictor variables in \pkg{brms}. Only exported for use in package development. } \keyword{internal} brms/man/brmshypothesis.Rd0000644000176200001440000000425013601164263015345 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hypothesis.R \name{brmshypothesis} \alias{brmshypothesis} \alias{print.brmshypothesis} \alias{plot.brmshypothesis} \title{Descriptions of \code{brmshypothesis} Objects} \usage{ \method{print}{brmshypothesis}(x, digits = 2, chars = 20, ...) \method{plot}{brmshypothesis}( x, N = 5, ignore_prior = FALSE, chars = 40, colors = NULL, theme = NULL, ask = TRUE, plot = TRUE, ... ) } \arguments{ \item{x}{An object of class \code{brmsfit}.} \item{digits}{Minimal number of significant digits, see \code{\link[base:print.default]{print.default}}.} \item{chars}{Maximum number of characters of each hypothesis to print or plot. If \code{NULL}, print the full hypotheses. Defaults to \code{20}.} \item{...}{Currently ignored.} \item{N}{The number of parameters plotted per page.} \item{ignore_prior}{A flag indicating if prior distributions should also be plotted. Only used if priors were specified on the relevant parameters.} \item{colors}{Two values specifying the colors of the posterior and prior density respectively. If \code{NULL} (the default) colors are taken from the current color scheme of the \pkg{bayesplot} package.} \item{theme}{A \code{\link[ggplot2:theme]{theme}} object modifying the appearance of the plots. For some basic themes see \code{\link[ggplot2:ggtheme]{ggtheme}} and \code{\link[bayesplot:theme_default]{theme_default}}.} \item{ask}{Logical; indicates if the user is prompted before a new page is plotted. Only used if \code{plot} is \code{TRUE}.} \item{plot}{Logical; indicates if plots should be plotted directly in the active graphic device. Defaults to \code{TRUE}.} } \description{ A \code{brmshypothesis} object contains posterior samples as well as summary statistics of non-linear hypotheses as returned by \code{\link[brms:hypothesis]{hypothesis}}. } \details{ The two most important elements of a \code{brmshypothesis} object are \code{hypothesis}, which is a data.frame containing the summary estimates of the hypotheses, and \code{samples}, which is a data.frame containing the corresponding posterior samples. } \seealso{ \code{\link[brms:hypothesis]{hypothesis}} } brms/man/logm1.Rd0000644000176200001440000000066413623751614013314 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/numeric-helpers.R \name{logm1} \alias{logm1} \title{Logarithm with a minus one offset.} \usage{ logm1(x, base = exp(1)) } \arguments{ \item{x}{A numeric or complex vector.} \item{base}{A positive or complex number: the base with respect to which logarithms are computed. Defaults to \emph{e} = \code{exp(1)}.} } \description{ Computes \code{log(x - 1)}. } brms/man/figures/0000755000176200001440000000000013606352227013442 5ustar liggesusersbrms/man/figures/stanlogo.png0000644000176200001440000003745413271032273016005 0ustar liggesusersPNG  IHDRwx+sBIT|d pHYs&:4tEXtSoftwarewww.inkscape.org< IDATxw|ՙsf$w+$` ؘbQCB ے'7B6R6uq6e7M ل$ ؒm Л$W43+WY{nyޯ/lIw >̙31 B2J #7¡# #a@H P U] ]tuW~V-nUt+ˊ@l sy#/f TILxC&f~I&`= PX]&b.{gʘɋE 邞0t hrh=OuO\Κ;gnnՓ zt2L¾xYIqAsb?l_3bw끳1s+WAŮmZ􇕻OA_LӀsxH`9pO_Can5 j.͠gڪ' UX;i\}2Ə A|g2xEnE٬Z;),V%sNLbALpCfX3j8w5O+~WϪg}1~X%L]PSyL1|/cʽ atC=؟{9ROLl;-!/aKH> `<` 4u-7%ʽNiܻ ;)x+֑|1c^"Qs.ȇ} hLOSq#cʽ-p+5o P;)7Ŵ0o܋|F dS |1J7(`-Nczʽ,a؈#~ܔgw3VE`ܗyBwS o0{V,sQ?|}1K"{/Y.+q5Jy9NZx "j9UX\oӶwa^2[xmoG!F@ǘ,٤׆2O2X{Lã)A¿6ҲwrdgK?%F#c]JF>;H9rϓJ?#ti;/evyʁ{4Qs%AFb_ .YB*2wc K ^;Kri*oC}1@J;-ߙ 0=Q=S8NRJܳZRGӠ_.[|s~5wS JBja킾 ˘ʎ7՞6rfjߣOASdb1E 8y)PF҄we߁ʑ{-aї1hnY@ʽG1a8wc Jл,Exq@f_VsaLy%p",CþYTFnwc r =U[(H_,N?+LpleK鲑;ɕt\/;}g1&V.NpTi/}2W徘 z+YɒdFɒzd˽ ^ r,C<{hyt$CʶR}&{)R{)-`ʲQ} VĘUnw*{9+EԾW¦mDe_鑲*&j&` J5Kgw Sʦܛ -=;r\Ȕ(&j?s^KY;)M%_¿aʚMޕ )|wSvv 9A;[Y;)?%9r^#ࣾ@,]NߙLy+ro?@;)i1"ДܴLfnrdP%Xs(%5roS5sJE2^n1Ţdʽ+\O 7oV.܂9/E)*%Q~ <5}" 9~wc˽F)&̞*"ܔ.%AQd mĉ_1( $W69I1ٗ۩{AP!Ug[S2r_ȸG,003.;1&rA5 Z[hL}15O89}4 5U|'1GNK}؍)/9-SypZ.a0B"Fq xN\t뮐z˘ÑY{sO;hnLƏ Vӕ|bYモc= [܊"&p 4a/71 b؍)5xSLSXHwyܛȋ@U6kЖ&u-y4,er$S''L&o+Hl;#wV7؍g9;U0i S#'!> |*[6rof\<?dϫevA)TiB2k$~*?+/z1ٷqnT 2 =϶vO][V-e쨈j`@6gzF3 9zk|g1X)d"]8&B8ɄY=&(Vy ؍f L z2ȉ'v]qx pe9Xhg7f?ׁ͋la\v(o#y/Vy'r{)w9$`*N2S+'r4/2zYҟ+H35O`F5&sSZjXOG+i2_#b3e­L<"E<]$EO9`-x]Eh]L^o ˜@j'(LKΡSA|BKĻ1sKЇzg;}12ۀ'+:ݡ')LVuG`j=ˋɻ$-T pCNQS]T[?^}'(7&(-3K"_ie&?1G"'55'_{DVA+)\Z]U]yBJ ~ړq rES>lV|*=NHftɚ*7.zX=ZD8Vlk> Cꩂ:8;) NՇ U4p{a۽~\n68Ȕ%Nu]#1\;y͵ԥb*SaG~ȅq{&kuϋLo88d3ɂW}M\Vy߳bYc# z:l8͘Cp!ɥa]!kLOll}(UK86">8]f88"3zOMqpn˽R&IoRHe5h!JR&W=[3߹ɂeF6m;t;rBA$sh 9pTzZÖωHW 6hJKcC}ae%V55ss 3dގw)u̦.%YOd?P-vxΑmph66*7H߬ Z|qȟ&jM4y"i;wBڣ8`&pv1HN͚nF\2Jpe|TQ{<{X87A'eLq.Kn޴ V!e9(3Ag>ksw$g*6Le2|#m#W.5g8$ru9c~;D?WթzUvB$:̍?}ș 5Cs@,!zKqtu;ZE.>v#azblbɳCh=<#?QB + \1>}`;U]oorF&VˠԞ -L˸JTo9vO >ҮɻSW\8G!` \'.慃س}ޠQc;Bڈ.$S#!=g&`TOjuW>fX|a_uLz7:.ΊǎQ#ԖBm)}LxE< zZ>s~c撷"8o8* 83d1Y9z6}0SP"~c_N.ʘqQ`+yc"!5sorדRږ_]~q+UAѱcZ2Jޘ~C'*3 88jB{*zx`.ΑmR2HLX'u{~ V<+EGhn%(/c␩Q@13ݞLF>zn7=η3zsnv\]ld+$!p|r|ƌ) `o7E\½ 4(dBߚ81.wE&o)cB-scae~*m[Dy0ˆcc 6ecʀ1j2Vd]wRuOJݛ\2WrK'Ȉq(({p)aw 2&ϡe{j{ڵo5 q k*:88ҾMQdr,%Ikw?t^n+a vQ ##jqH͛1]a(5M+ { >w s8`R؍v;Miџ*;9m]<FK<-ܘ;YȸG'dҗ]bJcj0(և<~d^ҒyKAĈD8&maSƅ [=/Vw]Edt8P+wpVg :*Xś%_R, eN r/E\Qh?5%V0Q|RÉMQゎ .`x,XVfˎ"i)PF694/\|YivT8W]sA !S P Δ=ӵ<qVgtӣЖ^[nHžw sU*483p^N{8HIKvb'^q / !τ123  A6;W|1sd831]Ɍ(dXsx;*:Xk-EB`&;*T8. &R67ފNBlRxw]Bf)qzgA Agĺx$"R P`j”b^ bۍ-f?/u}_#e{9%dsed 'D!6Ɓ-4X'>;͡WrJ=mSGM.aetM" wWtp~Gm%MQ, Ч|1:y]5U8!VE'ɲ jS3f(mABKK솗25@:*f_TbD`<@Eiq Ͷ /;hnQLAT8Mԧ+9% 9v,§"kX ]7)V\QACΐV%o(:mGҢ E 6r76H)qȔ^vѝ0IDAT .Rgv|G1r+Y0~RLҢuYԊb&{jTbRccbeKX^%0fdaqJne2WgD&Hhu1ĊH)ʃN.IWlrU>ØBLNx9Hhski+1Q cN陂tM,Ua^S(뜲&iu VE!+` zZ=K!Qg2JJu,]ɬt%ӣБV޼:{K$gO7Q 0<ɒK,c=|$OБb\bw5zHUgy]3!P;jbv&$]2g9.x޿٧yr7%Axqe%%촢Ϫ];dL 0:qNu+Niu-Ab ^kSiyv4N0"IqJ]f+M _ ҜzD^3S v42nEct>Bb}P˘0L9J.(d-{wn*\PצnBNBwc|쒁*^nh6Ӣ.aUb6gJQc)/Joc{ bd#&2,,FnØči¿Jճvd2x^GFgeLQ;岢 O.TOeŖ?xL61#j‚8Si Zu..7$2T;v8 A61+E湱oHѐ(Ű[q3Dݦ;*~ R=htܝ"ywci 'D'D] fK(7!$M+_QJ.B7D9cLu.fe&(i)xaz-)TN8g[zWS`|03EcΐE2ms4$Ċ!]lݘz%J.8,إ'U~^y>;C.9Id9]*U\@J=Az[N"`D9C}>ہrsHU 'DJ蘒&?͵ w}KNyc{cU>{97d71$1cgBbuM Wo|mlcYy `rE c鋁*{.cyCƷw}c7L~h7ЃuM> z\"cay*;wHJwmof@%h M_h]7ݘ4> :*CdItŞ+P[ \ϒhNA_AM85Q&jZKk]a+g olߴP_LjGi0onɴ 4e-1&%uTpNg\x Ck+vE?O;LCoN[~2q800"sT"EaCǺ!ȦdAOG從Q< `S)*!prrtH*]RqM?=@9џ]\Ý@0!*Q1:ݛb,2 Y =|u/'&E>Nk]#-}Cw;w!Yzp=MAy8O1S4'Oy8)L߭urG]flnLaFZ>| =-v` 1&T`A@2bM[0Y 7/CAz:cLN$@Sۥ=6S}"bh7/c1~%W+ <+I "z~cX k1/z^ neq+3^(6Tŋ޼3_cCPޓbpDƊ`}|zy0ч17t~-ٖC E_^rn}}1[OhW='3ۚyBo19w_ 4rPGZ=?>Rws֭Դ>z_ OY+D3V8t`}}u:kzc \=`bm_YQ{AgJ_D2vTDq)#i&%[RWǸ )Y ;#YM X<Ê|2"_OB*v +B"ءs{"G3ۂڲHc*l<;̡dls=AۋYK{cJD$$pˌ@Յ\ U؞C[/#0_cSYp pͪuMԾ'KlHS6*̇y_¦T Ɓ2rv4oBЛҶ<|3ɍ}g1;V5S}"1)iл/f߁jW`,WO뙽yRw6rHo ,1$ p.Re߁Vj @;9l;dyǰ.ެ7r@5QȧJy!@yEy\cr(^'pk#k}ʆLJrC?pnVG%dqLYwlzԷZqs@coLYwl[L }حԋm Łs2r̕_\Ø hSi!Sx;Dq_s:mL!ɃaZ)yw ڜ.߁r)˄K}?h=P;ɪ6\ >nstqk^Ϩ?^ÝO!$ﳟ$R@Yyrk?>?Քd K}?S4_ne[@;-FZs~g.4QspIg*;,ͮq@0p* odA@8SΖB>NpwֳY߁e)+#җ]^A६DDNfjyN㝂> !s=XHC\;CFZ)_kgvzmGeB5^S.s@13tu;9M959.p @ܗd` \͡\\Oy>gپ3%)NEt$ֳv@LxE%3L(H{}޼]P[@>od2S-LqoF \Z:@-M):?.7Qn|Vpp#>3=AV*:T%(:[tY@l_g2-GĖy!w[PM30Uq 0))&d[@Q |+w2g"] ^;!H) \( b7י,R}gDR;sdLѻqnK4!""A.dJZ;i":R80w".Kp*S9 Id&91QXƔ0J|,AR@O(,sݻH[.oo#zp>0^2@}o; y{H];Or)d΂|AO@މr@[<~20SLY v(ٴ\;Au[9@c:oȧhSD/{.p"h=ɩn8Aꀩsiw(=яU) /)Kۮ|?0iBBtVW}yNeܱBw{6v5f AuJR'TcKam+QlȻOf98vM|g+~ZNƟ )rt{j1EqWLӺcKymS^Νͪud{7v/?k9rcJIK@xlV$ܻ۬dZq)r}VN{e]pϡe$PN}m+Ӏscf% Xw\)r_DI7KɌk}g2xd@Rc_Qs N#B|lZ7kw|hdwŸ|g1xs_;Y[e2-R&WFo.W^_9ޭvoP63ƔE!o+]av&Y-3crGJG[VʲwkKW)ƔLė/E^!诀c]};Oe_ >! )vil~A|rLxyQY;H!(u=QOۚv4b-Czk2imT+czJ{1\B+9&jjLڮiY;H!rBj:t0wc>^ppZPٴL7.ieY|Y1{4gXwF=DA Ř2+GiyL7{g+fwcʉB$idrYMB=kS.Jd+ޱ{d6 `<Ɣ]|Ra1G'}ifbLy( yl<;Hi~Cˊ!wcJXܳd5 ;1E5z FYHCh?i'[gs 3Z4Y)pwXrR1ǘ +|g.ľÔ"+~Y) H>lLs=O~ A?_Oo})VyC;IY=jLإ*:b\X{̸Z} ]؟)iꕾ+R}f(:Y.}TOF=S&)7&M['>L/^YTB>%9aK$?gNa{Y!~8wc' I;1[|1r/PVm}s-cd^S;9gv+m89{[1[BywO<۫^~y4vq>>̮reoh3q{6s +2邼O@<&o^+zs#m 4z >]]r們w@TUsKo D7~1ʝ{jv8wu nZִˡjWtSw.$qoX

Vf>?+}piܱ++G0YS 4^~әnD r{gC8F05M`U~k'yZ&>00<)Ky#bڴkKup\!S9 Hq;<,VfV14wC8y +Vp{.fzUU ޠ*X|X5j9W/ׯyAEy qK鱽oA )9 3"2p_}x}qOq$sCuO+o}LJNDÖ+w'F CdFg98ɶ)fAy6K|Yk++G 7*=`GPy7/z\lerj5*0MHLf|gˣx^yOͦe 9pQEeˍ#N ԝae4`F,\|Y[jd (0O1.`+dUׯW%z<{5wzΗs6lS]os$7^%LI4!@&&1F(:BHō t3f 3c}f]yJX9Q4Gn@~NERCI;D8'WݴsByK)j0~D%P! d޹EQpm,Fi*RڂX U`$j2G1l?Πɡ"^@p_zNƙa$FF:u5ȏ2IENDB`brms/man/figures/README-plot-1.png0000644000176200001440000004277213543716347016242 0ustar liggesusersPNG  IHDRX P%PLTE:f:f:[ffK9lHqHqHq333::::::::::f:::ff:f:f::HHHHHHHHHHqHHHqHqHHHMMMMMnMMMnnMnMnMdffff:f::f:ffffffffffnMMnMnnMnnMnnnnnnnnnqqHqHHqHqqqqqqqMMMnMnMnnnȎ:f:fې۶HHHHqqHqqݗnMnnnMnȫff::f۶qqHqȎMȎnȫnȫȫȎې:ېf۶f۶۶ݗHݗqݺqݺݗݺn䫎ȎȫfqȎې۶ݗݺ}W pHYs&? IDATx݋G}'u`/hK%BbUd/sBvǶ.wQb+ٗ ^9U&,ъ3ZkﻮGwWUWU?US/x3SS5D/Q;$wHD!C" pD(Q;$wHD!C" pD(Q;$wHD!C" pDz?xi:aX767J_  {U#OrD6֍ҟ~msc%6V{ wQ"..X}$5)6jm> ظ[Ƣ_ܸAjl> _"o͢X/lnЏҪM}$5wQ|ѴE7)jĽ^n)UX}$5&[g Wc p,qPGQG^ar@X}$5&ObƺbĽt ^:?4Bѭb> PIk00?|tccC>nѭsō_k2QиC KC" pD(rGmv3@j ;>Q;$wHD!C"Jk?L@{V{NeYI^BKrVKk? wu K|]dE~f%aODZӎUrGH;Y w\ޤe/O˦?ayg 7sϋٹ0۳Wt)Jx]&w^?{3O.-Ϩk_ivqO㞮Ore{vZ:G| &QDiwq*ousKq&JW{o=J家9wjy^bw۶'% S3w^=G$ '/mdej˴ww d |sG}*o5'̝2qG wzwkIS,r~s_<]}=h͹serG(gH,xwi/OwtOSʝv;'KAXN/v<3v_w^A>'DpGD᎜Ӓ{jcxcUќ{߽WQڃ|3R&5ISw"RǎβU|yv5Wjڑuol3 .'6Xο3$i=OB;=ĸӏӭ<9ggr׎C2e"={VܳS;g (%wL\ҷvk{wpm{"jB9wӜ{B'%ww޳vk9q wTr==rPi(N=䎌C=vA͝;ʹ#;n~W'9U;-!';ey*}ի;ȗܑΝjϹcsG9ww3H-i=;{Т m;>şcN˾g7Q5sG%wF{ռkGKwl븧NĝbGӒsG;*'hVē}3+gd_열?a ݯ~w;ָ;ʹ9WcAsGNHBwLɴ+>\[ի?ȷ,wG1MP;wlrǾs>vϼG;q9wdTiΝ.I-w&q' !wWw6n)ܱ+1Kj㐹' {ռ7Z}w,sǴ)"6O;IJؒ{wB~|v6O hjk3%Uܑ;{*q5鮁iݸռܑ!;[se}qH9wb{ʹ!qa~\{P%iɝþmc=E½_:;ʹ>/ Sr\Q%Rr:wrǂ;cs=rO'9Js{Hͻ;;iTsM/VepOUt)\mE]3rmɻ=X2w$=}#ocx(k過Ǯ+6hӝ'69v3wcgذrCUqg}$4VwsrϋQ= O`܋oeM$]|!{ђ7N{}FDž8 m=eG#w^;?eܱ{Qpɘ;^XfA ¹4u)] rO$(gP5YŷIet;j]$b?{o;M3vwÅe;'"u܉; ZsOB#zpa.r3ns}&>wxa- z5 z*`&?䞨qCi(ܧc*~_5^Xf)F+g/qOT;`O6dM}=wdٝ8c7MĕP%;ιW@F$"j gJ4̷\Oi9$S;TpO,{hܓPݙV> x:3V['~(>x i#.da{sgu}є |]+CjN E͹S{jwܑ'y_N'ʛ4Rz/{sGl wTrO%=?O8qwC;|3$a{qOOV=w޽0Fs fF;|q'2wpget$D授=qsO=}=#k I.KV;rg;Dpϯhʝ}'48i]=a8UIA5ie|kCEZsGiNw; 5q'%r'%wzxw>v".Z&{¦R;4I-wNp'%w*;)vx'w>!;);iΝw3=JKȻTwB N$DpO;Ѹ;3v4^:xg9bS;V|p'w67"IΝTٵ9DpŁvw}bG?iŝTw"q' IΝHXIwbN<宷/L4;v4w p'%wbήn.ָ{ZN宵/cL4N3wmXֶӋ pg3txg9arۗ& ;Pa4.[p/k4p'Fw=J2Dh}F,v~MH>NoHƝIw+wRpgxu\Wۗ' ##2wc%];;%R w¾۹WG ;dP`7ypM~q'`EU*wԐ;); M |\e0=H Dp'*w/,wu@M}6xL߳w{\\ONqpMfH~1v-C'M܉ ] od7fVwq'jҌk+$ jDS IW UHw|93RDbf1}p'=p7竍qΈ\%,S]i;郻)V#byߘ;ͤܵe'/sWp_],coݑFԴ^s_q<룒e(+yBo.K=S 0Ѥ.>/kN4^&\GI ^G\i mgh7rqlҨCj悴k4yjLuK5yPpoPM{jzX K?5w4B df,/4LMx)˅/~9 6x8/eyP/aro/eyP/r&4KY^.Ti+MB [@" pD(Q;$wHD]7ߦ|عd$=0r]Ug[f`l@ź _\jqUFLj/#ٱsjnEvcga65I7lU#gmPhD]KYZd2kLeWVdGeשݥ7 Iz~3 Y#=kP)/@-;z_kbBW{=~:Ikqb WdG갾w9 Z$=4rMUӟlV e~mAص~q)'tWA,v/%pEvn<55T<5 ziP֓/@Y;i)&tuT3z읰rEvn?$t(UBlP]h,IR2儮j۳%2\)WdY_F?GMMG:Z<]& E[,аq.Kw(ܫe ]]މٱ jK7iTcZUyZ.Ո{}wۗʹ:xweovUy2u)6"x{a #CD^[Eލ;/"Fvc^h{1:pRm2n67nGgni[wXȝ}_V᭿?+G7نxml:CW ٭k(E1X kokWE~uNW5 ^7rT)lX ko:S{Nh6>ٞߩ.⻤jXքy7y~){׫ɏjXxI|u;oQ,m,ρ=ơeI~֠5q |[g|So37x̡p᰼[w؅X=?~T!sQ,|8ƃ?ucn}Onf=C|cS}%ߐtzq,Eȁ5h!!C" pDc6/kP!!C"l,q **w{vw}zqk?wxqij\Rηկp{)~$}[GjfЮ;p*o_ە{S~poK6@j>c)| }Kݢ7S/\ُW\5wSGfs{[{8!g'cWɕ?xq`_ pw%w~7˳oi=%һsf\RWۻQ?ܩw;[{byԏ䮏fڥb WZ[T.P#$(3 ~}ǽӕqGwYrOSc]4qsfNI>qWG3ц;;>UŴ#4N9QKS;2sOT{'~wf=蜙%w3Z1bF y*ܱƝr;yBYJ }&{]pZՄvpOt짉;VEi}7O q_F˾JNܱ1 |}f{qO{OYq^{yg#zdO1N{s+S;Sl֎=S wD#=5pG%;{v=]xk¹#1(-A{LmZPcܱiKv[fvH3XpwW*Ps3M}y{pwD; w\rl%% w̌3HWp!q߻W07T{i܃^T*ܩoqr eX`?D8e]uʝ6van=pn 'ܱfs {*sgo;w!0Ҹc{sǁq74Hc;nmtwܜ{wfO{ܱ9SpwTpgC IDATp w$cܑt__fQ{ދ4qܑGq]b*܋: X垆ݓl܃^^ιKFY]=p51q~no8ran] ;2pGwTp..r/^1_U~U>T6{07Sޝ{ZIRQ;FXJ.(ܯϯ}S>L7+]sʹ9w74yڇ<ԿvNG'4.c;wsCsᅨM֟♣1hnwg]EuAZ;6qGn[E\܋2|Ew`smZ}1vϣw*b 4G[p/]V#4R_"Yiл690缭#w]]}Kܱ;*מ{I*b5Yy׮" WEK\6 wr wq7mz{iͻv%ER;Ҹ;6pO[f;ww#wjbwq#wJ ӂn^vV.ZEbNjFaV+vECn<93d){OQ:M_r_f4s3 GeU(sO!!;2pGһcuʹppGcs^f4s3 ݫM.CӢ&QR;k;bl`]#T~ u|9t|jߵ/H[HKOwzhR"CǓǸ;>[D_8O=7}fh@ KS=܉= f)瞪ܓ1{q}뻏#UĜ2hʝ0I7͝@=c'~ȚHfq]EuAZ;bDr'*9T DHNӂ{~LpO1~+:E2vҵ%8$)|jrG qĮs"nŝ_0 Oԙi9WrCpOܓ*w4=a)ʸ*wsgW0O}ѰXN5wb#;wdNJtEJ$4^w;B5ٜ*wRrgWģ4 ĝXӇoD/j}j^}R^̪s'wRpн)븓{N)N<.fpn{{{sOONTi;7sOe$Dhf]{(ݙr'|R |"TN~nct&;1qg/r'))>4HΝ<>d|xo(܉ʝkN l0*qOqO݂;w{FF܉>)*fOB`7rg Y;w56}k8{ԑ)2Slw읮5ro%Cs173_~n& Zc& ;e^u^f;s3yݣ:Zڅ}F_4746m_s$:43#]gN>x*b4]G?vkW#qѹ;7ڇ[l}8U2&m؎oL=Hw]>Lƹ pd  7pQ;$wHD! ئ+aǍVVbx5☗ j:"g[8*#^Gfc\9+ś]b[-6M?jEǮ.^֮~i F]2t^A-_'~"82ł[̷?s\f'ݛOeztmdZp׏:dӥŷLKc><☖ j:yO?5l~J|| {bE%'eęVGV˦Mډ]+╝oTi՘c j:E_?م"82۫ag/v/%]b[-ܫ7u!aFpJ,'o8:e/,b(,)Q|{Yw^cztmts{,v~wꨑO>\%(-+=)Χ)U|{v߳^k6=ĶZ::]ЂU\v9 Ƚ*꾂ڽ.8SX˔ $z)s9/܀y.~3R#2)Khk6CMǺHVPQxRRZ\pG5YGfq~v삵Z_TBx+iSkȾ{1Tauz5oV)pewޕq޳`W^#P6?Ɨ_R`xo-䏈iq6d76>F?/X+*yd'=:ξ^m|RVvZ {Eٚ?}f%m>=@(| c^ma.O^ec*y~){׫y#i`x/7XƢ.n\- wr5ܠ{i{ ?8Lߧ`gBe gnԙCOembCϮ5Q@EℾnԍC>qך@~u5wdwHD!%@767ʄ{Ƅw (Q;$wHDҚ{"S/I `{㾮f9}߳Z܅qij^du%S/Yv?2z&ʺ zbko˳͟0M,%S/aoŵߦ?v7~4qYO}EZI_u"ջ9 cJ5pW:(PO|i}Rwqڎ̊y;{SL3xrlvR _:?;?_ܛ9.{*+{g; 57ТpVֹvO/-ҾJ銟o+r׻-6m{ =k+[s7R߭tJ{%k3ԀZ厴G9=|>߾r>q{=6G'>\+w'wbg6:O5ΝGϽ#?`h$W%3";i{3Ӟ{B^܋JPҸn}ޮub'wΝ>o9iQ'/%܋=3 CId8;LعqW?tvu{= :v>c~CpO2YBe_L/37;ӯ5w'Ic/V'}f93[YΙY;.r9Kூ p1a{mܙm"g9wlȗ1"5ٗ_;J9w!%ܓ; {8^[W(c;MC<_ݠ1p_"=h{ΝR&ϛ\#wTrHR;V#Tz;"cTNGӬ6ո{51p%=iԻ=MZ-:қйSh{sQ"'#;ݙS&͸BUXd%0id;.*=r>KlPνxl_q^ C<2~^{ƏrO2=Sw܇Kؑ:8ue,f-.;r6<;*wd.; ٖ},]ov?EL=)] Ӓ{*F;Zģ%w~'Ou;CiA'wmp*ر1"Vr8wN.͹c;S;qΝInB}\ٞ5hʻ~|{Y^MNUSw\m6=sG9wT=c3wsAq@}WFͷgٮVrG9wpwTpGc'w~A#{u$׻eOUSzYIVZw~2=pgl|3="qGwk}745"Ow28u옹)z  %w.#z;!r˹v{=I>v}wfof܋n ㎰;Ǚwn8a ׄ0/VsL}XxrJwFN;.mKTrGc"pT7޵^#EnμxX^m؃wRg|C7){LT|5pgǏrG]׹#+w 7~,j8^;eL18U;ΙA.T]p窭Q{QwG!YAqcGU-_F(} y7=3w$n [ĆN^}Lh{CtoU4̽x{*N~F8{0rU|XDLUݓsM{ K<\*Ku;R&ܥhT쌑}&xtYKVr:wc7HϣV{#)} w^6m7|r;wÅ⧉w;RrIwӯpI8sdԶՉT|~f9w%۪{[el{'R]s#e{/T Ѹ;5w}܎ :V9J$I#H㞴No6޵Y~N/Rz; S;wRܑ Kܓ7m;ly ;@ɝ^)Ҽ5WŸoii+ wmbm=.ǒQZLkV |f=Q'ݸ^{Ա|*wj'[6pCpW{ʸk=ӂ{5;Ntm*}]5~ݘ8sn/`Jdz` ;Wy ;Pd${홰qGZ=o5[Nr=͹;D?:wza՜;1pOebgܓ_9^vcԼO^*5is=-?urRJl=5pO ;v!U{{gp:4ލcUw-kwҊ;rq'2w:ĝ])+R"~ 2Ɲ^OQ Kgf]zp*k,W6r'9wv:ºIsOi7twsOJwD6Vuqv6z\UN$F]YMd!Mƻ#=N~CdD=e6pG%wbNtܧug̑L iܩJ;eY8w~)l=QMݗq'sy^dxn. :"HΝ3ie%ws'̝bJ¾˽?ؑ7WQbμ #w ĝHIc̵{^Wڽlk/>ཹzHϸ^.-h/3GGൗG#Ye~7>'wQwMs(%"H-#zelɝ 빓ܫC[h6xGӂ;2ܫ$+܉{vw}!Op)wcp'EƎF^yo4gv.5W"e:G/vjYF+r;O4w2p˶=qνq'ea2)@ӌ^G;v4xm^>we{dN{ CwкH :{4L=L,CfYgVޑZ=7IEܗ˨WaW2xMdW:Gz :q__Q,jrq뭌7hͽܓ153,GdjGco\'351cY}jqxF2ǵф7>-'(cXS jdM~jX ן1}!w >B5KUiwW%fk Lpo~U3|ZwW%f8 lpo~U3|jϙ UȅD(Q;$wHD҅6olnd8j5i]\ׅz;cUNnvaL%,b(,\R9k5şjzԺ wuH.v2D5+5jyM>{*v{ c*YXkJEe;['~,2Ur'2jzԶçwԂŷIy5Mk:cIDATnw^2+NA*:m\g5܎Od*Ω,b$^WWҋөNZˈ?h)wÐ>w/]SJzai 'A;+iL%'^YZ8Z&k鯤WA,v/%Tӣ!N f"_&YKMNSʺiK ^f?Bֳd hK{U˟|kWk٬eV){;p\Z8Zfsk|g SM.ق,tE}]Ǐxԙqsi1㓵c%l:^_#.o//ܹ{+U=;Sv \sJJb'k~3zQM֑Y`FkwaoTe qG}7OEO29ǭs6ۻ7;}w㐾.܍5I?5uk>wטʽZp9㓵}W#R0=`L`YzSMvTkZ;tYxc 5;} )BpRcWɕ?ԎV5ؗVڶ3Gي \21䲈0n->Ďu[5sRP2jz~L`xL9=/8/Yyy6Cie?ӝg2~be JCa;Zfqv6+"LJO5=:ݘP8#Q;$wHD!C" pD(Q;$wHD!C" pD(YwAq>BIENDB`brms/man/figures/brms.png0000644000176200001440000002736313255206242015121 0ustar liggesusersPNG  IHDRaHbKGD pHYsnu>tIMEjv IDATxwxTU?NM}zbE,n-6T@PiN4A+ 1&3 $|8֭#\ڈ6brssݚz2^{5VZ`x'0`6ͭyJ\\&I-Jq:_g}ɓq8+dH)"..I& 쳲322rd2w1sL=z [na4\J^'&&HAh`75F#,_>O?͕W^n7X,}vtii)Nlٲf;n=Xb͓`h`k`7PEEYYYXV?./ُ˙3gfUU>8! bhLqYV())qa2ؽ{7g-~>fGy?O V)%8´юBP]]3}Xd nBHNNw\*++uz6mĂ s; s+BCTTTw8N'YYYh|&O޽{:t:sꫯFQ!)))2=C͉'B( /w"¬YKܚ'Trrr;%%%a&˗/'񪫮bĉtmBbbb0 ؾ,Jzz:555nt[{l6&$$ޮv vmYVEEb&L={ho ((I&qmQ]]FOLL$88X.((UUHz'Oj*^v:>sx4h[ ?~ܭ?Z?g'YUW_}5O?4nMlllym6[NF]v1yd2Lfԩ؊.c}lA^^'Npl6… ORll,&L`̘1l UU'66֧o[JIII ngP]]o5=w̛7d!!!$$${Ч ##cl6aRSS)++)Yh&ɭ s>vMM n*}v-Zapo?w}7<RצL{tRXXH~~[u:,Z 6hBBBXx1?RʺXowz-EEE!PEzjvFes!ݻwgŊzL SN^:+**ɡcY֚5kX|ץ73{EQ$66^n';;RNرcL6kԵz=3gkh4`*BRRAAA^W1 ֛2e ~)Z%[(,,ŋ3p@@Ν"=M...&??6T/kM 'K.&`WWWEUUUkk.M֡ެ{w`L)e]zl[L0[lUUIIӑσ>Ç5z\~~~<ӌ=ڣyHNNnV;77b]z=̙37LY&wc=СCݚ'RJB.++#33֎|̘1C5|p&MDbb؂hZn1˿^<,Kktm7oft`0pq}YvhƍwPmظIm6UUc4PSZZ[of餁)S4(QjUϞ=5k}qkjJpp0 n+˪oܸgyZJ@Z!z׏lZЧ5tP.\بmABBBۃmZʢc^7|Cjj*GiXG`<%J o8gg4[ZfҤI fp8(((-L,Y&IkF!잡^KD0xBh5S53fpeՙ#Ϗ3^`8qcYVٱb V\٦7Ur>u@$y^|E=VQ]xwYlm~ӮB07d}%]:TNFV\q̙3???LEQ k`[Vrss=F˼yc&"~!=#*`msժRS2fRJt:3[JInnnʓO>U b`:*~&m(~Z)9Q3IB!!!\}z4OF#;wh46 좢" ܦ !0,XzͻVWlTH)5ݤ*GCV߿?tcUPPn]$;;mYNΜ9s`' VJvS .&y7NfCX :AZ;Ω"]w ڨ}&`}̻ϗH IcIvea%vnIM!v4U!KW#c*a)M2Cw))ˁ>SWCyMؿQs`x. LPا lw{Nh4ן/A4Bp|5.>Òc$&Q[q]Qhq`gN3Azo<)C]k׏  8PBCkpT EP&̂t(Ү5`[F)O/{z A A7^} A:q5 tWN8 턊-NB 5pR%K| 6A9$Oڔ Œ[i+` WH%(Ol(y;ɾ9YA .[AӮ̐X(y/ɖTʎJnx@aj^v0iUˍ<F ) $lreIwmU$p OG} o\8 K+TW}3D(~ !a2ɇ;)[l 8Jp+=כT~s#%$!b %OsPO89w뤎dONoR1u~}9;ԕ7\IEA ̱K>TV ^t6h`h}A槒}ңa/b%R'U {[%z8)ZSs[jU|@u.sW0pBu Uw$eQv9}U=PpA4ݪ# չP1tqUѬR;Im\*~TmSv/VG}:QvMM FlQ0G'$_ެ@3Tףa_T0sk6=Pio~?l 5NoaJBv8qGL%_:yBow_M~.*AǮ"w&J{ՁE*wB'~2.|Np2c=p@%8i` ɰ;Uu*:r6-wZqXIa}; y ë ਂQ٘^ G^t ɾ7b'YJ)jaud{Vw uM^]nޏ^DT~~M0Dpw >vM\B%cPyԤ]ؚWF"dɮL}y*ZĖOcDÆ^"ňB$t*k`wLä+~aA{H)RRQQۈvw{Ȍkuv6FpEP/.&N篓áAۻN) tPjcbn=*H+z\(i3;P-w#*wFUVUmjO U ']-Ĥ3f_}'\1=zW_!noǿ;5k>,\pIII|'H)l~[=B1IsEPw. N#559sзo_f3[lAJɺu5ڍ3bN8wbRs}sNjjjR*G_gРA\{\EbV {{{[n@ݻWj۶mrٲeҝV3fL'|Rw_ nf=z>o '/J9`em|!)/RiF?k2oر2339r eԩ7*y/Ik2|Z=qDY^^.+r(RX.rzg|Ν+_qzzlG<{hdjNL2' vՄ=KWlZ"d:|֤PԩSX,&!CXv-EEERͩk^xfZٹs'[laΝLI[*Ty&f":tHYPW{~% h\.] <<֭[p1XBanM  O] Jn>{5$kVw 8.ҹsg̛7I( +zzc|+yfzMqq17|3vyÇlnsm?]'/PR0tzSRZnQC/TNORj$|̘1kj{z#|6dh47VnҾ? =HIgco]]]_3jU=$8~K QCuSgҀD_`_E}"]c=J~yjN''OjbZ|̊bc8ei&C9ʚ|m6{uA?/n fk/. [j S'Nr[l͆jm[zPKvVg23Z‘̏e2dwuMܵ 3kɺJzLo`<[ H98:\ik6i^^^>?y_}֭c9rmLŎʺ5B|Ym95DQz9kzt ˊ"ft6W$D\]'py`wH>=+4K(QԟSoz/XS6zh<ȱcǸiF_N €P*~^;=bC1[oN@`3Nk/4Ҁ.<?[_ḭY.QN1ң͚7o:?8Csϭ!/tIDAT=))۷cXnw (sVTV=or_;u}Xblj1+-r;v ᇪ,ZO/$~VD1Y_<&MTٳg㏣=zi/FbD;22nPYYY1iutO%@1QڱHiGeԛCAO>$ׯgΝuٳiy~q23iAAA~MO>wJIgWvN12`0p7xkzVtnsn;$$L{6lX_|ArlX a,'z9F^u)**⣏>l6_Z?iƌ!]8?ҷTY,,Kmڴ+2@8PD^|sw1ǒl o0Fպ###;=~nԩ|5@O? H{3j^OVK݈ &pM7ѿ:wLTTT]&Z~~>v7wީ}Kѣ|@#c^nwcoAڙu%k~UUrrrسgPXZj6kpGq ސϖ-[XliC-lHTi"6zfs 㬠*&Rm=<8tw/)I'e"nCezއ2Q@i8?TzN84ۣo 5n$_kwSWȰcɴر^0 Z*{\:l-WP|YqE%z:?zgEEE8׶5k7ntۺLUݙ9s&wGHLLl0#વʪ*//GӞf? .dt:Ν;q?Uuu55h-@׳cΝO?=Mgsmؠ! n]Rrsslno/(Io9svkG ! !11;6ص*(( 77̞=wyG{jUdd$/ݺuhvfRRRN`d^^n1 =z[C&@z)ZEiшb9UZUUU?OFFD;F##G'h4u:ŝs6`jgeey|(o… eչˊ+>֎nc- 6܃ ֞tb!55 .23>ʢvľ}HMMeϞ=ړo j6Ecbb<'*kUSSCZZ^g<|S#F`Μ9( ZTTYmvT]x5k4yKMާK.iӦѵkW0⚵l}eggSRRl4)..geӦM)ijF%&&2an>J%[ZvTUצHKKc}@s=x49Eb4σ]J222܆EtuVOznfƏOddUy֫ ص*((cz`ɒ%[ZzhL6s=ףLBBtv222<&N !aܹSHr5xdz=:u߿+Zuow'!bʔ)?~\#5ydnY$&&֕eyZ)Sx,'..MhV5=j|vtJLLdҥtSN-nw`=Xe֬YlٲE#,e2Xp! Bӹ э%3i`ɡ­m6ٴiK,ѣM^ogL&餵 T;++~<47ϊ+ x_INNa\iEEEE˗k鱍b`zv#K'5L>RRRp???~G,X7|BCC7n~;-2Lo#j=*L&>3z)JJJ:,kTKE+Bdd$ofvʓRRVVFFFGngvE]ļy󈈈p{N||}:?#!!!;qa<ѱ6Tӄ߿]6Y3 4;JJJ=֝ͭ*v0Vo8s~~~$$$ttR v0q])p{kH'DX;&wAPܡCmrE;!wMЃܡCr"=z;!w(BcܡCr"Ezl; w(BPܡ6Cr"E;&wAPܡCmrE;!wMЃܡCr=;!wMЃܡCr"=z;!w(Bd䎈} *G0ܡC;#^S;EPܡ֝"w(BУdNUIX;!wQu'wDvrG;(ݺ;TZ;#NEzoQ*%r"=Nٺ;btJ _u'wD"wrW]Sk'wć]r'wEȝ8vrGtȝ:ʏQZ̹w';\տwuHmFmj;GMF"l1L%}X~qx$}K/#ǐ{<6/l./?#w%f-~xݜ{X'ɟ7zey)D=-;]ٻ#S{$gg1Qܳ9s_/=(Mo%8j2!Y{W{? 7z &Df/r$Cb#r ̩r HxF7j'wDG7.8[;#.9!wɑ_;#.:~!wёJ wّ ˎO*$wĢJHH܅G#j'wāܥG#.=V;# .> wF1 wˏ/N[ _ɝ#VvrGH^굓;GVF 52ը:r3>!wN@ #lj'wm{2䎠p^-svy!wTRsqoϚ?i<>m5QwaA[f{Β;]MQa܏\?sϷInFs_t=5Vwȫug#68}pDv`_"w#Vj;BQ-/$wՠv?ycpUGw;7iy,s\eF:tɗ[NM"4F;#L^VvN^܃^JѬLm?TmeᏓޝ4I8q4s$~q(從-իG3G",>TM>T-yarxk8j1i_[|rSvlr3;\_x1G34ӳNbf{g>c$bp."OͼwS([hH%b+ehĮ {{f{tGw#f'hHH.~c/݃\;yo⚙J!ݣltFh3Vw5_ηɗhHHwkϞfʮY=ffx4s$afq(w>.G=}>M^܃fhq) i엚 Mc{L^MdrHΓ?wϟ}d3A0V{@.̌2 s?{>/ɽrDg_*_c$`prOֆ.k$_ۙcF"&k(dgx9Ӛ{43s.73Z{PBa"F=Hfkwgޝ`1|V9õ;~ #G {LN𘇹_ќ"=8k'wxy ;|E-{`$j'wx NBAI{Μ%w}wGC GDvrj'wFBX-N2w)䮘`H.HNNh.N {; NpH/HNNxo/oNŝ ;{վ2V{Ar.coX;,k'weL&Y4O9rﵓ;̑}vrk7|Bpўdƶ9T9rb7U;-cNhI"v}LUC! NhE";Z]&vrGsb+ >+G+a˶b'w4R{ڗ-NhB`i?0$w\9rڭ.+b7z)\u_119w^9r=?pN:L~dvrGu7tn!vrGufb_v;*3K{JvZ_!wTc$ڭ=@-ˑgbuq{>պ}L=Y=bx3Iۮr>t6c6K)'cN}؋-G^hig٭{(b=`O)Yk=sXەݛ]ߑK׈ݛÈܝj)3b_qWz aw}6ANXl9rX=ra[ {'nOniaw}@VZ-K9r(=snKz|݂>6kԺ-K2i%%5i}y^2 w1O=!Ez =s2tJo%\ճ] hUy)roB-T(c{3U7r͓҉ri^eS/Ƚy{^QK#]\ #N-r^t"A3-{SϽ4|~DnO*] cJo[s7yIe}3s?wMMPȏK0ɽ,+cQۊ׉jb~J.F4|vIVH %UNu,wU` hPV6hF6k$_Si$Uñ{YX6i<ksffI]̑;|e4w#9Frg30w"938f;X6Ӆ}ՊϪffvkf<DPܡCr"E;!w(BPܡCr"E$r/qf9:mfi"-Mt%dt7ܫ [m ;&o@F[YC(BPܡCr"E˟M)%ojMN/{ B7zGD&'_9@r~Ou5E&'ooӓj*6kuv^^?q/ǢD9&So.aЮȍ*t+ߔ|Ƚ*vJMKB7}tsidBKp\f?Is[`7?F063eASސ9yG-Asl%{e픾9bo mv%r m : ϻk{gRt x) .} \item{p}{Vector of probabilities.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, quantile function and random generation for the Student-t distribution with location \code{mu}, scale \code{sigma}, and degrees of freedom \code{df}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } \seealso{ \code{\link[stats:TDist]{TDist}} } brms/man/loo_compare.brmsfit.Rd0000644000176200001440000000251013601151454016221 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo.R \name{loo_compare.brmsfit} \alias{loo_compare.brmsfit} \alias{loo_compare} \title{Model comparison with the \pkg{loo} package} \usage{ \method{loo_compare}{brmsfit}(x, ..., criterion = c("loo", "waic", "kfold"), model_names = NULL) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects.} \item{criterion}{The name of the criterion to be extracted from \code{brmsfit} objects.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} } \value{ An object of class "\code{compare.loo}". } \description{ For more details see \code{\link[loo:loo_compare]{loo_compare}}. } \details{ All \code{brmsfit} objects should contain precomputed criterion objects. See \code{\link{add_criterion}} for more help. } \examples{ \dontrun{ # model with population-level effects only fit1 <- brm(rating ~ treat + period + carry, data = inhaler) fit1 <- add_criterion(fit1, "waic") # model with an additional varying intercept for subjects fit2 <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler) fit2 <- add_criterion(fit2, "waic") # compare both models loo_compare(fit1, fit2, criterion = "waic") } } brms/man/theme_default.Rd0000644000176200001440000000077713565500270015103 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ggplot-themes.R \name{theme_default} \alias{theme_default} \title{Default \pkg{bayesplot} Theme for \pkg{ggplot2} Graphics} \arguments{ \item{base_size}{base font size} \item{base_family}{base font family} } \value{ A \code{theme} object used in \pkg{ggplot2} graphics. } \description{ This theme is imported from the \pkg{bayesplot} package. See \code{\link[bayesplot:theme_default]{theme_default}} for a complete documentation. } brms/man/posterior_average.brmsfit.Rd0000644000176200001440000000613113601162150017440 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_weights.R \name{posterior_average.brmsfit} \alias{posterior_average.brmsfit} \alias{posterior_average} \title{Posterior samples of parameters averaged across models} \usage{ \method{posterior_average}{brmsfit}( x, ..., pars = NULL, weights = "stacking", nsamples = NULL, missing = NULL, model_names = NULL, control = list(), seed = NULL ) posterior_average(x, ...) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{pars}{Names of parameters for which to average across models. Only those parameters can be averaged that appear in every model. Defaults to all overlapping parameters.} \item{weights}{Name of the criterion to compute weights from. Should be one of \code{"loo"}, \code{"waic"}, \code{"kfold"}, \code{"stacking"} (current default), or \code{"bma"}, \code{"pseudobma"}, For the former three options, Akaike weights will be computed based on the information criterion values returned by the respective methods. For \code{"stacking"} and \code{"pseudobma"} method \code{\link{loo_model_weights}} will be used to obtain weights. For \code{"bma"}, method \code{\link{post_prob}} will be used to compute Bayesian model averaging weights based on log marginal likelihood values (make sure to specify reasonable priors in this case). Some some method, \code{weights} may also be be a numeric vector of pre-specified weights.} \item{nsamples}{Total number of posterior samples to use.} \item{missing}{An optional numeric value or a named list of numeric values to use if a model does not contain a parameter for which posterior samples should be averaged. Defaults to \code{NULL}, in which case only those parameters can be averaged that are present in all of the models.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} \item{control}{Optional \code{list} of further arguments passed to the function specified in \code{weights}.} \item{seed}{A single numeric value passed to \code{\link{set.seed}} to make results reproducible.} } \value{ A \code{data.frame} of posterior samples. Samples are rows and parameters are columns. } \description{ Extract posterior samples of parameters averaged across models. Weighting can be done in various ways, for instance using Akaike weights based on information criteria or marginal likelihoods. } \details{ Weights are computed with the \code{\link{model_weights}} method. } \examples{ \dontrun{ # model with 'treat' as predictor fit1 <- brm(rating ~ treat + period + carry, data = inhaler) summary(fit1) # model without 'treat' as predictor fit2 <- brm(rating ~ period + carry, data = inhaler) summary(fit2) # compute model-averaged posteriors of overlapping parameters posterior_average(fit1, fit2, weights = "waic") } } \seealso{ \code{\link{model_weights}}, \code{\link{pp_average}} } brms/man/logit_scaled.Rd0000644000176200001440000000070613623751614014723 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/numeric-helpers.R \name{logit_scaled} \alias{logit_scaled} \title{Scaled logit-link} \usage{ logit_scaled(x, lb = 0, ub = 1) } \arguments{ \item{x}{A numeric or complex vector.} \item{lb}{Lower bound defaulting to \code{0}.} \item{ub}{Upper bound defaulting to \code{1}.} } \value{ A numeric or complex vector. } \description{ Computes \code{logit((x - lb) / (ub - lb))} } brms/man/residuals.brmsfit.Rd0000644000176200001440000000732113601120650015714 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predictive_error.R \name{residuals.brmsfit} \alias{residuals.brmsfit} \title{Posterior Samples of Residuals/Predictive Errors} \usage{ \method{residuals}{brmsfit}( object, newdata = NULL, re_formula = NULL, method = "pp_expect", type = c("ordinary", "pearson"), resp = NULL, nsamples = NULL, subset = NULL, sort = FALSE, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{method}{Method use to obtain predictions. Either \code{"pp_expect"} (the default) or \code{"posterior_predict"}. Using \code{"posterior_predict"} is recommended but \code{"pp_expect"} is the current default for reasons of backwards compatibility.} \item{type}{The type of the residuals, either \code{"ordinary"} or \code{"pearson"}. More information is provided under 'Details'.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{sort}{Logical. Only relevant for time series models. Indicating whether to return predicted values in the original order (\code{FALSE}; default) or in the order of the time series (\code{TRUE}).} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}..} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ An \code{array} of predictive error/residual samples. If \code{summary = FALSE} the output resembles those of \code{\link{predictive_error.brmsfit}}. If \code{summary = TRUE} the output is an N x E matrix, where N is the number of observations and E denotes the summary statistics computed from the samples. } \description{ This method is an alias of \code{\link{predictive_error.brmsfit}} with additional arguments for obtaining summaries of the computed samples. } \details{ Residuals of type \code{'ordinary'} are of the form \eqn{R = Y - Yrep}, where \eqn{Y} is the observed and \eqn{Yrep} is the predicted response. Residuals of type \code{pearson} are of the form \eqn{R = (Y - Yrep) / SD(Y)}, where \eqn{SD(Y)} is an estimation of the standard deviation of \eqn{Y}. } \examples{ \dontrun{ ## fit a model fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler, cores = 2) ## extract residuals/predictive errors res <- residuals(fit) head(res) } } brms/man/prior_samples.brmsfit.Rd0000644000176200001440000000325513601201144016600 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_samples.R \name{prior_samples.brmsfit} \alias{prior_samples.brmsfit} \alias{prior_samples} \title{Extract prior samples} \usage{ \method{prior_samples}{brmsfit}(x, pars = NA, ...) prior_samples(x, pars = NA, ...) } \arguments{ \item{x}{An \code{R} object typically of class \code{brmsfit}} \item{pars}{Names of parameters for which prior samples should be returned, as given by a character vector or regular expressions. By default, all prior samples are extracted} \item{...}{Currently ignored} } \value{ A data frame containing the prior samples. } \description{ Extract prior samples of specified parameters } \details{ To make use of this function, the model must contain samples of prior distributions. This can be ensured by setting \code{sample_prior = TRUE} in function \code{brm}. Priors of certain parameters cannot be saved for technical reasons. For instance, this is the case for the population-level intercept, which is only computed after fitting the model by default. If you want to treat the intercept as part of all the other regression coefficients, so that sampling from its prior becomes possible, use \code{... ~ 0 + Intercept + ...} in the formulas. } \examples{ \dontrun{ fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "cumulative", prior = set_prior("normal(0,2)", class = "b"), sample_prior = TRUE) # extract all prior samples samples1 <- prior_samples(fit) head(samples1) # extract prior samples for the population-level effects of 'treat' samples2 <- prior_samples(fit, "b_treat") head(samples2) } } brms/man/InvGaussian.Rd0000644000176200001440000000206713565500267014524 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{InvGaussian} \alias{InvGaussian} \alias{dinv_gaussian} \alias{pinv_gaussian} \alias{rinv_gaussian} \title{The Inverse Gaussian Distribution} \usage{ dinv_gaussian(x, mu = 1, shape = 1, log = FALSE) pinv_gaussian(q, mu = 1, shape = 1, lower.tail = TRUE, log.p = FALSE) rinv_gaussian(n, mu = 1, shape = 1) } \arguments{ \item{x, q}{Vector of quantiles.} \item{mu}{Vector of locations.} \item{shape}{Vector of shapes.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, and random generation for the inverse Gaussian distribution with location \code{mu}, and shape \code{shape}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/pp_average.brmsfit.Rd0000644000176200001440000000675213601162150016042 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/model_weights.R \name{pp_average.brmsfit} \alias{pp_average.brmsfit} \alias{pp_average} \title{Posterior predictive samples averaged across models} \usage{ \method{pp_average}{brmsfit}( x, ..., weights = "stacking", method = "posterior_predict", nsamples = NULL, summary = TRUE, probs = c(0.025, 0.975), robust = FALSE, model_names = NULL, control = list(), seed = NULL ) pp_average(x, ...) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{weights}{Name of the criterion to compute weights from. Should be one of \code{"loo"}, \code{"waic"}, \code{"kfold"}, \code{"stacking"} (current default), or \code{"bma"}, \code{"pseudobma"}, For the former three options, Akaike weights will be computed based on the information criterion values returned by the respective methods. For \code{"stacking"} and \code{"pseudobma"} method \code{\link{loo_model_weights}} will be used to obtain weights. For \code{"bma"}, method \code{\link{post_prob}} will be used to compute Bayesian model averaging weights based on log marginal likelihood values (make sure to specify reasonable priors in this case). Some some method, \code{weights} may also be be a numeric vector of pre-specified weights.} \item{method}{Method used to obtain predictions to average over. Should be one of \code{"posterior_predict"} (default), \code{"pp_expect"}, or \code{"predictive_error"}.} \item{nsamples}{Total number of posterior samples to use.} \item{summary}{Should summary statistics (i.e. means, sds, and 95\% intervals) be returned instead of the raw values? Default is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} \item{control}{Optional \code{list} of further arguments passed to the function specified in \code{weights}.} \item{seed}{A single numeric value passed to \code{\link{set.seed}} to make results reproducible.} } \value{ Same as the output of the method specified in argument \code{method}. } \description{ Compute posterior predictive samples averaged across models. Weighting can be done in various ways, for instance using Akaike weights based on information criteria or marginal likelihoods. } \details{ Weights are computed with the \code{\link{model_weights}} method. } \examples{ \dontrun{ # model with 'treat' as predictor fit1 <- brm(rating ~ treat + period + carry, data = inhaler) summary(fit1) # model without 'treat' as predictor fit2 <- brm(rating ~ period + carry, data = inhaler) summary(fit2) # compute model-averaged predicted values (df <- unique(inhaler[, c("treat", "period", "carry")])) pp_average(fit1, fit2, newdata = df) # compute model-averaged fitted values pp_average(fit1, fit2, method = "fitted", newdata = df) } } \seealso{ \code{\link{model_weights}}, \code{\link{posterior_average}} } brms/man/cor_bsts.Rd0000644000176200001440000000157613567776477014143 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_bsts} \alias{cor_bsts} \title{(Defunct) Basic Bayesian Structural Time Series} \usage{ cor_bsts(formula = ~1) } \arguments{ \item{formula}{A one sided formula of the form \code{~ t}, or \code{~ t | g}, specifying a time covariate \code{t} and, optionally, a grouping factor \code{g}. A covariate for this correlation structure must be integer valued. When a grouping factor is present in \code{formula}, the correlation structure is assumed to apply only to observations within the same grouping level; observations with different grouping levels are assumed to be uncorrelated. Defaults to \code{~ 1}, which corresponds to using the order of the observations in the data as a covariate, and no groups.} } \description{ The BSTS correlation structure is no longer supported. } \keyword{internal} brms/man/VarCorr.brmsfit.Rd0000644000176200001440000000330213601201144015270 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{VarCorr.brmsfit} \alias{VarCorr.brmsfit} \alias{VarCorr} \title{Extract Variance and Correlation Components} \usage{ \method{VarCorr}{brmsfit}( x, sigma = 1, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ... ) } \arguments{ \item{x}{An object of class \code{brmsfit}.} \item{sigma}{Ignored (included for compatibility with \code{\link[nlme:VarCorr]{VarCorr}}).} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{...}{Currently ignored.} } \value{ A list of lists (one per grouping factor), each with three elements: a matrix containing the standard deviations, an array containing the correlation matrix, and an array containing the covariance matrix with variances on the diagonal. } \description{ This function calculates the estimated standard deviations, correlations and covariances of the group-level terms in a multilevel model of class \code{brmsfit}. For linear models, the residual standard deviations, correlations and covariances are also returned. } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), data = epilepsy, family = gaussian(), chains = 2) VarCorr(fit) } } brms/man/arma.Rd0000644000176200001440000000353413611651307013207 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ac.R \name{arma} \alias{arma} \title{Set up ARMA(p,q) correlation structures} \usage{ arma(time = NA, gr = NA, p = 1, q = 1, cov = FALSE) } \arguments{ \item{time}{An optional time variable specifying the time ordering of the observations. By default, the existing order of the observations in the data is used.} \item{gr}{An optional grouping variable. If specified, the correlation structure is assumed to apply only to observations within the same grouping level.} \item{p}{A non-negative integer specifying the autoregressive (AR) order of the ARMA structure. Default is \code{1}.} \item{q}{A non-negative integer specifying the moving average (MA) order of the ARMA structure. Default is \code{1}.} \item{cov}{A flag indicating whether ARMA effects should be estimated by means of residual covariance matrices. This is currently only possible for stationary ARMA effects of order 1. If the model family does not have natural residuals, latent residuals are added automatically. If \code{FALSE} (the default), a regression formulation is used that is considerably faster and allows for ARMA effects of order higher than 1 but is only available for \code{gaussian} models and some of its generalizations.} } \value{ An object of class \code{'arma_term'}, which is a list of arguments to be interpreted by the formula parsing functions of \pkg{brms}. } \description{ Set up an autoregressive moving average (ARMA) term of order (p, q) in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with ARMA terms. } \examples{ \dontrun{ data("LakeHuron") LakeHuron <- as.data.frame(LakeHuron) fit <- brm(x ~ arma(p = 2, q = 1), data = LakeHuron) summary(fit) } } \seealso{ \code{\link{autocor-terms}}, \code{\link{ar}}, \code{\link{ma}}, } brms/man/mm.Rd0000644000176200001440000000332613606623217012702 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-re.R \name{mm} \alias{mm} \title{Set up multi-membership grouping terms in \pkg{brms}} \usage{ mm(..., weights = NULL, scale = TRUE, dist = "gaussian") } \arguments{ \item{...}{One or more terms containing grouping factors.} \item{weights}{A matrix specifying the weights of each member. It should have as many columns as grouping terms specified in \code{...}. If \code{NULL} (the default), equally weights are used.} \item{scale}{Logical; if \code{TRUE} (the default), weights are standardized in order to sum to one per row. If negative weights are specified, \code{scale} needs to be set to \code{FALSE}.} \item{dist}{Name of the distribution of the group-level effects. Currently \code{"gaussian"} is the only option.} } \description{ Function to set up a multi-membership grouping term in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with grouping terms. } \examples{ \dontrun{ # simulate some data dat <- data.frame( y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), g1 = sample(1:10, 100, TRUE), g2 = sample(1:10, 100, TRUE) ) # multi-membership model with two members per group and equal weights fit1 <- brm(y ~ x1 + (1|mm(g1, g2)), data = dat) summary(fit1) # weight the first member two times for than the second member dat$w1 <- rep(2, 100) dat$w2 <- rep(1, 100) fit2 <- brm(y ~ x1 + (1|mm(g1, g2, weights = cbind(w1, w2))), data = dat) summary(fit2) # multi-membership model with level specific covariate values dat$xc <- (dat$x1 + dat$x2) / 2 fit3 <- brm(y ~ xc + (1 + mmc(x1, x2) | mm(g1, g2)), data = dat) summary(fit3) } } \seealso{ \code{\link{brmsformula}}, \code{\link{mmc}} } brms/man/set_prior.Rd0000644000176200001440000004433613612313327014300 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R \name{set_prior} \alias{set_prior} \alias{brmsprior} \alias{brmsprior-class} \alias{prior} \alias{prior_} \alias{prior_string} \alias{empty_prior} \title{Prior Definitions for \pkg{brms} Models} \usage{ set_prior( prior, class = "b", coef = "", group = "", resp = "", dpar = "", nlpar = "", lb = NA, ub = NA, check = TRUE ) prior(prior, ...) prior_(prior, ...) prior_string(prior, ...) empty_prior() } \arguments{ \item{prior}{A character string defining a distribution in \pkg{Stan} language} \item{class}{The parameter class. Defaults to \code{"b"} (i.e. population-level effects). See 'Details' for other valid parameter classes.} \item{coef}{Name of the coefficient within the parameter class.} \item{group}{Grouping factor for group-level parameters.} \item{resp}{Name of the response variable. Only used in multivariate models.} \item{dpar}{Name of a distributional parameter. Only used in distributional models.} \item{nlpar}{Name of a non-linear parameter. Only used in non-linear models.} \item{lb}{Lower bound for parameter restriction. Currently only allowed for classes \code{"b"}. Defaults to \code{NULL}, that is no restriction.} \item{ub}{Upper bound for parameter restriction. Currently only allowed for classes \code{"b"}. Defaults to \code{NULL}, that is no restriction.} \item{check}{Logical; Indicates whether priors should be checked for validity (as far as possible). Defaults to \code{TRUE}. If \code{FALSE}, \code{prior} is passed to the Stan code as is, and all other arguments are ignored.} \item{...}{Arguments passed to \code{set_prior}.} } \value{ An object of class \code{brmsprior} to be used in the \code{prior} argument of \code{\link{brm}}. } \description{ Define priors for specific parameters or classes of parameters. } \details{ \code{set_prior} is used to define prior distributions for parameters in \pkg{brms} models. The functions \code{prior}, \code{prior_}, and \code{prior_string} are aliases of \code{set_prior} each allowing for a different kind of argument specification. \code{prior} allows specifying arguments as expression without quotation marks using non-standard evaluation. \code{prior_} allows specifying arguments as one-sided formulas or wrapped in \code{quote}. \code{prior_string} allows specifying arguments as strings just as \code{set_prior} itself. Below, we explain its usage and list some common prior distributions for parameters. A complete overview on possible prior distributions is given in the Stan Reference Manual available at \url{http://mc-stan.org/}. To combine multiple priors, use \code{c(...)} or the \code{+} operator (see 'Examples'). \pkg{brms} does not check if the priors are written in correct \pkg{Stan} language. Instead, \pkg{Stan} will check their syntactical correctness when the model is parsed to \code{C++} and returns an error if they are not. This, however, does not imply that priors are always meaningful if they are accepted by \pkg{Stan}. Although \pkg{brms} trys to find common problems (e.g., setting bounded priors on unbounded parameters), there is no guarantee that the defined priors are reasonable for the model. Below, we list the types of parameters in \pkg{brms} models, for which the user can specify prior distributions. 1. Population-level ('fixed') effects Every Population-level effect has its own regression parameter represents the name of the corresponding population-level effect. Suppose, for instance, that \code{y} is predicted by \code{x1} and \code{x2} (i.e., \code{y ~ x1 + x2} in formula syntax). Then, \code{x1} and \code{x2} have regression parameters \code{b_x1} and \code{b_x2} respectively. The default prior for population-level effects (including monotonic and category specific effects) is an improper flat prior over the reals. Other common options are normal priors or student-t priors. If we want to have a normal prior with mean 0 and standard deviation 5 for \code{x1}, and a unit student-t prior with 10 degrees of freedom for \code{x2}, we can specify this via \code{set_prior("normal(0,5)", class = "b", coef = "x1")} and \cr \code{set_prior("student_t(10,0,1)", class = "b", coef = "x2")}. To put the same prior on all population-level effects at once, we may write as a shortcut \code{set_prior("", class = "b")}. This also leads to faster sampling, because priors can be vectorized in this case. Both ways of defining priors can be combined using for instance \code{set_prior("normal(0,2)", class = "b")} and \cr \code{set_prior("normal(0,10)", class = "b", coef = "x1")} at the same time. This will set a \code{normal(0,10)} prior on the effect of \code{x1} and a \code{normal(0,2)} prior on all other population-level effects. However, this will break vectorization and may slow down the sampling procedure a bit. In case of the default intercept parameterization (discussed in the 'Details' section of \code{\link{brmsformula}}), general priors on class \code{"b"} will \emph{not} affect the intercept. Instead, the intercept has its own parameter class named \code{"Intercept"} and priors can thus be specified via \code{set_prior("", class = "Intercept")}. Setting a prior on the intercept will not break vectorization of the other population-level effects. Note that technically, this prior is set on an intercept that results when internally centering all population-level predictors around zero to improve sampling efficiency. On this centered intercept, specifying a prior is actually much easier and intuitive than on the original intercept, since the former represents the expected response value when all predictors are at their means. To treat the intercept as an ordinary population-level effect and avoid the centering parameterization, use \code{0 + intercept} on the right-hand side of the model formula. A special shrinkage prior to be applied on population-level effects is the (regularized) horseshoe prior and related priors. See \code{\link{horseshoe}} for details. Another shrinkage prior is the so-called lasso prior. See \code{\link{lasso}} for details. In non-linear models, population-level effects are defined separately for each non-linear parameter. Accordingly, it is necessary to specify the non-linear parameter in \code{set_prior} so that priors we can be assigned correctly. If, for instance, \code{alpha} is the parameter and \code{x} the predictor for which we want to define the prior, we can write \code{set_prior("", coef = "x", nlpar = "alpha")}. As a shortcut we can use \code{set_prior("", nlpar = "alpha")} to set the same prior on all population-level effects of \code{alpha} at once. If desired, population-level effects can be restricted to fall only within a certain interval using the \code{lb} and \code{ub} arguments of \code{set_prior}. This is often required when defining priors that are not defined everywhere on the real line, such as uniform or gamma priors. When defining a \code{uniform(2,4)} prior, you should write \code{set_prior("uniform(2,4)", lb = 2, ub = 4)}. When using a prior that is defined on the positive reals only (such as a gamma prior) set \code{lb = 0}. In most situations, it is not useful to restrict population-level parameters through bounded priors (non-linear models are an important exception), but if you really want to this is the way to go. 2. Standard deviations of group-level ('random') effects Each group-level effect of each grouping factor has a standard deviation named \code{sd__}. Consider, for instance, the formula \code{y ~ x1 + x2 + (1 + x1 | g)}. We see that the intercept as well as \code{x1} are group-level effects nested in the grouping factor \code{g}. The corresponding standard deviation parameters are named as \code{sd_g_Intercept} and \code{sd_g_x1} respectively. These parameters are restricted to be non-negative and, by default, have a half student-t prior with 3 degrees of freedom and a scale parameter that depends on the standard deviation of the response after applying the link function. Minimally, the scale parameter is 10. This prior is used (a) to be only very weakly informative in order to influence results as few as possible, while (b) providing at least some regularization to considerably improve convergence and sampling efficiency. To define a prior distribution only for standard deviations of a specific grouping factor, use \cr \code{set_prior("", class = "sd", group = "")}. To define a prior distribution only for a specific standard deviation of a specific grouping factor, you may write \cr \code{set_prior("", class = "sd", group = "", coef = "")}. Recommendations on useful prior distributions for standard deviations are given in Gelman (2006), but note that he is no longer recommending uniform priors, anymore. \cr When defining priors on group-level parameters in non-linear models, please make sure to specify the corresponding non-linear parameter through the \code{nlpar} argument in the same way as for population-level effects. 3. Correlations of group-level ('random') effects If there is more than one group-level effect per grouping factor, the correlations between those effects have to be estimated. The prior \code{lkj_corr_cholesky(eta)} or in short \code{lkj(eta)} with \code{eta > 0} is essentially the only prior for (Cholesky factors) of correlation matrices. If \code{eta = 1} (the default) all correlations matrices are equally likely a priori. If \code{eta > 1}, extreme correlations become less likely, whereas \code{0 < eta < 1} results in higher probabilities for extreme correlations. Correlation matrix parameters in \code{brms} models are named as \code{cor_}, (e.g., \code{cor_g} if \code{g} is the grouping factor). To set the same prior on every correlation matrix, use for instance \code{set_prior("lkj(2)", class = "cor")}. Internally, the priors are transformed to be put on the Cholesky factors of the correlation matrices to improve efficiency and numerical stability. The corresponding parameter class of the Cholesky factors is \code{L}, but it is not recommended to specify priors for this parameter class directly. 4. Splines Splines are implemented in \pkg{brms} using the 'random effects' formulation as explained in \code{\link[mgcv:gamm]{gamm}}). Thus, each spline has its corresponding standard deviations modeling the variability within this term. In \pkg{brms}, this parameter class is called \code{sds} and priors can be specified via \code{set_prior("", class = "sds", coef = "")}. The default prior is the same as for standard deviations of group-level effects. 5. Gaussian processes Gaussian processes as currently implemented in \pkg{brms} have two parameters, the standard deviation parameter \code{sdgp}, and characteristic length-scale parameter \code{lscale} (see \code{\link{gp}} for more details). The default prior of \code{sdgp} is the same as for standard deviations of group-level effects. The default prior of \code{lscale} is an informative inverse-gamma prior specifically tuned to the covariates of the Gaussian process (for more details see \url{https://betanalpha.github.io/assets/case_studies/gp_part3/part3.html}). This tuned prior may be overly informative in some cases, so please consider other priors as well to make sure inference is robust to the prior specification. If tuning fails, a half-normal prior is used instead. 6. Autocorrelation parameters The autocorrelation parameters currently implemented are named \code{ar} (autoregression), \code{ma} (moving average), \code{arr} (autoregression of the response), \code{car} (spatial conditional autoregression), as well as \code{lagsar} and \code{errorsar} (Spatial simultaneous autoregression). Priors can be defined by \code{set_prior("", class = "ar")} for \code{ar} and similar for other autocorrelation parameters. By default, \code{ar} and \code{ma} are bounded between \code{-1} and \code{1}, \code{car}, \code{lagsar}, and \code{errorsar} are bounded between \code{0}, and \code{1}, and \code{arr} is unbounded (you may change this by using the arguments \code{lb} and \code{ub}). The default prior is flat over the definition area. 7. Distance parameters of monotonic effects As explained in the details section of \code{\link{brm}}, monotonic effects make use of a special parameter vector to estimate the 'normalized distances' between consecutive predictor categories. This is realized in \pkg{Stan} using the \code{simplex} parameter type. This class is named \code{"simo"} (short for simplex monotonic) in \pkg{brms}. The only valid prior for simplex parameters is the dirichlet prior, which accepts a vector of length \code{K - 1} (K = number of predictor categories) as input defining the 'concentration' of the distribution. Explaining the dirichlet prior is beyond the scope of this documentation, but we want to describe how to define this prior syntactically correct. If a predictor \code{x} with \code{K} categories is modeled as monotonic, we can define a prior on its corresponding simplex via \cr \code{prior(dirichlet(), class = simo, coef = mox1)}. The \code{1} in the end of \code{coef} indicates that this is the first simplex in this term. If interactions between multiple monotonic variables are modeled, multiple simplexes per term are required. For \code{}, we can put in any \code{R} expression defining a vector of length \code{K - 1}. The default is a uniform prior (i.e. \code{ = rep(1, K-1)}) over all simplexes of the respective dimension. 8. Parameters for specific families Some families need additional parameters to be estimated. Families \code{gaussian}, \code{student}, \code{skew_normal}, \code{lognormal}, and \code{gen_extreme_value} need the parameter \code{sigma} to account for the residual standard deviation. By default, \code{sigma} has a half student-t prior that scales in the same way as the group-level standard deviations. Further, family \code{student} needs the parameter \code{nu} representing the degrees of freedom of students-t distribution. By default, \code{nu} has prior \code{gamma(2, 0.1)} and a fixed lower bound of \code{1}. Families \code{gamma}, \code{weibull}, \code{inverse.gaussian}, and \code{negbinomial} need a \code{shape} parameter that has a \code{gamma(0.01, 0.01)} prior by default. For families \code{cumulative}, \code{cratio}, \code{sratio}, and \code{acat}, and only if \code{threshold = "equidistant"}, the parameter \code{delta} is used to model the distance between two adjacent thresholds. By default, \code{delta} has an improper flat prior over the reals. The \code{von_mises} family needs the parameter \code{kappa}, representing the concentration parameter. By default, \code{kappa} has prior \code{gamma(2, 0.01)}. \cr Every family specific parameter has its own prior class, so that \code{set_prior("", class = "")} is the right way to go. All of these priors are chosen to be weakly informative, having only minimal influence on the estimations, while improving convergence and sampling efficiency. Fixing parameters to constants is possible by using the \code{constant} function, for example, \code{constant(1)} to fix a parameter to 1. Broadcasting to vectors and matrices is done automatically. A limitation of the current implementation is that the same parameter vector cannot contain estimated and fixed values at the same time, but this will be possible in the future. Often, it may not be immediately clear, which parameters are present in the model. To get a full list of parameters and parameter classes for which priors can be specified (depending on the model) use function \code{\link{get_prior}}. } \section{Functions}{ \itemize{ \item \code{prior}: Alias of \code{set_prior} allowing to specify arguments as expressions without quotation marks. \item \code{prior_}: Alias of \code{set_prior} allowing to specify arguments as as one-sided formulas or wrapped in \code{quote}. \item \code{prior_string}: Alias of \code{set_prior} allowing to specify arguments as strings. \item \code{empty_prior}: Create an empty \code{brmsprior} object. }} \examples{ ## use alias functions (prior1 <- prior(cauchy(0, 1), class = sd)) (prior2 <- prior_(~cauchy(0, 1), class = ~sd)) (prior3 <- prior_string("cauchy(0, 1)", class = "sd")) identical(prior1, prior2) identical(prior1, prior3) # check which parameters can have priors get_prior(rating ~ treat + period + carry + (1|subject), data = inhaler, family = cumulative()) # define some priors bprior <- c(prior_string("normal(0,10)", class = "b"), prior(normal(1,2), class = b, coef = treat), prior_(~cauchy(0,2), class = ~sd, group = ~subject, coef = ~Intercept)) # verify that the priors indeed found their way into Stan's model code make_stancode(rating ~ treat + period + carry + (1|subject), data = inhaler, family = cumulative(), prior = bprior) # use the horseshoe prior to model sparsity in regression coefficients make_stancode(count ~ zAge + zBase * Trt, data = epilepsy, family = poisson(), prior = set_prior("horseshoe(3)")) # fix certain priors to constants bprior <- prior(constant(1), class = "b") + prior(constant(2), class = "b", coef = "zBase") + prior(constant(0.5), class = "sd") make_stancode(count ~ zAge + zBase + (1 | patient), data = epilepsy, prior = bprior) # pass priors to Stan without checking prior <- prior_string("target += normal_lpdf(b[1] | 0, 1)", check = FALSE) make_stancode(count ~ Trt, data = epilepsy, prior = prior) } \references{ Gelman A. (2006). Prior distributions for variance parameters in hierarchical models. Bayesian analysis, 1(3), 515 -- 534. } \seealso{ \code{\link{get_prior}} } brms/man/is.brmsprior.Rd0000644000176200001440000000047013623751614014721 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R \name{is.brmsprior} \alias{is.brmsprior} \title{Checks if argument is a \code{brmsprior} object} \usage{ is.brmsprior(x) } \arguments{ \item{x}{An \R object} } \description{ Checks if argument is a \code{brmsprior} object } brms/man/diagnostic-quantities.Rd0000644000176200001440000000275413601151454016577 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/diagnostics.R \name{diagnostic-quantities} \alias{diagnostic-quantities} \alias{log_posterior} \alias{nuts_params} \alias{rhat} \alias{neff_ratio} \alias{log_posterior.brmsfit} \alias{nuts_params.brmsfit} \alias{rhat.brmsfit} \alias{neff_ratio.brmsfit} \title{Extract Diagnostic Quantities of \pkg{brms} Models} \usage{ \method{log_posterior}{brmsfit}(object, ...) \method{nuts_params}{brmsfit}(object, pars = NULL, ...) \method{rhat}{brmsfit}(object, pars = NULL, ...) \method{neff_ratio}{brmsfit}(object, pars = NULL, ...) } \arguments{ \item{object}{A \code{brmsfit} object.} \item{...}{Arguments passed to individual methods.} \item{pars}{An optional character vector of parameter names. For \code{nuts_params} these will be NUTS sampler parameter names rather than model parameters. If pars is omitted all parameters are included.} } \value{ The exact form of the output depends on the method. } \description{ Extract quantities that can be used to diagnose sampling behavior of the algorithms applied by \pkg{Stan} at the back-end of \pkg{brms}. } \details{ For more details see \code{\link[bayesplot:bayesplot-extractors]{bayesplot-extractors}}. } \examples{ \dontrun{ fit <- brm(time ~ age * sex, data = kidney) lp <- log_posterior(fit) head(lp) np <- nuts_params(fit) str(np) # extract the number of divergence transitions sum(subset(np, Parameter == "divergent__")$Value) head(rhat(fit)) head(neff_ratio(fit)) } } brms/man/add_criterion.Rd0000644000176200001440000000450313605604042015067 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo.R \name{add_criterion} \alias{add_criterion} \alias{add_criterion.brmsfit} \title{Add model fit criteria to model objects} \usage{ add_criterion(x, ...) \method{add_criterion}{brmsfit}( x, criterion, model_name = NULL, overwrite = FALSE, file = NULL, force_save = FALSE, ... ) } \arguments{ \item{x}{An \R object typically of class \code{brmsfit}.} \item{...}{Further arguments passed to the underlying functions computing the model fit criteria.} \item{criterion}{Names of model fit criteria to compute. Currently supported are \code{"loo"}, \code{"waic"}, \code{"kfold"}, \code{"loo_subsample"}, \code{"bayes_R2"} (Bayesian R-squared), \code{"loo_R2"} (LOO-adjusted R-squared), and \code{"marglik"} (log marginal likelihood).} \item{model_name}{Optional name of the model. If \code{NULL} (the default) the name is taken from the call to \code{x}.} \item{overwrite}{Logical; Indicates if already stored fit indices should be overwritten. Defaults to \code{FALSE}.} \item{file}{Either \code{NULL} or a character string. In the latter case, the fitted model object including the newly added criterion values is saved via \code{\link{saveRDS}} in a file named after the string supplied in \code{file}. The \code{.rds} extension is added automatically. If \code{x} was already stored in a file before, the file name will be reused automatically (with a message) unless overwritten by \code{file}. In any case, \code{file} only applies if new criteria were actually added via \code{add_criterion} or if \code{force_save} was set to \code{TRUE}.} \item{force_save}{Logical; only relevant if \code{file} is specified and ignored otherwise. If \code{TRUE}, the fitted model object will be saved regardless of whether new criteria were added via \code{add_criterion}.} } \value{ An object of the same class as \code{x}, but with model fit criteria added for later usage. } \description{ Add model fit criteria to model objects } \details{ Functions \code{add_loo} and \code{add_waic} are aliases of \code{add_criterion} with fixed values for the \code{criterion} argument. } \examples{ \dontrun{ fit <- brm(count ~ Trt, data = epilepsy) # add both LOO and WAIC at once fit <- add_criterion(fit, c("loo", "waic")) print(fit$criteria$loo) print(fit$criteria$waic) } } brms/man/vcov.brmsfit.Rd0000644000176200001440000000210213565500267014705 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{vcov.brmsfit} \alias{vcov.brmsfit} \title{Covariance and Correlation Matrix of Population-Level Effects} \usage{ \method{vcov}{brmsfit}(object, correlation = FALSE, pars = NULL, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{correlation}{Logical; if \code{FALSE} (the default), compute the covariance matrix, if \code{TRUE}, compute the correlation matrix.} \item{pars}{Optional names of coefficients to extract. By default, all coefficients are extracted.} \item{...}{Currently ignored.} } \value{ covariance or correlation matrix of population-level parameters } \description{ Get a point estimate of the covariance or correlation matrix of population-level parameters } \details{ Estimates are obtained by calculating the maximum likelihood covariances (correlations) of the posterior samples. } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), data = epilepsy, family = gaussian(), chains = 2) vcov(fit) } } brms/man/mvbrmsformula.Rd0000644000176200001440000000274513565500267015174 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsformula.R \name{mvbrmsformula} \alias{mvbrmsformula} \alias{mvbf} \title{Set up a multivariate model formula for use in \pkg{brms}} \usage{ mvbrmsformula(..., flist = NULL, rescor = NULL) } \arguments{ \item{...}{Objects of class \code{formula} or \code{brmsformula}, each specifying a univariate model. See \code{\link{brmsformula}} for details on how to specify univariate models.} \item{flist}{Optional list of formulas, which are treated in the same way as formulas passed via the \code{...} argument.} \item{rescor}{Logical; Indicates if residual correlation between the response variables should be modeled. Currently, this is only possible in multivariate \code{gaussian} and \code{student} models. If \code{NULL} (the default), \code{rescor} is internally set to \code{TRUE} when possible.} } \value{ An object of class \code{mvbrmsformula}, which is essentially a \code{list} containing all model formulas as well as some additional information for multivariate models. } \description{ Set up a multivariate model formula for use in the \pkg{brms} package allowing to define (potentially non-linear) additive multilevel models for all parameters of the assumed response distributions. } \details{ See \code{vignette("brms_multivariate")} for a case study. } \examples{ bf1 <- bf(y1 ~ x + (1|g)) bf2 <- bf(y2 ~ s(z)) mvbf(bf1, bf2) } \seealso{ \code{\link{brmsformula}}, \code{\link{brmsformula-helpers}} } brms/man/make_standata.Rd0000644000176200001440000001154513611651307015064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/make_standata.R \name{make_standata} \alias{make_standata} \title{Data for \pkg{brms} Models} \usage{ make_standata( formula, data, family = gaussian(), prior = NULL, data2 = NULL, autocor = NULL, cov_ranef = NULL, sample_prior = c("no", "yes", "only"), stanvars = NULL, knots = NULL, check_response = TRUE, only_response = FALSE, control = list(), ... ) } \arguments{ \item{formula}{An object of class \code{\link[stats:formula]{formula}}, \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can be coerced to that classes): A symbolic description of the model to be fitted. The details of model specification are explained in \code{\link{brmsformula}}.} \item{data}{An object of class \code{data.frame} (or one that can be coerced to that class) containing data of all variables used in the model.} \item{family}{A description of the response distribution and link function to be used in the model. This can be a family function, a call to a family function or a character string naming the family. Every family function has a \code{link} argument allowing to specify the link function to be applied on the response variable. If not specified, default links are used. For details of supported families see \code{\link{brmsfamily}}. By default, a linear \code{gaussian} model is applied. In multivariate models, \code{family} might also be a list of families.} \item{prior}{One or more \code{brmsprior} objects created by \code{\link{set_prior}} or related functions and combined using the \code{c} method or the \code{+} operator. See also \code{\link{get_prior}} for more help.} \item{data2}{A named \code{list} of objects containing data, which cannot be passed via argument \code{data}. Required for some objects used in autocorrelation structures to specify dependency structures.} \item{autocor}{(Deprecated) An optional \code{\link{cor_brms}} object describing the correlation structure within the response variable (i.e., the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for a description of the available correlation structures. Defaults to \code{NULL}, corresponding to no correlations. In multivariate models, \code{autocor} might also be a list of autocorrelation structures. It is now recommend to specify autocorrelation terms directly within \code{formula}. See \code{\link{brmsformula}} for more details.} \item{cov_ranef}{A list of matrices that are proportional to the (within) covariance structure of the group-level effects. The names of the matrices should correspond to columns in \code{data} that are used as grouping factors. All levels of the grouping factor should appear as rownames of the corresponding matrix. This argument can be used, among others to model pedigrees and phylogenetic effects. See \code{vignette("brms_phylogenetics")} for more details.} \item{sample_prior}{Indicate if samples from priors should be drawn additionally to the posterior samples (defaults to \code{"no"}). Among others, these samples can be used to calculate Bayes factors for point hypotheses via \code{\link{hypothesis}}. Please note that improper priors are not sampled, including the default improper priors used by \code{brm}. See \code{\link{set_prior}} on how to set (proper) priors. Please also note that prior samples for the overall intercept are not obtained by default for technical reasons. See \code{\link{brmsformula}} how to obtain prior samples for the intercept. If \code{sample_prior} is set to \code{"only"}, samples are drawn solely from the priors ignoring the likelihood, which allows among others to generate samples from the prior predictive distribution. In this case, all parameters must have proper priors.} \item{stanvars}{An optional \code{stanvars} object generated by function \code{\link{stanvar}} to define additional variables for use in \pkg{Stan}'s program blocks.} \item{knots}{Optional list containing user specified knot values to be used for basis construction of smoothing terms. See \code{\link[mgcv:gamm]{gamm}} for more details.} \item{check_response}{Logical; check validity of the response?} \item{only_response}{Logical; extract data related to the response only?} \item{control}{A named list currently for internal usage only} \item{...}{Other potential arguments} } \value{ A named list of objects containing the required data to fit a \pkg{brms} model with \pkg{Stan}. } \description{ Generate data for \pkg{brms} models to be passed to \pkg{Stan} } \examples{ data1 <- make_standata(rating ~ treat + period + carry + (1|subject), data = inhaler, family = "cumulative") names(data1) data2 <- make_standata(count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = "poisson") names(data2) } \author{ Paul-Christian Buerkner \email{paul.buerkner@gmail.com} } brms/man/prior_summary.brmsfit.Rd0000644000176200001440000000211613601151454016634 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.R \name{prior_summary.brmsfit} \alias{prior_summary.brmsfit} \alias{prior_summary} \title{Extract Priors of a Bayesian Model Fitted with \pkg{brms}} \usage{ \method{prior_summary}{brmsfit}(object, all = TRUE, ...) } \arguments{ \item{object}{A \code{brmsfit} object} \item{all}{Logical; Show all parameters in the model which may have priors (\code{TRUE}) or only those with proper priors (\code{FALSE})?} \item{...}{Further arguments passed to or from other methods.} } \value{ For \code{brmsfit} objects, an object of class \code{brmsprior}. } \description{ Extract Priors of a Bayesian Model Fitted with \pkg{brms} } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson(), prior = c(prior(student_t(5,0,10), class = b), prior(cauchy(0,2), class = sd))) prior_summary(fit) prior_summary(fit, all = FALSE) print(prior_summary(fit, all = FALSE), show_df = FALSE) } } brms/man/nsamples.brmsfit.Rd0000644000176200001440000000121013565500267015551 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{nsamples.brmsfit} \alias{nsamples.brmsfit} \alias{nsamples} \title{Number of Posterior Samples} \usage{ \method{nsamples}{brmsfit}(object, subset = NULL, incl_warmup = FALSE, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{subset}{An optional integer vector defining a subset of samples to be considered.} \item{incl_warmup}{A flag indicating whether to also count warmup / burn-in samples.} \item{...}{Currently ignored.} } \description{ Extract the number of posterior samples stored in a fitted Bayesian model. } brms/man/fitted.brmsfit.Rd0000644000176200001440000001074713603652171015220 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pp_expect.R \name{fitted.brmsfit} \alias{fitted.brmsfit} \title{Expected Values of the Posterior Predictive Distribution} \usage{ \method{fitted}{brmsfit}( object, newdata = NULL, re_formula = NULL, scale = c("response", "linear"), resp = NULL, dpar = NULL, nlpar = NULL, nsamples = NULL, subset = NULL, sort = FALSE, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{scale}{Either \code{"response"} or \code{"linear"}. If \code{"response"}, results are returned on the scale of the response variable. If \code{"linear"}, results are returned on the scale of the linear predictor term, that is without applying the inverse link function or other transformations.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{dpar}{Optional name of a predicted distributional parameter. If specified, fitted values of this parameters are returned.} \item{nlpar}{Optional name of a predicted non-linear parameter. If specified, fitted values of this parameters are returned.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{sort}{Logical. Only relevant for time series models. Indicating whether to return predicted values in the original order (\code{FALSE}; default) or in the order of the time series (\code{TRUE}).} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}..} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ An \code{array} of predicted \emph{mean} response values. If \code{summary = FALSE} the output resembles those of \code{\link{pp_expect.brmsfit}}. If \code{summary = TRUE} the output depends on the family: For categorical and ordinal families, the output is an N x E x C array, where N is the number of observations, E is the number of summary statistics, and C is the number of categories. For all other families, the output is an N x E matrix. The number of summary statistics E is equal to \code{2 + length(probs)}: The \code{Estimate} column contains point estimates (either mean or median depending on argument \code{robust}), while the \code{Est.Error} column contains uncertainty estimates (either standard deviation or median absolute deviation depending on argument \code{robust}). The remaining columns starting with \code{Q} contain quantile estimates as specifed via argument \code{probs}. In multivariate models, an additional dimension is added to the output which indexes along the different response variables. } \description{ This method is an alias of \code{\link{pp_expect.brmsfit}} with additional arguments for obtaining summaries of the computed samples. } \examples{ \dontrun{ ## fit a model fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler) ## extract fitted values fitted_values <- fitted(fit) head(fitted_values) ## plot fitted means against actual response dat <- as.data.frame(cbind(Y = standata(fit)$Y, fitted_values)) ggplot(dat) + geom_point(aes(x = Estimate, y = Y)) } } \seealso{ \code{\link{pp_expect.brmsfit}} } brms/man/mo.Rd0000644000176200001440000000270613606623217012705 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-sp.R \name{mo} \alias{mo} \title{Monotonic Predictors in \pkg{brms} Models} \usage{ mo(x) } \arguments{ \item{x}{An integer variable or an ordered factor to be modeled as monotonic.} } \description{ Specify a monotonic predictor term in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model. } \details{ For detailed documentation see \code{help(brmsformula)} as well as \code{vignette("brms_monotonic")}. } \examples{ \dontrun{ # generate some data income_options <- c("below_20", "20_to_40", "40_to_100", "greater_100") income <- factor(sample(income_options, 100, TRUE), levels = income_options, ordered = TRUE) mean_ls <- c(30, 60, 70, 75) ls <- mean_ls[income] + rnorm(100, sd = 7) dat <- data.frame(income, ls) # fit a simple monotonic model fit1 <- brm(ls ~ mo(income), data = dat) # summarise the model summary(fit1) plot(fit1, N = 6) plot(marginal_effects(fit1), points = TRUE) # model interaction with other variables dat$x <- sample(c("a", "b", "c"), 100, TRUE) fit2 <- brm(ls ~ mo(income)*x, data = dat) # summarise the model summary(fit2) plot(marginal_effects(fit2), points = TRUE) } } \references{ Bürkner P. C. & Charpentier, E. (in review). Monotonic Effects: A Principled Approach for Including Ordinal Predictors in Regression Models. PsyArXiv preprint. } \seealso{ \code{\link{brmsformula}} } brms/man/is.cor_brms.Rd0000644000176200001440000000100013567776477014523 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{is.cor_brms} \alias{is.cor_brms} \alias{is.cor_arma} \alias{is.cor_cosy} \alias{is.cor_sar} \alias{is.cor_car} \alias{is.cor_fixed} \title{Check if argument is a correlation structure} \usage{ is.cor_brms(x) is.cor_arma(x) is.cor_cosy(x) is.cor_sar(x) is.cor_car(x) is.cor_fixed(x) } \arguments{ \item{x}{An \R object.} } \description{ Check if argument is one of the correlation structures used in \pkg{brms}. } brms/man/cor_car.Rd0000644000176200001440000000455013611651306013675 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_car} \alias{cor_car} \alias{cor_icar} \title{(Deprecated) Spatial conditional autoregressive (CAR) structures} \usage{ cor_car(W, formula = ~1, type = "escar") cor_icar(W, formula = ~1) } \arguments{ \item{W}{Adjacency matrix of locations. All non-zero entries are treated as if the two locations are adjacent. If \code{formula} contains a grouping factor, the row names of \code{W} have to match the levels of the grouping factor.} \item{formula}{An optional one-sided formula of the form \code{~ 1 | g}, where \code{g} is a grouping factor mapping observations to spatial locations. If not specified, each observation is treated as a separate location. It is recommended to always specify a grouping factor to allow for handling of new data in post-processing methods.} \item{type}{Type of the CAR structure. Currently implemented are \code{"escar"} (exact sparse CAR), \code{"esicar"} (exact sparse intrinsic CAR), \code{"icar"} (intrinsic CAR), and \code{"bym2"}. More information is provided in the 'Details' section.} } \description{ These function are deprecated. Please see \code{\link{car}} for the new syntax. These functions are constructors for the \code{cor_car} class implementing spatial conditional autoregressive structures. } \details{ The \code{escar} and \code{esicar} types are implemented based on the case study of Max Joseph (\url{https://github.com/mbjoseph/CARstan}). The \code{icar} and \code{bym2} type is implemented based on the case study of Mitzi Morris (\url{http://mc-stan.org/users/documentation/case-studies/icar_stan.html}). } \examples{ \dontrun{ # generate some spatial data east <- north <- 1:10 Grid <- expand.grid(east, north) K <- nrow(Grid) # set up distance and neighbourhood matrices distance <- as.matrix(dist(Grid)) W <- array(0, c(K, K)) W[distance == 1] <- 1 # generate the covariates and response data x1 <- rnorm(K) x2 <- rnorm(K) theta <- rnorm(K, sd = 0.05) phi <- rmulti_normal( 1, mu = rep(0, K), Sigma = 0.4 * exp(-0.1 * distance) ) eta <- x1 + x2 + phi prob <- exp(eta) / (1 + exp(eta)) size <- rep(50, K) y <- rbinom(n = K, size = size, prob = prob) dat <- data.frame(y, size, x1, x2) # fit a CAR model fit <- brm(y | trials(size) ~ x1 + x2, data = dat, family = binomial(), autocor = cor_car(W)) summary(fit) } } brms/man/posterior_summary.Rd0000644000176200001440000000260713601153642016070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.R \name{posterior_summary} \alias{posterior_summary} \alias{posterior_summary.default} \alias{posterior_summary.brmsfit} \title{Summarize Posterior Samples} \usage{ posterior_summary(x, ...) \method{posterior_summary}{default}(x, probs = c(0.025, 0.975), robust = FALSE, ...) \method{posterior_summary}{brmsfit}(x, pars = NA, probs = c(0.025, 0.975), robust = FALSE, ...) } \arguments{ \item{x}{An \R object.} \item{...}{More arguments passed to or from other methods.} \item{probs}{The percentiles to be computed by the \code{quantile} function.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead.} \item{pars}{Names of parameters for which posterior samples should be returned, as given by a character vector or regular expressions. By default, all posterior samples of all parameters are extracted.} } \value{ A matrix where rows indicate parameters and columns indicate the summary estimates. } \description{ Summarizes posterior samples based on point estimates (mean or median), estimation errors (SD or MAD) and quantiles. } \examples{ \dontrun{ fit <- brm(time ~ age * sex, data = kidney) posterior_summary(fit) } } brms/man/pp_expect.brmsfit.Rd0000644000176200001440000000677513601124313015724 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pp_expect.R \name{pp_expect.brmsfit} \alias{pp_expect.brmsfit} \alias{pp_expect} \title{Expected Values of the Posterior Predictive Distribution} \usage{ \method{pp_expect}{brmsfit}( object, newdata = NULL, re_formula = NULL, re.form = NULL, resp = NULL, dpar = NULL, nlpar = NULL, nsamples = NULL, subset = NULL, sort = FALSE, ... ) pp_expect(object, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{re.form}{Alias of \code{re_formula}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{dpar}{Optional name of a predicted distributional parameter. If specified, fitted values of this parameters are returned.} \item{nlpar}{Optional name of a predicted non-linear parameter. If specified, fitted values of this parameters are returned.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{sort}{Logical. Only relevant for time series models. Indicating whether to return predicted values in the original order (\code{FALSE}; default) or in the order of the time series (\code{TRUE}).} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ An \code{array} of predicted \emph{mean} response values. For categorical and ordinal models, the output is an S x N x C array. Otherwise, the output is an S x N matrix, where S is the number of posterior samples, N is the number of observations, and C is the number of categories. In multivariate models, an additional dimension is added to the output which indexes along the different response variables. } \description{ Compute posterior samples of the expected value/mean of the posterior predictive distribution. Can be performed for the data used to fit the model (posterior predictive checks) or for new data. By definition, these predictions have smaller variance than the posterior predictions performed by the \code{\link{posterior_predict.brmsfit}} method. This is because only the uncertainty in the mean is incorporated in the samples computed by \code{pp_expect} while any residual error is ignored. However, the estimated means of both methods averaged across samples should be very similar. } \details{ \code{NA} values within factors in \code{newdata}, are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding. } \examples{ \dontrun{ ## fit a model fit <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler) ## extract fitted values ppe <- pp_expect(fit) str(ppe) } } brms/man/cosy.Rd0000644000176200001440000000175013611651307013242 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ac.R \name{cosy} \alias{cosy} \title{Set up COSY correlation structures} \usage{ cosy(time = NA, gr = NA) } \arguments{ \item{time}{An optional time variable specifying the time ordering of the observations. By default, the existing order of the observations in the data is used.} \item{gr}{An optional grouping variable. If specified, the correlation structure is assumed to apply only to observations within the same grouping level.} } \value{ An object of class \code{'cosy_term'}, which is a list of arguments to be interpreted by the formula parsing functions of \pkg{brms}. } \description{ Set up a compounds symmetry (COSY) term in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with COSY terms. } \examples{ \dontrun{ data("lh") lh <- as.data.frame(lh) fit <- brm(x ~ cosy(), data = lh) summary(fit) } } \seealso{ \code{\link{autocor-terms}} } brms/man/cor_brms.Rd0000644000176200001440000000212213611651306014064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_brms} \alias{cor_brms} \alias{cor_brms-class} \title{(Deprecated) Correlation structure classes for the \pkg{brms} package} \description{ Classes of correlation structures available in the \pkg{brms} package. \code{cor_brms} is not a correlation structure itself, but the class common to all correlation structures implemented in \pkg{brms}. } \section{Available correlation structures}{ \describe{ \item{cor_arma}{autoregressive-moving average (ARMA) structure, with arbitrary orders for the autoregressive and moving average components} \item{cor_ar}{autoregressive (AR) structure of arbitrary order} \item{cor_ma}{moving average (MA) structure of arbitrary order} \item{cor_car}{Spatial conditional autoregressive (CAR) structure} \item{cor_sar}{Spatial simultaneous autoregressive (SAR) structure} \item{cor_fixed}{fixed user-defined covariance structure} } } \seealso{ \code{\link{cor_arma}, \link{cor_ar}, \link{cor_ma}, \link{cor_car}, \link{cor_sar}, \link{cor_fixed}} } brms/man/is.mvbrmsterms.Rd0000644000176200001440000000056713623751613015271 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsterms.R \name{is.mvbrmsterms} \alias{is.mvbrmsterms} \title{Checks if argument is a \code{mvbrmsterms} object} \usage{ is.mvbrmsterms(x) } \arguments{ \item{x}{An \R object} } \description{ Checks if argument is a \code{mvbrmsterms} object } \seealso{ \code{\link[brms:parse_bf]{parse_bf}} } brms/man/hypothesis.brmsfit.Rd0000644000176200001440000001426513601110030016114 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hypothesis.R \name{hypothesis.brmsfit} \alias{hypothesis.brmsfit} \alias{hypothesis} \alias{hypothesis.default} \title{Non-Linear Hypothesis Testing} \usage{ \method{hypothesis}{brmsfit}( x, hypothesis, class = "b", group = "", scope = c("standard", "ranef", "coef"), alpha = 0.05, seed = NULL, ... ) hypothesis(x, ...) \method{hypothesis}{default}(x, hypothesis, alpha = 0.05, ...) } \arguments{ \item{x}{An \code{R} object. If it is no \code{brmsfit} object, it must be coercible to a \code{data.frame}.} \item{hypothesis}{A character vector specifying one or more non-linear hypothesis concerning parameters of the model.} \item{class}{A string specifying the class of parameters being tested. Default is "b" for population-level effects. Other typical options are "sd" or "cor". If \code{class = NULL}, all parameters can be tested against each other, but have to be specified with their full name (see also \code{\link[brms:parnames]{parnames}})} \item{group}{Name of a grouping factor to evaluate only group-level effects parameters related to this grouping factor.} \item{scope}{Indicates where to look for the variables specified in \code{hypothesis}. If \code{"standard"}, use the full parameter names (subject to the restriction given by \code{class} and \code{group}). If \code{"coef"} or \code{"ranef"}, compute the hypothesis for all levels of the grouping factor given in \code{"group"}, based on the output of \code{\link{coef.brmsfit}} and \code{\link{ranef.brmsfit}}, respectively.} \item{alpha}{The alpha-level of the tests (default is 0.05; see 'Details' for more information).} \item{seed}{A single numeric value passed to \code{\link{set.seed}} to make results reproducible.} \item{...}{Currently ignored.} } \value{ A \code{\link{brmshypothesis}} object. } \description{ Perform non-linear hypothesis testing for all model parameters. } \details{ Among others, \code{hypothesis} computes an evidence ratio (\code{Evid.Ratio}) for each hypothesis. For a one-sided hypothesis, this is just the posterior probability (\code{Post.Prob}) under the hypothesis against its alternative. That is, when the hypothesis is of the form \code{a > b}, the evidence ratio is the ratio of the posterior probability of \code{a > b} and the posterior probability of \code{a < b}. In this example, values greater than one indicate that the evidence in favor of \code{a > b} is larger than evidence in favor of \code{a < b}. For an two-sided (point) hypothesis, the evidence ratio is a Bayes factor between the hypothesis and its alternative computed via the Savage-Dickey density ratio method. That is the posterior density at the point of interest divided by the prior density at that point. Values greater than one indicate that evidence in favor of the point hypothesis has increased after seeing the data. In order to calculate this Bayes factor, all parameters related to the hypothesis must have proper priors and argument \code{sample_prior} of function \code{brm} must be set to \code{"yes"}. Otherwise \code{Evid.Ratio} (and \code{Post.Prob}) will be \code{NA}. Please note that, for technical reasons, we cannot sample from priors of certain parameters classes. Most notably, these include overall intercept parameters (prior class \code{"Intercept"}) as well as group-level coefficients. When interpreting Bayes factors, make sure that your priors are reasonable and carefully chosen, as the result will depend heavily on the priors. In particular, avoid using default priors. The \code{Evid.Ratio} may sometimes be \code{0} or \code{Inf} implying very small or large evidence, respectively, in favor of the tested hypothesis. For one-sided hypotheses pairs, this basically means that all posterior samples are on the same side of the value dividing the two hypotheses. In that sense, instead of \code{0} or \code{Inf,} you may rather read it as \code{Evid.Ratio} smaller \code{1 / S} or greater \code{S}, respectively, where \code{S} denotes the number of posterior samples used in the computations. The argument \code{alpha} specifies the size of the credible interval (i.e., Bayesian confidence interval). For instance, if we tested a two-sided hypothesis and set \code{alpha = 0.05} (5\%) an, the credible interval will contain \code{1 - alpha = 0.95} (95\%) of the posterior values. Hence, \code{alpha * 100}\% of the posterior values will lie outside of the credible interval. Although this allows testing of hypotheses in a similar manner as in the frequentist null-hypothesis testing framework, we strongly argue against using arbitrary cutoffs (e.g., \code{p < .05}) to determine the 'existence' of an effect. } \examples{ \dontrun{ ## define priors prior <- c(set_prior("normal(0,2)", class = "b"), set_prior("student_t(10,0,1)", class = "sigma"), set_prior("student_t(10,0,1)", class = "sd")) ## fit a linear mixed effects models fit <- brm(time ~ age + sex + disease + (1 + age|patient), data = kidney, family = lognormal(), prior = prior, sample_prior = "yes", control = list(adapt_delta = 0.95)) ## perform two-sided hypothesis testing (hyp1 <- hypothesis(fit, "sexfemale = age + diseasePKD")) plot(hyp1) hypothesis(fit, "exp(age) - 3 = 0", alpha = 0.01) ## perform one-sided hypothesis testing hypothesis(fit, "diseasePKD + diseaseGN - 3 < 0") hypothesis(fit, "age < Intercept", class = "sd", group = "patient") ## test the amount of random intercept variance on all variance h <- paste("sd_patient__Intercept^2 / (sd_patient__Intercept^2 +", "sd_patient__age^2 + sigma^2) = 0") (hyp2 <- hypothesis(fit, h, class = NULL)) plot(hyp2) ## test more than one hypothesis at once h <- c("diseaseGN = diseaseAN", "2 * diseaseGN - diseasePKD = 0") (hyp3 <- hypothesis(fit, h)) plot(hyp3, ignore_prior = TRUE) ## compute hypotheses for all levels of a grouping factor hypothesis(fit, "age = 0", scope = "coef", group = "patient") ## use the default method dat <- as.data.frame(fit) hypothesis(dat, "b_age > 0") } } \seealso{ \code{\link{brmshypothesis}} } \author{ Paul-Christian Buerkner \email{paul.buerkner@gmail.com} } brms/man/family.brmsfit.Rd0000644000176200001440000000113213601155652015206 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{family.brmsfit} \alias{family.brmsfit} \title{Extract Model Family Objects} \usage{ \method{family}{brmsfit}(object, resp = NULL, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{...}{Currently unused.} } \value{ A \code{brmsfamily} object or a list of such objects for multivariate models. } \description{ Extract Model Family Objects } brms/man/expp1.Rd0000644000176200001440000000042713623751614013327 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/numeric-helpers.R \name{expp1} \alias{expp1} \title{Exponential function plus one.} \usage{ expp1(x) } \arguments{ \item{x}{A numeric or complex vector.} } \description{ Computes \code{exp(x) + 1}. } brms/man/kfold_predict.Rd0000644000176200001440000000331613601151454015073 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/kfold.R \name{kfold_predict} \alias{kfold_predict} \title{Predictions from K-Fold Cross-Validation} \usage{ kfold_predict(x, method = c("predict", "fitted"), resp = NULL, ...) } \arguments{ \item{x}{Object of class \code{'kfold'} computed by \code{\link{kfold}}. For \code{kfold_predict} to work, the fitted model objects need to have been stored via argument \code{save_fits} of \code{\link{kfold}}.} \item{method}{The method used to make predictions. Either \code{"predict"} or \code{"fitted"}. See \code{\link{predict.brmsfit}} for details.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ A \code{list} with two slots named \code{'y'} and \code{'yrep'}. Slot \code{y} contains the vector of observed responses. Slot \code{yrep} contains the matrix of predicted responses, with rows being posterior draws and columns being observations. } \description{ Compute and evaluate predictions after performing K-fold cross-validation via \code{\link{kfold}}. } \examples{ \dontrun{ fit <- brm(count ~ zBase * Trt + (1|patient), data = epilepsy, family = poisson()) # perform k-fold cross validation (kf <- kfold(fit, save_fits = TRUE, chains = 1)) # define a loss function rmse <- function(y, yrep) { yrep_mean <- colMeans(yrep) sqrt(mean((yrep_mean - y)^2)) } # predict responses and evaluate the loss kfp <- kfold_predict(kf) rmse(y = kfp$y, yrep = kfp$yrep) } } \seealso{ \code{\link{kfold}} } brms/man/update.brmsfit_multiple.Rd0000644000176200001440000000214513601201144017113 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/update.R \name{update.brmsfit_multiple} \alias{update.brmsfit_multiple} \title{Update \pkg{brms} models based on multiple data sets} \usage{ \method{update}{brmsfit_multiple}(object, formula., newdata = NULL, ...) } \arguments{ \item{object}{An object of class \code{brmsfit_multiple}.} \item{formula.}{Changes to the formula; for details see \code{\link{update.formula}} and \code{\link{brmsformula}}.} \item{newdata}{List of \code{data.frames} to update the model with new data. Currently required even if the original data should be used.} \item{...}{Other arguments passed to \code{\link{update.brmsfit}} and \code{\link{brm_multiple}}.} } \description{ This method allows to update an existing \code{brmsfit_multiple} object. } \examples{ \dontrun{ library(mice) imp <- mice(nhanes2) # initially fit the model fit_imp1 <- brm_multiple(bmi ~ age + hyp + chl, data = imp, chains = 1) summary(fit_imp1) # update the model using fewer predictors fit_imp2 <- update(fit_imp1, formula. = . ~ hyp + chl, newdata = imp) summary(fit_imp2) } } brms/man/stancode.brmsfit.Rd0000644000176200001440000000117513606326742015541 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/make_stancode.R \name{stancode.brmsfit} \alias{stancode.brmsfit} \alias{stancode} \title{Extract Stan model code} \usage{ \method{stancode}{brmsfit}(object, version = TRUE, ...) stancode(object, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{version}{Logical; indicates if the first line containing the \pkg{brms} version number should be included. Defaults to \code{TRUE}.} \item{...}{Currently ignored.} } \value{ Stan model code for further processing. } \description{ Extract Stan code that was used to specify the model. } brms/man/Dirichlet.Rd0000644000176200001440000000146313565500267014203 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{Dirichlet} \alias{Dirichlet} \alias{ddirichlet} \alias{rdirichlet} \title{The Dirichlet Distribution} \usage{ ddirichlet(x, alpha, log = FALSE) rdirichlet(n, alpha) } \arguments{ \item{x}{Matrix of quantiles. Each row corresponds to one probability vector.} \item{alpha}{Matrix of positive shape parameters. Each row corresponds to one probability vector.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density function and random number generation for the dirichlet distribution with shape parameter vector \code{alpha}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/print.brmsprior.Rd0000644000176200001440000000102113565500270015426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/priors.R \name{print.brmsprior} \alias{print.brmsprior} \title{Print method for \code{brmsprior} objects} \usage{ \method{print}{brmsprior}(x, show_df, ...) } \arguments{ \item{x}{An object of class \code{brmsprior}.} \item{show_df}{Logical; Print priors as a single \code{data.frame} (\code{TRUE}) or as a sequence of sampling statements (\code{FALSE})?} \item{...}{Currently ignored.} } \description{ Print method for \code{brmsprior} objects } brms/man/pp_check.brmsfit.Rd0000644000176200001440000000544413601151454015507 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pp_check.R \name{pp_check.brmsfit} \alias{pp_check.brmsfit} \alias{pp_check} \title{Posterior Predictive Checks for \code{brmsfit} Objects} \usage{ \method{pp_check}{brmsfit}( object, type, nsamples, group = NULL, x = NULL, newdata = NULL, resp = NULL, subset = NULL, ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{type}{Type of the ppc plot as given by a character string. See \code{\link[bayesplot:PPC-overview]{PPC}} for an overview of currently supported types. You may also use an invalid type (e.g. \code{type = "xyz"}) to get a list of supported types in the resulting error message.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} all samples are used. If not specified, the number of posterior samples is chosen automatically. Ignored if \code{subset} is not \code{NULL}.} \item{group}{Optional name of a factor variable in the model by which to stratify the ppc plot. This argument is required for ppc \code{*_grouped} types and ignored otherwise.} \item{x}{Optional name of a variable in the model. Only used for ppc types having an \code{x} argument and ignored otherwise.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{...}{Further arguments passed to \code{\link{predict.brmsfit}} as well as to the PPC function specified in \code{type}.} } \value{ A ggplot object that can be further customized using the \pkg{ggplot2} package. } \description{ Perform posterior predictive checks with the help of the \pkg{bayesplot} package. } \details{ For a detailed explanation of each of the ppc functions, see the \code{\link[bayesplot:PPC-overview]{PPC}} documentation of the \pkg{\link[bayesplot:bayesplot]{bayesplot}} package. } \examples{ \dontrun{ fit <- brm(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson()) pp_check(fit) # shows dens_overlay plot by default pp_check(fit, type = "error_hist", nsamples = 11) pp_check(fit, type = "scatter_avg", nsamples = 100) pp_check(fit, type = "stat_2d") pp_check(fit, type = "rootogram") pp_check(fit, type = "loo_pit") ## get an overview of all valid types pp_check(fit, type = "xyz") } } brms/man/conditional_smooths.brmsfit.Rd0000644000176200001440000000724513601107424020011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/conditional_smooths.R \name{conditional_smooths.brmsfit} \alias{conditional_smooths.brmsfit} \alias{marginal_smooths} \alias{marginal_smooths.brmsfit} \alias{conditional_smooths} \title{Display Smooth Terms} \usage{ \method{conditional_smooths}{brmsfit}( x, smooths = NULL, int_conditions = NULL, probs = c(0.025, 0.975), spaghetti = FALSE, resolution = 100, too_far = 0, subset = NULL, nsamples = NULL, ... ) conditional_smooths(x, ...) } \arguments{ \item{x}{An object of class \code{brmsfit}.} \item{smooths}{Optional character vector of smooth terms to display. If \code{NULL} (the default) all smooth terms are shown.} \item{int_conditions}{An optional named \code{list} whose elements are numeric vectors of values of the second variables in two-way interactions. At these values, predictions are evaluated. The names of \code{int_conditions} have to match the variable names exactly. Additionally, the elements of the numeric vectors may be named themselves, in which case their names appear as labels for the conditions in the plots. Instead of vectors, functions returning vectors may be passed and are applied on the original values of the corresponding variable. If \code{NULL} (the default), predictions are evaluated at the \eqn{mean} and at \eqn{mean +/- sd}.} \item{probs}{The quantiles to be used in the computation of credible intervals (defaults to 2.5 and 97.5 percent quantiles)} \item{spaghetti}{Logical. Indicates if predictions should be visualized via spaghetti plots. Only applied for numeric predictors. If \code{TRUE}, it is recommended to set argument \code{nsamples} to a relatively small value (e.g. \code{100}) in order to reduce computation time.} \item{resolution}{Number of support points used to generate the plots. Higher resolution leads to smoother plots. Defaults to \code{100}. If \code{surface} is \code{TRUE}, this implies \code{10000} support points for interaction terms, so it might be necessary to reduce \code{resolution} when only few RAM is available.} \item{too_far}{Positive number. For surface plots only: Grid points that are too far away from the actual data points can be excluded from the plot. \code{too_far} determines what is too far. The grid is scaled into the unit square and then grid points more than \code{too_far} from the predictor variables are excluded. By default, all grid points are used. Ignored for non-surface plots.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{...}{Currently ignored.} } \value{ For the \code{brmsfit} method, an object of class \code{brms_conditional_effects}. See \code{\link{conditional_effects}} for more details and documentation of the related plotting function. } \description{ Display smooth \code{s} and \code{t2} terms of models fitted with \pkg{brms}. } \details{ Two-dimensional smooth terms will be visualized using either contour or raster plots. } \examples{ \dontrun{ set.seed(0) dat <- mgcv::gamSim(1, n = 200, scale = 2) fit <- brm(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat) # show all smooth terms plot(conditional_smooths(fit), rug = TRUE, ask = FALSE) # show only the smooth term s(x2) plot(conditional_smooths(fit, smooths = "s(x2)"), ask = FALSE) # fit and plot a two-dimensional smooth term fit2 <- brm(y ~ t2(x0, x2), data = dat) ms <- conditional_smooths(fit2) plot(ms, stype = "contour") plot(ms, stype = "raster") } } brms/man/loo_predict.brmsfit.Rd0000644000176200001440000000620513601151454016232 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo_predict.R \name{loo_predict.brmsfit} \alias{loo_predict.brmsfit} \alias{loo_predict} \alias{loo_linpred} \alias{loo_predictive_interval} \alias{loo_linpred.brmsfit} \alias{loo_predictive_interval.brmsfit} \title{Compute Weighted Expectations Using LOO} \usage{ \method{loo_predict}{brmsfit}( object, type = c("mean", "var", "quantile"), probs = 0.5, psis_object = NULL, resp = NULL, ... ) \method{loo_linpred}{brmsfit}( object, type = c("mean", "var", "quantile"), probs = 0.5, psis_object = NULL, resp = NULL, ... ) \method{loo_predictive_interval}{brmsfit}(object, prob = 0.9, psis_object = NULL, ...) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{type}{The statistic to be computed on the results. Can by either \code{"mean"} (default), \code{"var"}, or \code{"quantile"}.} \item{probs}{A vector of quantiles to compute. Only used if \code{type = quantile}.} \item{psis_object}{An optional object returend by \code{\link[loo]{psis}}. If \code{psis_object} is missing then \code{\link[loo]{psis}} is executed internally, which may be time consuming for models fit to very large datasets.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{...}{Optional arguments passed to the underlying methods that is \code{\link[brms:log_lik.brmsfit]{log_lik}}, as well as \code{\link[brms:posterior_predict.brmsfit]{posterior_predict}} or \code{\link[brms:posterior_linpred.brmsfit]{posterior_linpred}}.} \item{prob}{For \code{loo_predictive_interval}, a scalar in \eqn{(0,1)} indicating the desired probability mass to include in the intervals. The default is \code{prob = 0.9} (\eqn{90}\% intervals).} } \value{ \code{loo_predict} and \code{loo_linpred} return a vector with one element per observation. The only exception is if \code{type = "quantile"} and \code{length(probs) >= 2}, in which case a separate vector for each element of \code{probs} is computed and they are returned in a matrix with \code{length(probs)} rows and one column per observation. \code{loo_predictive_interval} returns a matrix with one row per observation and two columns. \code{loo_predictive_interval(..., prob = p)} is equivalent to \code{loo_predict(..., type = "quantile", probs = c(a, 1-a))} with \code{a = (1 - p)/2}, except it transposes the result and adds informative column names. } \description{ These functions are wrappers around the \code{\link[loo]{E_loo}} function of the \pkg{loo} package. } \examples{ \dontrun{ ## data from help("lm") ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14) trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69) d <- data.frame( weight = c(ctl, trt), group = gl(2, 10, 20, labels = c("Ctl", "Trt")) ) fit <- brm(weight ~ group, data = d) loo_predictive_interval(fit, prob = 0.8) ## optionally log-weights can be pre-computed and reused psis <- loo::psis(-log_lik(fit), cores = 2) loo_predictive_interval(fit, prob = 0.8, psis_object = psis) loo_predict(fit, type = "var", psis_object = psis) } } brms/man/fcor.Rd0000644000176200001440000000216713611651307013221 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ac.R \name{fcor} \alias{fcor} \title{Fixed residual correlation (FCOR) structures} \usage{ fcor(M) } \arguments{ \item{M}{Known correlation/covariance matrix of the response variable. If a vector is passed, it will be used as diagonal entries (variances) and correlations/covariances will be set to zero. The actual covariance matrix used in the likelihood is obtained by multiplying \code{M} by the square of the residual standard deviation parameter \code{sigma} estimated as part of the model.} } \value{ An object of class \code{'fcor_term'}, which is a list of arguments to be interpreted by the formula parsing functions of \pkg{brms}. } \description{ Set up a fixed residual correlation (FCOR) term in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with FCOR terms. } \examples{ \dontrun{ dat <- data.frame(y = rnorm(3)) V <- cbind(c(0.5, 0.3, 0.2), c(0.3, 1, 0.1), c(0.2, 0.1, 0.2)) fit <- brm(y ~ 1 + fcor(V), data = dat, data2 = list(V = V)) } } \seealso{ \code{\link{autocor-terms}} } brms/man/Shifted_Lognormal.Rd0000644000176200001440000000263113565500267015672 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{Shifted_Lognormal} \alias{Shifted_Lognormal} \alias{dshifted_lnorm} \alias{pshifted_lnorm} \alias{qshifted_lnorm} \alias{rshifted_lnorm} \title{The Shifted Log Normal Distribution} \usage{ dshifted_lnorm(x, meanlog = 0, sdlog = 1, shift = 0, log = FALSE) pshifted_lnorm( q, meanlog = 0, sdlog = 1, shift = 0, lower.tail = TRUE, log.p = FALSE ) qshifted_lnorm( p, meanlog = 0, sdlog = 1, shift = 0, lower.tail = TRUE, log.p = FALSE ) rshifted_lnorm(n, meanlog = 0, sdlog = 1, shift = 0) } \arguments{ \item{x, q}{Vector of quantiles.} \item{meanlog}{Vector of means.} \item{sdlog}{Vector of standard deviations.} \item{shift}{Vector of shifts.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{p}{Vector of probabilities.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, quantile function and random generation for the shifted log normal distribution with mean \code{meanlog}, standard deviation \code{sdlog}, and shift parameter \code{shift}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/man/parnames.Rd0000644000176200001440000000070513623751614014077 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_samples.R \name{parnames} \alias{parnames} \alias{parnames.brmsfit} \title{Extract Parameter Names} \usage{ parnames(x, ...) } \arguments{ \item{x}{An \R object} \item{...}{Further arguments passed to or from other methods.} } \value{ A character vector containing the parameter names of the model. } \description{ Extract all parameter names of a given model. } brms/man/ar.Rd0000644000176200001440000000326313611651307012670 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ac.R \name{ar} \alias{ar} \title{Set up AR(p) correlation structures} \usage{ ar(time = NA, gr = NA, p = 1, cov = FALSE) } \arguments{ \item{time}{An optional time variable specifying the time ordering of the observations. By default, the existing order of the observations in the data is used.} \item{gr}{An optional grouping variable. If specified, the correlation structure is assumed to apply only to observations within the same grouping level.} \item{p}{A non-negative integer specifying the autoregressive (AR) order of the ARMA structure. Default is \code{1}.} \item{cov}{A flag indicating whether ARMA effects should be estimated by means of residual covariance matrices. This is currently only possible for stationary ARMA effects of order 1. If the model family does not have natural residuals, latent residuals are added automatically. If \code{FALSE} (the default), a regression formulation is used that is considerably faster and allows for ARMA effects of order higher than 1 but is only available for \code{gaussian} models and some of its generalizations.} } \value{ An object of class \code{'arma_term'}, which is a list of arguments to be interpreted by the formula parsing functions of \pkg{brms}. } \description{ Set up an autoregressive (AR) term of order p in \pkg{brms}. The function does not evaluate its arguments -- it exists purely to help set up a model with AR terms. } \examples{ \dontrun{ data("LakeHuron") LakeHuron <- as.data.frame(LakeHuron) fit <- brm(x ~ ar(p = 2), data = LakeHuron) summary(fit) } } \seealso{ \code{\link{autocor-terms}}, \code{\link{arma}}, \code{\link{ma}} } brms/man/ngrps.brmsfit.Rd0000644000176200001440000000075513623751613015073 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-methods.R \name{ngrps.brmsfit} \alias{ngrps.brmsfit} \alias{ngrps} \title{Number of Grouping Factor Levels} \usage{ \method{ngrps}{brmsfit}(object, ...) ngrps(object, ...) } \arguments{ \item{object}{An \R object.} \item{...}{Currently ignored.} } \value{ A named list containing the number of levels per grouping factor. } \description{ Extract the number of levels of one or more grouping factors. } brms/man/is.brmsfit_multiple.Rd0000644000176200001440000000054213623751613016262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/brmsfit-class.R \name{is.brmsfit_multiple} \alias{is.brmsfit_multiple} \title{Checks if argument is a \code{brmsfit_multiple} object} \usage{ is.brmsfit_multiple(x) } \arguments{ \item{x}{An \R object} } \description{ Checks if argument is a \code{brmsfit_multiple} object } brms/man/autocor-terms.Rd0000644000176200001440000000253113611651307015067 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/formula-ac.R \name{autocor-terms} \alias{autocor-terms} \title{Autocorrelation structures} \description{ Specify autocorrelation terms in \pkg{brms} models. Currently supported terms are \code{\link{arma}}, \code{\link{ar}}, \code{\link{ma}}, \code{\link{cosy}}, \code{\link{sar}}, \code{\link{car}}, and \code{\link{fcor}}. Terms can be directly specified within the formula, or passed to the \code{autocor} argument of \code{\link{brmsformula}} in the form of a one-sided formula. For deprecated ways of specifying autocorrelation terms, see \code{\link{cor_brms}}. } \details{ The autocor term functions are almost solely useful when called in formulas passed to the \pkg{brms} package. They do not evaluate its arguments -- but exist purely to help set up a model with autocorrelation terms. } \examples{ # specify autocor terms within the formula y ~ x + arma(p = 1, q = 1) + car(M) # specify autocor terms in the 'autocor' argument bf(y ~ x, autocor = ~ arma(p = 1, q = 1) + car(M)) # specify autocor terms via 'acformula' bf(y ~ x) + acformula(~ arma(p = 1, q = 1) + car(M)) } \seealso{ \code{\link{brmsformula}}, \code{\link{acformula}}, \code{\link{arma}}, \code{\link{ar}}, \code{\link{ma}}, \code{\link{cosy}}, \code{\link{sar}}, \code{\link{car}}, \code{\link{fcor}} } brms/man/ZeroInflated.Rd0000644000176200001440000000345713565500267014667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{ZeroInflated} \alias{ZeroInflated} \alias{dzero_inflated_poisson} \alias{pzero_inflated_poisson} \alias{dzero_inflated_negbinomial} \alias{pzero_inflated_negbinomial} \alias{dzero_inflated_binomial} \alias{pzero_inflated_binomial} \alias{dzero_inflated_beta} \alias{pzero_inflated_beta} \title{Zero-Inflated Distributions} \usage{ dzero_inflated_poisson(x, lambda, zi, log = FALSE) pzero_inflated_poisson(q, lambda, zi, lower.tail = TRUE, log.p = FALSE) dzero_inflated_negbinomial(x, mu, shape, zi, log = FALSE) pzero_inflated_negbinomial(q, mu, shape, zi, lower.tail = TRUE, log.p = FALSE) dzero_inflated_binomial(x, size, prob, zi, log = FALSE) pzero_inflated_binomial(q, size, prob, zi, lower.tail = TRUE, log.p = FALSE) dzero_inflated_beta(x, shape1, shape2, zi, log = FALSE) pzero_inflated_beta(q, shape1, shape2, zi, lower.tail = TRUE, log.p = FALSE) } \arguments{ \item{x}{Vector of quantiles.} \item{zi}{zero-inflation propability} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{q}{Vector of quantiles.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{mu, lambda}{location parameter} \item{shape, shape1, shape2}{shape parameter} \item{size}{number of trials} \item{prob}{probability of success on each trial} } \description{ Density and distribution functions for zero-inflated distributions. } \details{ The density of a zero-inflated distribution can be specified as follows. If \eqn{x = 0} set \eqn{f(x) = \theta + (1 - \theta) * g(0)}. Else set \eqn{f(x) = (1 - \theta) * g(x)}, where \eqn{g(x)} is the density of the non-zero-inflated part. } brms/man/predict.brmsfit.Rd0000644000176200001440000001104213603652171015360 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_predict.R \name{predict.brmsfit} \alias{predict.brmsfit} \title{Samples from the Posterior Predictive Distribution} \usage{ \method{predict}{brmsfit}( object, newdata = NULL, re_formula = NULL, transform = NULL, resp = NULL, negative_rt = FALSE, nsamples = NULL, subset = NULL, sort = FALSE, ntrys = 5, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{transform}{A function or a character string naming a function to be applied on the predicted responses before summary statistics are computed.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{negative_rt}{Only relevant for Wiener diffusion models. A flag indicating whether response times of responses on the lower boundary should be returned as negative values. This allows to distinguish responses on the upper and lower boundary. Defaults to \code{FALSE}.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{sort}{Logical. Only relevant for time series models. Indicating whether to return predicted values in the original order (\code{FALSE}; default) or in the order of the time series (\code{TRUE}).} \item{ntrys}{Parameter used in rejection sampling for truncated discrete models only (defaults to \code{5}). See Details for more information.} \item{summary}{Should summary statistics be returned instead of the raw values? Default is \code{TRUE}.} \item{robust}{If \code{FALSE} (the default) the mean is used as the measure of central tendency and the standard deviation as the measure of variability. If \code{TRUE}, the median and the median absolute deviation (MAD) are applied instead. Only used if \code{summary} is \code{TRUE}.} \item{probs}{The percentiles to be computed by the \code{quantile} function. Only used if \code{summary} is \code{TRUE}.} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ An \code{array} of predicted response values. If \code{summary = FALSE} the output resembles those of \code{\link{posterior_predict.brmsfit}}. If \code{summary = TRUE} the output depends on the family: For categorical and ordinal families, the output is an N x C matrix, where N is the number of observations, C is the number of categories, and the values are predicted category probabilites. For all other families, the output is a N x E matrix where E = \code{2 + length(probs)} is the number of summary statistics: The \code{Estimate} column contains point estimates (either mean or median depending on argument \code{robust}), while the \code{Est.Error} column contains uncertainty estimates (either standard deviation or median absolute deviation depending on argument \code{robust}). The remaining columns starting with \code{Q} contain quantile estimates as specifed via argument \code{probs}. } \description{ This method is an alias of \code{\link{posterior_predict.brmsfit}} with additional arguments for obtaining summaries of the computed samples. } \examples{ \dontrun{ ## fit a model fit <- brm(time | cens(censored) ~ age + sex + (1 + age || patient), data = kidney, family = "exponential", inits = "0") ## predicted responses pp <- predict(fit) head(pp) ## predicted responses excluding the group-level effect of age pp <- predict(fit, re_formula = ~ (1 | patient)) head(pp) ## predicted responses of patient 1 for new data newdata <- data.frame( sex = factor(c("male", "female")), age = c(20, 50), patient = c(1, 1) ) predict(fit, newdata = newdata) } } \seealso{ \code{\link{posterior_predict.brmsfit}} } brms/man/bridge_sampler.brmsfit.Rd0000644000176200001440000000434413601151454016710 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bridgesampling.R \name{bridge_sampler.brmsfit} \alias{bridge_sampler.brmsfit} \alias{bridge_sampler} \title{Log Marginal Likelihood via Bridge Sampling} \usage{ \method{bridge_sampler}{brmsfit}(samples, ...) } \arguments{ \item{samples}{A \code{brmsfit} object.} \item{...}{Additional arguments passed to \code{\link[bridgesampling:bridge_sampler]{bridge_sampler.stanfit}}.} } \description{ Computes log marginal likelihood via bridge sampling, which can be used in the computation of bayes factors and posterior model probabilities. The \code{brmsfit} method is just a thin wrapper around the corresponding method for \code{stanfit} objects. } \details{ Computing the marginal likelihood requires samples of all variables defined in Stan's \code{parameters} block to be saved. Otherwise \code{bridge_sampler} cannot be computed. Thus, please set \code{save_all_pars = TRUE} in the call to \code{brm}, if you are planning to apply \code{bridge_sampler} to your models. The computation of marginal likelihoods based on bridge sampling requires a lot more posterior samples than usual. A good conservative rule of thump is perhaps 10-fold more samples (read: the default of 4000 samples may not be enough in many cases). If not enough posterior samples are provided, the bridge sampling algorithm tends to be unstable leading to considerably different results each time it is run. We thus recommend running \code{bridge_sampler} multiple times to check the stability of the results. More details are provided under \code{\link[bridgesampling:bridge_sampler]{bridgesampling:bridge_sampler}}. } \examples{ \dontrun{ # model with the treatment effect fit1 <- brm( count ~ zAge + zBase + Trt, data = epilepsy, family = negbinomial(), prior = prior(normal(0, 1), class = b), save_all_pars = TRUE ) summary(fit1) bridge_sampler(fit1) # model without the treatment effect fit2 <- brm( count ~ zAge + zBase, data = epilepsy, family = negbinomial(), prior = prior(normal(0, 1), class = b), save_all_pars = TRUE ) summary(fit2) bridge_sampler(fit2) } } \seealso{ \code{ \link[brms:bayes_factor]{bayes_factor}, \link[brms:post_prob]{post_prob} } } brms/man/loo_subsample.brmsfit.Rd0000644000176200001440000000313513605602346016577 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo.R \name{loo_subsample.brmsfit} \alias{loo_subsample.brmsfit} \alias{loo_subsample} \title{Efficient approximate leave-one-out cross-validation (LOO) using subsampling} \usage{ \method{loo_subsample}{brmsfit}(x, ..., compare = TRUE, resp = NULL, model_names = NULL) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{compare}{A flag indicating if the information criteria of the models should be compared to each other via \code{\link{loo_compare}}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} } \description{ Efficient approximate leave-one-out cross-validation (LOO) using subsampling } \details{ More details can be found on \code{\link[loo:loo_subsample]{loo_subsample}}. } \examples{ \dontrun{ # model with population-level effects only fit1 <- brm(rating ~ treat + period + carry, data = inhaler) (loo1 <- loo_subsample(fit1)) # model with an additional varying intercept for subjects fit2 <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler) (loo2 <- loo_subsample(fit2)) # compare both models loo_compare(loo1, loo2) } } brms/man/posterior_predict.brmsfit.Rd0000644000176200001440000001133513600774753017503 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_predict.R \name{posterior_predict.brmsfit} \alias{posterior_predict.brmsfit} \alias{posterior_predict} \title{Samples from the Posterior Predictive Distribution} \usage{ \method{posterior_predict}{brmsfit}( object, newdata = NULL, re_formula = NULL, re.form = NULL, transform = NULL, resp = NULL, negative_rt = FALSE, nsamples = NULL, subset = NULL, sort = FALSE, ntrys = 5, ... ) } \arguments{ \item{object}{An object of class \code{brmsfit}.} \item{newdata}{An optional data.frame for which to evaluate predictions. If \code{NULL} (default), the original data of the model is used. \code{NA} values within factors are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding.} \item{re_formula}{formula containing group-level effects to be considered in the prediction. If \code{NULL} (default), include all group-level effects; if \code{NA}, include no group-level effects.} \item{re.form}{Alias of \code{re_formula}.} \item{transform}{A function or a character string naming a function to be applied on the predicted responses before summary statistics are computed.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{negative_rt}{Only relevant for Wiener diffusion models. A flag indicating whether response times of responses on the lower boundary should be returned as negative values. This allows to distinguish responses on the upper and lower boundary. Defaults to \code{FALSE}.} \item{nsamples}{Positive integer indicating how many posterior samples should be used. If \code{NULL} (the default) all samples are used. Ignored if \code{subset} is not \code{NULL}.} \item{subset}{A numeric vector specifying the posterior samples to be used. If \code{NULL} (the default), all samples are used.} \item{sort}{Logical. Only relevant for time series models. Indicating whether to return predicted values in the original order (\code{FALSE}; default) or in the order of the time series (\code{TRUE}).} \item{ntrys}{Parameter used in rejection sampling for truncated discrete models only (defaults to \code{5}). See Details for more information.} \item{...}{Further arguments passed to \code{\link{extract_draws}} that control several aspects of data validation and prediction.} } \value{ An \code{array} of predicted response values. If \code{summary = FALSE}, the output is as an S x N matrix, where S is the number of posterior samples and N is the number of observations. In multivariate models, an additional dimension is added to the output which indexes along the different response variables. } \description{ Compute posterior samples of the posterior predictive distribution. Can be performed for the data used to fit the model (posterior predictive checks) or for new data. By definition, these samples have higher variance than samples of the means of the posterior predictive distribution computed by \code{\link{posterior_predict.brmsfit}}. This is because the residual error is incorporated in \code{posterior_predict}. However, the estimated means of both methods averaged across samples should be very similar. } \details{ \code{NA} values within factors in \code{newdata}, are interpreted as if all dummy variables of this factor are zero. This allows, for instance, to make predictions of the grand mean when using sum coding. For truncated discrete models only: In the absence of any general algorithm to sample from truncated discrete distributions, rejection sampling is applied in this special case. This means that values are sampled until a value lies within the defined truncation boundaries. In practice, this procedure may be rather slow (especially in \R). Thus, we try to do approximate rejection sampling by sampling each value \code{ntrys} times and then select a valid value. If all values are invalid, the closest boundary is used, instead. If there are more than a few of these pathological cases, a warning will occur suggesting to increase argument \code{ntrys}. } \examples{ \dontrun{ ## fit a model fit <- brm(time | cens(censored) ~ age + sex + (1 + age || patient), data = kidney, family = "exponential", inits = "0") ## predicted responses pp <- posterior_predict(fit) str(pp) ## predicted responses excluding the group-level effect of age pp <- posterior_predict(fit, re_formula = ~ (1 | patient)) str(pp) ## predicted responses of patient 1 for new data newdata <- data.frame( sex = factor(c("male", "female")), age = c(20, 50), patient = c(1, 1) ) pp <- posterior_predict(fit, newdata = newdata) str(pp) } } brms/man/as.mcmc.brmsfit.Rd0000644000176200001440000000246613601162150015250 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_samples.R \name{as.mcmc.brmsfit} \alias{as.mcmc.brmsfit} \alias{as.mcmc} \title{Extract posterior samples for use with the \pkg{coda} package} \usage{ \method{as.mcmc}{brmsfit}( x, pars = NA, fixed = FALSE, combine_chains = FALSE, inc_warmup = FALSE, ... ) } \arguments{ \item{x}{An \code{R} object typically of class \code{brmsfit}} \item{pars}{Names of parameters for which posterior samples should be returned, as given by a character vector or regular expressions. By default, all posterior samples of all parameters are extracted.} \item{fixed}{Indicates whether parameter names should be matched exactly (\code{TRUE}) or treated as regular expressions (\code{FALSE}). Default is \code{FALSE}.} \item{combine_chains}{Indicates whether chains should be combined.} \item{inc_warmup}{Indicates if the warmup samples should be included. Default is \code{FALSE}. Warmup samples are used to tune the parameters of the sampling algorithm and should not be analyzed.} \item{...}{currently unused} } \value{ If \code{combine_chains = TRUE} an \code{mcmc} object is returned. If \code{combine_chains = FALSE} an \code{mcmc.list} object is returned. } \description{ Extract posterior samples for use with the \pkg{coda} package } brms/man/kfold.brmsfit.Rd0000644000176200001440000001344613606352357015045 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/kfold.R \name{kfold.brmsfit} \alias{kfold.brmsfit} \alias{kfold} \title{K-Fold Cross-Validation} \usage{ \method{kfold}{brmsfit}( x, ..., K = 10, Ksub = NULL, folds = NULL, group = NULL, exact_loo = NULL, compare = TRUE, resp = NULL, model_names = NULL, save_fits = FALSE ) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{K}{The number of subsets of equal (if possible) size into which the data will be partitioned for performing \eqn{K}-fold cross-validation. The model is refit \code{K} times, each time leaving out one of the \code{K} subsets. If \code{K} is equal to the total number of observations in the data then \eqn{K}-fold cross-validation is equivalent to exact leave-one-out cross-validation.} \item{Ksub}{Optional number of subsets (of those subsets defined by \code{K}) to be evaluated. If \code{NULL} (the default), \eqn{K}-fold cross-validation will be performed on all subsets. If \code{Ksub} is a single integer, \code{Ksub} subsets (out of all \code{K}) subsets will be randomly chosen. If \code{Ksub} consists of multiple integers or a one-dimensional array (created via \code{as.array}) potentially of length one, the corresponding subsets will be used. This argument is primarily useful, if evaluation of all subsets is infeasible for some reason.} \item{folds}{Determines how the subsets are being constructed. Possible values are \code{NULL} (the default), \code{"stratified"}, \code{"grouped"}, or \code{"loo"}. May also be a vector of length equal to the number of observations in the data. Alters the way \code{group} is handled. More information is provided in the 'Details' section.} \item{group}{Optional name of a grouping variable or factor in the model. What exactly is done with this variable depends on argument \code{folds}. More information is provided in the 'Details' section.} \item{exact_loo}{Deprecated! Please use \code{folds = "loo"} instead.} \item{compare}{A flag indicating if the information criteria of the models should be compared to each other via \code{\link{loo_compare}}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} \item{save_fits}{If \code{TRUE}, a component \code{fits} is added to the returned object to store the cross-validated \code{brmsfit} objects and the indices of the omitted observations for each fold. Defaults to \code{FALSE}.} } \value{ \code{kfold} returns an object that has a similar structure as the objects returned by the \code{loo} and \code{waic} methods and can be used with the same post-processing functions. } \description{ Perform exact K-fold cross-validation by refitting the model \eqn{K} times each leaving out one-\eqn{K}th of the original data. Folds can be run in parallel using the \pkg{future} package. } \details{ The \code{kfold} function performs exact \eqn{K}-fold cross-validation. First the data are partitioned into \eqn{K} folds (i.e. subsets) of equal (or as close to equal as possible) size by default. Then the model is refit \eqn{K} times, each time leaving out one of the \code{K} subsets. If \eqn{K} is equal to the total number of observations in the data then \eqn{K}-fold cross-validation is equivalent to exact leave-one-out cross-validation (to which \code{loo} is an efficient approximation). The \code{compare_ic} function is also compatible with the objects returned by \code{kfold}. The subsets can be constructed in multiple different ways: \itemize{ \item If both \code{folds} and \code{group} are \code{NULL}, the subsets are randomly chosen so that they have equal (or as close to equal as possible) size. \item If \code{folds} is \code{NULL} but \code{group} is specified, the data is split up into subsets, each time omitting all observations of one of the factor levels, while ignoring argument \code{K}. \item If \code{folds = "stratified"} the subsets are stratified after \code{group} using \code{\link[loo:kfold-helpers]{loo::kfold_split_stratified}}. \item If \code{folds = "grouped"} the subsets are split by \code{group} using \code{\link[loo:kfold-helpers]{loo::kfold_split_grouped}}. \item If \code{folds = "loo"} exact leave-one-out cross-validation will be performed and \code{K} will be ignored. Further, if \code{group} is specified, all observations corresponding to the factor level of the currently predicted single value are omitted. Thus, in this case, the predicted values are only a subset of the omitted ones. \item If \code{folds} is a numeric vector, it must contain one element per observation in the data. Each element of the vector is an integer in \code{1:K} indicating to which of the \code{K} folds the corresponding observation belongs. There are some convenience functions available in the \pkg{loo} package that create integer vectors to use for this purpose (see the Examples section below and also the \link[loo:kfold-helpers]{kfold-helpers} page). } } \examples{ \dontrun{ fit1 <- brm(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), data = epilepsy, family = poisson()) # throws warning about some pareto k estimates being too high (loo1 <- loo(fit1)) # perform 10-fold cross validation (kfold1 <- kfold(fit1, chains = 1)) # use the future package for parallelization library(future) plan(multiprocess) kfold(fit1, chains = 1) } } \seealso{ \code{\link{loo}}, \code{\link{reloo}} } brms/man/waic.brmsfit.Rd0000644000176200001440000000561113601201144014642 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/loo.R \name{waic.brmsfit} \alias{waic.brmsfit} \alias{waic} \alias{WAIC} \alias{WAIC.brmsfit} \title{Widely Applicable Information Criterion (WAIC)} \usage{ \method{waic}{brmsfit}( x, ..., compare = TRUE, resp = NULL, pointwise = FALSE, model_names = NULL ) } \arguments{ \item{x}{A \code{brmsfit} object.} \item{...}{More \code{brmsfit} objects or further arguments passed to the underlying post-processing functions. In particular, see \code{\link{extract_draws}} for further supported arguments.} \item{compare}{A flag indicating if the information criteria of the models should be compared to each other via \code{\link{loo_compare}}.} \item{resp}{Optional names of response variables. If specified, predictions are performed only for the specified response variables.} \item{pointwise}{A flag indicating whether to compute the full log-likelihood matrix at once or separately for each observation. The latter approach is usually considerably slower but requires much less working memory. Accordingly, if one runs into memory issues, \code{pointwise = TRUE} is the way to go.} \item{model_names}{If \code{NULL} (the default) will use model names derived from deparsing the call. Otherwise will use the passed values as model names.} } \value{ If just one object is provided, an object of class \code{loo}. If multiple objects are provided, an object of class \code{loolist}. } \description{ Compute the widely applicable information criterion (WAIC) based on the posterior likelihood using the \pkg{loo} package. For more details see \code{\link[loo:waic]{waic}}. } \details{ See \code{\link{loo_compare}} for details on model comparisons. For \code{brmsfit} objects, \code{WAIC} is an alias of \code{waic}. Use method \code{\link[brms:add_criterion]{add_criterion}} to store information criteria in the fitted model object for later usage. } \examples{ \dontrun{ # model with population-level effects only fit1 <- brm(rating ~ treat + period + carry, data = inhaler) (waic1 <- waic(fit1)) # model with an additional varying intercept for subjects fit2 <- brm(rating ~ treat + period + carry + (1|subject), data = inhaler) (waic2 <- waic(fit2)) # compare both models loo_compare(waic1, waic2) } } \references{ Vehtari, A., Gelman, A., & Gabry J. (2016). Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC. In Statistics and Computing, doi:10.1007/s11222-016-9696-4. arXiv preprint arXiv:1507.04544. Gelman, A., Hwang, J., & Vehtari, A. (2014). Understanding predictive information criteria for Bayesian models. Statistics and Computing, 24, 997-1016. Watanabe, S. (2010). Asymptotic equivalence of Bayes cross validation and widely applicable information criterion in singular learning theory. The Journal of Machine Learning Research, 11, 3571-3594. } brms/man/cor_sar.Rd0000644000176200001440000000336113611651306013714 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/autocor.R \name{cor_sar} \alias{cor_sar} \alias{cor_lagsar} \alias{cor_errorsar} \title{(Deprecated) Spatial simultaneous autoregressive (SAR) structures} \usage{ cor_sar(W, type = c("lag", "error")) cor_lagsar(W) cor_errorsar(W) } \arguments{ \item{W}{An object specifying the spatial weighting matrix. Can be either the spatial weight matrix itself or an object of class \code{listw} or \code{nb}, from which the spatial weighting matrix can be computed.} \item{type}{Type of the SAR structure. Either \code{"lag"} (for SAR of the response values) or \code{"error"} (for SAR of the residuals).} } \value{ An object of class \code{cor_sar} to be used in calls to \code{\link{brm}}. } \description{ Thse functions are deprecated. Please see \code{\link{sar}} for the new syntax. These functions are constructors for the \code{cor_sar} class implementing spatial simultaneous autoregressive structures. The \code{lagsar} structure implements SAR of the response values: \deqn{y = \rho W y + \eta + e} The \code{errorsar} structure implements SAR of the residuals: \deqn{y = \eta + u, u = \rho W u + e} In the above equations, \eqn{\eta} is the predictor term and \eqn{e} are independent normally or t-distributed residuals. } \details{ Currently, only families \code{gaussian} and \code{student} support SAR structures. } \examples{ \dontrun{ data(oldcol, package = "spdep") fit1 <- brm(CRIME ~ INC + HOVAL, data = COL.OLD, autocor = cor_lagsar(COL.nb), chains = 2, cores = 2) summary(fit1) plot(fit1) fit2 <- brm(CRIME ~ INC + HOVAL, data = COL.OLD, autocor = cor_errorsar(COL.nb), chains = 2, cores = 2) summary(fit2) plot(fit2) } } brms/man/SkewNormal.Rd0000644000176200001440000000337713565500267014364 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distributions.R \name{SkewNormal} \alias{SkewNormal} \alias{dskew_normal} \alias{pskew_normal} \alias{qskew_normal} \alias{rskew_normal} \title{The Skew-Normal Distribution} \usage{ dskew_normal( x, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL, log = FALSE ) pskew_normal( q, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL, lower.tail = TRUE, log.p = FALSE ) qskew_normal( p, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL, lower.tail = TRUE, log.p = FALSE, tol = 1e-08 ) rskew_normal(n, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL) } \arguments{ \item{x, q}{Vector of quantiles.} \item{mu}{Vector of mean values.} \item{sigma}{Vector of standard deviation values.} \item{alpha}{Vector of skewness values.} \item{xi}{Optional vector of location values. If \code{NULL} (the default), will be computed internally.} \item{omega}{Optional vector of scale values. If \code{NULL} (the default), will be computed internally.} \item{log}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{lower.tail}{Logical; If \code{TRUE} (default), return P(X <= x). Else, return P(X > x) .} \item{log.p}{Logical; If \code{TRUE}, values are returned on the log scale.} \item{p}{Vector of probabilities.} \item{tol}{Tolerance of the approximation used in the computation of quantiles.} \item{n}{Number of samples to draw from the distribution.} } \description{ Density, distribution function, and random generation for the skew-normal distribution with mean \code{mu}, standard deviation \code{sigma}, and skewness \code{alpha}. } \details{ See \code{vignette("brms_families")} for details on the parameterization. } brms/DESCRIPTION0000644000176200001440000000445713624533241012740 0ustar liggesusersPackage: brms Encoding: UTF-8 Type: Package Title: Bayesian Regression Models using 'Stan' Version: 2.12.0 Date: 2020-02-21 Authors@R: person("Paul-Christian", "Bürkner", email = "paul.buerkner@gmail.com", role = c("aut", "cre")) Depends: R (>= 3.5.0), Rcpp (>= 0.12.0), methods Imports: rstan (>= 2.19.2), ggplot2 (>= 2.0.0), loo (>= 2.2.0), Matrix (>= 1.1.1), mgcv (>= 1.8-13), rstantools (>= 1.5.1), bayesplot (>= 1.5.0), shinystan (>= 2.4.0), bridgesampling (>= 0.3-0), glue (>= 1.3.0), matrixStats, nleqslv, nlme, coda, abind, future, stats, utils, parallel, grDevices, backports Suggests: testthat (>= 0.9.1), RWiener, mice, spdep, mnormt, lme4, MCMCglmm, splines2, ape, arm, statmod, digest, R.rsp, knitr, rmarkdown Description: Fit Bayesian generalized (non-)linear multivariate multilevel models using 'Stan' for full Bayesian inference. A wide range of distributions and link functions are supported, allowing users to fit -- among others -- linear, robust linear, count data, survival, response times, ordinal, zero-inflated, hurdle, and even self-defined mixture models all in a multilevel context. Further modeling options include non-linear and smooth terms, auto-correlation structures, censored data, meta-analytic standard errors, and quite a few more. In addition, all parameters of the response distribution can be predicted in order to perform distributional regression. Prior specifications are flexible and explicitly encourage users to apply prior distributions that actually reflect their beliefs. Model fit can easily be assessed and compared with posterior predictive checks and leave-one-out cross-validation. References: Bürkner (2017) ; Bürkner (2018) ; Carpenter et al. (2017) . LazyData: true NeedsCompilation: no License: GPL-2 URL: https://github.com/paul-buerkner/brms, http://discourse.mc-stan.org BugReports: https://github.com/paul-buerkner/brms/issues VignetteBuilder: knitr, R.rsp RoxygenNote: 7.0.2 Packaged: 2020-02-21 13:58:21 UTC; paulb Author: Paul-Christian Bürkner [aut, cre] Maintainer: Paul-Christian Bürkner Repository: CRAN Date/Publication: 2020-02-23 17:30:09 UTC brms/build/0000755000176200001440000000000013623760774012333 5ustar liggesusersbrms/build/vignette.rds0000644000176200001440000000103113623760774014665 0ustar liggesusersTQo0ұJXن~BpN0àJ38frZ#KHJ4Df\pF9!gYoM3hw( D@t ڬ+P qzl9rV//%ށ&ax"r`) *>o3: aK>N }QWǷP}1tn?1Ӂ7/r gt|~La[Kar] ar;") expect_match2(scode, "vector[Kma] ma;") expect_match2(scode, "target += uniform_lpdf(ar | -1, 1)") expect_match2(scode, "target += normal_lpdf(ma | 0, 0.5)") expect_match2(scode, "- 1 * log_diff_exp(normal_lcdf(1 | 0, 0.5), normal_lcdf(-1 | 0, 0.5))" ) expect_match2(scode, "target += normal_lpdf(bsp | 0, 5)") expect_match2(scode, "target += dirichlet_lpdf(simo_1 | con_simo_1)") expect_match2(scode, "prior_simo_1 = dirichlet_rng(con_simo_1)") expect_match2(scode, "prior_ar = uniform_rng(-1,1)") expect_match2(scode, "while (prior_ar < -1 || prior_ar > 1)") # test for problem described in #213 prior <- c(prior(normal(0, 1), coef = x1), prior(normal(0, 2), coef = x1, dpar = sigma)) scode <- make_stancode(bf(y ~ x1, sigma ~ x1), dat, prior = prior) expect_match2(scode, "target += normal_lpdf(b[1] | 0, 1);") expect_match2(scode, "target += normal_lpdf(b_sigma[1] | 0, 2);") prior <- c(set_prior("target += normal_lpdf(b[1] | 0, 1)", check = FALSE), set_prior("", class = "sigma")) scode <- make_stancode(y ~ x1, dat, prior = prior, sample_prior = TRUE) expect_match2(scode, "target += normal_lpdf(b[1] | 0, 1)") expect_true(!grepl("sigma \\|", scode)) prior <- prior(gamma(0, 1), coef = x1) expect_warning(make_stancode(y ~ x1, dat, prior = prior), "no natural lower bound") prior <- prior(uniform(0,5), class = sd) expect_warning(make_stancode(y ~ x1 + (1|g), dat, prior = prior), "no natural upper bound") prior <- prior(uniform(-1, 1), class = cor) expect_error( make_stancode(y ~ x1 + (x1|g), dat, prior = prior), "prior for correlation matrices is the 'lkj' prior" ) }) test_that("special shrinkage priors appear in the Stan code", { dat <- data.frame(y = 1:10, x1 = rnorm(10), x2 = rnorm(10)) # horseshoe prior hs <- horseshoe(7, scale_global = 2, df_global = 3, df_slab = 6, scale_slab = 3) scode <- make_stancode(y ~ x1*x2, data = dat, prior = set_prior(hs), sample_prior = TRUE) expect_match2(scode, "vector[Kc] hs_local[2];") expect_match2(scode, "real hs_global[2];") expect_match2(scode, "target += inv_gamma_lpdf(hs_local[2] | 0.5 * hs_df, 0.5 * hs_df);" ) expect_match2(scode, "target += inv_gamma_lpdf(hs_global[2] | 0.5 * hs_df_global, 0.5 * hs_df_global);" ) expect_match2(scode, "target += inv_gamma_lpdf(hs_c2 | 0.5 * hs_df_slab, 0.5 * hs_df_slab);" ) expect_match2(scode, paste0( "b = horseshoe(zb, hs_local, hs_global, ", "hs_scale_global * sigma, hs_scale_slab^2 * hs_c2);" ) ) scode <- make_stancode(y ~ x1*x2, data = dat, poisson(), prior = prior(horseshoe(scale_global = 3))) expect_match2(scode, paste0( "b = horseshoe(zb, hs_local, hs_global, ", "hs_scale_global, hs_scale_slab^2 * hs_c2);" ) ) scode <- make_stancode(x1 ~ mo(y), dat, prior = prior(horseshoe())) expect_match2(scode, "target += normal_lpdf(zbsp | 0, 1);") expect_match2(scode, "target += normal_lpdf(hs_localsp[1] | 0, 1)\n - 1 * log(0.5);" ) expect_match2(scode, "target += inv_gamma_lpdf(hs_localsp[2] | 0.5 * hs_df, 0.5 * hs_df);" ) expect_match2(scode, paste0( "bsp = horseshoe(zbsp, hs_localsp, hs_global, ", "hs_scale_global * sigma, hs_scale_slab^2 * hs_c2);" ) ) # lasso prior scode <- make_stancode(y ~ x1*x2, data = dat, prior = prior(lasso(2, scale = 10)), sample_prior = TRUE) expect_match2(scode, "target += chi_square_lpdf(lasso_inv_lambda | lasso_df);") expect_match2(scode, "target += double_exponential_lpdf(b | 0, lasso_scale * lasso_inv_lambda);" ) scode <- make_stancode(x1 ~ mo(y), dat, prior = prior(lasso())) expect_match2(scode, "double_exponential_lpdf(bsp | 0, lasso_scale * lasso_inv_lambda)" ) # horseshoe and lasso prior applied in a non-linear model hs_a1 <- horseshoe(7, scale_global = 2, df_global = 3) lasso_a2 <- lasso(2, scale = 10) scode <- make_stancode( bf(y ~ a1 + a2, a1 ~ x1, a2 ~ 0 + x2, nl = TRUE), data = dat, sample_prior = TRUE, prior = c(set_prior(hs_a1, nlpar = "a1"), set_prior(lasso_a2, nlpar = "a2")) ) expect_match2(scode, "vector[K_a1] hs_local_a1[2];") expect_match2(scode, "real hs_global_a1[2];") expect_match2(scode, "target += inv_gamma_lpdf(hs_local_a1[2] | 0.5 * hs_df_a1, 0.5 * hs_df_a1);" ) expect_match2(scode, "target += inv_gamma_lpdf(hs_global_a1[2] | 0.5 * hs_df_global_a1, 0.5 * hs_df_global_a1);" ) expect_match2(scode, "target += inv_gamma_lpdf(hs_c2_a1 | 0.5 * hs_df_slab_a1, 0.5 * hs_df_slab_a1);" ) expect_match2(scode, paste0( "b_a1 = horseshoe(zb_a1, hs_local_a1, hs_global_a1, ", "hs_scale_global_a1 * sigma, hs_scale_slab_a1^2 * hs_c2_a1);" ) ) expect_match2(scode, "target += chi_square_lpdf(lasso_inv_lambda_a2 | lasso_df_a2);" ) expect_match2(scode, "target += double_exponential_lpdf(b_a2 | 0, lasso_scale_a2 * lasso_inv_lambda_a2);" ) # check error messages expect_error(make_stancode(y ~ x1*x2, data = dat, prior = prior(horseshoe(-1))), "Degrees of freedom of the local priors") expect_error(make_stancode(y ~ x1*x2, data = dat, prior = prior(horseshoe(1, -1))), "Scale of the global prior") expect_error(make_stancode(y ~ x1*x2, data = dat, prior = prior(lasso(-1))), "Degrees of freedom of the shrinkage parameter prior") expect_error(make_stancode(y ~ cs(x1), dat, acat(), prior = prior(lasso())), "Special priors are not yet allowed") bprior <- prior(horseshoe()) + prior(normal(0, 1), coef = "y") expect_error(make_stancode(x1 ~ y, dat, prior = bprior), "Defining separate priors for single coefficients") expect_error(make_stancode(x1 ~ y, dat, prior = prior(lasso(), lb = 0)), "Setting boundaries on coefficients is not allowed") }) test_that("priors can be fixed to constants", { dat <- data.frame(y = 1:12, x1 = rnorm(12), x2 = rnorm(12), g = rep(1:6, each = 2), h = factor(rep(1:2, each = 6))) prior <- prior(normal(0, 1), b) + prior(constant(3), b, coef = x1) + prior(constant(-1), b, coef = x2) + prior(constant(10), Intercept) + prior(normal(0, 5), sd) + prior(constant(1), sd, group = g, coef = x2) + prior(constant(2), sd, group = g, coef = x1) + prior(constant(0.3), sigma) scode <- make_stancode(y ~ x1*x2 + (x1*x2 | g), dat, prior = prior) expect_match2(scode, "b[1] = 3;") expect_match2(scode, "b[2] = -1;") expect_match2(scode, "b[3] = par_b_3;") expect_match2(scode, "target += normal_lpdf(b[3] | 0, 1);") expect_match2(scode, "Intercept = 1") expect_match2(scode, "sd_1[3] = 1;") expect_match2(scode, "sd_1[2] = 2;") expect_match2(scode, "sd_1[4] = par_sd_1_4;") expect_match2(scode, "target += normal_lpdf(sd_1[4] | 0, 5)") expect_match2(scode, "sigma = 0.3;") prior <- prior(constant(3)) scode <- make_stancode(y ~ x2 + x1 + cs(g), dat, family = sratio(), prior = prior) expect_match2(scode, "b = rep_vector(3, rows(b));") expect_match2(scode, "bcs = rep_matrix(3, rows(bcs), cols(bcs));") prior <- prior(normal(0, 3)) + prior(constant(3), coef = x1) + prior(constant(-1), coef = g) scode <- make_stancode(y ~ x1 + cs(x2) + cs(g), dat, family = sratio(), prior = prior) expect_match2(scode, "b[1] = 3;") expect_match2(scode, "bcs[1] = par_bcs_1;") expect_match2(scode, "target += normal_lpdf(bcs[1] | 0, 3);") expect_match2(scode, "bcs[2] = rep_row_vector(-1, cols(bcs[2]));") prior <- prior(constant(3), class = "sd", group = "g") + prior("constant([[1, 0], [0, 1]])", class = "cor") scode <- make_stancode(y ~ x1 + (x1 | gr(g, by = h)), dat, prior = prior) expect_match2(scode, "sd_1 = rep_matrix(3, rows(sd_1), cols(sd_1));") expect_match2(scode, "L_1[2] = [[1, 0], [0, 1]];") prior <- prior(constant(0.5), class = lscale, coef = gpx1h1) + prior(normal(0, 10), class = lscale, coef = gpx1h2) scode <- make_stancode(y ~ gp(x1, by = h), dat, prior = prior) expect_match2(scode, "lscale_1[1][1] = 0.5;") expect_match2(scode, "lscale_1[2][1] = par_lscale_1_2_1;") expect_match2(scode, "target += normal_lpdf(lscale_1[2][1] | 0, 10)") # test error messages prior <- prior(normal(0, 1), Intercept) + prior(constant(3), Intercept, coef = 2) expect_error( make_stancode(y ~ x1, data = dat, family = cumulative(), prior = prior), "Can either estimate or fix all values" ) }) test_that("link functions appear in the Stan code", { dat <- data.frame(y = 1:10, x = rnorm(10)) expect_match2(make_stancode(y ~ s(x), dat, family = poisson()), "target += poisson_log_lpmf(Y | mu);") expect_match2(make_stancode(mvbind(y, y + 1) ~ x, dat, family = gaussian("log")), "mu_y[n] = exp(mu_y[n]);") expect_match2(make_stancode(y ~ x, dat, family = von_mises(tan_half)), "mu[n] = inv_tan_half(mu[n]);") expect_match2(make_stancode(y ~ x, dat, family = weibull()), "mu[n] = exp(mu[n]) / tgamma(1 + 1 / shape);") expect_match2(make_stancode(y ~ x, dat, family = exponential("identity")), "mu[n] = inv(mu[n]);") expect_match2(make_stancode(y ~ x, dat, family = poisson("sqrt")), "mu[n] = square(mu[n]);") expect_match2(make_stancode(y ~ s(x), dat, family = bernoulli()), "target += bernoulli_logit_lpmf(Y | mu);") }) test_that("Stan GLM primitives are applied correctly", { dat <- data.frame(x = rnorm(10), y = 1:10) scode <- make_stancode(y ~ x, dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y | Xc, Intercept, b, sigma)") scode <- make_stancode(y ~ x, dat, family = bernoulli) expect_match2(scode, "bernoulli_logit_glm_lpmf(Y | Xc, Intercept, b)") scode <- make_stancode(y ~ x, dat, family = poisson) expect_match2(scode, "poisson_log_glm_lpmf(Y | Xc, Intercept, b)") scode <- make_stancode(y ~ x, dat, family = negbinomial) expect_match2(scode, "neg_binomial_2_log_glm_lpmf(Y | Xc, Intercept, b, shape)" ) scode <- make_stancode(y ~ 0 + x, dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y | X, 0, b, sigma)") bform <- bf(y ~ x) + bf(x ~ 1, family = negbinomial()) + set_rescor(FALSE) scode <- make_stancode(bform, dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y_y | Xc_y, Intercept_y, b_y, sigma_y)" ) scode <- make_stancode(bf(y ~ x, decomp = "QR"), dat, family = gaussian) expect_match2(scode, "normal_id_glm_lpdf(Y | XQ, Intercept, bQ, sigma);") }) test_that("customized covariances appear in the Stan code", { scode <- make_stancode(rating ~ treat + period + carry + (1|subject), data = inhaler, cov_ranef = list(subject = 1)) expect_match2(scode, "r_1_1 = (sd_1[1] * (Lcov_1 * z_1[1]))") scode <- make_stancode(rating ~ treat + period + carry + (1+carry|subject), data = inhaler, cov_ranef = list(subject = 1)) expect_match2(scode, "kronecker(Lcov_1, diag_pre_multiply(sd_1, L_1)) * to_vector(z_1)" ) expect_match2(scode, "cor_1[choose(k - 1, 2) + j] = Cor_1[j, k];") scode <- make_stancode(rating ~ treat + period + carry + (1+carry||subject), data = inhaler, cov_ranef = list(subject = 1)) expect_match2(scode, " r_1_1 = (sd_1[1] * (Lcov_1 * z_1[1]));") expect_match2(scode, " r_1_2 = (sd_1[2] * (Lcov_1 * z_1[2]));") }) test_that("truncation appears in the Stan code", { scode <- make_stancode(time | trunc(0) ~ age + sex + disease, data = kidney, family = "gamma") expect_match2(scode, "target += gamma_lpdf(Y[n] | shape, mu[n]) -") expect_match2(scode, "gamma_lccdf(lb[n] | shape, mu[n]);") scode <- make_stancode(time | trunc(ub = 100) ~ age + sex + disease, data = kidney, family = student("log")) expect_match2(scode, "target += student_t_lpdf(Y[n] | nu, mu[n], sigma) -") expect_match2(scode, "student_t_lcdf(ub[n] | nu, mu[n], sigma);") scode <- make_stancode(count | trunc(0, 150) ~ Trt, data = epilepsy, family = "poisson") expect_match2(scode, "target += poisson_lpmf(Y[n] | mu[n]) -") expect_match2(scode, "log_diff_exp(poisson_lcdf(ub[n] | mu[n]), poisson_lcdf(lb[n] - 1 | mu[n]));" ) }) test_that("make_stancode handles models without fixed effects", { expect_match2(make_stancode(count ~ 0 + (1|patient) + (1+Trt|visit), data = epilepsy, family = "poisson"), "mu = rep_vector(0, N);") }) test_that("make_stancode correctly restricts FE parameters", { data <- data.frame(y = rep(0:1, each = 5), x = rnorm(10)) scode <- make_stancode(y ~ x, data, prior = set_prior("", lb = 2)) expect_match2(scode, "vector[Kc] b") scode <- make_stancode( y ~ x, data, prior = set_prior("normal (0, 2)", ub = "4") ) expect_match2(scode, "vector[Kc] b") expect_match2(scode, "- 1 * normal_lcdf(4 | 0, 2)") prior <- set_prior("normal(0,5)", lb = "-3", ub = 5) scode <- make_stancode(y ~ 0 + x, data, prior = prior) expect_match2(scode, "vector[K] b") }) test_that("self-defined functions appear in the Stan code", { # cauchit link scode <- make_stancode(rating ~ treat, data = inhaler, family = bernoulli("cauchit")) expect_match2(scode, "real inv_cauchit(real y)") # softplus link scode <- make_stancode(rating ~ treat, data = inhaler, family = brmsfamily("poisson", "softplus")) expect_match2(scode, "real log_expm1(real x)") # tan_half link expect_match2(make_stancode(rating ~ treat, data = inhaler, family = von_mises("tan_half")), "real inv_tan_half(real y)") # logm1 link expect_match2(make_stancode(rating ~ treat, data = inhaler, family = frechet()), "real expp1(real y)") # inverse gaussian models scode <- make_stancode(time | cens(censored) ~ age, data = kidney, family = inverse.gaussian) expect_match2(scode, "real inv_gaussian_lpdf(real y") expect_match2(scode, "real inv_gaussian_lcdf(real y") expect_match2(scode, "real inv_gaussian_lccdf(real y") expect_match2(scode, "real inv_gaussian_vector_lpdf(vector y") # von Mises models scode <- make_stancode(time ~ age, data = kidney, family = von_mises) expect_match2(scode, "real von_mises_real_lpdf(real y") expect_match2(scode, "real von_mises_vector_lpdf(vector y") # zero-inflated and hurdle models expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_poisson"), "real zero_inflated_poisson_lpmf(int y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_negbinomial"), "real zero_inflated_neg_binomial_lpmf(int y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_binomial"), "real zero_inflated_binomial_lpmf(int y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = "zero_inflated_beta"), "real zero_inflated_beta_lpdf(real y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = "zero_one_inflated_beta"), "real zero_one_inflated_beta_lpdf(real y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = hurdle_poisson()), "real hurdle_poisson_lpmf(int y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = hurdle_negbinomial), "real hurdle_neg_binomial_lpmf(int y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = hurdle_gamma("log")), "real hurdle_gamma_lpdf(real y") expect_match2(make_stancode(count ~ Trt, data = epilepsy, family = hurdle_lognormal("identity")), "real hurdle_lognormal_lpdf(real y") # linear models with special covariance structures expect_match2( make_stancode(rating ~ treat + ar(cov = TRUE), data = inhaler), "real normal_time_hom_lpdf(vector y" ) expect_match2( make_stancode(time ~ age + ar(cov = TRUE), data = kidney, family = "student"), "real student_t_time_hom_lpdf(vector y" ) # ARMA covariance matrices expect_match2( make_stancode(rating ~ treat + ar(cov = TRUE), data = inhaler), "matrix cholesky_cor_ar1(real ar" ) expect_match2( make_stancode(time ~ age + ma(cov = TRUE), data = kidney), "matrix cholesky_cor_ma1(real ma" ) expect_match2( make_stancode(time ~ age + arma(cov = TRUE), data = kidney), "matrix cholesky_cor_arma1(real ar, real ma" ) # kronecker products expect_match(make_stancode(rating ~ treat + period + carry + (1+carry|subject), data = inhaler, cov_ranef = list(subject = 1)), "matrix as_matrix.*matrix kronecker") }) test_that("invalid combinations of modeling options are detected", { data <- data.frame(y1 = rnorm(10), y2 = rnorm(10), wi = 1:10, ci = sample(-1:1, 10, TRUE)) expect_error( make_stancode(y1 | cens(ci) ~ y2 + ar(cov = TRUE), data = data), "Invalid addition arguments for this model" ) expect_error( make_stancode(mvbind(y1, y2) ~ 1 + ar(cov = TRUE), data = data), "Explicit covariance terms cannot be modeled when 'rescor'" ) expect_error( make_stancode(y1 | resp_se(wi) ~ y2 + ma(), data = data), "Please set cov = TRUE in ARMA correlation structures" ) }) test_that("Stan code for multivariate models is correct", { dat <- data.frame( y1 = rnorm(10), y2 = rnorm(10), x = 1:10, g = rep(1:2, each = 5), censi = sample(0:1, 10, TRUE) ) # models with residual correlations prior <- prior(horseshoe(2), resp = "y1") + prior(horseshoe(2), resp = "y2") scode <- make_stancode(mvbind(y1, y2) ~ x, dat, prior = prior) expect_match2(scode, "target += multi_normal_cholesky_lpdf(Y | Mu, LSigma);") expect_match2(scode, "LSigma = diag_pre_multiply(sigma, Lrescor);") expect_match2(scode, "target += normal_lpdf(hs_local_y1[1] | 0, 1)") expect_match2(scode, "target += inv_gamma_lpdf(hs_local_y2[2] | 0.5 * hs_df_y2, 0.5 * hs_df_y2)" ) expect_match2(scode, "rescor[choose(k - 1, 2) + j] = Rescor[j, k];") prior <- prior(lasso(2, 10), resp = "y1") + prior(lasso(2, 10), resp = "y2") scode <- make_stancode(mvbind(y1, y2) ~ x, dat, student(), prior = prior) expect_match2(scode, "target += multi_student_t_lpdf(Y | nu, Mu, Sigma);") expect_match2(scode, "matrix[nresp, nresp] Sigma = multiply_lower") expect_match2(scode, "target += gamma_lpdf(nu | 2, 0.1)") expect_match2(scode, "target += chi_square_lpdf(lasso_inv_lambda_y1 | lasso_df_y1)" ) expect_match2(scode, "target += chi_square_lpdf(lasso_inv_lambda_y2 | lasso_df_y2)" ) expect_match2(make_stancode(mvbind(y1, y2) | weights(x) ~ 1, dat), "target += weights[n] * multi_normal_cholesky_lpdf(Y[n] | Mu[n], LSigma);" ) # models without residual correlations expect_warning( bform <- bf(y1 | cens(censi) ~ x + y2 + (x|2|g)) + gaussian() + cor_ar() + (bf(x ~ 1) + mixture(poisson, nmix = 2)) + (bf(y2 ~ s(y2) + (1|2|g)) + skew_normal()), "Using 'cor_brms' objects for 'autocor' is deprecated" ) bprior <- prior(normal(0, 5), resp = y1) + prior(normal(0, 10), resp = y2) scode <- make_stancode(bform, dat, prior = bprior) expect_match2(scode, "r_1_y2_3 = r_1[, 3]") expect_match2(scode, "err_y1[n] = Y_y1[n] - mu_y1[n]") expect_match2(scode, "target += normal_lccdf(Y_y1[n] | mu_y1[n], sigma_y1)") expect_match2(scode, "target += skew_normal_lpdf(Y_y2 | mu_y2, omega_y2, alpha_y2)") expect_match2(scode, "ps[1] = log(theta1_x) + poisson_log_lpmf(Y_x[n] | mu1_x[n])") expect_match2(scode, "target += normal_lpdf(b_y1 | 0, 5)") expect_match2(scode, "target += normal_lpdf(bs_y2 | 0, 10)") # multivariate binomial models bform <- bf(x ~ 1) + bf(g ~ 1) + binomial() scode <- make_stancode(bform, dat) expect_match2(scode, "binomial_logit_lpmf(Y_x | trials_x, mu_x)") expect_match2(scode, "binomial_logit_lpmf(Y_g | trials_g, mu_g)") bform <- bform + weibull() scode <- make_stancode(bform, dat) expect_match2(scode, "mu_g[n] = exp(mu_g[n]) / tgamma(1 + 1 / shape_g)") }) test_that("Stan code for categorical models is correct", { dat <- data.frame(y = rep(c(1, 2, 3, "a_b"), 2), x = 1:8, .g = 1:8) prior <- prior(normal(0, 5), "b", dpar = muab) + prior(normal(0, 10), "b", dpar = mu2) + prior(cauchy(0, 1), "Intercept", dpar = mu2) + prior(normal(0, 2), "Intercept", dpar = mu3) scode <- make_stancode(y ~ x + (1 |ID| .g), data = dat, family = categorical(), prior = prior) expect_match2(scode, "target += categorical_logit_lpmf(Y[n] | mu[n]);") expect_match2(scode, "mu[n] = [0, mu2[n], mu3[n], muab[n]]';") expect_match2(scode, "mu2 = Intercept_mu2 + Xc_mu2 * b_mu2;") expect_match2(scode, "muab[n] += r_1_muab_3[J_1[n]] * Z_1_muab_3[n];") expect_match2(scode, "target += normal_lpdf(b_mu2 | 0, 10);") expect_match2(scode, "target += normal_lpdf(b_muab | 0, 5);") expect_match2(scode, "target += cauchy_lpdf(Intercept_mu2 | 0, 1);") expect_match2(scode, "target += normal_lpdf(Intercept_mu3 | 0, 2);") scode <- make_stancode(y ~ x + (1 |ID| .g), data = dat, family = categorical(refcat = NA)) expect_match2(scode, "mu[n] = [mu1[n], mu2[n], mu3[n], muab[n]]';") }) test_that("Stan code for multinomial models is correct", { N <- 15 dat <- data.frame( y1 = rbinom(N, 10, 0.3), y2 = rbinom(N, 10, 0.5), y3 = rbinom(N, 10, 0.7), x = rnorm(N) ) dat$size <- with(dat, y1 + y2 + y3) dat$y <- with(dat, cbind(y1, y2, y3)) prior <- prior(normal(0, 10), "b", dpar = muy2) + prior(cauchy(0, 1), "Intercept", dpar = muy2) + prior(normal(0, 2), "Intercept", dpar = muy3) scode <- make_stancode(bf(y | trials(size) ~ 1, muy2 ~ x), data = dat, family = multinomial(), prior = prior) expect_match2(scode, "int Y[N, ncat];") expect_match2(scode, "target += multinomial_logit_lpmf(Y[n] | mu[n]);") expect_match2(scode, "muy2 = Intercept_muy2 + Xc_muy2 * b_muy2;") expect_match2(scode, "target += normal_lpdf(b_muy2 | 0, 10);") expect_match2(scode, "target += cauchy_lpdf(Intercept_muy2 | 0, 1);") expect_match2(scode, "target += normal_lpdf(Intercept_muy3 | 0, 2);") }) test_that("Stan code for dirichlet models is correct", { N <- 15 dat <- as.data.frame(rdirichlet(N, c(3, 2, 1))) names(dat) <- c("y1", "y2", "y3") dat$x <- rnorm(N) dat$y <- with(dat, cbind(y1, y2, y3)) prior <- prior(normal(0, 5), class = "b", dpar = "muy3") + prior(exponential(10), "phi") scode <- make_stancode(bf(y ~ 1, muy3 ~ x), data = dat, family = dirichlet(), prior = prior) expect_match2(scode, "vector[ncat] Y[N];") expect_match2(scode, "target += dirichlet_logit_lpdf(Y[n] | mu[n], phi);") expect_match2(scode, "muy3 = Intercept_muy3 + Xc_muy3 * b_muy3;") expect_match2(scode, "target += normal_lpdf(b_muy3 | 0, 5);") expect_match2(scode, "target += exponential_lpdf(phi | 10);") scode <- make_stancode(bf(y ~ x, phi ~ x), data = dat, family = dirichlet()) expect_match2(scode, "target += dirichlet_logit_lpdf(Y[n] | mu[n], phi[n]);") expect_match2(scode, "vector[N] phi = Intercept_phi + Xc_phi * b_phi;") expect_match2(scode, "phi[n] = exp(phi[n]);") }) test_that("Stan code for ARMA models is correct", { dat <- data.frame(y = rep(1:4, 2), x = 1:8, time = 1:8) scode <- make_stancode(y ~ x + ar(time), dat, student()) expect_match2(scode, "err[n] = Y[n] - mu[n];") expect_match2(scode, "mu[n] += Err[n, 1:Kar] * ar;") scode <- make_stancode(y ~ x + ma(time, q = 2), dat, student()) expect_match2(scode, "mu[n] += Err[n, 1:Kma] * ma;") expect_warning( scode <- make_stancode(mvbind(y, x) ~ 1, dat, gaussian(), autocor = cor_ar()), "Argument 'autocor' should be specified within the 'formula' argument" ) expect_match2(scode, "err_y[n] = Y_y[n] - mu_y[n];") bform <- bf(y ~ x, sigma ~ x) + acformula(~arma(time, cov = TRUE)) scode <- make_stancode(bform, dat, family = student) expect_match2(scode, "student_t_time_het_lpdf(Y | nu, mu, sigma, chol_cor") bform <- bf(y ~ exp(eta) - 1, eta ~ x, autocor = ~ar(time), nl = TRUE) scode <- make_stancode(bform, dat, family = student, prior = prior(normal(0, 1), nlpar = eta)) expect_match2(scode, "mu[n] += Err[n, 1:Kar] * ar;") # correlations of latent residuals scode <- make_stancode( y ~ x + ar(time, cov = TRUE), dat, family = poisson, prior = prior(cauchy(0, 10), class = sderr) ) expect_match2(scode, "chol_cor = cholesky_cor_ar1(ar[1], max(nobs_tg));") expect_match2(scode, "err = scale_time_err(zerr, sderr, chol_cor, nobs_tg, begin_tg, end_tg);" ) expect_match2(scode, "vector[N] mu = Intercept + Xc * b + err;") expect_match2(scode, "target += cauchy_lpdf(sderr | 0, 10);") }) test_that("Stan code for compound symmetry models is correct", { dat <- data.frame(y = rep(1:4, 2), x = 1:8, time = 1:8) scode <- make_stancode( y ~ x + cosy(time), dat, prior = prior(normal(0, 2), cosy) ) expect_match2(scode, "chol_cor = cholesky_cor_cosy(cosy, max(nobs_tg));") expect_match2(scode, "target += normal_lpdf(cosy | 0, 2);") scode <- make_stancode(bf(y ~ x + cosy(time), sigma ~ x), dat) expect_match2(scode, "normal_time_het_lpdf(Y | mu, sigma, chol_cor") scode <- make_stancode(y ~ x + cosy(time), dat, family = poisson) expect_match2(scode, "chol_cor = cholesky_cor_cosy(cosy, max(nobs_tg));") }) test_that("Stan code for intercept only models is correct", { expect_match2(make_stancode(rating ~ 1, data = inhaler), "b_Intercept = Intercept;") expect_match2(make_stancode(rating ~ 1, data = inhaler, family = cratio()), "b_Intercept = Intercept;") expect_match2(make_stancode(rating ~ 1, data = inhaler, family = categorical()), "b_mu3_Intercept = Intercept_mu3;") }) test_that("Stan code of ordinal models is correct", { dat <- data.frame(y = c(rep(1:4, 2), 1, 1), x1 = rnorm(10), x2 = rnorm(10), g = rep(1:2, 5)) scode <- make_stancode( y ~ x1, dat, family = cumulative(), prior = prior(normal(0, 2), Intercept, coef = 2) ) expect_match2(scode, "target += ordered_logistic_lpmf(Y[n] | mu[n], Intercept);" ) expect_match2(scode, "target += student_t_lpdf(Intercept[1] | 3, 0, 10);") expect_match2(scode, "target += normal_lpdf(Intercept[2] | 0, 2);") scode <- make_stancode( y ~ x1, dat, cumulative("probit", threshold = "equidistant"), prior = prior(normal(0, 2), Intercept) ) expect_match2(scode, "real cumulative_probit_lpmf(int y") expect_match2(scode, "p = Phi(disc * (thres[1] - mu));") expect_match2(scode, "real delta;") expect_match2(scode, "Intercept[k] = first_Intercept + (k - 1.0) * delta;") expect_match2(scode, "b_Intercept = Intercept + dot_product(means_X, b);") expect_match2(scode, "target += normal_lpdf(first_Intercept | 0, 2);") scode <- make_stancode(y ~ x1, dat, family = cratio("probit_approx")) expect_match2(scode, "real cratio_probit_approx_lpmf(int y") expect_match2(scode, "q[k] = Phi_approx(disc * (mu - thres[k]));") scode <- make_stancode(y ~ x1 + cs(x2) + cs(g), dat, family = sratio()) expect_match2(scode, "real sratio_logit_lpmf(int y") expect_match2(scode, "matrix[N, Kcs] Xcs;") expect_match2(scode, "matrix[Kcs, nthres] bcs;") expect_match2(scode, "mucs = Xcs * bcs;") expect_match2(scode, "target += sratio_logit_lpmf(Y[n] | mu[n], disc, Intercept - mucs[n]');" ) scode <- make_stancode(y ~ x1 + cse(x2) + (cse(1)|g), dat, family = acat()) expect_match2(scode, "real acat_logit_lpmf(int y") expect_match2(scode, "mucs[n, 1] = mucs[n, 1] + r_1_1[J_1[n]] * Z_1_1[n];") expect_match2(scode, "b_Intercept = Intercept + dot_product(means_X, b);") scode <- make_stancode(y ~ x1 + (cse(x2)||g), dat, family = acat("probit")) expect_match2(scode, paste("mucs[n, 3] = mucs[n, 3] + r_1_3[J_1[n]] * Z_1_3[n]", "+ r_1_6[J_1[n]] * Z_1_6[n];")) expect_match2(scode, "target += acat_probit_lpmf(Y[n] | mu[n], disc, Intercept - mucs[n]');" ) # non-linear ordinal models scode <- make_stancode( bf(y ~ eta, eta ~ x1, nl = TRUE), dat, family = cumulative(), prior = prior(normal(0, 2), nlpar = eta) ) expect_match2(scode, "ordered[nthres] Intercept;") expect_match2(scode, "target += ordered_logistic_lpmf(Y[n] | mu[n], Intercept);" ) # ordinal mixture models with fixed intercepts scode <- make_stancode( bf(y ~ 1, mu1 ~ x1, mu2 ~ 1), data = dat, family = mixture(cumulative(), nmix = 2, order = "mu") ) expect_match2(scode, "Intercept_mu2 = fixed_Intercept;") expect_match2(scode, "target += student_t_lpdf(fixed_Intercept | 3, 0, 10);") }) test_that("ordinal disc parameters appear in the Stan code", { scode <- make_stancode( bf(rating ~ period + carry + treat, disc ~ period), data = inhaler, family = cumulative(), prior = prior(normal(0,5), dpar = disc) ) expect_match2(scode, "target += cumulative_logit_lpmf(Y[n] | mu[n], disc[n], Intercept)" ) expect_match2(scode, "target += normal_lpdf(b_disc | 0, 5)") expect_match2(scode, "disc[n] = exp(disc[n])") }) test_that("grouped ordinal thresholds appear in the Stan code", { dat <- data.frame( y = sample(1:6, 10, TRUE), y2 = sample(1:6, 10, TRUE), gr = rep(c("a", "b"), each = 5), th = rep(5:6, each = 5), x = rnorm(10) ) prior <- prior(normal(0,1), class = "Intercept", group = "b") scode <- make_stancode( y | thres(th, gr) ~ x, data = dat, family = sratio(), prior = prior ) expect_match2(scode, "int nthres[ngrthres];") expect_match2(scode, "merged_Intercept[Kthres_start[1]:Kthres_end[1]] = Intercept_1;") expect_match2(scode, "target += sratio_logit_merged_lpmf(Y[n]") expect_match2(scode, "target += normal_lpdf(Intercept_2 | 0, 1);") # centering needs to be deactivated automatically expect_match2(scode, "vector[nthres[1]] b_Intercept_1 = Intercept_1;") # model with equidistant thresholds scode <- make_stancode( y | thres(th, gr) ~ x, data = dat, family = cumulative(threshold = "equidistant"), prior = prior ) expect_match2(scode, "target += cumulative_logit_merged_lpmf(Y[n]") expect_match2(scode, "real first_Intercept_1;") expect_match2(scode, "target += normal_lpdf(first_Intercept_2 | 0, 1);") expect_match2(scode, "Intercept_2[k] = first_Intercept_2 + (k - 1.0) * delta_2;") # ordinal mixture model scode <- make_stancode( y | thres(th, gr) ~ x, data = dat, family = mixture(cratio, acat, order = "mu"), prior = prior ) expect_match2(scode, "ps[1] = log(theta1) + cratio_logit_merged_lpmf(Y[n]") expect_match2(scode, "ps[2] = log(theta2) + acat_logit_merged_lpmf(Y[n]") expect_match2(scode, "vector[nmthres] merged_Intercept_mu1;") expect_match2(scode, "merged_Intercept_mu2[Kthres_start[1]:Kthres_end[1]] = Intercept_mu2_1;") expect_match2(scode, "vector[nthres[1]] b_mu1_Intercept_1 = Intercept_mu1_1;") # multivariate ordinal model bform <- bf(y | thres(th, gr) ~ x, family = sratio) + bf(y2 | thres(th, gr) ~ x, family = cumulative) scode <- make_stancode(bform, data = dat) expect_match2(scode, "target += student_t_lpdf(Intercept_y2_1 | 3, 0, 10);") expect_match2(scode, "merged_Intercept_y[Kthres_start_y[2]:Kthres_end_y[2]] = Intercept_y_2;") }) test_that("monotonic effects appear in the Stan code", { dat <- data.frame(y = rpois(120, 10), x1 = rep(1:4, 30), x2 = factor(rep(c("a", "b", "c"), 40), ordered = TRUE), g = rep(1:10, each = 12)) prior <- c(prior(normal(0,1), class = b, coef = mox1), prior(dirichlet(c(1,0.5,2)), simo, coef = mox11), prior(dirichlet(c(1,0.5,2)), simo, coef = mox21)) scode <- make_stancode(y ~ y*mo(x1)*mo(x2), dat, prior = prior) expect_match2(scode, "int Xmo_3[N];") expect_match2(scode, "simplex[Jmo[1]] simo_1;") expect_match2(scode, "(bsp[2]) * mo(simo_2, Xmo_2[n])") expect_match2(scode, "(bsp[6]) * mo(simo_7, Xmo_7[n]) * mo(simo_8, Xmo_8[n]) * Csp_3[n]" ) expect_match2(scode, "target += normal_lpdf(bsp[1] | 0, 1)") expect_match2(scode, "target += dirichlet_lpdf(simo_1 | con_simo_1);") expect_match2(scode, "target += dirichlet_lpdf(simo_8 | con_simo_8);") scode <- make_stancode(y ~ mo(x1) + (mo(x1) | x2), dat) expect_match2(scode, "(bsp[1] + r_1_2[J_1[n]]) * mo(simo_1, Xmo_1[n])") expect_true(!grepl("Z_1_w", scode)) # test issue reported in discourse post #12978 scode <- make_stancode(y ~ mo(x1) + (mo(x1) | x2) + (mo(x1) | g), dat) expect_match2(scode, "(bsp[1] + r_1_2[J_1[n]] + r_2_2[J_2[n]]) * mo(simo_1, Xmo_1[n])") # test issue #813 scode <- make_stancode(y ~ mo(x1):y, dat) expect_match2(scode, "mu[n] += (bsp[1]) * mo(simo_1, Xmo_1[n]) * Csp_1[n];") expect_error( make_stancode(y ~ mo(x1) + (mo(x2) | x2), dat), "Special group-level terms require" ) prior <- prior(beta(1, 1), simo, coef = mox11) expect_error( make_stancode(y ~ mo(x1), dat, prior = prior), "'dirichlet' is the only valid prior for simplex parameters" ) }) test_that("Stan code for non-linear models is correct", { flist <- list(a ~ x, b ~ z + (1|g)) data <- data.frame( y = rgamma(9, 1, 1), x = rnorm(9), z = rnorm(9), v = 1L:9L, g = rep(1:3, 3) ) prior <- c(set_prior("normal(0,5)", nlpar = "a"), set_prior("normal(0,1)", nlpar = "b")) # syntactic validity is already checked within make_stancode scode <- make_stancode( bf(y ~ a - exp(b^z) * (z <= a) * v, flist = flist, nl = TRUE), data = data, prior = prior ) expect_match2(scode, "mu[n] = nlp_a[n] - exp(nlp_b[n] ^ C_1[n]) * (C_1[n] <= nlp_a[n]) * C_2[n];" ) expect_match2(scode, "vector[N] C_1;") expect_match2(scode, "int C_2[N];") # non-linear predictor can be computed outside a loop scode <- make_stancode(bf(y ~ a - exp(b + z), flist = flist, nl = TRUE, loop = FALSE), data = data, prior = prior) expect_match2(scode, "\n mu = nlp_a - exp(nlp_b + C_1);") flist <- list(a1 ~ 1, a2 ~ z + (x|g)) prior <- c(set_prior("beta(1,1)", nlpar = "a1", lb = 0, ub = 1), set_prior("normal(0,1)", nlpar = "a2")) scode <- make_stancode( bf(y ~ a1 * exp(-x/(a2 + z)), flist = flist, nl = TRUE), data = data, family = Gamma("log"), prior = prior ) expect_match2(scode, paste("mu[n] = shape * exp(-(nlp_a1[n] *", "exp( - C_1[n] / (nlp_a2[n] + C_2[n]))));")) bform <- bf(y ~ x) + nlf(sigma ~ a1 * exp(-x/(a2 + z))) + lf(a1 ~ 1, a2 ~ z + (x|g)) + lf(alpha ~ x) scode <- make_stancode( bform, data, family = skew_normal(), prior = c( prior(normal(0, 1), nlpar = a1), prior(normal(0, 5), nlpar = a2) ) ) expect_match2(scode, "nlp_a1 = X_a1 * b_a1") expect_match2(scode, "sigma[n] = exp(nlp_a1[n] * exp( - C_sigma_1[n] / (nlp_a2[n] + C_sigma_2[n])))" ) expect_match2(scode, "target += normal_lpdf(b_a2 | 0, 5)") expect_error(make_stancode(bform, data, family = skew_normal()), "Priors on population-level coefficients are required") }) test_that("Stan code for nested non-linear parameters is correct", { dat <- data.frame(y = rnorm(10), x = rnorm(10), z = 1:5) bform <- bf( y ~ lb + (1 - lb) * inv_logit(b * x), b + a ~ 1 + (1 | z), nlf(lb ~ inv_logit(a / x)), nl = TRUE ) bprior <- prior(normal(0, 1), nlpar = "a") + prior(normal(0, 1), nlpar = "b") scode <- make_stancode(bform, dat, prior = bprior) expect_match2(scode, "nlp_lb[n] = inv_logit(nlp_a[n] / C_lb_1[n]);") expect_match2(scode, "mu[n] = nlp_lb[n] + (1 - nlp_lb[n]) * inv_logit(nlp_b[n] * C_1[n]);" ) }) test_that("make_stancode accepts very long non-linear formulas", { data <- data.frame(y = rnorm(10), this_is_a_very_long_predictor = rnorm(10)) expect_silent(make_stancode(bf(y ~ b0 + this_is_a_very_long_predictor + this_is_a_very_long_predictor + this_is_a_very_long_predictor, b0 ~ 1, nl = TRUE), data = data, prior = prior(normal(0,1), nlpar = "b0"))) }) test_that("no loop in trans-par is defined for simple 'identity' models", { expect_true(!grepl(make_stancode(time ~ age, data = kidney), "mu[n] = (mu[n]);", fixed = TRUE)) expect_true(!grepl(make_stancode(time ~ age, data = kidney, family = poisson("identity")), "mu[n] = (mu[n]);", fixed = TRUE)) }) test_that("known standard errors appear in the Stan code", { scode <- make_stancode(time | se(age) ~ sex, data = kidney) expect_match2(scode, "target += normal_lpdf(Y | mu, se)") scode <- make_stancode(time | se(age) + weights(age) ~ sex, data = kidney) expect_match2(scode, "target += weights[n] * normal_lpdf(Y[n] | mu[n], se[n])") scode <- make_stancode(time | se(age, sigma = TRUE) ~ sex, data = kidney) expect_match2(scode, "target += normal_lpdf(Y | mu, sqrt(square(sigma) + se2))") scode <- make_stancode(bf(time | se(age, sigma = TRUE) ~ sex, sigma ~ sex), data = kidney) expect_match2(scode, "target += normal_lpdf(Y | mu, sqrt(square(sigma) + se2))") }) test_that("functions defined in 'stan_funs' appear in the functions block", { test_fun <- paste0(" real test_fun(real a, real b) {\n", " return a + b;\n", " }\n") scode <- SW(make_stancode(time ~ age, data = kidney, stan_funs = test_fun)) expect_match2(scode, test_fun) }) test_that("FCOR matrices appear in the Stan code", { data <- data.frame(y = 1:5) V <- diag(5) expect_match2(make_stancode(y ~ fcor(V), data = data, family = gaussian()), "target += normal_fcor_hom_lpdf(Y | mu, sigma, Lfcor);") expect_match2(make_stancode(y ~ fcor(V), data = data, family = student()), "target += student_t_fcor_hom_lpdf(Y | nu, mu, sigma, Lfcor);") }) test_that("Stan code for GAMMs is correct", { dat <- data.frame(y = rnorm(10), x = rnorm(10), g = factor(rep(1:2, 5))) scode <- make_stancode(y ~ s(x) + (1|g), data = dat, prior = set_prior("normal(0,2)", "sds")) expect_match2(scode, "Zs_1_1 * s_1_1") expect_match2(scode, "matrix[N, knots_1[1]] Zs_1_1") expect_match2(scode, "target += normal_lpdf(zs_1_1 | 0, 1)") expect_match2(scode, "target += normal_lpdf(sds_1_1 | 0,2)") prior <- c(set_prior("normal(0,5)", nlpar = "lp"), set_prior("normal(0,2)", "sds", nlpar = "lp")) scode <- make_stancode(bf(y ~ lp, lp ~ s(x) + (1|g), nl = TRUE), data = dat, prior = prior) expect_match2(scode, "Zs_lp_1_1 * s_lp_1_1") expect_match2(scode, "matrix[N, knots_lp_1[1]] Zs_lp_1_1") expect_match2(scode, "target += normal_lpdf(zs_lp_1_1 | 0, 1)") expect_match2(scode, "target += normal_lpdf(sds_lp_1_1 | 0,2)") scode <- make_stancode(y ~ s(x) + t2(x,y), data = dat, prior = set_prior("normal(0,2)", "sds")) expect_match2(scode, "Zs_2_2 * s_2_2") expect_match2(scode, "matrix[N, knots_2[2]] Zs_2_2") expect_match2(scode, "target += normal_lpdf(zs_2_2 | 0, 1)") expect_match2(scode, "target += normal_lpdf(sds_2_2 | 0,2)") scode <- make_stancode(y ~ g + s(x, by = g), data = dat) expect_match2(scode, "vector[knots_2[1]] zs_2_1") expect_match2(scode, "s_2_1 = sds_2_1 * zs_2_1") }) test_that("Stan code of response times models is correct", { dat <- epilepsy dat$cens <- sample(-1:1, nrow(dat), TRUE) scode <- make_stancode(count ~ Trt + (1|patient), data = dat, family = exgaussian("log"), prior = prior(gamma(1,1), class = beta)) expect_match2(scode, "target += exp_mod_normal_lpdf(Y | mu - beta, sigma, inv(beta))" ) expect_match2(scode, "mu[n] = exp(mu[n])") expect_match2(scode, "target += gamma_lpdf(beta | 1, 1)") scode <- make_stancode(bf(count ~ Trt + (1|patient), sigma ~ Trt, beta ~ Trt), data = dat, family = exgaussian()) expect_match2(scode, "target += exp_mod_normal_lpdf(Y | mu - beta, sigma, inv(beta))" ) expect_match2(scode, "beta[n] = exp(beta[n])") scode <- make_stancode(count | cens(cens) ~ Trt + (1|patient), data = dat, family = exgaussian("inverse")) expect_match2(scode, "exp_mod_normal_lccdf(Y[n] | mu[n] - beta, sigma, inv(beta))") scode <- make_stancode(count ~ Trt, dat, family = shifted_lognormal()) expect_match2(scode, "target += lognormal_lpdf(Y - ndt | mu, sigma)") scode <- make_stancode(count | cens(cens) ~ Trt, dat, family = shifted_lognormal()) expect_match2(scode, "target += lognormal_lcdf(Y[n] - ndt | mu[n], sigma)") # test issue #837 scode <- make_stancode(mvbind(count, zBase) ~ Trt, data = dat, family = shifted_lognormal()) expect_match2(scode, "target += uniform_lpdf(ndt_count | 0, min_Y_count)") expect_match2(scode, "target += uniform_lpdf(ndt_zBase | 0, min_Y_zBase)") }) test_that("Stan code of wiener diffusion models is correct", { dat <- data.frame(q = 1:10, resp = sample(0:1, 10, TRUE), x = rnorm(10)) scode <- make_stancode(q | dec(resp) ~ x, data = dat, family = wiener()) expect_match2(scode, "target += wiener_diffusion_lpdf(Y[n] | dec[n], bs, ndt, bias, mu[n])" ) scode <- make_stancode(bf(q | dec(resp) ~ x, bs ~ x, ndt ~ x, bias ~ x), data = dat, family = wiener()) expect_match2(scode, "target += wiener_diffusion_lpdf(Y[n] | dec[n], bs[n], ndt[n], bias[n], mu[n])" ) expect_match2(scode, "bias[n] = inv_logit(bias[n]);") scode <- make_stancode(bf(q | dec(resp) ~ x, ndt = 0.5), data = dat, family = wiener()) expect_match2(scode, "real ndt;") expect_error(make_stancode(q ~ x, data = dat, family = wiener()), "Addition argument 'dec' is required for family 'wiener'") }) test_that("Group IDs appear in the Stan code", { form <- bf(count ~ Trt + (1+Trt|3|visit) + (1|patient), shape ~ (1|3|visit) + (Trt||patient)) scode <- make_stancode(form, data = epilepsy, family = negbinomial()) expect_match2(scode, "r_2_1 = r_2[, 1]") expect_match2(scode, "r_2_shape_3 = r_2[, 3]") form <- bf(count ~ a, sigma ~ (1|3|visit) + (Trt||patient), a ~ Trt + (1+Trt|3|visit) + (1|patient), nl = TRUE) scode <- make_stancode(form, data = epilepsy, family = student(), prior = set_prior("normal(0,5)", nlpar = "a")) expect_match2(scode, "r_2_a_2 = r_2[, 2];") expect_match2(scode, "r_1_sigma_2 = (sd_1[2] * (z_1[2]));") }) test_that("distributional gamma models are handled correctly", { # test fix of issue #124 scode <- make_stancode( bf(time ~ age * sex + disease + (1|patient), shape ~ age + (1|patient)), data = kidney, family = Gamma("log") ) expect_match(scode, paste0( brms:::escape_all("shape[n] = exp(shape[n]);"), ".+", brms:::escape_all("mu[n] = shape[n] * exp(-(mu[n]));") )) scode <- make_stancode( bf(time ~ inv_logit(a) * exp(b * age), a + b ~ sex + (1|patient), nl = TRUE, shape ~ age + (1|patient)), data = kidney, family = Gamma("identity"), prior = c(set_prior("normal(2,2)", nlpar = "a"), set_prior("normal(0,3)", nlpar = "b")) ) expect_match(scode, paste0( brms:::escape_all("shape[n] = exp(shape[n]);"), ".+", brms:::escape_all("mu[n] = shape[n] / (inv_logit(nlp_a[n]) * exp(nlp_b[n] * C_1[n]));") )) }) test_that("weighted, censored, and truncated likelihoods are correct", { dat <- data.frame(y = 1:9, x = rep(-1:1, 3), y2 = 10:18) scode <- make_stancode(y | weights(y2) ~ 1, dat, poisson()) expect_match2(scode, "target += weights[n] * poisson_log_lpmf(Y[n] | mu[n]);") scode <- make_stancode(y | trials(y2) + weights(y2) ~ 1, dat, binomial()) expect_match2(scode, "target += weights[n] * binomial_logit_lpmf(Y[n] | trials[n], mu[n]);" ) expect_match2(make_stancode(y | cens(x, y2) ~ 1, dat, poisson()), "target += poisson_lpmf(Y[n] | mu[n]);") expect_match2(make_stancode(y | cens(x) ~ 1, dat, weibull()), "target += weibull_lccdf(Y[n] | shape, mu[n]);") dat$x[1] <- 2 scode <- make_stancode(y | cens(x, y2) ~ 1, dat, gaussian()) expect_match2(scode, paste0( "target += log_diff_exp(\n", " normal_lcdf(rcens[n] | mu[n], sigma)," )) dat$x <- 1 expect_match2(make_stancode(y | cens(x) + weights(x) ~ 1, dat, weibull()), "target += weights[n] * weibull_lccdf(Y[n] | shape, mu[n]);") scode <- make_stancode(y | cens(x) + trunc(0.1) ~ 1, dat, weibull()) expect_match2(scode, "target += weibull_lccdf(Y[n] | shape, mu[n]) -") expect_match2(scode, " weibull_lccdf(lb[n] | shape, mu[n]);") scode <- make_stancode(y | cens(x) + trunc(ub = 30) ~ 1, dat) expect_match2(scode, "target += normal_lccdf(Y[n] | mu[n], sigma) -") expect_match2(scode, " normal_lcdf(ub[n] | mu[n], sigma);") scode <- make_stancode(y | weights(x) + trunc(0, 30) ~ 1, dat) expect_match2(scode, "target += weights[n] * normal_lpdf(Y[n] | mu[n], sigma) -") expect_match2(scode, " log_diff_exp(normal_lcdf(ub[n] | mu[n], sigma),") }) test_that("noise-free terms appear in the Stan code", { N <- 30 dat <- data.frame( y = rnorm(N), x = rnorm(N), z = rnorm(N), xsd = abs(rnorm(N, 1)), zsd = abs(rnorm(N, 1)), ID = rep(1:5, each = N / 5) ) me_prior <- prior(normal(0,5)) + prior(normal(0, 10), "meanme") + prior(cauchy(0, 5), "sdme", coef = "mez") + prior(lkj(2), "corme") scode <- make_stancode( y ~ me(x, xsd)*me(z, zsd)*x, data = dat, prior = me_prior, sample_prior = "yes" ) expect_match2(scode, "(bsp[1]) * Xme_1[n] + (bsp[2]) * Xme_2[n] + (bsp[3]) * Xme_1[n] * Xme_2[n]" ) expect_match2(scode, "(bsp[6]) * Xme_1[n] * Xme_2[n] * Csp_3[n]") expect_match2(scode, "target += normal_lpdf(Xn_2 | Xme_2, noise_2)") expect_match2(scode, "target += normal_lpdf(bsp | 0, 5)") expect_match2(scode, "target += normal_lpdf(to_vector(zme_1) | 0, 1)") expect_match2(scode, "target += normal_lpdf(meanme_1 | 0, 10)") expect_match2(scode, "target += cauchy_lpdf(sdme_1[2] | 0, 5)") expect_match2(scode, "target += lkj_corr_cholesky_lpdf(Lme_1 | 2)") expect_match2(scode, "+ (diag_pre_multiply(sdme_1, Lme_1) * zme_1)'") expect_match2(scode, "corme_1[choose(k - 1, 2) + j] = Corme_1[j, k];") scode <- make_stancode( y ~ me(x, xsd)*z + (me(x, xsd)*z | ID), data = dat ) expect_match2(scode, "(bsp[1] + r_1_3[J_1[n]]) * Xme_1[n]") expect_match2(scode, "(bsp[2] + r_1_4[J_1[n]]) * Xme_1[n] * Csp_1[n]") expect_match2(make_stancode(y ~ I(me(x, xsd)^2), data = dat), "(bsp[1]) * (Xme_1[n]^2)") # test that noise-free variables are unique across model parts scode <- make_stancode( bf(y ~ me(x, xsd)*me(z, zsd)*x, sigma ~ me(x, xsd)), data = dat, prior = prior(normal(0,5)) ) expect_match2(scode, "mu[n] += (bsp[1]) * Xme_1[n]") expect_match2(scode, "sigma[n] += (bsp_sigma[1]) * Xme_1[n]") scode <- make_stancode( bf(y ~ a * b, a + b ~ me(x, xsd), nl = TRUE), data = dat, prior = prior(normal(0,5), nlpar = a) + prior(normal(0, 5), nlpar = b) ) expect_match2(scode, "nlp_a[n] += (bsp_a[1]) * Xme_1[n]") expect_match2(scode, "nlp_b[n] += (bsp_b[1]) * Xme_1[n]") bform <- bf(mvbind(y, z) ~ me(x, xsd)) + set_mecor(FALSE) scode <- make_stancode(mvbind(y, z) ~ me(x, xsd), dat) expect_match2(scode, "mu_y[n] += (bsp_y[1]) * Xme_1[n]") expect_match2(scode, "mu_z[n] += (bsp_z[1]) * Xme_1[n]") expect_match2(scode, "Xme_1 = meanme_1[1] + sdme_1[1] * zme_1;") # noise-free terms with grouping factors bform <- bf(y ~ me(x, xsd, ID) + (me(x, xsd, ID) | ID)) scode <- make_stancode(bform, dat) expect_match2(scode, "vector[Nme_1] Xn_1;") expect_match2(scode, "(bsp[1] + r_1_2[J_1[n]]) * Xme_1[Jme_1[n]]") bform <- bform + set_mecor(FALSE) scode <- make_stancode(bform, dat) expect_match2(scode, "Xme_1 = meanme_1[1] + sdme_1[1] * zme_1;") }) test_that("Stan code of multi-membership models is correct", { dat <- data.frame(y = rnorm(10), g1 = sample(1:10, 10, TRUE), g2 = sample(1:10, 10, TRUE), w1 = rep(1, 10), w2 = rep(abs(rnorm(10)))) expect_match2(make_stancode(y ~ (1|mm(g1, g2)), data = dat), paste0(" W_1_1[n] * r_1_1[J_1_1[n]] * Z_1_1_1[n]", " + W_1_2[n] * r_1_1[J_1_2[n]] * Z_1_1_2[n]") ) expect_match2(make_stancode(y ~ (1+w1|mm(g1,g2)), data = dat), paste0(" W_1_1[n] * r_1_2[J_1_1[n]] * Z_1_2_1[n]", " + W_1_2[n] * r_1_2[J_1_2[n]] * Z_1_2_2[n]") ) expect_match2(make_stancode(y ~ (1+mmc(w1, w2)|mm(g1,g2)), data = dat), " W_1_2[n] * r_1_2[J_1_2[n]] * Z_1_2_2[n];" ) }) test_that("by variables in grouping terms are handled correctly", { dat <- data.frame( y = rnorm(100), x = rnorm(100), g = rep(1:10, each = 10), z = factor(rep(c(0, 4.5, 3, 2, 5), each = 20)) ) scode <- make_stancode(y ~ x + (1 | gr(g, by = z)), dat) expect_match2(scode, "r_1_1 = (sd_1[1, Jby_1]' .* (z_1[1]));") scode <- make_stancode(y ~ x + (x | gr(g, by = z)), dat) expect_match2(scode, "r_1 = scale_r_cor_by(z_1, sd_1, L_1, Jby_1);") expect_match2(scode, "target += student_t_lpdf(to_vector(sd_1) | 3, 0, 10);") expect_match2(scode, "target += lkj_corr_cholesky_lpdf(L_1[5] | 1);") }) test_that("Group syntax | and || is handled correctly,", { data <- data.frame(y = rnorm(10), x = rnorm(10), g1 = rep(1:5, each = 2), g2 = rep(1:2, 5)) scode <- make_stancode(y ~ x + (1+x||g1) + (I(x/4)|g2), data) expect_match2(scode, "r_1_2 = (sd_1[2] * (z_1[2]));") expect_match2(scode, "r_2_1 = r_2[, 1];") expect_match2(scode, "r_2 = (diag_pre_multiply(sd_2, L_2) * z_2)';") }) test_that("predicting zi and hu works correctly", { scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = "zero_inflated_poisson") expect_match2(scode, "target += zero_inflated_poisson_log_logit_lpmf(Y[n] | mu[n], zi[n])" ) expect_true(!grepl("inv_logit\\(", scode)) expect_true(!grepl("exp(mu[n])", scode, fixed = TRUE)) scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = zero_inflated_poisson(identity)) expect_match2(scode, "target += zero_inflated_poisson_logit_lpmf(Y[n] | mu[n], zi[n])" ) scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = "zero_inflated_binomial") expect_match2(scode, "target += zero_inflated_binomial_blogit_logit_lpmf(Y[n] | trials[n], mu[n], zi[n])" ) expect_true(!grepl("inv_logit\\(", scode)) fam <- zero_inflated_binomial("probit", link_zi = "identity") scode <- make_stancode(bf(count ~ Trt, zi ~ Trt), epilepsy, family = fam) expect_match2(scode, "target += zero_inflated_binomial_lpmf(Y[n] | trials[n], mu[n], zi[n])" ) expect_match2(scode, "mu[n] = Phi(mu[n]);") scode <- make_stancode( bf(count ~ Trt, zi ~ Trt), epilepsy, family = zero_inflated_beta() ) expect_match2(scode, "target += zero_inflated_beta_logit_lpdf(Y[n] | mu[n], phi, zi[n])" ) scode <- make_stancode(bf(count ~ Trt, hu ~ Trt), epilepsy, family = "hurdle_negbinomial") expect_match2(scode, "target += hurdle_neg_binomial_log_logit_lpmf(Y[n] | mu[n], shape, hu[n])" ) expect_true(!grepl("inv_logit\\(", scode)) expect_true(!grepl("exp(mu[n])", scode, fixed = TRUE)) scode <- make_stancode(bf(count ~ Trt, hu ~ Trt), epilepsy, family = "hurdle_gamma") expect_match2(scode, "target += hurdle_gamma_logit_lpdf(Y[n] | shape, mu[n], hu[n])" ) expect_true(!grepl("inv_logit\\(", scode)) expect_match2(scode, "mu[n] = shape * exp(-(mu[n]));") scode <- make_stancode( bf(count ~ Trt, hu ~ Trt), epilepsy, family = hurdle_gamma(link_hu = "identity") ) expect_match2(scode, "target += hurdle_gamma_lpdf(Y[n] | shape, mu[n], hu[n])") expect_true(!grepl("inv_logit\\(", scode)) expect_match2(scode, "mu[n] = shape * exp(-(mu[n]));") }) test_that("fixing auxiliary parameters is possible", { scode <- make_stancode(bf(y ~ 1, sigma = 0.5), data = list(y = rnorm(10))) expect_match(scode, "data \\{[^\\}]*real sigma;") }) test_that("Stan code of quantile regression models is correct", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) scode <- make_stancode(y ~ x, data, family = asym_laplace()) expect_match2(scode, "target += asym_laplace_lpdf(Y[n] | mu[n], sigma, quantile)") scode <- make_stancode(bf(y ~ x, quantile = 0.75), data, family = asym_laplace()) expect_match(scode, "data \\{[^\\}]*real quantile;") scode <- make_stancode(y | cens(c) ~ x, data, family = asym_laplace()) expect_match2(scode, "target += asym_laplace_lccdf(Y[n] | mu[n], sigma, quantile)") scode <- make_stancode(bf(y ~ x, sigma ~ x), data, family = asym_laplace()) expect_match2(scode, "target += asym_laplace_lpdf(Y[n] | mu[n], sigma[n], quantile)") scode <- make_stancode(bf(y ~ x, quantile = 0.75), data, family = brmsfamily("zero_inflated_asym_laplace")) expect_match2(scode, "target += zero_inflated_asym_laplace_lpdf(Y[n] | mu[n], sigma, quantile, zi)" ) }) test_that("Stan code of addition term 'rate' is correct", { data <- data.frame(y = rpois(10, 1), x = rnorm(10), time = 1:10) scode <- make_stancode(y | rate(time) ~ x, data, poisson()) expect_match2(scode, "mu = Intercept + Xc * b + log_denom;") scode <- make_stancode( bf(y | rate(time) ~ a, a ~ x, nl = TRUE), data = data, family = poisson(), prior = prior(normal(0, 1), nlpar = "a") ) expect_match2(scode, "mu[n] = nlp_a[n] + log_denom[n];") scode <- make_stancode( bf(y | rate(time) ~ a, a ~ x, nl = TRUE, loop = FALSE), data = data, family = poisson(), prior = prior(normal(0, 1), nlpar = "a") ) expect_match2(scode, "mu = nlp_a + log_denom;") }) test_that("Stan code of GEV models is correct", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) scode <- make_stancode(y ~ x, data, gen_extreme_value()) expect_match2(scode, "target += gen_extreme_value_lpdf(Y[n] | mu[n], sigma, xi)") expect_match2(scode, "xi = scale_xi(tmp_xi, Y, mu, sigma)") scode <- make_stancode(bf(y ~ x, sigma ~ x), data, gen_extreme_value()) expect_match2(scode, "xi = scale_xi_vector(tmp_xi, Y, mu, sigma)") scode <- make_stancode(bf(y ~ x, xi ~ x), data, gen_extreme_value()) expect_match2(scode, "xi[n] = expm1(xi[n])") scode <- make_stancode(bf(y ~ x, xi = 0), data, gen_extreme_value()) expect_match(scode, "data \\{[^\\}]*real xi; // shape parameter") scode <- make_stancode(y | cens(c) ~ x, data, gen_extreme_value()) expect_match2(scode, "target += gen_extreme_value_lccdf(Y[n] | mu[n], sigma, xi)") }) test_that("Stan code of Cox models is correct", { data <- data.frame(y = rexp(100), ce = sample(0:1, 100, TRUE), x = rnorm(100)) bform <- bf(y | cens(ce) ~ x) bprior <- prior(normal(0, 2), sbhaz) scode <- make_stancode(bform, data, brmsfamily("cox"), prior = bprior) expect_match2(scode, "target += cox_log_lpdf(Y[n] | mu[n], bhaz[n], cbhaz[n]);") expect_match2(scode, "vector[N] cbhaz = Zcbhaz * sbhaz;") expect_match2(scode, "target += normal_lpdf(sbhaz | 0, 2);") expect_match2(scode, "vector[Kbhaz] sbhaz;") scode <- make_stancode(bform, data, brmsfamily("cox", "identity")) expect_match2(scode, "target += cox_lccdf(Y[n] | mu[n], bhaz[n], cbhaz[n]);") expect_match2(scode, "target += normal_lpdf(sbhaz | 0, 1);") }) test_that("offsets appear in the Stan code", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) scode <- make_stancode(y ~ x + offset(c), data) expect_match2(scode, "Intercept + Xc * b + offsets;") scode <- make_stancode(bf(y ~ a, a ~ offset(log(c + 1)), nl = TRUE), data, prior = prior(normal(0,1), nlpar = a)) expect_match2(scode, "X_a * b_a + offsets_a;") }) test_that("prior only models are correctly checked", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) prior <- prior(normal(0, 5), b) + prior("", Intercept) expect_error(make_stancode(y ~ x, data, prior = prior, sample_prior = "only"), "Sampling from priors is not possible") prior <- prior(normal(0, 5), b) + prior(normal(0, 10), Intercept) scode <- make_stancode(y ~ x, data, prior = prior, sample_prior = "only") expect_match2(scode, "target += normal_lpdf(Intercept | 0, 10)") }) test_that("Stan code of mixture model is correct", { data <- data.frame(y = 1:10, x = rnorm(10), c = 1) scode <- make_stancode( bf(y ~ x, sigma2 ~ x), data, family = mixture(gaussian, gaussian), sample_prior = TRUE ) expect_match2(scode, "ordered[2] ordered_Intercept;") expect_match2(scode, "Intercept_mu2 = ordered_Intercept[2];") expect_match2(scode, "target += dirichlet_lpdf(theta | con_theta);") expect_match2(scode, "ps[1] = log(theta1) + normal_lpdf(Y[n] | mu1[n], sigma1);") expect_match2(scode, "ps[2] = log(theta2) + normal_lpdf(Y[n] | mu2[n], sigma2[n]);") expect_match2(scode, "target += log_sum_exp(ps);") expect_match2(scode, "simplex[2] prior_theta = dirichlet_rng(con_theta);") data$z <- abs(data$y) scode <- make_stancode(bf(z | weights(c) ~ x, shape1 ~ x, theta1 = 1, theta2 = 2), data = data, mixture(Gamma("log"), weibull)) expect_match(scode, "data \\{[^\\}]*real theta1;") expect_match(scode, "data \\{[^\\}]*real theta2;") expect_match2(scode, "ps[1] = log(theta1) + gamma_lpdf(Y[n] | shape1[n], mu1[n]);") expect_match2(scode, "target += weights[n] * log_sum_exp(ps);") scode <- make_stancode(bf(abs(y) | se(c) ~ x), data = data, mixture(gaussian, student)) expect_match2(scode, "ps[1] = log(theta1) + normal_lpdf(Y[n] | mu1[n], se[n]);") expect_match2(scode, "ps[2] = log(theta2) + student_t_lpdf(Y[n] | nu2, mu2[n], se[n]);") fam <- mixture(gaussian, student, exgaussian) scode <- make_stancode(bf(y ~ x), data = data, family = fam) expect_match(scode, "parameters \\{[^\\}]*real Intercept_mu3;") expect_match2(scode, "ps[2] = log(theta2) + student_t_lpdf(Y[n] | nu2, mu2[n], sigma2);" ) expect_match2(scode, "ps[3] = log(theta3) + exp_mod_normal_lpdf(Y[n] | mu3[n] - beta3, sigma3, inv(beta3));" ) scode <- make_stancode(bf(y ~ x, theta1 ~ x, theta3 ~ x), data = data, family = fam) expect_match2(scode, "log_sum_exp_theta = log(exp(theta1[n]) + exp(theta2[n]) + exp(theta3[n]));") expect_match2(scode, "theta2 = rep_vector(0, N);") expect_match2(scode, "theta3[n] = theta3[n] - log_sum_exp_theta;") expect_match2(scode, "ps[1] = theta1[n] + normal_lpdf(Y[n] | mu1[n], sigma1);") fam <- mixture(cumulative, sratio) scode <- make_stancode(y ~ x, data, family = fam) expect_match2(scode, "ordered_logistic_lpmf(Y[n] | mu1[n], Intercept_mu1);") expect_match2(scode, "sratio_logit_lpmf(Y[n] | mu2[n], disc2, Intercept_mu2);") # censored mixture model fam <- mixture(gaussian, gaussian) scode <- make_stancode(y | cens(2, y2 = 2) ~ x, data, fam) expect_match2(scode, "ps[2] = log(theta2) + normal_lccdf(Y[n] | mu2[n], sigma2);" ) expect_match2(scode, paste0( "ps[2] = log(theta2) + log_diff_exp(\n", " normal_lcdf(rcens[n] | mu2[n], sigma2)," )) # truncated mixture model scode <- make_stancode(y | trunc(3) ~ x, data, fam) expect_match2(scode, paste0( "ps[1] = log(theta1) + normal_lpdf(Y[n] | mu1[n], sigma1) -\n", " normal_lccdf(lb[n] | mu1[n], sigma1);" )) # non-linear mixture model bform <- bf(y ~ 1) + nlf(mu1 ~ eta^2) + nlf(mu2 ~ log(eta) + a) + lf(eta + a ~ x) + mixture(gaussian, nmix = 2) bprior <- prior(normal(0, 1), nlpar = "eta") + prior(normal(0, 1), nlpar = "a") scode <- make_stancode(bform, data = data, prior = bprior) expect_match2(scode, "mu1[n] = nlp_eta[n] ^ 2;") expect_match2(scode, "mu2[n] = log(nlp_eta[n]) + nlp_a[n];") }) test_that("sparse matrix multiplication is applied correctly", { data <- data.frame(y = rnorm(10), x = rnorm(10)) # linear model scode <- make_stancode( bf(y ~ x, sparse = TRUE) + lf(sigma ~ x, sparse = TRUE), data, prior = prior(normal(0, 5), coef = "Intercept") ) expect_match2(scode, "wX = csr_extract_w(X);") expect_match2(scode, "mu = csr_matrix_times_vector(rows(X), cols(X), wX, vX, uX, b);" ) expect_match2(scode, "uX_sigma[size(csr_extract_u(X_sigma))] = csr_extract_u(X_sigma);" ) expect_match2(scode, paste0( "sigma = csr_matrix_times_vector(rows(X_sigma), cols(X_sigma), ", "wX_sigma, vX_sigma, uX_sigma, b_sigma);" ) ) expect_match2(scode, "target += normal_lpdf(b[1] | 0, 5);") expect_match2(scode, "target += normal_lpdf(Y | mu, sigma);") # non-linear model scode <- make_stancode( bf(y ~ a, lf(a ~ x, sparse = TRUE), nl = TRUE), data, prior = prior(normal(0, 1), nlpar = a) ) expect_match2(scode, "vX_a[size(csr_extract_v(X_a))] = csr_extract_v(X_a);" ) expect_match2(scode, "nlp_a = csr_matrix_times_vector(rows(X_a), cols(X_a), wX_a, vX_a, uX_a, b_a);" ) }) test_that("QR decomposition is included in the Stan code", { data <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10)) bform <- bf(y ~ x1 + x2, decomp = "QR") + lf(sigma ~ 0 + x1 + x2, decomp = "QR") # simple priors scode <- make_stancode(bform, data, prior = prior(normal(0, 2))) expect_match2(scode, "XQ = qr_thin_Q(Xc) * sqrt(N - 1);") expect_match2(scode, "b = XR_inv * bQ;") expect_match2(scode, "target += normal_lpdf(bQ | 0, 2);") expect_match2(scode, "XQ * bQ") expect_match2(scode, "XR_sigma = qr_thin_R(X_sigma) / sqrt(N - 1);") # horseshoe prior scode <- make_stancode(bform, data, prior = prior(horseshoe(1))) expect_match2(scode, "target += normal_lpdf(zb | 0, 1);") expect_match2(scode, "bQ = horseshoe(") }) test_that("Stan code for Gaussian processes is correct", { set.seed(1234) dat <- data.frame(y = rnorm(40), x1 = rnorm(40), x2 = rnorm(40), z = factor(rep(3:6, each = 10))) prior <- prior(gamma(0.1, 0.1), sdgp) scode <- make_stancode(y ~ gp(x1) + gp(x2, by = x1), dat, prior = prior) expect_match2(scode, "target += inv_gamma_lpdf(lscale_1[1]") expect_match2(scode, "target += gamma_lpdf(sdgp_1 | 0.1, 0.1)") expect_match2(scode, "Cgp_2 .* gp(Xgp_2, sdgp_2[1], lscale_2[1], zgp_2)") prior <- prior + prior(normal(0, 1), lscale, coef = gpx1) scode <- make_stancode(y ~ gp(x1) + gp(x2, by = x1, gr = TRUE), data = dat, prior = prior) expect_match2(scode, "target += normal_lpdf(lscale_1[1][1] | 0, 1)") expect_match2(scode, "+ Cgp_2 .* gp(Xgp_2, sdgp_2[1], lscale_2[1], zgp_2)[Jgp_2]") # non-isotropic GP scode <- make_stancode(y ~ gp(x1, x2, by = z, iso = FALSE), dat) expect_match2(scode, "target += inv_gamma_lpdf(lscale_1[1][2]") expect_match2(scode, "target += inv_gamma_lpdf(lscale_1[4][2]") # Suppress Stan parser warnings that can currently not be avoided scode <- make_stancode(y ~ gp(x1, x2) + gp(x1, by = z), dat, silent = TRUE) expect_match2(scode, "gp(Xgp_1, sdgp_1[1], lscale_1[1], zgp_1)") expect_match2(scode, paste0( "mu[Igp_2_2] = mu[Igp_2_2] + Cgp_2_2 .* gp(Xgp_2_2, ", "sdgp_2[2], lscale_2[2], zgp_2_2);" )) # approximate GPS scode <- make_stancode( y ~ gp(x1, k = 10, c = 5/4) + gp(x2, by = x1, k = 10, c = 5/4), dat ) expect_match2(scode, "target += inv_gamma_lpdf(lscale_1") expect_match2(scode, "gpa(Xgp_1, sdgp_1[1], lscale_1[1], zgp_1, slambda_1)" ) expect_match2(scode, "Cgp_2 .* gpa(Xgp_2, sdgp_2[1], lscale_2[1], zgp_2, slambda_2)" ) prior <- c(prior(normal(0, 10), lscale, coef = gpx1, nlpar = a), prior(gamma(0.1, 0.1), sdgp, nlpar = a), prior(normal(0, 1), b, nlpar = a)) scode <- make_stancode(bf(y ~ a, a ~ gp(x1), nl = TRUE), data = dat, prior = prior) expect_match2(scode, "target += normal_lpdf(lscale_a_1[1][1] | 0, 10)") expect_match2(scode, "target += gamma_lpdf(sdgp_a_1 | 0.1, 0.1)") expect_match2(scode, "gp(Xgp_a_1, sdgp_a_1[1], lscale_a_1[1], zgp_a_1)") prior <- prior(gamma(2, 2), lscale, coef = gpx1z5, nlpar = "a") scode <- make_stancode(bf(y ~ a, a ~ gp(x1, by = z, gr = TRUE), nl = TRUE), data = dat, prior = prior, silent = TRUE) expect_match2(scode, "nlp_a[Igp_a_1_1] = nlp_a[Igp_a_1_1] + Cgp_a_1_1 .* gp(Xgp_a_1_1," ) expect_match2(scode, "gp(Xgp_a_1_3, sdgp_a_1[3], lscale_a_1[3], zgp_a_1_3)[Jgp_a_1_3]" ) expect_match2(scode, "target += gamma_lpdf(lscale_a_1[3][1] | 2, 2);") expect_match2(scode, "target += normal_lpdf(zgp_a_1_3 | 0, 1);") # test warnings prior <- prior(normal(0, 1), lscale) expect_warning( make_stancode(y ~ gp(x1), data = dat, prior = prior), "The global prior 'normal(0, 1)' of class 'lscale' will not be used", fixed = TRUE ) }) test_that("Stan code for SAR models is correct", { dat <- data.frame(y = rnorm(10), x = rnorm(10)) W <- matrix(0, nrow = 10, ncol = 10) scode <- make_stancode( y ~ x + sar(W), data = dat, prior = prior(normal(0.5, 1), lagsar) ) expect_match2(scode, "target += normal_lagsar_lpdf(Y | mu, sigma, lagsar, Msar, eigenMsar)" ) expect_match2(scode, "target += normal_lpdf(lagsar | 0.5, 1)") scode <- make_stancode( y ~ x + sar(W, type = "lag"), data = dat, family = student() ) expect_match2(scode, "target += student_t_lagsar_lpdf(Y | nu, mu, sigma, lagsar, Msar, eigenMsar)" ) scode <- make_stancode(y ~ x + sar(W, type = "error"), data = dat) expect_match2(scode, "target += normal_errorsar_lpdf(Y | mu, sigma, errorsar, Msar, eigenMsar)" ) scode <- make_stancode( y ~ x + sar(W, "error"), data = dat, family = student(), prior = prior(beta(2, 3), errorsar) ) expect_match2(scode, "target += student_t_errorsar_lpdf(Y | nu, mu, sigma, errorsar, Msar, eigenMsar)" ) expect_match2(scode, "target += beta_lpdf(errorsar | 2, 3)") expect_error( make_stancode(bf(y ~ sar(W), sigma ~ x), data = dat), "SAR models are not implemented when predicting 'sigma'" ) }) test_that("Stan code for CAR models is correct", { dat = data.frame(y = rnorm(10), x = rnorm(10)) edges <- cbind(1:10, 10:1) W <- matrix(0, nrow = 10, ncol = 10) for (i in seq_len(nrow(edges))) { W[edges[i, 1], edges[i, 2]] <- 1 } rownames(W) <- seq_len(nrow(W)) scode <- make_stancode(y ~ x + car(W), dat) expect_match2(scode, "real sparse_car_lpdf(vector phi") expect_match2(scode, "target += sparse_car_lpdf(") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") scode <- make_stancode(y ~ x + car(W, type = "esicar"), dat) expect_match2(scode, "real sparse_icar_lpdf(vector phi") expect_match2(scode, "target += sparse_icar_lpdf(") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") expect_match2(scode, "rcar[Nloc] = - sum(zcar)") scode <- make_stancode(y ~ x + car(W, type = "icar"), dat) expect_match2(scode, "target += -0.5 * dot_self(zcar[edges1] - zcar[edges2])") expect_match2(scode, "target += normal_lpdf(sum(zcar) | 0, 0.001 * Nloc)") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") expect_match2(scode, "rcar = zcar * sdcar") scode <- make_stancode(y ~ x + car(W, type = "bym2"), dat) expect_match2(scode, "target += -0.5 * dot_self(zcar[edges1] - zcar[edges2])") expect_match2(scode, "target += normal_lpdf(sum(zcar) | 0, 0.001 * Nloc)") expect_match2(scode, "mu[n] += rcar[Jloc[n]]") expect_match2(scode, "target += beta_lpdf(rhocar | 1, 1)") expect_match2(scode, paste0( "rcar = (sqrt(1 - rhocar) * nszcar + ", "sqrt(rhocar * inv(car_scale)) * zcar) * sdcar" )) # apply a CAR term on a distributional parameter other than 'mu' scode <- make_stancode(bf(y ~ x, sigma ~ car(W)), dat) expect_match2(scode, "real sparse_car_lpdf(vector phi") expect_match2(scode, "target += sparse_car_lpdf(") expect_match2(scode, "sigma[n] += rcar_sigma[Jloc_sigma[n]]") }) test_that("Stan code for skew_normal models is correct", { dat = data.frame(y = rnorm(10), x = rnorm(10)) scode <- make_stancode(y ~ x, dat, skew_normal()) expect_match2(scode, "delta = alpha / sqrt(1 + alpha^2);") expect_match2(scode, "omega = sigma / sqrt(1 - sqrt_2_div_pi^2 * delta^2);") expect_match2(scode, "mu[n] = mu[n] - omega * delta * sqrt_2_div_pi;") scode <- make_stancode(bf(y ~ x, sigma ~ x), dat, skew_normal()) expect_match2(scode, "omega[n] = sigma[n] / sqrt(1 - sqrt_2_div_pi^2 * delta^2);") expect_match2(scode, "mu[n] = mu[n] - omega[n] * delta * sqrt_2_div_pi;") scode <- make_stancode(bf(y | se(x) ~ x, alpha ~ x), dat, skew_normal()) expect_match2(scode, "delta[n] = alpha[n] / sqrt(1 + alpha[n]^2);") expect_match2(scode, "omega[n] = se[n] / sqrt(1 - sqrt_2_div_pi^2 * delta[n]^2);") expect_match2(scode, "mu[n] = mu[n] - omega[n] * delta[n] * sqrt_2_div_pi;") scode <- make_stancode(y ~ x, dat, mixture(skew_normal, nmix = 2)) expect_match2(scode, "omega1 = sigma1 / sqrt(1 - sqrt_2_div_pi^2 * delta1^2);") expect_match2(scode, "mu2[n] = mu2[n] - omega2 * delta2 * sqrt_2_div_pi;") }) test_that("Stan code for missing value terms works correctly", { dat = data.frame(y = rnorm(10), x = rnorm(10), g = 1:10, z = 1) dat$x[c(1, 3, 9)] <- NA bform <- bf(y ~ mi(x)*g) + bf(x | mi() ~ g) + set_rescor(FALSE) scode <- make_stancode(bform, dat) expect_match2(scode, "Yl_x[Jmi_x] = Ymi_x;") expect_match2(scode, "(bsp_y[1]) * Yl_x[n] + (bsp_y[2]) * Yl_x[n] * Csp_y_1[n];") expect_match2(scode, "target += normal_lpdf(Yl_x | mu_x, sigma_x);") bform <- bf(y ~ mi(x) + (mi(x) | g)) + bf(x | mi() ~ 1) + set_rescor(FALSE) scode <- make_stancode(bform, dat) expect_match2(scode, "(bsp_y[1] + r_1_y_2[J_1_y[n]]) * Yl_x[n] + r_1_y_1[J_1_y[n]] * Z_1_y_1[n];" ) bform <- bf(y ~ a, a ~ mi(x), nl = TRUE) + bf(x | mi() ~ 1) + set_rescor(FALSE) bprior <- prior(normal(0, 1), nlpar = "a", resp = "y") scode <- make_stancode(bform, dat, prior = bprior) expect_match2(scode, "nlp_y_a[n] += (bsp_y_a[1]) * Yl_x[n];") expect_match2(scode, "target += normal_lpdf(bsp_y_a | 0, 1);") bform <- bf(y ~ mi(x)*mo(g)) + bf(x | mi() ~ 1) + set_rescor(FALSE) scode <- make_stancode(bform, dat) expect_match2(scode, "(bsp_y[3]) * Yl_x[n] * mo(simo_y_2, Xmo_y_2[n]);") bform <- bf(y ~ 1, sigma ~ 1) + bf(x | mi() ~ 1) + set_rescor(TRUE) scode <- make_stancode(bform, dat) expect_match2(scode, "Yl[n][2] = Yl_x[n];") expect_match2(scode, "sigma[n] = [sigma_y[n], sigma_x]';") expect_match2(scode, "LSigma[n] = diag_pre_multiply(sigma[n], Lrescor);") bform <- bf(x | mi() ~ y, family = "lognormal") scode <- make_stancode(bform, dat) expect_match2(scode, "vector[Nmi] Ymi;") bform <- bf(y ~ I(log(mi(x))) * g) + bf(x | mi() + trunc(lb = 1) ~ y, family = "lognormal") scode <- make_stancode(bform, dat) expect_match2(scode, "vector[Nmi_x] Ymi_x;") expect_match2(scode, "(bsp_y[1]) * (log(Yl_x[n])) + (bsp_y[2]) * (log(Yl_x[n])) * Csp_y_1[n]" ) bform <- bf(y ~ mi(x)*g) + bf(x | mi() + cens(z) ~ y, family = "beta") scode <- make_stancode(bform, dat) expect_match2(scode, "vector[Nmi_x] Ymi_x;") expect_match2(scode, "target += beta_lpdf(Yl_x[n] | mu_x[n] * phi_x, (1 - mu_x[n]) * phi_x);" ) }) test_that("Stan code for overimputation works correctly", { dat = data.frame(y = rnorm(10), x_x = rnorm(10), g = 1:10, z = 1) dat$x[c(1, 3, 9)] <- NA bform <- bf(y ~ mi(x_x)*g) + bf(x_x | mi(g) ~ 1) + set_rescor(FALSE) scode <- make_stancode(bform, dat, sample_prior = "yes") expect_match2(scode, "target += normal_lpdf(Yl_xx | mu_xx, sigma_xx)") expect_match2(scode, "target += normal_lpdf(Y_xx[Jme_xx] | Yl_xx[Jme_xx], noise_xx[Jme_xx])" ) expect_match2(scode, "vector[N_xx] Yl_xx;") }) test_that("Stan code for advanced count data distribution is correct", { scode <- make_stancode( count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = brmsfamily("discrete_weibull") ) expect_match2(scode, "mu[n] = inv_logit(mu[n]);") expect_match2(scode, "target += discrete_weibull_lpmf(Y[n] | mu[n], shape);") scode <- make_stancode( count ~ zAge + zBase * Trt + (1|patient), data = epilepsy, family = brmsfamily("com_poisson") ) expect_match2(scode, "target += com_poisson_log_lpmf(Y[n] | mu[n], shape);") }) test_that("argument 'stanvars' is handled correctly", { bprior <- prior(normal(mean_intercept, 10), class = "Intercept") mean_intercept <- 5 stanvars <- stanvar(mean_intercept) scode <- make_stancode(count ~ Trt, data = epilepsy, prior = bprior, stanvars = stanvars) expect_match2(scode, "real mean_intercept;") # define a multi_normal prior with known covariance matrix bprior <- prior(multi_normal(M, V), class = "b") stanvars <- stanvar(rep(0, 2), "M", scode = " vector[K] M;") + stanvar(diag(2), "V", scode = " matrix[K, K] V;") scode <- make_stancode(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) expect_match2(scode, "vector[K] M;") expect_match2(scode, "matrix[K, K] V;") # define a hierachical prior on the regression coefficients bprior <- set_prior("normal(0, tau)", class = "b") + set_prior("target += normal_lpdf(tau | 0, 10)", check = FALSE) stanvars <- stanvar(scode = "real tau;", block = "parameters") scode <- make_stancode(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) expect_match2(scode, "real tau;") expect_match2(scode, "target += normal_lpdf(b | 0, tau);") # use the non-centered parameterization for 'b' # unofficial feature not supported anymore for the time being # bprior <- set_prior("target += normal_lpdf(zb | 0, 1)", check = FALSE) + # set_prior("target += normal_lpdf(tau | 0, 10)", check = FALSE) # stanvars <- stanvar(scode = "vector[Kc] zb;", block = "parameters") + # stanvar(scode = "real tau;", block = "parameters") + # stanvar(scode = "vector[Kc] b = zb * tau;", # block="tparameters", name = "b") # scode <- make_stancode(count ~ Trt, epilepsy, # prior = bprior, stanvars = stanvars) # expect_match2(scode, "vector[Kc] b = zb * tau;") # stanvars <- stanvar(scode = "vector[Ksp] zbsp;", block = "parameters") + # stanvar(scode = "real tau;", block = "parameters") + # stanvar(scode = "vector[Ksp] bsp = zbsp * tau;", # block = "tparameters", name = "bsp") # scode <- make_stancode(count ~ mo(Base), epilepsy, stanvars = stanvars) # expect_match2(scode, "vector[Ksp] bsp = zbsp * tau;") }) test_that("custom families are handled correctly", { dat <- data.frame(size = 10, y = sample(0:10, 20, TRUE), x = rnorm(20)) # define a custom beta-binomial family log_lik_beta_binomial2 <- function(i, draws) { mu <- draws$dpars$mu[, i] tau <- draws$dpars$tau trials <- draws$data$vint1[i] y <- draws$data$Y[i] beta_binomial2_lpmf(y, mu, tau, trials) } predict_beta_binomial2 <- function(i, draws, ...) { mu <- draws$dpars$mu[, i] tau <- draws$dpars$tau trials <- draws$data$vint1[i] beta_binomial2_rng(mu, tau, trials) } fitted_beta_binomial2 <- function(draws) { mu <- draws$dpars$mu trials <- draws$data$vint1 trials <- matrix( trials, nrow = nrow(mu), ncol = ncol(mu), byrow = TRUE ) mu * trials } beta_binomial2 <- custom_family( "beta_binomial2", dpars = c("mu", "tau"), links = c("logit", "log"), lb = c(NA, 0), type = "int", vars = c("vint1[n]", "vreal1[n]"), log_lik = log_lik_beta_binomial2, fitted = fitted_beta_binomial2, predict = predict_beta_binomial2 ) # define custom stan functions # real R is just to also test the vreal addition argument stan_funs <- " real beta_binomial2_lpmf(int y, real mu, real phi, int N, real R) { return beta_binomial_lpmf(y | N, mu * phi, (1 - mu) * phi); } int beta_binomial2_rng(real mu, real phi, int N, real R) { return beta_binomial_rng(N, mu * phi, (1 - mu) * phi); } " stanvars <- stanvar(scode = stan_funs, block = "functions") scode <- make_stancode( y | vint(size) + vreal(size) ~ x, data = dat, family = beta_binomial2, prior = prior(gamma(0.1, 0.1), class = "tau"), stanvars = stanvars ) expect_match2(scode, "int vint1[N];") expect_match2(scode, "real tau;") expect_match2(scode, "mu[n] = inv_logit(mu[n]);") expect_match2(scode, "target += gamma_lpdf(tau | 0.1, 0.1);") expect_match2(scode, "target += beta_binomial2_lpmf(Y[n] | mu[n], tau, vint1[n], vreal1[n]);" ) scode <- make_stancode( bf(y | vint(size) + vreal(size) ~ x, tau ~ x), data = dat, family = beta_binomial2, stanvars = stanvars ) expect_match2(scode, "tau[n] = exp(tau[n]);") expect_match2(scode, "target += beta_binomial2_lpmf(Y[n] | mu[n], tau[n], vint1[n], vreal1[n]);" ) # check custom families in mixture models scode <- make_stancode( y | vint(size) + vreal(size) + trials(size) ~ x, data = dat, family = mixture(binomial, beta_binomial2), stanvars = stanvars ) expect_match2(scode, "log(theta2) + beta_binomial2_lpmf(Y[n] | mu2[n], tau2, vint1[n], vreal1[n]);" ) }) test_that("likelihood of distributional beta models is correct", { # test issue #404 dat <- data.frame(prop = rbeta(100, shape1 = 2, shape2 = 2)) scode <- make_stancode( bf(prop ~ 1, phi ~ 1), data = dat, family = Beta() ) expect_match2(scode, "beta_lpdf(Y[n] | mu[n] * phi[n], (1 - mu[n]) * phi[n])") }) test_that("student-t group-level effects work without errors", { scode <- make_stancode(count ~ Trt + (1|gr(patient, dist = "st")), epilepsy) expect_match2(scode, "dfm_1 = sqrt(df_1 * udf_1);") expect_match2(scode, "dfm_1 .* (sd_1[1] * (z_1[1]));") expect_match2(scode, "target += gamma_lpdf(df_1 | 2, 0.1);") expect_match2(scode, "target += inv_chi_square_lpdf(udf_1 | df_1);") bprior <- prior(normal(20, 5), class = df, group = patient) scode <- make_stancode( count ~ Trt + (Trt|gr(patient, dist = "st")), epilepsy, prior = bprior ) expect_match2(scode, "rep_matrix(dfm_1, M_1) .* (diag_pre_multiply(sd_1, L_1) * z_1)';" ) expect_match2(scode, "target += normal_lpdf(df_1 | 20, 5);") }) test_that("centering design matrices can be changed correctly", { dat <- data.frame(y = 1:10, x = 1:10) scode <- make_stancode( bf(y ~ x, center = FALSE), data = dat, family = weibull(), prior = prior(normal(0,1), coef = Intercept) ) expect_match2(scode, "mu = X * b;") expect_match2(scode, "target += normal_lpdf(b[1] | 0, 1);") bform <- bf(y ~ eta, nl = TRUE) + lf(eta ~ x, center = TRUE) scode <- make_stancode(bform, data = dat) expect_match2(scode, "nlp_eta = Intercept_eta + Xc_eta * b_eta;") }) test_that("to_vector() is correctly removed from prior of SD parameters", { # see https://discourse.mc-stan.org/t/prior-for-sd-generate-parsing-text-error/12292/5 dat <- data.frame( y = rnorm(100), ID = 1:10, group = rep(1:2, each = 5) ) bform <- bf( y ~ 1 + (1 | p | gr(ID, by=group)), sigma ~ 1 + (1 | p | gr(ID, by=group)) ) bprior <- c( prior(normal(0, 0.1), class = sd) , prior(normal(0, 0.01), class = sd, dpar = sigma) ) scode <- make_stancode( bform, data = dat, prior = bprior, sample_prior = TRUE ) expect_match2(scode, "prior_sd_1_1 = normal_rng(0,0.1);") expect_match2(scode, "prior_sd_1_2 = normal_rng(0,0.01);") }) brms/tests/testthat/tests.brmsfit-helpers.R0000644000176200001440000000721513522262066020622 0ustar liggesuserscontext("Tests for brmsfit helper functions") test_that("first_greater returns expected results", { A <- cbind(1:10, 11:20, 21:30) x <- c(5, 25, 7, 15, 7, 10, 15, 19, 3, 11) expect_equal(first_greater(A, x), c(2, 3, 2, 3, 2, 2, 2, 3, 1, 2)) expect_equal(first_greater(A, x, i = 2), c(2, 3, 2, 3, 2, 2, 2, 3, 2, 2)) }) test_that("array2list performs correct conversion", { A <- array(1:27, dim = c(3,3,3)) B <- list(matrix(1:9,3,3), matrix(10:18,3,3), matrix(19:27,3,3)) expect_equal(brms:::array2list(A), B) }) test_that("probit and probit_approx produce similar results", { expect_equal(brms:::ilink(-10:10, "probit"), brms:::ilink(-10:10, "probit_approx"), tolerance = 1e-3) }) test_that("autocorrelation matrices are computed correctly", { ar <- 0.5 ma <- 0.3 ar_mat <- brms:::get_cor_matrix_ar1(ar = matrix(ar), nobs = 4) expected_ar_mat <- 1 / (1 - ar^2) * cbind(c(1, ar, ar^2, ar^3), c(ar, 1, ar, ar^2), c(ar^2, ar, 1, ar), c(ar^3, ar^2, ar, 1)) expect_equal(ar_mat[1, , ], expected_ar_mat) ma_mat <- brms:::get_cor_matrix_ma1(ma = matrix(ma), nobs = 4) expected_ma_mat <- cbind(c(1+ma^2, ma, 0, 0), c(ma, 1+ma^2, ma, 0), c(0, ma, 1+ma^2, ma), c(0, 0, ma, 1+ma^2)) expect_equal(ma_mat[1, , ], expected_ma_mat) arma_mat <- brms:::get_cor_matrix_arma1( ar = matrix(ar), ma = matrix(ma), nobs = 4 ) g0 <- 1 + ma^2 + 2 * ar * ma g1 <- (1 + ar * ma) * (ar + ma) expected_arma_mat <- 1 / (1 - ar^2) * cbind(c(g0, g1, g1 * ar, g1 * ar^2), c(g1, g0, g1, g1 * ar), c(g1 * ar, g1, g0, g1), c(g1 * ar^2, g1 * ar, g1, g0)) expect_equal(arma_mat[1, , ], expected_arma_mat) cosy <- 0.6 cosy_mat <- brms:::get_cor_matrix_cosy(cosy = as.matrix(cosy), nobs = 4) expected_cosy_mat <- matrix(cosy, 4, 4) diag(expected_cosy_mat) <- 1 expect_equal(cosy_mat[1, , ], expected_cosy_mat) ident_mat <- brms:::get_cor_matrix_ident(nsamples = 10, nobs = 4) expected_ident_mat <- diag(1, 4) expect_equal(ident_mat[1, , ], expected_ident_mat) }) test_that("evidence_ratio returns expected results", { ps <- -4:10 prs <- -2:12 expect_true(evidence_ratio(ps, prior_samples = prs) > 1) expect_true(is.na(evidence_ratio(ps))) expect_equal(evidence_ratio(ps, cut = 0.5, wsign = "greater"), 10/5) expect_equal(evidence_ratio(ps, cut = 0.5, wsign = "less"), 5/10) }) test_that("find_vars finds all valid variable names in a string", { string <- "x + b.x - .5 + abc(a__3) : 1/2 - 0.2" expect_equal(find_vars(string), c("x", "b.x", "a__3")) }) test_that(".predictor_arma runs without errors", { ns <- 20 nobs <- 30 Y = rnorm(nobs) J_lag = c(1:3, 3, 3, rep(c(0:3, 3), 4), 0:3, 0) ar <- matrix(rnorm(ns * 3), nrow = ns, ncol = 3) ma <- matrix(rnorm(ns * 1), nrow = ns, ncol = 1) eta <- matrix(rnorm(ns * nobs), nrow = ns, ncol = nobs) expect_equal(.predictor_arma(eta, Y = Y, J_lag = J_lag), eta) expect_silent(.predictor_arma(eta, Y = Y, J_lag = J_lag, ar = ar)) expect_silent(.predictor_arma(eta, Y = Y, J_lag = J_lag, ma = ma)) expect_silent(.predictor_arma(eta, Y = Y, J_lag = J_lag, ar = ar, ma = ma)) }) test_that("make_conditions works correctly", { conds <- make_conditions(epilepsy, c("zBase", "zAge")) expect_equal(dim(conds), c(9, 3)) expect_equal(conds$cond__[3], "zBase = -1 & zAge = 1") }) brms/tests/testthat/tests.priors.R0000644000176200001440000001143613611527526017036 0ustar liggesusers# most tests of prior related stuff can be found in tests.make_stancode.R context("Tests for prior generating functions") test_that("get_prior finds all classes for which priors can be specified", { expect_equal( sort( get_prior( count ~ zBase * Trt + (1|patient) + (1+Trt|visit), data = epilepsy, family = "poisson" )$class ), sort(c(rep("b", 4), c("cor", "cor"), "Intercept", rep("sd", 6))) ) expect_equal( sort( get_prior( rating ~ treat + period + cse(carry), data = inhaler, family = sratio(threshold = "equidistant") )$class ), sort(c(rep("b", 4), "delta", rep("Intercept", 1))) ) }) test_that("set_prior allows arguments to be vectors", { bprior <- set_prior("normal(0, 2)", class = c("b", "sd")) expect_is(bprior, "brmsprior") expect_equal(bprior$prior, rep("normal(0, 2)", 2)) expect_equal(bprior$class, c("b", "sd")) }) test_that("print for class brmsprior works correctly", { expect_output(print(set_prior("normal(0,1)")), fixed = TRUE, "b ~ normal(0,1)") expect_output(print(set_prior("normal(0,1)", coef = "x")), "b_x ~ normal(0,1)", fixed = TRUE) expect_output(print(set_prior("cauchy(0,1)", class = "sd", group = "x")), "sd_x ~ cauchy(0,1)", fixed = TRUE) expect_output(print(set_prior("increment_log_prob(normal_log(0,1))")), "increment_log_prob(normal_log(0,1))", fixed = TRUE) }) test_that("get_prior returns correct nlpar names for random effects pars", { # reported in issue #47 data <- data.frame(y = rnorm(10), x = rnorm(10), g = rep(1:2, 5)) gp <- get_prior(bf(y ~ a - b^x, a + b ~ (1+x|g), nl = TRUE), data = data) expect_equal(sort(unique(gp$nlpar)), c("", "a", "b")) }) test_that("get_prior returns correct fixed effect names for GAMMs", { dat <- data.frame(y = rnorm(10), x = rnorm(10), z = rnorm(10), g = rep(1:2, 5)) prior <- get_prior(y ~ z + s(x) + (1|g), data = dat) expect_equal(prior[prior$class == "b", ]$coef, c("", "sx_1", "z")) prior <- get_prior(bf(y ~ lp, lp ~ z + s(x) + (1|g), nl = TRUE), data = dat) expect_equal(prior[prior$class == "b", ]$coef, c("", "Intercept", "sx_1", "z")) }) test_that("get_prior returns correct prior names for auxiliary parameters", { dat <- data.frame(y = rnorm(10), x = rnorm(10), z = rnorm(10), g = rep(1:2, 5)) prior <- get_prior(bf(y ~ 1, phi ~ z + (1|g)), data = dat, family = Beta()) prior <- prior[prior$dpar == "phi", ] pdata <- data.frame(class = c("b", "b", "Intercept", rep("sd", 3)), coef = c("", "z", "", "", "", "Intercept"), group = c(rep("", 4), "g", "g"), stringsAsFactors = FALSE) pdata <- pdata[with(pdata, order(class, group, coef)), ] expect_equivalent(prior[, c("class", "coef", "group")], pdata) }) test_that("get_prior returns correct priors for multivariate models", { dat <- data.frame(y1 = rnorm(10), y2 = c(1, rep(1:3, 3)), x = rnorm(10), g = rep(1:2, 5)) bform <- bf(mvbind(y1, y2) ~ x + (x|ID1|g)) # check global priors prior <- get_prior(bform, dat, family = gaussian()) expect_equal(prior[prior$resp == "y1" & prior$class == "b", "coef"], c("", "x")) expect_equal(prior[prior$class == "rescor", "prior"], "lkj(1)") # check family and autocor specific priors family <- list(gaussian, Beta()) bform <- bf(y1 ~ x + (x|ID1|g) + ar()) + bf(y2 ~ 1) prior <- get_prior(bform, dat, family = family) expect_true(any(with(prior, class == "sigma" & resp == "y1"))) expect_true(any(with(prior, class == "ar" & resp == "y1"))) expect_true(any(with(prior, class == "phi" & resp == "y2"))) expect_true(!any(with(prior, class == "ar" & resp == "y2"))) }) test_that("get_prior returns correct priors for categorical models", { # check global priors dat <- data.frame(y2 = c(1, rep(1:3, 3)), x = rnorm(10), g = rep(1:2, 5)) prior <- get_prior(y2 ~ x + (x|ID1|g), data = dat, family = categorical()) expect_equal(prior[prior$dpar == "mu2" & prior$class == "b", "coef"], c("", "x")) }) test_that("set_prior alias functions produce equivalent results", { expect_equal(set_prior("normal(0, 1)", class = "sd"), prior(normal(0, 1), class = sd)) expect_equal(set_prior("normal(0, 1)", class = "sd", nlpar = "a"), prior(normal(0, 1), class = "sd", nlpar = a)) expect_equal(set_prior("normal(0, 1)", class = "sd", nlpar = "a"), prior_(~normal(0, 1), class = ~sd, nlpar = quote(a))) expect_equal(set_prior("normal(0, 1)", class = "sd"), prior_string("normal(0, 1)", class = "sd")) }) brms/tests/testthat/tests.brmsformula.R0000644000176200001440000000420113552555374020047 0ustar liggesuserscontext("Tests for brmsformula") test_that("brmsformula validates formulas of non-linear parameters", { expect_error(bf(y ~ a, ~ 1, a ~ 1), "Additional formulas must be named") expect_error(bf(y ~ a^x, a.b ~ 1), "not contain dots or underscores") expect_error(bf(y ~ a^(x+b), a_b ~ 1), "not contain dots or underscores") }) test_that("brmsformula validates formulas of auxiliary parameters", { expect_error(bf(y ~ a, ~ 1, sigma ~ 1), "Additional formulas must be named") }) test_that("brmsformula detects use if '~~'", { # checks fix of issue #749 expect_error(bf(y~~x), "~~") }) test_that("brmsformula does not change a 'brmsformula' object", { form <- bf(y ~ a, sigma ~ 1) expect_identical(form, bf(form)) form <- bf(y ~ a, sigma ~ 1, a ~ x, nl = TRUE) expect_identical(form, bf(form)) }) test_that("brmsformula detects auxiliary parameter equations", { expect_error(bf(y~x, sigma1 = "sigmaa2"), "Can only equate parameters of the same class") expect_error(bf(y~x, mu3 = "mu2"), "Equating parameters of class 'mu' is not allowed") expect_error(bf(y~x, sigma1 = "sigma1"), "Equating 'sigma1' with itself is not meaningful") expect_error(bf(y~x, shape1 ~ x, shape2 = "shape1"), "Cannot use predicted parameters on the right-hand side") expect_error(bf(y~x, shape1 = "shape3", shape2 = "shape1"), "Cannot use fixed parameters on the right-hand side") }) test_that("update_adterms works correctly", { form <- y | trials(size) ~ x expect_equal( update_adterms(form, ~ trials(10)), y | trials(10) ~ x ) expect_equal( update_adterms(form, ~ weights(w)), y | trials(size) + weights(w) ~ x ) expect_equal( update_adterms(form, ~ weights(w), action = "replace"), y | weights(w) ~ x ) expect_equal( update_adterms(y ~ x, ~ trials(10)), y | trials(10) ~ x ) }) test_that("deprecated 'cbind' syntax still works", { expect_equal(suppressWarnings(bf(cbind(y1, y2) ~ x)), bf(mvbind(y1, y2) ~ x)) }) brms/tests/testthat/tests.make_standata.R0000644000176200001440000011404513616060272020307 0ustar liggesuserscontext("Tests for make_standata") test_that(paste("make_standata returns correct data names ", "for fixed and random effects"), { expect_equal(names(make_standata(rating ~ treat + period + carry + (1|subject), data = inhaler)), c("N", "Y", "K", "X", "Z_1_1", "J_1", "N_1", "M_1", "NC_1", "prior_only")) expect_equal(names(make_standata(rating ~ treat + period + carry + (1+treat|id|subject), data = inhaler, family = "categorical")), c("N", "Y", "ncat", "K_mu2", "X_mu2", "Z_1_mu2_1", "Z_1_mu2_2", "K_mu3", "X_mu3", "Z_1_mu3_3", "Z_1_mu3_4", "K_mu4", "X_mu4", "Z_1_mu4_5", "Z_1_mu4_6", "J_1", "N_1", "M_1", "NC_1", "prior_only")) expect_equal(names(make_standata(rating ~ treat + period + carry + (1+treat|subject), data = inhaler)), c("N", "Y", "K", "X", "Z_1_1", "Z_1_2", "J_1", "N_1", "M_1", "NC_1", "prior_only")) dat <- data.frame(y = 1:10, g = 1:10, h = 11:10, x = rep(0,10)) expect_equal(names(make_standata(y ~ x + (1|g) + (1|h), dat, "poisson")), c("N", "Y", "K", "X", "Z_1_1", "Z_2_1", "J_1", "J_2", "N_1", "M_1", "NC_1", "N_2", "M_2", "NC_2", "prior_only")) expect_true(all(c("Z_1_1", "Z_1_2", "Z_2_1", "Z_2_2") %in% names(make_standata(y ~ x + (1+x|g/h), dat)))) expect_equal(make_standata(y ~ x + (1+x|g+h), dat), make_standata(y ~ x + (1+x|g) + (1+x|h), dat)) }) test_that(paste("make_standata handles variables used as fixed effects", "and grouping factors at the same time"), { data <- data.frame(y = 1:9, x = factor(rep(c("a","b","c"), 3))) standata <- make_standata(y ~ x + (1|x), data = data) expect_equal(colnames(standata$X), c("Intercept", "xb", "xc")) expect_equal(standata$J_1, as.array(rep(1:3, 3))) standata2 <- make_standata(y ~ x + (1|x), data = data, control = list(not4stan = TRUE)) expect_equal(colnames(standata2$X), c("Intercept", "xb", "xc")) }) test_that("make_standata returns correct data names for addition terms", { dat <- data.frame(y = 1:10, w = 1:10, t = 1:10, x = rep(0,10), c = sample(-1:1,10,TRUE)) expect_equal(names(make_standata(y | se(w) ~ x, dat, gaussian())), c("N", "Y", "se", "K", "X", "sigma", "prior_only")) expect_equal(names(make_standata(y | weights(w) ~ x, dat, "gaussian")), c("N", "Y", "weights", "K", "X", "prior_only")) expect_equal(names(make_standata(y | cens(c) ~ x, dat, "student")), c("N", "Y", "cens", "K", "X", "prior_only")) expect_equal(names(make_standata(y | trials(t) ~ x, dat, "binomial")), c("N", "Y", "trials", "K", "X", "prior_only")) expect_equal(names(make_standata(y | trials(10) ~ x, dat, "binomial")), c("N", "Y", "trials", "K", "X", "prior_only")) expect_equal(names(make_standata(y | thres(11) ~ x, dat, "acat")), c("N", "Y", "nthres", "K", "X", "disc", "prior_only")) expect_equal(names(make_standata(y | thres(10) ~ x, dat, cumulative())), c("N", "Y", "nthres", "K", "X", "disc", "prior_only")) sdata <- make_standata(y | trunc(0,20) ~ x, dat, "gaussian") expect_true(all(sdata$lb == 0) && all(sdata$ub == 20)) sdata <- make_standata(y | trunc(ub = 21:30) ~ x, dat) expect_true(all(all(sdata$ub == 21:30))) }) test_that(paste("make_standata accepts correct response variables", "depending on the family"), { expect_equal(make_standata(y ~ 1, data = data.frame(y = seq(-9.9,0,0.1)), family = "student")$Y, as.array(seq(-9.9,0,0.1))) expect_equal(make_standata(y | trials(10) ~ 1, data = data.frame(y = 1:10), family = "binomial")$Y, as.array(1:10)) expect_equal(make_standata(y ~ 1, data = data.frame(y = 10:20), family = "poisson")$Y, as.array(10:20)) expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(-c(1:2),5)), family = "bernoulli")$Y, as.array(rep(1:0,5))) expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(c(TRUE, FALSE),5)), family = "bernoulli")$Y, as.array(rep(1:0,5))) expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(1:10,5)), family = "categorical")$Y, as.array(rep(1:10,5))) expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(11:20,5)), family = "categorical")$Y, as.array(rep(1:10,5))) expect_equal(make_standata(y ~ 1, data = data.frame(y = factor(rep(11:20,5))), family = "categorical")$Y, as.array(rep(1:10,5))) expect_equal(make_standata(y ~ 1, data = data.frame(y = rep(1:10,5)), family = "cumulative")$Y, as.array(rep(1:10,5))) dat <- data.frame(y = factor(rep(-4:5,5), order = TRUE)) expect_equal(make_standata(y ~ 1, data = dat, family = "acat")$Y, as.array(rep(1:10,5))) expect_equal(make_standata(y ~ 1, data = data.frame(y = seq(1,10,0.1)), family = "exponential")$Y, as.array(seq(1,10,0.1))) dat <- data.frame(y1 = 1:10, y2 = 11:20, x = rep(0,10)) sdata <- make_standata(mvbind(y1, y2) ~ x, data = dat) expect_equal(sdata$Y_y1, as.array(1:10)) expect_equal(sdata$Y_y2, as.array(11:20)) }) test_that(paste("make_standata rejects incorrect response variables", "depending on the family"), { expect_error(make_standata(y ~ 1, data = data.frame(y = factor(1:10)), family = "student"), "Family 'student' requires numeric responses") expect_error(make_standata(y ~ 1, data = data.frame(y = -5:5), family = "geometric"), "Family 'geometric' requires response greater than or equal to 0") expect_error(make_standata(y ~ 1, data = data.frame(y = -1:1), family = "bernoulli"), "contain only two different values") expect_error(make_standata(y ~ 1, data = data.frame(y = factor(-1:1)), family = "cratio"), "Family 'cratio' requires either positive integers or ordered factors") expect_error(make_standata(y ~ 1, data = data.frame(y = rep(0.5:7.5), 2), family = "sratio"), "Family 'sratio' requires either positive integers or ordered factors") expect_error(make_standata(y ~ 1, data = data.frame(y = rep(-7.5:7.5), 2), family = "gamma"), "Family 'gamma' requires response greater than 0") expect_error(make_standata(y ~ 1, data = data.frame(y = c(0.1, 0.5, 1)), family = Beta()), "Family 'beta' requires response smaller than 1") expect_error(make_standata(y ~ 1, data = data.frame(y = c(0, 0.5, 4)), family = von_mises()), "Family 'von_mises' requires response smaller than or equal to 3.14") expect_error(make_standata(y ~ 1, data = data.frame(y = c(-1, 2, 5)), family = hurdle_gamma()), "Family 'hurdle_gamma' requires response greater than or equal to 0") }) test_that("make_standata suggests using family bernoulli if appropriate", { expect_message(make_standata(y | trials(1) ~ 1, data = list(y = rep(0:1,5)), family = "binomial"), "family 'bernoulli' might be a more efficient choice.") expect_message(make_standata(y ~ 1, data = data.frame(y = rep(1:2, 5)), family = "acat"), "family 'bernoulli' might be a more efficient choice.") expect_message(make_standata(y ~ 1, data = data.frame(y = rep(0:1,5)), family = "categorical"), "family 'bernoulli' might be a more efficient choice.") }) test_that("make_standata returns correct values for addition terms", { dat <- data.frame(y = rnorm(9), s = 1:9, w = 1:9, c1 = rep(-1:1, 3), c2 = rep(c("left","none","right"), 3), c3 = c(rep(c(TRUE, FALSE), 4), FALSE), c4 = c(sample(-1:1, 5, TRUE), rep(2, 4)), t = 11:19) expect_equivalent(make_standata(y | se(s) ~ 1, data = dat)$se, as.array(1:9)) expect_equal(make_standata(y | weights(w) ~ 1, data = dat)$weights, as.array(1:9)) expect_equal(make_standata(y | cens(c1) ~ 1, data = dat)$cens, as.array(rep(-1:1, 3))) expect_equal(make_standata(y | cens(c2) ~ 1, data = dat)$cens, as.array(rep(-1:1, 3))) expect_equal(make_standata(y | cens(c3) ~ 1, data = dat)$cens, as.array(c(rep(1:0, 4), 0))) expect_equal(make_standata(y | cens(c4, y + 2) ~ 1, data = dat)$rcens, as.array(c(rep(0, 5), dat$y[6:9] + 2))) sdata <- suppressWarnings(make_standata(s ~ 1, dat, family = "binomial")) expect_equal(sdata$trials, as.array(rep(9, 9))) expect_equal(make_standata(s | trials(10) ~ 1, dat, family = "binomial")$trials, as.array(rep(10, 9))) expect_equal(make_standata(s | trials(t) ~ 1, data = dat, family = "binomial")$trials, as.array(11:19)) expect_equal(SW(make_standata(s | cat(19) ~ 1, data = dat, family = "cumulative"))$nthres, 18) }) test_that("make_standata rejects incorrect addition terms", { dat <- data.frame(y = rnorm(9), s = -(1:9), w = -(1:9), c = rep(-2:0, 3), t = 9:1, z = 1:9) expect_error(make_standata(y | se(s) ~ 1, data = dat), "Standard errors must be non-negative") expect_error(make_standata(y | weights(w) ~ 1, data = dat), "Weights must be non-negative") expect_error(make_standata(y | cens(c) ~ 1, data = dat)) expect_error(make_standata(z | trials(t) ~ 1, data = dat, family = "binomial"), "Number of trials is smaller than the number of events") }) test_that("make_standata handles multivariate models", { dat <- data.frame( y1 = 1:10, y2 = 11:20, x = rep(0, 10), g = rep(1:2, 5), censi = sample(0:1, 10, TRUE), tim = 10:1, w = 1:10 ) sdata <- make_standata(mvbind(y1, y2) | weights(w) ~ x, data = dat) expect_equal(sdata$Y_y1, as.array(dat$y1)) expect_equal(sdata$Y_y2, as.array(dat$y2)) expect_equal(sdata$weights_y1, as.array(1:10)) expect_error(make_standata(mvbind(y1, y2, y2) ~ x, data = dat), "Cannot use the same response variable twice") sdata <- make_standata(mvbind(y1 / y2, y2, y1 * 3) ~ x, data = dat) expect_equal(sdata$Y_y1y2, as.array(dat$y1 / dat$y2)) sdata <- suppressWarnings( make_standata(mvbind(y1, y2) ~ x, dat, autocor = cor_ar(~ tim | g)) ) target1 <- c(seq(9, 1, -2), seq(10, 2, -2)) expect_equal(sdata$Y_y1, as.array(target1)) target2 <- c(seq(19, 11, -2), seq(20, 12, -2)) expect_equal(sdata$Y_y2, as.array(target2)) # models without residual correlations expect_warning( bform <- bf(y1 | cens(censi) ~ x + y2 + (x|2|g)) + gaussian() + cor_ar() + (bf(x ~ 1) + mixture(poisson, nmix = 2)) + (bf(y2 ~ s(y2) + (1|2|g)) + skew_normal()), "Using 'cor_brms' objects for 'autocor' is deprecated" ) bprior <- prior(normal(0, 5), resp = y1) + prior(normal(0, 10), resp = y2) + prior(dirichlet(2, 1), theta, resp = x) sdata <- make_standata(bform, dat, prior = bprior) sdata_names <- c( "N", "J_1_y1", "cens_y1", "Kma_y1", "Z_1_y2_3", "Zs_y2_1_1", "Y_y2", "con_theta_x", "X_mu2_x" ) expect_true(all(sdata_names %in% names(sdata))) expect_equal(sdata$con_theta_x, c(2, 1)) # test addition argument 'subset' bform <- bf(y1 | subset(censi) ~ x + y2 + (x|2|g)) + (bf(y2 ~ s(y2) + (1|2|g)) + skew_normal()) sdata <- make_standata(bform, dat) nsub <- sum(dat$censi) expect_equal(sdata$N_y1, nsub) expect_equal(sdata$N_y2, nrow(dat)) expect_equal(length(sdata$Y_y1), nsub) expect_equal(nrow(sdata$X_y1), nsub) expect_equal(length(sdata$Z_1_y1_2), nsub) }) test_that("make_standata returns correct data for ARMA terms", { dat <- data.frame(y = 1:10, x = rep(0, 10), tim = 10:1, g = rep(3:4, 5)) sdata <- make_standata(y ~ x + ma(tim, g), data = dat) expect_equal(sdata$J_lag, as.array(c(1, 1, 1, 1, 0, 1, 1, 1, 1, 0))) sdata <- make_standata(y ~ x + ar(tim, g, p = 2), data = dat) expect_equal(sdata$J_lag, as.array(c(1, 2, 2, 2, 0, 1, 2, 2, 2, 0))) sdata <- make_standata(y ~ x + ar(tim, g, cov = TRUE), data = dat) expect_equal(sdata$begin_tg, as.array(c(1, 6))) expect_equal(sdata$nobs_tg, as.array(c(5, 5))) bform <- bf(y ~ exp(b * x), b ~ 1, nl = TRUE, autocor = ~arma()) sdata <- make_standata(bform, dat) }) test_that("make_standata allows to retrieve the initial data order", { dat <- data.frame(y1 = rnorm(100), y2 = rnorm(100), id = sample(1:10, 100, TRUE), time = sample(1:100, 100)) # univariate model sdata1 <- make_standata(y1 ~ ar(time, id), data = dat, control = list(save_order = TRUE)) expect_equal(dat$y1, as.numeric(sdata1$Y[attr(sdata1, "old_order")])) # multivariate model sdata2 <- make_standata(mvbind(y1, y2) ~ ma(time, id), data = dat, control = list(save_order = TRUE)) expect_equal(sdata2$Y_y1[attr(sdata2, "old_order")], as.array(dat$y1)) expect_equal(sdata2$Y_y2[attr(sdata2, "old_order")], as.array(dat$y2)) }) test_that("make_standata handles covariance matrices correctly", { A <- structure(diag(1, 4), dimnames = list(1:4, NULL)) expect_equivalent(make_standata(count ~ Trt + (1|visit), data = epilepsy, cov_ranef = list(visit = A))$Lcov_1, A) B <- diag(1, 4) expect_error(make_standata(count ~ Trt + (1|visit), data = epilepsy, cov_ranef = list(visit = B)), "Row names are required") B <- structure(diag(1, 4), dimnames = list(2:5, NULL)) expect_error(make_standata(count ~ Trt + (1|visit), data = epilepsy, cov_ranef = list(visit = B)), "Row names .* do not match") B <- structure(diag(1:5), dimnames = list(c(1,5,2,4,3), NULL)) expect_equivalent(make_standata(count ~ Trt + (1|visit), data = epilepsy, cov_ranef = list(visit = B))$Lcov_1, t(chol(B[c(1,3,5,4), c(1,3,5,4)]))) B <- A B[1,2] <- 0.5 expect_error(make_standata(count ~ Trt + (1|visit), data = epilepsy, cov_ranef = list(visit = B)), "not symmetric") }) test_that("make_standata correctly prepares data for non-linear models", { flist <- list(a ~ x + (1|1|g), b ~ mo(z) + (1|1|g)) dat <- data.frame( y = rnorm(9), x = rnorm(9), z = sample(1:9, 9), g = rep(1:3, 3) ) bform <- bf(y ~ a - b^z, flist = flist, nl = TRUE) sdata <- make_standata(bform, data = dat) expect_equal(names(sdata), c("N", "Y", "C_1", "K_a", "X_a", "Z_1_a_1", "K_b", "X_b", "Ksp_b", "Imo_b", "Xmo_b_1", "Jmo_b", "con_simo_b_1", "Z_1_b_2", "J_1", "N_1", "M_1", "NC_1", "prior_only") ) expect_equal(colnames(sdata$X_a), c("Intercept", "x")) expect_equal(sdata$J_1, as.array(dat$g)) bform <- bf(y ~ x) + nlf(sigma ~ a1 * exp(-x/(a2 + z))) + lf(a1 ~ 1, a2 ~ z + (x|g)) + lf(alpha ~ x) sdata <- make_standata(bform, dat, family = skew_normal()) sdata_names <- c("C_sigma_1", "X_a2", "Z_1_a2_1") expect_true(all(sdata_names %in% names(sdata))) }) test_that("make_standata correctly prepares data for monotonic effects", { data <- data.frame( y = rpois(120, 10), x1 = rep(1:4, 30), z = rnorm(10), x2 = factor(rep(c("a", "b", "c"), 40), ordered = TRUE) ) sdata <- make_standata(y ~ mo(x1)*mo(x2)*y, data = data) sdata_names <- c("Xmo_1", "Imo", "Jmo", "con_simo_8", "con_simo_5") expect_true(all(sdata_names %in% names(sdata))) expect_equivalent(sdata$Xmo_1, as.array(data$x1 - 1)) expect_equivalent(sdata$Xmo_2, as.array(as.numeric(data$x2) - 1)) expect_equal( as.vector(unname(sdata$Jmo)), rep(c(max(data$x1) - 1, length(unique(data$x2)) - 1), 4) ) expect_equal(sdata$con_simo_1, as.array(rep(1, 3))) prior <- set_prior("dirichlet(1:3)", coef = "mox11", class = "simo", dpar = "sigma") sdata <- make_standata(bf(y ~ 1, sigma ~ mo(x1)), data = data, prior = prior) expect_equal(sdata$con_simo_sigma_1, as.array(1:3)) prior <- c( set_prior("normal(0,1)", class = "b", coef = "mox1"), set_prior("dirichlet(c(1, 0.5, 2))", class = "simo", coef = "mox11"), prior_(~dirichlet(c(1, 0.5, 2)), class = "simo", coef = "mox1:mox21") ) sdata <- make_standata(y ~ mo(x1)*mo(x2), data = data, prior = prior) expect_equal(sdata$con_simo_1, as.array(c(1, 0.5, 2))) expect_equal(sdata$con_simo_3, as.array(c(1, 0.5, 2))) expect_error( make_standata(y ~ mo(z), data = data), "Monotonic predictors must be integers or ordered factors" ) prior <- c(set_prior("dirichlet(c(1,0.5,2))", class = "simo", coef = "mox21")) expect_error( make_standata(y ~ mo(x2), data = data, prior = prior), "Invalid Dirichlet prior for the simplex of coefficient 'mox21'", fixed = TRUE ) }) test_that("make_standata returns FCOR covariance matrices", { data <- data.frame(y = 1:5) data2 <- list(V = diag(5)) expect_equal(make_standata(y ~ fcor(V), data, data2 = data2)$Mfcor, data2$V, check.attributes = FALSE) expect_warning( expect_error( make_standata(y~1, data, autocor = cor_fixed(diag(2))), "Dimensions of 'M' for FCOR terms must be equal" ), "Using 'cor_brms' objects for 'autocor' is deprecated" ) }) test_that("make_standata returns data for GAMMs", { dat <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10), z = rnorm(10), g = factor(rep(1:2, 5))) sdata <- make_standata(y ~ s(x1) + z + s(x2, by = x3), data = dat) expect_equal(sdata$nb_1, 1) expect_equal(as.vector(sdata$knots_2), 8) expect_equal(dim(sdata$Zs_1_1), c(10, 8)) expect_equal(dim(sdata$Zs_2_1), c(10, 8)) bform <- bf(y ~ lp, lp ~ s(x1) + z + s(x2, by = x3), nl = TRUE) sdata <- make_standata(bform, dat) expect_equal(sdata$nb_lp_1, 1) expect_equal(as.vector(sdata$knots_lp_2), 8) expect_equal(dim(sdata$Zs_lp_1_1), c(10, 8)) expect_equal(dim(sdata$Zs_lp_2_1), c(10, 8)) sdata <- make_standata(y ~ g + s(x2, by = g), data = dat) expect_true(all(c("knots_1", "knots_2") %in% names(sdata))) # test issue #562 dat$g <- as.character(dat$g) sdata <- make_standata(y ~ g + s(x2, by = g), data = dat) expect_true(all(c("knots_1", "knots_2") %in% names(sdata))) sdata <- make_standata(y ~ t2(x1, x2), data = dat) expect_equal(sdata$nb_1, 3) expect_equal(as.vector(sdata$knots_1), c(9, 6, 6)) expect_equal(dim(sdata$Zs_1_1), c(10, 9)) expect_equal(dim(sdata$Zs_1_3), c(10, 6)) expect_error(make_standata(y ~ te(x1, x2), data = dat), "smooths 'te' and 'ti' are not yet implemented") }) test_that("make_standata returns correct group ID data", { form <- bf(count ~ Trt + (1+Trt|3|visit) + (1|patient), shape ~ (1|3|visit) + (Trt||patient)) sdata <- make_standata(form, data = epilepsy, family = negbinomial()) expect_true(all(c("Z_1_1", "Z_2_2", "Z_3_shape_1", "Z_2_shape_3") %in% names(sdata))) form <- bf(count ~ a, sigma ~ (1|3|visit) + (Trt||patient), a ~ Trt + (1+Trt|3|visit) + (1|patient), nl = TRUE) sdata <- make_standata(form, data = epilepsy, family = student()) expect_true(all(c("Z_1_sigma_1", "Z_2_a_3", "Z_2_sigma_1", "Z_3_a_1") %in% names(sdata))) }) test_that("make_standata handles population-level intercepts", { dat <- data.frame(y = 10:1, x = 1:10) sdata <- make_standata(y ~ 0 + x, data = dat) expect_equal(unname(sdata$X[, 1]), dat$x) sdata <- make_standata(y ~ x, dat, cumulative(), control = list(not4stan = TRUE)) expect_equal(unname(sdata$X[, 1]), dat$x) sdata <- make_standata(y ~ 0 + Intercept + x, data = dat) expect_equal(unname(sdata$X), cbind(1, dat$x)) }) test_that("make_standata handles category specific effects", { sdata <- make_standata(rating ~ period + carry + cse(treat), data = inhaler, family = sratio()) expect_equivalent(sdata$Xcs, matrix(inhaler$treat)) sdata <- make_standata(rating ~ period + carry + cse(treat) + (cse(1)|subject), data = inhaler, family = acat()) expect_equivalent(sdata$Z_1_3, as.array(rep(1, nrow(inhaler)))) sdata <- make_standata(rating ~ period + carry + (cse(treat)|subject), data = inhaler, family = cratio()) expect_equivalent(sdata$Z_1_4, as.array(inhaler$treat)) expect_error(make_standata(rating ~ 1 + cse(treat), data = inhaler, family = "cumulative"), "require families") expect_error(make_standata(rating ~ 1 + (treat + cse(1)|subject), data = inhaler, family = "cratio"), "category specific effects in separate group-level terms") }) test_that("make_standata handles wiener diffusion models", { dat <- data.frame(q = 1:10, resp = sample(0:1, 10, TRUE), x = rnorm(10)) dat$dec <- ifelse(dat$resp == 0, "lower", "upper") dat$test <- "a" sdata <- make_standata(q | dec(resp) ~ x, data = dat, family = wiener()) expect_equal(sdata$dec, as.array(dat$resp)) sdata <- make_standata(q | dec(dec) ~ x, data = dat, family = wiener()) expect_equal(sdata$dec, as.array(dat$resp)) expect_error(make_standata(q | dec(test) ~ x, data = dat, family = wiener()), "Decisions should be 'lower' or 'upper'") }) test_that("make_standata handles noise-free terms", { N <- 30 dat <- data.frame( y = rnorm(N), x = rnorm(N), z = rnorm(N), xsd = abs(rnorm(N, 1)), zsd = abs(rnorm(N, 1)), ID = rep(1:5, each = N / 5) ) sdata <- make_standata( bf(y ~ me(x, xsd)*me(z, zsd)*x, sigma ~ me(x, xsd)), data = dat ) expect_equal(sdata$Xn_1, as.array(dat$x)) expect_equal(sdata$noise_2, as.array(dat$zsd)) expect_equal(unname(sdata$Csp_3), as.array(dat$x)) expect_equal(sdata$Ksp, 6) expect_equal(sdata$NCme_1, 1) }) test_that("make_standata handles noise-free terms with grouping factors", { dat <- data.frame( y = rnorm(10), x1 = rep(1:5, each = 2), sdx = rep(1:5, each = 2), g = rep(c("b", "c", "a", "d", 1), each = 2) ) sdata <- make_standata(y ~ me(x1, sdx, gr = g), dat) expect_equal(unname(sdata$Xn_1), as.array(c(5, 3, 1, 2, 4))) expect_equal(unname(sdata$noise_1), as.array(c(5, 3, 1, 2, 4))) dat$sdx[2] <- 10 expect_error( make_standata(y ~ me(x1, sdx, gr = g), dat), "Measured values and measurement error should be unique" ) }) test_that("make_standata handles missing value terms", { dat = data.frame(y = rnorm(10), x = rnorm(10), g = 1:10) miss <- c(1, 3, 9) dat$x[miss] <- NA bform <- bf(y ~ mi(x)*g) + bf(x | mi() ~ g) + set_rescor(FALSE) sdata <- make_standata(bform, dat) expect_equal(sdata$Jmi_x, as.array(miss)) expect_true(all(is.infinite(sdata$Y_x[miss]))) # dots in variable names are correctly handled #452 dat$x.2 <- dat$x bform <- bf(y ~ mi(x.2)*g) + bf(x.2 | mi() ~ g) + set_rescor(FALSE) sdata <- make_standata(bform, dat) expect_equal(sdata$Jmi_x, as.array(miss)) dat$z <- rbeta(10, 1, 1) dat$z[miss] <- NA bform <- bf(exp(y) ~ mi(z)*g) + bf(z | mi() ~ g, family = Beta()) + set_rescor(FALSE) sdata <- make_standata(bform, dat) expect_equal(sdata$Jmi_z, as.array(miss)) }) test_that("make_standata handles overimputation", { dat = data.frame(y = rnorm(10), x = rnorm(10), g = 1:10, sdy = 1) miss <- c(1, 3, 9) dat$x[miss] <- dat$sdy[miss] <- NA bform <- bf(y ~ mi(x)*g) + bf(x | mi(sdy) ~ g) + set_rescor(FALSE) sdata <- make_standata(bform, dat) expect_equal(sdata$Jme_x, as.array(setdiff(1:10, miss))) expect_true(all(is.infinite(sdata$Y_x[miss]))) expect_true(all(is.infinite(sdata$noise_x[miss]))) }) test_that("make_standata handles multi-membership models", { dat <- data.frame(y = rnorm(10), g1 = c(7:2, rep(10, 4)), g2 = 1:10, w1 = rep(1, 10), w2 = rep(abs(rnorm(10)))) sdata <- make_standata(y ~ (1|mm(g1,g2,g1,g2)), data = dat) expect_true(all(paste0(c("W_1_", "J_1_"), 1:4) %in% names(sdata))) expect_equal(sdata$W_1_4, as.array(rep(0.25, 10))) expect_equal(unname(sdata$Z_1_1_1), as.array(rep(1, 10))) expect_equal(unname(sdata$Z_1_1_2), as.array(rep(1, 10))) # this checks whether combintation of factor levels works as intended expect_equal(sdata$J_1_1, as.array(c(6, 5, 4, 3, 2, 1, 7, 7, 7, 7))) expect_equal(sdata$J_1_2, as.array(c(8, 1, 2, 3, 4, 5, 6, 9, 10, 7))) sdata <- make_standata(y ~ (1|mm(g1,g2, weights = cbind(w1, w2))), dat) expect_equal(sdata$W_1_1, as.array(dat$w1 / (dat$w1 + dat$w2))) # tests mmc terms sdata <- make_standata(y ~ (1+mmc(w1, w2)|mm(g1,g2)), data = dat) expect_equal(unname(sdata$Z_1_2_1), as.array(dat$w1)) expect_equal(unname(sdata$Z_1_2_2), as.array(dat$w2)) expect_error( make_standata(y ~ (mmc(w1, w2, y)|mm(g1,g2)), data = dat), "Invalid term 'mmc(w1, w2, y)':", fixed = TRUE ) expect_error( make_standata(y ~ (mmc(w1, w2)*y|mm(g1,g2)), data = dat), "The term 'mmc(w1,w2):y' is invalid", fixed = TRUE ) # tests if ":" works in multi-membership models sdata <- make_standata(y ~ (1|mm(w1:g1,w1:g2)), dat) expect_true(all(c("J_1_1", "J_1_2") %in% names(sdata))) }) test_that("by variables in grouping terms are handled correctly", { gvar <- c("1A", "1B", "2A", "2B", "3A", "3B", "10", "100", "2", "3") dat <- data.frame( y = rnorm(100), x = rnorm(100), g = rep(gvar, each = 10), z = factor(rep(c(0, 4.5, 3, 2, "x 1"), each = 20)), z2 = factor(1:2) ) sdata <- make_standata(y ~ x + (x | gr(g, by = z)), dat) expect_equal(sdata$Nby_1, 5) expect_equal(sdata$Jby_1, as.array(c(2, 2, 1, 1, 5, 4, 4, 5, 3, 3))) expect_error(make_standata(y ~ x + (1|gr(g, by = z2)), dat), "Some levels of 'g' correspond to multiple levels of 'z2'") }) test_that("make_standata handles calls to the 'poly' function", { dat <- data.frame(y = rnorm(10), x = rnorm(10)) expect_equal(colnames(make_standata(y ~ 1 + poly(x, 3), dat)$X), c("Intercept", "polyx31", "polyx32", "polyx33")) }) test_that("make_standata allows fixed distributional parameters", { dat <- list(y = 1:10) expect_equal(make_standata(bf(y ~ 1, nu = 3), dat, student())$nu, 3) expect_equal(make_standata(y ~ 1, dat, acat())$disc, 1) expect_error(make_standata(bf(y ~ 1, bias = 0.5), dat), "Invalid fixed parameters: 'bias'") }) test_that("Cell-mean coding can be disabled", { df <- data.frame(y = 1:10, g = rep(c("a", "b"), 5)) bform <- bf(y ~ g) + lf(disc ~ 0 + g + (0 + g | y), cmc = FALSE) + cumulative() sdata <- make_standata(bform, df) target <- matrix(rep(0:1, 5), dimnames = list(1:10, "gb")) expect_equal(sdata$X_disc, target) expect_equal(unname(sdata$Z_1_disc_1), as.array(rep(0:1, 5))) expect_true(!"Z_1_disc_2" %in% names(sdata)) bform <- bf(y ~ 0 + g + (1 | y), cmc = FALSE) sdata <- make_standata(bform, df) expect_equal(sdata$X, target) expect_equal(unname(sdata$Z_1_1), as.array(rep(1, 10))) }) test_that("make_standata correctly includes offsets", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) sdata <- make_standata(bf(y ~ x + offset(c), sigma ~ offset(c + 1)), data) expect_equal(sdata$offsets, as.array(data$c)) expect_equal(sdata$offsets_sigma, as.array(data$c + 1)) sdata <- make_standata(y ~ x + offset(c) + offset(x), data) expect_equal(sdata$offsets, as.array(data$c + data$x)) }) test_that("make_standata includes data for mixture models", { data <- data.frame(y = rnorm(10), x = rnorm(10), c = 1) form <- bf(y ~ x, mu1 ~ 1, family = mixture(gaussian, gaussian)) sdata <- make_standata(form, data) expect_equal(sdata$con_theta, c(1, 1)) expect_equal(dim(sdata$X_mu1), c(10, 1)) expect_equal(dim(sdata$X_mu2), c(10, 2)) form <- bf(y ~ x, family = mixture(gaussian, gaussian)) sdata <- make_standata(form, data, prior = prior(dirichlet(10, 2), theta)) expect_equal(sdata$con_theta, c(10, 2)) form <- bf(y ~ x, theta1 = 1, theta2 = 3, family = mixture(gaussian, gaussian)) sdata <- make_standata(form, data) expect_equal(sdata$theta1, 1/4) expect_equal(sdata$theta2, 3/4) }) test_that("make_standata includes data for Gaussian processes", { dat <- data.frame(y = rnorm(10), x1 = sample(1:10, 10), z = factor(c(2, 2, 2, 3, 4, rep(5, 5)))) sdata <- make_standata(y ~ gp(x1), dat) expect_equal(max(sdata$Xgp_1) - min(sdata$Xgp_1), 1) sdata <- make_standata(y ~ gp(x1, scale = FALSE), dat) expect_equal(max(sdata$Xgp_1) - min(sdata$Xgp_1), 9) sdata <- make_standata(y ~ gp(x1, by = z, gr = TRUE), dat) expect_equal(sdata$Igp_1_2, as.array(4)) expect_equal(sdata$Jgp_1_4, as.array(1:5)) expect_equal(sdata$Igp_1_4, as.array(6:10)) sdata <- make_standata(y ~ gp(x1, by = y, gr = TRUE), dat) expect_equal(sdata$Cgp_1, as.array(dat$y)) }) test_that("make_standata includes data for approximate Gaussian processes", { dat <- data.frame(y = rnorm(10), x1 = sample(1:10, 10), z = factor(c(2, 2, 2, 3, 4, rep(5, 5)))) sdata <- make_standata(y ~ gp(x1, k = 5, c = 5/4), dat) expect_equal(sdata$NBgp_1, 5) expect_equal(dim(sdata$Xgp_1), c(10, 5)) expect_equal(dim(sdata$slambda_1), c(5, 1)) sdata <- make_standata(y ~ gp(x1, by = z, k = 5, c = 5/4), dat) expect_equal(sdata$Igp_1_2, as.array(4)) expect_equal(sdata$Cgp_1_2, as.array(1)) expect_equal(sdata$Igp_1_4, as.array(6:10)) }) test_that("make_standata includes data for SAR models", { dat <- data.frame(y = rnorm(10), x = rnorm(10)) W <- matrix(0, nrow = 10, ncol = 10) dat2 <- list(W = W) sdata <- make_standata(y ~ x + sar(W), data = dat, data2 = dat2) expect_equal(dim(sdata$M), rep(nrow(W), 2)) dat2 <- list(W = matrix(0, 2, 2)) expect_error( make_standata(y ~ x + sar(W), data = dat, data2 = dat2), "Dimensions of 'M' for SAR terms must be equal" ) }) test_that("make_standata includes data for CAR models", { dat = data.frame(y = rnorm(10), x = rnorm(10), obs = 1:10) edges <- cbind(1:10, 10:1) W <- matrix(0, nrow = 10, ncol = 10) for (i in seq_len(nrow(edges))) { W[edges[i, 1], edges[i, 2]] <- 1 } rownames(W) <- 1:nrow(W) dat2 <- list(W = W) sdata <- make_standata(y ~ x + car(W, gr = obs), dat, data2 = dat2) expect_equal(sdata$Nloc, 10) expect_equal(unname(sdata$Nneigh), rep(1, 10)) expect_equal(unname(sdata$edges1), as.array(10:6)) expect_equal(unname(sdata$edges2), as.array(1:5)) sdata_old <- SW(make_standata(y ~ x, dat, autocor = cor_car(W))) expect_equal(sdata, sdata_old) rownames(dat2$W) <- c("a", 2:9, "b") dat$group <- rep(c("a", "b"), each = 5) sdata <- make_standata(y ~ x + car(W, gr = group), dat, data2 = dat2) expect_equal(sdata$Nloc, 2) expect_equal(sdata$edges1, as.array(2)) expect_equal(sdata$edges2, as.array(1)) sdata <- make_standata(y ~ x + car(W, group, type = "bym2"), data = dat, data2 = dat2) expect_equal(length(sdata$car_scale), 1L) # test error messages rownames(dat2$W) <- c(1:9, "a") expect_error(make_standata(y ~ car(W, gr = group), dat, data2 = dat2), "Row names of 'M' for CAR terms do not match") rownames(dat2$W) <- NULL expect_error(make_standata(y ~ car(W, gr = group), dat, data2 = dat2), "Row names are required for 'M'") dat2$W[1, 10] <- 0 expect_error(make_standata(y ~ car(W), dat, data2 = dat2), "'M' for CAR terms must be symmetric") dat2$W[10, 1] <- 0 expect_error(SW(make_standata(y ~ x + car(W), dat, data2 = dat2)), "all locations should have at least one neighbor") }) test_that("make_standata includes data of special priors", { dat <- data.frame(y = 1:10, x1 = rnorm(10), x2 = rnorm(10)) # horseshoe prior hs <- horseshoe(7, scale_global = 2, df_global = 3, df_slab = 6, scale_slab = 3) sdata <- make_standata(y ~ x1*x2, data = dat, prior = set_prior(hs)) expect_equal(sdata$hs_df, 7) expect_equal(sdata$hs_df_global, 3) expect_equal(sdata$hs_df_slab, 6) expect_equal(sdata$hs_scale_global, 2) expect_equal(sdata$hs_scale_slab, 3) hs <- horseshoe(par_ratio = 0.1) sdata <- make_standata(y ~ x1*x2, data = dat, prior = set_prior(hs)) expect_equal(sdata$hs_scale_global, 0.1 / sqrt(nrow(dat))) # lasso prior sdata <- make_standata(y ~ x1*x2, data = dat, prior = prior(lasso(2, scale = 10))) expect_equal(sdata$lasso_df, 2) expect_equal(sdata$lasso_scale, 10) # horseshoe and lasso prior applied in a non-linear model hs_a1 <- horseshoe(7, scale_global = 2, df_global = 3) lasso_a2 <- lasso(2, scale = 10) sdata <- make_standata( bf(y ~ a1 + a2, a1 ~ x1, a2 ~ 0 + x2, nl = TRUE), data = dat, sample_prior = TRUE, prior = c(set_prior(hs_a1, nlpar = "a1"), set_prior(lasso_a2, nlpar = "a2")) ) expect_equal(sdata$hs_df_a1, 7) expect_equal(sdata$lasso_df_a2, 2) }) test_that("dots in formula are correctly expanded", { dat <- data.frame(y = 1:10, x1 = 1:10, x2 = 1:10) sdata <- make_standata(y ~ ., dat) expect_equal(colnames(sdata$X), c("Intercept", "x1", "x2")) }) test_that("argument 'stanvars' is handled correctly", { bprior <- prior(normal(mean_intercept, 10), class = "Intercept") mean_intercept <- 5 stanvars <- stanvar(mean_intercept) sdata <- make_standata(count ~ Trt, data = epilepsy, prior = bprior, stanvars = stanvars) expect_equal(sdata$mean_intercept, 5) # define a multi_normal prior with known covariance matrix bprior <- prior(multi_normal(M, V), class = "b") stanvars <- stanvar(rep(0, 2), "M", scode = " vector[K] M;") + stanvar(diag(2), "V", scode = " matrix[K, K] V;") sdata <- make_standata(count ~ Trt + zBase, epilepsy, prior = bprior, stanvars = stanvars) expect_equal(sdata$M, rep(0, 2)) expect_equal(sdata$V, diag(2)) }) test_that("addition arguments 'vint' and 'vreal' work correctly", { dat <- data.frame(size = 10, y = sample(0:10, 20, TRUE), x = rnorm(20)) beta_binomial2 <- custom_family( "beta_binomial2", dpars = c("mu", "tau"), links = c("logit", "log"), lb = c(NA, 0), type = "int", vars = c("vint1[n]", "vreal1[n]") ) sdata <- make_standata( y | vint(size) + vreal(x, size) ~ 1, data = dat, family = beta_binomial2, ) expect_equal(sdata$vint1, as.array(rep(10, 20))) expect_equal(sdata$vreal1, as.array(dat$x)) expect_equal(sdata$vreal2, as.array(rep(10, 20))) }) test_that("reserved variables 'Intercept' is handled correctly", { dat <- data.frame(y = 1:10) expect_warning( sdata <- make_standata(y ~ 0 + intercept, dat), "Reserved variable name 'intercept' is deprecated." ) expect_true(all(sdata$X[, "intercept"] == 1)) sdata <- make_standata(y ~ 0 + Intercept, dat) expect_true(all(sdata$X[, "Intercept"] == 1)) }) test_that("data for multinomial and dirichlet models is correct", { N <- 15 dat <- as.data.frame(rdirichlet(N, c(3, 2, 1))) names(dat) <- c("y1", "y2", "y3") dat$t1 <- round(dat$y1 * rpois(N, 10)) dat$t2 <- round(dat$y2 * rpois(N, 10)) dat$t3 <- round(dat$y3 * rpois(N, 10)) dat$x <- rnorm(N) dat$y <- with(dat, cbind(y1, y2, y3)) dat$t <- with(dat, cbind(t1, t2, t3)) dat$size <- rowSums(dat$t) sdata <- make_standata(t | trials(size) ~ x, dat, multinomial()) expect_equal(sdata$trials, as.array(dat$size)) expect_equal(sdata$ncat, 3) expect_equal(sdata$Y, unname(dat$t)) sdata <- make_standata(y ~ x, data = dat, family = dirichlet()) expect_equal(sdata$ncat, 3) expect_equal(sdata$Y, unname(dat$y)) expect_error( make_standata(t | trials(10) ~ x, data = dat, family = multinomial()), "Number of trials does not match the number of events" ) expect_error(make_standata(t ~ x, data = dat, family = dirichlet()), "Response values in dirichlet models must sum to 1") }) test_that("make_standata handles cox models correctly", { data <- data.frame(y = rexp(100), x = rnorm(100)) bform <- bf(y ~ x) sdata <- make_standata(bform, data, brmsfamily("cox")) expect_equal(dim(sdata$Zbhaz), c(100, 4)) expect_equal(dim(sdata$Zcbhaz), c(100, 4)) sdata <- make_standata(bform, data, brmsfamily("cox", bhaz = list(df = 6))) expect_equal(dim(sdata$Zbhaz), c(100, 6)) expect_equal(dim(sdata$Zcbhaz), c(100, 6)) }) test_that("make_standata handles addition term 'rate' is correctly", { data <- data.frame(y = rpois(10, 1), x = rnorm(10), time = 1:10) sdata <- make_standata(y | rate(time) ~ x, data, poisson()) expect_equal(sdata$denom, as.array(data$time)) }) test_that("make_standata handles grouped ordinal thresholds correctly", { dat <- data.frame( y = c(1:5, 1:4, 4), gr = rep(c("a", "b"), each = 5), th = rep(5:6, each = 5), x = rnorm(10) ) # thresholds without a grouping factor sdata <- make_standata(y ~ x, dat, cumulative()) expect_equal(sdata$nthres, 4) sdata <- make_standata(y | thres(5) ~ x, dat, cumulative()) expect_equal(sdata$nthres, 5) expect_error( make_standata(y | thres(th) ~ x, dat, cumulative()), "Number of thresholds needs to be a single value" ) # thresholds with a grouping factor sdata <- make_standata(y | thres(th, gr) ~ x, dat, cumulative()) expect_equal(sdata$nthres, as.array(c(5, 6))) expect_equal(sdata$ngrthres, 2) expect_equal(unname(sdata$Jthres[1, ]), c(1, 5)) expect_equal(unname(sdata$Jthres[10, ]), c(6, 11)) sdata <- make_standata(y | thres(gr = gr) ~ x, dat, cumulative()) expect_equal(sdata$nthres, as.array(c(4, 3))) expect_equal(sdata$ngrthres, 2) sdata <- make_standata(y | thres(6, gr = gr) ~ x, dat, cumulative()) expect_equal(sdata$nthres, as.array(c(6, 6))) expect_equal(sdata$ngrthres, 2) }) brms/tests/testthat/tests.distributions.R0000644000176200001440000001625113277540752020426 0ustar liggesuserscontext("Tests for distribution functions") test_that("student distribution works correctly", { expect_equal(integrate(dstudent_t, -100, 100, df = 15, mu = 10, sigma = 5)$value, 1) expect_equal(dstudent_t(1, df = 10, mu = 0, sigma = 5), dt(1/5, df = 10)/5) expect_equal(pstudent_t(2, df = 20, mu = 2, sigma = 0.4), pt(0, df = 20)) expect_equal(qstudent_t(0.7, df = 5, mu = 2, sigma = 3), 2 + 3*qt(0.7, df = 5)) expect_equal(length(rstudent_t(10, df = 10, mu = rnorm(10), sigma = 1:10)), 10) }) test_that("multivariate normal and student distributions work correctly", { mu <- rnorm(3) Sigma <- cov(matrix(rnorm(300), ncol = 3)) expect_equal(dmulti_normal(1:3, mu = mu, Sigma = Sigma), mnormt::dmnorm(1:3, mu, Sigma)) expect_equal(dmulti_student_t(1:3, mu = mu, Sigma = Sigma, df = 10, log = TRUE), mnormt::dmt(1:3, df = 10, mean = mu, S = Sigma, log = TRUE)) expect_equal(dim(rmulti_normal(7, mu = mu, Sigma = Sigma)), c(7, 3)) expect_equal(dim(rmulti_student_t(7, mu = mu, Sigma = Sigma, df = 10)), c(7, 3)) # test errors expect_error(dmulti_normal(1:3, mu = rnorm(2), Sigma = Sigma, check = TRUE), "Dimension of mu is incorrect") expect_error(dmulti_normal(1:3, mu = mu, Sigma = Sigma[1:2, 1:2], check = TRUE), "Dimension of Sigma is incorrect") expect_error(dmulti_normal(1:3, mu = mu, Sigma = Sigma[1:3, 3:1], check = TRUE), "Sigma must be a symmetric matrix") expect_error(rmulti_normal(1.5, mu = mu, Sigma = Sigma, check = TRUE), "n must be a positive integer") expect_error(rmulti_normal(10, mu = mu, Sigma = Sigma[1:3, 3:1], check = TRUE), "Sigma must be a symmetric matrix") expect_error(dmulti_student_t(rnorm(3), mu = mu, Sigma = Sigma, df = -1, check = TRUE), "df must be greater than 0") expect_error(dmulti_student_t(rnorm(3), mu = mu, Sigma = Sigma[1:3, 3:1], df = 30, check = TRUE), "Sigma must be a symmetric matrix") expect_error(rmulti_student_t(10, mu = mu, Sigma = Sigma, df = -1, check = TRUE), "df must be greater than 0") }) test_that("von_mises distribution functions run without errors", { n <- 10 res <- dvon_mises(runif(n, -pi, pi), mu = 1, kappa = 1:n) expect_true(length(res) == n) res <- pvon_mises(runif(n, -pi, pi), mu = rnorm(n), kappa = 0:(n-1)) expect_true(length(res) == n) res <- rvon_mises(n, mu = rnorm(n), kappa = 0:(n-1)) expect_true(length(res) == n) }) test_that("skew_normal distribution functions run without errors", { n <- 10 x <- rnorm(n, 10, 3) res <- dskew_normal(x, mu = 1, sigma = 2, alpha = 1) expect_true(length(res) == n) res <- pskew_normal(x, mu = rnorm(n), sigma = 1:n, alpha = 3, log.p = TRUE) expect_true(length(res) == n) res <- qskew_normal(x, mu = rnorm(n), sigma = 1:n, alpha = 3, log.p = TRUE) expect_true(length(res) == n) res <- rskew_normal(n, mu = rnorm(n), sigma = 10, alpha = -4:5) expect_true(length(res) == n) }) test_that("exgaussian distribution functions run without errors", { n <- 10 x <- rnorm(n, 10, 3) res <- dexgaussian(x, mu = 1, sigma = 2, beta = 1) expect_true(length(res) == n) res <- pexgaussian(x, mu = rnorm(n), sigma = 1:n, beta = 3, log.p = TRUE) expect_true(length(res) == n) res <- rexgaussian(n, mu = rnorm(n), sigma = 10, beta = 1:10) expect_true(length(res) == n) }) test_that("frechet distribution functions run without errors", { n <- 10 x <- 21:30 res <- dfrechet(x, loc = 1, scale = 2, shape = 1, log = TRUE) expect_true(length(res) == n) loc <- 1:10 res <- pfrechet(x, loc = loc, scale = 1:n, shape = 3) expect_true(length(res) == n) q <- qfrechet(res, loc = loc, scale = 1:n, shape = 3) expect_equal(x, q) res <- rfrechet(n, loc = loc, scale = 10, shape = 1:10) expect_true(length(res) == n) }) test_that("inv_gaussian distribution functions run without errors", { n <- 10 x <- rgamma(n, 10, 3) res <- dinv_gaussian(x, mu = 1, shape = 1) expect_true(length(res) == n) res <- pinv_gaussian(x, mu = abs(rnorm(n)), shape = 3) expect_true(length(res) == n) res <- rinv_gaussian(n, mu = abs(rnorm(n)), shape = 1:10) expect_true(length(res) == n) }) test_that("gen_extreme_value distribution functions run without errors", { n <- 10 x <- rgamma(n, 10, 3) res <- dgen_extreme_value(x, mu = 1, sigma = 2, xi = 1) expect_true(length(res) == n) res <- pgen_extreme_value(x, mu = rnorm(n), sigma = 1:n, xi = 3) expect_true(length(res) == n) res <- rgen_extreme_value(n, mu = rnorm(n), sigma = 10, xi = 1:10) expect_true(length(res) == n) }) test_that("asym_laplace distribution functions run without errors", { n <- 10 x <- rnorm(n, 10, 3) res <- dasym_laplace(x, mu = 1, sigma = 2, quantile = 0.5) expect_true(length(res) == n) res <- pasym_laplace(x, mu = rnorm(n), sigma = 1:n, quantile = 0.3) expect_true(length(res) == n) res <- rasym_laplace(n, mu = rnorm(n), sigma = 10, quantile = runif(n, 0, 1)) expect_true(length(res) == n) }) test_that("zero-inflated distribution functions run without errors", { n <- 10 x <- rpois(n, lambda = 1) res <- dzero_inflated_poisson(x, lambda = 1, zi = 0.1) expect_true(length(res) == n) res <- pzero_inflated_poisson(x, lambda = 1, zi = 0.1) expect_true(length(res) == n) res <- dzero_inflated_negbinomial(x, mu = 2, shape = 5, zi = 0.1) expect_true(length(res) == n) res <- pzero_inflated_negbinomial(x, mu = 2, shape = 5, zi = 0.1) expect_true(length(res) == n) res <- dzero_inflated_binomial(x, size = c(2, 10), prob = 0.4, zi = 0.1) expect_true(length(res) == n) res <- pzero_inflated_binomial(x, size = c(2, 10), prob = 0.4, zi = 0.1) expect_true(length(res) == n) x <- c(rbeta(n - 2, shape1 = 2, shape2 = 3), 0, 0) res <- dzero_inflated_beta(x, shape1 = 2, shape2 = 3, zi = 0.1) expect_true(length(res) == n) res <- pzero_inflated_beta(x, shape1 = 2, shape2 = 3, zi = 0.1) expect_true(length(res) == n) }) test_that("hurdle distribution functions run without errors", { n <- 10 x <- rpois(n, lambda = 1) res <- dhurdle_poisson(x, lambda = 1, hu = 0.1) expect_true(length(res) == n) res <- phurdle_poisson(x, lambda = 1, hu = 0.1) expect_true(length(res) == n) res <- dhurdle_negbinomial(x, mu = 2, shape = 5, hu = 0.1) expect_true(length(res) == n) res <- phurdle_negbinomial(x, mu = 2, shape = 5, hu = 0.1) expect_true(length(res) == n) res <- dhurdle_gamma(x, shape = 1, scale = 3, hu = 0.1) expect_true(length(res) == n) res <- phurdle_gamma(x, shape = 1, scale = 3, hu = 0.1) expect_true(length(res) == n) res <- dhurdle_lognormal(x, mu = 2, sigma = 5, hu = 0.1) expect_true(length(res) == n) res <- phurdle_lognormal(x, mu = 2, sigma = 5, hu = 0.1) expect_true(length(res) == n) }) brms/tests/testthat/tests.posterior_predict.R0000644000176200001440000003237013611527526021260 0ustar liggesuserscontext("Tests for posterior_predict helper functions") test_that("posterior_predict for location shift models runs without errors", { ns <- 30 nobs <- 10 draws <- structure(list(nsamples = ns), class = "brmsdraws") draws$dpars <- list( mu = matrix(rnorm(ns * nobs), ncol = nobs), sigma = rchisq(ns, 3), nu = rgamma(ns, 4) ) i <- sample(nobs, 1) pred <- brms:::posterior_predict_gaussian(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_student(i, draws = draws) expect_equal(length(pred), ns) }) test_that("posterior_predict for various skewed models runs without errors", { ns <- 50 nobs <- 2 draws <- structure(list(nsamples = ns), class = "brmsdraws") draws$dpars <- list( sigma = rchisq(ns, 3), beta = rchisq(ns, 3), mu = matrix(rnorm(ns * nobs), ncol = nobs), alpha = rnorm(ns), ndt = 1 ) pred <- brms:::posterior_predict_lognormal(1, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_shifted_lognormal(1, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_exgaussian(1, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_skew_normal(1, draws = draws) expect_equal(length(pred), ns) }) test_that("posterior_predict for aysm_laplace models runs without errors", { ns <- 50 draws <- structure(list(nsamples = ns), class = "brmsdraws") draws$dpars <- list( sigma = rchisq(ns, 3), quantile = rbeta(ns, 2, 1), mu = matrix(rnorm(ns*2), ncol = 2), zi = rbeta(ns, 10, 10) ) pred <- brms:::posterior_predict_asym_laplace(1, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_zero_inflated_asym_laplace(1, draws = draws) expect_equal(length(pred), ns) }) test_that("posterior_predict for multivariate linear models runs without errors", { ns <- 10 nvars <- 3 ncols <- 4 nobs <- nvars * ncols Sigma = array(cov(matrix(rnorm(300), ncol = 3)), dim = c(3, 3, 10)) draws <- structure(list(nsamples = ns), class = "mvbrmsdraws") draws$mvpars <- list( Mu = array(rnorm(ns*nobs*nvars), dim = c(ns, nobs, nvars)), Sigma = aperm(Sigma, c(3, 1, 2)) ) draws$dpars <- list(nu = rgamma(ns, 5)) draws$data <- list(N = nobs, N_trait = ncols) pred <- brms:::posterior_predict_gaussian_mv(1, draws = draws) expect_equal(dim(pred), c(ns, nvars)) pred <- brms:::posterior_predict_student_mv(2, draws = draws) expect_equal(dim(pred), c(ns, nvars)) }) test_that("posterior_predict for ARMA covariance models runs without errors", { ns <- 20 nobs <- 15 draws <- structure(list(nsamples = ns), class = "brmsdraws") draws$dpars <- list( mu = matrix(rnorm(ns*nobs), ncol = nobs), sigma = rchisq(ns, 3), nu = rgamma(ns, 5) ) draws$ac <- list( ar = matrix(rbeta(ns, 0.5, 0.5), ncol = 1), ma = matrix(rnorm(ns, 0.2, 1), ncol = 1), begin_tg = c(1, 5, 12), end_tg = c(4, 11, 15) ) draws$data <- list(se = rgamma(ns, 10)) draws$family$fun <- "gaussian_time" pred <- brms:::posterior_predict_gaussian_time(1, draws = draws) expect_equal(length(pred), ns * 4) draws$family$fun <- "student_time" pred <- brms:::posterior_predict_student_time(2, draws = draws) expect_equal(length(pred), ns * 7) }) test_that("loglik for SAR models runs without errors", { ns = 3 draws <- structure(list(nsamples = ns, nobs = 10), class = "brmsdraws") draws$dpars <- list( mu = matrix(rnorm(30), nrow = ns), nu = rep(2, ns), sigma = rep(10, ns) ) draws$ac <- list(lagsar = matrix(c(0.3, 0.5, 0.7)), Msar = diag(10)) pred <- brms:::posterior_predict_gaussian_lagsar(1, draws = draws) expect_equal(dim(pred), c(3, 10)) pred <- brms:::posterior_predict_student_lagsar(1, draws = draws) expect_equal(dim(pred), c(3, 10)) draws$ac$errorsar <- draws$ac$lagsar draws$ac$lagsar <- NULL pred <- brms:::posterior_predict_gaussian_errorsar(1, draws = draws) expect_equal(dim(pred), c(3, 10)) pred <- brms:::posterior_predict_student_errorsar(1, draws = draws) expect_equal(dim(pred), c(3, 10)) }) test_that("posterior_predict for FCOR models runs without errors", { ns <- 3 nobs <- 10 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu = matrix(rnorm(nobs * ns), nrow = ns), sigma = rep(1, ns), nu = rep(2, ns) ) draws$ac <- list(Mfcor = diag(nobs)) pred <- brms:::posterior_predict_gaussian_fcor(1, draws = draws) expect_equal(dim(pred), c(ns, nobs)) pred <- brms:::posterior_predict_student_fcor(1, draws = draws) expect_equal(dim(pred), c(ns, nobs)) }) test_that("posterior_predict for count and survival models runs without errors", { ns <- 25 nobs <- 10 trials <- sample(10:30, nobs, replace = TRUE) draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( eta = matrix(rnorm(ns*nobs), ncol = nobs), shape = rgamma(ns, 4), xi = 0 ) draws$dpars$nu <- draws$dpars$sigma <- draws$dpars$shape + 1 draws$data <- list(trials = trials) i <- sample(nobs, 1) draws$dpars$mu <- brms:::inv_cloglog(draws$dpars$eta) pred <- brms:::posterior_predict_binomial(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_discrete_weibull(i, draws = draws) expect_equal(length(pred), ns) draws$dpars$mu <- exp(draws$dpars$eta) pred <- brms:::posterior_predict_poisson(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_negbinomial(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_geometric(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_com_poisson(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_exponential(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_gamma(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_frechet(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_inverse.gaussian(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_gen_extreme_value(i, draws = draws) expect_equal(length(pred), ns) draws$family$link <- "log" pred <- brms:::posterior_predict_weibull(i, draws = draws) expect_equal(length(pred), ns) }) test_that("posterior_predict for bernoulli and beta models works correctly", { ns <- 17 nobs <- 10 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu = brms:::inv_logit(matrix(rnorm(ns * nobs * 2), ncol = 2 * nobs)), phi = rgamma(ns, 4) ) i <- sample(1:nobs, 1) pred <- brms:::posterior_predict_bernoulli(i, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_beta(i, draws = draws) expect_equal(length(pred), ns) }) test_that("posterior_predict for circular models runs without errors", { ns <- 15 nobs <- 10 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu = 2 * atan(matrix(rnorm(ns * nobs * 2), ncol = nobs * 2)), kappa = rgamma(ns, 4) ) i <- sample(seq_len(nobs), 1) pred <- brms:::posterior_predict_von_mises(i, draws = draws) expect_equal(length(pred), ns) }) test_that("posterior_predict for zero-inflated and hurdle models runs without erros", { ns <- 50 nobs <- 8 trials <- sample(10:30, nobs, replace = TRUE) draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( eta = matrix(rnorm(ns * nobs * 2), ncol = nobs * 2), shape = rgamma(ns, 4), phi = rgamma(ns, 1), zi = rbeta(ns, 1, 1), coi = rbeta(ns, 5, 7) ) draws$dpars$hu <- draws$dpars$zoi <- draws$dpars$zi draws$data <- list(trials = trials) draws$dpars$mu <- exp(draws$dpars$eta) pred <- brms:::posterior_predict_hurdle_poisson(1, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_hurdle_negbinomial(2, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_hurdle_gamma(5, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_zero_inflated_poisson(3, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_zero_inflated_negbinomial(6, draws = draws) expect_equal(length(pred), ns) draws$dpars$mu <- brms:::inv_logit(draws$dpars$eta) pred <- brms:::posterior_predict_zero_inflated_binomial(4, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_zero_inflated_beta(8, draws = draws) expect_equal(length(pred), ns) pred <- brms:::posterior_predict_zero_one_inflated_beta(7, draws = draws) expect_equal(length(pred), ns) }) test_that("posterior_predict for ordinal models runs without erros", { ns <- 50 nobs <- 8 nthres <- 3 ncat <- nthres + 1 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu = array(rnorm(ns * nobs), dim = c(ns, nobs)), disc = rexp(ns) ) draws$thres$thres <- array(0, dim = c(ns, nthres)) draws$data <- list(Y = rep(1:ncat, 2), ncat = ncat) draws$family$link <- "logit" draws$family$family <- "cumulative" pred <- sapply(1:nobs, brms:::posterior_predict_cumulative, draws = draws) expect_equal(dim(pred), c(ns, nobs)) draws$family$family <- "sratio" pred <- sapply(1:nobs, brms:::posterior_predict_sratio, draws = draws) expect_equal(dim(pred), c(ns, nobs)) draws$family$family <- "cratio" pred <- sapply(1:nobs, brms:::posterior_predict_cratio, draws = draws) expect_equal(dim(pred), c(ns, nobs)) draws$family$family <- "acat" pred <- sapply(1:nobs, brms:::posterior_predict_acat, draws = draws) expect_equal(dim(pred), c(ns, nobs)) draws$family$link <- "probit" pred <- sapply(1:nobs, brms:::posterior_predict_acat, draws = draws) expect_equal(dim(pred), c(ns, nobs)) }) test_that("posterior_predict for categorical and related models runs without erros", { ns <- 50 nobs <- 8 ncat <- 3 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu1 = array(rnorm(ns*nobs, 0, 0.1), dim = c(ns, nobs)), mu2 = array(rnorm(ns*nobs, 0, 0.1), dim = c(ns, nobs)) ) draws$data <- list(Y = rep(1:ncat, 2), ncat = ncat) draws$family <- categorical() pred <- sapply(1:nobs, brms:::posterior_predict_categorical, draws = draws) expect_equal(dim(pred), c(ns, nobs)) draws$data$trials <- sample(1:20, nobs) draws$family <- multinomial() pred <- brms:::posterior_predict_multinomial(i = sample(1:nobs, 1), draws = draws) expect_equal(dim(pred), c(ns, ncat)) draws$dpars$phi <- rexp(ns, 1) draws$family <- dirichlet() pred <- brms:::posterior_predict_dirichlet(i = sample(1:nobs, 1), draws = draws) expect_equal(dim(pred), c(ns, ncat)) expect_equal(rowSums(pred), rep(1, nrow(pred))) }) test_that("truncated posterior_predict run without errors", { ns <- 30 nobs <- 15 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu = matrix(rnorm(ns * nobs), ncol = nobs), sigma = rchisq(ns, 3) ) draws$data <- list(lb = sample(-(4:7), nobs, TRUE)) pred <- sapply(1:nobs, brms:::posterior_predict_gaussian, draws = draws) expect_equal(dim(pred), c(ns, nobs)) draws$dpars$mu <- exp(draws$dpars$mu) draws$data <- list(ub = sample(70:80, nobs, TRUE)) pred <- sapply(1:nobs, brms:::posterior_predict_poisson, draws = draws) expect_equal(dim(pred), c(ns, nobs)) draws$data <- list(lb = rep(0, nobs), ub = sample(70:75, nobs, TRUE)) pred <- sapply(1:nobs, brms:::posterior_predict_poisson, draws = draws) expect_equal(dim(pred), c(ns, nobs)) }) test_that("posterior_predict for the wiener diffusion model runs without errors", { skip("skip as long as RWiener fails on R-devel for 3.6.0") ns <- 5 nobs <- 3 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu = matrix(rnorm(ns * nobs), ncol = nobs), bs = rchisq(ns, 3), ndt = rep(0.5, ns), bias = rbeta(ns, 1, 1) ) draws$data <- list(Y = abs(rnorm(ns)) + 0.5, dec = c(1, 0, 1)) i <- sample(1:nobs, 1) expect_equal(nrow(brms:::posterior_predict_wiener(i, draws)), ns) }) test_that("posterior_predict_custom runs without errors", { ns <- 15 nobs <- 10 draws <- structure(list(nsamples = ns, nobs = nobs), class = "brmsdraws") draws$dpars <- list( mu = matrix(rbeta(ns * nobs * 2, 1, 1), ncol = nobs * 2) ) draws$data <- list(trials = rep(1, nobs)) draws$family <- custom_family( "beta_binomial2", dpars = c("mu", "tau"), links = c("logit", "log"), lb = c(NA, 0), type = "int", vars = "trials[n]" ) posterior_predict_beta_binomial2 <- function(i, draws) { mu <- draws$dpars$mu[, i] rbinom(draws$nsamples, size = draws$data$trials[i], prob = mu) } expect_equal(length(brms:::posterior_predict_custom(sample(1:nobs, 1), draws)), ns) }) brms/tests/testthat/tests.brm.R0000644000176200001440000000601713611527526016277 0ustar liggesusers# calling context() avoids a strange bug in testthat 2.0.0 # cannot actually run brms models in tests as it takes way too long context("Tests for brms error messages") test_that("brm produces expected errors", { dat <- data.frame(y = rnorm(10), x = rnorm(10), g = rep(1:5, 2)) # formula parsing expect_error(brm(~ x + (1|g), dat, file = "test"), "Response variable is missing") expect_error(brm(bf(y ~ a, nl = TRUE)), "No non-linear parameters specified") expect_error(brm(bf(y | se(sei) ~ x, sigma ~ x), dat), "Cannot predict or fix 'sigma' in this model") expect_error(brm(y | se(sei) ~ x, dat, family = weibull()), "Argument 'se' is not supported for family") expect_error(brm(y | se(sei) + se(sei2) ~ x, dat, family = gaussian()), "Each addition argument may only be defined once") expect_error(brm(y | abc(sei) ~ x, family = gaussian()), "The following addition terms are invalid:\n'abc(sei)'", fixed = TRUE) expect_error(brm(y | disp(sei) ~ x, dat, family = gaussian()), "The following addition terms are invalid:") expect_error(brm(bf(y ~ x, shape ~ x), family = gaussian()), "The parameter 'shape' is not a valid distributional") expect_error(brm(y ~ x + (1|abc|g/x), dat), "Can only combine group-level terms") expect_error(brm(y ~ x + (1|g) + (x|g), dat), "Duplicated group-level effects are not allowed") expect_error(brm(y~mo(g)*t2(x), dat), fixed = TRUE, "The term 'mo(g):t2(x)' is invalid") expect_error(brm(y~x*cs(g), dat), fixed = TRUE, "The term 'x:cs(g)' is invalid") expect_error(brm(y~me(x, 2 * g)*me(x, g), dat), "Variable 'x' is used in different calls to 'me'") # autocorrelation expect_error(brm(y ~ ar(x+y, g), dat), "Cannot coerce 'x \\+ y' to a single variable name") expect_error(brm(y ~ ar(gr = g1/g2), dat), "Illegal grouping term 'g1/g2'") expect_error(brm(y ~ ma(x), dat, poisson()), "Please set cov = TRUE") # ordinal models expect_error(brm(rating ~ treat + (cs(period)|subject), data = inhaler, family = categorical()), "Category specific effects require families") # families and links expect_error(brm(y ~ x, dat, family = gaussian("logit")), "'logit' is not a supported link for family 'gaussian'") expect_error(brm(y ~ x, dat, family = poisson("inverse")), "'inverse' is not a supported link for family 'poisson'") expect_error(brm(y ~ x, dat, family = c("weibull", "sqrt")), "'sqrt' is not a supported link for family 'weibull'") expect_error(brm(y ~ x, dat, family = c("categorical", "probit")), "'probit' is not a supported link for family 'categorical'") expect_error(brm(y ~ x, dat, family = "ordinal"), "ordinal is not a supported family") }) brms/tests/testthat/tests.brmsfit-methods.R0000644000176200001440000007600213617520155020624 0ustar liggesuserscontext("Tests for brmsfit methods") expect_range <- function(object, lower = -Inf, upper = Inf, ...) { testthat::expect_true(all(object >= lower & object <= upper), ...) } expect_ggplot <- function(object, ...) { testthat::expect_true(is(object, "ggplot"), ...) } SM <- suppressMessages SW <- suppressWarnings fit1 <- brms:::rename_pars(brms:::brmsfit_example1) fit2 <- brms:::rename_pars(brms:::brmsfit_example2) fit3 <- brms:::rename_pars(brms:::brmsfit_example3) fit4 <- brms:::rename_pars(brms:::brmsfit_example4) fit5 <- brms:::rename_pars(brms:::brmsfit_example5) fit6 <- brms:::rename_pars(brms:::brmsfit_example6) # test S3 methods in alphabetical order test_that("as.data.frame has reasonable ouputs", { ps <- as.data.frame(fit1) expect_true(is(ps, "data.frame")) expect_equal(dim(ps), c(nsamples(fit1), length(parnames(fit1)))) }) test_that("as.matrix has reasonable ouputs", { ps <- as.matrix(fit1) expect_true(is(ps, "matrix")) expect_equal(dim(ps), c(nsamples(fit1), length(parnames(fit1)))) }) test_that("as.array has reasonable ouputs", { ps <- as.array(fit1) expect_true(is.array(ps)) chains <- fit1$fit@sim$chains ps_dim <- c(nsamples(fit1) / chains, chains, length(parnames(fit1))) expect_equal(dim(ps), ps_dim) }) test_that("as.mcmc has reasonable ouputs", { chains <- fit1$fit@sim$chains mc <- as.mcmc(fit1) expect_equal(length(mc), chains) expect_equal(dim(mc[[1]]), c(nsamples(fit1) / chains, length(parnames(fit1)))) mc <- as.mcmc(fit1, combine_chains = TRUE) expect_equal(dim(mc), c(nsamples(fit1), length(parnames(fit1)))) # test assumes thin = 1 expect_equal(dim(as.mcmc(fit1, inc_warmup = TRUE)[[1]]), c(fit1$fit@sim$iter, length(parnames(fit1)))) }) test_that("autocor has reasonable ouputs", { expect_true(is.null(SW(autocor(fit1)))) expect_true(is.null(SW(autocor(fit6, resp = "count")))) }) test_that("bayes_R2 has reasonable ouputs", { fit1 <- add_criterion(fit1, "bayes_R2") R2 <- bayes_R2(fit1, summary = FALSE) expect_equal(dim(R2), c(nsamples(fit1), 1)) R2 <- bayes_R2(fit2, newdata = model.frame(fit2)[1:5, ], re_formula = NA) expect_equal(dim(R2), c(1, 4)) R2 <- bayes_R2(fit6) expect_equal(dim(R2), c(2, 4)) }) test_that("bayes_factor has reasonable ouputs", { # don't test for now as it requires calling Stan's C++ code }) test_that("bridge_sampler has reasonable ouputs", { # don't test for now as it requires calling Stan's C++ code }) test_that("coef has reasonable ouputs", { coef1 <- SM(coef(fit1)) expect_equal(dim(coef1$visit), c(4, 4, 8)) coef1 <- SM(coef(fit1, summary = FALSE)) expect_equal(dim(coef1$visit), c(nsamples(fit1), 4, 8)) coef2 <- SM(coef(fit2)) expect_equal(dim(coef2$patient), c(59, 4, 4)) coef4 <- SM(coef(fit4)) expect_equal(dim(coef4$subject), c(10, 4, 8)) }) test_that("combine_models has reasonable ouputs", { expect_equal(nsamples(combine_models(fit1, fit1)), nsamples(fit1) * 2) }) test_that("conditional_effects has reasonable ouputs", { me <- conditional_effects(fit1, resp = "count") expect_equal(nrow(me[[2]]), 100) meplot <- plot(me, points = TRUE, rug = TRUE, ask = FALSE, plot = FALSE) expect_ggplot(meplot[[1]]) me <- conditional_effects(fit1, "Trt", select_points = 0.1) expect_lt(nrow(attr(me[[1]], "points")), nobs(fit1)) me <- conditional_effects(fit1, "Exp:Age", surface = TRUE, resolution = 15, too_far = 0.2) meplot <- plot(me, plot = FALSE) expect_ggplot(meplot[[1]]) meplot <- plot(me, stype = "raster", plot = FALSE) expect_ggplot(meplot[[1]]) me <- conditional_effects(fit1, "Age", spaghetti = TRUE, nsamples = 10) expect_equal(nrow(attr(me$Age, "spaghetti")), 1000) meplot <- plot(me, plot = FALSE) expect_ggplot(meplot[[1]]) expect_error( conditional_effects(fit1, "Age", spaghetti = TRUE, surface = TRUE), "Cannot use 'spaghetti' and 'surface' at the same time" ) mdata = data.frame( Age = c(-0.3, 0, 0.3), count = c(10, 20, 30), Exp = c(1, 3, 5) ) exp_nrow <- nrow(mdata) * 100 me <- conditional_effects(fit1, effects = "Age", conditions = mdata) expect_equal(nrow(me[[1]]), exp_nrow) mdata$visit <- 1:3 me <- conditional_effects(fit1, re_formula = NULL, conditions = mdata) expect_equal(nrow(me$Age), exp_nrow) me <- conditional_effects( fit1, "Age:Trt", int_conditions = list(Age = rnorm(5)) ) expect_equal(nrow(me[[1]]), 200) me <- conditional_effects( fit1, "Age:Trt", int_conditions = list(Age = quantile) ) expect_equal(nrow(me[[1]]), 200) expect_error(conditional_effects(fit1, effects = "Trtc"), "All specified effects are invalid for this model") expect_warning(conditional_effects(fit1, effects = c("Trtc", "Trt")), "Some specified effects are invalid for this model") expect_error(conditional_effects(fit1, effects = "Trtc:a:b"), "please use the 'conditions' argument") mdata$visit <- NULL mdata$patient <- 1 expect_equal(nrow(conditional_effects(fit2)[[2]]), 100) me <- conditional_effects(fit2, re_formula = NULL, conditions = mdata) expect_equal(nrow(me$Age), exp_nrow) expect_warning( me4 <- conditional_effects(fit4), "Predictions are treated as continuous variables" ) expect_true(is(me4, "brms_conditional_effects")) me4 <- conditional_effects(fit4, "x2", categorical = TRUE) expect_true(is(me4, "brms_conditional_effects")) me5 <- conditional_effects(fit5) expect_true(is(me5, "brms_conditional_effects")) me6 <- conditional_effects(fit6, nsamples = 40) expect_true(is(me6, "brms_conditional_effects")) }) test_that("plot of conditional_effects has reasonable outputs", { ggplot2::theme_set(theme_black()) N <- 90 marg_results <- data.frame( effect1__ = rpois(N, 20), effect2__ = factor(rep(1:3, each = N / 3)), estimate__ = rnorm(N, sd = 5), se__ = rt(N, df = 10), cond__ = rep(1:2, each = N / 2), cats__ = factor(rep(1:3, each = N / 3)) ) marg_results[["lower__"]] <- marg_results$estimate__ - 2 marg_results[["upper__"]] <- marg_results$estimate__ + 2 marg_results <- list(marg_results[order(marg_results$effect1__), ]) class(marg_results) <- "brmsMarginalEffects" attr(marg_results[[1]], "response") <- "count" # test with 1 numeric predictor attr(marg_results[[1]], "effects") <- "P1" marg_plot <- plot(marg_results, plot = FALSE) expect_ggplot(marg_plot[[1]]) # test with 1 categorical predictor attr(marg_results[[1]], "effects") <- "P2" marg_plot <- plot(marg_results, plot = FALSE) expect_ggplot(marg_plot[[1]]) # test with 1 numeric and 1 categorical predictor attr(marg_results[[1]], "effects") <- c("P1", "P2") marg_plot <- plot(marg_results, plot = FALSE) expect_ggplot(marg_plot[[1]]) # test ordinal raster plot attr(marg_results[[1]], "effects") <- c("P1", "cats__") attr(marg_results[[1]], "ordinal") <- TRUE marg_plot <- plot(marg_results, plot = FALSE) expect_ggplot(marg_plot[[1]]) }) test_that("conditional_smooths has reasonable ouputs", { ms <- conditional_smooths(fit1) expect_equal(nrow(ms[[1]]), 100) expect_true(is(ms, "brms_conditional_effects")) ms <- conditional_smooths(fit1, spaghetti = TRUE, nsamples = 10) expect_equal(nrow(attr(ms[[1]], "spaghetti")), 1000) expect_error(conditional_smooths(fit1, smooths = "s3"), "No valid smooth terms found in the model") expect_error(conditional_smooths(fit2), "No valid smooth terms found in the model") }) test_that("family has reasonable ouputs", { expect_is(family(fit1), "brmsfamily") expect_is(family(fit6, resp = "count"), "brmsfamily") expect_output(print(family(fit1), links = TRUE), "student.*log.*logm1") expect_output(print(family(fit5)), "Mixture.*gaussian.*exponential") }) test_that("fitted has reasonable outputs", { skip_on_cran() fi <- fitted(fit1) expect_equal(dim(fi), c(nobs(fit1), 4)) expect_equal(colnames(fi), c("Estimate", "Est.Error", "Q2.5", "Q97.5")) newdata <- data.frame( Age = c(0, -0.2), visit = c(1, 4), Trt = c(0, 1), count = c(20, 13), patient = c(1, 42), Exp = c(2, 4) ) fi <- fitted(fit1, newdata = newdata) expect_equal(dim(fi), c(2, 4)) newdata$visit <- c(1, 6) fi <- fitted(fit1, newdata = newdata, allow_new_levels = TRUE) expect_equal(dim(fi), c(2, 4)) # fitted values with new_levels newdata <- data.frame( Age = 0, visit = paste0("a", 1:100), Trt = 0, count = 20, patient = 1, Exp = 2 ) fi <- fitted(fit1, newdata = newdata, allow_new_levels = TRUE, sample_new_levels = "old_levels", nsamples = 10) expect_equal(dim(fi), c(100, 4)) fi <- fitted(fit1, newdata = newdata, allow_new_levels = TRUE, sample_new_levels = "gaussian", nsamples = 1) expect_equal(dim(fi), c(100, 4)) # fitted values of auxiliary parameters newdata <- data.frame( Age = 0, visit = c("a", "b"), Trt = 0, count = 20, patient = 1, Exp = 2 ) fi <- fitted(fit1, dpar = "sigma") expect_equal(dim(fi), c(nobs(fit1), 4)) expect_true(all(fi > 0)) fi_lin <- fitted(fit1, dpar = "sigma", scale = "linear") expect_equal(dim(fi_lin), c(nobs(fit1), 4)) expect_true(!isTRUE(all.equal(fi, fi_lin))) expect_error(fitted(fit1, dpar = "inv"), "Invalid argument 'dpar'") fi <- fitted(fit2) expect_equal(dim(fi), c(nobs(fit2), 4)) fi <- fitted(fit2, newdata = newdata, allow_new_levels = TRUE) expect_equal(dim(fi), c(2, 4)) fi <- fitted(fit2, dpar = "shape") expect_equal(dim(fi), c(nobs(fit2), 4)) expect_equal(fi[1, ], fi[2, ]) fi <- fitted(fit2, nlpar = "a") expect_equal(dim(fi), c(nobs(fit2), 4)) fi <- fitted(fit3, newdata = fit3$data[1:10, ]) expect_equal(dim(fi), c(10, 4)) fi <- fitted(fit4) expect_equal(dim(fi), c(nobs(fit4), 4, 4)) fi <- fitted(fit4, newdata = fit4$data[1, ]) expect_equal(dim(fi), c(1, 4, 4)) fi <- fitted(fit4, newdata = fit4$data[1, ], scale = "linear") expect_equal(dim(fi), c(1, 4, 3)) fi <- fitted(fit5) expect_equal(dim(fi), c(nobs(fit5), 4)) fi <- fitted(fit6) expect_equal(dim(fi), c(nobs(fit6), 4, 2)) expect_equal(dimnames(fi)[[3]], c("volume", "count")) }) test_that("fixef has reasonable ouputs", { fixef1 <- SM(fixef(fit1)) expect_equal(rownames(fixef1), c("Intercept", "sigma_Intercept", "Trt1", "Age", "Trt1:Age", "sigma_Trt1", "sAge_1", "moExp") ) fixef1 <- SM(fixef(fit1, pars = c("Age", "sAge_1"))) expect_equal(rownames(fixef1), c("Age", "sAge_1")) }) test_that("formula has reasonable ouputs", { expect_true(is.brmsformula(formula(fit1))) }) test_that("hypothesis has reasonable ouputs", { hyp <- hypothesis(fit1, c("Age > Trt1", "Trt1:Age = -1")) expect_equal(dim(hyp$hypothesis), c(2, 8)) expect_output(print(hyp), "(Age)-(Trt1) > 0", fixed = TRUE) expect_ggplot(plot(hyp, plot = FALSE)[[1]]) hyp <- hypothesis(fit1, "Intercept = 0", class = "sd", group = "visit") expect_true(is.numeric(hyp$hypothesis$Evid.Ratio[1])) expect_output(print(hyp), "class sd_visit:", fixed = TRUE) expect_ggplot(plot(hyp, ignore_prior = TRUE, plot = FALSE)[[1]]) hyp <- hypothesis(fit1, "0 > r_visit[4,Intercept]", class = "", alpha = 0.01) expect_equal(dim(hyp$hypothesis), c(1, 8)) expect_output(print(hyp, chars = NULL), "r_visit[4,Intercept]", fixed = TRUE) expect_output(print(hyp), "99%-CI", fixed = TRUE) hyp <- hypothesis( fit1, c("Intercept = 0", "Intercept + exp(Trt1) = 0"), group = "visit", scope = "coef" ) expect_equal(dim(hyp$hypothesis), c(8, 9)) expect_equal(hyp$hypothesis$Group[1], factor(1, levels = 1:4)) expect_error(hypothesis(fit1, "Intercept > x"), fixed = TRUE, "cannot be found in the model: \n'b_x'") expect_error(hypothesis(fit1, 1), "Argument 'hypothesis' must be a character vector") expect_error(hypothesis(fit2, "b_Age = 0", alpha = 2), "Argument 'alpha' must be a single value in [0,1]", fixed = TRUE) expect_error(hypothesis(fit3, "b_Age x 0"), "Every hypothesis must be of the form 'left (= OR < OR >) right'", fixed = TRUE) # test hypothesis.default method hyp <- hypothesis(as.data.frame(fit3), "bsp_meAgeAgeSD > sigma") expect_equal(dim(hyp$hypothesis), c(1, 8)) hyp <- hypothesis(fit3$fit, "bsp_meAgeAgeSD > sigma") expect_equal(dim(hyp$hypothesis), c(1, 8)) }) test_that("launch_shinystan has reasonable ouputs", { # requires running shiny which is not reasonable in automated tests }) test_that("log_lik has reasonable ouputs", { expect_equal(dim(log_lik(fit1)), c(nsamples(fit1), nobs(fit1))) expect_equal(dim(logLik(fit1)), c(nsamples(fit1), nobs(fit1))) expect_equal(dim(log_lik(fit2)), c(nsamples(fit2), nobs(fit2))) }) test_that("loo has reasonable outputs", { skip_on_cran() loo1 <- SW(LOO(fit1, cores = 1)) expect_true(is.numeric(loo1$estimates)) expect_output(print(loo1), "looic") loo_compare1 <- SW(loo(fit1, fit1, cores = 1)) expect_equal(names(loo_compare1$loos), c("fit1", "fit1")) expect_equal(dim(loo_compare1$ic_diffs__), c(1, 2)) expect_output(print(loo_compare1), "'fit1':") expect_is(loo_compare1$diffs, "compare.loo") loo2 <- SW(loo(fit2, cores = 1)) expect_true(is.numeric(loo2$estimates)) loo3 <- SW(loo(fit3, cores = 1)) expect_true(is.numeric(loo3$estimates)) loo3 <- SW(loo(fit3, pointwise = TRUE, cores = 1)) expect_true(is.numeric(loo3$estimates)) loo4 <- SW(loo(fit4, cores = 1)) expect_true(is.numeric(loo4$estimates)) # fails because of too small effective sample size # loo5 <- SW(loo(fit5, cores = 1)) # expect_true(is.numeric(loo5$estimates)) loo6_1 <- SW(loo(fit6, cores = 1)) expect_true(is.numeric(loo6_1$estimates)) loo6_2 <- SW(loo(fit6, cores = 1, newdata = fit6$data)) expect_true(is.numeric(loo6_2$estimates)) loo_compare <- loo_compare(loo6_1, loo6_2) expect_range(loo_compare[2, 1], -1, 1) }) test_that("loo_subsample has reasonable outputs", { skip_on_cran() loo2 <- SW(loo_subsample(fit2, observations = 50)) expect_true(is.numeric(loo2$estimates)) expect_equal(nrow(loo2$pointwise), 50) expect_output(print(loo2), "looic") }) test_that("loo_R2 has reasonable outputs", { skip_on_cran() R2 <- SW(loo_R2(fit1)) expect_equal(length(R2), 1) # fails on travis for some strange reason # R2 <- SW(loo_R2(fit6)) # expect_equal(length(R2), 2) }) test_that("loo_linpred has reasonable outputs", { skip_on_cran() llp <- SW(loo_linpred(fit1)) expect_equal(length(llp), nobs(fit1)) expect_error(loo_linpred(fit4), "Method 'loo_linpred'") llp <- SW(loo_linpred(fit2, scale = "response", type = "var")) expect_equal(length(llp), nobs(fit2)) }) test_that("loo_predict has reasonable outputs", { skip_on_cran() llp <- SW(loo_predict(fit1)) expect_equal(length(llp), nobs(fit1)) newdata <- data.frame( Age = 0, visit = c("a", "b"), Trt = 0, count = 20, patient = 1, Exp = 2 ) llp <- SW(loo_predict( fit1, newdata = newdata, type = "quantile", probs = c(0.25, 0.75), allow_new_levels = TRUE )) expect_equal(dim(llp), c(2, nrow(newdata))) llp <- SW(loo_predict(fit4)) expect_equal(length(llp), nobs(fit4)) }) test_that("loo_predictive_interval has reasonable outputs", { skip_on_cran() llp <- SW(loo_predictive_interval(fit3)) expect_equal(dim(llp), c(nobs(fit3), 2)) }) test_that("loo_model_weights has reasonable outputs", { skip_on_cran() llw <- SW(loo_model_weights(fit1, fit1)) expect_is(llw[1:2], "numeric") expect_equal(names(llw), c("fit1", "fit1")) }) test_that("model.frame has reasonable ouputs", { expect_equal(model.frame(fit1), fit1$data) }) test_that("model_weights has reasonable ouputs", { mw <- model_weights(fit1, fit1, weights = "waic") expect_equal(mw, setNames(c(0.5, 0.5), c("fit1", "fit1"))) }) test_that("ngrps has reasonable ouputs", { expect_equal(ngrps(fit1), list(visit = 4)) expect_equal(ngrps(fit2), list(patient = 59)) }) test_that("nobs has reasonable ouputs", { expect_equal(nobs(fit1), nrow(epilepsy)) }) test_that("nsamples has reasonable ouputs", { expect_equal(nsamples(fit1), 50) expect_equal(nsamples(fit1, subset = 10:1), 10) expect_equal(nsamples(fit1, incl_warmup = TRUE), 200) }) test_that("pairs has reasonable outputs", { expect_s3_class(SW(pairs(fit1, pars = parnames(fit1)[1:3])), "bayesplot_grid") }) test_that("parnames has reasonable ouputs", { expect_true(all( c("b_Intercept", "bsp_moExp", "ar[1]", "cor_visit__Intercept__Trt1", "nu", "simo_moExp1[2]", "r_visit[4,Trt1]", "s_sAge_1[8]", "prior_sd_visit", "prior_cor_visit", "lp__") %in% parnames(fit1) )) expect_true(all( c("b_a_Intercept", "b_b_Age", "sd_patient__b_Intercept", "cor_patient__a_Intercept__b_Intercept", "r_patient__a[1,Intercept]", "r_patient__b[4,Intercept]", "prior_b_a") %in% parnames(fit2) )) expect_true(all( c("lscale_volume_gpAgeTrt0", "lscale_volume_gpAgeTrt1") %in% parnames(fit6) )) }) test_that("plot has reasonable outputs", { expect_silent(p <- plot(fit1, plot = FALSE)) expect_silent(p <- plot(fit1, pars = "^b", plot = FALSE)) expect_silent(p <- plot(fit1, pars = "^sd", plot = FALSE)) expect_error(plot(fit1, pars = "123"), "No valid parameters selected") }) test_that("post_prob has reasonable ouputs", { # only test error messages for now expect_error(post_prob(fit1, fit2, model_names = "test1"), "Number of model names is not equal to the number of models") }) test_that("posterior_average has reasonable outputs", { pnames <- c("b_Age", "nu") ps <- posterior_average(fit1, fit1, pars = pnames, weights = c(0.3, 0.7)) expect_equal(dim(ps), c(nsamples(fit1), 2)) expect_equal(names(ps), pnames) weights <- rexp(3) ps <- brms:::SW(posterior_average( fit1, fit2, fit3, pars = "nu", weights = rexp(3), missing = 1, nsamples = 10 )) expect_equal(dim(ps), c(10, 1)) expect_equal(names(ps), "nu") }) test_that("posterior_samples has reasonable outputs", { ps <- posterior_samples(fit1) expect_equal(dim(ps), c(nsamples(fit1), length(parnames(fit1)))) expect_equal(names(ps), parnames(fit1)) expect_equal(names(posterior_samples(fit1, pars = "^b_")), c("b_Intercept", "b_sigma_Intercept", "b_Trt1", "b_Age", "b_Trt1:Age", "b_sigma_Trt1")) # test default method ps <- posterior_samples(fit1$fit, "^b_Intercept$") expect_equal(dim(ps), c(nsamples(fit1), 1)) }) test_that("posterior_summary has reasonable outputs", { ps <- posterior_summary(fit1, "^b_") expect_equal(dim(ps), c(6, 4)) }) test_that("posterior_interval has reasonable outputs", { expect_equal(dim(posterior_interval(fit1)), c(length(parnames(fit1)), 2)) }) test_that("posterior_predict has reasonable outputs", { expect_equal(dim(posterior_predict(fit1)), c(nsamples(fit1), nobs(fit1))) }) test_that("posterior_linpred has reasonable outputs", { expect_equal(dim(posterior_linpred(fit1)), c(nsamples(fit1), nobs(fit1))) }) test_that("pp_average has reasonable outputs", { ppa <- pp_average(fit1, fit1, weights = "waic") expect_equal(dim(ppa), c(nobs(fit1), 4)) ppa <- pp_average(fit1, fit1, weights = c(1, 4)) expect_equal(attr(ppa, "weights"), c(fit1 = 0.2, fit1 = 0.8)) ns <- c(fit1 = nsamples(fit1) / 5, fit1 = 4 * nsamples(fit1) / 5) expect_equal(attr(ppa, "nsamples"), ns) }) test_that("pp_check has reasonable outputs", { expect_ggplot(pp_check(fit1)) expect_ggplot(pp_check(fit1, newdata = fit1$data[1:100, ])) expect_ggplot(pp_check(fit1, "stat", nsamples = 5)) expect_ggplot(pp_check(fit1, "error_binned")) pp <- pp_check(fit1, "ribbon_grouped", group = "visit", x = "Age") expect_ggplot(pp) pp <- pp_check(fit1, type = "violin_grouped", group = "visit", newdata = fit1$data[1:100, ]) expect_ggplot(pp) pp <- SW(pp_check(fit1, type = "loo_pit", cores = 1)) expect_ggplot(pp) expect_ggplot(pp_check(fit3)) expect_ggplot(pp_check(fit2, "ribbon", x = "Age")) expect_error(pp_check(fit2, "ribbon", x = "x"), "Variable 'x' could not be found in the data") expect_error(pp_check(fit1, "wrong_type")) expect_error(pp_check(fit2, "violin_grouped"), "group") expect_error(pp_check(fit1, "stat_grouped", group = "g"), "Variable 'g' could not be found in the data") expect_ggplot(pp_check(fit4)) expect_ggplot(pp_check(fit5)) expect_error(pp_check(fit4, "error_binned"), "Type 'error_binned' is not available") }) test_that("pp_expect has reasonable outputs", { expect_equal(dim(pp_expect(fit1)), c(nsamples(fit1), nobs(fit1))) }) test_that("pp_mixture has reasonable outputs", { expect_equal(dim(pp_mixture(fit5)), c(nobs(fit5), 4, 2)) expect_error(pp_mixture(fit1), "Method 'pp_mixture' can only be applied to mixture models" ) }) test_that("predict has reasonable outputs", { pred <- predict(fit1) expect_equal(dim(pred), c(nobs(fit1), 4)) expect_equal(colnames(pred), c("Estimate", "Est.Error", "Q2.5", "Q97.5")) pred <- predict(fit1, nsamples = 10, probs = c(0.2, 0.5, 0.8)) expect_equal(dim(pred), c(nobs(fit1), 5)) newdata <- data.frame( Age = c(0, -0.2), visit = c(1, 4), Trt = c(1, 0), count = c(2, 10), patient = c(1, 42), Exp = c(1, 2) ) pred <- predict(fit1, newdata = newdata) expect_equal(dim(pred), c(2, 4)) newdata$visit <- c(1, 6) pred <- predict(fit1, newdata = newdata, allow_new_levels = TRUE) expect_equal(dim(pred), c(2, 4)) # predict NA responses in ARMA models df <- fit1$data[1:10, ] df$count[8:10] <- NA pred <- predict(fit1, newdata = df, nsamples = 1) expect_true(!anyNA(pred[, "Estimate"])) pred <- predict(fit2) expect_equal(dim(pred), c(nobs(fit2), 4)) pred <- predict(fit2, newdata = newdata, allow_new_levels = TRUE) expect_equal(dim(pred), c(2, 4)) # check if grouping factors with a single level are accepted newdata$patient <- factor(2) pred <- predict(fit2, newdata = newdata) expect_equal(dim(pred), c(2, 4)) pred <- predict(fit4) expect_equal(dim(pred), c(nobs(fit4), 4)) expect_equal(colnames(pred), paste0("P(Y = ", 1:4, ")")) pred <- predict(fit4, newdata = fit4$data[1, ]) expect_equal(dim(pred), c(1, 4)) pred <- predict(fit5) expect_equal(dim(pred), c(nobs(fit5), 4)) newdata <- fit5$data[1:10, ] newdata$patient <- "a" pred <- predict(fit5, newdata, allow_new_levels = TRUE, sample_new_levels = "old_levels") expect_equal(dim(pred), c(10, 4)) pred <- predict(fit5, newdata, allow_new_levels = TRUE, sample_new_levels = "gaussian") expect_equal(dim(pred), c(10, 4)) }) test_that("predictive_error has reasonable outputs", { expect_equal(dim(predictive_error(fit1)), c(nsamples(fit1), nobs(fit1))) }) test_that("print has reasonable outputs", { expect_output(SW(print(fit1)), "Group-Level Effects:") }) test_that("prior_samples has reasonable outputs", { prs1 <- prior_samples(fit1) prior_names <- c( "Intercept", "b", "bsp", paste0("simo_moExp1[", 1:4, "]"), "bs", "sds_sAge_1", "b_sigma", "Intercept_sigma", "nu", "sd_visit", "cor_visit" ) expect_equal(colnames(prs1), prior_names) prs2 <- prior_samples(fit1, pars = "b_Trt1") expect_equal(dimnames(prs2), list(as.character(1:nsamples(fit1)), "b_Trt1")) expect_equal(sort(prs1$b), sort(prs2$b_Trt)) # test default method prs <- prior_samples(fit1$fit, pars = "^sd_visit") expect_equal(names(prs), "prior_sd_visit") }) test_that("prior_summary has reasonable outputs", { expect_true(is(prior_summary(fit1), "brmsprior")) }) test_that("ranef has reasonable outputs", { ranef1 <- SM(ranef(fit1)) expect_equal(dim(ranef1$visit), c(4, 4, 2)) ranef1 <- SM(ranef(fit1, pars = "Trt1")) expect_equal(dimnames(ranef1$visit)[[3]], "Trt1") ranef1 <- SM(ranef(fit1, groups = "a")) expect_equal(length(ranef1), 0L) ranef2 <- SM(ranef(fit2, summary = FALSE)) expect_equal(dim(ranef2$patient), c(nsamples(fit2), 59, 2)) }) test_that("residuals has reasonable outputs", { res1 <- SW(residuals(fit1, type = "pearson", probs = c(0.65))) expect_equal(dim(res1), c(nobs(fit1), 3)) newdata <- cbind(epilepsy[1:10, ], Exp = rep(1:5, 2)) res2 <- residuals(fit1, newdata = newdata) expect_equal(dim(res2), c(10, 4)) newdata$visit <- rep(1:5, 2) res3 <- residuals(fit1, newdata = newdata, allow_new_levels = TRUE) expect_equal(dim(res3), c(10, 4)) res4 <- residuals(fit2) expect_equal(dim(res4), c(nobs(fit2), 4)) expect_error(residuals(fit4), "Predictive errors are not defined") res6 <- residuals(fit6) expect_equal(dim(res6), c(nobs(fit6), 4, 2)) expect_equal(dimnames(res6)[[3]], c("volume", "count")) }) test_that("stancode has reasonable outputs", { expect_true(is.character(stancode(fit1))) expect_output(print(stancode(fit1)), "generated quantities") }) test_that("standata has reasonable outputs", { expect_equal(sort(names(standata(fit1))), sort(c("N", "Y", "Kar", "Kma", "J_lag", "K", "X", "Ksp", "Imo", "Xmo_1", "Jmo", "con_simo_1", "Z_1_1", "Z_1_2", "nb_1", "knots_1", "Zs_1_1", "Ks", "Xs", "offsets", "K_sigma", "X_sigma", "J_1", "N_1", "M_1", "NC_1", "prior_only")) ) expect_equal(sort(names(standata(fit2))), sort(c("N", "Y", "weights", "C_1", "K_a", "X_a", "Z_1_a_1", "K_b", "X_b", "Z_1_b_2", "J_1", "N_1", "M_1", "NC_1", "prior_only")) ) }) test_that("mcmc_plot has reasonable outputs", { expect_ggplot(mcmc_plot(fit1)) expect_ggplot(mcmc_plot(fit1, pars = "^b")) expect_ggplot(SM(mcmc_plot(fit1, type = "trace", pars = "^b_"))) expect_ggplot(mcmc_plot(fit1, type = "hist", pars = "^sd_")) expect_ggplot(mcmc_plot(fit1, type = "dens")) expect_ggplot(mcmc_plot(fit1, type = "scatter", pars = parnames(fit1)[2:3], fixed = TRUE)) expect_ggplot(SW(mcmc_plot(fit1, type = "rhat", pars = "^b_"))) expect_ggplot(SW(mcmc_plot(fit1, type = "neff"))) expect_ggplot(mcmc_plot(fit1, type = "acf")) expect_silent(p <- mcmc_plot(fit1, type = "nuts_divergence")) expect_error(mcmc_plot(fit1, type = "density"), "Invalid plot type") expect_error(mcmc_plot(fit1, type = "hex"), "Exactly 2 parameters must be selected") }) test_that("summary has reasonable outputs", { summary1 <- SW(summary(fit1, priors = TRUE)) expect_true(is.numeric(summary1$fixed)) expect_equal(rownames(summary1$fixed), c("Intercept", "sigma_Intercept", "Trt1", "Age", "Trt1:Age", "sigma_Trt1", "sAge_1", "moExp")) expect_equal(colnames(summary1$fixed), c("Estimate", "Est.Error", "l-95% CI", "u-95% CI", "Rhat", "Bulk_ESS", "Tail_ESS")) expect_equal(rownames(summary1$random$visit), c("sd(Intercept)", "sd(Trt1)", "cor(Intercept,Trt1)")) expect_output(print(summary1), "Population-Level Effects:") expect_output(print(summary1), "Priors:") summary5 <- SW(summary(fit5)) expect_output(print(summary5), "sigma1") expect_output(print(summary5), "theta1") summary6 <- SW(summary(fit6)) expect_output(print(summary6), "sdgp") }) test_that("update has reasonable outputs", { # Do not actually refit the model as is causes CRAN checks to fail. # Some tests are commented out as they fail when updating Stan code # of internal example models because of Stan code mismatches. Refitting # these example models is slow especially when done repeatedly and # leads the git repo to blow up eventually due the size of the models. up <- update(fit1, testmode = TRUE) expect_true(is(up, "brmsfit")) new_data <- data.frame( Age = rnorm(18), visit = rep(c(3, 2, 4), 6), Trt = rep(0:1, 9), count = rep(c(5, 17, 28), 6), patient = 1, Exp = 4 ) up <- update(fit1, newdata = new_data, save_ranef = FALSE, testmode = TRUE) expect_true(is(up, "brmsfit")) expect_equal(up$data.name, "new_data") # expect_equal(attr(up$ranef, "levels")$visit, c("2", "3", "4")) # expect_true("r_1_1" %in% up$exclude) expect_error(update(fit1, data = new_data), "use argument 'newdata'") up <- update(fit1, formula = ~ . + I(exp(Age)), testmode = TRUE, prior = set_prior("normal(0,10)")) expect_true(is(up, "brmsfit")) up <- update(fit1, ~ . - Age + factor(Age), testmode = TRUE) expect_true(is(up, "brmsfit")) up <- update(fit1, formula = ~ . + I(exp(Age)), newdata = new_data, sample_prior = FALSE, testmode = TRUE) expect_true(is(up, "brmsfit")) expect_error(update(fit1, formula. = ~ . + wrong_var), "New variables found: 'wrong_var'") up <- update(fit1, save_ranef = FALSE, testmode = TRUE) expect_true(is(up, "brmsfit")) # expect_true("r_1_1" %in% up$exclude) up <- update(fit3, save_mevars = FALSE, testmode = TRUE) expect_true(is(up, "brmsfit")) # expect_true("Xme_1" %in% up$exclude) up <- update(fit2, algorithm = "fullrank", testmode = TRUE) expect_true(is(up, "brmsfit")) # expect_equal(up$algorithm, "fullrank") up <- update(fit2, formula. = bf(. ~ ., a + b ~ 1, nl = TRUE), testmode = TRUE) expect_true(is(up, "brmsfit")) up <- update(fit2, formula. = bf(count ~ a + b, nl = TRUE), testmode = TRUE) expect_true(is(up, "brmsfit")) up <- update(fit3, family = acat(), testmode = TRUE) expect_true(is(up, "brmsfit")) up <- update(fit3, bf(~., family = acat()), testmode = TRUE) expect_true(is(up, "brmsfit")) }) test_that("VarCorr has reasonable outputs", { vc <- VarCorr(fit1) expect_equal(names(vc), c("visit")) Names <- c("Intercept", "Trt1") expect_equal(dimnames(vc$visit$cov)[c(1, 3)], list(Names, Names)) vc <- VarCorr(fit2) expect_equal(names(vc), c("patient")) expect_equal(dim(vc$patient$cor), c(2, 4, 2)) vc <- VarCorr(fit2, summary = FALSE) expect_equal(dim(vc$patient$cor), c(nsamples(fit2), 2, 2)) expect_equal(dim(VarCorr(fit6)$residual__$sd), c(1, 4)) vc <- VarCorr(fit5) expect_equal(dim(vc$patient$sd), c(2, 4)) }) test_that("vcov has reasonable outputs", { expect_equal(dim(vcov(fit1)), c(8, 8)) expect_equal(dim(vcov(fit1, cor = TRUE)), c(8, 8)) }) test_that("waic has reasonable outputs", { waic1 <- SW(WAIC(fit1)) expect_true(is.numeric(waic1$estimates)) expect_equal(waic1, SW(waic(fit1))) fit1 <- SW(add_criterion(fit1, "waic")) expect_equal(waic(fit1), fit1$criteria$waic) waic_compare <- SW(waic(fit1, fit1)) expect_equal(length(waic_compare$loos), 2) expect_equal(dim(waic_compare$ic_diffs__), c(1, 2)) waic2 <- SW(waic(fit2)) expect_true(is.numeric(waic2$estimates)) waic_pointwise <- SW(waic(fit2, pointwise = TRUE)) expect_equal(waic2, waic_pointwise) expect_warning(compare_ic(waic1, waic2), "Model comparisons are likely invalid") waic4 <- SW(waic(fit4)) expect_true(is.numeric(waic4$estimates)) }) test_that("diagnostic convenience functions have reasonable outputs", { expect_true(is(log_posterior(fit1), "data.frame")) expect_true(is(nuts_params(fit1), "data.frame")) expect_true(is(rhat(fit1), "numeric")) expect_true(is(neff_ratio(fit1), "numeric")) }) test_that("contrasts of grouping factors are not stored #214", { expect_true(is.null(attr(fit1$data$patient, "contrasts"))) }) brms/tests/testthat/tests.data-helpers.R0000644000176200001440000000221113611527526020060 0ustar liggesuserscontext("Tests for data helper functions") test_that("validate_newdata handles factors correctly", { fit <- brms:::rename_pars(brms:::brmsfit_example1) fit$data$fac <- factor(sample(1:3, nrow(fit$data), TRUE)) newdata <- fit$data[1:5, ] expect_silent(brms:::validate_newdata(newdata, fit)) newdata$visit <- 1:5 expect_error(brms:::validate_newdata(newdata, fit), "Levels '5' of grouping factor 'visit' cannot") newdata$fac <- 1:5 expect_error(brms:::validate_newdata(newdata, fit), "New factor levels are not allowed") }) test_that("validate_data returns correct model.frames", { dat <- data.frame(y = 1:5, x = 1:5, z = 6:10, g = 5:1) bterms <- parse_bf(y ~ as.numeric(x) + (as.factor(z) | g), family = gaussian()) mf <- brms:::validate_data(dat, bterms = bterms) expect_true(all(c("x", "z") %in% names(mf))) bterms <- parse_bf(y ~ 1 + (1|g/x/z), family = gaussian()) mf <- brms:::validate_data(dat, bterms = bterms) expect_equal(mf[["g:x"]], paste0(dat$g, "_", dat$x)) expect_equal(mf[["g:x:z"]], paste0(dat$g, "_", dat$x, "_", dat$z)) }) brms/tests/testthat.R0000644000176200001440000000007013234633711014342 0ustar liggesuserslibrary(testthat) library(brms) test_check("brms") brms/vignettes/0000755000176200001440000000000013623760774013244 5ustar liggesusersbrms/vignettes/me_rent2.pdf0000644000176200001440000005450313252451326015445 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170908165032) /ModDate (D:20170908165032) /Title (R Graphics Output) /Producer (R 3.4.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 18771 /Filter /FlateDecode >> stream xMnQWJTv嫗OM_q~jؾr2q5x7 k m5q[պ}nO.W%~_62'/KҴ|-o2MGeWZ)j߶=vkE{?3Zj[\_uR5~_Cq_5bʕb_&;Ugd⭆?oq__?N|+;}gk3q~_ `=e|b2.;V-UHLg;ɓMk ɾwĽfg+.bXQ/Yek+}K{-k,[u}|/lw pq;lva=2"ުl"܋fm]:{C{g$/9Vw~;BqozӢq%W2%q[lOX.*v־pwae_վުRZcope|ִ4q_n""IϣL'= X֬z|Pz.w~}t\hV&&~ՂwbkF{9`e7틤L{쁔߲oȼxK n/}r2ߢgǽĭ1qh+}P[h<$މx[4}(W]~NJѺ8T^ NBݚ v/}!Caen;1tb]MIa)vb\y(1,D:~MbYuj_^kjLLIbƃ24 ˣP\-&0mڴ/@-x,2v2ia%2e|V͆vSqYQ#ӰD+=5-_ l#GgEmq_[[Qtٷ8eCkKxL܆)v_mI[hR 4Ta\9m}_bFB_~eOfkb5WaA#CzѮC;v4bOpv.,hL'^/a@#;ct3녥~lәa蓭tm`˶dX:6mO7E>Ƕt[4+)୆m0|9l>FV ;:W8 d+"84fpL“=-"Xe+,} + VJWr_JUւ2Vi2>y #I\1LiҎ$A,M"2#fDZ}QvB?ѤO[Z,a4MvnFtZOLjRnyb3[!TivԌDl АtrLАs!xp)_а ?AЖs96d_hA͐s3o8}֥qjo{˵Wah|\CA{M` KkJsPWB dxZ|fx՛\0xM6^r{+S|7`/ ^ւwcmZ^lqs+v<4^׸;[~ 41E;dnq;ʹ[eXL b8 \!nXG[*%L~IPJ6hE4R̜Mbs)8T72ŕlҜ~oᰩV6uMztoFEQ`VI# A2ѩ_0ġmߵcDjt_}al^Ƅ̆}o}\ؑ`P2fuZ 3 " c:$P$a1$hv0$eUI 3 X14ǓNL qi, Z1> 3Rn2 3DjM0MlGc6A).Kl6lLLc6&. F̌NP&?NeSj.-wShۇ;2uRro;52C)ۗ o0v[܋a j쇼0vݎ8o%D*~V:n`ؾ4l!.Iv9j2l Pl%&B>R@ٺ>:u@Ú<.?,i-=g㲅4/$s٩l#lg\e2 H+A[>:8GPEVqɨ00R@+d+]O|?V+2Xh؂g' :,eE^ u<^Ejl1Y'.f{{me:GU_o Lۀi2Y.&C,2=e+\:jKTXer?oc]&YMu%^ .[~`*6'r][^X{;űy^:vAp;lRJ leb&[w(b@z -VL@BZ7[>Gz/~[c,ru`cx HaF0ɪ_@_vp@!B[D#?P@}g?ZAb R?`˰yS*A$ÿ8bb&)ʤ DB,&"3ay8J [L- 2Zx<(xGݬrxro'eP15_k2QXǢcڢFL0/BGd Yd ێA$7,m؎Hdಠh[2N/DZxA'y"+3p;Ar;D',--kkز m[ȶ.CB2$2{~$ +O'Va¢Yn2+O^V$U$QW+ǟ Yr-yN"}.b⑘⒐\2.R^".$&h!B*J"G3 -ϛ aMXԤ׃HD[D@*"`^F8͎G/"2пLJ 0*A11fC"qx:}o FH()$!F }.(2GH< ijHEm^ޙV;4 & И'\JB%+d`rܫ niãcGaNY6`cK!kt{+,b ]b玸=ii=xh3h"/ iDw l@=KWpV~&Π MQA=0`PŸY=$aY#@b)F`e7Ib"-2u]@|o) ҂Dq\P뀅4+HDt,Gv-8k_/8 gqPƞec;˸~rK1>d ;[^ G{$ܘ14͖+e7%Ԁ1nU'ܔBcL)Ɠ0Sbt)sXnۄ"R&l/LQ@0St'HaDj3` fqvˀ<Œ7%P/C?e/Bxr^+׍-`2~a /M|B2~/Oc!`E>a.oK}}/[7TeVlYA^*Cwish(;";բ3WFVjg>`R Xi -VJ, ,xn?aelL։ʖFXn'tdɤē鉡“&I5dzNd+MhCK>uʖ,[%s}Vk7 ʖ Xn+u`ŖjX1t.t.BK..LzV+n) S#dL7B9<ŶSu\WW2=o>dcΫ A0/tY?.rX TW(BvT[n+Dc'gbE @-W=7<QmÜDLϸ CrnY E $<\:K"Sy;!qHNE $- !*wMQ,A :! :! SIH8.2HH ?. !BZ<Β,c!UƱED5)zeoƏ4nҶ jE&!UIHfQ@@ &D":2ID&_Y|!ʍ""񀈪rXIDqQU =A"26QͯJ*Ђ0Y?T.{MD$7~MD5VsPeEH=HBE $5Q-"U[HD8=cnzEB]d2 *w(1$Bj{P5#$΀(3$G)þoLX5\ADK0:6J"D9$FDR}S :ʝoz;6 YGïhxMeZ@ii8T3gxBhӒN9[d뇝EKEKaΊ;yd[`'יN'jܱeX6ozq:2)o vr v '3G$:1=I'( v/vr޴"*Rd;% +ЂPd vj}N`C9$e9IMd|SwEo@L;~@ +( P@gQg%d͗pQ HK-Xs 7[W S\Dd¤5Y&:DId<诌XL`"o7h݌F+-`.1̼.j=b$1\O3hJRx&b 1tdJP5f 2#>ьinULHAd4%#jU6B6LVb&/LIL+%F#ɋ"&S҇l+E& шEzNٸ`JwZUTu$F#LFb4 B&єԵ垮/fdB1jl)fBs2[d!/MgUe|1\ۓt̯ǝG̦1Bbr22$fSZ̦|11[%n_/:sf `n fb6[-)fkm'HYn]gղ*idd1[+_bVmy(,^VJP ٮU[dTb2S"ٲ{{3fb֣>Й{I]L KۄJT lt i KFs+yBu XiɮdLG?n(V\)[ cڥPi"KwHVA NWp'dDaEQmPdWnƚHkȬh;vF,%ZYsS\RdĆHJyp2j#EofsP'hg Pẁ =jl1PgE;FB^f($z!rQy_cCfM5zO&]= `  Ms726^GбWwgp` Ltj'uyL6jzab`a"3cz*aݯ0;>7oƾg.*4z,ёu>poi>{Fb`M"gxc@Y唴ă#-C@#b hăv0Lhz|)w?%^!fB#HcL1 L?oh|P/h]u0}Wh&vk@#[ N!f hl4Ns[u"Uu AT\_uCx\4? 4(9И<}TdD9J3% Gq QT5_O;-3̓ʀᓐCțCJ~Ot?'?O:?%9ֽm'Ο{K5woAe&?GtHdP Ah4i?Ń]:vmߕÊ^tly+v9tl`bw+:[սJ)VhNVN:t?צH(tM'=|Gb;*M}8ïg}`EŒA6.Xi)XӃol],Vt"5\Wו8ĊmsrIۤ+JY)q>hE!VLNRV(Ǫ$+B3={IA]WtljATo\$段@G_l-JeXcʁCR茪/Vv }U"SU߬ά5 yvgvfELU7߉m̥+ M~GÅ xlp X@YU(lݲLj;5YDT;C!Nusw*$*V~lV׻qȝ;$;;ΐɝ!;zqʉŝQLT+qgt%w2'SOܩ#$w&ogט qʣŝ*gwq+9SęL}g7-SĝC ɝJw58S~Tq9 .%ws;׻W`Δ8UDh]r;k\(#ř#iˑ3GVxnr֡zcGg3: S0DL ͛tAԼf0!ˆA:0ٕ&t,!i.D :1+QL}r :'{ uń & :E, k1aNbB2(cw751!s mx2񹻘`5:'VHw9h>*$]*$,h]0!D$ D!aULdbCl!aG+qE A@1VaBT˛HS&Df>EP9sqČ6'BB&p[WɈ_1g¦acj~6 hS/}%Gvercp㍭ב{Wǚ8qd}v$;Z&&umHe#U>_&ג#a]36C\]H!x?pdٌ"ȡNQ54֒ lA|qt.n$Gv6yGFCrd'7#kI ա׋#Un/켿Hq8kN*92NNGj# + qő',lB#Ȯy]<4D&He#G+*WT8XOF5u'ϕB3d^iA|n"g,ऻ+w0%;;E;u1{IF_gwJA|H׽5CһP|BI:ǃC߃~?Tg%*2y>o}($yCɫNQ`M)`|]lyYLӣ?OJz0>ca#%9u_Ro۪5/KȎ+*Շuz>|3ks*OȎ-ZdvOȈB,AU$Z;R=ّMW}yԜwE,ٱ?P {ر5ϓu.9XbŪ"48lGVrbǘ2_(!V\jw,vL2w؍8;=Ǹ؍8%‚Ȏ#|dG'=^bA;ʖ5=#E/XrMɎ>!7:aɩv䔏8"`ǙE3uNweT8UQ ';LV#;NeB2ɎdǩdG88ɎS#ɎS ɎSdǩd)"q&eN'qj^q5q˜ vj8Mv4S>dLL)2`C1~?qÊ7ؓ8$+N<ɊSMȊՆ|녕?`ǙvY<`Ǚ58aljr`YĎ0qSȊ=;ĊzΊZ idE/FΩ i^)+N꧆ͤ6S3jDyͽgu7 +xj[xvpFSʙqV .u`E%I`^g'b:c5qYdpdDp,;FFU׬;IFQ=&8؃Z`62ű0DmjG/F#N Ytdbĥ`Dk&cmAuGf1h6 B0ÿVg^kY3dƮDdos(gŌ#fSYsbơ,F2GC&31'3*/fdC0cTsP G 9>ĐEIFE?&bHgCvťɐ׊!^ŐG ĄdȦ,3noi2dʦEdŔMqk2%;S1cʟ*d˔``'ƔW-ɔ]Ydʮ3Y]4dJNd ߘrhh )Xcʲ d3f:XZcNm8v}ɘ|_-1W *oAJK֡CAz`LfRay +W0|'$h;9( #2}t8_M%e= F02uAf~Xi`0iX2S%j^z:|hNtجpd""=.epk Z?C4|yr,kL@y ɲQ0cȁpd,vA.88R4g.ɲqg #SȲ̉*_ȒExYvk-4 JvYVFp( WP#WIQk(þm$CͶM~ ˡ٧σH^_R4"=yT?Ez"hAz"KEڞ ى45;Wdg;!U.#YΤqh-dGҴa Ecɑ4gQ$d95N/MGN^9E2"M޼ K7d5!22AK~#ɯ (2\fQ$iRKF^/o$NF K "o$Hs@4-+42i;7i #Hs1H3I(R\D\Eu ϕ8K-+IʬiBs=I+AK$ϥ+'\! 4<"3?IjHooJ@ ϥY$8z \3IKI҂<{ΌF$M"iiG}@{@ }$Ŋd[H}$Py C}݇|=ʰy|Gs@<ۛ*4-/-}6qݫrX7xg!#:i.e c!b bDr'w5_fA`ս<=wXÃ9>N- AypF6]72IL7!V} dY F$n O9_OBJ9U$.Mvl]2>t.dL1 FLiRύ͢(2V 2VVH'FFܬ)irV"nޑa&cwcbjqxo0psqSl ̈́&H2и*?$q ɨE")ȾyIdId"$C$؇vL$A3A" L?hRI$sMy" @Y }Ni+I-::+S7Ks׭nK --d 0:?-:Jln5>9msI1R$#JܡdRdϯIiϲP$=N̶c R0,E=*d +D:.lX[!k0^k$+~)A(SY Ob',I: xBӒ;ԕR$-1=@ӄG%? KaI|Կ;]c= QӒtCW|#⻲QhI6 a|0MS\fjd129&&^<̅ۦtdIX+$*=6C[*4 m=' ZW m0AzLc숾.m `N`i;,o6jxSڦRkl%_m$^bD`ŪӑqZy3&M4 &BIq. 'Tk*LzZ[([>'TkkD.dGH?~1uͩכKOj.z鶁5/ёb!%:]A\y}!:#/%@Fh~tJB'@ (:G EtLtEj:!=j3yW`h!>:$,% 壓4TT>K8O-!QlU4-I\-ry~cX[ͭ0JB{2@[-Y)&"ȱ7fWSw\:[;coB s@l LJj֔sut %pqʰ&io6272=T}^{kFzLd%@8Xi3R'c&D{ӔNLp^h3&uxPFGF6#ڌ s1 \ݴ*ҥTf[1` &2"HPGXm3<q,$\0?=4W xf >_[2>=2^Dnڢ_[LId7cKXQm? Z7=Y.gb`oyu rT|lUVe0{'H(,{}eq6Dda7\M:۹7WTYࢳBCqd]}cSt:)scSt6\x#ǦxufbܹKѾԲ(woU[~SZ>Gk.s{Sq@r 1m).<ȱVk`Uyt8 gDkte~ip9'RD  h?_kPAU8%bb!g Z}ph/NOF7}'6d3 O>kV30Z-m8!ʼn5<+/~cqV6h5r-N:&kqBDX_k{Y} ^cIؽ8E c+6܈}o辷Nwi8꾷hXu]AV!׍n추#7\سFBƺZ:\sR7!D8׍n Yĝ}^5b]rl?w6)/w>3[?mYx7y>ŏɞ[w퇋~AOŏ~w__}?rTܨ_?ooy5]gR yQxx/}t/#Oǽ-k}d"ONFr9P<΄)^wL;0\XDEqE%w]j){Ox@)^wC<+S?߽mol3ڏzqYTVۇ"Ğjgw?g|r}`v( e17_~~~IH^kIsysg =_ן?Zole _^|vo.ڟb؋qFfW_ /:;_\*w/o} ͹Lgß>9o?CL1+(^w~Fu'y3 3`;x<~<~~p>#~q>#~q>#~q~ǿ+J pendstream endobj 9 0 obj << /Type /XObject /Subtype /Image /Width 1 /Height 12 /ColorSpace 5 0 R /BitsPerComponent 8 /Length 45 /Interpolate true /Filter /FlateDecode >> stream x{DoǦK)Ҝ6VoҪLvpvSHTn2endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 288 216] >> endobj 4 0 obj << /ProcSet [/PDF /Text /ImageC] /Font <> /XObject << /Im0 9 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 10 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 10 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000019378 00000 n 0000019461 00000 n 0000019609 00000 n 0000019642 00000 n 0000000212 00000 n 0000000292 00000 n 0000019136 00000 n 0000022337 00000 n 0000022432 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 22532 %%EOF brms/vignettes/me_loss1_year.pdf0000644000176200001440000005236413155225620016475 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170910140950) /ModDate (D:20170910140950) /Title (R Graphics Output) /Producer (R 3.4.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 17605 /Filter /FlateDecode >> stream x}Kq}~EɃ~\)X؀ DI6]QU=Zvfs{TeeD>*+>~?<Gx?joWӿG}l[{ά/~?صpE'>?#[_Lsz~G~a<>9giBN|v{xuIe=S7]?MӔL1?~P3%gɏ?~LLP.rhbz6sV%rq)9͵<abz`b{65L36Z}81,qF98?4_igW&f +ޙ؞A\Q&g/WQLs2g\c53jkٞɿp͖ u.e<)!. {&'\ڍM&>Sq))ߢ)R]G>M3;\r KM1!l*TA2\ژ '| ?2)d.K_ӥfsn}_2ޏa b&+_i}^k=&k@)%'o[kߴK^a`Od&5hɹsĐ1[PFSƼ]pnh& <Ècb# M82k2h\z fM$A&&H1lph͊UhP@ǖ0 5m]C5.l gmQn,`߸zSxP#2> FsҡF\EUIk:؝OZ'YCL$ ZE  /Ыڠu _}bH{Bqd=uME#}Mv3 z tr=\%4وVƂDuiX-Hn )<6A^q&}^6$_E׿!1_ش}y:2jIY!_K{eGȱ=`-Y^i=Ҳ<؋) yΑL~J!1=CzشB#* _%Qfr"3ЄmK_)\ң9@C+!a RCiw W+iw߾>=i<@(2I!ʙ|yHX>yH<$yH0" i~Dv9KCMY^XAslgQ\`GE3^dޜ;|9>L!gaɮ}T1UC ØOEW E>ʺ\sf&_oXm -{3j5.\^ APp0a%z 8o@67^&jnLB"` P`'it37!mL7kL-@v0=.#FG3ycze LᙁbKqcz)EhQq`zؘn(c)؎ XXY(L7`z\  L$1rZ 0ܯD\ =]nrѼr0qaz4cܮ`\!σ&'ax0`ɭL7 L7@X9J&+drӣq`E wa\tsLw9L7y MW@d'0=Ā'0z]s@\u? @y,Y]qϒЌx>`4% Ѣ^5Zrh|[K4+o}2y\~@LN }]F%KdsX=^Zofڵknl2]84K{5ߴ'YM{ F/xӘ%:!4;yӸvP0Mljt`y^V1މn1ME]1j,BJdƀc٫vhi8+W~,@"ȰA22O]ROkq v@w!CafQ<ğS9šE_+`"kܛMY2O,pMv!g?iHP5$RGRi8ӭ5.ȱ:[/>NL!(z1+л΀'zvm^R}ʡvn :9}5xS8ho-@7P⅝D[88X>s &Bu_} |oxEA #Pz8TRKx|>*|^LcB{(A&KfA0`DR)}ˌ]H' 3#73n ā/pjL?>X^ PJyTPA[F?P%c1S+͸Bp7&:Zɔ3=%C?U<p'̴]'4'YNLJ\":#N%Ǔ YK%ƿn>Pb K%oŬGJR gdwL>d{KnJZf)+g|tekE jeG3~K7/O2TB?@eQ%/18%Vg!m2~>|z*8I|&sll{tȑ7 #y0^]DS82 PNg<-q%ubө\}ϭeݽ[Ml\8ܑmDaQ4<mIJ$5i7u/x wW,T4-i.*\(ʼnE(b4 {a֋Yg_͒Z , $Y@tnv/=,f87bBe\)9k,p1Җ<92*z2(k dH,~A` Cϋ,c9{ϒHWg@B s>?3"#[ktT$D1D5V 2dHw bQ!V (oxXxXY]ߟr,\e (f=+7w(:8=8Fs/5y.:lهHqK͜8n1[ˬc>'yrgwZ )AIBV0ْldg^C.*I]ȼ̜PM{JˤL8K^h2"{&g$׎,_;*tb,ݯ*Jcz=1| `}k` n~G>ܣ0li2/'| }qB?aߗES_եQ9Kңtn. خKfq9_)h&\iM#(T u 5uIz>(uQUFR*iiuQlEv%M2U}hiu!خ r]躄mA{NH5ʘ)5ɔNFg. hMLaڮM`lJ'uQZrr]2]arW]M7 7@ Vl(Qf2/%Uut]Duj AeBPnflqCvR/.Lel%yȕ:TTT֢:UԄT*&*F*հ7Q1jJ "zL l*M\.AԓKդH亰Xx.خ z$=tc}v+K*޸NT}zj opl-d @D+rj*W ȒtU,ae( )d8#|7!On O=?[+(gJKݦ\n2~p7¸t 5, M&9ppdؙ"̸ɳ^&Cgq+.irc~oeƣj9^5voKtk>jP\U^YYؠ,Ȗ>,r=ASf#hBzB{=XEMNY66ڵJ~r=Z&](\z_O{`*=8q[٣gS,k=ewCujrhO-x%(XdMe3 e|ăxTKC9 zgu U+Z˓z ȉ`MIs:2ą'×_WwY'e @Gt ib\< x"*'%E_Ěfyy" EGCAdjIMOHd j2/ 2N۹2ؔi{!B/$(O/*ǽ*;TVn0DUKV!j 1FT Jd+muF^kj$9zI[Nij&ֹo: h^Z_# e T)]!Em7(MTRP˶\6CyUGjXPY/E!9na?̃P >zBU~$dV:, VrB`-#UvkM`U%uծ냕Uy%dm #.J\N/YceXeSvKXi >Xk/!Fm܊"Vܘ}kn)*Vߟ{p{!{X}cO_o ,$yUG|W;o-dɡ_H9iNUbMW{;}ϧO!^. nkijOQ1޹AO ݧBgmm[)HTZ~ZϰlF$)VDh?$o5׃"`6߆+ؓnlZUgA~qW BߟzPp1y+͉Q|(D$)nx#nд G + iPoDt{PK\Ѥ3V58 h6z0F7{GBÚ>XhzEL&ozN2n%ӹՃzRΒF9qcHhbtT}%=ݯ$=k{ $=3>l%=G ;΢q}Єyg䦘 r}ՃbS _Qc}+nzPGfS&7|1/ccc Ϟ7ד+vzP7v{h3_|V6%|W>("}G }U*u}k|P+ H+BEJo^x2z-z.]σ^4w ˞MacK٣VʲWEg%^֟d/M eO@6a챩uf3sۯ/{Mxx3$Jx}£7E{»ļP]*X%m|^߲ l}EPysiޒ|vYI!~F>9)]|sl~ >_]||ˍ6ŧ2K&~F+3ژ?PUC*CoͿ &K.>Vu!mE)cPyՔAׅg4]NR=UܛrriuIr CNUMUI\mݑB葪N7ʓ[}N%0"ׅ(u V9ZS]m]´LAd?}۔lSASua'D}N%%d6%PkqzL0=rJ0===7m=K=@[M#,zf<m5-ZM@Z!@[ #dЖlo]3sjPL׼M1N/eЖ]lWlћ#j{LכmAЖ @[ڲy/wg߮nHlZ?@{rڳY/kE0h3e$0V'Pآ(VP$Oȳj&Fr^>6%XKh1h+MWË(M"ڊ"6@G @X M%ZOӅ&yVtإɘ_xڋh+B ;@[ ϡh/RMnWlъ>h&3f΋h{B@@[Cb5u^~:{6Js5GWivlYyZ8Gݱb̗pܮآۋqCmOKe V]jtZX:D롲Ke/2ʚK*{c\5*w\\eO؃rjޙ=)oڛsG{dk[KfvR^$(6N{[ثAR:sՔgn8d:^*xٔQx x?JgI*]$j2qtM6)vFr;A:C!wR`zpѭ9t66ٙd \˹ '̸.O2ba P,rDcvF%ڕ ~ {Ip C/nkn2N}"θP`xm** .oį\aY~4J/ ZM|xp?c v0Lވ4cӪ"~܏.FQEDǃjxzsፐP6a@SKT*@oD}E 'wItEpEBf ]6>tÊ]B[^zQ%4c~uEbĥgG1iH2 ^k/M h(U@@ ZJIkvzASaCU-TЦ>>m4֬muuC7Ymە"P퐢}E-ZhI %46MPHqMLN5j]KPO Q+P& i椆=sPڑZv]TԴ+J[@Զ0VԷ*wQEREA{F{&5~Q^^wVt l|ס3'עXbfvv^ulOt{?6̻QXBqN?1*7~>J$u^{ge=,3.{farEacxsGuyi1Dl3hqyL22y[UL|nl`vNV:4 NǺ4yOx?vVJnG79\׫Up"}U>VZ\͐0k=ԬbGkқe*}zjZ =jdOT *{cz٣ŽWƔeJ` ˲B㲷Dž!WI>{η^d&k}!Fx̶ ;; #21(wlG=O F Z|ʶ:_߲ *ǒkK/g!doRvh|!$CJ⫝!%ħw{"ܕ"VgiV邓7e׭'?S _~tJ`fOe7 KU|<ˮtңpv]H}*VSWm$t}4Tm{*5*nۮKkB%Tp\R%(ZBUz?T[ʶ"*[wgKTXEBCڍE5;a4^:5\HyCm4_Y ΧJ %>mʢ>f5Pݺ=r=d^rzzI߯jz,\z,z쬯=82N"=I/ڛ=J,ВJ Ҟ%KE06N2e;3eoId_dS{Cmd#C /Tx(EnEƠ/l O 1 {CxB{y.>`Bxtcl[:YEiF2Hu&z M>&QC@v;X $i#HB׻١;;YĴI'+ݕ7ଭ) .| BW̰IW&Ϯ WWѫO OU#!  ~f_gu =tDE: *cz? 6Uܮ¸ 9;>c'L`{cuaߗ,ew-jE*NUW@gVuJ2fSoe3(cR 8Π;XYm%dce݇">^ ]tdFϝxӥ{C-q8P!&iopĐ-%3y'ĪGU?yY7L Rx2۷iր> 'lW)SrL&PHV|^Чyf{@+7Te+]o7Mh&phc5[E;9WEKa Ԇ@?ka^m<|SraO/WWCy S"z2zfBz4JkJxxnP|,R EYi|ҧro%J)*y>gyX^Irke|zlj!}ԅI^Յƒ# OPbx%ׄWi ,N]dSxoUxyxٗPxDx3 :O<|_ Ol~C_|$JfaSO[rD=W%+O>U\]|,)Mff;~>7G&?!_\xD>ًF|3->ڹ!V|@vUv8ɇw.O@|)EK>w5:Q+7 *N A|.s] (ʮua(9jr=0>Pv.Q2]TumT*ۣVa\߮ #RkRc*RA\ȥ*%#0k¥"Do.AKKCD亄Zu ܻMTpv]%ޮ _2UQ)u~ئu r]L]$SXH-SdBy^]Ԇ &ATuQ{uua,*r9Aax*sJ-P+NPP>_zA\oEP)ׅ6^"EFR]) S互 *TYT0;.U+l)-f*Wۮ צLkm*M5&Uȵlv]\.fޮ\ .G*^yȘzMr@+*5`p5Þը/tE]J{p/ޫg$lV'5+c&hVmf*@N#b60ΎK\ZZ)[cPP9ؑr(/b:89y/araJPs!F~+HK #b1^0SxFZ ki Y+02Fa`nI0ҏ#-vc؈Q<UڜEȘ!"ceE81[E;EhȸUHo-&y2u;~1R< yx02 b;9FFm!FIg`/ #B\>`[x0*aC3rW#Ud:O^WF~]GH?Z^xF\pBC၂~&D4+<8n$ݿb$F#p0za#]#wkHbGF_` #u䅑~~NV`_`F`l#M&f Awi20r$FZ+HpV`}wիi2p_z$HI|ݿx$GW /=5ޑh>>`=O+8Ѯ`>DSK SΠ>FVpJ_A}]8&Cu%{=Y{p=B{jā'+g2 \Ǟl|tGhcuUdJ3;^_.CV l=8.{ oc;iճw@84}1zƒp6"p$dR#^isژ]x7Kkr?rnpw0Lk'0g}Ajk;7Op~#5i KE1XJ1(SPFSPMoUI\>_}Gz1Y1q< ҃@PelTK1VEs}ir p@@0!$bmX )!,˃%eQB`n/V \o#OA4 8O]q&e8, `-3 U=`8a7P"JNRa#QQ%2gQ咀BIPXL[Dΰ©Z9Q@ .(b . bx* 'OZE*.3)neŖ( E@B۸(ve(x-/bWA8)~ Ve .Ul.D8t1*3WXðWu3*|tn#2RNOUۺkЛEݾ(}K_#tv__){#E/}e=_?b=}K_q%ox__Xo^_?G>o^ G>o^G}b=}K_@ & m_CWF >Dɦa}~?qVwҹص>t>/Iv 9IHO浱bZ7Fzfg; H~>-Ϗ Fhϥ .X*.xt~|__S7" H;M5>d3F9<^zx}3/<.[j4FXp/oj[xiÇҼjne[}CX=όS>9}KFFƨRpÇo3]NdžP>GtRo< ӻaף꿯H]1/ǚ5wHِ~2֏.}(vww~ާb>5hA9>hj(Uf~F~>Cή?x}>y|wZ6orꬿq÷pmßBJWuM6zӧ,L*s+sIپI~x{OLhb\Ûy_WwuVzD Sgч]endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 576 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F7 11 0 R >> /ExtGState << /GS1 12 0 R /GS257 13 0 R /GS258 14 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj 12 0 obj << /Type /ExtGState /CA 1.000 >> endobj 13 0 obj << /Type /ExtGState /ca 0.400 >> endobj 14 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 15 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000017970 00000 n 0000018053 00000 n 0000018217 00000 n 0000018250 00000 n 0000000212 00000 n 0000000292 00000 n 0000020945 00000 n 0000021039 00000 n 0000021123 00000 n 0000021222 00000 n 0000021271 00000 n 0000021320 00000 n trailer << /Size 15 /Info 1 0 R /Root 2 0 R >> startxref 21369 %%EOF brms/vignettes/inhaler_plot.pdf0000644000176200001440000071630213202254050016402 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170125184259) /ModDate (D:20170125184259) /Title (R Graphics Output) /Producer (R 3.3.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 232956 /Filter /FlateDecode >> stream x콽.MGqe @10ḧlIc7^SUW?e?a]Ws_{ꟲ<]W?7??O߿gd?]O?Շÿ<cjMO o< ۟~'|fgOypi=]?JןG^x 5>ZKx={a9 ,oQ=8;X q\vfZO)VO Bϟq|ȂSjrTx̀Q-GeGuGeO;ʰQ5;> Uj>}0v' {^8۵O)q ~y?GwN°1nб/°1aq\61|0?LjO]v'¨`*ƨcu\Zom0@9 eWc7 "9^/?u^=@/.EP:=@u<*Fv_|::n*P/>@PyUn!. ^P^EDžQ 5(^5j107~ku1f>?Owu-rCS-v<0/姓-|=.B`=ڍ-=Ekz}x Dˮ2*M<odtusMn&mdS@/ W_i^}?|R4`2ϫ6-=󲅳q>޴xA?/[@{cG'~,Lwwy= ^v S;t˸jzكq^/@2!MOU^le<4]<UiC8ㅿ77,eq_~C1+D e챫J}}0^3\pR1c\z̸]SƮȌ"pM|kx`rgDM8C^b1UA}itNW~=|~yz#^O? כ5߿F~/U2͟B^fP379!^Fji?̸_l*}U"zn?`5!2eSR>R_o3Q}U;%cwTl}u;g/߈'r'x۳ˈ'۳|]o/]Ɍw8,,>"^p?ǻߴ;|d.7y֭Q޺\5ىCoИz )^ӄ@u\vޛE=L_!\LC}7{wࡾC}7twK+wm}!扺_][wW)yګwMoݜ, :x{Њ%}1^/wX7;[x~ջlRsV4ջ+דB߽<nVn>^< }w1{|*nB]⃱/V]."}2*r/-#q?^:]XH+xbQ%/b^ ]d{!?X|﵆ߟ:r^ 7 ),ݵ0Dx˽Ezջ=Bv#~/W!/ջk`| ;rwJ/&Eq<ݥ:|'q!31rxT28~![l_8뼐/k慄Y{`گ%jCژI}W2e?_˼>J^M}_muq_Vn~~%3&3a-% ?Ѻn1_[I~#~>OJpJ %x쒥8,g*Zgx//ɷ t>J~?R{{<9^>%y_ͼ}7~\]>C!f;?暎%yϧG<3on||9z`sIzƷwwy=5% y=fΧdswһb)IONNzesN5SS'pwm^9)ߴyx|f'|ik[.91wwrc|]wGߕ+}|᏾c>7r[GzKQo)}xx|Gwʧ))e}|T/|g}zCT+-CϤTO1cS='rMSSS(rw7EN1ީu8;g}zT;ܓRpKzK=OIzKͬWFNWw^)ީz8;kg}zoƗɇS=pwgGzKQo8-X|]wGߕ+32*#2*=Ҳ*-Rs+5;FJJɺɲɪɢɚɒMkXlFqF1 ` lj`.)q^%ܝܝܝ۝۝۝ەەL+ )+(3(##0*v—cT[Y,Vi+˴U"meDi`L2rIfaMbIFaIJ&!,DcHx(%0k%̊lfA6Yͬfc3k1KF@&τQ0cza8R:f;`Ojd5:&?`^#뮑eWϪgճ:Eб< 9vIaT?j)4-c=XR:Rǖ5VeղjY_,ZVWm~}.\9prݰaUÒ ;箼[y5b>R꣤>B꣣>2꣢>"ꫡdat͝dFAOD|O_wă%9PF/FW7SkЃ¾)8ssAǵCBWuwk^f}}DZǹ' ǵ~xL6"Ni,⅃U)0x&׈ qIݱ) \pt# GZ+Gu$D{ !b}.q@ːGK>]x9d{] ѭ.i83A,vHI'n6C:^?Tz$#-h5>@G֎OПgrG'%)i1`X*8 Cm"d=4>cTư!?K6V, 'C2Aod0ѝ쾜3ŞKX,{#4%7,P `jCٗq`bl^bQ܆8 =cnyCy P&X()~>)CH@-Cz8 AkA?ޓOHz4CCe$k3"cݱH2X$ =P j 9e%/[n@cb,z8VHV:T|y1o9*'+ߖQE} ;tJ*ٿJ*1V|_~䘷 ZBt\QŹrqtXr]񮔶㿣b^fUQ7BWYU+c\q4C"=䩍+(GG?;R/vLT9QQv\Te ؑa&/#;:~wGG=?lzwGIf~^ّbϳu-uqIU:Xww=,; xÎâeߣmO}GGpS ,3vT"*;2KAou:YdgZ Au9Qj? G<:NM/QRfǪ:Z x/`<-'-:j :A܅˶;v]_ z*<8^ ;~ayag B_8bǴ1ٶü`5In_Q^\t$#WrpiÊzAǹ ]U%*!|ѹ~פ|ɊVpt`to<:}:kv%HǀK_P`!#a'XXp4qǃ*ח c:֗r4q)I~﻾3 J^Hz벮O8rx(te3t,.}aƥ/" G}S_r_pT:t?pO%8>wiP<1Ϝ?o8J{ʒxHe:VwV/J*t >CGq EtbEG.h_tûxFGq U/v)hޕ;:#p$fMͪW.XU]ȪY.Z׮ZW:R9;o7P-)h}'̿Gl.}=zm$뽙go~68'5ůgf|NxxKxsO|sKAJ=|yjsǟnsM_**G<ǁ[<k<%S%!lq|;Kf=Oz,p㓞 \C֏=fΧdswԻ#xG=9;)Q9q=pxx#[w\D{-SK<_J{Sz1rw\o9qzxˇKw\oGN-~䚎_!O5l|Sc>p%;c63_9;{"x|MgwWF>+r[̇nYo1vf|y |x|a+;Gߕ+}W>|]wG!8-G|r⨷Rc>;L#;Oc?pwc!qwW$n!g[$z1ޱ)ޱ^8;֛xzUX ec-pwIo%zaΧ$za+xzg+;KXo 뵁c7qOY߱8;ֳGzx⨷XOOgw9ޡ p[w3;+Gw-x7V?c%~Qo_$pOz&[[W \sCKex~)8;%Ng}~Y߱_)pKzNk[JG~)ޡ+bgw7 g}~)޵O8;O?Nz~/x%~3-+&NSCdo8;k.}W>|]wGߕVYoVYoViYoV9ޕy#xvwvl%xXdidedad]dYdUdQdMdIǦ5 ,6t來;66 g kl~8RPc,,,,ޮݮ,h2x%!Eƕd gQ4Fl)T002E3Gh,VVj+ 5P6fJ[YVh2IQ.ɬ#I,#,)T$D`S d]fM6$Y,fc3˱blf-6;&0`IȄQ0c\uLo1G Pl)@F^#+ȺkdճYtmx%t,¨]RϱZ 96M`KX<5cԱeղjYa,ZW-˫U'wK=W{.\7llXsհ}>)+/V^ͭh(訏j+Y$]s'Yu#qrЃxq!`\Āv7l)mĭ h7~# rx6 f@*MLV,;h4*7U<=0U1ySXb![L{pVlK{Cw=!-9W΀jr V#>*Vўh|kOzEaȊXdT1{ח5S/*nȱ\C^=*zwůW:>ړ~!Dǒr4)=)Ǔe/'FbOǔ>ߡ ($UQ#tl!Lݎ.Nӕ#L_cLa9ʔ0Ld9Ҕnc t~L2倇#N_cL:h~#ϸo&ǣ>}#P1L^â/~БD_2 !tDO4Qi,Gpdb!Ǧ rt!G>*QJȑZ x~hUHWUUIYգUJ[UK]= Gr#㣣zȪW.XU]f h ^j)^kW:VAqQIqFÈx{=/y撎czmwޛy?Ɲgo~68枎`sKx9Ļ-ωk߉C_8yVƷƷ5o'~#OU|/G"MGqGyGz pIk W5lni|EmkN'z*p \tPocs#j;ٜXz8pwӁSGwZOl9i=xL/)ZO.||jswZNN)ixֻkwZ/o.9i8;tp%;c63_9;{"x|MgwWF>+r[̇nYo1vf|y;|x|+;Gߕ+}W>|]wG19-#G|r䨷>RS>LN#;SpwlS!rwWDn!g[DzK1ީ)ީ^9;՛"xzUT:eSpwIow%zaΧ$zf+#xz+;KTo=굇GwFi|Yߩ|8;գg}zv䨷T鑣R=LN#;9ޱpnf}~YߩaNSEدg[9n{w|]wefUf[edUF[gUZ[eUjwx~1ޱx㝢[7^)=Y=Y=Y=Y=Yֱ9zcuOtOtlXbCw( 0+6MMc`SpwHAM,,,,ޮݮ,d2^IHɠ \IF ID!)Tq002%3d!,VVj+ u2meH[Y,d9 7\YGXXGXRI( d?^)Jɺ$̚lfI6"Yͬfc3Zlf)&$a$(LE1 c:7L#cF^#Kkd5Yu,z\Ƕ:Ga?.)X-Q&u,ԱK PZزjYbZX-뫖Ueq'wK=W{.\7llXsհ}>)+/V^ͭh(訏j+Y$]s'Yq榳;AOD|O\w 1{ 87ڈ7~,">#?Ru?p cۏF<}%q8G~OPx (/ss~6¨㠏x?=4;OD\A?5}*8>EyЧOgOBE2&fǺmdzS܂I.8r1ay'!2՜b1nw3r<{ƾf)!. :z# 7..gޞ)i؈d -7T (Zn!|džq.gٸd_grC$ᠡTri1`DBC:cD{#cc1ŏ?X)`x![f$s3a)hw )s [Pl԰ryP7WCڱ5t8q7QblxS ܆S`3oż_g, q@ZOH@L3.o C "aŦvEp7a|iO _$@G_|z?{hH1^vC {t :ܸ=$ܸ<4ܠbG?=>o=x2 ty/ܣBoqOqvܹ>;[؃޸=]o={ EGq z;wP]ݥA}辰rv~]p#rl zCCoM%:֤ IGj[85=觾ŽUc:佣xIo2~_lHc{ 8w=-?|@tzx;<v O}ž {7˶؁;k#;gמxbF#= VU^p"ٴ1:ƍ|KԞ<]8EG-g߇kN;}q7yBǾIpݎ= `rlIP 9EG9ac# / ?"ع:&'HǏ MO9E:<w{{2A̛|!-=lY7wp{48=2x~Ep<e _ zgރY(s{{x/i3gh3 GO1猿7ܿ'=py2"3G23p߻gVCNy8 ƝY{W:}W=转Je::_wPg !:J1;B~0>|Չ4_9Zy=k*|=;Ƈ [РlXE8vw}]w޵$:w!]xHu;:O P"|TP#'>K8OS#TQ>5W8,~˽t^ZbǷkx||[W\s7~\Mw- h>\H.i|MF- as \6SOq|ck\'s#j;ٜXz8pwӁSGwZOl9i=xL/ah=zl)i8;x֫[wZn9ixv^\x 63xQ>"pwgNN5;S6ZN))8;o:pz5-|;; _91xxxW>|]wGߕ+}W>Qo)9-#G|هgwʇ))~x||ƗS` cS"rKǯT9%-#7^9;;_)ީ^zxxzT=꽑{_w'NYߩ9-#Gzz䨷T?|]wGߕ+32*#2*=Ҳ*-Rs+5;FJJɺɲɪɢɚɒNMšFyfQ\` mjB?؅355 G jjf wgwgwgvgf1]Y]Yd AAA81B8R` `2dKf1xB\YVj+봕e*meF[Y4s0 &nF$&$P%Q1N~$RuI5̒lfE6 Y,fVc3RL&0aIHQ|v0"%ӛp%Üp%5YzF^#뮑eWϪgճ:Eб< 9vIaT?j)4-c=XR:Rǖ5VeղjY_,ZVWm~}.\9prݰaUÒ ;箼[y5b>R꣤>B꣣>2꣢>"ꫡdat͝dA?P|8G=X'd>Uǹ/Dě}}ٷ}~sxǾ DZǹ;|sx>x7D?C,A_!w<zǵ_΃:^v<8A!)㠏xqG|J@dAqՀ"O=ձ;Ԇ|q;@NS㳧Cdx"Ǿ'*DZ1dzSكI1}:Axw<{;= )\ptۻ Gec!D 2ű$b}.q7*A98~Vt'Yf8tnw7dx@,:=_P:"uj k؎ȧI:= q !vtc{CG S;a1xrW`!՗q;(Y8>?-oiAW"NAo/,]Ao8CS, /(c)8FB',# =bi} j 9g , =^alwjC}m'/hX7!<0oÂS;{/;qz[%Rc5ća;{rlG:ư2oj̸w#3W>{Џ#B2 &C~;!9eh5Ab}O{A!v؎TdԌ'3rOpЏČ1ڎSd/>ˏ"xqa zc|1 kx=%Ǽ)Du*gdGpsvc1qמǺgoIokA[r|#c=lEFۘx=̘{1cn $2p "nc.9=co<Ŧ~&TeLYTDK(aD '  c8Q="b=}سc<器%2*2pbc<V ?NĊx'YIesBҞҨH X -c!iF ٱ[8vv |(jR~p yrł$>G;qKGuL8>8/;p_#50f8Zx.ǻw#;ʆꆁ׈ss=z=?c~<{_x-/<y=//7qI;➎?@'K<'^{<-eǧx8pOc<8i|O6lq|x5r3#-5@G=z#pK^ \w8>S{X'=7S/|7t>ԫSKNNz:pwS#rẇ91rx|fk"x|O/:rcgENz--׬;\rc>o3}/<|x|]wGߕ+}W>|];s#G|p䨷OчWwg))~xx|{_wNww7DN-R=LzKQo9;s"t>5;Ջ"xzST]WwNYߩ^w'zꅑ{:ꑛYꝇT/=RSpwN=/;Փg}zTώᑣR==r[)ީxx~=;n9ͬԯp8;;lYߩ_pw귈5"tLzK G['Q"x~)ޱf3e"x~)s8;ENg}~Yߩ_pKzKNk[ꗊ"G~)ޱbgw7;g}~)޵Ow8;mf;-R Ϥԯ9;;FNScԯ|]wG߱4rwW]#'~%NzSc?oNю,힬,재,랬,Ɡ,ؔ&ņQ^<`Wl$C356o)q~cpwVpwpwowowVowoWnWn4lAaJ2憍3(#6d8 c` ^2Wj++:meJ[YVh2IQ.ɬ#I,#,)T$D`S d]fM6$Y,fc3˱blf-6 LX0`E2HƵ1@&)@0')@l')@F^#+ȺkdճYtd[^IP_I.y0Y-F#%%{%k)eղjYa,ZW-˫U'wK=W{.\7llXsհ}>)+/V^ͭh(訏j+Y$]s'YqKރ'=Ug_C29}nK p8u7gzǺǾ)9Vy>8x/:pnxú!Ǟ=a88kq{*r<{;>{3^>LrCS =}vcr5 ާ^iDZmǵ'ukO]>C].8Oprx A8HS.|O'ie]y^48;Żhs|~t/rpP.<ב7 F#E!NAZˆ8i@:Sam8zN! AG '00&SD MmK,`Xyo|bid狅e=Xts%Ys 6C?#, qz@R:zC/#y|9̎[%hS TCr|5G[Coҷ/3!vle_v, vc‚\;da1os(0Ȁ4J#7F#00{zУqG_2{Zİ-@-MT E!OtL_>wOt318D7# CRH`2tO}ч8zC[}i/ClXI1Clv)3C8Qf܌DF{:#c/:,3A ~12pX!h-VvXOKBd<=d5S+Ao\ό1$2pH#5az)ǼK]dÁq{1~cNx"#nog̍o9oCwc쑎1cfdŏ0o7s1Ê1~(T8Q0c%1j[NT<8*"t{**Ƹ71꺛]/Ñ1/TG==]YQwח.=׭5 *VXke '*^+bazc|1{E7c~+r8?9=^3AEٟOT $xߣ"nyƃ3dw#l*~sa|"5\/Tl+^=a?azgd\·{{t. +sa|C+}!e-ޙ }`Ǥ1`[pء#4b[nArE7Qj\9H5C~aը=tji݈t:b[+G86QU_XsbM䨿w_bG/ߡl=}7PFDZƃ ˾xz_q{{f@yOuiwtTy %G/:= !ǼEGg-hHxpO`ץ=;r^rp*pCMhv{2 }7Wr{*hG8*:=top>_8bݦ(v1 c\H47.9c"+ F}W{$:<'GX Iy_ȅ1GEt~}7:>Q傾SnzĹ@@oȊ ~A} 1)1;JQ.$džc#ӱtt3t7Cp%hHꐭXLEV"ו GTbrQ%w>^SyoUwǘ$OV 1Bd1P0Y|c|x?x;U8NQ9gc&+ty΅|}7[t &X,cZw]M1pU{7 ܑӾ#1HG.ѱx"qF.t&VUwﲤW]$>*]Tk$MzV ]eCPp3 -8t؂>"_w?ɉW pD'f\U$7+7^I*XnN1.J_[t |-2c:'flxgsIAk3'y_ͼ}6t>~is;wg~78lnq|}\J枎`sKx9 x9rs;ƷƷ5o'=lq|gg\{_'s-ϙ7x>Gl.i|[OT}^[+k;KK䭧68686tF|M EWw7m9)_Io)e|qKwmf󅇯o|]w̧wύR>9r[G^))}xx|{wGi|Y)8; 6Yߩ9;+"tJzK3-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSꥇWwNYߩe}zT>ّR=|]wz̬zJzJzJcc;;E;oR{{{{{{{{{cSƚFyfQ\<` mlB7qYYYYYYY]Y]YdJB+(6$dd8 c` ^2Wj++:meJ[YVh2IQ.ɬ#I,#,)T$D`S d]fM6$Y,fc3˱blf-6 LX0`E2HƵ1@&)@0')@l')@ɨ'kd5Yw,zV]=5l+) YF#~d<l–,š’Ė5VeղjY_,ZVWm~}.\9prݰaUÒ ;箼[y5b>R꣤>B꣣>2꣢>"ꫡdat͝dAbAo{l=I'=Ճ~!"`K|oA=ߛwom"GA85Q=Qc/A~9~uϧ1~ 6C4yq;9dAx>#vxaTޘ~zhvwJ@'O6}*8>E#+O{\#N™ i۱Iݱ)߱oA8 Mw]jxBI'A28;!~ȑQ=GZY3vw~eGVߟlH$Kك)iqz8{Ew!@u|~Z¹[C/} aXB7G:{EKnÇx)t4c7b޻{$u? AoQ3E°qy P?ZGΦ.#ibxqy PD#kC c-=cwi oe~uكeބΎ޺@ʛO-CF2st @-I=qF68!%GIá10ZC߮(ᇊ7 c8PS:ڽaLW< UJvs;VTHGx=bFٿukOcT7zkc)c:޽bn ViT"f3c:`"_d@EnTf$9)RZ Z !)@jiz{3p?]jѷhDfFzZwc6{2w0Df(o`(Q<=6{2"y0`c1y1wܤ?n+ĈM|vU{4==oD&zc=YDA`DO"yPO #7)ADzoD$"b^PQ?=R{TmqSS}PWC/H8[^d,<&q)BfTȸBtnFظoF?xI16BE"))3V.)G$%GDG})W;淜BGd\7* #`d B#Oo('P=בt02 X/ʈ {Qu"嵘uןwˌzoW7dB}?X;S=8}]pom}[}f]{o{מ_{9_d]{~-keNA0 7ă,Ȍk;fI $Ș<=jQy')yOPߌ̓'ZXF(;1zpq zwػD42R{}w z{*܌؃DP":-C:ߩgs&SL~7wƌ+$J?,=^b f, #2/|75w[,좊Eؾ36͌K?8K1ݩS~XP-d_z7Fƻ/PR{w̤S wK7Ph#c"3*03e(~k ݯ_.w(~i]!%s.ax&Ttͷza_;y׃x2Tˁ5*xA<*b:G ^(n}"z^:fq6iE&3EgES$EuV":pe)7|f RqfF*HuO.$,{,}댾P*.v ?T]܉g=旝T^uOAƃ =h(3iRy=҃~3(*/NO)c>]bߥ׿CY㿪'==PCk1*fo)/ě *iI 4;OKEb'P[셊Q!:ZnfĈS_\'DHv7b׃b(̳P\[ r=-EEŻKbqT[ԒsN,Ċ'b~KESxV(-8ˍn}xx{k>9_b)oaOb߆q#8r;R? W=p=Yi'#5L>qw{G>qwhxE{5;G.q?q 'a.z8~iU~?{wO>ܢ~`︟8;=io{p>pP qW"毇?`y8G{G);c _qwxEhozG{GgyaȷO{8GE); ‡gw7>5;<\)_`E~|#S1_o)I<|K({|c>axm<F~|#S>opwWz|s[ʗ-[y<^h/pfG~|#SޕOpw3|W[{x|G[7||Ec1_`opw4]wߥ/~]wߥVoVjoV*oVޥy=WvL%68ۑv$v;iݎnGR#ۑ1)` 6w LwГ+&;M {0kL~7؂QcHVdp+ۊmE"yH(208@4=( # `(p0 2bDpD6"SFi#IڈmDFь0Qp㠧Ḱ,Qc0SE %Dz;EK#'둒z$d=XlG2#둊=` =-z3AOpM'z@=` k0P-rW̫E"jvȺj$]5r'[=ɣ?O.)ϓZ zd%'@=y(` IK/|SHJdX%UDvUwC5Fk 7,1lc0E}a}n ݊s#F}q/*ŤQ_,D}sK^Rg\]? xpMsj{>Z?,<ܜU%]pΪbprVc21׃§?&^;W@ }rQp'@5o$%i\q+s})"1C (΅Ёѣ zْ~EuM-+i@5 pY ޗy=Oj 9m@IKsۛ ρ7O0PLbö*/auz 7[2۹f/o/b+~FƬm#Mךa z^cNkWC[ n,^^o.67ƻ nt=b p"a&<$]xb랸E?j7L7na;2\* ꏁJsDEdsc@BPDFD`:gNxpN@t ׁz^G`(B;MxFhxN99 DC"Yl ^AG;IFwDv"y~<{Imb4xG?M?#I1␶~ER#qv Njx|0"b ،DE#.g1<ș ɴd[E2+(bÞ\d))9ۓL|3>qޜeUo'"bYBF2be![L|`(M}};XLM5dkcFN.!̪P2A9KᏌLE22A8)d,}0 3"`Fӡh/Q.%S#zL^"oSF.cҐ$3R2,u^/3R =fIEd%*і*#3>x|?axd%}?Q7̸ஞC/ї3]ȔS`ba4e>ߙ~y0cV?|_b>ߝ2&.M?, 3]L~pq ; w3>4HCFhVEfwgFiVfލA efU<`Fݒ.t!wca̸[2rcO63~. DlȌbB2vHPị,Rl#GЃ`(812f$3U@@U=P"jY-8?M/>)i uH8}흂/\( <d_3Wyf_O$8 ئP1pplG}l'}l=L:u9u9a gjTd\3.XQq=~P'xĦz'&P\$9H_RWT\1U`FStq#(̕MEP7M1Og>c]|7(̏NV)NŮ} !P]z˩wbS[LrT] ~kC4 &~}T"AL>C~(r{ʼnN~*근P\H |b(3"Pi*&/b@'"Nb1EQABXPTT $7(R_4 {x}<(b_ #76<;<;4D3` {~bEJãx\BpS0c]AK⡨Ο':< Ex#HLż]èx' m>9_b)oaOb߆ps89䃆z7zN {'+,>pw{'>pw{wni?aF{3p~RG) OWN=~`4\~pN]9; hv8;.|| ßqCџqw{Г" J7 s-(k0P-rW̫E"jvȺj$]5r.g`@<>z#僞H)XzO ԓ`9VDU"*_HJdW9|1tXcaqÆ9F Stڧ/֗ +VЭq;7nnR_LH}/ŢH7[M5+Кo}EAn)q1I\݈TtA~2Rak.<{x}umY$ifhD+%2Ktx5Qȥ,ȅ%P|M&ɗSWW[^7FA&C7%&TҐ%KTR4 ؞iNlMÝK r2iLp}0\&)r/Kɏ ?.\M< > > > {;2aTgjAq^><)Z%-&ib R!B"2#Y""& &IMlD {རm)$u>kzIeHeUH[8Kn4 7N:n3s&@O L*>q{C@?+{O2PMi l2Pj:Ou3ܹa;mK gLT'qD$7v=ӄciυ :z^?^DsAT1iqU=8E,LQʈQ s拈aI ZnI||q9A|lQ| PL"ByPȈQFcjǴe)8`n T(z#YFT xGD-SQw?6.#vE/+(F {)"xBİ2"E/q,침dbˢ #Eb=A g?FT?3#%?.;) q.̈qˆrB"8#XfDHˈwQ FTwDƖ’O*/T)b_ieIVCE=gQPgE92 {&+cB 3^PCz3#:3&*n02.jRUDddT)zQRUU!U#U%5KaV䭖?vз*73^|̈$ʘ9=AjzbM% WF;y#*G 3*w5(ɬ*63jBKUKt'xQC3U5SQΌ|1HO)ftU?f|"]?`XaHeDX8|*1#dE`[?̈;E|Vu~l{B2*0ctwT#4GF`Qf DF|2 {+#3Kh}1#h0c|_+ˌ˒eFfQOoH{^FgIv1㳨+3Bz2c4(3JG)_F*hXce}2^32b󤂏yQem"H$~Y Wf(W_dSJuΟǪܨhdHCFsMϠ/#:7fLQ 2sefdiC-2OE#Q}.+sBP8t\)#=g'ˬ vlC^{VifgVP|6E?z,3>G236HeFVaf'w*T $ĕ my88/(ԡHP)ҢxHz?8Abxa1)7+Hp*:ζKyO{}2:*H b%IMER$)IR S1ॢ&I!KMIEDgCs=Cx E7AH1:cH;>I<́"Ըh:n(g/hPԸިYW:k>]qPu|Q%ge g55CE*+Iі* oI89ᤘ;>:?O/C~/ZR8ME=xTi.E\R!/ERʻ/EbR {U UA^ɭa zVNbL8V++ J}0zWNs)=.B1:)QT *Ⅵ+;8a0Klc8~'oyr86pzri=: s;\8\9p 8\''=Gizd.zd/~~ia~0?~a~Nʅ#a}.|}|~/ {pף_g=0? 0?O|0O|'>p &_tt8!_u8;]aav8;q7ܣ~pN 5;G hﴟqr~G1ܯ9{{iiF{sw/Nqqwܯ{\{< _{GpSw`8;p8-.oџp|Swho|xD{]wߥ/~]wߥ/~{%Ǟoɟ[G?a=R3- ><R=-+z={|KÑYpwߥ/~]wߥ/~|URÁo)_p|Ksw)G{|^S: NĂ3غݎnGb#ۑv$u;r)s XJ~+%?ɕMIzæv̚[0jJnE"SޜV$o3rD #둍Hzb=R1S F=igzR$ڃ@I&؃`N%` E"jyHZ]-ҮYWF%٢ H=\A~$|s4K0Px `$L@IZJX"*bȰJ$X%U/>k8,1nXb0ǨaNra݊s3nF͍R_TI}/EXT$C-\&hͷ~n^>-~~kXErg[ `e ݚD,`VK b)&΂RQ ̥܆TЮM!04C,pah3YCmGP7C)V(AĊ滃ah'{A};KP HR"HWTJY Y{V3aww:A꠰; aPTn*H&VR0 Ti*邤x{AJ aJbN22HRb Ti\*] LEob y\ɳRThYi*уbA tqB2j!NhjCH["Hz"H"8QC)c3-ҾmۉkIJ"H5ٲ< IR^ viRI!!1yRo3풐2^L_9z&\8>6O Bcp:O^Msؑn̰ *~H-.*cz۲w)҆'z&aX5d@0 S ,,2i;?-c[paPlO J="uY ac^﾿0JQN(pw8C^ I(~㽅}<#69_[Av\}9N*tbsC=;R Б"3 v4|8pשк%UL}V;~?d=@}iJTSϵw/֭2nd4VtbL3ͣi,4Fp> $4op_"_  y<Ӌ#@RUi 6UnT$$/{!2NZڶߤ,,"gʚ!` jpڹmVVcZU)U*m Hyr2UxfU'> UJvW5a_@ (I7}J S bÚ}&S˦ eX誐YSfd!`VeQi$]nPXNf)Edt@> ?"UywF6a{K}67 EZy i)E[Iܢ&H- ޳;?,8첺om־*V%sZTt&*zgͥI}ԡ8z0kA4\I:}*H^ EzK{~c:xEC$iёk^$C**0S KV^d7 ^fd&pMϏC }y6_u %)qTIT CPRkvj Jkq Bxw:mP~ .t^Aq`%Eh*$\l *26ll|ؔROjڙ,c7shIkf^DLB)eq9 Y%J*6HJKfݧg887!P)'gS=JeP6{MTJZfN.$nR?%CfcP7EV6V]G.))zWKSzu<3RCT/Upn|jʗ]Z@ʕ:yuzF|5'Omde]MhԣZW[.5z]q)VV\.$uJwi՛L{UwTwXeVNgvSUb6UOb AD@!XjiC~&,~jAD _gb~pY2l6z~pT&9-^dM`QlK- [J7ŷJjÇs {?8l Pl*{ xrCC5NIx 5^`_ͩxck5>Y4Y"XܬlLnVD V7+[89V40W`'u6X23#223P3nFBMJ&`񳒹6d곾 {ܬ#bd0"ԧ`s`E]}R fw 96)'ԇ`I0ݬ`LnV.V7+ 0Yiɟ̖(`u~f Yy@W8JW0P.8Rp z? :? ? `7\0)m. 1]ڂ Nzzz~5(u,@`JS0P7P`'Gٟl`szz߂9(5L@7~? T^@ :~ `[n߂l'6j-XQo| `P=W0P-8Ro T *E"JAȠRdP)2T JMtZz?舍5~k-8fނ(k-ؼFނ(k` zx e W`PֿAg{ş<<݂k#6ֶAgi_B:v? ~(3P֫[00(- ʺt VOlG`:t?X%$Ol=7s? @Ygn  ʺr e=~VAYCn``P֌AGlX#6܂(k-؂R n p `z`P}[00(MۂAYR?{bc-'6pAGl@@6:m? l? T ʚl e-eڂ-=:bc}tƺj? zj `Q[~ڂAY7m@``PF0`7zh NOlg vOl{@w@s@o``P50E"JAȠRdP)2TؤMjؤMؤM*ؤ T@I@E6I 7N;iqځ7@v`M;&u&ʞɨ'!cېc1m"u6,zauoj 6Q I+p( i?Zf G~M4=cQk:_uVy׆QkCި!gmh24 F B#h,h.׆3QkC5QD-n ֆaQkk͊[@yz`<=Nt1e P -BFȱS9b-)v(ޢnZ 7-pM ̦bSjL4=0U#r4T\Bd xb1-̀(OvP ,S)”`J 0%ң8ChS bM%r40N1aVg 9#ls"[d%rHU"SD%HSXJܤ @ m/,93?|rV|>;L~OZ{\uZ׍";'ك8;;l'_I;OK?jHz>uR~8onñ:xa;ܗ5󦣜Gy'{<2/Ⱦz췟Y%z_ X) 'Y5߽>L(>ĽL>ŸXg?_mco}[/N^Br'3n;;D;CW-ʸO}!mg,̾B6?:oLt ӐPl]dmL~O9`owqd_]^dWI'N_FzƬ> ܟDxk]c' ?yd|?tzs'3ƭ ~gl5Vnݦ`k*?%r ?~ן?w o qFb~dmwwIgW0@;CW?f'PA'xޤD? 7xTO^Gc?Qu:b~$2w\Ў?nv}雄.Λu<>k3O+wSy}Sv? 'I[9nܿ9bSv;‘!Kk,}Ϭ~ggb7--m^YI ?+ j7?gmϚK57O>*dS+,z.&^(Tn,WzL~ϐg9_$~>'rdN,7-~8yX .8 7^mh<h8Um7Q{|?J(:Ϸ_篎q:s=<~5RW%8tYշF!MT:Dz{9?t7g้ ƿ;^AQxլ^舀 y$n^o0Q8~o{%x / VOW/zz;*E} KWzg%.os}#?]/xу s~2o'߁~ob*ƛ:bru7}בH8t/:!gXOG_9%p>rx&0{1^GŃ+~/x|6e~9ٰ; t]O#ω=|Rtzj!91^'0x 񖭷Ó߈xg=x8ݺ^ϭ6*K#a?=tGyBpux ~J[; xW|xb+/XC ~.E1_ޏzqJQw|L\OwE߳?[W~yoZOI΅N\ys~wJŇkk˟*lX_xo¾A|$u#_'p|im'1zߘTs}W>ssobs|·oqq:>_r}0_>WkuߏaXOEW`^-♝=Q<^8p%_^'.x-%w)<dzgvWG`7`1w]|8빆~o:q%w-ߟx~fn~*q! ?΃փxl=Lԥrj<ޏr&^,uni |]% ~ p |f_;xI;~Y;zA.|1x_'14\p~g~sxvy?rf'x~ ֽ:TE|b/ Ɨ_;^7׸^sx,uONsx/fmgtfּ?fˍ Z <8ο?D]A+w<Ճv> nJ?]e ;c+/c~2.čx_yy5ڋR| 4%O6Qlhya5S]LxJ_Ws{JnLLq}}K;0cgՃ/M:( {Z_ĭ=x0+x []g7ghƤ^6c "n<>l nװo_{vs{Se(ÞԽߋ8{]w?z~ {\c|ONN1x?kxWx|60^V횆3qS?_6Mލxdh}o Bx%n]/}Cm:5k=H鏆.Kؿ-̏.S|{w/m dL\aZ?MwX-ɿ]3/c0K-yU߆}hx6/ Ϙŏ›;oN&uv /}k|5T |_:kϵ<{Uhڐxx'z&K|u0\OSrm_)Eqp:7ٍi[۝!ܗ{gm˿'>\叞/=190s<^TZ/FB|Y|/#m?zylxx'ލ_BGxo$zzʿyVAo=b'&?8&Ɠ?[S&<^ic`{;\lv0v|x}lnwr,?6~ #x^$93axD˼3k~^Em;gXY0w G1;1sV{v}N<p_NDgOs60$mW%lT^k7q^c򗃯6wm-'Gu7F|`-GB;DmӟttIm^~]r,=w։os+;c<=ߝ1'`A|^<$boo1~ z{UwاMx6ʯi:gu}&œvxG4.'co'1ޢCȉ-v kb<}6n{|]:Kr/{9%9Ͻ0i![ͿO_~)a< :9x ||*\,,v'w^ċyq]fX >/3za*yosO0|)_[!f>sG~wG|Չ9^]/ܿ\+1;o770Mzą_ΐ}Rzj/g~.=mx8_O?t1EaL7s~<3ω_|ۅxoG!.仕N|. ʿ1P1^Ug'|`gx`'Wg?_$;>3ggyqE~v-(˻s<ޔ?+ϛ|>;ߗ0ƣ`ߗΟ|f.\g&x 3ߺ$; 2ϒ,w b8~u/YU?^/'_t ˱>Jļ&$L4c1/ǫGWuӿta<;0oT/uo+|xGLq.](q?*n=_{U3O 4lÝ|Os%ĕIܑ/_/{OAwly=K[q~MG7?Ϸ&} lEܩlGW|ĎjNxgy'Ooěz3"oO߻ooIh^Svq~pc=׮0G!9ޟl:>xۃG{^53|.̏} u=߅ׂ?:z׷5זgO9c|J9?<ߖ4?ܿ?.̷z` 0_3"a[y"gL9VoJ+ߦ0>m&9Ck^ޟ&9e+ZW^t֝.% Kgҙ'tӗ.=IgN]zGN݄tʋ.~eҕgdtKI1]<}a5.=Kwu>$>ӥCw#]tҥ9Hn:wxҥK@]N{4]@tK_9g 7]zN5.kPW\o x.$^.}OꢨK:]t^^_/]vV:v!tCda!t-ΩK'tItC:rw.}7ħKCoΎ.}SW#]:Kҥ+nn:ХoL.#t 71]Z/ХQtLTg`[r LgN?ҥ' tKI:KN!|V^!C>7u.]:Yҥ}tjK7{U7u4ԥOϧK.qFӥovKg^t:4]zL]\ON}Wtԥ? ]69tkAnuK_+uΜQ]ey{Խ.'ҕa:uפCo/緤ұˏ-o/ӝ3 Ott3Q.tkpR.ҷ(PtY.yҥ8~$Bӥo͇tK߅럺t~ytCUׄtřKWҹwtK#]:Kyw5t~z=.]:;}.ߠ{]҅O5җ.=8xK_ԥo_6s~CnunKW\tMtMK7ҥ=_S.8z1⨛Nk]yqԥNtSf~SnuwK.]uK߅[)t8.ު.]ҷtߖ:*y&]zt{^ҥKtLθқouJ>ÕrKW\t.h>STҹ.]yަKZt.=_I5җtԥwKG:/OtR6tUc+ooKWPBt.]yҥ.}uI&ߡ.}7oKW]0ҳtԥ鐩Kgқttҭ3ϮH~ƛۚ.]ucKO]W+N]y{C1;tM7ܻtqU>j)]:.]:u.~ӥgK=.yK/ɼEJХ9tSyԉO9yHK7>ucһHw:u%ҹqt겋3z!qҋtċ:K_[iҗS7uylC8꾛`_KW^t鬻t3tyAԥvbtӑQ<wHgN>uCyKtUy{Sxԙ+9t=tey>QTwEEHtХoKK,]zQ݂)w 9g:t˷t笓Z.}g<@a^Μ:|>)J=Kҝ3o:buau>7[uWީKґP>t&?CY'T'|M.vs<;uhONҡO 3oJgԥo).]uѤKtMI>TW*Х'~oK7tPn7ҷӥ t9ءK[wk.]Wt ]7K߅қ]KWҕ?dtߦK7zԑf76L߻t۫:K~Rt).]/寓.}Jo)KK%K>Kg wtL^ȿKgt]:{,]z%?~tꞳQg]ҵoOVKg^On]:w9^_KgN4ϧ.])ҙetGҷzR٧tғΟx| Ui8v>u߼]uMtԥ7Y'1]zn]m֩s'o\u\71[ҭs<ԥt:9?+UX{w']zNޢG]'uƧ.Dӥu.} ēv_w{]jԥ~{ХS'gt_.]u~K.=}.tnwҭt6uS#]zK]+KWwt:t|_/̥~LiK7]:uC.I+XJ>>H}.=KgNҡ_4H>/~-?:.}}.]ͧK~FCn|Vt}.]uSKH:ҥ҇tХ/#K:ҥI^txҥ3t<]:uK|܇ƫB]zes5Wԥo[o["Kn?dWTt'tsS+t̷7]t{tҩӟOuQ5өtC3?KJ&]:ҫtMyK:ҥ7› ]:IL:.ҥO>w~:tG>t?.JmuHy}J,]:LKߺS,m}8KuW0Ks .}ק3g_-y|ީKg0ӥ gҙL{ /ML]ҷGn]։|p؋%]:K|Ko-܇tTtg))]:F.HgM]:K_IߔMx 3|^Rxt=*9˩[ҹ ufKW]'tJӝ`uH~Jg>` @]H.{']{z2]zNԽWb9.gK^eoK߉t.<ҥoQt݈6]>Q|*ҥ/1]:KO {/]:aL>iϨK_(]bCmR.;ӥcJxѥ}t;tuqҥKE]ҥ˯ltE.qW3]:s/]FKr_Wg^tUԥoUt'.}tYw\J/[u50ץNQ~/J}SǩsG?uG#]kIo>tҩӯ3[L.tM͋ԑS {&,kv' $h }qg/XKjyƏxjꨫ9o/\ySϼt~GԥӤ3^#\zөӷu ȫ:uš>;a>ͥ3Ap~Zɓ:u3ǑS'..} ]~NIk/:}{M>k:sitWuIk˵[wuq}\z#}fΜ<gt]μ=K:s['/霁 Kw{{ؖk!_dLcM]#:uɋuvμF'/:qo}ҝ{`^:ut9[ץ@O^zsm>6:}vI3|q˼nv~Х\uwKQ'ѥ?/]z5=qz;o9}lqҥgԑ7ĕ߬kaY7hӝ߱St]t,'3Ƀqץ;'?}{pKwKKo*]st/u.w}x~Нqt]}ҫn 9|\:yپ_ɟ?}{9u;.WtG>5T6ySʼtMI_懷K}^tq|>@ޟ>@l7N}ҥ?ouxҙ?.9t\@楧cƥS7Nﰺt\ҥߺme`f~_ӭyKWny5#edv9gJ߿.}ҧ..}ǥD2]:wYg^:n~8o0Gto_#>x\S`N.}x3ǛO%o'.1]z;YrUN|s[n/.GKwtW\'_| 5/ݼZ\e^2>E˥C#שYp2p*/5}qwCӐ?.=y-&kť׎K7̼t^t-Mӧh_.}Kwdt%/C}3`dL}5uMo?Yu93Ϝtq默w}onҝx k?.m\zMK|!]Mqk\zp3B7.]KoNѥ(uO9s|~ץoKwn.=>>.eӥ }u<ޟ.}̯^߭s_:uwv85sp٧¡7ǭO6|>['O&]9>~\/MN҇-\j͏ť\sGpӥ{;7O<ϼtO^zq}}\9y.}뮫mq5.}&Ͻ&&>t ;(]z;۩ku¹tsRt5y07Ig~E}9Iy:b\t}d^zK_҇]_]tof^ǥyKpYMoD >󙗞>>Μ;.ܛ{^{W:sWqQ>n]zh/>K_K~]K:s&/h^:3/=3.ytҗnZƅWdK1tts)n&.=.9X楯K.M=97Kn}ǥ7ӥ߮ |o\:Kܞ}߼t].ݼҿy~u5XS?]z /Z^yu u/}F]]=/y{vo8}ySo1ǔ|bv~ϑҥ;K 7Kw.}{WmV湻oӺf~w{k_p>;o楓?ޭw4Kew76g~qOKy-:y<3Oo^>t.=_iЙr/֭.tr\7kdnNԕ{|7~<ǥc'߼}S\틋.ݹt3;8y}ջ_.}95K\̼f <\ܺǥs{wӡt!ޞqK:Kǡ|Kw.ypۼW\zӥK:a n}I.4LO=K}q|ХK.: \?ҧ?]M]wҧN޸>ԥopz͚{<ҧ8뽷/FItӗqSW2/ۛǗ7/bM<9t_|Х{}\0ƥo$.=uХ/0qQѥo_]wKwq}|\zO\OZ~wRvNjӡqn/o|bdϹtĸtҥuC7K>K.}o.}Y/ӥKFsEp'=\v.˥ʭG߬GO:3/ut:o\?v:792Gg>:sM0uU׾b}.ov:Κ~9ǥ;']ctut O^zsԡ+FuKO;ĥ/{K_:j4.2Wq9GqwQg^zsM^֡s|8y\PNᕗ^?.gEwU_֥z9y\yt:u:09߿\zݿ.둗Kt\z8]X}̇יa{{ǥ3,]z泇KOxҗ~5Ν|#x?yE7K߻9N=t{ծC~tG/5/K7?ؼnҝ۠K/'Kwn.}毓7_ӡ\bK鮣W^:spɼtTqIt#۱K_t95Νm^K_:'>/׽~+tKױ=҇y1Xߞ~^tCNz}wy<[7\̺rw58״}ާ.}yj?xq黙w.=?tץoOKZ]߿<>xz~SqulM-_qӸw{tϗ'KoѥKϼuׯ<ҷNK'Ow;KKOKw.}˗.=,qnݹHK8y]yKzD>}ǜ/\=ҋyKgn˥Kg|oַǥ/ޛn>>Konz JK_u\K~G>.t?qI.֧ p\z8I>cϼ[N_^k_Х"K7/K䯧Kau/'/֭S'wÝե7_?Gz}W曻&%y gC.:uf>^v\z8] ХWKKǵS'rn.:7tFa>z{~8]}Eź|}å/Gq|h\y"ҥ4q^Kǝg7p8fҕ֥30]ҝpd^sp2o!/=C.<\g^zѕ?uitn؝vx|+uiҥSKn~.ҥK?󧷟QG=y8y25uw9;~ӥ=WoK=:t|柳KN_at߿]\7 |]68f ]zxuGQޞ=m"ǥ+,ɻY^'KO]gC1O̼XX/USԥxu]Yv~ߥ;mwzv\vӥ7uo?{uM[3OuG]\ut[O<_]qǗK>^tqK'Y׸t;GANW t<}q3OFS֥-u8p9tҥ<8ϹtOw3/}]MI\v΄.}z,yқs ¥ǟ.9bt~G~79uԥ3Nus|8jҙۻN[v\Sǥo~Y7H>u$q~~t:ҭҽ=uK׼{>]s856_e'׻w\OqK.ݼW^z|^t֧}y7[^kz/oקy~qgҫ~]_ߙXt/,t8ӥNzu=.輫4_E>.=k=uKnwiGKO on>/ uӱ_ݤko/nKo:spݷ}Cn>|g#x}q\z{þ8Kok/'/=4KOt烦KWnޚ.]gf^xO۾BGIwŹ&e#o:+wv}q:CNt;}tYg^:|/N^zסvGv9.׎KK7Pny>ߺKuC>}}tys?t^u|Mk\O7]yGzgz.}K:Kw..}f>}m.}ۧg^}׺t;>p:tӥ;YҝKKq]%Wt KwnnK7t8w9皾B}{u9uSn_\?yrm]ԏ3_v\n߷.=Ku̅m+Cd9N#\z3NK>۾[\{{ͫkΜzvm[~ե2?gbs;cX˹SwN_\p|c ]zw{ӹK եe^za.3/ҙ?]N^mt5\PK/s.y噗^ϺG=;os/\za/ӥu.ﲾM>=^]yE.=KEѥsMI>.8n>'8vw}\I˥~nSg;˼tq;_a횾tqUn[^t'һs}qk]ze}^:k]n3wfb=>}):1]z揗o~ӱCtyt5ۅS/ ]st˼</dnG\Nvu]թwϼCo/ג.=̻Kqٙ.=.6/_pKoo\Qn.z.zo?G{ @|K߹t7}ȇkq1/K~å2/}qҫn=ӥoN8^ug+:u`}o2Y[ԗ17/}Wu[/swN*;Ա;ҽ:ySy~?.}[:qh^:90ҋ/.ݹ&|ttKw~^ ^]#/8ҧsZӥg6r;S>hW\߇yz8O|oO?..}/'~Xyåҥ;H>tvM}^/䩯7;_vՏK4].~{y89 'K'G)]:sFӥ:pxpUqqߗNm#g_]o.}K_N9#96qougĥ zoSnoQގ3_{ǥKOw?ronnHӥ3`x~å|>8i̙ 'Kߗgsw}ӥ7qu}.|v]&\oqNv]9[ToҽNys;sRzv#ץKoǭלt^x}ty-s܎#ϼuo.:+[NNt2ҷ.<3z~~t듺tPwժCXGuwkԏK֣u쏹35sRs+VY?onqӥo|SKg6g~̿ooo8ru3׹֙ԣǥ3G%]v{oS/gd͚9z9G^.9㙗>uޗ]w^_ן oq陏ޜK/:]G~~9қGtz9_tf^z=y0ԩow홧N=w\ǥ[<)+ޟ~kå[q8uԥ{at~tC_NSzo|~qs.ץ\қ'M^:ﯼt/:ܳxҙC.}[ַN= /XG^t{+/]ǥ;A^twҋm.}ڇ}{{=Ν|Oo//{NݼΚz4n}C]o{Kżvҋ.y>w]]^7K6߻د}]:9/w5+?tͫ7/}/Ugz~ǹһyMG[OnNŚ̼Kߗ[o￿Z{^±+~gǿ?_~FO?_oӹ3+νT޸{?O:{сù$νtqEgs/E{1?^\Թpԟ}8>tt%u8r}{5^t~8({i܋N^>{5^2>{1^2={Y܋}8n>{OS^u8Zt܋^2=xq%]x8Bνpys/_Gs/f{Oc|A{>pEs?^8 ¹e|8s/:a{ZS^s ¹ν>q:nW(s¹b܋^.νù8pùt܋. 婿ӹX8O8*{1^{Ĺ&νs8qgcC==vEs/{i ^n]8Z}ksU7ν?sNs9`- s/9㛺.s{|ys/Ecͼ{,pcw_8R}>{?νǪs/|8Ź }:Ĺa^xspEs/8۟9^#{W}?ġ;ùޏ9>j:Bν^tesEgν8W^νTtŇs/oҹq^2>{q ν8^+O8(=??ps>νOs/~W( {}z^.y8sҹνs/Kes/tù8+o~{q νGs/ùby82w^ny8uɺy׵qu3ks/ue{濇s/X}: KGcw1{qν_s/7{w2{tKs/Sg4D^/?{YOpEs/9G!{?{Y\?Kqs^/ uw\㞣 v8s/O܋spy}s/ K^nv8ù܋s.p>{=pKw@8+>s/yXkҹtb.ν4pùKTto{9^o?Gopù%{>wqyĹ nY^rNB8|@y=¹^s kn3-p~zq}νp?t^ܽҹK=n:)pż":N^ }Gy3uW~vҷs/}\dXq^܋^O8ùys/܋8r5t%n}Q8bνpEs/m{桇s/]K~y;{1^[ŕg<8wϧ:w܋n^¹p5]tuνq~?ѹas=pz܋}hG sӭ_qy}۹3:3sXvEs~s/e܋8܋}8yXWs/7}8wt?s^ν7s/{}܋^^u8¹ys/s/ˠ^7ss/ҹW8bνw=??_Szk{aֹܽ܋s)p瞟o8rg'멋_ԃuԏqO︶ziw-{t^vH8g=qe|{o^YGߣ?uy~¹qs/楅s>νm~!νPҹ[ӹ[_ҹ'ν7{Rtzyשs|w~;b6zνԓ^u}%y{ӹXtչB8b=z^ܫ^okp5}8Z=e}{ީG/Cty~ǹ[?ѹs/9!{¹7{O:<܋8w ?Kx&źеS?n'<{νsq|ַoouu޿8w8ɚwKǢ;^sL{n=߭oνs/p[l]{q;G0 kԭo/'ks/ùO=B^_bs}cY3?ν^s/܋4x&ko47]pǛy~]܋spSm:j=:{uq5ùf~x8ZuqXS&;{8q目Ա[/'uĹ νoOWs/^йνpy=sD:ƹ[~gqsz=pEs7{qν8g8w?йsνsGnν8G ^^Ĺs8sGc~?ùνpqY¹=78s?wYS'8pY/ sLֳ?ܟϫx~溽ܟIIgMԩzof{If{8œ~ yh:Ĺiy8=܋sFpK#~Yw_/:H{ѝϬ6];{Q_8yu{\O㖋Sn= 9:܋s|pxqŹf8w/չrueù=ν8^y-ޞm]{zs\_Kѥs/ù'{~Kg>{:).ݿ{љ?ѹ[չs~s@^S-Y gs߿^+Oq=_ܭ܋U^tH8wueSv܋82ͳxEN_֣yWo{{/#ss/sS^3s/頋S'ѱ[/׽}qjz:+Sh{lփƚ1nzs#pOt{i6Wnos6u~[o9xqt5t@n?νs׳ܭs/w^yA:ZN^Թ8׹[Թ[ҹtŹ.8>{g;m/qWG^/[YSǝ?N4{q :}>6ܟ:;n?9Sù|s-*S:wԹ[׹^2>{)̙qԏzyѽ܀pGw߱;1{--;7>ùE:W $:N<{un:[ukpcݬO8veg K=qǹ%{|pG?t=]9]z in.K׭+Ko\^pNҳ-]Iҥ7W 6yۿut[u=(<\ץK..|^׽O>tꑿNљ_6u ۭT֫}\:t>~]L^:TKg.txkЭW56kuut].}y\:Aҧ{X' GK!]:N ]z$ǥw3`ZX>sOOmqw\zүK/qI:u8?Enޮ.I]:ӥXu|bҝӷwpK>/PgMn^.}q͓R>t>@ěuSq/uCyХ֕S'i: |Dz1_VsI;ǥ]nu:_\5>gdztwMzwoOݥfKu۾n ¥Rҟ:skȷƥ]rJ.gjuN\.Rgץע3OqN6?{=.=\q|ҝKY:utӥҫ=#ۥ9>CL.]רK9:.]K{ץKwKǥ_?suܾK䯧~7/kY>6\6.N]w;}vUg^7\CqϜq^/'\zwKo:uI,ɇ1ܺf=WI.{n`\։]#]z#_>K/:}.qrҥ_a]#>u]z_橧KǍ/ҝK<\zo_m}?wܛ­k߯GK[_<^]z¥jx)\]ۺtպA\3)0>uQym[q̻ť?SLk8x?Kҟgo~?Oåֹʟ:ĭӾnp7+ܩpcy=.yn7b=gK:nөt;kl_qm_`=c_:>ҥ_>m_ҥm`ә?:u}t].ϯt1uM%ӱե3o=]z:˾=e[qҫ}` ~\;.#Gn|Kե{w\G߃.ݼf]q_ѵ,{ vdzrM]1;}dt.6]kҏ֥Ky-.ΝqE>zy\zוGx֥/qťguKǥ_wBA__/}}g˥{E_~Nr;K Ouo8zo?z; nY_85˼i8tq!d]eԑO]zqy=v8pK/m=?묩ӥIܡKONӕ֋5[g~ץڙ7KOW'Itmst.|Pqz}_0=Ngs=ӥKv\֭no߯.ݾpC^t#n.>?]}Ϻt~åue[/׏z/׋yҟY3w]:r#>=.#ZXѱWngԥ~\ҕzN.ݹǥ u۷KE]ϧ.}o.=K:~>¥tҧWN>E\6}'kG7f9ַǥIԥK[ԥK=spӥyK/扆K{N}ҕp55saV^uz~å v}ux/zɸz8_қ8K7Cs_޿KNsӥwe_arS?Mߛ8ۧ/ҋNG^^.=~pǥp9kCzD>N^yno7KM3~8'ұO~iM}3ֱS.:}~U^tӥ;(\KO}ŭ:w_:vǷҿ3ohp>ǑJt΅Х;C^>@8pӺtҫҹv.v=_t:M]NP ^N_\יS-DZK/ .8/]yֺt.ꚯO~ߏKrgN.9tu~ӥؙ ǥ[ť:]}:}q1Dwlo~wξھz.=K.΅]䯗b7}p鏋ףR/yt3'}o]sWpS~^=<䯗cַo9Ofo/.G.=^ϙ^[~K/ۼޏK?uҝ3K|Kw˥wܞ3]:.]GKw..7]ҧصsMIGqu#4>tUG^r]ϟ.tҝ;KtX.}q[K'KF]tq>'=~#t??u^^uztCw};vz{Og}Jt?3/~{<3yѥַǥ\ǥKwq\7\zޢK'2]sp鵞#_W\u_/˼tzC^g=@z^^3Lz):+uqߗ ׳Kd焑~s7<\SХw]|w+?]zә_~RqUwNX|ҥ;wJ꜃җz>ul58r?oE=/u\o<\z:ts998m};uz`KwKޞvtүKOKtYuGK?:..뚛[:tw9:sMwm k<їOz1^y]`pXt:\z8]ytK߮e:ugǥ׫K7Uuue̋:rGĥߺνֹ͓W.=z;.}ȫg_|5[~owOΙz}\4=]ұ_ַ?.=LJ]\]:Wƥ'}ynǥ7ågN]t9C\t:5sR4ߏ_.=>>N9~eNǥ36]z|~O~>.Puҟz]ݒsMkW]ӿ=t3krKqչ~'=?_׷n?{qzſ]zK_[q8fr;7sʦ^uIMwN}.:]z[sNbݨwzZK/WǵKON=:>/Sum͚~;7қ{ۅַ۟sr}ҥuM{ƥO.KqYO^su[wNvON>w|եSM>?O3OG]; smӥg^e?xusfu kb͜x=_.ݹ33ǥ>n}}G/ԭo]ϘK޺r<}Sz<'~^iΩv:[Κ1n>\tΕХ;7Eߥs3Lg^t^.}}Q~|ҙjz~Хs{wqY:trpܮcǥ]:oooe=:*//++s.}̛saSN.˥nq\z?~?ңҙ.KYSwYnoo8utc$M5/]Kykխҷq.|\]}tKu]:ם;I^t~<.낋}{|]V^NCpttҥ/y\zסGst߸+KyMgN^r'[~[IIn.tyE ۾3{>^z~w{Ƈu3^?^.}{{W]S'.=Эk!܂S}e~Щ׼tһK/nǑy5}vμӥO^:yE7W]NPuut.mW~wX_:Kg~Qgh4#~W37mIyv8tSO|םNuIΜF{߭^uߋ.NWKۥ9K/p|zGw~O>.>Nzsݓ.]Gvқ8{söo/=k ɿ&/ҩ҇N}n.Ky|ƺ1ٹ=?.}3Bu5on/|q\:䕗m7]z9>/$߼Ч.}ݲP<8_+K|}{5oKI]z:[g>^}K7_YJ#]zig^:y|>up|qo9nuɚ:DթSHn^˥?c_KzON.=Cƥgat来Ko\o/}~?y7׷gw̙]y pɗuIp홗ΜСWk[q37wK3]z>sq~1/ݹ WoZk=#_t2/tuk׼t~̼܂K=Wtp)[K<җn^|?q.y/ҹ~NnH_ԭs|p4]^پX[wN N8]q:]]yǥG.=u鮛y5}8r\7iw?Kp_tJ4w[3F5/ptywq链2c#nH~.ݼA]4_>ypy.}\_Y[g}Ⱥt~uWK!3/} >o]`m>M8y-8ut_5νk^vtc>xҋn濐#oμK|twҝ_q=Cw׽?}t^]:֥͗7e^:e^Vc"/=k!ݮ.},;stgqco׸Kӥ_g<r)']2~fCL/r_ht.}^./]:g^6^tuyMK?q[n:x^q8yۯ .=缥Kו~ury}Kߺsi{ַk\z8 ]z晓1/.p5.w:եgKt~ԩ/9}\N}{_]+>Sgy{ܟ0/ݾ_]yҟ9V~K7]nbMG^싋_ҋyq/gKo3ގG~kxGUe>ץg{t3/rM};O]}:N~:k[qב=>n]3ɓ!N~9un~tԏ2/.}~.>W^zޞ;v/s2/==N]9^q|wks0]ogz~Kw.C};]zg.ݾt~uw)>zoq~n}kss }y-?RX35>N^֩~Nkt᲋[w9KOKM^trqKǝp3ґ_~ȼthҧKҭҫϼ/~˫;]z:˼tJ^30ۋϗNz)..=/^Y]z:q\zKGYC^OǥKױNޑ.åe]zQץ_'[gn˥?.=U..뜯t: EcttuӥW»G7.}s|ݼǷuu6.6v)vt[]u3YR]sK>G^ᅮ^^XK=>]^;ҟҟVӥ7b9t=IZҝ#a^Kwn.}:rq楏Kt9_ƥ߫K/\O8/Cky8^]z7(қ;wu֙Jx[ⓗǥg~:}](]z oԏLϼt̬ԯqyw^s}:X_w\n}üǗn3wj^Μmt:trK7]:d/uI=׬o&<\Kw..K]st#O^zvS^z~\zSG\z=]W]Stct8uѺrWtԷz4<̧o\ [g^]s}QGKO׏KϹ{KwNy|uuԷ.=97~q%o~].2<]:4ޏ[i='N^zK.~_:r윻:Y[v;gܿyÄK?ytoKe^:ϺE:tn'W,tqk5rk=/ԷqYm6tx\}o\3o7S߾?._.}ʩoxo:s\.r@!mz?.әo/楛.}O /7ҥg>ґw:/mogNOu5Sp;ץO+7,.2~eNYaMtu;8sWu/:y.=J߿.2ϻx|KOg.9uNZ#O/]zå}ҝKϥK.y~K핗ǥo_8sOn{^>uԷ7~.}/ӟwK.|L\z5Zμt7>:y2ҋ]n85=>oOg^^ҥSGI>̃ϼpaKKA?yg7u '\Cܺ+Ϋܺ3̼t捽\7/pʚy{FpռA\z-:N^x¥?/ss>^u}qvM_a Х7]5y{|?y~2/Wu>.#:m\Z >K}\yútK7f3/֩W;ynKݎ#\A.6q|Nͧ뼘y.蒋 [NB_=.hK.^&//|ǝ_G;/nv~_g|t[!6NμtK/t 8wu楓['UnU?>/җǏK'ᕗ^tռf^;y?\[K__.9^:}{¥?y?ud"måz;}ҥY߱k'楧pt]+/K/7μ\'vqם.yoқ.N~|Ͼ=9/UnߞٟW\z)]sjt8..yRqՇh^z|Kot=:&\zͦKǩS7ϼ+'|_Oӵ//KW+:t;N~':敗.ѥOqu>ޭ3g]ӭve}:u ҥy7KNy{k?oq8>\2=]:/u鷎G']zݯM]:߫ҥOKg^[3ӥ:y2_¥?ǥ{.=벺J_+/}|\ߺtϧ̟_cn²nWKӥ/d^kƥO0yS\S.}ko&ߜ<u.k]z7?N:]z=GN>7Kƺ9o&/=OKqҧW >1ҝӶuu7O\ǥK|K<K_:xGpԝ7#tMw~Q>.8!]]뽣/;?Qμr\7CǑtܸwy~>.O~܎Ktqw֓9Pq.3//n{K>tฟ μ+sdN:'/͗ѥ SʼKD!&KSn˥:#x:t].ݼm]zgbå_:vd׷~vnבo-oOL:sp̸t¥.=畦K7_'\zA¥|]O~x./Kx߇ӥK䥛q\zu\K.uw͓Yk>5.8]z1/|k[~t)fqǥi_\ӡy'/.G{EnMvsu[>ǥ۷j^V[åתső'KouרGS~㘫}Kw.Kt u楛l^}ҟߍ>OnqKgzvG\K/:tz֡}ׇ|7X0uҟ7_ݮs>.ݹǥg:}v鋋ӑ/y|yKK6ߜ{|q~֥K-Kҫzԝxk~rEΜK';\z^tx8\z+Og>.zEix^?.=q΅Wt]pҧG^un,.KwΒ.ڇ񞳤K ҧǥ;GGCvt.]gK7ڼt~IC]aBt?k.=:~ӥSg^S7=oՑyuCOqyqҥyKC+\zg͜TqEd^n\tνҥ{=`^z>=7k58{\K0\s3ߵg7\Gz6EwND^ǥ{.Wt7sV;k3ɗ_y}+.s}S.=*dbq;9[N~~C'~UҥKO^uq}Koǝu΅յ[g^:s?.fs祟_|?.}\;.oեߣCХ.tҭKwN.=3/[O=z}]z\Sii̭[=_.=ҥ4O^;^~~_~vљS:u{:uKtSN^pOҝKjy;D^\:s8+7kd8pzy3qCw^߿t 9hӥ/\S싻XS/#]s'tuҝru΅ձqM?ԩ}?)]N>yҝK8t~<]zjqo}(\q[o0/oTyoUnl#xg{ӡ׸.8sҝb^zKGNw}Ι:^.yw;Νm׭ҷzTvy{[qqfM87uҥ[ҥ\otu۹ǥ9>7]:dz2ƥtC\|{k搲K'O~o޽=8_Wq]:91ҝK;ǥOK7oX.~tN|t?t]ߧK.{3/9tҟb=K_Kwn.+/ݵǧC'KOw.KO>>ӥ7Gԏ֥StZ?돓#q~v./]k_Uӥq8m};:K:u']ɓq.}˛nztS;E/.vev\l^}ܹ:uqX3'_][/q|[:t..cdw;k,OnN8+gqI^åq鵘'y镹jywgNYgMyӕ㴗9߼-KOW]uUwNuq;sWsǑ}xKWȏ ҝsK#\z^ϦKSKw3@tz4緛+ƥom5wg~]NN+/=<ҧs uU>==sHn}s}_X3t粘>|+stӥߟr.z7.}lXK9bvsMvCnt˥OK'"]:ӥ{~ѥgsRo/~ >-}g^z|k=n} [￿ZJny~P:=?/׿B_D?WoQox}\哿>ҵsvQqW{W>ù?ٟ!o~9qo [ u|U&/~k¹?~KW/#N^>.~ǹ6ߺ8s?\=pX=NqLJb8Q3/=ׯ ~_st"_ku_G]DZ?өsmp\֙Tzù~q>¹?;:}}qM]#us=cb{p pߥ_q|a~uopNܟ׳I.7ù8ǹߥZ_Aze>9>^ù??{]_7x.w>X+ָ{9'bpěÉ^v r]Ź8n@B D B npZ+볿_lӵrppers q]o羯g{g Tڻq}?/hS|_Kr\yG8F׽!ꣃ^q?y{eY};}N=spxh|W>wc^_R8u?sߏWr{,ߩNrg}/?_֗}wz?K~Qks/֛^ql_{zڏν8/ν:ν8=_8B={^/pes/sùpgbP,^/s?w8}n羯ׅvkx_zby9>\b{x?r{<^?ʧӭ=ܫs]b<o;s~ƧIx^1νq`kn1>o:ѯI8=^t}?~{{ H'b|n0[l̷scgsUgs/KߣFZ|__\¹p|;\-΃/{ܯ?~pe9tEù?t\l$}9ov~hq\ xB^.5hG(ν7sY #~=yWN}o<=|hDJv};z·G/xL~W}}8{lp5Gjf$`nS}}g/LxM;~ùg'/۹˱h.'7N}Y;>l{s7sǏw慆s+y8>#7~soB:åzd$ 쿧S7}c&~Ys=ҹWqs9]/ 3߁w^yW8}~֟y_pxh{S3Ĺ)8F޿/Oۋ#Ǫc 7[^Sx6]{n!@\ùg}N2M<:ۻ?;su_ν6rs~o7z'^N9㽯c|Kďs~Q~mn?.:`A._7>{z1ϖeZ/s/:5=olq?޲?=_#so|>{ywxJߗ8|߀sy8s= }qw^ұy_7_>}pO<_:K{}s+ƥE^Y_c&k=FW}OWO_gu_ڍkx ~xryr?q>];߷޿^=8}|=6G/׵rWpOgmfly8}~W/E6ƷW\8}|޿vǟF|"mx8>sΝtg}?/.w|ݣ߄sx}6['~\tՈW¹IN۞tt\z<ùufOߺm~}ɳֹDn|X?#[Ĺ?Ź3>?S={^¹o8rd8}=yi/s:<_܋.;y羏׏`N%-ƣu#>p{<^1L8/~?mùy%¹S8j|8=޺QF^x_s?A5>/~O%˴yx4yl:z9帞sK{G|羟l<}7g8|{u|sb|?AvOgހ^q{[q_G<úwپs8|Ҟ<,ڋpOlߣ+?i8>7SOx/~;}^>N{k@u&pos]{!~ko^R=_B8|}:鬷>pٮ{8|d8~sН;H8=յ+_=6Qs؞ۧ['GO<%ޛ,Dw8"m=px+sާp~ 羏w۳޿w8s/m/G8|s&[Kķ?O<u9=^G[~D|yڞ1ގkw{[ď >^;{ ~{8^wꩳ}S>k mY?k<6.?>#y ވ[_7s㕇W0nю?4¹xP|1>>u#x1{{Z:|^~xZ˫b훺vѽ1^[8߬{Qlw;t=Kg39¹9K8.qi%OEùM:xYoUwKg㺾s/:J~K^|DKùzpy¹n|k'?:/|۶R3>ux&{zu!'Du puxx=/۞=,Cs9k?;8¹=/_q~W⽯5ߚy f[W]4^{g|џ.7{Gn>}/Wʡ[/L->2u3̷=g8|?sI8}uu_qƹE8}hߴyǹx3s~\ױq|KݷؾW"ޫoԹ#~zďǻۏ7{֛џqyu3ökW7.-:vX83z֧"y¹{_z\¹g>=϶zup| GNùH3S^wWw>3>~o:8}m֫{O'O<2]h/M>8N[8{ډ/]/Qpl^6W?t~_'Nrt] .=.v .=.Z]z?oΟX?܍.]wZߙ9a]}*N]z^7.puM<ҽϥKw?CK/y _Νx5n-]]:qt.9\z:6\z:S]:tǥ/?N\z\=GzyZҽҫPu/peYNõҥrԳǥO!\Gfwt9~>{o[qsK^qzqҏ}C|:t.q'K>^[7AK.ҥźjb\G^N}Q^.w^!NyzzKx֥ۥztӥԥfqfqܸ7~/yu>GkK7K7O']7]:ytǎ^[/7s]%]zΫgԉk|:ѵ_oqƁҥt쪟'Ϯʉ|:tx^u%+qKƥW^..=ҥ;/.t3o>yq^{7n ptޫK=.ݸ.Xnxjo!d".~}/^ݞpYk\:!>.]Kt_'] ^åxn^Atkt\z=ǥå;_.ԥ#]:6]z~\+[]O7c&/n.=iå׾̋G\zK/gХtꃧK>SptJCѥ7sBPD^Nn .8z\:5;ҙ7G^:p K uǥåI^qnKN`M +\z3^dbӱc¥ҭ߁KOעKz_.u9E6.X? n9]zgާCChG}ϼȓ֥w\:,7?\z.ݼ@\z?űlSnK/.XU^uҝ'QS[եK7/OZ?<\zqg..=#.=]ytqoH^KOGKI]y\tҋp@t:.=/l8t̓J=r\yt[ǥj.̳+'ѝwcwK7D.=7ǥW:7~?\zl8t!]{/t77 \zQҽ>3ul_ߏK_spa3^Ʃ^7K/cypҽѥitpK7.}1ǥS,0n8wm]t.tҗ8*\tt.Nm\:yK׌S0.=?ƙTp*}=twp9.z tиzc'M}/x6M]yw.XY.w^=t;<:toq.qϼať{~}߫KہK'][w^X}\z.]KOKy ޗyqs{m3O]WqY<]zsh \:ytws^]zۥťҭ;.yItqhx˥OW7=u˩/ߝwzyam/\pK^x{ޡ.qߏ6k< ѥn[7?hK\|ۋK/:O<:ttģa%9שn_.qyaxytďiy!u\:N)]zӹK_pup9o .txZN˥S}^nNNUN˿{͏H<Xe]1̻n?֭ffu\ҩ3go>~ץBt9.z쯎տ~7.Ήlx͟H}ñ͇ץK7~.zút}.WCgn~Gԉ?:u򭧮x4oK/#¥W*Kg<.ϞNz:s8ccǏK:p_uvt~\z|p=a//پ+g~ŷӥ?.yҥw2^~t ҝR.Ɵ>:n>lqåWҫ?qOtOr\]=29~uҳ:pZuҋ'^N=n>ԙ+<]KWu\zg@q:CwRrJ\z-1եK/{qߺ\C/1.K7rqKoփSNyfAvgz9)#!6mȳ>;uΜxys9.=ƃitqҭ{qc.=<.n9]zܗӥ/]zҭ_KԃХ7Z/=i⩗ۓ ҭK8tKY}':t$ q^:ܼF6y8yls0t韮9\/ftC\z\NnzU޲ˢۥgD4pNpt.ޞy{:s7ki:N^ߢz׸FӝXK7.҇u3W]tgl.=JpzƺG7ϕwiu2te-K7.K^c}.텃;.K:|;^mbsS^#΀z1qS׎#osɼpHKw^]9.=_ҏ:t 8.>+s\zEftw]:I=q޷ӥO>.=ki>?/.=]:u.]KХOgyKss.Xgk]җ. ^z?֧r{t-8}_>KAsat^zәӁҽ? s]zawq=å0]ҽK'ҳ|)z8.륿nKgez鱿ҏcm72Zt!^Sҩߐ.guypy>ҋge{K~.yqu˥{ѥWgWwKt_﮿ʩOdz.9N+n_tq)WѥO9.z8㬟?\z^Ot֋M<ӥSﻘgzǮV:q҃WSkw> wKw}q=ӥ;ҥ:=~ƥia"~o\y4HZԩOmt߇nr.vS_7z]GYzKY/=oǾtMwN^ҩn4MwN#ҥ;_>.>tKގ.=aKgqs}_.}K|Kn=>/뽇K֛;?9yvy .=Ӂw|Yz'KzKו^)v:y{5gy.t.0lK7͋:tKO?n^yK.zK<[WwN=Y_i[<1ҭgKo֯$qNС?`x%߿\z:uo^uYO^\N+'/'.}7ysǩK//q۷hSO&Fu7z.%G.kӹ>^oC+yqY?['ώ?<1]yx<K;z:sɤ['p..ӥۥ>yl{4]fFzƥuiC>^]׌o'KϞ.=~o\z^z3pq/ẻK/8֡WiNj.]K~ns nrYOҫҥܟp_/r|K_ynKN^/^z\慺\:~ЩMn8tAc^tKu#{yR.åG讻yY/<]:uE~)Kg~~]ʫ^:Z~yW'K.pq˳:=\zҭ?kt]ХuқOt8['/GOp˥ot~s\Сg]:n]hS6PwۏKKϼS/ձߎ.[ޏS9/.Vg̋KK-s|Kw9w}ۺ}K7ҭK7~K\:yY/tY/= H ]z/|.'<^cޫ;M=/<9GK:.=tOҝ@޸>қ9j笗a??.it7tC7K_֧O<>r.'Nc{_q[/ih|`ӥ;/.]/]~דI^yq H}Oe]z~/y\K~K=.>c+7^>i+&]:9Щ?\z:b&^v^B=>.Ӷ^ե[V?ҫҫqu?z~_]O&Oy{pc:˙^sOw.'һ_tnt /]c]S/}K{yv:uw.Mzse`8xݢMKu_וnn|?]<.=WpCozԥweS/x .Sskg<8tq}^ҍKOߝg6];<.x.Y/zd8穇μ1ĥe}7x]zAS7!]zq܏.n} KzKyH3ctI9q;\zu\tsY;o.yUtΓbt/.=ǟKyn.x~׌םvx©Nmꥧ3ǥbt>uxy\zw_Ki;Νy^o?t7]:{R/}gN}3:.=/\p9+$:tg=u/Wbݺm!}uBxtO<.=ӥ.y)qOKo]t1^?ҽ?ҝz!J8 oO󸾴Kߎ;s]C'K/_7סk׹΍W5Ewugv2tKׅY/=]cuKM5qYyWΜayRõo)]a :5Z/]KzK/ēzm_.=KIeK/]K>ҝG뮗&^^ul_Љoۥk^:tGƥWU\zӶxەqEХ[g骗\o~S/]љo=tmI}hM⼫q5:u{mӡ?n:ty:vꔥ['n[KtZ/N|+\.Kӥw={to~:ƼW6e̻dz.~k0~꥓?닟zy\:tuK?ӝ9nrqK/9}/:tďN!\+]БK]X,ηҩ_K'R^BY_SNq7x/;yHq}t;?Y/.ݺtwExK|tnYnܗ7֙5\..teRK~8']Еot[^uʘ˺bvҥ/K}.=t^z~e=OǾ"~K=3N1ϒGx©C'~<\yzzq%kgvsKwଗ.:bߌ[nߠͼ8f<\;mvQ[+~\BKnyRu8rq|븾μtY?뵿g}xfY&=tGz.xTKw ]w:c'~֩o ㅶ7:v+|8's/]c=p.x|t=/.[Sg^S꣇K/#`tL^t uxҥW]k/:su:qvѭ}әgtwe}yc;OK__.}Kw~]ftt֫ѥ^:gtgW.sy8ХS^:qӥS"]7u֋^z=m8ɣ;Ǒ^zur}k:s;;utҭz\z_]vq~_]euC]'Nt,^s׸N?;𪗞տ~{:;tG7.җ0/8?\t: ]˅ηߛn_8N]?KK/>:νr'֥[ozN=tY/}t f^lOKqK^WY:s{/{,ۋK:xA^us|råj|vppѥ7'\z)'!ҙ+΢K/锫qK>Xt-ХK7!]+]zӱK+.tE7ލkۥ<tCҍK#\N^a/^ ]w3)FOR;'N ]G>]۳^zM^ԭנ}s|KzKqrz+Kg^KUg grt9?S.xq0X/ҙ8]ǯ.å?K:k;o.tsxveoSt!\r8a^sX,_ף.Vk\|0M`[ǹ>K=iK|^u?ںySK:yq,OM]<˼ҭjt,t: \z$]:qz]zGKzs ]tKWNvϠK7O+ƣMW^飍#gt}KwtvSѥKϼ9]yZ܇npy^r\r~Kwv6?yqmå;ץg.8ҩg>ͳKW{O|tt^:gϡӡS< u'K׉z8>;+:ux\:g7mۭu>|rMScn34ӥO9iyA=?t֟¥a算>o^K=.ybz/j_sɷts{uW~ӥ[/n|2gVKhOљ'5qy3չ?o֥g1..X.|~yaނS/]gn=z;tt^ytt..]wbt.:O..tH9/}꥿k.zqye<;^zwhq:~\w8~t8t]}oқ]zӕҫm5O{XߜqfyW5ҫ/=.b{ΜyagYϝ3^ԙߕצKYyHn..u^^å=z:>]Y/Kuӕ=Kz3Oqus\:ӥg}u._ZpvK]ϣҭG.=/?aryv]N=}^SK:q!ۥCƥ.zǥq8u6..]z.zǸ2Nt[~yaS/}fWetK73]zv1nХ7o]qdpγ^zpK%S/orwzOmwZ/]K|ץ/rNqOKO'ߜ'u_֥W{xy|_O?x{*H꽿/t/ڙwuʟ{&\uW֥{?^ۥӥt>OOt?~e>o<Ϻt/t)zu龟ӥstx^.=K^z>}8_ķG>5둳h_K5wǝ.}>Ȼn;^zƣq|pxg.=땇K/s/>g~xs<=+!.|9Oj]cr8>l%KgK_ٮ]tCӥ[OUn]]q .M~4tDszM#t ǪK_ǩ.D^GҭokGG߲>|8h\zփ^Ot4.;@79?8z|p.}龇:ҳ>:/~OڶY?K$.2C7K}atҩ=u[7!:pKU/=˥/=Y|pKҳuqp:eEN<_]uKtov鯎=\zS/='ߚzzƥgm;/.y]^.}qU׎o\:ωۥ<.}ԙw5S+қ~7qәgt].IY/sԡ}Ý=qtu拦KtK.q_K?zY>o^=ۦ^37_Mz]WỦo~3lo['njK7?Gc?tCNʙ5룷Wi}u~#k~gWt.=n=h먭~[ǹgsSG?ұozå7R/zǥrMg~on|9]륿tUg^b6V7ҥ?ǵS,O]z~{5qY_gKb^:NҋLX/yQķG:rxr7߿[WlrKK7.yupzt_םҙ76ܳՙG|_.uq鼏H>3o̳d{c륧;XƷ?l_7tg^ķKINxԵxԉۥ&S/ӱgY/Q]z}N}uK/\uKK /qY?ҩҹ>?~1@qBiꇲ?v({EO??tV>y:}x;}:/Ү<\b8}8}Mrù\=kںpāp3,vN*sOp?r?p"_8}NGloo87ڗF{{pw:phr9w.t?Co}c/N8}թn_ӵu9}9yhEѹs{svop;s׈{8ù7r{tcs÷B6{8ùpη8^ùo. ۗ;@o7Zc^-\K8}p/r?wD/C8ss߷˹Fp}ߏKK~}~>C3 }_71O@8w7t{8ThhZb8/Or}8¹s9A{_}m{I{s=@fxG\¹8¹6w`Xktp;OEb#A_שs翎lϊgTc]php{@<W8wt p(sD,gOOg9=:/I,t?խs9>ۿGh֧ ۗsS>]\NGG羏_~9~M/L{{^s5zc/ngu49OEy c6 ùr?NE:pM?}C}WVן1t+ƻgq9}?|hKיw&s?p9N8=>W=o_ _`<Ҟ]}X[_q^8t5>;t{kyꙏOG=>x='JW>=b<g¹Q^bI=~_N}x^sᲇvchם'$9¹nx;K~1~Nձ|xW{_-?z7N|;}=bt389R8wt<ѹK{Ǿb sqs?p?~{s}4;}|}[_9¹sG];ǵOۺ}=N\_'`և6ڍ jksCj}p?s=}?O,6wW^Oq{|S/ٟ8|w}}_1yȃ )_}ЭWuo|~v;|[by2~o\v?׿~s}t?{s'+_g=p"~¹ttwo^qTGsS_U8?ùՠ]?;u/ˑ}{{5+g7=8|Ѯ1:y9}˹[/M?uo8uu}_toN+';Ir=ƹ끮!">۹q9}}{cpzΝׇthW#5q~'O lTh_2ֽ?ftxt׵vcEB>b]v<#!`/w\_=ԩ?1s߯_˹o{ p_ț{~G~^?EOGǼ8w^ѹ:!yՑq= /{{c`Q [N7~i1~~u_wq+y VsIv/s&Νt݈r+m?v#ƃG'qk,~_3ފs(ؿ¹񽎝xtw87Ɵ8¹nx4ۻOG?:\xozv݆sEå_wڵx.}/_?|s?xpؿ/l1^/]{+c~?]g8v=߷x#xs:xwsĹQ=br+֧>v{<[o?}Ѷ??ѱa8}=ӱ_=cs?TޢphO>9}|џp{^Aw8}<43ƻ?Əy7~^-鏿׌o?għ:tķcs?Ϗx6y>{S'ۻ;⽝;ޞ~Bszď}txC6wF|{Z}}qs9N$y¹F8=~hO[lu6c[?y3ߗsk{x8\=wAkq{}q5s}w.pu9=ދϷ;^~p?}JG<G~?O<}3߅sQ##cȟѭfOi8}ѱ/w9Q~߰M<{1|}?O8s g}8~CO|ڟO۸'s?pT8}h/\?84ow|<9~¹U_8Wx~8|Fs}{[O<0>^b{Yx;I{˝w<>{<_s?p'}/y|.Y>u#{8&?ztƣew}?lkxupsF'8wu8{wp}i羯WἫhf˹Zs>ytz0i+_?o euX?w_,=ߧ/n!m?c1fewotģ}s?[8<q{<{'_f}vz5Y?F~4:9¢#߃Ϸ¹X/hA¹Wg C0:F~5ƹc'~#?OsG/?Go]uķx_m{'pyknGy?нsN|f|F{0u_oëqO7tO7tO7}¹x4K?[lo:v͗g'^W_/xrp?:ow~qN(}oGvO¹xh^^i_p|s?8oۋvvk>kW~3}\}oKoMi<:ηpUi7X7[,ƹo3羯Ǔ*{g~678wߋ$cvU߮q5:j~9 t3ܢt-xϯ+̃u}| $|!fG{DS>.'^חuy3\61sDg7O/M|gxî_/Ĺoon|']>c}E8b2Qp;=iz¹營7Z/kӥ.ՕMn=˥֍]gw~_.]m/h{:]zpFɳk\z׵Ks|e^ogpqS??I;yq>K.FҗnF\zG\".ݸ.[oҿS=..W]7yY<]:}ۧű?ӥKsp\:n{נ;}K>.qn_|?\;'nBs.}8]<t.}:#g{ť7eܠ>={˥Ga]q؏7tO\w>u呧X#O3?LtDt惺\z8,]Ņѥu֧ץ[utХ.nԥSo']5q?菶.Ns>~=ӥ3k^å+ĥoql4]Ƒ㾧q˩^#r_zٸtC|3O1K'/]Hҽ^3Jԟ>yq/\zv﬏oWlܿtWKo勺["//]'.=mtEһ.|p5~8usե<^qN^as8.SO^t:tvuӥ?.}n3ӥG.{O{t腼@z7wB^NUN\q˼ ǥ/} [\qЏyl6q~t:ӑХҥ2]:yҭ_K'n.sҽ҉pҭK'Sިw>~m8k\7]8Ĥ#/:u .cyv8O>yt\:_Mw|0w}>n>]9yv0KN;//tҥ?ǩwylq/t%KXy,*..YMn0\qޏyvK_?Mn.˥7#M~Wol8N]o__u%ǵǩťWpݼ\ze>p]z>$.\uC.=&qWKout]ҭKǎKq韟byGt3W?.]r\ҿ+.c+ǥ3Vt*.{)vK;ť̳t].]K7B{=]˥G.]GKg~t.}qyIn.\_8~ESХ;.=뻿kʼSGyǺt.=O5e\.=^KOGK7q;:AtH92rԥWv)vݿtա҇u~/]wX漫sq<N=jGw\:ξ9*[]{}KCХ_ٙהOw8/@CǑ㤇mꧏG^2]u{t_\ҫp]KuĥW?ҫxU_k^].XnL\z:0]tބe^\_ֵ7~vy8{u˿gSԉ;hK.\?\FK.}åӥ܏tUތot쏖ܶ_..n>uY<Ţ&ޫå?ǥ7KOK6\wFqӥ<ҝJމ7{uOu9ӭ/.utMn}K]An}8]us\:7.ֺtt5t;?.8Х{Х.uxҥSONҭKw,\yUKҿKA7c{:y{t鲻m [WǥKe|r\zE\zҝފåw.Zoq>]][K;.=u56Gt韎yf/{ťѥ[g\zHƣxԭOҭ:p鑞tuzü®Sgצ3'u6tqu9|ЉG@^?ttStcҽtԋtYOJ֙5Ϻtt.zϺt]ӥg'^.Kx.˥{ԥwptwn=Q\qtxtq"?EgNzy\:CqSW/Kqx.=wüeyWu ީvһTқ6Q=\/ҍO.=IJ.ݼW]gtyu?ե{ƥ¥bpUKx.ytKGxr+mo]N\zctyf{|ߥ.s5mqK.޺åty>sKx..˥=8/uCWN.]G.}Nr/>t׸tҫq߱ux .=Ǔ_yR?rtzzƥ{ӥ|K7:]ҳ|{{>:.M.y*t鞟tXr{?K.Giq<ҿʙgKw|K5.=2Onn#G}pqoSϏ.y9t.9Kw<2;u83nGs.x2.=ǫtK~K7t\:qt||ץ_xyMw~[n|.\z|<ӭɷ1.=ƥuΣ.]{tKOK'.~xX8҇҇˫᪫hq5to٩ n>Jt:e|_\Su=\zt{ueKTo ƣ۲^qխSWlԙǵuԷ󻎝x[wǥWoK҇#\ƥK/8']7rpnå;o.t#֥.zZuq{c'WKwқnީsKKx[n~.=w\z^.=wWޭO>\n2}sԋƷ}.鮇N{Ki]zױѺtۯmz1?)"<cӥW'.ѕwӥ_.]ǨK=vm؟zݸ}tq8]9upҗmymKK֝uӥ/qХS1]Эwy\qqYN=g]:ĥK#:v{u};:sSN<:5+XҧL>4]uKO}A;.y,t?ӥW/.TuY~:Nz9i]zk'?Ʒ/å;xj}b>5.ݺ$^tSnK_Non~pttn~.wt=.~7åχKwG]z'D~k}O~-NYש}q~ѥ urĥ[G4]:GJNtg>xѩҭ.Z]z;yao<һ.qU?o:uytaŵKydp|]zt Z^|҉OKtM7G=_ӥS+]?\z~p-χKx]s\z[?.}Kץ˥.zmtqKҙo']zП^>q鯎M}t\҉>Gut&.=K.ʝvҭwK1}oKևԥ@tԥG>u}}{a]#?濏K>~þ8a'X7x>.zz}.ݹE7Ky1/\StGԥ\OW^z5o/:եOy2kEwNLu|OL^qW9(ެpҭKn.;vt_uѥ7|tp2zqKw..yv䛓]t䙏Nyt?oKm^z5Oڷ:u+k]~НKo|o7/=?Op9btG^.]Ko7>y-Ϯ~o:4'}\n:t,^U]st{}Kߏgg~q8˾])]5_߾=\zγץߺpg]z;]z}}M.GKAgttEn_>K[nɥKo۝y=֏okqӹSwN['&] ]z]_qn'?<=]z34/=c=ӧX}qӼ_yם/KUԥls;/e\Kt@ץ91N|祻Kx}K5-K7/^t_̫եs֣_ n}"]st.}op<9.Tt].ݹ ˣOXoO|ԥLtGd^z?km^K&]fLO{9~Ec֥9+ǓuԩG㜯t5Ko:&\zq.ҽХ;p5wkAj:uؚ}}\:}ztOt+]v{3/}oz_XөϏSǥ7{k׼=8ҋ9#'~oX?nK']ԣs+qyKwj:s\ɇ}K.6<]:y9qߙ^~Xw\dPֱ8ti\:sӥI>/qק.9_;/=tn~]oޛS]zCב߬o;}>]B\tOpMe^C]stG>:t3z[3]sv^z\^͗k=I\#қ.7.};>;ǥ9h?uvۥ|Ko.z.ķKY~)5t䇓w6/w~3e͜o^:Kq~n]z7箩4u~\7.]j^.ݹO!oݼt2,]z橇KK:v׼ .rAttyK'"]ҋZ=c{3.|\zN=~y_o~ k8oҝKt陷K7Y ]]\zHnɺÙoz[wK/o:q9gPNOt_ߺGs..}ӥg~;.=G`WΜTKgnpj/w^ԡW=9"{Ko.{.tyK=޺ g.ܟKwyU'?G\z^K/~=x?m~}\st>{Kƥ; ^/q>>'/+p5Gz|s\,ҝK9`:tۏN~q]zѝqKӹK/¥\.Yn?STykzvNj<#/vN׿WKo^Oҋ/O{]#^2;\z@QުysWs;U>=]pəǥquq Gg^k7.]gKtOuagy3,:N;.%n^uIK tp0]gšv8\t:7]z:sW=_{-z¥Nu:O]']s$t>tus tK7xϏK]]z._tz[5;ezKsKo:tnqsp͹$oַ_ݺ:t֣c.=q{|ǥǥӥ_.G:K/wt@uɸV.Lå<Ν9sWK?;WWKt=c.<~K:i͏֥~g>.]N:å¥\ҋK]k~y֩C^~{{yԣܹ5|C?յ3Ǖ|ɚv nߚҿ.}et1ptEKq b0O&.]gKy{gh^E..ǾҧΜq^.1|tΜ.=\z_uxۇo^%OԥK7/=G^qܷ}lŵuGgNޭ[KKz\kwn:`=1Aҫ{O^y虗ڙucuq{Ku3g~_8H˾uFՙs|8p魚wy5K|ttvKu5<\.]K/gZ:uZy5u/u:nnΝx.QW!>Eq酾+]z+c᪋}vvN.yɣȼt 2/Kj^G\zk>>:DӝG]"]_{/.];u /]zӷK ._杇K/Ӂ?!K;_:D8Iuy+,:t7/=oZ:u'?Wi/n}Sեe_I2?>;9u m]}\zq~ sFt:\]:uӥ_nәYv|SǥsuwK;gԝ[xXS<׹)nq/sPtOʼtݴ. ['O&yvrSinѧ>.?.=.:a̧ǥ{}K9DWԑy;]s0t{f]CWauϙkv=nN>.9$;/uͼOn~.c]uۥ]dn..}:y|3/y\z>wtӥWwtGkd:uo^~k<O6{ȫΜ}h?]z>}v7iNn]-3=_5s¥ܑ^tIrM>ͣkC>v_:u;tY0/tһξȻ.}ث8u5ܿf8]ztj;n_wt碘ޝ k]speO>g7z9CgNqԥ\t>ZY&'?Nۧ+qҝO.=/d]z5 Хo{ lnk;7tԁuQnsދ}v䕧K9ҋңp鮟:u_p?7nr7>t6{|чKם}ҩ[>~n\\nCǹ7:֝7~g{]dp{A|ɤS_4ͼy;ӥq鬷K>a]:ҧmq޸k;AZN8o:}{䏓>to{=]z5ϼ˼tustt|?IK[KҝK/ۼt]yB̓¥#2/=q\\zxҫѧX楗mtw!sOF@{ϼp/9֩Gy][ ]z:i`s=NǣK:'k/.zѥׯKiۥۻN]?]}[ť7]KgQSMܖ/nn]9yyKO7KϾb]s[t.=KݺsMkEg|ХשKPx}һK91K:p}w楿uۺѥ;Cnycn_.}xo9k8btM=:åBH^؞/楗.ӥ_K9]zuc[ۇKoyn=ݟN98K9.}:K=x縦Sq* Sҥu~֥}ütKץw3?>uN¡SιPK}7tϟ;gּtݷ}v:tT.똋;㐋]縎KO.NNsX㾫n}hb{/ҙx]Sz=Χtҝ3K#/=џ_\-}.ҽ~0/]k^K/tGwNyn~-ۋyMd^zK.`ե\]sUtcG~ԿӥHuq/?]zz7oOޥSԫ{u+䋵sR]?š?t8r\x'}6t9Qs\qtmߺu\:9\5tnӥOt]\qp麖K]z:u}tKsɃo֏ooO?8?]z桗~|~۳:տog0=᝗_M>:r^OsWoץ7w^͚~G8:sW]ud^sqt:&].̼tW9a^xf^:E[1/}9\7ut\}±ԕKp8>w鏾O..I6/̝^t怹5uy~kC\XcY桗z;]ںtݑy_:v^zCɍKNQ^kեٿ&8r/5sW/z[n^n*.܊t̥/g~{}>ǥs\zeWr9?ݺtya=_K7ԼfwwgֱSԷߏKO'>osG֣uӥ~p'Kޑ.=yS~?.ݼY]s3Kw..K?|祇KԥWt1.K7KtHK.=һN8ҋk۹twt2/}꼋C~3K[\g2/~txKo3۔.9gǥ ޜkKK=ν:9wUt鯏cxq]wnŚ1|59ex=sovpOg\XS_֏q{yۙt/_:b績ͼqҥ`qەҟ/;Uګx}1WvՕԧ]=\SyҩKcK7?Z~8u;Ngnz9t?jz<>:mׇrw;wko:/>uַo[K/4Kw}C^֥Щo7:ySgN9ޗ?tחsW޼t9?7MzXS? ^E]yKtc.}^Y׭Sr:ҙKK3d^:hh(q?_??o??~{2U ~*??vNA:w~so}\X3_'5;? l+ܬ|Zsۮ; ~Y?\T8]n¹tu¹~(n׿?+g^f8s}e_psmp Ǽpu50@㯋_Us_8z {¹n?~/=;G?y˹~m:7'Rȯ_?pvy~̓ oz 羞Oy<8s'o^Ǘ'/?]8~QY{`wsVq #tc_{p5/y3ws_珗5':kS|̫O}t[t9[n_ }ks_5~_8?k2_w9uq߳8sis_>z?ֿt| G}=~qE_{[s{=}}<|?s_O9z*+ѯjsùϯºs__ep}t?:՞ﱎ/z~O8u~o<pdz?fs_Ǘu홷=z=zOۗs_?]>9~yY?o<}kSgթ߱ǿ]۵gs_?Y?W>s[W{^ȭKo}is_rm.z\kΝ?:sŒ@ùvz?ߟC~nq }-/Ǐ_>q˹롛5{'ϼ%w8{pf?O3 ڏχp|w}Tt3q}?k?q8}xs_s_:^ǻνun8>XXXs_맭ףp@a]:׿ڟ νuùw8nǿ뵿߭[p˹vW{S4Wp{umon\oNO=_uaښsx¹pgwq=z<k9?/s_ù}}]/w_Ե?q3O}=?ubzw~zkqօ_˹tw=}}¹_:;ywO=8<os_z8~ 7CqѹWe73_}>-gD8UOS~<=Kx;׷¹ͺpX܏{]pG{OϾpxu/:u|v%n?tu~gǹ5}_]ucoo\=?pV~k/>z 羏/z=_s_7 oe=z;ù{^[7*{ sѹ|Yg=8U\uϧp ׫s>ù.}oc{w}9 G^Oqs_pp?:x_˱=|zysu#o}.%gS ^os_S}tz߿q;tWԓFCuσA|_Էù͚{u~ùףkõ?o¹źgqѨvb]E8u=ퟨ/ֱqʜ'Zx' P8Ab}8yuw\3ao=A8}Q-<>q=;^?Tuܳ>υ:+''>{|:;nO{tԷ9Czڼ%z..=9yqw=#7ׯ8̻o?s_;7߻zb=^o넢F;][߮g\އs_5mcĄs_O؟yw}"|{ԩSW8uùAa]nq= ^z _]ԏ%:pO\73羯ùg}=_:ùG}<:jP=Oԋo<ӹGt׽pmz6|< >F&^W8UԽs|S~3N'wd|Z?~美WO9 oԣsc}Zi}9^m-[8}~ ޺s¹g8] h{s߿qٿs_Gl/֏cND8 羿sS _k쯙]_?; t Nk/sU¹ޞu8ù?ipp }.5)z^?olu]??pkU~G? z|Ix]g.^sߟϴ 羯ùvq}>s_W]hs|;y[C>N^=^Yw{zۏx|_꽯FkԏC}>p8{7Go?et5otrù}{ùc<^#.<꽽Nzl8u3zs¹˚qŏ߿qpnoԣ~}=qU];t0SߎϻInN}}ןù˺;xs}]^w8=bM8\yxsߟgaM?}8}=} 8OSX5c7p-ڰ[sǹ#q{}uoxhq<羾Vԯv|8}/:?ߨgo5t_gxӹg羮wN?x_8?e~8w2tps_uǯkq}s=pg;T8^{t5Wwoq|M߬S _`M6Gk^z1H8|?ZQ~t7ν9 v>oܳ8zӽ8Ĺͺ6k};\W8 =pz]X>tԣܳsݿpbM=:wY>{z{'ܳs_~e]?bt歏k^s_g}νuùg0=ZO'=/8ƹg羞e޾gpZ7Ϗ܏=Ĺ!:K>kWp̣[N4_tO>^`o_q?lXS|721W+{Śz*=} =7pn^]<_wަ3Oe/[on3=}}9^jNztamN~{dǾzK~G?cw/ǙI8ut݆s~ 羞o?Ν2{s2~z&1sp߈sz=Kq}ùg.=}}xԭWMnoW?O`z|t=-_{Dp.]{Wk羾Է3=ߎg8s=Qppp[| ~ߞG${ނs =ܳ^8˛+o9Y*9',>_sz+=ZW/?J;ut?t::.=]ud]f9.1];֥9KR.M>p tjqq^צKΗ.>k¥֥s]Ko]ל.7|?S:+ ?.=O]#]:}ۺź%ںkҝ.Μ=}Iҥp]Ko0]:}htץKG{ץ>^>qmC\:tu%tK.]K<^\ǥW.7.MS;p<^۽?gҥӥ{֥g~=}̿ӥqۿQg:sƥKҥӥWy6ts޻>\zoǾq̣ť۷.WߞۥwoF݃oÕһ}Z׸N>nnP{1^S'yKĥGKuw]:nw]kܺ:{\zߟS,~F_c#_<];89ҥO[:r9ۧK7.åӥvq;\};>ҥOБg;']+]ågyh]k>=.|i\zo;_GXX?]7_XKwx[׎Ky_iq;y%oq};Nbm_\cn]Kos;tߺtK/pzԥ_:jdzSXcݬcN\$]sVt鏮[׈׳.]zΉ\ \3w:; gӺt?pqy]:3ɇKKo#ե;ht/33{M"Vӥ;K^׾u^A^{\z¥;;uW>wéCr].z7g/]:}׺֥Wpӥ7qI7otӥ\zwn۩C3.=ҝkK7K?ҭKgntһst.MKo+ԥ;_q:e}եyKo\tnޏååxK7I^[ҥg^y3եDžK> ]o_:>zŭs;}/}otWKב҇_¥{~Хg.\z-.=>ta~.]Kgny}Eb҇n}Zp-e^ө79.qݎ%u=qJS}~v: ]zөҥg|xu鍾!]:st~K7J͛Z~ΜE]z֥? K׭mcһ}¸KϾf]_+.=q~Ln^".9]3tt qݼV]z7z{/ԏΜǥtutoע;Ǒӥ n(]zpΣKϾx]zag"Nz|8|ݹއu іʳ~\yct|v6]ytq9)һK7]z?voO}ҝ_\~\:suzuMK7nR{uw.'|eߧk8>@7}_~ǖ!zotquӥiwqxj<8ҽå7s.͇KǣWHwsԭr\?KDӥ;WS}ĸt縥KKtϰ]NǏKySt..nݹ5}l ݺs>:NKpt\IK\z^oҧnrgv@KKtޞt靹t>rygۋۇK]׋SI:3?In.8 ]znKѥԥS9\zcùlYv{g`M^|=-]FĥVtt9' \}f.=})]܀u=OӡzϺ n.ݹto/.G~+]J\\z{]o‹}yKy]9tRu鷮Z?Wq tcNmթS.޷SǑ_\oҩץKyܳO1+.=ҝSKKQ^KΩ:'cqޜKKw.]7Klv|]v5%_ǍKK'׺s#N{\?^ =ow:}Mnߞkoz~:uyK.p9wQ޷3M|.K[/=Yϸi[g^?+ĵGbΙk¥dt Kwn.>K]z~;S\zέĥ]u/Un|; ةt>w眫K|Uե;7\p]zcλ.=?tk8/nḛqy=Ki<ҥOKwN.ݹ*^7:w͇rMn1թқsqFKw-.=oҝcKG3pkoǵv9gs\#Rr]zq}o/.%n[&o<];7e=_&]svtyܸtC.nSѯK;]:sulntfv\һyǥ;sp9GEN`a|w\z^KwzBިԙtty>ƥvtBKoO~K-ץ߾côƥvtq/<n".=.ݹyttӥWs}.=.tåG~|ѭS<kӥsp^N^t[Koۙ_1G;'_.Wn~.]KO=r.zts p:1\z{ XgK1]\C:sHk\zաS?:s;tAxMpA_ַs;mqåK7VN(]z S`A94K?D ]z}]:tv߸~~N1]z޿fY_\}Ϝ2ݹwԗuԏǥo_L:ty~zҥ7ۥ_n/.t|J=KۿY֡S_ſ~L~|ti=9]ptyҫJG~f+2KNC޺N7?Y?k8'Kw.kKt9]z{u5/5mn̍ҕoz=EҥƛΜT\~k1*]Ѕwod}}ΙةoԥO5ùKۯ.~']z^k\oK/>_s_.=өo3^q~Ϝ..9|>q[қsktطsc~]sӥw{~\.8p~H^uѸt_w=.ѡ't|.\z3_Y&/ۿ׫tsҥ;H\#e\qӇK;4]s8t|c}?sv;]uy>.һrs.z.܅tgKKtԃu9w ̓ץ7t;]z̭7枦Kr䊦K/KǥťwHqåOu7\yM.pӥw/.Cg^.-p^γOKO^Mμ ]3/}ꞋkNg^z槿߫uΚ:Dq̫}.OnwIN#]]:SKo{|uݵ[wN"KQݺ}yvW]}<>_ҝz?+qoWǛKOe^:}Nuf>y yPNuknq%_GWμ/^K|[' .=]vKѭ\.=>;\Kס;oON\o94/=rd=5}6g/Kw.龫}l/^N$^tқn9ώ'ҧk$Mg=y:.=+"ާuG~:u < zJ^;_:s_.ѿ/q!_թV>f~_1Oq]zǼK|o<\Cǥ:u7t/.};tl\:ߋt\s<5u٤KowWǥ{]c{~\l^t敵NݺNa=Ng~vn߳nptt3/=^ۥ?9>쳛g~c N]I!s^_toUO=yuGN]#וuoyv?:Qn^.t5pקo/]w]:}86y~pytХK{8];U>CӥKzޘ.G]z海ͻu[μ̳<ޟ6#]/0]tܫΜ5v Kne\sWv^:s^y\sN.Mw꾋k=yK7/Un.ݼ>\zқƺt]yv 5/ǎKms.ӥOg}楷]oqt7tuno~ԡ>u{n.p5c}GN.ݼZ] 2/ݼ0]p} xoon\փL~9֥3'/ocӴ3\z{g}/t _]x/ț}{{7yw:ryv\8]z{pt,l}{t~gKn^4.ϻt|/w*ҏۛRYq=߭3/.ɓ'/ .KufyIҳspy>1/W#ϼG'_o/uK>ңo˼tfq¥5ҙ\iL7/=t麧#/fM~N<`]s>v^:./.zܬq=K>35/]a^zNݼt:y2ӿC&/å;w/]zӧh~b>Ţ3W9MN=u;5sMo]y:u\:>;}yg\n:sa_oO=G9=ۥw;NW11/]׽ǥ֙o?sǥ3)_̜ztKwn.g~e|z{/qEWn=aMu{;ҝ;Kossk~u=\\K7ms>{2/}ַ:}qK/:u^q-:s8.<ꝗ;uMCowK'|ΙN^tԷ{Ǹj+s^KvԷץgKϹ_Ϳđkԥ|ӥɻg^z:s.9}lUϼt^q4fNj|0//]:y0'sy{Xw9򘓢Kq3#2_׋KT]zKotžХWߺbv{s..95KE~ʷK׭3wr;[wN=ǓtvKϼs\>@^K:SJuя.y:ӥ Oۥ_ۯn8tԷ/:}/owַ_97zBi\z~_¥7u?u鯮5:Kҥ;Ƽi^vϼt\<..=u5DsH]3by7+EΜt2/ݹKzμtousΜz9yOַ8>\OE{c.B{qۣku:w]}v/kyt ԥ{Koӥ{ӥ{}K̯>š3o'|p>.iҝKO\}qx{{Kzқk7_t?K/>-u_^u-{?.=iwӥKԥ[ĥg sK]spȼo\y^?ҏ5 \zѥ.ﯺ{ǥ\yֻw^z?u˹/ssRnqpwO?tu0/ݹE6/gNԝ_l/kImlҥ{.]78s:qΑ¥KKoC^ЉKK nN{ogNj^K9 [2/tqCmIХ܁W7~7љҙ0=Wwb<~e~y:tѷNz4ݸtӺtpCU96tطsao.ҝCKK۵7S]:yxҝ9;{搒ޜktGg:^'uwCwsg@楓G=9'5s@tIӥOyCd^7.=uq>¥.n¼fku˥3U^b_`]s u|K7_to_K;sכΜz40^N եӟKypLt-Ɯ[]sҥt ]]|7[2~pۥsҥ_nֵ-եuv:sW\ޫyoSvo~\zׅ?_yg^qG' +.GgjG]zq.tK7(]zEGKW抝.t#.].}q:S\z1lq3/#w{̅ʼtv}շ^vUWN};.#t.G6qsйUg^KvC>3#O/a?csM~ؿۿyOåߺ|\:ĺt=N+O\-ҥGO^:t΅ХNzy]:stεN>{һ^?]yc]\StcINntG^:ҭK84]z/eǥ['MNq?ۭ^Yg 7. GK?up"t?3/mҭg^ө<:sS_ƚFӭs'֙_Q:t| tt2/]3/⼽qKn^\[С_8u9t;t.?ޜGz\:)5ȃy5u\S7KwG]z'ҭ3ҭy鯷1Or]Kμ3/=nO~󝎼Koü7_ GuۻtGNt8˺F]z_I;uxK.=0.wWq\p}kL:|bl\z6Ngw1O:uVwXt8q. ?g^:>3?W~!t]K7ov_kq1'1աSKXs˼y]gNy陯nY';oҭ;bMbיq 0߼^cb|\m>.Onp ӥ;FҩåK|޴o֙p2dcgnLauߗ}lg^z'u;/bnȼtze_Ŀo^z{ۛsy~m۾#Oқ%$ \zK>.=}Ց?:'Ľ҇kituKt=+k\ԝ;o0OO9ҝc^zag^ԩ?H<3/=_Kw.=?tOo]~d>z?@ܘß:r\stoKzQ[ԥs=Kϼ\uK7ټkKowre~)>3?'ttGm~>C0/]7i^:sҥg~<.]'KONԥK/En_5.=.<*WѥKO.q<]yC;/}_‘?Ņť7Huɘn.*q~In.]KOK|Ozy<]_ݹkpq×}qn.}ȣjon9Fnߛy҇yǥGKNE>u"]$;/ѩӷ7t䯓O}ڼoO]ՙ_Rxw^zgMyn3ѥdžKoЭguud\^X3\.ϨK7oW.=}uoM>wU}uԸS<ҝyKy֣q_y7k䋎q[oK/֫hk߸/:y=ҝKKouNj̣֣qݾ8?ymg_..=/pԙ{G3ga^z>_O<~}{~3/ΙeN.ݹK5߼tjzoա3'5_tҽ~ץWKzve;s_nonpQG['7]z{hx2/ѡK;\qaå;YI~?q7߇qy}KӥU]Kťv^s0Kg'/O׋Su8u8t98}S]3?ttαå]yӺt u?.z.מsG?Htxm\a_[_?.ݹttqҥ]k^ޞ;߿Oqs ҥ7]ҙ.Se|;kΏK8\;]CimK:vzӥ+&ҭ7ĥۗ.nN_a:ŭ¥g=adqu}֏ӥ鳋ׯ.}tO^?9\:Gts/KO76OO!Su.9>6]}uO/tkqp[][/}ez~to|\^u䇓M5NS1}ҝCK_pݜ.};𦛏Y]zy˛TYΜ<3[Tԏ3_~;>뽟#\z{78?%oӥ.9/ܿ.]K,]zUKϹ!ַ%皼tt陟N~6Fat9zrӥ+{;uCN}|o\sq9gļ{}S?os]9Ktۥ?^8_vԷөo~Kw.=?Kw4.yd^:/.=Yǥɼҥg{ӯ;.]N}[߾t%߇NE}.yK.:ޜKo銋ν&lίp5ۍzD9g~u]x[G?Ǽw\z :~Dҭ#/.j2/׿y~zԝwfw秿ַ_::Kw.9XK>sN۩?ncu9>e67Vݹ{9v;ޞ3/=.~t3/}ߨOӥ7uD\stѕNy~<ƚ|եSH +溕}>ѥU?fNXt-uͼx\z枍\z8Y\z>tKͭH+]+]s{~oiu/.t:&]:twTץwuu#/ڼgS|ٝy-K]KorqԸtT~k_k_Ko_t4.|u۝ =[^a]Hҹ>ҥ_qxns1v^p{?źts2/_]z3Zu8{qKםS/ss.յO;ߟ3G.92uf>.=sK\Sn.tM.=㐋k9EN=ޛysms\f^yƺt..ݹ9.?/YOʼtq.ݹt3O}{/aX/K>o^y׸s t:u xnn~yW]0ǹS7K3)]_ 9'~eXѡy?+?.=vǭ>q7_t9~>Yq˸td^cƥ;wft/ҥS?M^?MGN>8.=]u}gq~ƥw|>̏<ԩo:tc95m\q&+M?FcM=v{WttOK,]ח;/=]'Weԡ?qӡsNja\׿'/̩G:t;ϼq!}?ùn?]po#{M؟yܫuu`c ΟqN卼>s_w{z]Fqܦco v^{ͣbԭpxߣ ds؟sI¹j[?^Oӽq.9z>u>G={?\zbE8w?:޾g^t80k=ss_/pI_57seG޶^ﺿq~X?sas_뢃-p㳜ڟs ¹}ƚ<?_G 3 ^Gįu1}t{yA>}(/ 8q`Nͺ"_@ZuU|9rz}]5q/׌ؿ|K}&bj4똄s_-ޯ,y-g2~e*r5tSb;/1qϺ6ѹ`^/ѹV=?XOs_¸s}:'1ùO8_W8u{=߯y {c&'sqkkc}k>Ȅs_cK8~ӽO|?8wn[tz8ܹѹdzѽXߺB|ӱq_k>W3'wkf'櫻o^޾uk|¹?87n ˹`ձWSכ3s_w?cOg[}__¹eqؙv\c}_}_>Y{}>8ss:y8{_ps3~X_;~Wx>O/xi|3z}?1ӹ?WFN[Oq}}m>|}ݿ/Xo3s_1[ ޏʘx}}~f-}>7%E׾ù}}GGPc>rs]~}}ub-}ngb>1s_;]o!>p8}},{#uIen۳#8cfď}Onop33:Ν:>1y%=8}|7LJs;}_cǗ|x¹?ٿ9:^n'k/*Z߲8yu<3Kxog8/[n8>s_3x~\¹?e8u}׵{8}?Wq:7 ֧::r3~c=}}#q{wL|7~E<{}?>O7A8u9:sqRw֣7籾 羾ďqOC;a?:=/3{މsߧ¹8ٿr8x?KW= 8zN]c38~}˜x4םѱ߬/+?}|֥ ww%{JB຾G_:'֯?ǹ>/+泮V$7cǷNc_C$>}?Խ?/2W.~ |ӱ?Xs_8+ߍG sx&:S3~s_볗sQw`߾u_gw[g`n͗*{^sg?:5ֽ?]_pksө?}_?ùg<K1S3ΝA}'ùKh2}ùg }ù~:X=^QOK_#~\W^c>D`fg¹8u?ൾ*pp+^2fK^#3`<2}]?g[W,G~G Wq:g|֩^s_SߎOwoY.Ƽީ~׉>۩#\G%7/Η&pk:5u¹&GWZPcx+u<|Gƣ>}|jģ]?s4sߟp{ }6οpk : ~_#e=}mď։Wu.6Wz8}pM-Ӿ?߱ޯùg}}_1:qù{8yp;7z='8u\X{pkk_8i0n1?_j5{t5竌W|U:|?^?_#㽷ۉG߼E/GغJ3^ci݂Y"u%¹=S;iitt8/ֵ??G{~?Ig7Οp:XgA~NB>Øo_=N|;g8~K;^o8 羯pχs_'[M8}38¹9UģWeӱόo;}!EeL=Ĺg|P;itzqPo%.gO}t|ùnz|ԟu}9&]uGn'= c/gNZ;its_uoùG7}c w<3>sp?:?R#~O3iǹ3&ߚgoG_:ۗ9sΝ?:^={'^~cs__3#k<4]o8uԭt[zۗg[~ 8>{s_pg^.衛_G7{~?G>:?'յ1v=?=>b7tk>h8WON5u;nwԍ;~i{s_ǫ0˾#Չo{xs%=8u=yv83Dwu>ؿ];௏}#q+^cbqqcu3׼왿.Og<?"ݷ{'ߚ{?~q Wz~382ͷ\3}?^xϿ3}3^co8\ܟѹ[+:/3~???Mn0>]\k|ͷgv8'ltk}{pi?ތ]{=q8&psx};X^:'18}瞾޿ʘx{8ؿO/9~XWp+Y>#;tď/]kG/sߟpk=|;/?nOù/xtu<{:vD|4;_?1Wwpzۿˏ==}N=t}+μ;׎Kw.]wKwNb߸.S'q؍kx=?.};a^ǥåny\zljmmp-tݰ._z~q#OѸ}wvǥW[ԥO2.}?;\z/^/.Itһ4qC]:1N2tuvI‘K^]z)fW{ǥM3ѥݏݼ8H݀p_^Ќ4׸gwzåwGYwKvv%Ӝt.}?>]ut{ҟqtԥƥ_:pt:N]zK+oڿ62n`ay<&Oϻ7r~K{.KOKo۝w;9tKwåyvDuҩ yooIbK7W{N\c{uw x?q~ӥo8CGSz޲<.qԹsn׏K?p?.=iGqågv?Kwt{ץCӥK. .S-]Uwu\v.8sA?q=tӥS^n^.ӥ7k^\=;ܫyqk.8u=pǟW^HgL^Kt]g~G8Dӱ`yqCg~~v#.:+q3gtu7['n}+cWz~Ըt듷.E8]:.=ÙKw}K}Kå{ԩO~ԡ:'QAݿÑқqO5xu|Ϗ.ݟpәo|\\zh]ytJ0]KtWt탺H+~Wbn<:7Kҍ7K['8w :?<;޿pmlstq}zө?֩_ֻ:sǸpuK.ݼw\zһlqY7މgK//..\zǫKN._'Oyn^}|{zt|\z{/]:7vp\z.4w\ҥϧi]םW/tvp0}v)Vҥ_w4;yvcΜC/;.KGK. ..S^?]?ҫuUp-~7^7\Ř:q+]zz88^!+.ѩSw쿾5ƃx/8pқt֥ҥp:t9åB>XdƘv;|ng\tuīӥ=&}__yZF~yӥP ފ;\z^KQߙgw1&^]zm}8]3k:t{׭3_>~y\u ӥ#]~t䏮k.ٯ=\։GntcK.~\oOzk)⶛< ҫn[״u:u8¥7KϿ7zq/tO^?. u^tSס}ա3_ܟtҥ{CcKD:]zIK7K.:%tNK:w/0͘<8tU'zo9&}}ylO\zҭKK.=tKf<on.lq:H̻y]yt.ݺ6v?uэ18*#.|\ޮW|.c2v{ŵqٿ}zΩ.ƥW'\x~\xju鮋q;ᔋuR|g+\zgt鹿ۥx]~mǎ:v^;.Sb.gN_:.;ۥ5ӥg|Qzަ[wu?·n<:v\ut:օ}t#ȭ+'M:e\z/|tӺgNKno];C;.=o|SW~z:.ޏ.]'zN[~Qga\"X^>zqg]z\vӯ|oBuU]åo.v7~|aK߲/u pqݺ1uan:y\vW|8Xǥ?{niKGՉUu1t]~qηvtեgn_)]#n<.;.=AtuިKo֑Yҋ~vq> \zzK.:wۥqaťwi:GW~[N~4뾩 .=K:aɷ>73梁t:ѥS*]CҥԥOKo[iաx/׃tI:\zn'ߺ\V81<\.}K:K﷮ث['ݟ}!ҧ.5^^>.t>xo9]t׻tۥw?b{oƷ9MN?f|;+.ԥo޳ŸD~uz.N9Ot7J>/~ό)uҥOoKN2Kg.>ҭKG?v9e?uo+݃1w_ҳcv֥[n֥S7Xޣ?uMw1я6?]:N|߮:u>F|~C\zIХ_tM}\:G\3.˥/WtKpJtݤ.t:]\z_ogԕSoK\f#uںSKҩ.]K!.=ҥ{֥ԥG[_kt?~ǹ|>in..=9uHtK/<4]zp5sq>s>8r?Y3> N\c\~n>㺟.~{? q]zיKxT7ic7uZW]}Kef<_鼻inSޞޟ.q;'KХWץӥOntuttҷn};_Gpt/.Wi:t}}ǥK~tuCӥ{̋cK>kåw.]'Ky{:txtNN҇c]zeL[z>gwC7oONpL޷_K]qupĥ7ҭKN.}XGť.]zi_5sԣN>uK:8ɥ;; N6uC]:&]c?Nd8&.;yԥ#ޟԩw̉k輷Kסss\:kI cة|S^}Z:ӥw;u7|Ͽtj~q]cc\߼̭8 G˥OН/.gi%ҕ׈ .]ǐ]KCWKطy{E|:]s'qL}t8x=:yvcߏKO'K|y?KNӟ-7>~-nUu!{?_!.ݺ tD~_zҥC;{u|:tsåw;suO..}~CgN^g7áKN]/=_3nAw߿|:+W܋gS_4c\op KO.}o۫۟:X/ץXѥ_Wx3&o/VtvO .KS.QGJ7]z[׾K.~tsK'O~;ut_C'o8֥+V_8Wg?r:Wχf?k|]GM޻/>=~tpt};r/=]|ڶkg?^uXå:yqUW~uߕ{v]nCIuз_]z>O?b/=^Ku :tW]<#ޫ+W~؍kƏ߿\qiХ{3~:]uW엮ӥ{֥[gKg[~yҽ/xM0K?['1~K7o!]z+|9&p[/]KyҭtKסۯE~>.]Kq8K'^..׫K7o^Ϙ~Nfʸzu;.{gKONyl엞n1gsu\C'o}KOK/]~MwNsf1&k%_<]ytm;3.oK?m<:tۥz[g[Dcե[91_)үg1/'tet/~ǥgUOχ>>/Cn<:tN]Kwq~Nw3uzeq:U]gWuOtwnN] ߟOd=tե^u)ѥ{~u\Ƹ!;K~ԥ']zt֭Хg#|m/}:&~xy:u<ν[5_wo ']:ʇyvNt}\.JH޶[_͸t>_ҫrߣuarz)~]m|qLOwҗuR߸tuKxKt?3^KKn$.=lNtօХIԏKǥ77q~ҍK\Qn\zua?z0Na]z~ZwҭGY]N޴.].}_]-ҭËK/=y!_fKn>tYU޷SKo~q8>}}ȇN}Ptjq:t~KҭK~_p63]t8t2~q_u~s)['3_յ['5ǥ[藮S_c/K{]uYn]:]uIz\Jn?\z5K).ҥ{o/K7]zs<>ҍ7/=]r~u<åz\KK~됾:tN//tWuh|=m\e6//.VnWS#]q~ow!Su/}қQ4]zGG>uG]:ѹԥ:엞NKn5wڧ,>ߺ[w]ҩ?q*+vǥW5ҭ`isuco K'p~u^t7^.fL[7S'M⽗wKƷӡ#$] ~CN|֩xxF]WgN/:ۺqN].}8f<~nx4SX:'֫qt_:>KgKN엎J~Uҫm|5ݿ6#xo_K't>~;7vy问_tuR?:uWN>`8|n|ҭ~tt=]h]zWtgtKa> Ktsu?{t/q[K'/]zuG8_>Dtg췽۷1uM/9uRǥ{.9XxwK[\z?c<]z^t.+S\N]+ҽ>.~K6?֙K8|\uMtѥ{~ҳN.|tUgX'u.:\t҉s+/ ?rO^W:ҋqԋLp~/yt*sץSXnGtet.ӥХ=~;T:w:鷐қ~.uen˸F:uw26헮ץ۩u#K&t:=\Kwty~ťWd?w8wx]]zk{L^[7- ..=.: af=;}3nqC'o~:s[@~鹿t.̯Tެ+K?Lɳ?y\z~^t3?M8\Ft靺ۥN*]NI^~gEwN}z]2/Ngn=1yv.eA4Ǧ_ƥ[Fut鞏ۥ_;.M7xډkЯZo/{O\zĥ'M+.}:~cץS6]zҳ:qtǻ|gtgJ=_z[Ǒs|{֟ә?^қSKOҿ_ҭ+KpΣKwp7?q}>4[/4_]:ңN.K?.~/K/uq/ҽI/y5npЉn=/K.\:ӥ~2}tN{fN]rqq}/ű~t3>}9y{t^ץ7ץw.ߝtE.}ЉLO"o\#r}Ƌ .}bܠ'k~'CǸKn\z~_:y/8ꗞ:c}3KuUGu=~gn'n\z9y{엎ӧ_o[WDų_z\Nt铺Xi'qW?{OFW#N4nKw3 v5;`toY9SN^'yUWi:twSi܋yq_1/ѕۯe|rO#qѥ۟F^uݯyvǥ(pcNnޝ.yۥ[ n9-nŸ}\x9ػdnzŹxM4:tڷK:tK~Gct3/uSys;?noGӕ3_?/=#O|KN/пrKҭK?ǵ;\zO}<>oKxǥ7^:uytϓuWu_q鷏g>я=]z_)t/n]]uv~w~_G>utxwc|CMngua~ҳz|?ͳc[wn]g|ӥ@tcCG^6.=w/=9oӯxEޱ.]it~~q?|ԥ>҇~2ХgK'$]yKOwZwuWӓuHӡﻚ7}>{̉:u_ͼ[nxyuvqխ/q?&/Kһ9\zm҇o~/ҥ{.=ֿK.[v:/c<|;?e.=Ywҳxչ_?>S/]]zqY/.ݎ'.=O\zԥ_[O>u]rA[KzP~m?ӑW\SI>ýC7PN|;_O[ÿtq~׷N{8_.YIt%=Su?uWq-5.ҭKog엞_?ױ^YWNz5ܺ:⩺tv~7K .$K']:ީ3K֥¥g\zKwХji:uw՝_=_:å~uXu>ҽҫu\q~ۉhz{usqxc{/[WQn3?:['?_z5uso>']:@_zЉⰛCo~.ݺ#uݺ1G|XҭK7?!]unԹu}Տ<:7øtut[/+\/|t>7ҳ..Ћ܇μ>K}vSn/GXoҭKN߈wO#ov^on'_֭/՝I։w^Ñ.ա3ԩSwko=n<~oN?*u_:KOwN.}[)ҋco׹o>^ψKcG_.{o%3˸PfLv:up :e߳8>b|keԙW..ݾutY4.]qKՇK7*ww1?Kptҥ#G㖟̷ȫND<֝w/w~\z˥{}ӥw]q~҉K'0[|hƣ9Kԥc+Gpe?_R^t):q~7`K.]WKPg?oW<~ӥǑƣqwӡ8Kyijӥ{ҧË]unһ;⽽yĥ{8wk~tu:tХ+7Sw7]ENO|1}Ϫn)]z:+͘|[vOvul|;\.t]M8C'^']:toutҭKtҽ_ҳ.pKϳ:ao??~g({__?u_+ѹs/Cν ]n82W[;ƹ3{k^Fms/ຂs/c|-H~sGluܰ1s=>\I8cs/}8b?"z5߽]?m8Ýs/~+_t+tg8-: ]k/?ڿo=^O82^wN~%>|Sb>9s&{?ێ;o5_х?1_u7A8uux1Bpk~cz 7Cߞu~S'`]~/dz|N4{[z<[7qQ|~=نs_ù7k8ѱ&mo[Y3o8?t%k]oy}|p:7uq]_1߳_17:7||#~W8u^^u[3\O8ߘ}wLx͗ߘ|C?7|~gVq] I^x>~ͧ{ _\J^7߼ܟuwqWc0bx[?Pu8X? ru }oQtW=u36|w̗c>oy=羯gW\ù?f_<~9u؟0ga]{K's_Oycԙ/wד7߼>z~2ν d8uys |st~|ù1 |xgp~}/X{|#}˹>u3#s_]o85o.O?q˹{W| 羮'WvO}|ؿ{9vr.%cw8pOur¹>W㺟}¹^z9u=ұ?u=˹޹speT/?/7qùg;<ck>qk}Sc'?{szggyPn9ףq_ø{_M ̘ٯ~|c;5c>o8:OOGpS8yҩ߱ڟXνt+>_gg韽o;|n{X鿾g:z;_ k}6āpM?'k:'羿߄s/nG^p{}p@apԽr/0^ʼn/ɷٯ|/|֥ 7۝v7˺W\Z|{̧ 美x/s_߇oe3}| 美^]{]6XWp˹k/ G}b=}8W|pŹggz7c:~^O˰^8N~~˹:)[Gq˹nޘO}}{W?xnѭX/O;֏'o֯~m1}+B|Y^u;G'?"93b}>< -q=>?ħu`<";:p+0~-Għ^u$¹7Mo9z]{{=s_ɘ{Msx} X'7??b}o8u}׽Xߺ|˴V8>b>Z8н7='8:O|sq\:pq%ԁùo帞s_ؾo}ߦ51{~ƹ1~Q!'^{߫ƷN~Ո~xXons8}}߸뺏p{_.B77"]Qoo?_E77^3^s_6ùϟ|7~?s_θ>7ugpk=cgŹK:73~sדpx7upo|s_e{ǿspC8&cztoo{.KS8ѽ^?xN}ͧ# |4]{t¹+X?:u¹kn_ ;ӌ{oc=Z>Z/܌og_Wtp7:_t'd8/{wO8ޕxoKx!}]o󸿆s?ٿƣhgLֱ3_#sx}}?ǹΟ߅sp^8s_n^YW'{{2&ޙF<gp+PcScj|8v~5Oi|!:n5z!u¹woùe83b>Ow&>s>os~u}ާ#ᰌ<~3森6}uƷuc;f>!~>c7v];c4گXV]{,߻p+^G0oߺc׈z1&ԉoz{ķùqg<ڱ}-ۭÇs|R_FM~s߿q{=q1n8>ӵMY&=P|g~㺟V8ӵƭk8 >?ng|o x=|k^osqs_/~o}={p?s?G{ٍ{'ޛn0&: ON|#3~}}~;zf8}/{Kp} CZL-^pk}.6;⽳o67ùs_گ߼dp!3{/\N8oss_>||~q}N|_#~kďuFZޙ/t}ǥc'ߚbǕw3c|;㙏|t%Cn>ses_8O?cƣ93M|ߦ_e5r?{WWsƷqw7uw8uϿ.Ʒq||s|:7cމG_s_z/W|fL_>^uFqτs_W'c^on"Ntvď-s_׻!ENx{į+~݌Nn>8nG<| :t_˧/׵khï#;pkt3=Z]v۸u8ѱ3_8pĹAG]p%^o.zOt|O;c?Ʒ/W71_=:r87S_ٿw}}&cf<֟v|kg7OG߾羮ws_͆s_*]{w8p,o=;:.ķ/wƝ 瞾 羾}O|G}oM;WqeZ {t+<<&}?o{ùQW&>¹zs8xWb\Oɷ/'s/:8%^ɷ\}Oq1|mI>>Up+^P?|~ƹg%=}}/|<ףps/[oqŭg{I:]eқ=\ҥ7\.Ct.u ҥۯ\{եӼǏ/ セ9].Y/N%]zn>ÅҟΥ?K8_W\>K?\z0.Ung]W^uң?._ .}$]zԌ.}wKpǥO\&uO30u8ۉkC~oǾ.o>gDbo۝Zؿq5kT%҇u ytJ:\(:KNj\ԙoK҇ӥot#qĸ /N\#.Oot,gĥohnǹK|#Mt߸w;u~㳿U7U7S.Gw2/au֑Х[BN.=ݪ.Kť.}6>.ƣcoa\u뭺\qx\y/;]zc'Nƥ_tנ|>Kq8̫C_qc'OQK=\z_\z:K]_\(c`ɋk:qŇK7/-]uKncռSǑz >y}u.13~͸åtyץ׿\z:C҇urt鯮>]: n]tt^0r;q\<.~׺z3槟e%/tѸtootҥ{ǥҥZtoKn:\q']t=Kn]i]up?q\:_WשNupѺtѦK׵ҽ>ҳy50ۥKn{ť;yyץ{=ťҥׯKϺ 3]:0ώ:WcԥO@鷠Kxy~ץ{a|1&rԉuۤK|1O/g I>w'Ӹx\zhq|pcS7NR?~K:Sҥ:S~_ĥ3]:}q>}#>_K>K:{\z_ktJҍKEg8.]ץKϿGy.tU]>. yby\z{OKt׋t_>\z폭K7WnP]K^ڕygԑ3<;O^<]LgK ӥHnY\~ w;z)]åitqBaKu{t qbt/ytSWKOyUt?t`qMҥ7_әK.}p.]wKҩk.̋ӥǪKpt}vΜ<;oXה:ü#ӥq]ǣK?ӑctOK﾿t] ޳wһp~Ku:$\p]vҍKeҋn7r8Ǽ;Ǒ1+>;/nO]u[tuO!.Ku㩓yqqҥGKOGK?._;.].ϟ.]KY/%)]ќ/5.=4^NХo|}_EWN|źq}ե8tӥw9qKn9.tIuҍ7ҭӭKYn]\.=i,\#0u_խuHqyq8h\+]:ҥXNuta[]{u\stt.[nޛ.ݼt)ѥ{ĥGgדүӥϲ}],:vޭK=6:][ij;c\zӡ3ߥCjѭSwQ ]:[w~=yo8n|v;r\׳o5q=Х[Fn]2]ztmKqt8Wg|S|þN?CI|Oٝ?\z..>i \z.t<.:6éSթ#pٟ}/t޿u_n:yq:j^t.}ǥO?y{]:KOߌGsʉӥNNҋw?v8CG>u5|>yqq!\`.x.]z..܎N`>~~?]z۩oď҇NW>~ҭKwK?m:;?1t܏Iϫ.=|i6\ۭGpYUnq~K9G_|Ցw}qK٤KMGǥ>ԥ[ >]?ҳ..ݺIt*n~k[NuOcZgWv:c^_tҧT]K\vG|ҳ,.=ۥֹg?~_tq~c']t{q;}ҥyƥ|=u\ěct:t|ƥ/>cI~'։q޿q}ӹn(\,f|;+iG\o1Ʒ#;|Xu8.uo{{uLҭ<i_q¥Hҥ?SK.9mn'>uN>~ҭ+KN1ˑ.).}~;c\GnNs\z[Oǫu\tөm~֩ZN'nҧu uWK7.}TǧKt}ԕWҍѥ/]ry>]sDuok¥ԥ:fꐦ 3?1`L~}cEgN>8ۋu:ǥ]z_ߎD>uSwϟK_͘|f^?^7ҭۧKQS6K|եeO}}حc'<_Ŀu_>>.=c\z+S'N߮-t|p?tGKK>}ҥyK7>Kҙ~<\Qq҉7.҇^>.qå].~tKoK1.sIåÕ_W뮦cğMGN?f<}NzNsnTnTGxp~q gK..}گ>GKݺn8t;[']uďK{=ֻtPKqҭK.vqn.uǥ&E>CɇnXåb|p~8޺[K/ڿ7/'./_s|uZpҥ['F}N~Cבu7u=ֿ8|n\w].|t5WGxo}~{N~tcoץS'k>on~.|tKەğӥO|ҧu]w.}oK?py=ƥ+]up K.۸>tոYTN<:XG:hO3MNxkx.l\tԱեOҥ_?]:uӥ{ҥۡ?NN|9]k0o?3.=|ҍGK}tө7\|KvCǮ#¥[.]ut['^ty?/?ߞ{Vt^k:59֥socytһ|q֛qt.Pt: ƥGtgCo1~>NiNJ^ώKׁ_t1ƥLcχ.nKuø ߫S{~]zw9rLS7nPxNҡ:tx҉qcp½ut␺tEt&unj^}>yq^t5.}=nG^#sq9]._N~ǥӥ[J>ǿڏ<:7߲ygL ;|.=].}+_uQpS']z\_u]7^wv~olwm !"-!=]Yv_7XKz}|Q1S7o5y\Kסo-Й}YHNK:+X3o/O]z9Kq$_>8utҥ_:p_7'/}6>Kf^m6.}/y_t<+_toNnpl\zOeKKs'['Y:sAwKkrO9.]z..q@楳?\satM7?3O&NSu[QXX/:8p/.}8Fեguƥ_Y[qtyK/:uu:I|һyu[q0>t]5.ϣҗn}w_85}np;u8?uQ.#/N/Ottt#ӥ?tߝKNGc_ϧyC~E߲݃:]Kd^c^xN3.I_y|StBӥ<;k$v|t[ {IwN]םyu鸤tˑ^Xӧ?.>t~ӥ7^ۥK/2/9Iۥsҝ.#ۥ:uԱu_t.|XX:q8Kwn.s8SwޙX\/\7t鏯ezѭg']"tJ^C︛-\_H5}WoK;>\G>>.}b^}W]uХ۷K7rWrޟ<ӥ?e^} |K7SۧOޞ|.<ҙ×.]Kw.=xtåO>.|O\z҇s¥.}קK{;9Cwo:s~1W)c> v:u9n>K/rǥKg~著N>z楓GK7 κt(.}q=.=3/=uG/Un֥ù߹?:뷷7Kҙ[.ݾ;]y#t7KԚ}~qzoҪS֡q܃ay7g.ùg^zաOo>@d^zH]{9ǕײϷ.}tkxt9>uQo{NKK<;/}s7kץGKҩ} ӥ/زK.ZXS?tCǥqcmW^b{uo/gt.ݾf\zb]W]圃y7u|sڣk-]zͼk^N}[ltq~år䥓.}ؗK_mto9saK7zo:t슮<3/f{o֣N1¥oq˵4y2nǥWt|5]P^pַQ>ץNLuG x2Of&O&u.}eWO}и1x}җsp{y2Kå?:m..}W.|pb׍Kc^zutTݹs\+k殒'^͇OWU]yE~ҝSK_G~Kw.}9_֏]~wۋǥӧy鞟t~t.;sr}sC.'>.9jp7G?sϼtpre^z_wm^q:]z#/V\zNK]z#Ϝt?K/۩3.}W]z:vpүӥ].}ru\|t陏Wutv^zuMLWu̅m:ust{=^w#ӱL+֥[/ѥz5/}=?ҝÅK_z.Ϻb>.o|\9x͗եt;KqW5ҥ2K|c^n֣3ݹ:uׯKe^z|3ǥĶKrW]o^X2?.lNys➏Kw.yyn=u/^?ou㏿g.,{W85}õ}5sM?{̙3 vp?>.K>ԥKzF]z}__ust3OG~Mv˹k.?;yS\Ӫ+gǥ/guF\W\y׋.ON^zE.=ߧ\,]z3<]:\ou]}t+N:srǢn^/qkk/Wַuԣ{\z/IkJ>9.åL\;'/ٷ^^tK7XN~y7\z^W<ퟸ>a7K#\۩x{GO^s;uv|;ۉw69LJ=ʾ;uϓsW;k~.<ӥ wU.]WK7]O;ԑw>_|ѥ;S=]sKu~>)뽟ܚsHkǏN6:ӥ;NC^y|tk湇μu;>m^to㢛|گ=En=n9p[>KwNy8-]*p.註.pe^sWv^v屿KCGG]ǥg~=yumS?ޞ9q}K^ץ?:e]z5?N.}C.=7:N[u:t.ÁԥO.}tCַu/u|Q\zɥJ~w.}y.#/fM4yc5/^qt޸k;tsK>]z:\]z.=oK'}֏?to?]zӡ?9'sSuԷ;apĸb9yݼsONyO]0Z]g'';]ԡ3wfXױSVtbM5yoEn.~]z:❗~>]:ur ߇N|\1:bǥ{.}2g]>ɚ|t>K rp8sZc:v'tt~I8Wzm3G`Y?䥛sKХ;O}П鷮rҷ ַK_nu<ɚ[gq鏾u589>;֥#쏎.~š9LK.=3/å{>ǥK3tK_>>Y K>?Qu.ktK_.2o=\zb\^zCқ|\iY_>u]ҝ;KO]|K_\ʼ.溦K_p֋ҥwtU.}ꔫx=.9N^Coܳ;]Yۿ]X?׃I=sRq޷Kwqޞݮk^攥Sߓ~̭[܎ǥSӥ_tE{=K=]/:k:uy{\st#K_e֡8ӥ3/ѝ_q~ҥ.ütϗtץ?ۡ;'u^#o:sCtҽӥ{EtҝK/ǥŜ]:K<_ϥ>pn`8$\sҥ/cdz{ͻѕS DžKssCNr=L^owty{u}F]b_թ8ѷKvttCKo1]a]Ss['y{yҽJ>}u*,c_ ұSx{KgpKױ͏֥7yNSOuU}}s.B)[ObxKwN]/\ptҥs.KG̿.Kg#׻.1<\(jzqƸt߿#s"~祧c&/w}9nίoM>yxuk{T]p.c]7\6]μ3WwԙwݟKN]w:o/\.W.ݹ:N}utK9Mg~=wt5y}t3ϼZ׈ѥ.o#t5q]:ytu:Y]s-tyΝҥ]eyܙ^u|ǝK/:ut7˼tZs..>too&t\ӷwΙ?G^{_׷MKow\z_I<өSwNtE7NnPbuչWyץ/ƫ;W^xq9wK>ooۋc]ߏp;Nt#cҫy|AoW{.=åϏt:ө/tۋ9'AESK<>3ǹw:x>}1gBμtAK~K.=^ot|;ۥvμ~;3_¢k_} ]9nGKIy)^W{W ?.]WKKG쳻uE.}KқJG~^ep~\3Хg7.>]cwҩ۷Y7tDKi?Stp<g߽.ݼ ̣ϼCOK=SA]}%zK7? t&tK:}wqk^zVyӡguw\?ngKuҫ>;'y{=vEwnǥo.}xǥgKoy2߼̷_Y.} _˾t>u\ώ> ]9kpչ}KOi^.}їKwtyzt|of=:u>tg2?z>y䙗t>jq>0]۵~ʚ6ngx{>@ӽ}ӥ}{Ko>S,>ѧy3/0.t.cKoۙOC:yΜt>_ߒ4{ե_:j\:ӥ[W|qMY>J\z:]y[tȷKtqKO}̭7g^tK敓p6/a}sޕy{K۱ߓo7]zyui ݺ}KO,]?.>ygn.2~G33ώggwةvƥ֥{~7/Kו3}ov9nxt陿}K{}v:uU}ǺG)]:˧K_g\t5y2]N^?uqy/]XwCK׷.wW֥wt.'/}钶K'_~ֹ<_Q]M2?<.^K7OQn^.9ۥ7.yOnߞåKwΈy̼ty\\0?Vx/Ƿ$y:uq㹭Gu;/=&u3W6үʙ]xxn83~yWå?>3tH>u[Y5y2}ȼ̧__әS̒g9SNycõWgWљN 9]:NG.}NVK3.ҋk}\_һ{vq|sMkxK7^S>t]]Kw^:O^\?\:ytӥ;GNw.]gN}GKKwn.ݾt-]ݯϜ#/}ԩ}CΜԥ;ώa^v]zqAv~:¥ԥ/Ct8r^9ҹtn[0/׿y֗u阫xt~}v_K_u;sƥ_<>.ݹrtrG?]#EKou\zש?ӥ.ݹƸtGz~f8^;ۼtrҥr;{>.}C/\w-ftqya\6nzǃK>W?.91t{tM>̫.yKW^XwָSq.:u۹Gg^>{9W}eXe'}Y?.:sqKwKK6ݝ:uq%U:̅-:ǃ.}9\Lt 3/~d&/}\һ3uoQ>.~t]ojtKukK<]z1o<]z3]:9]tuv\tE7ݬ:srk\}ttGK_ַqe?p;t䞑/N^:/K7~k\|w*gbM=_ױۥ+^>u-Mn7sK_ޟEJ/å[_ѥ9ܳ\e^zϜqrjiӍ_ЩϘJwq.lסS:uq癗3.ݹK_5]zׅWӥҥ3W6]zk\҅7}R֕qmF~;.}/~+F^7y:9\ZҝKw.NwߚUvK]z?Kץo<ԣq~q|K^|>pc积ܧsay|gdݏzzk^+i?\:ϲ~p\ӥϼtӥ]uIХ?:jvbst䞑s'O<]z:sKC'.=7楯&lΩG\G_#/{vn99Փ>~+tG/o:9[֩Gw:|.}^>~̟ٿ}>|\sBK{;C|K#.G^Сҭe^zfw~Nߓ>uvS?st;.=җs@t7߼t?ۥO?BnQt"һn:oǥ} ]st}w㾗>tԣ{y:u;yN^\;ǵ1a߮WܞgC}?:3;czM/ָ¥w79GNXө?\z5<]zu͜١C',lg珼Vw]3w5;ۥuԷ/cק.ݹ;/==O77XS~?_?__Vrk:z_o_G?OvB7"ߎ_*?_¿O^޺vp_pO8C ^n^?Ĺ }:%s/U\rms/MޟW7(M˵5Nu s/<~ν.u|pν:F^yKӍq||ν޿{,|¹ץ .>{{܋%uR/büW8tOo/s/u˼pzq<s'pE's/AKν;<ν{ w:R ν\z:w{5ʭ^_s/e'acŹWtAi:pùS^{s/Eνs/t+G>P][ν>=u=x=O{cb{ݿ}=gyk/8L5?{;ν s/̯-νLK{,܋.4{ u4{uJ8^%{yܣ|}}C^2={uK8qȯs^~ؿҭGcs/΍s>^7_]_=]M^K^t8RWw{ ^v۱޿| ?źx#/~>X_q/ﱘs/Eg}Wνsùt/{Źbu8.:rù|Kб_On/s/وcW8ﱝ kzq={8zfz4swץ{_kӹǫt8r_ׇs/]gν8'({={?~q|q¹w8w7ϸwûbC }8}/^s/M'νdr( sp.ν{1>{_q}g¹~pi8Q8ppW\.]{z:܆p58K3<{+98Wol^@_=?|ZW\:LǿνT]w^q\' ν۽cݮ/o:ю;A\WwB=5{]^2?={̏^<ףޯz>?Kzs;t5O^-}'=>Эنs.=?w:b={:pEwsν0t|pչh: 8ν<:;g~ νss/Q-[w-ùùe+^t8w  :':?[ƹn {,:pzzgq}Zu%Oӽ?끋}/WνTv*y_=KyO|?Q؟}u8?{qnν4-O?z<׹^Gsν~g]8|܋y8bT838θp>U{i>}8۽/s/]GzG{/qž^{s~sKwҽ8¹ Q8}'}F;K\={ַts/E {qK8G֣>֗߈~Xf.B8w98?svo=vKk} {o-Wo[(x.ַkWuwamkczpꬫoqE'=8s~vW\ws|>f:zYy^WyB^ >׳uSu%s{\O%s/ۅsUx܋. ~Fمs_sK׀s/[zνd>s νt>oqys~s9 ^no2p|e=u5y<¹g8?Ks/;ν`¹O8޸-{qX_+usx>s^O8-}t9!ܫ}:S3N^u8玾Gѹg}py~羯¹Y:¹s/ν4pszU8}}s/~p{3Ozs^s7{~?ù_ܳD8\{|<Nqp܋sùgνng}qCp{='ܳ_ܾ)[??w kǹpSYS/W8}!;rmùMpu9g.~<¹Gޯ~~\/ >އstԏqW6p53u5;{ֳ¹88{{i曇s/ǹ+[?v Whg~/a=zν.q%b{qn$ν9{7w^<ߎe=:/"{^o,ν8)<w瞟8<܋Oe6:R[oqz^n=뽷quXSƥ_?m8b{q97{Úc.@8\pNz~|~N^_ͬmR}|¹Y{|ps/pnν874{ ܳP^N~E}s8~ ͚~*~f{y=)sv\ss/sۇ~8˽9k/q{7ک㢛psEnν¹?s=8ܫWs˹ߵnĿ\ӿ~ϸ]8YSx?GG~<{^js߯_{>s{CN}㟱?d܋spŹm8Wֹ_Q>O~ùs/76{^oח~|묫֩oùs>s/\`8E^.>V{z{}ܳG׹Fn?= u:֣ND=ѽ7G:~ʚmvsqM?x死?דFߥ3s`m<ߌsz@^s^s/9 {aN.=u9:wo 3O__N~Ǐsӹ[ѹ/sI{i>{۽跾t w8=q۩o_:~<> s9pK3_~98ߣ~3У9tgzk5K:'On=9{16{unq{O]Wƹƚ1s GN}{~d{5~ 'OܳR^t85ۮ/S&k AHg~ur8sIǹg]ssqKpʚzc~þ^{ls/΅ s/M'νkN~kz5ίzo?po=BNuq}еq)t].2>;}..Ka[}sMq|_/'};*׋ttg_rѥ?.[rmwN:Iܿp}Oť^җ>8\|4yѩ77;;Ntҷѥwt/z)>:uǥNdKg^]n8sS׈|MOsǢK7OWӥ[b;_;/|t:W]e[g8鳻uzy*ԩC-n6:uqץ9ۥg;Õ|_O7Kg$.^YXS'ytouoo{N ҳΒ.ݼl]Kt<~tW\҇rpvi_ν3S^sw5uܙ+0t䳇K[~.WqD] ~Ys|5{t) uON^un;kƥש==t{M7}K=WE>tM7O6}}a?uo|Ksltwåc_QAt@toex=.ye_Z_Ϲ x|\z|p3ӥW܂||қNro}\:]3ޅKϺB?voF`?L!zN9]:,]z/MO3.ݹ%yt]9}kKu9O^WGz!tݸk;^aK?~K7ߛuӥ_/.zܬ[Kϧn^.}}vs;.>*׋yٸ9#'a_/9åoJue\zֹ_//xb.ݼp9guwe\?Xύb>.8p-t:_ϾA]z/RGoٷwK'ϛtve:}v֟~nni}{v\z5.} EsAqn֥7c`͑^̏ t_Ϭ2w`u`t_ϾpPnpaMݭcǥ?ng_ָyK>O 2+d#Og:FkMHn.ݼå_]D ^֙zvdm<]Ú>8߇KϹK3Wҏ=ѕ[?6OR^{֥߭KCS/I] G]:\z#p9t3.f\46kҥqm;O ^-8w\wѹnz uK/Z&OZKҫN5:qs\oww\avk*;N9;/\oVMԷǥ?Fztޏ[o.1޹#8uo^.9So?v:j]s)_ Kz_޾ѦK7?Xx3D=z_.'sVяkyKw΅.GqzYtMgݲvv/9snݹx>_OFz:L]q3=>qeu:[>t.^cxqOc}/ݹㇵ}v5\S/oK_oOo5sWϝҶkO|wDzo{E9GzupKԷ:˳z?ҥrё㊫msuvK>NCz^ss8mu5eޛy}qyԥ틫uK‰{˙K9=@ΜM\~.5sWy<o|tnqN*z3сo;J|%:8ߒ^~tɚ©C.}_&=ϿSOLwuͻ$ݾ\z..}kOK'O~{qM7O{ӹW~Yno///]sE;tlNئN9#.}:w`Y߾ޣ>K4\z#KzkW~.=9Ny{ǸjKv֙k:\]ҹ_q|<˹k\y䯧ӥ/~]3?zQY\7:vV:/\zڤKϼs.[_MtL #tַkҶSǥ֣qwԣK:z3wqCwc~#]åةstӡS?uwmݺ7Y?q},\z]|ܳ{8f]z՝NnW9\z悤K6wkw}׳zd}q50GusVҥ3*]z̖?\:3/:;]z:Swjriם;p9*]z/e}N\Gk K'߼ZϏgg. s*k琺ݹ59`{98+w\K/ߎ\|oԡO<[ЙS?tԷK.~ny=&_0X#]z7>|K7?U^s0J>0W Koҧn?"<>^9wR'wk;uёKzu;ҥۍuoItᔫms\3_~59eҡ_?.趛st:s:sovCեs=KSKש_G?Ho#umao^+΅ׇ.ۯϿdNŚ<9[ף:u[K :qGԏץS7=>6֥u5輽bƥ_OgNnDza.^t/ҳ.pt])GKϼ#ONy|ӵu?_/v陯N};η3Y| /\{Щkw5.=9`<0^tm^O+s*EΜv¥_KN.MtHtrDĥߧ+k{\KOO.ݹ tp];p魐pt>tt꣸~KKw.ҟKϥt.ݣNbyҥ.k;y<]F橓o{υեsyҷԥnu?9Gy陟s'}Y'ӝߜWu1/]?͓ԥiu楷^<\z~yݖ.]f^znClkқy=kyn|һۭ|t麕p>.};q#QG.~XK.O2_8\p9Nh].Zu櫇Kϱ#/}o]qy{:t|߭C7/鞛}lv^kn~>K>'\zAye_gz]#/=\PCKU^+Oҏu OvUWnbMKågZt;um;t>+nǹw;o܋y>.=uܺΜ-vs{'B~-;}q<]sSK`^vӥ㪫n~.=]Ot5ON^ם_34/=3/=O]ytӥԩkۻ]d^s`tΡХ_>~y2kݹݵy7:t^twf"sgӎ7]z͗5/=gtwn# Б?ztso1tIuK|}mS>>tv! .ϼtͥKNN^yu5=¥7k]7C{gܑkO}EuSs_\3wK?ۛKם4G^:o)ɓ:t]͚:ſA:}й߮#_:vZnI}}=KW O>u!NCaM N]۝_ɺhp8ϹtsL]:ҥ{~ӥ?=y鏎r͓ѭoKg^|H\zϼtȇ'/Kw\z:t~ޚg.҇k]zaMɓ:u?!2u_̼Ku/ҧ?ye[}2?'yxy2.ܟɓyåζ:Kt9Iӥ/.ͧYܾ֙>uɸKG\N.C.% ]'k/;}.}+ԥg{߮~g8+'?|&O&9}{piKWn߸.=t']z׵:u楧#'s6O.}/nOܼx}~o7tԏދ+3OFg^NեO>.|p۱KG5y5}{W.}py}yү}{ܧ}N9%C׭[~Xw.}tg^qvy\pɻϼ-v>:sK˹tKoޞzҡfy:t#oQ?ŅK7]koϵyVOsK¥ןuny6}^Y%/zףۥXuӹ{#yntP;G:t'Sťg_ӑדtЩ;'w}.};Nҩ'N\Xy}쎼vq'OtԣKougm=濤co}܇2odI^9H楛.鳋ۥ?>/G}{G8񑷎Kg..pw.Ot=~K7msKϹ^3̧!>E2/zܼt?t_K7_9kv|^K߮Vt].ݹmҳ0l^u5SgN=.??ۭu W?n.oXSNN=֩oWӱr-{t= -NhhoOwK'^^>.楛ַmtߥ[_qK^yo~\yGg38xKﮩGtϷsjtt~u)>]z\_ti=:/tny5}{~4/9JX]/_x.ݹtҥ&_?R}|sHN2?!]:sn鷞g?_yU|7ҩ3/NNyK|3K<.]]sV楷K.}K|XS}\:.']h|#/.K!ݹ:s|<ɼtiGoWV[5^4f\WN}_hݹ}xrM^zѡG~̜~peۥ_:su8r|?\zg=6].Y~҇|fw޳yU9M~K:mrU1/ҥz3/9 VåN0Y/t׏K/:N3\åWvwn?xeMҩo]>.o|ՙS_:t=g^zޞya72\^ve:Ωo_s/ԣxHo#oNp돼atҧ__tם}n'g+#-ȼtϟ냋:|b5eg^#'/9 3G"]s#t]7<>f?xѝS98^u?Im~̍J>tӥC;wBV}l^zus_:+;i~X&o|:mgDx#\S|6k?{^J:r~ӥ_zYCҩӯ6]׾tOt~/ϼt_{=K/;Xo.p{Ύyu^WǜU\z?K_;u7琾_?>O3/=.#/=8.t]]2/NR=upG^ QxSgҩVu腺͚޴֩s;uvw]Yn"\zJ^p]tN3X':u_qҙ~Н[M=ң+g>^ѡ'SXknvҳ/+]:22~ ]&\[Y[XNxv^:?/3.۟㼙.tްo9䥛wh^Zc0s^cotOǨ:}wқy޸tae^:uK>yYw9qMN>{sCc{ӭs|8f~8>tqҗu /߼t}qkҟys\zoK<@nst/qߙ>p~2/=܇<ΏҳΙ.Q|w}Zt;Z':v.EwN]|me<@:9D>?ҙO.G^vݿn@vuݥ3בOۏõKwNyk]z:νqkw_IkoO1l_ttm"^Ow;k?^ݹY7D$]}vy|N^uOI>.}O?;ߺŚ_>}q;}u~ףkyWt>nt|sw楳tїS$wu\:uåg]1]:tηץ׏KyҳK;]u'~.m9wR]s|_]s3O=o/teF!"Y}qak>-\z5?ltq5K)\z~?ƥҭf^zunԹ:t'SS9)QO/ؖn>;qtCL^^yW>.}]u8jK8Bҗy۸ttn^NmvkK?.Kť?:[۫:t_.]'a^3/=9>\vwMy6.ݾ^?.6>E0pOJԥw]/._twt:]z>~3d}ӱ~~~4/ݾp??gKr/m)V]ޞzo3'5pYȼtO;/=9+ӥKz9.>ԩ'.=NxC7O_=Х ~?kwtuüw\:snpoN|åo7.}߿kɚvZdsIz/N?\p;.GC7O.֣μCTft*K^m|\}W~|Wɓ!~}\{ӱS/Ǎ_Q~3o\1/2|9saTn>.=w۷W{=^9Mgyчl^¥g=(]sgt㝗q|yu$ϼKN}N<^t<z;枦Kw.}~HΜ1.gw&/=^͓5/r}Kotgtѥ'{w9t5mksNuԷqWԏ./yѩϼ7]pkoM^wp٧}bιNtoS3/>p{.]1`dx}o֑9ɼ:p>E(Kt)Kt䱯tႋxKw.9o[qnvyKqQM^w9yottS>.>t闷9]N}gGe9c7O^y;/=w7uqc_wKyݚ~mn^Gn.~SXS:qKHS>u;ǥ0Ķi:tV_usםS//:u>:~Mܫg!u5_%ݹ.]wN};lx gܜkZ]_qo:C?nҥʩoKO=Q3\{Y.ā9'׽Õ3'ǧg`M y>c3{5Х;eבː.}¼tߟHscq#ǙN^sir;cGnAt_3]S']z]_sz9y%d:kӵ~+~뮫GsHz{4U7o//]ҧƥ0\ۇkבӭ_ѭS߮S$_sϷŚq"/4[?.].>\S]zKǍK/K|tsFcq|8Yqko!e~N#J~|֩㜋rsMq|Cgjѱ?tvw͚zCiԩ⠛sWKK˼tpL>}(\skǥмt;wӼyd^p{...K'4]zD=ZGK>.|)7:sR3_GzZq<9I;Qn=An}G^|~LJ_S'C~|:v'/}ϭ2/ݹzbt;.}_tq<}>..mKm3O2+5Kסo=蚗A]5/}:_=.|t#}֩=y|K|?S}Cg)?tߏ}hxsWgKgNY3kedM=+lK\rq]Xkq\;7/;O^zF#Pt銛sWùҗ߬.=]9Ux.Z_8җF.{zƜRtp?.+yt9NҭܙoN:.G[gޘ;<>CKt+ۧ¥O#/Z?.=#2C}]N=ϜK]c.96=WͿ5/]KwDzop-.6/[]z /]psR[7pqKsM:ksʼtKk^z_\:·K>ٿSgN*<ҧ>K:Ksy:uRgtgys|O2w!뽙N}{9.ѝu']fM=Ku\ȇN7/9 n'޲fMY<_楓cr䥓yy\:~Kw.yo#/]>zֵtҗspǧ7y鏮ܳS^x?ҧcy:sx yu91yCyp{vKNNY=\zΑ;åGq~ҥWo?~.}K.9$[kWt/r9n^Gwn:NKKo;o}1Iw^Õg~:<~G^:ޙ^>.yK;ѯǥSLy^GnBttK>߾K<KKK/ַɷ:tԷ3~p,’go_7kΜ~[Ϲt~ʼ9α e^zw\s¥"q<͹ҩgK~kqҧk1ļev.==E6ly{??~u]ѹW2- _e/| ?ވX/G?^7_oωk%Hަy؎+}!Aspݟo<^͛'5soUν6*qUscwܑ^u8v}ݺp毷fy8KW]ν^c ޾5*yp:j~'ν.3νQW<[s○so۫_G~>ù78q|Q{cN:7o_5pM]k;oun^bMkM뭘~a|¹Col~sp1νv^9+}:Ź̛^uo/չk]Gzw[۟p=ùTֿ:DsD8cIu{+;o.{ù>soż_k ^u}8%]|8?O¹n\pŹn{8z|{itu_{~so퓿p^k8ƺ^y5cg׹vيgpg   t VW1y}nuߗgyxܿ}sg6<}r_W`Lcq<每KgF5sO_ǹ=]\qޯ8k[}=x>w_`71?ynn]_>\pڹO6}ǹtG}u#k{?n]:7}:=0}?o}n:88}\t܇W/'}sQ<>Ǯ./g8qU%}㧏+Jsw9̟o 8>os_7sSsw>Gqu=sg: q'}>>Ź#}u p >݌73>S8Y_:qqk.a~Ge8Odvm|{|׿p[_8/Ís_׹^ 0o׹NЕƹ[qþi׭'|'c>40"ν_:qo:=O?Gכ>׵yu̓¹;7_0 >u?9_׾eo^ǾV>}!O}F܇yo8c#}s>81܇q_8aNN|Pss30_~ܽ~1}DzraC{qݟ| wU? Љ_G{~lV{3uþH #'mùun@>~Ź7o{8w:w8zzoSne}Տh2^eu/ptqCLJs_槑>~߻OnSǑq槧ϟ8aϤNzo鰩}vs{8a3Γ>$O{'_LJsw~mwySouԷq_ԇ;8u7܇y>q~3S7u͛ܽĹdL}9^| >Mw7q4O>}LcS=}գv3KN=Kw'뽗zе_w]/GoI}sC3Ge^ƻNc[6}sup]vקn} u>~܇N-ν1:!ϯ8"}L?NU܇WwکGzCt_yq7}z>&}ygE_>:ù[oùϏ}׹{Kn^#}t~8ΣNx^d{8^+78aԭ?:{X/oP;o}\:pc'1>کoOLxЍܧ또>SĹsGzĹo棒><܇y8>:xS>2Ow͘{/}\p~qsen}S>.Xߞ:xܾGMs_ !=:Lin qv1~֏q_햧CN=ǹ{羮Gs6}ukt{q ƹCsq8989OsnX Csk׽ezq瘿>?ޛ'}n'}}n{7gẄqUo:z͘Sp[o_~eޟOuWܻ~muu.꽮pu7'׹Isq_?l>ϐOl=b8zt|S?ǹw'}u7ܧŹKdN}t9{ܻމs~ŹG|קyq1fc}{ӵ7pO{SҹM;LJs>u'>'}qzp>8?֣?Ozqw?s75q ~ t{__s_oc|ϭo/KO?νAq81.m=zs;ָ8:2q_s_ǻ3v>s_͸8׽emk^>ߟ-o[S~W gøatN>!}q_w'<{S_Y>Yuatǹ'ԏ;oy}>~p^/_G;zy糳ͱ㩗n}??8h5Hws_Gq/ܽs_s_1SǾ}6?:5?9ܭO>G 7ێzuƹAxǹs_b<3ߍ͍4y_]}ܽ1}߭?8?s|s7߇qG{soqٟ'ey{?_wٿ}ޯǹw=8oŹ{xqҽَ?_]>:~ܻ~swsy=;_{mǹ0}r?Mwhg@p8?c ׭d `Y/ѱӿup}ܹŹ.zq}美b|Posrug_:qzue[ޛn=~>p_~N{"z!}ͧN?siԭԷqҩӿ=8ߧs_8~|}sǹ^=ùD]`.=Nҋ1.}q|]\7$䅧OyfSYw߷Ku!J#鳋^>S'_oKߴK7.tYwNЕo_tS}cKg1q##ĥO+.}.i^gമq;ǹ_n >._tuüP]:} v|ttou'.ױХtq:\u"],f҇x1t!r~{ҟ複};3iڥvgܺŘ:vq޸v}{5Ot\KuS~rP~~\z.yA>7Kg}v\wK/>Ϻ/~t]:J;uǥ_~n qNc`W #ڡ_KqͺSnc_{]歏8q}IW>qާեO.]Kt>._ّ.t||K:O]7K|~}vGGa.>ĥz|ۏ\qE2.ݾF]NeݭCqЯl>qu5ۥN:(/7K|klu {.=nws]i:.3i79yq=ťĥ/8~>wwt\=.ک˺us3ϻ+~\K~]M^n`sEAVto/ۥ_9ǥS7ӥkť"ڥ:ɦ3Nu/qy~ώK|\:/NW#/Iu/.}n?uv7y|_.)Kt{Ku:wXx|?}ıqKKw}O]..}uqo~|\yʸ.}|KJg>Et[;up[ҷ+.} Kߨ+7q.(]z!.}u ҷW\>.}_yKӧ:Ia{\z޺ ҥK/BХptݸץ.uҥ[wj#¥w".2pK;ƕutҭ\;?ucsۻu=s\:n_;.}KoKut\Oyqe{\.}KoK\o||]rnOKs]/n>.'/} XN}ɫK+qKӥzooו>XG;?.}q:N]}xt].ЁOv\4En_.?t.>A\]W֥tKӥw}\}p)o]{wȟ?_ ..}ط1ԡYנ]uΟۥ]z.uOt݇K>F]҇U^_v}Yԩϸ֩K$\,cǥߩK7]yX|v8i<7]}q͓ӥ__qss ]wF>ͫ.]K7OJ?\zǥ[>.=7{|C{Kt]>̃ӥ~9>3ukS~\zx\K~gvt]Q:4KK7S毷KХ[? ۥםOw<S[K^:tyqХϓ;..}wlj硳>\w_ҥSԥ7K7.}tq~KOD>|\] .v2a-.>]8\GOS\z;&\z;^]e~u[֍u]JFn.3p+.}:ϝ+]|:Nf|e[uM3ĥХߜ?uďK+/>y{Oҧy{َ:}|N\zãKwץCCLi3ťSѥߏKOI>K".}?O|KoKS?߮C^>|gCC\z{>Kyݸayҙ[֡?^~MǸa~8.ҧڹڟs>֥Smu:ҧyΜuWKһ^Ko'KK\8}=OwMW:K|t^sqzt]zߎK8ץn_.}nu`tҿ>uk׭玻O]:=t}xn:9<:9]u^t'^7J:tAvKWN:.|?;.ҝoyЙOKSﵞKVϧoӥpoե!K?.}vytG/9{KoKO/ץ^:uC\zKґGyGw~NСK.?Ϗ|^tts{_o5t[ƙo>[wԓ1[ѧcy^?]"]z{KѥOױԥ{=KCtץt|tХߜt|ۥuR90O\zKzq׸t?dtҝҭ/e?C?-:kǥ?ԥ{K{Z\9*ҽKבOե}եӟK7oS}Mp]1a7<ߞ:v+߾FK..~|]z;*]:5]]4uwۥkwҼҩ_KuqץCtOYA. .}g|ϯKCǝzv.;.}ǥzt\][>;}wحG}S6t].ҹեvu{|\: \:෎m=owv_n?LҝGq>ĥ{F>;{~1.}ӡqθެsqCtۇrp=өקKEtaѥK]*'9Y_å_;/\^1_zX|g]v_p1]ҽ_qYg>?‘O]ͺ t׽ѥ;ԥv陏҇ymݺ]~}:ug֥ҏҭ+KgKuOc$88cN:|~'ۥK暑l_>.Kǭ?!N:urLԭMtKיlS|0ƥ۩lq麆ץKvKu> nR>.wٵK_/$8ͯK/~x,\dp~9skn"yӺuK?u;t[γ>q1y2<:pL݅vN~w9w^:z{|t5K^7I..(.].|v.:{oxxyz>7_nץg}_>:4|KߗwK?#1u o\KǵKש];.tK7_>!x|z}A9}q䝷KP~qNuKg=v~_Kt:]㸨LߦC|}]z;_uwWy8o\:uK}}vN~\:F>o֥?y>ԭ8>[g=j~~^2_=Y'>{\zu·pko/\o?]7K?t9cǷKW>Erå{_]:uU]zK'nX>[K#ҧyίKS\}睗NN\zK7;¥n}>曻ơcKtq;_0나}>q6/}u~oc̯K?9~>t{~\.C^o>.\zA5/x]9}#KUwopͺ^'>u:?y=}_3֥[Gnn_/.<ߛo;tKw?oy2-EOt;}8者i^k/_Wǥ..uuե>K7?Kgqn9ݎ'ng0?R57>@Su):}ץgo:sS3:u{;yK싻ӷ;|oǥ?:i}.}8=>\q_Ky.p:8]G>uq|}l[NƏK?o~|~{~Kq靏N]K]]zpg|.vۼ~t]..}y¥;_Х{\}S~3>uuDt*qGKםҽt\{v䫔>Ko]N_\.uA.}'^:u8rӛy߭SwU89^{_]uC0.쾸1}{_{gwt#.}o.aL߻kt^yd.ut:]:}u[.ZJgчC_gt;/q;hg~K׍[jNPtuqi]s]GNKґ>?.<.]e<.uf^٭wyKc^Jκ͝'q}{MN_C6]9>:t5O=]On^.]WKc^K>t^Ǽp{G~\wԡS%{/:>~cȳ:o^z>楛ϋKrv|t.spz9N>E:/uFpa]y=p K_ԟ+pT?.} ?:d|}}ҥw:y?޼'C]zޛWt]..]WK7X1o:~?_ǣK y驗||:FNw˥g?}K7RN.}.}<]pzZ߮e_awKו]GM:MqwZ.Ga~\.9y-G:&r|;/]Ko?OiK_.>E>O{¥w=MM#1}v|>.O9.}ǥ?Go] һǥcOb^W)>:u]7K9O7y}?ڥ[ХO?]w7_^S曏Kǿ\z׾[:sN[tǬJ~ẫ0Ou]_ҥ?qct|yzzuu^c?._|ͺLy6ף~S>.y:tN';/|.}k^:!K H]zu^t?wCηu;ב;>q)u۹5/z .o߼vKo~y8[:u{uO}}z.߫ץSǥ:;?tmեyCK>xׅuoOƘuR:Ը9tߙϼ.vۥ?=o:9`ҭיt楻N/.{ 2?Kwݍץ?^g>KwݛK'.fcgtѥҝ}֥_oϯKu.t7+\z_^>uvqVy鮫K_].ҡo3]_t/_?\늾.}=owzS_t.}\v8S?:.nQoOsK;6l2v׍</:tO9LJo>g>.xv9~꽻Sn?swo]:sIeY~x|ץ4l8#tqd3tyy;ǥ'O /-]wui:򸢏KwL}'/~v:<]2/ݼJ9t^>tøtrڥK7uWuoO=q+ߌGsww.}:{twOK7_un?v;ޡcǥoo~Zү߼tlnީ.q_uޏץqtݱ.z'/=w]zq'v>o}[>7cXKv酋9ܸuۥ߯c<9ХÎK/].5ҹ.utӿGwQS|twǬkzt]ynu:l߯cgy鷮Щ+.a}ts\u#]?'Kکo:zq黮ޏ>v/iޟ=y#:G|dWǥvʛя_#Kg^8y=o=۝N>>N.}n.ݼhҷ߼9ҽyy|.=ץ?sIe۱;?oCG?:dzN[~\|˱.]:toN~]`Kw]G]g:rNS~u?og~c^qTۥov۷u\Μrf|73\Kutڥw>|sL|q)g?.}0.O;_ĥy]{Ϻ.ϙ ϥ?UqqDG׍Kw_zt>yۭkΩkāY߱]_5n^:K]vuߛ_x~~]zܠyץ?:ulm:uu1{NJKz~W_upӼ8\xn>tu~:4q˿W]ڡ~NK>u<ñy7c-Kl~N^nPХ:v6ƸC~[mХߏ˾yZKGy=·;ԥSҩv^ɓ~qn>vN}w]y͸7Eǥץyp߼~˥ѥ?:z{Ssy}tG.]m|>y:t_pһW.=?.Ϻ>E{c|۾s+ǥ/Kwtyu ;}v9x۷|y9]gK߿.}K..?]?.ϛ׆KA|ҏK/םWC~ץ]z~p|]h>_Ϻo^[>KKo7K>D祻N.|O^zr}],}ǯ=vK7>''\_?:'/G^ÎKi]Kt}w^:z>[ />@q0/^~>c]KO?_SܞO0_w^z·u\Fݥ]: t]Uҝtm>6y雎8.}Ko>k>{Cyr}_os|C7#/oq8ݺA·K?.uIuw^tU1/ǥB~}]zu1y靧ӷǥO_>CN_ܩSg9o!/ߟK??oǥ^ǥ[By_?]+'/tnǸvӾᘺӺA'ǥ;¥+.:.}{sKu^>ͺ<ǥ]YnqKt欷äKե}Y'1Ωĥ[Wեץn*~5/yt=uwts_uM楛Wd^}>tvny>s7b^}+6/ݾ2]u+¥wߋ.޼~/.xKތ}v) Wԥ{K:s\Й|C}sw:tS_C׹/.ؼ2ov.߭c'&}KO盗'/}]:῿3?.]7LK?u̸uҭK7Nn~.qwusԥ}t].ݾKte].?.1<}x3_qһXWKgvu;}vw]kåǥҩlwN]S3cޭs:?:wpӛӱ.d:uRqܬCZo9hN}/og|җS>9?{]:ucqյ?+\ ͷz]z~t_.|d]:yx]:y}vq鬓yɤ׼t?Oq:k\}bnyS>tS_ף]vǝN}AO]<|ps]/\ʏK9{݀|>/?޼;^.?/Ϻt>ywr:N;.[n=C>zK¼vqiѥ{K]6...]Ko.wץ|@ ..>vt.W}ο>~]:YwKץb~u~N;uӟO=ҷ7?uHw/۾SN _e\z;K\zK_KۨKw/_NM֣.wmt]9ҭ^o~qS֥|t鮓ǥb^L~Ziw7'] ҏיS?n>.ԥn.v]zSg]ءS^.ԩ]gv:ڥ:tq?.Qo75:uǝN}GY?1n|t|2^~u\ukK.9it:qe]ͼtɺus=KwKЭooߺs/n2+\SԥwR]1׭ۿw^S.:ut3cn?.]ťM<;;ļt]y?>o>uŸtۥǥ嘗~ۥץ.|c]{]X:]gKס+s?~r>y8z4.]Cw:uǹus]瓗>t|utÿKlǥҩү7]>yҧ߼z\D]vqC;\wmng1u~3~ƥGy8K.}o>}<ǥn}ѝq/:w|]K /uڥ?tڷq8ΘOїz\֣yqەo.߽ά.FKե?]+:\n_qK/йKK7y&|\t;r;?ys{K>zo緟JixKXW|8O:t'ºby?=.cu']0.}ҥpCzvqҥ{KF Kǽ KK;|v7>n/|ɼtK]:>=i~wqx\z߼toַs]:vc\8p/AM{j gW;4#ל%| l/K\{K^4cv2u|oc 맧KձԋVh}yi7v>eFu8؋aez_{q^߮ND]^^պ PDn@4|V'x;MVz^SNTidw߮-ˉK=^.^ڽXbxzlϮ8ոX:8e_mիi4ue&2<׭ OE0}޼^5^%^ZE)^}|zW^zgWůŠQ"tkRyK}^j˥#B0Q~ݢۇ.;/ ;M?AfQ25|^Fů{BVbo>_u_ԑ捉gŰŭ'ym° kc]8t#3]6\{]=kĘ v85*˭,|e&llyREˋАō(`y>bWχQET^{^::|}avPgxriG L]]nwvWKOKđ3Z*WYjC^:^Q]5Ϯ6~U*2enxO??tˍ3ln2jDAuQt&2^!]`\/(^kANu]ZXɥǭt:=/H1K!5Eb;xۯ I~lw筯"x`wS׽; 2}4G%ܓ5U0$=/=v㞇i뽛vs wB]Swk>֔~*UjF`ݽ۵IW+_)#-,˼w]Q^Zۘ2Z4d+Ķ|v^p- .S'Vv!]F4j!R $Ԟ:8i]QeO vmFS|&)/]S@$]ݯ>מ1NZ&6.#WL.|`vQeCF]tQS4k1S=xȞdί^= ƞ6y}S0:`|uȔ}i.VBaMĩVYK1eSv&j` u#ɛZ[7>Oezs٪ƺү]hެÈ{.ž.rы0[œ`Ϯ`65^.2ih y~s\ңP%K\z9g/aλ]Q{auMv0xK2Q> oym>7k WArRcD6φpW>濳ZΙ!Zyw5!͓!rL̵.!y^֓H2`5tq}F c8Z^IϠbK" s:0g#zy ^+yKORd[|$3U [Ώ?e9Y: Y'IM3/\)7GuۄU.Z}TcqVa*(*ÇSt ]7B\ @y<.<:/=ߣZ6/iC든m΁0VG^ԁs\XHoJ@r sƗG3\\׋c[D"ש^-"W6j. (BWKZ!L= @./.9r%QRˤ2']UqvukTj{rܵ8\|c5q%ez$dRqjSHck@c82>≮O}QVt|IY%x޼5 ^$|q_҆EWc:Tg| Rukrݘ⮜F*.} *7eJ&kS&FU&'60w0c˥Ck* ^.dH<#0⚦:||Cc=xA\ }PaÇB;z\#x6uup&Pa8<# R.U^phApJb2\sp_x okJ ^}=JTWZ W탣Qh@ OauK>_ 1%KpME[`6>kjw%ImFԁ7pvu8< C&PqcT-s ~_$ˤU h7Z@/̜pg]CK:][#PlGi3x'140E{l6&!ӢSpׂg 1DNK5N DvY`Ac*wG3F/ԯ_[0}/H@W#\&޷\-ܷ6w 滿 fE hS;<%}˅}ݏI=5U {w€|7Ʒ\b+ķoCŵmv^w{U`S|tG``x\wae\To[<)B4'*Z˓ykuovkxkzok" k;.[Jz)^ϓ ޚMc3W-{Rq3X=/rNw‚w^ݵkw4rXX[/;OoIT\9$_ɛfHZnot*pOs0=ގ-CHu-E?@HQ8]M-ߣ 2{6FJnIukxu~x[ܚZu?YJl&ɺx\ `VQ5D)?1V!uȝzkO 1ܚ]m[y!U5E_n>zzFu~­C ߴGr{<} n)H,vvw v?4>gFg(ivtxn0wEj5}.tɒ>[L/\=58fRG_-#yI.wmM)b>٢CM^HStd[dF`l# T\y9{tF^(6akMǧ&xWk_4vYB&ǵ$cKa[ܞw-css7y]vCi˕)S>ZWz1-RQh=_mj3Yw Zohg-gE%Y Y/}&L6%n.ہ))w^q&lv[ױfv޾8Ye_߂>׿hY{lvu][HHR>}SN;o?L9Q"ZW%NA,rYQ/R&=Xcc}X:t~b'hXͭ9ǭ)HfEbn@>c \Zݭ|?}g [B uq2 aE Vb-yok.Nms}%f?Һ+IevVWxW{Jju4/6^bWS:]80O?ts՜.*WUz)5\W-3Gxu^Yb2ëZozZʭ1j7y~RwzՒsHe"ӝ!}ۃ.'ehdW8ǫ^+RU1rT9xԫBPU}xƫx7jt=n= O{K'jxMxUkzU^4|6_WE _`,@Ma(R=Ͻ>ߴ<9}9Ukꜯ,ëF^~ӒuūݎW5*5«W5G{۔auDūk.gz)ë?Uw5m>fxzBϮS)StOקz~SUK{L >xK{r-)Rsռꖯë|S4BU-Uk@W / }xUk]^u-W}?SƫNx';zSG23z%l?xF,HpX0r2ǫjpfUWM?U T\մ<]xtyIb^xU~jC>iC:iԫ TWXWSoh{9?x ƫëƫ6^)~7y#^uӍ2fpaFTg >^2xUϓxU)Onj.Kz/W_$)!S{ܚK]n׫vU!P:xCT{@_WF$[:UKW}iǫ~cO{Ua֫jUU)'^:%LM/at y=ujxU}WW~[Wu}Pƫ5u3MU'e.H:˫NWWU+īNKWU&ѫ0V;ūJxxC7xZU=Qī<]xUޅ]|op73v*{S:rxWuīNW`nځϧūjnUi:z>}U]UI:aZpҾǫsU5xv?WES~uA}@5j]^aiĺc_x{W7#^u>Ky=OZNvU9Uߋ'/v;<3%OǥW7^'(ī 6:^UbW5Qj)^ū*Dq bxՍwڪtyս~47ONqk*{W/id^u*RJUY^Wj ^Uī ī:«v1F{S5$twyUXǫu#`JU]SKu^u/⓯OC_7v ~xU:^U W1ۺU4|UMë^5Eӂ+ 9>ݍj1Oav5Y!׃x:ց^] aU"ƫMW58 wz[SۜPХ^5L&2tVM W)r*U]xUsd9ur&xUra]{[ī>>U5\xU1 ^uezU۫rS,΢eAzUaګSq%|v]Og1L)neǫzf^5xUzՓ^j I2uUݴWQƫJBګnx+_}<*Nj[Loxݕ7Uwn{XHnMAwSDѦ 9|Nƫ6W5=^u+W50^Xs2,zxUsWVƫK}C_ƫeUW)HB]ij$ڠzوW/;^UzZ@'8A"5u`hU5G UU7iЫ]W~H >^{UU;L~rndh~pU1tOz|FWݧZ;L|j #ݨ^SqԬG"xUV/2%jZq+᳿ B+xUDC;)b?'G-ǫ·*^u:Wua*~ί^yUUW~ī';׎kfljI{wvn-QxUτa$^tOn}Ҷ$Pk\UmU;yሞūW }}SK!UxUS>!^^YP7Ut)5UsՆW:Z|#3F2iYB bX$*PQEhu`vSq%P7^u2=ߦ {UѾ$s=Wum jƫz1:WRqu}geW5Q*ǫ3ҫ*ǫ^FU^$)H~|%zUU]'xy52t~ ("47*?OxAͲ~E{W-U̻WxUOAUS*-*`RWS=Y!GB 7^3j׾U][IPڃUyUUëگW}Ly=y|5勃W-#U;{׫N嫡}UjīW4Kaī>燒2)~ULx/AkG򪍵tՍ-Dqy2Ѣ-ɣ},YīzZ7UIU?W/^Y_j/ZEcjמxծUY9WdlnūfxXqfYM& y@_iīv *,q빊U7|+RjUSYlTٚtxfzfϮgʻxTëzrë)pc@V7WTgLA^xꞡ|5=\մ>UUg1zUHĩƫW53^{ʄW}񪷸5^uxUϢzՍ@5jz9pZZxbzT!^u>'[A*Gu. \!a*OisT.Wm [wi*D6*zUqM꼌#~"5G:0Y= E{*z[9ƫW=EzUĢ^5Z ZjIm^UW+Z,WmY YIUdؿ]=.68fWPН;ʿ=~3d_ΙN o ^u^דWb_WO/+w͚\W=GE?76Hy7u[S}ܚ2)~!' W ޚ4Bm*x#We&jMCgǷ īzW}$t:y[_^I*kUYDZ2aiƦhNLǫ >ꔯT\ǫzW5:EK M99*r$L5+^5:|E7ifWfMkoMŵaWw9o#^;SxU;aW9U5=mNUī%oWm9%_ו}*Pty(#ӫJJ:jv5NJdQfDY 5v׫tWeR_zUQ<^2@u^'xPq,2Wh/E֓:pk(Z^xUxUVѫv( 聗]@ԋk~.MjZ^UWW}7,ƫ^zETjx~n[8=WEwn4]@xUoUkFk^zUJ7^uWNw%neW/_wl!x iDUO~DaU}y*pzAs>^u*4OZNGīL^JVOjn*Xūzl$ӯW_͚]uj:P5XkGg{o*Obmqiƫʔf;UT_[Ͻ ӫTW=_fM#V^xnUxU&ūZUO_YFW} 9" p5k"16pixUoU훯ZntOMxSʆW"Sj _/,^RN֞"u2xy«<#U5kZ0񪔸7Y0Ttk.7q++b5eNPMOd$qzj͝M8r+rYt[Hnm6Ÿ 0 2ƍʶ]U{AYuOޛ"o" #'TU6Z[,ͫg4,y4k]W-vVXP=[F«Ejp\WUWM@Ի<])= Z̍^tdzyX%t3ـLG_gxU?W l9 )=07a/nʱXʸ<6k}"C!pRͬ+Xꃑ@sWL:@j$WԅUCAD,oQaMWnK**(NMA_|rQFټ eU]qԼ%Uq8=Pɞʆ[E{NcU;Y: ^\p5 s2U`2WKQTíj0)^"$U9NT5s*ြVW|yՋ$xUW-D̫9y~Λ@`j77:mӕUg^j6x"L=W dֆyX @ȏΠzWs3%ΫZ(xUX iVumWE!xU z+ms[uT+}Uje}RYd:L*O^yUZcY uWMv*{-w"uAAGWMūaP4xՎ) `)O;jUo/^55zZ }E5Ql0Uu6,1=UGU7^5]f!3R0J 韐yU+n *U9s&jjY+yJՀjY̫:k^)NIW\3aW  _Qz቙RWMdLHsϥzT-.:LVb@WU/R/a }M:«fK6zUMcU7SG )v[v$ = TjD0WuWj 2«W6O!m)^@j78i}l}U#:*DQ?yc HB,* j`Une^tWuW-d¤ )^*hfNuTmyP#@ @UJp른zC_0 @_9 m}UIU&Z桯|:ɀ4ڷ)16V^K_U!^xq #`}Ut7U ͨydSkejKeӬt0&9"{*^ΩxU@xUk«zjoxa3߅Iūt }UW6rK_ oGx]U"T%"Z jq"^55jXXL": ֝W^ߞīЄu@=ن(*R'Tw0Mat˞ ^n+ȴHUWUͭW%o^5 `«h3UE{2[$^5U WT@IbU5COj(&vLuTk^5Xq*TW 1֌R0zH#*EͫDWmF2g@ yH5*h ^՘jy@ʷTUS77j}[[1L V!p9VU~㨒iV-ljyPj^ii[Mp[tY^!ſWSU{WԀW%^oͫfÏ'=={+%ټ**k Ȼ('dK (^u@XVoEW][ڍZc㫪M*5*96"n~ ^6oU@2U.xՐP?l -vc8U*m^+UCqT49=ǦE+^Dx4ū8WZ|H#*GW&ڬZ| 3E;J 1뫎%*Vò'u ΫZ^ZRT-l6uTP Ӏj[U"$J܄W%o}U3xVl^5Qȼƺ*xˉo5W%ļzx=Wx1/2oA_/b.¤Ϋօn'U)e}3yը۠OE0ëIX*bU= 6s8a|Uq`(U]^i(v3JL&RsUC (z.7^5 ^BZW9!8xվTŁͼ2`ͫV cZD0̫3 ?fgl+xUPoUșW ^5źs}; Z íJLՊ^՚,ͫE-Pxc\lpUɓ1hssT->g% jfJ3kvs%O 2Լ*R4sD,U)þxռ׉W-]IΠzkTkǬSx3|H2zt ^4 z`6b-]AU~.sЃ2VW Si"\5K_5aU˼*WyUx[Xi`Tyb0Q婙H;Lێ&t W)}UW- wy]#Us^ÛAT~yUXūFj]^gxU OW-|4jgxbUjw~ڌ'7UHLpzΫLp΍WuNyՓ*^5 k<5ūaљ u[A_gWdZ<%"^vb7^5Ϋ:/ ^ZWՇ`xUU[d Uj}U4R3+d'Cū@_58x-<誐=uA=WYTeUu3K_&@EigrRݦPr*&T)O5L%bEw(:*Jꫜ@.tuǫWu}{xk!G_ˡ:Y-u^U-+^XNW=U0J-)tNKV ƶP?PUa|5OTK_J@s.k^E8XĔTAjxU «:>U5W6qNy2z j^oſwT)6X1%zǫz z-]j@^SRȋ-glW*x*eV*ͫWՔ ^UO eEQ x CGRdfJxU6~RBAUq`XיVW ^Ռx|ͫWmVnNy\j_IM[ ^XڬHfN& m𪮼'^"«VF;U@H*̫j5YP-K_j]jqh^2c{A& H Z,{z4PXFTKDxUyW܂W=ܖb&RbW }t[깘c[!ë^5NlS8'JJU6<(׽U'j>LwP'٤'k6zͭjWrƫW8WUkz5xU3 ނf"Hf4Y¼flj'UC25m UѢj1 jV*V]@2+i8+~& =O^5C_B%RQmh3R@WkKWmQ'1U2*@m^zW|\<$UW-wj|. ^4-UhjUΫ{}U(«I6i34kK^28HL&RUlPhF)B_yUJ]-^Qlyd'=]^5O]!1Ux,Z+!RTjVSƫb 2P4kIi8Ws1\jbz諒 o^l * K_Uj7T$ͫvq5b*UO WtI@㫷«k^vI,Ie|\?* yXռp0iuږ]HQ楠-xUsZVj'  a@UpxEW ּ*m g6UU +٤h^W+j9^{^5 mUMf a@UW~~Tƫ|ƫLur&؟t| /(S\?O?SŇC?'^c&(ܟSŇEs׋")C~z/ԗc~OAA)? Kɯu~Lz_??:O}/}-Lz?wWqGx|>$s^/uZ'w/>''ttzЏ$|^Ix:}+rKV,ef7o|s7?9 7^̔wojOW;'vT49g]#P؎IIvkR_b;fl'6v-c;'~9w<~LwfNv3M,)Mߟ{%YU#_j,04DX_m63mlMØxk>=1 v4)v4 IxY!i>2/VG&jXW} gE!59֮<vxx:#| a3"FjضWǬArljHq#GHܛG#KTl[pǫD"e_I?#@g=(< <_cTگaHUkoE*ݯp&Zx;˿;wԾ-.oʷ"}dVj{ABQu=L><&y-:.J=qe}ճxhx6h遁vp1P5ʱG:zTK)Tm4qQ@{h}\iUGO}p5#鞃z<REJ53V[T}nXc/1Suq]s18tcL%!cdi(7"5|Lu]{fw@3nvY?fWGk @n/N!{||ww?Ξ\iצ"%{_t7U[I.^ڦrǻr?4;m%=gw@v'3㶻:^u7\z]o>cwmY9c$?#ӮcjN]/);ȋZ\/,6endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 612 828] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000233322 00000 n 0000233405 00000 n 0000233517 00000 n 0000233550 00000 n 0000000212 00000 n 0000000292 00000 n 0000236245 00000 n 0000236339 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 236438 %%EOF brms/vignettes/kidney_plot.pdf0000644000176200001440000077260313202254050016251 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170125183859) /ModDate (D:20170125183859) /Title (R Graphics Output) /Producer (R 3.3.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 255677 /Filter /FlateDecode >> stream x콽.MGq&*3\@ $0 A>ʌ(`t_־Ɋ\k+J˴ut߿[O?Ogk?ϟqS+qQ7Ͱ<>8 +8?+.n8t\gċSpV'j/?juY-X՚gZh5wNm7? guwY 'Ɵ'.+jO%<p O%<CGT@^8k$;c-64e?gqlvSpΪ`YqVypV;pV8G{T<:p`W?h.\o.K %#{q)\ןfgu>x;ߺDZoݮZvpOӖ/ޗ;*>8+FЯhgEna96C}V>ӱ;^4 aprj|2x~ԴSFxAf:z6p3 xD3‹3;}ԲAp7^@XkNgi]ma۞ak9Cϟ~9^Y궐bE1T^u#|AdX.sPn\ިE P/BZzu{zq>7laWأ3737z@-k 8ޗ_%n O14~_hʦ%*Ꝗ~ S<@׋m6:?Tⴃ =\xwGW8?;Cupa_3]؄GNxH-@=@t^_PP^\ DMق2ee˛!9jzgXc^n}hTzzejLMSt-9oc*&t:Y-+J6cs^7g,c ZR}UE~Qνj>*T^jB8FeM~d]/?}W8T0UP^X/C2V($֫<|[{ 'xx\ER{+zn2}MAB`f^.3J8~z<3d h8?['!sr08?yp|ڿ!P^|:C8o}­60q>A~0\WZUl|>={ƷzAuʦzAu*M-aҎ?^~p<+K︞mM0YZ}kkt=G%|=Uv!+g;i?_ Y1Vګo Kyұ,>L ՇEf+ջ#~\K{c\&3x]73IEI|}񬑡;ywOdw*ډW:~ފ|Ⱦ0 ފ<ޭ#,w+]{#wĻc9"DŽ|wyNw"8&/ӅaKޖO<ջ,[3FH N3#ĻNsMĻk%ŪJvﲤa=0|]d&xznwO]eCǵWߖ]pҺ53K;Tp=K|+ao;xw2ջw0f#W;衧)mf#wŻ͌wKn3g(ޑ晎_[W: |ߑ-rmi>{||zz~?G\W<3_mn3m=_|s-^ϙ7x=Gl. ozesw%S{<6x~Gm.dz\l9ŻwGoN)=9Ż#ǻ _9ޝxw#^!zC[\y6xw{Sz1pwZon9ix˛KwZoNN-~g`3 x=GNN))x|1bkx|O/O|;; 7o|]wGߕ+}|n਷v>8p[;8ꭝчS=;r[GzKQoxxz+;9ޱpnd}~Yߩa%g}~)ޱ_#rKǏrJzK$R?J9;lfLo9Żyg}~)ot8;+nIopMzKRRU䨷ԯ9;{9ޱ_fS9Żg}~IoJzKg[7<|]wedUF[z\YoViYop9;oSc+ƕbݓݓݓݓuݓeݓUݓEݓ5ݓ%7$0+6⊍chczqW jlߘ%ܝܝܝ۝۝۝meFƕ gQ47lID!R` `2dKf1xBYͬfj3봙e*mf6FY4s0 &nF$&$P%Q1N~$\)Jɺ$̚ldI6"YFc#Zld)&$a$(d>;EkcM8RaNx%ueueueueueueճYtd[dy<`>i [ Px k P K P[X-KVe}ղjY]IrtsauÖˆ5W KNڗO+;/[y97jnGK}GI}GG}dT*#*/J6IIoA1>~¬At.&{ 8݈w 71{8'G};,=G\|8AlT&>In#0AGObO=!\bbvH.@72eV1o(q;B<9?I+Cx]x-0!ݺH:Gsrq$ްD[;!p귒(/ PpkvtzS:HvCȃwtSX 8O voc!aͺXf8E# 0ioo,fŏiih 'CZUE:_,iu_5 ,P4Hw|~Z.9w@u?-_ }`qx7% , cxvt/ eq 8`Kv>,ioFП?$ HOȿn;RćE E5q[+d=1t7=>TZ^5$ q#dSxa~2eĭCbkגgI1CH񄌚1QȸO -TQ3zk;t u-IF!%oPJ{R7mb\H;i\ 2cQp"j (2,5[c85AoLg(DxY!El E;l1X/q~WWoc|qcXWAc]j3sÁB1>*p.8Q0 c|uK2xqЮqzŘ|kyb[ ](UEh]P^燊qd m4+8DEITx1-k1W܌`FEUT+g G(*~"*pb!+]z uec5+k\\ iu4ؠQc8DQ1]Hy-Yl+r̛Xr ko|1oziL:jQ165^q6@E*B*KywcDE|[sc|uc:ܡƭfr*mኊ1oT -=ڸuj/6n:|ё w,p{xpdQcbA/UGq zgt#"[3{G xcot8F;AEO`tr11s:j/8#ǟxx17;|㇎{(F[oX::} zc\/:}Bǔ1):,dw珎,C }_'^#_$Aǘv{ qfLB|бMo<ޘw3n:lzk C7tY|#BkW4 Ļ6 ^ #X4濇wC_@Ǥq C):26ޡn:NjܑvS}yh5}::^EGpȣwJ}7ثw ;z`[z*6wP::]Xv}ߛ[r\-wAoqMuE8O6xqNH8?wW]}JpLZU ĪXxep'ˉA쒢{s>ss=ss?~]?ϣ~Wh>\H.H nnC_:,^L= \I.kvnx=қkN)Ix'=8;)Io9i=N=;G6ﴞ \nz \h=)i8;x֫[wxpﴞk8;tpz%;63w+;Gߕ+}W>|]wG19-#G|r䨷>HNWwʧ))NYߩ^N1ީ^g[Io9-c"xzN䚮xzQToUcSpwNYߩ^w'zꅑ{ꑛYꝇWw)ީz8;kg}zo/;Փg}zTώᑣR==r[)ީ{w'8rYߩ_pww|e}~Yߩ"rw׈#-R?I䨷ԏ9;DN0/9;DNg}~Yߩ(rw=;NJ[[w:\RT䨷o9-kEN^gw;’BLBDY8%p(%0k%ȊldA6YFc#kL`’ d,`E2J7HJ9vžԕווווuוeWϪgճ EǕP< vIbT?jI'4[ P y9%V eղjY^$S 6\Ǟ+=[\6jXrҾ|rXV^yAw˹Ws3/>Z#>J#>:eQQPy WIN㠟û`%zo ީ틉^AxĈ-><;6p,{!u\9`5\67bG|z@I+q^F|qK@@%x0K@a. gqBxxBh>; gqų #'>E`$S`{O:sU_L]D|]jD\<+7ŻLx_]8F#Gx>w^O젋6'I78s̰w~Z;. $ ?H"8=?/#-‘q|~Jz,R*O CoE:v 1Ԧ w_$)$C`2h &7D)e#i)b8 ޓCԞQS;7~zBjqOB%#.RPLiOld,xΡ=Α5# Scy@hsd\+2ý hNd|(GFؘС1c8r[욅7dDF{.#mLG?5]17 9+?1Q'bsi9179ٱ͊1 *Ƹhs{xw)sٔC98aE zc:!ըwŵ9'=k.!2HG|'<7TD˘{{E 9dE{@f)*vsŊ1OIoqO1wh|Qoni|"i=;ci=Q4濇 [Ml_Ao &*\{vKR1sz ~c'_UT7D|c o=--{T̍xgri{ƈo_AoxEtL4VUǁ1s*ޑ0/FcME-}]l:j=cxMI-}K{[[zбa=ڎ|0FGG1;FG<:J,vf 9zt8cw7kў73C­G{C@az?ߋ|z0#ȯ_z(:G~_xб+Awxh(A xxCǕO8!4߃[t|˸O8nm?ݚ}h5Bbбvwty<7= :񾢣Θt*}t_wMn;]מxHxPeG0aJot?Ď=߱>_sC):JEbw'_lNow̺yGq {Л>wSsyw}7vRɱ[.:>+n; Xvߛ[rP$K zK{lczQvT譪ٮHm;]?ÁߦxEG17;]Qбt[`c8A뇰/p>wc;l}='/x>踟c;o,.3vz(8?W:|}Us>z O8l}G1 S_Xׇp/#חSK8t)3YSֿxplzX{8>|} G<ݘ#:N_dWȭ7/X"~ txAg /`v/dE:vv6Ff _8#h'r</ʑyqsHt$9Ñޔ&r3OǓʔ~TD~*[vji;:vV0gG)3:̺g ipW(m'$xJ:v:n'C۹R:v*iϹRΕ$-<p$|3΅5;MG΄1ߕǥs؃~}::wŸ]#t :Jw큎]#u2X= G.d'8 n:ȬʆCjCtnfR+|!qw*{\W<3_mn3m=_|ף8pKk%_S`sKWԆ \Rf=XOz.pI_c3d5]OMm'[n.9INNz:pwSpDN)1_txx|Uϊa[[̧Yo1wx|f91_xxx|]wGߕ+}W>|];s#G|p䨷Oчgwg))~JN=;#t~Y)8; 6Yߩ9;+"tLzK#-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSJN3;[g}zTe}zT>ّR=|]wGߕ+#2*W[zK[[eUjwx~1ީXxhVbJɺɲɪɢɚɒNMšFyfQ\` mjB?؅#55 8/ met@AA8A81Bx&Sd8×c8TY,fi3˴U"mf6D;aLp#ru5cIX1Np(uKFd#+zld96YFb,I0ʢc>FQtk 8R:91{ PW^W^WV^W^W]W]=Eט-~LK~̔LjٳMcX9O +zn̫s-R%RQQ_ p% k$k>|_~,衃^AxĈ->?rAЇE Csq@Kr_3+~WWxu#><|8v9(Sz s<{G5Ȉk~zhr pG% FAǞ4q๧7/A'Wdz㙘 ك8~[?8vwpxO SO"8O. /ɱ$q$ƢyH:Cse b=S R7)@+@(@(@amΎGXzS!dӛ] ۻw(o7F,}kݑXH8Y2z_8rKK0ܒ~% qb3dSjP_^v,Ƃ08oXbk t%Y2_qV_8@2`FFX:>?- e!v{EKn8ǚtrQ$ D0Vh ᯟP4f#=1KBbȶԆH| 1A&H=Qp2!c8~JTsĻ;z4C"3 &C H? kWJN6n:oʊ{ĖH{g>H523Q3AȍAD;c8 c:sOx(!)ukRdBFrܓK=Mz7qkOkd\[p_b Z7%37?116c e[{[1#m 32pT"mLG<ဇB#Θ1(DݘB{ɴ+=M+)* tw@/swH ,:v燊[8{{X"G0*&[y iOOzc8QhxG!7paJT ?r̛*zWxV ~6RIGiT䌯7C+zt{Ϙ{CИx(~h|=荧y1c4GEta=TTǣ=Qq5lĬ4UE_g"lccT$#3*D1oA8'A?8wWԍ缥eJZBG*E/+Rɥ!͎IDtcP }gBC`5:"G=tTG>?vd=ѱQ vtŎR8_#x?Q +Ht_A?8} 5CǍq z;ĕA!߈':Cp(2߅1?ր:,ݠ@Ǔ1[bǔc$X%:4ݣ/d#7uTeǗ1:|~Pv6hOzwzg%8m>[r̛z0{ Ry[fǜzc3:|ytc|:]/1: 껛P-]x︇5;&M/qv)G:FGqtcTtt~C=3:F](u/>xBn|^AoŶrCGg8ة:R5^kJ}Cǯ}wwp`HIpV;]DGz7=XKʱ/c{ '" ;}wvGq z_3;}ʼn߇[{x%::}:~ݸ-wp'_aǽ=AKF~YpWd&>C_|#0ޓړAR zBd,@ X{?H=Ó+<#d Ht8q zCV+C_XY{7\#fgPj 5ߟJ59cg2:~v6lch(r*IG>IC_tci'hKste9cYy&l;IIa|uRt9z%1qt9ο ySf?A}pl/wct0{;wLGMft8w&(G:; NN yUpN1ο 3ߏ NguC~)]ՠԹ.X5:Zw ]a#9A 2tz CGбAtZDGpk"y xGrb0ќxpD'Vүm+ŪW.XU_dɪYG*ZQx.'W:E*A16ll.}?~m$σ撮g?o{<36x~g|sso[:W6x~Gl.^"o=;zlsw撎zH?O5]OUwÁSx7|x#[wZ{-^SK6^%NN)i8;77^rzwsN%;xzz?pMOuʐi6_zSS>dsN%;cN)1_txx|Uϊa[[̧Yo1wx|f91_xxx|]wGߕ+}W>|];s#G|p䨷Oчgwg))~JN=;#t~Y)8; 6Yߩ9;+"tLzK#-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSJN3;[g}zmXMe}zrXىb=|]wedUF[z{[eUZ[xWjwہ7)ڱxJɺɲɪɢɚɒNMšFyfQ\` mjB?؅#55 8/ met@AA8A81Bx&Sd8×c8TY,fi3˴U"mf6D;aLp#ru5cIX1Np(uKFd#+zld96YFb,I0ʢc>FQtk 8R:91{ PW^W^WV^W^W]W]=EWϚ+)cyFs¨~Rϱi[ P )@{(u-k%V eղjY^$?\:rsaeÚ%''Iaݝtw^ϭy57b>R꣤,>:#>*#*/J6II|. AD|/߈w"k = /A"pVx"pVxu#>`zP8% D\Qħ@a.=DF\#׈CAzЏń>8}>g t\{tx>Ocx=mOێ}OcOk 'p=tICL8/p~")O"zj xw<zCxr~VgzCo,ɀhstAyOb=Rґp%oDC @ (B;|ɕam jl|Yaņb}GnIpVčw}M]¤)ޗ(A1>2,~F(6]cYe؏K2C&7Ptcg,&q, ك>z9{_F3>0v<{zO5Նك;N 7Ć\7~Z, oō/(n4!`8u> ;"yae2I$M )KH$\ !sɿdqL唂N&zdcEY-IT A|H0Se$^tSW/׏VɝiR1CyJCҸ(3n{6*#W eƮt ̌^ -3E{2cX)3L.UFYrqf0+#Z eLdeF ikt2#[GƶhXft Ao=.SdF,:q.r(2#]e 3hxǒt3#2X1zў̸̌p`3c2Qd_bEkTɩx~8Ԫ=/_W}GEV*x wE6:Y15|Qqy +2!ȊMT:T`WE_'<㠯ڃ:XFEn<*^6 N>oV*'UԪ\՞߬U7V[}Ta6+U_\`EцY'[{y;-U9YԈ*6,娷pfEߑR![3֞^{[kE_CŶVtG^ {Tþ*/'_7ގCG=*az\H%cww=6z~TБ;~6yhM{Db'vdT}U{cWv|T}a!U_d`=qbx0cq̎zq~_S5c쨱?Ao=:rҞyhyVVuÎ1c=:ŽJG:,:t?d ;tx~#HCߕF$;mNp#} Ú˅_LRGsx\0uDAt{tT=q/#[_HaǶx/#ܗ\4([p*;}-셬׭=/ni?Fǻ/Mt{'Uu8Fxv_: `  dBxpwdHG3@"la? [pL\  0 :2q=7aKuE7ў $8F.}O -)C NJg'=bt_J px:+A\ʍ9΅=#AL_ch(\$I2}a$s1_m䅜"O;JG1w.krWpt9aK_Hcysp$/0HgY"_ȝw!yy | <t}p^w̭1x];}8WTu~pDc\?΍l?/7~|]ws%u-%3#G=BG$4y=w]ꡣvu#:rw]wW==8C oa؃8|#=xxpD'f\w2Ax ۉW,X5?3o8wAqUQ?^kr'̿G糙;?3?Kc^~mWߛ<敟撮g?o/'qƣ wqwޗ-y6t~}B3t[:~Ǔ%^ωG6x='mnz/x~t~[:5_U eOU|J䩊+^-^5^@ίS\H+jC\I.6SOx~sK:Rocs#j;ٜXz8pwӁSﴞszdsN=_ôz*pף)i8;x֫[wZn9ixv^\x 63ף|D!kwʧl.9)#F&qw$N3; |"p[ȇnYo!f|\y |x|agwGߕ+}W>|]wMb>9q[G)1xx|x+;Oe}|X/8|g}zCXH3-CXOI1cc='qMSSc(qw7%1ޱ8;g}z[X ܓb/pKz=]OIzIww&1ޱ8;sg}zpXOсc=;q['zQoxxz~+;9ޡ pnd}~Y߱%g}~)]3ǟk&~Qo_$pOz&[[W \sCKex~)8;%Ng}~Y߱_)pKzNk[JG~)ޡ+bGw7 g}~)޵O8;O?Nz~W[ |]wz8ҳ*-Ҳ*5ǻRsC?oP>xhV+ź'K'+' ''˺'''k'K:4eI``Wj?ŕЦ&1]8RXSJAM,,,,Vn+K7 + )3(#(#W a2UL1|q0/A3KBmf6LY,fh3K4fF$(d$dd"Bt0)ُ+E)YY,FVd# rld56Y,d$d ;eg(:5a P)@J=+k+K+++ ++ˮUWϢgulб< 9vIaT?j)4-c=XR:Rǖ5VeղjY_,ZVWm|}.\9p T6jXrҾ|rXV^yAw˹Ws3/>Z#>B꣣>2꣢>"ꫡdat͝dA_qWhSfnčxĀv7!?6Vh7bXTASeڈWҟˡ\ zgKPUg^x rnī[>7bokAre(U o7ڋ6"0p gQҼ[4Cޅ]imfX= =N { q¨4>s:܁MSQ~d4Vi$WZk9Vv&rtIs}=\+w['f8mcIES~4xQ.OALTZ)5*1L6RT:)q*;;) `yTJdU«r92CTJ{ }xSVE(; كЛG)CEH_SV)p+֣ PW)+֕kJ5Eye1%{d[RW7s1`1.,*\Hˌ^k.B7KЙo/o,zlD\ &r.Zڋ.(KJ+7lVeԝ{/kťP\(eȬܬKʽ@ }\ÌK}\qa\ 粹r[._|h%w㞴\7n1z\̛}-8ݱL<ψIV=R V0_FU> &/76djхy MRAs'\lsC=1eTL4cil^eѻ I8>H!5Fo&COm&^>̘jlgE*LSfM{x2ִG43nZaFqODeQCFY"NƯ=t1#ش.3rNFʌc/.G%3H͗!rX3#ګΡp1cbVoQoAPv驌s=m1~[3O8cFK2c0PF9y)#nyC=$q{63#o8ґړ~sjfp G%+]{Ҳ1s*H<̺ht/U<^9+"f䒣hyT\.9Y gÙANKeV";Ug= kw钣_8{F"f/AUv]Vұ̊aTcp=V/}UXNJ]?cWÒOdrWG=ɮY{8?Tl=/D{isVGxGV/=iOsVha`żksVԻ-Agp#>o:Y>Z=1`f*8~#XaȦl;:PŽG<:&:mr|O~1]{c C{t|CGHÛ#{d{vt:^ԑEݱ2;Z%:5v^dw=荹g<$ܞq2;v,Li?Q# {Op#++ޱ#+~c [%Azb-u}SIQNMȑNQ0~ci|rSqwcwi8-}i{Xk:6hGG\1טaQG]Ao"ut<]4t8xi~wctCߵ&<˗k|mQU:Q*ee#ZcqVG`OEړV=Q:N[#Z[ӱZ9򗖍t/ȿpAוꨵe'RwU{#͎][޿[[>#͎a[|lm>8.:m~cYyu4W~Mu==ɀCǴCJh#pģc.9 }:#uqc\_4RGyrCU~Kuر^vW~OJ"#q͎ygߡaGФ:v X {;_d: HAǁ"GB{wh㟎%䈨Q4ucCII9:>O:BcDP9J DS9Rvñ/REK9^#F]9fFa9n7#Gie9v{O9Ÿazxa^HǑr$g_ Iz9ɗ#Jy9Tj:vS쀣kF: G.1I}e8̴>:tEcч]}t~c{G#?hAGGY?LǢJor4n'JrL t\#xJ=/gC}XUI˒AQa{U&74IMnfqr9x=O܃>fnf>>>>}WAx>Ipw;޿}O>~}O<t''ģW';q⥸ }ⱸ;\@\}W[+p[ʇmnYo)f|yb69)_yx|]wGߕ+}W>|];s#G|p䨷Oчgwg))~JN=;#t~Y)8; 6Yߩ9;+"tLzK#-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSJN3;[g}zTe}zT>ّR=|]wzʕVYoViYo]9ޱ7rwlxhV+ź'K'+' ''˺'''k'K:6eoI`;`Wl&1}Ha81K;+; ;;˷;;M&JBJL2JH"JBLc!` _2sKFRmf6PY,fVi35M-ܓ^GؒZ`JJ1N~$\)Jɺ$̚ldI6"YFc#Zld)&$a$(d>;E1 c:7HW Pl)@]Y{]Yz]Yy]Yx]Yw]Yvz]=kc[QϱK 9VKa>Ǧ l)@'uԱ:ZX-+Veyղj㓼saυÖ- k/'Ա, zn̫s-5(訏j+Y$]s'YqwtK'bn_K=7ٷDC ->}xbЇCqp];`xVݚ~ ~I+ x>`q_]ǹ_lǵ_.C!Xwq<8ϧ@sAx>P8wM 4.Qna{}CoÔx] L'|Swbr4f}s|h}4|qɵͤ勺Uqi۰= {S~$ 81"8 }&C]8? و yd(|mAZvn:p7AB^t?3Ao7q.LJ{]f%PCH5v7'nQ pqyP]A:톰67cQn-솓z PWٛ[2Y }`藀7ba/QEg0,o Y7©_&*CmIoK2CXr_A=vY(N-@] LCXvK:o(5wK~q^¸_ccl jClKn8-\77yCbo见D@Y >#`)C=/#鉎%/ '7uq_@$>{BZ-HAG .>1~q$k ⴃ1Ļ;DM׼Q$ SnS>ڑ2gzAwBR:{.9ojP40foAD :.32j!Œ_4Cc{HqsWdqz1g<(5yx;MG_1SDzƶEFQlg|qמ&?:18/ŮYx*ԕph\ȫY(ҁ1PX0fԍ¦a{cbl{T!d"+X[c!xp_wxwCT&}4k4 {#~oo#st 6j{sޑ`\ަ` xx#6ӡb:.q0.AZxRT#sĘ_av&eQɑ(EE=yc GrSw.GPmܞÀ{fdTɂc8Y]R:3ԇ|}.c׋k~"c#q5@EIAЭxPttT CEG.9_I zk?zkHϠ >Q}T@בz*l='M{7[ѿІ3W@E 6C x:o8Iq}7Fťe y=']#Ao\2aAoxE'X;*dEXm~"r8!ŅYQn~kEVQ ݸxŻP*dޟT1ߵ+w"7wt'+- zEljOp7! Gb'm؃ E/}w!*#}j8:n#fCz!+k7OM㣣Y~8^$1w/p~N+tވwZQ#(&G(:O5L:t<%8$:OV4#!ƃWdsz1P ]"W;G[x?+2]ztw72eȫDp,&~p<n>E(zLGgxx[>))%t~&&|̤Glo7N:<x=p&^zNYw.L"ީ=|ČwxGnw3oWsf#;g;xwΊ?x7 _-2)_[|]o~YwzyYwjmO/ݞ|O~w<+|ǣ_īxw;x?ow~wwz|zE\#.^_=%x~AωK:AՋ'MqMz9ŻwW;xwswW;xw<#;'{w84 E5L-^SKǜʫSx/pw?9isxչxsNeہSx=pKs/pf>!ף|D!5;SKwLj =SSyx|UgNzK0i5-Kw牕s9)_rSyxW]wKߕ/}W]wKߕ/}W򹁣|p਷<8-G;&rwω\4_9;7ENUc|4_vINm|.4_)Ioi>ҙc|K/4z9;^N{:4|9;G_Nّ|x䨷49-_~R|.XOpxd}zYߩyd}zYߩ"rw׈O[EkcM%Üp%5YzF^#뮑eWϪgճmQb?I?Ijy1j4-(Y<5(C%(YK-k%V eղjY^Þg{8lyްiÚg KNڗW +v<[y87hnܓTR_JKH}/DԷCM5;ɚ/}CGqПϗA-Qkc/L{#Μ)6vb7Sg->>:tn؃ l@hdp(rfqò mRxVkj94 ֔mR{xC?bB{ ^ \_]LsrD L/q8],(&52b% (6?<D3_A0,b%7n%z @{pM ܆zCVA]: ûfl wEvV;*ؽ"zްzijxiwrzjװzl{mlzn..cO:m&& LjXC?"kuD}ICnI݃: m2?eW٫-_\UB{d{ 'GbJɃ: 7H5^gf9M[(~݃ˆܭWdo z+-" Nzifd0hv09(C;9h CZ@\?Nu>?t݆d݃63zC[ ڀͷA6@=(CYջ }Z6ƆUGg=_hXP?p:/C|'@-렷~д%bH@Xjl鉃?ZO:X4ԟ"Y#ibZ̟f܃ 6ptA!YsT{؎DxnI"G)$+} lH?4in:ܷA{H{c5H1o kQ;=qB3(+7(;LEF%GdJQU(,Rr)94'GE0a@dL^38s%G%2mɁS8+ǻeqa8QB;e=O&2ևDF52⇋3q ĚcpP"#a:-o~X'zc~?hQ33qB3!1q{یa7̈XaC>mJcFұo3.wpr̟6ft15 gAS+fs5_kOx:{6efN!$یa\fϰa)o3rVHm0; /f}0cxx1"ݬtDbƱ <=1cy=譐S|Y! A+J`ƴQm"f\XYc mI'A{|cFظ`\3ʇq?1|H7_3և|1|ExT8n1#n,͘rԟxhOn̸7_3 O7ƞiF?GE_8?8ZQQ`/kT$1_p<*+䣣9tQ1ax=ܭbt2CGEa:X.A~q~tC؝6x'gro?#8荑޴@arO\ *+yzVg8N#8VV51?[\•ﴢ;Ao_ĻY8.?E{W;g;rSdCS#w;g;P#?wΌwqīY[w Bo[bČwx G[x7<3{9Qsf#O;7R#o;Usx8sn z+Čwx^pd&f#?wx +ǻo$ʗ+_|ʗ+_|ʗS>7p[Gh糝<8;3-q~Qo|L|>'pMSS1|S|*pw>ϗ9g}mY|sOz[[>_)Io|XcNϗ:|9;u{t~Y|sw>gzG遣x';w9ީxzݓ.g}z%.g}z)ޱ^#rK?IoHzK$R=JX9;8^&rw]Nhz o mpG'XtZ8$+\RpA*  ~(*sY48pZnk .o 8l.WAu)ܒCBG'bz)h̟tۏ;7oYib.'l:(y1R: --R_z49hO) .!cœn/͒rœn# dQ "t=9#t 6:)렯 w-)v1@&nPB0"xz՞FraH(PK$2W؃0kx5X~n-TDwxp[fJ_ו7?^j Ǻ _+JሷScUVObjyNV=Vkbg/ay[Xn-9ԡá}w^pCnqV+88}Abk6?^Qm xG:*h/w\-s6?^nW`EyÞHOq~؃nq V'od0+[~]\AQo=-xzo#X<b'Ҟ+zqa }[\񃎏p72*a{8N4rglkE6LFwxxGފw+]ϫxx(pUaMy Sb;P#?wxp\6GV╎_[_ Ybƻw:.;g;nx*93a 21y+93alw]UΙt|x71ÉKpX*93u}Gv}xGv}xGv}xGv}Gv}xƃ-xQĹx|sN5SS'pw9or~rSʙIo)ܲR>͹f|sN<};; Ww7:ʗ+_|ʗ+_|ʗS>7p[Gh糝<8;3-q~Qo|L|>'pMSS1|S|*pwgǛ9;O z[>ܒ=]OIzKΜ;/4_zyxYirwe}Yi>rwώ#GQoi>/Xpxz-ǻ';+\N#;K\NScF䖎R=I"Gz)ޱ%rwqfLXo9Ży.g}z)Tot9;+]nIorMzKRRU䨷T9;{]9ޱ^.g}zYߩ-rw-;]Nxά׻R/ϤToxIzKSccX/9;[^NKߕ/}W]wK߱4rwW]#'z˨q#xz1ޱqhRbǕbݛݛݛݛuݛeݛUݛEݛ5ݛ%kX,FqB1=` l,`w|RXcHAYvp;뷝mgv[YJBjL2jͤ`}5l{`\\l)~qŒbRmf6PY,fVi35 Q0p1%u.$`XRI1N~tq(Ŭɞ,ɞȞ,ȞǞ,Ǟƞ,ƞŞ,`X0,bE0EƵ1@vI #(.F^#Kkd5Yu,z\-^\I1%#FeĨ}`ӼRbM Ћ%(XK[X-KVe}ղjY]+yS=RDxR4M-*XtEFZMG+ B+ F+ JkW Ĩ U #4 Z+ ^֫dAlm~+^W4A*-ߡjA6ޡ ;]m>P`XfArT*X\0F͇-xL rLתGAu)ZyBdW+l*: kAߕ RO`0 ((\E|Y~SAўXa-p2Wԟ? _W狂}OزUg4П|C>zp ʫa8(\E`Bye`d}0<.'CD<& W*N}wl-4tOG*2K^8 pR )ahZp_b̠ahA jb>,h9Ȗׂ4-@ÏO3T|>\6X2hX*\Pix*\Pvh*y zK+DАU&\ae ]+UW4#؇џPV? gghO+ kF<] o4}ud;P4xGd+񈆿y LaPse2!>]?ȐX iC53'ca>E E- ZxWӍc~ L_M-+Cӗ^0n+MJPme8 ZV#C:]i2jYbx E -s ܳ+Rep&T{rd:TFp)л2kyq,a2,oeh.>chcߗv&ޗ0[~S}~`>A*ߗ/\'3;zf󠟵ce `tCIw3nmIO/q KX|Gܜ9<%`bS YE,L/Z+YY XYw^ψ=l/wK@`hq'bK@̋XY!b^dzpų`ƳwqB?KE`.ZqK@K@K@ij)-5TI I=S r+bXhZ.b%K01(PGԈ1@AF 9b P / /00R°"b۠$b !M.6^F[cX-b P])@axQŚƨK PF -l5lc6t8%`1( "ŚRK PHx8"1(dS"\ř29hiQ t%aŚ \K PH9"qqŕ2wg P%+T dU*YAJVP%+(C#adj l g PL_|bb)=(&#xVIA1;~1)(wRPG y-<' N9D †CtG/Ź!@q&&bPljg.&9IAqbRPأ "x % N9b.bPbg/&ʋIAq3bgR/&ʼn؋IAq7b6 #a O P8RŞ/8/1)(;Xp1)(VD [<†-IwGaJ- a\)@bI 5 cBIzRP,O["ՓbŤXwsEaê5 D †CaQPtqZO P.&*1@Xv1)(V8†e W6m8ae' E UycgPx1)(N9JVP%+J/fUBe(lP1 p^lIؠbM K P>6iVӛӛӛӛӛӛtӛdӛTӛDjT2('t @!9PD(vzbBӈQNI$vH;)Nh'y:ZIiEł2x 蝞VPz4bA~qP(hh&14I ͤfB3頙dL*h&FL`t N5XFJ-0D  <,N+_yyyyyyyyy؁yȩDQ?`X NBDI*# YN=FHf$m3Iٌ$lz5=ɚT |mN+J 8/] 3 D{N-F8j( :Q6bZ1-i$LK %Ӓ~iONqniɦZjiq阜Ic:;tV4ΙiJ+YdJ*YdR$Ď(ni}PfiV+YW 655l: `q+GGڣc{8L6iV}KqۓGom؅mѩ{ѱrh΋Mg%[5؃N؁DEoV?Q[LS4Dk* v6kj`;^]]ju)u,ܶNh":ڠ_TM(M/J fm-/f ЬEۇHBUіw8ڄdz}sp:o8ܓW4{We8khcxk1nWY8}L+lñS8p(NO(M@ w x$|=6[<#Ί1nzsέz=ZiJ8n>qw7;On*A;ۂ/$ rSpn=m;3pC8Ew{(O*;v$&;[9d{? ߹ 6[?b+0ËPGg%C1aY)aPgHUz> GC>[ !Yvun筷wü>鍶!`ܵ܆5:vnae_BpC1T0!ngoogaIR>?RwraYb[1?3GcmCΈ(x2' 0CbЇ6H_ zCcpSDCEdQqH|=R0ľ ׎hH !(Ekm)jfomBeШ,&rX' 1dZe L[ȎH/OYRY;8<6 봢?Cvg'[6 +oF&yơȑ<|pe0VA~shrd?AdNa^ocۋ|Y;\#2'^=K(fJH~wSqoZ` jHc `fy.o\jR'>lcR]GmsKt%4XXΚ>*n&v;F'ƢԴM):d4*ƍIY&_Txh WW.cu-@HړƹCNN 6ZSx7(Oj iA}Va _Ckm+5PuԚ6vKk RSkT#jfRW@UkډzP*@Y!./m\گVz2 `Q`%~nitߡ^`j&&jSkrrNN e׉;-t <ƁZ&VdAgw.0VɲWj #BsSa-`V``։` }`Am{],u8a}ygޗx^/Bj@w_ +1/htѹ+?6Ɔo^C]aڕGݗ{<Ӳ! Ǯy4үѮ ݺѬk ҇r©FYuJ#}yItnx " ,0?\eGu\-7׭b8IUڕ\yU\tnexGO\4Ґwc ;.ܸf{qwӮF+3N@#>MomZ.\p7=L˂̾Lˀ9o7Anۀ a^ۀg MA]vg#Lw8ۀo8[i%G+ [@xk3 07O_ #sX"QXʉ,GdӤ6 s88&4tqrm=2@9"@ ]n8q2@9x06q[@; 6&j_bU5PͧQI| 5_`͗_ͩ|ck5?Y-nSpV K8D <`g߱ת旮Wұǃ:;xBc a %xrl<9pV =BcgpXY)8pVމ8pw@5΋qKnѱK.ձKرijRWNTGYI$8pV.0K8+'DIec gɱă%jc=\ 9/A"1(@1@4uec P.O P.w P.ʼn=(Ė{'<S'Ͽ?ݟ??+$$Rqck oſw 7nل_rp&fEKo_\owyd6K}Y;EW}$Yӊ(Rw3]>&_9wxV·k;x?X={V_=cl?{ByLg>gğE3gf.?Y~.iѭUs(_mVg3"aqOS~JhSI9cSV3gE36x? ks/N7?Έ 5*v_ء_?c?ŷ#olBώCg$+tqjNDG8dGQy(WL~M @@ǶtTy)pq ο80z ҟ_7?@6 6fS[\蟟~D'S$V_\onBe؍_ ,}UV_P~|ag_#`SKQٛ1wmLqVC:'aQ|5_ٖ5i>k?nm_n8;>a~ώC ׶ѾG{/.7aVmW}KkT[l9׿m\ض,,n[YbğN1V 8#\#~|n='?J>}۲e_my׿mn[Q۶ȿuS^3BTu?GW֪'ȿާYyD-׈}y5޺Ǐ/Z??X]!G}y԰fE :Zt{a}#NGy9=g -EzwKE/һ6ie8B1[fnCzG{#_^onf*fv1%+ʻ|t3<~Ezy3e*N|?0fƙ?g] I?g]?g}3rYϰ ?g=oIXbtiOӏg-5uߏ?;c/q:>_Y'~ݬfçN;LSO+Nc_ǖ߭c-ßr>o<}nt4[{C~_7_熅7W?˾Y?s<ߖ|h?#s?#}{wߓm;0::W_~Ym9`[k> ZCX@|q~DYRܖq30ז͹ϟBn5c=4<֪̅٧}c ^x9ɻ4_h{[c{1TUuvw[Y{樥gڍ<2s)^~wX͟A>fާiɫDCdk,[\ve=M^~_YrT߃ۋx7'\ndk\E~9 %=A{䢖o\Gŗ@9b5><'X*KxVؾߟxv="fw_x}e?lŪ_a# tZ3.{x=8%[<8m5p[<lzއx7m.3$WrGaYx >Y1lI>L}N,zqüf5kg<"x=4}lkX9<[ƹa k)ةiXZ^f=y_ok|ck.2Ѿhx__}~ڣi?lZNx?|'9?lZ_Lv>韟U{VZ[+v:sg|׺aƳ]XI\vZ/lgKEJBwoUlkՇ-5ƃmmsY{6^_?wEWħԿ"#;+;D}׎SÝE'?wۖڕ;U~xfxmlgG+~܂ס=~oOzNGV]D<z^sg<K+^g܀@~vg7g){#q(}}6^>}YN]xu_/xoܯ)~qC]AکO2_U?sWoAʕ#oU<+Wnr~_E#?gR$ކu6߳w~:l+w:ΊC>YE0C<|;Wh߁U__(z,g?cm+|ٿ".'X>|׺uWDߩN_ oaZK p}Kl]g׻ѿnx[+x;t,,s@_4~y_Eׄ_?/G"U,j;־y$5=jDy_s')%] :<8_7_u p 'c|F1磑3o<=>~=y0~-OO{Co.> k0D _p3Tz+"/Aпj7Q6Ww]2ѿ6]F<_'<zpcqxa3A?H'UJ>.oOLZ-LQƯ~UƯSߔB\bkC%;W_9^xa ^+տ~ K=y!XSGbMuB 8~*W?wCʍχ7Wď+Cx6D{CpK_:p^7שϊocZ0YއEnԿaߛVBi+ǫ7|\ U_υ2Mr ׏şJ^H@"OxZG}S?-c:x_+1:1P|yQyqqnWGQ>A{4~@r{ֿY'%'xֹy9ޯdG%>υxޱߚF`2ĝٗ|0dzBܩ?:+xzzxpO}0ӋWn Ys;o7@~n.2Ï?~5w_qzxAXzqzxan\/m| 2*Q~?_QjÜoeJ~1hpç=/7gLOR~c!q_>_??o3諾5~-=K=ѿݯv|׋x_;@Q;n @>(_wǢQyUznTxzߟkr:W=4^=Ư~_?gtyePv}q8u|Wij3 sc(?x4߅6G(? 2_ϒb??&#w>ܑoB_u^aޯ+Au[cqbW=l?zû{,2 Cs?ElS;[;lG7OUCOG:u+{s;0~Ç{>C+ޟS_xk xy4뱎%3?xL凗xD|;o~,_9=,UOSѿ6=x6oyvujd-hI^#Y4~E?+7=c1+ mofE~XS._'ho̦/}φuòTrd֓@̎Pz9F;qx@t 1aIyϟn`|ak8}͉z'#?oW|\hU߷f{Zg/\_B%wv2IU5TOg=]q[s s=h;!~GT}ާ=[_xA}v~8ߍUvmx[W|WEZ/Yc<[Wjk =7SxОwQ~z͢ϙY)Y|zMz~Xǟx5>ި/T~fOW{)?W۽ok|Ff{P&FfozyC^SzMj\mko5^k^s^k𚡿~WzM/f^SaoUx^krB&ևٿB,loW= zͮB]8ϯk"~;4~ zM?+|zMC^k6+wjoz}S#aw=6gީz!^]hl|?O=wi zͮտ}yu}[]zM`i05e~<^zqㅮ5ߥUgfdS^uSWk߇UߴɌg]]տIVKV="OSoq~C%3g,7^?0kNh\~M^/afg&s/!x} q:ȋ~I|kN|ף*y^s~^wij084~XͿFxKEsZ}׬:_kw]ɚd3_k{Ud!6 Oc&3sfn~[ꭟzMW^U}׬=5x[S>Կ"ޡ;ľ2WzMŗ6@Ѽ^KCkГOc&aο|^zML/}]$ܣlh9~E{C~cox:XYi]h0/Q/}?={F;}=ϹSD>87<}s=q_Oy^黡/hKRt橃/2n}/:}5\_zo]Nf]B{#y~79+T]7#軞'xB=ooQn]1n?'_z}sy<9;g|OK?:~"O2ŬӁoOI|]>W0_9'}TO |?/>Ñ/%_`/7t"˗u:E>':>/}ɗ+/xK]#Y/AWKoq}sʷ/_d{/}y!assҹҧ|U>}u;ҩ/?NQΔIyys$_oCsV[ga=sϛ4H9}>AYG|S><$7sVޡ[򙷠ݗ0Y> |Zt՝/]'}隗p_/uDKaWKoʗ%_:%KgSt=t}җ|Kk] ҵn|7"_:}~xI_z}~KZ7At=Oݷ;<)//yN-?K׺k{]u?ؙ^gqlOa0@`ө,;~$+ݝNخJwN\M[?G Jfߺ~+YW:d|gKåeނt]W ǻ]zMM֥_:m9w<\z\O{ǥ{u:<ոnxQl}?$z9 kӥW<.=|:Kn]ݺq>.t@n^(\zu~K7vygr{N^?ugr\z߶G-3Kou·)\zq>K/.]:N5];_>ԩӟ]WM>.L:gt].]KOgK]ҋN׏ҥw{sեnqEۥG.t}sFv8|!qYd_"]Htҗ7t啸IÈåש\=W83oq#wX| nSθ&]zgboWkg߆s^Q뮺s]E{\y^^rc0?\C7Nf3Χ.}wKw8]ν:SgK/ӿ:yteuΡ3/>.sa"Bp`6y":[ҟ:u篾<8+'Odwt}ӥg;'N'']eK]z:YN>CGD_ I\hWm]C:]zYܟt]yftm;t'׻.xԥ93^3tkZ o]y'q7v<]zWKog=}\yt/\޺tuīK7.]:NP./\yDN .#]yuw]Gf+۝8mu/ۥ㼛x֥2^~\yRtoZᶩ#t{>k8?mvmg+K7/vҋyׇK~ӥR~K7 .xtvg]>k~פMfW+-ut}\tJo..}/Jtu;v5;y$.xt~=n4]Y]ÙWX_Ofѵ6O~_qxq=K'ojKG~;|K/r񚷮x=K7t[02Z]tG̋@GK׭Sѭ?x|/hӟťsեqe3^3]ӥ3_NN]vBG!pkԬ#T?.]'ZkvkFSt+um\ҡzItzc5m8ѥۭT>yuǥwnoxkN .1/S'?GܯpyӥNh#uggz.=_]Uz|^g:B8˺hqqҍ:\:N~¥KwZ^;kxKW~1]zm:M|>.ϐ.]K?_zqWtW]zq߮׏Kե?xIKo췦KgH~.K/̗ӥߞ#xӥ"!np|Ft;\>.pJx͸t?]m5u%'.}uҥ/{]#t.]z۩;+\zottn҉ҥMuұ8]:^Y`b=P]z _ׯ3oY{Y_yX|åʯu{=D\3&ﯙЮ֭m?1:.9S'."Lp٬sN7ӥ7|q]}{=>K7NK'N^tu6Nz8|u(GsR<\zy/l<3v+zYON^77Gi8q:v%}gxҩ/~ٟQ_2N֝t뎯6n..q}\-\:v]g|ߏuN닥KǝK_s]D]z/뜍vcݩg]z^ws|Qu u&K:3QGOޘqڏq\$OcV|9k~ԥ?ҳt˙780&L3=pҥw/۸nhè}9~]z;ǥK:Gw:'xץWa6mSINDtgueC7_=:vб/z霟X'K.?9 ެwKߎ>uЗy"Bt8b9Х܁.=]sq|so~]qitҥ?ۙ[v~zcwr:'9ӥK/gj5OK8.}mgn~A< ]UtW#FĮtgbIW[7>ܷ+ҝ.ۥYbG3l;?.}pҭoK=_ץY+"on.N~L#.L^^qKe9Z]kéǥ؝Fq|LN>tOѥw]yStl]zkO Qެ>?t}[/8V]qt'OK:ty?ѥ7wgtUKq͗סc_KO'KayN>t%tt䱊yt~=\^:[淾iҧhFatҭߪKХ[Zn\讗z6q6sΙÏg}ѝS?Y?<:K.K G:BΜ<̗nxKoM.=-.ݼt/tvؙ⎋nzٸgC7_K|?YK׵zCNqK'3[zG}h֙[p&U5|=k>ǕgXԥS;^:M^pxt]#@t2қypƩKҳ9.PKwAnW].| Enӥ9]zg/Ν+n=ᎉۭ{&^]޶3'$U:ut`}^Gft}өu7ҥ;ӥS䨗~{/6.g]ҳ}:tԥû^:wfM^p35ҥ}Kh+m5oWMNOqץq\:ډ4.҉MKͯ=ׇqyΙGK֥i^KftW]wzԥT.EC>9WWmnPes O:nϛ.YG=aqҭ3wKz.]/g;u 3'd~\];%^Z?қ/ׇogqLХ[RwK_n]]M^{YGh.Vt]ݬNc'^3U:s]ݼjӥ#]:tgԥtUeێOҥ[nt]/҇yyiOo|~bw>usSp8<\z%.d=z\z~#N.(һ/#/_μFF}qǥ+ҽ~u^5dɳ|\MեǍ8ץ7}k>:sW_S/vCg+`һӥԥg*]ÏxVwe҉O=tMG>nݼsϥKou^bu:5]gS[9ffGgkf5>.t]]9=:]cC Vo{kwיǤ6ǝ/\/[&^SGK׵bu˿nGw^瓳^n<~K~_~:;Օ qks\zM|Sܹ޼uxMHK۩>'^sz}nsK:v3rttz?]/}Ku~\:ҳzNn:2^3~Q/} >]ҩNffޗ/:t_qkҹw]r¥YnWm\Сu^9k1?\:ǧyՆΜ93kN+WYNnKo:#uK~[2oi'^kZoN~rK7.8>o~/qf|6up/;ҳ^|k^sp}\K7/vatu9Х~s1[ɏKǑIt麔^mqsK8zw]@sv?7ǥs_μNҗN~ԭn|uҋvt<DZ/.Xo=9:mKON\?z+Y/x~cxҭ7KO?2ߡΜq'm`EuúO}KNt:]J^_׎kz#?أ3gfnkm"sZXq"]Gѥ_:o.u^z]:ʣ^:;Oo>9z7ʾb}?.ݶx?;tnveK/xG< Kƥ7lgts~<,G]ytO{MmlL:7ɳ:CK.}`{h#_NtOC'}9{OZ/.p:gk#]q:c]׫.Y$sur8u"n_Ouq\zt|9͛Kϼü/|a\?^z\ۥ/?b|i\z3.ȧy6SZuKyy6M+gtgt-ҫtE\_#En}\\ftK^.}mN^52뜬K7ECr̍mNqѬs.닳9w=tt"EӕwxqK>.ݸb]p:gc}XlvڌCgGnuߺ濿7ȓ.O׈ե[I~qY/'.=.}/kusɿqGhMޗ.֟#Ptp]7O~s`q5k707 _:s9qsvw7.=:'.֙p~nצC'5޻y>5?]];y.yaѶ^ݯzxtrXUz%.}qץ̌יOY/BĝKå;Kt˸:\z8+ׇu꺹A+/ 8i\.}X;\z>.oKҽ_tƁҟԩ77=>~e׌Нc>qK:u每wǥKw>.ݸN\zw}n.~w|őKwfK~.ݸe]zХwK.}Zo|8^zש?^.K:s:s0ܛotl>mSo.93~/\z>m~\:qқ^p=]K/tċv;nX/<=^zut$:ଯN=q?]uWW\rm¥I!.]Nf~/_9ץG~[ן/^ϴ|8a.8w]zq|ԥߺzqGҳ:.Kևo|t_9y_3ӥiKOKᄒWm~\nN^u.b>̫ןvS}8_F޾[G6+y p;yc]z6]C>C謗^u_M~>t[[ѝO[^:N^o]Х۟қå׸tӥO^wtq̫6kR/]v㸹X?ҥwif&oo\^:+]:.$]:yu .ϋK/Y2oiK7o.Ou]g/:_u3^39|s!^ ]yytML&qGqzw+n^]ХЭshXzq/_KokotK.>znvy~#^3't]tԧtꌯҳ|K>uҳ:\Ц?z^:xͩ.WZt3ץ7gf8]/}yx֙3r\z}#ե#]z:;'НWm&sk?5oK_抮xͥ;oqҥ3'^S]zיڍSg}3_/Ut6]EwNc'^gtuAz6<;^Swn.뼉׼].}X)Y/}Kn8p鱍v.}n^ ]Kk^֛*m4]9#t\z/lʿ\syEz|KK?:uҩ㻢.}.ON]tN|8:Գ7ݺr!?/zg:h&m̏Kַ_}m^myҥ7pv0i#?7]e5:ӥK.Ct:ҭK'*]:ҧ$q[KwKKNZ ]/Ѝ'8qGu.yY.}ҟُJ>uөOB;ӿwf9YcC&-?Q߿bWJ_\wԹ:G}s~nkw]O踉ڼ]7w#MmpW<[;!u8 ~{~ɿ릿]S]7ѵhߺ^gkOb8ѭgN~u_?# >¹EuOk֯m~׹y(G[~ܗqù{'\M8{hhwzu\?{=pk6?{m<[/q>nqug{|PpY}D?:ҽ~{Ѿ^mꉿsG.`'=+x~M9i~n;Y? {5Onw=vcszY:'?q~u\uW듿릿Gg׎/gtg8w{lg]7}ù>Yuofp=x]8߿Oݲ? ^߾~2>}D8?:|xO\oqsϯNz}Ϸh?|ϸ?q{+p_yQ¹ƻ¹ߎvtp>ùѿ_wugwtgԯM~b|5/F8w﨧}EXu|=;]kگҽ8_'/¹g9p'pt 6k={Ko6k:+~Yo:uuumޣσ_1s?o{yuw+W8p+po?qGD;Ź>Oùۼ"v-w;g2o»n.۟9~sw[џùoF4{}3jpSg|:Ff@= ^_w{5ת~||:{{MGO|+W#ڸk8=sW~;{g|ףy¹/oڝv:_g7c|33tsϳpϗN{8_ùS]7}v~Oq7KgƑs=Rj\o8|¹}ҭ8_.O\o8\sso16~8p~swpzڟcs|u+㌯}tmssW^hJ8wG\_+O,띏_u~W]m8wЩ֛l?ù.~>Rhc>sù8?O{>ù s?op+w6q~~wq8s^_7m MIs_:k׵8h1¹){>_mf:lX/y|=ת_qp=G¹'hk蟘Z+¹pgJ^5'7 3us}i#@/m3]۟}믿߷Ц?8){q;w:x8'_b|z ~h37{DC1s?UG=spz4=WwS/>B};׹$޻^^h8; ;ο>i-]~թ_7ݴ^XosF{|c8y7Ipֳ1f8۟1_ֳ>r|Mb<%r「?K.tI+3]P8=~s_ùvKaׇq%W8s{==hۓ%]nSb@\¹kv瓩{ùK뎯|1~w]:vG <_ӱ#s8\z=8ݴ}$>?+:֎ 'W<{^׹9vϷ?{+Wù+`~b}<pއsG۟4gYjpy!zw8w~[4 8:H׍!c=>_mWu8yZY+]妽X֭8Ebhްpog:eFpֽ>K8z9s0tO\ӟùMYmӟV>}J}¹]8sXcg|׿xB5¹}_q5s}܏sj^p߄s8}=ss߿Ѯ1ѿ@׿rz\>s]=q^b|%/)=׫q'{Y#opem>\uw_v߇s8w|;{B{8~{x=q~_$֎%hΧUο_c7t_'Cz\v_|-i=w z6ùEscA{S$@6@wz⟘S1ףp?s?;~wԙù$v|]Y:fgM8wiG}s羟ùpW+כ}sI{3>8=ޅs/O?y3O8<}?sWIb 8O<;ړx+^8}sϯNU9]:%p߄s=pss/t쌯M8>c|<y?ܟߑW`9_0;o:x毗x];]E|a}ww2y{yoߠg|mqkg5Iygu|=txf&߇xM'swև:kvՙ.]'):vGn}3._?s?Y~x=V]$^ӼixF7yޯxMGssyxMKO5sǛF}_xf=zk}8ߋ{g}Kw_qkhUצ{g|tx{Gl2>دx~>8S}Ϗ鬻q]_>;+q=ѱ׸_7){Ʒ2^3{p{3Q>5q8k{;k='֎p{?uiפn}t]E%_M_~н#8ܯ¹y8i3ùpo1iӟ];MQO5{?8?ױ8__'i/֓:Jp&m|Sxi=i=͋xM qߋsB{S/[/\'I|:#psFN&}߃xM6$postK7:v}=q 񚷮r5/hSOxM8|ҽ1^P}=׬nTY_3~_ss=>b5[i͇vcu8o3>s'^SZzwu#'\=5קk3_9zO_n+#^n{s}=8oǹxͬߖe6tēĿ_/=Dxe}lYvnxNGA{Ij|SޕxͣSg3Sx͢opyqy+f?8\¹| )k]|6;$z5+=}psx'^3+#^3¹ϧsk83瞞 ~z<k>ŏx_#^:{G}.篏}O85y]CHбkNjx=瞾 kg}ugU>|so;s~5Ib| 87ZNf?;>xn֝]WTux{ip {s=羯6Eŏc u%櫑"{Opjkv|<k>:y5JG'o&?=Wp${pp/s`{s>s]/P:ťWUwu+^]{_߻_zևN^_^^^tYhttY?p}pۥS/=98qYK*.v uMG_suĉ:t~u}s}ñ;spXo>9Օ>.ݸt ]Ftycw~ 9ҧΧJX_IgܷKl3}q:)]zùҭ:gtuKwmq:v~8]:åS8N:smpU7wٷu#%W+pyҡWܦGKҥ?\.tһGèލ Kҥ]onf]`̯z8ɧK'qt{rsx<n}ҧk:zW#s\yX=]t[tvqһ/`oKG:gxtsً=9cѥϐ.|CKo<.}tCGxәӥե3Хo|;RuN.}X?6ku8]ҭGK\ExNљs϶K}j?-9Yѭ덋 GuK/Sh?{]vsvٰ3}s38}_qKGts\+Kn]z:bޗ#A^\ҩ?K=LgKzѥ*]z-}.=OsYyɧ.yn:g.=wm<5:#qMgKoKo.wt+=~[OuNHou҉֥wkt(e=}ĸtz۹9ucutѥOS]z1Ιʋq}֥:cǥ:]q\<tq[wԥb=tog7]m=[g?.v:'μx~Jitޏy_Y/dt`9?#uuۥKY~_u_:g:g?:y6>vtҍӥ\'.=ܮΩ;ouoť?.qt҇0^ܴnjK7NOť6mǥOn:q]gZN~[?Yn\.tϧzsK7Nuqb8ʿ.WҭK/]:ӥw:׬yX.g^kťwoҥ늶K_Kևå.8u\ҍs.]8k\zݔ\\u`I|Riot룕\uU:sYo]>hq֋ե7:gљS ֥WߺqUӥuNޏK_:nHuzz|t_y_m|;.ݸA]:Q}Gkܿtҗ}ڟ狼 b;]=<қzztutu;̫6?.}X|n}8]tk;|P{tT9gKtꋸa]9/sJލťg!\Xkե[Vq:SNqݼ ~q}{хW"N<ҳ{n:\53pn}roktҭK'Wp~z:Nqq鎟t.]KϋK'ҋ~5뭏c}.].]Kuwy|yz.=t ]X:\7.Oޭ}_<wqKg~zfMttsѿv|8tӥ7]sqKK7o.};p9._ɫ.ݼt+tu>/ҍץ[P|utcN<܏[ǥ߾W0Zg:;\z<å0 ><~Eҳ֥O,t;'sWn&]i?^v qtn}[|:ӥO>.< ۥw3]'N.=]K^uҋ}\uv9q_\zQl>t_åKot8Jw=6KGztyo\|x>ԥO\>tP]oKťKyqq]ХgFNt麡kK֧_/-?n9q:8ݗ.  SkѝӟQޭ]p5I>..=]tkgu΍럴omݜB\n}L\m}ǥ{+Kg:/tty_ӥ .K7v99]z}wx_?yt3Oz.ݼrn!\y|ӥ;֥:d\z:jҮC'xuyKåwJ]_.=tDͳKҳm|ǥå.}޻M}>ҥg}'ItGKw|ǥ$t,qDqMN,Nt'ۼt K??>Cg _9_9SKKwof!\~WÕ[G6.YGuqsfvsOuc13_Ku_֥?.< g_m\kg|}i]ҝҧ?5}cLKuNW?wQ|d^5za Ǹtx#^3tJfٯgkxצ#g.ݼBۥ҇n2OM|S^ҍKn^7]2^~\mܿ/u._tĥmIK77<~W ]:ҧ/qe+-tM^q_~;צ;g|ԥgjpK+qopܷyw|%҇G7t.=z\;/|_.x1]ǟUkGdKNp||KE??.zߺG.O˼+6r}.YG謿bxMU_zykv_~/So<]:oN$6.ԩ#G<etSW^so?#[g}gn;k:vXc_N'[5l3|<9{Ef7o.ϗ.M|%]mtz9kԭ7iS\u~_+?tU_aRެo^2Ut}Y{z5$~;58$N??v-Ew:\ްCǥKOW;_xǥw{s] ]z:>"qփ.zNg.K~ҥo9ߙҙ[?&Nұ;~v& ~K=Y6K}3ǥҥܘ.S/=}ߤ=sFb(޷Cg5;d}6НGK>"n8W:󰬟Kz{һqOn\yKimG=]/=w]z^yBɓC΁NzҩW tsj\zw3ZGKwF>^zpvKǑ[0O]:qҭ/K/֗ebt[vzѝyp.T]볺tͻKo^q+_oڸt,b<՝љWuVݺ.ўåjzܭcץ?/å 9yK5WW\rͺҥΤzkOf=q]/]zY|?k:u+y"/MqqI>:y/׶?ߴlȣ6t뱙G>F-'ut5ҥߪKz<Ӹ~~o\^_/9zn^åuxl>z>#??.b\ze=\CK?.M['^踇ǥ?׌ҳ~z=[uy6~Kϼtҋ#]zK^tKtmMQ/fPNχ^ex͇6Mq]ץgLk8q_o-^xw|ա'^wOf~t#2^3s]tX[/qQo{=r~ze}vW]8񚗟/\zu-lyt>ѧK/'!vmևIt\_ҥS?p'.Y:tϯKo쬗./:sݴq&N^lONDn}M]љ/,3SGzͼ/z68X~2uO.xͨOKg?*]U~u_Y?=z问jlzGfѡ?^Yxp|zyӥKӥLyo9qu=>zܴM^['s+znxMt}z׵Oҥ㨗N=#ӥˑ/]z>{Z޼6.}~\Sӥ7ҧ#?~u:ҿu]tқ75K֥%^x~ ]z8<]Nzҗu]9\:8O?]9+tIuwt}]ugSg5\ҭWKw?>]yEtե?e\zxWׇq8wKT|y.}˼sIK>Nk%<tc~.:~ҽKYuK..}x[7ǥ]a0/8ypygz|=?.tGKo^x2M<C0?>e^5m}^ӥ{}z8׮3/Wu_G]'Eͳ+?rtmWׇ|xiלʩ;koxͬD|I<X/zNBѩtqu,}iӥbtK>._GX \җq|rZ҇p}Y_},]zNݺ:uWyk[taKϼI^^]EΙ/ :$1o_-t׽㣳^:Y/}qקK:}N+]+\}>ӥwK7]:uҥu;/xKԥ.ߪϥK.ͥS~D̿uxb8]^|3_o]hcpԏ6뜷qsUwezs~;a?8XLעKϼ=ts]n~Jqo>;8EzMw8ng'̿љ5J7m4ڬ+=N^|hxNYs"pD8҇vYO&ɭc_>Y/sE|g:3g۬s?|u:ȗ.ݼny9ӑ/I|h]HgN\{=v:m9upۥ>pY/ҭpk.K>.͵ӥKg?us6Y?yXg.utѥ~ĭSgsڦ~ЕӟEK/:o:'sG7Ktzs}t^grK߯:籎.>v3.bYs:':9u`GKsgޗӥq:nn?9G.z>up#9yz>'𨗎NޯXM~Kåt:0ys\t]/}/~^ò~:ҫuNe>C7fMaסǺQ/=#n3]e=\~usZop~\zK/۝3{t}nHt~8ήCQ~D68_Y/ҩiߪn}D_7N͛K.Wc=뉋t1HsƥzU>?\:yX,8x6=?w.yet]/~ӱ; w7ѥg}8t踹Kt⺋q6kO'&&Nfm[wN~keW .}֬^t.oSn9_ЙucK'&]zuΪ3'?~?\z'.䨗g>].>Sә}?Y?Bĺz;g|}tAgNl; '\zItt_{ӸG[WN\?3fGK=p_p˶y6tM]zƥ.=qv9".n@]ҍ3}x\uȹΙgscng‰7,st)ҳ>9.]|}oKg_4]z:naĥҍC֥KoEҭKoeKoĥ7қq'f\zӑwh\z֓ǥg=q1]:q u7"]2o2.լsþ2PNws6۬s>ro?.^?.^ۓ\>|qff|t9+!]UtהK8UXEKO=n)>uurȥ+Kp'S\urgʇ7[/pȥ[SOF}ir- .2^Qt9:t&w}g㫗^\T?|srg:}ʇKɥMʥw$\zѿK#E=b~ɡ{pɩ/6u:ppcs'gs\.7>-wNk8" \zr!r3Э;.oN~1_ʥO]/Ӈ҇\W/].=7>ۇ.3C#2==CWoNNx!\}+]˥79Ǻ~p6u:|">.\t1^'><}KO .^k_.N>[ \}09Rw+kx/+ mlk/ߞu:rwiSwgE?tG}S'^(rįɭO]O.rӺyrM7.= m.}|tH&|˥;~^z'[/ȝ+\/c,r|\n+}K'_\zU:E=k_s}\}.lp_9=g8So&~O~ʙ_g<&\P.rp˥g_>Q&u륧~:OF̯pFj/қoipwakæ0Ƨz'՗KG'.|ssMO.=9z[>ȥG.=ɥ͕[/_c5t9:t~S_å?\zå˫MpպWEX[>WɥKtwK|\\;\9 <қzʝWƟǩ;L]9tm.iW׿ʭSwxS/ն˅|vɱ̯s~S/.=9~ɥ/nOr?%?&9"lj{r^+Z^=?\\\\}7\#K?˥>ɥn 'zKt¥UCĥw9sSg+3rs~?\㭗빡~MX=rQ\zN.=ϷD|\&^xcd&ڷup$pɥ_r7 ltm9ϧUҋtInnb}S.>k#59տYO"N}ӣ=c.|\ͥqkxs5Wj~Q.=ij^3\Mt ?^Orћc\_J}fr|KOnzӷkW5͙ߑ}!ʥK8u.g>;_a'x,9rwxԩ׌qv9$8bKO" M}PҋY|cqs,wE<5LJKϘ\7qppצ3'˩#"9;"T96Y35o?lj^|nb~.Kg#[/=rƫrw˥R.}ȥ?mSY/nSqRn.^mZ9H=u\҃vf&zry¥[OzS{Щo^z[>\\Mj˥7l<>pM=zWzM=_S/=8ͥҋϿ.rk6lG*^"\zҧy郳֟WCwʥ'OzrrKgNN.}ig&לԓ$n\9߼SG(Yy#]G9zpk[?\:Vr ȥs!^\}}srU;'?z~HSǿrһz5O.}sp_K3ғkO.pɑ7WެU\߃K_5ƫ\-\kp|q_.]\P>ҋ}0y^>ܜ:z}t髟\}"҉!.~cw?G>'~zsENlu҇~Ƕ|˩_pM.}YW+\:}ŒKO=׼<\D.z?ҫϷeR9rn&!{x/n|>QY/淭^'\Kg\zi>.\\\oQ^pCnRw9sqMz͆p?tSQGpȡ/u9åi+^zUoZ꫷#_r襣_R K}uX_gW}[ :B1^K!G¥_^|M.>9rAK\:rž0rW.PS9'*ZBܫY)~  &_w{[W޴5cóuvChMn0&儢@599_rs}yaZ{_ygu}_p ^sp|7p+`m-7]+som\o4\y=>{V'8[rkh8}=uupQ56ʛ+eaۅ]:z5?9_yu{m??crw]Oᚗ]ew}\kpAq︞{^ˆc^yE|M[Wt~kz|xد~u9z^7ы=bq=5~ʛkmpk<=`_Erg>}SO0k-;r>rW[ys_\{kp{<羮=ÿ_{_Wpso=ʛc^o_y<.lkxz_z^7v ֮/1[Pÿ>xڠZ=}ZgG 둆1MoJ\ >?}}~#3ؿ_ѯrOܟ R}}3#8{ڟx_{pk>؃%~{˭?q_o:~c?/_y~¿ڗ%8ԃg':C85~+]ϿvGN?-855^?5kWxd g }==cWxt=>-+n[Kn_\ֶ^{~Zi?1'x+op3_yk>.}]ֿj_/cg<.q?c>}}<GZʵXqO׋Zzıpj{%|P񯱾 w򯯟cKg~֣_Ͽ9#^H~Mw<{ޟ||e=?{k)⹉=#:ɭX_Ds}}Ks_~~FMp~vW¿x j]Ip]νWN s$Z/z1E79rS8ջ νupso-mkc7v;~s:^1!?c=ȭ߬_[rܯ=#~Hn5}=:WarO[pWį\Dlp+pc?s_{p/s_| ~cU9. Z}Bs/85v%3S.F]Npkuc8E{/_z Zk }K-+8̇¹)>c>Fp~sO6f_Yo0~"8#[S'^_'\cp~hr |pc?o}?r\;k{kp }ͯ7v_zW }*3U8: W {Ox:8uW{8~kIp&?|y>+|({?x =opޟs%?oGԯ1ruipk}'3 x&^ }'g>=85_6lkqb~s=_{ w`|ֽa~|q|,|_C~~D~ҿ185_Չu981ނso8^Uܗ?O9 \m>N.w_6x2_Ϙ列}p?;9_g~ }NZMpg__k_p۟`65 3_ ~8{+6O{?FgGaUO; kcjͧ6<88kr+W~EE_Ы¿/z_唂ss}w['kUѿ?ƯM~:_n^y 9s_\{9*c~}®wrnkOqv;3 -v_asz8=)׾3Up}}w//6$vg==;¿/ } Ͽvܗ?_')r5Wrpv+?ƯMOo`%}os88 =z>8ޭ /6O]p;Dx }kįM.Q=_羮`ysapkwcs_VlWGw#丣`sp8uWn}ϘϪa }=uIR_9ܳ}e s_~8O8Bw68gso_{W/}%WxνWXO_s?ÿ}~9s[Fpk=*'?38O.^crw9|]?85 lIFp{r_ }ݿ=~59u"/~_ƿrfgp?pYˋB_zM_pY734}#z{s쿾#p=ppWk7`{g }W*6j_7=bs_xa[O"E<5[ۜ:>>5k };ܳ=7s= sK}N^pso[؅pîG<yrkaq9+8jx_KÞ}5 ;8s_]]W8j0=މv­Uuaz[{ù~5{8~j8^QًcCTwIԩ'"85<į^515^| Zlq5x=9^.;8_}Np[K9ر{לqzܳ=cܳ=3 1{x(ы֓[/4{{ùoP/yܗ?=8yYYO9_(7*G3 o_~gk{_\S~o_ыzTp^x^3x+\w5~^s֓GZ?|^_p¹'/(>~%: } ocw~'o8rW!8ewl-i{XϾY75sN8Gs(8{.l"^c|%?O/ ZyOuKooyN8ȕSwYtItvҍS \\zrܥݩ|U. s?\zw<) IyϓKu:pyrrrU_rM>CΤʵ}c!>7N,)s?yGrU}tt&N?!y}W\n&WyҭKN"K<¥Kw>K#i#*'f^ Zw\-w^O.ݼ79ttR:*x;3\}6\:y҇}ҋzݾ/¥9ܹ68LnxK|f{aQH.>Npɥ7\q+Mr#­ghvǙyN8k􂿄K+zuҍK'o\.us6lƋuM{rlϏi.\>\zKnaxNQgr} \9ϓyN6ptҳE.]BtLɥw!\urʥg]\uɥ\:vn.].#tp7^;f>krįQgnppٷI}9{~Ϭ Krօ˥i7>үȏtl`E|_I=vqns\ur ˥'\GLuKN];r9"S _x?ȩ3f_5fZpr]|>Yb*\ur].?_S]n~.8\:vtɥʥzwj~8'ov꫷\ҝҭ{K;cG/}'tfg"tߓK7NߣN3)'\zS .sg_.=& ?WǾ/Sg'~:b/qop-\_o_kKirZr~y׬ծGnl8*N>.#!7bKOO.tr鿴}ȥ pMwrKſ\zrr;fɥi_ CupV?2~}< G|[+2?ɥ\zrs(ҍһ'>U.8}^l]/o.=: x_\ \uB]LV="?'.]I.I۷å ontENzW:.w~Eu?3έ'y񯯶}"0Ӿ/]NRǤMz}tʥ>rԓߗKWo^.>rKk\:z޷}KE.\K_m_9sE\z/S=l>MܾO+8ȕ_ѷν_]ɡå^'rp&[ٚ}_SwX|5Mlt֧o)py|<rpOɥ\zvk`/tÙY1Sߞ\rk{憜98­ݣoSWտKO.'~ENp|opɩ#ԴSpה;I.&n>L.=cbÙ~~0>\__:+هN.=9å;_ʥ\zgK?׳!tm.=ӷ 59t9wqX3uFG(ͥM9s׎~lj_9~r\:ީ#4LJSzMGn. 6޵CνC9t+tu9tS3#\zrU=tkȡ5K[}u{GǍ_ppn.p|Kg|9%;" 0$}Y+"?'\zS]*䦣^һ|6ԗ/O.~tK)k\-Gn zo.ͩc&K$۾/6\ᬳ^ysrk]c>KSGwrK"ޗ;56\:ɥ:U.}s> Sٶ;ɥN.}8޺zɥgfS'.[rNN!4w˝SG:yG\z/yK䬣^39NVrzُ3g>K}vxvrW%.dK'~Kw)~ur'&~pį:M1"W~}KÕK\9v\:\zU<<^ANpL_tߗyå9[$6Y\:kc;C͕KKoe뫫!g~KWX.z?v[3%W~G 1ҋwrå'7R<^Y7~MKKrݼ{w}xқ7_:s>rL?Og͡MS?X&H.}ȝ˥˙?'/N^6ʉ^9ZҝOһ|rS$#p93^>8y"wݬ>:rs[wq<~#Ot;p]n]o_ edM?åWǴ?mt-KW\i߁\C}D9s=!p3o!7n}>3}V.=gj"חzSn+cq3o9t3>"}KC=^zC/}ا`o3ɥ?څ:u9?Z"ȁTK./yNae,\o9y<\gˡ_cYҳFt9ͥGѕy"WξMr}^l=rp驏lj;z|9zꥫWt~or].}ȭ쿉z~:rKoC/Ŧ!Ϸ߷m 7Ito3_NY.r6\^L~'z t(K7ugp['NC/=}>twһz[G9wȥ7޷;QSOe='N+8:<\eȡ$n]ם7K_.\raޙ^-w'2Ko[>:ξ'9I.ʉ7\zʥK.=PǀKo ՛p}`gO.wN|"zҳN .=-tͥW/>rMV~wpu>ʥʥOKkotK8\Ե˥[Ǩ^unrr[/x59v?SOtKor}K[\zrp&M}һKpU9멗n]\jK KrI.}-.G^\돃KkK3OtT?>ㅓKcS/tɥO.`M^zK{p70r#b̩@;ÿn"opr艿Z:"׮^ɥ|!. >娫kꥻ\:ϳrɥW9t+}rå [$^|ݺC8ғ[P>\0~ ->:u׋^z}gK-H.=9u0Wr"R?]iåͭӯ;ǿKw<ȥ˹ɥ]ʥ?KO;UK:ʟ/~{[S߽XC/zKO>Vɡz\==c=B.]bsp[/}`c?t7\z=K:u:SN}C/=n>n\z·n_ қ}mG>ѯ|3rEr+[rKP/l~rֱ$\zrUZҝ^:}{sss}KnR.??t׾ׇKO..}xp]..=3K8c}$>'oƯɝ_Lm.m}u'6/K9!R/]!\p^:uɥoKw8L暜9zsExAK֩r pw}yԓnsl[NN>\\\zO.vI®Ưz˭Q׬;{>̏9kS'g^zå r#rE}~8MuIҶՇKtr3}ɥK\zQ{kʩp76}_K/\z/S66up-N}8tn9tM>V^Y9 uveK$tNɥ9$Yz>|t3tp\:kqёKI.],>ԣoCF.>vK,:Kɕq?^w5ٟ=һ:}Ы٨?Zjҫ4\r{2~}sBzkʝڰK/o9\\}_-5__J}; ȥ:zߕ8%rY759t5?\!sɝS?~|;jk9ܟK7 ކ#u}zܿ-/qKwU.=orå>ɥ`P\OSY]æOpS}ҫǭ'pE}r5vK/Q֓ +ގKF.}e'g nS.]=_W=u9B['?|}9v\}JR/}I}txv6x>$^>:kwr|4WC/9t׸K?\#W}ߕ9}˥xkF_SG(\}3zK!8| >䲳^s~It8׾੟Y:$KWG*Zk6lkCǿNψgMSG;6ɱ݈\.[.='åg89s#{ꥧ>zϋǩ'^s<å0q/Oxҍw/n,t^z;]r˿&^Y~y^#|G/ 7WN= {kr~1?y1^^_.懧:'nlrď?.}KY>y?\zp-rrre_'Z;[Om&+\ 6y)wN>\zK٩\xry-tFr76__m֩I~åO9s9v򜗶g|_}DmKw^O.Srÿ檜s^zѦ}=9~9:u:n 6 z6u:_m#B?._ԏr&ΗK~~Enʩ}t}^p&~ o.]>%wxK\:7S<}rmzɥs焃~SN}SoampKO\\/\zih-#é.;:~/ntu[wmn NM#\z/NyrKos_a;uKoYtu_?O3޿\g͡ͺ>tKO9ɭ˥{ܺqeɥW.׏>/63<%Wn:yѳS_]z=Kr\KW.A.ݺ{t9t뮶^pcKOrt9Jt(!޷>:}n9tqzɥ'gom3KrVO.=ʷ\ur~xkS'o+S.\zM=kbsy9KoϗKw\_.}K/k?#}ɥ?zI$nҹ79BDnCo }|pQNG/aWˡP/y7]8Щ.]-t\u~—:Xȥ''>8stcz>\z?tɥQ@.=GpY7rrY$ȩSwXΉ_3ǿV/>&pgҳY.U.e=&nͥ9uKGȡC=ݎoꥧ~k!{'wK/S/>r#tW~{u9^oٷcӰGoo-wNGҳY.37װ3Ng`'jzɥ".'%^\zݜ9ҿK/8~'^\z7rMN=07m;&? XwXЯ+z>\zU.r3ur9l.=~䗒KrU&^:[&׎[IG.e_p9tÙ{s1>髝\\rʥ~KO}]\wrkv%hr]oirr9rwt'n߶ͥ='޵k?6fpg\oDҧ;,ȧ'N>M.}s̩\ ȵ{ʉ_z\zG_SG|)n_vrur<&7WL6襣ލ_ݾ}"=x!zr9K.qw0?x?^6NxS>7uЛrW8K:ԉbիW/]_.=O~K\T_ѿ&w^#^.=ͥ'gN|ԩ'WDs)Zw:K;Ko \zoursȥgٚ+u[3ɥ'ښ}"W;D>(.$n]O!7azrN9"n۰3ܯsc:t~e>N{PٍMl;c|}sw9t+_9vI^KWK8?gO[/Ү\z{—y?ȭå?ǿu_t8דz7[3.N^w+tcȏv98}:6Y[WU.od~X}jKO.> Snnjjʡ_̙ϊ6$q'Kz]o.]Nt[/8?5Co:]å'G:BSک~ɡ۷G3)wn]-ٰDž\zgx˥mߗM_5Wɵc0tQp9uW85]¥Gz͇+tqp7|t rM=*.=9yPCtR/yK/b=m[_zp#tɝ^.=_pޘYukǩ')r7}:6{O.}ʝ?å|k6SGhȡ_ҫܺ:~5˫^zG/VC;yPg_6\z~Z񯯜‡K/^\z/r5E\:><å?*NC/:[N/p9ܹ҇:B[-g"g5;+9v".up6}"l.z>}ժ:ɩF.Kr.mx*gN|k/\zrW^49[ ˩<Τȕe˥'ttתSS+n$C .jiT~%6v9[$g˩/N".!.7^9zpߏz:}69vㅊ6:B.x0tjɥ[?!.|Ρ>[Z{7gfpI!8яO!~ה+'~Pg/^?^_gߗK!SO=Zza9\4?|˩Q.=g,^\:xrS|\r_r˥rǷY]rk69t_:<KC/ܿ?}zpz&w^xᾋcϮהCD?>uR?QO\:oR_S<;">ՏKO=f:>\zuʝ?K/r>6kWty/χ꥓?KoN߀i= wNN,K>tQɥ_u_wurqv9ȥ9[ zKOn5N~8{rwr/=t_sIKb=+w~16}ɥ"ǝ\z7Kkr^s\漣^{zOrWmWå$=ts-/8{ߣ^> rYO.KM9s)^^zkx_.]uҝ7z|0W}/<^F_aFKz^3|k~^xok.Kw$F\}:ҳқ6G\z`w?.?UY־*ߟ{<+Mۿ?7cC$D?______Ͽvsc#ɹסqpAu^r+o;zT&8!iJpur+oZ:Zs}_y:g w>\ʛ^ʛ!g}rY6ʛ>ǽ;_\q=r?[?oM<8:R|Xwc?,g\?~g_rO]Ͼۻpg98:k]o|oEzoʛ1cNXyӟq?WKùZ"]_ǫ|z7m .28xr8߫r3g ^b%^7?r3W[/x_olWt+o>_x꽯zq$~{П_yu?}}緲8oD{1~sܿ٠wE_5p~v.1sk+og^P}M }#3xz|o 'v 0k\])g ]lxO?r=%泾+_87]cܗ?kںQWtbx?9M+_ճ w=p%^+_yDŽsO:)?n+ֱ{<_l1s>z Pνvrkῂs_vc>{{*?b>k[o/ẃs_c_33tsc'`Mn垯k7zِٗ{Y6'?|گoSy+885uW z0M:~s_c/_Os_`wlϟO{<^c+r?:R/wտF_(x?ïzRo}vc\y5{|c=o={Gn| }]_|~|6ԣ_}Fgɩ?b>Oput9uWd?mjw~7Mƃz-k]{g{ 뻂zoWG gHp?. Z#^_:rOW :/v+_c<695m팿s_Qn }4sXp7;??\r˿#8{Gpۿ܏7¿w$8'v X's_][Oܞ?9l zlا==8\%l5צӺ . o{+Ws_.}|=>|b_<8u}W_џZre# xc2?Z? l3֩׎=qNqㅃs_ݎ]~1G1Yqg f0?8/{ǿ^{矛;98>ɵ+W8;gps߿78=y=Op+C¹i{yipkP<;+ܗj3W/ù)?zz{gr28n{Dʵ_wroSGgY~Y;agn ,}q{3__7_/8|{ÿZwrטOs_gܿWN =pkqcs3K587pȟ+?:Kmzc~G}}Ͽ#9^s_8"~U/,8o/g(zrW]|ַMGW>q`/s{psCp¹Jpc'~E}|&{`}3s_M8=yWߎc~+߷Uݩ^%#ۗ%8u??}'ʩ__z؟oW._9y88߂s?F}uϏC.~ ~KK-hp{<Ɵ;]'6]_Sofɭ_c'ś>8/s??6ʵ3 ǿ_1%}E~X,8=b=7}?W~W>߱{sܗ=8=~s08'8wos 8"_c<#ޏgԉ_~_Ůa'/s885߾į;~{pz&8)G^o3 gr+^p }cpk={puw&^fWn~}׾¿'8oʽOJ䕓/9x^Y\ms k>ks}pyxk }͇6M5W"'O{M(8/s+8&kGs_7+uvp?ȵ_c}s_|\rW1'}q,ާO#k«J>νs_g`x_ѫg} :<p;w}_s_rԓ_CGQp p;{S}u^¿^ `&1|$~"8̗ùnG}\ֿv7S~;{rQy]qzGs\;88n~8(_77sz"85}ܳ^=p:6:/85? g38g'%rW_ %8s_h9yWN Np[o1?^|_ Z._t`w~*8xoo ~~qpSg=s_?Eע|Vpk7\{$>8C9vq_|Y vWs18=}6]xע=y5osAfrkigE}]羞.ȧ{ pߌbvkV]5Kw=Ư7v5%rW :5xk?oחUn]Zz*>P35{_>ݾ֓M }5U~O7~}gSϩL=z5Of^7]34?L糡M~5?<>=^W$Nf[.5rkpLm}2+~Q!D~.zͱ9v3_ pkuCmkp'Bpkv9WMp~ù'o8/pY .,8\!u5#ϗz<&rpk|b/8s}gpkaGk_<$:$!z ڞ:Q }3>s_Qط{=¹!wSzkrɏ˧^39rJNUک'Ӧ^7_}r7s_a_=ܓgs_Lr3ߔk_O@3{xpį[Q _cُg|}׬=#WzcE_a= >S~_kdxùg{P|䌩rY9ԝˑsܳ }o羮cCTlzpY羟wp?z_ݎx}'9uy9v#pk9׌Pkǿ^pQi>os3އszS8u\|\_ovs$oxpυs믲5=~WSbw[}gJkswRY>ߴs__Nub&O{¹'sok&tpkMq}J=;Gx!z͘_s^08WR_Q W~:ub.#^tѷH.].ݼ\'ϩ>ҹɥ'~y|]M~V}Dͺ8{P/[RO}"w]Rɹn.\AU>0v$ș\\prE~XQ/>K.fʙå;}p.=+t|ɥ;?ȥ{r׎rp>ɥgA.].rsׇKF.ݺҧ_L.m>/rs҇\\zׁr\9Ip7.=^ɥzaG߱f.}z>pg<'.r@9%g޳ƍ>b|_p$>M0qɥo<}Xҧ< I8/kS!|w |&n'opهK.m}vm\z:ukl{'؇(n_0WbؗKOnA.]"[Kw[.]nD.| v;3g˙7 1ҳ/O.=9u7B.x}x?/ҳ/+%rgUN\o~=ۇKS3{s˥r͗uȱÙ.n.ݼ\Y\uW9Nԡtuٺ{9~Ι_.~aUK׉/]Y>ͳtsUרKN:4\k~.]Kw?ps}p\țK[N\zVK.,q:5\[;ǥ|K1usSK͏åN_C]ߏ~q=u67cř~t_uq,7_.}vr ǎK?;?jn:Ne|wکyv{\SoX׿>.ݺ_]I].=yqc }ތY/$+׺}\zy~j\73:K'uús K~izp>OK7 ׶\z׭^xϚp߇q?t&uӥ|quSǥߎBx\q Yғ=_u8]z\znNg>q駮JcO]yKOKig3\}ҭץ;ғX|uX qƥ{\z].^L~i]ĥkkr8^\S.%*.׾.ttc9twݺƥKޯғ~8}K\\:}=Oz~vu˥'\k]}t.w~y>̯/gKΩ8wK.X`<ѡSQ׺touaѥ>Tt}uOڙ_/.1}ӥ7.g.tzq8rKyO:[q}_z`_]9uu:u?\ԩS{z]8uׯ ˥OҽCť_ű߸0_>zMG?o ?ogpI8K]-o\]>g.}sӗ`W.ݾEt#t^_tϗ.ݾQuLpҽХ߆K.ݾ0t>tԥSgQ~>9Uw>;:vɞuc_ү5ݏ_ҧ\n]_\e-^qyyҭK\z9׿>=ȕKwF>͛_/a>t.On6]w]yͥ7֓L?׳ǾOt \$2.繺t/틴tݹqyD\}#u:;\zpqpܒtҽ?֥{KKݼ|[g2=9oi]tNnV]tq7]n_8\KO7}å4]}hK/Od#T]}!q篸kG3qqԓ:߸CWpŽ28ݏk׌;g>k}~\M]mKqݟoZԭt~嚛3țu1$uKNnG]zʫ^:z]LvwpYϋKO]A֓t?}gCғ>/XשеүKǥKcK^>tK.>f3qk^:t֯kLf.^{uͧWO.g?h2_9^OqӜEĥХ\Z5OMP79Y/ҧ8H\cg:u1]K7Qn.ё^֩Kwp˥ǵL}^>OgN=I7%7u_}}kC~u'zͩ3C'^S\֕!pȩg?89zM]r=ǯrt/tc\:yӗ=p_ҧg].0qK\k't]3.]O׬nsy[];u+%d|}%tyk:nyOpkΓ.XcX}nwݿ]ozw>^ԩ WzMOX%Ok .^ǩo[^ԩz_>NKO<K[_6tO=D^~\.եK.z{/?.\٩+.}r~ĥvrN93'w/u۷/..ݿ.}Wwupү/{{\4V>̛ng#_N2/}Oޜ.}noƬÒp_w2vSw} ?iΫ;vKV\nrt\s9ͫ?.KG~nq'/|E]˥O+M];KV's\kss=Wץ\:ct֛f_`LqypnrVK7Sn~.5Oѡ܆|}еۿ>c=tϝ}NxoV~yr.A: .}{0\i0gx爷_>gK.=˼ǥFN]ƥSG1yHq/@\;gs֩;އC}O93Г~֭;'/s{6^}κ~ҩ;ǥ'w\z楳[>J\z_/u:}k>֥k^} K?-˺PKߚ#yqSl|å}>fg[]kc?ay үKסf_]ܵ~ީ3´]l5HMޯi>n77ɷn'/}ϸtK';.}x;߾7?\uqѥ]Z77qڧ.Ͻ>yssz}|Kw_(.l%o<.c0>yá/@\zAy_pӺҽ{z/썱}6 }·1mp:XssP}$foơ܆]iѥ۷D>{?___O\Wѩzʭם~{zcWwN~|K_ӥ}S1uUK}tg]k&/|!\4_eѩ>%]ǥǝǥ~q&*n-/1q#}NƬ_qSGsG6/\z$u1cҥ/.ҵǥ?~^ ]zҭSԥϿ\u]w20ut~:K7'uô.;5?y۸tV^zgꌩcɛ| ]x|n]X>g=uAu~yuG܌Y/<:οq\=+y:5/ݾ.{rqW\:yӷ7s;O_6oXwH~c]KO>]u=\'c Owz1͡C73ԕg=߈K˥Wݷ..=5\W܏u_/:uiwpK'?o]ui~_ط㱏ynҳӥ~!^c_izgs_Qn~..>.:t .g|tƥHݿnμt@ׯuut>s]yӺtu^u:t8Ù:tԙ_o8?.eteߗSN~tG>.=yu=[ycwny}p'w˥Y.>quKYN]i\ryyǥ;K\:}O.KO]NI.]}K)5o)φμoKuGb7_n[ò>Sw|ouѥgHn?.ݼG՗zAJɘCW^Ř8~yp߮_Ϝz?ׯNKw~NS.U\z|lyKOpugo#gԩKסp۷Tݬ'5wǥѡ5n:uXᆏO=I\}K?s1fzʙ_q֥K:U]ƥO߿aߗGw~nϯ7^.r|K?O?{K'/w3қy'UKy_N{w9q_ť?y鸸ͥO>ߺtgV^zwl.Q]:qqo^}/W^zoүq3ݥ1Kn߈_ _O&y}_ѥ{ХogJsgqq̸tݓ.qKOK]:uqy?+kki.q鏿o|s>^:{>Q7׏Ko~M?ox_ׯ>Oׯӱ녋}z]NGN}HKL&~%_^9wػqSgz9yWOf}Uy1f~M~:+:yn}RO]Op\σV^:<>[y2^sucs_U:cljK...J~->Y׫>tK˝~%\eDwkG^cK?v'~U9]}mpӭKw?N~U0q[9}6p≯k~^ytͥ?srғ?zM|r>tsh5k:[str}3&Go$@g~0_܌K׭8-~_a:s֯ǩ'9?.ݼԖzWWN䡟sեputOBc]O5us~sͧ~SI^}5}޵5}s!ˑү5eK:oݥ/.>_u3~\?ד#qtߺ#KML&qĥ>uq8>]g~泻V:1q5_lyQs\K?.Y̯q_篸+}tw]}|-M:צSg~?֓ݥG0yW\zwLf/+/WA9c9tq3rzKw.֭'.ԓHP]F5OoN>VoY/\z9u֯9Ϻ?\ 2qrǥ>0??.}'/G8޸#&<.8}7/K}Ekg`L?xO;ݺsSסs67c`˭g򺓗._҇ooƭ{R?꿩3g_x9O_һ_+gK KF\^+c^O^zW\˩!773?~a[^'*R~{M*OQ}]\Nvt򤓗><<>tu.ݾ˥:WOk\C}orMlt9n~޿i\9u:NMrթS׏3Gg|sKq1||PÓ}Nqϩ\.yc"S?OǥGK9F\O^tlk'աқ-.:-/Օ>밮cg_)I_ ?.g9编CoԕΩ ~9ǥ?Y}ƥ׿g^:Bgҧ}!KtХWMMһ}NLs_G}qSSqԟZMǺ9:ץy'/=)Grq&'/n9sD]M}}\:_9ou:suأ39bwL!}Nĥtkߏ}NԆ_z K?>.}xL ̯y].>037kť[tq9ޭup爏c#▓:f~}t>_3fo\zҭ3f_.OB~ߺ9ogթ;[g_ѕSO_Ǽu\͹n.}z}Nĥ }Nƥ{=u:8<gytGƥЯc]vjUwӲω{ƥK?ͻNͪ{0/ZΜ/ߒn].eOQwUK4?{(.=ys#ǸZ9ݥǥm:j]+/}|\n >_]{s[KN>yKr_?2v~=Sg}Sw5֩[1v+9\GK:Ɩicw;X.:{9ouK˩s=}N\yҭKեV^:K\:K:$]}pq7tؓ>3v:}k=uC~ǥ(y'u?٨sZyucc2ο҇?.>q鷯ǥwK~Ut<'oM]?>V]gL^u^>Ӻ8;7K6󙒷^ե:f\+/z{wx\z8<\0{}uS7?g@\zթy}ysodzwO^.}_CWNk޿> /N]gq;'¼tuquǥt:`]0.e_]ucNX]z_\u[^q^uz}\;>;ݥm,u/gқN}\zO\9+]}mKOKonݐ.=ymtuqfe\üt$ĥOu:c]zq}y8^g+].>[_.}ѝSwkӡs=_Kn֥{>ғ7K=K7^Kr\tĥ{?l^u׺guXSқ߼tӖK{tڇ}}u_MǬ_357c#k~SK﾿#O^ԭӷ7tݤy:].~?ίu<2.˥ͼt{߯:sp˥f>Lޜǹ_k~φ.0S_K:䥗2/Y\t_έq&qyZy<.]7K>V8:ZK1,3⢯̯K_eҽ?.߻tǥ߾+}D&:؏K70yף#sgrLK~|t3ftrOfz!~_\}6K/..g?`L_K{t8λugR˥}|ׯ[^㋺u:9u=\y釮;]rq㚇CKO-̯[g8y3)ǾK:Sgny鮯K (\:.W9u|uqdL>uסz^8tݥXy霏qy2/ϋ.ݼr]z\<os:cKo^ϚN|?5/=3\z'a] KЙt}urϕNtDnNWn`L]?C77u%o?OҝSw8^K.]\3vԥu'#K=Nq|K>tO҇~9ynݼt~\7.Mf,yuޯ:t[y}p0?;9B'w^+/|䥓~XOsc 8Sg;'OSY.=N>ձ_㴯-}>Х^_z^::>ǥߣ^qM^3 !Ǿ5?q闯g?ҝ?tIG^rw 9BKO5֥?+_zkRy֥_:kOݜ_ٟ/Wrl0$/Øz+^~_]5#D:y.ݺ-/ѡz͓1:?tեZtKO.U] KK㿜_]yc3P雥K~).=ݯ¥gUKo\p:tҳ>1/3pӭ?~.=U.!q<ץGL>/yr֝_}=Ϸ+^|t#9pȧk9K]3ԥo_O_r ;oi']y+/ԱSOR.F~OGg3:u]ǥOqW\Cw?NNf3o9u}'GԽЩ'<\\4!/jW^z%]zԥj^?>~u|~I91oO\ǥtқ#}"7ݹyNc0KoGky:tU+'K}Ww&ou21~Ӈ\懟t]!_;ϻpkK7W}SY#qkЏ:8{\׳~Kӥ'?<9BoϏKg y^]z31'p.65f~%MN_5.>t?OarNw\::yޖz?G[s=ӡ{2z6utp\ztg5ɳN^ҥSopwH~OWSy0y]}!8t~r_mե'D~Nsoǩ[+.KquKn.vx}\ԙS9ĥO?>yzһQ.]cױ3];}K+zi\Coz,.}'_>Vz_OO4t:8o)papt_ӿ}Sgw_/퟿__ÿ>ܫz9kߴMkߴ'߼Mu2::RkߴM]t6 ν7m׹<7m{[y%/M{[giUۭ}uoڹ.u:ϼkߴ%OM8n(ν/sCԹ; ;oA6t-otJ8~|{cAޛM[kߴso{}Ӧ;ŹwEq]yޯ8ο䩟uݹWm־i5Źs}y׾io:7m'ܻ.^z6'νSso'[}6Tqmhp:վi׾iK>v?üR{my훶-?W%νq:N~ν_+_|4Ot8><jߴq}Ӝ86=_j4=;ν%M8FR{>ݱ׳zkߴ?soW5?\z^<οs:L{?V0?My8f{{>?[-M{3p~ʼn׾ip>I8\pu;.8kߴW[s_߯MSƹ7]/ν}n~7νsoCg^m־io νnq},us=}ӟaW?|{3 Csms=Kj {νM7mc}f>4νm}8}ޗu;t?k'8s+{O ν7u\t3Xw~:7m+}v|uצk_{e׾iK^x;f~=׾ic_Smvr}Ĺwܛ}p-yo#й[z?jߴtХ׾i{oZo:lY7Yףkycgpν7ަ} jߴٷ nϷd|q}W۹\{ޝ{νRqν.pܻ p-pZu8R̃~ܻy8?kߴ[soy_zsYGq5㷮87mֽܻSso} jߴY׎s{g~v֯חsoܛCù{׹7pt]Wso[*ԾiNެŹ\{>oU&u8ƹwν,p-yoù{?soS]⨻qUgsotn~EކyۇqCӯ}Ӽ8v-.y7k4#:9͘uν :ν7˹:qq6_}t{Źscx֯q׳䡗so:){7҇zVGνYׅso:{ש[~98wt-n^2~{^swsw}sޛ;zk;qޏey9Pso<ֹ7 Թ?kOx9>{7o¹7yq?ܛy48~sw}soqܛ}Ipm~[ν% Usw}so {_/7պA{{ν\qMs{W8wkuMDžsoAXg~%y=t_~1˹?s?8wu@{>8v˹W9ԟ8޺p~%߽{νs 3:?й7q5so֙ܛν:r{kܟ][ׯ.~>u<͋νѧMνDq/C9so¹g¹ߧsoqy{QssosߺYswP>ߝ{;Ĺ7͟<_p>ӹpZo>qй~羾v[~v{:rùv~7{Ww_˹wS8wt>ֹ7νMνA9w8n/=q{q6?~m=й_sw?G˹7]ν}sr<}</8wܛ}pU^'ν]Źuޟs}O _so&{'{/B{pYƹ[Osom<8Wsu~so/+=}{w{3rOy7ܭѹ_?osr]ν鋭syj:n=νӧ_6= ={{p?zy%Sg~쫅so:W{_岇׺_¹g ίsoG{q?ù[so ^}si{~ν7.]s}z3vޞY^zS> 3~rs}soù8rmsߓwqƿso{}7׺۱\A:6/ͫŹwJuUs{{:rY_ܻ}p<ס{g?ܳsyνM$8rssso8 {﬏p_68p4o{Oq5{K}96<{cùE{oeOzq|>{soq;9:܏۳SOR_s>Jo{νaSyx_kg_P޼Ĺg{uUS?;_q>786;pYT{p_ù7s?s{#KpK:qͼh{{nuP'{pۖ~|_6tW~=8Z7];;vM8v/^{}s~Wq1S|sz죊s~};d=܏#>t5pӵ[=={Oz {[yoIjwܭչg3#{pYoܭչ؟z^8t=S~1z*: Źc5_W]S׿¡^֏ZߗKm,s|ѹ7[5}s_?OkչC%5uOpWwsg~ֽoݹ>s}¹?ίqMso߿5y8wu-}g֯Qkscg?.c5ɛ\~SI1$swZ_'ק^Ե?q~=t윏s{;:^ǹCWzOƹg~ùsy]syν=ަ7|vνsR쫁so[g~M=V{>_8ˀsw_싁soqU۩so'{:a~ǩ顇ׯM;痟~?=g5qלҹ75:w}νNNν_so)¹soN5n#:c֯q̯?ϭ>GMչǿtPHfs|^_ί:p\e:wu۵yƹ[os+9:so׹:7sLޮsyνѧW?pܽ^Տ>_ݥ*p?ҽԥ)һyo˥>yx9f֡Z]c7җK>;$ŝS׏[K|3g?u>guιE]c"ps|o:X8&\q:e]|Y.119;t͑>mw9ovy犷6q鮳kiް.>RtuntmucK?pt-_o1!ez"OK?.L<~վ SvKߏKMsuKn!.ϋ.}ڧ:fͳy0s[.}|\m_ilw|z0vSwK/[֥Ok}t/gRn9Х_"Nai2fvZnқNխOCyxЩ>uqsN]rq_s_?۱˹1.=k|Wĥc[}> .ĥե_}_μUK~l'./@sCw}N>ϩCեaZ[׋һ:등0y}3gvygg33_sD7=ǥn ]}Wt7.=.Rq<Kқ}Q63g;f~\eu?07S+ƥOo]}t+}nĉK;gp֟./.Gn]˥:uq?:}pݺ\z7?F~_t\CN>'8nNқ˥ǵS>_q؇xutk&u'7{?s:빻\/]|[qAߕ~Pw;C.7u?K~0.]ǡK7FҥB.=n=_sDqS1ίc0=<Y}9u'͓ťn7r̯|d}b]ׇ1uc9ώKqsSg3:utpKy?qθt.=Cn.ywgw#N;\zK:e\+> p~:ױqc`K.aN^C\:u~o>rΩt_.᦯_oo^KK7M~~ғ>xNt>tcťqf].n_A]z#.=u˥ϏK7X?3;Icq[tҗ. ֥71.|G\z>EqwKKwcsNT]zs֥AǥǩyF`c֯CwtGҭcץ~K˩ǥ$qq't7멃qKirAҝt?.<]]˥K.~O׶q{9w/ѥ\9:ul$?ktֿn]+tO]nե{?Kw>.WKХtХ~[xܺ×q]_]z'#.q{[c:_us9u"jǥގKEҗǥuw.қF.OХ?˭SwX˥ǩ>:ql[s7\/ K7^̯^N9ڞ7i~r}:|]:}KJ~/K7R3.=}p>?KOxt t~ҭ+ԥ~.wNΡ;??\#\z8V]yt}n>&.縮U=?}0#<DZ~ĥ}ѝp}q燐?.]ǤKw}Kbs1_Uθ\z_˥_שwdכ1uХMn ]qsK.YNgN]qvt?/V:[.ҩ"p׸t }^Kom.=ϫs>on1> } ʥ[KnO~7}tW]z?ƥ(.6/~kcSg~n^.2޺tcp9t}ҥ_i\z1.> ݏ¥>r=˥ϏK7?UnU]}=KǑqtK?U#|tnCtt>ԥO-]}Kϛ.o:ur7_.<7c$|K׉қ}Iq鹾n.ѩSO|vrp3u:ϻk~.]|ҏn=^3Mf_VKoy#D>x\וǪ}\z>8:ة[\,nؾ/x;gԙ_y?}p=܏#=.'8qץ^ե;}"Owݯ8k}^uC'W|'}:crҗIL\zq-}K8q.?9BcݜկrL_5qҷt0sgGn_\z&GȿL髆kzMSt֝ҭψK,.},gީ錙_~T.Wtߺtt+.=.=OK.-ˏK}rй$wLK̛OfƸ'bL= yϪ%ߚVzͩ3w?Ng~nst֥曧^s}2^8oԙtz\:y\;Wcơ;gt}w˥<&.b\:qޯ}>֥{=ӥN=.~2>6~i\:q\:Oqs.7}%>.Yv9U_zͮ+gZ.֙'G曑zͦSg~ׯ"?zM+˥NK?K~Ͽ\-u7N^tݮy闎98s※y|&9u~:CN.;yӿ$y輯pGKtĹ 'T~>0WgN!|1L֍[uqۺgwKjKtGL:/t/WwY'N:wwq;myc[zpn^ŜOߤ)yq9^.2 ?ҧg~%<.V}΃1}6n:;w>'uH[^:n9;EҟY͏Kߜ9mp鿉3Yus~:W_\:NtO'Bץ˙yoq9ǟZǞt\0o8ǥL\ғ}YKw}a^:ãKngn>=Nkoҿ.|{Kn..=.~8鋀K ~ԩI>ԵZW]yaSk^z7}Nq#ť[KYnIKMi?ᶻҽK$o{W M^zׯN~Nk[˾/]w߲yqsUw\zɷ};Nӭfw>'KO^u~\ -.}cU͑7^}=k}nn^.|ɏg]O҇y3g:ҫNm㦻}6RХjV^:nHؾ/o֫u䫳~re^uBίz\gBn]yG֯n>KoY/:ԥj^z7c9b8W ҭץ_߼v?[.ޞ>{ݏutK^q"ǥϏ:cl܎ouq}ҽO^NHn.s=ӥ?Kχ.=no)yهqǧnW~܆ީKť|n-F~rҥwy:?]z\:t[Ƹt6.Kc9t;S.xn_ \ύuW]u+/˥ǥ~_\u>zNC}?ust~]zuSZ.]N~%O{=ysu"<ЙsO:y8GUW{?u&qKtq͗ե?KS]uί<׃1u:=zcOyac[~[Й~?.=?y|gڇ\/]>yl#ϻvs?r36/1]Ki_\:_y鮇K'/ D:ܼ8|KyЩzᛗysgғ~׳C_xs6]ue^z7tǥ&.қz\t'KϏK֙_~V>3'[\q|m\7Ìݹ_:}_^?]øt+t>a~'r~'I~]a\C_/'c\N!&oαϻ^S~.͕.=}tq-y8~=}_ץKtK.s\tZ.=߯LK֥ӥt\E\rgԡ[?_]f^Wm֩'ίWf?|ҭK˩Ssǥ;?GHvlf}}tt.aKO޹.e&u)sk>:.U~^ԥ=\ϿK߃˾{\qP7$kK_O\zunCts\}ukțy̯tťӷ!yytGgn=oS\:ͥsѥ?O c\:n!.U]P~.zM#z[~[2]_>"/8kƵY:^ҩ8]9ϻK!S7_aL_֟q6\zK7^x_N^:t~}txtԓġ^(Kr=}s=_~WݽukOfӭ3&zq0fx:ĥ*.ݼh\}#>C L+_OSץۧg^y=9BWC.'>y>̎K?Ϫ/)׉K<ť˩3:Θk9_]8tԓ$?]7>t}n\ոtsEқ?yNݼt}u̯uѥ;,N>w͑wݬ'qݥ'?Vn#9BqMwׯñ}6jzCwnw~+OzKn=ISu;>4/=nzMtl.>7Ň}ժO.6zk塳~m:ur^[cꇿy^Kw7/}snxgǎK?=طO\4.]}/>C|\ɺt].铗~TW^:K?wnP\:9qqUOrKNǥ:kƕ/ť~頻}Kt7tԷ'/~InyrpЧ$So^cg<ݥ71.Zy>թS9|=}^ݹ}_>.=C$\1W_:y?ǥ?=}nKO|5ݹ.kƳJ˸C8t0'?}^BeʟٿKg'G6=yCgK:urK~p^NX譮owspK?uk<5.zFrNxzKO:sѥWH~ʩ|t$uĥwrS6^O]͘|q?ǥ>uKn/ӡS1ts]\:үyxq#ߞt꿩3ԥSKUgs_NJCĥy]C6=׺1.]j^NC>+_wަoˁn~.~3K'_NDә.:uǥy'9"^o~]:mt>O^yW9\.=yb0U系t^^yԙ3O$?|rww9r9~訏SNݺ'/ tyyx?.Wǝ:qt:tO=KK\\N7W>ЙqKߏKO>ҹKc7kO^zK':.>tKե:|tmwt%/{qr>{ߢ[=:{s:qq&<>j~98ԕ9wynsҗqIƥN~9n}κk{r/]ema/G\:s10ޟǺC_C?n]ظt/>qMwξR]ϙҧK/OXg;GKO]i~wһݥKIҧN>MW~K9Rқևnn|uo:?$_tt9qNS.=\ϙ_Ƙcǥ'N;.:]5_:lzfԩ ƥ[~/Lu?XQu&J}w;E~~~}WgNNԭ׭[݄.]瑼8z!YYlOt:n8~swFOżs^ p~Ł_coNǸSS.>g]tRn^g\tR\}pցĥ^\z7=9ξk׍ߩ?].r'=uY/ܻKMמ}۱ݺԙ7wgu.gt%O9\ys&F~7޽]KoCg!߻g鿩d[>x\U.}g?7/}>r釿z!yO-:\z.=utݙ.0S'ܬI~:n.:Ӟ䍯nХljҽn.ȭu#9бғ~ҙLcs^'/=__tqSK+C/%OgRCt0uχ|aq_.ϣ.?ETr鯯zWN?:KiqOFny{_SmU+0yͼ9˛}_N1ߏGgNߗ1qGyһ .!]z??|Xu̸˥ۧ3.]ǤKOׯOKW.ςKo_?!/|~mzz}\.XW:H\ArKv.]zsu:cg'yC7/}0f?nҫ:aoۧmѼtOw\u8_]xs?u}=乞;S(.OEY^:tWa!n\}:Vnݺ~:|Swå{ť_ǥ_:tO.]z^wa?eK{[z.?'?77ts>.pݼd\{^Μ]JnU}t|\z3OQny y~qrusc/zA\3n~zɟnί_~u&r齯g՝9uƹۯ=\Еt<L~Y\zM}Kmu2?]os;΄WUXHv`380ىq`v۟ެJT_mbZȥWp3/knr&~KK_ҫ:טҭۚ\uҫcݗ)gNȥyty+otrM}gKz֥K.9z\?.=rɥyȥK\zU_Ru}rp&џꥯW?=pwQ6vʡ;=؃M_?\WK߽z驯>O_.}=W`9zzKS."_*Ǯ>S\ߍ{ɐ;缫Kꥻ?KFp;n`8Aѿnɫ6\Gr鮇ҳ.zuK7>^zԵM.|S/=꥓WxpUH[ns~ɝORsz0{=zU\= :u_}K7Wr5l"N>#xr#%qrUS/}ʙ~_.C.]!ntߗzw9N8{t ʥ[gR.\}^˕Ao]5һn.)>/~Kn}Ksrٯ֩chsKw^?_.ׄN.3L&N>IS'?9qpKroS;һܺKOnU.x|M׬K[::BE\.]NpSWmʭ迈ɥWIrqПs?!n]C/}asZu#*6u_כ3RwC0\zqSN}yj/pW^OftZЩc\Mr֡K['_:=^:ҿ9˥~_!{Y}L.^.{s*.7`SɝS*+u9Yr#Kp% rkXȥ[P.ݺ rP/]*n.=gpoҳ.Mҫ:V؏*wZr\kԳG/7t\uK \|mλڇKo>i^|)E~O]~~?8t&߾= |M8׼/~ǡ^rM.d>Lӻ2_nQ:̷ףȑ_'*䰛u"sK䲛59wt å'zyD~[>uy=uKgޑ89sc&.ݺ;5n'Ь\2_3sϛ9$]!!B_U.~˭?1?Ή~:zC|ҩ&n]+WwC.ʱاM.+-rԱ'ܥ\ySn|ͦzrqs>墻ɥ_S%S1>Q%tH҇N_3gZЩ >'qȱO2̯xS=q^\#G?+'>[gQXƇS+[ဓ;K+N.=9жΆ+8ǒ:BpɥOۉǍpɥߗz%k=6\gEkp;Kr|f;a8om_/!SGˡklG/7wI.9+G&Oyɥwꥣo?>ɥsz釾pLB[9tλܺpȝ߱~|ͬ@fS/ֵ;t$S.ݺ\zor驿\zzupyԡK.].=9ҋ˥{=ҭs~߬ҫzkr盼!z_'n.e:B?ɥW9s$gN]_b;a}oxM*N|xɡ>|#^wԛƇɥL.ÃKGo=KNѫ^..ްS.{?pꭷ7_åח;K?K.K.zKO=򝯹ŇK_gfgoʥJ.ݺBpY'efԝQ/#ON_r/-uK9%΁:~|߿j;_DBLa_׿wC {O}ɹr;=-=A!;}G/{MG~qSҋȹvN/\gIK+rcm{S?ɹ!W_0ȹoMvp;n~wp;n\_ϯ߇Kwusop~?? ~/=t-}wB-Cp;S{krWx ν~yNc[68jW;nǿo>]pN=|V広s/M}?;nӁڙwtGl_1x3a;s[}ufg:;nڊb`߂ }j;[py <[/?b+3_[p?n~M28֯xso]#{S}7/gMwO_s߿U98|ַ-<7nqa=պG}aq=㱪;/8wȹYi1_sLqlvt?sۿe J}˱_ }ώ8 ;9W_W_Ko_1Yw!8na}_}cozz}*8=vkrw\z Z?tsܷ¿~|G=!_z:=kpa?wE|듁ϊqp{=?c>M_nŽ)/ܔK}8 -Wb> };6WW0؋-q룞'>z%~57牽b}_ɳs߿g`߲}$up{[W{px\鏜 ?[W/sz[~$8 |b>kr#kFp?ʭ7#[{g0νp }}L7޿w|#8w~߃S¿w߂o{g3son#{_#38z*swr%Wc'C }k_ۇso#[rO?¿g Ikǿscv<ʭ_1һW{nxlrOWo?9<1-[`|&  >sg~ 898=tCUn2 x[/1gؿ&~5O:8>O7C~Y#nwx=\s ]b~Op?1s~!~u ,;#g<}ko1ރs:78r=<3r5ӿvpހs#{^]OoU~2U}b/o|kW~|V_x{9wpτszIE.w@}xCxvr5[g/8mw_sKkrxNuă_ùg9~{"¿뽞{oG| }ޱ 7vxcoyvk/s%c]xɹo}cO,*^/3Ϫ\-:xfgq{WrćWgog_ps3&=ד!^vshs~ =px]__~_;8ù ~ß-8wފ\DpLs߇3AԻ =pK"tϻ";8w|相'ƣu_s4;h8w~ νP矅c.[y\Mp{==♷zksyO{쿊zna_1Mؿ6KZm]ć\'8;8w={+νs%tkrkׇ38=s6Wbp_G}?/{M0uzWJ^6>,u;^s~>snB\s"^s_9܏__sϖߊ̺,TpWwɱWp= x\r5vkr?qUG%8?5kj_/:~/87^Or{ù91}vk_ܿʽOOR}WpuyOs0.|&nn~.9'lKogb_~_v_O<se_~]®o>>Epyǿz~"ypsUxvu 7]ÿ{kWk'GEn:8w~q>XD>SG 6yQ}ok'wȽsޕ zɭ񾞜 }羷qxamp{vpF~}߉aO+y<~{YɩO=ﺰrpXosc{`?r*^$_{/¹y*^OL:wp3t?^ȱkZgdo؋BuI|W_\_;:0z8}{rizU֙yk?hXL59WȭW淆c~^?K M牋|M5p|{nUn;蕓0grwės}̇xUKn<8>lk&> oӿGf_!gw6_'ʽM|[c> }xܽ~/2S/\u_S|3$7o^#_ g| =/pOs덉M|ʱE<5ù{*'y{/3] {zۿq^O/lk=8܏7pkpR3oBO~|I3 =ss߿b3't~hpO 8kb[/gf3yGfmriXM-W]oZrǹDZ~x3e'<=c|n5\>ņs냆ϳMn<_nb;$_\sb7MrO׍=cGf^=K }W'#٬\/,IR?xc[wK{qwGZuɽ߲|g_9{?VUG_jW淊M#~|~wӿQG!_wc{Z/,xx.o%O+nI.< Ω>#\7wɝ_N\+t98u6پbރK/3q&G\c't2ȥW/tKppƙKOs}taK.}\zr2O9C.]rpɵqN9or>ߗKOv9ϻyå-w;D_<>,lԟ') ѓq%"N>'~ɡw6yS}ye;g>KnGnχ8gl>s_̋r< 7ȡuE2/8\zr;;Ƀ-rWm =&}Dҗ6W4cJ.'ho_[K/r8K7R.=ktɥSO+KS.}>K}uG}G_.yҳ?gȭrwO.ۇKoe^S'y: _EaG$WMhǿqN;녍'g\zrSM3/{.\uv˒KO${ɥ_u\zG^.._9gCp΄׬rɱ#/ҋz0|9뻙q׫~M|ѣI.ݺp}Ht=ҫzrN.}/.NN+z:v`'9̯w9t꾤9"uq!\qk^.Y_͓K$t+t~K7O+yrգK7\zsϞq[_Krռ~?qNwtɥ|9Kr: z˥g\8zENɃ]rꍺ^7xM.2jx?ᲓK_.zr&'^Kr9uo.y*r8gr]m:K/'^8gW9tЉs#\n#VݼȃKn\gc<.z.}a?GǸsȋKn\zOKϼ;tw҇ɥSWa{wr˥Gyrr'rm˥\˽KN}I,lpzp>KT.:p<҇tɼٟrɉ'K?/$\utKOyӁ#o#6mtnrMNrUkrWq^:\=. [)ux -r- #O-# '^ԯ-3q\DKO<ҳ.ҿsi{K.=?<ɕ_˥:5\u6Sκ/ZN.xLrK?rᚋpGKw!^C:Vz{ND..& ntҗ?\:uKO.μ?gk#n]M]Ks|^\|pouЍɝ_cK/K_tEҳN \zUoM.^|rEΜx\zrqrة^\ ̫KK>XOW ksKO=;'^z_kå[wA.]A.].K.=*7r}ԉLΜ<~OK_%W>yɥOE=t8sx3uc~K\z`S缫ɵE~X99[cgٿ|[.{f6:ɥ_rpS.=2Ҧ8\7\r˥wr]kr7K/9%~sp?[Ν,9rrsrp\u]/ɥw^}_\Cǿ}-0{='+9t$~SU.=0\uҭ^cd<K~0>\>\r3+r|K˩?ҧ6:?ktrҝ/һzW:v?Kw='nEtɥ[W.m^κrցK\zrEZS[w׬ .n^79Nӛlo'7,^/͋K.:p?'r1ȥ_\G{rS'Dʕߑg^o\ꭏӟʥxYasޕ}~fʩ3gzɭ_rꜿ|r/-g.n:r䓠}Y}:s"^ԃ渿"grkG9=og~Sr}\m;WjݗX_ʥ~ߵc\zw[jSåK>׉M<._v'`O.=9E|d>Iv<~x\3'ߓ\z;ni_Hn~3\zy.`_ȥ?..(n&t|?^wk69uåW_}gt.ݼv/˥[dpJ>S.c57pYwyלrćS_B~y3̉w+7C _c~{X¥O қuᢍP`yλS0=4ȭ}kq˥/ rú|%N^%NgYyK\z?ҭ+yɥˡ.\z5+~pW.|K/.z%uʭ[ׄ'_Ӻ r\zå':Bɭ͝o .=\ rϑK/ǎAZɕ__Ua^759sdݗ-n;M7{n@k"_3¥^+\x/9ﺵG/+ə3ݓK2_3uS_)g&z߷58 zvr}.gN~\{z9rM 9s kF4qC|͉xsE+k._׿\:8ɥOutrU`*g\:ixrU.=9/t9E$^S}~9gҿrEۺ.}YG`Co}9åɥ Vr7t-gM=;N!8®/[:^#g΁޿W_\zUׇK'(҇zkWrQ@.y#\>Wg^:rGmϻ:6p#ϻ!Co_pSN~:K\:VrćKȡH.Nx:u.W1\:\~a}F:B]/M\*^gåw9k.Ƈ+_KK_Gf\:u.}ȡr!wb=x|=?uk&kSn~Ӄ5폺. 'O.=ߒiqɩCd;篩>I>\端.L*~!2+~_kv9tuqpp霷&ȍGf-p|ZݰٿK:x/~ɡ_'|a|>KQ_;5 \zU߼6'Ntrߛ1ҋukK&\eɥ[H.SgYҋ;5G.9vK\zҭ{,rraKor: _.}srUr?jUMOg>K^2hW؉K__ֱzЉw~C|Mt^K3_3~\:ҭrKb҉$Krޙy|6#0%WNfӏ|Zp_'}3)Kp&NYr{~\z}?}pIȥ?r םq҇07֭iK.͕.n=C/ɵ=.zɥ>x5\x9#‘ԏЮǾ,tK8y9>\zW\\eFN}sDf|C':t"rSKrևK_/qN9W/}|zպ襫*o'Ή\/Ϋ r%^zʥW/1ҧrSG6lԳL.]8'r9SG!t੗n]W/λn n .^zpuy9zKN9ɥ~}rUN?KSH._] ~/cGn.97$ǼK7\"\K.]ۇKg'˥9u9\:qG;g}~d\9"ݷyɥ߻=Gl#KrEnw]NÞ]w$Ao&7=[sʕ\zΧrA7aهq}+>Էə\{zU<ҋ.cSOn|X KeG'/"Տg _+v?i>^O 'q^oə|fp/_.=֎KG:"gNKN}Xꩫ!ι;/GXrAoS8^9lrrr\z~5.P.=99k;vt_K~*>K,}r9y^n)ҝr#္a}0lkpާyKU/=rVɋrbSg#{totarmt^EtNj\-|g^ĆK=&zɥ76qΘҋ6qqNFɥ^|1޿K?\#o6u_' s3M[ĉ}K\:q҉^!'w8_s?wә~}G?tiݗxҭ2̉s>u2 woW.<+o9tM^ƿAE\yr橽zw\z.G\\\yrA4O.8ÍgMf^W/]K'Ω9s[gm~SKKsKrr֑xxҧ;zw^*6G/ݼһsp鯾|v˩ '\zknKK7W.}:[N=ױ>It9Jt{å_# y%үKNrrYrr1rǽ\zS?%N|@Uƿ58?wp? g:&~ėK?ЯT9R1Cn)Ϭ[ڱp_y1{p̟pK.]$S?DO;tK/}zn-gԱ'jr9^ot\҇zEnȩ?GfҭC^-_8cg~utՏKW?N.5`KCx硗w7>ܴgzɝ'r..#z%&ns< S]=Õmj^\u^{=\z=>zʥ*,3*ʡ.~Dr)ʥ[Htp&^c|QN.=9G KOb^DSpgCUW/ntzv0/9s:yY:u"z8ryr嬣 xAѿ~裗8ρU\p$å_}ҭ&n]AtVȥ'9y/l0Vw}& ɥˡʥWO:χKoe'\N.˭.Nr9ɥ;_ɥxZʯӟʥ~x3xp鵪^t3.\zpR/ī.=g\zҭC!^^x^g]59s%>FіK'^''ni+Kr霏&>7t0\z3'}:x?ҭC.x\uҍ7>KO;\˥?zs ׈ȥ6\r篶3׿j_ɥV.] nO.ݺr]}yp\kg.^c,M|'99;/ɥG1tOtLkrw\=K&^r%yқg5XU/Xɥ˵\z\u^.=v߾sm37m38lrw5>5/n\:KS'$;pYH.ҧɥ'ǎ!Sξ4?\:u.ҶNɥiffS㱿:u/mq^9K\u^.>.KC/XלO;p#4s;GS ?\z)rʙ }}|r㽞Bt3^g;G=KorNf.$N&\;:B\-ގn3ЭMf6_SNjuK^:m&nXҝ?}?ҫ9}xқ:5Y7G.ݺr:O0_'n~oOKkM^?}kRW!5܇Krr=S// C^\s~5Љ_rȵzpsEN'I.]=\Cn.絩[ ]cl:}MΜpO\z9uI3\zUraѱ9zpuޣ.\cGr¥WV뫟>̓K}Ot^zׯ^z?pskʥ55=,81tާK䰓Kr Pr3spk&|_KoֱzQ.t9C[Jje>\rSߙ﫩zr^:7[x?һ|s;-n]p9tDKӅKܦ\zLǕK/׎}>\OQmkprU}״er驇>Skv޲cYKz+0K۾9HϗI.r'>z^z9u%y9t9~_ݍX*~pkvuꖢw^/\r7ppͺjN%>?/+Or9$O?oͧ^:_9rs\=\zupKW.]ғ+:hJ|:zSN:h.דOw{e9uI{K7>zC}KOstz=線|>S?3_3Gr W|Wk'_\zE#)_=k)Nf9bW/).3{ݺjp멗k7%yzCzNt>\zK\.80>#.tSz=y:å;һ/t^:ᩗ/Ao}wx9"?ttG?9GJ.]ng7CS^Y_?WE^XpWrsuK=G^\zUU.]n8g{^zp0r˭`{(>ləmy;ҧuS?.97o#}߼S/=3<\9fș7 n;ҭ czrpZ`O\r7:yrWXK%åg"^/9Gn\:uқ|99sm;'Oy=6Un}33bW }Q/sKrE3Ul`9\+J.]_.۽'9G|Щ^ww۩om7O'>&.ܹr#vo\z~:z]N=ҧ47˫ǟzp-9N\:NKw>Kå%&ιK|lȱ.ꥧ:Irpɥ9x✗q9sXwNsǞ\z+o߼}_tK/>כ\#8'sD/ɱ{߭׏^x9FM*W^zCÎ8`>o+L:å7qqNٿ½^z\:9o9jqΪ>իhS%rpd}'WN!qΪ\ܦzy榜ΚM^X7oK]=ҫ˥'W~GՓK?5?LpM.]KO=uoM^䅽z錟K2C܆\zM\:zԗzsə[S=ׯ^~sDsȫKWoU.]nA.SGsD8n)t+/~'ЭKk_ol8KBf>w3˥aGO.{b?\W>:S'lG?bə_1i>z8p5å'*.W3ަ6ß&NDrD/羬oyrqn\[KWO[2|.=FN/E\96p9~kW.]N.=ҫ%S?R.ʉL=MwKM|.=3oW.]Ld/E˥?GO9uKM.S'}9bpet2ϺٿR7aZg#?\zQ.qryp\#|˙_CgW ι`rP/]KsLϾ͋zr[D.ݺ)rr¥[1W/=m|&.nQ.^cW/cدI8v9ɥ~K_n7o9Et9dtK_'yrrr iy "br關9y5wM<:3r?^.&/"?p?T/}u_WK~O.ݺrU}Ftɥ;Cֿ/n䐓KOΜK?zg{=u_v0^?\uRҝݟ˥;ȥȥKҍ'K>\:i^zꝓ .= ʥ ^/z+@.uo9P:Or驷zS&\ɥȥCqyu6s &qL..c.}InkC"tK/>\\uZ^otXқwӿAwϻn9r_'nMt r~^.}91kt8ʥ7KG}8‡a|MҖҋW˥꣣\rKor>2>ȵ{%~^]}}\-wrEn9sz_rֱCgz˭{~KsKw.n t/뫗^"<"Nåf!Lb,N\zor䟤^:-r૗Щ5t𧻓Nܿ>؜W>?.=z76$?KGo)ҋaҋ$rROJu߾R9A.!>;SG~rzѻ|MϛKҍ¥g[tШ}_rK;kһv3>yӿ|). ^ҳ|f{?8ҭ%zyə/c}^)?r59뷕:B].=g+\ΗK\חKKwɩkuys8x5=K竗~ˡE>ҫܺ\9\z_뛯)uk{9vt6ay<ut[\zf>C}esDs_ɥ].}M ~_?K7L.=0SW.\zp?WU'y~N> %y=:B.xEr)ʥON:5K.}kȥ?{g楽rݿU S.=W/ϫ#uKé.-}Cɡ^?"^\4r鵾.=W/hkrWoȥ7WsɥO??KM#n|Xc\:]ɥ/#_|C/=Rt9Z;Kpr^:6H.|?w^|ͨ^uo׼+v'_].ؓKy^:׿6uu&N.^rʥ!ʥO,~M.ݺ2N +.}^:3s<ʩ\zw|,n] I.i9ؙn?O/|'N[n/-ʥ[B>-\kʩ[w3wpSμ>\T~ߗ:B_.K.|Ko=~)t$ntK~_3 Λ|ҋug_n>Ko?QY;q3_I"E7ìc7: H>9s0|Xiu\rwG'_ZgaY'2دʥ^M.|&N[>Ǜ\z^.cC Ω[M.{~tg0 loτ[Ƈw7'_׫uɕ_!~yM۩RlǿRw._:\zpr$>G/\z4ux~oꥷKϺpz'\d-g^|'KK3Kғ[/y=רn]o*/n# .O.}ʽkr7U9u+zWu_] S˩_H<&Ko׼?\zUYֺ˽>M׿_Ͽ~ ~=C  O}ɹ׶swאkF ;u97װ~ajr;n>87}zr׿{ʽ׹۫\ wېS9_r{ ]@-·}cwtU{DV_O!^sq= Oywts__r-D7'^ʶ;n\sooX?<~>b|-ܟ/rw\}ߏ9Op;n_s٩cn+ձk{G.~E`supx >㱾x7[W~M6刺vtgr{>s>w=u|sss߿#8=kGp~`;W-~c> x!>>[{3=?? w}pݱ淃se\㦵9_ߟsx_/gwt].Y]ÿ/uUsuE.xr-^M_z=T% ν6 ~պ#G}|u4s٩,vpoXWؗ&K1 ~yp{q|Vg__7 \Ϭ|W=V,8MznX 7¿r 7;_8;c>s{m+3Fc~W_[g~}o'o>t?r'}|6_y`)_w>G^\pKps~/_k =׃p[GOz 7qZ ν5U48}?rWߨ c<_rXrsO굯\Ǯ1 r#E}1ɭ]̼s^Ӯ1ѿS:@._z~ߥ-rOx?kg g||˾¿G_k1 x\~?#+8+_Sr%羟o=/4uk7 8pٿ/8sO o'@e<} c˽k osKŮ;¿~EFO}rX~;ÿV9Sp;"zSn:8{> }s߿w瓃s@9Frÿ@龾ao*}_ 2p+_Rsa< x_"!hr7 ru԰"|ɵy. 1#[{Ew1~sr+j^kp{>{3c>So+8Fwh8=_l1竊EϻȽop-{Upx};axd$8W.8/U3rYE݀Cv< ~yoor=粝}^_LN:8?rհpڗ^sȹϿίϪռ{Ky\Ͽs( xƿv9v-Wp5+p{+;o7.XEp{>;8ùc ppb&io1c! }߯}nùo>gψwU9uggrW?e|e<}.pWgUr_o9yl89}? Ņ~* _+ߜN;x+ua/Tw_!8w^;W܃]Ono_[W9[p \vZX/g˩?_OsrO!?;!m6!lI'y}_7v?\Nh7&w˽Op]8=w3> s?ExsߟLN(8k>89¹_>}~|+ _:ƿ¿}g'6|8r-Ð}Mxx.Bp}{o{ƋJpyof|t ܷ+lp{>'?#]p;yp_8sg;W }l __ks5gėпc>[_sG3*~+1cgڽ^rwOg{m2c۟{U_~opo7}p{#=3 oL5o$_|<'ƣIxX3ɵs|I87~&: Sޟ'O_\+Iz:g&gk[Ю[UN~*kpo|e_wλ3_85{ˎ|n3=K"_3L׬rk^ӿ=Oqa?ϛ p |MD? ׷羟nUl6W|k׍=}-~~c|Į,lλٕUnaI^8>ulI6[n’kǿIࢋM|v5> םOn/58~!9v_6C=s3=ܷ?>?Ά]M]kʡ 8ù=#{}?_9x {ݯ?sx%{w23Wp ^b~G=~}s9|Mq~p9ùg>_??|u8mOWsQ8\¹q~8'}k\I\;S)~=y8\Og|}WsgzP~=kW:{?O|8k'_˵3=r#z+I<%8=ٿmGfss8_yC?qz8?|z39uҿlǿ/^'n[ۉÅI]L8os|g8>>8؋{דs~6a;W>?¿ZǤy~|M8Oakf+%~a{ùg<}6$bwhk6$rg1'_I888/s-o8?j5IOrù1{#p{ȱ?ݛM17^~z+_'/ Kcå?ѯɥu9;:?"nw˝Qkɩͅ~^8e;y3;!OD.WaCܼ]y0tɥEwt9Jt/n+t/m.=կ/'ΙuK'tyҋ.]rtҍk$>$t90t9 ^9իK%.%>̉sN#鹢\z΃\zU.V?=✝?N.S,^vrvms y_.=9q✷3q|/'Ι5qp}zGO.}h' .g(RoݼÆNy <ҭ N^kr鏿oS̉s.|#˭#$wp:1?$^sD܇ɡ7qNIK/~8u_r .}\z'o0tKK\Ძy:å<қuB҉'>է8ɥWƷ\z39YE.}s~>0t93Yԉ+/Oȥ׷n.Fe;q_.] Ø/3O.]R.ݺ1pm8ޖ59tl^垉sr\zr9KW.,]'~˩Otr>O/+\7\z\T͝{=O.}`[c/89Tҋp7?yɥz#pɹʥO}җ#9\:p'>'/"ۺ3/lܺ:qμ~F$~ۏ8g?8vցK^yr8!_3Ι:uȱr}'rLκ\znROgow'[?^ErM8rya~npYw8gSƿL.ݺ"rS{+;ҭ { .~Nz9um>\u\8gmZdrwuS'i\z'/mp9+29உs \\qywɥ7~e=seLrW9CKCgNw?\u{;1tɥo 폌sppu6Rn=~!_.}}t_.k3\6\z٨rsh'YcKYɥKoQɥw#գK\9qrpsy✑GO.f|ɥ'\z}ʥS;tGt5K7/\.=s.>\,/>?\\PZW }s>rr\zOr;_R~y¥76טSW-_Wrkr˥OчN=YW-ڇx+cK\ylɥ88m_Xrb;YpryKˑK˥7mλb}$BrMK #>"\\\zCN.=G.]NL..國uO.=柗K_^3Hrݿ\zCKgK3'l,r.I=uS7\zn]|ݽ֞|>J2;1 X t^qߣ吝`-=۳b5] kƥwxutϟե7 LKo. \vO}9]vq9tUw~}rt/ׯş|6>..}ҡN5os|qxǟ.>Pt߯s$?/]:j_5y8[Kϼf_p5.fqoK: gCg`/xkҥ/߯i<.=럜_u5UϬg?[<<ӥԓ~.OǙ;~Wv KwVv~M3]sǥ;?ݟ.8}_ݜzt:H]}\tcK|y\ǥ{Bޖ/..n}st]zn{}9]z:ӡίE]}tW+ǺtWҭI;ĥe_uK_]vӇ`Y.=~O]zμ~nҙdy/:q8us>N]=]zOt鏿?spQߺ|U%]Ǐ..}갳^k'Yv;^uz~el!0yþ҇n;5}}>Wi8ҭ/LKқ}u9¥fL߷'5c.=tӥ.ǿ]Μ]߳]z_f~3?.tک,:l5'-uk_O.=v3¥w׺t ug\zW'oؾ1ksu|עC'w LS~ǥ.8ftׯ8׌]zx;MO= :>>rOa^X>x׻ [+cl髖Ǒ}ه8~`^Ǒ_Lt:I]c\a3stk>s\:.XOuO;3Efzԥ7yÓ.}"uaz˾Kw}.nj5o]w7ן.=\.|R]TpO0z=.=.=]c.Zӡ$`qқ~9ncҥq56~KwKSgPיs@uӥ?ҥgBn9Bُ;׳I NIեwk\yt$Y8]:;gz|=_1Kºt.={_}vq|u7\֏Kz1]Mux֥gt?Ǿ/0ubkK7Z>=ҥj>̻r36O.qs8[zcwWӥ״6]z5_|k&;59$yɺtr ҥ;g~-:vט/K]z|^3Df|KW/כ8r\n[]zҫڸ~ӥ?;>kf^c._.Y^^ҽ(#u1}Kw]֝gCnzMzxY5sNpѥ{=Kw~Ƹ]5.}{avkR.=ZgP9]z]۝!pK:p}5u7ʩ׼|?ҥӇ`s0|_u9.å'^O.}-y=+Dkv3LNtKKKWcK%]z.tQ¥ҥ{ץ/_O1w72G֝1}3q~.=:Mg@n]z7xҥ>~.%.}o}Ywu+O~:,ܠ.שKys.Nc[}NuL .yYy=K/gϼu\=;/=u|uyݹωSf3oՙKw_7u?ۥ?:zIcť[ե 9D>ߗ.=>yۥ떯KonNR]}|>.Wq|җ}2/=}NGy"˿K: Ko q>ҥy8}ԥg}X;.{G{]]YK??ؗqamt\>}!t~u:.ȳ&=9q8gsv:.=/tKyҽK~o^O0q"?:5vқuŘ}ԥ]zt|\z>g]ۙ{f0u^>åw,tҝ31þ|\zs_ϺһvMw9];Os+/[;]zեW^]z/9k>.=jo>o\יף$]:{u>?f>y3_X нXuե#ϼsӥO]nҩ=һO7.ݾK鿙[SO}ĩ+|緜_|Ko` ]:;ɗ' }N.uҽ8\dL?t3G_ǺUn>Xttꞎ۱:;3ǾSߓy鼞:v^S7/t9_Cpt9y+t\uC'_åW 'I>S7u%[gz\}tz̩{oC_ǾjK>tQ.Yg7ϵwH^4:]usWsf>[K's>;QwK}qmu;ӥWrsj>w拎tUlj]>һysZҗq_l0ұW-{+/YNMu:][ۥGv>gqrL>n]vqnN_\z1O}NbpHnϕC~UKn~yȌFw߼s>:uo6G}eޜ>Ҏ|]NAn.]ׯK7Bts1]/ӥ9}_p˹?.ݺҋc`q񙗞NpL:Sgnu1.ҩS1y[7`Kax1}#/=ݹmtO?]/cGtq}ҥ>bSwX|>u|~;1u۾:v<:tIӝ^Sq13O KyһnQgs~ӥKΩ~t-v=޿|.}nna<>2o2.g]uztϿG>usǥ83̾/>ҝ_֥ts:tut>'Xߓ.;c\ϣLǷ.}QKoy1?ӥ?:;\c\>`ҝtu0/ݾ'^+եK7Lӥg^|.qcs.}Bygd.=ݒy 5/lN]ҙGtOt^o߯~s>֥߾ks+ut݂.o>OGK//~}\N}y&|8q:f?~[wd^߼tuK'b]n.sKN.]}Ctaһιԩ~Y7֥_ۥ_>~}5.|KglŸuK_Ϻt陿>\ U;u8K'=|p:6\>.}1Ù~}]z7>.7.~ӥE^zчK֭ҽ?.=eȘq鿧݌p]ۥ?:_җnp9.κ?]bҝtC]\n.)WסS_ѥƥ}8tñ}_Uo^Lk<X_qٙ|.}ʯ|r:]M^u<1/݇K2K/%{.q8Μ5gtoIUN]N̗|0v~u<1'!_v:f?nﳏ.\z-.]p8j=Iot+֥{֥^֥ۇLK/.=W^o7oqǝ.uЩ;t-\X^upLC'p9g^:;ykts>u絝KO.. {1ut]nu.x]Ǘ.>Gn9sgCw^ҩ*_t?t¥[g.]ǨK.ޫq1ug;tׯ>nk3/qץ{˟4IsKf^gۥg:}_Kwg^yǿgX]/C~.'?]];}6:w߿]?/W>e>5|ե{?ü߃KwONAá3?\zi7Uǝ.}\uUs_]z[_oܟӥ^^3Kt8^Ok~.p~e_KYGfUХ;3/<5ө3]ǘzqΏOk];k棻?<֯tKߗy̭ 0f~ea]y1f:uj[COOoze?{o...o]z|>}՚nzK%g^z/Wkf>:}6S[G^rW:^OǮ֓o^u1GX>9Byof\G^C/~.}ln^bʯx3}<q?ץKtt\ۨK?]ҽҧcl<:t֯^]y1x{pB\u~\ XuW9:n|<$q{KOpә[9~cſyUN+nڷt˱^M^wsK13:ks5o\u[եw]|7k~?I5\S~yҗ3 һɗO^tݎzt75/]7K߼vkǥ_tøtqK^tg~Mt;GHu}7.tJt}]>͓O|^u>Οzͩv'֥p㨻Kxѥ?GfY[oqr}$yU9KK9]3/ѩ3Ghfg.<[]zzMkuAkb߆7OS~>8KE!oqC|{>+:yQ˼t].>}3G(Kv\O~mt%spMI99Bm!.܆å?:trmҫ.gΘ}YoJ#a]5nߎ.@u߸~ҹ?K;1t;һ}#p];+'y`][>}2G!ǥϮKϼltc~Хwpy;֧utzCCT糮c^3lsWȩ״..pDZSyЙ_c>¥ݏطKסS?]/ϯXv]M߾¸G?쫆{'/Kst9}tCtڷ8>tץׇ>M3.OO{tХ{1Ez_tO_5]9ҋzϥ?a~?r\{]p OutuS]t҇`1yVMKL.~$~گѩ:K/:z9?7g0uq|ҥ?p{w#f8:p|`8ǥn\:u4oեq߼[ťoKwp8G77u錏K>WYqs|˺æS7)\sO5KKuU'q;9 yDq>l~;&;ɭ[~ӯ9>Koy>Sw3f+n>ofN7牡+f: xԩ{>.]үӥ[g?r_3}tיkIy鎙'p҇n}$]O~}8ۥwag#}Nޯ1K_۩x?hucaKב.ǩ˾?LWN]?}uX;]n$]4}ι:0ëuH]fЩs1];k39o]9y8wՅ3/]שKx5/1}8KϼuoK֥S.zc.}tcK:Kx8~w.=ٗNv|>uXӡqK:R/0 Zn8G>Osⴋ+s::֡Ν|8s}\z1}3t:|KgQ/?oaۥYeҋZ3f:uԝ77o]tC73.q~x>:C]z_ۥaSw:,ۥu:r`q>Vq;ӥҥ_nxqA1/y'K.aY3~Х;ϼt竕7y}ydf}]z9pQNv˼qsvNg8c\3KowΜGN]ϙy.p>Cg~ŹK.}l.}z|O._Rh<9\y"sK;]:ҫ/kvgǥ['s>t>qu;uYҭ4/ts6u7ҧnq_W1uMw\>s1qtE_sǥwky陯>'ytͼ]z擳|y:W\zoەqױuyһy!n .wK?=Dq}1_vzW:8z9/Ptg`7o:tC]utO]kKg?*]4wߌ}ΦSg?.t~^{;+懢Sg3zv^zsL6T]z3O;o>:s3Vݺu1鿉fSoN߬әs\7/]KGtKKt}wG~nyNqSg~|{;ls֯t:;]: ԩ[٠r~m>nߗpSNΥS|F^m\8amq_Y⨫׻]ltwoCKY'K.|D]ǺtGK_qsq<~å#0_ܼXgcg׫G^EKѥKWut?;/q/:֡SuhSg\zM{eacc\ҥgD>t޷]:vKǕK]DRn.K]:ҥ}m^u̯pKw}Kw}KnKu_/:p;/S~uau@ B:NN'Kն~\ѝ\N!߰OB8.=:n.ɛ?}:x}u|K=?v_ХFpMK.]KO|?\yܣ+wfqN26IǾ‘tuøv\e^v1_֭sKoK?.K]^5]9u7s8}"u̯қOϾjcǥ';]ݝNݺu\zt_n~YKϼiȸեuyO7I]؏?S}~ǥ'N~.I]z≯t陇ޏ:']zaC'|w<ֵ];}x=+'ϕo?oO^z W>i}S|?ty^.cK:6|tpdۇ˼tB~.W~\ѕ1KN7]}qݾJtһ.$ίtOtb^:uˠK׭oyͺ~:N:}_n}D+ycvq?\z7tNj.d]K>O~wz8}_ǥKg<:Oo)xy\י.>}tYӥOx|ҥߎ'i<ǥK][K_]ϧ\z|kN9S?掼v̯UnǥϝJvKқgץw%Ͻy+9_եu&:i^ϺtׇWbԕ_LSُ֥.\zťwꠏG>T~.mÉ?ίqKpѕNJ<Z:t kzԥW.2.=/צSpKǁsҥ{}KO8/_OpL}_b~.}~\KwZzn3v탱җΜ/CgN\su9 n;]:ok}t֥Wpcҝ?\u̯MNߗ]z qQ=ҋOӥ7Ǻ99+ƭcoi棛CGqQ-ҋg^:y%]#t̯8 ]C W\܏{|>ُKW~}ҥuһ?̿\/[^}||WӅ빲^8ԥ4 ǣK7?oʩ\KtLpӜtz1WLꘜGWzd΁nzYӝswùYk3|j9ᠶKO>s}gН#D^m_K3/.zH]#/}Ω5gҩ!p]Mw^c3?]zn]#k^t:<]zϟᾖ3GptӼ'1KnN}y8ߕ.}8zGwh>YK~Btӥ͟'ѭ~m:ulw sQ9תc7/}1е〻>Wt[zDZy>+Qy+K_z\h:tI}ҥЩ'>QCw g{^tm硗~4/1;s)ydP|?w^ҡӇ߽nYNp+Mzcr}\?{\;K7Dn߽KO}tgy>.:]K<f5_;/=ﳏ./wҟ?\zѡ~R&G"];G^:n~9SI}Q˼tͳ^s~\YKϿff:v\:ǥoKsz~Z^sYO Kԥߺt3o}W ǟ.=2o?׏K2/=/4>>q:sߙ>uN}tۤKw.Y>:K)]zgtrxҥ7@nv1u^Ol^t-?ǥK^tg^덝~.O]z1h#4u5zGe<^֩9ޟt陟N=IutGO~_gߎ~~oHwo?w??_G ^q?vԹQ;{Y~Mhi7~peqC/MK75{yùν#_y7n|K zpg :!7}wv8ߘW~S i+wy e\۵ߘv82} }2ӡ`{M[?!xM~=[~w:*[g1_{=NϻoùZ¹oo{nW^Խg_{}so?k?{8q{-t=޿x;^W|o?:_Ɇs/|pM+:6r\G{p-s}~}|w}\~ νw>'{>{}9~g~z>!{>msŸt<9^N{>νU; \8?[?W|_Ésp17ԯ+mэ8sq~ ^F:w=L-/>'Wskͯ>@3~^GYщ_1Not#޿+}J_}sӹx+ӵטͯ}|_b~5/8{~խ?k1Ͻ: ;;c÷_ƹ];kսr|˸Wq<:s3_=^4| w~u~ }җ~>Rxc> ^F/U=}ϷW~g̾;oq{K\s_d\^F3Y37}ߟp0~:v~3N]+>p ^/{<:|>ӱym^9=wϘ[2?_}7z#p<}{p 羿o/{squϢSz,;[|?4c~^/O̯ {|W=g?b|ͫ_1^+gϊu3C8xӽט/ߌsb%⿯_^[\oׯ85\D8ҭ?7ֳNj~W8燫~Az7_c~;t_uss/6hx82=G`ù0,{>:~_o?b3 ?*W2DZ糇s/pyùqs>yb~Asq+?|f^L8!t¹/p;ʸ|#|Vt{3];=xN"{^o)s9{:{j|cwtK,ҹ)ߌgx?G-Nùsw+|FռpzGp|7pϛ;{>G;pysחq9|Vtz'Ƨs߿ùǿg{~{܏߱5·s^/{GpFztysú;g|w~ս|qѱ>ߌ[䓷_N~u`_]>8t̯#WùùVK8w~c7O`sO8/Ĺk?U]>{'b:˰|fd8zL?Wqe=cz~tϺn.'{:pN>cu׵p=Oǥ{#6Kؙ_8P8z ^_p/{}g8?~ѾVb.~\=׫8߿qqC^c\u5]tr~8Y}t#Gx+W`wK^{tmc 9G¹z ~.ƍ%{><;Kg\\/ :} kpù?_cZt5G蹾ǹq~}=>byuZ>yùaec2w {> <|>Wew)[S?Ooskj1ņ1+[v㼟sϟqKԭ_}|>֛KܖK羏p#.^s/> usM^~~|>b{=g~]s7u~n=OϟoX_sqYc:1~s7qts3ߟ? py?x8w?@)s|d>W|+7w~WӽXo>ֵs>[8wg[8sz^ōG};z$Ÿ?_>:sq=t97:E\črc:Ky8u8wҹ>[b={8w4? ϧK? ^,ƅ]{1>=W_$8p5v̯Y:x_z1fұw cuùŸt_[b+5'5ɯz͑N>5G:~}_qGOǿuڷ1xqc֯{^=xt>{pyG;p{Pi.-_9_szG'5<g?Xኣ^3rz'qwzMs/#׬Ox񅛦^6;5~>z!>8z<]sgXu׬'p{=}/Wke8}>[5];E>pkV?ǣ¹pP3ùg{pz=¹gݯs\c?}_sOY/^3+zM [_s?q?k8'ĹsxPk'^<^g{q~uk:~t_sz:tOL]:p5WsyŘv8¹y]߿ǹE_5K~=O8s=oxp~Wk6z=w.a^/=gqǿG&;8/qex.5?~=C8MfF~'=}ϳw=]pYs=לqP~~w|­gީ[n^ӼpŹg} =?ſ\^Q{cq~w]_=}~k櫳~w;Ï7>\Dȼi0} |{0c~:z5} _u7ݾQ|sM~s8ù?~?>/Wפ=q]p_u5G |p5yYY|Yxֱ3޺wƘ5KQu#޿g?n}_?spz#45s8:8}}=ةo"<5{טo¹Øzp ;"ڮԱ3=o]sO?s?^kzQI]o#oqK4] .}o \4~|Q'89ҳ>åk|>p/ts]z:\j]ĭ[3[wu Μ}N q9}=O7Х3ӥ]ptXҥ߾3]q扥S:J]׾xOKàK7S:e]tsr.o>>K%tt\K:tg.ѩ/}ήեcsY>o>"y|"bܭNQwS:"]ycXwXu ‘ҭ9\zו3Op|KnBޗ?.ub};$}Ko:uܧNN.=ԥ.6|ƥ7os/`ͭ3b]c8..1t:}tpqy|ҭץPY~ϙG>b8Z]e=2}쮛u KOut]zϟԥڹ+.}Fם+>R'[_:taSwKY~o:l|\7 9g~Kg|>ggӾW _Y;g~%<9K.]5xrrL\t+ңuQW/Yw|NߏjqK>}t\һ}tt]:u鿿b\҇Ow~%<]zӡ>tsr\}θХdtG8\z[{1fuT9.g?o.w>'.p8:,7ag}.}zK\H.qW9n}Z]z_K.>f>wkgsBvs>'u`K|$uc;uu:^/ cW><]z_Kusz~ץ_۵sfʩ?w]z|Ks}qͼǾjg3l۩~ՕԥۗKx<9쳁_Μ}طt׋қn}NvQq>S'KKҥK7_L~sv}D9uW:]Qu?uMϩsѥ3.<眗y>.=tο{q髖NkeL/9OsåХեs_/]uWsFݖ.1O~Z{ѥgK%`>2FwKә~v\zqL]ĥCǙD].:6]z|vtoǥ*]:xtӥ?۱Svǥq/tK|)gR7Kؙ_q:G>'993:\s~đwWq.}\~>1 qy.q\uۥ7KYׯ[ҡ[q\~n1?ֹo3u̯_ҧWn..#."]0_En^.]WK)҇vt;҇s\.}߮?ǥftyF].׍K:k\yRt]-.K7_PkѥqYKϺa]O^|}KzIХwG\/.}__qԗxqǥ>nv]VǜϪ?OҭťoХg]?.=?].]gK7Z~T=:s 8}t̯7g9]z) i]znqׯu:tLCLC7% ͧ}"<..}tvqYK>pӥOϺ.=ݪ.>:tot<>q&Cm]zol[꘾/l\zba:tߥKSKסo]va~.ݾ ZS|:zVn^.@\z[_9.}KϾ tt.ݺM]tݾ[NåW~>sK7zqOto9}tt#$,}qn]MNǟSKSw>pL>u߷_n:؇1s\?3x5֭xw\͘>V1u:8u13o\tӥ۷at}|vgq]7.}۳`NGKU̯ǥgK:z1qaߗ+ZםNtXq2~< nmWک'3Otԓҧr?.?t2ӥ{LM\z'F'.};￞.=]..=.=Ϸ$KWnߗɸُ[:uIѩsҙ_f̯8Ϲ?KpֵҽK.='KOgKw~ѥEH7iߗt>ɘ;.p帹Seqzұ~.}t_\uº\ҭեDqy}KJ7ş~.}ҙ~Et8k?t҇Ntsi\v 7̫}9nYOμ}1[~0.=83<\z~p֥G_2|x<ҷ \|CK}åwҽѥK:I]}op=.=g\zQ\z~uo{qyKn]ttu_[gҽ¥T~]9X-Kg^g\^:sᦫ}_pkz}KI~Oޜ_#qycC?Q'rgztWNtzts?H{]7\ҧIt{\z¥OίcҭN|dСNJ|9:t0L,/ts=K__^19B|>gR?.o[y3XT}zM\v5zйؙ_oԝ^xtOy޸['ݲ&}t?Gҽ?]:NzM3֓tUsl_Ky5t~VNqs0.5?.~|2^8ҧ}3qzxRxQ|I~<\z+spYuN~op]q9 y3GG5;c\zӡ_uT\4e+^S][^+.LwnŘp7̟7CvC?OR>i_SJn.|V]9:qptݝ.]wK//ʜ93>:sg~~t}]9}_N>9vx2?wfc8]:o5g֥rGg^x*c4.<5Μp;oίß_1_K}}kBnzͦzͥ+gz.}tv|9^tlaLP/t?ׯKϣ.}uþ7ץ.ޗ$˱*s?psKםnNn.mHq))Y! GKv:}K~`l_p}=|ߕn}#t7=e1_3k׼t^K֓3ť[.tҧ} ptmS?uї.]}gtڋ}6.fȏK:~mj^z˾/q틠K/yХЩoIgq5xYW\o.}\:^sq֥>ҥfP\?sƥ֥.g.Ofnz͢S_}_.Gf/tߺtҷAN7]ߓKO^2fld}D->gA]W[㔫>gstH~>'<99gJgN\ѡSwKω>/.]wKwKt8uoKϣ GԳfY.<'uút.:t|$:/9.`CN~7qa:.3^׾M[ԥwy鍱.1ә0xǥCuҧ.[S:]uF/R޶SVy 9uҿyKtiKǍKߟWs6;xfا˼>:|[Nk:t"t5q},/]nѥOb<}եWn.}oKϼ3wt..=ÿ7ӥ:st.ˁKw^KһΜ:qfuw9:?Xҗ|XwK+O:u1u|><;gȷK}>밮SuCty]K|+|`qܗy8Knb܎`o^:ӥs߮þ.5]y/7N8dM0{ss.=׏ϼ:;ǥO]3yGެIw=7Lps^:t^ly#.}Ltju]w>Xkra|>ҭKOK/>;]|'׏K?gsXyv9u|3w^s a^[_J>3s>gtS.=_:;׋10^OsNh=us/rqpԹKnD%qݜ/y7#țufߗt鸙K.å>';_ӥWy;Nt3KY?.=_>b}}ttRt^ߣocNQZ}{s WSwH>K3.]nkgLߗ3g+?.: ]uHaKfͨ3Х7qžjQa^z36:NC~_s:u>~1.r<>/vGם.w\:v`}8]} t陟K7̼tKϾsKnڼtmӥtc99:]Wt ..ƥ[K\zeltһyfsy}O8ppK9]ǠH_sf>ľ'}N̝W#>;o]9WޛLEnac}QKoU҇yۥ4/}mǎKu:tugץ{KߴNg9 } p n] .wqsUwNk鷝y:Kv.ݏkD\zμt\2.:h\zpK7_P^uuKwN]Щτ;Ƭ_ǥ['KIμ~O^;Ϻa]n_Ƙɏ(޼̃ǥ7sҋ{<⨻nq֯cݎן.=q֥gK|sg?.=]. uw%ҽKKo>?{=K?g_y8۱O;4/^ྯ;txKg.q}K''/]Kϼ+uaË}ctb~֥]sZo3/ԩ_oUñ7̏Ks7qӥ;A~.pu]z˼CЩ>e<t~¥KKZf~FϺt/?tc0g~:k;/w7_-cCqռ5ҽ>yQWK7}˱W;y8Na<^rq?Ϲ:oT%:ާK8w^}t3ӥ.ݲЩL>.:O_GD楷=e:#{d:?w;.kt: LW\c\:t>C1]zُܾ]UK/\z~t:>|7ҏqsM-upۥ_:tg:upۥw}!O:K|pҧy?汧K>N>o_qEN}u:qn_\z:]_t݃.]z_I|?KqK<]Kϼt~|Kx lKZ]./ͷztUgl_72/=O<^q>#ťtһy>1ҹyi9qa4.]7y麟yg^z>\0_S{d^бSNútrKץͿťk;sXe~:$8i^2~ٷ4\vϧ8y8]gnkelKwcKm;Ǚ<>>`.tU6:}p׸tKg?]>Ktsq.tKwLn+_5/}.}89]nKA^zٓyҺteuG>:n.{=:Xȧu8zCOd̗t/pz]܏եqϧ>tlt9e_p/0>3ytqP9]zGl7.?:}g&>yևKop<[J|k>Nߗ3:楛Wd&okzͼKo:לoqŘ>|tҥY.~dOȢ3'֡3>2o#K2/S~.}ryUw~~HtOKK_>N=IuqB.֝Gf+5ɷNuG>8Kw>y~XYs/'۷T.럕Wk^}Wqty陏N= n;sc wҥle'|嘾j!ίɫ<\z\[[N3f:u?cIxS9Bӟ_?{>.|5^39B__.K?K>085:.'^0f~=gҩ#tίV:sXᶫ]Nߗ n=v{!yH^q/K'<]x}8spp}t׸Za3It8W>5'ɼt.}?KǫK_:aeSKtԥ Kݺswuo}bLf$za8$tnjGwp|tE_]/̏K7wt֛שSs_KYI_#G{U|zΙ_9ȼz[תC`ҩ7ѥof:}_G4dǥ{$]S_]tǥKɼtr3/ӗt^9^uk;yoۥW]99Bjk-SmzM=ґ^t}yyטC'G^]/9Bq>ĥGj_q҇3^v׮#^u|kk~y-åg9}ҭ[0kg k;urp_ONK.םN_ҩӇy|3^u_^7sn:b>¥\~mN=Iթ stn^._uL߯Kg$]|K> mVt©W=DqǠeSg\z.}??snn}.K~oW_ӥ䥯?]zab8&\`ɼteK<c$]TN}Φ#z1ߺÕy/o޺ua1QW.t9oy WmSbLx楓>'.GS}瓇Μɧ.}.uPtVK7UoX']}Bty<>NáS_GDt>v|?.pG^zqtǥ} 7\yӥ.e>gۥ:¥[K.+ҩ3ե{BvE46;u:88gvG\>N>xt>a?50]z\ާKo_>b?\zt/<.=]usKƥйoCMM:1ťO3/}N'o9c7o3Cξo\:yߙο҇N:j:>_.餳f3.801'9zV^w:yq~եӏ/]Ko_\z\tݫ.}y7/t 3/ݾ4W]~ҝu󛗞K]zq9;KzKå_vIqz3|]>ʥ{_-]:n!]:.YKo䅧Ko:_xNz>bӡs2_Kw_%]:u n ]:қ.[wHzw_ _tGeVa#=9μ}˼n_tt.#/|s[?o^Μ9t3K/|uw9:t|Ko?>Vq_q' q޷N7w;f~%;ovp޹ω[.Y['ҭ3/aWע;N'bS] o:Nyǩy>.]wq>ԝ32K|z]z1[utþ/w:b\80\| ĥlߏtşy=}xӷ*ҭԥ[7Kw?K'O=}ӥA.}[QcHv97]ٯ?]z潧Ku;/:]}2/=Wӥs]z̯g_N쫖.}1_^v[K.:6̯ҧ^5.ujwN'Gwtpݾ/QwK?ѱ[oXGlKvS3uq2/}W |KSҭS5/]]q#~\N\./K{uűys1qe^z:˾/˼S2o`^ӷkӱϯOpq&NQ7tѿK|Kw}.]b^N`祓ts99]zS^yy3 틂KA?r}D^p~:CKϺ}\z:g\9^]z_SyùM_KOLJKO]:yܗ}6pǗku8.q҇tK[/]r1['^̛:3?"u?tҥ[Kvqԥg^w>uCgN]D߲.0ƥ~GTG8xۼ.}^y8q&N!ǰOoN#/?s%~^NT];Nqt?~ye^zpKhy\:sgtϷ3vp3N瓗.Μxt鮟Kkч#us:㬋}>.=].=?uSsTn]/mYCqa\5.֥m^zί3.y8 :u{UwK_K]Ett]yKy}|]:Kk8f~ t7.tҥot}_pθå|Kw/]:8tb+㙗>N?.b]zO_.>߾jxt3/8.nt鹟8v^zal}bl=wvCy鏯ttt~_8l\z:\O^ut?ӕ;NƸ}|׿K?7<c3/y鷯.yKХGVyvNgNAӭ[O2yN_cY9,KqKvԓĿ]z2Lp_cỴzym~zMuS3_8⪋_3?zx<5G,K'/>]:n}ׯ#O~3/;f!_]>^S>>%t].v䯧Ko:t|dfǺtuҭCץ[yԥS_K]zϧ$k^7p]z:tyu˜eksl㺹1qtMwKo:޾ϟxK]'btҩ/ĥ-.=כt楻>1/~o\Oʮ+S70I"ځLpf'Ɓہ_NH %{^j(2o=?[G7WNޭK \zK_n]]Ÿq/}Yv9Y:u_C@u`K<}"NOK2>ϯX?<R.L:}pԙo_O> ³_zՙ.=.å7^Μ8?Gtÿ/]:n|g#;_1£3o||MkӥOm]p_KQ9(gx5~c]q鬇ҥOyq&>s>q>N|ӡ^(:t?:t.OyJnh]N{K:v wqץssեf.]7K~W{p͙Yu>tǥKo:tIn_Otl>M!vq}үO.|5?'i/ԩ$o~Kt%<ԝ#.It^K_8./M>7]듣_zwL[3cKtzk.p٠_|k_:`..醳УSgGWvǥ['EDCեԩѥK禇h'$tqK]/|KҧgZtOn_]tEGQ~հ_:}ҥKK?׸t>BUgNtcINu,tȧ1/:ҭK7$gw\g&|t˾hK.x.}.lNݗw~W|ۥktϧ.<5 鋒.=7aѩѱ[1^#d](\NӹG/ݺ1tv1?;xwS?o_G?7Z˿__w;йtuv7s_^t\ׇ ^&ù^-{UMmstu8߸3 ^Dz_7n8~xqez?'M?wk87MkU.%{p}յco#^_^^لs}^Mb';X77S' ];x/zu8.׊Щ3ù7c?W|uq?7n;28:/3pT7tz-T8|L=7|/u޸_ތ~39V7n{?E^U]U8~~Vte߇pߧpx1~{~oܴN~8>q._po=_q[ѽ1?,On<Х8_ xo{ 'b0^1N^&kGĻk8pupS_qz|8K߸_qÍ v_:*q3]b|3?8~|U=c/qb~Es_u¹Q7${mcg}_~w]c~zk4oL~u%oί} ?px|s'[~w݌k>sW{?Wqot¹?r3νM#o<^Ϻ'?co;^t̯o돺=WeWuܮ}z5Οׯ3؄s/=G>w~{\oϯ3^qNG~z\q?Z.;kѱ_-1V]vm|{-ùY>/k<s3*]+/~-۳'87?ޏ:{o]ùח_٧Ǯk:#7z}߱^5sgo~]~_¹} y{]Ysx;{]k<4sKq?~+uFXڿ'ֵ?qKߊx~:ףyO|t{ p4s=7~t#W?~f݇pO8zaLνFXoot#x?+֯p_ƹzx>uU}¹s} Lgggy8} ~u=8?>Z}MN<9&cqqsx W|_ss#p1uj¹3];_|k93Řux|W-W|ùpq}ùw8wϖ.8{.ί.Ƈpq2ztd~:u5 . }p-Ww8߯pW̯¹dLo3.Ͽ }|׸~¹G|#{?[:ׇ{$lw1~8nr~xL8w|8ws|#kù3ν.׿];$_q=WT~8>דz?=#8'f'Wifs?:wjpϛ1گ9epzf=;p|q y0Y 83똄s_ {>|;W׸Y' ^sv֯7h¹׃cqo~S8}8z<_w0{?_Kt~sg]6Wߨ#p{ >87=~:N)5|y^:l忟1^9]gKYR'`x=ùpίp1fk.~빟?^.5r~z|I>7=98oW;{ͯcqj5z?Փ{,|g5:+#_x2=Gqǹ^9̯79sp1^~3t7=:8}5u|/ƃqs%{{58Jk_8ǘ+01"_{ޟqscY`kƬ_yz: KX?ùKS;+.ӯ|M]n-Us~ĵ#&_s;5kXWө$}0/!_ r+_#_s|ONf׵8yp+7o}|ͩ"_8uw ЩE:u8~bϋ|M[{錉q׼>dƹo~,'/2>|z<߿_~z?2s/<_ >s]8y3~6tć:tܯs[spse7#wC'Gfx\?¹zmkz<0O?ί֙_txps? /ćsx8q1f~:uWtP_u#u5[kN;8~qϹ>>3\q1> s;x~we88zq3&_ϖ}GtXs >|Mzweuqs|U{gӓ3sSq}߅|͜o5~a8<~75/|h\z q4{9NӼ]z_zՙd?unyǍKo_;$.]wKtͼ\{9g'OIw~s^v+)ҧnGYҍACg7u}?[gWqNu鮋uuBq+up˸tEҥ_83\z.q{JNFtҋ/]rb~|Nn.}R/O>oK ҳ_x9-W p9qK!Gt餛nnUvp8˼[%yeotǥۯug<]~~¥.;֙#Ι<tc1n.t1oKoۭyҭ]åAsҥ{"uKׁ> d3UCu?צKtE7w.8.<]Ϲs|ӥ nLny<y<~9ǥs80EL:qΩ3g6?嘟pK:"X'Cc?{t;:1<7Kw_V\zuѥY^vti\:qtӥts.ɃIԥg qNangKq2ҥg.۟.}PZ.]WKOqeh\;̋Ns'N3~>q[~븉s6q:S'ii]zå[gq7ϣۥs<ӥ'9һƉscs.nһλz?=W`nu$tCGKw~Х^z n\R1.}}5.8qβXҍ ҷsts1.\:yҫNc<.=tu?\]>Y/LL;6w'i]z8'4t6x.}XJ>\ ..~|t.}fgץg?p\:tCKN&1O_>bl~\tӥs.]'K7_nqN~qN_җys+- ۄ֥w K_wť;̋5‘܌;LN3pKWKcr~#.K,:st.:6җyt+utڤK7>ι~-5_q}2|=u8?y:ʙ_c'o]E]X{|tGK~q:y:qg^.=.}ӥwn7>.]KK_:f\:_]2oLn]tu.޶SgƥO n.ǥga[هuL<.?a\).=k\yu|t"uYWK:u:I^b8bݗ>ퟦK7on4]z#w<$.}t%t ҇KѥSwQn|0]яq:qtuٿNgq֯ۺp:t}ǥ+ЍNKwKt q?zi]\uuusK.=쿾lt}Iwu۱.w׈/?.:bttԥ|Ko:c't>Yg#~ߴtvӹsK_>]J~d曱KzѥVcӥKϺCts}K7pԉǥ;')\HKn.=ׇ\_ӍKO]zK'>5O꺜.}ds58]uSqKw2]zƥg]q΋n.tq5On::uU_~:״nvo[g3v]y=u Kw9]5\Xǥ[X.vkq&t鿏ҋκ~/O\z>ҍwu쇎~>ҟ}t:O]z:}\:NL:cqtҧuqYNNw>;k]z:b|qqoҍoo.ZWU7}iGf]uWk⒛תk']v♯>u'q7sqrySNJ=Wy;Dtsa|ee&c^ҝs=]['xt^ť҇uzq[Ǚs__ҭ۪KyDnN$^_~}|/җK^׍K:j\zx17KtKt3/G.!]tWuj%5q䙯yέSp1k8\~~upw.}d[wNݗpYt.=ݒ.%P8ӲY>KK.}_oťj?a~u]'_sZ 5Eq.ݺ҇.|é~zOgKΜ>7'_8.}ї!]zaI~ubs5K.xO_љ҇7O~㎶KC'%_g!ukAե[Auuժn::s_y}7G?y\qt?}K}<~..P~x#5..ҹҥ/ Wq-]:u|c}k[YWMNGK^Kt­Cg77>.>KKvSyutח̛u".=x3_OߥK.]]>o_q] nݗCg#_Ñ߬KױnO~.=q#כq;sҥ؟c={q;K_z'}Rӥvqgҋu~\/KNAok΋$q>pKj]tkӥt>t?t鮧uK'>.ݺHtGuy~u.oaי36ć/[NJkӝOJwuS\~}bs2><72ҳ.}ӥy Gί:2NCtiZթOrpҍϥK/.}X>ӥ:s~K#]u~t֕ҥSYwkK C8n/qt3gM7m\c^N8'nq]V{tG5g3ݓ7~g}0]y!^3OӥOeҍSK_g'Ik;y٥[wйcPKOwNrL\ѵ'q~ԩ'<<>Nit+K/{|E:]YXYgC:Lw^}] pݱ\u3/q9I?~ܒ7ѥg]WzKz/zZҽҭWK__z5smØty:әg~w70O#o޺uצSuC\y/{oףҳ{tCK[E^WNz,^?i~>it]:[߼=z֩Qc].ҝtХ;Dzu9N}^u~sOn9]Sg~_w9yͺ/8ftsΘ@ѭk:tN}|KN8KouǸ?ҍkftҧݺ/:.}n]qΥ[k~sCgN^??;J~Yg \qtǩo}헮S~.ݼ엞uy1{aLt>sN9y:}_:yu-K_.~O_zӡSszuw~ՍnYN:n}sԥ]q8<~c<ҷ:u[?\:#ҏn?ߟӥ|.:c{xytGt].}Y ]yԡӥ/ҳ?.}gz3/}K:scz}-~'׋x_qͼ~eԥ?ۭ8/Ƭ_:CTćӡ[ץΉUΤ3f1;]XԩR>.::һ;\z[WCctyp7K/~K_^|qg֥ft靼/=LrzӥةA?~Y/ct3z;Nd>ЭS>ӥ7s_::V?g2uԱ*gZ?.nNN^:vRgañ/ :nzĥK?;ć.g]̃W]y Kkav3:>҇G\-Х{ե5:oe|8qoGLݺ/Ƹoݼ:.ݳ^eLK׾ks}ԥwK~ۥye{MЩc]mtUN|xO\z:/=엞~c`< ];an~ԥ;Mn]LNS~B|?tEӥ[o޳_z8yҽoN˺/E~QGB֡/]_o.~љ~-u3qp\K7藞cts>.Klt.[tatחۥ~_;'0}^ǥ>Х[jC7DbҥsL^<].\7.Oɋa\xu~GxKonZ[>K~8fy_/8:Vדt3^Kc\sIpMCN^?q.?\.=D/?|\..Y\׈mN|z֯88~niscǥ:ӕO:t~8ҥK7"]cҥe?botպjt¥/+u9_m'_3utok2_~etB7w]+_G~aKw?~.~w!=].IGJ^g<.֩7 c_ҫZ<ܓy~ϳPS3 ]:~rZuם}}[W '̯9~åsԥۍ-N|NaݧKJ~q#_33R Cѥ^>>"]Gwt8.}y0ⳏ./qytaukgԍtuN~Ǯ_c<̫\/\?.]K7;]e/1&>tpt]OnSKե:{Y۫Gqפy 79u'.cG+unұ~-:u|1S'W>_ǥ['DӬY<><3_1K~ҥFu3_볟_3Kҗכҫk8֫G[Н3޺sϱ?Wg.]:K:zētkҥ_A _/pKס_t>g:=~kf~N>BC~Wѡ'W]9wǥS'*]uv1}pG.=,ҩNgt\mq?v~1uK_.=_c~:t֯UN~Sӡ>]zoUׯ9c/gd]p;Wӟ׼~ԥ~}pӥOĜuK>BǥK.zῧsљXwK:t5ԥ[gdK>.=Gcf;'>Nҫ>5c]9$׸o>t}yG.}sf~QK_\5#_u99Μd?t✸uXե&yG~~Ent]p>.~ۥS7 =o~X)vǥOvǥ{}so~\3'n_3:r"ǍƘy/qL͡cg v2:A=xZu59yK>.~t\ӥ엾t/=\/=~ ХgL~MgNҫ3A9N{߻\q1ܣ.{q܏nnz9қ'.pJ:)]I~Yw`S\p|/z✸~ҝ7tbҥ;.y藞/oφg?ﺺ~N>baynK7.ݺ 'K>ci8߸I=tίs~1u.}lNN׵o"dzfסs=:Oz:1ǥuKq꘼?sV:yqӡ_>..=*ѩy]zflu|E^}8Gǎ3-_ֱzNn^.}:]1{W5qǥ|K.wKKsK~39?.=[K'ι?G:u~_:v~uvt9~68]A.뾋u_Kt93I['9Х?jݗq<:2|DžKO>t}9qΡSgpؙ_.g}_s3;Ϻ!ҩk.sB;-?oE{KK_‰s^۩اiGs׎K_Cqsֱ2oKoWμ.|\y]`ZW:Bәu.B>ɓСSWm.}~y֌sp1ί8l\zg͡c ӱ׏3n:Ϊ+o8Ƙk/]׶㼛yqsgK/֡SW-=yEw^]Gt͋ЙW x֥OY'utχ~鬇zy_9ü~5u3OߋK|tOҥפK/UϾYUtiuDix\.:8\]?v1.7.{:Vq>un9\z/eK3yt﫮\uӥG_.=m]엞.~uguU:ɾXåg.*c'NәSjG|p1k{m.]yygs=G|c_[K^o0u pE~һyK߮XW]ӥo^uKu}ӥKϼGtK_:uY/|KOgҋc:.|\zcnG<:u.k_:q#_z~N}^Out^ ҳ:y:ǥ"tu)\`?A>&׻'Kn.=~;_Ա_N:]]N \2حqץp8t]ǎn+]uvtSK}=\z_Zӥ[@^t:u֯Ͼ[w+v헮;'/ԩ.>Lp0κ;~]y޻_:GdtGcgu}\3|y忟78.}K/=ҽ_uŸK..9.<_z:tln.=]xeuԫuK:;KcG7K'p1mN~鏯gkuL￾\z]S\z>ҭK:g[7 ]up#w~u?g|~B]dKt/:cKzƇos ƇMlaOq<ؼKҳAt'.=O?W]zn1ԩc:]utEKo8d:̯:]u_pt/ׯ0f.=/u1.}֙_c>ҥu:yV#_y#:¥K^Ot/.=.}XGQy^./=;KK5KtӼs5]u]p-y{t:uq./'v8~fRե3'>N ۖ|[ҽ^p~^ҳe?5~kѕn}~u-uLa<ҧSgS3]9uK3KNn~x=ntvt^uwſί1ҳt~wӥc\ԱSz ֩!NuJ 7K:#t8=T]zׅgpu_<ޭ;wS?0Kߨ//ҳ_kաӧ8]yj׌3s@ҥoǟ..tg/xkљSǪ׼.yq~Vׯ1֝<=Rućӡ5ućqG(c`L㙯[컱tt#æ o'yå_:q_:twyb|ts~s8u"/:p30t8}Fݴ[g~W7>B:uӱ#=]:wGtt95]':i8{]q[Ƈ?.:#ۥ:u t֥JN엮sե_?_:vI}Ytq|os|y~KNf|tMw몍K'K7=KhRә}p_zY6~r녢['_;8=.ҭcAåるps7S.wݹ]c\['$sGKۡGHgN>Iϯפuk|͢3>u_:S]z?KqefԹХgt}KN>I\KuetŕEԡ^=3~~ޯtֽХg?aݗK~;^K7_3ӥ뗲_ft~FѭEW쿾nǥ/.,׌Cnd:GCԝҭK_֙ҥyқ|q5ǥ /^u֯QnƮ_grkKN.>st___,#߾7_׿IϿ%${{OW?~Md m^l s/۷kی1^ iU˵Yc*[4 [i ܫ~N%yz se?ǃ5ϋimv0ʶ̽& iaE^zM)aJ̽خ^,=¦U sv6-̽6^Hj{`nv~bv^&l^#lZio's/2>{aa"[k]}Mcw2";d0J̽ wMkciܑ̽-s/{2 s/>>¦ղ0d6Ea}6-ɬ#lZ#lZ;¦U s/ÿ?¦"l~{=.zMi=̽v|M v{l'ar⃹s샹ױ_Y4{Viu+*r{rTQNy8#jZ W^U(bwX~}DMkADMݫ#jZ;ٝ`$Vab+8wfxijffC{=Z_l)Fbk;{-ϸ]Z$!N^%"7[@܋)L#dZ yKܫ)%jk{mX;w* ⾨p_;{ɂj}{1?^#o׷#^Zj~7Bkۋ^j( ^ͯ÷Ҫ·;~\@Vۭo <,nK^oxK/OJǿ W.,5GxqۋbD|{xi}]k߯t_qso_ K }KKϋp+5'oy{1=nP^:¥t xO#t{# }ZBZFvBvE=t{5^/f6إ*n/vEW=0N^bn/vGɨۋZ,tn_Hö/m_TRR%ݐ=/ de{8-! a+ۋΐe;d{c}梕!xCׇo2j&/ _j/d{5Sz-!ۋq ^3"+;SBת^DG+ )+ۋE9lߟbd{LhlvDR*z+]*Kv^}j%d{QN!kv^.MvCbG%d{+J :zkE~^(l{xkG&xUޙ=|`{Z^-$l/<`{Ab&`{i߆ l&`{)nDh%_2vCYJ^@SK(|S+bN|#wW,y̓ƳPݐ͸Sn ۋvU a{=\BBbCY`{!.ذ 9M ׺/µ/}*[P]bGGeP{H@դkP{1)^KwJQnQ{9{+u&Z@դwP{݂ȝ5BګԞb3?P{^-:jBP{b]{e@E j/E ,"^AŢDũ5@5Qqb2P{MګpAtEul*fkj/6WDբTj6P{.@u{ZElo2 \Lj/Gs+uqG|=U]6:V_bs@P{fګ2ލsm"}kfa+9BxM{/=i 4}M{^41Ǵð8]X&`ô57`ڗ%/#ֶpL kp_ehz37x!e@W+ +9CEF^z%T^nh/N!ګpZ^|S]Nο/D{"杢=u|@&6?5n~Eκz"BZuXQ!D{F4Z! ўVD{>H!KSh/D{!hϛXan]槢T$E{-=`)ڋARHh/VpB:^# ўw/DY ڋ/h!Kvў#=cXmnN^CWC^-h/@@/Zs1<{,S}\2^3@{`=oBB^6BnnUAz9r!wy-OSG X` n>^V@r ^,Gff5hoEKf&P^l4 h{nЫW)07og̬3lh/<Wƫ*#ݖ_d#3Ӹ&`' #3 vS+ēNjg}> [̑q+xԂyًsoꆳW !=V&j ފ73^,g g˫L'[8{u5-28{'G^kG^fZ^^m#/tbiP^j ^n>/8{6ޑYlSg7R^XLۢG^f3ZnΞAt8{5}SDZj|@^f ʴ̥noq_V>%cLDWsAg^yV@chu {<#-f/>n^[^,^f]LZMd)K`8>2+w/1{ÀMs쵉1a}e%>B1fbM#-zwe)T]^IdcYI`JXOnLZ^oq{ex%f6(f/݊{qLz"揼Lρ .5~_WY/fZ:1a݌?2M"Ef7L^* ^8=2 .ueD:^'fwOR:1{Sٽ T%y-.yQ쵉I$#fw)'f7*ftqp|Ybzo>E fKI$f/mcsbJ>1{m/^m f/bd0{o~ fID٫x^(.fy){vՃw?kmҎݧ11[bv@ד?ڤ^(&f/jH̬~Ŧ`qv7եuZM^&-{2kak,M̗h{ΎxR ~;3~ewDJsy$fGֲg sG<m"$.H̬Y`guI̼YX2 IURJ){Y,'/ز̤evڕA٫ [&dwCY^|dY Ǐ!wyx|c.\@:H̜3Ma& Mdž$f#d׬] ݃3@q3- d-d %rBru\ݑ q"dBDRyz6V?A-y.Aw|x~6H;S^Z)w%7$4Zx^~腬Ř","مK>qϵB:κl'<7/B> p3x|7>y/-a8sx2UHNjN\J09 ϵew˟NwmjN!),oaf6x!d"4w߱ |L3~vx3J Vr|a."!%p0!W>yϳ43g W|="oj[y3gܹYJt]LS9;s<]{8 FlvWJƘrԌOw^ތ;μ;ϳLRs@ϛ65y x3`n!Y=^xN@$94mKx^x(vs~ްNuΗeݟ63$/5 ~Se'i2[1-!;Jy+|M2MkkTMr;$mNԫ2韌{L }Tt2_a緭axPfbdbym[ymd Kv^擝7Yy@23Ɨv~2)"@pәXuQu~on"j9\͏:8R*Ƀp>ԹZy9ʸ:Pux:"YJ>.TY uZ&cJTŽu^#Y9syہ:"_, ؼǝjl: Q@Cx2]8GtPRΪ TyoJ2 8:Gts+nMo BvRc]PgD񒑷c`ya3g1qq~Ǭ8?<&+guL[e,\ "0w:GYAts|dt3n?L} ;ԋ`F^C'S:/6BWo΋PƠ[Gf 꼚W:Q꜏[un9չT6zFlt~I5SP@n<V~[M+XmpFM4V/o57O֜;_U)ը.Zy%od0fj*b:< Nu~mU ]GĈ0G]PRΩ:w#Xu^ZjRy*|9":k]fsb1UbM7*U>*:7 u^nY8M7<=꼊P/']Ջ]aݲ󴱲s(Ϋ]eDd癳 ;UMpsW;Ϝh Ow_!y o]9[5g7Wy^o}VJw^u.DFow_&Vw^Cu{^V61϶LM~=/Zg]a=OӁ=O=iDK=_^s9=d}Kί,2_8sܯ7,tqK]\*OM߬&oLO}^G)]i<͇ܖs-G0fӍ K-5$`Ϸ|sjSN\}3N$>bi!>$>&}))V5v*>=,FJh^A4T- ~>_:4x ץ&GǣQoW4bb5oEAϷ~}[/yWHN}C=ܴuGgz~̍sS>/P&J}^-[>ϰ<%dsPrJyrpn7}^헽y}3>WHϻ) :c ǩ#m}nE}n)+_u`Gnv^iQurLw7ebLX{HTGc}7"}+ye2UC~ERw⾧>/ݷ wep@?us[+M]z>} Cр2d4IB$C{ϨB2׳VfFFyͻ8.ڈ#5y?~^L̿~npƇ~޽:7,+n~xyGIyac|4UDN\/?(}9 ϛ]q9Jp*Ϝ>r}yu?|t*H? Ty씽Nyw^_9?t퓯̽ 9SY7s+p潟9wN]Ep_+gi 'q~[_&@ovߜߟ<N~.~a}f_Oyf~"?loV.fs/#ȅAy5}ğܹJ?N83MCՍn)teO>3ǟ?/>6=۹J>xŸT3M(NIq%Qn~ԙ>>Ns^O3^vviJJ(^Gn_@y{:)6uR qթmU0@~Vtۑ˯gwxe+ OO/x,a9ՙk=]G6*X#J"oҸ~8V-P#hG PFS _@.q3s?y^9somJq H:aWb2^wVB[|Z\M>_j.v+}~- ss&MWgK`^ OqfWi;JO05Ɯɂ=+E>]۞_u9Ad xs4Uu~i.y3Q G|NVތ=_kti ^RtTL[qGV9귪O#Vib<ތ{U볊^[VÒ+9m \|[T*7m|FUvÿ>7@|n`9Y-Z팙LQls/nm tkiMyf*-8&I(E##=o@~y'6Ř vz9kSu6=7gz)4uE U#ٛ=KOUy~ @痲|؍LӀx* Aݧ!ß'<Ly޶,Q\fך"K}z~|j'ui[xX|,''MLt<.tv]Aߗ9aߛ$qТY^:Ra(kE,7 mrc7CYs0ccu7ۡ6iiY5/>oËksq%>WoϏ?\_|0>"Ͷ;s}Zkv1:G#,o7G|ny#2ϽQ'םy>̪:sY5۪.'cZngM1:48ޙ*|-{7{gqSPŭOv&czÖ{]Wj =i7/i'ϡݵ;7YCgq+<'pSe/z~H[i!ERQx15 $?[jRtv+ 7fqݧf߁t?蹝/V-n^>Jg8Y=g5meK2gvyuA|DŽ$ D;5tV7kyPs;4'8]S0}G*3J2qnэ~q1ε mvCBϗPyROUwnt(2(-RJIrlAH`㕓oy4' ۄ˒vߢxp4'f(iKynt\ <#&WE8(MS7<yަoլb<lܮ?%KNyly~;ff禁)ύ@۾#ϻrNrs,)]$su<ly>,YfLTj_y^mZkK3^orQN8T˞iϏ<7Iyn}\e9u znAN=⚿yR_cĩLs3R})ǥ^zCϑ6(UA?U4Ƥiayq,zA@7Wޯs *wy dX9IO6\++=g]RO6??=5)zQzn}Lc6ƞ Fzn^=Ġ)|DTLw=g42q]:#XI\:Xۨ)'q)7ƞ{2\O&=c칾 zh^|I㧝4 4ZAe:+ĞM&Ugp[D{vM;}b{8 ?Qױ'c+ $- 㞛LMU圓{~37̵+qKINs+֤w2=?5?칓My#j+gҖ]\{k`m1YܕA~nF>wm>׷͜ܞ@6>}M|n_!3}n4|6UX}Fۦe@|NQp">1A|Ͳ\&>߿{}n1 yqڦbs9x;u_vysl|>voy^TU>م볋SxX^_Yn6>~g6.|dX|rG_.Nm'>*WYFS>'|n'Ϗ=,}.>*3v4.FczЖ5 HʢK?{n.4{֞bZm\ʼy^AWzn*=6zNW.5ꚥM/J*C)(zd?9|bL ߗ+Šm/26=~Wwp q kRk.FJu6] rWׯ/=(ϳϖ~]VUgJsǦ$')cAltJt ϧ躕tMCOrx+o?Tg#[X?}zUg^{wWǞWY݇-Tg>W M>^}nZp[]N I\kNyWe7t9sS>]jr *,^@s>׳ϭUՕoکN_[t]+{2ܚ RJ돧61x~1Gjή)]'zN|j3e՟o].>RV2PP#>:ck+X3|~uYZUg.hǚ,Kɱ52tz3-Mz~cu  =?9??I|yŜ|5㟌=YG~yeW0P8wy2Xjno)=|J~X¿R?6z?Y[\R^i:ɬ/Yx*H%߅9rv))Δ"_2;ř@y2\թl1fuJ-o,O# ҔKZNo`p .߿sg*՟+Uj:ҊS)=ﶡNRz,0|-I=yQ{4\(z^VIY{>>>>R2MRһrT*=fy可ܣ-޳|BǗ;9e*üܢ緔si9̿z~=oRsfqK;c!zNâ鹩sۢצJ9?oIѡd)8m&c.i%?rOW’ŘCϗk~^u<"-MKs/y䄞'6 n|q >?Bi_rI.$'G?4X ?^fSc82yƚKh~b1 s[%)tSfy5+ɏl|?\|>.' O_BY4[x>6D 緇5o-+ y,=..z>}O6=oRFw=wqyQ彸sq.wKY\p7SEU{G=7{^:ӳ9~󆞷tdrϗ9YuH gES߮ +Wᗞ7/盞ś|>#nϧ9Ϳry˅?s姧ñ|^Bϧ+5!jO[ZS]>͠ > }^s">TV9mՠ>#2hIJGv1[NGR|_ZwOH>Upl8A7Ǐ>s>9[=,pxq|ʫ&Hx֬PΘ͚!g0ǷocC}}ӹ+>z{{?꽂ϝZ?5=`ٷ{Dxa8+p0jf*Cϭ=G굒έ2loMgL ׽&r o??Iʟ[ջ7paN$_\3?oViXПGޜ^/k;k+nz*0ކn[\zsfǯTivMTGoN:›kÑ;yi$* @?X-n*V5^iu|8 nn,:KL!< @9i1Aĺ!t4H>$֬qZ.AYak!݈- uQ~> c/NeaH*w Dto_zUC/}>$GrnčgDغ!v)n(}}[AgM^$ ?nZt Ao\? ])A?%k?t# ͼQϙoA;<}qAsɦ~%B! 2 ?OCι^sZWo#\ r-AoFI=~n,nEЭ O=Vcp<69os~s}篴_n'ތ) AoFIЛK=nK :WŏV%)'%KЛz T $%s/M~ DU󸽾^_IyK+!YկFP*At[0HA/r-ϏM̿$A=Ɵ>,9ߡCЛMЋɣAibnv7|]1שIB]PCzW%BP?M!CzY|̙V`;BeNy*tO(f BWیa5Wc0zOk"+*u߿e!Ps|,9X^!\N~ѠA7|S^wgzoVDL9Sc4M{բY;c׏A$VZʷsZSrնRO^oeSrS(}aqsoNvyslx^ɢ畎A_~ůvϧ-?r /A/ 1xB~?O?q˓ِOAStݼU sHнٕ^ɡs#Zbn {E!!5)ytt!!2""F i7)vA}?%.@)Af{Kk|YɟE lAoE!1{Bi;}JkKW|S+gLt ޽VځTM5D?]u/1 GO tJ?Ƈֿ ɽsǛs:}ޤcKIu׆y!Ы}Bzhtj, u=?K;UoyqͭNzҧ`0dZw&?w'swn KZ&Oyx<`۟gw2ܣ_Nb]ZQ2Kj ?oCW9zzs&@Nz0];jW?hfoWfysօ/=:u$cZ O+Ȭϝ}:\*PJwG,"ܺ 越xi-p= ~xkωH~4CSD>D^O_>@wl=hݗ@xeW6:}lÙ7Uu65i}kNɕetb].?O!&>~2w|s- ),Q}Zt Ϭ:8^Q@:}+|[>s+ۚ);>~~m~*-@w*@w@xnzuRWog-iP@|4ݕ "[5XXBK:@,X.6uF*ЍUW6)SVy7]ֻLSN> t=*ޝ*JF"obM;!>sZ-1}x}-dN9Ӈu$SNDcE膰7[-7Q:%?X7. O.t7+1~x}A1D_>@621.-[l]s2 ׻_U5_g"01}QFyqBeΦOyuTv5Q^?/|њy+CL:㯁[qok]54\Z4sVʠ1nW1^4L-*S'mS_\k[gJ  hSنih' zDӎ dkWmsc޶i7U#gzi=>MO_ϴ-є??z.}h),>%2 CgUW sC'_)`ǭ~;dҙx0܎!2ayْ*^)/CwSQ%0a ih}5"0cO{5;%M9{I u/ݖNf}0a^yzCwsW~UhvW>i43Ku~}vUw? Y6q_ }QczUд+VG/[M4'B7sVBPZmSO!fzhVz*dN)bxeb$B_}>&Nv!tL!t6"tBF.]l]u?Ǚ{ۻ oSǿ_? LOr_}㿎?WI{oJKw3DZ}Q7.3s@w&ckW'{dK.!t~WH;-AaCYuQ>Kwqާ]MPNjƐϿZG}Ӯo ^m-RUѾE.vN;Zk#/*Ќˡ]>ѻ:Imaq/'߅ЮV7ƪ}H~{9?w t(W$2JK>w֬_{W?.~vn6v_xz_R}zcGjk؈Llg7{w!*~W;s&}ѻٯ~R0]jhNOp0zgm\ލDSpvcJa_~7-~g.bSx6Ͼ=Y_?ZF7U] NA9i{G+vewQtQАnry&ۿ+yg7[^tSПU!=]i/;6D{]F?̼Т̻/ȼ8%d?¼wr;qu .k}Cͻ}1"03]ze'V^#* ޻tbHyF+P9>tW:rhq-߻Jw)_I^ף@:!Ǒw`/TTC^w#! kǏ6|C=>>9W9v|t)n̥-ۈw=/IE|w1ֈAxG!zݟ}#'Wpnhnku vcg#]K?R㰇Hxwh"f!^.ƇU#]PxMG{wkuڌT ;Lؗ1+]TƆ}UwAw}c;!Î|W$ŕXqHuQθ|rP!y%&{ QP 6~؇Yf6D x8ߵƾK}ֽ_dw'1Se$aԨ! z"m4=Gt nbaw&!Zi󝧀ߕQ](훃¦TbttḻDaQ1K Nj w~4w7>{qݚO k0]`nYS3e,8 ]V ϟpoAۣBϮKHR=N{n]Pv_pNv'(v~rD+]b-Z{ͲNAݔw {3v+F{tWhfvS9jltb+ɇ90wݯӱ-FIe1ò, ws"x{''5hndU0P;b- ;MX$0&¬W{oXVz|tcLa^  |şqQ|] }ݗ] AG{Hm\71[ xݗ{v݇|q]ȺgDe^ 3`Hڼ9:;Wロ]Z{ i=N2|YI5̺*WY{b>9kXHjJ<лr4q[[ڭьV+Nꮜ doA4_]E4k`2{2u=NAĩ[JoߺWR}!u(ɜwet(. 舡TP(C4[ǚ&ֿ|=m<v[2:K;0mw2q$Ajzxy~ra;=b/{v]=?=wkcP%y#yx/ߍW;;CX:|wꗫ?B箦sʇ9-U˹ҁ_*ƹ _B'¹?w7o欅7Et[ankln`\s,aͮ Q〚]4n^ \)G ffv ܗq/ =h1ׄ(y&%1xn4Z({O v2NQܽ3UwiH9i(.u iGmy ,BaNA:Mo{Oj@q\'~*fߢZvEqo:?ڨ XaGe{Eq`o]ǭ}ÕްߎzCFoMB~T̾wt xߚ{ovoC}06  .YIQ ⛥h|8{G3`~Gs :?:d3k`ovU`Ս 2;b-F.J(%G4b0kxɜ q3}|-;cO*R.n$7W0JQEΏNZợ)ME )33t⠳z }3$P2U)_~]bZtZ.ΈNwhN1XW^;ҡ#!u fB* #t]@Z 8Eq@t{!.7Eq'( _x\4I 6M=h5E!Mu#rE:vzrݛ庣uuMu:S4߻0LQ\=z3gq(W(Nk n_(\@Ű\aJC4}+o{W(sKm}V/v*v;HvmeeCnaoJWvۺ:?:Afm-5 P[$C|Kpv*rOw.Mj[[nRkfWbқegu>ֻd?ќ!Z|T PMtMA6W:f۟]wmi{w-}|w/+BB6E$ߦZR{27ʹΓY⋠Dhώf Eq:?Ukh{QN@n!"g{WN+Rl(Eq 11Af;GY8e0\ZֽcXY%X;PVqݨ0I&Jv/zHF5.~(>T`)fWxm/c:)>?:&8]Kll/y['Xq^z k(._غ) LY,zUrza ;l ;nm[7.1I: 0X- +[Y *XKu@Z}徘ֳʫ^_jZyTԗW-9Djcr9\Rj_{ ҥ⫙ZW].񪹣j1`1g}RW.e{U ëJƫg]ƫJUmujݸل>LXNjy4V« 5Ks@xUq:r&i4KsX5؄}4_*: sU-īWF^lxU#/=aַY[\Z׵7VU-\emǫjjW}$\k+|ѢxrU1[:yīJ,iU;:x:DUWe}?^u\ ܚ99UUO&z{9!xPcEY;By'(^VUƭQ</ jK}|2^ٶWMhj]񪞮BZeU=ū:3ҫ>xUfxթe^\H=Rf*CQEzzնEjUWL}p8۫;W kmm^ճ ^T)WuWW/^u\Ksƺ4Y.ӫޛƫ^ūmHVЛM׫"CovOnxUj񪽂uziW}Y^Ոx'׫N?xCPSƙ՜߻=6EK(x:U~rP47Lǫzj c^rJHPS<ҁUQ^(]Y&0bb47zGnW5r=^%RUuƫ PM{`ч|u@j]D޺īW^uqW[xU^&bJU7"~௚?z*p'z47vQ$ߥiUqzաԫ j:3*t'gOLVūV)^4w/ǫVWū&ti.۵(;&W-Nr4w+RUIW*KsV}īdIzgdi@x;>M5^lxnfn-ìgjGxrKWͷ|5zUxW˃90J6~:.ƫbW5/xUβRNxU 9^UڻƫWH>^utxQ/=WBUYsӫ*Wj!4^ c/t?^Փ[j#WM"^uz}lޢ&޺Ho(^U!R^576xU xUoNU?QmZM =Q1u: ë zgފ{FUǫzW-:jo:?WƫWӏWuwW٧zUoU07^8gxU?xhgD*tatݟMg9mP2ə=>yEЫmWhx{\UYUӫ= ǫňW9^uܒۛz@^WtiNmoW{Vz;tf?A^4"{N }lh.wQ$),$9^g ?zURo~>^ս'jL=AT6F^:fN~%Pm8NӃ{/͜.sj׫V!_Eΰ_{4'Jķx|FxU:U^W2ǫ/l(|[Ϧ3-n]!^ UW:EzyLNANZ[/R> JUj8^FXxեzf>Ų&P ?OYڍ;X4s)_N^#gl 4=HVzUgWj^>^^*j^:RjO69]:.dz&TZ}s.V/|5^\|Nb9oͲRtxϦ(HxRU1W:H񪕍]34Eq>+^>ɜbj/6PEjNA"zyscAo<(Ӂ=JP=J$BwƏ s}{5fUkjYW"5n*sWG+]s+zU5Uǡ\rWӫV4J(것ŰJ}t?jE}k«vU:ӈBWHiU5o^ltCj^v zϦ([x2>xUKԫVt!Cܚ =^U xX䫹nH}ASEq;,#rnTfN7}rJxU{/l"x>7PxUVնWfκW}| '%^o[(RH>6c<WT9([s{t9Uǡիf%/Т[٧ëZnjXVj!*'d%]f"? 7!Z.qz)+Z^iͬnD|q!AMVol9a(UzӃ *iϷ^՜EqW%8Eq]1K%xn?x~kQ\WTpWv|0ZW ի;SWRJn>ݒfYpzU+%q .ٺ'RajU0[wkUOU$xW&cI-#%UWԓ]vSfNxU(Uz{tf;5WS9K&+d9: U@5(8T,g'f]o^ǫN6h. (x@ONQ\Ԝ*uNxպU+?W>^u)HJQOwT ^aCԔ 7a*Rr0UOLq.-Sy՜TUtfU׫1~z7U ƫ>ZwJPsԬ̰&ġ}*Lz8\>zރxպ5WH^~U4zUvdʫBj}xw8UBqOZ84j*RqUوcy{zwS`{UJ5Z%^^'_:xm?aON)YY*|G]U|5KMG u:La!4ܢVǞlzWUAżzv܂Pԋ;!yr~-U Wux{ՔU>sV^~v&3Er $'~4kUùǫn4]KsCOcZЫ| Ks6_*7WGU~6-E- 3a!yfiNzvCnw4wiN 7&'Ƨ*s0a9䫹[(s|Ui*_ yPPل~V"^J0wUy7n ;Ü#_k+IΏWuEzr ^ÚϮ]ԄW,u_zU!ܩHM-A y^l+[Vry}l%whR xUEj 5Ksfig:47TԹLjELE\ AKGUs0n-JxU^uFjP:7~6vjwYӫ>rݛ+&)Pk0L"boL9}h:~#PW^5KsZU+Aub*[czնj*G=FUG$ΰ_UƣWTW^u(' 0O׫[`'NХ!_MxUo,WEy&A(vz+CU+tp櫺"jW:U/o7U@}$`F^\kJ.g$#"~htf[>uEjNA5͡.GU?D9~o/?9xKsJ9{JJX5T$䫲ƋW>>g`Fa#_z^j:hjէkʪVrԶUo_G3/y=_E^XjJ7zQB_"|[1tj:3 %n^D5|Ɛ]@xU˫WfU/ȇS6x'_b9V2$W-9əU6kI<؄%ei䫶/4^ղU=W_ë^TU$_xxl:?@5琠~tzk'1at's 7L]^4%:UHHgU-Zq]U7Ƚ6hfU-WQjJʫ/ǫ΍[̡2$YVʩZG^zUw5JZjVZj|*r깁j fxpWeʳ*9Ji@5W:cJ+ԫjt5^/]5_JGgUMb*zW'zxѤW×2oƫŕtKrN/6xc/+uzS{nx0LBpi&P@|_Rg|ˬ҇ӟ%'ǫV =^ ^m^p=Z@5}O%I|2|1m\`W]m&`2xJ2m\-RsQWf2şxU3R_jH|ř?^uH,szt׫pdj&h!_%YT67 _6_Wm Wn{>_gUK>F< S9'^IjNV/96(!>HX ifWhUyEzզuxUc^5xU^@x:AWͻWV-^TUzUK^RW"_UW&_UUFS^zUU|2!Jj:ҝ_G 7]^u0zӃhIPGzZ s0VtZ׵+TW5UfW9] 3+z<mUjx{5RW@5}96h>/j&5WEfūK?^5( D |57yUaP͕fNW),7&_Ք[Uz7^JoSxU Cz U4)8}UY^ OUퟀW܂l֛ì>櫪U0kլ^ūg:Ts ⟊WUxU=eW~܋"2fMa0(] *_QU3"_MU5MFS=zEM9&W=43(%PM =6h:Ɯ^ xUWÖ&xU6AV"U]+W欕W&^Փjj{ǫVo .īĉW-P^x̀W=wkYjV^3-|jTg׻x0ҡ'_}j*U+5BUx ^tf>S%Amy ^6V/.Wp^F CdwVÔ}Wz+RxeWiYJӁ[WǯWTU')GNE&c}KxU Uǫ WZxfE[n{񪶝W[z9|9]s:ɇwxHիڐ*^)xU:0U-:^&Y^uhxn5kZ[c2mzw-WuY8^8Ӣ8.->^uW4iQ-s[j$njqiCӢ8ȁ3Jim}ji֓+ݔz r=V/񪶍"_ūZqWu)|U[U \H|U}' ,~UPTU^N|g>9ͼuM)mգfͲzUWʫ֓{iE=x8JSwql,C+_5/!^u4>2UQC WNSn7_>~QV/s ]87}e9prp{@Yī:gǫ=M/^վ#MG]jwjtKzOf5W~ NjtUI}XVZWX)p9z'8ivMUЫWSǁd,:!ĮUOŕeyP*%Y,͚TkW0( 9«vf9L3aM𪷩U]ƫZof||ۗ0P<1UuP=J<Sr9<ī˿Qf&|1#2I(WYtEqmGY_xbU6hhX䫞2RU?UE=䫖8NQ;_ $,9]^0^UAy«>LCNYs 4_fYTSWqٮat 34_ѱkV^HTjnOqk׫W-'{҃(Z|բ'7ۼ-C`/Z[Ojtwk=>5_t^UԬbGs_ZofM^;_5fQuz's˟@ī \C86 q>9׫.F-W|SKb0Ô_zr'_դi*;zUzղoi۞"mdW UիN!Cߢ0Eq׫>UUMadJu ^"5WxSǫ3|wW6^jg׫>Ϧ5/HV@5(!H@!U:լWzhtpEw-4ā#5͚7ƨaڠ={jm"Moxť|c0s铹dU:82xպ!aiSEWe5Bʫī>|U'!ũ˫WEqc$_{׫NZ^UQW;^իiQ\zUU%_UO |xؓ9]zzON*ywo꿧ojxUW5WhʑU R|1W@4yq 474*?LXRa~4G¦^Azsnq4d"ju~j,).[]Dvj6bUMr:,qox m4ل"4^usx?"x~/U"5mx /sU+lwfR? K0^5=WW,3a%FzUUexUzUe :/0_~fi2a3Ksfv3U샇(:^u';[T뜵>W5 jzUv6@Y{$,͙lM:ɭ2ƞM0KsmVrU=Vꐯ>;:*5_Z)JarxU/W}$TCS7KsO0^՛1*zHPC+n5WxU˫b'PyJPJxqYkWSΟ9W5|ն}v ^xUgzUj_k? #nMzUuVr!AjIW-MCc#^uT*hZɑU"r05}ONaa>|:70չW^j=|UC˫-zJP yYEE }f9%0^f"U/DǫUѫWjY5vI9^u0iMS!\yW=IP nmnBMj]{\cP5_rxU;_Μ`+SJjg/>5^*9}}WU>^?[xnz^xU~Eaaݬx|S?^վs۫:̏MSƫj֤qlīVijNxS^)W0v4cebl.,iN3#`w4kt@BjW%34Ks4"kqɤeinP:*Sn1ŭYV*:݅4*lB9h 2Ҝ ͥGȧ[VrKJbI׫Z?S"5MS1}s\ūzu֫W6.Z~_<9^PxU'&;_zUT8 6ի^8݇݁LU5 +p'J|FuRU> *rWPPޟ9^ƫīZZxīV[u퐯j P8x'U f«u^Tj}9?TJGtx0WI*,wUG7"|%_={o^ɜ?|U>ȧ[GzU/jrz)߇W5%4*^)yI).2#RMm{Wwà,(u-HZդEʁA 7:!*=mƂWxUMs鐛!MSuMOʘ;WUmWC^1tطd8~ׯWUIU鍣W&^n{;_RJw}pZ)W=^]ǫ@[Uz Wfo\M|q𪧌BsTu0ZaQzgdHsitCs!\麚yo/Wel9핯|2I#/."5W:T|)RUKf9^UtIXU/ j*_ʟp "QU׫V?7ەk+^`5w2xUW)'_hxPnq8LsAOūL5ktCzHfOwëꐯ&uJ嫴A^OjM';AWh<^uS'ǫ=pjݸU]WoJy.PMSxNwPUzDu«PWed{xUs'?Hū:>DW%lv^Q<ǫWZa֗&u.7cxUjGxUR|JGҥ^P< LxUG!v y(z4tNmpë3WW'^ѺF\_ij76jŞ(%9JSȧU02_i0UmW=H嫖f͕覵u? ^CEJb]͎+|Uc*_jNA'Cj 5UmG;^u4.;_׫“Os96p҃C SܚSszGNw)_M%nQ*+^5W$l$qUgQUA=9n ^~#ëWu9m^jWyҬ@UtٛDǫU@5X,gW_ W%_eYaI=FӾy(ZxպeW-WۍWcc:>^ڃ},^|x{k(Y"D Ŵ(nONQ\=>|U_~같v+:ĭDV/KLC"5W:ZOEɝU'(2|%Wuo]4lZ"t:yī"z*a97aN$^w*^)|B}'(NR4(.pz]ꦾ֝aj^`unz{Ixպ߈WcU"5Eq0RUojO^ҙ`H"jWu*hXB0̲R]逓)W=4zJ_MnƫnE)6!_%eQ\Y*jɄN^~U«NwR_2.rLT Eq 9gY|?^@3/xU{-.@6h>Q R2[[Ys *z|Wl{UƫޚӜ׫Vk9L(Tʦ^UYWZ7^zU5^ Vkm;W5sjbxU&We]fH'zՖ:Gmˈ{Sիz \-fz(5a;;`NYPJA%<\ ^WU9C}BJV_UzU9Ы"0zU^v[mCq^5Q n(UCJdar{ʪ"1 /k-;}/_o?͊_g//?𿷿ܝ鏫QFw/F#+n7!{o} &|G]8Hǽ`aq/G}E}.V c}Ër |pð?߾wGq?(u+Q !9Kdۇۇg+QȊy.VYE9낯zG=0ϻZFΜzs=p7>$TQ++QcPo~w) TcczV=yPvݺKǫ1z`%2 ~.2ͮ _wAz/;Dx{I f1?n(JW:,oA-ܛi ARkauu~]uv"x_%]yl%<lT| r0'?:Q5s=;jqns/vs9Oi-3ފ *56LPφI/!]iNӯkuv4]ykasutp>w !ܻ]C ~N$#7xF$-֔=m{0a#h !َ'C :5)kHRװpI<<Ob/¹{)&(1mCt'f;E ALGNَF!htZx2ʩJsOܽ'^w≻?O$+ -x'޻mMmf;Byچ/ a#})j~ʝ_wu_wu`w 3ނ'C/{) ^lG(/A!vO:e- ̮I\Ó½'{ O 'IR9h plG]  O;e-,w}X8pI^Ó½'sdT<QO GvxaBy؎/ A@(/SV{W\ݫ^2{[Fwzʓc\}|I4,,z%,;k" έh%$uCH+1HD %A^B:"u@09mSHru+> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000256043 00000 n 0000256126 00000 n 0000256238 00000 n 0000256271 00000 n 0000000212 00000 n 0000000292 00000 n 0000258966 00000 n 0000259060 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 259159 %%EOF brms/vignettes/ppc_mm1.pdf0000644000176200001440000007500113042165067015263 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170125191102) /ModDate (D:20170125191102) /Title (R Graphics Output) /Producer (R 3.3.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 27077 /Filter /FlateDecode >> stream xKeKvU+&tѵ,$yHVaW9d[T!h pVwُxso毿o~_k~_|O_~2?|_m~N_M_4}ot~÷mOW9ѱh}F':]=Zs95~`z~] ң>~a={/lKc6ݢ}Mt_8 Ǚp_oph='ڏo?-S݉ڷhQG yhkhS{K Z{{U-D?eO_Ô{o9lѺ%m[ڽ=گDңc\xv-ƕ;p/ s֩76գkGV$[\۽_#kֵ-:z{Yވ[Wcڽ_DqMDW!X۽=ϬE>\֫ڽ#[mmEۖs?Ѣζq-:GgТus<Ӣ֫Z4e{dKzUoGU-:DWh<콤q[-}lzj9EǑ6OW6^բn{jv%jբ_帖^ko{Uv֫ZthェE7Qk g?zkﭛ[4ZƮGQk}O:ѫ.J9ѫcJ<ѫc-ߖѫneoEZ޷DݴhcェEǜ=:zj=m^բjWUߍvvqw -oE+-zKiz'jEgs뺥ߖ[4zv[zU=[Uk֫z{/Q{-ݞGU+3BZj=콪1ڜ:^1cZzP~Tc3ou-luk齪'3QkE-}ۭWm^ꮽ? آ֫Zo:zh{UwѾRט[O-3_[_wU-EmIo14`Zji=+ܙcѸ^ٯ^{j=f=޽;k}d^H{mE}wcOoDZEWyֺ֞ǘբZ 9OSք@֪Z`XkS±jo9[ 0VksNz:WkJKQcn'+ښȒo{b'l,1R}g%齇޳W5_;a{?:h˕TZMzzG [m}ׅ2VSEڰ]nnZ뗐_Ǭտvq+ęF;Qχq_'cnV}-eb ܗ&'q_1. s[w>ډqah_׍mr痱v c >~9{<}=.^_6\?6'q_M!v ]B]zsf˹ \Xm\VS>dWmbm8ڃp8eY? &n}vn`:AѹX*jn]zT֦6_}11xsȦy?h}j_^ܧu Sٰ TB܆1 nxnP^{F6 w¹ =cl`ۋ6q A ֗6^;R[M>^魴֨ޟ0ul{<|gZEܦ&~ξ4?^|=6Js禾h?7ml @{Ysޟto?I'ϧ7iJs-ǂ7<#͚cGxy=m<b_I-Vo} ;L?m66n+1gZ~h66}FXKܙuڬ;cg8Y?vG"=+yF}(=kq7Ng6Խg⓸ϏUֱ771_.i߭-g#;|x~qMNlzGݧ13=wܾf;ˉH{џ[{$NަMkϹ+hAϽgWJwFYӟYHb-ۛ?_ "33>\lzx-JV's?dvN=o{Iv縘?wVk|َ ҞZpwߜOx܆w=};<== ܇r/yO猧ywg{47J!nc07=>H"kk1m=7ٖc ϮzE(}~^zǚ:V>?==vdd9ևc:֏{~o }zYkS]}zvK)ꛊqVv=ݧ ĥֽG51,=E؞L,=7a%"~3]k6 K̭ב7f/rB2Gq^.Yilz:%“B[{q IM&T7~Dedv=l=`,c;XucF`R=G}X\16$Zzzlׄce~#:I;e}^ؽ_H(͸lvv=G /e?H^GRi GVVI#cҳ1g`#mumi{8vJ|鲎궇w鸅8Gjf%;SDz%tdNUqL#9yrL$H,jYwj72.[L{KK=5.]X/W Im\JyFieako}4x F7F/y}z"p'l]reqͬgZG~1>N key'3=y)ivN=e[D}Sa D e;DDOt~!':^ Ot~ۆ:&?@d l_h?(+esp|5m1  <;RgS+@x&c  #?kdB{u|n_ <_YdEY ;쟿=`7+ːa}}<@!@ء$@x  _3טS@xsO٭_SO<@xj <@% @xR $ ^k f ޲oُّS@x g]@xlf ||X %98a;- |g N'-\Xd;%jwֳpKva%aaX @xS7,@x[5@xӬ >ZOꣵ LvF -/dz_7 r `20Mf鬙/57V2ͮ+;L^1aV2Lx?wFqÄ(„wrY2A&FC=LLa00cMjE&|x}0fޟ9LT Lr0TL-Qp_c g `mÄOpt0E _ &|q6S048L30$6˄7LxfWLx 0@ ^wtB+C&܁Y>&qY&^;q}{D =0.N{^=pÄ4‘@ᾬM?Tx,rGheܲަ}2s3 hx 3/87+8Id&Fo^|3퍰5|r>|s>.u#t]~vbn"=1S>|zsqҹy#\,u}Ntr$>|hÇ'>|‡;J8+& fZ۽am y ߑd)==g5$|-| ^@u֝>ӀkYy=)Ad ;vk‡7>>0‡7A7NbÇ7>>q`>^L>|6sOa$o>\4|a'|%>z-u҇"[a+Ç[C=^|x|!l]ul2P ×$v! =v<{>||aFߕg*QŇ/qqpehplcZ|xw>HF!^Fa@|8W9sl|xβR>|3ÇL@`G0s #U0Ň)N\p Q@ߏ!LpN+yy gpXZxK0^p)Θ`4C0| F0^pY&(N69÷WU)΂A0pC0<4kO4#_9^Na0׉`n`l;|I90& r_|xc-></҇KtŎWζ7|xfq>ܣ`'d2Ak,Ü*OiKs(>g |q,rd|iq WLUt < |,D u\ŇG{Pax|3&ÇdGFS0gÜ?_i!a&6!r}N$|xc>|xtApg oÇ7Njo8 o>s\.|xg+>uHvBÇwۆd[‡wuΉqu*o-j}'9‡]!j EÇV 'Xω\K[:'‡= >|a >^uB'ÇOv'>|ȕ-9 1b&|0|>|qZ>փ+38|-|ORasŇ H' Bxl"Q gebx#((9-XQ^1doU ŰtU:l_:PŰ4SŰ4C0(O\txI7axCYo3Q鰊R0V E֮t.Bwq)|_:L.}*;$ >TDBX9cS:F!͂)ctPAμ)M4pe8bx z)w(U|>H1:(3^>ytt>YHϛbbX:b<^*_Tr8t BC:|):tXt_ŰeT 3bbxE!bXş)A`,JOi5tB}_[ZbXEaR *pQ {*^(WŰT Wbx!;bxaQ1lR1#a?aJ1_ʤbp_!oUtut?HaO@xs}33>{H:|N?^:|=Z >Hɍ?JU /o*U .:L6&x'07:Jc tKQ /*-Ooӑ c\$dp! >آv C|77ra8rM:<#8˃08\ Y.N\5xWqʅOpxhW`8raJpPS``^yK.# |mʅ9t\xSDȅpWʅ/x`\88rC.|֧g7pn C. ,B.|g|G.i "F.,-@88x~&hAF΀47 ,n&M4bP,x*ra\i?: 7ra~ȅ@B _g^rOh?::8*8O`8#C,8D|~GW8Vp88xHOp:g KKuWIpWp"8xU= &ݎ\xF.0Ǫ|}ȝ48_ncr׭D ;'O}(lCn . \ ( EALꅻb@~a lok[<͂NqT4I-w>ӎ.QS UߙYso{zQBgY X wFC["wQK]Iׅ]YHH;U Fk6X-wc%Tp.o1C w f+mpi4+m4SmKnZG =-m0m0GiUlHrt6x~A >>nۿK [6oiwJ_RE/{C>JU: e:*K^'^kzZC{_p_0WߌG=?oi4[ťjG-6Zm Vk6XS?h6`<-C_O +;?ZA'm0gxK诧U -upTh] R 66X`UjWq6`hF\Rh~/|Oԋ6!em0 2K3N:hOnL:`" ?`'005|bhEMh7qoc%} g6X^wtxG N.Giwq Y ^>u@P|?l&q(hwqorK4ɥU"6X_ m0wJ% mzҡ >0{2p*M08 B%  C;:6`I0;:= zG^рd;z}iK, 0 g }`pBapH #  ^0j` c >`/0Dȁ:^)r" >ʁe qo`u!$ vv6{0,9(`%`Mr`;SsE#=0x} 0xUv;TZ@q `I9E 4a] ѷ6C6ܫ6hח66X1҆68WUJS # X>ϟ`2hDxGwtѣ=;z(~;pn;u;z=}G}_`άw;:_0|`K<ǓYmBm ?Vl\=QigQk6x`|6x'Xq m["/i ^>cFG7@`(h7 `2hɟ &{6HKFLUʦ0% ء0dD.z Ǔ` fI f B_`|p0n~Ph =я6x=`6 lw1#a`ɁO`*-aƵ,hapo`0(~_08Y<Ǔ/ Go\0h80}^8`r `*t7\ɞq* ńw$ j```0Ld`0;`05!wF$xGKKl-@`0C/p`0Vm0|Wm"]MV}*`Ti( ^ w.*0 >?oֈݥ a7*}QWa-enlwQKxɁRyS:Fު%}(9R*%m-RRKxGZ«Zj ;k-vc-a{C Ȇu {B6|ˊa! wpML-aSKxOaٰe\|᰾ o?a| jaÓaöp]|o>Fo6|.hwFs FF9 fPlxQ llmlҩAh_hmņv1l(lR/So%+7V lmvoFSη-e$p6}aˆeaQS (K(eço [GB6,K [D6X6, T:,et*.SK8%/5lj†q3zFkF7;EQ|Ć6.ذCeó|aìK[lxEI]xto&Fo:ɔ + ^T†oaa|h}Y3lX3`ذ$lML}R7ʥa>eòqt?V#o!k} zapÆo_а3d8mGa+aq&`xV;RHmޑC%ba]"0, /d= փ >9)E+`X]`X-/E tZ`X*`X7`x O0wJQa- Üa!'++0xW0BA0T»C ǂr~7 #+0\{@˧iY`+oE *V& ކHDH a<`x4R O`KiU'h\`8cKpR /Y§a >Sc8݀aa'`Ѐy10L@0k: `xe [02Ea`FEr0[Xt&`BGF 0C0{qp !qpY }óg W5߀UT)*n.m 6uA%|=$8]N|(Ѣ>Lg:TQ**G%X.^,T JxR4|< W0<6ɏit{/ U%< J8.U g#JI*lT b&!J#0TmѮ*lT o/0TYΆMpNOV%|}3h=T)h$Fs hLaf8o0(LJXSMG%\{MG%\}MF4:Uhj5AѢi4hF4ќ@%=*_;)T,Q S 0BT¬$P cJ.*aP SZ0P P YP STQ@9k*%w f ^*oJx͢0ffSEǓ sn0R7`0;$ØI EF_DMitE-ٚFGyiCH[P S"0 sP0, 00l⨄L _qATKa-?lQ),%4OZj!]f,|>b!DXP/(}-0*(- (lO>ibE_>AY`PHS+"<)""b"bD_;0%?@~""""~∈a!]O^ _ GS`DЯX`rŗei (_@q<_ _yUV>r_ 8`:\{D*PZ Ph (@X`A"WˇK(^ǀbD) (~IDl  PLAa ߂_ _?bMŚ<mςbx'/(!RU`*0lAy OZ6ok@A2@zooOϪ%6gIwrI-ŋ%ŋ%fAbk -A%(.:@|( (| (1ϋg3݀ZI=@Żx:>A7O]@xXZ_j!m-? 揃SGޥGO/^qV>|sX<|+ ?Z/WGG5` 4 voa*x#tIKJ~4 fAq?$çCC ~HO9[KYǍX@O@O˾B' ?2|hV2|ŀ wγ+!ǦcpaȰ2 .dx߆ +2Qdx !* U8dXY(dX&djʐvȰZ7+CCW88 Eq(xzqȰJm%f.>y)aq=dԤdXvȰcȰfĐaEa6ů?2mcG#UV2(X0a< Ix ̪F8ddxS#+HV2]d?l%' 3=dUpTE6 ë<0_0DZ2 d^;s? C92 HUCpoȰ'J ó%Ù ;@! EH'/#aOK4Gop7MF.7dXdV#?07XaIBpGGY !nǡ = ?y>QId8d8AӒ֮tx?lG"$iwJ× Àd5H3+ι3%è sp%rHZ$81Wd|Ҩ$7QÐC?z\'a3 V9Pc DžZ?z,?:WpưA6 Z?z~$RbAj%;QI+^!a֒%fu2́*Ȱ6dx+2 BɍBk c2fI}2g s2 $@˨r£?^!"׋ G2d8ސa8a 1$:!K2=dxdxa)aj%cOIdY$ã Bq$"eQ w YA* <U2 G2̻E2|gs㪐aO#[2b2Zj8d=d d%dSaJ""26dxCT2˗dxBu 2\*߮7 2i$ìCw8GNV)TF2%ц w Ӳ F2L0': S$|a uGr$̩H*.Q1d=>dڥm.2< [\7d^<\O·P:U 2 O:Q:g؁%S|";QPXh$6 @ᶨ;ᙃB:@ 𡺘:ZWغMf]aՙ@aIR ^/unKA_;PG S.a+( ^+Yhj$YU=|PBm=}Zx3ugPxMi wR [gT(ֺ»ja @dI~ PN2PXP4PZ—@ Pb#bR _M _,3t@(\CPԖ@oM>xW?P(|TWiK=:Øy_ufb=d8KWa s}uYb_=c>_=p}(|o 7!npj@aAez:WUS&yQ[P@uU딬zX5Y5-aBaą·N@qҿ~0 ; u: sA<ld0-4>(| [B(_(Pԡ0BC'u>պ@aw»€{9W'ooW=!NPx=PxSެ ?ÛjpN (X\W{@u}u| @ᵜZ=T^nչ yZ(P^ o:ASW /s+,x uRZWXuXWwpH鏂3n*g))'t"cE=>һlV00VBU%S<(C -/D \qLwD\L8%- "_q1Dx8Ëa3)[gEK<*iVvxo|uOo!9" "،xӒYDrq)ET""'oxXhVqJ%".&,tJ,">ag"C+"NSؚхAĺ-]VKD|ÞO"{!0 /C D0_1"- & jK gÓ8h jq&BFq oxUJUbxz3 0,">dAODvUb,"F\8[&L P"3FD-"VK "+DRbSd$P0m2nGN%#<wI |0+^K<|3&xv݇xU,s pN*?L#1I c$_у˫qw/"'[Tx~Uc xx9aFBe,!^,BhS(pdƊ("f}ZQG<<#A'5 s"q:Gt1X*}uW飠pw>K /i8\\W-*MrDW4ҧ_WiD"bSAķ{"*ˢ*}`U1җnKTQ{Z,8<OZ3j-MVtZZ9RpxR d'pXnAr]kSn4ZK 7u=aN}V&6 w) h&ZK~0^Y:p>_pEog8\0pV/V=L8[8>V [' {*;g |pCkZfc-}Pi-D)'Q T1^y>*'߷Lzz`1 חt)K\ҔEF1LR g ^]Ű%U Ss F1LζnXùSa6:UP = V-ql/ZOmUkc88>Z blpXpXx&>aQa30pǫp;V[1|V[Y8\Р+m@[1e &SvXU:p9pv߸0۲[+ypc}{Xџ/CU|pL;ppIJ:XvXSv8CŰ)Z:_kiZK;}>Uޅ3Vew6m/v~o ᭬7 U` /a uLWb yj:8N*n L0sa wÛ]bQ*఩N*e5 N[8[8CVp)c߁֐{aa6Mvw]-wa9`؂πF;|Ktﰱ k\YG,-XhE;|hw9a</OcYa_Z8O> ajqT;V0hhY0AJpF!Ř9W%f._0,S_ o_/0 'Uz6U:aCdp0'qpN7Zpifh}82`x>pз%LGy˃9`ڵaea]êÖv Y I0Y^óF#aWMWŤd%̀aUȖ>aTrr-7H0LVD0 mn]aĂa%bÞ\ {0\9`B a6GMUra4` P`X #`x}KiËvn c#s0, /^Ɖ%Xx>:aԀa,7lm { rZjPnba)7yR )7Vᷫ4~K;0O Qb/cB+`i`a<( S0?UP7`$`r}hWҜ  /*=z?`yJ_/0^*} S\Ǧ\Ǻ0" 0|*{QJ0|Ws({T ΋(? (8)7s0;3l W-V-0bjU;<^`x{8K0  )D;LtKi=f]`cX#y,Ylzsi2zwĻkc!3 0=V.7kvΚ%`Da>ȟ dN zZ0k6`.冕t s >p Ubg%`b[r +a'}CiuXy,.a=7 U0'",7[w,c}[\/D?WE gj 0ݥj ,ְ@ K O R-\@HU XT kZ0jSi֦V-|k*5R w@.C ܹR !~;w|3Lj `|U cj [Zn5l-[k ;YkX iaۏ\Pj XZ%k kAlawp޴pQ#9J{Bp3Y@! s0= _YFPp]bwRjᾴ |X U ªkU~,]ª‹ fXҧ iқB7j BZw1@Xpj%'T ?ak uy0 Ta8¥N§f\@Sm6r2>zV4#V!' ,+dVhaCaa+ O[8e50H4@Z~ S:P*0ְRPuf>*PQ ƪ7!j|ja )G-{_K-llK p@}J-|ʈQ 'kZ8Yja<^_CaK֯0B=jp1 Q + vO0@WjvGRn  R r V ֏(9ja}Q ے1^-(+vY.ȁvr0OBI(|jw80«ЁU%̦7(^jM ߊeV J|»8P~uT~סp>(lmyc,((ΰRPC-|ks-PXS“a»NpXKZx"Z8= ZxG-NCpR =ҹ25k(PR!UjypJ j-5 04R/RMRRù*50.Fha~(v]%Na=)pJ #<0RxD[j lL"Ujx0RiUj8ݹJ 0-5LA` O0ZbӧZ3jӧZxR.T~ )5J Ua1X _j'P|=  &Cӝ>0o}S (<^`  /Bi@B ( /Px+@aŒ@@P:sҙ4<7^4>Pze(=2VCX:k(=4a pK ("BC G S2`cB|'(f 4 ϸ Ϙ kn(<`   @00%@a@a& 0 40 Px& )ZFM &($ (   c V(A^0ZWQj P;P@aW[)1ja$MA-eušTP?`= C0 /@`30;PRe(t 5b(= V(Pz@#O)J\jR l:PW (L+ # b9`f s(L0čR=5Pj|4jaLP kDFQ s]Ņ1Wq~j,q P2A-B7jac(>xyeMUjU pœC-0UvP Z-jas&PX)Pji cZtQ 7ja-Mp/Ba (PDG-\:jYpg .'UtNlJ) JEPR 2J]0 4 [%p)WA*˦p Z/̀ag4_)kÞ.r>N0g_6[)N.Q /X«Fe1`X[np]ϩMeާ`EO)'m¥\ 0i V-`,`Xk gAsa0LmTMaݣ鱕`jU 9U`#Cp)Ö  Wm_}*wmQ k >=@>Q -;>:RCR XF),X Ϟ /*FzÂmkb#FO2 r,o cS`EfaQ0,( (0|K)h;ó`0`pa*0 lP^`/0 -0|$Â00*)×v_aO O6`d [V0| c5X`x 8b\XhsZý=m8jlg< NU _k&9+>JI0|X60o0ܓ'e- =ީ+`X_a".:7 c[ ajaR~lQ cRߴ`:Ia╍AXMN³b“6.`x,`xo))PJamU [ URaT#UQaXJtTP%lAKTRagpYRaXeTTR%F%Q2UzMUG>YU φ]%,A%,*0“cU@R '5[*a0*k_@@[*CpT>z7AJ8mT7*a0`r#7]CF%|Q "ߨOvTš<U՘ҧaU z t [Lh!ѻ$O}5.S먄W#>Fl{ 5;9@X"@xzp“|GI= @#X75@xQJ x!@x>`]6Ѻc@<@CBVFla*N@blᴜ06@Oժ0,[JxY @#/"_ D40 >z{ZhdUa8 pZ+ VBGD}nNHa 0/GUz죯70^>5<* T3՗}K%+GC>:?Tate->"p.C}a* + τG|WB* ˷/÷~ d/_[*>gRt),G@&@E9 R2ǽFUMd @f@>?T9-pP3 OU@{ g  sx |ȉF@f  h.@>_bWq*g -xJU1@9L c+:x *^?T1.U@^Qk mE(?*TK*I*6X:la+[HH8=ΨH<ƖRh*=T;x%8ΪtU/*&ZTVU_PU_8(S1Hnzd nzl4QZvӁȌDe7=Vee7= oHicEUUHi&Ue+q2ڪHO4-/U1KULHƘ/LL"EVE菭H?y%VGT$KHDыH1O|2_Y֔4K2>,5fӘٴ[UiJl1!"S4'lz -ʽh,іn4H\AnDȘu7BοgY*Bc6} dg^fyM~4ØM-n/yL٬yќiMJO%[j6ٴG*4>܋)lk6v]!_yL_M{$B42@MolT"ٴDY3j̦Dd_*D̦*Uϟ*%GhD 6bjEj-rAʣ?OO8b6-6N->$Rj̦lZszͦц!jA3P[\1xriEȮEGDl !k/BV d̬Aȗ|~V"ޫ1S/Hhx!r!;7Ae B[[F(U[lIŇHmu7A+y~2 bEjO/m!Rb=+EV3T[_b-VpT"-_141.X2ºPdPdtPU'j)2E#+E΃"6Cl"^ӚBM^4c(.Y> EyC0Pd*"e[=HL(I-YP E@WPd6)EOK,KOEVME>e̡ȇ7y煖44WiC?"+4XpkZ["k EVIqȻV̡LRUk:dŋґs:GYO6GM2~(ReZi٦P(5BNZ"E E.us(E"+Y"KZBه"ϟbΑk^9ȎPdբȧ*PddkȗJa)2UQ(2y"yȋ89CqQdR4/#+1GV<"•x3"ě:b)2"Ĺ*B S\%CQC=EvlbZ*WxMsW)6kz"k%+^&5(r`.~yMbeŏ4]&ʅ"K t(ra7!zMiy(ۿǿοÿ_~8Pyo<}O-c^8WJ^.W~n?g~M^s)8S0뻞\ ԁ-nGWW˺޿֩x__%>GG/?|y_o7GGNn}>AZK_К?jM|b׻C2;?~,B|> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 12 0 R /GS2 13 0 R /GS257 14 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F9 /BaseFont /Times-Italic /Encoding 9 0 R >> endobj 12 0 obj << /Type /ExtGState /CA 0.702 >> endobj 13 0 obj << /Type /ExtGState /CA 1.000 >> endobj 14 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 15 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000027442 00000 n 0000027525 00000 n 0000027686 00000 n 0000027719 00000 n 0000000212 00000 n 0000000292 00000 n 0000030414 00000 n 0000030508 00000 n 0000030607 00000 n 0000030707 00000 n 0000030756 00000 n 0000030805 00000 n trailer << /Size 15 /Info 1 0 R /Root 2 0 R >> startxref 30854 %%EOF brms/vignettes/me_zinb1.pdf0000644000176200001440000002005513051356434015432 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170216181050) /ModDate (D:20170216181050) /Title (R Graphics Output) /Producer (R 3.3.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 4096 /Filter /FlateDecode >> stream x[͏G9Iw5D9!:!{꽚]d&vr뮮W}ퟷ?>gK{JXI{[{[nmo}ˣƃ|Bɻ?}-ݿ}~ͭսV澺I+mjRާĤK5iv.٤d@% }0v*5 {[% =ٓ sހ0L^²]hw'"d9]5tGPi5^TZ.'C@P}ړ s@} \BߧK@@YQ+ ګ7Ag]rt~>Cv1/Gٺ#4Ml.**a,dAgmc9bB9cs \t[)Ffk嗧mlفt/Eͽa@ fFHэ5gR}]q UiFS@,')dJiiqdCZ?_+'ջ8iw,G3U [q8E˲[v.x߫%yP CevO5!Om5253MieV,~^]z,e{cXFpdžO5-"P3 x7a"Ƭ@՛Ɓf/eըDY/:WOuo zDg\֫fLqݎR(Ok/e]+7 ~hi!r' ,hxQ=~ڻ<tu~XШ,8:|q+#JX8cT"3?~"Y#{FSvr/RlLJ*|H^maH*%{i(M)K Mc#5b4x"O7&7yhAd0rw6-A݉Ɣ 2W  "밹5,J)"Ğ?(`Bj'H;pFn 47H!9a՚|*Tm+c񟽸Y 6_H m/>Mls_}yK7->n6>H[A3;+H p$UCK@(H5 $5ZK@H-,wt;d؏6|*䇽ҚXpV8WЉ?|i b_9[%O#N(:}IU/ H$>Z3`24!F jQÚaRaad5&|FLCI[$_AWf_<"#x[i1/}/&[QMxL sTiHU/$_uDBS## $'PU;8" W 0RR%L~E\{#+WrzHHu@QL@C$֕ $KF@I6ɖ=hdLubdM)\W ̾^vG2Yɦiy ~dUՐ6c$z%,egW2mϳH(H֭p%V/Q:~OI5o#^GɥtGI2y}M UokB};U-/4x/Gkߗwۯү~1E槾~]y--lۡʭU1dQ 1 ;/x0g1WCL$CҍQJ(u xÅq-#:F;'ř-_S'uJ[A-wCyCzhl%]֊zib73_}ݛw'A\5].,;coSK8JcQݛωG8WV>\A&-z! Rw%y.\!7$p&qA $Hu$xyII^& TYOIS8(iXIsE*V 9s&t+XJKsɳi4ٚ@0@V!)m4Ɛ@} >5پCƌ d BnY ߞ,֋)2=&3L@V8,ZȹL z F5T\GC^5r UGaYbx-[cl-rJ9Pu@g%%pIb$Qdw&{A0ՒD"]22xrɍMcQd;ZD8/@*z[$ŁTvNR]R1At - 1ыR49)@+¿ F(>+ ,@ T547J!DDApкh9.bCeTUE5͕J{. *rEdЪ<* @oU*(KJPDv&p{%ږ A*@Rd}g4SK'cVdr 9@db< 02h\7%k[7bCy4-0Aă03A#ι# X^Ϊ||qB.m%Ypѝy^q"rX{f'Le!4e>eew=s>C .a{AբJ>C.G@Vq3\.&-]Bk:L5XĊ[%Ű9 (hL^fLm~eS3Ǵ>bҴ> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F7 11 0 R >> /ExtGState << /GS1 12 0 R /GS257 13 0 R /GS258 14 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj 12 0 obj << /Type /ExtGState /CA 1.000 >> endobj 13 0 obj << /Type /ExtGState /ca 0.400 >> endobj 14 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 15 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000004460 00000 n 0000004543 00000 n 0000004707 00000 n 0000004740 00000 n 0000000212 00000 n 0000000292 00000 n 0000007435 00000 n 0000007529 00000 n 0000007613 00000 n 0000007712 00000 n 0000007761 00000 n 0000007810 00000 n trailer << /Size 15 /Info 1 0 R /Root 2 0 R >> startxref 7859 %%EOF brms/vignettes/brms_monotonic.Rmd0000644000176200001440000002035713606326627016743 0ustar liggesusers--- title: "Estimating Monotonic Effects with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Monotonic Effects with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction This vignette is about monotonic effects, a special way of handling discrete predictors that are on an ordinal or higher scale (Bürkner & Charpentier, in review). A predictor, which we want to model as monotonic (i.e., having a monotonically increasing or decreasing relationship with the response), must either be integer valued or an ordered factor. As opposed to a continuous predictor, predictor categories (or integers) are not assumend to be equidistant with respect to their effect on the response variable. Instead, the distance between adjacent predictor categories (or integers) is estimated from the data and may vary across categories. This is realized by parameterizing as follows: One parameter, $b$, takes care of the direction and size of the effect similar to an ordinary regression parameter, while an additional parameter vector, $\zeta$, estimates the normalized distances between consecutive predictor categories. For a single monotonic predictor, $x$, the linear predictor term of observation $n$ looks as follows: $$\eta_n = b D \sum_{i = 1}^{x_n} \zeta_i$$ The parameter $b$ can take on any real value, while $\zeta$ is a simplex, which means that it satisfies $\zeta_i \in [0,1]$ and $\sum_{i = 1}^D \zeta_i = 1$ with $D$ being the number of elements of $\zeta$. Equivalently, $D$ is the number of categories (or highest integer in the data) minus 1, since we start counting categories from zero to simplify the notation. ## A Simple Monotonic Model A main application of monotonic effects are ordinal predictors that can be modeled this way without falsely treating them either as continuous or as unordered categorical predictors. In Psychology, for instance, this kind of data is omnipresent in the form of Likert scale items, which are often treated as being continuous for convenience without ever testing this assumption. As an example, suppose we are interested in the relationship of yearly income (in $) and life satisfaction measured on an arbitrary scale from 0 to 100. Usually, people are not asked for the exact income. Instead, they are asked to rank themselves in one of certain classes, say: 'below 20k', 'between 20k and 40k', 'between 40k and 100k' and 'above 100k'. We use some simulated data for illustration purposes. ```{r} income_options <- c("below_20", "20_to_40", "40_to_100", "greater_100") income <- factor(sample(income_options, 100, TRUE), levels = income_options, ordered = TRUE) mean_ls <- c(30, 60, 70, 75) ls <- mean_ls[income] + rnorm(100, sd = 7) dat <- data.frame(income, ls) ``` We now proceed with analyzing the data modeling `income` as a monotonic effect. ```{r, results='hide'} fit1 <- brm(ls ~ mo(income), data = dat) ``` The summary methods yield ```{r} summary(fit1) plot(fit1, pars = "simo") plot(conditional_effects(fit1)) ``` The distributions of the simplex parameter of `income`, as shown in the `plot` method, demonstrate that the largest difference (about 70% of the difference between minimum and maximum category) is between the first two categories. Now, let's compare of monotonic model with two common alternative models. (a) Assume `income` to be continuous: ```{r, results='hide'} dat$income_num <- as.numeric(dat$income) fit2 <- brm(ls ~ income_num, data = dat) ``` ```{r} summary(fit2) ``` or (b) Assume `income` to be an unordered factor: ```{r, results='hide'} contrasts(dat$income) <- contr.treatment(4) fit3 <- brm(ls ~ income, data = dat) ``` ```{r} summary(fit3) ``` We can easily compare the fit of the three models using leave-one-out cross-validation. ```{r} loo(fit1, fit2, fit3) ``` The monotonic model fits better than the continuous model, which is not surprising given that the relationship between `income` and `ls` is non-linear. The monotonic and the unorderd factor model have almost identical fit in this example, but this may not be the case for other data sets. ## Setting Prior Distributions In the previous monotonic model, we have implicitly assumed that all differences between adjacent categories were a-priori the same, or formulated correctly, had the same prior distribution. In the following, we want to show how to change this assumption. The canonical prior distribution of a simplex parameter is the Dirchlet distribution, a multivariate generalization of the beta distribution. It is non-zero for all valid simplexes (i.e., $\zeta_i \in [0,1]$ and $\sum_{i = 1}^D \zeta_i = 1$) and zero otherwise. The Dirichlet prior has a single parameter $\alpha$ of the same length as $\zeta$. The higher $\alpha_i$ the higher the a-priori probability of higher values of $\zeta_i$. Suppose that, before looking at the data, we expected that the same amount of additional money matters more for people who generally have less money. This translates into a higher a-priori values of $\zeta_1$ (difference between 'below_20' and '20_to_40') and hence into higher values of $\alpha_1$. We choose $\alpha_1 = 2$ and $\alpha_2 = \alpha_3 = 1$, the latter being the default value of $\alpha$. To fit the model we write: ```{r, results='hide'} prior4 <- prior(dirichlet(c(2, 1, 1)), class = "simo", coef = "moincome1") fit4 <- brm(ls ~ mo(income), data = dat, prior = prior4, sample_prior = TRUE) ``` The `1` at the end of `"moincome1"` may appear strange when first working with monotonic effects. However, it is necessary as one monotonic term may be associated with multiple simplex parameters, if interactions of multiple monotonic variables are included in the model. ```{r} summary(fit4) ``` We have used `sample_prior = TRUE` to also obtain samples from the prior distribution of `simo_moincome1` so that we can visualized it. ```{r} plot(fit4, pars = "prior_simo", N = 3) ``` As is visible in the plots, `simo_moincome1[1]` was a-priori on average twice as high as `simo_moincome1[2]` and `simo_moincome1[3]` as a result of setting $\alpha_1$ to 2. ## Modeling interactions of monotonic variables Suppose, we have additionally asked participants for their age. ```{r} dat$age <- rnorm(100, mean = 40, sd = 10) ``` We are not only interested in the main effect of age but also in the interaction of income and age. Interactions with monotonic variables can be specified in the usual way using the `*` operator: ```{r, results='hide'} fit5 <- brm(ls ~ mo(income)*age, data = dat) ``` ```{r} summary(fit5) conditional_effects(fit5, "income:age") ``` ## Modelling Monotonic Group-Level Effects Suppose that the 100 people in our sample data were drawn from 10 different cities; 10 people per city. Thus, we add an identifier for `city` to the data and add some city-related variation to `ls`. ```{r} dat$city <- rep(1:10, each = 10) var_city <- rnorm(10, sd = 10) dat$ls <- dat$ls + var_city[dat$city] ``` With the following code, we fit a multilevel model assuming the intercept and the effect of `income` to vary by city: ```{r, results='hide'} fit6 <- brm(ls ~ mo(income)*age + (mo(income) | city), data = dat) ``` ```{r} summary(fit6) ``` reveals that the effect of `income` varies only little across cities. For the present data, this is not overly surprising given that, in the data simulations, we assumed `income` to have the same effect across cities. ## References Bürkner P. C. & Charpentier, E. (in review). [Monotonic Effects: A Principled Approach for Including Ordinal Predictors in Regression Models](https://psyarxiv.com/9qkhj/). *PsyArXiv preprint*. brms/vignettes/flowchart.pdf0000644000176200001440000013154413202254050015712 0ustar liggesusers%PDF-1.5 % 6 0 obj << /Length 1630 /Filter /FlateDecode >> stream xKs68ʓqMLfzp[#1R=N~ "!yޚR^ {DyO(+nS6w67\̭'rr J'u.iT!*Jt@f06TpD9ZK[iDlP(K9 iyCId7+Tr#.b|xe`2,֯GXXfaI[WA71j9=qPư[;, &`rEwM9_?}Ƕ~T~r84̬4)O9;~=;g}P Sei̗٬~plAY)1uMmHK40^@ Hrb\ aϊ@r "KD^RcTy D5,wH5$EDAl A!0d հ1ub6$߈eP eanʎVCwX2J9>}&h j(x-en?zc{ALvV>{} s\Q/PCR,4N0UhM`gBfq03( MTSM9dmzn2/\b3lFf3 h>86F96Ćp3ǦoDw7Vp37ZP}g%-=NC1% xj0 _7߯r:nwOv&*–D{:tlL(Yrggǖ \I/r|+Jp=>˕hKsRؙ:KK$=o#DSS sb(L Z1?фaF)M8;yv: rm_dRR!rScF8l"(kFQע![z5$X'Ì9ù=vXpA\6GWM(L^{D@NX96nmP1 #zgwr >^TS]`N %[sJ6ByTpҖ9 vx9D1 ߓV(%\*ʵj~a!rSUѱW*{aR0q0h&w*hPrj@7!SKjZ|avsFbMy\{> endobj 4 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F8 7 0 R /F15 8 0 R /F16 9 0 R /F17 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1 0 obj <<>> endobj 2 0 obj <<>> endobj 3 0 obj << /pgfprgb [/Pattern /DeviceRGB] >> endobj 12 0 obj [777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 319.4 777.8 472.2 472.2 666.7 666.7 666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8] endobj 13 0 obj [555.6 694.4 769.4 755.6 1033.3 755.6 755.6 611.1 280 544.4 280 500 277.8 277.8 486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4 390.3] endobj 14 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 15 0 obj [555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2] endobj 16 0 obj << /Length1 1486 /Length2 7258 /Length3 0 /Length 8243 /Filter /FlateDecode >> stream xڍ46\{JĈ{"1bӢjjE(JkԮUUԫ'$usɪgȯh~P@a PFr<<( <`LF!^HK$@(!C ;($̓S wrFߤ$$~\ap( Іa7~ -FI @\=PN>p3 9~@\a0 9=>FCaH/p`u!0Àgm  BQnp#`]U-/A:2 V.ZS] MI,:~E:;%N9#_/S!!AlK /ܩɸ`y^~]D|vgqZEJ5 fzI`u|o`^:7NcX<̝//a1#$l$3öMKOcqA}bW` p/ֆE\vاj jqex,dZdfK@ }wDL8Yҙ:+.|%M^x-@ .!ENS4Fm AZʈc rT?F#M8?t [#ve"r'?oXH流jw=QpN]#),zg6聫$lg *?8F&߸G_jZV1F1lj%^4y|=BC@g^d_mP1fg˴Qo]vTu{Y|dI&6^8J#AOۓAIHzI-|7;v~8S ?>KiLɌ8ΥDM'\FmY$^E`2I}ۇ(=7[.e]AW$4>rZe EVKpPۨ?^'60a8]Hkhg쓃J TW].՞څu@m>Ạ̊́ FǬsDZCd#h${zw4a@ЪTn_J }E1"lX$_e.]˯h,}z826oIkZ[pتsw}72$O$*E~v!˟$o7&gBK5#_Wハ[߽*36 ;K9I \$keC볺!a֚i\;@Їw[LO毜ʲ_p'-3*=s32#vg:X-w |_ f]q(,̈K%:~taPo]EJ ?) vB=x\g!Yyt/nwKgN?#dM {wʋ3 sltw|S9a+V>1D v:G~4!O5Rz|Lrdj"alüVB]}KQ[~qM Qekc YIa{nO` \Z>ZʝNjBh&ΞgURdI]tksRrF }6ةܱ{oh<*A\x~I~63#aMY? NuA }:Be Sy kY,$߱B:_9[s]rxܙtK!曮enng±%Պ:h\]0|0a:PanvgL!E0"k#T"ʂA˪wO y "d}XM@rbZ?[7Hõ[ͮDݷڊ۱N|-NFQjPTv`XO=L9/[?ZY"\[9;BbNOלm=Ŏ?,O@zGI a2EAgOvRvjn&_%&J!5Nt(~,'Qy K(AyK40Niz('N{$͘lpa%ib. –l*-!x3ITOQhju;\: R!|}=z;q[|Fa=usT\E 'ɸ*퉙% ãƆpz]L㴥ƐjF/GUˉfCQN8W,"f䳞QJ\<3Kb]v<~yy$O{W8ឬO d=3C9$8O҃هtgN30/X#_6g!δ=W,PB={XRg(%4]pAC\P^DúOϖʛL6{ӂ\ai*Dӳ-gaRv]vA G|Ns^4z$7w n =/ 36:Tǽc=ĶzTkxYM0#>bX ms`,FTi~qp{Rϝ;cs\#,g@Ow(zP.VGpZ/X˰?ww \QLx VS*ϣY wI& 1Ro:ZIySܟz7v*0ףϚ~gu瑍Y!NѤd2!+3{lSzk"IX̞݉s>ed%C$Ƙe7GFvBchĄĴIP^/ [nz8VcIB06ͣH^ T~SҥxF}([;6G;OnѼhJj^!D#1W{v Ie0s4i+pv@eUnYםWDKF<jX%Ġ ]WOS蓖4ni,>E(ߑ{EOo(p)`Lۑ:nr0W6w"*0ZG)EEFfc1O)T1e9!s{]u{:%uݬ*NC^U,>A(- V!kYաİR^oVSUe(*UlZ|R|;䝬T/o!Qm\[W3GIUDpmC /'W2\Iu5/r oIS㘔'_WӠH䓩87%=q^$adlAes;1hj*`$/-yA\Axĕ+SFR(*UC@Ʌ܀δr5G5?\Iv61[J;o;@L%6w#z7'Dh ;x"Lmj.4,ѴS4֥~I P\Ph.fTRI$>6Pu-aAeeέ'f<3At ]yPxTP~[=iFxK6g#|x?%W-~x!)?2'B;Y&T8c([ӓЉ!62.psA![G"#8> `_ ӪwRk&pTO;bٖ]4++tGI{jG߳MB4Yډ <a!bAOs?+J>BFy^ .-bM^6/.ɣf p@\l9,-Z}rdgVO؂ɉ>5~jԅ˒I'^Wy>.9yaEoZ]?BZx /+{*V7xY,lOI9ӅDŽ 1:4OLpɖͺVrd#R&ՏYaX(<* -;wN}Db2+dP?diVvjϕ k#GD٩s佸D2Pw$@FLuG.-^^j64T9JGngѪbi:OjpZ(zv~lnU9u:ρjdiNPDPT#X#C/)|/J(2rYx/?2puG]oY6Wƒ;I%LD8Xsc{]ߵ5X~we*r|l0i/AH-U^g =0WǘZ2ooy|^)L) Cw4~h܇an)780YH*# yYY{In䄳B#k"gE:_ƻZn284?j+ >GdkE0#&70Xm3$w X %+B~*=ff7W1w }D@iM}-eYAu虊KƗczKˡvKVaaĄpW@s RO` ?Ɇd&tB`..ꓕC$ aCzz E1LC!(5-@NJ ؒS 穿̈́ψ}'vEPGsv择$! _ym;]GKJ].Ҏ{5Of2Vԩ|gj׊$-1F%S÷)T+YztGBf̒#ӚqG S'$a"f %֮S%/BH]dN {!dhgd/ݨV % "glS 1Ij0y)y"@D-ąxz~) 898<jJ[mfEQsȼUOA &)ZVEˑ*#& RR,[9}#'22PqwA^8Ķ߫N[?DAlaQNߞ߮60o{(2WEꪕ 3 N~v(ࣦg _?:9d endstream endobj 17 0 obj << /Type /FontDescriptor /FontName /NBPXCR+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 108 /XHeight 444 /CharSet (/S/a/b/m/n/r/s/t) /FontFile 16 0 R >> endobj 18 0 obj << /Length1 1777 /Length2 13171 /Length3 0 /Length 14290 /Filter /FlateDecode >> stream xڍP `ݝ@$;]8r9jf^mwPj0Y:AnLl̬ %u6V++3++;=o16/ ]&iSrl6n~6~VV;++.I3[K3@tEptvq{#ւ9@bka(#Z4-lnV͉ӓZifP]{l?>=#eQWRPaL&v.VC~_7TQdO+Cʎ 3\_lOs IS6s>nkKJ@K[ws3{_1U hjfa mA@UGW?{},>?(S|ߧ )pcعf..fG\_ z9fۻ < (!?_4XA|"wX Xa i9,mlޟsX3|OO,r,9 /_=ۿ /kKavua5bL{B3T{:tLK.(Itՙ!.bI#}h;R7ˤ/' m jO~&_ԧ'q,<$'b{q -O΋y9 U?X21_ͭ\60,Uy91=ƥ F7R/ E|*4]{)!o0Ʀ}q|KV/z  321gT۪ǀk=Ɩvsa41wjKL\UMb0j9>:n{Rz6'A-O k#ߙ"RGGwzu Y{KDg@C=x}C~?mBs_xܵ9`aʭfޝryYo!eA!1o=FM8ZrY,YMukeLBHa_vV{Se@Rt4kz%'мϧ_!1Ck_is ) 5NPWu-Oeڌ1(q NV,SY@a)Mb|BݶO#i\Pa:֍`xa8冤H13wRδLh0=׶j>1la A ;NQ 'p8C89Ẹ_ꘪRydaL4蛯b(Ku`ne`<0ܵړ='ss 1,( ֞\q4(߂'&RLHXKۏ.3Gl.s6*kj2DFMEyOpMr yT9戯~˂-" p(q%|xB4_wi^:m}wU0(lsж=J:sxTK'y  ,V7YTRy$bt,e8\ebwYU?zi)uA0_bRx}h\B*9*!`Ϥo}DU:|*ϭ53s&Ua;cEMBc0)3fPt <}C9ypjQ[Z&59XHvb1̝"|+8p:ƣfP1TU7m;xyIBO#­s 6Eɥ75̟RtiZ6]#k9,Ka`ƩƆ[3(v.j6Vj,sK/leA!J9EWEk-=7x<|J㕠މxg11Qi|{ 0ɽP|`+>v:-Ҵ;y6AЀl\87AW{eYOfEvsD [i2φHrn q<$`\ɰ Co[xKj|0(d5Yn(D ɾstםڝ|gZX1ga z# r55}~CMaKlM2TO^7'^,/i%.|)A-zlnew%`#gcjsg zg샥ia?)_G lnYV=D{ޠ^3YS'(,!e}o92@0!]9=HYI>qʷw NcSI|견Xt::s3L* ciLNQjO9ˮsYT`\8st\^hԻZ-|HZR4}٪&ίCceIihafrO\5zKQ 晞3пv(nQ/R7„4TО9TO4ujrKnToə=%t<]Ϲ6,Z#=&_4.i, Pb"m(BAtFeb_ƍK}3S#B%[&u>U9E;U$&gy>6GK' m8.71eh&EdPrL:I5ƀlq$5g% U/-‰jN_"gz"Xb`5i[owݠkDChYeF&ڰWԜ!>%~ФiFw&-+J% R, 8OLIh0G 49哕GÒi4R‘GXxu^~t+fѲɕ3՜Z݃K`Sd?NffJfr-[NI2ė4`3m6(cj6ezL{!.f\%U=ҹI>X"#)\=0pQkS_CG$e"v\]CV'竫~~HZN@f5g8?"U{R\%]'#X[83pze=h1Vw^vVU^'ap+7d~ fgRiy, Om Rni«=pz4vGl +l3C:I͋MА3͸Ndؒ3)ON>ͼD}QqS;L}[˧YرKMΏl('Ia'}2k>JǒAp# EV[rBϡv]9 + =t[Ωi =#bɛ[eKX"5@: SY<#vYYHO>oopx| _4Jt)w=GTB !bB h:иX4ِP~ٮR?qq0p0>p C8n~/ AUqJ=uؐx%{2x9ڠz"tkL*ϓԌ)gJ, n`D z0 uB 6m9DRm/_s4#r{FĤ8E=\y`* 0m(3M?_q-i#WѭesplGrإoZ>Sfs1uZ*&!; o8Etٍ9Kd3ҍ{'uZgHwE_N}/NgCTJF ( ~p+z'UAiϗ'̥b]oh[d=+<(=z$pDv+KbH QݭpB7y{uz)VS8'd=ƵԖQgd8qŮy-4fi)un4ZOR&Y&qH9TZԱ1U~[y niKO}p9,6|hZ5Q_:|Cvbfn3ݣ˝l$1$@|߱:@p Y}Mme2&Kc\3)59 UX|/Va틜F H..4Ii4FeLhZe^+ߓ="gokt6:0VҒ6q+̋tSL$ OF(})I wzFKiCEW-.8\ PHlݯCa2Zhria#&O#s|r83例pZ>JgZA-ߨnIGzU]ZcFvߴ(j^ŎuB,puDfj)C^6 _пq /Pk.*s'q7> eޠ޲y1Y>p t/[ h쪞W1y>FR?pIja ZDP!+" Tg\|eևGk:p0+uO0tџv\*|"q]R,$MY>?P^38 ǃt4TcƫdhBpVq'Ǥ.'eUyzqIvuFG0,Ρ3N%ֺicEs4vZX0DK4,EMb0Dw"}ʭ܃ vpU*7=Dim1.b׉S*. K-k;f%Y/4˸d/ě)=jxnMuh|jyR~4r&@y~;|NVNLMw q?Db* p6u$T{ -de6h%VڜKaTm1aȫkYudkWd_1p(E2~.]r`OdExCCkt);pciG*R5Nq?nȷ=( PteI;73l_A jؓL\nf0]1(/oeOt9؏G|{LJ=Ch>_""BePy&B5ı>ڲ .eB+K-Fe wT[)y,xK'.#[ԝ]Q~7+mVCcmJ>e9QEb%rnsÇ#5)VY~$#~4e_]0J:doOZ]0sۢHCq:ҩ!)da"<~2 |LuZ% _ۜ6%D7¹b)xbo9_v[e.h6xZ1VV#Վ.kᄨa⚃ WWrZ11ܱv}+ttGb ^Q#͝تϹ u8g +O/1}.>aE45=2 D$vmY 7b$D1LZ4?;nPL%fj T/k1LTmf"ܕc00K%\9e1ja}3OaŘTE894J2:h Y/wa%eY9!ؔ3iD?98dՑ-_.pR)gq=|b 4%'9 ae[ZYTZrexZU}0 ZecCH ԫvr Zl(.L6$Ӱk>|͇QnPUIōsnfxRYVH录N\`uyuUȑZ%-v&luӝGJ xa+{dfҁDI^^O\25;xEfv*Sh{ ir[²JZՃo(p 2To5#0- r nMpA8f}a/5ģ;F'P탋 Qj>I.CvgjQ|l/4bxvNbػՖ`Šg T>HÞIIBᇓ鼴yRbsz_D;d+-_P"<{jqw{ٙPǐAzÐ%)eTh`InuO(EԨfAb@ʦ07-*-;lb[l޽p4C5_찫{Y2!nP pV䷸ܳ,|ӌ O .up-hp9ld`6HhP> j~zd;PYyܚ]b+0e}6QQ"kop#' P:a4:3 ZRU6wϥ5%2ג@糣Cr͔kN P:F77CQBx\ZƈVUdJOfs?!t vzKl-af+SM)?Kr0gSkPOC>qֲp3yJuC]_@!ʬ.u }=|ZzĄY^J|9d̎vP#:=)uʣ3b = bԺʖo+#JL1>&B3גyV9eAݣk:n K+|'6x֩0*NvK9 WvIBd~OGˑ~P?)-B?-cB JK7Ӄ{dE?[N|YKÖ9Lvf!Q"QiVJՏj)>-ETyn!ٴ6KǠ!xC/B"?w3hvvP?%wT,D/WPNMlĺ  lhgjQG@i >Z:+d :C]37ks89GtIu~Oݵwz) @Ǻ$&6ip6|mɉ[^k&SW3mbg&DM#.f_D8UNnmsJn*(oȹQ/(Y_Wd-Ht*'T6G#uQ )2?>@SB=LudMM$TMOǴeE0a Uh;%j.+/b/y>(h]b? 9ѰYlZ g9j`Le&:j!z&ݫrHą y|qi` 2ߤO~EJm1i%YX\7H98=Tߒ\=tm18-oy\̲`,6׮$x6⛇VR_`H$uNAtS{h{ x`|zs9kuV)~lS3[om75q WjTޙ(d5DAˆuCEa1Ϲo?~D* ϏcJ/f{k/{ŏ1lkm`H\r=G][O$P+ ϖ7>0i3̸'jJ6HJ`297 QH`u?_~ a$ًXkE^iv: `st!.Hd )i0lj8tSqNfB# n/4`ܹ=??^*phqdb/y @L[h7f&, V atzGS+9v׺0 w,Jjo&N9!';9z|*/4\54V ==j2ү*>ho{A_ʤ&]Y!PqXMUp5X>\\:ő$|H(f2n[`7wF1ca>;4qlmck' Syu{OZt\mӸaÀ`6QR'Wx#5xC[~Η-O{ ֭ NPZ,ة/{~ rP.zC3R0lqkXh(1Բfn4kdP]n _P_p ӓTw> ?f3ђKGggvGUU4~ox[!NAEٶs${$*QPإ\M"QFW[Ϲ'վ:fpol{cH@ABR[+Tm. kh;֬̑KxE,&18M 6AGhI}=$1#i:D|C}(Vux״9y֡A΂nLEOd`Bb1h~A9><Ͷ e}i!gt'_%YQ$Y1Z,MSUU`F4Ս~}"p9ex&R@^m q0iB<n͊deB G,,)m\ŝe r+ΧI_)f٬fs/x Y 0Qak lZJ"Pvw[2&AۭhxM0lO$TKw ^<0 n rE,zCQ> endobj 20 0 obj << /Length1 1423 /Length2 6170 /Length3 0 /Length 7131 /Filter /FlateDecode >> stream xڍwTk6R?t@ڂa&qh vP_%8Q(7I~~///>+p(G@ U a>P`u|(o]|'>:P7 C"n($#27cV)]]!0}\3 ۲Ѱp{@T`n\x9@P wmwPC  Cn~`OBx@w`E6( ?oG@3 _,n6skj8_#vAܬFjKϚ;GUQ\$ @QmpS _oW؍lo*țh-`p_ta""J ޿Q7) ub/oK\\<j@Hfo!o-V*̩*g칅g&]Q"(\?GʩRt&J#iv2gUrPhJ]{ymz;8àXJ"n.{UXjJf䪩& 3&Ӣe7oǚ0,>Ǔ"R= T @Ɵ7Q,ŧ}'+EzGhy]j2_52hl"' B#h}vfxbDc~okAiXàQC#. WowMjk,lJ&go/(!9R6E'Ϭ&D`r-0UR\}U:KϛM_g%sRiy[ Ykk>=KQXHqEGb{UM5 Jѡ bz["WrC-8,|j^IDh*]Ջ;(ﭵlyK)06xSӻjA/C8lȤ!ΐͭ&t`)ŒsM%x7rZXsb‰Toh5C5;,36_:@r`Ξly*^y ے> pۑKdH xԯl'}h`&Ĝ-݆49љ+h|qҞɹ6";={%(oSǜR 'v۬?+nPllz|FYn>9QMeg0 ?OLz!$VT.Iݚ+B`Ia}gpv@0nQ.-,ZOl3&tNiDݾ^M#Ve AbX5kTz؉(;{)Y\oD}Cj\wdp+"Ri 4T7O,I-K%uGhضeh)cͳ犃CYf4~adF;!Pi#{=UѼXj964ԟSؒ捞-Vіmm$Ga)^/'-m6not<8?tTlr՞r_-\t`Wg66?-_=7|lLJt)>-N&Ae#)~ִ9&0VjP+ h\/#4a$ÚݽYaẓ_Zz-snJM].0ƭM( I٢MGQiu}>g3 INx҉vE%ֺJ% 2SrJzW> }=ֻaKI<B| WrIVd|I%up[ .i! ^EN &O-kV41rI\XߐٜζrrS$v~Tv~M@Y:NC.E8֭q-js!34PVb3C9h:>զM/tujZa-zbUBF'*5ۮr;>5qf rBdg 㬧ckl[?O7$#Q+ceAUj.!X[WPn2GdE- >\މYfWwi=< 8:|HR cyɦ;R۴ӠFyND 27c{,wO%6ƺkw2 1$Q4#"r$16p4^?WokD+=NJZ쉴27ӊ_~O ()0hK 9C+CT|B9o2А9\$>箴P3U*4llGt a;o_+T'zW ) 6uEA~>e-.Qu.7g_%Hr!_|O<4زSf-]R1U<Í])+&)D[6nYaˈުb}= $dZI#uِqF4ިɸ&@%4G+Oޘ ǖͩ %;zg;Հm)15eRaǧHB36YZ*kMϫC Ρ_!|m=#+&z 'c _4YwwP*³#оVdÇ0c^? M`gky*G @YE ]-OsO//^NeYg:RRT}{NV_vjmG:w02#ϝpHBRA·5ߔ}!n@=橽R̪zR"mo,~qzCt.95f-upNlycNwgš:Gj QY?&-cK'*پu>{d>UΕ#y)˜QZUڒ{ԠTț!цiUhzދPF2N!sJX}/Q,xpKHAYQV^5MqNG-UAp27mIqE~ϳz`L%̉7Zeqg.UicS $P>yg3n,nMR5A2']A5ߕ7zSh .9TO6+YVΆg[[2ݽcJ/j|ͲI>"Kw?^m.eguE ଅe vfհA49a\4k'/.xOlymP4-5vK“ZKԉ'&,w=j2W`}Um[$ LҴIGj3hc}9[T)ԣ*d &O{,°/ڃ a#[#,墧tn@UkJ@zcXH"](޷@Є\KV〚sq>LaqAf|2  .YM"R,bT \BS2ibb+z ԫeM32gaC#Y=,pVYфA 񚐐"#S+?*7<; LMS{dG-d{7%2Bg5SI,DpS>ٖa{*c(ֽ!ӛEw_ѯV#@bN7yLᙕYԧ{*po\->>Au3XO$G|Oأ qJjo|BUAsb`uFgWhҺMi mRJ[+i=nd-HX+);H4Mq"s\#"]wưRHGsCo吗g RGFR-10l擛ڙP&n>INq +e􊘛j  TV.(Oy'7x/f^Mh)LZcos)>:j$zRF%YUkld)~«9z9=?7Q*.~ (HX!uUd>D R]B jڬ?Y]~T]CMJτ"]0i\dl7"Ghe[|G.oQѡλ N<fyXV=W3UYt\;=YJxry!xgD5Oꟁc`=i:Bo+ /IO~Cأ2N:_-JÐgߧx\O}Wth# N; B/z ֱ_Ə{,t$y:"A˲g J]iH *]&Y]ҪQ3wi$/*}Tgsu#|xgVg#loDU%mĚͽ1s"uw/j*ThFM/ozIfT՗_!M=GٚYXu2/ 2 i&rw oJ8t'X ?1S1/1eB/sÓlg7ll_>y$#E)]⤃o\\դMMQ2 =cIꪴ16a {|lewžGFߟq!cF)ެbx/T92RR߶G Qc x~BИ e'ɦ8A.lNN}>9i8DFղ6LvG{~hJɧF|_aj`anPX>[Xbݔ9q]R=3GK):$?TYབl*@١폅rA?pUy~dF_sY:3۲QA=/@i;1h0uP7k^\ L~]nĖ:k^ya^\f=/2z N Br>_"joCYo9DI{:#V]&s(Io4\5s͝ *~S +(Pi]_h#ѵΫҔg@J췍qaB Ű;垖SS:XJ!/Q&m]+V ' {%yH X e`]`Cx.]#wͨqF?y>;2?hc(iKekʒ~x 0W_p:۹S= gCDDHnK濯yP=ce5X iFx;_7ٵsD[&a@PiuRU@bQ;!Æ*AѧROD9V=$/=7?0}= o5_L(j^-&<8٦ M":/ZgS}?71f~D,dj~/zv̊ endstream endobj 21 0 obj << /Type /FontDescriptor /FontName /MNZTUE+CMSS10 /Flags 4 /FontBBox [-61 -250 999 759] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 78 /XHeight 444 /CharSet (/C/R/plus) /FontFile 20 0 R >> endobj 22 0 obj << /Length1 1553 /Length2 9000 /Length3 0 /Length 10018 /Filter /FlateDecode >> stream xڍP\-]4@c{ݝ,[ЄGsUծ5sUSUQg5 vLl̬qE 6V++3++;J +Bt~I_!v9w đ tr;8laO)t-l (-A/M6u)_%h-YXܘNG !:Fr9)1#Q4,N:!n@G`69ؙ/ e{ݟ 03?]lG2bkY6 3#hg;hy6@?H/ dwvbv6KڙClmAvNH'v_kmq0sgѴ;d%y1!frpr@%?l/|! 9t]@>^v7BbcM& AwY_`e038bqMuMuY(8L.77翫oXUzvߟ^ow%ȋA=+UI3ڂm6`; 0eL_z(ig 1=z\#E_\\/5!m %`qD}|<oӟb`1^ٿ /R_%?E,v/AN _/./|ٖ72EZ [U1LNcZrlwy@CH \w!4܃-I{#L먹!%A(Nmziq o`HICdV5l3tU /J>[{mXn1 Gs|`x?VEHIG@{56M%,U\n!j}{ ,>Ok-KN/ b掺=}trSaPm#k ܍эIͤ爾"jؚ0Ex]./^V3e.hHIi FɌ0Cud eZH.}l_m+̋P=ثGsBˤq&gd;O}I^U)lyd~lq%@%%$y`E o鳁(s|2l;Yw\Wm~ D VIAXfDGS DZy% ;Ty 2eRZQ4_ ^iZɉ][ bLtK !\Pwʩ^a<3MRlE(״T^fPݤZfCˆȧ S<0cC 4W$7݇qjj ~Q\l2Qj2†A.E!dr Má1ZgQcMIg\.n< aNB&Uۦ= Ӡo͠`fJn(1+{EsHpf:3Ӊ_ٿcvL}uKsh,-vԴ/2JWG⫉ۭ6P]&o yn %pQ4;==(1ev2@61/?cH)&_G}WּCfty1˱+ $*ccb`Z~~fc<_~L?,iNLRSDzuvٖ ɨɚcfrB>o&ݭ^+q/0f,0_d͖Nh=i_6K͔60%~ԇ2 r2[k"ӢU[- kwy`%QobPWHܗoRA[ro~y ~d$l̐29\:L|]Yc_rlO9Y!nW8)=+lé*`%AM~ >>e}s.GVثf_Iک mVOkpQ=Y3eh:(?,A-*NFl| ]ZgݫJf6*GPqI·SQqګ[SO4g~Vr%oYhB1X{澕iGP.ܥs2$n.m"-aB,`m-_g+,$ B<Ǧ~ eP408avMJSilQ{~!/=k*3=/s`FzHNZ_G-@ B(%z"+ i%[~' O&A?#vf8(^)u(W%LooЃj~2j;w+"Tr.3o[BpL?|@C3՘Nb b?0vY鼜-4> i](cNFTD)5͉A)t:$ CP.-xpYĀA?ⷰן;c4* GB{SrS6<h Y퀷x~Rvp~AWJv]'4\T!k.|H%FiGFY:>}C6{ċ hW1jhS" ˘H>$cD,grbi{uEz2{$MxS*w2 x\;xxTӷI }8T`dݒ.A֊!up߱r0덧KAIbd?"ؽt`qڱkM+0fHu*٫k(]c>WxIwjXSRV&2 fi2`R :Kʅ < M 3!7yCʝe4VN. x)q<! ^̻)iRw>7AThXfNxJ E\Ҿ~=M !{$ɬY1tĶ'M$P[4M'L!;9Rˇp\hbF<&I/Lmw<':ɹ&. ͨl21vY{ '"/:hy y?h$GV+r2gTuy reΔ7˻ uڠ7sSN%sZ)twWrZu]l?(놄3LTш:Mfrګ-l|Rt'\!!p8m>ެ\nDYkZ|K9Ci4#r_i,C1kd8NjN>F#>=q0u[UMӋȤ󌩵k߁E$ּ/=wD۲3oQ5"J)g?AoPKvצ >)"ifs,.1fn tכA ׊qY-D]-<4wŧDBSt?HۺdNp?(J2ka5cqDhםqǐLo@BR>jwSw6{kN( M)~ vЎ ]VVg;S!ғ+ z,lY)ɾ:m9>!,n7c /PiE[74$Baۡ#~4W@qL{ "DnV s:l47S 'iϮAF Cd"2#D2 r/R0w ^~kXs作Rˠu 4ּj铁MvK SՀ2 {$]YypƎ[3512k୶NBA,Ƒqrx@X /TCb;J(5¯XS O~)%}A]v/T`9q.$̉ޛut'Vqdrp$MߩaVtxI~NFHVT)dxW'T kP u"tߍUwݧmn/չ#vAݝo9_jX`/NM˜fZ:)4bpNdcGZ/;6 Z΍++TW-IQ_P1'۳Q:_1+qkw1/% f]'lieOz+FQ .uKx"iQL CvC(4ɔcVk 7T8߼+^+{*K9_ h, {j}U 巾wo>H&5%R7,`6~qPewb* ^ 樹7JVp}&>Iԁyo/E*JFAg#.%J F#Á+ě!^D'$ 'gYeG c~ًvκbh ^(YhiƤ1EcLa:W߮ӟy6򊍴f^EܐNϹ"7 ]*fC$a6Qù yTCFķhͮ|BEul'+@ (NbQsXK<2DVkWJ 1y;;Դ#d[A56b/?tc\<8*1Mm.Ӣ㒢o!AF*_LaJN1.^ ʣ㬡[B6j.oLBeO(2Ndc`C(&->7ҷaB3WJiۙ*L麤6V Y(ZsA k8߉sj⯟H>-3`䖧n[XHb7 æ,ÕX&Σ,}"P@G9`&F6((eT?UmZ:\`f$TP-<0L,T'Lz@3dw5!MDns$sqj$˜e4%y}+y h}uzcPO ixé$]"FȃafJJ6x(kmQnL /JM6B}oFHz38v{@ScX ,B q(s?ʡݒ7*( 4gGRPq%{9!yxPmhAkUGs%GKl9(䰘GY,!sLS2A զu10q䡩OkP|c3MFR)=J=_g>mfc7jӓdD(g#c['ZwԃpM$2||=;ԝA$+^6*)˘RÃgIJj*L v_Z-6 ZpǕ+ &p ulHp 48Mq@{IU%xRƄhID 3uT <~&+~FkYQ^![@~3z*86fi{=UJdWly2/:t3^1@Gӂ^,~ =d7&3VIָj`VU5J ] V.8>J娇^gϓY~(>ZERw֛]z/ӉM0o1:F}1G'zEp't3ѹ+[Wt]{-iaB5DHr fk}mf*i>9Kcp]lu5BW6ͽ'Աu{ISބ,7)jl`x#|嚮nVe`b "Ʀ JUn7Fo9C&ئZftq[Gη<0í0XWaCZv +cͼv\c|CbOѻ J bsfwC;@+TC$JZ-q?܏ G]J.SIҋ*9/|E4®C֍mnV6/B0ʬ+ ۑf߬&Mեx d`/Ň'8(g٧d7V폸!XW?VR(Uv;Mqz=r Q\}e`ϔv r_$yRE .c-&N9(!BV5oea;U6ryxljƭm LPu&٭^WyGa\qRrlA"*'ɁI,}C,n%6[r2uT~; Vuщeuey}%a+B}<޷=k$UoKy~h;6L +7Z1|ڽA *'.{"}fjo%MһZd:MUi׎D:dm[$:4$qK ^xswwAq&blvZ.fD7l'MEŞ7wQ&G#+5~)l6@4K"}ƅOЏfU|^ RsݴYWTQR6ǦH:!%]Fa)A+St2ydU515|қ)LZ/WԦAZiBKyNkgؙ{:O1_ ^͡e9b lh1AT?}YXW_E+Bhb˿dɬ4*U4 M+DDpPF5*~n4)U^#uS$ ۺviU?2uZ]g#箊@qYFq޸ߨwsݰ2\p)kSm4Cn^sl|M(PVkBYq~tCnzYE>^gY!DiDJ$I{d$z^(Gơgw lhMgv{j+EEWQ>\I\WHTTQsIӎyq}kq~[[,XDd]EZz}"]661neQ[uz8n(hg>Qt V"C *8{27 3Q\Anϓh)pX0UZ(vCnbqzU&STN@SN3u Af" :mR xaCv=F`?pnw$Yb%P{ %=;zZtg0&L~č-ДoQ뛬Y?65 %zf0.}4Rfei],\ UpTwH~|?t&Ėu;ye7@mj%D?ߑ]5>kdčZc6/},~?Q 1oXd+# ~D Y/(;& |#V|mĺ \V\jz` SOAA2;acrwěohGqpfx`RC΅! /C #EwI8w(ޝ6x ? ]'QSZ\A1 vu}1q tQFJ2J4w=dðP> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NBPXCR+CMB10 /FontDescriptor 17 0 R /FirstChar 83 /LastChar 116 /Widths 13 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RMUKLW+CMR10 /FontDescriptor 19 0 R /FirstChar 12 /LastChar 119 /Widths 15 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MNZTUE+CMSS10 /FontDescriptor 21 0 R /FirstChar 43 /LastChar 82 /Widths 12 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CUSUSI+CMTT10 /FontDescriptor 23 0 R /FirstChar 97 /LastChar 116 /Widths 14 0 R >> endobj 11 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 24 0 obj << /Type /Catalog /Pages 11 0 R >> endobj 25 0 obj << /Producer (MiKTeX pdfTeX-1.40.14) /Creator (TeX) /CreationDate (D:20151111142744+01'00') /ModDate (D:20151111142744+01'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.4902 (1.40.14)) >> endobj xref 0 26 0000000000 65535 f 0000001990 00000 n 0000002010 00000 n 0000002030 00000 n 0000001837 00000 n 0000001724 00000 n 0000000015 00000 n 0000044497 00000 n 0000044776 00000 n 0000044358 00000 n 0000044636 00000 n 0000044916 00000 n 0000002083 00000 n 0000002317 00000 n 0000002530 00000 n 0000002628 00000 n 0000003226 00000 n 0000011588 00000 n 0000011820 00000 n 0000026230 00000 n 0000026509 00000 n 0000033759 00000 n 0000033983 00000 n 0000044120 00000 n 0000044974 00000 n 0000045025 00000 n trailer << /Size 26 /Root 24 0 R /Info 25 0 R /ID [<6480FFBB824EB7A26FB56374AB07DD8B> <6480FFBB824EB7A26FB56374AB07DD8B>] >> startxref 45247 %%EOF brms/vignettes/me_loss1.pdf0000644000176200001440000001416013155225616015452 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170910140948) /ModDate (D:20170910140948) /Title (R Graphics Output) /Producer (R 3.4.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 2231 /Filter /FlateDecode >> stream xXˎ]߯RZ"כֿĀHf, DHjŖ%$RC>6Sϟj"1 C#]ki#_"{K~%Z"F?ڌezۭ'}q]c$Z3+qjCшi6t<Њf4rz*J+צ'(asQu)Qf3V]}V1s,KwE2g)eF*1׀OѷKw@CZR[?9p[ip9-#Ÿ,qb_ BM{?zv;".>(sߞc)hEA W'm`T{8Oy$R'+_|ݪa Ly'x 6:L,gw ӚNk_2\]Vqx.?h"`=DS<_~W ĵxdzb',xWɰɣEכ_5Ϋ. b۸bN񔔘?Ά~#-hXї.b-_Tʅi^+_S\!_QLpy<&}|mo~} ,;^gxr~Xa|.coJ<8Og>zKy0k'_=ׯOg#ߡK=9a%CoF+[׭Wy=p=}w{C]/~CO[zumL=Xfz PO]auz>^-(OXrv˛.;:ʣnci+]U~>g7g]vyG}忻@vy y~8#/N^~=B{ih%\ Wc{A6t{7\TmGg~^WGϹSvsfޢc;9,>톶67=}]r{L{4v0^?|/`_Qrt}j9Jj>,G)ɑ|__p ᖑO=?~h4CggV-G9!}`N3]3#vLh\,#+*`ji`^q'F>\ݟ# 1w[/ZJO^]qsnk]|dvke'OI<xK~Iǖ6׫^&<=wYKVuTw|ة?mendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 288 216] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 11 0 R /GS257 12 0 R /GS258 13 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj 11 0 obj << /Type /ExtGState /CA 1.000 >> endobj 12 0 obj << /Type /ExtGState /ca 0.400 >> endobj 13 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 14 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000002595 00000 n 0000002678 00000 n 0000002830 00000 n 0000002863 00000 n 0000000212 00000 n 0000000292 00000 n 0000005558 00000 n 0000005652 00000 n 0000005751 00000 n 0000005800 00000 n 0000005849 00000 n trailer << /Size 14 /Info 1 0 R /Root 2 0 R >> startxref 5898 %%EOF brms/vignettes/brms_distreg.Rmd0000644000176200001440000002562013606326627016375 0ustar liggesusers--- title: "Estimating Distributional Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Distributional Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction This vignette provides an introduction on how to fit distributional regression models with **brms**. We use the term *distributional model* to refer to a model, in which we can specify predictor terms for all parameters of the assumed response distribution. In the vast majority of regression model implementations, only the location parameter (usually the mean) of the response distribution depends on the predictors and corresponding regression parameters. Other parameters (e.g., scale or shape parameters) are estimated as auxilliary parameters assuming them to be constant across observations. This assumption is so common that most researchers applying regression models are often (in my experience) not aware of the possibility of relaxing it. This is understandable insofar as relaxing this assumption drastically increase model complexity and thus makes models hard to fit. Fortunately, **brms** uses **Stan** on the backend, which is an incredibly flexible and powerful tool for estimating Bayesian models so that model complexity is much less of an issue. Suppose we have a normally distributed response variable. Then, in basic linear regression, we specify a predictor term $\eta_{\mu}$ for the mean parameter $\mu$ of the normal distribution. The second parameter of the normal distribution -- the residual standard deviation $\sigma$ -- is assumed to be constant across observations. We estimate $\sigma$ but do not try to *predict* it. In a distributional model, however, we do exactly this by specifying a predictor term $\eta_{\sigma}$ for $\sigma$ in addition to the predictor term $\eta_{\mu}$. Ignoring group-level effects for the moment, the linear predictor of a parameter $\theta$ for observation $n$ has the form $$\eta_{\theta n} = \sum_{i = 1}^{K_{\theta}} b_{\theta i} x_{\theta i n}$$ where $x_{\theta i n}$ denotes the value of the $i$th predictor of parameter $\theta$ for observation $n$ and $b_{\theta i}$ is the $i$th regression coefficient of parameter $\theta$. A distributional normal model with response variable $y$ can then be written as $$y_n \sim \mathcal{N}\left(\eta_{\mu n}, \, \exp(\eta_{\sigma n}) \right)$$ We used the exponential function around $\eta_{\sigma}$ to reflect that $\sigma$ constitutes a standard deviation and thus only takes on positive values, while a linear predictor can be any real number. ## A simple distributional model Unequal variance models are possibly the most simple, but nevertheless very important application of distributional models. Suppose we have two groups of patients: One group recieves a treatment (e.g., an antidepressive drug) and another group recieves placebo. Since the treatment may not work equally well for all patients, the symptom variance of the treatment group may be larger than the symptom variance of the placebo group after some weeks of treatment. For simplicity, assume that we only investigate the post-treatment values. ```{r} group <- rep(c("treat", "placebo"), each = 30) symptom_post <- c(rnorm(30, mean = 1, sd = 2), rnorm(30, mean = 0, sd = 1)) dat1 <- data.frame(group, symptom_post) head(dat1) ``` The following model estimates the effect of `group` on both the mean and the residual standard deviation of the normal response distribution. ```{r, results='hide'} fit1 <- brm(bf(symptom_post ~ group, sigma ~ group), data = dat1, family = gaussian()) ``` Useful summary statistics and plots can be obtained via ```{r, results='hide'} summary(fit1) plot(fit1, N = 2, ask = FALSE) plot(conditional_effects(fit1), points = TRUE) ``` The population-level effect `sigma_grouptreat`, which is the contrast of the two residual standard deviations on the log-scale, reveals that the variances of both groups are indeed different. This impression is confirmed when looking at the `conditional_effects` of `group`. Going one step further, we can compute the residual standard deviations on the original scale using the `hypothesis` method. ```{r} hyp <- c("exp(sigma_Intercept) = 0", "exp(sigma_Intercept + sigma_grouptreat) = 0") hypothesis(fit1, hyp) ``` We may also directly compare them and plot the posterior distribution of their difference. ```{r} hyp <- "exp(sigma_Intercept + sigma_grouptreat) > exp(sigma_Intercept)" (hyp <- hypothesis(fit1, hyp)) plot(hyp, chars = NULL) ``` Indeed, the residual standard deviation of the treatment group seems to larger than that of the placebo group. Moreover the magnitude of this difference is pretty similar to what we expected due to the values we put into the data simulations. ## Zero-Inflated Models Another important application of the distributional regression framework are so called zero-inflated models. These models are helpful whenever there are more zeros in the response variable than one would naturally expect. For example, if one seeks to predict the number of cigarettes people smoke per day and also includes non-smokers, there will be a huge amount of zeros which, when not modeled appropriately, can seriously distort parameter estimates. Here, we consider an example dealing with the number of fish caught by various groups of people. On the UCLA website (\url{https://stats.idre.ucla.edu/stata/dae/zero-inflated-poisson-regression}), the data are described as follows: "The state wildlife biologists want to model how many fish are being caught by fishermen at a state park. Visitors are asked how long they stayed, how many people were in the group, were there children in the group and how many fish were caught. Some visitors do not fish, but there is no data on whether a person fished or not. Some visitors who did fish did not catch any fish so there are excess zeros in the data because of the people that did not fish." ```{r} zinb <- read.csv("https://paul-buerkner.github.io/data/fish.csv") head(zinb) ``` As predictors we choose the number of people per group, the number of children, as well as whether the group consists of campers. Many groups may not even try catching any fish at all (thus leading to many zero responses) and so we fit a zero-inflated Poisson model to the data. For now, we assume a constant zero-inflation probability across observations. ```{r, results='hide'} fit_zinb1 <- brm(count ~ persons + child + camper, data = zinb, family = zero_inflated_poisson()) ``` Again, we summarize the results using the usual methods. ```{r} summary(fit_zinb1) plot(conditional_effects(fit_zinb1), ask = FALSE) ``` According to the parameter estimates, larger groups catch more fish, campers catch more fish than non-campers, and groups with more children catch less fish. The zero-inflation probability `zi` is pretty large with a mean of 41%. Please note that the probability of catching no fish is actually higher than 41%, but parts of this probability are already modeled by the poisson distribution itself (hence the name zero-*inflation*). If you want to treat all zeros as origniating from a separate process, you can use hurdle models instead (not shown here). Now, we try to additionally predict the zero-inflation probability by the number of children. The underlying reasoning is that we expect groups with more children to not even try catching fish. Most children are just terribly bad at waiting for hours until something happens. From a purely statistical perspective, zero-inflated (and hurdle) distributions are a mixture of two processes and predicting both parts of the model is natural and often very reasonable to make full use of the data. ```{r, results='hide'} fit_zinb2 <- brm(bf(count ~ persons + child + camper, zi ~ child), data = zinb, family = zero_inflated_poisson()) ``` ```{r} summary(fit_zinb2) plot(conditional_effects(fit_zinb2), ask = FALSE) ``` To transform the linear predictor of `zi` into a probability, **brms** applies the logit-link: $$logit(zi) = \log\left(\frac{zi}{1-zi}\right) = \eta_{zi}$$ The logit-link takes values within $[0, 1]$ and returns values on the real line. Thus, it allows the transition between probabilities and linear predictors. According to the model, trying to fish with children not only decreases the overall number fish caught (as implied by the Poisson part of the model) but also drastically increases your change of catching no fish at all (as implied by the zero-inflation part) most likely because groups with more children are not even trying. ## Additive Distributional Models In the examples so far, we did not have multilevel data and thus did not fully use the capabilities of the distributional regression framework of **brms**. In the example presented below, we will not only show how to deal with multilevel data in distributional models, but also how to incorporate smooth terms (i.e., splines) into the model. In many applications, we have no or only a very vague idea how the relationship between a predictor and the response looks like. A very flexible approach to tackle this problems is to use splines and let them figure out the form of the relationship. For illustration purposes, we simulate some data with the **mgcv** package, which is also used in **brms** to prepare smooth terms. ```{r} dat_smooth <- mgcv::gamSim(eg = 6, n = 200, scale = 2, verbose = FALSE) head(dat_smooth[, 1:6]) ``` The data contains the predictors `x0` to `x3` as well as the grouping factor `fac` indicating the nested structure of the data. We predict the response variable `y` using smooth terms of `x1` and `x2` and a varying intercept of `fac`. In addition, we assume the residual standard deviation `sigma` to vary by a smoothing term of `x0` and a varying intercept of `fac`. ```{r, results='hide'} fit_smooth1 <- brm( bf(y ~ s(x1) + s(x2) + (1|fac), sigma ~ s(x0) + (1|fac)), data = dat_smooth, family = gaussian(), chains = 2, control = list(adapt_delta = 0.95) ) ``` ```{r} summary(fit_smooth1) plot(conditional_effects(fit_smooth1), points = TRUE, ask = FALSE) ``` This model is likely an overkill for the data at hand, but nicely demonstrates the ease with which one can specify complex models with **brms** and to fit them using **Stan** on the backend. brms/vignettes/brms_multilevel.ltx0000644000176200001440000016716713606326627017220 0ustar liggesusers\documentclass[article, nojss]{jss} %\VignetteIndexEntry{Multilevel Models with brms} %\VignetteEngine{R.rsp::tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Paul-Christian B\"urkner} \title{Advanced Bayesian Multilevel Modeling with the \proglang{R} Package \pkg{brms}} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Paul-Christian B\"urkner} %% comma-separated \Plaintitle{Advanced Bayesian Multilevel Modeling with the R Package brms} %% without formatting \Shorttitle{Advanced Bayesian Multilevel Modeling with \pkg{brms}} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The \pkg{brms} package allows R users to easily specify a wide range of Bayesian single-level and multilevel models, which are fitted with the probabilistic programming language \proglang{Stan} behind the scenes. Several response distributions are supported, of which all parameters (e.g., location, scale, and shape) can be predicted at the same time thus allowing for distributional regression. Non-linear relationships may be specified using non-linear predictor terms or semi-parametric approaches such as splines or Gaussian processes. Multivariate models, in which each response variable can be predicted using the above mentioned options, can be fitted as well. To make all of these modeling options possible in a multilevel framework, \pkg{brms} provides an intuitive and powerful formula syntax, which extends the well known formula syntax of \pkg{lme4}. The purpose of the present paper is to introduce this syntax in detail and to demonstrate its usefulness with four examples, each showing other relevant aspects of the syntax. If you use \pkg{brms}, please cite this article as published in the R Journal \citep{brms2}. } \Keywords{Bayesian inference, multilevel models, distributional regression, MCMC, \proglang{Stan}, \proglang{R}} \Plainkeywords{Bayesian inference, multilevel models, distributional regression, MCMC, Stan, R} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{50} %% \Issue{9} %% \Month{June} %% \Year{2012} %% \Submitdate{2012-06-04} %% \Acceptdate{2012-06-04} %% The address of (at least) one author should be given %% in the following format: \Address{ Paul-Christian B\"urkner\\ E-mail: \email{paul.buerkner@gmail.com}\\ URL: \url{https://paul-buerkner.github.io} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/512/507-7103 %% Fax: +43/512/507-2851 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. \section{Introduction} Multilevel models (MLMs) offer great flexibility for researchers across sciences \citep{brown2015, demidenko2013, gelmanMLM2006, pinheiro2006}. They allow modeling of data measured on different levels at the same time -- for instance data of students nested within classes and schools -- thus taking complex dependency structures into account. It is not surprising that many packages for R have been developed to fit MLMs. Usually, however, the functionality of these implementations is limited insofar as it is only possible to predict the mean of the response distribution. Other parameters of the response distribution, such as the residual standard deviation in linear models, are assumed constant across observations, which may be violated in many applications. Accordingly, it is desirable to allow for prediction of \emph{all} response parameters at the same time. Models doing exactly that are often referred to as \emph{distributional models} or more verbosely \emph{models for location, scale and shape} \citep{rigby2005}. Another limitation of basic MLMs is that they only allow for linear predictor terms. While linear predictor terms already offer good flexibility, they are of limited use when relationships are inherently non-linear. Such non-linearity can be handled in at least two ways: (1) by fully specifying a non-linear predictor term with corresponding parameters each of which can be predicted using MLMs \citep{lindstrom1990}, or (2) estimating the form of the non-linear relationship on the fly using splines \citep{wood2004} or Gaussian processes \citep{rasmussen2006}. The former are often simply called \emph{non-linear models}, while models applying splines are referred to as \emph{generalized additive models} (GAMs; \citeauthor{hastie1990}, \citeyear{hastie1990}). Combining all of these modeling options into one framework is a complex task, both conceptually and with regard to model fitting. Maximum likelihood methods, which are typically applied in classical 'frequentist' statistics, can reach their limits at some point and fully Bayesian methods become the go-to solutions to fit such complex models \citep{gelman2014}. In addition to being more flexible, the Bayesian framework comes with other advantages, for instance, the ability to derive probability statements for every quantity of interest or explicitly incorporating prior knowledge about parameters into the model. The former is particularly relevant in non-linear models, for which classical approaches struggle more often than not in propagating all the uncertainty in the parameter estimates to non-linear functions such as out-of-sample predictions. Possibly the most powerful program for performing full Bayesian inference available to date is Stan \citep{stanM2017, carpenter2017}. It implements Hamiltonian Monte Carlo \citep{duane1987, neal2011, betancourt2014} and its extension, the No-U-Turn (NUTS) Sampler \citep{hoffman2014}. These algorithms converge much more quickly than other Markov-Chain Monte-Carlo (MCMC) algorithms especially for high-dimensional models \citep{hoffman2014, betancourt2014, betancourt2017}. An excellent non-mathematical introduction to Hamiltonian Monte Carlo can be found in \citet{betancourt2017}. Stan comes with its own programming language, allowing for great modeling flexibility \cite{stanM2017, carpenter2017}). Many researchers may still be hesitent to use Stan directly, as every model has to be written, debugged and possibly also optimized. This may be a time-consuming and error-prone process even for researchers familiar with Bayesian inference. The \pkg{brms} package \citep{brms1}, presented in this paper, aims to remove these hurdles for a wide range of regression models by allowing the user to benefit from the merits of Stan by using extended \pkg{lme4}-like \citep{bates2015} formula syntax, with which many R users are familiar with. It offers much more than writing efficient and human-readable Stan code: \pkg{brms} comes with many post-processing and visualization functions, for instance to perform posterior predictive checks, leave-one-out cross-validation, visualization of estimated effects, and prediction of new data. The overarching aim is to have one general framework for regression modeling, which offers everything required to successfully apply regression models to complex data. To date, it already replaces and extends the functionality of dozens of other R packages, each of which is restricted to specific regression models\footnote{Unfortunately, due to the implementation via Stan, it is not easily possible for users to define their own response distributions and run them via \pkg{brms}. If you feel that a response distribution is missing in \pkg{brms}, please open an issue on GitHub (\url{https://github.com/paul-buerkner/brms}).}. The purpose of the present article is to provide an introduction of the advanced multilevel formula syntax implemented in \pkg{brms}, which allows to fit a wide and growing range of non-linear distributional multilevel models. A general overview of the package is already given in \citet{brms1}. Accordingly, the present article focuses on more recent developments. We begin by explaining the underlying structure of distributional models. Next, the formula syntax of \pkg{lme4} and its extensions implemented in \pkg{brms} are explained. Four examples that demonstrate the use of the new syntax are discussed in detail. Afterwards, the functionality of \pkg{brms} is compared with that of \pkg{rstanarm} \citep{rstanarm2017} and \pkg{MCMCglmm} \citep{hadfield2010}. We end by describing future plans for extending the package. \section{Model description} \label{model} The core of models implemented in \pkg{brms} is the prediction of the response $y$ through predicting all parameters $\theta_p$ of the response distribution $D$, which is also called the model \code{family} in many R packages. We write $$y_i \sim D(\theta_{1i}, \theta_{2i}, ...)$$ to stress the dependency on the $i\textsuperscript{th}$ observation. Every parameter $\theta_p$ may be regressed on its own predictor term $\eta_p$ transformed by the inverse link function $f_p$ that is $\theta_{pi} = f_p(\eta_{pi})$\footnote{A parameter can also be assumed constant across observations so that a linear predictor is not required.}. Such models are typically refered to as \emph{distributional models}\footnote{The models described in \citet{brms1} are a sub-class of the here described models.}. Details about the parameterization of each \code{family} are given in \code{vignette("brms\_families")}. Suppressing the index $p$ for simplicity, a predictor term $\eta$ can generally be written as $$ \eta = \mathbf{X} \beta + \mathbf{Z} u + \sum_{k = 1}^K s_k(x_k) $$ In this equation, $\beta$ and $u$ are the coefficients at population-level and group-level respectively and $\mathbf{X}, \mathbf{Z}$ are the corresponding design matrices. The terms $s_k(x_k)$ symbolize optional smooth functions of unspecified form based on covariates $x_k$ fitted via splines (see \citet{wood2011} for the underlying implementation in the \pkg{mgcv} package) or Gaussian processes \citep{williams1996}. The response $y$ as well as $\mathbf{X}$, $\mathbf{Z}$, and $x_k$ make up the data, whereas $\beta$, $u$, and the smooth functions $s_k$ are the model parameters being estimated. The coefficients $\beta$ and $u$ may be more commonly known as fixed and random effects, but I avoid theses terms following the recommendations of \citet{gelmanMLM2006}. Details about prior distributions of $\beta$ and $u$ can be found in \citet{brms1} and under \code{help("set\_prior")}. As an alternative to the strictly additive formulation described above, predictor terms may also have any form specifiable in Stan. We call it a \emph{non-linear} predictor and write $$\eta = f(c_1, c_2, ..., \phi_1, \phi_2, ...)$$ The structure of the function $f$ is given by the user, $c_r$ are known or observed covariates, and $\phi_s$ are non-linear parameters each having its own linear predictor term $\eta_{\phi_s}$ of the form specified above. In fact, we should think of non-linear parameters as placeholders for linear predictor terms rather than as parameters themselves. A frequentist implementation of such models, which inspired the non-linear syntax in \pkg{brms}, can be found in the \pkg{nlme} package \citep{nlme2016}. \section{Extended multilevel formula syntax} \label{formula_syntax} The formula syntax applied in \pkg{brms} builds upon the syntax of the R package \pkg{lme4} \citep{bates2015}. First, we will briefly explain the \pkg{lme4} syntax used to specify multilevel models and then introduce certain extensions that allow to specify much more complicated models in \pkg{brms}. An \pkg{lme4} formula has the general form \begin{Sinput} response ~ pterms + (gterms | group) \end{Sinput} The \code{pterms} part contains the population-level effects that are assumed to be the same across obervations. The \code{gterms} part contains so called group-level effects that are assumed to vary accross grouping variables specified in \code{group}. Multiple grouping factors each with multiple group-level effects are possible. Usually, \code{group} contains only a single variable name pointing to a factor, but you may also use \code{g1:g2} or \code{g1/g2}, if both \code{g1} and \code{g2} are suitable grouping factors. The \code{:} operator creates a new grouping factor that consists of the combined levels of \code{g1} and \code{g2} (you could think of this as pasting the levels of both factors together). The \code{/} operator indicates nested grouping structures and expands one grouping factor into two or more when using multiple \code{/} within one term. If, for instance, you write \code{(1 | g1/g2)}, it will be expanded to \code{(1 | g1) + (1 | g1:g2)}. Instead of \code{|} you may use \code{||} in grouping terms to prevent group-level correlations from being modeled. This may be useful in particular when modeling so many group-level effects that convergence of the fitting algorithms becomes an issue due to model complexity. One limitation of the \code{||} operator in \pkg{lme4} is that it only splits up terms so that columns of the design matrix originating from the same term are still modeled as correlated (e.g., when coding a categorical predictor; see the \code{mixed} function of the \pkg{afex} package by \citet{afex2015} for a way to avoid this behavior). While intuitive and visually appealing, the classic \pkg{lme4} syntax is not flexible enough to allow for specifying the more complex models supported by \pkg{brms}. In non-linear or distributional models, for instance, multiple parameters are predicted, each having their own population and group-level effects. Hence, multiple formulas are necessary to specify such models\footnote{Actually, it is possible to specify multiple model parts within one formula using interactions terms for instance as implemented in \pkg{MCMCglmm} \citep{hadfield2010}. However, this syntax is limited in flexibility and requires a rather deep understanding of the way R parses formulas, thus often being confusing to users.}. Then, however, specifying group-level effects of the same grouping factor to be correlated \emph{across} formulas becomes complicated. The solution implemented in \pkg{brms} (and currently unique to it) is to expand the \code{|} operator into \code{||}, where \code{} can be any value. Group-level terms with the same \code{ID} will then be modeled as correlated if they share same grouping factor(s)\footnote{It might even be further extended to \code{|fun()|}, where \code{fun} defines the type of correlation structure, defaulting to unstructured that is estimating the full correlation matrix. The \code{fun} argument is not yet supported by \pkg{brms} but could be supported in the future if other correlation structures, such as compound symmetry or Toeplitz, turn out to have reasonable practical applications and effective implementations in Stan.}. For instance, if the terms \code{(x1|ID|g1)} and \code{(x2|ID|g1)} appear somewhere in the same or different formulas passed to \pkg{brms}, they will be modeled as correlated. Further extensions of the classical \pkg{lme4} syntax refer to the \code{group} part. It is rather limited in its flexibility since only variable names combined by \code{:} or \code{/} are supported. We propose two extensions of this syntax: Firstly, \code{group} can generally be split up in its terms so that, say, \code{(1 | g1 + g2)} is expanded to \code{(1 | g1) + (1 | g2)}. This is fully consistent with the way \code{/} is handled so it provides a natural generalization to the existing syntax. Secondly, there are some special grouping structures that cannot be expressed by simply combining grouping variables. For instance, multi-membership models cannot be expressed this way. To overcome this limitation, we propose wrapping terms in \code{group} within special functions that allow specifying alternative grouping structures: \code{(gterms | fun(group))}. In \pkg{brms}, there are currently two such functions implemented, namely \code{gr} for the default behavior and \code{mm} for multi-membership terms. To be compatible with the original syntax and to keep formulas short, \code{gr} is automatically added internally if none of these functions is specified. While some non-linear relationships, such as quadratic relationships, can be expressed within the basic R formula syntax, other more complicated ones cannot. For this reason, it is possible in \pkg{brms} to fully specify non-linear predictor terms similar to how it is done in \pkg{nlme}, but fully compatible with the extended multilevel syntax described above. Suppose, for instance, we want to model the non-linear growth curve $$ y = b_1 (1 - \exp(-(x / b_2)^{b_3}) $$ between $y$ and $x$ with parameters $b_1$, $b_2$, and $b_3$ (see Example 3 in this paper for an implementation of this model with real data). Furthermore, we want all three parameters to vary by a grouping variable $g$ and model those group-level effects as correlated. Additionally $b_1$ should be predicted by a covariate $z$. We can express this in \pkg{brms} using multiple formulas, one for the non-linear model itself and one per non-linear parameter: \begin{Sinput} y ~ b1 * (1 - exp(-(x / b2) ^ b3) b1 ~ z + (1|ID|g) b2 ~ (1|ID|g) b3 ~ (1|ID|g) \end{Sinput} The first formula will not be evaluated using standard R formula parsing, but instead taken literally. In contrast, the formulas for the non-linear parameters will be evaluated in the usual way and are compatible with all terms supported by \pkg{brms}. Note that we have used the above described ID-syntax to model group-level effects as correlated across formulas. There are other syntax extensions implemented in \pkg{brms} that do not directly target grouping terms. Firstly, there are terms formally included in the \code{pterms} part that are handled separately. The most prominent examples are smooth terms specified through the \code{s} and \code{t2} functions of the \pkg{mgcv} package \citep{wood2011}. Other examples are category specific effects \code{cs}, monotonic effects \code{mo}, noise-free effects \code{me}, or Gaussian process terms \code{gp}. The former is explained in \citet{brms1}, while the latter three are documented in \code{help(brmsformula)}. Internally, these terms are extracted from \code{pterms} and not included in the construction of the population-level design matrix. Secondly, making use of the fact that \code{|} is unused on the left-hand side of $\sim$ in formula, additional information on the response variable may be specified via \begin{Sinput} response | aterms ~ \end{Sinput} The \code{aterms} part may contain multiple terms of the form \code{fun()} separated by \code{+} each providing special information on the response variable. This allows among others to weight observations, provide known standard errors for meta-analysis, or model censored or truncated data. As it is not the main topic of the present paper, we refer to \code{help("brmsformula")} and \code{help("addition-terms")} for more details. To set up the model formulas and combine them into one object, \pkg{brms} defines the \code{brmsformula} (or short \code{bf}) function. Its output can then be passed to the \code{parse\_bf} function, which splits up the formulas in separate parts and prepares them for the generation of design matrices and related data. Other packages may re-use these functions in their own routines making it easier to offer support for the above described multilevel syntax. \section{Examples} The idea of \pkg{brms} is to provide one unified framework for multilevel regression models in R. As such, the above described formula syntax in all of its variations can be applied in combination with all response distributions supported by \pkg{brms} (currently about 35 response distributions are supported; see \code{help("brmsfamily")} and \code{vignette("brms\_families")} for an overview). In this section, we will discuss four examples in detail, each focusing on certain aspects of the syntax. They are chosen to provide a broad overview of the modeling options. The first is about the number of fish caught be different groups of people. It does not actually contain any multilevel structure, but helps in understanding how to set up formulas for different model parts. The second example is about housing rents in Munich. We model the data using splines and a distributional regression approach. The third example is about cumulative insurance loss payments across several years, which is fitted using a rather complex non-linear multilevel model. Finally, the fourth example is about the performance of school children, who change school during the year, thus requiring a multi-membership model. Despite not being covered in the four examples, there are a few more modeling options that we want to briefly describe. First, \pkg{brms} allows fitting so called phylogenetic models. These models are relevant in evolutionary biology when data of many species are analyzed at the same time. Species are not independent as they come from the same phylogenetic tree, implying that different levels of the same grouping-factor (i.e., species) are likely correlated. There is a whole vignette dedicated to this topic, which can be found via \code{vignette("brms\_phylogenetics")}. Second, there is a canonical way to handle ordinal predictors, without falsely assuming they are either categorical or continuous. We call them monotonic effects and discuss them in \code{vignette("brms\_monotonic")}. Last but not least, it is possible to account for measurement error in both response and predictor variables. This is often ignored in applied regression modeling \citep{westfall2016}, although measurement error is very common in all scientific fields making use of observational data. There is no vignette yet covering this topic, but one will be added in the future. In the meantime, \code{help("brmsformula")} is the best place to start learning about such models as well as about other details of the \pkg{brms} formula syntax. \subsection{Example 1: Catching fish} An important application of the distributional regression framework of \pkg{brms} are so called zero-inflated and hurdle models. These models are helpful whenever there are more zeros in the response variable than one would naturally expect. Here, we consider an example dealing with the number of fish caught by various groups of people. On the UCLA website (\url{https://stats.idre.ucla.edu/stata/dae/zero-inflated-poisson-regression}), the data are described as follows: ``The state wildlife biologists want to model how many fish are being caught by fishermen at a state park. Visitors are asked how long they stayed, how many people were in the group, were there children in the group and how many fish were caught. Some visitors do not fish, but there is no data on whether a person fished or not. Some visitors who did fish did not catch any fish so there are excess zeros in the data because of the people that did not fish.'' \begin{Sinput} zinb <- read.csv("http://stats.idre.ucla.edu/stat/data/fish.csv") zinb$camper <- factor(zinb$camper, labels = c("no", "yes")) head(zinb) \end{Sinput} \begin{Sinput} nofish livebait camper persons child xb zg count 1 1 0 no 1 0 -0.8963146 3.0504048 0 2 0 1 yes 1 0 -0.5583450 1.7461489 0 3 0 1 no 1 0 -0.4017310 0.2799389 0 4 0 1 yes 2 1 -0.9562981 -0.6015257 0 5 0 1 no 1 0 0.4368910 0.5277091 1 6 0 1 yes 4 2 1.3944855 -0.7075348 0 \end{Sinput} As predictors we choose the number of people per group, the number of children, as well as whether or not the group consists of campers. Many groups may not catch any fish just because they do not try and so we fit a zero-inflated Poisson model. For now, we assume a constant zero-inflation probability across observations. \begin{Sinput} fit_zinb1 <- brm(count ~ persons + child + camper, data = zinb, family = zero_inflated_poisson("log")) \end{Sinput} The model is readily summarized via \begin{Sinput} summary(fit_zinb1) \end{Sinput} \begin{Sinput} Family: zero_inflated_poisson (log) Formula: count ~ persons + child + camper Data: zinb (Number of observations: 250) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept -1.01 0.17 -1.34 -0.67 2171 1 persons 0.87 0.04 0.79 0.96 2188 1 child -1.36 0.09 -1.55 -1.18 1790 1 camper 0.80 0.09 0.62 0.98 2950 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat zi 0.41 0.04 0.32 0.49 2409 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} A graphical summary is available through \begin{Sinput} conditional_effects(fit_zinb1) \end{Sinput} \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_zinb1.pdf} \caption{Marginal effects plots of the \code{fit\_zinb1} model.} \label{me_zinb1} \end{figure} (see Figure \ref{me_zinb1}). In fact, the \code{marginal\_effects} method turned out to be so powerful in visualizing effects of predictors that I am using it almost as frequently as \code{summary}. According to the parameter estimates, larger groups catch more fish, campers catch more fish than non-campers, and groups with more children catch less fish. The zero-inflation probability \code{zi} is pretty large with a mean of 41\%. Please note that the probability of catching no fish is actually higher than 41\%, but parts of this probability are already modeled by the Poisson distribution itself (hence the name zero-\emph{inflation}). If you want to treat all zeros as originating from a separate process, you can use hurdle models instead (not shown here). Now, we try to additionally predict the zero-inflation probability by the number of children. The underlying reasoning is that we expect groups with more children to not even try catching fish, since children often lack the patience required for fishing. From a purely statistical perspective, zero-inflated (and hurdle) distributions are a mixture of two processes and predicting both parts of the model is natural and often very reasonable to make full use of the data. \begin{Sinput} fit_zinb2 <- brm(bf(count ~ persons + child + camper, zi ~ child), data = zinb, family = zero_inflated_poisson()) \end{Sinput} To transform the linear predictor of \code{zi} into a probability, \pkg{brms} applies the logit-link, which takes values within $[0, 1]$ and returns values on the real line. Thus, it allows the transition between probabilities and linear predictors. \begin{Sinput} summary(fit_zinb2) \end{Sinput} \begin{Sinput} Family: zero_inflated_poisson (log) Formula: count ~ persons + child + camper zi ~ child Data: zinb (Number of observations: 250) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept -1.07 0.18 -1.43 -0.73 2322 1 persons 0.89 0.05 0.80 0.98 2481 1 child -1.17 0.10 -1.37 -1.00 2615 1 camper 0.78 0.10 0.60 0.96 3270 1 zi_Intercept -0.95 0.27 -1.52 -0.48 2341 1 zi_child 1.21 0.28 0.69 1.79 2492 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} According to the model, trying to fish with children not only decreases the overall number fish caught (as implied by the Poisson part of the model) but also drastically increases your chance of catching no fish at all (as implied by the zero-inflation part), possibly because groups with more children spend less time or no time at all fishing. Comparing model fit via leave-one-out cross validation as implemented in the \pkg{loo} package \citep{loo2016, vehtari2016}. \begin{Sinput} LOO(fit_zinb1, fit_zinb2) \end{Sinput} \begin{Sinput} LOOIC SE fit_zinb1 1639.52 363.30 fit_zinb2 1621.35 362.39 fit_zinb1 - fit_zinb2 18.16 15.71 \end{Sinput} reveals that the second model using the number of children to predict both model parts has better fit. However, when considering the standard error of the \code{LOOIC} difference, improvement in model fit is apparently modest and not substantial. More examples of distributional model can be found in \code{vignette("brms\_distreg")}. \subsection{Example 2: Housing rents} In their book about regression modeling, \citet{fahrmeir2013} use an example about the housing rents in Munich from 1999. The data contains information about roughly 3000 apartments including among others the absolute rent (\code{rent}), rent per square meter (\code{rentsqm}), size of the apartment (\code{area}), construction year (\code{yearc}), and the district in Munich (\code{district}), where the apartment is located. The data can be found in the \pkg{gamlss.data} package \citep{gamlss.data}: \begin{Sinput} data("rent99", package = "gamlss.data") head(rent99) \end{Sinput} \begin{Sinput} rent rentsqm area yearc location bath kitchen cheating district 1 109.9487 4.228797 26 1918 2 0 0 0 916 2 243.2820 8.688646 28 1918 2 0 0 1 813 3 261.6410 8.721369 30 1918 1 0 0 1 611 4 106.4103 3.547009 30 1918 2 0 0 0 2025 5 133.3846 4.446154 30 1918 2 0 0 1 561 6 339.0256 11.300851 30 1918 2 0 0 1 541 \end{Sinput} Here, we aim at predicting the rent per square meter with the size of the apartment as well as the construction year, while taking the district of Munich into account. As the effect of both predictors on the rent is of unknown non-linear form, we model these variables using a bivariate tensor spline \citep{wood2013}. The district is accounted for via a varying intercept. \begin{Sinput} fit_rent1 <- brm(rentsqm ~ t2(area, yearc) + (1|district), data = rent99, chains = 2, cores = 2) \end{Sinput} We fit the model using just two chains (instead of the default of four chains) on two processor cores to reduce the model fitting time for the purpose of the present paper. In general, using the default option of four chains (or more) is recommended. \begin{Sinput} summary(fit_rent1) \end{Sinput} \begin{Sinput} Family: gaussian(identity) Formula: rentsqm ~ t2(area, yearc) + (1 | district) Data: rent99 (Number of observations: 3082) Samples: 2 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 2000 ICs: LOO = NA; WAIC = NA; R2 = NA Smooth Terms: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sds(t2areayearc_1) 4.93 2.32 1.61 10.77 1546 1.00 sds(t2areayearc_2) 5.78 2.87 1.58 13.15 1175 1.00 sds(t2areayearc_3) 8.09 3.19 3.66 16.22 1418 1.00 Group-Level Effects: ~district (Number of levels: 336) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 0.60 0.06 0.48 0.73 494 1.01 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept 7.80 0.11 7.59 8.02 2000 1.00 t2areayearc_1 -1.00 0.09 -1.15 -0.83 2000 1.00 t2areayearc_2 0.75 0.17 0.43 1.09 2000 1.00 t2areayearc_3 -0.07 0.16 -0.40 0.24 1579 1.00 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 1.95 0.03 1.90 2.01 2000 1.00 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} For models including splines, the output of \code{summary} is not tremendously helpful, but we get at least some information. Firstly, the credible intervals of the standard deviations of the coefficients forming the splines (under \code{'Smooth Terms'}) are sufficiently far away from zero to indicate non-linearity in the (combined) effect of \code{area} and \code{yearc}. Secondly, even after controlling for these predictors, districts still vary with respect to rent per square meter by a sizable amount as visible under \code{'Group-Level Effects'} in the output. To further understand the effect of the predictor, we apply graphical methods: \begin{Sinput} conditional_effects(fit_rent1, surface = TRUE) \end{Sinput} In Figure \ref{me_rent1}, the marginal effects of both predictors are displayed, while the respective other predictor is fixed at its mean. In Figure \ref{me_rent2}, the combined effect is shown, clearly demonstrating an interaction between the variables. In particular, housing rents appear to be highest for small and relatively new apartments. \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_rent1.pdf} \caption{Marginal effects plots of the \code{fit\_rent1} model for single predictors.} \label{me_rent1} \end{figure} \begin{figure}[ht] \centering \includegraphics[width=0.7\textwidth,keepaspectratio]{me_rent2.pdf} \caption{Surface plot of the \code{fit\_rent1} model for the combined effect of \code{area} and \code{yearc}.} \label{me_rent2} \end{figure} In the above example, we only considered the mean of the response distribution to vary by \code{area} and \code{yearc}, but this my not necessarily reasonable assumption, as the variation of the response might vary with these variables as well. Accordingly, we fit splines and effects of district for both the location and the scale parameter, which is called \code{sigma} in Gaussian models. \begin{Sinput} bform <- bf(rentsqm ~ t2(area, yearc) + (1|ID1|district), sigma ~ t2(area, yearc) + (1|ID1|district)) fit_rent2 <- brm(bform, data = rent99, chains = 2, cores = 2) \end{Sinput} If not otherwise specified, \code{sigma} is predicted on the log-scale to ensure it is positive no matter how the predictor term looks like. Instead of \code{(1|district)} as in the previous model, we now use \code{(1|ID1|district)} in both formulas. This results in modeling the varying intercepts of both model parts as correlated (see the description of the ID-syntax above). The group-level part of the \code{summary} output looks as follows: \begin{Sinput} Group-Level Effects: ~district (Number of levels: 336) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 0.60 0.06 0.49 0.73 744 1.00 sd(sigma_Intercept) 0.11 0.02 0.06 0.15 751 1.00 cor(Intercept,sigma_Intercept) 0.72 0.17 0.35 0.98 648 1.00 \end{Sinput} As visible from the positive correlation of the intercepts, districts with overall higher rent per square meter have higher variation at the same time. Lastly, we want to turn our attention to the splines. While \code{marginal\_effects} is used to visualize effects of predictors on the expected response, \code{marginal\_smooths} is used to show just the spline parts of the model: \begin{Sinput} conditional_smooths(fit_rent2) \end{Sinput} The plot on the left-hand side of Figure \ref{me_rent3} resembles the one in Figure \ref{me_rent2}, but the scale is different since only the spline is plotted. The right-hand side of \ref{me_rent3} shows the spline for \code{sigma}. Since we apply the log-link on \code{sigma} by default the spline is on the log-scale as well. As visible in the plot, the variation in the rent per square meter is highest for relatively small and old apartments, while the variation is smallest for medium to large apartments build around the 1960s. \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_rent3.pdf} \caption{Plots showing the smooth terms of the \code{fit\_rent2} model.} \label{me_rent3} \end{figure} \subsection{Example 3: Insurance loss payments} On his blog, Markus Gesmann predicts the growth of cumulative insurance loss payments over time, originated from different origin years (see \url{http://www.magesblog.com/2015/11/loss-developments-via-growth-curves-and.html}). We will use a slightly simplified version of his model for demonstration purposes here. It looks as follows: $$cum_{AY, dev} \sim N(\mu_{AY, dev}, \sigma)$$ $$\mu_{AY, dev} = ult_{AY} \left(1 - \exp\left(- \left( \frac{dev}{\theta} \right)^\omega \right) \right)$$ The cumulative insurance payments $cum$ will grow over time, and we model this dependency using the variable $dev$. Further, $ult_{AY}$ is the (to be estimated) ultimate loss of accident each year. It constitutes a non-linear parameter in our framework along with the parameters $\theta$ and $\omega$, which are responsible for the growth of the cumulative loss and are for now assumed to be the same across years. We load the data \begin{Sinput} url <- paste0("https://raw.githubusercontent.com/mages/", "diesunddas/master/Data/ClarkTriangle.csv") loss <- read.csv(url) head(loss) \end{Sinput} \begin{Sinput} AY dev cum 1 1991 6 357.848 2 1991 18 1124.788 3 1991 30 1735.330 4 1991 42 2182.708 5 1991 54 2745.596 6 1991 66 3319.994 \end{Sinput} and translate the proposed model into a non-linear \pkg{brms} model. \begin{Sinput} nlform <- bf(cum ~ ult * (1 - exp(-(dev / theta)^omega)), ult ~ 1 + (1|AY), omega ~ 1, theta ~ 1, nl = TRUE) nlprior <- c(prior(normal(5000, 1000), nlpar = "ult"), prior(normal(1, 2), nlpar = "omega"), prior(normal(45, 10), nlpar = "theta")) fit_loss1 <- brm(formula = nlform, data = loss, family = gaussian(), prior = nlprior, control = list(adapt_delta = 0.9)) \end{Sinput} In the above functions calls, quite a few things are going on. The formulas are wrapped in \code{bf} to combine them into one object. The first formula specifies the non-linear model. We set argument \code{nl = TRUE} so that \pkg{brms} takes this formula literally and instead of using standard R formula parsing. We specify one additional formula per non-linear parameter (a) to clarify what variables are covariates and what are parameters and (b) to specify the predictor term for the parameters. We estimate a group-level effect of accident year (variable \code{AY}) for the ultimate loss \code{ult}. This also shows nicely how a non-linear parameter is actually a placeholder for a linear predictor, which in the case of \code{ult}, contains only a varying intercept for year. Both \code{omega} and \code{theta} are assumed to be constant across observations so we just fit a population-level intercept. Priors on population-level effects are required and, for the present model, are actually mandatory to ensure identifiability. Otherwise, we may observe that different Markov chains converge to different parameter regions as multiple posterior distribution are equally plausible. Setting prior distributions is a difficult task especially in non-linear models. It requires some experience and knowledge both about the model that is being fitted and about the data at hand. Additionally, there is more to keep in mind to optimize the sampler's performance: Firstly, using non- or weakly informative priors in non-linear models often leads to problems even if the model is generally identified. For instance, if a zero-centered and reasonably wide prior such as \code{normal(0, 10000)} it set on \code{ult}, there is little information about \code{theta} and \code{omega} for samples of \code{ult} being close to zero, which may lead to convergence problems. Secondly, Stan works best when parameters are roughly on the same order of magnitude \citep{stan2017}. In the present example, \code{ult} is of three orders larger than \code{omega}. Still, the sampler seems to work quite well, but this may not be true for other models. One solution is to rescale parameters before model fitting. For instance, for the present example, one could have downscaled \code{ult} by replacing it with \code{ult * 1000} and correspondingly the \code{normal(5000, 1000)} prior with \code{normal(5, 1)}. In the \code{control} argument we increase \code{adapt\_delta} to get rid of a few divergent transitions (cf. \citeauthor{stan2017}, \citeyear{stan2017}; \citeauthor{brms1}, \citeyear{brms1}). Again the model is summarized via \begin{Sinput} summary(fit_loss1) \end{Sinput} \begin{Sinput} Family: gaussian (identity) Formula: cum ~ ult * (1 - exp(-(dev / theta)^omega)) ult ~ 1 + (1 | AY) omega ~ 1 theta ~ 1 Data: loss (Number of observations: 55) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Group-Level Effects: ~AY (Number of levels: 10) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(ult_Intercept) 745.74 231.31 421.05 1306.04 916 1 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat ult_Intercept 5273.70 292.34 4707.11 5852.28 798 1 omega_Intercept 1.34 0.05 1.24 1.43 2167 1 theta_Intercept 46.07 2.09 42.38 50.57 1896 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 139.93 15.52 113.6 175.33 2358 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} as well as \begin{Sinput} conditional_effects(fit_loss1) \end{Sinput} \begin{figure}[ht] \centering \includegraphics[width=0.7\textwidth,keepaspectratio]{me_loss1.pdf} \caption{Marginal effects plots of the \code{fit\_loss1} model.} \label{me_loss1} \end{figure} (see Figure \ref{me_loss1}). We can also visualize the cumulative insurance loss over time separately for each year. \begin{Sinput} conditions <- data.frame(AY = unique(loss$AY)) rownames(conditions) <- unique(loss$AY) me_year <- conditional_effects(fit_loss1, conditions = conditions, re_formula = NULL, method = "predict") plot(me_year, ncol = 5, points = TRUE) \end{Sinput} \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_loss1_year.pdf} \caption{Marginal effects plots of the \code{fit\_loss1} model separately for each accident year.} \label{me_loss1_year} \end{figure} (see Figure \ref{me_loss1_year}). It is evident that there is some variation in cumulative loss across accident years, for instance due to natural disasters happening only in certain years. Further, we see that the uncertainty in the predicted cumulative loss is larger for later years with fewer available data points. In the above model, we considered \code{omega} and \code{delta} to be constant across years, which may not necessarily be true. We can easily investigate this by fitting varying intercepts for all three non-linear parameters also estimating group-level correlation using the above introduced \code{ID} syntax. \begin{Sinput} nlform2 <- bf(cum ~ ult * (1 - exp(-(dev / theta)^omega)), ult ~ 1 + (1|ID1|AY), omega ~ 1 + (1|ID1|AY), theta ~ 1 + (1|ID1|AY), nl = TRUE) fit_loss2 <- update(fit_loss1, formula = nlform2, control = list(adapt_delta = 0.90)) \end{Sinput} We could have also specified all predictor terms more conveniently within one formula as \begin{Sinput} ult + omega + theta ~ 1 + (1|ID1|AY) \end{Sinput} because the structure of the predictor terms is identical. To compare model fit, we perform leave-one-out cross-validation. \begin{Sinput} LOO(fit_loss1, fit_loss2) \end{Sinput} \begin{Sinput} LOOIC SE fit_loss1 715.44 19.24 fit_loss2 720.60 19.85 fit_loss1 - fit_loss2 -5.15 5.34 \end{Sinput} Since smaller values indicate better expected out-of-sample predictions and thus better model fit, the simpler model that only has a varying intercept over parameter \code{ult} is preferred. This may not be overly surprising, given that three varying intercepts as well as three group-level correlations are probably overkill for data containing only 55 observations. Nevertheless, it nicely demonstrates how to apply the \code{ID} syntax in practice. More examples of non-linear models can be found in \code{vignette("brms\_nonlinear")}. \subsection{Example 4: Performance of school children} Suppose that we want to predict the performance of students in the final exams at the end of the year. There are many variables to consider, but one important factor will clearly be school membership. Schools might differ in the ratio of teachers and students, the general quality of teaching, in the cognitive ability of the students they draw, or other factors we are not aware of that induce dependency among students of the same school. Thus, it is advised to apply a multilevel modeling techniques including school membership as a group-level term. Of course, we should account for class membership and other levels of the educational hierarchy as well, but for the purpose of the present example, we will focus on schools only. Usually, accounting for school membership is pretty-straight forward by simply adding a varying intercept to the formula: \code{(1 | school)}. However, a non-negligible number of students might change schools during the year. This would result in a situation where one student is a member of multiple schools and so we need a multi-membership model. Setting up such a model not only requires information on the different schools students attend during the year, but also the amount of time spend at each school. The latter can be used to weight the influence each school has on its students, since more time attending a school will likely result in greater influence. For now, let us assume that students change schools maximally once a year and spend equal time at each school. We will later see how to relax these assumptions. Real educational data are usually relatively large and complex so that we simulate our own data for the purpose of this tutorial paper. We simulate 10 schools and 1000 students, with each school having the same expected number of 100 students. We model 10\% of students as changing schools. \begin{Sinput} data_mm <- sim_multi_mem(nschools = 10, nstudents = 1000, change = 0.1) head(data_mm) \end{Sinput} \begin{Sinput} s1 s2 w1 w2 y 1 8 9 0.5 0.5 16.27422 2 10 9 0.5 0.5 18.71387 3 5 3 0.5 0.5 23.65319 4 3 5 0.5 0.5 22.35204 5 5 3 0.5 0.5 16.38019 6 10 6 0.5 0.5 17.63494 \end{Sinput} The code of function \code{sim\_multi\_mem} can be found in the online supplement of the present paper. For reasons of better illustration, students changing schools appear in the first rows of the data. Data of students being only at a single school looks as follows: \begin{Sinput} data_mm[101:106, ] \end{Sinput} \begin{Sinput} s1 s2 w1 w2 y 101 2 2 0.5 0.5 27.247851 102 9 9 0.5 0.5 24.041427 103 4 4 0.5 0.5 12.575001 104 2 2 0.5 0.5 21.203644 105 4 4 0.5 0.5 12.856166 106 4 4 0.5 0.5 9.740174 \end{Sinput} Thus, school variables are identical, but we still have to specify both in order to pass the data appropriately. Incorporating no other predictors into the model for simplicity, a multi-membership model is specified as \begin{Sinput} fit_mm <- brm(y ~ 1 + (1 | mm(s1, s2)), data = data_mm) \end{Sinput} The only new syntax element is that multiple grouping factors (\code{s1} and \code{s2}) are wrapped in \code{mm}. Everything else remains exactly the same. Note that we did not specify the relative weights of schools for each student and thus, by default, equal weights are assumed. \begin{Sinput} summary(fit_mm) \end{Sinput} \begin{Sinput} Family: gaussian (identity) Formula: y ~ 1 + (1 | mm(s1, s2)) Data: data_mm (Number of observations: 1000) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Group-Level Effects: ~mms1s2 (Number of levels: 10) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 2.76 0.82 1.69 4.74 682 1.01 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept 19 0.93 17.06 20.8 610 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 3.58 0.08 3.43 3.75 2117 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} With regard to the assumptions made in the above example, it is unlikely that all children who change schools stay in both schools equally long. To relax this assumption, we have to specify weights. First, we amend the simulated data to contain non-equal weights for students changing schools. For all other students, weighting does of course not matter as they stay in the same school anyway. \begin{Sinput} data_mm[1:100, "w1"] <- runif(100, 0, 1) data_mm[1:100, "w2"] <- 1 - data_mm[1:100, "w1"] head(data_mm) \end{Sinput} \begin{Sinput} s1 s2 w1 w2 y 1 8 9 0.3403258 0.65967423 16.27422 2 10 9 0.1771435 0.82285652 18.71387 3 5 3 0.9059811 0.09401892 23.65319 4 3 5 0.4432007 0.55679930 22.35204 5 5 3 0.8052026 0.19479738 16.38019 6 10 6 0.5610243 0.43897567 17.63494 \end{Sinput} Incorporating these weights into the model is straight forward. \begin{Sinput} fit_mm2 <- brm(y ~ 1 + (1 | mm(s1, s2, weights = cbind(w1, w2))), data = data_mm) \end{Sinput} The summary output is similar to the previous, so we do not show it here. The second assumption that students change schools only once a year, may also easily be relaxed by providing more than two grouping factors, say, \code{mm(s1, s2, s3)}. \section{Comparison between packages} Over the years, many R packages have been developed that implement MLMs, each being more or less general in their supported models. In \cite{brms1}, I compared \pkg{brms} with \pkg{lme4} \citep{bates2015}, \pkg{MCMCglmm} \citep{hadfield2010}, \pkg{rstanarm} \citep{rstanarm2017}, and \pkg{rethinking} \citep{mcelreath2017}. Since then, quite a few new features have been added in particular to \pkg{brms} and \pkg{rstanarm}. Accordingly, in the present paper, I will update these comparisons, but focus on \pkg{brms}, \pkg{rstanarm}, and \pkg{MCMCglmm} as the possibly most important R packages implementing Bayesian MLMs. While \pkg{brms} and \pkg{rstanarm} are both based on the probabilistic programming language \pkg{Stan}, \pkg{MCMCglmm} implements its own custom MCMC algorithm. Modeling options and other important information of these packages are summarized in Table~\ref{comparison} and will be discussed in detail below. Regarding general model classes, all three packages support the most common types such as linear, count data and certain survival models. Currently, \pkg{brms} and \pkg{MCMCglmm} provide more flexibility when modeling categorical and ordinal data. Additionally, they offer support for zero-inflated and hurdle models to account for access zeros in the data (see Example 1 above). For survival / time-to-event models, \pkg{rstanarm} offers great flexibility via the \code{stan\_jm} function, which allows for complex association structures between time-to-event data and one or more models of longitudinal covariates (for details see \url{https://cran.r-project.org/web/packages/rstanarm/vignettes/jm.html}). Model classes currently specific to \pkg{brms} are robust linear models using Student's t-distribution (family \code{student}) as well as response times models via the exponentially modified Gaussian (family \code{exgaussian}) distribution or the Wiener diffusion model (family \code{wiener}). The latter allows to simultaneously model dichotomous decisions and their corresponding response times (for a detailed example see \url{http://singmann.org/wiener-model-analysis-with-brms-part-i/}). All three packages offer many additional modeling options, with \pkg{brms} currently having the greatest flexibility (see Table~\ref{comparison} for a summary). Moreover, the packages differ in the general framework, in which they are implemented: \pkg{brms} and \pkg{MCMCglmm} each come with a single model fitting function (\code{brm} and \code{MCMCglmm} respectively), through which all of their models can be specified. Further, their framework allows to seamlessly combine most modeling options with each other in the same model. In contrast, the approach of \pkg{rstanarm} is to emulate existing functions of other packages. This has the advantage of an easier transition between classical and Bayesian models, since the syntax used to specify models stays the same. However, it comes with the main disadvantage that many modeling options cannot be used in combination within the same model. Information criteria are available in all three packages. The advantages of WAIC and LOO implemented in \pkg{brms} and \pkg{rstanarm}, are their less restrictive assumptions and that their standard errors can be easily estimated to get a better sense of the uncertainty in the criteria. Comparing the prior options of the packages, \pkg{brms} offers a little more flexibility than \pkg{MCMCglmm} and \pkg{rstanarm}, as virtually any prior distribution can be applied on population-level effects as well as on the standard deviations of group-level effects. In addition, I believe that the way priors are specified in \pkg{brms} is more intuitive as it is directly evident what prior is actually applied. In \pkg{brms}, Bayes factors are available both via Savage-Dickey ratios \citep{wagenmakers2010} and bridge-sampling \citep{bridgesampling2017}, while \pkg{rstanarm} allows for the latter option. For a detailed comparison with respect to sampling efficiency, see \cite{brms1}. \begin{table}[hbtp] \centering \begin{tabular}{llll} & \parbox{2cm}{\pkg{brms}} & \parbox{2cm}{\pkg{rstanarm}} & \parbox{2cm}{\pkg{MCMCglmm}} \\ \hline \\ [-1.5ex] \parbox{6cm}{\textbf{Model classes}} & & & \\ [1ex] Linear models & yes & yes & yes \\ Robust linear models & yes & no & no \\ Count data models & yes & yes & yes \\ Survival models & yes & yes$^1$ & yes \\ Response times models & yes & no & no \\ Beta models & yes & yes & no \\ Categorical models & yes & yes$^2$ & yes \\ Multinomial models & no & no & yes \\ Ordinal models & various & cumulative$^2$ & cumulative \\ Zero-inflated and hurdle models & yes & no & yes \\ \hline \\ [-1.5ex] \parbox{5cm}{\textbf{Modeling options}} & & & \\ [1ex] Variable link functions & various & various & no \\ Multilevel structures & yes & yes & yes \\ Multi-membership & yes & no & yes \\ Multivariate responses & yes & yes$^3$ & yes \\ Non-linear predictors & yes & limited$^4$ & no \\ Distributional regression & yes & no & no \\ Finite mixtures & yes & no & no \\ Splines (additive models) & yes & yes & yes \\ Gaussian Processes & yes & no & no \\ Temporal autocorrelation & yes & yes$^{2, 5}$ & no \\ Spatial autocorrelation & yes & yes$^{2, 5}$ & no \\ Monotonic effects & yes & no & no \\ Category specific effects & yes & no & no \\ Measurement error & yes & no & no \\ Weights & yes & yes & no \\ Offset & yes & yes & using priors \\ Censored data & yes & yes$^1$ & yes \\ Truncated data & yes & no & no \\ Customized covariances & yes & no & yes \\ Missing value imputation & no & no & no \\ \hline \\ [-1.5ex] \textbf{Bayesian specifics} & & & \\ [1ex] Population-level priors & flexible & flexible & normal \\ Group-level priors & normal & normal & normal \\ Covariance priors & flexible & restricted$^6$ & restricted$^7$ \\ Bayes factors & yes & yes$^8$ & no \\ Parallelization & yes & yes & no \\ \hline \\ [-1.5ex] \textbf{Other} & & & \\ [1ex] Estimator & HMC, NUTS & HMC, NUTS & MH, Gibbs$^9$ \\ Information criterion & WAIC, LOO & WAIC, LOO & DIC \\ C++ compiler required & yes & no & no \\ \hline \end{tabular} \caption{ Comparison of the capabilities of the \pkg{brms}, \pkg{rstanarm} and \pkg{MCMCglmm} packages. Notes: (1) Advanced functionality available via \code{stan\_jm}. (2) No group-level terms and related functionality allowed. (3) Cannot be combined with other modeling options such as splines. (4) Functionality limited to linear Gaussian models and certein pre-specified non-linear functions. (5) Functionality available only on GitHub branches (\url{https://github.com/stan-dev/rstanarm}). (6) For details see \cite{hadfield2010}. (7) For details see \url{https://github.com/stan-dev/rstanarm/wiki/Prior-distributions}. (8) Available via the \pkg{bridgesampling} package \citep{bridgesampling2017}. (9) Estimator consists of a combination of both algorithms. } \label{comparison} \end{table} \section{Conclusion} The present paper is meant to introduce R users and developers to the extended \pkg{lme4} formula syntax applied in \pkg{brms}. Only a subset of modeling options were discussed in detail, which ensured the paper was not too broad. For some of the more basic models that \pkg{brms} can fit, see \citet{brms1}. Many more examples can be found in the growing number of vignettes accompanying the package (see \code{vignette(package = "brms")} for an overview). To date, \pkg{brms} is already one of the most flexible R packages when it comes to regression modeling. However, for the future, there are quite a few more features that I am planning to implement (see \url{https://github.com/paul-buerkner/brms/issues} for the current list of issues). In addition to smaller, incremental updates, I have two specific features in mind: (1) latent variables estimated via confirmatory factor analysis and (2) missing value imputation. I receive ideas and suggestions from users almost every day -- for which I am always grateful -- and so the list of features that will be implemented in the proceeding versions of \pkg{brms} will continue to grow. \section*{Acknowledgments} First of all, I would like to thank the Stan Development Team for creating the probabilistic programming language Stan, which is an incredibly powerful and flexible tool for performing full Bayesian inference. Without it, \pkg{brms} could not fit a single model. Furthermore, I want to thank Heinz Holling, Donald Williams and Ruben Arslan for valuable comments on earlier versions of the paper. I also would like to thank the many users who reported bugs or had ideas for new features, thus helping to continuously improve \pkg{brms}. \bibliography{citations_multilevel} \end{document} brms/vignettes/citations_multilevel.bib0000644000176200001440000002520513522262066020152 0ustar liggesusers% Encoding: UTF-8 @Article{brms2, title = {Advanced {Bayesian} Multilevel Modeling with the {R} Package {brms}}, author = {Paul-Christian Bürkner}, journal = {The R Journal}, year = {2018}, volume = {10}, number = {1}, pages = {395--411}, doi = {10.32614/RJ-2018-017}, encoding = {UTF-8}, } @Article{vehtari2016, author = {Vehtari, Aki and Gelman, Andrew and Gabry, Jonah}, title = {Practical Bayesian Model Evaluation Using Leave-One-Out Cross-Validation and WAIC}, journal = {Statistics and Computing}, year = {2016}, pages = {1--20}, publisher = {Springer}, } @Book{fahrmeir2013, title = {Regression: models, methods and applications}, publisher = {Springer Science \& Business Media}, year = {2013}, author = {Fahrmeir, Ludwig and Kneib, Thomas and Lang, Stefan and Marx, Brian}, } @Manual{gamlss.data, title = {gamlss.data: GAMLSS Data}, author = {Mikis Stasinopoulos and Bob Rigby}, year = {2016}, note = {R package version 5.0-0}, url = {https://CRAN.R-project.org/package=gamlss.data}, } @Article{wood2013, author = {Wood, Simon N and Scheipl, Fabian and Faraway, Julian J}, title = {Straightforward intermediate rank tensor product smoothing in mixed models}, journal = {Statistics and Computing}, year = {2013}, pages = {1--20}, publisher = {Springer}, } @Manual{mcelreath2017, title = {rethinking: Statistical Rethinking Course and Book Package}, author = {Richard McElreath}, year = {2017}, note = {R package version 1.59}, owner = {Paul}, timestamp = {2016.03.04}, url = {https://github.com/rmcelreath/rethinking}, } @Article{wagenmakers2010, author = {Wagenmakers, Eric-Jan and Lodewyckx, Tom and Kuriyal, Himanshu and Grasman, Raoul}, title = {Bayesian hypothesis testing for psychologists: A tutorial on the Savage--Dickey method}, journal = {Cognitive psychology}, year = {2010}, volume = {60}, number = {3}, pages = {158--189}, publisher = {Elsevier}, } @Manual{bridgesampling2017, title = {bridgesampling: Bridge Sampling for Marginal Likelihoods and Bayes Factors}, author = {Quentin F. Gronau and Henrik Singmann}, year = {2017}, note = {R package version 0.4-0}, url = {https://CRAN.R-project.org/package=bridgesampling}, } @BOOK{brown2015, title = {Applied Mixed Models in Medicine}, publisher = {John Wiley \& Sons}, year = {2015}, author = {Brown, Helen and Prescott, Robin}, owner = {Paul}, timestamp = {2015.06.19} } @Book{demidenko2013, title = {Mixed Models: Theory and Applications with R}, publisher = {John Wiley \& Sons}, year = {2013}, author = {Demidenko, Eugene}, owner = {Paul}, timestamp = {2015.06.19}, } @Book{gelmanMLM2006, title = {Data Analysis Using Regression and Multilevel/Hierarchical Models}, publisher = {Cambridge University Press}, year = {2006}, author = {Gelman, Andrew and Hill, Jennifer}, owner = {Paul}, timestamp = {2016.02.21}, } @Book{pinheiro2006, title = {Mixed-Effects Models in S and S-PLUS}, publisher = {Springer-Verlage Science \& Business Media}, year = {2006}, author = {Pinheiro, Jose and Bates, Douglas}, owner = {Paul}, timestamp = {2015.06.19}, } @Article{rigby2005, author = {Rigby, Robert A and Stasinopoulos, D Mikis}, title = {Generalized Additive Models for Location, Scale and Shape}, journal = {Journal of the Royal Statistical Society C (Applied Statistics)}, year = {2005}, volume = {54}, number = {3}, pages = {507--554}, publisher = {Wiley Online Library}, } @Article{lindstrom1990, author = {Lindstrom, Mary J and Bates, Douglas M}, title = {Nonlinear Mixed Effects Models for Repeated Measures Data}, journal = {Biometrics}, year = {1990}, pages = {673--687}, publisher = {JSTOR}, } @Article{wood2004, author = {Wood, Simon N}, title = {Stable and Efficient Multiple Smoothing Parameter Estimation for Generalized Additive Models}, journal = {Journal of the American Statistical Association}, year = {2004}, volume = {99}, number = {467}, pages = {673--686}, publisher = {Taylor \& Francis}, } @Article{rasmussen2006, author = {Rasmussen, Carl Edward and Williams, C. K. I.}, title = {Gaussian processes for machine learning}, year = {2006}, publisher = {Massachusetts Institute of Technology}, } @BOOK{hastie1990, title = {Generalized Additive Models}, publisher = {CRC Press}, year = {1990}, author = {Hastie, Trevor J and Tibshirani, Robert J}, volume = {43}, owner = {Paul}, timestamp = {2015.09.07} } @BOOK{gelman2014, title = {Bayesian Data Analysis}, publisher = {Taylor \& Francis}, year = {2014}, author = {Gelman, Andrew and Carlin, John B and Stern, Hal S and Rubin, Donald B}, volume = {2}, owner = {Paul}, timestamp = {2015.06.20} } @Manual{stanM2017, title = {Stan Modeling Language: User's Guide and Reference Manual}, author = {{Stan Development Team}}, year = {2017}, owner = {Paul}, timestamp = {2015.06.18}, url = {http://mc-stan.org/manual.html}, } @Article{carpenter2017, author = {Carpenter, B. and Gelman, A. and Hoffman, M. and Lee, D. and Goodrich, B. and Betancourt, M. and Brubaker, M. A. and Guo, J. and Li, P. and Ridell, A.}, title = {Stan: A Probabilistic Programming Language}, journal = {Journal of Statistical Software}, year = {2017}, owner = {Paul}, timestamp = {2015.06.19}, } @ARTICLE{duane1987, author = {Duane, Simon and Kennedy, Anthony D and Pendleton, Brian J and Roweth, Duncan}, title = {Hybrid Monte Carlo}, journal = {Physics Letters B}, year = {1987}, volume = {195}, pages = {216--222}, number = {2}, owner = {Paul}, publisher = {Elsevier}, timestamp = {2015.06.19} } @InBook{neal2011, chapter = {MCMC Using Hamiltonian Dynamics}, title = {Handbook of Markov Chain Monte Carlo}, publisher = {CRC Press}, year = {2011}, author = {Neal, Radford M}, volume = {2}, owner = {Paul}, timestamp = {2015.06.19}, } @Article{betancourt2014, author = {Betancourt, MJ and Byrne, Simon and Livingstone, Samuel and Girolami, Mark}, title = {The Geometric Foundations of Hamiltonian Monte Carlo}, journal = {arXiv preprint arXiv:1410.5110}, year = {2014}, } @ARTICLE{hoffman2014, author = {Hoffman, Matthew D and Gelman, Andrew}, title = {The No-U-Turn Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo}, journal = {The Journal of Machine Learning Research}, year = {2014}, volume = {15}, pages = {1593--1623}, number = {1}, owner = {Paul}, publisher = {JMLR. org}, timestamp = {2015.06.19} } @Article{betancourt2017, author = {Michael Betancourt}, title = {A Conceptual Introduction to Hamiltonian Monte Carlo}, journal = {arXiv preprint}, year = {2017}, url = {https://arxiv.org/pdf/1701.02434.pdf}, } @ARTICLE{bates2015, author = {Douglas Bates and Martin M{\"a}chler and Ben Bolker and Steve Walker}, title = {Fitting Linear Mixed-Effects Models Using \pkg{lme4}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {67}, pages = {1--48}, number = {1}, owner = {Paul}, timestamp = {2015.11.13} } @Article{hadfield2010, author = {Hadfield, Jarrod D}, title = {MCMC Methods for Multi-Response Generalized Linear Mixed Models: the \pkg{MCMCglmm} {R} Package}, journal = {Journal of Statistical Software}, year = {2010}, volume = {33}, number = {2}, pages = {1--22}, owner = {Paul}, timestamp = {2015.06.18}, } @Manual{rstanarm2017, title = {rstanarm: {Bayesian} applied regression modeling via {Stan}.}, author = {{Stan Development Team}}, year = {2017}, note = {R package version 2.17.2}, url = {http://mc-stan.org/}, } @Manual{afex2015, title = {\pkg{afex}: Analysis of Factorial Experiments}, author = {Henrik Singmann and Ben Bolker and Jake Westfall}, year = {2015}, note = {R package version 0.15-2}, owner = {Paul}, timestamp = {2016.02.13}, url = {https://CRAN.R-project.org/package=afex}, } @Article{brms1, author = {Paul-Christian B\"urkner}, title = {\pkg{brms}: An {R} Package for Bayesian Multilevel Models using Stan}, journal = {Journal of Statistical Software}, year = {2017}, encoding = {UTF-8}, } @Article{wood2011, author = {Wood, Simon N}, title = {Fast Stable Restricted Maximum Likelihood and Marginal Likelihood Estimation of Semiparametric Generalized Linear Models}, journal = {Journal of the Royal Statistical Society: Series B (Statistical Methodology)}, year = {2011}, volume = {73}, number = {1}, pages = {3--36}, publisher = {Wiley Online Library}, } @InProceedings{williams1996, author = {Williams, Christopher KI and Rasmussen, Carl Edward}, title = {Gaussian processes for regression}, booktitle = {Advances in neural information processing systems}, year = {1996}, pages = {514--520}, } @MANUAL{nlme2016, title = {\pkg{nlme}: Linear and Nonlinear Mixed Effects Models}, author = {Jose Pinheiro and Douglas Bates and Saikat DebRoy and Deepayan Sarkar and {R Core Team}}, year = {2016}, note = {R package version 3.1-124}, owner = {Paul}, timestamp = {2016.03.06}, url = {http://CRAN.R-project.org/package=nlme} } @Article{westfall2016, author = {Westfall, Jacob and Yarkoni, Tal}, title = {Statistically Controlling for Confounding Constructs is Harder than You Think}, journal = {PloS one}, year = {2016}, volume = {11}, number = {3}, pages = {e0152719}, publisher = {Public Library of Science}, } @Manual{loo2016, title = {\pkg{loo}: {E}fficient Leave-One-Out Cross-Validation and {WAIC} for {B}ayesian Models.}, author = {Aki Vehtari and Andrew Gelman and Jonah Gabry}, year = {2016}, note = {R package version 1.0.0}, url = {https://github.com/stan-dev/loo}, } @Manual{stan2017, title = {Stan: A C++ Library for Probability and Sampling, Version 2.17.0}, author = {{Stan Development Team}}, year = {2017}, owner = {Paul}, timestamp = {2015.06.18}, url = {http://mc-stan.org/}, } @Comment{jabref-meta: databaseType:bibtex;} brms/vignettes/brms_missings.Rmd0000644000176200001440000002322213606326627016564 0ustar liggesusers--- title: "Handle Missing Values with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Handle Missing Values with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction Many real world data sets contain missing values for various reasons. Generally, we have quite a few options to handle those missing values. The easiest solution is to remove all rows from the data set, where one or more variables are missing. However, if values are not missing completely at random, this will likely lead to bias in our analysis. Accordingly, we usually want to impute missing values in one way or the other. Here, we will consider two very general approaches using **brms**: (1) Impute missing values *before* the model fitting with multiple imputation, and (2) impute missing values on the fly *during* model fitting[^1]. As a simple example, we will use the `nhanes` data set, which contains information on participants' `age`, `bmi` (body mass index), `hyp` (hypertensive), and `chl` (total serum cholesterol). For the purpose of the present vignette, we are primarily interested in predicting `bmi` by `age` and `chl`. ```{r} data("nhanes", package = "mice") head(nhanes) ``` ## Imputation before model fitting There are many approaches allowing us to impute missing data before the actual model fitting takes place. From a statistical perspective, multiple imputation is one of the best solutions. Each missing value is not imputed once but `m` times leading to a total of `m` fully imputed data sets. The model can then be fitted to each of those data sets separately and results are pooled across models, afterwards. One widely applied package for multiple imputation is **mice** (Buuren & Groothuis-Oudshoorn, 2010) and we will use it in the following in combination with **brms**. Here, we apply the default settings of **mice**, which means that all variables will be used to impute missing values in all other variables and imputation functions automatically chosen based on the variables' characteristics. ```{r} library(mice) imp <- mice(nhanes, m = 5, print = FALSE) ``` Now, we have `m = 5` imputed data sets stored within the `imp` object. In practice, we will likely need more than `5` of those to accurately account for the uncertainty induced by the missingness, perhaps even in the area of `100` imputed data sets (Zhou & Reiter, 2010). Of course, this increases the computational burden by a lot and so we stick to `m = 5` for the purpose of this vignette. Regardless of the value of `m`, we can either extract those data sets and then pass them to the actual model fitting function as a list of data frames, or pass `imp` directly. The latter works because **brms** offers special support for data imputed by **mice**. We will go with the latter approach, since it is less typing. Fitting our model of interest with **brms** to the multiple imputed data sets is straightforward. ```{r, results = 'hide', message = FALSE} fit_imp1 <- brm_multiple(bmi ~ age*chl, data = imp, chains = 2) ``` The returned fitted model is an ordinary `brmsfit` object containing the posterior samples of all `m` submodels. While pooling across models is not necessarily straightforward in classical statistics, it is trivial in a Bayesian framework. Here, pooling results of multiple imputed data sets is simply achieved by combining the posterior samples of the submodels. Accordingly, all post-processing methods can be used out of the box without having to worry about pooling at all. ```{r} summary(fit_imp1) ``` In the summary output, we notice that some `Rhat` values are higher than $1.1$ indicating possible convergence problems. For models based on multiple imputed data sets, this is often a **false positive**: Chains of different submodels may not overlay each other exactly, since there were fitted to different data. We can see the chains on the right-hand side of ```{r} plot(fit_imp1, pars = "^b") ``` Such non-overlaying chains imply high `Rhat` values without there actually being any convergence issue. Accordingly, we have to investigate the convergence of the submodels separately, which we can do by looking at ```{r} round(fit_imp1$rhats, 2) ``` The convergence of each of the submodels looks good. Accordingly, we can proceed with further post-processing and interpretation of the results. For instance, we could investigate the combined effect of `age` and `chl`. ```{r} conditional_effects(fit_imp1, "age:chl") ``` To summarize, the advantages of multiple imputation are obvious: One can apply it to all kinds of models, since model fitting functions do not need to know that the data sets were imputed, beforehand. Also, we do not need to worry about pooling across submodels when using fully Bayesian methods. The only drawback is the amount of time required for model fitting. Estimating Bayesian models is already quite slow with just a single data set and it only gets worse when working with multiple imputation. ### Compatibility with other multiple imputation packages **brms** offers built-in support for **mice** mainly because I use the latter in some of my own research projects. Nevertheless, `brm_multiple` supports all kinds of multiple imputation packages as it also accepts a *list* of data frames as input for its `data` argument. Thus, you just need to extract the imputed data frames in the form of a list, which can then be passed to `brm_multiple`. Most multiple imputation packages have some built-in functionality for this task. When using the **mi** package, for instance, you simply need to call the `mi::complete` function to get the desired output. ## Imputation during model fitting Imputation during model fitting is generally thought to be more complex than imputation before model fitting, because one has to take care of everything within one step. This remains true when imputing missing values with **brms**, but possibly to a somewhat smaller degree. Consider again the `nhanes` data with the goal to predict `bmi` by `age`, and `chl`. Since `age` contains no missing values, we only have to take special care of `bmi` and `chl`. We need to tell the model two things. (1) Which variables contain missing values and how they should be predicted, as well as (2) which of these imputed variables should be used as predictors. In **brms** we can do this as follows: ```{r, results = 'hide', message = FALSE} bform <- bf(bmi | mi() ~ age * mi(chl)) + bf(chl | mi() ~ age) + set_rescor(FALSE) fit_imp2 <- brm(bform, data = nhanes) ``` The model has become multivariate, as we no longer only predict `bmi` but also `chl` (see `vignette("brms_multivariate")` for details about the multivariate syntax of **brms**). We ensure that missings in both variables will be modeled rather than excluded by adding `| mi()` on the left-hand side of the formulas[^2]. We write `mi(chl)` on the right-hand side of the formula for `bmi` to ensure that the estimated missing values of `chl` will be used in the prediction of `bmi`. The summary is a bit more cluttered as we get coefficients for both response variables, but apart from that we can interpret coefficients in the usual way. ```{r} summary(fit_imp2) conditional_effects(fit_imp2, "age:chl", resp = "bmi") ``` The results look pretty similar to those obtained from multiple imputation, but be aware that this may not be generally the case. In multiple imputation, the default is to impute all variables based on all other variables, while in the 'one-step' approach, we have to explictly specify the variables used in the imputation. Thus, arguably, multiple imputation is easier to apply. An obvious advantage of the 'one-step' approach is that the model needs to be fitted only once instead of `m` times. Also, within the **brms** framework, we can use multilevel structure and complex non-linear relationships for the imputation of missing values, which is not achieved as easily in standard multiple imputation software. On the downside, it is currently not possible to impute discrete variables, because **Stan** (the engine behind **brms**) does not allow estimating discrete parameters. [^1]: Actually, there is a third approach that only applies to missings in response variables. If we want to impute missing responses, we just fit the model using the observed responses and than impute the missings *after* fitting the model by means of posterior prediction. That is, we supply the predictor values corresponding to missing responses to the `predict` method. [^2]: We don't really need this for `bmi`, since `bmi` is not used as a predictor for another variable. Accordingly, we could also -- and equivalently -- impute missing values of `bmi` *after* model fitting by means of posterior prediction. ## References Buuren, S. V. & Groothuis-Oudshoorn, K. (2010). mice: Multivariate imputation by chained equations in R. *Journal of Statistical Software*, 1-68. doi.org/10.18637/jss.v045.i03 Zhou, X. & Reiter, J. P. (2010). A Note on Bayesian Inference After Multiple Imputation. *The American Statistician*, 64(2), 159-163. doi.org/10.1198/tast.2010.09109 brms/vignettes/brms_customfamilies.Rmd0000644000176200001440000003163313606326627017761 0ustar liggesusers--- title: "Define Custom Response Distributions with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Define Custom Response Distributions with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction The **brms** package comes with a lot of built-in response distributions -- usually called *families* in R -- to specify among others linear, count data, survival, response times, or ordinal models (see `help(brmsfamily)` for an overview). Despite supporting over two dozen families, there is still a long list of distributions, which are not natively supported. The present vignette will explain how to specify such *custom families* in **brms**. By doing that, users can benefit from the modeling flexibility and post-processing options of **brms** even when using self-defined response distributions. ## A Case Study As a case study, we will use the `cbpp` data of the **lme4** package, which describes the development of the CBPP disease of cattle in Africa. The data set contains four variables: `period` (the time period), `herd` (a factor identifying the cattle herd), `incidence` (number of new disease cases for a given herd and time period), as well as `size` (the herd size at the beginning of a given time period). ```{r cbpp} data("cbpp", package = "lme4") head(cbpp) ``` In a first step, we will be predicting `incidence` using a simple binomial model, which will serve as our baseline model. For observed number of events $y$ (`incidence` in our case) and total number of trials $T$ (`size`), the probability mass function of the binomial distribution is defined as $$ P(y | T, p) = \binom{T}{y} p^{y} (1 - p)^{N-y} $$ where $p$ is the event probability. In the classical binomial model, we will directly predict $p$ on the logit-scale, which means that for each observation $i$ we compute the success probability $p_i$ as $$ p_i = \frac{\exp(\eta_i)}{1 + \exp(\eta_i)} $$ where $\eta_i$ is the linear predictor term of observation $i$ (see `vignette("brms_overview")` for more details on linear predictors in **brms**). Predicting `incidence` by `period` and a varying intercept of `herd` is straight forward in **brms**: ```{r fit1, results='hide'} fit1 <- brm(incidence | trials(size) ~ period + (1|herd), data = cbpp, family = binomial()) ``` In the summary output, we see that the incidence probability varies substantially over herds, but reduces over the cource of the time as indicated by the negative coefficients of `period`. ```{r fit1_summary} summary(fit1) ``` A drawback of the binomial model is that -- after taking into account the linear predictor -- its variance is fixed to $\text{Var}(y_i) = T_i p_i (1 - p_i)$. All variance exceeding this value cannot be not taken into account by the model. There are multiple ways of dealing with this so called *overdispersion* and the solution described below will serve as an illustrative example of how to define custom families in **brms**. ## The Beta-Binomial Distribution The *beta-binomial* model is a generalization of the *binomial* model with an additional parameter to account for overdispersion. In the beta-binomial model, we do not predict the binomial probability $p_i$ directly, but assume it to be beta distributed with hyperparameters $\alpha > 0$ and $\beta > 0$: $$ p_i \sim \text{Beta}(\alpha_i, \beta_i) $$ The $\alpha$ and $\beta$ parameters are both hard to interprete and generally not recommended for use in regression models. Thus, we will apply a different parameterization with parameters $\mu \in [0, 1]$ and $\phi > 0$, which we will call $\text{Beta2}$: $$ \text{Beta2}(\mu, \phi) = \text{Beta}(\mu \phi, (1-\mu) \phi) $$ The parameters $\mu$ and $\phi$ specify the mean and precision parameter, respectively. By defining $$ \mu_i = \frac{\exp(\eta_i)}{1 + \exp(\eta_i)} $$ we still predict the expected probability by means of our transformed linear predictor (as in the original binomial model), but account for potential overdispersion via the parameter $\phi$. ## Fitting Custom Family Models The beta-binomial distribution is not natively supported in **brms** and so we will have to define it ourselves using the `custom_family` function. This function requires the family's name, the names of its parameters (`mu` and `phi` in our case), corresponding link functions (only applied if parameters are prediced), their theoretical lower and upper bounds (only applied if parameters are not predicted), information on whether the distribuion is discrete or continuous, and finally, whether additional non-parameter variables need to be passed to the distribution. For our beta-binomial example, this results in the following custom family: ```{r beta_binomial2} beta_binomial2 <- custom_family( "beta_binomial2", dpars = c("mu", "phi"), links = c("logit", "log"), lb = c(NA, 0), type = "int", vars = "vint1[n]" ) ``` The name `vint1` for the variable containing the number of trials is not chosen arbitrarily as we will see below. Next, we have to provide the relevant **Stan** functions if the distribution is not defined in **Stan** itself. For the `beta_binomial2` distribution, this is straight forward since the ordinal `beta_binomial` distribution is already implemented. ```{r stan_funs} stan_funs <- " real beta_binomial2_lpmf(int y, real mu, real phi, int T) { return beta_binomial_lpmf(y | T, mu * phi, (1 - mu) * phi); } int beta_binomial2_rng(real mu, real phi, int T) { return beta_binomial_rng(T, mu * phi, (1 - mu) * phi); } " ``` For the model fitting, we will only need `beta_binomial2_lpmf`, but `beta_binomial2_rng` will come in handy when it comes to post-processing. We define: ```{r stanvars} stanvars <- stanvar(scode = stan_funs, block = "functions") ``` To provide information about the number of trials (an integer variable), we are going to use the addition argument `vint()`, which can only be used in custom families. Simiarily, if we needed to include additional vectors of real data, we would use `vreal()`. Actually, for this particular example, we could more elegantly apply the addition argument `trials()` instead of `vint()`as in the basic binomial model. However, since the present vignette is ment to give a general overview of the topic, we will go with the more general method. We now have all components together to fit our custom beta-binomial model: ```{r fit2, results='hide'} fit2 <- brm( incidence | vint(size) ~ period + (1|herd), data = cbpp, family = beta_binomial2, stanvars = stanvars ) ``` The summary output reveals that the uncertainty in the coefficients of `period` is somewhat larger than in the basic binomial model, which is the result of including the overdispersion parameter `phi` in the model. Aparat from that, the results looks pretty similar. ```{r summary_fit2} summary(fit2) ``` ## Post-Processing Custom Family Models Some post-proecssing methods such as `summary` or `plot` work out of the box for custom family models. However, there are three particularily important methods, which require additional input by the user. These are `pp_expect`, `posterior_predict` and `log_lik` computing predicted mean values, predicted response values, and log-likelihood values, respectively. They are not only relevant for their own sake, but also provide the basis of many other post-processing methods. For instance, we may be interested in comparing the fit of the binomial model with that of the beta-binomial model by means of approximate leave-one-out cross-validation implemented in method `loo`, which in turn requires `log_lik` to be working. The `log_lik` function of a family should be named `log_lik_` and have the two arguments `i` (indicating observations) and `draws`. You don't have to worry too much about how `draws` is created. Instead, all you need to know is that parameters are stored in slot `dpars` and data are stored in slot `data`. Generally, parameters take on the form of a $S \times N$ matrix (with $S =$ number of posterior samples and $N =$ number of observations) if they are predicted (as is `mu` in our example) and a vector of size $N$ if the are not predicted (as is `phi`). We could define the complete log-likelihood function R directly, or we can expose the self-defined **Stan** functions and apply them. The latter approach is usually more convenient, but the former is more stable and the only option when implementing custom families in other R packages building upon **brms**. For the purpose of the present vignette, we will go with the latter approach ```{r} expose_functions(fit2, vectorize = TRUE) ``` and define the required `log_lik` functions with a few lines of code. ```{r log_lik} log_lik_beta_binomial2 <- function(i, draws) { mu <- draws$dpars$mu[, i] phi <- draws$dpars$phi trials <- draws$data$vint1[i] y <- draws$data$Y[i] beta_binomial2_lpmf(y, mu, phi, trials) } ``` With that being done, all of the post-processing methods requiring `log_lik` will work as well. For instance, model comparison can simply be performed via ```{r loo} loo(fit1, fit2) ``` Since larger `ELPD` values indicate better fit, we see that the beta-binomial model fits somewhat better, although the corresponding standard error reveals that the difference is not that substantial. Next, we will define the function necessary for the `posterior_predict` method: ```{r posterior_predict} posterior_predict_beta_binomial2 <- function(i, draws, ...) { mu <- draws$dpars$mu[, i] phi <- draws$dpars$phi trials <- draws$data$vint1[i] beta_binomial2_rng(mu, phi, trials) } ``` The `posterior_predict` function looks pretty similar to the corresponding `log_lik` function, except that we are now creating random samples of the response instead of log-liklihood values. Again, we are using an exposed **Stan** function for convenience. Make sure to add a `...` argument to your `posterior_predict` function even if you are not using it, since some families require additional arguments. With `posterior_predict` to be working, we can engage for instance in posterior-predictive checking: ```{r pp_check} pp_check(fit2) ``` When defining the `pp_expect` function, you have to keep in mind that it has only a `draws` argument and should compute the mean response values for all observations at once. Since the mean of the beta-binomial distribution is $\text{E}(y) = \mu T$ definition of the corresponding `pp_expect` function is not too complicated, but we need to get the dimension of parameters and data in line. ```{r pp_expect} pp_expect_beta_binomial2 <- function(draws) { mu <- draws$dpars$mu trials <- draws$data$vint1 trials <- matrix(trials, nrow = nrow(mu), ncol = ncol(mu), byrow = TRUE) mu * trials } ``` A post-processing method relying directly on `pp_expect` is `conditional_effects`, which allows to visualize effects of predictors. ```{r conditional_effects} conditional_effects(fit2, conditions = data.frame(size = 1)) ``` For ease of interpretation we have set `size` to 1 so that the y-axis of the above plot indicates probabilities. ## Turning a Custom Family into a Native Family Family functions built natively into **brms** are saver to use and more convenient, as they require much less user input. If you think that your custom family is general enough to be useful to other users, please feel free to open an issue on [GitHub](https://github.com/paul-buerkner/brms/issues) so that we can discuss all the details. Provided that we agree it makes sense to implement your family natively in brms, the following steps are required (`foo` is a placeholder for the family name): * In `family-lists.R`, add function `.family_foo` which should contain basic information about your family (you will find lots of examples for other families there). * In `families.R`, add family function `foo` which should be a simple wrapper around `.brmsfamily`. * In `stan-likelihood.R`, add function `stan_llh_foo` which provides the likelihood of the family in Stan language. * If necessary, add self-defined Stan functions in separate files under `inst/chunks`. * Add functions `posterior_predict_foo`, `pp_expect_foo` and `log_lik_foo` to `posterior_predict.R`, `pp_expect.R` and `log_lik.R`, respectively. * If necessary, add distribution functions to `distributions.R`. brms/vignettes/brms_families.Rmd0000644000176200001440000003271313450600656016520 0ustar liggesusers--- title: "Parameterization of Response Distributions in brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Parameterization of Response Distributions in brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- The purpose of this vignette is to discuss the parameterizations of the families (i.e., response distributions) used in brms. For a more general overview of the package see `vignette("brms_overview")`. ## Notation Throughout this vignette, we denote values of the response variable as $y$, a density function as $f$, and use $\mu$ to refer to the main model parameter, which is usually the mean of the response distribution or some closely related quantity. In a regression framework, $\mu$ is not estimated directly but computed as $\mu = g(\eta)$, where $\eta$ is a predictor term (see `help(brmsformula)` for details) and $g$ is the response function (i.e., inverse of the link function). ## Location shift models The density of the **gaussian** family is given by $$ f(y) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{1}{2}\left(\frac{y - \mu}{\sigma}\right)^2\right) $$ where $\sigma$ is the residual standard deviation. The density of the **student** family is given by $$ f(y) = \frac{\Gamma((\nu + 1)/2)}{\Gamma(\nu/2)} \frac{1}{\sqrt{\nu\pi}\sigma}\left(1 + \frac{1}{\nu} \left(\frac{y - \mu}{\sigma}\right)^2\right)^{-(\nu+1)/2} $$ $\Gamma$ denotes the gamma function and $\nu > 1$ are the degrees of freedom. As $\nu \rightarrow \infty$, the student distribution becomes the gaussian distribution. The density of the **skew_normal** family is given by $$ f(y) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{1}{2} \left(\frac{y - \xi}{\omega}\right)^2 \right) \left(1 + \text{erf} \left( \alpha \left(\frac{y - \xi}{\omega \sqrt{2}} \right) \right) \right) $$ where $\xi$ is the location parameter, $\omega$ is the positive scale parameter, $\alpha$ the skewness parameter, and $\text{erf}$ denotes the error function of the gaussian distribution. To parameterize the skew-normal distribution in terms of the mean $\mu$ and standard deviation $\sigma$, $\omega$ and $\xi$ are computed as $$ \omega = \frac{\sigma}{\sqrt{1 - \frac{2}{\pi} \frac{\alpha^2}{1 + \alpha^2}}} $$ $$ \xi = \mu - \omega \frac{\alpha}{\sqrt{1 + \alpha^2}} \sqrt{\frac{2}{\pi}} $$ If $\alpha = 0$, the skew-normal distribution becomes the gaussian distribution. For location shift models, $y$ can be any real value. ## Binary and count data models The density of the **binomial** family is given by $$ f(y) = {N \choose y} \mu^{y} (1-\mu)^{N - y} $$ where $N$ is the number of trials and $y \in \{0, ... , N\}$. When all $N$ are $1$ (i.e., $y \in \{0,1\}$), the bernoulli distribution for binary data arises. **binomial** and **bernoulli** families are distinguished in brms as the bernoulli distribution has its own implementation in Stan that is computationlly more efficient. For $y \in \mathbb{N}_0$, the density of the **poisson** family is given by $$ f(y) = \frac{\mu^{y}}{y!} \exp(-\mu) $$ The density of the **negbinomial** (negative binomial) family is $$ f(y) = {y + \phi - 1 \choose y} \left(\frac{\mu}{\mu + \phi}\right)^{y} \left(\frac{\phi}{\mu + \phi}\right)^\phi $$ where $\phi$ is a positive precision parameter. For $\phi \rightarrow \infty$, the negative binomial distribution becomes the poisson distribution. The density of the **geometric** family arises if $\phi$ is set to $1$. ## Survival models With survival models we mean all models that are defined on the positive reals only, that is $y \in \mathbb{R}^+$. The density of the **lognormal** family is given by $$ f(y) = \frac{1}{\sqrt{2\pi}\sigma x} \exp\left(-\frac{1}{2}\left(\frac{\log(y) - \mu}{\sigma}\right)^2\right) $$ where $\sigma$ is the residual standard deviation on the log-scale. The density of the **Gamma** family is given by $$ f(y) = \frac{(\alpha / \mu)^\alpha}{\Gamma(\alpha)} y^{\alpha-1} \exp\left(-\frac{\alpha y}{\mu}\right) $$ where $\alpha$ is a positive shape parameter. The density of the **weibull** family is given by $$ f(y) = \frac{\alpha}{s} \left(\frac{y}{s}\right)^{\alpha-1} \exp\left(-\left(\frac{y}{s}\right)^\alpha\right) $$ where $\alpha$ is again a positive shape parameter and $s = \mu / \Gamma(1 + 1 / \alpha)$ is the scale parameter to that $\mu$ is the mean of the distribution. The **exponential** family arises if $\alpha$ is set to $1$ for either the gamma or Weibull distribution. The density of the **inverse.gaussian** family is given by $$ f(y) = \left(\frac{\alpha}{2 \pi y^3}\right)^{1/2} \exp \left(\frac{-\alpha (y - \mu)^2}{2 \mu^2 y} \right) $$ where $\alpha$ is a positive shape parameter. ## Extreme value models Modeling extremes requires special distributions. One may use the **weibull** distribution (see above) or the **frechet** distribution with density $$ f(y) = \frac{\nu}{s} \left(\frac{y}{s}\right)^{-1-\nu} \exp\left(-\left(\frac{y}{s}\right)^{-\nu}\right) $$ where $s = \mu / \Gamma(1 - 1 / \nu)$ is a positive scale parameter and $\nu > 1$ is a shape parameter so that $\mu$ predicts the mean of the Frechet distribution. A generalization of both distributions is the generalized extreme value distribution (family **gen_extreme_value**) with density $$ f(y) = \frac{1}{\sigma} t(y)^{-1 - 1 / \xi} \exp(-t(y)) $$ where $$ t(y) = \left(1 + \xi \left(\frac{y - \mu}{\sigma} \right)\right)^{-1 / \xi} $$ with positive scale parameter $\sigma$ and shape parameter $\xi$. ## Response time models One family that is especially suited to model reaction times is the **exgaussian** ('exponentially modified Gaussian') family. Its density is given by $$ f(y) = \frac{1}{2 \beta} \exp\left(\frac{1}{2 \beta} \left(2\xi + \sigma^2 / \beta - 2 y \right) \right) \text{erfc}\left(\frac{\xi + \sigma^2 / \beta - y}{\sqrt{2} \sigma} \right) $$ where $\beta$ is the scale (inverse rate) of the exponential component, $\xi$ is the mean of the Gaussian componenent, $\sigma$ is the standard deviation of the Gaussian component, and $\text{erfc}$ is the complementary error function. We parameterize $\mu = \xi + \beta$ so that the main predictor term equals the mean of the distribution. Another family well suited for modelling response times is the **shifted_lognormal** distribution. It's density equals that of the **lognormal** distribution except that the whole distribution is shifted to the right by a positive parameter called *ndt* (for consistency with the **wiener** diffusion model explained below). A family concerned with the combined modelling of reaction times and corresponding binary responses is the **wiener** diffusion model. It has four model parameters each with a natural interpreation. The parameter $\alpha > 0$ describes the separation between two boundaries of the diffusion process, $\tau > 0$ describes the non-decision time (e.g., due to image or motor processing), $\beta \in [0, 1]$ describes the initial bias in favor of the upper alternative, and $\delta \in \mathbb{R}$ describes the drift rate to the boundaries (a positive value indicates a drift towards to upper boundary). The density for the reaction time at the upper boundary is given by $$ f(y) = \frac{\alpha}{(y-\tau)^3/2} \exp \! \left(- \delta \alpha \beta - \frac{\delta^2(y-\tau)}{2}\right) \sum_{k = - \infty}^{\infty} (2k + \beta) \phi \! \left(\frac{2k + \alpha \beta}{\sqrt{y - \tau}}\right) $$ where $\phi(x)$ denotes the standard normal density function. The density at the lower boundary can be obtained by substituting $1 - \beta$ for $\beta$ and $-\delta$ for $\delta$ in the above equation. In brms the parameters $\alpha$, $\tau$, and $\beta$ are modeled as auxiliary parameters named *bs* ('boundary separation'), *ndt* ('non-decision time'), and *bias* respectively, whereas the drift rate $\delta$ is modeled via the ordinary model formula that is as $\delta = \mu$. ## Quantile regression Quantile regression is implemented via family **asym_laplace** (asymmetric Laplace distribution) with density $$ f(y) = \frac{p (1 - p)}{\sigma} \exp\left(-\rho_p\left(\frac{y - \mu}{\sigma}\right)\right) $$ where $\rho_p$ is given by $\rho_p(x) = x (p - I_{x < 0})$ and $I_A$ is the indicator function of set $A$. The parameter $\sigma$ is a positive scale parameter and $p$ is the *quantile* parameter taking on values in $(0, 1)$. For this distribution, we have $P(Y < g(\eta)) = p$. Thus, quantile regression can be performed by fixing $p$ to the quantile to interest. ## Probability models The density of the **Beta** family for $y \in (0,1)$ is given by $$ f(y) = \frac{y^{\mu \phi - 1} (1-y)^{(1-\mu) \phi-1}}{B(\mu \phi, (1-\mu) \phi)} $$ where $B$ is the beta function and $\phi$ is a positive precision parameter. A multivariate generalization of the **Beta** family is the **dirichlet** family with density $$ f(y) = \frac{1}{B((\mu_{1}, \ldots, \mu_{K}) \phi)} \prod_{k=1}^K y_{k}^{\mu_{k} \phi - 1}. $$ The **dirichlet** distribution is only implemented with the multivariate logit link function so that $$ \mu_{j} = \frac{\exp(\eta_{j})}{\sum_{k = 1}^{K} \exp(\eta_{k})} $$ For reasons of identifiability, $\eta_{1}$ is set to $0$. ## Circular models The density of the **von_mises** family for $y \in (-\pi,\pi)$ is given by $$ f(y) = \frac{\exp(\kappa \cos(y - \mu))}{2\pi I_0(\kappa)} $$ where $I_0$ is the modified Bessel function of order 0 and $\kappa$ is a positive precision parameter. ## Ordinal and categorical models For ordinal and categorical models, $y$ is one of the categories $1, ..., K$. The intercepts of ordinal models are called thresholds and are denoted as $\tau_k$, with $k \in \{1, ..., K-1\}$, whereas $\eta$ does not contain a fixed effects intercept. Note that the applied link functions $h$ are technically distribution functions $\mathbb{R} \rightarrow [0,1]$. The density of the **cumulative** family (implementing the most basic ordinal model) is given by $$ f(y) = g(\tau_{y + 1} - \eta) - g(\tau_{y} - \eta) $$ The densities of the **sratio** (stopping ratio) and **cratio** (continuation ratio) families are given by $$ f(y) = g(\tau_{y + 1} - \eta) \prod_{k = 1}^{y} (1 - g(\tau_{k} - \eta)) $$ and $$ f(y) = (1 - g(\eta - \tau_{y + 1})) \prod_{k = 1}^{y} g(\eta - \tau_{k}) $$ respectively. Note that both families are equivalent for symmetric link functions such as logit or probit. The density of the **acat** (adjacent category) family is given by $$ f(y) = \frac{\prod_{k=1}^{y} g(\eta - \tau_{k}) \prod_{k=y+1}^K(1-g(\eta - \tau_{k}))}{\sum_{k=0}^K\prod_{j=1}^k g(\eta-\tau_{j}) \prod_{j=k+1}^K(1-g(\eta - \tau_{j}))} $$ For the logit link, this can be simplified to $$ f(y) = \frac{\exp \left(\sum_{k=1}^{y} (\eta - \tau_{k}) \right)} {\sum_{k=0}^K \exp\left(\sum_{j=1}^k (\eta - \tau_{j}) \right)} $$ The linear predictor $\eta$ can be generalized to also depend on the category $k$ for a subset of predictors. This leads to category specific effects (for details on how to specify them see `help(brm)`). Note that **cumulative** and **sratio** models use $\tau - \eta$, whereas **cratio** and **acat** use $\eta - \tau$. This is done to ensure that larger values of $\eta$ increase the probability of *higher* reponse categories. The **categorical** family is currently only implemented with the multivariate logit link function and has density $$ f(y) = \mu_{y} = \frac{\exp(\eta_{y})}{\sum_{k = 1}^{K} \exp(\eta_{k})} $$ Note that $\eta$ does also depend on the category $k$. For reasons of identifiability, $\eta_{1}$ is set to $0$. A generalization of the **categorical** family to more than one trial is the **multinomial** family with density $$ f(y) = {N \choose y_{1}, y_{2}, \ldots, y_{K}} \prod_{k=1}^K \mu_{k}^{y_{k}} $$ where, for each category, $\mu_{k}$ is estimated via the multivariate logit link function shown above. ## Zero-inflated and hurdle models **Zero-inflated** and **hurdle** families extend existing families by adding special processes for responses that are zero. The densitiy of a **zero-inflated** family is given by $$ f_z(y) = z + (1 - z) f(0) \quad \text{if } y = 0 \\ f_z(y) = (1 - z) f(y) \quad \text{if } y > 0 $$ where $z$ denotes the zero-inflation probability. Currently implemented families are **zero_inflated_poisson**, **zero_inflated_binomial**, **zero_inflated_negbinomial**, and **zero_inflated_beta**. The density of a **hurdle** family is given by $$ f_z(y) = z \quad \text{if } y = 0 \\ f_z(y) = (1 - z) f(y) / (1 - f(0)) \quad \text{if } y > 0 $$ Currently implemented families are **hurdle_poisson**, **hurdle_negbinomial**, **hurdle_gamma**, and **hurdle_lognormal**. The density of a **zero-one-inflated** family is given by $$ f_{\alpha, \gamma}(y) = \alpha (1 - \gamma) \quad \text{if } y = 0 \\ f_{\alpha, \gamma}(y) = \alpha \gamma \quad \text{if } y = 1 \\ f_{\alpha, \gamma}(y) = (1 - \alpha) f(y) \quad \text{if } y \notin \{0, 1\} $$ where $\alpha$ is the zero-one-inflation probability (i.e. the probability that zero or one occurs) and $\gamma$ is the conditional one-inflation probability (i.e. the probability that one occurs rather than zero). Currently implemented families are **zero_one_inflated_beta**. brms/vignettes/me_rent3.pdf0000644000176200001440000013306613252451326015450 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170908174613) /ModDate (D:20170908174613) /Title (R Graphics Output) /Producer (R 3.4.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 42286 /Filter /FlateDecode >> stream xKtKr7?Z1EۂȀDH= 2Dk܇%ѧOt[k̈'OۿOQox[VWZ?_k97~~KʘgV~_~'Ͽ\oپ_w5ϪZy_g_H?˯|ߚzh_ySLg_ ~s> ı$~Mq֟M=ׯڿ.\^Nרs>r9wr3Zz9_9QW_k%~ 3c֑1}]戼J ߞsSWn?'p<wfgi #/kwug?~lu=-ۓVwOv-slOݿ&8?"nQ?_]yTnşWk2jyٲ]7!9lf޼;?bf8wu;tiztKvU'zn>X?sLJ[2qe8r~?Mqn^xe30&cb2+2ӷw7ۣGts[B|kn8WS5tsf qBq/MWqkom?Vf'?zܗ6fz>\=r=%`zdiISد 2QbEW$[W4y/ʣzğ%bɣ7Fȏy)+A}:}8F1u{ݜ,WW KH-Od(%Н< /P0ECl(_ StRe:} t52B_PIbxn](WNeR4r=PG4r=Z&.霟G5=O,0еa;v8/BqzϳsݗwuX ~#ʫ=a?c]VjV w]!ͣ/h1+{`0ܙ+i%羴ǤX,uSN|46 ٯ-/f*cy;m@q3.^n ߬pR&{Y\g۷S|ܯ=ngW]K7{Wq=8 =&&C&GMp7ol/8 !l*.sw3M=Z Y yq-h9hcæΖşBT}|[İ#5¦|>-ʂ뾃LokbL3abIFG5ltdbAEGl'&Tt`AZ\`b =Nax“3X:|,11Ȁ^ok;95nAX28?Tg#Z"3 4( tQ}^xeDh~ tfX-5XgspM7^c0,w{k}F@ȶ'=/JGRG2apI4X"myN)z}nȒI_NA+K[ǀ@̀+na\摒'pJMB8 8,OQ Fop(/rd߯ed c*o#'>6Fݏ<%ö=c7e X_cY+Ŵ'C^[fWh;ܲw #Y`iqyGI. H!8Z.^j󈯡?b~|R=JR%}~rCv?!JL 8ʴ_ #MgO<&1vE.8*\HgAʿ[fd h` rdcBݐ^ i\˿GdԮ6]e3k#kq-g- 8W}o ԭ,.e@6u C3~CM6 u&Oĩe#ϿxqS `t0J68l\h,t'\d{~<6wm>d4ot綀p%l #u8b2[) ʐJ% >:LA&;2+1`SY~ VT!A;2~ȏx^dȀ`,Fl? B2 :&2ȰdrFlPf Lud&PUk[u u`l>L" 3)&7]_&C-UC)W(`&c' a2GUdZQ^hld}090H-rə\G3qH :4+"p ɼ഑'lAJXh(9㾄=$@…|b?il ޠu?#hbEb7C`F`Ha ,הw>{TF̯ Z|nI;cyR~?;`D#[Ȅ5Ö׭$ZVJ;_n-@?MJv+!1znSU< 'm'6~ѭB"КB=H= s`zKMT ]="iFBaI[y+D *ttT9=(T^z !! M4[y&DCiVUg~G4AjGisU&HCM)9ҏetUiTp4=_ytI?-NH^ v+$~ݖIVK\?3TOvڷ*2~lfd{ Zse O恙 -ou0 04-f׌=[wp<*Y(#,Tq'X Yibs瞩Fzy#gM0 ƨi$؛^X "b;};#l!q$yvq>]Î8qa]faI;T+/CV]|!w: = B* n/0>hkLV4NwVWVM4.Hj"#XhNUU-yp5|-3|{4,UVVoUR{dV*kX-ͪ҇))p CHjl)USa5)Mj s; Vן+7,%K'X5;*~ʮ:}mT<15t<0S˪H5N-&@@A*~TSE5Uܶ\ HYSlFmL0'"h쩥Pki~ ~SN`,PR+t[~AtDp KnKrTNzVtS{>p?2i/88ޘne=C "8'UMZ,ZTv %Û2A֤IdM#ư$$fYSb5{ ZLZT(Z'Zg֢vD&^D\Pk +BJ C"Дm|j\F! -6TFP_&" wT"tQP*fO"A" [؞)-z u& Y'Mؔ^zF@#ĶTDb8+6U$6 x?Kl6d%uO۲[RFl0[A<$."%0[o'C{ Hֿ=Ba$qeYtLb*3'MbElGĦGNhcPs4\_ІUUq=ЛK^׆w:&{~Σ.77|ňކץ-6<(M冗鬽yw\,`9`9,=N<d ; ;aS<Uyz ;/ C$7{;8yu ;gź-opVr>Rsk\:S7A7=x%b*l"dϪeBlBvf!{#2"cϷo3 Ի213سFv=O˨ "FЅxgJ{W"D®zw"aH JD^4ve{hXA HأHxdzA2 򭯷$7hHQ!ЌyoB*!P[9p((G ._!pAHM$T7ok yCD?1#jɠfm>a(9&Oͭ2$ΐ0/׺Wzv $CzcC&.=}͒b.Uo𺳀 ߄]BX cxEZ6r6 #nQ[>](9: %BIE%%@IWANw``S߄+[M6=Q`YL`!E%K l#T$ڮt`p(鐻"`90` f«wO,5{`Pk%h >aI`9g $vXf%Hk=[/=Xz%Ilf۪\+ .I6Ev>Tq>$;@U` d-|kb APucB$IF,߶rΧxgpH2+I@1$֎j:$N؊f$I> p$66QkFHFm6?!56IzFFDGML(F]$˨MLQ{Vu5&$Ȩ$`R!TqfQo1+KF vM1bԡAF1 QuJ:՟JFU?u߁i6biuaO2O;ȨO:>pA8E f(~^%~D{,:C??/ ~(v;`W,Y<*E2؝ ~'`=IA?6P*3D ~5;uG?[s=1%CďL#H2lDISe.?/?L '#,8sIǎn#+%H2U}B@NHZ }N`N?wB庀(1t0E`k*FhkѩE wt(5oWDηI詑)#hjL? E#\PGE{hDIzBͰc(г儢QHUF-c US(h[((O7^c~d`Csk~Ѐ(:2+ o}Ę>葁2DѡVL(_pQUw&(:4ٞ(:ECTh\/Qtd:DSjVEsWE@)h|?Q&%(c 1؁^DѡVq: %#Z K( qs"&ՠ$Zυ]Έ]DϮdC&UkPTs𨣧gS㱡*S㲉K㵉K5DE"\m0O4AT h#Н^!@C ݌5BC[1wJ@tbzcV4U>-CgO#*UN,HQ CI 7C"f?ˉ&]0f9?0F3nQY09NC"gM"ДS|H1 aF!sޮ'ct]$0cqq5Y $HgĞ ep"A"X#$c6ZXG +j7 ɘbr1'/ 1b{l[=Ō0yPFgMپ2f1U(A>e<12'Ę[)|))L& c*L0<0&4+Ǧ1GS'SUgbL51p P6\*F1RbLTNH2s1#I 'c.i29~ǘ NJ1猩^1(ŘcYdiGƌL2fTm1dL71ɘ#Ɯߪ̡Y1Ve\a*1fOɘTVK 1Xbʥyh c ^2fCN2LD2Llp%sp!WU]SNdY 9:,|~ɘSU2e&SZݟ4 `UΔ9_s_Lw0g_~ ϡ{996dx[ŲdL?͹\ n΂7q,9, v1ysshp!o:p&1=sXV,ݸǙtfBPQ8࿌y(?0`<`RdyD[o)ɠTc"=W?da/$.u*O`dYj3s.HDY̭M( YV8WJ}W0xSGх>_Lɒuu%&P@gO ZH:зF/%Y;gPr#Jv6pyPs |@^*`bPp %ǧO T .ʱRM݉%cLvI8cETGȒ*vM= "vK6Sdf9RcÎSoX%uXR[KnKnXr& KU=dɩdɩYԸZ_Jm%MASd:XKNr$K%gKV}{gs%M~{qe`:~w KNu%P3,9,9uYrfgbySɒS[0#,~#&FdYxȒp\]NvUf~q4dG p}W&KjxXR7c=JKĎ[W&b9@쨎3:Ďv14GvvWZ'캧/Dv٣sUdGZ1 vCVdo5\y:q>& hEvΎ8xOCIǶT6r";?1츱b@N+vVanD 9o,:"dy|h CH澞 2M`d4X0`Gd*#z;2 U:4e7 vbp}Q߉9;`GFh ;w숌-?E0"ΑDz!*#a;2bǪ[`GFy 7ֆ|HUl$FLW0\Qv1ܸ:1"z6{58 7Gz'0P85a62Gx9ʹ,d¡`62bWĈs$F\bD}1digɈ512Ĉ:D11⸧:#*g+FT11bDuɋudQň%F*+&:!L8uT5pj<30Zv0.>#Nw%~2EńCLB1RLqb}T/b Lm99L8}#C$&ߺ[Vq1[_x=L Yz]~s&܉qAo5 n[D7+FyO #~ !ȕ-79.~2pnRpE缑afM:S7-=ϴf{ؘ/~#?, sB\߀!4gH߈M0qN`^~ =k<870'N4DM(s&g&o@A e)o&V9CF9]7D؈ aVX$mz% vv#/M7bzwJ&w, OǞMh-gT/`F 2\O QlɆ ;t#E  P(ӵWPpjD[8E1`wS~KQx'4zgZ9mZ)wmHK~?K(n .Ҷ#90Då#ሂK+Rx(hUoy$%jMofrǥ;Kc WahG N! z*_DťrJ*+ˁKIF@ T\^@T\Dŕ40ZyHHhڕt Wy t\hBt\:mt:q4=G\J\QI\ %f% %WVy#P^\ W6vz%:8>dn&:zF8踊N?]?DUߥfc=­DGY=z):.?x1IzE zI#b=z"F@1vN; Gع~D] gb+$N!LB\O")B^mC*ByD$ĮbNBT1w: bMbJP=6u&q(_"GbDKzG}vosBXl10xqwv#H#/s{&zzIgd|&"Jd!1AzHOQnz XKxzH _2ggu}\}Mh,zҺ@;B㊎#wځ* =ozhGJgVa%Q RQ. Ýډ; M ӗ6 @ѰXe`9PbYU)z~_E oٱ6A1!b9R"˲@Y8|})\#O^oYNؑph #%ד=%-,r#38'X8u&)qV^ MZ&JT.1.Fj3"%x@+jH@3Rc{TPYH(2R)Q^ 5LJ\QkiJ%qHq753L+MJDK_{پo;!qo#K/%nM5$%b>ԥ#s8(qgR"9%>߶]Iyi-nN"w55Țu.qsq>R?M$EnM$EnH[eȭ2PR֙uH1(r'>H['>"w%"-c8#)RSE¢zvF鎐8kb;{LHGXѳ""{7h*COVbxB+\IT 큨Y!c,6yš`1F5ɁE72Ƅǭ!aqg+{vaqG!ny#,n(y[5ǭqrqOq78u. q(x,{×f Q 9)ᑀG u@`q+L8,z^W}ɽ^wKE,.$aQ!Sf=Я__`qq*aq|{^btBroMՀEs!w#|Bڄݸ [3OoV}-qYr1u朓K*b<+Ⱥl`ƌv0<֟O( DV݁l{A7UpS_$hY:#fhY8J{9o 0KX#̗c?UܱH48⎆U`;7_n2KmѲhL Bc2&40p ⎁N8!ܑ1WAfa@.wp@fYg8H$qG84cΦ24,@cN Ef;z_ -6Q$Иi?K_ Sd, ^<eh; ʹ"ǮJaXġB !̎1{ +,]t5Z@ݺاߋDڸQB̲`7@ 1'OŁ:p avfR!c3i.C51HCaT璪bΨ#Ypf)ICǒkk1,%2F ?`r `GvfpaNI3t73 &;j| R.~a}F;%=9,`#yZmtKXǍ7;'mk`3 v̧ d݉a.`m:*4ŽHp5E;Q,;+Ǩ Xv l cXjvGjp?ia:202\0|K_d$6qxelRgaxL԰i^N L~5ZO &\EHEDaC1|klœ e̲T06?d$q l gN*5&gR$Nj 0\,Il@ϵT03WF ,m? Mp鬅K:ʳ'A߆ְTK KœjedyxL"{9"LLfG$&ӻ÷eIlMfy9DO[&3Q6I&qkVyLP(.)i vܗW 'ՙ$o9>OIIR6ḠЙ}ET=۳O%\5$ؾ?xPV䃫3BI"CJJg6M\D>$oh 5J=$~' ʅRP0]:sYJWJN}$Ƽ]%Ix!$)*Ox( Z%4ZwqQCXJpw#@\WI}g~zh 8aB+R2"˫~%qKhEńW+V~׈mߥ~r7(H^XHҊTC~,:6]5yz+TUT,$DuFv"ʕ`pY芫PG!!FR\CH[#b(.;ʊc.Ub͡?ѥR\ԁ#FFc~tc]*g-{XqO*WTJOɡc P\r3vӣg*d0;h }CmU8 䣝+}"DXIt&hJdT>avAw׾D lnڛ rCvwQ'±}TǣW?Om$oqio[埿-D[sV^J%{=U!>o?'?? ?y18w4??kk'?/8Ÿ?ϋ]gğ=sJ?Im>vCϱqǟCƫzZ3^>|u>8Z"J3/ׇd;lstƋt׻gu$:Ŀ3(Et1 Z_w~ޫ/Ϟ%w[f/M/׏Y7Lg-7S|? ˏ'eݽt7X=B+i{?ǫYw, 2&A7~|?[oy |Z>Ǟz8Ŀ3)^z:D7P~ߑwq}G}7}dG mRxxR|GR|GR|GR|GRS]˟⍵ vl?;|IaLH/Y9wש_݋mbZ&)axi<A){ۓ7ٵ |19?Yx}(}m~ z,絘 W .&gH }ك˸OidfufџAr]C '@ y!k{kblLorc\sk**~&8=ݫVᶁN\Sq}}k xyLOe6dLO !5z^<+kZ-k}`(QY{L)g غ<7]g_h]ujc],eu&:%{+u3Uors-OZ ֿ'c4JaML>a#/>7~F)l[7|hܞ&}, @'>!:GJC{)l 'o0hu >jS>Wftµwu b*l݋Q>9h]3[@&o>i J7|-#[/H Qxy"z[}Z?+fzݢzl868%=g?K}YNcC]G׼NCZϸoi}x\sڈ>O~^Ҿ| zzƾ/麌}ϑ"ZuyWz(O 9&gTlk|mhX<^5lC& j&RCM)|~ ab-%ȡBOy9v>qҐlzNE =UU@&1;Vz65i1w1̳=g}_~j]:~*޹~Tu-bې5UC+\ =ǡ~Z?x:s ֯ݛhMvGq?!=O=;؁z{JJo/hn7 =[>I<˘χmyL˞MЧp=5%8;#=Ygiր)5&gvm, =-f`]kNԐ =͙g\Ž9甴Fv9I q։h1gnp]屴ɓ̿~zCoP'GcWw2ʋz.>5-7vL!]<2bZb xؙc93ryYl1J(Hd)g * [[AW䊂ϭdPqb+(* .ejq.Kx0>GΟGC؃~: ZFEح̺$٩awyE/<43G Zڮ*11I8ݸz]ks=4/8Mqlkk܏a׸[~h[h߀_w6îOiI}vMv}">:Et[v|ˎnw ;(;QvN7~!GyhwI-o^_=IO!MKP^PP' 8Fv^NAS/6𮳉۾zLof@%Ќd^4-EN(70I$C *, <0-,,rVd8BаЍKD4ЊÊMC+%A \ib$m;c \{k%N H] Y䤈 -V|Cqd,r Ef== ܨd<+h\OU1P6Kך>}"!}85S#mv?J?SD౞Sč2Е;* ߞ/CןcŪ~酙y^ĉp.ĤO6镕芌R3N<O=?=ws^QT"sapa2BeŅll\q?S9P(q2BeāC\H䐲 K_ 09PDȑa~QRpV 9PxrH$|oqnQC8pde6Fȁ<ج|fXXm?NhyEAX8P&WtǼ7VҊ'c~Uj~BG(96BhU`Cx{Ǘۓ쮠S=?3{R`nN8:5E/bz^R|&ޗNE^h/"e}]Rm^QWI#C{VE{MQ+^FOvK.Co e6Mj<:O)5z =׿5ζv-p*걞raF}7wDD\oA]iWy*. v-v];Hݡ(%iw A$rӭgx}SGܷ<ҢE,ep8\ ~Š X,%KAMz՝ʀlҭ tGI$%ҭ@8+=}I07VU۪lU:p{xNU-鶉nCo!vюL8!Zu>.c7ދN)X0VχV -G&Z`ciuŰb=?9*HU-/\ىsLEx=V*,o6%)Ex2u0VyF3[LŴdجL0lr0Pa b6`1Df:i'dLy'Cd2G,L;#\ 1IA3_0t0,}`,fbuVď S+[0s0lJC psAS39&#s re.  f^82X"+_WGyǦJ] Ff &^8'߆```3b^ڼ3?Z-^hyΗa{D>zc|}1i08.VD%N  d$1V3L qފ|n2jʩFdT2o#"ԏH/JL=qTĐ`o è}I1؟x?P+PoP|E\0'e0'{D-1{D%A2Ȳ<񲨖mKv0P<=g.{(bOes+b/bf2"blJ>0Z*>MN*Mތɢ; M_ZBs.0IEk4?E{L*"K@@{vR /WVA ~{Ov:UϸMiBB!kT2>h/t[ Dp2њ:k{QhMWк>mL 2MBVYMq*{u?p%c,BWbuXB{ [>ӽu`[г>IKow*n,: P_(Vj@ j´߆"c2™r*\ JPyr8BEІ\UUUOFU"] W5h؞@:}Bc *ҕD Mc.*"*t+**]BrP`hP {Uh MWaj,*(-Waj ]2]DWa *o2b$n [t\b S aLb i~~^o݊(69cQkSI 0:L֊j63}=|r AS2\s`I.wba/e=pF\ʹ&{,"1nqCľ^5/H]iܪg/PT86Em/f>Ckǡ/ R%jfݪJj/ jzkN_3%bA7cLw^D.*RD}z_D.AP_D.A8mo}\E#hR2iR.Mpg7@%- B )O { (:J*:?BrO}{D] @(s96_ȕM({\ Na,tK<>O.\"$ @<t.7'\ oOh7!u1bͨ.\r1|\R1dԗ1Pjg= fYpbLv˥7ƔL^O]o{N>\RL"W*?.wˬӇփ/ǥKzׅKI ~"ȥtzayCuGIOJ ^ 7*?4 k_d +KBS_eߐ7o.KM,CutYޔeerIpYBpqY#tYˢd,Q1Deȅ2>7$72]I%tY*~oP_\?25.ZzeˢjrY],*,~eQ\54 cL \eoeQ=5cSg(StQ-Lq̆\x4]Ut4WՄ9?S"(S"((5eFy9R$[wYxg,rT,y`gJ9eڋlTG"eF;\T-~T3_V߀ 3>JҜN(JGh)IKYQ2o$}q%} Ƣ5 >JfNI+VQgH'9(3IeU#)QNaӆFEtJ.V$(VRnCwT:Ӆ#CCEW=8ڟ [H WNITcs8%Ćp蔨N"Ž*)ir 67p.7[5ه3_popr`6D6!!:'EΈiGsf\9#U9CrNYj%s!ɻp z^ 8?F\u~9PpFJ97kcT>v:#Q*1SϊY4 2jR8?Ǽsɯ9IU/ gItF|:#[&.oO`L9'840aMuv0~|:;(Mުϯp)|#/ʵg'cHG8;͟yΎwU>Mј72/i2Flݟ47uJm(83r)”El=}v,QL5QKZGz9S Fșp؜SW!dgȏV79T>Ky^tԋViXΔ@y`P;hY I!S6عExaճsyRW̺48OSt۫G7`?34 9 `*Giȷ9̇1xV3Qi*#˜ tONMs2coC|LҞchbMzK‰"QxKI}:$xKY-u wReJR&ã4Rouio \y}}8hޥ(G3|8xK*nit&Ly/[*2846 /RcV5=N۶=gr^,χѬ`VVC$iQ&/M^H^xeE%C^SSS).j1)5 Uh2?Z ^E9I!ݔZ/-r|{0zMu^[W|SP򚊼W@Uu55Fc]*EL땁JRC3 z0zMI^ŽåD-/L^Rl0r'0yI}ӻ/ BA^CKhe^/ !ueB/'aPxaփ0zacy>xzM x  免 I^ؘv,/l, 6免%/ ^Gz{;&3x3^XAIx]E'Bs$tx^=(8:\^(jY$/opԨ׫MUIE)]I^ސF/o< FH!DJukTUI^Rxu BSTA^ЁVNEMvC?Pͬ(([TT-;u, }>c)}Pa/f2Y5)n^,(`Nn^Tș^oT;.ih|zu&CE+W75L^h\zu&U|&MA2'yu>yu'NU&WW@Dʎ^]ҫũ[^\ezqjo^V@.Ꚛ55bЫC!.âWQ~0(yq]8+W'W-yuq(: W삼mSU(M=uGˋ[d?yq ^{qӆ-=-Q+KX]U K 10l ,_HϮ\m77j#UZUU{f,I(NDqRU#^@qMm7m%XG @8WY%{{TKr^\PK 'YO5B,I倰MUm]m\R܅{dkZlFe؁.*ͥk)#f6A,LǑ #Ou^ ۛnMa(Ǚaa4ّ 0ivګ2a=V+4rUvP񛅗"(j|E6)7W⪾ M͑2Wܴf |H-J6TIge!WI'ci.qfLJoUPHOrVuU^Y&Q%'z‡ߺ>wrp8u!⩲Ē ۹+'7. Cx笜[C딭߼īaX,ݫrhVfrzΆ  eaK[SI="P:ǃU4,5 Ǭ)OY.Tvƒ"s㱻n-9sg J^wGg`Ax R`GAv% \4CxrGo,D/}M|)UKuY _ΗS/}2$/}2"(ݝQNr,:i/H_<@$ex% |iO K$#hQvϻr+KܜϚ ͟G[{6H؞<';{^}oms/$b.6H)a9lQ,ޫ(7xLtÎ*;kSj80IyW* (풮5t+F%@)m FE.7gʰKG"*XVQl,B昘`*-hr FEjPNnpN[k$0r 嵙t=q /%A0r1lESX^`;R/V `QH@Ό&gKF 29>Q~#:Q2$y%*}$eLmGD]SD#zM \Q]fخ(qi4VDSYBD( A)r^~JdψJ5QP)enTE`I"JB?'Ѻr}(FVP\R"Q.Qhj"eM8 PR&jm|!( qQ`HwE jq'w#݄CCBPȄj˗,gWM}NkEd  s_F[!u(BQn%m1sQ.5ܮҞQYIZ>˰~=+g5遼Z%V(kI[xĬikc^,b3]eZ4B282VVOQ(]uҞswM`GC'jBͰBU-=UKyJ[*+Y콲8]e(KS^yeoYYV&$fiE51ԼCKe< u5+~JެJ>WF%BZ 5: ]"ϗ,PP{u`HZZ^u꣑B[Qtl({G:Q} ePAk'ix=B=B{Z| 2 uk-GuȔ=B@[Dٻ=l-P]'Q@,@,dԽ5:{ u6s#!W9eoUAeWFwm$Nԭni ukPFeS;(D5@VEV{zVOx5ig#~N//]94Z=ՄC ` NjҎ$/.羹&"V!q;89 m#R%ɱ gsԃ)w MMjc x t)fm )WvDL'4^)?/cyywq/aVV պV N.em DGpHNrU9B'RVMրD>bᖷ/RNyi8B|IupWbeODUɉh!妒3+=f"C]CO@r:o8$V'ap D)lw'arafg$ .BoJC߅b9\83}Z6* ~k1'0XJa&061ޓ06~JЄ=ix?0,!F}`"L57p}gLm)04d&OKZ_OwHw1~Xըܞ'cfU|-G13y'n=cbax9J%)+[j#bk2Gr $F4z_ɕԻ3a0.є ;H҅j0T5w}oo %fU.H̾5d80 Sno]\}7F'&p0Q50V%1~ػbB2|%so %댹VubJvblPz#Mͦ soItsososodsoUs;f$qbns?R'~>[z^kdZF榞cnd sw s/@}+1特>O=IǨ5>S[ܪ\ox0fn[b[`[܏ԕ}i-dd`nAs7{`&a(`R4U9=D]/iք5vXcTE/!|Wl@p'O7!$Bp% } ^bH؅ÈEl xU@^Chګ;̦7s9YIKu_ZjSuPN4+tt.}Za9{0S\]U w`b@hƙBWU3W701wS)< j-9%vEpuK% :@ԡ?!bȱ>!;m$VoKy*ܒ>97V} +`gpӺ]vLPcK}B%rCiL4c}@jn poYR6T=³Ul_Eb>>;{6+r &?j#I< ƽ, /p`Wʷ /Zgp/0^srpO0^| {q=6 ƟT6 0eep0Q̓2s{ʹ_*upO0SOO,$0L>yGdsMb8LlA&6<@͖ۆ+cCI11Ye `JÏNgsB}R-$^gy3:w}z1Ob|}\5G&w19H;facK ?mci3\޹͗Rtx'Y8ʐ޹fjSNpߩP~3X,N:pIϲ{Ua^k EK$HNz~> an* ?$*XʀC=qF҄Mi4I#Z$5I+wrC"9&Mi`VIS㿦@M3P fLJmtzWAVϽ{iI uXIj,i5I M~'5ƽX_* uB'%$5AHw ᯓX"1HjԠ&!e"51"5Hjlu޽["5wIjll!Q[cHZDR"=HRw^$Nb $CSCY}ΥH G$-(iq$!FBAH &iK").B]$)$HR"$)ﮂS?&Iq4G28v$-IYG@š";&nA\,öCWA54~X/bɚ0=I 3#i!G2S7Ŕ.H{C*^l"_i_s0.I :x$7a{oHaHW HZ0糍FaQ\1^Q~ K|z0UV ᨪáR^w4Jd!3gV@i@ckY!!QbmTdbMD0Y;(JaԲ3(rQ)b8-T G#ͫvĶ;hQl;wl(1>[C ͸=q' <%DJám- XRN,=[?hN \w7Nu'r?{wvoTK v(+E?;(pXn qK:x}øNut<JN)(,L :ռ[cVp);: xUM^;ι݃ %q{͞gf8-sJ:7㺣Eحf}h͜P!v;//XsJx'a}wי5i9E SXnenS3sXX+.攷ҍr׹Db4NT\LTG*q1`\L\Ѐs^3SAS笠ybb .F[\L.h1S4 A.h=/q1G-buس<+.%p10+}\S4:]sP%.󑋹.s1m.뜬k r1Gɽ5D{zԽD.Fe˷fS+\Q "jRqzr5 !Wbwq5AnFf0\q3+1nK.sQ>q3V{;,&U,R5]%5jP5MՈ U_?M8:jX-Ɵ4SLF*$"U#6T WUCpӥ\]6xD9X~~d'NKׄ1Tbg,I=r%15">OX.X. ؔ2>gϐ,œgy+~$_wD3ݵvMSL,m< qL3dL $c&|i*߄CYp(w;h Wm՘*F1q &9ED2FfvNdZ6?hHƨ.z:_7pR'd*dLpB%%bdLQVH 1T5ɘ' Jf1Y]*$D7ӲDYui$dzᶝ"b N@)1"}]@Th`Ȅ@cJ@T*aN"+@Aq]p8 n&=!73|ba >Sq$A}5dil<6V#+3Tbml429!և(h:CFebe;#k2}ЃX2,N&Q`B/!+*JQh=8t>g}X-KjD8|K}CO,N,k\tPbq =KNy;ؠ Ö֏, ϓ"켝Bv+/BQGbX1,Q0-DRKDb&e6vqY2iKԸx)h!1T2!8Yʯ"KĶOD"-oեgхI-tgnS]uz5 nU6m>%ziM"FBHҨY4:c\J:Hi~%IƻAHSI鱴gcܫP@4A{4%H#oi$O{KT)i`˒9U$x DMP`^ ~`L❽ xF]p ]-Z: }3}wӥ otGokvloBUBUV3u! d_&m:Y/:؜+?w .ykw>fuXWU`TTg ,b"!_Á1 q8%F, fKKUZzQC]Tt#$v ,Q43Ov­k<MNke%gk̎g;P)\l6n)D-= vi*,tond ʞllCQ''&26G?(FU(QrF{0,(F=JtgJ<(CgEtsT_@8EJc}Z*E~&]4Bɠd-ڴ4QWea睎+G*)ς"} [D5K;$fA'G#TM֋~\Kt[[w4Д0nDQK,]繾鏈pQeg<2^G  !>.GF|\v7.Ոm w5Pčgz^bJX'&bTN8}D3Je8N|K8m50f Q540͚lA5Y!уWH~JP5274Ʊ.W*%LI^m}T3^5a2(΄WD|*\cbP;l;k1k튕*ȝk \hv]-QINLrJM?'L*…#'̬:^Ep}*] #Y_|Y0gz Ȟ`dOb PY;TDTGOnDb9@,@AT 'ˠ P*4) -q@p$E; d ]+HUU]/- @>bBTH0*  3J"ܯ^_1C*ApHV^9s}#PO![֔p B($ \D1C2 v|vʴ 0]|hꮝ K _ȉ9`1]b:G2Qb8`PMҲ̎ HggOApcQ0Dwi*R eVϖ2oU ?Vu =ɭu? &uY8~L~Ta*ۖ]u[c{] v(GQ*'½ICzG :C垪֡HH83ǵꔅ1OHH8:LԺ alTQ&UG纾Xs.3vr? ?W랛7i e9 M[s"M(ׯ)ʫGd&?J?WtǤA I?lzgע)-Jз4) 91`I*5зWozWiTwbt5w%fLs5 ԫrW{k*ju1oMu}2ʝ gq:3Yvb{|8@ZhMƵp0!XvqLjp˪g]4c,nY]r܅fz.솇0ӻ$)?uKsz`?\KrV0kJ,Xt4E$J ?0kDccJ=ۇ5A=5d3,mY8io{vڛǬT!jev%!f<!>Ge֎ 6fa!`?l}3 LJi.ǔS=d9-e`L7~Ä&W }6Ic 00ڣ&J n>x?Z'/J6 dh}Ywk';A:vK֩G~NllhTM'Y?Z'ތN!ڐ͆|P&26dVZ-ähLu1ad4!"7Y lQT`,~ #?Q Sx5:a4 +4dZ*h! a"mv ]W,{Y,EL2yn%pף3eyɕHʝ5d;,<.uK +s+1bix^=%İb0 v<iaгf>N0  w|J1,iUò J$Ri10x,?)^uL 3c+A{lw6v v zd$jv0$. cɞ(si-gq.| % jⲺ_~.y\?Џr+DgLLK>D{D;8(G$% ixDŹl-M}ͩ7żnȗN ?v+cԑ(1wW>iuM(Bnߏ2)TFR1[ Rw'{TcdBql(z#cxR?f5?ߊ)ϷC s^㴿 8;j~Yk~pix3ZWp~T|}zv7#2.y_2^uu.,XO*7-C K9 Vx?\0}z$}}j_.3O~~\$} >j.+oa?-+^]˷s[w_.Ϳ~W_nfzT+?? >~+>A5>g% .څ0Ms&^*/p]XOz|a{!ށ}ǨV׸|k_k z_kPubendstream endobj 9 0 obj << /Type /XObject /Subtype /Image /Width 1 /Height 13 /ColorSpace 5 0 R /BitsPerComponent 8 /Length 48 /Interpolate true /Filter /FlateDecode >> stream xt-׊ 36ԨkҪHtipSqendstream endobj 10 0 obj << /Type /XObject /Subtype /Image /Width 1 /Height 12 /ColorSpace 5 0 R /BitsPerComponent 8 /Length 45 /Interpolate true /Filter /FlateDecode >> stream x{p-!1{ski1﵍rrjuwMxendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 576 216] >> endobj 4 0 obj << /ProcSet [/PDF /Text /ImageC] /Font <> /XObject << /Im0 9 0 R /Im1 10 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 11 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 11 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000043139 00000 n 0000043222 00000 n 0000043384 00000 n 0000043417 00000 n 0000000212 00000 n 0000000292 00000 n 0000042651 00000 n 0000042896 00000 n 0000046112 00000 n 0000046207 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 46307 %%EOF brms/vignettes/brms_nonlinear.Rmd0000644000176200001440000003042513610312641016702 0ustar liggesusers--- title: "Estimating Non-Linear Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Non-Linear Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction This vignette provides an introduction on how to fit non-linear multilevel models with **brms**. Non-linear models are incredibly flexible and powerful, but require much more care with respect to model specification and priors than typical generalized linear models. Ignoring group-level effects for the moment, the predictor term $\eta_n$ of a generalized linear model for observation $n$ can be written as follows: $$\eta_n = \sum_{i = 1}^K b_i x_{ni}$$ where $b_i$ is the regression coefficient of predictor $i$ and $x_{ni}$ is the data of predictor $i$ for observation $n$. This also compromises interaction terms and various other data transformations. However, the structure of $\eta_n$ is always linear in the sense that the regression coefficients $b_i$ are multiplied by some predictor values and then summed up. This implies that the hypothetical predictor term $$\eta_n = b_1 \exp(b_2 x_n)$$ would *not* be a *linear* predictor anymore and we could not fit it using classical techniques of generalized linear models. We thus need a more general model class, which we will call *non-linear* models. Note that the term 'non-linear' does not say anything about the assumed distribution of the response variable. In particular it does not mean 'not normally distributed' as we can apply non-linear predictor terms to all kinds of response distributions (for more details on response distributions available in **brms** see `vignette("brms_families")`). ## A Simple Non-Linear Model We begin with a simple example using simulated data. ```{r} b <- c(2, 0.75) x <- rnorm(100) y <- rnorm(100, mean = b[1] * exp(b[2] * x)) dat1 <- data.frame(x, y) ``` As stated above, we cannot use a generalized linear model to estimate $b$ so we go ahead an specify a non-linear model. ```{r, results='hide'} prior1 <- prior(normal(1, 2), nlpar = "b1") + prior(normal(0, 2), nlpar = "b2") fit1 <- brm(bf(y ~ b1 * exp(b2 * x), b1 + b2 ~ 1, nl = TRUE), data = dat1, prior = prior1) ``` When looking at the above code, the first thing that becomes obvious is that we changed the `formula` syntax to display the non-linear formula including predictors (i.e., `x`) and parameters (i.e., `b1` and `b2`) wrapped in a call to `bf`. This stands in contrast to classical **R** formulas, where only predictors are given and parameters are implicit. The argument `b1 + b2 ~ 1` serves two purposes. First, it provides information, which variables in `formula` are parameters, and second, it specifies the linear predictor terms for each parameter. In fact, we should think of non-linear parameters as placeholders for linear predictor terms rather than as parameters themselves (see also the following examples). In the present case, we have no further variables to predict `b1` and `b2` and thus we just fit intercepts that represent our estimates of $b_1$ and $b_2$ in the model equation above. The formula `b1 + b2 ~ 1` is a short form of `b1 ~ 1, b2 ~ 1` that can be used if multiple non-linear parameters share the same formula. Setting `nl = TRUE` tells **brms** that the formula should be treated as non-linear. In contrast to generalized linear models, priors on population-level parameters (i.e., 'fixed effects') are often mandatory to identify a non-linear model. Thus, **brms** requires the user to explicitely specify these priors. In the present example, we used a `normal(1, 2)` prior on (the population-level intercept of) `b1`, while we used a `normal(0, 2)` prior on (the population-level intercept of) `b2`. Setting priors is a non-trivial task in all kinds of models, especially in non-linear models, so you should always invest some time to think of appropriate priors. Quite often, you may be forced to change your priors after fitting a non-linear model for the first time, when you observe different MCMC chains converging to different posterior regions. This is a clear sign of an idenfication problem and one solution is to set stronger (i.e., more narrow) priors. To obtain summaries of the fitted model, we apply ```{r} summary(fit1) plot(fit1) plot(conditional_effects(fit1), points = TRUE) ``` The `summary` method reveals that we were able to recover the true parameter values pretty nicely. According to the `plot` method, our MCMC chains have converged well and to the same posterior. The `conditional_effects` method visualizes the model-implied (non-linear) regression line. We might be also interested in comparing our non-linear model to a classical linear model. ```{r, results='hide'} fit2 <- brm(y ~ x, data = dat1) ``` ```{r} summary(fit2) ``` To investigate and compare model fit, we can apply graphical posterior predictive checks, which make use of the **bayesplot** package on the backend. ```{r} pp_check(fit1) pp_check(fit2) ``` We can also easily compare model fit using leave-one-out cross-validation. ```{r} loo(fit1, fit2) ``` Since smaller `LOOIC` values indicate better model fit, it is immediately evident that the non-linear model fits the data better, which is of course not too surpirsing since we simulated the data from exactly that model. ## A Real-World Non-Linear model On his blog, Markus Gesmann predicts the growth of cumulative insurance loss payments over time, originated from different origin years (see https://www.magesblog.com/post/2015-11-03-loss-developments-via-growth-curves-and/). We will use a slightly simplified version of his model for demonstration purposes here. It looks as follows: $$cum_{AY, dev} \sim N(\mu_{AY, dev}, \sigma)$$ $$\mu_{AY, dev} = ult_{AY} \left(1 - \exp\left(- \left( \frac{dev}{\theta} \right)^\omega \right) \right)$$ The cumulative insurance payments $cum$ will grow over time, and we model this dependency using the variable $dev$. Further, $ult_{AY}$ is the (to be estimated) ultimate loss of accident each year. It constitutes a non-linear parameter in our framework along with the parameters $\theta$ and $\omega$, which are responsible for the growth of the cumulative loss and are assumed to be the same across years. We load the data ```{r} loss <- read.csv("https://paul-buerkner.github.io/data/loss.csv") head(loss) ``` and translate the proposed model into a non-linear **brms** model. ```{r, results='hide'} fit_loss <- brm( bf(cum ~ ult * (1 - exp(-(dev/theta)^omega)), ult ~ 1 + (1|AY), omega ~ 1, theta ~ 1, nl = TRUE), data = loss, family = gaussian(), prior = c( prior(normal(5000, 1000), nlpar = "ult"), prior(normal(1, 2), nlpar = "omega"), prior(normal(45, 10), nlpar = "theta") ), control = list(adapt_delta = 0.9) ) ``` We estimate a group-level effect of accident year (variable `AY`) for the ultimate loss `ult`. This also shows nicely how a non-linear parameter is actually a placeholder for a linear predictor, which in case of `ult`, contains only an varying intercept over year. Again, priors on population-level effects are required and, for the present model, are actually mandatory to ensure identifiability. We summarize the model using well known methods. ```{r} summary(fit_loss) plot(fit_loss, N = 3, ask = FALSE) conditional_effects(fit_loss) ``` Next, we show marginal effects separately for each year. ```{r} conditions <- data.frame(AY = unique(loss$AY)) rownames(conditions) <- unique(loss$AY) me_loss <- conditional_effects( fit_loss, conditions = conditions, re_formula = NULL, method = "predict" ) plot(me_loss, ncol = 5, points = TRUE) ``` It is evident that there is some variation in cumulative loss across accident years, for instance due to natural disasters happening only in certain years. Further, we see that the uncertainty in the predicted cumulative loss is larger for later years with fewer available data points. ## Advanced Item-Response Models As a third example, we want to show how to model more advanced item-response models using the non-linear model framework of **brms**. For simplicity, suppose we have a single forced choice item with three alternatives of which only one is correct. Our response variable is whether a person answers the item correctly (1) or not (0). Person are assumed to vary in their ability to answer the item correctly. However, every person has a 33% chance of getting the item right just by guessing. We thus simulate some data to reflect this situation. ```{r} inv_logit <- function(x) 1 / (1 + exp(-x)) ability <- rnorm(300) p <- 0.33 + 0.67 * inv_logit(ability) answer <- ifelse(runif(300, 0, 1) < p, 1, 0) dat_ir <- data.frame(ability, answer) ``` The most basic item-response model is equivalent to a simple logistic regression model. ```{r, results='hide'} fit_ir1 <- brm(answer ~ ability, data = dat_ir, family = bernoulli()) ``` However, this model completely ignores the guessing probability and will thus likely come to biased estimates and predictions. ```{r} summary(fit_ir1) plot(conditional_effects(fit_ir1), points = TRUE) ``` A more sophisticated approach incorporating the guessing probability looks as follows: ```{r, results='hide'} fit_ir2 <- brm( bf(answer ~ 0.33 + 0.67 * inv_logit(eta), eta ~ ability, nl = TRUE), data = dat_ir, family = bernoulli("identity"), prior = prior(normal(0, 5), nlpar = "eta") ) ``` It is very important to set the link function of the `bernoulli` family to `identity` or else we will apply two link functions. This is because our non-linear predictor term already contains the desired link function (`0.33 + 0.67 * inv_logit`), but the `bernoulli` family applies the default `logit` link on top of it. This will of course lead to strange and uninterpretable results. Thus, please make sure that you set the link function to `identity`, whenever your non-linear predictor term already contains the desired link function. ```{r} summary(fit_ir2) plot(conditional_effects(fit_ir2), points = TRUE) ``` Comparing model fit via leave-one-out cross-validation ```{r} loo(fit_ir1, fit_ir2) ``` shows that both model fit the data equally well, but remember that predictions of the first model might still be misleading as they may well be below the guessing probability for low ability values. Now, suppose that we don't know the guessing probability and want to estimate it from the data. This can easily be done changing the previous model just a bit. ```{r, results='hide'} fit_ir3 <- brm( bf(answer ~ guess + (1 - guess) * inv_logit(eta), eta ~ 0 + ability, guess ~ 1, nl = TRUE), data = dat_ir, family = bernoulli("identity"), prior = c( prior(normal(0, 5), nlpar = "eta"), prior(beta(1, 1), nlpar = "guess", lb = 0, ub = 1) ) ) ``` Here, we model the guessing probability as a non-linear parameter making sure that it cannot exceed the interval $[0, 1]$. We did not estimate an intercept for `eta`, as this will lead to a bias in the estimated guessing parameter (try it out; this is an excellent example of how careful one has to be in non-linear models). ```{r} summary(fit_ir3) plot(fit_ir3) plot(conditional_effects(fit_ir3), points = TRUE) ``` The results show that we are able to recover the simulated model parameters with this non-linear model. Of course, real item-response data have multiple items so that accounting for item and person variability (e.g., using a multilevel model with varying intercepts) becomes necessary as we have multiple observations per item and person. Luckily, this can all be done within the non-linear framework of **brms** and I hope that this vignette serves as a good starting point. brms/vignettes/kidney_conditional_effects.pdf0000644000176200001440000002451513606326627021307 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170125183821) /ModDate (D:20170125183821) /Title (R Graphics Output) /Producer (R 3.3.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 6431 /Filter /FlateDecode >> stream x\ˮGr߯8Ki3]gl m,H ,`/ȈKA^ }u[_o8n='ӎ1/n}wXڽ[zK;ųO~?ǽۓ{﷑ҽ۫>4XH<vpw<-N>dc3\~/67^RÄ8kݰ?_=ǧ_o^~:9}~8L&nb8}/w&r8.ɱ.p;.yb倇,X:Ã'1MPap|b9U߆'ǃgNɿ5l_OίvǮc&R)/noYtk%O^~X<;]| ׷ק[ nX?`_gקlտݭ^3qw;4Ḻ%s133-fLjKrKYJsNְmN8^?/4zn>m~>_?/b6M~{n6L_2__XHڹqT#qi&h_sw \}֯~fn毚d&Zl<6mOa`|Lgjw`'@~3y-AyWL&[a[M~@aw4}xL6iӮmnIczp95ຍS-x,ySLKǒ79zZ/`GZOZo``ʗPi7s#pK_ǦOC 0Ӳ7G2e/_\Gx,^0_sv)B>}{<<CϱeX/]3|D|D|w# y;wCWKS'k[7XW<|߃?p~(>_$79?$uGR>/}_:ŗ)ic}HtH"m|@Eqr!Ϸo5IkcgdlI=o2~q}`[;>=??g3?;Xt@0WO'|0||ȒṞZze;.|/ko zj^B{{Ob}ǧ+ut`cSSIO=gϞO(&^՟^'o{?l6p"* \y_|߾>9 "$㤱="O 8 TTTӌ]otBp"0z;zv|FSٚOFpѐ#υйy:qDžԇ/~ҾSO}?s5؃~k{?ޞqHEiE;$БÓHO#9%<>=5'?Ȩ~F6`㗲o`\wv]zvCFi,>"ya;Msڟ߬g;1ZȀ9E^R^w~7=YXw ,jWMC(Y[w zv/LdW>'v IS]N4Hmeҫ\Ӿ.dYup]/vEh)ǡGrd͝c[ /w\#Aܖ0qϾ_i&~!^w#+^EwC>@cBϯy7 ކFF`Um(\"r)lȻ%E"iٶ0W*~[A zjtbwF0Fl)yu+/j)5VVOqrsGڋ-ʞ/j5@3K rRtdOhg>ns$oft^XKF\0CEzdj9dwPuU4*r~3ے7^oforJCт'xp{z,VW3ʎtv siM]PUM~3[s$@i>Fd[2[變+{ٖTeNyҼET{xiD f7Oo>ܺ(tA;J%99p(6O:bnW֠^of>p.1ȥNUi*iǪN r3 @QSUϪUWU xYU X[qy@/< r-s{I4&: rJ;r1$\Hz!:%G\N9Hj$qzl}|/ڙ];gѨD#d!z5Xwd:$ک uJlQ,ӈ^.␱h`@#ڸf8H&IVpFߟ}tkyp{gL7S)k/xHL0ɦ-uRŊR\|xH: UmK piB!c,Hř E`Ώ vN1!$FĈp$b=6 72-|>0˸N)0@,$Y <!Y!'=83#\6`Gq 9ΐ}BKufcpBF XaqX'WHk+T`y6-\ 7x3WcE 'C0Ϙ4yRQ3lL8WxU>-]8{FK)?`oL$0sW(!0gTMA;Wq+LgbIM@q$]))Ҥ*ΗpqѱosYߢr=h A$HAbQAskZ%SUUNUUQDO2XJ9ʷJtK@҈$ =g49SߩONi,l=q*EYb۔#8eU.P9[xҢ:q}+ fQu2XRzG7e3 3r,TtXfꤑЄfh`Ii~3rY4Ω/АHѰg2oSJe̮JO̦GMw*ٌJ)Է6 NuENխ@˽Լ\X{*w->U֑ӟp 0PT^X& E3j@alFH`I@H{+0V q S} 8x2W` ۨn`,}cO1,ʢ|F`5NE)x>"1CEQ"@U(vzdPgɝ<i"V8ΫNBRqD6e,t8 GD P뭈"ڬ&IFasݹ,`+[ߌe,/ЖC=\eyOҸZrT.Չ=/GiO)|H "VO}s'~jޣVZpEŶ./oo;u.Z|kh^KiR.oH1TN09Ixh{(}?endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 504 828] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F7 11 0 R >> /ExtGState << /GS1 12 0 R /GS257 13 0 R /GS258 14 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj 12 0 obj << /Type /ExtGState /CA 1.000 >> endobj 13 0 obj << /Type /ExtGState /ca 0.400 >> endobj 14 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 15 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000006795 00000 n 0000006878 00000 n 0000007042 00000 n 0000007075 00000 n 0000000212 00000 n 0000000292 00000 n 0000009770 00000 n 0000009864 00000 n 0000009948 00000 n 0000010047 00000 n 0000010096 00000 n 0000010145 00000 n trailer << /Size 15 /Info 1 0 R /Root 2 0 R >> startxref 10194 %%EOF brms/vignettes/brms_multivariate.Rmd0000644000176200001440000002027213606326627017440 0ustar liggesusers--- title: "Estimating Multivariate Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Multivariate Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction In the present vignette, we want to discuss how to specify multivariate multilevel models using **brms**. We call a model *multivariate* if it contains multiple response variables, each being predicted by its own set of predictors. Consider an example from biology. Hadfield, Nutall, Osorio, and Owens (2007) analyzed data of the Eurasian blue tit (https://en.wikipedia.org/wiki/Eurasian_blue_tit). They predicted the `tarsus` length as well as the `back` color of chicks. Half of the brood were put into another `fosternest`, while the other half stayed in the fosternest of their own `dam`. This allows to separate genetic from environmental factors. Additionally, we have information about the `hatchdate` and `sex` of the chicks (the latter being known for 94\% of the animals). ```{r data} data("BTdata", package = "MCMCglmm") head(BTdata) ``` ## Basic Multivariate Models We begin with a relatively simple multivariate normal model. ```{r fit1, message=FALSE, warning=FALSE, results='hide'} fit1 <- brm( mvbind(tarsus, back) ~ sex + hatchdate + (1|p|fosternest) + (1|q|dam), data = BTdata, chains = 2, cores = 2 ) ``` As can be seen in the model code, we have used `mvbind` notation to tell **brms** that both `tarsus` and `back` are separate response variables. The term `(1|p|fosternest)` indicates a varying intercept over `fosternest`. By writing `|p|` in between we indicate that all varying effects of `fosternest` should be modeled as correlated. This makes sense since we actually have two model parts, one for `tarsus` and one for `back`. The indicator `p` is arbitrary and can be replaced by other symbols that comes into your mind (for details about the multilevel syntax of **brms**, see `help("brmsformula")` and `vignette("brms_multilevel")`). Similarily, the term `(1|q|dam)` indicates correlated varying effects of the genetic mother of the chicks. Alternatively, we could have also modeled the genetic similarities through pedigrees and corresponding relatedness matrices, but this is not the focus of this vignette (please see `vignette("brms_phylogenetics")`). The model results are readily summarized via ```{r summary1, warning=FALSE} fit1 <- add_criterion(fit1, "loo") summary(fit1) ``` The summary output of multivariate models closely resembles those of univariate models, except that the parameters now have the corresponding response variable as prefix. Within dams, tarsus length and back color seem to be negatively correlated, while within fosternests the opposite is true. This indicates differential effects of genetic and environmental factors on these two characteristics. Further, the small residual correlation `rescor(tarsus, back)` on the bottom of the output indicates that there is little unmodeled dependency between tarsus length and back color. Although not necessary at this point, we have already computed and stored the LOO information criterion of `fit1`, which we will use for model comparions. Next, let's take a look at some posterior-predictive checks, which give us a first impression of the model fit. ```{r pp_check1, message=FALSE} pp_check(fit1, resp = "tarsus") pp_check(fit1, resp = "back") ``` This looks pretty solid, but we notice a slight unmodeled left skewness in the distribution of `tarsus`. We will come back to this later on. Next, we want to investigate how much variation in the response variables can be explained by our model and we use a Bayesian generalization of the $R^2$ coefficient. ```{r R2_1} bayes_R2(fit1) ``` Clearly, there is much variation in both animal characteristics that we can not explain, but apparently we can explain more of the variation in tarsus length than in back color. ## More Complex Multivariate Models Now, suppose we only want to control for `sex` in `tarsus` but not in `back` and vice versa for `hatchdate`. Not that this is particular reasonable for the present example, but it allows us to illustrate how to specify different formulas for different response variables. We can no longer use `mvbind` syntax and so we have to use a more verbose approach: ```{r fit2, message=FALSE, warning=FALSE, results='hide'} bf_tarsus <- bf(tarsus ~ sex + (1|p|fosternest) + (1|q|dam)) bf_back <- bf(back ~ hatchdate + (1|p|fosternest) + (1|q|dam)) fit2 <- brm(bf_tarsus + bf_back, data = BTdata, chains = 2, cores = 2) ``` Note that we have literally *added* the two model parts via the `+` operator, which is in this case equivalent to writing `mvbf(bf_tarsus, bf_back)`. See `help("brmsformula")` and `help("mvbrmsformula")` for more details about this syntax. Again, we summarize the model first. ```{r summary2, warning=FALSE} fit2 <- add_criterion(fit2, "loo") summary(fit2) ``` Let's find out, how model fit changed due to excluding certain effects from the initial model: ```{r loo12} loo(fit1, fit2) ``` Apparently, there is no noteworthy difference in the model fit. Accordingly, we do not really need to model `sex` and `hatchdate` for both response variables, but there is also no harm in including them (so I would probably just include them). To give you a glimpse of the capabilities of **brms**' multivariate syntax, we change our model in various directions at the same time. Remember the slight left skewness of `tarsus`, which we will now model by using the `skew_normal` family instead of the `gaussian` family. Since we do not have a multivariate normal (or student-t) model, anymore, estimating residual correlations is no longer possible. We make this explicit using the `set_rescor` function. Further, we investigate if the relationship of `back` and `hatchdate` is really linear as previously assumed by fitting a non-linear spline of `hatchdate`. On top of it, we model separate residual variances of `tarsus` for males and femals chicks. ```{r fit3, message=FALSE, warning=FALSE, results='hide'} bf_tarsus <- bf(tarsus ~ sex + (1|p|fosternest) + (1|q|dam)) + lf(sigma ~ 0 + sex) + skew_normal() bf_back <- bf(back ~ s(hatchdate) + (1|p|fosternest) + (1|q|dam)) + gaussian() fit3 <- brm( bf_tarsus + bf_back + set_rescor(FALSE), data = BTdata, chains = 2, cores = 2, control = list(adapt_delta = 0.95) ) ``` Again, we summarize the model and look at some posterior-predictive checks. ```{r summary3, warning=FALSE} fit3 <- add_criterion(fit3, "loo") summary(fit3) ``` We see that the (log) residual standard deviation of `tarsus` is somewhat larger for chicks whose sex could not be identified as compared to male or female chicks. Further, we see from the negative `alpha` (skewness) parameter of `tarsus` that the residuals are indeed slightly left-skewed. Lastly, running ```{r me3} conditional_effects(fit3, "hatchdate", resp = "back") ``` reveals a non-linear relationship of `hatchdate` on the `back` color, which seems to change in waves over the course of the hatch dates. There are many more modeling options for multivariate models, which are not discussed in this vignette. Examples include autocorrelation structures, Gaussian processes, or explicit non-linear predictors (e.g., see `help("brmsformula")` or `vignette("brms_multilevel")`). In fact, nearly all the flexibility of univariate models is retained in multivariate models. ## References Hadfield JD, Nutall A, Osorio D, Owens IPF (2007). Testing the phenotypic gambit: phenotypic, genetic and environmental correlations of colour. *Journal of Evolutionary Biology*, 20(2), 549-557. brms/vignettes/me_rent1.pdf0000644000176200001440000002006213252451326015435 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20170908164932) /ModDate (D:20170908164932) /Title (R Graphics Output) /Producer (R 3.4.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 4217 /Filter /FlateDecode >> stream xZOGO;ߝk"@B bp$b$ķfwMp:3S]]ˏ_<_~iKIq?y{Z}t{S}}Omi>J۬7OmlxovlcY:`Mt`fJٷ[o0tߎ 6;̑\`-ŧFZz1K3z~B plP?AKf{!M>]n' <פ(@0xDoa9>6\Mepܯ=qʼ_kVɰ|X`jJޯ"y)Cj $ysn2up5"0uK(8r~ޗIx BOhR {c\BzVUĂDp l<# T'27*B:dd`EdtQ.L'K$ɘDr8fTFCÜEӪa`[=_22Lלҙג{ɣW^LW^ 3ϕa~۩:O9*Y>ҹk'ڡ;nK|nݒuҌK3up,3dYP\"ZaC,!`>Y&bXE$82z^ P-T`*:-l@ β,hF%0uZp&NGh-A{k)_I hQB䫀KCnǗ_?O'T=OYEU ]4S儇\[avFE6"u6yjuC絪 yߌ :U]T.c*]\]QҪ.zh yua,VLZg`:lVvU]8Eq5l\EZՇYbe'BYgkœņrCydAɒ=ucQW':˞,ܼhfU]4ݳhޯU]\]ԕ0\]%guQUENRsgua|Vj~Uf~\]R ^]$Ī.`k=.`7AìW]]. ؒ_.V[EruUݭYxZEruȺT4ZxEa%7Mwsba6a[]"U&5i.C5M.qdJ0kAS&u|Cq4x(8.A J0I![eSnn/_ ;L&[#()[folxXW*޽g?W.)Xؾ)Wo??~駯8LJ E"ch(>~1vtcoC@ǁ(^v8 =Eɴi}mޞ\'Z@w(3O75]n9h=y=/!b|.|İ"0҇8Tz,|dpv yڻ{kilȵ1W߽ns6uiYwE}ۿߺJ)W x7CnIxLgtn*Ӳdr `|Qur)æIlww `0mq_'ZPR6B< t Q XJ?gp$J4JCnW~i\ͷ_ž#8RgD-F\iy%e]w't-LmBD"s!0 %J+KP[4O`F1 M©mYne.%Y[~s7{X~I)PIF6_[dOl$h?߮ n[YI{j}_eQӧ:fm`1cWSßEԤ[a_.E=r`v-7%KoE7zQ0]2pmM tw}@:^-uq;r;ίӠ rݿ)1 R] 7_&[ 9LΧ 0bݿmr9Ew8Ӂ}1bZ)E)X[gJU}~*(lz]`#]4dBn;~|Ҿ{:gp *]ĢA dܮwn~av+ȺPpCN( J~渂0|͕ȜV$QW{'hKH~ȊU?ĭɾ_z%;˵gC*URO=Xzc(Zz-.!R^?f}j=،>|z2MKog}joN]?Cz[z"ޓ68JzEl蟪^;^gL~r=pm÷ˎ[2?uGͼE3#8>yQ闗^Zxl@G/g<)|?J/08#'?X^}C*.7x{t }'/?JP$7yNX 2 |A?|o3+Xs [f{z6%71 s>^0'n}K.z^ÁUj fژOySSB8Oiendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 576 216] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << /GS1 11 0 R /GS257 12 0 R /GS258 13 0 R >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 9 0 R >> endobj 11 0 obj << /Type /ExtGState /CA 1.000 >> endobj 12 0 obj << /Type /ExtGState /ca 0.400 >> endobj 13 0 obj << /Type /ExtGState /ca 1.000 >> endobj xref 0 14 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000004581 00000 n 0000004664 00000 n 0000004816 00000 n 0000004849 00000 n 0000000212 00000 n 0000000292 00000 n 0000007544 00000 n 0000007638 00000 n 0000007737 00000 n 0000007786 00000 n 0000007835 00000 n trailer << /Size 14 /Info 1 0 R /Root 2 0 R >> startxref 7884 %%EOF brms/vignettes/brms_phylogenetics.Rmd0000644000176200001440000002751213606326627017613 0ustar liggesusers--- title: "Estimating Phylogenetic Multilevel Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Phylogenetic Multilevel Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction In the present vignette, we want to discuss how to specify phylogenetic multilevel models using **brms**. These models are relevant in evolutionary biology when data of many species are analyzed at the same time. The usual approach would be to model species as a grouping factor in a multilevel model and estimate varying intercepts (and possibly also varying slopes) over species. However, species are not independent as they come from the same phylogenetic tree and we thus have to adjust our model to incorporate this dependency. The examples discussed here are from chapter 11 of the book *Modern Phylogenetic Comparative Methods and the application in Evolutionary Biology* (de Villemeruil & Nakagawa, 2014). The necessary data can be downloaded from the corresponding website (http://www.mpcm-evolution.com/). Some of these models may take a few minutes to fit. ## A Simple Phylogenetic Model Assume we have measurements of a phenotype, `phen` (say the body size), and a `cofactor` variable (say the temperature of the environment). We prepare the data using the following code. ```{r} phylo <- ape::read.nexus("https://paul-buerkner.github.io/data/phylo.nex") data_simple <- read.table( "https://paul-buerkner.github.io/data/data_simple.txt", header = TRUE ) head(data_simple) ``` The `phylo` object contains information on the relationship between species. Using this information, we can construct a covariance matrix of species (Hadfield & Nakagawa, 2010). ```{r} A <- ape::vcv.phylo(phylo) ``` Now we are ready to fit our first phylogenetic multilevel model: ```{r, results='hide'} model_simple <- brm( phen ~ cofactor + (1|phylo), data = data_simple, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0, 10), "b"), prior(normal(0, 50), "Intercept"), prior(student_t(3, 0, 20), "sd"), prior(student_t(3, 0, 20), "sigma") ) ) ``` With the exception of `cov_ranef = list(phylo = A)` this is a basic multilevel model with a varying intercept over species (`phylo` is an indicator of species in this data set). However, by using the `cov_ranef` argument, we make sure that species are correlated as specified by the covariance matrix `A`. Setting priors is not required for achieving good convergence for this model, but it improves sampling speed a bit. After fitting, the results can be investigated in detail. ```{r} summary(model_simple) plot(model_simple, N = 2, ask = FALSE) plot(conditional_effects(model_simple), points = TRUE) ``` The so called phylogenetic signal (often symbolize by $\lambda$) can be computed with the `hypothesis` method and is roughly $\lambda = 0.7$ for this example. ```{r} hyp <- "sd_phylo__Intercept^2 / (sd_phylo__Intercept^2 + sigma^2) = 0" (hyp <- hypothesis(model_simple, hyp, class = NULL)) plot(hyp) ``` Note that the phylogenetic signal is just a synonym of the intra-class correlation (ICC) used in the context phylogenetic analysis. ## A Phylogenetic Model with Repeated Measurements Often, we have multiple observations per species and this allows to fit more complicated phylogenetic models. ```{r} data_repeat <- read.table( "https://paul-buerkner.github.io/data/data_repeat.txt", header = TRUE ) data_repeat$spec_mean_cf <- with(data_repeat, sapply(split(cofactor, phylo), mean)[phylo]) head(data_repeat) ``` The variable `spec_mean_cf` just contains the mean of the cofactor for each species. The code for the repeated measurement phylogenetic model looks as follows: ```{r, results='hide'} model_repeat1 <- brm( phen ~ spec_mean_cf + (1|phylo) + (1|species), data = data_repeat, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0,10), "b"), prior(normal(0,50), "Intercept"), prior(student_t(3,0,20), "sd"), prior(student_t(3,0,20), "sigma") ), sample_prior = TRUE, chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ``` The variables `phylo` and `species` are identical as they are both identifiers of the species. However, we model the phylogenetic covariance only for `phylo` and thus the `species` variable accounts for any specific effect that would be independent of the phylogenetic relationship between species (e.g., environmental or niche effects). Again we can obtain model summaries as well as estimates of the phylogenetic signal. ```{r} summary(model_repeat1) ``` ```{r} hyp <- paste( "sd_phylo__Intercept^2 /", "(sd_phylo__Intercept^2 + sd_species__Intercept^2 + sigma^2) = 0" ) (hyp <- hypothesis(model_repeat1, hyp, class = NULL)) plot(hyp) ``` So far, we have completely ignored the variability of the cofactor within species. To incorporate this into the model, we define ```{r} data_repeat$within_spec_cf <- data_repeat$cofactor - data_repeat$spec_mean_cf ``` and then fit it again using `within_spec_cf` as an additional predictor. ```{r, results='hide'} model_repeat2 <- update( model_repeat1, formula = ~ . + within_spec_cf, newdata = data_repeat, chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ``` The results are almost unchanged, with apparently no relationship between the phenotype and the within species variance of `cofactor`. ```{r} summary(model_repeat2) ``` Also, the phylogenetic signal remains more or less the same. ```{r} hyp <- paste( "sd_phylo__Intercept^2 /", "(sd_phylo__Intercept^2 + sd_species__Intercept^2 + sigma^2) = 0" ) (hyp <- hypothesis(model_repeat2, hyp, class = NULL)) ``` ## A Phylogenetic Meta-Analysis Let's say we have Fisher's z-transformated correlation coefficients $Zr$ per species along with corresponding sample sizes (e.g., correlations between male coloration and reproductive success): ```{r} data_fisher <- read.table( "https://paul-buerkner.github.io/data/data_effect.txt", header = TRUE ) data_fisher$obs <- 1:nrow(data_fisher) head(data_fisher) ``` We assume the sampling variance to be known and as $V(Zr) = \frac{1}{N - 3}$ for Fisher's values, where $N$ is the sample size per species. Incorporating the known sampling variance into the model is straight forward. One has to keep in mind though, that **brms** requires the sampling standard deviation (square root of the variance) as input instead of the variance itself. The group-level effect of `obs` represents the residual variance, which we have to model explicitly in a meta-analytic model. ```{r, results='hide'} model_fisher <- brm( Zr | se(sqrt(1 / (N - 3))) ~ 1 + (1|phylo) + (1|obs), data = data_fisher, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0, 10), "Intercept"), prior(student_t(3, 0, 10), "sd") ), control = list(adapt_delta = 0.95), chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ``` A summary of the fitted model is obtained via ```{r} summary(model_fisher) plot(model_fisher) ``` The meta-analytic mean (i.e., the model intercept) is $0.16$ with a credible interval of $[0.08, 0.25]$. Thus the mean correlation across species is positive according to the model. ## A phylogenetic count-data model Suppose that we analyze a phenotype that consists of counts instead of being a continuous variable. In such a case, the normality assumption will likely not be justified and it is recommended to use a distribution explicitely suited for count data, for instance the Poisson distribution. The following data set (again retrieved from mpcm-evolution.org) provides an example. ```{r} data_pois <- read.table( "https://paul-buerkner.github.io/data/data_pois.txt", header = TRUE ) data_pois$obs <- 1:nrow(data_pois) head(data_pois) ``` As the poisson distribution does not have a natural overdispersion parameter, we model the residual variance via the group-level effects of `obs` (e.g., see Lawless, 1987). ```{r, results='hide'} model_pois <- brm( phen_pois ~ cofactor + (1|phylo) + (1|obs), data = data_pois, family = poisson("log"), cov_ranef = list(phylo = A), chains = 2, cores = 2, iter = 4000, control = list(adapt_delta = 0.95) ) ``` Again, we obtain a summary of the fitted model via ```{r} summary(model_pois) plot(conditional_effects(model_pois), points = TRUE) ``` Now, assume we ignore the fact that the phenotype is count data and fit a linear normal model instead. ```{r, results='hide'} model_normal <- brm( phen_pois ~ cofactor + (1|phylo), data = data_pois, family = gaussian(), cov_ranef = list(phylo = A), chains = 2, cores = 2, iter = 4000, control = list(adapt_delta = 0.95) ) ``` ```{r} summary(model_normal) ``` We see that `cofactor` has a positive relationship with the phenotype in both models. One should keep in mind, though, that the estimates of the Poisson model are on the log-scale, as we applied the canonical log-link function in this example. Therefore, estimates are not comparable to a linear normal model even if applied to the same data. What we can compare, however, is the model fit, for instance graphically via posterior predictive checks. ```{r} pp_check(model_pois) pp_check(model_normal) ``` Apparently, the distribution of the phenotype predicted by the Poisson model resembles the original distribution of the phenotype pretty closely, while the normal models fails to do so. We can also apply leave-one-out cross-validation for direct numerical comparison of model fit. ```{r} loo(model_pois, model_normal) ``` Since smaller values of loo indicate better fit, it is again evident that the Poisson model fits the data better than the normal model. Of course, the Poisson model is not the only reasonable option here. For instance, you could use a negative binomial model (via family `negative_binomial`), which already contains an overdispersion parameter so that modeling a varying intercept of `obs` becomes obsolete. ## Phylogenetic models with multiple group-level effects In the above examples, we have only used a single group-level effect (i.e., a varying intercept) for the phylogenetic grouping factors. In **brms**, it is also possible to estimate multiple group-level effects (e.g., a varying intercept and a varying slope) for these grouping factors. However, it requires repeatedly computing Kronecker products of covariance matrices while fitting the model. This will be very slow especially when the grouping factors have many levels and matrices are thus large. ## References de Villemeruil P. & Nakagawa, S. (2014) General quantitative genetic methods for comparative biology. In: *Modern phylogenetic comparative methods and their application in evolutionary biology: concepts and practice* (ed. Garamszegi L.) Springer, New York. pp. 287-303. Hadfield, J. D. & Nakagawa, S. (2010) General quantitative genetic methods for comparative biology: phylogenies, taxonomies, and multi-trait models for continuous and categorical characters. *Journal of Evolutionary Biology*. 23. 494-508. Lawless, J. F. (1987). Negative binomial and mixed Poisson regression. *Canadian Journal of Statistics*, 15(3), 209-225. brms/vignettes/citations_overview.bib0000644000176200001440000005770113522262066017644 0ustar liggesusers% Encoding: UTF-8 @Article{brms1, author = {Paul-Christian B\"urkner}, title = {{brms}: An {R} Package for Bayesian Multilevel Models using Stan}, journal = {Journal of Statistical Software}, year = {2017}, volume = {80}, number = {1}, pages = {1--28}, encoding = {UTF-8}, doi = {10.18637/jss.v080.i01} } @BOOK{brown2015, title = {Applied Mixed Models in Medicine}, publisher = {John Wiley \& Sons}, year = {2015}, author = {Brown, Helen and Prescott, Robin}, owner = {Paul}, timestamp = {2015.06.19} } @ARTICLE{lunn2000, author = {Lunn, David J and Thomas, Andrew and Best, Nicky and Spiegelhalter, David}, title = {\pkg{WinBUGS} a Bayesian Modelling Framework: Concepts, Structure, and Extensibility}, journal = {Statistics and {C}omputing}, year = {2000}, volume = {10}, pages = {325--337}, number = {4}, owner = {Paul}, publisher = {Springer}, timestamp = {2015.06.18} } @MANUAL{spiegelhalter2003, title = {\pkg{WinBUGS} Version - 1.4 User Manual}, author = {Spiegelhalter, David and Thomas, Andrew and Best, Nicky and Lunn, Dave}, year = {2003}, journal = {MRC Biostatistics Unit, Cambridge}, owner = {Paul}, publisher = {version}, timestamp = {2015.06.18}, url = {http://www.mrc-bsu.cam.ac.uk/bugs} } @MANUAL{spiegelhalter2007, title = {\pkg{OpenBUGS} User Manual, Version 3.0.2}, author = {Spiegelhalter, D and Thomas, A and Best, N and Lunn, D}, year = {2007}, journal = {MRC Biostatistics Unit, Cambridge}, owner = {Paul}, timestamp = {2015.06.18} } @MANUAL{plummer2013, title = {\pkg{JAGS}: Just Another Gibs Sampler}, author = {Plummer, Martyn}, year = {2013}, owner = {Paul}, timestamp = {2015.01.20}, url = {http://mcmc-jags.sourceforge.net/} } @ARTICLE{hadfield2010, author = {Hadfield, Jarrod D}, title = {MCMC Methods for Multi-Response Generalized Linear Mixed Models: the \pkg{MCMCglmm} \proglang{R} Package}, journal = {Journal of Statistical Software}, year = {2010}, volume = {33}, pages = {1--22}, number = {2}, owner = {Paul}, timestamp = {2015.06.18} } @Manual{stan2017, title = {\proglang{Stan}: A \proglang{C++} Library for Probability and Sampling, Version 2.14.0}, author = {{Stan Development Team}}, year = {2017}, owner = {Paul}, timestamp = {2015.06.18}, url = {http://mc-stan.org/}, } @Article{carpenter2017, author = {Carpenter, B. and Gelman, A. and Hoffman, M. and Lee, D. and Goodrich, B. and Betancourt, M. and Brubaker, M. A. and Guo, J. and Li, P. and Ridell, A.}, title = {\proglang{Stan}: A Probabilistic Programming Language}, journal = {Journal of Statistical Software}, year = {2017}, owner = {Paul}, timestamp = {2015.06.19}, } @ARTICLE{metropolis1953, author = {Metropolis, Nicholas and Rosenbluth, Arianna W and Rosenbluth, Marshall N and Teller, Augusta H and Teller, Edward}, title = {Equation of State Calculations by Fast Computing Machines}, journal = {The Journal of Chemical Physics}, year = {1953}, volume = {21}, pages = {1087--1092}, number = {6}, owner = {Paul}, publisher = {AIP Publishing}, timestamp = {2015.06.19} } @ARTICLE{hastings1970, author = {Hastings, W Keith}, title = {Monte Carlo Sampling Methods Using Markov Chains and their Applications}, journal = {Biometrika}, year = {1970}, volume = {57}, pages = {97--109}, number = {1}, owner = {Paul}, publisher = {Biometrika Trust}, timestamp = {2015.06.19} } @ARTICLE{geman1984, author = {Geman, Stuart and Geman, Donald}, title = {Stochastic Relaxation, Gibbs Distributions, and the Bayesian Restoration of Images}, journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence}, year = {1984}, pages = {721--741}, number = {6}, owner = {Paul}, publisher = {IEEE}, timestamp = {2015.06.19} } @ARTICLE{gelfand1990, author = {Gelfand, Alan E and Smith, Adrian FM}, title = {Sampling-Based Approaches to Calculating Marginal Densities}, journal = {Journal of the American Statistical Association}, year = {1990}, volume = {85}, pages = {398--409}, number = {410}, owner = {Paul}, publisher = {Taylor \& Francis Group}, timestamp = {2015.06.19} } @ARTICLE{damien1999, author = {Damien, Paul and Wakefield, Jon and Walker, Stephen}, title = {Gibbs Sampling for Bayesian Non-Conjugate and Hierarchical Models by Using Auxiliary Variables}, journal = {Journal of the Royal Statistical Society B, Statistical Methodology}, year = {1999}, pages = {331--344}, owner = {Paul}, publisher = {JSTOR}, timestamp = {2015.06.19} } @ARTICLE{neal2003, author = {Neal, Radford M.}, title = {Slice Sampling}, journal = {The Annals of Statistics}, year = {2003}, pages = {705--741}, owner = {Paul}, publisher = {JSTOR}, timestamp = {2015.06.19} } @InBook{neal2011, chapter = {MCMC Using Hamiltonian Dynamics}, title = {Handbook of Markov Chain Monte Carlo}, publisher = {CRC Press}, year = {2011}, author = {Neal, Radford M}, volume = {2}, owner = {Paul}, timestamp = {2015.06.19}, } @ARTICLE{hoffman2014, author = {Hoffman, Matthew D and Gelman, Andrew}, title = {The No-U-Turn Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo}, journal = {The Journal of Machine Learning Research}, year = {2014}, volume = {15}, pages = {1593--1623}, number = {1}, owner = {Paul}, publisher = {JMLR. org}, timestamp = {2015.06.19} } @BOOK{gelman2014, title = {Bayesian Data Analysis}, publisher = {Taylor \& Francis}, year = {2014}, author = {Gelman, Andrew and Carlin, John B and Stern, Hal S and Rubin, Donald B}, volume = {2}, owner = {Paul}, timestamp = {2015.06.20} } @Manual{stanM2017, title = {\proglang{Stan} Modeling Language: User's Guide and Reference Manual}, author = {{Stan Development Team}}, year = {2017}, owner = {Paul}, timestamp = {2015.06.18}, url = {http://mc-stan.org/manual.html}, } @Article{rigby2005, author = {Rigby, Robert A and Stasinopoulos, D Mikis}, title = {Generalized Additive Models for Location, Scale and Shape}, journal = {Journal of the Royal Statistical Society C (Applied Statistics)}, year = {2005}, volume = {54}, number = {3}, pages = {507--554}, publisher = {Wiley Online Library}, } @Article{lindstrom1990, author = {Lindstrom, Mary J and Bates, Douglas M}, title = {Nonlinear Mixed Effects Models for Repeated Measures Data}, journal = {Biometrics}, year = {1990}, pages = {673--687}, publisher = {JSTOR}, } @Article{wood2004, author = {Wood, Simon N}, title = {Stable and Efficient Multiple Smoothing Parameter Estimation for Generalized Additive Models}, journal = {Journal of the American Statistical Association}, year = {2004}, volume = {99}, number = {467}, pages = {673--686}, publisher = {Taylor \& Francis}, } @Article{rasmussen2006, author = {Rasmussen, Carl Edward and Williams, C. K. I.}, title = {Gaussian processes for machine learning}, year = {2006}, publisher = {Massachusetts Institute of Technology}, } @Article{betancourt2014, author = {Betancourt, MJ and Byrne, Simon and Livingstone, Samuel and Girolami, Mark}, title = {The Geometric Foundations of Hamiltonian Monte Carlo}, journal = {arXiv preprint arXiv:1410.5110}, year = {2014}, } @Article{betancourt2017, author = {Michael Betancourt}, title = {A Conceptual Introduction to Hamiltonian Monte Carlo}, journal = {arXiv preprint}, year = {2017}, url = {https://arxiv.org/pdf/1701.02434.pdf}, } @Manual{rstanarm2017, title = {rstanarm: {Bayesian} applied regression modeling via {Stan}.}, author = {{Stan Development Team}}, year = {2017}, note = {R package version 2.17.2}, url = {http://mc-stan.org/}, } @InProceedings{williams1996, author = {Williams, Christopher KI and Rasmussen, Carl Edward}, title = {Gaussian processes for regression}, booktitle = {Advances in neural information processing systems}, year = {1996}, pages = {514--520}, } @Article{westfall2016, author = {Westfall, Jacob and Yarkoni, Tal}, title = {Statistically Controlling for Confounding Constructs is Harder than You Think}, journal = {PloS one}, year = {2016}, volume = {11}, number = {3}, pages = {e0152719}, publisher = {Public Library of Science}, } @BOOK{demidenko2013, title = {Mixed Models: Theory and Applications with \proglang{R}}, publisher = {John Wiley \& Sons}, year = {2013}, author = {Demidenko, Eugene}, owner = {Paul}, timestamp = {2015.06.19} } @Book{pinheiro2006, title = {Mixed-Effects Models in \proglang{S} and \proglang{S-PLUS}}, publisher = {Springer-Verlage Science \& Business Media}, year = {2006}, author = {Pinheiro, Jose and Bates, Douglas}, owner = {Paul}, timestamp = {2015.06.19}, } @MANUAL{Rcore2015, title = {\proglang{R}: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {\proglang{R} Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, owner = {Paul}, timestamp = {2015.01.20}, url = {http://www.R-project.org/} } @ARTICLE{bates2015, author = {Douglas Bates and Martin M{\"a}chler and Ben Bolker and Steve Walker}, title = {Fitting Linear Mixed-Effects Models Using \pkg{lme4}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {67}, pages = {1--48}, number = {1}, owner = {Paul}, timestamp = {2015.11.13} } @ARTICLE{mcgilchrist1991, author = {McGilchrist, CA and Aisbett, CW}, title = {Regression with Frailty in Survival Analysis}, journal = {Biometrics}, year = {1991}, pages = {461--466}, owner = {Paul}, publisher = {JSTOR}, timestamp = {2015.08.15} } @ARTICLE{ezzet1991, author = {Ezzet, Farkad and Whitehead, John}, title = {A Random Effects Model for Ordinal Responses from a Crossover Trial}, journal = {Statistics in Medicine}, year = {1991}, volume = {10}, pages = {901--907}, number = {6}, owner = {Paul}, publisher = {Wiley Online Library}, timestamp = {2015.09.03} } @Book{gelmanMLM2006, title = {Data Analysis Using Regression and Multilevel/Hierarchical Models}, publisher = {Cambridge University Press}, year = {2006}, author = {Gelman, Andrew and Hill, Jennifer}, owner = {Paul}, timestamp = {2016.02.21}, } @Book{fox2011, title = {An R companion to Applied Regression, Second Edition}, publisher = {Sage}, year = {2011}, author = {Fox, John and Weisberg, Sanford}, } @ARTICLE{lewandowski2009, author = {Lewandowski, Daniel and Kurowicka, Dorota and Joe, Harry}, title = {Generating Random Correlation Matrices Based on Vines and Extended Onion Method}, journal = {Journal of Multivariate Analysis}, year = {2009}, volume = {100}, pages = {1989--2001}, number = {9}, owner = {Paul}, publisher = {Elsevier}, timestamp = {2015.07.23} } @ARTICLE{juarez2010, author = {Ju{\'a}rez, Miguel A and Steel, Mark FJ}, title = {Model-Based Clustering of Non-Gaussian Panel Data Based on Skew-t Distributions}, journal = {Journal of Business \& Economic Statistics}, year = {2010}, volume = {28}, pages = {52--66}, number = {1}, owner = {Paul}, publisher = {Taylor \& Francis}, timestamp = {2015.11.06} } @ARTICLE{creutz1988, author = {Creutz, Michael}, title = {Global Monte Carlo Algorithms for Many-Fermion Systems}, journal = {Physical Review D}, year = {1988}, volume = {38}, pages = {1228}, number = {4}, owner = {Paul}, publisher = {APS}, timestamp = {2015.08.10} } @BOOK{griewank2008, title = {Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation}, publisher = {Siam}, year = {2008}, author = {Griewank, Andreas and Walther, Andrea}, owner = {Paul}, timestamp = {2015.08.10} } @ARTICLE{watanabe2010, author = {Watanabe, Sumio}, title = {Asymptotic Equivalence of Bayes Cross Validation and Widely Applicable Information Criterion in Singular Learning Theory}, journal = {The Journal of Machine Learning Research}, year = {2010}, volume = {11}, pages = {3571--3594}, owner = {Paul}, publisher = {JMLR. org}, timestamp = {2015.08.10} } @TECHREPORT{gelfand1992, author = {Gelfand, Alan E and Dey, Dipak K and Chang, Hong}, title = {Model Determination Using Predictive Distributions with Implementation via Sampling-Based Methods}, institution = {DTIC Document}, year = {1992}, owner = {Paul}, timestamp = {2015.08.17} } @ARTICLE{ionides2008, author = {Ionides, Edward L}, title = {Truncated Importance Sampling}, journal = {Journal of Computational and Graphical Statistics}, year = {2008}, volume = {17}, pages = {295--311}, number = {2}, owner = {Paul}, publisher = {Taylor \& Francis}, timestamp = {2015.08.17} } @ARTICLE{vehtari2015, author = {Aki Vehtari and Andrew Gelman and Jonah Gabry}, title = {Efficient Implementation of Leave-One-Out Cross-Validation and WAIC for Evaluating Fitted Bayesian Models}, journal = {Unpublished manuscript}, year = {2015}, pages = {1--22}, owner = {Paul}, timestamp = {2015.08.26}, url = {http://www.stat.columbia.edu/~gelman/research/unpublished/loo_stan.pdf} } @ARTICLE{vanderlinde2005, author = {van der Linde, Angelika}, title = {DIC in Variable Selection}, journal = {Statistica Neerlandica}, year = {2005}, volume = {59}, pages = {45--56}, number = {1}, owner = {Paul}, publisher = {Wiley Online Library}, timestamp = {2015.08.10} } @Manual{loo2016, title = {\pkg{loo}: {E}fficient Leave-One-Out Cross-Validation and {WAIC} for {B}ayesian Models.}, author = {Aki Vehtari and Andrew Gelman and Jonah Gabry}, year = {2016}, note = {R package version 1.0.0}, url = {https://github.com/stan-dev/loo}, } @MANUAL{Xcode2015, title = {\pkg{Xcode} Software, Version~7}, author = {{Apple Inc.}}, address = {Cupertino, USA}, year = {2015}, owner = {Paul}, timestamp = {2015.01.20}, url = {https://developer.apple.com/xcode/} } @Article{masters1982, author = {Masters, Geoff N}, title = {A {R}asch Model for Partial Credit Scoring}, journal = {Psychometrika}, year = {1982}, volume = {47}, number = {2}, pages = {149--174}, owner = {Paul}, publisher = {Springer}, timestamp = {2015.02.08}, } @ARTICLE{tutz1990, author = {Tutz, Gerhard}, title = {Sequential Item Response Models with an Ordered Response}, journal = {British Journal of Mathematical and Statistical Psychology}, year = {1990}, volume = {43}, pages = {39--55}, number = {1}, owner = {Paul}, publisher = {Wiley Online Library}, timestamp = {2015.02.01} } @ARTICLE{yee2010, author = {Yee, Thomas W}, title = {The \pkg{VGAM} Package for Categorical Data Analysis}, journal = {Journal of Statistical Software}, year = {2010}, volume = {32}, pages = {1--34}, number = {10}, owner = {Paul}, timestamp = {2015.09.04} } @ARTICLE{andrich1978b, author = {Andrich, David}, title = {Application of a Psychometric Rating Model to Ordered Categories which are Scored with Successive Integers}, journal = {Applied Psychological Measurement}, year = {1978}, volume = {2}, pages = {581--594}, number = {4}, owner = {Paul}, publisher = {Sage Publications}, timestamp = {2015.01.27} } @ARTICLE{andersen1977, author = {Andersen, Erling B}, title = {Sufficient Statistics and Latent Trait Models}, journal = {Psychometrika}, year = {1977}, volume = {42}, pages = {69--81}, number = {1}, owner = {Paul}, publisher = {Springer}, timestamp = {2015.01.27} } @ARTICLE{vanderark2001, author = {Van Der Ark, L Andries}, title = {Relationships and Properties of Polytomous Item Response Theory Models}, journal = {Applied Psychological Measurement}, year = {2001}, volume = {25}, pages = {273--282}, number = {3}, owner = {Paul}, publisher = {Sage Publications}, timestamp = {2015.01.26} } @Book{tutz2000, title = {Die {A}nalyse {K}ategorialer {D}aten: {A}nwendungsorientierte {E}inf{\"u}hrung in {L}ogit-{M}odellierung und {K}ategoriale {R}egression}, publisher = {Oldenbourg Verlag}, year = {2000}, author = {Tutz, Gerhard}, owner = {Paul}, timestamp = {2015.01.23}, } @MANUAL{rstanarm2016, title = {rstanarm: Bayesian Applied Regression Modeling via \pkg{Stan}}, author = {Jonah Gabry and Ben Goodrich}, year = {2016}, note = {R package version 2.9.0-3}, owner = {Paul}, timestamp = {2016.03.04}, url = {https://CRAN.R-project.org/package=rstanarm} } @MANUAL{mcelreath2016, title = {rethinking: Statistical Rethinking Course and Book Package}, author = {Richard McElreath}, year = {2016}, note = {R package version 1.58}, owner = {Paul}, timestamp = {2016.03.04}, url = {https://github.com/rmcelreath/rethinking} } @MANUAL{nlme2016, title = {\pkg{nlme}: Linear and Nonlinear Mixed Effects Models}, author = {Jose Pinheiro and Douglas Bates and Saikat DebRoy and Deepayan Sarkar and {R Core Team}}, year = {2016}, note = {R package version 3.1-124}, owner = {Paul}, timestamp = {2016.03.06}, url = {http://CRAN.R-project.org/package=nlme} } @BOOK{hastie1990, title = {Generalized Additive Models}, publisher = {CRC Press}, year = {1990}, author = {Hastie, Trevor J and Tibshirani, Robert J}, volume = {43}, owner = {Paul}, timestamp = {2015.09.07} } @Article{wood2011, author = {Wood, Simon N}, title = {Fast Stable Restricted Maximum Likelihood and Marginal Likelihood Estimation of Semiparametric Generalized Linear Models}, journal = {Journal of the Royal Statistical Society: Series B (Statistical Methodology)}, year = {2011}, volume = {73}, number = {1}, pages = {3--36}, publisher = {Wiley Online Library}, } @BOOK{zuur2014, title = {A beginner's Guide to Generalized Additive Models with \proglang{R}}, publisher = {Highland Statistics Limited}, year = {2014}, author = {Zuur, Alain F}, owner = {Paul}, timestamp = {2016.03.04} } @ARTICLE{chung2013, author = {Yeojin Chung and Sophia Rabe-Hesketh and Vincent Dorie and Andrew Gelman and Jingchen Liu}, title = {A nondegenerate penalized likelihood estimator for variance parameters in multilevel models}, journal = {Psychometrika}, year = {2013}, volume = {78}, pages = {685--709}, number = {4}, owner = {Paul}, publisher = {Springer}, timestamp = {2016.02.22}, url = {http://gllamm.org/} } @ARTICLE{duane1987, author = {Duane, Simon and Kennedy, Anthony D and Pendleton, Brian J and Roweth, Duncan}, title = {Hybrid Monte Carlo}, journal = {Physics Letters B}, year = {1987}, volume = {195}, pages = {216--222}, number = {2}, owner = {Paul}, publisher = {Elsevier}, timestamp = {2015.06.19} } @ARTICLE{natarajan2000, author = {Natarajan, Ranjini and Kass, Robert E}, title = {Reference Bayesian Methods for Generalized Linear Mixed Models}, journal = {Journal of the American Statistical Association}, year = {2000}, volume = {95}, pages = {227--237}, number = {449}, owner = {Paul}, publisher = {Taylor \& Francis}, timestamp = {2015.07.23} } @ARTICLE{kass2006, author = {Kass, Robert E and Natarajan, Ranjini}, title = {A Default Conjugate Prior for Variance Components in Generalized Linear Mixed Models (Comment on Article by Browne and Draper)}, journal = {Bayesian Analysis}, year = {2006}, volume = {1}, pages = {535--542}, number = {3}, owner = {Paul}, publisher = {International Society for Bayesian Analysis}, timestamp = {2015.07.23} } @ARTICLE{plummer2008, author = {Plummer, Martyn}, title = {Penalized Loss Functions for Bayesian Model Comparison}, journal = {Biostatistics}, year = {2008}, owner = {Paul}, publisher = {Biometrika Trust}, timestamp = {2015.08.10} } @ARTICLE{spiegelhalter2002, author = {Spiegelhalter, David J and Best, Nicola G and Carlin, Bradley P and Van Der Linde, Angelika}, title = {Bayesian Measures of Model Complexity and Fit}, journal = {Journal of the Royal Statistical Society B, Statistical Methodology}, year = {2002}, volume = {64}, pages = {583--639}, number = {4}, owner = {Paul}, publisher = {Wiley Online Library}, timestamp = {2015.09.02} } @MANUAL{Rtools2015, title = {\pkg{Rtools} Software, Version~3.3}, author = {{R Core Team}}, organization = {\proglang{R} Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, owner = {Paul}, timestamp = {2015.01.20}, url = {https://cran.r-project.org/bin/windows/Rtools/} } @Manual{afex2015, title = {\pkg{afex}: Analysis of Factorial Experiments}, author = {Henrik Singmann and Ben Bolker and Jake Westfall}, year = {2015}, note = {R package version 0.15-2}, owner = {Paul}, timestamp = {2016.02.13}, url = {https://CRAN.R-project.org/package=afex}, } @INPROCEEDINGS{carvalho2009, author = {Carvalho, Carlos M and Polson, Nicholas G and Scott, James G}, title = {Handling Sparsity via the Horseshoe}, booktitle = {International Conference on Artificial Intelligence and Statistics}, year = {2009}, pages = {73--80}, owner = {Paul}, timestamp = {2015.11.09} } @ARTICLE{carvalho2010, author = {Carvalho, Carlos M and Polson, Nicholas G and Scott, James G}, title = {The Horseshoe Estimator for Sparse Signals}, journal = {Biometrika}, year = {2010}, pages = {1--16}, owner = {Paul}, publisher = {Biometrika Trust}, timestamp = {2015.11.09} } @ARTICLE{gelman2006, author = {Gelman, Andrew}, title = {Prior Distributions for Variance Parameters in Hierarchical Models}, journal = {Bayesian Analysis}, year = {2006}, volume = {1}, pages = {515--534}, number = {3}, owner = {Paul}, publisher = {International Society for Bayesian Analysis}, timestamp = {2015.07.15} } @Article{gelman1992, author = {Gelman, Andrew and Rubin, Donald B}, title = {Inference from Iterative Simulation Using Multiple Sequences}, journal = {Statistical Science}, year = {1992}, pages = {457--472}, publisher = {JSTOR}, } @MANUAL{gabry2015, title = {\pkg{shinystan}: Interactive Visual and Numerical Diagnostics and Posterior Analysis for Bayesian Models}, author = {Jonah Gabry}, year = {2015}, note = {\proglang{R}~Package Version~2.0.0}, owner = {Paul}, timestamp = {2015.08.26}, url = {http://CRAN.R-project.org/package=shinystan} } @ARTICLE{samejima1969, author = {Samejima, Fumiko}, title = {Estimation of Latent Ability Using a Response Pattern of Graded Scores}, journal = {Psychometrika Monograph Supplement}, year = {1969}, owner = {Paul}, timestamp = {2015.01.27} } @MISC{christensen2015, author = {R. H. B. Christensen}, title = {\pkg{ordinal} -- Regression Models for Ordinal Data}, year = {2015}, note = {\proglang{R} package version 2015.6-28. http://www.cran.r-project.org/package=ordinal/}, owner = {Paul}, timestamp = {2015.09.04} } @ARTICLE{andrich1978a, author = {Andrich, David}, title = {A Rating Formulation for Ordered Response Categories}, journal = {Psychometrika}, year = {1978}, volume = {43}, pages = {561--573}, number = {4}, owner = {Paul}, publisher = {Springer}, timestamp = {2015.01.27} } @Comment{jabref-meta: databaseType:bibtex;} brms/vignettes/brms_overview.ltx0000644000176200001440000017606513606326627016701 0ustar liggesusers\documentclass[article, nojss]{jss} %\VignetteIndexEntry{Overview of the brms Package} %\VignetteEngine{R.rsp::tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Paul-Christian B\"urkner} \title{\pkg{brms}: An \proglang{R} Package for Bayesian Multilevel Models using \pkg{Stan}} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Paul-Christian B\"urkner} %% comma-separated \Plaintitle{brms: An R Package for Bayesian Multilevel Models using Stan} %% without formatting \Shorttitle{\pkg{brms}: Bayesian Multilevel Models using Stan} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The \pkg{brms} package implements Bayesian multilevel models in \proglang{R} using the probabilistic programming language \pkg{Stan}. A wide range of distributions and link functions are supported, allowing users to fit -- among others -- linear, robust linear, binomial, Poisson, survival, response times, ordinal, quantile, zero-inflated, hurdle, and even non-linear models all in a multilevel context. Further modeling options include autocorrelation of the response variable, user defined covariance structures, censored data, as well as meta-analytic standard errors. Prior specifications are flexible and explicitly encourage users to apply prior distributions that actually reflect their beliefs. In addition, model fit can easily be assessed and compared using posterior-predictive checks and leave-one-out cross-validation. If you use \pkg{brms}, please cite this article as published in the Journal of Statistical Software \citep{brms1}. } \Keywords{Bayesian inference, multilevel model, ordinal data, MCMC, \proglang{Stan}, \proglang{R}} \Plainkeywords{Bayesian inference, multilevel model, ordinal data, MCMC, Stan, R} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{50} %% \Issue{9} %% \Month{June} %% \Year{2012} %% \Submitdate{2012-06-04} %% \Acceptdate{2012-06-04} %% The address of (at least) one author should be given %% in the following format: \Address{ Paul-Christian B\"urkner\\ E-mail: \email{paul.buerkner@gmail.com}\\ URL: \url{https://paul-buerkner.github.io} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/512/507-7103 %% Fax: +43/512/507-2851 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. \section{Introduction} Multilevel models (MLMs) offer a great flexibility for researchers across sciences \citep{brown2015, demidenko2013, gelmanMLM2006, pinheiro2006}. They allow the modeling of data measured on different levels at the same time -- for instance data of students nested within classes and schools -- thus taking complex dependency structures into account. It is not surprising that many packages for \proglang{R} \citep{Rcore2015} have been developed to fit MLMs. Possibly the most widely known package in this area is \pkg{lme4} \citep{bates2015}, which uses maximum likelihood or restricted maximum likelihood methods for model fitting. Although alternative Bayesian methods have several advantages over frequentist approaches (e.g., the possibility of explicitly incorporating prior knowledge about parameters into the model), their practical use was limited for a long time because the posterior distributions of more complex models (such as MLMs) could not be found analytically. Markov chain Monte Carlo (MCMC) algorithms allowing to draw random samples from the posterior were not available or too time-consuming. In the last few decades, however, this has changed with the development of new algorithms and the rapid increase of general computing power. Today, several software packages implement these techniques, for instance \pkg{WinBugs} \citep{lunn2000, spiegelhalter2003}, \pkg{OpenBugs} \citep{spiegelhalter2007}, \pkg{JAGS} \citep{plummer2013}, \pkg{MCMCglmm} \citep{hadfield2010} and \pkg{Stan} \citep{stan2017, carpenter2017} to mention only a few. With the exception of the latter, all of these programs are primarily using combinations of Metropolis-Hastings updates \citep{metropolis1953,hastings1970} and Gibbs-sampling \citep{geman1984,gelfand1990}, sometimes also coupled with slice-sampling \citep{damien1999,neal2003}. One of the main problems of these algorithms is their rather slow convergence for high-dimensional models with correlated parameters \citep{neal2011,hoffman2014,gelman2014}. Furthermore, Gibbs-sampling requires priors to be conjugate to the likelihood of parameters in order to work efficiently \citep{gelman2014}, thus reducing the freedom of the researcher in choosing a prior that reflects his or her beliefs. In contrast, \pkg{Stan} implements Hamiltonian Monte Carlo \citep{duane1987, neal2011} and its extension, the No-U-Turn Sampler (NUTS) \citep{hoffman2014}. These algorithms converge much more quickly especially for high-dimensional models regardless of whether the priors are conjugate or not \citep{hoffman2014}. Similar to software packages like \pkg{WinBugs}, \pkg{Stan} comes with its own programming language, allowing for great modeling flexibility (cf., \citeauthor{stanM2017} \citeyear{stanM2017}; \citeauthor{carpenter2017} \citeyear{carpenter2017}). Many researchers may still hesitate to use \pkg{Stan} directly, as every model has to be written, debugged and possibly also optimized. This may be a time-consuming and error prone process even for researchers familiar with Bayesian inference. The package \pkg{brms}, presented in this paper, aims at closing this gap (at least for MLMs) allowing the user to benefit from the merits of \pkg{Stan} only by using simple, \pkg{lme4}-like formula syntax. \pkg{brms} supports a wide range of distributions and link functions, allows for multiple grouping factors each with multiple group-level effects, autocorrelation of the response variable, user defined covariance structures, as well as flexible and explicit prior specifications. The purpose of the present article is to provide a general overview of the \pkg{brms} package (version 0.10.0). We begin by explaining the underlying structure of MLMs. Next, the software is introduced in detail using recurrence times of infection in kidney patients \citep{mcgilchrist1991} and ratings of inhaler instructions \citep{ezzet1991} as examples. We end by comparing \pkg{brms} to other \proglang{R} packages implementing MLMs and describe future plans for extending the package. \section{Model description} \label{model} The core of every MLM is the prediction of the response $y$ through the linear combination $\eta$ of predictors transformed by the inverse link function $f$ assuming a certain distribution $D$ for $y$. We write $$y_i \sim D(f(\eta_i), \theta)$$ to stress the dependency on the $i\textsuperscript{th}$ data point. In many \proglang{R} packages, $D$ is also called the `family' and we will use this term in the following. The parameter $\theta$ describes additional family specific parameters that typically do not vary across data points, such as the standard deviation $\sigma$ in normal models or the shape $\alpha$ in Gamma or negative binomial models. The linear predictor can generally be written as $$\eta = \mathbf{X} \beta + \mathbf{Z} u$$ In this equation, $\beta$ and $u$ are the coefficients at population-level and group-level respectively and $\mathbf{X}, \mathbf{Z}$ are the corresponding design matrices. The response $y$ as well as $\mathbf{X}$ and $\mathbf{Z}$ make up the data, whereas $\beta$, $u$, and $\theta$ are the model parameters being estimated. The coefficients $\beta$ and $u$ may be more commonly known as fixed and random effects. However, we avoid these terms in the present paper following the recommendations of \cite{gelmanMLM2006}, as they are not used unambiguously in the literature. Also, we want to make explicit that $u$ is a model parameter in the same manner as $\beta$ so that uncertainty in its estimates can be naturally evaluated. In fact, this is an important advantage of Bayesian MCMC methods as compared to maximum likelihood approaches, which do not treat $u$ as a parameter, but assume that it is part of the error term instead (cf., \citeauthor{fox2011}, \citeyear{fox2011}). Except for linear models, we do not incorporate an additional error term for every observation by default. If desired, such an error term can always be modeled using a grouping factor with as many levels as observations in the data. \subsection{Prior distributions} \subsubsection{Regression parameters at population-level} In \pkg{brms}, population-level parameters are not restricted to have normal priors. Instead, every parameter can have every one-dimensional prior implemented in \pkg{Stan}, for instance uniform, Cauchy or even Gamma priors. As a negative side effect of this flexibility, correlations between them cannot be modeled as parameters. If desired, point estimates of the correlations can be obtained after sampling has been done. By default, population level parameters have an improper flat prior over the reals. \subsubsection{Regression parameters at group-level} The group-level parameters $u$ are assumed to come from a multivariate normal distribution with mean zero and unknown covariance matrix $\mathbf{\Sigma}$: $$u \sim N(0, \mathbf{\Sigma})$$ As is generally the case, covariances between group-level parameters of different grouping factors are assumed to be zero. This implies that $\mathbf{Z}$ and $u$ can be split up into several matrices $\mathbf{Z_k}$ and parameter vectors $u_k$, where $k$ indexes grouping factors, so that the model can be simplified to $$u_k \sim N(0, \mathbf{\Sigma_k})$$ Usually, but not always, we can also assume group-level parameters associated with different levels (indexed by $j$) of the same grouping factor to be independent leading to $$u_{kj} \sim N(0, \mathbf{V_k})$$ The covariance matrices $\mathbf{V_k}$ are modeled as parameters. In most packages, an Inverse-Wishart distribution is used as a prior for $\mathbf{V_k}$. This is mostly because its conjugacy leads to good properties of Gibbs-Samplers \citep{gelman2014}. However, there are good arguments against the Inverse-Wishart prior \citep{natarajan2000, kass2006}. The NUTS-Sampler implemented in \pkg{Stan} does not require priors to be conjugate. This advantage is utilized in \pkg{brms}: $\mathbf{V_k}$ is parameterized in terms of a correlation matrix $\mathbf{\Omega_k}$ and a vector of standard deviations $\sigma_k$ through $$\mathbf{V_k} = \mathbf{D}(\sigma_k) \mathbf{\Omega_k} \mathbf{D}(\sigma_k)$$ where $\mathbf{D}(\sigma_k)$ denotes the diagonal matrix with diagonal elements $\sigma_k$. Priors are then specified for the parameters on the right hand side of the equation. For $\mathbf{\Omega_k}$, we use the LKJ-Correlation prior with parameter $\zeta > 0$ by \cite{lewandowski2009}\footnote{Internally, the Cholesky factor of the correlation matrix is used, as it is more efficient and numerically stable.}: $$\mathbf{\Omega_k} \sim \mathrm{LKJ}(\zeta)$$ The expected value of the LKJ-prior is the identity matrix (implying correlations of zero) for any positive value of $\zeta$, which can be interpreted like the shape parameter of a symmetric beta distribution \citep{stanM2017}. If $\zeta = 1$ (the default in \pkg{brms}) the density is uniform over correlation matrices of the respective dimension. If $\zeta > 1$, the identity matrix is the mode of the prior, with a sharper peak in the density for larger values of $\zeta$. If $0 < \zeta < 1$ the prior is U-shaped having a trough at the identity matrix, which leads to higher probabilities for non-zero correlations. For every element of $\sigma_k$, any prior can be applied that is defined on the non-negative reals only. As default in \pkg{brms}, we use a half Student-t prior with 3 degrees of freedom. This prior often leads to better convergence of the models than a half Cauchy prior, while still being relatively weakly informative. Sometimes -- for instance when modeling pedigrees -- different levels of the same grouping factor cannot be assumed to be independent. In this case, the covariance matrix of $u_k$ becomes $$\mathbf{\Sigma_k} = \mathbf{V_k} \otimes \mathbf{A_k}$$ where $\mathbf{A_k}$ is the known covariance matrix between levels and $\otimes$ is the Kronecker product. \subsubsection{Family specific parameters} For some families, additional parameters need to be estimated. In the current section, we only name the most important ones. Normal and Student's distributions need the parameter $\sigma$ to account for residual error variance. By default, $\sigma$ has a half Cauchy prior with a scale parameter that depends on the standard deviation of the response variable to remain only weakly informative regardless of response variable's scaling. Furthermore, Student's distributions needs the parameter $\nu$ representing the degrees of freedom. By default, $\nu$ has a wide gamma prior as proposed by \cite{juarez2010}. Gamma, Weibull, and negative binomial distributions need the shape parameter $\alpha$ that also has a wide gamma prior by default. \section{Parameter estimation} The \pkg{brms} package does not fit models itself but uses \pkg{Stan} on the back-end. Accordingly, all samplers implemented in \pkg{Stan} can be used to fit \pkg{brms} models. Currently, these are the static Hamiltonian Monte-Carlo (HMC) Sampler sometimes also referred to as Hybrid Monte-Carlo \citep{neal2011, neal2003, duane1987} and its extension the No-U-Turn Sampler (NUTS) by \cite{hoffman2014}. HMC-like algorithms produce samples that are much less autocorrelated than those of other samplers such as the random-walk Metropolis algorithm \citep{hoffman2014, Creutz1988}. The main drawback of this increased efficiency is the need to calculate the gradient of the log-posterior, which can be automated using algorithmic differentiation \citep{griewank2008} but is still a time-consuming process for more complex models. Thus, using HMC leads to higher quality samples but takes more time per sample than other algorithms typically applied. Another drawback of HMC is the need to pre-specify at least two parameters, which are both critical for the performance of HMC. The NUTS Sampler allows setting these parameters automatically thus eliminating the need for any hand-tuning, while still being at least as efficient as a well tuned HMC \citep{hoffman2014}. For more details on the sampling algorithms applied in \pkg{Stan}, see the \pkg{Stan} user's manual \citep{stanM2017} as well as \cite{hoffman2014}. In addition to the estimation of model parameters, \pkg{brms} allows drawing samples from the posterior predictive distribution as well as from the pointwise log-likelihood. Both can be used to assess model fit. The former allows a comparison between the actual response $y$ and the response $\hat{y}$ predicted by the model. The pointwise log-likelihood can be used, among others, to calculate the widely applicable information criterion (WAIC) proposed by \cite{watanabe2010} and leave-one-out cross-validation (LOO; \citealp{gelfand1992}; \citealp{vehtari2015}; see also \citealp{ionides2008}) both allowing to compare different models applied to the same data (lower WAICs and LOOs indicate better model fit). The WAIC can be viewed as an improvement of the popular deviance information criterion (DIC), which has been criticized by several authors (\citealp{vehtari2015}; \citealp{plummer2008}; \citealp{vanderlinde2005}; see also the discussion at the end of the original DIC paper by \citealp{spiegelhalter2002}) in part because of problems arising from fact that the DIC is only a point estimate. In \pkg{brms}, WAIC and LOO are implemented using the \pkg{loo} package \citep{loo2016} also following the recommendations of \cite{vehtari2015}. \section{Software} \label{software} The \pkg{brms} package provides functions for fitting MLMs using \pkg{Stan} for full Bayesian inference. To install the latest release version of \pkg{brms} from CRAN, type \code{install.packages("brms")} within \proglang{R}. The current developmental version can be downloaded from GitHub via \begin{Sinput} devtools::install_github("paul-buerkner/brms") \end{Sinput} Additionally, a \proglang{C++} compiler is required. This is because \pkg{brms} internally creates \pkg{Stan} code, which is translated to \proglang{C++} and compiled afterwards. The program \pkg{Rtools} \citep{Rtools2015} comes with a \proglang{C++} compiler for Windows\footnote{During the installation process, there is an option to change the system \code{PATH}. Please make sure to check this options, because otherwise \pkg{Rtools} will not be available within \proglang{R}.}. On OS X, one should use \pkg{Xcode} \citep{Xcode2015} from the App Store. To check whether the compiler can be called within \proglang{R}, run \code{system("g++ -v")} when using \pkg{Rtools} or \code{system("clang++ -v")} when using \pkg{Xcode}. If no warning occurs and a few lines of difficult to read system code are printed out, the compiler should work correctly. For more detailed instructions on how to get the compilers running, see the prerequisites section on \url{https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started}. Models are fitted in \pkg{brms} using the following procedure, which is also summarized in Figure~\ref{flowchart}. First, the user specifies the model using the \code{brm} function in a way typical for most model fitting \proglang{R} functions, that is by defining \code{formula}, \code{data}, and \code{family}, as well as some other optional arguments. Second, this information is processed and the \code{make_stancode} and \code{make_standata} functions are called. The former generates the model code in \pkg{Stan} language and the latter prepares the data for use in \pkg{Stan}. These two are the mandatory parts of every \pkg{Stan} model and without \pkg{brms}, users would have to specify them themselves. Third, \pkg{Stan} code and data as well as additional arguments (such as the number of iterations and chains) are passed to functions of the \pkg{rstan} package (the \proglang{R} interface of \pkg{Stan}; \citeauthor{stan2017}, \citeyear{stan2017}). Fourth, the model is fitted by \pkg{Stan} after translating and compiling it in \proglang{C++}. Fifth, after the model has been fitted and returned by \pkg{rstan}, the fitted model object is post-processed in \pkg{brms} among others by renaming the model parameters to be understood by the user. Sixth, the results can be investigated in \proglang{R} using various methods such as \code{summary}, \code{plot}, or \code{predict} (for a complete list of methods type \code{methods(class = "brmsfit")}). \begin{figure}[ht] \centering \includegraphics[height = 0.4\textheight, keepaspectratio]{flowchart.pdf} \caption{High level description of the model fitting procedure used in \pkg{brms}.} \label{flowchart} \end{figure} \subsection{A worked example} In the following, we use an example about the recurrence time of an infection in kidney patients initially published by \cite{mcgilchrist1991}. The data set consists of 76 entries of 7 variables: \begin{Sinput} R> library("brms") R> data("kidney") R> head(kidney, n = 3) \end{Sinput} \begin{Soutput} time censored patient recur age sex disease 1 8 0 1 1 28 male other 2 23 0 2 1 48 female GN 3 22 0 3 1 32 male other \end{Soutput} Variable \code{time} represents the recurrence time of the infection, \code{censored} indicates if \code{time} is right censored (\code{1}) or not censored (\code{0}), variable \code{patient} is the patient id, and \code{recur} indicates if it is the first or second recurrence in that patient. Finally, variables \code{age}, \code{sex}, and \code{disease} make up the predictors. \subsection[Fitting models with brms]{Fitting models with \pkg{brms}} The core of the \pkg{brms} package is the \code{brm} function and we will explain its argument structure using the example above. Suppose we want to predict the (possibly censored) recurrence time using a log-normal model, in which the intercept as well as the effect of \code{age} is nested within patients. Then, we may use the following code: \begin{Sinput} fit1 <- brm(formula = time | cens(censored) ~ age * sex + disease + (1 + age|patient), data = kidney, family = lognormal(), prior = c(set_prior("normal(0,5)", class = "b"), set_prior("cauchy(0,2)", class = "sd"), set_prior("lkj(2)", class = "cor")), warmup = 1000, iter = 2000, chains = 4, control = list(adapt_delta = 0.95)) \end{Sinput} \subsection[formula: Information on the response and predictors]{\code{formula}: Information on the response and predictors} Without doubt, \code{formula} is the most complicated argument, as it contains information on the response variable as well as on predictors at different levels of the model. Everything before the $\sim$ sign relates to the response part of \code{formula}. In the usual and most simple case, this is just one variable name (e.g., \code{time}). However, to incorporate additional information about the response, one can add one or more terms of the form \code{| fun(variable)}. \code{fun} may be one of a few functions defined internally in \pkg{brms} and \code{variable} corresponds to a variable in the data set supplied by the user. In this example, \code{cens} makes up the internal function that handles censored data, and \code{censored} is the variable that contains information on the censoring. Other available functions in this context are \code{weights} and \code{disp} to allow different sorts of weighting, \code{se} to specify known standard errors primarily for meta-analysis, \code{trunc} to define truncation boundaries, \code{trials} for binomial models\footnote{In functions such as \code{glm} or \code{glmer}, the binomial response is typically passed as \code{cbind(success, failure)}. In \pkg{brms}, the equivalent syntax is \code{success | trials(success + failure)}.}, and \code{cat} to specify the number of categories for ordinal models. Everything on the right side of $\sim$ specifies predictors. Here, the syntax exactly matches that of \pkg{lme4}. For both, population-level and group-level terms, the \code{+} is used to separate different effects from each other. Group-level terms are of the form \code{(coefs | group)}, where \code{coefs} contains one or more variables whose effects are assumed to vary with the levels of the grouping factor given in \code{group}. Multiple grouping factors each with multiple group-level coefficients are possible. In the present example, only one group-level term is specified in which \code{1 + age} are the coefficients varying with the grouping factor \code{patient}. This implies that the intercept of the model as well as the effect of age is supposed to vary between patients. By default, group-level coefficients within a grouping factor are assumed to be correlated. Correlations can be set to zero by using the \code{(coefs || group)} syntax\footnote{In contrast to \pkg{lme4}, the \code{||} operator in \pkg{brms} splits up the design matrix computed from \code{coefs} instead of decomposing \code{coefs} in its terms. This implies that columns of the design matrix originating from the same factor are also assumed to be uncorrelated, whereas \pkg{lme4} estimates the correlations in this case. For a way to achieve \pkg{brms}-like behavior with \pkg{lme4}, see the \code{mixed} function of the \pkg{afex} package by \cite{afex2015}.}. Everything on the right side of \code{formula} that is not recognized as part of a group-level term is treated as a population-level effect. In this example, the population-level effects are \code{age}, \code{sex}, and \code{disease}. \subsection[family: Distribution of the response variable]{\code{family}: Distribution of the response variable} Argument \code{family} should usually be a family function, a call to a family function or a character string naming the family. If not otherwise specified, default link functions are applied. \pkg{brms} comes with a large variety of families. Linear and robust linear regression can be performed using the \code{gaussian} or \code{student} family combined with the \code{identity} link. For dichotomous and categorical data, families \code{bernoulli}, \code{binomial}, and \code{categorical} combined with the \code{logit} link, by default, are perfectly suited. Families \code{poisson}, \code{negbinomial}, and \code{geometric} allow for modeling count data. Families \code{lognormal}, \code{Gamma}, \code{exponential}, and \code{weibull} can be used (among others) for survival regression. Ordinal regression can be performed using the families \code{cumulative}, \code{cratio}, \code{sratio}, and \code{acat}. Finally, families \code{zero_inflated_poisson}, \code{zero_inflated_negbinomial}, \code{zero_inflated_binomial}, \code{zero_inflated_beta}, \code{hurdle_poisson}, \code{hurdle_negbinomial}, and \code{hurdle_gamma} can be used to adequately model excess zeros in the response. In our example, we use \code{family = lognormal()} implying a log-normal ``survival'' model for the response variable \code{time}. \subsection[prior: Prior distributions of model parameters]{\code{prior}: Prior distributions of model parameters} Every population-level effect has its corresponding regression parameter. These parameters are named as \code{b\_}, where \code{} represents the name of the corresponding population-level effect. The default prior is an improper flat prior over the reals. Suppose, for instance, that we want to set a normal prior with mean \code{0} and standard deviation \code{10} on the effect of \code{age} and a Cauchy prior with location \code{1} and scale \code{2} on \code{sexfemale}\footnote{When factors are used as predictors, parameter names will depend on the factor levels. To get an overview of all parameters and parameter classes for which priors can be specified, use function \code{get\_prior}. For the present example, \code{get\_prior(time | cens(censored) $\sim$ age * sex + disease + (1 + age|patient), data = kidney, family = lognormal())} does the desired.}. Then, we may write \begin{Sinput} prior <- c(set_prior("normal(0,10)", class = "b", coef = "age"), set_prior("cauchy(1,2)", class = "b", coef = "sexfemale")) \end{Sinput} To put the same prior (e.g., a normal prior) on all population-level effects at once, we may write as a shortcut \code{set_prior("normal(0,10)", class = "b")}. This also leads to faster sampling, because priors can be vectorized in this case. Note that we could also omit the \code{class} argument for population-level effects, as it is the default class in \code{set_prior}. A special shrinkage prior to be applied on population-level effects is the horseshoe prior \citep{carvalho2009, carvalho2010}. It is symmetric around zero with fat tails and an infinitely large spike at zero. This makes it ideal for sparse models that have many regression coefficients, although only a minority of them is non-zero. The horseshoe prior can be applied on all population-level effects at once (excluding the intercept) by using \code{set_prior("horseshoe(1)")}. The $1$ implies that the Student-$t$ prior of the local shrinkage parameters has 1 degrees of freedom. In \pkg{brms} it is possible to increase the degrees of freedom (which will often improve convergence), although the prior no longer resembles a horseshoe in this case\footnote{This class of priors is often referred to as hierarchical shrinkage family, which contains the original horseshoe prior as a special case.}. For more details see \cite{carvalho2009, carvalho2010}. Each group-level effect of each grouping factor has a standard deviation parameter, which is restricted to be non-negative and, by default, has a half Student-$t$ prior with $3$ degrees of freedom and a scale parameter that is minimally $10$. For non-ordinal models, \pkg{brms} tries to evaluate if the scale is large enough to be considered only weakly informative for the model at hand by comparing it with the standard deviation of the response after applying the link function. If this is not the case, it will increase the scale based on the aforementioned standard deviation\footnote{Changing priors based on the data is not truly Bayesian and might rightly be criticized. However, it helps avoiding the problem of too informative default priors without always forcing users to define their own priors. The latter would also be problematic as not all users can be expected to be well educated Bayesians and reasonable default priors will help them a lot in using Bayesian methods.}. \pkg{Stan} implicitly defines a half Student-$t$ prior by using a Student-$t$ prior on a restricted parameter \citep{stanM2017}. For other reasonable priors on standard deviations see \cite{gelman2006}. In \pkg{brms}, standard deviation parameters are named as \code{sd\_\_} so that \code{sd\_patient\_Intercept} and \code{sd\_patient\_age} are the parameter names in the example. If desired, it is possible to set a different prior on each parameter, but statements such as \code{set_prior("student_t(3,0,5)", class = "sd", group = "patient")} or even \code{set_prior("student_t(3,0,5)", class = "sd")} may also be used and are again faster because of vectorization. If there is more than one group-level effect per grouping factor, correlations between group-level effects are estimated. As mentioned in Section~\ref{model}, the LKJ-Correlation prior with parameter $\zeta > 0$ \citep{lewandowski2009} is used for this purpose. In \pkg{brms}, this prior is abbreviated as \code{"lkj(zeta)"} and correlation matrix parameters are named as \code{cor\_}, (e.g., \code{cor_patient}), so that \code{set_prior("lkj(2)", class = "cor", group = "patient")} is a valid statement. To set the same prior on every correlation matrix in the model, \code{set_prior("lkj(2)", class = "cor")} is also allowed, but does not come with any efficiency increases. Other model parameters such as the residual standard deviation \code{sigma} in normal models or the \code{shape} in Gamma models have their priors defined in the same way, where each of them is treated as having its own parameter class. A complete overview on possible prior distributions is given in the \pkg{Stan} user's manual \citep{stanM2017}. Note that \pkg{brms} does not thoroughly check if the priors are written in correct \pkg{Stan} language. Instead, \pkg{Stan} will check their syntactical correctness when the model is parsed to \proglang{C++} and return an error if they are not. This, however, does not imply that priors are always meaningful if they are accepted by \pkg{Stan}. Although \pkg{brms} tries to find common problems (e.g., setting bounded priors on unbounded parameters), there is no guarantee that the defined priors are reasonable for the model. \subsection[control Adjusting the sampling behavior of Stan]{\code{control}: Adjusting the sampling behavior of \pkg{Stan}} In addition to choosing the number of iterations, warmup samples, and chains, users can control the behavior of the NUTS sampler by using the \code{control} argument. The most important reason to use \code{control} is to decrease (or eliminate at best) the number of divergent transitions that cause a bias in the obtained posterior samples. Whenever you see the warning \code{"There were x divergent transitions after warmup."}, you should really think about increasing \code{adapt_delta}. To do this, write \code{control = list(adapt_delta = )}, where \code{} should usually be a value between \code{0.8} (current default) and \code{1}. Increasing \code{adapt_delta} will slow down the sampler but will decrease the number of divergent transitions threatening the validity of your posterior samples. Another problem arises when the depth of the tree being evaluated in each iteration is exceeded. This is less common than having divergent transitions, but may also bias the posterior samples. When it happens, \pkg{Stan} will throw out a warning suggesting to increase \code{max_treedepth}, which can be accomplished by writing \code{control = list(max_treedepth = )} with a positive integer \code{} that should usually be larger than the current default of \code{10}. \subsection{Analyzing the results} The example model \code{fit1} is fitted using 4 chains, each with 2000 iterations of which the first 1000 are warmup to calibrate the sampler, leading to a total of 4000 posterior samples\footnote{To save time, chains may also run in parallel when using argument \code{cluster}.}. For researchers familiar with Gibbs or Metropolis-Hastings sampling, this number may seem far too small to achieve good convergence and reasonable results, especially for multilevel models. However, as \pkg{brms} utilizes the NUTS sampler \citep{hoffman2014} implemented in \pkg{Stan}, even complex models can often be fitted with not more than a few thousand samples. Of course, every iteration is more computationally intensive and time-consuming than the iterations of other algorithms, but the quality of the samples (i.e., the effective sample size per iteration) is usually higher. After the posterior samples have been computed, the \code{brm} function returns an \proglang{R} object, containing (among others) the fully commented model code in \pkg{Stan} language, the data to fit the model, and the posterior samples themselves. The model code and data for the present example can be extracted through \code{stancode(fit1)} and \code{standata(fit1)} respectively\footnote{Both model code and data may be amended and used to fit new models. That way, \pkg{brms} can also serve as a good starting point in building more complicated models in \pkg{Stan}, directly.}. A model summary is readily available using \begin{Sinput} R> summary(fit1, waic = TRUE) \end{Sinput} \begin{Soutput} Family: lognormal (identity) Formula: time | cens(censored) ~ age * sex + disease + (1 + age | patient) Data: kidney (Number of observations: 76) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: 673.51 Group-Level Effects: ~patient (Number of levels: 38) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 0.40 0.28 0.01 1.01 1731 1 sd(age) 0.01 0.01 0.00 0.02 1137 1 cor(Intercept,age) -0.13 0.46 -0.88 0.76 3159 1 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept 2.73 0.96 0.82 4.68 2139 1 age 0.01 0.02 -0.03 0.06 1614 1 sexfemale 2.42 1.13 0.15 4.64 2065 1 diseaseGN -0.40 0.53 -1.45 0.64 2664 1 diseaseAN -0.52 0.50 -1.48 0.48 2713 1 diseasePKD 0.60 0.74 -0.86 2.02 2968 1 age:sexfemale -0.02 0.03 -0.07 0.03 1956 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 1.15 0.13 0.91 1.44 4000 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Soutput} On the top of the output, some general information on the model is given, such as family, formula, number of iterations and chains, as well as the WAIC. Next, group-level effects are displayed separately for each grouping factor in terms of standard deviations and correlations between group-level effects. On the bottom of the output, population-level effects are displayed. If incorporated, autocorrelation and family specific parameters (e.g., the residual standard deviation \code{sigma}) are also given. In general, every parameter is summarized using the mean (\code{Estimate}) and the standard deviation (\code{Est.Error}) of the posterior distribution as well as two-sided 95\% Credible intervals (\code{l-95\% CI} and \code{u-95\% CI}) based on quantiles. The \code{Eff.Sample} value is an estimation of the effective sample size; that is the number of independent samples from the posterior distribution that would be expected to yield the same standard error of the posterior mean as is obtained from the dependent samples returned by the MCMC algorithm. The \code{Rhat} value provides information on the convergence of the algorithm (cf., \citeauthor{gelman1992}, \citeyear{gelman1992}). If \code{Rhat} is considerably greater than 1 (i.e., $> 1.1$), the chains have not yet converged and it is necessary to run more iterations and/or set stronger priors. To visually investigate the chains as well as the posterior distribution, the \code{plot} method can be used (see Figure~\ref{kidney_plot}). An even more detailed investigation can be achieved by applying the \pkg{shinystan} package \citep{gabry2015} through method \code{launch_shiny}. With respect to the above summary, \code{sexfemale} seems to be the only population-level effect with considerable influence on the response. Because the mean of \code{sexfemale} is positive, the model predicts longer periods without an infection for females than for males. Effects of population-level predictors can also be visualized with the \code{conditional_effects} method (see Figure~\ref{kidney_conditional_effects}). \begin{figure}[ht] \centering \includegraphics[width=0.95\textwidth]{kidney_plot.pdf} \caption{Trace and Density plots of all relevant parameters of the kidney model discussed in Section~\ref{software}.} \label{kidney_plot} \end{figure} \begin{figure}[ht] \centering \includegraphics[height=0.90\textheight]{kidney_conditional_effects.pdf} \caption{Marginal effects plots of all population-level predictors of the kidney model discussed in Section~\ref{software}.} \label{kidney_conditional_effects} \end{figure} Looking at the group-level effects, the standard deviation parameter of \code{age} is suspiciously small. To test whether it is smaller than the standard deviation parameter of \code{Intercept}, we apply the \code{hypothesis} method: \begin{Sinput} R> hypothesis(fit1, "Intercept - age > 0", class = "sd", group = "patient") \end{Sinput} \begin{Soutput} Hypothesis Tests for class sd_patient: Estimate Est.Error l-95% CI u-95% CI Evid.Ratio Intercept-age > 0 0.39 0.27 0.03 Inf 67.97 * --- '*': The expected value under the hypothesis lies outside the 95% CI. \end{Soutput} The one-sided 95\% credibility interval does not contain zero, thus indicating that the standard deviations differ from each other in the expected direction. In accordance with this finding, the \code{Evid.Ratio} shows that the hypothesis being tested (i.e., \code{Intercept - age > 0}) is about $68$ times more likely than the alternative hypothesis \code{Intercept - age < 0}. It is important to note that this kind of comparison is not easily possible when applying frequentist methods, because in this case only point estimates are available for group-level standard deviations and correlations. When looking at the correlation between both group-level effects, its distribution displayed in Figure~\ref{kidney_plot} and the 95\% credibility interval in the summary output appear to be rather wide. This indicates that there is not enough evidence in the data to reasonably estimate the correlation. Together, the small standard deviation of \code{age} and the uncertainty in the correlation raise the question if \code{age} should be modeled as a group specific term at all. To answer this question, we fit another model without this term: \begin{Sinput} R> fit2 <- update(fit1, formula. = ~ . - (1 + age|patient) + (1|patient)) \end{Sinput} A good way to compare both models is leave-one-out cross-validation (LOO)\footnote{The WAIC is an approximation of LOO that is faster and easier to compute. However, according to \cite{vehtari2015}, LOO may be the preferred method to perform model comparisons.}, which can be called in \pkg{brms} using \begin{Sinput} R> LOO(fit1, fit2) \end{Sinput} \begin{Soutput} LOOIC SE fit1 675.45 45.18 fit2 674.17 45.06 fit1 - fit2 1.28 0.99 \end{Soutput} In the output, the LOO information criterion for each model as well as the difference of the LOOs each with its corresponding standard error is shown. Both LOO and WAIC are approximately normal if the number of observations is large so that the standard errors can be very helpful in evaluating differences in the information criteria. However, for small sample sizes, standard errors should be interpreted with care \citep{vehtari2015}. For the present example, it is immediately evident that both models have very similar fit, indicating that there is little benefit in adding group specific coefficients for \code{age}. \subsection{Modeling ordinal data} In the following, we want to briefly discuss a second example to demonstrate the capabilities of \pkg{brms} in handling ordinal data. \cite{ezzet1991} analyze data from a two-treatment, two-period crossover trial to compare 2 inhalation devices for delivering the drug salbutamol in 286 asthma patients. Patients were asked to rate the clarity of leaflet instructions accompanying each device, using a four-point ordinal scale. Ratings are predicted by \code{treat} to indicate which of the two inhaler devices was used, \code{period} to indicate the time of administration, and \code{carry} to model possible carry over effects. \begin{Sinput} R> data("inhaler") R> head(inhaler, n = 1) \end{Sinput} \begin{Soutput} subject rating treat period carry 1 1 1 0.5 0.5 0 \end{Soutput} Typically, the ordinal response is assumed to originate from the categorization of a latent continuous variable. That is there are $K$ latent thresholds (model intercepts), which partition the continuous scale into the $K + 1$ observable, ordered categories. Following this approach leads to the cumulative or graded-response model \citep{samejima1969} for ordinal data implemented in many \proglang{R} packages. In \pkg{brms}, it is available via family \code{cumulative}. Fitting the cumulative model to the inhaler data, also incorporating an intercept varying by subjects, may look this: \begin{Sinput} fit3 <- brm(formula = rating ~ treat + period + carry + (1|subject), data = inhaler, family = cumulative) \end{Sinput} While the support for ordinal data in most \proglang{R} packages ends here\footnote{Exceptions known to us are the packages \pkg{ordinal} \citep{christensen2015} and \pkg{VGAM} \citep{yee2010}. The former supports only cumulative models but with different modeling option for the thresholds. The latter supports all four ordinal families also implemented in \pkg{brms} as well as category specific effects but no group-specific effects.}, \pkg{brms} allows changes to this basic model in at least three ways. First of all, three additional ordinal families are implemented. Families \code{sratio} (stopping ratio) and \code{cratio} (continuation ratio) are so called sequential models \citep{tutz1990}. Both are equivalent to each other for symmetric link functions such as \code{logit} but will differ for asymmetric ones such as \code{cloglog}. The fourth ordinal family is \code{acat} (adjacent category) also known as partial credits model \citep{masters1982, andrich1978a}. Second, restrictions to the thresholds can be applied. By default, thresholds are ordered for family \code{cumulative} or are completely free to vary for the other families. This is indicated by argument \code{threshold = "flexible"} (default) in \code{brm}. Using \code{threshold = "equidistant"} forces the distance between two adjacent thresholds to be the same, that is $$\tau_k = \tau_1 + (k-1)\delta$$ for thresholds $\tau_k$ and distance $\delta$ (see also \citealp{andrich1978b}; \citealp{andrich1978a}; \citealp{andersen1977}). Third, the assumption that predictors have constant effects across categories may be relaxed for non-cumulative ordinal models \citep{vanderark2001, tutz2000} leading to category specific effects. For instance, variable \code{treat} may only have an impact on the decision between category 3 and 4, but not on the lower categories. Without using category specific effects, such a pattern would remain invisible. To illustrate all three modeling options at once, we fit a (hardly theoretically justified) stopping ratio model with equidistant thresholds and category specific effects for variable \code{treat} on which we apply an informative prior. \begin{Sinput} fit4 <- brm(formula = rating ~ period + carry + cs(treat) + (1|subject), data = inhaler, family = sratio, threshold = "equidistant", prior = set_prior("normal(-1,2)", coef = "treat")) \end{Sinput} Note that priors are defined on category specific effects in the same way as for other population-level effects. A model summary can be obtained in the same way as before: \begin{Sinput} R> summary(fit4, waic = TRUE) \end{Sinput} \begin{Soutput} Family: sratio (logit) Formula: rating ~ period + carry + cs(treat) + (1 | subject) Data: inhaler (Number of observations: 572) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: 911.9 Group-Level Effects: ~subject (Number of levels: 286) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 1.05 0.23 0.56 1.5 648 1 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept[1] 0.72 0.13 0.48 0.99 2048 1 Intercept[2] 2.67 0.35 2.00 3.39 969 1 Intercept[3] 4.62 0.66 3.36 5.95 1037 1 period 0.25 0.18 -0.09 0.61 4000 1 carry -0.26 0.22 -0.70 0.17 1874 1 treat[1] -0.96 0.30 -1.56 -0.40 1385 1 treat[2] -0.65 0.49 -1.60 0.27 4000 1 treat[3] -2.65 1.21 -5.00 -0.29 4000 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat delta 1.95 0.32 1.33 2.6 1181 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Soutput} Trace and density plots of the model parameters as produced by \code{plot(fit4)} can be found in Figure~\ref{inhaler_plot}. We see that three intercepts (thresholds) and three effects of \code{treat} have been estimated, because a four-point scale was used for the ratings. The treatment effect seems to be strongest between category 3 and 4. At the same time, however, the credible interval is also much larger. In fact, the intervals of all three effects of \code{treat} are highly overlapping, which indicates that there is not enough evidence in the data to support category specific effects. On the bottom of the output, parameter \code{delta} specifies the distance between two adjacent thresholds and indeed the intercepts differ from each other by the magnitude of \code{delta}. \begin{figure}[ht] \centering \includegraphics[width=0.95\textwidth]{inhaler_plot.pdf} \caption{Trace and Density plots of all relevant parameters of the inhaler model discussed in Section~\ref{software}.} \label{inhaler_plot} \end{figure} \section[Comparison]{Comparison between packages} Over the years, many \proglang{R} packages have been developed that implement MLMs, each being more or less general in their supported models. Comparing all of them to \pkg{brms} would be too extensive and barely helpful for the purpose of the present paper. Accordingly, we concentrate on a comparison with four packages. These are \pkg{lme4} \citep{bates2015} and \pkg{MCMCglmm} \citep{hadfield2010}, which are possibly the most general and widely applied \proglang{R} packages for MLMs, as well as \pkg{rstanarm} \citep{rstanarm2016} and \pkg{rethinking} \citep{mcelreath2016}, which are both based on \pkg{Stan}. As opposed to the other packages, \pkg{rethinking} was primarily written for teaching purposes and requires the user to specify the full model explicitly using its own simplified \pkg{BUGS}-like syntax thus helping users to better understand the models that are fitted to their data. Regarding model families, all five packages support the most common types such as linear and binomial models as well as Poisson models for count data. Currently, \pkg{brms} and \pkg{MCMCglmm} provide more flexibility when modeling categorical and ordinal data. In addition, \pkg{brms} supports robust linear regression using Student's distribution, which is also implemented on a GitHub branch of \pkg{rstanarm}. \pkg{MCMCglmm} allows fitting multinomial models that are currently not available in the other packages. Generalizing classical MLMs, \pkg{brms} and \pkg{MCMCglmm} allow fiting zero-inflated and hurdle models dealing with excess zeros in the response. Furthermore, \pkg{brms} supports non-linear models similar to the \pkg{nlme} package \citep{nlme2016} providing great flexibility but also requiring more care to produce reasonable results. Another flexible model class are generalized additive mixed models \citep{hastie1990,wood2011,zuur2014}, which can be fitted with \pkg{brms} and \pkg{rstanarm}. In all five packages, there are quite a few additional modeling options. Variable link functions can be specified in all packages except for \pkg{MCMCglmm}, in which only one link is available per family. \pkg{MCMCglmm} generally supports multivariate responses using data in wide format, whereas \pkg{brms} currently only offers this option for families \code{gaussian} and \code{student}. It should be noted that it is always possible to transform data from wide to long format for compatibility with the other packages. Autocorrelation of the response can only be fitted in \pkg{brms}, which supports auto-regressive as well as moving-average effects. For ordinal models in \pkg{brms}, effects of predictors may vary across different levels of the response as explained in the inhaler example. A feature currently exclusive to \pkg{rethinking} is the possibility to impute missing values in the predictor variables. Information criteria are available in all three packages. The advantage of WAIC and LOO implemented in \pkg{brms}, \pkg{rstanarm}, and \pkg{rethinking} is that their standard errors can be easily estimated to get a better sense of the uncertainty in the criteria. Comparing the prior options of the Bayesian packages, \pkg{brms} and \pkg{rethinking} offer a little more flexibility than \pkg{MCMCglmm} and \pkg{rstanarm}, as virtually any prior distribution can be applied on population-level effects as well as on the standard deviations of group-level effects. In addition, we believe that the way priors are specified in \pkg{brms} and \pkg{rethinking} is more intuitive as it is directly evident what prior is actually applied. A more detailed comparison of the packages can be found in Table~\ref{comparison1} and Table~\ref{comparison2}. To facilitate the understanding of the model formulation in \pkg{brms}, Table~\ref{syntax} shows \pkg{lme4} function calls to fit sample models along with the equivalent \pkg{brms} syntax. So far the focus was only on capabilities. Another important topic is speed, especially for more complex models. Of course, \pkg{lme4} is usually much faster than the other packages as it uses maximum likelihood methods instead of MCMC algorithms, which are slower by design. To compare the efficiency of the four Bayesian packages, we fitted multilevel models on real data sets using the minimum effective sample size divided by sampling time as a measure of sampling efficiency. One should always aim at running multiple chains as one cannot be sure that a single chain really explores the whole posterior distribution. However, as \pkg{MCMCglmm} does not come with a built-in option to run multiple chains, we used only a single chain to fit the models after making sure that it leads to the same results as multiple chains. The \proglang{R} code allowing to replicate the results is available as supplemental material. The first thing that becomes obvious when fitting the models is that \pkg{brms} and \pkg{rethinking} need to compile the \proglang{C++} model before actually fitting it, because the \pkg{Stan} code being parsed to \proglang{C++} is generated on the fly based on the user's input. Compilation takes about a half to one minute depending on the model complexity and computing power of the machine. This is not required by \pkg{rstanarm} and \pkg{MCMCglmm}, although the former is also based on \pkg{Stan}, as compilation takes place only once at installation time. While the latter approach saves the compilation time, the former is more flexible when it comes to model specification. For small and simple models, compilation time dominates the overall computation time, but for larger and more complex models, sampling will take several minutes or hours so that one minute more or less will not really matter, anymore. Accordingly, the following comparisons do not include the compilation time. In models containing only group-specific intercepts, \pkg{MCMCglmm} is usually more efficient than the \pkg{Stan} packages. However, when also estimating group-specific slopes, \pkg{MCMCglmm} falls behind the other packages and quite often refuses to sample at all unless one carefully specifies informative priors. Note that these results are obtained by running only a single chain. For all three \pkg{Stan} packages, sampling efficiency can easily be increased by running multiple chains in parallel. Comparing the \pkg{Stan} packages to each other, \pkg{brms} is usually most efficient for models with group-specific terms, whereas \pkg{rstanarm} tends to be roughly $50\%$ to $75\%$ as efficient at least for the analyzed data sets. The efficiency of \pkg{rethinking} is more variable depending on the model formulation and data, sometimes being slightly ahead of the other two packages, but usually being considerably less efficient. Generally, \pkg{rethinking} loses efficiency for models with many population-level effects presumably because one cannot use design matrices and vectorized prior specifications for population-level parameters. Note that it was not possible to specify the exact same priors across packages due to varying parameterizations. Of course, efficiency depends heavily on the model, chosen priors, and data at hand so that the present results should not be over-interpreted. \begin{table}[hbtp] \centering \begin{tabular}{llll} & \parbox{2cm}{\pkg{brms}} & \parbox{2cm}{\pkg{lme4}} & \parbox{2cm}{\pkg{MCMCglmm}} \\ \hline \\ [-1.5ex] \parbox{6cm}{Supported model types:} & & & \\ [1ex] Linear models & yes & yes & yes \\ Robust linear models & yes & no & no \\ Binomial models & yes & yes & yes \\ Categorical models & yes & no & yes \\ Multinomial models & no & no & yes \\ Count data models & yes & yes & yes \\ Survival models & yes$^1$ & yes & yes \\ Ordinal models & various & no & cumulative \\ Zero-inflated and hurdle models & yes & no & yes \\ Generalized additive models & yes & no & no \\ Non-linear models & yes & no & no \\ \hline \\ [-1.5ex] \parbox{5cm}{Additional modeling options:} & & & \\ [1ex] Variable link functions & various & various & no \\ Weights & yes & yes & no \\ Offset & yes & yes & using priors \\ Multivariate responses & limited & no & yes \\ Autocorrelation effects & yes & no & no \\ Category specific effects & yes & no & no \\ Standard errors for meta-analysis & yes & no & yes \\ Censored data & yes & no & yes \\ Truncated data & yes & no & no \\ Customized covariances & yes & no & yes \\ Missing value imputation & no & no & no \\ \hline \\ [-1.5ex] Bayesian specifics: & & & \\ [1ex] parallelization & yes & -- & no \\ population-level priors & flexible & --$^3$ & normal \\ group-level priors & normal & --$^3$ & normal \\ covariance priors & flexible & --$^3$ & restricted$^4$ \\ \hline \\ [-1.5ex] Other: & & & \\ [1ex] Estimator & HMC, NUTS & ML, REML & MH, Gibbs$^2$ \\ Information criterion & WAIC, LOO & AIC, BIC & DIC \\ \proglang{C++} compiler required & yes & no & no \\ Modularized & no & yes & no \\ \hline \end{tabular} \caption{Comparison of the capabilities of the \pkg{brms}, \pkg{lme4} and \pkg{MCMCglmm} package. Notes: (1) Weibull family only available in \pkg{brms}. (2) Estimator consists of a combination of both algorithms. (3) Priors may be imposed using the \pkg{blme} package \citep{chung2013}. (4) For details see \cite{hadfield2010}.} \label{comparison1} \end{table} \begin{table}[hbtp] \centering \begin{tabular}{llll} & \parbox{2cm}{\pkg{brms}} & \parbox{2cm}{\pkg{rstanarm}} & \parbox{2cm}{\pkg{rethinking}} \\ \hline \\ [-1.5ex] \parbox{6cm}{Supported model types:} & & & \\ [1ex] Linear models & yes & yes & yes \\ Robust linear models & yes & yes$^1$ & no \\ Binomial models & yes & yes & yes \\ Categorical models & yes & no & no \\ Multinomial models & no & no & no \\ Count data models & yes & yes & yes \\ Survival models & yes$^2$ & yes & yes \\ Ordinal models & various & cumulative$^3$ & no \\ Zero-inflated and hurdle models & yes & no & no \\ Generalized additive models & yes & yes & no \\ Non-linear models & yes & no & limited$^4$ \\ \hline \\ [-1.5ex] \parbox{5cm}{Additional modeling options:} & & & \\ [1ex] Variable link functions & various & various & various \\ Weights & yes & yes & no \\ Offset & yes & yes & yes \\ Multivariate responses & limited & no & no \\ Autocorrelation effects & yes & no & no \\ Category specific effects & yes & no & no \\ Standard errors for meta-analysis & yes & no & no \\ Censored data & yes & no & no \\ Truncated data & yes & no & yes \\ Customized covariances & yes & no & no \\ Missing value imputation & no & no & yes \\ \hline \\ [-1.5ex] Bayesian specifics: & & & \\ [1ex] parallelization & yes & yes & yes \\ population-level priors & flexible & normal, Student-t & flexible \\ group-level priors & normal & normal & normal \\ covariance priors & flexible & restricted$^5$ & flexible \\ \hline \\ [-1.5ex] Other: & & & \\ [1ex] Estimator & HMC, NUTS & HMC, NUTS & HMC, NUTS \\ Information criterion & WAIC, LOO & AIC, LOO & AIC, LOO \\ \proglang{C++} compiler required & yes & no & yes \\ Modularized & no & no & no \\ \hline \end{tabular} \caption{Comparison of the capabilities of the \pkg{brms}, \pkg{rstanarm} and \pkg{rethinking} package. Notes: (1) Currently only implemented on a branch on GitHub. (2) Weibull family only available in \pkg{brms}. (3) No group-level terms allowed. (4) The parser is mainly written for linear models but also accepts some non-linear model specifications. (5) For details see \url{https://github.com/stan-dev/rstanarm/wiki/Prior-distributions}.} \label{comparison2} \end{table} \begin{table}[hbtp] \centering %\renewcommand{\arraystretch}{2} \begin{tabular}{ll} Dataset & \parbox{10cm}{Function call} \\ \hline \\ [-1.5ex] \parbox{2cm}{cake} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{lmer(angle $\sim$ recipe * temperature + (1|recipe:replicate), \\ \hspace*{5ex} data = cake)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(angle $\sim$ recipe * temperature + (1|recipe:replicate), \\ \hspace*{4ex} data = cake)}} \\ [2ex] \hline \\ [-1.5ex] \parbox{2cm}{sleepstudy} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{lmer(Reaction $\sim$ Days + (Days|Subject), data = sleepstudy)}} \\ [1.5ex] \pkg{brms} & \parbox{13cm}{\code{brm(Reaction $\sim$ Days + (Days|Subject), data = sleepstudy)}} \\ [2ex] \hline \\ [-1.5ex] \parbox{2cm}{cbpp$^1$} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{glmer(cbind(incidence, size - incidence) $\sim$ period + (1 | herd), \\ \hspace*{6ex} family = binomial("logit"), data = cbpp)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(incidence | trials(size) $\sim$ period + (1 | herd), \\ \hspace*{4ex} family = binomial("logit"), data = cbpp)}} \\ [2ex] \hline \\ [-1.5ex] \parbox{2cm}{grouseticks$^1$} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{glmer(TICKS $\sim$ YEAR + HEIGHT + (1|BROOD) + (1|LOCATION), \\ \hspace*{6ex} family = poisson("log"), data = grouseticks)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(TICKS $\sim$ YEAR + HEIGHT + (1|BROOD) + (1|LOCATION), \\ \hspace*{4ex} family = poisson("log"), data = grouseticks)}} \\ [2ex] \hline \\ [-1ex] \parbox{2cm}{VerbAgg$^2$} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{glmer(r2 $\sim$ (Anger + Gender + btype + situ)\^{}2 + (1|id) \\ \hspace*{6ex} + (1|item), family = binomial, data = VerbAgg)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(r2 $\sim$ (Anger + Gender + btype + situ)\^{}2 + (1|id) \\ \hspace*{4ex} + (1|item), family = bernoulli, data = VerbAgg)}} \\ [2ex] \hline \\ [-1.5ex] \end{tabular} \caption{Comparison of the model syntax of \pkg{lme4} and \pkg{brms} using data sets included in \pkg{lme4}. Notes: (1) Default links are used to that the link argument may be omitted. (2) Fitting this model takes some time. A proper prior on the population-level effects (e.g., \code{prior = set\_prior("normal(0,5)")}) may help in increasing sampling speed.} \label{syntax} \end{table} \section{Conclusion} The present paper is meant to provide a general overview on the \proglang{R} package \pkg{brms} implementing MLMs using the probabilistic programming language \pkg{Stan} for full Bayesian inference. Although only a small selection of the modeling options available in \pkg{brms} are discussed in detail, I hope that this article can serve as a good starting point to further explore the capabilities of the package. For the future, I have several plans on how to improve the functionality of \pkg{brms}. I want to include multivariate models that can handle multiple response variables coming from different distributions as well as new correlation structures for instance for spatial data. Similarily, distributional regression models as well as mixture response distributions appear to be valuable extensions of the package. I am always grateful for any suggestions and ideas regarding new features. \section*{Acknowledgments} First of all, I would like to thank the Stan Development Team for creating the probabilistic programming language \pkg{Stan}, which is an incredibly powerful and flexible tool for performing full Bayesian inference. Without it, \pkg{brms} could not fit a single model. Two anonymous reviewers provided very detailed and thoughtful suggestions to substantially improve both the package and the paper. Furthermore, Prof. Philipp Doebler and Prof. Heinz Holling have given valuable feedback on earlier versions of the paper. Lastly, I want to thank the many users who reported bugs or had ideas for new features, thus helping to continuously improve \pkg{brms}. \bibliography{citations_overview} \end{document} brms/R/0000755000176200001440000000000013614307046011422 5ustar liggesusersbrms/R/lsp.R0000644000176200001440000000371613522262066012352 0ustar liggesusers# find all namespace entries of a package, which are of # a particular type for instance all exported objects # retrieved from https://github.com/raredd/rawr # @param package the package name # @param what type of the objects to retrieve ("all" for all objects) # @param pattern regex that must be matches by the object names # @return a character vector of object names lsp <- function(package, what = "all", pattern = ".*") { if (!is.character(substitute(package))) package <- deparse(substitute(package)) ns <- asNamespace(package) ## base package does not have NAMESPACE if (isBaseNamespace(ns)) { res <- ls(.BaseNamespaceEnv, all.names = TRUE) return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)]) } else { ## for non base packages if (exists('.__NAMESPACE__.', envir = ns, inherits = FALSE)) { wh <- get('.__NAMESPACE__.', inherits = FALSE, envir = asNamespace(package, base.OK = FALSE)) what <- if (missing(what)) 'all' else if ('?' %in% what) return(ls(wh)) else ls(wh)[pmatch(what[1], ls(wh))] if (!is.null(what) && !any(what %in% c('all', ls(wh)))) stop('\'what\' should be one of ', paste0(shQuote(ls(wh)), collapse = ', '), ', or \'all\'', domain = NA) res <- sapply(ls(wh), function(x) getNamespaceInfo(ns, x)) res <- rapply(res, ls, classes = 'environment', how = 'replace', all.names = TRUE) if (is.null(what)) return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)]) if (what %in% 'all') { res <- ls(getNamespace(package), all.names = TRUE) return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)]) } if (any(what %in% ls(wh))) { res <- res[[what]] return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)]) } } else stop(sprintf('no NAMESPACE file found for package %s', package)) } }brms/R/stan-likelihood.R0000644000176200001440000007015213611527526014644 0ustar liggesusers# unless otherwise specified, functions return a single character # string defining the likelihood of the model in Stan language stan_llh <- function(family, ...) { UseMethod("stan_llh") } # Stan code for the model likelihood # @param family the model family # @param bterms object of class brmsterms # @param data data passed by the user # @param mix optional mixture component ID # @param ptheta are mixing proportions predicted? #' @export stan_llh.default <- function(family, bterms, data, mix = "", ptheta = FALSE, ...) { stopifnot(is.family(family)) stopifnot(is.brmsterms(bterms)) stopifnot(length(mix) == 1L) bterms$family <- family resp <- usc(combine_prefix(bterms)) # prepare family part of the likelihood llh_args <- nlist(bterms, resp, mix) llh_fun <- paste0("stan_llh_", prepare_family(bterms)$fun) llh <- do_call(llh_fun, llh_args) # incorporate other parts into the likelihood args <- nlist(llh, bterms, data, resp, mix, ptheta) if (nzchar(mix)) { out <- do_call(stan_llh_mix, args) } else if (is.formula(bterms$adforms$cens)) { out <- do_call(stan_llh_cens, args) } else if (is.formula(bterms$adforms$weights)) { out <- do_call(stan_llh_weights, args) } else { out <- do_call(stan_llh_general, args) } if (grepl("\\[n\\]", out) && !nzchar(mix)) { # loop over likelihood if it cannot be vectorized out <- paste0(" for (n in 1:N", resp, ") {\n ", out, " }\n") } out } #' @export stan_llh.mixfamily <- function(family, bterms, ...) { dp_ids <- dpar_id(names(bterms$dpars)) fdp_ids <- dpar_id(names(bterms$fdpars)) resp <- usc(bterms$resp) ptheta <- any(dpar_class(names(bterms$dpars)) %in% "theta") llh <- rep(NA, length(family$mix)) for (i in seq_along(family$mix)) { sbterms <- bterms sbterms$dpars <- sbterms$dpars[dp_ids == i] sbterms$fdpars <- sbterms$fdpars[fdp_ids == i] llh[i] <- stan_llh( family$mix[[i]], sbterms, mix = i, ptheta = ptheta, ... ) } resp <- usc(combine_prefix(bterms)) has_weights <- is.formula(bterms$adforms$weights) weights <- str_if(has_weights, glue("weights{resp}[n] * ")) out <- glue( " // likelihood of the mixture model\n", " for (n in 1:N{resp}) {{\n", " real ps[{length(llh)}];\n" ) str_add(out) <- collapse(" ", llh) str_add(out) <- glue( " {tp()}{weights}log_sum_exp(ps);\n", " }}\n" ) out } #' @export stan_llh.brmsterms <- function(family, ...) { paste0(" ", stan_llh(family$family, bterms = family, ...)) } #' @export stan_llh.mvbrmsterms <- function(family, ...) { if (family$rescor) { out <- stan_llh(as.brmsterms(family), ...) } else { out <- collapse(ulapply(family$terms, stan_llh, ...)) } out } # default likelihood in Stan language stan_llh_general <- function(llh, bterms, data, resp = "", ...) { stopifnot(is.sdist(llh)) n <- str_if(grepl("\\[n\\]", llh$args), "[n]") lpdf <- stan_llh_lpdf_name(bterms) Y <- stan_llh_Y_name(bterms) tr <- stan_llh_trunc(llh, bterms, data, resp = resp) glue("{tp()}{llh$dist}_{lpdf}({Y}{resp}{n}{llh$shift} | {llh$args}){tr};\n") } # censored likelihood in Stan language stan_llh_cens <- function(llh, bterms, data, resp = "", ...) { stopifnot(is.sdist(llh)) s <- wsp(nsp = 6) cens <- eval_rhs(bterms$adforms$cens) lpdf <- stan_llh_lpdf_name(bterms) has_weights <- is.formula(bterms$adforms$weights) Y <- stan_llh_Y_name(bterms) w <- str_if(has_weights, glue("weights{resp}[n] * ")) tr <- stan_llh_trunc(llh, bterms, data, resp = resp) tp <- tp() out <- glue( " // special treatment of censored data\n", s, "if (cens{resp}[n] == 0) {{\n", s, "{tp}{w}{llh$dist}_{lpdf}({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n", s, "}} else if (cens{resp}[n] == 1) {{\n", s, "{tp}{w}{llh$dist}_lccdf({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n", s, "}} else if (cens{resp}[n] == -1) {{\n", s, "{tp}{w}{llh$dist}_lcdf({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n" ) if (cens$vars$y2 != "NA") { # interval censoring is required str_add(out) <- glue( s, "}} else if (cens{resp}[n] == 2) {{\n", s, "{tp}{w}log_diff_exp(\n", s, " {llh$dist}_lcdf(rcens{resp}[n]{llh$shift} | {llh$args}),\n", s, " {llh$dist}_lcdf({Y}{resp}[n]{llh$shift} | {llh$args})\n", s, " ){tr};\n" ) } str_add(out) <- glue(s, "}}\n") out } # weighted likelihood in Stan language stan_llh_weights <- function(llh, bterms, data, resp = "", ...) { stopifnot(is.sdist(llh)) tr <- stan_llh_trunc(llh, bterms, data, resp = resp) lpdf <- stan_llh_lpdf_name(bterms) Y <- stan_llh_Y_name(bterms) glue( "{tp()}weights{resp}[n] * {llh$dist}_{lpdf}", "({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n" ) } # likelihood of a single mixture component stan_llh_mix <- function(llh, bterms, data, mix, ptheta, resp = "", ...) { stopifnot(is.sdist(llh)) theta <- str_if(ptheta, glue("theta{mix}{resp}[n]"), glue("log(theta{mix}{resp})") ) tr <- stan_llh_trunc(llh, bterms, data, resp = resp) lpdf <- stan_llh_lpdf_name(bterms) Y <- stan_llh_Y_name(bterms) if (is.formula(bterms$adforms$cens)) { # mostly copied over from stan_llh_cens cens <- eval_rhs(bterms$adforms$cens) s <- wsp(nsp = 6) out <- glue( " // special treatment of censored data\n", s, "if (cens{resp}[n] == 0) {{\n", s, " ps[{mix}] = {theta} + ", "{llh$dist}_{lpdf}({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n", s, "}} else if (cens{resp}[n] == 1) {{\n", s, " ps[{mix}] = {theta} + ", "{llh$dist}_lccdf({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n", s, "}} else if (cens{resp}[n] == -1) {{\n", s, " ps[{mix}] = {theta} + ", "{llh$dist}_lcdf({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n" ) if (cens$vars$y2 != "NA") { # interval censoring is required str_add(out) <- glue( s, "}} else if (cens{resp}[n] == 2) {{\n", s, " ps[{mix}] = {theta} + log_diff_exp(\n", s, " {llh$dist}_lcdf(rcens{resp}[n]{llh$shift} | {llh$args}),\n", s, " {llh$dist}_lcdf({Y}{resp}[n]{llh$shift} | {llh$args})\n", s, " ){tr};\n" ) } str_add(out) <- glue(s, "}}\n") } else { out <- glue( " ps[{mix}] = {theta} + ", "{llh$dist}_{lpdf}({Y}{resp}[n]{llh$shift} | {llh$args}){tr};\n" ) } out } # truncated part of the likelihood # @param short use the T[, ] syntax? stan_llh_trunc <- function(llh, bterms, data, resp = "", short = FALSE) { stopifnot(is.sdist(llh)) bounds <- trunc_bounds(bterms, data = data) if (!any(bounds$lb > -Inf | bounds$ub < Inf)) { return("") } m1 <- str_if(use_int(bterms), " - 1") lb <- str_if(any(bounds$lb > -Inf), glue("lb{resp}[n]{m1}")) ub <- str_if(any(bounds$ub < Inf), glue("ub{resp}[n]")) if (short) { # truncation using T[, ] syntax out <- glue(" T[{lb}, {ub}]") } else { # truncation making use of _lcdf functions ms <- paste0(" -\n", wsp(nsp = 8)) if (any(bounds$lb > -Inf) && !any(bounds$ub < Inf)) { out <- glue("{ms}{llh$dist}_lccdf({lb} | {llh$args})") } else if (!any(bounds$lb > -Inf) && any(bounds$ub < Inf)) { out <- glue("{ms}{llh$dist}_lcdf({ub} | {llh$args})") } else if (any(bounds$lb > -Inf) && any(bounds$ub < Inf)) { trr <- glue("{llh$dist}_lcdf({ub} | {llh$args})") trl <- glue("{llh$dist}_lcdf({lb} | {llh$args})") out <- glue("{ms}log_diff_exp({trr}, {trl})") } } out } stan_llh_lpdf_name <- function(bterms) { ifelse(use_int(bterms$family), "lpmf", "lpdf") } stan_llh_Y_name <- function(bterms) { ifelse(is.formula(bterms$adforms$mi), "Yl", "Y") } # prepare names of distributional parameters # @param reqn will the likelihood be wrapped in a loop over n? # @param dpars optional names of distributional parameters to be prepared # if not specified will prepare all distributional parameters stan_llh_dpars <- function(bterms, reqn, resp = "", mix = "", dpars = NULL) { if (is.null(dpars)) { dpars <- paste0(valid_dpars(bterms), mix) } is_pred <- dpars %in% c("mu", names(bterms$dpars)) out <- paste0(dpars, resp, ifelse(reqn & is_pred, "[n]", "")) named_list(dpars, out) } # adjust lpdf name if a more efficient version is available # for a specific link. For instance 'poisson_log' stan_llh_simple_lpdf <- function(lpdf, link, bterms, sep = "_") { stopifnot(is.brmsterms(bterms)) cens_or_trunc <- stan_llh_adj(bterms, c("cens", "trunc")) if (bterms$family$link == link && !cens_or_trunc) { lpdf <- paste0(lpdf, sep, link) } lpdf } # prepare _logit suffix for distributional parameters # used in zero-inflated and hurdle models stan_llh_dpar_usc_logit <- function(dpar, bterms) { stopifnot(dpar %in% c("zi", "hu")) stopifnot(is.brmsterms(bterms)) cens_or_trunc <- stan_llh_adj(bterms, c("cens", "trunc")) usc_logit <- isTRUE(bterms$dpars[[dpar]]$family$link == "logit") str_if(usc_logit && !cens_or_trunc, "_logit") } # prepare the code for 'sigma' in the likelihood statement stan_llh_add_se <- function(sigma, bterms, reqn, resp = "") { if (is.formula(bterms$adforms$se)) { nse <- str_if(reqn, "[n]") if (no_sigma(bterms)) { sigma <- glue("se{resp}{nse}") } else { sigma <- glue("sqrt(square({sigma}) + se2{resp}{nse})") } } sigma } # check if the log-liklihood needs to be adjused # @param x named list of formulas or brmsterms object # @param adds vector of addition argument names # @return a single logical value stan_llh_adj <- function(x, adds = c("weights", "cens", "trunc")) { stopifnot(all(adds %in% c("weights", "cens", "trunc"))) if (is.brmsterms(x)) x <- x$adforms any(ulapply(x[adds], is.formula)) } # one function per family stan_llh_gaussian <- function(bterms, resp = "", mix = "") { if (use_glm_primitive(bterms)) { p <- args_glm_primitive(bterms$dpars$mu, resp = resp) p$sigma <- paste0("sigma", resp) out <- sdist("normal_id_glm", p$x, p$alpha, p$beta, p$sigma) } else { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) p$sigma <- stan_llh_add_se(p$sigma, bterms, reqn, resp) out <- sdist("normal", p$mu, p$sigma) } out } stan_llh_gaussian_mv <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) || bterms$sigma_pred p <- list(Mu = paste0("Mu", if (reqn) "[n]")) p$LSigma <- paste0("LSigma", if (bterms$sigma_pred) "[n]") sdist("multi_normal_cholesky", p$Mu, p$LSigma) } stan_llh_gaussian_time <- function(bterms, resp = "", mix = "") { if (stan_llh_adj(bterms)) { stop2("Invalid addition arguments for this model.") } p <- stan_llh_dpars(bterms, FALSE, resp, mix) v <- c("chol_cor", "se2", "nobs_tg", "begin_tg", "end_tg") p[v] <- as.list(paste0(v, resp)) sfx <- str_if("sigma" %in% names(bterms$dpars), "het", "hom") sdist(glue("normal_time_{sfx}"), p$mu, p$sigma, p$chol_cor, p$se2, p$nobs_tg, p$begin_tg, p$end_tg ) } stan_llh_gaussian_fcor <- function(bterms, resp = "", mix = "") { has_se <- is.formula(bterms$adforms$se) if (stan_llh_adj(bterms) || has_se) { stop2("Invalid addition arguments for this model.") } p <- stan_llh_dpars(bterms, FALSE, resp, mix) p$Lfcor <- paste0("Lfcor", resp) sfx <- str_if("sigma" %in% names(bterms$dpars), "het", "hom") sdist(glue("normal_fcor_{sfx}"), p$mu, p$sigma, p$Lfcor) } stan_llh_gaussian_lagsar <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, FALSE, resp, mix) p$sigma <- stan_llh_add_se(p$sigma, bterms, FALSE, resp) v <- c("lagsar", "Msar", "eigenMsar") p[v] <- as.list(paste0(v, resp)) sdist("normal_lagsar", p$mu, p$sigma, p$lagsar, p$Msar, p$eigenMsar) } stan_llh_gaussian_errorsar <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, FALSE, resp, mix) p$sigma <- stan_llh_add_se(p$sigma, bterms, FALSE, resp) v <- c("errorsar", "Msar", "eigenMsar") p[v] <- as.list(paste0(v, resp)) sdist("normal_errorsar", p$mu, p$sigma, p$errorsar, p$Msar, p$eigenMsar) } stan_llh_student <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) p$sigma <- stan_llh_add_se(p$sigma, bterms, reqn, resp) sdist("student_t", p$nu, p$mu, p$sigma) } stan_llh_student_mv <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) || bterms$sigma_pred p <- stan_llh_dpars(bterms, reqn, resp, mix, dpars = "nu") p$Mu <- paste0("Mu", if (reqn) "[n]") p$Sigma <- paste0("Sigma", if (bterms$sigma_pred) "[n]") sdist("multi_student_t", p$nu, p$Mu, p$Sigma) } stan_llh_student_time <- function(bterms, resp = "", mix = "") { if (stan_llh_adj(bterms)) { stop2("Invalid addition arguments for this model.") } p <- stan_llh_dpars(bterms, FALSE, resp, mix) v <- c("chol_cor", "se2", "nobs_tg", "begin_tg", "end_tg") p[v] <- as.list(paste0(v, resp)) sfx <- str_if("sigma" %in% names(bterms$dpars), "het", "hom") sdist(glue("student_t_time_{sfx}"), p$nu, p$mu, p$sigma, p$chol_cor, p$se2, p$nobs_tg, p$begin_tg, p$end_tg ) } stan_llh_student_fcor <- function(bterms, resp = "", mix = "") { has_se <- is.formula(bterms$adforms$se) if (stan_llh_adj(bterms) || has_se) { stop2("Invalid addition arguments for this model.") } p <- stan_llh_dpars(bterms, FALSE, resp, mix) p$Lfcor <- paste0("Lfcor", resp) sfx <- str_if("sigma" %in% names(bterms$dpars), "het", "hom") sdist(glue("student_t_fcor_{sfx}"), p$nu, p$mu, p$sigma, p$Lfcor) } stan_llh_student_lagsar <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, FALSE, resp, mix) p$sigma <- stan_llh_add_se(p$sigma, bterms, FALSE, resp) v <- c("lagsar", "Msar", "eigenMsar") p[v] <- as.list(paste0(v, resp)) sdist("student_t_lagsar", p$nu, p$mu, p$sigma, p$lagsar, p$Msar, p$eigenMsar) } stan_llh_student_errorsar <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, FALSE, resp, mix) p$sigma <- stan_llh_add_se(p$sigma, bterms, FALSE, resp) v <- c("errorsar", "Msar", "eigenMsar") p[v] <- as.list(paste0(v, resp)) sdist("student_t_errorsar", p$nu, p$mu, p$sigma, p$errorsar, p$Msar, p$eigenMsar) } stan_llh_lognormal <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist("lognormal", p$mu, p$sigma) } stan_llh_shifted_lognormal <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist("lognormal", p$mu, p$sigma, shift = paste0(" - ", p$ndt)) } stan_llh_asym_laplace <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) sdist("asym_laplace", p$mu, p$sigma, p$quantile) } stan_llh_skew_normal <- function(bterms, resp = "", mix = "", ...) { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) p$sigma <- stan_llh_add_se(p$sigma, bterms, reqn, resp) # required because of CP parameterization of mu and sigma nomega <- any(grepl("\\[n\\]", c(p$sigma, p$alpha))) nomega <- str_if(reqn && nomega, "[n]") p$omega <- paste0("omega", mix, resp, nomega) sdist("skew_normal", p$mu, p$omega, p$alpha) } stan_llh_poisson <- function(bterms, resp = "", mix = "") { if (use_glm_primitive(bterms)) { p <- args_glm_primitive(bterms$dpars$mu, resp = resp) out <- sdist("poisson_log_glm", p$x, p$alpha, p$beta) } else { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) lpdf <- stan_llh_simple_lpdf("poisson", "log", bterms) out <- sdist(lpdf, p$mu) } out } stan_llh_negbinomial <- function(bterms, resp = "", mix = "") { if (use_glm_primitive(bterms)) { p <- args_glm_primitive(bterms$dpars$mu, resp = resp) p$shape <- paste0("shape", resp) out <- sdist("neg_binomial_2_log_glm", p$x, p$alpha, p$beta, p$shape) } else { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) lpdf <- stan_llh_simple_lpdf("neg_binomial_2", "log", bterms) out <- sdist(lpdf, p$mu, p$shape) } out } stan_llh_geometric <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) lpdf <- stan_llh_simple_lpdf("neg_binomial_2", "log", bterms) sdist(lpdf, p$mu, "1") } stan_llh_binomial <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) p$trials <- paste0("trials", resp, if (reqn) "[n]") lpdf <- stan_llh_simple_lpdf("binomial", "logit", bterms) sdist(lpdf, p$trials, p$mu) } stan_llh_bernoulli <- function(bterms, resp = "", mix = "") { if (use_glm_primitive(bterms)) { p <- args_glm_primitive(bterms$dpars$mu, resp = resp) out <- sdist("bernoulli_logit_glm", p$x, p$alpha, p$beta) } else { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) lpdf <- stan_llh_simple_lpdf("bernoulli", "logit", bterms) out <- sdist(lpdf, p$mu) } out } stan_llh_discrete_weibull <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) sdist("discrete_weibull", p$mu, p$shape) } stan_llh_com_poisson <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) lpdf <- stan_llh_simple_lpdf("com_poisson", "log", bterms) sdist(lpdf, p$mu, p$shape) } stan_llh_gamma <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist("gamma", p$shape, p$mu) } stan_llh_exponential <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist("exponential", p$mu) } stan_llh_weibull <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist("weibull", p$shape, p$mu) } stan_llh_frechet <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist("frechet", p$nu, p$mu) } stan_llh_gen_extreme_value <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) sdist("gen_extreme_value", p$mu, p$sigma, p$xi) } stan_llh_exgaussian <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist( "exp_mod_normal", paste0(p$mu, " - ", p$beta), p$sigma, paste0("inv(", p$beta, ")") ) } stan_llh_inverse.gaussian <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) p <- stan_llh_dpars(bterms, reqn, resp, mix) lpdf <- paste0("inv_gaussian", if (!reqn) "_vector") n <- str_if(reqn, "[n]") sdist(lpdf, p$mu, p$shape) } stan_llh_wiener <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) p$dec <- paste0("dec", resp, "[n]") sdist("wiener_diffusion", p$dec, p$bs, p$ndt, p$bias, p$mu) } stan_llh_beta <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) || paste0("phi", mix) %in% names(bterms$dpars) p <- stan_llh_dpars(bterms, reqn, resp, mix) sdist("beta", paste0(p$mu, " * ", p$phi), paste0("(1 - ", p$mu, ") * ", p$phi) ) } stan_llh_von_mises <- function(bterms, resp = "", mix = "") { reqn <- stan_llh_adj(bterms) || nzchar(mix) || "kappa" %in% names(bterms$dpars) p <- stan_llh_dpars(bterms, reqn, resp, mix) lpdf <- paste0("von_mises_", str_if(reqn, "real", "vector")) sdist(lpdf, p$mu, p$kappa) } stan_llh_cox <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) p$bhaz <- paste0("bhaz", resp, "[n]") p$cbhaz <- paste0("cbhaz", resp, "[n]") lpdf <- "cox" if (bterms$family$link == "log") { str_add(lpdf) <- "_log" } sdist(lpdf, p$mu, p$bhaz, p$cbhaz) } stan_llh_cumulative <- function(bterms, resp = "", mix = "") { simplify <- bterms$family$link == "logit" && !"disc" %in% names(bterms$dpars) && !has_cs(bterms) && !has_thres_groups(bterms) if (simplify) { prefix <- paste0(resp, if (nzchar(mix)) paste0("_mu", mix)) p <- stan_llh_dpars(bterms, TRUE, resp, mix) p$thres <- paste0("Intercept", prefix) out <- sdist("ordered_logistic", p$mu, p$thres) } else { out <- stan_llh_ordinal(bterms, resp, mix) } out } stan_llh_sratio <- function(bterms, resp = "", mix = "") { stan_llh_ordinal(bterms, resp, mix) } stan_llh_cratio <- function(bterms, resp = "", mix = "") { stan_llh_ordinal(bterms, resp, mix) } stan_llh_acat <- function(bterms, resp = "", mix = "") { stan_llh_ordinal(bterms, resp, mix) } stan_llh_categorical <- function(bterms, resp = "", mix = "") { stopifnot(bterms$family$link == "logit") stopifnot(!isTRUE(nzchar(mix))) # mixture models are not allowed p <- stan_llh_dpars(bterms, TRUE, resp, mix, dpars = "mu") sdist("categorical_logit", p$mu) } stan_llh_multinomial <- function(bterms, resp = "", mix = "") { stopifnot(bterms$family$link == "logit") stopifnot(!isTRUE(nzchar(mix))) # mixture models are not allowed p <- stan_llh_dpars(bterms, TRUE, resp, mix, dpars = "mu") sdist("multinomial_logit", p$mu) } stan_llh_dirichlet <- function(bterms, resp = "", mix = "") { stopifnot(bterms$family$link == "logit") stopifnot(!isTRUE(nzchar(mix))) # mixture models are not allowed mu <- stan_llh_dpars(bterms, TRUE, resp, mix, dpars = "mu")$mu reqn <- glue("phi{mix}") %in% names(bterms$dpars) phi <- stan_llh_dpars(bterms, reqn, resp, mix, dpars = "phi")$phi sdist("dirichlet_logit", mu, phi) } stan_llh_ordinal <- function(bterms, resp = "", mix = "") { prefix <- paste0(str_if(nzchar(mix), paste0("_mu", mix)), resp) p <- stan_llh_dpars(bterms, TRUE, resp, mix) lpdf <- paste0(bterms$family$family, "_", bterms$family$link) if (has_thres_groups(bterms)) { str_add(lpdf) <- "_merged" p$Jthres <- paste0("Jthres", resp, "[n]") p$thres <- "merged_Intercept" } else { p$thres <- "Intercept" } p$thres <- paste0(p$thres, prefix) if (has_cs(bterms)) { if (has_thres_groups(bterms)) { stop2("Cannot use category specific effects ", "in models with multiple thresholds.") } str_add(p$thres) <- paste0(" - mucs", prefix, "[n]'") } sdist(lpdf, p$mu, p$disc, p$thres, p$Jthres) } stan_llh_hurdle_poisson <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) lpdf <- stan_llh_simple_lpdf("hurdle_poisson", "log", bterms) lpdf <- paste0(lpdf, stan_llh_dpar_usc_logit("hu", bterms)) sdist(lpdf, p$mu, p$hu) } stan_llh_hurdle_negbinomial <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) lpdf <- stan_llh_simple_lpdf("hurdle_neg_binomial", "log", bterms) lpdf <- paste0(lpdf, stan_llh_dpar_usc_logit("hu", bterms)) sdist(lpdf, p$mu, p$shape, p$hu) } stan_llh_hurdle_gamma <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) usc_logit <- stan_llh_dpar_usc_logit("hu", bterms) lpdf <- paste0("hurdle_gamma", usc_logit) sdist(lpdf, p$shape, p$mu, p$hu) } stan_llh_hurdle_lognormal <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) usc_logit <- stan_llh_dpar_usc_logit("hu", bterms) lpdf <- paste0("hurdle_lognormal", usc_logit) sdist(lpdf, p$mu, p$sigma, p$hu) } stan_llh_zero_inflated_poisson <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) lpdf <- stan_llh_simple_lpdf("zero_inflated_poisson", "log", bterms) lpdf <- paste0(lpdf, stan_llh_dpar_usc_logit("zi", bterms)) sdist(lpdf, p$mu, p$zi) } stan_llh_zero_inflated_negbinomial <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) lpdf <- stan_llh_simple_lpdf("zero_inflated_neg_binomial", "log", bterms) lpdf <- paste0(lpdf, stan_llh_dpar_usc_logit("zi", bterms)) sdist(lpdf, p$mu, p$shape, p$zi) } stan_llh_zero_inflated_binomial <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) p$trials <- paste0("trials", resp, "[n]") lpdf <- "zero_inflated_binomial" lpdf <- stan_llh_simple_lpdf(lpdf, "logit", bterms, sep = "_b") lpdf <- paste0(lpdf, stan_llh_dpar_usc_logit("zi", bterms)) sdist(lpdf, p$trials, p$mu, p$zi) } stan_llh_zero_inflated_beta <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) usc_logit <- stan_llh_dpar_usc_logit("zi", bterms) lpdf <- paste0("zero_inflated_beta", usc_logit) sdist(lpdf, p$mu, p$phi, p$zi) } stan_llh_zero_one_inflated_beta <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) sdist("zero_one_inflated_beta", p$mu, p$phi, p$zoi, p$coi) } stan_llh_zero_inflated_asym_laplace <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) usc_logit <- stan_llh_dpar_usc_logit("zi", bterms) lpdf <- paste0("zero_inflated_asym_laplace", usc_logit) sdist(lpdf, p$mu, p$sigma, p$quantile, p$zi) } stan_llh_custom <- function(bterms, resp = "", mix = "") { p <- stan_llh_dpars(bterms, TRUE, resp, mix) family <- bterms$family dpars <- paste0(family$dpars, mix) if (is_ordinal(family)) { prefix <- paste0(resp, if (nzchar(mix)) paste0("_mu", mix)) p$thres <- paste0("Intercept", prefix) } sdist(family$name, p[dpars], p$thres, family$vars) } # use Stan GLM primitive functions? # @param bterms a brmsterms object # @return TRUE or FALSE use_glm_primitive <- function(bterms) { stopifnot(is.brmsterms(bterms)) # the model can only have a single predicted parameter # and no additional residual or autocorrelation structure mu <- bterms$dpars[["mu"]] if (!is.btl(mu) || length(bterms$dpars) > 1L || isTRUE(bterms$rescor) || length(bterms$adforms) || is.formula(mu$ac)) { return(FALSE) } # supported families and link functions glm_links <- list( gaussian = "identity", bernoulli = "logit", poisson = "log", negbinomial = "log" ) if (!isTRUE(glm_links[[mu$family$family]] == mu$family$link)) { return(FALSE) } # can only use GLM primitives if solely 'fixed effects' are present special_term_names <- c("sp", "cs", "sm", "gp", "offset") length(all_terms(mu$fe)) && !is_sparse(mu$fe) && !NROW(mu$re) && !any(lengths(mu[special_term_names])) } # standard arguments for primitive Stan GLM functions # @param bterms a btl object # @param resp optional name of the response variable # @return a named list of Stan code snippets args_glm_primitive <- function(bterms, resp = "") { stopifnot(is.btl(bterms)) decomp <- get_decomp(bterms$fe) center_X <- stan_center_X(bterms) sfx_X <- sfx_b <- "" if (decomp == "QR") { sfx_X <- sfx_b <- "Q" } else if (center_X) { sfx_X <- "c" } if (center_X) { intercept <- paste0("Intercept", resp) } else { intercept <- "0" } list( x = paste0("X", sfx_X, resp), alpha = intercept, beta = paste0("b", sfx_b, resp) ) } # prepare distribution and arguments for use in Stan sdist <- function(dist, ..., shift = "") { args <- sargs(...) structure(nlist(dist, args, shift), class = "sdist") } # prepare arguments for Stan likelihood statements sargs <- function(...) { dots <- as.character(c(...)) dots <- dots[nzchar(dots)] paste0(dots, collapse = ", ") } is.sdist <- function(x) { inherits(x, "sdist") } tp <- function(wsp = 2) { wsp <- collapse(rep(" ", wsp)) paste0(wsp, "target += ") } brms/R/make_standata.R0000644000176200001440000001535213611527526014353 0ustar liggesusers#' Data for \pkg{brms} Models #' #' Generate data for \pkg{brms} models to be passed to \pkg{Stan} #' #' @inheritParams brm #' @param check_response Logical; check validity of the response? #' @param only_response Logical; extract data related to the response only? #' @param control A named list currently for internal usage only #' @param ... Other potential arguments #' #' @return A named list of objects containing the required data #' to fit a \pkg{brms} model with \pkg{Stan}. #' #' @author Paul-Christian Buerkner \email{paul.buerkner@@gmail.com} #' #' @examples #' data1 <- make_standata(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = "cumulative") #' names(data1) #' #' data2 <- make_standata(count ~ zAge + zBase * Trt + (1|patient), #' data = epilepsy, family = "poisson") #' names(data2) #' #' @export make_standata <- function(formula, data, family = gaussian(), prior = NULL, data2 = NULL, autocor = NULL, cov_ranef = NULL, sample_prior = c("no", "yes", "only"), stanvars = NULL, knots = NULL, check_response = TRUE, only_response = FALSE, control = list(), ...) { # control arguments: # internal: is make_standata called for internal use in S3 methods? # new: is make_standata is called with new data? # save_order: should the initial order of the data be saved? # old_sdata: list of stan data computed from the orginal data # terms_attr: list of attributes of the original model.frame dots <- list(...) # some input checks if (is.brmsfit(formula)) { stop2("Use 'standata' to extract Stan data from 'brmsfit' objects.") } check_response <- as_one_logical(check_response) only_response <- as_one_logical(only_response) internal <- isTRUE(control$internal) new <- isTRUE(control$new) formula <- validate_formula( formula, data = data, family = family, autocor = autocor ) bterms <- parse_bf(formula) sample_prior <- check_sample_prior(sample_prior) check_prior_content(prior, warn = FALSE) prior <- check_prior_special( prior, bterms = bterms, data = data, check_nlpar_prior = FALSE ) na_action <- if (new) na.pass else na.omit2 data <- validate_data( data, bterms = bterms, na.action = na_action, drop.unused.levels = !new, knots = knots, terms_attr = control$terms_attr ) # order data for use in autocorrelation models data <- order_data(data, bterms = bterms) data2 <- validate_data2( data2, bterms = bterms, get_data2_autocor(formula) ) out <- data_response( bterms, data, check_response = check_response, internal = internal, old_sdata = control$old_sdata ) if (!only_response) { ranef <- tidy_ranef(bterms, data, old_levels = control$old_levels) c(out) <- data_predictor( bterms, data = data, prior = prior, data2 = data2, ranef = ranef, knots = knots, old_sdata = control$old_sdata ) c(out) <- data_gr_global(ranef, cov_ranef = cov_ranef, internal = internal) meef <- tidy_meef(bterms, data, old_levels = control$old_levels) c(out) <- data_Xme(meef, data = data) } out$prior_only <- as.integer(identical(sample_prior, "only")) stanvars <- validate_stanvars(stanvars) if (is.stanvars(stanvars)) { stanvars <- subset_stanvars(stanvars, block = "data") inv_names <- intersect(names(stanvars), names(out)) if (length(inv_names)) { stop2("Cannot overwrite existing variables: ", collapse_comma(inv_names)) } out[names(stanvars)] <- lapply(stanvars, "[[", "sdata") } if (isTRUE(control$save_order)) { attr(out, "old_order") <- attr(data, "old_order") } structure(out, class = "standata") } #' Extract data passed to Stan #' #' Extract all data that was used by Stan to fit the model. #' #' @aliases standata.brmsfit #' #' @param object An object of class \code{brmsfit}. #' @param internal Logical, indicates if the data should be prepared #' for internal use in other post-processing methods. #' @param control A named list currently for internal usage only. #' @param ... More arguments passed to \code{\link{make_standata}}. #' @inheritParams extract_draws #' #' @return A named list containing the data originally passed to Stan. #' #' @export standata.brmsfit <- function(object, newdata = NULL, re_formula = NULL, newdata2 = NULL, new_objects = NULL, incl_autocor = TRUE, internal = FALSE, control = list(), ...) { object <- restructure(object) object <- exclude_terms(object, incl_autocor = incl_autocor) newdata2 <- use_alias(newdata2, new_objects) internal <- as_one_logical(internal) is_old_data <- isTRUE(attr(newdata, "old")) if (is.null(newdata)) { newdata <- object$data is_old_data <- TRUE } if (is.null(newdata2)) { newdata2 <- object$data2 } new_formula <- update_re_terms(object$formula, re_formula) bterms <- parse_bf(new_formula) newdata2 <- validate_data2(newdata2, bterms = bterms) version <- object$version$brms if (is_old_data) { if (version <= "2.8.6" && has_smooths(bterms)) { # the spline penality has changed in 2.8.7 (#646) control$old_sdata <- extract_old_standata( bterms, data = object$data, version = version ) } } else { if (!isTRUE(attr(newdata, "valid"))) { newdata <- validate_newdata( newdata, object, re_formula = re_formula, ... ) } object <- add_new_stanvars(object, newdata2) control$new <- TRUE # ensure correct handling of functions like poly or scale old_terms <- attr(object$data, "terms") terms_attr <- c("variables", "predvars") control$terms_attr <- attributes(old_terms)[terms_attr] control$old_sdata <- extract_old_standata( bterms, data = object$data, version = version ) control$old_levels <- get_levels( tidy_ranef(bterms, object$data), tidy_meef(bterms, object$data) ) } if (internal) { control$internal <- TRUE control$save_order <- TRUE } sample_prior <- attr(object$prior, "sample_prior") knots <- attr(object$data, "knots") make_standata( formula = new_formula, data = newdata, prior = object$prior, data2 = newdata2, cov_ranef = object$cov_ranef, sample_prior = sample_prior, stanvars = object$stanvars, knots = knots, control = control, ... ) } #' @rdname standata.brmsfit #' @export standata <- function(object, ...) { UseMethod("standata") } brms/R/rename_pars.R0000644000176200001440000004607113611527526014055 0ustar liggesusers# rename parameters (and possibly change their dimensions) # within the stanfit object to ensure reasonable parameter names # @param x a brmsfit obejct # @return a brmfit object with adjusted parameter names and dimensions rename_pars <- function(x) { if (!length(x$fit@sim)) { return(x) } bterms <- parse_bf(x$formula) data <- model.frame(x) meef <- tidy_meef(bterms, data) pars <- parnames(x) # find positions of parameters and define new names change <- c( change_effects(bterms, data = data, pars = pars), change_re(x$ranef, pars = pars), change_Xme(meef, pars = pars) ) # perform the actual renaming in x$fit@sim x <- save_old_par_order(x) x <- do_renaming(x, change) x <- compute_quantities(x) x <- reorder_pars(x) x } # helps in renaming parameters after model fitting # @return a list whose elements can be interpreted by do_renaming change_effects <- function(x, ...) { UseMethod("change_effects") } #' @export change_effects.default <- function(x, ...) { NULL } #' @export change_effects.mvbrmsterms <- function(x, pars, ...) { out <- list() for (i in seq_along(x$terms)) { c(out) <- change_effects(x$terms[[i]], pars = pars, ...) } if (x$rescor) { rescor_names <- get_cornames( x$responses, type = "rescor", brackets = FALSE ) lc(out) <- clist(grepl("^rescor\\[", pars), rescor_names) } out } #' @export change_effects.brmsterms <- function(x, ...) { out <- list() for (dp in names(x$dpars)) { c(out) <- change_effects(x$dpars[[dp]], ...) } for (nlp in names(x$nlpars)) { c(out) <- change_effects(x$nlpars[[nlp]], ...) } if (is.formula(x$adforms$mi)) { c(out) <- change_Ymi(x, ...) } out } # helps in renaming parameters of additive predictor terms # @param pars vector of all parameter names #' @export change_effects.btl <- function(x, data, pars, ...) { c(change_fe(x, data, pars), change_sm(x, data, pars), change_cs(x, data, pars), change_sp(x, data, pars), change_gp(x, data, pars), change_thres(x, pars)) } # helps in renaming fixed effects parameters change_fe <- function(bterms, data, pars) { out <- list() px <- check_prefix(bterms) fixef <- colnames(data_fe(bterms, data)$X) if (stan_center_X(bterms)) { fixef <- setdiff(fixef, "Intercept") } if (length(fixef)) { b <- paste0("b", usc(combine_prefix(px))) pos <- grepl(paste0("^", b, "\\["), pars) bnames <- paste0(b, "_", fixef) lc(out) <- clist(pos, bnames) c(out) <- change_prior(b, pars, names = fixef) } out } # helps in renaming special effects parameters change_sp <- function(bterms, data, pars) { out <- list() spef <- tidy_spef(bterms, data) if (!nrow(spef)) return(out) p <- usc(combine_prefix(bterms)) bsp <- paste0("bsp", p) pos <- grepl(paste0("^", bsp, "\\["), pars) newnames <- paste0("bsp", p, "_", spef$coef) lc(out) <- clist(pos, newnames) c(out) <- change_prior(bsp, pars, names = spef$coef) simo_coef <- get_simo_labels(spef) for (i in seq_along(simo_coef)) { simo_old <- paste0("simo", p, "_", i) simo_new <- paste0("simo", p, "_", simo_coef[i]) pos <- grepl(paste0("^", simo_old, "\\["), pars) simo_names <- paste0(simo_new, "[", seq_len(sum(pos)), "]") lc(out) <- clist(pos, simo_names) c(out) <- change_prior( simo_old, pars, new_class = simo_new, is_vector = TRUE ) } out } # helps in renaming category specific effects parameters change_cs <- function(bterms, data, pars) { out <- list() csef <- colnames(data_cs(bterms, data)$Xcs) if (length(csef)) { p <- usc(combine_prefix(bterms)) bcsp <- paste0("bcs", p) ncs <- length(csef) thres <- sum(grepl(paste0("^b", p, "_Intercept\\["), pars)) csenames <- t(outer(csef, paste0("[", 1:thres, "]"), FUN = paste0)) csenames <- paste0(bcsp, "_", csenames) sort_cse <- ulapply(seq_len(ncs), seq, to = thres * ncs, by = ncs) lc(out) <- clist( grepl(paste0("^", bcsp, "\\["), pars), csenames, sort = sort_cse ) c(out) <- change_prior(bcsp, pars, names = csef) } out } # rename threshold parameters in ordinal models change_thres <- function(bterms, pars) { out <- list() # renaming is only required if multiple threshold were estimated if (!has_thres_groups(bterms)) { return(out) } px <- check_prefix(bterms) p <- usc(combine_prefix(px)) int <- paste0("b", p, "_Intercept") groups <- get_thres_groups(bterms) for (i in seq_along(groups)) { thres <- get_thres(bterms, groups[i]) pos <- grepl(glue("^{int}_{i}\\["), pars) int_names <- glue("{int}[{groups[i]},{thres}]") lc(out) <- clist(pos, int_names) } out } # helps in renaming global noise free variables # @param meef data.frame returned by 'tidy_meef' change_Xme <- function(meef, pars) { stopifnot(is.meef_frame(meef)) out <- list() levels <- attr(meef, "levels") groups <- unique(meef$grname) for (i in seq_along(groups)) { g <- groups[i] K <- which(meef$grname %in% g) # rename mean and sd parameters for (par in c("meanme", "sdme")) { hpar <- paste0(par, "_", i) pos <- grepl(paste0("^", hpar, "\\["), pars) hpar_new <- paste0(par, "_", meef$coef[K]) lc(out) <- clist(pos, hpar_new) c(out) <- change_prior(hpar, pars, names = hpar_new) } # rename latent variable parameters for (k in K) { if (any(grepl("^Xme_", pars))) { Xme <- paste0("Xme_", k) pos <- grepl(paste0("^", Xme, "\\["), pars) Xme_new <- paste0("Xme_", meef$coef[k]) if (nzchar(g)) { indices <- gsub("[ \t\r\n]", ".", levels[[g]]) } else { indices <- seq_len(sum(pos)) } fnames <- paste0(Xme_new, "[", indices, "]") lc(out) <- clist(pos, fnames) } } # rename correlation parameters if (meef$cor[K[1]] && length(K) > 1L) { cor_type <- paste0("corme", usc(g)) cor_names <- get_cornames(meef$coef[K], cor_type, brackets = FALSE) cor_regex <- paste0("^corme_", i, "(\\[|$)") cor_pos <- grepl(cor_regex, pars) lc(out) <- clist(cor_pos, cor_names) c(out) <- change_prior( paste0("corme_", i), pars, new_class = paste0("corme", usc(g)) ) } } out } # helps in renaming estimated missing values change_Ymi <- function(bterms, data, pars, ...) { stopifnot(is.brmsterms(bterms)) out <- list() if (is.formula(bterms$adforms$mi)) { resp <- usc(combine_prefix(bterms)) resp_data <- data_response(bterms, data, check_response = FALSE) Ymi <- paste0("Ymi", resp) pos <- grepl(paste0("^", Ymi, "\\["), pars) if (any(pos)) { Jmi <- resp_data$Jmi fnames <- paste0(Ymi, "[", Jmi, "]") lc(out) <- clist(pos, fnames) } } out } # helps in renaming parameters of gaussian processes change_gp <- function(bterms, data, pars) { out <- list() p <- usc(combine_prefix(bterms), "prefix") gpef <- tidy_gpef(bterms, data) for (i in seq_rows(gpef)) { # rename GP hyperparameters sfx1 <- gpef$sfx1[[i]] sfx2 <- as.vector(gpef$sfx2[[i]]) sdgp <- paste0("sdgp", p) sdgp_old <- paste0(sdgp, "_", i) sdgp_pos <- grepl(paste0("^", sdgp_old, "\\["), pars) sdgp_names <- paste0(sdgp, "_", sfx1) lc(out) <- clist(sdgp_pos, sdgp_names) c(out) <- change_prior(sdgp_old, pars, names = sfx1, new_class = sdgp) lscale <- paste0("lscale", p) lscale_old <- paste0(lscale, "_", i) lscale_pos <- grepl(paste0("^", lscale_old, "\\["), pars) lscale_names <- paste0(lscale, "_", sfx2) lc(out) <- clist(lscale_pos, lscale_names) c(out) <- change_prior(lscale_old, pars, names = sfx2, new_class = lscale) zgp <- paste0("zgp", p) zgp_old <- paste0(zgp, "_", i) if (length(sfx1) > 1L) { # categorical 'by' variable for (j in seq_along(sfx1)) { zgp_old_sub <- paste0(zgp_old, "_", j) zgp_pos <- grepl(paste0("^", zgp_old_sub, "\\["), pars) if (any(zgp_pos)) { zgp_new <- paste0(zgp, "_", sfx1[j]) fnames <- paste0(zgp_new, "[", seq_len(sum(zgp_pos)), "]") lc(out) <- clist(zgp_pos, fnames) } } } else { zgp_pos <- grepl(paste0("^", zgp_old, "\\["), pars) if (any(zgp_pos)) { zgp_new <- paste0(zgp, "_", sfx1) fnames <- paste0(zgp_new, "[", seq_len(sum(zgp_pos)), "]") lc(out) <- clist(zgp_pos, fnames) } } } out } # helps in renaming smoothing term parameters change_sm <- function(bterms, data, pars) { out <- list() smef <- tidy_smef(bterms, data) if (NROW(smef)) { p <- usc(combine_prefix(bterms), "prefix") Xs_names <- attr(smef, "Xs_names") if (length(Xs_names)) { bs <- paste0("bs", p) pos <- grepl(paste0("^", bs, "\\["), pars) bsnames <- paste0(bs, "_", Xs_names) lc(out) <- clist(pos, bsnames) c(out) <- change_prior(bs, pars, names = Xs_names) } sds <- paste0("sds", p) sds_names <- paste0(sds, "_", smef$label) s <- paste0("s", p) snames <- paste0(s, "_", smef$label) for (i in seq_rows(smef)) { for (j in seq_len(smef$nbases[i])) { ij <- paste0(i, "_", j) sds_pos <- grepl(paste0("^", sds, "_", ij), pars) lc(out) <- clist(sds_pos, paste0(sds_names[i], "_", j)) spos <- grepl(paste0("^", s, "_", ij), pars) sfnames <- paste0(snames[i], "_", j, "[", seq_len(sum(spos)), "]") lc(out) <- clist(spos, sfnames) new_prior_class <- paste0(sds, "_", smef$label[i], "_", j) c(out) <- change_prior( paste0(sds, "_", ij), pars, new_class = new_prior_class ) } } } out } # helps in renaming group-level parameters # @param ranef: data.frame returned by 'tidy_ranef' change_re <- function(ranef, pars) { out <- list() if (has_rows(ranef)) { for (id in unique(ranef$id)) { r <- subset2(ranef, id = id) g <- r$group[1] rnames <- get_rnames(r) sd_names <- paste0("sd_", g, "__", as.vector(rnames)) sd_pos <- grepl(paste0("^sd_", id, "(\\[|$)"), pars) lc(out) <- clist(sd_pos, sd_names) c(out) <- change_prior( paste0("sd_", id), pars, new_class = paste0("sd_", g), names = paste0("_", as.vector(rnames)) ) # rename group-level correlations if (nrow(r) > 1L && isTRUE(r$cor[1])) { type <- paste0("cor_", g) if (isTRUE(nzchar(r$by[1]))) { cor_names <- named_list(r$bylevels[[1]]) for (j in seq_along(cor_names)) { cor_names[[j]] <- get_cornames( rnames[, j], type, brackets = FALSE ) } cor_names <- unlist(cor_names) } else { cor_names <- get_cornames(rnames, type, brackets = FALSE) } cor_regex <- paste0("^cor_", id, "(_[[:digit:]]+)?(\\[|$)") cor_pos <- grepl(cor_regex, pars) lc(out) <- clist(cor_pos, cor_names) c(out) <- change_prior( paste0("cor_", id), pars, new_class = paste0("cor_", g) ) } } if (any(grepl("^r_", pars))) { c(out) <- change_re_levels(ranef, pars = pars) } tranef <- get_dist_groups(ranef, "student") for (i in seq_rows(tranef)) { df_pos <- grepl(paste0("^df_", tranef$ggn[i], "$"), pars) df_name <- paste0("df_", tranef$group[i]) lc(out) <- clist(df_pos, df_name) } } out } # helps in renaming varying effects parameters per level # @param ranef: data.frame returned by 'tidy_ranef' change_re_levels <- function(ranef, pars) { out <- list() for (i in seq_rows(ranef)) { r <- ranef[i, ] p <- usc(combine_prefix(r)) r_parnames <- paste0("r_", r$id, p, "_", r$cn) r_regex <- paste0("^", r_parnames, "(\\[|$)") r_new_parname <- paste0("r_", r$group, usc(p)) # rstan doesn't like whitespaces in parameter names levels <- gsub("[ \t\r\n]", ".", attr(ranef, "levels")[[r$group]]) index_names <- make_index_names(levels, r$coef, dim = 2) fnames <- paste0(r_new_parname, index_names) lc(out) <- clist(grepl(r_regex, pars), fnames) } out } # helps in renaming prior parameters # @param class the class of the parameters # @param pars names of all parameters in the model # @param names names to replace digits at the end of parameter names # @param new_class optional replacement of the orginal class name # @param is_vector indicate if the prior parameter is a vector change_prior <- function(class, pars, names = NULL, new_class = class, is_vector = FALSE) { out <- list() regex <- paste0("^prior_", class, "(_[[:digit:]]+|$|\\[)") pos_priors <- which(grepl(regex, pars)) if (length(pos_priors)) { priors <- gsub( paste0("^prior_", class), paste0("prior_", new_class), pars[pos_priors] ) if (is_vector) { lc(out) <- clist(pos_priors, priors) } else { digits <- sapply(priors, function(prior) { d <- regmatches(prior, gregexpr("_[[:digit:]]+$", prior))[[1]] if (length(d)) as.numeric(substr(d, 2, nchar(d))) else 0 }) for (i in seq_along(priors)) { if (digits[i] && !is.null(names)) { priors[i] <- gsub("[[:digit:]]+$", names[digits[i]], priors[i]) } if (pars[pos_priors[i]] != priors[i]) { lc(out) <- clist(pos_priors[i], priors[i]) } } } } out } # helper for change_* functions clist <- function(pos, fnames, ...) { structure(nlist(pos, fnames, ...), class = c("clist", "list")) } is.clist <- function(x) { inherits(x, "clist") } # compute index names in square brackets for indexing stan parameters # @param rownames a vector of row names # @param colnames a vector of columns # @param dim the number of output dimensions # @return all index pairs of rows and cols make_index_names <- function(rownames, colnames = NULL, dim = 1) { if (!dim %in% c(1, 2)) stop("dim must be 1 or 2") if (dim == 1) { index_names <- paste0("[", rownames, "]") } else { tmp <- outer(rownames, colnames, FUN = paste, sep = ",") index_names <- paste0("[", tmp, "]") } index_names } # save original order of the parameters in the stanfit object save_old_par_order <- function(x) { x$fit@sim$pars_oi_old <- x$fit@sim$pars_oi x$fit@sim$dims_oi_old <- x$fit@sim$dims_oi x$fit@sim$fnames_oi_old <- x$fit@sim$fnames_oi x } # perform actual renaming of Stan parameters # @param x a brmsfit object # @param change a list of lists each element allowing # to rename certain parameters # @return a brmsfit object with updated parameter names do_renaming <- function(x, change) { .do_renaming <- function(x, change) { stopifnot(is.clist(change)) x$fit@sim$fnames_oi[change$pos] <- change$fnames for (i in seq_len(chains)) { names(x$fit@sim$samples[[i]])[change$pos] <- change$fnames if (!is.null(change$sort)) { x$fit@sim$samples[[i]][change$pos] <- x$fit@sim$samples[[i]][change$pos][change$sort] } } return(x) } chains <- length(x$fit@sim$samples) # temporary fix for issue #387 until fixed in rstan for (i in seq_len(chains)) { x$fit@sim$samples[[i]]$lp__.1 <- NULL } for (i in seq_along(change)) { x <- .do_renaming(x, change[[i]]) } x } # order parameter samples after parameter class # @param x brmsfit object reorder_pars <- function(x) { all_classes <- unique(c( "b", "bs", "bsp", "bcs", "ar", "ma", "lagsar", "errorsar", "car", "sdcar", "cosy", "sd", "cor", "df", "sds", "sdgp", "lscale", valid_dpars(x), "Intercept", "tmp", "rescor", "delta", "lasso", "simo", "r", "s", "zgp", "rcar", "sbhaz", "Ymi", "Yl", "meanme", "sdme", "corme", "Xme", "prior", "lp" )) # reorder parameter classes class <- get_matches("^[^[:digit:]_]+", x$fit@sim$pars_oi) new_order <- order( factor(class, levels = all_classes), !grepl("_Intercept(_[[:digit:]]+)?$", x$fit@sim$pars_oi) ) x$fit@sim$dims_oi <- x$fit@sim$dims_oi[new_order] x$fit@sim$pars_oi <- names(x$fit@sim$dims_oi) # reorder single parameter names nsubpars <- ulapply(x$fit@sim$dims_oi, prod) has_subpars <- nsubpars > 0 new_order <- new_order[has_subpars] nsubpars <- nsubpars[has_subpars] num <- lapply(seq_along(new_order), function(x) as.numeric(paste0(x, ".", sprintf("%010d", seq_len(nsubpars[x])))) ) new_order <- order(unlist(num[order(new_order)])) x$fit@sim$fnames_oi <- x$fit@sim$fnames_oi[new_order] chains <- length(x$fit@sim$samples) for (i in seq_len(chains)) { # attributes of samples must be kept x$fit@sim$samples[[i]] <- subset_keep_attr(x$fit@sim$samples[[i]], new_order) } x } # wrapper function to compute and store quantities in the stanfit # object which were not computed / stored by Stan itself # @param x a brmsfit object # @return a brmsfit object compute_quantities <- function(x) { stopifnot(is.brmsfit(x)) x <- compute_xi(x) x } # helper function to compute parameter xi, which is currently # defined in the Stan model block and thus not being stored # @param x a brmsfit object # @return a brmsfit object compute_xi <- function(x, ...) { UseMethod("compute_xi") } #' @export compute_xi.brmsfit <- function(x, ...) { if (!any(grepl("^tmp_xi(_|$)", parnames(x)))) { return(x) } draws <- try(extract_draws(x)) if (is(draws, "try-error")) { warning2("Trying to compute 'xi' was unsuccessful. ", "Some S3 methods may not work as expected.") return(x) } compute_xi(draws, fit = x, ...) } #' @export compute_xi.mvbrmsdraws <- function(x, fit, ...) { stopifnot(is.brmsfit(fit)) for (resp in names(x$resps)) { fit <- compute_xi(x$resps[[resp]], fit = fit, ...) } fit } #' @export compute_xi.brmsdraws <- function(x, fit, ...) { stopifnot(is.brmsfit(fit)) resp <- usc(x$resp) tmp_xi_name <- paste0("tmp_xi", resp) if (!tmp_xi_name %in% parnames(fit)) { return(fit) } mu <- get_dpar(x, "mu") sigma <- get_dpar(x, "sigma") y <- matrix(x$data$Y, dim(mu)[1], dim(mu)[2], byrow = TRUE) bs <- -1 / matrixStats::rowRanges((y - mu) / sigma) bs <- matrixStats::rowRanges(bs) tmp_xi <- as.vector(as.matrix(fit, pars = tmp_xi_name)) xi <- inv_logit(tmp_xi) * (bs[, 2] - bs[, 1]) + bs[, 1] # write xi into stanfit object xi_name <- paste0("xi", resp) samp_chain <- length(xi) / fit$fit@sim$chains for (i in seq_len(fit$fit@sim$chains)) { xi_part <- xi[((i - 1) * samp_chain + 1):(i * samp_chain)] # add warmup samples not used anyway xi_part <- c(rep(0, fit$fit@sim$warmup2[1]), xi_part) fit$fit@sim$samples[[i]][[xi_name]] <- xi_part } fit$fit@sim$pars_oi <- c(fit$fit@sim$pars_oi, xi_name) fit$fit@sim$dims_oi[[xi_name]] <- numeric(0) fit$fit@sim$fnames_oi <- c(fit$fit@sim$fnames_oi, xi_name) fit$fit@sim$n_flatnames <- fit$fit@sim$n_flatnames + 1 fit } brms/R/stan-prior.R0000644000176200001440000005064513612535207013655 0ustar liggesusers# unless otherwise specified, functions return a single character # string defining the likelihood of the model in Stan language # Define priors for parameters in Stan language # @param prior an object of class 'brmsprior' # @param class the parameter class # @param coef the coefficients of this class # @param group the name of a grouping factor # @param type Stan type used in the definition of the parameter # if type is empty the parameter is not initialized inside 'stan_prior' # @param dim stan array dimension to be specified after the parameter name # cannot be merged with 'suffix' as the latter should apply to # individual coefficients while 'dim' should not # TODO: decide whether to support arrays for parameters at all # an alternative would be to specify elements directly as parameters # @param coef_type Stan type used in the definition of individual parameter # coefficients; only relevant when mixing estimated and fixed coefficients # @param prefix a prefix to put at the parameter class # @param suffix a suffix to put at the parameter class # @param broadcast Stan type to which the prior should be broadcasted # in order to handle vectorized prior statements # supported values are 'vector' or 'matrix' # @param comment character string containing a comment for the parameter # @param px list or data.frame after which to subset 'prior' # @return a named list of character strings in Stan language stan_prior <- function(prior, class, coef = NULL, group = NULL, type = "real", dim = "", coef_type = "real", prefix = "", suffix = "", broadcast = "vector", comment = "", px = list()) { prior_only <- isTRUE(attr(prior, "sample_prior") == "only") prior <- subset2( prior, class = class, coef = c(coef, ""), group = c(group, ""), ls = px ) # special priors cannot be passed literally to Stan is_special_prior <- is_special_prior(prior$prior) if (any(is_special_prior)) { special_prior <- prior$prior[is_special_prior] stop2("Prior ", collapse_comma(special_prior), " is used in an invalid ", "context. See ?set_prior for details on how to use special priors.") } px <- as.data.frame(px, stringsAsFactors = FALSE) upx <- unique(px) if (nrow(upx) > 1L) { # TODO: find a better solution to handle this case # can only happen for SD parameters of the same ID base_prior <- rep(NA, nrow(upx)) for (i in seq_rows(upx)) { sub_upx <- lapply(upx[i, ], function(x) c(x, "")) sub_prior <- subset2(prior, ls = sub_upx) base_prior[i] <- stan_base_prior(sub_prior) } if (length(unique(base_prior)) > 1L) { # define prior for single coefficients manually # as there is not single base_prior anymore prior_of_coefs <- prior[nzchar(prior$coef), vars_prefix()] take <- match_rows(prior_of_coefs, upx) prior[nzchar(prior$coef), "prior"] <- base_prior[take] } base_prior <- base_prior[1] bound <- "" } else { base_prior <- stan_base_prior(prior) bound <- prior[!nzchar(prior$coef), "bound"] } # generate stan prior statements out <- list() par <- paste0(prefix, class, suffix) has_constant_priors <- FALSE has_coef_prior <- any(with(prior, nzchar(coef) & nzchar(prior))) if (has_coef_prior || nzchar(dim) && length(coef)) { # priors on individual coefficients are also individually set # priors are always set on individual coefficients for arrays index_two_dims <- is.matrix(coef) coef <- as.matrix(coef) prior <- subset2(prior, coef = coef) estimated_coef_indices <- list() used_base_prior <- FALSE for (i in seq_rows(coef)) { for (j in seq_cols(coef)) { index <- i if (index_two_dims) { c(index) <- j } prior_ij <- subset2(prior, coef = coef[i, j]) if (NROW(px) > 1L) { # disambiguate priors of coefficients with the same name # coming from different model components stopifnot(NROW(px) == NROW(coef)) prior_ij <- subset2(prior_ij, ls = px[i, ]) } # zero rows can happen if only global priors present stopifnot(nrow(prior_ij) <= 1L) coef_prior <- prior_ij$prior if (!isTRUE(nzchar(coef_prior))) { used_base_prior <- TRUE coef_prior <- base_prior } if (nzchar(coef_prior)) { # implies a proper prior or constant par_ij <- paste0(par, collapse("[", index, "]")) if (stan_is_constant_prior(coef_prior)) { coef_prior <- stan_constant_prior( coef_prior, par_ij, broadcast = broadcast ) str_add(out$tpar_prior) <- paste0(coef_prior, ";\n") } else { c(estimated_coef_indices) <- list(index) coef_prior <- stan_target_prior( coef_prior, par_ij, broadcast = broadcast, bound = bound, resp = px$resp[1] ) str_add(out$prior) <- paste0(tp(), coef_prior, ";\n") } } } } has_estimated_priors <- isTRUE(nzchar(out$prior)) has_constant_priors <- isTRUE(nzchar(out$tpar_prior)) if (has_estimated_priors && has_constant_priors) { # need to mix definition in the parameters and transformed parameters block if (!nzchar(coef_type)) { stop2("Can either estimate or fix all values of parameter '", par, "'.") } for (i in seq_along(estimated_coef_indices)) { index <- estimated_coef_indices[[i]] iu <- paste0(index, collapse = "_") str_add(out$par) <- glue( " {coef_type} par_{par}_{iu};\n" ) ib <- collapse("[", index, "]") str_add(out$tpar_prior) <- cglue( " {par}{ib} = par_{par}_{iu};\n" ) } } } else if (nzchar(base_prior)) { # only a global prior is present and will be broadcasted ncoef <- length(coef) has_constant_priors <- stan_is_constant_prior(base_prior) if (has_constant_priors) { constant_base_prior <- stan_constant_prior( base_prior, par = par, ncoef = ncoef, broadcast = broadcast ) str_add(out$tpar_prior) <- paste0(constant_base_prior, ";\n") } else { target_base_prior <- stan_target_prior( base_prior, par = par, ncoef = ncoef, bound = bound, broadcast = broadcast, resp = px$resp[1] ) str_add(out$prior) <- paste0(tp(), target_base_prior, ";\n") } } if (nzchar(type)) { # only define the parameter here if type is non-empty comment <- stan_comment(comment) par_definition <- glue(" {type} {par}{dim};{comment}\n") if (has_constant_priors) { # parameter must be defined in the transformed parameters block str_add(out$tpar_def) <- par_definition } else { # parameter can be defined in the parameters block str_add(out$par) <- par_definition } } else { if (has_constant_priors) { stop2("Cannot fix parameter '", par, "' in this model.") } } has_improper_prior <- !is.null(out$par) && is.null(out$prior) if (prior_only && has_improper_prior) { stop2("Sampling from priors is not possible as ", "some parameters have no proper priors. ", "Error occured for parameter '", par, "'.") } out } # get the base prior for all coefficients # this is the lowest level non-coefficient prior # @param prior a brmsprior object # @return a character string defining the base prior stan_base_prior <- function(prior) { stopifnot(length(unique(prior$class)) <= 1) take <- with(prior, !nzchar(coef) & nzchar(prior)) prior <- prior[take, ] if (!NROW(prior)) { return("") } vars <- c("group", "nlpar", "dpar", "resp", "class") for (v in vars) { take <- nzchar(prior[[v]]) if (any(take)) { prior <- prior[take, ] } } stopifnot(NROW(prior) == 1) prior$prior } # Stan prior in target += notation # @param prior character string defining the prior # @param par name of the parameter on which to set the prior # @param ncoef number of coefficients in the parameter # @param bound bounds of the parameter in Stan language # @param broadcast Stan type to which the prior should be broadcasted # @param name of the response variable # @return a character string defining the prior in Stan language stan_target_prior <- function(prior, par, ncoef = 0, broadcast = "vector", bound = "", resp = "") { prior <- gsub("[[:space:]]+\\(", "(", prior) prior_name <- get_matches( "^[^\\(]+(?=\\()", prior, perl = TRUE, simplify = FALSE ) for (i in seq_along(prior_name)) { if (length(prior_name[[i]]) != 1L) { stop2("The prior '", prior[i], "' is invalid.") } } prior_name <- unlist(prior_name) prior_args <- rep(NA, length(prior)) for (i in seq_along(prior)) { prior_args[i] <- sub(glue("^{prior_name[i]}\\("), "", prior[i]) } if (broadcast == "matrix" && ncoef > 0) { # apply a scalar prior to all elements of a matrix par <- glue("to_vector({par})") } out <- glue("{prior_name}_lpdf({par} | {prior_args}") par_class <- unique(get_matches("^[^_]+", par)) par_bound <- par_bounds(par_class, bound, resp = resp) prior_bound <- prior_bounds(prior_name) trunc_lb <- is.character(par_bound$lb) || par_bound$lb > prior_bound$lb trunc_ub <- is.character(par_bound$ub) || par_bound$ub < prior_bound$ub if (trunc_lb || trunc_ub) { wsp <- wsp(nsp = 4) # scalar parameters are of length 1 but have no coefficients ncoef <- max(1, ncoef) if (trunc_lb && !trunc_ub) { str_add(out) <- glue( "\n{wsp}- {ncoef} * {prior_name}_lccdf({par_bound$lb} | {prior_args}" ) } else if (!trunc_lb && trunc_ub) { str_add(out) <- glue( "\n{wsp}- {ncoef} * {prior_name}_lcdf({par_bound$ub} | {prior_args}" ) } else if (trunc_lb && trunc_ub) { str_add(out) <- glue( "\n{wsp}- {ncoef} * log_diff_exp(", "{prior_name}_lcdf({par_bound$ub} | {prior_args}, ", "{prior_name}_lcdf({par_bound$lb} | {prior_args})" ) } } out } # fix parameters to constants in Stan language # @param prior character string defining the prior # @param par name of the parameter on which to set the prior # @param ncoef number of coefficients in the parameter # @param broadcast Stan type to which the prior should be broadcasted # @return a character string defining the prior in Stan language stan_constant_prior <- function(prior, par, ncoef = 0, broadcast = "vector") { stopifnot(grepl("^constant\\(", prior)) prior_args <- gsub("(^constant\\()|(\\)$)", "", prior) if (broadcast == "vector") { if (ncoef > 0) { # broadcast the scalar prior on the whole parameter vector prior_args <- glue("rep_vector({prior_args}, rows({par}))") } # no action required for individual coefficients of vectors } else if (broadcast == "matrix") { if (ncoef > 0) { # broadcast the scalar prior on the whole parameter matrix prior_args <- glue("rep_matrix({prior_args}, rows({par}), cols({par}))") } else { # single coefficient is a row in the parameter matrix prior_args <- glue("rep_row_vector({prior_args}, cols({par}))") } } glue(" {par} = {prior_args}") } # Stan code for global parameters of special priors # currently implemented are horseshoe and lasso stan_special_prior_global <- function(bterms, data, prior, ...) { out <- list() tp <- tp() px <- check_prefix(bterms) p <- usc(combine_prefix(px)) prefix <- combine_prefix(px, keep_mu = TRUE) special <- attributes(prior)$special[[prefix]] if (!is.null(special[["hs_df"]])) { str_add(out$data) <- glue( " // data for the horseshoe prior\n", " real hs_df{p}; // local degrees of freedom\n", " real hs_df_global{p}; // global degrees of freedom\n", " real hs_df_slab{p}; // slab degrees of freedom\n", " real hs_scale_global{p}; // global prior scale\n", " real hs_scale_slab{p}; // slab prior scale\n" ) str_add(out$par) <- glue( " // horseshoe shrinkage parameters\n", " real hs_global{p}[2]; // global shrinkage parameters\n", " real hs_c2{p}; // slab regularization parameter\n" ) global_args <- glue("0.5 * hs_df_global{p}") global_args <- sargs(global_args, global_args) c2_args <- glue("0.5 * hs_df_slab{p}") c2_args <- sargs(c2_args, c2_args) str_add(out$prior) <- glue( "{tp}normal_lpdf(hs_global{p}[1] | 0, 1)\n", " - 1 * log(0.5);\n", "{tp}inv_gamma_lpdf(hs_global{p}[2] | {global_args});\n", "{tp}inv_gamma_lpdf(hs_c2{p} | {c2_args});\n" ) } if (!is.null(special[["lasso_df"]])) { str_add(out$data) <- glue( " // data for the lasso prior\n", " real lasso_df{p}; // prior degrees of freedom\n", " real lasso_scale{p}; // prior scale\n" ) str_add(out$par) <- glue( " // lasso shrinkage parameter\n", " real lasso_inv_lambda{p};\n" ) str_add(out$prior) <- glue( "{tp}chi_square_lpdf(lasso_inv_lambda{p} | lasso_df{p});\n" ) } out } # Stan code for local parameters of special priors # currently implemented are 'horseshoe' # @param class name of the parameter class # @param prior a brmsprior object # @param ncoef number of coefficients in the parameter # @param px named list to subset 'prior' # @param center_X is the design matrix centered? # @param suffix optional suffix of the 'b' coefficient vector stan_special_prior_local <- function(prior, class, ncoef, px, center_X = FALSE, suffix = "") { class <- as_one_character(class) stopifnot(class %in% c("b", "bsp")) out <- list() p <- usc(combine_prefix(px)) sp <- paste0(sub("^b", "", class), p) ct <- str_if(center_X, "c") tp <- tp() prefix <- combine_prefix(px, keep_mu = TRUE) special <- attributes(prior)$special[[prefix]] if (!is.null(special[["hs_df"]])) { str_add(out$par) <- glue( " // local parameters for horseshoe prior\n", " vector[K{ct}{sp}] zb{sp};\n", " vector[K{ct}{sp}] hs_local{sp}[2];\n" ) hs_scale_global <- glue("hs_scale_global{p}") if (isTRUE(special[["hs_autoscale"]])) { str_add(hs_scale_global) <- glue(" * sigma{usc(px$resp)}") } hs_args <- sargs( glue("zb{sp}"), glue("hs_local{sp}"), glue("hs_global{p}"), hs_scale_global, glue("hs_scale_slab{p}^2 * hs_c2{p}") ) str_add(out$tpar_prior) <- glue( " // compute actual regression coefficients\n", " b{sp}{suffix} = horseshoe({hs_args});\n" ) local_args <- glue("0.5 * hs_df{p}") local_args <- sargs(local_args, local_args) str_add(out$prior) <- glue( "{tp}normal_lpdf(zb{sp} | 0, 1);\n", "{tp}normal_lpdf(hs_local{sp}[1] | 0, 1)\n", " - {ncoef} * log(0.5);\n", "{tp}inv_gamma_lpdf(hs_local{sp}[2] | {local_args});\n" ) } out } # combine unchecked priors for use in Stan # @param prior a brmsprior object # @return a single character string in Stan language stan_unchecked_prior <- function(prior) { stopifnot(is.brmsprior(prior)) if (all(nzchar(prior$class))) { return("") } prior <- subset2(prior, class = "") collapse(" ", prior$prior, ";\n") } # Stan code to sample separately from priors # @param sample_prior take samples from priors? # @param prior character string taken from stan_prior # @param par_declars the parameters block of the Stan code # required to extract boundaries # @param gen_quantities Stan code from the generated quantities block # @param prior_special a list of values pertaining to special priors # such as horseshoe or lasso stan_rngprior <- function(sample_prior, prior, par_declars, gen_quantities, prior_special) { if (!sample_prior %in% "yes") { return(list()) } prior <- strsplit(gsub(" |\\n", "", prior), ";")[[1]] # D will contain all relevant information about the priors D <- data.frame(prior = prior[nzchar(prior)]) pars_regex <- "(?<=(_lpdf\\())[^|]+" D$par <- get_matches(pars_regex, D$prior, perl = TRUE, first = TRUE) # 'to_vector' should be removed from the parameter names has_tv <- grepl("^to_vector\\(", D$par) tv_regex <- "(^to_vector\\()|(\\)(?=((\\[[[:digit:]]+\\])?)$))" D$par[has_tv] <- gsub(tv_regex, "", D$par[has_tv], perl = TRUE) # do not sample from some auxiliary parameters excl_regex <- c("z", "zs", "zb", "zgp", "Xn", "Y", "hs", "tmp") excl_regex <- paste0("(", excl_regex, ")", collapse = "|") excl_regex <- paste0("^(", excl_regex, ")(_|$)") D <- D[!grepl(excl_regex, D$par), ] if (!NROW(D)) return(list()) # rename parameters containing indices has_ind <- grepl("\\[[[:digit:]]+\\]", D$par) D$par[has_ind] <- ulapply(D$par[has_ind], function(par) { ind_regex <- "(?<=\\[)[[:digit:]]+(?=\\])" ind <- get_matches(ind_regex, par, perl = TRUE) gsub("\\[[[:digit:]]+\\]", paste0("_", ind), par) }) # cannot handle priors on variable transformations D <- D[D$par %in% stan_all_vars(D$par), ] if (!NROW(D)) return(list()) class_old <- c("^L_", "^Lrescor") class_new <- c("cor_", "rescor") D$par <- rename(D$par, class_old, class_new, fixed = FALSE) dis_regex <- "(?<=target\\+=)[^\\(]+(?=_lpdf\\()" D$dist <- get_matches(dis_regex, D$prior, perl = TRUE, first = TRUE) D$dist <- sub("corr_cholesky$", "corr", D$dist) args_regex <- "(?<=\\|)[^$\\|]+(?=\\)($|-))" D$args <- get_matches(args_regex, D$prior, perl = TRUE, first = TRUE) # extract information from the initial parameter definition par_declars <- unlist(strsplit(par_declars, "\n", fixed = TRUE)) par_declars <- gsub("^[[:blank:]]*", "", par_declars) par_declars <- par_declars[!grepl("^//", par_declars)] all_pars_regex <- "(?<= )[^[:blank:]]+(?=;)" all_pars <- get_matches(all_pars_regex, par_declars, perl = TRUE) all_pars <- rename(all_pars, class_old, class_new, fixed = FALSE) all_bounds <- get_matches("<.+>", par_declars, first = TRUE) all_types <- get_matches("^[^[:blank:]]+", par_declars) all_dims <- get_matches( "(?<=\\[)[^\\]]*", par_declars, first = TRUE, perl = TRUE ) # define parameter types and boundaries D$dim <- D$bounds <- "" D$type <- "real" for (i in seq_along(all_pars)) { k <- which(grepl(paste0("^", all_pars[i]), D$par)) D$dim[k] <- all_dims[i] D$bounds[k] <- all_bounds[i] if (grepl("^((simo_)|(theta))", all_pars[i])) { D$type[k] <- all_types[i] } } # exclude priors which depend on other priors # TODO: enable sampling from these priors as well found_vars <- lapply(D$args, find_vars, dot = FALSE, brackets = FALSE) contains_other_pars <- ulapply(found_vars, function(x) any(x %in% all_pars)) D <- D[!contains_other_pars, ] if (!NROW(D)) return(list()) out <- list() # sample priors in the generated quantities block D$lkj <- grepl("^lkj_corr$", D$dist) D$args <- paste0(ifelse(D$lkj, paste0(D$dim, ","), ""), D$args) D$lkj_index <- ifelse(D$lkj, "[1, 2]", "") D$prior_par <- glue("prior_{D$par}") str_add(out$gen_def) <- " // additionally draw samples from priors\n" str_add(out$gen_def) <- cglue( " {D$type} {D$prior_par} = {D$dist}_rng({D$args}){D$lkj_index};\n" ) # sample from truncated priors using rejection sampling D$lb <- stan_extract_bounds(D$bounds, bound = "lower") D$ub <- stan_extract_bounds(D$bounds, bound = "upper") Ibounds <- which(nzchar(D$bounds)) if (length(Ibounds)) { str_add(out$gen_comp) <- " // use rejection sampling for truncated priors\n" for (i in Ibounds) { wl <- if (nzchar(D$lb[i])) glue("{D$prior_par[i]} < {D$lb[i]}") wu <- if (nzchar(D$ub[i])) glue("{D$prior_par[i]} > {D$ub[i]}") prior_while <- paste0(c(wl, wu), collapse = " || ") str_add(out$gen_comp) <- glue( " while ({prior_while}) {{\n", " {D$prior_par[i]} = {D$dist[i]}_rng({D$args[i]}){D$lkj_index[i]};\n", " }}\n" ) } } out } # check if any constant priors are present # @param prior a vector of character strings stan_is_constant_prior <- function(prior) { grepl("^constant\\(", prior) } # indicate if the horseshoe prior is used in the predictor term stan_use_horseshoe <- function(bterms, prior) { prefix <- combine_prefix(bterms, keep_mu = TRUE) special <- attr(prior, "special")[[prefix]] !is.null(special[["hs_df"]]) } # extract Stan boundaries expression from a string stan_extract_bounds <- function(x, bound = c("lower", "upper")) { bound <- match.arg(bound) x <- rm_wsp(x) regex <- glue("(?<={bound}=)[^,>]*") get_matches(regex, x, perl = TRUE, first = TRUE) } brms/R/brm_multiple.R0000644000176200001440000001653513611527526014256 0ustar liggesusers#' Run the same \pkg{brms} model on multiple datasets #' #' Run the same \pkg{brms} model on multiple datasets and then combine the #' results into one fitted model object. This is useful in particular for #' multiple missing value imputation, where the same model is fitted on multiple #' imputed data sets. Models can be run in parallel using the \pkg{future} #' package. #' #' @inheritParams brm #' @param data A list of data.frames each of which will be used to fit a #' separate model. Alternatively, a \code{mids} object from the \pkg{mice} #' package. #' @param combine Logical; Indicates if the fitted models should be combined #' into a single fitted model object via \code{\link{combine_models}}. #' Defaults to \code{TRUE}. #' @param fit An instance of S3 class \code{brmsfit_multiple} derived from a #' previous fit; defaults to \code{NA}. If \code{fit} is of class #' \code{brmsfit_multiple}, the compiled model associated with the fitted #' result is re-used and all arguments modifying the model code or data are #' ignored. It is not recommended to use this argument directly, but to call #' the \code{\link[brms:update.brmsfit_multiple]{update}} method, instead. #' @param ... Further arguments passed to \code{\link{brm}}. #' #' @details The combined model may issue false positive convergence warnings, as #' the MCMC chains corresponding to different datasets may not necessarily #' overlap, even if each of the original models did converge. To find out #' whether each of the original models converged, investigate #' \code{fit$rhats}, where \code{fit} denotes the output of #' \code{brm_multiple}. #' #' @return If \code{combine = TRUE} a \code{brmsfit_multiple} object, which #' inherits from class \code{brmsfit} and behaves essentially the same. If #' \code{combine = FALSE} a list of \code{brmsfit} objects. #' #' @author Paul-Christian Buerkner \email{paul.buerkner@@gmail.com} #' #' @examples #' \dontrun{ #' library(mice) #' imp <- mice(nhanes2) #' #' # fit the model using mice and lm #' fit_imp1 <- with(lm(bmi ~ age + hyp + chl), data = imp) #' summary(pool(fit_imp1)) #' #' # fit the model using brms #' fit_imp2 <- brm_multiple(bmi ~ age + hyp + chl, data = imp, chains = 1) #' summary(fit_imp2) #' plot(fit_imp2, pars = "^b_") #' # investigate convergence of the original models #' fit_imp2$rhats #' #' # use the future package for parallelization #' library(future) #' plan(multiprocess) #' fit_imp3 <- brm_multiple(bmi~age+hyp+chl, data = imp, chains = 1) #' summary(fit_imp3) #' } #' #' @export brm_multiple <- function(formula, data, family = gaussian(), prior = NULL, data2 = NULL, autocor = NULL, cov_ranef = NULL, sample_prior = c("no", "yes", "only"), sparse = NULL, knots = NULL, stanvars = NULL, stan_funs = NULL, combine = TRUE, fit = NA, seed = NA, file = NULL, ...) { combine <- as_one_logical(combine) if (!is.null(file)) { # optionally load saved model object if (!combine) { stop2("Cannot use 'file' if 'combine' is FALSE.") } fits <- read_brmsfit(file) if (!is.null(fits)) { return(fits) } } data.name <- substitute_name(data) if (inherits(data, "mids")) { require_package("mice", version = "3.0.0") data <- lapply(seq_len(data$m), mice::complete, data = data) } else if (!is_data_list(data)) { stop2("'data' must be a list of data.frames.") } if (is.brmsfit(fit)) { # avoid complications when updating the model class(fit) <- setdiff(class(fit), "brmsfit_multiple") } else { args <- nlist( formula, data = data[[1]], family, prior, data2, autocor, cov_ranef, sample_prior, sparse, knots, stanvars, stan_funs, seed, ... ) args$chains <- 0 message("Compiling the C++ model") fit <- suppressMessages(do_call(brm, args)) } dots <- list(...) # allow compiling the model without sampling (#671) if (isTRUE(dots$chains == 0) || isTRUE(dots$iter == 0)) { class(fit) <- c("brmsfit_multiple", class(fit)) return(fit) } fits <- futures <- rhats <- vector("list", length(data)) for (i in seq_along(data)) { futures[[i]] <- future::future( update(fit, newdata = data[[i]], recompile = FALSE, ...), packages = "brms" ) } for (i in seq_along(data)) { message("Fitting imputed model ", i) fits[[i]] <- future::value(futures[[i]]) rhats[[i]] <- data.frame(as.list(rhat(fits[[i]]))) if (any(rhats[[i]] > 1.1, na.rm = TRUE)) { warning2("Imputed model ", i, " did not converge.") } } if (combine) { fits <- combine_models(mlist = fits, check_data = FALSE) fits$data.name <- data.name fits$rhats <- do_call(rbind, rhats) class(fits) <- c("brmsfit_multiple", class(fits)) } if (!is.null(file)) { write_brmsfit(fits, file) } fits } #' Combine Models fitted with \pkg{brms} #' #' Combine multiple \code{brmsfit} objects, which fitted the same model. #' This is usefuly for instance when having manually run models in parallel. #' #' @param ... One or more \code{brmsfit} objects. #' @param mlist Optional list of one or more \code{brmsfit} objects. #' @param check_data Logical; indicates if the data should be checked #' for being the same across models (defaults to \code{TRUE}). #' Setting it to \code{FALSE} may be useful for instance #' when combining models fitted on multiple imputed data sets. #' #' @details This function just takes the first model and replaces #' its \code{stanfit} object (slot \code{fit}) by the combined #' \code{stanfit} objects of all models. #' #' @return A \code{brmsfit} object. #' #' @export combine_models <- function(..., mlist = NULL, check_data = TRUE) { models <- c(list(...), mlist) check_data <- as_one_logical(check_data) if (!length(models)) { stop2("No models supplied to 'combine_models'.") } for (i in seq_along(models)) { if (!is.brmsfit(models[[i]])) { stop2("Model ", i, " is no 'brmsfit' object.") } models[[i]] <- restructure(models[[i]]) } ref_formula <- formula(models[[1]]) ref_pars <- parnames(models[[1]]) ref_mf <- model.frame(models[[1]]) for (i in seq_along(models)[-1]) { if (!is_equal(formula(models[[i]]), ref_formula)) { stop2("Models 1 and ", i, " have different formulas.") } if (!is_equal(parnames(models[[i]]), ref_pars)) { stop2("Models 1 and ", i, " have different parameters.") } if (check_data && !is_equal(model.frame(models[[i]]), ref_mf)) { stop2( "Models 1 and ", i, " have different data. ", "Set 'check_data' to FALSE to turn off checking of the data." ) } } sflist <- lapply(models, "[[", "fit") models[[1]]$fit <- rstan::sflist2stanfit(sflist) models[[1]] } # validity check for data input of 'brm_multiple' is_data_list <- function(x) { is.list(x) && is.vector(x) } warn_brmsfit_multiple <- function(x, newdata = NULL) { if (is.brmsfit_multiple(x) && is.null(newdata)) { warning2( "Using only the first imputed data set. Please interpret the results ", "with caution until a more principled approach has been implemented." ) } invisible(x) } brms/R/sysdata.rda0000644000176200001440000662553713612312340013601 0ustar liggesusersBZh91AY&SYӰ u^yEJf{\U ϻ==j3j#KO^E1)do||s ]m8+}O]gP wA].D;Zf-0q7ҔkQ;uz*{/rWբڨhzE(=@wm(4::zH SX@ZC^4@h:(tR (< aP:}@Pzz=ϺQ*J(V(s262w B%MJqt%:Y61EZ BE(@`UQ a ɓEh$BR)C -+ƀH(RP@e=5UT(N$R)$ۜѢEU)N@%BnFT-ehuLU(n%lJKsj BvQB\dll[;embETkZl okoXzWH;lM%[fmh$:` * U%mBR*QD@$;05_ffU{w,o]=-8ZcHd(ԯh$*Fm+|4 @ `M2biLLA` `PI"4 iLb!#@h24 @ <M L#@Lh&LH &#Sz=Lbh%=O mMiF4OO 'y&&Ѣx@='mIO5='ڛO4I&(J~ yM4zM zѓ@z4M144 $@D!`z444SޚLɉ2izTF(zfJy6 Qf)SSzCjy01P6!@@@ LS#i0)ɤO*{=&DW%^ &-fS\XfXG~FeC&-NIL@PdF=b(I$A@*=Tf5Nf( aȆBLȴ$R<$>ӗ.nH˺޼$ΙƶC Cc&$ۉ ( c`9ِM7a].ÎP)utxAˆ=!6s(QUy#UvÓs̭cnYfD^]ݷ7u痞u~Qu$6(\+SvBͭ6֏W5fh!:kE@[pLnRҊŢB(`0nKE! *UZA$o]܆4X&"14YI^3{1%q kZTBʢtH=N[Δi>X&?q<q$O~]BPu/5$@]N )TP!uB?'}M@0˟ > =(i@|7._ghP.߉:NBA(o6Nr;9#1dRp̚a/N P^>^pp7tkc* @e;^뎯jMDT|~=[LC2nw4dG{1zf)T7wl)e&LR.p|f" b;$YLţߺT{˴o)WBDO[Q|آ!ϫ%6^*&&dDg˹V)ɚ#bđF 9ns{*)(py1O_=}/ADbiusãu.5㎷7Z …Ԏb{2;\({ cE IEAj#J.ҧˀ&x;ِBA3lmܜ]Z^eЁ=xv(dL f% T YSS$O]:"bUO /h]"s "f)i6 !PEqqsPXef)6 qx4Hf " GeM`Vs֣R 'jNhsqNViyy{w-f3q1C b>Ax>$RPF 7P~$ 9e|"$s2|>#8CE+2LC:CtCq{tY͎q}nw2n ;'H[ÝE`^ b">t!*./ŊYbb#Ϛդi?-4FϐӖm3$B#I}1HrT`\Qs2~XAI@JDpو$ϳpΡ3xSL|ڴeBv7{=v*.'j3([m6[xr萕a%$%mDhee6MYڨ@aٴ\5Z;D,]~" xƲ vV38|ƍ7egǢ/J" ^ G77.gm@LnOMc7[SN+,?lrŽn%"wW&'xqt9|C3˄I<:h`3"133Mk%g$טESuר|s[ w{ohi"KT UO3UYkvIv-I-e TX eӸӸ^k5=mIOkr5yT+O5.=_6?b~:{,3.I\N]$  6qS(~Nخ1\$q.MRU% =aZ@@1Z[JE[_pF&pZp1aC ?48.|Tm։wDzQܔJJQe3G(;*yr  nkf0߿RJ1"& XHĉV j|kUߣиݮ{  ̄_=*jdffA0F"a䏐Nɍmx]iZB䜗8iofd Q٨'&VC֙><$=}NTK9쾗>Ӕ]pא Myd;0xPkϨ9osU9fC( gJ"RD.G)e {2"gTl'F;'bٲbgze8]o1ˍ˾IvI=7uX9؍%ɹMZ`xʄr@&gѕ6L:zVZ&5`,#00 $ʒRg;Z cH]ǟ w]%E=e|dPd3öucl Brǫ1IP!LEMucZ?%ペ(sRrs4kvx뽻2 vؑȤQ`%TVu6XJp`蚩iլ\F_?&'=.qib `ǺA .'}aOw{:ZI|L҄_d< a:ۧ#59F pȪEJPA!8v;:NxC3C;~?SY'tO̯GC3`LxhSFe*:!ԋ!e)ۖ-x5L%Ak$iC$*h+ʍVڬyܫJrT\1wI&iD(j̚))K4[RYY-ʒ a$݀(DY<8y3:?_轾">ߨoT~-*DX!WI#T$ë&^!h<OO=fa8{ø#,WvėS[Gٟk¥H_D;F[kӕXOC[q"g₇7ð)Wx]{[fH%@J\aTK$skТ.@ӆy&jZMh1EF ͦ10$ʃOs iN$$_Qĕ"xƒ}kD[?_rÿ߃h|ωJ  ԡ&!+2ѫ*ޅ -*'״ȔPaRM]K'4|ka9 1R_?9:G |몼e*Dsues<9ggj[c02(go_[djC+)`8s(,F$KAA&4`gkE xqp*Eb`&gCy驙G^1׍_ &}u5եfX:snO;sR\ X `[eFC-7wWa}=u"LP}>j똍J[f"e,Q~"Cmq!,"*9^\Z)VBeDbƋP@=Ӏ &kϞ].Dޥ8GNEHt9_Ǐ1)렣dXM;v_v*H`6VB18$!3ނZ+Og$pEZDAUkhS> oY>wC8UIjb}'APj [HH&/gH3왒*$1C=LlkB h`1T.F&۹}dNju!23]ʄ'l2wZ41'k*ak†nG:j+Jpo]tcn^U1>JP[w4i~WX fFDlK:̓b_'Y?I+lo=; =-;G_+^E1;I%"h"{4voF~{4fr1Vկ4wTw] T;$ĊjT!9C>kxj diԜyE.g\'uVii ZiOIvLdV&t;\:ώ^16t|>דCP?u.\ӓES r8zx܇PG9TB`A I*, BC,!  m9wt ;JO{ fA?rY2+u=|]Ƌ~ծr$KƅI ̛.saLY3s9[ڦ6W?*HC\ER 2  pN  ^c,poM߆ߛ~ߛc~=98!p s8..-z\\\8coGWpd\7!`V_UNT)8 7  2 N \pN xʜ'B fHY@Ϯ\976~YC9?=7Ǫ'\%)PwX#TDy!,̇܉ZS8J6D?)M] ?gᡉ9B >Ol PXz DNRI?n#ŦzA4T~=pI8b5Y t\ Պt`v'Rv=9,hB+%dIn 4:,e6F8>|z8OçIe-)!!!ll 6\1V2.oe!.v DyEqsOp?-p;~VmAqt5U;M[=n$aKV5 PˢZLX)lrRPI4>Ĕ:yz4I7iBv3a3H`G0i9ǝWgMэn<*x7 WG,&OiN\ t>֥I%/23s2YD3̚/2bjp(m[$xF(0<5^Wp.0ɅC!0@4}k^?vv@޵"xmz"B9vG[zvp ]OփAYѡz'wyھu]VC~"#SEۇ[u/|x~]t7{X\EZnӮsO{T%/d(iߙ'>s>iV0qXXR'\+p\U¸TqW<+CWqWqWp\+p+iW q"Ep*ҭHB+DH < Z+E(*-ZUZUUVB4C.97>m,ϯ)KA#>!G]tWM(Ttd!7s8ϱoYV{~/<|@.2E/t@1 p Qv`z0 )/L.%2f,~U{hWi#8 X1Wt:BCf= G@zP^%9KH\BOyvI.(%da$y7^X'}A#CRlE<3}  =BQҥq-H9k;eZ3'3&`f;S|x 쇴=/alFvځ"C{\F|ё% EzK)S8 b􊂨aR)ߊa+pŹ6B"l;3Z5`jj XtFlF9" s"09A6Ռ9eRDJlRIRJkRYMEihz@Y?b}(_)?b=nOԎ1s<3kG dͧz"&ɱ¸UEigY- ǩ̹7AV0~Wɵeɚ}[ckY͡4=]xܜ߳ebqL^%Wqxse2MM>)קզ]<}Af^4;-tbv1YYdaSȧfHݎ胚LyY$:0|;?kng3z`ړ.I#>W+ْzs-U2T<2~vB~>c'qY$pBK\^Wn93K{%=nŸAYpQ}u#!YnCCOlmbdH-%Ԓ :کU(s o98e=;Ʋq0׀}ge'63kw]v_W%,Ay!@BC65o<>ɹ'}Y,nQR ƕR 4Öcv)V%yN 0Ku7_fN^lM1-Ic6?E]sOܽ7]wGSָRmǯn*\ p6cQ=t?2,^Zkn&2QNJ ӐaP!rx,Vw^)=&Kgxo4 I}eNAg3;dz||hgY+]z ItvLFJj_BLB2[&b寙2exeEm䵺zKrR/(Odhphm>W$|+Y7[fa>vVo-eϵuX] lݒi4\Rk+܅5ăKObfw:ly'x/ѫg}TYe_p_SNeгSbZT;ߣ|Io2s8-nM؛\?[/&H]`omc{E@7νZ=dꢒIvfh;ώ|!͉p}v̓qP&e X(+SX E"b1XΟN~/svHPZeI~8Jn.~ q0TI>_}y n"Mo=uM&$3Pa8PR̆ 9vuc-wu LF!Jb'.q)ٶ !xJcUKY,!!p†svIgn!s~nd#P*}oT/STt;aLDmX:-9Uiaa32+ ZsY3As٥+>J~=:y`=QrPϭPc\ҝ J_ugMQ5k2Lq]~#:JKi}68ܷ\&_}7rcgfsj9"Q# j!Z^ i_9Xtq:m.Dc`F">7ֆf!S|qUR=,C>#^+JY;~xC?,׮]}´5zVlT[7laor[@t&*dٳ"c;G^"Pċ+Hr/tKbld[o-24m+bCэP$WաЃ5~Y0##+.i[tU0c b15<248[29Z?4nkK- {#k,3.%P=ڰLSN5YF{Ց.NqwE Щ00LmiVjJ_Y0o }ȯ{M:*9ɮغ]e׋upf;<*덩Cާ{jwmNFw~EmY>+<  Kxz&ךnZQF6(>g3ge[u.ܦ{J)#mtT;Vb5lΎ|Go0Z6Kq{Bhck FW]OB*O#HR31 XФ$AJI%L=QQA[UG-ӼpZnoWzfGphrUCGg8 Npׅq) V nœ6[-0nj>}Tْ|G}辄QmCjjmQl͚-[6%cblM9cdl6F% m ׭_+jy?~Snr>4x#$+c }8x ,zCHduc̷B[Pց@:p$ itGA"bGvRífJl=q:;v^=Rm N`(Hc-ޣ^;wg!"䍑<6n 4T +Y1* ;8=jE?a":(x`;@s_x`@mFg|`^W\T mlpE{Ű -z N(rZ2їJ !$;F3}Pދ8s~4C >3C4%`_b+ԥ"CDő`埤v>DU9Ű)Cĝ [.1@9wCP'Mo/w}$_IA勆f)}Ry'~s"GA)ԍ@AzH+هf" '`$t}JYP@A>rRG8$'!{xTd P:q2)B􇠞{E8A{bBhOb7:fc/K`2㓒цò2v5ND rxJNK HdT[`ĉ汝[h"C %u1m#%/!-1p=BTJ|}3Kݟu^$ptt(Poע\iHs[ 9i*!5*HYa#PT^ 9 !h` Q E؈@\y@ev{P pSD1[ gg^[ ȊUy?BIgb*R4Q~SΝG?^yeL[Ar g4}kzRBسP"6XHp9*]GVZdKo6 zP逢򱁴D`,&X83UzLi@HrKXdY|l@`H{O>kM 7 N~}8gхm,"SA?ԐLG%Oۏ ɤ8*@.1;4W(E" T 1VĘKe_7g)-!qgf10r Ȑ5㯓[l5<>/^"ַNj1}L|46>@{.I 4dz>{+83Ĩr'5Q}…wa! "ponG>L 5f\b㋌[9ۓ=RI"dG~GB0 T @t<mLC-'ۏCss"q״уu+sZsٙ. 9ZL2^'1#Z}qo]_~۠~w$Cb~v}^zO9"{l{?iahɼ =0820ĜKk!v:Rw/ ;U*{mǜ/Ţ_|3Đ!] KE$3$JN>>6v&~&|9>i QǤJ;L%KYW9 i T^.1AXXO/Oq(Yv|) {Gr :Z8鰟bfwn^b]Kza`0Gil$»GqcQvBbtTl0[ bIؿ GQWht׃iz&t 8!(P8#r96EL:榩 n)2AHh&XPPBhج܌mPl6v0ߞmkvzZVFGo)mԵ5#M.mRʚۣc??o?G8αi/go:WMZPf a̫.y5l8U^S:N 5Nɓdԧݣcޖ|KC>4 iOoV$$М9 @FT"qY#y P^= SIjtBi 7Jd6˅+M3j49de$fGd39[•t8m6[FN.h!tۍ~-A%Ov0rW`u Ѵv: ۢIy)!g!goRm_;S WjFuNy{Ϩ_Ϛ讕J`nښP^t &]&w %ywp_Zz0y#;'yRR;m3h6h'˩pȢFcN7yS<%xg)Æydg{vnt>ݤ0 5z*So%13cGqq95h p0@dp8>D0}: }mZ: ˃qTm6{,ʹ{R$g%g:M 4E5Cs@@giC+:n;^3V&BP*YuYz(2&LqdbeVxhYzoHe?v0Mԇ83r*i{5(goc0SRFI3ĪH^Kz"dՀ㲟f䝬 6ö}{2נe3FL](P([pi0hUQl]xDƂpŏGq(В! ?8AMF`$YK4 ~\bs /s'{QP2JfB;{w?r|0:!K8y竟w~%+.ƽS-q Scn0!r""#J#dꍳ~OM,W46a,#|ꌩ.qxV"-ùV 8d!(Nq+\,g=df~'v\gP0F2)u1EH9RlVHaRrOm#pbF1j$?'28<ğ'[?$% @TC3WJ"  U( 4g*RT56IK5f*Y%7gZb¢D,M۟!4*;>_ ppmSn8(8G# OYƿ3Yy۸ cYrP`ż輻WEfH{䮟Y8E5ev6!* SNTLm1ڵ94d`_kuuY~sɟџOg2omd:2T6b z250.Sl-;s)<M Л馄YfE4m$^Ǘ XF`W\zz\zW1v= X!s˲HyG!]yLLBhtY>o M˰t<߶ϸɌJ[kϯ{8ۺ;M+3s],:qf!,׋v|_ ϸ67\}0w,c5k$kޟ>唠p\n5t!sewoH^_+l*~i,]~cx=}q~5o~gZj,%p dhl7Vz%1 L 5.RpZ.jLA 7ڈ 俣JR^F+ Aݻr(оI28=9U x0[e;;`cwzsVmF n@D<wR3 R\Ȑ΢HCaQצ*C*'=$a%ZcDK-gZ Y:Dzx"@8,׎IQa00x\i| WcI/%ϱvxF2?ň{=ϲR|8>,A%xw~}cbP@" 3\%Y/: V@L~vdq)ޣNN2Vz~x|7/Pr<'Þʩ=9;x7/M>~}=/9|l9h>'M z62{GZqDB Rx1=Ê\`V@Ăj7FQ2LdPHr8qN8=zP2TW펄=.(]w_iAx-ߗz| λ*~еm~8o|V.Y>]6)ײo> Lk.?'S{=H3;!-PvTרm?B՜$wx.ʿ=L*DLsָ=#.dz~x)!`k_Ik LCmazXe΢o${;xH@/L%04L .fÍC9)Xn?NnhЪ8;asqMr#m+Dspz&B;h$=Ĭ_/]Z#0IrSӀbA vә\N`Ɛ9| n-f "0'37$އ( JMIfR`uxɋHn+1ĵ]OI{O}L|`q`9Þv&}ذ|vhMޓݿ}Ww83i B]tw{V|cn̷rpq=9XY1gƑ_y D @Z@~ B{>PtNkMxMgf>3U˷ ïut0oeJt= 9LtME!>5'z6<2}QgQ9vkAv8Url5.ۏʅ0+O{>!OĖ6xki>cؕώ/P7z(RBL&LM}$΀(Y dX@ 6lYG. x '%)u&)_)#i)=>Y?qŰbKP[ /@eMvu,N~^j#׎[1A˟yy~606<5ڲi vIN[,VvNߧ]]Yq7۝r /" 5hVj+-^fe-WP0Bխaqoi^YVIg?wgG}%cʉh}wm}j/08oI%û)P9Q~1ẠHm2bbTSK"iT:_ax6$@DSeHD, s (.SIM{*Dvckya}&b'ˈ [2 6,nӇ7̨;WÌa2H9{h.`8HWXXM*rkY*_%dD1-Ž/\>.N#P g?3VAa2T|DoqT;_QTZqA&t9WS嫧׆:{L󜍳Ŗ2VDl[`Z[m0Rd~ 7sW^NZdbSϫpqO'[ÄfGHٍ ;HSH hQ4Y>.Czy.&O5$ D~L!D"ڡz'f%@3MąS\6#|}ܞ5w^fshw8&2sB3}8 = cr!v!LY̍FަU8bc(D1{;PkP !+0qM8xx\\[#!E{e=.`>}Hh0׵;5q;~8B؟ B!޾>f_: ߽kRJryJ@ i1 g;n1CxM%MPA²Fm^H0f|a4z%I}r\&!4Q G$vĨP7+yFana\"HVffz-a^+VǾ?8'uAlsE1NNVBdM'fuټec.|Oz_]ͳ-24Ãbˈ2#k8n6=rt:;%FWOUyf*;;?X7FdX9OǴ̕J0 ٸ}tN(eZT@ <;4f3ynA *5W~b׫sH|1&ڑyĿ2AЈi"1$ʀK"*gpH:]ߊ濱k׃b6Á@3ܘE+&& Iмz*!B>>IY+(퇡@ b7E d^Bc\v[BL"LfAf .f!d3Lr\\cDgԳ#kPJMZ(Nw4,7bdg|/f#ԣ++){7ٔthr |>3ٙB**ۇ^9xvK.{ qm&2ylD%Ź C!?^KgnZưDs6k6ӤnvOLnm/\H~:J 1r̔]ۻxKϿv%Yī-EgnZ~%0r(O'00˨> $"3ⵓW QU4CFZ,B9StiPd+a ye҅,^9 0#_]Y߅نC)Zjݻtl $cIpF((F"_yI/@='HJT"O|{Eȟ*HXuu\,C_Qfŗy 0=2} k EXa~>]v";#sh>ÅP~˕nFK+l8`r\/W"E;liڮ ۭ9b7пN.N(^V@@!8$.KZOaOiOe{(@ HTň-]asKspN8Pg hEt17[\XKe G@2^zqb%v>l`ד w1ϰ(CrE>qi_?P}ogEqwt{ bt],{ }f'pS|~<_kgͥ{ޏ;c2F#7DuwsG}~jMp}m)g6 ZgW5iͬ* 2|OpqoFWeλ_>wU.]odϊf/|t^]S #O^Ou~t}=Wދ5{jZYS(ð0 swQȌJ[t߀c;!m փ{_R~pzنPBVJQ$.< |=iJV88f+܋+LxSTϙz' وꮢ(Ic՘̃exdA99N Hd%qS^T~=>\vG/2=Ty+l/]$9" J mzxabHןƀ+LgC#CERbCYJzZf}[VFM3,{ s%?nKܔ/:Ʃm? &5\[b[ ^QC>}-i=L=#~qQ7-G#o.sp"rl}+UV S+Ӟ_oG+,#u|!ĸD `@8V Zzְ0 ͈"%7σxH F2Q:!\r+/0=Y:Q,g {%ay^7:a#Mdj :[2єFQ M@z2 P>P1X_'F<#|!}|/G9 {_ٟ::6!a0 dc0a+k|mGʝ=D{ qc9_0qkXia {:€L'cb<;a:53ժ@aUPxoYslb66Z NYDFWuߍqѳ֓1Vh-&fC6gcA ;j8q3,\Ge4,CA+l3}/"dKT(\*s?9UL{uL0%(QuRᘤ\!v 'zEW̃s-9Gx'WM#MH19`d#C )H/"Aam)"7 iR[V#%X [v&#l'2eD`Ybmq:W T gjCɃ2&9>_)]D UAdpfE*q$ny8Ԥ~[mk˧Ex `p`,kUy$T'ccO(5.kXpm̃17.r 8 1V億OʋI=ބwSYnn?~s=- '*Guy0 K1l7OHeT9ާdJƅf`"{.f=%&1,b[UP 9T'ǃ;#m1 T CQK(": Fe8%t~A^1ExK'|B;m[(x;CC srS+ĸTLx9v 9>1Hjȣ9+94jm^t% kn Z`.dpP/,n/_{!RUw ȫL@`{r *s ,XR "z/"^ء oȻJXr'0ݳ}*@vXwHi%ްbŤx]\o_C~:T\eb^m Aq`c )(Y"%:aIUDˈox=-c#c#*t==FHuu`.8kJ{q/jS# A]^tO+3 X۸{fKwDΜ9UGMJ_NQ\)FO(p*c}_ _Q澍H=ww,Nƕ|Kbicǭ^k'ӿ~2wynLH 8;% rE?$sx!Z78fV5 @L,PT,*S a{dpUd5nX8 1y.t =&xf4An6ݽzu'Tuj[5Cq%I?L恃`jHoд}#.j`.14GbKB$Ĕ^5ѿx{9 6_!|Uب /Ii]iO 束ar70``:&J!@ٰlx2G@s?tqrw|lGZqoʰ1B׃LG@H(%DZsv}˹ji491FfWJ`= Cݒ*w/*89 'аsnA9#x !2S7øa \{+y\});r8\w7b^%ϡ#+wzgsY#u|xH:8 ᚈ؏9P٣9%J"o ~+30Yok4wHqv ̯5m ؀8=M!@I]'zB(ԉSz M i$W[RhA&nwŹ $Gz:?WO> @{s̲* EϯaY٤bYQ{>Q5=+B^7ߥXzM10Q|l? ̕vH/GHlG;VcVŊgt4 >˒ ڵH> v(7@. +)`~\+eS6 !Y_¢'Gcc:&.+m.LTyU`k]faFǐܾƍ&`Si_ԏxrxTdN)##rgX$ )V+O M^{Zl%ţF Pj a̛H\?q?QVPzJB2 n@Tw*tD)RTjub qNEBnJ&Ta750`F6c鎩Y)ke Ȓ6Hd0<&Gb!MqyTnM Hs=.>$ ';ayYEIVLkxoQ7v)* * 5h>zyv9NʪMO5Ooʅ$ӏIC70S2Y#iOAQL8pwQ2yL9 `SO_WӨS'eCWPThq;U;Syr0~X:Q;,т qNyI{{̎^6{w/HC8pRc _)b Ç2Df)(7rI6;7omjL9!߷>#`3\}ώM1]eabd`O@Ԝ.HagTyPag/#$Iըx56ۗLn6T gPbaӌ]9-mrO7 ܔX\q6qO 2+ *E),5L<=Y/9T]2NIȢ=˗ةeG 2ZP*\r֣nM 0PR1ǗeGaLsI ՚ VzfsH䕁،TH FҚq{H=aDx*g(pPDHqR9 G'ZDV}!cW(@P|IbL#3}LъD0#ʭtL(gC3çHP_]5:l-LQ31UO'ァ[4֦ Sq6nE6ǤjeHjE)tʓ͔g*6r81)) }28~$Ɔ!uL_酽XECb]"?tٛw-?Y A\#ͧ!7HLשa.EZ(]Ll9ϖ9_8tq<FtU| G m+#I_k9F>SwCUc"hBFLAѠ9S}6P; L~W#o{/> {eR8iBI8~[fW1 /aT7ׯcA1j3~iPbu+_|Ew!,cA4?/wT~*{ԜKPLvFrn>/o*+FO1yDe}&brÅ}Op~co* ~oD b6S>M@iLӚ >AANIF@D2 s9BØg s`d1YCkCA1 ˏS+rwCh>!Y>KlzzR2! DZ/M,_oy5{~=H Ѱ 1 w>n.2=hL(0D %tr;f,=@܀Jm>M5^?PZ\0#lG r TB>@7Դ!B%uP-"R BL>QBB@r.AO}W~9B4S ZtC89dY//I$u[ə/rLðF' ٝWE;jQ{/Z$ӕ7qQ/;X)쀁#|S&+UGd Gz^LK"oRZʁ|RE*_.x0{=}>!nCF`O8~`:H>̀ձZfS-yAutsX ^U0TV$"P$ՖULMʳAjU[JhLڕ*IJ%QVJeM5eelT`RR ƫ6ESmX,T+d+ID$5)DIEeDB@ QJ"(U P`IXD` QT)UDYED"X5MiRedMfl6H6"c(RhS)!HJ3RŔƌ&LlIR!CC!dyܰdLa]u֌E$\b$:ֵ>N'fqP|AOmDOi y!E9*R "!Dv(Q= =NJdc%%E- "vHQAUs9K$ l4&jP1 )0`JRUJ'@HQ9l{)(`/WK%6y,fJ6HX0`"oサ@$#?Ʊ"$Cc:,K9nkⶓx3X)$$6Ԋ#Kk$ ,=`(q|0ouTS芥2);ڸlF$S3zKsJBܣn8,TJ$3rdS1$O堢f?o颟9%4L0FԹ ae9'p Az%GLYMYU.޷28عMJ򧊌ܷ s\erhFu)ظod{9H=T 9#«%9䒁\`ãtDKXk  VhTe)ҷއU&toy!c#@B嬧㘚xU@ڰ[s3&`V*y5Uϫ#iY1ýYӕ*7FV.J&ۖC3Ұ,C撸GBt{֕-ӡD*dQ"[ l#l u9N;aQVe{Q '5 ,(ݓi"F@cOܹޓiqZa`?X9ТyÏrH2Xpɳ,KEmw˝AW/*nq5VW̊2џ@\xY'2:{jYp/CFì-az*YT%TȺr qD8tEQh}/#ttT[Lv_ B,(gw[Lj/rHU*wv}ӒX:QM>-׻?uAȞ*X%7Z[9h!fp:u4kȀ̡ӼDҎ$|NEUaOq[QBYGXgD, s*_.WI$FFsݲ3%( sl4o(2e^TDFחʵW޹9` e')κ{r'#Jf8*LxC[3 %ABR;?UA){+dïG| YBQG%UyKmӕt)^Jk:t*];vMBƸ쌧D3G#Rg%XeOPcOkX,Pp*t5ZO'ăNbɴq:Dydeȣv  S;>RT0]=qXP@n1Zk3xZ cC 2yo`6dпq\-z/W7(RBJ|ކQݘS& oSA3u&dp N2Bdl%er *J8Ų>WRrZB놂E]$*@e_и%%^@eWr#Q%qdܹV  )ϳC& `[e۲FB]W/ |DL%o  #80LUXDE^σ"wnmqt4®,5пy9X\T&l棡dɘS'3s)]L1}/!QC} P>ً<1o#S9 zwLjÄa"՗ U*(f}J{@`u$$T ?bԌ& tddh§4DS><[^SS#DQKABɐ Iw'03DOâFg%7^%>%13t%"(nX:!RͼF|Iu+cIQ-.-3q(/C*_/`Z7RNۻ>`s)bw$dw-Z`T"RWw\H=.Qg~B-yEaM-u#媠,_+LeKsP!.vxIbIh.":AO#uT?DR.$~³:o'L*IWE$R+aStJaE {XSE`mK`Мݳ&i-dXqIu%a An'HH?Lk'R"Hv+ I!`τ?"L'99; :04 I>4CVQׄ/8|-s hT̳]rQ+&qT&yUx[~%oRr$0b :Ӟ+ 0?g#e"M־uJ ~/^`K# ̗-VxJǽi魌zZz!81=R$je{*IUI靆Ī^ؓ="AN`(i6˭Δ'ƸFb>ebxM*Qe"ջR(%J %%O*pqlmgi~8 k!؆Ʌw 8."xL`'hВ3o~5,MYny"2lL.Wp)ITYݏ)§Jbkp FDq^"~%1'hT0+P縂";'u)syHq6?_ۀ tUH>de0'SpG!$"<%1I&%TqKq oK4]qǥ?D7`znDRHW'/HF]nsᄊ#4hF8(WƏ/Dy t?-2us3q.o]((9o3xjaQ TZ o̿TTPn>hQT'L5 $V f"*і.bsjtցm8 WEB?'DF9=*#\e"$dQ.MHt\+ڵ 6HG\ЄZo, |f峧4D\R;VCF]3_]eCUkȦV?1BYR{:W!^HAyCGx-fUsUAZ˞W+J(1>`ևI _cfZfcPJ`]Nz,]I %"I ߱G$GYWBF! <_#![.}٘(ss hS! ^>@%ͼ9j6D;gqAa'M,3z:;ꈷm:Uyf鈼R~- 8P73֣Ohי%kx8U?J7‡ɛ%N%P0TEdwg+86"Ԏg١*"2װs$"BVHJ6Bo_(,E:(L&7= L}<2hFF?o`Inj)Qy,a@\'R$I@V1^ḃMNJIZ-aD;H$}hŒFۏo1QNQ9a"sv1<7EXm"Hj:Z?j<#GTt7aXK $RP)z4b@'EIS@ڢ}9Cy D{֏%;/܊LGDh*\)]i*?ar_"/9)ճz> haS(y[/-9(8d#8q#'A0%pU9#\J D+H1D R_HȦZl\ _CѬXOIPd,^j1NHBf;~8>Gv(!U~ۺP?# E}X@*9w sW!QFԁ'oQFOR h>@7fMGMrOg;c"= N!B 01+d0_U~4I9߉"2NI%q\>T:G7ohGGHS?pvAPX HYN?xPiCf=uf ]KY$DxyO-Ԍ']{z5x Hj0&a$ $7qј!٧%A]!'.CX ?|bT, H(2@ymyW1(6 ySt2iLçU4Z_zc^x /(w#}^x>@=pwnׯ<}wqxp@XEGϸb0O~=>=\:'ww\1y ܊|˵Cr'\S;󫓻Fz 'uwn;θND=wvw1;0=a9ˎmM[f2*rSkۏ]wֽ \ݸ?;{yzǮa똝܊u";py`uہ!ryr/ӽWDD{/2Q"s]Ǯ%I-)H%\wrwr!ۓ޻NA=qrwr'r)r!ǝwOnawuw:g燮F'qǝw"wr{!ܞ//O_/ǻw=v$a\ۆ& -iޑ\;"wng^C&H-" J[fbْ $$JN ۸.A>ws;ۻammx7D4PJP4mmm$0۸Sۼ;;$l67LD~<;xWs>}`y];㻃4C;p'wzvsθ= w'w'vCήhw4C;'z=û;s=v\=O]ofCVfE ^r*(XE!a$:A$>c>}qB?aC? D"BR07.dž&vW).RR&yc-O|ߜvӳ+BA` ngEI>}HOHlLF&kaHlRuE#Wy6}NJ:I]]oTsQkOU}63K˗)[!D2(A XROnYʚ/IRZj2}D+S>†G \3΅8DA1~8€Pᏻ:,Ⱑ s: x_z$Ƅq"QE+^4 O'߅鼢gxl 7-Bs<Þoy^3ۺ/Q8vAůPpW`0; /7O~HHV.|: JRh hm:6{K>^~!cꠓtK1f+ y%I}iz*X^4y<1OŐ+G`c>IP\>`;fA+P_S?Hs/ty %Ҿ= d8z4fw{d'$~f2( y)LFǓ/R؄~PPOY~R|xFpX*$t՛Qܑu&CtSbı"UnD?C23 ,sSO"oz}k8o߁RGU*w~?*34|SQ\tcgE;^C[}XO=D!Y%ϜU?+qi Go)R3'DNJ ̄# sp̐:!#H?g*L+ˌ>-~:ۓFmHtXTA %!(BS@98N_?<ɵr')c|ӃCd3U)y}A @RTW+[[V[&*Sy`ȇ*uPS@y7*V7Eb|1rH_$%>Kk)#a,C }j)jZjՎns?()E4*TFge;KV8P66:899(tty"1fHl6Uuҷ3_Um!i} o~WW{:V߱Y=ѭR6=Gbj5zWUzXnGmXiyq>BL35"Hx_ӄ:7{=J%%$7t̬-MMM)S6ljxsvmUƚrܮw*{]RnQMFړʊOAQ8RVVVVFdfff|TrgT(Uj*W:.XZ%[s}kmkMkLcLcWٮ@홹]&ĺm0{Ĝ.[)PtLŮCb^j׮R}zߋɷwJX^[oħ?ӣrYufβ GX$(3)&f{? ASUbZ2&E*)U>?f NnnC>_bBu|z_$s_g((Ar6ffve,ٙ-Z9{LŽܥ56vu-.,~L&_[ss{닋'w#/cP荑ʞUcfMG[&:D-VtqPq- n Xf Srqv_΃#(zbY _aa !alI XNT5_b}hnj,ގ\'FIUk%-3TK|ÕSZfzs|=<#d"T%bfn%+ږK{Wٚ$ nMS?G?MOClSSSQUMSUQSUo"WazE$Ǫvp.1jq$h*>hkuʲӴt5:}Tכݝ] c:ܟlo?}ogU*=.j۴7|PaonpnrnN..1P.WY7>W?vx;܏ux=_8GG| 9HXoJJ^-ZKbQLRROUS\:MMuU[s]+@ CLG3柜/n?9N_~RXa1,$TTU#0lN+~_{Cc,~G%uY>X o՗a?lrrڎ'K4Mʦp|?OV]|7r [}SrH1|8 6oƽ7ry97Yܦlk2-MbΧբjLy}2xg7o*tUcq q=~N7q~?Sw:e]r6ߙzzv=B=~}>}>_=~/hOe U"YbuX*Zıj+p*A/s8ٳR;<4׎Z[WwwZ*5]̟Y.YǗ%g@7^RWevln5ZW]IhQ7M;VI~/Pz7⫗ǁ<yĹBj4{m퇷c^(d ,ݞ_-x>{gϞsyS{C+;wwwh'%ͮPoOl] #$##ѲьF6-bk,l\̔9+kUNٛσh{x^25IO'1>?w;s=ӵvTmSg""",("#w}?z-)\g|n}߿-:9M;D#Α{uCF娳Yt4?*)\G!K-6[Un7W7c.g좶9\OrO/bq7|#!b[Exjl=>C3Mg?1`ֹn}v{==h4zC4[ c D7Yq~GWyO:NL.8aե;iУZjXIOG)].`e&ѭ&A8o4f~GGW{9t<If?|C4eB.@Kr#zOoHr!G;.go/NV3"*z^=e#%KdA&βv;9vn2},[41XZ?-?Z#y? rE 8'(w)*?$€DGzINWHt'"D0(rȉCJoFر^^FWq@[m-F;˹tt',nR-̖f*L';LiG0f56}s>Y#wO0F[&F{VN(UO1O9Y+LBhGЕ8rt?"Qou7dN ns&(0U^΁7t #+,dfVY_:m1;l[6phYb/fldɃ _K` 5},?}C5hulO;$4:DGImbxo*@nsUr82v}Va>w?: &#qbNMXz6i0Q掯`GC*etȍ)k,.1HAȤH?6I8}L-IM>n{i0o> lx݂6<?ͱ0mnj»lW~t[JYf> X1 =υrSq;Jla|&gXx\}KHMI3OhYcO$8&anT$ $섉$533e{s7Se(ŦxB[I tPr_DjW€d$!_Mac:VB=xn39G̐R~~9 ^;^  Ot[DKPNdD~4k*BI/BI>s$ a$lL0 -l 4srB]՞*ns0 ^}i|;' []Qn0zq@yԇ Cs룟Eo JBT2qݕN]ـ}s"(7~yzpzޒ%Dx(F@%2$͟1Z+jHwR^].T0$n}kVJ;pf-֐baў|+,](L;YD;NiݝKM+D9"7(qҪ#!y<;ŖU/%kWX ɦy#qEE.%vG Z,5̓6g4J{BBAj!Aq|-7u;Ђf8b3uG\UI>UOa/g!ê! s ?%,$EDbD>&$ȟ>8EMC!8 Z1)죢G(|fG=c;C W ͐)\èe&]|%DOnX˄>M 8HI!6!K%à'N< V^C;2MҖnz5EXβpIjI]o x}"b}/Hqw^z$^1&~R_"Œ!3z/D 1T*Vsy|ʩ2( ZA27tk( ZA/_Hz ZAͺUؙ+H9.x+(EtKht,-ERt#ͧL0Ni\ߩe- `K ^9 㘇^9N6B/ ݕ_ P?aF,X!3ň 7juvxE3c7ɌK)bo1|"ERƼ"zc^0fJJ87/].X$,F-L2nc\=F&t"B Zb$ `+A tA< YQNADo`B tH>o!a !$NwڏU9Bjm;=XN $!a! L.gX\҂.Cx^ (y˄BP)_Q@Jxi{"uǞNi7BU9?+H9!>[/) ѵ&^Q@S@i)#T?}c|x{ZZ B0Py')dcHP0Ҥ@dHI9}y  (/yܠbqI^1118qt/x$:} d &]|A7gD"P3 =01mz:}CԶ F`H /&H8K-bA3m=Fv,*6٧=9UiDxNfcpW$I : !!̀SaQGEtwb;3CB ?L}R~f[FG( >j횂 l@)DQ_T@U0(*" oB KCGK? H?}^Œ^K̋v؋PD-62ʒ3Hd%"LF/o7gLA#nlFj GRy&܂sLo-~6ZYL$=  FՖ ~!`?!~>iDtwuLba4fZVް1 (4ikn;Z JE>ۀCP+D)F%J..ZcTo(qXR%^zŘZ )jhCrǫxnMz-p6 PD-KP|tkn)5y~u֥}ݽ05 *syaWWq)&R,0e7LIh>ug7ze^>a"^gCPne'/W:+G=־ Mˡ;a9S?m7xr|I$ÝH96z8ox9X.{7aބiVHaFo#g <0 7t 6.ivk>x|?, jΆmsT)9Gj ؉ p_yÂD߰>oף_%<ԧʸBK ]@We/'^49]#F/.x#V&D H DQRBDRD?>AA]jdTDD@a%VNHa 1C⫁9؄c"I)2a$HY64#b (؀6Zֽ]$AhQcR̗ۺq$#iPLT.Ҩ,KmfGie /@?[=wc"T9EySPq C*cՍV65-m Ғa*$@R*wB ThEFڋjH"ZAhZT0E-1)!&#lȊ#h)FL6( fc)YJEXSHȚ$-%- JMhjQbdDU,- &VjiP%"mH؍,ȣQIIFХ#)"2XJɤQF$E)Yi*lH,+[V)% XKD@u)Id @2A@%2W \(BDdr dRH#!C20%LQ G!$!B % IFf@ ZZ" ,%)bXiT"EePQ"D @ Q`A 0$Y` 1S0e)`! L & NVثm)U,%Ld @(`YB$\' W J2$LNi%U\j$iU!Z rQ&L1BU!%Uͪ\QmQF+j%GLjQ%pJ# LW! !$G$rqHDDr0Z(% 2bETe!HYrP!PFEfUIdb S2 d\L"EJ2\ )W!ZQ2!$Id65L&bt)(Hhڍ[f2E6m&--HͥdQjšYM1F#i* K43TfH"m)IdMC,hIS1XlKMk)E*bbf5C2Lm kLبM!e152 TZibC! di6RS# (F,H )20kIVUXVRjA,ja!FXH2F(ѨbhAXf$F,S#D&Pl&))m$DK @ #i2@% Ld)ƕ*(6ؕdBلmXA4`J "-R@Vdr]J ;@Bhr@RA؀@Q(TCuWLU @AUAG R9rppHtY!$^LF P)P(^"DLL6RMfO; T"ޅYrAq$B#$Z!2 C%YHTH56Lڳ-bR %BRBIjMR[jKZ-l !$´ 2PkmIi%bEbAP RZRm%)MI#D +,,@H "A&H#Bd2' X@i&Ki+RdeIYҩ6]flZU5Ji6JZ(EBha6 J,D"*(}d8J(KHHRR@4LZ #032 D$/$hcDlm26hL6-Z,4M-XfPVŴZ-mEY+jOSV1( Dw@A)s$bHh-X[bR$Q II Q2SdIun 5,*"A$NVT2$4'l%" % @B(p5lfhcjM&dڔԀДЍ  (!v,ȥuYlU#`Ph1EW$Nd8\  Pӭ]Sy䪯HBIi$5!i"PE-V U ԒIFDWݴFhĘm: d֌3ݘS wB J"BA)iE Z )E(FTP`LZDB*؈ƫj+DFhիTF!P$Y|p&Ɋ"(mdP|XaZ:J 2ҴhhQJD5JD*)XI5:xYLD8y a/I*EEcb65V-J5jJ-cch#Z4Tj֊5ƱkEM|99+ۯelmÆ 򴚄 w% 9HfAd9J(v H4%" H$ E UiAѭ&ik-llV UmbE5hHҎKAXg7NStbR!na[$ Dˮ`,hXuĮC05. DC!]HPRBeD1ŅE N#v;^*h!܀E{e:.&$2 D@rT5dHض0'H6HR"#J0#C@*@ P%G3eCkਧ8QV*BrQuT$1 +4R`ڈDi,JHhF$S +U}~BmMCTe6  ($s*I"a{xl`XJp C%8Z"#N=t?Mg6꽿/Fš1 IN2UT ޸L㯗W]׷]OYwHDhv=.(5%AsH@d(CJDs H#((䀺*UedČ$FHmiR=Nst:gfҰߴД9LTy9uh5#5SE(Ӑ- ZTᩡr89rp Xʤhn! wKԅ8r,4$jrz&EC^ ARjȄhNvN^0pۢM]%CbzCB#Kr@c.J& zD4cП 'z/ݶх<6Օ#5|^,x:|ǁcp=D'; uܵ% tb/ Ha)!:S)y޿z'HڬQ?F玔;~k(V i1( #ӎ0y q`4ON' a p^X*_Xh̴ @GH YU857V[a[|W&[ ThkP$8@PN4$gϨOcy4)K XI stb,da IHlH#hJRXlmj@)JDd^K9^÷~4J*%@ 2Tr1T2e#lSR 䨚0Uq&e2Y"ePysC| adPdp}j1F(6ǩo2RMp< 1K( 4*k$SE`XPܝn3#7%]N m!I:3 Qb,B 6NH&m )T v $(a $5- ˓SC  CBlCB:"J)UI ҮTho۸@Pj^bF.V uMH JŔ5ţĝޮ?o8Pئo͞ǁ&[.~!p2dh\1f R2Da6oL=P¾d[FU#T'8GjPBR(\07qzB˓~ hYdʍFdE18FfY=g=n%h%M*ܨܖu)W}7Cavi<35y/|O\"Bjh\E>vSA.6`L4g<'sMne4J7nqbqlze䶱o)Ey=/7DˆJvg\ͻgBd 8A15KU6_)_pI7%/~Jq/xvcX <2(mW ǁvCy4,2Fy}#2N-L T/W7kn 8Qʾ-kg [.Q0l\$<#\s;TbxK ROwX?P1QX4E(ZGeF@Njl-ŵ%`hI&_Ǎ'wBp$Ҭ:U(;x> r6HwJ+FىՅ'qjv<=NI6is82T_IF0_x[I1_ՖQUe9e1-\[0^:cO~|<blk<9p\RtJԢn**D0W"}M-v\I~_-.KwbI咈eׯN;0@EC7F|Lj0IY"|b:'S'3Wk! 0ԴJi =`)a*hW hS"-I=h{U4XM)4qHp>lFZPX#VXpXX BB<]nPc.Cw h5D MG[|\082B-,MI;Nl*4Jfė/g V 0'z7&8$ą:|"SPyT)j g0i*҉Lg#/`~bf"hM2IR&H(h4N<3w?}$ܻ1OCb#QhC'e?< OL74^D`tzwۣT5)+]+Z`ֱ`13$[tξn*ySk߇WR:p'b-YdROB׃WhFl>TŹF[W*w^ڦeKqƦpb,(hE-BB7yvHlv;II 0Dj_dВ.ud~l kt,1M 6 5&]4)pY"M ^ZyaGcnǦu>_J@ƂTŘe!l]$us:}6u͛@ȋA6׊X.*RsA2FEY1 l` `k=  .˲7>}w@[myR10(Gۚ `3bQ uy5,)21'$:9DMjN=h=0ESC' 2yB&77fǼyrK E_! + p$o1u_c{-V׌pbp6G;^3ږh8YbZf-b `ixgkN_n7?^m[k{'gJeU5pg)!x*pFNF9%4V LI.Ƅ0 xx!{#'H,vD -K48h2 "G*tN |&eDWT5zɫWG ?ʠDDJUu(ީ>FmRa0+bd&H,S2g:ffi1k:Gx̀\pftV#%w+r޾>_'8[cpB:aăNQv#kg O71ce -c]/ j}-B8VZMh '5"rje<]+k2i ·$:VXF^)&Z<}0zl}gjef!6P P{;=BzT.2,|t5a8y{T;^kD8(ωpLqMZ.s(SYVT̘E)*%9EBF4})>ݾȘI$ºBdb'ev,P&7+R)RCMud'B@Bl2¶)s ![iIx TVS ݻtOngQ+O~W&M<^2> {{s<}QK5%d_I7M$mUyJÆ.sǜ3x`nϾ@"Ng jcUSTJJ|>bO0u=gg8YM5վwڷuUQBE< u+ ,9 e닆"t%hAl_8 kS@HGNpxd6߅ -P'_-c6% 5LHDeA^oFB̌{4!J"wO.2 m`ϸE=g ֨@Q 6td# 330IcYEd2/mj e\p>iRDW/ss߮L!==io0VR|ӱ^qeZćh轢ĵsg1P$CԵ8J%(8DrP1ӓ!aD0fItMtGr M0kNE8y]k֕($ z%{NO4.br_U}LPO`"\Ŗ|[++2'9@4 T;k]HOvz*[7k꞊`8hʘ# T|~N{/iwOK 4Ykk>f{o>OS&&W]N*,ʕ0¦ѫ&Z+Jڭ5ή5<65-ͭ8;KC>=1}_uTgih쭡kV AUgN]BJݵNHΟ`$I$ X6:1R̐YT4 (iR .\=* ƖEr&p9E\ppdR.FJ`dN]avUjZW|.^N|}]EgY 'f8ҩLnѾNT4F|zg݂Ӧ#R7#]]fna7 {yp#Jw ߊyy1q#4gGTw[vR3E;Qņ,#g4%i75W͞!ZɫEhY54M$rdr|& ZVLe+f6e&h|5a+r A [AT.eA9RA& ZЀ@ FQY,qxMD ;,O/y-s0 ;Mk3ӯsfeeU&Uxw3.iڔ~NWw9(*k&cב%4'}Hpt w"~qQ< $ ;( y)$J!:幯K,2ZTHXdkBn YACOk "ҧ2BG5ֻvL H6ҙ( t:N^]i&ՍjY~^BX_qP96C5 u;R2iiȢ}u{MQ, &w6:(3`7D+#97yOtY?mb2}d*>Β#}RCY=ԨPKC6!LNkS[iLX|!U!N =Bи֍CI0e6> z{f ̷0;Sݏk޻i5K@?huTaOsS B 1צ 0O@E9'Hpv ~Ub9du󁑈w 0`q=|Q!*o^CRV)FA0Z;~?-qMkB{іu'+dֲZ^ҾkVZǬ8ǚf$$ DR<ƌK#hP笉{DuNGjMԣPevFv|b !)돞duq/ u^N2'0úK]:s9͓XUGu^W>Ow*%UBu1$"w C1Imҳ>ZْY_F`n;'0ۄN8O,PC>=CޣٗՕx^7Yg0=O{U^~8Tz{9 ¢ &M6h,Yd. c ZZqDx )0N}If{SH/aQfLȧrjX*Ⱥi\4"ý'q~fZ9vf$f%zr=v|3ouljDwҙTU0.d)4kBjZT4j[Ι͏t 0 a^قDӒ-yXF0AmR#8"𧴒wڽ0fg=HG|J*b+dCB*(&%ϟ$u%rI=Y;#(K8t9Ty3=أьϏw:8s;);5nn6MHk'sN)Nveaq%p/'d xW8IْA 1YVaa4=@G yA)h\MGSGq!#pH)4:e;鋶^*cI،B\\Tꗾj;g&xc)VZsu&}a0aXddd2%g Ujwc18e1-uO(GA]h^S:7-&2"ad|TA» #n{z&$X=l7CùC'e +Òז&"i5eU y03`zJ>sj0R>hG #4>C܌OE X2S**y'zu0nZD IXp1ьBdekPq8\q*B +f{{12i6GR_PVRճiz]5q0(bpbTf!%NH&B7G+V|=ۨ,e&Y>0T*V,4De7=7/ ;ݜK˖қ:3 fٓf;A0F730˾T,%5%0.0☸ a ~Ú8N/!9tԼGfI1*M$xgv5mymO뽊 _{;a;EGNef߸.v[On-wZ|?Xj9|3fcS]0._RN^c9\;4nY8nhlW>½nGU}[[c TEE]_P?G}z=_>)!"TD-  wtJ_TxA1*Bx@8OmvU=Jb-+B= ,ZZH H+縙 &-S T=A eYHV+m1 4^i Ca#8n'bV!ρQ{tqr$ @)Z+=95e8+`fzͣSa^80DD@"ic{U~3S6UYDX@A`aYd*ɪjWx4LYbԎӅ摁~4'яtF8D$'RD&pƞ;iZROv4y6pwfr0ejI!$;GE)d5(hѡ֜ #Sm^fT{eD_{= ;I K|וVORkSIH& 2yM:7\AdU74D׻p$;v6* GiZVHL$_-%7s=HwGw^NQ3E0©TUJY+* JXmlpXMM*1Su|TiA}_D-ϱyZh1W)* 1}򛤸4Č Gbj ^Fe*Uu^ZZh/\̂iFlFN $c:l"P1!^AM;xX!nݳx7q#Y}'yQVqr:ȍGUqq]f7ɫM[*),547L2j\c«)XhM5Mʭ[ۍdլnj f1R)6Id@ RQ0뒡cwSCSCuSDh14 pb$ XSJo794Q{ HBZBmU%QRUF֓UXdH\㷲u8561Aၢsp3$ 0,{VD1#4fs?Fz u5ݻf\8h]2{SiWdnPؘ uL鉣uhY(#<)R0lGxBMd?ȜҊYSCNl I:+Ey'PddJ` [2–K&aO{ԝx.>ZQ[ߚW'by\\I) DBz<,HL ZLW9z"v۸1qw1yYJ 2+I"WSMlտUbr,Ϥ8yk/ :-f {ize>(oaH›R׶EkNs&t4~Ai`21tĭ@ jK_ٕTI_8A[ҝNYV2-AxN0ٗ'Xq4M5`٪jsl͖^f󓁳xr)V|0:1Mwh1|8wgK̍szJZ6<#m`|/gMь$*Uo10g]N.fLALMrVb1]Dzms j1f'>){4X+3 t%UUc.T@VjiqK\s$ILEbiz:so!%+Ax1==fj 0yfW7(tmO,NoJlo/$Nocp;YxcvF9] F6˸G`Ei7*Y>*>K}MYAN6-bωjbjƚf38B}o 3W#f61}#tF**`*}&cD|3>/f ~i#8%PqǿׅAl0G}S#5fcwb,uYe֤-gc{0Eq9ۃEVaZLϿuWcWbDKkc%` tY aLbqt#U:5l;1=og t5^0q! K).,Nn1#R0e5DSƧsoc(sŚZx[5-9o344 ϣ~~~nffZ 3;;<"Q ATF94qE_RL?VQ{AH= 1nL{j.lئ4Ոfqڄ ncCYOK̋PM2I(ct:UL4F:7LLcXb5qn\-vf4Wmp q"EI?g5rqke@PĢ)|fأa?]w=r"M7nV. =F f8FspuA9<Øo:KEs%FffK(b8PNض px1 lriOp^fV>Y֫e wjc1-G]:LX7DAt1ǡxM;ɇKi"Jn9zq檣̂D0M0A2f3uÊǠ#&`d٭&AЖûӴlㆃr9:`c5[vljv3ԷI'92:]qr[c&qf3C|g9t147)̙ؔ6-N*%cM |N2i9lsrmydO%k$9=2Βm4}O'|J83Jb ϊ7Eۃtѫyʠl!]g{/y{*,cXcT̓ F9Z1Ǽ>s#z[d!z;>:glփ MӚ򦋤;'l 8#=xv79t"(d=(HNp蜷I6wxyG7wYV¥Iv8r4p 8sJe 2eulnc%4o7N(rT}zpi,"79Ҏi:r?/#%)Js$Mdys9s2ljm;x'+s`d,iZ \X zvag xvI\ F,X Cdrmv[4<bd4qդ9^-ówyݏ[@zgybUkme!$҅ . hy#Z7=Ry:^SWֲ?$ܜXnDs%휴oW>?3Wcwٴqtq Ř4M |]3)M۝\ZUem!\=n0078% r0$1^C[QAs!dBu;&{P]';4 *My9s: lo7o>v#0tU:c?ޏTv(!i(&@bBz ]3A'a2"؍H#sNq!CŒ:6NFHPwQǩSGȨF!ĔKn 01ǂ@X'dLbM=.|'`nsLAAm%`StK-q{edhvxnjqt#jl 16MÓ9l"Xb[ #pNG\w9NiJ.ȱ;" #.#vNӳri{\ā^ŋĉPrt8cs9DE7(02a;GwM1np= `l+m +gq*"p8#H-: Ӂsq:DLJTҤa479剫8 _O "5uyl"*n<ש,bfj{ϫiZZ9MjX&bXNuuNc [7EzAu3WXbw3<szY5͎nuǨF+l &'C B+14x?q`sIlicCh'L骶AEh˖'RMQXFj M$Л8MMk6eZjY.؅aSGCh߽jԳm[ ̃-w:=: s&[¬j,plz=n3&ytɈ3 5`w YǁQ1%0Ȉ$Xi8NVN Wy˘sn+r9<ޝJ }Ð0 bV,9JVp*eQKM >Sr"'ʩ0 3 8;z ^$tEJnOM3Ll|,*ȅv?̺+(2j3,3_߻Q,<|Ƈ`9}>tξ- ~Ŋ]f>dtZc4۵q&u6w^ī)#b3,ʦz<"{"ǎWTp*o3 65{j*t^e, e*<>hs=Ӧ`f%[y$'3,09ڱk%xW+!ц>l"p^ 9F0xy {yU;~foYC6z70 ;r:%#^uy.,w#|r Ǎ\;+V9 #zph>O+죎Hp,'7ۿ"ώݘHg֕@6qE@M>)' >mdSpjl5ǯGwH4*G38&P-R3T&9L$%Iܱ@fA+wJO;;3]4h7*\m3y^ja{nfEv`aRg*-CH4yG]Oa?zJ6#ũM10ՙ'x_Ddu f1O:c3鎉^B!ܭ6x?^N>`OUSgsCT^Isʣ.9gPۃ܏3S0:/+|4{1.s|a*{}5ZR60~}{1IQAټS‏o^|ns+UwV94m 0տKu9C33{1V\~ar~zMUϐ0*:~Yt\s´靽gj*}HJ?ovwɷ $Iޏ'VMLjnk:޴DQpFƴ 5#\x|m}p s|N#ھ=@Xm9  𥃛$ &,ͶV=#9S]q'ߎCRQE%?g mr$\o[ʙ^I &Pd'wa?KoDW?gr<|<2?~%xHfd3lOdK&^J%0 e8?=3&vnDDD WS%Z#?|[G[~/#_^>&AU~~ɕ"/kyEtJ3S3WW9>% c]«*3QD*-6I!6(hYhZGu$|hy.5xw";S VȀiBH>vc&noə&̺Hc0= Qr@4"Dq j !dj/dppA4` i~QaҒd$p/Ux. H4" h@zF?[NkF@o4koyqHn{?g53261&``F01,Svh4%Ao9hptT\$u0HR3mPJYٜ-~[mtX[?]XLe)S:LaqT ~}*Ր\BP`D3zfy+/Y-l^K9 $JQXHHPC!#^ܒi :W8Le@0QZ' +3pOk@ao_~On=W 9=دmNy?7LI0Be&{w.|׊k]9}Ypd }{~qQu]'szielW '8+mQu ]NuQ]UnחfLH} ϺΎus3p]>|tr?KvloR*~U^N7/똰ԺjEz]WqN)V]u[Gޮɣ0.C4ļPG1[ݙnƹK)uҚ&`U>.W& +2:i8{%$ʳ6"7GtUh:)Zlŋqfj9wQF԰~3㽊Ce$v1oաq=Le:PiؕqC^Uː&\:3~ϝ>Y>mqYs3~WiυDCVݢ+SN(={KfMT6H;8VƵ$ĭ=0_Jqv+F)%'ۥ|{&V)U}E!퍳6esOZx0]+a^cN{7;X)o>?w5i.ڢޛf坖SXTyl5WOWb:S{>^*hׯ=Hov(O]:5uuԌbs'S jQׅ]c,5ќOuVpq?xO8eqq, p^ժgϗkSzkR<7kO)}dG|qy> -ګnif^y{yZsF-@˂6G:hmOKuv?5b.H1Gc.`9 v*: 8,-^E-*B@Е H+lz-c\՗eg}9*v_FN?l1Gr9c=yO~pyŌ@PoJoN<"r$2{8.XJӬ|DX @ v5RpQr2Q0i9̬sM J ucCX>T~ t1F^{( d3 \4eN[sV0jPzC bDƸ.m@3!RlMk.K4lz* {}`n RZ0$=p<:Iq ="睽֜Ylޏʲ{o֑{JE+ # 9\bg~ *=r\J<҂Ed-5hX,΁3Ԓ8Fq5i17_șGj8F=g[A@sJplg5溜RUTei$X'F/ pppqw/5B ).^@c# #0J*p5P%)֫>IB `lΖCJ/a@!߈&J,s,yoLw$\csz][*1h7Xќa"-a;~A h)9uE [իVҿYLw;I] }ejnA^Cf1WE uZ#bͫ@̭ʳqv~;S#>|1uKslUP]" ,YsKŨζAfaw+,4:OI:f`;ܫ#f6 *-rֲm =|ncUȪB׌(r|aڡ*sl۞} 퐘{r6 [{ePt-YFrCxV5ئlH~ \E@ Qԭה9fbe_Vo5!=TI3@|y Vķ]ddy#hPZWxnFwjjzXHLy׋rzK&dve5ݤwʱ,%MۋM@ W4"K2Ȩgu0_zk_ufˌ= # <48Xigdɂ"'rJ_u4zخ/Ȅ܎آQ!⿠Oӎ֦|289Յ"@3yW7rO=3IhۊCH'iv_~wk8k-8~ $/{+}K{O{6qGsO+M$4KzH{+~Ь%c 4s *$=_[y>f 0&G5ϝϵ?2) }Kf'wYd|ؒOuX*K}㷆MDf!_] @*6D5-{# !:$ThX6.pH?ߢrRy'Yۻ=qvH<躁 ̤%N8}y N=ZTx%@Rq*,'* aBՑzJ7 彰Vw /E04bV&ʙ$F6 2 F(hha|fH$BscA d$@xp&q3gQ7C8ޱ /qYFVѝrIȌEF)7K4RX  c(Y#(k)lpanB&:TcJ-YTB$V[I"/ ؅@A$DRM""E+Ka{Zsuc9`)UNu6ʃ)K%,$hRRt$ֲP7WY2RF#3f+C I^5JΎNA!s2j6!"q#S*ŎvrqŒˮ^sWi gV/h"bbt_*,ű*VYREV[)IF&I$3V+ZEl&]("T`]kL\Q2"%,W nqΘK<.W bmKF0\5轞ڙd4brMp;pNVޒeʭhaW!VXTti FfTRI !+Mw뻜AdڀS0I4FY^Nt dZpbs:V,rwʌ_rZXfrFWLk8`kg{l웽1Nid/eZR^LJ YJsy ғE3.ҊeKe7I-$ۡ,$I;D@Z|_/݊YЭU/4hD[!$q 9{xGI)r))jIe96*6Թe&m4mK%w=syy睻wpD@0ow]R()M$RmMSei)i$ A)$)$RI;;AhFLmok;yweMEUUv됸vpA $S03 hč9D&tr\p{W_x}gGߧ 4U5Z>s5t5~9;SE1LQ4ET>/R|Dq5m2ow:qLL0>emdS0̲J! DDvHOx죗s;gl:+YnCqaݫܼ Zb%'mP쐕jmmM 0O@@̒nEn;`gmKXRHݕp#lVЬXhQԊ-Q@ `-cjΉJ\@ Z %/}w}wt:}]F@w;+w|]ֲf۞YhZo>^YY%ە9fw(l͒d7>٬m>$UEBEQm1}yzfҫmmMFo%}}ww7V]Euywvru뗎ϯ+86=>a؝{U\vȫ]؞hܫ}؟;/>]8UP"R(RA*"D*%QUR79$EJITR"wZeZ;L:Ś˹ZI}ϲ6lw}hǻmiai[U3f*ՙifh͇͹VKjۺS{m+m+;vjElբ=UۯD||>澾NzOa {ϯ}9=a! =﫬<7m'z}Ͻ1UT_Gls}}VO|w^`%x^z7+Ʒ|k{'۾P5Pw}>5dO8m: e M{2_wgקdYJt5=:ZʴԪ#l%z[SZmF&fͶEն#X6J--2MʥZdmih)6jCYiY652i[ ֣[m5fMFfmƚmkCRͳflUZ5[1KJ +A*JVFREU PBT CT6Ԓ2lsXYR[5)bݻC5XP4h l 4(dV6`j bP $G@IAMvk@ j:ݚ5 Ihh4)]րC2cCFli-ST|缪=hf3Q}wT&1ݦt}p@#4i441&0Fi Pj&LAFLM 4&h2h %!@)#" ddi jd4Ѡh 4MOCIxhiDO@SFS&))4&4M  5h& m0FiF=2ԏOQ#CL꟩=4#)<)?Qe=Mm5=5M2IM4@ɤ '4 h51O&OF&"x ) &D~Cѡ=S466¡hHDT01L- ^@Q]A?vffUeuYak2EZ3 0֏:[Ÿ" ̭fTPAAH.Z".lۙffvd]wFl.у [Иl+P0dYIE䑪S@NI&Rflq3JLQŬ")0Ic+2K DCfjQd)e(`Ȋ;+5 UW2m!LM-wgR+!$i(,H$6KI PKT$#W"ztEPI"8JN9 {,3WZ39abLE!Pĸ$q◙jf %xQ֢1z,Pe"  Da6y}e=Q2샭͵zW7X `dV˰(2 wAL9 EBTP" h"(Y0#t?1vX}N/yM\I'!K\_榮=)h`F;HHS#rER\/вQPXlm˷uk@chH j_C~|W]} t(ttb$04 6o6i# a1U5UDQ~TN0rGx/ A)JJA4N DGEl@̚ |(Lmrzt՗1+1E&\9t+4END``C>*A[=Ȃq ѻ`ҵ-㜒^&B7;;m[}q&س7G^Bnv~CIU&*o$p(аIpZs*\ o[{iLGJ!6LV{K،[>'_诹$gm猐)9uJi z=T|NnERr8_ +fön tnz>q,Ґ֪׆ڎ7N;1TN ZODET($R!PX ?Vj[HL`^6QB*(YuE]`Zt7: @*(m$J* A0<ˈi-!)5vd d P`$HʁU[ (*96* g¬(2afDn2 PxǛ:Bx}q2F)P^>CJ8]$%:&Ӏa @DJ/Ԑz01Uu<`U.I-Y>DɧRPJ0Zʶ Ǎ4KCrH׎ |eˠ ZHF B@|@]Mbz>USeݎ3n{L-?ӆ<6dx#B(@Hs]mf9[ԪU"5E_^g+r/ 5"*UP!B ff@Zw{ (UĀp_JB WU*AXܤ9Y'?9Ԧv #z~ G|p0<̬1<ÔEWk.|S À'w:\Fp4I~Bv-)~$!86pc# .tՇ<˵NaL)Hur TH~aɭ}$c'/_j H:~RDCkNO6 L!QQϡֺjPp)ph A[2T=a$@HPA)D#Oi]t`E:A7)^CH*>6ނ!qh.A|Db"zʒw;̄"2cǗqPs 0w2+b 0a o4=x*4+u^cc~HDG`IDƍL%>~nz !-ˆPܚ9;:,lLȹ&WG}$4,-Q%(͋eUa)ScX߷❋G^͞/3m]tkekM돖သ HHe>B+M_gx[=xH̘d"ӒNS:Vk59MJ|yI TO{< ( . @q6}C@u}F!t{}q**0:OCB[wM$Є PQ<;s KHmtL Z 5-f`q$B&>0Ae=:Cjjcq3ͳA<4z?gF/E 'p&hh`SN{ yOߏTE,\zJU+HJ "BMo89\il645 >9 {ƮNvBo ۾ iV) nltpysWY-% c^j'gy7%4Ǘ !=QD栨ᘑ%qhO&PVcʠ{?< \a~(б*(O)4ѹ@$bJc"8vNb7K0sA<.Ayä5tk8q06`lAA %t Ah/$@J$ڧFnfkn]}l+GݎYUu^1rΜq \ <.kA,ycA6 UD* Um$!]W3RWl H\.4rxE,g@BA.t'8n>ر |A ]!#Y]M!*}ctym+ ں [kz u̦i٬ 彗qeymRhG5v$~q`pXKtmYGǎM Գ%rӟ@@s{nc6FFә  ׶=s,AQdдH0X׽{w$c޵ۗt^ 2v'C~ I*8mEz, AƭZmSsnp+ȹ#Xux EkuܫPBFBͲ O>DGxh݂t@#bt`{Cwkϫ]m .e@ԕw[<\m~i .qcX$g Іt0xR (A| 5$Vc\t<߰lMh9cv/ְ{7zcb DmxLkHlp9.| Idyzq\ /`:C59 N_ BrFk#'RM+A8=BǎCK䬶RT +UۿIjeղ%9BV%V儣qs.s:8D4/5eveGl aʅA7fZM7Lgjl3o zb-t 51$AJL\gA_cf5ٶ6n945:/gRS)mxn8TA8pSk%KsZz\5Ⴡm+\Ezܲ {PpJ`@F^ {&|[qvV'{?,D][-\qqx+pD;]{+q:;hD@U*UF%wдmR*\64h()5.>u5h$Bac%ҺVK#cKm P.CXb4hK5dM:ԻAzg/&9oFV)I!g[iłe2Uk}MdMD B̂U@*=(}$: 8kquSF+?Z_}_n;j{} c[m` G6iW݇=.Aϙwfe:﷾Id;6hp+Vib-<'}ke3m=*D:Yh Y@fU_Y2*p.-T-NkTEI6Dl;)^w+?6.Id$&@ rF2Tns|AZ8h=)fMFpdeEU g@H:mѻ7[H-p#ҟrL1ϝ X8.wBq4&c'Dn?zw@aˣ$'~ H*8M'j - %;*30@%xท.73W ܃FɀLsP@:?䊶}cn v=>B(B1qRBP,A{0l]w:;:9۵~m-Kun>C-ah.y N7w_aM9>Rn[P@YՇ6]o4ݢ9_ÛDΰF|1s egl [N[Ќ9ϗ8lۨ:3z)CWQXԩB4u0/ʝy$I1BC?x%WdgGЦx_6B?3۞(|3;})R_2 9]K7SIS!Nom޽ xjt OT[}D~O!k6.dg$1ʺ?P~mɥ4 q>ABHi N6 V`"8/qW00^Yb oB(>NgxB}Lh@:%l~ .]cq1v)aE۞9Sj{w{yP4v +6r:UЭ4Rd1N㼯K_vp.+F=czVB gE2~Gd h{Qq-4&/o.izx{< 2',?m^61Q%-%̩]b0FӺ(ruA,]>#T߾i ?XtL٣oY1hܸ V)J9ʃ1w{ ,`{vQ~wh͍mc-h5at/SS?Il:@@zG9 ʩu> {ɛ7@gB\|D5OZBVTΏp`Sew,h&~__ىW@AyF*Qv8cH+iH2e~GH/; &ȯ7?Տh񚜷-(T]8A!@FX҃/7_ dᖘ'j0`v ;s:A8^w~9ԇ|42WcH{n/^V>+1&L9q[y1N;W.םx7HeЙ@0BR s0LN;ı)XÉ- ȉe`$bi q&{1AHm( J,v֑&ֵhD>mP QBW j mph(9Z]tC k .gȏ\@ad*tNJ}I}{(2x_dh }ⶂ~/ ̐Lh2L? +"i8@0P:d2 d!B F1PXOZ7=)67`C="*y"KHH *upF=ZnbO= M%# 0H  0!0%12! *@ H** R R"HB Q!3*H$JI0U0U@DLETPRʂʪɈih(&J*6@ԠȃC72 b*6puh"tNE!@ @LT04{cQZƺu4\0Ȣ( F>BidžR9 A LP"PP*(yB0kF%yf}Ȑ( r!@B%wF &*=J %W5ۢ!ȉJzd850D ȁ"X"ZA S"db$&!Omv L)&-feR+Pb$bh(hnaڃr)j "a4XoϚa"bH ߷xBqhkttHL]ʦrcVȪ"dL8C k $7:P2 7j'bԚm#ג#S$aXH_B28W0 |7FlͲIZᢒ4K%Jd]8 nTSx7<٪# ";4'Eц QU %$u'V ^pVESuӆkmdPsRfj7f&UM17.!Qs>V]ltn.IEaG=k7`s)DߛdRWdD@h Ay2}wl0r -Rf(EUұ2L6 #޺=&`+ 3wkhwhJJu4ERQU6u[ኌRj@#;],2ZIi ?ؽEBwm+"wωji.QؠϏ5g;"- 7ҕ@N=J %;("JXZ !T%.9՘3[ T;I!b%D_ Tlۙ\&_qbL\mв2JK!5PH f\%#mn+aHT!6"-BA:L7DH79$|p (}BI *6-oB|DndaC 꺦,:p-˳I#*X}V~UIC\hHv68VIRqC1)@8O]OI>e9ӵfV}Bd#ͨH) Ad6Z|9(R<2ԝ_Ig.Ĩ?r~oʑdr"5)b"=?_gv4"_VN $B&Ly;;E` M-PQAEPQAEPQAEPQAI [/pBff ޕZQRz*$eyl6&Nt}@XG]<;z_@UDMc bq7DT:jF$hzA $"" իa_dwt!ǯZW ٧V-]w2`ܸǏ _TM&zjKr-㲮:uhHXm"mxw9D5YcbǠ " "!"HÓF6&K=:DL izzz:2zb"zb:Zv\(>%v;Dt+6o^eX؉ɯD jXr8 !*O_ zyI w +r :ĠY~gʏ umeF(䃲kyBՏed|Մ+9]ۨW'MW3q鶏V YvR&PґQ|[ 3_iB/UUUUUUUu:JW3<)Z@9%DI@%E?{R"UhPrYS@ѰqP.}ѹQbuz@zZ %@S0)b &ݜ#wJz+uARMB. ؄qh&V`P] 'xa $@8:lC읬GU, hiSd_vK *2gpbZJ`뤔KKTk=TtP]"]$ /PeG\50T&?/CM:V <_"!95$M*D134C"aIWxC9v;W)MzR^\W0J<^G8_E 9UQ1U^s%V E;pt`  Qi! R`Q z-AP%>jAES6 AQ5 P"!GS9Wh睧x͉ RG'& DDRD%E~+DBJ! g'yS+~scJ7%v}{pv b` !$ WFB>Y *HBJ* R+,4;0=i}wx}wF^K4"!d@кkt=e Zi>%+4XS\("iҬW a&g PXPAl0YO$A߬6A0%P!TLaDHD iP`&J9"4PiD)Ai>w=. P"Vp^qUƑa(e$zL_+{Nu/=G P?)rpA^۝Q3'&i@Ws,ʅ2P aS59 MS2Q r\/iG-ԣ Y04-^Gr]OY~cy瘖]rja7DjAq*w oB1zNSځ] V¨|L>UQtDٖtą*%4 ("H R% ИB#B4@Q2PR(i8)q0 I_&]##` G$\:I1@ueD0pS$L2iAlG&C0M\4( h  H/KOXἏ]sJ ,=,>ϡu__ﯲ44]#@m=W) pl;S wpwbrmk=QNVڃW\1 _C{ lp0fA(8 0ѬF XI]Fdl2A FµT@FPCBPK1  #4`JPfda" 6X Dy.(Ga Ob,b &HbY("t(/ZMЍUW6Hزr) hLՀPbHPES#I2R*j2d3XgsQq$\rZ7 A5X " 0qkpkm E̛OMf.8- ' 1Ɗ:Ų. |кG?ooG0L!T?WZy w%fXj 嶆ѠR >F>*'- bS*#NG hDwhVq)tBuXl$͒5e( m@7VNr4G(W3n >J2 h$KK-gak J$(a0-H7k=C%.ƓP# ` Qd*K}]Eh\n!iƍ!;躑ʁ Hxrnxźv!@.NJ`/Ζޒ5 +ro#E'dB)$N σRƥl]Qjj2eiCw1cL{q`oS2)&mB2MϬfYZ)BT)14h1ip,-eeGl9 OM(hyמtIO,VDC"kruQ]3Р!rP@%a `T%""TjQA)cőCsU fi9%D$@BV 4b(%@IzU M1W@) J(ah LAQ#tD֐ $ ` 6B THJA !|( ]B!Pa@BD1UXCaq(DYD .+' GP !@MA +pbI )saHă O; qS.%"k0 30 ( f@Pf!rI(2@p28"ҴjHJEވD(_bR-"@(̀vT $ @U JUYDRT!QaHQ$TJAiE$Pb "ah)i Bb&FI"B``$H(E2J"i U@) qA)T^"J )! JK(ݫ@H"T{ - G%Ԁxo0DC#_Gr>~ 7PC~9 ~V"{Wbo&@[ p"舑[`(^PT>RTQ=kx U ] y2PMT@f jPؓj'$"t_"K%K!Fh?;Z#:| Bx;&KstR$zF| ~YT#`ur,G%| cHpA8vCH'@%RJe$o $pmٴIs9%/o?| HUNiTGo yXOҏH :?)/񐅔p%kBl?o҃ʂG䰔 yj4zUnt}ip__I kHAO0|B= *ĔؗTAg\[NO}o~伷{Bo(z'Je>RA|g#CX٥ZYdB%z;ڒbVC ^ڢ%i儏M} s D }}yjT񝍒BTHH D?m$r@@DTQcn>)|yڒH?V"( *).H ! ",QAYJY!% e@@5"B!JR >|@@$A!$(Qi A VZA)ZFhHaJD QB%BIhJQZ)@"@hR Z@ %P@%Tp^*yeT;UQ AI/)$_aaBuxnKؗ ďJJ2[H,J\8,3/[,ζqAW.1#֥t# /jY!^ ֳbsƊ*!|bTܸ| gD鹚uff7w_IM}$$x7\M39]D~b5TSmtq]+hǀyT0$ >?oU}݅p_D 9=Ѹb;8׮y#j1/wD[?N=Aɞ tM4EM-(( Z)ih( d))h)L!X(ib(BXQM H$@ T P)Q"J*(e(i J**`iZ$ Ze@!A<|DGR;,* ~bh&XP%fdB bqD@!}"32,J%!!I!4ՆQLKPIM f !@D j HB IB@APRDAPPT H!`F$$ Fa@e!*`h)&!hPV%T@%@THB@*a)"*Qr RHA$= H&"I},crt}E'mtA>#(2ˮE,;pDY:$RX*@ ;,AG=P@?'[ص46uP#o| rKd z:G{w_!QKCJQ EH !AACCIIK@ 4f|%~OwQŹtNܻ8.˜<%IBb䟷]12羔<5cB2/6‰e%1},0v@b8hEÓ-1\G}޸l3'P$#M%vƩtPP獕uG'"zcB)]%-DzJ! !K< {-{Y"}EI U 'mo?-\fGAwhBi#_ !qth #k)ȵ_ ackL{&!l:V8 G^x?t oWwV!4pr|pQA yy(靆з 4l4wҒf ,QGO E@Q 4)Q%)J䂧QNI)U)1g! ;_HMD8$ؑDz((y }D}=֑ # /p$[א1H L%o_ъ Z7x)iif7ԻλkW< yU\\I\kyRpVԸmydڇ&VI#CfuZ,bZL9)H8Bܔ  $FC~2)8Wj7@u/0K saV|pNvU?Vqd p;&6eBӒI(g}ם9;W+r4 S_jzӗNp6#K2H^bC#ACq3|&#p1gq>cX :?iWGXPsypmmRBjR+ʣry# IRߠLP B)C(4BMRQ D2PBI(- "P!@P*H( !J!BPL{Ej )ZiEf BA{tZ֥HU8=DU~ *`"3B$HM4A }Ը@2 "HJQB؞uD#0H4 С 0 R$@-+BJ@4+$H**02#I "ҧm;B(H\f N̗)\$oS~RI~>_^@I&6߇ G~t}i:}JC]` zD?ljB2TC{C!͒I>#D2~{SRt]{G3?a1<ԏ]s`bs>WevG{~`|/YGNJGb o '!;B!(Tsʃ+/sOQ'm$Y]K;I K^4ܴ W)"d>@"BBCWv?&P`ʐ>v6h%a!ILP*&@|EvTCKj`V$: !Iz (‚ Ȋ f*ID!UeM( "$eM*""%P= TJ\AeBzo쳪2bhnUH`{(GLE~|E?G/Ћtq(Ck26 ͪ@9em1ʬ)h3Z#Xֹ_v{ lyz# *5q}c3|`'aB?:?U6>ctJ}7ԧP3!Nx z8>S 4pmЏv/~uY-tB$G`x0DwvK9>=Ead&kx/!Ti"@D@*p`]ZRE?ww45u}n:d17_p}yAB_sc ?IbV@zs~N_[]EεܔI3XlRM,)[Z>,{2?ޯP8Ž`Ϙ(~#&_=\%զGa._6@ ZZ7 >afO M;m"%BeQ‚8DӅAn%1҃$Ðir.nW@;OhQKsoG:ܡOwiԑhpDw= HtH2DhI1&.M5:w!YNИ(,J]~%8൉lGbx\7|1 ufRX,lTDYhYq\ʂ9%nQ{$fN}yh~`~x&:>Mkt(Lbs2 ZWH~DL0 LɅ~ &]|^0ƵκSoOB/0ӭt;GGk ^ђX^;P'oo.;*IVou>=gmPJ;O Y_Heͷ'Is}9N 7QX5URӳ)H7UXVto\usY6d=7no@򬷞}F;o} &@"'E%Bt$CڬJRq["($*ZNnր)SpdUKs/V' )*o2,z;jjV$f^dѮgKn)' ;!o2 xub|{Xrmr% zM_4BZ[n&9oƨ$wî!'xI'vH%\P"*zVO3ghOjE@8;ɂ4P(@O3¬]1;6db{JnXC(Ďq&]?,f,qy$bz0~ "L7'\NtDžʧ)w#q0}V8&V Pm6-fzt=mSZ<}2=sO6{@ D " Vp*?eA%\,brxe@AcBG^+~mYx2L//Andy&@4o)~i7}pj%O̦44%߬u?d`9iLwS6grVNWjMݧ$ -k,4<|Z%,IHQuW'HW{^P_RL !!$1Zp$晰 sR:j%q+lD7N2,_s&26r_ u+6<.G潗۰}9\4;7RBO^L ))sK٤[FqVݑCbw *Y>z/tW)l>|yDĠl(N>>HdOcab E N 0 lA_I@~ nM}>m<|]{{Q~-)!I2)gu C欔iɻd rga/ſ<}"Q/]unNS׫XZƵVBOn=+wdyO&D4&OE&kr#6fza}1 fh^*CӝmMFk[eZjbxr#l 陃p9\K!{4RL6?4d?0QY807KA17;2ҥwz&s#Ph4j yt-)&M8M ewaV[0?ӉUT͠w΀q)>M_Rau$V>F ~"z9$>dIeT9HH!v.`ڄD Ral4B]KV: +>tt3F':TQmUexi5fPmf E-eD+[~pn-kM0z3QʔoY~h¨-z߰~gGQ7 $R@|+9gYUUUU1+"QPID'D5@&!""$+P E. LcJsXboR,4Uo ( } qCJ$9(ꪪ 4;h6tƁm8~d#m[jCp ͳnupCxR,[BVA9L$';(&S 3|E44Ĝ^JbfUU`r0r$DIokBBBkU[`l pF%4a@ bS=Ge`r!L˔E@KIB Y.*A@R \3x31iLe!W(((Rıe)z4 XJ9F;!r{-'4o&AfE?a۟@73/4 鐜 z|_5!oë+h?HNtsF.Km^^pVXoTaGڦ9Ӈh|ݏ2Eu埀ANI31ɻΫ*r^릿bR@ ,j D<ʕ:[Fa"cB6@ ]nxl6g $g!yo o|jWy/`zsΘ;m~R烨WDfg ˀAEWrK-C!P˨H,'f*=a?*Էl& `;yV5Q7Jc2m^Y# gB4h0dD{T%|W#'7PVbmj(j 5'~@{nՓ`G TW;EI%8/eԶP^Ɖ@uAGHYYIȳxY,n/9_Jܾɋ5>!j[w[DΧt8!b7:]/Ve0j-١JFA |eR {ڏ5DA5\8➪V!ْ-.XqxMI1x`p'_LQ JO&_'Q'uq_v$bRRf9^i-ŒZ%Cn;EIޭj[(mO@Wp][$Ule#`CI5l%WL[rDt(Q'x4ܺVˇoRѤ{QЏT;(Vsn#eM).h!DiekAE~Ar/d'/}uK X5z FiO .]5ܖwW-v84@:]+9gH=JbW'.bENo4?F)}>Şņ&? sZ>&5uM_M$%4PpJ!LԜǧ (m}Skh]A'B6U-tWޒa|]/BHT+H)Kys"]1$@ LIG>BhQ]^+]Ko)鞢Y0@ipm&e`,o#WƕlTV{GVmAEQz l4ry% |Sss=vWp~=$|>ooGHrLm%AI(2 @@$B2@@J0HR R!ġ B AsaD QEDq, T(JUhQ vs(tveY/;{0D@#PGbZW,~DTIPF~k2𱏢!0MCn`m>eؘW;NZ_\~}cC|v4-O)W+Sj""C%A=maxkCz0g7NJF"@ʀD)!wtk\GySMx( 5l\Rolv<S5 @& L%~I[ o?PԞ"X@ILv3yg!JQ ^!N mo"1 CR,k|= Mua < W\xQ½رAʑ 3NEU'WlhVouXhSwɭo$<ܺ = Peo+啃-Z? 0=܄Hq:1u(m2+RM=rŹZ2# 1^aMQ">b+ɦxv%l(OhäXVB oqF6 t% N t[1xS [nzP@&8/sxF}w蚍h 8Oy_{|)S#vJJP &  @rr2r DIS%(+#-$QiI `B (28†b*LQJd *b A&b H5ʊ0Д% "9 D BRDP'dP*i" UtRx (Wreg}e|} sr\&uuv$f8V=g9xa(r=1LAP~EqhNxE=`l[j8l4̓#e2=Rj'w.<>lNUiv l,J* OCS"$(G: EdGfB;'*ռ)Rc&24Fq[&,?x$w0z,0斴.i$s2$ɭ*Ev,!Es,3ȷq1؈noǵ kN-ے/`t:6_:) <hhD R477< lduxPc&T!.kL|MJ|CDq3HaZ@B:0L"ZHKVr?eӁ P=C\"guAi bV.{ⷦ;ߋ_ڼ-Y1ot&/ TE5oo1oo'Y@$lCpkpp:lL $hBM:Y̋s!D`Sxl,V0shرܴLfNR|JqkqjBIng~] Ogytf^ka$9wpCdJ<~f\Ic| ޚa,S}}?3]1tˆ 6}"r܆SL.I(he6o\.0.h:ɦt}2v`rtTؠrSaDLB*&C`ƙ[>e&fZt[rAF^lO\w'{Pn%sUϜ))ÀPQ"n{ʻ1DOS3+AXʋ  .@ :BH H#?#߻C۲GkVD|"s@yBn(#Z,لA\L:w`܍-M"FJ ?աNe \I>FLAiq~ys6:'b>X<ӻpN9b\JF9cG\Pb$NhEo$Uly6B+* MY&e+x`Ü o t }ȋ#&2] VZ8-͑`q 7uGr42#XcX㒵@}{B1 G=D}Le%/zye@^~8  A~w1xwp خhi?+%7\PD ňWinzO|h4JzX^bAi 9Z&r` ʡWb8Lfmeکɨ<^_7U8 *CW;ls?P0 6݁d#e&&+l!M錎⽗Y x=uv-]l%!m.癰ce7kwcE 8QSVͬ(U&.B3%7C4N*Š 46.ß22rEą;c$y^,˝*J6l;RYϮS V9o6+zmP!(-Iy"q?X@(Væ?qI%HWpA=cEOqcB9 wHJ7 L(ˈ@7:_ӟـ3k]wl&RL@>RkqJ-zc0;D 6}q8 oFbȚ'e`:?5b/=yA2jgwȫ6{xxq~yYG_b3kdA,"R_x%`1ek  wtd!Bc_MDH?1|w3dzItF*=U,^18#-\ h'/)G^@*wCvf ́#Ahs0n4W"e,ȟ?#u}߃Ws3P}%kCjAإsMnU@C Tyr,.`gžۇɷSϼuMc*5>\bmgÒcBk9\Ye9oPmLG*PlH{Koז4wÎr!؉t{-JV/@X Ԃ C0l.?q"G`q"/)|eoxnjaC~7bgxw 3Ws}}: G:]:r_`HˆqhLLՓ$UƔO^YxU*a&5 =F+M?ЏEZ-O< O^Jk50$ե&6 jo8qIl##}`SH;kqdranعل"@Lnv1Y; _?^<쯈W!Ӕʈdn!۲!JXrLO'! Q*`J+qNxfyLi: {/FAEcë–$ڼWHjxlss5 BNIf?hna鼜M*W#ҔP9&=[k7ⰳ2܎_kz9)yL_0,.70!頖.cի04Q黛Yl/jN\*NkD{a_+u<(& RQ T)H^ث4uz eɦO,A֝vDk6:蕮8|gvuoӋ WX=rF~VqbH[|GCz[a딃 IGehת+|[1/"XJ햲S[ǟ/*Z2a7n [o>Q@ɽ=ip=?`F%NP#wñ"vKg13;'8 HMR_hz&:K V@ʣ70`Ƌ 85&v+$6P}MT dΦxs @S|K D!i0w6|o:*O B kW'bve;c/M%f\%60_'gn쯀<9w6]r(>Dlۦ{A|ʕ\qZ&UR@ثm`'=FAHI("":oTl%k-Sn1  9G6ιH=1}Ug¨%` Hj{rM:Byk:3qxܗAaR25kLYտkWձ]ˏN!G&YQ`e"id$<"I(Ɂ"I 9ّX,'5cQ+l&x3ndxKI\,PZcp8x%~{w^m+0FD4܋.^??M+c>!儆k¯dz݆%gj=Z`1udc#aE=qjo}7~c/= ʯ!̲1T F1 ]YA{IL I~7ݚfvlƉ(N=~ngG (q-ÛD|RlV_{W9 ?2WA)2nciEK(U۷hyA-5|ҜM`b:@\"#xIh5U #<UgMa\Emhἑ О γjYBi6X{b_Ow礊,C 0LO"z/Nr PsB`!O BbZ&0 pkb^Frf ʁK!0LoQҢ+U43(X6J~Fד+yXZ|œ:MPs] N;˟MN]>b[pW.cCHs])_A~< 6a @H'G8UPDn4Re[}R,Y~\93rTBLH/ LLfxHPAԠxˏ[R;O> }wukoP{:/|v Q5SG.rU0-/&S7ow#x?}xqMIf ά,x$my b*bs:VoV:"qp6hrRJ+y;_9AY"P1v=[? :RNSOam[?ⓣ+~?,/ˣ\J:C ǟ'~X#:eoYA݇ZAl{bLA-HH{VH(HKv/mqwI"#ʨ"{4rG>\5dwhSM')>}cdz oe=p{C䨈BI6R,QEB)HpCbaDBAvE *,,gNb䏢lq!R`D*ĪAEЌU~h  (" /}?u?FHz,'δ$FGt2 nW%njB0ˍZB&`8ϥ9x?ĴTS&D_6䥩bk^&U39Rod\ȕIX rh `aJ8E#r )DPbK8A׌C7"O(rbq[ [ J}m'm_Ѩwf߁{snssޖ }! #sT#'˄ Z $bĨ!.(x||_,10)}ʘK")c t ¢k\\ZSqr3{S\/3mm4Ld^ -c0m$RW32SR3 QqEJc|ڙ9|<+t'Oq'1:8%蓞M`a%ǴX}/,L9y3EJP]~reS2䩊v͋Ci4abCBXD9:FZ(Ҵry#!5#% i_x^4oxl)?=>&õw||x/2dIn%l7Tzӈ|Gê`Z,fNLvYaJ7$+Z(P-+Ro$.ǀ=WZF0fH<R0:NyzQeź6g4۩ 4\ f7|gh/g&g0)f4wFLB3vEŗ3ydh4\Q}cyZq+yI78綹3lf3CEbTJ%Wiè˪00``5s&,LLF"(ifM578iML, jj2̱vs6 kig3X{n)q5 eڜ6c K`٘7ʶ4%ʼm6ZZ-dK\t j椦$U)&(%FԈH_mXϚq'S6;g,2T^cÁa7Zy5>6R-IE=)(On Y!HLdzPe}7I83{D+䠠rdv(<ʓQ 6. RtW'ު.0uoI AUSW|) YPX8m`)c'C?޼ݑcə!L 4!'5Ļ_NC|lXa7Y#A\彼#ccMI#ɒ$~]c`i|oWΐ'|O%^W|Ԧ#9DQ B!_L$/W^u/ermWchOqP{D ܆˹Nŀb[":ܶʸwOk,_m8Y<~c\?%A*Z*p.'vbޚu9B'e>~0N"s 'h@Y.rauޱ-IڝڵaT9bPԔAf:Iz𾛁//NM U0w;O#7~V̆!'\hz3.pHj%5&.y؎|s z?vx7JkF "0\A>Yʨ3D փ+ɠp-بb!Ǫ\Z'"^Zmnv>%&eq?v6iu+RVH(3H|o8wL5H|0KgF{%t[Ws5MjfHDXyyeFT|sbdҧu"D-@Z DP Q". hXhQ0^z_k 46xĭ{_1ӣ A(w\jAKz!,uSS^?I5 *kFV6 )~[65oWG[5vKh_8)ye0 :E%c&iN:pkhVr[i&a5Gw+Ҵ'o{M4PP{_[TQq+g:Y("hgjyo,SsSWdT)L njFBw'oz.>W:lno<:jPz(ɡ)㾏S\H5 vhS ѰUyMhJPy,5JyFgFF#Ƒ` ""@ AU䳯Ϳ?vҬ]9Im'mC|i~Ab;e0/_pb٪BPL?(q?7{Z^VHt`O!3VLe4ؽP #7 ɻa`ݯXܼbl-L:|8KKD.@Z ?Mu?pu P`Yj^Ԯ S@߶"e(k\&6.U&3AOqUFbB΀Hy[OPxN]K[9Ѽ8K_-{ H;hotqJwGo]G ,5"3,!egY_`D", D4ub u2Es|>΂wcY;^MQj5.˗!<&> uN;p*.'w!)a.ۍi^;{FDW"S)w˜'v\~]؀DE$ *AlK7?np^6}Os-P8N\ @DDE 9䞍qteԉwd'kAF~ 3 9|f`y2PD ^ akskg{sa6Qآ\euVEUQmaeeaXYaYzkmMf[+6PQCe!ÇbZ251?OR)Ǜz䗯 RDU]xc7-Jt~g 3CMpc,vOMS7| 4B^D@40Wo`{(xm=h, hb/Av 6}' ߟ.֘=8&^OYU ,{ߋGwtd;[w@kߚYڣt?g2uZֹė.x{Vݵ::hFGE]]]kׂ\0{kXN]1jOZѐ6ACz:hS@X3 WU,f+$UiRUkq><5qJ V5=Ṯgq wFrgjQg=x3y(,~e"H[^w8(n|RytGDJ~:~%9$|3O9RВ{'rigV V!u X Vb&[CzoVhfNH]HFHHh +;w>(G4T2"@1F]اķ,2pǭ(PiPB%D>ͨc Nzp'_mūQ Ui>Vl=-pƂXBiqīk!k0 6+V6^A33{v%k)zb!L,JY"7CE";_[fxzǙ ѿFؖޠb?D>(D1lb%<A3uvۘJp"h2LH}K'Z PIg3Wt&#8ScUe4 ƥebna͂4ַ+=9_7Aഴ|T@}vӅi|CmC;IAk'Am9lAA}"?oDk98d ʰ¼[VlG(D'ڭ2ό2>e3{4Y&]D'~B7?@Ǥ`׽@0Nîbo]Ȭ!pV*{SX܉ػp]:cf4jݍu.䫭٘). @P18z1;3MiseqB 2P ahGl ]>e@.=DHIyԾsU\|dU|m1 &CYӃ>o,kZ٬H}WT/?[$p:M Hz18 S=ZtG7_cZmfAMkKF)JZLZJӢvķY* 6G_u-|-krH(hBBȍkbv'|?@.]xǛ.^f4>wO7m)YaKh \_hX$p:*!jHBY4#&wzA` Vp%!Es㫰[ҳKngmQiMmǏ y;袊*"(P (8Fi_ \`0C ~$j4fPlNj п`h5&IR[`-Q_ŔdhkԴ2}$ݥZ*ie]cEl]ahq=KlJ͉۠@njS2ZFey Fb X͘plߓ3sS؆#Ԟ̟J]b9h0` ѡP1Id $7G7*Th 0pP *ޮyCyHZ+'Õÿ@vЗRKuFd,iKJvR:9 ༹͊qhgNyۇ"qAm qǙUV1(w쿁֖#8C ]ÝՏ&['eʢ^s-BFi!rx$8'ˍuYN *niLV5o g1]^)W_:;9sgtu:=<(bbhGmx:F]^H| bQ[U8wO3ǝ:]#eoA?C<50ňp=VMij˯/хD>C緿|D /Ӣs/4szjMM9܊J X kdd?S|]jޜ&F(M' Mݖ[>\o0c0`ߌ?ê a)0//"ܗ1xD{U;ݯĀ9V%Jq1 οa}8xLF%I17[I~2|Pĵ\ Ԣgϋh=[ ܂kܭ!-R&@uyOSL'q }K敲H.?v4;SEu*nnBC.Ld4"4DmB'9A'xKQ,!}[1ouS{x&b3`DR" &:?QNn>kTL\͑REL A"0;\"yX!#vʀU;pS5xdlJ*, @c=r<P}O{֋PYl!p:=(6n>kcA@Ǡ2t\ay΋]s#RKW ae0( 2 YܾK&^Yu'`TGKh{kv͜ TJc /f&3g %(%喇byJh Qy&X~7)N(dΝӣQOi&oG*g+NSÁrb,:"TYsg2(t`(`|ERL3pyofbh"!;VSRm4ti%$CLj(N8q(f̙{)1( cb 4 yX1V0EyDξ9BTf(ݔPz;,2JEP<3긃BQf)3a|Ҡm-T.5p1 '$v{9_m +W ^eNnb{PP{-.je7$3 tIaKNhRA5'fUJTDY}$p^Z_㋤[nH TK#w܅2lYʶm)'qŹ>_[FR:cj~ؠ} ߠ_zXp FӉ*[M;))ӈP+ 1`1Nmo߲ ^HEyyGy]4"0ϡQIJCr!L\I_/J OќG5*%(s9>Cu_S$+Ӗ{. oC}qUK-e4b^H a7]g_IhD&0і{Op30du#A%P$J 2ƃ >c<7BT}^-|,.EfZZZRKȩ?>;Q CY)(h\I\6h`lն|9)P jwP3&6 XUN)AY)~}/6h$Kjl‚V]$=ƶ[^@ nk쪰C`āߩ>q`H H|R)H;'H 5f=IJ D8Hn9#n8mrOZ\Au[H${ox 5ؠzsQi*50oPxle]+Vɷp{G Ta[NoO[Z7_xpƄ>$#Y\OvO;a W9wӷ>QvnD}[[ f?~Le1THV6 e.>r}wxDl9oD*םU1TH\E iDg(`4;-'ThdC/k%t7;)_~c.3 ߛ,%!D#^^ AQ n^Q/ٓp ,gIĹmNhD[g|=q =NPR95۬Z=.Y} OI.ٕ,{0;vg#.\?F/z,)/FA1zM?{QF5ۻ3wC NQlzt&RX oBcEޛ< 6Ц-kiX_J̚}x(7e Ɔ`/#x2o:R@E$}7hQ\}eʥ:H 0D:v_jPF}OgbOS y2(kDTi$_fmDԲ=i1𵳆0^*R3_+.w`>Q1Xtth'l'ғ*GrEl4?wAc|3#; z?Z8jLQ:ͯp6c.3/- ▗e%^ 2l2EHa}{4P r)R%3#,]BB#xi:$X4zm-=6x`Q)?_ՖqsC> ٛ0Z"_涳:MVre+Ԋ8J(L’J]L݁ XǦ%Y۷$i39*v芽O[m9\/{JF`{mi Xڊ05h x4Ҷ/(]SY>ǽAVYA^a|;E>tIvxrUjF )* GKI15,_zNZ aS4k)vEzTtSF ͑eFd@1B'cQFD{VDORPLאjXp8&t8\kË)_~NTAPXnmLTqaǔyf*aW Ĝ]IUR{j׬kGl/[GYT%yq`Qx3KN\$z:?6YVŚ/MG*~hgТ(Jf`b\ N|jue=YbURfu_p݃9J5efQ{u@XJNz+UO9<ύ DtR`#}H?[*W|NP?͇XL|ow B%m!@ߵTJfvc1bO1oP]h5H.8ӏ"#wbr\meU'ԵV! ۦnڄLWI}*]r/ZE=ݱ%*|j*HO@vvA8"]g+Rϋ) veS2ZmXmԂPxto =s&O-'7UZ.~WhNg%9a+2Q?N?fL<ǐn}1"uD,*I^?zpݴfzfƠR`2'M]v$CTMjCN&j#]q]<ҹf{@b"/P7HmĄ0.9_ Gla7h.XԉXo o"α;eGT|"OO5MȔUpLͺp:ne=pQ CD(8$*öj@-G8SLe;јM]B6L.=nsAh^zDvܼXЎByh( _waFk(A!doz"G,u~zC`?}[JڈDB@RޡΪAxݩI䜢g/խ4*n 1,\x|rZ~3IVy$5>6ړLɏ6IF G#;\nnEvo-ށx84&_B{D=$i?HL+KnIn2)|hP#EIфZKU&9(gL; EqNx:5'1sG gw JI?n؂r;`.dɨ\O89%(D{'\w|IeT(zzP8ׄQ7Y|V p{d?Nzƍ1n{uC; I%"֎&uɨG@EKBL0IS?ĭ!,6Uyg3oV n zznʅ.a /P~D3W`hQ/sta"138 |YcC/M7{>Qj b+Jxbi7Q,(qɴ4:q͞87or۹&t" Ks;1.*ЦI2&`ǚa+Wx&T)c\ OI:%\2-hO[f0\ 4NY)YzߏWA~dfFTQv!,uН7[Cӷ$)€Q@ Q[O&q}Cvq旵qǺ(6Bz- -򈇙!~X4DEB_e) Ȳx+jcܖbN:f̡ԏʀpob&T ȶOA6]+K6K)k+I=SKd|ݛ#| !NY'x$~=>a}9^ɮю RK >@WΞoqv\m0R4"jU84Ŋ(kfgaȉX~  -h15*660 (6A]YiOaPe'!'!ݨH2׎gO;4U($ uMck`Q0@z =#G$ dP{+N*r~[*;E^]]*/ *Kfܳ#& &F ; ,_5 wmV;* oZH@i/J= mebeXҽi -ڹ0] 2mlF5Xɭky=j 1iҜy43[4v$bm6"i1+uDﺶ^V}@[ [uz,ak Y-2v$H(PEt69rs""_{xLVPb&lnߊ묦 m6cM" D$bqb0 eMBA 5XX/XTA#2 ڗzCG4%(M/ۧ~ 3Z(H ]1qGko!6o#M+c*@T8K d1rG$T3 )LQ6H~NB8mh"" MrCz5E#-/iAe'm D֔+4ic 4_t_B\i2ӽ5ݤ_ lj~u-Px$D-k  0eEz 5Uϕ5[RˎD P" P*d?+EiX 榩1n6 DCLX̕7z4LbhX: ^jer--!\F]/N*?͔#Y~l@>r㡼[u1\,ޓBG9bJ` +?9  , ^imNӻ:P?$LwW8ǧ&-\J092#iX0x䇚#!ߦ~ d=zڋ!E>۳& ,Q>n"C8ùpM~)O|?Q| /$uh# gj|~\`tZ^o:HӬ! E'T^>cB&Ev&  iV~ H$u4%P?hR!fBd!JD" oEz}D@;o%{H.o9rbӕ7V&4Ii6A;/ty Tf 7!`It莈QC-auU{QNT]JІ$;\![:'KˉFn)AJGXvn}((_D]N3J rƉAQ<]#z޾ߞSY0~1fxo3+*4p@ wIsTdVeJ IȈJT7t>)lyfJs- [ t3vw֕؇zcB;_<ׇ\nH奟JmzZgz5ß{p=D* S,&CՎsB!rdc~vWB/4doIl_Xg0?d-e՛Hd캮 P "A 5C>YrۊPEtHrQ4Ox+ *Q4kNJ<):/זFDAwT-I\ľSlm["Y`zG߃@[VC4ad͓n,IފͅHlW -*;}]po|=^Cp7\" ]ϲr~"4lygnh+ψ aNӰ4NPRRjRCOH\550XF^vr  1Ņy$m_9b 3ALd#Kd;b0`7 L"#9׌kmy Ww" 9Efa=WU9o\/i{AŬ3xœj'>m: ?ZjEbS a b|GyIJbKGzs*ܽ[_Sb7oXG@8"@J~ C%4\zo2^IZv")AU H-wş!dW຺ Nlezg q`\;Y폳~cw[}jC0=h[ HI|# uT& )eJe5=W؟ !n%tKZ<]7ad=_n.2uSI2GP-h?&[m0 .Q#0ҘrNWn#nv4\FE$Bԃz'X]0/ɞ9^$pX%Cw":]:|}/sd)z> l0n(@hSl-9nd)PLtς{tx?#IKy{O ]ņc^^dzc'.%۰[FH9s;ZΡVDa @>*~j f^%k=Ìi- 'Ѫ/BtcPk!T9Gsfu騟\,>2P1XC<]}Y^Bޞsvz1O{F66WA/7-MziQ֙ܯ[DJ6ܟ.(-|:'}usf3N[դ8Q)|{& ЗT<@iv;݉[;~uS{yM/&(0[l?IS$<}x?g> IQ FIJ(8߯q힋ow~$emzR11vR ?MsV>:qCLf1χCrwQЎ":ĽkB8tWh*af) c\0S RM0!b&pNf_)B+qC#6$ M|P_Em/unZ=:JR?܉vLUVE蘽U}ˤ%%"loC?sJ9 &zpnY#p7Cܫ(%—IH*;yte:}?>,NM‡l/J6ݰh=.G:xV!xu}3'Atu/=xu'_p4- C :GwQ7(,5;[Pg֘GVp?sܱުC">5~Bq?Jh>0K !{{5B^ &V#*e|X?מѼЎ8|X"@VhPWpHpk&E7 Flt9ۑ=^ XhM!ȒAWgp5&W!m)V>(y! %O "A(xR촟GV>۰Ʋ)z]0*ȏ@o2Pd9Oxӛ/|?[PE՞/`FBȻy |Cgw%s?k?(! mWv}՞ ~o`0vV65nH 9õ4yXtGz&߿Cz^ϿQzRDyAƬl@ ܁m7 U+nCGh܈! K@qҖn !څi{T8}H\d@%AAVr}462Wݿ,vvFs 7G9Pt)kq/@Geh:^%`s/ Lѵ~S6Ta^=^QaqLj]t̉6\]P5:ߘ!(E yt&|<na'i׀9\/vNNpWrln[eƨ9b*Q6=.oIO3+cok| mU/}]S"GU)iYﳾpd07$}H/@>`,M{p\Y,@xз(NIŷJHq}ino`/8=};hS8U ׫rgp%l>S)*-뙼`gźDuѲN_l1Ë:Qy]4hcP=ABC%Dut'KQ?d>)gh,P,5[D@(iãߜ;k bSD)oFڸϨcΐn', mW Zl<Gn2Owr춶sJ=rf>wR¥ ,wOT_ϭl !_yW6V?wtPR3^T=5^, ഊË؏P.OHﰖ~S-ϫl7hGv y]lՠg)W\TR&N ҌeLHlLe'ap}Q>޷w~}-׉Fn?)DdznM't<%vdz۶$cɣr.GGڗc!~ecx3!;8ݿ}|;9lU .Z'tK"P)I*$@4?3k4+W^"")DA)5kW̤Q2>:4J.,j`āwWN&I?Mj! EV1kRtrB]PE@ֺ`)v`Pp/Qxd9"w}}'<.pHs~ px]θU[ׇo{L!lɪC] ? Ცan˫ C ڱ-o^5Tքg%)amy1Aff 馄 krc3Ŋ,MRr8~CvS`W7"h;ڧϞZ!cғVb Ȯľ`B@fC6j=_UOwtiާWaJX(Hdd Ffwɳ'-dC۷knЗ#@6_E%)6HpivΞå&7𭢷RIS-b#U o⇁-RKnژ P>"[{d?${SJ_;1|9+N}\dn7V+sh1| ?D'Wm!O3ΌоT ç? &}YoQ*숳fHhP>\+&3f`xۼm2aQ̏V~ +Kigw(HQ_ ybp ]j/ {ɺ)aO.MaVܹ!V |@Y8}CJ ;ݛ7h~{,[}K¦ф"['P§nhi8ȳ-Mg$:t "ocKa 8_~ۧ3(;<aj=2UᰳI⶛5S_vn ?'m69[fC"i?I^T )nUrO&8BGM\k$rWh0{(NENrO,Y[zjH;%vNe!Z2yӭWkhN~RnypL[q^dp|䁓)0:@ކG?]o4 >yZh?sIex *`zwI@B"*b9 e}w|]Yd>~P5j*<\8+;y&cA3/_31#K;')GPv'c.Hqlr;1RAR|'q_VRop-n)3D  >ʣ̼=IVZN.K#""bv6mowC1WA]wLlvfuog˓aDy"MmЕozo?s$m/ NnXp%ɟ\0,q#Q.N]V=(%pS}&!=o! ;=ʿL;VfVS+"W5Yƛ޶݋])Iה?㺮C6rş)8nh5ag}kmǜ1H;Uzuk ץUwַNBb&]UuB֎dI=ݾ*Jۭƾ#QY~إfҔvM~.Mo꽿 [nW{p6MShW% @2۾l̾Z. !$!}gca{fBP ѮE[UQI9E,FVہGsa癯Rma;J&GOFjƽG3?m-& ֩v/:> ᱘u`Vv՚8 鯗m; 7rv (ۙTcNזȔ?6#xF@ _?M?%`<l2lUS7ia߾{eYCɷYOzpdl&|_rJ$7]*%]q<)9Ez )+&yN]׋-8{2AW#`-# ^TFlZu'=kutsL3"T]]Ac.FXEiu `yyBSQ364nܷE5wG<a)aS؉%v|No|1o5`]8c,G;iRTxL$sW&iC#"}g$su1Ά 9ُ<,$8 rf^-u1a}{\X [D}2ts57F5ƍ&%5>qPu##ϬilIyC^#g޻/; 44ZM0<]sG²,QkƂ WӗӞvz46=n|U3/-"ȤΤvnن^,3pމ]k䀃}lv/~43vCH6Wȗ/{~lrWiJGMZ y t➪XdX$Xhg㪺|ĥݗ 7$3AA{r&IH)H[2K(%Tqۏ⍡2a2I,Qcux_øHZvt4=+_&k!;LR.Ć:rK_ATϨ3Wʋ^![}lcLvOE 2Y$LbW&u\nSud>C :9h3u6AuLc^Iu|7C\|F?mjDiOx;A!׆5ƍ*~!7[V?f.!19F@jRD0_c`!7&/V6l)~cxf\ǔ=nUǂ0|2znFXy@LY">'ʉrJ4!PE7eٲ'׌ps17"+HFMN#e)/\_ fiSs4JkĜǛP&^V6Rho6p˴9?owif=NhGnN膞Hg<$ՌWnGz,@@s2C%0fl}s<O`͔HʉCCZG[bG=ha-#>UP&`輎JȳTA"Z6`߂ <|6Zdsg׻ :$O#DSH{0SXW8d̗>Poӯbgӏh@ܡ2wkgd?:Q@@g ri*.'YҡpHO% \{V0:+=8H jfcR`^<l% VB5k(*"?/w\:nݺ4 Z~'+N^k 9dv!5 .BzFN^8og'j5 /Y<ܿA6A*tݽ/η U dʈ(}0-HT ݱT)ѭP0"YWDWIJ NSSBě ?/LU/9K􏋵 g?'29)|c;zDOʻL?n>Cb@ j@B7g1Asuԡfh󩰗- 9ѡ%gr8."ci ܷ]r>^AW/TXq$\d'U>?|\U`S9)_Y_bV,C3˗b+XOhr&6DR=Xl\?Zn{mS(E s JBB|I,AxUۣ*j21;7RXdR1Bny]Hi!FEc\mꅵ?jv߁3׳~u3~\/qjyeϳ8 t3{vp{݄C7^-_ gP-鑱?+@quϋ|#eb! 92{ Vry\Fҗj w탕 *d57)a?x*5W׬ 9~C<V@6֯{LSbl7Z-_#"ȒY hwWN}-]Ks̓O.rVb3!Y*"K],nbx2A[dLCӀ'*lGDpH@&_8{_MeǾ?hH󴢓_%*OCk|}c~RS,]!~ 9p*@];LJ'0ȉwMUp(8J0< }X߷4qǿ3;ɏ an  ,t'~"1`:>W4>ٳ5O~0)>Aн9^O GL"PW:fgcB.OŴ] }tIZQts23(]I;p~ìҡḤ!: a/!UcX?XM5&\1.RC**O_lcR&Z2 K# pn#_~O"Sab,z. @yf&O^V4U缿Eu0i (gXJa]Pss QlZX.&L[' O.P|Vq?\0-o"K$sH1˽Tb:nFzשrA詾{:4KN:u| Lv*i0Xv9j&싼3o<|KEDMz.{(4A?G!KoO{Ρ_c=`tB,KF&u$Awe)0 Ɖ\9?>w2'o#B"!֏{GeQY֩BOq5w2D{B= =8A.wbO^+~91/Etp,_@L{Toɓ[h]\J0&JzC[gut0ca$f'"3fXzi;N% d+x^k 0F Iau[Gk:'"dsݡWpGvOv;"0)̦طZYuG*:ֲg;̈́@ө_*IS@%\ vb'8ßrvԘ ~1n'zxx&\}f)(DN+>DM5[1pJKw>>W0K:rjz.:C=-.g+l"|E#P#3ľϩ1^C9hE|])OC>{^opͩnJ&~ |Yy'ck& ǔ9-z#J\e6VJ)g2$ݿIyH^4Zw^lTC֘&Q´p`ɘc ٞ^|swhCmdKBې mmpu{g"#ƼȺ>3r5QYAD ^f7ZVѿ EYC6 i5zv <*;KۀS5;ӡvL*gh@ǓUy֪A֎?VBV/ 5AiFq6u A-!YRo| 䁋l(6=FLi ("$6a+Ӻg&SײckP֚ZڀX66Z 6'xo;MyvHA!(b6;_;zZ~6 ]sM>僔w7BC*hqTo|TQ(bsBP=8Y#JUc5} Ť߇amia5Rp.lw *=H@ ZP*p _71/݅WW@(E)0!P޳ET-WO2L/D܆ӭ_'?@WB @ց6ܔR@'"DDՑSwKjw|,vg3ZY%g'PENn?܈IY2fS&twApd9*(L`XY`XKQCK/]R(^r~?w>Ƒ&LP7[# M`T(Q6c:Ol^g9v ^MIpQ`ׯlob&Ydu\;H?MƳ&_7z\UærEBlwBɴD|sf(܁t_GXCd Fr|)D|_믮<O6L~aF5}K+c~pJŖF6Ҳ|/cǿMIN&fԩ[Lh7k 96 %_;<5mēܩ5# % IáNqVsS|D ; K{Ǩ]_%woa=1,*ks! Bxu_\$pP~";mkgETm;>I\mvMk9.o/g4G"Bx_}`z?իkX,Q2pі~ 70&2%P.P tj>J`mF,fH>SN5Ui3u xcn4UBhWɯ)(|r8!@I O)wmMZ+x;H @^6J((@n.wQטcIh@X2z(W:i3!{dxt!y$7(#20>\}eП杍; @zcKgVt)W;i ;BHÓ 'XYZ \sbk G;z+d5Bo^O*,J;zcpj>TeMLRQo@qhT"%KGe[1znH<L,@$j@/ Z/ϧA];=kvqk.;`?)uc3SHj:GEtdS ́DXBXfa{c"ty/"|M!|2k%*ixSN%U) '') ~D`d>ͭYS|,*9OIyEIְSsZ:-=)ְ 0d.y-9X$a?^=Ǿ bDLvPu\yeRׄ<=!q3B>s[mmJ ـӤ=t\QĒJ=m1`8 .v^^zS;n)]>ȬUXMv6АBwz R{m3!%"DRL7 VAvQ@.u8ڳ;qG\"ӝ5Ґ{\3MԲ+FSˈY@v7:j}A?0{@g桵,eGǴ{4ǿ;GP S ԄQӪ~6!u=gD2p[EH뢩{(uVy}QS7ke\xK啻s}R4ogeԋ"]}IG{e6Y ,oH_7OcbTjoW̉> p{bt{fgz1?1B:DNZ U%ss&hw쟳ƴdn '4zG e+/ݮ j9G 6JڥH@q#_ځ^2ܤD!܃_w"ho޾XD#Itatu&RagW$ Gy!# TIPb@ -&bZUdՙ_ڏX8fj ?!׿ >g dPYЭ*("+2fVfӌ5찀'!gfC!2^4%#߳yv;蘭f)mqP3> \P=)iv^|I;^(e>79Ͽrb u9 ,/:iLK30 ]ׄmxQ?&gM0tTJo8Qj{ %ui_n[OnR)B$<Έ1"/?E p l+/ !.zl>}#zͻu+,dzD:Tϓ`Tyn>ey1@-1WIEc5pVbqCkUU9#—^am{R^-Ytn:<6dD}Hxi3GcQG< ]B &6^En0(=[ou{nf¡)B(yQlG`mN}cħC g~%;,o"U_GzbA$Tj0[)'o-ڰH8-atdRaiRvH˦lﬨ EՈQM`Tv4AlB)bDD `uq(a3ۉJD[ z0+*S<ƺpNv%YЄ"uaRsx,_yFtNn/Y&@#+@@gF?CB&}Kʸl$ibfRAK5KA4jpH@S9`5"' N轳WHUv=o9/͑Y'M Bx-QgM;@sO%dBG U}ٔVqzY:EȒ,Epʲ'Z l m&g 0Ԧ2E11+֥8߯gi1r)߰ ˁC: ] c`DDڔ` Vmqgݗ6*ޞ,b٨h.MN7V"i˻1nl{1Atxh^7_tOHEF L\.ڦ$Ÿ@/m(DrD)j\N6Q!_!Uq{ߐ֡DH *D:rƏ9 |;'2=}/4la"-MA<=tj@94Jq&\QSjCۦK]ݚ0=#NL|Lr NFVM 3m\w'xh"//+!v?T]#u 'uYʰI %_6T{S? 쟞T< ;WUJW6f>)i%# 4f[Sw)[ǣ~MD[@ 㘴i")ZA -_>{>[o 9>=q-,_`ZC9S ן[;u5SmPxQƿ.cڧϊOHsLح1l 4 "؁B$H&ޠ[r.v_vǂCT|({ בI&| Srb #| RfF6.j%հG͉|?\gݓ3PP4`4@]Ӄ*a:_4W_[clY BaakB(QB%|__Œ>fk\"t[hMm,~t2#^Rwr*1uϙqOydc;SXMc#ޏ){LhpyhLsGab0|mfNr6!>ސ7ݮXsF_[P&bwm1yx?63S>ɮBo3$ .ۨhpݺkV2>p^6Nz"k~?T8/eNg0hg~Kf)Ȭ6؁+ ;i9QTS#퍃P_p 8:5~D[2;dWJǶ[ᒅBEm2L@7n5nW3701<=aܽhEW- f#E#ӯtcCӢ44H-,rnPyw}{R46Q.,hB|hSlbe ^æEI ̓{\ hB` %Pڌs] hv$! ɸtq(#Yf/иwV`H :m6mYȻh%_(;H#v %=Hq{*&4^NOeseH3l>b[wd  @{*GJWν =N&x6z>lv37UfV^r#VKf4l7ul`3FG}|-~G$JG@$;2er W.o5U﹃ Ԟ> !|* 8X6z4l~nc[{uK¶9px^a~#ޜ*yĴ]_mIaj9dd $珯vp|ju*@#K, ,)JQJ~Z˗)e,O^KXA #$}}:S3 Wpw'CyerR^@26 >qЌ,BJdqiR(&2=$.U\iga?i:96fHKRk)L*0alfBWPLߋ}fZQ}/aĚפ# SV;klmMcx@xtY I1paJe1C(MA0[Sp= nŀSL0wiKyx:nmC+}Ə 6&Rnr_̠!*ZB?xKbn ^lV][r ? d'Bamۇ-}S.rK@~ @7!s+ FL_pSwY@1Yn5Q0'7~n%aab;@Cs:EA'`s6}(BBLe4w]Ef>^5p\ T3ݬHSNdge~tO#'5 TKvg nZTjV_GPtr_>ů[e1A^g23Aa;U >O5[ v-@|緎ZG0P4v2!j~WNfd,Km&)O>]Zo**p0pWqܚKu]#VB(Q%0dx]<7D:6s!I/w{yoV%ԣsRDDB:[f#6$o|`S2 A2S1; ~bbc7\_g 6-V)MQY})xX&B]u0a JPfR2EI DRTDLur)Z]um 0xJl pDFaaTjRXZE ad<'A!:4&`b02EI, [ilKU6w@lˢKF;% c./-lĒRZcVҦfH T;eL 4T- )˜P m(0(h^_2- H2x`+ P@BB 3F2-@JW!#D>\$iiʰ,L …,%1""""1̉L"(>CΧ1+ FAn"(D7R0"i%%1M"XY["J¤-R)_O }-l))rXIѻ`= S+WW7+Һ"x?28ęǠd!DDDDDD-kDL ܱ6J0137.  JqJG:Mj}i7I(pÁVfA@9`@K^d(W4e$LsHct&$$cX/MRӐ$/z^zA,M(jf/NBbaNI 9\s4(c@Y r$\V>:Ȯ;nndAp Â@X)d͡n6_*Β]nA~# U$=8hZ&؈kL!&?V,/ibKm T4l+>w9 GG6iH ECd.$̞k(\Dyf33Ը)m܌J`%u-V Ú j/R4 (10oT6R*TfkM()JJHF\#;N k&<~ D1 gi&Cm՜g]rUMBT $%/ mpYP7F%Xb F68)$aRQ,5kkx_6*b&w1LLi430A3n,xvT BlI LhLJ˜p5rEU %10,HZw_(`3 8hbV692b!)4pP(PiPHq"i47pH&IInI4(I""X5r14:"x]]LNx m:Nq pb 8'5YX`HU1bN׊SvXj&nlk<ܕc(4e! 7JҦR9y ?h ׉,\Gܹ;p3}(ziysDž: Kc} 0`a>ˎ 3:oޠ1RE\S"*JmםDfmhi@[/*5Yv!U+p&{bL㣑oy0%Z `x-N $$ONR"}N{+QۦwYoTBκDҫ 6R,6' N}@T@:.;y_{E$@;7(uY{Updywee4rY2d+e4)5WD@p_vl}vw4˶:ݻ:S0;SK/i1q|ѝWTO2 8Ebq6T$Ą.kWmŁicWٓ,d1F*y._$??`>_lYsl@Y>zqF)J@궰ZEY|'8c'bmXk1zs=/=lbQpcG,Tb'N_ppGi$}ϵ$59;RCt>|Kt:],Z /nwn ^iVR"SU3;(NT\")Sg}8Yqz+pu+[Nƙ Yi-S~lfu_iϜwQѤD[g_Pdb gؔ,t=&8 nHv\ԆE<Azۻs84BRGU|K57fOޯ61i`#ʞAUT0KU C8)Ip?{84CZm{|xz?3՞#J!p `o#I,GÜBNzD l-uWbdIil ѝӍ8Ů\.[ !N1ԁ¸Ff8:@jwZi7s/k !*O7 ekv4D^ժ̺ uxYZ?jBVu] ',E`>;=3G-#,ֲykӦx"JM18#5OQD|`mʃ@6v7:_B&DD+Y}$#E)C`}Ѿ,G/+ ߩ8kGdgt|7Yi5x<` B sZ{v5G_bqCYr]{:GMBBk#hR")AcTGRH'TW[8H4z |4:~٪(X)E$4r~FxL ~Dv86,ӓ#fBӅDLQ1!SkQ8%[4t\4ԕ(>S'm;~{SP$tYj!RG;7`&B&D̝7W @%"\Ę:<bcR˨NTh&SfM1ZD7Lm ?pLAO]1$V mݗU WB@LmĢq)2ǶnO@ %$hFY%R>Ӏ\WΤHfD Z0?YM("mWd C*|STMc8W3}F}!fl_ICBI3$33AJ GIH<ӽ NBi!IPsDr^ sD>g7qm$mN㋆Z7hID-* Ael-y4CD 3 oteFBycE6mb*UBZH 3AsK(<% O@3@8dfB|yؤ|7u|;c BNb>/mZ'躃Ft+4,jЕqCqp$oAWQ<V m2lppTqͯɴLinw=ybQ@s>ͧe](V^QOZBs/ov")rԃwc!=?'8܇-Cfh\)¼IJT(7+qk -mF*wc^c '@jY^JVXEpiR@ck b%xP ԒLlF;@gsu*ruU77`CGuӡQ _9ډ4aӭKi@S~O /Nz5Dbp E@ CQ6ktFxܿȣ_VEai L{CWۧenn!}4u:$/ü=w|]%^y WǥπV mZ_Z ˦T0 U!W ۫`,hHw$B*gPJ;'> H':/SوRį\@R1cbZ#PNT ƳZˋKKP%!R*! W0&r{1CM! ږ!hVUG(Sm (D@$ BT!d T8ł!+m BCqxT$?ʐӑD-I3){l̊+uTITP#<.4p 9n9<\Q`_G1B{+{= I&␯&4;O+ ~3dOr6+gFcp K;}ɋF˞F$дs=T^1َ3`&Edwpoj`8YUV4XYR'N:!Q/Y()N:oi'N}>Q_wJ@50@Rg| 'dA ' n Y}~8}L* E?vxoE ܄PM{r9*w^*hr*BN.33LIjIR曜3[`O͎n܂R{!O⃋N-'b||##8Q@yĽD/1"ZL'q :V75 ppd_Ɨ@H@#zNYvEKWGJ M<*xzws?; әJu,FErĬLc}Z4S !hdCh|D~?_wѨ?.<*[0Sasș˃NX/S lm}2}ᵴhY'7NH< pӾE \*{`^A=Wɏ?NuY)bR$Qd|<3ӃD=1A*B,:f-@U 5g:LY!RU_/F\z=$_DA}n#z||DUe[Y`Y<:~?Hѹ!9ŸXBll9gNo y]~q#5\<60z:ToQMK /IRUJaGF!#?]%;:SGZ| )k,6z nc"%bHEpCKbBmmMW6~)>D.3I^Ёw#bHm".*jA;DMsn~?kk fޑHN(JDX2d@IdIt=N!KI#i<)e,McCYЉ>-7YHc$k'.5 I|Uj(#+0"#nD1Y@ am`EU۠?KeTFITUR%DplmopDS3)2 w;JPm[3@ḙֈ 7Y,)tk8$j$)$/ߗY[% O(w}d97eS|yv虩no2 o9\qtO0͹%a]b"*Q1̜*1BdM&LB$1|x ؍7{.R?{ނc:d{Ov)lH^ЈO$ #qʶx=bw.~&.CU1 l_ {iS^tPMl~3耐{}tA<2N$(B$]B Ց".uBۮLoOa*?P!lOO+瞩 YOHuC pϥXi=H|jbW6q~H .JlJKwe_gg{9>{ݏŸ@B%d}÷kwOOj/9|FxlߥiӻA0jex4vB1-H4|DƝ:v~v›zeѲY#u69sg(BŒBNXxZ5*kaGe%qB! ˏr~|z@@xH`.QT=ƿ_M΋ xᵬ<%򇵟[/c翊 `+clnZF>´wwCn$ڣJ\'0;cdsVs.:.|dع7$]/U&"u}5>{@9iۏ4zv DZwO=H">KehT" O=ɿ;kewO%:m[{Y J3^g{Ęlb.$&z RbwZí 8N_Y~7y)@@E!iUDѕ"?hC̼~oN`?">p􊇔)0RP!B1)"LCB$s}8h%Z q= ┞B 1zYB(PGGX:z"XD-m! `Q k+.IN م"iXS[0|ؐn$ w/A+$f%ecaU;Y d|cEp8wA^W-SnHMx݅L|+5xzaJUJ=Tpq1,▗{U0K-#y0@ x \M!!#$T+ h4E GG p66qS}3!h Zts,F:wyjY2J7J ,axPYa,.j&n,$ez??P䇠VuN"Fڎ AS2o^*3XnS g˝O\ԯt0)۪ݳ4ZMf.0ZWՈS mb}KhA]b9'?k+ٽ{iNÙG<ھ 1ŃV&ĤvaDK,BdD`^z_nI deK$Gx\1xXjb"5{wuUjמ 4?ưf@jwsHe%#-B""@(U9d6MtatڅEHWdM%jC 22wuQT1$hDNFI:D1mEN)z'2eSR0)Aj%p,Rn Z:OOH*t"YJRHMo,kVY,1[;rLwAVS& L:evUQ9*w> |p<YŚmgz&8?dfg=>=d`Q8FA}R(JhRF˨o;.Ő: $Y1w5ch8Q)4&3km* Dmlm"H@HBA/aԇ%}!dFbH*`L(gTwG,$5)/Ym_'c)+7PIU~2ќx Cn!kER>t SKa#X݀2.-3[WĝFBOYeP<ê*^/'@Lb''HeAy|28 t%yv"` 1$Z0NLjыP 8,+P&p|RϤ[*RW{/:*2J (ō HTAUh(1KAجAm_0h0F;Mq 0"W6I}) 3vdpm 5EҳONn7|4$ 7(/jh9x*׫uCh-ɪ⾩Uu?|ޠ$OgWJhxuP[<7xc>Cu OsGGpđdđ fU+Rd\@.`IT)?'x_UU#F%Z!-?{g3b?3i*S9W%jfFS!R"?o;e6sE\&D HB:p9!|Dpw ) HCČL0^K_0ɍVRT LkQrcجH\-N*C:HL Y A'RIj8šeCe"4Zx3z \]Sp0|hJi#˄n_oidoZe)JJ"Y$.~:CH uHȐ@ B2  *IEH%t pL\|E!($$}fs<k,h@/} |pDPQu3nѢA7ZNϞ_)zDfGh_?[c}:HML;b;AjdxYQlC/h^}ic6'S1,/z?Kf2iG†0GW>LEOpuGƴif<"[ZK4л- " %y~2TLNe Cv .C3zsXg9h7lWyPyLnQ`(k"=3T<`/ܦbOӫʹ) FZ,fT8>"|m;ZˢFH :!;!c͒B4UCk;2_3h D|F)#4B=꧲jjСP"IC޻lc-"&9Ky=LUñe'ǜGM_AD+ EqB|PXf*YIQ1"7Q!I2(#. ˤef y)FüLCz8ѕ)e4jnNn(@7gta}jy&7|Q}tI@r1FF &*BҒ 0+-*y\UWr^s(J}|&8PAI n} £?=xB*K-$jDIcHaS9"&ug8)Z}|jI j+@"&YQn~8`^qI 2{^ެ"bC:rE\BQL &Xtu3घ#\41HWI*`RsDR;;&Ǖ7 =đ۪C HHaH a0ڻ,Xpџ1.Xq|榖XF&[T(66T %oUUUUUUUUH\;j"j=ҿa9;FX<ݪ܅gcN76aϒ%~ɦ7z~*B d8T*BA((cI $RTDxE% 8_KbJ TL ZOT rN+LUJiS4ABk[@Aګ@M!%EIwNWš9Oth r@ԀL꬙'p;+_U"mk'CQ߱kN\+:RLV_/9C(Cawax^Tp4EH{w>`D Ɋ^A6|ܒ 5FpKlcOFG?nOxa9TD"B)`H1(XC+``F& DD3"` ؘo}*5B_F0.aAz[9hP(.zt±w6f@ %fjB<{u[*7__ љA;t)7T' ?zQ(MWa"$&Yzsi6#=?O$X?=Tb y~ǤN 0Mu$C1aD~Rict'p!6Icd'`!7& zA'0dGCA g"Vb`6V5քjK)< C0`DCB]8̮f"$`D`X}y, Ѩ߁$ȑY,H\;(= ?y[AtXى$[i7q\XS]!-a;;Mnzi+h]YjԂM_/ź7~#!汑tޚsrd "o,}c֭KZpuV 63'O_O_kv}6VcPχW|+s(k?n } *Yez! Wco6z/[:oFrTW87BS"}x~v H L-!22B0@**R ?ooS:qSx`mcULMVeL;L0T`T4HG2A:0qc3FCt(nR]& PI^QRLnusˊH^ռK0 eEZ^쐹HTlE|T(o˾1**`s>x#/^l|gHrbL1mu`̺aˉF4+onC'B.2; ].&k,=g7@w-;D0j-}AHz1kk36? iQ,w%mR4)FQF]H ju#Fc*jj*9erB"< (h(A 1Ⱎ"BrlG_NP<>t:B"5xCZDDNSǣA;;BVL:@Df3AH8yiѱ٥ As3MӀG. i;l[eomjq};<\V;!E%IU4ID1yCnD7|ƍK#;9ÐDQ%PWO O'meG!$> q v^*Ð^kǍ`i߮உ^Gx+N@}a$(B2*2ρ!fbJV{UiӘm@tvzqv~5p%3f;đCQί*1j&kB\Y_"둰W_gfc ٭D`+r41.G&-)_]|:Q'.ϷПdcHR  s}}:@``fҫkYKăuUh"( &S) EIf PYKZ \͵g2ܜCb;!ҶM-vm *#(@X V2jXZXb%KF6cz#XN/C-l*ӈamER0b<60$XpHIHEdXIRQbŔ0,^PXzlk6%94Y B98UJHIˬy>C|Im ̴-M fBYQ .pPM ȼA | 2D" ľQ,~VIڵ,N)I͚"1 *v^2AGt!Y#h ];"݈$L4 R9MƻSV#}?P˖}J,Ny狣?Q <_0 mQ?"ra` ):*<΃!Uꏇ=WFIBD6U!i?M BaVk@S PHV @\ j(;?ןoEe% 픸&#E{/Q$ժЇfFAvh0p;=9n{uF( _l(gr B$ %@`TShvPa3yI0:yz̯cnu+~}9E$ͅ#r ݘXSVabMD(>F)]bN3OiyÂx@ p%W* "ȌDZ5a$ց8TAY)$lT#͋gT^x""e*@0Dkk铗IlQ5.54ƀe$з&P@&JdIcpf 9Й&uKRJT֋ l:CB'[# (yBU e.fZom) kj֘24Ok/};ai_ τDZQ)k`qB J;gK Wѱg}B6I09Fe_'`a 6i>X.gu*>d;uhf|dńd M {UP @M1ARPAH "*VNJ'iDPUB[}rչ#R- )AۺRyW$;Gb ;\Dv .b[Msf?̙LLɥS{esmx_'%x]o+I7(VbԳeS??z^3S) {XԬdOň>^"$Y?Cm띉&Tc HT$ LLLn^(r{=T5&$ g iUW^ (Y:d0"7Y-$kT`o~Iu6"jj?Vgxc8NLۋ_SbYq :gkh1ʨoefvscmpI츟@X '?;~G8(n]&iXܻ[)üyp5[k]PpC J:UP?Gt uFRgG1qCvzZI?IUVWȑd_(IEmE.BH 9p`HT-M6`.\E#8}\ /=,>Ц!!CJ?[wxPQ#6Bcpŕle_?lK GypOU'SǓ!Z+ni%8Ruq=KƖkT-GH7ɵOje.m b}/(Ol2P9!@la FfVhq';%Azo#ʾ`*(! `,RhIwʱڤǾPs4d˂ű{7 D|)gq^׷XĀΔӯw"']2].p a}3͌Ϸ"DtVlm{EAH< JG`Ja)~2d]+T]> A+{TT4c>ׁoubbw~"'}F7]&ɰGa ӌ*A!OD PtqJw#ƻJk%`\; 4E=e.Ģ]x9SC)RtB_ @;HDkjAQGg%зdIaHm#̔iFc&w3qH?3|F8NEPjbP[A9%Y["GDHdg5a]suy@ZTtq"#ˣDLGU] 4 Կɡ@ "`\Āތ+LTȗ2.K\*c&z4J.?ό G#8tzWN(D={D^GG}|=B ^ #hZ!Ag'dޠ>L lOOV^[^ᄐ̀ ϗd7m{qH'{6c붭 ?x.TYOQ~s)+pOM}Z%tI1$ԙ'$=K9d)aD>W8X[`f- &R"ejG:f* ];=UHDO^_UJQ J+o;5cxfUEsns]T܅^)4cz]M,?'--L<9fW|oZ37*@l*(flyҘP֧xhmy2Rb*sv;|AJk)`=.U71"aHjYfrȥi ӡ~9 VI֤tpیl||9d`&&}21Ǭaϻ|Et "nBN1v)GT(_ܳٺW@Er ri%KrxF)H _YʚWh lPT_4G߸^@B܌$HxLIj<{Ή+ѕSҾ5si ܽp  -i_ xp]_{'5LujYwKQ}*,I]4̖~'PR,P_͏y Mf<9L'e$Γb 3]*ճ} ;Rw'ԉ[@]5n~[%;Sm#98ۏ55 nP <$6;'-ɐ49m]XE-'>/^CWϜw uقr Zr >uxI;| /NaS׏boDN{nyڠ;$K%mq^ Uk_9[Q@ mBANPB0/>us6}QU%R /< ~w ]מ1Wt~b04ܴA_*[Zv]F:F[՘N< GJiNᷘ, '#b(o9ѥz0 @뗡 >];Gzn܌Dlsr*'P;7UWK-(v6{ qekPenqʸ->n7)suzh" 4o':wwE<mV&}QPQ$@v A <>Um6u}l7wgsB9H# CMCW)hRA<!KE_ڠ]gR*co?Og{QŊ^ÞdhhsЍnՊ~$QQwq;n7V Me\y0㏇`غל&LևO} ĺK6F ڒ oQ\ I;Suc&ݩ26CyrgPmդh[j@iQmV-'Vs]p(2kY~ͨ<\aFuAYbfxpF _5B@.cgsqsش?ݭyMvfQL2+S.\Ow)o^ .?^3ڛ_AR=ti*M@MP&*4̊~'.ZXX~&b5^'qrz-[ =$h#W7pʤFf&AMy KT!كx^Ӝ>ĪG =~&ԓr|6 [VWwݻ Gn_JU6Wvཪ}/,DI}1ӪBWF$4.Lv GBvTMV-D?O,-)@ Z[jNkwso +H@@XF6m׮=$0u$}z١tm+ >=EEHi7pBM]"G:>Z:+l_!Ρ0nywmz֙#g%R2r樲߷bu%|τ|Mu6b~e묈Eogx.B]}w*Zu]=Y&R߿ ߕ~8fO6b^C?/媖y_4=L$7e^gOةiXb˥`U]NN.W{KtHTӦkoyV1yש < %dd0d2/Ei¸^96Q"s+]n4/$u-X\I9t[u^,ߡb8U:~8C (ǰCv+*' <3k  )LkT`$;ks|u{u}BR(4s[ΊqoT{(*,],,`:u :9]u؂l'\iv%G DiQѱ9`DwC-hVwȣ3kB׶Kp6^8}pحαP<}o(Dw *w]"<#~ $~~]6Riqʄ#PqxPvfVߨ2 jMΣsm*K5RnT[ CN鏿^q\QĊ߭|]0hZggl|8,xc" J<:8X #1% WH*$T479,=(l?"zEt,B"sg{APe_y/m|A$1U{!OuzpXf8͂F`7ѱ=~8pMKC8;ƬZYH%,eBR-jt GJJg~!xL 0ĵwX`wO As~!Wn }3\q#eT=V<Z_cQ}(l MDP #;ebjxkW'8}xqVE"=XMa v3`էΨ%ou{̸O(Z.܎o@VϢLdIBi&E V[--큠 g1a7^Z~GUD?W zn6\ x%4Q> V Za.m2@޸3j;`XNpq7^4@AeS4l{pC6 8pŨARq9a]USeo0լC _X83Wy7uy&GSQ@jaR -}rԘ$P&5VJi 頲тVW1=pG!~LDEkS<$!a!.-IXQ~.} 5jXKDÊZZh rj=¦¦ 6Z iRR@\w0Q]e!YPH}OR׬3b3 kпt9_]k]#:j*R^UTg_u{;Ay kO޵לXDu󹺀us<(dH8"5$ԢHggE>R>c谟g| w\;**0ZI*KH}ڋ ʢE7#FZJ :j㴘̢.Sj~\db+@7|?ͤvzfkc n?הnuckrv2zRKmJ$lԶr-pTE$MfAgZ \{xPz4ؕ&r[؛`P=4+r\SexҰ5sVX g1i;  (Bij 6n ڧ>ĥMeσQ ᪪: ?= :"KԘA\ZK#sH \_\c^uk|.ScBj?sA$|j63m6|! MJ =cQ@a7<`>_'}.':|)#k=7^ӖrAB.Jobl2[}5 cM]3@$nx[qF̹sU^C7F+},C18j ziB-',$=g=Äػ\*\ިX?+CNi Zz4UN;At{$NY)ͺ1I|sQwsوPL$<)KӅF G7)14̣PM^7 ?v7j"8!O;YaXK?nIta{@Ɣ)@<Z[ۣ?ĻOd&Ai%e.H=cGZyy{H{{Nj2w9/ϚRLOD^ "+'t=w}1Ґbt c[~aT=3=~B.>O;bøEU&㉲oyeoCO.r$":oݨE:(qH^popZBPf;)~\'$9eI3ƴ8;T~|scO>FdoAp6 6hl"E?ޓ)#O"JEoݙL)RK@߻Vuv:[9ȾUS L.nRwK8Lοee\=S.o$0J-: x +o")nX倥*'QJ;2 ]i|HrwX.iU%n^H=kzu2Wl%6AUߣQ)dS5A,{C<߯I1dn䌶|Ekb~ Ou/CwQ-LZ=~o7(LNDѓ[}pTnQDNj|\$ﹸy.$NdŒ49 en }d(|<Ҙϋ{i qXdi)}͓w! xoD+>(PDk:.r) 'TyXOXr,اobSnXQ@Gq4!.O/)$ŃCPRGrE@`]CLe0rf0@kzY3.}DmtV77j0[-wb׿yC3q/onÑV*~ygQA2FH\/C©nTO1'~qx}':)"k'&{hĭعtt0%䒥G@3Ho>OCƿK.^3 J!x3MLyvOnIC Ӹhʯ2/'3Xɜ"WcX~L&Dtlzˆ z۪\M`e?~ oPgR×̺pVR@&ėޏ` El|kR(%V?^A1TA6 ^(,whoqje t4 T 죋.$\ΎJș\ k]<Ɋl_=&3<śg$=HLu(m϶a.5 T.ΥaHf2p"t+bh/(1uc%%9ZJvگ)omx*>RsYF +TjjlNJ)4]:޳!:[}l3JtiUӻV>\" wLnqQG汊7>^_z,9kNϋsU1oЖ<?ZYODH|)WlAT{h<#=+)]vrfX2ڹS(EOC $Rc=(ja^W8}#">|bF\A=Uo ~Vqn.v4rL & !~a*~2ݡ<\T̬$R%dYfn}~sWLwBdRF\x;_(=xk=HcwR2å۫NMk71-8Q ca׉ +F,质wm_Y&\jAfJt2[Αeljlin'@ⅳ){v*j:%U(̬WX~SPB-1;p:-近 !(N^P<^rW-Qj؜toxq>120}GכO@w,QYPHV޼Tx/S]?i߄&tsLQ Y+PDRwbn_MAZ*gTZY!}(Aʸz*ÏvoyHo[Sjr7Q/ { w6ڋ˿0N8(}6/2eu2U.ŽCe}yР#BB@)J4hА1 )IV7v=Iw2d~ H,-|n TZo'Zդn␅q3PG.bI2Hsqؒ%$ǨPC jz"'&boXE^%27~]V{.O["[VƧGd+"ARGuzbXyd pg|Xo,n|m^#6] me.G>(v @/xdLݶoO\~>EꥧsDR{z(V 0+`F@4 <~$y2Y{!G<@~6uJqE\Ynhv~0Կxѹ)CV(rnh@~sQF 0O΅Cc0!RqFtB̨SPvh4۬S?(38 #Vڌt9@Y;[eT7ѥy9Skh s~q50`?劆jϫSyc\fY(w}exuQ< -]-4@݀O"jh|<ǒc$a3xU˂ZCtLtC>< rDҙ|~Ag~:ǑJH'OM=m|I/ <\m Qs. Ϩ= s&w|B=1GL%}*6nJn2AB^q˛#f݀t5B&:C`/Я|;ڿzǭUG!yh**c{tt"gbhCSU\#UH>χr?bsoY\`[$ù)R]:3b1+ygvT O ‹<~%jJr'ԡ$E)Ónڣ7On߱a_rY.͡b,"WE7F.,7'c86^X^7hVx1NDtٛ83Ԉ\+$}j"*Q)c#o_i3y1ocpCs9zq $#-IϘl1a^^X7ۂK9w~>F@Zhσy"pz%#"0 v sXw0W-@v'I,K t^Z*|⎚N@7zTEF]uν QavľA+.rSy6jlDav7A N#|² $z Ȃ P^Wdqj\Sl#4h4mCwϡ[فrȪw(x'"w9QwP$-Z\%,èRqcM덛KW67> &TɪN:s?^b=\o.ȽXf]q3T 5zA`kivKLKe&6TQq27hDtA:5o52ߘ8ff!0WB*^S%'>:hjZЬr EZ~ID]=>H gɰ,<mC{S jY+G8cSv :)y$'=}ufPotڔ &rI;ѣEbpR U2^l:M}r8](}v]i.9= ]fa V:484eDm}t?` *ōU4@^+Ŗzي-YrƊLGשׂkne>)}5~` #ajќmjp<7Gz3T&7au_Ʌ]|DEw$K܄L hNz((a{uOwe櫼hNoV,gޡwY@)Q r_9psa[+Ho+}r{͸/8})A0u.569i!՞Eg/N@D!<|y;>?k]݃~~OSūe94} j[/{\Hֻ{'m2=~ʽ0^oJts{J0cwM47ܭ_nˊI^m&W)j췑̦;j_7k^?gS"`(-=qU/Lw*{?s[z<)fBKasOW5ЃCPE f)Z3[~VC0 {)J_OBaǰ ROﻙs$ʣ.2/K]Tlk^mY T9z-Sr{9>MV1_| lC\+QQt+)h`VYra#߽FV 3y? %̈ p:D>`aMǵz&oo,)"id~n^DE:>Oy ? RWB!-KWlKgFb x:^3c6now;=$!LL.DvP:+\xsT|sD<:ej7_vJEx1B"X]vzi6jӐRcS#K UF (pN͕TcP K:'6RQx3xe歶XSڭt>Sʴ'S ҖsX+ QT_@t8Cϭ9›F£|cQ!˕M6S(H^~yqe;7-Êkڂo)InQo=,[{L<#R4CiaOJmw/~hcJ&2Es?D ̿ s]ʼlɉm]cwWKR\4T `w;r} xe算MӱXa0ؽɡgO2 =#"38A1;ʤ],?]}D.jd7lP*=A[gU=Jq^Q4ػ,swD8NG#RB K w xC-HⅪ#Jm-%G1߁) vƿc98I ٸ[bv=U\gV4sWܾ cL@QT idD2۪CM],1q?:+ & zc?.d/0oqK=_J3ZVq: ?p\/hK'kSL[g@_ZJZ1U=P.}A.ޛM!|mӵ$xT +bd}_۬J z!s!v3QU$D3ua8`ۗFX&laB+OP"w o8.@]KI@W :P2ܓPvl@:S M,};9ڂ&c56/A nytmBK`HcCy[>RjO"@{Xt r^:On>naAxfȄRzsyMO|:_aC85S6(ASvߏbbea.kN:W,W_{vҳQWljUƃtBzBȀc@h!g&#x6g\oG= ]\ǟkٞ\%>̍4wl lkP#tK ~?=8vĎIs/o_wJ7,YPRik+]xXOi}coֽձJDXc 1Hnm"qCǾayx#QJ%7vq%PrRym\kZeԬ z6cn02\& o$!qnD *w$S/^o8\^LNqH ;iFi=ֺ,,EBOL.wMb#tw_bOylM?JWd{aw=jPL;])_)e6$^I5 u+X`jōOo$ª#VE^Vd,_Qxt6@“eR(oјp܂Ddb;t]xLc6 /IR ~ҍ ֏$u++~7;r_-ŋDy: VAKʔmRq5k_Ney`༫ՠ$6t21ck=1qr#$( M/^*cї+&EfiZ9R |lR$t0Xqܕ5%^\+Ld|z/Tsdjz$bKnn$3Tk11G; wD_:J)Ilw=KȼJ}Zo,] .,8d$޶3Lm8l |,.:SzWLfHcX0- e!"oc6 xM*^])0 v!+',jKSGT m'Гs֤^OS=I@3H./|Q+x(OF)U#޹.bц\cB9#N|PdX.njGe`Ꝼc(I@%SkyXTEV¢xE /v4LZH2twomj@.}lq &f=~&#CA9 2W4n7Kg7 j+~r s F> ,602@Y'?>N[`A\Lz#mJ]vJp'+]YAo"`5'Ȝae+JjQ 0C&3݋v1Q )cU 63F.@F6O]K&pGl~EA $9a_T$Og@--GC6lFU:YD9=+o=Ё$e~^7wŖQVDنg N}mPhX~!`!0w74dgJԕC;!׸;+kuƒM Ovz=?UNe-5~$ ht32Àa\D@M-3F`-Q*{vk 6=tJ{of Ľ$$.8|&(iz!sDI/OG\T6RT22ɇSae%bt֯s Tsn 4qA 0f:R&*o; qz;J 82XC=z}m,V A[l^f8,ƙ@ ${ֿߔ{ XfvqD?!rևɩ˽u]z Sbڪ JXCi@)]ʭ3-Ӧ~281Fw揦eqeeP#>pr; UN^; 92.D B F2+۞)hqrNl ͜pLHyc-އ <{J}QGEP!`&$w0PR.37Cs#v!Zk{GjvZhD(RZ t?fu`5njn> X#9mջӭN,voޔunQm֦̜Lvt5V4ŋ,eCVr|V5\-Z׽@MdHmYLk{K6͜#K\ApY Hl䗛j.: ) WG(+2 | f5ZPFV6 NuEjx>#DhIZ.h;YjcP I^D%xGke[Hl={bv<> 5(A`sݍ.8v} _.q7}8W1YD1])*'"Mۑ%V8oo@t90ZD"fO}~k)z+oXס(,:$#{`Z8nY&"N$IpE#^ߛ]DAGmIc,uzn (گϧgcZz<@sǐ΂zWI$IQy,;.IZU9TOT6U"PS/-5.O^Bp'xdР9 Ӌ7*[f}|cjڣ KKv W%{Ba KE6׫vjV`""j{v;rwSμB/,Y6t/ >7Ҭh4*KbL/vgjH4Gv!'{Adz6tٷd\4\g=ٰ`mNk&|gm>ǸgA 0==y7=#?S2n.>qa^'` N7(4r Q`ҿ ŏ#Wc0z4A^zMő$DbD efMiq%T.ncHY;"+R 't8;dLoOɶC=( 9oH@/v W'zEHLy$ρv:D9= V়&Zdܬ.II' @'}R/=ڰ釒hCno>̐#C]/7;J*JBk3kgxTןzpcW۠*mu3Lg[DQ/HϾuks0ff[~e#m)=,J7Hu:XMqY"D>n6n⣾_?UuIqRmC;uėԀPW5T*,oBl>Bnm 3(I LJB E%3nj4QqPNW m ?Ccȉ1|HHaPHO=-,m7Ke2QreJ ? -.C]uwշ14Bnf|'5OWYăǕ}^qy@}蘭驻FbVdT{F8<.Ǧx\?X %`YpNJ,Ԍ_'uJ9QlDY@r{ j*  Wݭ%I  F- jĐo?@ ۑ '">Pv)ɶ#fz FUMl^^@suc[%VܿOak<&zz~hk3}097~* &B)/2Pin.dDѮ(FCǹU(P咀faة@pc:,ND>',譣SN !愃+~8b th ZaȞ-; &48z4$-w]ʣiS T!gBR7*fO(J#Z A&Gzn`wFH }c |vB WGF|` }M&+헦%CPk=adLROKe\ P7!Q9.?vu#}57O'# z]裖͹AH/DC'_*L==Ip*'`^K_0#JzYL-K2 @CA3yj~Z L\ X=]{ZPX$ 6O24?elvȐaœJq.=Bڬ+/I|ԓ=U O\}ryQUl肴+ۿ"j %Q{HP, ySZBo9DKŭ-oA+Ha4eAX:UlC @ԝpN@'*jš6=F2_?a`2x@3rZ?kUz6Ci}\+ 7{y[LH"舁[/Ǔۂi>M PdL@T*/iv"CuvZxrV`vN :.Cߘ[seeAZK5+&Ċ&QĖG惛GG,j<[ B6(#LK7DkenR4 (Ɯq\p4v,ÞSw{dsd67 ~Pъ0!2[ZϠB#q9$"[~ KGğ|UXuUm^A iKR [TZy%&J~ Pce_b3ٺ +34++PWr?VIZeYjpƇ\ r&G5w ҉ߊ,Jnú^&ϻAoS?0".u0&{p@xs '4mIzʃ-: V@9 .F:ӧZòXoxdUN!ܱ$YlbգE> |G-@~_ veUp9cIe+UkO*d?)xRLR?7F:q"-u+3|ER" d  9l'a9oJ$ax;t:nT)7ʿ,c̈Cf7ڬ^ xS7u&թ` jŚđd_̘AB)=aMvĈ^/!K:bn':Ku_¼F`$ ~ꈨ`~f礴?Cgo}%Oٿ~;noVTgInWQdذOUtm|b0Lj[#Ot̫ Rz&}!JHxd00K| B11)y],^ E  ; "q/<n}}sb)GWZN64aW2ۈ4P'|Ya$?>0+ϻ1%, -o?O7F#@ywwi8, {.ͫH 3d >X<&7.F)7l _.  7Dآ8z>I~̩\QU8po9Gƣ53FzBbkPt>J!wkTB)e#Ϛ~^!ABs9£_ɖs,&Fc %UՇzkwy&=c:~ku5o@&J n8j-]܍'$"|Pjo5Q9 #utdʇ@W~>-h0IfWF) &"qZj\+u-3DJ6R#I98$YK:47YTmI}nN=΂M0jPhOn'6\DKܗ͗:ۺ٫:_Ϛ+ow0 VEm3m+AѤ?XX%_yi(F/W?*50+I.m{ܓ_jx{S4_hS$AAݨ-e#*Q h =d[^lAr·#H|݇zU76ktRi*bI;s!;]9uhw99uo o n|kuN?t,l/Lwl.c,mu6X2:,).HØbk "+ŗGONMH)PBwb8 Ňe"/'w2ɨqpq Gϋ K<[o+DMeR@lFfua'dyy(CmMUhu [UPǟ~h&T2>|,N/Nw//jGek=ͨ`"0fǝ6gBTI!j7maU;KQnUgFu(oYdߎv/ )Jhy9stEU&<ߏm c(UTob,MWVlrbBft'ğVYxDoc ,l)tMڃW\R{R8QQj4Lt켿~d7r s)Av Fh~wNPwrȣ1r@Q OSO憭arF\ n3q^r 9W=o;CVZ+πqgM(v=I%">4#:ABSdnle؊ A1M\gpKJ ^@ZWJta ]~d cBBɹDtݦ^5Mut)<-A?nv-CB`Np=J!x> @ !C'{Ւu'_yO3Pb-bZ6ƭ~|KRT="Vv3k6AҪzg(C&֔-0kz{}'(ǠG8"r" w_QZ FYDs₨*Cr>܃[{!_ GI0v"z۽? ҹG3y6%;1/Sr+RBfS tEA. fp2fΕpV4u΍RV`4 4 6˔1LAERel)e)Ɍ,6bdGggjAV!f*v ֮gex8jo눠p] O+<@eVc%c:BVݓ}Uv#zfiTQ?4BaY;a:J ##:b r+",+7/gsH/L1៷r滯8L5XzF~]s]}X#"h0ֲı !m,/ 8c☰s*E%r 9nͼdW°kz}LWEts8yf&@OoU\''Oݍ_x۠t:k =yt,x ︢{Tʌ[ma*ѠF)| ~apc+ GkPE42 f&$x\zW r(>lELZQtClqH0fP 1,&x/bU 84L=Di?ccs|ԃǼE*XJ3}Ek $ƙ]VIhTqfR@^t(nM;`YnH-!iv-O;wtoCX JwrSJeaNV;S,u |Q0_󮯞 +yU $LflC iI[a{w hEgS<&2wЯv3VK˅J }dȈ]T|l_}7-熳.?h-#qbtGE)J^"v}6JvЅ0 9fC`w|hy oj!]1 eYGj 6kӘx"VTG( +{ ?~a+[?7̱*pYQ2 66)z݁2qMIc׀!*FkS!=lp6H! _6'GkqI}jm~x"U)b,X.-9!b0zQ{!N'Ú 9Wy­&9[%ҕ;I CrU%*i7o<"N? aiAsxbJ7c.,yj#)J$'mN0x?NKXܬgA]W>UP Ep`?6r4ncF{/n&X.dHEN4Bv4̇Gc "1pczr@0yP8Hbj+_GM{UD7\:T=1gN9h/l(38JYgme1| ӈœͳTowm7ohI k03÷t|(ۂ8?|۩qwy tNOɎ+ͣUbWS@XsN|9HzLoGVAA;(^?!k4*T+F<jZӑ5*€5\m;i;\jNo~-0P4HUKš( p?FYyĔ}A(x/ѭ,A4P5>m6EH S`*tW{Zg $ GCps=ϓn1}Ҕ_‚ls/{vνSZ\M !Kܦ⇐Uz9 3qxr 5$u5`g:˒"y_Ri8/N`00GF4vC2ˠdcK珎Hy`:Kjc 0WQO&.-pz-BEwDwTyuY_M?1"9ab{p, Uf5b{").+wl'|wbΖ3 CB*_'U0e{lm#>=YB<2KLo&8VK`?)# RQw]HALkE7x{69llQ]c`&$_Smu(4XC.FdH%h9ߓ sR"~\;=U~^ :?adŸ"'rT4u~/+79)KyĀT_ hހG'tboɬiCxY?þ'Q-~ARub܄!gj2_0\a =AR$@=*;= WC@$r/:xu~ zQVxG@Ud.×{*&NtW,|iR[6;q)Bߘ㗮0dY'Pf@lA!m{J68ڡx9h~m< dB^U c]}HVR7%T<~](W}h&+Gt#9ԗ9.'&c^Hx),ħ# ŀ Jx^_#=?`#㈊J-m$uBŠxY욻x]"+S Q0b! ŠҐI3NVh) >` QIa5btjTUǥieiwHߣ<=~aJ[`Tz\1b> LCz(z3#eE&B,bz3&M5=qM5:1-d1l@囓>-P)CjCq3qpAM('%:5\ailA?e]DbI-(V3Íatxv?wY2M:&x!$fmo(̀x ;@ S-7CN[ |pU9 MXt YtXV9zC6cWΓX@xȼz_1@] ]VEs`j#ä:'*TߕHd"G>-8(MYs~pTjSwB -<*+UGBiF@, 2GrhAh'pj>WA,3/J wydJ yk{/K&>e}٨] *-ȋ2(B G{Z3h<ӆĖZɆ:u 5 )~NzŻsv9g ? G&-ExfW{G7/7@tjwEpW)Db.GkUc'Yq=zw)c 5[*Mf,-өMzĔa@K(܉`#賦:Op#EhdЧȧ]L ~3!Sxv\4)ԻסGB ^͐ O]o9@07[_E-b9lҀ̂': )]h{[G(9G\ؿ+ Yu3AqxgYax0s*J18ICnzr6< ?AA:`Pסkv '*iX'L.=Qx<0ѾH:Ȭ{9c`u8;{ں.T3<1ws-UU(wzNXs)EY)*9J0JHG׀ݕ$༆Q\cPB=(,"\]Ǫg-\/hS־Uwӭn;GG,uJQf`#HҚ.X*F;F$D#][ b(Z< u Y-4]%pUOv~ҬdY9X(,'+_EI2ca:f#r47A cǢ rmD`l%r0iϽTfKчƨξEC#%9hSgsɤiI #Y>@[ 6{ xBJ ѱAb ~⃀&aaR):"k]~Ip9}7*2wc"^@H[7Ԛ &q~QJ }D@I78߳ڕgWacܠ|h:x# n 87Íژs}bTs)Г%Iّek_6ˌjlrg۾Lf6J|#F+^½o^f>/ם %v)evB` '3!O'vL;Ŀo 4u7ogR3נwVku~ 1kGXܗG .cv#ӏi+ITtd]&>#K#[!mTwX}gP;N3yC߳(7~ DbZ5}'F| x{ݷ^нl_` .FP`&(">iE*,Q~H5̈́wjasZ]4ђZmSd{p g<+TBNc'׽Rp`#AԃR  s?݊>w|sq|ͫ1u'{^wpzokGi 5L#;l׾&xbxNi>{ڼX~X5Q$ `NJ!l,}hT;F6JMϐ|4Ƽ_|\' r,hȿPf_7[vo<f Az&uprPR |ͽ3n|e՗=lgN'ŝ%o5o{#c@:\%l/O\Ǻye{W+ۼs$H5gcn[QMث:rkίk4m'.[塔7~|yWI*:U YC\9^0m9F"mapȥlѫ98e$v=+Q-ڱx\=pvmc#[X=աܝ(xhiZIJ}[-~orN[|nY^q◍* @hW7 W5xƯ?;w 7DQ<IeX)B`$m=xG( ~<'iG='cm6f_<ФPcW7?j.;;wcX22ٌh;wˏzhs@ $_r.|_V.fL д%GYB߷L0. ~ fIXJ+= ŠKt#UWPb%3q7gvG3]=rž UA7s@^sJ\iƶDȶV `RGYpYԖHˆX U-a-|S9~W,f%eWR1هWaLlզsiUx4HyfAe7C` 5`?L/3eST 4浊'qmFDp/}M# )0F5KB(Mͱk]q|w _h莒b"TfmuVLt5a-MSu dT~ABcm4Qx&HG8#n:$KUl,9'}IEM_AEe,XY&Px2A]FyswɶiS-WiT?\۔`~9}7r< ?yK(x_GfgT/^х7ďշI&Z瞋¸.Pw'1f[bX(3 #xɀ`֔,Z1;;$B.#IσF'.߾(BQVLOk6JYWhOo&_ *5pɩ$֡_J`-Hr) K!I?v@zxi,0cljntm&fW}[U{7Knc23;Vp9UʱŘDy޼-}FYYt {TɃcL׷, ( pg\ K?F-{\M`നzc܃:(қ\&[:H~p v܆NXghehHj{J/,wV+m`ga[|D`~P9EON^'F /LԘ]/7B|ۡVէ z?@f)I{;b+*vh?jj%`.vOO[o|jv8׆AIl7M$$xD0Yi4b"C5r+ ƤE.2Krfj^~sD;#D\bufwvFpS'>m<_^u8A1lB'V?J_iI"0M-ȣ NmIteIP)&b\>dgcVyT#=(9 , 㼛Y2IRd6)։ ERzu8%XZ+^FU,۫ mWy\ޢ35?0jbi@T'],7YOAh׿p#$!H䡲){B&G8369="U&̣`+n(m4$#;>4sG{y ~ eE Eu~}-ܫq!8t{62ݴ!|-:ET*Ek#HUԄr3*$GwYHZ[+ieJ-%.8>#^]RvySW꒳ؼ=KܔWA̘K9lϠЂN lO~ Uc٥~RCeZF&sε}ЗˢOAQYWDC,6  B 0kjr(%8Qod}CbIL;S[|v[5UL+mZA0t26,`@HٔလS1ŰT:[~bE]^*RMRؙBtD3wոG^FKH3n-(VD`^Ujt |ߖUq!>CUoČiպ"HB"dvH0MH)nڙ0;j҃BXFuJt. kQZXl+ _1ryZ3D|@jB;\lA[H{/37rڐgFB ?MrՒhPf-WEªS[ItxٗDUM'Ԋ?Q1u0$5K]ʻaN[P=]7.9eD@n \b%`TDXDf˥IJ\ŏ %op]GOhs-&Ӳ|ZA$,`-$}M1$4@|J2yF=Ǐ,;BK=Z Rt5~?oX[H&"FujZǑOl7KLSv2<%agw(L{ U nv[Lc`8 X;HغhIX%iW-2@o+BKC9<PJziZiO~MY P(DZi4l醏H9Q5o j':$E\svͱ`~8c"r&| S-o"y^X_a~Iѯ\"_M!Wvg%QK h-AN=^ ?Ot-1d1|ϩޅb+({M^XUG0+@wɚ&zGLs*Fq+"!:[<I6-HgkM̔2K Wa%˭x v;Z/wa$ T/RaQ,8MsFlrw~U<껜nE[z!?989b,1הKzඓRE(4t ? ֶ5f.9|2&sZ@XڌH&9!9\*/հW >=;=s qO+M)~kP@ -SY@V r떃G*h2$%l>% }Cv ^͘">f_gTL`|K0cQr -S\1)( q#91O-& xe[RH-L w9@}E(@{l;ZZ|Œ#^ɬ/@;}%|:t0OM=ä`j 3]' @AMDM8 ^nNNq18y斁#)nSQ~sg+@*JL R@R&.TT=mHQVb9G{ I0h@*.=h:ƽ!e@\! RMx~B|4+ :N*]?^O'EpEC 8+^mٙS(RcKܮ};Նv d();X/1lKcY48:# Zŕ2>/A iO} v–D Ic>eʼn(V" xܵNFQn_&xbQAQC+Mo] ZhYVI?ǧgϦU}rmmq 4eAE"هaY 0HH9t{32 bi>쁈LhN9iKwIW7+UO)e'k~G#јG6w9 8τ @ztj59'{gܺC2nw?kzYsR*tgOkDž/!3"4AWTailV1h,q;T_+v`PZ 9ܽ[0mh;N^,`> _4vK{SjY6 1 2ü4ӸPwwAo :\2nV_AOl:Nn6>|A™< ߉KA7+ɔ 6u6N#c =-?gp I:%u s"*;Dڇ.5:{hVEZ_vY1Y~{i&5TgO*nU][7TRYu˷LGyV/6NFTK+}O~EOXJ\ng}$#V֬mЗ/w^},TlJsƝc׀T\ak¶ֈ e>9mIգ6'W4c"Ȭw ˪){jk" L@<\ Ɓ\Dg.ˊs>Pl6$grpeE V_-g.ߋ>z.jSXjc v+/&zh'@yyXC_ Oټ<5u\ku\cleV?~կC8x W3@ܵxPSW#$\pc۬WC;{)!;8W? (_퍣 IY,HbВւ#/q>VIgb?:Sֿ̚\gl864Ԭ]_dqka?Wī,W%jNwEK~߃o$w4Q9'%22o 6<~: '\vl0x$@L7,y"X^T⿇(dJŝeQ5tǵJdaRd,7}D[I[(Y˃ z=.=U׉%6t@n۸zqQ͕L fJ&ꁕoa*5^ gYs+mq7G'"juL*k} |I-eֆ{v]ݭ*=ks#>uƓEmO|Z0dĠtg5=lg |Jv_G"^Fk1D^JЛ|-s>Z[=?k*bV2\: q|[kѣ:?jZښp}7q^_W^OTbfOV<̭KLz& ..gNqsvӐѶH/ iƱF~l˱w 2_p>KcQmSf 59_-gQ2( /O&?" [VNh^Ù>4?gW -jT֐aw~H0嵯i(f0   {@BGQ.q]@Yx"pCbR6[\ Ye[0b& cE_H, ;D@pZDN8uUzռcVKRM׮:ϒ{>k꫷mp vIqJ|(ȯSd5n.G+nb (A)3cMּ8(9L9ߴ.?%'pH-,^/w>K}l$3yǖ?1FhboYϢKdHiIDh+^x`G=e]e%'ETyGH;NFJO>ӂǍ/ \%Eu(hH?^/zΰW JF$תjI"v՛2 ,]gn W8JP3e`v|8nNW2Z!=E~PW (a߀*C1MӀFOt1UqAx rHGxN쭉\0EJ<\hO[$媀:YoU5-jBn)%b;,1}܉oö޶t"ct3aUEm&ʝBɧvYEsO=/A6˰x&VU'h(&9)~%? s`5#CIk2LW<}1R"G˜ӞBެ̧%B <ߚs3YU"j& Qf:+8S-aA Tzr^ţn*d&`N޽"ddzB!K~i{mq)O{U.Z3RpT"2ah2Y>B¿a240jŒ9õӀ~gEuI88c5)BEzlG5<!腊b\{4{Ų#U+2"TingzƴO|^3gygJ8'W`<X.l(Tn&V&[+7([L;ޱ.q}ə$lif}vu;k?¥*~l O~\orUN㴘tbw> sεw!_ej+@kT[J3#"R_}ZDx<ʃV7~6֝nqo|33S[pIs|w»*N _)94UBhY7#~BsR v-ޤj;r]Nyx[s%グ 쓌$e?E\wmneQ8OtGK֭{:+`RF WwDXiE7Q,x, 78VV w3V >՜\-scՒlIqή3'-,3,YG7SWTKGhc2vD)zE ?JS % "& x@K_jѬ&O<6ON/pU]/ JY<PIb"aJ4V-nզu:4 V#  F@с&K5E=]-!ľؒz˾NsE`ԓM~^ bE" "REX&!Ę6Kf^"Sfһ.hL!MԲȟ)B#u~;O1y# Ȱ~WI$Fܞ1i=}/8H89CRx6!VrGۀHgw;LQҺG۳6 p+]IGۏ(j󫹉E.pQE.dh/nRx"FtwǂEzi [V:#|ZS%`C <]X;~>ff"kBoݢs]yvB> X"") !-=R*fRA ?jj7A/V>' ~CW 4ي,Cxc_&bݕ@$dLpᓞ(ӟlћza%l>Z73JFC9~i8 eI]g 4̣uf C3?PZQ*Ot*SeN2]׭jh0Кpp z)Iy6 [YlIa[@Ah*+%ʑR>ӷ̣QމaXD:#Y"HDJ_%b'N6dgp})_TvKC,p<8Y ~س*ТFkƇ٭-ͩ eaF- Yjk~=qv&g∿bR1Ii0D7ڄUI}ri t> ꏴX-Y^>FR&`V%K ie%pn8#duЫ2 P _18ㅓA4 9aPgD! D^Bg jxoі pe\r!(R,Ҝ'nFt<埧3Hk`qtF .xJX u;:b PDSlJ}(QwQv oZ(ffy5༪g7ǐ|ϏYMҡB7mʧ2ZxXωÑR3@3wJ/0(u|+f:I;[$ jl*|DmrglP`}Ejb󤻹MȣJV 2㦔 6 tV>FgP̈́d+hf!"ZRIM!~|B΢.&ovN~'Vks̿myG&QߤXҺ\K¸fk7 KE%9ɸnMETiT9OZMPRmiz*H.߬kZ\|H7DA+&3όY=SbnV^^6hQ+Fw6ƆƣYX^<1Rs@/Ϫp[?*Kӣʡeе锨pBFVJ/J~}8;1|Б;yQQuy ]Ggʤw"Kex7 A b)&p y^}@/Dm#qϨrG{59MR Z5(Q1 !b6:/4cq`F||*PjM^>ʂ ~D.J@Bw!wBVaDX)C}zҷKY䮮#qD.Ek^DxtDU-t6dT_Tm]kH _}Pywk.V3Q;Ks`_3ZP: Q"kjef^|7n~+%[Raק ċh QbkM$.""c6^VFӖѵo0߆&w29,()>1|Utچ +u?'TtfbM?dUyCp{xO&D9VUVOoT:?b֑GgcOX,:늄3j5cawO"fN^k%՛UW>:6b`Ѳ,rbG+)Y4w,v= 'R#˹_8A?YÁz!t6*M'xA ⍵z.tc\m`$\lDy"!_p%N%"{̠\{<|.!_ce7E*wEÄ6+3ҷ9W?yXv56$L d$y+:Av?ݒYܗ"k|KmQăvJaԬ;wN{P}p[% VuT\0VޏMlŋ1NϜ"!9"x\d;9[ˠKBym$Z1G7`/u${ԥ4ͩxﴹY|kUAn}}|)JTq鳭A"tM$n}%Y U%}>:GLpӜ]MV^ِ8ZcӢU)\NehX,z4g(7NQ`ylbZo+ibl͖GU #f?u}#yl{Mݭ֖5r2 RT3ѲzPK\ʨ ^u0td9/b-w vfLV|TbL=ERF`Bj[\f]~D\Γ+gȮi LH߯MɱDC, P>yZSDqQ˶ #{ۇSN6 e]+*S`Cs_jk~:F+-)1jcVdk48zK0Xl+Wα5v3/MBsԖ$7nLD{Ya쬂D!]ÃY9=!'>,V@( M.\bB4h;I۪ZTMKiQvUH6&i=+gD/X`*!?)s1ݣWl1 "K3Z͸wJ}K]C_hʖ:E*5UZsY 3?xI&eѵ>o{<]%o6)NQ4B dM;͸NpjdҊ/-|'tAevCIfw"˧qd_qg@-eHFwkϵA''/J5*Rح ">c&gӒU]Hݭ:]{mWI#J$DS7RI$Q|/ӷ,Ɩ֍&.e!F6ߝ'R.{brWg >ewYiOBP ~^5]z?߅Py)Ad{RƍQ52HwziEz[aUs6bbNy0 R|] hPª(,4 -Ӗ 3BIOݦONmqR&hܞ {^ rY) wg:.UV_ um0fD[,XN=gIFWV=j kPj :t׺ΊenY)Me 1=qĶlO&0#]||hG裻ǽ'[UEM5u uotB6gIfbo{S1BcE^Лr6B᪸dn5Ǘ:v"f'Nt`s-ly4iKswC**+UEߎ`0;,SSKt»p[5wKyEy65MU11"-O8b׶ch{\xg"GE?cֳa_;X̏k|[IқKLU_{bv)`]zeU3_E?2-'nIZOZ^?G\1|H\Xi.#@IyMھc a|mI")4su(k1}tؽ{lt-naxngIi'ZT K6Lv]ƬyA5L;=A _hS%PBHa8r*A88Fq}/ o]D9l+o ;*¥3Jkj=M։C+t>|%YͶpԟw (l^#JUkٶVvOsu7w񌩀y8 7oQ(`51rI +]쪇]ysݙv:9Lz@-p $Mx&}η'[tip$w=cjSI(ctީXwR/3F \n52LxMATƂ ҡ%` a)ĜA*%Σ)! .4M*} P,\FudF =)W8\ E;R--hzؗ5c/<9`(/fe;ߪ\cZN[Չi3 =I:J.z}D]vqN#(/=ķk׉rcm,5H&uQoT:zj 'l0<9;J:t: zHoϲ(XVhKs%>/{bg?xwbnibIY:2ń'a:sD?uE9G?> fءᣲXwMlY}\i 5J~,% qqsrOҵ%5Tل5TяZB͚|MW8 >ʌ.7n,ZL|SdW>џ8.$rsɖf0@Sdr&h6=-X4&Bz޿/}tnu"qs|z|Aؕo \'l,w1ZԢ姛/ƭ|W-UL.FO#Oan9#_˰NnFx]P~ T6с𑶏\uVҿ4pfPѥf}oT5+9+־"uetԀVS %׳?C8M1DUPlԫ*a F\@] .1;'QqJ€{@F|9Σ1SֻnC&˒_'uaZFId4|Fv5ִ3wC'S`E=y`<vGF7F戳 ҝE7(ؘ},fUV;^YtF$wQB>}FNIS])Bɽ$\&"6'zMq_tc[a=bu>?QwOkľA>f^_M8O+@|'7+ٰ2?ϟ1{{I !CY@ @0bKU w?l~VGquCϳUt$|I?YyNSfL]j[ lG_#kYwjL q=X/Dm.yMm_veZS^?ZП{;m,2[kA(SOSJ8KL<}طE&vhUܸCISU7Y5 ݁m6w%Q6%3Imm>i5=SVoe&yro.ٻUׅni1 SGҦwl-񉕒I'fFD(N푦?ˉ7d8!3<(&G*O'-GϼBp'6L /1̍W]}'bTx\V2\s'Ik[rԔaTuPg1[FT鳊zei 2KeCpnl, VSbՋ.ɻDņE6muj+>LjJۅCžD;zO.nIm6IlRٿvq++w AÐ6ӁNQRPE<<1\Zb?d(9++LVYLM'3di7n,볝<˘*jݪ>Wvsg}vywNNw"[%:v?.kUTR]IlTmَ}B꼟uvS/'řn m^eᓤ2~&(.Pg=y}ؓ1>`툶^!PC8[yhyUPE xhݗ{ Ȥy]jǭ*,i]Df]0תT[5ab F#O.;:Z[b(U5Ϡ(^f4WэuT;mYV/r쒰qŦH4N-ڕm}ЬM K6w~\Xˁ_乕v71A/BY ߙ#:`<)e)gib*/*Wm[H8n$-ŝC3ҥi߅rGWqb{*[mG 8贲(5ܬ(h#Yq:XXouiZ<.m`v[TQx o-WFT'vbjݯΫnL5KZ)n.g58zm[T u? Ou7izssk6'Vf]B!S'sbF{2;;+Α~ΞIV 32A *44 Ss_߂Ii)G-gHo'%lE{낤U[ZG,Ϫ cyF.D2gvShykW Fi]p'?Ӓ> v>wVO\mbw_?%}bB^ ͩۚNOpZԬiȿ3A7; 뢣Jհo6wR0RN&RoX-@{i9}so܋O{zǐ?bnb OdTWln&*~zcҞIgEh;!nir,(kdGuYQY\J)Efو.قLu 6gZs^7u@Ю/:1/MoqCQ%bXO˔nmsw⤆,dlc6'!X!Y/gSgȒ25wY#q9c[?R)4ʕЮ@Mi)/}v_n^Ʈ3`~#JTW#D/Z h- ZIVn4.% O]x(., *[(Y74W3]+yxRoQA&\[aLRTXu sFܣ_Vx.Wf2 uc46&ݥ%ު:=w*=F%RY7H4OIL$IO l;.mr}ETAYŌw"Б_&,(aPH-~ڝ&/9 ]@ԵIiO7cNy{-udIձ>7Y[Z`E'%=$ G(}8iNy#*轧 3zcPDOW&*b"`KS%Z(#W^=WcQvҎܟ=br2^WuU&0닮*<*v^ךij5E_Qd[dKCixW#x) Voe.G-JVo:ȢtRJVAHb) *j|d[ut<ւ5 7K}2ў~ @Ҍ) -%Z aɛx@iD{E|@:_yRwK6bzgf tFoL o6a*R֍S[n7Ql /o۱=F1j`jz'uUݞ%U | Vwh}XD|eG![Y&X)_QU906էsd\A卫0nVwUviF@xr.C3+R;үl 4Ny"rZ[ʪTW{ G{ۗ0G ܉ԺDE0)~0FqN,"T1* m\ Ln>cČ(4ƌ '/TI =1oK_`7`kKMs^U-f-j;=F3Ў7naP;EeB%]YNl+[0 x,MkS2೏m:U"֩Dg@i[ɠ DavA3">T/wql΋*(B?2hzLHPA|9vAṿ0? &m:uLcN׫a|=#tL' i4Ӽ`GLaKm_%͢b:W %9J.Y Wic@i&d' $Ov}y׮1t8v>uwn~Gy]G}\wbOZo|ߔS(Sb{/fDNѨ񶨲܅q\QP ȫ bUۮxΫ1,eLcI6ԕk̯2}/xl aLJRb24:Z"Ѽ$ʢYV744W30adCXSQ*W9slO$#@]uˢC,]?|Q[4d6)jԱssDt^]Tz羍>5ЧT #H},ͿVpj"$1Řej&9/}ˉsšW0]nNXFPs'A*Z9 )? ߄7UH@h3H,;d勖2֚ Z7Puy߳sBH8 z\/ ;"P);.(b;!*5̆-^DQDb6kcDJAqΛYy{}])}k%k^DJ5 YPmIbܡGǾkF"vhr۞~*VSe{pX^ߺW[(BS^ fQnMJ'`ěvRJ\JAYt1ulyo'=Wjm =$wx`(&fωOf1CZCaN˫l`՝i O%QNR+/*xlJ *THI f M8ދq4?EM'({1tw85`;qȸط,+L3@yqqvrR!,DڢDE%^=Y-G!![vK5Y3ͦlo;wXd)٩gg7/G{ӇoܑݽD6j42PKlV*:-6J5?6iXn]b;@k.:&MC* p\['񏣹CXtě cy126KC/<#:WpyN40j"}&:F) &B(P$ #%&z\(x0#p6;'  ]F pOG5Awus=2,BY8O1 r-.ޮv.Go 5q'le>L9O6_;m|U%6갘wyDTJk\+Bj'PboHFQ1+cZohB)гsJ1*xfh9?MhjeЎǡ}V}>ZtÞnڕrG8ɽahWus`rV6nu!^0@ =RVlw8_!.  Q&"^Z7`7݃Fhd8΅=c@#rL/&Mr`E4:SVu8/5aRBZjGVxGkPI#gBw=6>4Xڔ O8q}+rD&1cgvf:NXq@ ,6lSjN! 7m>}lJñd9Æyl%_LfrOwi1ܑ6-6 Pv!?jQe(Tk{@1HX{>hxhN;]mivM-IfN͘ @oH?z@@tu Uh.+mB)ˆW>|}X|P c2M܏piА/T_y' y `R])dbn}͚fpgclW&D]}&uQ9tm3Gu)O骈JWBR*B(4L11LPL4A0Q"BRP* ҫԄpZWDh 'P$"?OQ$DTU)H%fQ)I @)BPeD)T)() H @ AD** !\) (Dd BPdE  B"P-(d((H9"$0P4 BH"}BtUI"!AR7B"*4] \p0,re F$M>( UԬ\tse˷Q RpfݲN'":1Ӹ7x-:[*>Suj{iDfۛ\ܻAwZs7IɞH~jS*f &ǘ[Qep{!7𙔺mJGjj68* VMdC! b/X>I=٤GnB5kAnYY̰Bo7.x*BZJAJE*6!߇)]N$D|B ~Nwhxn[%ۛl  L4fXwmP@[l\Dh 8{W׮MҬH(2XgB;+wL 7m^A~IonUFi7ZǰV-z85*BQ![j0;QSf9GjZvpA_ 9{rKI%ZƖ'qMrgzX4t4w|~x}?'Y(Q><u>=1BP4yW"M_we 7 A< NN?k8r 1|si/O}w=!d'y"LQ#rH翫Q}4?cWvLtO6k-?|}iԖ.rjM0,[>C9 ]  m}qFHA2&FtI`B&eH@(,픩mq=v+~I$.SYc672.co؎Wԡ bgw7__̓DEGDGd1"##h-Q`X* * Gx_gb~ ԿEL./+*yMqk]Ao) uדӴ#oV}GQ]=i!u8r\^jheftŌ3u+xM3/KD/8H<!O[Q[ AP!׿#22ԁFӿ(vǺ#v>G'*Wؐ4`NGA^t:<{`OAuN)=^4uԝܐGhmӍ+kqru]e96meW]:owQTO%N{'A^APTR_-Nv'>Fn7KA+ӽdmp{dm?ĐC;Jj* ő'L @ΔJާ~AdpYK*ak "E &ӄ%oiS(1!CA>&T2|7T}5GNjgXAJ<-zsԼ۟(]zӮMdփR`QN.\v7m|Sc17 }Ҵ)8/xcStDD=&a? $~vT]hkmI`2IdDE~$bUkqhڔ !dи@ˋ$m 8 nQS8  SA ̗el@I Xtz0?PV E}D /B@h]` d`m#2DxLT0߽@Il1d`G(cBr0r y'钾 "OZv"s}}<"JhQy$F\*\D< \siܨ7IIt_L>:aS s@"6=ox3 cZ@Pg3`h=,`|DnO%BGWF@V [ʹAAyU72Z_/Z(ΦPNU&C:R?X|'ht`ڜ朦>csu+eϮfʵ]#ko(Ta_(;UsDžYǔɱkhyu`C7q}ON;yn\;Hu owIL3{SYN-*;)K#΄-yh<XzʻW-1B7¼cwXcƲ $(U7#*b)+qnTJE7 fjUZ.y Ze1 k5!2bLOt T-[$N[M#ɟLl5PCHpЇ[] ^z\򾙱y]']/j* % ((N'z(78 -gFfu RqĐ$ɩ]~W0Tnǧ^R40GV WôX࿒ppwػΫ784? t9|x~'@CCcDjUBUJ[-g(֥NYz%RߴD"{NRP.+|^__ʍ ^yCGnCv%KOTax5`$"\7 QM&H%Vk^,ScQ UዧSY5 Pn:VX8`DBKDąf&%2RiMi4XdFZ ƛX6lo/n3(m67_4wHzZZZZYr˗KKKKKOC>|ϟ>|ϛC>|ϟ>|ϛC>|ϟ>|Ϡg1aC<0Km>l˛6|Xbŋ6lxb͛.\վmlٳf͛.lGl({kvɽ7aUƙh+,Êdw~sz)'Qy&waԨ'Pt S@z}UƊ'Kt:?|]axAܒAaJ"s{ȴԮu?!?v"JAbUk)@1iY8oY3w^>Hw!:G:9^IIv8Ü J֑`0/>"j)rI ݺl/[`^-_q#vroE['U۠BMӡQUtY< Ӊ++Tz`Ϫ\*~J:#D6EןE U@ Se$ZX8vGj=}ҹ(!{ď MJ6O?92 QWO\0`t-Ė LL#P<3^Mն|wXO>TD*O?1AY&SY@?_}BE/dXLQPmbm[VJcH5a &^ Hp] NZJU Vm`a+QjBjl"iT5"lBHAFصS"mA* Y LP -%3u{ g^xh4Ӌka`] I4dLSMOa5'ƚfOF'i򙧪Mhj< h=@ڛiP FRjmFQ hhh444h"T)66G?PS=#53Q=OQz@=F(@ѠzQPSh4@$RPzd&i@ 4b&" dm&4O)<0zF#h=MzSh@4@4R MC@5M4j'mѲ4z0&OHh  h&d)/WЪ 1UU|s@s3eOm!njUip$4 !9J [VU\ʇEx "ʫfU\UfAXUQͳ[ST~/Umd *}`hUZUjl <eڏ V+1e'$Hy$8*k0#ͫ k*K30IVVb3*ɴbEB<)n\XWxhE&҉ЪuV`z0/Oyw)΂*.K*pMdQ%\klm#ZEʆZḧU2֩MX,@Uf3%FdYa 52RӜm 뜪4.r5]$C1q6U`<ʪU1T`P<W4 qBC֑㤬y몯 =]YÄWPztk`6R^UϗY灩IJU-Q29m`VVi6ZJm)KRUX)-UUɮQjs4M&[rJK6L(MʔJT2CE6Rʉ#Q*hcl9.*9-n7"3W2Ťf a3IYfClW[_)k55m ʳ ˋ<9pYk;Ά[3ѷ&4Փ ř\2Z'hoT7Fɢ2ЏNv1LqZ&k6^?= +j 0QU4eU&@U DVH!:M U@guZ໸  5YteUeVSdde"Xd b2 2/|&J ?2,eXb*1XU*L &iKYHB&UUhK-Un b\mWU4Z*ƣdZjT{ Rb*X"*ꫀ7`*'Uz\nGdK$J'd9sp^ꂷtRv*ZA;TQG Uhĺ좮҈4p=hdTAsW(0~0xTG *Ҫ1JP:i<aChuR;@@U?/֪r֪`z7yW [~ a wWj 8fǒ7_ZBz>^\[]ʂQ[/Z`' g6r  ʣªUV@O.UZ|8(«Qĩ\AwxGZ Q@.ܡ;P4yp4GkJ;W`;8l<zppU^ڪUeG*tErQ:VVUlG*G*@P}}Uy7TkEˀmUʩX+oW':pTĩ04 Ab>VJ%Ġʢ) 睈gN"""",̚yNDf02! F L I'}}m]}=jr] esݽs 6vuҋEmrZM&Q\0,doRrkL:ZO-˙SU$emtHdK>885vZnFd0[} Keŗ f i7VkKAȖ=%CTaTcW1Fe}l,,Y k'.,i9\ogUZ*'P1UB,AY*sYLILoHyn૖{7I/ ;TY5Wsv:(Ɍ*];.\x伐hȗ3 `p9m3f4,X¯fVE= D0Ī7 Wb4cTU2auaFe,b&bO| 4J-=]t3%rʨ&Yg<ΣwOgMP4/ f|U9tnv~Ֆd̲i+fN("("("("b("("+1f3 G8Yu*x1,v-𭲚]JosYE۞6r~MC撚-aBm2٫q$fSwxU^[[mS)\E3x`.j0 f0`X2J YڮTu粉 y`iҠ٣E*kDPA6ڵl*݁7ӽ = %W^`=.Nuۻ|jP% H {F$hX%E1"i2&Lْ@ň(VIuY@$dUadV-hL* & KSV2ʭ8ѯm30kyY.u8r9iw7dkfC(s%w|Wrjpc={\S͆BvTdɔֲ̺+*U aXP'vU3 #M%pU jHi$ U,RZ!PMOS=|{~jz=sIէ3궦Vŷ>wyҖC'/YKoKM]6H2o.ԎgrZY C!+|flKQK&:5l3>5rXd?[BJr5˫Uń^:Zitme+ռZ6'ٗf9*_vt82'/N_'<*;IyS$r\+*w5!oF؞)=h U೼4dXecYpKGY,7Rʱ& łWn{ԀYE"G @iVRIqKٽG#n@㉬4 YUBhCC Ea-1Z 2ݕT"dEc"dX.ҍ%4 Lda1b0юXdo76F(csZ0c "` *0Hqh(` `$)YCZU@2r M꣆JLP̫L-bhjiZm%FK4v֭Zҡm,SEQf-LSFYcTS=չ,ěRq\8[fDDDDDDDN볻x;v3]nsyOe9t- 0+ _ʋRB)X`"T V +*5EjW UƢѱՌ UQk&a"-mQ[c[FLZeU2 mjfŪFR4eTjT0B hUSm%5VVQXbY,2`ed2HѨjb*F$0N8*QpJqM80+Xb\W5 V\\v)6T1PbeppƥH d1,,*)phiV X2ŅKT/|!-?:ՕλZ|}LtIKQ#H!rD- Ltok\.rmJys{tYpn١lN9rqÁ:N߸Y'wVvi˱͏vy[<7g3vZf8۱u8ut8γLrmZdˍǵ1+ja<{l#keNmXNN~ݗ-;o1Xt1vL9s:Vk:1XeM816lpN 6nnƗ[\;uO6q]# 7og[:;v͵ c |n=98w:n [c8mi84ߋ:6sxvv:a;~cFß.M\3cc:z]\/^|}m5o3u4tU>ptŪڪ6&4jd`ˆ6}77#}O]Uu5UWQmUo׹xB?;=LX@έJbҕhʝX\WYև3JKϮ^u޻;<ۻuιԹ33jtdnayvNX4bc*ƙ񮇮9rΞĉ]efCmaA?BoVp*ZyQ$T{;{GmV<,|,m\[i\βU֜^r `r zN>Ɯ{-4Ӌ~WYV|zҿ {?c[8.py~϶Y!|+{~ey5.nxSXc1fLʏ^KRuLw)lؗ? IJ:f]i3gRӰ~A衋eLM\*|_IW>Lv̝(~s8?UW.$&kz\82H`JiM3o+pV+}#Q>=t=˚B:{}^}$r%|\?쎧堬fAڃPl*m!0_} I\jg]vya}O%doTO{sW?^Յ򗮴RS[/\dR~.=^/{*thK$^x+x]tpcVu4|fp¯L~ܫ K^ۿR#z3~n/`C'|ToFKKe7n3fKJ VP4Gt=*d ՃtM#^G^Rel2_fio7Ƿ7+L i$-|u{^Bi|+^Kt|>5GqWs;~s>Q"8i3&5g a_5-/[KpK}'-NAnn|2 qrɽܺ(ZqOw28NW̵ _{'c]9!W?7Ի~*ab~dO"O} _*|Õrj<זZ[WrMfYgx|mipNA+gZƵiReYZR_˸9WķRz&Quʗ$n,ay⊷~'KG^!'i%]cXk=/:!澥PɎ,2ՕEm޼ʎlCw.ON؄D=7Jq>d>WguOop$yw{]:y`҇^V澮/\-vVnr^tvP͈J3* 8iC~ОO:y$gg^KӆYÎ6ͷ߆kZfd[f5[\1 k2Z5;l,qy˃KgͱɻW 0ƙnMpnW7 Zً8f884i.AnٗcWΧv8l\:n7*^^od_.*>RZgb|:5;w;Z<`Qտ5uqm6w۵eųw7<.;pspuNqcKOḱ@0 Pd(̣lH0*ͭa̘%7`5w]Gv;]O;F0KQŎƚ(]mWȡj@ʬ* c 2 boF^nWm+)[ܶlt`ٶp41w7ټA8bv"W #,Qß:ݴ Uןf:iYt6ʅisW"_CffI`LHc$Lc0vw. : FB瞕>!<`衼CN=yy w?ZV2]2q7+`/G gtt$d*^[F%utOT^y;(V7 JO8#`so!d2C0_Vb*\߄pc Yr~gFuhy[Y|SLLiEj[-uy 6SIWӻ=\۪M>I?{ j\\LU(tze}nOE[.b߈7)H}NPwT2ʠTdяq WAݿgyO+L낞wS%u+&*=r>zs!녕XO@DŽȘ-%hfc$/UM0aM|RfXSjIHTmj̘9ȰvKţ t[n\=VK־\~|7rܚƉx~:\[3Ns9ř՘y%#%[72d{S^Od\)SdzٙU:=׺Kgce2xzi8bp]S2f:;8;w-#G컏>wy]%Aюvc63ka˱L. r^^ sbJ=լfJ]s^/ëqll W1N*VXHoUp-#%yǷ\q23ȱWB˥*S^MxB98Y!GKlHRd?.(CT`]XJ{Fax|6=ߠ^0Z1E[{Gij=U VB΀Px|U<=)ݻu*Ct]rhqEG 6$yYU}yǚp4fyM{Snlnw cf{S _pYc|z>/dQDzW.!>oIв UҼ羍6#'q1bM=}m|/c{n1Kt !V`e c31 0` 0d 0` 5lFYEsZfMIUºшNd4Q)>{189][i޵tF l1j`|nX c;wx$Tq>-T(rޅC}ۼ֥#ry͊Wa/ZvQԺymF1M)d/[ ٚn^x^){ңř_at#4;0X Jՙ"ZZPdxvsnnTګ}H0t.qiB)\v5g8mr 7\%ļyk-d0'vpqqh;[x\ьLomaSXƎ8cgf4ƱWk3Lߐ_Fff1u32:+Fvs眉t{yq׉KBA;3h=ptB7TrRyb=U/oiGeح] &¢[:%s)ŗhېӍتI,cWjQGRFJ̔oelvDϻݙjؐ</{'9o=Q:a VrVփhUm6UVl36?V@idk -5Pg#zp8~ϛ pkƪf0[n76{cN.3:[6lt6ŷ4jή\=VnC '@ >fY5P~ds]iҳ/`u!b XV2nR%Ku^v'̿e|v\\m;{rxKYqUYkZkXY56 i\0c2NW^J &[{:]:^m%8KINY11&(juڥ>Y[ ZNXKM 3՗ f]>w}/8 ;u<#n+>̿!^R,0zm3& b1L{Rb߆)sEU:=tuh S[˙phWn>|NqK̗|Ju( M9E./ÝVc;74U6Iwy$O_OPlJmDT0~8??GZ$JFUuOB5UU$82-fiaf5IjՌa`[Q[\!6 J୷ \nN)]]s:s3.sn948˜\b%A'.rH2iEʤnnW-v:fac vYhLh֫%db.rVJ[(;5mnnDu;:;Zm%$0HMeYUT[A1*Tj`Pʩ`2 *Ld#2I$XՓ̳2ok"V Z"2AX, Yj2# LBU`QVUYUYU-W$87MJRVF61F̑b3(T#0 b, @ʙU+# $R@aTyeS0/U@5p6ȁ1 ;QBi>/#$Nd_QsCW)@ QAG 2n,:o> Z?jpd"I^mvvqmmg\0ָsӾGk lJ2ԭˇWg'899rqok33䥣lkY%uP ͨ'=AΪ6[۩U*[WK0m<8rUfRT-ꪻ]| wᶝUYm[pƘ$(vlI7c|f|P>_.c1ٳcNfY$"a;T@ϴ@:ˀOP*UG*jOUN@9>ʎ@@@P?3*>,s^ٛ9<6 H%2t~9lԲrKp A[Jx6|\o1ߐ]=,ʙ`od-uN9Lb|V 82VdQg>&C1b S(ƭ?|&jasswv+[].5~]s4y|.\0,W&p\. p'~yqqq6]߿~ׯ^9s9sUUUUUUUUUUUUUUW:XZx9:LIf[+;X/ҋO45IbĖhii\u׮kZֵkZ vZjիJ>SNٳf͛6ڞ˖'`H1(-.qAB ?+O~2flff! |0|?x}m;_A?V(2J&-aY^-T!fh!+?-=y\m?IG녟LlӴzr&50>:/4FXEҢE*lȯ2Ud^"ճ xgM@T+Xm(h҃ kW &͖TlU?oQӟVH__)REЂe?U:"|h @ͳBiX"&5@U0@$Ԍ/kth@(JdN:$((P WQ6 M@PzmS~6'*hC@4EOOS<5O)\CT;Ew .rD⡢P0RʆN¹UB;T;N+(~>\ߔ5<ب6;8KCʇ0PPUrP œURKM7PPJϡU; T;hwJC3ICH11F221Db2w0*hL5Ea[ R "x*K֔5P%8=^Pz¡PꤠP{4<҇J5 `ڡPކv]C(pC Q:hT;hx=C 렝Y`:eSZ*3&Ie5*(2P9ΆACݡޒq}J |j مcǴ)BKCC} Pܥ^0堻^RS2*PPM<)PT=tJe·)Cjq9mTPe5(a%tOCF$R) x*NpT6*2.S*Na`e:\u%[`2 C(`h)FYA A C(b 7bn lCM4ކQb`04P24I jFP8npPƤe!a,CI6e;R6 #KX`0c9-6kK&Yv T;*(eTƑCF(h⑼Vcj:qa"Yb0JYE2wU Z!l1J뭤Ph$$V9mLxM6S`S$f}"> ̘ͪ[foDQDQEDQEDQEDQEEDQEDQEDQn(_K-v`2 ^Ҭd{m!1 T 2٫*mW;kUpn9΄ {֩xr6IoKLCt1%ʆ2PįbkdvT-T2TTTTTTTTTTTTTTTTUjm\{j10:ƙNPwu?[Ey×t;Eӭy^ݦj.R2Gc= ۷}4 il6:_- ֘tL,:ʦNITU0l1F$o#$7 V/ZݦIWb7RgTO{%XJH"eP2֌6ѵ١$b$Е| $J&B2L桕J$XSe:-ۑ\ԒTH00ЅSѶVjUMjikj%jibaDeFIU2FHʥ1Y1J*I2*,X30R,*,RJ%dX"2EUB0d0KL"*XV% JWo/U])Ud(PʆPd b 6 d. A DDbK)R*5*F4RE CeS22XU2[TYL0#LH2VSB"jJ*oC2Dȑ[]&&\"XhTUI odUb1U*R-V3(’ZV(qka9J>' &[8lե~Vh$91T 6eP}8qs٭EMP֙Lc bKfJP jt3'OVJ̝剋&ؘʻe޽[JR 3&2> kfĴJ҆}<[T/8q]{;5?6߁B[!,.ީr3=UC@jW  OuS}#i-lu$ U^LDeT,O-[ HXD$w_}G?z;eߦ~UHתyIz˝Sk,/m{K^ &*eSTOH7hz%8$YN+3a_ /;)zʣT){s2m^zjl{^{} I12oCC2R05o] ~g>Sy~/~KOsLw~M >]_[컖p\|n$i-ϕeb8[}4U.j]o.2x31tTdeg#xb%.Y/˸~wW!_Dլ3qD\Fs/_ 6%ZR5\m(RW:bWϘ$=v_k҄V4Qu˟Bc'Ke;7R4̈́82nDW*\.aHpd){l%Ǔgsc##/sW[s#1E茮rѱյүi>C~T&tfF5v %Z(IuN=ᕙ%.>C]]QԮNe&ov \LR)pY Rp9>I9*y$Hl Ƥ.UG6&xp~6{@$|ߠQ z~,Q{ڤj+iҗLa ԥҞUuaWLZ8' $UG>J< ]#gYRPڴ`\#>.=2=.CK yDOOpd1SR55Q]O.6p{K!҇ĆR T\SU[KI]{NtI:]/S#/.tS]Ja VM 0` 0` 0` 0` jܮ-6&kr٭rr Dz\z]}1 _GOt8kkoKTI7Dx"P&pK;Bwwq)d?om(.$SǬ^S hb EQܪ&f9 DZ0+F֩ZY߃p.2̩hPFbWu]LvF0ae͸_@9ߏL¦b<$MeQe˾S fg߯;'4 $jͯнN(qc g&Pҡ2PKʌՒ3(lk7Bs0P 0 (fqG-\-&#\]E1:\+JCdC4U])qse?eN<Ka-bAKj7\Zti<8K! *Jf*J&G1{Է=d\9ߞ)j~2AZ?6ϳݘ?>GaIKXz,Le_9m)8 ` iTo'=IM.ٰ 7rEORJ2^;Mn/BjwYx2JG!(l[4XTAe2e9W* }z>^B$!z֕QUpai0É&m m+laa)iXkߡeVJRfdĕMj#2!!APR,1 f &\07 EM2B Z-0K0K2̕Y  e 0*2JRPC!B32YV6d6͘bRŀ0,RJɈ(~BU?)$PC(~ =PC({N471%@ )റ)=̐rs aA<gkmk'> $ZTYc'b! Qc0b@n HD`YLٱC6o|v&5j9nڰ.B Xťܳhq9 s7x&~x1!zpp1B^bub3#Y^km@:(sQ0h~S /8Sp|h:}GOJF ZU(`|0 ;G.lS@ԅY#5#RcpD VWlNU5{os*IE\UW'ì_>GZOd{eSԎesTVKe7/A5TT~t+t.Q;qCM:Cue46‡KH GAMui LIѴM-f{5՜GZvFM2~D] ~nrJ`S)jp5CwCzs-JJ "*2qL=:T5!Ml銧_&?X(tc}v$2V(3+Hd{ d؁+?or퓪7)k뉕çkп=*YVlDP<ږB f( %Pl q8T-%_IsJ?Zh#Q&&1|{z[1?c~F X+Vs+YUz&X`q~6'Ktzx&s?L{Ӱ9mw/EAl<[QQ6R!HRb1F$) B*%""$"vUkZֵkZ\88(7$I$I+$I$I$I$II$I$I$I$̩2KY(K uL'iSS[X MiJT )$2}JR)JR190Eu(d$-뮾gZYdX, Z"!aDwqٞƽ=2t6ٶ1!C0#_/eZh+Ou\ebQqڢt7Rtz:\ =?Ki/HdH+ý3M^& $@6$#\:DԮ ߷9@tQǟZWE}? 2Q+ %S]U_}%}(P6 0C@a @T4<uWz(Jѓ@+ p w>w\)$P6OOFeM?Thh 44 dH$@F&Idi='144@h@@4hh 4h LJzdd4hb"2hѦ 2!b` $U$5LFGLL``QQb=LQM=LF4#@ѐ ihѠ#!4bzdF#PFM 4ѣ U#&eE+FBF F(eRxNJm ({j6ۊ(eCX,*C)ӪNgT$UM)T:%Q|T;*yh{ CRpއIaCT;u܊JS]IC({ S/T5 xhxEs=%WPr*xRCʇ:x]d) ʣPCjCp9CC֒j55-(zh}*QC C"Z(fvj.ORSRjjLթifU/ ɓ^"`TGlxT=h(iCxP(`SPz%cC(p(u Pt<򇒆JzC)rCzkN ‡]46FP롢C:USz('2 Mj0g&Ie5J(2P9Άe~lmCPheRP* /M(}&IJ%‡aC5CyJP=Z %3"MP꡵te !ObCޡ\sPڇ:e[U&3C qw2 It]1#(rd(q y<ʓ W}R`02SA%Bx2 1 `h)F , `=mR d2zjF,2Cpn ke 4r4Ԍc0# 04P24IZa z jFYe bUlx 72l&2a2/~<޲eu q‡aCJU'O?\:S(q=᪥:ntŽ4t^ݔ8UPQ / T6!76|DYCC(g=С(n xe~P(vd(e Pz%< CT FsNCYC;J .4]:g،f4kVyrXO %d- )5CB5CaE1UMJgg(.yA#(@AYKLX mmVCqLh[MS(d3,33+f49n؛6&7jK*1K)EY"% TVPT !dfnFM0m -J& 7U"jC2ia-eKkk^P\7; sse 챓+6 fmaXڤY%e` dɘlK9K\U¢f 3dp1C(Ub$*`P e U&(e T,P&*(%keZYT*Y(`2%%UFP”2c L(bJBbJ R@(NALFXʂȬITńV!0Lafa!d$2A0&PŌIe b 01Jm2Z BڕJhXmm-iiS0*ʠF01L A6"Y(fJ2%pQLZ IA*ҨOZm"JPpʩ2@G P Nj|U'ΥL L#EqI UJ 15T-ʩL&F֥V[lLQ,UEcddɉ,JeFIU1F(V( 2d*d0 Uc"feD)&b2T$$S(b1C*X a0FeBJ a%S "XV% Bx"BCPPPC(bSY +A [P~-#$:D1H C !T/V3 ?s}D>o5r/I.Ä b)*!E&P PC1C3 (b b XQyJ()i40nfĨ$ 19@aNfdΝ\&ؘʼ 2Nj a5)dS[7%(mC!27trsPvCƨ;<]zv8k^q} APznDR]/ d/%8[}u-,%T.FGޒ]XGZ%p>}Wx_uGw!J2^zG#\]%^GFdWdW]Uvs_rt]4\|~־/V< /Ts-]}تyIy:AV/|p༢O*]S}Mf_E } o$%9¿/e Qza2 zrE6IyJPKoU)d;8K?l]eex[]Ŗ|3x).306Y$b}[ ֹ=͘j?[_eL2n*Oc,]K}zd8Kyp.Rq%ݼVXF#[ˢC%\u*\eTo:ז#yZZ ylW}/zCqAD/W fape3I{Q,RԿ3ϢWoy/$]q:I~v_kU Ċ.sRuxTSKUKKG#F~Gx־UG,K /[e/|\y>LW\G:Uu?G}y̲8};\2CoӧrAj+33W̬̱}~/l<$Kћu"lS:j ml ՛lٕieF5o[o-W/tG W÷d~OGfUD ^[Bs[T\ia`d .r]|3'_^җm2 ٥-Դ Kcmͮ:s߃fk5`d̊%Ƚ%$aK$=b9WIv}U-ضӶ_`G$.8gx<\:ǎ{۳ .9jmCC2P1 BbQ&1z$Z#<~vt/d*:Q=+U/yIGCT5C(bP `FH#|19"j֕RK\ LR\VχҼ'2%vP$,MtӕD ҿv Q2 bfw$Ϫ$^s#eEUQ7޳O)́`Ccrt$^èD.e!/o7],eA+R\of벨U+1|s=b^ڗƊnpzWrkw~m.e/M.5BwƻWC2ġ.l!og/ Ct(FUt*Ie}_zwʪ1y{k }h:Y0<~Y^syF-TCt*X ieH6ڕRYmmb0Tćc1K y0%p";).TPOsɩ%O=~[{>z2[Y.)n˚JJlM)g~,J3 .B|TU% %,NpS3Y;wm. L-w‹nTLYRdHuĨWmQ'n XKV#%N5>-ԲK1lYbI8X\UsU4M*4JWTI.8 ȡlT žQ<ݿx; <|m"KmcґT+ѫ[a6 QOJ_"{tWVtu*6B|XR<}%ovu =N tgޒ#:TOB`j{'OVV'3KԻ%׆iw>z(|UZr]sM-%v|]9u%(^G.oVЧ ZjT`Ƀ 0` 0` 0` 0`He1dՁ.r Dt\zp]pf_}|MuP=i6Z$߮HMaUk%pJnvk%K\]yWWg^hǶDPj %GzQ31ȖhdR7 n\Z5KU$-cT9g t)Θ^HPUc1$ba1k8R.P>K?w/^5?!;_Xo>߃1JG{wEKRQ}ԫ('*I@ `JĽZpOwQ'.$H픬(w*T^;fĽ.. d?j4JYP4hwYCҪlR+6nPԣ2J̨̤cW-h.d14VqD3p&4+kAfYefUjYh֭ VL,8-afDi2ʷ*dfFXᦣ,ުiMPʡF*j5c#k[RRD6DPC)QU2%ALC12W-M2*ʖI*3*Lb T*UIC R)V(d!oQl2XfVm*ZXDʢ IY1TV†U+qC8j%C(e O?PCz ({472%E /Tz]k9sv9*>ô(yƤ<#_Wm(*FYE%u)A3½'p6QS,M!9vƷ5)R ,6ԗߓͮ ` cc ^{05Uа>_N4/]/Ո̍ezZYemU'΅=SDzuI t: 2PءƇ22P?˨)PN2 z;heCTP P’x6Re (zg? C2'ﻑ?yf&9gak|A },n3$[Sj*S[}z iy1NTUMɯ;vJlSݶ:eY= G>Rx N  )K,ڮEVYv@)2߰o{| &X#+54 :EJPիqQp*t%SQ2)Jbl'_/+STt'oQܹN.f} l(8e 鑎 ]jH↛c5uCyr8P&Gm#W&:_&M$m' _ZQ]͓XKM2*}EäQN#G=> hyheR|0)( ?]Czsv҇\%ICyC%Rۅ?g! UҦk /VU&tSopz>a49Drx*AOgj(\Ԓ@jAAՊtlNo:*49iu Mz,eEsi DN GM)| pj}4v@*Y 1l9sF0]:v-/Y2Q  >wSi{2 rzްKrhb 2*1J2i4??0FEkۇVu.z֗& /bNfjnRzIeyL8:zwLH!B!BhNfʺgeYe©f2FUprBH}D Ihh4Ů泍Z$Cm`33(wA>=??,COJ"#m"3L2pI,DTBZ8J8N+-s3@t~>-}C!t#:tcX͉C$NN8zˀ-hF4kD/|ҿW , 2"HoP}>@4@ٰPDIE(f ؠAPPEѠ@1BH $r4 d Im9݁ ?TO!~ҍTU=TA @OʌщSȞ'2=F0FɣFM 4 *d4h 6jDh@&*0=5=MOHhdjh4 4 h$A@OQjd)))3PPOizPjo_BmұfXTʤe1#O)Ca5#R5kh6 Fo#TKHx*pDm dȩm#21NhBHKhSDaD`ٴH荤Fm#dF-;*32 C1J2<.|#tF/9d6KT'\p.JD*]=pN#Sn(T#DqTB RiR"!דs͘6b2)bHČDaDrDzqȎhq*L2{@H#=ʇA[Q*X*}~GّDl<*CGl!XcZMcJC310ƴd&VjmTQU)STj+hfVFVx}Oվ3=i t?:m P`d~ˁ8Odcj zz Sps$9k΃ aAF$aQTJl*yp#b90Q*e# DbD#YRk+RU%d+R0Dd1Jb#4#܏BF31 CԂ+Z#mZFUϪ#Qh2h5$1HfedFbE2Y_}k)`G26I șCؒKde27HdT,S"6ʔxz[`Z ޔU)Q/#7Q#DdDrN5RFwPl+jsDtQ#Dh4,zF4k*q#H؄r4;x}GJp!^rEX*Z + PUaJjU1R1Ԉ棜=8꾤vFHD|GU=zd~Z#[TX\$v"<7Ԫr;LA#i/tDiR܏ G#y \G$Fsi)lR8^G*V)G)R<#]6Eq<I9h;qԅAdP05Re h! lFHo#ZQ2lnF#2XH2 B02j̅hiF؏Z[78DfcQb()mmd1 S&&It1#7b#HFRSވJS##iO_GDqż2#UU^Gޢ8R*#jxJT7DbQH"3 nO #D|F";] FHԏ$G2#HK #R>s:Dw"=hUUw"4zQ;;8mRnG-p|Gr2>|GTc#FM-x"8#HO#Q|GtGD,Fp=2:Q #yKtF7DpDexO"#GR9#TFB^ҥ$zƑ`DPbVB+$:=ˍյsJeT¥0Da,Ad)0E!!/Dͮ75K,œ0ji2ZMPIʟsfYT 06"tT@v!1}lcMe^E)q#ϖQ2:dd])L#9wVs4&vkX9mc|1|4ϔko62,,R]At\\ZV7W]0f6rm#rjF d¦AM&L0̨leZʦeしk3d1q2GKfb1EV~ oHJl6؍!B1j9fFwFmN*TmHw Qc* IģR<;&eUn6$vIRUU M)V)6:231RK-Smn(آ("("("(""("("("qm> eܐTLfr cl[c!iU5_s}|tfc3 [sqUqm*rF#jrH#( Q&|v̶\Q5QFe#PeC;Tj~.ݾ, =/{} NσR06igW%ƪoi ff͐nFEt;,"77$ %Sb1#yyPm :yT3=It qZ DbaL(֬6fj٩)"hO JaUm&1XY*5*5(Fq#UfUģ س$1 !'1HmL!b4FU5HL1HFD h,*Z,,E";(jPmCn8Cl ⇫n9CHe,KCU:S*Zqqa IY\$cF2'c ZCl;@QG J2؅4At:!pRm9%59YmguJݬ;(b<$Ւ2ć xHș*I5#TPA!1bRBE%*KEʐ R)O6f0iJd1PeS,jI-̦Ib5Y3,33+f48ݲl6&Y7e (bQ-# +T؋F!n*SUT1ʉiH$REM44̑g{@ {ݬG+%kVd9lTp2J4esRqj\pQj5FQj5F\֪UEEEEEEEEE\mV5 3eUҤd,L!Y# #* R*d%L±,J@%+b$\qJb)0&JV(X*YUQ1*r *1}%eUmG0F"0eTEY*)6UX2Uc 3JaCdC 3L2 % bF*YC(d 02 Abմh-6ԪlDD ګMiUY VS&Y,0"2(T*.22 L4EAJoS2mmE Hpe% lFʅNi$>VT*RtQ+r=2@MTKTMkJdh+[MjVAY,bŋfJL DeF)*#$eRK2Fe RYEV2ff"Y%PY1dJL*UP0FDUd`b2"JbLD`)aXDeTxE XT:F"2"2FHDJ .XUII ʑGB0D} JӠe~XEq^Lnd : cGU2@1Q,L0HČDb#!A;U6aH!kHTH2 +(1"VQ&Y#J2@ +I+, bb)JeEXHe2 X T"jFT܌R34iT\561F3J48 ڥ**!f@ "#DnF2 Ҏ9$e *KM&EN1桲m%Km&G,n#Sbɒ^%0 "- -z >llO[Z[8썡5 `1Hm-/s©^2[nR k׉eH7*&I{,SNp`D&K*}ITRɉft_@:<rBٔx(XбTu $Ve++0j0R@XCkZjPJ-W}5ʺ`fj @ZXt\E#L=B Zl:BxPdF]GtLt&"|Hi8&p8f͗o[{G'4uP:"[t5Du3g6QRf) 0LpVff3ڢ{ݘs9Ys3PUU5˧ NbbÏILɉG֥%֛ZRfM_J?@m2Zy jKh:~.^_w-~ގJC$uHqWG^׋~ PlmP_̡U.xE*=gkU{9pݛbVYÞ=q%xdt<#>;/:o⾭K;_ґKG7?j4HvKH^(4}C$rtH]uhsY{RjCx>kSeC~:sK,g["?NDx;|U>E‹i]r|['L9nC6l*)ST!Sh揟-&E|RVe oChx _88:|OQ"f?Ā?~./ءH*RhP8+8)\3$B)WVUl* 5vv% )f)N t(:+/<Iv>c ~Q˧O/Y.^k`Y,Uy]W[z{^W,mfN/ed:]ӿG9 |- 7#7*-7H#tիJK#?}͕D.2ZдY7aR3G.BچP>56׎Ix?>_k6Ϝ]4?C~F]4ZoQu}3q;l]?{~u+%pBŎƴyؾ _#J_`H̱pR]}Re#oӧm_^g ^IѼ7.^; TxdĤL3z5*v27ڃ6!6ٳ+L,^c=G\|W.!r )F폒7GӻiPCtҩ>td8m$>aCcCԆet;b{y"̥'_{(zXr-zCmd*vyxفn5˽]߈GŷwΉF%FR:XSǹbݼ2Yأփ !c^rUѹۼ>~T( tPgLX*6V -6Եcc1 71:C/ԡuvT>|oXh\GԌ|RCǴm9#^ޑ˜ qQƻIU2jxw~]:}h:wqg6msƲuj-dܔ:g/|3330heC(uήʤuGm*rCeCVF U_CzC&8XPsR9h4-B>~Q_FGy%^3* vS{Mmʪ>R{ޡ5+[OR'ё>FCWp[-6QmK`ȟ4>}g.gFovݑ=~џCOB顔p}O1~qLёFFT=OCuÿ;8kWoMjjHCܡu~α9R:C)tz]>*|%UjmJ-k+RL0` 0` 2` 0` 0V*KMDɆ붬R\ƢhCN+~]Gc|ʏf7T uH=Q65J߮wr `>S?'w9P@{WWgITRH ђB'LCR4b$nTis8Vm$t\d CH⺸Nvnro̱*V{oFYHH>UU^N)fuqtsӢ*J]*ut 1ff4x=ctDt9j U6Rt>?D :%XEwP%)k\l^U%ʭa[U8Pw"aDaFK52 IlQg[e#t7XAY\\;hAZRH m̐7qeD9"!:ypuESs`UC.~_ʝ\ykcT;(m]A3Zktų)sRӖxrCPI30YerբCt=$<#OH|ɾg~c*;~ynB:quU Ԫp|n'ӕqm DնU!MOÕ,Rͻz(vxxu)*{E Cʡ'~媧:RHv`]M&oVlڥ6 V+-o*ASf!h#XVc3& QT֩7%PD2#L@dTEB̤̥L˨0Me7 JZ2(LVc2&"2JdFFQ1B|Vfe bm#2lيHd-,LX(ĪęPQKo#^(?>_Yڇ} GwؑQ܍e$P{s9X^h@ 3+g)n9gs^Uoc! VDA8:mV9~gϖ@XT ȯ[_Lcd_}!>8x_Fp3_E1Յm/s$/J"/"HQeP!"IZJJQ#⑄aF2G$G_˪8:NxSБ#aIM4G/h*|6FJa~h?r:h6tlvS䇚>Q |tQ,6% ,i mʪealP M tkɻ"KdΫUYx_>/$0%dȢ@T\]~nV]jNQ !v|@B(*& y?Cx^g9/`'wk]qTjeUs/ێ*-7l}oע?)ߝP[6fDM jJZM @ X4A" ;!(PPddE>=0Ԕ~z)iP@z?Rh @F@@h &j24&)SFih 4 4Щ4i ih'h@&Q&ҟ$=O d 2Ѡhzhh@h x 3E4O*lhOz#SfF2h Cjtu$21AF$F N ySa45#-)ڣh+iP1R1撋KA(mPđe$†C "Ѧ%Oѡ (bbNzٵ P CdPPKiCzl2x?fd a4 a( ^`=c@Lڊ,R5%%SrʪKCؠCT$u)Cڢ^IC(qz1IWK*ʪ̷<̡#% B#1C% JʇPHqʇ9Cr\sRzx/* j%ޡ|ʇ0MUPe œMJKMe^ˡUv(wx% IjPPfR Laee ̪^e[M &V"b!A8dQނ CDICU YCOCeSաJ%JAOC(y(dmN3C dUyAPP(oC@;P(vPF&Ph[U*" ꠞ,ESZ*3d$M*(2P9ΆACݡޒq}nPT><檧%C%)D u 5CuJUWaAx ^bS2UFz>LCj/uJ" Cܡ|SCq9l،P(nF$wPt9TjHaO4)9RvۄUqw2_x qԕn 1 #U)eCH0dAlPoCMHņ؆i 41 `hZ#QL`VR0zAŽCsCX k$lx R6 #KX`0c <޲e~8d(pC W?L; SbP{S!S..-q*J:(|CuyNrQx`SyCj rTC(g=SG#䑸)=C(n-BAVUE]2PԡuzP{(le\e (z:ġ bKyCz.IC#):ze S({i,PKPʡs"9 L*mk""&3̛iYP\Dd`PġdʕFT#*G \ֳ9<8\,Rܵp@k56VۄQdĵk=ƖLJ 06%UWH:WQř1c&Ui=d.K+T璆e T8t2G]HPbP.v25hg13c,1٦cvk݃F> mf[LE%\ǶdfV!,k"h:cﺴ|A(>b4Z@3 (txrd 3$8̲a ,C02.ϭfekY˔tԌkͳd2LYbo}ʹR7C_ҧ, Fcmj [!w8ToctN-h"(h C$xo#oӘym 0 Az+ ,bTnzYl1 ꭢPj#RIbXӁTRǍKmƊ-_*H|J?&:c1fYj٭scb("("("(6("("("("Vl[fHes{. R^Ҭd{m!1T妬6WsM8 kU^Mm[ IrL2E FK 0 M2YeYV[WڒL2`cLN(;x;*wÞ@ǹpo|]ukAn,i֬j#$xʦ;́ѻm 5lll|7Z`Gԕ0)U6rrMM2F(čq𺵭m嚛a˯|#rP*IQ=bzJV5$LT2DdL 34mc)6F,D)C% @M)UMc*cYD5#yW^YoUl͙cK[[r% щҊPhM3(,Qj YXJ5(6 JD+(,Жԥw$vK_% 0 rn8qbIshUK :2׭YE5#s*Fo#v@ÿXhT84DJ+R~WKZXNV{So5#(aQ[Ih1&lV %B<0 aPLc)<( 2\(R FYKLX mlR(U2Vݑ0e8&L ٍ3[&ЦC7fmIeF)d V⡈aT6#`$nFM0m%mT (Z40ҋAR.!l ssvI vXh6ư,mR,m[XkIeŭnDDDmV26ը%MZ2ҋV,2#ZeLLLW 3eH]bPHVH"` A1 1%#(b̑2JʅVT"QEI,0T̡UFP( JT82P*f"-D %+ +A!LFX "&2RcUV!`01 A `1TC0&PŌ1 ``00 A%-T%R֕m%S"0X F01L ڢXfQX Jh,Z A%*b*kM!Ppʩ1(#INj*>TXbM:I UMTLchBکJ`f2d̫ LQ2FL*+LL̡A"2$*#$eR,J"2e Y*feTK1e*$eIEJP0FL&% 0STK*ġJ琤Zb1 $: #% % 2bAh$Q*EFB(\% B|q P,|?? 8B<%℣UL HR¬` a(d eC)Q1FaEX#͂dQ,Tf*JMF`ԡT1&U0C#%STYL0#LH2ѥ4&PʢfH"+{ͷܣd˄KT EQD0UFo# IЫ!ĒZV(qka>/-k0GG`qֹ/*Em%[=7'z;u~j#J`ܔkmq6W\[DJOK^wmuo/p8\.u#Dn]^!GE##'R]b9wR>x|.RrJ6iJ*)+  M$hiK=: COG*byZmX1 oU7G Uln7Q:^෴mB95O_X^V^%eQ>b<}jH6mUq+^Ϸ$llN6Q]bΣg S%[M3G &߳+ LLAZl* 2FC%sR}q3 Ei< Κ(vK./~k[/j8\ .#9^/lK/ґWnoziE㒼xyq y7emxEidRv$lh*RlD8 2V{:p©ll%3~GxGu]*UN2^}ܿa9Y5Ɏup0Ueq tFZ,MK&jh灏 (bgwǎs۷w\sjmC1C#!1C#$a Z=\T-jN/;2^*Rpέi=E*QPeCʆ0#$d#Nd:`=L`ʩZsXekxUY5.^ kj&:ZR$ ҿL%DFd)#0sI$E;{*t[85+THA7r4E5^:5=$1+2l]]%xxUϓ:m3k5mpZdpZ(Iu=ѕ%.>C]}Q֮N XX2K0lYds.}I9*y$4{K}Q?hR9o/ {;`OXx[oQ z>NXuH(WnJ]P>XS0/JRt]IW^uKu)8I$ڪ>@xT-/MgK7;˶]cOjӽsWLDHh֥"z˓}Q 2}Deejb}ap.Rf8x}w!ԇmWjӚ%߅NSǗGtSp.RJՖ 0` 0`Ƀ 0` 0`Qs12fbv%IjO\z]}KYj'W~N.DUלK]`=16$~G(k #Oq)d>}tʺxOS{ANHu4 J&f9 DW ¸mjՓ_~Hʔb+2qCI5\Uui3 NH IB!J@W '*P@*7陙nMu1cn7G6 rRتvI$ĝ}3,aze:|.w=4 S"Noǂ섓$Os ;[l™|nٟq|a9f;v/ TqaT22cYQҡY#1eX75c6͛>Lk קӖ2ǝUm 7q]iLsςۨ_ad0D0CEUЗ..~l_ZWUppyeôõ g X_95LWOQtZǂR,%! ȕ V3L&/)mΏ$bn{nd;ĸsxƧ$~Kf>,C~~zbwRc%_fRq -[N/kq.%S$ؗ!;$2qz k/'ӻ˶mKRx<\;+ÒP/yŽCS0E/C(}xUW;W( j*y+|620LY##$dp `]j\8l fMem23-#bOTo%T Y̘3ESZ!APUF)VPĖ"B3 c3%pk(2J*i)RS)*3*Lb TP2PJ2JRdH[ffTk*̖2ٳ[dZX QdIY1[|J>YT)$0S (PĖJϣ?H?_s(?`COy<}[/-x:-7i߹<>uٻ$\A@ ߕ,P%@_7 Gt?H|w\A|V44cOlfFv5~aO#B ~Y%Bl) u=ɡ(dƇ(e aC(r?ۗXS s=HSPP ҩ4#DbP%*ė {% m a(z'?=RT2ѰH<}}n_~G>:=wW)1;:a/[C?N|. f^5e(X:+QtJO-hZ<ڜ[gfu=z6g8^~rӧi_2+^/A}4¼GOsR9I~p1?Aɩ|nB\{ª_~WG 1 ꑎ ]"wH↛cuć1O;x.4?_bG+iD:NheɵI'M<6im0;ߕ9_ӏz%`4bGgZ |r2 ~٢\(~f~_އ"9J9p9% 9J?<) _W5BCKс`!J*(Gy^*}`CK,xe$#:xC:Ν_s Al3 ME1M ygi!!+:HaV]ibL-NYp'im5C_?}*j=@)gE\t!@B(V _Hi{pU/#J_T̨eU+L_!UYW.ΓpeOBm-nr88f.h})6T/=EMVsĈ^jJSU/1ؿNyvqQhw$1 B!C|>!D# JR)JSϥO<=,X^y$I$IDDDDDDDD$I$I$I$L(PUUUUUUUUUUUUUUUV RB'm|e!Av6hh^Rv /˒Y=AYe`y荼Ȣ"""""""@qkZֵkZ""":Չ+5뮻H"Cxf%~ ^8rϨ[~]qUu 6f3fP̑{ ,C)'U5EjdW8{+{x_8U=I;/Ecj(zuq5QL1~S u P?C1sv?t|~6_8u=_UNrJ1PsOl}_0C&Ba]l+9#7ʣ(F4ލ5"qGi[(IY Y\]kbVElVlҍ[w͸Ъ$SʚenzޚUBN%5 UF 4ꉘVE^7WX!.9Uj9"|se\iGeHS"C jۼW9CDfj6jaڙ26ն)Y5`-FmE`,Q1FJ1(XyYN=ԔOLUOP'5d9Q5QV3tb(QmT1da3 &1Thff"*j5LVQ@fAaXZ+lml=<33&eX[(_GWXm02aug'cj |}!FʎvQTtm]qŌFAL# b2 tW^܊ޗE+eBsePd'Fأhk$&QYB=bfdeQJ8ʍ;]HW$W6ۂܬQmmr ]붐s?%"dSr:tJ~R1)O*k)u /^Wd24$R,C"2G#D`i 62# ե21dpƶnMZSb4plF2ZjZSX9FZS ElHlUTفꅾicyGQu%j=+|}fQsoG4Vҏѥ(G*|-:Tw]$?&Q_zQ>G]h s=ʔdu)FQ=> G%FrRz{E|suR^DW\<Ԡm%yrQ(Íӊ=:GQ^dV謋,WQ^Z/g' GumoFҎUS jQJ9Q=x~(q(IQv(Qѽz7pTsJ2^.WI^+wU:04"]XGZ#YT| UaYE,3ux6ZjVZjիV:񙭲h͉Y*ʀ,(娵tk6Mێ%UafN,-Em-Kf˼u' ̵U "0X`m![NYH9[`Gf$""!fsɫ%#~?kr\eEh+ҝ%e.e(䫡>Zд&xkX:=[Zf7X+{ K/yz^GmZVbDpcp#tˍjtǯ׫C,FVXq_l1Qߏ^j8jښI)uʝrt-bbK,Ya[V*)sV`m~qŝuk ~m-ffofȖFT=q-dM4{. epW:9ljLv=S8i( ȭLqzoSoF8ٌƕُ_3UhyYbRC |bEP1@,ޯҔb^5GUVLR[BҀ^d*Wg+Ϸ踉Amt~6: /FI1+ˮ :uXfVde1L3gsjڊQJ)E(RQJ)E(VsyOítc`avz7_bڨ`V_dLdf˧mvC;p;طCЅ \Q-Yy/W6գzmwUUUUUUUUxꪪӀk^9 M%Zb7Q`,+ °Ud_dlc\lۓLB (PB (SggFkZűXοq5)J\nu;MDyx?}19[e f>fpWZ~U1O\+/&qZh6fuH5`Oeܩb0+k̊eLS7˝鱾# Ѥm ٙ=y]KఛYdCפdiPheQ*bCZrfefY@L5Pб(F))cEfTkU]~/Zjmˎ67+)JR)JQ9[gRja͕uvp1ŭ9Km +E66 )*bRAXS` PXYLHVޒ"7y1XPIψ`2+dFΧĕPAHp3&ʓ emMl+Vf6YE315[6 XXX(QbU«U3(1Xb&b(E(jV k3jU+X X)h`TaEXMhdK ,i aa HȌ*ʃ)d+ %C!Xh@d$hQSHL$,R0 -JJ0YQYVHWONiEq݅c*aٔFQ(0F#j1T- L$fJ 6K03t#`EDM6$mmR6RBSǚΡU/A|S[/,Xea{VYeFYe[ZV[-,0Wat#shPFB ;u`n8   >;-PWA^cu6[ )l`ѣJoL+#" } EhZ-(ҠիFXb,#8#Z"bXbXEE]6DY4 h^FTbŊذnn`˼v3RrX,4ЌsaGPm$ro,F$5K%:L6nH0 0r5XeaM̓rؖbL::EY,ս{B80&hFe 0ZeXVqY *,*+#XΰkLZeMkn":p9&2Q,&aU60 8[YojS ssFRep+dbȰY[AUxa|O:xqw;`IL*b>>zl?hX0*oh )eIZ*rO#s\/UސfuߓyW5i.vRbH=Xb"e0hja 0ee,0*,SRb^+e00Jo[/d%eCAVAKAxtyQsBYO2Q`as-`?x=hJScee>~7S?n)|SC <|'i`u$h;NヸL.C:MUFNC 0 ECAцццц%% ֍%X$r%}UFjicH+jړ];E֭PjI#6:P:@Ʌ`(Xy\g: 4hF|fƍa56664hѣF0<Tϧ+3~F>c%ۻ73öúh5e]ÊѣV\K{o5pv{>g[9^h/F4h;e-0syo.+;:}?Dezݭ[k:L}q\Fy^jsgyצw|~WSr0 z{wݷ|^m*?P=y+<חu|}^|3^Gĭ+{Gm{L !4Y;Sib\c7-zzl,<FhDD#8wvLjN:Y.wR4#{{D<9S=Ql{&lw\. Gg#Fzs9mߟ#Olp}G9Χ|>Pܽg]y|}pr>#;]g;a~ne 0.r =NV\ΑWu01Bژ2֍hhLKƏW>?^C鰲7%wdbZ_^!wj>F0uxlpx:?n|[o}#q4nla3c-{-]}nhcqnr98'MΆg3&auձRkWsFninF2+FhF0\cs hvCszmvn11ti웗Tb+}SbVXdS`[V奥G884M=F/fȇr0A}o\En^ݷuh'moonnnvWaqøÃ/I 80la5[m{VGOJ䲵X`܏w7; +k+﯏Ͷٳmi1=9fL0>_*?IJ~2FUeŴʆWq)_T=M-*rt TC˴/yj{,nh/i; aţ=}70F|3"63D1`B""!ѠQRT604?? Z}c;-͎67dS=P;Ur[po*xUE7- U_`ѱi5v6I2=GEeW;5i޶n''' ÅxNcE[EZ-4Z-жh[mhqWxF 0aZ0066ѫIi2# ed?SiI纝սuՖMV>0U=*`zm㊴ey\+Oh98sу0{Ǹs*L?8s93NoUF_yh:<=Cj i;ǁWWi j%^CUaX{mR8[fVԒwMz%CqWjlHhlIם%yC=x~hZ,_xč ,,UanXhsp_0.v_l#jeѣ<_M3{S!>p? !/;Yz ,NU0O]Ra?<6Hllp\̈ `aœ Ua2(+VTaaaģ-DjF[-Zc)Ua4UyнB0cEzD`MuйS b T}-ԏ%4{MFU{Ns. =Ќus<+.fO۬,*IxcJ,BSG}_sѡ^:wҹE4zg;h|؁v9y :a_۔{t>4Nf <0h^'[r#ayZdiC;NB0h0чe060u!h74vacsqYtFF}sS<0x-yBw5a:jq]KG1J{?Vx p|y!c##2Wڨag3\Fðp=<9aڄn" 7`ŵu2D-- eņ,=:]-͖Xt6m0mnemt5y(9d;L- ][4Z- FkFv0lv\Fô޺✪@^m%w}_{gl='`~&䣝 ,[DdD{Fc{}T^z'9UDj)ғsUQTF+brTuGp9Mπ r'©̍Jt9xeIUi~}qzZn094;bRغ `eVeժ\Wsa )qO"xNqL$ZX}a͏h>~AF97=AgÃE| e& K!+ Ϡh a>w1ċ2CCps=onc^ ױ\qcŒsvb^ψc060aDDG999""""""!3n6푺#cNfx94[D ,^clw];񶼯+Uvh .mV 4wicciwN#au9{s:N-0=&3\eeuW; KHGCcc 9lx4s977;S3ll]GF++U\+gKmu.K/QavbՖj˥h;3u_ b|Ҷ͏l}Ga /w!;M!Ȝk+ҧb3FŖF,>ܯPeQ =¬E|Add%E<}# @LRahU]FKuCA~ŇeZ 6pYhFC %Q adقMo"uXe:5L,enjڭƛlY[֫rܺ^)rrS.-FZ-l:U9b2?Pq?6E5(1d;m%|EuWǪB.ςt>?>`\^ï|E ]^i[}_B~ʈg%M`1SY"+x9)䦯ܲ_>ͭxR- xp w*?\Oڴ6!\38 } waI,^J*l2Vl*_`n`ØQT_1[] zڲuml۪."N<r˭Pj}Z>C UU;>Z6Շ2ţh#C# \XphqbhՃheY r076 ͍n`nm*n cFA78p/88bnla& &66 9!I؛nbaan7&c'#*{k)ýF;֫%~~mkP~ Wa, Ra<«*|D}8 ڿyA<\°00{7!sC^ct:YL*K}GrQ.%b%hWׯbJ_70Y2=5CY3'+?Yjızjw~qu$8Rŵ2|,yUt=?m܋ӪbQ.|Ϲc;|?'=b>>;#nUU*-I%-clj'Xn|-HS,#5KnqZ?v]/٢:tt9~pQ8-aWv?E ·Bц0e] 86ccL#rv}#s9TU#r9ṹnn f'Ǹ 44x 9"-Vs$C [c4b44m4g}w̦2Nq?t0s?lr9a4_pj5bnjl[4nph4ll5jѱhѹt:3ôNdѱF3qnjhڬ;Nӡ;éhamRl.er.kzL84hV. []GCjt9{s6[.Yb#,iZG3湬u4h+k+JêaS\kr-1\t6V͛6+j޹UŵNWvF s[c7FSs[KӴs:n{ 7;M۰]R˩t::ڹ]h<6:ɬhmlaFUhѪebͭۂ8ƈ"8Thѣ&YMV 0,hBomv\Yml2112˂i-[ض\,[2U \-[[Vы遴5lKVKѣGB\h_j#%YH/tj &Gχ}xdiiii٩~UࡢKcE,,]J_Z 0FbF@԰K#DyaPFl2ݍ;olݒB蕢lUNC-)n7;=eE2:2ʘU+]u`dde] 0, v8Vm 551cW:0+ .z­Npw..+ px)ʪ9;Mʴ6R) ȨV⛃G# 0\Թ-F0vN멱nex&lj.z%aa07)!qRj*vsJ\ӑ89 S"=rJԶp74, VMɈp.4NJR:@[)O Q)}mSduU*P QsP#c?\4y 0 h-w+ c!w!t&jqTd?BC"FׯV1R>6lhDFavq#v$OD;//46!'i%wk{PuC R^O8½'^cap<(C`8WJl>ezB;S amҪv̦S{-12Ž!̛ &'iKīBOfW+VZcSc)YG |)Qo2vwHX1ЫJ`NPeXAҎ*-C+wh!D"B#4A whV*eVcV3!D79ҿT vc26k`ژ67U\`c jAzu g0CyеS F\7f"`MI-kʡ?p Sr]B$LX˻/T|6ìb QUGꐾ |W/!'Kjj%#?*bG>aC`o̕=YԵ =jD/( lU=M#~D1;|OřݳQh8C6_\_rعv:쓵rg>l097k w|1uʻK*st-oϖnx]n9$kFe s}-v\Nv&=J#qajlSeder4TL42LJ>Zkі.*Q̕t.X]ГqU]lA )큅v9BR:<"eT.J6~U%+(Ij]{7W7jG9m<z9%]C/:Nتrޏ c&űlFZٛ-[FZ/%TQ.7:ϜsR_(o>| H_Vd1TW!r vD_ ʘ }TyF1FQ2,"ȲL2IᨗTtb \RUUUUUUUUUUUUUUff0<k*xz Zfha6LJ5 "8Q 0AՁL}8Q]UO̳ef,()b-"L;>VDj=Ы; ,J0b,J;݅LƏ;} \mORra"ziT\#V\E*u\:w+Wmpڦa*R`%`7)}ǁlX0Qfe@/eveE_+ӳp<ַ+Vعq܃qWY ,fЅж[f7`vQ*Hj0\&FDV4YjiSLh–:<ҔeFpZ1myQd*G=E:`< l`UW*FDk& U1NѕGOoX"2vUF4+CۨSlQ 2Gu&ʂcH2x Zs8;.*2W+I$qTx,a, bb& ثUq lRø3kʹqwXhe#FX2/֐QrR%'Ah<|5b#Ӂ|\??fV[ȭa˶`ʁXMQ{?/ =OkI;?~QYXK,Eu~ڿ}l~(rڟk!|2+('>H$2FFĴWDvTAFwn9Ar-RISIjG'{}߾mlU`(%X[MiZkZѭkMkZlV+1BmL)1§\<]KrGR.%O45vi/NTz][:NO"C#VP|ea[Hy*MV+RN%BhZzmieSfgw),X,Ab6[Cy}L,v6Xl#:][[Q|vVAvql_m[Sb Xm!S =z,oEOvwr% VTBz~x_J^!UM| --FKIh--FKQi^Ca4FVYz-P* E'UH\=s?J\㲦>_a,EZUjUVZUjUV݆lbeS" h3F+*ͷ 49DD[T*7pT7&ڸ{b[ӂс6-*ʖFѤ14:yF+*ɆL2v1 2LZ1a[ԙZrŚM5hRDiL!Z S)T2YVQH*ڶu9:jD"1U/]Ga#(Wm/Ui=}[PPRή GSUZ8N)>b]yp­Qü |V} ya¹DxB"U5[@-U2sڒٖRt RzF͞"! .KQ-lQYUeIC>XmutO=Q|ӿ}i};2sq5ŷ[k]^فVv.ŕw'uxxZaF*'V4ۦ31]{Eiƌ4aѣjц)[VXabnj[nlj0-bh! 1jb+q'A20\(Z[XU[[zl0F%M+/A7,m5+TnruȈDDDDDrm 3C5eOPaxzJQ7> 6N,&-hF,Z2%-hFX2*-԰$Qy>SJX]UH;b/1abXeCMM 6izɰ02ѽ'aUZ"-mnGkL0eX,'}¬o7zdJޑLUYY1B#6w4LLR⎿7~|tE 0ad"",D}-!F =-Z$@*=-)lJ:\e;iA=%j Ыj^, ~Ңap2´\ UmCFh\Q"1X~Ck!(sG63s̻o499NM-Kz梓~턾X8,0hʜ2IžNqFV.S-`ðN+ ;%'V>n*'E0 K]j;صeo\Ю7QuEL IܖE,RǣlD+oWFʘ ͒ƴ-g%-}<3kȪ2~MKilh:򩭿3n]㙒ޢϦ;aMaV9Qt1,5j9wuB6)[vXPpK΋ *lr(ƭ49[U" ^\ՙEC@eA6DՈFUEh2cـqjDY<bF ԣKi܋E(#v%W,}mcp\kjR @Β9驨8H~GPrzm6իF)Ů2=O\Չ0,E^o9KZ%mWG3 SLxsGM*2=AF®Wi|VЫn[z0PebYmif"dkhL>A1~ʯA4ai:dDP-]C*NFr@~vUK_*޹*>W?^Q{oGQy_wٙRJRnpvҎ NPʟڢ?d8.Xd>W'ngTv 2*yz-80`gb+U>jzO6ZlӮ*w0Ջ)=++oQEr 2d[J\6lUV⑪"}$V+ᢾ|ESkaf 2ī0Yg,&+ͥr en\bk[VΑq-Tj&I GQ fA-=e͍c2ka 5ŮPXUKm"3-kY֭-mEkUFQ$FEb2̧YVug DZa#@$aIPeTF`2QdV(F)RI&2d&ٳ-UVT YX&C*HTmHGXV} $Guʍ|/XdH mT@gR Ȃ1 :!"i]$9U]8mq/?~V`<AC*Yfs\au"п4l Gh2L44$8QWH/jWhinȚ^;_$m}?A\|B/UN((FҎTDdel[_6?(J> QF U4TbTpPdWJ6h5GQO{У(KKB| W䟹:b]'ŀ`1'|I|NYbA시^:3맥V?mN[r:zeB9:㸎 e/V sc&ܥp|~rwUYGq% jիVְaMOh],IA\y LSYf,O`_85]R GyL-2V t(H+`e~/u%~_dk̾J'*eu/zjg^I@2@,?*2kLj#CPᾒ .Mru1ȏV NvlmDe2~ 9!njV<5绻,vwrnj7.ڕjJ@_D^oWK~įX +*zjQȯ_]enW9]y'."^VynաqlmR#`-l_q|ߧ/.{N\Pa<^6fӀ:A$h;I 8G 'Y@nykDp3uo#oWT!u(&%:\%?{-2||ߪxp!w #yIOmc;km.4;_s C9$iУ/v[%xX[(}}+ŔV*ȥe|O@GUB~+d9؀vG.i˕7:OXNX6͞jNN$z87RGX|ߝ]=+ 5ALX=uMmqPT* 2LS* Br:.n1I$dI$I$ffffffff33333333Qqqqqsϝ>:"8љ>th35fffffffffg33333335#5ӊ(*ڕ*UGG] avO[Bo?͑6!ӏ2;Ay 13oD<(<%m+@s2o@?O $XR[đZ@=GbB# vn߷[u7s8m@\7( rAzGvg7H ztmm|V8 7# I !q_.MB%y&% }0@&Lddτ:z_'/dMgЃ\xnUT/:ty﷾a-c^=ϵC}vîv=7y"}]Y{w6ph }ݩMjϽw;续t7/zqݵIﻞ瞴{>6۝{ϬOw;/{sr]g:*緯&kzӧi6fmv[mw.v|Geu7}Ϫ>kwvswœ&{n=;=-wkvoy7y/{SϽ̛=sv=]_w޳{wʫiw-}w}紗viiv{ݴ3K}^.(|}٨W].֫79u'mesxmwv7>}4t\{{}o}*_w@ {}Μܹ"ݻgꝫgL{]ig3'+Ok2]Ymv3[sks]nwsnY nu;5vv1V.]sY[l˲uRm۽ {e]w[v6.ɷWfKnΫh0kR6܋,ݽjYfnۻ֬Nijuݩ'wC3۷9ݫNi5ӵew[ݶw9W5jvqW5ˌŰv9zۺrkuNnU:ܛjmswlݛungZϽ;m5滳mnݺݭXnnwr;]gK^sͷtmk&x{۫vN]S]u_.gPo_oy0`%|&w}{/6^ηp||t{|hxukoݗywWY^voy L;vd6=vnSzz른4 [-y_7ݟ)ws}>okWmrw@9{ݹ뾗{˻jww€ᆵ걷۞֧{|z״.׭8Ww>u{ڥן_osGn}z=V]9}>jUlZNޯϞz}rk[[{۫Uq/w֝k>i}v7m;>k/5=GU=uݯkwRnawMw7fw{Y^xn}껕n^9ǵk;[ji4湦w\gy;;۵yz-O{aݛ-׶^ݺֳ]7zUѮuͽ6bmwUsv1os{in6d65{ʳuݸ.ۻ{˷qհn[wj^wטݽ]v25{{s[l۹[Wnz[m^w;Y{׷{׷n{sv:y컳Cm[gF^nͽǞ{:nzۮo{J/wh6oC힇QvEsA^e9[GgGZ<̑jq׹* O`qq63.NcGvΎ;mNݜ4wowkݭsW^ow;rGtݵ]º{MnllqgG;1ζsVklݹLc'v.ݹWr֫Z9˫Y[l-wmuݕe*qrnڵ m;srjvY^{mZt]knۋUfN88[ٍXݭnp۝;wu\ݬk;ٮv+V]UDsuw=o{޽X){ޏ] vz ^}{rנ=ݥN lh}vaA` TZOδӡh>0Wհ{Rwk^Hthhہ)yGlmz)OstP @X4 : 3;uS}ҔSサC`@Xp=Phu*(G۽IrHKIxHv ݝΝ(w`"@9T(pUq@PS;u@or(]:Pϱq{4:G֏>z: o)@H=Ǡ8@P}u7e 톀GBJ< ;}R JUAn$A%\9( z>E*I޽RBI( 1)Z+9()<@;*@^u{G}ynFp z]E<>`;uoZz@:uC\*&CLiM4Ѡi44i2h4ShiM4dh2H%T14F22h@ih2hi44`FM4hh42i0&LFhh4hhzhh4hh@dj U 4 &iO4L 0FA4@L4hh@dȞALɑF0 114 444244hh@jz T AFh,SQ)(jiHܲJJE ϒU5UE/Ie0]W]i- $B%Y)zVh17F `E K˥## TV-TKKOViRU%UTYt,TJRE gŅJ`z* lrLԤ!kD(бbE$RKEE(FdѐFMUԍe^$eTEI4/Wd%) D*OU+mvQRKedmۄQD$u!/tڥH*׽-Xh,v21[+fDJlTNIޚ\6" YRIKHL5keh޵z ^V^jVYVƨMrhDML@(AAiZ7Ӷ` |*a{XU^XaFi°QjZ9r6hk:ҵ:;+`!dv]I0Q'0Rw3AU EEQEB`ڒ-[\HٻsX#"dqfXBe[^fKĊ^Rٶ2_N_ҦzF+C5-TNjq!&A0I4d٩͆lLll1j RMՔòz*h3RT%PRfHGEumնCa&:欠4hct"D g쾢EVrn8$qfT ?T%WĶ=9fN`3z#a.^t27;.n8g'Kq cF3j|x /),75'B:gH/.Ь6yM߬o"h5Dr{\&} '&pn%|u4ұu_l.fErK-gd28Ur\' "pOuV\wys;|iBtM:Y1g{vic3PgE#4ytfSF+zJF4%^  VH(\UTRwV2J˵ s$£:n0E/UܒHm*Q$_ӲׯS;N@xW{?s,1넭6$> :3aɓ.H5vcU72mZfY-ֳ ucZs5͌C_ 5:6׆k3aѥM\.֓nB}!6uZkezmY a6[n]ӽi^7Mv jo[ NlMFnɗ@ѶCY[$2[-H~}hq(&,D8}3*AÃ;[f5Ƶ٘nľWDgɾ҃F`&aNQBF1u2(D % Yw@ O8dn ¨ $઄;)\BtJqlɀKR67 JR**(PTViERT56+`W{Kʩl5QC=ٓ-|n]o=5W,4A5L̦]Yk[_TѴQITZKEe&Ճ Ŵ-kdfQSU`T eJƊ\T*F)EڅaYl}4l4i4k kCi3K>׍hu;vuK3Y-eLt/zPɋ-l*,((1Za8 7)!S}B--,ܐDeXM`mb$060UmMJh3foT_9HeZC;4$A|j.I+S"֗Yj]kKXwQ&w&zl Xv[B] " fi ZA_4>$JF\3o95-2V7]5TӴ. S}GBYNu0.]45UTŧ5yi TR]iLCfgd[JSظvLժndҶ ^**Q7};~oh/ݺ[vx[XbYwdz hC.|+ ;6l_O!.USd0VPA7JG@"ILBRHED܈%)"KD%Icb") P#9V{s~m!$,$HRPTPjmRTEI% 6pS&L$xz$SPQB$b- 3Q&, "I엌ɯWʔUl.heIզIa )?!iQ)IJ4.&֤ZL*$Jj!C4$$vzT鐪RQu$YD{zYHkUjML%$M9S~{u¯!֑ZWpnn?kԩ/*jZjZggggggggggggggggggggggggggggg:Ct:Ph%R '2{D`vclEF[GIY;0E﫶46R zCe$J@4 8C<3j :}#[M}̘an ;,5&~S3Om-CWM~3&Q3Fj0% mUNk6 C&Wih"œ zAn~Y4Q4u-,U;3UҶzYa4ie2j&xGsEMfF.VjgZʾQ[f+C_VFm-5sb4SH`mi3ːNe$+X,ŧ{d ],uB]{񕆅Vn ch_Wa'cqEU6m"!dTDBN%N !bRDB?'tTƒT8л6q qF) U$5Q{_x$7+XUv{=~є0Uc"Z"ZХEj&jFN^;JؤIIض7#kD%$Q:j񖄒ޯZ_Vݑi~ױmI#CB<{f ':?ux5tnOg[# ('\^qw{jp԰!г\z HрnĂ96-`@i*wF^Mzͽme>ggnIx&o=vwNͼghyqNsOoӪ/Xюcd}VG!Oے80`lHc <LAiI$é YјۘUcJg3ey'I6X ^z2< o%ϧ\cs GRu6OT ԩcVYG͒jLhYoِ!O6J=4L8M>%R隡=۔ tReG(Iw.?(bCDC{}^% 813Q4i !DGoo W8 ^NfĮ(`(91ȏbYZ*c;V#\,x]0ټDOIVe~b`FJI ږS!(Gٚ:;c$K }ojWF QVF?‘hᾇbSUo;ge;X1__`gF|feAhSB" $8=bZG}EBgsHi դ!o pC(r R9SGdUbůcK{+>:gYR=7-MPXƐe 9 O#"ɔ}RG$y]ݬ!+ 53Z!W2o4`g,GTUK+iBߣ=}D1F4i~*;8 N)>YU:cKKޟ*!؂TJokyt*{PݳBt'~rQ-pif^p_ 3y!XVf$@;HWHo_zo}rWk hw5-!Eů2 nFWfw!<5=Ā!""TGej&澰~0I͕ЙɌFC"Џ_SIc\΍~B$Qn3 %îx-(១\66/uҮ)?tB#fxT-a.'|f2D-rǨŐ~2s'!v ;)d@ݫ:3nb\+- ܙ?׾YYdI_/μ RvȈN oѽyv>u}wy;# LtY$J|ꐔJ% PHD!L_r=(sύvIq%DhHU۲o5i3tّy쯜0 $iYL,]cXOpހ 2[Ilk M;C^꼕HM'7䬈|TVQ=27gOKhb4fC1u) Z"+sT@qsؼyp=<SGU BI);44FzDbqƠyV$sц5c=KزqPc UzԄz`# tqF` 83C|0P:k̤{a'NwўG޸Gŷ%Ç`xgk|%̎E em-jF`@ gLf=&S%*5ֻQc&br21݉ gvN4ؒ}'\w498ee_r\կBDxu} Oi/ZeL;C<,ux2RqH0hGܓ:r,J[&8d#̫Q)V#;BBdD`y>ìNpn2Ϗ͙;~C|*!RrUe:GkŠJ̸Ѽ+b^\`ȑP.JWSeH̓_1_,QS=7^^c2`Z %t&E:Εs(f>q_G?f^^Pf0^4LBA ӿ"N!ZDR@} eޖ x@g3e[=H(1k?Bp9T?,uCgQQ77b4>P@Udv/yA&\'<OGrV(=62M'{pJyZ607UAoHmlF %Ǚ Ǟ$x}Dɒ0rP_%UM&q0 8'?'nA:6u=#}`rBa ND ˓t{/6I&tU, IJ*BN~#!2-(O*~6a2 [I/\.wDkmqq^.P;R Lͳo9YH~+aijQJ%*B B QR BDU"IRH @%*F5U$ZJZ$,HTB)TQJ"THQ(R*QT*UIJ*'vwmڜ6JzM{ߗêl:cOyE (]xޱpTG81}H`PWќُ.A d$1ϐ׃0$6J_7Wm[6wV3n8 Qri}\^^\?`SܚuߜonX-( ^LQ:p;׺M pL2[dm H^Fzr`cAE%1)'A8DŽ =IS7։V{91{fɄuUWvA533]G5V0 JA(`8Ő`QA#EbpHbstto$^Er,|3k{+LVH|c"M~FhqA*,Ja8av:' ͬ a;H"VQɝAGӅ2:q|Qr.H\q_ IB"HC} D3s*"?#Wy! J$UUI)RUD*$OY5z'voNt߯u@َ5ic&ScKIh9ʌO4O0('I.%%{YJk0pR>_ MDYL0Fh7p-Mیu<^CaU6^|ۉ1cŀq갈5WY%o5؏~uBv/qH'A@ڊrp [)ڞ(Ϊ^^!˸p Ŋ! Aa*ݪhI`Yg#z#vZ< qlDjdRNCyIVuvم4'w kU)&xFUϙ?.DBgl~qdc(X@!LP] =TlJhbiP-oʐ'VjQP0B@jW:G N-Jc2eDt'_LÈ|Q9qʆMtͭZ\"aQ;W@drr|Kv, ic4[+AKliV7*9˃PTID^vynB22#i}!|y" zNA ohfm 1 Ǹ$!X S) -O'{{p[B(ٗS]qt21ߛ$A,_{?:[/;M9cKTFo"e4k!0l&p&r"7sp.Id^cIH,Hh 0Mla[kz^C~?/ jkD&9ߏأ,kW ,|W1ybJ"BxQ6lOtGJP*r3Ve}#j Gbd:bO?fk13H $zb;V ,,2UFw,+TWe#c *]Z)1!6&,GNA{6W(6"F!F%9{8ʺwS#̒L옚ֳE -9 %1Tw^T*J*{ "@r"= $ۤE)\S"='i 3?k>HA?]KEf.ѥPG, 1$ K !숤"Py,X[ V>BX8Bj5ɊxL{WWpr іO>Ȓ|( <Ή YbH$6ʉHPv\y9]і0L1I]s$6ǔ,g1vgeYȩIq2Pg0Y|.Bv$gJHzy&xOI47I%oZS`+ סh􈚚a( "p#Khj3}xCl`ՙǖ#$@G!lw吷bq7S8r;w읁rlB"_#ÈUY=Ü@wbzNZvd R)óxZ6-BvK2!":cj0]"$o)Ք Snf0 t0Ѷ+b 9 re# ›M4\曄}V&w˂qE}@-(״PT pL)o8۫Yh1Ssk'u:Eݍ w k'eqE(].$cOq7v3{IIÜ:pFZc IƋQ\*ɴLB.G5d0Ir5>na&'pݜH/8 \@dL9x'b, :0Ӽ;*gH_<2"H^Z xaZx0vˉ T\]0fa$Qؘ[=gM3,yICSk&jYZ0u;F WS s422, `i͠J.bMbi=ay$~.sc %)\ Y]BR*j*TUB*U* UU*E*IJ!%RI"QTɵ|7kM΢DS%c\K&T~eUK\RDUOKRAPU)UJ))%)K$I)E(TUTI"RUT6/;#矍:aC 0gF;e1r%X-S9t2j@3PbMN,tzQĚXtHL?k!X8 -|_ĕ0)1yv0:f}pbfM%rf0~Mqp6.N"lIXb'ih@͕t sV!aa_$S3!Y`iq=39 8DO[+~%zbM6QX&mSz&ƅ1RSyRU 6R{v?08")pu0DUsF +"Ĝ:hQ@bцm*LMW:IecZD^f {$vt!zj5'˥MElRyLK7sƇb6WYgP|=i##;@TƩJφuFM@.[p1Fi0djb` hh9*S%:0*&c&ԗѲu+P!b15>0' 2e%NZVhC.Esd]$*2X0ӱ&9dD,6FKIRE6MOlޛ" 7vɮxNoỌZEKѡscɘ<d(C BD8{+#O×EЄ QTI]r~>Դ0e$?y2JK="druy^%='R˖Dx[fj^[#SI9T8ǎNMך82K(@eaH{JƄ;clg7}I$Oz>7u\)L(@v ?;ޙwէ^Ċ$'9t]%AJq06ۃ0c5:ga|҅KYtM35ݾ H\#$m<)*$,EV_xZ=n@y7iTCn:?"9D]%gQ̓-NQ`hn"'Yw1BU\c1FC?\C2Αɑ|/on0$ITސoHHqX+p[ԅ ,CL%nInQn ΍&}|00ÓL'I5Gn֟3*cM4 Dls&5'_%bk1`Eqإq&6, q@p-@Q[.}& E~LKmi(QKxa q/!>}kQIBÓ(Ϲ/3T'}E3U`~2Wh)S;3* &sz8s:p}l-ρ__УFAPJI8iL!xyq_8+tE7cT`B@\fÂoqL?nro1GmϒK?k,Nrlן_q/{B$&`t_ez#8 t2'LW\3!C#f"Hw3;a͒c c^tm+f%d_Y.-lXfTu6 %-ͳC͊[W9 I~^X!y_zLҮ"E7/3'R"lx,Ӽ:7c8uJH^ZEe-8Dkvbr1 T*BxA(oђ4E/ L i3TaHHh/z~ f9 ~Ը.qL6t2$o#GDmb 4Q c.5 MHSJLգ 5:a?YHɷf 7iEUfTtي@k&hW0K}{+ I-E]/+,qjLI*Y=1oW؉0!Q#GE`AQ>ޭ%*$(IǽOqBѠ9/zD,-E.CxǯO-&p,IEɔvU>Ah\ q7E!shπ1GĮ'G$k]a<14k0ŏܑ9iVi42<\NoLŠ$hUM4]_( `KN1\'7{'NA@\pSfDׄ8杲owɸ2e|RfĞ0r,_;C&3*i+ gYCD)=˅ k{*DB):d\a'g*縑fl1*@dFRH[DNҌSIq$Ai&J L?W?(oiO̊6fH!K!${<[r~-OAEz{=6'[LMސ|3Ks!9>2}gmܘI ~^/r杒&G'neCM`̲"(lr*P~(F6gk5I&&5n2$xȂ D8T2-yaPb#cA TA~fcpD~gλ52ҿiZ*Ҽ0IP]9᮲ p{I}%DP3O̜ԓ6ȏ\Οb.>q`<̬w1P޹FFFRy NRKiC뛫PAAkG4QF+G.8&v 'A7a])ɱgn2_f1JR@zŠ_?ĝhLo&Jv# ˙6%1#YJlt3'`m)hfDvE)U\0O-Y3+|z4LABד*Q$l $7τĜo>oj A[c$+v SsF1H1HjI]1']0U"}ƌΌ!0.DFwxVJ<0OJY"<1"kPp&: |CI!!\q*z!Þb% rnX@BBΓdET✾MPh"DM=8_al-)AR xM=OCJUra! ˜кT'Ȏ!`=GH@=*=I*CIMcE^3:8dIwғ$ĉ Dq-wQ`+'d&|Ҭ1:B8 AįAg,0ks,Rr"OF6 h`7tF9gY >T 9:䮽 ~PA}X+Qb&FGC6',M  %Wό5Cj̡T<ÔÜ^< _z!0[ $Ywi|_`nb}u`u :}OaQ}ާ9xe8Gp2\_忈)V~epߘ cH݂(w@@I1XT;6yM>ch[cx%͈,;B@FHg0= !R q3w5߂ĞkzKߞmQ8c tf$gru%l8@-o^/_K|*^Etoo%T@lvbC|I6.mhO"HNo=~-,!uo.9?A޲V 1H( y üS$)grm&Y2Yfgdi$;ͥqOA~ݫ,(24,)q[!#(fv^3 M[5bxdI74N-Q}#fDg1+@.Mi8FYIÑ{Gʰ",,[,{NmLn#UK."Z`C×ePL$oQ`>TM6•πC3UrmLԄG̕AƟo0aI "l>G*2i 98,v 4d.ApOMy8\>sp?cYfPb0ɡV3*G! T '/AǹM>J97E1Y0)-28yG(z5YJ D D1p}J.a?ἑgEc[?g Ⅳ# x?`*z`fy2ؿFfPPBZ0>JA" \L+|P{qţM[JrG<2D\ 5[7qD<,t5q'=N)f i'mtr,wN2w2Pvi  E7 # ,QA z^} Y\O\8}((%YS&'0:fOG#;- Σlg!NҾPWSs @a- I(651# U Wԟf9Sۇ CY J9E@쏂gրQeI2ںV~fI)8sA] 28sUVTKhؚ%Tm3[YD N$7 ߧ^o1ٳSIuFn5Ȉ1o#hvk )g$db6܍zՊCJI6W=Oc 3ѯWBb#@l Bt2_=i,Dy ~q|faNaN cU3l6+OӢ(G2oyz3 TzB2sWTjDF 4n GzxSh=bPoQϦyY>1cpׅ< @fͨI!rtE<]~M>\KOÝD!HdbQ@PV/I>=Dp š/dƘ@wF Ɇ"{&vT C*9PP\)LmrYRlP8Zc*GC' oKfA UВZƒt4om aVӎƈ1g`շ:8Br++Ci!Zɽf$QlΛ{|}})#9)H)6||z"iL6],J~. a;kb uB,2s^b)Nc! #LCB U) &+x H)5]. jm' HOorjT&4 #Q0cxSm8eJLfF2J?rQ$ 3Z 8 x3rY_*fQJ G魝~Puyp\1 (1$) "]{`4kʑ͗% Jb{K5*p]!&*OZWFx:d 6<'6{^MCV) =O^Mć\dϔM$NRp7HP,EdY*Ra-,*TYe,GKJ^ZE.`J}E2R0Q/)*TEJ!K)J))JQE%ʗ݋o4&ܖNK b/AY+f#H RigLc "V?(hQM7wHbHǛ 9J+C)B*"h,BY<)"S%%ʗCv%* .U#*R򖔩JJJJRId@))RDTFe%JRJI))))$#K$IJT HR%%E%$%MR,/1Zf0K0Q)S1fB!f2h&V"L҉&IQ RT E!xKAfKJED "4b%ԥ)JR)JR)hȴR0\`D.DT,o "]Du)JR$F2)R*DYI,C PVRKJ*RJJE%/3$FD)$M*ITRI%B@Y J)E)%%J)))&jD")JR,3&ETIIIH,TI)$JSD,JL*.JJ -F }6 ,mZ5iyܮFꢩTka?ZMywLxR&uXo;F!(Bc. ZbU9F@1QJ>$h K)yɳ~)-'#>_NYԱ~$vߠN+3˅1%8w̙؈ 7-(mL#JiOkψ3'H @+rx@\Ta1.nK#=јژ{0~}M3U( [yhB>e2̣CDW.+i6`qcaLlrGa4?;a}8F!-L2x.-&k%Ќ+"؃JI4+n})(.WdIEbIUH,"/q%=法)*, ==tѺڑzG9T?_7tz3#(s 2r:DVpޔ1m A&'!RRMc 63.O2,(jR6 J(i9G|8x98>#o|&SKM`cR'!tuA;40Q[As7ӄ=rnIF[Ycy*X2+hew$Xx=2%tU<f [)%'`,Cm 4M2UZ^~FIxm|Ay T;RpD<8/0pnL?5?W6 b Hc蚳vtWQB )4³zC\is٫;fdhB0']/~X%So.gS"MBS"=!U9W@ 'pa5 It[EqM6p"u \1b| }.yV,1[ji`/HPkƂ/bLVc2GN2˚#kݖdj"m`9$!&%`5!nrL O _e=s??`}J(1+*4Vt{ ɘĈ׸Z%+J3[faŏ12 S2"u $'¤-rV% R2D{;洢e‰B]"b3'zL:M{fr tlȟ!9gaGsU|" {%-5Hd-`:"^GTh 0DC# zc6gBsO 5Iq9]/]u3#3 { 2=b+dHBbhyЗҟcZ`M28vJ (7aK7BOZl wqd XnL/Btv=Z1( D98ŨFVい"hKr+jO7RDbJ"JgIQ4b!>'s4|}mx2Mda`d(o.H~ .PϊE4\hcM,οvq; r7Ez n&owczY&ʽAAi>i}n )#floF~*a|QIGQJϠw w:Qn}K)/SɔRA71 [rC:W1QY4yrS1{Ǝȶd1 D>@pm3|m0:Y Af]ϒ۰9'#p+wA,5! t0:3YS}fN)&:Mu[PhD|cheGDtD)"ٍ9?/Kys$EfM@FPlҰoHӛqL Y՝:"B KEI, R.#zEv}Ydj=#(aO;H8G2[l4bpui1)#VC/.R dG Dգc<'|}~{ [2FRPjU$E?)/X~*#Z_" L&V -#ۜg2ƓO;繊q EƮ`1%#$*6{3]oL!GM3")Lt!pL"Dm[񖅬'M(1;&cߏf!;DZ+ϖ 6&1+ϺhlstA0S[<4juq"uiJ!pWJQHJG(ab5gmr %NfhjőGrK bϝ:lt?MI p1P1aɊΨKvB[7?Nj̱ 'yWh3\)μx;"fYO哳h CFJsqQ,ziDbH #,AP8= 6T#yĦ5ĹE[?Ҕq4`!yh(RCqW3t2ܒT 2@z NģIscuN;i% Q/#lY89G8{19!q v9`+'x9^CxO~NpqjbMy?DAXzr y05Uu$TnHz$J{|䶲ZEGEܶ~Ԉ ٸ{lih+ ezre*G 4UdU,n4g{z `Ŏ28b(MI?iA9s2E&]ͻSBf Ba^y^,bwGf/On1\N|]E/)'!bJd h9":wG'IBTxvo0Nh1Kd 0Hq./zeFX ݡGV-Oo'Q0#z(ЍC@V?gLʨ[EXaP)*x2g&"-f4Ǚe7{Y튄!co; v}=&m.#f5߼?EMdف7ݨdIm`Dsl(h\c]ʦ)zвa@V(!߄c/2IIѝPCo>9v*vR!KEZp9teJD}(Jnfda(!t\ %԰DkEԚ{=CȘDT]i[YR$\$.DAc;͙>$c5OJB-1gHz AM""!m_02p5ف>Z7@]iƀxbrzcz r<Ǫ.4_,:)p "xԜG!4S?&.& *~l0^Jjp&4#6_8?c#'s0webie8KPgͿTcoah?Gsuj9Ǧ)OҬ{ܩKޚ@x$ 1Z7?SY5?Z! |5#1,5%@.h8f||:PRdHHMvd`yO)"x@~F'ЏF>[>'[60h~EEpkA3CaO&NKq! `< =;~f8զ 2/)؅qˣh]$jhٵR Ji8?̣ &;zQ$}$I|Ia u60a=?`%c㎁ǜ'En$`2Brvsw?Gn18F@$R߉BG"yz:㥎4Y$HE韈o1kr^hM뉼S{(WK "T)ID)^AD{vzWl}sqa6d7{Er'4tMf4LLbij 뼂b2+t"WxJ`Ѹ{9d"Oڣv; UqL^vG,^ T θ}LsHkX)=0p1!)F"6CeYr \N-yP4$S! I%/5}4piJ"B5?ש7&;D嚨s\FH_ӊ= A-p)97KqЖW#$RՒld3w$wOne3dTA͸| \&j-$/guJjLն 8,kfK!k|IA~g!^AG nGc|B n,Khv`g) |Sctɒca?8jY-y`a dY=T"a|:6w-LfhD381gzf /AEݙF)4y$g)k6Rf]d9TsIq/#C=dX%Dg\`| |Lx-LH!,O5ԧ+OfֻVIt(.$]$hO@+Jf]8xλY۟: XNda;BA>hM!FS@AB7$Qf)-4{lcDx f FGP%5na#rin@PU;b!A S^7õOO_txs\xœP|9ٌb9-XԮg1>9\8HP/AMیE9/XLrM)(Hɒ&#AC\theV螡_WFTa3V"2*8_Q94Fq;&!XN4IuǁIm]Pxr&Dxٌ=toBq>܆}KadLYcrAjr:5m n<&hxK3U y9B^`r|m4K 1uBUwJ8Դo!ԛ24SȑL0y m8a80>nJ<OEٔeǙ>@-t,a0W笜>7gFA T\ "ߎ!.Ens T:YC T1+v5kBF%DȜIAWt.+7}17& i50}ap{!eЅF@h Z(Oā>0Cz:hv(SC&T|̉Lx?Xhkt P3a@H{ Bu}4cNِy3zI|]ڧž)OǢ¤TZKvjjHH|jrOi厾m2.櫔 FhRp+td}FBGsI ֗F/jKܚԨs\YéVkKƀW\D< :NN?xFG!'4A^#y3ъFG?О.HSpBW ЋN?|(/XGDI{>r3DQɁX*Sa b/b8Ut 9̛;E-빈jv@t0YV t F0ٽr,F8lg,%(371&@ȆC#iu%&1Q%Fã32ԛa(v\Qj$r㎙CAQ. i  F۝1R'V9f&6RU, Gb'E. 2G1 }lϸ10D6# %63gf7on35&6m kY6r?NP!)SGd-Q+AdΊ"́,*NF\x5X.YP>$NMYՠ;g F!N L`SQ&{iuFKJ#3!o~Έ?NcSmQIx S,맡"9 ~+w^:KAj* DzPH<$dS3Ǹ1\~H|% f5! {&a M('`ufG MP~  ba__| ^݂f@qA/ڹ˵{2Ė'z|&fO]*orgTwy"xȊYVC'ȓgy*bwЋN8}7-A{Ee) a~IQ2?l6i bj.17N2(Ao Vx- uyR 0AKS]kB) rn-B>xM ']vj`|D9ȷGH8JdMBtv/:dmI$J4F~ _:1Zϊ0'^ A 8B)|t>\?΀\ 9"M/[GVPU $du4xGlB;7Oq /8Lh~: 9nŢ5I{bGg *&tËsw!y<`ƙS:Z_ipɘzB~~-)lF¢῏F.(S)! l\K_xo8qƝFgG%!xN( r)# j8I >a QmOFfP`×1\l mey~b7s@eI" jI'{t4m &3Y}xd98d7H*|%7*kKqRCNԭa|z1c2u_O3)ù5,V-˼ɢ6x'kc> o )} ?❃oX! Ya&]hϖz'37e``4 Q$V{xؕiVp*dM*qvsRoo+c8SEBz?W3 [SVe%vw(R`6Jb_njӤSD@3}'O" fWV Gk3^87f Y`|5C2a813=$99BHŜ`1I9SQxfΌlb"NZ-n aJvDI:mi1-;gf*mD#S#ЬdO8 g/}&گ$ STk/t=:20˞y6&U%UP<(m,?FA.xv+?L>7:%k&S+`7CF#Vb1'<Gʊ) -پn15@V+:6ca[xYIK,qC,>TSPЈ|L.2(tu/s8}ƛZ0s+  ȼ@x]T |ulcJL2  9@ԣ /+hMךW牻B-0p3_ p %Dá;kb@~#gL#ct)SbYqs/pPT !F2{!N)lJCG+Sl8T+pws0y))3xA/cZчp| ,[PCBmz)RsPFGj{ZGh+ѺH,Vs1xi6$ .W| ϩ-;BPggFP@n3Q%sm\O 5ã Quf0t3HV8}&Za2C%֋Շ2:pl("3"*3O{+jW{=-7D7G bL*b1b@P泦ZW# kPqGC`| hM񤠄qZpËϸ(CmIg̋baw_4Ϙ80s;qYS&o0id2` 78+?zD5% nSRO(F JbF*"SZ`Ivna;^'+k&h8V?܏9g 7dY&J&^ qاafL)ť7*u>$`6Ab*rgH/=H124g֖g%H a l[^3Ƥq 4wJhfxrfԧU1}C 8G_oFGIK)!7ٻ:qm؄ Cn3(%ΝDZ%ܟc4zkQL8L uScR8FT$JKBPiHb~$1 2eO){x/2'_R|-dc3#xg# PmCvmKrZJAm^cY< Ȕt?ފA "|0HPc(V-1Azh'dj(]>" P7osVk(B8XG#5ȯVI^@)E80-(@c뙓gH x@ loy.䡱y zxh3RŔם?Fw|GepC˿ b %mtĒaǸL'p[` _(̑s>%iLi{3yƌT5䣸Kvn@Fω9Q M#E`m n3&@oDՀHn r<nDFrB8֮Ԍ#X)=qy8\t&,S0dLr㉒7q&86Po cVIk1aZoIK[VQ2ff S *-( 1v{AKEEŋA+.|7W.4D0ИC2 fgߩŨLA&طYF.p8dVjKq r`DԢ3A##X)E5p!(g u8Rhp:y2g cU.ӳ d<`ǘ-[p= xޅ9_M3nA<[?,5xJ:S3C(tirr0f{9=N05NHp|DB|dpAfw.QsIz9& {w,zɔ32€*#Sa@t<[P+Z#vRgJ , 4WpXWIqRhRRe"^P ؐ,GV'B-',i'(V!<8Nt=RĥF`Ka9DĚp7 cEșVv S{"q3&Ѓ7ƚx6xHz(U/2DNGsxc 저hrP̲1@]}L"NK6ĉ2oF2(}B0b\<8[1Ĩ9k]Vdy>Ju !Q|S\qzHb?р&*Aarf潔&($ ^Hʑ_wVHMQxCd`w_iAN4~bkzFm~xfqE+ Fr]'yufW:$'ދOQ*S@u of?IJrH-eq-܍ĺ 3gAV`2TOt:_?!߂I >62gTD,1`4 PsC&z$iVW3~wx$";ݎ|o1Ԝhni|)Ys Fu^?A֔e:og)F' nu5^Lu04_>2]c(H)WPr[ r\=۟9+.`=nZ 4[aQ>Q6,ġ3("DBq- G,ew5 עו3GxC'JdCS??mМj% ?e`{ y%0ˆ8? eL:4d:3a&?er+ $< &(MF Kw$dGm'mX,gA ̆R"1@^J'X"oS#IːwL_~8䎩{׿|Զ|(RE4s!65'?'a~ϝ*Pqy (E@S&hMA4bllDuƲy%hm#Aʝ\d29#B4oΒD!*W]R}0(mx1jc uE#SrYAyt?ƥgFNRf2EQyN T8 A TCJyW0ac-q 3^ugt1.$+l6Gd✂xK)c:a;0iYQ7Ǧ=XG oˌ?Sv1n.\ȐlXlq0fxB8-vp5Pb,L r ow\NfIk#?"z$OmNT4O:7$o )*lg9" r1CP4N?DC*#b!K!C?za@6%YHs)9N"20S86Sc "Kۑ)fI"GHw2Ç\/'Pe|X @>'Th|)?H4=s2/)B8l 1G6D"d*lXdݝdtzuҹBdOB;uR8ǫASDs1R|&銡Tz>@KQÌ8L[sFL<@J&3y@# #cNwȎ9 Y3?*Z9پnKzÀl+bJ|>3]!&o:H e1θt%r;a=!o]>,# +iϊf &#fhV_ #58-_Qǧzo9 reQ*-R"E:!(mQx@OO}ވH8G"'KC/ϧ|TDˡt;YgQ Rbx-qb4~+ujqB!xy,yy+I-g$J"E5ڮIh4t_0Vf u`HWÊD@ "]HN!=2h0C bLᴔKL`>I6g&t!aɁf" wLavBY9flfT<:çJ!I'j̉2t"!t2<~3Дrt6tg$_nO~@E#O`S*6"GܷP:bFq53QAjZ3&ۏ1hbEi85Yn8P{Y2:I(ˎEx۱dR9!@-˼4']/(XhFRxōi@@qҳ:1mE@ B_0+޲8ߩ HOڈQɇ|?ݮi7&Tn0B$J@]1L[2)w=~ 4r8FW&Kg)aCۚQeeLoCŽ(AK)G5 !eRTsV \m#5=[HOC+Z3kB7@C }Zadυ K44B~LQS ,5?&93/ObǏf]ݑ'f?xÌBSNn4'>+Ә|v&;q~)7R&3hI^)DA͏ b}^3jCHREFHJӈbΡkHRˋф3MqXiVĞmZs0Pr z$èTgMDw q.- /,*z7EB%#4P?=Z(pNVT^κMw]V%yԱ䄷*yQ(EĽN?9ʈ~qDL4aEO "6QONDpR'~oqEd,0=cN1nAcD\6B ᎇT&,Xpc58Ϫ F7R3^Ixt 4UaNj)[@hD Fsoη4vIy; 5&iy78rٔ|HA<*G&1_z8PeSNg^`۽exf9al+=vn7fT^t!ho5yq`r%POD84&U!A5$"MH`ͪ57*|?RJ`,k4lnc/FPE{#y_J- әPuv|c5_e ]: [avrȡVn(SJjRg?y}En* tAM-Ic(Q SRC"A7&5чt"Z2JfX@/30eaLtLKRA aUҔWRv0mR5_|'Dߎ0W&3 Xڲs3 fqF%(7$cYgV7b X#i 2i;"rc yH J[7e#MDg*w:[Be|`~/W8?ƬHψ`&Psܠ7㉮n0<| MIE"DmOQ,D  ՈtB(0__b\,1DS񿹊8MlFg5?&7yoLA5fc\FP]4fq " FKUy Ds8{Aanʞ"Tj# Q-yZX`)llߒlϮX³8I d^P>G/9101311dhavdNfqtҮ wb5 b`,KUg>YJ.ErlmO7j0b2#~.%|}@d22(Q=2; 8’AN18L"wJ=C7݊h)PS˜s%=214m&bA|Hu:(= "@8F17J- -b85'qpSk}ڣ~!1IdP-RG&q}0Wxx4)*L Tv CpJ[PG W:X)_im ,1a"8:e%*~aSC).a2ɦܐ#иSY %%@n}_\Q%0f 4q6v0)9C)SŔ'6ǓI*(s028Ώy8?{aRF+.3?9l~WcS(Y)$apDz &8 2<[ЯIDhv53gHLWc-V^ (Fx!cx5 B4u*by^fZuߓ]j6Uno.q:ϚOc>+ Ÿꉾ9b;Nj&Qɍܺ!`xwzbӖ`z7DS< ^0;Ҕ3'U=廸 ΰI4&8)ɋAG]m+=o@˶.hSӘRjsD(_7V365HKNnW(י̊5y)PpvH̑_b:ч"E߅QSAQme#-mD9)D9Yv#PdyB,&S@@m4ȼ3˥Q@+IFsݜcJ"RQyxMVNiT3Mq¸Ii}.[Bo`hk&4ft,rAWѝ"X7j! _ҡ5*fa=yx MW;#fH%?䁛vf2m:v(QL;^ L<b/c54ZxǃITB#GlWYq/dXt6j(3k+`yvܐ0ķQh=T]`$C0ES)"hM`{zo;\MIpEN-E.A'ЮO%> e(M|ң4$Z|jM"Sxid$qnbd?KP1*ٍ!PrQ(Im,Tea|^yƘR2S!Oc|Őק ~fg}ᚘqg,|Y]x \=zNdA1lHpbN7Da9bAr7;V3"8;r^95&TO=T4wT_tXnIEF|, lz!P}J3bq@ OAЋ7u/Q&9n٘kٗ6L{a"zT4JfڞlK+s]22DUr,H!x^d0f|F#8Pz$gPCtm%n4"OMM:G✣I牾3'DY)Ry!.%8P58uU\լ9G&-p~$_KBzp1Ʉ։uɘ֗I&N'O9p)2.\ !4^G5c<^p׈ǦS2 -BoehEx%v NOz9/RV"TxB &ÚĵG]#"uůn!e6gX#1n+wJ#" BG,#9 % u,V[dOyαD5A*0=|-#@hQ {*Ff#n7"i@~tcM0~R,["v BJe5\2<͞~FaaLsv,B|DqCG$W ʦvlB##B\i_@j c&`+"CFRL;s{oB4ULiNт!ZL1*/ES: W~P>bjI'{r(ȅr"м%cGxHv˸rg1A!KŒ7QPGfXVY2ks\rc8$X6s3 Vq^ɋd6fLӿ[x/^tӺ\q1 -Mo2]8L)Hm |Zsf .cAYTZ?O=I)ݸQ ´@jF7Fez0#+q޵[X+$]fm ?iU[դ/H4mҢQ G-XmՓ< - U缝? ^Ӡݤ \p24Ĉ xƃ7##pwqS?GJke#?DWOB[rn̡m323 MVg+qtQzzd'qBVDƣ>[kRKdWn0_kzbߖY$OL#9mcr(Ս  ~ud-ba8{ l%%=Jt:r{/5mw,Z cm4ݤx_e&L !V'^&Cy< @dM!/yAPק9Sf80AbŴm 6?RItQ[W X+{HM1l3KUNb*>qYspTGVj=7@> _1 6Xt]ngxsʉFX+ 91 c-gk;MEj"D"soKlG4eӹ,ii`n: itD1vdIٯXaHP SO&=OiQ^1u+HP6DXr񜡐CѮ<\l BH i8rXxS 4UsH؀9fSDzZpsw,Gve}h IWdAI۶%! 8߰m)Nst8q(xǘqDƾcss$'dٜO"q qϞ#v-A!}Wl;97pe.WٜNY#bhԞtGb0 `r3D<@S뵗--jf T!.;g I8mkg`̛0 %EtEཻJri8|VRzPQ#OX9*N7gKl5wC0;#Rb<ꥑ{G6WMDJ_SVEPqAKKa ~ *H. p~"e3ɑsBm |JMۖ KyeC"YӊG>`I;T>"U2b8}`SQX$Fv2pJ8SMIӣfhmT0䎻t` |%rv+Ώ $A< #.HDUJB0ޒA)l׊-Aϸ!ַN>.Ta[3f,d4?EV>i>^fބci%>bI4{&Hj_%3ZeSekI 39J#2RttdWU^ȝ@,/ yc995ؾ;hjϱ;#sq&c]/2=F[2{fզof0ٗHIQtQ2ymUi/s+,j˴7dو\ \,Fxur YGjN[329B]J(u?dO\Ok8 y3I)23%QfNr3UfZFuRd7l齌ܕ5\kr>V#{`KX8 a/ CH2NvH`4\GGA:(JsY3J%?iaO †;澈IRc՗`Ru -u7 hٔVC4*4tƪCW;zܢfC`F5%F eJ y29cٓ&))o4qfS8呈~fR“K -3bЦ4ǖQk[ecnHo=] ^S+ 5΁].ba-jBHd>䄉#lv8-R)W Ftˑ6g5?g<;L}0cKxeq\?RJ,X4] ,i̡$ cNPƋfg}b@VMfc{%daӡYkhb)hG>ZN  w`s<\Ł2+ Siv)Ċ f!I"f1G^ٟk 8Ecs3P-&,`\ 7frf~o.h#K\w|h>|33WGTP#0q8cK1 @IOAtwc@ݑ@?k`4n> r{3n\jCi<2u-?r^sV%np"wi6ҍDO)VM.%" 6}}JahLN!5|MxNIbp;׌LOuxzzy2VB(ˍ5g S # ( 0pNК|ݔƴWZd/T,|0p_˅| (, !c v`.c W^Li7-tΔ۝PFc .7>t٣WcU)''xf 7uTUw/4U4t aNNk ߦUv$}7Rܰ☡QXp~5P9wT[Π]5 ,P!y2q3o<#U4O LF!>9}3B!uUEj)b0I䐒Cx%!/ V\`Ӝ*paögס8$iTfϧdI=J2xlv(:Jj(nkWf~@۟Jط### Av'7Μ$/'tk獹6ev5T]>7M D1$v[0xk@h.qi|Oȅ7FLk85)?~/kn+yU 78'tӵ.QWhQroϜ!ovav䖁X2҄ÂܭoZcP8ǔRp/Kf,6gY)I0árTt)iTt5]|㬴JhlϠnBkqm̩ Ă }EY9f(61#T^W͸#dC8fn ~4#eVBmR3$day'8d;:igKӇc4?G G4b=}s:FGӋ5TqK6z|#c0f PFc4(4T[3s%0f4eWV;|E }O+)6@hi )~wi@ r6t$"~fKb ^}(Jz&9H+M` 0x, YsX6 )\4Mqg Q:5Nלkn?C؁QQ.3n J#P$#`) ݒdytu֥aB:"&kh*6$lkg0=⡉5C\ B&zRndl}EB$V0 uN@Яઈ1Hsm}1JBA'U73Vn^[(Ǚ׳&ef_N}*%˅q 6yflx'ɦ3DCG݈>械]H">o9t"Jh6:,r,Npi$Ϊ5Cٝmd00a,s3COF^#My"-ʽ ;Qm'.fFB%t펛s K& 9B/߻LǛp.uCA6ԵU:g> |u9Ofԁ?Ga+"̷ˆG B29$j"-AV3Ja7=:=㉊4ԘeA!/=+"c*,>σ(a3m-{d ng|1&`ngNfLæͨE3#(gړ0DU0&|,m(!#aGoz d10rHv9<Gh/bHDa>136[ 79+/挵)1Xv?[z3i !d=t&)|Q\jyP~S4;ݼSkNSxobbwρG4`G$f,k  }`91b i M<Q.C#$ ,΃!.Lߨ$ 7݀6R fH8 !(sFHYYS)@@o]$`zP2枃&>t^5I5:.Eq}[EgS19qP֥cވxv2%FB.K7h3T8pR5bB5u .rSkzsh,}ϡ!{U3THCar͞I͕/V'SIn $Wn 0S7T( [g#M/։-4HFiױzS,Ov/}Α)42J<gǙ^Pl92"nKr l<8d"#"2E8u+o#*u^;MGڍ*7ș_<)#ݠj-sjB^&Ur#Za*Ǒ ف,0܋ue]̐'?dPNNlJXpZB,Ֆ8IBd4ɞ>puϤr.T:|rLle;fhN(*brh֐+6T9}gB8 3dNف$ʒ$ I.~C= _Cm=@V = 2#ܨX*֟Ru1 (ުTd崛R'b"o(̤jk3`2e 9x. g&;X Q䢼ɪ}D-d`Qϋ&lr]`~y]s=GڱnP.N y>rX"/z,w9CWq`eu;M~`I=%16-(QgOHy#ّ3؁r9E qXzϖHNa XܩB"_v`YVHO9樓/>5_ǯ,H2eu8L*C!̛JS&Vxj4{/B1>Ei :PP-SU9ílDhrO5Q g-͙z<')bsEёQt0|r.bP^T#wЋ0fG'GI`u_dZ*`yatmV/O*(DZcY#d~B#PJ͋BH8H+Zp52b0V~qOugox9ľv[ ;^?ũ0&X#E &Y;XOƒ13\aeGO!3 C :z G@8Ѓ*Ɂve?d"t o=e'Er.Qx(_Dώͬx K]&. I:QD8 vxp:_f^i՟^nlKӚž$: L<_"2L$mcHzQC*"h&// F~ o:ܼbKz%EX`=d!CvKZxH(Ÿ;gĜ6Wu;rH6^nj1V3 l/g6wA39lίFh_V7dYAX"wR+D0AF"$V3%Ȓtb g5|T[F-zq Q3ʨ2э1qzٍd8d0\N\͓wjЇ$CR!֑7F;eLET,mBK#Lߖ[p(ɒqLJ,&"zf;`*әġNNID$xťRWM&gB\aRlpOAI,W?_Y2ф> ,ʼ2ܹߙ+:h+EymtxC!hEW, h> G(~ߙkLA/ #@wEt`QQ#V{87!2Gq&g\HIX_-Hi2X egwHWlz<_+D}>15=.W\VJE"P9&I=Z=՘>C{:a=+彃ù| 7ݳ3wxvPÒyֈqw1&%+0\"Fk dDYS{{wpI PI T FCTSJjRK7I)yGoNwYǏq4B$ JJ JRRJ%))))$%St%(%) JRRRRY)IN~vNz U;-a8PE{k8!? ݶhn2:SȌ!aIՒLe*@޸^K,:bbo4SpC,"RH'=J4:o\~MٴFs߽a2 5 sqٻRJu?蛪n/vf;b*AڔVjATU\P=>^ J#IJ ,-RʀEJ$RFKJD'ؒRD <w|f)#G]2".۔ITv V'o{Ez+$] `~q8~M<2~ !IRfEHHI ngh$;ښhi$TP:*AM)40(2!fVbT3J`hJZO%IILfIMfff{5'lSP˭{mjJTRMb45 Z(djdFGue*9Xo+$g* alEss"Rh>,LU?ĨbAkq'[dxc|gu_Yad!Ww"K|,q/IϑSFK$XSShaoς&r*5>9֘2nm`-W}Dʿfz܋kRD8$V h`N]K;NF0a# .%}܈4&Tm|eQ524YZLѪDj&3ҚtNz 4LE=x*JJ̷^Z'"rmw_#,!G\ $<$TTaR6PH"MR7d^m^sݻIMmc^XAL dJ7&ؙ7= &8Mjr\5MY& m6=Oݍx"mNQ*T6[ϛ͹R)RICYa `6鯙&2'’&D"PȄJBĊXZxLf ۪6 e}ާ;n4K,U#XK(Kc4βh{+#nRm M(+&ˊ$$#vaG0h{}R~( %|O3S!arN$R߄jyS[E慛Pݦ. ^$oEzDαB7)<5}lI8,, AErˍ$ >B3 8EvdXqGXဤ?HwL+u~ 9H7ر*AY&>b! |PSl@S) (s*W%zdK6cG\9/\*rtؘd>:ā\1IRx)FmK#Zs䁆wڶgry 2UDs@%R#h~Ct;Yl-Gt3nGu^hzN/cȖc΍SzY&S !I4^^(_moO1M!SL_BT AZ,si.,塋7,sF f>+ k+ĩPz< *t~E܋̪F)3it9ǯ1.$ʒNWW#& ^I6:qFL'me0c`f2`Of>UC/*)D7xuy6r[P9=*׃NY /81C1}sU!#9$EZt 9Ё%NQ5//{r7n;6W)IPE}zf1J|pEt߆1O% ]3=UQЂMǐ]J,BЖ2c  JV?qKiP܉n 6c܌ iӮe}ݎ /<rF͝l9fl:{QTXiSm; .qE k(3?8<0ŴrŽQdne:&Ov}V3oB s3KYϴѩ=#~Q+ZfW, }rK T]UwVFS=ex/nl+mԿDdGIœ#iPRz]\|YNO,l4=m$xe^3m)3C5"' 22 cӫyhI?R93!7A'꣯2󔄈ӊPRDqlRQ\e ؛є$ڭI=@ 3ܭsUkt؊֗X QL-0_ FmF ?z:f9lwFVw۽;g/_wX&W=*qԑX}3e͡& shkW^_$wCr&uBztd)*=2Y5Ѕ. ?4L̡4U/SY(ĭDq3yn8 叧y»So]Y ΰvDg`g4Mk0]Jf] SQ5u,رbf#<`̦VVW}R{5l[3gYRjJS驨g`.sDMC{pH/g&6\*oд۫nQ664 ɊF*))lJfl66mFV+MM&V*3JR&f- v7eEvu 6Xei5j &rb\XXASXIBIE*T-%TQQ5J8LIMJf5)wMzBD HR ^wѬMJa ]}'_ѫw$Q;\m*=yi3Κ9"kA@.1 §hJKҒ'dL쉂a YpMK-Ui?q=\BƼ}&HSd,R>pn|9LCXi/i?VTX!"PY>=# 'Fω39?!1BhMh;Oy"RRRGEJo>V[z))_hw{'8p45G7+zy"@N`A(Hz !OfE<]rR)J%""]0RRTRw= ݽ]Oҽ}GeQrПyػb繯!$FѼ~S$:|Tʊ RtEcsee)(Tۣ#PoqBb))IR%7%%JJR%J%%OvTg9?pOok~jPPk0c2'H|r8׺!d2cl58CIpI! 9ej{M:uM-{57;&́' -WG|+W29JF;#1vCnȿhQ|gG{`įZ;AUJ9^p?ixsya@-g/,[_nx)=G %9;,RUe秊DLd"s82UƋ&; dsp/3M4YdYK ,ݕgC.obVl2zR<8鄣|?=1A㬪'.A-'j6x_At.s Z}G0K/v_N;d>oq K&oBf aC2#F1ǂ4Mc(}]HQ ĉ~REI? 4G==xC8Qα yj QlL d[x'bf(F|.hD /ܧ rN+ߺ~ŇD:*Q}/s#n7_SM'eI=jG!inhLXZ ڥ2+F 3 ߋE&!Ho.J6e3E0d?#U>";rhK-7ܠo>J 񗷼B w}J= GUF P3g< p˧#bQ,5ݰ0Iy]^Ȋ~ų0hft_*4V a]vi H6bs=2N4Pcb}neOzM6> Y{ӡ H{ıV}O.*8!.>>!Ԡ>FB qS#5 b >NqcDqs?+e0bntKi}؞RI,t lEbL`6&?p-. R2̿>EP+᩾;օMI#˝_)!K`i7;3XyGĜy>~ah^w|9T=lKg$Uݲ%씅a,S~2Xu ; 3Ltǃ18,M(F݇m a9h$Cʠ5iZ+,7c 8g/ Y2dH9c4IWk < pLY5H8j|3!Ig;ט ^;"<1~f ` 2 ^@4=pxMjWr̕DmɾmJ34x6^ɜLFȣBvPou{$ᜆ&@N )(n>%{ q8'aKvlPWUbLs5o>"_++OC,G^GtEl(N#rYG/L1!,23g3p|XQ65eѭwȉȆe%E% `}C-feF~,ym.'hH--Wq:CT3/ q_Q$8V+FHȯ?KMx}k #Ӫ6L@NB?bYAXR F}Кp&+Q] T+KbF;]p$k#CYk3.Y)6$qq+ڥmNk8A%A]:~3`$昈DґϠLJDPƢ댷1Ы21˩/#o>"<̹T$Lx{7&Xc;a6WIwףȊeαv4'nW^Ho;Pz-12z2u 7iV4>&|!Zzq$A̧xk7 @)!<c6H#=0jmFL^UAnM}Ԩ+iiz v,FQmQиQ^i/NgN\?HJ7fܢiInăkCo"Įfi<0DfDp YyXήDa7‘@~F艹~2CIh";T,fvFg `&*#Ӑa0G0d*HoM2!))Nē"1?E;=]( lf;ceιsoʼn–&ıFIxZTs\YC4郰ӑ3< 1<_{dtz&WǠ؎C&lse--I:Jo6HZ#FkN }m1o1 ; ^u;"F(jbvN't&A#a°f &8ΩaXDՃw9E9cЄfat['V~oȑ&LF@$V5KL 0$V<7Ɯtc^WM'h讖ّb%2 t̏v<5eӌ8e 6rw]뙮L";Ro˧E! ~Dyfy:.#j=QY[yw[텏짡>h~aQp*;#,B<)GF!N&lh=XŒ{%[;9asdH[ǺDhDxnX5Hl'G&ypzK5&6I|@a`X$!6#e1*03,S.X"9O)` 9dx{]72J{7{EmMc*G{:"Z&tu/\Ӌ3gMn.qw*Gl\}ɆӖT@fՑ@JK㩒>?_Ng0g|3W6`-RًZbS ) ?6ѥK+0#U~HQNMXҋ#krt4H T$/ (G"P:>Qʲdˑ[L4*`=Q "mhmˣ=/8F"-a(i;ljrh$ԡt5NEAx[>P;hG`f,t2o7`bFrXOFՇ"ta*z5$!.j:c S/3Dp9wƚvD7{T[Oi@2ޝ}{NVMºab!  PT֋Ɍ0rq;6<^y8ɰs1F<%[n;h5E׎‡@}y5U$L;* ѵlQDzD^Xk2{n2d?vHXQEVFѥ#k~a]2h 2di'"ɣ9VD%X*oIQ`a:/- hI=̍%5DiN㄃eI'vBL~(pž{P4zj_|7V<8Z"D1Og84&r3Fމ%Lø"LsD þŮcNxjaeGmS /00ЍS{fT¬-|}pk^Ga|;>}pFBdGHduS4"4,o\qnb?gĚ/u@<'f>r z1f$xH&&?cG|2L#7RdQ({+G|BxEHre) ͩ;$"s3H*C!B&>Ŗ*qΜpN0&OnW#pJbM挔M0yCn@0|Z -+"4VsC#"% @PVx7K)'@u3KqC0Ԡ,Y|P!ȧĪ|SzNcy>%~od .x`YQɂ{r7cd`NoLayMZf#HFT_,w/1$y0mhheև.؁6$)G4A9GZ;PjU4ڵ,і9 \VĘRl0 f2ywu q@:̘!.QW5B1"PlL4Tq!̉wƒ׆h /ukkRf`Gcr2l7\RSyB;y Re 1d^'9HY~%E7^1vRP3<Q 1u!l ҂@a'{uGgGq4F J3!ͪ24B%7(,&#p#IzE}|93;ʡvb$u2>p<%1F]FOd8B3 ($L52 ,Q텎(ʠ0 g=Dvz {@K 3E,^ycV7xُyr]*.B7's8D?"ˀUbwG '*{,1,=a2Yc=k9F7^jE@],=Se{",ڴ`8Y)H6/<[W "Q@/ࡎƄWj{HePtNΓzI}'SZt8љ6(B1lGwPܟ$i# =Xڐ(,JRK. %)DQJR( Xe,,RX묘-=DEReS$#C JE*)QJVR,<E "wN8c\)խ6q"ZCjmj`ٔ۟1_{Gg}Nxj'ini"]&)FH$J*Kq |$IY,gHlK1Y)❷qmmF8fD߽dlmB^NIo4,M7_6 c|7>hA؅ wNJ3ZBymżGoNWz !ښ"(Ԍ"VX[!x=g͟ Ehc-b2WJOO#W:aPjN4ߟ_HAQt⫂M̝%4f%&72rZk&]CN=`RjYgmb)|בES3fZ;L" 3|Ǚk9 !C}p $+$GGW^I\DZ L90L0vH[_M6Jw: a6MLTt LTLTb]Kh"_7i['zwx>dzDj6mR`m=bnzɶ]ӚrQp9ҸC_O\ŗ'4L70{8fPBQwAeAnM֓s͚y'6&}_绹:ݏe[~^og1 fE3VY>.<(q&DSH&Ӛ_eھFh&垱le,38RԆ@p(FB`5+Jged]*dO\"1;sqȩ$>38wi5k1}e<ԥ03L,1IHV`)'wn<'f\gD;WK6%(f.u]IuG};՞=Owo-V߮47 y{Ts`rSw&e/6yyyyyyyyyyyyyyyyyyyyyyyyyL&cc1 `0L'6WNwumI5 aŌ1Xɳ~go4>M4N4hWvRieYe26i zA\ne)vi֐naȺicv<;z<1v=zEERI#?qS\#'ޏyK!$adj Gۜ~L`\E!K9W[^dU*f\ 8c 䍉Ta 9{%W"WkCϙ1$C<JSy3 e?frV ^^GoY+W/2L#fdwmGc߈R]^nǕN7a\!?CZp |{lNk?qr]w%)Ѵy88S!G}mG01DA$)DFr  zK'EBӶ^$Ʊ<e럃rN) H2IF{XN *$it2 a8c7(F+iY hH]mC/~|ȎF4[VGƻ1yJB|ٟS8|AD +g7[Dx A"жz]X1_wny q o87//RYW CH]rp04%gɑYOp1{#x^ zlb UFMc4!>Z{.EdE]wR?*A($9Č sx%$ig$A"XgX'3( 3AT=?X]<+tBq1xdzMe CNRC d#Y!Dz_)^Kg86y9ClO!f~; _w>Kw8_ķK'->LeJZZT/=$3Gu&ix'* w{/"׾UsEc'Ә;x5\ɛDы$zcF& 0 CGDZa:z?xtĹ.akY'4MdĔLv,LGǕr*pO4$&ZYxIQ)eC:v)FAhlM$"JQ(v]CWnЙ0e]?ҟ5A:@oV'_# i TF$h-*b,]f'@ ITbRC#bMdZdS<I)$K1Y¤4핤լQP%"M(PE7,FIRQƵL uAFU,.4BZQRNɽƹW38u ߶(5Pm )M\.AEY,솹%(6 2QJL];l2Dfk *`>n@?<BQYZ%W>_;i;vnNɺ)"vz$PGjSq,vT$ȥFtʗ4%LiRMR4Jg(gaNO6&E#`IMT$ $3Ti 5L%IRАJL&ib*ZRde40eҡΗ$F CPIc+%L4#ETf\b4^TtA-/.4Efdi5kK5lhIiR'k(QueZ NQ0]ʲ@լ$.SRdd$5fF̼T2I*,(&U҈6V"bSAheeR]))I(ZZHZT)P[YE^aV5H;C-È{]NVJR#ۏS*c'J,h\a-fЇ'qFl\EIzǔ*Kl_u8ݑCHv<n?X!HJ5ДudQNFk_{@.}љfp SBNL ;䐎1k%ZLhk^b-kI٩1 p,޵0 w'JOhFFncz7;:f O?"ZLN gYTIMāJ`=3Tޖ^z5 h _F? Q| Io&_b(PH )՜15Y=G+@ pX"&ƎĿeouPMf]'EP8iSXnV 﫼֚:cu؏\4$FB a704D̡E^lYRKMǞ9rLpM[-OP\=P^eq;(]$OiR?2k')LV'&Ui҅vB渤2^r6SϘ9gu[ <9o$|%72TcC2}Hl~?La9*M8l!8n7 GVbqb:ԃ'(_eYB(T_s֪G7P{u1|NtXK3tAsLjޟ>hn2Fr5#~Cxof>L9= "ߍPxivGqD2Ϝ`D4#eP-nv\4-@牆Xd)B q4^NӍ7wJxפjO1!N@(9Tp)<[>YZ14w>{: $e; ~DB ~kj:$b}!kbc(ˉ(6.\ 4fxL*{2s;>zK u5|?jD{H튺BW:aCXr2nɁ-`K%CUEl7S9\Bi΍{'EƳo\J|po5̄&ٟ[9*By!G܏{TBxYloõ,b hn`!+L8҆t~+pCo+Bw@-up~xHbꀀ^{HbpcQ*Ȕv=gH]ߜpBYqk<;Ѳ&G~, ~!< |nAq`H|:\6yatZ qj|TٞcϷ>D #I>+믔'zSwh߈{1=^4#.?%}pBWf(pTcxrHdߛէ*s2R&3Q@XE+Q~FG;fEÝwK:V>Gk*l ͗#Rf{gzEfE-'SfWxt W"J9Kă<={i<^aOH|2ęx!E?ћ4C\%c17O~E! kÚK A$a4m#Tٝ|Yg Hͫ8&* F=Ht_T(eH>P (XD= 9G-SNdڏ#){@fO38r>!FC&:";AQ:w.jz>ɵ!KppHR jO<rWc ӡ,z4810 %Tkڇ丵:_N #@E6a1[0ZjJjwI)`Hw XVV_xӏDS35r>xnm)8RϗD=8JNPt<ƟӮH)`_Q0un\ Kz15BwxH /l4QO3PB:ƕZn\7ާ6"E pp6Q;|Rd*ޤN%n ZYqe4g?5J@ [ ;Di u#j3ˍ2'T s@Nrl+ލ A.p0G9 s&849TjHǮ4?OzFYK1S0n`>?ޕ O/ZRho% B^9# 8^,PJ~ LX;ǏpQT;6nΚ10 ւ|ߟU0RynxS]M=뱱3d9v;nA'(_T'p͗i8x_~F>tf{}UY!F!TqN pˏ)4#gOI:f$ aãDŽa;q 6Cm(`#+Ji7;Ӏ02dtB،J9̘8R'X@DrGr2w]VZ<$tHw0r4|=Z9\oh{吏0]O@ok@OT3lkT@.vRã[=ލH^#Z(e/+$"Q IrוnYh2CnilO:\`酣<X*CE;>: 旁h(/*ǿG|q|q:9zAL7 D;rܑں#ޤ9'/tfQ0JJrp%4ͱo"M, GBJoV-ԙO{/᛽|a#%aP9@FĊ[=ÌV&xS>9YHZ!l3~ %2v"lBx*(Hz2ipYHbRLYԓZ~1٫׃(Y nb*+ܺyNGlÿ<6⑬݈aGz̙ ՙ yav+C3i䋅7'րKzIr"4# 4{s`aT($dOp"!$j~%aϐ-ÌfKB;XR/̍y U«To>9ѣJ6YHz`oPgB^6 CTlAO%Okq9יrQ>cpDp3ķ_OB&[n|~~9)9Az>d#,9lc.zʮpTp5bbA|#g.T=AGC|JMy>6|\'>:Ѱ07Gx ajK_8NE%Ocs_ǷKsayEmHHr>25bJ f 6E> dev7k3~ Iؽ>cs*ί&#n=z4"щ::If_lBƼJ "|ɛCN:#6,ES֗7 py MCfיF0G*`4N D$|R#;N!;Mi$hH|wjaq4,*j8[u|bwtP* AWb\Qn,xNfg 5ʉÚu8I6߶r ,?Sp>&.4_"&&1)|NMmXv71&9|eǟ[2qf 1VgE}Lh2<"jߌS2ނFTw4(ub1mg6e%49SrgVQHrgAgz*x!JI0ue l}֚4bLߤ􎧘.KRf3Ҙ -ތ@rNaFBcfr!5#a m5&x秙'쫡ⰄE9@_=$ qd?4ZQE Ȁ 'eO ~FRҡ9^H[!M@0WVWwF>z>CvfQM A2"?u(fB^` *izUHxI6Vuq p/ر ~v_ph|}^yådz[9(~P!;W|]$ H@"m!E#a g7_ [tP)je/3pJ" 9qҸroRX0P%qdΟ8DK7|Ok yױtmZ EBRco*7- F3tn#( 욃xGbU h"R% @ lOLbAlp;*@H[of͵Oq7‡yi%+i` Hqlֺ2[Rw(D^0$A8`b"?BܐO ^{0bi8g:pd{= [dÌtIeY;yݾ-JH.8&DS dv|^sqqoHbv>qá`Ad}PG "NpvI<ˉ1G%ѝXЅb3BH2ii]&2#rHk^ZI4]10j@2>gQj6\ 0Y,rylnBrg_喩@V}WJP 5NSOz^V⏑*A #uy=J߰? UUt)U/yUU$=3jURR ;X!ɨZDXMY)RNB;/.^)p}2y 1|X-Aa vBBxa_K2ɻ$FlUDIܰn;e؍ǝ=~m)LT7*b߭NGF@V L;E0GQ%7.|r#}" oΑgT:+wk) I& 4_EάU=go(AT&u؜6yNy͑HcѨɭ@+2+1,Yp&4&HXm,eMLCo#ML٩;Cn@nK槯Ɨo;2rJеr~V( G{t{:avTW>ǷaD5N;EўC35;BۿvD~\UwlZ>CKG KJB 곛';Kb(jzΧE=Hٛt;^ʋV"sʽ|g77>-E٪\9Sah9u#hC@䏀坦i;jPt鑩'|:%hC6Af]$k+h9f҉.R@Z =-j@0("F o} \2CwVEcCـG Z.d7 i0g,ǔ 4i#B?5LHbFW F]I 3휑HXar ێ*C8丬aeY+H  5'9#&1jߑz15BomP,|{y`:]ۦr'6S1RaUKDE)SX*J(2J*I>y} MC %Vվ[_WO\L6}8 ߩcϐ$gŚF^ 3,wyTK2IS&B!ZM긫gvxV cT]uIdr"Ff:CZr@B 0;϶~*j$W>1)fUOxoNm/z3r1#LiS[*ߵ!pI5d- nյtD oR5C2!ux>.3ΟQĭ:҉$IDƕSm{ XfU'\7]30ef6#(wHb6DD\3EfN+㟲2aG#:1w0zAQbBd%qyg]G|oWjx%WEJ)'8&~;]: B~5&3ʣiI$ \\k(؂n'KXh1IRTڟ38p5m=d@q>qqHQ("#Ot$D}QGy;¡cL7ctVB[AXP=!_`5Ku qݡxp X*8=q"oL~JG"Uw qԑ Wcϑ %'NasǡK3%w.:І:L3~-JNf4Y0_24o4Si\FO<< c=|Dr s;H(YTS !0 U!g!ӂJ@b|g!h,D(.@5ه=ySsY+Ե9$[8hBKPH?}-@(;aZ By9&"oE! .tOܢ9Sd#N"78 #,KC frϝH8ԁO^BF4I2| jZ2,T ;]gXgh-H.@5&4 +q||-qQ?7֠!o 4nP*ltBnjpp_Y 0<,%4%iQq;7C>mMWO!ϱ9/wq(oM'LZ!Ttbcl` 3 H3s%ՠ,Ew阗~/Zwɶ@dY$T(ւؑ)zǚRLN /ć~`U?q/2C~$i)Y0"*+Op0†0F֐ cLy T a~Oq]aAZb̉( 'Il%Cs^ mGMʠ鞋tqʪQ64M I3n&Rj*Mq4ԣfhkrhFI9e}GhzNΕSi+EiJfgz[㨱6RxW9H.W5t4Tirf[6߉-D_DГ9 ɚ¡"%'a'WeC&ܨ a$36+"ʈ׵ 2bXTekY&0ȒTʲY$q}{~z7yH⢒$n+>;~uskrӇmO>Dv}d:s8cT̯*n~>=u@;99x1~>3؂^>k}SEęH( kN^t\\6ˑRrg%9 ^x`h!afdy,zwOa2rxpkdEdԅ ȹi=D\Vj *@?E!$EA1i̍}mM4IBH҇5qiX 53. 2(u:D[i[^;ǣs3vYZGl0mym-oFHd5+ocf.}FPg'+4s8*ˎOfB/O@nQ4}iEΘhR>ܫ^dy+ahmɵ_jCr)Ԣz%9ۙhks"X獏D+%*A6,Kg6 X0goA \ ntxf1ӢUwa*/@Q^ܖxS.phE=>xHNEpY z3CxIBFBY*q~'Kr9%_z@) =v}֋zA\`b J.)?|DfŁ@3}l "֤ (}S<"Th` i)ߕtck}̂Q3Z< µou:̮&Sr!Z.݉X=as3d˔yǤ|m;ֈS0 bܼz;8 $8ud4}/OcAÝ~^=C,0!qEy 3ˊC8BV4߷]Q"4. 1%J=Z qM( #ߜSvk',,E[ Iq@o,La?;#HpObYw$GQX-L@|eISCvHj$#hE[0křjB *r]vͼ`L'GPA~ߴ-g󈜑#I46bS%$Q^wd Ԁԉ) bMA>aD?23|$!3E FbKCL6>Cs͗.㨴-o3M$"1ǚq+'vF"");\v %=PmqB_P^7erޏv|AQgcC͎@fhbn ] J]K)D=[4܇vl1bIǤB1D0"\V'Rڶ9aߊ# cI<5_Da .:Ѕ!Yz?7V?/+ہEd]/'*zYFH¤c̒²pvĪKjf;P&o&&0bif9Ί3wFɤF2Cn,Г*f1l(FcR~̆W>#/,CA0$oIR׃e5PK j3 %0oƇ%+'ʑ|jK%9rD ō0'Нc˃!hͤ3/IٜLqN\8IlFKSAv#]ݙ8##Lm#6_=af!ܿf¬%Ɂ[26"P&zjHQ힣0,&ѱ@o %Qᴢ qH2:_@R>qcs8lHi} QMϤC($@lEb1 \Pm9<2̷TopI ?Zy!Dm{%n68185'ʼnՏTWAH2pH9lp[E5*| zn̝1RtKbNyKw!g5#W2=?C]ܒd&n8$i"~N|a2i A)`fA͠e}PG9"6޹vi+|&㵌..)=b+yKyrecQ#݂ݘ)&Ss6H=uk$ZԍqDryӈhjG$_ iC LDA"uV&bxH쓂fK%&*fܥ,#8 CdZ(/iMc%EŮgZ7=|F*"{M<\wMyl!Ivfrv]hvuHl3W"k,uF4+:(Q9gĂ}Q0cu[! 2#JsTW(6 GL NeKRmp|߈'pHp^H,Q@9!tg t2tr|Qj} fLw%tI MYVǣn:)Np0;e1!L"[ |$@2k/FCIݺ2D?߂L %1#{2:ܝ>D ƌsy$@l1r,'ENxl}*Mhv莑&M Xx;x@5NdV-s.rE#@h^i35e+X݇2/zؘRJCn'"XԄn̴$q˜W>;%/e !'muvYbFS َDzZy%]`(:ӪDcJAى&?Ꮑ"<8lT!F;燄͝),weh[pI o8޷AB yN٭Q 0'RrEN!qDs |`q0[MX`lBPs=lQAj*ދ*vܥ7L9fw80#E!-LD/4>OhVatnT՚S09ӵ9FOxSNbF+R'FF$*J|`bޭ@,fr>O -K3'ꗲ&2̺\o\o56O :wt,N<={|'Vhé@vh= }2<,Mij:&~ xv(613i1dLmDaʄ3rnz:tp& y{ۏ%ŪS&h8#EC*M$V#]ʗPG[(&)$'Eܶ<%Fp KO!Ix_k9|83a#4D~GB_,68r g"eDN:8}a|D{Mji (Gy&5DL}w1gS#S$! >A 0UbivR|sV.7deRe&fѾ >9 XUG塴MB򉃮jO|ϕRz˶ #l`\o'z x_23C54$)!QR$ سm@JI6 |c?d-4Ჵ:ʑ+5h}⼩\xQunNhs Q$%![ 0t 0|O(Y "3?Б/͙vqrg^Ya ݑXzw^WoO s $X#2yNq<10_`628c#MuL`F uߊ$soHC0}OFi/ZԀ~ip>f$y.cI92<ډwa+eVϭh2&s9ڼէ-SYemy[q x pi@>wJAH5 &v V1Sku+<nxyyI1фF}I28IFY"h2A=Es>#ξvV47)|_"~eVdnԋ#aq4qoǔUTB3ݟծz.\`\~>P'trKYTh\e|H_Ji63]b+-,q{4>d `d9D]%@iH`\F. Թ1yɱbK '<"+'@A,E8r[ZY 7 J# .#f'$lF: pH3VV4q κ (nH%fmJ/u+R_̀pï|`${;flyҸc"K0T iӻKKN Z[ө8Q7'g綼;lx7Zos#yrP=64vL>^M &V̇p&\w w"5<#H^:ԯD9=('* E_|&+ 'YU3)FQس5De8#/(6zDA}3+YF5>A }$VFOY5'81yԊEƫ3)V3_ ĩ2GG2晱K2&r)PA $IZe 6JjW3SLbb!!aRed3i?0d95'9MX!C2Uۛ!@佁E&|TdLy7>%&Lў %cx\kXsՌ@9Gῴ^pڒWQ9q 0xl*\}N1'ᨳT3 =?(_:ۂUf'C: FB#[G4(?Q=2qHbmF4RA3haѾ\+9ySps ,ݑC7q-8BӞ<|v<*jXx\G~B^YvzGEES DxN |c6@Xc ~C+Fcg-4TllŋV1Lҙ(WGSuur6)Hv SrJyvNpY"w? (HveQ/˄8q "L>N-lqxt#֑OXh8']tk2$rϜ~åzޙAď3-bcw@XOT|{اRp;&:DFӚ]86v= %y;#Fjf Ggcp(I#@F2 )f<I^^DIFg>zv0Wq$X=Ю uH3We#%َ͘4X/z&Du<;YWPDa$<[fʛ͓94dQߞQ.Po>Bܡ|2kFGX5J{} 1gnJ^8$iBlV e#ā&@>x$woZJR~FoJ״ot[jI rjvdZx~ђF]^-h꭪h,;?jT4hBВ=)&DAu<\ܧm3$aDBNxx:Fb-:;&6;Fj "P. b.DQRQc<$Y4ٞ 0-ϿmQU*ozAP` hsg /uxD"N|B;fD 0:ؒ~,ď=3LN41IL}OZhHZ F %,|22TS _E1^.'[Gw{Fp<0˱pDv0<&:$ "nWո/}&"/҄(5@+.h1]$|G\L KQJqN _yfT`9}9 m;8Khp+Ê}QG1$ ~Iw_>M:&.FK z#chnЧ4O=nuR~%J-t dǝ=F73>LHa9 bxe8{FxCؑ֐ꓰN:tfpȡnG¤B[ Bǹ b?<5 UdD9huRo #L fD8*@vj>E.o?wو?D_!D $s8'< 'pm%ԕɗwfXbx_}ԝ 'T^19Zfy~.og!D߆NdZR5/C6J͔d K`YwHArU=%]8^,{O} 09Lw#tiGuP)60yLLIax?EGRDmZ) 1?@;,þ-exk{6D ڸyST],eF.=3/ šXEOI {C 8Ĭ snE8ߢ)mYg8RΉs4N xfz\cx&~o!EM9D!vLrE01%T7{2t; j=L?+-1 9?$*^;29Í}0/1Yܶ`bo 42?2V[NGx9_uܕǏó~KmO ?t<8ۏ/@=|?Hڎ$L'3* q4CV5"6+6آCzEKW)ێ'=X=KϳrrQ>B"pC֖֦߳(YYv#!8n3$/?6̖w3fuTrRd3?3pfMzu7ܱR6K+QA n:m,Q6H GHc4Lw1KpZ$X-w4K-dg#C3 Ez½t\䎱 <~Z#aP ܨ,sS\8^P >hFw3(9Pq LyV^, Ɛ7@} GE!Urlm1ڐ3=39Oavlf?-,`}W^sNK"RY(X$#}6ۈat 6BW=*mY҉_qT-]NԎepfXf"Z>X8Kp~7G?EؔQu쎫T\vnᠹ_yd4d9tؘ;˪7obICbiHTxs3Eh|@GA[#  3&K=$L"q5y!ίaI82"K{{ҽ̶b9»պL~ЛXRq}z0F+o\02Θ``X-H ,MY?ȅUu(C<oGVx O(a51gmH[4uMfމGӰ,smca&;C % ht:sG6[q%T,k W2S:ztZlUp. cTN!HQp9Ej83}Q?c2MԸS |ǖ#Ƈuar;ŪwhDZ42Ol8$AZ:[KP1>A`+>(NŸJ'jE9"wEĞ׵5$`D_EDJ0 _)LHD>v4SL@e 99jA@<> ;]_(Gk۟ go*QĔ>ƈJgr5b.M\4`pv Ջz[>Ѹp+ԍS'a1t<@~!`AQ!ݍu&d% 2H9ubqHK2;pN> ~۽(1oiA1f4t~=$Y-JN0|SI.hAd娿$:Hf;;+]e@bˉ]TɊ!II^`~Ct &dR4T4v!fd&Ɨ[5c7`94و1epsϮ|0R(xq$wOhijqg;?xB%ȂК3Kcg &0rx\E3:]-Iܨ;&s*xT x{8^gDi<~DЮ~p8tpb* i|g)aƊn~e_-gZٚ2=[WnV~Y*w׻jYխѶO+tusuvVʩ %82Y>RP.sy}hH9FTRA"vl"*Ͱ=(V*3Uoը(Kȁ 8~.;G-^6Gk; 7p \Tsrh@gCFY;<hGP3XFI,7q3E1e#qΒő;E#TA{My݈G ~xz˶x4!J%N R]a2pݸQO-% s-˹f/2"D 9y:EiLDJˍA:#g2>"L4Dw-~d$bw5|2!XҚ"Iģz1MbY1cNzcP-Af)@^X ͅ*ȇpmKx˜_mL'̙\Of`p`B {1ֵFEpgX1/y3ԛ{f~o6HJM -gpQgZ "LIMGp&^ &@%P,ddNYeN+:dճY/̉^DHux *L䝛IiWIqA17'׬b'3őG@6bOeBy}<< "AS8_HbK%HG|ޓF`Fâ5DZ[ zϳ#*I( l'@;95+ }xBFn/M IbTh;96}A>'FXpS,,DvcI#U!, 9e4G8NmJE}KaKaNS`B.SF#O)4Bos[%}#,Z$Ph"eB.xIt2DK$%!@g!05f2&Ix ZDʌ r,{#nN y ) :zȣJ;)oM]8g d !rGם\ 3dI,Ԭ%a1:mIb^pX"WI>@%1'\7ݷnj/8"'6?A88>' tD @LX# ^ uEfK[!f~dRIrXjzGVdC))g~)#chGwe.NXwe I>ڶA$_Vo3la#9$mkrHR/h|y_|t ә. Ք!ʳ; ;/Mi:neIH0(`;zvC:]39y-)Q'TJTʴS)pzR"dG'#di%dKHH-gr?3PREpzqlQH!eH,!ɱlŋ`#hI6JA`TBΕ-"YQK2eJlś")JDw)ձ;2 R sVL5mW8v2$dIAMjTFm͵K K3)J)M뮥)JR)J#ZFZ4TȻv 32JjVekxMyIE&vvӚj^jf % A+j6JLeR’f,]u4XZLYҔY"Fذ+3;t٩QPʡeMBLMDZ0#-$ZfYvUS"jYf fvu)2 ,dFRh1h)"^^dLfihKBfIБR%4cA-*`Ih43AgBlғ&h` 5;f]œĨI?~ڛ¾IIIĖqFՠeeo!-̈qҨ$egvC&(3Na3F tab37"F g̖k' .'Nbp82?;C̹snֳdFX^d2LTM.eUw78Z9EJI0N2q;qdI$"VuYe AGwIM=Cɋqɸ#JU{»Y<:e&3dq#'ErL$ f>d$28oKExH1fL|5a@9Mlr9G8cZӾS c 9%~KKt3ZXU!Lpp,6;$9pwSï2'48ZF!>סCD͜<̑Vr%xCDZe?оt4&x5}3,8>AouQADQxMB:1H|D=/E `SqN'S GpDh9BP'5V4UjV=P8my?.e`2<+|0k*FNRqS1;=6*}*e=#2X@d;~`'^\m'f+yqϱA*lFc\D RSr0 QtgۥފF(hv;DT/ OA(h(ֈqȅ1ߺ吊M"ud(IQN7{N-yxjMLX8 $" &I&W3Hxd\٭IBΝ-l ~@Tr) <>ߗ5+?^&!¦q;. `mO6ѺS$d&Bz>84NLd6U}zұB#}h5k40: h.Oddžsk'w CU'`yN7dοT{,wTmUkUKs\pKgK19*/pdJ*|iB!h֥b7DAB w{<mLF[ B9esAS2N$S|j<^NT[cNbĩ=SgqhT0֤5µ frqWVxh!5ZBCZ 18BJ6ye!`X|[GTE3XȈ左$DQ#L6wC%}h~$ c=Ƨ4v}l:T4"2uH4Ģ2i.yKb8S2OV8ėRuぎ@t!~&v-H2# bfZNt2,5b9qNnR\y):ȕH} ιk1h/07&"2y)~ HЉ-=V̈́nN‰Db>!N|S63do4OC{yj?fdLw ۓvɸ Ds&K4#H"h(_y!W u'z&l*?TrK%`:}zeCAgѢݒϖq{EαgDn)j){d3$){f! $@w =|UÄ48]Jg"7].װ&o;PE.ǁ蕣⽢臓Q4wC&1cWDu 'L)&!ZQ'tr =Izg4Qܓl<K[#ʡ@/TEvro{Ifv;#P(=>42hpd'3Aaqo?NzJT#͆H^gg,`#/Luuw@?+4<\F nkgԿlfK͓]&] ) QʣitkkMtN-g.0n0Q =]z͎gU fla x !fHrm+þr#^LSvģds7fu5$333c5`EPVneF7fXP#4 b[||G|5X Ծ@OjdZ65S?h ?pHŊT11ڇ'4A\n)ߞSË u Y Y+_mCA |ٌŸf1wAR@'@!% XR$=- TTTTTJQ""RT-K*D!TTRUIUQ䏰I-TKɈ)c7ah YbI? ѬZ`hI CjIMXCM^neGm=#_(J`8 db`vЧl (w%9=tvDo:)O=d 謎|"Ōb0 dwk+p1O xD|h>W#W݅B!1Dse "KZ{ʏ1o4$eK|KOq'вTK=4}<=x)sfC.D,Ks)O0j%sb ĺ~"M$rXy^s-G_#(hjVy= e6ZagMv>X}yRP#چ`q19{(RQe$*S7exZaILVc&y^o4(p{6W=ɮbŤ|ΝEfsBt f"mIJYLsշε=ywbxOv4 5zР I㨿dL}w-$R;DJ2 #?(U!4#!08BXi'H/xɛO!F"Qqey$1%gMٗo{JI\)yXMgm)RShDHل& nDKQd\_W7{/L6)Bp#!N d=0R o&G fBF0ӗ s%S(L-6uѶ \٫,{FZrE"+B'NQ6>89o"ybǰv<~Φ!:s HHh"1)ŒWRh`G+(1D>o FA?6b˓."q>D K3hH*sEYcp{gt䋯/c*JNۊQCސ9QbhL"#t:riL1 5Oedô8v9ogD?@%Ūl%UQ /'T12Ԏg͹c0x:.W^FΣM]xbn^xeʼn'\8 `@쓆W pgّGR4q˛Ah՞+׆p~3 +DlުqvTWzM oq2Z4Gd3 'FUr͐Q`TRgT*b򛋎HA stE'VerITy+QF :_)΅Q2(B2gCy@o )͟"hsq3#4p8Y ,cOIɭvuKJ.w~#j(CSl 9JA@ K[)eR)ԏ2" sMXC&AkKBu0@dI+a8-ޣ9'黄pP8 #Ѽ0}KOrܰJ2ݐ-P?: _ L;<3<0٣*Dv^1;ΆTv#9MdWMB@U Y|Aq=y Tri3V?R+Ρ $qHXAΜ*%q^v{ԷRpWPdg&,P2ȡNǨA YɓLVI.ɣ -[pR(xk~&tLhmF2J]<[cX986bE 1G[% PLD +A "c;!/$`16 :v%D\&$hL)"?$/<9S~'W܋i73 ei{*#a2X, sb[7y";,t5Q';X!xvlsVhfQ*ET́mZ0g K\dI1 m:]CjuLQݍTb7aZb QX+G3#@Z;C>q, НcIr,N1Rzq8笠ד$fT}aƜi^F2BM6g$K6"j I~ 3ei61H\Q8{TRJśƁX E0Q=YICh'|5U1$4XX=HA 6)㘸j}A,VGG C`@TXQ!W 8ڄp1%)$!ƈ HsZ_ F^HoS:4b^rM.?a%+ŞA+ߜ!L=DQ2q2-?0դ=F<[%d1F+"IX]c32[FQpa8!<@}71_EA(t,S3´6E& & gL9&eG^aEU-oL53VgAXv1ErԛCci'<㡓L8%AȞt ƃR;*oqnp10'|1$=}FcN)8pG8g-Ymd$Ȯ,!xٜϹͱʡYiLɷ0rs'Nrn qÀtNȋ̭aAXh.i2ɟ3"MT(BP/vJ^9%,Gޟh> (Q@4[Crh@Ljm5x_.O#Lv`&4;XsP1b;9hF>bA8N9ךė8E |SA ҌN:I7qqV?p̉9 GRdGHN,M><iدI!sgAL-a+d&H8' (ϙd`ˢO03X|g#6iIBxv3л>@|7G Ua:e dV&/ي'Ejw %s c1<1gӉDCYF0ԟRqdL^,˜rQRtNa7#o͉rG G ҴU)E,BJDiR$xvbs">(aXFa~Le ̺Q,N)E3,tƓ6y)j]\, kJHaJ!y2R:2抅Z12dTKǃ23kjPՐp!ES^2}c$cJȱ^!ߌIqh`qf?'a#R,H"sh1vlMi<cÌcØSL0,0vCY%#lɣ2 Ȥo8Kѹ*L'0w4jƁ<`n(^2KNsz=f $!bSNE e3̞\8 #p$T /q>E#Fr)OtO5qHSb:D `0 -b6XǙ9gȇ;ua 3 <%L$ EM SeH3753<+9!M*) qG&I3zcI!՞`Hr\gȢۊdjQh =+ rz=&@Cu(O BiFrD.ba(" k=&LcWVg 9tdR)43C<cә[=x3C?g`6h hJE="2P!ޟ5\dYf̊#dqų/P?'x`ٟ'x @ps{G2 e[ T_HƝSm:ȥ87Ftj !mٝLҫ2!tߚ.ѐ")0HŖ2 i5' `C !8,EP駓&v'APJa5) 8x & [酲'?d֟1b >7bNG3Z27Df7دCz۝F8ّBphMyxF Ӓ۬Bq&N/3&Wa%AL[T+92#3KSuH$⑥nˣnE Cq8/`Tʢ '8>Be nHqH}Er¨Ĭ&B d A4^Og2@y >O!9BQ`K4%x0VH)@qQ¹e͸s̹"~ Ç\?(>q'ÑEh@ dp6LךIm5$L!,V&OzKo>${ Ê*B[s(Ec>o#g;ĩK!X<o*|Ɍ9$xvsˣ.b=N%Pỷ1Nc6l"!%O^#k eAԏ& :lC?HSp8$IjovydYF)\[H?'pǓe"g[#~Y q3&#$;HAW=fLc"%ڱ?&:#4A !A>pRFR!ubHXbȂ-A8d6L"x a  ӓ#gA7d9lM2 7') sBlb}HcxaqH4f0[-N)l!/J@<.y+jMa!N1tQX_2% k͕2k::(cFA4 Ca0楜)ǽI<qMpZaȓrJZѨJH͛"M1T$Ѧ}d쵆 l"r%r'PQ2%|jȓEf6sV8a4"LxΑ"hR袗Ŧ=ĩh1 pcZ4zy'!F"f\,Ǥ'F8PZS. ypJj|'~Ot8r"VI-Ҭ3 |? }d9\֘Ȏ8'T t0Lجޭ .{/Ug haTyjFl ZE!c( O"p #961IJY&ᤚb6{ 1#Y!HIrPv2D<"q`4% fQSZ-#Z6>3rBe-KLż?PQaHy X֗T<[6'|%I4Zt 9 e&w0~ ͐ф0Ę*@%"Y4%L#ӀrF#Hg Jh$G/QX^D!nE9 -gq MFb`q)Iܡp$=s؆3ɜ1xqGG1ڙՑG`ٔEX" A dT<'ecG9Ɯw퓅WRK{cbs,z($bY(ș&e AcfT,?HL@[-p aXvNNiRa 㝳W"Ԙb@9!^EɌ/x{K5\= Cf qՓ1Bg:^hE-(!1l?[oeta-?<{٥980#ʂdj9&l5#K4u4f$ U~6XV)F=WSc!N8f)OQOŸrO%pdIV{Ē<%'PBʊby2(/lˆ ՝tt)"IФ%&: c r@gHHS)FQ᠉,2`pcѺ>H̒HsQÈow5,='Q(dfW7 xdP/D"K=?I)n CeՑ0c ;A:a&$D, y*l BYFd1ꉆaA ~Ly z{{Qy``GALќd,y@B+F)0d//&D6qE~1BJ!N3fKfBT8{za <"K8ڌSN:a!Y戂 ǜ+Iȟ)U6:_?0]Xfp wgׄ*1cՑV0Ipu\3i) St#<7 A|%9tӹ bwͩ&͞<)fIG!_,̈m1D9Ϥ` !x'RؠGD @ c^;kL,D܉tH*ZM4O(V OFp Ú`[&6堢G.;\51!M4uψxS[@1lq.Jϑ|! BhCX8gBeMg0&LF":DONA aHtyN1&m4XF8?w<"" %M,;(wf8Xxb͊]1H]WM4DLI9svG#!c<E2'0NGb2țP(a@u&`n&y8" G)Xp)aM1+qa14Cȸ*$VeA k%I7Y@ʏC>xėXWB~ ]uA#38D TL:a yG4AZœCF呖ڈonJd2H>&O4Ɨ':-Ť1+'ʕT!8?t/?ym 5n2"8PEQE.C$oxyG H~hF〰1cwx3D%Ǣ5Fm3e07$j>hh( IZrőPډ&(f#STŦ8qWG&L8^ B=JQ b@b3.rDa"<l Nx'0g# ).qDy1?dP١ Q8olSsd+t/HyӞ-l9nELD# D=B;Ao#/é?@_:#1¤qe` AnCyl eY:"7`Df>c2O<ഐ*_s!+'XaLkGh>CPx y2ɗ&M@TEӉlhMT4DVBiL-JNq&Rjl1p?b5˫󍾌1}R;HC'μO+,PrE=Ƞ4ӏjaV p(5N,~Hi$Ɂ ".Hb(ܜ#6% )^5CmM S "aŨ yRRFX0#TId`3(b$~9|°jJB\&G,>ĉf4f"y?G$>=I lГ䦑"IqtI !ChtJ0֗v#Y1xUC*uHAGO'QTވyLb+)7mR [3&P+LRUW>1%ZChGҮrbaI'nkɶƌ&$ 3KaU) ęNΉNE~a=Ѫ;d%E3?SE2xcyy)/8+-GvGJ#PeLғBiK޴P 9S$'38ôCb h;ZK#ω&Ps8&e xbġqN#S*$#UQ"j!c0.SB.ǰG'OP7gh!`N& sdMa! Q~Lw|wS< cAɁ2%)*6P#p")Hk "I řsoU9' !GȂ 㛉Gr 8S&DT(Y30Cf$9^/(xI-ZTp̹3/¦\݅ΚY/鉷&MX_|Ȍ/,l1X{D|*45p1mB;GPq,X{A4Ɇ6]c#Ӝ qc=D$]-Eb aOqE\=$9•̙ZGs,؆* ¬"0I}J p#,-G%bqVbJ #^r&FCA] C ^[TJN \7\b hJ>'GXaUfrgh {lht;EN1ܸgx%TQA% j% 7ӘWnvVW==OeƤԒ6 & *%WG8/, sk|&kO{̙W^`a\iux"䈶3f?2(ɖnU88I1 ADOδJdb{')|]xj?cF|Q%ŬApcLK\@QWݖ. Euq9Gtt,K%k%)Lٝ`Qh@E㓊w8l쥷_ʝ+J<q6q{#f!!ǨBd4";{#,-+)`o$-5Ϳ8%Ċi<6Kl{No3N1Bˈyqwn5*xhJ"(ciKA&ρ1gFy0){ 9cfl{ >iTmڎu" NuW~S`%4tKd6Rf C= 皻U_l%/IS7HL5t8a^"nM` 78rᗧ@P7 rNݼi{!ʳ?QihqVddv?FxQ0 oN/62Ec2l7D7a4 °zgߞrL7&8h gom*^h9,RNĔb'{l͛x[Ӄɘ,u6},gFD`t &$I8Cy;;nYMȩeb |Q^h'|8BТN48yH*C{n/|4C/yan2Xp(>y ڱDCGYv?o3ho( 7 ;e5F8UǂxA:} hԚqJ:AOJHjLꨃ1pvvR T=+B=j7+~2U[|q˅ 6, ᡛBE O!#o E(̹;iYk1|C(f\Krf1;JL!%Ar7%CG978ED} emRW+Lg>H-,rY&* yN-q1XWѶ.F7B[+ƞ@[) zk1$BBW"!2>I܆u'ϣ7~4}NРiE/aԯ7 N86CgU!: &"ܘuאfL"ęB{n4GdƱ2iK*xbX oS߹GVMNԋ>Ga(5#[]Ô+4gڣ32"YƄI7l]%Qp<1zR`ox0|tޚ͑=":Y\cpta1C `?;RY -8uG8ǒP߯.0ϩ y; A G\cK1y(d7q$&#ԧ.h30Jf&HIUbRB:tWTDiN&IQn"aӒa!<<& e! tO)URQI-2p1Vkx~g"$^F dx쐱3c73c-QKb< FyV,qfWw>B%=0V CgK Q FO)BhI! i0X&UBl(iAc ;V\5DI3X&_#7EL $HD,q*ӄ*8Ӗ3A{e·Qs,>C CF30v,\95{e\X!=ʝ܌a*m>׌;1$rI} ?ڗaf ,"*Ҟ d?(KY=񿭹.Myꕪcq1;?+o Q1hW@}E*d):H:dQbGIG\]K0TObϜQQ;Ш!rvJHmL1"KCrODttAC P\(aشW:S3(_T >ȝ"~@ 1)8D-;ȜISgwF!4j@L 0zg٪ђIeѐXau32>ݩlBV[EEd?j]^9>^obTL>G{;+ ZW@MD/q.6.60q+ DRS; kAtD'6Ьu獰tȧeKf܎1{Yf//=DK Q(CR^A`) mp: Gi% w fsig)#UVlG H-_7Oⲷ]"՜vC,=`<n+|_KNqEM;V#mO9 '߿ ſ#A2` {|`nIO!6pC\,9%7JTΥ-ɳ@aEnAucLH>GK-.*ߴ;E}&y?+vLS: ))Eʴ??'l<{1v;&'?Ι7~G#}\aՌ-L!${7tY<B'R 'D3%!$e &ixEӘ4ЊuɅ;w+(a1Ⱦ4Ƹ=c xqk+ ]ɢ*/uti1D3tЏ!HD+/QQ9bhJQ_ڲL ʅa1c%cȽK2cR6א(e1ଛ9@F |8R?  #X#Q3A۝ocU -}d&FG2 ޮA_ 3_=~wΛ$>Ц}BdirU/h|F\i,s^~6!J6a? ?DmL=0&&MQ ^/6',vWLQ{jci1LeCpS dQJS$v$ޛ&&찘+b"}uu8[*o뛘2Dy,NDs;Q@Mj^b,}/g.'Ҩ\rH<)&bSq+_.q7 9Ж= 4y!ß`jR4IpBI Kţp=;gX I)]3)d r{Oh8' O%h5 >.gXF9|cɒ0S y?&p!-šOb zb_1} ErZ C^?GZP{OYvtpEa}[*L*}cV{%qъg.p훛4j$% [.N$Y9%پI } }1@©KVQů) %.PF=Zgc׮&5 ="^ۛzHĥsd'`(EptgF6E*Hd."t&űԐpdtK$0B7X8%!9|Eo+ًa$F=ģ,`0\&%!, AO5$rVpN,p?FЏqE,aa gwUU'{e$R,,O9?SjOSM.`UٟsS.L_hrD"j_j/ict8 xmF &\>6Qž솝Sozq M_#E᱖<&h~ m.-O_%ؼ+F-ʣ4cv~/A/2K TDzֻKNlۮ{2lf`ɷGd(p ⊅R2DDsfg~`Yqxx8v`WUf`3I5GLBVS"nٽ0 W_ApLBXv$hiF!a(pMvGQ8< O$^];W1M3 G'C5(ŗ0ǵLp$\nkntH#W_gݒwT)c6c7"FZ{Nѭ4Zk0Z[%e[!n4og}do26Xkds eqP9rg;Y>=ŖG}'V# [3r $*VNYԳEˏfVSId"cjUG&BO\XH|;R8sS3$hC7΀rlگfr^k R)0wbK/jH"[牖Aن{&Vo>Oq'J(V?{Ι?c4J#]l79MBh~$MD4G 4rV 8*wM S:vᴁVR Ki?ے> l;>BLK V*^@> 1@,qԄ{cnFI4~[JF+׎s {6#DqX|r~ܦ~=;(CPV >ލg0h-;K)O#8߯I6<aiB'cƬb7B⻅rirD7B3ؒ0Ma;\jP Mu^:ʼn?I jR,侸sfjp 㤟/n|&E=yt-Gʴ]Bj-X?3 bC(ǒ%3G\nx!z#N{6FWb|<4RղljW4GA0ꔯ&\cH=|"9Scs0?G4H9ldi@ ``tdm{*g|$X8:y/ԚQ>Z 1z=ʍZB[U;MXz8i[ג8ҳ}|C :!CO=o6",ռ2L* P*Ƀpjh]yiOtf,إeNyDvJ8fE)Ofdhhw$D'Y^S,סjHJSkyqtL$ }!+ *'>=*(n ӕ!y%iӾ?ІBCz%xivEΑZ63jbfɓp/zClj<(SQ UEt7#{"TidCƬ*jL?x]U N2's46uH-t/+jދKTUIb6{'DI1aprVeN\lIY q^aLo[  9 P#r!"zBaDC-s!D8_`½3 >ghI[ϙ߉]TBO8;!Un;"yDx擕9 ؘ$qSj[|8aD&rS@\sȒv:b☿W9'[^"7#ˋCIF  T?bC6BHpn&<,c+#>I!B`\4ɘg#=:(FF#]MY:nzC)@1 8fcJ ^-mK¯R h2UF8l 7y㾮%LPwJaug R8z3mUhʲ(OLdR%/rQ` /m&8 ,wZ-LğbhWbĘrC+$eSg/n:N?€cI!jM8xn_YwVe+z.:Nv3k$5E\¹rgjǻf_/A׻Q@3>krLKfa[R$USDQSS廟5n{U9M9Xbu8Ow>M v,ܘMŏEFZN0YoU}SEHekzfz9٣lo@!Rf3&v==`$/_K`(q lw0NEi3Gƙ K nyR--$BF DQ]Gb'rU:˜P=alwqM3 [|ǣū+1LʷEw Ǒq So4]7է`2?1ɂS:ܑcQ G8[lO ÃGHzNhH測!L U&O|'ޖ'2[l?:Qc&~]z8`}, ˘Z3JCM|Wbaj[*I+&P $̭b? ݾn&wN4>oYC7d8L;6R93TiC(8X`6QLzD\CMجH]6wqDK7S$؁?#êDak>3Rd7nrFdTOLCl2/C;X//t/$|ԵԘBpTHg؝+1'¤n[-'T5#qD<9GKb4ƟC0rS\|idNvKa1xRX;t1`[ ˜-cgV?iQ;R%ָG s SJ9)w{T :-_D7 68QD2ob53 i׭ca)Nt/Jt-z71w)Q-ca`o,URy:rjp$i~9ܙҡ4,MƂ?fĞo%}v 7$c#C_➗nlb"ީm:^x_ r~ddfz5} cxCe\Nqy3o7q"V?u>LQ(-LH=Wg~ou08^jC@OEd[PWPYFe؆gl1`)OVLkC23úZp>`kC 28H4tYOʍ8݆0HBW¹i[Ww24Ȃ"*(tl\qrUW>o[-tl?%vesdODO|3a+uu<>9by?.~r7[RAo፭ރfgLb/釽dploӎ$28m^0:L1%{J2\ f7KM8<" 5]BJF&*dAiAw` 1ֆU>ɞC{Fz=7koĩƁ @' U+O*4 .وہDؐ"˟Xh*98_LD<U>ο^t젲r:Vzz ޥUHkS Pe`ˢWB2p$7= %+Z~L VJ,v-0%XczB$og!Ì;E_bǎq#z龘1cɇB3'FG[z_a|i鞉<5cd?!q,\Mهv"81"fH7T[*dfiMɟi ܹ^{2k51Em-eFiT'$aoͮpl9LvXh|71t:ųB|}<=piz\/F?W)ۜ&7H5/G -I"YD c/^=NGY7Ripf=*#Ix?)8%YK4XӾ:<]afj+'WnLMãy>1EoIl]4a~QP Lq2; 0#&5CJi@YH= NlXLʦ@Yy'Q|o;Q;~^Fj<qDpA)^ -V[YɥQl_R#qDO5*6$8DZ=o,!Jstlm,z/*r`+'֘b.6.Sd%Z.5:1ܡ<,@.w:]"1Oׯ&v=芽;4z=LdQD OM*C06X_^JY[|lJyZP9!\ W9YKB>_4/g0o3/6.o~΁B2.q4Zbk3S=B^~-c)JMLäcb@ *Uu'UĬ6\>FDŁ9[h-=Sz~ʨpF+ ^.~El`o 3 5'q{Z?>6C)SuVn7Nŵ`CUfvakygwyo;>-tXIL 38(>9׺[D9ӣm뭆58{s*H=@n7Bn>KO+61`P`GiRmӌ.:Jo1 Eh 7ir-6 PU;QX2SAgO?8JfG&'#m~tk40ɮ %u:MLm`&.Y$uJjdH4}~BQO7Etr]g7'z?Ҥd7Č(#C m~%3o/K]l#8-ɑSd2QVM(Pd|*YR\xm0dTr|\S0̞.AR0Ʋ9Q8kok*Q8o(:]AK)rKOA4j9۝9J/E7VkL9Y遬\&gb0=QG2F )v0bӨD xJ# Ȑ?է7aᡎMLkS(qg:/g ڛe],}f[!E./.5%kV@rS(\Z5Vȩ:vMgӪ=:LĮDz!(V("6 ԕC>Dwc>-Q~apVkYGh;Ȃ|IK ޸'&l#UF#&ņfL=7~ȩzx[Μp_U/4zMle$\zWKq!UAuqmPctڮϻȣqZq7aRK/,v );m^+M4ж{)O95_.ǯ";-)oe3, eM"xbTtVJŪLFdHRvP6㡷h{Gnj\'fWa]ٓ3+!Q"aJM_>`)Y%(O]e$fJ[nȆP3[5SY~Me#d~w"{_JdRnjJOnN6w ]mrIl,N9BEA6dp {"T&srLFRx]a^K1IS*^LKF#Oa8Si*d²p1`eM'&nG|C{P$H.vojr#}EX?f$Z>\Wk[n Ћ_*z0؊2.tBd-V(YY5BRxsaGRFR¤m'?3ȇH3轆ulyT|ޗ 8fўʩaS,'Mtqp촒3.."tKTuDi<Z5ln{釸YǮO-v:t"FS='CB$j'o^|Gcƌ%7['*`۪Hq/<}d8?h Lq]o|.1*{z꽁NT6q O xC#09mApF?o'{Jk2s&Gˍ6uݑ] DjТꚓAit $8DB08A(IH؜P!5=4zJ-oNm<Y`ks"7/JeG&1ǣGa!+xrE3zgbӕ'?sXOuXA~Nb. =*6|6Ҝȣ~d㱠̽|MEPR jr ?R@qhGlCb40 vڟѐӳGY/k#\:Il C9XFuz7;ٔ$Vc,BVF9^cfϦSPOrU4vfwqF:چ.ʟ2_[M?P4yXv Mpa W82-7Z.hƎ"H,KLOd$s֋~bpS+-mQ9xџuز:Yk'LjF$.K$Dʟr5 u~-r|mM/1\(x1s)q36+sX;:X{7L&S繳65InD}_[o ^K!(޲hYth.֏x> /2 E1G4MLΠ]= O_2X,/v[^ ^3S9N}M{d$ATUIjTUC#jZ yo?sԙJ3w?Ikj1*e _'hطկv_/ (-0- %]B\9n3,=rJӺN9o;/O3MUC#V/nK (e5 K],4Q<`kǭ̴Dt2MQ\?ު",ƛ-:0TP|> R^WaVyi~K=@m~&mcN //1 :TRMlm񊈃FY(F?BٮG<š8z>u P q6 M OS6Hd ~ ""^IbW*Zicx6m.w׈Qtce"$_ - 7s]:}u&\c] 4!eVjs $ON!ǂ}:ΞUseᦃ+G#v"We$gtDW' ;w^>NVz}KeWwMFŤǮdIyܳ]r~2ǐf+]8)}FJ)$ilQN*!t=ՙY.u>kJjRKtUGExE=YƴoJ8*cP;wq)GMrڏasCV]m5a-7&OV铡C1]n1-CBq5#WHVMm/Ã*Vi9zP\ i!I%QdMѬR_.嶯u8$[p*w2aG~(ǜG2Xp3=vj':M&&V k^tRyvNcR#=6({'W-1=h3$tRiX ѹC-s,wWF_3WMzvԆλW^R Ax-z jfz"RC"ɨV1j/AP}(Bbފc+(VM1?:%pG &F6WF%|GJtC$躡MpBa{/Uԑ>VhoenmHH9CC\vюdJLWq2oHn{TRN4くy{,BԽ 6xNY$D颱ù'(gs{9_׍&b:lDZ7U|q,dxFśێS4k,vg5H$)wŁ$Hp\}*:wjd9gKF+.^4iU w7'vKo鋸vTmdqM'Y$Nb*Mv6 }oۯ27KpB@ܲ[VGTFղԫlRQO=  odžɟZ 1 E_$),X+ITfKoo::ViK3Xs]@qcr43 9〨)0a;B˻콩Of -=v3pqL e+E/AJi(\m^uqQyI iUk!6,rR/E43h/%s=|kXNXW&[1fA_mȬ_ň0{ܶ"U楻4W۽heog~:=ԝ.HScJlTԊItyӥ:꟤(t+1ejMϋ.; Ŝ bpYRmdZ CE(L.K|Q6 +b+b~~rˆ*n$=&#*b?3m+z3' p6iɔc6喙:}tҢk]'{^u-07]v={5?6Fo&QakBڛWM~ X3!\XdO\u+ܯě{G+W.FrC ->t8߄%[ڸl gֵs &J#ܭ)SYiՐ7p*)5&?E g7v);zaZT.ʴX6/HyXs7a0 zk}5 "cticP!{_Gugx8dƖv% niZ2Zӈ4jzڂBj;*@vm!}G=dJ?NP5"?R j^+>Hے*oh3/_f税^a&פy@^mFel)27}} ֣]y鰘uf4j$S?s{]6O7j6rzjK+D5Ɏ VQi8ۨr.F%&efN/K MuojwO45wG`- 2DqN Мg47xJ켵oOHԝnxLΏ-fvo6r3YRwsǽi(4t6 6w?3.QgdjgquC?|̧;qdL(? *ۡmڢ ^ AJ |j|,E8D[lL'Ά̑n3l6w\JWv^8PpUW+db aWEVgi6eF558 3lp|MnAWhT, yV3^o0yl.FO̝,|8F4XX߾M}aE2: vgCqH!Rd8ʱ+?;~㙮nc`aB2)lTC*"~rcFB~\f|)NGf=kQZۙJ jHd7ݽRPnby$vֿ" ̣ YK6LcV_ ~#7#ńܻX$hX}>&j9"\e- ߙܸxب %>%BcV'X6F 9wHCrCωtY!v׳u Jk֨, 1a-:/sD"sz0o?W|ogbG8Q 2W'7 i ʥACPm5Bڦ[xeē~:uUR`}\P: 2õ5u"U `Wڌ hdz2{xV­*\g0R%iRC܋4gy~햢&+ |߶4&7IPt:]GZԼ Mج=^خQ)X]Ly<^(r(ǿx&E V ! q[L[}U=+ }M'=ޜEkN]>n"fH./?X6 ldCvw1X4[zA}4G< =-4)7}\i(/R@m 3A bCbw_6Ft\ R6Rw.B3޾b3\2 o9`<[L/(I<_-^YH92:X{srICyPz83$ xń/=ϙ":A(q<mٸ#6JKcd3u@(@%柃?dO s-DeMHliI : .pU9E9Æ|a <DG?#azD1_6Xsx9)hʽR 0FNS2rnts$&$ CJ&˅tdq8`'Ltt xlٿARQxf_8ZGdlHhgzؘbd&>7vbbL9x|>A(Gqġ@ׄ=L%%wd^o=[=|_ȖD!E, &*&4_رtlϮy9ek8`0X@;w~I]5=s*G^ZK.C^_]{~Kh8m,X%t8vhBfϮ]oM,CţC?FRtG5߼&\ps~7vbc_*-ϩKO+'< IQES~Kug,\bQ,356m˾ԑDr,]Q :禣8m`.$w(QwKiN?ja\"zZ0۞LU^UBlUKn>kL:tZ,nnu+eYk׾ ުe;DW+#+?ixjKz=9'Sw15gd8 r-My#V<9"xX 4?eW!20ވi:+jGN3mg$pbNuYnHae0"1*,WPRo0 "|ֈw w~}CfeCh-00k^%,{޹*z-9pTN8οOlWFF,: ͽq5Hrݹۙ2fֿcm**Ѹ|ڷN\ݱ%H|LI1D' @KQO6ok@L0p8( 9c\A[-.ۣ%Mx*oʺi98} rM47O$uM,%%PFL" rt'Ԛ v{('\G#@3$/J T>%!WH33[286 xFkw" iR~,u[7g &M$I֭C&Oœ.vsB{vV#dMzgL!Sj3>~(NS.TDl8m=-]t*a35Nd Fybfr}NqdIҧ+D% <0"qLnj$يc[qn[sΫA#>,g4)BV:#XZb̩LDbnZp'%[lV{IM; *g&Ȓ崒7$ P(M)'l$I84j2x\2BD(yMy wjG'6J!;trG܀8@(R#V P2aѝsEWLazcNB3"~$hu#9U$apꇗ|O,HCGA7Ǿ?֪g){d{ 1vH!hE+{ŀl208tB f8ye]zQJQ>侴lx)0gdl,iQS .5b9G!ey/!^ %K]p/rrbi70jߋphh`4@&gĄYTCi]6&7hQس2̚d.x}dp{dRsHN_ƌ2:#0cojRJE9ek]HoE[y(MmncHc! I,L/Hҍ(Gl, 5r$ d&/Μ2ȓ#hMQ;'@g(AM6 :B:@ )8/VsL"t[&lo \[8q+ql`Gq0@bM,19 Z8uϏGL{Tab&"o"9UVh37FNgZ 2dߐcҠ#Sod ) K0BȄ t ßA p%0&5:T^'x,yߔF$sgx疥xU"]4JRFʼgv~"e0-7C0e9JcOTBq&5=ˬ:';ܢ+|ʼnB3ki1 wB-mP[#0w aϽkk3:}SIFm(srTLYxlOԡޓ6<~<S^Alm6,FX1\oT@h'xєb9B[,/ВmѢ?WXV%b%%(n'RGƅH+ 3~,-t( ~,"5 ёBNypxSSgQ,7iܦ"}FX@D`UNf\}sRռ8B`{l>SU4T y Q S\`4\R !44 _xYQ\DiJiDD{ pBJ&TFzB\``b[1m܍&89DJ7ZOӑ=Fc҂qO<?T2qj^ y 5 <\(HI<>t^8؏vd;MG'=BnxhSg}F3⨎E[1o_?"&  " P4-JFH<>2W'(繧@@6h wppyTlŴq C!/)>N`F4p2$y<2Hʬd 5%7E~DܕCL2|ʰ4Ψn&ϩ[KG`y)5f1 U ,2fOMpmr̙:@m4 D4q.*x>D^$aqg1E1rB5{F"2Wa+1ff(&Mw!XܘM㓯@hNRU?z+/PeDMF7c͢RH*}ʫހ`I>GViֿ z_H8n6/bq$`pPNIpU،p{><΍V6GGT] <阼ă=DUAv]U{'`2ղ-&(81<;T}],4rz 4dycFZe|,考8< op7`FH#^TuES@d='T78_8@&.Q!hay|ʴhE XrIE}*>1;|z."#R[aA\u/(~4 YQ?|./'J]( 7Lk 0 73eg,Χ"ι^?Z;P $@}tC8n6~WTrrsu6$GJCWitVRR4ѧð+r+ {+F,_A#aS9X/3I@ Ng^s&ŞݸAXaKH_̛tKL&}"StUFB gI˒$qGVS[8#06 ;X:wUT~A(6Z.nIJ3d8CLCI^AlQ":٨L07bSВ$GJL;hwjNˈKfr[W"l0[2E]D "y*߸c"1`4y%Qϻ37Y #uDaρq0ħ 2vWIy8x!4QF)}}O>Gd{nwW&չT:?]@az#VjKbBeOy&)W?/0)? ԱH@+{r^eiV!\L1`R^qГR+`#lr6|y=J-T7 U!;)< bNhsD뛁OhF؊nS^dcqY8I]8b2^L}*pQͩk')H1`A!$aȿ=]>c6Bq̹' s=C/ynlI\&F1=o+l9H-LБPC62$ۭ,3%r .i0-tI oFqFlN]iI6o 9 eξеQ/Ghef`1˔8$,̀QdDٵB^tbWٮI3 bD \3O)B/@NK1 y5´8 sC@0B&bF) 3nK:D'7A}GDĠ#$qG. L~Np{D(dʡ ިF(5PGgD}~hV.'jrf#R'`;"&ρ8e T@$*ۼ٨E2WڻgpQm!-\ƴRe_feVȕvъ? 0lyOq#,XMYO=~%Zym 9Lm) ƄR(?0$)|$`U8R/;R`b7gOR֝jC~&(OsdS܃8,vp&r.ZXlAVyjb`kM*=$.~d,ε: o|O&~I>W'0Nu&@jdBS" ri } /93o83G^.97H8Bw3,kFJ!'sC}9iic&` ipv y/Bu 1"D`<£3\! XfI)Pїǵ 㩤)]jZpGIlϏDOV FYi;yc/_ILJWύ(LFif1c#4leBRמA{IQ`\9yE,pqj_ C#p_N=(Ć*5۠eu8zIÈm7(c' B4?|*x&wY"Fcq!ll Q=ՆW{B$2AG$#E$975Lm ~sȈIӊ_rw2bQ?dqf`@eN Q^Α16#AzYT _5ӃAN7'[.[m'j}~yLIJMI^T'0B}r߾F]fDJb]qߌcH#I1pO d _<\M.>R m6KL# ™Mz-cVfRHNN1f^09FJ?!ɑX뒢n: 2xEZzNTuQjOik3rȇ:ØH-ը\TqxQo2^W/ Y:BP[dBO^zwaKղhpfTV_zҘ؃p Lp: N?udP ѹ÷uHNh0o<tI+ƞ0kf~0B iEdzz1Tm+#N0I aee}ω8<2HB#\Kb~aN/ Hp']Nhq@ @ (rtt:TsᾠY g*$m\K/Dٓ#9&P~)n T Yh=(GER:gtiTQ8P|<k>\0Fur 弧!$!`|C3aq.r?Pc/ la s睑 8#'C\J%o5l u&7;&(H)YSDt( ,hK^4નVtLw fcv "o Mn0'sB$QQL4<-H `+ hi10h`㥵[.+Xә DUA(#;&P#Y];#6F|~7_tE*WL0?_E7ZÖ3z΃vczQB8[ E'K=`kߏ8k+yB}C9" &cEO@s4rԽv%W/ܛ3(? _%A$ 1&Vc5U%JX8@&ΓHG 3B  YG<' ,ڎ!)Mur gX ?dšzDBGh|hؓ^KG|Jt0ч#[$pL9@ۑ`V) -J8xrIwAWe*~HIv'_$aI6fOMAZ|œm$a?9[&׌^C}Wv,n%]Y̬ 6=O oD>9k).Ie/lG  L6pзp*LLNGQ9Y ʬ%*ZV C&+ dчl̙ĒɈqfTI6(KXr`)&a[@6Ʋ*ԐY @$fPlޠ&IonOtw"Q:0S73c"0u@P'Se+G,.k",x_?g85_OEK+6sӪ\ ˙<+^k2RZEMX$3h--̐$G+FOą4QRZ f}@郰drs.l{{S]>|'ډ;iCbԛ[ PQyo3`4_iJE#"Q<LoaF#I?]3yb2\M&Br68?~`99< ~$ Ƈm^"61\%ԟB>qHK,>_#f,t,(O>A[Uo nj( bT~༣3NJ\9DZ3$S5bAtr2,TSM(=g_俿{jh2<f6fHYc9`L 0,V] ?ARBi⑓$40nAݏ6JqfHfD2N2Bٳߴˆ@y;⁖@M oy2XxUkJeTWZEmzw,sU54DaN с0ui9fuXcKQ7.CT͎/ED]_:% 5+z3?̲i ԳVfji P(;5KC/i0D@U A9O K5>xL#p%FeWLD x|A+v-#ֳbK{蹲2ݡot. qYm>a ܣ_3 _~rYcwyӏHp,m\dr~#X >BVc IcD/^`8S3;=Eadݯ&u$SDIT+me,T?'χq:dF̭B2BnnѨ? }~;J۳a=F+jMהF4ٕghm#EN a lÔCuO\OSDMW,DGМWFGs*K m8 $SyHE*G2_*ޠ Sb:Ee&繜޻o_.}bpE3ܐiأ/Xkc & &j$ʂ!ʆ`A41D/$e_?xbH\˚5 QiRzȣwEe^rwlwR{(U_+I\#1jΛWgDo>BpY<T@0 '$浔pc9xe6A~r (ov 6'R0m95{G\|*'XO-7 >C'Ve/WxcF*Լ\8|ǔC(*n( wr˔|F38~N4=.3OE,YO7I7ƋhEFrOQX<ߑ\wN "Z#s\@Ώ'h8U2|7L(*dz"(7^[{΋%i!jK'n- {5Za+)c.F8z 3Xm`Ȗ2,m 20#O| hqLr!rD#qTFl@ t#LSyq\Cj1ecGb=/PBpп]>:y($-5ע v@WRJ8z m4~̖ h"_70bpw,ɓNyy™9E!ΈǺ=4@A3LaԬx0IuQi,ïsB.:ZT&[4'oɛ!pss\ ~{`G,0Jْ.h ~lu,#utKD˸= a?Ba@񏶤&tB-KBk.oΥ`vHȿIFyVCҠř?x얞1;1fv(:]uɾ9A_ڌ-}(rkFRZb̌Y1!1,ke; ʤSc`~gd;.fLȤG+y'3qpT(I sgwW'cju+}1+lh\sF)D˫pAdvzӶgGӮpRr <#(Ct#2!1"f1mEY( S~;y9oӤ-Pk+]kձ2џ9""^9s gfݠlS*O ;{A!+yeґc/vI}7RP ' `ʬ9JhB _7fxO(G^!q72.} 'dwmrN{D(jz#jA2B֏Uځ+LΪ:%^{bpm7FhS9$Ȇ̜VY(`P9yټk kƨ̤8bu\aXUs^SkIyuAeEbsIL/cK@SQ/mwHC>8#x㦑@hZش(AAT ,KɊ |4 G^ā3ٯKI]%C[ Ņ@ҋ_`$4D f+j) ɉgC`qOooB $=1f`tƅE{>.v(X &s?pEvH FNtJj*"v"3)A"X1K$oSX" `Iurm#U1J@ !ndHBhd˩(Խ'9Y,̟l>`|i'{b lA{pzP%,YxFGlhWA0sNPo1:gϐaq4<;SFjB/~l;yQk1̡)ːDh qD!6H S)l`(p"Ϯn9t(G&A G3 Ï0];pe /gXndL*8E% ҭpo X Dn9qB1m 9+v"G@Dnف0dVzd {~]*KNM涪sVGKLh(b 4h't=zdB!'9_8UD:a趮5r@ }3P/=SNf M|B0ۤJ5Ii}0(썽3R$ˆ(͘ lxNg !Й. xV%t6) q; 3pۖBQqf<>#Wa"aD}truj9f)\v#VN$1؞ΙK>#㫅bn!]Ef#T_6??@6xۣFhW4؉֖9p5@jEht̟s8z!$}H>#˯]Bf%" ')䥸a,y~FB Ͳ(ATVc5$6j?Q`QnMQ'`)3!0ӐBLTȭiGvɑmFjq܍#~MGp =āTLpCN;=b\a$яJc6HM6XX6efy 0t1GM`QBfZVK%crgaQ?JȄ_Aui)5|ӝ1O9ִ΄b`Xnjz1h/r0TЙlJ&:fnƛcMƹQ,N wa~@VXL̞a0dz3&[nVӂ.w.Uxm28#vě"a%{Rc= r[Hs#HN<2d{Y?~^E(ysR'tF x#is=hh)JQRO ?[eeL(T닗PBXcyS4Pдl:"3^?)3r7$n-JR'vw{3̎VGnq>_585?%ȌLDH!]:FJsH 3CGP;zhvdl˛<,:/<⁠"O˛1lZîGcfrsw{<9.2>cGc!31E!XG$)/7 M+-L)"09pq'Oe$5FR ) eqw i5F)n,@rN 'Jts&a<(GjExjv&{`6g[m21cΈƾ?4WfZ.xə" ت4^gech9b5<y㙤S g9C@ |ʒt( !40~ ;YH !% ٖ9ÔhfL|)cma3Hp2/(0D{1[R~i,mc!"w)MIقy)%9)p$?#AƵ5gxNw ktJ/9؍09עbhFD{xz͓i '\Z,%NA{%nǰuFbhD:}N;=HnSm]rJpv):ʳ>.;1z"J7N{̸$ [O z"#"VBZ >1" ÜQeJR]$dpl\{27oX3QRZ.`ԃh=I34$0/{q˚#6cXKa5%v0lsv7cG@6'n`!r)4}V{(6>/ˣH7tω ya2F-g6PU=Z5, zM6&4V؏y3RrìaZ ''1ak|Àz8<^ʙ SMܧ'G9gL&9 a|(蔦U=TҴ׌ Axw 9ii1✮VG&QKsQ:U*GyZcVP[D?ED!V'Pc3) 種 *. ɂ-9Uע0u|r} y\r!#4Ǜ57}^!c[AL |y䂭_.PԄc1נL"˗4h4GH LB5Mf$dd)~=J^(%[-:FM,Ʋy[ftcc̠`KGpoA3<#'_$YuRJ E ?M䆿nFǧX!CFg yŚ=gh9$A,`JǍ*K#88!]W0GʐNaAy YQjT JhI*_#g-)&Y39ڸ6t]Ӊ5xӆn(L0! y2~bzпR2hLnJ8|w!N, k)ԗzzxcv?LE/kc3c_y|z .!sL׹; 4Iʲ1.*J!"iDޱMg&1&3vM$[K 3ř"v؍ C$iFJ"SOϥqιM (wne|.<` srk!yS >}rfB1F[JY e{M6{m& w3D #ycJ2tYu*]7ki*HIt#}_rRscJZu;[l!|!TJ"x5&TաіZ BH*0[j0P߸mg,&8<:S5`||np8XV4h#5,DZ鴗-5wş]ǘ!8w3nw3b$ ZñmZ !@>OG*~ON)O=\c)M6B5Z!AB|sRsT9#DcR"eIY<‰[@+!$HEV<\9#ئ5RkmN ^@{Xx;T4 0oCN.䌉lTKL*e|I-9Փ}!q2ft;d=~$5*Z~yK*RFLJopMA2˘S0CP<T/rߗT&ǀWj>bD+{FQ9:К#"XEE Jbԛ {h~/o`5Y8sξ .!~E2g2(B [Е%Ac-qN*8uR~|}@;E猻 )<Գ$i=dP#g0";q-̙51r2/Q]*jUPJ2c(  5fJsb}i3C&|nrß`~>CwS%DRQFTTAeW^c>E~{׌v6tT$FWtqNCvDpg_α4WPd1@;&-v~=d32QZɊA_ 5) Rye\?6|Yb#"91^|aWK5ʀNi${3zA|%^"ʬHT1K $7*H-׾iYƨXKqfϣ #:lŪBiʒ:E,$5 VneYXQc fŧ8,`^*FX*?L~R?2!> vCi謳A-QLǘKO#+|Nc2ޓ4I %@ C)dOã $3Xcu&Cj4G,JDJL9'3iwbdQ-i2Y"w>v &vo{ci7_i [bT FIX&ׅnEx}GouZ׼+rMFsR$;_މW|RƎQ\i01H&11]2H 0Xao'E>UN"0U "!U5_VArbGQ5#|#J$| hwi,Sh!d CGѳsf |H>0>|L^H+yS=29E!' I'#UYEP@-|lyYgI @[SKI`/P- ^$CC:y"eަ8L/)̖@W&?qCO8XReDВ(Y*z}pÎ*s %?Ө3FB#[lr;Gl$t3tnjZ3Z~)s΅N&HԚUpМ'&0+3Cqܔ(ȳ'gF;+z|<%ڹ%0>P3:ZÈ͈>\ V Rwc8oq~؉i"٢r m, @(bƝK7r" i9?̔D,iڨtB9"W@&>R\f-t-3W099,-9쏣5k(<q ǯεR!RYͅ0ĈdfOAI?(/rkv ۋ ϰj"t1|c4?c97'/YJɃn8 w<#֎ĉ4Bc<64G3psxG-tMFD%NĉZT ŞY]>;sJi3ed@^z& E50>!?1wOE&6K($7{ʐ, ,HDlPɎJ`28A|D!_ O˩\"< >b_=p1&p/Ѕ"l|Y gNx Ø$x2X4= AV&OI@b7Е*̑̑9B"h=dQlmϮkaN7:>$3bqP_Nrq+H_ GzRueg Ziz?`:G؆vjMATZcd?łu,ukmQG9#=ݍ9nYny "b|3fZ!P$TnɮzHcƬ_Ƹ֞$1쉗x=ȖFVwk=:6=;A1rD>Bwio}lf{;?71t;j.JN1RY7aZGRub,";MM5I*f#ݬ&!M(ʈ |"+LLj7$}|jY4Dњ0[Y(MR b  LА#G [:"["QCjj_Q,$(\͛)SM]1?lɔ+bs i8ũ,e PnFWNlKt+|msJgsHQ+8~9 ڏ.#pEuI HelKrw@W}t_8ΜarQSgK"6cJ :b5V޳|BS)0kq`pM-pȜK} 598'eDFKJw h )38Ƭ(Hw!Z% 1hT E2L\> G.sw4y0oDe0,Uē/4/#iJ28ĒU~:({?r!N'qz?5ЌF=a؋,Z(aD7*OqE?–#QƚG2ZTߤubdNdƈI Џu!8c<;W=8lsнhS7Zy+J]]c6jcJZD D&:}s! @m@+ȕh*R}2̗- _c a 5;`i5bɣ4:9f6rC:n,x]z$~X[ %))>D`*Zщcv#CaņYofRLꞯvFȈS6l8 G_eoMЄ Pď^XuRM̌A>d }PSI Lؙt :}M,{J cA]ډ9PKĩPXqڕEr Wؿtۋ"փ3Jg-+`7㶽"{=Y)#V~8<$1x:[F[2hdC3l`O)U e >`&DH;=&b6#W7R'u=9m%-?wQk1Y6i6ozlJn1#n41q:%@K 1R<]ȵRXUQ/O}2J&5&ZT '~Lj7YycX.5S6 5'dAvﳔ'S8X);dR>7%-nΞvyIVL禪L\dZLAf8&{YaM-z\N3r"YϘ0 vnU2G^ FxĝLye2(5`#VPO#9dqB:k'gCaFBq|YhuAD $78z8i͞\Y #T)򎡔>F yK5uG<UEMKjPCE#P^&,Pm+$oF߸ xd31J…8_YAW^圦'$⡪9J^2#I)֛nB:T]ȭҙ$fDrT؈紨C۪@&Ǒ6DQ1F7_"Q=p_Bߴ}@ ?n;sZCI`8>6c_"v{FsD;m i/t;6Bg,7P( 03Np28 8x30AElb!p0攳jÄыQ¯7ʒ-[vFl)OE ALQ?'N d1m8ЀAz1g&D0 RY( `ALv}~hi$Fp'!ؑve 5k>.|QK HiU HwrnEP;'>E D<$4W)Hݟ",PLӮ7t-vy{?"U~4 ]{5cO㋲"Y5pMx/eOpʎcISL< 4l&_;Q\Bq'o֨\.si5:cKo7b.<'D:sf' E!"?gj9^R^Q4֨&O;Z1)GhN*Ax=oiq SJ7hY&?N/uל3pLzj9J_9@] %/h^ƒ i璱(kմ&7lo !hŞqO"gL[SR.cfjğ M!AO6Mgt)JO[I' !|5Q%8t9c)84|G?+XEpru43iHrBHGiEq0W-N&F]=~bn.:?>) tsodO0?]k4)(_r5X 6!\7QU܈s1;mNs[D&3<JYL}IYvR 4~EI lyl!EaWĽJ{ޔN* ȎQD( dg=FVx+0}F '$[:"9~"}S!w:D1pđAe1lČh 3)E~3qCV0Q1\R3ciNjˋr a絣 4Q'fd S=c%g1XI,^If{Y Vi_#30z[h ʈl ApV 2fl9|r@6kq4]P3̏e`U #'HF;ѡ{ӊ'Jg<}i͈ui o~EaL1 $cK{POD 1Z!3o C"VNcCD҃1Ru7tR GBHZPr?bQ#p8)gQ7{H< (Yä[1 :$oAu,X4?N)1CVˏq,+' CK@5EiД$l(!JcPenLm9`Cju#zI ?~,"rEDGnrB,~Y6f<5g{ej8~ـ#l/Qz*hsVQ-;_?i >? B\#YAٙ3 A!ʘ%X3=< b.LAaq2~XQ'|ƒ4m4cI6$ 8Mf@-3X'{I͍%{4BT*~):ث2B585DQG2ĝnoDSPv vr+ö0WHI c4u?2Di_8@D-q9b m= :P d@GZLvY-"gďi;GP.F$ëyp!Aat 7BG0lpwlO<dyq6\4̑TiQT4W&|Ζ=hNDSC3tahSbi q10tbav&*ݒ'bł8/j9MnTC k˂^ gXx3Cz2&弱ȀŽҒ%RR:aܚDMƧ5bAܼ:td<\w7ܯ11xFRߎS&>d$![E&&kw|PkL2%y b/(~VXl·\( "(업 Ȟ@#Ja#~Mly>evMbqcN̐91Y򇘴0~$lhcVBp?f4ˆyBewHD,xvOeIP7VG4c1G0`~Ԥ(Dgk(?pX76l;# rLndO\=Ot9 ٶFb\<1TD$^I^_.k/gԔ C,Vrٞ< R3 >G_\餥>èqF_,@ KGcȞ&)/lm[ tlN C|VL9q nQ _'JȑOG"@b  Q>j!F?gD!Nɒ*J(hm5#Þ>B).j[[(+D̋I0u(\ڜIuﰹ/>* LsѓRAw1S V'Ʀ599?ʕ`R,,1łs!Sp睵TQm(þ&$e"Pށ rxKK$ŝ䥱ϋc 9-CcL3<-0k|CL@QޟA2=oכ!fy AVIAt%* n+=0Qi3؋2g5 ^YF!-tF(s4S:zO=0!)@I6ۢ-cӤq|LD`C Zpr64ۃǨ׏˃7D$Z[Sm8b|᎝&h"Mr>/%(77/(?6p2oLHEۇSH))ǭ0>!LO|ٙ}f2 RCDD7=P,P?Q2*ie.4d211C@T;!Bsya8|8gIt/ǣCq3q4c;yX?ѨX`bDʩ8d "plr*(F46Qί7rFepϮ06$#l ?^n0 E܉E1L 2Tŭr""F+Hq0NsAp%OЪ FNlVmD$95M#K˨QXBln;#ҁC= #G14R|Ѕb1cCIB3ݴ^\rU&6#\T ݙ+ :@a .yGZ(&ä0eS冂SaD Ŝ<8TА= 3G_|e8 Tf1୿ECL^LhD3N]D9`C!?;=ӪahzP8y"QHSҨoL ^ʌ>Aꌹpi%a;l"2]̌bjÅ=BaYtthMr3~{,I9$h؋z3k4$o& Ns d-EqtB-%N fo|ayDNLǘ*UE:{ЎVW=q`I7|c17F?GpfDbhܕmMA"Jˤdo͹f!?^1զ&&֤ (h8ssF.9xAɗavqv[7©bۆGOBp@$9>" y6VSX?ΈHa "Tq`rvSr֓T@W`ty植4}p*#N qv9 tߐb!>fAo?cH5ko1N/‰%^h|SO,vChlFdy:y/JBY/ Kl~k? &H'2d<>'BjdNQϡϋ Aɶ63밥)N?' zUq, `}K2y4޳|UBw$z(tT%9wh` By&jGcmt'DїxބU-Ո<'zMX&'l0EV̞KJ!.垭&c38"Δ4tXa3k# OGV!,n_Ɓ[>jtI&$@k}O U瞥 PI P87 8C(HTBm 䘦Fmz7e]Xӵ9h5bA`zҾ^@{PҦHXjg3eᑷp/Tg(t@H k?hng @$u9>dBҴ| vq%LIZ2 .a&Ntd bQlA$M2eC{< jB 9eVJ" sRa:%I.4' (O699Es'b4D$W3G2fT+y|yu­2MSΆP Ǚk2ox̣irKlhv%VeI`L)M=k~{. {i5( H%̸BRtx ʝ(UQ\vo'hL 4C5,gk7NXءcn2I#hBoųF3]P (X/ IVhB:Yo 7@ !&]I+ڊ~&0Ҳhm"P3dGBC)'(ʜqMF#=zGn&qjd V{Nb8#~-Lїc(t^ `Fr9B5C]I#1,g؛seQ]БȮ0hyxVu 9wsqiQ|J)͝b+Su'$f%&~1TuF8g%F=zWNZZP c4T/a/q144yN'h#O)EoF`fXW$tmߡ29vdֱ%7.rOMCѤΗ 3v(V84<5\+o9&>jYJQN!P+( u@YZ>Z5X1 !gC -Orqn4R9oa/`2"c 5\cLA9i6P].C s=lUjđҔt;{ӭSR@pڅ`: -Y0ρT@0r6 TWCEdZA8i@ݒtdXV-dqNcp'j; KHalv B]#4SzkD:wz~09&] 䜳:^|a=E$fɎ>)H!aoR>)xƿ05AF>ܐ1JgX&[CIdYRUgt+ϴ%(i?/9"&1> vZ<|q7rv9݇76C,3tN, q jCcj|UÄD Ϙ_lCjXNJeIO~2ìr/  bWĎzOR `-G9Ut D5 rIQNZ6y.)=}작s&{r"zLrrPc7Fi86*A?@W~6/&ט6'|NлpDY }D'`!Gq4^`V')ZI@_rt@͑ڗw91Wр GR2&ehܥwӕ4tJlya aA55RE8\8, ~Y"?H#T%aOSID8Ë($DbmTK\q=TƢ4֙ݗCyDFŖfh`ڸ;7VqU1t9gtӇ *Q_9Eg G's(:.AeIpb q5GzSpqLDB֔`` *ʃH|4#ϼ4LRph<(dЀr`cBR 5Z<էזf5)U(8pЇ,dwà}UAi:jtώFl` Z=>xDqQCW P4(^Q#6vЙLV gO4Hhgo|p&FCtTPP'bc(UQ.>6-}9ٚ4.kH#IJm\թΑ1UǤw ȓbg|~Ȓ0ũLv jò"gpU]1^p/45Q1a9?Q[l%ږ09.ZWdmθ.h{;0"o1P+9N/!8m +ZRB IXtjS 6w.؝ rY/$ @{Xv:!ʗ1da'F0hulj=dA.qiܥ VL)Ax oɪ3Ey9lC7 \PE<4j磏4q1D 1t<M4ܧOCT4FYēBj>;X9zu;vGu-$f <#\Q4 |㉖q{Gp*FO, =PG/(}.MԀCJr":#o!^pԚ1$Psz-d,byD =g*dߙ$ș\PUíVyg/_ΨRJ!Dϴ;o #3\۾r!DT>D*>*[qf@@B ^ 5deDv\G*ɑ螥3aZF8cH 51Q{S7=Axrm59N`5G:(V> {tg̾ePH1+'8DBFp yu 2!re6PH?L2AΏ<̞Li1cv=(O8.,6 FR(E"˓8M욆qYd͋XvD/£V(CF3R PT_|[=%ԙF0A<3z\B %߬ i CZȊfLxc7E 䊺|rG>2oi%M1Œaelϑ?)LKG|E߼ d|3(<ך$>hĀaJcHIӤ& ޝ#+i3^sY cƹPvi3*JFFZ &6dJLM/nE٩r$9aI}xb$cA/cjJi%g*yb|7ꐊ/_T]{^|&TU#<=I;X/|̭;>xVʒ1]'+ѳbZ+}8ݙA86, PYEA4"@g!HD0݆>p<'h!zBrX`;D%Y5G{wWߦ!*d &}%b%Mh'ž;g"<Փ,s.sR:!xLIcCnq1^؜3hSj)2ť,<?C3cĈؓ3%ʟskFs$Gu˓t A'r@QjV:d! ؾR!7݉cv8ےߨ*>LߕsCVDE=\eBo7wfeL" Tx i$Qx]5amT* C%avG39>ca6m$V}.@d?;#M XO"1'z֊޸a!0l<(+g\q?|z4&.踼Z| yTB]/Hv#f|eQ50zYPcC/0hE9MDkNpӁK`aInf'&"؊G nџYWz; "&48G˘% h \vI&G8 2d*[U2eU>EF@hR!ͿX+,.N s>(Vc-vbdS>⻮7;˜Ӓ{I?͜Z증mpJEGEIXpbЏa=%v}% CkCgO1_33"8* ?:S>*@%mQ/2}(9qY OV)א;D?/oWuƦbGB8K$d}yӦ, %ym璂k cc>$&I !^r` '>c ci[#*_5pJ3#Fi+y "5Å:l\$+#❬ Ti'av4<\6fhbi9'2OgXH-bOgT6"1j0#Pn<Ȕ+KRW wN9oǔó4ѦA>xd'lȈFz{SPaNKy0I $U5r{,v\ːiD7#ܙ`L{ExZ1SnI^9g V& Շ&(aÆ0I;-S`E/a' I/S6foז>\}󑵐Y!x | 9r4d❄qhNĄp=Dk'vjAޅ k?9oΑD4_!x(NKyN*9 NB8nGQEk@&ų}mԘhXq *,&œЊW=&H c6xy͌eq4cFfWR9@{1x{Ģ X%#*b,w0䏜r\]X)+u[Y/m? IAu fHw# m{ 7K= 1,Mp@\⋎/aS#r8Q K˼fŻni$yNE00=Kc1im 3$3CoychEVz4wZ,B-w2#L@˲j8~hcSp9&e w֎ǣ1XpO'pLŔG1hۑc`|CVt^b(}KqݲANm.bάfIӂc 92R`Z͈ƤRGOTx@X_G |?FaϐiC諴O.`sGF XIDExNo?Aۓ5i>Ncr bRA´!:X7OZ bBƪz~P=e['ѩ;=3$E`2ِq1.YrS\G>nmKCid4#fTD8 @Fr!Aܾ`EQr9f c9 lyy7Y"U=q,K\f-͑,_ "x+ 8rDNɕQiHx8/eSRA8\6쾇 N/QLP[1%ܮ (ۯOmOCO^7&w8,dxTFܽx2TcLw:E.:ղ]-9O 283lk5x4 0rID_1112"Bl"RN4pX(A 1"n#.^Y ѵ%pBj [Ά z sl3&咡?EQ9G0da95v&Pˁ0!NFP4|DE*MJ.Fo&sZU2nqDY +5sDvrǑG![+|{fo´9C_6#a^_!s | #ŚP C24ɋ7RI5EqB=y+icZT$9/cyRwHwM{Q;$u0iQ͹1Sr=1^K %Y|c ƙy&\itDCK#G!p ?F<ӱ@'B4cPdN&wtԞZ;y:% \E0®425[ܑ?tAid+s+5XJyKt (BRl#?gZ e-̱Rp:y I!E~K+Oގh&Ov7 >vo(AsxW5t5:Da'$WI>j,ǯLPN7,mǖ48\3.7S+ӄMq *ߕIO,"4Y'>)(\l E#&DQ ؔbƞ]m ͧB5'ݩk)x#?I*zGl?al,2V bF"W&$Aʣwtq-/CR<ї!R*TxxgG,g W&*n݋ﺪxv:WL&`QI<$oٌX#Vr^Wg?偀J_>`t1dW xzI{KhcN,oAok;ʕM[erҐ'1Y̰ѿR#yG0ܸCP' 6㭷56~QBb EO3(y9yCf1##n*8+ ޝxQXܛ#UQOAfUEoxs&=,薙d)DRXǫ.ERk GI2O(Ofpvk H Qf6gh o ɂx "ޞ#pTO׊ 3eGW@0YgdB2YRٯXih#cXnf 3^ D_7Ds14+HIǔ7g<Q.F^"Rq R&e=Fwdt >֝qNM_?)x\cT<\šlJpqNv㧷IOQL}s4dqgPœ6&js@'; 0R{-=ۓdv\i:Fu k 픐<~/[?6Q=Be:Af-[40_jR`e_Ig5fj }`E0G=D M(ߴ^W=D, 0 YA,xG\a<)ʰ`! t>=0>=EwV͒1fFr$Y90* F4tKA*O:H}R3A,"p RabrQCmӌ'Fo%};1c ee kf:BA$s,dy< EϧO{o"} -hV|u?\W8:8z Vk 95Sc07\b鵎4hzH}ve~?x(- (E>rO7jadT*RYJvdk(+D.p5pWDKc6J]$&?G(o%0QjYdY,z<<0zs \djr:tlrF8iǖ XGϲ7/2Y(43}rς)Ks^nLy"B8~(2mM(0^vܩ?b<5j IgۓECAL*SZ=BO 9a?c !Vjƌrݘ]&Go9Fb -d6苄"qwY Pk"mM'nC?} ;Dr ?sK 4&KvO![b$[7 SU0~jyI?xW;Rf r.?P-Mɥ7+B>baxH}!s&yŎ]^ZvzLW>hMښM+߻hAmAj.@bYy ֳV| B(sHLLs뾮<fɘ;vDj5GҬ… 0l_/O?{d1XL1SI"5<&[ ٪ao )Iw1C1٥=!?j۠աN[)%ưi03NR%462)<2!G̶iMY 7aGة^O d!4.Б tu䠮SrRpj-LQZY FSa@ q(}r"p )D]Y?n1@[b ׳U$eN81É͐2E)u%GX⬇&N{ြcg 岌M Lr+C1=rFq B=O^ > ΀1a0%Dȓ|ɴHjBzFr󶇦&)<,A{p[@!A2ě"Uw3!`Y6T%%!ID%#:w{DY-~S,&VGsLn &EK0ƒ-)1L0Yf Vc.iibԲfffghh+.쬌3/ hY-:h̥)F$э$fLB+L"e--//,YY& ˙̌2W4R%JJ3"FVFVFefTʔS:)QyQdTTS6t3RX2MBKEC,ЗȺaR gdƉcP2& hh1hXbESE4f3FhAhZELJК fҲgyFVvyVeUE$fP)Ie)KEI,Y%eRPRRJR*YIBIeEE)JT(t"%KRM)R-4ʅ *bHR]1JL*T`,T1KK%IIuZ]R21gYeDfUJz bY:1΢H[D+'b Ǻה`LԹ/;k{${$'oJAB&KQfG$It %b9 A8c>DdL>(iOl0.o D&<<u ATmm\GggYE Lt r^POꄆZ. 3B1%u/pq/.ZTaH@i*D-Ӑ3Zv.Ys~3`/OKy2dHJ!Oʹ;B}!w О6 ZP,f?##MxWܣk #q %'ZOKH)K,)ʒ%Q"TDlĒ3LɕEL!pD`L4Y3 ih,I&&5 8Q.RH]*$Δ%%/ (xLd%JK%KBXQ&,R )$KNئ-%a3Lf1L&C"(jZhdbI$0g`XD"Ė%4DHLI$ 0 2)L鑊`Ⱥ,TS:那Tڦ1bhE)JR)(|LR5Cg={u56-i&Y1%<ʥhc|WhID./N$t̎aiFJTJnT4yf(R(B>ؑiR-ܤs~wgԴAk7ě}KF|-wx1j[ȋmo=ڞm.!(ڛSpRb"mmd4& QWfO:Dܤldb#]NpLd1"B3bγ1K)bJ$c/1LbgS*΢Y);Ua)0`y$]uj{A|޵RR]wBDqBb&"?< Mk\'pVɋ%z}7$ؓ6J$TJK JQ*XR,H5s})PR*TԤndF<8zTM@ Y(n-Kˊ&dݭA$7%hF&Q+2M3Mt9a 3I6aѺUS6ŤK0.\RE.Ye R(T*.ȥ]B`Te.b򔴋XJ] ."EE%*RR))PMfʒ$hpA8H%MJ`C~7,M4,Sd-(z7ٶ#,*h)RhR!h \ad@s4oDm1dIJq˄a2aܿC6-#F3[::} lSxm8FOR<7Vo|yr# j͹:4a,7(eraU;2 QPgH Mґt|#M(XMP%O0pAÞ6D EN2[M1gۋ>u:4s,T~Zm6,(>Dau;eg,# >aUvxZOH#Zc /d/"Ș^C&r9eLySz#x}ʶ 6ÁSp[]X?DcWza@әO8pc#z\I'DBr!"]NبfPs2rGlV9%{`/4;4#GRaOg8Lf3Bfq|*vMvbA1f.n$X-VðatY2K xEo9I"Mu _$ 1 H٧Xj^JxW4S8! bW;:!zޖP옒_ EǔBIrn/Irp!c"Kؖ)Ʌ?G9u9(aM0bp~N|:c=.S>b#kJ {Lbn T*F8<Պ3S$7TbETslZCøxe&p?bpLAꐛmoQ,\8@Mh,^v5h֠c8†d; "18T 'L_$a|̱n'zK1 }/E]y4EYe 6 fhږ"NbMP {V=R`f.D $eO?2qrt ? I(62~z ]xN@=%9ve$je!zUIq%iNݯm b]x%FA )}Ľe jcY>2r.YS>]`B)t~JfaT[^*QZJ";S5̞z xPГAGI>Bٮ(jvm3rE.6r<>ju0pyR3E[]OzZ9±P3'#l;;^҉D7fLg晳Eb4z/Ni8F%.#4"K^uYTgi`x"ihcu>wD nwRT̏dhBR{ⓣa+^xe;ۼџ# Ћ?IP뿱<#Q7gS/pqdR!y\׎<_˰SR ҆hDr6wYYHƾ9Λu<$G%Ԛ pW8^>y "xJ|>'2=[yDY\LޕK5fZ1)ú2|p1?qwIy'6V&4d3"˜f#cL$8[Bh}Q2輊iM.t1*屔'w.9_aEtsmN4Kېq̀?e/#=w3p?!C Vtp5nX? I48&?&RK)bo_f#!arf.L)w y }8鿗^| ]oK \9- u׸@Xe"X Jƥ9`'f@-5G oۊ^k &ĝc 싃7BCL%QS>x|LkLH3u nl@ZSn/"G*3U S$g>}!@%ΌĒRpQ8B1Ӽ}n4IG]biϊ;E XI&n \06WHHDW$P;/i47`!/nŘ׎7Nxc a~z'CS $#x goI)D=$_m9 $!BA'_i* D D) dMLI}IT𷛴 ( 2$-"ETou_ҿI< S5y\mro`().9Yfe5ȤRI3CERBd҂DTTA/RnRsgJR)JR)D")JHKJ%$IBg"xwjYQjR8l8=xIm{-JIa"F#j-Hn%I"Mee$3nGlQ/̶u.|r_|$!a8HT2PI' G1?0?bیSu,n?#` 2f W8.3YY|c^ؚbt.&׿ @PȔ+YC(6 6o&}ԍ ehJSs$~T:TgJ؎Mѩ.ȜJEqtP<(A:-%z?';-Ꮆ3! DjC8WI5˂gSo(۸ɪՃźܟ`;4<8ƟI1D"fTeR))&U҂^ 817>]m5z:grerTRYܬC$I|;v2J%%%BJTwc;R<]5T3G-"dנ@Y5 RPd{U輚G3X! eQ<8ܩ"ԭRq[0h= 4 cgWlfz&ٌXe߱zYé}X yM~8'fCF#q$dɬ,ʺzxi{q"nMkQqGwX2XtDB@436~̤mL^~hܭ{fs&R~QI#W8ooT92@u G| ǴC3HM}mu@9..}nZ0ߖKw]`rмgISHaH&H2FP.Hs&⠞N0_4ϧV8 1<}.sOdE8ɳY{Ԕ)OϞ/D=oZJdQH%>q7]\7&Nf%(5X)RA6/$Ycݹ:te䞬9vYI$[ێc6߇\8V[Yk~K"Z${#@>Q}譝BEQrD/5k3!Kb(<~ٲ!~80٨^fskˌ_%䥰>5n"DG{T-kږst!tW)+Me?GޝAO/-.?(ks"x3?>:Rcn!ꢚ(gQ-S4'A37d.}zO 1ց!'ze%)K)qOB%$GY"C p4p~_9|zn5hAm -R$~HSǾsqDopG.4R.ο-7ywwHa?j?d T$ @XI~ߧi6|7HOuno|w[kL w흧Ѹo\jZViRI,qja #x&DTSv؆"v+FVTRQJ)E(RJI7)JNQKRHiiiRK)dB((a!^8Du;7q 9xPXv0HjO64QM=B.%b!4|xYI@L?Ē_y7)`|H#R+RE9ntb,^b$=]If_{GT`6bWW!QfQrX ? 5&a41'Iz S'E/&}d۬F#FBDpDk̚mh~ Pc4d(S0{'×:t']g+fuQF pQΑ[b ҭȪt!!>Ȕ3{`U|D=|8cGZHѼnMaщ<$`,e.VĬ4}*f$٣Cꚗu]i`UJn[˒,|1S bᄃE*4;#x j' )Mvx'j]5erKA><9"~ ڐ<_D-W3Hwyʑf6ŋ~ iM<t3$dEJv yF)>-mqpvQ֏lv鼬-cʡ84k j.- GgqX SK"Dy| ܬn8Oiоr >WupFo~2 ŃT_nPI% x*\M8\KS¤ƃwK6Zx:4*fo:Qn6VΓ8}xtum{!جdft׹GxT; EoƌNKH6BURwjm龲mez.&t=Exϣ՚@,Ç/Q!I蜏Gn'?J}v+h͉"taDƩF}0e_SHs @/3lL +!!7~)|&q'_@Q , .o|(^Lxz׹ '>{4B98P 1$WVR#р3~Cf\Gt2PaPϐD_$S2?驓zRFy|b7xu}٦Pŋ_h;lq*]τQ{[Pw1Х>c㻫qm9sDy\Q $wֽcbGn)hn 66I@d6)M!304H[;G=rt z~+rտ݌\F eKB&Žb&wrnI@8!(J( <0&!\7 `jsCq j {Li(]}ru\n#wTj[ssF-I+#Yv>cbrFtٍ!KZ$ U- 6' GXJ =Lpӈm6`a5~lD3"vrrdX?N1bw7'AOOJV t u qi5 r,2L9Y_ڽێ/v"ƺ3CD>/7ٷUQ\&=qc78&tFWјqJ"|vb-ua.sդ4! -DaǴsV,lY0!A+kJJp;y8qep]6R &(WoZn͈v^g wOCx"ƪdz0PFmLJj[$ْB}Hd̫1%!3E ( Nv ^?_ӗwsqPս@Jӷ+eu4>T\Y29g?*] "s<^Oj/J co1<70t{疱Z4A(!18'!9AR yXVvۻ5y/oJ!bɂ?H],)y@9 skB ,'"o BqT1Q({!tH9.Rxa$dEmxċa؜O$Ġ2Wh&(Za)`%:ef$)P(Ra4KQ+L5!32XO/f)I%HpvLSXzMV_S`H^}t#qdr]ytTXy_42''"+'m^OI崍 >lJp<ʔr؛-zIyQ+QF8+Y-m4.G /Ol`JّgFlKwH|}SαDa(XuI᫩VoUL/di+.ۺӤ2WDOh$v d#t|>/rG"5:siSeO J`qٶ%D^$mdY*DOUU+8I߻ Wջ$0kʑ q[cpl<}7wmK8i5멄"y*;A2# dM$&Mh]A`T$Y?uڋ2k,wzi0"nnɠ 3I*^H*DKJFcKzk"T VT2ֆ'Lm?aOJZ6B&ìO7Zz2JoJE*"i#ޟ&GhƜ%Er"{xB% Z39t b=&- ^!\F5mS7\2; <~-rrT[b\ԍ!02#3"zJy0^:j^#g\Oimtēw QP|6"`v'ʴ.a'**/Mn*ҾqwSe(m9}dH]#-3q cّ-3iY`HXQ$.)vӿG|qT+&HS(vNzV;Gdј`J`ƯR/R@p:GUPz*LNHu'<0pě,6C`BLqΓ;9+ݚD@tF?#v\B͒멪-rH-ų-CJQ6 be#ΡPEl`^z.GiyeDF:/D!*r0 FER7t'v ưB+ad~=8ԕw90#YѦ/Ec8p@%!;!)-Of`#]*NGeTs>\e5/-;6irN>$B=c>|IM= :$+ -K #&L% ;׀@+58#Du.-2?!!Y#9O6ڗ\u*1fn&jލN(egzӔGF- ,TQb)nbBM;je "tg6mH 8QLyu1d )3#MLstD9j 4C4/uP*dL,# 5ڷ6])A'YAS?l4vya03r!ox^ͩUvBKIro 'P -3 / X36*i&ܰMkOtIup("JKG}&E6n>@cuU+ÞU&%خw EP9rLYԕXמB ԀP$=q}d;e(Uis_`51-2X$pҍ#V!)>-?v}IDALP`,M6Ŝm,Ӧ4c2|h>paloLNI$0i3= " F&ԡ/Nfo`A~ҕp"ۑ|= CE._W jG蘫Є!$ ɘ% :X"y@hޡxf{RoN( D%$%*"T)I;Πd(6t% $p}6cxk.^j$B2CP($SoO(EE.׳e&<< .ЉlIҬ^.JjrR @%(G I1/ Fk b[4Gd\K؜?@`>.-eTx!~Z8S+Q4BŞ>ȈqDm"l:a FЊCEdgfS>g.8'bFLcҋBUޔ NAz\cE߻:Ѷ!()G)=LB:pN |WIqOxüd.OfZMz$?mM%m)R*J,SpRP) KG׹t=x^#mvw"}$M9=>4X$sՁ"bLl_ ^FmGGz_8Mix F9h|p. *uUP|1/Ċd*z Wݑvq*ُfN }0%ETXȵ' N x+`iS2QN`R w&F@z\Y4c2W9Ddioa/R,ʩ_.Ta_3xPch׭/e9 HCjpۗҦ!O2i~P=]< 5Plgꇚ`4?I"?B(;o2 7>9A؂*%$+TZ:>"P:qнFMa[b;YYvz=3P_=P.MpFS7d8Ɵƪ{קdDԕUZ@m2DPgd;QBg buiO|$,%Y|VDPfv?bNM/Ϩ85H6.BY4&`O;HgY `*;K6E\aG #!Oa&H"sD%;B L1[3 Qr(']J֋C1eF4h"ԀqPjuߢ1AF1]&q2bNG% Z|tlX;mHK@.ƎP|!L/pRBh%!c*q27sD|Ib[2t/ =]ѐX+Fє4q=HL .%yca@d<6 $Ɗ]0leK:>cۈQQ!V )??d DU =]0N̋Rbۢ% ,?E@k )h@ E3ۺAۗVuYv_hRBُ#qTX,,:T=2 B)jCOZ@}Ux#(3.nG>mQ#}cO'|g1rWM5"Q2i# /ή[akƬtc1R 0>4"KEίeA6|0"Q"^xY ds[qL숀tgzĒLI9LzYս:wLԤ4P9ӷ<eX* @`4Z 1+v]Q n;;әA? 𐋕SQ7hEJ4aQ'Hr~o"BF/)H3I/V4,:|&e8S#̏ .t)OkE&>?5g,plk.фB{|{Cz 5+ӌbSl.d3 ?6 ۪ɣ69DӊQ΢YLʺL.a;Ndg/ֈP$;&GY h( `axsor?F,]LzeeQ|$Tr, #No.%EqUۏri@% WqDI>[tfVA[F \ɒb?D!Q"A=^<Ń^,l#Z~/~dDZўgRrD7.G8^p|ŸaPG2e1Lg# 3E=%)zL_r34@g6)M?+e"qJ;c,%QD&@uC,JdS#͠DpVڑ7gXnh}fcJ%<ؓ\[ tGȟ)P-OPkq f< h&.b4ßb$[wIo4פHU-$!,0tŠkFkj)B6CkLyP09|[b_ hLSQ/1E$l C]Zƛ;-Plm[H_”BS=h^/_1ڟ;ǙGo^v@#aA|4!h *)Ir`ju)~}zVx.39$ F@aI28qMS8{ NOİ`MLU$RN(F'_&W2hNbw|#q{I$oy~wz-v 4TPL^_7aN3BIRPPbBz"[ٍ%TT&Y8` oa{HdlREE))/$"A# ]i nTէT96ؤu(hIRQh)"}Fk~x-|[lURJT*"mI .(8XKxKD .V@G_ڶ|NZMHܶ/WﴽAyM#} WEij? AcvnbBW戎RRIjC罇?>9xқ7a&W;P£ nGZN(u;)0~L) :>řFPƨ"jn$)J*I*$$x=17B] B 3Ř6cEw2d=lt|]$}+ DA>~}ų\%DH) Ck@BJk8`1/[3OtVo=҈“1 -侚Bh?+aʢ"1|;\\a١GH/wܱVYeSwq^'lP/T{(?b{G,WZΑjXMFr1&(w[ ] k2B!A3I'L؋' ecؕœ%ڕl y/AHm>f_ #(;zK7=rO\xi{ɹ1NK{#6eOy<](P9Lhj!=WhFr!#qjL~__D0)sRu4G'DK|; &/$mԉ~AX |H4_4YkD7"騱4ø& 6x49yR 8Tx{<$ ~5gh,m9k3jT]>2$"!lb7×%Ec0gbJ;.{=65F#Y8 4oI}M ,AW [5#Xq̉k!h"v:M:XzS 1VA W2݉Mʼ.L8 d)M?/t#JddG--0Q' u5Ǟrc2A4wzr$f!k#~9$IyVbeD\v'`4#f6yޒU'tZr1bBdzT-ݓJ(cOOXd3a!- EL9SYF0ywuxy1q8O*`V>g9B}֯-F ydžܒXDŸ]1Sz6!iPCZm%!՘6! V)#L} xإ>xp! i@nq,rI&V|;zmLL9B/^F&s0 ^.BM0ޓ8:H|Q6[})G, gƐ Ţ*:#'1Grv7xOo^/z$C,|rp.Wn$!ccS[oR9!uZ+My="3?FE#:*M'QwVKi 81ؚa0;pKU2I%sfuvhL /LIê/#~p7r91.HO+U)'hW0xqxvS,ZV sT D `vހ8ĉ1GmPەn 3 ZfXÙ7;z6\6 ِ 8UBpΌ9%l}!֜dD҉QM*?Ze ]3-ܷî9Q,Gmǁx6SXS.rC a XGrl$d/Ddʵ~Tgd~G]o1Gdw%Qsa<.2ʰJKH^Gi4gFX2$&"fD̜onqyú#ދ.8tTJ[3Gst$>+Ԓe!6 C`|=APg_@¹)Y$dc7lDeEY9paJp_7c(, cy !d*,]N{s={m5z}>[;_iYsDNF15Ɲ`cܗ:k NCRu&T!EST=Ź bc#5oo=xEd7m GH nH-ҋ \D&j뼆x}7Dh`Mx@v7~T}LȬ>$ovVz6r51-\W5o;f<gFɑA:\hETcZSCLN82$.~XR\@H䧅 Ÿ6PK'MAS\@^Xeqۤs)@6Vޚ(uhvSDGYu83a`>#YŽ ôIȼpEO jiFp@j$e^>f 2h .'y@~{ȍI f!"z'~SgrHswx%Jx7?Y J sc:.w=Y,ga>|2G! B:uA<7D$ T5G ^5UoraRPNkz>&sb9ĕWD&X HUG0R8HI1 h Q*þ~L\T㠬 (BWȖc)g(.ys XK!Eˋa܍+f=5c+D@sʛ5R#D9 qLj尮UҍJay"2B,=izM AFp~fA#yyxgQc3#ִ<9_([tI]4R``t+0F8L߈i 'wF~!>G̫;70F;'j0}X JU<sHN%TmjWM18Z\ѴoeWd&ښ2V)8 2 N rb ́V&w M{FCO,GL_B́31M([߃(qg܈R >FTTx朆1h IM*bIs{'ͪ"I$$%E%<-ӲlI&0T;gfОªRNe,|E)Iu':RJRB",RM2SvE)HQE,.%RRK)1Qu J.E))*T5I DD*=DRud%&*$4~9țHgEš汮5в\,d $yl&Dsm mߖS}] XyuHMVn+ދ:E(w3ܿе@.@a0!oH$Hd7zYEI6yI*IJ)D1\uxݓ4{˥u}-!01[|HS3jDo{?M6Ʉ>X{r=˳l^rnƦRR$T I(TBY7kM.đ8qeJ)%(W'۹4`rm dz8ϚҽĿ{p@ qF6:qLyAp  єE8x0e tIh1= LL9b(pMi!qqȶS'_:n<|=`4&N LP4iެ= #O%>BdZ9"0L',4")U%@IB&+{DÌ"He&[I d+ѺyR"fG4s(dF5Yl1V" R0Eo,)fxh^& #hIzkO"!R؞`RX/H}:X_l)%k[n 4&oywpMuYHL!b֙Ks~ڋRaOЏ% h۱fm.↎1+~:bCrbhtE g15#uMp-yv6E# $c/;'K@Nt]Tl"! **k;i#>S*7r氌7LNVd#pf.No(Z%ĭ1{AcK㹞=\a$ zޤ)Q (JTQTx(缶Y%>&s7?H,\Er㲊HSxɤXA a# Qh 9s1fQp1wOH.>fbY#B@l@E ĕ1U#:2l8bb2h(YBXe7WwLIϋBA%7x"|$+3ّS FY"osɕ&.,@B-_vZǢ|rRB:}?G:PhH.|'!_e1&Zޜ1}$(bΚ 68{4ɇFw7?@"'ѿDlH2 xڸ5 ՜G:_g>~xoOm^AI,eHdwGW^T,O.IxkmӠ[jt" KHJW TRTI6k}2k Q8G}֞o/ZHKHz]6Cby#)$)a!;n@ЛtD;=2hSe&P^VDMܒcX"gx?3=v|r#_؉l2 Z7M.[,>Oڭ'#70ro̼䚘Kvjb%lBۆpߏ(CXfEѽșۣ6mg zOyDS ÕdP@FsezU2#([=ҦR:Sf~v<§5XGP*#iXVH,"l r&r7:GvPu!"Мy<#t(4jFs:>~FJ_%]?E;$f^zԋ=7*k3r2zso<#S)bet[F_ "@O+OG6]קOǼi Q?OGaQFZn929 77i!>[!KDU2f($2Bl`Kss/zg\kII rR4@C@Ȕ1c~7&!o\5'l!m9cdMkdnx3.w;pkg |biZ{z0?ګ:8`Bl7jS8kTYIΐ\z&"7o OdlIZ#ۊWqegW[]6X2Q -ǵA<$'CM,<ĮK98HPK2bRh—]9.g1M8!f{䴮V(c8u/jtO="%@Z0H9X*HX3F9ұ_&*LLcFx+t`!:ͫZh- |MaNQ`bMq@zMP߫#cLi3]撪BBD}!<;XiE>9(p pOUTq-yfp]qd) ƭG%Hdz|W 4@j LW+?f:Do_̾6z q(udFҊD䊿$ܔmpĹ\?bϩnuZŒIo$!-fR+"Hީti{ɖS[D*(yJ^%sOXB ~$nx4IxJpo aʔbJT11LX*sEjOR#<9f@]R3\dC2MD~z`6|ղ|@>(J\:K2 {yA@\b _.k3jR+jQtg>30%Hru*<2XSotlɠ@eQ)QEdjn! A# 6 XYoϞ5jwG~O4wyT(eDs9FC%ӶЎhA8lGxi?4lGB͚Cץ' ,+p@,5Q. 3HuJ_ }bs-!)+dMDfĉ;h'chz9Hz #N7(~2cVMXMHc;]2n_!t&8_y|5PEutY-g L փ3-Д<$7PPh&\ςΩl`䏚|I#CDHO%PS Tމ $뚃"[7bY1M57@0rL'd~VИ91z3 xlȾ^罺nFTlxsa}gk=Dחy{Κ$IIBR'KdRY)?!. a &D~g/R3ʖL3$3L+ O{\Ji,^/%`)iMQEyyvg'"urt^ N}7V躘TJ)(q+VN+oWNpkvá򶛫FΠDޑe72 d>IjujTkjqtڇeoI5ӳM$F#,>dw-ϓZH*ssU徦ؚ;.ED0KBIJXXOUrY- hXNZBɴ.yNܵ&0KBY2l0Z^TTF-INdY$ROjӍ1'PlR!Gu-EA~/8 !0^ #ZA7)h5C8v-2eu !%"@ӟ: qo!!ku!Ys_K@n x?A쌒RA I 'Dgp/G s*B~5\m4z7y_AِIN?RWKcx@c\7BB[{qPeh2vwRZ6!xӍIT%lork)zonlqը4E(V>Ϲ/tOi p`teXOO:JQ/f #Y&8ɡe`υ Tn->F>"dTFy!OQБgహVAũ A>Ul S*bC,2hVlyhX tkH~@tEL.ȊZK2hї9aS0e?(/;LoIjt<=g|Z蝙y0L[$4K$yTBMi5NuO4A` {:#jp!)Q#'epJz3+sNa\aJceq.d w)#K~p΁HWbv놗2-ԇe\Ϙp˂?ѵNٻ0@ (G@}6-BA"*!CfNdt{^Fؿ9R* ,kg- qq(3;Z*>^Z5S0usuk\r(3d|L~׉K" ss_dHsz՘U9;rٛ5alI#_ ɡ1(L)%Mx9 T\;#,W*huphFв0̏e05DMgͰ\ML0請87'넁*Kf Fp39BX?e"9 k0| HjNoNP5U|A4!7XYo3D;}j'#eɳOZ;sA>.Btx ]=Ubt$O:D24]%gL{5cAp挲14@h"3X((֧0~bD`Z rw 8p&c &DfhlL)Mwƈ+')3F*#IƁH^(/J6q8ڰ2%H.g 2\ɥ45*CI?eG\FSNuM|8iLg9A= 350.{ UuW+ >Xy3ۇ>nˢҝywy]:G<9 gDX(L\وd"1x[*8&™ẗؠ!5gGQo'KqS8wIleam L;&~Ehwgn@vZ6;Eb 91 8># A pν7x1S`J, ZoyW<a .:g9C `)w9Xk+PIrqBT=wFdCߓB,W:E۲iKgBP|T5dY\~* cX^m+?.Xwm- x(e2$r2Gc"+bDߛADt-DQX AIG3! b78Q >GLבTU5C$~8B5chX|IEe$>cIl9; ?vsgݟm#lG aj@R8փ0u;Qq$(M<?R]%>twT5K]fXRLE$-Gk7 EKd6nvJ,CF~_S2ds76[QAo;WYKiޛm෰i̢]. ;3z%$Qȸ~ku 4a2gDP!62S&WÎ3Ou , ~^XeC8uPl1[sՉ3=4јwP PQc+4CxжvΩ,=wcZ5V`֜)D$#U}wndFS,qP7# N6@f*mIPT-;QRj]c$C>&2IjRDkf-8QdTF"bIH$ |Qy'|~1j'ׯ:^Wz A5vo2P6В%֋^M$Ye Ca$I;iI$%ltWyz]o)JQE)J('\ۤl%4$y=ٙnHeRE)Uly䓟 iƃinܴ󟹫BqGvG}IdAz ЁHl$qLɍnCJ& ^nDv_chq=8/Z(h7ġJl3QƋJD$֘'eѓ-"L@?| s6d3?&9|fDQsGT0Ÿd2m (jIJQ_Ae2F JuhPb͠Hq jֆpؗ$?؆8n<=W gmḻLAp@v /x|J+a`NE !}+Aї̰јEμNċ{7Fny3ƴI7]g!zPOrرґMʞn$y*&r0fpLO0B@E38Qm hod0ƴDQ`:C H{[N ZYcÙLhq9;45xOg#HvȤƘvҎdֈ#ı9Z{_M~J&,~1ރNl.53],΋:?C6@}q̕@ 8l۽'+= 3f>-֯/m`\s7D9<׵}x[uFkiwSEW,3 Q?EiFfdT-o5UT9;s-}]F"Sb H4 ?4!͏S0$'q)=n6_ņxQ*:"BXoa8w}[xXd,QEDm `郩*[OIL]2N5 Fr2~?#*MLʛ\JdR%&H&(^;,]>4I<䀶At}@`Ji 7-&۸#2>OruGxF6q9^.^`hʚ2MpIRJOqnѻ5 ]W4ͬu͛zV;dO! !,Eh{,C k [zPn qp(px, LEFn; 9X݈9ˎ q(KniVrO6F/#34 Ɛb qV Y:|d}#NÝR"K3^!L6X▛v)mPv}4O2R'$XҔg9"Mt*o-CXOW~ޓMݟm3X߽zGJJJP%J:7ooQGQ].bCyəPl3G^3 6Տd}ƽSc`ٞ, UHgԙ6^g\f7þ':l`#ֲKIE?TYeRIL"uR  T0JF H.]JT/"P=3H{)1 rR`Dn"t*Q ,$%K$%J2>CPeXEv5Hт2dT3 Y()JR)E)J)JR)L(%* !-q2668kt%;\rnN|TQ7x75^?FR4t"TIS"̆JK1TQRʔT.\M$NŊ0QXF&̒pK9kf7c$-'m]ձS]R |쿍uMәrݡ&gQ7$ "4))P Tjآ&ĩ"RLJR*m(REKEJ(TC&4FFT%HP$JRTIJEHӔ*PB &ԝo}nD}Bw{ x-=pJIE(D)Jy ma=rjIfHÐ-Gs1C+ d`؞QH S$](lj&LɞT2q>bb'!צ4IF 773%>D4u1bn!ո8(|<RLyBq9bOqO(N9H|?ntXRQr!\/, bqw$zM`>\ϓ=GV55tŋzX)Iw?Tb)Ex_?EM9 ًݎƈc7&0D¤.Wavc1)*dI8:nL)6vFP͘i2I azʋ[2` U9Lw%?'8H6/ih]di%L| }*^ǔ+׹limVv Ty=9y5H dihM\۾Vd'˭r!-qHr؃z B؈Q#D6ĨE0(m-VJ"*DEl` 8yI82becŹ&ت)%ađW7$TRPR*A'ww3n8o/ʹq.`HbqJNHR AQI GHy&T+wN!|'y4QUZh"ai n@}7b7#sXBB3mBlm_ڭѷ =KmI|BtJU oFIv(0cw駄JXF#]z*NEbu>VQc)WeX622(Er۟R+4fWe A# LqmmȚsĮV8I2 K:6gKaOdå- RDΞa&o1/G<ĉ򦮅n7m'{h)䗫F7!\h-&WX"dal'SBStjM[OcɢuN\:1R) ޖxg`w˱ti L1ZJfC7lGz3 W8 $ l`WYXBh>ǜJ1̒e`5Ea: 01|hy6$ pw73@o>BܒNu<]ѭrOHapEUb|E>֨g,ߊhobflw >go$M#mHJTtoiĕ&ڕ$ 5PfreVx9aFyDa6ŁYݓ Y~pNĔ&z@}n)cx!RHВ"Y'#|%藙 dcKrMLF`Oz඼,, kfيl!.ü\kCnIJemнۈA7oI5![N_ʙP4#HlU }0݆7բ82zf!e g'c#GL;zdL8xAR{J)BFO12pb,?BcuYy_y& m6b\ؗ $V^JM!f)3!ʟaq4# 5$:[,@N?O] Bj/96 h6["TOHu3us$n7`Dy9T.IS,yg2@u!a6F%:iK.\4vqȂb@K$<>T36ᕼ gDdؙgy (u7p"x #|04;0[L OJ)I+})"E,l*;jƅ|t}8n{{#%}KKK2 `5 ~CqaJ㳞q(J c7Fr.@Kd8fl+v23܅t/^wqlI R?VD>0hϟ,PM0biS'3`y[+WӴV-; =u*判! I0/wV w<)d'i e+% P`zl`/Q71}4%eSrd mˊKB@H^U(e0E9Li!̱3BT˄]Z z^G˝Ѻ4B|Fd8P8q:Wcw0P>s)#}:(~~v̩(v$V7(s(F"B=)VD7fAQ8w<{D顐'25`OqIb4r+|22h=T#Gg ՂJ!JR)JJHRR)K`KRR.DWI?'E i'Uc;Om0NiTiI%ĘB S R)=KPNg2n7:URDXkZػ iPTy%i3KSHnsNlQxV@v;C7Y~֣v{ȩ ## VKĿv{%Хٖq;X`Su i3X:%!ٻ ֓Ba,hQ# F"s./x/J 9NąW%vIQw~1ADq ko)P7?w1Tg0 tV$z>GQ$\I*ĒعlTR|\99E *7BqL6>uGaٯ1,=:8^3mX45auHc*L # 9FE@s 9k&L`ahxfC΃0#.UE,RW,v;ߢL8`a\N(>u b Vr=,ع1m("A b8/_8`SWD F7e,sde!1g4TtVp1IKoړSo #&nʣ7^a,LIB$2,nSg;,>}/ͭCՊ#s /TFyPjr$T`5G, gNǨU)V?Ӷ;c2zJ&#(7QD""<}RPgβ'0 GxU"g,K1zcsd3/}6y}Ip#AAg5#ew~=\ %|eL:Dv@\!cJaaVrK:*udHK٢+ K`7jy&Izc%O=d@Qch ij~MW'&ɠ1*Cq5DZ>-UDaXFt  ,d<5,B@$JX!!Y^lM62!PJα=v-q7:ȳi,.`y-hI@) XB B4OgdX=; Wȕ4BwyDѺ&̿畼T?dN5dy 4l哦%4`p?Qػ0Ո2|K5lZ8 kZ:+d"O1:@`Z]0Ґ~yLZ'kW>0I r)ź3 rxGso>CSBo9YJou3֨yws*2оC <18Nз+ȿz`'uJMl 2OLMtWGs[6!wH]Dѹ0, ȴ煞m ĩi?KE0(T jyjZ; 1d:bVp޺_$nG}VC h&f&MrRd^i##1C\lfQ<6VӄM=k\N}?z#æ EjQ0hL'}!S%j@b3HVƁY5Y5i!1db7e{7jw4O8?!j`& 3>7^E ƴae1#?R_ a^!Z>qG4Ȋ4.e 'OOfX#蛥%B́GϹ}/T L$igLvDߡ14]l ,T F|E|H-T'zT6>|&} fX 9}2F$Afaxo8>TГhFbxO+;>K/׭ qѓWu&'1ܾ=_$ DZX_ilE\2g!M14qujOA$HXtܒfdy%wH(-)jOk(䅺"]c&â&nlGóo"Yf{)Μ!j,U9bxsaoT8?!]Fb\;"ʣ0.7woE2EʜחN!K&~I '$t31c'o8IfF1F:rֿv`(k<Q")6^{I7vXo4bHRz(K;|?c'POZچr,ȓASc3{# G'*qE_uͺ쬭0#>G$Χ{w6柗<52kT;~}c5>(RGߝT0뛉ۃ5;N9b |*- أT7ߎΊPОc7y!TgƁРvNi:!^M=#6We?6CjPyMbZ6YsO+`)f#:pXg 8ixD2gU3Rpcrfe r 4.N抿|^ۚ= dYҝ+E S5|_~/IS7Ը0!ɴ .󽂢XbKxOeG~I;c1cfvb/ .L74<CVUל! $!4J@FWЉ*i}Ih!C7!}JZ}zχwm F?sO9x N- Z.4jP~(qa8'2=^$Քexl~7\.JA f8Yp2w.U1@1ɪZ&vLpH;9J]tL&H;a ^l"4 ءN/i(3 3#^-]|*ccOҠ 8~[i+ 2|OExd*b@۝O^1`F< 1|{*!:e3@sՈe Ju3."ٻBÈ^š!FOtzcHaѨ#s  z!BL坾%]IvmwiCbEkҥ?b :fጃe1FUVDI6y$.̝5 'vZR$p0 _ buJAۦsͨ;B |prGΆLA+5eǎ'XS,Mi}S1ǘx ˨?Q  QnA_:FYHP%_8MfO1haBr׈ĉژu{q>i=_N`,"a'3w0&)u8$P#{89"Nl{gԺxuZʝĜO\!&&'b,{P\=J%2KW۲RS (G1Ncr+Qi6?Ő⛒ 'Bޤ@1qo&}O{|Ȳc+q e>G|N.Cax !2 Q&$@ GfQ;ʵ_eN1NEs7>ħY6ƞGD?1fV P򒚎!ro#б1b)곯(Ixa UKc$NY G 4;SI33%/lE0zDOcn=[buE:F"Ao`I?ziyztrγz.@HfpH3D?q09\LOh2>m̃FୌT'l ic\Kb CtP( I[Nb^o?fпCU=C,.M4yPH+͍5cL?xfd>QDI F"(o:)\pyLEY?7p׿2[.7p˅R4d7rÌE5- 9LtL6̥ȸ=erXwmL5.a9 yrZ^ U."[( wOL0_>bE珙ot/RCQMy j/NxL@,uHzrŒ,- Cip_/`)m-ٌ8|Yn`Z0f~`Z;xT/It$ss>/:Bq, !:LC 43.;jfa( +G2&}iO rB"fC 4oPt:R R ?D#jg]ٟȑݚCgo `y$8ΰ> 2p_FxS4^\ ]0N芿}}ENU5LUȇ:!|~.6b7$g{.0@> `_<. 7z+f0P&z?'0vE(rXaaѓTK~!'֔q\@c>1N.}0죤$AXoixJ}TY%!=Evz=">y$%7bc4wR/8B=Y BK9B{njxfcK{J>x`8(I%ѥ<|/<\c wKLCt'qd kqҔ否奢$7vgl[6?1aCCAɡ (& 76#>!-:[z\w|i?!TGJjtG}#"g8BlcD}]B@9ӤIĶ;SZ) 3$0U4 ^noaй`E!!siFI0@7>:xożHSi`/ɕ0xpWJw5OY\'J9Ff9L<'"ΝV"L=|p RR: NC* S5%h܍h<Ic[i%G-@βj[ Hu/J bTHTEGVy9&`!Q!ǓQ1<&&o@A>_b`('\C:ߨ3xz* n%|G3r1H/?GLn|;t^٢UKӔcEV0-gTflo V e6\ #Tpo3iCt"Hn$>#? %)? y?{UPaDgxٛݿ|iOiX'eqԴD!5ʕaf7idpu'M `_Kv0\~3_-v,!,zM b^KΉ;,a&Q2yG h#gj\' W||s8G#TIܥJ־*>śn纍!Glm}f(Xo;s}([!?=×@dz nHߗ^C+n͙I9by[C4UӥjUHJ6e o\b7HxLF8S&@JN&0B^\7FG"Jab2~#Hp#-En8#NbwCğT ٻ $>J^R1[!wB< -{_A+jŌ sP4HV#dI~(r2D|v sHicŵWﲺ1ˍXVY `׍)uKz^p\5l:lXҊ7ӊ$!/oC 8(n, I8O;Pzp1ER|k I[>U[BL8$)Zoi( bKnF(r 55x|3BC+Ff`hb F2ZHdW;ŃTy& 1#Dv%bV& clA.'9<{GfxwhG^01$.j@qXT#GtBly?9QazxL(l[L!8 % Ł5 ґFdXg ^p$չ+yHHC0n5~ }v YH)EItxf}")a- h9ѕzXcqjGd&gi㳙2UD|GpT,5yBA#`t[ x#iƗ.`@7>>q} 4 'LX;xn(2<2E ! ^=l咘L9LO\[<`vEZ3*4)æv(F2vs3?9Ħ5ῆN@L)- œGlad(w|5A#Ak),̙q{`+>6vq }>haSRrC%A0cgIgĐP?;{|&MNG#D6o W2^]] r=cbԬ%=Z26A FH4čĀ* U*Ű΍~O2t Z͐<O/*)$cҘҀT8aC)SRr?c}ʩ}?jc0b;Wd;BRL~G2Gy~#Թ?᷽'g=9I@1wq 9/ d[4`vHB5I~;&m:CqVGrM,|>mcA{,5f? u1aZRea8GPv*'[a93jn0fϻm8T?M§-C,&>F1Ū<(ȵ1_Yf n&Cۍ9\UCSd;aqq8bФbI¥|2dV'f_ :rp8rK3 ח.#ck)DzC.RЬw~[ՌzQQ-͙ sk"=8Jy oq1"\8$aA*}Q2XDKALELZ +A0PVj' K4yٗY)Krppbfp[[M4i9Fm7>iCFccs1M/Pvo& I%±:eZj%j{@"%H$oPʟZ˻ ΀}W!0<rLt/bZ||Ւ RI=MM.lZ I#M 3ц:Hw!ij1R- 6HE>Aɠo7fk{\ ]'+AcgĖNJ2CÏZFE*] :l>C1MhÞ*<ݱ I͐f|!wE.qhw> re~ʙї-}Z젿{U)&72J2qu2.X?&" 2 )JBW.Uq&•)~BA"}qe' Ё<ڸK!@nMA߈;/gG5;@4Nڼ'{%YU_Īfa>{o*Y* $;rʲc"&!c4e{{Rz?I[]#q8F5>1dmDvgqNԮ0K6dM͟E v/| EDT ?ߪXK?;ʶ %h")BhA|Qz-k6v1QPҝ] ;Ee7&0H+-+NX(m31 !D7~MP*8Xq\}( t`HXB@z^L.#/Cڎv(qnn=ɞ:E9KoFLAs8 1\<\e7hxATmcx̆umc58bOPd7ivԍ)yu[D1Ȅy?+K-*Ş穈b4/fuopX#GBpv늃!nɕ fK$,lEcM [NOGN0!Mt)t+G%Y^s!ł?BT{؞bHkH1c?%@_),e&ÇMV #>i=U<$:/yV͛V#0vuy1'ρXGڒLQ +QaeP<:ɗ;jFe5ՊICǐ@b4.L{$X2C) 's0&ɨJI";צ@:fh$sZ9js}A(+wT f{Β#okkxLKb3@dTO?a.&u3V dS5?`D[tAd1?Fɗw:hiͲ#\3Z % `Y:'0`LbbŲ@nuظg ߾ۚ.T Fr{1f'Gs$OD>䘠AY4S(o:7Q4&fy\ џ/GS$TȗZ`L||<Y A]Yi7_&~FAӕZA'C &0rI7`1U&IVV1`7gn@V(ylumsrILGt.S i!`|0Biz!"|cDHf#LyP@ $fD J:߯mxg=M "i[v-g::ɆM67㼯M/(Mr3=v )iI9'Dz مRWRM7D Pb7Gz܊;cftE}t"hrHVmW%JIO zhp0I4a4.oL!>"`$=9 QC\7hsZ UUs\\6k}A5 ߆ 9'p/i;}kj©Nx 5.aQ6Q4*z1}C  拯8&aF.pC#zd>a=z#s^bF_m# )y(l)8C+҈eP-cԲ:E؞bbA| Ӕ*5gļ:FT^N&`%lm:t"M()@pU3Gn^;(!\V:즅3WU8F]W0T?hP7C;GmLADr]=>D_,*߳N@f\8E /3zrA4fY^:a62PzR!FaŎu>1H W<̩|1fbE,~`P#(8Q@_ʳ 5 &7sM1`'uNlG,P`) ;yT5@ֵ*j~8hLBx/͚!Ss]7d1hF.4?fR#\ '1 aUA.Myi=nLeG{i8Dt@ z`5`$9eă.8 B*~ a΁iVhLrlY%F Ѧg^3AF,h'0OcuOhjpID<S٬ZQu^5DX+gA;KXͰ)M++ 1"4,29(0(V{u'ѕw%3ϧz}#-{a ~[>'@OUҳZ9Jr4;sAI)qH3{b45=!S%_)Ax:0 G1 CbT#j1 pf9r&5K29z=XYRght9>-ZAeCHؠTijEtxQo"=W+ޥ.Y4O$b?é#vTF,0"Q?gk1`H(D)-඙-ɜxԾM0Uyo5 oZ$Zt.<_:'o';b @eAFZO D24ݲH4z*LaGf!3 #A_9 v]q 8\C7>F%n(Q ؐ}DŽg5 "cRb)%F!W,"EZRp1X|2☃g'F7%>2 D1d㓽H cFj$(MMح2r;(yH۠;ƧyD+& E^v:Rq"k39gL/ʤ^:;#+/< #SW FRٙ I3 މơ>"P?NҊyF?yD͖TOSQGt@4yDH:ۼ Y$u9{7UGU4;2]>"H&w'NxJ8]hF,cysalԉgfDuCyM<>'\5a8&e)vrŀLwΕN_$F"d`XGH}?keOs{=$,_ygzS&Vq{׊7j-vȓ,R2!s猳z:)9ǪH]Hzm~b"ddsV!ʙ|[&Dam-}(a pp,2&OBc&tu5ѐR䟑,c\3ʽ$Oqc_y[AlrRCJȈk#, (| +0"o-'8o>[eaDC:< Q ?DBaN̶^[F\ BpN0`LGhE$X5/wP^;8j7vr%"æX}&n!]+#-g ohM9ŏӸ;n7ݝlEW9V.Y#y[O7>K 9e|z+YQg$4e_%R%. ZipҐp aƶ8s(Y :bJ1l C6(?] [#~}EȃxjKUc`XvfNDl~J󯄘&C>7}OI;!jg  R8$ tPP8Xc^7D~=4p@A5O9A\mD @܌Z(PL&tў\["7D)w=-$fnH+5j6|C)L,JX7y؋?9Tpi*K\.1?%hihN`˳'#38t6],V;&Sb*=p dٮѫ,BȃQd̳pqJ:T Ƴ2/B`3!S4PL(`tIa'y8dd8?bLyBPI4ЕxDX yOJz.Yٔ:a1\)fa#d'տ_ߌ$vcHQ<_lFIf`P ШRGoLxF1?4;hD2gث4ZN CC$fnT$).rz"; {0ֻq|\1оC/EV :HLǩ~T8d0贎<#|:7D ?0?]|5{f1M(N8N"d2qs 9:*;a@F/& u NKy#pY0Pɔь L@ 1A5%()ϥxKsL rđႌM0F;Cڼ !QT1R?(*Dx`[x*FO}zHlE. m I]M-m<Qƴ}ꍵv(DQzGl%x6Χ.?lїì1,zgayshO>n!5JF&:)[mmJtE;T9nh\Jn# kٰ8&WNQlx!|w;9~ !TR;hssR}1XSu=#ØAtg^5G(\lTEyYꙡraMϕ$+dOAp4ØrBWE10Pf:Tf=cH!h8qQޯ?:nMLgGM(3puGJ@t yGqܑ[ܑ2 y-nr5 EN  6Pz-?"brDvQSXI4yznMej'иu~!KPqb๹{ vfcxhhO-.FAPE,?]qmV3(_LԿd7~R ACP\hN>8K6,3ƿ +yD3חߗ\":bc4$,i&x3;Rz"a\ʒdHeX]PŲnX UF)5c̼6hh+/)בS:bsA̦vCc7g`Yk˲{Jղx0Y7f/JjrƧ]$M]i̢dݝ0 ").D#BLsTO0voq5kúrՋ"ǚC6y\N~,%tj=!]ؒyY $!N<'rlsO65nY/!2k%_@clf#D{9A˥HiHd*JɝqB_ƛ+sX>%.Ӯ0\>@gIaxI$FrJ}<"3$.΄v0ξ}? ,? N?BOIo +9bqزPMZ4귾}bgn&',/2|΀AVCsaz'lA* | SF>1<٠;ZT"w Z6w%u6I5H+D0B =[YDtjW@dWD G,dF1 IVp|$bD"TRbgT$ ;tIJ+HFp|i@r8I*y&R3dv$ik,2A@.Q'Th.B_3rі1qG\TNt(39kvR\M wB2 C\gwZ+ϙ̚I2)" fR-viA¢X &8jQos Р&{1fLOc)Ǝ?HK(~AhJIDEQ!+"ԕ_Q<j6&i0s%R0ou3"WEƋ"ƚ'}jbVݘin<񜝸c4E4 xS@|߅CbH}jzL cũb|/ $,ً倝|2u#xQp͙j-?3P$] |z7GANɻrz6Br뛲RQ{Զ>|q~#%&e/dwM5b}hQNyފGvJJۼVгӨ/㯧F\`i:~mSB Z|C:-}To(x4D-8 [ZF1t_IA 1;f:42V<LpN6b!y+ ,~%!sqLF.m 9W'\/>~U,y m4or@[3X[Tr#LBCnA@>!J&xED|R Tz5ŘVcI8r)`~$K%0(cyNЈJWGM2NB "X$~GI<3┥Tqh$Af6yDh)<cPv;JQka%Q8 Ӈ8&KRsL1g9O~vG "Hu^]OZƤc@y! vHu#?&/_xc"lhlbdlhG8Bx'#@x̉o  bNމxF:7]L@|mRI@Zc}5&x—U{,m9C1;B!cLXhf\$j8 ->O[~JcnOb6F2gN%$TeDYpyDAɚ2[\քaIR4b/~ٷ=DܥD;*9Aٞ.cqdd'2D$9*wc 24׏dĸ ~4b0ከ|v Kٸ6$_Hôd~a3.dج'i\2Wd,ToyN7lb=/(ٗb)$h0R'"4D |A\0Yl$l܉+w mH(%}ʯz("42tRGbbaJǭ6M1*HY5'>[BB/`b9kD/zBñ'M'-Y4)2oD2nC]etFvd:LnC[f{dHfP+yNs'GK3< a.]ُ R(uTelȥeFLU.%2c "vưHWBtѶNiA&=&0a%&μ; ~ >y" %D7U|m&S. NfU ?&o5.fKwEㇰ۔7AE"֗9(`3XV.ʡh5G$<2cwL)4cq:hy&Ԋ׈ [Sn"U+4=zpvws);YC"9p2#XV!/:<5Q믔$%gamz< R$Q!拤pp#N@$8Ԡ'W̡7xPUG3r7'WQ1X;yI Xb2‰py49`u<bN!U8r:8pJJ#!I?y|t.1LxDB B̊MΈICmn3GRE']1]io#W췝)e%8#jo T֎Fht™;L5Ey[Hd"{-#>&èG n* 'Pʋ!U?DW%٤?lGN)"žۋMNY3zBCdæGP {L>tuF S0>V Jb_SLS$a'jŴ Vژ3A3HgN#©' Gibl'5^nI(.s +/K8 WfNhw* :lt wG:}%y)I":Q߇9+齘KU5)8`RJE"8cKԹp"5DQNdIRqC4ʄ8o b)q7-ؐ"j3;4~Ш9)&,T*LqwWQ_GݱO uxqQYFx $8hāv,Y8@* 2n8GI3=&K tJE9&)ijP&-elh7~/VpB2\ֱ`2IB"?؈1D0=B'љ3&X3ppLn?ˆ©wmLY#'y"lċЙ'{^_ġQU(\͍6;jsb0*(eP4w%RtŰ`~Tת2N6v'đw#?fCb2˷F/b=ĉ1fvr5Vb%ma_u0;g㠚`B D@"ԷFϒ2*#y{_3qG4ESd1lNZ<_4?:%7&]FoZDFbRI~wl7eC6ø`M :I;Lla 9[5zE0 7ׁꈷQgs3hfIJcv\+ ᇍ{?sc@Bik_|a+DZa&+ (GfP|6_+kR}i>!t-!~>pinLb_͛c^(薾v #teMM/F;!+VMvHy*k vyۧaqPh6BLe16Giu8C:pv -|5G~ᝳ d3ր`m*756@v5BA3FdttKnM?_&Ad.R}$vP;ׁ+QlA{4sfOZcyN>b |E\JyasvC^4 :*M~*)̯582j䁡_·hՓt*Í?x/ٮ^BId]Hkq75a u\GL$3DEXlof_sO/$e \K0,cTA<5ZM)MEѝKb#doТ, @MA<*QaV:*fdL&6e kNt"}OFX׋dEV("A*9UN_Wјh>)2#KΞHQ--Ĺ$#s5WzgJ_ :")'FQoB o' !k~d% !5Yjw6>Q֜zF)8_xEHeC{Ǚ{hry?[Aa > Y_OBd6$vl+qQta(qӂK & oVD,'bLQM.Āwd2tܜr#I2IC;6Kάל~3s %;iH+2}g`PKjO?žXaU{+AîM3U6e1fxCC S1ޡ(I `z"tt?oA3Nx1#4B (h LHoT3vO>0LK}i𪗳X)ƅ Y̢.7s'0IC{[:5yٝPK3S3D=VFSϜAag G(blw~@W4+ &tKReeiG!P Zb&\%$ᨲ4"/%sdٮYgJ8O{d| T%n3\=%)Bb@;-Fb+mEB Hf&\,P|SOEe9uIOhR I:"Dh.ZI0gWwϙh~pKpF(}%UIq!V* ۪_L_1jdИ!8sF;8eE_p)-۶Q } n<4y/8`1,y'>O&MGΞ U^M KP_dÏ'Q, g?b1,vsQL]" ȼHr"B<ޝ?Rla!P2B7e]k?FȄɜcyפ׊GX?r:&Ure-4h\2O *+3?'^4o)!`z8S7̛2s eq0 -  DqJ1O7P;1eSHP{wBY 7wCN=I!o?"F뙖0 4PpPsQ7سc9mX3qoC)naoIlOybe]S=/Y-Η<8R= $*?śvr:2fu$ 9"*,+1s.BqNI2c?8I|ɔ! eX i9`/8&e69"IȜ%V3ວ){ڞ ?IZ!.j;[4%@jSZA%fћ(-LRpV/F و|Ȋg~ Ac7 k7$!3),{S/oƈUP "3! gt9 }-X%NQ@CTHz)J#~Js i2Æv$a(qRvbp4WzC LB9Ժ]ޑ(u}ч9qN"` /)jt UɸNH4ىĴy?oa]qCJfFs\6c#hoʊc`P?zCK\e]#,ji2q׉u0bM>#[BpM,!s8¯'Q0q:ȇB"_p%R"ŏPRG{`Q,lFMB-z`΅aTpq,m!,8t 1%^ HrNY!J>83M\L)%SC}D6F {pzTqFlyDQ E ؏5!HB\fsy*"A+XX]4!ܞN$i^xF] hwQ`3y7QcST¹Lj ?xmϜJ@쵂_59wǞ2ʩ̝Mß3jDJ4|-eb/(,CLGB_Pt'6B\81QL;&M @SUG;Ȝd9 ]9!%XVYr/xz,JH s,v Oӊ8ą!4Lj$Ja<.$y+/Dq/E5b& tž:Yc]vV*g/&lK+91S鮵ǟ͒zmY~8钑DeY?c_R$ApTVyq!(XN)"l6@޾ '4YܐxQIp.bcy?l=B5Hϑ~c*`|Ll,oc$P^;vC)c1r$Ł,S9GzJ"c#t3u;HZ $Jbæ( b3`Jzts#Y1]rLP֌X=~m)m/^a?6Ȣh9Ax9! km4ȂdL.`G)cDU@832om.QD4hD={'W]+/܏J-@ E^~LCi-m^Fw9,!N0(#>! nZx#x#W u&lkbL_ mWp2Q_4BP{L,wE  kpt:!TW8_sp/ٚ_HBQr-JKRYvU2 M.!3㗄y|t=YNt_~bU:#BdGZ_!=F<L2{6x-6JF&+ !>-Q&:s1CGFDFSBg#({PTԘ6k)zp.>ryJ#&I'N<΋G٧\:ǡe? yL`z1BGYq@BK0e!8fҏE^#2zL1ٛZ=j]4t~ǠY7hңg$`"͡K d{(u)FXQ zSuQ-7$[-1}1t΃E$cL}M~JKHP"6(U]J0i yXy$72@qR^ 9$.><ΉNsHQoy@*0rNqB{RfٞXVѪ,ӹ;C gW I71|3c(n~a.Pi +~7h!i:&QǮG9X'OnLO B j/ bQlpD=p]8;)P!Xqw}"._HcpH=[pXV|n@@#,Yͤ0LmЧ1Qh,^X46ӟj2{{̍L5򛘑(m0#bؾAD;|״YRwu0X8`k}xEMډawhSxe0{Ǒ-C1Y-πO!iL8w@~#E;B0Mp&r>~!B,8$>P/9: |n :nIIw3yjr$igoĔI'ǝ1Չ&nLbAHS0+dľi;˜M{;^1y0=,^j"LENϞA (A99X]o )gB.]1AxK,? Ɛ[A v F[.f0L#tHQ,cvt%ɋ((rN&x:/۝,<7Ex2Zӽ)ciU1*q~Lxmc `&LˆUb=D|;NgzS񖂉Yb] 3I2Ff2w벼C&-#mн ]fl}X)/p^ɓ*Vc, ]cr{ }[K0Bdi:dVKސq9O& 18/tb9%KkV{:,C^؈E%u`Q 9<i+SLvT&S^3ob6*yqCvbz?{vς1COg D ,rqqN ṉ@D!P`- )# y8$LlpRپ)Y/T i;BFs7+z'rF9}&o &m__8c0/vwZ.|#T-:ΐ\ˋ!*gzq9#qCRi0b{PtFi]aq P~xߓ!n MڮPM42hT!41SP[ UN)+E=`Δ~圫1EwuXY4L(x~J"˦Um!c".Zr،,Y<ȎuEr!ч$rOc :0cʁWƳ"~fD᷁92{'WDa'Њh3qj0%iabYtP3+1<8U t/BePM"?hzRxwC?7$V]IiEѕ(bo6,Uf&0|"(R(a@r/w(HY^ZR>@VI2aϘ?Ƿ!߇cS#GX' 'a$>)a@|>y ܉ݎ3bBe,֚ذ8LxśP@."/@P%y,*ldb(m.^TE"Yb0jl͑K-Z:f1>?Gēi}bLve-t \۷F1E_Q ն`Z)뱏DYJs2[_A8siS֒|s?V>K"4|Fc& JJN뱰mDq =]0ks V>(gHIcƕ@K<6>'XD'e Ǘ+5/k=I8Jos|mB!qG* ێ}S2ѲrPB)9vOp4)zዒ3nNEYYxn^|0g0J$;89_MN;(ײ@0"X{%?D-ѓԕIc 8E!%ľH˲Mp5E1\H P/MO[DC/̉WnHYчbA\1o>-Qxܑki^|s>gHi!Dg!NxeĄTkn9ں(@Bf)"Q@l6ݻT=.u>T?^p@*<}ޑ]OnoD˽Fe#& Q_:D>>$Rs_$;Ee124j1f SHcf`K}(;ȶ,d1]"U1$/$eE Hf(B=dQ6t5en]NG@<DK "Ȓ'`G%jb+8Ɨbuќq8Bѭu=HCHz\x|HBzY4K%1~ۈ@VwуA6İLE i^UΒ1Sƛjb]ē3R}?c;1Ei.,OHXӤ*A+K‚lY! qt%dLIEaL~k3HSa za Q<Ù<7BP "ё%h]::6kO(( 2cDQ&:g#m3q'-i F,HѬď($`t̛TPSž/WǴκ0BxN8̝GuƌqFg jaTѝ' *[)8k>Y?Ale:bush( Yfmbx4r_^~ZL ?>ؚ83: ="C"p| G4eiH: \gf}O)¾H.S?楁cM}G̽a @rL.Iݝ% !7;%!ӹ[/{^dz+ Z\S԰hr6Y^B[k)1q( o[vq{6cL$L;I_j"8lq5LFPXq e,qˑx1e!E?F ^c+޴7^$WG˄sEMӛ=wO/g?8?+~lr|KֲiOS5cvQCɛ:;V~C$O}UU]_[08 O;(6eApd$rnkXUOT&lJ$ F4+ODY a4YgIiw<.g[BL%2C_*E>.$4vcБ(Ƣ,&jaX^dzG!>qMjF03bJ,~r ۍgl1܉tiӹv5~L g]0C | |]͈PCwTDJ:qd0_aC@/m12' zȳ\ZSLX΋UB?vϐGPhbI~tHk0VLq>P.<,D&"TQ* 8HbG#4qL y<=2 =VɗEH"?ږ7]S+W1\5MٝzQr r|1N1 JϦ%i!.RHEMS$Cv 8YWrC ;)Ң G@D=:"^4\+ ג 7WR+TvIc2D|Cu v0'Bp}z{OI%0uB$8LI?IVAT %A.GGr[⪊!bz8a=o/,nHy3>{GdBV ȝKA kY 9q#@$=j>:jgRwz 2|D>&P$LCkOx6HdXM1ˉ+Al^_Ǚ[b9~1>@}XϖdBUCN +d%≌5(TA>$So,}{:1xM3̖D,Rbp#֌&=Hk7[Bѷ ,3%t&$F7Ɩ9O CQ y;:yká4@u+?Q\3aLG8AnNd=f ݎfY R(cD D 2|b8ZRGo6f<朣 cTsQLw=?cr? ]$/:྽ @Qr Fyr%J.]?DY[)71;E D0e9k qq3N;5mRH ْš ?ɳHYDHz :18~קĆ\zrCvmK9>xS!}]wg~lg4˛D^$E3%3@]wt GQM $!/0$`_+ұYGn/ C6L'\nn1shΝ]bP`NEу@_kR_; UԞpRb fE#O³ƽelB 9rV'>2w 1WbR^JjE v`| 7)Rzr2>v`>d4J!M @>CH#jH#ς7 %6BA_4[㗴)hTL5DdE>[rd^m&rψ6ct9d~ɯ)ÿıgcГ)udH ) Z풱͕#)( [?*Q,v -̲x(q"c8s>1Z5ЦNe91h4͐ƸbYSb^My-GXD ?PoaBƬ?F,AXY~ X&QL#͋$N1jMy>m|?K֏xK [;U+eV/Ǎ1ӮBBA!wk9差DC)͋.\D6Bxj(k/ P^HN^% o*w <~nЍPçh =|v >  L&3gU$*cT(cO[2ψ⫱KqF;6zYr<6N[1|oZHPܘ+[qL9OfK BiX,׍6%oN/DCHUkF_(2{a)4t;4ncxѓMF-pO7khv9d͕ 'W sTQx01$!(e-4 1q%a~FJiyj!IZNbDPu=9v~Du.a-BO !Xpsʥܼmк2y}dyKpR(q,Dzӫzđ5<˛[@Nv素9%Ŀkؾ{D=xO]Nͫ 8y|oHs( NBfR6Q8.SPxgz(zX./-T??ҶHx4^ñ1dL 3B}# &AY.ghcH?0B9E=.,:3~_=&!܅"ڮӽL!8#c~ C۬ȞXTU# x͜Йt9Y}T/3+0<\dQ"GCp`K{%2آ‚q15Ԙtl,Hh N.PD {bop|h 3Ò0{&^ӛ'V/Į.QYncӄ #Rmlh;A(O\Udc e@;9%XǴ#}Ľ< f* NA 9\Tp[0!x >xu'ad9ěe9to %AF5㯜}3[Ytݨi8E?.:*X F.~CFlv\k%*0CdEҕ.sO|1V:x B5!^9r)B&Ϙ7j 4VK'66 Lp;UAߔzW܁VErHH9Z['r)#,F0f =.<6fAϝ4D464q!#Bs_aX&DvDS30kXN^LEL HcP3A b;HxA zqNэKf@hux#\;1G120_BcfIx;dJ2%YLY(sz2X?)]c0 !=Fz# F&0l1پ3ߢ WufL]ם;#@&d(CR% _ZW)PX^,i$uiUsB ǴŢ eO+GjL:0o'傄ѕo9|)BKHhCc.s /%tt4PZ:$!棌w(IwC|^o7Xz ٹI`ʦzZLFR0PJ&@mx@1#"x۫Hs>RW/fKhef4EljcGQAMɄbχE;%3qJ/1Xŕ)?P>A$Ҥ[ mT$;2θvKKTE{?=)gx,pb" '"|=#>&=Głԁ?Q@)]mKbQIqNjJ9[DMW| "FJ0b Կ2W2B89)A+|1A6J99&LP-y1X=iV>=N!a[2d} Xc3X$ArF2x8&YC QfHl"Ql*k CX(RȋN={cLPS$9%\_6cEg8qܟj'U|$ 򁸷p@~nE?>mGkWVțzq͋{uqmL(¹~ !tEzH<sfo~g|I2>_ !֭Pu"D0(:9C9c+27ͰJ(Z`Rc.u1kWnJjB?u=Rm+Ӹe'H6[ >=2J1špgLh4 YC(tEͱR%g,y֘7D* dYx~(l9 "e;.,g(LM@2[>#L7dnV?/A|4G]$VZ1 peE XOer 0LWeI4z]RJ^k\;ku+o;Uk nLƘI!UP4~/X;͇;YKC;f0q\I(Mp-X*_č33S^yK_'7E௝3Di1B7*z'3o:PC$X5\ӜA>zW9$+(&[JE"O}u*Sy4*9.rmS5ϳ >Lj4zQ2fvްd:ʔT9aMOiǂjm .vduV&4!JmR!!#{ϼ?KFPGAQ* |r hSl/(/0bw {</F`dԦ9dTB Y";ಪ4l;WXC+Qo>ޡ?̑=4\2bCoz1XpZK!J8~=Z":GfXq UEm\ǜs, u^}eyLc̓=>xJ-M<ЉB>e|7$%(2 8[ e*̦-`hH%v8{VM@cGVꊞxp) C 1gHd̔K+ysQqcg|p]=&2FPG])ܤhhA /s6A},'Q+-(oM2_Z}jB>LްTIK. W aM%UZzEP/*`gҚ2(1cq&9BY+r|`/Gч>z5o,? wc1ZE7OSvKA*bOR8X唊t 扄E֏毱a^XB[E*3xG=- sT`'K Kiak22cl]xJA~昛ؾSrd{rJ- ԏ$lql8R'F_;_4VQúf!3TC_ōM(~hK;=)S}]v3ÄܣVR&E=X Md n F>T1MP'D Li3PvmU[z4%GNu*9OGm#8(aZC @(w ÇH4LxDgrJ(#e<a/Ӊd$j_?.<#:NHjFQ5|pD;/ڼ>o;?}0H7tEz%Bb[e,dGBDB4clFwc-9YUd; Tpŭ5th\ ے3T"QF$/|L Bar^-Q4n;8B0 KQmhfl c- ?Ja&(sW目_!0 Ѣ޺f\ѐ-=L"8jHVMT^T*55ZIf7y$-Q%a-Gqx/̀%|ь=G(@/t [6 BQ2!7?]H%ni {KYnjQAdИa䏞ʹHVɓa*t 1x*#iwNu%3{Ef4t*9g;,k?5BI.Y<{<{h"ShHԈ8l1eQvj~=r8#e1-AvS)17h c8%c •-lpG(/|ߑx'ؐRX<x Ü{hn.s XYs(|CbrG9kA[M>C)ΕMfUxN !7$`'(>P陯1djX=RMJ{"0"Vլ&]Mo`YH[k5]PLs$ .WrH 4WgVC\AV81DQCTxH^UXl(cCO4`4HFZuIcgEB+iMp7 O0(TⰒ5AS3S.-|C&T˘[,wt/_2yiHlŬ~ @7SLD"w"ii r1A͆0D3->r|cɓ@~ hB2KRUmsA!5OH%#\p؄@LL<ڛiyFぼM3C/.@|a,H&]Ef QUOgLNB͹ !LQ2n零(rSvs`&aP$K>6&NwCyR&?2m]5C8}wR`Z^Iv-#hX`-T G-tLble)@ i\ALt#"> ?GRD#Wh10OF0v)GN!ΩI8q+çC@JE 8?I0Tn! i10%V?$>5-e@- G(Ytqc# fkpQ5Jd cOLӘm_1{ b9A Ix0P4NRzӋ'Kuk2(|vO<ծ,I^I0}]{hȞܰIhNoTiEi\ep6oF?#4f4o]Pɨύn{v49Ue i ,-)ેQK VX[kCb_ǬbP? s<=[(կPHQ^ۥu|DTßkjesXGOrM"vy2hvH10&t]=V7@ Cc9S0}\3c |Uˣ3'xʴ+þ'Q"C22S`(hqw6u .D0` V4q?.ăE@c+6AυXvr"Il !+gHG"}PHQߘ<׼N(#:F’䈒{>bJA*P킁/sG4d sK m汋4U4NλA:2pBڥNr4iY' d${fE lxa 򒬭&'5Qt8戓x>՟+qE<5[cP2F +$Ǯ4Ge .PRm8aq]4D0Sba$_ezd/gZmH`&ZB[!֨X!SqdR=)KXf;TktD܈?P oi~Raqgv{bG佼Sܚ/LZ^R}߸8x#I* 7B܋/B}ibZ ?CR)\#D/Ѱ+|=$H")0<<2(bY! A}X[J3v3hAP2S}H1ҫ)4HOH-:~edQyZ] F9w'ʃ,$vB.eQsj9:pD 8w-ASp&,j!G=]ɔ,i=y:R!IЗ1+H 76\][P\fӾl#=Yd2ɦ\|M*)  TUOI!ӹj-bd97^fnLq6m?,sF&} %,G\kBX]=5ʾ<$ [Qy_.G_n/BpRpZ3'[!^!fgs*Es_d&D~92jGe\D|玊I;CQ&'IⰉ2/)ڈfሉܱyCuc; \КXx m{ލ! & gVb4B8zZA;!c.nѳ6tD`FFU#j\ r\n'PBy 1-4&wy dӸӴ {U&:<6GGD||֙(E9:>FR v# Yjbks87#u<1ST~Ȝ\ 's8@E$Cƥ&Iy<`C莧f(R=Vٳe.\`+ P$1hy\jr 5ZB3e=!͎H^I.B^6#gC@+AmR$HT>cW2'dz[VXsFC=\xg_SjÿV6rm y)#ě:'ŋ)'%XVGw_xṱl b AHl=A`Iaø(&ҐҮe6Jj@|呧o5{=%򔸸'@8(G5O9nFoO?FA\6}L;+Yeh#xּXRghXR-C 'ސnxC9k;rχҊCZ}X BQԡCv4F6 $M`K'24b.3YI.jlW,'/j"Q%Nu 3Ġt-c` y/AS=UDNmdf4<רGT[\VuIzN5@qe}$I],os$f2^̐@l` אpVV]ltn0v YW0z N0zf|"Q:( xo9m~,ibK5fJ"ئ|YWQ(5hRbY=8QyGL8"ܓvI P "H0I5lN ApepR ='dd?dr^@2a%(8Em/Svsl[$@Q8e7]qWV;|H  ʼn0'O[(v(SΕho 9Q !+r%4ރH(TFL`3 ` ?Cpnyk&HJަRLW>'0> ~xc}\Es dfIBD2|&MY,!s|_UH@aY !aiڄwYTwŏ{즇m.^J)0FJFH9M''H%?M1lw2cN@qp ǰT\)",&uфqG  zx B`|[ 7$TGA0w2DN{D6 6Q҇AR"HL-ĴZ` @'9"\[.D}O(?&Hcvf!Q@Hœ5aӾ[H{QEeAD"LLGʓlP)QGbp %%bמ$ۊxW$DŽ!,&C3lm_>uOFenWS8ɸjhG<ŽPĥK\2M$uOaGC@q`!%|L{G "s *>=A>ApCROQZV8uG=sOH➎z3pb:9{<؝nNK2(פHL "St˃8kfYȓFas:3.ک´@:lN]Q < H&$Mj>Xy򡤭N 1 E5!>D${P!_Q=!6P7nG aQ/"ya Q,ͅ4\9ZȢF@U`8Mf_Q;SMŸym.>@dqa|)ıGD+S>UZ{!Ȱd2+l͝q;x DD 8Ko5*4~~:O[ Uf&ȖT9ր̈Q角s0qHdU+B!  P(ɂ#_6 uٌɆJ"% :f)㜍uy.e349E ?Wxvmn5IO50te7f-4i* uPJO;=Mt9'tP(v-uLqd1!>9wD( Je"IWqOkԘt 7  zHE$6R;X"/U#(C_o52@F"Gp5*Ni{pRDπfe;D"٣<ΉD5V*TΣE$x_$3U?*..L89" y k*9̡!ʷ&C.~R)NN+ gJLE ,g$iZ9fgx X|Q4&b@6$VQV.+S%$I&{.8#A(-ؒ;銆ʙd9&Wj\Uc̠)g+!Lg4̘,.ȎXFo^t8{Μí0*q$Ŝucq̈́xPn{],~POdm` mԵgνq%K (>Py- Â]Xf@ΐbB }ChuIa_)u3"Zir?# FDy,?{8藞hxTT^ ,N څ7I)4A&]qpeB@#t0 |z&"I`D۽ʼn&=URHXc&=Ћ8ϣ2Ms2cMx\lc*>B4¨:|xlcH16mTo!ܠ nfz>˘DIA g\iq,,Fqц$g?)F%H:bM.,+ Zl˄~A O6~m6q=/ҹ4J!a9q8* {LBR*xE +,dO-T׼0,N6IWһ#Ny$y7wD)F١50>< zU(cTcUU9(Ԑ,' x7v") h'EACjZ8!Dс&g0-IqDz<$9Fkyr]ZStpoD3ՑJ>efcl؛ ~A:o}f&~c/GB(c@2gXX-CXY'f O fDRtjUUŤdm7hp39+)θfk8sAxEDDE(0ast\⇦;-0PGfPRbdgjY9f(S3r1`2rLҠ4 Mn2ؚ,!ȣc2hUW\~\+`Q,t`8Vpay2)LY,ɝsl[#E:WW$|)RÞ<8a8Q (ї2D@bEz/)GG>e-c ,񊫒)F&>;dyP2CXyQs> K.>2ͣ|.;.sw`NJ$Sb\!(K@I&e!G1ѓL/J={M/⭖[rg:[%>cք;RBDlPy4*,v,B@b ~+:PjkV]؎RQqןXpD zǞyoG}pI}37ظt 5Jl#Ɏ5J߆q h0@depx' ? d`i( N@̟X (+^%`IeиuBդ;ٻݐ4sW9 X;Btnᩛ5i&GYTP\_Mz1?R LX{7V#4VdB}eiJCQgQGxy4X@2xO'"!0IJE_M!Bit NiXvxcF=9CtTҐBsP82HW(J]L:\$!B:6{ Gˣ(;Am\ӗ񔚤](o2Q-ߟ9P- F;/|I`ɂ#41HV܎]rdl9A_*Dc?8Jd6$ɶ9oBfܡ0cY;*XPkI6C;Dfb[ÜfE:":L e DmkGkb,d~z;#}u Qb@,߭u1K܂5d}Y0]"+Ȓ:A|!R 11 i:ϦHܛv {єl,B ؗ6 1/Tѕ$⏫*+}a- ;SqGI¤{KHodaUws(8"tKcsφU#Zߣ+LgjOtG;y09J_t}(!c90?<NU NIdJD«%yeV DT;I;"TiIeW \!s';pQ&s5xXR^bST $עfEir<.(Y?= i-viN~$Dv\J1r4z 98|zj}*J~^&T[/tӾ/1% sd*"V. /I$Oǐě2)&p!N9cs9*s2|_/\E<~ nsf^ծLlx-3ui\/8 P[DvogdbLh3"{r+W*ھ#O#6 k*< ʇ~9=;Q~`J& =Ȃ.4L׌ז`:tp]91ko xwb! ^~97gt2C ڛd̸Zq%xd +"e]J=WXǚ- Gx~w ].0$y!?>ج,D6YX1aΠ\L9U%{NPqd8Y[WwΈr"k0XW8>oOd9NZ1pD/hL=xp9߼¾w9a&kuP 0;ڎY4! $u Eaǡ b*)tv2 bl0I/#ҷ"6~ +(:(W<۞ΞȈBӾ"\X^@͹/C&Гwʘ{j҈VIO~`,S|D+Bh!臌2(DETM1Q"?a0TedUGCw.$~J%0B`6zIO 3CQƺ?ErȤܛ& gdAqw<"񠈏5"1B)B# ] BF{ 8 D^t S1h>#Y=x/xŗAV?ɝf`NfOrbIc5%!ƽcلؚ>%ܯf􎅒7<. R 9Au4-$\ ôh3φ$#L)!*|wyϻD٠I4o>ֳPHNsgŬqA@(L#ܙ^FT"ӛna8R'oW:NG3a4>("OژV@O,c\mݲq²A!(p eЊiŖj^8 [6G6S WbZd*Mʍa7ؒ Y.+c XpmhE#+ff'4h:a ! MGR7BxVy1j<]oD.U3jw0n3K%i<,: eR6Hes{}D0h̡q[ BXzdf'M1}KrP ķ *LJf$3J()nMj y9F}>h7M{昆,Nk*6i#>al #;{ni ï4'ȏLg? lE(N5pD9ICuR|Ds2`6&<Dց4-g?;qN?(٣a~A`Q^1ĈJ8r ̙2;.8g ޱGxd$~ rPH$Y"(sۑiǝvJxa(b~Yt>*B0<8PdiSP̈́;;2z0xERFT߬x:S\Ex;aUv,^`>_?|qKd[_S'%J UzB9F#8bc/ۜc=k/u2Kb'A=QW EaJ܄$`cREXbwLt|dG7A3j%.S I3sX%cFFE6X`xBjLh;S%nrQ#7hl`/3Hbin}US雷0G&XpڎI7G vk̡S1ƀ'D-/jNB"|k<3y=Au-?QrF5"Fqr{FA~%4t j̋j:bN!At"t08k @m2q̪bP <6}́1 <`6HPN] ؈!HwLϲjDt_g6*D%Mi4Hlu}1/T8m  '@ |Ka(\1]2%ؤ&lxښuqQ/s) 1S~}]*aT8dB{CTu )ol|FP -!^;vv2/Ȋ XScL ІqˎLq(3@2N%lPЖS̅ ;b˾I2n&$)cP#)_"vh/ bm%\lm(7fdL7<2$ȃmdfd®"E!2cGU`OF/8-FʀM$1cQ95(kaL-lQ}ᖤ edCan&*s8!ODB">`M6^mOC2+Jv[F3q\uRMh_v;<ch:!4<:ң3L*Î{H J1]O;3bpRK 3 IJeq!d?B3(6?DUq8ԔЦd8ۋ"ğn<:O((1O6]"*\MxSPg!Z FGIHs=qJcPmD!ʼn1oIta盃cטk܏g3gai2bBfFsөƫQ }f!'`}8ՓoR;'-mH2X7dH B.^ eqi006lGvpW d1o#v%w8_MFp31Lq}v82Šz/;At+-VӰ9.} .etbtHJaO81Ë*R[1%CP u|d[Dn7G㑩Ləc/ܛ‰Mhcz+ hKY=rW|PBa% ^Hv]t"_Y1| !j$GGabej,0(8IPuK9-"z̕#w Tq ٌ E\j`SB*'{AL#J|lEjQUrm?92)R<% 4p/nkÞeA1q4N9 Ih!αV9 #a(q [{H7qjNFaAp<%4# 'U}1dO>`E:avZC`Ni! w|˞L3v^lVd")#=`oFGJG\B' q6.u&G*ɇAXޛs&9S)9-8TJ\ QhgʳT("@p~n!P6Y.+&#LYV=/5:1?}d Fb`$g~ yDcTgeO 1ܫJ(|-x_C-oZsF- "d֊̹!2Vf13Na|I$0&YɌ*nH ͑l2E3@~W<ڣz0Y-\8JgO_ϩ6Кv#GV|0$WVooȅ?J9J* GHU¾2{P|n4wV(ʝYbGXT>Dc*ΨImRy qvBrpY$ q~y˜`8|vsRc)?dVeZ"]=>K ?wb;M׃iߜj> _ZRX&RHɻdr0hSrn8n #zB;D)pfK'zUNi0ۥ=0 0!^:080f|HehkFh1Guh6(į]N]Q)pywBf

n0y;!" Q Aq43}P- \%8E5Ȃ5RȞ,Sl(X&M&%̳aEH^H)O'sf{Di@* ϗc$S4GR e5|t-{MqNEd8NIp:f禪Ⱥ(%q9Cq%Nˆ]7%o,-}NM  -5|z}Oc_szb!XD6"f2î r$whfJ͎`j =`^lɜH0N՟!F,$a"=BOvNB*鋀jft#m5z9#w s]n'yg5f9%An^`^9,ŸU!0e`;uQt}U1|Z<'|et;s@%38% -w|i.$pF>ftyEBSQ̋ InFDѩ_q#M9KѠ麍vV}xb5e 651XgQHRJGtnA" D ż1,`Zg0ʒ!JRsXGۈ1<є0l2vKϸ@tR \;l/.܁i_a<]SIC$r6ܶ7|ȱ%jY>"YȰvNy+?&DzA $!S;4ni\]!GUE[e]A|S RpC xw7#f2d%=`} ax9 &AtWI$Q;|L[d}pk ^[̕B=~|A <<ba' ? \h8ISgߍT>`_#y1Tpa1!;*JY~XԽq 4NL*\xǂkG*UuC=DXŤR=e=*hwyUYP:zQRI؝l]T a{l/y%udByWU%a+N ۻ+ rTcI&E+NO!lG0tg1⏡˹1"=

,U}9i<i4z.\dl5B0,R ןǠ΄ Vb5$nMcg-_Ll4@ #dUsyAgі) ٜz_R0aQ Xڂx.1w/VP1&mlIo iQ,kBjUb!N&[ds(W#Ϡ-y21?WE,˔wECdzlIM`çe| Qk|DŽwU=FS_M9Eht *A1'>~_oga4|&7Dv?&mV k'IS'&@ݘW=awda\CdfyH<}F\+ À'r}̃]&1xڐ߂ƌʑD4aЏr8U7& M}tp(9ԆܙrCg%RDmFpKV8>#YqJtdNV3rPG$zѿ1m~I4v{~i%tDo.lx%6>`Hxc`:z,rC7O=zÐ2&J;@$ b1h%,6>#ڼD`\G|͆Ic/o =,X*7Y("3߶d橍  P&GlD:.ؕbv\&JIsF[U'Fe]4ϔD[ t^cqӧbmuP{_T]xQ (8r$VÂzea$ $ossЉ#蒈=CHb&`MrhgL s%%þ_y2>zccģ z;xOXBVLu̚ o`@B!h5ѬOcp>1 ɳ"{i(ʓ O *v(\~cƍb<`&peLbМ/T/x,)F(q۔F.<d1/%֬[7 |#Lߜ1 hf/jE$]sZ^({q"PpqE$d%Z֫Fbn"$&H'd0[XE(iC{By`C2XDckus-CEךV݊m̙/)帳" T=%v;#M;W:$-3'>r8ą3ygL ޜ@lHȴXxm 8cLfy* e;\2,Q% +z06{8cFd<1:˗^͚jr܎-=ƊwL#L)+8`'%+أNtX/'?I(>cg4#l)BV<Ɛ1-=5MâRea!x q4!Ve4bs(3[ {?ACCkd EɝrFs5c>8cT^q&>r8J0>y᷅({{$c1ljuxL8J&Ejĥ "jEEuK)7,3ei>)~[̸al'Ā ?0g%c ctѣBgꎇb0nt "byW9yn|IBS}v"3d/(? 4U*\{y7,\4}ȏ*IA ow$M\,vOТҡxj0(E4/l4 d"KBXꌨgS魴m$K$%&$䋆cݰ?J=5. d (O5ѸX"[ue d4 PFLQrQG"v಴"ahSr8TYdd_, Q/\:&J\ߍ1$u$p*hTIN3cg N2THbKu6Cv] d; 2Lş~(c2ttͬƿ "UG)2[0#w+S}I *t3 \Yx8m̧:f:zUHu, A=*fcFTS2a LQ|֓(3Ie7ҊE 6&8wFO%9'XAV3Cac6"">m噭SJay#vJR~F:OHw4mɭ7E'ܭ(sF4KsRDtIt@g&d$Qn(1UĶ7 $Fd{]h;Rx d0NI`Hxb8yjQ|' ǨהԮkpq=BDL3n lukE+'$%BL+x"%bIR ؎'Ũx4(ɓ\YèS d>¨e暜HGI4 $h,MF(49\V4q蒎#̴<`4Hq,8btIڊl%Xx;cWi8lJtR ;RBcy8Gl#'Q"]ꆲDMd}L|1,lA =3F35YXyGɵph'0RX>l&>q\rT5N|\=WaRM꥽A Aj# ^=hx Lk{M~`򒓺 ԛFz\ qȑZD"d[pdgTL qO"AE(Us@'hc@88 Ģ)+o ?`(G$t{Ě؃Z -h 0',Q C&bc _5Pmf$Jf*-<6F = nٳ"ig~|Q d (CZ= šW'EvD5!@ra~95Eڵjʸ 1XQvCei8I.8eal$D:A&Zhuq`PlxwsH*dH+΍:.IG8]T GTduھ\G$VXf "b|2CNc- Ujsc4C+kPnؒNQ+@OI+!q!f)ެsW=H>cѝ_(Ǵkr8L~cU'~dv% . fBuOvN7A)?xNִbtSDce?I/ aF& 2tH 9B9̕ UgHէAעLH(&$Qׇc\e^)<T6ތqԙ 1;rk$ʰJX~20PzyKTu$m.iHԞn &aG(*ICg=Mn5&Hoܠ 9dHoJ'֧fw8aKFk<#VrGgmPI;c0'D)LKW!o,GcxN߉ dOS_$K;g?D_VoGzS uNAlH'aJ,ʤ Aj Ig@ytQ,$O'N#ۢ֔_5BO$z3J>ԯH*X߆) _J@>ݒF6[izI;k~>ҫPf,v8BG!9iȆVSD=jizrVăc5('"fnD"_5 2ԓX_o?,ɒ3Zym8($Y ~8b^B vU3dpڵi5l7*V,_ExKA%ơ1'3xxL? V'7P~{"='w.غq}S쭡f0t =GɏrIbJ0GDNj&`̡1Y&BK !T%%zIKd4Þ6K، 5ц$3:N'./zCG wWG$#61h1DS4hO,z88AcR5`e}*˘^F⸲=C}V^Y%J yаlށ?! 7q;._eP:ӑvv̱Źh4l;!MU䶖5fx9 VJ;iD:C*Oe&SpYŌ!J O 59ZbsY#[-(!xotI"*dW%D7c!IцvjA3<ym#$ƍU1-C8*bx`?ќ9s ,-ϝO# tǛRhB!~q߂i gBFU7S<(f k,LQ%tFXcwb$""!Jx4㒹 ~M=8WIuMwT|x*ey1'<%Vńc}@(MuF@؊'@ ")TFlw7g clqf8ȾQ 3d`\: D`;j#IϘ1F 6|e/ kvH.g#nϩSK#[7~ʞRPf̉Nc:زsSO?CKPxD_zf7ir#pQHs`l݄=$t@U$,$̎;&F 3eXP{ 15U|mqQhcq!I)$edBJyAJNS$҆2mֈ雽-8# =#7ԁy?J%ZQ%y^hy78nI'=욋CȒ-t yv$ ǰD=n;Y]"%dΔ%7&Kݐ 1+1l;`QT>g'cfIPc|X~ i, tWH!/%0RHtfþp}(qQXXn].!Ę]|4t@ -D8 )t"L\0޹.˴aL:͖=X yi-}#z* e^Ze$:p#œ DѸ42G8P@VoF lK|dVLD(7/Kǀbc8S';ԒG.CçN☓ O[:&@P]+_H^F;װ%edd0S?5gЪ:7K’TvVl(x=ͣr"(oVyQ$="aY I!qL~$bR~dM^9I&JIX;=ʀ:5ǻ 2m9(1a=臰%PujǓ͈qEy,C'' Mlf{%q) H11{q3ƐoL*!+Uh=p אJur,q.u'*G3Ih)b:5`a-ƒdd*E{=w0l+sH_Ϙ4ˏ34Q+i)IAvRtFtfhZ%4:g:Ls;08B$3XR$_t:$/ 5eգ Q@?;&yĒ m/3AP)YSQ+p̞Q`:PIl#<'Y:nUbB7z;K*1 PW Ɂ", ̙=܃2NQ8)9Ol+"53,@, U[YKKtSJE =U TE6DC|*6r(ǓJq^`Ή2қ5IL&bA%DsG0~ЉRO*sW1zQhutF| O/5%n&ECPAz⼶_rse<&"Pi#w0=V id& 1D$(1 0ì)Ǚg~z4|j؏y3[WX@7nwKvD膃'ܻv i,dP=y6#4>ĐK-JY*g&t)iFvPM14P\# 'B~=~A$ @,!P]?hfY?}vD(̅ Wh߈HlY.J.U R|vH:t P%D$4ACivv5#@r>A5-Jֵc8ud-Œ+MKE=ŬoX{ w'%RD3+y\k 3D\zf !3aϻ(Ը0L*fmT*3Lǜ1< %_# N!v<=&xߤBފо+rsa,C8>*~=b)M j$b! mz}U9yEc~}!_G:׊!ndL4Jtc-;ȇff;4◑e$~zq"!`K!o<㌏V$eB<(݌)Y Y1}˹ V"7oyZd(6#Y-J< |gQ2Iw AB &bk,+3^nOOXJl@ ZGsLi3~aF|)~SEfP` ^ChOL>_I=4KK$p 7}N ܍sy_aأ(XO8."8<%=h/1,XyO>Wmfu4,{Bﻄo$IiA,y`47g\BX!|H# i4"qhtSM*dЦ_ J&xh9$6cj[M,%M(,Ag\ݎHiöŬMcc p:` va(B(MӉHkVF$~͘s#NX[6],$v0eόfx8Cy_.W^Fm}DCU~"{[FwHeS/[ZH=*p?.G!gng LH Og3,.&`?2+TRA>Knǰ@T070MP%@\|M/? ˓{ Yy8!5x`H pHVkB\9 I&%p"=s2tT E1#H~* @6sr)Q1BxvJx#>` De] 6/}I"F KBO:ceDAnɼxVB3 Z^–Wa @:. 7-V\^je8GAdx ="H":^pO=^5}1D̉l!<"A^8ӒZ4qI;_i)2%$O'ΆYRcP} ZbHSQ10L@49s]N?4xJQBkE9J}wc[9=M9Q>Ѱ̟B4H]˨T٥dW̶iܾIKPoUP*NȹIX~+BhEKח=tK/)&A6tu3v)zD!1|%FruG8u2S+an%J MQ6lf0~m6I IZ:םvmxro1Lx5;3 Zq@x_@=dY 1f GkVs6bRi!]+qC1"A#35Cs53jPfzJ{jw{ǝDN@5 %J#,FNbF +9ݳl~Ld<'&ozC'@a<g$3!X2)G{Cu# UQ+J##iLw1֜=OaT/W $2F,dC$%0}ow17e>5Q"l[;A(J<%fˣv-`}aB#X .4ߦO$ 'B?/.drRƿL Z%%z#Ms:"0! 'F#,r3S$?-a]x-Idؘ}ϴ줭3#S֎b2 JH!S&ݒ]R3qf7`9f9%_fY <Ng/G<"8:CLgɊ;`Jrm.RTioE= ?E{8}F/cI1ZIm u3Sq=fR"6aJ':?xCܑ3k|Ї}!C:ZJĔ2vYw4<|9@|@k(p$ƕf|f+/HJz vPni.C Yfy R)3:h4MȌO'b!}E: aw| s:Gd\vf 7<1QodざDlE@7q=|]*s)QcjiB߃C Lr9?7K6 jXD' *0g#+$[QC(Njsp}?FfDAHB%fW-#xě% ~ZcȢQqhU*9,%kds{XualاetOι<>UuV#Na مF|pm>dƇ޼{ޥ%Ya<iD!&$m鍉QbM\D@̠dFHaq_}Op>t(Ǘ8S-s ;,$ћ?IfM$ci[ >lU#U]*BI1G՚qUr_2 \Uo Ovxt #I8x_K5RYngv(K#װ9+ w%_{sqSLUvk\c(QD%E y B$7z>Gx+;R )xbxQ q&&>t:vp\ XrLO2=eFѹyHg?lRڝ?K޲wE&tzr DcXm !'KWU$|yeHJh5m~} 6>Z%C"L%r sLP,sfe~iii![)|p ,˧$'{lX;4#40ý9ԍ׮"j*"73mVNyG!U!.ƒY%h{4%xQ a20ΚYU A)QQ4F6cS|d^@Oۏ`џ s\Mc$W4eQe,U̸鴓n2(`|;6Z$PHv1HT{s*w}t%cIF5p+PovuHK7rO<6Ǫi$nBμdHCIxM>@/–G>GF4zK}9Y`.1D4NG#e-BC" ,~^Z+Kӯ>D9#w{oƐL7r`"On*DS ᅦ"@oK3؞aԐ٩^!J4H4b3E,?hk;bۨ:-Lxed";6Fo3-a)N~[Sݮ]GoI+K:M6u C&HHҐr㖇7d$0^_fy{jݒS[SY4JKh4_3

43"ݱd'W=1 UPF(zs5!x_X'F>2frvTX= ;.P̈hbmKa;g"@r","m#9,/Htq]ubȋQ,̒E֛8\6'NW srC{>&~83 c*EQC>x^`C #% NE] 2{F/Ea4iyLJWR±;ѓ]"ϻD6e&LhfBq)eC m1=>Ģl߉Zq%Gғe.4 GEh9TwYe>]z1R9=CWęaW*a ,JoQi Q#};͸\9mf+r+9Þ>J稀m{T~7-1!DztnlyH?=g0iC1ʼn^Z@ x3Gt[EhbfXJdlH\ ur a4.^\l8䮮ܶē)&lRbk~e'kDhKAJS KFh#Mq9<^hQYۏ3h|q4e}afU/[YD&-{sn#{|yg #:OȱA@O0ؚ.-j)d K-jm 2*rx3@!B[܎-f="8LL_>|s}3U! sc<-!&*9-v)HD9Xdž|cd ֏F!ζ"xXfvtęp.r;Iye߫{/}Bc`8Go + >U-T[ 4qB>=蓯ynfX| qBw9x Q9&<#YȮU#Q vdd5˜D1)7rъ)## ;kA9gK߇ $+$ WI1ȘQ}؈xpqG6VGZ-\8cv}-w'!g`@+򉿷Bœ4Š*4ȳȄj='kF1=fwoN\]̄yREdyJtGگ1N_*DH\U 0v(*Î!Em9F.(op\,tY^҉@uĀ <p/.94@46BD&p 2㸸)؄: (#A$(Jp!:rP%'f(aYI$i&["xJ&iG-$DcP} Db ~  6:Ӝ8ԙFQ9持<CtD'K1X:u=EP"{@j1z,' F |0k4w S8}e#ɑĠe2a Y}atmǑO1`Cj[юaF? C5e"2Pb(#d<ޔq>*bR()ϣ2 !Kkz-"k4j,a6DcsL9h0a iDH1( `_N$bLwTbH4sMyn}Q+9Bn9#(=^T!,(.a+ !#K@.L(k,hu%_ B"l!fw AfN.ljѲ>gbLIe#*~INhCSSfhW\a i''\v#v%XߎRNK9"`;PGg'( f6 YbGfVq0 \pvK$ogn2?[!K.O>,,UgzpT7hҙB.eϟ7C;XNKSROKڃbf8+{+8xiS-Fީ I? X$ãn] ν3`cĒv;fi:waGJ) / c /P-|NXG$cDR_|P5f} òeO?P#/ YQv6&k7Ԕ=^ar$~cwY xlN#BS6 $ΝrbEQ}c;I_6C !1=h#x"9yybM h;zmZ6mO`D=).+:J!&Ifv9qZѦ}3M\jk|b) t$ G}i.F>t2vw.p4fQ^gXnG2?zi bviϹL'$*!IxC% Bc~E,%ʷt)B{9<&‘HC9vI;%XE"R-`_+^+.'(UapENTƗ4acX S3h0&K Ƶ2(.hL?+*!^|M5/mbLF"QA?b  HQ$r_t'0DD\"L6d٩oina >_@8i$p#N"DT$ә /v"a+DȆQ&@Z4DdA)L<gd>`=lMziu͙;`?͉k$I5gPEh y\ y% x'uIZfaXōx[ՁXF`hbl*qhj_#@dcat !%$H4uDC*CJ#׸ ;\:x1@N ]a$#V~JԿ{F!6ӖY#Id5ZZ41+t=̌&#)~vw 5EAYMi/gL 4!(xoI##/%?Lb46T3VW{%fvX̔ ˦ʆDP&s5^$ k^G]K/W-},xiH_nUIcBh(D-sڑ$!X}1>($\UԯNـWjl&](<(8 3,H h-E\è^'cY-QO@Q$,IӢAQ ")9޸ɨӐ̵<9*2[|.T1^/9sIP?Nj㙇(cGin Lc6iƐ7i;ŀ:XwQ"zd%VUX CKg! q?nF=hU^&(l q 'd9/]g6qlbz _hƃ`v&%hkHs=U"4_D8,x`4d{LR%Bedxy6 !bb:T{$:#l V'U<WlbEAHND!M"W0DXo8p 1'-R,KC詥Dy\tJy%ˤ.p[0y l?%IV'|gu؉ex]Tra uc4F5LZ"E:Fg~#`=$N,8l2$]Bx,T 'MIE JI"]R?گGo _Kt4̧tL5 kp2/$G*DYY(k>B̙s8BCP8({T?v)zY;ّ*JOsŧ6&R`NI:XmWMw 2pPCSRY@@Kwx0\e6(o)f&@P~7s->HW*~`ѸR?zMXƌ5S@GP.$У$(B߾4?㴈0؎txΘ՛Va0ۃ섋,٨'+R(EHZRqÄ=Mq?I\{H"^O6}b&HRO='+cL*2- L&$>GWMJLd䏄@ ڦ#G%b*$clQ@l^gE6@FKҐc" 2c #Ȓps f=-}N;Fv-Q%Qb 霣.Id^.Ԭ!gc,Kjd '=/`Of퉢A<|9vot^Q cl|Yx_a(YXz5CFܨ-=͚aH+l$\e'gs2|{idž} /$rjX({RܑwLѡCdQ!,JCs{!LRiwxĝ ,һ Gav8dwEeوH$0 %? p F- E YT#ZB7>Ʋ<ܔ M_>b)~5#՜#%(1C/HDz| u5 Dn "1>a>@>Bh]Lu +\q!F/#I!+.|B2fl 0k '0I#[* ?R&XZ@o![1—;JЛ]Qzd07z &Cnp58=6E+fv%zB퍩7FGS|iŔȑVH3>2S(BDs[CR"ǯ@@ & fKa :%F20Y3C,)*_zM!DX"r-s:Z+怞Hxz~D:(S $ *%;P뜄C眮rQ*9nѝXkn-R\D*nAdYTSdCg8nuLC5$vmwBD,4ɤ:CƾT"b xjI"hPmD1)yQ 28#(A` &%4ZMUX!Dj*S19Ds!5e@Mi*tDx1#pBX ;>'P1./*$+H)oS BXVK $ j8dpI$ G1e`#^ч m͗o&_9 <2Q$8/!'4GaG <|]-Ь)ѧO'dGa0à 7Mt]_U1/0 I%eg`Y?"h99Ⲧ$n$&JJ=;ƲܗSM.fC5-4]|E՞q$ ,|z@++`H1"tL4gʔvMR osQ@h yI&q;3z1__n_CV,m ዥ!L:i,N-iUiuOIKb\ 巳"Z 9ټP{F h`Y{WQ>(O%织ɔd i˼34IdEg)N*2,kralEZG}7%0 g3SO*aC̡.3 Q aYQb,VRŒ4yŚA`29W"O^d,qaWO {b4y3(Kš"wb`ބ* G ޖ$G9CZ;bpxN,s |kCEtiƮbIdoQOۇD̂ݜ0COP>p[ d.VK ;Cv Qܴx)̠3.YΚ+f'a ȏmQG) Ԣ0gI>0T:#7rhZFanvJP=AHBv4>v sBpP3TE9A I8bqɑ^!D!$fk=/Q66Re<0(U"L8PWqGȁ(ti 3Xda73z]-tz66;{IfDŽ*GEBI +q \ #Jnptф#PMtifG$ /sj3pvAq #!XaӋI%GA! wJ+EmxXGu0g}h^&)ńp{gvS‹",yP0z32xJ$Ģ2xN4tAv#}zQd-A9̝ad[:>dGҐCk:58n* 埃r:wLnO:laxㅓWxT+V4L4aqkMK].nMi0I& 9>0&ݰO{q>b&֌FzHa G7>2 {t%f(QEF#Qܕ*b6MgGy#J>͋d3~ƷTBPgհ9 O ~#q?!(Ep8k'=_ҜS̉i(!i;~|!/0$^B25%W mD t#qF P5^iI" N DG0| =%~t2\15ʚ߅N`[|ň7O8B; ,ib7P# 투M'rY0I xmi݋7ob#PQ H9*疅-6EUU烻XKq @-CYK31OE C d&SD #H, @yF[/FUC&!4Y3'O6Sh%x= i#Nv$M׉Q9=2M1D~Z1t`z(@")7ђJhv㭀/)'*} Ћ,sU Mг8prCW L7')cL&ܠr,RD *cT.F18Tρ{0v{? COCl@rG|p>_»rGCꠏC53wnC3ؠūi᮰EU!\6Q(m&A#d$ .`G#Ҍ؄{$Ǎ 7M?cB{>bhaJ#f##i6AC̥ "r- 1&^DX[DCT,! Ze=rKqT(2BhOnaN$`FϓNdm=Hx&LeLJE5$Ha7BGPrnZ'HJRO}sѦvuJB`B2!ol'S9b&PH fJvq7 rrT ՛Q|}=eE6)XxbIe|L2%Jo*}넄JVErs;ȑG .GF34'"Y~ RGb}M7/(&!HŚ>HźJtB4eg,$vc'Bx8\9Ua$ҤZ<) hamI^Q/GF8֓O3D'R4:h"paL}\)'"{ګx5\%LS9ƕɓ^U ewZ@p\u.ܲ->kfŲ;9vnA a]/CDX,r xmM!Ğ) }>SEV5~]͉8T//(5ϐM Nؚ2BmG̓8hDNd of8ÙV;B?2ϭͺ9 wE(vXR h>؊U_ݥjǑ-й).I€1$ 8 \U1DL fy%"Mv|Q@uI5äbgyK:L9 YCdN031 xX[䕺D%Wr'd'e.iQ4{:~d)ZJ)ڽFYByٙqG(};gʠ<&_ :m 6BM j73vqgx,Qq^$X58!9^CF})Po Q"MyXuKhd3{QCJ!]2Ϡy93BdRʉ".BF9HCИ!nT|CAЄ͈<f{`(R&ؘȯi!6iFgJ B %>a~uJIr؜a&97$HPgL9d;"R2|M: u;5%wA¤_˻Q\²rJh^w`I q :9Ik`t*4H|4w,-y8.DxaM3E&ѣύ@gE,qKg #:H[P{cBqYBqгJ4p2#hʣѲ(1^J-gz5c$Lu]@qV,B9.fDz v:Z_7D(tK$YA), ;!줷ϩ>Gp n'CD% `S%-ZN(%"`8U_.02jIw}#c((rHo/Q8PcyDdќ\,Q0h]q&ǑĤSL\Ob89i]JIO:ft{ qjM=Y1:yׅ=P ++v#<_63u.JN|uO2o эCkx` KRx 8AΔXAʲ6  ޯ,IZ-c9 )c DAgd~Es+r;tmfa`%@cjyQyVE=3AE2 C;/C9& Ʈ|yB٫vZCmaD)v>(i<<XoeɬMBIo6<j&[:/WXB vt>:&64C Mp0bٲF6\Ql &YqTKIl,j{3] !D%%ŏs,K1nO4ٌ|i$I818紓5`QPEQ6B'~?mCdL) v)Μ仒;ǫVt`bns{41Q4#. 'f()׷C&X ZQpk1b;&l#; ? Pqvkyu%cqqy.ɳ@(FL4z'n!=#dH2P&P&qAЯ9 ٓI\OiWF>WFu,'" hY j%Cr|G~;|LS?94,dE9<\qRѭ,:2(6vsƸRX'J:rvPU%bb+@wYuFCn Q!F+ \QI'nРf@䱲:(L%&7o_At? X 1̝Rj!IرK2Yf3/>r_ Q6:i~&H~K3J=j+YģX:C0'%z# wy\#h! 1؍(I˅-Ͳ 蔙Ld06c˞2t)vxlڊI\2$P %%{ cf(?i1a3,R(v:OPQJ )_srFwEs!O * &&4FW397ዤDd6cGd~&b}p ɽzz$m==妥 {a(D1a]@kFp8_ÐMe[7@OE,ErrɥrT16%kee%e"M$vbІL]fes2c)w "kr6EԈz*sd%{K'ɥl)*;!bG RZǁ3ܡc 62O)a+&fΐ_{Tq(! 8M% s'jSF}&dȋvI'94\`Ve[ V2!{ce:y 6|S/>Nϒόr ~O4G҆SPoV#8*0,Ή[%ࢦK Wj*%lZ"~.&stymȱ :"f)FEڐfcqO3I+Om1MH B(} &`Gi9-#YSM=&8 (őxE[ݘn:|.V#Ā{5cNzGnGCp $8яtfpߍq2#m5:ۈΡCe52,H`KGbЋ4Lii{(h lѵW/R .&\"Xɞ#hS['nOyA2VG*2>?fَpٙTSoloPv=[xab9_~T-~_Y#K8ʷ lˠ R׶?(@?~#0?!)HM\g'sl%!`伇dHSLW`GpBQ*BxJDtCھzsbDX,BkÒë ɠM60c){}eg?Bb[E!J8'rnsZ(ewÄczILi{,e ?BB<*3ji̙"8SFdH<+POtTcxCy3"qpN%OY +]͈R*:y>hM 4f/,e`1+sb-)l4|]rpq[39N3ILٟAO%_;Gz $ВӅz1m3gYp ̹tG#PuBR*hܙŎ- Ɒ0 $d9>3awXphE$f1;ܛmbUQlrߞ9Sl2`ڷ[=ȥc =6> SK!#2b5;cqPI8'Zq`$2C!(f/!GF#wBF0E8DCy52&BS ’{^Έb[F2Ѥ?1 ;22,c cƑd$d 7GG,i  *$Qx:v(S!u_)|:ARR;$9N?Pќf]Y+I(حItpQhpTE ]s/TrNócht) "PɰJPvPH3-=EQ5Q-3 QG9*Gm&;ؓI <:Ŗ+_>ޞIIՕ蓬6I.9oP,s(ՔY2$Zl7˹bR1<>qH6ˣWڿqI{͍ԏ1~9onh*̯TjJr誩S6$+KsVElUh-'U#Fقr;~)ŕdBa/cg82|chU6` ?iCh㨀!(.“:l;6]2>6;>`XndÍXc/z ̙;C=FtP~Ƭ vIĠHI%t%ڣD~7"_Q(7%4@=?&Ds R0‘q ^O8iŘQq.w+9ߕЕ.HcqybfHjqBqd f]Hs.6a4?RKn:V.MHuF 4|ҴWw}GI8> ԙivY'І EQFIb:YI#.G~ZD+<ӝnTdlhrxf:/OI1ӗb.,bTݎp8ɒ1f 4шS~K3PzŞ9[&̣diI_KEm `)1H)N-S\!Wg&II8džxp]qjj8&h~ 68 1PTZb\T)b0INҊ C\ +dY:HǓÓVW%eNp™!Ÿvp铣X:CibL;APiHR 3Ƿ"gF'd3Ao&VyqߠA:[۪`| /#s|E'US kc?GryLbƎ6Ę?i#+BȰYHOjOd|@Iad7ȫz+ȣA7WcĚbK/mqSA7@HJFcmcPH*$ -kOhlEQưO 53&iE_sn„I-7h?ndlkBF[gqMy,0^5#,z!|2= En_UjƔK9Bk]D8zgXN)~5?'ZMhEDUMT0D^ۄ2!p(b_wsY4^k}\κ9 *9ghZx/!=m%L5-Ԋ*f0\]/6hu-|NY={]D a'@0Hdhыח@.lɄ{fRx_00'jgOL;*FbgW#F6IKWMQg6Zdr;2".0/0`rL9?>D}6YšGv Uok)w/fupWKb;pb/+)ߛ 0F6tiPSd rI>K|+UQ8p S($ l{*#-Ê:ĮLQR>~xAQת#UMV rő3RA$4@gl*}hI&XiGuLI@b(gPs/\&"E4I0v>~#')KLDVKd~(# jR0P d>an5V$hS2dԦҮ~\Ϟ4,|/E+~)y)3iJ1D(!`ZY(V|!ᖨ;YpJ&tA:?0nIK~wxŎfz!A'Q{ƴ:)gD8LEʴRÚsa9Q(fx#U KW:ŃC(E-D[,+2&}W )|q(>1 8E搛>''k$ !=`|%رgG_>_ pZ;4Ɗr"R7 ?4ŊD d0e> nn"N;%Dz8c ެKGG{rqq(9ᜯDāz#9L0'O>< 6w 1LfWs=,Z<.HZ,o#P~bڟfb;:λ{r*j'߹l"awqI!=D i=FT_Bp-E2XJS.=@"B,SWၢ p`pҖ\5' Ny-I*n YD68PxSeuCh)87DVtF *;Fma `lPRv5ͻxۉwh=h4}EL+f` 6Kk;"9d$FYW##&$VХLm+g54rKT62PF XnϹF9!/NAĘ"96%HpIy< QWr!dcS%Ҷ|H.SH##C8Uv i#_:dw@tA d;] 8I煰cb*%x{O^7>oN&x6%Q=,gR9f0*Sm O-X\9 b!6HUucn(dØnE$1$3cr3& CжCA- ]Hty?*GŠ=$rʐD$5jx b=5O946Z@doW|ZkPyN%{}΍N|9~6FD!&y XεÖWO;GN62Y6y#StT#"ʑWBQ8j^ Dd(p4,p::{,Q.ŃZ|dIM.T6-DL1gQϠ>,3VP\r+If172s<6iP VĈBECȔ3K(! }6<TXm@ 1L& =fDΌ鉝@;c\ZL3ۂf 9 6$V_6| -?} 92Ihy+dIw $]TגI(J!ZUDx,AA3ae0i0珬'#:f0%"| 9h?mDpGR*B=i\/®l%m D$!2dY[@1BmbBD!tp 8<3 q !b@<*m%Ш3(A?q;d :U0)Fe/l;ș6 ZѺTHʓ`$3#`X+~M9nPTB\=y͌|G6`Xo в>|e]8&O5,  ֽ*#s:cB=?7qihpK4Ԑ>ę.#i6Fy2ŧE:ЍvXir*%x6&u.]PqpR=V=pХF?>#֭Y\m3s7sԚE-5MⅢT aaJHY`R -]0"RY)Aع_xw!H̜ e0=Cf}ň8m0JN2˸IYyop":-BR29 P #N #qn~N\Lx谉9)1M$Ct^BL%%QJ+zM +G06CFhceF3aJb/1UG;_ F fڋ1&q-~QpqDPC"EG[7m 5t%P2f.Ip= |mlPP.dD4tpaZd9esPJ_ύ\~INpv: J9FTY/U Q$fLXVa1)c`Q:/kaTĖ2EequfI8("Зz}'^֎w4N6D+KfhZ!dw D4ݏUxiPn "6P{g ;y4AbZY'HA52={#PUzVoN/D  5YE"naQf@y~@#zJy' QqKRKz(Y76`LϞJRh `4͑-)Oa:p쒢O,cT1 >Hc%lw|}Lפ-9VO+q'y{gLg-?׸(zwgo@02IXe }X>#HoI$ pNM4$Io1+&*G=9SC,+dok {ư:VK#G FsOFϠ7fT΢hy,4(dIDg] VC+j-\)Пv΋dfoH#eL _ OC{);]zQ?n2VNa:'M)ۺ%A` 8PDC@-Y1_ +vAj|p1bqj ql>jLdvHĒwv/jnx 𙏊4i,jo<RUӺ"'gގ!Eb3"a!5Kbp)2Ӑ<àP[kE`!Fހ@z$v^rW 5,v'l|&[Nbʝރ? Emuo:FR۔v/P,r enlNr< EEJq L k.mybiL,H}ʘf}&"?Hw5ʙh||%"pBaP:ͨc(CfƌF$0Q m5p+0WMٮNa% ?4WzOp㈯Q:n OBL0j:RuF =O_ w74#|H\;u ۏ= QAXeu@?B5u I4~G[?0A3E ۏ:e[zY )!#aN7UrbYQ*ƌ;"n ŏqjHLDFqFΑ222?~-\q܊TD 2Gp7VAQ4;`xFuK(ٻ:[mY}FN̽Ã% uKlA뗧@ MydG>͗&؈@1u:DvCzQ]6瀬/D+/ "U_U#v_7h7932{R1֨f) Dq2H7B0Cpf b0|̜8H(C2l"x82W[8@ )4GJkuѢIs1jn2%ݠL!S! >y%1nB@^=l !#^+K },1gJ-Rqqn?!/'3=t>9^bw3~bʠNpvrX^$MobB,arE B&3NB]61Q8Kb2Cّ]3'SFHg87Z&gAz%ĺ%:S^+=e)6늑5 lRԐ<=,cKh~cEVb 0q5Dh~h-0 (:uO_g.P1v,&r]Ղ/DKz 8(>篍T/tⱠKO_Pr&"|@\ %E'hGRO`myJE',~ ˿yJq΃#-HdzΩF|[Jt1 Q fn5]phU'3#Ǹr'\|"ПfőDYI< kQHzˋ7˜s{#:p&2ninѕj(֢V;_j-Ůn|!=x{\tx0O:\ :{7bU:+{h;qEQ[3%a;n1^DwN8>t B\% C0UԀ-4\fJl{=y&U1/1t>q'_jLL%;9")uYʫpx`  2 w,6(bD|[)KzB5|(qsg~KY.C Gq2-Jxѡލ1~_6B#ISbe~'*>w,H.VfLǝdb䚣'|]0W0 nY—;89ͩ*p g CsO%&Yյz1 hP=0.$;ƞ؏"1](c*8\ص՝f`5*td^܉ߵ8d1u)TҨ La+|.׊-1*C% .,p d2w zcT j0x4gX0#qLLGAAa42y#,"pv y6e̜lY<9[ }83LI&CsB_Py 0u\ĕQb%J5й8.m>Mar$$Ǥ0B)ȭzjV:)\zBc$hV\1BrD,(Dڏ Q {b;&žVMc98qvc`!d1浢q!ҿ,l ez=x,?Y4LNs^E;>*F$/CJ@ D`5̈́՝?i6*CQ xG @gX깇5ĆAeI8YT`3],EGbP",GXBthKYVCW qM;7pU#16Qy=BD$NL2 ŞW _Y#xxϛaz*7H!wA@9NGC>sZ{G߉"/ϧotMSAT2~dFٖ9:JgwShD{,̞ 6e'C 0 W-g"e#0rz*<˜d!O9 mIL6Dg@Wj$G:$k6ct{GZ@']{J_q3GwEFN[UԤ% A{\UMTK5Oפ:y.ǟKvt~b\rjQZ{8/042 LIQ25O=H1r Bi4-)`/ffeV`X7ΝpkQ=F|6b)QÇR1$AY"L6S keeCknðE|8NH)rR@j3ԛ?veEYl`gcEJ:3p kʙF͇5Md/i `tI :#l(;2lTa{#äEG5`žʯtzd.8Pl=9Nj))E{zIN5ĊgHѲw88.)B!/ A%؞MipÛC[A? HGj O^!8]300PLfFBj8`<\Řw2,d u,.lc:AQ$opݝ9BIpEDNK_{;G0&a; Ql/&"JjMia Ba=a6~LOz0wRF005t4}|[IOHCoZes>uq0DU7#}, 5! I4gR va94E+`yVN=qƞz a{9Nj>~0GkS^Lje g,fڔ Kd%Jv@NI -hjGOA"?41pRn(H@zhfA`N'/-42.p3-1&`gah:MndpPoܤ2"XPΝ"kThョX%`[=T;$;2'yS2$=A$mE?Źre,G P(6/tO' )Kxo 3 htUBt;,j9Ѷ+Џqe(tC>e!d-g7 i9H@ I.Fic_;SvdIA%O>oQ$Ciҏ?j+jyxv&Nx&h݊4wXljdv ѲZۏ(aS&z \+ ݥ1"9GQ NIYdy&n,ҾHv/~(||:8#C~w bކ˂4ƟbBψ2k~lz?d$c{glæmjWt:r+Z X0PY+6hKS?$5$cŞ; j| I|#8]CÂ;냏𯖏šI%>:ol&( d-#SgO4%ѣ@da=u#s$OrjE:ӗ.fC},HPDӣ/IG1Th92}Jco(X!}$'\Ca[& # dQ5,]cjBzN\Vh~<8x[>dtWk]~ddUO]je21uYR_- gF</ |UdT)rq_X]^$g 9'lpf|҉' S'UaIzx9t–uD:SG*{G<|JR(ɺ, * L`̜:&dF͟u'ΆiKt4w/Pf b|v!'T*&58b,DX'V!wf" xD.P9Hch|._48thI6CG<p+H۳YX?,b>%>+ωW# h,}qT啖]C.\C <帳?iNKn+-RPD.ZSG H_c %ۮJ$MZi=tj#$ιʬ,2qLDZa27@LYcްHh~㐔&`EÙ 2_Rɰ`3~`` `(<  AInz0#f΄y܉ \m?ȅ/[)h+xؑ4ҏ~`18.æױU&8r~NLzʄ_Bp:wjC$|O6f#:¹"X?F;<HDh:CEa6&oc?FTD!'+9%5GG< tǤI џ6E`vZa (0D?I\!"Y|؎9]j^8]9{Z$ĺHbRSeCd񵈘u Uo>/S-ؓO q!- (EQR 59gΗc Q;ԸDRtjǢ"QI`_j'c@T@WJ&(SB8lX7pGC6|޿R;8a#Qwa1!u'&%EqM5Gf,qU%hr ߇dK#eȽ4bH5hN zjMP!5pE"G&׭0W2Band擢B\W &*$b%1. Ha26bBb/ӌpKlhڥ=ǵB_r-b nzދ;\d!@| 3&QfqN :WafC1b? 1 9 e:bٷr2d=19L90;~(bP;V,"X 0.wXsD҆Gf2C:1k;i_dfZDR͉M,LbBJ:{8#FBxJq|JQvyS*џ!Y\|0!64gϦs cjKAV*Hڅ֞ڒHb \0rG(:5}s,Z Gu&]y2 qz;dt`F*D1k('p LU8=H0&tB,N"wd9' \m&%R|8.h<<$ ̶2dnd+8Y+ c(V#!3- #Ipx:1$xKcEl/b/f gT{HO: /NQ<"&b1gₑ2'@a0Ճd`3?Y V_Mߤ@@P#q S ldTbCuSG̿l>Gwe4숺'LNi)@a(a|d$(1jx>" v$Otc2Z]FY4QbhqK7S>_w i4n 1X4 dme IdI0hܑ\5dB1"BIwJXFNEz sa`_dzC\Ә~*)2bf4Kq,ɞ , VD6'&O Q EKp`Cg yXė2y"L1oKcH3>HTЈC~bDbO7 vy rG"`~%P=p/Gf 0cQv#vM5'PQx[ (gYP6}IOI*I|2 la7pXST#.3XqRK&[Gl$yI=$Y!*xhQe(r1xzYs3 '쎢ABH&(ʡx˟tJH3iQ b;47!\`'qI{4 l9 %y^x \O)6C49B@|;)8!N",@jyK$JDiI%K8hy#nPeT?rxB&̕;>r(vA92L ؓY))UU4Q5St4EsDo͙/gԔ1d-Q釈%DQ;'O#ܜ2㑀:|OQUS2*ɍ@H &j Dy4SXaq4+ 0+%h*zb`svutwa IR>XF!^2&Vz3pCTlAB,8E$Q74"A1B~ "1Z$"UT%FJ<1,M0Di.m Psevz}Ap1Ë"otLy4<C>[",or;@L(0 f^'\ gHF3NQsqӍp5dMzHMBCѝ$NiI9|_9|} AC3D7"iMl=(Oc,>'(O8iAСȃ>#S1bOq yO͉) coͣhYF.NƜmiqHSJ!bg  G!X^3A:Fd=c$h@CTmNiDk@˛CQ ' Q6`{IFO$rlˊZ8b!aR&sZ'ă9f,X"ÌZ(Č]yb{r0Hù q}F(JQ=&<ܣV`ʡ$1!  ZIBwCj{_ZOO67ED*I=cq$adNѧ7"?>]#o n =!|FsN!BY|Ef_H[Dn(MCh#qFaCUhd*`$2E5{3*1db8c|;Yn%:2p5d3R X)E`c7&M:9/JӖla`ޖ"(H-EW#x!8X(D\=)zj=0C1%|$N=9Nmrȓ%ht#tS'# Α$,Q,;uV/ CJVD(wLLJ: 2CLmEA<ؘHSX/ !~'"0 HiB0Q7*8;q7!$ lQI%|>ښS3#x фLHlI)b`wǯÓ*N bCF2GzAll"X8w\0E G%EQuƼ1&NJt@@Q8l"4gl1DO0v!Ș` <4yxZ,'QHE,yNE#Q"ĭ9FLj2&,o_Edr9`*āG@JxfS2|{ | im6'E'q̟$q[/#* }%NnnihGRDH52pՒ'~PWD$\N7  .20<76Œq4C[q8' D?8Lq)=l5LJ"PK(֫Mݷ"b|_ޘCP>8gL!Bxy4&|.rerjFS0BKG2aM:I_ Z SfJ[ .dMP2E!Ji: Y:RE%Hha5f퉃XG h6R4Q0b0OgY'$Qv1X[%MwH]8DsA LQf6ƫu$E,(ȒX3"Q 6q\F,Kɣ,e{b*FQxhY0'F4#/`U("?r6fXbqHazAC:Cck ВScpiaN*Ma!<}W G$9s,]&3kc&"7 5BiXhCdxCeOEa.\>AYPRя% \*q6Ǵ{47MBm\# X@@ џD9!E͙bDU1 cǥbœN4tBkK@珇06ǘ'(t\8d59ɺ'DBs:az#l=]#"LRʑ"!I<~:q^<, 6dkz(=xQT7bc"μ&R`|Myz !@v12b|r4[FR0ddLU&cJ(KQ F_Q&ӯ!:g8b23BR'ep2U-Wd$,;jbeD9 MAA3#&ge2Y5yp ä-GC|Mw%!tӊd1CxUuɑDv6%flIe0k>.8ejQ܈Ȕ D`)Ha$ƕ$P{N(0ri<Xv'CXK_P2 iB,bHaGLiőlYf ,:QnB$A3"|a8B?eJ.<'˒_(ؑ2SH.!`.Ӑ"B0k#h#"#~&"@$M@S@,́\9sHAд gN#1y'$)91.a#0E6".[GtMHԃ[n J,XܖxN:`' I&1)43&e8\{:jIt>I%b*D)`#GCXEQcR}1ͼ Dpʜqr=1fMA40>1á`)urGшI!,. A=,A;!Gc s ☄Ѿ3ޜl4d ae9lDStsIVH>,t{3Q oM|1T:☖l&Tj6- Tѓ6E;c`$dlqHYi^jHD>,L߄,amAx}+!E3IUEA%U#!-!g/Y3Mx.hW:R1e27Ĺ'U)4/yb•AnNea Ripę7>yfNVwI3yy*eK`?7z)XlL tIQ-[L6fz3B?D1Gaj08Dz2h1a1E(-I Ҏ&8f>Zp[oE0ƌ/Hp(L1$ɷP~Üg.Dl($'/̅cs~83ͧZ}O)LVN6A8ŸHW0P<>A cщ IBtU S7!prD17\;:EY$lLySnq  ({cMWbp̊G5bEH4BQ=)%1EU:W\h Όy,45%xZR>\ E1:K`"HZ#ǡd1LʷtIV.q 2l$I3eQDetzKfC8k0_!!Vz?IAFu $esf@ғM(8leK'$ݗH9pQ5f"OفF49"rKfoAQ%;i#yb bdeqfDHF%-Ga9X aN:A[is1gWjFFo ɽ5#:k,!4Xg1N5 BR%/ -<>!I8j5LM_s\B"BD]Hm_[IY2 #T|Ai:[RK#JRD<&@\44F\R-r9ѓ=J#Lyx GXv:FĈőW%2B9^N>787n" cD_@zLNbgP X@\zB`)M); ےce`ꉮc0ULWU-RNi"q4j3:Q\e I'8CѐEYF)M7b$;f6HT;F,s~qeB&, !"\ǜȝs?7xB,3D))gcBKC^h[HgJ[ x¥ҝzz7gl9A^E`I)JL,C["29Fؚ BDTDF\c4<"$MpG5dOpQ w$e:5a;ywF!0q$E4UdG(u#8L$YdXgvb !`A02 .<$\ ZL xNO!'<\$8C+ #mɐGx:R:yHfC\f0CەCnm rrEWRL›q#rKe`?Y&I%J<1 ;|ߓgDP3$*DmHQS(BHWN}#Ѹ7&>Iyݎޝ0(/ iޑyNJshX2E\E|S4d 6f.^K!R9֭I?1I*$K0 Ν<0GB,>U'L!JC(OE"?G1:Br&r?# t 1L3|7Hc Ł\'| _]RC{H__@# 9tVCπ0&XfohjEb:dax!ɣ0*܆ܱeHpydB" /Ԃa<#JnJԗ*S}|ąpzᙷ p fVf@e#5cJgDRG$!0QhWsv[ӮTjΙ]G͛:+Zs1$ Eax֚t{3x6pFx >g t/6VVq`(ēg(iqб&8;1gU@OKL$T͵ *†`Q59A Ռ%x#c0!/Dn)yrLP^8dX=}i8L΍5G p8wJjTg>aќsEdf?]@9C`ILnrhPO#7fonX&Qd 6T>bH!䅴Jqx QbRddS?"\`RJ6c.Ÿ y!3gPF" g$G"$i! i'b` q[+L.=cIkJ2 n992!NCxKFoHMi4%0dFH0"-LlSM< I 4zlP G6fp^hq^rO1_1y8dQZbǒ%pH\>1HC P%N =`bT(HqFn>f&Pnsͱ0g)ۉB0i?RГPC6 y(L׈DjF!}$ƛ0fu*7(2q/Gcw\ FGY@:I?*YXdłH!),Ml^ӠӉf%4@[L EyOY49#EWǠ<h(7̎FRG͑IphdIX3>T17Ew"՗py (N 36?5%cȱÖph@eD ew܎g`p3$S-v!c;=d~,LfV?0GfY Hq\|C J]&70'D t?49. dXp񊡜?E`X֜rDތFϚ"prmލ&z86'J- 2%XQfHXg 14땊%>ml4 d8-"V|۟nI#Oi13.Ǯ8_CaK)8XDXv_G؛jEq`k"EOXA`lO%g)_V#Tt f@b4]Ψ1ez Ba-DM)@|FQ8uFQ( Y8 ѳHD)s- ٛs"xC`iDM?:'{fcIRr`ȻI+_>gP?cn !tuю94ǼڜDE %0IE~~'f逮DЕ#< e ae>ܺ8d, ?c hcu*s#`N{:§M4d'liޤR,y(fFO tp#-@]l|mouπ?gNF(Y9mNf9~StͫèHQ6%tؘ6sJ@)m Je &lQdDB6 Ė '(H#lEIslxO7=xiqDY3aa-y. ✗%C|αD;v"Ea(ēd! cH㗎^H_笒n? _E@dl`-"2ɢ\D~CH"G%)n`ôA:E1N e4q>uANio3DhM9(Sː/J70d&ccvJ1lL!@Lħ :ef>u&óF4Zs.nIQ ;З- 4&)>W Yc(xD=>bi6[%Kٱ~wʢ~f8ET%Ėie9ӽb|nz$ǘ- R6 %(b(c((IdÖ¡7ȇɛ_ygÄ\na%%%@aE}uJ5#j\ TuNpF1RʸH6:0C`ޕę+ =bA;%QdAޕh*Ķ,s"i"#1e{G+cZ"O%bd^aK&c4g0F6?i>XJBȣ7fxʙtIOmA"1.0ƪP|:Ch __C/Gh Q 5!FMU[d}- "ٓ㘣O&ɴlsc5Iph# e֙ F4ULd-@Po X˓3eGbdv>dR| ԑ" 4]cjER+d1ks0~Gl%ȣHx_Qz, 1hh͎t*c+(ATIB=s3$atlr ĉT؋0cZnvHbܫ6\?i#J2%){7Y9Znq/w}MHd M0i U/nLY&Hz n cz5&%DXGf3g <%r)% 4'8eܬ8m1?% ج0,Hͨ'ԗc];\ߗqzH7B4 " FGPm&7R*vLttSL$dy0uwkbsE1 82:ӥ9z m * G:{.4Bw"Hm=C٨wcsJEHhb934GZ<Õ!PוebQ8~4Q| U\ "_?&x5g"Oa2A~\GS@)^俇xE!Np^I.J gDkǏDi*Eq&=EpVPVs8tů)ϮcJ,1p#1W:U7VxEÚ|W++v4GM!c?24ְ W\ K L]Yy.Xrc E2e'˶sa03wT.F&aɃC>X15$Ή*@O8~jN 4v>x OlrSX {/2f.}[`3!ģ]Rj_eG;j 2ˁDaL91!z2Hq_3 /:r ~KM;$pA"$ Pl9F<Kܮߤl?1cUSPzH<+3ӧ8fe#O71a 1H-顈L7q(N*o̺^.gHkܧ@nnʸ_nZ,J4*8!N(ل5a eY,x@bi=,q3Rs[E#tI)d:Vh+ |Ϋ1A:?%+Z3.Pw 5Q͛[/c>I@SNpHqB'iݙ $)p= &P:i\hAP4C-M:ŁuKC1(}ۋ~`byBzq ##vܹK\ZUü+o2Ka:ׇ/Go(Z;1pFx+Ŝ0њ,ҎIN 9tnMlo1 -ؚ$̉2 d yf0>#8nB:{,ȌQHGL,ScIXZ$V_6WA&w3^o6Ȝctrfx~ 4aV- [_)>el˙ +}Wu}!NȬh`0Y#+=-e}Y=)8p{.>4O2IOY,<b >s0it%fpGQǎc 1ŕDU0Ž4c(DnăȞRcٻkbQ}:&r($˖D(KNpCvP= `wlq)0_6MkHE!Y/ZW6Pe n]!m i*++0GjF,/A^75d_lJ`+렽B7y1w9=Z3>"5:oYH3- ~3YɎkRDD=s.'Nd!xhiR*x@-;'jcY):L!la #Ŭz91 Xb(4']tЕD5ؖsz,ݻTq{ KwxNs9uVHYCOs q BM?0rũNىh#eMKoO~ #;T_:fX%GμeLIF~\x0a &5osՉ2su4挢SF(Ē쟦_: nNȿ7sz@GQ+΀*E}!Ϋ6׍ysőۙNkjw9JBŽC^YAgrx4uǚs_ڷ9{KwB4> UG hWalh4olOD( hԗھEN"ZKag*or涼KA- '*32CSækC"bDQ?JdGFJ__vvEzđlVxdwt%1v0X[ WFc+"- ЅV;qͧbO%`7IԆQA2މgPT"dg8hga~' iUJ ,sduҊDj'k>sP42&saRV*S;fQ$p{cF,θbZixnM>9CZ-̢}s˹;$pL3WԼ:r5iR/kk"(uo/-uNփY_Opo/ ɚ8V7VcfEؑ(Lt~t^Qܥ gpN>lke*,`| sʨ(8b;T+d\ǂgػ+zizrxh#ſxTőǫF Lk&T2XBk8LU̹&Q[ 3[9[/NZQϣ6ߵXn53CџSpǭn]WuY֎m]Hc"NudbFpndG GK'bA`vxt e(}@Z'j#g>; u_;rnh_$:6<|f]D$"iM:2CBao:U8a~|}Ѿ͍l_I#W\P Sb55'S>F0ViK \H5L4_82&|fڽ#Vg|Q˴:p_|ޢ4*Ydd^ H3h/jj_:cR~7="efRU taY\ )ѻ&?K8*!ʊ jRԸ]i[}+R穬y/8 ؍: 3ZAt󑵴cp%w[cIF@qdze> 2n˖R/UJSX&JYNu|?GY[soL )6Wo-zxǚ<مo% 9 2v(5y⫅mo:u]j:#.dhzě&71%i?nv8Y5BFs{ 89pD L7Bj-|Z/rX X}1\8HIQf|ɝ#pzpc!~*u\i2t _ʯ\OTM˪QSڝ˭!.:<ƐC^o8U?L hD? #2aٝ(lawPz[J`vRX:Sȱ_wU:Fq dpt9<>%WnW?^|kh.„r]EjMu"a;hx8>8Bw5fkwIChm@owmʲOټ0>BȜ] /cx>5_Uju_VQ1Mi^8ap|ry&W;ðmOR.=:krB`EZ Gw/47p,T12oh'gt/?z.*qtQ.G?ۣO34ū&_b kx)uϨjASX?Ʀ3̸Tլ ˸>-qq6G+lϠ!4q;lT2uSs<\N וg8Ŗג~lI\BQ2}*h_<]d}NIg_\w^),FѼ^ouS )?a+5?\6f0[A1Q:8Z mGͮДOE +%Dw{6Qe"լv$r@NYv&}tqdeO P:Fߩ-X2\z{n<5Lbo-WΕ f-b隋T?&r鷬3=ZA .I{eL?,^6KT\.~9S GUnخ}M/0]ZyJz;TA!# ٹۏߚꁋpk ].v6"owdS*ٟ5Y ƜGUf4Z@MZ="Qh0*7K/̛8pHOɸDϦ#7;Zu?gY2.miU.T189 8J*ۘZzMƼ; |=E%_E[;D|•~ba¡OB,)7YJ ?V5wq *㑡i0F~=ϢɷZ%WSl^N\%=^.3;Xc#噑}Qd7gu?4E9@<&.wOnU%0_w qDsD"KȊq8ܞOV.Ԯ_MbT$|&P%XYޓ+LSmoD"nd35u3Ȟ$U$Õ$͒/{9XjWҫ ?RҎo[0?ì! [ľq!PD 4WM>t,=eB?i; `Wdb]qrv/o2` QVoЂj:Mh9I!3+*r"&%ښ;J2L}6;"ƨq|@x(x%N[l&8oQQl2OȂ*qv₃5EgVxf?*j)/#޿#6` q;:m.^'0|>^m*G3jb56)9X$ }<0q,JbA3jW*;QC `ŶW0vd$"iiNm]^sq[yAaw]\2UiNjjy&xs72#"ЮwYh&<2Ͷ-<?ߚQ:z9"5+7gR{|둽Kgv|~~nms(;;ocI :vnZ!WWԔAVjx \N~uB:2E{q,/&l/SU\tP~x\,?m@dKE-c>EѤ+4KlIX*yƫWX4?K?׋OgVwUFrT헤ii\*WNϯe/3T[$њ,Dwѣ5;ob]vMK{!h67/A~I[Uc- !֏{/2;O;Hy[1'YL6xTVqt5g'Sqpy]>}$VPb_4 ܀Z I-Fƌ~(Y'; 'q:2: Vy,6{rzٻCÌFCU᩻컅>!73McB˨Mh<yO4.Kx\>MD4i"h ;d9OAVlfd*oʣ7Y)7sD~n %Ko=9-JfX˒p1'4QZCM̞c)૔iS|a*?SIsB]h?42XoZ{Neᷣbnj4ȷ<ybnDZFPgBIt^NAR^o<9aGs= (\&C3Fvcŵjn9n6N-gEf.Rg3d/L]%Kf(}Br[:RMQ)94b{*e2^\sXź`J-,0< ^u/eþV:cpz&+éߩ $ ǘ!үkkj^P ~1bb-yGc.l[5l1b~;lw~CɘjC.A;O6ǜ!=e?&h*o1>$Çܭ_c1hUƀow &~BI 8S~.>ٸmO)^C!ÌU=Zt1%4qO:MbX㞸,NȿYNk t(IvLp܉[}DRh!R܋45'ό%k-Mzn~eq+>~s3f_ #eıOj؛7t1Ǽg5ND}5 55%]TtNtOߴA,NƫFkh8̞r~!Sc]ew$"Cxb% +Qxc|Ȱ!M[ *}C(KIscqƘ.H%bqe5 C`oӬMV1u<D06#!a0~*LgЯ X,q,Ck= nFlS};uῥ7u1jҫYU$f} "5B_ڲL wGЊ5n/TK+*zBCpg7#| <ŲQrq/Hp-?ϗ"IE M8-REy$1>DCRnn^3{RsϮȫ{M{YTW\ ע'BooѲU&srF9N%1aĪ~"8W1CPn>NԽW_cTgڌ[㭱0{l&Fm)ʍ\/Bk;"Blh-oyV~I[tтAZ gDWiYwU'Y]Gh0BmA<1\)/7"q^)WNw |i{>ڜzEnR1M;/Con#3F)>&C<$O'$JIN[ -o]aC,_2YRy:*4DF",Vaʫ}O1*W-[ھ$m"5ϫgn9Iwň]3x۴U_#JTƙ׷D]N4ѳѨL5raT Gh\ќ#phN{|FlA$֦fOFB_fz 0.c3j*غY aIp:=se|.4ةĚC >0 V Ȼ夅 p>: z1Kq&= j:ViHr.|e(&ϔ9p6BJ{깕CINgQG! ?~t~B\T27(h73_W[ *M*UJ݄TK#a(tX&..(3nL4?'FKuwa낗2bXk3 ִtЭLΉ`;>KUZ5P!b6JfV/BIPЫO1*Jeh%=\^5!f kXs]j?^>19v{f} 5(~Rq,ov+ڜD!ԛ_h3v^\WR0eE;9`t:]k(eA(w|2)6IaX%hrz$S)Db} M5?u!q.vĆ[E?E,-Ot5jv>pĨhmmr.gt;q_+%XEY'Q,[c05qszї2x+n$ZH hM$Z|4i |?U@v+~B|9)J\]|47a;.R M*pIZF߽lw|:4Dwң[R5^kzCߞ!8x-%Jk3pՎԸu)a:u$vDC8La~ZdfĬ˱%&"])BY~`iؚ%=^YEύu7?weE$ 7FR5"g!tO g{|E#ߊy1?j{~]|~wϧmSU2 58+;}T}cLCFE-Hs:M} qӛ~wptVivc X(m3XyK[[IВ{]1``U?hpT( #;*ʡ]6*舢|~rYj` $W3ļ)Q#ž#]C$X0\dj|H\]=so1ZRttp+cw/3)c+I'|=!6>5$FZԉGO;*)F퇍o 0Fd9c;x=3O1-?eDcdI2WgZ6ze꣞Si-W2+5{ffaʟye21{l\hjGooJ9X,N٤W@ $0I"J] Bzt]7^"a%ɷuer(P{T ]vUHuJs -2q?kmG*9g\{~@kxf eOIk, SS)Z.AO8kY}.e˙H daWa?1$uEhjZ%/| &獽Mo'xu~˲‘ܞQ6?V x]V,б zCw=]}=*j!#\;S[=̫MZ-ہ>c|MFԝ[/F!7imxG0~[sIB&Y޲kυu67Xqz^)aJOi"sN_3%/оR9*giٮjL|T-$;*" jVh"_&'pSfXj]T ˶m8I;!u֋f`ˈN&ײ:c8F2lZnP$M]km?c\cB͊DNKCƾQh#*_?Di) ;'+L\ǧФ@S#4Bͻ볧he md+: $WX´O׺ d-ͤۍ"98Y.:v(%߿8+ G{$xwmqq]/~هxXrmƼn,؟u E !GT'jB/4l,r%ie;1|ٝ񹙗Qs2R0 9y9'H]EZҹDD1CM֏T^Zy2FU8GSn8yj,AssWCQ\C$&8{so yEHj+D!*fņ.c0up4&.u"#aGoE*xZNI!Y*_M< t߇{q<~JTD Jq:_Md'R+˗|_4e6,l7F[¼_C ,=h'lV.٣O@N0Z_[$qm/:oz4g{*INӢi9lQPq4.Տaha 2SѰf_Zpf4W2UPה4Y-v ̫DdL*1,`Mj zJ<ƌT>#aP_%81M^IgYUE]|W'9]FfGVK 狘R9Vq|7U5&`}Lzw8Si\q7?0ny((˸ȹ_mLivsb Uy -s^ o H6"B:<g0::Hn c *\JMh5ꥹ-x蔵~ڱ>aZ vE4+QUV!9>¯-JG,:$N~ ~FZiՖI[4άpP780]9Lu-J+Ax`[+[H.P۵tL,m0:/$8*Hl: 7nDD:ړܾg41-T [Sl^lJvk'fYR b 1j'٘1*Ff Y,l(B`8rߤ*H {1a]sšo[. S^#7P0s9d1C^R>2?W5oq,r&+uNnksRcҀVդݿxǒkExh&r{k&ϸ珉$fDYPc6X ¼qKI 'F9ܫצ\V݌ `ߍYU܀ g\40Ոf*K.I{acYƬIR|m{<%|MR!noⓢ-A֛!ꀍEO^C.yXـ{Z޽ +k̸GąۓQj@c DdwIZnDtN.4כ(شh??w=>ˠşh =Sc Dw&5AAجȋ2a %KCHPv:7/Ut3Q"M^==J)5kO2ŧd&z|mp"x} b;2(kMi.(2J+vH玱HLE9cml¼~8]ᐞɑ9*WO>e00#8Ls @~4d2@0  ѦH,Kk}g%+ђC$2zRžPp~HxApj4?~9Fw ;l'j؎SV"Rkz=g4 % 7xSf2Rth$hٌ| f_NXI"%|ś/UhT,>-0ϒNHQ>f8rm&HdDl9e1# @;c]Q="bA|R(.opmmqrJi/Eb6F$'g%ۑj$F܊~1$"&0@"u=ɝX v%BH- ^t{ǚ~ !\ =&s$FҒ<~R6P1O}-P/7P.rbNK%:C8+&swb\p (~DbYa0F, A8y'N~EJi޴,j`I!Puoݠ ˈVdI=lςOa40H( Qg4 >LퟍG AQ8ޅ Bl-G`*'mQcXܘ8A-8[BnObnzB#jz{carj<Ņ῕QZ%pF KE0=t`=iۤ)&LÞ㾮Nxt":¹ `\ž EqӈS<h$JͩJr ̉dVp怂1.h{GwIx<ӰV0I/ @QC}$+% DO*nZ5mBf#3"ey>1/Wp³U?Dz$CB43jt]'N aK?T`C;=]1>'܅=OR18,/}c$-PM9$4Ofgi 5S6nse~(`J,@mKOfH+uE$ ПO{$ Y|#F;3- K0u)1!àzՒZ]Ω5(&e\|"7 tOy/N RA|F8YyzMvҔ1I=6%NxCoc^/@M%OA)42:' e@w8 IhZ:RޛѠ돁9 DO p(2|mSh5L6,G}%p   Lc!Tu- '!YLF+}(bpg$N;Zli1U?vG{}~{2+$fpOM&-dlIE|m ;"jm F&x$ɥFI݌s|Dޡ.Jm)kIe;kq:%p~T[9oǝ&} ̥ʚQF>1YI~г(M7'O ?ׄRLo7§Ub^nV0pW|~o#j;y[SMLN7jsq/sg*_HS<%}i؋d>[4+Z2w3dHR&n,;|S^s=0T8eR-_`߈B9՟+Q"Ս2 x9=F4l}96%N%]I71O' 39hH<:>栧MG!&&Nplޗr*('o 3I( :Cs#<`q ( 1BԼi/GΎBEB cb=vD f*Be Ex?I$-bLq7 pY b aFMlQ# ǤY%YuF<j5eqа;3ef=hib1-P *Lؐd1G-+f&R^!'CѴ*hE@T9M^{2#ϐEA:s]Ṕ L]RRϣ]I/f-F(c|Ua%FwFCO?"e@n'44$[K;$A9k!oh!R/_"㜙Iࢲ* ZU1^kQlbT6lnGRųR=g\ B23 ætVjO%*!>!%+mP#`+iSBa\#Fx۾.J@QcxWH6^f`IhSI#sԟ!;%M䮋4Z-#p(,v9D/fL#x&? +\Û: t餠0X8G IrxVg\xĜy~`[ q22iH's!a<-\`LVla?Ғ!ሮc0a)Lb ezyNΌ }ݫFl^ڴ.nqI/g4r H:?ٕLAk1" Bb/M31܀8ם.@ B H<=DY2E;; <%ʞŠtNiA>c6Ob>?p#fP *9pѮt(Ea^mXΡ ZďMY7G0nKqStij9fHyqbZQ6"L!]$آxB xKI#5(Ǩ%|H!J·`z(a98be鐆s C]FveȈ%O:r~UN55Ɯ R%h@B?2\o ,_I2֞p6Ep\@$Rr,`<>,:hX8sI6'Le95ty8ջ yF`t7 +%"`M=h } *|A+ Rs`Y%TA8,Xo (%ȇBP](IHH'9#YdH I' >$X;GԬaJ9JO˃&jYR.Ĝ9Dnj04zC:A5I7iEhv /鰻ѭj6Jp|Lp6 5j<=%,x(J7tɪ\CcimD'B7ґ‰)ݷGww60dF0|yh'`^f O|[RK.N5cb#eFμi !6`&;C8`ݩ6822\Rf`;nK.]˒ڑd)`R\xl׹hu(ˀiI١()!+%D!@_ nQGDD!J}ř ;tc4c0pIO9tv zQ'Xmj䠵D֚~f} 9? Lw0t{3Y[ș5&bH:wETEa a +J^Œ(BГt,'f۞~ z!^8qH)X"xY; *v^6,'ًE*d=DA1O 3% Kt3)~^qvS>>NI[{AJJfB.^ ^ B~|;d|'tãE܆L0ؐ{c_5.2)7IzC\*̜HԔ͵h"A&.dUcHp %T5&zq, sO IwˣTɺGG;aN$,Qnn أ~,QksDXTk!c__[$ }+?Ǔ{x>RBٜ(RMV4,tEƆpHՆLYz_a"Ed-ePh ۦ0RetCv+D3'd{;FqBSyy*3G!LkvpCc&EÈ.P2D,22MI@_>bSiXH&tuQwvf8Ov곸>2;|ݻo?1] , 8 H|a IB0f$y6呧<ŰIyUvy3q &A à NG&԰9B(rf]ȵ|=!7I^bȘ G݇b]<\Ӕ-OQ:oKӊ탐INubr}KsH+t0$&W+BA/9l;`'ƑU[ zXp]xKɕp::e*$ʾBOUPĤ>pe)jnצar {.ìW1'>NbJ,.'7>Uzpf $LTW?J2"RImĒV= ]>vZy&Q$f1OcGt=iz>Wg7z7o )` <ʐo|J{ )Xi3eLY9E,.]LvtivpfFu5 *Ys`LwhÝF,rICfj` ($2DF[f[#_@1CGgŐG!h=<1 FT, ds&/m0{F'="4 ?uEOG(+3 Q5Mau:"㉉ 3UFc}3Xڛe j'#E^UPQ_Scߜ3=?HE5FkeB+8G֟Na9"`63\5Ûb&%ض,t o ZFt/}>3=ފYie#h#R)hD~P`" Ī_fX} 2, .,~E;n4)#_BI{1|[9xP?2D?!*xkܝcKYDpd7Q4NCyE&Nl81ZxV|tYGC'jm|mVJBpk;K69rV J~k^ >2%2#g1Aݰ -#T{[V,Rl -(x}h`Ej78]&t, i66)z>2(PƲQcDcw `;2?*FOʼn70_R7Pɇ+SOf:@ $|(=2|Z纒`xR{OVwמ{s>;-=u.oY0x)w(Ċ`HÎ[l #*>d69-lТh25W/N7i1E`# dmn^"uuЗZ q3| & #2±0#`)p W8F7e.e8b.: 򧚾0*ؒY_tj [,VuZIBdxG7\.lI-Dȴf @I./<}OL7у;5~U r#w088GK:.^y1e,*Pf ĉq^kIeChbA?:Gd=*#٭s  `]~ W % #goJ7hO!Z)(-NT 6َNdcU3R)oQ#Ly%m Bh9>rk[+b"A^)9t1ݯQ+OERGN\lÚfřb*(-׍mJC 뒧zM|qrO*A3) 7 q8c6-L$jF!|ţ7ܕJ!jb>I\I-Έ<3dpQɰ*D`3\#?{-J1(=Qt%尃z3 qm6M,$Y+ăTcrn8t$9);n/KrcNq̱)ƞG9.0f*'kƷ/Odcvh\#5Evh_}Kxh5d^nFLDދ" qLJ^%SYC>}-˷2f&P_NXKh2B4kA7 wE8}c"D$FPvf]ہ?bPJ+n]eIKO:6xFh$)ǶxHlz"1dhi~$Ǝy E=cXy1EIl9]M/9䁅$HL 0$^za? fu.pc$o jÙ, -^ id7!H㐗8݅Ig&rH%!k/)̏?JT_J#8Om+*gTo.΁jK^`G"{^fa`ޙERѠ + PpQf'~b0y1&GF:G~aEZAyJ%GC%V5(  xK񥟦:SMRa]7E$IK4'fjx0cWg#d?;b6`F% 7h`LcJ.P8dP{@D)aY"i:BB! 9&ȧGL+L:!2,H~t`*nݛ<v0b$V[K5~zd$rY4>$xPJI-OJ $ƤvK h&ñHӟkrGuD3TTHXM',Au ?`6wF\4#>0d$/xPSM7ݯ#VעqYk 5G& ӋPM?Ysos# YLױc ܉r3X{n$wFUSbs`Y+f\<$. #vvSeXx1##Cuogj*NA>Ho|475"iцsFv ^{0.6 ΌʕcvS r@r(p3-6f;RNYXfaR bs0YT՝j"L* YC !$:z~;bvp?A%&A+{" fxRҌC% { Z6a@9ϰNf6ޜG >$ht5x`()O؁$GxA`m6t&Fh|.Kvz;cV.XR H, o<1!ιo7+VlToϚ*4Ѐs!he[oFđhq6oK&.ghص̝OѠP)F1Geٔy 4&Cxn3!f}w2&vVH?譤d.Lx.$6vElv }C-Z`>A*,^zASP>0H ;l2aVCoK5db~EY4gta#BUkL\İ4yFLx%̰cRI *ϰF kȱA5Gfj*fLdA/JC'EPVM? .P/\#3ӧ:2O@gL}(l Uj>K%l74%d ÌdP#fr?WhUIٛsșzοl"q9Uōc?Qt}:9'x]q|x(TZ>Kn~p?m*2@3Zb]aW)"SY憸CB%e*ÝbR~ ç0!!Q(JlR`nHc"YMƧS'Ơڛ˜x8vp;Jrg9Iu7̽Sb@ "S, ܿ>Id]bٲjM=)ikg1,4mL"EABr4yB1Y"j^GB4jIIܣKH7wk6a [;*50ZV#:(z~B'e =9*5c7rUJ_]`=>~8ZL} ]j/\Ƶ&BU}ցd1Q|d'YشTa8~BۣhՆªy/egm&H/Iؿ,}GCҾ(|sz0BEaNf77ed^=~/޸CnP9 h>"`sGuis8Lja$'tqG8|:מZf:(9ȩYjlYK 9_ oFM u_I'Q27ZW r'opz3IIt Y: rM3k^1JBtuەByѵQQ8M=1=Oq8P?1Ğ2'[BPzL'N'6RA6ǬJf\܅K[>Q2W<6]qe %Zv3?F01%@,Ry%p^u:˞";m}ϓw,򬟙O`?`˦K' mXjzq:U gK.C)H>Ҥ{g(%Ћ'EXHX4$֖sBg,fi{ύb=LWHP jk!51dNߏ0? F٥S ̾wD :j,}Ԙ^٢X" myؤN(T摓QiMs.oMKD p V=1 Q+}RtM*垥G8#c!Dݴ`5L{ǺFl6nȁ­ӳ0G]zQ16%D0S&ԢOϡ+9}xlG_Nksi VRC$囖YїrwE)tˑ32Z!DZӂnޞk(A.bl!w`q0$jؔCc{mlJ(30l@N>m^v0&i;N`!2T ?mh/>b2,f ;h=)1Dh2k"aJȱ&$u9!|7(Eb-{Qh@c\Rgʺ2J}-Ԕ::/I@q˻f|CUdfOAݭB:Z{  FMDձ*8HKd@z6a"DCI^`e$ aD(Y.;x/ҋ":3!)l 9r$Nrz bwvb*j hǡp?w5F="&mB~Ӻ. aDBRK^%XZCv~c23j?1x[jR|$+)h9) "Ēh? Աʋ2(olD]p,z⾋wђ ,8ϝzzL=7VyK9JQ`Z wQ[F\XhGN_-)R3"v7G'[4tL#2_Y-٦-2)yކ:ٓV[xkdUPV!8o{UMS; 5UK! &L11r0̞lIDKbrQQ 8+T4ϋAXo.[o/Lh"&$,Ld­bx 똣<-(BoqL GQORX<)MA{B\Ҏa&-H0\"ZػHch`gHc(od ytAS/MC;VUɭ^9 ~řdI5n)^.> Oˣ me²wܵ(ΣHʓТiF<9C"CԊ-HѓHZ'' 9ȵqF^XfLMq(HɏI*9R _@X4(Ye$٭\!ǃhu2˷u⊟AE+J7o= E~+=ƸX8Bˀ&|bt'vjY@"@$j; oe'LN:,'띮H]^kAPJ裐'w+t?Ұg 9ڜ sk Jkɲ$9[Sx2$#)?FxߤQU(H-)A)V'݈'I+LaV;j#L[ɱdla3(}~q$Q\0~ 0,ah! Y"¸$ܐ7 90u.h09]GG(\00f(}8#pѢ˘9IN3/@ i>@j}M1g0zK!G'أKYIu'E>'Rє#Rx.zT#W$v̑]T9ĉ}Y5μӳG wH,ٺP84n>}dA8&BY+Q&F3gH[[Df! hj \c_P_ EA~ul0:COjJ\L=dmS!(\Y"w#E&x褜?l>ӪF$E5%ݾ6lLt8 StaN(tfBPIn<ىQ}BP[,AŽq2äx|' l6A Ȣ9/Cd]M} ߍtPPeyZ6& h %*,ҙy gi#R1ɋtQsH 읩<ƻ)!wx]b7|APMԸ6,澻|Fe|[ygd(1YW$O L/!ՌKVlpJ5\A0͒cX^RH{>aF;jd( x.Uϭ}?%D59<1G1h3{YqHOa"Q#1W4`rD?*Q 4}p &*aQY 춍|ih:.|+eNygHCDG_gV 2y#Xvw rWMai.+,(œdBĮPƟeB 噹 f("R dR\6c\瞁*O)$∍ g81^/ ֚M؀%\I|980+:}BtR$;_x4h [5 :inmB.?[,+"6z3̈6 C$,6Ǣ|8m[> OiaC,Ҕ֎9.-t5|A|8YE^\'0$ާ9WBzX826l!8=@i /ƷAR2p =Es4CSq6Pp>~,칑xؤ!`.Z)ӗ'^'b̐bG<(BRDiAQi ሻYc~2<"2|K d!1u0gcOYyXH;C9.`f AʹVS3nJbROvm2ep)h.z5ÙNөù'J*pg9Y:D y6ڢ>X\QIDA 5܅6%$檭 hq*0⎳a"8Av]hEz^B(t*!SII,-ĮBI,wQ6P=s2mlzK%?GӵJ:~o*nb$iIy]s113D=D԰l7Y_h Nh#* :Yľ"p;Xz59"VfIC% o:3D# h"#}Xol"Œv|$HtzMQe奜cG\?xP)0wcį}(U<B';~tݠW0| h/QzP5r0#OA>cDx{]4[ω4&Òævd8cF%ӱ&X{ Ւ>ex2XbS,̍ jKOȺȞ, %0+$h쉥w[ 1v} {4o&33%BDnP4Lf%`dzPy򃑴?5&2j(8m3AJ O铆WPD4™!"8(N!uU=>.D}?)nWy)B&,vD޸3ǟOYVu9?u5*! !"zEk8"IE[У$h"O bk|83 PZs@~Yă& +'r>GG9~ гG$N}lw3N<7b ,)F <*m6^2ߐ&L(y)d޶*\*԰z9I ˏL6+E!`RJ }Kī#'-I!J D7 "nmM΅?ZzsPbe(L D5*5tYɀ cU OxP*C&O-WnI:B>(TAv!,{zN:16a(y6lp"M2T{zxG5tM\aVtHf$/2*hXsJ>VHbWKv-p(AZ% ZJ A<hmE`aȔ9 :J]3AeAl5R ;-oϞdE$MȒmnKdΘ"'pHiⷣE@zKAq/l2 &Y& _T32f[b!nyDHk0D9<}J>QVؒBL WL 2=kJ0tH*RWHoR@Z , ]I"3pzX,Õ~-'FsWv!n7`)Ҟq ##MCwB+U*ێAcMl@&R1=5.^vVR0%ɑL7/t3bP ZIb.w\!Fwn֤ۦ D;'x,Ĥ$ uFA\\mh.XҴT0%qP^Aj5F#r+ @Ļ @389v8mu8R4s~isq8>Dq #4B$/G\`cո4e\;WJɦ ~ žRnrPsW~h%ɚ4!6 ^˹v$kv:򗪬vBbKPia}@HC7),@ a֕r5tTCri9yQ٦NKTA~,#yɦN39z=v8'g Ap|7L,lQZ#ͲaEW=Z?aStg ܥn;5m~ q<$_h٢%TA/&3;*pөcyHWLɍ;f<XJ#@ӆ|Cu ^TI>A!GBYD_c,!͉O)|t0!%,0dHU=yeGLd4Xذ׃S Ȋt8W>ՒuqqDXXLQw.f XDXPbMFH)w. P#|V49{=/ou5 r'"5W@XMi\-^' P(#N *i Let97e&\ މA:I".vy3n $G "Gom6Z}ڃ#0@dr2CL1$b+H8o=fFj@ x 2sX%:hXϦC ^D_+(ΉrLbrXt9K&}Mae, 1!8[7{.8qw"[e_Q f#E &l]c qCRp䏈yNSS"hOr}^p,L^{/2:odPP~(qd 22N2ilcaUQoƽ1暀:9AUMCd¶P$t1C8IH dMLٯ OoLx43 % #ްcK]g4>c1_s zQt4Rvnso (HRcJI`GHOiWј]"2 9%~ȍ_rDEA݌oG5*v3Ж!#QZѫAfmx;'Lf!kSSSL&M.t&5aC>&M&`ЎgJ}>RCʛRuDe21lg/eEu @(1:B-am*[}GfB_KhЄ|;G^^>W_;:0x Ca:+mRI^'Hh-'h? 4(I:fJ' лƮ,$aFHa˛8BEH~5Y?ԃ ~@DFpxȊ[$HrK6#e~s+ A:65#x>J1} %Dx"kS=ٶ(hJ@7ܔzîm*pDTbm|t~J&DOFS"*$Icr åWX xCouL.UB|eb%(eč)TD>ڎ@r8uXMps}E\G" =MсΖL"Y?15^RFo3@zef"vj$TAEG|=tJ)Pc665.JMw;{z!WJѝ ho$ JE넸1.F6Rxq (L7,YDQGbGp(f7W#G^a#08Nĭ%S+[9;Mg#ʕ  lq]û47D'~jC ԟXPx =OX\F*~A`sXh6q4g0B QL3:1 IF!s7WXǀ8b|1E2tZRBj1 /P=K|-Vˤ,b8'`xxaY3Q(x$$`A)7dllH44q]{ p]R¨F4CBB`'͚7 2J`ax$4nLXWcLhaRWt@qD3IJ wCSK M]|?%od9fZ(q -#]e+^j<7GXH:G}EH7lȑ=()Q A~?Vӷ_O0#>ue40BFwJ!Ud{H=1v Q`Yp+h;|h:7^hs b(Ż50g)gl˰ Q|f\6>A؂%DWCfEq1N5ٻ8InHlūx$HN3ʦ°C>f 'v"P:1[Jm(wұ5dѩŸ1Ucʓ/0Ryx3!8IGG! j/'"l4 '|5e&YCy0Ga*iQGKƉ"n nN`CzP3>);Cݱ(z1%d-~o pD7n6'nMKXP{'T]A24kfA, 8uy DO NSQ.ݗ,o鍁  "AJ"޳rC@a-!u]ga2 5 7n 3Lnc%8D] +A>pN nt**sbdxC N*}V/٠3! yfT%XIUʖܕ#`xM£A=ms;c(w*麻Oh2E4mLCJ3@C% qQ5܂}R.6>er"8qzB~?,>PB/V! ?ƓnRL[tO2c2`{ vإyad1F1܋d dkEaS wKx N24Mq2˚{LH>7 z$VQIN5,N v$rm TM=BlQ$8Dg?4&|i)5c 2,#Z䪊dFR1Hb,\I1!D ;Z'bw҄E>B9]:LX֠#oH@ |Zy[7T |ߙvwD3 9>:NGhWQ!np.3pIY[+2zsCKHN8Eٵ9XA_#d=f816sS6~M G( %$q1pWaOz|}ٻa+k,w>|?Uyߔd>,~ sTEߘ\m!#t{!x:Nsa* ƕy`u8#I6,{R4$^L '*= I]ZmX~Us;Lڍ轟9Y WR`k0 Ybya.Oe?vbAᖘ%zAx'~2!\!5"`X^*e7y>g,|>MtŖ@UdzWUмN'#멝Nht}E6c8.I ULl0[75ttz9$Gā_x] m &"x?+ o֮YcQ詝Jo c<[)!XwJ/ai @m!UhBF}7!QG:haŽ;7sdF ZJ`ܛLaoiPڟbJDuy;h'(75%S+~-@7uI of6W-1/DCc_zD "+^Ĉ%嬴oY˜,We?w45E =V ]9\qw ;0J1(SIy] *{h2 $A =/NJʷ8QsVG69cD"!&γLSPD-BϩQ 5 ۀBL9+~ɾBb8V}䁬` rr2k3H z@LŅ4 X2fGbKEY 6Rǒo" .rl'EZαW mi}vYM`@ W&UExأs]0rCܙ=0ɝ qVh#>\+0Բ'WXzю9W-l! "jBpGL,y„@M)<= :(PyK?B)%duwM9d p nrbJ~簹o+YJt~:.)C,E|$c/(r$&& -+gTXp54\B| O ߨjZȲ M64ŌP{Ibid0cGCaM.m%(Ƚ`~y9)SB$$TIm;"8"lT!rcXahr]rS稳,mu\\]HۣäIG'^N^3x[GPY nD4F LR+uy"\!P=Hxnhw'X%pLBtshbwjh8S:0f[9m Æz" d`d [Sd}Q uJVm(&J#̱K?}S=۲MlbӥÙsH ܖ <⊵tFC&:Ҏ"He&XiN(!`$v\>B,;T8[ac?d oj5ؖi؎'dW>;C=o=SxvI$F8YXڛ0b{hv<Lה M2YH+QQ=e{ҋOiEHJ8X܅z[4> J፱؎6`P8-Xe{` xc-BFMREqmzʻGvL "(e'žooA=XL*ǛBuvA|(qMnumZ3&Sك~I'k3+mZojztz+ d΢k.q͋;|3ܜʘNӴ^myLw:+;bP~ucd2Y4D9\}@ă Fq 0􁔉uԃt9"*nbOeŊI;db$,l ;r Q_(8WbhdQG6U%l.шp` I8lwLwj]OLƟuIp l1қ3$o=u2AuI5cy0mNϷOaYĿۏt oPta#%GzjVoS;YSfZ|Ue#>ٻ;S4glrљ)7Ң;u'RA#RbCm/J4c7*OFWSW@KQ'E_]˺L Z$qGFU)3 fK__JIOXnayA!O$p I@Xklk`f `P;80TR&GJ "bo6Л{}F(v4/駨Q}NbҺBVĈˎɉۉ M%dSg_/r͌PH:72q|9 nlrY3IPJ9^QH_%eM?B ܚ!' so5Ft Ҏ5TivCB|9q W[?~ @ђ)bA"$TL `Y1*pE&u~,]܏ Ic)vLZ w0Pgc&̈́ȧJIw+ w /q؉xJW)_٫JXWjF7՟ꓓ1AFTV봓PXy|`Q0/@}/DCobec# K׹.VOtcmߙܫI(#?'|lҚD$'[3KMZfv{JB~K k}}.O:h93 tt hi]veѿvض%;:=\Y 1%~4n:Tb ץCIR3chB4c B[m*},PZER2U5dU(Ba$ʏDLAv"KF9fG}&$әP]\ee0I!HcDY㲮'P;$ *K,k'Dؕ菆avA W 8TQQ<U,衝3܍,euqzl# w8cKe!;*@=r+'i-Qi'\]ډBiFcM$:FXg2-;˄a`m+=j+E0v;ߜlPgr?]5rg&vNXʀ^䳷~A,I{ I%Ġ]z/1 śÜ,ro;\(T%)~G,V_b;ƅ˜sFH1(vFo\oMHG/| Nub3J|DBNIM!2[ 9Y)CFAbE(}K,9̜id;e2 nRg`X$5uw 0.$Lu;E $ ,ח\ i(8T ɊMI wkĄ6_K(sh7hZR/ri~ځ'3.}RNHZeab/ALrp|DCZ;rd_LILvlmO15(USGOߙ y 6>ϻXB?#ҽl`C?gxJqH$ĚF"{j sG `˩XfvY[== k0_| Y &ګնgJ! VP>@ڟADt ]Rj6+(,d15+="BB(Ta91쾌ag*^FKJd^ }=ZS:ג́>Ih$4ߊ4"\!QMƴf(R,&&8Ih&@@ K abChKG`~2qi;Y!V'-Hrkϩ QQ ?Ex|Okc7Ė9H-R$1\Š4o[66fTN TR̫ "kGL^XDh 32z,2򽤉(0DvIEP4-/1l'LxLv]Op蒴T Hj`vYK^6Cbϙax Up0B?~԰k3(*Qfno> |[-}fM/~}Qsphl;*S'L {t;=_5.ùR|Xv&a7k ;Q,d*}҈ׇA?8l95<0FYs\`FIR+dvA6Z⮮ zR°6Y_\{>?kzs+" v$w׋}"3/IG~F&0}rB_ٓ\(Gwå zƁNYX#1;`iV>yd,PYJ,8]ZOW` a(/2h MxK:B –䴒uB~HpeFj-L1zsh A*/ %^:uO߄}G`rыP/wlb5Ԑo% EUY >N|3IQ7$H_K$ %Ck -#,hnhuNj`.x=%],N^{i^:e}'BnICI/p:oH ՛*6 I+mIߠWl{|5!\7HLxN{e8"t\-Cz$k'9DMR.¤eG=oD576(f=|bA [RsVd0fp\zwFU(60=4 WRYʨ fFFPy-!?&u@OV5XԡiE\2K0uxf;% Y8Ac:(rH5HSLy1 \#m|cg}v|W)^Ʋ CH0Ɉ]Ls:By/瘲zN/ q/2D>{ä"7cqKFcLsb{ًHcW?ߒ k1pt.'O7rNVMF4GRZ)t'1)uYl؅2MJ4~RV0<}c?-:=e IpE<Ѱrorth()?"a#F2-pI`hDE 9{{OE!%j.$EѾ.&QgDNww-xeP(Z E-i\=dB B$Y`^ٳ%AЪ>F+]&auuzGD;oYRM+qug=f }í^ܟ]ړs`RJREw^FMqC`\~ Ɗ9dl f`BNg͹%)wLdXV,H~扃OF8 dUxŲL`T_P1? Y^Op,ܮ堍HFOb ">t:QDkSTreM#IsHֿ "Ef0y*gpRۚ)r^ '( u>欹.d~CbS%|`I5>u񿧈( t8Uzvb!b1kvia-zd~y:4y zKwA!cP{:2]G)=cAn_ qx~>;*NxˢE<8;+UNhdErrJۏ-nPԒ0"X TL@4̒?@Ꟊyu`'|}N|$R|3D{z| . 1n pاZa6]OMƏ9 vNEKs"IZ.!.]c,2mR6Eei6BD*官~nzS7\2H[ <h:}Pc9Ίxr=$֏?fEPI)|@<Q>lIY5D :."?r4knl`SXc:_,+h'TAت[t<ꞱL6m пyrq zR7w)A(]dAMNy,.Z(B!#E)nIv􏀇dXĺ|L|j7. U OT?LXh1Mi ,{p*P2_v%r1`h%5ՖC:(CfXUZNn}1?ԕA2'md9:s4jǔ1. ̱2Lpw|Up3"#scؚNE|T/0ڝE>DMTLs(QOÚpi񷹩4'`#NȭM_'="1+FEr x#pG&Fe嘃BiQ# yP.8XҺ L ѧIªY "fRˉ?~|k$wٖ rgH<0JNɳ P2E҈zS E?Y,#` Z~i/Ɇ!C *,f)5gf-D&%vF+B"F:!sG'L"Y>Rd7 |_8ڔ']J)>(7 JQV]92* 7j28$N*Odoe=G_. HDny#ʗ0@N`'ZcԊА]9>VK Hk0; ;2 ): 2ʾ+5RQ.(jʱrKh6ixuH48q{2#.;3c̞PwIc61YA:ցAŒsI܊+_Ғ$PEtqI8v6I8~QY`qA:JoixѮcc 10MQSѱE-]K;꼋umJ칝g\Da:ҦO%WR&2tƅ7l|Mّ^}gk_)«ԫjj&Q/LVGqѝ  If]8"H\ąJ0evL,1b RZ#`alNR,xI KCDNcfgڞ~>j [EY1M^8Ip-fg`#>?tHLbST~mL_q..EJ4NήtN\C&翶D;^0q=ԟe \2xMn? QY-ݼ%G]`26+o qÍ} )e K#O gMg^Yy 8y?%EI xz7ަHQja˘*neTӏpa/Zb䦤XynXn_vZhc D |=|t EF Yؚ cW݌$XbUӛ 񽰔X $ 3x^]nXLjĢ^Hz)F2ԛ6.%;| !/da͍ iR.vh$f;EU\Ec1/r P4APHN- !2zEV^NU|pwB`J &!tAv[Tvg65.Bib~iNԺH ?&~|Gt|{PR雭smM}*zEl>ay~q/L*{} h?Q 0Ĉ5O[ZgHѰ"Ueje]g1(@&~ t-8e(̆O^.oя{Нu7zXc. Gt 7Cp@1 픳>|S3xSJ3Ǣ -R:t!`ɺ);!'H>_c%y&FIГ^eDG:P&ܽj-nhɝZB ]8pσh$Z!xcA aq !+jwMZY3Qﱊe Z> yYT >S[qa!3#C2I=$:8auYx{4B :gv2YIm{K^\? OA`d͈+ 18>d"XKẽE Uݳ=Pl[.ёE\ږS0{dz\ \'zޫ H?_G>~|2$c,WܔfmQ,C ;VK;tf%@RŏB3ĢуLC+/ΏDL {>-Y}FsqZ?O6o6hzV7e|Wt0b:z})_H᮵9a"0QD& `_d$w^e Xb 歄'tL7c;U\3&lőJ ɫ'q{Eh,  FUʁ: 1DCzDC]n%Y4֚\7|ݽu~&S%,ֈ1L ]6N!.zc|c%tIM 'AL#t^I^p ^8(.2XFH^&7}?n|g}aaۚ#Y0(jFØqEЋeJ"Řq0Ú#2DA!p,紫h]3&(;8`Lhc"z /O(PfRSp'1##Ch>WfE3!NTz5+@{3X*sZ&@[}ijXtŹWltoa׫}Ӻ7Ǖp>E#۴v򩳤}D1^2qؑW*$w vQt+%qFB]FXg~\ q '8' xA Vت|sc?('fѻK62U}{/KjXq|XvC)%'XU0٧h3}B`ߝR]It~NVP*ub Mdq坏vH`פ` ,B%!F=8FKع 'fdYYsF cNpX"2l+áIC-S =\MXkēCf7fnnW^#ɛś E@[}$JG(ghUs.L ت ~7J M[(~`j,[tiG\]<\3z{6cX- "a=* !)d4+~>c.>qTnޖţ d, MUs(޼M!p^.ƽope37WHq~&p2,A 6dc࢜a=N9IAu'(j)DA?bLh^jNYJ 2pA;jdd՜/A_@C!#W##יּISIo Ԋ;t1(i(baؑl_-5A.l@ ?i|M3TC#ݪl7Q3`v%j< MR`?IB$hyE3J '9BFKJQnMYPLf-,v$dmdqE6lRr7&2OF8k$ WG HLRxpL<>,T [j׿_loiw OG7B޹HIM#`> 1!2#(YwK[,窈2+4Ua#Y3J;_Z$^ {A& e]JNA5qNbgUذUKP-yq3"ZN=%~PQ:FB9U}[윒Y=jFM-Peb.=mhYp:EM SOtWpG*ye0Y3QI'ㆮc3驹|{;eg&VNmMk]:\l5Ub]DcB&Gs2J6.;f9La`,'Dk;X$9yb2 z$r5 ?(264An%/YY> ?b8r!t3g.4"&f+ ̉Gadp%Ց=<}rtU5Ƣ܊ʴ\O&38aW˩/דP|a3 3͒$&S*G:s\=3tuF^_͘aǰ0k>H0eEѓ2ϝp@an !)ɽt!O[|ǁYcl]-S²L5Nw E_exwScY8}mhѾyYOI1&$9I¼sddr.hz$P,8&'qP 0~XTh`H?) l^EJ[K=lNS9s%MAa>Ƥ]W̉QfrBa`m:%1omPe_ۆ7py}O2-ՇW~3 7]XUdzʡ>)tma`Nj lF!;b/{;a 6ukVK% QE^ؽ: EpLYľ>3f0g-U4kU+t`l%Oۉ葘G(Xߋ1QT8ӂwаGsqظ:ցh$CbpQTZ-HoR!jʙ ZCOq fFB4Gw;H8oJ2QaE0ۢhjB!CԤy[.Y].,kzB~hE(q>+8Kmgt>TM TCȢ!*}stba0 {3PѾa+ckL4VWyb, '_k1gs ßfPB{18᳖G6/VX,XwpNr Ow%gGgh eO0{a.sby{llKQ;,ܯ+HǓ\I !_#}lY_5LEw䒣?lt_gġYEę'!r 萎,d8T` yq1ȎZhj>*j9õΡÄŰ[?X ^hq>iYgMY+*0v-F?D~%H`午ynsK$;Ef:(Ҹ"?E F &(A$K LF(y`T $Cw#h-PN0PwCyUM2HO Q#Opd{|b^mWRLynb(.rO0<'X.cxKX:oM$mD!F5P,gژ ͚ZI T?4>U1,`RPTdAS^0V~IqH/!l], 4g.;L kyM); u; qeQG/ MCt#1H!Ep8S/@F"~/eHX~׬ec hCAZA^˾F8Actf#.ĄNrhĜnɀhP=BL؛(T_"Qz( yffd9lHb(j3*ڡn`T}:ۙ1v. bfM L0=&޳.]!8 rПŇ0?~D'|>#^w[6}"=-:%-51j°ɶ"𾢀9LE麉֬l2Yp疞{WZ 9&]=qRFjHH,kWRzU5cK5.0A.-F0|5ʺ mU)@ XOAS'|M`GXxd=r_=%l4 RL0H̓heB=i 1Fo̩&I|.FaqVePȎ6sS6t3bJ-.%rT"bLɮUq,\HVevw-0̂~~c5O4ŊH̤ei ɓ-cL༈ⴴjV@3yb|Q,$O})YSĻkgeye:˾U➫,|_\w\r- JUMR9G68إI/3-8aX&NI&,0r4wS}x̅CK@`rNZ]h%q$2 .WG_Y+@?<jFE_B.iz8E.Ey=X.9A>,Os>}XFS6>9F(%xS&hOHgl;I <4o4VSy-DN?"3ٽŏ}/YԔ!j7z9׊#~,YwU~2 M(dU %Ą rjXk W:,AdߒV.leu1xdM8p 8.0J5(@P03byH2S6NlřQsI=&de͏~Ͷ-q)ܗ&P%q& yxpIwfJm{&c#N4u'YpP2EqD I~G36e~g3񵄂%8UCXR'oU 5P1W=i2[[^Ȯ[- zB#)4cIQLT/y=O!cȃ|2zX\Y &Q/ʍMI!pTR07~rǘ1kȱ,2]4f \bƛ[GV*( ^DQ,E*UПCfӘ:rbe1*3S"K] @[]E .hxH>c&OpZ ingDHu8\.~; ؟\#ТMk5q6z= !>Yaml <'0&ۓaѳFl$6X $6UZXllҌYA;;c#kz##sw]b'6Mb8i4-i"r>KJ# MP<^L8`GUU?d Ѝt-@zs(16 W1;Gd͖AnmhUɻ nRp I{-‘z2X&beܘtsJe&d`3B1#;r\ #蔟( ߷ H?FJAc L("5;aE0'6[ DFv('$M20/O\%#̡1W C)gēfIї#V\39&4F91\%sZL6gh1}Ն߶",̏&D&DZQeh- ˜(Vӌc0C&ϐ='e>7hdу7K-)$AKG,IHN$}M(i S=R_FMS=lS0XΩYsT"U&S@+#dln,\gr6CIQPt*ϓ\ΉT0g suY> ;WCuNMٜ/.'$3%uGNTdIvth"["eב&؈Q:u4ĺZvdaC_e(ğ)u 3ԄV lgܗQ+l!RAo} 5Eя5[FTLɑ*mC[2$uv`p=hDRV0LEL0I Mh CF8Mq5%IJ{lJ{z*&e5WMxE򾣮Gd΄q-p_`F(zY 9]rsPM>fG ZoCBnKU {P eBT #8mǫ}\G25PGK-Ɋ4(\l†04IkBH +hEƎ:.2:Hxã6 {IT)ЄɨKHӂVRÌ1MDS-j=i3$B; MU&$ Mt:$d;wH?|,ݮp6Ty6GOԵ{_LJ,q@5#n :[>F¼m12v6dFDN0?QD.e:E3**h.\gR3r6%oʥ?(IFg]"yĽy}32ը|;D X=Gbt٧t53=sDPw*i ,YU $ r]fO1 f`OpLk)<-,Qe9b)*rfiG1/Fcǀ:y1{u_$́RVUF{x#LٻWAܑ~_5({~=oA[&@HU}B%޼ϸI |ms.& -I$1*4n4 KrS<5i =$3ہa*ƹ&$:軠OTv\KDAq7/2O~c ?>ݳxGļ1C* ؤK3jM\N<g )ZqbᄢWF2ܡCPXCvDGL;Q%N ]?^뱜;jv.ʽ:uU]ݹq\cNZ3>!`4pAvQ@+90 l "]JA(I6P\tb称Wћȸe^dF.jyv8}͆ھ+aS!=e*[Ob2kq2e'0-@чLBP}]8IaE? Y5Y")U59+cRw&} vvfYRnA`..gDcޡ:,E#a(fs7 cŰ^/LQtz*zuK$#~D5EG0xߨ8%CR}دiyLBw,{r sehseEn{-Q^6Ƨ,- %G8N ?c}7#1+MZfʓJX*3x҈4x*m |F UO1HǏ>c,%|o>5v k=ZϩH=k3"^Md6OnmmN%GC.œ>5+S{DgǻY$6-fn?gbK`hӊ/dz8iLhH8@gqI^2QD-*cwsZTj>s:>1c锦8Q|;*!eUZD؁xNufl!|!S^BWG ȊbWT.'e tMS-gi$`v+]lU5-\˸_dG306wPȡ8l7:SpRʖɘG$ d9i%C蕞%drIPݚQn ;pSRƋDX:`]h (5eiIN-=$t(ArP"&>n9(gcO cj4~<0B]Х3W8T0KD∼;'FaZTir;W_0kӨa mmh, ;C]ˆ|yQ)r45W=] SLlY e[&>a%9ܪC^cn f!Z9c(nȱqj aZ8r>%[d:&?>JŖ3 (θ9q5Pek"^TQoWrd]8K&u7 SC)E(<%ؑMl=x@sc s H,Ah։J'cbZ3N4$,'T A<7QWG&U'vd2R4%K9RRp2cLD"^Lm;l&eN߹rcu?;הVtxy]TGDZ 3Ss^JX V/ DƬ0?O>ܗIg5'XErL1Ys!t^U;gLI95$=,+9 'S0(s2#4DiP_4^ (\Ars,ZZxGI#LK6?yH͗jX H;b,h|"LQ12ɹa;&x;e!eW/+?5qJ6Mv6PŢ4CMfzXW􌣗hd{~Ny/`H&)iR+5bnSq[w mxpC8gtYX5sCdS"OXrt5{C0PK5 ! Dh y&NUy#~aW&ـ+SaN )%wpo6+ɑ}@_#(L/+^/贞4Qo61uFLNH^[KLTk QѱAĭ*f/S;~6LNTRSc ,yKM|Fę[ %q@SFfE\׾@δA6Ia5LORw8^]C%Oi#MCo Зb. \=spIk1B3DVRڛ]oᬏk{bTn/&*}w!=nY*x)숫0oNJ364L%%L`OK|'[u>FɢQ#x"j.Q1w'U$31H&QT*%sJjyP:C>T  t2E!+:9C+ 7Ԕ _!sΛ^܂B: ac%Qs_m|=LõH)Nꑈ.|%)f /=OK9LNQ3B5GU3'{JYSGLCp3UYz`USZZ'ޣVD~[k up'XTslWs\_ˬ!JKHg#RPK'P&J,r?mK82N=º-lY "ss1p'+3jmzH҄ɉ3o{d䉭aq+ 2aFBLO>t^'Csѣ*1 C >%Y7VnH˾#)o~&V?)}sS `ِ'LQ4 e0{Cd05a'fVz:}Zpq^˱.Y ̃L6MvdNعk;1J)ֻ#`(bv#r [˛CabBd!20x@~K!q֟$BᗰQ<ba36 y;U!˶q822_Π7[h>a:z}iƌGʑ^Z_i;iߦHZK?ak#DzQ l¨l$d=#_HQ8J8:] ({͞^+0CsFQC' N >Ca(lJL 6,}ψ,^1кj ! 'yƑzxDg 2Űr)ےBfլrR> ?"xgc bP)kJ,Q5>/Ts-H ŏq'!G#Y4=|W(#ZFyG7IQwtXKX@ 5ʗMM9z4X5 % 5 3tȕ^7\h5c%SI,ʱN K'E Q2>3L$m(KcD|T'=O$hG`"tNY#ĎM&1&ܖ?^QS>p9WDa3x\t-MX\nߢ2O@a0 y@ʎA$&HaJ'+U58bA!(uf/M' qewGnfPyD 4evx9XcENP}?Ms@).irܴO-B(xT1ՙ6&GQ%t 2֡3ƝylGa!"(_`ӤMI4LwձcIǡ2#9Ƙs=6_~߸ZbI}rr漱^,I a%\Wgl'Y]qBI3pL:8'ȁd9`ẽ1UXl?a 7\iDr1Ҟ$A/!~lclMunvt췌\-6z^pPN}usB8gJ!kKR@)>R\vhC =UۏfF^W%U)kӮoFO5]< L1,#'D1㗦qJV欤Tf8$#NET̏!kNpnMK|`N} ѳAd|"ykX%D0P~|;.SZ3; XJ݃L#2pYKn#z @0%.9%O_Ln "Dyehf?|1TmN/bB92D E 6(^w<_X6LMV9D HٞH["C51dš+@:;"^t2 gti(X9>y\2 k,$,)?m#mY9DAl 8̜cX8 ǃ.¡bU!1K@_0 Dԫ2YfyϼKA- A0QOX )N2߽%EMEȰ% ɬTɊʹMAˇ LUĨ5958f^b֟Ra,>fLU9^1bɉ攌!($3ѵCYGb|QnJ2d@L+IؿrL6Xwsɶ|dZ+.@Krp1«VC=Q+h]dNWZl,;ѠlyUj \ej'ajj;k ,Md"зw vNNl}NHLe]ŚkfŌ AXE/KLc ;ɋ?XkږAR_µG :͋qfQMa"ENԱW, AE=oe 0VBˀ~.@X2hIGlNa(lERZX|Ed$R7)`m6mF5*c PpK;샹H{hH;??F:>uS]OmՔ>4:H5b+I:O,.񴴾~m鏋  N{J.^=>1iNرi,Uwg_JԜfEޡзj|f;5f乇o_e%f%vj7Xrv;iZ6^RwTgG0pUuz]{w*|JxXӖg~_ki߸{k%]AA(=ǫU-iے>'xCWƎ fcn2M y/{+8=3}uDᄔq4B5\hz[]W} _A׊[Sv0+;տCyU2];ilXR>f_Im+S_]Ծ#b˹ wFDFgM#A&c|NeY||z%0~>}cnpW[7{m,xU埇'x^gTicz9o5Mgc+=.N50]pSޅ֟Ҕam*^6WW5^]teᘮ_AXJgѷZӶ=kۯx5,CLE"n`F!k}^}7!`J?̘Lpԃ* )Bʑ0 C-i_N(wÄjj~$ GPү2VyJ'gq,RL;Kþ_kdY:厨{ҚK){҄nz|{y0)|׎QR׸gZnF 1`ӕTCq0i^!'TLg3ɳss,vv?-!D )J*R¿_Z}f_𺖓 ٖfxedl/pkg12U]?[u.aR|L`Ȥ1Q\,Z]pdAw`%$~RzGVP&Պ*oGD4d}MؾD鼂X_uZtjx[eh0rc^Gؿysn/fGv~FjY驝N9S|y*M[U;K~iSwv_O&6%x[PxִОt W` =3fNS]bʆ'jF.#x~~TJ&/Kܒh$f{ƬI`LWW3c~"$̖2aS)3vxHQtaMl  #(l[p(ᮛ`Ȳ:<$YF$(kf (v,{ nRJJ9`1O4JtAg7GeNѐWy| ! !<⿞1'p$($2f&>ñBLt7cyt4(s(S)nAA-*;>흛kS]O~WX/*nuZl3\/[œs5kOm}Iogذw>dPqC5bE:f(ԠU$M'QXᤒo};l#nw{ O87l0qg&fޫ+O/2.ƫ|E߁S̅cb-a|ZԂ|9`p hxDJKV <+7ew%۱G\7Eb׿[:2hg7eBQ0md-3BOm[k%s-Sb&ݷcaкOrͿfR*Wl<{\6sX IeDD$ a~bӞ:``DE .@hTX$jSEi- r*_󽖛ï]jWJ/0pӞd}wfX;w[Smd\3}]~ڞ*e v' 1F `%Zϭ "ړůPJ`,ًyGWqb_,+Zmѡ[՝n[Tn"={4?m|y|HӋ$וc ,@yylI0eMgű3c9cTXY(C&T Jh un.Ew"Y"b9#׊CZ' p YE!l pt5. M v8gW2YR=n9LKxw۳+ub._w  EJ!?ΈTC, ~Oxi(_>oD1¿QMU Yy8xX3cnxi~ǘ]0N=+*>iVuY۬u<+Y.ܾC;겲; ǘܶ?vfWT.[,pMaL<.c2w*%ݑOt?[gtSUP]'(,ᏎVGfzqp[uúEgcxO;28ёL )0TJFقL6V(a)c 8Zsq-M'{jy9(Yiq.753ynk̨:?Amg^^L JG'$9 :/&d`so+G)QNqM^;zu O\!scuk2rQ>>Tl /{1S=+%n+xVnzfi l">GI6ȑ: XBa0C1b@0/J?HWȧF' ?Ľa:bAy&fZyxI]=_/jI6bybI]+ըQ&E38`WI nHyGcÊ45D5Cw q'dԹܳgF>ՏOQf7WֻeWU֕jGHkƹ%Q[ǮjTdnV LY2~4?^v"<Ɇ+a &;rY.(:vN]n.KVY"V"GIbiTMvaRpDK$jJqՆq hmh2 qT_ P:H9^Ak(P'v/ZPa q9ֲ8i+j2OU^<O=li9K))eWw~!t$ЙZ`dt'f1<r- 4S 6Fgu^r=zìk^c żk8~yoM<\*K.K*mǫ㒗#-?q9iϯCfeNZB ΘF},Jʮ g\"ak2;=QcM#xQœ3b~96XDsj$بK~ $*ORൢ؊5pƓF$!fo%Taw"vIDԐi/yvBk"`ɦthP%)7-Xs̉\tFZoa"7 Mg[:>Q7Z*Y{( A -Efp\("}dx8OgXO#%m PUxˌ FDK +:*%`nBRTU:ەi{cK^S?G>W_PN"C8*oCf.Љ!\jYJ#co" [Y'gPE=6edDc`_Ԍ@g<AW-nzOr,%=X)9X\(D)ZQb9DI]#9% sbtQh M +$Gݡt8Y:â~BKAǤwQ{.C']F>_yXվ w}YgL$L%Nj ޴6J;2y@,d1Ura:; qCE;peu ]ceTTtZj-_$óS]ij][.xϳ%'–SFࢠnf]H'Q7(+i_?w<2#x/l/H=|]Y%R[YhWMb:KHܴ0t9'',M`M6C8|\޷We޽ܾɴSwW[7U_c~c*tjvOX52M|Jn{G} *k@YVUꫥvjA4"bEmUw>ǔ\jooUVս dxBfZRs6i#F}̊o$-%|h=ĈnZdi +) 6$W;Ay􊧩I/ 'żd9ƌHaeHU_6ƸZ 1=7 ־B~BY1p A"=||';{5ۿ߭kXvuk8"@1/xCg 8oM&0 rA@3Tf,hO{ԗ)NsL6uT";eOBVhS@4D4wKbHU<>ej!_4u3x_3WZפk4[GeOӴ(fmBs)F cuIW,/ vKGԇQ%cR]._3˾9e7H!PE9o}Ipt5YQP#<3W1mdsHaF2dS2.TGlH8*"Yf]eQ"ai7 J:gZ9z>2!,8ZjFtk= K b{u_ZUx]R%%]elYx9F/T1<!<]-6]n'a^]4{:_[Y`&".<[ʪubSKꒂ$G{7V ʜ_zSk}ѽK#jK JeLb,ؗhUzPLI]&fNpQdXHOZ )JH /o\蛬軣Ni-vVR>S "xW]$sA"+|OzND}u*0䱴VT ~t;+:E>fNmutƫq6жkG3r/4o[NJڪz7>qNyg.rS[ϫ+]DטЩGMAEC;!a^K[7͓Տ)|$*09;;tVH) 1Jϓ:#GGdЃ5 #Ξu {B!R _h2\@' 50Z`zTo%G(ڞIڱ[2A<4 GV'5/\W{۳گytY{6CU W PscDJ/gyɹ{ G7ATC[9y1)%㽁wuCFu 8ZJ1蚠X0)XR:(H -O¬+Ŀ"*͌ I!?_M911~;x1}ڌei̴]T<։Lpӽ0QPIC%CҾ5iUw`/!τ5(3Oя]yc3_Z:$3l7Yհj#e,pYG,E_ѐ8mirn;b`)2YJk^a9i%π Gp,f>% eҨs[_}QGީ㶷qbºZM[_VJQ3$a \Age VrZd?:8RՌґb;j <§%Y&i3b#0KJEvT֓KqTatYL%&@X,<~:dr(}2-ěɽѩyیP?ZHJuy.|ܡђw9iV]O.M xkPh>v7")D6,"!.qO@NT>Y[U9r.Яl-6~ua[}>vPw1A0(:Qd+GP'8+ۿ%;Ar!zl%9C=g?Qve:>K( H?l ݽ9Teܗ g:!?ǰxDq3 (@T1;ejj l‘G̯e8ivd~si΅Ľ1Q#+?2t\є>!UY$º/mg dt\$pl)*3()$bH[2%X-멠'BY {݋H+U9(hc2(c*F(pb֜E["H3h=. fvzJgFP *h>>gbȷuxYJAydȧ[Կ5OXR5il;ed A.'\iIfcJH2~I̱P:O7&t˭~J"wF'|cILd0t8HX|ӈf34LBZPH[eγ12eHo.ep,HؗV|E]FE82̞@iFJ?S[^AږJW_1xTG0pI5n#()|:Hp b Z%<,Q5̘{E#-?B˿߸%͐-ъ S[4-T0AF)n$ՙ`,ڝNx< R IwE[}p3A|Guf(^mDqhk<[(6I9=b/,p۽JMW*,#JҔ?y@i<182(͔< %>umͷ $vCε+IګPfXa^jx4R髴ʲ]]+ܵWB'{V5O^= (erݸ :ndÉ "FB(>bEbUM'$rMDžVŜ1zΪNŕQAxh;9|~Q>K'q l{(X,epiB~;I8#ɐ[yAs!Z}8 f+f@UK-j moo qc* ǖx[bjvLu^x~  E^he5AZ]fb(٬sB ]WO=x *Tzs\'u-z14[Ҿ4>k~ͮtRu<`Tyӧ@prlqkO 0]UE拵mlP*A/;ZU;WطB*>W܇%= z'C7$ 0/zI-' R/qɇ<>ٌMA1 (kˮ^Kh Mx!ڋQ= &4bK}0`5< g;z=8Ktn7W1j/c K[򬳖-3߽Cb-כa6[7[V-Q߀ZMu1uD+iS$yX|'c !TX+Y[w:jC.5g bfCqjM>;Ot'osg,e;ޒӸZ"b!Yv&g8DlVсi )6of$(9h3v0; :0D~ḸGcouQj"R1gpUIy|q`X18byc \H=KZΗ/0<8呅*U'a#\b='7I>e_nLͷoo>~1g@h:`$yVВuLzOcv1A5񏖻o,^WXOsm.hS˸Aqf_cnxN6w :{^>f|/f V̦-^`|'5,mY2^YgFޖ:Cȯ6J4O_|p+*,iJݛWB-?R+A(IhV*&S&gnLbRLjم=0QҺ_e= ܟ<eXxx)Tt-V!"^3~, ۉQzxIO?Đ&x2-eڹ3uWaӮL<v羌 #A;n&3tNc2auV/;N953ח }uF'Z jcPYQҥڀ Z| /(z Q>Hs[ `CZya2)`|-vcbQ˰L ١9d.Sj.&_bDǡl,wyDl?61EZ7´cIbQ*σpi oY{UzRVK~G{Ӊf->^qO;?CEfc:}-h ?DYIE+ 2v/l`ۉt+6wno#VUe= O.QpۙZJME.Yގ{m5N73"ᔝuE}5dynD?謺Y2x(ϗ]uhfz$, ]m2}TRIEQĢÉO9g0C_\a&O q8j\\y%PJL֒[ جjЯ_'E-K4v ƤJ$ 1_tSş)"KȁFTكeIaV2(t\/gQI0J :9FG4aOi1-G/ɅNiU?o/]OmjK\f"@!""\GI3g_4r>FhL5n$-c *Pe2/}ԋ&ѓp]Y~L;F%>P rp\G"u$zFrd Qt4$e4hˁG3.M8|Q0ǩ1KVkT?ޫ=_,]PN `=.ƹ̿ǯQ@s ~&l =3 l}r5h)3'@̙6Pz>ʧ-߾Ωt|V t<; ԫy}sy6Z9,x/DYI0[#!B8=&Ϥٸ{b !J>C)L1R˲ ¼~2S[a^\\/2ȴs']6&g7ލРS.TVtL9 CӈaF>)Eܽd?MXoOOX^H4x+]/IL͚7'$_ΪWw Ax0%bL4+GuƄ˅XN)"i{}xM оtLNJxy^YLU;KkMoTK2cůO:$3.N)P*k+D."#md⦐3.=eěG[FxZ!ŽXIm Y@f[ fO]N2NZEys\1:b˳,Tw%:?+^역d@_y k'[չ /7+sooAéa=\j>*4]GMGXe'ZnY &q%u,m^˾Y/L1cPƣH6,Ic^HG# ,p냦K"IO3366~aUΈK&D,nNEpFlp|ȓWA= @LeLl1@k%FmFJV\9HND(Xk=e&U v%hgu2Ŵ?)g^&4j0=U(?xPSV8tdj;o>pjM.0攭ѨtƶtTn} J҈S|saj|KVWozٞ1xsdt}5xg1,o 9dRlcWS)nQS)i=guE!? YΪ>MqGFg1< 1{]#Fm'y1z7" q yטq4IyfmŒcax J9#Lt4 7$Sdc M\7dY Ůٛ>0&KY0Yg0#wsE5葚E9:oQCsly$ D\`5 GB9Ӏ;"(NZ=U4AIX>DŖDA#= Ptyy?Wy8d Z1X b!,D7=$rbʻ׉1ႆ?cJDf!}m`qk xm5[4RY?079"zl f1%f fـ5UҰ21#PN\z"34:$ƨvp7bk64Vh}^\ '`NqJMtaruɜlhKb ßt͕ed[#9ιjޒ[b:DL&seӻbb 4PGfoDUAD@n#ӏ%mlE'eČFEiE mKD(-~X'fĘRL6Gϼ ~^ByH̒>W662s~!ٵ 9;,ֵ Xfk;bi||g|'} V' M+Z]my,'Kگ`TvgSjh<=f%q1Dk4\ x zi{p_r_ ɵrR13t_}Eddp{X#V#+GUto%e vE(]Z-fy i ~4|AR ͓>FT藍UmW# )~.G 3 q6O `?>qB>ۙl<@YFO6^C;#:Av{l㝣oV}#z;0rwבr;8GW~}\.lCt(Zd17A чԊIK#5 _S". vQ/;c|D|[ ֊nt\=h=Y#Q} DH$ h 86Kdˮ1EQV}eE/B%*.'Cl$JEĎ`VR.B{ 1Je߷p.Y3dId-8HkOO-K./FXG(iCo4(Du|fP~v"2fSG塚9;m.=vUKSjw(մ]}2iz+P? 0H;TKp"|1"&Bөb}:mېn v"g, KAoJr!A#5!G|i6u+lkw(T YPI: 87_;#o9%SvmɇV5p32zg :5ӤR> 4(nAarsKۮP ),@JDg#mHa)' =?OJ&\?A=,GEdSFiɾ/BD|CZIΆ\I Sf?< .zrzR5]34x #SW3o&04."͋4li#S(J_N5 yE}ZI1CS ҎZ&h xȲ1SV]'u72H2:@Y-4L6&DKp9ؒ]8FXy`z5RsJȃ:bYK"&N県 \%~l]LV1nCqt-]o4Úq}sO0дח =8DI>u5I۹^c91G;$ 75Ey_* Yo%4)_ߔ(;=tdĎQwcݗؘm>0^m] z5|a!ŕS40t&d7pM7N$Ғ>`3 9f I1·bh^;I{/hGl"N_`M8i (Xe7#()E/U0y^_3Xf0)2a^i/H!)]K1C<$e*FḨȂ%b=(g(f|3(,/,De1AZ"w~ވ74Ύ Ӊ3JOt=23ٕaUЩj 7؞ S=W} >3Bc?6QN$Ƌs|ސz:9k]scw--RClY~8ey[ڵXn܏3x.L(}bR_͋'֒yJѠ#DAܣh , \l97gGP]q0ן+IDBӽȋ~,֦:XLĉu7`|;$McU}qi ~˚hԌդ3)5+w+Rd/*D0%"1Y_#)>cꑣV`׾4q(dAt(wj:9#%XǬtO6%I}R{y" 6b|YHٕQP],=@zc#lXU+s]!ډ`9C '1W(ƐΚ>)'@!Fg/2ISڥgPq=4j'USA$S/BиK?#VkS3E(~vt+Õ[M(qVcY 9wa0ATAL=1gs(fO;Fhdwn799JCӒN8Blu/3?1յR£D5tidqo9V%v =f( S <Nx-J=;>C"tJXdB!:a)&fNB 9]_Mc:q;úuC,]TWfi  Qx۱UsgnoqBc9@`}SOXK2c_1C&aF.d} VS(oĞ^(abWq̟1z|r`d]ݞ(L Ma6gj~%9ًsK9,٘o \=2wl1N-Cd(1c&ƌMa4Ʈj%ؘlc}qdIq/( 01Tjv>Ꝏ)`I)G>qewAݲ*t6#$8\ƍ2 M^XM/ƔQw.r-ឭyķ%);Q-ep:$7FAƳ5x&MI)ͫyI| zqLA&O̡9U 䁟垁i>lW̋Crȃ9TA0aG4tEiv,NUH4I0Ņb6C4|nv;6_L>GZqGi}-fv{|>^u|ܭALmjV0LUV#?P8ˮnY-eBRv]&q(&gī2mE  gQa#/3v*1mwpijGNBi~ϜԌ]hsI>MÌ&f:Bx'eFF vDpF{ ʍQ79%ddLV;|4(P虞 }_tqCf@fJLpRth3A=67+CO-Q,Dhi0t/:;xStkaTף ! rΣO^ IWo)0Ā! gVSQKŭ ++Ѩ~ \p(^$l1==`uOїCu}p>?R_|ս1k{j[R>Y.".$2 kM2EJO|!C_%Wꗻ#[Tu}/6k..X+~ 9X9yeɽ:wqWsjPHs5yh5vT48r, [o1si b&}gcm:7/Sx~AdK^RxP:rwL(L @,Î!V-=u[ o qbų7ݚU2#g9]IG4SYVojb_hM :vv0u8tӤ@D(j)MyS>&G9ّ̡uC$j31Oތi&%mN1KvbՓgDh$p6Hhsͣ$ɣ Xx2E!:'`8xSshstoŨuҸ #-{r&АIy@,Gaoϧ(CXNpQVGaKٴiReFzᄴlXABZ2c}fa̬JōP-XS ڄL@׌cۺBs7L>ws9s~=-O~k:|_06]jk JbK,Y ˎ$*,1%&U AЙ8_'R9Jq>`My[I@JqD۾&+閧{$:{Qf/GnwaD~4'%,cpKj`Q0meB'"84bƇ\)ޞ\XQf(B "h{ q щ$8$_\|WA+Ŗ!(S'Tp %vE[ChKKR+jmd9a5"`u.g0zj f<>MCkhb5!)6&ms b+$f$2,_)[%WC} ?_c}/|'4Z~gxAd G_X-Ѭz}1x`$BVDEӈw?GN:CŒX$΢CGNݺZq??9Zk}dSJ$:t|e)O^QaHhkl3r@g"8|r ynVYH?mX_z#Ap|S#/\#2w| ƦsF S6<;4S$ɤkVh睒mi>pp/VG`Qo'W%nF|:-tJ Ȓ*$buGMǾlLhp ~OĽQ7G9Fv>>XXOʷjBc0?c@HAKOk:yʿ6G;>wfc`J/f\(uL%B w]{I8\'fF2޷W[pr`ؾPg6<9nG8X)$e ! X񡴒!JO|䪩w*X1Wa0dub7.5č0akϙ1kI*sd)3>T9/T _:'Ʈ2$CnLq\*h?=Ni^)]f0YM``AkM Ŕ^=:T :OeCAqbN !!Ef5&(2)FZLe%vf\LQ]m^;WnG,S+(J&i&[^ApQ6L˺<''Tnea( !` AS"`x$PrK9O[)&E=I"i1$`>2 _:i*?ř;~髂PQ <\OT;:"x,E'JRN1 7D~&hE&N߃J5#4yڑ6FN6TbdG)rj=C9'ϚIΎbzAx A"t9czLKsRح㎵;7?R~晽f̽zuR߶}ٹ7 ^?xa)p4d=L 3s1RցH@ ,o&FMSy \痋MpEcXݔ7* J>J 0.1m'&!\f-{EMə9#Y8'\KI*Ɣ.C,?+)AA8TpKȿbG9I("s,g㠥lZAGwIEocI7R䶂<-(VipYO O*?0p'}wX8ztV(gV;Q.,6(•k/M>haJ1O &K&ʈ2f PBLrq`!#28?yp W`^ BT<m;6Vßnt#[}OjQ4GEb YjыRU$bB ȵ7fˌo'@TIKlYu-,*\!Lt͸wEV**皳}s>]`g0(.O[ 6@F2dh3jՅJs"/ a:8T{`i7l:x|6 ]-Q:(cbUhVerr=)^}7FKb-٪HV\;>iˑm&I[ ؗ,wAu( ۗMɹ@NAy F%!@Pc&`ݼbW2}F8LYv, >ܭg?ەs,+dbk"V15z#6HCGj0nk.CF0g$+%k7Ur$A_bW!a~=#gI1,[(xSjL7)vS_ d%$hk7jǑ2VgЈm lb"C[~{*=5]J4C(-)鮴R!r`:%ms`,"A6Zsu[6Q#JBh@F&d޲yYJTWs^UE"uE]Y.3кÏhsH0Mb-Q+TvaFY%Mvn{P'V\1#ٝDEs$&(Wh%RCbdCDi=ÉZݧ88-DlTh)HԣQ;]M,&Ncʩj_srh Q6'lSyW(^(,դNG\%QfRdϤ'ڱҺ .͞(3uR~E%m֮)eu12H!Gh(YY*N#fSZ=ckE8dy wvL]G==/ܑpFEfaGj3"KIs,$'&cahMk vx۫ح; ԋv,n!#tXr$$vWGknXpϚ@fPhRn J'vjX)v-έ|z6jЕWyE2#^;"wżƯ:bU_IAKIٶ>d:߄=3odrnm\C .t@D'|vIϒGmH 2:*̹1X8uNī(ۈC}TR! Y3[)~RҔͱGċDW^|@ݴ4q~̿эW (y8ѸGy҉vmPB^6ܲUiڏw)-{x&dY rH|;UǽJiN^W[wŃ+Ο{bվGOR_f<%8`$o5K$VŜk''yXDI|zhPI7Z8B|L-tG'auusD- lWk.L_;0Q"EM et =7Z2h54`ï7ұ C%̈́N L3&ΔB%"4YsR>wb)`?E8V)W}Uj-[(CGpJק,eW Xh|V Hc5^Yi;3ʒDI'1rcŋ~?1̘>ԧt0ǮZnx|*̼~wxGfήMףa#6©OHe[g鏽s y𞅇ZRú49'{\(ڳ=b W(4!!0(@̳g<-CGS3%-!ڷpˎR&*~:>fs;J- $TLݾ C@z1"(wU☊=:+) ԤhF8ub~ &^wF?^<Å r gt# 0BKcB9Rb}<\A,>k^9U[8+.BWL&,)fXɵ`$I0_#,zxoGS5ͰwGi]Q?!UU<-'3F;6U Q"*U;-1-?0VlRbod@XzqJy 2dFW5eNƎ*LZ GsvGafnJ'}wa~5z2GEVu-vE+YFYѫ>m'/zJD?BXE1;a5:R{ IZЙ3%獡^!OE`P ClYuoغW|5ǟqpWzWFؼ6vT:2$P2zj>3L3-K;#ͭ\ֿwwy,ov EF5XVYo-? [d,NZw,_ͭ,xV&gxeݙk}wuؾ[k*5{IWîrno|ZwbxS=\p+p^ 濉,Ma>&[I8B5 ~" ^eʥWSQʿ.W> nɓ|u2MzݹMr.o}%6?]jx&_ĽrU{knܷNԈxJޕ3&AHqxP boُ68vZa1  `2.-vњ&8'izqYbcW><R5Q;^D&q惉']FL7u&0yz?3gJݯ+vk?iݙ3qēA XiaH0kS'L|3=wOֲ}yL&u~װE§+1y:fmI;RjKv*=> kh_Ե]S yx+Z|&6-TESP1tpcǫGe[ŝK ժ"8Ys9Zu pf(%a='(N0hjjZS(v(2[++ pUٯe*L75 kEN`KZE ( Xp$\-KbSL aEUc^x=) 6}8Z VG}{elc^у%܃&T/l(cX,)˞+sP.`C/p/bŐцN9RյYC<83J2[oY=7*lCc+Gڝ{( =7%JKVNR![T Jљ14j\G(ÒtZt2Oi[/_4^-̯VP /,2>7$Z{F413(Z4$0ѿ8Dž_Rr,gW/j{W_a}S+(a3az/F??/jV 7{ƚ|=)JSv ^1YUqTSE`0@+J ϰ>-W<5? :^J|8-/hK~߮A2vHkH-csrQKX7/Pbed >m AJ [I҈}Qi((I6`8i{8淒ΫQY?L1 M[Kيb\!\5dpZ贶IOAd ܎[i4>k(J 8k:"F] Z.Qlى$^^"1YƐb r%i^5nKq9|(.|]{2N~m\칿^;^[G`̶js2K.{nRiءf?NP}K%4u( 6~Q|)[NojŶmQÒ'q(O𖊾m c+n}>aNGD Ym/+?ΩU{K76VQiTNtEmHO@P1Z2hj YE>6#HcM k ((}ލFBt7Y_޾ uJVq5nOY;=y灻WQi*Ҽ[|{Ck'T:-:][apXߋz,EpkTs6OWH.WՍ(FVݢ&C2=O_K0{ʛwe)-[NR[]~Is }sgK䞳nxMBSUrHcʹ38zk`e;XFv)F zgB ;)y=d|Љt®~SdnnEO(oMK);%Zjq>Zo #}USżWvlޯ L䯻Sjk3[ȽN;%=vp`1~nwMIwqyUeWΖ4 ^Qhg|ƥSra L#g0S6PVE/hTr]Z!T"Cf,U%YcdTa9ξoaT/Z]ɮqwKcjQ:g]Sj=;-ɍ&o SW΅S7TeAU,mC0#LEJȢ_hZb1.|W^"ڟaz?ZXNx IjW=d2g 0,Ɯ,B}`НZoNUQ%F38+F{#HH3<ۜrQ0 >oq0VLQ2#!Jhz #-Jݎg6\j bZB8Y׆7gr;Yl(A?!אb x븓w0Td(/8yX}lE]^1.T[:aMۯ\5}bfhWZ0☪hI-o\/}" ׌\o҆cN2¹e;L/e֎onQ>O=Ke*Wz$_KiId1{uRo 5Uj2|2p0YTޕr6r}*GxΖ1PUߔZK茢Fg4o\DlEYMS< ^VKXJ15tw=-0:.$aBd-]C,u JTqlFwVIؓ'^sQ٭K9|Jey[▧ ]}mJyu:v;_3aJm8gk˞;6YOF. 㗾1zv=>Ks2ae`Oq[+b%c 2,fR'pofLX;I^Fޅ"q5}G|$Lмj$,x&eH_H>2AbpCpJ&:9&zcrYa2aB$/"Zv%L/f|/TA@~RMQ9a5efK{qΠ 'uJ) fEJu?PWFPzzƗ/^!j :7@H{^Ue׷+ü9,9yLЯ2GǦV2yV͓:-T}K\𢼞aq,=j3 /hM&KVO=X;kvÃ漞__Z͛Ycq?ISAG3Q}ZN2V6C &U?H淎 VKۀO#6m;T i)QQQhNxu qf̌c2(5tsf#X7 }+#&v72"q\d; ng-=~$݅w^ndS̮jN4;NCV5 hݍE:.yY,#W8iw ǶwH5;:H ʜl&zuSKD5,WIOq(rѴvS`oG F9V6v^E px,*Ȥ+hJ;QiՔiS?ϬMbJl~K_a 3~x*&7QAh5%R-H2i"߼BYZW]dak++a^kt1zY8aОP]|g5C W(U[ˎJI0)=*M+ UθC; /\,;;Ѯm’S)6U\ xvGͻ\򞚦śt zncG ܙ!7zBP0[( Fx jܷSM&J%O,-ш53qb2KC !qj/ۙWeKK ݧC1ŷd`4B=d D Zi373!\YQf֭z!;F;gW}O0ñNjYѥs׬{|gzTi\&n^W5L6qA $k/8NJItf*koMjFhhxMl3Mi5:oH)D44^~\=r֮_}{MIaeEy;6jMK}d3uh+d4Ê`S\(33 P!Fםlh'Hrm#>ݔ%:Gs!(Cޚ@%s=%[:A?clyC C Qp1H!YqbAd1;R&2 G"eQ2kP.4*vQ>|0SJWi+%Tt#̨,[+zd Qs|uR 8xؾ 2*WtĜļ@ؔϰo"nd?d)mQv#46,g˶5*ȓAжOؑ}R Wx2H`S)Mcvs}^_ʩ+V^2OVӫ1o1WH6kzwα}6E% :O7c'3JM$w>W֨rGd );M5GTCjRcgˉGi2q[Ӄ=!6$j:~j{2'`nv)V[)+&s_?` gxxrD1YUp{j~BZ#(gQ-$!% %be0 St6US[ǐu?9:|snۚxgl{5>FmX<*su vdkz^}6n}ڟ5_ Ѵc24SHONqJJxIĆy5Ps2oab2b:_݉Z`e;"0${HhgFj2{l_j_ͪa>n|fo㡒~੸hӢRG}{c0g @L!.zk:z7a/n`Đ[Rex!(JCDdñ5Edp|X~zbǓXvED֜U lؓ\B.NP^,0G F: 6XU=Md#y}A3:곢g6ň -wCˈhtS賅ȋg|*ӊSI85QĖLMbo3iRkc a'F1.Nv() Wd"/_LѢwsҨ$Fvz]JEY2N (`aӪϊѮ4uA[.=ЗaW 5hn$q8u1p"AQ^%"wx1_C$a/hXҬ]fJ#_Nv OoSr 38f]^N8]72 >HUI8M 99N N3cjV@WD#XRwF'<-#B Ɩމycn(Br|K"Z>z&N~O1p}m>^77_+m6z|Vooϯ]n9oMiмo[l+mX. yGk@Y$yVTōW (yqY=V댔_NHRF'NWKZ Н:kMƧMk1ޕdEV*h)0_tu vA@HC+oZ-RDM#$cg7&3:ȉ"z/TNThsP7UoQ/Ѕ͟7._.ް߆,rT7✓+ryBze9}/)TrQ /Mg\p7:5Ak ~j?]o߅U$@fM&+%dҖhq<ә2ta F Ѧ>DwB0Ti栎Yq)H[3֬t(E"Ƶs;Œ{wif+ɿ9:GDL)B$&MXף KPfV~^ B[|pYP(NJ7*La0#24jJ)hޗ5\ߋaC^/4ܙc9bWpȑGйY>Ɏ/…NF _M׃VY<}wɖ[iT{aGlҘz{-lV_ϻu,eOH.ْ\WjE4.֌hnN,.mhZbMyC䙲>?aeSI˧ l C%XR#3_F?=b g^fS=1n,h>fӫk\t4X">l(J %,EǜXΥ21`EK V*QWe>M;%1b'DR++wYA`wO7q9r3v bb^I'L2-`"ܕbM I˦ol/wTv ,,q .(1Q&FѲ-Y A>>tdHռDSIwN&O$橃2[ah1g"$VՆD$8^khHVZ^z-?ϡ2Tڟ-~6=_sL5jޔ鶜  \xsHk٩U<J`cǶ5i)Fwn7w*гQwj_FKHD!与 2tʓtI[T3e$ӈPrcQ B'=} P ⿌ɹ\FFDufrKHoVy @hb&ƜӰsJ?J&?6S0/L4Z5WtKy `gn3PQ$p;1r'Vi|蠉08*¿-2>OFd[(Րૡ`bGCoFGQ TY 1K7,[uL$jBƆThRւ1 k"Jہs( =-*? 3䶮rL[7/ V7(ݪoLq,Rsw(P;?c.e>Z"m ӟESS(5.xtʶ2V/޶]qRQ2/=ݿW#n?ڝs,?vn _q2u[I;gbtX4R|m;as(~:Mz Y]{YskΜ]J*9et|ѡ| ,ߘd4j޴:Sz~qM{Qd:8MBn!pH#e+0Ҫ^1/h'~?R9L_|])r#-[GAsj-3,tIEѷp;,lMt7#4{D'-&Z4 }OҊH&G]# ÕVv`ǔͷ\c5ktrt_J6h[Jge4r~1*mHJ_c\2ySU1ie[lxGxY9wM&њ@܌eH/ed$͕A%*qݮ[,v,A01zd}崲OvY` d~ >g<6=`Jψ<YL q,/2=xD$@؍TTRIrcTq"Xp|c Yw[fXC L0w(MK+-3`6L,s(z7NŊMc({F}5981xP7j8M Q [% "g?/%_x1:Kz2krd;`KF9F> )r/c`$a `G \LNDy>\0J2BSL?SKוA?Wӷv`#~ ͌$9gK!W ]@/? V$hFNڹ5N5t;WߗFO,A|CZBO7`{L:!ݥE>VzsT<c`zY+yߝoJ~Ⱥ;wOO|lrOsSiYI+EA? T|Z,+m#f,dP&f5@Gbw JR:% OIz;id#FeN)'2V>Zu6>P?ýYA $v/v΃sDXF(wf|}}f >]~\7%=$Xdxw>rt> z%0}9dnlcFmˉ=&2/$fۅ8]rٲ;n/<Ȕ}.X)cl$݅V?_yJd)]?>}#5Q%n( JjsF,aN#IXg I~)cz~aAR&+aĚ,! R0*.!g+G }b@0`⡿"abFޟ(yXMJuiRX^vPK۔#4݌HuOt"Di sLD$GD#O( šp8_Ӻl."P6cvJg*>~"d`)< ėM(o@ΗHejlYLf\ FNc7y_6bǓCe:I)_:\׷gN !Deg/`F` Ƽrq.$y %Pҭ|ݰ_m;8^9ygL3 #;@&BiPnHRjw{51M3#b5Raj{3*t$⊜)krA)?/]łnyCW?[CJ}[&yM?0\ey9#i?&?sBm_Xv, +WшahҜQL[)Ĕw93Jл܏Q=vftMI s"[*_> D ="lq(W(FVMARFGehʮ5Cq<ݖ]f94XEa;[/V>jJ~"7#xl'Ke,Jhľ8̍dc7} q?Y(ׁ{`S>tEZj^kn[cJ\(ݮu9T.Ruqq0Ŕό4s172':d”~ZaW28q,:F zc6%FFb^g34Q2g4Q-b_0\^$/cbu/;抿+:$jZ-yEx\'fY)o*u ^3IaZ+CDNmNa4@ZB7 $E*cX1-7bs O3du,ҡ򿊡AcĠۉ)v>)@ʋG-k}CŨdz* LУ2Pa{SA)>,k!5©o ۗԢ',4. - =,$6d6>#93I3s)ϓ> L%ḁn+FkegE(6yE Gҙ cI&\zSҲ h7el2p|uׂc #;F=7>{9kWf93] jT24RqƍF,g &Id.%\!$ KpG@20&I0ca=e]&#tIiyai |Jţ(FthF !r^1!9JH4wa"ŷP#~fxd1c1 {}UWrVe7awv_"β+ { Ѹc. lЖFNnhS{iBIrb DqJx,ZZ4c>G^LF`f_,b.I}_ff;MKG;|J,NƧbGj/EǕQIGE4(a[lY-  864 |J\_bZIL}Չ8kRgGV͐%K2l΅ThbrΛ%'?riF.$RP\@c'r0gx(%zp|?;oi4-) cݯ='Q<-q7m'FT8'meXXb$b'.ʨ|߷Yfvp;a؏.'+K$K9P ٌXFxN4vj K1ȁjbBd`رXG![8zvbFɃ58+njRȣ3b0FF\&W1NR[wLw/Y.,uKg a;\֋=FxaaTu?t>~ۈ+pD%:ҹP#r)R8FVlH=)(O[©nbT Ś:~Y%zpi~3KoqWkW+Ecpyxۺ 1""!Ә m>mG`f8q:Y]ÎT"tOŘ0r<(R|~0@6a)'? [y9|ޝ0P¤ 1K`ቐr+e0·Cy7SS489w1TVT 9 fæ} K h f3viTMDsG䟣BU۔!DSvA>?"b̡w`(}*wbM@('@ɞ2BjT~*gOW /$)bB$| = &)ELleL{ IE'fKv(CI;%[Il[(ZK!= I2$Z)"e\#w+ĝ /%誖g&Xb=`RTo zÌk@6Wը-ImCdv#eg'se))tbDP*DY7L!4 flI4"DbIhr %{aC;3&=B;I=. Ds휔K#sKi8V R n|v=Ll'Ԏ,Q.crmi%С v1X߳!iϘ:#B  F=~I$}Ѿd&tOWxWNT4׆e[H82'n+(=B5ЩfeL<-"+C ,xKOAt–1Y% >ǯ.B'P U ,y'3E( :܌4PWx$I7S֘f:jܟLy^?c"Ӊ=o 1o(D{YV,"]/FPs^n}}ʥ8J N R;aqD[XUyyq֛Cs۔:BZpyjܑz\ʂU7àTo7rbZS7$ksTwwpL5Md꼇m1>[vaZ;j B4;^g>(x`*{NTwitLĽ })=6R/PN8^H<4LW%sg@ hn[{xtqQ,+V !׻.%h GF6c-$aE+-a>lY,at^^®~18ຎ~c|\kMn333'6sLR j\otPLL|͉D~\!0J@NgR#4yl0xBӪ 3e:G2]E,ʥi:j,ˈ#7Y-*dv 6 ͝C[jC#EzJDz4+8wүbvtBqϬ7+>W83S3)F36sMy 8;ܸL_9IytC8xT[ݍKu1n= <B9c4)|\ 9/ԋE6ʵ,K ]zoq@8{ÇGu]g!G;5DM4dse+Y=K/ 71SLcM V<:9F;$YP3}+ΧL=8I> ]05^jxD$5ئ&P$؟М<TZDn@0jhVD/mړ*'HS̆ [8Z13i ݸޣU? cÒ4Hg9d8Cۣ l?F xaJF~T}>2ПGXu>LA}YiH⴨]LHW}J>Dt"(BGY4aRW-!$$sD%O{] do[<7Fοa;Eu'Lz8Zcc3٧Hc1OaX2Cczv3BqXLselӐ*'OO\(w@R2N8ĸK].^̟)FHBɺ9e 'Ŕ*!~6$GFhq% QM h@m6aHXO[$3|>aI Ҕe&'J> +&xϔk'=YK`e$a$fܡ#=7vsQK2-Fl`˚Bk-Ҽ/_j~= p받{e s y,^P 0QaKXO/Ef/$}0X9lXdϻܡ =BJ6p8FFlȑ~^8nfN!^p3%=JS!ϓ _9;b#;^LyQQ=v>\bG&Ms=VM4iA('2 }C%F8TMV ~]'regںxż3& A:ֶ *ӓLnda'բLA,}(a:yL>,լd"=pG-鄇hcY7JEEaW~Ү^~n.i8'IEkʣ({reh|).r,ŮB)(𭗒X~'f8z7G$ .p+uAӊN)U&V74g5 7|LpFbY2]ݬhY~N%8t.0s%+6*/^SrOyhBhp,RJGdR. <%gNk=熎 /`BNO%#\lYG*|,:[G?tǀ~Id{|7ctǑ&Jܳb [(pI<+ ]΃H+ 5-m Ў|Ǯ6"Qߕ5A,X.j`9%tyvȼ,0_LJo~cjRD;ʙ/PC\+yC'Ѕw~;wW}K>w1˵W D5"Hy퍲"CFn*YA2WJG ~z^gTI)Z=aq;Q+co !Q=,^>fu3$#]NuII֛w@TqIa3:|s\dn$#d[[1fMQ12pLL:.YhD|nGDI>1g2b젅Iv2? Ž[+ yJLq!sXL킟T>%0=4qYEڌbT+[B8! &sRNE~$&Rwc+Ӗ:gWq 1CxLȁ<;_1z|5E/ :Qt}Et(%BzbYGL'قrAWE=8vƨ# 8)lr(۝m]e.wأ'fDrNMH#8d̔0iĸ9Ɗg #["sl7X([2xׂO(I$"jg!)3 〈bTPLɌlg79RW AO-i"E9|'eėl&dXUX.嗍q}hMw)(d$e@jjUA;rf BWZ߆f'TD62V4!+oPspAN 9Rr3|Bˈ(86{46m- *c5Jt)xo ɝEE3DeyQ 2$ܪpEX:8NTT}~J!7sp:,&gM T1*PJW%uԟO)(&,`Zs!6: cMt=/,;eͺ!5NMB}C^iFH6xPDfq:k3bfʸ8X港%NizƓd{gG5gKnNAH$Gܥ0sXը/ xkA2Wg`715 EG5Wta?hv@u EHYF*i Y:A7bpHtj%W3xL 04 kZ!0 fal7AφؚP¨jIZQ)kY_/IvQ?e)@oU@FK<&a&Y_r.$0%.nHhJ9Q=ԘftΈx D,`<7#/Aƞ~A)YHgEX2# XIYF:|E-^n\:yVJѭErb6Ķ~IEB&eG ;zE)#l^-"[BBc"$8816RD~Ikc"\BQ7A0sXY[pfOw)$C蹔Ӊ7E.2?)2$›N+‹8{|mu]ؽϛD䊑kY*Yd pjDaa7ʦ c=W7*ݣa<2>MV?\[0 opP%Fαǿh\.Q=eFɄ pR?>@#i:Gf,#d]A+ӌ!W}J/7LʒuDdis]Ro ngy}g9FhIцنhފ*2`g杯:E%D8 P^ wB8&p!gs'3}P[Ro% 2S3/xRTtv? U~$"LAUR*@D+ 7.Ju3x yj(;D=t0"OԻ:yFXwLI$IEDL3ePS}{::Ww:cN;SQMg1&$OKLaGSc/'>qSNu99fn&k 0;uOޟm}{UUY/IٸI95L8}&{wQ/.-ڪUSuiH{>%*x'v/\dPImU'KG5~uDM G'/1H:LՁK_Q69ݩBrhb10 J_BSqXY 0 LjGNrdWMtهyXXCSCOj@52:$G'8o, hZ 2Y%óbv7LMY:S,D sߴ|I1{).cp;! u-ۊc7.LXS6¯U)f<. l1{NN8\\BFDRkz~)fT E!ѫ._do<'N_#&2?X?H2E05B5wX%,F.ٟK!7bɷKb3v7?1oBXQnӝ Tj3-:tm[Y<&q'=SgtG\FYb .o#C()tI(<{og6:k.s1j|uAq/,7lkU2 ˏ~ua t͙0|{}$Vᓰ;1uplF0 "a?okmH ʹ^}*Ij}vKTR,)-$4p_QͿVr%ZlD>"rȄNp $ITq*8Ό7pkLi*w. xd['?g7/<]-COPOI},'dJRG=)vc 5fQ%Jf ^/=u Pf\,9l\7E,lzpdH[u)Xӝ)ۄ/O6^Juc$ohD~8|#@#XYRG, /SP8i1AY&SY-EozP>] h=:}w'FI{y ^ۆԭzl}U{jWHguw\h[{k=ܫZ_}z}y7wA}`.eϵ{m9{owi_'ݽ_s]{<۝>ϳ͞ǐit{xeQ3j3ݶݷlzyk5}G:E-wo=k]kg\ݺimͱ]ެTڗw}qYs]*9tN=U[6rf;ToseVYwn]jYov/lokso۽wKnkϠ_;{ۧuzs]t]۵5mӷq.]{ֶao}g_vw@=o[[u:f5wwwv>g#w=îُ^}7zFc|yj]oEz[}s^z}xlg|YOm5kg>^+ӟwl}wM^g9ŞswwW>êF|oU|uaz{ovZ}_7zWm-bڶf-׮U lRKX{uش[me+M6jKf]a5Pږ(VcLQ2PmY[jխb6MfLL㫙^cʽƤimUYUK+div;UzܲM,lɖUlòۛS9͋Qv.}{sLkwc5!y:};S鶻cfkvd2Frb]Yd*Wl+lmZt赋ҵ7i;w}c"6ijdeѵڽr匭XGj[۹۹tY-zmzy*kgrj%VK}w .TY>;6lPSmmvY (snt]Ԛ}os"+3{=1{:>}uܛ7y}]\}o\ {i}^Vw] R:^ŭm/{ɥZy&g|o;z,7{xM{6]|'z|_k;.Ϸm{w4oݫwp=ǵ`s}q}lw{ UW}}Kd [U>3oxU}9Wk3}l6YV-[6g;Ӵtiiu殳m#N;U_,ͭ,K'k͍Jz]6֛f2mnۍW"R̪5iƬRڱIVۗPT[hXλ6InƬk eMǹUumfkuvWf8wvấm:ԔVCl^mK.κʶִjkp[UY;keݗvl k.v[]+{ fMzn0j[[aV:汆.۶d.;n˫n\vb̸m[m98+{wn#9汵tj7knntjնt\+az:WnjXݫWUgk[.-lkT.] ų5co.ݻV켺9W{{{h`.{tp{.>@@`wppztj C( -ۯ`jWD-uN=尯slk4|eD|׾Q*ɈLL24 h4 &hh@CF (%TL!4ɓ@h2h@ 1400C@@hh4i4@ @@F@LM Ѡ4h 44@PD 4d!4 1dLLFi4F=dh (%MB8D`oqPX:"$d1#$c!"!$!Aa!i$iJF) 4H)J*/QM Ak”((Qiq]궤! !!$l$i$hF BI$IB@#RiZBRRd%#JJDhA2R,(FcYB[ZRZBYe$i$)(+B  ҥ6KR찜 /LZHIH2$,n YW-® ǻ|U4 Q"ٙd&뺁?`um@%q趭UB$B7,,K$$! (a.3ns $DHZBn$:I 4l of &xd%HB9xnREa5%/}T2iB^JB%)Zd5 6VeȚwT2!!4[w ;K F 1IA B) Y 4i@ RE6i`^+J:TqktT"#D!d@YX$@ϱ(jQ\ kR[  RI:" B1#!@A E $-$ !D r"HEfEF^%t1\&n7-(VK%`BBRfÐ[[V+,A| 0th Ibav-!`A@aBF c("Ā\& "HH b#" "HPQD4`6C@kK_X鉲C)_!?iS9A @HD- R![h&%B> i7 6tr8\ eh3! AD2\M<&*c3jga SAq~~0tљ @ g~ƚ .<|EM=.eVC#Qau/.IRA$!  (%R DL D6y2dɢy !LD'%YvmnB\ i*䠈W tØ6 3H,Z7xu< mՠ4/65|M#5EL&-lD4crG/3f DvnLڶffQ3F5@j)#I+K O#i@ij@]KR !CYa A[=&eӅ44i%i1EBER:Ƴgyw"C<S\;"08܉#BqXM_3}%W-g1^Xb]O[FE<=o&tht'8 ߄D@:@C#N36bΙɑQ@: }2:ϙ{K(tl>fp %ȦoL8='\61)xb3k<f3&tlbt7Q:>O3wPA@ Nct5?ˇcFoL^,,&_1_`vB!3 ُEƍLnSխ`E@I< ,HZ< zs%$/RC`J7`+\;[-idm9hQ4'e:(:?~ΰck㮔C?Ie ɳ^1p&3={ }2{™qajsxShL]l>>˾8PB`:}cmpǸ{׼ i?~rbƋ0] GE1,_|k{=GkELCtMf1Xu4elQ23d bim<ރKfRrt4A$E RZ0 3)tx׊-Èj5FQV $e0IFHF )O!fx&5L|Se5e7ZlT*==CF#1f%rFfۥ,-o.h!f$/P1bsILvnɰH{IŸ57w;*v~P 3x 1E|"R3ˆ&) ^ NZch/&@]>I.Y1è3 [roSOijP)LEIa)P(_aae lEp&fM1,\1u \ %7EU\D," " @J,aVGCAh (V+$)EJ @d,X00"^7 dI늂X(@b ,H*2*H jue 5" .YA>/Pt]E! 7E b( aiiƀ`41:oYDC )JUz 6*T9Ƙ?=ɠTU-÷x_KX'aZGi eJ_Z 0[x9Dr h^k_,T}>} <xRTcywWnŭ¯BoVXP ѝhq|\Z? ׊e)!@' )?ţ_=y³J+8ADJ$ّ2?:Dqa<p\٘cu[qPK.3jkT~,8,>U':u\ciб"{$isDnFŷaa !HxTkP)g{iTcrۆ((6vd0C+?c#H& R)y>69MKULoN{c7y7*ڕ1Ak4>r,HBp32nӡ/*JP^ %5 !UE ]ՙgDIUm'xз8PAŽqQ W`4Ƃ te9VF|,rƉo+rPPd^ٍYBqKIut::=x#y  UBʙJӶ:'jxAݒ ?P8g sNUwJ?m|'w6/+(+/$ )F+O(YF 5fƋ"(SZ( ?F5Q`&iSʂh6ctq\EZ!c T/t$bx0[ e6 +guǒ ecXTɵdʄCcX^ q}VKgd_]">NۍP8IaB7~B~H̗i's?ٛOX$x$Ѯvi4ŀs"G; D;"Hyگ%P|i?EY9{:Ҁ U_yJpw$D?(,#m!=]J=BA$c 8nJ I/,$+[pXTFX\ᵦA +y'b^;YEl%{C]gu%\*Ǔv&Q~NR}.ӚmчEd=d.R'A D[{k>X#GH`0c1viZsfBJHu $()ݨ!2xx՞ (^ח%¬ & @gk7B^To$xGє ! Gk $T]y[ATr~>y"5]`Ze73*Gq"9R<{#= QYz4!}EWWdλh[;%!)RE 0D!\ 8AXڅŌ鿃YNm.&$ 3aBi`s&'*pxŞa!JyL9J(SА8@ dR8!toG= dq2,UiHxLؿ~<-eGJBb(/Yƣ lh$z6Z"I]R7O`ZI=^J36l*}2ow5* )JI=5@M|YY xe}Axtg*ngЧ!EE@D , 1Zޓ |E,HjJ3b)C2pYK>d a |hS+JEaRRavHMRRN"^*&Pq4&Nh'8A4".8J"3rE+PI IӐEL lH.iegMH#ciQP${RL/xO9~0 tCQi8%^bCru^x_eԛ^U?b xEJ0mzPrr ;zjoLg;kШ܏{|⪂"} 6uiƒC>\TNV:eW"Bi12$oģ:|eOd?Օ]?/b-dyQ 0a2EȀț " T A  `'$(@I$b$!b!  B$B H RQTa4ea|a atyv)?~@WQtRM|4_,t Ʒ$KHQSPlI lRuAiq^(hiy 3ΞL}PAbgf1fJ:o"hD"xũJU9n 82,so >T?* ;t _;ى\5/ql+&%ၥ%Xr7E||} /(iS1811mm22 HH"2 2,HH$H Q|r?RӳIf_r-qE(229XN%=劀|k* 9C''iWf?Ș_5il#quL’4pȄN#Fm%#I,sHAaQH@1 b&b{dpS؟_uxo$iL,ff*1J88}҆^bfұO먺]B(8cA)Ҍ{V+qw S3,Z~'lW'*G JŻ8c p&PmM"ιX H7äQL(6(bQ~AAf+$nH>R;BI:C,BgmW$vNդf =i`s4C#GT\!u},@Ww ҥgX:(S(y(YŁ ug~W>|!/5ztv/-?2w_n_ABE7Q oHc\y?\X}]_7ʔ3 ۲7=p8ObƜ QPO4:QnS )B$n氇2zEA ^ZwS≜sO,aJU( "y݊B7C/j-mʊZ}El )W+5RbB&>]g,^`!- Ĭ7Xvٚ6*8F*#*{2ÊP֧/4&V#!V9)4gd rGy񙆺WG8AS< \GcX7euH،L<dKc=CKUpm%|NJq1 9TÏ5:nM+,f@QS9,ê;3BI %hM1eLP-Kʊ{Tp޾8"Y.ɄKHڒ$I%>6<1EGs) na"LE@=MQ22jHw3PI9ޙ9w1g;Fy[p⋰v0&okYt##x&+Vd|RZnBÀc8B  Osd@1JN'|o-#⸐䅭 t1!UZa YS:0F32te =;55"8G"< wl!~^lhy~zb $qxQxQ cK('J05i8~I%& YoxS OI[fsxC0 EC22l>#𬐄Oj0ع-9%F6aGEMc?=53\aI5;{Jc8~kX$+8W!J =|Ύ5A e_8W Q=һDYbM~Q^L6g9脍ӛgS]XBBAx+?OqTNK *m~)fxJ&vQZ}")!\^lXqZ-LJ7w?L滋$ TGR b$.d\$:L5(^x3 |2rThqG#ESy?](ow=Go EH>ĩFݪ52K ޏinx6V(# `%;B ) Ÿ3K+=fhGmy0\fL&}( ,6)8C!}H)^3&;еo8!,U3ңf24 J ASp|, ȶ B 8+𗶢J)G. $eWc%1\3Q I*+f푥v>oSZWi,}3KRN\0V+Zc㞯(a?2R8fS~%JUhy?TW;9GӺp+uVx8B7=CT1w~^/(Ȉ_3H0{D.cX1,|`OP:u>Ӿp;N5FcKNp,xr9ٰn?<.&)T!qv|p|e~Ty4 dF) uȓ +owfmds7D4GntC򼓂ۉ1z2QB3sGJBIC5u2V[A3Ʋs2prTot13$ZWjo[9z}JV(t QUGygWs: a-ARf0ŔҰc Ü䊰l%`8Jixiƪx>Pfp2kn~x햝}Gv#4K(_)r:X{txOGFցs݀uҖwN1=ˆrUA k7n 3.Ga!5/>Xw(%K>!IV0)yŮlcEVݣC:"±;2E-[ݏ. ,H7W ' DHs%OLS(><r.yUQ/`y4YZ3ÛrCXK'\+қDזyb=X Z:X0=Rl jΆ!.~XB촬|ABؑ 29=v-ǪX| Ω&:}Hz޾y~nNO+4fuV3fl>zDNfdg Sr22Yt2TOcR\*:ya_fiZqnL̓!l[j<k;<dZv_ZMtu|L/&eqtqޟX!A&oyS"Q %~.;^2ѵ=˵gHBZs"6h1^R*ZL㈑zd~T I-D]MGz/ g8#Oi8 GVR $$~j܎k# ]U>Jm {m?OȜl?RQ cGi"Q|+ios>qsE,ԅTR6ey5trFQe;: =r%ѣHL&P[ۓBx FK׋̵sl[9e{X͹'~oϹ`Y-\םFC9\nwb=76iWbX!~ _-Ϧ]#R&>Pv&s )g(W (uG]x~ΔrW)F1{m<,&!7E`B?(P;Oo:z <éYK`P(_Ğh#g;*RR)?^,BH bg֞Q{ wߑgDOt&Rӄ'BnF"8 OdI=G/{ _ɽIO@N/{%+K5TAq&Yq}|6yk]툗ŧ6MS?=_1(+>~H5H#~";biHɈAtji%8+H."na,јvL1GXȆ`sp6C?>_*P1dh$L_6YEͱ&wπӈGRTeKQ,@̸ij4tsPZGwg$㽉Nȓ3`VM,FTEQ >򔫠evEsb gAC1 {-~A8 s6Yc&`Tt/,&[bFYc{ou CHQ40 =p NAʙf:&+fT#^Nrib4:0 j~[or}ѡf1D)z$uDZdAa֙0KUDc Gr>ܱDdpK51vdfbC>(u,全@+f3*=n1eGP4FCfh dbI.s GpqmSEz(`eOT2 ac)T"Q$Hþ(2Iю[ɧ{+mߡ,] "4D9h-S'v3C6h5P-ߗ`` @.UŌ<t)-1;ѴÐ% prG+W 9Iz4!K7W$0xAap2⥧0sl:Ŵj%:@e00] ~8OCA sԱᑢ|} wOyڢav,\UHeA5fC)"@%06A6,lTLݘfEIIE~ Utd8ڡXS!l0o(sD?cSrRҁ>O8Ie5<s2MqzWƤdQ[sg PJW"rpOmm 3d4h yjb%ß+wDr}̱0SA}L>W%6}o./ xA^gxĞkҕ*%gP{}*q4,W""nB ;xO$1:݌4o֝ i YY sɤzn~Br.Ig Kԍ͐\/0wTk/L:w>?ֹHdgx[ϸwE6dos2ZK敗sL8Ҡx}XWdwPGbnMCh_ Y_i`!)Pè0j_{54Ia%C1Xdɳ+L2X2}W9F#WR]O3 ނA<(`>/x>R5mY̚}VEpn1nM};hrȖA}MΔ|*Ne7h"}Uɯ"4]4"=W;wN%(Χȉ>;C* !?8:B9w)̿"$z{OBU íҪw(KKb6ΞS=j.CyQqir:Jx"09+ Մ{ѷsYwRg.۪Aˆ+ף={ekIut{B=:9~}/K`r6WɺDAZ+ppVIQ ~&'|P! ^Jim|V_&g2ԡtDl93͇ɦٓZf3;=a6L26ΘfSOlcX.Z: ]=On,D$Pj *;)y͌-vٔA~0ao"cE쟕BF2A=%Ov)Pϋ6?((w@AϽ"ilw 2.o=+\t_0 vᝇLS`"|JMCg|xJC3)؂hLw?2a,*: ;`ٚx?IjrG(^L-8ULA^;2A`lvOn ' Aw>DY+ωc#Q3"8|[5]ZT+v08 ,g1/{b+Hϔ|jEes+13N6.Ug&4]dFdҎbLps!xoym>/GVbTI8fI׉dǽui<Å r"2c{ifHXCj?E돖fݕ)3>n $7XZZ  5qr~ hklh-T\FC`)d]"w~ӱĴũQ9}*eB]Jn$X\E./eI2N# p.obcC9:[-2N^Q\FF1+MC R( !H"j7GײBK >ᮟuf\Qx k` "ky2mg\7Pߋ*cJXX ۰6|Jf GTU3ڠ#| Cj1d_MY&$>xfWDv9 *xz] p?Y6d(|if ;&2h*=9n>HrN _U=,(<)hĚxϏwT-^dy80yp(Wa}{BЈeLqbh"@hZC@ytd =i kQ$@ LB31ɮ:( |̵I[66+ $?v>\mlk! do}'nI.xr3q/G#Nj$06ncIc+ Db\AҽZAb;,̒~ I݁O ~R!; &v^ !;#;"W:D@`5A iD=Wgǖ^-DH),h.Ԑ8VgLKdZTI$_#sqHO?qb@iyhsAkpI~ZƦ9-"f&L`} 1Bd4Xiiٻ7~?%D* (>KR Ma!~9rԂѬiۇӥ65 &TEubX,X-EhZX-Z-VشZ"|UrŪŋ  E%bU5P*8cʀMJuJӉ(Fh~3 &oa4xt @ 3LKTAG4ݚA"t'0<}]9D)Z+a(R*z)SBׁY?B* Q=`XE ,EyjXbŋ,VQ%ŋDXb\,Z,P,X X]U@ڴ] E`m,D)h(ŢA`  ňXQbh-`EDՋX[Bhbŋ,XbZjb+ZhE"h[A`"@Xj[E@P"1b%jŠ`łD84H`@ jŊ)XX,\(ؼ"Zhbp 7 @X,,D,` bرb-VŊlZ-T b+TK@(Z@H 5, d)FB*MFѠō8F 7;sP(UAe*! ԅd@&=(2HH|fQ%~ '?݊ *+!4A9ĉH EѢ^0}U yfR$D"<2#ߪ3qM^G Db9N.¯G]#oCu24}| OSw7&Kx$l##tN *gZ'^]~[kE;Dq!q(XNɐt `('g 9=^Q,h[ԷQ1_gO0uqM!@W?;LFw/c.s&[[V(F 1v F5)VЯ#@2)H(OסT@<{ kn:fgHq^@,7Ѫw{Z<@ $|쵅C~cC6vßg &k!#yꚑ"ܑ-~$r5D` c6cKq'HWsYiҼ3+/e;Ջi.1}NPc6d!2W]d@( & 317id3Xl=!N6"u %pq|!nBWPp-s JnhʹW5Ts7i5A5a?8$bcr(R$*ZLD\۬IY vR U3ys}ϹT, ^dH^#ѱxkц^ Z!3]0G{nz0^oˡ2'#tG,~aM7o$ I]eL: 0[]6A*pF(,!1\@qsv6cy`B* wm™D1`ux&-:uj+mHP5ض+"h؜ŢDd1+ٓs>N竲YƅZ- v5!0J|:IZ fH$HV`H:'hKVD;ė2оM1\vvc4xDM"ЏW+[Et *8GᩫzS@eɑOA)76IJ¯WY<ҐDȀ_A-|j&\K7=8Fg$J( [U ͯBs:gqx%6l٤Jm-~~H/>] M/yGZgz?Fkx3Mk>:F/w.uXӥNޒzpqC4t6<-4WؚPΊqۻKߣ#ZsRґd]Qs m nʋed;5.0uz1r!1<;YSfvf3YS8"h]lGLχSq1Cz_ 4;><Òg,;#QQ,(9"ډc i+Uؽ;'LS"^q8-f }mMGoCҘ2KJHvga^⢜vf(x'_f1.͓05Fl.CI o['XS dNEa-Rmp `::"9F 1C"tat}a3晑mLXGuغ`ĖǏ9g,WMx:!LMK83,1mY.iǹWdqxE*lYx98 &XC5NH:]`rѧO\NqKd+ .(^<:x׹v@\rQy`56"R,DΆ>H(y!L>c$qx\鵉Xr2>tbSb"shf ~|S==ȣ,9/b.%hٺI'7Tw:t` L$Ò*ȏHh~s_?ôst;׫*^Ùu;TAch<$ 7Ra| @HF1({wcG{`'XLMG1x]!>H&LÐI^@\&K/̟i4"n)R #aXG EHN N6lį,(nB+]ا2ܣjgXX7_IqJ쉔ִ>.-jPAykˀlAjrA_:48<.=PDeG,7bF[ }QjW8dȠ dTiq,=Ѭ8Br*_ ;=7ΕnyM2D khK;dOe,ĸ8z=kͱr٘ń.q"Of"JRyʁ;0b3*o^4%<*|p'v g:1 jL}Ddcz!1K1 ))/#;,3, t6TDC[m1s<׃tF)D&H̷W "84y1kƣMukh_aG>V"CGT(>5@jHes3{t# j} ZL(tM:G\Pppr!r+Khtsq' xr6x5:Xw\J_uJ] P_,?AA1Gf$ѣBZCJLXi53nV'?BY @-@7×&txVsF,(xg7'u aK@.0æSv9.xc![shq%?4e7۳ёɨk?[w\&vkS[7 >Ica 1ZH 1;yC6.316AɮO 9\0GX9/%d,^7𢓧hT7?}L F1Sɟ7 EQ<c_CW9T#ӈs K3PYT2gY0|2Ǘ[\>u|d}˲3*R*C@ǃb̖98gO#U29! ^ vlY?aJOPWZ`|F#sȼ:@^ G~QzK!gZ!+>  9j k`B(BA$rb JH c#RP8l4"*a|wm>9ΩX˓LN G?$(e평~ȧMSi%Zz0)F [h%Tl[ffX*7͑#wNmp7̴}x1O EM`[Ŷv(rqV8#|I۠6yD/]"86_2x\ (M?ߞƢr$aS^qC]䮶 .,iS `30"$ cɿ[ڞ*XI8 \{}Rм&Ԫ|ܵ{RhMח:2Ɛ-TcMes(ur:GȖ|` m'՗}-0e)(.uŸܨkD͡˶{?% C- Y- iFR2Ԅ! J1$ZRB}m${*,< RCxT?CQ)k(V|yqex02Qd H07p`~ĭ8K/.瓺hJ ʭ-ʙۛ6RNyNg'*I8=֞-ATLM&huz&`a#[P'S.n"diP~(lNkYFSh5%52q_*KV8Owa=!Iőx)D5_i.K{Q:IX~i}|- d<֗0e"~8Y!bCM91 p۳K->718ڡ3HxfKp:H;&x}g&r_!, /-E >QahsR̰k0Q{o{"O _g*nups Btp)ڦz Ky3wpT(ؚ{B[1kW)$MX4t1]{ﱇʼn |j;nk.遳ZuGa=7x2 9ꪮԮdt\p^U}^L:3YwuwZ]Ezw| S2'hRl+Xo:p):=.ίłEE26k՝uG ~\oU/YJB:^cǬ^g*δ / E(sa^E@V5YdY |DbR:Y洼h2шbks*x; -8cȳ[<=1kbNOVgK"wLI#ԚYLw}vc H9dM UTersyxT+ȃPbItw|E:YsƺZ}s\t4N]ehU9g+Tx㡺600k* 73V?Doeٳv̱n3SW?r~ZBs~BڊNs^IabBoc:^FbO.w$z WH5s9Ƹ= KI+GԌxa>>Gp>֥zoba%|KḰoFfg-|j3S$_'oZ.=RcЋ(ƣPC=?{3J ~|6x7EV0Оpk^8&D^ECj|&:a`Dw{u a23L`4gg}~T)ѐTA88a^L4խt1EYGr_=H=KFb\AjRJEA$H D!Ee%  5")yajSR)BPQA'WFf!i?8neku!-7NZuCEqw(q"Ɣ `ݦ[уݙ%}#@h`!qK {[moI:ok)!)RƇJ) v%9{=ЊRnnT)s `*I)DCv,B4,qphY7ѱS@X//CcwXfmU#<_㽭}*><>旋d=u#fQPꠄ{Ga Ē Zz[t(>M1Z>>UߖE3fy{ Be,MvLv+bT{:t&luCAǢыuLVtXK?6:a^-@)NhwP+C1)Jw,L8Xz3[VZ,a?*t[ ( xunT  ?,CP۞CoG0×)f(e ousyb|§ԯ= ݄͒Qz2}1a_%˷q]VEr$8RF4z]M<$Wm&F$x(}LjT5#1Ba*:tf>|\" R˾Ȱi>% WVn#R tQ/6Xqם }K^[lXp#]+N!LC\f2EyC?CpV# KQ#WMqÉ 0fW4R51m\tg~-H$豳h{"@RC5;)Ι0:fj Ϥy,O2}\)#e݃ꀰ?:$ɰHEh(@ͼx<1CI홖EH:|.8w|DY $IU( LtY@T h2L+ұϩ0[ ]g/(Y4=k  nfNNjq@B|>i`ŒV,YCoAZ"H+N.ű$$qTP~+2*-t]"Fc**RS *pϕ;?<όFB?,lI<##߸\,j`_e58|A G_*Iu I.Y,B4hŭ3IDiZSub(JaxLO 3v\WAR)+sYV#h5J* 535V3&ΐČMgPG.NX |0K W݇3*!_7y ְJ˳A?LUs3B~iyX#3<(1}u%^.0苦vQč>L7>V$/se59r-"Zi-W/֪yt Z0uHY:e*4" #&^,xKNvTzgOTۘF,0$w-bOf\]ԣ5)T=jnVlUPgpF;#f8Ki&Ncoƣߨ;_FD\*u/R8k%JU_a$OkH u%t{'NMdtB5gal?R y^MWjzz"%sEӒEw; UfajHQsSe\/c#}&] B/x_xsVn>o(oPBVv[b[;8$eBEx2eRu4Kk;܌?Wr! ׅW3\U$ua /e8&H)=P5 >/Q{H5]H2m^<$QQRDreo–(u9bVZVN4̿ 8B1#Ŭ~݇C(SN&fS*QD>"őrzj/,;0"fԩ Ė>?RA!#܇+~̑W{6f8CYn@9ih6&JIrdra$~i k I"8/w~Vx8GNd92^lA'f0q u_{*֚ K#cr[s,̲x]jyK/|BVhD#> BY0?F#0N ?X\h5s!(3w=@Q(/&;gZOlVv=k"r ~rLYFtSEwρ.eL=le쇤V%NkttB|svc 4ݾJ^V[UHCG0}}=hC%Ǩ-ajtx%h]$N֣艔i1-2_^=ǠZ3Qh`yf%o6D9m6qQ*(i4JX=J$-S;9H#JQOOcli2e~$ Z[:8!9~̮1?(uI}ޫu2%Ӣz8Nc^M"U=)!.o>;d[dMDt@1*CxvB ?\TDR]; V91døS^n r,H O9&ANqra9B5?P3&2D&S "ʹA,<Yrl@f60i щb{9Ch}ǒ$Y qIJ 6MC) ު#ˁpM.Ŧ!E ̀X争~Y2Q4oQӞLUb/iŎ&w᪠'ex3/vGlZF621|<%]lwdAAk%v6#4GaF|M#i +z' G0 ~lECE58v^bÀe88 %㲜"3CpDYމ C+q2~gQTf3Q/EZ1B%7Pd*se|vf}eZȜQyΐy>̧jGZI}[Q\#c*2j~_씩?&a[/ORPlKAK4*P!ɋ|g. :Q/Ċ`Pi*MMkxGٺdyYo$vWjīG, H $,XKV Z{ܛ3hg# =%N\|}؆aD2knQ ͟7GC LCęi8Ϝ GELF0F>I,U9B(Ġpr, Ϸ+C1n 8Y)JnnG\dtnv:/쫍еI`jqDФj;g%m5ܯ1\<C/FT9dB Mg ^@¹*H5'Kr1;$Vud=9wbG$Czv5?%#52[jc_h(c}lX,*'Uf2:eq zYü[e[EAՐ;R+0pdn= #0yĩ\:K{U+VDv*l~?ᘓ-ʒ}"1ԈĆ>}x 57;pk&@]QH©z9fٺY=ӍTD98]TlbC̝ydw˵d9&"5,fHѮCdah2S5ĶA݈Ncc e$/?fg(NXz\P9z՘( hg2!8ヘF ^eW%oDF4ߜjY2n14  )~]d=om%_]p).\O&aZv KP [LǼ(1?D1"ܕ戦qXGy:lsD!aCd3쎕YBn0ԾIבf]vk !L49|xÐt{%cN#ijGmBln !. +͏FBih4Ĕ(OC)E*a.ثyMtڌ`S>XQoA&,|m"?W'e Ō/Ǟg7|sst#d"7'Tӭ6amk ~弮 b|_f!?b+?'uA!Q5S]w&̴ς8Fq.hnV%14{18{˛u=vc2/]Q p?$)2oL6iy3CY5JOM)D -pIʌN^*n[Yr#uRG4{io@h0 _V$IB`˃j |GbURytS®e|F˒أЙ>k/ӅrpR{p30K 9oK}bԬ"oDUMUAz0GqH;w\. @5ǃf$x4ڸ9yiU%j AGOlH7&NR:5`jJDO #1 я'_zbҧ;h @n""~Be+*AfMm-m*Gv0͌n}*UJ;4'ecE_O M Y/X+Y2TMeJhvcuDEV_'g2Em&qtl; tHWcƩ0T?H(SQbJx @Ռϧ@y( q1BX̀@tZ=`^.Xo1pV%OЊ5ٙQB*90* #ؙ{.`$3F{EOTJc u`ny-9l;3oM{G#!@]rk9ikC`N/e Buȋx !30TVYk# Soqo‚84.?0L&D2٣sJ~ȝs! "6U}U;7(BBNv*b#^BHSDj3UpBD&wхBQҾ$ȘT ԙruc܄pfjb Kwnvdwh`^.-$wV3ORfm(>#$T=K?bĸ31|Eip?;ل,$(fẕ`ߒ?\NQB_kc~h3HQTcB4fQ户,qiG*cJIp}X- !|1%Nb) %kvxauBC pwbJ@Djxk++C73 /?;=+ȃ/n*洕*mhohU(Z.}a/D _oݩ8V!mVWŸa>n@~O[ >m3[E&mB%bGGl0~ T0+%vP\ls%~RL8ڨyZ!T!-J3) Q0suo!ܽ#qN8\xJեE/7PKoѤMjv{f16pZ_J^ߞ]%c|ڭ*hd_)ROh Dȕ ϊ-8#qi֍ beoC>p@ڌM_҉q'Ħ]'u=DJ‡3e1/|F\-AL,.T$$Hk P͒;Ǡ+a /w1Rb<ŊCDV2xLLIQPj02Ւ‹,/PtFxQI'e1XSĵ6?*{* Ubd='<|=ڗy ܊R59[ Nv+ĕ̋쎈\6<@EUCq)e29CydRDQfRںz[;z>"7s&$~GE1qR>7$mK sY|Lj PLeV#b]y8\/Ud?gۂWzn^3/syĚM׎Nvk6GTD8lFDg (DIx#]350 00Mdd+KH]0waQ.2^LY1Q)Oۀ@Aa摮DjUqғ;ZaB >P+yd~*գ qtΣ"JM"'y&C:0)U&<Y'j9[Ic&ꉂד1']D:E&6|-ݯHs;ؓ?4h#,2ihx BĊHdI ZSX߷XB)pBxpL"^TSWQ$ajb@)?R8̎f1D5>\ tT_83b]c ~GAd.E!Om&=|y2ePKz\10@uP6Nsz8 0Fdы^YHgǕNICtQ `Jƶ㕋I5hA.ݰ^1S=ů JnE1xDH7l.!/E@Cj*$EB 8ǎ'@B9ؕt>Ex `ծIKܫd wp- hcO'TSޜMFW9iG(ܐ0$Ez*bKS3?)O\E RzPP괅Q%EzqՎfw6!b1m狥\u ٸm8طzsb+BS<%(yf;g|#OiPl'蘹IE^VcFVdrt"n-d>!*z'J@i{i]5g}žc?r`oTTؿA1a5kQ73נ\y[o;2=*FE|D?J~,ϧ3T12x#oξš4e'ʃ|qDg<Ϋ+3 r2CIwuz0Hޙ> PNPF-ys8( lDf]RM*O">eS w5e(Xg`bm3P01r5E/$w|w-y~.Uvm|2MA7hT1e؀p{(g,+lN>'1kڞ~%=#ь'ŷB PhڔAd3f,T|k d~ _fXLd4mj3YVh`$w{RlI̅OSt{Go0YM &Mc8H "N1:O9VƾK1t@@D]j9FrK s:& |^YwkEA&F5xMgC&d.+ZĪްyPNfX`iL @7I#=&Op7o֓XbO|vT^G?#0LFcE62pDf3Kzu 35Ud8~+/O%&"s0݅9BKƓE/q8`ErV{<0B%Ȍx5ώ'X h4Pl#7n^T?W#`[s&y5˄1]AE$Yha9hIf}y(堝OWkщpmƹ:1E,pØ3XYOꚈZUlLdxh yIjBa\,Ϻg=/Kq麤@u嬰)<3Ye.W3Q*u5Xnjא+A4bp]69ұްkRsww48 hq2Rtĕ)5Ƴ̹ si!? q;%11X F3QΪf&9 ^-0(l&3U vGr2y=C"XTVBѦ|)\'R&wwchu=3]JC/QD"q+ G7wue^x5]̣tփÅ9DZ?#iW"ѥ/ q;'ثO.:Dȱy3v@ hI'aoě]!]$BCfF'&لcHGڈf"DTG>a@pP׏͑S:4 p,|i}:u$ZTixlxH}B8] 4wߴ3^dl@K9?D!P;m"+)#g8@ nP!dDP`6=$:m 1yg3wJ6>)csw8LUx7<|r9e>lSJۈ yl$_ԏ;n ǵ(=V 'V6Ep%k;)A'2f#^1V<9!Y.3~L$?%SAs s8:2R^swLFh37'mM4=F變Oט,R:hW0c4zDx qp>b(#B(=fz79zpצߋ F!e820( gзާnku6Ӝd d NNzt-FbէOͿݯ+f;ו%zw(Oiee9&{YyYJD5`#D&%ź^$i`Y"E1imR骬L󍍖(Xځ1jP[I[ !Ֆ?ePЩGYEӛ~vyJCOMXn4t,}3>SUNڑK݌gJB OvTD(˫+jl8̐oOm(bԿ^x[1 J\tlN P f%&/F/0merڹ6 q/ 4Cm*?T?j+zizEBLz! Gy>c4Yj-f}F6I.SV$(_Ki,Ru%gq*F뺸 .A8΢Ҿ=2̛}/[U}o;z [7<P4n+fdN|z/%2)XN$1 Da!EQTC^ـZF9#.pPݢ!po?Lj՞u Z9Wg/d#MX[)(#9Bschќ_ c7E:[\>qB a JfŜP"CGי{ǖ:sŋ~6u#ViGbdP},+F}<$k#2ޓ4sk&EzgjF*m*1q$^Y>5d۰ouK)`nt1#lގ;{=**;h, 20-;}uk!taue4pZ}0wo}Vd^Y A~;O,JnҼ'%Fҙ.eɌM76{g5L(dPQT}>D>%<{c2JTk&]'(*rߚoQ-vW-H *bgabiDN{QE&X`KPf5C$E8QU y}6 $ՋcR?$FBjqe9[6K{+'jjJFǘ1 DSmZ>z"JYl~}9=2Za8Ŕ 'kyVBo[?<6]=rR\N\%nw wk#19gHpRGc=g7tO|ne#J۱ao9D^LI+PgqF9?d"*\$UHғu4w :]\pu1p:Ū/ ơP :HJ157y\ḥi6Ox(,%]ssտ幒Zu2ЄxE!UK Gl sJNx#DQpYV?:!aL;W(G\6ŕJ8cMѓ=&!98<|=#6$-s3-Yzw^r_#pk"=7y A7M{mwhL)gPdp-9:_L5}QdK){Pfmʣ{dO `߉ITkdKX:ƌ&ݎVlOŒiȄ%11 }/T6PMO͜eJM Aӛ UZI~;?UUly^$k$Ѡ}5C~NY" =a鰀X !?F@pʶ K$iirB=ՁJ6%; :5vI9V ofЉ7vSyP)b1%p;ӎe$&%91LQ^ s5꒴^<#fE|QB ~Κx]!pfϘΞHk^(E;hcDrC(V'|IFT?ބyG0r RTTY "ko4wkz`s)7>boj"G:mt찌w_,yJBbkݔ3ڛrTM/Qzޠma=K3_^'`.Uԡ{=휢F?c#^0'Z-"ا 5 zm_ 'jxbm5ViqtuZ"eU0;Ȥ%(M2~`uQf Xի-7nxp#8Ξv`ff4O&/hvMCX>mC͸ЧBó3з8X7ʵl$%[Dz6;"%es("8l;ݜV fZ KX>4p& f&+\\ <牮m"t] )f9(h5Ҽ^k5jYo8r+3x? mG%:G$.{1Gj)\^[`EK&kD:;{g$aa%JȄ ܡ i>9Ey*ASC3;8`U"= e<ս.Nr4+;mӷ8a0р0cpeJj-CT|EXi α =/#+).Deh#4)F gOlugr!eU/(_rd-:[AI?5t$*En{<;+)r:?[_P,Sh:-%[bmEGvf*&B}>QڦAb{zwIǷ?(I_;k3Z*3ėN ic'LX,ElÞEX$0wkiFtDŃwwm0K"nwQpx./k,^ ,B(n9H%Ǩ6k= (Ľ#sZq,K=m&YgFGf~xxN2B8v#s[*/d1• U`[N@e{ bEwVuMgd 'ܴ) Ʃ$jtcS͟bw7"Xy܁nqlHT2GTX@ˌ!ZiN!DA?FíٛmĨ´l4;ZXvc48S=TVxk ;].gwv$L1>g$"CįMޘCN8AQ'I g㭛$|9訲Д(D<כpfO)ʔ.ZN37iu3K12l+Yһy`ٗ+vs0X21WܝG2e)KהVV߅"+(0=[xŏSFJ<3Ed`F`ŎKz("\NǶ𖧷iey_G6di[?ȞAE?͙[! LZXeDb#DT^ 5ďUGc5 hew^Mh'Bgs!+.ty9n"q糾?>qxDq''_ 8w}R!xu{fJAC{?9%=<uظJdƤN;|4ݟWA0b2; >2L7ԅ° hEG bA H0iTlZ$D3g-#K#}-5FdVvV_I:f ¨bm/o{ s",t!S8fθ*yMXĞxG}cw^s4c<kaKrs@k7o%>^Shk$:d^s+ m<)<U^-gm5u,*t?0ľPΒb*#hCb6&! 描%NfM[Jc9xBp.\c)'_/Q>RF_1t!Gnkr<,CИJj$ WNPmR_]= g2ǁܶ#w=E7&oב&cK#۷ ^[޶INNTv"Dh 2x#Nz#V6>ӔrMa~pKA"@T?sL0'~O/1aՉYֈ` 7O~7?_cCf9{w+{v!zݦm9~T"h@(EZ=(ŀU@"@XB bfvM*!b%EA`D%Z      8A@yR} 2}237=,OD &[~V  m F%G " 6{kO|ÞQ=˷ o ؛`DH_R%%=uE\PUUlBXyxl@|4dh9FY.̺bj68τxc`?x;>md"fV4X  oP)$!dVD dQ(p @ HPJ&`E-P-("Z&P Oewvj"&4n0LO;Xo(!@Sxb(gݏbDhnh |]|`v`~C@wˈDE DN "A/^ v v //bq1x&*|`@ 2. Zf/Nxe^Iy%0J"8F!"Xb%Q0-VUK/,[C ,DV[ o%Ģʏ֟Rγgf۲9Z`/i iCau0}UvIߦet>jxMbX%/6ttr6;%D9_%^]b逵-K _``=_̴LJ藇GB[A2@_9/џ9h{8Sn4^ɒd^/QlZP-V ZkZ,Uu -fn["|&-Zì\ZjT@ ډjxZl:<}&0tAݜ3D=p8ف(M5V..'1Ͽqv邔( p7#hhӮbbbرb,Ck (|Ga0J)B(PҖ-bebn!KZ3w®cYt!!Q~3MIPMo,[E[uh-|@`h}\*?U?!1q9rj2B/8Z!vjh iƎ"N1+4#Ta^g8P6&T'ՠFzWP c6$#~ha`Pm D'Q@J.o-4a?4fšzHLO9)9}`E\bkO&TŞ:o)O$"$D B1zi} 7]ḨxH VBݣ#dfîd }_ā̯> 4HxjiU A1yƩh& !,U(l >Tc;i[ a<|~20;Iu "1:J 2=34^5!| q0?O)hsf =>bI¤90ɔiGdMrMF6& SzZ8gM%T i;\ߒ=oʦ dgrkNqiL&QHC>`Ski(xOadzF@ѕ  10Ex+q҉F`M'o2Zzx j1/FE-VXah@L3zQ zߑybyg'y2LHi+>P<%v{l)S3Dv*̿uMB(QRPLHEM} W lBҔGT"h4N[*%%hv dޜ~]z8LrMG+4ӒB`{';r@#:)5S^8[mL*-\g ~QJ^ɨ0wqO'i>ށ6i1(f௢KEfo C <$? c_C1S&{6CXa/^Z1?9-IښSYÏ N.-*,pDזeiOxM)eb>1!@mw72W:Ɣt'M`Yʉ_rh0*ghߧh)"1Хe O jD]䍆ʭOYhOsp=Is>|pt-b($ [PG9Sȗ-Ӝ `ň`q\4G9?Chsp7l9^&h^:1<Ԗy Y PH9Ә[|*-E{cϯ%Ʊm(chڴPzL&t'hd =X~ry dÜ>+O0.Xw- V/6tOZ,,X=n"%łłŋ  OfmwL "DH MQlP"HqszzbUaL"y? _Rw&!ql)uf;eFF,j+l`^9`KY&5#Zy?-0 Wa2Ubvby`%:T}3NQ wfOi4ӰazQb# ED"12Y>l#qvp,2"C)Nc3 >Ra,_d3o%b9[rt"KS:WOc ;ʵG+ɳ.NZ cG!د@6\u/GlfC??tl?q|U- p *#e 4fׅDkC#rOUރïB3qiEQA:?~]NeȃRn/o6J","Ԗ(IHj5N BB-3$G!3( N#kR^^"mPyƝeNVܻfeMAwJb&A1(3䀐A$FDWş89("&b&dq]L!i$ 6h!J:ʸ<>),ҒDucq06FE>Rxqbȕ5;GƯ6 ?gW i,˛ L**ٯs e4O6dsډp`70m[܂:ɅDc)P\;Ƅ^E$:%4`EYZ' ؤKCs)VћfeF;MʻFHړqwN@t@SdsU_nR@K_q" # @Ÿ0WJG\qQVIEcc4@ 1oE+9sbݿ;=w rZLQ^ 72nK^2Fhl}Ilmq)#dWLG$LtW0 S8<.ợ_[HxƋ;a@&m"RMI(@ 404%R,6qԃZ{Wqeo6^iX;w;q:,wY^uc>.7 ^A sX+QK3*%dtq /G;M4{9 *C4(&P},WaD\EYj!Hy;Y+#sӠ '6Y剃D+33e) D"b:*qDB6]7"hq`@tഘgxo1k=w/P]݄nz ?<0}K&Tqz>6S qO)8:1FEY`rrʈyN^8 hy7P4X a]vϨG9zHUt=jUORaq2O4DL~O=37HYzA?ƸꠢTa9BoO/@8n/ ܖ.X*+̪vHJ˅sl^̡FmW_q nȕq9lP+HGTEN4 9_+tt xĤQq_m`\?L-ՒNsi?FA\->K`GB@̉ އ,ÆV⯕,6&SjadHQTm%g("X\-xf|㨾k/Dq')["bkGjQ6U"u} *.!xJA. Q IGرeAr'{搻v/P" DhN3&t ٿ"WwxueC+%@{ Mfxs-HP^5sdg0p8q_"1bފ,qV|$m"yV sLjo9]`>e]8]1)~lȤRXL![O&^A1Wj] ]5Nj XU)łTSn"^_t|{j{q^[.7iJSz6!Fk9A>L^ʩHVy?i*Ur[#sFa-rP[eTofrϝ?%Y brX= 1KLp}})?V-.WE#Bjx (c!d6 rMcNu#r7mcV6IPZ ψ_mDŽ纥BmMMVԿ}xGUy#X4:3!yOŘ*͟ u&A cfmL,iXRi2C&UmjSv% żS}aEʘN=v'Q򳓾fIZ'na9s~~+(gƲABXJ%]?6L]ѱ Ӕhy\E F͙#(G3e‘ 8g?OJל8c{d[&P_ {fH.%қtcj>ަxE{8魛ϝda ,wSGٓDN)pno&?IowqC+_C8kk"uk.XErsR݈Sznvi޸1%eîϊ팗q叾׉y١s~œ^V' Dq ^2o <2=9ҿ0о(}xq!ϸ{7#N7 t^B16g"b5'LIZJ 8 G?'OiQS6ęPkĤS ylAPB~\XJװiJqHŎ|STWq7xgIy9x(cܢ1u,a,ISP]VC7htP>s G@aꉟ!&-'ٯc4**0 H Hj9bZ0`<( ̣kVĒx|$M- h >bIxIɎeꮧ3gǺ*lo2A6-b !DN#GM|A|E;eQN.wUJQ_x)h9CZ>!`x5Q᲎YDKژIm|kt0"qE-}X 1n]biI0(6]YtWo\ѐQyg|AAh/Ykq2-ui!mtW<{\ >G㓶k\F] 8'US٩ D-ʜ7p#b8(V9< Gδ]SR3xDPgli8M՝I~Z9`ӑd4a΅,1N^NpB`K2<= ZA:uzD{g^)mVmMM39rBt_f8A(RW6ǼLAȝ+zRC]dl糧9Ae(o5سS5 TS(I'2+K0F(Q  ^D՝>{R^̜ !#{B?Wadf\辄kE0wW;*ްH-Q!|n[PSrwx۞IK Z=!>*l5gἆ1JgLb+f}r+u!I%\g݌=Y=#<̾=- AtDqކhdAAtYaBO#PyP}__9h?Tf8oXa0y,,i-w$1Wx)F"L͌[ |y <o OA[V wJ.{Q(!DQT#!b"{^?8(nO+ +)sW/<:͜g/9Կ$v9o$z8فhdy&\u>\؋,$HRpfQ B@A\:rIvl:O kdt@.+e9CjG ZgFbf5Ps {3YڶeA籛1& FniLAB3sP\N{s"@HF{bBhf,O.2{S<aЁH3YK_$֡=!`䵖BS֍|ɾ!:q.E1nV҄k9E^\o9.͹@C[BG &)!N:0a_ Xd.HD䍚/e5$ߙo:2W)Xe4eYy|zR 5xc- i\8e[99}׹uSD^!6t(AVW yw$ID;ZBnu2a~׭Ez[+S7("61ԎZ>orXC"+#cQJUzT3,n /厪0dJ!:78` rިñcUBDg9ܶ30rˑ}#.`e-.ue/ b\'O15ﭿ'M0 )q"r`θ^ӟ*3ȦX cRuԳ箸Fe^!G iL*avѰ̜hqV@-jk~}fldbA&ud:_~ Di"dly 1KoG;'57 PĮ:9ͅ!>B017ӚI?WA1Xiޜ] Z?m"#N3tՓV] (oa|nǦ'+'3x 軹SfHAbt?fLpp=d1rc^26{J'>-,cFcrI{>CzZ kUܰݟx4rv=_Dh/D+_Xbرj P_ihb,X,XbŋՋAbb\ ~ZDH"PD%刖łłڴX-/7lX,ZOٟC=n:7~>Gc&tˡ[C~ O TT"|eւ%y"ŊDQ@P-E}@V-{ޛQ|򟧆=/\P">NZLy6]R&>Ioh82O <)HS &(~ C1;_dgN&}=QYHx8!l 5Htf2W-M8 }\y^aDZw~?#Ӷ>>M Nr+c<pLffp۩.X}FMC>q{jfkđ:yt[:K-Vűl_?UC}7nnMoIs.M@G.uւbtkAjE]X6O& -.Z Abi`g> -^s=j؉2!`, i|?u}O VIpޖKd8Pnaox$̝4q䳡*-Jc&|RĄBb0]႕VT>ƿ[=7-nQ;=ԮxeVU-!{jŴ׈-?\ <&frQCK⮅rÀ]qU@rZ -Kj[VjŪJWBP/b?=qۜR4J/u'ԛ:\e_cŪblX_}y=wv* .:(}–.ZrUjZEαsVյmVյm[Ez ڳ [Ű[-ڶ-hpG;|p˻u ebAQ+&p5wdMuZO:\1~aj4jίhJ$V ` 75e\^~#ܗżVrGF,n @/l¢?k HCU''x;1,\0048q42DI!CG1:>,suE^KTIy%x$,j{91-Vd.HѐC24eln"hngkrtŏQ6of`}dYZxl#VOZ ArsJ5Fy$18~HX0x+zOr>0U#cbkZބ<6hze _5"[6rk< 5 xs03Q;q7Aa-⛑ l7ILom̴M as]Z#LjG!$TbLs/B^1<ߑp2n؋XdJc"w'_8eأ h͹J8?L9žkcB`JtPlYdɘz?i-ϮVyժ;%TSƝtqOdR|.߫G6Dq k0]L_QKC{%3ƌ&P˯nqƓU20H ZuE+"O TBxAƎod.uc_ն<? <h0j:AxoTZ"~Q/Fߘ|/@~u虊g:dw0u !:~aS'ff'{K*~D)Awe 7,bw}Sp"ZƋE"0/,,Z/]be:h} ʬ@@X-VyC<σ >^S~՚_Cߎ`sYKtU[b$`p]"E^An`ʴ[/_[-&b%r܉Un(`˱Z 7-TKۗ-Co. Zb(E "E>3 ?4m΅@,b&bŢP"ݑ,X-|+ޙ? A=?sղ1aEq36k]w]XXZ(WxZh-bbڱmX-EX]-S m]hDP/%Ĵ"DHo [X ň[Wq,QJh"_[o|[-V-E [b[EXE"DJ[.%nUqh jy`-  \@.[E`_D)q_Z")[@5JzaVfUv;ܥtK j֖(s=zS$c1_T.i/U#OtͱӋ6_m:ͪf ļrFhi.V~2\+ؐpxRg.J bfOA:zoP.0*L5c hڊX.yUQZ1iE&0Ԫhv-Zz!8qmj0xOF*uxxBjHu[c6<@9¬s)㐜#tJag;=82`DsbݰqmoF#lŇ'.FM j62+GK#"4 ۀM@Нj\ͧDw%!v:G؎gZ&^B`adL;aK+%(Mbӽ% |^W$HDr[쮓@4D ssr~^r*avb` M^!?!dSD}e&UF4NO/+ޑƥK\ ϧ4Si{(OR O/sc.HnMX,za;;BcZ58.'r6%p{Go3+ tw#`oj%`4QlV:"F\ w#fG=*'avi%C]t-zheD vrUD|ahUInxh }qϑد ~Z/hGSV9UxD0dٴ&iI_ל)}'(Db/@ x$CKRx3@@[x Ś`)bx[0B 1Vi8Cˬ kg*WL 5ٵᛅ kb#CwZ8r#infcɂyJΞ߾~elL4H uQ uĨ$LdL$$-^/\ {*$zc> !` jQ(b6-r!b3A:^-cjg /IwB}\Gќ!γ[xK)]¸Nj5S.gE8{ĞS|VxB*uMOt DP;xtξޮd3EV"Zg5)d!~kX˧Cu̩v C^I'z?i:sC߈=cȜ3yl|ӟk HQٝp()NS\q"kD~1kD 0ck.gVuaN"}_SUVIthcJ\ Q^fGƽSc_WJ.f;~9]rX6x>lMN;-Yyȼ;,lŲ6:tYm?]AH uwdőilZAWsj\Jbk)J;Dd'jwR`-D! +X9$-EA k=/yZ"F U-Jˑ؎ (T,RwԎGmң]a m!ir< _zImyX5;(s/3&^ ~Rgvo,  dཎ̱͊t9Ў#a0ܼkWԑ@\̒cw-%_;`xuފ"jj~h4Uc!h*$Xq5@uLMbV|g׳wyi'w9;fm~@[.4hekE/1/U["f%R˵96L;^+D#b̞93O@~fP8AHUOɜV: oը8].7ɢ7Aɳ?ȗa)N(,~!9IG)MV@(7V_e!5Yo{EBirX%AgbtK*eCk83QFy6sI/?TvZ]|=o:ޭOFF! )1'f!ʺb`S@\jWt)=x>z*]Hi!_><3rqGnذRs2DiMtN'Q'(aL+o[؄$te:MG>(Ĉ&CO1'G6pqi2j:,ZnI\΀8VEbXŢ%V,X'-YGo'~?`yӐ6Ⱥrw,Lif {KJAA{wvۯ]jAbX,E"bV,Dŋ,(6-$܁Z_EĻ/!l V1V gZ; ytqyθIeK^mKn]Ke @ZqQ<5Z/[ɘ'+&X7KmYҠ %,\%qWJº,ձlXj-m,X,XXU,,DK,XHdD7 bZE$Ѣŋ,ˢvBt뎷sp_+p3-"Ep-:@y(k\cQ,\Эi\-EW[ b(5qbDPMr\K.RXAp$z?a-{r6r!"z_|uu2Gl[ujS+<fZFx/ GQ7fN;ˆ#4!@ @ @D%Ba Ò p䃒 p/A LAPTAPTAPTAPTEEEEEEEEEEEEEEEEL`0 /QA@ @ @A_ |/^ * PTAPTAPTAPT/~rм!B!BiB!B!B!!B!B!I}3AX,+\J#AUG y'! gɨe1 C_İǦ꾣y> ,wv_y %OKϽ6Pr֞\oԋVGJnV|#7w/ʔg@n#b;'š h~xf")ExCAw@Q A K]ĿیMݺA Q+ ®s>IT8_ p"qjj˸.Z*O_ 볗|9FR w[1$Bp1{` LJKOy\n%ar>ba@En^I-aJ@)XFiVe' q+Rgdt-fM<M<ٷ6CɎDX2w.&RJvy9 ^cKp(Q t8=s`RBWX)R-iȜV7782Rb u:e<[Gwɷ}LWQ l=,ɱ˓֥9n1[}-_KL*,84%i452q9x;C^Waؼ22EdFMTxA-RkJ"V?E2)Dq,+~@אQE:O뛒! 7jA )8ΰ 1P9ÝT*6ѓ9?GC\*)ZICJ5^jʙtDDB"b>iő /DMqCPxX0UEX$5X&z`4_7}'篦2y2BqdZ- ,8͏2sְ>, ¾U Ҵ?G}1}>+cLmc$N6t1 ^4=?7b4Kn k =M@|G!q}H*07N)@XPE Ϡo;۟D?59>ḣ3hvœ|9AAkw"zB\;, tCn[UN]b,X-_*"[ןNjnM(I4Q~f;6Q&'t(s?(*MLCm:G>~Ak55c>jG p6~;ӝŞ(0(* W X `ݣ %/^W}vD,€SK):&N/,ocskǖmXc,U6OyNC8,@F9 W'ٕrzӆ'9fԗ߯-/=gَzcQD|͖ˌ@N/͞\fY5ሕŜ=>!wȸ8ܯ(OE$yLբL|ùĚipP@ 򀒌IByH5s"45l/NRx9yV?$] `4=1#Ed7g~XUMBOg„4iUE5\S$#J}itS?|cr'?y[L @b i 4|ڪΠ`..P0!|Pe ӏ។k/FFzT46#so sNp]&-k*DQm|_}!Аw.[}w%29]NYf}k9i Sgy-, w 1" ' 6om"^~ q<4g+=vę3Ж"|o;Q,ߨ^ۡYnk5쭀XH!8|=dH^[h -/?E,Z$XXPYPO`a;a[p>@{}c5r;2b;\;J[6rϙ8)&jG_"ٷ}hpw%CWq뼛j^@G&zйW*wVeSH|`ɯ_MhfbID2Gr &AdviH/9Ʀ$;&?O. `0]n'٘avǔ ?qRØ()( gRo-9"?O8֜r\a^`&TR!)7斋n4vCUayhA$DCpKUBMkWH (DAr ZmjWNA8Mh/JnwtK=v4=Ș< q-EedMi$y{(e~ژhˇQ<2ǸT06#/.#dW.TedщeK?YriǕvcf1j4G)- LG]T50N*>:;Ktϴ7(T3e)wk‰6fc]/r Ry]먗qg"d#Lj9.&b-B2 r}5 *HR}7h0{w)(0PHcjZ8 0#Im,#2r/ ltS3{߹l3%*)hRbAІf%U{>!TP!H!Y>CDh5;92ܘ.dA8Θcnt=(T}K󧑠Wٍ;krlp^Yȑl#Nl8׭#Eө2wEINM^$anw ǞkÎ:'#9] Ŭj=0tYc"J'4'ڎǘC΀E -XX(G#7{m YBV7-A|KBN`X,,/_?J`\ $aSr3Gxb<а4 #7vIdɞM\`Mj۾5`\{0Y)O>aD6> e?ώXEF6x |٭`D:!TYc >#| Ǩ_W]؍\, :=IlBAkr*='Љc?!8btIZ2mH0m(Ǣ^a, d&*|5E%c bLѯM/y00pA#7m!29 r{nF=z wjGJdV| %&% ̩' F4XcF4h9mA)BG^ģˆ7O_CۑX%?Ya F< lHgTp׍&ff7&VS03 tA5T[|Gۭ# .~p a.EJ;ORE 0uz=(K5Fw E(x]+w1j։n:U]a\G%GQ'1u"ⳋi9uQϳm<'1֗4{|0hlnßsb}׏vR&Us0˳ &՟>&YQ'YT3 aIѣ9$$vǓpC۸PHÈ7/Aē8"ح0?9oܟVADIlqtG<8؈H?g W 1V!,0Sć\P0MѫiJk߲LjiAe~1J9i?QfT;NƯIhϩ oxJElB̨A,s !rP4-]68)Bfmؙ]yF(gr%Tr&(D, լ16ܥ, )T%)!P)Ah(0xjSz%*_%v{z״5;qz#^D"&L@}p,R ^Ś(RIS iJ'r Ub$QH?%bZ/P*ZP\ U ,Xb Ȕ)E|im0 s[. ?A-*|730iiih\/ /n|Ed8 ZH.HbȺ-Aa4AKlAD_ä[Gm0jZb5՘K~^Ztu A[G~.ځj9֔#fnAGvr.+gm40umX,kG5n@A,vcU6 : d@D WP%,X,X@T',4G(#yQs( k;O]3Vw狢k|\ABf7ބf_5WuնnIH-̞P`fz*FU6PrftjQ1z2F7?HB,v(CA]CB jo R!R@t`4hѣG@t0ttthѣF)e xkfC_DLJ a1w-И{KadI{\y+(ڬpsuuf{̝y6B]ubknRZYjV`B,Ni24c:Wֹ,.̶'̆`)GuQ#H*Q}RE+wzO {fTkt/ z55r{VE)fWeru._st}$a2vHn-Cv w[Цy(/a_> R gsm*CP1⚣B%Ä7p_ 3st\]J PA=4[J <ݭ0hZMA MAbͭ^-`~Qr%rR ܨz6f}xϼϑaK 2Q(wc+2Cr xk ;Zb70Kd $jϐ`F27?(R[WP=HB:** VXpBK lt6Bs}IzoLj0zG,鍟x@U05BHuH+J9S9nzf\uQa ;w+ )O@PHnK[$*To|#r> ka-2KiNc3}'+wY7̈́޵z{:vk'(!! 4ֈ߲9>d<@"/ֻSfK_f[F˶ɐm3x1c.aC-F$Tǁa^?.«n,)dwId%vmB]*7mH;m-r?GTKglqO!;pb&MO5~b{[w @Cs7B'J-}T,LgCN5e (I:h/wI qLY?A|$!,3srP֊/hhx&nPTVΥ'1MxQ #0La@mfk6Uh_m`1'k,É2#=iVKRXӒ]ΎՂxUbl1f͋iVѮ d%]E7(.aj=c9D1B){z{am=-F(ڏ> y""}-ijFB1B !Ǟ8ST 0\O% +Of`W?&ET >e0dK0y p'[`ȷ~ W-H^M-`aPjƍ-No>X&YR gq#}ŗ6Θ6"ABrgX.,X1f|j4*ܢPe%Sca>?k%`H<8{}:mgP0{692r?&AO4#Dܿ_0'ފ޶G[10, l8Tuq llf$L!pjvR+KNa by2v!M.CasCaAII @bi7x=q bDj>L\'G@? GaYЫݹh'Gw"iчA"qrH(4]*YG}*gkuٔilaGIh9Iah*v"/ -%/t" I39[|<VC7]a"zTE4,p[̤'_6<5+D{'kBA ? }\~z` '[d(Wx\d8KI=JwDi?%(F¡Dkj6 6LVB>;HWp>Ha$ռŨeh 쨧)꣊,T7[l㳡?/.ZjfD^A+5,5?ĉ ~0oWn> )s,IbS(NA-103'ݑ F*|u(jgr_ap#Fsr0 /*tg:ٗ fݶjTh1ѣsVyvAd3҆A .+fLmoy{ykJ(hK{.WK0H-&S^)k5#S:6/MĤ,wu&jzρj[aALT!A  tP|1TQT9(QH!N/)fW| N Q!c]1.0 Lj8I0tN-05YW>Z򁠼" ;B+1Hb5Ap,x.5FKŃ@\P3>p勄/bL:K/K|/L p̼g4K`FP-^ HCCZ _ ZW%v D2ӂ4sl8,Q(E*c^M۝$^3Y5?Zd4f9ӘHR )P'˒Qlo=Qr,ϵdn"2rNp}Մͷ=k4u)`UH0RziM_|43|/ R`</\]='{&f+  YLI 4h,XѣF(nHJ JpWes2 R3\rX-%]1&^f<6ܭG(1}Ta*2vf/֒qЕsn#~<{DܤFCn{fXx*ğ1׼:=…y35: X6{}F )I9` 1xBbǙum )R\C ɗ cxNC#  Є<Qêz7+fr뵠f( 5i.$VN@Ïv( p/)E0ޕ\ɢ~Ղ= '߆iGelFB8>Fl7(WHmȐE;>p ڰ%)pwV05UUCQhe//[|/i,#Zuƿ6.\pbJ aLm,s=cZmǥs\];/x)q>y`WR+MWߕM]e*z [HGc'+ZuvJ}?#~Ss>DΉ'׈GƋ'43|bNLp6be˔dėtdCnA+6۴tTޚʛ=Ic6$Aez^rOmT/A@@4 4hXFCŲɧ*WGj YO8%P(P95EF;L}򋈯yzKv"jq-=4KWL8T}?<\=y}0G1pAKWzW2'S[\u4FUFٞM.1pj;s0q.8x#, t'!qgfq&ׂc׷ɜ!~s0BfAl e,9覢bǖY?|Js0V]aKyqdچ Äb $(KHr@=1W(8{ eG/$Yc0 ws_[+4> i} ]^J`謌N!3N:t6rwͳ-,7D1%,M! eGʭ۾:3YvٔF#x-@iނ=6}ۃ>\M|t;<g 8%P=-l/^\v דAp Q 9i&<*fS:/>c"/Zh';;yf@?/K+X@*hoAO]#,sY?g8D' ״G G)-6!Y]ٶ[1;*bauKN5[WW<}*'%Qe-,Q/R 1u4\/ws/4W̖2qݣbB婧eɣyʓRg'J;$TQ 3>5l+*ob\84(!}}ro랹 ] /rx b9~~8;3|6?ӡLn פfn2yXff- [j,jyw8;B,N5nj" hd7!oOVX{KH>ŻBdxt]8`+ꙦgK5>-%6txU'h5qmnhx27509w%4e6/rt[c^mt2/Ã/SLF&#$aW'6}ł'wCdFDA- F4p,ppphѣFlm|;~IG PQHO"  }Gb?"ho2Re` =vҊ Bw@OT}/G$V]pc>vFH#DSv %}&teu?MZӹ& GVbQIۈs {X\45_W >=REWϝaÂI$񃢺TW|`F2"~AeKc]7&_MH6Hx?~Aڭ$9vХnx]wDQMtSq=y=$eYվ*D߃rX :쑌Es2=TkorO̡,V^Ĩٙsj93(9U6})XjՋSjb5f`֗-I߶ipL!z+^ʮ;zěK;½DKH(Pgwˊ.k7ăެLXCd-Q(OFFzyfr!1K{J#\.OgQ\d}e{WX#7(gwX;LTz;1X*2̀'b[FZ~][")ruZހ,e_zu^!<'+KTG^||سEêc(6eYNK~!2V#ⁿUuS;f\>%sIZ<5Qz|ooGos@)ih \m hy՚p(IDŽEfۡAEq%sMA%@xpppN{ѹųdͽz&f`oG܋h&R>DdIj􆞻(ʨG lPD^赆F3g̻eh1e^7Az 2BV烜.b,9l\^9~+ߐD+aa|t]L%.-pR|`vҸ3y!]$蜍4\>y~Pk>$?-c,b R7̟qN# F4A.xȲ(=4G*oVLWrq_w i9#Pi%J7=ut(U7K0ߞu'*E#8dwHDF܎)xv .Y\uKɶ&D!KS_q³ȝ ZhM- ^JltͷzPݻi7ff<{pfʢs,=eKX+ gRTÑŁ|4>1g_?Ys!WH^?ZYM"Ӓ #-PqRRzN#(ZW]/ve]q=Z{2_v4SB<A'pEpI֋!_O}hzL/&n B$K'}՘㣤=LߩnȘJXٖA ]#h--euE( ZA8G3r+YSYz-d]j[JƢ,3n~[r1c~Mƽup ive 貀hh{S˺m koRԨ VAHRZEs&N1Tg5N#v5w2Zqx1SߎOC'A>O0ߦ4'V^YMYdPw,XEQΥ5jA=gɱ`IUo$RXܟ=1?I|ş֓Ջ;qJe3c3D/展̐cgkژuz?J^ZYW!djD_n:3 禟J+vc.  F 4h,XѣF/afJeG)ҸZ^1ސVޡYV!9C4Zlh~y*sGޥt?*j {b\Y\*~UԾ)'ƍ'4"BpqJL-\f ֌dhLgv`8pʄ8{#5.r>2Es!C;r!Sϗ6G%%3 \ʌwKsavZ9$(6l#ŢL⁩yBaxG.ʏj'RP.~3x5H#⛄Um(a,^Jf@C7#1vً1=,)&9 Spǟ҉ߠyCT47ӈf63( ID79D305v} ٝy]e˛2Ɂ)r#&#1lHnmq;N؎ݟ]q>ho9&ZBR'8psB~q} I Fj8S{*}lQ燤U9z@kP *8#LIF{Jp">c;G|VcZ53×%2pfݔodjEӔ猊߫.1h匽Qc8؆zղ/࿅T ((,4IKG2KA ȹ؈R ~|R#'k)VhvlG+~jMjӣ66Xd.34:=M.ܾwok\ \+Z-H! ͉ A\yPG$vE\o3кg40G>+7]_F u1ߪ;l&;1-0@p:av:B˪p$Ƌ0c-Di6?~mwۍ9&M-0"+I)Ov?kIḧDb p,Xbao. 4hӐi9g(̉$RĜфL\ '"y&1>6MW QZ $<~# N\ •k l1PAv<&DC|N-X8p7!Bkֱ20>rhXˈͳ[HjFH>h>mŶВS?>9 ETٟ vSجpЋivDp_X,8T&ztѾ͇6cTnR Qn[L.[|aHfUs1C$K̛vII-LiB>\q0qEM"ۍϤ묇6 CT6Jh 4!7.ILcጿG1m7 ~3d^Eʼn*Bߍ,Z&wI;.preMqFwI,D2Rj { 1Հ8FMz͇PYᅄlU7ѫ6ٔW&f9KMGeR/lg9oΆsϭh+%mgbmiꘜa8b? 8iE09lxOZË٭i֗IRSn1>SnBCHh (l1޻pMӉ;ˣxkb<֞k -©sH碥v?K/ ?3Uq.u!1v:Q}9Y|g_͹{>!3]lW&{rUo݁!NXAeZk3 g< N:(9Y|"62R1k/#0^l[l!Mh7a#'-{-OW?Tc;eg (M=G%YRO ޸4isZn9>>}>8(,ULO%,k"B* g ?烵Oa1x[ AX@j X1P5AӳfzL]zxlI43!oD ̭\i<DVgӐ` nR"MMk>[[OJ1d=X,&[Kaط8 s_XOh9 ,йGl:?vdł^#Y$C h ,߾4*?gCN`#gh~Z7EMt8g+uS/Vnjv,GN>ȹP1wƪj`xlP^N?@8MeXf[q&9-a j~*?JVG,a>E=͢K Օe쇉lfs B5wkGl#^x8=a{=Pq1A3wFdq'H;7F~Bg%4V$_,a&[:g&6p tZ-ٟ:&ʟYygM%z~O Ca4wci9o>~?Ȓ=|O Q704@+E+%tQ_k#p2܊S܋Cd(Z ;2WpE(g})z1j4\&BOt䓰X^E8(g.e1Uƌ9([6uX^uD!l\;8uLccQnUn-?pKKGэį.%c ^:TiԔob.%ǂ?ޢF=ר6$r1f>x3 _Q{| RJHjxR)+<6k.4]3}W.V ]y#,+l/009^4,rX[࠘#YRq5f,G T)0 DW0BE3e 5pc:߷eOTl3X~agM@})K@꼁tmbuDՈ:r.%ۚ-.RITMĴ2A44ɪ-(ÈtZ!`ksC7a9"\TCv:F3%=.1D5g H4y #q>3KEHe4x8.3%)>帪H3^,s$6iuB\8#m̱܋;,`N=-AZt\V$YgӬAU 'ɢtRޜ !hx'l6!j#FQÏm%Qe_Tv#*?yH%xŏ_)C7x\o?~L_uڅ82y kW b8t XkXמ'O$ѣNOΝ[Vo*"r*UU1*0kQ hMq`)`W4OwpƋGc~=!_)#Yz>[QT3mT}D(S0E]uৡ"Θ4gP栀;MB~[# nxڄ#,+Mi=(t!o!U9ISyBU4QSחgۥ \’n_B9!e[Pe7GB5FJc=:| })bEI9ԟ8|py8C`<-oz9Onm iS?ɰ+$IJrLo_|{ó_6- "A}(ػXDjFlDjmD'uh(H+-/ KƟMHa0ҬAd`YC\@".xINXl4BV ΃e/ޘbt\PM$eإr77Jft(5%޾pDb34K]˵;W2UTն~vp\vxc1<2xS"̾.Ƭ80f>I}u~BݜhiT` ==N~fGSÎ"LjP<ķ*Uc x6!4~.ɳp3N` u`zN0t Y,;V٣=d7asNO>amZqa6w8+ÃhpC"<2r&'ԏfQu}l*ݬЌ6 ^ޑ`8] ?*vcҝ^jtI ޒ$:ߗ1X 3c[,⮌kL9,$+%}"FF.ΊlL^C?DE|5Y Eo:ʗ9QV}vgL` =6'1Ecְ0& 56Tv·k!l7 a dI3~ ; 9oFԬd7殽;![^k} -默iF'!5Fduc' :9cBoxFv'JA3 ViJ$~;g(#qrؓnŗ*;֣~o$be xM$͒A7}=:'IqH!dM1h(:0"r5_}_vƗeR]y_ Gy=mx,wn|_8 gbYY3BY.XQW; 5y;<— euvkCxu;zj=ѧ Q s<뉗2n̊c߉/tjz%1t8WdN:p髒WX*~߷;׵FYO ϓ?.2+n8 J &sݰ~#GבNeJ. Ef!lK-OIa}~cXy~G @==TJ) TGw |΄F@_ kUӄ_Ը+wKBV/pmSFVhJCҚcyKY,(m Rbw&le~$8u 8.6hhA Qn"Xa8r #ڢ :]xt]$V$8 6U{T},F)sݹM54l~ڧ46[ >G')8f+]'f;n*}R{ {E7u`,66u|| 7Y**Uku%߫2S%0eQmD963^iT?}G+j*BR5rgk!-r7hS+?.ޟko{dƑy*ci;=D1Qk9PmF5S\NHD/Eb^8+dD.: :VLx.ivʘu.kc(t?fpD[j 9ڈ1;?[{$IοkOV|䯟,M(mzM,/EN^5إuԼ^_[m=q6dmec,#Nh>okcSŤ] djYye~qr<ɪ-yo'kz"s:L)Loj Eqp b0J3@Xݻ;MEZCY=ť$)&ه"2S%Þpw:]eRS#L~Gˉ^ ћQ=X.$/LiUbE?dSToܖ2f3F;spOdޚ>uk̉wB>Fvż%Tk _TpB!Ru]c?JFh*V! K-N 9Ch^a1^y_#blw銜J.=q_j$O(d4VYVO,)$ y @+Z1yЃ#9G6?1![1Ĕ w>%*O+*ǑƥEc|O+UmIr#{)a&?(mFcۮyN=n)=V_vQ(z 'fk'(ޠ}hS7J򶽨?7>TBl2ȵ"zr}_8S,pg@s |eבצ-Sv^>#&Jx{q4r=j$-sm:ut?\ד[O(92yFV5?uKEI{*pBu4ҧ%feQWGrFKmžͪdvۊCΩr(Gcخm'<t}z& V~ʓ$^ O9mXؗ\6ُ28H n=+O =:mϕGma9+YYaZa^cWmO]E wP'Daw9Cˍ9c>Yja%XWi?kNd|Giذrz4F- K`YƓ]Mm)oU(olT?bܨ1װg#ʗ )Xfe ~DMlк/5}\RVS} W7x!bUy(}.i%ƝI ^A*ֳ^Zq=r\:Lg͸ʼnl*~\lS{ |0Vr7)+?dA$ץwOi_^cjQ1#՞[%Aܹj$ fktxgxcZ}5bPVHnê=8_]:Oat1+2K=g!S#]Uuwi6N*XfXpF >B7?W^y(fP&dxAԟ(x#{SS[-- {-}3D'^trgP˅ܬlqea 8xq) co x۱ e72z]wCFNyW7gf Llf,lFvA;%_]^ -o( KF_j to,fLCfCfO]Fj1D첺žQie]'7ACz' ug>sO“+(kc.M9=5^J k%34gd9=dR>:烃ܴwVmh([9.Q&tu#rgN'_v.Zzo&&c@ e:44r??0Fmɐ] m\+n7{vSQPlOR!r"*=`d a;PNWSV׌fo]4KV[{H: *PTE !Bp=5]JCZ_AVHh)a~nnbkyC+ܪ;$ͥDl*$܍@R`jIޮ<]&M.Gbw\gMy-?:}y+ICuHZsz DZZ~Dz*S\B+WR x&Adbpw'cL77o_ta"zd7иy*1|UD,V7| I|'f6B|G/amWnw|60*H^цa- 6|UPuC2/y7FJDxekgypo(gݽF!z<Ƣ?鹞-~/kp 7R&ߛŠ柿9'q1~?_3$~]uي8|nb9AkZƶcֳB9?[&$YR埿P1sK+OD`l;bQ]Ol7C< 1\q0q7Jhj[~X(sk1!G`5Q©E<;\Tuo]*gבI)dљKLFnN;GX&7Yls,c_YČ|I?c &@6ffCYub;&H=vq(ϼ1P]X챍KmQ9Ī>FR:Kq P6drw; _I_^GLHA6(P횿b>MдF1Pn^QR;⏠1! &+0(D gs>\2< KޣLzSG%^ /[']a[0]WHRO tGbY׾kV0uN/T&wb?"귖nCz* F Lߌ\ႂU^?&|4L=5 ׁݺbuuY&"&nYsjX氌9ΩX":BTŹ}_`NΚMCȽ" 똋udɪuw]k4F҆gii`mIbNHy?}*f\,ٱB)W~bcOVJ$h {fZf PHQ!\͌1\elw.,RWq~̼^L%9ur`C.b7CL|:K'atWž>:h̢ߋM&7s$֨qxqÖ qFS\!JVh AXPSFțaN'vwzG` : LZx1i^v7sT6 ʔFb?brDSsŤD_*M c)<+! 6Bn7;$|Sų,vtB{1<|uսb v8Y.8y_#SqWylswXt8EC0+RB~2:#ؗ@eTc8fr:y SPc-|&4bߖL|cWy `E#0ozi2^6io4Oe>z}w"3PCa^fxE7ޒݿn{BweT<;Y=/jOz{JoVƓ]{e6tHb 3#+QQYVcPDž`P0TO)1iQX C$a5ϓ;_d#E\ 듴|YuV3x3Sr~^~^Z*$-zWĭ!hTy!X='CiGԳ P9aȄ%" jܻ7Rs ׬ ;o#{2͞vl7suz_+܀&-"[!e|=:>U<brƶaX{agzyǼeurR¹3h{rF٬/f̋%AI T/nZq|/!ݳyVVy%)6)]\~kcwUb*8rQkR2 po‰%>y:qil^9/?.7뷚T ):k~N?H k,1W4X# гv(d 4W$䢵޸Tlhä(} u9KսyYΛmø*.*[eg+ .Ybbj+8938>4\%ㄕOn*I#28#[[1[4)Cr3a%~O芬EA-}ko4\'MXY*iEr~Y + w%$EÉl\eJ\%<?.]AV 17qL)#Ix`#K|-nEUC]cKma_O' 956]"IوRK!mCRy<8= jvv ϶Y~(a}Ѹ|1o0W`aC\!b-`@Xj^LFVW+j.O#%REG6=ːvIcG5*:ôhJ3CwǿA4SDڳw\N _.i~WWsd7 roh@:I?E^eᇅvq`]G O뷟o4mƛ1d$Gbmt&ΊXo{lY jtO򕖒Bf@C/nJx{ꍘ~,qh?g熖3 >76HjbasДٺ}EmA f7O~X0e̾bB;UY`|6ka^91ݰnq<a)ń3cpH˚U6{/K~Q3 `]rD1+6LbŢ>WɓKzbqK?@a ?7|>eqjjɤb2h!Cm9{G$JǎTouE;+{v).…q+oX}τ~r nF9+|?^= vEc4c{U.SUF5*2nDd5FqH/8#Tėk<-("7EJr?7_Rʞh!ưM_CsrVikxleZdLX>u09;?K94g>F2x5-&q#ޗ!n4[N5儬/I*Ȫho:?[6/6V0qr'qLm?cU},GDkU!`iyٛ<{eYBm):!m|pEHoXi)˪:Qa v8rrZ]ӽgx ^УQ<_X}:D%Iob~{)MCQ>BbjčD:Ώ.(zh|o7+3,zk;[lbx{h ˭aEsUOȝd3 /Ry>,YVat4xOwQNġC.yH('וmCl6+~[Cl&CuGVC&XkZ~T$ Ǐaƪ4K*Jy|π'`˾lnW 7ҮfgKjYe3c1nhm/Ӝ j2YՓ~f6\){~߱+>i$dns$̣,V" PY l%4cK}~27DnJޢn 0ܭY쫍ijV2z5j!zmgDz3ˇG ionmc|[>F97uqShs3uGcƊyA6?Cbwq VV~وDD9d~5F,r) 4x`֚K|qq TL(0[F}),|]=e1FbQѴWQDuYmSo0l4[_hQ&.fY;|| *gS"$L S<84N9[FZnI\[;ޭm{vy+)c?yv9@v?=ɗ+97Dֵx8bn n΁#?u#{.lNxF$z}D Q۵hwdI6eݾ}GD2m[? ^>DQUkpGA'{(f^$S̍e| y<B0vf#Dl}a*i{#'.^ u!EIʬyq!-(Z@ϭOg͢{,صZ;m3^">=KuͬlRwV`$: 樂ӒC>Mrp,OJhkvг x?#d+U+lRq0&.kjc" n`֛ZTu]x>bI% r-i-:h3|&]1&s-pʤ[6%!o-h!X4ԝ#v <34&=^D]IQmR&F>"YZ%$ g]ac|ۜ2'}45]]躳7^1韽|t7Ofsvtngz&p ⣨*eXB]}^kU: Kh>(7,^Y{ fX Q7yBLp&ʱCԃZM}9H!"2#sɌi7&٬'Bj`p)9ۍSp;wnz c lIǾ},Ө;v=0[udhɀ|[i,nF4sG>RRDg~P:ᘆHsӋVqG/ͽYe-(ekfo'uoJcX8JG]O1kj.UR/)}qzߖXƱ`qz4r͘eO6o#1:bj*ʛ>ss *%6z3ϿOOꁡV '3}>_c !}coҴzh/>üB4_tn=mLoƷ]Xn }X6JѱyfiV'#o_̻ .ހKMq9q3oA-3y=هr<:'_,6~(\2{QQ}GЯC&d^ )+·nOuD7k$:MK4eǭ5s#rG70r]$; n~R\C~HdLz+wpἍ$4YK:O궖MTkԹhd(0 8rʼx.lްB3B5@9feV.7ӻ`dr*VuGй˲X^/#A(\Jl=<==NM { z_4b+r^oO O agqݝj6sNy_T~6u0=R<9KƝilKEԶGyܑ1IkOHw]Jkp='׸Bɏ_5N^E;kɥbW<EqTg..Cc7Itt/p'w>0ZvLQ{xhkԴT糋E|t~8ϔ 6qrp]O̬=l7ZʕD ~j#GMG\]yxwrZl+{Qbmp~Xrڨ`V.+NÄOBL W]hd HnSۣv)7f;+'] 뫒]nӝ :luzPI~j]Ը^6c=ClpW[?v;m5o7a 1C'$}6gV&s]$62!mwҞ43UieJs"PY.̵DρA jx8g_a-rټa, \'%W*uGmE ]vkœUʿ;G?i9+n8Mtl~ƙ{Pe z2깡~wG~ٝuGOuV3)lI3TUZ<"R9ݩ4yԼ~4$ǎkqU]rѷ6͟d֓SϏճ# O)]R*=궰؛X /Pq3U5,1b+C44UzvdyliOcrQi;x-PG%uiRT39S+#Xhd#/߱v634C=}*9tutv}Jz* \iqn6b_SE2($^ ,%[)j.KѱŮ5Unz^#vkoJH)Z< 1,|oY1|_?Zzӛ;xt8kO.UMZMo|KÂg'p1|WݮDZy320i}v V5W$B uܠNgfϱ"i{bW9C Xb9KkhIFP?Tϸ%QׅLi+8/Ã*U]sRGh8MYp7(\70 vwCbjqx\`q nVRfP8a`f<mi0Ttyh_:czr!@0$͌/Y9: #3# yk&?eWʄRS8_^1'vM;i,`3%|d:Y̷ x.Os(';Xzqü3W8ɍr\\W8Vk4n!ï3Iz7Cztة\ٷ+#Mո̉'N%Ug/Ėe*CrÓPs֋cuMt'or6'Ϯ&Ǔꍑu ^L'f%4px緻|VA/(0ot8\4,ز,$?L-U:ظ#9e x_&-}v ]){L}ɍykv|EVU$Y(a ,\N<3WY5^7>1ٕ0BxFg1i귵iY ݉3TTw[ zWrNXJndk uK%rVz1S83Env=i#mV)56÷DWjdO?yKm{}{4;S7']31wfgY]M%Ϝ]+p>9ܿatW7Ԥfiglպg&MVY}V+._?`J.6lrBퟐJ 1U#Gݸ--NtGw#*`:?|= q'+;#ȅVU7::K*]w(;ܯ`&Wxj^?8PMfNLs|6]=IIc 'sIM?m |*yGXy*љ6>,@)UOjXdm{"署sa(qQ |fR|mzw[eoAvHX[XXϣ6em}Cooĩ^v_ w8IЯ꺝V̌noj;gvՎǹɫe6)OcAmSn~9ffRbNݎOf{yG 2)FP[S6HŷHߠTZނ} pMEGZ_v}&*;hн~~ 2/-ub.Hy``1Ώq}<;ɒݏn'ŖgdTt89z!kmʁ@WG ȞsqgE!@@Ü>ȽVsHM*E+h-,^g6nk_;noA4A"bDwٷAR>Cc.|jc2i\\ܳ4x6^m]~ {j5dsjvfIpf< WԽ]x%g=U|wL/е&y]?W<_g9ּsVxc顙 m,79LL^QeohH7$H%7f6sF&gn00S4HnYOBWP÷=uGު8NL>brDnLa>;6+dr58 N"[i؁{Rrw=xog"=gS~.fߡun3ևGsmg=:E}k[tXEo'րn8%ew;v=wC3+̜ɫoΛ8`."z!(IiRi/Rs׎Y&ӏW9QwRhuҷ[= *gy?<k/p"RmhZ~\OIZCbOc"smX|7,Ù %:Pi^7}"JBYAk |Ѣ?b_!8:fKm{a{-Zp=/7ߴA GE~\Y=m)5=vRZ bfonǎH9ZS .I®RRfeoR)+&btKqS?}R{;ԧ#9 P#uX*Ex =k.>\7_93h (yߨMu5hC/c䒹 떂f%EZt<8aYwZ)hK˖,ʽ6 c$<4zU9/h&vI4!kzro-l͞KI/e€ەP~lsb7Qse]Fאv%z]{_9< Kh=|}մƉg4_ҋGfU]s残Z3}*?BsӏX ^lFɋ^GH 6+Z|(eS/"}HXv13XsY6XYVYe=z(VxUTӱ3ingZkGvm=5"4.KACOzo9ϧZsRJv!\ٛDw%Z0 :(0,Ąހvj{0z y٘e0xNB;\C.n- qoU@1:Eyc2ًeHD2{Q5-<)1^#{3zRmNkQ1n |<_U 'ط?"A qvsz%oC Ɓ _;[X$/Vӂ VJcHp5+K_;d!-ěCׇfF6zu'66V6)v9ؼyn*Pv0=4-?^nom(++xԣ":Sy!d> 1.:*We>6[į¾'\<Ze&D%2]|!:JQ q`ienܤy3~nabUsmسW^֊XYUy_Nkߓ䄇#lj%!wBqtI;wZ[?~e-axx 4R]m.n>ltJܵ?qO!J62G>@g0sC%TlMXHKa .Vq·i>>",>3n7wfC%kq2nH x°n -x[qp-c&D}O6o'r ;Zɍe6ea[sܮO/ IrP[{~i]1i[}pIq%{S+VjÞ(g*r"`s?}ZYt>uj;O7cVJ>r~[|VC%آٔӂ=|J.O~zo˲Yeu S] ~.8OI}^%4cEŧfaK^qlI廕ާѥby*+T;B*"]SF$ l tt‰ʽb70RȎq=P[vO5doPα͌sr{9lB7*a:!4 i u v+%YQ+(W5ԃݳAI<|m^+?xI/4w?XTt9Iubo ͞p3`QM])MwdܥnN:w{UrLs^{#nUp3Ū3muRoO8Nx+Iy8rn#" MaXx)S]"=u_:EsAg*1DuےQvDV;Ѥ3˷k G YIY-f.49Ko0oc/w{qpUMhBϺl\A'F c:'RmEDr=sI63Q`T&F3#LT3.v򶽞A#܈ au`[C go:+)ldTH#^:x #|R#%e#.2oHM % 'boCH^MN0ClZkpS8T$at+A Js`~̛X/d ➒j[s!asBY$iɒST3kgb?6%H[hȾ#*zC8o݀5Y6N^o5 =3 DZ|"6dDl:W^.>2,DX70R/tN[#AoM'7ЬM;=.:e jztGX8|QVrL^zeL$VX1|wmzBy&R6y_⪸rV230OTJCj+VK\rOj+-Ta޽ S@##A7tjImrTw_D:=\NN8lw)ڋ+R^.㧷F*(a-3[XJ%; Nhji$C}Sqf3i&ôvt&MmoV.{3H*=.<@zVylԞ#wnIjzb3 2j #T Ŕk3tTϲQJmݳxb5UCA{gV~""ǦbGf`q:/h|##wJ]2dy7+olZOb͹WI,Kl5Xt  %)~S+:U脃;vNHImm1d}`bg,_6(y?:Gq b'6 Y+BWLLhE\x#Yg^dVH76Q?ӚO1bf)] A7Z-=؎ w$hhE'' 8Q2CBUm -8X3!g bXSvmAn5k\|0҈:8hMao-M[%s'7/F'RHG׳ŔU P  )TjiYqT;,/hLg0Γ7BC0Jdj%ٕlf}>h9E$aA};㕺}'63UˊAť߃e8$&_xi m)Pn! jK$*Ic&,I8lV~ 3 6tՄ.7/1Ȗ _P78LoBh$9ؖuƖ63Z\/= G(E4 Nlmtf!g1di#'Oc7b켺]s]eAѪ'nOgpTbK8K֒=cD!_W :z~3*nd7&Oޥ5ЬSFi+!2#*oJ0'*?SPCLoiXs9j6}ݠ֡rud,[+T^C`1GTѸ=L|gT|(l2gx?(}H ؁]ZNx9P'" ci:z*]>~0Fvqcxd ;aÜt2B!prC$~ b̉[~ԫ!6cn="=^({bXRġ"7'j eIu' LRt=0U?&~Hr.H1ß'^ZcD.{i+d*'{b=}YW?h؞ܿ\4`Mݬ7%S0Ɍ{)/W+=Innd37Ԥܗ>6؏ml\)9z+cU뢰c3+O䲤Qvv:ATʓz$US3M;+C#*ӧ!#Ȣ0]{ӂk$ P˝ =9D( :1/DQ}x p{҄ld9Up1\V_[d8N%N&f(r\G䑴|#5OP XSS&us *39زZM/0>qB땇N2[!+t|'`M#ũ!#>l̗"?PEU^cL&b!HT`Y9a٭4pb)'I@.s)҈-Ic3f0c-2k[c(x r{Mlf΋8@1E0cmIOjN;J,NZW pi J43L sw.VmމCbL&wkt]Ú`Yz^xP~ ɧ:5qdԜP v . hmpQԑ>Fe#{a6@֝qhG>A =ُ 4=ɲLɫ D= T!w/>< q+dO*q4攇X[7?C}Sḫ t AVK1j=+za1N֞C" Ke9QbndX>C8CgO,i̖EySE#lㅁBcX>=Z)l;8N/M2CU"\T1XBg>A">~ȮӏVr/FdZ%nؕt'iZ0wNv\GHpxru'Q0 dƫ]r^Co't,2Jr08_8)>&rTuiqmK 40EW:yNQQ0 ྊKL2Pt=݉Gj10Ƃ6"X ?(ߙl#Q#ف!~)nRpdҙA/;!>c%!m\[BΕ# 鳢&bȒXĒg5Kjl͉w$f*BG tb5jmPE87qFX|s:!-)E&|[/J\`4(URem`ͯI Pqp@R{WzQp͊F!zE%EVdfF24C,?(gO,o v6aƦY=q q">OI0W A$9 j@&2` Og~.> 3r:&TJ$:#LT:]N.p4E9F(ʳH4cCF%h[<NS'm2NF";q %4~{.Ga3Iy8B4Sm8]`ޢ?J`̧TZ#y {Dq(z;b0M,DŽ."3QiȋZY|gɋeVM7yNL?t& f8YE)Sjbax%Ħn/ĕ=*#Oш>bs2BYS&CyDkPkVrM sL ;%X㚾- P4F2P^-ԜR@╢>J",~a"%jr͐IqН3|]Svy b`/Ygt2g@ 1ϟ3eȍI/P# !<]Qrq”g+b'[cHT$خ]#\qM!4d17eӈJ8^q?hob0GQI"?q "HYc>y,#LMDgDu24 7,} cm5$c %*J] ͘n~1ưM)5NJތ>^3")"q=BpّI${E0fF1.VA94F@e hf)|j?G)vxG;f-{ϝ2q?紿ѠQ2S:`T 1 <{ |>H}36r0D+AƩsV?S2xߙiܶ)M/p\Lr Rt" JQ7Y WQ۞bO PrM|\ڍIr<ۏSkɳ3|;l1 %Q0e~H$Nþ&v,̤ <8C0,)W9mPhi5EH݃C8bĉ4Ti ~HkNI+v&x.Ό61ӯHrT<ՠ+@ '0Ŝ%t"8#JQ 8.72 ɝךU30f($FKbHԗ:ь C%n7r%US1,ڈ Ki8R ɶi?FX&bR#`\@~sR̓tN}gLA=L1^I1o1 ҁ 1%ORF#E#3:.8C29D"JmȂD%ܻ钂jFh9 )6«Km0k.b?$}ǃl12o ɵl),~q2GPA0AQYSM9 Q,dE~B;2 0w=eI8"8<O=ۉH} 1X*cs75g_QߛeKqr[Gqh!g1Gz=%A0r r9*?, 8Ub 'DX-C.ZoI4LX^|c$H{Kvx2<y ۘS}NZ1ہ~#xB60T g8s +Fev(ж\Uh4)LA Hșx6h  h8l{,ES&o;D^S;t~nmGZ $wzn@B<&J숇@gan4zi%1!!L!L~a_>b@iHAԇ q@]q2Lq"uve% n bĜ>_=9<NF*j $X8b[+!:->Gܝ5ȈVH)CG2kXXd 1#DE&ţ1jDa>6C7,r8Y7È71,b#R"GPF,c}/`CP;Zycck+3ă=ŰAF $ʣw}SXT<6:?Dd^Nt6ISM0F|6"ϑF 5UY"+rc&Ln۵ح#I{#t 4"1]8R!rAf5Q7 B ̩8zw\&АIc; B!Iq@О(;"Yth[kq'#ohTS,še:㹮=dicaĒ, -32H^`1$IxRp[43JQ٭ F9C2 h^j=h7&)CczMA=yg:@ qQzEKRTf|./ #HpErt#ly\-y1PvjI#5vx+>h{JFr2 I L@p}OlC8M|ݘ!h. CV|<"!KK#)+*c@\2& >A;+UbIX_\z&o/r+j >n?3"6)k6u`?syh*yK2PuT,V!]G=w M2u  hwiȽ7?4p4X~Nk"V'/X\w'}Mg̤{p|4_5&v1b%WoH?F=򎫻vKP۳.j \Xl6-5qpL^̕~mҺ qLWnd+.kH,Eް Uu؜ޥb <^fªJR}x*ZHoøq_ĺ[;U!un; XVy%M٧Voh--Y'[-9~K%˜%Ʃ]T/!6rٹiM}#j邱Olyt7!k5vzZxfxolUMn~KbY߬~eg #~zphKXٴS¶E&Qh>Xd*>h~3R[zxIۼBwX,'#Fn,}yI\+q#= z j}7F^`FEw',VUe({Yx>u(JCC4k5 >wi{H<杝K?\pRI̩p:l6J1[a8zHX[=rBn4 '{ơIԲ|win:>_rY'Sgfz+Ti7=7j6ۄ4#5硺ROv|G.^C 8 Z=ԚTA\^ H]3%[FxlF|6gk"oe{IbpWwe! q)w\3A[I#FB0l\tOseλr UFEϻ6H f2Ihj>K,Dr8~2sJB_uwBq/Y^IS<:JqѤj <_ 9u)DA1Əv/jk2!dCXmdCѴ%>zK@*Ar ܏(|GBwc^G ILa6Zg'޼9̫甭+d6@LZ`NUJR0),$' ݋JFop3е|⍓<6e"8fQ![әnKAs_cL2ɲŅri0A>ܙdg͡eDzO.q$$5/iE/UpH&HC^ՙwy. %a԰wI#Gw4s ׆sڝ핣\ lDWW?YCd6{ PyTL(M@vOO⻝~k2eiPjܸ$!ӰF:C4R4AБQ@$HH?5=Uc xxǔJaU&]OX<4b4y:_e4'{.2etъ<*޶8Cf(y9V`x{OE1}`P_ICҌ2GlY7梸[#Ü:"iB"u[_$&9#pS>8`=|U+3Y|hq.<*Oг4c*b27 h̙]%LyF.[z[NRhhgMH~ɖs. q6ǖ{v֫Iޡnk?iIc4Z"ѯ?e VwFDÓ🦅La^k͑51}ԺR~*eU< fτkm6*&xYs0ǙG]"nҾ8кY|VT6UјghZ7eĐxF ȢR0`n|?(Ew8qOИ4~T3XّD=b[N,չ#OfR,g%p7-c7zeT c'czG5^g7H܅vn?YAT&|R^=N%x!tミ/9ݞŒuv(J?%T tݓc;†'xstaF;F l@Vp%L64h/s KX6[yTē(cbByJ21'ѹy ߂.n}HŰUfo. Sv6 RCa9_L2)RHz`"vMܘSnz+_J#։V"mlẳ!"6>Bɋ!ERݨ,k,u;q`b ^Z) 142L4BUc_l|Zc ./2f[= NX 4;sL=J(E ]6V' jh>aSw|7w=֫I~$_fY\57GJ^6>u f<'PubLPVOC=Tb:*I^@uorϛ2ZyahzmBV3??.xċBЃl44crG7|Ǔjy]1ƉJ+<bjL9 dV"5:a#uڬ󙭦{&ة6bDnX} ,fz&C| i9˨wZ OPRX vFdpƯw7e9s+OޙQ%8z֒n3uqX5 ҋiœœf2=>zW>ĸՄZeetK'7sͶRƋ]:,m*wj8G[=8:qkEo55&H3\:'Ӝ9B,x_= 6jV=Ds$m+kt[<}*T:ڦ6=,1;O3lZ#[ ;: ܎ qIIPn$D'C|Z\`b.ƣ/&-Z~?{ NJ}i5s$ɒ0 ;Lug<ԜЎXVՙ \Mk]IqPyީ=WDZ~/93mS HR Wx5 E+uƬsv7ݙ(&φkaBo^=J$~~x4\~<1ewM`1y_#qGy+ƴ읛% R+6*DeJ R'Պo4Yi"_/ٷ g"rV}}BWG R6m'd޼?Ad6 :jM#Ex"R$O8~ON@t Gٻт m{A9~з`La7lɅ3"Qո`5l@Hk+dR8+_kPVWUu(;ZzYC'.\AT»7Dhϱ_d 4J a iԪR$Ec#=!ӹ^cĂԊy!ۈ΃pהg[& ܡ !IG~ڐRŀCHa y7E}n&>Ak鬾xjFR7JF \M}. CT|v4_Mi q\c)=ӢY,j CZ% =\(1w0ہ5}Fy u9+gkEiPWl`h6g [77O2Frd0Qr,dxF88{sF$Uȭ'ӨL书­=*NcKy:ByE Φ9zcl%[4ĺu>>xwZ)hVIM$q:n3Pܝ 2@4.EVφGG&c:#Td7lѝ?"vKؚ͙-~򧯦+/ʜ27b;""Ou:nXK]>8s|S V!kjY4!•I yu+Q!ow7wo#nB)@n ؃G=ʎ )_q.ɽˌh@[$oq9\nJ8Ӄƃ3!29@PP4'7$ xw~.42 ;+]_X]ĥľ7˱t;"i#Xf+(BpHuŖY,OUޞEtY76G9rjʦ*dVxS>8M(xyL2t/|acO d@>ga wJ|1L١^zpa%R #ݔY ^"rВ )(a58`֒}dr3rt!sj̷ y3k?$7cBv$zIDZx'l# E9F L97inX잞482͞C|*ng{091K ߈SL!rw_7_>tb/`6>NkX|?KQhhI[\ЭIcJNG(\px}r× qiD :__uׇcJJ!4mM q4| Рg|dő@D;I6IXdKu:O^OU_2hk].>߮J,ًkgקCbF1q75@]x89n-eeL|8U݊Q:}i9h?ai1+͆tقr-\i_!bHV0K@,ΕIMț 8v6) m2h{z܌#9̱|.7M \ɍ(L;%fג"Y62bM6D߹|ٿ=0wc)4y֒(3xG!Ŗ(SZ=\aBۛ~ǐ1̸L@V@eK`D!o%QY>xS܁)b4Ѵm;FBvN/ul4yq鏷1ő!-dd Ʃ+`{ kXc!̴BXl ]6= S~!_GקL5$3 3ff{4`WkJø<"DW̰tb,R;-!/?RLh cy=My;DMw'^Y%UIE,aa_a^?˟]3*YU)G4 C 0LO#{#&|DZY1\W,7Wrő馄e%>ٓ//[,U6GvFGYXYeG'(*}RGhf#XSNj[yXqD8:WK!qí\gpݯN{ݨ c* /񻍪c- \_d!?+匝hE Lf" ΁؜"ǶmLl;Y99n_=im,KSL.ÿk[ڙ mT8'A(坪Q:+!$>]rJ.5wgnȰůeᘑ\LhTvɰ+~7x=:*F6 lc0 AMЪk_eI;Q#k$2v,lY/rs&w[L'M|":ݹR6t.1o:iܙ`{'Sw)jGTǽ:KY}[V[ ]H,]: av3cљ3BkX<ӢB#'nz_gsEa H2;ünMC=;9(~jI`!*#}$ϯzA63pgO6k}EچuH7I<_+YSAhA1wu0#NC/{̿y_0{õ1U3X< ‰YWe#uO魟" t/O aKChlN&=e:7`gjPyͅ06h|S\Co#a+A&މ&8oa7L1uG;ʌ .+]bBf[!$%Ak:iҜi=? zXZ [OrqJ|!B|c-ςNwXI|"*_9 &o}UtUŜ%4M5$GCINH3;Mػr!tP{Z_1&Ѝƽ+czhs43goSΪfzO%fwitFY٥ijawu4X#/{A dڏdrE~˸2 GUʈO,#FBrPR *qX7͙a,IfOO3ې$CF.{-:`\DG9Tۄ˪i /!TcƥK$fBpum^4Z ^iXOS2{#m]q?Vib[\[2[co{y?w*#4|to>3DLs%mȠ6-Ey `͕ivn\S,'s!Y'Y乧:剱hvʹFJQ>Ax{_ɍ5Qi}J&.lוƨsFA.*3CZ)~M%i*pݲ72D༕CZ&|N k*}= ڬб{u;VARM~\*}C]//5DYOIhHÄB;B*WAu/$|Rƹ/fH [8So:^3>c&,̭_;dQM3uX7,T PO>w(1@9l`/IȢo.ǂ7\~[qFŻ}xfvȸRǨQp EtD(fґiXöwmQO,il gkd]tD,5z#0hMq/BO4y#S?%G>6}ww xI]?FI TR%hxD\>)2%j4^n\]yS>_SmeWBMw~-9KM}$X:;嚬] RQDp\S=t$PF&uz޽ڗA[d+^OBZ nmdlV͓Z" Nm1y9X$BIZc{lKX*fY܂=U/0X0LZ,V()Am]a5PdDf?s!qE}C!@ ,SEv+p;+99iu~d MDUAMYDD.@vR4y<ELPf,B5'$yİE}sb5;"o/Nf!n' *.]_.Qg>rmL5Вy!?2Ҷ{ o32IJOuZPy1Fre\Gن7i$[O#,Q 0ucs_CLqGs;ߺ0L2#NV˛;EnQ!#u!~(mx9٪g=wیO(UIoʤ44~䱃Y &ġ$V~+L':ewΥ@xK% 3و1qDVTF}/WNGgDc3C~wq8{++(Z[+"h8#@p1KelWL}\j~c_U^EWuExKm } ?;tJӔP0(8/ʟvq>3/&f媴8wu՘ˌsE 7X!-c/dO>9*Xl& G߱rb'\;)K欴e3a߳Ki3$_R*jQkj˜{8boUY?GxKG ,jS1ykPHhPQkeYǏ֩:B2pͼ]1O^^EbBd|7! |&Lo5:wٕ.Yq5# n_덋c\3, 7dぎxQ+Pn ْd$\/FbU;e#*Z!PΞHEoС"F9;(~Tm$HD=&'a ߀*RvJ}M pQ-L^}7Ea&Ηє- +Da@*`nR+tT~qW?B?%␲k򫘤2^txjcu\kt[_x'JcN#POAxc< +%")aJ}椭m.KQ7l•ga iMq %O$[BQfvBҀW˵9Nv"&s|y7@pǝHT-Z~!lCǯg愽lIx;>ڎ2=#EEMa4{0Ut~8yhsG4d1jԦ=Z q>]&|I\ېKf:e `n?>b"8-fa yh:`vd;mh.9=K?䙍GZhlNK17z }VGNsتO4ze$ʸkqn5^'>b_Hndl#WX6ڟæDr uMܼl],Ͼ:s-T\-"#SƟld~ 0˦2L;3S9F8)ov!MO h PTV.E;+܎&NY:pk/w&i B]G&ʘizLHs24f 7/5z '] :ɳ<ޑ>r&tCĂ\#$eѼTM8V)uLP,-MEZb);nSRtyCbJIJ O&868 UFƽ (S|^_W1Y"X 9\@扈"<% ffTFIk؉j ;%9 .9m7d?iG3tYC鱽m9k;u۽ ҥNn+F#´=n:XJ|H.!oV=ӝb*SFJ_ΧA(s]3Ѣ=4FƽЇ+NxMf% e~}N@]k7m)1ى4ƉXgAD2ظ~IhFsM%|N滎h6i̹>yfG&GbəF;LA}ó"z&W{ i&_tzT"B"JTgMϔ0<,WLYǃ{>W.c7|@FEn]89կʔ7&}j̓f`Jv5;@|L@z ?dQN6d[G!0oe?nar&\2{ SؓG+!3I_Y16t3uƨfU/Mz6}m+ٕbDԿ߿򑠡<;'f4) 4bęFőqc!O9Lv+P)W[Ǚ 冮Jb!w۟1 Cv&wy!c~ 2s Y#1c4JRw >W4x(_$wKrix>C3ԛ/ o[G>BU2vU0OT? &ul5[tstmq@k :ӡq޷Ppn-."O *\2_&A} N|˙#%4/BǓylD$H=˵fVKp9/:Sa! ^¾4SG~sba+D9l'uwh)rms)8Crqp˭]s-f )3SdAE-GԬB}N'jzө]sp~)nb1 EKM:A)t{Qnme& ^T{Jµ)2NF|A7J]YniފUN|g80V-"S OAU/[,m}.G*b#g+#d2 ]w @}˧jѶKSut针l`c̔l3"&[O8ph&+Ur5fkZԈK`[ w*!|Nz>|˲$|ؚD+bzA9ݝ#$k`D>d1*!c,DiHߴo!\W;U'~;9훞P&%tC-,!Z\2ֻҼKk^)NxnS^:w]UH-g%jhw̏Ѵg&'63LĕT>)F$q-NF36g`e~HxCQ@j}h#MȻ'p=p0#E` X.nS%@V8ӥ.q_|vg0V\d &C0a2g `eҬ'lĚ%\_^jJT2g&0Sm kMr}$Fv484ie3/ 1gAʈ(bh~jHdI $9rߡ;=O!^ʌx)MHI6?J,c1wHݸnI1edVR;SZo捌* ~/4&+rY=a2πNRa@sE%̨2ep}NralKg7_\ 2JL4p|Cef1rFz(:-YL  wEdܩCez C+Se@',ɲzd#Hw{ zfh3UؼeK#Qکk*NlԤfhD Ԟ~T]aEk?O,XM* jK;}pwrMwP]us6KI`Z~`-:,MdOH2+^w1VDtZ\4GoNf1Wg|oLTk\fA<q0z`Ek +^F4wE>;,j1|"BsO0^k{B bGG)q Md,#k(aׇm4tfMO)f z=ziD7famv@@e[!kF ;#һ X1һcSw(3H8 Xr|8\iLRV+urNG+a>jv 8:]&8wW9 ?X !q!s@zk*( \ͺ؛h=&Z Dxt|Yfh!j t#wq-#c\^\8 ,rҸZ=pDsKy%ET~_1&oyp < i#9{:f5RY |OՑ]B\<ﷅ7 ?C yNRvzTfnj<&R+cOY7濞SC!W~Y`@}ZxkQ607>-d+ҋXZ9ɒHEIEf7;UD!2ER;cr_ݨY+nwl"`Vs^R9b zݓk>o66BV(N6k҈+hي [=2Q?z9\xl#2:2ON K>JiEj4Lf4nV>ުYFѧ\q~ w>z_>CŒhT k!לv]^ݰtrBe0j}Y|ѫw)h LT]uc&pфV@l&7!j(i,c:-sDk.P=EaN6BͰp;E쎤I_>P<4J+Wz)HKAſaDw!vq"}đȯ{'7LfW$sN5*#vģ@hxc~fMKFW%M i^X?SS:mR.:Eaˉj6r[KR~R/AKgs1@2ݠn>0= 8s`FCBdXL&عq/ Wn";5Iem4kvňM$G3Dzv{@mf[^nRŋn$-TB To`m=&دI%#o/zow>/ݧgI)f~qiW.б~Rb@0aJrj3U^Mޕjrul^.s+}'[vMZ"rvFS%ٖI@O0 xvJ{S.^^ێU Y#ǝC^_|\ {Gb ߺ6MuOZM 76iI=>~Km$)jkSZb%-ފ 7ςX֋:taB[#ጄ1ʇ98~8nwQ0tΘlIhGDxL͸Ί{~NJRl&) vv='Qv F\c6z@r3LkA woO`Rۆv CXtJ#!^35wB)0ʕ>M^uG&Gaϫ(=T{nhv'be1(1!V."(|_Xʧ!AlhFa),Ҡ|oؽ$Zx[+LЙX"ysގskM&kӶBٹ4ȾlMPy䷒&[Bne4La#<,PA}D4(c=%,-C>Ќ-M.S@ 3D.G|o62JX`71Y)-6G&y~i!gb!C VgG%ZN]SA̍Z)A%Ye!%i k44bM0Fq2gjֻ{?2H$^]K&0.4$`EgIX'_t:-b=qȮ71G-N7 ; VzC֢)J37}ҍBb3Zج-^|ZПa fvS+#c(b!). < <~bKʃ}2eBCBe =G2lgy誚yH[,OcYclfo> ]j$ԍ6K-TQ|+iwi( EYzfHJ Njdh/g-Q6[9z$}L4~hYޱ}QOvx} e <Έp* /&/k4؟'fsݐ G?$*Tx^5X÷ QjZw%?J]M&wp";-oX)9|txd:"cFP$2HənIZ$ zѴ?1'X{lE_;g,]>pѡJ͊((91wR>#y0{G80?Sz6e|}w f hZ0d$Iv[8LJjE $&NFqlZ. tg$l/Bw3ңQhW y=eqDãzyXtO)AbvU[z-Rzޗ (S$/Z2睃,n ,9_1#ѸB=AWd0mLdvlOycK,m+)ҳH$:ɤ3M>H)ċ-33i xG>k-nh~p`^Tk:w5 e9F,lVrI?挥uZUܹ3<\K LYZLXpѺm۟i ?Fzrov9+Es tƴ!_؝q,cQ'+!E.Jʅӵh!M|F4 :^)dş#ЁZIĆ>ޝ;R3ѭ CW e}2MϪYZYFpC&\^Ѩ@S r.uq\$m!R<@`#$'A <;Azͼbj:<(zsX: 3t32 ^>lysmܙ/i9a e7oq>aFO+ XeU+|hrrvo|*Al9XZvk?uEpe )P3/lourcf51 Og ⿪?8{՝қᗬۢdrB<֣Ϗrl2}I`y$1y7QtϑB9kQ?|1Q=&fݮ^۱TJDIk59i*0p[65`cdi(Š_;H Q$`?3+_kO)죻˺Fgp&$̼yc*Cߚl\*{3fKg 3:/0+%͕ 8{bS<yM@R н*qz7D UcHM &쉊qXRy%=.nzTH l^^//0},\꺇,jaQN?ZDȷ:ֿCIRLj螞wPV AY)r΅ 6ͰYB'h%Yb[pcӒumric7p}wos[6NFfm3$ 85ZCؒIDǡˢi9KkT'z`]rBh)MR4 Na '+H55%:P:kDO* TRǎ  (AJ tjS:]S1<7c(sh=d$_ƌXCAS:xPѝm'_I{/Z7nxon6+\Yz/Xk/ ܚy)j1[&uD>=GV7ᜀėNzq^Q`hGwpaϷ,G9lB\vҗ@3jIX cc I=%3f=VPOW&lS,PII)-+m,HW<:~H$P7vT,HepهFć5Uc^Q+Ty|aQ4EtXòiΩ62W\g!rΑB8A#8 ive6ͱ"ˋJo&erߗ(IPv]9ė~w S.yex >x,B"f=Dx=oq^j|P7f=+S/k>sy.-eYzS3),fϊ ~b!R S"9 p4d<ܬq VL߲ۮp Dr1ҟC>Uth{+;36S3zͭgJlS? Gsګ! ;h~r&HgwKh APA J'Ҷ?:> ٘@Ӆ-,U/n}:@2^tA E4fUlXmId)6xuɴtx8ST/nͺS3gysi{bD_cBW")acTjszOb9~iz\ĸ?R#2շeԙLD FHq_LS?m九Cݙ}yUjww2&ӮLٌp\Kud&0{xM]Jb Wkstb(F/L4 3 Iy̅V ',R^iq3]W3ki [E} "s {&7yzQ1qN̍|l`;)F^牓j 7Z'؎~F$~P.`﫨B>Q[q/D0K.PS;^jNͤ_Z>4gKt_$ƁGLbaw/@q}s8ه~ø#Q ^ș#1h >«+#īҊtMzjHZᦿUciŋFl䠂cۋ'sEmRa}(n @_xEG& &;uGkyEmiȤXA4;c5)kMI6O͝buއE=!7O>s>}ytRfq0۔Xe' f@0D~ OgOJ&u좈mwI.e yYM߭0e#˜s_)۸! Z 7O*4GPZQbE!@70􌺄lfgV?#Q0'Gx5s٬K(.ט?SNg}v,Xmw>PG;iZloR_|! ikŭh8?QnYZYJ88_8N74fL=mkAAAAAPlPZaaaa!!w_7oZtu n5 CļZ k( U 9(+|a6/p(Ce(2BU;5/v壘uZ,b.X'm--P!6l |4;i8^łoBQv6Tub-D* e19ۢxz0v!G>Dz)'ժS8h!^j>8?+rvwJ>)4 kj=DFb(/ `8qE2cyiBs~[@ KN7#Umyav)ZXH :! B%uG,ABF4KJ &hW@A`_ٍcA &:k$Є!!"ji ҫ;?D[ț|'P]&RsX\]7cش S #!HT%YMBjBޘ}/3Ï k옌s&2DoҐ/q'R5utEHYEIw9Q1f)c^4fʴSn0z8jHB!/Gc#š?\$֩ &ם '$"Qӄwl^ ΣPtu~)%zx=j_.v~R,K3H{K8gMD|Լc>Wr}q*gd af =S7:B2z99siJ~ 2^UQn?d[ꐥTOwXI`4礈ՃdE1)܋>谓N8mWcT=oG܊Y 62\ssn[ZC8T|8d?.| ei_˔KHm/6ij^4YDNߘ8(CCuų8՜W5a:S\@xLbJaӺˉOov:oRpL^ MCM[988kd- цuof?l2&#z>>fu^"ӱk9)"9sVHfG%ܻ^h2szZc{phZпwgu:fu/E6%U4͵_O[1'oT 1ÅY JrK&lwձ[3W,҆DӘywf1݄ Ӣ< OqCOl[RŸ9CFyHWovAdY<uTrJd_$p!1uh`uW,y7՟scN3P: dfK'WxF C'XQ= CsY{kdPg>$y"KoVZ8 'V͙*D*.aXVr:]M}LFl'5b2( BSjiq|D3 q @(x % \tAr`pDO!|q4)CTN)UR@sXL\nOSXE^:Dh:z0.hIJvw\u"n`ü% \ٖ( M$DX.RTOy${-j+ƼX R U ˡ@@@ @B|_|>à <<<<||>Ŋ " @ @ @ @ @!B!B!B!B!B!B!BS`0 DPTAPTAPTAPTAPT^ x/* * * /|_/|_0 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEK>SJ5bi785c& L%y )wJTAz:r'i#Ы9\u4M(r'I߈lxRqIh:K T?^2zSqK?;c\U &0A8FKyo7W!ɐH@f(zXGO|RVrXZF6^`9@e&`D`ajB7-!~楱\/ m.rl5S~zCF~4Sm{A./A F 3C:qQ<"ml4 ZjDa+|xi֪a>_qorT m 6{TS59 {9S>G^Yc({w|pyрIB?>)|^cN0GG$SVi~Jn>R`e4nN{*bmyUzs0 ]Oy(~gvxB{5M5(:b:ldM/|f}j:Vɘ M7~#}0%7scHqG%n 2F}Ԕ0^>Fb3'3M6'lR1bT3,LHx ipn>8^Rd &(eB"J^io81[B\(7ts☷9\%5jN5՗f*Hw8j+Žt&d;sc%r`bDSTCn2Er6 6t4\\$Ib(~?)ƕôB)䩰^.FBILQXm'L^&*q.8q'2=fhƴvas}03ro6¶61f FC9fħ[`$/Dڋro@ GmYDw:k)pvR'fTrD3&JCYH8biYw* QD9O77R20Yכ%{p6C&lAY /gEW qO8ޜJ`bnaw"nx[x7_٭I[i!gE.V $[o4#7Չ"2z졈8q6)ˆK^)^d$94]gN۝UUo QUs!?^uvlY }|,q OL@Հ{[#fqʌE£lzx3㿐d'Ɵ4"搭”&;|<{ŚHVCD-Їđ1dh$Epqo?ΏZIBo9% X(>Ѻ4S$K7r+NC{<ܰ\Et2ЛA96aHt<}ܘ\N~NCPiIEY ӏOW^bހgi4/c"󃊁2[^M= gϮ7'&dz2q«s"sbz'#GCit>UCYÕ"N5#?úWØV{ԋȚzACPLn%s8;:>o,y{T1,Jv^ Sɻy(/9{ dc GiF;% NiלWB'3^8q{Cuם& c~QҔ}á'6t>}қ `F }tUhC=[t:F>ceW}6_6YX2Ul$s*[NFW8mQ˸ xe[U{ߤRN k ``ƚO*dddebUd`"7tCfVF5o&-˂n ?Hn|wCM(GMI/2oӞ}.YPf46+XbqLWs Wȝ(5p+/p+ k,54%?(۝":xL T:ưUFc6u\4CoKC%n&TfG:t?<"LfogZ23l)y=ѭ)P(AJTCbrCTXUE<8uN,X,X,X u_Ձ'|"f%Q FjkWr܉}Kkz}op^ŸZ"Qb%-VbؠEj[Ub\ p德žDhZn[VŠh-oyn[|[-XRoo[lZ ElZZ-栔Z rj-`-UX,XX-倴 jڷ-h,X- @X,.𷖋jڷ-AmZ |X,"j-,Uh-V-|Z yX-Qp.m[E0N[qsˁq.%p2  ,[qr9cPش17f < P(E 1B*T !RP HT*B@R* P(TJB*T *B%`P @ E(KHZT !RP HT*B@R* P(TJB*T !R. ,a @@@@P !!!!!B(T@@@@@ P(TJB*T !RP 41l*(dcx1Gj *5(@-, TԠX&ҀXŋ  1b$Ŋb, ,X,Xňd`-EZ"dq"DH U EbŢ[h,Dj Ţ%hZ-ECi;>=SA(0!B!B!B!B!B!!!!B!- P[ꀴE+raZ 6_wi Ѣ נ+U:h/iӺ=r  0J>ȪܱtP:9BDLHh VmqԚ?:  EDKvʘ|pZy E(ȉᄢ"z CTDj^~UD O?5["Zb(DNE VŋbŋEZ-DԖ術rlb'CniԖfr*3͘R$; О4[ld~%5=%'Ri\fN{#2|WÖq7,iȰUڑ?uOR!Qӕpfx1 R!.F:#v|c %9>]((s0FΪHk9r7#|j` ėÜիz Q@?KI6:Ť@J-&&楖ڛD~,MyE i\W)^r^y5_Liԭk-Mj]1r˚_irn7 Q7:/o(4-C/Av]1RoYLA'tG҉9<ӱN^Fe,#q]0&L#+QD6JZ||.$ÀJH`!ȝ3Ong' ζYN+.{$ dM;o~JNBg&,3|Lp\^$2;@ 7ѡ1ڐ+#l0eۖŗ#*{&]*OM:s[x aͩ/K4;07nfuHk*T=uy 8ⲅ2l,z Jls! /^!?-u1=5`^S,I,p&\~8+G}vp.fPh R^ןڄծPwW>f[FI+JDnӈy\aYK453 ;Eg>5)mCPna"N)~Dn)(u#4 ץ=Ҡ5Јl1y (!y[z=6Eg)@;f˩Ty\x989?@l0uYɣ! #(c\YutcL$h RicϿ,ؖ?ܙgH|˪ӂuv$z*!HnWLni6?xbΨ`=ڐ Ï(bv1RrZb7ͮF{JBt&0TjFΑ">)z|NtT fO/<1nx̓'UqHH3:M]N4WN7g]ZcE!h.oŘ:ޛYeK]wO󉕻KAnREzħ)LJIPO?Q??gUro,Dߛ 64T#lYh~z#):nD _P4vøj<#ufz]N<)^\[d!ٿ(;{dB{ Ƿ^E:^`i lGL}O6ӟPH5c{B[v9l%b'uK!FA k%JX(Eqt)̭sT~ZS WRa89 8UI"ۿ3SqY΁S;[/+7AR bI Aj2N.J|Ɯ bͽ}~2i=v^smۨT")thW;F3x򌸣-emQEpjZa<}|~;?;1 -(AGVuw5 mC"yfG@&a>ptAA!U]? 9` R;^4Dצ`7 0D) 4AU" `QA PSnSXu|H@'UT EUP"P֡|T Ah7"L)?M1(mWiP5Gw8(!.*(c)[ 0\bŋXbŋ -/R3Q pKt*h*e:~ÿcC֙J'4Y%P$W( 䁶h`Y!j- )xiPV ௢B  AA ` Ǐ:-'C4 -AQNvy$IH>ҥBSFaϊe A\g(q[t&xȹVS{d֚l7"blܿ^1.ޱ / *J4uM"$41"A)[d~D黦4 FleROi<pY%1[0Ju6G8}o@"뫴=c66 7ajmWG2 7ongF@0ShĪ ߮oy\XZkbyU>1-?Ŭs2ˊ݊ ndq,w2,ݽIZ_!Ti:g[N6ω8/kE/}{ނ9Δ?)M|&!Z7GL|n"PxR\3K?c֡fXmҶԈ+W92I]2;Fdpui^1~\K-YHmI>R~ (R (SLQj9<ŖwD'h\]p 2?'3s2K+ G<0ˆߡޱ,9b>1ݽ&ޞvşvCs;_=@7Ph=9Nܚ|9@n%A'KǛ"nGorPІ,kޓC]0Xwr Yv߅v}~2 JJA4=|,T ̀>5 `+sIg<_EwLnwls^7&2:\h[ HQn^@7,%Ru;b;c`#ɹ15*m!Dt™ޮlo}!^IO_?!kIaMMEuV1gyxpV؞bn㦾J ITD䏫侎܀O7'ŋZ/j UŢh,D`gjוֹ[Ub[UŀEՀ% 'B(%*G44lHd8dN.vY|N`p׍7EUn =O~d 8#"HE,XEV|^{I@vuWZ"E/Kj}Ph6gLc<Zap!(Ra1*B"%`2xټS_r-₩euG@;s>i6:p޳Ra,LzaR),u9y,9%C˳9fD#>q51(K?,s:=˚nMtƔJ%V@.SZU;"9N3d~P惯 Lxν@n r¨?@̛hͅy;zN635x{H>97GZ$qw<.+Q"; nk:ELFHgL=Y\Pmel.Db5gzkNM5b*ð10Eyu?9lyLycM~{яݙ,:NHg%c6㥊v y-rrqɓ&q<m2 *X L+D!@N"3a.}(֚ͬ\Gc?& n/R-tV_\wBjZNVť]h=}q},D# Ek(,GVbVeOUis a7 g92<Ppi_TL*UaK +L;ͣ`97~GSNh]>c W\ny?׬ݘ/j*'.5xPр^EjĜ"PQ(P׺+ b$C )iWUyLI緟"N䉽{O}U l3ݪNUo~ (9C:GY쾐%vKqh`f I | ؍`gD u,*6fH-}m~tw5By:m yN5#LlwdH? z D<lأtw"A@tZMk?jq_"(05f@U#$O^/u6i0]Noz7Q4B@U0ERqE5]5'McE88l@71|@-W_5/6:z-L!oMSЍUʎG|Nъe["._">Z=II;UA?(YAXċV[h"!U/a྆@A+I]}>*z @/0iDJU{cxꎹEUvʞ[t+ A}# n# }>s :UOt':5EE9#$KGA yf~36Oӂ{]C m(5t8㘨ֹtϻM{5"2#lLM=3-v" `ojA7_ @2͒ǀݎCR_%NQz9<Ŝ[fcE0׼u,,cwm_ KĠGN<*BK gyhf{#8n,s@D!8hu)ʞ_Z ?G(zca?gA[DU34?05-Uy+Mp6yo(nۡ i~%&qňe9X:Q,]AV:QmM'8{Sg6x7ޑ1E¢ЯlAweJ?Їr #Vúv2G8ahU17;TEBqD?yN0 #v8sfǧxkg6ܺaI|]kGE'XC]Ƽ>M?0՟Mk,WӯQetD;u8U֎E&d v BPaW<'Tv na=/9+>6(/ y_bU SN'qHޘbx t~̑?(S6*c`n_:6@r3(+A|\M^owYsl}op(NKz3xR71ݱbdH2Q: &iC^,72oOHߜ.2gPg7e%B9#jjC_?/R3 SP`%l^$aM8?NB7U?,DJ LZiDV*|g+.); T(7j |T#;# hZ2}6E(*Cf@d K(l-T*"\*Jl.CQ5* #P\`\0H**x\O[ ` 8 Ǿ&L ;gU:(6"_PBF-D#ALz_0 *ڬ|϶62?zhOD$VWL'^#y/ 񈧼0"{Oc\ g|[(~'s=N.ja(P @h\ (傺 (!yQPQb+{#ޱ_W [1c @ 9"߯6oL'j)D9nr𨁃U}3"lڠ(Q'u<ּmx򣇄菸Uh`9[:욚I 6qC%}HeO;H$B /Iq|/r=h"s0kf(l~ u\(:BLuAUc!b FnxnN`jrǁ{K4BDCkLCB٭$Pqr? -55n{7%Et(=웸3Z9b+Lm ܖn _:G N\2cO-+~ۜ^|E"<ӪɊ_b#q"+%-J}=;qqͻh[ )SWmar?z}\Q3f5T4AYfVɐyy ZV!>YSuL8^oKK&bdgTHٓefQG?LF:E+*h2گ5i9]/?k#-͊.0"G:viF6ա,h6:*RA8[d ~B꘡e.U)Dbd"{ͳ4`wWgm+ Lu6IzOBbi_5* b4;++"b]|C{3:O} kQ},|ƱŸˆ\P@DS g. P}2eټ0aز>3sÂFYy] k_|Di`uq^SQ>[% Px7 CC䶟zvG36za=GL-czk2!>s4sYy5/% `SKS EB l3 s'&,NdX Xe czFBDQkU"uZS=tqژ~'Fj: S.W@(P(A)UD1i(aWUBleu9:]urw&ٌ6\O}4wA{*.B {=C@d ]'Ӿ^;ORʗ!_P=eVz_~|`U׭E% Eb2$XZmSZ} b"ΤP6s_{g%zWMM( zOC˫_K |z/?1/Iz-,n(0ȷmkGtRz'֡PP&u)~Pu3vphvZ :pf/!ٺ.v}VkW cKq]I`k0eb7)՟2MD~> Ȝ=:(okl ApxEF°U_D>Vv:gCOn~X$D XGZ=i6j|wU)~s׽'׿bQk +(C)ƺt nϗwқ &촞 KѓNjFZ9CtUE˩ CP" !$dӍtvgdF^Hߋoz&sF>Ci1HPnZ- ("_hWnt0C[+f6.+KX mț0Nty{{Y_K<bcc9&Uu72^\> 0[/Tˎ:g^PzFA zV"3`;i[~lwj<D #3U~/ L-1\Gl Xe43Ka$X\bJS_;;eSݘ. %bA-Xm ï 2KP?@njӠݜo l OΠ9j9g{^UE 1(}##ny/Kb8CLmF= qO3qtZ1h\R_V%J{|ޙc^+ϥ')ܕ"ZҐ$n?a)Q9GsyX RgDX;N# uaZe̟L)LJL)2 pHcf!MsKmi]b RUƆ@.I:l_F:[: hr'"`]w)rq ] _wIis-6,N[+_s \kRRz԰WE]P Y 愙n7TcsIZi䓫 QӞvmK77s&VoNT c SF<wU4ܧ@J9rn҃V4Tw@+pIK&&.T=E;k˜;\UN6cpSOYdP^g9?D鴛 2dQ=!" %I -b'$q:n[KgoA3q\|hdԩN-58ӰP() Q򇞉z4{LaS6yr];o=RCQz_DJ|a5~c@@@j;+%{h cNێFKI4TՌ@z͢vqF{$/er*d P@*{EiK0|̇*p5g䳚B]2pScTroxÏ>xG)zYQ3?PX=~)m3Z({fc0bcʢ&o5TE8LHtW{+%lU;8ɥe_:Ez}:i[ɉ1^vҵr*D>]ogߟ&Z_!/|n؂8MS bq#E-/o4O3jx{'C9`ixYPu慛 TmZ&gR`8їb!{MN_d7;U$q.a1|xRd4FRq]ӑUMhYэw;}t|3߽DB] * Z֎Q'7;N^WALuƗLz/<ѥG{ E:פýobm~k]*H_#77_Fsj[HĪVѿXPy:ʇPP{5F\9B};,zZVW}Yon9єS*:Bi˻YD#[1C~4|B((tUBBhr9?BsLs9 gg:59!UտD  gS̝q=)u^U1@+E[?Ot9 ÂK}hGÁan|/] :)a~fp=n EelOV|kءekf5BF]vd3u2vU/m:,BOua-?Ӆ^z*ÂsęP "V5u*Pȇo^G,qQU%Ov⺜B~RZ7e2!|!3FfPhX5Cv8|$1ϚӘ⾇ۧ6zMGov)H L8p "|h =0Yf sѯ2 lcjX^a'^T?3̚4U >ZO!dhلVV iуnؐbPZm㨋b%{2`kIG38fƅ_*FcCY%Z2kՉ.cQGQ[<}QTOE6FҟmTpUC4]$3&!n0 O@ |Rz4bgLHX=44{rN8dT3.n`$]Tbtdy^5Ě?A]gno(6~/.8FFI)=JPBwm0a{GGf\ J/ֳ*fwUv<ӳ7hᎀl9AIuZtl>mL]@>IB91Sg^4 g-vĆnM=,%Q:ZDµTgQ%~N>ڜgOС'Lx>jf!|3zzӢ%d5un>H9O8gכ)Сu«13glM u|mPvoaQu+W1nI6#GJR}晫ezo8We mSj̢o6y?Uja,ș$OE"-iy>'Ly_ }\{O@}Š_:(TB  WBpHRTB[;'%"\ے}6C[x=ӹ8$fK54?cN?Ɛޱ~,'@PP&sCycȅ_([c#Nv](c@*6DD3b"?wrӈ891k`W8y_PTc,5iM\} xc+Wv{߳z=4]?~'8 b dP| Gog_iKO_%1DFDA8NEDXlT\%k|Sg+nr+H]3/i--.^hl%s;\>fB N3Ժ$w[;M rާf:q+o1P#=|o=f_jXPuGlV·6 Z1,C޶<*Ш=}. _Cc:y]G5B6s`/Ct]ybߴ4NwW쫅 Ȯ_z^X9n8x;ORS5e("#93H/djP Aq5pf.N6p;/_lFވ8 @~tE l8sv k|<<ÙH:a. 3^&xس 8J+z􉺺|Qn7Na(lY&2z  :]n!\ ` Vp=ȱΤ~8+9CwFԽ6օ- 2VAcj~#UOsw!Q יfe@R.&pŦaȪ>γ}D~A6B#)aD~MOgHSAqEjs{7.Rd3$hcFͼs1us YJ| 7BaJ:-߂?3g?L]-4ɞX *#8% 6+nge5!LA~ U~BB$$V;0~G-̑B4"e6S_@+! {\Q 9m8K A괖ԠpіD,ו]ٚ=jOHf>*]dyvi\VgzCn=Iqn`bhAhXF%J, ?ntnE7?z;A?O2BŢ(i( ?a~Dܞt/Ȍs`/e0oa sW#3՛DWY*F4rMtJWg7eϤb(HP? ~O f[35/셊2I|wN`~7|;@bKa|Y{2QJ nEpË9z8W4ؒi:Y ?ioOvj7-TH$7|ET8|7b߉5[3]-SpjݯP`Μx x/Jl|y{Wuvi|}x7tE 4Xʋ}pth'!W1)~ $X6 ,q*A{"*~a7>Q=%2֨R׌<@* A4EKcHxBiKh]Pt}^d9ޫ5i]d2~rҀc Ў (߄ӦpA.辖v>;и]"iL&P mJE/:?E>NԚN|PѢlfkQ(;puC80 V ;H}Db%&z ^?=wQٜ%Ct"+h"}Z[n g@o q(7םgܔ PEoZn\Ш| ӿ1 P6W]' '{s#GV[5i@(=3X$lu`xiPe>(2njf|'nOV7y[1lHRwϘ:+ +k|(yCL*"cM/)]C1o:q=ubxǚ \skdB>k!XQȪ+Lfjyp\^=[|VnZ5gm0M@d#묓[J7m^;.e|" iM(w"TwƄ:sFoE5ώ̋T_x_61-$U~Kdѩs:"mG=~9%}9.7GzOZ" S=#2]3߫_^ PaNIFy D(?0с@r+Q7x8@+SXZ}Sp0" {1x7̗)uTO0Pu3j'SCgu [,q7HݗL]H)X+ZGDRA=GL1+2`O$k`6걊Tp1 Šfvr剒ʪo2Ta?m,nHL9"6'uKTRF/AQ:z(8#߭5l TL@mFjt]!B~% .g1gw!Am ECfu޵j58يQ!Y ؠozR: aDpsu-1JPtq캞c+O051Fq.B)`X=L',UUmUl@-A?=c"MU)I@]SP(*>/g!Mz-ozd@*!*hb!ڞ7Iy/&jCB!B!B,(XPJ!B!B @!B!@;U*"hG6zB<+dU2P¢p*;n:/>9MXtÔ)1MAPqA4}92L O6xZA{iGlaM?ABٖQ}PlBm^xPbи9 v4w%6q?i* _-9", "DP E PEЈ-_p/b3ԫ@1nd@ܦۿl=QDg\wgO ? I:wb1WːGh##1Vua'籾Y.c˚LYطʸDd-?8s=qTf16AިceF`<ѫ dn()@5͍ @s MQG1ԟ!#J5 [Òr|ڳ1@MAt(X:*ZsΆH8?t}`/To%EP ,~mVTIy5NK k~D(eJ҂^:)RuQ}mX,Y!H0j'tm#sw#S._5b؄~PR /"\7"!KST4]'ꞈFH&hfσ !IeTM"Z*UbE;{W@?fp+ ۈrXXQ+5>/u3 iw2ȎH`hG9+E6},N+_!"!E+bl#DE.hPZ׋Q"A ,"*F T$*a@P 4Z0 #"{&d(!M hYP ͍}u豬|>[H KVd&58|!vx˪'1 w5D|dk&Jܘ5}~Sq-.o08]ֈpm1r͆|9cˋ22ɧMdql3-No޻+Нǩ/g,U)<@w4sy^"O$ Xc.[bd\T_\hۈrD>{^mPɽnׇ]YN̏){fyY1F~ Z")ehG~']QlGsD'xd!]5 u~w>f y []18dV_򿢴i}0=~HFCiK%,%!t,Y)KҢ"6Q3"IFMS5fr%Hys6g='3w inQf}zUE6!ng R ;Ɋ91whKwNU|G 3?dd40 cqO2bV1suGϔƐǘdHlYRrE;#&@s<>K|$![ŬʅP*~y~c.0%pMhgwnkio&_ >tK97@b7f0?L I\2Qt'c)QI_j*P(za42ǴZ /j#'|~,9,Ӽcۍ*P/ji[س~ŧ`l#z'E;2n+Vt~1H/XA "şOYehiJ1FICJ|Dvzi MѝK?;ƼuBΡ7xp9|msw03/.dl (!N[nT7_==b/%@i h5(vKT^_KLC s?oh8AzLҀPS?WjlT,F"5Gvh7D(Ü/S$D E(|+M@84]P2PǼ(mb( t'p䛂4ltK/ptȜQI40$ʨ Q QPUb<ᨢ\&$,XX,X,,,,X"bŊ/QWF(rOރRꂪb8BH&j#G{g1@E5aTM\:M9AU=~;z;Rg吢/՘~\Q TOQ2*矆m̋߰?nDc$shֶ&m(|%j㎛W:ɸq:S5om(~y$ د>;s=v Ӂjkn_`ٛ׳!͆C:BLaG]c쩯v:~t)vFrsְʝbXn  3鼺ZoGNC LJYmws$S71dhQɂ ̮mzJ TMc+A-QLZ03})afY[Gb|66o '/Rz;*]-V>u(*YM\勺O171/ E@-by)* ʾJBSf47O-B).Lzb|Gl»(򺮰ٰ̋Y'˝y!i: rc@qDeCI~]O"z/͗X@;Bq 6v+wNӑ ![Bà#C ͢8$NR:q[Ɣ{IfZS;le#]8Xu.L48YA:]Bj@re5+=Nq6"6Αepm\Iz`ˑkθ1*1/Qq]KdPnL^<+`/׹ -P sTI[ێ'LK)~G &ăw`&OkmÎ ]m5ջ( EIǦݐ$P"9 H9ٖ _˲2ʯV,Q|Iߞu|=O3 Cn·H" v[;S5f8@PL[`')ﭾ0PoTkQ,X@Ũ-EQ@ ` ~58  |^|oQ[*"@}X j(qD-DJDHhr؅MX1PY]i&~cVmK\nxLot~^,ߍdNF5<|~<t.ߔG{Vn38NlE Ao {Ȋa*Pz`"ͥ׍"Ǐ v"5|8 Z TD-UJ-E6-pJuTDJP F; (("+~6M1zm ʃ(i Zȝ'jvxi/PPMpsoϮh`v( "wԒ"!Zs>=KE=A*e>i}HҲd70VORȗFS 'oيT*XNN%olu]s m Qoo3x6/4Z"}4fGӮ]!D"J|.^ZYp} AP+1P@Z~Titfjr-_#SW8b9m!ԉ|0%&7$ItRhuŔ (lM \y~ӥAȞrXMGpW#2ɼ:NK32Xh;Ĥ|/̌呲R-SQ3uR!cOK[Nxn&~i[##5A#z=>]kƗ4?Zv]Dq$).G%SKZYs5cijLzw@pp4Zk];(H/oKeN($$ya0?hdZ9 nMyn2Cqcd,LI-נ`@iXmXК33jϱb#_ Ni(wMqҤ6w.ydZ/.nLi!G2ك^h(2(FAX`kɭ<=s5O)X7h1]%>0JW(L?3"UBqaYL ˤ2qxr L\/sJΈ[gv<Q8k}gr1 o9-e=~x]+s6כܑYTGcyQرG+KlU0(mS.ղ2jx?K>ݬpŘ h tncqB&pdHJ`^;)mRGP =jT":\aޑ&yerXo7k1kޛDr5\g}+&Ňbrf-H$@5}%+ 7@q,Im.eG Oz4S<4)&]2"~p˞T+ACwȭ.;{멋uGSlZ(:m>DchNz%}=$0H?eXgCr^A(Kois{ J2-mOD(>bmW+M*%scqZ8@lm8$]c' 1 ""[?Lq[ 3XP %LEZk,Ah""7HEQ `tO(`( M HUq=A2X8q'{@Jj ~)(X]RT盳?YzuCLȉDHFDĢ(!1g}G({:dNy XDm =;#.faδy[lW0/d"'`Y6r'\2A - ߑ!eY.W-Dq<$t 7Z݀m}}}P `XTP^BIeGs+j^mEF˯:Cڳy1$'mOMw8?ʩ}7*C$e1!!جU|uI&u-Y\MgIPqձG֧mJ,#}%36q5aÏϷz( 7 ?7;#bb$`X,/Xb$, X$bB`@@ P @HPzD,TPJ9xDU` DhUZ i!!! Ap"Ebŋ,D]lztP X6DRA"PP"EQP(DAUj-g>ߗ@d}S4D9 xtUjAAk^!L‹H*Q7$`@(g!S+$NԾH h!xt Q7dU5b'PCyھϯrXx*U[Wۼ~"d h W8@OaP%:OkC] 9ʟ7~2X{ûlFwh2|/,p|-yŋ#eGBf A!bU`ߡ إ_Tq:[s`larŵɺ#}tA&{PM|T}0^WB`:M !TeLi8GPJWc-0c@z{Vj I]rp|叡_+4w%)īLU8z6 _CR>jq7pF:|Ts}vVD 5G\ "LΞ bHVENjjuY'@Vyc?PK|!p` tmL L#r牎}GˀABNʶ>^pT)eCHA84PB"PZ D1ɳ%ьԫ*q0` %cbEAFW`L?OF-]QO'~7Uw[#.g O_y?T?WbvcF`ؕ(`y D,A Wso1u8` F`-3oo]ܻ\j4=?}vr&t+EXj7 :a&OОנ:A0.RXirabb^~ZCSwWŌ!4G6Mv2DRX 3sbћ}4 _K QSΑvB*H]_'Aed9W)v?|QXQ ֝}b~i$`;g%6_s"!f{C`8È{lEb^3>@ HDHCL3G=YR_\0N|U&t F֊_A.GO|lIP 55*(t~[ߒ`w @"Gv(Um* E"*܋M9zp?@븭Ţ_-=bŀ-P:uD<(46 }SxvAj46.UKโT tMxZ/yň *&]*-nZ XBbZr[/rL}nDEW]ph lQ* ACO-9V Xd/E tygpc,I&G)ZhVUf_!]1jǶ zD!'5դ3"WHB@j4⫥vDLۈߢ>ޥ9}CUH7'{}xDqŅN[I,]Q.6ȥ6_?^#%~ BGwhmuٟH1]uC ^uټPqFkPZk2ҸY͓h[vl ^:װNyZ7&nm-t1dp}D¿+x ЃeX~Qya)!(e 'ӮFzKБ|*[=)H'n VG^Ҧ]+!O80R/5cRD7&:k<ڀuD9֘H{홓:I3#f˨xdWSi6.B}i etyI[fs~S^^ ~?7ģߛ)% ÔhնD,XDaՅ*JZK%DVYz _-x"'4l( x}?4^OT{Qgtr֊Ӟ]K@o^08yGy^X <R0H5Ǻ4?t oK[Qg#71nFpG:QhJS) PɼKyEWLj(_ |"q ŋDbH K`R,BUVxُH{}md JxzC'O} [ANq|LO4W]x-1ںahHN(T/_Q !M` 1~>oܱz:v % )=2}:DT7uHgBf]rxāz^]/Zx>f{el>s{AH'M7e?cbh.lSwt2?V9Ξ-l q{G"O<ě7$l8ved99$CZ;m';Tm;4}:7qJT!o8@iO!;DO\eB""T[,YYz%`.IZX\H"C<.ud I( t~A?UU 4 u75~{k>W1Q}AsX-tȨ-AtX(Lbž_P*( $ @U (,UAS~KpP!PU} @A1" @U`BЊR(JZQ j !|Ӵ/:l\cjVw}B)NQ=/¦CF Ǩp-rł[3 p*߾/VT2"n!9 TcPٓks+e̥R8E6ϕe0 [}o/Kz#7 x&A,8ːX366 ɯ)HJNik7!x35Rq|rԧ1/nܲX/p,UqoּcnN U߼ InйEӍc.'Z 7"(R)"]xC3[%H1Ko!<cz0ri'1cm!u"dX@DAjnexz5߉ʶjE'L8 5OqƏx.ES}H@ >"(AUM_Z y 1g*|)}l]w?nW+-D@Bj*E1_FV-~ΏQE!ċoƒ؍ViӉ鐑xF`cp2'ΜkN[U$I1 'SH0=Xzʓ{&ON'-;E5ʪ\3~Ch/$TH$Y3Z+0m IJ>`03E`@5k!{Ka2Ʌ[O 4%ξd`U*ҝ,D\.~h)hpMt-qeTدK-tN0/`9M4Bf #H|:!kaL9I٫lb sNKJ/> 8prZmNuHƮ6S~L\&2cXhL=ۓ:"q*f1H7Qi ^gDq~#6[ݭHF YmRg?E?-?iG(}I {QR|c%Mcw9UAUD!QLh/P9muBG h'qLDh8Fi`Bڋ(Vz~ov3^U-N___73BBLu4'6o\)}lr~ܯJ(3P;A :'vbOz$au͡&zX&F`զڑt&:yR+ *NgdwBZ\s .ƌ9Kpj8v,V#O \d! ΛOW\d3hc. 8~O6iK9󦫙=lic$ 0 ϚVPm×f FQh~Q{܍7ã$xÏnVzTr.wn:E MqF9ELqjd_i<߬sPQWo9*c?sBM!!~+?g_p-wCk<#ZDcnwxKƞh[jhs>lφpLF4A+˝ܣƙ2{,C,v#TxWa~\%` 2MYAL|m9(S=3S$]j̸* L"&?4ymY(hY.5ĐE.,O Nѱx9KhZz}Ԃ@ ?t]D!AɂnmɸR5 bo4Dִ D2f'J,kI䴿yꎎW[b cPr'GsX4AȽz1鯥fT/Y%?&F;(Uԁ{ %auƛ1Jm C-0+,j$Թn^!J$lZZ?t9A}滓Gވ*dM H=ɍF;lm|{yrRDA">Fs 8i(lϵ9o$yyS#&!~֫V*{!?W֛(GiDL9j7=_.E(?QԆN4 9fu .X2B)P_Z.rb;gv]>FqߌGoqbi_꧳{yfS(A AΞg6Tbc^o 2}Ʃ\|us)yL,/ϝbTek^IxAg+a/z K_lJksD0l5?dmNu#;ox3^C\^ABX%*S|AR/Hj{7 ?fNmm n7gX!qa4 ?gt.9ō}T'JjMvM?:;:{5'[Nho+?~߄6 ۚ-AT_gzjȑnjmƓ*{O!{}~o55`T@^peczbz M$)opRײOe1ww#>.OܣtE."g s=IM3 *^09&q,1v{/|m9+ľHpj6߳}Bxؚ( K¾?\x$E9{r(FA ;D"O> P,Oԙw}{ .7nc Αjf|Ԣ˟}Y!*tvT8?$_:3x!Za9<<HΝ[CBnյc ~Y'mJ1IdN'MWz:@M#$dFd'B^%-egmZYRj֙ͥ~Foy0FcʪwTr^t8/??oDQz+SAA/[R9) {&~1#}>IXҴ5 gS($k&1g,нb/ K>}/٣PFӫ"*{d_'/Z8\ | ] ְHږqV@JaqXdUKbDt!̽ *H)secD<3B8_ &gPqF瓺z(mymYv9Z?v<}~sd*9J|Vd_G)ސj.iҌĞ:e.gwM$˶&l%Q" )Ɣ>bTpl$&3_EV)ϱD,n#"#[+ țjaVcdP Ͼ ,[T89Z ٧~.Lbi_$tcÕkr2.9uy.,%RDhz/v؏qst!91`Nmu[_b|j_e:QSMH.`lS9q"g"alN"iP $lr#v$ l%:|fjkr3"am)6Rl#˦5hLA+gJ7ي1< )X4,U;w 2$n nVRt1vA]8)z `&]3iE8 $K(+wVH¢u)}p}9%M82<HMݕ*a*$\ N=CRL$}Wu}d:ЏbgNW]B+4]i7CMnF]h#mHREXҍO S>({xApy[j`7u71|`Ui3-*EyI9EC7J*S>2=! Eσ*(<3ݿeҹ%|)u=+IWEdtIX'$q%,qu73!蛗>l, A6je؜bQCdu @*vސG$yɉ8^@Ma:ѻ2 XД=j1[e"c鷉LR)Oإ|XtHֵ-7EꟇΰ[ > |LbFXuC#ae<֐ݜՐ)_չB9luSoIkpem χV`" mfύ)VV}S?|oSӔ4h2z,^:)>6b^|EXpԟ~(E1Jbى 4ly UԢǻ_d:u ?{z=֞?&rh*[Q|#ūaV{JK.Sߔ!(7M~.2_q  X4LW4#X`_2Mߧ&f}M.Ug+\F~6O.sg,5 dV\LS<%]ݒq%w;rQ73Z.2O=yV|ޫQz@@2ysHpFAq1%s7 LTL|*1K~+&;^o]҈}{ Α2jd4*jbqf竃T%A,Yb8$5{x>6>Z{tH!*OG\-g#pIl7?^RCˏRPmaAEZ$5jS*f@ m0Bam\{YR)0VZЫge^1Jndڢ.w鏌Gp8hI71]73'hun|7ת\gWyTw<%ُ6M(_TP EH0. Oue  D UvϵƫȒz^Þ֢F6vmv67Zό@z{7'G ')>3o''V8SxzyJ2 eƨw\QhX,ow6h"n694e֊}{Z>xgʱißWsUoi#R0UfTn)Ab&bXGL;&dC4L&\~#QX(Mj򱎛e1^jN?,gG vӬUE1Kk0?f05ͣ<ֻ$-zl#l_N;]`i݅k %O_I2xFe8eb ,P bPs g(S=FK]LʑkZL(ՊEkKO1MFs&ƷEXG' )Fhc1 t6> tqha>&VFK  Zk^?:~}^?) .ɻs&¿~({~xJfIIr"  d}h$UrӬD*w )!LOyIq}CFu٣8.f~FvKɿGS?}4auwxzf$G{ Y|Du_CwEcAt*fUi5Fpv@~2 e5Y -5 M|D]l3a>+{Wi׶M٨ُεl-q)'SK}6V˃T,1, rYD71nxs^lgJE⥵jLd{%j9t"^N[@YO}ވTMOSx4Ԧ5&̃ٗ3^|}s?hH.Yw{[& h};icU@w!ȫ⾋K=Wqf!Dp\~Q%m+iQ*&r$Rc/fd)̥kUB/k"~"m_4eikpbڋ0{Q܈eGwZ>Fdr#p5DSx=1g0Xuqǔ5r"ws,sZ6xYAכW8|*\an?6]i>$ftZ[v72P\, ytRHgQ:RĎȡGȷ3NSɝϛH Դ> u@pXˁþt}YZFŀoSc@WdKzeE\c,y'j[upj rhp3=Tڟ͗|hb\}Q]qq&o5=XUIrޙWO cuZFQ6S}ש p>v~9X"P/U+ ՗ZDq5g8δWlh/MvLdN+l"%2@hd)?#gBMSOuڡ`Vqz*&`Y`d29ʮLLNSn=Bfa?a\' 5G^"|t(0|&4mY -T 6_?2qŕWb@ꑫ\ɹ߮.a2ͮ={bpAh$Hbn5.DA0w{6lu:sZʦ]{=f0h/t ?t4X#ȒLk€[ݒ:IA7 V A"fr[{"}0JZDyk \9U:Q4Mbp+*˵'K?xg^mRMoRo\3Z^f6Y1uΞ7p^1(^R$YOZOІ^+Gkr\/ }D$#5=pM`EXŊ"2y,yҜS]!x\ߒ1>(_sJf T 6;,=565tǚf}_O4M(_DH$a7F |0.>[JHfS T5+{)D]6qp(2K{8]Ts0|P(F7?ZwG\B2{ w/$M JH%뻟ECH5vœUN (ӺNunsR:V5P{brBBC&S"(D>hapŅk85{*)BacH6f?F={!rso`Ž~A?%`xB05= VUgӺXa{&SO\/Dk if 0:9 mEN}?EKfS#zCi&~0>Iw$MAk6kX`Zex신O4yy|M0+ڒ馜1;vh:wBJ6ʔK4d6!y=Ob$Jn{y |R&y*b| ^ԝn/xu7>+DDqc}؛C9CK1fdw:::"6-Rs>.z-~>#DTގ':=Z9ˠ~ϷIܞo}NdM~!aH3*p&8 n0_+4%3do0P%ɨ3dž?Xa৐>3 w61 9Z#9q y 22eF9zdbNoOѹ ͥ3gYWVMeW合# >=\9Om-QC@ۤqȞK?݈o7%u˸{yn(f\1G2th|c}r#@EL_E5#PxJZO;1=&N۴}'LQ.d bH#1\BZ xSu\ή ıIKVjxb"v^mhmE?cZSpr7k-U# _Hu R \_Jbl%3rdachEx Yb[@l0(Ula(_ͮYGf')>dgJFQD/|C neO\aU^E-yYc4HZ*} (ֵ^gy*F2R<kZDF59"bq@NK>GSDNǯ3Bq n@liaTxW=ˡMfq-hlmT96FrpLaȇb?M%# u$_`6Oq+rA77{dlFpo<pZ-:ۑb0ߛiQBkQAw5:=[֬Z6%1%A0 鄕d_Ghɻm(8Cʜޛ]vL~KF XWx 1B{0x.jcQ|Jd!I C*HN> Ar'oYԴ[vzw`XV:Ս`:r-8+,3ʣw?f8oYw">4.Ƥ?1~[FbblWO[21iE*8ǎy\Ek2Tj x,9KWETKKgV[B8 ]ٺ9ZDh] '* ;n#j{GM(`M^I.')1 r3E9t@u9k8GXP7DͧXR7VːlPk5 `zd'2蔺qpQ R$!5O/x$ٲ$j1J=S٘_6(凍\MmS2Bwzb'Ɨ`%tkyN^b0S"ϝe"0(K釛o<\m: :!Bſ%t.|qjTp{į VT>6(#珨5,h\.vӟ* Rz=9?2'tyOY6\IIZw : LbJ,~Y@my]paFν6%<$gPou'^k}cs l)Q4UN4s>i[i@rݖtQ]-'[,abhcAmwԗ28츝=(y9-f {{\^YL '!C9+&U)cg1Tɳ6]0s~_qOoܾ $:b/EHcE #FdÈ}ʔ"%uɄb bv/jyCgr 4F5uZEA\s8 11"$ʦY-ܳ7xMd,Pӱ{:{ NzQXW$_̯48'kO_wv$O8i^%)?&X`YHؘbyU5IvʜI?^ 71OPC~O9oM뀒HCxe?p)#2jv ]Jwj/cO>]艦~ca*lm>ٗ\alAeָk9Ȕ>-r$xW͊Аv5_|m^ӣ:t#$R[T )&HԢE;bG!W4[!ajKeLbΨccT6־Tpr^{.V^mkb14e)mX Hc|@؀wv|=݂;uCU Q2H (LQw7w^ Q7uwrh H|(Yޛ& \еT*TKc3bes}Xr][i67xLvYO'a#WbNp84T"W *5P:/.O-/GaܑZU(3?2;-GWXQ/C=nE8:ǘ^+in O[L k~2&v6-]\? |T7gmlwN[;=Mi fpޘu"1eG Ā;D{˒#yg6m$?I%o@6X^/:Q˘y4eE +-cAihZ7pqF e(_`8Ѣ? ㊄#!;7^th0}֙(C!1?L;r) rsjHCҴPu]CI<'BݷNi{bKw-NrWޡ?وň Y${VQ].mP ;EeضWDŮý&o &PhDtf_iR+$ NG,}w(\Ǻˈ> ~Ї`bfP)jEJ]5YY3_ΞwSD]I {~\l啵HskJ=RA@VRTuó(X߆XO' N.L?IQ#@Kt nvKQi$l~<ҙ:_nZlM9Q k1ʍ&LWJ~i/H Va+Ԃ湾i#X=,0.{&i%X}iWHR4iOw7ҕq;]A2't!;Q|)EUȄRMLpġ2gM03壱flkF/֎nS]FEvſ7H>*'cEsڢ3SohǏ'8Ht98`uRt<ݟ|\ϧ91J 'svJUHf(Xsw=M5X<_-iRL]a:=Wc"GZ!o6o5Hp%e(ZŊ:G]O("7Y0Fp\H=rds`JZ|zRI,U%bsn7wpnbX t {C3xz׺-3úi~ȯK7|;dT|4F_XcY'We T|UX30[ZcULC T:Z`5㶟;yqm9mK泜1Ga*$-fnmk!D4,Bv=Ĵ@oo!> Kˉ媰f \]e܌ Bv"LP̦kϤRh= aػϙi^8r15v^ 6\q2@x#GDs[8}KaTT:0YRD 96hғչϞ6P/<-Xē)/ECČZ<+;Ln;hLtz2Nz Խ-r5X\ M iz{Ï"=A""?⇫jyeH)H5]::u.Gi7zCF[-JP󺦧_#kFǸ3X*4ĽJHs$nt7i ( \= ^N>K'uNGC|aB f :d2IMxTnFAN0ڕ('g%J !F= P_d cd,5p0+hGgb#e{GQF~3,&Qzt/_Tv366v!"8@7=VQ")g4rj\{Hi rL) 3\d~HMRa5䃁6%xk/t>[җ#W"@`2jxE"Wr;19$8B8(.nQe4E6ZZqkӁ|5$rzۨKpeI6m-}f}?Aܫ C8љi? (iEϻ͕g@l;Bcvk=Rӯ3gxsƘos8ye\K%&TfV'<"ꗆ=̈́?Lf#-d%Eb|me2 ʮnyG*7.=PmZ6sSmȨOiA]&4S|9њSߠ:⸖qH3W(|OU6b.JeLi㠷j'@lJWO%+T2(W:ՓrIj r]a#\:0j/)ͧĜ>%#VA,4>FKalyuf1u:1,,zv>ecӹ9;WcNUA <Ӟb+ ڍ~Ux0[AKOwY4G%'u_ ;OsM}'1t{ 4lxЍJUk-F@Teo}7lNP#j/:B5BU'8XړٙS~ I-HjDcM'0fTbD/ V+[Y#B} $1ʩ6g©Mg0JRLQڧ݈9/:8MJ93B^7ƵH^p~!Lx[H Ӵ7Ҽ<%N|H٘qupSF8V,OEGf rx|C Y9>^ ky~50+ ngM<|դW΋,4mݩ*bLgOSC&U M}cf̗3 ׍)=D3/}>1O1e#L̬Y4 2H2';5Qr(.AH1;>qL@[S;s<u y"a0k)gՒ 3LX'L 'N<2ܵ_ԻŷɺDMW`#>[jkvi$[nXH. ˨MSU$GlS>>~WslZU/2S~ƳU8#AqfZћL >txB6Dtp2_h,(d07 m#Zw{516Zs;p<#o*.c?R<_{l׉"J"8nHoE͌ _ph! #oq bִ@M fTX0aC/#{ߗѶ2c.~#AX1 qe/NTc mxxk8A Ss.78!ҥ@pĚUר%0V72åaGcZV2x҉UO;BE 7 5:V.&Pv=GSfCkΝ'$&߳]00DY 7-I*k ̓[ِ)+lk3z:[R`LK23n6pw_?OT-n[C8* f6[‚~8k7Z;;g\b{2gm4E0F>AfRX@?qL6Y-ǒZH(!C2(=Qo5z/ I\C+ Κ㍕:\}ĺW%8\9._nd@%tuN]ƕsLRw,x}2!LΎ=JboҼXpۋ}^oCԕ]ZxIk͢u% xS` 2Pq(/ |q| /A;hf#nH1+MG=p.Q5T-EHi2tE ׹&ctהč{\Xh@y9C\@bWUc]9 fW%__y=h50{eV%3ȼB7)[;CNSzNu荳FG2'es#0~f358_1Gv9AS%;@CD{]D~ Q!TZ|IiErk l}7)>M)I.pU(ܜuhDܟ䩆fm: IivU b!jdLYG sW mK!) dH?3 ٧#i 3%Vv-4jL40:q=p׏bCY%w W3vDTSsSs;4\d'0n%NH^ȘI7P5fM(Ws:g=z#??1r+cKb&#BK[0x5N Rʚ5?b68e!zyT ' LjT6n"hd{ȷ3euIې>o0\񚣪bGI.`'5QBBWN7Ff3ZChf`<2k 2GDloZ ة 1%ؓghP>˝# GK,;] 7@A>$piKORjC-*Pp2yJd6+zB 995[o|^c;%hd6Ӥ:&U@XjxK}u*cUXX'52Ѿ_xr3?} vcf| 2۱3&lΙf2stښ?]!z_>D yG63}}5l&ȉS1 P:Q*l+X~ܻQ*!qxyiw*p >=l9kaF*24\Η4~aT6tFG:2NU<J]~w'5ۚ]-ִbX$1>|}uؐ"a,𱸑Xup1D.ȌCТ]_<56c-2k1$!d*T/cfg@BxdN'p6 ϰrRz9A_pي6UwIT)u9p|k7抒)/4]RU%rNuR4?WX`Dj}/ 8@p#GI@rYj N/9~ЏO!ۑ]\-G;qcQwe,#Em`14<cǛZ4\c?wыT#jL{8a4d۝1X&$=  W:q4[pfdC KjjaQY΋B"dy6˽ zR͜" #- 3&=K-֛N`.>Q y'Xɲ1CҪPF!5>|dx,gOZC.>xIyIN.aҁ\pR*^r|' rA79`)i<<c9)Tj.]Yo{gHke9)C`ɿc KvcӔ>)ఆʌ`=)mI}坺i-Z* 4%c}ɧ$ $ωN}R5;>hL+6vͫ+5䎮ƪNW]2C!w睟]%`a qO)5Y1z vpTb"þUvs'Ǐs}q}?K&Zb?`K[wQL韺X[An𐄲sg'NYgZ%<%UJ~?f$jjc^?gOYLԱB2^ \]&_04_U/#iQܢQLF֤-|Go@;BûG𘹎XOMf6>v?⠵n!0lvǻ j\M|ݝ`0{0G\rD))-[ZpM:UH#&k|[Nu/á&P8OrhNj|ئu b[Y(dq ~N?{ѕX˰D |a9NM-+@fJAҟDZWPNd+ER xJqOHuK蕅扣1rdXmIi0t$&BCeƓUTh|5aכ._7'4aOiO7O5߈zsijLksؖVgn#4T }oxוЁ*7댿DVqd 2_iMW 2)VGE8Gq$Ǔ,ߚ]~RWg;Yi`͙ )(LGHٓ+Ư2?(0 sVݤwD@jd#n"Tw = [EޛXVgtjGpȓj.%m4O~(ĘME/سm9~}%A/^Ha `49F6 R:sE[p,p_=#Պ'bcvo>QhL0D jlpЬXs{ IҊGD Sa"PXL ǘIkSJPqF6PjA8۱#F/Gc >=,Zp*Ԛ-r=. rmCӝ Gk=O2 ۀbBt2VljjB%f4Go 輟n$YXmE2hq ^`m*T t1É#8s5~uaoK&>KVRb^Z91MS$p3 ?Ӧ N{ܬ9Ps"=nsM K#&Kй]:4|.ʨ@l5ZǁY?h=&y"rجfM«X,7˼C]=]/ 7+`^ 1TEZ[ WCʲv+\Գ啷}қ0C9(:0?I 1M!_$1gkTb˴8b~ 1gyޱ# \m-eUʱ"ЀFrAj|4#FpLN²(lS)SQTݞj1о*1E"ġg.'eHD_k*SX-\VMΟ!Kg?cy9pyL+, jMJ承()"dHsNa"*t5L|%pf/XA(YC*2^O?TEÚ03Oq.\_253pXK>tIrΒ.^d%Y;ˣ,5 n~Ղ!ѭ.S3vy yqؘK< "Y:w m`~5nO^Idątxn3faB` D晟jZ}vf~ºɈi{h2axCNJ'kVh=sy>|RMgSѬn[6e.-r|-zNp8cu^M>yC_3[ltdZFH| dovִBҜ;[%h)OmH4n䊾R0" ~jxf}dN҄!EIlƄ=ǣ@&`va^5 :$ʜq\PO*y;K>mɟ>+Ya)H/uL3m\W]wHJzE *=7,J^j=gJ4\ 7eUk’UIYx<[؜~<֟vK Qi HIlrfg|WӭѠyUlkNq8yR1)3wгHC2HRXѻ\Rܔy,Vb;1mUML量tT^P.򉛅u;娨zFiJP_WY'z[<$*nm6/&E~׏PTUIe2_)yYr))ǜh3uQ[8L5rŽ<b>wΨ[~ˣ8ː` DSy)"'(Ε=82.~lԦ7 C]7^y,4t/ &ߨKsnj?NN?7=a@|=.f$^P͔x(&sղG~ u)Mi!yYw?k^zƅ'h}TOdif2;/G/ij9kc/m|¢8nyQ:N wQ;{f$q8Đ*i2 B3++3ݙHLM@`ߋ&oGs].%~eV c6lu1.~ ([z[d/OꮔI4T'#/ɨOHJ͊3 S㫓xXrܱLƈDAp,T4MLk&$\+/ {voٱ1>ĕH*3d,v0}Kr}?I $cInè.EO;n7xQ=<ϛ}ȚI 7r>jøbK1i67|ݺR[H^ 3zJ ":$mRF~hImvr|-C6|$b Fwݡoa l>}r |lQwet{Vi2mdbzfN#*"}QEBh/([_FɄ!C q)р=:zb±1L[^c5Vl!M6$*#+ЦLWظ81Agfv)[8Wszxo]eCBn9_sDA]HGC)rn5F@;GK*M S%u}3~1Ey&V]܂i<3 ܪM~Y&ܢ!q5L%=Gb5wTI j9jE"I>EIS>6\.@T6gKC=Y27:mC`EFʄɓ./S$ϖwP?&|@9]]>.'abFƊuU8+<2Rx-3T*!b-s + 7#z2$Ռ5Ě /ɼ" E^>G3ΔcZ g  Vxћ18p&_>Ӓ^S0Wd $X= j=0h==xq1b!d욐W-W@px Wy= 빯6D8ɸjqvWtǃq˟wI.%OfM?zQjuM+n.ٴ>TzP.ztW6CL'(+#XR F6m&OLR2o$sK 8gkMC$HÜAb:k T=VgQ (|M5?&xJ/=ԫ?'SP7t;WIS,XeGB@7'㇫X)tAI8H-^ϺKs0G&Zr tgMy,ufR8BozL7og<(LSגWx[{|J鎮:RGMLa͂6<\)LbR╞ %oV!|h҆ɿyº/C)Iѿr i+TLL k1m*~hSXT1tRZ=<2ίNȩTe5k h1Z8NplvҏBuJ/Rlu- _cYGbȝ/H"8l2 ͙\)rixh r}OreJ<[0q -!"DǾ3kgl+X+= $=~k3•%)sg`L3]7]):lWђZ%JrsȜ$|_=pZ Ӳl1"^x wI ם9p.z15g#~^hr#Oj7diLխATu}$=.qO)p'~,Yxk$p*FWBN)I:{G OC,] ׊e 'F5͓0eԣ;{!;bdel>2Z/x7e{ &R6g<jmKx1Y^Z^jڦ+ғ=o<~O}Y3c~j˃@`:K]{g#c~䙥aLD%qϧ0X&3ߤhAHT`:=EͻDf%ļ&g@VMTsSVś*])=t.6FL$Ս#gZ+􋪅fLy7Zu30߾{'t4sȶ9o>s?Č&OJIexpwTwEQӉT#ҢwG÷lmaE|1Hz/$ a#]4DPsW2gF{iFS>ȌekB.ca;']7a68P] Q2*P3B\e22H+ ,ԛޭ`3YN.EZ)ZLXf%=#=8pqR̼gj :Aq803To{$ąPz77n ϟ#\W Z DNW Z a)ƨCJd HmK.B o>ex#~> Y=PlX^?d{*@]42ukqﵼ]шO,3nC41k%Cɢ3"1'G#P`M8:/|Z%Db~|94 *-AXsш"rLL8Hx8-h3lZ?6².iFi0#{ Au1>xR6%v XYوΣȀ"$!+,gf䷸]$ҀcO (s?qL_[җ2 N#YGON'<郤O3qDߦ6Ϫ9;x;gה|9YIw7X &O0/v+q~K5zsX,~DC ta y21?rkKo+0gD%*#ّսRP"`=.ǡYIGf7>i+p%妱 (VWeD׈VӀ:wLXR2K9؈y"EF5BCG)ywrN^ ^Crr4com, #nh0k\*5ZmL*֓&̪',ǘ뜈TVO96JE 鿧/6v~O~L[^qèRIS iKcOI˖պly^^ѰO4YM[.|7Q$eŌ7xjeu9 v&owv_2-7GꜼh?SHȵ0OIy><*6^(}nu҈^=[<h}*aw1W$5J_Mu1l1S,U6.vuחŵ6*.MWUSXܖcM?jc<`V#\u()5Es`ڬ= ؑN=Sa) li/"gSܬ }3U7w>(q.nI4]Zs|1ؽfȐDp!VcHGh3q41-/7)#:}Eo JB"żJ/WsH2P E-dq?AvidM#-׋Jzmζ'=PBރl8@ǥ"ϋP?<r::|~)^ēY$}h $O-;\ϖ/s m9ΫNkVRp(%|f ŬZMkYS*TS"omd(Fz뿳0Qߚ<\tI}X hc@f ,&.ԍ=㱟ǒ4͉w&nw|EwD4K_!>a(T$(d:)+"LeŤ +hǪq]d ͡^ls]3(*1 dxT8@qF2oGǺϝ>D&_z鰺>SkP[Y­@[ H*.-'S@hv{+r7'rL~ڱuH13rQjX1wyIՃj5eނ=/=n&@)=)iKo>y;ay( 8Gu9*T|4s)eZ_PͿi9 'N9I71 Ktz~sSh:A"1S*Lf];GYrIVS2;4[AKtn//Nuicą%OA݌Şb3c֝T6Ι0;*d0ktRp93@/d7M̫  ґME{2/p7{V P[_zBTi jhxgYߙ_7wlĉ~8h|ґzlٌ MhP۫eDwF~g357g=w&oP+Y%eFd!# h'3XN 11_Pjw &K]/q! W~K $I|ks ye&PBbD^N\^ǫ̆MR`g0JO˴}Ŷ;$) iE|vz0ⴍ3_rì XB Nm\w "Brk!ajBq^уym-(H.z<R;>6^& Av5Sd#Q@v!v{NA" .%5p]bT@Re\DY+JW;SB 7vuߑxjBgdBC"!U=,Mv{HHG<(x*1{_N'tQxsc &Tύk1k|"7Юࡻv錶]i ]B\8P'X@ЙB/Inr()%{CX=& ]$#%# 2<(:GfDD[12 m%^As=al$$<<ޣ yџ}P&72]8#cN y?KBw~-!e$tF9gI^!4.[= ZjIw6Y;aoduWjAz9gtOj2KARa 2!T|ՠAZ&l@yw<, <Ԩa+H5]f"E2<^؋ݙxȮ䠵'HSvѝhZX~~jşfyX8 k&Gl,L^2EGK'6֬39܅gpRN2*]P4C'? xC FFF{ 86-OowvJ XCQOx3?\SW{*gkmBhxHalzQa,؟LKĻwݬm^6ս};TɭEuZowNvbMXrFxS JGjRV˄1|~ G0%i?(]T'6I .*1oY%xT4eā!EXY[YvE  ch(oD?q*L>Wg8?mxd!LP6-+Y/ Ш3N*Ҕ~SR&s3-R0k-t HLrOC׌Haȕ#"N&010o '<ϫ*{HCTH\f$G^T95%<qO+x~gзz!WD?YG|\Z,p:0o3"fB@G~y6H | '3g :|QEs2ja}Hw+ZA3hSZeGe#)fA__GYǜ-ĈQ2:Wsa|2bZ+Rw'w:,ZR^;MQ I5H-}d e\_I3x1)B crWf/R+`Ѩ0G;>!S``9"|GY6L΢Dh>ShNY;"SRfGoYYEHoϠ}Ie2HbTm/Z0z\=,(#Wc\PdHh[vl93\|:>\^p}m}6L#=g#c̖,!k(ELG|^ WB\o1A!-blғvFMi2!)͔8)dw@;%>Ja;?j[2ĺ̠Xnjȳ2^V{  "&򸆍b6hH\sd@LCVKz|zBōGGFY;ŤgJ*Vpy &(V&c1g}֚+[Lz‚ VB:{SF@XxO7X%b7Y6E'oEepόISf"6OWn& F$rDDEHdGbc""BӅO= `ލPjmNcQ//EܫiZU B|`ތ3a 2Nb#}fb4rHןg~$D_'j!)r%F٥ޯVpp7 $d8}4)4S~gDiN1gn{D2ĔTId{^z3@6I \/ix-,C=b*2Mt~1ޭ5 |#?/E<G-c3B4)1#?S]Q7$:>`?L+Xzusg*Ckᙟ0^7@jC8^|=h 0Dn?Ko,f+|XHCcs$j\)ZZv+}T$8QbLeϯ$}.`2bl]\eiԐJkP+e͚gQ89bl?=rsV7 sjxJwHHWȓ^2P,46w /ΨokF&`H4 s|>mJ|nr0[ýsP7n)2?aoLVAjR,$ηcEErЙ9,D|ך \aƼʒ@>Z KSVzhU8.Unq# pOeI=6sđA2<9l{?6a튇Yy[v# (_2e,U "o4 0m#H! Ưumsv"i)[Z9bL9ۻ)Q"DM\g6&qFc [MH`+e9F`dƺ+'uDQRיPD yHgp=ñ:c5 %> ƞ~#ll3a`A twxvޑL MI^h޺,}g['H<׸j5{# Q[uK5fkg4'Bdm3I*^PwU(s̎mG/+=JlM%vWsyws(,DZOXro^1/mgxL>k}Pܢ͘0XrmwpD=>w qt 9Bpldqx6h6]SH)'vބ #>&\Qo-y1 R}V]goI~;;\(epMTorl[>1ooD?gٌ{V`3"‰;4n|72X} #衏2SQS32[&t 91i=*@wK[cb^"J6'D\ndB76;sɴfpc~o =vOPXflz u53]w=)QsXJ˒gs ty 83!IS/n\zC`H͒Včg&\V1",$ܙ{?[Yx0L +%!W+9;ܳ5ٖr>Zkh< ?qfjy,y(把TP4sqK}cy>v⋘}MZɩoՋGOWp)KNZ̧(Û\V7`cܡIRDq`PQ-75 }?a@E;FU4Ǵu`FC9fy4»nA]ʴL@uDU#]0^]~pS1&!w-MF8KF o> ?"%Yb`D+7<$B\*Kdkx,)>mcf6Fh}!F\f)]_K#JֳIqYRgmRcYEMMQܐǷAWia5ű<=2oGpO nLZskMS~/MUy.~p %r#+G3;NhTֳ8mY"pQv,re}aˠ҅,$hPaUk5Z"_7R&70Mx֖%?zE[.GWxKap c HY EC/Q ШoĹB %IC+t)?NNʹN8$oς: ܎ evbĦaC>-I&?t8n'/uRXU0c0?Pz+&"a`!MNXMY+yR,F!ߪilи}2sҽvTV˄V>+`Ǔ$v#l-sљvOx6DlZi u/{) su/:a|zMZ8L3UJzM+q?YZ=,.?*7ք \4:l4D%F{HRŊ.{ȝ%_Q3w-;Fn zOg7 h_Y*li7x,lϫ<|I1 QYC=IS`4'k/~G'a L򉶛O.hLGu4vM9LYTvRFWZ#)HZ6+NN;9Oҭ#sE .3mOqHbH[r=^zt_{&O&E>-~.5o21S/f두 @run|C l6IWڂ A"71e`!TcyXyCŐ:Ble*'s A6~sF O `Md[]zAJҠ*iHC(Y{Qۉc?2ɤ ^UqH/pq7=IОiKs=6ڭ~8J }}kJvD_2-䊑ft28vhi940\H~JM cY(r ;ӌC;1 J[']W?t-Ɂb$,GUsʚ$ra$^d "aȩ߱3pf?]}r#sߟH3`ʄw=%w& 'fH#0ES-;S4oN~P$h]::TbʟL'_^V0#>R5lw0! !JxoDaCt|FC {Er̍jM~3;e7xdβ^@*tp8ޫ.GyL)=d'9 \O|oF̖@x7a)uCA<*~L"NS8fsfguv:8{81L`Գ=q]9yu?B;#0ǿ1JdOt6m1.3+aEe!1@g3GYLaj4BIyN\meKuw9&16cUf%їǦԖHN| )ߓ"RםT${/m#.% G'Z9)҇駩=&`Prjd92 K~)$8 ̛I7L*/Ֆ#f'Hzy'i%.D)A/2ʫ\v޵ -$04 @]'v`_=@mwES@UH_YN="c^re;?t?W$)g;3K1ܖ#֏.Fu@Hnf:ݤT{lx ZfDR;D@J.9{5ӏ&#Gw̺X&O6IR=tDKk#mFzrZS4*ή\̍Ja~>Õ*v#Z)[$aJtaoP2COʚ>ExYci̩Wy~J8ev#{fizf TA! b8-+9͜ORۦ*AWBOFV9=zRy}wrf e^W^~6RO5}˥84Aж w:q=NW^t5Nd|M*U˹@eUn ZLž/XLa;)bQ$nt~i7M`aϽ1LӬIS.[eKV5pE##9s"KQ.P)5k1hN ]؟.ا3$UQ0JOtd7#HP{ rbѣ>/Q1eb"Zٳ_W[sL1Rv[%w~9?RolJzG~w9/VɈm"$`}P1IJf r]Zf"w%rrR(L$do=S=BlG{0?$l"G;.DMeT1&jHhj9"8A͡VCq߉ʼgu,Y3'#G[`*ʿ1:o#pȐb*xoE$0JeD'AVܙ㔜I- !q6\&jCDrԛ&K[YZ8aXeП]G@il7mR@ ssؙ3Wf!6k,=O IfomР6ini#*gI %6Godo %^^{6M% y#HxY6F7k$FьqZIY,ǮfSͽVM,!)z2MGg9`F ]~`lH`g7-i]mճǟ-UTfD/فvMxt%ʯvbt aqq%0H7OLhAJMVp-qފ;F|HT &7:tڪ6%Y4yX u2jY8K%goT.sneC˵l(9i?!(a'2 N^ 1}pqDbl3ˑuR"}؋hgޞ5zmJ! neAs: x^>,3$wM/ivTddV|r-3:]";DHrH*rxspUfSځ3ilnl(Mǒ7O-wc?Ec~sq{,~ėΩPn3߼8c4GV堵e9òڰ1Fo8KgA2jrzv䃶\prHܾJ'.1u2|/k9N-&zRsДD. -mnWt[oG,.6ЫOdb!Mcpۛ4IL]+@J# paI4~1 ggĮrQO9Z#~Y.*WAt!^.#i/.ǂQ׶ɹu/z )}\6hUc-?t;eȤa9Gǧ;BxVg*cY#jJvaQimtzsjT7 _;`Uc A(E;IqhYxՖeBf G^0)zaEa4ƨB`pN/f2Q4ɫ(vqݳK!!: LmnCPcX^DOږMqzcI#mڵV`ْxg%5woda8O y57_ a[E?ga4ך% Ji?I;TltW hKs rҌ%`rx坸6p0">o ܘ׍ۼ"O)J&q\dXI^`m碐!JkLY&^SE *1K/D7HɧWaA1.O@Y.xg4Oờ6p6oGCoNJ*RdDy,+AV0=;i̠"md4n=Q(m#ja͓#:IKzV (EV+-pմGxNU'l#YG*k/>X[$ ,Q\䗘l9&HÚIDw &X+ڙV_O>bOZS^ lDnJ`V9`DSk.Vq l,"jAʎ璝`($^i {jG.pȓc{V-fWK&=,LQ),nl|T)E.f`"ܶ }O,ϵB9 V*J9,n TІ5mP6قϟ.JGF늘+_vf [''h;y.Μx3&͎vyLf`zIk"k3 *unDqJXCNǷ/Mnœf}( j{9c #bxo|X<2f-ϳgL >ۖ]2:z#Nbms GȬYԡ!N2ͳ |%2ƾnr*fˆpD3N2ʟ]to=~| jW `;dxzpC*TL[nHs0x?+aLC)qZzy /XȻ )7+Q#=Y16K*A޻f Wϙڍu 16+P$|mLyf.=K7[FfrqJr089+*||i],_bR0$Fdkёa/rͷ%0hz1})>\mwY'i8\04^1Rf1s7[c!Na?jHpdF]bɑA:(_'L#vJ.r鮧| JRvKkM,AV-WWߞ(jP`*B7 Y, 쳈.[aBI?WB\dJbRk6hghؖbm|y@TbDa4*3>=5pl ϓ*( O=gtQƚle _C׵4 pa၇d ΄wN(Y{-6_L1{gk=_7ep=r#' )T?) 'FփLWl͡W:@$|B\SE | snKNCf9Scp2 G \ \+o)퐪$'ml*O,KB4G IO):У٩IZb2F@W/2ر]ݪGmI8Ɯ|`Ӭy㷚!Q-ƹ).9̴hB@\߁6hm1E{lU=_&3bb^%M'ئ~фVŮ }seNd<|їFRЇE1Kc63e֒q:B׌D|K T=ErbtD͛yһehODؕsVwkx掟4~Be5vq #V2[#X; { nQ\X}R7O7@‡䜬]74HϬ>EIshMlWi2e.]JbyIq#%Ec&UЗsm8܋ q@_5"UO1X/ "]~~i=A&_R8Ŷ( hͧ(tT(:$/`:{^Kd.L,2r跶kۈA atoy;]wqk% uQRpz,{ nzٽa_|?8ݴ;rtylSaZ3$?Mx*2f;fdD~pG숺YK">@71hͅ?)A5qˉ_40lǗXG4^b+"FX@¿b7rʦb@=+NIA/o;BQ#N!+0pǔ_/4r=yYO.Y_fғ2?Wlwd"هdc5ˢv-S+PXt7r1%DsjL :.Gذ K .ڣ,B]uTٗ~nԞӦզ^d|mkP5G2k*yEbF8'ԯ(ΟEA@+JO0ߌ7K4\gjLcrW7εc߽/3Xd4'o<]U'mO;Ɩ6{J ,g)YK*H3:P\a~`9$0UKRKDy +Y* *&=tB^Z H;[=j{[vP*X- q)h:Xc?*Z +-g t7ˏI*?6k-y؛!(b\/Oslg[(!8 \,3- /af)fw(fɱ; fŘ;`yb}{5Y犐;Utg h=g0mxYK68*{ gS]'/M.ŌC; E2J9pbZ k cո~}G.cqǀݔ.MDoȏiE.C஻T!GG)9 nOqb67?d|4^c8fbZݜsN/V^gdv)tz LL`UicÊx@~":s5Xت6nF%v~{^bLE+X^*VAIH*YK"$^IxjG/x:K[U Z/٪gkTAA3o/c!|9[C/מ1H _n= I}rwmd` C f䈟[CzH f]X9eD fvVk،Asf}So-O +xY~)<$U(wEIjTr9!&c sͻB,AJ19kq)OSQ[P*rqm=LT؉rMT\QǯypÊCǺ+2X$T#7P6C{[F#g$l#*CE}'hRQA 8" >O hK7Ђ׀ZM B&㷗[s7)* {荦&TeXJB sUL4񼚟¿^ HoiW#XsotGZm,o~zf7\cp 7lфi<9x3Y? 6(&,9[l Y(y 1i0=[C>vT0D~$%4yW_2[JxL1’g .nKmB;c Cg~QvUNOPp16U>G׻hv`?A; d`; t=H2 =e8Sy"LVLa9d6fdF1}"ٜ-nX7(9%84Q=]7ݾ]lV[շ+ !OCJ/|My ^{|ąj߽AȡV|>#24u'HJ=(OѼM[*L/ hϕKk޳bpDmqej<{37/)O {ƉKZWlmB78Lyq@B钆eE>}ͤ)(:ݺ>2;Z~{_Y(o*bj-Xx>& uB~vd/4}K* Qv l@p2Olɲ4_GBy 5-A=EcRJG% Y5<$`oF_e7jZ}9L zUX>˸w4L߇! TV Ppi Q2tH8L鉺ݙ'khfLPH7u8EFk(J!ēj95@:"w;3&k4|QXP/Ɠ57+e_5Ś|) Qw54dl-Ȥ+>E$ Iac5ԕKT03l6O?Tuj})!`F89O-~DӐ:jN7q0K4ZZNk+\#;&?x!>=i4L=gu r(ˤkW5x82ip#Wӓ0?t#HGCLECF?zsd̪&{–a*C,'e*]sM9gU$&r}c_қnVf*\CMxEiQjkd qE7H' [t,$Y zQt?'֙:1̄;ADwO6vZjTu2uy=Aw-ƺb>2gCDI|KWN;h9,FqLXA. wÔ)(L06ߤV.h4OՙK(d#'47Ukfw\r&c:eڦ@eD &w<;/ծmD s x#tjl_Ůg+kS6/6>/XG9[qOg9yHc@bW|Q^ɻXV%lؙ"TC?a޶t'> Je1]fM2|{:cӭlw[8% &9(]Sc>@^zsj)XQ)DvB9Xn \N,Ťl;g\d+rK/'WzFgBÄ|C8'J%I2F=kPnw>>Y($m o0SٮaqiKVϡqCpf9PpY^`?2;X z;xV}iDӡ`7%jfpUjR7Ydb- UDVأӡH *3=`k-?|i랜ѷ,P5Q q*e; O%Lk—#^|:S,vi1CfnϗEN`<Ϟ^@QZey p1D5ʆ9hskߓlG.8݊昅q̓k~2I( ߮fM ^tmKŭKn}Ѥ"WtEyKC6`P(2=;QI^~҄\:ɍ{fnm/|S ?%lo=c^ŸLP;1Ǫ֥[JVSˢ,oQ?Yc%3~|zմD"{c!؉ik @ d'oעpP}|P+ʃNL-Ң?fZFR pw\ 3L =]2KWy ˽ RD R&Tί|e0l~ASkϸ8h=ϫĽA 䕧oF4$^,dY$qb3*? (N8.$ FE:.y|ڥT5;awK<#')Z3E2 lb25ՔK~Dqf11WrRGHR܉Цe[NlJǨH,BdrFGc~:N ]K㺜\q=8wṃdsv)EK*4qT upu|92px#GcSp"fw7 b`!OTYCi};SB_ cwnz?g GR:Zcr2_oKW]Ne6W†BC2a T?ͣ|U׭%luQ]2&)(O9|Ò6ŹX(fZ>  LL9Ym20/OtІ!"LݵѮ+.T8< R뿍K.fJ(v7PUsZ_R*|p9gI1йIgx|M`؋ր/BR Sx ȌeOp*"z:0E략f G|42Hx1!U1o"es )fb:oucpkMSĄa{b$(f" gs(,3iE07,Ε5 ;J.C|yhVb.u$Jr 0m0Nbv҅-Өi jgZ@DNg/|ySTݝy"ߒ`QAa{f\QضS]u`n\Sg# Qc\Z D5U*p{AƗFqQ^j 1)%d*6Ly7AsML>X-}ΪKEq6>+G6yL!9`:~.|7R+3#mղWY>vBB<%.'ӖFٞͰR (%MÁqP3I.lY*ZxBE(jE=/U32I0g#Fۉ.OpO%~uW0 {\[… 0Qj֔c謓fװd.`?c=c8x<34XYP2 m~D{ Rni( \]CN,\ Qۤ%g  :IaL`EնH  z~3an#$k9$J^;Y&"`L>=ai$RO\rnQɬ/u: {Q-r 5($G:v\.!5%Jx_B0qXa}73zgaq̡8'b c剪2'6Yޘ%a7uqF)i%}̷ ^v׏aLjŤr΁F;cS]y `5Ea)dR4 ɼylLeڪVn$$z ӋWϖ0)y''XD JӬT "C8V-W|_$()"5;yJ ŏ'YusCbiZ2I*FU{@ ;nי;+# J2rm%M9o4u2x!_OYPȮJt'׌/lOC%N[ qȥۛ*2AERȃQJx^,#̰XRA\9֦f;l+|H [yqҊHO> v (!%m6 LEW ǖA>+hVLwA3!ϙe&мKiq9=(t9#{0I;Kw|)}}.jPdyUG~R5?i[1Y.g݅Hi$i,9FЉ I{oJ9ї@ry!c,G|gu6S p#RhۍI%clBBC/i h A $*Iz[D,d1ui! S7x_)E͕ 9$q(qCDfsec ^Hs ) -[yXs{tl䚣9 ٌGOh:mOɌv=zy{MKk4*6 ۅyP-2Kk+W+MQQX9ESw~uhܳb{|ҏdkJ{F2 K!rRܦ>fY1e+1!j舞2D!0|5V&(re$W2,1fyáߖhx癆:CotBa0O,Ok/D/!|~k3 y"`۰I;bOў57+xQK;L]]Õ{Օf cglL(\0ڥnۗH(I^xh ]FTk:VK:϶Q>^oޘU|7-$}6],h@cPqWt E*O^Z;X"GV6|}v.Iwd̛e|ڋʔkiZ'M3vE$RU#u;H.I%4TgĒ9Fܨͽur4Ȓ;o$=?ƉL^pAdtr=fكs!;t'=+ * 1^k\=Zkh`׆bh$pFD{a6BO{ _lmmZ`C=lؒћ}'/ JIDtzNn~%=mߘ[S0sa陃~&Y*rGJ7VVW8KCX$G<`CڛHV#I l] ]XgG7B,֣B!!dáף^{;ɓ4b@1lyGf/|Y+=)lZr$|?y,i77kٺ˪Åueb(X=%4b8۟`Zhɋ$39Ѱa5s'$*r=qE3{2wxVHa|$ " N[;ybO TG1V~_ψ"Ъ>Rθ$ŀ` Tfz)WLlcԗ+?.m3Pϴ p( :[8p 8ORz* 5AQ2KX٣N9~h4sFc3MC._͔Z ' ]j35(*Q&>r /A I$Vdz.^"po %Gx:l^" ,ɝg~h#Rh  Rz8g `ЭcOЏ%tFlKHtȠ';8ϥ5m6^ᮉQ@< )cgXƗ_*%ǧwa恆[SOb pRmo E- n6fTv&!Dq{ZUOPw7W~xcj44a?5@S@v+rJn̋YIxOR|QoK3aQ.5/Xec7Gc?':ӎ3ޕ27-a L_Vz~sЌITA7:77L3\b✣)<‡eH &/%$i7~3e/+~AC{V#,^R[PcG|U3d*.$zb1OJ1Uc'~jO#|Jʭ7k+fQa/#^%T̈́0k>-&(Tftʧ ?e3.JBA2c-f;qn2\L4'.k➄m zbJY4ozMޒs֊1Rysoī Fg^q~|Lx*PyF`H91>"}cWoBK,CQ hQ(_PAy7;dbb'=%l|_2d,tU_f4M vhty\"uG4*c~MC( nmG$ٍXPNWs/mrl?W\}UiO%sq"|5<ʪ[ 6K8Y~Z˄B}XFG /&uU0l Sw\ʘtճ}KL(ESCrXxC@f9K̎tnZܖ8^oqm>(uG[r6ǟ9f;t';N.Be0o8u $bFsqzo=&|>r[3)ʜ[-iø"^3eRoG g[Ks Պ|[5 `x9.kS,ʙ̛kk.cD#tkDꢩP|a_4VتsG9HTw~]!x: CV>[iM}Rb@Dk9å!Ri6vOEg[kՙ}nI|TV,Dk8kg Hdj:HW鳞Ң77'J [hP-yJaXk5bڻ‚k,sj]\8l=\~z4_'ls'xJ"ϦBlb.ELJ4Վ<&YarҢHm'K'I>YS=/=c- Fl2 D1_~yqe6^?$Y7NC:NLm3BruŎtEA3S)kb(s WV*ȽO1h7dW乗T}Jd6pbopY>g@@řYiGLͲeei_ރ~m0d:CI'ܛTS!Slf^DEEN 1 |sf_P,Ƽ[Klm<\ۊ%nO,J= 3d;tJHoBDmoNcyj/ 0XM!\CVeU(0<`,LQdkNY԰4{K҂fދ 3SiuCѼw(9JbBWIufi FFqp˴G"`\^,|ϸCU^*#_'Y_8 P" ̗F`AQ6cvLz運 #|*$a?/Wa6ũ}0zޅY5p 5CmŢ(؂#jFRc@ݤYcVA i+Bfym/?-{4ď["F%]RC0/#!ѺN{^{oMDKCng (=7Br]EY+ue1D䍸8V qKa,ȱzO>; wUQWiwùkd.P7(ŕ'\KͰAIy N REOF/M$C-'-{˱>ɀ3#zWgՕ(D׮eN9$2ǔBVxq2 hEbNwa,wO=̻[eԜ$}ȡ-{FWU_9|u`[cyƳj? (?sʩt|TOi aQ[.q9KбN?d T}D;9|\$0 .fؤM(,dFʢ( l QC4r+D%QCν9ݥ._Dl"itv/˸cjtHp&bh ?t]\2X9w5=.tF_AR 'p+Qf=O'a p7 wmA~dʯw61SeÞgq A$TvU4qѯo'ޢzr)U2c(eװի9J RF\M"HRDku]]69!qc+#Qqa{(QS.xZw X}/nkqއp] W`Pg`iU=\ϻf&,J^!!x׮SʽxtQfK 2a.# Bn*[\LpK"X p'Fvx":#הwwl_dg!;冉s,n({+3z2iK9ް8c/{.=m0i] :gI<-.z6>jqBEx]aLs\ט/،e}Da}wݝLƮ t-(㚴҉.7r-e^!YtGg b[/Q ڑwՏb,U"DPUNZ''k>c'C]lQL~ڶW -sa`C+qig ޻s-z48FE@zlPzǂP!Ihս$O5% TcY09<66cG1QNjkYdw?rm*<#n$w.5q\P4d'6RBhV5e}iQ5^.MɹkJ#.a!1cbL$}[ɅzD<* +dcm5ڥҪe n5W>[~#a"FNL~'^^%1Rj2Jf1(<Ԯi(5iԳ^ˢMD[f!Ũr7Ȍ雝GGXD/Na3n9 f8KB4flcrLZK9s%r)P" ³U {_b3GJuM]U89Z 3td/`o;e$h?3g_+=HS# Art4J W@ !1q[ "-OJ HV&Ӡe ͱ$7a~U#_̻O2WUi"%5Q^@cޡ#6 UH3g?rkouH$^7'?L::J2UoI!!C]z1s-&/F#8{=/{I̷;/ep Wba Õ('!ey(6v=#L&ԥ7$77b0PEAQ6_sP;SpDiAY2wWC Y#0X%eM}"W /f3h\d"+~+^u]EyӲ,vH:*G_Z\ٙE>["<%lzEIB|Zb|X t{~{}nmI8 axMh8ZCuMl~9|Ǫk 5^Aj1AkggF7x˱ncht|sm5f.)cžk(fDk9R |AcGm/aHӿLAPF(VKB"a)o5TI =?c3"1U/Z0^0#s}_Y͸ǑF&"!dP㽰\U;7hYBψ;? L]3`L f|œ܆1ᨛa}\gP#Q$G?G ED+^_-căZoq^@J-h_%{r>r3w7$JRɗv""9Y RI2,, B*S8Q p1qFpޕ!{gaQlHú} @N&kj!ێ,ߧp0Eqn'(jˀ6Q$t4/5"B|KW/}=MA6&_EW(q9Їg<5CP-jjeD-: %d̓,J1=Q0U7I'!l&94=:~T]Q!L9El^Dɭ_Gm-Sծ"4ϊV|g\D qyOQPٵiK 0&+"B=AqM'M8cp z2Mnm4O b;G=B0OsveHBN3)+1|kN] qh/K<@(Y*Ξҏy1[) bhY"<9j3y.D$ |ofUhTդ'Xtx6啄.34eV6Y* q<&Ɔ16lkw-ߞ094&=-bKR %)\]Q;b;ncj _TGf ;өE!21jdxsoxS-eDP;(؟;ATZ%1 )>(ͨ!@\|HH2PbJq"(;@u1}Tx)CBm}S^i6يUɬ?:m %ɐ2dj]"@e6iF7Ū~L\zjB䕊NkeO:'XDbB빘~wʿaoB32v`>PbQܙtxZbn MBe̩]Ia?4fo'` &K$ .LC |ʆښr+WQcƼM̐7;k!,S~RKKKw+D?كPV޷ju=(Q]98h$WHv{,Xan#7Tȿ"dQLG#G%DgA}d9kU 9Eafby1z1t4te8`:>u&C_Ğp ,[D% XB-7&W6f_MSH]m/ ^^.:a߼zlK+;)OޱEDɻ'c8m-󡧚TN;cy#Ͻԅ%~[lo-HPxQ;jSiPf=w2%B ]7vxP 5 Ȟewn6L84ԺՆr*<$y.;]CP`/\(:+O2O>D#0+t&u.1S ݊ U3G8(VV\0"0Xa7QGl<ŭ/S>* ڳ40Ʀpӈ GxrAoBzl8Kl_iwk*Ϡ1p-#9|E=e,&̰U8?kJre~p%ed ᩹GSJ^{b(b7C~ Qmr-lXƑ;?]'gDž .N"k̙]3 ʼ첌~^g˘8DZ”Vz'jvӃP+/.B''mԶ`^RԘhZ]fȫJp~CHl2HdQTCƀ:$ѧaR'/AVdnʻG@%<9gDT.gpwd$Fo IÃ8g_rm؄}e{_֒J`,ɼ8*OeJR$و\ 59+MRlYWua`eۇaRIDH6YrE43|ق%M:Ydo f gkko72ʑ#4RW(aHAз'6ݡ%6 wɝE$Uy1ix H!2mX 36  "qJ?8 i|w~im`9yx Ρy, Xdī [S3sX\:sr,NԿ~ئ8LR1KG +D{nН@p>&wnHc1/H)nRFF XUݏbq1Gk@VqL}ȅ2~l!׶۬v JC@lOAI!y¢K5SINtzrF!aO玦Nm:qƤ1b!oo9k %/U.kWҢQwFa5XF"DVfd:旧a`*ǿEY,YWr.DI^&ݯƃ94eƔ}86 R[ه&.DžOKb4둱;6C5v|ߏ>>Ap.0zMv}PUֹRl0q}m-^|ʤ2 &ſ'J#LhthFw^ mI+JuX-o@C7G=8̏!B:r4ܜz-猁-v Q ؗLg=Sޯ;{5bV^=$)Kb\&nP= WT艾 әOCd I3oh6+q"@FfTO|{)FAN[R ,chewe{"% "^ G Od=7(_3%O:!%uk DN -a`I%`EmyHR#Dsc1̙ݻ0nL=[9{p7730GjdL8EeS9Y蒘wwW|P;v]ŎSckc_2sdAgqw4|/KeF;J>9P ;OؕqG,$A-- Q~] ɴ4״Z+8T"xNz+羒# )-4kY=71w_*dHkp{VKe6TaΟfa@*$[˷vɱ%5zcx8W_ G<,q;_Ne CHn6"ĦqeVz_2=9?>Siֆ.o3lf3N'YW}N# vD, :𬻱&(d~ {G6/^ ?c-4ku *Ol.C\GؿAq\'֘KFnTf+w}KRМM-n5)ʶ$³èH}3bĜrVv{A"m(J[?8%۔b {+.UL~fʫѝ(L2#"?>Rpb֜^OV$Gu4{9t9 Rߡm4z)DzQ"moJIɤq?AOUI@AE,4s)1OC=D|`L6kN[ro Ϳ2kr>a&?'*1N8$nu"rjNDݲ644al>ڜ&VJUZ1"&6zͿ˝bE)66ԏUŶ0;P>zdu&Nd·GN+(jxN9p|Z?v3$J.!3lcNhǤ(j/΢ NE摎c롭t\Uԋca$WyQU .63[{j̈jݳ{YO/l&w,X6٫cYԽ`P<:]`B7k7F6vF$e[ZҳrdWVl43[qmp܌asJSd`h~\bKJ]s`^[quq7 \t"jnUPk33AZVJBb߂9y#aj/ZZ X Z, -~+m([ñ9"{Yd]s7Yt:~pX׉hӼ%2!Z`bV(Vb(X Ra,p #d9)>q 2[uPW7( e-cp\A$^1Ć߹m(BwZrn.xL;T{EB麼hёW &ǬċEb>Y bK,cB q ˺$NnY8sQ˗4:_7c;YH_gIk2y [:tG3LED~H[MAv,)S4}_\G9mnX1$dJhxCiq.ƉclY/YYI{iŜ, GҼ1C9*Xs kK-D}kgML=깛S2N, //3Dg:#CR(T"JyZr;Pqϧ <\>eaNb JsiN:ã4TqI.asU֝dG7TIJ*X=64QŬ@鰸((WRM9)9s̺f-ƝNop+Nޚ*#t5"'A5dn,c̮1BN D@UCvb? _9CGFW@agאʋ,H6֝ICXa[;;ƃl:EX|ޏ K`:r"&_#*qi) =GyMؘmȰz͹7ܑ.'%e>A㱕<Ưl#l`pQ礒ÎW]K[Eq,ls`ۿV]HoP`GS6> z k!= y=.L9y]'T;H)39) 4D\Or,D<'"0;꫑]0S0^E~w\~Ǖ?fܴ1BduMxϋԍiπyx%N QHA<5Z+/})ި儘 &:Ⱥ+ݢ!oFƳ,8z+xLBf LyO|# ۇ2#$WK_u(4I$5Heoxg6r^(ఫFC̡9S*(@ ޚ6+rͶڻd9ێ&vbb7dUŐw<3)kee|#~Zwbtk 8aDEW%1w|荆l1JB ?skĞǵIfa|! [E*젽1Q@_6g„}D]JBRXchEaeψ]fՂ!lAppl 4:GpqAR)z" J'XGbpLB >٥"ZW %^ %{ )먋ƾʞ[@ˉ4Cnү:|,0$N,P@. hi/2BegcLq?7 s"U.C951o8# ~ ̃"D4a{JOZ~T'#3Ym;^Pi&}">cD]Glɞ4'g{ѯ۪wA|tAdItνg?]GOW$tR/gt"=ݛ|7|bL y;#$V?)>F q·L%zA5J!!ޙ@V8H0tEL4y-0|knj ;&)qre1cϾTy"w]BKI'oa'c2ApZVr:]nTh)P(fJ8 0]9,Iv9"2n|6n`jN0F9E c~>30p! t^Rٜ+w?}[Gה) -#j:JH? 6EJ0`͚a(Ƀ?jt $17G i(/?t8Vtw3 \V(;K@}(8VeSQ<x=W4Wȝ9㍌Ro'&k6/ӌp:= AR`g*NH`Ȓ>MQ@ʻI|!=~r).Nyx&)lM_x⯿Ms>|%0}fERa(i^*B $B|͛ ҷdaKɽNtg[kB(*D"mv ֏{ˣv=ra?qo4ʇM/rh.]d!$%$kicʽ=8CY"6 JR)Zj<e݌1g-fgn1P.87suUl2DZS!6%BY)q4|j! EB m[ OQazj"t.=ň8f)uB'= ъ{)tM&IO1#3Vh˦xh ogb;%ƚL5'V&)P؄sW1h,*sh_z8CiEb4$7|.u}*:1vlK9Au(ܰ%dHcK&29=gygD,n OYZӡf?ǝ_oH3cmMwqr21{M2k\`M ;M! Sn'ǣ%z`wo{7ƞ$@z^ua=1=nzt0 buk @L0$akRMv|mowö4#-#f8V-M5rSc$ 5"ѹ~(A*y|w5?‘#F'g.H ?D qpQ2M9%"~aT}DP=$e|ikY(?gDr ,!Tu !i]APCٷJ41lq ,|ʡXJZ2-c:q07[{YڱK}1=*\\ qu<\V4Xӑ1Br$&N3&;R2Lj@AB DY-cE B+9$?ӄ`!ong͢bw(_ pch ;k&`rw? ѵ! zRmq <+j$+f!ŠD)F1y-!%癨`+k +aI!q % ѪZ^V{(]"LKϿר $9D{@G! \\x/ 4jԙK͚pKbL&3K2);̗eMX 篊!a;ؓ^A ܒ7qOAs@3MCL @\}F3CyInc!!L)(86T fu?^v(  9N2W;i#+ssGj}dJ͊*}4Ǜ2wg#'OR6+ ?^?SoxO,:g/D*>xӝYl-εh 77BYa'=ה;M& F}l 6mn7*D5khPxri^_Kw°2Bq^{jElπgUWB3p _ ./ $ nˮ8c~x@炷U!TUKg_Bބ}7EB.1=9,ʘjL`c$ L1z%c] +-v21Ø)|r2(ҰD0TApu8|P4JhO1f@UPnW78|i>N0$Qo <_h49=|yjy{%ã$ ?W-'39<ی▓.+OiYo )5)պG(;hܝb7g L!4e2U"F{33Tw)dLM\ ; 5=\W*Eg 8"Ȝ>\B;Uc+*MⓁ7(@`^yS& FviƬ^W'RS):8$W&EE &@Nx0(`5Yqʟ6%8K %%^4vY8;.?@od}oG BWFV"m28|tnH^<&Yœj[9._F #2zXҙ8T >q.t B }Nb-Y}'F{ Q]^7Zi/瘶((/NXOerh#d?ÁkB2$.%/gzE$v)/߮4fOe"ܰYU tzR`EP?+sXhqD}Bt39Y-N#U3F 6>'PR3NGW޻Fae*qƅx÷%,50wskK>0.ƆʽHEխ)2{†* O(M2(rǍpFlkF2 r,۲k@v1e˲Xpyqjs!+:a@t1aŌqj"/HByk0SF2Άnڬ_38'w[)C0هKۼdu #CϪȆ͗f$a7e$]{ma.GR{0e3S(ܺFQK&o]-/4NTVS}iWZQif&7ę[ .//֡wQg%I.C!{|ңE&ӱbemWDܐ8η>zr謑,:4ZxOQ_O`Rwrhp(13PR[iK$~@d,׌dw4wugA)W}U3+k ̇lm"uy϶ZO2F+,$hA]Ȑ\ě{qfSoiϾB7,}Шш*e'͏&)}ki ȜUui1+HDMCè~X /FN lUQyò0rO^V{#7/ck oNaXِ$A"pv$vLT=$7~50YON@&(rrXT]ݟ^tUbz<Գ=tQ{"aa%V%[&'#A4hIt0X -!U\ &$Œ-6LnmƑiI\C{r sߙHTf eϙ+CiWrni"p޾/qfVë,IZk,b~YB3˔r{^3-0]kBn *cPAdbLc=1˔.[ $ P)>}klП+ {~BW}Ө (Ckێ_?`UկE.g`Hs431!c~g䉍2/ g/nwlΈt(ZHqρbH>UI:e˚BO/}I-ՑO M) F%`3É<"t% ╱#"m-T\!%w,a S1 nJlt<_!zP'0$ yޖ(&&숈_Ka7";Üe8ͅ V%)!ZӨ_!\k%&Ѩ~{n  H}OTT宨Lių^ ULf9"~-86uXuY5W7X 9&f^rtt{d3?63~]Fes1fs RF}1WY!)w'(dbtR,4`2 7.'68yKKg ΋-Yq.stnM@_66SPo2\pS֣HZ_CqJUY0Vײzs~¹?F!!dq!4eDwyK_Tc )uJ?'&rwؖzO>e`5|hfE2Ӛ`L{dr;ela1rx-OB3Er`h̼߃8\#ДRD|?w"ÙZrT7e-JoQf>9|}W8>XM=]whlCκ+$켣#rhțTT}b7KQZQH<Uks*+6_bS!1sa:~= Y:k&CAR<)v|w\듔{ M;$9bG ]s_sΝ=s%1#,/$صkH>ؓ@b0mR~h5ܹʛQzdG{Dg߰+#O+ #ɩE bJC0'Oro#Cٿ0w{;N^濊2^eB>@sӦ1md9HH#&]QH1?yB#*yE 㷨njP&z>ADak6ܽnVv|bx@p k?NYLC^yV!WBQAoB4KPgc[5+2?GvʎLomo76_RjƗǟ__}GiyIB-ṑg?Z ) ]:pglMg$X7؎׽`9nN%|z:"aL9]ݧTJ͵(s2=_"Ϊ 13X^7AU\ËS8=X#`dznF~n/g85-83}2>wLBnt ՗˥淔K B<wp*iYN|Cn`Oh':NeO-T'F ߩNbAӃ]K|. 8xjjlgDO' xA\˝(!'K$o))BgF"}chA#0}27[:p-՗U*1ӓݎz QG#bU_)~a_ryaˮ&wiO\_%잖߉iPHˢxecH\Q6^2P@Iy2tW1bi;ŭZg1ͱY ,ضGB,i6XNKQk^3{bs~s4UΐQdSI:%(pEEp˫Sn>fte֊B;%/gF99q/ji?Q/뺖uJi▟ Xٻy|B4Wnw&di9YrO=5T^z R ~HY[F=l;K_oۿ[0Jxj1Q|vpMq zL"ӣ ] č2&{\lPf8)1/7Yf`_F;T?w?HoN4^Ƽׯ.OCA刔V7lJWL$:sMm!TWlJߞ> 5*6 0HDsEъ(/ԕN827+r91Mh>f1Z_E]AiQFyu?&ޗw!%#t}CϢS6_{) T|{;Qǒ;(^B^4moܟgUyYWxL什iԦWOo Ԫ/_vܚ{~XO7߂olξkTN- B^hL-7(};QΎ:Z {8T?XAB]NӬ'}W5ZL5q3=ɵ1?j(Dhf ^E6,B,`i}[ԯ,(yJ_CO[Ӌ?!G+ܩ{64*$RkVbVÔ:дVDy ^P>L2Q$ o'9{Q̒µwZҋ,4z͉cck~GgF31s"x\RXR3­REʨ5\t@Aqv3jyiR.qo d} T>9N8 ];HrFOLf38m'sr#cs_'k9HoU?ήa1^nE$-Ŵ1}S>y {~gg`F d)4dA3 ߝ-1f-}PJE5nʧۣ#vE'#ȾqѨއQx%l)?AmbQ:Cl3J,CV48;Md/\*e^g:_b\ꀌfx~ḺnW.tqϝ= 1[FJ SV19m7 j[XNK=1y}~$U͌%ASwS1!(BA&YBHNjӜ8w2k."\MA+<<7\b~UՔ]t:$_!5b_s,.9cd;}_7s(o0˴dݨrY/RKnnLQSj0X<̝]ID[PmzŐW LT@E΃B1^=We8O]NamNqWY8c9EVqc|D`c` ]BEޑN#א bpUxЈX=p]<эvzR;W}ꯚbNKR}Ѳh=mFU"]ort15z8.۝fmy ιо]JZ,diz&Lj GQbʱH(Ҟ39꿼gcgF8"#! 8Ji@ +VkG@B=nHnaM/1♋9V.G۵1ı!I/i'nhNLZ=zo 8Vx3l\/Fs4/Vbwӭ~& n=SCP[|2CmŞH4|zo^,5|c3T}m@64pZ{i"d1}iND7FS. Tt &p1phWy`;F.?L6u/V_V%:BLgHgGfG\ryc*Oe&%Fh並ͱ"z'$+N0:}:<6Ɵ=gҊ(3ۜfs]H5J$BmbFh{.y 8V!i :trpkM+,5Ei\3w>niGipjt=2 00CI>>P0wv'TN= L&rjO]+s7mM,;BzGmR "ux`L=Nw켛'1Di MTHc[|v`N1Vlbk>>])7'f_zNDl}׀k3sTUR=ã`~v̽ɧA$O}f̭W0Hsl3O&ڄQ:6CW)e~:Z=?^j:EHMyAw*KVL,Tj!֮NQI|,E/j';ǔV}iI̍\j,_rqrw%z2Yc4i4=;IO.̙2X =DH_z/r[JxW~06Ru xWx“4oICg ]gVfum6BUs ҾQ’coI魡^L~ !N7psŋ^'% >U~/o)'`X&G-r9ϴ&KzQ3XLh L2!ڂz~7||Іb|<\})Ǘӏ-KĂo34㉕&"KK*1\=P7Xn5MܵDGDcQ&v$!l9r; }cU[ŕh\O`<}ry؂/(DsU=>!5\YΉ?؈_Qc!I3kyVy$Z68-⎇5n9\n`QY4 .b3萗QbjN> &EisF+n)*oqGYxݳ͝2^* Utc0$; є&m^J9J蛙=#2E!1`"0E-Oė$ENk[ 39?H/9Sj>@BHj|FlF|8lςԑ<Fq!S~mm[P<,y:mo/_Fqk>Sh,;Ph}0 =`ݎPDn=^fH.M 5مJd+͹`h4ѧʟ1䠎;BGWfɟbʫy/*#NfX e˜ԛY[y|fw<#ӝlEFX^jYLD' ᅧL+G"u6 t&wW7>H\r(p.yBޡ-/&f&7]{h>#R>{VpBy:Er:2r]̘(^/˰hi8-i׭ՓӺ+g1*sUݣxq2LX:rr]KN]S02v[LT=9]R+SE~ L1oV^q?A!{Wt&<+v=y$14!)q3)n!]I#i:<1-:1!"9 y#C<T y"j}>U41Yp."i~ܗWAӤSV刂;dQ$ɩ3ӭ 'ze1c,Ld `D⎎g1/IW^ ̇›nA4b |[)C?&Zs8EED=~ :ٮP7e[Rj7\nEĹ;{_?u'1~Q b^ #P~b}M_;9l]{.MftH(ZCte_*c?DqQ)+_aBS٣g&l{W KŞ=3GKT_?hv7?~:&\!u{X:C'6zPN? oDЭ)Hl<6&\=nv$Ȟ~GmׯqW B5Xz|+ aܱ5J:oIvyf\,6b-eݏE!2: nQ5Gi~%"& !>b\Z!y;~Z&߄II6W1*7gԛ9UjЦCH]td.]+FG(t޽8p:%7zWz;oy]ITe-!'T`􊨼s zMۚe/,z[d\ Q?aS˖G$;]vbII?&xXU9K|D JaePfͨڂ$bV:.qBUYh͜O;ԝ(2.B62/LW{QZuDnz{g=JD.ܸdo?:lYhjԼut c壴:?/@ko3جO~3pt+4q Ҽ$>#1t1f}蜷PVlI$;fR,yeb@펵+Kokt7Er@dYBs"3{3 pk^"d2OgRcb/.K!gs8~ɓ_IߦT8ސѰ44Zen0uĘ$B52Ȩ6Lfie:PXFe[:Ed8"o܆  A9< 2NH9o__C_CvHCtawS 5YӁςL}a4AxxOuR{5 =6QݸkOb5O":6;< ~Y7Uɗi5{Z@fSsZȻNx޸1Edd}Q,.vީ;Na$?5uEc$]L<}x_{]ikޚ򻟌32_+z!f.=k4tLZN] X'c1}44?/S)6=SeQE =nFVә۴J: x`Rn6GӕDFE1B =Eܪ^~dwk=' +TW`0BTce'|o`h.S?v)Jx#ٔ3!3 b8'Nϭb1_2[I&X5Mi }8۵jyrH%~8RgYE:3AC^T.$,=NQ_mP.a _l59mwн2N>Di-Q^rGF34C H*G:ԓ5I}>v0G'_^s.u so۾Lä9\0"iy0,жUh[FƷrl@iU*ŕ9@]/mʙMzn+,]7c!XBr 5Ado)&OR:~? ƐlZĦpýox }O򼫂?61YVR@jFszG"lQY7s $w5 N֪4o\}CՙӑqeEx1DwHvj~S2>wo64ŭc@超p+Ü{Z 8먑9|szFr񸺏(Wd#?|v.sf'ʩމ'Sjuc7>>q&eK:Z(dl\h}$cRbѨDi1iWfy /1pU\Mt#r]JX&\֟k;;n0O^Sr Ut&Cu|kb8$'A|ϡ( ly}1lϘ^Iu:T# uY!|~i!94#փqȖƼʰbb#jfxxjޤG;Ρ#p!Tgg] CWuzIc@(c*G@liZ3?<]isctMw߳r1'[uX  -y؏|}伪}A\$WMWnK7&rA2('s;ZƋDMxa"vTw1h~bHy /.4uJZjLXSof1=M>d {M6.ӟ} >F-2I^dF,蠘eV=WYՌߍ {'Nnnll={g`8b8.݋uF}VE^>r;];yY601D*]oz71WH|^WtkiEp)Ԥ Q9pw;g/S]_7kT,:XƼtz߬+ƪ>},j> k,"u yj6C?dR?^눸ܪ%-Ei,+b l3nz띭[^7da<`4đ}:K˨9LF sHaCEmITYech{?c1K=k!\g@"\qݺtF3QqO8OiDX)*Iݬ<}=VO w.[W|S kCd\b-9NrS殺k|^]:M2۾3*~C?> 2{AV~3bO;BC}}cVt2f>[bQ*M.1kf'㹝l 'ѰtXd QXHG5 ָܑ Ysêy6}k!mRI?&mEE!kԷ @Y1R򃓄Lqϖe0anB6򟫼iiS~ݓCťq8 z8~M*A3-+m:%+ɉlSߴN%%gfuO`MU8- ƎzieVfw+/ژFSRfĿ_G m4ɘ< S/{й}R~|*ʩ ]1%dP8>|*/Cj*KulpOFul謮$kzsM+ `m[jY>E獗G&RDm•x  qՇA烡+8[&N43H"J~&u̵q3YMVGVIJd1o>4Υ uPa3F߳_U}*4CC?Da 4VdP>6m {47V簱F>[q;%Fd/۷u|9@1/]vi,ڐ8ʳ?8u;kI!i/y=aT >{ <ې>/t;G5L^c->N9M{Y1lƌβ=]CJs9;»Z !\ξ K\#u }'SC̄O k$A@ hQtpqZW]x\cQDIH]";:#ߍpio>A߀ʎhhxIKt\r3lI ][M-=K՟kй ,q4ަ=+ǡ}{+^V3f5,EK>nAe3o%gti&2gAAo;%',yx^>zqkHTF<̈s 0_ߥe8wS%aB\~!u'8J 'Y/I,B_}*OЩ>4b[7P@-l=Cz}e`UߺNglj X&{S?֥lf7iԂ1'ՙhI3n9]3ˤlَ2Vl#mIk+v&Mmg=QN3G;B}45L mi7AUmDZ>;oG`[ȞdȿhN{3?~u&{2%#f*0e!ڊ )φ+HDZN䙕.l6d:덅I^JD`U{)1hK3?G>tϛH5ۚ{L $oJ>U7(GCJs|Nw,c'W;\F5Tl |Ie\J|u+=ge\Fǖx֗gjHk#uF0K_H"z7{.?|3RHol._>,n/[d7A2}LM*oQDE[KpmŽUn9C ~7/┫Ǯ\/ɑ^<[$f"G!vk$ggɧ4N X?oCM 7cm륀5\Ձ}b߄n0s[=:ݼY% #nSڔzG(q*j$ Ɣ-yS D. hZیWAOÚdؐ a8!?v>@#,*SىAU!sT lwoAQFBv&6$"6&`m7[쪛 E=K?pE.~yd#V\Ѣ ~}欦=Ud C8 \{q3.fRdl6Bxb{YD@lP N1cos0tTuD"8SBł&$(fK\EavmB?#7űN5 ~%4e9yj!oNUǒ}ϡ^\PlS8†rR-RcRRe*5 p(8=G ǑH 1ʓ:bl뿐,Ys.% Q7XkN4MFT!Џ:3yҸ;hX Ȑ1q(HQc@u%@& "E<:% qn"0ʓ'ћ#.6U /-!LX]]8`n }&(ߜ<Qd^!8gʳa0f|.<n$&.x/mMAA/Gst+0̌&mÑUE(<fktx9 @v9$l3ɝ&%qϡއh-?h~{-F~tS ~6|渰s #CAb?B 9pkPHAg(#bi9S Z' 2!*R4yIo'rOF۝b,]6#]2nF6$O>gKyXaE8d'f%&X(L Z;4)H-A y$i  jRYxӎY8d;E8֜|rʓ>hLBbT.y@=Ӗ]8G6ؿ,rhsFvā\!TsF#˳&-+6|R$dގgqbc96!ryj&I"19zSHS@XK6Yy\BB=/Ҽlqr>oyCae)64s4nʒ'OS(NyS̍F$ ;Fg>XO0DG@9(TQS`qmap?-zq5f2Q9gQh  "DL:y+A8]E2ĉ|tz@pF"< " 6Ġ1d6Ppeho e7m6'Mda. tS^}II~5 Q0|Zr>)61ǠٗˎуO P4eUjKd;и<!8A"XQiwuvME1g&z '*DwNOQ} O(DA"Yk>"|B6s fn PR85b9*s !|xh!:C# { < &c`dĥC0Xg=֊'m#m8>#2;))! ŗxFl]}2NC0Qc9uckAFVqE=áz+ӏ|LCEwp9q/C&NΛCUE9IRkAajʍ1=ђED8 g"][ bL (k<" B Ɓ(=f뢒Hی#!2=stH46crBDc >wde6DT@<3F@ hGpsbăB6rud=#);c"J_ b3A/ňzӀ9` h1Mx}1 X:BS{18 @ILP48}rLO!Rk:gy3ȬfK얤7x6zcF_3 !4$ȼn .R)&͑&mI.Kɽ& BGYDn[w/BQ=~8A3=$HuI4#m(ta$p\I242MǮnĄ("' ǖB:vBȃl\ rz7xj1bt12F0[ $,[*XD #4$t2f}3sAcA*J*׈/!8'd9L!@g'F8f o4d`bH^MQ$ Q*L) |Y,a\~Q\"L caM1?LD 0 t'Lu0PBҙPbA;`C:bٰ0+%ES#9240882&U CI[Pg^X8Q=#|?q&O4q`T*69qZZhh!2)#VshasXRbH PfDx](Z:だQu+,ҙ!w0k {NA"r\bC}ÆD`2.Liã,bJϚClA}  <)\k$a  M6X@jŨsrΨ/B!'I R}5f(@&xkduI^ xn(FKuŚz^q39ƚv_.(_&|ёI-okɮ&#g)zK!kZq7XR&2lr/xˍ.6F7e>JMы<. &_mL|;XixH`^vacT|dsa U8ƪRV/o@hҍf߭[t)y3|,|/OaaS0?vZo<$,,љqpv>3Y!-.a)tT#cp$4jnWdYQ2:,+ZEYs!ZĚ6j܆CAWp}#w~N𒰔l;9:SxKZͅ˪f16}jw- SGCg5<=>8} L9jߏ8Ɖx7X?,@1ˤ hJ>?.T㶨HqD)-9EP<(f"R2sPq`hm q}Ԑ{L9xdd8NO."4Z"Q/K\& )8Z6Ej7tn3_K{μ l\1 a!DC5FIG-g<>#!fdFzU-ط1;C{™-.6mS)0ԢOB;z7`N֞D1"'/b[>-rO^hi{HT=75z4;͏=˴mri3fG;.fd:\\)~졈B/'sX.>%I5ƿMf]^f0ipf#]0)\PI+7;g(!Bbv߄D*FiD|,ul\n5yR[.8Op´V`t2KNp @Or2:WX(d@us&W=Ns&HW@_5[c -:"VxchadlæQYc dͯtg ƛQ) ])s%$Y,'K,I ,5uX6s9uM8J| 5()" T]N.P sEO$[,g fd !:1!V3fK7qyXq6iPQA˷Hj8)<>8όt`R::e;C.(Y5o39#2(ӓ0ORV<*&cT5$9R—_iuX~+^3Uho< bM|rlHĄxRmj,cs=6 xX&%&,DaaUCӎB﨑Te)[6q7$r~` VcGvT5Mx 0:/*. p+L=YI7o Bw^ȥI+ R:> {81hMD_ C/Rmoe&(>֔3%Ua5Df`3?JB\1{<ԚcP<:Q/䗬H 䁋 GC._YRg,^<MU"~+FHpo%]zEFWq&fvYޭo3浦æ]o$wGquS' c$,5W?Lλ)732|O86i|qD,V"j 0;޷<O-)u,twW8{ 3jď9ul9Rl>jb̛ǵ՘eQR,[A"3:Í>枩kdtҺǖsFLG'LG5\&e,C,{`ɒBh3x>œsZC(ژf_4>tEG&U^2M N-5Q1S?$mu0}gBbV VXt{0W"uVEʕUh{IHɋWfN#]&KT?5pȘHZ5ڡ( x2[1S?z`z]HtIz$Vv5X6`-F ;奇T@ejq&)Fhh'tь kF2@\dF#GӤLa3je\D) čTJqZ=(vmdq^!řD0*˼-Α︒RW߬bR8}Mr'Rh)JZ^TJ$JgStTm:>s_S@'Ke`ɂZ<QLx2u|L|GEO.JRpXf 4pˍ rvjTՊe:!nN)izc19{.z9Ѝ4e_u+㹃EP<'j:g1liU7oYPFBR(LzMomk5z A=V4 jY| dR %/ 2_yiD\M%Jg4Kx3\71DLgiřjפb!8UYu(i??0Mf B6rYQH/نr3`i`\f::R)DsBh3p4R+#X,ǃ-2p0 pLܛL換D5~9zb 3,4Q_/y3҂ rqgc8+i5?/2ҳ8߈Md-d*eQ:ʾUoM~ ᏕC[a_G'|JҖ鏩L1@$)DՙGar)V EmG(+}Z>ox2O`K@7,%?C0rl{ﭙkDSi{ Hbx3mk '㹐\㉥cSdxOۄ99K?0׀vQNHc^2zAmk /XҬnBXzEeni]Ӧݑ2T9c"*)DKk!s=+T!0 $8JTPd.HiJ%D˧0]q,3v': KA1*l|!ΆACHD'㫙L҃'`b$]Hf֡<fO#B-Rt;$դLՕ\ߝ=?d6h*:L}Vu=&gNKM{=Y<ԒfL}XRs?yKLo}F<33pw"DJ;)ؒBv2$⏦79?wU]I/|zz >hA'߄[<,F;s9zg(XiS|X+\x_jzs&kziX+$0[FGQ_?"N[qg#p"¦5K%8" ')?o./>gdҖ<y?o3Vަ<8h؇_5O8z05fZ .tq8Wf yerZǥ,ăXn̒ a`R{1޳ ?E%M} Nsrb sP boTz&(3fD||9̅EX6A:Fp#@B9e , 1:17l4l'*%O(Jj}#EKǏɢqN˅(KRF)&, VX?o_vQ*Cg4XF+l-[)'s X /FћDl,֝*>(Pjz)1ވ66Ҳz;Nxz;[X]lV H]2o_K3z9]L .}ݢK"rz)O>:}$`<#8frq ) [;EY!{FmPt8AcmCL1Oɨ5`O r5YC`uyJ? b! Se˦@v!L>-UrD!{1٧ͣ$wj d?C)j1)*&J0ř*Rsjb(;05p1ϗDy'uyG6eCh[2,1D%2fiܬi_7SPEzi\r9/WFΧ4aGf$6]ܕ]y0~oY}AUJi"ϝ(wM,|WHz= f6^/vá$}_f`dnTϰq eﶻPh|]OPJzvQ=ΡA]HH%{DN8?Q &x%lGq>Xy(d\`r -{ NCTѤjHTtY<ךwN,edFP84g聦(,HoBi~OȻ:&0:MXۨLchv"ōD3)+|w-sp9F%&ʌV3saQ/y4b( ev" 37Ge:wڈl|* dgX39D0Q7/nq,Ɨb;/WZb${UQCNĖĊg({TeAˡVvUdQ~rΰ - eIR׍)ƻ@x6 V qV؜(V[I`FV[CW3#׷b`[#'"e2`-o @x0SǩpPiiS!ejk!7Ld!jvPTrF)=<= m}f /U"0z :t$Pŭv2W =z\XJ ^68}"-y?<窚k׫蘲b8z=砳Fke)%h%mt,KS90|YVseS%ݟh a {墆E:+uq{ߵ[:wXw݉)WڳM.1#2P]>wGs$Uѓ݉rcL4k`"mFI` s/.9=e2)]'ni^ Z=&mrD^ͬ~JViy/T@NfJp嬽[O0Bip-L/ɐ??c1u:"G!͠DRc 3B0z$ac\, L4Ǐ1J@b'J=m~lR6a;R>S^2Ìq/4]_wk@!V7Lb)eeЩ[ 'a=31vkө9[89SI|lYy: x +n(qAV$i7.w>œFc-%rE_LW=mķbY[蒢*'ȻN2_c6b" (Epx=ݱfu+ cވpUvYqt/ A%S+'؈J7d9!CC{!˱YY4zoN24E0Uf\j{ djI$(Ʉ䏳{u>MLDfiq S \dmx5)CC{*6x1?H7KHbM҈WG@ oCS>[)]O&ЪwxK#Ph~kZj@51YCP֕qŔcS1ΕVsCЖQ+N) Fa3[{ 퐖"?Rvŝá]-xS>yE>fj 0[x7̣qˮLG.rv?`7ʡ_?ː| 0O~:zW=mqDU.fE#4' 1;9DJ{N!&Ȧ3*C#]{tW a-W׋\{r lcL.gNF2kcl59Egf}`Rվ= $AMxk{cLĨ,-{gqKmAs2{bk1 "zGx|aV\]&K G}'ʢ(2x=:/d͝yiܥGhʄh>hFMeD]Ӗ'*7sXGm4ȃ"no?RN[$2@@z}˫3/C#MPU5c ԪƑ h:@&v'ƩОp~ұ~ i3ZƞԎqyٮz,ɑsZ:dk5[ A{V[aDQb0{ N(A".[YwزH GX~z4Br7G-Ok?R,0bl?ᢈx5e>mAö}C8l#9و߁ʡEU"򟟧ɷEn1C= eŗ$ 9T_k# Q >,NDJF$|Y~л5^hY C, E2~}v桐VDcH  )j -v`^˭.ֺl@l8"2dZ k#UdJt+5 (V>&ieܓi \`kHb/f\3:*@:2&^S]bhG`IAPi,)wKe@T}tDu4tTq8b}3n140"]c ?yʼn}.YJ[ uKϴ s00C$¶j(Qy ¤L(I)4%d"74h\tqqnpQj(B)Qڇ\,OݦB E`1urECqD&nŎգ iV;*qM]U?,Ɍx)X\r5>tސε[JbPҢ*~" AR@AAݍ=>UH++Ǐh_0͓^5׾7ɛ|6AedsBfo^<'Ci8i?2vV䙳c4H]Df Lv)lV1̄/){2ybφ U,^g:B"&C̝;jy^*)/Ivz מ׳U1V|yα.[׆*4hG3pSj1jHͰ0ƈ%g"K]dH6.,Dz ϸd9RP_``nAf{)>B.ht5Xkx\YwI&O D=9i^7y*ՈK:i cAٍ?ݥia@(ˤw%9/R;<+yϓx!"Qw )h/8i_&ƠmHkMI~)[tQ,E ?jYZVDjpѢv_oLL샧?C\bErBAQ^ å@om Q&NRQ'C<9Evͅ8ەqt(aEc3EP1`ȷl mmPNU{wN~smHak3@aŒzZNND'* QCI2þ}~e)8<2zyI~N}芶+ŠVH,*HXGQ8nMā: (dzY?Y6.RԒv\5qSVabܰ~3im뮑m<-l8=Z8hR͙CG"qA*q>LDơk߱3izYN+rnggPhkW$ϊ-RDJn7m6Uܖ5 ۚnC]L!"ZUI[Mk@(zRm D9ɎnIdb"~@!siK4U#C^{LC˫!ɈDħs/8#{Hg9uw}gtⲐ-8"0a euG"<=%1x96oKl1B)G[tϬzeD`paL@[=g~~S*M?Hƌ&i7#IF.BwhGN/'@WIm൙nr?x_1g/.p5sYe ;?g7Q8~x^z*WSZq$AL'MBSc]b#Fq^D/Kc[~V"gK>ǦKBI$:򏈞 N;tzeoQ+?~QG-h_yylvTOpT+ 4}Gm]|fJ69\Х>r9d̳sg)O9t/z-;lH[,Y46= ׄ:0e%i Bˤ#Lj3+yaP^anQ1|wh~fm .1NUrOHqrF"\RObdNSZƦ]?y2g[D ]3:e صYzB.מ4wG6f- ^1KBj*(amUA]mm?fY6~*Ov9Ig9'E"Ox؜^NJ< c􎊇\*ǹ2Ɗپ=uܸͫ$%M(eOYa3ҊXmAa> FOg2UԞ,wN&yHx>SddƞIje5Q@^vǒ U/`ʯ~0X1s+qBw.~vNWg "bNջv+v 'jQXB=,?`sr> !KN*L~)`"%g5Ū7o9ka/ս4lzvzJNnMȩQ/Zrˣs5fQp؋BQ> -Kvi3⣇9JhS1J:nn7-sf=9T9=8͖lPcCO<{n '0pzMʚ1]Ե3tFi5fBRUb$AnwE CZ6^"(y>C5o`BROjbT*P[A)F1HJt2zW"MYO]}=gEh9Ȼ+h_<n@PrD7G2llTy;JPS=ZDK`aeF܇agsvGa{4f fV}NvߎwfCH|I\K|,sH*yhR9%;_;ni409{?Z=2,g,j*nb&Z~>0cM8 ODRQʍn'%==2ja"6\#Z'؋ՍgHd gPJKEW]ͦ>r7M#Zɟ{`I6 |uAAKq9ry\v$E*>ZoØX?kcbhMUw5s„}d?ID,GȊ2#`4R؟0D6N^ ʫ7ޯqGA?0eX3mOAt3qaAi5yKV,СƩiFDf,ѪAK LO,mf%l*fF ~+1^Ȝ>VLd{Wkk<wiU^45s@kE Axt5v_lfPA$n#{k=voQv᧺=n?+p dj>÷wR-_:Ua* kqz5Ǯ&<ƐB02,dÈYnv?%wXN}SP Nw0t EoԾvه(9]7h2% j1p*Z)/Ȧ/[uusZZI-A=X-a /0(_m#K U9Awʲ!E~:Q,?<3n38*ٮyXbM݉WTltAuLKc8J0D[c~nlPR#p 1IK@!Z'>&^Gha?I Ķ׶Gd}Uj%Ri"'GĞ5㤣9s4Onh4*ec >d@s$m&WDGplϭd|ӎ9kqC%=EDdTDarF\ast[74zw}zb1nCd]@f `eM5Nz+ؒN*Oio#^v3)k;h6 iiF"fS=b bG3湻z}*4ެtGS$s!tE y~Esp!IbipZc`>-t $ϯc1kg2Dd5OV.Fv 1;fdFZ91(u[RK¸RjA;$$! p9CLzH)rj%kϸ.$VU?atxcPڿ#m|'k4k(mwDdw,TzH3j> ѣW ,}KW&¯'( |sE. UH4Ԧ[dL!}#<޹{_U9Uɐׄ?+e@,9 g`=SOQ42s1t™~88djvtNqGZR_В"`k8US'kr, p H1S[5+9bY+~Y_8855yBu+b˝O1yS6o0f\տ=(ĻHr6Pߛ[ 8IeǟjY E# >*vwXFbrl a$ `WeǗ]렕6(F/^ZcT^|fK"rf-#Zz遦C*~Z` }DKi^0;q=jm3qa6M9.xxQYd2SfǕ6V:ȷjv.ƐzwIFh}Wc72_1$):f,Bj3ݨ$tBoN!/pԏk 6,ppE_[Q8.'(' =C$fUXݹv b@L.dwM#B>ϓC3_ܹ~3|­*Ef.j/0jx:- z5ch'5)i@r4GUԀԤ#fs[Kk/- [1h^xpRI\KyPW}l&w4aQJі<ѝ:,cHsVdwK!p t&ZWeKOyCQ;žEss W-ld'Rѡ,cJkZu9w*,5M}Y$owOEޱ w֣7ά. uxve!H*g nX4(YafyCb qe6;9KڟcDUzARîʭ2*C{'dN&g? 3H)4ΐ'vp]4 JQNᖽǷK~, !!-CCpQ/RŝM-} %?y!\PD:1v6-Tr҈e#B7 Z5g;&pRLMMNW_+IQ)G"jhć%:<$)EyS9md,@/N<ex'K)57Q)"KtT_&&MvnCvL:8z'-=S$ݟj%2W֋*`C<_(J29`W(śQYUTKq9l*8S9厽XFOДmc8fn&HK=wL%`]@f4vAЉwjEm#Ss,cjcv%#T_aD/KR: -\s+jeS1,@$xn`NrfDA͌(cUql/BE ?e_d/wj{}rȊXXnGNZM2w-TD&·d~Sm`bCr[s+[,FT.t)oA1c,O(̪ *I,A*mq$J7~6Q0jMZLwq=wU ~ˣSj9Iw E/.FȦ<>pҾ P/jN8]>Lf!Cc.*'+s6|]>qP#ԢܺwBcWcɳ8chzg`yJ!K<߃;,?jzH$eB9ġ[biQ+~儌%cHM-L+F|_BVD'y3PFnlRTZ`kPK-YVz<rw5Ht)qwͦy9"R&`+բê]~!u2e?X؛ʄIz9 . Cfzñ 1W0Lp&"xBdcӜ9>yf\"8| qښ7W3 nQR+39Hs9 0nM[,ߒ\xP!y_1>߾C 9 mĈfsLi̼\9HjO|VMUpgJ`I p23.7V>/N0mxh-!he% o˙|,-LMat)48l r4 q5+{n~a8/޴5-CEUŢ 1px>J}b-@EBb;] fyYNww٪.JUv$wᑵL`&i-H@H i: K*7U/*;6C"JwNKiH#rPڜ J~ gZM:hfCJ_jHh6S*D0I^l[/咸ǎ|u&s3@p[&$xvhC%^%7L*vQi$}C"&rfaq ֈ皋35*:^ܱa%;]%|^xlC@j%ob"=qaQXE1ַSmt} Gm+˗*Z P,"Hu-AJKGw>0S b@JXΝGMkEN(?3MhQ/0tvi rY"/L郴oH;*|}ֶ$iAr^i;b/}sA#F&`0/C4Bf"T!9Eل157` )[⬹ !nM) exx\  &Ŏa%rE|ː̈/Թ&LG3o8*icLWK#0pK˿DςC9h''9(91|{Qbs“{q٤kyLd7*޺~ͨ>0b9[9;"0u ǞO(~ ؉3t/|gtrz9$'oF;:ޙ6IAքU;h$vŸlY``L`LؼO:z 2:2Fz^VfXm&-( r2 ,I LLNRM#:Mu/0%wa/RսQj?6gJAuC]t lnE r<AI۱v㕼\W;Ec;(+$v:rܼI r DY6n[/fQm'_li#ԿJܳ9و-DZ؉pw:# JXg ?S>^{IӃI*[;Htåm/F|(p~L} <4)&ͣLP$ȼOIeJM6(o~I2\ؗƠ27s[ 1FQaK5L%U!6z?{t/t7"̓Yn58]͸"zkS鋄~S&3HC2XL"1H[{c6ARu]\WcF0ɖ(d,8մaV_CK?'dB>xvw.4-yPo]iHEх4fÅ^75J/H:I \?>f]n6bFK'I(zF{✓:$KQu_Dt3'Jnb9jɼ (Y|5kn8 ۨ! ՘%pBhFk*Takؐ(dtb:vc6mZƇ-h`[I0-<+DN*qZkw{g԰ } }K7EZz&5…>(j`|7⬐5߫D91o.r/Bʸ÷) Cń}h%=I8e$uj6(aV2>DgÒ'?+%LJ+nFȱ !Q> ZtD1|I>uXZ65,v<:22*tin٥{GosVu|"%KwN(I) *f}z9W/1™h|}kKl_.E 0:FuYa(oгPA]LMǛEc0d4:g7s0s);~G[`?ȹ+v*$O,uv~lKwNft+,e"P^G2.igZ%~clLbp՗f:W]a3@v g, SEj+c--lHwḄ/gf'5{INx굻#X6 _fSKV?dVEXZJeUtI%p&N6uHE\9QIl',nyurGm<6掩-kLҴџwU\vaڦJ\鲦)5f(5Mf!sX>)юNi=  %fx?f )}* #/I&?5tγ]Ugͨ%`bD:ßAK 'XXނ_.Ue#_3շHFHchWy'Լ[!TV$jE*#9~wK;uF'] O5U`plYI1W+#PC/찼rZqCdx^2 LvyNx- ]5qGAL*X)X_ 1wDŎ&@=MXβ Q9`2!B,_\lw'7j,ڿ&^NQ:w91>bu|u8t{ۼ^}T`U.bVԼˎ"h{ ˗-;glCKtPb amqv7=;q5;c7 6bDpph/h0 'YjS8GIsp6ui*uw ȗ4$> l^wyCLO"|yFsdʍ-JgsZ$$X"]= >/~wzqˡۍ^3f,.r Lk1!0vȾЕ '_8]P>E|6iL]e3L߫[,Xߢ خWQ7o)yVd\ݬZ!XZ2*^ragЏVȚt9`m/@kMt^dN<+xmܯJı~IEȮϏ[} bX j,M(lk͞6+ČЕTJ:,arqw"g? =~^raRf~,R$+.fh~ ;~܍qJ=!W_1`:k2 7}]"ɬoKt:㯕 郎r-2Um^t#tEd{B&@{nݴ(USř#wO`{1{t oϱ8(kX1jQvR!TB}=1B>UK$wNh錹Yc 'A\_O⡠7u&Pz8AU&q5-]@%2K:#>'0JY" :&xpkfީ<0)47bq#eMV/%f<9+j\\QX( Xf0(M`+TUD!2bZ? ¥P"|!*NoKS"**!F<<Ƀ7}M!H7Ǒ 's9͖|s<#EA[ݏJ9Ϯsq0(e#<٫oˍ.q_CGhl QWa4,ɋuEv<ꊂ~V:[[ (ckRp)06fDt^|1 6jZK m3(ɝʱ+DRT͞M/!8oƾZiHs==(_$xvߏ؜,Di 6D*twf&.H'rYc$ġwtLVxve{,G2xw.`cp8:R2]W9d = 'Z]й׃_"+@hBps9Bfώ?ZpJwuN %9-YF8HxyEe<Wms! &W_tǴP MC,|Y]ۜU&T"7 Efˀg|ŋÊMaߋO4@U7nb9s] 8Ӆ]X±`G%_&C+$<A {o*밅Fex-\:m)^C_XXGpENݹ1ȬlK]y0X|=!h.Mndd.)4hN{Qἷ,ުz3ruϓ`f]E~[d7'.%*c}8Uۃ'g^JNad aV; rѾ_^D97@~IsϏ$ӹw۝@?c ;c;vV>nl{/#7F\M#A GөV56*x|KBK=9w:ƧI-XW Lcͨfp59L?Rl\@jփ]*ڞJc#۰(T!0Mz DM9冯796"&Kzs?s+{ ~ġe(.MKxq t8"/dg!-{Hė#߈Ćc6gbC4J&prgqM'$ w.?_BM ʼnfl}ǁ/z/XU1fX,@LY~@X"P*pڔ'*s+:$;g=qcxkmɪ#F tJ!"b+@Zw$PsMdZ?^?z$B߽Q}9=Q5!="QG{v}UR Y{I o%23\\^fm@:R;Q[O;W5Q鯳+j,4C 55[|rSkVI0@N}`k,'%[o0Q2ԓP#C0s<;FXH£!hhV{*RǦ[ jy݋Ĺ-[yJ-&^!B#TtiYHd#3.f 62 S-Ĥ;JUyw2ŃZhlӮ"MݤSYUAh}92;rƋ=Z0eףDk DIyL8+ux!lxIbhDpmq"둮Ebjyord41EJdtfG 5fS"BIESWr[ؙ D,\sŀĤ2\|Rs`Fd/ЎYgph y^ {ǖD$fhR\BJkSY#xYh; J^٪qϾ^F-˔L!+9'kw1`]RL#xL*.}9X=q}n_kbdJ\k$Dk5p&|_&=8%m9dB^n[wXI,</ ]daEN~xh{i9A1O9` 5"~|pa#!a_"󪢺.sh(g)MeUՖz{u6ԈH\i4m!,T_PKdfx8B>_]j"P 4}K"\RKNNNArN o7!S+P0Ts*b#+7:\2sj>˖o;@kC8,]("}Gë(_qubϊ5f5-.ȴf`L;D!x6}'?np7vG#o؉ qy 07U霱g,u9fhmXFRyR:mߌ|ߜ-8-N0+Ԡ΅ . g.|kĉ>w[9%jr!<|'|7+Yt:>$nPbB .G Daޗd*V\{5U&p{0I$ea9֢ X$8 Zr4ѩ)Nf}L' [~_6” Sζ> jis K61$nQ'q1(Q@])nC%5$uᜳR cDuhx= '43A!jLnq;d3Nś? s8*PGKJz\ lK>Ď^^ttpd/w pb$q;}Ȣ{A'U%!DAYP(JRQpplWcsFXHG 9|F+8:\aG =6,.f3OgⲶ&&rG0z('LJ#9j 9p܁$M@sv"oBB,5&ab{5*1&L; 3g?sk90&Av|t1{^cUdגp+iƷLu}r!ǘ(gTtwhڇX}\$* L_)nZ$~~Ixcʉ4tu0Jv>]\q8^IF*?ޢu7Xɤ 8FbŨo2?8", I-!}O&}fn+^(Md|] \9yYLcJ% wT?(uL:[("?Z2mxC9RwqCy3H{3V'YY6^$B6}Ϣ1O"k:ds,HX;g=bPL̋gXRcmM*gqj(EΌGW. 4`ZfT\P:FhW2e^;#E(d4WG'`IgNTp+'D.B$gi&qߴ[683oR\RTu[sbe<:he+A|2^rѡp'bu16\?xG [vZ@˜"#wM 2EdFV@gqrҙv E>k>pr-+gd@XpN\\WO1 3gaoh2f)fDß]#7?1=r,#B~i|36RV2]"sAhSےsrZQ؆MD~֛J?Vd 灄_56;jɟtZv=Mr>9ATudY=ڳ!,JzK|3d{]Ri"#6T(ƠR Ws hvJUJ6 bUˋuV~eBRBj xH5T2Y܉\wÎaTӆ$?핼m=u#t )7 A 0絆S\ƚ&:̔C 'go~)qc+>)~?> /7!1璊i8Mne+CӢ?6k2SU3JXѩR*Bh,t^VVd[O+3jup+e#+ZPSQxVһT#αD೹r0ozBl| p(xqKiu%lQPU}M4!X軮*qRh>zgێB?Q/A 9).}KH _#^-id&* 9 ZmG32g5bc՟F2`z.nQm=THPº䩋Ϳ,| PhWhGtȎáfYıq(ɓY#_v), tAE5dI1u93  DMvq-_vI}fGNoįN$ aG2x“rm!#&Ra9(yޓMm.Ip0.d1 3%|Tfb 2E$¡t+H D~t*֭xTq)+;&XՌ rruٌLs,9%^!"t ە v3h4_5b,v~tS/qS1o2BESQe3ȏb2~a]W&JCZA.% HD:؆w_(Κepw)M ΝΆ?WHvR[lwj#Cd"xE5Pjl wQ=?H?,l\Ƙ!cKR,i'lE0,or嵲aB-FrdQS@Zpf:lNIՕ.cmKjTY틂u Zs 2 "5\DiWRq*h[SEd_̿PHy6Tuepo%>(^'pLb}H'G7㓔7 %2Bb/}H 8biOK֡!9}Ӓz p)%2rxW}}]wW$[z)EnV<8EN--TeP+ f)e PZDF<֎Z42¹DE4m/HȄQH-B8 p~>C1@*}LjNgF myIh8ßi8j+o{S8ef9˪sӯ_4`ޘEEB궷 ׿xd#'\28.CZM·op?JT3%=]T4/D%%^F-|sQ{G]LoSW$j_vs>Њ&kw,@2,} %=9_T]Kփ4SE!m,֝/f9 2s`CGrf1Ez7α-r+g\{bh&#ʢ!|1UYwipJP>ΨŕBɬVu?~4wF6~dNр~ hbS}+ QHG I!A)MX̓)OPJw&Oo 8q\'6XMx'soi`>-"z=%7I JY%QLD%w!vnpTb|Ud;B7ʩxIW2FO>;IAcX/O<3bZ1%cu 2NRjnDpMjt%бk_>n 5 ׈.g1nLV~G%Qq3񥠇6*YAdR "|'^cN;qY[^iXJ$ey@j>@\hQD+3]} ϖ+>)-i=?QF,ĉrUBhDynrL1'NIBCn$GbIœٱ19W#L"}u'w-t. F#pz3vmF65DjwK&$3MYP kEtZ5O2`9xN:^q?/Cʋ(<1S-/?CNƓ P۝5ZIŠVKFdV bL$%E,RW֞ǃ\?(5j{h.9{Pvwg>Ҁp>Je`6)Yx:d1'^ p|41| 7ZϬ+}ȱ{Y2X&-QvْK,g 0j;E'ceIKo S]X;?J4k,䑲k}UGCjQƍ-ۂE\}8>}Be@\Tv츄vbSx'%$v{)>mpLGq&{ڻ!{l ߟ<5nJ\[1+mxf:6"7m}DPwݟ+rA1snGX[I& y㣡֟hKgi\Bъox!ibpq""?(Gz’DZ&8M_KVGZ~c4V ?n`tܿ&-Fu0lxVmG,OPJNХQz4wHW){O?U{*; ^t"Al=Œ䲪kTJsc"v`6xrZ~O*"U&L3_$ݵa[f't|F(|+~kapXpsdVd y=_,o?I2j g ̼wijwӽ0֊4%p Y̴ a6Ίw90$R v]-F-Rrrg+Fl3eeˉ@K޲fsdC"f%BG/twr'T\!_T9E?%˟Ae#N?`;hJ<-_hb.sp6/owHٍyx:7Ny?An \e=vjh8 EѭTr]PA᪒Jmaolk"@: G"B ӓpiAb5iGEp?O;B/;sK4=5-MqJVSi-a@#I^;"Dz@9Hup *:{`Cu}:#.j_#AwMRPy/=!'ny²|;*)m/eA!ݓ{33 'L+zb[\wr˗gJ㲙c@;iqr#pSd?^3I|mdBf Ff Bp Z? ʪ^ݓ1Kd >ғM8Z#^aCų$$6>Zs!aL an2!CU"@;jmmWUef߭>lva)TO{&"4Sr)50j*%*c1>ւe _*ҽDB, 1q C'7cZ+ѱ<9bFt$Mg32tx۱&R.z. ;E2Jέ tviYX8^^Ml6Ǿ_ӏf&,D?" D\#eB0~HEBP/ O9)ı/Nܖ e58֋>8'sQY=s1>*p^.lhYv=#Y8"%ވ@$ u{t_Z`Er^z\Vlؐ܄l^&?QBdžO&yMNS y\¾H]>97 > Ti|S^f XRH5;QzRd3 9hc@#ykXT$PVt#pDH~5+jDaoV`q){ Lゑίz MXkL47k"1K 8mf U ã:Dp5ha]~=CHɝ~}?hb$w2(J \(? ;vdyoOBYeoT7K.sb>Zʘ{Idxkvi+tV+:l'b,JɛC[?_/Î&:Q휟9W3v Hì+Be!"k=VPEBdf(>"Oδs27AEedkUpNq7*c;Co mXjt}-?XrizkLX($GZtbLVh 3;%|9%{U]0ݔ?Ճk %U[.]$^ ]y^OPgCwoX/ q]þFyXekc.Rf yN ,UOfL'9ܸL ;) )*Y?BipZ15ՆKeh7#!նg [G\#W@HqCvz3s*iċʔG7t/YL3t=0e\3"H%7_!q5+څܒY-Do9Dϒf(49>tLb]}E}E;:쌕)gf>53:[_ y)?Ou^mWYE+0[ '.Pp7 z,8 &ɲ U/T S]뒖^`O):3ؒ77өivCCK0.)Sb1;mgLe -xB >'vJvwu?GIu41tU,#9Em[14(Bxg}d^At2|(<&ȼߏܽMgwM Ƭ&Hc(H ї`H?DB 81hba,`f0Psx1=)qg6@ G^#?`,e AމHxyrOI%UF*7p B:>5dРcR\  M$~LGGZrsegl#mlqk \|<ݸgZ*]A9ŵc׆\lhv7QUg48b:S1qLޗ.Ł8eD*;+Ips,._YەȃWhpTPܘjJ|ߙw5得r\H\bwal#_;7`zp듒$pu<ǽj}En0D]}A3P0H9RnG:XеTR^9Bϧ5]l>TC7c$-_ nS&~RqIc^O'{&v#5= ҢM;׋#I_UI}hF>6L}0gpD.:ςẀ%v3ּj`G&Va `bsehF"\+"|.1'[ÞO¥(61agHoE\lK[1&kY 񔾪_me Oy۪t}e}B Ԟ,`q.(^7ZZkYYa_[ uA  <F4??Ǖ);4%{%8S!LJr+kFYZHQzUL:{23&f#Q%dI)Z^g|)d!d*rMMV;Uwէ(:VNyS9DPv䈳͔fCސ])y] jE"\2 C߈V/V0Q+FkX(LNa;$.XaLJ!nb23ّ.ZA哓 >H"-5Q%tG /B+ p+cy 7*O8D"s_jcܘhء"w+£l䜡F[Q>1%RNn)lY]ѦDm%NɚceKp?' \#$!rA`O9 GfI :,?a&vnqޝH7U8f/c4'Z7J=/جij1;:dĎD9(FZsE9+>=:Fhx%dHңn+Xwɛ*Nq+sswwEijKw9vB% E)gz)V}a256Tiz\|[/^ -n_t&\"hr-rrU.>ʠ̋!yMg#&+BnN7AkM as׼ixFfzu&%-5mP(wYWo>#2#aܰZc:A1$s\_TLS~8SAлM1VT|!&OQV82#ʪήfcv /&>]j/a͐𬞙$4:vn!w-nsD ؉h6f+n9iR[J\x:riQ_pƈݒ8~<2q$62o/Ghnz;3/G_{ YXuҜ|Lv(kt)̹=sd320ЃJ$ 6孺-kM;HN<1/XsF^5 ̙ڏۯ5&F;:6W {l#|RmxbCO%"*V`0ƭZyt(ԼdZ$J1:.1شWxn@ÎY;/E0]oNZ4C&oIAd;,̋NfsAB7oTUn*QorXs+^pHDؕWRPv9(HݨbԑUWaʗ5ǘND($+E\qV$Xo!B~/)?gJl(8gVqU|i5&kҝȕJ`V,B'$-Zl~G}6g5Q%؟rq>vA.ZJz' 4F98-X&L3:yY*ԃH- f%t D-rJzAu.y|W/KŲ#w_>8icX5iȠov9uTty$y*e/BYo-\`1Cq^t f7K[eK|5'30L@zYo~Ar6cU)InຨLQe :&lܥm"{\i$ݐ ؏\e0EHKdX})&aBpPTN'E~eWpP!qJ4O =:mÒÕ?jDE0P+$ Cp|SpE!(A:1, rVahK_"uz!{DwY & ",AWN>J,b?,b3u T؝B]iu Uŋ 5(0Dkuvz5P͡lM5G8"."*P+iͺ_D^R\CW2ᕵTae ?ccF T/Ƣ*7~3EYLZVgoKt^^<8ߠb܀q}IF5}n ٗ▲|y'{QpOyۨ~Q^n17tVW0`Pm6a W`X%ܬZ7>±S?nhpPmbTcrd.*yq{HrHkm'8$a;y)#}hs:C57<8Iw#Fn [t-T\=s]ɵh˨º+-60o__ظݰަc%XAjLae"2MBSĢk3+ɦ!FyxPT +fPbW2y:1i3ֶMt#z mEHQJ7%z_k ]C Ak%`m?=8&Oou"TW(5G15%v H2y[:CN7&[8> % wa]p%ca;"an?[φy;J3ʥSpqSPpאy ktD{Gx2!8`!i4mbtȹK1i&ÊUS:hJx4s +ŴQxVVBړUDW9vL: kQEJ3;Ptg6ZJ΢Z_*Y{9ΑU}\, |۟(,ZC,[T~ngpfYjٲG,X2AUKʓ0y ɵφ_m`ZȬyOsFfqs|iڬ/:0I$z A_IC8{;7וds-:_-}|b_i=ZY1ZszC~mbGa)-$\T% YʉSdMti'j2uts0z;&Mmbsrn.;Z_(Jj9\^hH(FZ lp d$]+$!H;#p/^ymv8>Ea ܰO!ϱQ6~,Y/G?ݦGf!eQy<ը]hGweOBqnq˝j=n䘴aN5M85%gxk& \HB82ȨNvC9o,tXcs\y^.h@嘒B5$ZrF V4V ܝ6nB9+3 qLMp/AyJ|tԭ}x{F/o&cCǘ5#ؿlռ3#cmc?211駗y)+HViYisODeGIOQtwKD"#$k;%}?\q_CIU<]v*v@]Sk)MBe85U-^)+2M"p؜b X.Bp_/,Z1^ylg+b VjoeC>_RꭡA/ߔj&bGt*D &x .qw%,Y?wDC9DOWD?=LpeNRl[cԝAӫ?* Ӛ ɓB<-]hXSum 'BfG$#tz+wYb"N ~88SOh3_\mv)rvZKfc .:wC`^ӂplCq`2y?}fިg :xl$-kM-Ѓ`aLFJmak)ho% 'Kÿ1fsItnض 1&k q$M.MhcvmiAe{*Nء'סI䦅+dZǿ1ʾ!=a. 24: 1ՓaG)9e1G>YToĂ&=,"^EeBK42AjK~w"d]Ϭđּ,Lj,sHcAȞw]J"tVdy?E( L*!scI x5'@lR;)T *bXh^?.j̰5*ҙbvV7LG=WGB%esCYauF ώ S_痶̛Q-xSqFvQ=c -8e+*qYC1Iz\X,|J9D= I.(A%^watTGG;"<$aJ_0YX\A/QSZd$^cTN;`-oק.ч2Q+ncIqTGR-dlX+\3}0mVMGaqw+hbj$"Fısh@D:۔/99 fDE>a4 }ץu΄_֤<cdZd AT*12pނ]&c2 Kh f@'ȌGnЙ"-vQC>9pTD"tncC`XX41[b7e]4&_`N* kρ̈́]a\xyECQ\*'>_bř#M9YRvfdLh$@ āEDSO$1Bb4Or+w\̸2@rǐ;q,(.2ĶMlGRF3J_iOEp1=sR> X:EIb!+Z69aܢX5a?&4 qkLZowZl3X.f6&~\ |fzE<>GPW4k?}tj$ 6%3v yQE~ VF[ a h"jǤnжj d[,d\9RJgˠfmq٢5EHU K7XG94.6o]b՗b)&Mb`mZL8+( 7+׻H4͹4JѢFA^ןF(Oq(5ϩy--eyO7Ci1[..f؋J2ׯ$Ld,em, E]?֑E~WjX;jߍCHSNLv}44/s[Z>E:.l/Ҩ|a-|);\ :a'&PNxmɼ-GjO_לk8aU՛ L/y|][}=̤"%Zsگv֢$gڌ7SqrNY⢂?Yt޷$̴BD8,DCx8UۃDY]J?yp-ed^Ua{ѽKP]Œ%>ˆFeG]bRFY$q"u7N o/> 8."ፒ b诺)Efs >bhŗs|Y>Ioo2!e &=p/N؉AM'W/.DY TZ;^C@1DL * ٝJY,|ELUYTzi=MZx 0ELH`Ohr1;qO",\ɍ\q,P)&jԗ <#7#rgH,2A/ BiZI`.-VC:pj顁|ju1԰cL{]Vv y)LP*!8B&.QA[Ԥg12ն\TԘ5ZX,N6+ͬ]qB|J ٚ 8Vu+7(u,\kا"d.l|.՗\Ybq[cٌ4Qw 'emSus2L(c>| ; 9i_m4-E8ܶM4H'r j.hiix|-:_#~J5kS M-_+՝d -aw?r ͪ s.'aƙv Em0C:p[Y \1Z x (d]Rxr T$$PjVZ^9*#H㴡s! H€IeݼH;  Кu,/`XbW`e<8%ήTǬRHG p ŵ3aa8ē]c)OЁ@ 2btMLm4㏔4dZ"U$qVKJK9ɶ&Sڋ.} Kе")|R??2]C86*.Y.-cnk/!KTBr^JIQj0d1U%wJ)ɌWq "q^;!6:e(EPحP \Lowd(=DP *7h9C/IV+ļqP ǴoMe3RN֖}OD+%hVV9Xh`?8^SqSbI UgI"0,SnHzmi:Q>mnOr5F x Bߜw7Xz {ӎ:DU䖾,'+ӌlEL4Kvs'N|3_H#V3~Eo3# ]ܹLR $+*ڴw~öĞc BD |a<*de&6D68F/2}c,pC:2ޗBXnO'ɍ`$˲TT$-"h+Y?edI=%kXGگ IľQ=nj-.muGyg3Cl LK[ lQScBߣ<|@U'4m->\_Ϥ;+gQ8Qƒ&%'$ &jnH⪆ObK9:׋cZIB'&H\<˲'izZ zcx|@7.B几XkGg#轩ⰽ́&ũ̱p3}3Anx9@UݨW=s%Cf.?h K4'8I l_;>ь0#'{vEp>|rhܘԃmC4.`9yZtpڑ%йғ_iŪ饙aeU6/v{#pq-|rnM%_Q~Oݞ# wjzl~!f t78c AѯƑPNZA4_X40+hwpeC~F~OnR٧\->vXĎT:@FE Ɋe/n @2bt=NKC HRµ !`4+Q]6nWC”UdGхE>BÑXޖ"J3ꅞI/ eؽI bL\RmC 86-8ɕ87d{\-Gd S+kX&K{a9gkEq#5>lyqɇvVXBdv 0"'%D2!Ee.(簃h cUd)2S5c!3L{ tPm=IpibUcv%:`4xUش\՚xBe+V_[ Q*!DaB,q]\.1:(d"e ~HWϖU4pK+Jt~H+ՈCF*|̳3_-s6"e7(jj.E`-E3_3`؇ދ" .&ug=\mdg[ч?H,q?|L%LH#~Ә|%9][2ؑ$+||&bӧI/񂍍z&LKpæU[3ǩtW?ٱ׶I}D%}΅zR6]\,~q%{9[UH3bAwY*Fvp3Ɍ]E,g5uG|v*Sz ;QǤj*2b ~GKEE.C!%vhQMvpw+yDC͚4$ruW !Bj "`-}rA.?ʞuՃP8+upK,M:H.*9?hLSW0]l3þ"n'ؿi\6 kHt|-( !r.NLkZ Lk R<Jd99":0U9>Uq!ױ觢m=M↴Pj9].Ew Q7+hқovb8vOK:_7H]R5߁3>C`oGR"|;Ӥ^%<60Xk=S2Av+21u(f]*Nuܪ8ق8q!#KpzAUA%6vi>ZW !pN.j@QZЎ!xӶ"j5,WϴpNK(`T RɝW86&k͔ Kl%B2.3X4L*-jHb(La^)&[9x>헖),+_plگ9)f$}jIykSGoẼ0%֌/WFtCJ$$12,qmW)6kqfD-j"yN F`wMXխ+(kgTO4 YY-Lˊ!e(@y2+3>>ܧDC6*o[ycJoDr[]چL1)&ٷ쟬Y<5ukD">;bꋫ"b4W@Z뚂V@w}8 2pZw#i: Ejq^>eܗtdW؋`L!B0{@٦ͫ7NôXfMv\C<":X rA[+]sĵT3 R.p։< -UaPbW4pavߝ9RVe#{effQz>{w1ؚY>?U,!X"Lb41jQB\_rJ3/r1NfotЅ6QSu ߔ<8>X¬S7Ĩ>a@XR.l!ZxScՒۃwҤK8^SoɆdo^ES6g>$Zq|9BGAbHVp$̚u_fsa4bߡ'BvF୹{GbʳF%0=}BiOLè6388h'J87]5&C|0D{iIo>ixUb})Tx,q,B9ʌ੦3uzKS CV((r~HF|o+\2M)ژ[L\ 9.}Yd^CaGL䭜2PʗƠKbNDT8A 8;#%tR~#ς9rίikL -DʭULaO0tG 5)`Yy>adl^EcV96FVXwLtWiPJd r3m"Ԇ]|t hRi%e1Bp̙QǑPQQj6h!> ~d"O2]z#l]θ,Xp ̜Þ86Y5\]"!gNsO$꧶@Ma!z鬅L0M"ډ].v|1St':e+s薪Fay\u ;vMn}*n Gh7Xh!0Ou֍))'#hcٳ\"xa!tɎG2wنŚkr\i||M]-8 7-FA/y֧ qaOӎlPE|lXrT_4u+Ǣ孊9,e*̺ Iҙ_!(2 K>#bkP*]-7c`!jF8J\Ѥ9+%b[}in Fj[+ٷ"a1 t9qNqpNubd~TwDe'E=0UI`(e=4 $6cܴa_9H2EDPnuKi6ϙ$gd$^[`JJ;1 Չ}'$1XQxOijZ"*9{aЁR q8熃"n,/XG'yBah'-VH/::H,39ml߂.(lG:]@J! 2t^s ؗ\aTZ¶7 W =9lT1w(leO\tW~*$dRY+u&38V6>l30Cw5Lݝ%׼D@ !y%2Xv P dbQzK(>sΡt17Ȯi(&:!~RDW Y &ȮfEkj@((ema> y(m0.4ڈ L9Tn] ιn=6&=$i&x\U:l_&;n85.DCXbopwJlT8 lZP%CA7XI? ANYKFBvese_'zdaaߥmЇdEV00T'! Azk03 Xhn(cv`+OW5Z)5=.'Er*3:89LFtaaF?/0W?|bXNjPd0Y:$9AE]V4ufR9?P96l?XwvT.񒳹e&֙5ԃN$!!: DMѿ?t2)qz(4Y{NgntAzsqE& l[A%}.Vl}/"^) %g]pE` 5!"͚s2ez S4w˺4) i( |$;Hm ZAZLnH͍963h~0umpٍwZE2 п}TNz{R]Ezˠ,Iy3scFr vWM)mUnDyTk /l]ulH#@!H2n^)B:oOBMs,Z{OfIyY=`A@jٷi?tRLr@-+J'uFREP9t9i/lh9&wpfwN:~H;VwUTPTl/5) .y Uwg>;$:签} Ar3]ƪ\ pXF !%S5y U2'fQ3YiQT3NA9U}Ye9q RL/ܸOp']E#iyb8ELQPKup"i?0w!MsH؂R&eӽ\H?Xw9ZE{,IpͰ"Bq'8qvk mADm#޳sI3!3]6) xjB= >6|0c?Quu t!bꡠFlG(bJ=ٟ+-{-eAe1˔Y#0GzN aq<:ʻf}d L!rӟw TekBvD/6}zn0W7BLǢxSgFxا:^M^tA qq"ISXzZc2y6^vcmg&,QLb)T첌'ğAgAJ3 s;jx*VyfѦdmP(\?ܛv0зʰVqq~Ws3T3b('d~Սp:9$*OQ>Hgsc3Ew}=f~,k"|c3fnF,n{fE gY/gHB9:Ouw~^?)H /#-1 >\{r( !h%&a(3}W!dW` ~$?U7Z\+5I껅탂9n)y0Hi0"vD+ [z @YXw`lOGm6E 8Fcl1Đ[,,A;KUB̶N"糘M/I:S{R@; UN5^bʹg=IB¤|zc@}1jIM ~$kt'7,dOnΝ}1eYwo> Z$b; Oˑ+\IaG(Yl9> TJUPlK]NBt֩uE|Wn8c^"`l;,aLu?"9z0B{L8ބAwhoLA0vGRm2t^C,d4x`/j[6>Rhfk-F=YI!"BU 1id}엎i h`Lk--hKSȔouUKY=HZӍ slT͋ &Ŕ_mۈ?qC\S1ʲZƓR\Igڸ%?0uk }Ҍ*6o\k5TwPBe@/*d;BǙ}$Cet(- t񎾤{-xx+.B,5kR.|Ab(At.a"BTQʏWݭ<71Ե +(]~idQui?ļc0W;â_vb-8[}muGG|sF8/tߠmkƝwp!LJ}Fz =LWxј;cw[XPNw+Fͽ"jn&- =V~ Z^R.eBLo"w r]~s6QԴĵ`>_%kG,&] Ҷ:s1gb08fʋ h{zhP2T'nn̥u9b'F3nq`I<:Y}kpL8Y0' q -q=0LD7H.By0M_+"NIfM,gd2]˃Cpdm^1i:bmtьE0.ͨ^wMq_̱Қ|y_Ve,/R##&Um %["]<.+ZJJ?3T`]=eq662!y]ܑ߮a(K )j>brC,kwN -W;:)\ $,Xi42#C`Sf Qv`r2f_.l üAmBI;/4N`Y]yFrz$L) pZx-|u f_("ޱViXk;6Jm-Kv-x-l+FXz[U-' r&d]e>)~%O-뾛 W\cW#v{FOYiC1[RۘTeZ[4q[7O>a3tv*RٟMVO/6DiIjJEPƩþ6.\z,3Bnvd#;H0KC=͞$5Ab:7"(O;|Nhw+FE08<VB3 yH3GLKяF F(bhV/g JMLZ俒A#q0A?<ć98-)B٣e'i7gv- 6d91STHȂ !B쩦 fվu:ٞc:;"PVr9)d )qޔQ1Gky]'UOf$ #S8Ή,pQ*:,qceIj?B,RMGpB( =R(ˊ褼,;~ڽs SR$#@ AuцObSh L>\K>8}tp:'=2$$%j>=i{Iϵ֏Pwoz60ݶ=}P8DZدE;^JRD75@և6C sp̠3K#Wfca{lW9k$m>Y54| '-q`jy?%.AI$'׹?ae$.}2e !Ӈ1dPgwc--4|{{7%ِ7~WW?^5A+1Z&_ ifWP rB{h6xm. H_1kWF]Fe п䷅M>Mwn\^oe:]f7ae+$*ir#xՆrѨn ȄP4pTe:v"N=CSw̗eF!!<9̈X*8hba6GT<"$ Z%_en|B H*XxX\3=BA_--$e'Km7aG-(1|(Ia0r mYc43V~LNC.oH#*VI*+lAkI rememNIl n>vC> $y$j$q%p]ˍr |qcUkHr2[faރ1w<.:!IػGBVmu5r8Y+UBHbWz& 9sߧr!:KC"ksJmUޫ4Q|?A+)ڵ|`2VOccy`E%.:Gw# Ӣ!"oJI](K8BXЌ;YN0,S|Oqu쐊Wiܬp^õD2&4 hq++ MKu>C>]EkǓ!yc?KH `3;p~[z|]@$+kᯭh}2N8u YطٗS8_!`T|{k%X,sF.h!A!;/@[LgtKٓTKq_(s7ߙK]4AR*#Yd{+ډʮLQ$OhsD7O|hʠ$'e;x }[';DPCF^fsD;YCd[hI\-[Ւ漳#͵iGPb%2ȶFŮա0`Pk_6.øPhF&|Y}f`b2mnYA*beHYLK JrJKw.zI,Q9/CH!5TCݬY[p_j#RJ`Vn2|LKfH-ES 0Mdn'"L-]〈,ÂHfGN?Z!.$C[*sR"hx*j " 9IZ&HƜr6yǖ*G0lwD"bDp_- %(Dce5&>9)5GoK{=iw[ɦCo!Rӥ|Q.D wu18γCK5m >Qu>Wl6Rk>I 4%?h˙NzIڔBxNl|H!ldWjB\є?iCG=i'r*CA -fXq!-RY*N须4dbL&@z>pZXrT}dk" E'&H4EeXٺ9mP'njLYA47+,8 @DR0@ %V+\2 ښN-(~VDKT6p_nTeY`T4\TF?~[%0~|MkC]ns_@~1s{cZlŪR J^ CxƶJ <NMSϖG:aILL s)y_VTa-GZ L8#" 'ƈqEeS1L Ӆ_. VD25@t@B #{ӝ@9FJ<4掜B;h" Tt=ّ) &gmlai F 4m],1AH3}Dy)bzydcPH{_ujjV:_ Kܹ'-j"H:&u_سhx%;F.;dz6tT\,ymKS ]ym#u;ElqX Qt9kM۱ mcLl3&bKa86#(KY_YAKHrydMN{ Փ?Z@2ßk#U2m=i,)UjuF ݺ ߤsgi|[I }&Ao!8Y$?kN_:D'aUFⅬQ8HdCFZIN*_.DRbsA` $xŗZ`?O$$.qn+J_his_ b^)e zbLRqГc9a!UQ,HVIZS|F(\b\;32v֥w}aŸP!RzJ)9Z4s.HˋEM_O&Έ.`YS=&;Q 1#kF(WEMPLJpںTɤM!7ktG>+2`f gMme)ܝj+qmnum>_/xWEP&pnh/̃O4U\ElHܵh;JʭϋO VzѾZ)$joX.bR%Y6ZEڡ<#hVF(xUީәmMB~Jyw'd/D@Č$,GQ0Sd -p OI8d,$Ɗ&uuI}-/M @*׉jN^.8s&+.u,$ ZC"A+C:d)p׿lEUi6QZ/|$5Kn'vFT|铮vyR^}+I^U_E{ souJ1o(Y2 7I=bchHd|_BV$Kq6&+A\OS!%Yn ͡CQ(-Z90O!=pZPrxfTNRcWſ8ۓӫҢ'pfE񣷵֑D$j)Ap1\l)4 Ӆv"2}j 83bH;ЄAl?ə rn8ugB!C(]ocXN/kߏӛv8ժK-VPKers.R)M:dʴ_ˬȴ۶U}$*"'e#&Ej{kqՑ4G/agXNҫ wNX/O<[=?W.;1̨Ց,ybfr⎷[03TR;%i$V~^Lj 닻tz<~FƗd Vc )X**r2-8Ƭх-KUY2ugvȆ,CAjR '򑡌Vbqh&\4^ gFoq>Y޼]LO8g44f,۳BޤcU\gKT}4 %=3: RK`e4&{r4-o$tq\b BH3&Ilgr%t,;cH>U]]b.o"ІXqBЖ:%ö,"Ӛf[KݬemlBٞQMxPEckAp#D8v3̼ 8-PÍv>LQSqbHb*N?m~_Y^v2$4 $-+GGƒma!8LFܶ3tYJx̸n JΣkfg~?SOk,%*)>wxO_wwuS#t4rVȚ@㨊 &P{Y. m7Pm^em;HlKhԴcH=)C!RxRrT)%7ŶhȖ8x߶nϬ$ ؈lqzG9Z>mܫ!8C#mE y- c$nj L"pQs;Z]8|TVQyIS•R1mg9@{"h2&N8ZڙHwB-)\j{Pjj0lr Iy1rlhMDL4KäiLZ(YAA0NibnEfs/LߎB}֜=_4KBmws MARzD)"#뤼qc&YqWة]J`;#6kOo~~yA ?^ ۓ-yE@xj~*XvP@CB 洗'bO1AFXP\fH6Xh+OEdSAVU.3lGCCz(Y*vhKP^WÔb%@UY<:DSɈ yBеx.3#߳y&m(m)űfEuL:SVCن.f!D<)l$LI06DkFʫx-Qa zیM~O=͜P*}QYʂ~j#5$]Yvf5ern/9~  NIiZxS=Y2,Y0'aXVKN e!ShG%| !0Ti?G# ڌISrhƫigAp&d1sE椋 YY6{M6 /Cq-M,e$F?N̡VuqsA[e4?m_\Ea ,I)nR37~MKV$##|hyfug=HÅWu8L [T7#.]C̈́Fy -k"s(eXf_&IpZwu*u~MgCOM.kS=>p=XQc`lHb0vkײăHK0Hu ݺfaҊ l]i8{I :++r"UmF Gzb$DE4i{ 0 JKqkΠ5Ohx$*VjT~!iEj#c"iZh̍CJ7X*pVʐo w7`q=<ӫy[yA ޫ3rMTKA6gȖR\Ox( *+ $94xoľ)pOHx#%A9U/ ^.]^R zY?Zy^;}љ˩eVf.bn-AJG5o3tȿ?#d6rU+FX*l%I.`L>#] W'ȫ<@^-⎨tՓrdhJ4-yX;&[x'-5"/s锲*rNF@`E8TNXsj3ЋɽDZ/5eP$nfr4"&nhNN۽A \hE +&mV9X.Ȳwҍk`ɔ!iQåp̪0%2k.'WT`i' uVC|_Lf.Y$ W\EhQhLDXQ,m.lotXF&7:PRzJsZzPD>1[Q ߨ7[ZA?eYGQFPr+x_\aנrnIP0Bˎ5Ev [t.j8bD`^0׭x/`g4} Nޕ%HkDkak.ۦiIF׊b̽f \i{+ j]$NX@ qQ{ rOg5\TDUKzAkĻ5beTt19A¯JA O<>,՜Ľ5sJ;e=jzqZIc>W]{m^G5<{S쓠j` gK ^N\t 6tegh$#c~_s& sLYyAC.kܦ ."ͩwo֜4jՊg?i67vfPuG FktZ,ciT5 Y?lGᔮB=o!\ 壆]8( `f.@a4-!$d 2ȭpi$f=rPi儜%T#,I[ܙڑ#Uk)i=K %hǖnFJew]#`}|(h':w*GLTѮIёĩrǺozI;Q&Q~:xd[hF3^CLPmȑTx[$\xqlVtîTfAcr۳!*$̔`CQ|_ ׅcQr rS Lhoa,r0\諿ʧ,Vƿ7Qf,r Z[a{f {S,밌 $ޑY@$쐎o)U^C3~aGoˢVNԹxy#) ͼPm${g k?-2F2pR>ɴ VLA.|ܭ]Ϝ+}>M%0xpU >e,-expWJ? 0X"=sgjåbvn"0ݬZGaUO'94!dM|(v?-;VߺϬ_;$ ? t#|U~fNpW]-3@׏d%bH _c>7V!A8L,"lk!7q#t68rB>7 /Nw6"iooF8B8s;L6֍4Dav!Mbh87v\\Ddt;:4 &@]hHơL0cg`mKpʳ%gJ6 %, #9,Oڭd+ WCy!?GӬi<2ůQIo\«c:g^!_'V#%Ӧ\b<pf+| a{%Q : \ӡFJik9eݫ[Ǹw,þ?6":p9kTv2`C0Y%]K4YgTǭ iIepetb{2 .2XI"ʇs<2 u~ع]KhcfFrl7TRHLg8Hz fԼ77CJ/Ê{gAok"b?TNq>s(sk%>$Y$:K$A(vGRΊ vG U~wn5E!/"EHM+`*ތܯ ]0G 24AB`\8$JQYKc3 ݛbXaH&n4NYG\%QN"SFc;UY4.iD[Dw1$G/0玳n'/u踻b+jaVQw!ؚUj?4ټ6Vt bȹg w\w^da; Ap6W$gϔ.|R{Rb4fX==&h?SvCcynЛLJ1Qf<RH]&`x?ZNb#'Jjteh]}ņJ۽wd6@W̎+"K*umTPrku#ڗ1 r"9P5 ʌ #}Ẻ!|a-0pdpC3i5nNY{T}F#Y %s[v!կˆx. Lnz |q3S2/Sn2=͠昮1] |6+|ǢMok8,SA Gl13.f`[EfђpmpA0gg5a28ŕsɿZәEm73r" VcDnIdMz* qa~p ,79$V8",@8cVFJAs0׹p]g#;٭[u6Z:7vAcV%d~ofO_U\<2K{t">#H,D#BYZ Mk B}Tx5gTa&0[;%Lppf+"g>xmQеDd 2 +YVPm^vSXjL.}a1u0ХTAFQ .DZe0U!#`YASf8V0l=4 /N&=#ps BXmi!ABZAf1\A9 Zg2w_h ֌Y1]|c6H7ð+)4U%m4_ATQy5|hp!;+jYEl\JeK<)檎(bҏl5Ln"n1I ٙt Cr_tH6uA_D"_i]tNg2UP/%Qrap;-G *drjުCOr]l>)/HnwGK^Qo[%d!& dked);# V'Vs|RPD7Hmd!w @5gÝ"3}rI:#Vp8D Sʪaej{_ynrXʽ&i!Ny|~՟MÏ DsoL cJ9l͹BH%,[1 8Z23AH@`b'eV:̿Ke-(ᓴʼn//Qyw-wb>gK'1 '#: l-tֶ^ܴNKQd/`쀞).QsasAf]rJҲ!"C&fLW 0o[ZNaċzYQsikv[)ZTڳQUa^v5aᰖ+waH+\9f3-xEyFtp!' 7u:p& GQl.*: _bˆ $ơYppr" ̜aXcr.Vv2ޓֿB5CS<&oaKc8z4y 5*ޫNT p2S RPό(ו=vPgDn#jaV'>jY3OW/7eBj4&FbM2R>}GƋV4Lg4-+oQ4MnHwM+ք|`P;+m&Y|="_DVlGfghUh;;<^okVu3Uxsr^_]ǞR$cuQ<šdiљ4kPv*ϭףL#j\M7[>rfHIGDR9ƞ{i>cKM}ٞI NFv1?+&wXZjG !HR֒ -23L/|&gT_:qᖓdX ȍb(#PY4Uް&y ϨN믍],Rl8fwH&C2M_nbJ<;z2m>HtA I gJHuj"K78lTgo{u2kl$^7ݴ&hmO"ۆ Z?5`vDo#S QBB=fj^4ۼGp^tU&x7<}NB͌\5(O}XlFS3&?Wէ(4 ]2浙 HPC~eX|r)EQCy ^j.x ʿDoi1wj}T'Vv:* 7%OGڴ'38-C`-03Edz( x|9ٌ:GnYH)YW[14Iq8i|'W;y);0(3TeWhvCW_>Lhz?v74hC(BIJ4+KU)1 :JAhK ] CB[_Vʞ ?ݗ8}lj<!{(4폸rz<# uaqmQ{Btbg/*%wW,aƷ~-7f":5*N@lÅܿ)X1bd{ևI4nWUNnFeۥ5ƃ/wr02s6#.C ~=! X0f4Wl;euǖ؝~UW{퀊3byy"b"5o/*1D-Cz[| 3!kz 1)hE]d8YU.W# j RZȝO֛U|e-J.a#2ZL}`T!5*r-_uy9zm (FB9'=zOb!;v͕atXu\F* KYǂ aS3z_W(lQ$-bSpf o*0V/Ҵ̣h5uC_Y ]J%T M‡sIш3INTed*:Ҍ &xf3DkqHj>W/ ϣGC " qZf|(oCL "hKY#N3/"pGw'#UWÿ|(˃Lw++( -_JllBE]&U6)f8z<+R)`ji:E%)' V,,4+|;hPZ@[?ǫXGՑ"V|bPqxGעn 8(EH@#r@مe4#T e348D?Ϡ{uVB-E|t(/OװG=Pa7)#uH0țc3Fw'}n()^kqZCqCDk?zNwOqeV}F4ܬi> V]1* y-\2v'_Eh 'Df]yzCpg!Q!e'U3G QF`VMy RsYj=5!H= h1חS_uҋ"?;銫 t/<h5iXt}VX=Re~ٱPfd4z))*|)|nc2̨,fAu1De73elE̓ $^hy+E5:2R >gLtozD[f1cƔҶq/M$"jC5Z6lCl5wԌit%wdK!-ZWDUtBw6\)ܔDPyz&'YTZC !AW}hyH78ѢePK95тH AMO]tIeZ PEuz$\D"(. W}7.@ݜH:''1TGyAQ̻S4ٿIVoDYc#@ ȥwX^$E3+EY,A4=b9v͵-HvH>pb +j/x>&G,R2'l!k:l`K?h'6Dˢyhބ>݆rl`VGOWѡrX򆕉s% @"<7RFGÄc}ߏ ?pG:dxEŘ3NÜtz%ejT;Ļڼ'gDc&z_ >?˥jd}> H\ܭ7ECZi|kOy)ڟTWEd'D=s+.qRN)!PAhpGthj O)í!8Šh~-\MSsL@)gJaGY#Cz;%jJXCQouLG>,, 28*/87kY+$]f9d%+~E~L7E']u<2;R(3O*^pHa$ȓXpm^J'美cW$:!T6;K\!>E`yr%s6͌i>T.p,zUbLBgɱr9Hm/뭩~^)ɤ͉&2E }1[" J03YD3h$P,ѢGk`>GUl:wbczdȪ~ii(c ,BÞl? -orH GlÈ4>zT(-WlۗR^YL Z@̥^vi\?-Q( HM@okKrHH^=C3Dd RxRF3` żfJٕðLvg_)ߍ%+%`!iuT-_B- P$T)V(* @""aAJQd@$I$, B(H"g{س/!=BdOgT,7b&2vxzL-11αkr>upX>f@&/QWx}tZDxu;b+4Ȍ &u|TMP܂\χusjCBtez1 |1l$G`̓A=CtZb6=A`I)8Fzo@c{"nQN&`;Se1:x"fFH^ 21f4olՒcXs1Dq|$@_iNW?ܪث:Ӓ4liOaz\pQӑgi:L" F( Oy| 1G#ղ]"s?}6lL ۂB]PZ>f:,,lcWC[ ݞ] 냦 vGe#BsڠOq "DmDlԙ2~#D"H!T#Ns{q#CVDEw7c"n.[s58%l_QAIJ3 PKbFC$R`к)}|J$4ECI HrcZ( 8Nq{n_ b8_?k HDƯYL)E:i=Q=k& o92'GSUF9fCf$>׹it)u} Ԗ@ N;qx/9ImS4i ~lE V@;s9DKO^e:X, vHNapEV8YȵGa@XUR:3l4p2ݞ/FUKsvF:O?v>6,jk|rM>WУwmԏ[aF疸$7ȡ 1r~΋5#Ƹ)nQc[5O 't9rupwJ>&# "Oi"S'\0Bg:ii-5HhԄ>u)Dpmύ,Z ' gttwTZkTrz7AX\BT=" TW:ŝHwN{u:N% 1WbvcBohѮRPs|78hqJ^gZYe_Glhq-ƚu-#4(@nK$.!HbvrO=\w'^|1: HQ+It[3X|wq8+)ldX#D!y\L3j"{N%M 5i=h0"bHG\f^WE@TEC"b*5m?%Ǫ,|w=z|Z܉ʈb.cFtt<̪pʏT&e;/!@O@v3pZJW(!A-Ghx4ۛre5So3Ǥӽ*+KBSH,Syb:(e[{XTxN|SJif~j^ښDZ~tH&uɌYCWΠtmQ ;"&%ZD, CJa-_;B#1AŖP,(U ] :.>ПǗI8C5H6?:y^}0 >N<{ݐ80ivun+Vzs/}}7ׯw=:{ԍi}OǽӧoU6/tH9޹ET{/97m ټӽzy[M^n|$}}aZaiB7s[ZUcz}㏾{>{Ow=}{{}ls#kU{u{_W8=x/zos;=g9ow }؍/z&>keܫ}{}Ϸk5ڼܭφ-{ Vջv>kmMU4Z٪+YA6ͥUfVԴȴTմ}ܻ- Y6[[-2e%ZfN-w:ꙴiٴ֥:vڵKnǻiU\iݭ;l6Ϯz/un❞t5뚴ZwW^\^5璟sOxgosE+;m.y=ӹ#7_+ڬny=뽺^7gms]׳N9mﰟ>ZKlYk4z`uWw|{g;{7|X7ݛzv}}>p ouPwww.8Jy;ӳ _]/{>mKݧW>{>s^>wwᄚ=K7<^re]wo';Enq,c=wվvlՍYEJEn,uNcZmIiͫeJY+clڙݷM%j˴f-&QB4̩t59Eʲ[kMma6YL6LjҨkek[fE]M*mnvvw82ٴmRk\mj;&S[vnAݻ+3.ܮ.JuQحtnrWn'g]nklGewkjq2m)2]pZuk%YNm EZdֶ,m]:rJ͙LmaF6mWK2nU&f&˭KcYVf#m˫*]5s7wgvkv[xesڽwϥVzmwv6Yzc9h۫{ːvG{݊by9׷V:=]uݖ6v=u=ks)-]O&Fv9XwvzgfWgC{h@ z:l /`h:[Jt [@o{nz @= h (]6áUilPA'QiݱLGPG_o}n_@&@L 10h&&F&i& i&L4фd5< PMO&0`4L4&LFh @ Ɂ &M4ii0&d 4L0M)24jz(DAѦɦ&@44hF  hѠhC@h@44&D4LLiF4 dhɦLS )OH$F*cX=,a P>7B$(BR4$ J@M"Ye)X*Qi,q bCz|00RM dB $) (ɳeJʥHYe(JօaV)$+(VJJYel$~8@e$F!I%JE$Y@d $RkHHBP4!q9?ꎨJZ!+ @$ *q٭伡HH""H7i I X}eO =֍+dk59XJukĮ:7e6imq[C%WH "J"D5ɗC0X[u_\-fX S)Q0U BM-v EG+J)(Xh)$Q$@dY VAE44 /,R PX. DU@654Ǵ&塗a|2 4fB ]Sb%bFB@@' H7(A-|tS0Kd/;k g ІP*@<)(DcdED,Y'3ʆ܈\Q!`A@a#@1 H6A6tQHAT(6& QF)D ꕤوmXke÷N(uDe8<>8CV 8M*:B!ݪ&hverִ ^"jp@& H8c+DC4 4@sA6p)4jhi3zc PJiݨn#)ʕ4ݷ# PPט iX[2s etjB @ @A!Ae.&R GHӉ"s 3JZd0i&\h9)!`Ŗ6&.zz Z-%Ë g)v<b(du†SȎ2EAqN-Pe@='\iHЂFFA Ui yhdր<+H4cӨ\fz(T }D:(|d=S~AJn䜒 v\%wgg.v.Oe ^SGn drlm"PGisnHflL2{}y aC/[NgL.c.Śfkaaha=>VVڞG^>KM{sW3\f9!(2 Ͷ]eŐHYkͅ0n[!`IB @B0`F$!p@ CK€X 3R Y׍@J#Pń@7[8qC:UL&x %s4BkB*L 8aWj26A! HZ@/[K굘q֣Jn HɐC24sPZRR8ZD3:bE3uYPh@D,K(P֣KMɨevCcbLw%E҄mZKu(ZGQc, Ȳ!nmCE6B#4T%i@(l4Q]ǸL/ދmQFm !0[jT+&0(JXQ 5h0 Y@ajҍe7@ZLmlq2.za/,4,T!1e0e톲-6s][͖4  flM*w*8 8dWn5'1 c&􃸍r\B%BM%)dxpz6\)JRH@@A A"rE^Er oTwRYj!AH1"B+ͤ*_!p b @OYC5"!dpjPC9(NfX *EtB%DДm۬Z0iB *PV*@(@:"_DZ@ACO{V4(&UA᠃H#`F$ %" A*!*T Њ eP9`'bocL &,/ρ?+߂}t 4S5ݩMRZLUS a(|2f^V4F3k~dBID4o%Z`j=N8 xDWpJL`J^f(bm܅LZ[&Uev~SqM/ Ps N9x`59"s, j`x^ mf@2Ybڅgojn5B`۳))$2J5zY@90pG` V+56FP(2 hdT)ksYZ˽ f'M l6͆sm[Y*nۺb]z#t˴%u1]n+8J˙(_2̰/Ŗft/aaf!E+H*5xû̆V ࠁL(*PaA$os%ݝAvbJ54E0bDpT`h*F焹 -A 1 LdJ(H#௮eX'zx8 2\F^$@;S>XerpF0A@!8h(/Q5h`D!" E3 ;(BA@mD[ ((-bveAmȂ(D:u85V-m=%*{E5TU 3.Z9Y侢!1YQ_qB.I1}9`.r]}R5 ?>l*jisuH1f'?=)J}e P{Qd. n,J=]1=c.1uu.{eJ].VtWߵ"֏ Mc  YX8` }*g S# u $L$:ʝ^DBH:DR, X(P$]wO" _TOEP}e@cc6{|*+.IQ!9p('\8$2QѼk~^+h{] qOT*J؞)~;6(駨M|4*`JWì(Rxg2;y:'|6cC2 EX%J zJOMTveJBZr9XR}v !`0XocC!,+ͯ:Dlע¿UfTB3Nl@Q h^_] R;*WW,=Bq_\ ʴF2ZZNצJ eQg+1Y:*|8ͶjM ^6acyz}8t# kNMҢKLx~.W\yLlP{BP`1B+ 0dȊ^!Q*,RV @4R$DB  " (H B!BA *@H@/ؒaECs(B cZޝ Bw֪[̅Ĵ=VEK$=D!+6^ j) b0=s g뇑fLG0ې>`/((h㰘n|܉ @rk h2U FpJy)  pǀsmw-YE-Kw@QcR]opߦV9wnGU|-)ݧ;F*)A`ïB[[H.zi)F6|]>/$<*oT6'iOctD/Jx}\WmXc7;qv~X;l1d[@Lo)$OwT-.j)CV}M~.H6nΞߦ|D U8L>> : [W=nwkyb(X,Q23R\͖4E}hm jP #h3_e눐#-;*TʭMUJ_XHJ m0a-(D!A9і. X7,5`f F: 4G;% M9yz6fI o K`M*c"/Pzߥ徊o1m`j ;&M T6䦶E[钕dw S Lٌu(=q( Gs&SDB*b-è 0dMW>?S/{f>0v!8%wq[4;CٸU?v_QǯvAL&[AP1r%TMTWuSz= <7W,,iiX5MNsWb=ۯ7%{is ʑ̏3k#ѥߌA~U :|IxyY0wʔ O9AǮZ|>}][;Vd>5pfH}NXL h$NwR$X7ccy[RRmG*rLRC̾;L+ X7~i-^\ޓ/J@ArVA{gxTl53$ #.{B, /iDz6;&%jT ~&9[OcGY~aSo{^ B p4qtL(x /Q+/O6d~jդ1ubi(ɾZ˻h|_*4~xٵ`ޮGcqţ)v;dF~C0`q;+[жzO18av{';ۢ\ i_N S9@>10 ` f ]c==TcQ}[,&k jkъq͛|PKy9 -^dlo8꿖 pܬL; sԡD/dY17Ì:dN'T5`ŝ"(1V 9e.  $\@#/GBZNcKnR$.yzqj hUcx;6@yHr÷h|03"s<ֽ܆GwL[MU!cN s/^O3 hq 4 @A{0c?H2H1 HH@$A$ @YAdDG8, J .DOkL2J.4`ڌI TPa H@GJ4 cI" ȤI"(F"HȪHȬBHXTW2ů%l(|_So"V<uB{j<@ ?=cyʾ\?EJ v?nnx \v,_IRͣv,q`yo  ~ܿjClW|ѵCQ;Ct,@cd_TДM,^&(0j{Ǜve+s{œ20ƭ3{ ZZz ?J%NgxUn4-UC ;kKT!-4N^*#:_K/p`5qT[.DI_x/1"|8=Lw4n;6e-wm=HesJ͟ôv]VFWެ.GGm?NqPs̍bl 渰yRsgs3YU:ҀaRܫ:çk)𘊎U(gi`cpG5UI9`8MH1r}QQgaukޣ*̎k>2>Mi2K5[c4tÃH:nWUzlrb |x9;ò@\ B8u;# =ӟ=eoZ{hO$qAҢJpu{]|%mLJtDi:%L1@]TJO OXrD85Q5RI𵪇œ* Ɲ[:AU |[-bmk)e6dB{CÓ,T50uCXYvO|<鰮7 |IjܺS7D鷥GF!E aȜ;OfBbv30}(=tN= $d 5xcj ǻ:ŕ8wۨe 鱦 {jjM,?Ň#q:D'Xhn*$6PA6R<5j˸Rfb(y `#,a e¡Tbe3Mi8 GןW3ȆX䅒7pa= H.D'MSlJ&ܿ#-(bgk;!>|WxX#awj<>v?FuX!= 7odyn l8ie-- e4A_8/;b+>;Q ϔ#'Q૪CTK:\YF>y5Q8SbɎIV,f ֋0eI} [0^vd, z9$/I G _SԝMx`sh$ `:&r׏r灮$F8 Z[3 -W w ~7ܰV|'l.#P'VY@]3-J1k;Y(nʣ% =dl9k" K^D <[ (iTY]#l}>V@@u5Kwgơt}jΚ`O)jjӠ*+4׭4 `Ƌ6sb@є~ J7HI֩ Y`#?+I>eyv@ !nkn= 7 _e0]V4^T8#jx^rb:Gb&Y-2 fw[`bA$f^)dk9*d H{ ?jfTeːۊ~eۍ:3I1;>wqA.^dSޚ/W[k 2.v)NG!YU[<#7͸tq 3sY;Ǿ8S^箣|*;y}\it-46tӝvꨛإCq=JsUe)݄V~#LuM>eK]F%sle$ όkp뚿$g=.ȩc~.=~ ObN2H8  *09>:1|VsNQGX=)U`#`r3O=qܳ Ͷ|'Ix+A*'=ASp3 C@FÔ/쌡>V=OID`e,'t:(&r{nAY[׫@vLve9 SyJ#nukG~qb(7Oe*hQDPI}Ŏ~Sv֪ DOOsF/&/oy|PQ~wYZp籨YI=1+sSN1o9{Ɏe| yzu^%lNrmu\h'/ |;87."qidp8z?V!֏lj9w %c^T`xXZh`P%htAD65޿M99ݏF.kXg"Wo[ShɂЯ KFaV7 wY'CĤh<T}U7t=,1yכ48B)QTcAm_ &LyH$vxHEz5SN {NRYGZ\ &o:VGd=<=4sڻS28dw?_=`pOw;/\{?KM)D`0<#ϷVX)G&ojYAis ]^ kh[y>hXY(Bu-~$q3=I"|;aaVi]M^ϧ=KB6Cjj4`}?jW Ҵ}oZ>8>-sY//6g-ttR՜Xl@sd9QZ#"tiyUz=A]5cjayђ^;o.+q,9r/kKϰ6b@Al; pm{ x&Zf<Ry/#WI.!7ˀtTD 뷧ђDpFPKI:`l, ?ﳎ>N=\A`c`p<K-jX`)QwN4nXQ Rx~wSU<_$'+@=p'q;ɐ82a{U=#i"`@ .Β60~FbA)EPBmix1 gVŽ^Ŭ~ ؖGъK >?E+zݲ.m,k#J2bH.J>s4H&kӑ Ŝ[ӌ5="* OnL` z-n.99G ݮ ҃& ^u%v;@)œ[}q)H*FV2% w កHuk0mrۄ0W%35{  ' 9Ӻ:xѣj'D#bv2œW$V H_V W rs`4҈MlN1pD\c$\~xuǙR NB R "iVi Oqc!R*5,0U,--,!C(`!aÙeB! OdP(PH01KGM~;~a?Km dw~鿉v7APs1̳Grp2ۿFtj)8ɴE;.OPt(yBUio#;gA^j*-~ ә]} ^HsDŽ'~> e8;6Z>>FM$ mS jv02ptࠛڮ˯&w;n]0]Yxmv֓}wPw|@9ɲj`~U^ҹfcvC5/b7mx5{ϵ$!-hkme So,D7]d4\Ɣ*w@*)4xD>gZnfd!׃U"G˝xx }ww.Ơf ࡖF! kxs9GSGA̤?S8 )!߶K`qdm섯5/:/':r@P+AV:̫p]vR@Ck7 qOhwttki#ݠj0%PP3ƥ}ENMDgm,ij]@!PRe4)iμH޴GxqF]q{Qh!~y$2QGׅt5/>tf"HA 驚W9׍OOД}k .H[Oxа7 XhmBIB' O4jgoJOpO[,|"+A^O2Vb*2 ߎp 8DqIwuXW&;:Q3Q??l{X6Z*d׀>dFs#* D)!N؋r,0c3p} ch=}ۑ c 绘HU8:&Kect6HdwPq juR;DJO =:`KBm[4P3 x^Zw,IǒekwvC[ԢrxKKm/uB4>y2 @ˍxh},d@0{5ǹ_K_c@}'wT%4 eRmoc2_2Y1(z_[[RIP:8(4y*2 ` {c@}ݚ5R!Q\jHTbyVXD/OrXz~, tprq#67H׉uHOG0'0d˚Gg6Yoj \ma?*:NM}D+eSonXhr8%Ry-PE\/ą桄;"z)׮|WԵLbJGj[~~6lCpDoĆou>1Ռ}0  H6sTm7֜ #C/ X$rtO FD¹ۦ|l=/ϲ8zs 2pMbX@$B!a!! 37-;'ƚOip޸}][?f/9?r@o$ Ĩ* ҡ~NJ2^^+``4hs;S ޙlo1.*^bw$kX `6HK^~j'c #div2,!%a6RLD P֨nbHJw)>f[Ce;Rʗ֌ñ4I"Ymnj004 {0H?-_ a)]مhF >޳G9UfgL@!0 {{*rBILIڱr/a .9JkYD;`ޙ"45v]ԺOY%/w 5Mu2JJ/~߼?GhC2g.}=bG0T@E:T,@T(7An!7D4,ml:y7/$N“ E oeKYtmsˍq%zy%O9ˡ ovid[+ETI$lP(H1Ih=մ;ȸ67k9P"c]FbGøRz(=8<AH_J2c Odh`ZfPUʪx?Z0p74vG_aTՊvJFVڢjxr!++0t$\:@ &Qc?Ў@ދ3"Q:VvmU iꀽRY9Th0Hr_< Xp?E&]6bC5. iXb9gGY9ګ ək.[<:(OY71Ǹ@50bMFɂJ[!ܚR4Sb8M`'eun@;@_Uz=S%_ wl ]Pv~%e)J R2}܌E|_`8tn3Α{qV~"e78K3-!1ݝ.Lیb%$c p&OOmܲ8Lh\qLj7{3 `5 1q`.2Ί1V1kC [su1]A#O#ƚRSLEzٌcӤVt0Qb`F uH06Gz*Lguk=y2 pie,I/(_# SВoހhTk#{$^ L_7ڐN9`oKΛeWȭbD6 ppSŊ(XǁOAb>v%cs!=!&^p`q'(viNzB!\`3>)xXmaTG~д ΙG΍:w&4-:#@]|0-F2V+ezyjx#,n&8)"E'堀" 5#^{:|Y5~ ߝ&ٛ0T|Ѐ1iGtow_ʭ-p~c~|OV*§??78R0 ).¾T^k@0j^69چm55!R{.eX n rOB(mDNNvFcpln z]ҙrZQD??Ƥ+KԔeizZEܻo:?0FC7ej]8vx}@ 1+=HxeQDެl/Jy"XZ5}bFwA]> C_Fg|SᜓGU+'MliQ;/[RF;[Cdw`Iӏ!WEM]Pk׉X0Cdy8P?CmHջsu$aZVsڼA toPo]7m "1z\,vOAy7l*Anu;.C+W(7[2]"LM6~2{&m+{v^PCZ8UC&0g@1G>0k ZA}bXBjms%ꕙ=jقit9Qxk3x\jyړH@[8MU_wl|+ۀ@a+ehA!i5jc.-;JK "" "O_lC(n oXo|_.9|+}vh3럡3qEGId[O>[];j4DuPI)du>р(;<ΡP,{#T ez92Lnt-JX㻥!hM{YUC ٟWDsP WIӰ `- BkXP[>&.!tC6i0j~X#:w|^OƜ7`3ݩp Q*0-[-~;>Cw#v6<#Y,d@D#UaZu()pTQe?GHB̗I]ɆeCt,+kv b>v”l}N!v@]FݧMhְ(ވ#e/BŃ6)ERS݈pP;".CDcaE ND)Liɢk.HOSCz/z6Y֖q[qc.+n^HQ߻p,ڦVžO -͞u{0O4bG[ꐋv|2rom]?ui/6EQ(m. X 곩"E79pQZtt額㩽5!Q/8CܵVT|Ae=[.Uk~pկ?JxGj3BcZm@YLަ#72-&\)`]BY,>a_ћEGpMl1nCfFk >OۋA).Y e[#oAƆF![ȰF#_sN?neT;ЋǂuӘRZA(bZՖdP󺒄[Ɵܫ/W)no }B*D̊"yhJk0Ãx9s0xCe ,Fٶ*tr-U/S<^+MS2b#[[VT vn'A+,֒^\scn+nlGI?b p9 !)B(A)R)JH@ߖ֛vm!+DCCo(U(~-6cñR=n+;yehqZ{k}}wݷ|xNjUB&22 s"ޛWD$# >۱i7eP#)c[8L-R!_hfDJ4nկWFQo3QJ_=nvް+ (<5̕0ΰ6OV+ee)MHWt%Ӑ o'Rl.+`C[Ȯēy->^wxpCuFC&܁=-BHk'DhP (?W {tt<^ϬnrӅj<1~VlBs@lZ¹z~YDᏒ٩˖ﯖ ~<| ljdƭj(DǥF6[yĴris:>xb]:JjFցHsLϖ̲pPXKlZV yݠyJǝE :뾽W7$xU(aU7|^OuȠ9k9!f i/JxPLlӃC)[3y({ͯ(r wI:̓w1kz/-TUp*k.WE2H=~8>K_5J+p`lِS;,[maxzGsiJj}VsT#Π/Dz>D!)+Ȩy M/{#z;,iL"ybnT0͠ʌ썗G@e4ϼרD#Ζ0VӜ ؛+OY&f ɘwFs"8G ~IL9+0Q=W? kh!Pi4f*K6h{t#}uE Θ?s6뵚ƶR__=nu,"vSIi{xW{Y㺷,l/V膅_׎lyڵ;l寒NwDOOJ g DUz {#`~!Ě~& K˙>SJyfmUx~H޻TVB<<ѿ7O}Y//R+bȵZaqRCC488Id5H&^ŊF_ھ54Y19ܹ h&Qr^0F>Pv+⊭}MpFi٩tOv.qy1X#¸J7&0T &>HV'@`K"ϓ$/ Jg%+  CL-J7‚/mٚЪjz.HWE$(2YІG̉oBrMGPwm0ٖ&1 l2#߿oer 6>Qㆋ/DМSK]?i +P/'NfyemdAinka5~a'\UW+t}J/\  I=Y[IpST낋w[@5U6Hexԋ F|J|HI"gq(0^oӿK aMy|6 N!g3ovB#z2s>o WI4!NMn$_sn]@'ydPoHNLQ DvDbgߕY@6+y!/ ^3<;E<#aϴH`|"14M ^iѹPuJ*)T eA @D@iZŗ~Ƣ?~\G Z˲z0[qeƶ*~ctnA`0%M!3RaI¤!dtwL*K˄g|Uv$5՜7fE#4uxxT MO>9Н90yJImC8ok!Rz+.X,ISxݻF/ӯ“KsjH&|f&HPnUݝE' ^W!|p14+ DC ?ɚ+%$b}ιF%trwZU'%)OևO` z} 1x֤:,ʺ\l0,6̋V@klhWY/e.zo_sBY@aNOj21 XI);=ylA)vϺ@|_f%n5ΤB+< } i݉G%TB ,hLiz62xzAGg(0Ƈ&یٞf^iڃY"L#%2kI=Mޅ_W"JĪb7K Qd t"Meq]r,QHlʺTtF#H 8b 6zgn^2$m:{= n(V|#$ڪ6R>A?:$ZuD#hNA0WQKk;/DZ}|XS{YH s5HmHZ(x{Tl2U'.Gkg+9f&f|0x(`]q@ȃr+4 / ({l  `ke^W ӤKr?t}PⷘX|?QYIWUݰsTxK2KD,rR{ *|:o,Bבe=X#R- $K 枂!fKA=# YrO_B-nO$Gl6h`:Jy.$gGPMTlao~ʑ8۽ A԰O֤e/Hԑ-fXS1-%o] ɱ:02Ipm 8,MH'=0ZɇU snKe*ӫ<¦w2fwHw9E 8۹{3n }d:q4{d)m ;`/I}*Lm1Nwz۽oE?fN|Nⷼ-etT 9^{26|w{o1Lꬉ$v&hsJ8D"q܎Q/Sr晿$ٔ'!BP^K]wI48[k+۵cƲRk,Q$zĉ,u͠ <pa'.1ta~*)S'pb39%dZŢft~w!#Gu9}# '$G]n siu P);F&í0z^U}ed15H,E'@7ϳJ k Rtп\ e&>H L`>Xٯ?L1̿&~ ux|2sd'0dsfH,$X9p8vQ H"V}vLȥTȟ|HA7e;1ѫҰ,b=c;vj(–օZ71EMҧ2D/xǪ>!i r *ב7 sCDBV#*bR .̿9Y/NM;}5?|ɦWn+~ӳEusmP=Wo')vaxczDp_ϙ+%+բ6;.+4sF}p$M`/gkS ovn.}no%`ow ]̦: e3UŦQ{} % \d6B]znD07V؃.3NZ,r|hX_t>eP28>p%ZPz {̽g葻YOq4y/;yh h᳇H,+ٹC4XXl>S̰(84\V}JbÒgb]I碷Z,-_ch3 P0]JS 1#3b>5o?IXZB$) I8W֭C|dA  ( 䥄cEƝ#ncNMT=f!g" ݓ [=NR6;ۀ`_ Z%{o09v6X||[;4X2o+L~'e#C'9=q=ΉHBC3ei6É;*@5;*腋_B8V˒ =@-`24&85⋲ X+9clH?nh.ZWRԒ!&p= q\&imBU1Mutxv.8_m.Lf!ɀ6IoxOqВ>I[?p7dQ%2 Ws(V*cpy^n@H9 dP*[{"C%8/}$cj$ TVtVºh^ uʂ:p^'mcݑtK\bX`H0M !]6Xc_ 䶲(W50|ӰpwΪ_ɧfUE2cw3  ׃ ~Ai!럫k7c Йܧ:X=4|l] 9XZiq =i(m[pҷŨ 'lVsZV/!vÝ@tE(nt# ʤ85)vBɒT;b;8__Z^W0%h ł㎄So36o7jC M흴1=I{6:2x*4( ODjQN|jnB :8Wc%du rLԡmTzzOkOEqO鰐7vKr* f̎AY+UmbkyMY6F>*%G c,(EIOYb9c 0Z$_a0gm}r:?zvμE&aN^0U%`cYprLf9|=4qU%hÛkXA58zA9ISfKӛ?ք9r25j1 cNA9"BGv9鴀0c>}B ZU!N/i2^Вr>mwڶyh&r䀌-\DSlU])TFQgnHԌ/]|rzU`M7G6]U ހՆ |+}8`2Eѹ^,r6{M-V>z$Y:Q2&\f=ē[ pRL8$4kG}J\Um_=fѶpQ'2oߍTbr%#q[7!R$yBz "pXo0uxc0C A"s$PpŁlK0mHBSRlqx!ȁIx{T<#rJ] Sx 0!Eox--'KH_'W#Z{,Rcb?%JȱyCACa3C7.BsV8r(=ueDc좋WaLxad؊b vRc ^.BC!RjhX%g][ h6,6{< ]C8:hWĸN>w7:޿F8S4;Κ7uMdwlB@?Cu] Tx&{iT(,x: ) uf:|"VϞw9v|Gih$p6~gRd":$o*~>-1]V3,H;:\VCk}h"@.6v.dI(j>pkxx6y‡rWaPlt@m_;_ҝCSfUXڂwN("P=qޣ5oT E]O @|qP8{0N"AD NRH.KxF]Zm-^d^I+{([a-OMnt 4{*qb}r țݲhk8gU IeMnKl%n<ߕջ[tw/,V۱Yn 9yyC `LCoE=֟j3AA|34ZP (fRB*S~~֝?W7܁>vܕtR>$,Z WO Cõo+*Ҿdvfg?ǨpZV=FXp Y8_-76GJ6K\bc>o=Xhr(_@r{4/[ʈ*4[ۗ/Y7(Dkԏ2~s54~HgD!5P6"ښBM .^HW zj!z۞Of

%1b ZsF=m#zvȰ&poׄ !׬r6c(^D #iPVZ՛ǟJT^Ԓcd]tWYrVN^!ɲRxaz[%/,mK P B !5F1&"Vbpg_`Zۄd%iYLLݨ <}DmØ7,F;K5{fZT!,m;ljAPE4 9uMc[%P7Y,OXې`?;}'PvxV}y=<PAF Ǧc5jrr&Mӂ/F򲏍ɳ;[(EYU]nq˗7UPWxƦW4lcɲL ^lBT1Qq9W\kGziaۛ"Dä0`,)"86CIAx)dd&I_iw脘/d4>#Aw2%&>XyY1hL,p!ҳy! 6 i;B^pբo` BuS% !@N /ۨ61%P@POCſ e*+^^GFHV;:b9wS}8-gsJ <J"=  R ?5tۍrwƀb"$8+B^|}nR 9aPO9;mo>Z:O}E}<媏0y Ẋh܊N*>NC?.DjX Sa% QƢ| cjDB B*pŸ0  @  l*R?P "?oJ `,H$1"0XHX*B cX (_-Q`,PB DHČ*A`,+@H Ab>۾ο7j_AC/,j\Hth\_d>*!k^t($J7y`ARzCu৻DAlV(Tm1w0@Ɓ4V"Y"7^DXK<D LG֬Z c[.aRugxbjן^J TĢE~($(2y6H"njBF-B X T`'%c .VMH `PilE?o{EpBU EC@gy9EA2>@̴xX7ufݶO-°X$PZ"`E@O*"'Bxvq9?+Uh'|;#.$ʀ怐PQ߂"!UZ bXAD,4Hs\5m[ bPi@z%P-XŎ}%%E8A/m[>БjPt EB H^&!*[1 *\r[uVDeIpxͯx[Y`)k5CΫex]V3ؙ9cՀ1Ho.%h+ġï^E"A`h_9BQH\>cg@C(CJ1S1z͕˽oi 0][#-@Z;񤦱NĘ1m[V,ZVU1yMD1yR4T(J1UJbW1b-.R]*4/BH` QU P[Z@ 6 AlUK BZm׿:L y;.|rsÏ:Cw,u B!h 9Z =7M57۫E٭E |Gڙ$ C,KFc\t˅nh_yo|<0,csl bhXƍűh4Z,cFǢDw;? ~O;?ӣy[A כ`T,&iA.Rpj VK l'8/ncG¦"NȞtL2<{1jb\\\h8f Po1,LL 5"zA"!@P1.j.Z&D4h6 x" e1 MY{VԸ3BW4ȵE; h a2!\&_E0w՚HD~ۀM b\-]@Xh@CDEJMnmrР%7 Yif *PD]1!EE K@`$!pp Lj`1Ʊ3WZewm>rq6&a x!KQAbAm N36 x7m\-G`jIB1 H+- DX% ,d =I4q^=`a1,\`.hrdh16^\LיZV jQlȴh 7S8tgC9hnEԅL0:a^x{,M3]Pub.jXs Y*B ,ٛn RW(2j(L3*ckV " +21Q]0A,40C4H/ \چC! "1ӂT"$.CyPk9g)q vED%DmƝP*x%^^^^^^7z^{yyzy{x^^%@X `,CL&H a`#y1 w|܃Jd*_^k5]Gf^)e~mhW¥z^7;tsM辄H(D[_o{/6 bpZ#qSnOjͤ Oo[P}WoE`oW 떼f:x} !~s?LMC,.d .mw f `|V P>,l Bµ;L)N%ua#<ֶ˄?E5^RxzOS t)t*E;}>2%J6|SD xb:&G͓#ԟ\.[)t<=5>4u!騟䳴{d@ _WdoV@9 lF<*j9ER~ t2լg5y%kk6$Í"?3e4 &TպY ?B/BM[5|ߍS$1Pn@jEb?K ;}Qƨ L1eT0°}.|m**dtP \&OV%jҬ@)@Z k)r1ܻq{bڱtQ Vb\n\ňFLmT  kE*q(.b"cU섋b s綮xtKW :U(w?}P4 >h!A4.{L0 %oB- `DJ hXuA($XgPChBa [ 0ph*:º1bHWZ%s[%t1歌`Ƣ`At@Bp\.b (,,@[[ۛ 9h|b%EM\֢ D4*c%i Wx@E %шTK}oFeKaSU@mR35ꠃ [Q|ww#E 8wMTgLCT._ZWg` O2RS_`o9V <]*{O{[O{ 8!^Q A@:v`u7p3&D+ @@7Z ` ~-Q*+n V+>؀ł@EDQ@ q޼?yc{OAqlS})[ DX X?NK,G[|```X,0`w-Mۗn`@=b/:u @c (ΛQ*, AgM~Mkȶ'yC;GAŸy<]ZP"$ FF XEDK`!`BD"#l0D+4DW9~ωD}jLZ5 4!qT!uj Ǹ96ҾD'73pt[,S+B,{Ho1c[]p MVŃG<4^Wcu\Pt-NTQ78,'ݔy`H( 3JI7ʬ^5_E]yt~45 1n[խ<_Ū :)#r,Fp_G#IfIYcRyjd{IY?WGn~8rkSz]/)ȍOY瓙%< d'?tS@FtCվh%'t+dtX| 1{ȟDz|{C/kd/9if_쁍!N79] "dRL;~=P~gt9} {Y -W[;k!45.A'+i>9d$]CD_8F6mo./BafwtU̥yM}e0>C 8?EhލoU!Z@?v5GLƢTy}6ڭ;jW~[cR]cT"b}8)*pMn+)ۄv)f8/FO훋 ,NF*P=`؁H+=m=Ɂ ܲVVzוO˛C*^R{@a2؆h.-r_kZª }{ȏצt:~򈿉hmGGGՏXB -}]7QUK]/&vyzgtZJS;X+}Rqh9ZeQSt$ljU10Cw{S2dgM=G>C(?$7ڈQS@KL|I;Ms]w#LrS{4v'gsJq` <&E3#_w :56vG SUɩw:grLl61 4FcF^ _B-i3Oכk1Q(EG(M)h*#v'oマ"gmE)ز^N*@B,(cF|tiuM5(Qmokj;K Î+!sRrh@YƇ]H_FT74qEߍ_. j[ZҚ!::5~gԏ)4 EX WGzф,d6`F/y!Ք3ۘp*sbk,7qrHow.lɟK%:`i?yuG;A3]lV+Wkijdg}c&/n|sOXXVI%q(#ݦ \X4qJ}Y=.]<[,Ik\ SV\]&R?߃=W =qE~Un53 9uJù͘vyRDX)zREP<Ȭ/bJ \6=Aubt.TazJAz4$S7 r|?A,Ǡjn;~7s g< Pys'bY_d=n{Q3 -m.I|Ԫz8g`IBҜqÂNπ_#}KVYyR: PQKck-a.Q} :Ӵ44?/#~\¢)Yg7]Xt»qy\}nuAOK"aqnd'|ٺЁѩY[SB<#te"FX֖N6#S`FctMxfx4|S)P@v+ٗFWϩ꽌P9#ѡ܎+*n|@ &~K/`֓7Wi‹tog fʥ:q:iv`^1T66wzKM8"˄Sqv9Tm!mXck.^l9◮$ye@4g!w<*^Suc;1, Ee-;=?S*l_DSG&aiMb.X}O ᠀cy^m>(L` Aǚp@\q?.hS.;R7nAAZm@m_t+W.!bi_kpoT{kq ChŽV{_Oe>uA@Ν>( Cݙf`A|u4؀6qw7v̮֫-z=[SHksBA{ (!$`<ϪK.,na,<:©.8o/'#w<;"?ː! .FODsy>rC|ld|aIAշ dc=q~CZ7$=vs7ڪJI6^Ztܜ+3Q 3g~" &l#039#U?ޑN =aG-C,Iubcb\bu_a7$t#bͩ3~S@쇈U^; !onE(H@y ٥?hӱv̞-vKM6m@(I 3YƣYZ0 >&]k,p~ 炾v _{`Z@gPРTP4z0|fʜ3zLC/LBP O<'V!VPB"Q ܠݏI=;h1rfe3GPC5 `?T[8=t4 l'.W=OƖXukCdCƉ {p4m;2.FD~$RN, ݲ^HzS&[(s~TDFaLbQ>9z7Ш~(r3VYv鯘` S|pLJٝyХ`'Y@ ֞uDpe LCW:y +]SrJ.} MSY太4P-V}V#p[V}[]#L՘ht  3}Awxg0[OӘ!+Ra`ޜ>`Q1ڕDn]ל[j2LcuRd蘵yܝМ߮YTGpxg)>dKh+=h{隨2]\JEb"PlԣqzM "iAGsTw3HjڴTDζ6Oy :pj \2 T-(u kGJقר*0 mjfy7YKZi^l-ENT#2N#yo4β$ΛW3̿fHf.'^۟u%\tZOTsMjY/>"P] j)׃Ttu˽XT`'w|UBtv<%0e!~_gyKm55_afRa#hu 3"+AW넌/p0ehBAs.N)" fQ?nK[D;<6 L)Hmo l9C\D'RZc!TK7/> 0>,׫ӗ]~w5ٜIy/ Grk׻$w}g{b)! KWq#_Q\t",I[ ;XSXjfE>SFh( Ӷ(K)0Di=>蟬~s/ɳYa>PK9 @?=(u.C Xq$oz5 \ c!1v~ct 6L:'#8alŦyCv VbY*#ڿ$uPlo͗\rRe4+}>iOe!x*'OA2Ms;АX] Xh_a NB4 Y"d3 rD&-G%hX "AMmG?[A*Nu7b]Խ"3ehđg߂߆E]*̊$jGL"▣=pW$FoV=ЩH1tT;q bPJƌ~V,X`%:jŋ$`ܰZ,X4bŋ1,X1c%DPF4cJbرjEkbт%)Q*ڰ  0c0c($hh,Z,]KZEŠuxr_z2 E!QRT9ߕDբY롄Mw\9@UO"6 AbE(A,K" Ah_%PKDL&r_k=vm5LtWtu͋mQl3ZUTWZ'lяd`:Lc'橪xl[S(>* {ZQ^0ad#OUU9|4dmH>C捅7)'?ϔ=Ɯe$uȈH0!*U}`?urM>{xz&M8؞$MѴOvb`"PMH&H'mh E AWd\<ߑD K=F  UXEZ[Ej%_R&pssQo \؀ sC?8m/:Cn=6Mw3XmvGwݏ>o7oz˻^z'Ilu5bj *իW^%o]8l]0wLUer`)kr7 o^q#W?S5[G0bmp ؆'X3C-ojĂo0MJ.puQVBi-Aw %^_p3x ^n*mjV . b~sF-(s@Sp2j;nho\'%yU 5 ѪLbUU j Z dj=C#Gh1yArt3T3DO*+%3K =i&Jm.5\b2 ` `%-KDKP-mѴmm[[FѵmmmFCދĴB .Qm[@owQݘ1…بPN~ Bʠ&PD eAxSypvA *EṔ1 bc iQU.pQe!B[]0 -WV/:?yӽa(` GڲmSlh@(7;ūv;BY߸w !d6Qf`'03Z0~Wb vی`k׎VV8a;Sbnu32T򮴶蛔jn׾equnQ^^-p vϭtͧdf>tNR/\xt+t#gK߯M  P^ r?`V I)ȯVV؎wzH[U T@9' lj!GRgx7+]ӵK[;d7֬M \L`7k~5? x/LJz|@\K֋,XhX_x_ p *!F;nP|$lFzZ.Znە|8woUsIr^  ,Q7eD"LkMmPo*VA(%U[#E EWTB^\g 8P"r11.T -n8\R'ŧZۦrhc< +@XՑT1Q hR֯pԠD1u`@*G,cPQcA074lXcblDPD"}%b-PXS#բF\Ur؉p.AjPZط`mbUG{Z4TX Dυ/^qALŊ1bH 6nr%!' CEQM`$W b~(W- cK:t􀳀TcLik#7UA](FP+- %oN%xY(%\|THqG$SQAcj~Rn߄KYZ8wcs.;]lRVH! *'XaAUY̶6BefWg[YCPG}2̒}T$!䩬KqU;\\mO ( g=wsSbXYD$x]3mƞw|z޳}[o|M!w`"r0(iC{Q5G,6C<-_zKSobYḇx֧7k1uLgPv3,zXVvIaoZ{ =+?"S!8f_Wĩ;08\fͅ{^0_G%ȟ].Ę-L?=5֍<E9 Ga 4[˛RԜߔ&4?<^n_hS Pn# Q؍ ~ݺk`լ:Bjt4j` yXξl5;GuQ`Q+w:ͅVൣvivh'ޤ~nriˢ5q>5 dكTxSf?!d)1/Ђ&/jPh'?7ݱW{I`m's=v9Rx:ҡ2A\?ڇ/@<1]S0$+ekCVYmCTYŒZQ笸g,M:yKG an *S~Ng#&2`#i8ݸn-3k/B^ [ MG,vˉvJKLSmϱ͋~#'L%ǦڶS)噩mamVS1]F,h&ůӫ9ZߚAm0M P%"+@Q<{*F[iFz왹%`DuUK%muNX#Z3 '>B@Zwu,UG9)=L`ԍA皿!33Kh&+Z9>j nrrhZpB/lO*nO7Cv}~p\zd!7yuiJuL!չ?-:} /E_d}7Hϛ.DH^?éeLT TD"n;kĿn!n|Ή4&".U Ń.KCb1 PEq1Mifg֝SNW=:  P #'g϶[>+arTg|4qVe9PŤP,bcdɰwb], ]ARwzꅁ@c΅>Y8b1]ߑkW̤գaLrʾuG;YGk7~せ 8k!KGXR kS/TVǻU|]ގ0eWanJ z݋Ho"S'уMcL kG`і-Г+ޕ?hE6&PV Ml\V)f)}hAa8ؠ0t#ps5`v#hB5g[OXİP A?' `q- P @0  s Rr[6k;l@~>8m9 C,w6'Pxg]2JB)a(D@BU`) ĵݐwʏ]h!FAhZ E$1b" ŀAbn4 F1,X,Xc1`&6* -ٵյp,~j%PLp8Ǥbj"h#pˠm\"C"R ߗEhfm-W. \`XPC"?=ԵV ^-1;;2gS.W;:Kni=\"2U~2 qXW2+4ˑ׶-J G9h - 1n\p:4,F-X@ q!:0c,Dcb1b1c0 b,,T 8A @b"%EZ EFVX DłAR&0w-4s2 2 2 H2 !:Q @t4\rEt[VՋ&x(^ bCcZ1oPB h掀::ܨ\, ($XcsuJB -`T@d%gz!ln4jPd [5"X[ܰ]@&%`"]p;! njcxr xKD'V\t2]_Q;}A7Φ4*a7jEVj>a龚a[K\\\\XZBr<}`0 Jrx ǐ>K a0O_b`0 S`0 fpwT. *zxndJ'`180_ {Ŷyx+Ȍ.vq]^^lX9$A,yN~bx(< Ӟ쩷#Z,~zL$y>lq?-=f]m%?hm-`22X)1 '` __͕STDxM$@^ T;qx!Quˉc 3\:&,;!c `cGۂ 7ML5a HpL3)Ȇ$,ΊZ`Yjo)|&l`1);Xoo~tmY:mi\Zժb# %jNRA~wV9k_o V́c!CcUVgSalݬz \fhՈ5qXCF0ݿBYAW>-a_[Դ i MpԍWwt :EiLirwbL6眶J@艦,{JPO58gkFOӑpg #CwWlҟmHɵYs[9X~~o5xg('?%fpI=؇'>& U%e``ɗgq? l@MKiPr.utDY0 -Y3 Hho1^b x BG3Vxt~ɩCqE1+^u?tM#2˾S7XJb'9bNf\8G`\gs:_bj¾tR<I)"a~/~  i ;ܒQaX|V 9Sz|^jPSIlA& X%v€6d&?z_m3YGB"܇%ZI ;( 9(x0,czrvP-W023Fg;2/Ġ/ v8N4tYb-F-jHjWݼ}.g*9Z!Vlhp`.TH%{Mwl>DLJ|#68n-4J,o⹥z`:X.?5)i;YHw o>9D43d,Bݶ~rd`Pck|x2Aȟ+xi&k+lH!d`5p?_3^2-hpBFB )oF7yɀ͗JJ8.ę\iEZUC}UoS4 0[ѣ՘wWI7s} NN"So܀/I9ҍ;}v=(ᕁ{rvD~159A0?L c0[\%vP+Ǭ';X&>V"kWBHQ Yx*Ih] u׀qT = Y 0{pgy#;zZVQpoIO )|c]Ճ.Mɹd>C:gE9 M&I~?{%[)j #Km}zCNC=TksM>ڷ>ERģ~fi悮ݥCpٮj@0^(y)>?q4wE?aZᷜ.|W\Vg5wDnUR|>Ad%H `JuAT #m\:fST\'^3yl/f^yz,>~GAI^'ޒL)ݸvj؋DlMWjN$|wܘ{u.AZ#<;ՓY]2ƤEߨDMM>.թ7ZDIIjsEIqd^=MЛN_U 薎@} +5 YO$ WEzsVP,㈁cr] 5 iwH]6DV7F_dޞÔ4z>&mPrT)[ SHZʟLt[9z jǤ)6 sTGA0pPGI#|0@mHE%4i\T )4 B RA(d~:1HoذOY25ׇ+EVcڟvwG<.މh "7{5~;!ڟeHmI}9^_wB~{+0`$H%j%  $QHPcBG7/<#7[g"k\ܬgξFx/^%KQhD$<ڃ4NY}53a10:Q՞o=v "Ё^eׇԘ]rV&Wٳ;{~ 0d g s!3οE'aob|Eow<4UKyrzs]~o@f[hV鲦qzW#;P/~g7 堔9n)bi#!p\l=&o[FsyG]#;bo$lڎ &!3UDOz6oI0G愇WFł~gyNND¡aa=|\apQqx{ El{`\gWETVZ%;r 9\YO72]DŽ8!% ι)21v'p0<.2t'RK5IaAQ\?];{QZ1QnYp E?:o>xT֑yw@!`31$3Eӑ,~g-74W}T,+OYq;x@nsPQgM.>wjȢ]bºH#=h3x'|n.ŗ /B2)V2_`VL7 ^~]׎! !UUH5 s>9?|?fa:g!$@R(o\':-a,m:MVłퟏ>Go=/vCvsz]jV~*cU;4r]x`rѨB5Z8 cUAAS}_#޽o5tw(+k2:7}4ki<3O+[jb 3apSUHj{rz .&V[$MhkqCDh-* pS_OIzy[4_ p(3ETisW?Oƀl˪e?PD+<.UBD>_B {@MDssqȫbrdk(bW鰷^(X3Î`0[CaF[u"`{c"^c|9(9 ۿPB>V7jf"O]SSW:yt9GvN\_C{1 (fxY/"E(4CKovhY߂ՏIC,r'[>7ZbujJYqd4buo')U֢ >,Ŀ<*,E~'&dS/hI *r7LȘسΚDt6øwv%ܛ'w3::eiBa?TmچOg@v 0G'Qb I5UFا5dZ\s;}?޸/[d? Jdzmb@Q'``Yom!mP.v$01Q]?vOiš犼Р@nk+ct\+rN[v&46 T($A2*Z_X[1Ini`V=##>!.ޱQC>_nEL^G=W~ƍesF",RfQPc:KE0T"h,0P,F1bňA0U,DWCz.QDbx_r)Hw?zP"q. 7UADtVۃÿeسp(suxosUCpha~rel2 kQ༾#`1t357 [!qd;P,PS"h&-hhG-hhr(łV}~#(x(@X$TN9?=Ez3T`l&4TB3oJ{?,RJ/gnoqS~;ʝK09rUِP,B#v 3k'f{31 }o9Qup}rAUTP>0D` !; L;^s͠⳻b0% +mR s,\k#i52hRrcoN\ˍ02\-%gP/ٮfUI;m9f4;Na]gW[~ݓ P} Yix[DN9;9r|3JwtM؟c$rLpzrr!DA;nzqAή;(6vB+q6q˼珞gD9w{Z Ɔj,*3<8$Os^*qqm7qKOdoC@u&Ӹuwn/ }3q!|z'W#WNBqᓠE8ji?8=,gk ʻ@랈pdJ3G0h40qIM}֨kzndRA(jJ}x7' 7zo (yf`5n1ͧ2 7"S51sAÆvBuzw(E'HqzY_:,_7y^h'3G H9Agx!W9@sTZA$B O1Ng|]@e%7ʜWz &  " wW~ɳo\ҧ&Uu:7޿k1]v;Dp1ཎ#s]MF~ݙa=΢+92i~z'USu{QtGoZ-T!qxXBuƟ @uuv2'.}xj/ 4edN~nEO;$ gX- F5AlϷ<=!HY%[>\}J{飗+5?_V ` Q@2XE듩݌h,/xw5pT ΄? :&ɄPGEE }Y:M;+^(n~Or=8 d˃;f: ~˱ڧWWJ wLІyáv]b;\Z #_DOMد>,(]|l)Tz}Y!L.?YoHkDY-(2p/h,0f`![v\¡?DB|]}\#Y(YRU :i.DBށʗ<\2l";7*b,8Uק |i=8-G@Cp\(:Sh`ͽ1;R!U5.0se1QO: hO^j ZODtek *0O{wZ*Hj;0N~Hvo?^\ δMb} -Zwk ) @)8uꈮUFWWE`*kwjB ,_svScCe+@{7xQNh^EU}ퟂc^zPM7S*G^x{֟ɯ<7ۭż1ʮl༞=fa6lݟczedr1]yg ?cuj%W5s5jƣE"*!HsQ=jD&MVeUȽhgT9:LA^x$fڌŴ9ƟQ"U]HT hsnr i׍eťXnob{@Ǩm' ޻zp]onSyA7`q }mgoP/D"_ k6Px|hv|uێew7 اB7r xgg ,aLAtˉĠ?ك?»d'#yvтz8rQM`0iH @?rR~ >NRxXUezdPaWEpHZt5T(&>Z,j|ȐL]G@%(7RKnBoaQsHms(ȢLiB cb} wOYYOcaXpmJ ϲJ>- :2B鰇:}Y/{4(5?HPӨ3ub'~.ӟX;60 e-8ϤnjZ X\6рSVIw:V,WO^9>_wex-;eBnH>am7,{A0p d~6HF¤'{G lP56| 2a*QhW7/$S߰aF64}[iU @|P_$ [kUCeƠxLj}[N Gɏx$&p@1 *qW X)/A0868YEXZ?0 5"xa!!A@= (x0 6y)z՟9\6=Anj m\6_ewЮF|Q]OԩYh s4vzmA+%s9Vw {yy9mk1EӚDJ! ,nU] (bk;_'h5`TH`tǭJ4~COL mf)H?<XU@3btDLrBQεN.ebY?U`a|TZ:, bFI{T0̡N8nvBWY_,FǾg阄|;RO馈)tӈRUtdP*R }y>ܽ.u!;B:!`#CViv gdYJFhrSXHo\`WB .nι?^o\DNs;u}Gǘ:ߋJx߭]Z/vu7\~ [ H!V˭ÃBϻh[m;̫k{snt[Z-\ Gq[[HLbmmPBMmΜ ~QlR^stN3{\E::6}?'ؑ)PO3+GHx8i8/P;Zѿ;K!6[Vail6c\uSt΄~F β;('~fAyoq@ਅٺ׸:P;#uva5+Ȫu47$B@_D>[[5iNGCK\zSȥFq;_YcHڷɏy=Lxߧ'$Oh>).T@=k`'ڀ ՠ 7G{Kc 9%O^catDff) EdJMLk C~l`4.|dyd:oW dBS{PדV+ZIz89ze~O $iyhqZ V 7zx GF̛f1s0ud!{TcVQa}ѧD\X"q _ ,3ܸsM:ͬLIMA B5%BaVdy'5?b<`]%{:Iwۼ&x[J$+%L?F?JdS[`J~:D%рVrڽ%07YDfRs4!ǿ I B@M+`øcN 8wvڏYs/xwQaM0}ܹmdV)|ٔ8yv'U5no9WEcEo\ūz#  QȄ"0cڨ/VT˾ &Ƕœr_ik얊`ʅe5fQCzhQkaeVv|{3a& 06| TP1d+6t ڢ>-oR?'2B֠ P@bPl; P麥y{Qзe7'J+2dՄFWm\')Uj@쁣.`m+Vא%a4 eq`o.3KVyM̾l&u𼻑$k~ݲ̛)#!%|,R;j9-պv:w"ˍ$|yʮgJ]yB.yX;>DUqaŽHbv4{!KWܛ\J g$'~Z˘{r=u8Qnbbkw/~C/y?2!@k\Q`_Vy52=Hƥ#,%YnǓ~(ZVfVn' MG1[79S,2/YC?$BlO&cC$+Ji*zKq3=e(@ 5%6'r)D fuzڠ2OzOO#!@ۭw,mGa1aKd[+Q;($urm~M'/|Ma|͑dP)./VSf6So1ǥH.&v!j}9}BuY3rW]?o ܘEU_AWÂ;?.{cEº.5mvKVpaH B1b!۟T\t>;\zS}[df#(U.=]hxp׮adi:p\-:3iMO9(Ӽ53tMcaVf 1SA N7h rޑ90"-̬76dvP?;#g Dny)4~3tqX(">$ApYA8ņ)+ h ʆDPӇ>2x 1~ j&*Y[BǮ/u/+58ψ&'z!DdD Y#t*[FKʝE7r؉KB_]X2s6]tѲF/cWSe~8r . yku1ò!do%ܬh`_RX/#m9uڷt;R.,<6h% hvΦ:HB0 ߃TwXahcXS<1 oX RzW>s[;oו _)2ww)[dSMa"˵}Ssk͹~n{ۿLCr_eZ۪\!|$1W^ [ gB&$ gƆ(_<> t҄~P%0_3"8lL; Le:O#-VGF{ j7qD G8͏˱vw4 ٧ΧEs|G8>z×[@6=u _m4qi4v3.>?p44.U۟<.Zs\Դ-jstMx]xyɏw繯ߘSyHj8`GfۋPS.X^J!kK$,`~]28:4X zuUhGIݳmܥq2Uf9nj~ݯ4&AL= {!?Z qBp %*E;[9cy{-k :BG`4[Fv8po?[ al+c04ypt*G7 9[Ĺ"1Aھ"PQIjdcS=Sd!ݢ GCf+ALW-( $㦵8Wd3v;Y?x)>cz)I'p? \uaDN](:YHs5#|G&E31TN-Q|K ZjL836W{=ͱXMItH͘ ~Vg(ڢlZq]KWeL7hwX1薝~0'W, ;h;M@!efݦ]$ WzlP0e(i䂍ڰAS\(d,5|A%jiꐵñ/LB5l۬ts NDf{*8Z0T(w/3zp?! u4  XdlK'X\n p !@vcfԽH"6?N*J&';:2}$ԔX,=bE73;#.8>KJ(Ns$2FVF,@NE@+M_?0w!(,6d㿥|@fcuY1bݠ`e$]A V.6~eS"ɸq:seq[U49vt[y>#o f>f}ղJ2*cJGxl;Q?n Nh~KNj\saq`6/:C̞m8LKFNLP}!48N m CE Si؟j n@! ڍcVPQ*q hhN<()&_߬Omi zG:+hlҝzߛ]|(6;ӽr^cE.8-T>r&g?AXH>ڦ 5t AC.c%װ{ewgs}o((" Ԭ[TXCC*.oRQJ"`b* PmZ*(k"UQ ű"^P!A *`&@..Zꥂ T%D~ߨKVyĘ$fdѝ/1{5@LvէS_$-њ1FO~[C!DMM et%! D;&/'lĹ-549$)_Ӹnu߯|Sqiƞs|y;wUyj ڋNn}4N "g١bbe**zҠ_`kZ SUS|7ur;}m~9R4K~7P]Vޅ /,I"H]:L~HWP]s%$&΄['hY6z$}(`֔LqH\ Q05-:# ,7oϝӾSt\ɟ^;h)޶Q U5w͈Ĝ#,9>v:2FShrlĻ`+a;W' aYW=KըΙro$-\EHA3AnLip*H-aI%T-2ׄ($1Ѝ%Bl_]jlsmo[/h>! U6 FprE(4ApF"Am&%EQV E D% J+Ki i5X .{hV,X$A!88F! s5 GIE j }.m^J.%?`s ejQX"fk[V4mApjŋEE@A V4UzG޸WlZ.7 ޵j;tVZ\bh"\-)ĹKѢGhPb0X apb5\ ĸ*cprp@K j[)zBPCP$-E..7#cV`rm"6!l[(cUo[[b\ Q*h%kG`sp\Kop8[[բp`jŎ%8F5Z7h(ժzŋ"1T"-\.bڨc[QFnq"q66P1X* ]%B娶-V3Jq 2QXXXXXZe/CCR 0K  vNUų@9I@k7(}}eXzIS4%cՅђM `+ k/% p J&rL4Ƞd1%(@ƱorB 4HvkS|]{o|}z J MV>9Jsk%T\Ť+s~5D¦Бˇf`Hm"9čU:D~{!]"HVO;3݋7&!'u3RsceD6<` qlXY^}4铺_h;壙\]m;"SwC olQ}2#]{5 ~0r1!0X3;Qˆ5~" oiQ<jS{eQO 2(Lu.>_jje6U2 fByUu3ѦT\*\ ȶ욅u_rFJ0@W3J!:S=ڏ=8~ElNIH9&dlKSb)#1x,Up+US?X'l(0n2R*ߖ& 䜌,pXȸ snNy](mˋs`P.V 7B'x.2?E-`w GRhvo#%:% cg/3x-XlM/_0q'Qima(As%w+&\&B_^5kI} SAH f34 9ijD*Bs'۝1y:_Oʭ^u!Ў E7Kn8[}&SnO*Tq|eYr z.Qe;rʘ͹ڛ&t6F5}W͌]6bkWq-_v20[yv-3"c387F_x" ! t߫T?嘫/yWևItqtƸ{ j &Uu7n~o5, N^Qt/ d'>s%PAw.;?EimL%(ؾ~˥ reWlVΔ&Pwњ_}Rhl=C_`jTIq$eaGhz<Քo>Jk#3>ƖQ}߷P~ ށP@vMfAgP' UhLrlt \'@eti7 Ֆ:/A%/p4Yï0UgFEͰUUD1T[\(Fi'^:+gy#<)td8tTD|V}t&duIŻxbn9~`bPHWVξod5 %=%؂<8@RAϡc[V7l6^@rWYshƭubAJ) 8HHoQl^)=Gz^PE(W*$T*$"P XPJEPFh/TPFE @+0o``YdLNAzPq  INSUlȧ$ T-/17>mrzWK>鎥F;OMk>7nٖo.o]-ˎߒeX4:)66VT-b n#49NȊ&cg5]^7Ϋ?zOj ~Nwk]) }]%\ގQlOOf 4ht'g jAaȊzrR?J g9uBn!O%X;X; JRݮJG)Ğ08ъ/Uՠ+{^zX8)XlZ~x(0W.zpos5+-a.s>\W4/57|%mU֮:i r'9s9X? ii6e>yye3<7\6VQn'fF+:$ |i?T!ꈙV 7!ֺ(G(Zg)C۾,GVpTax:\@޳Փ|z= 5_)MjkT*}0ZGrH%lueA-`Aj QX%PK1c6y_|mouΚs4`M8%`{0-΋&SUQ:_z3{tY~m-l뼷3(P]Cw(k4> HILF6^4WwFHX:Ef!MrZ!pb[ncҞA({晏^Wzw^Sf4F(tyIO[և7f YO8,!{{Bn O K@Zq<Ω\X܎HEiU?"PjlUX紜26*[>zL޸BzYvVHj?ZN980o#=6rLzB^f)u)9&Y(Kk7 KyZ;&ɝS4E 9ξiq&bT}_3f0UlH &zM1XnO*dL<@{x2gD4yhs-fO}bb-cSANeTvǛN+9zK^VйI<.["nIل=Y;j//oI+Cjs{a\+35rl9iMG1o_4 FvA xɦ.84Kм峻_DiDw_G欕+PF_ e>0bINhm^챰 [W׳uV Y6YbE0`p]?+a`=N m/e@*gjvytZX69)P] :ezP93E\ tfkyb ,C5] dBp\w#_R(9f5*##ʋY\/ `9|{)Өih;S xxF7"?GrKdb.~)sꓶu-?n#@])4 ۤGOn]r+6}Mjd߰ `>݂#,>Zx7y&U#za,x3f#E؟n(Rfi%27]r')fߤ/ ZOG4 D.Omh ~ rݫNݧ¦Atw5Z;Xqj8XN!Q]>\d1y?ep8>3\& a\`z{`Rs~} a;MyөJǑ3p.˸1;le׹mnodⓆD3?䆩A[={ci%oۻ`ɇϒucS.mbR:;-AI9qN,\"(_!r\˾=N<Ǽn/5B۷@$d~2YM_ xA*O =y#"0X|> _%lkӄ7M{HLպQM7C%e: C4)Y?AD><[!hxht.T~L[W# d2SSnWdS #3'*yEY8'T?Ĝe%(<5ˢ~ kZhqtϺ,kx~Nm_?%WD\݅:Ov -ZOF[jzB=ͬRdnՓGD 4YjfrO@YKtO%sOxpVtpWi|hk!lR w4S٢Ae~wgU'֏C5xX,nhV^$K\Bl>qnVxHf:`"B]a]rsEJn= t~?1?O#vylin92kB̀#F%o~o:^|P8ۛ7PdbC,j։s 9[s"-^#LO_z lQ\"ioTpMH/.8P)ئLruRsyMNʾZ Cp?8%mK2#D9'.̖) L}'Ἆ{s+xOv>)#U5Cם2{2wƧ/W2Pޭ >2N<j* ٶ(Ao͚ڏ8*tnmfʹ޾tN :[I^FZՙ1몍G$ǚ_B ;l^ߎzߤʻ<_פnxBEe]"Gv@?@h7tۋ=byX>kl+Y Xawm> ڇ::_)JW<eZѳ}~uV7V KH*I>aM@(rn6C/8͝|H>֥)}PzO+Ȅ$Qc(ەɹ IMpڗAYS,4tWS]LY|ygvw;a^{NRӁr74 Dre8טb4Ј p`=2lGLp$u":"fK{&WY,js'p}MƝ7/LD/+Rt6iiOV_%´>ˆZ31!Wm6$/[^1 iUnNVBA!rf*& xY06YMK%'\g>/#Ќ4A=c0FsL&xETq؇7޿ۢ_74ߨ :%Ldn9Շ&9k|+t$JU٨ 7"v ʽz}=TM!p`#oJeqEXc $M3Dktv^?t[lcGL+VdgWS$֔vhU<'ΖF$HYLĹpCԩhJW=0*36hkmBx5jmC䔮@[.Fc>;zS#tv8-D΢"'iVaL0I̎1,;]+Uҗf]c4DZnbvh=Q^]1 & YYo3hءlZq/5a.8Mfv]./hPYh4 ~ڳ#6btc&Z~FwDi'5S*Pл3ԃ#Q稅zi;<_曖u\,;Qgc ]'ǀwZ]!sN:y>w\o@wD7~Щ,XUĖKCXy,؏W0K4VXD4h/ygC~x3S &F9w~/ iQ˼mrX._ARӨQFJ]X_5TxG}'Lr|Sa}Cq6uxU$nmuLBy%n@3^Ģ.g)aȨ{nn+.M_ 54HgKT>|Hi@<餥&_o?O8 sm[IfnEWSlEAqov"^o5uXxMxڦR';;vL~1a UcGv g֯sˬ ږ;oJVdbIyejWI`qϿJʩRN~$WQ4mdz; L}-L$RA8a bNHӚUԌ-f\)Sgw1̦N瘗vpvBCrsܴLj78<;]'v{ޮN3ZF(m?[9FJ76Hس̨ʏ+3ITIVUO .uϾL̎wJY碇G5-n|CtX#_]"`^իA8M0wWXؗPYoF}7UBOlrQgؾv# 3w# +)!D?^(8<ϻJw2N-wX7!S'ۙB#˿.dӛ}hE)JIwKEI}k{Mc~cLb *I3XfGo ݓ랢tW0{ױ+r y!JrӉD<އ2NqG֝>qL Q BݑxH^suћZݢ\SPYA5kTXGp!J%' 76 ],^ϟM{90ZNwUwR/ʋA'˒>FO EORw"yH^FL8FY4xȰVO٧U4=ї{wFbU'E R(¢m%Mh콀%ۦ,4of2~{&%elEТuR$?9mK;w54!a 8z8';ʯ 4F=`QuXtr>Io*W=LI=>*i(W"d3#bVfz ET9N|dmZCoAǕ|{R̜lBJ _5;h܍+wE5>mZr 7Xij.s^ gaSvM/E(1K OP:`vk-~VԼ( h6?Gw۾nY+SWwX`b+cz?ӷ*~1HrJݯ槈84ǟv_L&gzN;#-د9:3Û~^qjgJ>Y8TW˄}Z/skCjxōjqC%Z<*ͬvEm%l*A0ģ;,p N ˴PMgae^` MEOT\CtlTf>? }}ιO{Z \J/0\ %*6qݳT:S⚡~lk9e{r3&Lb"\~Жe|.}֝-1,.-Oۯ}}Z]GڈW[!d BAŰn3HK-cc2Y}nȣ(.mYs1Z*x~'e$Gnxw49*NH?&qzb 7|[l[D b 8Bٍ+v|dmNj557^!()dmڜϻy\KmJ:4;YgUC2"r UYA+F޶Dj7jaʢu0&Kr( jaCА<c47Yog9Q!b l+4V%Mҝ0ܦnJm5?RdD%,1ԜhQs[i$]C^wԵ){\z.(kɽWXtAe ;!C#/^NW:EcX@C}, y a$lgou5dHϞ\3(Rt[7C'=A'scmC4 j fO2}6̧]NKfόh[8 U|3.ߙZw+ nPRKMˢ]3x!;آrA93|N$9ɜ[򊂎Md{&37'X=0.ڄiX*+4(l>A1(_mrk]O6},s5V# /װW|Sn2$xeV&}yQUb2:W*AOɇ3C;O4Br{{+dLM$&H3y^XTryQ`_gK߾SvaR4ϦJo]-NJb8|SNSߐйX3t~-O'Q@'?4=i@yI gtn~8QlJKcWl% L /qkp¡ֈWW N`# EGlFɉ@V23[ 0Qh$WD0 `p iZEr8̰I;d+O%*1ۆuhpKCJըd] yW/& qg2WbUKpo|Z %+ќu-tP|\l"~N$0n-o]aά :<òev ߋ?q' !~6f@xpc@0Oۺ NK:ʤ? I0@LMmTJ7&ORgM1&Y) jiKO{pW%c:yDL8q.YC1k9X&3"2o;o6z7JMԒ~*'GAa X$2ͲDj:E,A tXuXJ#;Y<6HSR`Mᨊ{569[ $I<`Glpf| :UK8؞'%ۇ.=cVֱ:Ԁ˛d `Mi 6Ky/m7Ә`/24Αp$'#U'Wm嶑M0zL K7,x@Mf*11`YN2aA\ZAm*hѼuVrV810=q# O/X\h6AvSA1NDT L2J~ro8s/]xpQ1T7 aPʿ4d)ɋ\ hFux&B\ܸ? ʜ rB*c.U^YB5O>\&ůgDO5WISivJ Ix=F%̟Ѷ mr?sz/I,MygȌohxqanѮQQ.TwojV1pW hҎhs'؈<ޮ*g> }DX$?ϻ,Ipc SNfy/^&M?WAY@vU?\\Gc1`S&q/;ëȘQK>_4!r ]GezB 4=7l39>4\`sX6$T*ǭ!#xKs6yWa0: M3 օkXM00JVX9CzO'{zVc W2Ľ+i! п<[^w!c:&l~4ȷvKi9kCCrZPW1N87"(97?ypl$l+le93KMdfiat"uݑj"28 YP{-lɛz9^UjReD`J7c!m+1-_F՝$}<[W'vjJiƵ$kTCWh_"Bjg~Ž^.+?KD5GQuCQn[DRScAe*ߝєHȏm Mcq)?\7݄o6ٙQ8U{uӮ$x~6>.َW2st3נ0>ުY&t<_J1-/ 0'"^ƣ]\^z}V_^̹N[lx5PMա"Bfv_n *M:Y6{bYɧ%O M{<=~A}il ւSPw|n '#'sBKWL7YBWgk ߉彭M|j< ['53M)n7ēؓ'N([o^i3J[')A%{ߟR9 ;Ybg2`k<0 4'uz-Ul#IsO6k9$r<^ҨMOomƊ/3>X>Jܙ _o Bo>OO?K"c*,[9(؂jQ;FHӝ V+c'.`+L. ,l9_]yfvj}t]e{T-xR8@yj{h]ׯ,%4u4G-Z7cA%`_smx8 u_*;gLmv wo9.-Yt/.D?Wȝ6kHP#%g{|W+_!]VةIUZD0lG vtWhE|p(^70`(aJ3eAt"?kxJ7α1Y/f^;<}(W6?7J 1%ѕ5n2YWz[&N oPE9Et.fo1o¿}WJޒ_YɇcRqMJ>2DjP}kǓ\=y Y3kyWîcޝVBa+-2;i(#D,5۴_j'ώB2NY.E8<][e]Ќԅ'/LT\^VS^Lz\,IA*8?m\5;MʹozCcAw yiCib#4_%UY #EdE' s{2n=[%$ނ4N_=T]!45ܓSYv8rH0z~: tH\t^ǀٛnO&ՐN*G6kW;ZQ"qr Ƭ4d3p=?,mI\.e )[oJb7BZhEkNLUT/R]:+m-!j~=on̿F$K5mR/&gI utl纺xZ#MOG%N9= v%?',foh;LbKߪo#;!YϴϼOF7!lfdqZ#a+o2hVG,z_Rv}yvzcgN vޒHΑ@;٬,C옋e4Ȳ,kc*?|Y<QF%g忳c$f`GD;^c|S|.*vzR9tfT\3'~ubϋ̻M>0&KHU]Me*Ms;Er|;7FZJ:03w~?Z=F=LrB8[l|d kcCD{ =XQ}7wHP =|oGm^EKO^TsSN:)1mV5Ԇvت?5r䰙0hYv2b1oMlC;9 dV*n.Au 8DUhVUI+gc2W%Ȅ>ֱ**K'QdcJ;Ǚ;/tBnFzz*_7 W9N_0\퉨^yEO FY&s ՙ˟,9'5oMZq$tͺ ~ǜOW+R}%X@9U;E+UBxŔ/-csJk\X/'f{gʅW*2aõAՔ{^DxNBՏܙ yaW-&>$QÙa {RWkb^/uQv^KAtjrNd'ƾ@r,Vo[C mHPMĥSǭf1u Q'6/7jRvN0˚^sHw0c1tD$m8yH'Ϭ ȒiE| kq!#w'_&j(3xrlg*+[}~_ $"?z}/ޖ ?c[5 D`̚Сsnڃˉ{> lz{-K)R?OJvd<"V3۬Fg«;GO<.Aљ{W5K+بfif={N(z/^s vmVT]iF+7̤(} ;W!M <>Re:WJe(9{,6i\3l&Vft|Ԭm-%.oԚ`Z˧5qVZjImD[q//3YtH>Õ2j'Y ;MVh }]c`vJs"!-HhDZF/37Ñ|{?]WypOxl .f5!h~"ty5崼y"s" ÔӋVsn/ٟ=sъcnvr͒\ ]2~xde8"Olz=9S-]*Hfr9ҁ&3jN]]YweM Ν,> 2*}exʦz$fRɥE%؊iT֥H@۹ Pm׌7]aFSeHϫh*>Ŀt9MWUgCe:ӯ&<*ƹVEսl8 р,O\ٖ49PYfc=O nÔ&RF2 wģ(R8;Zkpߠ0R!B딗j"1.]+P z?`^y-OcC8|\[ʲ8]_N%.k'c'|hry˖Y*56!n^-C'=kxoʒibGay |dP X?-߭agRPIx ש!"jb_ڗ ju;dWF9Ļ[B qK5U4h-: s0IS1=]<-Qܕ\mȮnD OD)d'-ZsQqk t@7P(e. .vl"'PfX8?o65x=Ođ$$إJv?S\V¡i{Ȋc7"#ap6]XtZ'aW\*A%+G_GlJrD28ӳQOV^X-I;M>Nx-}Ir͵ο DF I!!$$(E}|(͢GBVLNMYMD#1q4-7W|D%S lp?_~]?晦&C/|̩K.obtF[8oCuJ5=XJ֖'՗MgܧNKk%vDP1bOQH\?ʾbAJY9LD'm1|%JO(-CoWrlMotro^(I^@L y5|q6>`?ܑ`&]-G}m.~.Jjф <>G׵]Tw/d>#nF57~Ч FHYg:7l4\+ *p6օ~AQ%_$H()S2_sƕrfDP@f&-$7ol|eڲ3QuvmYIW\l%  hRNW܉Ȍtê2g|*`+4|>-}())R}>hf9+ ՄXsĒp[o$e5' 7@g4ohtlŒ7_"GJnLM13%:W.cqfDa/j) Z1 Uv{/q8h0пef{2:1KLp\*dBħ+Q[8MȳݝѪ'?W5/k^sH=+.)O(Zio<ut|[,t}+2SeIf&U ^6Vxs "!rud1s%0~ JHa 4\Gtcd1ںYJ$jIh։PhD~xJ&%DR895~L̔g JVWTGT%,}".@Y:Rs<K~GiͤH!G*3)^K[_B!$-?> ᔉP_i%z٭OR/vv|:9oĒ+}jG+%׬n޷X #җOZi1~ < ݫS}R-_{>tPI]3g%eBi= Bأ9t?q`* g 7f5*}b⅟`!/:-(Iu^_p '\༻YZZըḙl4B@O 9 $}j&KijT1lS娰5u :r"rt̉:C:0 kƬeվ6Pd.vd ds`Գ*jBEnqZ D}" v&ZF߭y:be{ЙZ˪<^C(r !b)~ ɜ] Cy0&~[HԸ5ըE^ &vq_Mm AL_D~7MT8xhًṽD9m7b׳*Or:%tͻ aݗgj8Ch?} mUNՏY̳*W*{u/yG*}?n aҕdvTf۬ƨs{]5|ғ:4GjЩ,~}zA0*3˭TgZhO#,k;Lɱmp-r?'&zW.q] _s+nJ m(P豹>#"+lR)`RR I2q]T1E$|[^wtT4D#ܘ =t(28# ! 'B%]dV&d2}Ggo<\NJJdh|xs]< md"ԩXi4R4޾\N^Eob/ & QT::41Dgc" DGĚ^9xUZ:BOٝ]ZRggC˃OS(Tx d OtY]?q9<ߠ/[ e78R6 ,dp||mܩMz6,~~gj5li'=jLr olHoǪ}X e.-/9Y-IVjZ[@{8mLX@'J={4ws'g x`5 gd/ %Si8j'* G ϔ3 B1}w4NwH j*g[MFkA3B7g`خC/z2S DjM赡~P2੖R2w;t=PpЇѧG%k|o~=YzxDx (W[p )41:7CԐQ@e½~ΰEʚx%tԸSNKIW7^6NJЪ/{^uv&gb 3X^ ;I.riFqi6>K풃 Ap:L9B=l2DuEL\KĭfYF,jm{l̏g4OL6vwlp0~#IVx=XxXw!,9Qf "o50'Eͧwl#m8|2>q7 >B@0`w<<ZneCbK ! %ш#[k7CV:6ל[S@dQG h ! Qtg*STYU)=cD>ɉxwȲV!"2~L\ 5Q %B1vT5(ˑ~a6θ@tC?}6QIRA+bjJA?|GV%BVE]{Zmtlт<^y $alrmo*Tfm3$Q-FvCW[s0u+zhWU}q,CP<:O8IFZ$:G[a.5 Il1!T:=QXk!7'@k9Yc8jDߦpܹZ*fn ЯWǰW,QةHK1@}1^GLt`Hz&Oz>ʐɲ`(SWE@#.}jl@ UD+],BIy_K vLfϓ~r yGK |t/%l2E*6XH}3?qut7`Fm\5H% 5&)D%>-`4Z uR- 7߮Er7,!’punNӋ8kj*`xnw5Ĵ5FCgd[a>@Ȍ3mN]+u=My@nxQ^+r Qd~jTjZ;=ůSD (sh < \ʀneA[f/ m __xu_I'5@WxqX ,X, %U$X-:@K[K(& k>/ݮR$I}ӔONx$S&E,7,w&e^1Կ%Adk5݉{<` ,#*fw`tZ>XcjJ ֽx!18B"p=ފlo'Ҿw SU։Fne~^^NӕEy>betÚdC=:c #%g p6Qf]l7nݶQ:3`d? C[:*/NazÙ!":>P!okg-1cIP4J];3Si=84o!l' "u\"woKoJf`.&]>yBUcDABdMG /hxT]kW.CRi_7 1 6j$ʄV$rs&l;u~;~!i zd ̱('‡Z8:(dpxt B[anPq̯ c_;Ғ$m$^}ObaC7k`dP.~F:`fW ɐ H S#41b;6By(bm8Cz`8ou@y]wH?/ /{"<-si5\\kܬ&[9}ɴ&6LJIiV~ VM+b#=WҵBE?U;Ra>v"?a-ﷵQ\dݎ紬Hkh1J\>3h37!=EO;V/lE߉+=jfLfhHn;H;8@//x`D~C|@= Y,\<2 R gE.bkJfȍBXYHOs5wprwg 6Ѐ`Hs=ﶪ0!$x=ZN]vШ\W [2ɰVW#.+LhvX_j.|xgFNsIsti2le o&uE]cˊOt{p0J  Ù^,H~qD>RC$\Zm~ԕv //?ke|?L_0(SL];X:/ju OnbO/Bj/B4k+-i^&M^vsT,zQ/P捓u#fÈn^wߴk/FGxÞ;,dzh29FO?t,|6a3$ Ut$n5#b)^R(ݥvm').;Holcȉ/nj]ӒkN L/L&]sB$!pz ~2 _0 Yi J[+q%=` \@JC'0/!^9bLΆlؗz?v: _I>v[[,w =0E4诶ŕvh|e1ʜ#Tv2O9Xg^z8wԇg<Bl<P92@\'h-ڽ,93.o7Nz]l~2Y΄qAxYRtX4Wz<^_Bo3gݢNC/3[lj E.BE3zq(}6ٰŝ!HBr@P7ʵ,X0yI 59ӳA<޲o*W5 -nq,Ia)kbb bz!-|#:xK‚<+> mgȢ$1 O~[Q[Mf$5;Ө~qk-E/Т)A.Sù+i޲>x+p*>B}Ǯ瓈i;'_/ @}&U"Xȭ]Z{>6e.:+<'| t󿬝(1hy*UGt*s0_U[wZ8sL K(lgV:>OY5pOK ">SRbbrV  B̕,v*Ͽ-êp}Wy[-,'H_@!@c]/y)qR}ɱ"tW9[H0fTD}ԱO0to&8(1*o(;c(7ESuQL xAB?F!>,MoO$V5B% i2$xhk9F"}z*. |x 8wd1:2 qJF7CDIs תrB'9S$m?.fiNnٷ/Q PɶE/Ti>`drLz^@m[eۣyH]x6ݜo\L|˿4A|.J9eҁ쇩Nɬ/&8nK_f:b^[NWW41K[ePYa.<*,˛Sd"{ .dwɉ5՗u+JMT4[8;'Ycequҡe0GLuZw6x1bї׽M=1%y*l j{~ϫ~9O ۈ܈MUzŁV/g~Gu”e"~1H { (snSmk:hT1i7YeY~~ UFov@,{qƾv{™ߝ^],M=neœ(Ɔ %G. 'O8uw >?<}Gyq"n'VLhjܬ4D _sTi.8oMdn j,Dň'W)zU{>Vu\yHyd1$T/i5q#E֟$i@~=x2 ˵dZW!^riG3Ȅt.)gN_1u ;b/ܝK;к';m΅]:L߽RbbLk܆gGhZōͅ?UNjHHҹ~ǎ^猬%%Jۉ@{=|Ńgnjk.dTRN_ӭoV++'Y󔙞/Bߞ P_cE, a^(oϤqd5<@ T3%#/ \ ֠R9/lal̹.P:|#b>Rzghs2.P"{ش !_%ʆl嵹ש˖q7ʜu? c4ЄIΜ2 28>2ᰑƍ}2B VqK報Y8ݪTWb/m۱% ZƮqL1H='qd+ϧT۰,3~70[{ҽ_'=h>oF]c؛zˎ}YVw6] ~7آeUBgWzyЀw 87$]Ze*I,Cٍk|o|2-UNG l7e]oUd[~DGsBT5gva}l̹ʼSv[l n \ go(O*Z,TXV0H݃q8,~ʤ/%<_ƇvJC6c0I`@2bUoru=eߩMflwrz κvX72'R , Un!wuZ Y W>ˊEbInƆ(ź mlc[nhPoqη ĕՌp:q#>06?"?ljPPnSK}[8iD_G2^NƼ9 9m0}ЊŀT`CS? h܂B0":ø^SZz﷧ܩE˒2fM%Xm&էKn~z褅i>Kc7fg}Y 3m{i+Lp4WBKBB  0|0Hp5| zwcCұAY{\g{(lԻϋXe:&Ӊ ^M@a,@b@1 \}\Z߷a75;}0[_D# |{Wvz?6-)e'Iĝn,?:P.6hyn"n`<mVWLqm6J%ѯ0>w5 Eg[p:u{DjGZȔ~Hk7!U(Dzs:'p[>h]C\BZ>DxaU];ZG 6ƽX#֫yȫ ڂ9\_32Pڸ̳`q\rfI<4Ut4"BI|[Lˏ܇jԃ+񺢵KQi|khs 6[\F"զS;O:#MyZwoRuM7lckAD@G.J#h%P+E@Cר<4 7elfWH\ 0*ZZ{e8w\wC;`eNN]a&RrI\#T%7>nu<Lhv&ߺ4ډ!P0poFv۰ÊX_e%LQ{B@D+ )wa lٌ)D63D"Ït0P#8ۼ/|;yUe -  f Dm,d (j C@c#<@ۙUïWnNx-$ =3Z ggށܡ]@}{ˏmL&89"\h 9tmC%jR!`ЂO'gOPL ;kHޏ+5om[x" BI 5pӡdȤD(#xιk vw6S;$SZ 6S ww` n@WhNprdRy1js oxB%pDZ(j t5}r^'('Q~&3$|=VjKvnFY΁-eg&)Y>4m^7t)pr|$RJQ0;Oy]m { ˃]+PdrKNo*cg!Tz|Wݥo.=7wCAc'\ϐM[Ks+!QPbCom ;?)W./;`BZ*`Oo$ )Y|SW )E/[7#F,@;\Av5`C;8XBK&s~25gDQl[ 3<e% Y.mܐUUO AIynZYѻsXAQnfj[W4EW|NC`VnI naC%mg{roop?1Y/b|>Xymy%2ӤPot3)!+ShřhF¨E Wlcj3_M+V &O(Ua|J xU=OYJK&T..[$!'&̊2q"w\ӹ9R0 jQaZJ0xz}@>^%;*_lf*t4G(OaNb6*}Uo֚Pcf9j,(lcaj].udm[N@9Y9yK͔gGښDtk;15S^9B˜L?sz_t~qhnx:o|s=[w_:wq[Dt .7ue_;f P$Эxt AocvzZPx87h߿i֧F5a!Դp-hϓiN+Ǻ@C4'$*" BYב" g${r@.iiK<dJl&k/W3?d&p*'+*wDv*%=/渱<\2p W*Ra|@>N_@!y[H _6ujǺC  #Z5D((y|'ΗZh_swaD 2)ǢUυ0#+~ÃĻqx2Vo0O-]W@9 8,kӵ~Ӟ_˺T_FJ33N֢<L_;_vզzMrkڋZU-:bC]ɹ嶴kT;_|y\_[zۯ>64CP-D*"A?V(kwc܌Jc l՛V"AqQu&[o4Ol:FR?柵6 &=Huo3畣uVh] qlڃd8`ܱ%cPW>1}Jqm`ҵH?Y1``@ ) e6nS*tO$a0mr9f|750k[7Bee|xm!,J{k> ɚm}ExA6?w]a7ÊcJεsJPtƜK)|S`(WUw I9B 6Z>.769d\LieD($ fX 1РPbFgf|Oaљ2s֟s&mחo=Ǥy,6׬ws>=w+~K&"ӔK?+0gGzo7!=П^'G5Z>Wk p@kKߢUva5X.ǚ  3I^w/,W(.AQlpeNTzWZ/g$ϱqug!wlcsG/|Jt B}ҡV_FCY8r__HisD 0I%Q%:Hs]TI+vÑ_Cg$xus(a++J .70Kh_`nB7B18K0.LwW=Z^#ʙ'VFNeتx& uh`C }BgT>ێ,S\S 26&6ښh߮2 !*839C{8\w?[-CPБVEo~;ӄGf8ƚ7 JYm5a"m('jwoKH]`ѫ"&!徱:0Urvy:#[wt9O{YWŸa4<97ѳu Sܵ] ͵aT2CAvzLC.Q[EM1_PGߊ|dn !/i3ײ׷FVh=ogzumW'gZf8T` #]k]H!j΂9o!2[t㦌Z\$ Y˞OknOsVKHG-77݌y-&og3T!0`7rO!eZrS[S%Vm3VVԖTj߿[W_uJsu}S`<~Y_]jgwx:tG@/yf|SScY>2 jqYjm)?4W@ShoK\|_L=L%tVl(vܯ~%e-@ho6ILǷDc ' q,@B H$A>g]7~_"x@|%gKm\kDʫi-7׾t@  =7m~Qv;s&oՇyHm5(d7uwqH|AM_t\XO f?ݐ_OTh'xi/F=0 6rXQ58UV{XIA~~]GÝ,PQc^wyrp9 $ (P {=z؉9=ݺnĬ4G7ֲ +M^hlba_|iu|[!}{%%2'|]`sKj5+:feaQֳVRXxa|sN&}-NRш޿Źc'krw6+:Q gS($a-Qvdl 1wpV̑7QśXX{by0R7>Ll®se35v:zh*E=iW8TE Yɦ&2EP7Y'EY޺cGSYRg3qWNm~~7;nڛPGqwⶹ~mQB:Ǟp*+2WjW?BgcxIY\4H^uh=FC#/zeWҴVāG_@ՈλʫS??z!N*MZEŞ=ʔn1h`0DCP-wEH}i;0/1Q3YOS{W)5;Q.fڥ);JL-4g$$͗zUЏ25,iʀI@}@)PخKcmOwiCOr8`LAlëOI6*1B@ f@+tMP+Kqt;"8WghT뾐s gLW l ,7@Wu==aU='hl6~fl?_QLN"w0N&{s؉Ra[;\ ޭXK]9GF9ʹ^9pm}QP 7h;WkUoο#r]C![M44[{m')$-!JI+'7? hEh* ᬴76#[Nu]”N}]k@y W !EvcJWQ&yi4&=/ifP>{+"S!ӆUo-CB}L8A  -=S/Ľq ñ^H6z")?Ȓ̉0_lE9eG۟OFF$/Q f\ ou֟G([Q:]:*%}KO1)Np{VYEcYaaÅ(~'xOvNQ]nZm)O57ʖE M6ޣ/i]$;~ՐO?^iJ-K]Y|- "ΣӜL]ٳ.7c5eL?\y0wM3z-7vaA/L-ijضض---`ض--`%`-b#c`666#c`666#c`666#c`666#fU/nm!hotW "gܰf sBU i^7H#aȗL|;Y5뵸Sݛ)H w5+YdpҞ||5DZTNiJ#cZ[jrpmքկS0DI5h *` nfg<4F-r'e hB(0NAu{X߷Ül`.joB& @cWi&ij~`Z2xZ_4QCw쾽:vȃI> Z=KlCD4/ 9|*?M0= 5~J8[726E^SYя$1!P! c:Nۥ73 C`\kw !q@ n'v0qq>{(@=vP0[OB}=m`єp^g;#ZO)beTwIcF22#=o\GXDg" ~$shҸURpEB퐘Zx)mj'M [h;{r|N [%b>CZFQeZ8ulUczZ¦ S.}m hYDl޲v/f.>imgn-R;YO+VcVҡjb=gy8K/`oL>FzיZx#IȚ) -D=! q2Z@\N޳ڡR<b]{)枟zu^om;}{+1Iw\|7KwvoYG uYNW%}pH.clđ[A9,qƃ#aI.IUՊ]i+WjAoY44¸5jc!f]=BM#`,J^ϙh۫8e DzI F쇹S&$(q89JP4/nʢ96aFL;*|̑ԢNG *׈eCuR4kJ6z![5%RWݛ{&*x^7M(Zȣ!Iڗ~o6(^}`MuEm4p*{v̒3 ݀ `A/u}akQ] 6 #&+?֝4!C̡aa(Pii`0 `0 `0 `0 `0 Pf`0 `0 `0 `0 .G3Nmy< By|WgA<)<V^:(W3\OŶcwgq F5/}AgQ<2 boXV?+G1+eEoޖs]g4Rpx8 HS ygä]TSfTwgOyJv@,e9OO0' nxviGNnPp>Ih=_M#~Iͫ}3iAxӞt*/MS; F#Z>6 lq8-+&P##:Qny0#9=fg@=SCr&VꋝUR|6TÃ%( <PJ2qb={^?l%f5j;cntR2~ +Jn(ܹ 8AJxt'sr0ţǎRw5trrِ ƭL7(]]p~YSdJ#E,?w c"_{$6bh,M~<)+@%zcV!xL? OP61O7y50[17>p!9L%p^Rg%@F>sEj蕔b>j.e¹9¾oT~ch4CrҀbqv w#rgDy߫d#hM?I+)sʁogJDB hZkj+?>Gr/$ÈQ_g rcz.>v&StR -c8>IEmIj> 'PoSZPPTdzGQk3D:I퉤Xr :^fdFGyyX6Zp7̀\R뤾FKx o,v wu?s+R)`zfR$kxz/OwSw=-43@f!.<1{2Fڤ=cFw+xCN\1f4O '^v.层v8$g5\%[@@H7+/SsW금 +^_n:ƛEp)][*~U4AEC(8:_ Mͼ7?~kQ>A{E}**TAyP/ kzZŋ04R@J"AhQ TPhA(jyxU0PD+0 Ů!0/b%j&$\E4bڰ[Z jBԱj E@h-V*ՋA"$\Eȸ"2-r.A24XDѨZV p `Vp-X ƋK" j[ "[ȶ-"bشZm2.`/r %Eh(\ [D&5qE`H-7-`\ bhh-VHqQcb-U`b`j@ƴZ TZ-,X AhZ\Ebܷ bňXX-@ "-޶-jصjڵޅ!!"bbZX.H-X-\+p\EqA ,"o["Wȷ V-X jZ*(4*8Blm9"ܹbذX\H)A`-*pr$[- KKHB0 „(  (B4(  iEXŠ€ !-ҭbUhlض6-hlZPJ`l[lbXb%PP(-FB4Z*[,Z-VƫbبEض5ZV[űX-VV Qlűl,ZAlZ6*Z4T*,XZH0cQb@H c1F1bE##1$ 0cc$0N*(Kh.EĨQhh- "fD[Zj%XDH$Z)UްZ B Hl\ xj$Z-AjZAb%`HX b E1!(ŀXE$X ` Tb%1bPP]@kU?"w~ A(MEPށ`fTh/M常`ĄHcG?\L.H B)ZыEb(FTHh@B DSkyC,]s&!E1j&$E\ZWQ>a㈐c# bs]NQ  鱋$@1kA\" ?d 2" nAD;x'OU q(eb ݯՀg_x@Z  D8B r Pm]]6/o߀młi("T#e|UfA($ @ D %bf4[gms|(C鬑ѫqUI]?05Lx&l%z 4.dfKX\Lk^sC'tAH.ʷ`paܭ`Kg=s.3x&:|*@odqqQC c 9ÿԳR;k{=u0tDyͭxޘ|,Q$$^rv+6re+8褷W>gsR!=J.p+J$K&+Y&Zwȸi7Iu}+bVHë6Yze:㗺%#@*1Vլo\:5ڰSsQz|=SwiRDxpo1ȹߝ 1i ƀs;CL6 Ͻq#]穃"fѕ4eR]M5 < Ap0N"Hp!#j$XXc۸#] G ]mc[;pUKW8nC>~Ĝb) gWKrt٢XmWW]m10/dڃ5 X5v^Y}qy0Y] J)1Lj:AFE%J,MQ>=Gܽ6hp>fc?3tfpܪ Հ*D Z ԨV b3 Fߣtsp1^;KܡF{t4ںTFG (  D~ܣORtbf4c'3t^ -[jqfJXw vv\9wkZ,%\dtɹ:fa"uK'(7CݝK[=&9gj@U- ]C0Ү #Sf |=םܿ3 E|>HO)j' }]}"i Q6-*,ÔɶwEa!Sv'%|҅*L˿AnVǒ7< ЩAd:0[]Y93An 2"L? +HDsí'=[F"^8`~ Vp4o ?WUuT ET&1 /}&{--nn&1"ƎFb8~D w`|vOI]h}d(!AaЎr"#F bV,X"DpN[x3u}'_%`BO<) x*Xg C:@ńಷ"w5]r,XExP(0O԰6LpU(i4_]S 1=vKL6]Bޡ,2xel_r1+hs2e{p65.†bAaaڶ|Yϵ+ ceWy(zQ{e̟fh`=/|iUy'4:58YpΛ͚"^$MތP/ڦg0sI5\B;ouAJ.@u'L0 2jAJ׆{|͑D6H_qixus 7JZp?,RJI<# UmyyP H#V^ ּ!2;h5=]piVa[=s'Bhyw@Ȁ'ATU;ۘV|six_lz<r.؁h j>e}.z ep&T-C .=]3sa"q^|/vpoQPTR!"6M !b(@V,EH  +(0dHU"^$U T "P5c刑piw*zU8綻n+ӻlDow*15jZ1jƬ`5ՃT#VAcJPB EE* HJ ÷%}_cej;BA[ GlסUQ(\0((%q&!1cѠ61c1c0V@#Z A(,X,X EbX  EŊ ы,Z4F1HQT fP㛴zOngJSͬo#,_[Վ4\Loߵ ào `cV) !v6/l"/rU?"v,F' >۸ziGLǁ8 u޶B;g(?" rOιt{jgQk3l连 M5i8İC[J$/_zNqS3iCd"M>-ɭocɴ#e tBl a>9lߊRG8P|Biwoj0{V֛ٟ熮bP]i_w? OЁj8PNB,*PB(A(iATDd(PCMOxP*1幝|n/@4^K*UE ""g/@n^֪ l!ٷ(B W!iMY좦=_ [iΧ!@ J6 .v <`Vwyy±Rqg"_E(X/թɌ&0xbb͎͔2ި[Zu?x"z-2ʼlR%f zH |3g|zkH$k !yd bnB@:~!TBoP9C0S ="É@ @IA=GU)xA?E !UAuJ.P 莚 'xET{։zpj2T6L+h%TD46F zBdуhcEhAP{¥Dq@ ;2^Ǩ71{9O ݲP:Ob%hU}υo@jNA<>#Cz_K6!( A9o[=jo=**Ce'>}_"Z )E84A3% a%ʱ” OS%2 IY^ q~u@=HH#jБ2AHQn|Վ8Ru+ݧk[ W*lÄI</ W>|rwS@Aoɰ\ʆb>z R_=H[BcuD}O+ak\gV& $=Y]\Oo{YDdKs庯[qrLٸ?h^|,%feXC|kx_uiAC͏ꍂ[E슐01ij<9]-Ax;x̉;²Q,5#p<"h.РSF*_cknޏD!!Z L0v^9V X@K @ /BM:I@̥-/nq|3CK;t AyA3qh+QwAv ^}@KA ` *ĎD08. ,%`D" X8 Z[A/Z$@ #E\G!*]3ULȶ-D(4$Q,(=gtQ}ƈ ( ;MltEs >N9 `!6!Q"|(!Q 6Up5 tG -0D^;gԒm Sl   ȶA TThx @"7(DZ, vJ @A  Th ):31`4?;Ujq@A_ Ƌ̀6C>l*J# G %鴻ꉊ? "rw }[.F}lpdH71KJ u :M9clXxT?@bP1.TA'_N|=#?DRFNDul^ FADVL.(.^# o~R6?Nj96cݙ"-]`kE1 f|t 0C T 6B? ,‡.mǗڱ뾉I0g2qIit*/@UK Wwz} '\?݂s^;h!+Q P̅5<` *jcTPߥKk3%Z4Kk'F/G^Kr>p]s+~DXj 9^C=3/Cl,h`0 eSׂޤtKǼ, DMkwK4M%P>SYKSN++~=dn*8|=~ߖ0)ʟNn r}K=Ϳ@xJkJY)`*f{9Ck;1>?l@ ~ MM}:[?Va2+m{0}Mf詮 o˪=<_xep '!w`^sFg7ZQ*jS龏 _o3ppc?|o1]Pxt}2#Xr5HZDJ#"VE BDX$0#1`ŨT(b$F))`jD5{Hjx5z+4GWk9C}"z`3V;].}_QȹKwfΧ$5D,?H&42-F vinzt :N7g=47B`}j3<#Q:u2źoB۸ %(*'EiV oڂS%|^*jFڣ |t{J }PBO}~=a,)B`b{m6 ,˄}9%c O [÷/~W3h`qoSE+4{elYp<BF]{#_Bmz- `i_OmG-& w5%06ZKネ(:Y@@ B,9DS;m__bTz+D"C~E5r yajdS  [j( GcMh% c 칮Nˌ>Gl@H_I;6N6p㫋mvWwBDu|*a<)4r Mrq"!LD!w0ŸXOxC `3P'QWS'T)Ai%;q9%x{_ %9޲07>o!2/ =(mTs<-^ ?dZS暒⥛ehyIѪ),7Kpq$=4$YgԾE4k+|(u*4AܨX`0bsoI>GYx)x'*=H}"{rȁ0zDdB01';u;n @BZ( o(([("{7(r92v80d(7irJ:ҟLDAc+)AbzcYL~oi=wr"Hr+]W7h/5 H*y/}6`^yv=]iq6pݼ@ ;vqڷ_S)d:`F@1?$ua*!Fn ПqW㚒Mm+-3xES2瑍F Gdm9d{"b;bDXk[EE zk@MC+ @> ¢hm~``ԇP܅;`|#> j4L+yP}گM`T1A|_ #w4_kfȨ  B4(ET@N=n( QCcX_vFrDMːn_e;HLT$@۔IpZ "=R0M(zK=,EDXfPE R@B 2o]I-#Vg (%q @J  T(T,DP=@Unj)?xA LW9(NюXO"c" bx" V4QժH5-٢鴀GT  kCr4,77Opm|-G lBF69R)CmoV- e ڄ* i"0u0pos *׹\*@V hBjO;DG~W֡kb+Jk#xX{ ێ XHP?P P-DRؾ,NON#ֈ)Ec^sMMޖ#މMt$R MF>zVbey YD]~2Ťi/mFH|ڿb˿![dKrJs]TAI7V5\t^"?ފ%WrrZ;AA&'~_ Tr!A* S O¯H=6Wè徝.?oqn[*^c$ F{$'z szU1)~nu- ڨ"rVځ06CrfM^=q~KPMafpAcĸBvʯ?aPgAvr@8Iߙ }ƪcF>u+\C D%*m2֔XbT'ui t,bǏ@"ԸYFQh3/`~40/<g%ʀϗ,HnVִc mMya?ARQ^̇pYa#FGa7/|_hxfLJr;\|*ڦ-5)tZ"[* . wPًq¶G0ֻNIz]e1ȿm%Sgl3u/:9@V u?,]ܠ'6|?Yj_$:㎧C BJR,T:fM-CqŌ{ԞhuPi.BYqa +eLʣP@z࿞ް+p LBBP($!ABB D|N^O~_ߒ;0QcG^;T(}"*uV"L}Q.DY?O%M!uAQOu2z>W;!_C[%CW[إ;ଳ fG4o,n/Bw,&չ6?@1(9Foܰlu;r"?Xp0+/dB[+e&M8_^ڂZ%zwwYIGw<8!1!H yΗnZuS(yϷ H>+"ݰC`wK{mN眠}t41G04H A׶hy#p(l5v l(X! )-X<ߓ@),Pm``(+EM`xZm P 34&p Dt OT, "ɳ+q3vHu/vce a \d[ۨ973u R*E.'K~?9߭9.; ך@>@t|y/1򫡄Z̊B'^zqio욳]#FmXIKڂq c!NQfpY//!{:q޿w{Wߏ3E (A"0H*DD 8D `4D~߀47o>l5ʨ~0zyWݵ}:A-Q :8?׽(o&rYS56ZWN9<*ܻ H!-&IQ8v4<A{ֺ~~ںF*No:aBbU<'3BFkPnes*"nTB m@R A (x6@^΃$PHHd,ZPQ (cO 8_D-YQBaJA O`6"R|ex*G||B=UW] ۗ(H$C2lbk%=D* J';O[@{EQl<1C߶qG&;?P8OKVXȊƤbxOG\w R!D2€TT Crk. q EBT@U%)7AP LƤuұ1X1 c_ b!@x' @~RwX > PzcA /vef9E62Ohe.I( ~A]H#3f;},ѪctDaH&:Iq{ZB ڕ侥ʉKNrMs~%xE 3dg1-"q~:WY %g:{m0k LA}Dg1ܧkG[ Hcpv4l Tf9Au%|KV<Ҧsi,`>!ӯT%Y{~eس="͍} 2@Jö Yڠx{n>yuWR$E,51?e}v6E8"?j6l^Gz@J'1!ѯe}y5)1{w^{tV?M?|tB420W& |[ |5 3lTI k~~p煞db_rJ6ow'r{'j\BݯC4Ch8 }<\PޤOZv^@ܣ?аohտWk,{#@ @‹CczU?`|lgIUY Thނnh"m=gWHD'H(~0 PtCGXzav*..[U xA@G"qj&(ɄA"W(ih#Q?N9p5@Trb(H@B)Q;,Xbb``X  ,P(0.Ub!; 0b4桢E" DIx>Q6:BG{W@ Xl6IQ:cv@E1c}m5w>M:1^"#@uSJsvbQcD %[v. E,L!VK|EoGTe$.1r2ХY=0]T MamуöU2҅)<X2'YL` gOܛ^w BWʎ~ *l_~l;%N, #V֮/]+*@WzGrR{)9e#[+n !,W,]ƍQwgzN83Xx aڀg`ՠ9窕JL3KcNT/!LQ6Jh{TØګa 9]UB BLB A D7sƻbAuM 3E4cA*L_i>[mIr6W#P1B KDI"Bu& Q*o 92Drs~u. `ЮrJ"[p4C #u2D&+ njP vGIYJ@&R7W"~Qz>>2CtΓg/6+pM  Qk)h (e9jOk◱֫}V^%|3s^&Pa(6b4Cx.Rq~L}nm;i~$}=Tk"D0ƾjOA^8óދ/3T[;a$ApgE^γd`~ iEl`R]cߢ3ZQ"9{!v@9e 2g eM_k4 0plO3tfٽ5.!~&^U@ro$/g[zcpR-1c^#^qY3Go9υxʨV-P#:+}YG} 8o,mK-ӜiK-o%ukkr+_R/YE a}S(ʼ՚NkN>L3Lޕ2HBIvDrWd]!'9 |rZWf}qWÄ59gdYVY3Y K6ӣ?ڪ?6o#EZjӄ0} GJ3*zkgG{fFpc]p{<=C֐#$0b:=`9oK5y~n#^ cV${32D:]T&:YDy#<4}pye[ÍMi%C}( EEp+OL{X Uw? .tW֜VϘJّN^z}[xlgy*  o q?kvyC]tl E?ϟkXqr۵~al},>Q#~<@+9$R UI02TA1܎}_)X`i(cie#>Zke#R cALDt$S݁8hN =d둭=Ae*Eq2ss=/~"{3Pz\jsǃz.CD8uYk}|j2!WeG&MlV T++ LKR*1 O$sCS`.B2uΣwkflzfzu}r^ʶ>Q xT|=HD_z}Y㿾X<}Gc0fʯ~<ך?GȐj^ ?HG'I 9ѷx~֋u>!B `H$ ~JH_y^^(%QZ bR-^Glr>2[ݽgQ>^@㼷NG9 !&؅A )<ާ퓢>?oo7=/8^'bwUњk\=?e) ^ Z}A QPW?C~71$eB{Oɝ9jw2w k>DOaxAn^X``X,/}XbXDE`@KOH!@ 6`6P-HAF%"ZPԉjTbZZ!@R%mQih. ,Dŋ,X" P|8%"ED" A"hؠ5P@j,G7vi#PpUEF()Q * dwB!]5b gP4@Lk!-, eh\xA_%B}9TDCPCR U i&D zT6ǓFA2*c@u@=Ob(,-)φ%DB1Hms5@< 0ͷQ o m *z?tLQED!5!D@5h-PQCm\*(+B 6(nDL)A>^x|A! @F 37> XžjUGxZVN03H2V(S`5BI|0[^7{YNF<S.Ȅ|(Xo" +ơ^x!n )(RzPӲ}D\{H,ಢiŏ-!U5d x1>wr_'LPOoVDfɃ ʓ%|U:]RzY4T !ny%3M;0} Wh#Ŀ._?򹅭jm!|]\4SM/L}{Ķ\oʱ3q[pǧ/Yj-g߱Egx=rd*u :4.eQL|CC܆&R@ Y<%K3*V6 R@<+0b a ,&3;y;l R߈U~>si9< <!tV#)1ćg|^7}U?4ѝ,8^_X TIƫvIU\yqV> 6K|8 U?g_1twdEH Bh_:o#Wx֥5\_:68A%L,Ԭgv^a,,  ]|ȞeՊE  J(TP *K@E@PQJ A*% =N,79n"x` "DHHbłŋb@-*` <|F!AyoQ|ee(rT@RWET"@"snECE 7Q,PEzK `$cDO"P0T//B1[Db-չ`,`'X\ Z4)EQHF*Ȩ^(x% N Qn V@pV Q44i@DC A6-$ˡ QEP!Eժ¡`LJ*  $\-@H%%Z%A1 pÙ*e@ jt 7k;񞡚]mcl8@'T 8Pp2rmsP}JZcѩom=ȗ5_CDNZŲ2R[)ܟ/I."f *AQO{o|Qm=-z_$;߉fHJ!pR=&cCmqz=:ofsRCN7Vz;(=G2BqQ b !~l5N 5af;,qeO(9&&3ш'ڢ>7?,VwV2&~/Rw#=HJ@WK_@d߹r _[xK9ֻB3׻"sllB[M ~,(HRH?cY%RlL`BR B8j@2;\l O :]{:# dn{t'sj1/aG̀!",_ a7H "%b Q x` ,V A,@R;@C AnP BPD P U T#qQEĄk.߶ǞET!f.N]/X:cӷ@`ިJH[g p64$}#(R{D2q_Z^&gſYmP Pu2n*-۾6LH!`o5P/D=ZNk@rےo&๭8͕Q%EJƙڹ\C}8Vਨ֦]!N̟VH Z ݯ}:E̒Xe2H@-HQQb(ovZ +!Y|,+`)`4A 2E~"\#!zUAv/O1oU>_PH ] h:j tDDOv `dB\ :[kgƎA^(a&Y ux-{6QBdEF&a!h4wZVA;g x\b5slBEW.JDP1p@qo~g~{_AŮ2xFjA{t D E`R DEQwp*4QQ"fpA]耋 8V Z 㷚.Xf*moMw!p*p!+H>p?3T~ o~Kfއ_$ *!֌c" "  veumNJ"ӔF+ODB-)?\>-Ou=8"~qo$!vZXQ52\|}[2/[6):` ڦC,j<8 ,3x& `Дmc&ayLc`C^4KB}4AVRC;kq cJd:[vN+oڃ#{}9[Z/aGǑ9]n0Qʯ#Mlk>Y 2Z o u8d;ZbDMTi9Wsʅկ kpݮ^8(fsQk|Y[WD{emDa0sƻQ!mSqK^^Ħﺫ)Pa# NF}汾u?ڭHu>nEnMW~ CF7 CyPZ'mO\!(f,7|ⷘfjӶ˟ѓw4PtRR.)CO6¶wnALATic_TRO+; DžpTmjq1՚] *n,DTo4U#fg=w_:bg|!wqqi~Hw/QT?@=ӂ >;`Z#9@V Y#WͩT2a*=Yg&exEY٣[۝5=/Ox_K=oZ5MŎdձI rÖ%[v0_6aD-`ʹU6=JtCJ` cv|D^޼i (<9'kAtлҚnVc ~=8/ל2OmU'E0^ҦX6%?M ?!]K4: QpX.P Dk]dZ4a䥓;j8_-`]/Ed*|(r+U) M[if!Ȍ^.QI^Upu vtãc3)>0 rUں7Me|o. Ӎ}0$P>'`$*!1X`*A b H$X@5DZ"E$TH @GJ #ADy1%DB@Nmq6 ֫Q(#,^=jQŰJ-LB@N1 |fxٗrXlUUV &5Tuj" @TnQ pA1 aL<A (z^]7߀@SlG<;ȍ43 $#OyCCWX=$ӹcYF(ȱ &2 rp)K dBC:t.R2E`ez ּ5#=-`x\O@$.Pqu+&VTLN}W%pΒ\6(^ sp~q6{L%ZS >ka/nKX.q= iSb(i3})2cX"bM4iռJgGavяdn~>%{Ll ͯ>7#E u},┰hCzes?G?0hz/ڲX^8_&LҼ>Ͱ탔R6aJvaX@vG#oĤpX~TnгBHޗg; _YiC+ hF;E x?LBtU> v q1U*/=%`:.[;J4cjk?6~mLM^zrLǪ'`0lX(.&(\drDoޚ45dKKp#Pr54R d(#qw=עxrofotO黅>ݺska<9O^xU5H A('X b>噾On7ϕs>-SNSJd Ԛ=/*C2#\_i^x3aU+JEBBW7ϐáӎ?CiaG;eGNy"5~0F3Z^h36+AR׻;O菱A:$<ύoJR(W2㍮Z؜1c 9ɬ )eᘍ s (oKg]X *z׎Ӭ~g@' 1WV<|"!Alybm=C EMu- p T?]Z niP B5vBB/~9j>^}rND@(kOx񳬝aXK;8j!9u3[IuBtUtIIipc5hP|1iou=Nk齃fn0+N(fɜ \}n1s{cX WΥOzϒ6 ArWzXd╊k!w>(Z]JoB|8 ؾRgq i2}"TgvqZ(yWĀNog6psyy 8rmΐ=OΌsܺG-׏ Uƍ eitP',;cNօlPvYٖnC;/JE}c,+>Ni\m'O/6BZ|Lٶ\qr0ri4RҾÖ+2|7l P:q/ZGR?S#9W?X_Lk*K&hLWK5$]4% R777^ۨ5sQQ't{Af+=-WwCRc"3FI%? +z8 ( ! ס,VP/9vNPA9s}rhƥGr93Ft)9 Ɓh%nj$;qP-i~c?DaszO$'}IK-F PT"3D lQ 8drY7[G1D|vj [ ZaoL?N thՓU׷s&YԒ_yS2NҒdcwϽPM6 rb jw=3QC[ ʞ “ 6\Ե͝d]ax0~vuO YnX 5YB{4##h̭FJhk#U#~eDz@vE0ĿAѦkڿ 6\xcjwm rhỿH#)6"[bHT~VFĬ-}F7Te8q8)Tٍw`Tߗrǯ:FJf'NzcKxCZY,)㿦8 +<ޒ4 HC.P,$JJ{`1Ȭ tŝes`6UG~ 0?fgzlwڒK&:G uX@Rc5. %>GNѰW(!hP((!@A  P*F40OOyT=^o9AvAQAo}=Ooo|WsEOG3emWjbXVbUP_xzN*w4#Ve#J7qTѳrmēT敎5V k?O?  ,- 1RM4}VggơZ\|#Ί[|ͩ~K}\rJ P \0#QL_y/D.uך:.pHrlw/#c&P|vLz;ǵNWB$ƛcASlm5*~e_Qulp#ަ\iqj5_9;>͉$&[՘ͻ'fnXQ,fzݕ~3`/T( uu۲777BYP?jrlpO-[ŵz?1Itf268;0OM,6u-J#^| yĄDODhbjҷ5o,\ hkvNjHy "k}ƟÒ\ _QیBO nZ- 7Y&w͔QfG٦6dkpJ5ZkoEcwѐtgǦ cZZȌΟKlJezP<87~4j~^-`X_O<U#ܸц"? '3 U$ NMqnI6ēf: =ϥC+L'~jK]^jflW!L]FWgH;2?=E@~G=??~--0x؉@ QB<79o8,Bmߑ;|^Sg݇Fb+0k[En|a*.@8"~uɾjZRMg3j*.FiQ`K܃N9S]@O~`4  S}];,-Pٲ]ZtmS:goxցKBK)m$j" *<6.XyǏ4QI|}bE_LE P崓E; ;5\q!iRS8yr3!AtK[1Ҽ՚T@T3OcʷVsAEJ{0sk4w5QX^/tkWhOXjducCi%q 2(*Ail1ۡ? $R7X'h X#M8'Dp}`k j0Ҟ7g 'h_<:',ZExӬ;=oa+qI5P3TilIbeY :1꓏x7-W~u$@2Nzy"o8JhQ1T7߸GQ+dIqDŽQ c> ^paLMƕ ͖ce>V4 ]RaR'I{ ࢪ>{GXQ(C[w-ovO79X3䭓Hܑ@fS@u8  -'m'0&-Ȑ$gzg;ÑT!r}&Y$k \џ`74 G5P)T_#67Y)Hrg:HM 5 (i[^^u_-śOsfB񸆿G#m̦TC X|:|U[nGgtĚC{Q+8"N7=:0#is \K>ߓ'-ҚR ŻRI{k6oe7w;_iQrQCx̵DyVqEI~A^$ ܩ>nʈ%V`X"E72Vf bE~GSXUm?eh(%h_5Bڻ"aB}CnoT#*,Uv=QQ@zgփ[n;o*S$ cɟ]4i6SEU3Qf3cϋcn;T9RNdRyM&%X"~h-ҾCo4P'=D$r&PN(Y9\2ymVaZj~E;s,]FwC݄Ŀe.) VpH/㮾k;1X]BW_۝]e>DgY<='%+lełcC .ELd=nJgĒ*5j;$^闲*V<Ҍz])«UGʶ|߾k&w .&DͣoH q")( 6\ghEH_ϐ=5l rK' N.wX'ρ"iZ:l1ZB^nsQO[M'0&v(d?oMfQxɑGν&b n_kFm.f ysRS}  HN1O1zYnʽ*B逐/q}cQ]3]5+Y;9^e:ݎH~1pP==Ѣ,tLNÿˋb.]w!aTo>RW*mVWfOw\Wg`sA#P|o'XEt@K Xl 5sR_OՑSȦ&ȂQ GuW+sPi/(:5F%-P7ba(OG/͠f6Ŭ6-Hw}keYGW.N2),\&x03gJ}(~ XKaݬҸb!ԖWPdFA1蘿7M%&?!^#E"56 IEY՗;u"㓍1;MQ@`y JS3e=jx}s ʆnIwpI7*n ׵bZqlCE{1wP,tϣ:`0iT@c9ˁoFs['ܚTpae}%knYzv5dP)8ʻ'ޖ]dn^Qydo.C1f^whzNi5Zy#+O?DqDdI`wTX Wck:o@Jɺ5 9=EK@7ywpu[ %Co%ڬ0M1a&0q?y:L: ҩn:ܯ:ci'KǐâәW*EU6#Fm$]Q^k{3hp$G*,y(yK+6JjE~j0$Τzd.m릧4 X7IΣSӝ 0$2q 1mtć7)PR tuYkYLlk n KF-Bv+${ ]/ 57z!^@oQ4e}v̇PdoP py{ 6~ّ28 &t |q{k6% 0=_?> V˔S‚1}xҳw,\<*Gݧxm1 =4ͻNKyOo)&Spu[yp8 5ʳZ\2U 3!X' S`7zbvCh9L6bRٰGvwFw&,P;ۆ>|9E'WR"_ oKDez#/t%TK`V ,b25UPOvA*:l}!CEv_~dط HOSrFٛMv \wB}?Gඣڼ7?ltA'W7qdbۯH?UNr!gtiz2T<]: =-*V.R[r+or+07H!+d4-x/߉OI|6;=ERSafiBƒWohBP=(ܦ}NRN0y-R(;~[8GsNli'$7ʛK8^aVXT:y{O3GJ3+,͠K}A{HҞED efvZ#ׂyķu+ӧFp TQXX盥"UM2$;˽C,Qf*xwӶ잛,tk(1x󜖗/ o,܈fAGQ#H~o%lV@lCM.(ԃvMH2{1<w"W$vz+X ^,?ReiyУ̿zw,':KiizSRXQHS@Sϔ۹˺jC.#dE;9a$WZA'!dˇK4r6N0Һ❹99f%@?=q}9!5W\se:侭6 )#)"z)igjm=Yy SzlߡRF=B:ȴw^q)vvoQW+W?!]L[ojZy3AYFګ#؄zDpVDaSD ow^,A  `_2|AI@D(3q,fPR_=hBO8V7CЄ\5WQYZ8ao;X(Lj{ʞ|Lނ6ډ-;.4]`!{<?Y N^AsD6JtضG_&-[¤X@bF7Lǵb*`KOIyPtvO@:}˪rC..r"k$`g|EPfO[іHy]oAWF:8;HkvVX!KB%0tqSxgUŷR)OR;y8/Ac:]8(ȑֲ÷.8^WAZK@VZt⫥:Bbq MV,i3MRD:`O;gl up|po~qn׎.eKPa&ӽkіwخԭ20ɨ:&;Wt Sji =wZ~yB41҃'sK+[+̌s+T?ܿm/wfky}nzX0V҄:=Q7GcMB |s'_j[)Uy9uKʸvxZtFGK1ޡKK9Z"Ӥ- uyu.A7] *"e偁5i>ɍ߉lyH3t$Ri}S5f;Jgw[>t诰䩏/{㝰h[j}FEa "3VMOkuXV,b'&aE>ua#RBn%"$s ?AxlXwREϯ}ÜS!?"dƅkFagl< -}pMV4r&'& #aswbN'r$;q)K+#? h(lmd۹f4 2B&%}S"/Qlr{e7[H5.̈s<()? Gd_p9Qڥv e]TՙFYגTr)N@ N=Y S=1 .@[Z }4ƒ#ҧ;@]C*[v ֤cthjbG-ɬ0АK[-oۀ='N\"L6r[t~Pnb_t3 =8/UX.0D1͹=ctxʍp%amЩ\I]z'3L]BCtY! C)zRl_uڟo AoWU[Qf$]j#V\ض`E B[=ad ۿd}h H̭Bnw?Q 4v6kM,2LBˠsl/(Ag5at"|1lՓYi.v>X=2k^?Xr.FTGq MTDhk"=H9dgWPǓͧ]EyG,nTܮAQOB/Yf!C+V/ϛ["v B;VE;g0jcN-l BHN:{)&{Tq}wBvg>#}ࠟ+bd/k6WO#gʭ! >5?ݍ-a+zZih}NJr ҏU}7ΧꍿJ K7uG S*L0o\~k*jX0ϓ]=dp% i7YV';bzhR^kl_c{ 8𧡌E/7<.9ht@,؝.UNf:;Ffa@̣'33tcR5P ܂jRDV{G_]Q]+S)tx6~H)qЭ;m>(FE]ac7jMڞgv]&n42%N0\"U3쑋uQLPMK. X9L9&Ov5y4\nP(J gR=dl9Pt:RiYk:;%I@EgJii~qH?ܠb]*'dz#J:\sГˋ%x8+-g@$ /9d:Ɖx +<&DP @) B?|V&:hQUs]ISrMW}^raL& Ǯ1dTmi0a)mM_"Z:Yl~8[p n?5|tG?YWqSJ̪h qFG\Tcf] =g@j g̡h03v1<9HFtu+*/ NQXTM//ʦY.wrh17o.A eX|N}[ΰ=.^c6 Fӳj`Skj^Nyٜ /[Ppy pq k6Uz -LVnXDοcɚyQ}p|Z,rհ8xq7"| J6#S )_8hD bU6^"v4ԶTob ]'鹖J,9Az'8'-=V^wGNH0d!GWo{Hzbu)?eL=%f{lF vNk-g`m8&Syӑn[.)9b-eWbqI$檄tzo=C7P?{@@D:!\;A{O:ˊLsN ?xyfLq\odn ȹ:nҟRO9>!G&4"y9J}{31aHxq楒/;s:+m u:H Vš짯 ͳuJidZ|bYOtM3_Wb^ZX|lrV)Gt販 óPR!C|.]ׯt%z[ t0<.A2Gv$vͼ2s X@gӽ/׷0l긥$ uGvu7&P~oԻfDk!<߸ǵ8eF1pe@Lm)E=:X:U) ݔ@iwaݓ=hvƆi|:dԋ ~[rBl%*J tmbI~>SK4丨IGhNz}E&DўvH*1mpeDV\ʊfdl$25zgz;*,fB)Χ~D7_G5庺ᛂ; p^K5FYWE6"De,_߃H1ޠIG-o A\)[ uFPpXʐ}UUכFmN+c`ol]]0sξVVD=ށ;Z{5Kd)$]17g0桨48zZvg_$?M!680w@Uso3ŠaRq3]b Zwu dk%af_Lt<#EfdT/&fq6L!'UTC-I@, _8\D5Ԉ𘦽whZ2D}+;̟<0_rI2[֯H_:Q}R`GLikHG]k#:ǙwGbBb=IBUg3Ėaלl\8 jjBVHxJeTM<0$QpW^fp o'vM'>0%-"zy~Fދ+#k\rC E@QG FBOsR9Ad02$MWe<ٌ(UVĿpmZKCkL>_GĦ͒l%*V(o﷕E MpA8B(Ķ{k!Q{X;*N8Ƴ?<rDOC`7HwKU%*gq63E=_M\4EXpt؟ܔ|)MggG#?!5 Y88FZ_@VT =t  ]@:y󜠫ǩҼHIH*U>'Vj?M)&,)嫭F}M{:kri&e%of9Ǻ57fU:Vƕ1O뛫-?Pn渤3({g-i #$# aPMS{SugFc7ڤ{G]IDӯdiksņTZ!NO"HIH2_4DQ#>pҠ* dg4T֣t;1)@Km1?F[m·wH$-mp׼3frq'j.&ӷΐ|Gڟ;Mǻ4`Iel9 GE s !8 FANUyYIOP_`%IzE X?hRb~й# J ਝ 4IP5dt}úxVv?~(I8gJ0|4YQ1Kd'kmt5K% %@8tOfǷN7G;6G,N'm<|u>pl; ge85kwXFLoY,ΛL +Zjk%RBr>e:j,|#w~ 9Dg@F+jvnvv̓<J1sRB)yb6᳨^zx^iȓJ/MwW]Ǥ2!o-n!Pavfoly> w|z0<6 XfCcEpE]("zk(J|QZ}mC,ZL)y2D>| p!3Z̷9Zq8gt8kK|QTH*Am3%WC^3iEaz-?XUԼ  E?9x[ ̔KIV72bPAUBXMSr5Bj}"iZi{+,'?$߮!p0<\diP$\WVeibM'TAnrsIV1_^ަٖ8{EEx57N5g@lj|WY;ђX Pߣ,f'P4oǤn0f[Qao^[̚n94ʦ^2mW44kvwof+,Q!XyAP231i͍$M'ĥCdA<-L Le)opԕ=0#I^suL-WѮ"%XQLIs("R;[1"LJ2`@ 0qNy-,*\2[V2uGP[.yfge`^7gTIZIŁπuv>tKDWANdG"ܐj2vk4=_mE};fa}Y*n }-ILDJ:q5G汣 GTz+3vł1eY&!=}J%%6N7`zs xkpUf28O;Q^ @Î_74?T7 90غhChH$M(dPRTSe0.N RVx}vUCIJaeƘħ֍́.rVغ iE\.Mq.̌'}5ڛ{!rҌClh =ױUZKŞkG^>܂ۇ'p'Ng^Ҟ{@Mi)w&r@_xz$tM>k+W[ߴ?9V`rl4os w|JFcZ,DP0<\#8bu[TVw`۸Z,dƳ'_z'9(/̒, _i;k|XdbfD{u)Be>_G*4=Yy&LJ'Z&M [ɝ{27zsTeɧ HT16_q%c*#C::|CjaRz)".VBc7gQG珧AmhcmI(7\@r$uFvt;s)x z[> + >.s; N!ʈءAayg>N `#F_riy6h\P٩dd?P{Ud^A#M`u$JARœHWO\^+ۋ[y4vhZO2Ͳ^pE[P*ҩP؆}G0 e, ?H}(sQf' ij&QU<_evTA Z.w6!tUN4AOy켭p ൎ%Zs?#kRـ:m'e&4ηh%9:W :')\~J2FzQXIYxmwQva6} 3k5$q#m[WJ0P썟z/%̼s$ Ƥu0bۓ˲o۴>[o} 35 5qw.+&i 9* 4DbO`Y>1O+Eih?.Dpr\6BXUT|(m sZE^M0ck}ٶpJ#Ŀxls%; jA孆f飏## ݐ]LN E 0c;@!WH{@K5{𓻯m-(ϩuEz21@}Aݼál17YM9KxOHqG\=kIsrdH̜@Blm\ ϱ:׌&[k}-Z#G3:.~7dX[u hyYs1?){ ǃ!b=.'ޒoFirȕ'#P6 x'Y7]H: ֛{evS'QʁjYejuaHvݫK$ُT[K[c.rR| śuDqN _Y`%ϐ$U7oL$zG;VaMm6dGx?mAY/v!支1t.m%M=sΚ1T&y̮6h9cA7HU'YkvO T]d:B0+t>Əܮ錝HEzMv^z$s >X䅠}W,RSoPH=Q9d:3$S6E<, 8ro*@҃,݃t\Sl/Y^aH-GYzhR!K ἴccW`7 UNenSlMӴ/Yџ\rȸrנ(\)Ƽņ  ρ|.Xos=Uqi<]Ts,KCj#։njStڒ;4к}48nvIh?j=KaU(GpF2{@wTׁsAQJ?>-[ kkߝUIWF\J wkM9RU_ӶՇF9FaJ=Hd82ZL=[;tj>2v_{*F+֔i7,|'zޒ:(ͯT`[}؏ U@Q~=Ŕ0{0I_tJ=JH=H;bBb{>4[!P :˓Fp/~G Jېϒ^qÆ6|/ޞ#"Ur"z0.\PV2^l5 Aoڠ)X(|- _:HJs&|[s6jO˟݄ہ(dIO.Q  Y_㢹J6`zlbyKh.BM `սBMȖQ6(|1X A19=:22oc8*ᒓ'Cb 0"xuu*DZ)2W-v0Pg-TF&*ӷͻ ={\D@9ʼn?w0B|=F E3^HfKj~c(&tvj\:,$,4 ; 4oa=\4@Ϩ%AZX޼@QUcaJas˳⸇ق{`mhrG 5EW砙 _PĨ,!'_>iwgZMrJHuw{ADOL~%&crN`^h.6(f{ҝGv__U[W2|QKcp:;L08ΝZ?$kWkN>ϳ&zu>i:|C@>֐/DxMA@4q x]'h5|5޶j t'I jG)v=crQIC׻OltjKΞ֨ra#նgSbE)u*,|h9 vŌNDnWȖ"vmw/a̗t<8*W lzC!'uw5wcKSj|e׺llf==pn+oṀ3A{*!@KeDWhų# nhDL>ROa?sJw536;䞬̘\%z?"2Wѽ%>版p+f*o\.^0x42mp]4(+gϻ2WeNXʺ5$`gwT̖C AXZMPEY3KH9'F<@CtFϺOCڦ&?/u+q6C)r~fСmbNڂNCe'%XXQKƈ,2U~h}QnkqZmѝWe=E?o.+8scqu_^o_Tw#PRthZ uļ0Z x z?Iwxa*ih>2$$z"ɇ&T2kQ(Ep}ig\@]Itgx')&6@sxvF:HWOVL~Pς9<~5K-:.E3&n=:e/@>P 6PQyiK;n,T5=MQykA:wW-*.??J];IC=Hv(eR$5ŗK@wE:c~T\,ߒE!̋ T)OkˣxK̡oC=*H\ M@&3R;4<)ȄF@q9ԥB=|- xӞZVjq|X Uvd%@t -xIH1x5<iݣf0B;U['OP9pɳ3Θϗm]$/6~7ALE#I 5- S|v!jw ٝ8l86U{F$π"=f)' 28kQz9?2jxݕWfJC "4IeFUcU Vm~}c1VFO&Ccnxd *0-i_Ȉ7b' KW =-#=6N9l@4>/~{]zYy*3hBϯҼB-U">sޟW=--I$9(ZoȬFWles@|zuhŶ^m`]@2DHAi׾`UD+_F_ə ٱ1W)p1*w˯G(>@g5 $SV4F&ҟn2zXrk7ʱ!z XgM=v2@?yk1bNoxA9􏵸<ǵ#V ߉$~S}RPnF5dCG/9Xfϰ&̝/G soA֭#tM,CVka̻Xd<L:[k[VS̫ʞxW{ `1ABDn¸)E DkXo`,kw65CRo{& }ZYiP5}NG}Y1{t;vR/(4VFm(𹳄Ϣ{ R{%}@oŐhqpb -yKq+[RVB``e\vBceUGlGh8BnTj8?yؗ=XTRܐАK1W=+/f4 +Mc;?HR;!lR"LNt#@4ẟ_K{sOo (T2p%S 6wRt1I5 _(* h c)XQH02Vr{*HOB)%grk ,Y7{tC4 ɓGf5?򲠪vswrgAH8&'\[zY6Q&Y$ 7jMJwxW51RLȍn*#,K9q;{!J,gzhW]0ߠ3}xP7Sݵo{7l%EIYd}om .IG .8JyqD( 4;-wN?*ҼUܳ8Znnr6da0- K"h)?,m| sPk] ) Dj-8i\Bt"y/SDcG^Ps$tCab89c0s]o Ʌ=-e ~zq%: %/r}wC (w \"|{wp=ey'$-AۑI41Wuv#$y/Ev;[ w,Izh>;BL8 mZmc︥}zmFL?4Ϗ&`l3!yag^c[=ehriN$=h4 GE`ز*-=Ցkԏ,tVe?*fZ~Xo$k0O-Cbxi ZmCbI6pM֤e4֣{QK^ [V'~) ))۾gSZy5K L@JŠ"fkhEg%g[.]ѹo>zƷg@_,랽|u3*Dj n4nJ1p|!i[W:"*B?A6N>)k8Wn6eךŧ-rgXKZ48c $2_04ӯ4$f%O:W)=loܗo [,&B,iR0hJRnu4^eWL&`ڔem1̏#=/ HkFpmeXPy.r2& >Ĝf-]8!ǿ1k0Ca{#>eO4ZnAu1j;%b'7hC @( sϰ浥7Zmzl t*ɦ{ ~)'r4nR{VJ7*nú ҀeL ".̹(\8+dINSʤi1Nߙ27^^M:cYPb@5)BQ;8  fIL7n{ˌu7<-Z@kс)S h1ٰi͔`G8^,Xx-c:' hs #U\Z{(DG,zf9B%"HyI.z `*734(8\?У mwf3aIZ"b;O}GiQ\E׹Q(' 8Qwn[t"/+oû*d1bO $bm؛\'a9^Y.3}r'IGqzT'~DŽmɓh0-P6rRnQV5:Lmߍp cBdd2E:IS݁P P `'܅+Qgeޅu'5&zt?ϰ痭sJ9wIנvLhK7w&#Oq M?XHfN}e&&h(,xy Jinxeލ Ptw~*mJ[/QT Tio"o/mPNtsSbr "Vpŀ0`!:?$4Hl,ru3]|G bz+- Umog$K^~9v~m_VH&fÒքL]!׻AʶLxmm[vUd(T;" 6PO<@Wo 8 2!q:0t?mJˑN\?U\{BDFg48ڤ}{ lenzsؓ_K=Xu-c>mfo_br 8A-W߸hjO*z!FN2,K|ғpD7)d8vE+$cdEorљI*vbtܞ]OFCsodOiaOv+zpe F]@hh6NK/=Ƚzl%W=Mztre7zAR}&(0xؖPʈI)ݲنoR8$4g񈰊~:G$ (j;hUEHGH/A򕺵O&~6벫1fԜ UBr'OU6%_&d43GoNqΖmvV*gh8<]uB G^823GltAG['}z 󄍪5y2b+ɹ`aL\pr8is& `&GGIDNU3\9\h>+Z.n?!"^@Nq>2 gwGm<. Ħ}PYX 3ApطӥY 0Q'[8蕤$젺DraLm^ΙNpe?Q?$ zщtӚ}'_$!o fEJ;A¯Bu_؇k+x* Ett_goa، ,}%(QPғJn>MjQ 6} mr[J)] GP˛6ꞧkXu&א?Eu +x=f4 /S<AkQ9Fg@{[d$oS :. fR\U,}snrhE%b-:E0ݒF-_!da\2^9G.vZ>!IקЉ~EOmqNT'r!J曡 {bS4#> Ps2|EM%2 X~襒|W/IWPGO1[vTsQBM^UZ&&BoMt yVB9\o6~_!O=HHjJW4HmS {ύNع۟3ʵŠ#f ;P(SF3CeܳAD^AARɟԯh,A zI~c䳁Le ]EP #jC ثթ&m b9yP]LSV$'Juk./S$tЬT| dtPg/M "%1;?*uOvjc$TS}+B@@o|&qy[-}$ܙyQ"Zxn(W62բҸ@+yΥ6!,S`/ĵ|51Buvs1 =SXDSWne5`Ϲ8ЁCv oj3:$R4mS^CܣmdBP9SI@͞oQ\Ԁ%uTS|2ס>w8BA8 u9MvHޞ[ai&^d?vKI>,WRi@]LāQXg?V ܽy}pېXi.5-h9d0ss 0|T SC2boʮKÝ~d3 &G,o5}m`4ᆨ6_RH+SJn:rbC_>B+@eFKҦl!(tTpj-4_ * oxx*^OGp|;&ZXkw QJޛ 5{!+Z Lw?Q+F6;@Njz3__w^gl`4t:W`p m'Dۿ2JgxD*aGuo,>NV)䯭#;wܤ`|&qqNܪJ S—)rRQ*YQX9 GƼN)⏙kE!?ކ2(~S0ˡ}r1&oNb`W΢t=[4\zh{i\nX({3`A$ ՌP8jg]*.T+a 7ajmRm+Xcc/S|OzAzkpA' cFFd`X` =Xʭ_.5u.%{O4C֜ [rDM6bʓӞ& {q+()"w;mRg.R~:X! , \![lmT4 îK!*P ٫(`\6s>,R428~K0zEʎ j9#*2}eXlzJ^a$Q,n=}"ב6L(8l'v\;_|5W듵L@Qm4+G+1˴)!`,Dō8# Kzv mv_<* {^I5݃ۯu4Z<,W@s$t,Vv>R O C<9xE1רF;'(*%ym~TtuHDps.-^ zK`>YѓQgj7jx*p8tk `65,:'{~\fBiFo@bbT̂d=ˌNN]X_)(j@F%sNR)s:#e+x3+t%TtdEAJs'ёTŌu5a[rp%$T ÌczU(nYMD= cZաy{Oa 0ʌ@7meS߄}Rj-z(k=<>$Bs;tZvMBё}g4* 3 FaZO&ɬ3WL{ilY)I#=P?8'Ok S L^vN%ĿK(Yl΁C%H6Sڷf9bћ6 8w2 7ۺ'ߊ:h/!HV47)yr`1} W:w(ӉZ9e0l?y^gIўT @x?Dó$&B'9:]2P8#ottϕ'V-C: ' -4PM_JbZ(n@07C! 7IFCAj]b(C7N}ou j[7#Xe?HN˥UM{vI$wp9F~{+|g?lu蝴i -zIVb6ϙĮj>&(fsPqp` 6O摜\}a}pE88-5ZܗuÒ{'7`/Ήӟ:YK*nGߒO{[?ֹ$2X#( ӷu (p3n7ܢϋ@gr]0] ܔؕI)p!~p|ZlGY޷yӼR۹a|Y]yq^4rH/z`q8jw}!)|]„gCҼjNިed|K;Ϊmts:uD<2i697Q)E 3,[3\ WnvIj!K ; 5XkVhNGlk;ɏbrUM#S~pj2USѼcdZB?{Y\ f~,eYk眳c-.~Iymӂ`ijwhg`$(,dRqH8H68kM1;j%ÿ"ִ(~[Y RL [=?"c~; MI yly)&P#q$QZev5!ϲ5㟮;L frS.Ł6<SH7DOVG =R[ǩoܢ~3=3C|:YuKvsd= mnj, R}ͅd#نDJOcu~Cwvƭ)USP-zҔT<4TB4r#dsӻFQX-d_x_[&8^;]emupe z; BV=Si 4yoó+6]jh4ηi{-Qέ%Np=BA7Ku!%g$3|PMAEm sӅf+~gviX{*2.@UH^d{;+[)o -#@ y%tO\I%D[}tZ,G(ṳ/men57yÙ`6GI*@ȹ|jjbU_w A,tG$[5(!Sd(9#P)\SkKY=f@o KWv ?6M 4/Ϫ\یf@0Bcb^yo@C_Hd֭Ԡg{& 54n |霬hYa.܏YWqEߎ^S]PIq Yj_f@%i bM-;CB]ЫZdPirZDV$tٷY@ %bur35ֿ?S&a'p% } b5vVM&!I}WL 2#b `1"CV6;Мo9s,{P?Ǵɽj8!Cx^E}陘#K0$V9'5}_zot ubE-Sj(;ĘCqɗCE~G58zeB٩DsšgO^U}bSt.R^l>…%xOk_TM~&;nDST`{(i/#H+~.F3-=,o le;[ca4+Έu9ynׯ.Fh.tq'nuD5eJ Xz;4UKK~r$Qb~@b'S}xjFq-qR_&@J]:i^ 5cx( ldZtmIɝigce_V7L=׸D׭{TMODT➭0W QB]b^ROt'7$due9u (O'㦐QӖݒd{|\_rYyenj/Xd#Qr>tLwzQ%WV7{bx]MBZ' %0 Ug/:73/KYO/pa%86(Vc 1p :"b?^;ˍj?+=7ZIp2&e ų eBb6k#`=lm5xQrm1¶Z%1zZ:gYDv3vK< v\31M47!H֖7]tqn5'^!ɇ ށ<=~X@hxiಳ=f+52A~'vW^Eؠ1(jˎjQ@- op*Pqn`)_W-G#dq\q~`Zu ˜RmV dB*zR/= \ܛUBuA^D>2 '.tp#&515U>Ó\ۺxbk\Ո.cadPbnĶ w:1uOϴ^#LGj$Ɣ(3'$ukqnjgL96@#3%8i[VGftR+i%h uf9zodp}o$/|3F@?2 O*l#"}FE+\rfÌ\TNJ鵙Y>m K:gd$y.8c?NnFqdGQdDNXßi8ҿ|YaQu[d's}tY n7,PH8,@7&sr"/W:x<;4'6$Č3虙G U;+*@JдF@jX*bRL3.P2uѧ9F>`o"A$s^?4%=Ql@ȯpXE"%$ X/aIm=OeWr^T刿"15)I=U4BS"!#/A:BCP<7߲Jh-& qrx~=bbKQJ7%Y> r9 !A-g#1uTw$cI%9U]x1Rl*Hͅ26ŷ؆Ua8TY]KBiԀu[2g ' O~>k;;قJï.H7kT^=c"iE`>^3PbË3KT"QEtc@떫q"s9qOڿ$<1fNV3 +Mk5"^]PxkbZ4)&ʳ FtӿOF)#j.=/bJ;!=!\5!n,|;TWE:9l}ƌu>U\?XW?] b= bVuCˆ_Y3x D<4Eo`:<5Y{ mY/rLjH8k}4_ ?+&Ff3"#V[`ե5N| %]snN^ds{J#O"fԅ,yK&L  c[yq8֪\&ꑦ ®)ΰ`r~$EUi)4b$/Q%%Z T?c$R×W4y`b] $Ft*B!+g1nߴOwbeRޚOŲT3C4"56όȜ;ϟiSmlo{$֙uy!ީx$|3{ _wn 2}[N"0e !f˔5-] ͳnlW >MPIܛɘAy OsאHP& .Lp䆎k u$e#X$h 9hʵs3 \p'oZ]q_UbJ>^5ƺ6. $&TbR-`hxuM̕[v|z^I .27|VB +j;C1z2!7PX1^:?Ab84 &C1AyB7lf>*41 D$ocOI wH]>+P4+ ?8L=bOzc|U}e$ziw!(ƿt;506|Rvi($$'"^Z@7d9Ż`[ePw7*ԎE{*my5kYC!Qi Ks|`l"}0nڦAx $^1?/6j)[lsuK7~P6,E1]c%@l Os}Ӏ 斳-(I,4`r-"q\`E=ȵ-! Q=`2k$O!W?v/:wX]/ahUJQA a6fm"4ѤX")#_IvKAلKGJJ^A۫S|͉LRsV30lq3JG-Ub.P#ve >`a#/\%G;Jy+Ď/ O o6V8Q0Q_92ޛeBFN%HUzcF2\$=/;!SKfc.ɐ#̂H2BJެ?!q &8ee\.?trdmIp%N786NBfbhu.Y~NgjdpL)tb} hc$K7m6LN`uu 6B]F?s{|SoTTt4|:3_s 4y^r-PIiQW~/Or1qώ1/eO!Bu#tz6l`QGo*%y0Nk͈2x1^D3~jmu!tC\_ deIwRq}K0|Ud{3b3CeI ^z@Y-_ߡu \MwnbI߱v];_\ W^ F0s8WI!:]Sy+3}@/3z)~^hE\Bs/Kp3 5Qr7DiU%nadh{OPwF5v6dLDѿ%HϜ3BGTIXndM/+7ڿ h5\ /2aGfB??dTl_P"RsM^oP^|>L+}Yld=ΣXEڣ0vE< -㓲BI:h%uF ~p>un AKHQ*˚]=8xS6[BYzcr>iMKR-IJiiżxY2IOgW֢}8ӴC˫ 4-ppdF_u0Xͺ2Tsֶ<hq 25iT,#:k[!oH)!*cɬs5s3^-.8n`2 M~N!"aFK]ʇ;clM9~Lp ߸m(^ZD^K\P9x0gL!5M?O3ޞ\D]LRd=VX]-وաzLUy# #^l򱾤Ndj?D>CsӞCMqң+AίCL@hO& D3;R|sov@Nڻ/e(" jD\_Gǐ eyW@NЬJaw/>R?[9>A%9ՓM2z?#㝫6B]IU!lpdA=Lz8@2 t --yHj 3=d[[ kuCcʹd^$Mօ;87y߯V(zsmpƢ^qU:XòOdC-X˔B@H Jq% H9rc20&2$Z3^nE_+ۑ'=q ,gR!".P_z?67\'=QfGx~sݰԆ:O  =FH*6{lE"FD6d,@i?<7'#攖mBg|=2gTvo<rI/Q0siDqId>C BxoOALu.Ǟ#-M!YEFf881*gyzNM ,!7֚dsߙ]r'ֲ@;46ꫭ+ByJpxzўG0T}ʉ"SyY o-=L㜘{FZ[D諕R&l2D,.˕l΄x3)93A>4Phz-@Yau'kMsvxW nyhj,;$kq4^;o$Df\Hv\ + 8 N>h%y]\xvu7:3]HD; ~K|wQD m{2m=ۃHO;*W4j| \8;uRGǻjFo/OH9:e;9l!KH3 7VA kI#rŤx5l͂>Jʇ3@(S 0\NP$#nnI@vg/ΐ#eEsˏ: !D]%M(vwiMbUzNB!"wRap1pr?O^H!f0hLI@u-CHd`bqX3h-r,;3EO[Jr"=)i7B?43)`@*F`1\=I1@j'eVfflrcg5|޿ *zT1q*@@i *FMck,iTPu~"5a쐍'UcL}G,BdM2n W۝84" w# ]A\wG<Mi5uI0r/JvS}dt &W 3~kI}ȹz>95(<shk J~x4eeִ8Mp{w%iӹ& bZ<|%AT<) q u53T|2S@Pgݐ]0\">Z hZeÒ*1ו -.iԔyB;^s{#}16rrD2`QĈ2B6Nv{΄X6c}*HJTm.Rq˙T?P=mBSZSezly螘'tK H |80(73G܄1i [bhnJj6Q]fIݤprW]!b ^rrѥ1I{/?7?=nt;ƏǂҟUOm.бIq_&f@T깷&8ȿoҚ&L=Zu1Qu 7 ʌL0&쾉E7[6.A)hQJ 7 K\f+]L3q0Z %mj3^ihA0Qa`Ƣ=j#iTxޑdjx|cڼ%'!/'p}6Z|LҰ@ ^c 6OCǍ ¨PN 9 ~m$J ps> q91~|b({#LV ӪNJ/Hv]Ϸ#]DI;(v\37!+W:wct ܭ&a&L)x=E|D~>DPK,5 T5 S޿긳W?wQb3Ǘ/mb+V\J^+Ĵ*R=c9A0>9yǰHzfCv<$w{dqt|VKm#׮Spt( _H=?xB~Oeߨ"vpoT5`U9rK j'X WB!_]k /իfkzlZBԒ .'HPç˜n|^B&m2h%Y_%:jBrTН۽4"J1OyK 3$3:-7S ʭ2mm&:䚃l`\`CΎV3#r4,=UH rz]+U}+|{#F}pXn/۬n@>XLe$SyFX?NTYaʩ&e,T2yD]Y흓F2փ37Qbw4k]y gyM /p kO@4{g7 1,{^=£1 0~yGqm\}?W>W^NOCj%~ C{S,2aõHt-c,A?3ymA( EddY qfB<٘)ꉈhNZӫ`o 5?Yl xP<͔nVuB<{KC/ؚ\1  h"q/#u=&ûw"FmNp댞n/bq!?RsgBER$_n&l%osRmw;Fszw^Fu%1"ݥ ՍU& vxobvvZZ3ѿf;ê~w4,?vrp^D5;GkLقG|S-@UF@pLNȻ D50{ԛqu>n#cR5+' h 8n1__dg|8Ll)_K^U=?X)]ոQGcA[2z  椮 PW8cv5{D4ϴީK ;R/W 63*vD㴕H-&kEƙ;N"'#5>_?!Ih /KdEjW&~m'Sz[$Њ̅,^w̬t r4rɭX{r0TG>AS2P MU8"~^b亴AnqRdE$PiT  d*fMb>?v6z}rhZ8T/pT1jXobc|f{ܔD~ق xYvyZq<@-w5+ƞT+VƠSB6gyiX\_AmBa;etMV04$C0=Ý6A)ʡXʇ.o./%,}0h71"R695) dZ )r>^7y׎󑞷nqMzڋ]z#I5=%s5{`2l[q2qN:5MO%Ѳ9γ']1>$Lnm1RS]rY-T҇`Oyb3Zu AeCV BO4IK$)x*2PR8J->N%43=vWk1<>ɜYN6pAt|ׄ \n0\Fk 'i:#8B6xr([jþsI#=3Bk*n#kvpQPDvueT'3˜]]@.0^NW6EGcB5D"(Y~tz$Qxu?d޴j7*uxg&hJ7ઢ[A0Ȇ|jTxe ' e31fP7SA ށ,`66Em?&bOcqI:+>%5c=dX)}}*f7ʼb*e_:ͅ(19lXWc`T=3VA㘹Bz^a0_^sh~t礚sB3;hHv"|D 5/6[n3IDؚ-=? /zH0^zFYˉ _ȚdĢzU"O?\ű5t܌*isQȴ ߴ.!,k?:Egؘ'߽Ԡ1kz bu #U7qpA} ʴȴŢ7 7S; $BlWd u>6D`OI >2? *Xu*`ʳ>_y8YͽF(9(u):h貒$G؞ټOp]_8 c\5wUvW+W#,c.s-"Doؖ.GYL.fn[@f;6SE _9kMu?|YھoW.Ƶ1LU`~Xrg(?%x"|x+Czt]F F}|_-~/}փ0aO>*8jvzE"_,\ Ě~fǏ8鋧cZCȤ][k ̋M3xN S*H>Ifafo6rtw+v.;KR@-ݗrb?| ī}{.,lͻ5lg[{ ",3 d./=ةNo3Qf:Wģ{p4ruZ@r Yc]IW-vlF ׾d<mE_Vg҂εC6jb 6Džx T8?y UO/xyzm IngRXďRźN?+K6k8kfI_Y7 M v ߃BBM+*D',g7D-׾kX*mCݲInL3e;H^ФMA`ENdUޥJ!%`FkήbGL°íhTvz3 ௮N't#DžpW8%JW7)4:0ۄgv]fMqG4dQvB_Z҇P)IVd_OyG1~ IYFi[:yu^_* ho\mҌݒMiaɑc&/Oծz\~Teͯk&ߌmrA4;f%T\4>Q+ûALt>u|qp'ޣ ϔLV3Ev%еׇ3d LW"ʫۀf[f).+;5%5<ɪ~~G®5i~:WqM\BXSCdkW,X?Ᏽ˝6k+314%NX7QhNjl1 LbM(17NuI~ACHhnS_N/V{f{\."I^K:gA(&p_ s#(AU/"V(ͨdjgMV𪌋}LkJXQxC9>*'p~MmZhxoqU}N_B17!N\mDKRGQݜi}⃛95lf k~Re5RC߲ķaEBVm4J-~F ?.gǞ+npH'ԥ$S4]UQXOFS řPNgxV9폸Xu=h {]xL:4&b5M(2Iv.٬[Ŋ+^Eux\uS>_7w ˧y9 գWIu1I492xLg2# q߆zANP~8Œ2}0{'aA}C6?]߂ZqS3oh~2Nh CptPhMk*9'K%EU\s9_x#mTا'ޣi 3࡜O !2X=W ?E*l#|g&ۛV *J8CI-0AZa΃u {p"kأ_K!JfnD~sX:mlL[\Ėȥߡm LǨҥ1lhA%1;#|μe_ bxg$>#B>j+hG nnҭEąksQBдb9R}A) _HFpypwBmhϨUìG| ֌l(VuLgry"> ၎ubΰQq_pwpw bk s(F>@A"{x3,Gi" 7Ap){%Nu^5\E$:qoe+e'U|ifTʩ~tM6p@tv8~]J(Oy6lM̉z˒=Sʵr;̑>u6S7ٟ1jcM|-7e'ɾ$I0fNjΐZtG:.rY RW/u%= :d(N䛨k&j,#=+#-^8QfC֦,ݐq,B w]Bs.ԈOGwЦ9rX_dD+D܅I?/ =1JY-][j xWTֈwڻW2 ^F/]ƤX} =g:nJϿޟE=?̫GIԷ(:n2ߐ)(\Z9 XkKB BGfa#c?O7P1*cKoHn#p#Eg+CI,Ҿ Cyʪ:7(az}ߜ9hS=HϮ'i\ o1 VNkZLKI)[u?ϛn DT<+90nb|DxGJ0fʢbnUc~+H6 tt0PLg ԖW=]Lf=[#N&~IQhq"M29jNV; 2U]{@h?oBȁt13 Fx SQ{ۘnl׏~ljl]z٭¢` *K훐QɔA^H%NzP&}6P7r| UJKW߆?͹ qǫVaD,f. ِ:38ߖFL=Ѿ`)kdN.䐧?A_!,P𕔓)%'&k%~+'ኣSaL Kz ygP^^J't[,0΂YRJI5mb9V*Ae  iԐy; ŵ*6b JvbB=QŒ݃®o&LSχťR6SQ8N F/< #vjVqvԌmL?,ǕPcEpȱj{8XhKƿp O\VbpDfj\'BLs^-Sfq?YLn; EjAW)8ٸŹXL }0g!|^c­cekl{|O-͋9eAӷB@\wxʸa]u5#cgTǮ>X G.uB ;\36]hf_~i5Y"lʩܱv'IgӎubM W)Jcr6#ek}tojQ "t)c;[m V̢Rsͥlb?fO2ތ465:繰؏n")&o9c<  Iw?A\wI}Ƴv aRJ"3>(3_X qׁ_3y0 EDso=/B{X[@ TɈ9*[3l77u`O*/s!E0{6 ݪ<Fg;'Ő* $ W.^9/˟ޙXxyH1VlChɮGޭy.Rm?FP _vL,=J_| Z nȇx)aaWSQDe|ӘtDx" A[pK $^b&t7OM}ȱu`q!1ݨNW* r0J8}am>)\0BAfdM`E3#|k\$k>&w :@,٪#!Lr=J%<`9iާƫ2a4<7@(-x?ye]1խ,Ɣ0|k'˻ sxlK.@gZGm9b9ebO n1׎P(4 s0tŔq)_Sp DOH+I6V҇pxm~cxj=#yǞO5 r!"^zz6[L;7^b?U ,4]*.nVϯ l{&ELZRbRs@ɐuub= ;8% &n* ^݀`8A-BYR-k$~k]gf4BˈgI \q][`|IW#7ʲFs0q7E|kDr[^X3 cUڷ _J#r}V6{Lp ?/bg F!{THmCʭ@/')vaJ2( 7XfP Ϛb*[i @>ꂬU ӠSY Vo2r,)q3~˛>)dGGDpBd{RQI%%Mf+\fQ. :mZf@U.OQA7?[K [ 0̻s(w&i007ie 'f%/ˠ:!@b4V$"aOCr$i=A׀{U,2]n1]#nWն}z^^PhX=-}A.w|I -A*r }˕J{GK 'ۯ zׅ,|~SA#gI1Z%`>^&Ȅ ph|I>\~,Mm  -uԣ"Kem-iػ_k2Ʒ>-__QAq}яn0O_di^E<7@`q(w(FAZQp9D]I M.@BUrW Js\SY6yPWm {M3}f{Rխ75:ב/ T=/%=#0Ϥz) z$ul=F5k9 "p;4]tSj|Cu7Z>xIp9C v}-E&DE: ;2c_$|3-/ Ne ˴"݅jk6i.@v)=r.s=w NF/#BLk仃ݬ{\B̊ʵ DYwwt3 jXx ڕ,)9[NiJo ?+HYX:µUT~ T<{$(,&e˼ 35y*ǣ/9| Ne5g}("]i,&2RU('@xkRzMc ''en v~Qι&9|%ZHobGlJ)8mPx8\qO^>IJroۅ=#M{X Y g[UC%4EJÜl:F>Xoo,MupvFNs>}>,/tqLDd1&"Grp-:͆ /s]sj]N,z]rDh5#|g.TK[ҤtfJ? XCx[G,'Ԣoӳ= 0K*"OaG9T^%IՓGi m 5BU{=쁶B30}]\+0+Kz!kXΜY*b-IܗKٶp}jJw)qԅiC1fA"ͷ;q8)V)76Bz`Oe9~7%48 rX,y _/Wp4cp%\328Zl HDuZO7V®]ѧ8V0qą4r &F8+^:U׻ ΊW=|8E_DYa_4d&쮍8@k55w773Z|^18XGi#Kl~ WxU#-县NbwǏ_j2l ,jŊ | D<{*A.iM d_#?枇ѼLY2K LbGHmQqW Α}6Y0Fó1=AUP3$h#xE1yj;}yYqY\OO^tL+LGZEx<[ 7D$lUQ^h!HPYMK뇟L`VHPWqíWplݰ׹Qs/CYV7i4<٣sf ,BA[1R6[noƉ0ONUT䠾jbUz-QEXk- kiHTŻL{scI޳;.@4!%G@C!&ي [t(lT</-@Kb)G/0^/{O7êO{f?Ǒl1.\ |m_r(@q;7[LL?4JJT>=>i+KuW`m6IN3`=(buhǹ^d]64JR5})fiI]Q3y]h1sɯE2HF_{`RE4q3 zXf3_;塛4Zh{gm|g{>QӉQS; +I>nd3*ZlFG@StnsiJ4zpօ 88ZL4\ý{E&ZҾ YA&kz]&ҚB !CnԷs&#WH٠=9!>=Fgk9cvoq7Q; d1?l}sRQjwl%#%tCODP_g(>*šG]0W$s:L$n\ˆ>3e(_ $`¥t0Unh{B'{_[J&JJlCa1ȑU};++hJ zw+ LN 𮡽C[ XO1.C/Kx6 ??_ FMH̯jUr}TL+7LiwF8T|[*<OIr:U2Uɰ+kvpZL/Y~_%_BJanP'8UWIPkcKoSk>UZ X}1_eUɸ[f\?a[>K뗣=9ED symHDwL#Z>Ht` d`We-,$ѕ2?_fZ DXZh?&ҭdsOK.,Y[SQˣPi^]e*XIaeϧ: z_6K3nNҥ5UgkRʐ柝)Ac]rt?*DZA'0|_ekǽ+O xLD(~_ϖhɴőH80#>F4/Rt7T;\fЫB,,KQ ~i -€ ԏTU k E [VW, 4o*>q( {6^}ҽ>Tu+ߟ7[#+ޅ}rhC;J}MUv$^l(_թK>Ӕ[Ҿ"EGco3IRRO}YLת|aAoS d϶G+/mEk?>ߥgw>\U&>3w랻D3E? am%*c~Bxरz52#z蝽+`d^^%/nAGhA>3\?Z:\6gK)=.mŽ۴=iZlzݧnqj0z`*$ u |P`~%weG .N1y#"ыr^s9T%1kK';<ΐPiyY,R7Blm?U^ FW 6xiB/r{VЉY/#[&~1cab"CVb Qy",?bEpqG=2q. L` @(pM׍5=]ЈڔRf 6:#rd{yi&+ Acʥ3M?753FJ'358M0 !BJtO@hr,..!AѤ5\ /jLX!vklȄW% en2 6*q,̅^(j3xu" ,}Ocʒ=cF}5[8`J |J)pD_1₪2.JN#݄=!7oG3pe`ʆPxX "22cZAHM/+%l6% b9F ā#LJ7$4:g d66/ ?Q37ѫxvo6Ӕ?-ؑʲ:I϶H;ct Pj `0Se+N^}:*@~vfA{Hk7\Y*C#VQ& "n-BPjڞt(֞טL PUs {\KV:DѮ!s?,Vl~&?ijw!m)i PVyd< A/zz!O;&nĆ! =L]u;{74)J1 'LVP񜥍D#›@;I֪q6Q)؋DQ8D˻dPGt^Q8ι7+0r@q4֡5g{24XACrGR$A|̧DIo$>Rx4ѹo8M%͞'Ğ璨Sh=P޺{,V TZrC$ClTp) HfqK:6_ssᖍ).&h|+k76w~ 2%4ݿH~*ƍNq0єTB @TghRYJIաJ8Fͺbk'~LN]Ї-ɝ _5lV ³c\&]]} r̈́\X0ҽuߊYN7G㷢O#$) iD.F%$F$I}xi|~r̯ݥN~( ҵ;x}Z3Zl"oZɂhGK!( ړߧOh0 8Geǒ&t n#t`찰xdGG+\ ϕ/9kib5=}uP00%XX&V缲cbtRR]{竑sLBsX>Q%)hp&' Kefȯjnk=Ljgc5G49N6J\VxlMaA$KwK'޲x!:1P<<#A?Zqm ` nhdIbܼ ykgũLY%ˡlp3#(pI]wϡ"X/G7EzO\QOnt ȡV g!U9:&bI [d,T ll#7Zr0}φxJ d2S)"v1-}bZUw1b?WC)|ݲtAKs=Sߧz*3/G`Y3c!2tI㬈)6 {&8%7+p]/Axc"g Ng15{E2Pj\NB=d Fzu'=%/m۲B HYFz7Z=$NQ.MԶ@ _28<KiqʋVayf&I-dp|eZccD8YsGlhxNJ}u -QƁW?@ |DF"]uVq+/Ci*24hqe֤ ] -a)w^q̃ 梖Q۴}L - QS;Gxn ˷ vajm^K *ҟ^ 5I_PE?HKs;#hVF̢I!yeuʞKxcKږ*mAYRPQ'F;!KÏ<3E8vRoULEs5 ΝoYՄyoy5qo@z>C8ȹE֤h8 -,&oyn,f!즨hcE-x;H:n\K6>w&Puv(Db!8Bc>,zEey7tX?V"{9R.qB/<HGOa,CB%690%^$(yHT CX]q ț˦V'ڳbBՖ WJ).9iEH)GT +x[̯V"I rs oC`;do|Ȯ3}`Il7Zc%\֟/4SW^}x@L{ĸeEIo8г , "#lRhq8l xQPd18_>aX$jSK? GlN5zV pQLlN,+{A7rN4#HV,ݕGD?hyGJOǫÒ<鮪ܧp)ݦo^u8s_,;ygg0ՅzIA j#gqHԽM}Fcqk[x*|OŰY#7 `MON eY w!D&sd #)9dIy(xnm`ECsKwΑC<&:I!^a\H ~;vxip##phcԏ`@5(mJ#p@3r".fmN愷011mZs͒ʋe}_Y)liɨY3b\틡jOWTĘ2 𑭨Į`9 W(D_3sU*G-ZFp%BsVT>CǁYz{b%qc{2z&Qu`e"?>nz~e{>B}/V6Gy?L* )FcaPQ"owKg0+OSSG ,oxZي"ZpDfkӸD. |:;X%=m+Z^N",wmO'd9Y]zk @]rBhx;5i ȏIak^D\|G&eZ+;7^e*;< !Xa1PR[xvLM} 8V??^+,o'X˟07r;@xƎq'*L>¹[^AI蚳|18F=匼 ;29ܥ@}ɨ!bx;-tgk(1<'zF P.NR{E ¬X53\gj$]U SHIˁS[F=EAuJ6zRN1:4pK=&vJ ė; jb@V1o&d߮Z `Hߎ;3_"yd🀵r8ܙ/ĤL#ǷMSg^%`rc[VʍB(YEmGe(WI֪ V(&\w?׏O(\]N/}x53|ɼs%|. tKO*{2vS=;bG(v~ ٰΖc*\xq2ttmN@57͠T:Al닛,o(Ls>M%i kqа򲡟Rp91cr=+p㬗™3ij2ӯEyNLO(FO7Abmףk4$7A}I;~.߆N 33qG(Zzt-` w o;,5:lO$ B>l&:'ccѳБ0Z+]?#tVy=neEZ_2OwIЇAW݊}jTMS.^2Hh~92ԈҞDhC2S@;4mK\)li4Sk60"k8>j$xWdD"̭ש%T{r{z :7cK71p5[Ȭ&֛Vuu/LZsVW/"`J>)+)xv>-_Ed:(w%ޠk6 oH9+&Ta("_*;3ͼX . AT|Q82։djSg̹eŶ'~˗Q }ZB8c1^=Ta 7+ W 98ѬdǝG/I'(.FksG |$@qC 4$qޱBA(aFTjgC,r ]%fl;^o!\U )=<z/qOc:KJGdH*c.R@ =|ޣd`>HVS#A8d:aB"{1#!;XCw$!{֊~qZ[!5C:7ݦ4iܨfI"Z^r.T'f-Ǎq*MHָphڧ3~Q5Ņ78lyV(mT7ʦG= :z4{7{ DSh G<8rúl/nQy90s1|QTB\F,8PV;?Vzfb8#K/C\G\ҿn,0+V{C ج=V9y"7=_x[ D=l]SYsTЦE[ǘ(zNSc쟲=ƶ5Ih 2tdY^XC"Pb g1mu3N~2Pm=ݪW]ǖȮ-S{t9>䏳h%79G!IIYOW~uqց3Li`ZiɌxPpI7آ%I絼"E?tkdq~8Pؤnf=+dHݫw݂^vQ^$o?TCsJ /$LX(%а+$>8~\9?IZ7|$<ڐC!c`jΗu{z25"?v#Bkg&C!4SjWf'Tzh $2o>xv>B׈LmW'DF0(M,6_,)ƨqD(mTⱇ@ē#hZGC&sR8ioƑ.lhc$^ءە,Yx I Qi:}5[66} P Jj0w\vº#ж75@>_ENgͷJպNhy^nJz'}^؆jP6VlxHC LC2#/UtQ1p/D]}O MNpocxK6]wO@5|JTO<}~M)B`͍XpbJw.@L-Ȍl嘰k )ɂ{[;D K6\9q9DPy@jc$7Cu?Tmt-{>a|8vT~ȳ砺2*dSTc'f_ѝ)Npn܄7FӒ;dx'_6!DV`us|PL.q,OP @,*@mbU P|Eۆo@a†7++v49> 'cr5vP.dպ qp Tmd(}]ڈxפstc =U V鍸ᖁ#ʎmE"RWQ.H~ aD/^AN4K.@Af$>{arC01{`V ?D\IjcgzDOz+fio.#p!fA O8#E$~M`F5 KEr Ĉ.KV&Lrh~ň>ƠW“{'}V_'~Fatu9!y6:3FnYg`ҫy)}Sn+3sxe&p|yqW5K≪7d7\(T&&.W|gԿQC t߰`Sc2f QpFuCpLժ;cj6pZgS;Yu 12ٺcL1Yt d(.fW%8y;k5cE@,~ҝRkDzKZVSx@H/X߼B3ik`wz/K^8S~crP?\Ju;kmT{17" w#MzA_x(E nKC\ R,whhr"`-fSgEUckew0j--ݥfLh Hۢ`dƤ@=O-?!+úA;}_Wأ~۷N4xw6EwJ)\n2W} ]Ua ܑ% 椬:CM2VҮۦ<+z(ϤjjϦ>܄ >2\"' p:_ot?_1C-vUi[:5WDtL 5tX6s{4Xi44#3b陋9\$kKM&0||\FV]&tc?&:jUEr7iYCNVϨz\"5> '4otRbMfT_b[p&H08e9‘ ڧQ)? uC&STQ[U`{:T}y'Mc&s lkP<̊=؎MiXJz-K:ZIE9k<;b`XA\j(2{zlQC]B|wi@|ds7$P#]Xꖑ nV"Ǘo*tZ9SU%i@kssU3ضZ(踫ΙҌ'wVr(\. $5[GK2'>j"JkS^[0[kBũuU1OgA@jP h狋.W, 9 ^w͘\CQ;aqpӲ,yhc >ERV64zҼu̵@8'ŕV 6@Mf (z~ za@d@3t8'0JlD[㞘(a ᓰ%ލwn3K_Lsw[],QwlכQ{ hXFU$ŀ ýB*A7YqpɿѼvZGMؾ<'FY nFj} )~E2e-p%W~(t0DfpjP/R W9,X?K8McX!u}fJckp~2薵F6tp[Ca2ˋqVA3?fa7h[9s3ɣ! *hiO]Ց%!eTtt,Ѡ[ms?c[  I|e)~T*?i" =u =VjQ28 Pcnn2lE ~yLiľ!j'nH-30mgncsn_qy^>&'´d:ALPq.> 2f]AR%n=V gٻo՘_IEV避^ 9ToHPreVD@:0,`X`5BggUC%VŽ|L8>9@A%ե|Ԁ jo=cЧw v,{[ 5$~s,)9L T9Ka"88Z$.J!L` {o%{*~[ϐ_c o̔!\=')1Q|.KjW|?žI:*.TeŽg)/Ѽβu|2nS5Ey?֗Մ4]Dտ=!F$56笊[@| rMj4(KJB* ‘ O#+1m@>Ղ/2mŎW!#N\|8-;aul>qWnjѧu Wϓa6Q3(Oex@qؙKF>P/63ENZ\Q',"/m$еitKRRHDC}{z%:IT;̼jxydlGH6%)|uʎ ]sl>s/_E9[;m ڴR&lr| , &x Qkr:Vec3""lh"U;ZL"8uA:"'_rt5s:S˜b NGGA-A 2=Kcuߞ;_2$0jS:ݺb\F#fa%Ƶ\ǵ%svC*?.QDj5\\.zPFD-B<#F8El)'@z4X)P_!|# d y_ @\çP?NdٔCҰN$jE?p;řbSp+ڋ-x2] pLiMrҡ@^1F>a9X#hE6&m[_; W)٘[385TF7(0ELā48H6V%OѰ3 Yسb/pkOhŰPg҈ևINLR5;"P~9V'c$$nFذyx_ ]iïDxGBqLWSucܸUS@unSQRgFCgljDXڠ2E\)6CY+KV*WOHpP{ <:MWqdQU{4xNC>_ȨI 4昏yJ<[:6u/k]#2kGO%2Db2)~`1(@QDUƼI;[. F7fï'3|ڞH{ i:`ip,kU@R䟮9 uABsRD /UjH!5F%|ɏW|FP#!21PLi%cϨ&V]:a•C!gl=:S|CGՎpp#71Xv#'P'A r9ͨup' drV\p3\i(sP ƙ'&xTۺ40+H')Xz[l7L1m~psjRCsdY-jڄoWܐ+?#k[ }[N!JRy+gH-o<{ΊIBi!,i'vl5GQMpY%:.ItGZ0LHmH5;j r?^z, <߲K gyG.gĆ$/b6:EpŒUʆkrAe8evLz ?8Ljؿ-x`<HXZqӻa`d_V<4pUiǀcڇ6Wc..sZ@|Mz>C WL w22 k0ףLE|q!#Ԛ!TBFp$A?M.8xZ82$P@DmFȝ SgyzRD-^ ?z8pIȭX0.Vr%z1Sχݜ f {# 0L_kXmXoo9QmO5r7@>ųٗWÉWKShEC+sSd1[x]1@aVwH.W%@j|1L(>snAd/3hmx n"--UXϭOC`Ѹ8m i%Q" IBl7 u KWʠ"KOna2sesLٕ_|.%۔׌JLN. ́hIF70WJ'QiX^oZ T5;ǿ츔\J-. ;(PgxW%)zDXzcOmlC쳰RMq[gj󖂝c(LaKRh)Xw>>(P'+f"c66E_,DNmh?t@ J M 'jwb`ajLvDGƝ3OߩxinX4xmiSYU-7oyt*7f9B" 7IelyJG1qԭYC}ˉ, &1^G&0{x b T?+ bmS C&X[c$'(Nf*Y#LJO/x?0TC:6L8ZC rh>kV@]ϕE>s~) uwDTbRʥ?BPyQ2ao Θ購Xm`S#d /vI7pg2q%s>zԟlU@6--6( (1-2j>,ѾSbSW)eb Ö=c$}lݞ78n/\è/'c,ĆʹWחZJ ,whbJ5e!mq__xz 4(dG.Ji"1IAu7ANP=&auBcCnݞd4)\ >Wb-|^_R;/+kUƩ}׽;<߇7S8Xh/7ڥU[/Q;w Ì8UB VcTxW,S*6݄C4rŚl=2_c3mx8ijUW|?ڞ2HtY.2rښɁu+J^!GD%B'2TBn#`BNjT*XͤRs\TyY)sd U3@>cG,}Fӧ(qg *6lJPDYC>|Jq ψ6hvV֐l+TiM_gi\5}Gٷ%eA`4Cy#*4 ,ސ?ig}_#sZ*8cufҴq4NJ3GHK a[LR9\ /;sW+,NqVwVn~`̒ρLIQ!|&s&ےփ<{{ds )w_ ZBPԲX8n ܒfPy0lSv+qxC%mQ56 n*En- KhPpD[ć!yAE7l(oЧ4 =Mr 5[ueĨgw&sGy?\.6UqfB^Z*4o ='BTf[1~-)&L 2a,BԴy%ވ{=ɀ_DQ{#t/!F!l3zLFV7͌`8QOa[UN͞K/.`Cn~*Q:(*ʎ2yesFMRtF/BY}1G=[)Ewwo~')I;?yrc qT-sOcާipS4h;+>>6Cie}^zy%:kF s4k9PB(C -/YؗrguI 죱"_Ә0JI;ʛӍ~CƷiKuV~Y00o Ehs'j.d%6v^L`hPn[iiRyQvv͞‡ߨ<7<3Mu0@Q,Eln* #5uHH3]nLFp/泞(j$Bo?'{A%n^ cov$WZ@ic <֩oX1DŽ@?p,Ў*-'BR[NwmN3$զzsA~Z4 6nVppSK+p}kbJc)5)ޡc;+HZgndz8/q\6ʄt ӯXZu4#>eWk7}}Fʗ!e5^N$L=pl}Ǚm|#oZc[> VHkS~c/Q\XJ=B^̓ tU'a8vWHQJZyOvQ4:O2u^ԞjK̻+m@suAќ4qE^P9VS} bxeC:\,9-{0g+4s! 6V6_R9c ]%mM:wJQ<1S+x|B"7E,0Pұfo~e/i@K48G\/ VO=kV4L1vqU^2(p2{5 Udq`` s;u1_ON *r֎=qߔ:yf#qf^.7j뫽uks];O&11W; Ʃ^0PZLJՆ8aOyPBنʬ*XB#^ s4 =Ue!Oxw2iXj~j­>R\ ߤᖬ闉ck5f!&;f޹)[(JO ~gu. [A}~=UyxfJ`Vf6M t"ӷ_:Ň l4&mż(bC@8c\ j< φ5g7v;?*@ h-emQ_yfS S==Yjᖦ3UI.8]j0U̐g+1a3ѣa<r?<&^G )STU?=$Jrhai=Ud<]}Շ:☬B9c!oG<8~=0A'o86fLfiRz\nӳa 6\XwA/?l 貆ֿ#K\~d#,XR* mG=yj$†a5J|2 vȶPŖ[V}iL5wDA䲢~ߟݑDVdX1!}냠1ù 'EovuVVI2!n~aw@;s8G0jG < TSז7( ?Q~F(f >+HʺKd$w܇xÂX1,\OєcY?Gʢ*p[#ؿ>ދ%X,nϺBw= n,eEu2)|LtӐ(AEG\%SDfyBd /x1µڃ96m}VlryR(8]$ϳpL_VJ0"RW[" >~Ev8ΙI9uw")q/×?Rȁ?@k#"i^7N[.}{i q?F9`@_|jHlJuYԁ.~qlZ'-{&!>l:c6huV3(nLWk:Bxk5kb d|?jf5a?6ǠC^y^2Y^)~8i*yw2f?xrWۡhԺ --V/f) 42'\Y7p< $YX-Wތ}T+$/>f>w++;齸}X5uvbA29zx֝ l׈S yْ eR2'^/tq u}Z ,bB7œNM qKbF:w#r53 0;2R|(//eo@WV@S[jbGy5cp-OJt}QbZϯ=!Fnq pL2[n"Z(\_K1mOHZxn9귵308=k(]tM_(%)TCE{0L^B~ wyG@ G3Nul`{m?xc>),[2DK; !DLߍr46FMylF'ngwC-󸄪 +urUΎȻYNȳhKL'ނ.ُ:RNFSY-AD(@mmLBbCm ėCaY%ݐQ[9 ofx?EIN:Gf{,`5 ๖!0,]vmc#>5%`鳧d+'ΣM5]M4t.aI¸ݬ ٞB\ X+LG!Яj f7xƼ{dKd^Ѳ9Z^ \~-ԛeXGw6b/CFG8д㋍+90 m:9C#E{)-.U)Նw{%߃Ӈ3YESճף9۟_]ί8X[e.FaN.6@ph$pQl195whwq֍ݽf[.3^|YU{("P ze**ɭ!M4 _"u0^]3#Kq<70&/X=z~y?YAN8}T B[n٭sy`|j6"p>X:Ɣ|uJWi)4zT|hptN;Ŧc{M9zbx <2ػ 5jόf0P1>zR̲aX׿t}b"OIaP#:Y+>G.8C{^SHTg8Ϧ]p੧ŋ{!^?5w,*g_p:JQ(Jôy5$=)JR^~{;b׌+gn&>s.7.l{B :U\60ڐ,?d^Tù޹*ҩ#UEv^ĪAIPp*8U;kq*&z!`nף}do09п)Bo|.<<[nЧ^]Pm/aNG˛.]P̕V<9@76kzh]AӃԱ'pVK@DX.eTH J=@<8"e$ fQMggkpb5  @5 bo0"7~S1حyzqTðն|Hwo.FdĒ)(2Wd\]ꑆ5 PG>2 #w!>gh(m/.JYj:@}=KN.G ݛS_[WXW⫲Z~adR3,ʊBbJ-~S5wF.E[5~o(DDSM ֦sf`~_UQgtH*QZRd l@%"Voϣll3ꆿ?8GguSՐ\q w?еB (jhzLTߦm  Vpn0x\7ޘ0:MZBX+x#C \Env2OEJwD.K26Ȍ\g1/&/n4gdu[ hQ߼ 6[w ^Ƅ|&Vc/|#D[UvȌ!H<8kYa8-}F#M% !I>k?$9Pp", Ndq1̃]+ 8tk*HXoY|ZձfaXsx|4& Nd~Id@ƪֶɡcA[Gwl5߱?>Px_@PN2D sPGVCR+r{^ 5&-sUݯ; -F2m|s2gPhs\7? :!C\g AGj7,y')hH~(՞R>KG{Aq쮮ɈG8rNBIz!FTM!j2"Bc1"d?>"@wkczJ9vxL\Ѯ؎="lXWL\NP[Xg E2=X`!>jQh~BOOԁe.D+m]N8g`{ǴhSq yT8Gȼ'  D6KpV*6?y^, M/8LSYc$zO[;)ꩿ b~\#:@)a^wKm4DѦcmOtE ؎~d_6i"kSU {z%G+3_56Dfeˢq{#;MN1AZuRAp'f97e?o8 RS݋It[1U9`S>cbǩUA.d`tM-^5])0 g+sLD%b辖L#VtMoo;du,'f0ICi;…t{d٢zec)Į-(C kx=U cs, ]q|lI q"J%J;6v:h3 goh{יt̼Zߓe}/HG,$9 / s۪T>cK Bsi;Zst(ǁᵹf16Ȱ$|2Uʨ0w޶-@Ho&';`Mi_r+]<z)5|ߡnp6P_<)NQ~?J71P*;%+H]H iim)pNYk*N#^ NkHۧ0zF;B3L'|002X YtbU:yǹ'5ПgC4ZFu:ŋ`tT%?'sc<2yCq駬(?a }4 -{Tt׿FYZ^x?-2 _l)ۅDG.Xo#׫X.©{ ?r0 A)OrKr/KTYBס4K=G;(>jchBSntG9eBG3;V>f^r ݡdj`LK\(0<~pEͮNq"X Fƍ6g%+z킒=jNwpc؏ WCȨ kq gt汥{bh{fEmM>7 dt8%([s2GUzLy O6uw؏zIҚ\0]-:8ҖVo/Ky"Au-{PwFgN_'Ao {lWn Ly4[MM}eHUڄ˯`leS)^P}OC<. Y/wnƍ^W}⧑jFeQ9ϊj*[wiRyF7Tx:!D4LX4/lߙV͡H5=N[vnDZB7$b=Z@#RE@YrxUO1RZC %ZFGW)uP@ a~0t6=VkEhDr[7sb뜻{ex5dA.Q^7Qrc'd_f8R =}re%s{!|v8[pc\&~m}_N}9ö$*x'Fi7͖~䲆1'0sGCp^dP'[7_ .o"Ȏov/& e Ã{7[K`OHIj_lUʴ qlU b-|nK}A˴[%T%3HҺߔE5CN* pyD 1"9}Q\W+X@eD=!@"NT ZI&?}8jmbmF/_=K p$#|oJ(jDl7?5 6-dKEo]8j&Igf738Ĉ4:Bb:xdЀN> $5>$nV-E={y&r?;I6)MJk>>`A`k(ҥ7[2cy>ŢM!tByLᱦ*@ a; 7Y%ltZ˕;PjUgbdWRx/?I pU 7Թ8-H_t8^q= QyV'_ A`ѯ<5N9PfqZm; _蚱l&x1˯7}[ysR]5._0\'Sِ!+1,oˌiY#ؠDm> WmVZ矷Řd\4gCsd:l0X8}/YpڸMT$d{b]H4 ©g&{# x.+j 34cOyR/\àU\D1S0ݓ/ t&jܸ,WW{#g^Wヹa zȆ7{u +b[eOx!|7X5q'Ιl)jÉ&#֜cNv~-} ͓'%B7,r@%̨G4Yi&PV%L3Uϋ5~J٧} c5V5"Xt@Nq0,9#.C/ë,)gFƗr%V[ ϻhȃh۝F4`{&*{s^ճtBOvOgF~M1zb#,Pr#ְDW"S) :ڬajs͊uRb&^b8mP7ӵVdc|X",( .e믶\3aJS02}o}/ 'n?0>M ,"[s>"%pSrXMtG`>@S\4H eoMNޔA:ąyV؇="o¹&TtҰ|Sa K@w+ҵxSH1׮!2]Ga` 0QB])6 Bn KDP*t'>?+?Ya|kT1þs^IGehoJ*\`ݡS 3 ^Y fϕpvZXJ7ƚI+To:5K.UtcUR!Hw/wg|Kh~rdHUEyMk٤UпZrt[nT\'L\"k{X!kaRaKVcz4{ '  KBІ .#R`O9j8a3:ʶ?O|C/ !"ḒoX3<9uxW5&'!Ԕ8!ɘ{;Jk΁wnjPJg4kjjJmezǭIm:n6])*R<T{#Ҳ#[f@|W_/`ouƢ mj !)Z ZeO,Yz^{N{g< #}`}chzxH}'=)Xp@$;*[ t?/lw#+7!,9mv !ͫ225>ˈVaZEM K o@+>A+Ѧ.PLH:|9df\ pc3bo˜`0DK:D>0>& Yߕ9 Ȋ_[;O?rxa ȡ=ER*k`$dP[e'G4*s10-W!E POa"$%QppaYz-J9:47a}"Z~+zL*@Dn;8Bfrt)MOHsk/NdRszWGmDCTn±dZ1AD gFh#1hP~#% ?5) "S7iED0i 9D wt4qؤi>nxo2 ȆpCUyJH/XP?5V?MlI{I.7lw=kA!FyXɏb➵c VᰈnwO_ds_զ \֩|א27>iwq[ joQݺt`7db:xJ`k$2 E.ikbja+횊dx|O:.x>q.PjL e;aaLhn 2(YK.X.@-k[5YoH `¥Hcp 8=-س5XjEml^확9MޔE^^֮kw7`Ԕat~B4?`EUޞ(ڃb>;@?MMn"1}޽C7P!C:⭏DO5]'H!hRZsaxʓ4Ku?Iv kmk:&Xj~S&$6Dx; 9+o(N)3/ `>X+wH;WÂ8ze,9MQb6$N}NNgUVDidj>E&t@ΆKgrv<ƵM(λQ(3<`p~;8!1w608l]lr?c^b 3R!y'<@]!8rg-r&!]%Feo| 6C1_`[!TЁboj$(;Z*=TږucP:(XZ(b%ZiOMp BLGy۩Ə~y[5ub @s ꇱN~+$?7dp$Ո p SD( PFiWH:Ľ$w(s3FBe3S[RܨJHH[ߊdd, h`kSg=י 7y8@mmxg ۻao CY N7DߟSu/('-"!"R8߿cp,Cu3#@vQ g ~=ZP8=2g,PYKiyv$* XGlKK6ǴMvL}|X6cs+kkNIlFW q2 D~-VNg-x6ӤYc2WX˙T[=l?Qh+FO ҩ]ęg_mqлXoȥ6—)?չsk:"䫶]p0#le9Fd=$\,ԱU|JSv30j9q; \$X>);2GqBp@pԴJtSt͝hLZn{ol[>p1HƹGK(!CSaRI1p ? %s-FsTaxHW AhƊ'0P,eݒ ~q[uNC9,G6 nE`ͼu1Ι> ¨̈́9ecP b{=`ό$Rsۖ_N?*m64 BA8Cv}bt-];`H#{2Mu;Ƴ`y'l$ #B[9ܪ3&7?6H/ T:f04(H:!?2ӢC "(}![wSMgMo|ͭZ (bu#05r喌-#$r?IPpvM;- ^$>6bwgDxv=O6ل3g>6A .Ie5$fiD6aSi\C Q 0#hS]JP`/,#xŽu*1y~ʉږm_krMM̫Ķץ²voJ6ȲENVZl:c4=-!{o..0(\uEFx<,k3G-vjl[$P_귪rcx.4#;^nO` 6:T9\5Cs,,_.,J=]1O9/fJc -'$ϭ~B@XpK?\=_Xk9XD>U r++}/j|$lv. KrhTVx3} ;FTz66,uۇS Ǵ9f} eٶ?ׂ,puCgb}dkjg~JYzƾqLk[bt}6j[aR qj}ZB0,ՔAYx)H6 )9~?fmzZ lr97x[q W{../`Y+W@ /Y 5 ?6zjz?)1yc\| 6Ob۳/v kDQ ?5̯̬p,_+j >Ri[$"-8Q&B=D4FIU*SN+P~J `#SB<(݀XDWoS)Ef1;s>J=j䃑ʰJBA鰶k> +6؆.AlX2A_tqQ;p zM#b Η#_LZᖲ}]7aW UK=o%^S9IWJ[-lIEMyKcyp[h6\Tc4R X:EZ$VD{HaNo`b1\<)} EsOJle+'٤( W6tv|K;۬6оM/}06G?NWq>W~piiŠ8fZ3zZŴ϶8F+N|uTV(9Z5 byr?8[ qm6&@'L-rbT\ ;}u&oyrVmn&BWϦPaAk1&R؀&͚mĝqs^77UVx*TfϣV1!NQȽ#E)kᗫ;*˪H=s>"loy#3A)FJDod 0~2kH ѡ kJ8t쁠 25E6|s>֯a¯o53z5NK&yN>9%_Se+=Yje-@=G{[*SwSJ>ʠ|?tgw,e,s˾8 .#fkJ2[6Vv|}XY"^<,Qدѫ>7:>(SΫO*Ig[3هXjWQpDlkOHe{9~i6*sϞ\/"W"+̺jX)9,ZwMRgB.VSun9sL`WfД89-n=W O =jOQs@*((Nz!(B.Xۄt@gDqoÅ8f%geVe`L}DєףGc3nh4G +QJ_rM ?~䀄pedHglԂ˂h 9%Co[ܢ<\;3+orT?K.ol34 jZjtd}N5 .Ӽ, 5 Ò (Qܑt3LBM0=3ǝKE\9$l /=b ~,(Q}v~ G`=xfixD,3!A|?O ن$nvGZ%R~3_*vU qɷ4U4O>[ML8T^f"@]\_܉/Ⅲeγ`b2J<& F6MuN3tW Pa"[?1goBwBmy;Hj=%R}RVx)}Nݩ+I`EX 98<{?zAnW|Fz.dھK ޹l>DN|ǐ~*GPYo=A >pm>:Y/ޖ?KGN~/b!!|lV[Ve{9Ln2r O^,߶ }ԋ97EI7Oer%n+(شǎ^*XQĭz{7X~&f%֬w(Nă힧R Ȝ?Cs*fc QgOS"+Hd8\PѨM$53i[omWl|( K+Ԍi0N۰""GڑK-Ii=lQV>DC{\׮/Cme6Pק@yy3 4x*d D3|άDL#?l0t/o|׼ NmJ z,ݰsnAhs@WǼҮS-A>Td܇/ kJȌi`O(9䁥[ ^[{ ~wjl-r~r+b˞KUbfQ ]EKw0dtk ~V+Oh&4mq&$>φ8;I0X|JIZxlˣcʽ|֘6" >Uɬ(yP\(t_vR r]zA?մ9};*UY'9XA@ٝ} *fWr?[8T%·aPgpps{phS׽vA,u9+zAy2~IN3+^oe1ϋ5_%b+qE ܅w=L͜JFNM 8'rt lH@v||U*Hy؎.Y=(gvulg%/w^UC pgl r΅eX^;.pKzo[8."A W]14z@ODqOZu*칍:ZGӈs4!S=eoq%*tI2*ؐռR ݓ+(_5(IQ=*^ϨVۘU^0倄mSVe'Ӝ["թeۊQ:>/k^\nM&&+!}us{$'^Zvyl:. D"ŤjM,T6RbDgD%ۂy"+y<> 6nU]{#|5%xX{l*xL#hZz}!Ԏ2gYd%[NR'JRަΪdgA&9xd,Ud|țpٙMSOa@Q S>i`啃7qV?@A;e̩ F{K!Ql? Uh%TNpXXQFAoNU6QjvFj _ lFC/:#n;-?ֻU%xbv1Xꔱ3ږ>U phͨ9%FN ts6Y1#;z=7ge>:&ҶkK|R1p H wؾ12MUá=$*~ rюHw0,<)ol L'n=DP|t.) 9$HPЮUn8E־iJ"?S+( [LdM 1` Bavȁrx>yX)m"7s*gMЀ,mNOgg mVx({|@YX>5-XG8`%-.'q2!u':T;LygrgԐU:JuE!v<9y2#dp oW< Uի?c$Ë%e c+rڲQ]'ގ:pr4l !i?V*nyvvxmK)8}!{Q#@}]VbIGL˟U{65 Fw:!Mx|wO}/F╫f[Hx;tE4 Qp7lYJ~`)`2X`KBXae`t,ӿ&M諞` qN}RzB$~Dx)KaMXҸYdCZ·XLWVv#vTI7/Ob+ɫoԀTD]#蝝=+hmOkyia GvaP+*YtU;$ ;0\;zvޢ5{ݍmpozR Ub*К5h|,^P }Ez [xGر*~lɝ֔.leL.-zq6+೻[n/ V7yLU _rQי?Ob |DC4#zUBsIf_8E096l!R˟_5\+K8B\ &p!E>yR]v|3Pܐp1Q!HT Y97}Z ۷D}@ǾT EAcFO; 9LZ2 qWROj p0W bLut؏>w \#mS=Am ZjIa9™yɜ?!϶)iBR2ܻ* ؘc&f! p'FrNd4RZ:T $pb}D?LBvy~>ƪGl!E%ܢ@y/4J|}=Tqf`>vBnk}O~q^V`@`^#C/,q  t8 CCwIjg=w?KR^]-,tr1=TԆ2ExuR#E L5H"}ᴦ4PpC*8>€ ʃrB{$CÜV‚ H;Et~GZAWVvYH*T+^eGQ}UO\B D.zjoUn*xY )TM" QnH.WRYT<=B46&nۊ*ٺ;QjbQsQēsQ9~t'\ңP$?r.(Ōo@j|be_ʀ0ųpCs 6{'0 RD:GplVv:8@@ 3Zba|k&$dc*SE  cju/: ]Yi/PùoRYI~c0T/)%R:fx?TKCAÒ 6Ej 9sZj~oDf8IVA.1ڣ }n_e=vycޱW\ۧby_fؐ@DMK` F@$WzN M+rF 1\(%/}TGkBFr`r]!EM4G4EC8y5p!l6h@Da4tm~ r0HF-\W ‘ʻEkT;o{4|-^uX9vJCv9tNZG *lE4 L,$Caܜ/Gfz߶M} Owog'@{s˯a[Eݻd߱ơ8|" LzUn$cfٞS`dTJ{ߢRvbäLӐ9%ʑsd@j0UuTK2}Ev 5" 8Ρ͎ Bl9.FKo>~j_j 8(i 3^Mbf.n,xYs5 @[Gc.g5^2Hns.ӣU$DA$y=2:=oJKVH::E+t4FUd(1z@ 7z8)m,P,Ò/X9.`B XJl^=~r_"dNB7ZH5U4œǛPQĦd8tdvXSxǒ+`ްKog5;N됭T|LpUM*Pt7Ă^3l,oc.vn[@PmTK<& 5)ŏ 8s[᣻4`Tshuap\Ne?JfZČK.Q8_jWٞJOuDS<ůܟ٫!5h=t5Ɲ EYVyEvy"j43 KLO٭}w&K@6xK+EMCu>nR\ᩯF1yPR /gk|b-v]U㥽,]NJFZ4u}mF #+ D%H_(7lǘn _OA@F'g AF4NP2 'otڰm%U-Ϩ-.okH; lҲڂ " dK!Fk;)~KVGy~sH}6'"џQ҂ dӳ ?ʞ54"pہevլrXP7O$fD t841wJg rÓ׻|pu0f:l+jaTؗ\"cqjh@8tq.usJڐPuZרeј՗zK1 CE2lKJ뇬;0"%;)\'v˶8U~B{FpۯcɪEEChsDnYG,UNP8cN^a; ʯ<,hqN4T/&9s9d=\)ly,7A M'AB?T= N6lfwa(7r$H2$Iz[j^Vځ@($)=5O0BMFKPNOíg_jAu=Rcn)X۩k;UY4eˏG^Jb7sXbAk^v ]RCV +GDcXv057hK;'6ڄ,VEHe)2z莍6HĬKS8O?",D%֍fBc $^u. ԥ2tc*$ ]?{{1`n2xzR`oo6g:jM^Qg06+vD OLSܙu݄gJH%Hg^C Cۇx3]hUSWy, Gڏ$@f*3e': ^[3mp`]0Cr3Hq9in*[D`#NTB*1[,yK|v.0cm /!,VwOk K;MxyJ$D=BM'}-=EP|ql,r}ll%u}na{HB+g"5e7z䵿vpܣeTB_2z2#@>$u|E'ߒJHP+ 03JRͫ4xU{ Xl2f.BbvWa,qY_e\$lPBҷ$D3.=dq0 |8C`toqv&';vŻUFU\nk|+-y871ث6:εoE/hűR|N| lf Ls_bkTkˍA8Iɐ0:"uU r0z,d`RbÂ|׮}έJK-o^(0R3{Ǜ֟ëL讶AZL;:U5 JC=^D&4CA:WSN`})]۹h3G}szz\e~*&,w&kW!&c}lc]nSw5}T-D%[|_JRU鑿ܣ)e9VNtl1${Y&4:~nFQ+~e0es&.ukQje]5݆uWYuAh~:@OmzfwEn '49z)ͱ]:rpp. ]*ٟqyQ5ojOT'j}iɲq!@m1*Wkb \Kh 8ni'@8w4 m"b дї}[B^,[-Ss7XP#f V) 'Etʻ@*9Ng^3tzN%39\D@-#QoI2b,"Cj V؀Ć$l*0wDs.&N:qy8Q ǖ8D)\£)QW H6<~1ѝP G@2IBE"tL?\<̍5^m?n2MN/8Dx# 7?G1[-RJ*RR!};g H)CVJI&RSpwQ3>*;7'-q?FJx>oMJ˿4^(tײ3TQ&A@ '0}lQqyޫ-lf~Bdj>+vjJs&pdU?cp#jDQHrm938`ռg~8n5۩j2OkԢOv` L8 $Fɇ`cjH}B*Xخ^9>&LoX#`&\9@cImҩX89{+?}[N1b3=XXU&`f ?gx h>G'ǧ?͟9sq-%f͵vHTUWV f^)V^n+CpPZ|Ɲ+ՠ*MA7zO͉1I@\CY)F vJ`it`yIs]O]mp:_Ei{Jj֟zE&L/=WK{&u_%!OWqIB^ukf'z>4Oa['N Cb1Z7@8ֲV[/L * >`4CH']|kճ<6jF@!g+,>04=jGE)ʼnMXjUA 78bAz)!D,!U]!TZxs~l?v 5pKD" )M!9]gsQ9hDaD+m}F; u"yhX>1OaFݭ~Z ]N=Vχ33J} : "t? ުCW29-SyM705|3Sy0)m_5G~tXO}FSD sOq6G^'\B􊩢Ym{Lɇ+ -Լ9N-:ot <}(PAXp8:Vg>B}3/YS?dQ`9#՟.R`A`ψ82>KޮTj!րSgڥE[ 8hKY۫))LST'd~gV|# J/m.Lrbh!͈aF·}t3Kp&hœ2tER^q/\rodL $RVޡ!=ȫUB’Culk.%r[HB@)ޗ4Uu& 0$S)XO#ܛo$KqC"vUQnEu<B`r㠁oہH|cTwYA%^`}J5x@~&jKltb$o{c$ֵlhj:q.NɪēI5)["oy++"]BfV)HpU?KYGb~Cv52WkzҰ.JZ D"BB@aOڬMoV-7Y[x`{T:5oK̹%r[`j? Qޏ=fNfqSl0s/~CTЇOMz9t ꃈhy؎)8n}. Avԧ(ϓ8$z28 2 ؘnfk/L{N&j/reyEdL< JrH't}NtSVUnUNS ;zC)ԃˊ"ԆQ ;ƃᶍo-oc)e4Om-]@ʣOUBr ;@G͕ {iVDoĜi\{ x_'gV$8%~W =y`n^;J~=_(aKU h6MZ o%6|},ObMp=A-@ _GP44jeኵ?/K3mi1T. 9bszY%ZgSG~@2pTkeu"ɧ-:2ʬaH{{jfI/mJ8h Q԰|PӶ! lN|VUЀ_ά"^7`|#GfmRA ŋ>a_~2+H^GʏjdJB c-dGta,-Y β_<H. 0oՕ99儸w,l-y(Lrr>O8p̾[]ȫ3,jywBhzjVّch^Ι%+q-j`o7 +>AEMVݍ'2w\YZGUT8j=}pݓ}\Nn~H.[ 4} 3~tƩn4uyۍ}b[%+\Z `%{vxk9+g~&ίN g ٻ|lnL[@pߜ!%p#c/)8C0X 9R*`>dqOGCh@~VU94H1 /+toXzdF@jzW܈8$;||4{c 4>^3MEgtȳP}PT?s] aN%_q Gr~po񸴺$3:@G4krB2k,v&򏎠ୃ\Q>w&M}(O_9*D|ǿXO!  ۈNVcBvvԢ Z& U=E9ó -C;765NR!"ջ&5 ?]fT m9L[09:sJը@sߥUz{(C'J05@|w,{ @8:šck1|^L qct豈!ǍiB =<ڨRMK2ÏQ-+fx8 #%}^`. T82^HZLY-z- xu횾Q~u@{VF61jĤhwQ֓QaE1rx&~ձTB8ARSQ6J}=_s^ &>*Y vdµx^Ll 55N`Zb9%L@@NmC]AZw_2[%N4kp:ݗ{(I=!SCxNm+Jg)Ĺ.}[M-Me5O4h-aya}Kk$ы=2E񩺢Vk6ʚ[gPyUAHhwԐggXOs@GS3 Kl)w"mX!p^P-K#nΐ5S7!Zpw$#r>8=,ͳu рEt8nM_5 ]:ي\^(H2#ح/\~^J8_}moT\RJmsY5#Z9+q}{v0=J$\=~ngwd*69ʽءH"rH h-[!> lq .$ȷxfp< "{nT3sc.E( $!aWlCw+$od@(DNGxbبqA8GhDÆ ["; _T.*v'g6wlC,f@:vZP tuhӅ \bl4yDxܬ2?u_b#0>1LrN~5C=m{4KRp $et. am!ײ>~VzΥ1/y]`TjX<㾾`jUɥkv~#oA 0>ҰBwdD!-7hXJS  d=V.T nul';oW%LMU͋֙UWF7_θI[:yMK=_3[1 U]p[@!"$$pQ|C.7D800@/KkS~tzvJ4}1^4'U[~Q Ȼ }K'}z3坯:ژqõ^I=R hS#UI;9nd>ˏYT*4du}>oHZ06\͸B~ '&$f -N)6 L֗Y_rL+;3ޣnmC J#('}8Ntk 6nO7ihOMpjDxDz\+Zbuʈ8:zI:׀XD4BP}'NΐD*1ٖU|wqzɔ평;@lLcOvE(]7ͻ`hIͿsEP^pm vk[SۂN)gӎʙq;wT})YmBfmYh+{H[b$-H HHa({>(w@0e"69{8.md4c i=nBT8|T8fq'j`>[HZ׵7uuʭx}ϋ>qm1B]e:m0J.90W}K?+T7ϸ6{VN\-X_d8z@ך_h>0X|ua fv;`3C(2ZX=z!3rw{!q9ta0Ənqx쇶% w|6jퟰO"jD*}#[_ _-Ɛ;ɷeRoӛLz5!㽊 oھ6gLI) r/ o󺞋ΜQ Aۆ7>ǂ> k h׆؁& 4mVerd+1 l`h,)w7 ބ3pf}W{/yBmY;Gyz6sQ@'S~__pO#~ (_P.RԷfYKEAa`Tm8=Ü9.̞jtswԚDNϘA9ẏZp?Saysn>=o<)q~o5'6yM9tHgC5z Xy8.;z'ļ}Q W,r7:+ ᄔ{2;`=>߲k D{C%Nh7mI1nǿ}̮-]FiZ6 ˆ @P-=I"QqߎC{y?qOh= {(n恎`ug6yLdQn*n[ܫoIgq8iFz#so tREA_B Wo9iRc1T\/@ܰRk9}r~nu,n;MoCamhl+Rfgt]ڃ&$ԛ 'Û&o#M>!ǁubjU zfh\| _^e "ќz<`Za P2-1#?&aPS"nFYV=AH$޼*ׇ:B&Y"Aс07EO-7.?~8ǩѳWK%;Q7h'0 S6QRQ vB* Ysc-@]*H5\Ԣv8cnԪ{IS`#)ɉ9`($L0ޒfͨ,8]N\o#-O,>߬/_÷_3zYg2]VRر\peקO响,Ql eT!v>'Kqx^]Cu;5 ׃ƊSNޢ׫؅l9]J|=#>+}!)Ӿ9L7"_ N=)6p4Gge&DyJ;0_ #b. A)#⹊M12* l^x| 4ˆ#˦ Sr|iLU+6= ,;&+5u‹m`8a1?OHPVII#_nPHPM(Yuׯ}o}o|=7_|fqy{\=ozy{KS>W|;.ё_{y뛗o힋`uq]{m={ٽjXnua&3:kot>_{Ww}[k]ةsVq#Yx@ mPs՛y:Y-X}'*Z{;77rv9^`{co>A|Wo>yG۽n޻Cηf[}^6/z{z7ۅkof"Ǝ-mES@:]Z)Mv;Zd({zڻN:B ZN\[Ǟں禗Alۯrǃ-/j[t]ݭu[w>ﱖۼ.=`7^>B.fv`95ϾXz|swrYc75+=|f򻪻fmn{j>fw[ ۣī6^ѻŭ]0}KunGu׸ݾo6;v]]=ݾϮ[n޽pmIo|o|gӣ}m Ow>;k}wy%φ׭]wۭ釫VBMrh}ۛN RW`eKX,aƷVm{;fxuێKsvu˨]ZmZI6%UWSN[,իv]Q6gu; %݃rڮݷs-at۹f-{rBo{Ֆj^rj宦7\U݁۶z˺Q{w{{.^v٭K6=vݸym/;r7){׽ywM]k\לz[׶U{좚t( VI*]d-*dݴ ( m-% :4Zxurwop鑧{go8xs{{v4ۜ^{Ի7{{z8gk׼{۶-ǹnt6{m@wz{^ث t{@:Z 령Ov;Vy2`zzo`@`( v(@Y(l::kzP::@h(@ } SA {P݂lнPݽ[faw}g{۾DJ}n}UOh& M0 с2`B) &L`&LAA&iL@S44L M2=4F&!bi#FFL @44id&&Ld !ɉ2450щ24b1F!OS!##&hh& RH @ɓ2d&44hm@``&0& `OM,eWEa`݉01Zjme2řenclֵY\G=Gj5̵SM5ZYScuvklӘɶS2ff0lb֚m=336ݬ֛`YDH$$&JH ֐L)&x7NdYa&a6r37gה蝴ujbg?Ae^bt5ߋl1p7pۨg21ɇY Çgڲ?7M;۳]^S.ݎIJi8v|lFwZ"0n23+Mkj;O\91W۲U.fZsR&x/+{˼OUZ$9KnǓV<> 5f7v"3 ;LEªn 1ޢsl`$Lv-Sm ^7aKTÃ[B+leFbff|[&>,]n"| ̙Tz;;7,9kyvJWj2ʫM[]'v΋8J^,Lv=:]u^&2VĹ4]`_Ӯy%_u$Ϧu{HGj)y^<όξ]r`5q:4àt˻22fdb2?Նd;5Tg)?&9Xm̛S=c#`+{v.G\lwS[. Λ!f955*97v/O4[VLig.cilMx8ګLQ;\#9H&{`;r'Xu\3G8B9&Z'1jK}`o4ؠ)s\!u*r WB ! IqR1s? t (O%"` Bi&NSe>B˛pTK{@60[=H@!2"h'"xC O!\@@K Ҹ3"\ El/>ܵ M1Jvs/I'EP!HB6 R_NO/&v Ŵ2i@:voa h~l` >3y< Gz}i.WWvgGvEۺxv`//8;T\ޗ:]'AyGʜ"s{gy]gF&q56vW+zfT^ui9]6fy5,7)@Ց¸<Ŕb3 22c,,̘Gopa;=yq47 MYl=՘/{'}tb ٍ_K˩"X[5mr5Ցk YvͽG;lˍm-ٖg3MqߛmΖ٫SkK7j:γ:~^ۡӏ/\'nC "((FPzAxЗc_??cQ @h:Jb `0HA8iCJ69Q"D8?N165 H~JBHE[P Kx&$Le&qN8ݻNcػ~iWF#3ͬxSO8\7뛬.ų3gm.w;lvf;,cyfb糋z iM'V1G69,R-%ST $]f*WY//p)rUդr&,u ɵ'NV&2VUb+W]<ߐ:veCC3n $;Q#7aonll ~Fv0oڡmo&4 1?Nm[1ihU Yb֤bnh32NX8+JYY-і,L,UcYW>4˶jXI %GO=kM۷q z=9%yK6<::ral6 al6 al6 ܮW+r\W+5wgSysjc.5Gw]&MmgS&zm{n3wRvino/f\âl933wmΊRWT(,hľփkUqv[oGCni=msp9vѪ9gKnm:aVWk;<\crqCm1^;WQr%t:UwSp߇Y4ٝN}ϷiNFήs.<FN|P-\^}'r<$nsGO;-]{u;Vawugk{~M*mO[7:s8y^w\7wM;盶oOuzE\w7v\Kծ98d؊;v^s'#JٗY//HOҲVY3mS5UdT>+;S6ߒe!f&VU, )r2F,*eG`$ne7䵓XCLA:N*U7aSx]j1c 5qZ*ie19tsuKk*6[ZSr[2{^paoڧn{{:4{أ{tu^R"RP6%-J@dDBuMVO}FC^NLZ^~}n<x?飙!s?cZLUP!w QA^hxm3٪Fʨ<&P()s+ Ux*XgGr sm]@sJMc7?2o;y.mm 9͂9"-$-Qҕ>""G~ɦ;} /Yߍf`P 4z俀혒wsnk j}\ip;  AnEޫJ.>5*j?H=ۜJ۔ \Oݭz`!oTϽm!Sp)-Ş֤ ?k俹f 6tGT_yfu$ؘsx2>jl Q]wĜ-bp|̇6J!ؘBϜL9?S,u6ǧVe_XG[!jx ϦABu 0iHP(tS ԑ $W/cۈl7^k[O%}Qc!c_5(6Ee#,; ?*ΤKJs>0a7{,4Qo]'$f;nqP*^{R[-Ӓ){5j5Sj tOybt{oBq8YnU=.ՙ 7r`FZ^JkDC*fb]tI8] Q bEe1ȸ_%ov2+5LJܱU9jRĬJ=cKCI-+F ,eg>KAy |dLAIH@?`~WC#b:HsR:-;d<8¿‚p 5x]L0v48Ä r\)73{Hwe!юC 7N&8>it "ZKP_b1x2 r`>Sq"N='4緍C7TsFQPYݻUexV83w՘ sܥ+K1{@RsbWP޳IG5^e>yUVQ݂OױO!#XܞPH6}ƻ߾yt:ѱ=y--mf9Q(kBŢsr/WC}3RX#ܒ([/ &>R7Ԇ7NU&@QI܏uK|&>Ȫ=yt'TL_(deΩ+Y-+RN!%8sp6Gk+ wwh 5cH`>^֭h bLÒe?$p`{}6gG4<;Qb G.z^oҍq̙[}it!DB#צcPHrpO1pY4.xA!%U1:#vǂ8#& tSf: ''҅kyBlqd=F@' KL;ޣ!lo fϟ{v ̇e߹ "Ƭ IW e,,,,2UBFDF !ae(bd?uȵV5+3YL`JbŕYʖIe,F&3YL2X##eMU><E),ZPۭ &(m5M0j$I6[men ! L{ Ԑ(/'R?F}`vu:sAlCϱ8{#gUo nFCY =*scrLMp-@ o7䀁sl@ʆ}Xmb{ff2yЭ_/Ndl,ͪ8u.<ㄉ)ƃ[|hljym:ٯF'7x0i@ $!7h!/,`3k^2ݗZa):HH,?I–zuSCT^^d3ޮW"-Y=HU؛{82A1 m!ǁ+Q,܀k1*hzyghar(mtjn;G#SCcTG!A8sZȹ2ƜX/p=0 3ODmnz[`%7$e${c_ g~)ΖZƭέ_p@O6Z@N ~rV$;~e \VxX*RA۠@ifErearu-ôfs'4y%1}n1Z02(OF'R}*)G:/191p=(e#%fPAGX%'8xx4B}DŽyi4gÓRゐ bV/VpOJBrY@" ӊ1LY7 ✕(+luwE/CVDvVڋm }fë y F')lv\~98}b 2S 5u\'ZWT\m&s ஘{}$-+Ue]l&J%7䇻#ڔ`XcIĐP<+ (F5e TpaH%C*12DRЯ] 8OZM4IJsrj%} _cqҐ&f 4ď:|rj.&}f팬'Kذ<\@Ta.Ys#<@ cW@0k   DXaُBᯖbItqkLc!#j[rpYv :#ܩj @hyy< 5pUГ7!iwԅ=DsVtIDR[e2a %l@fB []5.+LBҖn,g%Na`tE:`w3Xq7œnA(ς|ZekRNWͲikFb?|7% ИQYe3!32Q (3Yy5G8Ux=AclM_0ُdOYc[fL*20yk0KfYfXʳ3k*3c23)3L,XfYc~nSn;K굿: Hn4:Х(IˮDHXߒ/@;I,c(Kh+gV;Ulv#pKy՝65Gucrtc "0Ewx4Lr?A9?|oJ7_orBSfVQdAt-?nA՗ 26ϕ^k`*hw[4-*\p{kM -9Θ=o\^y1OvON`>=p͂b]345zҒ/MŴ|nK?GvvWrbÓO$637I gݕlvwX*}yK%=={znx..?]^)2O= 0 yW=}y|}%\ʱFp&Pjw}_nsCl GT/dyH_F)Rv9Nb݈Dδ T6\y[$jYINB/Pv*%Q"#4{I= ىRk%)H'"Ac-BL0.Is?K&["GBǑ'L0"ZF(H ~Eĺ11BgK5xi.jm>hYqw o,S3l/j-y,~m·|v Њ)@bu8*( zjuW*-z0b:$H=iDHB,۳@@IGNIp, saMC$ rqh]o#4.Hҙ&m}MTU=@AVib<9@Y4tWOЀʏrU75r@e/6FӎV7ꤼ.}f/}^:"%P,u36r!E1ƈ^H#CҎ+jhH $}mgڻ>q_x`$`x^Jdv$" Xr[NXZ-!{l3F2qne k_\:GeF8V y%1bǾ|f)$9 bL8Pޖy5pVn?[gеϋ?DG%OʽyY11ac(egOC[@GkDD集)jmUI* w2oJcA؋Pl8DXCpI#Y4{{|SB+;$n24\J v5-J=&qi bn<:Nxm~(]\q$X%Km8Yk) 1i[b%a 4Q!?MVY-W,a h#>> }4 V&5MؠZk(^! :;V .(@ ?W.PB/[<c pqKK31THP pg$HUy DGQՙJ[¶D}} &q;l_2ț 1.a/mMh3-xO~WIOB.vJAc OZZ)kڙEk."";Ds#`;=Zne;U?넶$5n8 }9ͬ Ƕ85u$D38˱v(DI'uzԵeOXkjN$ ;YVoO;Ռtv?7@ sW> 672 \jQrx4>oK&Q>n$:$ KmYS`ʜE^l62@4ϻcn{iUx60 btʈAE)="ZAi|+uKbA5u8%ֆ;<}'1~ԟP:I^7yvND bٴ(`gv<:wV׷ HORAoxnXX@x$?-l Yq!v Bs`\k?L@FNXXgeC L Y6 9E~PCp"f up#ڸD]4 (eF`GOh}8o7K[\ߦEdu-q?U' ,Cru.o$Bs +Rg vEq <Ϥ`La tMVv.Ҩ8/!WDT2LBpVзaHv Ϸ$Dr%D1CoN",f%d#Q*P2JlZ,vr1wJ&Sɰ{cQV TjyTªb?NbISEnKW&Yc A鴪 UFS=,,Kcwy4.P̢FF`#S%ץ{/_m~ƣ2猜&O{7,\~ߥ#?x[b{NѾ1@o]c, O(#{luѻ y睸F>_D֠O q@ڻFsdDVr芃G.:ζA 2Y.mHz?^mӏP3:qS~d8GVrZr'a[!M+vMp ѮWɞ#P{@GsʨayH!G mn.l V&Q!wz@aikCm{c`]](v rB6<Є#ۼeD@c'Ra5MߓLY=EfNɱ^4%I.鵷;r"_Yb?Խqo}/J\s5o%XLRHSwQG_99ARH{ Yц|<]$k'V煁 (ذ`[7mB7 R͗Jcm]O#xŊq^В`0U uSӗw6>N|qbH # )_ ˨Oͻ3UL a(nX贔U9yU+WiCʥoXiξ-:k'Ne;$@С(jpUH4d^,t!ICHϑrG)SxN+B{f7MHS{}/a_ )+ܢX>݃C}u1}h K`6: v$E'}tv_VxnBn+lɻƿtJ( Q E)b1M;4D\fp^!ws ^7BZ'*/AsedWD,D||;yI3ss{fdh$aIUĺ+ś;S~s< |u/ޞ[oDFony?[jeP 2z밳o6a(z@X}U>mJ*|/}sQqaE 1EMKT=9I|i-RC]^p(bX0e^?#v{8Y?M%BB@H+i$sd}4T'?fZFƂ:;ѯ-q6TsP(k&)O6/i&vw~(}@H2_85MzH윻mP2Q_N{d }=%,Fӟ2вwXKO0%NC*h7jjMk^BC> D3C 3%fLRꛢ01XU5_[?P ̟OQ~/BYc"V2o }G逌\!:}'/B}ߢ'eaF@Er eG߆Of/O轧{i{|_|Wixw؟fCJ<>Mbe07& M&a[arj&6M&ɕ[bbe1<=17}ZVVVV+Ȱ0 Xņ, ń7-E-,_NO|Nzbjh\Q B=KQʰzBf*[g/Oʈu3.9|{'cS M!W7rWy6S$*Fl#reVS%6MSF[LU%S D-,Xab8V0p 6%MFXb&Iae52&*bb2InLMܘVE0#RbDU`ebu7I7j '=[I*o(MND7RŽIb`eFeq2#iT&&SZL4b*,YULQ7ťl5F+j` K Ջ+++V& bʼn04h 0 Fa& 0aCa d0K2&6MΪҊ2 | FeaKQ 20 E#A&LJsbhX0ŋ,D)+%& XX0 LNbtC 1bŋVbņ̛ Z0iLUdUJ[--- L!nZ&b b- U4 pN ވEdX9֌usSd7}{N t"&4qqny7,atXc{~3>C A _? JNtM53Ё  CB(#8K+[٧FyPbw}"ku5 HVZ?D Fp_8ƶI{|?lB{2&,_u͂5;`Ǜy#Sė~3j:\)@x,81M> -,X_.e}tt~LjX\XD ). B!Ѝ;>7W=! ea]¡4O- 3@<諤e:YWmt)1te2_ؿ|?aC >(B ׵K@֋_{馸/s;bW(`bU(GQ"\Nl`>2EtkEzf qiWx :a[ݤ߫YA:7S u" 8 g;![fu2{POW^Jf~ixN>܋epQivZ1m~y ivXʥtW~}O?mڥ±Ei ӁڕC!vӺ&u$Tlw7 <JfhD+SL~%A*f`~+bZ j?h]CBlEUOvƍgl\sm1d#R`o&} U?5#k DTfs.gN*s%Z ;.H͞S,C@(Sܢcze"e>'4[<ۂQP z|\B*&_ܗdsǵȚLt1&D # BW?|>?EZ%P:)ea'8Kixfw"4j ~o vje7ʉ))x+[n-U'cޫ;>eWMR%=A5B=rwӺsSq=Aש~Sخ{Nz)(1`O?𵴵φ8[mahNjߝ:K9|%kynW"\ر\=+ֳbF>9ft4V G_s( OQrW}A)UD [fH 63 *`c~|jV&Ep xx&])Ew/󃤆Ǩq>6m+4#2ǛI* n=F,ORyFl7oa7RzZ p'p ձ-*? PXM2jax];_t5"XVG#wɰ{a8/fBB U6#2͌չ9+oH\@}y3kF`jC 9n\Sx|f.e VEQNCY [!<1E2jeN<ͦ:Uw Й=.vSh%`t s*n{(-V-E;\|$mܫ(n+\J3CP[ "ືgoP29'}̐#=ts\ K lcرUC=Z, GV%^̨{wm>oZUwSΪ@X_ll-kT@֟tt! \H~4'wD^@P(iNq6M TM eJ&@BXjT(<!8m (xxjB;zkVݿ9l][^Z٠GlؼD{V__r!?Jyq1bypj4DiG^SnN RWk_/yPi:tR4dsC 3v {Ȇz݇YZbN%]*=~qv^YQ)5<;c,N>Ija >yz |?`@aqٺ? V†ɅKvCfFƛ:O& ,1A [ c 'z3 aXX@EE>): t06z N@5J+v"w⛏[xHbQ];gD#:}bK:E-%RZe#|v-9DžG3R2cu{qj0>RJP;?p@)^ ˧e"E׍E G!!t=HH6>4iGK@yXsxH<,a󐃾JmH6`e 91GF6h!ohFmF2GoXc>M `nP@@lETDxmgCKenVaWl1r13P"Λ ߤvODm<Ah f[`(Qm_dG$|M &t'xWShRܚIjGOZs 1ݪ +f>O1вԗ{ۦAdW|7q{qb&=mnsjM:w)їCQpT'fԵ%:X2gR0b|W}Κ"Jnqojw߈-^Mp@Qiɞ>,4eedr7ķ=hy}~w^D¶0Ѷ-wӝ>1>Q3}-\lc)OY$Cc[- X֕~)[X҇-i:\Sk t$8) K,I.C/LM2a 3 ٘iIƶM@@[vX9 .֏0t3I 9PRΎ^뜄Ck"fW1>// YH \0 ۪\ڪK|B1  }.~,@ɗXbۋ43QӟiXck|GI<ɶf'z2݈iyh";CouC[V !<5K~1{ڧIǨQ*jtjJH?]JT|s/>SZOZ,9ǽ YVMcdIfrj&r#Pma]K%+)=? hSTU/mLQ?go2fhˁsUF+'YQݬB>6T:RIj.U_gҗї5\ 0aHp~/o`%}~6; >NQi;oJ;q8D'ysWZ'\ 8S1q/Lٿ @Fȅ*Ŕ̩SSHыX38+݄c7c+ȱ2db,ic f(֑3 F10(G o#-g*^Ou9Saxc's]L׼d[ ”ܐ<]3sܙ$Efz˽;}=fJjF`9@a8t= "Sv|A3 >EU^)'+F``VWt/2TKWϠNpj?Wsa\BHoX_}V)B`an oopE`FT1p#xAhBץWj~*)V=Wak5%4HƄ++fñyFrL(f=뇣BIm̾m٪qoГ."WsXNbEs.pR.׬+4,t?؋SB Z.=ngzD`Ձ׌$2-'Qw'_S-x׺o }N hrl@tSEKg( ]@k ^p{^;"кdz𜴪ѱa$>oLm g. ['$C>Zd>IyÜ_ܰ :R(jm7/S[OUSsmb.kFt*ꃤ䞐x>X92!ҡV"U\^\wȩD@ם˷i^UݑH*,3*1 6Ư5bp| 4sYV AeYTs!R݁"e5tV]G{1W)@dpqn R\kFxl 9CƆ؂.\iU鶑5R( "xip-$0B./ʺrDHnmώ=Q~xt]Sκ׷0j-R''˔@D`==lD:"@f]AϠu)ƂKԷI6Fޥ0tٌ6RLTPd!>nMWU/ hNu{WқjjC 뮻z#&f2qX'<)=^ ;gGTP@hԱ)R'77vZ}=cTcL+MupO.k-u6s[(EKky:Wx!Dlnk«3%F-&Y1=_D|ϒ;r]L牨Tͦr:q#6J i*L@4+<  %Št|LF߶Qc($q֠|r'e4Ȑ|2,Kx!7(KrhaB%Ь"63%?:sC OpPp\֢$-{jbS`Dٻ \& 0Gm;،!d` hFAvV13FysnQy,9=] tgNmۢ!K:&VпJ?*^G"r{TD@nQ$F7,5^H?ù6脫ml w.4\jMhsv$a5z>I*-g~N ^9C+=ECFT8EߋSK9T(hdmG΁a4Qe?z>>pwim1KLeXLL F ( f a$. w{ѕ_Wki)MqH{N " ]Nǽp شt·NuъJ0ȩlN<d~lAk3qé#o4G$˱4tbqjemD%2ܤw3BcG?:ѻ.>;U@J? &Q RGQM$OZ߾Hy )ʍI -)VRS)0Y@Z~Gߒ=ܳX U_?Kx>< ”sј ".EF"3Μ)R,N$Zo5a`yN3v͛)@O)Y9~lI6c36 }~Vߞ_s :V5}zw 4+4 6 P 0.JC9HQ]E((C1}#@'=n(A%Ɨx?W]Fڿ/ߓe(R2͝@!dsoGOKyʼ0+AGﺫn}C>>\T GJs>؂3iga)UEKf$f \(wԀȷKNjcN*yR[2-~VOI.AFi6y~4!pY4=oD9lwQ/jma)谷DĤDwyI^Dppp{(T_?%Gm l m+VQ >mZ+nɝWWyHlyrqz1].]%/ )ӆGJh4l̚ Tje?XGgS8a73dl=&]L>՚H胳klϵߔUYHv;M־ZaKI^:WtgV|x4ߤjā/Bn_9fCʫbqG{5ܾל![}T(/E)~ܐ>\M(UJGm޽k @caG>AYK.Q|Y;_ dcX~:{v pCHB4$@B^kÂ(fkɲf_`̟#AT]0>sZ$Zn S?c&܀Z ̵ZX[BC;n2kɕKYb_⶚/BS.e~:4b@~1xۺ1!._碊5׍*DVC V(3aG%*%Da(A ^`NbF,XF:vH&Ӹs55` MOIk<\btf384I{ %G.m..}TVuG' Ptj w|oLݱ"Ya qЀ2{]׻^$b:n}aSuo*2+ ;o#7]BKf5) Whhv`HFJcKMK^}++_ {bXsX=%mFl4\iku%_EKc%1"ZO5:mn`cn.@^tF0anKd^Ԫ=AAinlMRλDݮ# -efqB^Y8id%[G/Uh8Ocrmv[v|Ŝz.ѧ; "R|f^#Jı4aaf_n[(A{>⭞>1zktv.S'N/%h靠,; QhGhxB@cb aG'p`ρBj&H'mek`=&L$|^hCPƑtnY#ok\+ed i5 ^AI+oGz5(}Q@FE C,_u:>ͩ nr`=ΩM"BɈq򘷚y;ud0O}@B O|Ў"msx-c\fRXO2d|-~b%JE=*Q#Y|_.cw? 6 tv2Ȅ/.a˵rKGZ6Za pTGr}I8< ɦj?`v.UAǾAXn7v(*X?"&)~\"WNQ1_fؓV #>|I#iI95!Ih.M4ݎMA~@ ?啐lF[R 0]B+i/RjȢwt8b~K Mv)^ F~L~+HEŁo.Q60lSa#v\)­z4zl딓͔NNhu.E)aX)IY ^۾kﱲ`QJ,-VΨ 3=#񸢦냟?j||]'=`*ws5cQQ! NB?i]_z/rfPE; Ed* YF Dl;? #1܌w܅*QY3)ω\Cw饘 ~e5|>[-*ffvB0 8cqVļi: $㯛ˋ.h)Dfz9dZloEb#.ʧpPCDt/[rQ0RTYA`ZG% Պ?PJv{}@ΑC!("Qok䘞nS@ӨlSY~;!8{ct$Ro@7dn7|#%eAS 4A^ݩ ͏]j{ۼzh.L=RĖ/kHgs9?N:j "%w H4jZ˅ =#@(4F:̩ UJK YcvAIJ c S~hxNfv $؂)Rҭul7VdܷpOjyi(?_N_B4)})!+(4]D9W~%1u2q5Sul9c3.fC[v.8D~ިuYtf;Ff4=.΃ʾیyٯ ܽ僈H糆, AZ*x=o[|U/FA[f5e !t۔^X]W[)xe2!{{eAd;vx:N@Zl%EwMc7a7ؠݢ[A]~i|$o&"$%mbKXQ W+b]3#isZ^Sc ga HM{(ZRu|Y8X6-3=#aŭ!Nb: ^wEj usma|- BBFs4>ݷH+4j oBOWfbK^70> SZQd,##9_?\>Io~x@NK Xj*xxC^>~iW)T3H> em`Dٯ0ɞyxpBic0;uBxYHh¸Ğ{Mbcޟf"R9}4֧m _gz\4xPc5N#qPbcAf;Qқbp* bI|I ZRBcv bw1rol=lg2Xf/Oyi`+r\;b-#"si3@h(4RdIٚgoǐ{_Y1;- C??#K.^.B|qȽoUqg?uBh񳈨2hʼn1Y~M8Pn6a@ ݨf(rgS(bJ-bmoc|)Ȗ)0J*$VX\`BmJڎj+PH|)N60<Y aPVoSX(iƷ.TDF" ]\G?RD r>W[?-l6):Зg[}(&cPLSS-y/|Uߞ')bķ@K;vb8Hk!Dq!OU`S:'Kc|c4HVh՛SHnp*Tsҝ #t(nL;BeFRij|V3h'ڜbf⩮£:@Ŝ_ͅj(uԳ8"wˤ `J2lU"$V㒜//߇1jԹ'h(F+Tʛh+6QxJqr$d{h{H.5oVU]r'oYKx+ss*vHa/st@ɋC.O. ⴠ)L~G5w QZLK҄[ͅCg->d/M{ @$#F׫-Gfiw20F@Q8*IΚ.H#$AԕVwBD9em!@rNr^7(;Y[Ә( E@)PxXSvxqhsӮB8$@ťqp-cm'зq'Zb~?!+dP>AxN"p@M!2K$2#j~U ,1-x:D( y~pNzDajHL5y}MW\W8u藿+N7, ;H)qq/i;jHHMvfEڔB/핚#εMA/Z(&LRMQO#LYTew+4Ls Șkv ЙًT)r@nᠾk"o9kshVgDSټ3^#nT;K9[<ǏVۊyEF"5S:|M0@ S[d!& J?IW UB*Sʹџ50,LbڦӑLű44 a{D5XyVi/FF,,XX1&"20bb0ƕj0# 20 %Mae0K baSRak?|ω?U邺IGzxSW8Udhl4"6I᣷1ѧzSOȜ*SJS跠xI<~XuZQ?ȤK ,0VV+Th(Ұ`KS+ aoRJoE:P2?]3t|G&STR>qQ|>._}W<}=?;eϲNqrO&ǃ <8ѣϘrVq6bޭ-.w/Ro[.Ar ܱr+KKr9ː\$bn)Øѣc8!]91=ښNr|%] -}3-41?=J甯@Duqҭʛ.w.ZkbNJDSJs8SV+)mM4,4qw̜&.D _սJ=7FNBNvIn 5|Dܟ]W])V$ $ݪa18/ߓs%llVw=^u^TA2&&UvWepvSnyfb bNE:SU7u뻏GgxNںUG,x)TXtMUZI'{79$䪷UXa޳YۜU4:r-SĦbvrltzw.-q6sveeyGxڶ8]C=QyꦖDxE: 0ivyD:.uz͛-]­%_;ȝJtSShG0RȻrw=;Sf1a/j;v6dɝ3NT F$Uqr*𪲫dLMte:]N gDX)Ɲ+9h.ړ0+*Jv8/j~v~Z/:F!Cqn7Ct7t7Cqn7Ct7t7Cqn7#r' E|sHUqE)omƘ'e(UN$^y[Ȋ,QM7/q9|%AǫT`^khf9m{ <5#Aɐ 0 M0)yuWauԅωN40' ]nJ]zi ?)I72=;'<_bxh֩ozNV[O8TwEsp)ff%%Ð뿙Z~| :6B /ȸϮϦu  @*O&DNu$:N䲭LH5ҷ՟Xzկc7 'N|`@GԌ#fļW)z+U3w4Tc \>11T/0a嗜_Zc̄ pOiO{獎q_P[9c7IUuDw_Wshלn P , Y>dܸ.h;kMV/m[+WE=v/p6,L oNO }_;n,FIdXiMR`  Ҧ^ÌK8톃#yь>O& bhLŋXdL0wMV++ iWn>p}Kj.z7eeeaVb|ja0XY,,K {iM +e>mUa{g}_g%쿩?Cu" 9 #}܍GP{Ӵsk )5Η=Ł,C*Xe#Z?Z1ꅻN]7sw#C'R^6xvԘ*g _k [b:p_et>Pebb4.YK (7@A~@%RoRByw9!cXɎu}ٚPdBnr | pčw+ń‚+ɇkÆgJKP`Vv="b`V zbwI.o߉y)k^1?wuA{n9`#DO~>g$7\}1E0w|{ۄULQd4Yq HJnqdjZ,xZɛ 2gE*]V̝<q=3F.}7w6<՞|f8)(}$6>.hbR@aYIrhy k/eckxݔY7S05Uw,sy"c*5|5/45VQε8Rdk@q*v;kl|Ht.6k +,Bg Dj A6=l[ƕ= cYX8]4Hׁw{{-Xcឌe氻֛2kª}Oܡ^aў.Epb~`W[|"!sU`+X+8cA;[Sm.k}&+;ݢӳ{-NT[PCBxbԁgd؍礐{rj80rXpqlLC߼$ҵ0UV5O^Ui736N!ra`uPv`Eudѥi<~k%" 0h%ylԠHuGčߧGRlw\dGB!pQͦ<{@-PXHyǽ<FFUԩ'7y ΟUAhYVE SN/!S';~cڻ/TNMN< < T"*:PEބdRP#ADL&B,8u{(t de\x 96vlpu%SO0k+,Q{ɤ7]dJ2 &C:>eV/d B00&@֫V]OnJ^U^nh+!]"ֹ <V ǭXhP_Gji0PR)+NܯCa@^:pgnZ8 L:5-g.rw[(4?Ƹ%gܽ'U1M=NGim0% %45cFzorMV$x<+ e#x@SYhS#Yz9T3* ?,b4bTu#щGfU.#vA'I-#KOsFJ& ߶zڒmybn.ߑ?80&Cv`!Is&.z07d"T;3 Q;./c8T:/4D.%}Ux qN(}i߅H]I5rb<),4fKn#wsOs4Il8vTs#%l*I pʑ_ck@= -= 㭗>a]6 nnBf&2+%?랂Jy.0/oPz!b(Ka`x~8;0rAjp+Թ-7u&m %w%DaHӉdiFIi{ZGO^M55Tg^O+fJ^E5!qW Z9'-*5'j.h,)o.:ƾ)JOFbçi?MJr99-syTn bAIBLv?07/H#*Z8){}}˭da yT6U˂ya >tZgՠJV^hIAcc.}/+,^G`HՐ&:\b'gn L㯈B{iy& 5(n.St[1Y?! 'N6";}_ݍ`;ծ0(@ LO)i>]вw8S7&5D `J|gh`3PP36'57c̀@Aky1ȇJOH+tn+ܔ` `nӷ rU(UܩT.u|܄ Wo1s#k\W0ocCHh+i/V7wbbn<Β_M\v.8_OS&XnKN)+K hFXUVk"N2Gw>v{Rf>ݔRFC?B  dfO mD~:-bՁ(`w8%-^ztߛŚj[ݿ gU\3FI/dc9䒽>CY191 mq%qR_c)`E횵|?^.1 ,)Hê$!B@Hmź\ ;uVpj$w|<.dA]- ._J{>% [ k%H\!~TJʼnͣr*Mdד >Q(5@C1cT!RѳXM3)yކҐރwA3O_'օt;9W u~qKo;9fn(̋5Hme.=q~b⏆ήO)ZAk_u:4 rmRwgC@>x)OA] .T t*KcɷogE.Pm\p&_4@>9T&F *x #5|cb]T4Lys!4;(@@IX &k.tP#Q".==tBvosLD (pqXꮄ~o~If\ fe%_>aWЪj|j+GzqLXX›S++[ll2YX [0 0 0++ 0K-KKK-KKFh>KٓjڴO\Q4r-M&*#jl.& 0a `,. 8&hUi16I~>Q~\[N,{';zTUn8UwFʭ7AlZe&0St^C瓀i8&)'z_~~oQNNzwG.vXN Kwʻ{Ꜵ.]9nNU^Uixj-(atXPsfB nϱl+Zlnq?D8W\^dGUKmΜPHwZ+G8]+ V];򴍝'hʍn3mS $x@(.z޷z޷zB\U:ab޹ž[Uio[+n0q=sWx_'18A˦rHާyjoNoNq9G(lhChCA6 ;ڡBca `KOH~2sU *VyRN1:1<۹Ur{Q/Dvcُf=zp8r*r,69SK9M˪eo6.~[x<9۾[|ZތM|Cqem[ jڶt ɲll[--e[|׿;]?[r_Rov޵i,^_ǡv3[;Պ}şN$W>I*K s$7uꧾPyzG>ƴq@iH]q(ƳH WB\$ no ?08RFpaBg}Hn*2bD(EDA@?Q^cS]- 'I?%6ONGOޣj~dnI䤬O&2ȫtI65_H0F:Nuir89ܝ ,2IM'ҫbeU=e_Y]]-9Dl]v¶2Xô9/[0zF e,Z,ŅV4Ѳ/i9 8M9w2ƓI V&VqV*9 UЦJJ7tĸ X4bJ4Ibʣ) vM޻U:JЬbYSĩ1, Flexr-S&Uxh[o\Q% J[5Z Ors @5&Ɲo&lJܰLѪm[)xibxy,X\ "&'9jn8պbqx)r9J 2eh4sWAli47*alrZSFɹlhX7-[#Kꋝ4#zn\ \n)n&Ly65[rND$uUDNis/"iis llȓh p9ŕ›eo&䚭6:B9Ʒ[͑ڰ)qQ2'p5[Vհn*К08 ڸWщ-UbQ4Vh inXUl@ PwR$Mh<%NL57t06wln+_G!cEڛ#!b, x݋r_B^(;N4Ѷ]1H=73e_jЙ$0H_w[@ϡPz,?S"NAyP[h /f0‹^2RJ=4T$=?1(tB uq<|̍Ilyx+2Wi@1P&vhYu0]ܾJQ/Ctb#`=dU| vT܎3b>hv N5)Ӧ!ڎ1&ΰ%<hwcȑ]824wBp3ղ Sy$iB}u% }.D ~ JP2R@?!@W3[3!nT" YN-95> KTĿ4bxdnuO?9'@JOy~h\((伂M*8i=h؀5z◮|&=W>q4WջCcݙQP^WԀ¢Áé})Y15ϣKZNv16ڑ*ß̖H,x+i@ԶszFf~ph.PS)l@97\=Vu<-9`ОfIoX'sCjr>rUAߓwl'Q4}vb q{^a)3S$"I,Gi׉Y4B;Tܸ= 2.NA*ƉdW]5,WXrti|'x/#ze/sLjs!Rm.9865#$-f dag`a:̀^DKuE}?17?{O8]z  _5*d>4nhn;ЬcvMzdyc?yB ?DD=pmcT P'2\X(ܖq)ylpi "=vF ~{+T*ZfG2R؉]+)?~۫WU0~|Sw~t͕89yAA(q#yݥ=S:yN'ySu{ZvҀ $z|~jHޒb#9 ʑٗҋHw(,!K.$="xޥj敆KOGT>W0oDG'H[{11 @L  (LwL*^e ̯brm2`vu8>E$2>tn% HID na6 η L>6-eZ<պ-9(;J/^!Šx5j jhU1[U9Yu~B| w_j)z=W'oăZ QG># O  -:R3UK'P|';OW핲MTܚ&*b[yq.)2OT|yr|ϯ{QT3UaU20l9eT b {~qԬ?U{x5VN-rpI| T+j`&+RZe )Z1YXSpaaaeb0b$y* 4^8Jq4M>Usq#b\K.S$bo\F+Øn7y[9jo-Nŋ93nm ٷ <7}f$XZai$L2 Dh”J[@!,FI⫒Y&;Cbn^+;& *z=:yWPUQ:tNт=l*w'vn]#]ٲm]3ES箉9O[92ɼo[CCsqż.` 0 0 0 Xa&+U` ٧[0̦VV2RYXaݻSeaP+*z u]ntN +}:pMbdɓ&L2dɓ&L2dɓ&L̰ɓ&L;UЮbv*Urs!ۜnv,-WnuT'oN5#+yIݝٸàScli;ӭt ް`î:zW 8thiq.svŃaUڧ*{bl%xtޝSu<S 1;iw͗!vz,A)'9!WN3 5Xht:zR']?u;?7'>3ّw;";[ wىǚ B0)D8H{q Vً60_%ϳxA$POѻXȻu.:k?0VL+d&+4{3.ĺuTߢUdj5^ݞ@;nJ_l wѴKl Gy X3V␲)|΅FP9d"3{%q޷{hx` G$׮XϬdQl{ EQسӿꭩC|+Ćxmwwr,.\ H.Reb~Q aٜn;sy?d @*Ddkʃӻ6{~3N"Sn'VAPferfQCf5s9Jb @A-|b."4Ao0_T:yFG̙]hӭ'7%ޡZvqЋh [u5ҙ%rB1e0Wv$Sn۰eLb. 18#'BMe>3It8T;6nv/{5ibL8sOMCy qt*dK?;^#,<(>לERi6Av>)LM)Y[DZ@6|pOcQXd)SY3WL 넸0Ds{4 Kƈi&,tۦv=YWL 1Kw7>(͉jj T:7QxGBF(Ub[>AXq;V@ߐ\q#?y^m_Uա=t0>Ao[jL--M| c|@*bBZ.Y5898 @2_;VaggIΰu@Q~4viCDܯ/v6S594եay>`q'#@-5<ՠgb fˇn SűOP|Mێ؝+sއ_8B)H&EᗣF"4)e/J-b Lj~NySX*<5}byk~ծy$.F<.HM~2 غ@b@#G Tu1YSvC `YƙULT s4`3ZKQ5b.ЈK[6w&5m.~R scr~-YA#"GJUZ=4"|\v?AB-dh@6{t/} ]i>d jlD_ j_;fUU8DCFD~HjmMo>,[qtN)\u1?vx sKWωp9 n;`dns;"]>8:mzޱ'_GJq^s\"Fn? ̅jw >OO&c/pw  hR]D6}Lq6;OkzodDďlMOO5ۂdLL&T-;aX$(zO.g%HO=_zXrFC5h#ΫX%X#S6Ts$q (w bEpfᩋ-K7WSYrkƨŠa Z*oOJ2|B^v\c":_DA꬇6C(7۸rjT%yE`.L}OO>@;D^PdydCq =)9#Gi[7\vrc|1.&Z upTŖX@Pyq }($m^Dӂ|1,,|%u۵Z o12݄UӒ#-[ oP@+&T~":QTo XOTIob/k83>`_{}U%|iR[-U3u$`k ,2A8݄|([^?6;36H{)1#qTyW IT#4ܨ!K@']>m/Jn^5}:W`W4]ȫ6-Y]mpPAؔ&Z>,PM7[ed~0?M%j*x eT|?yGsӖXF`}_oZ}u:b/`pc(ۇ.}O/hǔq}vwW|U:%*aa.n@8QQ_g $L11c]``dS)L8=>c:ŅJFu_v# ƨGQWWuq/)EǘHz(oH3]r"_=@f}]9cNŌ[EZ‚v~ؿPg?غz!,v bۿ5 u/7I[Rwv,ʊ} cbܽY<1I0J[;# Jk_Z:+1N+42ݏ\Z`7'BI% }nzumԔh!lzcq(/{Nz2ϚoWaQkΧ/xƂr?@e/׹MddbVI7~:rQ3"P*pC@~pEsc7-\&`\5~1{BbΪ(Yf [z@N9½{LvK:z1ȳ š#JoF{{G57>.{Ljjr/w7->k-? `$?Lth +(C˸'>{Ři+¿``]Q@@&!(A"b14FM5ZVɲѧSKӑNB,F'"adi`ťDʦVS&,SZYZdK+ YT“Bb}s.E4ҫ ,+W~\. ,*ذK4baCU &BbG`4Xo[Žilh&,[-X,*eemZV#+ V*2OX_d/N Y\Kw7WBWͅ4Fhh,Ob[+زX,&ܷ%[z#qE޾OQ똟G}˨{=S*ö\gt'GqxN[t̜|w=T]On9GtNcs_8W?GGEN/iD/SrWr:4)¸qqz^1xʼn8[­+QbJkp8W,\NZ[vGޛ\rvqiI`[Jx}7_A ̓bɈbdGxm_|%j׊ݿ;+"ʩnEM ۉ-ͮEnq{B|[yҔ } *_%bܳ)hFXto>sy~Dc ]΍av=UoooooXtGEl8|pVX2e0a 1Uaa 1daaeUZTa+aa,Dő0XC++P'>#|7ğF7lIɪ}:n27^bƀviLw6L@ U}>T=׳\rn3Wyٞyc!֞*LUdcYKv VSx+Tyхsas"!Kz;/'"37Ce|SOq! /9 .C3bkqͫw1QwuaQt)5{08hH@ xd,?mH$il:VfeEe^1L\,nz>KNY*썟%WUQpA (0]ҷ^+F餲1h MF+%}Yp /;I\2Wt,?Szcs#YY ^ťKKHĵYYXVeٯ7C +~o\[VJػ rŋbOc̈́^p +ȃlv iEIt={eD>:[Cxe o pܮGOy{Z9Ϛ y.ƜN./Oh>WG6(ou|8c9+|ZV[/]麺 uN\wU75sV˝U̯#^}n>ȟXs!1Ew*7S͌2~WUM9 Z6"{A!!v[.0QjJcdG8 eSJ^Ckk yfc5t1BX/Yϑz?,dKBѕd2b@%u`7sw8ks\00U8U4͠jS;6r ,"Rގ]Z xFXF/21M+l?vdY&S k3 }v$-}cTh$tRn#K·ӭ*)oT'[Q-9b)=Z4qnQLiZf7!ҳXsf")r45^ˎB7Ofѩ~䀘;e%X-[4ѥQ{)/Wgl(Ƥܪ=l-7 'sFq(2e>u3Ks`a?T[s B)puq%X>rDQ7IvX%wh'C-^p'D; ADQQצΈC9=;sh NFS׿>P\Wgsfe.yMW_o q==y?(y ^QoHY N~ I9ŝ~C溧\hv)ܜKqUp1w}=L!0ek5rsl:>:8a3  5 ڵwFW~C#N1=}aB~[!I4],/{C0!Yq;0*Mrxܳ#Ṿ{oj$/Bpxi+i.jû y_ d4|ꛤo"8җ^I]2'—`@sM~8@ e3!?$xI/c{1,8:x`Z$VS nBKន{s3 0ܾF܀{P{}g-Bk(%N9čMfU&zz>)zC0)!oYOeDe5l<BY'Y,M=i3 냧ayaDtSꚣP`ܛg Fl5Rk >u7Jm2v'G/. U~w,t֐>'^)Ht:-dz<:[ta lAX}qbF-zwшA'鑼cDqב[iww;GUM4|omq> %x3C0+ZKm/m1M0/`(9n;D?^I^٬o76ӈBH⦔LuWP@*,% TR栕RI.miC,\hv;N֜G#q]|njs9=oX<2VC"n6L$dXOҜypB([-4 t <+zGzQu)kn<ˈC@0AR!n'$V|G)S2}&53[A_?|fUIx}h_] !`-0M޸pHE4 K &4W +:k{cOy+-OҐ>GyB."."-ع~UW޿?sj@R/UQ7T r%-=-z*ZmJ "VKQ)E. :UO]-GkT=ay->^-eV?C Vͪy͕]$MF_*1Sp7:86l 3+^\.D> !K"iuJ*SFfDO9N*xw_ _ooB^vXI]BF_K=-6+2ƹ=$ e2mCFH?9^7n'yp HMoS*pMUR"Tw9 t}ۮ ޔPMp>@ P>}VlEm.9!ϱ0vhs B _Ƃ^p`}0 Jr-v{1CwaI[wqNrB-4>ZrBiL=>(ݍ6߃d,mJ,SnKO*7>:_wy6I' E uCK=F*&Zխ8#%e@dMM D0+VE{?[Yv^u:4"[Ȁ@t/s,(&UU+"GOp/ué_@ɿy|G~]>7Gw:?cwGxSF H $!@S,tV98w.'t|:&!I|b釙"si%ʕQV'vjbX/7frgFxOMw]U%?T#*^+(_SUS\,"A҂pATHjlM !=b.jth.|Eΐr>DB'yӄ$=`MBP\h:6Bm^S@LEHT?V A6Ov(g Gl푞fK[A=P~cJ4g e.0,#eDT'Ǔl!q4MoIn Д 1J%?Л?K5[j.&J,!t'pn,Cpzl1 `*e@Vr^8w/AXXDG_N-/ä3I7iwL,(P`"nj19o?^,3NSpIɑ|V}VwuIlV=^\#ΐMCb&CN5@7 fY*oI,;+ ˽%'Y͑E~ɖ G0%꽞sg!u178{~Q$?. ގ޺ˠetltM÷9+A4@T(/47?K"gJ2&ѐ,QF6 uPHU1ցd ,w7 /qÀ&l^?Z+آKMhPKGdJ.)j|ArFju"YժAޗz(Xs_ nwWr0Rɲr̛d>ReVcPM_?-Tm|A1K~_7E(UWJs^ܻCgdL8OS=ɍ`#tK=\$pAn0 [O]ڗ]lג8`(iMZ2?⍙H/g39 Z%tI5b f0Xh~?9C0zEF?K!/} %3⻻ .m%9>I@ZfA=O%Fܔ/O'J\NBsĔ0E U~uJ D-nRC6 w^X;L_@[Tķ.B o==(^`EOH4pN٥Ư)@@ 얗!bц>z~" ۬hgky8/xgwMo^Tۨyw+4**f_Nd*Q *?L0bŋ je>NIWR-Ơm$rX}4%jЪ8e4ۀRI7& 9 .Zr%q%8&H<[Q9iȥ*s//3^?w%X~Z=$"z} ΐ@@~!Oue gY oNLUo!/vzq42'nc8@BN4/1x*96;RiUe4STE4xDȺ CachޠdW7 g`A>R%})nƖ0hU&~<C /w;*Ã2sCׁy7[F"NSA'ȋzས)'ʒj62m]-f~ĽP 뎘AC05LF),Y"tDpPmHRi;E>im岷}V1Vo]&4G& }ךKBc0`#rpm5=ƾ O Iwi6EM⩵;Jho7UҜmW*znIğ`&DM&I&bSΆ*ŊI?^$4/P,- Q7C]捗.eh>+穕SyN&uVI.] :sVÚ10Wa112&&M#ލ&ɉ۩ڋc;lbbb¸8MպfU4W2Cp_n6XXGX]U&!:GEvr-WLޱMVVVW62LS)Nm rW5v=9Nzq8Va䌨Ԝk+JTa*變ުS}lo9e\SN59ea̹\ː\ܺIܱsq8N1ʺ o2W\kyGX]m qژoZ阩+##.dĘa:Cl7a9E0rln8Sjo2+a䬭V%68N&ڹNSUq9N8Wr\sp5e9N5\&uaLL,LaSym)jR.JqЧ=s,9rts\ˑis,XA4Xرw,wZnoOۧ$ P 8>f~RA{s~Y׿#ݴ߮O9/ſt*< '` @%8. ΚZ\ \EncVzy!6ΛYJ 9j~IxЗ eѳ8-& ݲ+*J߬ړxp:ԎaRwjw ~봭` UP`k ; V7t1@Q)+ !n餞\9=n*jx@5͙ |۫5zN_<^wgS[_Y?#pă'd34|h@"XĖيgt2 qXm2oTDQtC n/2):T8Q9-W>LVO|Yqu&\8!eeK|KߢPvn\=`Ň wYaKTDFp,Ӯ:< dtO32cx]:A˪o+~B4Ҥw5P`VkN,MaN;1gGAAB @ל51޴F93{:'rEhS~_&+=zw?Gwymfǝ㘽 ҳyZT'ZyIw|og|g |TȞlO_1~}g~/:$̛rX`Dfol":ؐ9`hפka;lS\iS{fZP~jGis}O"YՆ[`\BkPװ&V@z0;@^WXI"l5|Wʂ @eX1Vo{>=9î'K֩p'zftGռٿysF)9-1a~ |e˘.5n&|u38at0ο^vWNrd}ʷ>,/P֏fu8!PHpj'ot|Eح1FBO4\F73'c.sn.񆤥Ox6d~Dh&?tb.D*;۳[t u꤬ dJgn&`zGjRӟ^ɋa Lv?pVX/<+'.CTcA)9SW[:sllhyXN?y\GotB oЄK R@ r"8OL f/ԷSpwoUӾvK򭌡D"DصLeb[GOLM OJ7VbMo_~KUWt*'BM!^r'rq?&\DBD h7e9ۓ9;s4gbh5N=H^,P *OS}wv>'ٰ3|)7 w#x0{3Ϣqs"E/dM->Bd=+߻T ck<3WÚG˥OmdQrE]jPe?tdSps~`L@]Tu~Y~lU+uPz`s]|h Z_̃}kفf3H |Ei)#͒kcbex暙 [C\&sQ}VQ"&1;TCzfg"SuBUzEe C_~+8(,8]6/d: qiR?g{XUl2ieО,KZkk[FOQ˔U)sYbIBJt^nmLZ>|u, !UGU3v"=:x`;7hWT[ސ?_Q5X2eM?&4u5] &6fh_,en⽁$GBn*ؙƭ/25LkƓ!C(\.77 R*9(˅+OuԵ?ƞg01{Zv'鹱qgrWbN;cۤGĞ؄n oH3'YP8rG_ c~ $ǫMՆ2o=0V#!$F\տy,+GLk^fbOx?A{RM=H`\"+c Q$f-4}G-vH?Y 9]8L^ѻKxD8Xz= 06]9[KXmS`aXZM2s"84'8z/o; ݍR֕4N_I<ˆH&rFY6u%J!u@軓rCo4.᦮R>sJ IY^}t[su;[t*1& %pCoՄcY 7W n VMA MFv7b]=a :_<@cuѝ~yB,UexouE]-#Gw8LȅoC1cpU`QΊeb msWt;/Zf "@#nWw=T4rFk4ܚi) 7A?F/ & k&g.16"?mƍ DxVLeRSˇ X,U3AqsMf7ĴTxcܻ+vS*Z O>Tt@ zUtCw#IgѠF*T ٩jE͇u-68O1 Pz͚qjgH̬pP`@,7ti/Y2b2XDbnXy`ƽ^|Cl3gDz0(,x4;&1p;۫V읜jr;GCxC@$[chEf"?V 4^^ƢAqȍ6ץVH)j/8db+`N$cX*-6wD4۞Û3L:`؆³*]ct׳o˹V".1j0.d i=b΂L9y][@I8m2n8:n ϿySC?RmnrEi1zyla C_1ߢ8^!UҦ쟎ЍdN͆EpoFL AþAUKr+` ,"Mz;n4w23;\=plh 5_1{l+zaCU&JG;|2=f)#a-8g6̜\;k/b糐ņTaEֶea+r8ɵ=]1Wi[=\:ɳlm wqqj-FRWOnƄd,d#.hSPҕm of:luҸ_,;zLC"m-l;$ʅ!=j?lK9 Z+;.?\N(gύFxL@l UxO3O ׈C47f: . UN-vхǕzWd}X{,::ĒgyͿFA*y&U׎3U!eONuΔwR>ic囓i1aGs{0Z}_*= Pcbx7F4޲)BDh=J2L談,2H ssew46{&2`-[ȐF$fh5?LD崷Wtm5ea&%w`v/Ed]ea/17a0y;.41n~eEczΔDyO @Umx;_SZbS 7g-9l`em]?,^mȔ#B9]皂Su~\=5rZVUub_ %GXI$:푊ۊ86h:^Hw6,5 d$K'+/;uOpWudw>t]Mc;gR ŌDPqB q+ibt/Ne;K_9QRZ_0(VԿHsU)l èԑ{mc=wZopf[>O ryau_ۮ}RJXY\c67 fPfŠL޸cdͼEӌ{:OQ>O*qe#/^8yK,ߧl9bꜽyKw|{"v4oO+Z$ e1-CۇC8*>Sc>>'ɒ\%ʬb8=U ŌZE+Dܲѩf%2@`$P1qWӽUK>*̐dRY`tfjsiѪ 5bC x"0}wx(U4P>,}0^J5˾]͟XY,B)oKKgꝨq2>Q]@mGJ)|-F<韯\DETCa{?:i̬"Htder0僕b*0v1l(oޮ]T*~W_e aF@ IW쑿q#kecn>yxp`KlZ[vX䢜`#>p"XKɘ6*#tv"A*c?fbs}t[.VUPjHPf.!u_!m/3HyoD.t&w$+3%a,OwHQDiRT5'$yktom/ڿ3Ug2f DI~'Vp=e]nAe&qӬGK}[R>]pY0#TrKh:tۖLJ^俎͍b7T't+c CyH[s9e99jE6 %ާ %XMJy[O]}Xm>#iw08Wuhu`giH9 pq)RU #9W&4zJ+leX그T+F j1xFqbdGګ] qLވE==_MܨftKqtrD4b7ؤiM2@/h {Y,uX˖VG-jZ:, =l_G+y_3T02a[~dqTj;HP"haJ%o**N [nuwۙ>eɘ#$?OyIV.S(ΏOUTfna1| &,]KCFB׍WjNoY?e"5T:YN?]94o6?@*6_~@z"/s]Tt[/jN0ARy`L5ijNCi7)ٽ*}++z.kA)蟵s+oK-]OiQռ17Л8lm&_m/ 4RQM2soi" ҰhʆªmhEbK}%{Yic-njVt)}gq$ VB E`Laa&- -ԣu߉ǟBv63Q}s ? ҩ ( ~\( Dd{aJ.YGV2vk2kBO|] k$*$׽"e4 ϔM.:=X7>r6ZmE#xֻXVcBQ{B$61 2HGk]&1̉HXޢQ22$ԕtS1o'wD 5X:rOQo{E3,b 8hMRj0 C:'1@*q\}F>-[Gre5SuDk*₨{f*iUi݆ΖZ;6y9.-Q*^&ۥ˨n.qNWیK# ԁgSx< /I!0cpR_Z*%8fGF*o.xt^V0dLfB/ޢ-`}-PCоm+_,Iȝ2]aߥ׼y+P0tbڞ޹ㇹ}KK7^,sVzC1XXD|lj)ouM~ SrQR\ZRlD_U=GȺMmnu]bcc=]=CSSRcx,G4N%ڤcv;;:ФwRH]J_JyY`jcn"+d:kch_U'yaOŸ? C):fATqߛ i^H{op`COk9JD>A "zc$oo+N.J+11*;F?: u$*~#"p=]hf%lRLd+Hi1w:"Ȝ~MXCgtZ ??tݚ ͋_[neQ 7Vz/M"`&rT4ϪrFZ|(~kk߬_ ' hx_ݝ$K!xw;N܂/<ؔ}';4@"k b,*4tϒc(!FYa^}sl9ꔌ1~.Gif6bcq!(\@ШҌ}P'iW,mv|8עVکp6lQ/~VjxH+N6Kz#ms鎞1^F׹>yNvҲ]7]T^_5n [ qeEG[*}7/(VtV L\puQJJrwww y=>j-2dk_~B 1|,Qմ{ju`YK=c[-([Oԇ Vo:]V_#{88iJ+/}n{ NXC1 o=bh>w+X(I&gky+p:\^]ETz$_ךM;϶ =up n侯5gQE ]˒^7SiqR7{FBEOT`#JyW^vkXK iC*-ڇs\w*UidP1nG쓒o\;& `bZE5J)Rq @cхChF>x`d#$ӎhJ Y,bn^\Zk8_E`X;ݸ$a+ԧO,}"Sk;=,9T,0V}m?I¿dᦟ`VDA -1|aqÞ]D%Y1xy{|h "_홆9'?<ߊӈܯY2eb;'#y5V=4TXtbF'Do:{ܵ-3 )qd 3&zN~mÂzSxAj7ѲZ<&,;RiALM.҃»ZTBxfjn6nQ̷@°M?lC~'_2{\H qrA& Waq!$$^oc[Jdsy^9 Jή/gGD })˒rqwbcs!O RBT 7|`/>'^5葦W1N!fؐ9J#,A,Kbyiɨs uC+ڽTȌ·Fn>ךf8qAm#5m!:Kc` tVor5Co<| ؜N-\r} }s{0Iʚd 1On]?9%șԜ}(Ozf':v AׂaOHi&&%:kO*{L%aI"abw({4sxa1[fm 5x s]\v.r-N ASh k_m|:~X,%y@.*&bDx*z/uʔ^[i71|a?dCsWJ0V.TD)vw5v*:>Y>-'\*֓֜:r>.%•'F=#SćKjx7ODׄ8:Qj½m)qb*FYKI|]V %"@UFZ7~fn~gQ1LL[Jv}`?wu2nlݹd-Jt񡹗m e5]gٵ g | I ?^a׶)cˉ}X4_< s u:>E!]cEt艇$}dY@%gI@gM3^Zپsw#G4MlzmaQIzMУΠrAG+R,k/t>ҪvgJkiB YOd{^VyM2 6!>/a ꔣjɷQ]V.q'ܮ%HK brԔv,rVi7ѳR7b8=p$8wz!h*5E%&[P,L:[SQvj兽 siYWC,2߻5@v4Q]bP?؅L9W*KS-Z8)``HەoRݗ"5|mJ+;VSub?*̓.y;7&Z˄ڒdo_ȤPTf/7aq!'/^ `Nضk%\}>;t$F莶:Tym7 ш8i5JjwT`}Qz3횙)?oIPJaE^EE\Vi~m"4E;ZB]X/]|B^-W_l O1jgޘ`膺(Әp굀*vVwjfZۦk0q&Hi"suCse&L=-y[=oO/"2*F[{ cX]39niqxΙK bHUi_x{T,'P\F9Rt &ɮ/~+hRe1t14w1GRUS,'u!8-iusbȯL@&,XYo,2fs~'D@b5lHӇHWלKlG,%J87o NZb;Nb*${fW'P+goλ8Rv|T8mG2tQ1o]hfٲbjCkab}b]~ 8y|-eab7;Yk"RZ5!Hy(P&<F$rHgj}B o޵ܿ8PCEϮjW1,s:-Her2+-zј.|]2Hͱ.U?&Gx_QHUeb,0GoWU՟#:Oop)(Zڄ'3@nJcao8pBwU )LU؋@z2f>R?M $bĆ)|ٺ6cīĕϦL+SL [#S>ˁJLH!+&wxXsܜiDW⽛[~ ΫV'i6OT-}wDD*l'vSЫͭq03IQ-a,XGeqXm6'Uک%iQ`Oq!vHE?je껦i21а->D;W%F_=LfY9WYDr A9Yp?A_qP儰ywl~DmݕZL=̼,>؈ ٣ ,5(B]'nhْtmi-G%lw?'hE79CCYobBL|J ¾#}#2Uf} KZk"Ajwr2/1_~sOrEW TY}>qyX(x_)D}|M Yn.U$x;M>t4phe BLK^;UY҄kIJ& a A~Tu*#Gzw~7ޝS,6yAZ+Ϗ*7ʨHOF*bVIU<ѱk71JqqTq?B' d9vwI?{a;M<-/ Tu zY~T7[RHzky863PߞKtQEP!||/g埣#[4_{줛lK[XLk矵y~GfXJߌ ҌnGgEݚ5JY!GHoڅTAN6,H%yi2i|:yLyMi3W>FYҾrA~*^V{gFْ~){V=n^*~rz$ȅIùGxH71)H2E#W&(Rݐt~-ˌIxJbkpoiQ?[ -Xk}h<um'#{+&yiaFV>4h;WrMUkZ6Ԅ͗IR̮fDZZV?k;Fyg-p`Zi? rmp\lAv=(^׭>uo{V: tlbp73j(=Y4>o۱8qE{% 龢!a#O hգ]JIk9[OĒ?3@4P8ZReU^ ]DE蓼=LN;umx!Rz Jf]Ƌ!h@B- [ $ЅPEa.,:).[S/ Y{~c;r(qmL(',nd|#l$71N߂,Tt͢91bk}1<<᦯-alEM'7j']Jȋ]NUڧʣ_\䝕0ka "q{ʵEsFa#EsLj(<E]N;ܱ+#MPxYJ."zDwDď6šoWUfi;QKDׄ5~ԍ0}ӛ"CѮMZE13[0壄XDDMbr+8и/VQ<-W+'wxzM3aܹ{YX֒k".$r׮LyJҺk^gj7侟dPc̮e@3z$k2v{=TYFr"H~oy~) iuВ,+% mw0`H{_c*KGNߦd#"C-~4]u$1/-*)JY}?R@-]:vhh;Ovb} 91G%7CVrJt86P߾Lu.v~zF;'u6l=LG§є# Q{տ'p" mQ@2;~kVmU% ="%>0!vѲgHBD,X?˩wlv#BJ%(7$(@W. - C@9Α]jڻ’9g{BRY#v 2{{M>dVNCKW'ߋM;k岆ߊQ"ae'2Lb8c×Efj+1lFeIpbHb%4`όAݑ(!X6.b]@sR=7PJrfވH,K0.{X/"b4Hiq=r9Mv;[iL%{:b;x,b<4jfݾn 67s*fOp cYg Ymǝ_6aϩ=!Ir6(><4wR9%K+K1&1 |VkA ׃oEC;xP5`\1gcnM;I~h?2.arNBI>e$hQnu:O;I\EQK˞|b*Znݭ-u:vi&a<ofxǻ X(w-:ҳr!ߺG[0q-;Ӽ]9}d0ݼ><cbINB3(CךhgڏǍ*:2|G([踂#ӁK[4-UTKŇ.@~:P VM8~Z[2 I|` 'nY^xl_&CbނH፿xlv_ډW۶_M6ODϭ۴س鑂ϕ[!Ucwkk Jp!Pi7 -4BQM!F«.flco "Ŝ3ޖ-EL?%#tz4.i` D,gmA%i'ir9;CS YM3Em^/lRT!U}iXqfOj'C ,HN _ff_W;"8g})ro!cϺ{y_ٛW 㞆?g\n-:3 D6a Y^*t[$ aهbKz?~kMzxWMZF}#}]v}i󬓼*7Uv-/ي/6~]3'#œ zM)̐fFBBD'xM`0-45qMѨgM,`xKݼ~_*jEmç˅ֿظLzDSP#,---@ǜ\*[Q6%2Z|P,'Oq-%DQ@H0:[E'JLwѥ) s'O*xv,ǮeD1!=є@d=e;D7-ju4+@ɾ( tvc~洷{oG+̌Jn$ϑ!@H&[Q(JGs|F<vMԩF%Њ꣏|Te}>fL&)c7eihC?Kr\Sq5yWWFQw3jtQ;cƄS؟D*+s?;'qMHD~{+1Fwiߩ[zD^==efAOpZ-hPr\wkqVDPcEE1sP?BQ}|׸'nh>>F*SRSuWvǽ!E2!F[ws1=}LD')Z?'AJt+Is, i i;'՟'63=UMkusHيkkuz+B2gHJnry7GŨ/ @vCk/ȴޭ.ysXjECwxl)a}7S%fUA^? /zu9\RH^Q2DsDa%LurI((({|cmd nҌcՀz37E&dɆ$: LHiGQc$g0?' V(2mՏaVpa-Up H}2I96*O UxoI6?{[L'Io H_ b<(Y$vHZ1h>yr~*F|wjaI jhHO\nFWgzŇ+Y 9>f Z j>0({osz_j&8L_"d-TQ@Y@ui^#|gVMZϵ'?)yamy2/+.OX"%vFUo1Qt_/:]cU1uft0m8_wVtI{VUߦ ~ϢId^ /UO2{Mf6#Ł~ 0yp1(s,f3_bJPydo/^jA{U(___^:y/MSW)20AYBd檝ϙ"M=)U3):ӱh3g_㸆/GB*-]6뷚 \:_e Ѵ#A 9['FWlI Y261pDǀn[IɲuL/*y<-|bOnSS J쯝xFX o ^ۦHMe~G'Y ֆW}~?"wp?7=c9EP`wWrfCSrNO'7ΤB2՜,8:.cpO}J1`m~*ibML Q_,H_ UNg͂"Y3;-o 2%I$[Ip95ioƨ|qP3$܁}Y!by>0kŻkzSA|*3q `WƼq6˿NF;9G/ .S9<mĚ d3-J|u\.]dDvXnS39|mJezO1A#vJ\[>opRoZXJjq I(>.*qm&S*;p]~v x10W]7Lmos^Ud\v~sdaj͇"yhg&e {?K1EiOZgd" :NBwz->s@c:Jl&Ɲ!'O=~Ǟ;9Y!^/%W{ F]臐P ei(gxVGS z҄ h&Cc-`}QrL9 oj~j1!1ڛh$XW- ϊCʝ@PSk\A#@`Y@NDKE]S=~uE~rHO °@6wYܨbH@c!H\enQ W?3k$L'L+ϫ8$DV gJϠ_;"O7 H݋z>"p4Bl8,io^fFswS>CO%v7q6o>ʸ+@G쿎_G\޹)I ݄lj3soB@A ;vB*Z%;V] W rG T_y .|o1qi~b 2lfU*&/ Dj{8w&H8,sKj&vkg4Ycf|(1턮3Ge \BHߌ /ЩS#Gˠ oIߠM&˚] 5u1M7qO&kQ#:v ASǰߦh\lb$Tk=Qmjp3V ܩy GE۠@?"ex/(p#jEȳqn*B"B!@jф%KbB' UΞGwH M~Nca[|O{w)@/ife|yؾra@@ 8dy?zjrUe?sllr^4L?"0} 7wL=KM'f^jvZ-EEe*g4TCYa*2jM;['^_S\^XnS/ʓ( VrKIr[MWQcSYXf۲Y-/=; 1cӘ"ZHmǵ;1/I Hv6N«p;Gs{s/^i-ov82gծHNǰ立1r&ߟN˽"M)@xdc~3- GH+)Hp!>Y,؟2nMO.IQ8Tm7> kZ֙~Mk`N$n%AHey&УɥA:cC#H0WwqN6؃7XXLR[*U>iHb!p&1'@zCa<+ƞGၾ7`x+&AYT~` IgX[F<`=unYI m5Sp_W?\n٬'}EaZLtRo9K5m%-+ =K_dwhD|9Zcx)߂>Oon)'peֳ eWd}BGS wiƒ8n_d׉ZN>}FOӌJ <ٜ^òK2oJHʛ*˚f/9| H=ӡw [DI]rjc4P[B8SW5ݝ *R8tf`vA\\+yKc.D#6mD<yǴSO- cFhcisB*D|?@t8фjgMϥ}m{ ڕcHm p yO g_|[滞 +-;KG{Xڅ_=lx{ _s?oZ@ $aek</_ˮ ~^+Tw7YN+ ]߀Aџs}d!q#pqFy "D'U6lp؟҉i{i|Uuhm0f3Ю5uPihtQЋZ@jE 0.ږư'W`r ϱͷ +dNM/njnIdˊ$XzhL9*T j|R\3ɚW@?ۂ FS:K)"*k+Լz^]gLX7eE9 z4'ޞ%3RT_h{W2fLS!(aoH >j.bMpP*o}68qUHHLm^AZNZ2BߩoD.Vw kBGe>@tY  IlܔRG,5^\9PR pd~-{;J<'(Xn`Iv$[ m>ʂZӝ2세&$tNGnyF w<Z&ygYհlfs !^~2[ V<>zxB6# UxﭚĬ(` }d<#U0\6Cx()m)\fSm=Lj%o QB:/Id&-;C"G>iGK!C>=R3>8y xaG?VfQ[LpМPGzƘ-u,fFKEr%9FUN ZA`ps05ľ7=-$ LC?T=Y**W&|cPڛ2aNOVτBqL.EJG;B}>fB, FJp4`߯>faÂ\}1SE嗥;c j:o& H"#bis>5*Z3YNe#ϥ(؆=޴E=?'c%Y ho-kI#w~Ǻ|x05*4X/qHx͟El7pAb'wS#;b[R ƪ(W3/B-ߺ2@W=%7`H2 y3 #%uhUoi!2鵦|G,@i}@B㖛ӽ3E>.X1@ Wz^R@w y9ލ޽`E|@*`;CnOD {uZ|O#y@?Mq@@>m2_^{O CDha40LM 1|Xo>LԮ ba֛,qXqZ[8a74bŽilFN5Y4uHKR l?CV d\Fsp~!<>Wd|u Y9q WjhJYt;W\)m[eeDW󊅘ZV7( ƖrUrvt#ݻ́/0BV{޳ OHm& "JbDk9^3p^%Wo!ziJFslHݺ7gH5[dMB? wB ,x3TZŒ~[/5_Tk6eTDzj{'0QHo%v% GV"¥p+щ{Ȅݾo*y9jP@4.bnv T|]C/3d+~6W6er4>Xؒw^CL gcQ޸]g4r9%go; d5 ׿|(FoeysX􉦃AuF#GO7Glc0еQ3BD$Ю죤p<"+4Y !I d2* *#s&|q֝vm-_Ov7p=j(% 8 bZSi_O!?U]l*tV7ѪV*ϲy^>Ux2l.VFD_D+AWz.~ u]A#\r>jKVvK hPyD8OfS[qW&i|O V]-( ˽U*Gg^$7%Y۠i׎*Ը7gTJĽ%~=Z9,<},ƫ .'{?1"3I!>$fUwvl">A4[զ<{U:īߚU ]YY3g]نr7R`!p9zEt<͡9>wYuV}KsYW(ݚg6>u@7Ģkj 8CoV^2$k'=5mm?CwN~-RB SVH xHa@6 t<M4FwVgl%^ɗ~?䟓OZ ?r*RǍ=&W52WQ֐:05qVţeMӟ< !BThE-33!pZNbSa%sb3ꜷm+֦Wd!f4 bqbR,O>#VMVܩ>k9`RڶlVR=KqlVR77 67 }O|?x9 FfT.ƆD^tᓗ%m+ē>|=+"rz(f ܨc>v-GR% sgRg @Vqcd4>2ǪZyN)JvgϓKʋҰȍJxgHбZUh4]M4-9%}6R&JF _)&c}lMӈ[=?FqWMQnmFfJpke |e fsTC@)Wj6񝣙{2c65>,2A4HWpLK$TO[ǚGyI>O%lisԼ( X h3l@g&㳯t`Y^&M7v2z),G0' K|X( d->Ժa^CiNuPb+X xSq'W&.?WO򾵱}G .殬@@ f=ZgH@n:S؈ OeFY.r%VBҫ [6}JV,*#fC&ذtPpꈭ|1q.; 8aHu5vw,b7yI]~ z:}e,f5(fðn>ϸ"֟ĴH?fX2=deKþJ%qJ7r;Fx{Ԁ? PsoWvnP *üYURlhk.wyL?]I=v,xJ_@ O ~C>/Lv8D6tbIfhu+%囖@*g>yHOd?TJ< hׄL^l8eRs/%ʖ}<Dt6p[)jKM⠺d )ZK^ewOZ3˿kI0on[6DeT uJq~˴!LIµ=jFfOc*62QdMw'7wMcDHg Q{O{7rb~OoLퟶ`hZ8:umJߢvllϏpbEYŹ>DF: VH@w48\&t&*AIy@ғ>k־||??%L)<ϝZx#yiO2V2x);}dOw5k1eN7yƳc!~|W-;G>C\_:pX b<:}y3/57i#)+%B=VBl|-' vS?sܦ~k}y# ů%o $h@EF+~yX4M{wZwuۈ:7Ǣq.8˞fڀ-5Y29מB_o1kjP|lAXkoafO Ԃ]QJ7^Y(vDHX g[ugU"oI,\Gv*svqeSXdr$6HjG CYz<X_K(<Ew+C ȃ}}8:`|XXS: <t/F1&Qv/+0띪.*6GV8Y{it訢MhsD]-I2V2R6Gɏ Êû*  JN6"=9=͓5dq^?VqWMc0Tގ U}lnj +$Nl-԰:Az%T⨻K7Fyv7jea.6+fy_ [ȒYވٙ[* a $WX bJ-ojLZ{F4½JU[W]~O"62˃0 >`\HmHR.BW8PB('G4.SU)!3A2yb9[4?u{"?-WZg+KQ_xRMr !Kzw~ǖq-2vˋM(h$K*" vp[ʮ~bPA6x@6St[C#-%|3l}7M?|Mq|bJ(}*1$ ?r ]BlvDZ:GJ҃lK\*ZڐS@WԶc$h gu2mZ0qOݼTҌVA5U1\vqFis z9c %7 qQʷpY2|\M/\x 3C1ri7b/ L74)T*wD'SQ0<%Hv˚r`4[y?NgEfHE:2"d>eoDOq]AYS~xJ\kyOf];:󔸀^sȁC}upFb7ng`kE~GrCN|]]ckrM24%6+ܺ (XLa'{K%H4_jæinGVro"ZXbV";XԤ^QVn㱖z%+R`>cOZOIfج̓ EDYWNaC$wOZܒ08r_7hʡl#3_cnگX m[$nջLZPK?а[c7}s5_Q=~}Nt^79tIv-c>F pD/%91erI*pb+eD!*VLh/l%N&^ȋI40>Nyɋ qOtK@\s?rK`kB/ C>suj_arQs,]@mPIpc@/s`pmPCyˀ#*W`Y_#c+Av?I~־*.#{4,Ƌoį۠ * b"/h!FNn-ѩ="G1)Qgϥ^k [n c03Tf)RszViYESukTxhB.BTU?Uutt9ncB@HJ,6:5i{eJ! 3M*AtCh!&t4ݟ<$H@iAkk]0q٩di@v([nY@Bsz}q@Di-5 {Hͥ*@ZDкXOD 6+ˠ Wvl4[JFXG xKOω>&, aX@H@!M}jm }T0ۻ ]P~&<~Q Rߣܦ}C a(柩r\1 =[nƀtg8ꚴ1~KLDyA< xJтEM8En[zazCw7W׾#qUQ-&Nr OTJM|n.bDkʹ&L%KޗQ_q<~n×Xy.k~i`J<;btae[4ϓ•ltR)Wܠb 2K{\atÛzeC7x[;hu(@XMKӎ#ofz^9]'up +=]Y)wHvv=i ?Ÿ9lP z Mlaͽ # Y!]2ָLB^Q^fp1i|H=@M,5,!6 #βK[pnDM9PcL'K~F/vW}#VTǵ=rd 2@0"'|]/)Wh`4o5`¼g޳H8zUFb| [H;ǭNȰ{ڼIzFG^-瘄2c>?k ̷^siEmfKƂWm@cqb䠗T~~8s[6;HH_HtPZEL[hca30{;\?\|s>(,^˛/rL9ҥ6w50X'EPH  *ZGE>*dz;P]L'{d+uE<V(}V1jl 7Ͱ(\_ԗALnR@C6 JlWW2~詿>o߻jT&+)Lo#z#U45i;bȌ/b-WdN˵7VENv8|rg⇼y7˃K"{ָkWͳvzd~p f7ĺ99i"bZ{7ŏ`8m퐦/CڇgBm_̕;C>W_L4S0 sBjB @XBAci0U?o b}8I(dy5]6G@6UC Ǹ:K ~YblM=mB@MTÜraevp4D$~ge?]ĿNz%5G>DWgl/?õ|ڝUJLbIRh" ie{"Nݗ5)0*t,#[˭"QK/n89,)Xr@Yܔ@qe'?dƼ6xϷ`R(ϋ$D{u}QE36)2K,pu~B1vNMpܶ=K3_-'ٞA}BhĒ>&SSStt7^mcJuQGU|Zx9w,k!n"1A khCl(AD4Xs0`hMxQZ8>o%*lBx>_C[4c!k5".`wIV6þ" LfTr,,,Dij˳ghq@E]¼%0@gRJ$643.-Q\J{Q ݪbS|ޝj.t̏τgW\06ȗ6'O&yxZ@G& 5J1=ERe WTyhhѠ*zs"V}cQw]ǜc/)N.DBN4{w9o{J6S@^];gЏŌ|P_Ś^s<`@tr` Ojcoa.P&rI?qͿ/0]9OhMU hshZJ—B{QgyHeIC/v@"FʤO!O/Nw~p"܌ZD#C"uOPB5TiWyOÄܠ1{y+9ݏzR@$vX)6@SiƲhwl <=7QFMϧ7o(͢TACp{Y~c wwE?^v,}~eY6ꄆJH4^B.= Z˒>>(yYzfƸV1(!'h1 ^פ8LXĽYi^QOGKD܊ZBE.a iRm|_&VzTxJ{ -κ}$YOIN!0XVm r+\sE|y,$[{h'bWw]PQ1X/:o> ^n{r>72A-{ E`Fx Rt{71ڱ >/&4"yH iXy r}R:Vs@cI^ñuT2z~p0.dس:԰5Ƿ^?%2Yi%LgN3tmMaأRX%*o?%࠶؋Q!W٠Ll Ivrt&jpM(g0oxq}~"ߡNBKl?`JOF}hPhFH%;Ӳ:ЅTJg-j?,47"N{S\ *y(f\zg[uڳ}8l7T#B`|#(qaZ=؏z9γBBK!X gG)/]߬O%  @~_O˴=bjN3TZ42$qf&p-[h4җ[{+e*׏`Z]qeFGr|k\E-%;0<ėm2zb}gǛez݁-FY ,jX"2DdQ8ˋ=w X!ڀ! Juh׍ShcX@uK!G#?S=w}}tVje|Ed[Q4VVѾM++VnFh_佧|/^tD)_9 ~+rQcy:eG}j!ybWqW,9{*JDZD] 5AgC]xsvnɴ 4?P)}-V]J N;οCWDlPNN)e;'O\Dr%\ e0Al³c2I<gX/:5qS|OmzvbX:ϊ'<_rnF@iI}jimo[Z:V]S"Mk@rg;CFj"B\<%tʫ<ļwcn1T*.^e r'5Ɓ]O} 2qf>7}"w_Y3]kMf#e pߔSW#n07|_Z| t#6J-]MDRsow H4-' HKt /%b}Z ]A{EN7XתZB/i)u|`0PLb_|e=UҮ$Pewxh8ՏG3`%G݌4G]r(6^+w8z A (" mT0[0%@#U_Qkd=H2A 3J˱x&- zMS^H%p ݶK#)Va(gxRQ ̰֯tP p(\JSZY$bfՓ+rvںj@WUZ5DpAɇk}MsȁsEW. F cuFW#nL\u5LqNA1kwYLFﯳ."B"5/.$F~wXO.줇EbM㶊>t?6Ȫ$p6ZԾ.!i&Ag<ǻ̸sRlw𩼠1]-n7pn7q7Ÿn qnp% >%ܝDUDvt{VЙ Ra68 Fԍ]&vh NGP{`zn(7Ԟ& "ZYn=Fr%_AVxtoW껶y8|!N%ȎQ;ī?6);9:9T>o4s6ZEK/ˋwJ3eփ{q$`IipRknr.aE=i#O7H/O^Sf3r%3X*2ͭg]dЇESji4|\c/]uW2ђ0<*TUDV͈r7e0[Jk0^?>++Œ@V_9OڨME*U&I?fa)6KPDx}Ex49|c@c ` }(x`( H /L"s.rx=WgĚl);}[r5Ɩcmž1(K{31*Ktjşo`s>{۩V1yC^Dkan(@as{f&יhP=h2>~8P<;WW`7QY&m1@UlS?+۽kڎUY?~{apE ]zph6t/ ,74!ڋpehA]$0!آ*߅':i?yŗ ,ջQMkÊ1 TȜ7v_}M6\Zir]Ia'ӰB*jaũ]|]>Px3u=8>. L]3[b}]tMqPCOvJv߄(u[Ɨٿaw u֩7"fnvw5<Ϲ6eFd^cX_DžQ_BĪ01-5P[ې!ɼRj;!~9]8cϠ.[3\kxY%[g SIL/ lxَ+12)zYmi*y(`>{>sAy RIzUP+,ʚESYzZkl(05I?2brTqa XǐوuóMVIR1zouh}49%7l_ΩCm׎A;Z05@c^Ƹl/3Ӽу^Q5Pg`Ig_DXgE5wѡWCJSX}ڲ׬("Jt9A"OT" zZS9bQޤ }?eOqҖ تz‰dfۜgVF̖qt.49hxQ~s9XV=_:  I>aeE3H?c; y˚wR(Ud౶Vч?nKo%h `i!`ͺ@CBszq3m1;54BU:9wxB(`ЀB\ (.{mgxknC>2+Afn-*ܲI3_ _%[Sd拙G]^Ө\hӿiz8r7UZunWK^'ڌTsiP^PB438t8b d-Xk:& \sfnVz8f 1f>jFI1k<'x cUCU֗$DPe@rl$qDᩴ%mplZi"w C?.)QI>e"K_! 25:>7]*ӶE2?//QP3eq/KYl/E@})Zǔ賊*|fʩ_ڶUs@{]<,Q6^@heKKI#t5Q/0us]5q#3M !0Ƅ t !{חz'?kU^钑^-?J맚wM*R~'I詔z"i5DZ4SHj0"hК+UWiej[jS+jmMVRdI Z&&oLpLYLmM MN\)7 *ܫl ..ܘ LVrTi [ Ťl[UFVFX0aaa`M7CzpUdnMN4[WoM7jo5['}RM*n-^0Ž aXei5Z+Dٳs܆ a 00!C 0F`a!a # 0d0a 02d0``  2b0` 0aa F.E4ZMSUdLi& MYLDޕ X,VV,XYXF%Y,?)p*IH".%UOq?Uq"~GA@ /0.4{LsfXIi:]^)cn9=۸`:dPAzl8^hxJn~ooO}{c|n?e=`Ѳiɋbll[[--lZ4W~{H'9>^oXbuo_$v>czx)k/=z <|O{!dO ،62+FUVIiVDȘRr*$OKdQ8T\VrӍHrEUWж4Wչ7'BQb5W(*M˙6'`N91,6&1a (b2SI+$űŢiqn11rc .tF]龬M*MMzs): 6&Su7I M/EZ DNjA+i[q!sӀBnUJSoH5N 17Sp=\)MMdⓊtS*iMLHNuV@*6yӦKdaLF)돆oMJݵUL˚66#Aa`WʙhM0bVT`78t7l|iF {ynt:"WUMz??8䕽ODžܼ[:A|IKM_NV)'A)o,S*_^Ӫè/.5k "zSm7\+Җ\e\UMyo]zƗ6Eds7- ˞lr)ocq8N'z#p78\W%lhr!q2WB0[[Vg%2,2'?_z۞ E;^#}$9BӲޛ0l0a 0|/ҫF"aSPȘ,¬"edV*вC QjUO;9&^vZ|`iܭ-M4XiXXubZV+UnrҷR܍[-UiV-j²nV庶ZVl-ڴsrnlfչfˡIM&dSsMr#r5[ŹiEjڷV+ej[ڷ,+u-܍չܵ[bj++MVin[j,ZVl-Օ[uicrnlfչfjjd֎w!:GJT,1l )v wg{tq2f !ݻqaaLdNW=)s8D`'ErTrW:WϠM)hLS&J]\-J&ҽ7:N#rbvjbO+znLNTa` @|@ x`rؔ=j1ܬ7jj"~J󥦟Mv-H5i_uk :v=K,!F:rb܎M[$cD4 )eʘV.<C.l`Eʻ'b7=~Oy. 0t;\PT\[:THsLo^C\V^&Z7&8RnOL yv^6"AiFʒSA7P[O%hҶ0x?"k-% k$@ׇ,K;]'<*jMCjQcIBh|S } SQ3 YN=u?jا1-^F狧T\heN* hТ 2}am6UN)`@8}2,"׏Aݪ %+Ha>%Ȃ|7Ȁ%m´ Pbmz"c/3Ae_W#DTP>m' /ͦحb$ýr>g_>GΧ:mQ ~2}/Y39B4b,!ѫ"A1bab1b,V Jy<*BhPꪼ%Pz> >Xց֥-xp@AP[' V׽}f2#EɂAF_`a':\|gO{u5M7vP8/TRrU{U<2seAyʮݯA{WduO #JňOϿ<4xll٦17UtrSk%r,#hQ7"ρ;tBUG>lн0!81b}vRWyh*y3-M<:~*Ը_X@{ ״Q!En6NDm--!r^7ѫo8Q,0<$܎=JwydP!-MvcЍ}p Ѿ YK?_v%1}9*W?o2&*&w@q15)Ge:>^O\y~gs9EEwP+~_)_wQtrg|̫Y+Xo7 CAz-)|UX5pZ,X->>܍W ibųt-. eŌX+M-rT])dʘ]{`0í ƌ0'x_qB{ '5 p,*I CA1-B*5-d9dtg2[ سA1d0%82Cmd.(Dd`RӦJ;m8zy"A8\ &F78~w۳W8[;ka\ܮ rM?u̿s;ƤK 5Bt@FDD@x\l]GSvS^oɦϗWQs2,t_YΏY2ꝢJb`-'m|.zz љDP_a5L2O'}o?Waat#OOu- Ė+b͆ 'y^ϋ?K]Vh'H4Mʾ3q/S?wO]jF†JXο@|NNh7~sDARmq/~g)%J蜐}06$_=1-JJXz)k/wS־ ̒%LdxLl*>(IU< ~z dfHCl?L/Ӌ[G]Bj9G@$,&Qeea##$,&QeeagzleR8kI5)=}JJ1nS~JHQCO/ Hbb%8~j֗go+yoD]Âk?W~޿i;-_z/Nw}Dw~yZ꨿':'Y^_Y V<T NEJؼPIMV)\ [$ FL+2dʹɓ&6NEKrr&TTJQ:4_ /~>̪${v]gkZ<1hdXhRц6660`ѣ [604a5 04d0bvѾa1wdV"ŋj ʰRnSCy_tT;D-^ţц2X60ёa2#UVUV ,,,,,,,,F I  &0",X )Dt"ɝR-r<]X7ޙBDvp{B[Aor`vXԖ eמkwl&M 4 ?aU^KnהѦP}Zů%(yĀXi  DЋD0@Bcz#CwZj>f;1gR'foAxC]ǰկʁꟖF*랦m׈Bgѓ9`xh #UO0Q*~ Td[zZT}/vH~;ՎwKtllmFkgr_p|Iwmu͵,繽jp_d*pO? h AvH< )%5^&y~)6MSzy)|&7H*+ a稪- <$ mY9qp аɕ"sT npdHqn7o79^r6_G'Khښ[+k_ТۘR 0 j9m5R'9OUDzc/?>ly<[yi<҃dwZ\i0n2y*Mb79\؎TܹU6N 9){q8S<_ׯ}go~Avu& vM&jÝ2ض- F&V}ڕEWq!x ¯TI=}gv/ U?c;ޔ s?ݏ(؁<~*.? >ὓ<-:W1S|_yϷʦpwMfZ`5l0@]dva&2(TنZ)J3 tceb0Uc}<˷.^ʮ%_[[G'ی! ,lu4+sZzngJ' ^T޲LE} [97n1 bK)yJ\im^: ^^*IDH=5ڥybRo` 9 :z]_zN'i2S=ۇx?;PNSzFlElm[S7ĩٳCmrܚ&7ʱzMqCSg{>~~ӠU=Ͻ8b̙-pp.)Ge3 ~vN[|ʪeWJSrنS*wQ$ oGK clL3 D2Oz:$/8\kN9`Ҧ;I}浕C뵛X-|: "$0HA$D썾[<9 u?ɛ,lR–5@lo?tX> &Db"Mt XLb>.K%&=!7԰Ne )sj|Y !Th'p]3";Y$[L>)q8y^+ YP,Q/ 7ꮲU&|wc,L5ȡ,2O-^ĜtCяdt$Gdp$ Ysf:еhLP$! =ʼ83xy:~7 DDp$x5V#d{HZ#3~>EEBn!@ >; ͉BGBtcj;x;<`-!&^6ӓ~y}<o'oSc7f,=U'l_[mCg,i\Cf^ؽg/u_? *oAjFHo0ɳtB'R4̕Oy̞Zk xu20LgA/x^@j.@Bo}+ج^ʏS8Obc>[m]Oϭ?n lȿ|gso.+5y']ް_crn+)nSJ4d %K ,1Xb1j@2&U[j}h;OroO3І;~O\*Ue'@B#0*c0x)S=zygaSVc U)_E.OĜ%#99pƢ|υapR\ kO8OfpQZ—z*ss}ZMY ?Bޓuo;vYۜ2:75rәΔoat{%)^Ѽݚz<;-ˍi}p)E7C6ݐ3. *`c5&Ut\tKfE;O} Ùr*9 b JTkGPU猽nklhMAѸ6+?c#XFQldn[ /-UQ B̽֩VO6ˣ76e[Y\gAx;>NX:ֻxCPADl5>Z#[]:iސkjwH(  QYy{M0{ͻH}[RW?5LQû=}W5լgSqwx~}*4A~jqFDA(ףLY[ه͝S9Iol5JzZC ޏ `Xm6$<@nZk0N!WwyIjh^8{CyPL*ʻRX5cjRt@!2M^mw⒥htkNWU!HLi/ysH??6r`J:2tإުx R$}/ߺ/L@Z?CaMwgqgJ)MtCn%a_] L8g~3ي(\4] ētnԔ~1kTIryGv7åEgJ3OK. lW\p_右΁`jZk;XOpHU.慺HRUTrksXVuunY|_ag9rzV00CN W]iak2hg[j96[Q4虹8*Ȇ؅'EVFL㧶 B (0[JhQop^4$謰=KvI(׮+kya@Hp#/Xe2*&ߢ1H@@@%zyYc:^?*e|L!/œw)5 I+eC*Tael5z8kc#lfȄO؏UiMQ97،јϵB PHH g4 m^n*oڧ96昕G|?O?7v~gh}ܸ[@@h CHހi8@x;ڜ7g@Q<uLy;-#2eVkPX2^}&;M ;('F$!gkUu_yʪk̥)=tI_Upx?=Bhs#v@Uaկ>X1,-nc5@歭2Bg|( b2Eټuv'{<3՗$c@;C=Ds3OE5_Mɯ`q#v'VB0 yƯzI- ;.vHPgE`cvhȕMFM(ֻ+hIJGPRgDhO\F2U(Veh |F$|w]LFz36OU(l}̉Dk!ϦC~@;@,XM"V"E4h8"U 9!>|!T̽ xᕫ.p  /Tz y.!Ё~:aJ[j|sn :ߛ?G{㤟='Ϧ_pPVΎWcMqxmYi'x{wJ֓{֔bdI-6ԏBG& nyi·5GEpB8ߍdy"y=RfUx-iH':Q0{C_+ ީ늑M K*/~>^!?I9鉻=>~q{YBs>>]B}xTxv:)bbi$l&lvCz/v:߯Oy)'&JzQ/ V+r쥩T\oEqKԆ)o)`OPop0L'wKp'eV$beVUrUwղ<])P4t:tTLDUSbvfJ;&ByZ , o>č~w>s[.đIjUDb hwt59X/T`lbF4,vbE2PtN f,fc*cQQSJ /|"~x/;tWH<)i4O.cc*fC a*u1GDGw:|nj? S#1/*3pe&tgyQ}{]6HqëCªλKghvIH.G .TT?qَZ ƧmB_Z[rG1Ct4svu  /H Onu\4 BݨM!  82/'rS9w(U}3uPaJf+$},ٴ*bԎւ7" &M\f^ b2oTxb336܏. GW7ƶy_˹a3͖Aj*,_s?2R <D+v Km&p dCD+4+(]L'v%h]iG{oI/p)qP}AR~NMP6dytsv30?{;}G2;2`c^ R۱yƚA 9?mX.]!IF5/)qѼ%Ѻ)~Q[EB3*np=fvh^ٿ7tVW_&Cß,$E38 ;Dzjʤ5U|q>om?},!# !h'ؙ`X.'ϗwά)25@ S;{e\yTߡt,`۟Ԉ8lw[A7< s⩻Ր~_W ayL/!=~M8騐 HBMbxu2ԾD2p%/d79rXO }v9>;wngmM2M*ԦIS\JlrU0\8/ )v3_;࿟uvrTTev?Z%4𥾊\QUQ>xT >z˸OWlaՈŵJȬ&x&*bōSLU4ؗu<U̘`a.x4KFʼ3=:XaebU6wc¨P1_W¹csߗ~A_`_->C?ݽO^/^ ;j6;GԞ*;޼sxLoX29t+i &ZM>eUs ii^ =lEmŗqg"K@MUumTj>Ƽ Zރ5~cpf /u+ 006zBD`C`=Ȟs(U{8Î Ol ŧpKWkAb~. 0g+nwY"YʵYP9-W-l6x -;OR@uAك@ F$6 XASx5%Lzt]Լ!&FbV`蟉߿s-bT|w !}>s{ꇏ=uo]+^x)_}Rb2Xi0bŋޙD- *~')*'t?;UK8N x&6lI7{n.p 폁 PJ@ ަtޗ`c?LY52\~fd޺ԽdkL)L,^vO"k/s'(:198M$Z+s ׬U@@T1HY_/ksc7}ut+U(^#DBD\7- ʽ/U;^GK #pyEԩy=2M Lɓ&f&&iԒaTv;̴6(H.Л/IHpycUĖJi{>1L*]wL8%'hʕ{Q]V+Jnu/y!G} I̝BPrzޟŁ\]z+g yK ^4/ _SbNG|Ǣ|(vt -SUO@#MCJq[d>!U5*D# O!}7Q:߲N,On+ܶܞNAFˆv6Hlwl<#QÀ(FߡC%NOPGFP: D_e2{Z͡!VS'c>VQeг-kQC5,»| jy:|yۿ2ge[fs&ʾ=X_DU*'8\Oo5ljaAw6d4z7zW2v54I Z, CvM,+/@Wq+?K &u-7`nv "2^b!hcst?;1G}|smex?"RvΨ["p{KWZX4>*H݋h x*ƗcN+y"Rkg/#G)W{z^Ph_혹ÏC~)X 6MC%Myj~/v wsW6*LS^,'O//>I4;RM̔/gC/Sze%Qr.?s;pJwTG*U*㴤,I^/ Û0sZcURic2%O*JΑ*>A|1\dSP(93_'-Dj;Dq^:d:Im7ܭʞxz 5=tYտ%L,Ӱ^я5g_ኳz NӸֶٯ lŶM]"N.I oZ64k_ բ ]xYh':0m:YgumH]}_zQ2@;bn&Rς0 ~H{_o+φx"/܄ gŎi&Gq"WЀؙOR,B !~YHúq^ESLz"l"/%D&HL/kA]S%y ʆM_*@2'uU@8E f7}Z8AbYd.'RXxC Y`2ԇ_TI?A U{yUz'~~ymɶAbaaaaxMFԟ*UAm)o䘙2m9Rq8qoT4)DWr,NtЛ*T؛*E5UV*bt<)5 ҕ|#zc~w(*_Uލ!|ڮ_!Y⇷~ϘܩJ>r;+]8Tr60YlM_=Pި(%I2Z*gMȐݫ1$~ֆvsT^ӋO&K! RwnZCVR7F:{l@uN}sȺ:.UJ˱aRޜaHm4mqZjҺkZ>I>(f C7>RLj/9yJ0C 87"!wp'Eu adhG{C?{e5ލ?\8nqmZ;Syom}A20给{LAF"@!@ TSf  ȅpN)1.[OKҡ[RUs .Ny*JW*?d|LKU g/Qg'}i}?z)݅Xiuj čHl_^=_ޭ??~u<ʽtDviV^ Jo9bz/R\$N O|ޅGg+ISvi1DeWoV =W'vW~$/AU#_qVnb/[7(NG GpQU.: sj ]UG׸ 0L?Z%||I jk` kC|O=G"bMEDbMEDbMEDbMEDbM%D``،-y~ &0bi tUV0B-T#sfaabHn(01-oHjQmz{NSLSjmNi(:)| ס^u'~$?kRSb-9OӚz H퓶Sҝ6l<{m*~Rt GyNT'DQ·*s kgD;"VMvIK)e[Dv~oo>ҧz-y^MQw$w=65$G~N J8&dP̈z2Z[cBՒbުi{ܮ#dA4C%'d <}^j<}~':aNj?%}\ p11L2)e.ՋgUA2`M'qr?R;T}:@&( ~r 7ج#[fW 6=LvW`רUg8b\@q@g\XwEBΛ|pzhJ^S1ə-*NG%J-> 8m{r\V)iKK>ې?̈[yv]G'*V_^#c03hY9$gR"&׹3GSBDNg6޺WJrÆ+w2i=1K=[=q͟Rso6ho{nw+z!@D"a4h0`Ա40a@ xR%וo㭲S7z8J;u7JڪΞ"^ p` 9 l|NASt=79xM gnNwҸȭN g?GA >\fӣ2u&S&MMSr- 0 /|TYιZNl]cW"q;=`cCE94N?C`ê1L ʛyp,4ihbÕ6 4W 6} Ӳ"q)JPo} :\ď׋͜ lph 0=7Iw==G=vS*^O}>5޻LdS" FbZ349r:L6 zLvYsxg՞t H 2 !M/~^tMKյΏLCҾ-?@@&@A++$bdRl*rtu(h74[JPi4&7&)wn&PGhU=ēo6ֲbdS[&bŋa,Xaŋ,LMULPާIzV>׵~oK]،Lү.;C}F{J1:+d0@.Cwb2ʚxnKa+ٔUVʿ^aӧDwT(gUrQy#xxp_e<8WvFK,'S([;tMw UOR'Sg4;ԫ esR#Jj]%K ,1Xb1j§ S7Fη-WnG=Л&HBN}'z~<ǂZ_77 <:cJ6SȈڪ`;#H*R+ռ!i֧^Nyv)E *' ;YPT;$sWt9&7TrB Y{BLذ}nm$qSEWF[y07vkSiq1!l H?OsC︱PK)I16Ox4wRUq&qpg,Ƣ i$6~35>1AL%` `*2}v.$=KoІe!\.&0 2%+$FTxc" l;!?K:A_#d1z|p6+fO4flݶYwjݙ50߲f[q% еM Jbq{oݠMk~q у|O MPSANs~ ^ZK$ZR}QD,&6JحhXeU֪o44ަUq@ W j?iB?~]v)r |{7O[~hu @4OI=.!NI6*Nt€B >O9'%5isvT:z#^8.y@[ݹsdyO6Y?_ <]05YyH܀wh WE&m/*&k5 ZƓ2&2:Bg@B @AT )-Ҫnra&nX1BܞM۸0}4p,㦩eʼnd&bhUG1}2#v[Tޅ/kswD_)Xu"Gp; "$ Ht/7 =Ev4^ߛ $پhy^ts-_#L~* Zp 8< z2˳K>o1@B f__*/@"?뫩TyNHPEm> C▁s}ǏR&HP/e1>6][Q\qK ݧȺ@]驀ʯvУHXG_{_v8uMd@@Ѣͩ'ULUGT H&d2);>]???/pzOgw{Jw 7*_'`z@hdҖ$ 2R>x#̧璉~6NUӏ8JO+zW ܟ%s3h3N NJ}Nڪ|_WAx5T_̪xXr9:cZo}s޹BJz7"T%\6Y/ ѹ`؂KsE+X^&N%42T;RnIJ.[ T-lg#|` |"tH NU;zyƇi;˩o7GqB0dx3Y ~^1`[H\5@i^k\[ BP:3UU2 :%◃9~F$}mSYy]̷W 1`z9et|Cuua2BlSL9|XJȴAPm\I94LRf+* ƲBM *;%"Ya ?q[ Hs*uJ-4۠J0jC ,?}I}|0+VaX}Bh)+V&S) ([Z6&XLn TWҩeRM&0VZ4ZZSI9S _oQ?*At Nud]iN)dT:#1Ww_O:Q'=GJU\ÉWO6`<=ZG#׳)09Wyb+*"WfտB}ho oHg&eLQ g}U pBn^&:䕄 iu>ʋ ef*'j) ; 8ڥC HVcx Xi!f̩ЊQT"|F89Oإ>[1muv铀:0çuÍm]*ޕeU e99X NK\g캷I|GVt b?:>2ٙP9oGj a3%#BLL_ct%H/)w-8ёc?r #EH$ӽd;>>{^~,gmO%]Jҹ&26>W_+~m߬, rR6ϯj `@,M&!τ@ u<^O'ʂ#aD首~m[ZeO]:׳Y'>ϐ[mTusJVpFަ$nCL՗r|֩H dYۺ63F5lr@=N\4-Ύh Gwe\ wY(ҴY#lմqo8qmjUN'8wk>u2m<؁7kI&áDD`ܵ lkl֠&U$ym,%_(ɔ@Cx! "#Ctb6dPU9s!A +T] UM-e:`3]J#@d7ӻ&{/ A'  2,28qsK  @KU2\&B;]r89F]XKozoPIl8ሃ[AQKOmSr)[׼{}}'zW_r?'aLNZ멵KMSTjy0/*=@("u9dg<4;ZRl:_3 @˧g/f"kȭY  0GQj$zSNSN)xd#}0 w[7CB 푘8`k:V>m]}#qĻ;8^MϪ; !ُW(D) 뚀N?7}i{g~s|y~j{{ߵ|(@` [ښ<]oꪓ7ҀkfHQ^-OiDҁd8'hٕZG^bx8bf6"TɎ4_ DP4)#>e}$[k/’[ɻ'T蠽DMˬ0Ed8Ap+:I?=VQғ.GIR)V7~{@?kpPt})G[Z7S39=2\v;dYQ gm{Ol|"OFջ¢p=yP !SC_EYM$uz*.$iu،Um3Ơ'LI?լ]:bKABR|~{sIt~X]XɵĦuaL˥M//x)E @.)7>8NЦ>1[[@w!(AB3*bX<7jvgV[Ci~ĠGLUX19ld,u>DW'Jʓ28y{3] 3lOhV2R).qfBvY"^<2F=ߍvy[ ~ʸp Zvȋؠ%?'RR`|$Mʿa1LMOLM ~{{?~:=?ovnoK< *Tw{Cmtzo]$@S6c%E7._ 9ȫ'!GnC g yD]YJü;O~B+xzїv?`7Ape+2qUgn2]))‡D T敳 Kѿ)Ccf-Pggȼ} T+%yde|s⮉u7:D /d-2FD=_<5o;p OsU IqyTKðbQo.Y)wI;9Rv(E]%߼uyun炾F:m'u ;MN^l )ѶxK@ML"MWk~Of!}-n~n-Ʒ` sE٦Hk~b  |6a_ hf?jZ06sI%ေ"1V ̾V;Mb׆SE}cLyOyo`5oNMAڳ*Ko݇HS<1:7Vl:"s5͇M)m?FnNʬoܸwdȰU\f"_/bȾʳZ >=Ohji Ųy[/\glfjf'W"kRU@֪a'zԼ9mpPq| <@].ԥ~U=DhW'rq!m8s 0L>@cc]g:/I?feshdV(EwnG1]pȶ\܊%;c-:ƚ/*hZ[ѽAW֭ڗ5I6f$ޝLJ.t!h+A!M\I@yBɷ.A6*>s\[SęD3 aaodx&n[h79S էjj% `D\#~^zٸZ MGɋrS} J\UU0^N,RM.?I_! ,˥?NT2]7T9MLOH+ W r)!Ñ(|`Ld9&D=.xD;Kħkɵ7B- 9@r{y sXx AMe(ՑJ#%D95ZR4R(Cж0~RJg5qbہW.i o̰(@BΈYvsR҅]A9tͳy΋loM+ >lDҥvrdz6h#RE.|fZaߘ<Ikq1_X]gC{'#9Eb25+N HFOOVv(s@SJ=ÈR6P8| P=X5ߕ2|!< - cj("e]ZLtU=XUuYa#Tf髓YGf^{E mqE  SL柍6r)~5[/mʅ(fך^_oVkUVX@D3tm?NvONn= &G;~_Ё WЀH@4!'QA[KhiA@0KĆ@JB.ۉGx7pKOWksIZT|٤|N/s(@f%"j MBVKVo/mfYӵ״ 5 \keۂMk;݈0=wdzdw82#7'>61 ` XN]ŷoˇi1:cx՚}^˩h00+o@F}Wv,gH>PݓN bTCFzJ ,@ަY֠G4c]+*Nbx:pm|90-dSN&]3f)nYH ̗|\dn b",Mf_P[/nfA@̉$RqyW\<%=5Z:%gSGOqi e$iBe/` RUI=΁s\SstX ?0cWe\vyk_L43~/gS\@59uѧ= N㳉pf2-Qf$k~D"R% 2ŠT:"\?2̻S1j3r!;A=,(G\ՀFl*/Z;}` tgBtjC'E7A!+)}H4[΍b'eprk afQ 4f䑫8kib^,Q/CKqޜ$پj^S2?Y8%plZmANlGOniO6SУM `H bQ<%03clqJB/}`ȘZ[r\sI+bݳ*R@ƙ"Bϵ !/'(Ӥ3O#~4L㨚3_Em)raQۥb|?0< z^qZǻݘd;$t|w`;A#L8/AKhpF@RSBCc8/ŵ^tGΒWY|]/[?8>KkOtQNǯ橸mJϝT^Z{N *eۥ/-9r̚1rފGixɻ}L{b`#mY,ah^Dф`ěŋ;Oxn t_S=S:8yu~;;>̈܉O %|@8JA.%<RZEjBophŸz *_.áA.*a]MVs@{U#\&gG73v^|-u`?ýT]BPVColY7΁׭6a<WK*w-͓j*+H"s25ZU}qC57")0;)`.ɯo a)CbCRyr*X/^4E dj5`hKF/ 8(=O e6E{ ߾X1| /R `.O'ٮ ߎ vmlg&siq`t.yF x"UAwqO\Lq8aܧQ螟`c_i/;yW84LP(MRvY ނqKNZ ז4G\QMZX:?+zGLV0HFezȇ<יb?2{ڐ&n8&Ռ7!0g*wɍLjX_Q b<_oT}14PD.7l936cMAC搽 Jų9gZ\0Y2};_څ렪m%#=m~E/e37^olV2//~*|h>}S_p|^+?ۛ|7m(5uNjDbIydu(5&㋵MjT] ~&0!KIчFi /?c侶$Uϯ4k56L۲M PAQK=*ȑզ i[MB[2.fԘLR14;D~qop)lqkfx[eBw[7Vf lM!OvVs2!l-ʮ{ 'MHocKiVqiJࡆYk"ڣnS>,)R>ު("i #J&#ۜ\#T})]Qucl_V g]wxR3Tz%Tȩ!%ϐYG/0d8wXn4w9^M/34-;K }2 )qKZJ$z|L]/c }f]!4kJW!'izm3@0Ûy]:hVmPcTEvA4yU;;[Yj2EX 8DhGvIHzA~.v5; yas%^ 7(ouoc JcntG.en9JݠZ)xk6Y\,?@ O+GKY6rEcL;i\xHhvik`L.q@ du 4ȊpV)?NMe0JtȠvm6:)9/ĴHQooͧ| np.NbǡI|.!NKgbAO0 S;w_e*  ?S*j,?Qk[ ?zz9kw)5d%.TZҊr.E_զ[ _EfPbRxNۂjʸ2=@qSs۩=*ԯ if c+Z9սƨW1uS8ͨx̎i~8>Uk H=#8V/b_]Al]L0qOYge);vY1pPϴSd<}.5`$iZz"_7ki~T5F .R֠}f© V>$G;:HS`}rӬ`K5KKv2Ob%*h!JCv}9۴fPuT1w!Z1TS%?|Փn])uRg=2`gH ;@_!-uL{?$a3Ken"ۊ;俕Y[ze_)i8d€cX7wCN'5Vuc\(%W{#g ,WpMO~tl |dIa+#[\dGT&rpyD2XEfe&*+kY.IE)4e-*+\^q$5±7Ƭ$~ЯWfOt`91Б ɽaDcqv {zz;%k" + kH[B-*?_Z~DbU ޺xhBSjn u**OcR~CdIB4^OiM8yp¨7]~fΎf#-߉ۇY" 6+~)L%*5fjs?pEEp*^U>%3<^97Njx"~&[}Քs);rKYW,u$___k0_wcXW/3>eki7Zx-O+UlN A?3ܪDj*ua緌*Ӣؔ@^ ρo!3pg|5iP'ꄚl}opP{~S ?utXyڕEd  nomo?0rFWa1T6w oo=WǨG־O͉1{}MA٪8`6=KUv{?ɜb,'JovZ Ox8_ȼb p,wgLKPfP˽jjGqm>™ox?1s᫯7tϨQ@&8ѱQ5RJ\4Go>݃3F^(m|;*D=<\;nT<4II ]G7 mbć|QV]7/?i]!:CIK&t,c,E™M<ƭ|簰 }G8 c\Kh~Bk*gz|gd $🡍?ErI3E1;A% s?#Ը7g~NV{|0#6[v-\KN6A3K`P e o.g+G0)zRŪs Bs/o~xE:{kE@h7rlE8=s iYjf;DA;"jvKb3`3GwC]N |[1V"/Xߚ+:X򿾆ZмYS/{@8qx5k\NANHMSArDoΨQ)!k٧n8X/Px+ o@ B959j)??r/G6 KCQмp^q%onj;OHtV@Îz 0\eI x)z9ˊ8V'=f`4ټP;\V;wէd࠳oEO`Ya i3R75v }s_#:܎Dȝ e'_ԦվpA,Yj+IZӁc"", /hjӬQ|G{c-Q  ң_/͙TЦdO|YTrڀ@,!;u:,n$=qB{Oc){|ot:>^zrnFjOOo{&ZQIk52Y}9WdizB(2Yo6̩/n8H;,d2¨ g0<0}'REY:${ E#'css\'G̘)R០'v،~o~3wp: N%ǒoa]Oӗ^{z rFzJKi.oֵsxJ V%kY ԡ'@eώW[2%bh=:fbo#%VS*$A'# E9Y\Sb(%@KQc̎Oz!B/}DjPߕ*I-l5䮔1pe3O3︂*-Wb"OKG,*‚mw;"Ck5s)1nǁczrQŧ;Fx{hL>]vW_e-} /@cHN9w8%;VD ?pǜs+kbJ qCAX̐d6 qrVIcʚ 8 U^t`\rʵbik俺BbR׻`#8OaIڼFGˇ ,Vq*uV4[@.[/m'1🵹f-d}`\)ɖ_JF7;Ha#!R L%e[Z0fU X̪$N.@񯧒)eY!G2\IS}j.iVҬqR\l+: H뷓tF2}u4n ^P!Ļ_ZZ 6،+0X>)no`9^&\`7\~7J7A+XA4h2,/+aj[V 屠 PLCכ0 ѹ6@n%n1]6PRܽv雍z$s$(>Sx:q,).:s$d;dĥX )-^XW'N4G06T!:Y{oA%yw!?1+E_=HҏBըgumR=Mrs`$X e}=tu"p)EnE#Ȯ=E> ;↭P]<+PXQȮ g? X!Rո %j7fH29s<ӏI]y˯tr,=ՌqLۛwl[ER|i(1"XHQPT tAcDbߓ2Ex`1 |2~nYv BܙЙ8}\.P.H)CFs懀<' SuW?$s[iر\>W%i* "QO-o0kLʣ$)/D'G sdQs#MTYE$hMw{("Ùr& ,=A-Lc 7ry ^WFHj+NFop['7pCTT¡L-bZǔƚfE4Y/Hp ,lr%pQ]+n(zAȽd`BIшɛΫv#&.f)p11Cl>JjSv]LBA^%EvĚ `I;߼cMkmO4$mYAkցX 2L:m9N=xui3('?M/2}o_P^ 8#["fPHȋa%eǏCdHDFsW4."FIZyS 4k!Rj_{jrA˗lϾƎ% h&='k:Urת'BycպX$Y2}jo96d wY.3Z0 S$HV2{Ͽ0xK95\L3#GZ-g&s.*<}A~{:ya*: L jؚf=iHZW';춆9AHާe<Α;g-,U+ٳ9X~\*746 -L_R_I`6Pw$Ml©jHCx|fgvZ^SY ɍ蛒rK}Xz踅X{0$3, ,9?!_W͆?@>AmAZR̒^Rs?џT [|s(?INq8%j9.t9--. :9niFo''5`SI3%ED1%7 b(F"ጠH]jDP#3nbx8);bU[~ѯ[ `E],ꃬBs;DO8rb33g#_kon:>N5D#``xs}1BβT!0b ⵁdZVaH0漴5qS]_7'SLqL@1%# *͘Mx;X*YcE{+Q(s,[۪&+{K֋msZ^؀c]L bY .ɹ,~JAP?pWs1,SDh)<+T"R ,Hq-BG 0&U[:Q\Dy~m@\I{E6Pfi)|§éy$o忞 WmOn?m]%Qr[t74g0"!{9Zߚ8.WWtt'xc PGJb<\>T @gKٚ|-21M>K l(zpZ>q=۝S0.N!&8HbQԬB@WPL=W cxEn COJP0!KX~f˓0O9$aX*qWNs:̾vxCr"->Ѝs20kHF!VGp^-Y8bvg=<ӢK.7 Bp_4MDqLR?-L岁B"â'goQ"O]ّ|`ɡɥXM!wƾRLd=aH|G@'_ձo=#/’__;.:Xύԅ@(HlBfzKEy&t_Vw rBc3{=K2Fyy7!|t\5 FtS'BlC+t_.{q{x 0 ִ>qbR2 & pӗdżE ӿh񭾳w,V•"G}UJg&>2`4s?c(JԔܦT>Y_4=xQWśjpo~քsP㠃`LՅh*Ců 8k,`4k7 HOcSw#ܘ\G pq+aWϺ^zDc}OeD"J`LwnF{. IOKl/j22@ӗ.nROέbuUߩf2t?NW>$[d[&Ƨ#6IE4DcpG1vѸCBF Қ dXE&M\C#SV qft[NWh5w"(IN tD3h![m:@MBsr#{vPT6r67lP(_N\ ZfWL6{*3z<4j"K~ YvTnVUQK;{;-J-&.j9{\}IP>; q[Qz,J#-UЇd0c_0;nqa0/}PO&]|P-gg.,~ "nYFӂ @5YSeK=تIUXWS3vB_ fI7WS';9%,0ه-$U9 H_ΰ+-pFE[@m2#T:s"y$8Vm^_|CTTŏOЏLS_]0|bMzJo\b~U)u;̙WM4'7-Q(]r_f Ya.>W?#z¥$I?ԏ/2DO537Rnm=Sm',r҆Ņ`CԦb%Kz=xHn zm]+}G]KLkQ:}}@0g9+۪\,.E[*Ӟjќx6v}?;Zm~T>=D]s퍶ǐ,:SXZ3^ <{ԙ~ê2LbT_KZE/cUB ؁ő\w LBD^ÕV@A%(#Y,RL+ A;R3_뜳RbFϞy FÕ`k?skH?4-x3.b |"f'zP$ ^6/tr, w/^l]vI|tVNK ڲqKͨ }t[}r5+5Dĺ0b$4/&">Y>iɱ'EGPjddWT2$Gk8tN/ Ѵ4@u^("*}آ=(pps8:<& Ja]wH*ixia$DZ Ⱗ"ޡxhy-il~BmDPy=7Q|[CqEpbM ~GYO_ES9[Ҳ|D_tAhn a$w͇w`|;ƌVtT)H蹇OT ϋİ6p|akN^{6ׂ3lZU@2auVAbWp\& >.,Ubẅ/א&!)ֳ\M0DUM^չ*6(.V 489~!M ѫAl[kzq&%){ü ]TViJπGH}eSBBTW- $ k Rď.  \p[z\oKЮp#8"Aޞ?8aPSۃĝ##9P'4-@-̀m+/7A}:!?n;*=8#G"gϜWӄOO`mպ}}$/2$#ORLHU"}Ta5q2su=:a+ [ gL'D|JY G/r8ЀZ꿿H@g,1U 9U{^ O9[fj+Lg5)R[jʕ+B & 3 ʓ/U%OJ`ml˒ݿϽGD\=. Tsw+^,Wnds}C:?[6R\UA!.ꥍ1'+Is$S)=b埏D*mGV9ʰ9M.\܂]xkލ}')ȷo8,JKs7M(ژN c^rި)rqc 8}"mi ~\_)c;T* *&njLtİXujLk$n "ee$=qA| R ۫*~UEpiCd 9L"|.ɦʰUZT3M%9C8 J'03%.aY_3+⊖leF'i[W s˛`a{ǸbiDI/ t$wiSH[:_LY`^ 78;z$pw #;{/["G~SQ 1#9#0 g0boYTZLqlo?"i6X vp>6TԱgo@7ܽJ+4W~6%ߖ<_ҏDi:~R5/Jw<WĆeȹJƇPkaO5liLlb%+u8"2IHh.Etz,hQҨXxjXsʤY?-0RghҸnxNt5Aot}!K1V0_Ũt[kB5&C50Ӭq `%/xUGyŇmW̓BSAVʰd!0Qk#+紖j 4">A@;>gQxVgآSM(۷r sqeWu xq^x_^ͳxEH#8yQ"PEj?~5dIiuکF-lX&Uj(j7 9wT9`ϕ yr}yVMUnX>mfGsQqӝ &?F.](~/f˳1u?){Q=>#g'!{QB]B9a833Ltm^ [6]ﯩ- UIxP,8h(8 8I.OqZѪ́Z^4Rm[mr~EIu(~鐆हqjq?Y ᤅ4'SCR1Y?CyKjU1/w3|E/z%Iѕ=˹.0 1eA4jMCU[Ģ`]k.?{s%j+~5p`PH/ 38i@KeZKd$&<bg $VDϕ87- H$~~/.RYNV^\#7 8?~Ey[ߨXB1DzPf'0K9Іj h_*cg$ԃ-~Uڎ*aEN9+ J*}ҟ>Dp^upWDO zTϟ胕")T%b_^߾зc|cT~,dO X{@0p2]8F鸇@c~iH% C;32hgiG\BR*ٌ[!-엖8NAZ(>H%%^Uh Np #z񜄃u̥7$lh [vM"ZyWeO((,{>P=l S c*9PTVC0*tp1a.-hхL GWZE~"Bڴo`2g~~& ZvBf4:l3<|eUfih3R/W ϵu %x%aZqVfp/ထl^3hY-:ξIy)+J#'T!ջm d[" S kA3tLW_=L,Qfz` oόt$¿tn;ZۡqE뾈99!ڥn`K|toFqNyܟy-`suaTF00ua}q;iY ε(P/."ʵ@C_1>U7hnI뀼TSC*+ 4#5!0Dީ.7$bMͮ֜"h}HvEz2]Z6z-\l~'s(@S a7-!L<^Tn+{NgR0W8JH6186pXx:&ut-14{h?.q$)fP]j;J.''qQdx! Ùcz=jZvk"D6HZZBJinh&nɨX&R% Е+PYa92= !纃R5Oᛗ>śJbx϶l |n{"muZM<4)9J<mʍZ#B"upP\@t2PL9*1߉z]_qOa&Sdnr޺Ɉg2d!D RŮA#&>t<`3FiDxѻ^=ӣ+8װS9]lt(Dap@qe ;F 6vK4DgMԎ9{6$|?ퟪ+!8uh a:9ɽVUUpѩ=(0o9)P4o>|,9v{^ǯ-?-ohB95-;4?80+АCE6u&۲D$_Mu,dO(eء65MbwP%8MoJaE,pO gb oU-f!w6_pѻ_['mXŮ2/ >'.L|ߖ[ʳ"C-5reDKYͫ`@Xi6.ڻzvJ`Wu+u{:S(R/5V;hCJa< p.^XcؔJ<~#*-3؟ ܈M 2N%;AlTr_ĕG(kl^vc`6.iS^OɴY;dӅm'3`GZiݳt{PLdWO^>yNUp"BU^(#]CQQͅ (遵R#z9F:{ϐWDAqߣ`!"\)-A%P;oAN/)%T(nh~(g}?i.6N.ǸC:4>lpBWNҜLD'8[og֊bNVnb auRi)Tf|=2˩tVx!J~ÛV9 Z`NJߍ-6*N^)9eTrBph1GC(P6so>UlqX!t+5W\*O՟_|+5_k}_@Z+Am\ !؏f)I@ `SFU^ۢ]*ᢚ35/YF|at/UEInFAf? 1$TR«9DA+fyB'>aVsPuvGʸNg ]Ԏ Ւ9( %U^ؼ)i,X@?X8nD{aPX|9K -^d;2"2hz]c7~g8D -WB$0L?12&&^ C~g +n/R%Yڜ ;kNwv<3Qq"c5a\mڴ;,%{4^A5=QI&52gul߈d]iAO{6z7"m-Ѱ遖lΜJoF11se:_'(tDkq KHVrV+O.#0 +06`hx]ZXt22Um@n?y.s[X)T`j>QϻdLwA 6L/jbȫgcW_n|Di9e/wy{SDS֠|{Hâ+¶RĜ{8w"jk,ѱ{ᕁG$i;*1ua/a/ 9WZ-RQxkg."#+%8oG"׋?ܸ)2,\" ~h;%7+wH 7.CĹ |6Q>$R =#XdeE!U,YR#; ?"kG’>%}=Q &C%v/CiqۧnK2"bjlVnD{<:sƳ&4w62"E#W #DC,AÃXĩFKScAKTv6"ʐjk{3(4v%s]WE<1@(1)p qH 6 ՘xf+Z:`nL֫QOvK:GǼ0V܌C+ŋ*W_ S0ZԍhJʅ<#WSwNvWVm @ mRѦq}zzYKL-d@i#Z/QhDs<Tg, cy} +?ˍ> 2LmxB`Rf QLdO=,v U &喒*lSȚ_vԸmE Xt+Vu .5[ڠ94—8z6f"n.αȯ}W53v-he?ޠϤ%'|74(!oYaìzzU6jPt<N[)q*WN^`ƚx2KƷ`evuꢕâvۧfUa5 ~gAў)u9PҀ0&4 V/#[ΩHwd;y'da r2ldsTbA:w_pzZzCUs-gG_P8hK؋Ntw Րʯ鿩?3h}T^A;,ഌ²@%+!-(IZ@i<\ރtϙD0tf'{xɢCCsdR (7apyWS=ީE߉3B.A8Ț/l5 /O\SW]ָDX@>!;4:TNjs1 $ŦD9)/sJl܋ ӛTa39/H˥:fToAd#xjx6-HwԬy^G:ZZ#Ol. xzg@ظ :+[JD lF86\5(WgsԒO9 $p=/H\GTq0nV"_xݙk+cJn] RWy} BυVQ wsACO$xohse@.hUG‚|ro{ O~8x~,8Nt1TG`5omHW~&@>n!kIGs!wڪKF>:RRD+n\b9M F,|Fn220{t =j}#pH2=\=Bֳ=u'k 陋G?on9-(4q U,$ɐ/*+k3fmrym8Y NO[&PYlթw,#,/E|%Pk89):I 99I]7 ^!IӲxtt"nNBHM`q\ 8|_~^tL|qMJ'8゚WAg4[ @K#S`Iyxq1G!Q]&OS>?0Qݩr|YkKzI#!ke+ԂbQFibێI6'5{> =DڲsX҄V-YcP,o)-ۀ[_ pY;:n* 4xZw&0uL#o.I'"qG||kGݠqݰIqGΦ-*sG,S GQa?bĸМYaKÔd_zΞ9|pKQu|j].l^#O#L3QHq:fl8NÂJ9, j9HV 8Lu9u$L'nmnU!`F>%U(ǠWq&tb l+HǢp0VM+_Zt22zfq8[saQv\&|yNc¾ Zd3/PqQ#o_uϹ M5fkA8H҈Ll!p%|-qЗG򋊨O+OI9ulHW}k*˭w8K_!:t`p"-Vf)Ѭ/MüF#a2 tRE/{8t#oq8:TR_W@h !Fff }\`"[`yM(J>eɿY\*tg "}ldY˪H}nDl'uؒ'?YW`ޟc:*Tf;ƌbAi۸=3i=烑%Gzaw8B܅ L JO 6d?qkE#^"$BoM!G!9DRvF}*rGF3L775hɎ/K 2:UIGōcF6ú)m$6,fQ a͏C(v岸<_b{H?f_=?"^Gt8^ YY{dY~Bh恙ZR#S)K(X].{ ćw˃]8 KRvݺ eT& '6oAd3z!ѮD:^rp3icsV%vALoDMRv,>QZ$LmInn ؛(,*uAҭ<8skRSnROH1L ނr#Hn [_ֺI^;'/ͭrwPcQV551q.H+Ċ!q2 Hөxa a^ Zv@A'iQ5ay@L]LO[NI=[+: B9Y0G eȲrRь P,fĐcj気ؘރ/Qz*+~[&!nwmY܍m/-7ltV'c肒 K"Wiq ThM\Β&+pSqO#լC}8i"lݸzr re< DA*aU8=rйG$ڳ2(`zh 8X}4LH1&,kcSӬF!ՀD&Yn蟫% 2gr4rCS#1s_&k6S5@ؖN&8 U]]<ÒHנyGW>Azoj5];PMhSN#=J$Rڧ?]`l87/!Lez y+[Iro65J0&}HNtjeWQljYưAW3pɵ mAX{'D@K"d w|a m%}M9Ku6݈js2[ lR~c-1Fe 8I WB_hYZ0R,<8flCȪŕڝ6qmL{|7د9bڭK"n־ink!.SE'z~_jćp'/N̵m#S+pZ!+J hj@YyRyugFU5"h0.(U ?C)յ\裷vI@Ye<"a$8(%6z2ou@pHKLjד5sJ՜+f};6֙cʏW{N\k=F#ګV)t"Bb'U#{߇(@b 훡oP;,@ -z穎LxLÛvP|w<]ĕdto\[r0 t-Fbΐ4F:l}U>PqZjXt519۷#n^Ӎ}sr\MYDIj `VqcZ|f!j!q'Ub^?kzBKYb}ɣTjnL2%/^I9ik֮yֻ3Ͼ'iMk;|遜MQ[DI/Ya# ⮪4zSr%zrl?[Gܜ6A/WLbȬo5=dz])ISo茊i!]+8oP~_2I5j%]|~?PkS}׊ Zذ7$( o$lGէ"iY=(!P g iE ÏeVu}gjaqA,Fm0r&5孾XT^ɋ~kWV;'8aE?Uyցϵwq&gן'$yXڃ yvwLIw(P͸I6['D"U#ԪG" ;]P\}Z/z=(hj"@Oi SY\tsoobgPYD@9E\[V.#33z ZВ@$Nmaa?Ombugn[ 3+7?à"H|i* j$ATv2A.%G!~O'MOxm ƛLrZr'Яn*ߎz-^Bʂ33/Jkj?276YƞxmGj>eqss+#Ѽ}7cy#|!CzX)sW?OK deI wB;PJ{߳s޷lIegf?^QqZVZV$SI7>xD^ƥu\h͏dx܄!!HogV" $Aw8 #ዛNPuU(,d+92k@.$" $T}٦8Tgov>Q? - t mQVj%#K#$9_hS?!xYׄk B)y#y8iC 56myDu"S|W[^;ƍK< +7Eo'PZ+&$ jXTD?LfaM:shsg<5WB@qmULt ͍ɯX EAv-O82 6Tߤq*g7BT#{ǒ tp<_ COU&M#= ~E2eau-R 4\dZAF.&YPj+dҨOy޽҈lR/͈-S}~ojw;ǼPwS:<'C&FpQGr?GyLE8х5^ "^jO[xL!>Į7'Npj hUB[ι JIDԩN ״(ߌJ#x46HĴY¥^cLHiC)Nĕ*4(3BNzIJJ3 Sc~^X)1x+n) >=qD:lw^l~qBE[eBb}ƄIp1nxnVt}ט<հ:k10)2;2>6lW;>drrP{>rz0@`Z~/BNE^s4IP" L!'TOmbcB5;8/3Cc5Oz85 HZkrM*'ƺC@pG%hI;0At}҆-1audGgsD~ĥNjs@BH@$I {Pb"DtJJ=q<GTayUn!uGmOG!T(^,~M |ZÚϖأT 8EZ$=ehG_k(à }TXbŘ*m{Q_I*OR0}SF}qijx 8^()p"ӾEGPYX:@ =]q aq3ƘD$COm:imEPn-|#=Q֌s$"a6p0Wrk4wT”hiNĒe<)I[=QR|.Hr 6LȐ9ʼnٗ_0Flc65gҪzM ‹U٬HW8TH)L`xbYYcgMA4:q30#r _4k&ܠhZ>Yܯ:FEwS<.(vj=<\1mEA6{q58mA\B<q PO/ܽ,>ċ+@Dc0"̗X Yw AqSgJxҕ&4RP׹& IFʫ0J#3a5PoEJjY*Z0n6=H@xZ۷--u'1h9x%ebFnxQnkwoNʤHk;9/eOjF#2Z61LAn4b]Ep!#I(pc#%q804B$ڗ|#$8 į@N-P#/ٗ^H\]'_y2Rꚙ 1i pRt YΙ&urU!jey3 )9@!Q$%iN&!B\S~mI ^F_ >.s$`ybv%ң&mM%} IkӞpBEP܌q;$ x8-soM&ddClXIhc==3'P[%.%;hGGIzu"?!zS-X(sljBKz^-g;Č,%vyЕSy!0ίgs#;z2w<|8kCU`}xo;MUlrcaoZK.ley= ԝ?7-fǀp8 4?7aad,*V 2V2KDDžyXF?&ftGf({d! 2ˍ'fSߜQ . \'30M.IoIc^sYÁc%h`EƝc*y\%#:O\@o-s0sD}Hڝ]WiZHdM&NjdQ+S(Ekha4:e{A7{'Ǜ0vF{vڣ3$Xi!1!O `bq'sW ^UEf|V0VR$2bcX8nr{"(]O )|lԥRrh `8q~sjZ}35aLV9Y1hSLArd*20$:x=>cЩKnǽ^! ~`2mܱ]ߧ;Pһ^e9< ]f%4) r 02N`[ޟպ&8Ds.^RkX̞N zpLh{#5o5`vF_nԶLufģ!QE߁SWRc,p?8=3!쑐Bկn/1UpM)ɢ_Ň5m;c~?_RV*ˎs9&3%z4Tm :LإY8׋}&$Xui3,!ZZُ>7سS _D%Fgk>dO2 UL z# `£KMqnQCBTlBoxpƲĢ=yubiajddqƵ5>-«yPi]H; _0,نG>*\{kt'+'Zi_oSR ,l7O329*ښTm.eώm[_pgUk Rc]HW Xv^Fj+k1AՌlvm%w:)Ch#FHٸ;ޫS2,0+ j앵6z ,[u-)CO Qq?TjH1-sNX8#-L#9nSQ>_M0Ōrp4GY^AcSoKR`v`1X&Yq"G9h{i/mg;Vc1n4ہ/'Bsgy`'yo),=4;1:R*"ϰos*%5gڱnUi-6厾zWaDPpbA[|֫L[bŗ=visҜWg\κWYj ArlWjGE*M7n3m)3nŏq\'D%`{JΣe'u9EpIA$/n>WHdnI9ktG21"iXTf]C]_ bw62ЄCn.t=xmUusO7dQ*>qju")Z-lNG3-5"DXo1MK>YE~rY␯ i^ZlFX~LsO[Ghr(Umz`ި v0m,Ř3_ yu- ys)VYP0~l7G;<σ.۞ټ8r]A7̬ P" ċ(RZvoECh5r֊*8i?m%g8s2/~$.'ڝ`g(. Jwɇ|%s KiV׀B(C -*gC̊C(I[iRL?\W[quҴ %e Got6"2xd}9Awq7v9=ÝΑ.p.dOǧBSh6ac+_9 ]N8?Xl;~mLɇW=I 2}fu g-8!`ta@_e識qLb+EԬۃs^RpJ34 vf I Ga&;sմ؃2,7ŽުR<Y9gDNi+{Ec^vF7b2g߲M@mGc!яLuɹ"N~mɩ>toLhԥ}b?!%S0dRa~uEA!~v/"{p52W6#LQ dY@KfNwWqeM*Pi+u?=Sس w+r(k4c=x4zVEx^Y1X2ḧ́lPB5&qT |xPx|4(˃ Wۮ\{D-a7p\3l ^AL6 }BG >˚08-ɬ9i5v.h?`zQ]Z!-%,%tQpM4]8n<* 8̵('YS26EĻ-+檳767$s'ZQ#`E&Ho4 CS0Y3)deI:r#'r}rd.qxv1J Qr\VDQ(WuKXqۿ`郋|,BUlg5\G(!?Q) Yex~{yXMDԚffg` ?h*s쟖@3iv]]ZAUp2LREyMgBky;gңV07(I1}! 1W{ژV#Rs>sqV@:,A,YFK/;cU$BG~Pl KܣJ8(ޤ4;cB8Z<\Db+Z}^N-:@B ep˔+C >0dU `av!B*  #~|;5nrLe#G(aS'e%ӰF\E|F~Uf5F^G y/o֩EcW!Si򅕃 c%{ˌ'k҉kBzYbkĬ{h5Bxx[bL.A*tMb0{t'\0?%i+J`H7wu]c!8zNϾ'ulF``iԒA)30=7Bg\vƩ-)9&oM(bǙfЭ, m$^Z;+R$K=n¡wɠEO ;ܶpW'wgg;B;r29#wwxb{]=(6H`Q)c[]6\g;ȴAS6Z_Bo+<_~(WKCC]aAx%/`WкI Na@ a.#q|JL d3L [(yeYT:yU4ݐJ7<\E`7 a|c%cl*~$ō=ӇtB6ho!X vr 0yv|7 \ւ %0@onI I=ңs8肷^q3p*oa1c8@dz ٻFTk90~HE"FnuV^q#l].'%Ć-oL}SpTo{; `v =7{T@#zy:l_Tt֙ [Uia_hܖl.$nirPkG;@-3hД@)Ջ4.ñP' U: %ޗo+ aoLCL҃||Gl3VGyAJ!V(RL_9Kyj~EiVE `-!9–܈LuGXBswj^2\&v냚BD[ˬL{X5, ' dzs,$Sb< %w̟3CoS^Of+\BV֗%x^άTׁ*NwfTH (?"0!ekя,M AD n-}7#),haት<G ȉdzO?NSsE,q-7CJfd*?Uﵙ{cϷBB?}^ r:Y⢒=\ b&a jP"hb1v &BCP^! 5HƼImw.tosl:0;mAhUzhnUXXXW(<=CRְ;Α/WQCgdPJ`~U_dP ")%]nFO` Ej=v;Y7E1^) wkO2ԏK}='9pf'fZ%; jؕDW,4 .. @yaE!vPVԇdN/Asuyt+ Cy!;P8*ayN3%eeF/a窡;#gn$7'ާ3vY]N2 |TF8Zp|HE~kpXNZ4L S.g ĆaS50&|C,@tNG|B]C2Ay)5_ I#V vfE0)qߺDΊ"{c/n\bF};}rnHQRESOVf&^qзFLy^!t'_Jw+_ĴaufR$]#n sسG|B]Tl OC_>9<:OrǰLz(k*qQ+XK{A_chR.k|PvIui4zzw}o#?<C(Vepk[-{Z}@kM}.dbX\>ڮ?kf]ݗRoU~P-`tmլ[i| s𓢁ʑ&AROLÿKu+ %HCY6m.$ ?2PTvV^>j7V;mU5$ZT@>'f2tΕzk嶎; ^ j'  h4=|:?{p+4"$ HZ6ƕ6¥?qbP'G~%%7 /s! W7cEEေr!i}[1Q%L' L8> )| d~X3|oEȝe@GG'&"((q'E|R5,o@+{sEްN$K`O'$ }vB:ްosxUX"H)r^l8(3IF\-F/+ A*@8[E~ffUs#rF2Vy޻+M"bsg&uQ"h~[?߽Y5(Oe܋gA]#`gi2 ĵL8˼Gԡg(1|H`1 =  üjOs͐|w,Z]CX-T1*HD-ZG`-rĉ:|?M(H4&%k%mxxC`/d'*U.#E5Vˆ^|^PiPݟ+ܿ$Kuߋ8*2ijҐ'@*wA|D Jx*rIykhFO(}'U>#ڗv|񜩦{iԃ% $K\vHR8lpwM#̜嚿4^n̞J/d艉Uv>  ;f~<Z"ҤހWdk)?!`3i&"~=!SX j2ý-FM@2 QjR}X(LIf1\0%||  Q 'm*tAec `*FhO ?V "UpȺZ%TvT КyT\cfv2OGwj+?icB-!\A4epMxUwuoMmMy$KqSyh.vMVE\3EL@ #N~ős;3 ;,P~qhQje'sKZR7- Hѫ7|N!?D('ee528p_#ZXW|k/8D̗ᕰ$Yt~tC|1i{bC+9(]%YGP-Ava_댤 xX1ub+~~6uwUu@ 1㿂+ZW-]"=hR.,rJ_C#N߆S%ﰳ}>e+(4qأ*_7 IfT:kOfԺꙃ?|7+畃jt7mfHJݿ40Wմg?# 8!<}r6ﯢC4:űrR@v NS^r>m$yn`j[BXSς;^>>L'U9\] ك<#"AH8|%o%ByIpכ:?hf&rW(zevVI|:'{b!?tHSG!4͈tr~ K_3!XYWb$Ȝo`_@ufD1%s T{j9TnAV-߲Ica"ȥյSYY(;!,.ƽ݆eΉĩv PxX+n/x%L<9hoUB:kuCkE;ᗎݥ#yvl}0'VRb!0=rh9`CF͇ga!τͥ"@1T%ecnBUs~lb|;й !o(4⺆1 khTfyb$%*猲=ߴHczi FEB0RqLd #*B"(S8sqH$O=b݌CKSɏ۸A^:UJ;Ȥ}M, dDJA@ f`cV+ɗ8z i0Z ebW'WAlT?Ն8{4MT⩽( 0vCekEqȂw vi/؋xJv0kͲ S JB,VZF)w gl['x˚JP/@LHt77e u+cS..Nv,j>m(t ]"0*R`/FQمga?Voz/TuJH1_lﷃ\&l2:O`I# 'gj?^ QI$PPx5[jwM#ScXI5w~jYXbՔw yYF!]2-ʙ*4hBKUrqgy"D  _ɎNp뭌g +[ga! n h9~Vu9z=F:7B{bऽc#x;Sq:M_<( umC<80 &b,7 SX`jn(aIDE|oc8+L}W<xҘBSϿ- "9�_=֔KT"p2G!8~NYWJg(qӡQ T,9zE?=`:}ȰQ+ ǀm@S fjPXjrbnRVQi-fHG:? `R,)aa~,bj@&*#WԊޞ8Tn5f,p0׷*FaZf6wp P Mۅ)ҽb@D i(?l1\E/r/pL n:Y{J1G,N#uƹT[4{gH+1'v wCNCM?_}y$?E#2!-<>Tb0Li@' D0jRk(/lpEdVl`HGUt0U*,:&uY&dB{{PJJ5*8 [$}M0˝2on5PK Yu 0(Vcx6Eͨ[)N\kTVD8n$K$+?q01]"t7!%~ :@gmh .6A\j͋Wa>A6hy0~H籓zZf%c" јCC2f"Pma $vn,``'\ {XtT63h82=Uɕsm%۲H ;3<>AB$cF\CU *(路E dvqFx4Q=X2ռ,0Px"t vv(~jpq|r΋VײQn̽;ҟ\bˎ&t53H.6"HZ"Vo.<Ⱦ/ qyq!TB.AQ@A6K p1'59UuRVؾ.z,1 Pn\'uWf@7pWڈUJoG W{f) 'p^˧@TIc> 垒ƅJ5䥝WDȭ)"d(Y}YM$;./U"7#A"bXI<5Q`}_NW#BvG@1E 㸥U7$jDr[;dz$b%-xzWmbgq+}0/li22uo92JAJӔh Ô_e#),ā+}w]!.. ">$K+M1#`k^ߺC  2J.v?8Xȩ'Txy(RKA?8ǺCgGC քRQ5/7%4({A["*⶷6¡"0D JL&ZVbͫmIÑIazG@cs9 {Sʳ9"qlD@$<}8?5j(<)`iƍv|'K_ȠBƢ?U1X7)ꚝ9͙./Y*ӭؔ%Qt^fB^ ısqEj F޿ec9Gv=%W: M$S3b/t.{65Ysz8%Kn Ա0'r k݌?+%3 |q=&M\boo Aޯs'Ə$ ȫ'p9i]?7bKsi4 -eH/4;?sH ܡgR2 xEMt.68]"B>Je H姯druj ("e) !;}JEM s'Y%>f!yIs%$=jydwDu7E#qWbk-K jX߀T>5t8VBX SLYdI ywhR%"tc9˜h#YD~C9s2S:ܷ]J 2hM;PI{ Ѵ|A@f<ЭFq.K9^4 4Jm(Rھ-3~k_8LPL`?di$El97bcZ [I"S"aqu]£_G@+ *1ٹ!_O~G(I?)sמz@-*fݗZ@/˝L"kl&'3HǷ_/Wg5ܡ\Mr\|Pz2!O܏=`a,<`(2xD1.X}=2m?.~tbxW0Y'1a5y5qt#&B:P+]e(r:&qrЄlݎI&V@;YVD}^3`.@>vOC lRCT0bg]eE0،Suo03]ص?=8,a[(G̞@nfѪxɑaB[Q$ >dBJ2)'(-!fY*2'ݩA?`zcT`q$8dSmB$HvA{f݇g8$MW3]-<ӄGAAM?8ز "/3lPQͩ%Tz%6r==@15NW2ps"8hr(~]XnQd?cn)xp&hd%%А7B$Iy%oᐿޔ4Ws8)X֤8_QAQ,OD]Y4KK ·I6/ G+]bH2wQjsZ/e>wd&؅uYGT<ƒ[4>xqJ7sp"\%s4gy u[ѡ/yI @-Y=}%R`O?5ȓlwQi%$칏:y1( =[sTUvR[@&0Y8&bQ–Zv<=uv'sic(2@Qs?.y"|/R. OjiN--UTuݩ(RwDWXYo %|- wNG̳R\WraE QP ,2ˌL'a WrD,e1$ebG.YFB[YoVwYޱ9G݉36a*$E]mХ29A]y}6 <_Xij$SN+x۸ EXU9zscAsWuGܫTS $%),rqDu! 0L)b[G,I`p[n~ ha{WdW  8Wm>!P <šk΃ 'Iv 6zSɁ<*K4u " Bbb[h銹WOʋO)Č9VƁNFW9!ǒ8_6͡{.հ1 Ov'5񷎠SzW ؂lݗ/C\#C`ںSo 9q$;t]&Q}rGuڿ#^vg96]VsSNyU S c6%BڎGŒ^AH ܧ!{xyCǪfnV=P8x,=P0*4aY!FګWw֏+`{l5'7ߓ!F=n͚eR}RiBEW|BUvχ L#%b kPKr%mX|澺 ;lZ< 粪a<vutbf879]*ms '@ MbbMV >6E߿)&l\r9x{1MIK[S i/ I߶?xX^8IF;! xQHr0 S׺dD~[6ۉJQ ?_^ju1.@5Ij'ӳMH()ߊ%PDӬ^_cw[󌃘JHBRg-ދ5j0IQL.k,Eȳ]nz; ͮk=AjR/ ~A P#Sy(x烝߯j]~[TOe & ?Xhj:?b.ڄn8)E5 >o,p<`0 eT73?vp4 -bc9/"dR}T]uTxeIdDW|V9LX=d->  Ө M3Uqj]p']=@F&~4>k1C ^ypE`eDRv{CO.<;*,v_7X"> ϥ=C"`d$x"GE+ږiIO{zxr7PaI/i ^Ҟ9壿s~k_){K.;L9'vɮ#ܟm`.[Ҷ|vj9 yc' ?o YO^}Zwq#u_e2O8 tD ۃ/joGEjeW|Iu#OX!kvMb~$Bf57pd%?IǼSc2^8`+?T. KkgBns'JEwQjO'낻 FSHO W.:zOva{\|s(q{pO2 0KeӞ[ֳ:,%-G(c뽰7q#qXJRtyRT'k^wSSmm$h:R$ $Ɯrfk=57YJT/C߆j¬S}SI3$_U?+Z.{]v}D8${hZ .L౨:9b\ >pHumۛ GGlV'>)b^3U/iO뛩]"נ8ƁxT1~Ȍ43mf~h^븽1yƕ8_RKz=kT"1E7i*_}^FfOMݢlϰY'''!K~0ib P/CbULNf+Yq{u.ToՇu8nAdͫ=.v1UM?ٙ& ldx}L<7cK^Dk$Go:mEM.7ρ{c{OE.ij~GHϽɏ.3-zC;4lDeLRNkءߞxUek̙1$nϏ%Uɾi_}Y_/U<~"e6<,K-ۛX vђBb`? ?VI9(/IW1-z!JBXɕe`7M啺s4EjY1k=˟"*[L. #);ܢ|q1lGY Ѹ{1F7ޜaV-ujLe6(;AYŵ˕r27侴4xP٠/\alnAҎzu>OZ)0,*͆"?["ϼ4B90=;/ &b֙G.GYUIf\'U2RBo^Z|Bg:)`eXu,0͌ bſp:kmE2Yrk)iWZ A`z.+zK|ԁEi`!"TII<{?>ԶRśHfRYO{r_R+bݥg*NQ`O DN%<gSa *gP0֮ũK.;3b/-!; _LfzҤa+k7-~k&[1}^]vNW|zm9:ycP5&fI G\q8 ZF ++J>%/hKeV˸ AI}+F2mjʗgq](͌jܑq8(W&xs~EM;TMCzs 7yKN;4A/'/5^#PSTƒ\ܾEߗ wSQԾK]#wD[-'#46妖c׊.􅌞ЯXιǕo8ʕ῜K'Mb۰ӇLũC.]#4ͻa%%k3(ùI'#?~hOr:4,s&eF.ǟ#(v~NNJ&^ZA9kuB#4|1h{Zae3q]DvRS&LIk\Ck# ɓ+ǫ|u¿DX6z|iߒ[>OaGA{Aڈ\]hP;T(/'w&e_'XH_ㅼG;;цɶ+@>3BzT >/: %t7> ktPج~(ZQH!QM-)U&8w{묋?{R]-28]$l_5\s@jKZwjEv8x}hx&G>q],t^j5y?A<Í/F\cU7r]w/vᥗ͐yiqrfCYWi ›o.tyX#%?vk3iӳZ&֕g0SXUh%Lenw/>=0b {eOYE4;HJW6hB-QUޣuIZRIq;%>A E85btg93Eb:0{:;@Rm.Y*31 &W+y?3yGܲ3Sӯ2+;})q . #;.h2鐖012Oaqu^:i8;ȨB㘫X$n#=X1=uj\M"DF,(AӛߧyrTrS~$rʐ}%#i{ ^ȕ<`jUk]W0),6 .3A"ը^7[CwX] w3'rd$jU^>mٯ)ϑgw\Pu3gُlLcA8V2;Rٛ+hM Er=6~v4/M:]QBn6PD*0,D>e|3l F2f=GqX@VN!o11 2n\P3 A  ۞%ۑ(.zPo|.F#UB8i:^B,JS gA~ϡ(ITj;.^"p)L;M~L9NƟ=AwU6^iP %@P*?.L[C=V; ^Ŋ#9EZj/WsGoR&*5A?!Xҫa3̤9MbeVtڎp(Rr @,r5o>86l7;[_dž*5b]{%8I;qT  n}/ O/>~!& il$u=?ϱLWtc/B[SV~)Գ.:ěӍdlaQ.ŮNH?Q ]/Yl4"?/^+FLv"v'~7 e6(^7K,BqЦ$}ʹMcJߴ.n7EowzrzL5Yjwg4OmtdyLp}جP^Y&5< ]ӫan wqp'oc_Rےj?d].f&n c%3<~3եγLESWIUlwr冀5k7ɩGȐޞq%o;j]gn{l4*TsQǙi&<ᄛch]1=h4oQjK.l68Ƃ_܌:;\ة:3;sT>@{J-BǮN /Ч-L~Md *w2y-VRQ$eŻHJ4o2 09y q9OʙMQߊtP>}RB1z{֙olͷTus3]fz@ x&R[_&!{DċXK`c,ǜ]jCAM$UE3IuvpJ Qtof1./({_DN#aς%Dn25oha 9ZzE{Jev&^BdA ?njF4Q/pK}b3zAn@ꍗn_n; >]$gp`H[7r7qOU\^&FrЊ*4G{g5IPC8EM߭ Ffyc ?OkVP~h]"RήW;V{}ݖg;-C?Ov (+a[F`Aeg2?ÛW~so]qzׅ\j>8b055-,֎:j6=~[ɗU/ A m{3Rj4KopQ~~;vo0_6Sjw-j3Q,i͗UZ@!\%H1^Erdhk^ 1A(Qzwґ$@S&"!=$Ny*o[YCE+cÓd=4>Pj{ ~1 Uw3)FؤAl7Ce`yλCW,>at(Ei?D2jVIo%,Nc1tf2HG4ZNψF]FXq"}eƹU <{A۔cs6A\HY:CEʯ 9O'!߀Bm+gu-cJIH.Uuچ*83}eNIWܛ_pcM,;LtTg" ggs.(ִ:r&HH:K3&`|Z%A4z5ӟœ,'v]6SeDp<-Q4"v(~TչY /L+T|~,_v/ȇ3N;u-u?uGS˺ҧHLуbh!4Yls!)9H 6A}Ԥb%Չ\_^,T4j,.#UY(~g gԳP9mQD? ~F"$!hom9uV)u|"XfjDJ^?Œ Np=ZߣZiN.Ta7E'Cp !!Pw}2YМ_)tP0a+NMQZd## w^ dGCE3M|5 }0ةGnjSh10*g87m,v;ށg7i%38s 6J)GϦX,ֵ8嚈d%~U٣)vsl7dž=[ (t%~NWf\<#5<~o: :m~xc Wj7 ڼ؏ԅƮ*Up$_K)+7[W)v<4b)Rb6&?v3}Ȇ] 0RB6W u,qY#4EB2R|1g58{2}a KOcqO개84vODUu'%`ϴ\TPӜsˆPG?? 2^uE"p?_b{ym*%Ѫ%[6]p=#ᄑhHO,-/`g A7$d{Űdae$̞~ń 5H|pDO¿QV$UW MU\(]<T$B-HE6u&Luӛ/дC@'P_-bi Y%aȸThU% մ;U,ʌ{N+ceB/I.6hQ$%TJz@-%-?M'7; Y ֚3aؔ eqZctť.Rf :-yZʾ.oj=N5[d&YL#7"DPup0(ٜ!Lvֵz-w07M(> *"b2 sC9%DA,u=č?ǹXJN~=N*#D^JĚ3C)@"ջ ~9Xgmç9!;a'@ \sTj)Ę3 \)>r_֤H.ZR{^͢TpYX<{BZxYn¦ȷ+VX{l'P|*oDL/*1ik]vVo6wwPsPo,l/!p|msj2Zȕʚ0XUk6jWb]o WTה%S2+:%.{>5_竂Z~0;Gu!$nArCq3.%Rë@@ /?Ti~gn$±9 Ȯ"=Wց&RCcYWe#'k[FRM?R\hlbkzݭW3˘f m[8'ֱ{!ojQgWZz<ɨ+1^3J2XCD˪pQq [?.|}Hp+WMz]+DaI~"(!?!8Fr _ p˙~ȼ24edmN˙qp;*f-c>aۿ;kBq7Y~aSJ!R_~X6E<~ ҹdmc1&vtOGzهd/ FH֐ '&ӯxWڪfmEAOa&"+a+…r.(ԣ#Dz/̚0fwp{V)iM~Zww1 c24sU Ǟ:0w弻kL(Y:kJ 3̧ʺy/Npg;Cxd`aބ:xȐrÿTg5>fG;Y24ݧvZn~$'O1$88s6lK4w֩K9kBLQWW)ە5kh=beKAI9tU7br +r);x "7+ ;\?;?6^ރg!{sk<_[%^NҘlW\_+=^oPq H;aU yo wvj\ŜJxXƜfiuAmDzl9qsG6ժzNI`GuEqȔ<I+)c_ӦL/]ѱ? TZ HYD4Ms'9RSP?}k |ԠmZdjk̀'#%v1W>!3&9C(q+DUWt%G}ʙ/^dRvY9xD528ʫ<786A/QM"&/Qc޿G5>'Z֫-[L/\[0D$mN#jѤJI+ -,yiOu֒ޕ~?\zվ r]ۡ"")UZs۞?\ǙTM$3[~oy*'?$,BgVKjаx`UA(UfnաiALc/R:RE!jjF8w0OS09@WX *v*U8'2w  *NJXƥ.,V7ȴGsi+N%'i˨'GE-K"{55Q zӹ:/\McGPaXWx%OS\,qXOs,ϯ%H?] YմLKCW |#a[7BE*^AH$\[^;l F$|3R/ygɼp|޿ȄE#lAyB/,|Rq@([0d gq\mPO$:j7DZRα#/D& nH.m2} ha ,,$&i v I"tCBtL_G A9uDjbEhAAl7`ت 9ڇ'!"᪗f#pxinM\dA+pM9=Ag↥@5 wݤ^C+0n+Y<i?ѳ \WR/1a>5*EU'Gd<X6G~.\dO\=s2P$8$Kq _Eoeu(+J[&JI6Z([k)AdtO?#4?>AR'#+.:N:RMn&rJ@ 2J&œR1d>E!>8H'SE;yZ=$|DI躂0phUP%i>T1ظ1\$w &ڴ%;~`+ZVUL&_ҪmU\6vc{vOYẓVe}0i<՜OR(k% obr}(lƿ8}l`0d:!<+/!A!zW#mwG ^ݤ7| AQkh:)jaZ k:agmhy }5ebGq)?k݊EfnO0'̝ef\,_ MAViFsLk|xd%6+!?CtGƣt/4GYr/ [~:3\UT^O/٬:zhʆϰm]?r4".̖񵳷26QC ZPBlyOW]ITt }aG(jAPY0!17x᯹(ûϔ6 ٫AjG TqT@r+^rO~|k*bIDwk~_AP@pǁVj{isuF$1j>xg= 8 LJ3Fƾx'^"_fd={T3ں,go:M0L@f= "%VDϓ)e_#K5نnb[{_Ulam~~`zj/(򕄵|;SHo^pZ⓪̪n5J`ԙeWڛ` meK=ҳ3iKG'u;&_ފG:`59xO;H9ZҖN{85Njmj5SC#?MMWH,wpUq*o]aM %b2dɌ qD۰Bg+==-`}U /'=?8\, s8#iɦ0'ǫWnty[@dg2 LzN+h|ho>fz䧣(x]u$cҺ1ccsxw!}:ޥJM!D1FZ^T10#8:Ԗ3s?El]p؃ 󪻘P<[ָ0 t}->l"Z &ROm>0x#ʱOvN}𓋤*ڲ1E<$ύ*\XUwZbz!]H%t0`Z_7Xcɩ|*(4jT3"-k% -\fLO ʰJr/VϋXu%7ÞNپ@NRD؅wƑxsGXA ޫu=NK"jŔ?WO,OZibbo;E)NֿPYt +h7}wX?Hbo'=d;Lq?N+%p'iYqEY3BK)bo|XQ!Sޘ/ra1Orʩ5HܹCCV]5 i'mX"ޝ>"soܨzFhwn#g#Oskۀ*,N.ɓ!dBڥN9Ԛ%!˼qӪ^80!;\F O3Hج";| y٧oH3?KTF\Z0&'U{|jkv'*}U.KAh֡ьch7 cgYw prNsۓc@ޟEfx`Z!$S%=&ge:1)09]4RH]ë́56嘟l-|yBC#fզ>9FO_pݬ4O3K YݹtڐQN ?RP:gy$aDiSc%΍Ce ܛ)Yw 8^tmY 7n%Tw-+5Kz^(8K6B 9 G@rzy7ʊq`B/==VI EoTxVjbF~pT[;Zuul\kf8-AE5=~&Wn{^8ME'[1t>:,^CbwRg}>V[N; grX3H8d+cpYm%~'Lqѽ)2iZʫuǑLlw?mK bںEIV JM@8].C%r$3ȫnY>̵<|fR(⓭|J*Y K#E#wݒ}`bL K<$UdcZ//<6( 4jm R,"(qPOm2L.U* lWw}HU}2U_@3wZ7X%#,PVZ2Iym^RGPdV^܃<_PT1O:OQòfOg_Еɶ^:MS:di'c؝<(x0Zzm/kfnh1]m;f*~ybџ-+ 4{gyKnن7yUuQG2v@%à,6T ,.r!Qh5xvO^(LraߋlՅSC?"Fe2Z^ִ'#ˑ%jzoN) 3* o)~P. 20Z$f0Vxv;?Q+bv? MuI; hFY1ŧ$<D(*?uP`V0xjC74(gz"oݳkțA$lB-}TY؇/ ^y4*K|@+Mɸ0㋔4rc*l "2rK$xZ ڀ|W4Q\yѭd]8葉\b \=9QRW_IV#aFoN}{X;3J^'8^}#mr z`m 1 1o_`ڹ+c q5M5Ms}{|jMj "T.n QRT/)wr-X6?U[JAzء3>`L@ .",\qD u" IETG ,L 6"I]1BH)|N!P=34ʿܼ5X,&LOWBԪzoiɗF2R!>& DkUHD$)p!1o9 2* ;:;NtU S6hծF᫰>%aL4mlN#!s0ihCe3ZzU,b)(YRNqCN{A~qF y!Px2R*ݎQ3Ba6^踦D{)(_I=ecBGs! wv@ $,G7;*`)IF/i"K# o2*~ ,EԒAW2P kџKbңl 7C0(3ypV6a@rY~:\c/kA \&;vDZ^&$ i?}$\BW"߹|r3S`MIB?5\AJMn;5O\=Z}V (浍&fog- K7MQ Y)/G]Ӱ= rSSsjCOtmB}hg;MtS ,~}k9Bs ay%>n6"eSV@R^(h{ Mo!/,zw+)j|y+鉶n D_ CwjCbLg LP@3 s u<&6 Y;*Wb-In$1xvvvXK|I逌903vd9/CRѤؔ\_0 MIr=ύg1Q#݅Gņtvj/5Oݮ_Cq=Os('Ů'{UNQ_4{;^2*k~$f͚Xʌ [EF -Hv7 㲂Ÿ77o~1[8E=ڐ`PFΰrF_15%&'wYiNg`Kr4 OgjRt́NDrE84`RЗtG$(u;A݄DihM8[Y)56j/'dǽy b#Q+g%Sw\:kQ@#,lȡ?M|)Qo^'t։Bd#[> /:K/>fIk z0WLK4 DY_&Ș멯{8_(۸0=%2Gͱ/9X'Zni4pZT*y Q|`}NsU5W/Ŭ֔г!Y1ϨS xGKC\]3 m(7ĀhהR*qVGburWz: ҈5^$hxРJuxWfH7Fvk??JSVjaTl~"jd( ^h};+>M8Ƚ,ozX \"wHc 9?>Ҷq*-Wcd[f˽ 9y8 i_1)mkDikkYc>[P8/q?A$ߴ.J)mȔZ쪸5$\!9uPq 3DPKE%_8^!q~˔&eTpuwCB 4Dy# PP=:IoF7+9I|ӡB{) >jNmº[U uhot=F~Fy_/{ހ\_j .I}C:?o:Ўu4'xB| ]B<m"/*ҭ'lJ2XᦔaΊ)/QUr>MHt. eؖǼ"?- nMR*M餘>?IN+6htXチ˛Q+!!қ`1$a tzNyDxV lb&1R4aEIN&(6Xͷau +7фD.KAS}SDZTb `(E r NABI㓼TDr1[WENu]l#@@vg}KXۧ[c+kf׏MCV3haDib5{uR%I.0I ޼f|.ʛ'X+ iyHRX/'23Nz vaQa<} k?xo'2XL EY?03t&ssHv"$BĶف)d1"3{x U{uȶ]|8'uG g"lkP6ik+欉0u6Wkͽ#?Zx`gVY'k)OЕ'= 'FrW:+V~9%CC7aӔ&П#QF`,Q.(*cyGG␝M>B}[?#(oU?`Oڂ_c-۔vƴ6pY[~*s"XK[cGm>C rdL 5CØ1lMepd.ߖ S(8z\"K'D[輦hk> QKnLտSҌYYw^>{6(Pzu'1_ll^\ϾW+V{mlZRQ YkTSQrHwm|c%D:6`]AJD-q$x|}jxM\1l[iB9{Ѣ$5?2pmyNɟh3ܽ;tEc (zi/,n98m+n;wۛV]5aιp'Zq-,;OsKեa nׅgXu'M3Q[ !C2-:},2Pޔj& G @E$k~I2ףK&h<Qk{t0RL- Kw4c@12@++VXG1Rn8Lwir sҘmquc r|{Sɭ)7Z]\ 2Lio.$wlbyD*kVXsٸ\NS|L|:jݾvP|$8L.ş9A`+;#4DB`QO;Ȳt*HD;4r H3t^GnLG`h O F~4W=-ka6;/x+*lyƑ S5__Y) pO2ɇk;-9l%%#Bl*nG uʝOOmaKgLM!PUNir8@ J2:$~^Q=Z [8Q!irđ@tq2_feB^3.KѼ8n(%Դc[C-cաB85<8ol a_ϻ1{5J+Wؐ&P pE $8܅w<{Ѡ*Y }y_FCM6˽Pp1)?{ y ~ ZI٫~a~h}dч$?HZ4qm _*.XCۄ lv}Kr_RO@Z6d;WU:0 ,F\8G; =%#yG@j> ?D[ 񈨗T$*Mi~ >8')>ku(8?]ts9칔pķfƭ8CW p ,Yk1u_QX򣁁=QV pTBbHU$ߒߧqeTɲzUib$HPi{cfψhm,FQq+cb&QpM!|<5exEYAqD{◦V4I\pgBEAPyc37Xǣ-NJ' D\yvԇ@5-jxg,^݆"ӫ=cqs'Kqcn-a~D$`)iUƄ@'=^ 7D ,?Ndȋ( !$C7AO޾ǀ) a #D"1_ˊae'+ X[ I8<)=gEJ[*YO[8@uf ;2pBjdUby1P[cAv?G)D$RW`{;:z*y\mi3gwL)IC8t7)+c:RUͷ6Q<hVum)Q-Ί }W!η0r3IO$uӝi0_FR mߴgV|s4zkH"5"T""kŒjJ}ŗFvF]eWʜ>k`YI0|>#^1 =b8yK{aO!3D_&ߩònC1fI&"{|y\f Z| ~04EЄi+^RN!A_-i" ^8nJ/.I|ɗ@̊F51~/TFN&E>](5H"L9DWBx)a6Q-ӴUm^@ws%pό 7'H5c+M4׈==4߁ bФ"[L,࿮>/}ӷa5z-A]edCsR?lFmT[@ Fr\Ŋ]Tsu[6HpA(jbo?ߣGK2 WMCixG(,N[T{DPU㔲g# U\ZKk ~sZ\LJVZ/6GL,FQ7BuC Kߤ>GWc6b,yٱ/*dvfE@\onԳĪ I"#=@ƉZ49Al^EAKaBƳZgjQXƊ!'Pu멪K0vYΝYPP r#+祋B|Z7^$_ne qCO˓,'u>j9XrLfw栛ЊR3LIjRԠ\=+4 SM9&!u3N$$m,MYI8 ">`9Y {@a]YrĦ;k)6I T(:B潩`M잛dng"xz*+]H)C4IDTz<;?_ 4 9/w;8*/.]J]?Lӻ'vҘ^ઘ Kv"zN厂9<&ș!P,jR&AK7f4VǏi Uزk ,&b$27h(c:Y' Xa"{upˣ+ܟ"K\2!e`=툥8'vѨnS+y.p׼[vح(gχy!XTZ;)3N=GL?ratZcaZ-f"(Tϸ1,7@_? Dfz{>AT/(ҬTt-3E^# H1_ K$565Ի+= )ӫwXw5Uܹ,| ӌ+ll e`NХ ց}OjTڞGsʏ&pw:5ɝijy-v%/#37Zm2wAUbgU̾ZqrS38;Cp6І2SCǘR 퀻%E} /O ȗճ&JaJyCTh}zh PzlWubgOzʈP2[a26 KiĢWUńR'MCjU >bsɼȞwhjF;aCXzˌ#[m8s 7 jl٣L6ACwQobf9Qc;UPJL#IukˋAZ}mt܀f+߹ΰZ0h1 _/Qg9f/aLu(y/N8ڔ:xARt?5B^ixEn<66^ 7>Ϸt+ߣяOLJ5zCrARyF%v"F ; 1U[4SP_~Ewͧbڱ"lk߾`(:pt1/R?>F1F+ToY[S]?5guW'R2ғf6\i橁!"DŽ/D8R‘>6Au0C 4Y( 2<ggEIr{Fm55]fo4fd3JzBR50?r3Js%(iTߊ $*]=^~Z[A+":?Zh@хTB-:<(%v}QK KP"ķN3b=]x)ͪ\B :vٿ_̩W?֠i]rW1ģAČ\b׋P.w/cy4 R!z+5: Ck+/6|n'}Thlr[ZQmFC8xSUN%qd&RA :&8=q.mnm,9ݭ](@7Z<5HpѴP˲13 6+J eGp_]" zXYR*ҺG8دsn\~^Z'(Nw(N.adZ񾿨Ly)މIpSHTRVJ@FwIpJGb';*s 3Re|5 qc>kdS@=W*6(L_`᪄e* xT<">k}ҌڷqZS8gx{}5:ًsɊM\Aq2vƆ Iq| 0`&v|xPw[E6ў}u}*WwM`͇%$Uvw)"qi$Mh)r'K@Zk Gc,/CwM/7r w1[>E2p@n&6޷35@ւhߚʉ3!YB;R~׋z{6"EJT3[ hK˽]Hز;|j{臤YJAY? 83dr*Rb #ުܽWwM4UAy>yYBV+뵻/"v TWǁ >IŃSV֮fggI!p(-C^RI8[!#B_}H0qz %|ld0 ԙOJĔjvڰD);(bVW©jXIF.'Elk7;9kL֎XV&hXB]7 J?/D̈OR ISǼb~ gjY+Ǯ]ݻ !9Տ:EmU9HqI`|ݧ8DyEv?[)L}^ _u9ͧ⼢_0%Ah EU8>=&0ݖf¸"-ZaG}{Bav}r ՟ז&TL%9:M $} /^IkRI0bhQ + 4B~.R(XClWBkCx'p6+֋ KӖb/*ۮV@o Oڐ*r^ wے8ַ䠒>Tv(0[9lEw$/Is>q )SqZ QX_T>CB&q{ΩœjAiyy\5Sϰ#yނ]B4tglNXu .M?kc8kwɿ[c820zStW ј"a=tFdkꋚw ` Y Rb/:^e߻>upIoNcr%KFu6.b.0jJVkL0,(eO[b…^/ 1Խ/%7ON}usTVԟX)I 0' `z1Ѵ{ ޽"r}rCG̐HspnZ4Y qZiys F4xg@:=P<b2*?a}Ί ز|J X~Wív$ .czwy_-ou٤jVuKo>+ۀ8m ]UA*:47cN2IaM'̎+J+?CsTBGgQ4ll2)gICgз·~W,&Ysa%.gL *2wZͿM0vzZO~49*Y{C ;(ߚGGHœh~SqL_gd`tHdkO^ _w?98cʋvTeנ9ȯ]VrBx"ʘg&-z5!eQƛDqdu&-Hh7ums#Tmj(2 0d^NҝakPϻWxڽw?F9K]pXv,_o2Q/}w~l{}$=LTCm#C|0|@A\Hׅ3T ey֭]wX&ȬmTh)Ki3LkHH ,f,"&!ڱ攟lU~BKt;i_w1Km__C')>DF#)q82)X-ޥVj}Sep5N&Vd*NhCa WM7!f QT%6oKm<=ę "$JܑBrׯ42]3aT%q&7W<1Z/-eikaEsU51(Or8HߢcÚ$>@Nx6 PbB&9T^i8Tv a"+`fŮVaQv/`c9jsb݆w&Ts 18k V17'1t-Q:s(Rqэp\k$/kuE|P2X.j[.os_}o`yӭvh)*4hO~#CM*Cܸxyq0yugbLu Be¤@3}ĽJ <=vƗJSGu8sC=S\gbZIα0[gl`:wgINxt7l=9.~: a _[W.ֳq>QX7Da@nHcr˸R,>6LLMq!vzN6(xvFYm5hePUd9qEI=75>R+^.T IQRNJ.3XKϿh/TOIP#"W[<h d#i נH|zɾ׸O=)vL4qJ73xWcw\ ˳M1s VHwa3XGA+s]\ax 8A=/yPmtn&/FmbIe^o G4s=JlcҬ  jY8x4sYWpJtsy/ed0KyoKw 8{DQn ]Ӷ$roJ=/[gW:L NdYbp-8kcŕI =i~ߧ[ZbK̕؆<W7mi>4&>:3 W 3K-Ѣ$ Byפ=bd"J2:NzۅQh ( ̾"LiD&~Z8 q7v'}gGYKz%ŃEQTKzqfoQjDҢ[~uybeWeFv[c`A8 TM0&ՈqyD` 2 wW]_TKb{XB[ʱ 5Q@{h(wEycX15-?35ꉾSKRz|dp|a_jͿ[m S1ﱼ~ۺܘ;N78[fR7wOQ )N1f\:);F^"*Y7&K5sZM*>Boe߳mxHĔad&D]""O8v^fe`Ln>A>Rq^iu!9kU6gO02! = ff xt&nN_}6lk Ͼ߉k7h}x_'wFGd+qΈnٙs u+f^KV'쳝޽ "ŕ[^4uK%<Լw,Xi_1 Rb>` 3`?,тDSo67yLN|V <`8(C<d-S<xhs{*(HqT'<6KO?`0ᄮCq ewF+JP *81(WnIO5aX7m7H>}:MB3M0Au?s!n:7mo.]A(}X~hK)-ݩKr@% yҟo\3VjSv~F99 Ƙabz+=]5, dYHX(7F=\ma'q@T'8XP!=e+ެ;w'g#+V96T@ǜ5zq,0Y#2K Kiόۣ|֮(]2 @Ynƌx{E_;0mb[.zpfPI+V+{(An>clb Ų~\onDg /P}E jVT~{r'MPd&NJ!ݶ:Ʀf;"{Nyj>!8X6 l.by\lS[ߡ)mlȼfO n@|޸1Tك9dg4hSG_ofDc/ӚGQ_ܑJʚ4w+HBbyfZ Q} 5 aM l_VBŒ@̉bJ;Z )҅; [:ծ݋oՖhEp׫x<gd@$YDC̡eF@l5  Pa&3y1C7/X z#͙=P ڵR^kHk >Kyd*]\upja>9:b&.tOY~;jv-fC";Vг+X[6F | `̺Ҩ2[:~Gj݋0 b X|?#י%~[DΩ9J^іL3"ғł Vx9$:G隽fu!?sھ![ja#d5O+&$J\BeaZS/Q9,:YOg}>BY6e'~yJt[tZvƠ߶G ~;}0. L;up<gf|>19tKK:;=@j*kcŮ3 TWv jGMv2Y:!B q ӊ+`p,k# ( LK=Xc-,5K7S&C0~<#xKWᅃ~D ܔWXU$X֎i?*PLZ{Qz1+<?=:Lm]IŘ`W-Orba 1ѝ5mk8?l>S~՗Y$|fmV"!H˟HiؕWW%ZR_ v/Ag hpy$ 5!Dua%\WfLaU),k-˞C^1ԕl<Ʀ{,]mΰ7ioዏNZuŎXϬ=XӠس,&]ua 0=k^+HUpjg5STcTMfM6IOGW.`pu~:(V福3)L[I`8J"n3.;T#q32p\UZr!O䗥z*O<|:ٲ`T;¿_^Q6@;&Q=uȁMйwIlT]\N,;8O/Og)BippH](iZ0w/<VN&=OM`_HIaQe,F@bsۃ&=\viCg>aljVK~S*[c ۝Ӣ9^^5TVi5L2 A'<(6H\,<_wyO\_`S2E^\撠D~'&T@8%z1tP\?8F=&KAw-[, H2*"$iY`Da(q @ix+]7-vA#,6J2,ޘEA)"vf}T+LG72uԼ;OUhr/Z:i#,ϰK҆X%=$H?kƤm{K썹8D/Yf9_\3ħl7#Z?ꓖMs붢' Vbph56LQ0W:c g\ZI^ۙ>ԅvoBG9,"ϲ2sHjf7)Jܴ|}sZ^ s8 :jLDV$ߡD?1HZyć{$TDҀ?8X6a {mڰuV@`l YKz2D}cHZ<73ɶ"/Kheyk"iWgES\ 9[cHP}iSsJGgw*yV}]_?Leӑ7Jacw貶u@r40/ep-ƿ;RM DMސFTc81l8a@ $1y F#ҋYo8ؑmaK~Yʊ3"r0Y=2 ґ1,fΎM `٣.F;ڶ)~( gFfg{5 iWa"_1FHNbOkt2GȋALg/c/[ӑG88V@"Ev,`s$~scÇK>K!4,AX-8eDuѫl5l67Y3*Z{.R:_y_sbj (^U ŠъLе(n u%{$)Q#̼{,m0|1׈x1'mVF::6F:vƧeOݙ't1]ᚭg5J|ꪯr-<2Y L-V{70}|(ܿgYL&{ 9%) Z OO#Jb)fuϮ3]mGSΐYMZIACa箮M7C5WuǏaZCgW3kd]s%;%AP6NHcaSZŰJP2}UHU$wČtX5v $ 9ڨo$&g+rswoblL_ADUS _|YU͝ *s-(=t8;+E儕4?l͎(Vk#U)׷W[yUšfE[[SZ}R` Cua 9dqҞtXRV`Ʈ{S4*sX5#T㨹rj`֎}Ůߚ^v[LoO&606ūxq!**v j7gqg+nNwʖ.zFm<=4ELxs4` y;._X`P2I!x?/yxIJg7kUX,G"+hǵB 1f <{1ٲj}L e @%4o4'f-M\<7AIz% XUt'JLl0܍b36 uH$,,VY9k XH ~?+//Bǜ|3ITriTuZ 7gɜWkДz^,P+4Nr+^Xx`#"Hr651QZD mE(C-\gc7fz6=Vɕ)xT! |p@v"1Goqh&E &]>e_x~ui)^OT_Uv)!3 qU$>>V֞R3%%!Y N!{0xoYZ49*9FRGQE٧F`lbH¥wbg =35Iz;Ci =Bwn/EDL6U%k{"&E䙠kUa섣˶4˥#JKN\KTgScX VsGK ߰R,Ҋ &I{QN"H)f4^-W-OD:A{@xIM)SyaLv 1 T0l ǧ״RR[W~bZ}PGL ͔):ͫX(q~I&炕CbZCkf a)Iip+pn/l@ȟ=;a#a?XΈw##묡ޡ*\aו RxQz {{0~ØW),F7Z3^PϠIjԱZV.Ӂ=@uǙ5qa/L>RY s>7L rn> /V17,aFm@fdQ]Cla% +:$_ց<9r ZCMkT-&d,%z*~2'#DaZ#='cbmCI]';}a$6Jʱi)! N#ZM.ִKqM,lMe1p0; &$:0k0* T1~clv#vc_G;m~橬J'l  Qs'kX^EQ&?20DOR?}[|aL):bwmEMk”>FyҦܩm2Gm?x6B<.)3-xXBO'̑wcjI~[4XeS;,2>cU M mkXF0sG㫁9=`IYr "I9J2roEu+Iتb*iwZ kl,&b}(yK\6HX BpƗ==A3aph/) e]k'T3׾c|l:ѐ/lVz8-\##\{ (E45U(jn;i."qTy^EEq[;n= ;Ո'l_!}WHP@y:\U{o8 ,`<5(Y_DF VR`}e=B~P`mzã5]"{&lp ~bf(#jEij=&{喜 qjyOJ= 7%c/qbrx\]z̅sggsc`ßh= Rf/ ?'uy$cl&$|=;qju!%h%T ŧP] d[%$(ϧ$.٪cK#O%lѝouCZwp4?$Ł A7a5c ]4.% f 'ߺ>wS5ٱpv?_829#޻K" _uaMְ} SEp&r vk2UȈN>ұ{1c { [IO eK`Êfݿ;:4 ($y+-V>ELwWI0TFtI'v cF4,_H5R۸N ELNFgP`Iu l4ԫsah,j.w%Hf}Tcg)یMP$$L_Ko2)X C85U ^Vz бGo{|Ya^&m*oݷgQ # V6F󺤂D(þY|Β;2 g,@/,;(ͣ3j‰7vޠ,neUD$_ iblN1k/=(fFxcelR< vm|X^"IĐ i_i"odHc7}\6d&TҎMQ8O'ƉH-q;8B}7YnHBshqp@(k iH$=4a~B~"}% ,#m)M4'څ2v/1 nVe8̹meMVz1  κv0>w&U*,!%-Vba~GU4n\l{<頎< u[h-}G&)/:8Qjq*0B3Ec?5kdR,9NĖ 41 6O\g7.ƧYi.XnaIVoDQ8b/\7ls̱v?£ )R+A]Sk-3)ha#͌ML"qMsR)lu"\~bؤeR ytifDEAz>Kb~CJXOդꏁ1t-8s!c/4h}mh~ʪ' Ꜩ?Yb7 ~bԨyd_ # x'${z(a%Ip0\Yc ]8\t%P8 TLTmyݲStp7'z)C PI5tؔP!vp?DfAuKwmt DixJ6hƭC`W u/6U犤J^BQxڰN*kRr ?욻/YcXo0Z}}dV%.Gٔo΄DCG؉H7gbhZLJBwtͪ_:8s f^PT&@F0nE[0].kPe+v@\bV e{ д&H؞Yx߲lˮ+W տO̞Jy^V ~:*BLV1j^:~W49\Hd-197UeTZw":RwN7@ d-0`l[v{3/?Q|M)e?]Z""x>6O](*޿cC$m֊_X>cL0rD|͠7iC_L,'qyK! 'WD?Ōj|Gf뿩;%Pt/-bdYsl8x^ .V-t(r̡t n18m#ȳ".1c؅m4Ƣg1tϬZa"3`Ur#EKYs}h+֡*Wךʾ H2k($4m}d钂y2v.?>-0o/k Ry ȲlN4ۥB*:$3B O,&v6Eᤪ (|W`e2XSr&9CXXj^!/Y;{..,b1*VŊJv|ƒ_BCV%R=.uo56/+ɦtM>ʫWkd7IO!t:dg+g]Z~A=CqNG0+bU\\Ow/"dit`&踥~Ĭx|Vc漨qiϴЬ{\M%2Q4~ǻs9 ӏgGWa%j[4zv+nUSO o-_4d49@UC”t[)L9Ւ͖_E7*vNt),csZ,9g;R6?3wh/E\]&BCy0s

    tLshbuֲ'ED#+"Uien|LH< ~qiBЛ HzMbYޓi&||o]Ҍ!Bu/`O SN+GM *'5C Ҟ)._5a|V>|d՗=`oSB^1NsHt5OS u,䄯4r3\Ed$Q%uw~.MMԿ]gZ uU.N[6ʽ)m!i-K 9}wpq|ݻ͵%{vR|׵60笰 R-VZ*<Z XR (ZSp nZ)ǯيVp5?*}N] )GHcm= x.I.aS5"( Tmdj,Kh.(nBmN%\]"e4Hd@]:V>63ylbSptз L+E 74TOESx+)9>>q14=J]5ӏсmv \i`:dF0iAlG-Zcs&t3& j6=ET).tןx IrSv.ڔ*/wG~1wuJ]Hw|yvL]"99(E=U?dkLQ[qG]4%#_bh]RW:tMͲu*^wN+m6/ypdf8rjEؼ)wy^2v&Ԡ9DGԠ͏7X[]p`*@W<j'[6A ;6R@.+@8JhICmԋ$аH+l_nm9r4ڊ4͓F\OfQ:dt(Gu!"69yng+aoz$TB1WIts7izB y314[Bmq$ ^q3_=gAbl_mhUvG12Nlyj;5{qo=o%95y-MS,7y{CVmBßUZ7.1^WWwlWR,:9n_3/Eni_|-T0B*gHP|S%#Y0Xͺì(؜LjJW}R`OU߼ntu1jA"$NT3ƫrDIz%` e\R?,HKU%X̆ Erf/s `F_ |iL>Bl^2p4 cl$S GذTm iCE7gT&O]פcL.xa@wXN $7 ( !:qgLJ޾Ͻv߂y#}:؊c:o!٘Q@D ip6B^(d2draQ _Fnކ)Uso"mS//EDDMAs?otWa$dgMLőwРRa5k|sg`(@+1άS4>$,j3ؿVok Qǿ,V5>Z_+6ǾU͢n0v3Rd3=޷t+&YZybh'4q8X^/Wkey}U{ɖ5PW{9Ϙ )/^r!dFwO"^4|΢cJRPE*U'Kby{ɫTʥUq1X4ﱂ(ih"~N44._MXlV=*ʰѧ=Y5, v/e6coC'>1uj*5pWw !~^8ꥣ8ǡJ:畿Ÿذ~%ARd5pVtftŊC8b*l@=mj3>,}Te>*py7 MOiU(^puU)u[w0eoKRS/tLvr q^6 &P` [),1zHts4ER{yKَ&!Rf¹u2Q.&@1CڸEGQ_H"C=ObHVW(*Hϑ.y!zHs/O_%v{s7E'tpGI5p9C]n>Oo؈ُ=\(9vG0:ՙBw8ӧD 3*)EO±b &Isy^W=tEa+_2Ǻy4⟥Nl+?Kܼ֭"5#K=9LKe8lWYd8դ.}I9GSĔ.Wk]жV5 Sr$Vo}$ zH5 R'yƟ@ş1+|DǎA6-r>MqvlE/h='ŗ*@R89mk.Ư96H];_cN'~+W;u/.$}_{; QxTO}Ym ̐~Vq]m55#aw/^Jnyg9|x׏pNݾtأܩecJaVTrֻ8ΛN̠+=szګ-Ϫعŋ9>EFVn|Rhw!R(KKgRSQ0%M}M*?5#)Z?S~<5^c`._͗Xfj9RU=NXScs/uJ7a9*SS0Gɹb pF|VNAYT2b2*ydZ߅?mZqȁ1]Zsir|?W^܍Uc"R_. <5Z:ǘ1/&c_V{2=Ssi&`t蜧1@68G\ܛ0 r~+2” eYZN&Cˮw(`PB_xK#|@}X7=gbߐ޻lTVp98H "C03er,<6-Gvv)ǶoVo*LnOvɭ -B\^tI|l.SbwuU/;b~8~'|g>Akid⸙Ƿq׀; wau5ڵɊk]|_mGQ̅hBOQ d9 +bdh|ISkZUIxIhQS\ym7ySkA$Ԙ}r-u@!zjE.&tPY h>겹7m[]M(f' .%@pv\1<}[>y6J鬚i6c{&A8F(k^Q@U.jo$)Y؏H fcHꉲ- 0!eL= e?" *äU3U0Ѓ,SsN?85ڗ䀌Ԇ5RiAH!3 kH* A;]=!i ? $0H1L&l^E$|Z8Bj` & gcf=-fgw_m3gNZ4fhԕ#o)G07ǹvKmP "0] _bĽ.a)΢0i%FݨKʅy$|`I`o"D[Rf y[zoZC r/#_6crp&T2#ht/%9lV7`r!TH]yQe4hC7>kQMWnfWj2H[=u$Jd،h:8qcFmW>P Yr~|=LnHYr;* F'Î!bb[e87%i I*hLf#x}}@j6W!,d˸} :q`trcmxٸ^T;yn~~hc ~\]J-:ڊB/QIw@|.'ȹ@QO %>&fbμS~h;i#X0)MU*RT+gKXHh֐ sq'ADR/(Wu-3>}z'\qu"NIÅg'*9W] FyLŤۙSxmL^yf&,BC&U#>6gah_$cp+YGTFu,˲fB10#. tkyP cp[YrcB'ψOQK8)'_EC/.\L "ta8餷TOA H"`#A- zcS*H9LrfL0$,(F'jAV 2M)UT/%ԛPFy=R#?6ˁJHvLe,A@$ @SĄ1 Tл"Wy`31СF2?pS)A% !>?i`Hv2 蓁# EjØ`i'Bd-owY~sR cQOO؊ge+ےemޜAZ %+]o\zݏ f+@ ܩA<7i{Oܱ 4KS&qe(Fxq6 ;Ec78.o&:KtFle&H]riɧٍئB_#bzвg# 9$g%og/\R*'s~WYlE@f#3!j.X>v`HN[Iv +m9ԃyR_o i<'+#LX&{= `xi1% ld"~(G j,Bjf^*9j/"6c&{\1X{b,F.Υyc61'T9HӐpāĩ51ŨY$8}$?ڧr Adg& D0#% sGJ0SeT3laf Wy}vUqqjnFq23iRa=f fM) ^|66V3.Z$ɧB~ xև5J8OI|ÇM5 xf[^=qAc 24{T/9Lg0ȯUH J jOPT< P-|Rz"-7` YJl6|(`ɞ9):(:u"XT+=ZguuxQ Ym-mKѝ5aEM&ޠ1U$wq;sZkǯ]vH0HDn(<ޕ` /\kr`VÙSy" &: *kOVj〘'|?H'<󵪏Ͷ-u.*YY|l=)YwcїF߳c;fTRfcdL&WOmXwH"$."â [ fG7EhcZu2dyܒ`)&;_vX$@XSrK+䤳R] CAK9ff&P 1C[G bfHw׊&b? jH4+QU2a4#0u?ZCUB%i9a2,:E̕ǖ XWz,͚^[&Cí< cWPR{fXE|J ΚU>.p> noFxemSx>KU↤pٔJF$b!wU?3+byRT=zۧi&f;GkZ Rw-^RF~|v&dw%`]^]cw+P*h8cǔ-PnKRX ?ث|AYyXb(ڹpu+|mU3Gk^i(^KbvV:CW'9h)1ĘQx*Fpк2GgEÏ+5=xBB`H<$p4lzCi+-tV$?w`ͱϝa -əolXa=":9Ta4Jm? @+^FZ:}ԏf,W5c_.[sBAwZD\9<^'FY]fLM>K =Zth+ܠd7ض( x%Ejy5$g*ĸG4`sFKJ$$Qg 3K璯՞ }խG3Ⱥ$HDj.f-i\ju?IAilJ=XH?TEǧ_, dd=p7[.ԾeM\Ӻv->pטMe \fb QimGyԖh7aU5iwǤbgomп&yXǸrh rOarN 1 $(%wkҴO=`Kw044I'BP8(l%]b;ġ?#L(E't6{be65KHcGM.d Tn <㪖REd$*N{RbqqP27X>2o!$[ʓߥGa?m@R;EgJmD}_LO9b/@ ܿL990CYK0; *ރH3D7 ˕IވA-|D97BףA:QnC]ZK_xeOip}9pPZ ,٪O~UL_]2F$%ݓ^{! V&Vҙ̫̺GmV7>˧1uE{<b Z{2$ o5He`xHL~pPW4*QkXpGD;U*zi }u2Lj?y "_5us *]ՉD/%g(Tv׾Jx7OpݗyW`*y4$3$,5RI2Ji/Agu*3\%TZNzɈF  S6 )w>cjf%%jc5 w"j'IhhO=TQH,&pR9cfkM,QYiԹT>Mf=CV1-?90*U-ʰo7VXD.wә :YUL)IДN!?eRk,)Тy"2Cd]WkDXjY1PbrJ(|Bη, YoΏ/ LmF 0iڐw "%R@{G*%U3blT0TUm5d yUK:o˥ ")I `67LVP1PY@ϛSnq1;%g^H0Rr|O$1եcx05IC/ 1%Ir0pyN3tֻZ#qɵV zNxRaQwJ/(%߮iO"YRQwc4$N'ow!OJf\I'L $}ȆI=]鑈{ZZ>MʏH5Z~:;dVV!v~*`6C ŔZ\g1[yEΧ7е+0@35f杖& /̥}fݒ:aǞ._ݍ°|, 9ZQ['0]޲=7f1GheL'ڡufm URGq⾟e!t*7qiMBJ,p3DԸtz13#ŝHGqthbݝE ѹt5SyoN0v4Tւ*-1LHHv1JoOLҶOJEk[%rE%S;E=k IO O_8Jz媳h|7,֩H1ԬL0kH}XL1*bFTb)Xz x`U/ H/9MI@ƦTVS9|i2 =NAFP}jN4aR (_8~11ke-l"A(]gmM[WLn2~$. 4 N9Zr+?Ce.P_T- s (=3qSv 1(XG<5F!Z y)Dž1.LV H[)Ia\Ώ*"Zl#rq:[7c;s~;kV~DUCuSwSH~b8~J'UZt4I 4:;vFL^9^S,~Z]@I[8-"*nU;R deT zpo AB9l≇xWCCT?bO5 ^y 4үڹ,qʴXӫ:V9W8k",1`_^)}=}[@hLgT<~};7;Icw7`c~2` *R0s39 [c7˯k( oϥ 4lCelmn]nrMC3*1FW[I>#4瓫n^lV{<؁ r:Sv;F̹k0UG06hpt+o/||4 }5iܚf.ST&/Ɩi%h2Qi>FW_*ƣA@`ׁqɀ쌑" dͤPq)hBb̖AdSqVmš*6YVof}Q?  d8@{aEzD4V*^̑6jHw?3kajswPCAH$>`3+ٌ  p1_Ab 3[ho2>|dTL1 š\;H M0/ځ؅0Jz[Լl]dR2؃+yi걹f&сpjgh)1~﵃J11VYrƏ5UNiVyZFƈyQIbetFǾ{n MZnm㍔xἏb@XrVZ@$H9$Ɏ bH Kk8ZX/6_(NBôՍ3%e:4fҼP[OL 0-eW0 p |uU^3x^ƻ7GQ}.vN9H)DO}R[CùsaHaZ}GC8]ǼҶHqsRK 3qZKW.DZǹn$mmj OvR ^ߦoՍ.$'[gl{^~)~+y:O Khh ݙ!pd0!L}:E]r9mbyuKyH 3 OSu; Vl ff `e̐Q"ڶɈ!C B]Gid(/+Φ4~4wJJ Ot8 ><֌L;xRg8ԺާArPDڅf O#;p</ˆc;%@Ku6hm|Ie(S 3lM"q9ʧkT ,kǺ6dGӬvS¨FeYT- HNaz/~ t~,lO'O#^m_"KMHQ b(fq?c_dЗ׻k`#GX"yrf##.U<wT 4tES]L\rVz+ld8=7w%(8gn10V ha;s{9r٭ իI6>[8{9rw#5|>\o1/EqLbOK_ 8Ƀ,ri~zEN5f&(H:  hgnVt3֓ka(j$#B+z7d(ѯt]CJÔx[ ?eۉ]x$_L -`bcI>/@I&sSҥ,Z+GQ+y_'33ڜ(Jnjv1ly+V%v"p79`0/dZz&1qO%*mU«ubCgVKwWNZF,4 ZwѢb[ϰgo^ur,߽y-捳e^=#]ULԲ7CAߖ4e{T:6m.aT,sz?Ǐ%0P~~~__?{4ÉuI iy3; zH\ԕ}mmzZD#c'itڟ^VCHxNF3- D h{7)QhVIZ拳FA"v,ZsG l‹"tBlT[w0_W_j@*UȄ&A?c8BsV6# KD, ufI~iV<|RL+ZgG~hHj'٤2+r%cvR&* lS4-BB]6* EA [OQ::]LݕC)B  &,^R7'[NklښR#iH|OH`lK^>M|H_=c̽!'Zv'Vn]aTtqPw-SZ\ E6+>D%Y^0|9۸<4]CeHm] f D ou,16}3?7'_y@J"FF`u5(տl?yΐ: -X1.FKjUe9k0/9y-^cƹ8z5|Bcoθ뮛Zyb?[ elF.Nvp5Jt!WOs +_Ns9 /Hq4a[}u.^jSMUe2Aa}8&kJ덁[04oӹHɄ5/y!g(׍^xq\S_$2r ?|zP)@)I4'DV,r^[!Pt5'ޝ[u*HK8?نZ;=||צ?1P1o$c{ʭ@RUf6G2#rNa8L#=M?Ba6箐b!D z]FgsItsBgh[R|i0Y~]V]Ӈ]ѦU}o"ī.@S2D9jxawC]K]NHٖO~-*GuFI8{@sԈ"Kl+\371d{gUg:mS~iqaXT-GI9%.Hjy7,ҽfnTF)FHe/ 6pGcTpm#Y~Ea6F)I3x@UV{lV:I=hFmhꣵt6H͔ S-FB8"ԏdE GSUy*Ǒ}Bq-4 MC_ojG#"aSZ1a͟@g$:?6ih߿a,U4GbqAɹ|NJ8g@OVb~@ Ggy,OV${6z[\Z'C;{W/#)5`te{Y82zp>Q{)ednWW]]ZԧsC^?#R7&S>m~҆NUy<$'IdXJLWβFf\FW϶9\ᯏdJZ&fW]cHSr+!K'h*qܣ§{ʮeS`AgҴWORm+<şKǟqO{PmnvD,X#s&9(wJZ͖`:3_9||@6lQ#CMM]$,5 ";]-eŽtѭAAh ˁK|8|fTL5XPɲ 0Ek)e@oxGja?~!dǪ!h+n)/~~[}MY a襲𦷗 NXs{դeAW,qa,>K}f( d4}ͺL(IEFei8ԪQD٭:<0)w}Vƕa2wcZ'e|sW-3M2"a3\)ew,FEq&jb[{"珿<kTbϹ>@/\SĚx~O|QK5sh C⇂~w{%cQ#ugյ82/20;esF&+kMBs(^ _/"{lcnfDo=L⨝!F{%'Vjmm \f/lmwVu_8΃I&tdˬ|9ySYJ&3s/0D^dm_9ku9M57\F$MUfQ(\6_@f]0jؤJ n3'C_YP%<"{ZP9-XZXZ3K0*=7a&nʱOȓX`kh@ 0D[bxhwFGNLVB^p黎Hң ߊ-x5tR[sO<|AG(غCpki>xR'PjLaR_c8}cGiBmF!4zwud'㔝 {i-H;*{/S7'oG;@^3oJL[eO;vੑ-JCi|T V Qdv,kQX/t~WZu'Ho>Fa iɥfK`p,ݥ,Z `ٌ1rᗻЋ &\Q(Gk@~S t`dNtYa*KRwk'l9^!EqQw=^H{ -g*H1kLD> U7QAFʸMw!H;&[q-PsOHdi-WtҤxVĀ׃+|UPO]^w2D~hFӗ2cȁA5Go6|Ι/]dL,4QZK9~-:6 |ܰHQLAӼFCE1X_;8 3FDDC|^?r@Fd_|]`I ,Dd4g:v+#!%#0'$vZƖ[Ыʷϙr~w>{%Q ;NX @un Mf?N0ooK\2{#>rf_#wk|NmOvz9'5㻎U^Ckb][u9k>鿷._A|+2nf4yO쫭` up I( 3Nͺ{QLߕmKq>vk aVsOm-j]6^=D/?[C3\{.ɤL74q ;h鰁hB2paL:,@E xPE"c_U%!%u]U.Եz_k3=ntϐB>u@T hC@p=.NA(gN ,gkt$@&Z"HҌ-$95t rf*>;ӋIXtQL<~"!St=#gI`EOD ̳GGL?"0" ]J.ycJ%mK =T  AiW}T8kֽ Єy#l5-zcGN )V5=jO$V9)G ׀Xc(cb Iݛ9P֘;2Hs ' ^טS}KҲ 7CѥPtUOݓKH01aRHW{C+&)=ĩQ LVH"LV8yw@F-GSA)W`X"08#[e ?z~jy3Эq|(ev1#i<59)rӺ$ &MϡEDe-` 4}B!tƐAE}.x3Yx6_*vzB.zFχҫ2X-<94Cj3WY_ V'{Y`teX0iBVnua;U:quxx+>cG/8 #)[ ŏPVIH.Ab/ $ >@R&2BJP-[uO]zzA׻6S7|]F A{|}wپk{z[n^uWfnNuYF^|(WɠE!@BBUľ}@&y'EVw9- 2J{|Q H(yyF*g{s^XzvȨG>v<;wo=W9WEs>,whB*I$UmkL5JTޕMYo|o{}tn||uOnY޽9k=넸}nl|}P۴(O$D$ACsPG^!sJ{{ާ^y>y (7,G*3v-`=#9oT*{7A 3}s{F@>q^Ga(OE *@.zϯ@}osNnm_m۞$DJt*M (րQfڲ6Pk+FU*D(K1mnf[j5QI [wg[f3kU6`MkIB RUJjJnݭlCewgtMveul]*kMmݐvi[*4Q$ݝ  (P h@ -t4:(P ()QMtݲImo҈=GAL& 0ɀ)^:YM?C21{Y|3*g36X,iThf;mrvݙv~+4Ը3Jxӧza_lwI/oyu`ZBk)[`lkiK]IZa̘3ZNVm ᣠոƹ)&M8xJ1bbh001b`q\Xo9 0i6;"0w^]_cѼLvX3oqtU:L%-;ޣ1[xףʹ[zΗqP48+,9%09D:X4g9בtrگjuGrsx~fQmލ18O޹mLe11#jb?ՃFƍ"M%,9rO!uyw ǯ7çU"縤4h[;޹ u:"[z' zsNjZ3Fݯ?w691&|_b].˩W)loy 9Rv rn5dFV0py>/ txuQxy-qX90X"74cڀA t$JM\@.X C.2]>ŶxV%_-\+r78hljco|OmՈ\7E_;k F1;lhqdrY1٫1xC8kǥMS 0cG/Mrӈ!BpO̩4W]BLP~&ź*f80Pjtt U PcBѡkVff7ibNm:(vݘ*;R0'M55|jV=O,9nŢ-}pum42pHF&6(XG~֨ݑoykY 2k$vN9މZ0{SuXnp7\ӣŴjMn{zt;{[oO]WFKQB8gY͛CM.j+leLc QbjL2VL,,I.Ma *1jPu8F00|5=oRSicAhb1,ʋK#23!EfX,Ž3`f4,LdC;1lXūzSxIBae%3 d3 ̢egT=P[~BGd*d$_3_g!'?c1PQ -#1$/G~KOMn#q{~= 0Hy?[c90*1<+0G"0T_Օ2@#@ohMlYNLUfh|:/᳠PFB*o"y;1|` Xb4& {qY6Zk7PCB}<}ھ{(m|N_&>z' (wMW%qnH!N((VMUtCqP5ӛ>gk}7TY[=Dw39ه|6L3[a3%bʰkZ1f+k 3)|>;fzl%NϿeIkYhd1N]-[nsj{7ʪUOo$wǓ=;i{}#1(j"ggR| 1;T@\MSY wσYZrY9sǷ뷀_T{. ݕ'S:$H@O\yŒ>C D72?]C9.'*q^v'^A6BbA]eP୐YT) n]{y]G n~a4tY )  FMyb__7Vʍ4#\iP|Sg$BKL SrEd`q-hA"NOEo@NY_; kGvz#J>/-)=׈$ϩPD|,,(]-w>p _]w^y9m AdF',O; dP۬jҳ3B m5pڙ9^5bgw1=Pf @ 4x^{VGLHzB Y[LjB%# ~&GA Y pԛE4,}siP @R9uvNwA21{I}Eu2@3"",A1'aiikxl*Y1}YZFefQc3 fR3"%,UYH½_tzR͙6ey tMspL1f #fc31R2f13!f |NZ# 305LL`QF0S*`1cY̫28S2cWA%"1z4&=nBz2bY(J1xVoM\"* xӟJl@ÿPZ 'G4n? VG?bGb;5QrvBFT1䰿K4-[4  ‰4/il1V)=1R΅>B [o'sũj|/z$|=WƔNcbv.I[罊Gٷ؎fn"J'p9}o2,t*][g!䵈gGԦҁ"8WQ`%ؓ8ḁ̃G#6Gu㕎3>$e5 EU GvXR{OEkF:vLpqCP㍋dT=%:yܪi˾ni!sTn~N\-ĉEQ.A],B1de2׿oouDķUʈJlPH,)pp'Hp CKe?2.旽n7h-OVf&:s g'uqw9ƻC} `dZTӷf!5{k| B^vۺq\左v-՞j/b5@BrowTI !oA>7MRXǘ2t/i}C0[C"Q/d,l~<8hGf'4 6R;ܨ'T. >V&wwٴs+_ziM)xF7q4p%>grfeMz3 SL8(v*fiy+phܑUZN `)/D0{"HB!`Dt/I0`GVĺHJ Rḩb׀Xd .4|"08*yv b, ;:WC)2nax >!;IɼaʹP/gac-%'cSrԎCA0㴙|@'ov2a=Tdɤ( BDDW/?Ya+FVA̿ă"H:D%R__:-Ŷ1\+"ZDd a,SFd84cvs)bf2B(('/I:)ou$ҿsT=uz;kY"nO}V,2 7|h u)OԪjT^W淓D!K3w|Jg|675WxF*#]\Uu9(hh  3:4>#j5h b,0VDܖTYXB%>Zw)h޾0mgWh$qqapHYyBhb-B&cXcJ\>[+/Qm;嘜`!qB !k(xu T2ȑ4"?vE˜fs#h仁l@Y,&͖55Za? -?abπ {o&6pj~l␏ӊO- DB`ח\YЅ?(7Q7ilc9'J/bbv-_7_&ҭM>\,tϧt"NN+d&dYi+(iO+y{ҋZIʹh0eeVUqV5V0FFK ѣj22VV ҲYZafa1Z 0$al,4a5ddp{i5|mpxR0DdUbnE0][Ii_~1VQMzzG]'kCH-:c&ktq hILm j[FTcj4F4ΡSCQa+䲩\hh3 02.eV5tU%4jU-mh VaeK#*CI+JKl!M`ҡL 80IJaj¬Yn¬%ɇXF81FKcA4T[)FlUW riaL+Q3)XaB̊(һzCnѕ!C@[s0bQVXlf0 0 0 0ÃF7F20ޢ2oCsg3 0 !N+V=ԩ̪Z(dpaaaTZj1YX*U033 2%23FdaVYYQc33 5%FffjKL0 +Q,2,z4fa۫ e[lنN8t:c5MvVHĆ´l5l`ՎSgpZ7ƍ9jѼcaьXy#E,SkcckǶ'^/Ӆq+j~W%TBL; -ݵnvy  g3ki䮀* FdD/p(Rrj{݊r-իv/Cs#N?&={%3u,u02X#P! 'Imxת=Vww{;*NcFg#PK^\"OmjB`[i|nAV!p,>n n*uͅ\MW5[0bkuT>L"&!S 08)ԑw&0Y$.Ё4 j\ZIRQuEҊAc7pFu;9փR*ӆՂGe,PQn3 Z`yFJ]z KQa,TcYa2cc1,{g@աvӗ׍Y( (Y|Y_4D8N-BFS< )x0nJLu8_¬B:BvV&`ӒSEC|?m{lXS90bs\N^)b9mQU@Q w2FqN7fP3]2i بcW$?FNAmK~}\>mo-(9v.1Cڹz e]sn1޺_+f.Ń?m_!fͿ '7jm}]? Lu VI#$Um5",r!Jfz-Mqo/;S=4`0V_hW+n97WZ1}er?r鱌Q|)6dh=Q}zF9+z{R7I#iwo8!-{Ӣ`=)_WuYNHVl8g/Ԡ~`~]өEWiYi% ýD33kZ_4R):ÙUs& 6D z)yYil _h} %tbGh#?\υz};sTl0CNFun@HD@c ٫ɬ v#2jfaL,2Ց2,!kZF0;=ZfYu?y~_/v;q1{#ąQ_O*ڧ]Qu&_ymب?yptБ x 'U6;+=Ԟ=4ʉ,|1Q U=Ġ Cmu0G\S`*fN1BԷn0LB -K%ld&UM8=!d Fk.?7 V͸fmkda?,K:P-{IgDN#U;~dO8ŐY]:aL%p#@z(MP6<_ow(v!:܆ NOsM)žڢaY Ƅ >ó-U5{NÏDo"ǯm*a^m)fM^vNJ5\䖌:!ǂS4 g\ K8[øjP_<;KqYM쥦ꐶնxWR!sUa',eӸ:/d5eUۋ6$qD':]~Xr_xPD戉,=EzMa2->)5XF,X%JI2efau/˥D{%"g?5Ook3NKn+t &Vu[X-W@U ׽|8KQ_|-e[S#D8+7VJi_;KXK,/@ʝ6бBm, ?mW&WúꕱmS f8)j$}Y#p}cH0_r<|պL[]J:mwP1)?1;ړ}q𮐬T_ τp 2?Y R<>v2JX< 5LB֞@asn4>T%I<)40p|G⦾(} OT6BN C=[U q? ᛣjllTp$Sm}Gs >4b%9/ mY^m4:SĂ?k"3 V;,I̒D(T'|X?%H<:>}AC/OH"pɽ6ut0F mOW+íP͸{q̑ tR)xC!y#̈>IOkAOZL,P6ʉ4.< EQТ(ŧz6a\1f(F؜r75k$ ,DCzbc9t!89lv#?Lh''> mrnٲ`ր$EK%H g [}tL!N=w Ӭ$&`Ŋ^H"()QGcO7iĊ¢!Iy_ Дvdoi}^MRJ*9&>DC;ڶZPaRPo(ܕx%VctP:}0Tѵr1jtRY;A~ l'yo9VQ &aW[l宭mK=ZhRs{ĆC¥e,u̡P*FPc2V<9L3owBwtAQ@E:]әi*AԊݲTY ?k߃qlu>H~1'_hiQts jID~ͱu/ D6gNr;%񜕿9T*V)_m ޟ}ŮD&  ~OrЧ\$qi`wxsVGyϻ @""|px8fMlgK"tOEQEHeUnu J2$Mikvʣ 10i"[d ˜oVfH)YwPu9}w<6MPFڈ@!1S$!Fb-IR9'a)ɉQֲ~ % AꖽU_o>c$58Qwi(ݕ\0{i5 ]8Um!/P[Jm-H0eB3PB rZ>Vgot_erYLQ+$'M ̠[A:27|s4$ h2tS3(c rE x>o64qs=#$$t/4?'}n{lSф@ tc?H׭N;}(5Unx}\La#wdDʳ ix><鴟rޛb\׻B`\yi >.UmcJJB6F;?4m~++z|n=?8+=76f(]ҋ}A%]qxB#z̟)ah0pQO( s+jGm"s[5-ȿ4"Jx:iX^KW wQb7kzXPS^&M#`Y*!/h$nVf?:cw2@Xrvsx0O li>g C\o~*۔=^h& K zZϹ>xs2dݐ6It 3+Baq,`Mbw %m<;αѸ}oѼFJգrW*)+Ec)'0an~]*O4U]8a;b'H.f&VAqlIBl"WϣޞU90(W+`R"q * OW nj C=ZJ<{ǥR(,=9*Fޯg N-9'y2{$+gHW~ؠp +ر'kO%߁FvYM=bKC >nU<'?)@@~ϡEq6Q:f}Ec}\l7C%PĒgNuMU^^Q7&;#͊حo+ zVWM ;(Ul+c(p]mhVZٲ8gu0aayC-XJTASEN‡2Afd1X Iڻ2 %%"ObҲNd- eh1Ff-Յblnϔ mϙ 뵓/+NJ; h*bcAf#VuI)OSpa]6I7*Vj+j%_$'qeW*>MX?vu:Zٳ{j0 mÄĶlѣFʛ6~!UU+7낱ZV+EqJw͝hٮ;N  6ݛ=Ll|EWؾuBo"^=l^D){QEaiBEe"X{jϧ T^Ip|k׹\#t u2M̅cw9և|Wt _u= 66aKa{k\ٳ;0ڶlن٣ b[4nv*0+2hThT^&QlN/n\_TuWtﭰ>kUeʶn7mj-gV͛0^ʞ2i_)_;g[З$u^$.ԖIdI1Y&+Sh:IWu>fs\ܜayϰorlL0ٻf0ճf~E^i'U{=AH&9X:z=90ѣ=:qmkg5qsk\9kjhˡrlGj>_4ʸ>[i&^u]]{7]I7'*C[ ntMJrv85jp%XWum^'{D5躞 ?:lZW'SST*Ib9ʵoWתi]u::NS)ӡe d{EedWT/v*X-VdYWe&e&Bʱ*̐ hd,[5Q4ץ/;K)bJM]S.^)xF $iCpg0ɟ:|́h5c҃J8mh4M^V]P@z|9lk Y<<B0LM bn!6%[gߚ뺙nޭȪb2 }LiK@}~h$zl>#<T 0 bcX#JKO/ kD!1#'?S Ugp+Z&(T6^j5>hB~ϼFoĭ xwõyYPFXf<:>OބW)NG:GF#<7MPI;O'E*PqZBGÎ?/@y 麖_F @8 'St+?pQyO)Oa:5#V<a~x箯=Zj?L|XOqMTK\Ns$ٲ+Sv뜖N|_)hTf>THbS,`8jH@r4%fmdXil:OdTftdp,-bB)-+E&Y(tUK7­ 3]7{9 i /RKhq ]R) D]5LW)f]Bl.~f^ .a_X =i +25lӤ&D|  @39Νbt ]MRJ#Kgx*BMw CH!^6$/c?b(מydNқXPha Ȫ"YI_#VwX΢rvr)?~dtg!6P$c?U268&c[ 0? X4!E`=&)6Oa%1DyWSs>}I+(QWUQ9BY}Yz+4z!וQ>W&Hu=i  pSc(*0!@SKt,Rj/]qiR1zM)s"kg\?dȋ0H{&Kq4iPN[?sWS\2=6]Z֓mؿ ԩ-*N]l`w=N/[ptU@  9@0t3 yj7VjxOE4Y]:+ a̫2̫ 6l T 8laXda aF5fkZ0Q~Ear6a\ 7\5a Fk*:qioY j0цswQwh%ٙl##+ASt.M- 2[jұ[+C014FWWCxs̅?2W*U+?YByU}=Ȅ1.H@$.7GVGV ܲ߫lu<[ML%m1D^=vE(""T }ESZ׹\qppplګ,u;GasV~[0L9K7ww牣G][] bI4Ts_>wueT*]tXmiZVt^Ḛo|} _z q 6l֯:{< 6{ǎW|~LU¸94h_x_ϴu;ۏJSS}B$d2LcGsF4}ZMqɆj˃]]=Ȳ@n+7hº'%j7wȶlٵo]퍛KGpzρuܮ.GwZ9cA{jUt.qv/?ssKضps=TWZQ>>:<Y_}]׉\+ꫢSHG>B| Ag?t6tmͻvmmm w`2X1ebZ*廣+eee2J"x"PQEUm|{6n~w.S@x8Ow*gs%NעwjL@lnQ@Ch ӵBToXq)߈VdW[;[kėk`xVKeO2Tg`7:C w`44j??8hl4hg损xuj]C7yS+~*h#2Gv=[;5~;Q *`lU+-Qq-тݺwkjѮd:IVU­B*'&pe0Ye%v54hə^{/sZTT+٘%v;ie}}guQ礯(Ud{Fq[FFZKF|"]#ܣG72;ύtfVVVV}_yeo;eӝBgW=X{|SFWCp270rrq8t4a8սۅglo lej`ꆣyN&osFxEXU~,Cu^cu9e)bg\t8ҭ88<Ыa;F#.,GJ*Gyl+tkP Jbdw5Ih综ٽҰ6rw[ cTwIq<aw It:4hTE`I: F#v6au$,2885gcє`+ *4Uƭ:]dM8nA +it~>ٶ/dVx}WUg|!AcW[@-:Zr"gSN;)|8(V_,/T@3`GrҎdtxB ç ;o!WxN}9jlE(p9xc[,&Qȍ Qqȑ7_ ӂXs3րPyYw\Li)b6PM] v8hvgU}a:鍸֭ ڋ% DD8??ʿТP+8Et%CTJ`,(塞\u%p.o-co] AD@"%R*ܧ1QPp@ vʻY-sAm %X~@A#mkV~1-"}4x _5;/ߩ=gn]Ѫ~@ ,s|ӑ6/"N|Y#Y}۠.MAÃ"B1Z~ӆI֣RO݀YtU VQ5ظDs?{9xͳyQ\ΠYEKRG ,C}?9 WZWׅ{q o+[Q|(4Qu.ѡ1o'FyjEf!F80#oSaU熌0# $"¬2S 0 0 0 0 0 0 6lٳ 0 220 0 0(0 6u K#0Z997SꌤRp~ĴaɆFFtdhUU~ۻUKz5#:]nƍ+RH`0E7f1-/ h  Ѳ`#AL.^7ߙ%ꌪO*22axCjKdN5?nޏ737z&WrtR⬓ƸG='4j^Ä87xQGe2̳#2020L(e(Rt;9İ,90(ҲW { ,\2^$߭qɒdVtkW6Mr)V ]JKFa[Uˮ@kYowʸ\*=7c5-]0k*so ht=wUbvV/UxҰ8825UɊ֑H>/9/I|'2Fgͪ {>|ny<:B{ 1bKovZ s*2#/w^;3#mD7(Zo>yio6mklIHjxaO& @1`.-VUa!eo<ȝ>bW][1Q4^`x_d h 1u:Dqt/zج8432 Cۜw5?.Zm8gYv7] H{Ő@,j3@&;//}Dn񫹶J{ N$ [MJH$Ve,"%Bu* qvtó7#~,-@#w!" ;!'6X\.TCW@ng֫Ŷg"X *F u' Y&ۦgi\0i5 kuK8(v{tBtQßwۛ>5+L)2[_-OsiY%OAї5 UMP^ ̭5{n zS'$Q+q[_X禅F6_q8t"Q]Fq]ǯ]_׊}sV7ް`"iNt,(39_It)^z繽 mN݋ce╊pHaSJ]LVYQ^*Ұ:AO4V 4>?! WSsL=#`ΔRJ o qoK}:W?.jaIvmU|#Z5%fRwF@!D&6$ߍ 'cTIR{kڹL!Bݲk; 6gal#b)4Jv;.2xw;t7~}z!)`@8Nw^o˳<+QÿPE!‚-)5_B2Za k4eefU%Iu2T jhᄋ]MҤX1LЕ^v f*ndLiZ֨֌FTt1SC-XaM EkJ mFUhVUCrUd-65{of#yZj$~+**YqjՔKv0ݑ5Mf+1_^`P|ynJ4iPl=uk[YYI[sy[_6wdu9]29뷨ҿCļճںfh;NY{nk*0#-UՇphûl;{[6sEd]Ǭٳ6 1ppcQ}*""@0 *廽`PķKŊdyN{ѣb/nϽs m$D!F|#]ŵFSE t߱X1S,EebYbVf$UL2QL(S* IC)P'?' yO/}GDޣ )gpVBegʉsNu3Za1%ek^Nx *e -sY>Oi/xѵlKQ bSR:m|\%2 &`7CuiQ`9`HL@0/3{!O]uCqռ{l?>~uLV$#X>sFUpiIJF+,}6F] >_xGcyZL|lCw,˟4fF[عV~ޏ/uj~Ϫ_e;k7>uׄס|rzz}gE]֒tOvۭ:anѾO8z4pn]ȠC>^ג8p LJ`rjxq G׀l0}G9∈oG!A `,WH64FPbg$@!usֺUӔsˎ:j$? 43&FNd}#,LT-"Yt 0{yMG;_XQjW/H!]UDo|8>.j$*uyb7i]\^AF|.h\B=D^+`$l_J2jxUԹI@~E .CNÌb  "}7Ŏ<AG򞟏GiY$M$]ƕXsq'^>N7qorI7iƛz]$O~fq09yOÓ;}"24Ҩד2 ].Vz0 յno֗5_/{ GҹIO%p#=A t E" ")_fmuZ Ii],T~(JP\HJ_\CwLԯdv-.27pNĀM94&g8S[h,@4V`!{ZlrR+Oq17x.of{_U=]oy3յ6t6Fzzv>u/>WgN&.G8wƋo˔&yj42m^3}]bgCtX_Mv{bέ{`b@0 %fWON"zᅮ{<}؄ ayHjmO%7 n ? n|2VQlY6zi S?:;=z%W*\O`ҍ.%d%&up~R #ѾEBl'˝oLgg8J`AS6tdj @YComH)ecMXU8Ng8XW0YIrB[$DV='N7P 4nl R6ïͦoo+ϳjw{3ÿ8ls߿_;[k>4D؉DM'Ș"mrxVv21>8xr 9_9.06`0܂?VnՈ BeV3VQtcŎ_W:ay"o7 8L/PJ[|{&DW `,IUWmtR8Mfj80L]}gPiRs *N-S(TS@;3IsY.tMοuJbDyy=O Kd?՚jJ[W'kgGy=5D 6XMeS/O?_GV'_ 颾]U!R;> V 3L"R.N,}QMiJ$HMUV)frr4*[[,_ 5a[.5Oi,8 қ^;iW6i\6ٻ?Ok8?G).*GwI~K}wyn1ʣo꾳shTtzn)[|alag3QK F]|P=ɳ`Wqw`y0e7 ֳ8-%M/¦o EJh|ZkPR%}7Pz1C;_h~wa~y $I<[Jk ~5-Z?HZODa̒rq ]w< C/1Y8>/V#6{Os>۽_GdCJTy~R&wej?{jmӂ\n_t U߽=|L38_d~Ó? ;FL8Áq"PD M$뙯7VEӳ+.н3JH{2+IJE$-/"Xb6@)DZG.JW{ek/WaTVz@T^~M6k%jxEhe( %yn%p[y0 g>@z̾U#;vmz;͇z[Y@Ȁ"0*jf~ft:V>9;>g/s4*p9Mtewy!cp=b%fx?U}vzWIVd4Y?K>M}o09!G,Oyl/y]^)&izxjW3xWO5{+د??ٷ`.?]H֭rąEJvb~cFu&= uFimka_n3^ CXZ䗄e.ݒq_pWT5?շ6%Oz?'R$uCN]vB5‘U\G{Cp$H;'c&Fdlԫ1dFD@ IPOgkY2J"2b2  e#<.s:VK#SXW@[@*n$#]o[`o;l+K@Qh -hLj 9am:a0[AJ%Y eTa;w?ܖд(y;^gcjUٹfn\CmV~ʁ/%S%@#QᕶfLN"vfa줦nO<6L@`DC GC5VRz}o޻kCI5Y?7n~~t.bOǬ +XV++XJ.YZz!Idڶi[9ߛ?w5ol.:^#ZTjhpUѣF FGXϬ_G%*Y S+e 04[/sY\73NiY3zVH\+M",Z_tk^7^> r6nuAy"rnlNRE}Uٺ2_)2?63uOUDltE%9πv,"&Pk6W7b,q;EôBW#c8-$V(ft_ٳYiX|?鷆"T'(]489$zkJplĄxUa#'FsКZ/QRoG#KY=Кjs~㋖? 6FapMYr hng4#2I͍ɦ ZR˞ @gcj{i. */T=E/F{'t+*uD?DwN)!EY7et'#3KC'UBƐ:37/Cp1D]b;,3cilHYCX>K+@wͰ+`J]Gjq=Ds}zEa/ǘ)\s)?TZ^-.<{Y,%p_&KY>6l^' rl:ZGR1Dh C7tѼ{ᩈ_hگ)h;dȜ>}WanVtcE DpaveO8\X"}YM{s>ù[[Y;^._\SwaTIztq>P;\%HqSlTQ>'!qVKh?❙n`!ޏӊh;R"(qJs wM_~X~I>5@Wo7Nӂ ũh񣟛w%%$b=y(WO@TiT<%*PrCv8ә<_ %9*3SNjKx ŋq[V`ya<T`.`]mœ|,U-b%AV#bY*;Op% p} rg=ɉ{+ߖ zm_ gO *:Λ큠Ya/y$<ܘgi=Ά0v߁]s` VwMC?Y@eKԦ奶/ *{gn̮S56*vYwqkD&b<$}Ѳ'Xs>ϱڽHAb\x Ntذ8źH A)s,% RF 0mK.\).W9~ާDDGK#!Qo-܋)1z87ԝ'^%,dZk hh9#fAaUC*g%U]i?a˻Y\i }E>&e܈Ҳ(LUX15ó6H=Ւ BdDt؜v%uU ̍^C'_vk1",nٟF0jQ,=+Ń}i.:/q7RVfL`ũPv?,wJ3` Gp!03HلWXm ONňW+)!X$V,a"G!iDp%$=R#L W*G^PټʥQkvk+YQ<;^VcX.fB(܊2kn t,-UV%F'nx?wPU,Ȱn ަ`A m}mžx59wA(zײ$u_ "tN촍XkUmA67z%8 ^.yrxpr!l\m; sze\9ťQTrkjZfr5o4'ŕ*?9M7Kqotuk0ԫ $t..[q&"˿ͩ$q|_5KZ!* Ng &9!=29XZ(}ͤ ]/x>M;Ff9&/ѭ,EN:3TʺL8׶F~ֹ-O5ՃzQj&! IixQ1(;켸VRzo7k(ZE'B)Y*Lr%ȔI-R_텃H//mLB~6%3CMwX^;(|s>TU{=+:s(_j:'vb-ޖTUC#M ƤBW $gܤ{[@}$}؞:J!Eqh(L"|s21߷\d`K\`i4{`j˫fa 7}ߨnETvآa nS_*Qy*a?|\Ժ?; ]p%V:C:`.gD'X")v؄ qbhȾSm3(.'?TTc4PmlKU{k/fIj,2AFòwWd>T&F]wKd{OKfd'/gЗ*̥suhFrqww_MEWMPkԖP.z[W.3r_CPİ}"H]br !mK< ήf97 C(%ii:~ ^)<1LؘxKvV Nn⨹\%LoobsqI?:Tue_xQ>gT0ѫi>;eOi1q59\sCYM܁ #vB _xp {Ž@rwc t2x#?JěF7n>p<#L/nWmY8(Cے˶iq?n)y_гlb:wP~C)|j. }0HJ5Mk1}sNNtdݚпכTr.Νcc?JSRx<a@dKjNzN Z# K-~HAr zӶJ\YtprQ&. ÄA6(:Q!Bv f$զ 幸L"^ؿ%;&N mvT.pnh8KBc/wVzӶ$Nrar>T@zdL!kouή3Gċп`pgŅIz̈́07u6ұ%N{L n_db*K1@f77z] {%x=)C\p_'}y(] z.ڞ'0#3h9dnil^.k;a]A6u~,5#]7`G58~"w=bp']Yz~A>O-k.I *ة[ c/`nQ6#XY GRqA-?J44~6dcA~j_i^-'K˄3 ժg2H0reNYނOT*~o,MT%:Gci{WC,}0g8vaVH9vY0t%X]#cOjuWvH,z.Jwo\#[ԏ n?qIGlӸސ}#Ns4H83L<ީ a՞^GcGh]11iV7T7¦1|"YȿgŽLqc2:ڻ( Bc鑊?gj_Hq6k=TqbKctpK$0Ypm Ym '0dƷp]m[ SfэdȿVtΝv;c6QvIyqnL\Tj3 B*jg eY71+u8w3tnmT/yVғECd2U*4xW$LKOK*ne2H?oA4Ƒ JT@N.OW (  m8-+.ucIa/'43"LU'4wIf,"H3pE'+]޲N$e](4"&{WBݥ"\ĭ=]CmIxӡJ0 Lfϧ;h­cE7szeVďn3L 3):4Ii61HD]濑%:wk,|$LEK r`Z؄/y.-!v.B׍pLMK]66iPNGJbMA)KA2B\>T2փ. Bk.pl[BfO*+^[t9 B f>JL~K8DɂqH~~)܎#K -~q&j'H -憷Q_/Zҹe>xmyOJumoWs<xZLrzAƩe Srn5 wrѽ*d.ĭQjq6nm>ܓI~:vW<ι*{%$~ +[KJe"VmfQC*,> ~O@)=C33FfD #YbPHk!\Vm9g^~dJ|1;ہ( eJ%:?J- brKO(AJ[ },tU y;Jjl~a 5?Q:g YP7eF_}[z c UҖnMwx{P"YgSέTg {„aE Z"m#Oז^cQ0`O%y3$8㍉nl'pC*{80|\8ƇU/\8>S ?Y$-CRhzBu:_::_0.s$3];]bz#fi*ي!YSjoVNj9ء= b ٭Xm(![ӈc/S9˵ԧJ\x "S-Ӳ T#6%*,S~t YM~\F񞛹U!Y|K6IsܰuxxNŪol}NҖA)˵53R3 iQuR=EޮW*/X—2@<#e 5K<Cc;"1Ji לC.so<0@KfWqʋu/:/36XV7lYҚ_z; ÌPqҽ oIY^M| ݬyGYERKâ6řUv|rhJ?H'%:`Dٓ0D|J¶@ɰ;qXl6qMzXn,w(Tnq{ tWF|Sᮂڢ$_f5ƺ3n 9.mb];0@Xt2{]s> UCGqԿ)p\Z=4s>ePx,6mZ)|kJ4O^ҔP. D-!_")O1p%qL /;, F 0`3`C},yr;/Ŏ}wb&ͧ-6=0f`tx^w{k~uLfe3D0%~DERӓk2XeZ) ]q1 *5迃unc Qu9*m!ƊcӚ? mh6c΍NC3%'aSNk/Ў|A#0|rPc/EyVv $M3-̽># 1MT΍2:O.Z -{3C3>WfYkg>7._9=*G;rU஄@#kviS3pO0p#+r4 ִTw.k?>\tI;?AJ]8UuSj^@U5\x_q8ls鶮ȇx/<=˰]apxxʆ#B )HfH,,V &0P=1^Q7'"58~F#3mE)ȏFϜ$H9qρǥD^f"R>?Q6E@'x@5dK-/Bzj%QK6g+R\9#hI"w_4ݰ\P' :hOO>oCE2O,ba\&À nn.L{݄;{ O HIxtb";cdR?{ëh2!0DiݻT=\'_YѲ(S" Ύfԏh\ 6޺I1r:  )L~_6=IHj m1,]0:4nT>RcQNv׏f\Sh6~rb9W ͵,w55_TuPiOzB5s5# '?k`x2~탤S}8-zjw\0;]l <òv@U *@0*. ppSMN`DoQ-.?kg2e`k+}Փʼzͺt 2+"On z 0*P^R{sLms/z_bF-Z ]5,CI_?[H\mL FtDs-Y pv$;`eCb:QRηm~8O3N)4*5%rIkʵfЃ6b:u'̧he:o @DH;O[^NvJ2L|y9+>+ x?) z ゴWek AJȀ('i2 7T(";!kҷ.&X>>?d7aSgB@*:6B !v0.S!9m?cǷ/|{ϖBQa/+ 1_1Wm=j櫃*a| "2#";!aonU 5O5e\iLAQ2!Aemܭ7dPuܝO.ҷb:P-Lۏ}OObuSBZ[Տ{ 6jI L bUϪG-[uSBaDB,h}Z5rG"3zLc1QYe¹ԥX ]|#ϊq4b/X$PWga[ Q6fm͈czwA=bz5},=/s@ }zwȶE~fŪJ|)Pf+ @TdKIri%Cσߛ]&KThn`ըY߽|:or_2>+B[[7yh~0[}bua&s'a N%utY-N%G=DY9`j3cvغZ [2\@ꠕGڗ`+՟nnOWNɩzxڎ:%pB3n`Zt{qR"Jq|AP&⡭TG{QnhDJ S5`(?=#U;nHt?ѫEue3k:.Bq5J!VEOϱˆ-&gh{*;<k1c7QSghF~SBW)\ dk+z'^ݰ#E u@3D ^Rf8LqWU.4™qoV+Cvs&2RI2VTLHRDFtʮ Ub K&[ (]Ku }ߑ:olN s :{hzݒҞ94R"+w񨥰.Kd hIZ  J֦S}ˤs,ayw8_d[Pt1M`E^K A%DdL0/^nE37ͩJjdCYp:4$ZJ#q8j@/'Іh/alcG7ϫ#_.fy%GCO-*mkT2'd1-6'յ%KcZb* ra;ot43jE|<8 o#8ǙjM8 K0s&gt!K, =ݨ}M-n`.4;Ֆ΀+<ۑ5.r sK]o;_e-ldZnȵ0%/{"R}ȕ>c*οQ \BP M@Cr{:VG t>A'|x%d諾q5)З#b!2>W=sCF_,*0d飰b)U&A3ܸiydW+(M.'uOJEL ` g~y54vu;{?-EnJ%K*E{*ӫ"¡X%ƹ䯌]7`?>-&Xi@..o뀏`=#O0E33 TgHd-6t6{"絬뺳3CfIoԜ# /{o|G[ɕ0BqqW}!]⃚ҟX؋~81ʸnxFTքv@{ƙL!j@BR8~/Ed~anNUkqNymlWdP-9 @Wt~{%"[KB"B$"t4} ׈_x N={q==dmTȭ0W!?^L>S Ɇ[PKm6=̜a㵌#Qh폡Wd_Y8t%+s~C8&da-|x9?NyNҔ_g ZgNb_f5 ~/%Y5+yr_=?DžBmKCmB4ǾqљHd `\xN?=pȄ<@_1+3[6D :!fKK2L8oyn2=j ; vUf9yDK=C>#"yw:To?櫴!s8@h_Gݥ_8҅5?jY"2{X) y#^\'>r|'e3Pk QqCGz*q|,~&=D3bԜ0L)Ydyǵ ~od@$(+~ leڒ6weNl51DEٮ{{%,@ն8~ }&y O4ooʻ(QAeǽj-st$y }^;ȝ/S'jOз%>Rr΂w2㹷v"ې0V!b+F ͒]NXG nSb^  zs>g}c,롥O*OC&BnOq4I^p ×+uvW#tj{,UA\T/ Nj{e+k5ŽH #?hggJ p/ib!=;FVi<¯_FH;I ?MR6TϥNAbU tiko|bmz#sGH±Э+J{J<4@#4Pn[}? =>:,s/za&zqyk_w>%Iم6f lȼC(ڥ KRNk# tE2nN$}A[ \m<^8U_T1%N7 ?^+ZN\*Ž&\($8mT #4>~E21]RF_z4- Sޭ]: ΜvhhynXz] 38;ٳc\X/YQ-%G"_V]kjU ]^V#OeWu7p7xI1~dզ^~}uNΣSStʿ\ǝ??*`7h0zս=ΤEjʱwŖjs@J_L;)2mI7 gw}M7\k[6Y]Or <,Xdj/m_칭*Y6?N/E3 ّy @E؞;_O7!4]EkoP&~/MhZ|YLcP ^ 0dFLD1 { [I w}.ᄊ%4[jOTd65Ke"KW-'|?-lln>ȷ=:xt q}>9΄{ @j;x'A=p1-5Sh9k~Y4̄<=̖hԋ1"ݏuVGmSÈkՂػ(b,Kx$er,^LrI |ns>vz~%1&:BhiЉUآ_:[}vȹ9\pepXn]4ql.qVWAJZ// Hj6*6׍Zll_B\@DOV~8e~e-aVVVrjKfdaɐ0+VT}]U_ļ"Eaui\7e~j|z+͜<.A)C fJ J+w?/^Y$'P`/;MO\3OKoig9yyL֝Ph# Kwփi`=Cߑ.79(FDJ̓fY$ aDnnak0+^mL `O!AuN'^*m\O_ךA:}!jc,,l5ʪ'U@ПY}jX{*KG//d]ߵ1A 0>&?wh;k#\Ltq0>kYv#Ck׮DЊ,8 Ҋ+f'x` ֞%d!_}uZxj͒w!Wo һs~^WρtZB`K+{A:>G)nKbY={>‷w #x4$Ԛ|3ױO˲Ѽy" @ EB}q*y Bi:?/ J#Prc~'=1c`mhj7v 708:4|j491J@ptN/WS1+w66?lhi<pS-#Ѓp`D7PAxq@ӱձ@^o827z9e/}ea# >ulhu_l5` P>v(a3G}9s 63Rnj.}.wv;;  #p\{ɆC\Bޑխ:JtSs#^WCXZ;0d NO']ry^)hǙ&FS#>۸{Gޯ׮G#.4bԾ: {?d~@yN>$!YZTdr[d,;c !4`cgj |idrV';]T@IYveFĥݤ52R" (_aYĀIxwCf'A&!fjaD_Qc]a*84+J; |$Mm#KeyWUI?z Or ~,e?uL3niufGlYRQI)/LktcnjX^cS a`T4@kȁKZaZH C2dC_ietlNko#=[ a&4.羏St?;w$ ?+jO5!y(Q=)~CS_ 0 0 FQZUjS@jҦVjK!2Fja5UjS@BbŊh KX|Vnjvٻ6oz6a7QdaIkyY%25Ŗ'u%5[:V̋ գZ. at,5͖{g&eaU]*V㦎TaբƍGQb]+ 0͘ nmұ0X 2%΍akFe%eE|Ԩdn03 ijqZIaq[FF2InU4ecJ؅_]S25(DbQ{9˽?"Q' @Ȉ'iuWlNۨ}tpE6ׯP_qwê>1WrkF;M+JYvkfoffffֺ[-g]|}7x?_/빦Ya-խO&R>لnҒw~[pu?QbU֒fa bYFJ pXHVQzoJ]Tڌ*TʕxȖ Y6 wad4&Z2 °V50a QLT$UVYoV#8!qV/ McNP6ҰdUZ![ *+pֵrÃ"CcQ%5V^pq%U^AwN\utTgYg*6ГeASJ0l6V$ܧhlըo[Ðdsq0z)IW<ƍ<Ķl 0/ω<+bIs'<> Cw~'EWJܗ-_W!ZB9Mwkݛeb>ZKp{Ϛ4rtjlqNNNF4lt: 8sGDKG&MaGѺpphVt6tV[85:'CFビv\[sq\WKU)ɔb\ +VI`]]rXd]NoPʧ#_#D.%~=~cW®!8_zΪNX۫*h[ VT!VY\5Vlhٔe5nj87k[0 6hчhѪjBё 0 +FW#`1QD%挫;-i77똩VQeVX0j4edeeCR e#-U>;o|yZe,=4YjYH]yݾ,fYeM-kjvo5Y^֯MI.9#A tXYŋW 1P\VVߡ?[UqvN.zxoin UViI-X$ޕ)^Mkr#J: 57 40h^qѻ3^jjb\%r[:Ba'[vllau:NƣFcu4qh䫤uKc֣;8894jKF]prt889elڰv9rlru9;;t:MG'Ksqu\nkZ1ʜD2Ie $ęXbCLEa)Ude%Xa2,,,XXYdade,T#(2(2qDH!uO&y.3zdI 6~zT-yktHx&,ePKcEPq(ZUO+f=d!Gpn +xXTO(*{0 lBD.oo <$ PLFۦi;m d9 W {J_5ŞI@&hn?C:j]} 7tHJr;Bay[ Ǯ9p5fk?i+%mڇ߫5| \漄 Йh^q0's ;6o4QfDg6A" KrXO̹؁ Z,.`;(+bϋEOKLe-ާ?0Xud^t_ _k9v8V߀ bj !G 0 Vt·"XO_oW]{[x_2F2e_ 4cұVOE~_f0Yf,bZ$ԯkJ=?N*f9 HڏXp^8č,Bs?6kgm߫F C쿐R')P'A*\'2Ny/4+3g_WF e`rjC ӭl*rĦiPONp/h1IحMnacqV5[i:5fG(/Q*uDދ+i7Sa\(vheˡS D;:@ȶUq>qhaZF eQ-iu[Z+%iAr1C_#r|gaN:y¹ʥχujx0Pl8GBwN+33+$"faff30 *6lbb(oWFc$NV*ﴋ(8ˑsUCzxM(,1#Nŕs(ӯ]e܂e5NnRPEeĶlGjڷa 07ҳ*dW˾;Uo7 >i}`SA {Kksj.eosy&32wE&;>eb8J_?䭍9!i|ŧsYn zJ&.J\`ӟrLYfw߫:oWon. b|8"o@U ~  yCBߤ..qLJ Crw6NщQ/3{_C/(~M5 @ QTta{ FO9QWvLVcmV:yՖ6j]tpaJ8:0QWȩ–%A?W?_( @?ǑN(NeTWF}W 33330 *,20!0feVRS$+9& 9Geh-h|0nSz$k9E?s\軫#wJc9Z+x+^lO_JN W$%M.-8 Cٿ{EPDՕ Bo=yDBLhgQ|(]73 m=l&A)7 $WzՕ U [Ufz@P89$ p`,$VC;+\_ӛS$@pWV5CA_}Pe.δ?i_D*$Ҽ'>X? %?{qͪDiF8t ʅxcF1L y/^/~DždK*`2zPS1wU7[VՉdK$YYXb-OX#ײ~=hu[(d/o1uT~7J,T>q%My+W>\=o^ZLIָo3[q2ZK=~y_w'URU?ֻZ}{jj"j]##?Y#QG`UqRj2V$wI:XEX/6d2V&N*ڡsJ7 L+6&:l:dF}<̌2+Lm1p\5(4߯lC{ gg3wl(nGq_yX\VZҦC[M-eca8kw/t\.5iZֻ `McEbhƊdr%W*w\Eq}_s$~"TOТO~@" LT Ge.\86{>jjN-W90uw0/cQMS(2L풿^3qt8|k$@ObU@ U8Y u"S{+6sqjn :-ic˥b!g3:T 2l3VM۾:^4 ~ ζg;'{aq&Nz?D;m&S[ Y^ Bvey(4$}"/C,0#ʲV%w^X{V a/_sSҙa :>MC+hb;!;ѾT/=y!e^5;рUvsJ"DC ;RIx'M>m=UG KvJ'o+wzc?U0c_83 eYF%5S$YQt)mspopu<"'d?&ꁡ@=es:B]z? xdT`M:=Lt׽3^PiKk3xhxw1nGh 1"_] \;0@"ZfX޸?i-0+ITK7*_+d8t?Ŭ3do7!Lv  Bj鏥Uq%#f R^ayv8!{ayZTiSfڿQC-c0ELWOWXϴ~;CNd3**z=巻*6z2L(~ E,*ZF%ZKQIJKIjˍ%Lbi1)뎀U[⽟O'lB<+=>c=4jW+(2dV6qEG8888825%VIeQS$2S-Q0QFʜZK%LIi. b+f &4&1) 0 -u_V%pllٳ 86pdhà Updb4aqnQV0 TaF8\+. 86ppag ppa W8887bXj20ѪՆa4pphѣGc4ayb|G܍E'Őcp0HHKQIe2ل#y䀒)W6joTf9(SjB&@sA-4;SWxo.c"z~•wunH !4U?syՉ=tz=: (@'`A6ּ6 ]qq*}ĞR%$B1m=UB&$${Vm{NuRBpGX{;)> ^FniAҿhCx2# {QCp븬҄>b2DR[]e1=Ww\-Yy:[*F"M5VHΛP,"QtB&UundžoagzPdd9\Qw& Wءy~X6E*,H@TIiN2d@ B "!PyT쏣}[둠FSScO{ x9œ0v(XQnqHŽ_\@h`ǵS~ZyQ-oCo,|O+Q}xt4)^§@XbR8]|e"z֖U7=A>5 4af3 1#`eLuZz?k==uiPv=R[vX%LX$]Nz02V߭I^6*r+KhW LHD@dq4Gc`7 y5K$kgֽ}psK`z&Q ӌb.5nk6.!\94gQ y+c~o1.F*] <2ms>Z2yHR@|- g*8r{3/RRtR $*PIQpys\|+>} cɻ{)"}^?;?#!9ЫU_3?hѿP:{/S>C[˼p(Jג?*ļ T:WPiEMQ?ǖ e2B#2;4`lx{wՂNYV\p`$L}fʎXcB 71͘}R C'gXM)3j'y,{p ֚j&&PfUګM{p٬7:q[D`2~m4D#j_E<V$;3iTѰ%I-ƓgN< c3NJ~gw߹Ej=bu/0Lp.6QaoPr@ x 0aEFOA*l(#D$>m~ejh)2P{u _@ٵS+ ٔnID9PY슀LnBSG=Pr*nf)DWPd`S`ߑ R>>S Q_TS>SH'/v$ky8LcaL k̾w^vvOO/cu] 41gPI5Zp~QIe ^_{$Ct+m ]sC+(4>ɖ^rgM:}YU( M/9cDo|?f;++ᑅ/Y/taenH?^QCp=/hj#G`ElU )2([Md [ܪ Lx(+zo^T/`LJ{qO%roÕ*r"ڿ)>4]$f:EtF#WGWZ7\2(6 րu,qb-+Zu=aW -o*\^`uN ѕ*bVeM S] .YXaVBde}ZÊ z#h/\ڴXIQUT^5^ Bԁ1ԫ()VL$m__iZ=tlM$_ߊ*.xeC*y_sҧÔ+_-: 1z~^|M*?`MN󑨧 9:0P^U}[^DCY6#S0muOұCIV(%Z7$c.iɦKa)4qZYec 20Ú1Y&tSSNֵVZL(͒[j%5D|S#g7?<>2JutD-z$[RPC-ثCFl.j-xf!==cllB,ƈ"ӯԺZ@ {Bۼ]G> r*ǽ)~~"0&`jo{ 5V S4+GL"{!]]ݿLi}Wj}a5lO0ƪ@ǟ6-mZPk|n˿t~T^+ &%=j4aTd*+qV>No|Xv<K)yc^C ڎvj" j-ui~*(#0bY4µZe ]I$ )hJO|pgw%ۊݒ?9jS LYbř/a)J|?*Dlu6 ' SqUVE$pwM$Өn|̿rzfFaGZÂ̆CTmVq5V_z(F|z B/64> w~]?)jZ.-'X1L{|2 夓P-j46jZ5+S\/c|žDɌ0K +T5L (j­j-)21S F adb1IUXPZ 25M&8AjV1Z o({e\]X %NU.ώ*lZ<>Brh/Aiy8 GA,l*.' Hv B(?cf1&ǵ*EIRFf 'i&ilO]*4:=OUt>L~idǻ!UԵK>,ew{/X瀀+ kO{/ oXmv}-vz ! 0DDCv7=k&M`=r{23wh O4Ӟ3'Ϲb,bo: oѓׅ2(o?8fxt<؆X)~GxR/V!]8nOKx+6`p{/0+z5𕬔B+GC~7دs>I !dWOOx4:0g;ZC@˙SRM@"[U7§G*NHYb >$`wmAWbdhRR0M;t)y&"[7}^[far)C2$mJ ѺVC' t&4AV]FWDcDQR7QĺS86:PQ~l)WWw8.(9\e:*T0@,yyb2؎~`Zk4v#׼-<2Ui7q_62=? Ϭ<݀21;gyFkw;:6̎RI&] $ےWh&Cy}Y=k4 fdc=FGK$:5DX@h cSc ep뒶.cs=z 8*Mv2}$.x3" 2|[w1GO3;d+GK~^GgB zR\Q}[ʏ] 鏁CI|SWՒNRТ4:%1F2JPk6*Zy* iV6cWj_5sxyʋZe:ݟ}cIQèL(ǷO鍭߶hBf^ϗ\])hɋ[-f.;d$Qö<]O5{rȜ"|6SjܾSX@a{z`0VQ$2309/Bh >69" Jņ0tI&&W>{OJ/b_jだ"6~q[zMz *뼟KWV}Rk*ud@?S>C@){kj F=CL jޣ'{zO{:acb&R!=i#;J^]c##<'kHTʓ* $S uh0bf4i*h-}!.wP[JFuU/0;Cҧ(|̥'fsT8o8ʧ,rU yŃPW2uS6^7IxGڮlN3y 7QrFS_ Qʦқ'H]HµIS9,$]?m]U.ArIv;ֶA?; U4@qs)Jk"j/\.M)KjTxQ+ӫq^sHU5O9ؙ+f2hU*2.i1`-+zN Z/uUz%=wh>8|Ͼ|7N]<YMmpn| 3;S.G`|Yjnu:Lpo3r[0Tdsi 1FȮY?ݭ,yt k4y,[YW@'ap%d[Gm[۳4l/x6omofno_|kwp'rJYh)V4c4M͚@W0A߉x{N[Dž۷z1_1/&@a])[ۆ1vGjMh'}hs_u=޲dɹǠ*99z7ǤG--#zV+NJUhԯ{鹔Zz_xI}ϥ]Rtk$Ԑ@!!IET ;x6xjifX èIf,eřKx~v~yO>C|>_3>Sxazx+AhƁ2r -F0R+JԔ%4 FlS՜XȝMT5Uw8\Ymk2ɔ̳*]#ff%aaaPȘ*_Y`z 4absfKtWRj)* ?WVl|m0 (=y#bz5̽qawZ0]+)U{F^l,X4tZ<µluNPdK+JF\D }x{Wy8|?:}7ifffj;5OHlꜝ.[JZ+Lx 1"&-NCY&IX*,ہVW25:C`ɕZz ̒k###(h8?in22#TF jtpeY 82## 0]*21_U٤fR+ 0=Fϧ_颵?n|1*٩˱^Tݏ@XOfyQb_4N6ɕ{›Ќ!2uN6 rǀbp-C*5+z|vNIN;wZ0;5KZPJl)0U:&ynsV/T'b;5sG+"߈Ϛ{>+&Fr)T޳EeOh`Sic%mh3JlhXX`HlLa4 Ev ᢋί@cb&) 0 331j-X>K ƭ5,ԠLm2m :W7h/du7lm_bq68]XLMb & ъfXe 5 tu"ҋWc0a~LE8 LԋB+ V$]ⲑja]귕DqT8 VIx8WB&(++ X)]++j2NVz/sɵ?~Sz<9]j%4$"2+ztXb#-j"6kP,Zo$χɸޥc#i_zgBm`sSs)-JiYC$ J\HP= \Uι̩e\t_(E@̣_ 7iYd0&F% mʥC*ßŌhJ w;Tz*Օa-b]I5JreD8a{4枯+m8-S?3[nb5R67뵙G޼i+&Uʺ,4{nP5+ W3ͦ- "4V%U-[Y :q?ʟ7$/1u|s?$L`I}(wn+!˫Iܱ1PWgݍAr5I$Iw sU8M(T=>gnSn|syόx#>&«=䕑F )-ۛGaΝAL\(~'֜c(7uɽ%8 '|!= 10KNrkevY,aܲ]FOlVX}n]W0`0F,(apv]E{;Wkw6_j Pv͙V<[U0%(<8IO^\8а:x*"Q.lM??jj:v`Qy"h "mX<""S>MY'n+H0,d[RT^tbD4lTs·݂A.U&Z$V'Ys~UjIz:HrU5RTh:^GH?"=u@oNUJtl;b`!BVl\iaeoh6W{kk?vGGӓ'ZN\RdBǽ\92X'fc9:.ܵ Ӟ{1ٱޯ򻭸=GnZT ;YqQI'W/«d/uT<ǒƚ," /; U\|aeDžGSIDXs ;3O^߅+Z2h7 *M!dN9լQ$]z%T?AP+g_lJ&;}k*PWJ_0aa%aέ+ a&)8jVeKZ}G Hr7ƣViZh6꫍_KS嶽~iDs|8!41UhJ:0~jNGD:TsC"-*ªy3?Mn i^<csԘ]è(J&_uG0Z>5Xn&s&]vs{qf2 (W:u0*R^Sɸ|B\Hp37HBO{_Q Qv'`k !v!\Ԩ!ӗ@X7ǟs `ט!UQ(@hלRx_±Ɂ~#BkUjLϴN6b`Vjw5=6@"sV0{?pT8/QE=97׍+JTWA<~D]u{X"D )r#VEs{z ]'9 Xdcb j!68t UYB*m z^ (&29-"u45~jaߡU2Z`tM+zݏ6=_{=IKP('9'@ι)VWT:3qڥtDB~\1?Gs_:`hE2չJ.z@ Dy"{Z @B[!{Ei'<ʃ@T;05):t/%4]9p<;U!Ķ"ocߙȫ٦ 4NL~](׻ox@<5E|ϿI@ `T>u~SM>:@Ցhvÿ":Xgv*7\/#a2~tr uB} ,4 ,cJ@D`?e=5}(}zיhppO`цhn5a^EdUWSFsujD Er/;Qq[A6Ol(=E*=Z60KFZ=^vH^Uy'm"Q$R-L˷PHoAWs zr_s1ϐON<D[?:oFsZm3V1@OCIT=M)`BOSq=mU8dʉbR>ȠH0E׆{ pzja!h~"MJR ~7o^:TVj 3VHqn"xhsى'1IgiJ);snTpI.zdOl 6R Uy$5=TSvG*dA~D63!d58ID&3& }%]MaAy^y6qO g7v;aww3NW3"!vV6;htjǀR>J^CBBw->w7  yU#ȓ%~u/ 惫zۍvPBC9r j4TDbǿC]젣XA naYGTv>鼴o*4/:\~wjq~ɚ  "xL]4ߑWuܟ~}`LVʶ+e^1M+G{]ߓUx_?u}ӌqJy@Ȑ"=-]>"_t]/^{j} vSAvѭWRbqS<0|!mV/6HJԟl~xT1^d?RCC{gY8s_3}i@y^-iskZI-e_ ?EeCEI7JbLhɤ]/_Ї3%/S[ekK6͕ / HEa$T|!k WB^%Sv4 sl]TT/*e}f=N+"Mt?^Vr!7vRnC8چ|.*K@Iq]z'fNֲ~FDt'1::?݄DCBvPjm#M< >%}uy16j@ ddq-e%{}L ?|A4Y"C/ve|Qfȯ" 3lxR O=GP2+%bPE!?k7Pzfr (nŊ2(:EK!J14eBn.k2݅o39mHYK99Ž%"0~Igy wa|fv3{\NO *J*\k-~Bbf_6[6)@+e f),0w4C>Sy{>11 0#od۹fΞ|ڊԠ;vQƿH1r(6Z5$r)夾 |:ߒg3 Ɖ\gڞCd+9" +VU]b$K#g2 7 m9YR( qޘ>>4qaL5pFc`jGT?VHQChx@r*i~w:ef D>OS8sbd𻻃}| lcKs#W,y"YE?Rh6HVEi$4GJc\+˃h8 Mh!@cOi *7So}`*Aj`ڕY :tm1d ǔFM0"éeR_nD[av~+CL9v#.H+x h7{W jzcl%Z8|Sqa1.|;i4X^fKBh,c=fo;sOp I+vz $oK9v6"aKPig엛=Wr_yĝB?=~ (E=ת:jgU'aFu`}52{39>s_MC 0a_UT1s`oנ?]?VoCL2CkOr") e3P iR :5Wa+Ho$E*fDZTy@U+4ħ"QY5 jWcHggI *;1KQstV'l[EWo[¡"Ҍ] :eѦeh~RW|5j]r ݝ:$}Yś?>vslf|ۉ8AB9|"Bf w(#1E&w-~C8-jĻmd K2K!MX0b$g _Q-HYהpt;o=NqA箩%RK.ӗR27Km'OEFvz!>yLu…ycgk}ۈF~M373øeL26!7.\mv \K {E/D0FaBuFYgvSCS'&U߹폆I 42H2Cxɗi9 ?<, 2OVQ;ƥEztUO@Ub^O`&<<@ \f&L0Hr2ec~.t?+oFW X , `r^ R_3sY( h5|\jnT|jhL*nnklhTi{1;/]rў_j^:,e+;\``k'8v0Yp)Q9~N'!>Z] flO=>!e i|nP5x9;sqF=xUFw[.8[ )5n !'bnoyGЮa$*UX҂@lےo!A=YOqi_P9CǃDR\evțW"c嵋i^]t*yNhO*qۏ[V&52T."zM nb1CPC\KSW67~@r\+xJO%u[7V-L`HA^Q.7~"G8j̒3f|g-T/ ` nK嗰yþAaӂ/ym".wK#40Y^H_חܛS3iƴ}{[5eT'ۿݙYw>c>~$2AM,TLDM.ekޯ0nw{"K(d1سzm_u2Ҹ$?W#MƏ NZIH=*X0O܊X#]WXnDYޡ_뉅nYcmnI/ ɰ"f;{V, j *;|<t1VH/? ve҅nk^z5>SXTgSzǡM0 [~ a?ANW?i ?Z0a j"R{zOHܶNdü_U`$i!C<Ĺ\ͩk6:',.n~[`}ho;UZJn#.?˝-MK7MJG;7͆=ݠȅ5`#-#oSnf,+⻩8JMPj=s2w9wy+6j{XdJ]^A C5?/ʩF[)wTVo9I4/H]u Jܶ6Rk%0i\I㷽DH3{9D*l~*W)c#=D(n?II徂 LZS l:˝}= 1Uǥ1vƘ앫~{kHM%%Gq`6dI*5"6lW)<fZvȳ d&^#oZzi;na5-F'R2&@*v>d Oq!Bl@k)E^K/MےxtszC[\ʼn@wV V+>|c<8 u-ѹ'?ckH?0m6X *53)6HAJB71AF3[-kTΟX>QDj5{_P#q?Ȟവ 3ޝY& @m37ύ,GC21>M a "M MOɏ.1Y9PK*(n7Xo6Ef~ \U|cz._K$"+`\_kaaqMŝr.øpW IDCULs7=~c4RH) p #:n5Ez߁Q7)vg c˒ ͖iee?]XTw(~/XvI }{ aZ,Buh0AN߄np"uD ^yaTD; 闋tU; }>4QgoQP]xJ&ü|"H=<! 1<0mUv%nk= "]W?,ڜxwSrZBa|dmPoXl[~#`MNѶzK%Gj iZ᷁a_//i4ʌ4;iZBݏh,'^W3&F7mWa>Q\UH^Ӣqm2<fxA._ )’!ky-:ErI+ap%~*iζ}T7~{V?d3`,NId?5? "jFo:S+Sx~'8P/=5 }H72\ek:SI,ʉQ5{e,? D* hO傯O/-d+Id5doFS!T1i>:@C|7jtE6sPJw:Ylh~ߙ=$;Wozq-*R4ZK IW*|9"VC&[xV@7RjA )QDRb52\v\QDclPtZ8#*OY1gDE~+ EzvW_{kQ$T#ԭ] R=:}&bRQaOk,{ cЕ UFXׅkg:AF-|Km'$޻RVIoS~-Sݠ<-7yݞYH>t-ňj#}=]TԡˋˇpY޷XqDIG~ƋƔs1 oDL>ɋ:Bhz*#=kK?O)cQ*Q;hspdΤW7GϹ~'l\x[ kwe c8ֱ!9YSAr 0\Y:(\pM /Uޠt6R n`T !.~{ pYfM#I"ЅNAgɿze^tT_Q}Py ޜnǤ_b9Ā0 c +!aʱɒ* i8L9_w|\fѸR݉N(g&̄ {U$D+zT&.S!}`_GXtx/bAI.=#У@hNcUM@frgC$e>Ng:=y&﯆c^;!R]GɌ~U7=wMm2̵b&ԯOs|PH(+-'KyS4d!A Iif=̃1ǧʁ~7lrl*G:lBm20S6Qe+ "d l>ܦ"-;o܍;h6􏦊}nZ{UD]ʧ,b%*|Gozl<1~贓sNy(2&ژ[.FqIJYD<9j]E Nn1>>盈>늮ӃS~%T WrڌBZæ, g\H"*P֕qux4cSi[kbl)=hA@jv%֠6MN`*4Q,ʑTjr!5ϵ̐\H?rsNN,z7]/ϚOfGZB*"ϨC >N ƕ$8+gSj. 2x_bI39xl5V C* ?8cFE27X؀Vq \PR&*W=*S*^ũLK&߮jd.qǤ!pPUiWDM8S+xw{RLNUʽ[g|\b[K}Vp[$9JQҖbk>1>MNޒ^| џA`s3з.chDT-ϿSx}ȴ}t< z%%f6:b#)TLv@<.gITnzXl/wmEpߦIeIϬi?aH%ϞDYS G|w1Xz7dcs_8054C6WC}r kӬPNj.~4#쎤-$xkhkf|(ڿ]rPN\76Vw WTMQ sgڷ4CȠYJ&]} O9P}(5~T2iX0&ګϜf>2{m8&0oCn)kPX:÷ZJ0 J'ƂDE3Pw)ڏA-xEraɪF\;&v _J;3y j;dWcoȏW*rt ,z$ǣ0aQoαҋȯΠB )3+kMNs:`bHk8IŅgyJK{=sg1lwMuaT=d/+T tn\+j3ߍY݃R_F`S3z\a1[VhVW1h,ug>̙ Ge]68][Ƿ *<ͅ<{4u7( *%t a-q{<15A(] x#jw$382}rJzE– ؏5DM=igbkѯe`26mm+h2$gw'VAoX_@:z}߸0D:d>4>#\sݎX"qM<̢bw.:0ECQ낼o4D5pmAA\h6l3_~K _tZv oa}݁\`1B7`D#/}JN! .~Д8֨`-̾{8>LTXl>h`7b0{?淂c1[p.Os# ȿ&7"t_s j#G>y'}>pZV t&(PY4 =U8i܉۩/ ̯$ i,h$do; 9eJӺ8h?J3A9mg?fh#vD%:[-jIA+S_.9[F{#F D}WwYAz[V^t~^ ~WFuVsTIZHn50b$/P=Q<ՖQiUnuޖZ } gqmg?l‰H4aBk dW&.;r3UypjyJ1bnL>,la/3ˊjKj 51mT(XYE'CHw& e%'˲;ƒ}VMW >wSUY#YW>w |S?`R!m#i2vlͫX93^zԳqޫoIyRxV*nw*IP;tPXJtA;3sޝZ7f+U?>a^K!n/}iQZHVwBx$ު JbSfxC)y!b;dSPD'%' I@*M07|A?j n13ywX2 vYP!&9fczfلn^-Ipm,2.oX$G9翚;:dt zDߞ6 1jQ`R3 FLr$ҩ\F1عY oP^<_C3+b-d(r3fw]y -[Ȏ2dZ[ˑ1 ջ۷ICJ:17cZ\v͋^~Q`FfAZn\6q6pS%vUH΋ E>/|ˍi%#99OǫܬztOVԥJ;0ّ\ Yvn% 4/#-DR-Q5'\oD\[O-w lɕυtl'n!PaV^_!Dޚ0 ^3gHG}.PӅ)ocay6BNfv{fenQ7v3/w}!UǸM-Xd?CyklMz)K|9c2ɘi*,b&ov}Z$&.ln7AT8i){>v@;wͨ΃203"F!oT%]ȋAw|4## MnwZvi G?J+,Tdc[5<2=D,֔D1'2 ǸM^:DY㵸#i3!,&PA y 5N/Z/Ơгԩ\ҵ .T`5NT?Wc&{},Ǭk50jJ51؏a=+e^oR}l#QOy7Qx@ a~d/r%gba (slٺ8*%wC2A,|ST*D`!YC{~0+޲{O3 mEJ@$#Ԋ-, BA߁N !6. HC$qtf!BUGP`*,pQIs[؝ұ p0ݓK[+qUS2-]_;MTЩ ZxI|mR$ o t{߲^GXs,*%io, 3Egfz>}E÷ydW{}IW9˩zzz\l!;itҮE78Rm ޏ3/HZ+ ~ٷ4bm{ىB#'Bk3Cef1L9$y}Kxo[j\N2<%\x &#D7zgdg'>H F_&5~SLgY!eKىN2  ]9exF8oJw2( ÐNSǺ? _\~1(Ψkb!Wmdgru P$H}llH\,Q9Z773͢%͐ I6C}<;K,]"IZot}^AC rqg Pk6 f)F"F}K#sb|۝Y)_1Ư%5M6+&xjtڮ]`ӆk͙֔*flOY,Zĺ$e i~Ǹ$C}ӋҾ75Z)Dz )uUW[GA6';8+ݮ-^o׌_)0 #K >S$`B&$? :yv^zRexzL+;L+俈"ٛ:XHKMAȟkĕUJg>H;XVpA6?iDw#wlu="Pdk95>rzJDDy p]ya% lU !2T&Sr9OEU N6.NluPpXz=?Bq9_@ )< L}؞F^y]w`sa7Dqo# RqPͯe[@ƂQxm6D%!XB& #g-d`q;GPiNښ3wc7Y+ z4P6 =OCwWrkoIovzs7K,m5(j>K5OO:gGߓ>tw :==z=GvQ"YP2al%Zt_z<=V` y:17sg/B2o7[6;}*DDVb;B{FN=HSxegGPX̄qfA͋}c HF$0e{j {iC6{Xys'b,6ڔCJixݲ˴!&u皾 ˌ4q׌(FߐImP]<:GT:Kf' J9hp#Qh`>娽d_ ]LSm!#(X 2 =,q!pavSBv˦տDe@/$oze}x𣻓Ѐx0䓠$l+cFOt0~G5kV թoK$"B;K͛ KmiNC:EmF-'\>=3ֶ*F^ZD{O4@p(q8#.S*D~̅qbNdW@ drz9Xo yo2]@}ihsOxH+RC;lJ;8r5$ G)YMd8/cߠHͧwURR!x o9-1Sк)RdJ %|jU$)1Pm]lȩ RTJ%]r-v2#&_׌udX *Y0 c@V9hnY<=R2-Ai5(+  {E ?+;7m|b`DFtnd:FNaT>qe _Ae(kTXۻudC u &f`p9aM'=.i:k^4x7F-ڡP]E2qe:wss_f bWA$yLS;N?B>e Bw&[{I?jRs>@7N~^!KA—I3-X>ކ CRnHses͸dYQkxϿ,1M|YSd=ԔՏn'K)Ԥ0x$&AaVgCfjEjȃ0L]bwC0PACiYpˠo >Z3וf`ʢ{6ϱC_@J/5}z8d1M"}FDI+I3]Fx 66 ՐvuV_"B*yO1h`e{< x 4!`HW >Фi#0;>u [yW8Q;^/J @Iw89@4Dqp:t>EIR8E)1ېV:ei; pz%&){EB\)e bWNd}j) ؿTJ=Y}j(z[a"$Fu8_~/-%K K@WAcH0,g/բ3e`WtptH uo@GA dYK2 4+_A=*g]D`6VH*#]͠ ZX.FtݝpĊ(VYz3]{¶<9Kʭ<n.PLn Z/銣wZ3¥%e@{'Mi Ak5 5@2+k>A@=dhX6m$y|i'|X K.ϣɝPm<5h3+4H&֞@Y=HCq&6Ϟ&<[0gwت7(>ˤҏƉ gU}o[YWHhQ[8٨x "X?zN2)Lo=x">w],+_0#\ZouTȇ ZVUN}ڏWM'ZյM!X"DĤ,8l!!J;uԍu_i\m*NWT_Dav=T&Sf ]v61rWdOb$f]0~2"-!}uʸdG]f/H8p8 0,}=ȋثCFG\'ʾ`;Mޥ~V>( `?j뉈g] K饼zϡlnk.KX2 7tW2V!>E G;t=?<'֞"?DD\zW xvu"ε w=Q o a6cc6QF$K,Q? &>Qi)OD|/lG abڬ"JnNEnQ 9ZsRX-0NX4OO ~8Y %P& W"*"čnZ{[*?Wgxqy~ !N3 l!%& { X"mN/7 (.N1>Y+*SΔ&ODOv5?cgO=46lWR&AuYu /J4tI Sԯ3]\٦YD3&̟/ f. gp #Yk}JǣqkSQ0"s>+ȿ8+GWVMu  (;`z]Gn#H$5 B+6).iRz"hu`X&=mnƃ>ih]JRO3"l\pQ.XJ-6 FcѿOɫscmjoƎgfAxMN4 8 h ϱ6 ^;NO%vX4{ݾYаKh_WK%$%@/@,qO4:BS^ i!] i[mEaIjGBA$~&]qQOYB&ʾ2ޠ?%0^(  -R4@:u^=hu|ǒqpθ/saY7%YJ 0y`M6wnJn)(lkleV` І iny{c:$yKHmr ڸ^$R=WB5Ht 6"m)# "$ kT!GKqV:G׿rR<r}x4P%x]YNBZ{XP&eBvhWifQ`aYQQ7Ydg;AgiK_'M:4cpRaVƟC/`U,Ew ezb*&OZmiݯmw_ÕUtsJQ5ۆC w K~rW4D:DGn083礼q^]Y2}4u9 -d+.G<>i"I3nFsiq*ZS>}͂Btx?v e,dXwM:Xm^K %g`{|rr%jߒIW! (\,;w?b}<]2VAP`(bg=l/u>̯p=cYޡ, Nެ} t=rڈ5#&rSVwfr01\n?e$J~4pE{@#3ZqU|&Kk^zN~VnDeTO"(A STM!EpѻAčvR?Jmݹ+\p V,ErEXaH|gdy?0XدϤ%MV,rPY|𗥶I]{ݛC3=Y/,*S f+?'Fs+T˲BiyIM}`K =8#M8^ݞsKZeM=zg 㷺w?eȃ0K6?˦TIgxS#d.P{>֔uñOP#+ Q2 V# L {Qɰɦ$Q*IShkc y3\qD=~8DEĚ4B6W.͏?0 ሷsI6"ln.4}M 8.۾Щ?"/??t1&)9emlS{ Qc| VƁVQD0Ҳpu()Cw^S x!{i$VG*k|u.`FϮڹ dwu$q󷈔(GOC힩~ Qì?g֢51么w[ȱ:Aەr<3XÁY%kv(D[3jAmQ!qXI5GO~TZo6"UM5Dۗfщ}e2Si-P3 5D)I&2ww?[>Ac@EpOzms»Uy)4~'JRgw fE,T⭙gNWL,v^0(}}E1ϯQMc#pkUO)0֥DP.HhZtd[ K31M߱wmC;+Tzm|L\R*pse)Ym05Ywò+X8.zm!O]D&+Ѿ((=-ބ-뱈&|]=Q6:x}'b$5~əc(g,4+rQ{ͳ }r\z;@Ӷ_P'Se 6ČŔҡ?;{μf[]/Oq_r4ىNo̕tn&R<%D߫TЬo[_(c;/quCgOX T]: NW斁HcdK9jSޥ5cRg^Ep(uӸQ貦ZzZgEL7hrDX}WL/Q'\YUԻtME>N~~a2W x4榩vD Fj&{wrkO\_G#Ԋ[@Wv59h'4oBe|"/CzVBH6 $=~Ez۴2/P@;LٓMYʦ@@Eˍ1Ӳ jU7γb61Zn!}Wb2S|K?hBg -6))kA5mciqSsfM$a)HȝX8S:Bx_dڔ1K9 em_^l>Y³.^Eyv_0r&LdH)]/!.u,:YVgjΑꖤGmJpބ1g=`5#4k!:ST) )_.L5_uwjH?/Kݾ8%"?U1g?!`ƍ_ }\ Ξ@OCw6QZX )m%sMء֧z,%Dv|…|u^vS C& \@׷mqs()ѻ>l7 JeSoWXmipbCK7du¹g",AD%fNsyC/~g& ;m]X [4CM{538ݙdkP N7>ͫA%э7BwӆC^č93_ԱƻF\Ox>^Vx)ۀs7qgD$ªo2#w~*H?]m:QokR4m]6 253h[ȢTj>䒟)/YkoW@:]|Z$׃> gMtPq)X5DoU;IQ#g‡^ܛjWOǬ,2]R[55ss+O|?"˭I_16oa =@)ox&4ݟZqg ~dK#L0Pꇫf:ٸ"j;nxqA$;<$՛UV^rݫQ MFH#lԏ˼qI+.]u$7|l&/FwrqiO)嫰>6z6Ly.aSzd[OD[htJ{Y,Pzowǿ(Qߢ-X > EAw _ܔܦ҅BBkSζ$<n~.d Ksg`yK<2{LV A_x7GHc;ښ09'E`u,sNB>=Ɏ"_zcKhZU&`{ ''&ό S?'{]!N"LK7mIfkI:A2@577qFTѝfqS]{WOr[y;hVpQK5mzp(9szn]%1}ɌKXv^ c *]~v؅APEXH00dR (xvࡀ%3SP{'V_ƍ̳Æد+(94U['`!Lq5z3 pHU>'' 3Osfw/7Q4oV ,C6.3gll}SX% cn~Ğf݇F֜x&1 ;řStAx1xVO #A\(Zz,Kݜ->}>"7h dumz]nm= nxc^7tGApqE(Ujo\6z_-4c}VE!hE\{ 7}xY4>쀮Y?&wPo(D:e$Y6A#{_˙w .XwS3/HbhA&:",sxE LY zYC&;ѽ@ PL\<R`șӜZSGY3ݭWE8ESdH^ɞw1Yc?#VPMl6`hNpŞ D1`ʎA3$>P㲐n{~;ݑxV][TF{7Y$P%*iJ,X8۞/"SG d,l:N ɭ1[ΊA~vG^גH:/'g2^bJ&^5.ě_itHB'88^czs(!gk^MZWg:f`zN? ;Ka>HbDŽ(n;Nr_g~5Vn`z]Qm.P7Yȑc8cViGЯۉlnNSoU5=j'wEQq[&>?ɀeNTXCw/DgKPI.`(ܥ*(sFߛ 3m(*<`fXj |P_odSa\BORRbzv8 K-CM[Hh5f=4`Df.]tאNArj Val"SKPk{^:A2\@6>5u~ ./TȎ3Xvu/,~-*-fq3Ə]>|pX c)G Fy_~dBHCDB+K)eT$>yé/nX*Kab>syɞQ3fBxܫge_X~Yc.V-2[.:x :^ľΩ{ '~Ċ~i'Xw|ƃdqN@$ѥ#[*/P(7TJ]V;O·mmO_omb3diZF]ڨ~ОO~e/&.i؅E)( "S|/ KH s#`-vQq( 0t`;ۚE2;`AUWĪ(JdOS#jokQ4Y>wzֽ%e}~>~[;$l!?@1 h t4p*ఄPsC)t|$6i:Ư~Œ>Et7vUIM@ЂԈ OLʀ\6./J0@V#)EֽH3#ɓ }*eg !37 0NK 0Vθa1xbJ@hʔsdWGĄ#;/3_ (8anYl"gDWPu^]Ī"~7}"6bI]axƙ&E !ief0FW+^;e bc;XCu뤢7ӄۣ @]#zgD}\nq peV%ɔH[3n[h"D ֘ŊT K!ym_̳|?rms$w0 e`ǷaP):ڗ!12|&Zfcg~Yk͡uP"|cQk4Ab~ԧX,na|]f 6"9:8#Qy2⋲DsA;Y/ 5 /4$ 'EA9AU/G82~ 5NO3x,DZݨG : ĺ<5m~>2;UpWgy&NT`lEe'za'B )؈.R/Y $!0 nY MX{<'Oxت{ípqd`;dsv+s\LlXgΝgv4oaMS-C+Gչc<Xw:C؜mV!VQf?혈V.Z']t:E+=nءɩHOa2GGkaQEةG0L^HNIpY> fv>tzTE >ߋl|4gp]S]KtCGLIӞ8 a'xOa!>8?wҌMQZPz1yL4l0Ў*_`VoCzcq@Oe$]yW[HkrAm< t/j֬֞"d1P(.hX}G7h_'HxQ[  t0cO``x_KxwG[њ7vx_mwBW0n| & KP^q2@h&6-^.-63_s5{vxׅ\ZjAgNkc9c,#+]|ˌVoQOkQa GfJ}U BGŢ%ζ{O>%:doA\n*`g.n)6(Гu^I0VJiHd) /y1Vdwjno Q(U|gT CʍCͥ;'4DHM)Q+% e쭾 ƛ&m̦ fpo_|W:t삫4+F8ӧP=1sQTcn ̈NGD9dp k:(l/p-UھLe1ӵvSUQ>% gCW USrӬ;ڕӡ#[A] "RZEKic-f\HarʈP y;[$xjIT`*67 vx}Qw%ҡǔ^]kͧ=Fh; ~u_.%ve~)haxXщ2^24*ۊ)In^4@4ҝAOq 8Ao*7z-#EH.k9  b DJrKmx U'plͶ"yRHϒm_&$9C5K/-Fسp |1;./m36K^OѢC}_ZWk$Ml#;|..F>QSuvWQzm6`lyil̋8 U͖ffcR[WAl 5TW cYkit!C«#fPV=0@hb0_R⻇#>>۞?nd@|CɒEk /] ?Er qٗM[| Qo]Q5Jg7xFDW.MkT닂ĎZɧZ| 'Byxm&@?*dRolӗC4 7" Cyn ]qW*SpOKa:,ob\J1|PYS풸Mb8exz?N~.NU|6)cCA٨3Lfm^zw5".m*݌|9iuzޫ&tng:^=]sh?μyoZ ogq^'_ˑ} =nnZ1tqWbr6]^Gdk(5ElRkrYpR-+e+Kl?TءZl/2.o{3[],Oa=9Ag?_ذ?m! |IOg5?>w3k :Z91 ՛fuo9fǴMWI1Oqy#mh]1<6F +0I\Ƙ؅ʦKX ^A{˔,jԦW]{'$\"6q$J/Pɞf2gz鞫?bf ?TYs%QNyaxRtܽ9Bh<ƿ6i;Ei[Ure+"ݼԫt48_DX\L \Gh^sK2~b&9)xeI6[,uI]od{1>^EǠlK.L?!:4}ނ1?,Qv@7{ )와mD<+t8AuZt{_v[4xOlXzrDjz"] nK7^J,>a<d_տ_э:t˶aIz6Ip9U5\6CX$y"Txzo鎾}X[@UYٞ-5fŠ:JꗉOz_Ic{Q׍&ȌRULr%'γX alpKAZ);ƚE'k|]f[76~I6\·4킬TSf ,hMwϗ2UxG{E1c2FO4:P5$gۘЮJ_>o[ x[Bf|ϴ%QF30`*H-r,dKܒ<7 }I2_%uRY&zl k|)٫>cn9l-w|ƞU۸|Eퟡ+sUu*<('y8fTbW} ;ISKGjJam,UC;aONñ2F$%7B+* ɔ3jtб J2f$&B? ;ʸs-ƅu)`?m^~z.h'zJ`s0XQ8E_K d(X}9έ`Rs`=qD0ySFKKaIݪP}宬M,rO/P»}^.&p6M = [bʅ1߯ly6# i+Ȝ%>\K2ۑKh olMms}… \8Ec%6px ůid [>+iJB{0-ߍԺO`Lu{.WK8X%@ F4:e9c3Z3J\aN[X#c„D}S"X{Rɞmn·]&jA8ޞ%W"$RoGOмN૾Ս.:+V(Wx0NWElIdet+yeDibq K0 P# ؃7|4ՁCإ4ި|}cFDto'dKQѷS(.뙷7͹C֩t_ jK.-2hl{i {[* 50PVa.Ƀr,(庉A8΄gkM~E쓮iuo9"';Q=+<5fxr-IH9 (~yٵ8jjê9ڷwzl{xl6lyj`)6SLyjH2{9\3M=١ÏCRJ ƣg5~}9;=4 Fq{2bBA}OHfjÐV q37F%zB@/WP9%Sݵ cI:1WXJ~ +B8,ku2T2R})"pQUˉf˒MSK'Jݐ}哆c\ ") xFS>kVrH'<$C mw5ÃϚ~l?cF[cLOXYoPl7!} OH^UTw{V(8n~{+%0$dP/]i"ᡜlI/${] _zP(MeG1@ol0p?#(n*^~OѼP~/饁0qV7`~-f}HC$O/L "9R"A%κ'l<@6:nK8mSfֿ[T~&Q; !'pnYf;H)Kdd jzxLK4r+Tv u)ЈHHd)C 6:ꝨAPyzF^jI]fʀMw{Қs]nz~(4^Np&$~WB;:^9d\:ۏw"Թ>+] :{\(RY"oꯟI`P&r-9n;"$k){~)"L`{I(``<((ⴚeLzV$vP*A{%Dׁ+cݍqBQmZFKmGCͨNДK#48}=U|<~0CRȃ8fP߻A[2s)mT;*/ B;zH+Lx rf45}_fFa9ڱkj7: XGƽX^{i)@Y}t>!l~Mp<thEQ@!˅hSnW&Wz@{rn4ѬIQ@ JO@tϸK{R,WOa(Ө*dwz,ރ2`<)"6b0avٳ6\LuOcn=>~jGȶY*|U14f\/HzoH]իB[4ʰR ]mRhrF9nJhGZW4d{67D(7 Ǭ_jK;[Ht@+cK^ƛ> ß(9/<9 \Mf 4c =(0{eaY7ٞ7 NDE}-ݼ=Y߬L>5z Y|V4']o*|w3۾']>1 Jۯ:0.s`WdV)sDX+>LK`JQvP^T+¢˪ih7ջRH.o{w۪aYC1 %0k'(O.4xJh6$R -6ҳ?a&G`j.U-;W^۵T&8ߛKEq%?ƂEc.qjEsoi"}0BF^LBuU̩'-^PSH"<SQRwXua4vʼn1 TCp@6u(P.f3d,urs{NKoSJ(Q!ԡLJ"Lj5DQo5YaBQ3*?'|GƋYd# JVg.8t9_qy+.Z+A9b ٣K׶-=E!\Odyaf`xĿ]߱ ^*o-ZoBGz~[Bj!$j S B1/pPQDN[^|ZK積%^4%\NRV[ 0JcMOgl㾳5,ʲ&crx䖏Zs'6qAE7^C7]rBtDDDW _d<-}_o (JћV :OKp}M\oi78W e͝ 7Cl`8Et^dkј1n*׻s{pgdUUzrp[rc k1xˠtctѦ*]jO5Ccjc*ԯug,soM=PߑT5S( /1y>&CQl~&gj $=̬ǡ^<B#P}5T= =[N6 3gBRxF{ݙ=U"fM-6q; )ömp0~1d4 _#7OW5GPپ V}ͨ^~%)9YfՄ-K~8a`n@ɆM %kO ͽGU8Y/fFΈo)UPi4$BrIr,3lM9뚘DQ'xBm"J @aa3@u#J$ٓ9kŗ3:!WűqTy&Y0Ζۙl+ɩEEwK-&(`W˚8)5ɬUd:CzNqnXeI\]K񋶓1??jR7;Kt1A=:37~M&ևa j=+iUu WhU[lbe6?VޝZ#&ԃzSkweqTbŦYU/>]kޔ?ֲ$x&Kr+CRb&bâX%T,v o2=1 E4B{Eȥ1ۋ"F/T= RTUr躶DoT.10ƎODYoh QX!=$+1aG芷UDb͇Xpu}bat-# 4;v-z>_am9I"Kg^1dX1c-eP?Hr:mۑ]vT/n<֙hS/RJ)Pv5 tZ_ҍ V*L@ϩ +XX&yխRh.6™52:* g jL$Е?Z*KmgMA@̭Īt)G׸b|Jmf*z$==:XV&̑e(0Mr[RvO5J8CL__ e:(UűJPjFPI+m5QZgϧy4@b¬-{Š46?cD&Ң sџhھl9bȧ 1A+ pj~Qf" 2)cRz =XG<[todMBZۣ.p<bhӴS5񈫱]pX*0vlꖔ{ CpЍ9>.OkwnX}F7udӝ*jnkM Crhcaҏ\X̆ԣ+50&&K͙,Z <3f;);Kݟ@ɑees' jvgjH/wQx?_V:mr&*Q"Lxe"ÉZ󎪭Q8A.`&_Ÿ_鈴m=a؅NLiz_h7D&`5PPr0t,f~w%$Q nhRNEe caULS tK E! v-uVxؕn%ЁKǛc}\K˜1aߘّDu2TCs  l2w܂TM֧5_r]!(fs|/w5R4 tS3O8FX.fzIЄc1UQU ([; /?6_ `6YP&LsvQ}&2$Q΍a&J*)uÏN/ '̿.h'Oȥ内]m]xoto3('d91:L;+5`1R,m/TM8hˈآ 5K-CՂ6]V)eFc|hBw7ၗ$g{ۢZy琪3U> ަo2X{K^7ڏA]%l`h0שN?f)cHTTTz%D5Se0*|m2puSMP˅@lgs V˹/aA6" ZcQίǛ4\9r Yf:lFx6!ޒucwx]A_Ar 1@@)QHcưTɁNʇ!+$Tɵ(иʛ D#R0ر=K]oﱌh^.ςDgK!8`A摁F1aa: bȳp`!f QUޭۭ15ٮXNEjߵٵ-7=k<+}rc5QVҚvg !{4(^>t7:aBˮM+*|(gNPy J3< شj3a1&ްj-ᇭS* oBM1(g<$)hfu¬(Mly[zs^ώsK9̱, (Ȳ -k?(|zɿC'@naj#;^)qZ$#(5F5/{3}gVPӱxfJϢC OB3`Vx.&yFj-ϼ.>l:6W'`/W@KGVcY7Np'lGLxs+ ?x=6Xoj '+}A@[O/xu`N>IH|jZʃzݰ ~ۨ%{b(5K(9a-7T[{ ٚ%U7G1u#@g7R,<:׊ y`Q"rNʝMutc =#[$焮1=hm K{ Mc1]EJ ׀D.uj+F|GFfy~նТZijIX]0K XiL}f&+Sٱ)F)ΤW `G4xw#nC D$;ltE(JO [3nMء6sxXZۆb:td Z}LBr+v gUN1ao݊7Üh+} Y]Mr,|)y" 8dpk$XRբ/j^< tѵ%WEjVʦ|.qJbϔ7eYUWOS!>h(:{`b5ZmJِתxl~et'yƶl'FkMW`%N@;è9K|n̎,j XjV3q gtȝ΋Aze}8'Iv]*~ q Ӧ׿Ӛݧ+ Ś^E1ֿd!X[8;)RJ%zڙ wl}3 0fF8yVzN/7HJ=C #ъJ g9g6^vR~økfp=(!5նѽ]iM;r,i,(k]s) €ȥ3]L{hZ(؟?1vcW1<]7#MTWсU}u ԓƧ׌Jnum%+]kxG|ޠ,LcScUlـ_0 + tB;$=+bGڹ4U?NmtcjcHM!أS3"D& $ X Ȉoa0HW:ǹAfFdvXjه8fu,kT9&J!(OH;"c{0i64Căj s;]^ϾiuFu#YY7w*9a]絆Or^oKSA܎$DnRVZ "";Iloov1a gpN} tK>5rqtzqDNC2wfp 36),gg4'FȌg@+FHOС:P!xAKjUuQdzg|VML$ƆCQjICرg. Ɠ3 l20 i+Қ8e)~4!%{`5o3]0KPoPgu{K7V'>:Whc~%zdۆYM ye5 vdUkUPԢm8=%/}XBI(.AS9Btj8PUT6gγp7+ E0. o_ބSCyh(Z[Td}9F2_Q˝3QZYn>.6@ܬ&\+bpi[z4S@[p$A+Pُ͢ӯl`-T}5wfP'WFku٥29?TEFS 6X#έgeʽ$EBcH"m5& l+qvE2gvm *ގk*8$ tOi6ީy!=7Y/i:~<36<`+_+i#OX,`jEQ@O?i>FU2!ls9T9pfYݤN!5oe B!uG&$[oԤv\X$ :(s%lɎ"&:^\+p;`f&Wt;% nM?P= n/=ݔƞ9 *wkl."}ж }wcsjvTRz&}-B`Or1>6|/kb0H5eUzza(`Q3jpp.F5tǒ֤gj3sA_gܱҚ7L{tϠ/¬q5*.!UR 5}ͅ:+q E 3>g;MO`4~Mzx)fɐ]~sYYjx5mڠͱٞy {}i}V|/5]j%J%$I>A[r mYh]2郜KqSV>wӤD^\fCrUzx&؝rW) W٦zZ ?>ʼnl23!TlS5A\I0 鸘,zV݌O"̫ 鿠Uw\nߺ6nYj/U`mZ\aRKN]FT7jZ;%WVI+$q|!ֆaqSTu j>-xN `czJ++4ڇ1i!EL҇E”V̅xxXc91+8dqf,^{6( ҆ru"֛KY]ﬖRikk9liHq0=d+mLL[OM}r,H|Rs0Dcϲ*ph&Cl0,?' z5x;!:^7Ļa %jډoP]̜J èlUϓ!3yJ[?;RaFcu~/76نMyc":jȠCw2YsN=u8l) P0AJ>F1hܢZVk۞WژxwK^rel%wws\>Ӂ@m&ޟF)MV<{WiSڵ+=nX*z,-aƴN/I뇠5&?NW!ng4栧.e%ù~9 &1+i_UWI&ɕ7{Ѕpf/?M_&.yZ+3LJM-C},]A3c.> .s9ZwbLAAU 0}tk1¢Ά5X'cvLr֬j_6IXXO9xhDщip[ Tʳa[̶ລU[2XwTM1 K׷.|;ڄ X)KZ]jMG@`\lJga+g蕻g҃lcUby30:A(=VABv[P3vVO}i{)T bvd':! ޟI $MU}AkjXò\ )~_mMhQ?m᭯M=?nkL*n; 6˰RBRU1Vrϧ_: C=7TMLȻ'!|-]ޭ @ X4gkݥޟ2aJ-/*o]+mKSkД]_(w =1d/ oȻ峽Vq)\= X :AaɾS4,<G1Mƛipd:x 6oˍy1K8%_y:T:үA oPn8-xIJρ0rIs m+^ެZr﷥y_x i5n~ X*WJz5ƺ^03Ӑ]JG Bj_ͻigPjbXqMFlzsmnt? /ߴE vj퉋3w+6}Œ`׬|'o*vNI﷊vW=#2Fm#g΋jf[W hev HF$~;ZuQAlnD:iҁ&(f5[B/HJ" Ygl&Oc=M&W4BW*Lo?uM?8=ailq S|(? jC'dFKp赾n;cr=p* t uDW ؎Ud 8 6ebOurxMV]j"9J#q"s Lj x[;S -P-S$Y6F A/Z0q,rpʣoǥP@B F v=^{x]%nR#H+{j W7KE|m@hǒlբTuuGE5n m;ZnM374Juf =TcŁ K1s ;dX]_9 AUu'5>!OX'*P"kaYZV&0>bkߊ%WJ_b:}Sp<]EHիtvūVcX 7AW*֊hrbC?I <x$S." Wf}2*Pc[V65(?ZTͷθLuEc±/SZo̒HA@y>6#_1d-ym窜ݥ&QJĭ9E U.w!VɅ4I3woOEEB2P+jyjou;Z$!F[d)kha!LppDS|^5qco{Y_ }6{ EpJ ڕb~Ua]#@>䵘:K8-3J%4BD5g|7bf+]w-Jfw8Zg\Ce.b1ȊK𑋻̢Js%HB/kho%Hd_7='   cY5fUXXU%XƄZT>!BxI}qkhU{-'7zb&ե۬c9f3v\yYܜ-2tҫ0mkrJS.f]ߧwY9'"( ջ(LcY^|󶼨 ۈwc%Va3,eؐbϔd dH<#pl ;ɉnml1' ݕ#Vҳv?w`phё"!C9پreN6íXPoɧ>DI qt GG:\/LR[mr={0tZWx|'_ƋZN^$y8^k勿AJbhՀ`zwL G ip{&'j$ch[K]5P^w[nƽNbv(1hMIܢ &/C}?<f;~뇳4?zy7 q#`AzůA#k;^vωv׃w/ME3w:  0 qM3"3]@7@V-@$h^6WYЉ?:48*q7`5\?/q =ӍjXۣ"` zvךw˾'zH~ ̓kn#=@x2 cQE/R+bkGW++)`_/'g^ÞZbm - 33$@`@6% DF8Effq<4s0fh٫Pfx e@VH D!X}Eym;#ajT0)F` ,rC[ԠPz '3:(eG v/`p{_~VoB21A"# @P2 .;!9T`P? !k'b+`ȩm>խk[#d?n| [,ji"eq{U.(eRoWSO.mFSx9_@t(cC - .-Dj:{7`+gym$X Ʀ;|G?¥Ke!=1R|%8lL7) `v4'hxb/4RG8=΋@/! > O%e7(1BkÎtijsPbзu ^PO_<욤cIjo~G/HwQ?6lF)$<LK6ggQOt22w*]BAdbrms/R/update.R0000644000176200001440000002556613611527526013051 0ustar liggesusers#' Update \pkg{brms} models #' #' This method allows to update an existing \code{brmsfit} object. #' #' @param object An object of class \code{brmsfit}. #' @param formula. Changes to the formula; for details see #' \code{\link{update.formula}} and \code{\link{brmsformula}}. #' @param newdata Optional \code{data.frame} #' to update the model with new data. #' @param recompile Logical, indicating whether the Stan model should #' be recompiled. If \code{NULL} (the default), \code{update} tries #' to figure out internally, if recompilation is necessary. #' Setting it to \code{FALSE} will cause all Stan code changing #' arguments to be ignored. #' @param ... Other arguments passed to \code{\link{brm}}. #' #' @details Sometimes, when updating the model formula, #' it may happen that \R complains about a mismatch #' between \code{model frame} and \code{formula}. #' This error can be avoided by supplying your original data #' again via argument \code{newdata}. #' #' @examples #' \dontrun{ #' fit1 <- brm(time | cens(censored) ~ age * sex + disease + (1|patient), #' data = kidney, family = gaussian("log")) #' summary(fit1) #' #' ## remove effects of 'disease' #' fit2 <- update(fit1, formula. = ~ . - disease) #' summary(fit2) #' #' ## remove the group specific term of 'patient' and #' ## change the data (just take a subset in this example) #' fit3 <- update(fit1, formula. = ~ . - (1|patient), #' newdata = kidney[1:38, ]) #' summary(fit3) #' #' ## use another family and add population-level priors #' fit4 <- update(fit1, family = weibull(), inits = "0", #' prior = set_prior("normal(0,5)")) #' summary(fit4) #' } #' #' @export update.brmsfit <- function(object, formula., newdata = NULL, recompile = NULL, ...) { dots <- list(...) testmode <- isTRUE(dots[["testmode"]]) dots$testmode <- NULL object <- restructure(object) object$file <- NULL if (isTRUE(object$version$brms < "2.0.0")) { warning2("Updating models fitted with older versions of brms may fail.") } if ("data" %in% names(dots)) { # otherwise the data name cannot be found by substitute stop2("Please use argument 'newdata' to update the data.") } if (!is.null(newdata)) { # TODO: update info stored in the families such as 'cats' or 'thres' dots$data <- newdata data.name <- substitute_name(newdata) } else { dots$data <- rm_attr(object$data, c("terms", "brmsframe")) data.name <- object$data.name } if (missing(formula.) || is.null(formula.)) { dots$formula <- object$formula if (!is.null(dots[["family"]])) { dots$formula <- bf(dots$formula, family = dots$family) } if (!is.null(dots[["autocor"]])) { dots$formula <- bf(dots$formula, autocor = dots$autocor) } } else { # TODO: restructure updating of the model formula if (is.mvbrmsformula(formula.) || is.mvbrmsformula(object$formula)) { stop2("Updating formulas of multivariate models is not yet possible.") } if (is.brmsformula(formula.)) { nl <- get_nl(formula.) } else { formula. <- as.formula(formula.) nl <- get_nl(formula(object)) } family <- get_arg("family", formula., dots, object) autocor <- get_arg("autocor", formula., dots, object) dots$formula <- bf(formula., family = family, autocor = autocor, nl = nl) if (is_nonlinear(object)) { if (length(setdiff(all.vars(dots$formula$formula), ".")) == 0L) { dots$formula <- update(object$formula, dots$formula, mode = "keep") } else { dots$formula <- update(object$formula, dots$formula, mode = "replace") message("Argument 'formula.' will completely replace the ", "original formula in non-linear models.") } } else { mvars <- all.vars(dots$formula$formula) mvars <- setdiff(mvars, c(names(object$data), ".")) if (length(mvars) && is.null(newdata)) { stop2("New variables found: ", collapse_comma(mvars), "\nPlease supply your data again via argument 'newdata'.") } dots$formula <- update(formula(object), dots$formula) } } dots$formula <- validate_formula(dots$formula, data = dots$data) if (is.null(dots$prior)) { dots$prior <- object$prior } else { # update existing priors if (!is.brmsprior(dots$prior)) { stop2("Invalid 'prior' argument.") } dots$prior <- rbind(dots$prior, object$prior) dupl_priors <- duplicated(dots$prior[, rcols_prior()]) dots$prior <- dots$prior[!dupl_priors, ] } if (is.null(dots$sample_prior)) { dots$sample_prior <- attr(object$prior, "sample_prior") if (is.null(dots$sample_prior)) { has_prior_pars <- any(grepl("^prior_", parnames(object))) dots$sample_prior <- if (has_prior_pars) "yes" else "no" } } if (is.null(dots$save_ranef)) { dots$save_ranef <- isTRUE(attr(object$exclude, "save_ranef")) } if (is.null(dots$save_mevars)) { dots$save_mevars <- isTRUE(attr(object$exclude, "save_mevars")) } if (is.null(dots$save_all_pars)) { dots$save_all_pars <- isTRUE(attr(object$exclude, "save_all_pars")) } if (is.null(dots$knots)) { dots$knots <- attr(object$data, "knots") } arg_names <- c("data2", "cov_ranef", "stanvars", "stan_funs") old_args <- setdiff(arg_names, names(dots)) dots[old_args] <- object[old_args] # update arguments controlling the sampling process if (is.null(dots$iter)) { # only keep old 'warmup' if also keeping old 'iter' dots$warmup <- first_not_null(dots$warmup, object$fit@sim$warmup) } dots$iter <- first_not_null(dots$iter, object$fit@sim$iter) dots$chains <- first_not_null(dots$chains, object$fit@sim$chains) dots$thin <- first_not_null(dots$thin, object$fit@sim$thin) control <- attr(object$fit@sim$samples[[1]], "args")$control control <- control[setdiff(names(control), names(dots$control))] dots$control[names(control)] <- control if (is.null(recompile)) { # only recompile if new and old stan code do not match new_stancode <- suppressMessages(do_call(make_stancode, dots)) # stan code may differ just because of the version number (#288) new_stancode <- sub("^[^\n]+\n", "", new_stancode) old_stancode <- stancode(object, version = FALSE) recompile <- !is_equal(new_stancode, old_stancode) if (recompile) { message("The desired updates require recompiling the model") } } recompile <- as_one_logical(recompile) if (recompile) { # recompliation is necessary dots$fit <- NA if (!testmode) { object <- do_call(brm, dots) } } else { # refit the model without compiling it again if (!is.null(dots$formula)) { object$formula <- dots$formula dots$formula <- NULL } bterms <- parse_bf(object$formula) object$data <- validate_data(dots$data, bterms = bterms) object$data2 <- validate_data2(dots$data2, bterms = bterms) object$family <- get_element(object$formula, "family") object$autocor <- get_element(object$formula, "autocor") object$ranef <- tidy_ranef(bterms, data = object$data) object$stanvars <- validate_stanvars(dots$stanvars) if (!is.null(dots$sample_prior)) { dots$sample_prior <- check_sample_prior(dots$sample_prior) attr(object$prior, "sample_prior") <- dots$sample_prior } object$exclude <- exclude_pars( object, save_ranef = dots$save_ranef, save_mevars = dots$save_mevars, save_all_pars = dots$save_all_pars ) if (!is.null(dots$algorithm)) { aopts <- c("sampling", "meanfield", "fullrank") algorithm <- match.arg(dots$algorithm, aopts) dots$algorithm <- object$algorithm <- algorithm } else if (!is.null(object$algorithm)) { dots$algorithm <- object$algorithm } if (!testmode) { dots$fit <- object object <- do_call(brm, dots) } } object$data.name <- data.name object } #' Update \pkg{brms} models based on multiple data sets #' #' This method allows to update an existing \code{brmsfit_multiple} object. #' #' @param object An object of class \code{brmsfit_multiple}. #' @param formula. Changes to the formula; for details see #' \code{\link{update.formula}} and \code{\link{brmsformula}}. #' @param newdata List of \code{data.frames} to update the model with new data. #' Currently required even if the original data should be used. #' @param ... Other arguments passed to \code{\link{update.brmsfit}} #' and \code{\link{brm_multiple}}. #' #' @examples #' \dontrun{ #' library(mice) #' imp <- mice(nhanes2) #' #' # initially fit the model #' fit_imp1 <- brm_multiple(bmi ~ age + hyp + chl, data = imp, chains = 1) #' summary(fit_imp1) #' #' # update the model using fewer predictors #' fit_imp2 <- update(fit_imp1, formula. = . ~ hyp + chl, newdata = imp) #' summary(fit_imp2) #' } #' #' @export update.brmsfit_multiple <- function(object, formula., newdata = NULL, ...) { dots <- list(...) if ("data" %in% names(dots)) { # otherwise the data name cannot be found by substitute stop2("Please use argument 'newdata' to update the data.") } if (is.null(newdata)) { stop2("'newdata' is required when updating a 'brmsfit_multiple' object.") } data.name <- substitute_name(newdata) if (inherits(newdata, "mids")) { require_package("mice", version = "3.0.0") newdata <- lapply(seq_len(newdata$m), mice::complete, data = newdata) } else if (!(is.list(newdata) && is.vector(newdata))) { stop2("'newdata' must be a list of data.frames.") } # update the template model using all arguments if (missing(formula.)) { formula. <- NULL } args <- c(nlist(object, formula., newdata = newdata[[1]]), dots) args$file <- NULL args$chains <- 0 fit <- do_call(update.brmsfit, args) # arguments later passed to brm_multiple args <- c(nlist(fit, data = newdata), dots) # update arguments controlling the sampling process # they cannot be accessed directly from the template model # as it does not contain any samples (chains = 0) if (is.null(args$iter)) { # only keep old 'warmup' if also keeping old 'iter' args$warmup <- first_not_null(args$warmup, object$fit@sim$warmup) } if (is.null(args$chains)) { # chains were combined across all submodels args$chains <- object$fit@sim$chains / max(NROW(object$rhats), 1) } args$iter <- first_not_null(args$iter, object$fit@sim$iter) args$thin <- first_not_null(args$thin, object$fit@sim$thin) control <- attr(object$fit@sim$samples[[1]], "args")$control control <- control[setdiff(names(control), names(args$control))] args$control[names(control)] <- control args$recompile <- NULL out <- do_call(brm_multiple, args) out$data.name <- data.name out } brms/R/stan-helpers.R0000644000176200001440000001624513612312340014151 0ustar liggesusers# unless otherwise specifiedm functions return a named list # of Stan code snippets to be pasted together later on # define Stan functions or globally used transformed data stan_global_defs <- function(bterms, prior, ranef, cov_ranef) { families <- family_names(bterms) links <- family_info(bterms, "link") unique_combs <- !duplicated(paste0(families, ":", links)) families <- families[unique_combs] links <- links[unique_combs] out <- list() if (any(links == "cauchit")) { str_add(out$fun) <- " #include 'fun_cauchit.stan'\n" } else if (any(links == "cloglog")) { str_add(out$fun) <- " #include 'fun_cloglog.stan'\n" } else if (any(links == "softplus")) { str_add(out$fun) <- " #include 'fun_softplus.stan'\n" } hs_dfs <- ulapply(attr(prior, "special"), "[[", "hs_df") if (any(nzchar(hs_dfs))) { str_add(out$fun) <- " #include 'fun_horseshoe.stan'\n" } if (any(nzchar(ranef$by))) { str_add(out$fun) <- " #include 'fun_scale_r_cor_by.stan'\n" } if (stan_needs_kronecker(ranef, names(cov_ranef))) { str_add(out$fun) <- glue( " #include 'fun_as_matrix.stan'\n", " #include 'fun_kronecker.stan'\n" ) } family_files <- family_info(bterms, "include") if (length(family_files)) { str_add(out$fun) <- cglue(" #include '{family_files}'\n") } const <- family_info(bterms, "const") if (length(const)) { str_add(out$tdata_def) <- cglue(" {const};\n") } is_ordinal <- ulapply(families, is_ordinal) if (any(is_ordinal)) { ord_fams <- families[is_ordinal] ord_links <- links[is_ordinal] for (i in seq_along(ord_fams)) { str_add(out$fun) <- stan_ordinal_lpmf(ord_fams[i], ord_links[i]) } } uni_mo <- ulapply(get_effect(bterms, "sp"), attr, "uni_mo") if (length(uni_mo)) { str_add(out$fun) <- " #include 'fun_monotonic.stan'\n" } if (length(get_effect(bterms, "gp"))) { # TODO: include functions selectively str_add(out$fun) <- " #include 'fun_gaussian_process.stan'\n" str_add(out$fun) <- " #include 'fun_gaussian_process_approx.stan'\n" } acterms <- get_effect(bterms, "ac") acefs <- lapply(acterms, tidy_acef) if (any(ulapply(acefs, has_ac_subset, dim = "time", cov = TRUE))) { # TODO: include functions selectively str_add(out$fun) <- glue( " #include 'fun_normal_time.stan'\n", " #include 'fun_student_t_time.stan'\n", " #include 'fun_scale_time_err.stan'\n", " #include 'fun_cholesky_cor_ar1.stan'\n", " #include 'fun_cholesky_cor_ma1.stan'\n", " #include 'fun_cholesky_cor_arma1.stan'\n", " #include 'fun_cholesky_cor_cosy.stan'\n" ) } if (any(ulapply(acefs, has_ac_class, "sar"))) { if ("gaussian" %in% families) { str_add(out$fun) <- glue( " #include 'fun_normal_lagsar.stan'\n", " #include 'fun_normal_errorsar.stan'\n" ) } if ("student" %in% families) { str_add(out$fun) <- glue( " #include 'fun_student_t_lagsar.stan'\n", " #include 'fun_student_t_errorsar.stan'\n" ) } } if (any(ulapply(acefs, has_ac_class, "car"))) { str_add(out$fun) <- glue( " #include 'fun_sparse_car_lpdf.stan'\n", " #include 'fun_sparse_icar_lpdf.stan'\n" ) } if (any(ulapply(acefs, has_ac_class, "fcor"))) { str_add(out$fun) <- glue( " #include 'fun_normal_fcor.stan'\n", " #include 'fun_student_t_fcor.stan'\n" ) } out } # link function in Stan language # @param link name of the link function stan_link <- function(link) { switch(link, identity = "", log = "log", logm1 = "logm1", inverse = "inv", sqrt = "sqrt", "1/mu^2" = "inv_square", logit = "logit", probit = "inv_Phi", probit_approx = "inv_Phi", cloglog = "cloglog", cauchit = "cauchit", tan_half = "tan_half", log1p = "log1p", softplus = "log_expm1" ) } # inverse link in Stan language # @param link name of the link function stan_ilink <- function(link) { switch(link, identity = "", log = "exp", logm1 = "expp1", inverse = "inv", sqrt = "square", "1/mu^2" = "inv_sqrt", logit = "inv_logit", probit = "Phi", probit_approx = "Phi_approx", cloglog = "inv_cloglog", cauchit = "inv_cauchit", tan_half = "inv_tan_half", log1p = "expm1", softplus = "log1p_exp" ) } # define a vector in Stan language stan_vector <- function(...) { paste0("[", paste0(c(...), collapse = ", "), "]'") } # prepare Stan code for correlations in the generated quantities block # @param cor name of the correlation vector # @param ncol number of columns of the correlation matrix stan_cor_gen_comp <- function(cor, ncol) { Cor <- paste0(toupper(substring(cor, 1, 1)), substring(cor, 2)) glue( " // extract upper diagonal of correlation matrix\n", " for (k in 1:{ncol}) {{\n", " for (j in 1:(k - 1)) {{\n", " {cor}[choose(k - 1, 2) + j] = {Cor}[j, k];\n", " }}\n", " }}\n" ) } # indicates if a family-link combination has a built in # function in Stan (such as binomial_logit) # @param family a list with elements 'family' and 'link' # @param cens_or_trunc is the model censored or truncated? stan_has_built_in_fun <- function(family, cens_or_trunc = FALSE) { stopifnot(all(c("family", "link") %in% names(family))) link <- family$link dpar <- family$dpar family <- family$family if (cens_or_trunc) { # only few families have special lcdf and lccdf functions log_families <- c("cox") logit_families <- character(0) logit_dpars <- character(0) } else { log_families <- c( "poisson", "negbinomial", "geometric", "com_poisson", "zero_inflated_poisson", "zero_inflated_negbinomial", "hurdle_poisson", "hurdle_negbinomial", "cox" ) logit_families <- c( "binomial", "bernoulli", "cumulative", "categorical", "zero_inflated_binomial" ) logit_dpars <- c("zi", "hu") } isTRUE( family %in% log_families && link == "log" || family %in% logit_families && link == "logit" || isTRUE(dpar %in% logit_dpars) && link == "logit" ) } # get all variable names accepted in Stan stan_all_vars <- function(x) { x <- gsub("\\.", "+", x) all_vars(x) } # transform names to be used as variable names in Stan make_stan_names <- function(x) { gsub("\\.|_", "", make.names(x, unique = TRUE)) } # checks if a model needs the kronecker product # @param ranef output of tidy_ranef # @param names_cov_ranef: names 'cov_ranef' # @return a single logical value stan_needs_kronecker <- function(ranef, names_cov_ranef) { ids <- unique(ranef$id) out <- FALSE for (id in ids) { r <- ranef[ranef$id == id, ] out <- out || nrow(r) > 1L && r$cor[1] && r$group[1] %in% names_cov_ranef } out } # prepare a string to be used as comment in Stan stan_comment <- function(comment, wsp = 2) { comment <- as.character(comment) wsp <- wsp(nsp = wsp) if (!length(comment)) { return(character(0)) } ifelse(nzchar(comment), paste0(wsp, "// ", comment), "") } brms/R/posterior_samples.R0000644000176200001440000003265413606326626015337 0ustar liggesusers#' Extract Posterior Samples #' #' Extract posterior samples of specified parameters. #' #' @param x An \code{R} object typically of class \code{brmsfit} #' @param pars Names of parameters for which posterior samples #' should be returned, as given by a character vector or regular expressions. #' By default, all posterior samples of all parameters are extracted. #' @param fixed Indicates whether parameter names #' should be matched exactly (\code{TRUE}) or treated as #' regular expressions (\code{FALSE}). Default is \code{FALSE}. #' @param add_chain A flag indicating if the returned \code{data.frame} #' should contain two additional columns. The \code{chain} column #' indicates the chain in which each sample was generated, the \code{iter} #' column indicates the iteration number within each chain. #' @param subset A numeric vector indicating the rows #' (i.e., posterior samples) to be returned. #' If \code{NULL} (the default), all posterior samples are returned. #' @param as.matrix Should the output be a \code{matrix} #' instead of a \code{data.frame}? Defaults to \code{FALSE}. #' @param as.array Should the output be an \code{array} #' instead of a \code{data.frame}? Defaults to \code{FALSE}. #' @param row.names,optional See \code{\link[base:as.data.frame]{as.data.frame}}. #' @param ... For \code{as.data.frame}, \code{as.matrix}, and \code{as.array}: #' Further arguments to be passed to \code{posterior_samples}. #' #' @details Currently there are methods for \code{brmsfit} objects. #' \code{as.data.frame.brmsfit}, \code{as.matrix.brmsfit}, and #' \code{as.array.brmsfit} are basically aliases of #' \code{posterior_samples.brmsfit} and differ from #' each other only in type of the returned object. #' #' @return A data.frame (matrix or array) containing the posterior samples, #' with one column per parameter. In case an array is returned, #' it contains one additional dimension for the chains. #' #' @examples #' \dontrun{ #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = "cumulative") #' #' # extract posterior samples of population-level effects #' samples1 <- posterior_samples(fit, "^b") #' head(samples1) #' #' # extract posterior samples of group-level standard deviations #' samples2 <- posterior_samples(fit, "^sd_") #' head(samples2) #' } #' #' @export posterior_samples.brmsfit <- function(x, pars = NA, fixed = FALSE, add_chain = FALSE, subset = NULL, as.matrix = FALSE, as.array = FALSE, ...) { if (as.matrix && as.array) { stop2("Cannot use 'as.matrix' and 'as.array' at the same time.") } if (add_chain && as.array) { stop2("Cannot use 'add_chain' and 'as.array' at the same time.") } contains_samples(x) pars <- extract_pars(pars, parnames(x), fixed = fixed, ...) # get basic information on the samples iter <- x$fit@sim$iter warmup <- x$fit@sim$warmup thin <- x$fit@sim$thin chains <- x$fit@sim$chains final_iter <- ceiling((iter - warmup) / thin) samples_taken <- seq(warmup + 1, iter, thin) samples <- NULL if (length(pars)) { if (as.matrix) { samples <- as.matrix(x$fit, pars = pars) } else if (as.array) { samples <- as.array(x$fit, pars = pars) } else { samples <- as.data.frame(x$fit, pars = pars) } if (add_chain) { # name the column 'chain' not 'chains' (#32) samples <- cbind(samples, chain = factor(rep(1:chains, each = final_iter)), iter = rep(samples_taken, chains) ) } if (!is.null(subset)) { if (as.array) { samples <- samples[subset, , , drop = FALSE] } else { samples <- samples[subset, , drop = FALSE] } } } samples } #' @rdname posterior_samples.brmsfit #' @export posterior_samples <- function(x, pars = NA, ...) { UseMethod("posterior_samples") } #' @export posterior_samples.default <- function(x, pars = NA, fixed = FALSE, ...) { x <- as.data.frame(x) if (!anyNA(pars)) { pars <- extract_pars(pars, all_pars = names(x), fixed = fixed, ...) x <- x[, pars, drop = FALSE] } if (!ncol(x)) { x <- NULL } x } #' @rdname posterior_samples.brmsfit #' @export as.data.frame.brmsfit <- function(x, row.names = NULL, optional = TRUE, ...) { out <- posterior_samples(x, ..., as.matrix = FALSE) data.frame(out, row.names = row.names, check.names = !optional) } #' @rdname posterior_samples.brmsfit #' @export as.matrix.brmsfit <- function(x, ...) { posterior_samples(x, ..., as.matrix = TRUE) } #' @rdname posterior_samples.brmsfit #' @export as.array.brmsfit <- function(x, ...) { posterior_samples(x, ..., as.array = TRUE) } #' Extract Parameter Names #' #' Extract all parameter names of a given model. #' #' @aliases parnames.brmsfit #' #' @param x An \R object #' @param ... Further arguments passed to or from other methods. #' #' @return A character vector containing the parameter names of the model. #' #' @export parnames <- function(x, ...) { UseMethod("parnames") } #' @export parnames.default <- function(x, ...) { names(x) } #' @export parnames.brmsfit <- function(x, ...) { out <- dimnames(x$fit) if (is.list(out)) { out <- out$parameters } out } # extract all valid parameter names that match pars # @param pars A character vector or regular expression # @param all_pars all parameter names of the fitted model # @param fixed should parnames be matched exactly? # @param exact_match deprecated alias of fixed # @param na_value: what should be returned if pars is NA? # @param ... Further arguments to be passed to grepl # @return A character vector of parameter names extract_pars <- function(pars, all_pars, fixed = FALSE, exact_match = FALSE, na_value = all_pars, ...) { if (!(anyNA(pars) || is.character(pars))) { stop2("Argument 'pars' must be NA or a character vector.") } fixed <- check_deprecated_fixed(fixed, exact_match) if (!anyNA(pars)) { fixed <- as_one_logical(fixed) if (fixed) { out <- intersect(pars, all_pars) } else { out <- vector("list", length(pars)) for (i in seq_along(pars)) { out[[i]] <- all_pars[grepl(pars[i], all_pars, ...)] } out <- unique(unlist(out)) } } else { out <- na_value } out } # check deprecated alias of argument 'fixed' check_deprecated_fixed <- function(fixed, exact_match) { if (!isFALSE(exact_match)) { # deprecated as of brms 2.10.6; remove in brms 3.0 warning2("Argument 'exact_match' is deprecated. ", "Please use 'fixed' instead.") fixed <- exact_match } fixed } #' Extract prior samples #' #' Extract prior samples of specified parameters #' #' @aliases prior_samples.brmsfit #' #' @param x An \code{R} object typically of class \code{brmsfit} #' @param pars Names of parameters for which prior samples should be returned, #' as given by a character vector or regular expressions. #' By default, all prior samples are extracted #' @param ... Currently ignored #' #' @details To make use of this function, the model must contain samples of #' prior distributions. This can be ensured by setting \code{sample_prior = #' TRUE} in function \code{brm}. Priors of certain parameters cannot be saved #' for technical reasons. For instance, this is the case for the #' population-level intercept, which is only computed after fitting the model #' by default. If you want to treat the intercept as part of all the other #' regression coefficients, so that sampling from its prior becomes possible, #' use \code{... ~ 0 + Intercept + ...} in the formulas. #' #' @return A data frame containing the prior samples. #' #' @examples #' \dontrun{ #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = "cumulative", #' prior = set_prior("normal(0,2)", class = "b"), #' sample_prior = TRUE) #' #' # extract all prior samples #' samples1 <- prior_samples(fit) #' head(samples1) #' #' # extract prior samples for the population-level effects of 'treat' #' samples2 <- prior_samples(fit, "b_treat") #' head(samples2) #' } #' #' @export prior_samples.brmsfit <- function(x, pars = NA, ...) { if (!anyNA(pars) && !is.character(pars)) { stop2("Argument 'pars' must be a character vector.") } par_names <- parnames(x) prior_names <- unique(par_names[grepl("^prior_", par_names)]) if (length(prior_names)) { samples <- posterior_samples(x, prior_names, fixed = TRUE) names(samples) <- sub("^prior_", "", prior_names) if (!anyNA(pars)) { .prior_samples <- function(par) { # get prior samples for parameter par matches <- paste0("^", escape_all(names(samples))) matches <- lapply(matches, regexpr, text = par) matches <- ulapply(matches, attr, which = "match.length") if (max(matches) == -1 || ignore_prior(x, par)) { out <- NULL } else { take <- match(max(matches), matches) # order samples randomly to avoid artifical dependencies # between parameters using the same prior samples samples <- list(samples[sample(nsamples(x)), take]) out <- structure(samples, names = par) } return(out) } samples <- data.frame( rmNULL(lapply(pars, .prior_samples)), check.names = FALSE ) } } else { samples <- NULL } samples } #' @rdname prior_samples.brmsfit #' @export prior_samples <- function(x, pars = NA, ...) { UseMethod("prior_samples") } #' @export prior_samples.default <- function(x, pars = NA, fixed = FALSE, ...) { if (anyNA(pars)) { pars <- "^prior_" fixed <- FALSE } else { if (fixed) { pars <- paste0("prior_", pars) } else { hat <- substr(pars, 1, 1) == "^" pars <- ifelse(hat, substr(pars, 2, nchar(pars)), pars) pars <- paste0("^prior_", pars) } } posterior_samples(x, pars = pars, fixed = fixed, ...) } # ignore priors of certain parameters from whom we cannot obtain prior samples # currently applies only to overall intercepts of centered design matrices # fixes issue #696 # @param x a brmsfit object # @param par name of the parameter # @return TRUE (if the prior should be ignored) or FALSE ignore_prior <- function(x, par) { stopifnot(is.brmsfit(x)) par <- as_one_character(par) out <- FALSE if (grepl("^b_.*Intercept($|\\[)", par)) { # cannot sample from intercepts if 'center' was TRUE intercept_priors <- subset2(x$prior, class = "Intercept") if (NROW(intercept_priors)) { # prefixes of the model intercepts p_intercepts <- usc(combine_prefix(intercept_priors)) # prefix of the parameter under question p_par <- sub("^b", "", par) p_par <- sub("_Intercept($|\\[)", "", p_par) out <- p_par %in% p_intercepts if (out) { warning2( "Sampling from the prior of an overall intercept is not ", "possible by default. See the documentation of the ", "'sample_prior' argument in help('brm')." ) } } } out } #' Extract posterior samples for use with the \pkg{coda} package #' #' @aliases as.mcmc #' #' @inheritParams posterior_samples.brmsfit #' @param ... currently unused #' @param combine_chains Indicates whether chains should be combined. #' @param inc_warmup Indicates if the warmup samples should be included. #' Default is \code{FALSE}. Warmup samples are used to tune the #' parameters of the sampling algorithm and should not be analyzed. #' #' @return If \code{combine_chains = TRUE} an \code{mcmc} object is returned. #' If \code{combine_chains = FALSE} an \code{mcmc.list} object is returned. #' #' @method as.mcmc brmsfit #' @export #' @export as.mcmc #' @importFrom coda as.mcmc as.mcmc.brmsfit <- function(x, pars = NA, fixed = FALSE, combine_chains = FALSE, inc_warmup = FALSE, ...) { contains_samples(x) pars <- extract_pars(pars, all_pars = parnames(x), fixed = fixed, ...) combine_chains <- as_one_logical(combine_chains) inc_warmup <- as_one_logical(inc_warmup) if (combine_chains) { if (inc_warmup) { stop2("Cannot include warmup samples when 'combine_chains' is TRUE.") } out <- as.matrix(x$fit, pars) ndraws <- nrow(out) end <- x$fit@sim$iter * x$fit@sim$chains thin <- x$fit@sim$thin start <- end - (ndraws - 1) * thin mcpar <- c(start, end, thin) attr(out, "mcpar") <- mcpar class(out) <- "mcmc" } else { thin <- x$fit@sim$thin if (inc_warmup && thin >= 2) { stop2("Cannot include warmup samples when 'thin' >= 2.") } ps <- rstan::extract(x$fit, pars, permuted = FALSE, inc_warmup = inc_warmup) ndraws <- dim(ps)[1] end <- x$fit@sim$iter start <- end - (ndraws - 1) * thin mcpar <- c(start, end, thin) out <- vector("list", length = dim(ps)[2]) for (i in seq_along(out)) { out[[i]] <- ps[, i, ] attr(out[[i]], "mcpar") <- mcpar class(out[[i]]) <- "mcmc" } class(out) <- "mcmc.list" } out } brms/R/brmsfit-class.R0000644000176200001440000000630213611527526014323 0ustar liggesusers#' Class \code{brmsfit} of models fitted with the \pkg{brms} package #' #' Models fitted with the \code{\link[brms:brms]{brms}} package are #' represented as a \code{brmsfit} object, which contains the posterior #' samples, model formula, Stan code, relevant data, and other information. #' #' @name brmsfit-class #' @aliases brmsfit #' @docType class #' #' @details #' See \code{methods(class = "brmsfit")} for an overview of available methods. #' #' @slot formula A \code{\link{brmsformula}} object #' @slot family (Deprecated) A \code{\link{brmsfamily}} object #' @slot data A \code{data.frame} containing all variables used in the model #' @slot data.name The name of \code{data} as specified by the user #' @slot data2 An optional \code{list} of data objects which cannot be passed #' via \code{data} #' @slot model The model code in \pkg{Stan} language #' @slot prior A \code{\link{brmsprior}} object containing #' information on the priors used in the model #' @slot autocor (Deprecated) An \code{\link{cor_brms}} object containing #' the autocorrelation structure if specified #' @slot ranef A \code{data.frame} containing the group-level structure #' @slot cov_ranef A \code{list} of customized group-level covariance matrices #' @slot stanvars A \code{\link{stanvars}} object or \code{NULL} #' @slot stan_funs A character string of length one or \code{NULL} #' @slot criteria An empty \code{list} for adding model fit criteria #' after estimation of the model. #' @slot fit An object of class \code{\link[rstan:stanfit]{stanfit}} #' among others containing the posterior samples #' @slot exclude The names of the parameters for which samples are not saved #' @slot algorithm The name of the algorithm used to fit the model #' @slot version The versions of \pkg{brms} and \pkg{rstan} with #' which the model was fitted #' @slot file Optional name of a file in which the model object was stored in #' or loaded from #' #' @seealso #' \code{\link{brms}}, #' \code{\link{brm}}, #' \code{\link{brmsformula}}, #' \code{\link{brmsfamily}} #' NULL # brmsfit class brmsfit <- function(formula = NULL, family = NULL, data = data.frame(), data.name = "", data2 = list(), model = "", prior = empty_prior(), autocor = NULL, ranef = empty_ranef(), cov_ranef = NULL, criteria = list(), stanvars = NULL, stan_funs = NULL, fit = NA, exclude = NULL, algorithm = "sampling", file = NULL) { version <- list( brms = utils::packageVersion("brms"), rstan = utils::packageVersion("rstan") ) x <- nlist( formula, family, data, data.name, data2, model, prior, autocor, ranef, cov_ranef, stanvars, stan_funs, fit, exclude, algorithm, version, file ) class(x) <- "brmsfit" x } #' Checks if argument is a \code{brmsfit} object #' #' @param x An \R object #' #' @export is.brmsfit <- function(x) { inherits(x, "brmsfit") } #' Checks if argument is a \code{brmsfit_multiple} object #' #' @param x An \R object #' #' @export is.brmsfit_multiple <- function(x) { inherits(x, "brmsfit_multiple") } brms/R/distributions.R0000644000176200001440000016307613620505134014457 0ustar liggesusers#' The Student-t Distribution #' #' Density, distribution function, quantile function and random generation #' for the Student-t distribution with location \code{mu}, scale \code{sigma}, #' and degrees of freedom \code{df}. #' #' @name StudentT #' #' @param x,q Vector of quantiles. #' @param p Vector of probabilities. #' @param n Number of samples to draw from the distribution. #' @param mu Vector of location values. #' @param sigma Vector of scale values. #' @param df Vector of degrees of freedom. #' @param log,log.p Logical; If \code{TRUE}, values are returned on the log scale. #' @param lower.tail Logical; If \code{TRUE} (default), return P(X <= x). #' Else, return P(X > x) . #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @seealso \code{\link[stats:TDist]{TDist}} #' #' @export dstudent_t <- function(x, df, mu = 0, sigma = 1, log = FALSE) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } if (log) { dt((x - mu) / sigma, df = df, log = TRUE) - log(sigma) } else { dt((x - mu) / sigma, df = df) / sigma } } #' @rdname StudentT #' @export pstudent_t <- function(q, df, mu = 0, sigma = 1, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } pt((q - mu) / sigma, df = df, lower.tail = lower.tail, log.p = log.p) } #' @rdname StudentT #' @export qstudent_t <- function(p, df, mu = 0, sigma = 1) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } mu + sigma * qt(p, df = df) } #' @rdname StudentT #' @export rstudent_t <- function(n, df, mu = 0, sigma = 1) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } mu + sigma * rt(n, df = df) } #' The Multivariate Normal Distribution #' #' Density function and random generation for the multivariate normal #' distribution with mean vector \code{mu} and covariance matrix \code{Sigma}. #' #' @name MultiNormal #' #' @inheritParams StudentT #' @param x Vector or matrix of quantiles. If \code{x} is a matrix, #' each row is taken to be a quantile. #' @param mu Mean vector with length equal to the number of dimensions. #' @param Sigma Covariance matrix. #' @param check Logical; Indicates whether several input checks #' should be performed. Defaults to \code{FALSE} to improve #' efficiency. #' #' @details See the Stan user's manual \url{http://mc-stan.org/documentation/} #' for details on the parameterization #' #' @export dmulti_normal <- function(x, mu, Sigma, log = FALSE, check = FALSE) { if (is.vector(x) || length(dim(x)) == 1L) { x <- matrix(x, ncol = length(x)) } p <- ncol(x) if (check) { if (length(mu) != p) { stop2("Dimension of mu is incorrect.") } if (!all(dim(Sigma) == c(p, p))) { stop2("Dimension of Sigma is incorrect.") } if (!is_symmetric(Sigma)) { stop2("Sigma must be a symmetric matrix.") } } chol_Sigma <- chol(Sigma) rooti <- backsolve(chol_Sigma, t(x) - mu, transpose = TRUE) quads <- colSums(rooti^2) out <- -(p / 2) * log(2 * pi) - sum(log(diag(chol_Sigma))) - .5 * quads if (!log) { out <- exp(out) } out } #' @rdname MultiNormal #' @export rmulti_normal <- function(n, mu, Sigma, check = FALSE) { p <- length(mu) if (check) { if (!(is_wholenumber(n) && n > 0)) { stop2("n must be a positive integer.") } if (!all(dim(Sigma) == c(p, p))) { stop2("Dimension of Sigma is incorrect.") } if (!is_symmetric(Sigma)) { stop2("Sigma must be a symmetric matrix.") } } samples <- matrix(rnorm(n * p), nrow = n, ncol = p) mu + samples %*% chol(Sigma) } #' The Multivariate Student-t Distribution #' #' Density function and random generation for the multivariate Student-t #' distribution with location vector \code{mu}, covariance matrix \code{Sigma}, #' and degrees of freedom \code{df}. #' #' @name MultiStudentT #' #' @inheritParams StudentT #' @param x Vector or matrix of quantiles. If \code{x} is a matrix, #' each row is taken to be a quantile. #' @param mu Location vector with length equal to the number of dimensions. #' @param Sigma Covariance matrix. #' @param check Logical; Indicates whether several input checks #' should be performed. Defaults to \code{FALSE} to improve #' efficiency. #' #' @details See the Stan user's manual \url{http://mc-stan.org/documentation/} #' for details on the parameterization #' #' @export dmulti_student_t <- function(x, df, mu, Sigma, log = FALSE, check = FALSE) { if (is.vector(x) || length(dim(x)) == 1L) { x <- matrix(x, ncol = length(x)) } p <- ncol(x) if (check) { if (isTRUE(any(df <= 0))) { stop2("df must be greater than 0.") } if (length(mu) != p) { stop2("Dimension of mu is incorrect.") } if (!all(dim(Sigma) == c(p, p))) { stop2("Dimension of Sigma is incorrect.") } if (!is_symmetric(Sigma)) { stop2("Sigma must be a symmetric matrix.") } } chol_Sigma <- chol(Sigma) rooti <- backsolve(chol_Sigma, t(x) - mu, transpose = TRUE) quads <- colSums(rooti^2) out <- lgamma((p + df)/2) - (lgamma(df / 2) + sum(log(diag(chol_Sigma))) + p / 2 * log(pi * df)) - 0.5 * (df + p) * log1p(quads / df) if (!log) { out <- exp(out) } out } #' @rdname MultiStudentT #' @export rmulti_student_t <- function(n, df, mu, Sigma, check = FALSE) { p <- length(mu) if (isTRUE(any(df <= 0))) { stop2("df must be greater than 0.") } samples <- rmulti_normal(n, mu = rep(0, p), Sigma = Sigma, check = check) samples <- samples / sqrt(rchisq(n, df = df) / df) sweep(samples, 2, mu, "+") } #' The Skew-Normal Distribution #' #' Density, distribution function, and random generation for the #' skew-normal distribution with mean \code{mu}, #' standard deviation \code{sigma}, and skewness \code{alpha}. #' #' @name SkewNormal #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param mu Vector of mean values. #' @param sigma Vector of standard deviation values. #' @param alpha Vector of skewness values. #' @param xi Optional vector of location values. #' If \code{NULL} (the default), will be computed internally. #' @param omega Optional vector of scale values. #' If \code{NULL} (the default), will be computed internally. #' @param tol Tolerance of the approximation used in the #' computation of quantiles. #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dskew_normal <- function(x, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL, log = FALSE) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } args <- cp2dp(mu, sigma, alpha, xi = xi, omega = omega, x = x) out <- with(args, { # do it like sn::dsn z <- (x - xi) / omega if (length(alpha) == 1L) { alpha <- rep(alpha, length(z)) } logN <- -log(sqrt(2 * pi)) - log(omega) - z^2 / 2 logS <- ifelse( abs(alpha) < Inf, pnorm(alpha * z, log.p = TRUE), log(as.numeric(sign(alpha) * z > 0)) ) out <- logN + logS - pnorm(0, log.p = TRUE) ifelse(abs(z) == Inf, -Inf, out) }) if (!log) { out <- exp(out) } out } #' @rdname SkewNormal #' @export pskew_normal <- function(q, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL, lower.tail = TRUE, log.p = FALSE) { require_package("mnormt") if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } args <- cp2dp(mu, sigma, alpha, xi = xi, omega = omega, q = q) out <- with(args, { # do it like sn::psn z <- (q - xi) / omega nz <- length(z) is_alpha_inf <- abs(alpha) == Inf delta[is_alpha_inf] <- sign(alpha[is_alpha_inf]) out <- numeric(nz) for (k in seq_len(nz)) { if (is_alpha_inf[k]) { if (alpha[k] > 0) { out[k] <- 2 * (pnorm(pmax(z[k], 0)) - 0.5) } else { out[k] <- 1 - 2 * (0.5 - pnorm(pmin(z[k], 0))) } } else { S <- matrix(c(1, -delta[k], -delta[k], 1), 2, 2) out[k] <- 2 * mnormt::biv.nt.prob( 0, lower = rep(-Inf, 2), upper = c(z[k], 0), mean = c(0, 0), S = S ) } } pmin(1, pmax(0, out)) }) if (!lower.tail) { out <- 1 - out } if (log.p) { out <- log(out) } out } #' @rdname SkewNormal #' @export qskew_normal <- function(p, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL, lower.tail = TRUE, log.p = FALSE, tol = 1e-8) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } if (log.p) { p <- exp(p) } if (!lower.tail) { p <- 1 - p } args <- cp2dp(mu, sigma, alpha, xi = xi, omega = omega, p = p) out <- with(args, { # do it like sn::qsn na <- is.na(p) | (p < 0) | (p > 1) zero <- (p == 0) one <- (p == 1) p <- replace(p, (na | zero | one), 0.5) cum <- skew_normal_cumulants(0, 1, alpha, n = 4) g1 <- cum[, 3] / cum[, 2]^(3 / 2) g2 <- cum[, 4] / cum[, 2]^2 x <- qnorm(p) x <- x + (x^2 - 1) * g1 / 6 + x * (x^2 - 3) * g2 / 24 - x * (2 * x^2 - 5) * g1^2 / 36 x <- cum[, 1] + sqrt(cum[, 2]) * x px <- pskew_normal(x, xi = 0, omega = 1, alpha = alpha) max_err <- 1 while (max_err > tol) { x1 <- x - (px - p) / dskew_normal(x, xi = 0, omega = 1, alpha = alpha) x <- x1 px <- pskew_normal(x, xi = 0, omega = 1, alpha = alpha) max_err <- max(abs(px - p)) if (is.na(max_err)) { warning2("Approximation in 'qskew_normal' might have failed.") } } x <- replace(x, na, NA) x <- replace(x, zero, -Inf) x <- replace(x, one, Inf) as.numeric(xi + omega * x) }) out } #' @rdname SkewNormal #' @export rskew_normal <- function(n, mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } args <- cp2dp(mu, sigma, alpha, xi = xi, omega = omega) with(args, { # do it like sn::rsn z1 <- rnorm(n) z2 <- rnorm(n) id <- z2 > args$alpha * z1 z1[id] <- -z1[id] xi + omega * z1 }) } # convert skew-normal mixed-CP to DP parameterization # @return a data.frame containing all relevant parameters cp2dp <- function(mu = 0, sigma = 1, alpha = 0, xi = NULL, omega = NULL, ...) { delta <- alpha / sqrt(1 + alpha^2) if (is.null(omega)) { omega <- sigma / sqrt(1 - 2 / pi * delta^2) } if (is.null(xi)) { xi <- mu - omega * delta * sqrt(2 / pi) } expand(dots = nlist(mu, sigma, alpha, xi, omega, delta, ...)) } # helper function for qskew_normal # code basis taken from sn::sn.cumulants # uses xi and omega rather than mu and sigma skew_normal_cumulants <- function(xi = 0, omega = 1, alpha = 0, n = 4) { cumulants_half_norm <- function(n) { n <- max(n, 2) n <- as.integer(2 * ceiling(n/2)) half.n <- as.integer(n/2) m <- 0:(half.n - 1) a <- sqrt(2/pi)/(gamma(m + 1) * 2^m * (2 * m + 1)) signs <- rep(c(1, -1), half.n)[seq_len(half.n)] a <- as.vector(rbind(signs * a, rep(0, half.n))) coeff <- rep(a[1], n) for (k in 2:n) { ind <- seq_len(k - 1) coeff[k] <- a[k] - sum(ind * coeff[ind] * a[rev(ind)]/k) } kappa <- coeff * gamma(seq_len(n) + 1) kappa[2] <- 1 + kappa[2] return(kappa) } args <- expand(dots = nlist(xi, omega, alpha)) with(args, { # do it like sn::sn.cumulants delta <- alpha / sqrt(1 + alpha^2) kv <- cumulants_half_norm(n) if (length(kv) > n) { kv <- kv[-(n + 1)] } kv[2] <- kv[2] - 1 kappa <- outer(delta, 1:n, "^") * matrix(rep(kv, length(xi)), ncol = n, byrow = TRUE) kappa[, 2] <- kappa[, 2] + 1 kappa <- kappa * outer(omega, 1:n, "^") kappa[, 1] <- kappa[, 1] + xi kappa }) } # CDF of the inverse gamma function pinvgamma <- function(q, shape, rate, lower.tail = TRUE, log.p = FALSE) { pgamma(1/q, shape, rate = rate, lower.tail = !lower.tail, log.p = log.p) } #' The von Mises Distribution #' #' Density, distribution function, and random generation for the #' von Mises distribution with location \code{mu}, and precision \code{kappa}. #' #' @name VonMises #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param kappa Vector of precision values. #' @param acc Accuracy of numerical approximations. #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dvon_mises <- function(x, mu, kappa, log = FALSE) { if (isTRUE(any(kappa < 0))) { stop2("kappa must be non-negative") } # expects x in [-pi, pi] rather than [0, 2*pi] as CircStats::dvm be <- besselI(kappa, nu = 0, expon.scaled = TRUE) out <- -log(2 * pi * be) + kappa * (cos(x - mu) - 1) if (!log) { out <- exp(out) } out } #' @rdname VonMises #' @export pvon_mises <- function(q, mu, kappa, lower.tail = TRUE, log.p = FALSE, acc = 1e-20) { if (isTRUE(any(kappa < 0))) { stop2("kappa must be non-negative") } pi <- base::pi pi2 <- 2 * pi q <- (q + pi) %% pi2 mu <- (mu + pi) %% pi2 args <- expand(q = q, mu = mu, kappa = kappa) q <- args$q mu <- args$mu kappa <- args$kappa rm(args) # code basis taken from CircStats::pvm but improved # considerably with respect to speed and stability rec_sum <- function(q, kappa, acc, sum = 0, i = 1) { # compute the sum of of besselI functions recursively term <- (besselI(kappa, nu = i) * sin(i * q)) / i sum <- sum + term rd <- abs(term) >= acc if (sum(rd)) { sum[rd] <- rec_sum( q[rd], kappa[rd], acc, sum = sum[rd], i = i + 1 ) } sum } .pvon_mises <- function(q, kappa, acc) { sum <- rec_sum(q, kappa, acc) q / pi2 + sum / (pi * besselI(kappa, nu = 0)) } out <- rep(NA, length(mu)) zero_mu <- mu == 0 if (sum(zero_mu)) { out[zero_mu] <- .pvon_mises(q[zero_mu], kappa[zero_mu], acc) } lq_mu <- q <= mu if (sum(lq_mu)) { upper <- (q[lq_mu] - mu[lq_mu]) %% pi2 upper[upper == 0] <- pi2 lower <- (-mu[lq_mu]) %% pi2 out[lq_mu] <- .pvon_mises(upper, kappa[lq_mu], acc) - .pvon_mises(lower, kappa[lq_mu], acc) } uq_mu <- q > mu if (sum(uq_mu)) { upper <- q[uq_mu] - mu[uq_mu] lower <- mu[uq_mu] %% pi2 out[uq_mu] <- .pvon_mises(upper, kappa[uq_mu], acc) + .pvon_mises(lower, kappa[uq_mu], acc) } if (!lower.tail) { out <- 1 - out } if (log.p) { out <- log(out) } out } #' @rdname VonMises #' @export rvon_mises <- function(n, mu, kappa) { if (isTRUE(any(kappa < 0))) { stop2("kappa must be non-negative") } args <- expand(mu = mu, kappa = kappa, length = n) mu <- args$mu kappa <- args$kappa rm(args) pi <- base::pi mu <- mu + pi # code basis taken from CircStats::rvm but improved # considerably with respect to speed and stability rvon_mises_outer <- function(r, mu, kappa) { n <- length(r) U1 <- runif(n, 0, 1) z <- cos(pi * U1) f <- (1 + r * z) / (r + z) c <- kappa * (r - f) U2 <- runif(n, 0, 1) outer <- is.na(f) | is.infinite(f) | !(c * (2 - c) - U2 > 0 | log(c / U2) + 1 - c >= 0) inner <- !outer out <- rep(NA, n) if (sum(inner)) { out[inner] <- rvon_mises_inner(f[inner], mu[inner]) } if (sum(outer)) { # evaluate recursively until a valid sample is found out[outer] <- rvon_mises_outer(r[outer], mu[outer], kappa[outer]) } out } rvon_mises_inner <- function(f, mu) { n <- length(f) U3 <- runif(n, 0, 1) (sign(U3 - 0.5) * acos(f) + mu) %% (2 * pi) } a <- 1 + (1 + 4 * (kappa^2))^0.5 b <- (a - (2 * a)^0.5) / (2 * kappa) r <- (1 + b^2) / (2 * b) # indicates underflow due to kappa being close to zero is_uf <- is.na(r) | is.infinite(r) not_uf <- !is_uf out <- rep(NA, n) if (sum(is_uf)) { out[is_uf] <- runif(sum(is_uf), 0, 2 * pi) } if (sum(not_uf)) { out[not_uf] <- rvon_mises_outer(r[not_uf], mu[not_uf], kappa[not_uf]) } out - pi } #' The Exponentially Modified Gaussian Distribution #' #' Density, distribution function, and random generation #' for the exponentially modified Gaussian distribution with #' mean \code{mu} and standard deviation \code{sigma} of the gaussian #' component, as well as scale \code{beta} of the exponential #' component. #' #' @name ExGaussian #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param mu Vector of means of the combined distribution. #' @param sigma Vector of standard deviations of the gaussian component. #' @param beta Vector of scales of the exponential component. #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dexgaussian <- function(x, mu, sigma, beta, log = FALSE) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } if (isTRUE(any(beta <= 0))) { stop2("beta must be greater than 0.") } args <- nlist(x, mu, sigma, beta) args <- do_call(expand, args) args$mu <- with(args, mu - beta) args$z <- with(args, x - mu - sigma^2 / beta) out <- with(args, -log(beta) - (z + sigma^2 / (2 * beta)) / beta + pnorm(z / sigma, log.p = TRUE) ) if (!log) { out <- exp(out) } out } #' @rdname ExGaussian #' @export pexgaussian <- function(q, mu, sigma, beta, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } if (isTRUE(any(beta <= 0))) { stop2("beta must be greater than 0.") } args <- nlist(q, mu, sigma, beta) args <- do_call(expand, args) args$mu <- with(args, mu - beta) args$z <- with(args, q - mu - sigma^2 / beta) out <- with(args, pnorm((q - mu) / sigma) - pnorm(z / sigma) * exp(((mu + sigma^2 / beta)^2 - mu^2 - 2 * q * sigma^2 / beta) / (2 * sigma^2)) ) if (!lower.tail) { out <- 1 - out } if (log.p) { out <- log(out) } out } #' @rdname ExGaussian #' @export rexgaussian <- function(n, mu, sigma, beta) { if (isTRUE(any(sigma <= 0))) { stop2("sigma must be greater than 0.") } if (isTRUE(any(beta <= 0))) { stop2("beta must be greater than 0.") } mu <- mu - beta rnorm(n, mean = mu, sd = sigma) + rexp(n, rate = 1 / beta) } #' The Frechet Distribution #' #' Density, distribution function, quantile function and random generation #' for the Frechet distribution with location \code{loc}, scale \code{scale}, #' and shape \code{shape}. #' #' @name Frechet #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param loc Vector of locations. #' @param scale Vector of scales. #' @param shape Vector of shapes. #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dfrechet <- function(x, loc = 0, scale = 1, shape = 1, log = FALSE) { if (isTRUE(any(scale <= 0))) { stop2("Argument 'scale' must be positive.") } if (isTRUE(any(shape <= 0))) { stop2("Argument 'shape' must be positive.") } x <- (x - loc) / scale args <- nlist(x, loc, scale, shape) args <- do_call(expand, args) out <- with(args, log(shape / scale) - (1 + shape) * log(x) - x^(-shape) ) if (!log) { out <- exp(out) } out } #' @rdname Frechet #' @export pfrechet <- function(q, loc = 0, scale = 1, shape = 1, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(scale <= 0))) { stop2("Argument 'scale' must be positive.") } if (isTRUE(any(shape <= 0))) { stop2("Argument 'shape' must be positive.") } q <- pmax((q - loc) / scale, 0) out <- exp(-q^(-shape)) if (!lower.tail) { out <- 1 - out } if (log.p) { out <- log(out) } out } #' @rdname Frechet #' @export qfrechet <- function(p, loc = 0, scale = 1, shape = 1, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(p <= 0)) || isTRUE(any(p >= 1))) { stop("'p' must contain probabilities in (0,1)") } if (isTRUE(any(scale <= 0))) { stop2("Argument 'scale' must be positive.") } if (isTRUE(any(shape <= 0))) { stop2("Argument 'shape' must be positive.") } if (log.p) { p <- exp(p) } if (!lower.tail) { p <- 1 - p } loc + scale * (-log(p))^(-1/shape) } #' @rdname Frechet #' @export rfrechet <- function(n, loc = 0, scale = 1, shape = 1) { if (isTRUE(any(scale <= 0))) { stop2("Argument 'scale' must be positive.") } if (isTRUE(any(shape <= 0))) { stop2("Argument 'shape' must be positive.") } loc + scale * rexp(n)^(-1 / shape) } #' The Shifted Log Normal Distribution #' #' Density, distribution function, quantile function and random generation #' for the shifted log normal distribution with mean \code{meanlog}, #' standard deviation \code{sdlog}, and shift parameter \code{shift}. #' #' @name Shifted_Lognormal #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param meanlog Vector of means. #' @param sdlog Vector of standard deviations. #' @param shift Vector of shifts. #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dshifted_lnorm <- function(x, meanlog = 0, sdlog = 1, shift = 0, log = FALSE) { args <- nlist(dist = "lnorm", x, shift, meanlog, sdlog, log) do_call(dshifted, args) } #' @rdname Shifted_Lognormal #' @export pshifted_lnorm <- function(q, meanlog = 0, sdlog = 1, shift = 0, lower.tail = TRUE, log.p = FALSE) { args <- nlist(dist = "lnorm", q, shift, meanlog, sdlog, lower.tail, log.p) do_call(pshifted, args) } #' @rdname Shifted_Lognormal #' @export qshifted_lnorm <- function(p, meanlog = 0, sdlog = 1, shift = 0, lower.tail = TRUE, log.p = FALSE) { args <- nlist(dist = "lnorm", p, shift, meanlog, sdlog, lower.tail, log.p) do_call(qshifted, args) } #' @rdname Shifted_Lognormal #' @export rshifted_lnorm <- function(n, meanlog = 0, sdlog = 1, shift = 0) { args <- nlist(dist = "lnorm", n, shift, meanlog, sdlog) do_call(rshifted, args) } #' The Inverse Gaussian Distribution #' #' Density, distribution function, and random generation #' for the inverse Gaussian distribution with location \code{mu}, #' and shape \code{shape}. #' #' @name InvGaussian #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param mu Vector of locations. #' @param shape Vector of shapes. #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dinv_gaussian <- function(x, mu = 1, shape = 1, log = FALSE) { if (isTRUE(any(mu <= 0))) { stop2("Argument 'mu' must be positive.") } if (isTRUE(any(shape <= 0))) { stop2("Argument 'shape' must be positive.") } args <- nlist(x, mu, shape) args <- do_call(expand, args) out <- with(args, 0.5 * log(shape / (2 * pi)) - 1.5 * log(x) - 0.5 * shape * (x - mu)^2 / (x * mu^2) ) if (!log) { out <- exp(out) } out } #' @rdname InvGaussian #' @export pinv_gaussian <- function(q, mu = 1, shape = 1, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(mu <= 0))) { stop2("Argument 'mu' must be positive.") } if (isTRUE(any(shape <= 0))) { stop2("Argument 'shape' must be positive.") } args <- nlist(q, mu, shape) args <- do_call(expand, args) out <- with(args, pnorm(sqrt(shape / q) * (q / mu - 1)) + exp(2 * shape / mu) * pnorm(-sqrt(shape / q) * (q / mu + 1)) ) if (!lower.tail) { out <- 1 - out } if (log.p) { out <- log(out) } out } #' @rdname InvGaussian #' @export rinv_gaussian <- function(n, mu = 1, shape = 1) { # create random numbers for the inverse gaussian distribution # Args: # Args: see dinv_gaussian if (isTRUE(any(mu <= 0))) { stop2("Argument 'mu' must be positive.") } if (isTRUE(any(shape <= 0))) { stop2("Argument 'shape' must be positive.") } args <- nlist(mu, shape, length = n) args <- do_call(expand, args) # algorithm from wikipedia args$y <- rnorm(n)^2 args$x <- with(args, mu + (mu^2 * y) / (2 * shape) - mu / (2 * shape) * sqrt(4 * mu * shape * y + mu^2 * y^2) ) args$z <- runif(n) with(args, ifelse(z <= mu / (mu + x), x, mu^2 / x)) } #' The Generalized Extreme Value Distribution #' #' Density, distribution function, and random generation #' for the generalized extreme value distribution with #' location \code{mu}, scale \code{sigma} and shape \code{xi}. #' #' @name GenExtremeValue #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param mu Vector of locations. #' @param sigma Vector of scales. #' @param xi Vector of shapes. #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dgen_extreme_value <- function(x, mu = 0, sigma = 1, xi = 0, log = FALSE) { if (isTRUE(any(sigma <= 0))) { stop2("sigma bust be greater than 0.") } x <- (x - mu) / sigma args <- nlist(x, mu, sigma, xi) args <- do_call(expand, args) args$t <- with(args, 1 + xi * x) out <- with(args, ifelse( xi == 0, -log(sigma) - x - exp(-x), -log(sigma) - (1 + 1 / xi) * log(t) - t^(-1 / xi) )) if (!log) { out <- exp(out) } out } #' @rdname GenExtremeValue #' @export pgen_extreme_value <- function(q, mu = 0, sigma = 1, xi = 0, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(sigma <= 0))) { stop2("sigma bust be greater than 0.") } q <- (q - mu) / sigma args <- nlist(q, mu, sigma, xi) args <- do_call(expand, args) out <- with(args, ifelse( xi == 0, exp(-exp(-q)), exp(-(1 + xi * q)^(-1 / xi)) )) if (!lower.tail) { out <- 1 - out } if (log.p) { out <- log(out) } out } #' @rdname GenExtremeValue #' @export rgen_extreme_value <- function(n, mu = 0, sigma = 1, xi = 0) { if (isTRUE(any(sigma <= 0))) { stop2("sigma bust be greater than 0.") } args <- nlist(mu, sigma, xi, length = n) args <- do_call(expand, args) with(args, ifelse( xi == 0, mu - sigma * log(rexp(n)), mu + sigma * (rexp(n)^(-xi) - 1) / xi )) } #' The Asymmetric Laplace Distribution #' #' Density, distribution function, quantile function and random generation #' for the asymmetric Laplace distribution with location \code{mu}, #' scale \code{sigma} and asymmetry parameter \code{quantile}. #' #' @name AsymLaplace #' #' @inheritParams StudentT #' @param x,q Vector of quantiles. #' @param mu Vector of locations. #' @param sigma Vector of scales. #' @param quantile Asymmetry parameter corresponding to quantiles #' in quantile regression (hence the name). #' #' @details See \code{vignette("brms_families")} for details #' on the parameterization. #' #' @export dasym_laplace <- function(x, mu = 0, sigma = 1, quantile = 0.5, log = FALSE) { out <- ifelse(x < mu, yes = (quantile * (1 - quantile) / sigma) * exp((1 - quantile) * (x - mu) / sigma), no = (quantile * (1 - quantile) / sigma) * exp(-quantile * (x - mu) / sigma) ) if (log) { out <- log(out) } out } #' @rdname AsymLaplace #' @export pasym_laplace <- function(q, mu = 0, sigma = 1, quantile = 0.5, lower.tail = TRUE, log.p = FALSE) { out <- ifelse(q < mu, yes = quantile * exp((1 - quantile) * (q - mu) / sigma), no = 1 - (1 - quantile) * exp(-quantile * (q - mu) / sigma) ) if (!lower.tail) { out <- 1 - out } if (log.p) { out <- log(out) } out } #' @rdname AsymLaplace #' @export qasym_laplace <- function(p, mu = 0, sigma = 1, quantile = 0.5, lower.tail = TRUE, log.p = FALSE) { if (log.p) { p <- exp(p) } if (!lower.tail) { p <- 1 - p } if (length(quantile) == 1L) { quantile <- rep(quantile, length(mu)) } ifelse(p < quantile, yes = mu + ((sigma * log(p / quantile)) / (1 - quantile)), no = mu - ((sigma * log((1 - p) / (1 - quantile))) / quantile) ) } #' @rdname AsymLaplace #' @export rasym_laplace <- function(n, mu = 0, sigma = 1, quantile = 0.5) { u <- runif(n) qasym_laplace(u, mu = mu, sigma = sigma, quantile = quantile) } # The Discrete Weibull Distribution # # Density, distribution function, quantile function and random generation # for the discrete Weibull distribution with location \code{mu} and # shape \code{shape}. # # @name DiscreteWeibull # # @inheritParams StudentT # @param mu Location parameter in the unit interval. # @param shape Positive shape parameter. # # @details See \code{vignette("brms_families")} for details # on the parameterization. # # @export ddiscrete_weibull <- function(x, mu, shape, log = FALSE) { if (isTRUE(any(mu < 0 | mu > 1))) { stop2("mu bust be between 0 and 1.") } if (isTRUE(any(shape <= 0))) { stop2("shape bust be greater than 0.") } x <- round(x) out <- mu^x^shape - mu^(x + 1)^shape out[x < 0] <- 0 if (log) { out <- log(out) } out } # @rdname DiscreteWeibull # @export pdiscrete_weibull <- function(x, mu, shape, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(mu < 0 | mu > 1))) { stop2("mu bust be between 0 and 1.") } if (isTRUE(any(shape <= 0))) { stop2("shape bust be greater than 0.") } x <- round(x) if (lower.tail) { out <- 1 - mu^(x + 1)^shape out[x < 0] <- 0 } else { out <- mu^(x + 1)^shape out[x < 0] <- 1 } if (log.p) { out <- log(out) } out } # @rdname DiscreteWeibull # @export qdiscrete_weibull <- function(p, mu, shape, lower.tail = TRUE, log.p = FALSE) { if (isTRUE(any(mu < 0 | mu > 1))) { stop2("mu bust be between 0 and 1.") } if (isTRUE(any(shape <= 0))) { stop2("shape bust be greater than 0.") } if (log.p) { p <- exp(p) } if (!lower.tail) { p <- 1 - p } ceiling((log(1 - p) / log(mu))^(1 / shape) - 1) } # @rdname DiscreteWeibull # @export rdiscrete_weibull <- function(n, mu, shape) { u <- runif(n, 0, 1) qdiscrete_weibull(u, mu, shape) } # mean of the discrete weibull distribution # @param mu location parameter # @param shape shape parameter # @param M maximal evaluated element of the series # @param thres threshold for new elements at which to stop evaluation mean_discrete_weibull <- function(mu, shape, M = 1000, thres = 0.001) { opt_M <- ceiling(max((log(thres) / log(mu))^(1 / shape))) if (opt_M <= M) { M <- opt_M } else { # avoid the loop below running too slow warning2( "Approximating the mean of the 'discrete_weibull' ", "distribution failed and results be inaccurate." ) } out <- 0 for (y in seq_len(M)) { out <- out + mu^y^shape } # approximation of the residual series (see Englehart & Li, 2011) # returns unreasonably large values presumably due to numerical issues out } # PDF of the COM-Poisson distribution # com_poisson in brms uses the mode parameterization dcom_poisson <- function(x, mu, shape, log = FALSE) { x <- round(x) log_mu <- log(mu) log_Z <- log_Z_com_poisson(log_mu, shape) out <- shape * (x * log_mu - lgamma(x + 1)) - log_Z if (!log) { out <- exp(out) } out } # random numbers from the COM-Poisson distribution rcom_poisson <- function(n, mu, shape, M = 10000) { n <- check_n_rdist(n, mu, shape) M <- as.integer(as_one_numeric(M)) log_mu <- log(mu) # approximating log_Z may yield too large random draws log_Z <- log_Z_com_poisson(log_mu, shape, approx = FALSE) u <- runif(n, 0, 1) cdf <- exp(-log_Z) lfac <- 0 y <- 0 out <- rep(0, n) not_found <- cdf < u while (any(not_found) && y <= M) { y <- y + 1 out[not_found] <- y lfac <- lfac + log(y) cdf <- cdf + exp(shape * (y * log_mu - lfac) - log_Z) not_found <- cdf < u } if (any(not_found)) { out[not_found] <- NA nfailed <- sum(not_found) warning2( "Drawing random numbers from the 'com_poisson' ", "distribution failed in ", nfailed, " cases." ) } out } # CDF of the COM-Poisson distribution pcom_poisson <- function(x, mu, shape, lower.tail = TRUE, log.p = FALSE) { x <- round(x) args <- expand(x = x, mu = mu, shape = shape) x <- args$x mu <- args$mu shape <- args$shape log_mu <- log(mu) log_Z <- log_Z_com_poisson(log_mu, shape) out <- rep(0, length(x)) dim(out) <- attributes(args)$max_dim out[x > 0] <- log1p_exp(shape * log_mu) k <- 2 lfac <- 0 while (any(x >= k)) { lfac <- lfac + log(k) term <- shape * (k * log_mu - lfac) out[x >= k] <- log_sum_exp(out[x >= k], term) k <- k + 1 } out <- out - log_Z out[out > 0] <- 0 if (!lower.tail) { out <- log1m_exp(out) } if (!log.p) { out <- exp(out) } out } # log normalizing constant of the COM Poisson distribution # @param log_mu log location parameter # @param shape shape parameter # @param M maximal evaluated element of the series # @param thres threshold for new elements at which to stop evaluation # @param approx use a closed form approximation of the mean if appropriate? log_Z_com_poisson <- function(log_mu, shape, M = 10000, thres = 1e-16, approx = TRUE) { if (isTRUE(any(shape <= 0))) { stop2("'shape' must be positive.") } if (isTRUE(any(shape == Inf))) { stop2("'shape' must be finite.") } approx <- as_one_logical(approx) args <- expand(log_mu = log_mu, shape = shape) log_mu <- args$log_mu shape <- args$shape out <- rep(NA, length(log_mu)) dim(out) <- attributes(args)$max_dim use_poisson <- shape == 1 if (any(use_poisson)) { # shape == 1 implies the poisson distribution out[use_poisson] <- exp(log_mu[use_poisson]) } if (approx) { # use a closed form approximation if appropriate use_approx <- log_mu * shape >= log(1.5) & log_mu >= log(1.5) if (any(use_approx)) { out[use_approx] <- log_Z_com_poisson_approx( log_mu[use_approx], shape[use_approx] ) } } use_exact <- is.na(out) if (any(use_exact)) { # direct computation of the truncated series M <- as.integer(as_one_numeric(M)) thres <- as_one_numeric(thres) log_thres <- log(thres) log_mu <- log_mu[use_exact] shape <- shape[use_exact] # first 2 terms of the series out_exact <- log1p_exp(shape * log_mu) lfac <- 0 k <- 2 converged <- FALSE while (!converged && k <= M) { lfac <- lfac + log(k) term <- shape * (k * log_mu - lfac) out_exact <- log_sum_exp(out_exact, term) converged <- all(term <= log_thres) k <- k + 1 } out[use_exact] <- out_exact if (!converged) { warning2( "Approximating the normalizing constant of the 'com_poisson' ", "distribution failed and results may be inaccurate." ) } } out } # approximate the log normalizing constant of the COM Poisson distribution # based on doi:10.1007/s10463-017-0629-6 log_Z_com_poisson_approx <- function(log_mu, shape) { shape_mu <- shape * exp(log_mu) shape2 <- shape^2 # first 4 terms of the residual series log_sum_resid <- log( 1 + shape_mu^(-1) * (shape2 - 1) / 24 + shape_mu^(-2) * (shape2 - 1) / 1152 * (shape2 + 23) + shape_mu^(-3) * (shape2 - 1) / 414720 * (5 * shape2^2 - 298 * shape2 + 11237) ) shape_mu + log_sum_resid - ((log(2 * pi) + log_mu) * (shape - 1) / 2 + log(shape) / 2) } # compute the log mean of the COM Poisson distribution # @param mu location parameter # @param shape shape parameter # @param M maximal evaluated element of the series # @param thres threshold for new elements at which to stop evaluation # @param approx use a closed form approximation of the mean if appropriate? mean_com_poisson <- function(mu, shape, M = 10000, thres = 1e-16, approx = TRUE) { if (isTRUE(any(shape <= 0))) { stop2("'shape' must be positive.") } if (isTRUE(any(shape == Inf))) { stop2("'shape' must be finite.") } approx <- as_one_logical(approx) args <- expand(mu = mu, shape = shape) mu <- args$mu shape <- args$shape out <- rep(NA, length(mu)) dim(out) <- attributes(args)$max_dim use_poisson <- shape == 1 if (any(use_poisson)) { # shape == 1 implies the poisson distribution out[use_poisson] <- mu[use_poisson] } if (approx) { # use a closed form approximation if appropriate use_approx <- mu^shape >= 1.5 & mu >= 1.5 if (any(use_approx)) { out[use_approx] <- mean_com_poisson_approx( mu[use_approx], shape[use_approx] ) } } use_exact <- is.na(out) if (any(use_exact)) { # direct computation of the truncated series M <- as.integer(as_one_numeric(M)) thres <- as_one_numeric(thres) log_thres <- log(thres) mu <- mu[use_exact] shape <- shape[use_exact] log_mu <- log(mu) # first 2 terms of the series log_num <- shape * log_mu # numerator log_Z <- log1p_exp(shape * log_mu) # denominator lfac <- 0 k <- 2 converged <- FALSE while (!converged && k <= M) { log_k <- log(k) lfac <- lfac + log_k term <- shape * (k * log_mu - lfac) log_num <- log_sum_exp(log_num, log_k + term) log_Z <- log_sum_exp(log_Z, term) converged <- all(term <= log_thres) k <- k + 1 } if (!converged) { warning2( "Approximating the mean of the 'com_poisson' ", "distribution failed and results be inaccurate." ) } out[use_exact] <- exp(log_num - log_Z) } out } # approximate the mean of COM-Poisson distribution # based on doi:10.1007/s10463-017-0629-6 mean_com_poisson_approx <- function(mu, shape) { term <- 1 - (shape - 1) / (2 * shape) * mu^(-1) - (shape^2 - 1) / (24 * shape^2) * mu^(-2) - (shape^2 - 1) / (24 * shape^3) * mu^(-3) mu * term } #' The Dirichlet Distribution #' #' Density function and random number generation for the dirichlet #' distribution with shape parameter vector \code{alpha}. #' #' @name Dirichlet #' #' @inheritParams StudentT #' @param x Matrix of quantiles. Each row corresponds to one probability vector. #' @param alpha Matrix of positive shape parameters. Each row corresponds to one #' probability vector. #' #' @details See \code{vignette("brms_families")} for details on the #' parameterization. #' #' @export ddirichlet <- function(x, alpha, log = FALSE) { log <- as_one_logical(log) if (!is.matrix(x)) { x <- matrix(x, nrow = 1) } if (!is.matrix(alpha)) { alpha <- matrix(alpha, nrow(x), length(alpha), byrow = TRUE) } if (nrow(x) == 1L && nrow(alpha) > 1L) { x <- repl(x, nrow(alpha)) x <- do_call(rbind, x) } else if (nrow(x) > 1L && nrow(alpha) == 1L) { alpha <- repl(alpha, nrow(x)) alpha <- do_call(rbind, alpha) } if (isTRUE(any(x < 0))) { stop2("x must be non-negative.") } if (!is_equal(rowSums(x), rep(1, nrow(x)))) { stop2("x must sum to 1 per row.") } if (isTRUE(any(alpha <= 0))) { stop2("alpha must be positive.") } out <- lgamma(rowSums(alpha)) - rowSums(lgamma(alpha)) + rowSums((alpha - 1) * log(x)) if (!log) { out <- exp(out) } return(out) } #' @rdname Dirichlet #' @export rdirichlet <- function(n, alpha) { n <- as_one_numeric(n) if (!is.matrix(alpha)) { alpha <- matrix(alpha, nrow = 1) } if (prod(dim(alpha)) == 0) { stop2("alpha should be non-empty.") } if (isTRUE(any(alpha <= 0))) { stop2("alpha must be positive.") } if (n == 1) { n <- nrow(alpha) } if (n > nrow(alpha)) { alpha <- matrix(alpha, nrow = n, ncol = ncol(alpha), byrow = TRUE) } x <- matrix(rgamma(ncol(alpha) * n, alpha), ncol = ncol(alpha)) x / rowSums(x) } #' The Wiener Diffusion Model Distribution #' #' Density function and random generation for the Wiener #' diffusion model distribution with boundary separation \code{alpha}, #' non-decision time \code{tau}, bias \code{beta} and #' drift rate \code{delta}. #' #' @name Wiener #' #' @inheritParams StudentT #' @param alpha Boundary separation parameter. #' @param tau Non-decision time parameter. #' @param beta Bias parameter. #' @param delta Drift rate parameter. #' @param resp Response: \code{"upper"} or \code{"lower"}. #' If no character vector, it is coerced to logical #' where \code{TRUE} indicates \code{"upper"} and #' \code{FALSE} indicates \code{"lower"}. #' @param types Which types of responses to return? By default, #' return both the response times \code{"q"} and the dichotomous #' responses \code{"resp"}. If either \code{"q"} or \code{"resp"}, #' return only one of the two types. #' #' @details These are wrappers around functions of the \pkg{RWiener} package. #' See \code{vignette("brms_families")} for details on the parameterization. #' #' @seealso \code{\link[RWiener:wienerdist]{wienerdist}} #' #' @export dwiener <- function(x, alpha, tau, beta, delta, resp = 1, log = FALSE) { require_package("RWiener") alpha <- as.numeric(alpha) tau <- as.numeric(tau) beta <- as.numeric(beta) delta <- as.numeric(delta) if (!is.character(resp)) { resp <- ifelse(resp, "upper", "lower") } # vectorized version of RWiener::dwiener .dwiener <- Vectorize( RWiener::dwiener, c("alpha", "tau", "beta", "delta") ) args <- nlist(q = x, alpha, tau, beta, delta, resp, give_log = log) do_call(.dwiener, args) } #' @rdname Wiener #' @export rwiener <- function(n, alpha, tau, beta, delta, types = c("q", "resp")) { require_package("RWiener") stopifnot(all(types %in% c("q", "resp"))) alpha <- as.numeric(alpha) tau <- as.numeric(tau) beta <- as.numeric(beta) delta <- as.numeric(delta) max_len <- max(lengths(list(alpha, tau, beta, delta))) n <- n[1] if (max_len > 1L) { if (!n %in% c(1, max_len)) { stop2("Can only sample exactly once for each condition.") } n <- 1 } .rwiener <- function(...) { # vectorized version of RWiener::rwiener # returns a numeric vector fun <- Vectorize( rwiener_num, c("alpha", "tau", "beta", "delta"), SIMPLIFY = FALSE ) do_call(rbind, fun(...)) } args <- nlist(n, alpha, tau, beta, delta, types) do_call(.rwiener, args) } # helper function to return a numeric vector instead # of a data.frame with two columns as for RWiener::rwiener rwiener_num <- function(n, alpha, tau, beta, delta, types) { out <- RWiener::rwiener(n, alpha, tau, beta, delta) out[["resp"]] <- ifelse(out[["resp"]] == "upper", 1, 0) if (length(types) == 1L) { out <- out[[types]] } out } # density of the cox proportional hazards model # @param x currently ignored as the information is passed # via 'bhaz' and 'cbhaz'. Before exporting the cox distribution # functions, this needs to be refactored so that x is actually used # @param mu positive location parameter # @param bhaz baseline hazard # @param cbhaz cumulative baseline hazard dcox <- function(x, mu, bhaz, cbhaz, log = FALSE) { out <- hcox(x, mu, bhaz, cbhaz, log = TRUE) + pcox(x, mu, bhaz, cbhaz, lower.tail = FALSE, log.p = TRUE) if (!log) { out <- exp(out) } out } # hazard function of the cox model hcox <- function(x, mu, bhaz, cbhaz, log = FALSE) { out <- log(bhaz) + log(mu) if (!log) { out <- exp(out) } out } # distribution function of the cox model pcox <- function(q, mu, bhaz, cbhaz, lower.tail = TRUE, log.p = FALSE) { log_surv <- -cbhaz * mu if (lower.tail) { if (log.p) { out <- log1m_exp(log_surv) } else { out <- 1 - exp(log_surv) } } else { if (log.p) { out <- log_surv } else { out <- exp(log_surv) } } out } #' Zero-Inflated Distributions #' #' Density and distribution functions for zero-inflated distributions. #' #' @name ZeroInflated #' #' @inheritParams StudentT #' @param zi zero-inflation propability #' @param mu,lambda location parameter #' @param shape,shape1,shape2 shape parameter #' @param size number of trials #' @param prob probability of success on each trial #' #' @details #' The density of a zero-inflated distribution can be specified as follows. #' If \eqn{x = 0} set \eqn{f(x) = \theta + (1 - \theta) * g(0)}. #' Else set \eqn{f(x) = (1 - \theta) * g(x)}, #' where \eqn{g(x)} is the density of the non-zero-inflated part. NULL #' @rdname ZeroInflated #' @export dzero_inflated_poisson <- function(x, lambda, zi, log = FALSE) { pars <- nlist(lambda) .dzero_inflated(x, "pois", zi, pars, log) } #' @rdname ZeroInflated #' @export pzero_inflated_poisson <- function(q, lambda, zi, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(lambda) .pzero_inflated(q, "pois", zi, pars, lower.tail, log.p) } #' @rdname ZeroInflated #' @export dzero_inflated_negbinomial <- function(x, mu, shape, zi, log = FALSE) { pars <- nlist(mu, size = shape) .dzero_inflated(x, "nbinom", zi, pars, log) } #' @rdname ZeroInflated #' @export pzero_inflated_negbinomial <- function(q, mu, shape, zi, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(mu, size = shape) .pzero_inflated(q, "nbinom", zi, pars, lower.tail, log.p) } #' @rdname ZeroInflated #' @export dzero_inflated_binomial <- function(x, size, prob, zi, log = FALSE) { pars <- nlist(size, prob) .dzero_inflated(x, "binom", zi, pars, log) } #' @rdname ZeroInflated #' @export pzero_inflated_binomial <- function(q, size, prob, zi, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(size, prob) .pzero_inflated(q, "binom", zi, pars, lower.tail, log.p) } #' @rdname ZeroInflated #' @export dzero_inflated_beta <- function(x, shape1, shape2, zi, log = FALSE) { pars <- nlist(shape1, shape2) # zi_beta is technically a hurdle model .dhurdle(x, "beta", zi, pars, log, type = "real") } #' @rdname ZeroInflated #' @export pzero_inflated_beta <- function(q, shape1, shape2, zi, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(shape1, shape2) # zi_beta is technically a hurdle model .phurdle(q, "beta", zi, pars, lower.tail, log.p, type = "real") } # @rdname ZeroInflated # @export dzero_inflated_asym_laplace <- function(x, mu, sigma, quantile, zi, log = FALSE) { pars <- nlist(mu, sigma, quantile) # zi_asym_laplace is technically a hurdle model .dhurdle(x, "asym_laplace", zi, pars, log, type = "real") } # @rdname ZeroInflated # @export pzero_inflated_asym_laplace <- function(q, mu, sigma, quantile, zi, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(mu, sigma, quantile) # zi_asym_laplace is technically a hurdle model .phurdle(q, "asym_laplace", zi, pars, lower.tail, log.p, type = "real", lb = -Inf, ub = Inf) } # density of a zero-inflated distribution # @param dist name of the distribution # @param zi bernoulli zero-inflated parameter # @param pars list of parameters passed to pdf .dzero_inflated <- function(x, dist, zi, pars, log) { stopifnot(is.list(pars)) dist <- as_one_character(dist) log <- as_one_logical(log) args <- expand(dots = c(nlist(x, zi), pars)) x <- args$x zi <- args$zi pars <- args[names(pars)] pdf <- paste0("d", dist) out <- ifelse(x == 0, log(zi + (1 - zi) * do_call(pdf, c(0, pars))), log(1 - zi) + do_call(pdf, c(list(x), pars, log = TRUE)) ) if (!log) { out <- exp(out) } out } # CDF of a zero-inflated distribution # @param dist name of the distribution # @param zi bernoulli zero-inflated parameter # @param pars list of parameters passed to pdf # @param lb lower bound of the conditional distribution # @param ub upper bound of the conditional distribution .pzero_inflated <- function(q, dist, zi, pars, lower.tail, log.p, lb = 0, ub = Inf) { stopifnot(is.list(pars)) dist <- as_one_character(dist) lower.tail <- as_one_logical(lower.tail) log.p <- as_one_logical(log.p) lb <- as_one_numeric(lb) ub <- as_one_numeric(ub) args <- expand(dots = c(nlist(q, zi), pars)) q <- args$q zi <- args$zi pars <- args[names(pars)] cdf <- paste0("p", dist) # compute log CCDF values out <- log(1 - zi) + do_call(cdf, c(list(q), pars, lower.tail = FALSE, log.p = TRUE)) # take the limits of the distribution into account out <- ifelse(q < lb, 0, out) out <- ifelse(q > ub, -Inf, out) if (lower.tail) { out <- 1 - exp(out) if (log.p) { out <- log(out) } } else { if (!log.p) { out <- exp(out) } } out } #' Hurdle Distributions #' #' Density and distribution functions for hurdle distributions. #' #' @name Hurdle #' #' @inheritParams StudentT #' @param hu hurdle propability #' @param mu,lambda location parameter #' @param shape shape parameter #' @param sigma,scale scale parameter #' #' @details #' The density of a hurdle distribution can be specified as follows. #' If \eqn{x = 0} set \eqn{f(x) = \theta}. Else set #' \eqn{f(x) = (1 - \theta) * g(x) / (1 - G(0))} #' where \eqn{g(x)} and \eqn{G(x)} are the density and distribution #' function of the non-hurdle part, respectively. NULL #' @rdname Hurdle #' @export dhurdle_poisson <- function(x, lambda, hu, log = FALSE) { pars <- nlist(lambda) .dhurdle(x, "pois", hu, pars, log, type = "int") } #' @rdname Hurdle #' @export phurdle_poisson <- function(q, lambda, hu, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(lambda) .phurdle(q, "pois", hu, pars, lower.tail, log.p, type = "int") } #' @rdname Hurdle #' @export dhurdle_negbinomial <- function(x, mu, shape, hu, log = FALSE) { pars <- nlist(mu, size = shape) .dhurdle(x, "nbinom", hu, pars, log, type = "int") } #' @rdname Hurdle #' @export phurdle_negbinomial <- function(q, mu, shape, hu, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(mu, size = shape) .phurdle(q, "nbinom", hu, pars, lower.tail, log.p, type = "int") } #' @rdname Hurdle #' @export dhurdle_gamma <- function(x, shape, scale, hu, log = FALSE) { pars <- nlist(shape, scale) .dhurdle(x, "gamma", hu, pars, log, type = "real") } #' @rdname Hurdle #' @export phurdle_gamma <- function(q, shape, scale, hu, lower.tail = TRUE, log.p = FALSE) { pars <- nlist(shape, scale) .phurdle(q, "gamma", hu, pars, lower.tail, log.p, type = "real") } #' @rdname Hurdle #' @export dhurdle_lognormal <- function(x, mu, sigma, hu, log = FALSE) { pars <- list(meanlog = mu, sdlog = sigma) .dhurdle(x, "lnorm", hu, pars, log, type = "real") } #' @rdname Hurdle #' @export phurdle_lognormal <- function(q, mu, sigma, hu, lower.tail = TRUE, log.p = FALSE) { pars <- list(meanlog = mu, sdlog = sigma) .phurdle(q, "lnorm", hu, pars, lower.tail, log.p, type = "real") } # density of a hurdle distribution # @param dist name of the distribution # @param hu bernoulli hurdle parameter # @param pars list of parameters passed to pdf # @param type support of distribution (int or real) .dhurdle <- function(x, dist, hu, pars, log, type) { stopifnot(is.list(pars)) dist <- as_one_character(dist) log <- as_one_logical(log) type <- match.arg(type, c("int", "real")) args <- expand(dots = c(nlist(x, hu), pars)) x <- args$x hu <- args$hu pars <- args[names(pars)] pdf <- paste0("d", dist) if (type == "int") { lccdf0 <- log(1 - do_call(pdf, c(0, pars))) } else { lccdf0 <- 0 } out <- ifelse(x == 0, log(hu), log(1 - hu) + do_call(pdf, c(list(x), pars, log = TRUE)) - lccdf0 ) if (!log) { out <- exp(out) } out } # CDF of a hurdle distribution # @param dist name of the distribution # @param hu bernoulli hurdle parameter # @param pars list of parameters passed to pdf # @param type support of distribution (int or real) # @param lb lower bound of the conditional distribution # @param ub upper bound of the conditional distribution .phurdle <- function(q, dist, hu, pars, lower.tail, log.p, type, lb = 0, ub = Inf) { stopifnot(is.list(pars)) dist <- as_one_character(dist) lower.tail <- as_one_logical(lower.tail) log.p <- as_one_logical(log.p) type <- match.arg(type, c("int", "real")) lb <- as_one_numeric(lb) ub <- as_one_numeric(ub) args <- expand(dots = c(nlist(q, hu), pars)) q <- args$q hu <- args$hu pars <- args[names(pars)] cdf <- paste0("p", dist) # compute log CCDF values out <- log(1 - hu) + do_call(cdf, c(list(q), pars, lower.tail = FALSE, log.p = TRUE)) if (type == "int") { pdf <- paste0("d", dist) out <- out - log(1 - do_call(pdf, c(0, pars))) } out <- ifelse(q < 0, log_sum_exp(out, log(hu)), out) # take the limits of the distribution into account out <- ifelse(q < lb, 0, out) out <- ifelse(q > ub, -Inf, out) if (lower.tail) { out <- 1 - exp(out) if (log.p) { out <- log(out) } } else { if (!log.p) { out <- exp(out) } } out } # density of the categorical distribution with the softmax transform # @param x positive integers not greater than ncat # @param eta the linear predictor (of length or ncol ncat-1) # @param log return values on the log scale? dcategorical <- function(x, eta, log = FALSE) { if (is.null(dim(eta))) { eta <- matrix(eta, nrow = 1) } if (length(dim(eta)) != 2L) { stop2("eta must be a numeric vector or matrix.") } if (log) { out <- log_softmax(eta) } else { out <- softmax(eta) } out[, x] } # CDF of the categorical distribution with the softmax transform # @param q positive integers not greater than ncat # @param eta the linear predictor (of length or ncol ncat-1) # @param log.p return values on the log scale? pcategorical <- function(q, eta, log.p = FALSE) { p <- dcategorical(seq_len(max(q)), eta = eta) out <- do_call(cbind, lapply(q, function(j) rowSums(as.matrix(p[, 1:j])))) if (log.p) { out <- log(out) } out } # density of the multinomial distribution with the softmax transform # @param x positive integers not greater than ncat # @param eta the linear predictor (of length or ncol ncat-1) # @param log return values on the log scale? dmultinomial <- function(x, eta, log = FALSE) { if (is.null(dim(eta))) { eta <- matrix(eta, nrow = 1) } if (length(dim(eta)) != 2L) { stop2("eta must be a numeric vector or matrix.") } log_prob <- log_softmax(eta) size <- sum(x) x <- as_draws_matrix(x, dim = dim(eta)) out <- lgamma(size + 1) + rowSums(x * log_prob - lgamma(x + 1)) if (!log) { out <- exp(out) } out } # density of the cumulative distribution dcumulative <- function(x, eta, thres, disc = 1, link = "logit") { eta <- ilink(disc * (thres - eta), link) ncat <- ncol(eta) + 1 rows <- list(eta[, 1]) if (ncat > 2) { .fun <- function(k) { eta[, k] - eta[, k - 1] } rows <- c(rows, lapply(2:(ncat - 1), .fun)) } rows <- c(rows, list(1 - eta[, ncat - 1])) p <- do_call(cbind, rows) p[, x, drop = FALSE] } # density of the sratio distribution dsratio <- function(x, eta, thres, disc = 1, link = "logit") { eta <- ilink(disc * (thres - eta), link) ncat <- ncol(eta) + 1 rows <- list(eta[, 1]) if (ncat > 2) { .fun <- function(k) { (eta[, k]) * apply(as.matrix(1 - eta[, 1:(k - 1)]), 1, prod) } rows <- c(rows, lapply(2:(ncat - 1), .fun)) } rows <- c(rows, list(apply(1 - eta, 1, prod))) p <- do_call(cbind, rows) p[, x, drop = FALSE] } # density of the cratio distribution dcratio <- function(x, eta, thres, disc = 1, link = "logit") { eta <- ilink(disc * (eta - thres), link) ncat <- ncol(eta) + 1 rows <- list(1 - eta[, 1]) if (ncat > 2) { .fun <- function(k) { (1 - eta[, k]) * apply(as.matrix(eta[, 1:(k - 1)]), 1, prod) } rows <- c(rows, lapply(2:(ncat - 1), .fun)) } rows <- c(rows, list(apply(eta, 1, prod))) p <- do_call(cbind, rows) p[, x, drop = FALSE] } # density of the acat distribution dacat <- function(x, eta, thres, disc = 1, link = "logit") { eta <- disc * (eta - thres) ncat <- ncol(eta) + 1 if (link == "logit") { # faster evaluation in this case p <- cbind( rep(1, nrow(eta)), exp(eta[, 1]), matrix(NA, nrow = nrow(eta), ncol = ncat - 2) ) if (ncat > 2) { .fun <- function(k) { rowSums(eta[, 1:(k - 1)]) } p[, 3:ncat] <- exp(sapply(3:ncat, .fun)) } } else { eta <- ilink(eta, link) p <- cbind( apply(1 - eta[, 1:(ncat - 1)], 1, prod), matrix(0, nrow = nrow(eta), ncol = ncat - 1) ) if (ncat > 2) { .fun <- function(k) { apply(as.matrix(eta[, 1:(k - 1)]), 1, prod) * apply(as.matrix(1 - eta[, k:(ncat - 1)]), 1, prod) } p[, 2:(ncat - 1)] <- sapply(2:(ncat - 1), .fun) } p[, ncat] <- apply(eta[, 1:(ncat - 1)], 1, prod) } p <- p / rowSums(p) p[, x, drop = FALSE] } # CDF for ordinal distributions # @param q positive integers not greater than ncat # @param eta samples of the linear predictor # @param thres samples of threshold parameters # @param disc samples of the discrimination parameter # @param family a character string naming the family # @param link a character string naming the link # @return a matrix of probabilites P(x <= q) pordinal <- function(q, eta, thres, disc = 1, family = NULL, link = "logit") { family <- as_one_character(family) link <- as_one_character(link) args <- nlist(x = seq_len(max(q)), eta, thres, disc, link) p <- do_call(paste0("d", family), args) .fun <- function(j) rowSums(as.matrix(p[, 1:j, drop = FALSE])) do_call(cbind, lapply(q, .fun)) } # helper functions to shift arbitrary distributions dshifted <- function(dist, x, shift = 0, ...) { do_call(paste0("d", dist), list(x - shift, ...)) } pshifted <- function(dist, q, shift = 0, ...) { do_call(paste0("p", dist), list(q - shift, ...)) } qshifted <- function(dist, p, shift = 0, ...) { do_call(paste0("q", dist), list(p, ...)) + shift } rshifted <- function(dist, n, shift = 0, ...) { do_call(paste0("r", dist), list(n, ...)) + shift } # check if 'n' in r functions is valid # @param n number of desired random draws # @param .. parameter vectors # @return validated 'n' check_n_rdist <- function(n, ...) { n <- as.integer(as_one_numeric(n)) max_len <- max(lengths(list(...))) if (max_len > 1L) { if (!n %in% c(1, max_len)) { stop2("'n' must match the maximum length of the parameter vectors.") } n <- max_len } n } brms/R/loo.R0000644000176200001440000011301113614307046012333 0ustar liggesusers#' Efficient approximate leave-one-out cross-validation (LOO) #' #' Perform approximate leave-one-out cross-validation based #' on the posterior likelihood using the \pkg{loo} package. #' For more details see \code{\link[loo:loo]{loo}}. #' #' @aliases loo LOO LOO.brmsfit #' #' @param x A \code{brmsfit} object. #' @param ... More \code{brmsfit} objects or further arguments #' passed to the underlying post-processing functions. #' In particular, see \code{\link{extract_draws}} for further #' supported arguments. #' @param compare A flag indicating if the information criteria #' of the models should be compared to each other #' via \code{\link{loo_compare}}. #' @param pointwise A flag indicating whether to compute the full #' log-likelihood matrix at once or separately for each observation. #' The latter approach is usually considerably slower but #' requires much less working memory. Accordingly, if one runs #' into memory issues, \code{pointwise = TRUE} is the way to go. #' @param reloo Logical; Indicate whether \code{\link{reloo}} #' should be applied on problematic observations. Defaults to \code{FALSE}. #' @param k_threshold The threshold at which pareto \eqn{k} #' estimates are treated as problematic. Defaults to \code{0.7}. #' Only used if argument \code{reloo} is \code{TRUE}. #' See \code{\link[loo:pareto_k_ids]{pareto_k_ids}} for more details. #' @param reloo_args Optional \code{list} of additional arguments passed to #' \code{\link{reloo}}. #' @param model_names If \code{NULL} (the default) will use model names #' derived from deparsing the call. Otherwise will use the passed #' values as model names. #' @inheritParams predict.brmsfit #' #' @details See \code{\link{loo_compare}} for details on model comparisons. #' For \code{brmsfit} objects, \code{LOO} is an alias of \code{loo}. #' Use method \code{\link{add_criterion}} to store #' information criteria in the fitted model object for later usage. #' #' @return If just one object is provided, an object of class \code{loo}. #' If multiple objects are provided, an object of class \code{loolist}. #' #' @examples #' \dontrun{ #' # model with population-level effects only #' fit1 <- brm(rating ~ treat + period + carry, #' data = inhaler) #' (loo1 <- loo(fit1)) #' #' # model with an additional varying intercept for subjects #' fit2 <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' (loo2 <- loo(fit2)) #' #' # compare both models #' loo_compare(loo1, loo2) #' } #' #' @references #' Vehtari, A., Gelman, A., & Gabry J. (2016). Practical Bayesian model #' evaluation using leave-one-out cross-validation and WAIC. In Statistics #' and Computing, doi:10.1007/s11222-016-9696-4. arXiv preprint arXiv:1507.04544. #' #' Gelman, A., Hwang, J., & Vehtari, A. (2014). #' Understanding predictive information criteria for Bayesian models. #' Statistics and Computing, 24, 997-1016. #' #' Watanabe, S. (2010). Asymptotic equivalence of Bayes cross validation #' and widely applicable information criterion in singular learning theory. #' The Journal of Machine Learning Research, 11, 3571-3594. #' #' @importFrom loo loo is.loo #' @export loo #' @export loo.brmsfit <- function(x, ..., compare = TRUE, resp = NULL, pointwise = FALSE, reloo = FALSE, k_threshold = 0.7, reloo_args = list(), model_names = NULL) { args <- split_dots(x, ..., model_names = model_names) c(args) <- nlist( criterion = "loo", pointwise, compare, resp, k_threshold, reloo, reloo_args ) do_call(compute_loos, args) } #' @export LOO.brmsfit <- function(x, ..., compare = TRUE, resp = NULL, pointwise = FALSE, reloo = FALSE, k_threshold = 0.7, reloo_args = list(), model_names = NULL) { cl <- match.call() cl[[1]] <- quote(loo) eval(cl, parent.frame()) } #' @export LOO <- function(x, ...) { UseMethod("LOO") } #' Widely Applicable Information Criterion (WAIC) #' #' Compute the widely applicable information criterion (WAIC) #' based on the posterior likelihood using the \pkg{loo} package. #' For more details see \code{\link[loo:waic]{waic}}. #' #' @aliases waic WAIC WAIC.brmsfit #' #' @inheritParams loo.brmsfit #' #' @details See \code{\link{loo_compare}} for details on model comparisons. #' For \code{brmsfit} objects, \code{WAIC} is an alias of \code{waic}. #' Use method \code{\link[brms:add_criterion]{add_criterion}} to store #' information criteria in the fitted model object for later usage. #' #' @return If just one object is provided, an object of class \code{loo}. #' If multiple objects are provided, an object of class \code{loolist}. #' #' @examples #' \dontrun{ #' # model with population-level effects only #' fit1 <- brm(rating ~ treat + period + carry, #' data = inhaler) #' (waic1 <- waic(fit1)) #' #' # model with an additional varying intercept for subjects #' fit2 <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' (waic2 <- waic(fit2)) #' #' # compare both models #' loo_compare(waic1, waic2) #' } #' #' @references #' Vehtari, A., Gelman, A., & Gabry J. (2016). Practical Bayesian model #' evaluation using leave-one-out cross-validation and WAIC. In Statistics #' and Computing, doi:10.1007/s11222-016-9696-4. arXiv preprint arXiv:1507.04544. #' #' Gelman, A., Hwang, J., & Vehtari, A. (2014). #' Understanding predictive information criteria for Bayesian models. #' Statistics and Computing, 24, 997-1016. #' #' Watanabe, S. (2010). Asymptotic equivalence of Bayes cross validation #' and widely applicable information criterion in singular learning theory. #' The Journal of Machine Learning Research, 11, 3571-3594. #' #' @importFrom loo waic #' @export waic #' @export waic.brmsfit <- function(x, ..., compare = TRUE, resp = NULL, pointwise = FALSE, model_names = NULL) { args <- split_dots(x, ..., model_names = model_names) c(args) <- nlist(criterion = "waic", pointwise, compare, resp) do_call(compute_loos, args) } #' @export WAIC.brmsfit <- function(x, ..., compare = TRUE, resp = NULL, pointwise = FALSE, model_names = NULL) { cl <- match.call() cl[[1]] <- quote(waic) eval(cl, parent.frame()) } #' @export WAIC <- function(x, ...) { UseMethod("WAIC") } #' Efficient approximate leave-one-out cross-validation (LOO) using subsampling #' #' @aliases loo_subsample #' #' @inheritParams loo.brmsfit #' #' @details More details can be found on #' \code{\link[loo:loo_subsample]{loo_subsample}}. #' #' @examples #' \dontrun{ #' # model with population-level effects only #' fit1 <- brm(rating ~ treat + period + carry, #' data = inhaler) #' (loo1 <- loo_subsample(fit1)) #' #' # model with an additional varying intercept for subjects #' fit2 <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' (loo2 <- loo_subsample(fit2)) #' #' # compare both models #' loo_compare(loo1, loo2) #' } #' #' @importFrom loo loo_subsample #' @export loo_subsample #' @export loo_subsample.brmsfit <- function(x, ..., compare = TRUE, resp = NULL, model_names = NULL) { args <- split_dots(x, ..., model_names = model_names) c(args) <- nlist( criterion = "loo_subsample", compare, resp, pointwise = TRUE, add_point_draws = TRUE ) do_call(compute_loos, args) } # possible criteria to evaluate via the loo package loo_criteria <- function() { c("loo", "waic", "psis", "kfold", "loo_subsample") } # helper function used to create (lists of) 'loo' objects # @param models list of brmsfit objects # @param criterion name of the criterion to compute # @param use_stored use precomputed criterion objects if possible? # @param compare compare models using 'loo_compare'? # @param ... more arguments passed to compute_loo # @return If length(models) > 1 an object of class 'loolist' # If length(models) == 1 an object of class 'loo' compute_loos <- function( models, criterion = loo_criteria(), use_stored = TRUE, compare = TRUE, ... ) { criterion <- match.arg(criterion) args <- nlist(criterion, ...) for (i in seq_along(models)) { models[[i]] <- restructure(models[[i]]) } if (length(models) > 1L) { if (!match_nobs(models)) { stop2("Models have different number of observations.") } if (length(use_stored) == 1L) { use_stored <- rep(use_stored, length(models)) } out <- list(loos = named_list(names(models))) for (i in seq_along(models)) { args$x <- models[[i]] args$model_name <- names(models)[i] args$use_stored <- use_stored[i] out$loos[[i]] <- do_call(compute_loo, args) } compare <- as_one_logical(compare) if (compare) { out$diffs <- loo_compare(out$loos) # for backwards compatibility; remove in brms 3.0 out$ic_diffs__ <- SW(compare_ic(x = out$loos))$ic_diffs__ } class(out) <- "loolist" } else { args$x <- models[[1]] args$model_name <- names(models) args$use_stored <- use_stored out <- do_call(compute_loo, args) } out } # compute information criteria using the 'loo' package # @param x an object of class brmsfit # @param criterion the criterion to be computed # @param model_name original variable name of object 'x' # @param use_stored use precomputed criterion objects if possible? # @param newdata optional data.frame of new data # @param reloo call 'reloo' after computing 'loo'? # @param reloo_args list of arguments passed to 'reloo' # @param pointwise compute log-likelihood point-by-point? # @param ... passed to other post-processing methods # @return an object of class 'loo' compute_loo <- function(x, criterion = loo_criteria(), reloo = FALSE, k_threshold = 0.7, reloo_args = list(), pointwise = FALSE, newdata = NULL, resp = NULL, model_name = "", use_stored = TRUE, ...) { criterion <- match.arg(criterion) model_name <- as_one_character(model_name) use_stored <- as_one_logical(use_stored) out <- get_criterion(x, criterion) if (!(use_stored && is.loo(out))) { # compute the criterion if (criterion == "kfold") { kfold_args <- nlist(x, newdata, resp, ...) out <- do_call(.kfold, kfold_args) } else { contains_samples(x) pointwise <- as_one_logical(pointwise) loo_args <- list(...) ll_args <- nlist(object = x, newdata, pointwise, resp, ...) loo_args$x <- do_call(log_lik, ll_args) if (pointwise) { loo_args$draws <- attr(loo_args$x, "draws") loo_args$data <- attr(loo_args$x, "data") # TODO: how to include r_eff here? } else { loo_args$r_eff <- r_eff_log_lik(loo_args$x, fit = x) } if (criterion == "psis") { if (pointwise) { stop2("Cannot use pointwise evaluation for 'psis'.") } loo_args$log_ratios <- -loo_args$x loo_args$x <- NULL } if (criterion == "loo_subsample") { if (!pointwise) { stop2("Can only use pointwise evaluation in 'loo_subsample'.") } } out <- SW(do_call(criterion, loo_args, pkg = "loo")) } attr(out, "yhash") <- hash_response(x, newdata = newdata, resp = resp) } attr(out, "model_name") <- model_name if (criterion == "loo") { if (reloo) { c(reloo_args) <- nlist( x = out, fit = x, newdata, resp, k_threshold, check = FALSE, ... ) out <- do_call("reloo", reloo_args) } else { n_bad_obs <- length(loo::pareto_k_ids(out, threshold = k_threshold)) recommend_loo_options(n_bad_obs, k_threshold, model_name) } } out } #' Model comparison with the \pkg{loo} package #' #' For more details see \code{\link[loo:loo_compare]{loo_compare}}. #' #' @aliases loo_compare #' #' @inheritParams loo.brmsfit #' @param ... More \code{brmsfit} objects. #' @param criterion The name of the criterion to be extracted #' from \code{brmsfit} objects. #' #' @details All \code{brmsfit} objects should contain precomputed #' criterion objects. See \code{\link{add_criterion}} for more help. #' #' @return An object of class "\code{compare.loo}". #' #' @examples #' \dontrun{ #' # model with population-level effects only #' fit1 <- brm(rating ~ treat + period + carry, #' data = inhaler) #' fit1 <- add_criterion(fit1, "waic") #' #' # model with an additional varying intercept for subjects #' fit2 <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' fit2 <- add_criterion(fit2, "waic") #' #' # compare both models #' loo_compare(fit1, fit2, criterion = "waic") #' } #' #' @importFrom loo loo_compare #' @export loo_compare #' @export loo_compare.brmsfit <- function(x, ..., criterion = c("loo", "waic", "kfold"), model_names = NULL) { criterion <- match.arg(criterion) models <- split_dots(x, ..., model_names = model_names, other = FALSE) loos <- named_list(names(models)) for (i in seq_along(models)) { models[[i]] <- restructure(models[[i]]) loos[[i]] <- get_criterion(models[[i]], criterion) if (is.null(loos[[i]])) { stop2( "Model '", names(models)[i], "' does not contain a precomputed '", criterion, "' criterion. See ?loo_compare.brmsfit for help." ) } } loo_compare(loos) } #' Model averaging via stacking or pseudo-BMA weighting. #' #' Compute model weights for \code{brmsfit} objects via stacking #' or pseudo-BMA weighting. For more details, see #' \code{\link[loo:loo_model_weights]{loo::loo_model_weights}}. #' #' @aliases loo_model_weights #' #' @inheritParams loo.brmsfit #' #' @return A named vector of model weights. #' #' @examples #' \dontrun{ #' # model with population-level effects only #' fit1 <- brm(rating ~ treat + period + carry, #' data = inhaler, family = "gaussian") #' # model with an additional varying intercept for subjects #' fit2 <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = "gaussian") #' loo_model_weights(fit1, fit2) #' } #' #' @method loo_model_weights brmsfit #' @importFrom loo loo_model_weights #' @export loo_model_weights #' @export loo_model_weights.brmsfit <- function(x, ..., model_names = NULL) { args <- split_dots(x, ..., model_names = model_names) models <- args$models args$models <- NULL log_lik_list <- lapply(models, function(x) do_call(log_lik, c(list(x), args)) ) args$x <- log_lik_list args$r_eff_list <- mapply( r_eff_log_lik, log_lik = log_lik_list, fit = models, SIMPLIFY = FALSE ) out <- do_call(loo::loo_model_weights, args) names(out) <- names(models) out } #' Add model fit criteria to model objects #' #' @param x An \R object typically of class \code{brmsfit}. #' @param criterion Names of model fit criteria #' to compute. Currently supported are \code{"loo"}, #' \code{"waic"}, \code{"kfold"}, \code{"loo_subsample"}, #' \code{"bayes_R2"} (Bayesian R-squared), #' \code{"loo_R2"} (LOO-adjusted R-squared), and #' \code{"marglik"} (log marginal likelihood). #' @param model_name Optional name of the model. If \code{NULL} #' (the default) the name is taken from the call to \code{x}. #' @param overwrite Logical; Indicates if already stored fit #' indices should be overwritten. Defaults to \code{FALSE}. #' @param file Either \code{NULL} or a character string. In the latter case, the #' fitted model object including the newly added criterion values is saved via #' \code{\link{saveRDS}} in a file named after the string supplied in #' \code{file}. The \code{.rds} extension is added automatically. If \code{x} #' was already stored in a file before, the file name will be reused #' automatically (with a message) unless overwritten by \code{file}. In any #' case, \code{file} only applies if new criteria were actually added via #' \code{add_criterion} or if \code{force_save} was set to \code{TRUE}. #' @param force_save Logical; only relevant if \code{file} is specified and #' ignored otherwise. If \code{TRUE}, the fitted model object will be saved #' regardless of whether new criteria were added via \code{add_criterion}. #' @param ... Further arguments passed to the underlying #' functions computing the model fit criteria. #' #' @return An object of the same class as \code{x}, but #' with model fit criteria added for later usage. #' #' @details Functions \code{add_loo} and \code{add_waic} are aliases of #' \code{add_criterion} with fixed values for the \code{criterion} argument. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ Trt, data = epilepsy) #' # add both LOO and WAIC at once #' fit <- add_criterion(fit, c("loo", "waic")) #' print(fit$criteria$loo) #' print(fit$criteria$waic) #' } #' #' @export add_criterion <- function(x, ...) { UseMethod("add_criterion") } #' @rdname add_criterion #' @export add_criterion.brmsfit <- function(x, criterion, model_name = NULL, overwrite = FALSE, file = NULL, force_save = FALSE, ...) { if (!is.null(model_name)) { model_name <- as_one_character(model_name) } else { model_name <- deparse_combine(substitute(x)) } criterion <- unique(as.character(criterion)) if (any(criterion == "R2")) { # deprecated as of version 2.10.4 warning2("Criterion 'R2' is deprecated. Please use 'bayes_R2' instead.") criterion[criterion == "R2"] <- "bayes_R2" } loo_options <- c("loo", "waic", "kfold", "loo_subsample", "loo_R2") options <- c(loo_options, "bayes_R2", "marglik") if (!length(criterion) || !all(criterion %in% options)) { stop2("Argument 'criterion' should be a subset of ", collapse_comma(options)) } auto_save <- FALSE if (!is.null(file)) { file <- paste0(as_one_character(file), ".rds") } else { file <- x$file if (!is.null(file)) auto_save <- TRUE } force_save <- as_one_logical(force_save) overwrite <- as_one_logical(overwrite) if (overwrite) { # remove previously stored criterion objects x$criteria[criterion] <- list(NULL) } new_criteria <- criterion[ulapply(x[criterion], is.null)] args <- list(x, ...) for (fun in intersect(criterion, loo_options)) { args$model_names <- model_name x$criteria[[fun]] <- do_call(fun, args) } if ("bayes_R2" %in% criterion) { args$summary <- FALSE x$criteria$bayes_R2 <- do_call(bayes_R2, args) } if ("marglik" %in% criterion) { x$criteria$marglik <- do_call(bridge_sampler, args) } if (!is.null(file) && (force_save || length(new_criteria))) { if (auto_save) { message("Automatically saving the model object in '", file, "'") } x$file <- file saveRDS(x, file = file) } x } # extract a recomputed model fit criterion get_criterion <- function(x, criterion) { stopifnot(is.brmsfit(x)) criterion <- as_one_character(criterion) x$criteria[[criterion]] } # create a hash based on the response of a model hash_response <- function(x, newdata = NULL, resp = NULL, ...) { require_package("digest") stopifnot(is.brmsfit(x)) sdata <- standata( x, newdata = newdata, re_formula = NA, internal = TRUE, check_response = TRUE, only_response = TRUE ) add_funs <- lsp("brms", what = "exports", pattern = "^resp_") regex <- c("Y", sub("^resp_", "", add_funs)) regex <- outer(regex, escape_all(usc(resp)), FUN = paste0) regex <- paste0("(", as.vector(regex), ")", collapse = "|") regex <- paste0("^(", regex, ")(_|$)") out <- sdata[grepl(regex, names(sdata))] out <- as.matrix(as.data.frame(rmNULL(out))) out <- p(out, attr(sdata, "old_order")) # see issue #642 attributes(out) <- NULL digest::sha1(x = out, ...) } # compare the response parts of multiple brmsfit objects # @param models A list of brmsfit objects # @param ... passed to hash_response # @return TRUE if the response parts of all models match and FALSE otherwise match_response <- function(models, ...) { if (length(models) <= 1L) { out <- TRUE } else { yhash <- lapply(models, hash_response, ...) yhash_check <- ulapply(yhash, is_equal, yhash[[1]]) if (all(yhash_check)) { out <- TRUE } else { out <- FALSE } } out } # compare number of observations of multipe models # @param models A list of brmsfit objects # @param ... currently ignored # @return TRUE if the number of rows match match_nobs <- function(models, ...) { if (length(models) <= 1L) { out <- TRUE } else { nobs <- lapply(models, nobs) nobs_check <- ulapply(nobs, is_equal, nobs[[1]]) if (all(nobs_check)) { out <- TRUE } else { out <- FALSE } } out } # validate models passed to loo and related methods # @param models list of fitted model objects # @param model_names names specified by the user # @param sub_names names inferred by substitute() validate_models <- function(models, model_names, sub_names) { stopifnot(is.list(models)) model_names <- as.character(model_names) if (!length(model_names)) { model_names <- as.character(sub_names) } if (length(model_names) != length(models)) { stop2("Number of model names is not equal to the number of models.") } names(models) <- model_names for (i in seq_along(models)) { if (!is.brmsfit(models[[i]])) { stop2("Object '", names(models)[i], "' is not of class 'brmsfit'.") } } models } #' Compute exact cross-validation for problematic observations #' #' Compute exact cross-validation for problematic observations for which #' approximate leave-one-out cross-validation may return incorrect results. #' Models for problematic observations can be run in parallel using the #' \pkg{future} package. #' #' @inheritParams predict.brmsfit #' @param x An \R object of class \code{brmsfit} or \code{loo} depending #' on the method. #' @param loo An \R object of class \code{loo}. #' @param fit An \R object of class \code{brmsfit}. #' @param k_threshold The threshold at which pareto \eqn{k} #' estimates are treated as problematic. Defaults to \code{0.7}. #' See \code{\link[loo:pareto_k_ids]{pareto_k_ids}} #' for more details. #' @param check Logical; If \code{TRUE} (the default), some checks #' check are performed if the \code{loo} object was generated #' from the \code{brmsfit} object passed to argument \code{fit}. #' @param ... Further arguments passed to #' \code{\link{update.brmsfit}} and \code{\link{log_lik.brmsfit}}. #' #' @return An object of the class \code{loo}. #' #' @details #' Warnings about Pareto \eqn{k} estimates indicate observations #' for which the approximation to LOO is problematic (this is described in #' detail in Vehtari, Gelman, and Gabry (2017) and the #' \pkg{\link[loo:loo-package]{loo}} package documentation). #' If there are \eqn{J} observations with \eqn{k} estimates above #' \code{k_threshold}, then \code{reloo} will refit the original model #' \eqn{J} times, each time leaving out one of the \eqn{J} #' problematic observations. The pointwise contributions of these observations #' to the total ELPD are then computed directly and substituted for the #' previous estimates from these \eqn{J} observations that are stored in the #' original \code{loo} object. #' #' @seealso \code{\link{loo}}, \code{\link{kfold}} #' #' @examples #' \dontrun{ #' fit1 <- brm(count ~ zAge + zBase * Trt + (1|patient), #' data = epilepsy, family = poisson()) #' # throws warning about some pareto k estimates being too high #' (loo1 <- loo(fit1)) #' (reloo1 <- reloo(fit1, loo = loo1, chains = 1)) #' } #' #' @export reloo.brmsfit <- function(x, loo, k_threshold = 0.7, newdata = NULL, resp = NULL, check = TRUE, ...) { stopifnot(is.loo(loo), is.brmsfit(x)) if (is.brmsfit_multiple(x)) { warn_brmsfit_multiple(x) class(x) <- "brmsfit" } if (is.null(newdata)) { mf <- model.frame(x) } else { mf <- as.data.frame(newdata) } mf <- rm_attr(mf, c("terms", "brmsframe")) if (NROW(mf) != NROW(loo$pointwise)) { stop2("Number of observations in 'loo' and 'x' do not match.") } if (check) { yhash_loo <- attr(loo, "yhash") yhash_fit <- hash_response(x, newdata = newdata) if (!is_equal(yhash_loo, yhash_fit)) { stop2( "Response values used in 'loo' and 'x' do not match. ", "If this is a false positive, please set 'check' to FALSE." ) } } if (is.null(loo$diagnostics$pareto_k)) { stop2("No Pareto k estimates found in the 'loo' object.") } obs <- loo::pareto_k_ids(loo, k_threshold) J <- length(obs) if (J == 0L) { message( "No problematic observations found. ", "Returning the original 'loo' object." ) return(loo) } # split dots for use in log_lik and update dots <- list(...) ll_arg_names <- arg_names("log_lik") ll_args <- dots[intersect(names(dots), ll_arg_names)] ll_args$allow_new_levels <- TRUE ll_args$resp <- resp ll_args$combine <- TRUE up_args <- dots[setdiff(names(dots), ll_arg_names)] up_args$refresh <- 0 .reloo <- function(j) { omitted <- obs[j] mf_omitted <- mf[-omitted, , drop = FALSE] fit_j <- x up_args$object <- fit_j up_args$newdata <- mf_omitted up_args$data2 <- subset_data2(x$data2, -omitted) fit_j <- SW(do_call(update, up_args)) ll_args$object <- fit_j ll_args$newdata <- mf[omitted, , drop = FALSE] ll_args$newdata2 <- subset_data2(x$data2, omitted) return(do_call(log_lik, ll_args)) } lls <- futures <- vector("list", J) message( J, " problematic observation(s) found.", "\nThe model will be refit ", J, " times." ) for (j in seq_len(J)) { message( "\nFitting model ", j, " out of ", J, " (leaving out observation ", obs[j], ")" ) futures[[j]] <- future::future(.reloo(j), packages = "brms") } for (j in seq_len(J)) { lls[[j]] <- future::value(futures[[j]]) } # most of the following code is taken from rstanarm:::reloo # compute elpd_{loo,j} for each of the held out observations elpd_loo <- ulapply(lls, log_mean_exp) # compute \hat{lpd}_j for each of the held out observations (using log-lik # matrix from full posterior, not the leave-one-out posteriors) mf_obs <- mf[obs, , drop = FALSE] data2_obs <- subset_data2(x$data2, obs) ll_x <- log_lik(x, newdata = mf_obs, newdata2 = data2_obs) hat_lpd <- apply(ll_x, 2, log_mean_exp) # compute effective number of parameters p_loo <- hat_lpd - elpd_loo # replace parts of the loo object with these computed quantities sel <- c("elpd_loo", "p_loo", "looic") loo$pointwise[obs, sel] <- cbind(elpd_loo, p_loo, -2 * elpd_loo) new_pw <- loo$pointwise[, sel, drop = FALSE] loo$estimates[, 1] <- colSums(new_pw) loo$estimates[, 2] <- sqrt(nrow(loo$pointwise) * apply(new_pw, 2, var)) # what should we do about pareto-k? for now setting them to 0 loo$diagnostics$pareto_k[obs] <- 0 loo } #' @rdname reloo.brmsfit #' @export reloo.loo <- function(x, fit, ...) { reloo(fit, loo = x, ...) } # the generic will eventually be moved to 'loo' #' @rdname reloo.brmsfit #' @export reloo <- function(x, ...) { UseMethod("reloo") } # recommend options if approximate loo fails for some observations recommend_loo_options <- function(n, k_threshold, model_name = "") { model_name <- if (isTRUE(nzchar(model_name))) { paste0(" in model '", model_name, "'") } if (n > 0 && n <= 10) { warning2( "Found ", n, " observations with a pareto_k > ", k_threshold, model_name, ". It is recommended to set 'reloo = TRUE' in order to ", "calculate the ELPD without the assumption that these observations " , "are negligible. This will refit the model ", n, " times to compute ", "the ELPDs for the problematic observations directly." ) out <- "reloo" } else if (n > 10) { warning2( "Found ", n, " observations with a pareto_k > ", k_threshold, model_name, ". With this many problematic observations, it may be more ", "appropriate to use 'kfold' with argument 'K = 10' to perform ", "10-fold cross-validation rather than LOO." ) out <- "kfold" } else { out <- "loo" } invisible(out) } # helper function to compute relative efficiences # @param x matrix of posterior draws # @param fit a brmsfit object to extract metadata from # @param allow_na allow NA values in the output? # @return a numeric vector of length NCOL(x) r_eff_helper <- function(x, fit, allow_na = TRUE) { if (is.brmsfit_multiple(fit)) { # due to stacking of chains from multiple models # efficiency computations will likely be incorrect # assume relative efficiency of 1 for now return(rep(1, NCOL(x))) } stopifnot(is.matrix(x), is.brmsfit(fit)) chains <- fit$fit@sim$chains chain_id <- rep(seq_len(chains), each = nrow(x) / chains) out <- loo::relative_eff(x, chain_id = chain_id) if (!allow_na && anyNA(out)) { # avoid error in loo if some but not all r_effs are NA out <- rep(1, NCOL(x)) warning2( "Ignoring relative efficiencies as some were NA. ", "See argument 'r_eff' in ?loo::loo for more details." ) } out } # wrapper around r_eff_helper to compute efficiency # of likelihood draws based on log-likelihood draws r_eff_log_lik <- function(log_lik, fit, allow_na = FALSE) { r_eff_helper(exp(log_lik), fit = fit, allow_na = allow_na) } # methods required in loo_subsample #' @importFrom loo .ndraws #' @export .ndraws.brmsdraws <- function(x, ...) { x$nsamples } #' @export .ndraws.mvbrmsdraws <- function(x, ...) { x$nsamples } #' @importFrom loo .thin_draws #' @export .thin_draws.brmsdraws <- function(draws, loo_approximation_draws) { # brmsdraws objects are too complex to implement a post-hoc subsetting method if (length(loo_approximation_draws)) { stop2("'loo_approximation_draws' is not supported for brmsfit objects.") } draws } #' @export .thin_draws.mvbrmsdraws <- function(draws, loo_approximation_draws) { if (length(loo_approximation_draws)) { stop2("'loo_approximation_draws' is not supported for brmsfit objects.") } draws } #' @importFrom loo .compute_point_estimate #' @export .compute_point_estimate.brmsdraws <- function(x, ...) { # point estimates are stored in the form of an attribute rather # than computed on the fly due to the complexity of brmsdraws objects attr(x, "point_draws") } #' @export .compute_point_estimate.mvbrmsdraws <- function(x, ...) { attr(x, "point_draws") } # print the output of a list of loo objects #' @export print.loolist <- function(x, digits = 1, ...) { model_names <- loo::find_model_names(x$loos) for (i in seq_along(x$loos)) { cat(paste0("Output of model '", model_names[i], "':\n")) print(x$loos[[i]], digits = digits, ...) cat("\n") } if (!is.null(x$diffs)) { cat("Model comparisons:\n") print(x$diffs, digits = digits, ...) } invisible(x) } # ---------- deprecated functions ---------- #' @rdname add_ic #' @export add_loo <- function(x, model_name = NULL, ...) { warning2("'add_loo' is deprecated. Please use 'add_criterion' instead.") if (!is.null(model_name)) { model_name <- as_one_character(model_name) } else { model_name <- deparse_combine(substitute(x)) } add_criterion(x, criterion = "loo", model_name = model_name, ...) } #' @rdname add_ic #' @export add_waic <- function(x, model_name = NULL, ...) { warning2("'add_waic' is deprecated. Please use 'add_criterion' instead.") if (!is.null(model_name)) { model_name <- as_one_character(model_name) } else { model_name <- deparse_combine(substitute(x)) } add_criterion(x, criterion = "waic", model_name = model_name, ...) } #' Add model fit criteria to model objects #' #' Deprecated aliases of \code{\link{add_criterion}}. #' #' @inheritParams add_criterion #' @param ic,value Names of model fit criteria #' to compute. Currently supported are \code{"loo"}, #' \code{"waic"}, \code{"kfold"}, \code{"R2"} (R-squared), and #' \code{"marglik"} (log marginal likelihood). #' #' @return An object of the same class as \code{x}, but #' with model fit criteria added for later usage. #' Previously computed criterion objects will be overwritten. #' #' @export add_ic <- function(x, ...) { UseMethod("add_ic") } #' @rdname add_ic #' @export add_ic.brmsfit <- function(x, ic = "loo", model_name = NULL, ...) { warning2("'add_ic' is deprecated. Please use 'add_criterion' instead.") if (!is.null(model_name)) { model_name <- as_one_character(model_name) } else { model_name <- deparse_combine(substitute(x)) } add_criterion(x, criterion = ic, model_name = model_name, ...) } #' @rdname add_ic #' @export 'add_ic<-' <- function(x, ..., value) { add_ic(x, ic = value, ...) } #' Compare Information Criteria of Different Models #' #' Compare information criteria of different models fitted #' with \code{\link{waic}} or \code{\link{loo}}. #' Deprecated and will be removed in the future. Please use #' \code{\link{loo_compare}} instead. #' #' @param ... At least two objects returned by #' \code{\link{waic}} or \code{\link{loo}}. #' Alternatively, \code{brmsfit} objects with information #' criteria precomputed via \code{\link{add_ic}} #' may be passed, as well. #' @param x A \code{list} containing the same types of objects as #' can be passed via \code{...}. #' @param ic The name of the information criterion to be extracted #' from \code{brmsfit} objects. Ignored if information #' criterion objects are only passed directly. #' #' @return An object of class \code{iclist}. #' #' @details See \code{\link{loo_compare}} for the recommended way #' of comparing models with the \pkg{loo} package. #' #' @seealso #' \code{\link{loo}}, #' \code{\link{loo_compare}} #' \code{\link{add_criterion}} #' #' @examples #' \dontrun{ #' # model with population-level effects only #' fit1 <- brm(rating ~ treat + period + carry, #' data = inhaler) #' waic1 <- waic(fit1) #' #' # model with an additional varying intercept for subjects #' fit2 <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' waic2 <- waic(fit2) #' #' # compare both models #' compare_ic(waic1, waic2) #' } #' #' @export compare_ic <- function(..., x = NULL, ic = c("loo", "waic", "kfold")) { # will be removed in brms 3.0 warning2( "'compare_ic' is deprecated and will be removed ", "in the future. Please use 'loo_compare' instead." ) ic <- match.arg(ic) if (!(is.null(x) || is.list(x))) { stop2("Argument 'x' should be a list.") } x$ic_diffs__ <- NULL x <- c(list(...), x) for (i in seq_along(x)) { # extract precomputed values from brmsfit objects if (is.brmsfit(x[[i]]) && !is.null(x[[i]][[ic]])) { x[[i]] <- x[[i]][[ic]] } } if (!all(sapply(x, inherits, "loo"))) { stop2("All inputs should have class 'loo' ", "or contain precomputed 'loo' objects.") } if (length(x) < 2L) { stop2("Expecting at least two objects.") } ics <- unname(sapply(x, function(y) rownames(y$estimates)[3])) if (!all(ics %in% ics[1])) { stop2("All inputs should be from the same criterion.") } yhash <- lapply(x, attr, which = "yhash") yhash_check <- ulapply(yhash, is_equal, yhash[[1]]) if (!all(yhash_check)) { warning2( "Model comparisons are likely invalid as the response ", "values of at least two models do not match." ) } names(x) <- loo::find_model_names(x) n_models <- length(x) ic_diffs <- matrix(0, nrow = n_models * (n_models - 1) / 2, ncol = 2) rnames <- rep("", nrow(ic_diffs)) # pairwise comparision to get differences in ICs and their SEs n <- 1 for (i in seq_len(n_models - 1)) { for (j in (i + 1):n_models) { tmp <- SW(loo::compare(x[[j]], x[[i]])) ic_diffs[n, ] <- c(-2 * tmp[["elpd_diff"]], 2 * tmp[["se"]]) rnames[n] <- paste(names(x)[i], "-", names(x)[j]) n <- n + 1 } } rownames(ic_diffs) <- rnames colnames(ic_diffs) <- c(toupper(ics[1]), "SE") x$ic_diffs__ <- ic_diffs class(x) <- "iclist" x } # print the output of LOO and WAIC with multiple models # deprecated as of brms > 2.5.0 and will be removed in brms 3.0 #' @export print.iclist <- function(x, digits = 2, ...) { m <- x m$ic_diffs__ <- NULL if (length(m)) { ic <- rownames(m[[1]]$estimates)[3] mat <- matrix(0, nrow = length(m), ncol = 2) dimnames(mat) <- list(names(m), c(toupper(ic), "SE")) for (i in seq_along(m)) { mat[i, ] <- m[[i]]$estimates[3, ] } } else { mat <- ic <- NULL } ic_diffs <- x$ic_diffs__ if (is.matrix(attr(x, "compare"))) { # deprecated as of brms 1.4.0 ic_diffs <- attr(x, "compare") } if (is.matrix(ic_diffs)) { # models were compared using the compare_ic function mat <- rbind(mat, ic_diffs) } print(round(mat, digits = digits), na.print = "") invisible(x) } brms/R/predictive_error.R0000644000176200001440000001357613615317320015125 0ustar liggesusers#' Posterior Samples of Predictive Errors #' #' Compute posterior samples of predictive errors, that is, observed minus #' predicted responses. Can be performed for the data used to fit the model #' (posterior predictive checks) or for new data. #' #' @inheritParams posterior_predict.brmsfit #' #' @return An S x N \code{array} of predictive error samples, where S is the #' number of posterior samples and N is the number of observations. #' #' @examples #' \dontrun{ #' ## fit a model #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler, cores = 2) #' #' ## extract predictive errors #' pe <- predictive_error(fit) #' str(pe) #' } #' #' @aliases predictive_error #' @method predictive_error brmsfit #' @importFrom rstantools predictive_error #' @export #' @export predictive_error predictive_error.brmsfit <- function( object, newdata = NULL, re_formula = NULL, re.form = NULL, resp = NULL, nsamples = NULL, subset = NULL, sort = FALSE, ... ) { cl <- match.call() if ("re.form" %in% names(cl)) { re_formula <- re.form } .predictive_error( object, newdata = newdata, re_formula = re_formula, method = "posterior_predict", type = "ordinary", resp = resp, nsamples = nsamples, subset = subset, sort = sort, ... ) } #' Posterior Samples of Residuals/Predictive Errors #' #' This method is an alias of \code{\link{predictive_error.brmsfit}} #' with additional arguments for obtaining summaries of the computed samples. #' #' @inheritParams predictive_error.brmsfit #' @param method Method use to obtain predictions. Either #' \code{"pp_expect"} (the default) or \code{"posterior_predict"}. #' Using \code{"posterior_predict"} is recommended #' but \code{"pp_expect"} is the current default for #' reasons of backwards compatibility. #' @param type The type of the residuals, #' either \code{"ordinary"} or \code{"pearson"}. #' More information is provided under 'Details'. #' @param summary Should summary statistics be returned #' instead of the raw values? Default is \code{TRUE}.. #' @param robust If \code{FALSE} (the default) the mean is used as #' the measure of central tendency and the standard deviation as #' the measure of variability. If \code{TRUE}, the median and the #' median absolute deviation (MAD) are applied instead. #' Only used if \code{summary} is \code{TRUE}. #' @param probs The percentiles to be computed by the \code{quantile} #' function. Only used if \code{summary} is \code{TRUE}. #' #' @return An \code{array} of predictive error/residual samples. If #' \code{summary = FALSE} the output resembles those of #' \code{\link{predictive_error.brmsfit}}. If \code{summary = TRUE} the output #' is an N x E matrix, where N is the number of observations and E denotes #' the summary statistics computed from the samples. #' #' @details Residuals of type \code{'ordinary'} are of the form \eqn{R = Y - #' Yrep}, where \eqn{Y} is the observed and \eqn{Yrep} is the predicted response. #' Residuals of type \code{pearson} are of the form \eqn{R = (Y - Yrep) / #' SD(Y)}, where \eqn{SD(Y)} is an estimation of the standard deviation of #' \eqn{Y}. #' #' @examples #' \dontrun{ #' ## fit a model #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler, cores = 2) #' #' ## extract residuals/predictive errors #' res <- residuals(fit) #' head(res) #' } #' #' @export residuals.brmsfit <- function(object, newdata = NULL, re_formula = NULL, method = "pp_expect", type = c("ordinary", "pearson"), resp = NULL, nsamples = NULL, subset = NULL, sort = FALSE, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) { summary <- as_one_logical(summary) out <- .predictive_error( object, newdata = newdata, re_formula = re_formula, method = method, type = type, resp = resp, nsamples = nsamples, subset = subset, sort = sort, ... ) if (summary) { out <- posterior_summary(out, probs = probs, robust = robust) } out } # internal function doing the work for predictive_error.brmsfit .predictive_error <- function(object, newdata, re_formula, method, type, resp, nsamples, subset, sort, ...) { contains_samples(object) object <- restructure(object) method <- validate_pp_method(method) type <- match.arg(type, c("ordinary", "pearson")) resp <- validate_resp(resp, object) family <- family(object, resp = resp) if (is_polytomous(family)) { stop2("Predictive errors are not defined for ordinal or categorical models.") } subset <- subset_samples(object, subset, nsamples) pred_args <- nlist( object, newdata, re_formula, resp, subset, summary = FALSE, sort = TRUE, ... ) yrep <- do_call(method, pred_args) y <- get_y(object, resp, newdata = newdata, warn = TRUE, ...) old_order <- attr(y, "old_order") if (length(dim(yrep)) == 3L) { # multivariate model y <- lapply(seq_cols(y), function(i) y[, i]) y <- lapply(y, as_draws_matrix, dim = dim(yrep)[1:2]) y <- abind(y, along = 3) dimnames(y)[[3]] <- dimnames(yrep)[[3]] } else { y <- as_draws_matrix(y, dim = dim(yrep)) } out <- y - yrep remove(y, yrep) if (type == "pearson") { # deprecated as of brms 2.10.6 warning2("Type 'pearson' is deprecated and will be removed in the future.") # get predicted standard deviation for each observation pred_args$summary <- TRUE pred <- do_call("predict", pred_args) if (length(dim(pred)) == 3L) { sd_pred <- array2list(pred[, 2, ]) sd_pred <- lapply(sd_pred, as_draws_matrix, dim = dim(out)[1:2]) sd_pred <- abind(sd_pred, along = 3) } else { sd_pred <- as_draws_matrix(pred[, 2], dim = dim(out)) } out <- out / sd_pred } reorder_obs(out, old_order, sort = sort) } brms/R/zzz.R0000644000176200001440000000200313040527713012373 0ustar liggesusers# Uncomment the code below to enable unit tests for new stan functions # new_stan_functions <- function() { # # copy all new stan functions into a single .stan file and compile it # isystem <- system.file("chunks", package = "brms") # chunk_filenames <- list.files(isystem, pattern = "^fun_") # families <- list(cumulative("probit"), sratio("logit"), # cratio("cloglog"), acat("cauchit")) # cs <- c(rep(FALSE, 2), rep(TRUE, 2)) # ordinal_funs <- ulapply(seq_along(families), function(i) # stan_ordinal(families[[i]], cs = cs[i])$fun) # temp_file <- tempfile() # cat(paste0("functions { \n", # collapse(" #include '", chunk_filenames, "' \n"), # collapse(ordinal_funs), "} \nmodel {} \n"), # file = temp_file) # model <- rstan::stanc_builder(file = temp_file, isystem = isystem, # obfuscate_model_name = TRUE) # rstan::stan_model(stanc_ret = model) # } # new_stan_functions <- new_stan_functions() brms/R/formula-sp.R0000644000176200001440000003674113614330155013642 0ustar liggesusers# This file contains functions dealing with the extended # formula syntax to specify special effects terms #' Predictors with Measurement Error in \pkg{brms} Models #' #' Specify predictors with measurement error. The function does not evaluate its #' arguments -- it exists purely to help set up a model. #' #' @param x The variable measured with error. #' @param sdx Known measurement error of \code{x} #' treated as standard deviation. #' @param gr Optional grouping factor to specify which #' values of \code{x} correspond to the same value of the #' latent variable. If \code{NULL} (the default) each #' observation will have its own value of the latent variable. #' #' @details #' For detailed documentation see \code{help(brmsformula)}. #' #' By default, latent noise-free variables are assumed #' to be correlated. To change that, add \code{set_mecor(FALSE)} #' to your model formula object (see examples). #' #' @seealso #' \code{\link{brmsformula}}, \code{\link{brmsformula-helpers}} #' #' @examples #' \dontrun{ #' # sample some data #' N <- 100 #' dat <- data.frame( #' y = rnorm(N), x1 = rnorm(N), #' x2 = rnorm(N), sdx = abs(rnorm(N, 1)) #' ) #' # fit a simple error-in-variables model #' fit1 <- brm(y ~ me(x1, sdx) + me(x2, sdx), data = dat, #' save_mevars = TRUE) #' summary(fit1) #' #' # turn off modeling of correlations #' bform <- bf(y ~ me(x1, sdx) + me(x2, sdx)) + set_mecor(FALSE) #' fit2 <- brm(bform, data = dat, save_mevars = TRUE) #' summary(fit2) #' } #' #' @export me <- function(x, sdx, gr = NULL) { # use 'term' for consistency with other special terms term <- deparse(substitute(x)) sdx <- deparse(substitute(sdx)) gr <- substitute(gr) if (!is.null(gr)) { gr <- deparse_combine(gr) stopif_illegal_group(gr) } else { gr <- "" } label <- deparse(match.call()) out <- nlist(term, sdx, gr, label) class(out) <- c("me_term", "sp_term") out } #' Predictors with Missing Values in \pkg{brms} Models #' #' Specify predictor term with missing values in \pkg{brms}. The function does #' not evaluate its arguments -- it exists purely to help set up a model. #' #' @param x The variable containing missings. #' #' @details For detailed documentation see \code{help(brmsformula)}. #' #' @seealso \code{\link{brmsformula}} #' #' @examples #' \dontrun{ #' data("nhanes", package = "mice") #' bform <- bf(bmi | mi() ~ age * mi(chl)) + #' bf(chl | mi() ~ age) + set_rescor(FALSE) #' fit <- brm(bform, data = nhanes) #' summary(fit) #' plot(marginal_effects(fit, resp = "bmi"), ask = FALSE) #' LOO(fit, newdata = na.omit(fit$data)) #' } #' #' @export mi <- function(x) { # use 'term' for consistency with other special terms term <- substitute(x) vars <- all.vars(term) term <- deparse(term) if (!is_equal(term, vars)) { stop2("'mi' only accepts single untransformed variables.") } label <- deparse(match.call()) out <- nlist(term, label) class(out) <- c("mi_term", "sp_term") out } #' Monotonic Predictors in \pkg{brms} Models #' #' Specify a monotonic predictor term in \pkg{brms}. The function does not #' evaluate its arguments -- it exists purely to help set up a model. #' #' @param x An integer variable or an ordered factor to be modeled as monotonic. #' #' @details For detailed documentation see \code{help(brmsformula)} #' as well as \code{vignette("brms_monotonic")}. #' #' @seealso \code{\link{brmsformula}} #' #' @references #' Bürkner P. C. & Charpentier, E. (in review). Monotonic Effects: A Principled #' Approach for Including Ordinal Predictors in Regression Models. PsyArXiv #' preprint. #' #' @examples #' \dontrun{ #' # generate some data #' income_options <- c("below_20", "20_to_40", "40_to_100", "greater_100") #' income <- factor(sample(income_options, 100, TRUE), #' levels = income_options, ordered = TRUE) #' mean_ls <- c(30, 60, 70, 75) #' ls <- mean_ls[income] + rnorm(100, sd = 7) #' dat <- data.frame(income, ls) #' #' # fit a simple monotonic model #' fit1 <- brm(ls ~ mo(income), data = dat) #' #' # summarise the model #' summary(fit1) #' plot(fit1, N = 6) #' plot(marginal_effects(fit1), points = TRUE) #' #' # model interaction with other variables #' dat$x <- sample(c("a", "b", "c"), 100, TRUE) #' fit2 <- brm(ls ~ mo(income)*x, data = dat) #' #' # summarise the model #' summary(fit2) #' plot(marginal_effects(fit2), points = TRUE) #' } #' #' @export mo <- function(x) { # use 'term' for consistency with other special terms term <- deparse(substitute(x)) label <- deparse(match.call()) out <- nlist(term, label) class(out) <- c("mo_term", "sp_term") out } # find variable names for which to keep NAs vars_keep_na <- function(x, ...) { UseMethod("vars_keep_na") } #' @export vars_keep_na.mvbrmsterms <- function(x, ...) { resps <- get_element(x, "respform") resps <- ulapply(resps, parse_resp, check_names = FALSE) out <- lapply(x$terms, vars_keep_na, responses = resps, ...) vars_mi <- unique(ulapply(out, attr, "vars_mi")) out <- unique(unlist(out)) miss_mi <- setdiff(vars_mi, out) if (length(miss_mi)) { stop2( "Response models of variables in 'mi' terms require " , "specification of the addition argument 'mi'. See ?mi. ", "Error occured for ", collapse_comma(miss_mi), "." ) } out } #' @export vars_keep_na.brmsterms <- function(x, responses = NULL, ...) { if (is.formula(x$adforms$mi)) { mi_respcall <- parse_resp(x$respform, check_names = FALSE) mi_respvars <- all_vars(mi_respcall) mi_advars <- all_vars(x$adforms$mi) out <- unique(c(mi_respcall, mi_respvars, mi_advars)) } else { out <- character(0) } uni_mi <- ulapply(get_effect(x, "sp"), attr, "uni_mi") if (length(uni_mi)) { vars_mi <- ulapply(uni_mi, function(term) eval2(term)$term) miss_mi <- setdiff(vars_mi, responses) if (length(miss_mi)) { stop2( "Variables in 'mi' terms should also be specified " , "as response variables in the model. See ?mi. ", "Error occured for ", collapse_comma(miss_mi), "." ) } attr(out, "vars_mi") <- vars_mi } out } # extract unique names of noise-free terms get_uni_me <- function(x) { uni_me <- ulapply(get_effect(x, "sp"), attr, "uni_me") if (!length(uni_me)) { return(NULL) } xname <- ulapply(uni_me, function(term) eval2(term)$term) df <- data.frame(xname, uni_me) df <- df[!duplicated(df), ] xdupl <- df$xname[duplicated(df$xname)] if (length(xdupl)) { calls <- df$uni_me[df$xname == xdupl[1]] stop2( "Variable '", xdupl[1], "' is used in different calls to 'me'.\n", "Associated calls are: ", collapse_comma(calls) ) } unique(uni_me) } # save all me-terms within a tidy data.frame tidy_meef <- function(bterms, data, old_levels = NULL) { uni_me <- get_uni_me(bterms) if (!length(uni_me)) { return(empty_meef()) } if (has_subset(bterms)) { # 'Xme' variables need to be the same across univariate models stop2("Argument 'subset' is not supported when using 'me' terms.") } out <- data.frame( term = uni_me, xname = "", grname = "", stringsAsFactors = FALSE ) levels <- vector("list", nrow(out)) for (i in seq_rows(out)) { tmp <- eval2(out$term[i]) out$xname[i] <- tmp$term if (isTRUE(nzchar(tmp$gr))) { out$grname[i] <- tmp$gr if (length(old_levels)) { levels[[i]] <- old_levels[[tmp$gr]] } else { levels[[i]] <- levels(factor(get(tmp$gr, data))) } } } out$coef <- rename(paste0("me", out$xname)) out$cor <- isTRUE(bterms$mecor) names(levels) <- out$grname levels <- levels[lengths(levels) > 0L] if (length(levels)) { levels <- levels[!duplicated(names(levels))] attr(out, "levels") <- levels } structure(out, class = c("meef_frame", "data.frame")) } empty_meef <- function() { out <- data.frame( term = character(0), xname = character(0), grname = character(0), cor = logical(0), stringsAsFactors = FALSE ) structure(out, class = c("meef_frame", "data.frame")) } is.meef_frame <- function(x) { inherits(x, "meef_frame") } # handle default of correlations between 'me' terms default_mecor <- function(mecor = NULL) { if (is.null(mecor)) TRUE else as_one_logical(mecor) } # find names of all variables used in a special effects type get_sp_vars <- function(x, type) { sp_terms <- ulapply(get_effect(x, "sp"), all_terms) all_vars(str2formula(get_matches_expr(regex_sp(type), sp_terms))) } # gather information of special effects terms # @param x either a formula or a list containing an element "sp" # @param data data frame containing the monotonic variables # @return a data.frame with one row per special term tidy_spef <- function(x, data) { if (is.formula(x)) { x <- parse_bf(x, check_response = FALSE)$dpars$mu } form <- x[["sp"]] if (!is.formula(form)) { return(empty_data_frame()) } mm <- sp_model_matrix(form, data, rename = FALSE) out <- data.frame(term = rm_wsp(colnames(mm)), stringsAsFactors = FALSE) out$coef <- rename(out$term) calls_cols <- paste0("calls_", all_sp_types()) for (col in c(calls_cols, "joint_call", "vars_mi", "Imo")) { out[[col]] <- vector("list", nrow(out)) } kmo <- 0 terms_split <- strsplit(out$term, ":") for (i in seq_rows(out)) { # prepare mo terms take_mo <- grepl_expr(regex_sp("mo"), terms_split[[i]]) if (sum(take_mo)) { out$calls_mo[[i]] <- terms_split[[i]][take_mo] nmo <- length(out$calls_mo[[i]]) out$Imo[[i]] <- (kmo + 1):(kmo + nmo) kmo <- kmo + nmo for (j in seq_along(out$calls_mo[[i]])) { mo_term <- out$calls_mo[[i]][[j]] mo_match <- get_matches_expr(regex_sp("mo"), mo_term) if (length(mo_match) > 1L || nchar(mo_match) < nchar(mo_term)) { stop2("The monotonic term '", mo_term, "' is invalid.") } } } # prepare me terms take_me <- grepl_expr(regex_sp("me"), terms_split[[i]]) if (sum(take_me)) { out$calls_me[[i]] <- terms_split[[i]][take_me] # remove 'I' (identity) function calls that # were used solely to separate formula terms out$calls_me[[i]] <- gsub("^I\\(", "(", out$calls_me[[i]]) } # prepare mi terms take_mi <- grepl_expr(regex_sp("mi"), terms_split[[i]]) if (sum(take_mi)) { mi_parts <- terms_split[[i]][take_mi] out$calls_mi[[i]] <- get_matches_expr(regex_sp("mi"), mi_parts) out$vars_mi[[i]] <- all_vars(str2formula(out$calls_mi[[i]])) # do it like parse_resp to ensure correct matching out$vars_mi[[i]] <- gsub("\\.|_", "", make.names(out$vars_mi[[i]])) } has_sp_calls <- grepl_expr(regex_sp(all_sp_types()), terms_split[[i]]) sp_calls <- sub("^I\\(", "(", terms_split[[i]][has_sp_calls]) out$joint_call[[i]] <- paste0(sp_calls, collapse = " * ") out$Ic[i] <- any(!has_sp_calls) } not_one <- apply(mm, 2, function(x) any(x != 1)) out$Ic <- cumsum(out$Ic | not_one) out } # extract names of monotonic simplex parameters # @param spef output of tidy_spef get_simo_labels <- function(spef) { fun <- function(i) paste0(spef$coef[i], seq_along(spef$Imo[[i]])) ulapply(which(lengths(spef$Imo) > 0), fun) } # standard errors of variables with missing values get_sdy <- function(x, data = NULL) { stopifnot(is.brmsterms(x)) miform <- x$adforms[["mi"]] sdy <- NULL if (is.formula(miform)) { mi <- eval_rhs(miform) if (mi$vars$sdy != "NA") { sdy <- eval2(mi$vars$sdy, data) if (!is.null(sdy) && !is.numeric(sdy)) { stop2("Measurement error should be numeric.") } if (isTRUE(any(sdy <= 0))) { stop2("Measurement error should be positive.") } } } sdy } # names of grouping variables used in measurement error terms get_me_groups <- function(x) { uni_me <- get_uni_me(x) out <- lapply(uni_me, eval2) out <- ulapply(out, "[[", "gr") out[nzchar(out)] } # get the design matrix of special effects terms # @param formula a formula containing special effects terms # @param data data.frame passed by the user # @param types types of special terms to consider # @param ... passed to get_model_matrix # @details special terms will be evaluated to 1 so that columns # containing not only ones are those with covariates # @return design matrix of special effects terms and their covariates sp_model_matrix <- function(formula, data, types = all_sp_types(), ...) { attributes(data)$terms <- NULL terms_split <- strsplit(all_terms(formula), split = ":") terms_unique <- unique(unlist(terms_split)) regex <- regex_sp(types) terms_replace <- terms_unique[grepl_expr(regex, terms_unique)] dummies <- paste0("dummy", seq_along(terms_replace), "__") data[dummies] <- list(1) terms_comb <- rep(NA, length(terms_split)) # loop over terms and add dummy variables for (i in seq_along(terms_split)) { replace_i <- grepl_expr(regex, terms_split[[i]]) terms_i_replace <- terms_split[[i]][replace_i] dummies_i <- dummies[match(terms_i_replace, terms_replace)] terms_split[[i]][replace_i] <- dummies_i terms_comb[i] <- paste0(terms_split[[i]], collapse = ":") } new_formula <- str2formula(terms_comb) attributes(new_formula) <- attributes(formula) out <- get_model_matrix(new_formula, data, ...) # recover original column names colnames(out) <- rename(colnames(out), dummies, terms_replace) out } # formula of variables used in special effects terms sp_fake_formula <- function(...) { dots <- c(...) out <- vector("list", length(dots)) for (i in seq_along(dots)) { tmp <- eval2(dots[[i]]) out[[i]] <- all_vars(c(tmp$term, tmp$sdx, tmp$gr)) } str2formula(unique(unlist(out))) } # extract an me variable get_me_values <- function(term, data) { term <- get_sp_term(term) stopifnot(is.me_term(term)) x <- as.vector(eval2(term$term, data)) if (!is.numeric(x)) { stop2("Noisy variables should be numeric.") } as.array(x) } # extract the measurement error of an me term get_me_noise <- function(term, data) { term <- get_sp_term(term) stopifnot(is.me_term(term)) sdx <- as.vector(eval2(term$sdx, data)) if (length(sdx) == 0L) { stop2("Argument 'sdx' is missing in function 'me'.") } else if (length(sdx) == 1L) { sdx <- rep(sdx, nrow(data)) } if (!is.numeric(sdx)) { stop2("Measurement error should be numeric.") } if (isTRUE(any(sdx <= 0))) { stop2("Measurement error should be positive.") } as.array(sdx) } # extract the grouping variable of an me term get_me_group <- function(term, data) { term <- get_sp_term(term) stopifnot(is.me_term(term)) as.array(eval2(term$gr, data)) } # extract mo variables get_mo_values <- function(term, data) { term <- get_sp_term(term) stopifnot(is.mo_term(term)) x <- eval2(term$term, data) if (is.ordered(x)) { # counting starts at zero x <- as.numeric(x) - 1 } else if (all(is_wholenumber(x))) { min_value <- attr(x, "min") if (is.null(min_value)) { min_value <- min(x) } x <- x - min_value } else { stop2( "Monotonic predictors must be integers or ordered ", "factors. Error occured for variable '", term$term, "'." ) } as.array(x) } # prepare 'sp_term' objects get_sp_term <- function(term) { if (!is.sp_term(term)) { term <- eval2(as_one_character(term)) } term } # all effects which fall under the 'sp' category of brms all_sp_types <- function() { c("mo", "me", "mi") } # classes used to set up special effects terms is.sp_term <- function(x) { inherits(x, "sp_term") } is.mo_term <- function(x) { inherits(x, "mo_term") } is.me_term <- function(x) { inherits(x, "me_term") } is.mi_term <- function(x) { inherits(x, "mi_term") } brms/R/posterior_predict.R0000644000176200001440000010164313615316227015314 0ustar liggesusers#' Samples from the Posterior Predictive Distribution #' #' Compute posterior samples of the posterior predictive distribution. Can be #' performed for the data used to fit the model (posterior predictive checks) or #' for new data. By definition, these samples have higher variance than samples #' of the means of the posterior predictive distribution computed by #' \code{\link{posterior_predict.brmsfit}}. This is because the residual error #' is incorporated in \code{posterior_predict}. However, the estimated means of #' both methods averaged across samples should be very similar. #' #' @inheritParams extract_draws #' @param object An object of class \code{brmsfit}. #' @param re.form Alias of \code{re_formula}. #' @param transform A function or a character string naming #' a function to be applied on the predicted responses #' before summary statistics are computed. #' @param negative_rt Only relevant for Wiener diffusion models. #' A flag indicating whether response times of responses #' on the lower boundary should be returned as negative values. #' This allows to distinguish responses on the upper and #' lower boundary. Defaults to \code{FALSE}. #' @param sort Logical. Only relevant for time series models. #' Indicating whether to return predicted values in the original #' order (\code{FALSE}; default) or in the order of the #' time series (\code{TRUE}). #' @param ntrys Parameter used in rejection sampling #' for truncated discrete models only #' (defaults to \code{5}). See Details for more information. #' @param ... Further arguments passed to \code{\link{extract_draws}} #' that control several aspects of data validation and prediction. #' #' @return An \code{array} of predicted response values. If \code{summary = #' FALSE}, the output is as an S x N matrix, where S is the number of #' posterior samples and N is the number of observations. In multivariate #' models, an additional dimension is added to the output which indexes along #' the different response variables. #' #' @details \code{NA} values within factors in \code{newdata}, #' are interpreted as if all dummy variables of this factor are #' zero. This allows, for instance, to make predictions of the grand mean #' when using sum coding. #' #' For truncated discrete models only: In the absence of any general algorithm #' to sample from truncated discrete distributions, rejection sampling is #' applied in this special case. This means that values are sampled until a #' value lies within the defined truncation boundaries. In practice, this #' procedure may be rather slow (especially in \R). Thus, we try to do #' approximate rejection sampling by sampling each value \code{ntrys} times #' and then select a valid value. If all values are invalid, the closest #' boundary is used, instead. If there are more than a few of these #' pathological cases, a warning will occur suggesting to increase argument #' \code{ntrys}. #' #' @examples #' \dontrun{ #' ## fit a model #' fit <- brm(time | cens(censored) ~ age + sex + (1 + age || patient), #' data = kidney, family = "exponential", inits = "0") #' #' ## predicted responses #' pp <- posterior_predict(fit) #' str(pp) #' #' ## predicted responses excluding the group-level effect of age #' pp <- posterior_predict(fit, re_formula = ~ (1 | patient)) #' str(pp) #' #' ## predicted responses of patient 1 for new data #' newdata <- data.frame( #' sex = factor(c("male", "female")), #' age = c(20, 50), #' patient = c(1, 1) #' ) #' pp <- posterior_predict(fit, newdata = newdata) #' str(pp) #' } #' #' @aliases posterior_predict #' @method posterior_predict brmsfit #' @importFrom rstantools posterior_predict #' @export #' @export posterior_predict posterior_predict.brmsfit <- function( object, newdata = NULL, re_formula = NULL, re.form = NULL, transform = NULL, resp = NULL, negative_rt = FALSE, nsamples = NULL, subset = NULL, sort = FALSE, ntrys = 5, ... ) { cl <- match.call() if ("re.form" %in% names(cl)) { re_formula <- re.form } contains_samples(object) object <- restructure(object) draws <- extract_draws( object, newdata = newdata, re_formula = re_formula, resp = resp, nsamples = nsamples, subset = subset, check_response = FALSE, ... ) posterior_predict( draws, transform = transform, sort = sort, ntrys = ntrys, negative_rt = negative_rt, summary = FALSE ) } #' @export posterior_predict.mvbrmsdraws <- function(object, ...) { if (length(object$mvpars$rescor)) { object$mvpars$Mu <- get_Mu(object) object$mvpars$Sigma <- get_Sigma(object) out <- posterior_predict.brmsdraws(object, ...) } else { out <- lapply(object$resps, posterior_predict, ...) along <- ifelse(length(out) > 1L, 3, 2) out <- do_call(abind, c(out, along = along)) } out } #' @export posterior_predict.brmsdraws <- function(object, transform = NULL, sort = FALSE, summary = FALSE, robust = FALSE, probs = c(0.025, 0.975), ...) { for (nlp in names(object$nlpars)) { object$nlpars[[nlp]] <- get_nlpar(object, nlpar = nlp) } for (dp in names(object$dpars)) { object$dpars[[dp]] <- get_dpar(object, dpar = dp) } pp_fun <- paste0("posterior_predict_", object$family$fun) pp_fun <- get(pp_fun, asNamespace("brms")) N <- choose_N(object) out <- lapply(seq_len(N), pp_fun, draws = object, ...) if (grepl("_mv$", object$family$fun)) { out <- do_call(abind, c(out, along = 3)) out <- aperm(out, perm = c(1, 3, 2)) dimnames(out)[[3]] <- names(object$resps) } else if (has_multicol(object$family)) { out <- do_call(abind, c(out, along = 3)) out <- aperm(out, perm = c(1, 3, 2)) dimnames(out)[[3]] <- object$cats } else { out <- do_call(cbind, out) } colnames(out) <- NULL if (use_int(object$family)) { out <- check_discrete_trunc_bounds( out, lb = object$data$lb, ub = object$data$ub ) } out <- reorder_obs(out, object$old_order, sort = sort) # transform predicted response samples before summarizing them if (!is.null(transform)) { out <- do_call(transform, list(out)) } attr(out, "levels") <- object$cats summary <- as_one_logical(summary) if (summary) { # only for compatibility with the 'predict' method if (is_ordinal(object$family)) { levels <- seq_len(max(object$data$nthres) + 1) out <- posterior_table(out, levels = levels) } else if (is_categorical(object$family)) { levels <- seq_len(object$data$ncat) out <- posterior_table(out, levels = levels) } else { out <- posterior_summary(out, probs = probs, robust = robust) } } out } #' Samples from the Posterior Predictive Distribution #' #' This method is an alias of \code{\link{posterior_predict.brmsfit}} #' with additional arguments for obtaining summaries of the computed samples. #' #' @inheritParams posterior_predict.brmsfit #' @param summary Should summary statistics be returned #' instead of the raw values? Default is \code{TRUE}. #' @param robust If \code{FALSE} (the default) the mean is used as #' the measure of central tendency and the standard deviation as #' the measure of variability. If \code{TRUE}, the median and the #' median absolute deviation (MAD) are applied instead. #' Only used if \code{summary} is \code{TRUE}. #' @param probs The percentiles to be computed by the \code{quantile} #' function. Only used if \code{summary} is \code{TRUE}. #' #' @return An \code{array} of predicted response values. #' If \code{summary = FALSE} the output resembles those of #' \code{\link{posterior_predict.brmsfit}}. #' #' If \code{summary = TRUE} the output depends on the family: For categorical #' and ordinal families, the output is an N x C matrix, where N is the number #' of observations, C is the number of categories, and the values are #' predicted category probabilites. For all other families, the output is a N #' x E matrix where E = \code{2 + length(probs)} is the number of summary #' statistics: The \code{Estimate} column contains point estimates (either #' mean or median depending on argument \code{robust}), while the #' \code{Est.Error} column contains uncertainty estimates (either standard #' deviation or median absolute deviation depending on argument #' \code{robust}). The remaining columns starting with \code{Q} contain #' quantile estimates as specifed via argument \code{probs}. #' #' @seealso \code{\link{posterior_predict.brmsfit}} #' #' @examples #' \dontrun{ #' ## fit a model #' fit <- brm(time | cens(censored) ~ age + sex + (1 + age || patient), #' data = kidney, family = "exponential", inits = "0") #' #' ## predicted responses #' pp <- predict(fit) #' head(pp) #' #' ## predicted responses excluding the group-level effect of age #' pp <- predict(fit, re_formula = ~ (1 | patient)) #' head(pp) #' #' ## predicted responses of patient 1 for new data #' newdata <- data.frame( #' sex = factor(c("male", "female")), #' age = c(20, 50), #' patient = c(1, 1) #' ) #' predict(fit, newdata = newdata) #' } #' #' @export predict.brmsfit <- function(object, newdata = NULL, re_formula = NULL, transform = NULL, resp = NULL, negative_rt = FALSE, nsamples = NULL, subset = NULL, sort = FALSE, ntrys = 5, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) { contains_samples(object) object <- restructure(object) draws <- extract_draws( object, newdata = newdata, re_formula = re_formula, resp = resp, nsamples = nsamples, subset = subset, check_response = FALSE, ... ) posterior_predict( draws, transform = transform, ntrys = ntrys, negative_rt = negative_rt, sort = sort, summary = summary, robust = robust, probs = probs ) } #' Predictive Intervals #' #' Compute intervals from the posterior predictive distribution. #' #' @aliases predictive_interval #' #' @param object An \R object of class \code{brmsfit}. #' @param prob A number p (0 < p < 1) indicating the desired probability mass to #' include in the intervals. Defaults to \code{0.9}. #' @param ... Further arguments passed to \code{\link{posterior_predict}}. #' #' @return A matrix with 2 columns for the lower and upper bounds of the #' intervals, respectively, and as many rows as observations being predicted. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zBase, data = epilepsy, family = poisson()) #' predictive_interval(fit) #' } #' #' @importFrom rstantools predictive_interval #' @export predictive_interval #' @export predictive_interval.brmsfit <- function(object, prob = 0.9, ...) { out <- posterior_predict(object, ...) predictive_interval(out, prob = prob) } # validate method name to obtain posterior predictions # @param method name of the method # @return validated name of the method validate_pp_method <- function(method) { method <- as_one_character(method) if (method %in% c("posterior_predict", "predict", "pp")) { method <- "posterior_predict" } else if (method %in% c("pp_expect", "fitted")) { method <- "pp_expect" } else if (method %in% c("predictive_error", "residuals")) { method <- "predictive_error" } else { stop2("Posterior predictive method '", method, "' it not supported.") } method } # ------------------- family specific posterior_predict methods --------------------- # All posterior_predict_ functions have the same arguments structure # @param i the column of draws to use that is the ith obervation # in the initial data.frame # @param draws A named list returned by extract_draws containing # all required data and samples # @param ... ignored arguments # @param A vector of length draws$nsamples containing samples # from the posterior predictive distribution posterior_predict_gaussian <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "norm", mean = get_dpar(draws, "mu", i = i), sd = get_dpar(draws, "sigma", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_student <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "student_t", df = get_dpar(draws, "nu", i = i), mu = get_dpar(draws, "mu", i = i), sigma = get_dpar(draws, "sigma", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_lognormal <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "lnorm", meanlog = get_dpar(draws, "mu", i = i), sdlog = get_dpar(draws, "sigma", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_shifted_lognormal <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "shifted_lnorm", meanlog = get_dpar(draws, "mu", i = i), sdlog = get_dpar(draws, "sigma", i = i), shift = get_dpar(draws, "ndt", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_skew_normal <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "skew_normal", mu = get_dpar(draws, "mu", i = i), sigma = get_dpar(draws, "sigma", i = i), alpha = get_dpar(draws, "alpha", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_gaussian_mv <- function(i, draws, ...) { Mu <- get_Mu(draws, i = i) Sigma <- get_Sigma(draws, i = i) .predict <- function(s) { rmulti_normal(1, mu = Mu[s, ], Sigma = Sigma[s, , ]) } rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_student_mv <- function(i, draws, ...) { nu <- get_dpar(draws, "nu", i = i) Mu <- get_Mu(draws, i = i) Sigma <- get_Sigma(draws, i = i) .predict <- function(s) { rmulti_student_t(1, df = nu[s], mu = Mu[s, ], Sigma = Sigma[s, , ]) } rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_gaussian_time <- function(i, draws, ...) { obs <- with(draws$ac, begin_tg[i]:end_tg[i]) mu <- as.matrix(get_dpar(draws, "mu", i = obs)) Sigma <- get_cov_matrix_ac(draws, obs) .predict <- function(s) { rmulti_normal(1, mu = mu[s, ], Sigma = Sigma[s, , ]) } rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_student_time <- function(i, draws, ...) { obs <- with(draws$ac, begin_tg[i]:end_tg[i]) nu <- as.matrix(get_dpar(draws, "nu", i = obs)) mu <- as.matrix(get_dpar(draws, "mu", i = obs)) Sigma <- get_cov_matrix_ac(draws, obs) .predict <- function(s) { rmulti_student_t(1, df = nu[s, ], mu = mu[s, ], Sigma = Sigma[s, , ]) } rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_gaussian_lagsar <- function(i, draws, ...) { stopifnot(i == 1) .predict <- function(s) { M_new <- with(draws, diag(nobs) - ac$lagsar[s] * ac$Msar) mu <- as.numeric(solve(M_new) %*% mu[s, ]) Sigma <- solve(crossprod(M_new)) * sigma[s]^2 rmulti_normal(1, mu = mu, Sigma = Sigma) } mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_student_lagsar <- function(i, draws, ...) { stopifnot(i == 1) .predict <- function(s) { M_new <- with(draws, diag(nobs) - ac$lagsar[s] * ac$Msar) mu <- as.numeric(solve(M_new) %*% mu[s, ]) Sigma <- solve(crossprod(M_new)) * sigma[s]^2 rmulti_student_t(1, df = nu[s], mu = mu, Sigma = Sigma) } mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") nu <- get_dpar(draws, "nu") rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_gaussian_errorsar <- function(i, draws, ...) { stopifnot(i == 1) .predict <- function(s) { M_new <- with(draws, diag(nobs) - ac$errorsar[s] * ac$Msar) Sigma <- solve(crossprod(M_new)) * sigma[s]^2 rmulti_normal(1, mu = mu[s, ], Sigma = Sigma) } mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_student_errorsar <- function(i, draws, ...) { stopifnot(i == 1) .predict <- function(s) { M_new <- with(draws, diag(nobs) - ac$errorsar[s] * ac$Msar) Sigma <- solve(crossprod(M_new)) * sigma[s]^2 rmulti_student_t(1, df = nu[s], mu = mu[s, ], Sigma = Sigma) } mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") nu <- get_dpar(draws, "nu") rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_gaussian_fcor <- function(i, draws, ...) { stopifnot(i == 1) mu <- as.matrix(get_dpar(draws, "mu")) Sigma <- get_cov_matrix_ac(draws) .predict <- function(s) { rmulti_normal(1, mu = mu[s, ], Sigma = Sigma[s, , ]) } rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_student_fcor <- function(i, draws, ...) { stopifnot(i == 1) nu <- as.matrix(get_dpar(draws, "nu")) mu <- as.matrix(get_dpar(draws, "mu")) Sigma <- get_cov_matrix_ac(draws) .predict <- function(s) { rmulti_student_t(1, df = nu[s, ], mu = mu[s, ], Sigma = Sigma[s, , ]) } rblapply(seq_len(draws$nsamples), .predict) } posterior_predict_binomial <- function(i, draws, ntrys = 5, ...) { rdiscrete( n = draws$nsamples, dist = "binom", size = draws$data$trials[i], prob = get_dpar(draws, "mu", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i], ntrys = ntrys ) } posterior_predict_bernoulli <- function(i, draws, ...) { mu <- get_dpar(draws, "mu", i = i) rbinom(length(mu), size = 1, prob = mu) } posterior_predict_poisson <- function(i, draws, ntrys = 5, ...) { rdiscrete( n = draws$nsamples, dist = "pois", lambda = get_dpar(draws, "mu", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i], ntrys = ntrys ) } posterior_predict_negbinomial <- function(i, draws, ntrys = 5, ...) { rdiscrete( n = draws$nsamples, dist = "nbinom", mu = get_dpar(draws, "mu", i = i), size = get_dpar(draws, "shape", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i], ntrys = ntrys ) } posterior_predict_geometric <- function(i, draws, ntrys = 5, ...) { rdiscrete( n = draws$nsamples, dist = "nbinom", mu = get_dpar(draws, "mu", i = i), size = 1, lb = draws$data$lb[i], ub = draws$data$ub[i], ntrys = ntrys ) } posterior_predict_discrete_weibull <- function(i, draws, ntrys = 5, ...) { rdiscrete( n = draws$nsamples, dist = "discrete_weibull", mu = get_dpar(draws, "mu", i = i), shape = get_dpar(draws, "shape", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i], ntrys = ntrys ) } posterior_predict_com_poisson <- function(i, draws, ntrys = 5, ...) { rdiscrete( n = draws$nsamples, dist = "com_poisson", mu = get_dpar(draws, "mu", i = i), shape = get_dpar(draws, "shape", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i], ntrys = ntrys ) } posterior_predict_exponential <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "exp", rate = 1 / get_dpar(draws, "mu", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_gamma <- function(i, draws, ...) { shape <- get_dpar(draws, "shape", i = i) scale <- get_dpar(draws, "mu", i = i) / shape rcontinuous( n = draws$nsamples, dist = "gamma", shape = shape, scale = scale, lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_weibull <- function(i, draws, ...) { shape <- get_dpar(draws, "shape", i = i) scale <- get_dpar(draws, "mu", i = i) / gamma(1 + 1 / shape) rcontinuous( n = draws$nsamples, dist = "weibull", shape = shape, scale = scale, lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_frechet <- function(i, draws, ...) { nu <- get_dpar(draws, "nu", i = i) scale <- get_dpar(draws, "mu", i = i) / gamma(1 - 1 / nu) rcontinuous( n = draws$nsamples, dist = "frechet", scale = scale, shape = nu, lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_gen_extreme_value <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "gen_extreme_value", sigma = get_dpar(draws, "sigma", i = i), xi = get_dpar(draws, "xi", i = i), mu = get_dpar(draws, "mu", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_inverse.gaussian <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "inv_gaussian", mu = get_dpar(draws, "mu", i = i), shape = get_dpar(draws, "shape", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_exgaussian <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "exgaussian", mu = get_dpar(draws, "mu", i = i), sigma = get_dpar(draws, "sigma", i = i), beta = get_dpar(draws, "beta", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_wiener <- function(i, draws, negative_rt = FALSE, ...) { out <- rcontinuous( n = 1, dist = "wiener", delta = get_dpar(draws, "mu", i = i), alpha = get_dpar(draws, "bs", i = i), tau = get_dpar(draws, "ndt", i = i), beta = get_dpar(draws, "bias", i = i), types = if (negative_rt) c("q", "resp") else "q", lb = draws$data$lb[i], ub = draws$data$ub[i] ) if (negative_rt) { # code lower bound responses as negative RTs out <- out[["q"]] * ifelse(out[["resp"]], 1, -1) } out } posterior_predict_beta <- function(i, draws, ...) { mu <- get_dpar(draws, "mu", i = i) phi <- get_dpar(draws, "phi", i = i) rcontinuous( n = draws$nsamples, dist = "beta", shape1 = mu * phi, shape2 = (1 - mu) * phi, lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_von_mises <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "von_mises", mu = get_dpar(draws, "mu", i = i), kappa = get_dpar(draws, "kappa", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_asym_laplace <- function(i, draws, ...) { rcontinuous( n = draws$nsamples, dist = "asym_laplace", mu = get_dpar(draws, "mu", i = i), sigma = get_dpar(draws, "sigma", i = i), quantile = get_dpar(draws, "quantile", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) } posterior_predict_zero_inflated_asym_laplace <- function(i, draws, ...) { zi <- get_dpar(draws, "zi", i = i) tmp <- runif(draws$nsamples, 0, 1) ifelse( tmp < zi, 0, rcontinuous( n = draws$nsamples, dist = "asym_laplace", mu = get_dpar(draws, "mu", i = i), sigma = get_dpar(draws, "sigma", i = i), quantile = get_dpar(draws, "quantile", i = i), lb = draws$data$lb[i], ub = draws$data$ub[i] ) ) } posterior_predict_cox <- function(i, draws, ...) { stop2("Cannot sample from the posterior predictive ", "distribution for family 'cox'.") } posterior_predict_hurdle_poisson <- function(i, draws, ...) { # theta is the bernoulli hurdle parameter theta <- get_dpar(draws, "hu", i = i) lambda <- get_dpar(draws, "mu", i = i) ndraws <- draws$nsamples # compare with theta to incorporate the hurdle process hu <- runif(ndraws, 0, 1) # sample from a truncated poisson distribution # by adjusting lambda and adding 1 t = -log(1 - runif(ndraws) * (1 - exp(-lambda))) ifelse(hu < theta, 0, rpois(ndraws, lambda = lambda - t) + 1) } posterior_predict_hurdle_negbinomial <- function(i, draws, ...) { # theta is the bernoulli hurdle parameter theta <- get_dpar(draws, "hu", i = i) mu <- get_dpar(draws, "mu", i = i) ndraws <- draws$nsamples # compare with theta to incorporate the hurdle process hu <- runif(ndraws, 0, 1) # sample from an approximate(!) truncated negbinomial distribution # by adjusting mu and adding 1 t = -log(1 - runif(ndraws) * (1 - exp(-mu))) shape <- get_dpar(draws, "shape", i = i) ifelse(hu < theta, 0, rnbinom(ndraws, mu = mu - t, size = shape) + 1) } posterior_predict_hurdle_gamma <- function(i, draws, ...) { # theta is the bernoulli hurdle parameter theta <- get_dpar(draws, "hu", i = i) shape <- get_dpar(draws, "shape", i = i) scale <- get_dpar(draws, "mu", i = i) / shape ndraws <- draws$nsamples # compare with theta to incorporate the hurdle process hu <- runif(ndraws, 0, 1) ifelse(hu < theta, 0, rgamma(ndraws, shape = shape, scale = scale)) } posterior_predict_hurdle_lognormal <- function(i, draws, ...) { # theta is the bernoulli hurdle parameter theta <- get_dpar(draws, "hu", i = i) mu <- get_dpar(draws, "mu", i = i) sigma <- get_dpar(draws, "sigma", i = i) ndraws <- draws$nsamples # compare with theta to incorporate the hurdle process hu <- runif(ndraws, 0, 1) ifelse(hu < theta, 0, rlnorm(ndraws, meanlog = mu, sdlog = sigma)) } posterior_predict_zero_inflated_beta <- function(i, draws, ...) { # theta is the bernoulli hurdle parameter theta <- get_dpar(draws, "zi", i = i) mu <- get_dpar(draws, "mu", i = i) phi <- get_dpar(draws, "phi", i = i) # compare with theta to incorporate the hurdle process hu <- runif(draws$nsamples, 0, 1) ifelse( hu < theta, 0, rbeta(draws$nsamples, shape1 = mu * phi, shape2 = (1 - mu) * phi) ) } posterior_predict_zero_one_inflated_beta <- function(i, draws, ...) { zoi <- get_dpar(draws, "zoi", i) coi <- get_dpar(draws, "coi", i) mu <- get_dpar(draws, "mu", i = i) phi <- get_dpar(draws, "phi", i = i) hu <- runif(draws$nsamples, 0, 1) one_or_zero <- runif(draws$nsamples, 0, 1) ifelse(hu < zoi, ifelse(one_or_zero < coi, 1, 0), rbeta(draws$nsamples, shape1 = mu * phi, shape2 = (1 - mu) * phi) ) } posterior_predict_zero_inflated_poisson <- function(i, draws, ...) { # theta is the bernoulli zero-inflation parameter theta <- get_dpar(draws, "zi", i = i) lambda <- get_dpar(draws, "mu", i = i) ndraws <- draws$nsamples # compare with theta to incorporate the zero-inflation process zi <- runif(ndraws, 0, 1) ifelse(zi < theta, 0, rpois(ndraws, lambda = lambda)) } posterior_predict_zero_inflated_negbinomial <- function(i, draws, ...) { # theta is the bernoulli zero-inflation parameter theta <- get_dpar(draws, "zi", i = i) mu <- get_dpar(draws, "mu", i = i) shape <- get_dpar(draws, "shape", i = i) ndraws <- draws$nsamples # compare with theta to incorporate the zero-inflation process zi <- runif(ndraws, 0, 1) ifelse(zi < theta, 0, rnbinom(ndraws, mu = mu, size = shape)) } posterior_predict_zero_inflated_binomial <- function(i, draws, ...) { # theta is the bernoulii zero-inflation parameter theta <- get_dpar(draws, "zi", i = i) trials <- draws$data$trials[i] prob <- get_dpar(draws, "mu", i = i) ndraws <- draws$nsamples # compare with theta to incorporate the zero-inflation process zi <- runif(ndraws, 0, 1) ifelse(zi < theta, 0, rbinom(ndraws, size = trials, prob = prob)) } posterior_predict_categorical <- function(i, draws, ...) { eta <- sapply(names(draws$dpars), get_dpar, draws = draws, i = i) eta <- insert_refcat(eta, family = draws$family) p <- pcategorical(seq_len(draws$data$ncat), eta = eta) first_greater(p, target = runif(draws$nsamples, min = 0, max = 1)) } posterior_predict_multinomial <- function(i, draws, ...) { eta <- sapply(names(draws$dpars), get_dpar, draws = draws, i = i) eta <- insert_refcat(eta, family = draws$family) p <- dcategorical(seq_len(draws$data$ncat), eta = eta) size <- draws$data$trials[i] out <- lapply(seq_rows(p), function(s) t(rmultinom(1, size, p[s, ]))) do_call(rbind, out) } posterior_predict_dirichlet <- function(i, draws, ...) { mu_dpars <- str_subset(names(draws$dpars), "^mu") eta <- sapply(mu_dpars, get_dpar, draws = draws, i = i) eta <- insert_refcat(eta, family = draws$family) phi <- get_dpar(draws, "phi", i = i) cats <- seq_len(draws$data$ncat) alpha <- dcategorical(cats, eta = eta) * phi rdirichlet(draws$nsamples, alpha = alpha) } posterior_predict_cumulative <- function(i, draws, ...) { posterior_predict_ordinal(i = i, draws = draws) } posterior_predict_sratio <- function(i, draws, ...) { posterior_predict_ordinal(i = i, draws = draws) } posterior_predict_cratio <- function(i, draws, ...) { posterior_predict_ordinal(i = i, draws = draws) } posterior_predict_acat <- function(i, draws, ...) { posterior_predict_ordinal(i = i, draws = draws) } posterior_predict_ordinal <- function(i, draws, ...) { thres <- subset_thres(draws, i) nthres <- NCOL(thres) p <- pordinal( seq_len(nthres + 1), eta = get_dpar(draws, "mu", i = i), disc = get_dpar(draws, "disc", i = i), thres = thres, family = draws$family$family, link = draws$family$link ) first_greater(p, target = runif(draws$nsamples, min = 0, max = 1)) } posterior_predict_custom <- function(i, draws, ...) { pp_fun <- draws$family$predict if (!is.function(pp_fun)) { pp_fun <- paste0("posterior_predict_", draws$family$name) pp_fun <- get(pp_fun, draws$family$env) } pp_fun(i = i, draws = draws, ...) } posterior_predict_mixture <- function(i, draws, ...) { families <- family_names(draws$family) theta <- get_theta(draws, i = i) smix <- sample_mixture_ids(theta) out <- rep(NA, draws$nsamples) for (j in seq_along(families)) { sample_ids <- which(smix == j) if (length(sample_ids)) { pp_fun <- paste0("posterior_predict_", families[j]) pp_fun <- get(pp_fun, asNamespace("brms")) tmp_draws <- pseudo_draws_for_mixture(draws, j, sample_ids) out[sample_ids] <- pp_fun(i, tmp_draws, ...) } } out } # ------------ predict helper-functions ---------------------- # random numbers from (possibly truncated) continuous distributions # @param n number of random values to generate # @param dist name of a distribution for which the functions # p, q, and r are available # @param ... additional arguments passed to the distribution functions # @return vector of random values draws from the distribution rcontinuous <- function(n, dist, ..., lb = NULL, ub = NULL) { args <- list(...) if (is.null(lb) && is.null(ub)) { # sample as usual rdist <- paste0("r", dist) out <- do_call(rdist, c(list(n), args)) } else { # sample from truncated distribution if (is.null(lb)) lb <- -Inf if (is.null(ub)) ub <- Inf pdist <- paste0("p", dist) qdist <- paste0("q", dist) plb <- do_call(pdist, c(list(lb), args)) pub <- do_call(pdist, c(list(ub), args)) out <- runif(n, min = plb, max = pub) out <- do_call(qdist, c(list(out), args)) # remove infinte values caused by numerical imprecision out[out %in% c(-Inf, Inf)] <- NA } out } # random numbers from (possibly truncated) discrete distributions # currently rejection sampling is used for truncated distributions # @param n number of random values to generate # @param dist name of a distribution for which the functions # p, q, and r are available # @param ... additional arguments passed to the distribution functions # @param lb optional lower truncation bound # @param ub optional upper truncation bound # @param ntrys number of trys in rejection sampling for truncated models # @return a vector of random values draws from the distribution rdiscrete <- function(n, dist, ..., lb = NULL, ub = NULL, ntrys = 5) { args <- list(...) rdist <- paste0("r", dist) if (is.null(lb) && is.null(ub)) { # sample as usual out <- do_call(rdist, c(list(n), args)) } else { # sample from truncated distribution via rejection sampling if (is.null(lb)) lb <- -Inf if (is.null(ub)) ub <- Inf out <- vector("list", ntrys) for (i in seq_along(out)) { # loop of the trys to prevent a mismatch between 'n' # and length of the parameter vectors passed as arguments out[[i]] <- as.vector(do_call(rdist, c(list(n), args))) } out <- do_call(cbind, out) out <- apply(out, 1, extract_valid_sample, lb = lb, ub = ub) } out } # sample from the IDs of the mixture components sample_mixture_ids <- function(theta) { stopifnot(is.matrix(theta)) mix_comp <- seq_cols(theta) ulapply(seq_rows(theta), function(s) sample(mix_comp, 1, prob = theta[s, ]) ) } # extract the first valid predicted value per Stan sample per observation # @param x draws to be check against truncation boundaries # @param lb vector of lower bounds # @param ub vector of upper bound # @return a valid truncated sample or else the closest boundary extract_valid_sample <- function(x, lb, ub) { valid <- match(TRUE, x >= lb & x <= ub) if (is.na(valid)) { # no valid truncated value found # set sample to lb or ub # 1e-10 is only to identify the invalid draws later on out <- ifelse(max(x) < lb, lb - 1e-10, ub + 1e-10) } else { out <- x[valid] } out } # check for invalid predictions of truncated discrete models # @param x matrix of predicted values # @param lb optional lower truncation bound # @param ub optional upper truncation bound # @param thres threshold (in %) of invalid values at which to warn the user # @return rounded values of 'x' check_discrete_trunc_bounds <- function(x, lb = NULL, ub = NULL, thres = 0.01) { if (is.null(lb) && is.null(ub)) { return(x) } if (is.null(lb)) lb <- -Inf if (is.null(ub)) ub <- Inf thres <- as_one_numeric(thres) # ensure correct comparison with vector bounds y <- as.vector(t(x)) pct_invalid <- mean(y < lb | y > ub, na.rm = TRUE) if (pct_invalid >= thres) { warning2( round(pct_invalid * 100), "% of all predicted values ", "were invalid. Increasing argument 'ntrys' may help." ) } round(x) } brms/R/pp_expect.R0000644000176200001440000006226213621231013013530 0ustar liggesusers#' Expected Values of the Posterior Predictive Distribution #' #' Compute posterior samples of the expected value/mean of the posterior #' predictive distribution. Can be performed for the data used to fit the model #' (posterior predictive checks) or for new data. By definition, these #' predictions have smaller variance than the posterior predictions performed by #' the \code{\link{posterior_predict.brmsfit}} method. This is because only the #' uncertainty in the mean is incorporated in the samples computed by #' \code{pp_expect} while any residual error is ignored. However, the estimated #' means of both methods averaged across samples should be very similar. #' #' @inheritParams posterior_predict.brmsfit #' @param dpar Optional name of a predicted distributional parameter. #' If specified, fitted values of this parameters are returned. #' @param nlpar Optional name of a predicted non-linear parameter. #' If specified, fitted values of this parameters are returned. #' #' @return An \code{array} of predicted \emph{mean} response values. For #' categorical and ordinal models, the output is an S x N x C array. #' Otherwise, the output is an S x N matrix, where S is the number of #' posterior samples, N is the number of observations, and C is the number of #' categories. In multivariate models, an additional dimension is added to the #' output which indexes along the different response variables. #' #' @details \code{NA} values within factors in \code{newdata}, #' are interpreted as if all dummy variables of this factor are #' zero. This allows, for instance, to make predictions of the grand mean #' when using sum coding. #' #' @examples #' \dontrun{ #' ## fit a model #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' #' ## extract fitted values #' ppe <- pp_expect(fit) #' str(ppe) #' } #' #' @export pp_expect.brmsfit <- function(object, newdata = NULL, re_formula = NULL, re.form = NULL, resp = NULL, dpar = NULL, nlpar = NULL, nsamples = NULL, subset = NULL, sort = FALSE, ...) { cl <- match.call() if ("re.form" %in% names(cl)) { re_formula <- re.form } contains_samples(object) object <- restructure(object) draws <- extract_draws( object, newdata = newdata, re_formula = re_formula, resp = resp, nsamples = nsamples, subset = subset, check_response = FALSE, ... ) pp_expect( draws, scale = "response", dpar = dpar, nlpar = nlpar, sort = sort, summary = FALSE ) } #' @rdname pp_expect.brmsfit #' @export pp_expect <- function(object, ...) { UseMethod("pp_expect") } #' @export pp_expect.mvbrmsdraws <- function(object, ...) { out <- lapply(object$resps, pp_expect, ...) along <- ifelse(length(out) > 1L, 3, 2) do_call(abind, c(out, along = along)) } #' @export pp_expect.brmsdraws <- function(object, scale, dpar, nlpar, sort, summary, robust, probs, ...) { dpars <- names(object$dpars) nlpars <- names(object$nlpars) if (length(dpar)) { # predict a distributional parameter dpar <- as_one_character(dpar) if (!dpar %in% dpars) { stop2("Invalid argument 'dpar'. Valid distributional ", "parameters are: ", collapse_comma(dpars)) } if (length(nlpar)) { stop2("Cannot use 'dpar' and 'nlpar' at the same time.") } predicted <- is.bdrawsl(object$dpars[[dpar]]) || is.bdrawsnl(object$dpars[[dpar]]) if (predicted) { # parameter varies across observations if (scale == "linear") { object$dpars[[dpar]]$family$link <- "identity" } if (is_ordinal(object$family)) { object$dpars[[dpar]]$cs <- NULL object$family <- object$dpars[[dpar]]$family <- .dpar_family(link = object$dpars[[dpar]]$family$link) } if (dpar_class(dpar) == "theta" && scale == "response") { ap_id <- as.numeric(dpar_id(dpar)) out <- get_theta(object)[, , ap_id, drop = FALSE] dim(out) <- dim(out)[c(1, 2)] } else { out <- get_dpar(object, dpar = dpar, ilink = TRUE) } } else { # parameter is constant across observations out <- object$dpars[[dpar]] out <- matrix(out, nrow = object$nsamples, ncol = object$nobs) } } else if (length(nlpar)) { # predict a non-linear parameter nlpar <- as_one_character(nlpar) if (!nlpar %in% nlpars) { stop2("Invalid argument 'nlpar'. Valid non-linear ", "parameters are: ", collapse_comma(nlpars)) } out <- get_nlpar(object, nlpar = nlpar) } else { # predict the mean of the response distribution if (scale == "response") { for (nlp in nlpars) { object$nlpars[[nlp]] <- get_nlpar(object, nlpar = nlp) } for (dp in dpars) { object$dpars[[dp]] <- get_dpar(object, dpar = dp) } if (is_trunc(object)) { out <- pp_expect_trunc(object) } else { pp_expect_fun <- paste0("pp_expect_", object$family$family) pp_expect_fun <- get(pp_expect_fun, asNamespace("brms")) out <- pp_expect_fun(object) } } else { if (conv_cats_dpars(object$family)) { mus <- dpars[grepl("^mu", dpars)] } else { mus <- dpars[dpar_class(dpars) %in% "mu"] } if (length(mus) == 1L) { out <- get_dpar(object, dpar = mus, ilink = FALSE) } else { # multiple mu parameters in categorical or mixture models out <- lapply(mus, get_dpar, draws = object, ilink = FALSE) out <- abind::abind(out, along = 3) } } } if (is.null(dim(out))) { out <- as.matrix(out) } colnames(out) <- NULL out <- reorder_obs(out, object$old_order, sort = sort) if (summary) { # only for compatibility with the 'fitted' method out <- posterior_summary(out, probs = probs, robust = robust) if (has_cat(object$family) && length(dim(out)) == 3L) { if (scale == "linear") { dimnames(out)[[3]] <- paste0("eta", seq_dim(out, 3)) } else { dimnames(out)[[3]] <- paste0("P(Y = ", dimnames(out)[[3]], ")") } } } out } #' Expected Values of the Posterior Predictive Distribution #' #' This method is an alias of \code{\link{pp_expect.brmsfit}} #' with additional arguments for obtaining summaries of the computed samples. #' #' @inheritParams pp_expect.brmsfit #' @param object An object of class \code{brmsfit}. #' @param scale Either \code{"response"} or \code{"linear"}. #' If \code{"response"}, results are returned on the scale #' of the response variable. If \code{"linear"}, #' results are returned on the scale of the linear predictor term, #' that is without applying the inverse link function or #' other transformations. #' @param summary Should summary statistics be returned #' instead of the raw values? Default is \code{TRUE}.. #' @param robust If \code{FALSE} (the default) the mean is used as #' the measure of central tendency and the standard deviation as #' the measure of variability. If \code{TRUE}, the median and the #' median absolute deviation (MAD) are applied instead. #' Only used if \code{summary} is \code{TRUE}. #' @param probs The percentiles to be computed by the \code{quantile} #' function. Only used if \code{summary} is \code{TRUE}. #' #' @return An \code{array} of predicted \emph{mean} response values. #' If \code{summary = FALSE} the output resembles those of #' \code{\link{pp_expect.brmsfit}}. #' #' If \code{summary = TRUE} the output depends on the family: For categorical #' and ordinal families, the output is an N x E x C array, where N is the #' number of observations, E is the number of summary statistics, and C is the #' number of categories. For all other families, the output is an N x E #' matrix. The number of summary statistics E is equal to \code{2 + #' length(probs)}: The \code{Estimate} column contains point estimates (either #' mean or median depending on argument \code{robust}), while the #' \code{Est.Error} column contains uncertainty estimates (either standard #' deviation or median absolute deviation depending on argument #' \code{robust}). The remaining columns starting with \code{Q} contain #' quantile estimates as specifed via argument \code{probs}. #' #' In multivariate models, an additional dimension is added to the output #' which indexes along the different response variables. #' #' @seealso \code{\link{pp_expect.brmsfit}} #' #' @examples #' \dontrun{ #' ## fit a model #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' #' ## extract fitted values #' fitted_values <- fitted(fit) #' head(fitted_values) #' #' ## plot fitted means against actual response #' dat <- as.data.frame(cbind(Y = standata(fit)$Y, fitted_values)) #' ggplot(dat) + geom_point(aes(x = Estimate, y = Y)) #' } #' #' @export fitted.brmsfit <- function(object, newdata = NULL, re_formula = NULL, scale = c("response", "linear"), resp = NULL, dpar = NULL, nlpar = NULL, nsamples = NULL, subset = NULL, sort = FALSE, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) { scale <- match.arg(scale) summary <- as_one_logical(summary) contains_samples(object) object <- restructure(object) draws <- extract_draws( object, newdata = newdata, re_formula = re_formula, resp = resp, nsamples = nsamples, subset = subset, check_response = FALSE, ... ) pp_expect( draws, scale = scale, dpar = dpar, nlpar = nlpar, sort = sort, summary = summary, robust = robust, probs = probs ) } #' Posterior Samples of the Linear Predictor #' #' Compute posterior samples of the linear predictor, that is samples before #' applying any link functions or other transformations. Can be performed for #' the data used to fit the model (posterior predictive checks) or for new data. #' #' @inheritParams pp_expect.brmsfit #' @param object An object of class \code{brmsfit}. #' @param transform (Deprecated) Logical; if \code{FALSE} #' (the default), samples of the linear predictor are returned. #' If \code{TRUE}, samples of transformed linear predictor, #' that is, the mean of the posterior predictive distribution #' are returned instead (see \code{\link{pp_expect}} for details). #' Only implemented for compatibility with the #' \code{\link[rstantools:posterior_linpred]{posterior_linpred}} #' generic. #' #' @seealso \code{\link{pp_expect.brmsfit}} #' #' @examples #' \dontrun{ #' ## fit a model #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler) #' #' ## extract linear predictor values #' pl <- posterior_linpred(fit) #' str(pl) #' } #' #' @aliases posterior_linpred #' @method posterior_linpred brmsfit #' @importFrom rstantools posterior_linpred #' @export #' @export posterior_linpred posterior_linpred.brmsfit <- function( object, transform = FALSE, newdata = NULL, re_formula = NULL, re.form = NULL, resp = NULL, dpar = NULL, nlpar = NULL, nsamples = NULL, subset = NULL, sort = FALSE, ... ) { cl <- match.call() if ("re.form" %in% names(cl)) { re_formula <- re.form } scale <- "linear" transform <- as_one_logical(transform) if (transform) { warning2("posterior_linpred(transform = TRUE) is deprecated. Please ", "use pp_expect() instead, without the 'transform' argument.") scale <- "response" } contains_samples(object) object <- restructure(object) draws <- extract_draws( object, newdata = newdata, re_formula = re_formula, resp = resp, nsamples = nsamples, subset = subset, check_response = FALSE, ... ) pp_expect( draws, scale = scale, dpar = dpar, nlpar = nlpar, sort = sort, summary = FALSE ) } # ------------------- family specific pp_expect methods --------------------- # All pp_expect_ functions have the same arguments structure # @param draws A named list returned by extract_draws containing # all required data and samples # @return transformed linear predictor representing the mean # of the response distribution pp_expect_gaussian <- function(draws) { if (!is.null(draws$ac$lagsar)) { draws$dpars$mu <- pp_expect_lagsar(draws) } draws$dpars$mu } pp_expect_student <- function(draws) { if (!is.null(draws$ac$lagsar)) { draws$dpars$mu <- pp_expect_lagsar(draws) } draws$dpars$mu } pp_expect_skew_normal <- function(draws) { draws$dpars$mu } pp_expect_lognormal <- function(draws) { with(draws$dpars, exp(mu + sigma^2 / 2)) } pp_expect_shifted_lognormal <- function(draws) { with(draws$dpars, exp(mu + sigma^2 / 2) + ndt) } pp_expect_binomial <- function(draws) { trials <- as_draws_matrix(draws$data$trials, dim_mu(draws)) draws$dpars$mu * trials } pp_expect_bernoulli <- function(draws) { draws$dpars$mu } pp_expect_poisson <- function(draws) { draws$dpars$mu } pp_expect_negbinomial <- function(draws) { draws$dpars$mu } pp_expect_geometric <- function(draws) { draws$dpars$mu } pp_expect_discrete_weibull <- function(draws) { mean_discrete_weibull(draws$dpars$mu, draws$dpars$shape) } pp_expect_com_poisson <- function(draws) { mean_com_poisson(draws$dpars$mu, draws$dpars$shape) } pp_expect_exponential <- function(draws) { draws$dpars$mu } pp_expect_gamma <- function(draws) { draws$dpars$mu } pp_expect_weibull <- function(draws) { draws$dpars$mu } pp_expect_frechet <- function(draws) { draws$dpars$mu } pp_expect_gen_extreme_value <- function(draws) { with(draws$dpars, mu + sigma * (gamma(1 - xi) - 1) / xi) } pp_expect_inverse.gaussian <- function(draws) { draws$dpars$mu } pp_expect_exgaussian <- function(draws) { draws$dpars$mu } pp_expect_wiener <- function(draws) { # mu is the drift rate with(draws$dpars, ndt - bias / mu + bs / mu * (exp(-2 * mu * bias) - 1) / (exp(-2 * mu * bs) - 1) ) } pp_expect_beta <- function(draws) { draws$dpars$mu } pp_expect_von_mises <- function(draws) { draws$dpars$mu } pp_expect_asym_laplace <- function(draws) { with(draws$dpars, mu + sigma * (1 - 2 * quantile) / (quantile * (1 - quantile)) ) } pp_expect_zero_inflated_asym_laplace <- function(draws) { pp_expect_asym_laplace(draws) * (1 - draws$dpars$zi) } pp_expect_cox <- function(draws) { stop2("Cannot compute expected values of the posterior predictive ", "distribution for family 'cox'.") } pp_expect_hurdle_poisson <- function(draws) { with(draws$dpars, mu / (1 - exp(-mu)) * (1 - hu)) } pp_expect_hurdle_negbinomial <- function(draws) { with(draws$dpars, mu / (1 - (shape / (mu + shape))^shape) * (1 - hu)) } pp_expect_hurdle_gamma <- function(draws) { with(draws$dpars, mu * (1 - hu)) } pp_expect_hurdle_lognormal <- function(draws) { with(draws$dpars, exp(mu + sigma^2 / 2) * (1 - hu)) } pp_expect_zero_inflated_poisson <- function(draws) { with(draws$dpars, mu * (1 - zi)) } pp_expect_zero_inflated_negbinomial <- function(draws) { with(draws$dpars, mu * (1 - zi)) } pp_expect_zero_inflated_binomial <- function(draws) { trials <- as_draws_matrix(draws$data$trials, dim_mu(draws)) draws$dpars$mu * trials * (1 - draws$dpars$zi) } pp_expect_zero_inflated_beta <- function(draws) { with(draws$dpars, mu * (1 - zi)) } pp_expect_zero_one_inflated_beta <- function(draws) { with(draws$dpars, zoi * coi + mu * (1 - zoi)) } pp_expect_categorical <- function(draws) { get_probs <- function(i) { eta <- insert_refcat(extract_col(eta, i), family = draws$family) dcategorical(cats, eta = eta) } eta <- abind(draws$dpars, along = 3) cats <- seq_len(draws$data$ncat) out <- abind(lapply(seq_cols(eta), get_probs), along = 3) out <- aperm(out, perm = c(1, 3, 2)) dimnames(out)[[3]] <- draws$cats out } pp_expect_multinomial <- function(draws) { get_counts <- function(i) { eta <- insert_refcat(extract_col(eta, i), family = draws$family) dcategorical(cats, eta = eta) * trials[i] } eta <- abind(draws$dpars, along = 3) cats <- seq_len(draws$data$ncat) trials <- draws$data$trials out <- abind(lapply(seq_cols(eta), get_counts), along = 3) out <- aperm(out, perm = c(1, 3, 2)) dimnames(out)[[3]] <- draws$cats out } pp_expect_dirichlet <- function(draws) { get_probs <- function(i) { eta <- insert_refcat(extract_col(eta, i), family = draws$family) dcategorical(cats, eta = eta) } eta <- draws$dpars[grepl("^mu", names(draws$dpars))] eta <- abind(eta, along = 3) cats <- seq_len(draws$data$ncat) out <- abind(lapply(seq_cols(eta), get_probs), along = 3) out <- aperm(out, perm = c(1, 3, 2)) dimnames(out)[[3]] <- draws$cats out } pp_expect_cumulative <- function(draws) { pp_expect_ordinal(draws) } pp_expect_sratio <- function(draws) { pp_expect_ordinal(draws) } pp_expect_cratio <- function(draws) { pp_expect_ordinal(draws) } pp_expect_acat <- function(draws) { pp_expect_ordinal(draws) } pp_expect_custom <- function(draws) { pp_expect_fun <- draws$family$pp_expect if (!is.function(pp_expect_fun)) { pp_expect_fun <- paste0("pp_expect_", draws$family$name) pp_expect_fun <- get(pp_expect_fun, draws$family$env) } pp_expect_fun(draws) } pp_expect_mixture <- function(draws) { families <- family_names(draws$family) draws$dpars$theta <- get_theta(draws) out <- 0 for (j in seq_along(families)) { pp_expect_fun <- paste0("pp_expect_", families[j]) pp_expect_fun <- get(pp_expect_fun, asNamespace("brms")) tmp_draws <- pseudo_draws_for_mixture(draws, j) if (length(dim(draws$dpars$theta)) == 3L) { theta <- draws$dpars$theta[, , j] } else { theta <- draws$dpars$theta[, j] } out <- out + theta * pp_expect_fun(tmp_draws) } out } # ------ pp_expect helper functions ------ # compute 'pp_expect' for ordinal models pp_expect_ordinal <- function(draws) { dens <- get(paste0("d", draws$family$family), mode = "function") ncat_max <- max(draws$data$nthres) + 1 nact_min <- min(draws$data$nthres) + 1 zero_mat <- matrix(0, nrow = draws$nsamples, ncol = ncat_max - nact_min) args <- list(link = draws$family$link) out <- vector("list", draws$nobs) for (i in seq_along(out)) { args_i <- args args_i$eta <- extract_col(draws$dpars$mu, i) args_i$disc <- extract_col(draws$dpars$disc, i) args_i$thres <- subset_thres(draws, i) ncat_i <- NCOL(args_i$thres) + 1 args_i$x <- seq_len(ncat_i) out[[i]] <- do_call(dens, args_i) if (ncat_i < ncat_max) { sel <- seq_len(ncat_max - ncat_i) out[[i]] <- cbind(out[[i]], zero_mat[, sel]) } } out <- abind(out, along = 3) out <- aperm(out, perm = c(1, 3, 2)) dimnames(out)[[3]] <- seq_len(ncat_max) out } # compute 'pp_expect' for lagsar models pp_expect_lagsar <- function(draws) { stopifnot(!is.null(draws$ac$lagsar)) I <- diag(draws$nobs) .pp_expect <- function(s) { IB <- I - with(draws$ac, lagsar[s, ] * Msar) as.numeric(solve(IB, draws$dpars$mu[s, ])) } out <- rblapply(seq_len(draws$nsamples), .pp_expect) rownames(out) <- NULL out } # expand data to dimension appropriate for # vectorized multiplication with posterior samples as_draws_matrix <- function(x, dim) { stopifnot(length(dim) == 2L, length(x) %in% c(1, dim[2])) matrix(x, nrow = dim[1], ncol = dim[2], byrow = TRUE) } # expected dimension of the main parameter 'mu' dim_mu <- function(draws) { c(draws$nsamples, draws$nobs) } # is the model truncated? is_trunc <- function(draws) { stopifnot(is.brmsdraws(draws)) any(draws$data[["lb"]] > -Inf) || any(draws$data[["ub"]] < Inf) } # prepares data required for truncation and calles the # family specific truncation function for pp_expect values pp_expect_trunc <- function(draws) { stopifnot(is_trunc(draws)) lb <- as_draws_matrix(draws$data[["lb"]], dim_mu(draws)) ub <- as_draws_matrix(draws$data[["ub"]], dim_mu(draws)) pp_expect_trunc_fun <- paste0("pp_expect_trunc_", draws$family$family) pp_expect_trunc_fun <- try( get(pp_expect_trunc_fun, asNamespace("brms")), silent = TRUE ) if (is(pp_expect_trunc_fun, "try-error")) { stop2("pp_expect values on the respone scale not yet implemented ", "for truncated '", draws$family$family, "' models.") } trunc_args <- nlist(draws, lb, ub) do_call(pp_expect_trunc_fun, trunc_args) } # ----- family specific truncation functions ----- # @param draws output of 'extract_draws' # @param lb lower truncation bound # @param ub upper truncation bound # @return samples of the truncated mean parameter pp_expect_trunc_gaussian <- function(draws, lb, ub) { zlb <- (lb - draws$dpars$mu) / draws$dpars$sigma zub <- (ub - draws$dpars$mu) / draws$dpars$sigma # truncated mean of standard normal; see Wikipedia trunc_zmean <- (dnorm(zlb) - dnorm(zub)) / (pnorm(zub) - pnorm(zlb)) draws$dpars$mu + trunc_zmean * draws$dpars$sigma } pp_expect_trunc_student <- function(draws, lb, ub) { zlb <- with(draws$dpars, (lb - mu) / sigma) zub <- with(draws$dpars, (ub - mu) / sigma) nu <- draws$dpars$nu # see Kim 2008: Moments of truncated Student-t distribution G1 <- gamma((nu - 1) / 2) * nu^(nu / 2) / (2 * (pt(zub, df = nu) - pt(zlb, df = nu)) * gamma(nu / 2) * gamma(0.5)) A <- (nu + zlb^2) ^ (-(nu - 1) / 2) B <- (nu + zub^2) ^ (-(nu - 1) / 2) trunc_zmean <- G1 * (A - B) draws$dpars$mu + trunc_zmean * draws$dpars$sigma } pp_expect_trunc_lognormal <- function(draws, lb, ub) { lb <- ifelse(lb < 0, 0, lb) m1 <- with(draws$dpars, exp(mu + sigma^2 / 2) * (pnorm((log(ub) - mu) / sigma - sigma) - pnorm((log(lb) - mu) / sigma - sigma)) ) with(draws$dpars, m1 / (plnorm(ub, meanlog = mu, sdlog = sigma) - plnorm(lb, meanlog = mu, sdlog = sigma)) ) } pp_expect_trunc_gamma <- function(draws, lb, ub) { lb <- ifelse(lb < 0, 0, lb) draws$dpars$scale <- draws$dpars$mu / draws$dpars$shape # see Jawitz 2004: Moments of truncated continuous univariate distributions m1 <- with(draws$dpars, scale / gamma(shape) * (incgamma(1 + shape, ub / scale) - incgamma(1 + shape, lb / scale)) ) with(draws$dpars, m1 / (pgamma(ub, shape, scale = scale) - pgamma(lb, shape, scale = scale)) ) } pp_expect_trunc_exponential <- function(draws, lb, ub) { lb <- ifelse(lb < 0, 0, lb) inv_mu <- 1 / draws$dpars$mu # see Jawitz 2004: Moments of truncated continuous univariate distributions m1 <- with(draws$dpars, mu * (incgamma(2, ub / mu) - incgamma(2, lb / mu))) m1 / (pexp(ub, rate = inv_mu) - pexp(lb, rate = inv_mu)) } pp_expect_trunc_weibull <- function(draws, lb, ub) { lb <- ifelse(lb < 0, 0, lb) draws$dpars$a <- 1 + 1 / draws$dpars$shape draws$dpars$scale <- with(draws$dpars, mu / gamma(a)) # see Jawitz 2004: Moments of truncated continuous univariate distributions m1 <- with(draws$dpars, scale * (incgamma(a, (ub / scale)^shape) - incgamma(a, (lb / scale)^shape)) ) with(draws$dpars, m1 / (pweibull(ub, shape, scale = scale) - pweibull(lb, shape, scale = scale)) ) } pp_expect_trunc_binomial <- function(draws, lb, ub) { lb <- ifelse(lb < -1, -1, lb) max_value <- max(draws$data$trials) ub <- ifelse(ub > max_value, max_value, ub) trials <- draws$data$trials if (length(trials) > 1) { trials <- as_draws_matrix(trials, dim_mu(draws)) } args <- list(size = trials, prob = draws$dpars$mu) pp_expect_trunc_discrete(dist = "binom", args = args, lb = lb, ub = ub) } pp_expect_trunc_poisson <- function(draws, lb, ub) { lb <- ifelse(lb < -1, -1, lb) max_value <- 3 * max(draws$dpars$mu) ub <- ifelse(ub > max_value, max_value, ub) args <- list(lambda = draws$dpars$mu) pp_expect_trunc_discrete(dist = "pois", args = args, lb = lb, ub = ub) } pp_expect_trunc_negbinomial <- function(draws, lb, ub) { lb <- ifelse(lb < -1, -1, lb) max_value <- 3 * max(draws$dpars$mu) ub <- ifelse(ub > max_value, max_value, ub) args <- list(mu = draws$dpars$mu, size = draws$dpars$shape) pp_expect_trunc_discrete(dist = "nbinom", args = args, lb = lb, ub = ub) } pp_expect_trunc_geometric <- function(draws, lb, ub) { lb <- ifelse(lb < -1, -1, lb) max_value <- 3 * max(draws$dpars$mu) ub <- ifelse(ub > max_value, max_value, ub) args <- list(mu = draws$dpars$mu, size = 1) pp_expect_trunc_discrete(dist = "nbinom", args = args, lb = lb, ub = ub) } # pp_expect values for truncated discrete distributions pp_expect_trunc_discrete <- function(dist, args, lb, ub) { stopifnot(is.matrix(lb), is.matrix(ub)) message( "Computing pp_expect values for truncated ", "discrete models may take a while." ) pdf <- get(paste0("d", dist), mode = "function") cdf <- get(paste0("p", dist), mode = "function") mean_kernel <- function(x, args) { # just x * density(x) x * do_call(pdf, c(x, args)) } if (any(is.infinite(c(lb, ub)))) { stop("lb and ub must be finite") } # simplify lb and ub back to vector format vec_lb <- lb[1, ] vec_ub <- ub[1, ] min_lb <- min(vec_lb) # array of dimension S x N x length((lb+1):ub) mk <- lapply((min_lb + 1):max(vec_ub), mean_kernel, args = args) mk <- do_call(abind, c(mk, along = 3)) m1 <- vector("list", ncol(mk)) for (n in seq_along(m1)) { # summarize only over non-truncated values for this observation J <- (vec_lb[n] - min_lb + 1):(vec_ub[n] - min_lb) m1[[n]] <- rowSums(mk[, n, ][, J, drop = FALSE]) } rm(mk) m1 <- do_call(cbind, m1) m1 / (do_call(cdf, c(list(ub), args)) - do_call(cdf, c(list(lb), args))) } brms/R/launch_shinystan.R0000644000176200001440000000356113606326626015132 0ustar liggesusers#' Interface to \pkg{shinystan} #' #' Provide an interface to \pkg{shinystan} for models fitted with \pkg{brms} #' #' @aliases launch_shinystan #' #' @param object A fitted model object typically of class \code{brmsfit}. #' @param rstudio Only relevant for RStudio users. #' The default (\code{rstudio=FALSE}) is to launch the app #' in the default web browser rather than RStudio's pop-up Viewer. #' Users can change the default to \code{TRUE} #' by setting the global option \cr \code{options(shinystan.rstudio = TRUE)}. #' @param ... Optional arguments to pass to \code{\link[shiny:runApp]{runApp}} #' #' @return An S4 shinystan object #' #' @examples #' \dontrun{ #' fit <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = "gaussian") #' launch_shinystan(fit) #' } #' #' @seealso \code{\link[shinystan:launch_shinystan]{launch_shinystan}} #' #' @method launch_shinystan brmsfit #' @importFrom shinystan launch_shinystan #' @export launch_shinystan #' @export launch_shinystan.brmsfit <- function( object, rstudio = getOption("shinystan.rstudio"), ... ) { contains_samples(object) if (object$algorithm != "sampling") { return(shinystan::launch_shinystan(object$fit, rstudio = rstudio, ...)) } draws <- as.array(object) sampler_params <- rstan::get_sampler_params(object$fit, inc_warmup = FALSE) control <- object$fit@stan_args[[1]]$control if (is.null(control)) { max_td <- 11 } else { max_td <- control$max_treedepth if (is.null(max_td)) { max_td <- 11 } } sso <- shinystan::as.shinystan( X = draws, model_name = object$fit@model_name, warmup = 0, sampler_params = sampler_params, max_treedepth = max_td, algorithm = "NUTS" ) shinystan::launch_shinystan(sso, rstudio = rstudio, ...) } brms/R/stan-predictor.R0000644000176200001440000021141213623747267014521 0ustar liggesusers# unless otherwise specified, functions return a named list # of Stan code snippets to be pasted together later on # generate stan code for predictor terms stan_predictor <- function(x, ...) { UseMethod("stan_predictor") } # combine effects for the predictors of a single (non-linear) parameter # @param primitive set to TRUE only if primitive Stan GLM functions should # be used which compute the predictor term internally # @param ... arguments passed to the underlying effect-specific functions #' @export stan_predictor.btl <- function(x, primitive = FALSE, ...) { out <- collapse_lists( stan_fe(x, ...), stan_thres(x, ...), stan_sp(x, ...), stan_cs(x, ...), stan_sm(x, ...), stan_gp(x, ...), stan_ac(x, ...), stan_offset(x, ...), stan_rate(x, ...), stan_bhaz(x, ...), stan_special_prior_global(x, ...) ) if (!primitive) { out <- stan_eta_combine(out, bterms = x, ...) } out } # prepare Stan code for non-linear models # @param names of the non-linear parameters # @param ilink character vector of length 2 defining the link to be applied #' @export stan_predictor.btnl <- function(x, data, nlpars, ilink = c("", ""), ...) { stopifnot(length(ilink) == 2L) out <- list() resp <- usc(x$resp) par <- combine_prefix(x, keep_mu = TRUE, nlp = TRUE) # prepare non-linear model n <- str_if(x$loop, "[n] ", " ") new_nlpars <- glue(" nlp{usc(x$resp)}_{nlpars}{n}") # covariates in the non-linear model covars <- all.vars(x$covars) new_covars <- NULL if (length(covars)) { p <- usc(combine_prefix(x)) new_covars <- rep(NA, length(covars)) data_cnl <- data_cnl(x, data) str_add(out$data) <- glue( " // covariate vectors for non-linear functions\n" ) for (i in seq_along(covars)) { is_integer <- is.integer(data_cnl[[glue("C{p}_{i}")]]) pfx_type <- str_if(is_integer, "int", glue("vector[N{resp}]")) sfx_type <- str_if(is_integer, glue("[N{resp}]"), "") str_add(out$data) <- glue( " {pfx_type} C{p}_{i}{sfx_type};\n" ) new_covars[i] <- glue(" C{p}_{i}{n}") } } # add whitespaces to be able to replace parameters and covariates syms <- c( "+", "-", "*", "/", "%", "^", ".*", "./", "'", ")", "(", ",", "==", "!=", "<=", ">=", "<", ">", "!", "&&", "||" ) regex <- glue("(? N; // number of observations\n" if (x$rescor) { # we already know at this point that all families are identical adforms <- lapply(x$terms, "[[", "adforms") adnames <- unique(ulapply(adforms, names)) adallowed <- c("se", "weights", "mi") if (!all(adnames %in% adallowed)) { stop2("Only ", collapse_comma(adallowed), " are supported ", "addition arguments when 'rescor' is estimated.") } family <- family_names(x)[1] stopifnot(family %in% c("gaussian", "student")) resp <- x$responses nresp <- length(resp) str_add(out$model_def) <- glue( " // multivariate predictor array\n", " vector[nresp] Mu[N];\n" ) str_add(out$model_comp_mvjoin) <- glue( " Mu[n] = {stan_vector(glue('mu_{resp}[n]'))};\n" ) str_add(out$data) <- glue( " int nresp; // number of responses\n", " int nrescor; // number of residual correlations\n" ) str_add(out$tdata_def) <- glue( " vector[nresp] Y[N]; // response array\n" ) str_add(out$tdata_comp) <- glue( " for (n in 1:N) {{\n", " Y[n] = {stan_vector(glue('Y_{resp}[n]'))};\n", " }}\n" ) if (any(adnames %in% "weights")) { str_add(out$tdata_def) <- glue( " // weights of the pointwise log-likelihood\n", " vector[N] weights = weights_{resp[1]};\n" ) } miforms <- rmNULL(lapply(adforms, "[[", "mi")) if (length(miforms)) { str_add(out$model_def) <- " vector[nresp] Yl[N] = Y;\n" for (i in seq_along(miforms)) { j <- match(names(miforms)[i], resp) str_add(out$model_comp_mvjoin) <- glue( " Yl[n][{j}] = Yl_{resp[j]}[n];\n" ) } } str_add_list(out) <- stan_prior( prior, class = "Lrescor", type = "cholesky_factor_corr[nresp]", comment = "parameters for multivariate linear models" ) if (family == "student") { str_add_list(out) <- stan_prior( prior, class = "nu", type = stan_dpar_types("nu") ) } sigma <- ulapply(x$terms, stan_sigma_transform) if (any(grepl("\\[n\\]", sigma))) { str_add(out$model_def) <- " vector[nresp] sigma[N];\n" str_add(out$model_comp_mvjoin) <- glue( " sigma[n] = {stan_vector(sigma)};\n" ) if (family == "gaussian") { str_add(out$model_def) <- glue( " // cholesky factor of residual covariance matrix\n", " matrix[nresp, nresp] LSigma[N];\n" ) str_add(out$model_comp_mvjoin) <- glue( " LSigma[n] = diag_pre_multiply(sigma[n], Lrescor);\n" ) } else if (family == "student") { str_add(out$model_def) <- glue( " // residual covariance matrix\n", " matrix[nresp, nresp] Sigma[N];\n" ) str_add(out$model_comp_mvjoin) <- glue( " Sigma[n] = multiply_lower_tri_self_transpose(", "diag_pre_multiply(sigma[n], Lrescor));\n" ) } } else { str_add(out$model_def) <- glue( " vector[nresp] sigma = {stan_vector(sigma)};\n" ) if (family == "gaussian") { str_add(out$model_def) <- glue( " // cholesky factor of residual covariance matrix\n", " matrix[nresp, nresp] LSigma = ", "diag_pre_multiply(sigma, Lrescor);\n" ) } else if (family == "student") { str_add(out$model_def) <- glue( " // residual covariance matrix\n", " matrix[nresp, nresp] Sigma = ", "multiply_lower_tri_self_transpose(", "diag_pre_multiply(sigma, Lrescor));\n" ) } } str_add(out$gen_def) <- glue( " // residual correlations\n", " corr_matrix[nresp] Rescor", " = multiply_lower_tri_self_transpose(Lrescor);\n", " vector[nrescor] rescor;\n" ) str_add(out$gen_comp) <- stan_cor_gen_comp("rescor", "nresp") out$model_comp_mvjoin <- paste0( " // combine univariate parameters\n", " for (n in 1:N) {\n", out$model_comp_mvjoin, " }\n" ) } out } # Stan code for population-level effects stan_fe <- function(bterms, data, prior, stanvars, ...) { out <- list() family <- bterms$family fixef <- colnames(data_fe(bterms, data)$X) sparse <- is_sparse(bterms$fe) decomp <- get_decomp(bterms$fe) if (length(fixef) < 2L) { # decompositions require at least two predictors decomp <- "none" } center_X <- stan_center_X(bterms) ct <- str_if(center_X, "c") # remove the intercept from the design matrix? if (center_X) { fixef <- setdiff(fixef, "Intercept") } px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(px$resp) if (length(fixef)) { str_add(out$data) <- glue( " int K{p};", " // number of population-level effects\n", " matrix[N{resp}, K{p}] X{p};", " // population-level design matrix\n" ) if (sparse) { if (decomp != "none") { stop2("Cannot use ", decomp, " decomposition for sparse matrices.") } str_add(out$tdata_def) <- glue( " // sparse matrix representation of X{p}\n", " vector[rows(csr_extract_w(X{p}))] wX{p}", " = csr_extract_w(X{p});\n", " int vX{p}[size(csr_extract_v(X{p}))]", " = csr_extract_v(X{p});\n", " int uX{p}[size(csr_extract_u(X{p}))]", " = csr_extract_u(X{p});\n" ) } # prepare population-level coefficients b_bound <- get_bound(prior, class = "b", px = px) b_type <- glue("vector{b_bound}[K{ct}{p}]") b_coef_type <- glue("real{b_bound}") use_horseshoe <- stan_use_horseshoe(bterms, prior) if (decomp == "none") { b_suffix <- "" b_comment <- "population-level effects" if (use_horseshoe) { str_add(out$tpar_def) <- glue(" {b_type} b{p}; // {b_comment}\n") } else { str_add_list(out) <- stan_prior( prior, class = "b", coef = fixef, type = b_type, coef_type = b_coef_type, px = px, suffix = p, comment = b_comment ) } } else { stopifnot(decomp == "QR") if (nzchar(b_bound)) { stop2("Cannot impose bounds on decomposed coefficients.") } b_suffix <- "Q" b_comment <- "regression coefficients at QR scale" if (use_horseshoe) { str_add(out$tpar_def) <- glue(" {b_type} bQ{p}; // {b_comment}\n") } else { str_add_list(out) <- stan_prior( prior, class = "b", coef = fixef, type = b_type, coef_type = b_coef_type, px = px, suffix = glue("Q{p}"), comment = b_comment ) } str_add(out$gen_def) <- glue( " // obtain the actual coefficients\n", " vector[K{ct}{p}] b{p} = XR{p}_inv * bQ{p};\n" ) } str_add_list(out) <- stan_special_prior_local( prior, class = "b", ncoef = length(fixef), px = px, center_X = center_X, suffix = b_suffix ) } order_intercepts <- order_intercepts(bterms) if (order_intercepts && !center_X) { stop2( "Identifying mixture components via ordering requires ", "population-level intercepts to be present.\n", "Try setting order = 'none' in function 'mixture'." ) } if (center_X) { # centering the design matrix improves convergence sub_X_means <- "" if (length(fixef)) { sub_X_means <- glue(" - dot_product(means_X{p}, b{p})") if (is_ordinal(family)) { # the intercept was already removed during the data preparation str_add(out$tdata_def) <- glue( " int Kc{p} = K{p};\n", " matrix[N{resp}, Kc{p}] Xc{p};", " // centered version of X{p}\n", " vector[Kc{p}] means_X{p};", " // column means of X{p} before centering\n" ) str_add(out$tdata_comp) <- glue( " for (i in 1:K{p}) {{\n", " means_X{p}[i] = mean(X{p}[, i]);\n", " Xc{p}[, i] = X{p}[, i] - means_X{p}[i];\n", " }}\n" ) } else { str_add(out$tdata_def) <- glue( " int Kc{p} = K{p} - 1;\n", " matrix[N{resp}, Kc{p}] Xc{p};", " // centered version of X{p} without an intercept\n", " vector[Kc{p}] means_X{p};", " // column means of X{p} before centering\n" ) str_add(out$tdata_comp) <- glue( " for (i in 2:K{p}) {{\n", " means_X{p}[i - 1] = mean(X{p}[, i]);\n", " Xc{p}[, i - 1] = X{p}[, i] - means_X{p}[i - 1];\n", " }}\n" ) } } if (!is_ordinal(family)) { # intercepts of ordinal models are handled in 'stan_thres' intercept_type <- "real" if (order_intercepts) { # identify mixtures via ordering of the intercepts dp_id <- dpar_id(px$dpar) str_add(out$tpar_def) <- glue( " // identify mixtures via ordering of the intercepts\n", " real Intercept{p} = ordered_Intercept{resp}[{dp_id}];\n" ) # intercept parameter needs to be defined outside of 'stan_prior' intercept_type <- "" } str_add(out$eta) <- glue(" + Intercept{p}") str_add(out$gen_def) <- glue( " // actual population-level intercept\n", " real b{p}_Intercept = Intercept{p}{sub_X_means};\n" ) str_add_list(out) <- stan_prior( prior, class = "Intercept", type = intercept_type, suffix = p, px = px, comment = "temporary intercept for centered predictors" ) } } if (decomp == "QR") { str_add(out$tdata_def) <- glue( " // matrices for QR decomposition\n", " matrix[N{resp}, K{ct}{p}] XQ{p};\n", " matrix[K{ct}{p}, K{ct}{p}] XR{p};\n", " matrix[K{ct}{p}, K{ct}{p}] XR{p}_inv;\n" ) str_add(out$tdata_comp) <- glue( " // compute and scale QR decomposition\n", " XQ{p} = qr_thin_Q(X{ct}{p}) * sqrt(N{resp} - 1);\n", " XR{p} = qr_thin_R(X{ct}{p}) / sqrt(N{resp} - 1);\n", " XR{p}_inv = inverse(XR{p});\n" ) } str_add(out$eta) <- stan_eta_fe(fixef, bterms) out } # Stan code for group-level effects stan_re <- function(ranef, prior, ...) { IDs <- unique(ranef$id) out <- list() # special handling of student-t group effects tranef <- get_dist_groups(ranef, "student") if (has_rows(tranef)) { str_add(out$par) <- " // parameters for student-t distributed group-level effects\n" for (i in seq_rows(tranef)) { g <- usc(tranef$ggn[i]) id <- tranef$id[i] str_add_list(out) <- stan_prior( prior, class = "df", group = tranef$group[i], type = "real", suffix = g ) str_add(out$par) <- glue( " vector[N_{id}] udf{g};\n" ) str_add(out$prior) <- glue( " target += inv_chi_square_lpdf(udf{g} | df{g});\n" ) # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- glue( " vector[N_{id}] dfm{g};\n" ) str_add(out$tpar_comp) <- glue( " dfm{g} = sqrt(df{g} * udf{g});\n" ) } } # the ID syntax requires group-level effects to be evaluated separately tmp <- lapply(IDs, .stan_re, ranef = ranef, prior = prior, ...) out <- collapse_lists(ls = c(list(out), tmp)) out } # Stan code for group-level effects per ID # @param id the ID of the grouping factor # @param ranef output of tidy_ranef # @param prior object of class brmsprior # @param cov_ranef optional list of custom covariance matrices .stan_re <- function(id, ranef, prior, cov_ranef = NULL) { out <- list() r <- subset2(ranef, id = id) has_ccov <- r$group[1] %in% names(cov_ranef) has_by <- nzchar(r$by[[1]]) Nby <- seq_along(r$bylevels[[1]]) ng <- seq_along(r$gcall[[1]]$groups) px <- check_prefix(r) uresp <- usc(unique(px$resp)) idp <- paste0(r$id, usc(combine_prefix(px))) # define data needed for group-level effects str_add(out$data) <- glue( " // data for group-level effects of ID {id}\n", " int N_{id}; // number of grouping levels\n", " int M_{id}; // number of coefficients per level\n" ) if (r$gtype[1] == "mm") { for (res in uresp) { str_add(out$data) <- cglue( " int J_{id}{res}_{ng}[N{res}];", " // grouping indicator per observation\n", " real W_{id}{res}_{ng}[N{res}];", " // multi-membership weights\n" ) } } else { str_add(out$data) <- cglue( " int J_{id}{uresp}[N{uresp}];", " // grouping indicator per observation\n" ) } if (has_by) { str_add(out$data) <- glue( " int Nby_{id}; // number of by-factor levels\n", " int Jby_{id}[N_{id}];", " // by-factor indicator per observation\n" ) } if (has_ccov) { str_add(out$data) <- glue( " matrix[N_{id}, N_{id}] Lcov_{id};", " // cholesky factor of known covariance matrix\n" ) } J <- seq_rows(r) reqZ <- !r$type %in% "sp" if (any(reqZ)) { str_add(out$data) <- " // group-level predictor values\n" if (r$gtype[1] == "mm") { for (i in which(reqZ)) { str_add(out$data) <- cglue( " vector[N{usc(r$resp[i])}] Z_{idp[i]}_{r$cn[i]}_{ng};\n" ) } } else { str_add(out$data) <- cglue( " vector[N{usc(r$resp[reqZ])}] Z_{idp[reqZ]}_{r$cn[reqZ]};\n" ) } } # define standard deviation parameters if (has_by) { str_add_list(out) <- stan_prior( prior, class = "sd", group = r$group[1], coef = r$coef, type = glue("matrix[M_{id}, Nby_{id}]"), coef_type = glue("row_vector[Nby_{id}]"), suffix = glue("_{id}"), px = px, broadcast = "matrix", comment = "group-level standard deviations" ) } else { str_add_list(out) <- stan_prior( prior, class = "sd", group = r$group[1], coef = r$coef, type = glue("vector[M_{id}]"), coef_type = "real", suffix = glue("_{id}"), px = px, comment = "group-level standard deviations" ) } dfm <- "" tr <- get_dist_groups(r, "student") if (nrow(r) > 1L && r$cor[1]) { # multiple correlated group-level effects str_add(out$data) <- glue( " int NC_{id}; // number of group-level correlations\n" ) str_add(out$par) <- glue( " matrix[M_{id}, N_{id}] z_{id};", " // standardized group-level effects\n" ) str_add(out$prior) <- glue( " target += normal_lpdf(to_vector(z_{id}) | 0, 1);\n" ) if (has_rows(tr)) { dfm <- glue("rep_matrix(dfm_{tr$ggn[1]}, M_{id}) .* ") } if (has_by) { if (has_ccov) { stop2( "Cannot combine 'by' variables with customized covariance ", "matrices when fitting multiple group-level effects." ) } str_add_list(out) <- stan_prior( prior, class = "L", group = r$group[1], coef = Nby, type = glue("cholesky_factor_corr[M_{id}]"), coef_type = glue("cholesky_factor_corr[M_{id}]"), suffix = glue("_{id}"), dim = glue("[Nby_{id}]"), comment = "cholesky factor of correlation matrix" ) # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- glue( " matrix[N_{id}, M_{id}] r_{id}; // actual group-level effects\n" ) str_add(out$tpar_comp) <- glue( " // compute actual group-level effects", " r_{id} = {dfm}scale_r_cor_by(z_{id}, sd_{id}, L_{id}, Jby_{id});\n" ) str_add(out$gen_def) <- cglue( " // compute group-level correlations\n", " corr_matrix[M_{id}] Cor_{id}_{Nby}", " = multiply_lower_tri_self_transpose(L_{id}[{Nby}]);\n", " vector[NC_{id}] cor_{id}_{Nby};\n" ) str_add(out$gen_comp) <- stan_cor_gen_comp( glue("cor_{id}_{Nby}"), glue("M_{id}") ) } else { str_add_list(out) <- stan_prior( prior, class = "L", group = r$group[1], suffix = usc(id), type = glue("cholesky_factor_corr[M_{id}]"), comment = "cholesky factor of correlation matrix" ) if (has_ccov) { rdef <- glue( "as_matrix(kronecker(Lcov_{id},", " diag_pre_multiply(sd_{id}, L_{id})) *", " to_vector(z_{id}), N_{id}, M_{id})" ) } else { rdef <- glue("(diag_pre_multiply(sd_{id}, L_{id}) * z_{id})'") } # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- glue( " matrix[N_{id}, M_{id}] r_{id}; // actual group-level effects\n" ) str_add(out$tpar_comp) <- glue( " // compute actual group-level effects\n", " r_{id} = {dfm}{rdef};\n" ) str_add(out$gen_def) <- glue( " // compute group-level correlations\n", " corr_matrix[M_{id}] Cor_{id}", " = multiply_lower_tri_self_transpose(L_{id});\n", " vector[NC_{id}] cor_{id};\n" ) str_add(out$gen_comp) <- stan_cor_gen_comp( cor = glue("cor_{id}"), ncol = glue("M_{id}") ) } # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- " // using vectors speeds up indexing in loops\n" str_add(out$tpar_def) <- cglue( " vector[N_{id}] r_{idp}_{r$cn};\n" ) str_add(out$tpar_comp) <- cglue( " r_{idp}_{r$cn} = r_{id}[, {J}];\n" ) } else { # single or uncorrelated group-level effects str_add(out$par) <- glue( " vector[N_{id}] z_{id}[M_{id}];", " // standardized group-level effects\n" ) str_add(out$prior) <- cglue( " target += normal_lpdf(z_{id}[{seq_rows(r)}] | 0, 1);\n" ) Lcov <- str_if(has_ccov, glue("Lcov_{id} * ")) if (has_rows(tr)) { dfm <- glue("dfm_{tr$ggn[1]} .* ") } if (has_by) { # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- cglue( " vector[N_{id}] r_{idp}_{r$cn}; // actual group-level effects\n" ) str_add(out$tpar_comp) <- cglue( " r_{idp}_{r$cn} = {dfm}(sd_{id}[{J}, Jby_{id}]' .* ({Lcov}z_{id}[{J}]));\n" ) } else { # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- cglue( " vector[N_{id}] r_{idp}_{r$cn}; // actual group-level effects\n" ) str_add(out$tpar_comp) <- cglue( " r_{idp}_{r$cn} = {dfm}(sd_{id}[{J}] * ({Lcov}z_{id}[{J}]));\n" ) } } out } # Stan code of smooth terms stan_sm <- function(bterms, data, prior, ...) { out <- list() smef <- tidy_smef(bterms, data) if (!NROW(smef)) { return(out) } px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(px$resp) Xs_names <- attr(smef, "Xs_names") if (length(Xs_names)) { str_add(out$data) <- glue( " // data for splines\n", " int Ks{p}; // number of linear effects\n", " matrix[N{resp}, Ks{p}] Xs{p};", " // design matrix for the linear effects\n" ) str_add_list(out) <- stan_prior( prior, class = "b", coef = Xs_names, type = glue("vector[Ks{p}]"), suffix = glue("s{p}"), px = px, comment = "spline coefficients" ) str_add(out$eta) <- glue(" + Xs{p} * bs{p}") } for (i in seq_rows(smef)) { pi <- glue("{p}_{i}") nb <- seq_len(smef$nbases[[i]]) str_add(out$data) <- glue( " // data for spline {smef$byterm[i]}\n", " int nb{pi}; // number of bases\n", " int knots{pi}[nb{pi}]; // number of knots\n" ) str_add(out$data) <- " // basis function matrices\n" str_add(out$data) <- cglue( " matrix[N{resp}, knots{pi}[{nb}]] Zs{pi}_{nb};\n" ) str_add(out$par) <- glue( " // parameters for spline {smef$byterm[i]}\n" ) str_add(out$par) <- cglue( " // standarized spline coefficients\n", " vector[knots{pi}[{nb}]] zs{pi}_{nb};\n" ) for (j in nb) { str_add_list(out) <- stan_prior( prior, class = "sds", coef = smef$term[i], type = "real", coef_type = "real", suffix = glue("{pi}_{j}"), px = px, comment = "standard deviations of spline coefficients" ) } # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- cglue( " // actual spline coefficients\n", " vector[knots{pi}[{nb}]] s{pi}_{nb};\n" ) str_add(out$tpar_comp) <- cglue( " // compute actual spline coefficients\n", " s{pi}_{nb} = sds{pi}_{nb} * zs{pi}_{nb};\n" ) str_add(out$prior) <- cglue( " target += normal_lpdf(zs{pi}_{nb} | 0, 1);\n" ) str_add(out$eta) <- cglue( " + Zs{pi}_{nb} * s{pi}_{nb}" ) } out } # Stan code for category specific effects # @note not implemented for non-linear models stan_cs <- function(bterms, data, prior, ranef, ...) { out <- list() csef <- colnames(get_model_matrix(bterms$cs, data)) px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(bterms$resp) ranef <- subset2(ranef, type = "cs", ls = px) if (length(csef)) { str_add(out$data) <- glue( " int Kcs{p}; // number of category specific effects\n", " matrix[N{resp}, Kcs{p}] Xcs{p}; // category specific design matrix\n" ) bound <- get_bound(prior, class = "b", px = px) str_add_list(out) <- stan_prior( prior, class = "b", coef = csef, type = glue("matrix{bound}[Kcs{p}, nthres{resp}]"), coef_type = glue("row_vector{bound}[nthres{resp}]"), suffix = "cs", px = px, broadcast = "matrix", comment = "category specific effects" ) str_add(out$model_def) <- glue( " // linear predictor for category specific effects\n", " matrix[N{resp}, nthres{resp}] mucs{p} = Xcs{p} * bcs{p};\n" ) } if (nrow(ranef)) { if (!length(csef)) { # only group-level category specific effects present str_add(out$model_def) <- glue( " // linear predictor for category specific effects\n", " matrix[N{resp}, nthres{resp}] mucs{p}", " = rep_matrix(0, N{resp}, nthres{resp});\n" ) } thres_regex <- "(?<=\\[)[[:digit:]]+(?=\\]$)" thres <- get_matches(thres_regex, ranef$coef, perl = TRUE) nthres <- max(as.numeric(thres)) mucs_loop <- "" for (i in seq_len(nthres)) { r_cat <- ranef[grepl(glue("\\[{i}\\]$"), ranef$coef), ] str_add(mucs_loop) <- glue( " mucs{p}[n, {i}] = mucs{p}[n, {i}]" ) for (id in unique(r_cat$id)) { r <- r_cat[r_cat$id == id, ] rpx <- check_prefix(r) idp <- paste0(r$id, usc(combine_prefix(rpx))) idresp <- paste0(r$id, usc(rpx$resp)) str_add(mucs_loop) <- cglue( " + r_{idp}_{r$cn}[J_{idresp}[n]] * Z_{idp}_{r$cn}[n]" ) } str_add(mucs_loop) <- ";\n" } str_add(out$model_comp_eta_loop) <- glue( " for (n in 1:N{resp}) {{\n ", mucs_loop, " }\n" ) } out } # Stan code for special effects stan_sp <- function(bterms, data, prior, stanvars, ranef, meef, ...) { out <- list() spef <- tidy_spef(bterms, data) if (!nrow(spef)) return(out) px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(px$resp) ranef <- subset2(ranef, type = "sp", ls = px) spef_coef <- rename(spef$term) invalid_coef <- setdiff(ranef$coef, spef_coef) if (length(invalid_coef)) { stop2( "Special group-level terms require corresponding ", "population-level terms:\nOccured for ", collapse_comma(invalid_coef) ) } # prepare Stan code of the linear predictor component for (i in seq_rows(spef)) { eta <- spef$joint_call[[i]] if (!is.null(spef$calls_mo[[i]])) { new_mo <- glue("mo(simo{p}_{spef$Imo[[i]]}, Xmo{p}_{spef$Imo[[i]]}[n])") eta <- rename(eta, spef$calls_mo[[i]], new_mo) } if (!is.null(spef$calls_me[[i]])) { Kme <- seq_along(meef$term) Ime <- match(meef$grname, unique(meef$grname)) nme <- ifelse(nzchar(meef$grname), glue("Jme_{Ime}[n]"), "n") new_me <- glue("Xme_{Kme}[{nme}]") eta <- rename(eta, meef$term, new_me) } if (!is.null(spef$calls_mi[[i]])) { new_mi <- glue("Yl_{spef$vars_mi[[i]]}[n]") eta <- rename(eta, spef$calls_mi[[i]], new_mi) } if (spef$Ic[i] > 0) { str_add(eta) <- glue(" * Csp{p}_{spef$Ic[i]}[n]") } r <- subset2(ranef, coef = spef_coef[i]) rpars <- str_if(nrow(r), cglue(" + {stan_eta_rsp(r)}")) str_add(out$loopeta) <- glue(" + (bsp{p}[{i}]{rpars}) * {eta}") } # prepare general Stan code ncovars <- max(spef$Ic) str_add(out$data) <- glue( " int Ksp{p}; // number of special effects terms\n" ) if (ncovars > 0L) { str_add(out$data) <- glue( " // covariates of special effects terms\n", cglue(" vector[N{resp}] Csp{p}_{seq_len(ncovars)};\n") ) } # prepare special effects coefficients bound <- get_bound(prior, class = "b", px = px) if (stan_use_horseshoe(bterms, prior)) { str_add(out$tpar_def) <- glue( " // special effects coefficients\n", " vector{bound}[Ksp{p}] bsp{p};\n" ) } else { str_add_list(out) <- stan_prior( prior, class = "b", coef = spef$coef, type = glue("vector{bound}[Ksp{p}]"), coef_type = glue("real{bound}"), px = px, suffix = glue("sp{p}"), comment = "special effects coefficients" ) } # include special Stan code for monotonic effects I <- unlist(spef$Imo) if (length(I)) { I <- seq_len(max(I)) str_add(out$data) <- glue( " int Imo{p}; // number of monotonic variables\n", " int Jmo{p}[Imo{p}]; // length of simplexes\n", " // monotonic variables\n", cglue(" int Xmo{p}_{I}[N{resp}];\n"), " // prior concentration of monotonic simplexes\n", cglue(" vector[Jmo{p}[{I}]] con_simo{p}_{I};\n") ) str_add(out$par) <- glue( " // simplexes of monotonic effects\n", cglue(" simplex[Jmo{p}[{I}]] simo{p}_{I};\n") ) str_add(out$prior) <- cglue( " target += dirichlet_lpdf(simo{p}_{I} | con_simo{p}_{I});\n" ) } stan_special_priors <- stan_special_prior_local( prior, class = "bsp", ncoef = nrow(spef), px = px, center_X = FALSE ) out <- collapse_lists(out, stan_special_priors) out } # Stan code for latent gaussian processes stan_gp <- function(bterms, data, prior, ...) { out <- list() px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(px$resp) gpef <- tidy_gpef(bterms, data) for (i in seq_rows(gpef)) { pi <- glue("{p}_{i}") byvar <- gpef$byvars[[i]] cons <- gpef$cons[[i]] byfac <- length(cons) > 0L bynum <- !is.null(byvar) && !byfac k <- gpef$k[i] iso <- gpef$iso[i] gr <- gpef$gr[i] sfx1 <- gpef$sfx1[[i]] sfx2 <- gpef$sfx2[[i]] str_add(out$data) <- glue( " // data related to GPs\n", " int Kgp{pi};", " // number of sub-GPs (equal to 1 unless 'by' was used)\n", " int Dgp{pi}; // GP dimension\n" ) if (!isNA(k)) { # !isNA(k) indicates the use of approximate GPs str_add(out$data) <- glue( " // number of basis functions of an approximate GP\n", " int NBgp{pi};\n" ) } str_add_list(out) <- stan_prior( prior, class = "sdgp", coef = sfx1, type = glue("vector[Kgp{pi}]"), coef_type = "real", px = px, suffix = pi, comment = "GP standard deviation parameters" ) if (gpef$iso[i]) { lscale_type <- "vector[1]" lscale_dim <- glue("[Kgp{pi}]") lscale_comment <- "GP length-scale parameters" } else { lscale_type <- glue("vector[Dgp{pi}]") lscale_dim <- glue("[Kgp{pi}]") lscale_comment <- "GP length-scale parameters" } if (byfac) { J <- seq_along(cons) Ngp <- glue("Ngp{pi}") Nsubgp <- glue("N", str_if(gr, "sub"), glue("gp{pi}")) Igp <- glue("Igp{pi}_{J}") str_add(out$data) <- glue( " // number of observations relevant for a certain sub-GP\n", " int {Ngp}[Kgp{pi}];\n" ) str_add(out$data) <- " // indices and contrasts of sub-GPs per observation\n" str_add(out$data) <- cglue( " int {Igp}[{Ngp}[{J}]];\n", " vector[{Ngp}[{J}]] Cgp{pi}_{J};\n" ) str_add_list(out) <- stan_prior( prior, class = "lscale", coef = sfx2, type = lscale_type, coef_type = "real", dim = lscale_dim, suffix = glue("{pi}"), px = px, comment = lscale_comment ) if (gr) { str_add(out$data) <- glue( " // number of latent GP groups\n", " int Nsubgp{pi}[Kgp{pi}];\n" ) str_add(out$data) <- cglue( " // indices of latent GP groups per observation\n", " int Jgp{pi}_{J}[{Ngp}[{J}]];\n" ) } gp_call <- glue("Cgp{pi}_{J} .* ") if (!isNA(k)) { str_add(out$data) <- " // approximate GP basis matrices and eigenvalues\n" str_add(out$data) <- cglue( " matrix[{Nsubgp}[{J}], NBgp{pi}] Xgp{pi}_{J};\n", " vector[Dgp{pi}] slambda{pi}_{J}[NBgp{pi}];\n" ) str_add(out$par) <- " // latent variables of the GP\n" str_add(out$par) <- cglue( " vector[NBgp{pi}] zgp{pi}_{J};\n" ) str_add(gp_call) <- glue( "gpa(Xgp{pi}_{J}, sdgp{pi}[{J}], ", "lscale{pi}[{J}], zgp{pi}_{J}, slambda{pi}_{J})" ) } else { str_add(out$data) <- " // covariates of the GP\n" str_add(out$data) <- cglue( " vector[Dgp{pi}] Xgp{pi}_{J}[{Nsubgp}[{J}]];\n" ) str_add(out$par) <- " // latent variables of the GP\n" str_add(out$par) <- cglue( " vector[{Nsubgp}[{J}]] zgp{pi}_{J};\n" ) str_add(gp_call) <- glue( "gp(Xgp{pi}_{J}, sdgp{pi}[{J}], ", "lscale{pi}[{J}], zgp{pi}_{J})" ) } Jgp <- str_if(gr, glue("[Jgp{pi}_{J}]")) eta <- combine_prefix(px, keep_mu = TRUE, nlp = TRUE) eta <- glue("{eta}[{Igp}]") # compound '+=' statement currently causes a parser failure str_add(out$model_comp_basic) <- glue( " {eta} = {eta} + {gp_call}{Jgp};\n" ) str_add(out$prior) <- cglue( "{tp()}normal_lpdf(zgp{pi}_{J} | 0, 1);\n" ) } else { # no by-factor variable str_add_list(out) <- stan_prior( prior, class = "lscale", coef = sfx2, type = lscale_type, coef_type = "real", dim = lscale_dim, suffix = glue("{pi}"), px = px, comment = lscale_comment ) Nsubgp <- str_if(gr, glue("Nsubgp{pi}"), glue("N{resp}")) if (gr) { str_add(out$data) <- glue( " // number of latent GP groups\n", " int {Nsubgp};\n", " // indices of latent GP groups per observation\n", " int Jgp{pi}[N{resp}];\n" ) } if (!isNA(k)) { str_add(out$data) <- glue( " // approximate GP basis matrices\n", " matrix[{Nsubgp}, NBgp{pi}] Xgp{pi};\n", " // approximate GP eigenvalues\n", " vector[Dgp{pi}] slambda{pi}[NBgp{pi}];\n" ) str_add(out$par) <- glue( " vector[NBgp{pi}] zgp{pi}; // latent variables of the GP\n" ) gp_call <- glue( "gpa(Xgp{pi}, sdgp{pi}[1], lscale{pi}[1], zgp{pi}, slambda{pi})" ) } else { str_add(out$data) <- glue( " vector[Dgp{pi}] Xgp{pi}[{Nsubgp}]; // covariates of the GP\n" ) str_add(out$par) <- glue( " vector[{Nsubgp}] zgp{pi}; // latent variables of the GP\n" ) gp_call <- glue( "gp(Xgp{pi}, sdgp{pi}[1], lscale{pi}[1], zgp{pi})" ) } if (bynum) { str_add(out$data) <- glue( " // numeric by-variable of the GP\n", " vector[N{resp}] Cgp{pi};\n" ) } Cgp <- str_if(bynum, glue("Cgp{pi} .* ")) Jgp <- str_if(gr, glue("[Jgp{pi}]")) str_add(out$eta) <- glue(" + {Cgp}{gp_call}{Jgp}") str_add(out$prior) <- glue( "{tp()}normal_lpdf(zgp{pi} | 0, 1);\n" ) } } out } # Stan code for the linear predictor of autocorrelation terms stan_ac <- function(bterms, data, prior, ...) { out <- list() px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(px$resp) has_natural_residuals <- has_natural_residuals(bterms) has_cor_latent_residuals <- has_cor_latent_residuals(bterms) acef <- tidy_acef(bterms, data) # validity of the autocor terms has already been checked in 'tidy_acef' acef_arma <- subset2(acef, class = "arma") if (NROW(acef_arma)) { str_add(out$data) <- glue( " // data needed for ARMA correlations\n", " int Kar{p}; // AR order\n", " int Kma{p}; // MA order\n" ) str_add(out$tdata_def) <- glue( " int max_lag{p} = max(Kar{p}, Kma{p});\n" ) if (!acef_arma$cov) { err_msg <- "Please set cov = TRUE in ARMA correlation structures" if (!has_natural_residuals) { stop2(err_msg, " for this family.") } if (is.formula(bterms$adforms$se)) { stop2(err_msg, " when including known standard errors.") } str_add(out$data) <- glue( " // number of lags per observation\n", " int J_lag{p}[N{resp}];\n" ) str_add(out$model_def) <- glue( " // objects storing residuals\n", " matrix[N{resp}, max_lag{p}] Err{p}", " = rep_matrix(0, N{resp}, max_lag{p});\n", " vector[N{resp}] err{p};\n" ) Y <- str_if(is.formula(bterms$adforms$mi), "Yl", "Y") add_ar <- str_if(acef_arma$p > 0, glue(" mu{p}[n] += Err{p}[n, 1:Kar{p}] * ar{p};\n") ) add_ma <- str_if(acef_arma$q > 0, glue(" mu{p}[n] += Err{p}[n, 1:Kma{p}] * ma{p};\n") ) str_add(out$model_comp_arma) <- glue( " // include ARMA terms\n", " for (n in 1:N{resp}) {{\n", add_ma, " err{p}[n] = {Y}{p}[n] - mu{p}[n];\n", " for (i in 1:J_lag{p}[n]) {{\n", " Err{p}[n + 1, i] = err{p}[n + 1 - i];\n", " }}\n", add_ar, " }}\n" ) } if (acef_arma$p > 0) { # no boundaries are required in the conditional formulation ar_bound <- str_if(acef_arma$cov, "") str_add_list(out) <- stan_prior( prior, class = "ar", px = px, suffix = p, coef = seq_along(acef_arma$p), type = glue("vector{ar_bound}[Kar{p}]"), coef_type = glue("real{ar_bound}"), comment = "autoregressive coefficients" ) } if (acef_arma$q > 0) { # no boundaries are required in the conditional formulation ma_bound <- str_if(acef_arma$cov, "") str_add_list(out) <- stan_prior( prior, class = "ma", px = px, suffix = p, coef = seq_along(acef_arma$q), type = glue("vector{ma_bound}[Kma{p}]"), coef_type = glue("real{ma_bound}"), comment = "moving-average coefficients" ) } } acef_cosy <- subset2(acef, class = "cosy") if (NROW(acef_cosy)) { # compound symmetry correlation structure # most code is shared with ARMA covariance models str_add_list(out) <- stan_prior( prior, class = "cosy", px = px, suffix = p, type = "real", comment = "compound symmetry correlation" ) } acef_time_cov <- subset2(acef, dim = "time", cov = TRUE) if (NROW(acef_time_cov)) { # use correlation structures in covariance matrix parameterization # optional for ARMA models and obligatory for COSY models # can only model one covariance structure at a time stopifnot(NROW(acef_time_cov) == 1) str_add(out$data) <- glue( " // see the functions block for details\n", " int N_tg{p};\n", " int begin_tg{p}[N_tg{p}];\n", " int end_tg{p}[N_tg{p}];\n", " int nobs_tg{p}[N_tg{p}];\n" ) if (!is.formula(bterms$adforms$se)) { str_add(out$tdata_def) <- glue( " // no known standard errors specified by the user\n", " vector[N{resp}] se2{p} = rep_vector(0, N{resp});\n" ) } str_add(out$tpar_def) <- glue( " // cholesky factor of the autocorrelation matrix\n", " matrix[max(nobs_tg{p}), max(nobs_tg{p})] chol_cor{p};\n" ) if (acef_time_cov$class == "arma") { if (acef_time_cov$p > 0 && acef_time_cov$q == 0) { cor_fun <- "ar1" cor_args <- glue("ar{p}[1]") } else if (acef_time_cov$p == 0 && acef_time_cov$q > 0) { cor_fun <- "ma1" cor_args <- glue("ma{p}[1]") } else { cor_fun <- "arma1" cor_args <- glue("ar{p}[1], ma{p}[1]") } } else if (acef_time_cov$class == "cosy") { cor_fun <- "cosy" cor_args <- glue("cosy{p}") } str_add(out$tpar_comp) <- glue( " // compute residual covariance matrix\n", " chol_cor{p} = cholesky_cor_{cor_fun}({cor_args}, max(nobs_tg{p}));\n" ) if (has_cor_latent_residuals) { err_msg <- "Latent residuals are not implemented" if (is.btnl(bterms)) { stop2(err_msg, " for non-linear models.") } str_add(out$par) <- glue( " vector[N{resp}] zerr{p}; // unscaled residuals\n" ) str_add_list(out) <- stan_prior( prior, class = "sderr", px = px, suffix = p, type = "real", comment = "SD of residuals" ) str_add(out$tpar_def) <- glue( " vector[N{resp}] err{p}; // actual residuals\n" ) str_add(out$tpar_comp) <- glue( " // compute correlated time-series residuals\n", " err{p} = scale_time_err(", "zerr{p}, sderr{p}, chol_cor{p}, nobs_tg{p}, begin_tg{p}, end_tg{p});\n" ) str_add(out$prior) <- glue( " target += normal_lpdf(zerr{p} | 0, 1);\n" ) str_add(out$eta) <- glue(" + err{p}") } } acef_sar <- subset2(acef, class = "sar") if (NROW(acef_sar)) { if (!has_natural_residuals) { stop2("SAR terms are not implemented for this family.") } str_add(out$data) <- glue( " matrix[N{resp}, N{resp}] Msar{p}; // spatial weight matrix\n", " vector[N{resp}] eigenMsar{p}; // eigenvalues of Msar{p}\n" ) str_add(out$tdata_def) <- glue( " // the eigenvalues define the boundaries of the SAR correlation\n", " real min_eigenMsar{p} = min(eigenMsar{p});\n", " real max_eigenMsar{p} = max(eigenMsar{p});\n" ) if (acef_sar$type == "lag") { str_add_list(out) <- stan_prior( prior, class = "lagsar", px = px, suffix = p, type = glue("real"), comment = "lag-SAR correlation parameter" ) } else if (acef_sar$type == "error") { str_add_list(out) <- stan_prior( prior, class = "errorsar", px = px, suffix = p, type = glue("real"), comment = "error-SAR correlation parameter" ) } } acef_car <- subset2(acef, class = "car") if (NROW(acef_car)) { if (is.btnl(bterms)) { stop2("CAR terms are not implemented for non-linear models.") } str_add(out$data) <- glue( " // data for the CAR structure\n", " int Nloc{p};\n", " int Jloc{p}[N{resp}];\n", " int Nedges{p};\n", " int edges1{p}[Nedges{p}];\n", " int edges2{p}[Nedges{p}];\n" ) str_add_list(out) <- stan_prior( prior, class = "sdcar", px = px, suffix = p, type = "real", comment = "SD of the CAR structure" ) str_add(out$loopeta) <- glue(" + rcar{p}[Jloc{p}[n]]") if (acef_car$type %in% c("escar", "esicar")) { str_add(out$data) <- glue( " vector[Nloc{p}] Nneigh{p};\n", " vector[Nloc{p}] eigenMcar{p};\n" ) } if (acef_car$type == "escar") { str_add(out$par) <- glue( " vector[Nloc{p}] rcar{p};\n" ) str_add_list(out) <- stan_prior( prior, class = "car", px = px, suffix = p, type = "real" ) car_args <- c( "car", "sdcar", "Nloc", "Nedges", "Nneigh", "eigenMcar", "edges1", "edges2" ) car_args <- paste0(car_args, p, collapse = ", ") str_add(out$prior) <- glue( " target += sparse_car_lpdf(\n", " rcar{p} | {car_args}\n", " );\n" ) } else if (acef_car$type == "esicar") { str_add(out$par) <- glue( " vector[Nloc{p} - 1] zcar{p};\n" ) str_add(out$tpar_def) <- glue( " vector[Nloc{p}] rcar{p};\n" ) str_add(out$tpar_comp) <- glue( " // sum-to-zero constraint\n", " rcar[1:(Nloc{p} - 1)] = zcar{p};\n", " rcar[Nloc{p}] = - sum(zcar{p});\n" ) car_args <- c( "sdcar", "Nloc", "Nedges", "Nneigh", "eigenMcar", "edges1", "edges2" ) car_args <- paste0(car_args, p, collapse = ", ") str_add(out$prior) <- glue( " target += sparse_icar_lpdf(\n", " rcar{p} | {car_args}\n", " );\n" ) } else if (acef_car$type %in% "icar") { # intrinsic car based on the case study of Mitzi Morris # http://mc-stan.org/users/documentation/case-studies/icar_stan.html str_add(out$par) <- glue( " // parameters for the ICAR structure\n", " vector[Nloc{p}] zcar{p};\n" ) # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- glue( " // scaled parameters for the ICAR structure\n", " vector[Nloc{p}] rcar{p};\n" ) str_add(out$tpar_comp) <- glue( " // compute scaled parameters for the ICAR structure\n", " rcar{p} = zcar{p} * sdcar{p};\n" ) str_add(out$prior) <- glue( " // improper prior on the spatial CAR component\n", " target += -0.5 * dot_self(zcar{p}[edges1{p}] - zcar{p}[edges2{p}]);\n", " // soft sum-to-zero constraint\n", " target += normal_lpdf(sum(zcar{p}) | 0, 0.001 * Nloc{p});\n" ) } else if (acef_car$type == "bym2") { # BYM2 car based on the case study of Mitzi Morris # http://mc-stan.org/users/documentation/case-studies/icar_stan.html str_add(out$data) <- glue( " // scaling factor of the spatial CAR component\n", " real car_scale{p};\n" ) str_add(out$par) <- glue( " // parameters for the BYM2 structure\n", " vector[Nloc{p}] zcar{p}; // spatial part\n", " vector[Nloc{p}] nszcar{p}; // non-spatial part\n", " // proportion of variance in the spatial part\n" ) str_add_list(out) <- stan_prior( prior, class = "rhocar", px = px, suffix = p, type = "real" ) # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- glue( " // scaled parameters for the BYM2 structure\n", " vector[Nloc{p}] rcar{p};\n" ) str_add(out$tpar_comp) <- glue( " // join the spatial and the non-spatial CAR component\n", " rcar{p} = (sqrt(1 - rhocar{p}) * nszcar{p}", " + sqrt(rhocar{p} * inv(car_scale{p})) * zcar{p}) * sdcar{p};\n" ) str_add(out$prior) <- glue( " // improper prior on the spatial BYM2 component\n", " target += -0.5 * dot_self(zcar{p}[edges1{p}] - zcar{p}[edges2{p}]);\n", " // soft sum-to-zero constraint\n", " target += normal_lpdf(sum(zcar{p}) | 0, 0.001 * Nloc{p});\n", " // proper prior on the non-spatial BYM2 component\n", " target += normal_lpdf(nszcar | 0, 1);\n" ) } } acef_fcor <- subset2(acef, class = "fcor") if (NROW(acef_fcor)) { if (!has_natural_residuals) { stop2("FCOR terms are not implemented for this family.") } str_add(out$data) <- glue( " matrix[N{resp}, N{resp}] Mfcor{p}; // known residual covariance matrix\n" ) str_add(out$tdata_def) <- glue( " matrix[N{resp}, N{resp}] Lfcor{p} = cholesky_decompose(Mfcor{p});\n" ) } out } # stan code for offsets stan_offset <- function(bterms, ...) { out <- list() if (is.formula(bterms$offset)) { p <- usc(combine_prefix(bterms)) resp <- usc(bterms$resp) # use 'offsets' as 'offset' will be reserved in stanc3 str_add(out$data) <- glue( " vector[N{resp}] offsets{p};\n") str_add(out$eta) <- glue(" + offsets{p}") } out } # add the denominator of a rate response to the Stan predictor term # @param loop is the denominator added within a loop over observations? stan_rate <- function(bterms, loop = FALSE, ...) { loop <- as_one_logical(loop) out <- list() if (is.formula(bterms$adforms$rate)) { # TODO: support other link functions as well? if (bterms$family$link != "log") { stop2("The 'rate' addition term requires a log-link.") } resp <- usc(bterms$resp) n <- str_if(loop, "[n]") str_add(out$eta) <- glue(" + log_denom{resp}{n}") } out } # global Stan definitions for noise-free variables # @param meef output of tidy_meef stan_Xme <- function(meef, prior) { stopifnot(is.meef_frame(meef)) if (!nrow(meef)) { return(list()) } out <- list() coefs <- rename(paste0("me", meef$xname)) str_add(out$data) <- " // data for noise-free variables\n" str_add(out$par) <- " // parameters for noise free variables\n" groups <- unique(meef$grname) for (i in seq_along(groups)) { g <- groups[i] K <- which(meef$grname %in% g) if (nzchar(g)) { Nme <- glue("Nme_{i}") str_add(out$data) <- glue( " int Nme_{i}; // number of latent values\n", " int Jme_{i}[N]; // group index per observation\n" ) } else { Nme <- "N" } str_add(out$data) <- glue( " int Mme_{i}; // number of groups\n" ) str_add(out$data) <- cglue( " vector[{Nme}] Xn_{K}; // noisy values\n", " vector[{Nme}] noise_{K}; // measurement noise\n" ) str_add_list(out) <- stan_prior( prior, "meanme", coef = coefs[K], suffix = usc(i), type = glue("vector[Mme_{i}]"), comment = "latent means" ) str_add_list(out) <- stan_prior( prior, "sdme", coef = coefs[K], suffix = usc(i), type = glue("vector[Mme_{i}]"), coef_type = "real", comment = "latent SDs" ) str_add(out$prior) <- cglue( " target += normal_lpdf(Xn_{K} | Xme_{K}, noise_{K});\n" ) if (meef$cor[K[1]] && length(K) > 1L) { str_add(out$data) <- glue( " int NCme_{i}; // number of latent correlations\n" ) str_add(out$par) <- glue( " matrix[Mme_{i}, {Nme}] zme_{i}; // standardized latent values\n" ) str_add_list(out) <- stan_prior( prior, "Lme", group = g, suffix = usc(i), type = glue("cholesky_factor_corr[Mme_{i}]"), comment = "cholesky factor of the latent correlation matrix" ) # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- glue( " matrix[{Nme}, Mme_{i}] Xme{i}; // actual latent values\n" ) str_add(out$tpar_comp) <- glue( " // compute actual latent values\n", " Xme{i} = rep_matrix(meanme_{i}', {Nme}) ", " + (diag_pre_multiply(sdme_{i}, Lme_{i}) * zme_{i})';\n" ) str_add(out$tpar_def) <- cglue( " // using separate vectors increases efficiency\n", " vector[{Nme}] Xme_{K};\n" ) str_add(out$tpar_comp) <- cglue( " Xme_{K} = Xme{i}[, {K}];\n" ) str_add(out$prior) <- glue( " target += normal_lpdf(to_vector(zme_{i}) | 0, 1);\n" ) str_add(out$gen_def) <- cglue( " // obtain latent correlation matrix\n", " corr_matrix[Mme_{i}] Corme_{i}", " = multiply_lower_tri_self_transpose(Lme_{i});\n", " vector[NCme_{i}] corme_{i};\n" ) str_add(out$gen_comp) <- stan_cor_gen_comp( cor = glue("corme_{i}"), ncol = glue("Mme_{i}") ) } else { str_add(out$par) <- cglue( " vector[{Nme}] zme_{K}; // standardized latent values\n" ) # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- cglue( " vector[{Nme}] Xme_{K}; // actual latent values\n" ) str_add(out$tpar_def) <- cglue( " // compute actual latent values\n", " Xme_{K} = meanme_{i}[{K}] + sdme_{i}[{K}] * zme_{K};\n" ) str_add(out$prior) <- cglue( " target += normal_lpdf(zme_{K} | 0, 1);\n" ) } } out } # initialize and compute a linear predictor term in Stan language # @param out list of character strings containing Stan code # @param bterms btl object # @param ranef output of tidy_ranef # @param ilink character vector of length 2 defining the link to be applied # @param ... currently unused # @return list of character strings containing Stan code stan_eta_combine <- function(out, bterms, ranef, ilink = c("", ""), ...) { stopifnot(is.list(out), is.btl(bterms), length(ilink) == 2L) px <- check_prefix(bterms) resp <- usc(bterms$resp) eta <- combine_prefix(px, keep_mu = TRUE, nlp = TRUE) out$eta <- sub("^[ \t\r\n]+\\+", "", out$eta, perl = TRUE) str_add(out$model_def) <- glue( " // initialize linear predictor term\n", " vector[N{resp}] {eta} ={out$eta};\n" ) out$eta <- NULL str_add(out$loopeta) <- stan_eta_re(ranef, px = px) if (nzchar(out$loopeta)) { # parts of eta are computed in a loop over observations out$loopeta <- sub("^[ \t\r\n]+\\+", "", out$loopeta, perl = TRUE) str_add(out$model_comp_eta_loop) <- glue( " for (n in 1:N{resp}) {{\n", " // add more terms to the linear predictor\n", " {eta}[n] +={out$loopeta};\n", " }}\n" ) } out$loopeta <- NULL # possibly transform eta before it is passed to the likelihood if (sum(nzchar(ilink))) { # make sure mu comes last as it might depend on other parameters is_mu <- isTRUE("mu" %in% dpar_class(bterms[["dpar"]])) position <- str_if(is_mu, "model_comp_mu_link", "model_comp_dpar_link") str_add(out[[position]]) <- glue( " for (n in 1:N{resp}) {{\n", " // apply the inverse link function\n", " {eta}[n] = {ilink[1]}{eta}[n]{ilink[2]};\n", " }}\n" ) } out } # define Stan code to compute the fixef part of eta # @param fixef names of the population-level effects # @param bterms object of class 'btl' # @return a single character string stan_eta_fe <- function(fixef, bterms) { if (length(fixef)) { p <- usc(combine_prefix(bterms)) center_X <- stan_center_X(bterms) decomp <- get_decomp(bterms$fe) sparse <- is_sparse(bterms$fe) if (sparse) { stopifnot(!center_X && decomp == "none") csr_args <- sargs( paste0(c("rows", "cols"), "(X", p, ")"), paste0(c("wX", "vX", "uX", "b"), p) ) eta_fe <- glue("csr_matrix_times_vector({csr_args})") } else { sfx_X <- sfx_b <- "" if (decomp == "QR") { sfx_X <- sfx_b <- "Q" } else if (center_X) { sfx_X <- "c" } eta_fe <- glue("X{sfx_X}{p} * b{sfx_b}{p}") } } else { resp <- usc(bterms$resp) eta_fe <- glue("rep_vector(0, N{resp})") } glue(" + {eta_fe}") } # write the group-level part of the linear predictor # @return a single character string stan_eta_re <- function(ranef, px = list()) { eta_re <- "" ranef <- subset2(ranef, type = c("", "mmc"), ls = px) for (id in unique(ranef$id)) { r <- subset2(ranef, id = id) rpx <- check_prefix(r) idp <- paste0(r$id, usc(combine_prefix(rpx))) idresp <- paste0(r$id, usc(rpx$resp)) if (r$gtype[1] == "mm") { ng <- seq_along(r$gcall[[1]]$groups) for (i in seq_rows(r)) { str_add(eta_re) <- cglue( " + W_{idresp[i]}_{ng}[n]", " * r_{idp[i]}_{r$cn[i]}[J_{idresp[i]}_{ng}[n]]", " * Z_{idp[i]}_{r$cn[i]}_{ng}[n]" ) } } else { str_add(eta_re) <- cglue( " + r_{idp}_{r$cn}[J_{idresp}[n]] * Z_{idp}_{r$cn}[n]" ) } } eta_re } # Stan code for group-level parameters in special predictor terms # @param r data.frame created by tidy_ranef # @return a character vector: one element per row of 'r' stan_eta_rsp <- function(r) { stopifnot(nrow(r) > 0L, length(unique(r$gtype)) == 1L) rpx <- check_prefix(r) idp <- paste0(r$id, usc(combine_prefix(rpx))) idresp <- paste0(r$id, usc(rpx$resp)) if (r$gtype[1] == "mm") { ng <- seq_along(r$gcall[[1]]$groups) out <- rep("", nrow(r)) for (i in seq_along(out)) { out[i] <- glue( "W_{idresp[i]}_{ng}[n] * r_{idp[i]}_{r$cn[i]}[J_{idresp[i]}_{ng}[n]]", collapse = " + " ) } } else { out <- glue("r_{idp}_{r$cn}[J_{idresp}[n]]") } out } # does eta need to be transformed manually using the link functions # @param family the model family # @param cens_or_trunc is the model censored or truncated? stan_eta_transform <- function(family, cens_or_trunc = FALSE) { transeta <- "transeta" %in% family_info(family, "specials") no_transform <- family$link == "identity" && !transeta || is_polytomous(family) && !is.customfamily(family) !no_transform && !stan_has_built_in_fun(family, cens_or_trunc) } # correctly apply inverse link to eta # @param dpar name of the parameter for which to define the link # @param bterms object of class 'brmsterms' # @param resp name of the response variable # @return a single character string stan_eta_ilink <- function(dpar, bterms, resp = "") { stopifnot(is.brmsterms(bterms)) out <- rep("", 2) family <- bterms$dpars[[dpar]]$family cens_or_trunc <- stan_llh_adj(bterms$adforms, c("cens", "trunc")) if (stan_eta_transform(family, cens_or_trunc = cens_or_trunc)) { dpar_id <- dpar_id(dpar) pred_dpars <- names(bterms$dpars) shape <- glue("shape{dpar_id}{resp}") shape <- str_if(shape %in% pred_dpars, paste0(shape, "[n]"), shape) nu <- glue("nu{dpar_id}{resp}") nu <- str_if(nu %in% pred_dpars, paste0(nu, "[n]"), nu) family_link <- str_if( family$family %in% c("gamma", "hurdle_gamma", "exponential"), paste0(family$family, "_", family$link), family$family ) ilink <- stan_ilink(family$link) out <- switch(family_link, c(glue("{ilink}("), ")"), gamma_log = c(glue("{shape} * exp(-("), "))"), gamma_inverse = c(glue("{shape} * ("), ")"), gamma_identity = c(glue("{shape} / ("), ")"), hurdle_gamma_log = c(glue("{shape} * exp(-("), "))"), hurdle_gamma_inverse = c(glue("{shape} * ("), ")"), hurdle_gamma_identity = c(glue("{shape} / ("), ")"), exponential_log = c("exp(-(", "))"), exponential_inverse = c("(", ")"), exponential_identity = c("inv(", ")"), weibull = c(glue("{ilink}("), glue(") / tgamma(1 + 1 / {shape})")), frechet = c(glue("{ilink}("), glue(") / tgamma(1 - 1 / {nu})")) ) } out } # indicate if the population-level design matrix should be centered # implies a temporary shift in the intercept of the model stan_center_X <- function(x) { is.btl(x) && !no_center(x$fe) && has_intercept(x$fe) && !fix_intercepts(x) && !is_sparse(x$fe) } # default Stan definitions for distributional parameters # @param dpar name of a distributional parameter # @param suffix optional suffix of the parameter name # @param family optional brmsfamily object # @param fixed should the parameter be fixed to a certain value? stan_dpar_types <- function(dpar, suffix = "", family = NULL, fixed = FALSE) { dpar <- as_one_character(dpar) suffix <- as_one_character(suffix) fixed <- as_one_logical(fixed) if (is.mixfamily(family)) { if (dpar_class(dpar) == "theta") { return("") # theta is handled in stan_mixture } family <- family$mix[[as.numeric(dpar_id(dpar))]] } if (is.customfamily(family)) { dpar_class <- dpar_class(dpar) lb <- family$lb[[dpar_class]] ub <- family$ub[[dpar_class]] lb <- if (!is.na(lb)) glue("lower={lb}") ub <- if (!is.na(ub)) glue("upper={ub}") bounds <- paste0(c(lb, ub), collapse = ",") if (nzchar(bounds)) bounds <- glue("<{bounds}>") return(glue("real{bounds}")) } if (fixed) { min_Y <- glue("min(Y{suffix})") } else { min_Y <- glue("min_Y{suffix}") } default_types <- list( sigma = list( type = "real", comment = "residual SD" ), shape = list( type = "real", comment = "shape parameter" ), nu = list( type = "real", comment = "degrees of freedom or shape" ), phi = list( type = "real", comment = "precision parameter" ), kappa = list( type = "real", comment = "precision parameter" ), beta = list( type = "real", comment = "scale parameter" ), zi = list( type = "real", comment = "zero-inflation probability" ), hu = list( type = "real", comment = "hurdle probability" ), zoi = list( type = "real", comment = "zero-one-inflation probability" ), coi = list( type = "real", comment = "conditional one-inflation probability" ), bs = list( type = "real", comment = "boundary separation parameter" ), ndt = list( type = glue("real"), comment = "non-decision time parameter" ), bias = list( type = "real", comment = "initial bias parameter" ), disc = list( type = "real", comment = "discrimination parameters" ), quantile = list( type = "real", comment = "quantile parameter" ), xi = list( type = "real", comment = "shape parameter" ), alpha = list( type = "real", comment = "skewness parameter" ) ) out <- "" types <- default_types[[dpar_class(dpar)]] if (!is.null(types)) { out <- types$type attr(out, "comment") <- types$comment } out } # default Stan definitions for temporary distributional parameters stan_dpar_tmp_types <- function(dpar, suffix = "", family = NULL) { dpar <- as_one_character(dpar) suffix <- as_one_character(suffix) if (is.mixfamily(family)) { family <- family$mix[[as.numeric(dpar_id(dpar))]] } if (is.customfamily(family)) { return("") # no temporary parameters in custom families } default_types <- list( xi = list( type = "real", comment = "unscaled shape parameter" ) ) out <- "" types <- default_types[[dpar_class(dpar)]] if (!is.null(types)) { out <- types$type attr(out, "comment") <- types$comment } out } # Stan code for transformations of distributional parameters stan_dpar_transform <- function(bterms) { stopifnot(is.brmsterms(bterms)) out <- list() families <- family_names(bterms) p <- usc(combine_prefix(bterms)) resp <- usc(bterms$resp) if (any(conv_cats_dpars(families))) { str_add(out$model_def) <- glue( " // linear predictor matrix\n", " vector[ncat{p}] mu{p}[N{resp}];\n" ) mu_dpars <- make_stan_names(glue("mu{bterms$family$cats}")) mu_dpars <- glue("{mu_dpars}{p}[n]") iref <- match(bterms$family$refcat, bterms$family$cats) mu_dpars[iref] <- "0" str_add(out$model_comp_catjoin) <- glue( " for (n in 1:N{resp}) {{\n", " mu{p}[n] = {stan_vector(mu_dpars)};\n", " }}\n" ) } if (any(families %in% "skew_normal")) { # as suggested by Stephen Martin use sigma and mu of CP # but the skewness parameter alpha of DP dp_names <- names(bterms$dpars) for (i in which(families %in% "skew_normal")) { id <- str_if(length(families) == 1L, "", i) sigma <- stan_sigma_transform(bterms, id = id) ns <- str_if(grepl("\\[n\\]", sigma), "[n]") na <- str_if(glue("alpha{id}") %in% dp_names, "[n]") type_delta <- str_if(nzchar(na), glue("vector[N{resp}]"), "real") no <- str_if(any(nzchar(c(ns, na))), "[n]", "") type_omega <- str_if(nzchar(no), glue("vector[N{resp}]"), "real") str_add(out$model_def) <- glue( " // parameters used to transform the skew-normal distribution\n", " {type_delta} delta{id}{p}; // transformed alpha parameter\n", " {type_omega} omega{id}{p}; // scale parameter\n" ) alpha <- glue("alpha{id}{p}{na}") delta <- glue("delta{id}{p}{na}") omega <- glue("omega{id}{p}{no}") comp_delta <- glue( " {delta} = {alpha} / sqrt(1 + {alpha}^2);\n" ) comp_omega <- glue( " {omega} = {sigma} / sqrt(1 - sqrt_2_div_pi^2 * {delta}^2);\n" ) str_add(out$model_comp_dpar_trans) <- glue( " // use efficient skew-normal parameterization\n", str_if(!nzchar(na), comp_delta), str_if(!nzchar(no), comp_omega), " for (n in 1:N{resp}) {{\n", str_if(nzchar(na), glue(" ", comp_delta)), str_if(nzchar(no), glue(" ", comp_omega)), " mu{id}{p}[n] = mu{id}{p}[n]", " - {omega} * {delta} * sqrt_2_div_pi;\n", " }}\n" ) } } if (any(families %in% "gen_extreme_value")) { dp_names <- c(names(bterms$dpars), names(bterms$fdpars)) for (i in which(families %in% "gen_extreme_value")) { id <- str_if(length(families) == 1L, "", i) xi <- glue("xi{id}") if (!xi %in% dp_names) { str_add(out$model_def) <- glue( " real {xi}; // scaled shape parameter\n" ) sigma <- glue("sigma{id}") sfx <- str_if(sigma %in% names(bterms$dpars), "_vector") args <- sargs( glue("tmp_{xi}"), glue("Y{p}"), glue("mu{id}{p}"), glue("{sigma}{p}") ) str_add(out$model_comp_dpar_trans) <- glue( " {xi}{p} = scale_xi{sfx}({args});\n" ) } } } out } # Stan code for sigma to incorporate addition argument 'se' stan_sigma_transform <- function(bterms, id = "") { if (nzchar(id)) { family <- family_names(bterms)[as.integer(id)] } else { family <- bterms$family$family } p <- usc(combine_prefix(bterms)) ns <- str_if(glue("sigma{id}") %in% names(bterms$dpars), "[n]") has_sigma <- has_sigma(family) && !no_sigma(bterms) sigma <- str_if(has_sigma, glue("sigma{id}{p}{ns}")) if (is.formula(bterms$adforms$se)) { sigma <- str_if(nzchar(sigma), glue("sqrt({sigma}^2 + se2{p}[n])"), glue("se{p}[n]") ) } sigma } brms/R/priors.R0000644000176200001440000021734413612535004013071 0ustar liggesusers#' Prior Definitions for \pkg{brms} Models #' #' Define priors for specific parameters or classes of parameters. #' #' @aliases brmsprior brmsprior-class #' #' @param prior A character string defining a distribution in \pkg{Stan} language #' @param class The parameter class. Defaults to \code{"b"} #' (i.e. population-level effects). #' See 'Details' for other valid parameter classes. #' @param coef Name of the coefficient within the parameter class. #' @param group Grouping factor for group-level parameters. #' @param resp Name of the response variable. #' Only used in multivariate models. #' @param dpar Name of a distributional parameter. #' Only used in distributional models. #' @param nlpar Name of a non-linear parameter. #' Only used in non-linear models. #' @param lb Lower bound for parameter restriction. Currently only allowed #' for classes \code{"b"}. Defaults to \code{NULL}, that is no restriction. #' @param ub Upper bound for parameter restriction. Currently only allowed #' for classes \code{"b"}. Defaults to \code{NULL}, that is no restriction. #' @param check Logical; Indicates whether priors #' should be checked for validity (as far as possible). #' Defaults to \code{TRUE}. If \code{FALSE}, \code{prior} is passed #' to the Stan code as is, and all other arguments are ignored. #' @param ... Arguments passed to \code{set_prior}. #' #' @return An object of class \code{brmsprior} to be used in the \code{prior} #' argument of \code{\link{brm}}. #' #' @details #' \code{set_prior} is used to define prior distributions for parameters #' in \pkg{brms} models. The functions \code{prior}, \code{prior_}, and #' \code{prior_string} are aliases of \code{set_prior} each allowing #' for a different kind of argument specification. #' \code{prior} allows specifying arguments as expression without #' quotation marks using non-standard evaluation. #' \code{prior_} allows specifying arguments as one-sided formulas #' or wrapped in \code{quote}. #' \code{prior_string} allows specifying arguments as strings just #' as \code{set_prior} itself. #' #' Below, we explain its usage and list some common #' prior distributions for parameters. #' A complete overview on possible prior distributions is given #' in the Stan Reference Manual available at \url{http://mc-stan.org/}. #' #' To combine multiple priors, use \code{c(...)} or the \code{+} operator #' (see 'Examples'). \pkg{brms} does not check if the priors are written #' in correct \pkg{Stan} language. Instead, \pkg{Stan} will check their #' syntactical correctness when the model is parsed to \code{C++} and #' returns an error if they are not. #' This, however, does not imply that priors are always meaningful if they are #' accepted by \pkg{Stan}. Although \pkg{brms} trys to find common problems #' (e.g., setting bounded priors on unbounded parameters), there is no guarantee #' that the defined priors are reasonable for the model. #' Below, we list the types of parameters in \pkg{brms} models, #' for which the user can specify prior distributions. #' #' 1. Population-level ('fixed') effects #' #' Every Population-level effect has its own regression parameter # These parameters are internally named as \code{b_}, where \code{} #' represents the name of the corresponding population-level effect. #' Suppose, for instance, that \code{y} is predicted by \code{x1} and \code{x2} #' (i.e., \code{y ~ x1 + x2} in formula syntax). #' Then, \code{x1} and \code{x2} have regression parameters #' \code{b_x1} and \code{b_x2} respectively. #' The default prior for population-level effects (including monotonic and #' category specific effects) is an improper flat prior over the reals. #' Other common options are normal priors or student-t priors. #' If we want to have a normal prior with mean 0 and #' standard deviation 5 for \code{x1}, and a unit student-t prior with 10 #' degrees of freedom for \code{x2}, we can specify this via #' \code{set_prior("normal(0,5)", class = "b", coef = "x1")} and \cr #' \code{set_prior("student_t(10,0,1)", class = "b", coef = "x2")}. #' To put the same prior on all population-level effects at once, #' we may write as a shortcut \code{set_prior("", class = "b")}. #' This also leads to faster sampling, because priors can be vectorized in this case. #' Both ways of defining priors can be combined using for instance #' \code{set_prior("normal(0,2)", class = "b")} and \cr #' \code{set_prior("normal(0,10)", class = "b", coef = "x1")} #' at the same time. This will set a \code{normal(0,10)} prior on #' the effect of \code{x1} and a \code{normal(0,2)} prior #' on all other population-level effects. #' However, this will break vectorization and #' may slow down the sampling procedure a bit. #' #' In case of the default intercept parameterization #' (discussed in the 'Details' section of \code{\link{brmsformula}}), #' general priors on class \code{"b"} will \emph{not} affect #' the intercept. Instead, the intercept has its own parameter class #' named \code{"Intercept"} and priors can thus be #' specified via \code{set_prior("", class = "Intercept")}. #' Setting a prior on the intercept will not break vectorization #' of the other population-level effects. #' Note that technically, this prior is set on an intercept that #' results when internally centering all population-level predictors #' around zero to improve sampling efficiency. On this centered #' intercept, specifying a prior is actually much easier and #' intuitive than on the original intercept, since the former #' represents the expected response value when all predictors #' are at their means. To treat the intercept as an ordinary #' population-level effect and avoid the centering parameterization, #' use \code{0 + intercept} on the right-hand side of the model formula. #' #' A special shrinkage prior to be applied on population-level effects is the #' (regularized) horseshoe prior and related priors. See #' \code{\link{horseshoe}} for details. Another shrinkage prior is the #' so-called lasso prior. See \code{\link{lasso}} for details. #' #' In non-linear models, population-level effects are defined separately #' for each non-linear parameter. Accordingly, it is necessary to specify #' the non-linear parameter in \code{set_prior} so that priors #' we can be assigned correctly. #' If, for instance, \code{alpha} is the parameter and \code{x} the predictor #' for which we want to define the prior, we can write #' \code{set_prior("", coef = "x", nlpar = "alpha")}. #' As a shortcut we can use \code{set_prior("", nlpar = "alpha")} #' to set the same prior on all population-level effects of \code{alpha} at once. #' #' If desired, population-level effects can be restricted to fall only #' within a certain interval using the \code{lb} and \code{ub} arguments #' of \code{set_prior}. This is often required when defining priors #' that are not defined everywhere on the real line, such as uniform #' or gamma priors. When defining a \code{uniform(2,4)} prior, #' you should write \code{set_prior("uniform(2,4)", lb = 2, ub = 4)}. #' When using a prior that is defined on the positive reals only #' (such as a gamma prior) set \code{lb = 0}. #' In most situations, it is not useful to restrict population-level #' parameters through bounded priors #' (non-linear models are an important exception), #' but if you really want to this is the way to go. #' #' 2. Standard deviations of group-level ('random') effects #' #' Each group-level effect of each grouping factor has a standard deviation named #' \code{sd__}. Consider, for instance, the formula #' \code{y ~ x1 + x2 + (1 + x1 | g)}. #' We see that the intercept as well as \code{x1} are group-level effects #' nested in the grouping factor \code{g}. #' The corresponding standard deviation parameters are named as #' \code{sd_g_Intercept} and \code{sd_g_x1} respectively. #' These parameters are restricted to be non-negative and, by default, #' have a half student-t prior with 3 degrees of freedom and a #' scale parameter that depends on the standard deviation of the response #' after applying the link function. Minimally, the scale parameter is 10. #' This prior is used (a) to be only very weakly informative in order to influence #' results as few as possible, while (b) providing at least some regularization #' to considerably improve convergence and sampling efficiency. #' To define a prior distribution only for standard deviations #' of a specific grouping factor, #' use \cr \code{set_prior("", class = "sd", group = "")}. #' To define a prior distribution only for a specific standard deviation #' of a specific grouping factor, you may write \cr #' \code{set_prior("", class = "sd", group = "", coef = "")}. #' Recommendations on useful prior distributions for #' standard deviations are given in Gelman (2006), but note that he #' is no longer recommending uniform priors, anymore. \cr #' #' When defining priors on group-level parameters in non-linear models, #' please make sure to specify the corresponding non-linear parameter #' through the \code{nlpar} argument in the same way as #' for population-level effects. #' #' 3. Correlations of group-level ('random') effects #' #' If there is more than one group-level effect per grouping factor, #' the correlations between those effects have to be estimated. #' The prior \code{lkj_corr_cholesky(eta)} or in short #' \code{lkj(eta)} with \code{eta > 0} #' is essentially the only prior for (Cholesky factors) of correlation matrices. #' If \code{eta = 1} (the default) all correlations matrices #' are equally likely a priori. If \code{eta > 1}, extreme correlations #' become less likely, whereas \code{0 < eta < 1} results in #' higher probabilities for extreme correlations. #' Correlation matrix parameters in \code{brms} models are named as #' \code{cor_}, (e.g., \code{cor_g} if \code{g} is the grouping factor). #' To set the same prior on every correlation matrix, #' use for instance \code{set_prior("lkj(2)", class = "cor")}. #' Internally, the priors are transformed to be put on the Cholesky factors #' of the correlation matrices to improve efficiency and numerical stability. #' The corresponding parameter class of the Cholesky factors is \code{L}, #' but it is not recommended to specify priors for this parameter class directly. #' #' 4. Splines #' #' Splines are implemented in \pkg{brms} using the 'random effects' #' formulation as explained in \code{\link[mgcv:gamm]{gamm}}). #' Thus, each spline has its corresponding standard deviations #' modeling the variability within this term. In \pkg{brms}, this #' parameter class is called \code{sds} and priors can #' be specified via \code{set_prior("", class = "sds", #' coef = "")}. The default prior is the same as #' for standard deviations of group-level effects. #' #' 5. Gaussian processes #' #' Gaussian processes as currently implemented in \pkg{brms} have #' two parameters, the standard deviation parameter \code{sdgp}, #' and characteristic length-scale parameter \code{lscale} #' (see \code{\link{gp}} for more details). The default prior #' of \code{sdgp} is the same as for standard deviations of #' group-level effects. The default prior of \code{lscale} #' is an informative inverse-gamma prior specifically tuned #' to the covariates of the Gaussian process (for more details see #' \url{https://betanalpha.github.io/assets/case_studies/gp_part3/part3.html}). #' This tuned prior may be overly informative in some cases, so please #' consider other priors as well to make sure inference is #' robust to the prior specification. If tuning fails, a half-normal prior #' is used instead. #' #' 6. Autocorrelation parameters #' #' The autocorrelation parameters currently implemented are named #' \code{ar} (autoregression), \code{ma} (moving average), #' \code{arr} (autoregression of the response), \code{car} #' (spatial conditional autoregression), as well as \code{lagsar} #' and \code{errorsar} (Spatial simultaneous autoregression). #' #' Priors can be defined by \code{set_prior("", class = "ar")} #' for \code{ar} and similar for other autocorrelation parameters. #' By default, \code{ar} and \code{ma} are bounded between \code{-1} #' and \code{1}, \code{car}, \code{lagsar}, and \code{errorsar} are #' bounded between \code{0}, and \code{1}, and \code{arr} is unbounded #' (you may change this by using the arguments \code{lb} and \code{ub}). #' The default prior is flat over the definition area. #' #' 7. Distance parameters of monotonic effects #' #' As explained in the details section of \code{\link{brm}}, #' monotonic effects make use of a special parameter vector to #' estimate the 'normalized distances' between consecutive predictor #' categories. This is realized in \pkg{Stan} using the \code{simplex} #' parameter type. This class is named \code{"simo"} (short for #' simplex monotonic) in \pkg{brms}. #' The only valid prior for simplex parameters is the #' dirichlet prior, which accepts a vector of length \code{K - 1} #' (K = number of predictor categories) as input defining the #' 'concentration' of the distribution. Explaining the dirichlet prior #' is beyond the scope of this documentation, but we want to describe #' how to define this prior syntactically correct. #' If a predictor \code{x} with \code{K} categories is modeled as monotonic, #' we can define a prior on its corresponding simplex via \cr #' \code{prior(dirichlet(), class = simo, coef = mox1)}. #' The \code{1} in the end of \code{coef} indicates that this is the first #' simplex in this term. If interactions between multiple monotonic #' variables are modeled, multiple simplexes per term are required. #' For \code{}, we can put in any \code{R} expression #' defining a vector of length \code{K - 1}. The default is a uniform #' prior (i.e. \code{ = rep(1, K-1)}) over all simplexes #' of the respective dimension. #' #' 8. Parameters for specific families #' #' Some families need additional parameters to be estimated. #' Families \code{gaussian}, \code{student}, \code{skew_normal}, #' \code{lognormal}, and \code{gen_extreme_value} need the parameter #' \code{sigma} to account for the residual standard deviation. #' By default, \code{sigma} has a half student-t prior that scales #' in the same way as the group-level standard deviations. #' Further, family \code{student} needs the parameter #' \code{nu} representing the degrees of freedom of students-t distribution. #' By default, \code{nu} has prior \code{gamma(2, 0.1)} #' and a fixed lower bound of \code{1}. #' Families \code{gamma}, \code{weibull}, \code{inverse.gaussian}, and #' \code{negbinomial} need a \code{shape} parameter that has a #' \code{gamma(0.01, 0.01)} prior by default. #' For families \code{cumulative}, \code{cratio}, \code{sratio}, #' and \code{acat}, and only if \code{threshold = "equidistant"}, #' the parameter \code{delta} is used to model the distance between #' two adjacent thresholds. #' By default, \code{delta} has an improper flat prior over the reals. #' The \code{von_mises} family needs the parameter \code{kappa}, representing #' the concentration parameter. By default, \code{kappa} has prior #' \code{gamma(2, 0.01)}. \cr #' Every family specific parameter has its own prior class, so that #' \code{set_prior("", class = "")} is the right way to go. #' All of these priors are chosen to be weakly informative, #' having only minimal influence on the estimations, #' while improving convergence and sampling efficiency. #' #' Fixing parameters to constants is possible by using the \code{constant} #' function, for example, \code{constant(1)} to fix a parameter to 1. #' Broadcasting to vectors and matrices is done automatically. #' A limitation of the current implementation is that the same parameter #' vector cannot contain estimated and fixed values at the same time, #' but this will be possible in the future. #' #' Often, it may not be immediately clear, which parameters are present in the #' model. To get a full list of parameters and parameter classes for which #' priors can be specified (depending on the model) use function #' \code{\link{get_prior}}. #' #' @seealso \code{\link{get_prior}} #' #' @references #' Gelman A. (2006). Prior distributions for variance parameters in hierarchical models. #' Bayesian analysis, 1(3), 515 -- 534. #' #' @examples #' ## use alias functions #' (prior1 <- prior(cauchy(0, 1), class = sd)) #' (prior2 <- prior_(~cauchy(0, 1), class = ~sd)) #' (prior3 <- prior_string("cauchy(0, 1)", class = "sd")) #' identical(prior1, prior2) #' identical(prior1, prior3) #' #' # check which parameters can have priors #' get_prior(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = cumulative()) #' #' # define some priors #' bprior <- c(prior_string("normal(0,10)", class = "b"), #' prior(normal(1,2), class = b, coef = treat), #' prior_(~cauchy(0,2), class = ~sd, #' group = ~subject, coef = ~Intercept)) #' #' # verify that the priors indeed found their way into Stan's model code #' make_stancode(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = cumulative(), #' prior = bprior) #' #' # use the horseshoe prior to model sparsity in regression coefficients #' make_stancode(count ~ zAge + zBase * Trt, #' data = epilepsy, family = poisson(), #' prior = set_prior("horseshoe(3)")) #' #' # fix certain priors to constants #' bprior <- prior(constant(1), class = "b") + #' prior(constant(2), class = "b", coef = "zBase") + #' prior(constant(0.5), class = "sd") #' make_stancode(count ~ zAge + zBase + (1 | patient), #' data = epilepsy, prior = bprior) #' #' # pass priors to Stan without checking #' prior <- prior_string("target += normal_lpdf(b[1] | 0, 1)", check = FALSE) #' make_stancode(count ~ Trt, data = epilepsy, prior = prior) #' #' @export set_prior <- function(prior, class = "b", coef = "", group = "", resp = "", dpar = "", nlpar = "", lb = NA, ub = NA, check = TRUE) { input <- nlist(prior, class, coef, group, resp, dpar, nlpar, lb, ub, check) input <- try(as.data.frame(input), silent = TRUE) if (is(input, "try-error")) { stop2("Processing arguments of 'set_prior' has failed:\n", input) } out <- vector("list", nrow(input)) for (i in seq_along(out)) { out[[i]] <- do_call(.set_prior, input[i, ]) } Reduce("+", out) } # validate arguments passed to 'set_prior' .set_prior <- function(prior, class, coef, group, resp, dpar, nlpar, lb, ub, check) { prior <- as_one_character(prior) class <- as_one_character(class) group <- as_one_character(group) coef <- as_one_character(coef) resp <- as_one_character(resp) dpar <- as_one_character(dpar) nlpar <- as_one_character(nlpar) lb <- as_one_character(lb, allow_na = TRUE) ub <- as_one_character(ub, allow_na = TRUE) check <- as_one_logical(check) # validate boundaries bound <- "" if (class %in% c("ar", "ma") && (!is.na(lb) || !is.na(ub))) { # changed in version 2.9.5 lb <- ub <- NA warning2( "Changing the boundaries of autocorrelation parameters ", "is deprecated and will be ignored." ) } if (!is.na(lb) || !is.na(ub)) { # TODO: extend the boundary interface to more parameter classes boundary_classes <- c("b") if (!class %in% boundary_classes) { stop2("Currently boundaries are only allowed for classe(s) ", collapse_comma(boundary_classes), "." ) } if (nzchar(coef)) { stop2("Argument 'coef' may not be specified when using boundaries.") } # don't put spaces in boundary declarations lb <- if (!is.na(lb)) paste0("lower=", lb) ub <- if (!is.na(ub)) paste0("upper=", ub) if (!is.null(lb) || !is.null(ub)) { bound <- paste0("<", paste(c(lb, ub), collapse = ","), ">") } } if (!check) { # prior will be added to the log-posterior as is class <- coef <- group <- resp <- dpar <- nlpar <- bound <- "" } do_call(brmsprior, nlist(prior, class, coef, group, resp, dpar, nlpar, bound) ) } #' @describeIn set_prior Alias of \code{set_prior} allowing to #' specify arguments as expressions without quotation marks. #' @export prior <- function(prior, ...) { call <- as.list(match.call()[-1]) seval <- rmNULL(call[prior_seval_args()]) call[prior_seval_args()] <- NULL call <- lapply(call, deparse_no_string) do_call(set_prior, c(call, seval)) } #' @describeIn set_prior Alias of \code{set_prior} allowing to specify #' arguments as as one-sided formulas or wrapped in \code{quote}. #' @export prior_ <- function(prior, ...) { call <- nlist(prior, ...) seval <- rmNULL(call[prior_seval_args()]) call[prior_seval_args()] <- NULL as_string <- function(x) { if (is.formula(x) && length(x) == 2) { deparse_no_string(x[[2]]) } else if (is.call(x) || is.name(x) || is.atomic(x)) { deparse_no_string(x) } else { stop2("Arguments must be one-sided formula, call, name, or constant.") } } call <- lapply(call, as_string) do_call(set_prior, c(call, seval)) } # arguments for which to use standard evaluation prior_seval_args <- function() { c("check") } #' @describeIn set_prior Alias of \code{set_prior} allowing to #' specify arguments as strings. #' @export prior_string <- function(prior, ...) { set_prior(prior, ...) } #' Overview on Priors for \pkg{brms} Models #' #' Get information on all parameters (and parameter classes) for which priors #' may be specified including default priors. #' #' @inheritParams brm #' @param internal A flag indicating if the names of additional internal #' parameters should be displayed. Setting priors on these parameters is not #' recommended #' @param ... Currently ignored. #' #' @return A data.frame with columns \code{prior}, \code{class}, \code{coef}, #' and \code{group} and several rows, each providing information on a #' parameter (or parameter class) on which priors can be specified. The prior #' column is empty except for internal default priors. #' #' @seealso \code{\link{set_prior}} #' #' @examples #' ## get all parameters and parameters classes to define priors on #' (prior <- get_prior(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), #' data = epilepsy, family = poisson())) #' #' ## define a prior on all population-level effects a once #' prior$prior[1] <- "normal(0,10)" #' #' ## define a specific prior on the population-level effect of Trt #' prior$prior[5] <- "student_t(10, 0, 5)" #' #' ## verify that the priors indeed found their way into Stan's model code #' make_stancode(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), #' data = epilepsy, family = poisson(), #' prior = prior) #' #' @export get_prior <- function(formula, data, family = gaussian(), autocor = NULL, sparse = NULL, internal = FALSE, ...) { if (is.brmsfit(formula)) { stop2("Use 'prior_summary' to extract priors from 'brmsfit' objects.") } internal <- as_one_logical(internal) formula <- validate_formula( formula, data = data, family = family, autocor = autocor, sparse = sparse ) bterms <- parse_bf(formula) data <- validate_data(data, bterms = bterms) ranef <- tidy_ranef(bterms, data) meef <- tidy_meef(bterms, data) # initialize output prior <- empty_prior() # priors for distributional parameters prior <- prior + prior_predictor( bterms, data = data, internal = internal ) # priors of group-level parameters def_scale_prior <- def_scale_prior(bterms, data) prior <- prior + prior_re( ranef, def_scale_prior = def_scale_prior, internal = internal ) # priors for noise-free variables prior <- prior + prior_Xme(meef, internal = internal) # do not remove unique(.) to_order <- with(prior, order(resp, dpar, nlpar, class, group, coef)) prior <- unique(prior[to_order, , drop = FALSE]) rownames(prior) <- NULL structure(prior, class = c("brmsprior", "data.frame")) } # generate priors for predictor terms # @return a 'brmsprior' object prior_predictor <- function(x, ...) { UseMethod("prior_predictor") } #' @export prior_predictor.default <- function(x, ...) { empty_prior() } prior_predictor.mvbrmsterms <- function(x, internal = FALSE, ...) { prior <- empty_prior() for (i in seq_along(x$terms)) { prior <- prior + prior_predictor(x$terms[[i]], ...) } for (cl in c("b", "Intercept")) { # deprecated; see warning in 'check_prior_special' if (any(with(prior, class == cl & coef == ""))) { prior <- prior + brmsprior(class = cl) } } if (x$rescor) { if (internal) { prior <- prior + brmsprior(class = "Lrescor", prior = "lkj_corr_cholesky(1)") } else { prior <- prior + brmsprior(class = "rescor", prior = "lkj(1)") } if (family_names(x)[1] %in% "student") { prior <- prior + brmsprior(class = "nu", prior = "gamma(2, 0.1)") } } prior } prior_predictor.brmsterms <- function(x, data, ...) { data <- subset_data(data, x) def_scale_prior <- def_scale_prior(x, data) valid_dpars <- valid_dpars(x) prior <- empty_prior() # priors for mixture models if (is.mixfamily(x$family)) { if (has_joint_theta(x)) { # individual theta parameters should not have a prior in this case theta_dpars <- str_subset(valid_dpars, "^theta[[:digit:]]+") valid_dpars <- setdiff(valid_dpars, theta_dpars) prior <- prior + brmsprior(class = "theta", resp = x$resp) } if (fix_intercepts(x)) { # fixing thresholds across mixture componenents # requires a single set of priors at the top level stopifnot(is_ordinal(x)) prior <- prior + prior_thres(x, def_scale_prior = def_scale_prior) } } # priors for distributional parameters for (dp in valid_dpars) { def_dprior <- def_dprior(x, dp, data = data) if (!is.null(x$dpars[[dp]])) { # parameter is predicted dp_prior <- prior_predictor( x$dpars[[dp]], data = data, def_scale_prior = def_scale_prior, def_dprior = def_dprior ) } else if (!is.null(x$fdpars[[dp]])) { # parameter is fixed dp_prior <- empty_prior() } else { # parameter is estimated dp_prior <- brmsprior(def_dprior, class = dp, resp = x$resp) } prior <- prior + dp_prior } # priors for non-linear parameters for (nlp in names(x$nlpars)) { nlp_prior <- prior_predictor( x$nlpars[[nlp]], data = data, def_scale_prior = def_scale_prior, def_dprior = def_dprior ) prior <- prior + nlp_prior } if (conv_cats_dpars(x$family)) { # deprecated; see warning in 'check_prior_special' for (cl in c("b", "Intercept")) { if (any(find_rows(prior, class = cl, coef = "", resp = x$resp))) { prior <- prior + brmsprior(class = cl, resp = x$resp) } } } # priors for noise-free response variables sdy <- get_sdy(x, data) if (!is.null(sdy)) { prior <- prior + brmsprior(class = "meanme", resp = x$resp) + brmsprior(class = "sdme", resp = x$resp) } # priors for autocorrelation parameters # prior <- prior + prior_autocor(x, def_scale_prior = def_scale_prior) prior } # prior for linear predictor termss #' @export prior_predictor.btl <- function(x, ...) { prior_fe(x, ...) + prior_thres(x, ...) + prior_sp(x, ...) + prior_cs(x, ...) + prior_sm(x, ...) + prior_gp(x, ...) + prior_ac(x, ...) + prior_bhaz(x, ...) } # priors for non-linear predictor terms #' @export prior_predictor.btnl <- function(x, ...) { # thresholds are required even in non-linear ordinal models prior_thres(x, ...) + prior_ac(x, ...) } # priors for population-level parameters prior_fe <- function(bterms, data, def_dprior = "", ...) { prior <- empty_prior() fixef <- colnames(data_fe(bterms, data)$X) px <- check_prefix(bterms) center_X <- stan_center_X(bterms) if (center_X && !is_ordinal(bterms)) { # priors for ordinal thresholds are provided in 'prior_thres' prior <- prior + brmsprior(def_dprior, class = "Intercept", ls = px) fixef <- setdiff(fixef, "Intercept") } if (length(fixef)) { prior <- prior + brmsprior(class = "b", coef = c("", fixef), ls = px) } prior } # priors for thresholds of ordinal models prior_thres <- function(bterms, def_scale_prior = "", ...) { prior <- empty_prior() if (!is_ordinal(bterms)) { # thresholds only exist in ordinal models return(prior) } if (fix_intercepts(bterms) && !is.mixfamily(bterms$family)) { # fixed thresholds cannot have separate priors return(prior) } # create priors for threshold per group .prior_thres <- function(thres, thres_prior = "", group = "") { prior <- empty_prior() if (has_equidistant_thres(bterms)) { # prior for the delta parameter for equidistant thresholds thres <- character(0) bound <- str_if(has_ordered_thres(bterms), "") prior <- prior + brmsprior( class = "delta", group = group, bound = bound, ls = px ) } prior <- prior + brmsprior( prior = c(thres_prior, rep("", length(thres))), class = "Intercept", coef = c("", thres), group = group, ls = px ) } px <- check_prefix(bterms) groups <- get_thres_groups(bterms) if (any(nzchar(groups))) { # for models with multiple threshold vectors prior <- prior + .prior_thres(character(0), def_scale_prior) for (g in groups) { prior <- prior + .prior_thres(get_thres(bterms, group = g), group = g) } } else { # for models with a single threshold vector prior <- prior + .prior_thres(get_thres(bterms), def_scale_prior) } prior } # priors for coefficients of baseline hazards in the Cox model prior_bhaz <- function(bterms, ...) { prior <- empty_prior() if (!is_cox(bterms$family)) { return(prior) } px <- check_prefix(bterms) # the scale of sbhaz is not identified when an intercept is part of mu # thus a prior on sbhaz is necessary to define its scale prior <- prior + brmsprior("normal(0, 1)", class = "sbhaz", ls = px) prior } # priors for special effects parameters prior_sp <- function(bterms, data, ...) { prior <- empty_prior() spef <- tidy_spef(bterms, data) if (nrow(spef)) { px <- check_prefix(bterms) prior <- prior + brmsprior( class = "b", coef = c("", spef$coef), ls = px ) simo_coef <- get_simo_labels(spef) if (length(simo_coef)) { prior <- prior + brmsprior( class = "simo", coef = simo_coef, ls = px ) } } prior } # priors for category spcific effects parameters prior_cs <- function(bterms, data, ...) { prior <- empty_prior() csef <- colnames(get_model_matrix(bterms$cs, data = data)) if (length(csef)) { px <- check_prefix(bterms) prior <- prior + brmsprior(class = "b", coef = c("", csef), ls = px) } prior } # default priors for hyper-parameters of noise-free variables prior_Xme <- function(meef, internal = FALSE, ...) { stopifnot(is.meef_frame(meef)) prior <- empty_prior() if (nrow(meef)) { prior <- prior + brmsprior(class = "meanme", coef = c("", meef$coef)) + brmsprior(class = "sdme", coef = c("", meef$coef)) # priors for correlation parameters groups <- unique(meef$grname) for (i in seq_along(groups)) { g <- groups[i] K <- which(meef$grname %in% g) if (meef$cor[K[1]] && length(K) > 1L) { if (internal) { prior <- prior + brmsprior("lkj_corr_cholesky(1)", class = "Lme") if (nzchar(g)) { prior <- prior + brmsprior(class = "Lme", group = g) } } else { prior <- prior + brmsprior("lkj(1)", class = "corme") if (nzchar(g)) { prior <- prior + brmsprior(class = "corme", group = g) } } } } } prior } # default priors of gaussian processes # @param def_scale_prior: a character string defining # the default prior SD parameters prior_gp <- function(bterms, data, def_scale_prior, ...) { prior <- empty_prior() gpef <- tidy_gpef(bterms, data) if (nrow(gpef)) { px <- check_prefix(bterms) lscale_prior <- def_lscale_prior(bterms, data) prior <- prior + brmsprior(class = "sdgp", prior = def_scale_prior, ls = px) + brmsprior(class = "sdgp", coef = unlist(gpef$sfx1), ls = px) + brmsprior(class = "lscale", ls = px) + brmsprior(class = "lscale", prior = lscale_prior, coef = names(lscale_prior), ls = px) } prior } # default priors for length-scale parameters of GPs # see https://betanalpha.github.io/assets/case_studies/gp_part3/part3.html # @param plb prior probability of being lower than minimum length-scale # @param pub prior probability of being higher than maximum length-scale def_lscale_prior <- function(bterms, data, plb = 0.01, pub = 0.01) { .opt_fun <- function(x, lb, ub) { # optimize parameters on the log-scale to make them positive only x <- exp(x) y1 <- pinvgamma(lb, x[1], x[2], log.p = TRUE) y2 <- pinvgamma(ub, x[1], x[2], lower.tail = FALSE, log.p = TRUE) c(y1 - log(plb), y2 - log(pub)) } .def_lscale_prior <- function(X) { dq <- diff_quad(X) lb <- sqrt(min(dq[dq > 0])) ub <- sqrt(max(dq)) opt_res <- nleqslv::nleqslv( c(0, 0), .opt_fun, lb = lb, ub = ub, control = list(allowSingular = TRUE) ) prior <- "normal(0, 0.5)" if (opt_res$termcd %in% 1:2) { # use the inverse-gamma prior only in case of convergence pars <- exp(opt_res$x) prior <- paste0("inv_gamma(", sargs(round(pars, 6)), ")") } return(prior) } p <- usc(combine_prefix(bterms)) gpef <- tidy_gpef(bterms, data) gp_dat <- data_gp(bterms, data, raw = TRUE) out <- vector("list", NROW(gpef)) for (i in seq_along(out)) { pi <- paste0(p, "_", i) iso <- gpef$iso[i] cons <- gpef$cons[[i]] if (length(cons) > 0L) { for (j in seq_along(cons)) { Xgp <- gp_dat[[paste0("Xgp", pi, "_", j)]] if (iso) { c(out[[i]]) <- .def_lscale_prior(Xgp) } else { c(out[[i]]) <- apply(Xgp, 2, .def_lscale_prior) } } } else { Xgp <- gp_dat[[paste0("Xgp", pi)]] if (iso) { out[[i]] <- .def_lscale_prior(Xgp) } else { out[[i]] <- apply(Xgp, 2, .def_lscale_prior) } } # transpose so that by-levels vary last names(out[[i]]) <- as.vector(t(gpef$sfx2[[i]])) } unlist(out) } # priors for varying effects parameters # @param ranef: a list returned by tidy_ranef # @param def_scale_prior a character string defining # the default prior for SD parameters # @param internal: see 'get_prior' prior_re <- function(ranef, def_scale_prior, internal = FALSE, ...) { prior <- empty_prior() if (!nrow(ranef)) { return(prior) } # global sd class px <- check_prefix(ranef) upx <- unique(px) if (length(def_scale_prior) > 1L) { def_scale_prior <- def_scale_prior[px$resp] } global_sd_prior <- brmsprior( class = "sd", prior = def_scale_prior, ls = px ) prior <- prior + global_sd_prior for (id in unique(ranef$id)) { r <- subset2(ranef, id = id) group <- r$group[1] rpx <- check_prefix(r) urpx <- unique(rpx) # include group-level standard deviations prior <- prior + brmsprior(class = "sd", group = group, ls = urpx) + brmsprior(class = "sd", coef = r$coef, group = group, ls = rpx) # detect duplicated group-level effects J <- with(prior, class == "sd" & nzchar(coef)) dupli <- duplicated(prior[J, ]) if (any(dupli)) { stop2("Duplicated group-level effects detected for group ", group) } # include correlation parameters if (isTRUE(r$cor[1]) && nrow(r) > 1L) { if (internal) { prior <- prior + brmsprior( class = "L", group = c("", group), prior = c("lkj_corr_cholesky(1)", "") ) } else { prior <- prior + brmsprior( class = "cor", group = c("", group), prior = c("lkj(1)", "") ) } } } tranef <- get_dist_groups(ranef, "student") if (isTRUE(nrow(tranef) > 0L)) { prior <- prior + brmsprior("gamma(2, 0.1)", class = "df", group = tranef$group) } prior } # priors for smooth terms prior_sm <- function(bterms, data, def_scale_prior, ...) { prior <- empty_prior() smef <- tidy_smef(bterms, data) if (NROW(smef)) { px <- check_prefix(bterms) # prior for the FE coefficients Xs_names <- attr(smef, "Xs_names") if (length(Xs_names)) { prior <- prior + brmsprior( class = "b", coef = c("", Xs_names), ls = px ) } # prior for SD parameters of the RE coefficients smterms <- unique(smef$term) prior_strings <- c(def_scale_prior, rep("", length(smterms))) prior <- prior + brmsprior( class = "sds", coef = c("", smterms), prior = prior_strings, ls = px ) } prior } # priors for autocor parameters prior_ac <- function(bterms, def_scale_prior, ...) { prior <- empty_prior() acef <- tidy_acef(bterms) if (!NROW(acef)) { return(prior) } px <- check_prefix(bterms) if (has_ac_class(acef, "arma")) { acef_arma <- subset2(acef, class = "arma") if (acef_arma$p > 0) { prior <- prior + brmsprior(class = "ar", ls = px) } if (acef_arma$q > 0) { prior <- prior + brmsprior(class = "ma", ls = px) } } if (has_ac_class(acef, "cosy")) { prior <- prior + brmsprior(class = "cosy", ls = px) } if (has_cor_latent_residuals(bterms)) { prior <- prior + brmsprior(def_scale_prior, class = "sderr", ls = px) } if (has_ac_class(acef, "sar")) { acef_sar <- subset2(acef, class = "sar") if (acef_sar$type == "lag") { prior <- prior + brmsprior(class = "lagsar", ls = px) } if (acef_sar$type == "error") { prior <- prior + brmsprior(class = "errorsar", ls = px) } } if (has_ac_class(acef, "car")) { acef_car <- subset2(acef, class = "car") prior <- prior + brmsprior(def_scale_prior, class = "sdcar", ls = px) if (acef_car$type %in% "escar") { prior <- prior + brmsprior(class = "car", ls = px) } else if (acef_car$type %in% "bym2") { prior <- prior + brmsprior("beta(1, 1)", class = "rhocar", ls = px) } } prior } # default priors for distributional parameters def_dprior <- function(x, dpar, data = NULL) { stopifnot(is.brmsterms(x)) dpar <- as_one_character(dpar) resp <- usc(x$resp) dpar_class <- dpar_class(dpar, family = x) link <- x$dpars[[dpar]]$family$link if (is.null(link)) { link <- "identity" } # ensures reasonable scaling in def_scale_prior x$family$link <- link if (link == "identity") { # dpar is estimated or predicted on the linear scale out <- switch(dpar_class, "", mu = def_scale_prior(x, data, center = FALSE), sigma = def_scale_prior(x, data), shape = "gamma(0.01, 0.01)", nu = "gamma(2, 0.1)", phi = "gamma(0.01, 0.01)", kappa = "gamma(2, 0.01)", beta = "gamma(1, 0.1)", zi = "beta(1, 1)", hu = "beta(1, 1)", zoi = "beta(1, 1)", coi = "beta(1, 1)", bs = "gamma(1, 1)", ndt = glue("uniform(0, min_Y{resp})"), bias = "beta(1, 1)", quantile = "beta(1, 1)", xi = "normal(0, 2.5)", alpha = "normal(0, 4)", disc = "lognormal(0, 1)", theta = "logistic(0, 1)" ) } else { # except for 'mu' all parameters only support one link other than identity out <- switch(dpar_class, "", mu = def_scale_prior(x, data, center = FALSE), sigma = def_scale_prior(x, data), shape = "student_t(3, 0, 10)", nu = "normal(2.7, 0.8)", phi = "student_t(3, 0, 10)", kappa = "normal(5.0, 0.8)", beta = "normal(1.7, 1.3)", zi = "logistic(0, 1)", hu = "logistic(0, 1)", zoi = "logistic(0, 1)", coi = "logistic(0, 1)", bs = "normal(-0.6, 1.3)", bias = "logistic(0, 1)", quantile = "logistic(0, 1)", xi = "normal(0, 4)", alpha = "normal(0, 4)", disc = "normal(0, 1)" ) } out } # default priors for scale/SD parameters def_scale_prior <- function(x, data, ...) { UseMethod("def_scale_prior") } #' @export def_scale_prior.mvbrmsterms <- function(x, data, ...) { out <- ulapply(x$terms, def_scale_prior, data = data, ...) names(out) <- x$responses out } # @param center Should the prior be centererd around zero? # If FALSE, the prior location is computed based on Y. #' @export def_scale_prior.brmsterms <- function(x, data, center = TRUE, ...) { Y <- unname(model.response(model.frame(x$respform, data))) prior_location <- 0 prior_scale <- 10 link <- x$family$link if (has_logscale(x$family)) { link <- "log" } tlinks <- c("identity", "log", "inverse", "sqrt", "1/mu^2") if (link %in% tlinks && !is_like_factor(Y)) { if (link %in% c("log", "inverse", "1/mu^2")) { # avoid Inf in link(Y) Y <- ifelse(Y == 0, Y + 0.1, Y) } sgst_scale <- SW(round(mad(link(Y, link = link)))) if (is.finite(sgst_scale)) { prior_scale <- max(prior_scale, sgst_scale) } if (!center) { sgst_location <- SW(round(median(link(Y, link = link)))) if (is.finite(sgst_location)) { prior_location <- sgst_location } } } paste0("student_t(", sargs("3", prior_location, prior_scale), ")") } # check priors supplied by the user # @inheritParams get_prior # @param warn: passed to 'check_prior_content' # @return a 'brmsprior' object check_prior <- function(prior, formula, data, sample_prior = c("no", "yes", "only"), warn = FALSE) { sample_prior <- check_sample_prior(sample_prior) if (isTRUE(attr(prior, "checked"))) { # prior has already been checked; no need to do it twice # attributes may still need to be updated attr(prior, "sample_prior") <- sample_prior return(prior) } bterms <- parse_bf(formula) all_priors <- get_prior(formula, data, internal = TRUE) if (is.null(prior)) { prior <- all_priors } else if (!is.brmsprior(prior)) { stop2("Argument 'prior' must be a 'brmsprior' object.") } # temporarily exclude priors that should not be checked no_checks <- !nzchar(prior$class) prior_no_checks <- prior[no_checks, ] prior <- prior[!no_checks, ] # check for duplicated priors prior$class <- rename( prior$class, c("^cor$", "^rescor$", "^corme$"), c("L", "Lrescor", "Lme"), fixed = FALSE ) if (any(duplicated(prior))) { stop2("Duplicated prior specifications are not allowed.") } # check if parameters in prior are valid if (nrow(prior)) { valid <- which(duplicated(rbind(all_priors, prior))) invalid <- which(!seq_rows(prior) %in% (valid - nrow(all_priors))) if (length(invalid)) { msg_priors <- .print_prior(prior[invalid, ]) stop2( "The following priors do not correspond ", "to any model parameter: \n", collapse(.print_prior(prior[invalid, ]), "\n"), "Function 'get_prior' might be helpful to you." ) } } prior$prior <- sub("^(lkj|lkj_corr)\\(", "lkj_corr_cholesky(", prior$prior) check_prior_content(prior, warn = warn) # merge user-specified priors with default priors prior$new <- rep(TRUE, nrow(prior)) all_priors$new <- rep(FALSE, nrow(all_priors)) prior <- c(all_priors, prior, replace = TRUE) prior <- check_prior_special(prior, bterms = bterms, data = data) prior <- prior[with(prior, order(class, group, resp, dpar, nlpar, coef)), ] # check and warn about valid but unused priors for (i in which(nzchar(prior$prior) & !nzchar(prior$coef))) { ls <- prior[i, c("class", "group", "resp", "dpar", "nlpar")] class(ls) <- "data.frame" prior_sub_coef <- subset2(prior, ls = ls) prior_sub_coef <- prior_sub_coef[nzchar(prior_sub_coef$coef), ] if (nrow(prior_sub_coef) && all(nzchar(prior_sub_coef$prior))) { warning2( "The global prior '", prior$prior[i], "' of class '", prior$class[i], "' will not be used in the model as all related coefficients have ", "individual priors already. If you did not set those ", "priors yourself, then maybe brms has assigned default priors. ", "See ?set_prior and ?get_prior for more details." ) } } prior <- prior + prior_no_checks rownames(prior) <- NULL attr(prior, "sample_prior") <- sample_prior attr(prior, "checked") <- TRUE prior } # try to check if prior distributions are reasonable # @param prior A brmsprior object # @param warn logical; print boundary warnings? check_prior_content <- function(prior, warn = TRUE) { if (!is.brmsprior(prior)) { return(invisible(TRUE)) } if (nrow(prior)) { lb_priors <- c( "lognormal", "chi_square", "inv_chi_square", "scaled_inv_chi_square", "exponential", "gamma", "inv_gamma", "weibull", "frechet", "rayleigh", "pareto", "pareto_type_2" ) lb_priors_reg <- paste0("^(", paste0(lb_priors, collapse = "|"), ")") ulb_priors <- c("beta", "uniform", "von_mises") ulb_priors_reg <- paste0("^(", paste0(ulb_priors, collapse = "|"), ")") nb_pars <- c("b", "alpha", "xi") lb_pars <- c( "sigma", "shape", "nu", "phi", "kappa", "beta", "bs", "disc", "sdcar", "sigmaLL", "sd", "sds", "sdgp", "lscale" ) cormat_pars <- c("cor", "rescor", "corme", "L", "Lrescor", "Lme") lb_warning <- ub_warning <- "" for (i in seq_rows(prior)) { msg_prior <- .print_prior(prior[i, , drop = FALSE]) has_lb_prior <- grepl(lb_priors_reg, prior$prior[i]) has_ulb_prior <- grepl(ulb_priors_reg, prior$prior[i]) # priors with nchar(coef) inherit their boundaries j <- which(with(prior, class == class[i] & group == group[i] & nlpar == nlpar[i] & !nzchar(coef) )) bound <- if (length(j)) prior$bound[j] else "" has_lb <- grepl("lower", bound) has_ub <- grepl("upper", bound) if (prior$class[i] %in% nb_pars) { if ((has_lb_prior || has_ulb_prior) && !has_lb) { lb_warning <- paste0(lb_warning, msg_prior, "\n") } if (has_ulb_prior && !has_ub) { ub_warning <- paste0(ub_warning, msg_prior, "\n") } } else if (prior$class[i] %in% lb_pars) { if (has_ulb_prior && !has_ub) { ub_warning <- paste0(ub_warning, msg_prior, "\n") } } else if (prior$class[i] %in% cormat_pars) { regex <- "^((lkj)|(constant))" if (nzchar(prior$prior[i]) && !grepl(regex, prior$prior[i])) { stop2( "The only supported prior for correlation matrices is ", "the 'lkj' prior. See help(set_prior) for more details." ) } } else if (prior$class[i] %in% c("simo", "theta")) { regex <- "^((dirichlet)|(constant))\\(" if (nchar(prior$prior[i]) && !grepl(regex, prior$prior[i])) { stop2( "Currently 'dirichlet' is the only valid prior for ", "simplex parameters. See help(set_prior) for more details." ) } } } if (nchar(lb_warning) && warn) { warning2( "It appears as if you have specified a lower bounded ", "prior on a parameter that has no natural lower bound.", "\nIf this is really what you want, please specify ", "argument 'lb' of 'set_prior' appropriately.", "\nWarning occurred for prior \n", lb_warning ) } if (nchar(ub_warning) && warn) { warning2( "It appears as if you have specified an upper bounded ", "prior on a parameter that has no natural upper bound.", "\nIf this is really what you want, please specify ", "argument 'ub' of 'set_prior' appropriately.", "\nWarning occurred for prior \n", ub_warning ) } } invisible(TRUE) } # prepare special priors for use in Stan # required for priors that are not natively supported by Stan check_prior_special <- function(x, ...) { UseMethod("check_prior_special") } #' @export check_prior_special.default <- function(x, prior = empty_prior(), ...) { prior } #' @export check_prior_special.brmsprior <- function(x, bterms, ...) { if (!nrow(x) || isTRUE(attr(x, "checked"))) { return(x) } if (is.null(x$new)) x$new <- TRUE x$remove <- FALSE x <- check_prior_special(bterms, prior = x, ...) x <- x[!x$remove, ] x$new <- x$remove <- NULL x } #' @export check_prior_special.mvbrmsterms <- function(x, prior = NULL, ...) { for (cl in c("b", "Intercept")) { # copy over the global population-level priors in MV models gi <- which(find_rows(prior, class = cl, coef = "", resp = "")) if (any(nzchar(prior$prior[gi]))) { # allowing global priors in multivariate models implies conceptual problems # in the specification of default priors as it becomes unclear on which # prior level they should be defined warning2("Specifying global priors for regression coefficients in ", "multivariate models is deprecated and may not work as expected.") } prior$remove[gi] <- TRUE for (r in x$responses) { rows <- which(find_rows(prior, class = cl, coef = "", resp = r)) for (ri in rows) { if (isTRUE(!prior$new[ri] || !nzchar(prior$prior[ri]))) { prior$prior[ri] <- prior$prior[gi] } } } } for (i in seq_along(x$terms)) { prior <- check_prior_special(x$terms[[i]], prior = prior, ...) } prior } #' @export check_prior_special.brmsterms <- function(x, data, prior = NULL, ...) { data <- subset_data(data, x) if (is.null(prior)) { prior <- empty_prior() } if (conv_cats_dpars(x$family)) { for (cl in c("b", "Intercept")) { gi <- which(find_rows( prior, class = cl, coef = "", dpar = "", nlpar = "", resp = x$resp )) if (any(nzchar(prior$prior[gi]))) { # allowing global priors in categorical models implies conceptual problems # in the specification of default priors as it becomes unclear on which # prior level they should be defined warning2("Specifying global priors for regression coefficients in ", "categorical models is deprecated and may not work as expected.") } prior$remove[gi] <- TRUE for (dp in names(x$dpars)) { rows <- which(find_rows( prior, class = cl, coef = "", dpar = dp, nlpar = "", resp = x$resp )) for (dpi in rows) { if (isTRUE(!prior$new[dpi] || !nzchar(prior$prior[dpi]))) { prior$prior[dpi] <- prior$prior[gi] } } } } } simple_sigma <- simple_sigma(x) for (dp in names(x$dpars)) { allow_autoscale <- dp == "mu" && simple_sigma prior <- check_prior_special( x$dpars[[dp]], prior = prior, data = data, allow_autoscale = allow_autoscale, ... ) } for (nlp in names(x$nlpars)) { prior <- check_prior_special( x$nlpars[[nlp]], prior = prior, data = data, allow_autoscale = simple_sigma, ... ) } # prepare priors for mixture probabilities if (is.mixfamily(x$family)) { take <- find_rows(prior, class = "theta", resp = x$resp) theta_prior <- prior$prior[take] if (isTRUE(nzchar(theta_prior))) { # hard code prior concentration theta_prior <- paste0(eval_dirichlet(theta_prior), collapse = ", ") prior$prior[take] <- paste0("dirichlet(c(", theta_prior, "))") } } prior } #' @export check_prior_special.btnl <- function(x, prior, ...) { prior } # prepare special priors that cannot be passed to Stan as is # @param allow_autoscale allow autoscaling by parameter sigma? # @return a possibly updated brmsprior object with additional attributes #' @export check_prior_special.btl <- function(x, prior, data, allow_autoscale = TRUE, ...) { px <- check_prefix(x) if (is_nlpar(x) && no_center(x$fe)) { nlp_prior <- subset2(prior, ls = px) if (!any(nzchar(nlp_prior$prior))) { stop2( "Priors on population-level coefficients are required in ", "non-linear models, but none were found for parameter ", "'", px$nlpar, "'. See help(set_prior) for more details." ) } } # prepare priors of monotonic effects spef <- tidy_spef(x, data) monef <- spef[lengths(spef$calls_mo) > 0, "coef"] for (mo in monef) { take <- find_rows(prior, class = "simo", coef = mo, ls = px) simo_prior <- prior$prior[take] if (isTRUE(nzchar(simo_prior))) { # hard code prior concentration # in order not to depend on external objects simo_prior <- paste0(eval_dirichlet(simo_prior), collapse = ", ") prior$prior[take] <- paste0("dirichlet(c(", simo_prior, "))") } } # prepare special priors such as horseshoe or lasso prior_special <- list() b_index <- which(find_rows(prior, class = "b", coef = "", ls = px)) stopifnot(length(b_index) <= 1L) if (length(b_index)) { b_prior <- prior$prior[b_index] if (any(is_special_prior(b_prior))) { # horseshoe prior for population-level parameters if (any(nzchar(prior[b_index, "bound"]))) { stop2("Setting boundaries on coefficients is not ", "allowed when using the special priors.") } if (is.formula(x[["cs"]])) { stop2("Special priors are not yet allowed ", "in models with category-specific effects.") } b_coef_indices <- which( find_rows(prior, class = "b", ls = px) & !find_rows(prior, coef = c("", "Intercept")) ) if (any(nchar(prior$prior[b_coef_indices]))) { stop2( "Defining separate priors for single coefficients is not ", "allowed when using special priors for the whole ", "set of coefficients (except for the Intercept)." ) } if (is_special_prior(b_prior, "horseshoe")) { hs <- eval2(b_prior) prior$prior[b_index] <- "" hs_obj_names <- c( "df", "df_global", "df_slab", "scale_global", "scale_slab", "par_ratio", "autoscale" ) hs_att <- attributes(hs)[hs_obj_names] names(hs_att) <- paste0("hs_", hs_obj_names) prior_special <- c(prior_special, hs_att) prior_special$hs_autoscale <- isTRUE(prior_special$hs_autoscale) && allow_autoscale } else if (is_special_prior(b_prior, "lasso")) { lasso <- eval2(b_prior) # the parameterization via double_exponential appears to be more # efficient than an indirect parameterization via normal and # exponential distributions; tested on 2017-06-09 p <- usc(combine_prefix(px)) lasso_scale <- paste0( "lasso_scale", p, " * lasso_inv_lambda", p ) lasso_prior <- paste0( "double_exponential(0, ", lasso_scale, ")" ) prior$prior[b_index] <- lasso_prior lasso_att <- attributes(lasso) prior_special$lasso_df <- lasso_att[["df"]] prior_special$lasso_scale <- lasso_att[["scale"]] } } } prefix <- combine_prefix(px, keep_mu = TRUE) attributes(prior)$special[[prefix]] <- prior_special prior } # validate argument 'sample_prior' check_sample_prior <- function(sample_prior) { options <- c("no", "yes", "only") if (is.null(sample_prior)) { sample_prior <- "no" } if (!is.character(sample_prior)) { sample_prior <- as_one_logical(sample_prior) sample_prior <- if (sample_prior) "yes" else "no" } match.arg(sample_prior, options) } # extract prior boundaries of a parameter # @param prior a brmsprior object # @param class,coef,group,px passed to 'subset2' get_bound <- function(prior, class = "b", coef = "", group = "", px = list()) { stopifnot(is.brmsprior(prior)) class <- as_one_character(class) if (!length(coef)) coef <- "" if (!length(group)) group <- "" bound <- subset2(prior, ls = c(nlist(class, coef, group), px))$bound if (!length(bound)) bound <- "" if (length(bound) != 1L) { stop("Extracting parameter boundaries failed. Please report a bug.") } bound } # create data.frames containing prior information brmsprior <- function(prior = "", class = "", coef = "", group = "", resp = "", dpar = "", nlpar = "", bound = "", ls = list()) { if (length(ls)) { if (is.null(names(ls))) { stop("Argument 'ls' must be named.") } names <- c( "prior", "class", "coef", "group", "resp", "dpar", "nlpar", "bound" ) if (!all(names(ls) %in% names)) { stop("Names of 'ls' must some of ", collapse_comma(names)) } for (v in names(ls)) { assign(v, ls[[v]]) } } out <- data.frame( prior, class, coef, group, resp, dpar, nlpar, bound, stringsAsFactors = FALSE ) class(out) <- c("brmsprior", "data.frame") out } #' @describeIn set_prior Create an empty \code{brmsprior} object. #' @export empty_prior <- function() { char0 <- character(0) brmsprior( prior = char0, class = char0, coef = char0, group = char0, resp = char0, dpar = char0, nlpar = char0, bound = char0 ) } # natural upper and lower bounds for priors # @param a named list with elements 'lb and 'ub' prior_bounds <- function(prior) { switch(prior, lognormal = list(lb = 0, ub = Inf), chi_square = list(lb = 0, ub = Inf), inv_chi_square = list(lb = 0, ub = Inf), scaled_inv_chi_square = list(lb = 0, ub = Inf), exponential = list(lb = 0, ub = Inf), gamma = list(lb = 0, ub = Inf), inv_gamma = list(lb = 0, ub = Inf), weibull = list(lb = 0, ub = Inf), frechet = list(lb = 0, ub = Inf), rayleigh = list(lb = 0, ub = Inf), pareto = list(lb = 0, ub = Inf), pareto_type_2 = list(lb = 0, ub = Inf), beta = list(lb = 0, ub = 1), von_mises = list(lb = -pi, ub = pi), list(lb = -Inf, ub = Inf) ) } # relevant columns for duplication checks in brmsprior objects rcols_prior <- function() { c("class", "coef", "group", "resp", "dpar", "nlpar") } # upper and lower bounds for parameter classes # @param par name of a distributional parameter # @param bound optional Stan code of boundaries to extract values from # @param resp optional name of the response variable # @return A named list with elements 'lb and 'ub' par_bounds <- function(par, bound = "", resp = "") { resp <- usc(resp) out <- switch(par, sigma = list(lb = 0, ub = Inf), shape = list(lb = 0, ub = Inf), nu = list(lb = 1, ub = Inf), phi = list(lb = 0, ub = Inf), kappa = list(lb = 0, ub = Inf), beta = list(lb = 0, ub = Inf), zi = list(lb = 0, ub = 1), hu = list(lb = 0, ub = 1), zoi = list(lb = 0, ub = 1), coi = list(lb = 0, ub = 1), bs = list(lb = 0, ub = Inf), ndt = list(lb = 0, ub = glue("min_Y{resp}")), bias = list(lb = 0, ub = 1), disc = list(lb = 0, ub = Inf), quantile = list(lb = 0, ub = 1), ar = list(lb = -1, ub = 1), ma = list(lb = -1, ub = 1), lagsar = list(lb = 0, ub = 1), errorsar = list(lb = 0, ub = 1), car = list(lb = 0, ub = 1), sdcar = list(lb = 0, ub = Inf), rhocar = list(lb = 0, ub = 1), sigmaLL = list(lb = 0, ub = Inf), sd = list(lb = 0, ub = Inf), sds = list(lb = 0, ub = Inf), sdgp = list(lb = 0, ub = Inf), lscale = list(lb = 0, ub = Inf), list(lb = -Inf, ub = Inf) ) if (isTRUE(nzchar(bound))) { opt_lb <- get_matches("(<|,)lower=[^,>]+", bound) if (isTRUE(nzchar(opt_lb))) { out$lb <- substr(opt_lb, 8, nchar(opt_lb)) } opt_ub <- get_matches("(<|,)upper=[^,>]+", bound) if (isTRUE(nzchar(opt_ub))) { out$ub <- substr(opt_ub, 8, nchar(opt_ub)) } } out } #' Checks if argument is a \code{brmsprior} object #' #' @param x An \R object #' #' @export is.brmsprior <- function(x) { inherits(x, "brmsprior") } #' Print method for \code{brmsprior} objects #' #' @param x An object of class \code{brmsprior}. #' @param show_df Logical; Print priors as a single #' \code{data.frame} (\code{TRUE}) or as a sequence of #' sampling statements (\code{FALSE})? #' @param ... Currently ignored. #' #' @export print.brmsprior <- function(x, show_df, ...) { if (missing(show_df)) { show_df <- nrow(x) > 1L } if (show_df) { NextMethod() } else { cat(collapse(.print_prior(x), "\n")) } invisible(x) } # prepare text for print.brmsprior .print_prior <- function(x) { group <- usc(x$group) resp <- usc(x$resp) dpar <- usc(x$dpar) nlpar <- usc(x$nlpar) coef <- usc(x$coef) if (any(nzchar(c(resp, dpar, nlpar, coef)))) { group <- usc(group, "suffix") } bound <- ifelse(nzchar(x$bound), paste0(x$bound, " "), "") tilde <- ifelse(nzchar(x$class) | nzchar(group) | nzchar(coef), " ~ ", "") prior <- ifelse(nzchar(x$prior), x$prior, "(no prior)") paste0(bound, x$class, group, resp, dpar, nlpar, coef, tilde, prior) } # combine multiple brmsprior objects into one brmsprior #' @export c.brmsprior <- function(x, ..., replace = FALSE) { dots <- list(...) if (all(sapply(dots, is.brmsprior))) { replace <- as_one_logical(replace) # don't use 'c()' here to avoid creating a recursion out <- do_call(rbind, list(x, ...)) if (replace) { # update duplicated priors out <- unique(out, fromLast = TRUE) } } else { if (length(dots)) { stop2("Cannot add '", class(dots[[1]])[1], "' objects to the prior.") } out <- c(as.data.frame(x)) } out } #' @export "+.brmsprior" <- function(e1, e2) { if (is.null(e2)) { return(e1) } if (!is.brmsprior(e2)) { stop2("Cannot add '", class(e2)[1], "' objects to the prior.") } c(e1, e2) } #' @export duplicated.brmsprior <- function(x, incomparables = FALSE, ...) { # compare only specific columns of the brmsprior object duplicated.data.frame(x[, rcols_prior()], incomparables, ...) } # evaluate the dirichlet prior of simplex parameters # avoid name clashing with the dirichlet family eval_dirichlet <- function(prior) { dirichlet <- function(...) { out <- as.numeric(c(...)) if (anyNA(out) || any(out <= 0)) { stop2("The dirichlet prior expects positive values.") } out } eval2(prior) } #' Regularized horseshoe priors in \pkg{brms} #' #' Function used to set up regularized horseshoe priors and related #' hierarchical shrinkage priors for population-level effects in \pkg{brms}. The #' function does not evaluate its arguments -- it exists purely to help set up #' the model. #' #' @param df Degrees of freedom of student-t prior of the #' local shrinkage parameters. Defaults to \code{1}. #' @param scale_global Scale of the student-t prior of the global shrinkage #' parameter. Defaults to \code{1}. #' In linear models, \code{scale_global} will internally be #' multiplied by the residual standard deviation parameter \code{sigma}. #' @param df_global Degrees of freedom of student-t prior of the #' global shrinkage parameter. Defaults to \code{1}. If \code{df_global} #' is greater \code{1}, the shape of the prior will no longer resemble #' a horseshoe and it may be more appropriately called an hierarchical #' shrinkage prior in this case. #' @param scale_slab Scale of the student-t prior of the regularization #' parameter. Defaults to \code{2}. The original unregularized horseshoe #' prior is obtained by setting \code{scale_slab} to infinite, which #' we can approximate in practice by setting it to a very large real value. #' @param df_slab Degrees of freedom of the student-t prior of #' the regularization parameter. Defaults to \code{4}. #' @param par_ratio Ratio of the expected number of non-zero coefficients #' to the expected number of zero coefficients. If specified, #' \code{scale_global} is ignored and internally computed as #' \code{par_ratio / sqrt(N)}, where \code{N} is the total number #' of observations in the data. #' @param autoscale Logical; indicating whether the horseshoe #' prior should be scaled using the residual standard deviation #' \code{sigma} if possible and sensible (defaults to \code{TRUE}). #' Autoscaling is not applied for distributional parameters or #' when the model does not contain the parameter \code{sigma}. #' #' @return A character string obtained by \code{match.call()} with #' additional arguments. #' #' @details #' The horseshoe prior is a special shrinkage prior initially proposed by #' Carvalho et al. (2009). #' It is symmetric around zero with fat tails and an infinitely large spike #' at zero. This makes it ideal for sparse models that have #' many regression coefficients, although only a minority of them is non-zero. #' The horseshoe prior can be applied on all population-level effects at once #' (excluding the intercept) by using \code{set_prior("horseshoe(1)")}. #' The \code{1} implies that the student-t prior of the local shrinkage #' parameters has 1 degrees of freedom. This may, however, lead to an #' increased number of divergent transition in \pkg{Stan}. #' Accordingly, increasing the degrees of freedom to slightly higher values #' (e.g., \code{3}) may often be a better option, although the prior #' no longer resembles a horseshoe in this case. #' Further, the scale of the global shrinkage parameter plays an important role #' in amount of shrinkage applied. It defaults to \code{1}, #' but this may result in too few shrinkage (Piironen & Vehtari, 2016). #' It is thus possible to change the scale using argument \code{scale_global} #' of the horseshoe prior, for instance \code{horseshoe(1, scale_global = 0.5)}. #' In linear models, \code{scale_global} will internally be multiplied by the #' residual standard deviation parameter \code{sigma}. See Piironen and #' Vehtari (2016) for recommendations how to properly set the global scale. #' The degrees of freedom of the global shrinkage prior may also be #' adjusted via argument \code{df_global}. #' Piironen and Vehtari (2017) recommend to specifying the ratio of the #' expected number of non-zero coefficients to the expected number of zero #' coefficients \code{par_ratio} rather than \code{scale_global} directly. #' As proposed by Piironen and Vehtari (2017), an additional regularization #' is applied that only affects non-zero coefficients. The amount of #' regularization can be controlled via \code{scale_slab} and \code{df_slab}. #' To make sure that shrinkage can equally affect all coefficients, #' predictors should be one the same scale. #' Generally, models with horseshoe priors a more likely than other models #' to have divergent transitions so that increasing \code{adapt_delta} #' from \code{0.8} to values closer to \code{1} will often be necessary. #' See the documentation of \code{\link{brm}} for instructions #' on how to increase \code{adapt_delta}. #' #' @references #' Carvalho, C. M., Polson, N. G., & Scott, J. G. (2009). #' Handling sparsity via the horseshoe. #' In International Conference on Artificial Intelligence and Statistics (pp. 73-80). #' #' Piironen J. & Vehtari A. (2016). On the Hyperprior Choice for the Global #' Shrinkage Parameter in the Horseshoe Prior. #' \url{https://arxiv.org/pdf/1610.05559v1.pdf} #' #' Piironen, J., and Vehtari, A. (2017). Sparsity information and regularization #' in the horseshoe and other shrinkage priors. #' \url{https://arxiv.org/abs/1707.01694} #' #' @seealso \code{\link{set_prior}} #' #' @examples #' set_prior(horseshoe(df = 3, par_ratio = 0.1)) #' #' @export horseshoe <- function(df = 1, scale_global = 1, df_global = 1, scale_slab = 2, df_slab = 4, par_ratio = NULL, autoscale = TRUE) { out <- deparse(match.call(), width.cutoff = 500L) df <- as.numeric(df) df_global <- as.numeric(df_global) df_slab <- as.numeric(df_slab) scale_global <- as.numeric(scale_global) scale_slab <- as.numeric(scale_slab) if (!isTRUE(df > 0)) { stop2("Invalid horseshoe prior: Degrees of freedom of ", "the local priors must be a single positive number.") } if (!isTRUE(df_global > 0)) { stop2("Invalid horseshoe prior: Degrees of freedom of ", "the global prior must be a single positive number.") } if (!isTRUE(scale_global > 0)) { stop2("Invalid horseshoe prior: Scale of the global ", "prior must be a single positive number.") } if (!isTRUE(df_slab > 0)) { stop2("Invalid horseshoe prior: Degrees of freedom of ", "the slab part must be a single positive number.") } if (!isTRUE(scale_slab > 0)) { stop2("Invalid horseshoe prior: Scale of the slab ", "part must be a single positive number.") } if (!is.null(par_ratio)) { par_ratio <- as.numeric(par_ratio) if (!isTRUE(par_ratio > 0)) { stop2("Argument 'par_ratio' must be greater 0.") } } autoscale <- as_one_logical(autoscale) att <- nlist( df, df_global, df_slab, scale_global, scale_slab, par_ratio, autoscale ) attributes(out)[names(att)] <- att out } #' Set up a lasso prior in \pkg{brms} #' #' Function used to set up a lasso prior for population-level effects #' in \pkg{brms}. The function does not evaluate its arguments -- #' it exists purely to help set up the model. #' #' @param df Degrees of freedom of the chi-square prior of the inverse tuning #' parameter. Defaults to \code{1}. #' @param scale Scale of the lasso prior. Defaults to \code{1}. #' #' @return A character string obtained by \code{match.call()} with #' additional arguments. #' #' @details #' The lasso prior is the Bayesian equivalent to the LASSO method for performing #' variable selection (Park & Casella, 2008). #' With this prior, independent Laplace (i.e. double exponential) priors #' are placed on the population-level effects. #' The scale of the Laplace priors depends on a tuning parameter #' that controls the amount of shrinkage. In \pkg{brms}, the inverse #' of the tuning parameter is used so that smaller values imply #' more shrinkage. The inverse tuning parameter has a chi-square distribution #' and with degrees of freedom controlled via argument \code{df} #' of function \code{lasso} (defaults to \code{1}). For instance, #' one can specify a lasso prior using \code{set_prior("lasso(1)")}. #' To make sure that shrinkage can equally affect all coefficients, #' predictors should be one the same scale. #' If you do not want to standardized all variables, #' you can adjust the general scale of the lasso prior via argument #' \code{scale}, for instance, \code{lasso(1, scale = 10)}. #' #' @references #' Park, T., & Casella, G. (2008). The Bayesian Lasso. Journal of the American #' Statistical Association, 103(482), 681-686. #' #' @seealso \code{\link{set_prior}} #' #' @examples #' set_prior(lasso(df = 1, scale = 10)) #' #' @export lasso <- function(df = 1, scale = 1) { out <- deparse(match.call(), width.cutoff = 500L) df <- as.numeric(df) scale <- as.numeric(scale) if (!isTRUE(df > 0)) { stop2("Invalid lasso prior: Degrees of freedom of the shrinkage ", "parameter prior must be a single positive number.") } if (!isTRUE(scale > 0)) { stop2("Invalid lasso prior: Scale of the Laplace ", "priors must be a single positive number.") } att <- nlist(df, scale) attributes(out)[names(att)] <- att out } # check for the usage of special priors # @param prior a character vector of priors # @param target optional special priors to search for # if NULL search for all special priors # @return a logical vector equal to the length of 'prior' is_special_prior <- function(prior, target = NULL) { stopifnot(is.character(prior)) if (is.null(target)) { target <- c("horseshoe", "lasso") } regex <- paste0("^", regex_or(target), "\\(") grepl(regex, prior) } brms/R/kfold.R0000644000176200001440000003320013611527526012646 0ustar liggesusers#' K-Fold Cross-Validation #' #' Perform exact K-fold cross-validation by refitting the model \eqn{K} #' times each leaving out one-\eqn{K}th of the original data. #' Folds can be run in parallel using the \pkg{future} package. #' #' @aliases kfold #' #' @inheritParams loo.brmsfit #' @param K The number of subsets of equal (if possible) size #' into which the data will be partitioned for performing #' \eqn{K}-fold cross-validation. The model is refit \code{K} times, each time #' leaving out one of the \code{K} subsets. If \code{K} is equal to the total #' number of observations in the data then \eqn{K}-fold cross-validation is #' equivalent to exact leave-one-out cross-validation. #' @param Ksub Optional number of subsets (of those subsets defined by \code{K}) #' to be evaluated. If \code{NULL} (the default), \eqn{K}-fold cross-validation #' will be performed on all subsets. If \code{Ksub} is a single integer, #' \code{Ksub} subsets (out of all \code{K}) subsets will be randomly chosen. #' If \code{Ksub} consists of multiple integers or a one-dimensional array #' (created via \code{as.array}) potentially of length one, the corresponding #' subsets will be used. This argument is primarily useful, if evaluation of #' all subsets is infeasible for some reason. #' @param folds Determines how the subsets are being constructed. #' Possible values are \code{NULL} (the default), \code{"stratified"}, #' \code{"grouped"}, or \code{"loo"}. May also be a vector of length #' equal to the number of observations in the data. Alters the way #' \code{group} is handled. More information is provided in the 'Details' #' section. #' @param group Optional name of a grouping variable or factor in the model. #' What exactly is done with this variable depends on argument \code{folds}. #' More information is provided in the 'Details' section. #' @param exact_loo Deprecated! Please use \code{folds = "loo"} instead. #' @param save_fits If \code{TRUE}, a component \code{fits} is added to #' the returned object to store the cross-validated \code{brmsfit} #' objects and the indices of the omitted observations for each fold. #' Defaults to \code{FALSE}. #' #' @return \code{kfold} returns an object that has a similar structure as the #' objects returned by the \code{loo} and \code{waic} methods and #' can be used with the same post-processing functions. #' #' @details The \code{kfold} function performs exact \eqn{K}-fold #' cross-validation. First the data are partitioned into \eqn{K} folds #' (i.e. subsets) of equal (or as close to equal as possible) size by default. #' Then the model is refit \eqn{K} times, each time leaving out one of the #' \code{K} subsets. If \eqn{K} is equal to the total number of observations #' in the data then \eqn{K}-fold cross-validation is equivalent to exact #' leave-one-out cross-validation (to which \code{loo} is an efficient #' approximation). The \code{compare_ic} function is also compatible with #' the objects returned by \code{kfold}. #' #' The subsets can be constructed in multiple different ways: #' \itemize{ #' \item If both \code{folds} and \code{group} are \code{NULL}, the subsets #' are randomly chosen so that they have equal (or as close to equal as #' possible) size. #' \item If \code{folds} is \code{NULL} but \code{group} is specified, the #' data is split up into subsets, each time omitting all observations of one #' of the factor levels, while ignoring argument \code{K}. #' \item If \code{folds = "stratified"} the subsets are stratified after #' \code{group} using \code{\link[loo:kfold-helpers]{loo::kfold_split_stratified}}. #' \item If \code{folds = "grouped"} the subsets are split by #' \code{group} using \code{\link[loo:kfold-helpers]{loo::kfold_split_grouped}}. #' \item If \code{folds = "loo"} exact leave-one-out cross-validation #' will be performed and \code{K} will be ignored. Further, if \code{group} #' is specified, all observations corresponding to the factor level of the #' currently predicted single value are omitted. Thus, in this case, the #' predicted values are only a subset of the omitted ones. #' \item If \code{folds} is a numeric vector, it must contain one element per #' observation in the data. Each element of the vector is an integer in #' \code{1:K} indicating to which of the \code{K} folds the corresponding #' observation belongs. There are some convenience functions available in #' the \pkg{loo} package that create integer vectors to use for this purpose #' (see the Examples section below and also the #' \link[loo:kfold-helpers]{kfold-helpers} page). #' } #' #' @examples #' \dontrun{ #' fit1 <- brm(count ~ zAge + zBase * Trt + (1|patient) + (1|obs), #' data = epilepsy, family = poisson()) #' # throws warning about some pareto k estimates being too high #' (loo1 <- loo(fit1)) #' # perform 10-fold cross validation #' (kfold1 <- kfold(fit1, chains = 1)) #' #' # use the future package for parallelization #' library(future) #' plan(multiprocess) #' kfold(fit1, chains = 1) #' } #' #' @seealso \code{\link{loo}}, \code{\link{reloo}} #' #' @importFrom loo kfold #' @export kfold #' @export kfold.brmsfit <- function(x, ..., K = 10, Ksub = NULL, folds = NULL, group = NULL, exact_loo = NULL, compare = TRUE, resp = NULL, model_names = NULL, save_fits = FALSE) { args <- split_dots(x, ..., model_names = model_names) use_stored <- ulapply(args$models, function(x) is_equal(x$kfold$K, K)) if (!is.null(exact_loo) && as_one_logical(exact_loo)) { warning2("'exact_loo' is deprecated. Please use folds = 'loo' instead.") folds <- "loo" } c(args) <- nlist( criterion = "kfold", K, Ksub, folds, group, compare, resp, save_fits, use_stored ) do_call(compute_loos, args) } # helper function to perform k-fold cross-validation # @inheritParams kfold.brmsfit .kfold <- function(x, K = 10, Ksub = NULL, folds = NULL, group = NULL, newdata = NULL, resp = NULL, save_fits = FALSE, ...) { stopifnot(is.brmsfit(x)) if (is.brmsfit_multiple(x)) { warn_brmsfit_multiple(x) class(x) <- "brmsfit" } if (is.null(newdata)) { mf <- model.frame(x) } else { mf <- as.data.frame(newdata) } mf <- rm_attr(mf, c("terms", "brmsframe")) N <- nrow(mf) # validate argument 'group' if (!is.null(group)) { valid_groups <- get_cat_vars(x) if (length(group) != 1L || !group %in% valid_groups) { stop2("Group '", group, "' is not a valid grouping factor. ", "Valid groups are: \n", collapse_comma(valid_groups)) } gvar <- factor(get(group, mf)) } # validate argument 'folds' if (is.null(folds)) { if (is.null(group)) { fold_type <- "random" folds <- loo::kfold_split_random(K, N) } else { fold_type <- "group" folds <- as.numeric(gvar) K <- length(levels(gvar)) message("Setting 'K' to the number of levels of '", group, "' (", K, ")") } } else if (is.character(folds) && length(folds) == 1L) { opts <- c("loo", "stratified", "grouped") fold_type <- match.arg(folds, opts) req_group_opts <- c("stratified", "grouped") if (fold_type %in% req_group_opts && is.null(group)) { stop2("Argument 'group' is required for fold type '", fold_type, "'.") } if (fold_type == "loo") { folds <- seq_len(N) K <- N message("Setting 'K' to the number of observations (", K, ")") } else if (fold_type == "stratified") { folds <- loo::kfold_split_stratified(K, gvar) } else if (fold_type == "grouped") { folds <- loo::kfold_split_grouped(K, gvar) } } else { fold_type <- "custom" folds <- as.numeric(factor(folds)) if (length(folds) != N) { stop2("If 'folds' is a vector, it must be of length N.") } K <- max(folds) message("Setting 'K' to the number of folds (", K, ")") } # validate argument 'Ksub' if (is.null(Ksub)) { Ksub <- seq_len(K) } else { # see issue #441 for reasons to check for arrays is_array_Ksub <- is.array(Ksub) Ksub <- as.integer(Ksub) if (any(Ksub <= 0 | Ksub > K)) { stop2("'Ksub' must contain positive integers not larger than 'K'.") } if (length(Ksub) == 1L && !is_array_Ksub) { Ksub <- sample(seq_len(K), Ksub) } else { Ksub <- unique(Ksub) } Ksub <- sort(Ksub) } # split dots for use in log_lik and update dots <- list(...) ll_arg_names <- arg_names("log_lik") ll_args <- dots[intersect(names(dots), ll_arg_names)] ll_args$allow_new_levels <- TRUE ll_args$resp <- resp ll_args$combine <- TRUE up_args <- dots[setdiff(names(dots), ll_arg_names)] up_args$refresh <- 0 # function to be run inside future::future .kfold_k <- function(k) { if (fold_type == "loo" && !is.null(group)) { omitted <- which(folds == folds[k]) predicted <- k } else { omitted <- predicted <- which(folds == k) } mf_omitted <- mf[-omitted, , drop = FALSE] fit <- x up_args$object <- fit up_args$newdata <- mf_omitted up_args$data2 <- subset_data2(x$data2, -omitted) fit <- SW(do_call(update, up_args)) ll_args$object <- fit ll_args$newdata <- mf[predicted, , drop = FALSE] ll_args$newdata2 <- subset_data2(x$data2, predicted) lppds <- do_call(log_lik, ll_args) out <- nlist(lppds, omitted, predicted) if (save_fits) out$fit <- fit return(out) } futures <- vector("list", length(Ksub)) lppds <- obs_order <- vector("list", length(Ksub)) if (save_fits) { fits <- array(list(), dim = c(length(Ksub), 3)) dimnames(fits) <- list(NULL, c("fit", "omitted", "predicted")) } for (k in Ksub) { ks <- match(k, Ksub) message("Fitting model ", k, " out of ", K) futures[[ks]] <- future::future(.kfold_k(k), packages = "brms") } for (k in Ksub) { ks <- match(k, Ksub) tmp <- future::value(futures[[ks]]) if (save_fits) { fits[ks, ] <- tmp[c("fit", "omitted", "predicted")] } obs_order[[ks]] <- tmp$predicted lppds[[ks]] <- tmp$lppds } elpds <- ulapply(lppds, function(x) apply(x, 2, log_mean_exp)) # make sure elpds are put back in the right order elpds <- elpds[order(unlist(obs_order))] elpd_kfold <- sum(elpds) se_elpd_kfold <- sqrt(length(elpds) * var(elpds)) rnames <- c("elpd_kfold", "p_kfold", "kfoldic") cnames <- c("Estimate", "SE") estimates <- matrix(nrow = 3, ncol = 2, dimnames = list(rnames, cnames)) estimates[1, ] <- c(elpd_kfold, se_elpd_kfold) estimates[3, ] <- c(-2 * elpd_kfold, 2 * se_elpd_kfold) out <- nlist(estimates, pointwise = cbind(elpd_kfold = elpds)) atts <- nlist(K, Ksub, group, folds, fold_type) attributes(out)[names(atts)] <- atts if (save_fits) { out$fits <- fits out$data <- mf } structure(out, class = c("kfold", "loo")) } #' Predictions from K-Fold Cross-Validation #' #' Compute and evaluate predictions after performing K-fold #' cross-validation via \code{\link{kfold}}. #' #' @param x Object of class \code{'kfold'} computed by \code{\link{kfold}}. #' For \code{kfold_predict} to work, the fitted model objects need to have #' been stored via argument \code{save_fits} of \code{\link{kfold}}. #' @param method The method used to make predictions. Either \code{"predict"} #' or \code{"fitted"}. See \code{\link{predict.brmsfit}} for details. #' @inheritParams predict.brmsfit #' #' @return A \code{list} with two slots named \code{'y'} and \code{'yrep'}. #' Slot \code{y} contains the vector of observed responses. #' Slot \code{yrep} contains the matrix of predicted responses, #' with rows being posterior draws and columns being observations. #' #' @seealso \code{\link{kfold}} #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zBase * Trt + (1|patient), #' data = epilepsy, family = poisson()) #' #' # perform k-fold cross validation #' (kf <- kfold(fit, save_fits = TRUE, chains = 1)) #' #' # define a loss function #' rmse <- function(y, yrep) { #' yrep_mean <- colMeans(yrep) #' sqrt(mean((yrep_mean - y)^2)) #' } #' #' # predict responses and evaluate the loss #' kfp <- kfold_predict(kf) #' rmse(y = kfp$y, yrep = kfp$yrep) #' } #' #' @export kfold_predict <- function(x, method = c("predict", "fitted"), resp = NULL, ...) { if (!inherits(x, "kfold")) { stop2("'x' must be a 'kfold' object.") } if (!all(c("fits", "data") %in% names(x))) { stop2( "Slots 'fits' and 'data' are required. ", "Please run kfold with 'save_fits = TRUE'." ) } method <- get(match.arg(method), mode = "function") resp <- validate_resp(resp, x$fits[[1, "fit"]], multiple = FALSE) all_predicted <- as.character(sort(unlist(x$fits[, "predicted"]))) npredicted <- length(all_predicted) nsamples <- nsamples(x$fits[[1, "fit"]]) y <- rep(NA, npredicted) yrep <- matrix(NA, nrow = nsamples, ncol = npredicted) names(y) <- colnames(yrep) <- all_predicted for (k in seq_rows(x$fits)) { fit_k <- x$fits[[k, "fit"]] predicted_k <- x$fits[[k, "predicted"]] obs_names <- as.character(predicted_k) newdata <- x$data[predicted_k, , drop = FALSE] y[obs_names] <- get_y(fit_k, resp, newdata = newdata, ...) yrep[, obs_names] <- method( fit_k, newdata = newdata, resp = resp, allow_new_levels = TRUE, summary = FALSE, ... ) } nlist(y, yrep) } brms/R/numeric-helpers.R0000644000176200001440000000651713522262066014660 0ustar liggesusers# Most of the functions below have equivalents in Stan. Defining them in R is # necessary to evaluate non-linear formulas containing these functions. logit <- function(p) { log(p / (1 - p)) } inv_logit <- function(x) { 1 / (1 + exp(-x)) } cloglog <- function(x) { log(-log(1 - x)) } inv_cloglog <- function(x) { 1 - exp(-exp(x)) } Phi <- function(x) { pnorm(x) } # incomplete gamma funcion incgamma <- function(a, x) { pgamma(x, shape = a) * gamma(a) } square <- function(x) { x^2 } cbrt <- function(x) { x^(1/3) } exp2 <- function(x) { 2^x } pow <- function(x, y) { x^y } inv <- function(x) { 1/x } inv_sqrt <- function(x) { 1/sqrt(x) } inv_square <- function(x) { 1/x^2 } hypot <- function(x, y) { stopifnot(all(x >= 0)) stopifnot(all(y >= 0)) sqrt(x^2 + y^2) } log1m <- function(x) { log(1 - x) } step <- function(x) { ifelse(x > 0, 1, 0) } #' Logarithm with a minus one offset. #' #' Computes \code{log(x - 1)}. #' #' @param x A numeric or complex vector. #' @param base A positive or complex number: the base with respect to which #' logarithms are computed. Defaults to \emph{e} = \code{exp(1)}. #' #' @export logm1 <- function(x, base = exp(1)) { log(x - 1, base = base) } #' Exponential function plus one. #' #' Computes \code{exp(x) + 1}. #' #' @param x A numeric or complex vector. #' #' @export expp1 <- function(x) { exp(x) + 1 } #' Scaled logit-link #' #' Computes \code{logit((x - lb) / (ub - lb))} #' #' @param x A numeric or complex vector. #' @param lb Lower bound defaulting to \code{0}. #' @param ub Upper bound defaulting to \code{1}. #' #' @return A numeric or complex vector. #' #' @export logit_scaled <- function(x, lb = 0, ub = 1) { logit((x - lb) / (ub - lb)) } #' Scaled inverse logit-link #' #' Computes \code{inv_logit(x) * (ub - lb) + lb} #' #' @param x A numeric or complex vector. #' @param lb Lower bound defaulting to \code{0}. #' @param ub Upper bound defaulting to \code{1}. #' #' @return A numeric or complex vector between \code{lb} and \code{ub}. #' #' @export inv_logit_scaled <- function(x, lb = 0, ub = 1) { inv_logit(x) * (ub - lb) + lb } multiply_log <- function(x, y) { ifelse(x == y & x == 0, 0, x * log(y)) } log1p_exp <- function(x) { log(1 + exp(x)) } log1m_exp <- function(x) { ifelse(x < 0, log(1 - exp(x)), NaN) } log_diff_exp <- function(x, y) { stopifnot(length(x) == length(y)) ifelse(x > y, log(exp(x) - exp(y)), NaN) } log_sum_exp <- function(x, y) { max <- pmax(x, y) max + log(exp(x - max) + exp(y - max)) } log_mean_exp <- function(x) { max_x <- max(x) max_x + log(sum(exp(x - max_x))) - log(length(x)) } expm1 <- function(x) { exp(x) - 1 } log_expm1 <- function(x) { log(expm1(x)) } log_inv_logit <- function(x) { log(inv_logit(x)) } log1m_inv_logit <- function(x) { log(1 - inv_logit(x)) } scale_unit <- function(x, lb = min(x), ub = max(x)) { (x - lb) / (ub - lb) } fabs <- function(x) { abs(x) } softmax <- function(x) { if (!is.matrix(x)) { x <- matrix(x, nrow = 1) } x <- exp(x) x / rowSums(x) } log_softmax <- function(x) { if (!is.matrix(x)) { x <- matrix(x, nrow = 1) } x - log(rowSums(exp(x))) } brms/R/restructure.R0000644000176200001440000005147313613526315014147 0ustar liggesusers#' Restructure Old \code{brmsfit} Objects #' #' Restructure old \code{brmsfit} objects to work with #' the latest \pkg{brms} version. This function is called #' internally when applying post-processing methods. #' However, in order to avoid unnecessary run time caused #' by the restructuring, I recommend explicitly calling #' \code{restructure} once per model after updating \pkg{brms}. #' #' @param x An object of class \code{brmsfit}. #' @param rstr_summary Logical; If \code{TRUE}, the cached summary #' stored by \pkg{rstan} is restructured as well. #' #' @return A \code{brmsfit} object compatible with the latest version #' of \pkg{brms}. #' #' @export restructure <- function(x, rstr_summary = FALSE) { stopifnot(is.brmsfit(x)) if (is.null(x$version)) { # this is the latest version without saving the version number x$version <- list(brms = package_version("0.9.1")) } else if (is.package_version(x$version)) { # also added the rstan version in brms 1.5.0 x$version <- list(brms = x$version) } current_version <- utils::packageVersion("brms") restr_version <- get_restructure_version(x) if (restr_version >= current_version) { # object is up to date with the current brms version return(x) } if (restr_version < "2.0.0") { x <- restructure_v1(x) } if (restr_version < "3.0.0") { x <- restructure_v2(x) } # remember the version with which the object was restructured x$version$restructure <- current_version # remove unused attribute attr(x, "restructured") <- NULL # optionally also restructure the rstan summary # TODO: remove at some point as summary.brmsfit no longer requires it stan_env <- attributes(x$fit)$.MISC if (rstr_summary && exists("summary", stan_env)) { stan_summary <- get("summary", stan_env) old_parnames <- rownames(stan_summary$msd) if (!identical(old_parnames, parnames(x))) { # do not rename parameters in the cached summary # just let rstan compute the summary again remove("summary", pos = stan_env) } } x } restructure_v2 <- function(x) { # restructure models fitted with brms 2.x x$formula <- update_old_family(x$formula) bterms <- SW(parse_bf(x$formula)) pars <- parnames(x) version <- get_restructure_version(x) if (version <= "2.1.1") { x <- do_renaming(x, change_old_bsp(pars)) } if (version <= "2.1.2") { if ("weibull" %in% family_names(x)) { stop_parameterization_changed("weibull", "2.1.3") } } if (version <= "2.1.7") { if ("exgaussian" %in% family_names(x)) { stop_parameterization_changed("exgaussian", "2.1.8") } } if (version <= "2.1.8") { # reworked 'me' terms (#372) meef <- tidy_meef(bterms, model.frame(x)) if (isTRUE(nrow(meef) > 0)) { warning2( "Measurement error ('me') terms have been reworked ", "in version 2.1.9. I strongly recommend refitting your ", "model with the latest version of brms." ) } } if (version <= "2.2.3") { # added 'dist' argument to grouping terms x$ranef <- tidy_ranef(bterms, model.frame(x)) } if (version <= "2.3.6") { check_old_nl_dpars(bterms) } if (version <= "2.8.2") { # argument 'sparse' is now specified within 'formula' sparse <- if (grepl("sparse matrix", stancode(x))) TRUE x$formula <- SW(validate_formula(x$formula, data = x$data, sparse = sparse)) } if (version <= "2.8.3") { x <- rescale_old_mo(x) } if (version <= "2.8.4") { if (any(grepl("^arr(\\[|_|$)", pars))) { warning2("ARR structures are no longer supported.") } } if (version <= "2.8.5") { # internal handling of special effects terms has changed # this requires updating the 'terms' attribute of the data x$data <- rm_attr(x$data, c("brmsframe", "terms")) x$data <- validate_data(x$data, bterms) } if (version <= "2.8.8") { if (any(grepl("^loclev(\\[|_|$)", pars))) { warning2("BSTS structures are no longer supported.") } } if (version <= "2.10.3") { # model fit criteria have been moved to x$criteria criterion_names <- c("loo", "waic", "kfold", "R2", "marglik") criteria <- x[intersect(criterion_names, names(x))] x[criterion_names] <- NULL # rename 'R2' to 'bayes_R2' according to #793 names(criteria)[names(criteria) == "R2"] <- "bayes_R2" x$criteria <- criteria } if (version <= "2.10.4") { # new slot 'thres' stored inside ordinal families if (is_ordinal(x$formula)) { x$formula <- SW(validate_formula(x$formula, data = x$data)) } } if (version <= "2.11.1") { # 'autocor' was integrated into the formula interface x$formula <- SW(validate_formula(x$formula)) x$data2 <- validate_data2( data2 = list(), bterms = bterms, get_data2_autocor(x$formula) ) } if (version <= "2.11.2") { # ordering after IDs matches the order of the posterior samples # if multiple IDs are used for the same grouping factor (#835) x$ranef <- x$ranef[order(x$ranef$id), , drop = FALSE] } if (version <= "2.11.4") { # 'cats' is stored inside ordinal families again if (is_ordinal(x$formula)) { x$formula <- SW(validate_formula(x$formula, data = x$data)) } } x } # restructure models fitted with brms 1.x restructure_v1 <- function(x) { version <- get_restructure_version(x) if (version < "1.0.0") { warning2( "Models fitted with brms < 1.0 are no longer offically ", "supported and post-processing them may fail. I recommend ", "refitting the model with the latest version of brms." ) } x$formula <- restructure_formula(formula(x), x$nonlinear) x$formula <- SW(validate_formula( formula(x), data = model.frame(x), family = family(x), autocor = x$autocor, threshold = x$threshold )) x$nonlinear <- x$partial <- x$threshold <- NULL bterms <- parse_bf(formula(x)) x$data <- rm_attr(x$data, "brmsframe") x$data <- validate_data(x$data, bterms) x$ranef <- tidy_ranef(bterms, model.frame(x)) if ("prior_frame" %in% class(x$prior)) { class(x$prior) <- c("brmsprior", "data.frame") } if (is(x$autocor, "cov_fixed")) { # deprecated as of brms 1.4.0 class(x$autocor) <- "cor_fixed" } if (version <= "0.10.0.9000") { if (length(bterms$dpars$mu$nlpars)) { # nlpar and group have changed positions change <- change_old_re(x$ranef, parnames(x), x$fit@sim$dims_oi) x <- do_renaming(x, change) } } if (version < "1.0.0") { # double underscores were added to group-level parameters change <- change_old_re2(x$ranef, parnames(x), x$fit@sim$dims_oi) x <- do_renaming(x, change) } if (version <= "1.0.1") { # names of spline parameters had to be changed after # allowing for multiple covariates in one spline term change <- change_old_sm( bterms, model.frame(x), parnames(x), x$fit@sim$dims_oi ) x <- do_renaming(x, change) } if (version <= "1.8.0") { att <- attributes(x$exclude) if (is.null(att$save_ranef)) { attr(x$exclude, "save_ranef") <- any(grepl("^r_", parnames(x))) || !nrow(x$ranef) } if (is.null(att$save_mevars)) { attr(x$exclude, "save_mevars") <- any(grepl("^Xme_", parnames(x))) } } if (version <= "1.8.0.1") { x$prior[, c("resp", "dpar")] <- "" } if (version <= "1.9.0.3") { # names of monotonic parameters had to be changed after # allowing for interactions in monotonic terms change <- change_old_mo(bterms, x$data, pars = parnames(x)) x <- do_renaming(x, change) } if (version >= "1.0.0" && version < "2.0.0") { change <- change_old_categorical(bterms, x$data, pars = parnames(x)) x <- do_renaming(x, change) } x } # get version with which a brmsfit object was restructured get_restructure_version <- function(x) { stopifnot(is.brmsfit(x)) out <- x$version$restructure if (!is.package_version(out)) { # models restructured with brms 2.11.1 store it as an attribute out <- attr(x, "restructured", exact = TRUE) } if (!is.package_version(out)) { out <- x$version$brms } out } # convert old model formulas to brmsformula objects restructure_formula <- function(formula, nonlinear = NULL) { if (is.brmsformula(formula) && is.formula(formula)) { # convert deprecated brmsformula objects back to formula class(formula) <- "formula" } if (is.brmsformula(formula)) { # already up to date return(formula) } old_nonlinear <- attr(formula, "nonlinear") nl <- length(nonlinear) > 0 if (is.logical(old_nonlinear)) { nl <- nl || old_nonlinear } else if (length(old_nonlinear)) { nonlinear <- c(nonlinear, old_nonlinear) nl <- TRUE } out <- structure(nlist(formula), class = "brmsformula") old_forms <- rmNULL(attributes(formula)[old_dpars()]) old_forms <- c(old_forms, nonlinear) out$pforms[names(old_forms)] <- old_forms bf(out, nl = nl) } # parameters to be restructured in old brmsformula objects old_dpars <- function() { c("mu", "sigma", "shape", "nu", "phi", "kappa", "beta", "xi", "zi", "hu", "zoi", "coi", "disc", "bs", "ndt", "bias", "quantile", "alpha", "theta") } # interchanges group and nlpar in names of group-level parameters # required for brms <= 0.10.0.9000 # @param ranef output of tidy_ranef # @param pars names of all parameters in the model # @param dims dimension of parameters # @return a list whose elements can be interpreted by do_renaming change_old_re <- function(ranef, pars, dims) { out <- list() for (id in unique(ranef$id)) { r <- subset2(ranef, id = id) g <- r$group[1] nlpar <- r$nlpar[1] stopifnot(nzchar(nlpar)) # rename sd-parameters old_sd_names <- paste0("sd_", nlpar, "_", g, "_", r$coef) new_sd_names <- paste0("sd_", g, "_", nlpar, "_", r$coef) for (i in seq_along(old_sd_names)) { lc(out) <- change_simple( old_sd_names[i], new_sd_names[i], pars, dims ) } # rename cor-parameters new_cor_names <- get_cornames( paste0(nlpar, "_", r$coef), type = paste0("cor_", g), brackets = FALSE, sep = "_" ) old_cor_names <- get_cornames( r$coef, brackets = FALSE, sep = "_", type = paste0("cor_", nlpar, "_", g) ) for (i in seq_along(old_cor_names)) { lc(out) <- change_simple( old_cor_names[i], new_cor_names[i], pars, dims ) } # rename r-parameters old_r_name <- paste0("r_", nlpar, "_", g) new_r_name <- paste0("r_", g, "_", nlpar) levels <- gsub("[ \t\r\n]", ".", attr(ranef, "levels")[[g]]) index_names <- make_index_names(levels, r$coef, dim = 2) new_r_names <- paste0(new_r_name, index_names) lc(out) <- change_simple( old_r_name, new_r_names, pars, dims, pnames = new_r_name ) } out } # add double underscore in group-level parameters # required for brms < 1.0.0 # @note assumes that group and nlpar are correctly ordered already # @param ranef output of tidy_ranef # @param pars names of all parameters in the model # @param dims dimension of parameters # @return a list whose elements can be interpreted by do_renaming change_old_re2 <- function(ranef, pars, dims) { out <- list() for (id in unique(ranef$id)) { r <- subset2(ranef, id = id) g <- r$group[1] nlpars_usc <- usc(r$nlpar, "suffix") # rename sd-parameters old_sd_names <- paste0("sd_", g, "_", nlpars_usc, r$coef) new_sd_names <- paste0("sd_", g, "__", nlpars_usc, r$coef) for (i in seq_along(old_sd_names)) { lc(out) <- change_simple(old_sd_names[i], new_sd_names[i], pars, dims) } # rename cor-parameters new_cor_names <- get_cornames( paste0(nlpars_usc, r$coef), type = paste0("cor_", g), brackets = FALSE ) old_cor_names <- get_cornames( paste0(nlpars_usc, r$coef), type = paste0("cor_", g), brackets = FALSE, sep = "_" ) for (i in seq_along(old_cor_names)) { lc(out) <- change_simple(old_cor_names[i], new_cor_names[i], pars, dims) } # rename r-parameters for (nlpar in unique(r$nlpar)) { sub_r <- r[r$nlpar == nlpar, ] old_r_name <- paste0("r_", g, usc(nlpar)) new_r_name <- paste0("r_", g, usc(usc(nlpar))) levels <- gsub("[ \t\r\n]", ".", attr(ranef, "levels")[[g]]) index_names <- make_index_names(levels, sub_r$coef, dim = 2) new_r_names <- paste0(new_r_name, index_names) lc(out) <- change_simple( old_r_name, new_r_names, pars, dims, pnames = new_r_name ) } } out } # change names of spline parameters fitted with brms <= 1.0.1 # this became necessary after allowing smooths with multiple covariates change_old_sm <- function(bterms, data, pars, dims) { .change_old_sm <- function(bt) { out <- list() smef <- tidy_smef(bt, data) if (nrow(smef)) { p <- usc(combine_prefix(bt), "suffix") old_smooths <- rename(paste0(p, smef$term)) new_smooths <- rename(paste0(p, smef$label)) old_sds_pars <- paste0("sds_", old_smooths) new_sds_pars <- paste0("sds_", new_smooths, "_1") old_s_pars <- paste0("s_", old_smooths) new_s_pars <- paste0("s_", new_smooths, "_1") for (i in seq_along(old_smooths)) { lc(out) <- change_simple(old_sds_pars[i], new_sds_pars[i], pars, dims) dim_s <- dims[[old_s_pars[i]]] if (!is.null(dim_s)) { new_s_par_indices <- paste0(new_s_pars[i], "[", seq_len(dim_s), "]") lc(out) <- change_simple( old_s_pars[i], new_s_par_indices, pars, dims, pnames = new_s_pars[i] ) } } } return(out) } out <- list() if (is.mvbrmsterms(bterms)) { for (r in bterms$responses) { c(out) <- .change_old_sm(bterms$terms[[r]]$dpars$mu) } } else if (is.brmsterms(bterms)) { for (dp in names(bterms$dpars)) { bt <- bterms$dpars[[dp]] if (length(bt$nlpars)) { for (nlp in names(bt$nlpars)) { c(out) <- .change_old_sm(bt$nlpars[[nlp]]) } } else { c(out) <- .change_old_sm(bt) } } } out } # change names of monotonic effects fitted with brms <= 1.9.0 # this became necessary after implementing monotonic interactions change_old_mo <- function(bterms, data, pars) { .change_old_mo <- function(bt) { out <- list() spef <- tidy_spef(bt, data) has_mo <- lengths(spef$calls_mo) > 0 if (!any(has_mo)) { return(out) } spef <- spef[has_mo, ] p <- usc(combine_prefix(bt)) bmo_prefix <- paste0("bmo", p, "_") bmo_regex <- paste0("^", bmo_prefix, "[^_]+$") bmo_old <- pars[grepl(bmo_regex, pars)] bmo_new <- paste0(bmo_prefix, spef$coef) if (length(bmo_old) != length(bmo_new)) { stop2("Restructuring failed. Please refit your ", "model with the latest version of brms.") } for (i in seq_along(bmo_old)) { pos <- grepl(paste0("^", bmo_old[i]), pars) lc(out) <- clist(pos, fnames = bmo_new[i]) } simo_regex <- paste0("^simplex", p, "_[^_]+$") simo_old_all <- pars[grepl(simo_regex, pars)] simo_index <- get_matches("\\[[[:digit:]]+\\]$", simo_old_all) simo_old <- unique(sub("\\[[[:digit:]]+\\]$", "", simo_old_all)) simo_coef <- get_simo_labels(spef) for (i in seq_along(simo_old)) { regex_pos <- paste0("^", simo_old[i]) pos <- grepl(regex_pos, pars) simo_new <- paste0("simo", p, "_", simo_coef[i]) simo_index_part <- simo_index[grepl(regex_pos, simo_old_all)] simo_new <- paste0(simo_new, simo_index_part) lc(out) <- clist(pos, fnames = simo_new) } return(out) } out <- list() if (is.mvbrmsterms(bterms)) { for (r in bterms$responses) { c(out) <- .change_old_mo(bterms$terms[[r]]$dpars$mu) } } else if (is.brmsterms(bterms)) { for (dp in names(bterms$dpars)) { bt <- bterms$dpars[[dp]] if (length(bt$nlpars)) { for (nlp in names(bt$nlpars)) { c(out) <- .change_old_mo(bt$nlpars[[nlp]]) } } else { c(out) <- .change_old_mo(bt) } } } out } # between version 1.0 and 2.0 categorical models used # the internal multivariate interface change_old_categorical <- function(bterms, data, pars) { stopifnot(is.brmsterms(bterms)) if (!is_categorical(bterms$family)) { return(list()) } # compute the old category names respform <- bterms$respform old_dpars <- model.response(model.frame(respform, data = data)) old_dpars <- levels(factor(old_dpars)) old_dpars <- make.names(old_dpars[-1], unique = TRUE) old_dpars <- rename(old_dpars, ".", "x") new_dpars <- bterms$family$dpars stopifnot(length(old_dpars) == length(new_dpars)) pos <- rep(FALSE, length(pars)) new_pars <- pars for (i in seq_along(old_dpars)) { # not perfectly save but hopefully mostly correct regex <- paste0("(?<=_)", old_dpars[i], "(?=_|\\[)") pos <- pos | grepl(regex, pars, perl = TRUE) new_pars <- gsub(regex, new_dpars[i], new_pars, perl = TRUE) } list(nlist(pos, fnames = new_pars[pos])) } # as of brms 2.2 'mo' and 'me' terms are handled together change_old_bsp <- function(pars) { pos <- grepl("^(bmo|bme)_", pars) if (!any(pos)) return(list()) fnames <- gsub("^(bmo|bme)_", "bsp_", pars[pos]) list(nlist(pos, fnames)) } # prepare for renaming of parameters in old models change_simple <- function(oldname, fnames, pars, dims, pnames = fnames) { pos <- grepl(paste0("^", oldname), pars) if (any(pos)) { out <- nlist(pos, oldname, pnames, fnames, dims = dims[[oldname]]) class(out) <- c("clist", "list") } else { out <- NULL } out } # rescale old 'b' coefficients of monotonic effects # to represent average instead of total differences rescale_old_mo <- function(x, ...) { UseMethod("rescale_old_mo") } #' @export rescale_old_mo.brmsfit <- function(x, ...) { bterms <- parse_bf(x$formula) rescale_old_mo(bterms, fit = x, ...) } #' @export rescale_old_mo.mvbrmsterms <- function(x, fit, ...) { for (resp in x$responses) { fit <- rescale_old_mo(x$terms[[resp]], fit = fit, ...) } fit } #' @export rescale_old_mo.brmsterms <- function(x, fit, ...) { for (dp in names(x$dpars)) { fit <- rescale_old_mo(x$dpars[[dp]], fit = fit, ...) } for (nlp in names(x$nlpars)) { fit <- rescale_old_mo(x$nlpars[[nlp]], fit = fit, ...) } fit } #' @export rescale_old_mo.btnl <- function(x, fit, ...) { fit } #' @export rescale_old_mo.btl <- function(x, fit, ...) { spef <- tidy_spef(x, fit$data) has_mo <- lengths(spef$Imo) > 0L if (!any(has_mo)) { return(fit) } warning2( "The parameterization of monotonic effects has changed in brms 2.8.4 ", "so that corresponding 'b' coefficients now represent average instead ", "of total differences between categories. See vignette('brms_monotonic') ", "for more details. Parameters of old models are adjusted automatically." ) p <- combine_prefix(x) all_pars <- parnames(fit) chains <- fit$fit@sim$chains for (i in which(has_mo)) { bsp_par <- paste0("bsp", p, "_", spef$coef[i]) simo_regex <- paste0(spef$coef[i], seq_along(spef$Imo[[i]])) simo_regex <- paste0("simo", p, "_", simo_regex, "[") simo_regex <- paste0("^", escape_all(simo_regex)) # scaling factor by which to divide the old 'b' coefficients D <- prod(ulapply(simo_regex, function(r) sum(grepl(r, all_pars)))) for (j in seq_len(chains)) { fit$fit@sim$samples[[j]][[bsp_par]] <- fit$fit@sim$samples[[j]][[bsp_par]] / D } } fit } # update old families to work with the latest brms version update_old_family <- function(x, ...) { UseMethod("update_old_family") } #' @export update_old_family.default <- function(x, ...) { check_family(x) } #' @export update_old_family.brmsfamily <- function(x, ...) { # new specials may have been added in new brms versions family_info <- get(paste0(".family_", x$family))() x$specials <- family_info$specials x } #' @export update_old_family.customfamily <- function(x, ...) { x } #' @export update_old_family.mixfamily <- function(x, ...) { x$mix <- lapply(x$mix, update_old_family, ...) x } #' @export update_old_family.brmsformula <- function(x, ...) { x$family <- update_old_family(x$family, ...) x } #' @export update_old_family.mvbrmsformula <- function(x, ...) { x$forms <- lapply(x$forms, update_old_family, ...) x } stop_parameterization_changed <- function(family, version) { stop2( "The parameterization of '", family, "' models has changed in brms ", version, " to be consistent with other model classes. ", "Please refit your model with the current version of brms." ) } check_old_nl_dpars <- function(bterms) { .check_nl_dpars <- function(x) { stopifnot(is.brmsterms(x)) non_mu_dpars <- x$dpars[names(x$dpars) != "mu"] if (any(ulapply(non_mu_dpars, is.btnl))) { stop2( "Non-linear parameters are global within univariate models ", "as of version 2.3.7. Please refit your model with the ", "latest version of brms." ) } return(TRUE) } if (is.mvbrmsterms(bterms)) { lapply(bterms$terms, .check_nl_dpars) } else { .check_nl_dpars(bterms) } TRUE } brms/R/brms-package.R0000644000176200001440000001002413552555373014107 0ustar liggesusers#' Bayesian Regression Models using 'Stan' #' #' @docType package #' @name brms-package #' @aliases brms #' #' @description #' \if{html}{ #' \figure{stanlogo.png}{options: width="50px" alt="http://mc-stan.org/about/logo/"} #' \emph{Stan Development Team} #' } #' #' The \pkg{brms} package provides an interface to fit Bayesian generalized #' multivariate (non-)linear multilevel models using \pkg{Stan}, which is a #' C++ package for obtaining full Bayesian inference (see \url{http://mc-stan.org/}). #' The formula syntax is an extended version of the syntax applied in the #' \pkg{lme4} package to provide a familiar and simple interface for #' performing regression analyses. #' #' @details #' The main function of \pkg{brms} is \code{\link{brm}}, which uses #' formula syntax to specify a wide range of complex Bayesian models #' (see \code{\link{brmsformula}} for details). Based on the supplied #' formulas, data, and additional information, it writes the Stan code #' on the fly via \code{\link{make_stancode}}, prepares the data via #' \code{\link{make_standata}}, and fits the model using #' \pkg{\link[rstan:rstan]{Stan}}. #' #' Subsequently, a large number of post-processing methods can be applied: #' To get an overview on the estimated parameters, #' \code{\link[brms:summary.brmsfit]{summary}} or #' \code{\link[brms:conditional_effects.brmsfit]{conditional_effects}} #' are perfectly suited. Detailed visual analyses can be performed by applying #' the \code{\link{pp_check}} and \code{\link{stanplot}} methods, which both #' rely on the \pkg{\link[bayesplot:bayesplot-package]{bayesplot}} package. #' Model comparsions can be done via \code{\link{loo}} and \code{\link{waic}}, #' which make use of the \pkg{\link[loo:loo-package]{loo}} package as well as #' via \code{\link{bayes_factor}} which relies on the \pkg{bridgesampling} package. #' For a full list of methods to apply, type \code{methods(class = "brmsfit")}. #' #' Because \pkg{brms} is based on \pkg{Stan}, a C++ compiler is required. #' The program Rtools (available on \url{https://cran.r-project.org/bin/windows/Rtools/}) #' comes with a C++ compiler for Windows. On Mac, you should use Xcode. #' For further instructions on how to get the compilers running, see the #' prerequisites section at the #' \href{https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started}{RStan-Getting-Started} #' page. #' #' When comparing other packages fitting multilevel models to \pkg{brms}, keep #' in mind that the latter needs to compile models before actually fitting them, #' which will require between 20 and 40 seconds depending on your machine, #' operating system and overall model complexity. #' #' Thus, fitting smaller models may be relatively slow as compilation time makes #' up the majority of the whole running time. For larger / more complex #' models however, fitting my take several minutes or even hours, so that the #' compilation time won't make much of a difference for these models. #' #' See \code{vignette("brms_overview")} and \code{vignette("brms_multilevel")} #' for a general introduction and overview of \pkg{brms}. For a full list of #' available vignettes, type \code{vignette(package = "brms")}. #' #' @references #' Paul-Christian Buerkner (2017). brms: An R Package for Bayesian Multilevel #' Models Using Stan. \emph{Journal of Statistical Software}, 80(1), 1-28. #' \code{doi:10.18637/jss.v080.i01} #' #' Paul-Christian Buerkner (2018). Advanced Bayesian Multilevel Modeling #' with the R Package brms. \emph{The R Journal}. 10(1), 395–411. #' \code{doi:10.32614/RJ-2018-017} #' #' The Stan Development Team. \emph{Stan Modeling Language User's Guide and #' Reference Manual}. \url{http://mc-stan.org/users/documentation}. #' #' Stan Development Team (2018). RStan: the R interface to Stan. R package #' version 2.18.1. \url{http://mc-stan.org} #' #' @seealso #' \code{\link{brm}}, #' \code{\link{brmsformula}}, #' \code{\link{brmsfamily}}, #' \code{\link{brmsfit}} #' NULL brms/R/ggplot-themes.R0000644000176200001440000000752213442002443014322 0ustar liggesusers#' Default \pkg{bayesplot} Theme for \pkg{ggplot2} Graphics #' #' This theme is imported from the \pkg{bayesplot} package. #' See \code{\link[bayesplot:theme_default]{theme_default}} #' for a complete documentation. #' #' @name theme_default #' #' @param base_size base font size #' @param base_family base font family #' #' @return A \code{theme} object used in \pkg{ggplot2} graphics. #' #' @importFrom bayesplot theme_default #' @export theme_default NULL #' Black Theme for \pkg{ggplot2} Graphics #' #' A black theme for ggplot graphics inspired by a blog post of Jon Lefcheck #' (\url{https://jonlefcheck.net/2013/03/11/black-theme-for-ggplot2-2/}). #' #' @param base_size base font size #' @param base_family base font family #' #' @return A \code{theme} object used in \pkg{ggplot2} graphics. #' #' @details When using \code{theme_black} in plots powered by the #' \pkg{bayesplot} package such as \code{pp_check} or \code{stanplot}, #' I recommend using the \code{"viridisC"} color scheme (see examples). #' #' @examples #' \dontrun{ #' # change default ggplot theme #' ggplot2::theme_set(theme_black()) #' #' # change default bayesplot color scheme #' bayesplot::color_scheme_set("viridisC") #' #' # fit a simple model #' fit <- brm(count ~ zAge + zBase * Trt + (1|patient), #' data = epilepsy, family = poisson(), chains = 2) #' summary(fit) #' #' # create various plots #' plot(marginal_effects(fit), ask = FALSE) #' pp_check(fit) #' stanplot(fit, type = "hex", pars = c("b_Intercept", "b_Trt1")) #' } #' #' @export theme_black = function(base_size = 12, base_family = "") { theme_grey(base_size = base_size, base_family = base_family) %+replace% theme( # axis options axis.line = element_blank(), axis.text.x = element_text( size = base_size * 0.8, color = "white", lineheight = 0.9 ), axis.text.y = element_text( size = base_size * 0.8, color = "white", lineheight = 0.9 ), axis.ticks = element_line(color = "white", size = 0.2), axis.title.x = element_text( size = base_size, color = "white", margin = margin(10, 0, 0, 0) ), axis.title.y = element_text( size = base_size, color = "white", angle = 90, margin = margin(0, 10, 0, 0) ), axis.ticks.length = unit(0.3, "lines"), # legend options legend.background = element_rect(color = NA, fill = "black"), legend.key = element_rect(color = "white", fill = "black"), legend.key.size = unit(1.2, "lines"), legend.key.height = NULL, legend.key.width = NULL, legend.text = element_text(size = base_size * 0.8, color = "white"), legend.title = element_text( size = base_size * 0.8, face = "bold", hjust = 0, color = "white" ), legend.position = "right", legend.text.align = NULL, legend.title.align = NULL, legend.direction = "vertical", legend.box = NULL, # panel options panel.background = element_rect(fill = "black", color = NA), panel.border = element_rect(fill = NA, color = "white"), panel.grid.major = element_line(color = "grey35"), panel.grid.minor = element_line(color = "grey20"), panel.spacing = unit(0.5, "lines"), # facetting options strip.background = element_rect(fill = "grey30", color = "grey10"), strip.text.x = element_text( size = base_size * 0.8, color = "white", margin = margin(3, 0, 4, 0) ), strip.text.y = element_text( size = base_size * 0.8, color = "white", angle = -90 ), # plot options plot.background = element_rect(color = "black", fill = "black"), plot.title = element_text(size = base_size * 1.2, color = "white"), plot.margin = unit(rep(1, 4), "lines") ) } brms/R/make_stancode.R0000644000176200001440000001606713612314344014351 0ustar liggesusers#' Stan Code for \pkg{brms} Models #' #' Generate Stan code for \pkg{brms} models #' #' @inheritParams brm #' @param silent logical; If \code{TRUE}, warnings of #' the Stan parser will be suppressed. #' @param ... Other arguments for internal usage only #' #' @return A character string containing the fully commented \pkg{Stan} code #' to fit a \pkg{brms} model. #' #' @examples #' make_stancode(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = "cumulative") #' #' make_stancode(count ~ zAge + zBase * Trt + (1|patient), #' data = epilepsy, family = "poisson") #' #' @export make_stancode <- function(formula, data, family = gaussian(), prior = NULL, autocor = NULL, cov_ranef = NULL, sparse = NULL, sample_prior = c("no", "yes", "only"), stanvars = NULL, stan_funs = NULL, save_model = NULL, silent = FALSE, ...) { dots <- list(...) silent <- as_one_logical(silent) # some input checks if (is.brmsfit(formula)) { stop2("Use 'stancode' to extract Stan code from 'brmsfit' objects.") } if (length(stan_funs) > 0) { warning2("Argument 'stan_funs' is deprecated. Please use argument ", "'stanvars' instead. See ?stanvar for more help.") stan_funs <- as_one_character(stan_funs) } formula <- validate_formula( formula, data = data, family = family, autocor = autocor, sparse = sparse ) bterms <- parse_bf(formula) sample_prior <- check_sample_prior(sample_prior) prior <- check_prior( prior, formula = formula, data = data, sample_prior = sample_prior, warn = TRUE ) data <- validate_data(data, bterms = bterms) ranef <- tidy_ranef(bterms, data = data) meef <- tidy_meef(bterms, data = data) stanvars <- validate_stanvars(stanvars) scode_predictor <- stan_predictor( bterms, data = data, prior = prior, ranef = ranef, meef = meef, stanvars = stanvars ) scode_ranef <- stan_re(ranef, prior = prior, cov_ranef = cov_ranef) scode_llh <- stan_llh(bterms, data = data) scode_global_defs <- stan_global_defs( bterms, prior = prior, ranef = ranef, cov_ranef = cov_ranef ) scode_Xme <- stan_Xme(meef, prior = prior) # get priors for all parameters in the model scode_prior <- paste0( scode_predictor$prior, scode_ranef$prior, scode_Xme$prior, stan_unchecked_prior(prior) ) # generate functions block scode_functions <- paste0( "// generated with brms ", utils::packageVersion("brms"), "\n", "functions {\n", scode_global_defs$fun, collapse_stanvars(stanvars, block = "functions"), stan_funs, "}\n" ) # generate data block scode_data <- paste0( "data {\n", scode_predictor$data, scode_ranef$data, scode_Xme$data, " int prior_only; // should the likelihood be ignored?\n", collapse_stanvars(stanvars, block = "data"), "}\n" ) # generate transformed parameters block scode_transformed_data <- paste0( "transformed data {\n", scode_global_defs$tdata_def, scode_predictor$tdata_def, collapse_stanvars(stanvars, block = "tdata"), scode_predictor$tdata_comp, "}\n" ) # generate parameters block scode_parameters <- paste0( scode_predictor$par, scode_ranef$par, scode_Xme$par ) scode_rngprior <- stan_rngprior( sample_prior = sample_prior, par_declars = scode_parameters, gen_quantities = scode_predictor$gen_def, prior = scode_prior, prior_special = attr(prior, "special") ) scode_parameters <- paste0( "parameters {\n", scode_parameters, scode_rngprior$par, collapse_stanvars(stanvars, block = "parameters"), "}\n" ) # generate transformed parameters block scode_transformed_parameters <- paste0( "transformed parameters {\n", scode_predictor$tpar_def, scode_ranef$tpar_def, scode_Xme$tpar_def, collapse_stanvars(stanvars, block = "tparameters"), scode_predictor$tpar_prior, scode_ranef$tpar_prior, scode_Xme$tpar_prior, scode_predictor$tpar_comp, scode_ranef$tpar_comp, scode_Xme$tpar_comp, "}\n" ) # generate model block scode_model <- paste0( "model {\n", scode_predictor$model_def, collapse_stanvars(stanvars, block = "model"), scode_predictor$model_comp_basic, scode_predictor$model_comp_eta_loop, scode_predictor$model_comp_dpar_link, scode_predictor$model_comp_mu_link, scode_predictor$model_comp_dpar_trans, scode_predictor$model_comp_mix, scode_predictor$model_comp_arma, scode_predictor$model_comp_catjoin, scode_predictor$model_comp_mvjoin, " // priors including all constants\n", scode_prior, " // likelihood including all constants\n", " if (!prior_only) {\n", scode_llh, " }\n", scode_rngprior$model, "}\n" ) # generate generated quantities block scode_generated_quantities <- paste0( "generated quantities {\n", scode_predictor$gen_def, scode_ranef$gen_def, scode_Xme$gen_def, scode_rngprior$gen_def, collapse_stanvars(stanvars, block = "genquant"), scode_predictor$gen_comp, scode_ranef$gen_comp, scode_rngprior$gen_comp, scode_Xme$gen_comp, "}\n" ) # combine all elements into a complete Stan model complete_model <- paste0( scode_functions, scode_data, scode_transformed_data, scode_parameters, scode_transformed_parameters, scode_model, scode_generated_quantities ) if (!isTRUE(dots$testmode)) { # expand '#include' statements by calling rstan::stanc_builder temp_file <- tempfile(fileext = ".stan") cat(complete_model, file = temp_file) isystem <- system.file("chunks", package = "brms") # get rid of diagnostic messages from parser complete_model <- eval_silent( rstan::stanc_builder( file = temp_file, isystem = isystem, obfuscate_model_name = TRUE ), type = "message", try = TRUE ) complete_model <- complete_model$model_code str_add(complete_model) <- "\n" if (is.character(save_model)) { cat(complete_model, file = save_model) } } class(complete_model) <- c("character", "brmsmodel") complete_model } #' @export print.brmsmodel <- function(x, ...) { cat(x) invisible(x) } #' Extract Stan model code #' #' Extract Stan code that was used to specify the model. #' #' @aliases stancode.brmsfit #' #' @param object An object of class \code{brmsfit}. #' @param version Logical; indicates if the first line containing #' the \pkg{brms} version number should be included. #' Defaults to \code{TRUE}. #' @param ... Currently ignored. #' #' @return Stan model code for further processing. #' #' @export stancode.brmsfit <- function(object, version = TRUE, ...) { out <- object$model if (!version) { out <- sub("^[^\n]+[[:digit:]]\\.[^\n]+\n", "", out) } out } #' @rdname stancode.brmsfit #' @export stancode <- function(object, ...) { UseMethod("stancode") } brms/R/families.R0000644000176200001440000015455413615315004013346 0ustar liggesusers#' Special Family Functions for \pkg{brms} Models #' #' Family objects provide a convenient way to specify the details of the models #' used by many model fitting functions. The family functions presented here are #' for use with \pkg{brms} only and will **not** work with other model #' fitting functions such as \code{glm} or \code{glmer}. #' However, the standard family functions as described in #' \code{\link[stats:family]{family}} will work with \pkg{brms}. #' You can also specify custom families for use in \pkg{brms} with #' the \code{\link{custom_family}} function. #' #' @param family A character string naming the distribution of the response #' variable be used in the model. Currently, the following families are #' supported: \code{gaussian}, \code{student}, \code{binomial}, #' \code{bernoulli}, \code{poisson}, \code{negbinomial}, \code{geometric}, #' \code{Gamma}, \code{skew_normal}, \code{lognormal}, #' \code{shifted_lognormal}, \code{exgaussian}, \code{wiener}, #' \code{inverse.gaussian}, \code{exponential}, \code{weibull}, #' \code{frechet}, \code{Beta}, \code{dirichlet}, \code{von_mises}, #' \code{asym_laplace}, \code{gen_extreme_value}, \code{categorical}, #' \code{multinomial}, \code{cumulative}, \code{cratio}, \code{sratio}, #' \code{acat}, \code{hurdle_poisson}, \code{hurdle_negbinomial}, #' \code{hurdle_gamma}, \code{hurdle_lognormal}, #' \code{zero_inflated_binomial}, \code{zero_inflated_beta}, #' \code{zero_inflated_negbinomial}, \code{zero_inflated_poisson}, and #' \code{zero_one_inflated_beta}. #' @param link A specification for the model link function. This can be a #' name/expression or character string. See the 'Details' section for more #' information on link functions supported by each family. #' @param link_sigma Link of auxiliary parameter \code{sigma} if being predicted. #' @param link_shape Link of auxiliary parameter \code{shape} if being predicted. #' @param link_nu Link of auxiliary parameter \code{nu} if being predicted. #' @param link_phi Link of auxiliary parameter \code{phi} if being predicted. #' @param link_kappa Link of auxiliary parameter \code{kappa} if being predicted. #' @param link_beta Link of auxiliary parameter \code{beta} if being predicted. #' @param link_zi Link of auxiliary parameter \code{zi} if being predicted. #' @param link_hu Link of auxiliary parameter \code{hu} if being predicted. #' @param link_zoi Link of auxiliary parameter \code{zoi} if being predicted. #' @param link_coi Link of auxiliary parameter \code{coi} if being predicted. #' @param link_disc Link of auxiliary parameter \code{disc} if being predicted. #' @param link_bs Link of auxiliary parameter \code{bs} if being predicted. #' @param link_ndt Link of auxiliary parameter \code{ndt} if being predicted. #' @param link_bias Link of auxiliary parameter \code{bias} if being predicted. #' @param link_alpha Link of auxiliary parameter \code{alpha} if being predicted. #' @param link_quantile Link of auxiliary parameter \code{quantile} if being predicted. #' @param link_xi Link of auxiliary parameter \code{xi} if being predicted. #' @param threshold A character string indicating the type #' of thresholds (i.e. intercepts) used in an ordinal model. #' \code{"flexible"} provides the standard unstructured thresholds and #' \code{"equidistant"} restricts the distance between #' consecutive thresholds to the same value. #' @param refcat Optional name of the reference response category used in #' categorical, multinomial, and dirichlet models. If \code{NULL} (the #' default), the first category is used as the reference. If \code{NA}, all #' categories will be predicted, which requires strong priors or carefully #' specified predictor terms in order to lead to an identified model. #' @param bhaz Currently for experimental purposes only. #' #' @details #' Below, we list common use cases for the different families. #' This list is not ment to be exhaustive. #' \itemize{ #' \item{Family \code{gaussian} can be used for linear regression.} #' #' \item{Family \code{student} can be used for robust linear regression #' that is less influenced by outliers.} #' #' \item{Family \code{skew_normal} can handle skewed responses in linear #' regression.} #' #' \item{Families \code{poisson}, \code{negbinomial}, and \code{geometric} #' can be used for regression of unbounded count data.} #' #' \item{Families \code{bernoulli} and \code{binomial} can be used for #' binary regression (i.e., most commonly logistic regression).} #' #' \item{Families \code{categorical} and \code{multinomial} can be used for #' multi-logistic regression when there are more than two possible outcomes.} #' #' \item{Families \code{cumulative}, \code{cratio} ('continuation ratio'), #' \code{sratio} ('stopping ratio'), and \code{acat} ('adjacent category') #' leads to ordinal regression.} #' #' \item{Families \code{Gamma}, \code{weibull}, \code{exponential}, #' \code{lognormal}, \code{frechet}, and \code{inverse.gaussian} can be #' used (among others) for survival regression.} #' #' \item{Families \code{weibull}, \code{frechet}, and \code{gen_extreme_value} #' ('generalized extreme value') allow for modeling extremes.} #' #' \item{Families \code{beta} and \code{dirichlet} can be used to model #' responses representing rates or propabilities.} #' #' \item{Family \code{asym_laplace} allows for quantile regression when fixing #' the auxiliary \code{quantile} parameter to the quantile of interest.} #' #' \item{Family \code{exgaussian} ('exponentially modified Gaussian') and #' \code{shifted_lognormal} are especially suited to model reaction times.} #' #' \item{Family \code{wiener} provides an implementation of the Wiener #' diffusion model. For this family, the main formula predicts the drift #' parameter 'delta' and all other parameters are modeled as auxiliary parameters #' (see \code{\link{brmsformula}} for details).} #' #' \item{Families \code{hurdle_poisson}, \code{hurdle_negbinomial}, #' \code{hurdle_gamma}, \code{hurdle_lognormal}, \code{zero_inflated_poisson}, #' \code{zero_inflated_negbinomial}, \code{zero_inflated_binomial}, #' \code{zero_inflated_beta}, and \code{zero_one_inflated_beta} #' allow to estimate zero-inflated and hurdle models. #' These models can be very helpful when there are many zeros in the data #' (or ones in case of one-inflated models) #' that cannot be explained by the primary distribution of the response.} #' } #' #' Below, we list all possible links for each family. #' The first link mentioned for each family is the default. #' \itemize{ #' \item{Families \code{gaussian}, \code{student}, \code{skew_normal}, #' \code{exgaussian}, \code{asym_laplace}, and \code{gen_extreme_value} #' support the links (as names) \code{identity}, \code{log}, \code{inverse}, #' and \code{softplus}.} #' #' \item{Families \code{poisson}, \code{negbinomial}, \code{geometric}, #' \code{zero_inflated_poisson}, \code{zero_inflated_negbinomial}, #' \code{hurdle_poisson}, and \code{hurdle_negbinomial} support #' \code{log}, \code{identity}, \code{sqrt}, and \code{softplus}.} #' #' \item{Families \code{binomial}, \code{bernoulli}, \code{Beta}, #' \code{zero_inflated_binomial}, \code{zero_inflated_beta}, #' and \code{zero_one_inflated_beta} support \code{logit}, #' \code{probit}, \code{probit_approx}, \code{cloglog}, #' \code{cauchit}, and \code{identity}.} #' #' \item{Families \code{cumulative}, \code{cratio}, \code{sratio}, #' and \code{acat} support \code{logit}, \code{probit}, #' \code{probit_approx}, \code{cloglog}, and \code{cauchit}.} #' #' \item{Families \code{categorical}, \code{multinomial}, and \code{dirichlet} #' support \code{logit}.} #' #' \item{Families \code{Gamma}, \code{weibull}, \code{exponential}, #' \code{frechet}, and \code{hurdle_gamma} support #' \code{log}, \code{identity}, \code{inverse}, and \code{softplus}.} #' #' \item{Families \code{lognormal} and \code{hurdle_lognormal} #' support \code{identity} and \code{inverse}.} #' #' \item{Family \code{inverse.gaussian} supports \code{1/mu^2}, #' \code{inverse}, \code{identity}, \code{log}, and \code{softplus}.} #' #' \item{Family \code{von_mises} supports \code{tan_half} and #' \code{identity}.} #' #' \item{Family \code{wiener} supports \code{identity}, \code{log}, #' and \code{softplus} for the main parameter which represents the #' drift rate.} #' } #' #' Please note that when calling the \code{\link[stats:family]{Gamma}} family #' function of the \pkg{stats} package, the default link will be #' \code{inverse} instead of \code{log} although the latter is the default in #' \pkg{brms}. Also, when using the family functions \code{gaussian}, #' \code{binomial}, \code{poisson}, and \code{Gamma} of the \pkg{stats} #' package (see \code{\link[stats:family]{family}}), special link functions #' such as \code{softplus} or \code{cauchit} won't work. In this case, you #' have to use \code{brmsfamily} to specify the family with corresponding link #' function. #' #' @seealso \code{\link[brms:brm]{brm}}, #' \code{\link[stats:family]{family}}, #' \code{\link{customfamily}} #' #' @examples #' # create a family object #' (fam1 <- student("log")) #' # alternatively use the brmsfamily function #' (fam2 <- brmsfamily("student", "log")) #' # both leads to the same object #' identical(fam1, fam2) #' #' @export brmsfamily <- function(family, link = NULL, link_sigma = "log", link_shape = "log", link_nu = "logm1", link_phi = "log", link_kappa = "log", link_beta = "log", link_zi = "logit", link_hu = "logit", link_zoi = "logit", link_coi = "logit", link_disc = "log", link_bs = "log", link_ndt = "log", link_bias = "logit", link_xi = "log1p", link_alpha = "identity", link_quantile = "logit", threshold = c("flexible", "equidistant"), refcat = NULL, bhaz = NULL) { slink <- substitute(link) .brmsfamily( family, link = link, slink = slink, link_sigma = link_sigma, link_shape = link_shape, link_nu = link_nu, link_phi = link_phi, link_kappa = link_kappa, link_beta = link_beta, link_zi = link_zi, link_hu = link_hu, link_zoi = link_zoi, link_coi = link_coi, link_disc = link_disc, link_bs = link_bs, link_ndt = link_ndt, link_bias = link_bias, link_alpha = link_alpha, link_xi = link_xi, link_quantile = link_quantile, threshold = threshold, refcat = refcat, bhaz = bhaz ) } # helper function to prepare brmsfamily objects # @param family character string naming the model family # @param link character string naming the link function # @param slink can be used with substitute(link) for # non-standard evaluation of the link function # @param threshold threshold type for ordinal models # @param ... link functions (as character strings) of parameters # @return an object of 'brmsfamily' which inherits from 'family' .brmsfamily <- function(family, link = NULL, slink = link, threshold = c("flexible", "equidistant"), refcat = NULL, bhaz = NULL, ...) { family <- tolower(as_one_character(family)) aux_links <- list(...) pattern <- c("^normal$", "^zi_", "^hu_") replacement <- c("gaussian", "zero_inflated_", "hurdle_") family <- rename(family, pattern, replacement, fixed = FALSE) ok_families <- lsp("brms", pattern = "^\\.family_") ok_families <- sub("^\\.family_", "", ok_families) if (!family %in% ok_families) { stop2(family, " is not a supported family. Supported ", "families are:\n", collapse_comma(ok_families)) } family_info <- get(paste0(".family_", family))() ok_links <- family_info$links family_info$links <- NULL # non-standard evaluation of link if (!is.character(slink)) { slink <- deparse(slink) } if (!slink %in% ok_links) { if (is.character(link)) { slink <- link } else if (!length(link) || identical(link, NA)) { slink <- NA } } if (length(slink) != 1L) { stop2("Argument 'link' must be of length 1.") } if (is.na(slink)) { slink <- ok_links[1] } if (!slink %in% ok_links) { stop2("'", slink, "' is not a supported link ", "for family '", family, "'.\nSupported links are: ", collapse_comma(ok_links)) } out <- list( family = family, link = slink, linkfun = function(mu) link(mu, link = slink), linkinv = function(eta) ilink(eta, link = slink) ) out[names(family_info)] <- family_info class(out) <- c("brmsfamily", "family") for (dp in valid_dpars(out)) { alink <- as.character(aux_links[[paste0("link_", dp)]]) if (length(alink)) { alink <- as_one_character(alink) valid_links <- links_dpars(dp) if (!alink %in% valid_links) { stop2( "'", alink, "' is not a supported link ", "for parameter '", dp, "'.\nSupported links are: ", collapse_comma(valid_links) ) } out[[paste0("link_", dp)]] <- alink } } if (is_ordinal(out$family)) { out$threshold <- match.arg(threshold) } if (conv_cats_dpars(out$family)) { if (!is.null(refcat)) { out$refcat <- as_one_character(refcat, allow_na = TRUE) } } if (is_cox(out$family)) { if (!is.null(bhaz)) { if (!is.list(bhaz)) { stop2("'bhaz' should be a list.") } out$bhaz <- bhaz } else { out$bhaz <- list() } # set default arguments if (is.null(out$bhaz$df)) { out$bhaz$df <- 4L } if (is.null(out$bhaz$intercept)) { out$bhaz$intercept <- FALSE } } out } # checks and corrects validity of the model family # @param family Either a function, an object of class 'family' # or a character string of length one or two # @param link an optional character string naming the link function # ignored if family is a function or a family object # @param threshold optional character string specifying the threshold # type in ordinal models check_family <- function(family, link = NULL, threshold = NULL) { if (is.function(family)) { family <- family() } if (!is(family, "brmsfamily")) { if (is.family(family)) { link <- family$link family <- family$family } if (is.character(family)) { if (is.null(link)) { link <- family[2] } family <- .brmsfamily(family[1], link = link) } else { stop2("Argument 'family' is invalid.") } } if (is_ordinal(family) && !is.null(threshold)) { # slot 'threshold' deprecated as of brms > 1.7.0 threshold <- match.arg(threshold, c("flexible", "equidistant")) family$threshold <- threshold } family } # extract special information of families # @param x object from which to extract # @param y name of the component to extract family_info <- function(x, y, ...) { UseMethod("family_info") } #' @export family_info.default <- function(x, y, ...) { x <- as.character(x) ulapply(x, .family_info, y = y, ...) } .family_info <- function(x, y, ...) { x <- as_one_character(x) y <- as_one_character(y) if (y == "family") { return(x) } if (!nzchar(x)) { return(NULL) } info <- get(paste0(".family_", x))() if (y == "link") { out <- info$links[1] # default link } else { info$links <- NULL out <- info[[y]] } out } family_info.NULL <- function(x, y, ...) { NULL } #' @export family_info.list <- function(x, y, ...) { ulapply(x, family_info, y = y, ...) } #' @export family_info.family <- function(x, y, ...) { family_info(x$family, y = y, ...) } #' @export family_info.brmsfamily <- function(x, y, ...) { y <- as_one_character(y) out <- x[[y]] if (is.null(out)) { # required for models fitted with brms 2.2 or earlier out <- family_info(x$family, y = y, ...) } out } #' @export family_info.mixfamily <- function(x, y, ...) { out <- lapply(x$mix, family_info, y = y, ...) combine_family_info(out, y = y) } #' @export family_info.brmsformula <- function(x, y, ...) { family_info(x$family, y = y, ...) } #' @export family_info.mvbrmsformula <- function(x, y, ...) { out <- lapply(x$forms, family_info, y = y, ...) combine_family_info(out, y = y) } #' @export family_info.brmsterms <- function(x, y, ...) { family_info(x$family, y = y, ...) } #' @export family_info.mvbrmsterms <- function(x, y, ...) { out <- lapply(x$terms, family_info, y = y, ...) combine_family_info(out, y = y) } #' @export family_info.btl <- function(x, y, ...) { family_info(x$family, y = y, ...) } #' @export family_info.btnl <- function(x, y, ...) { family_info(x$family, y = y, ...) } #' @export family_info.brmsfit <- function(x, y, ...) { family_info(x$formula, y = y, ...) } # combine information from multiple families # provides special handling for certain elements combine_family_info <- function(x, y, ...) { y <- as_one_character(y) unite <- c("dpars", "type", "specials", "include", "const", "cats", "ad") if (y %in% c("family", "link")) { x <- unlist(x) } else if (y %in% unite) { x <- Reduce("union", x) } else if (y == "ybounds") { x <- do_call(rbind, x) x <- c(max(x[, 1]), min(x[, 2])) } else if (y == "closed") { # closed only if no bounds are open x <- do_call(rbind, x) clb <- !any(ulapply(x[, 1], isFALSE)) cub <- !any(ulapply(x[, 2], isFALSE)) x <- c(clb, cub) } else if (y == "thres") { # thresholds are the same across mixture components x <- x[[1]] } x } #' @rdname brmsfamily #' @export student <- function(link = "identity", link_sigma = "log", link_nu = "logm1") { slink <- substitute(link) .brmsfamily("student", link = link, slink = slink, link_sigma = link_sigma, link_nu = link_nu) } #' @rdname brmsfamily #' @export bernoulli <- function(link = "logit") { slink <- substitute(link) .brmsfamily("bernoulli", link = link, slink = slink) } #' @rdname brmsfamily #' @export negbinomial <- function(link = "log", link_shape = "log") { slink <- substitute(link) .brmsfamily("negbinomial", link = link, slink = slink, link_shape = link_shape) } #' @rdname brmsfamily #' @export geometric <- function(link = "log") { slink <- substitute(link) .brmsfamily("geometric", link = link, slink = slink) } # do not export yet! # @rdname brmsfamily # @export discrete_weibull <- function(link = "logit", link_shape = "log") { slink <- substitute(link) .brmsfamily("discrete_weibull", link = link, slink = slink, link_shape = link_shape) } # do not export yet! # @rdname brmsfamily # @export com_poisson <- function(link = "log", link_shape = "log") { slink <- substitute(link) .brmsfamily("com_poisson", link = link, slink = slink, link_shape = link_shape) } #' @rdname brmsfamily #' @export lognormal <- function(link = "identity", link_sigma = "log") { slink <- substitute(link) .brmsfamily("lognormal", link = link, slink = slink, link_sigma = link_sigma) } #' @rdname brmsfamily #' @export shifted_lognormal <- function(link = "identity", link_sigma = "log", link_ndt = "log") { slink <- substitute(link) .brmsfamily("shifted_lognormal", link = link, slink = slink, link_sigma = link_sigma, link_ndt = link_ndt) } #' @rdname brmsfamily #' @export skew_normal <- function(link = "identity", link_sigma = "log", link_alpha = "identity") { slink <- substitute(link) .brmsfamily("skew_normal", link = link, slink = slink, link_sigma = link_sigma, link_alpha = link_alpha) } #' @rdname brmsfamily #' @export exponential <- function(link = "log") { slink <- substitute(link) .brmsfamily("exponential", link = link, slink = slink) } #' @rdname brmsfamily #' @export weibull <- function(link = "log", link_shape = "log") { slink <- substitute(link) .brmsfamily("weibull", link = link, slink = slink, link_shape = link_shape) } #' @rdname brmsfamily #' @export frechet <- function(link = "log", link_nu = "logm1") { slink <- substitute(link) .brmsfamily("frechet", link = link, slink = slink, link_nu = link_nu) } #' @rdname brmsfamily #' @export gen_extreme_value <- function(link = "identity", link_sigma = "log", link_xi = "log1p") { slink <- substitute(link) .brmsfamily("gen_extreme_value", link = link, slink = slink, link_sigma = link_sigma, link_xi = link_xi) } #' @rdname brmsfamily #' @export exgaussian <- function(link = "identity", link_sigma = "log", link_beta = "log") { slink <- substitute(link) .brmsfamily("exgaussian", link = link, slink = slink, link_sigma = link_sigma, link_beta = link_beta) } #' @rdname brmsfamily #' @export wiener <- function(link = "identity", link_bs = "log", link_ndt = "log", link_bias = "logit") { slink <- substitute(link) .brmsfamily("wiener", link = link, slink = slink, link_bs = link_bs, link_ndt = link_ndt, link_bias = link_bias) } #' @rdname brmsfamily #' @export Beta <- function(link = "logit", link_phi = "log") { slink <- substitute(link) .brmsfamily("beta", link = link, slink = slink, link_phi = link_phi) } #' @rdname brmsfamily #' @export dirichlet <- function(link = "logit", link_phi = "log", refcat = NULL) { slink <- substitute(link) .brmsfamily("dirichlet", link = link, slink = slink, link_phi = link_phi, refcat = refcat) } #' @rdname brmsfamily #' @export von_mises <- function(link = "tan_half", link_kappa = "log") { slink <- substitute(link) .brmsfamily("von_mises", link = link, slink = slink, link_kappa = link_kappa) } #' @rdname brmsfamily #' @export asym_laplace <- function(link = "identity", link_sigma = "log", link_quantile = "logit") { slink <- substitute(link) .brmsfamily("asym_laplace", link = link, slink = slink, link_sigma = link_sigma, link_quantile = link_quantile) } # do not export yet! # @rdname brmsfamily # @export zero_inflated_asym_laplace <- function(link = "identity", link_sigma = "log", link_quantile = "logit", link_zi = "logit") { slink <- substitute(link) .brmsfamily("zero_inflated_asym_laplace", link = link, slink = slink, link_sigma = link_sigma, link_quantile = link_quantile, link_zi = link_zi) } # do not export yet! # @rdname brmsfamily # @export cox <- function(link = "log", bhaz = NULL) { slink <- substitute(link) .brmsfamily("cox", link = link, bhaz = bhaz) } #' @rdname brmsfamily #' @export hurdle_poisson <- function(link = "log") { slink <- substitute(link) .brmsfamily("hurdle_poisson", link = link, slink = slink) } #' @rdname brmsfamily #' @export hurdle_negbinomial <- function(link = "log", link_shape = "log", link_hu = "logit") { slink <- substitute(link) .brmsfamily("hurdle_negbinomial", link = link, slink = slink, link_shape = link_shape, link_hu = link_hu) } #' @rdname brmsfamily #' @export hurdle_gamma <- function(link = "log", link_shape = "log", link_hu = "logit") { slink <- substitute(link) .brmsfamily("hurdle_gamma", link = link, slink = slink, link_shape = link_shape, link_hu = link_hu) } #' @rdname brmsfamily #' @export hurdle_lognormal <- function(link = "identity", link_sigma = "log", link_hu = "logit") { slink <- substitute(link) .brmsfamily("hurdle_lognormal", link = link, slink = slink, link_sigma = link_sigma, link_hu = link_hu) } #' @rdname brmsfamily #' @export zero_inflated_beta <- function(link = "logit", link_phi = "log", link_zi = "logit") { slink <- substitute(link) .brmsfamily("zero_inflated_beta", link = link, slink = slink, link_phi = link_phi, link_zi = link_zi) } #' @rdname brmsfamily #' @export zero_one_inflated_beta <- function(link = "logit", link_phi = "log", link_zoi = "logit", link_coi = "logit") { slink <- substitute(link) .brmsfamily("zero_one_inflated_beta", link = link, slink = slink, link_phi = link_phi, link_zoi = link_zoi, link_coi = link_coi) } #' @rdname brmsfamily #' @export zero_inflated_poisson <- function(link = "log", link_zi = "logit") { slink <- substitute(link) .brmsfamily("zero_inflated_poisson", link = link, slink = slink, link_zi = link_zi) } #' @rdname brmsfamily #' @export zero_inflated_negbinomial <- function(link = "log", link_shape = "log", link_zi = "logit") { slink <- substitute(link) .brmsfamily("zero_inflated_negbinomial", link = link, slink = slink, link_shape = link_shape, link_zi = link_zi) } #' @rdname brmsfamily #' @export zero_inflated_binomial <- function(link = "logit", link_zi = "logit") { slink <- substitute(link) .brmsfamily("zero_inflated_binomial", link = link, slink = slink, link_zi = link_zi) } #' @rdname brmsfamily #' @export categorical <- function(link = "logit", refcat = NULL) { slink <- substitute(link) .brmsfamily("categorical", link = link, slink = slink, refcat = refcat) } #' @rdname brmsfamily #' @export multinomial <- function(link = "logit", refcat = NULL) { slink <- substitute(link) .brmsfamily("multinomial", link = link, slink = slink, refcat = refcat) } #' @rdname brmsfamily #' @export cumulative <- function(link = "logit", link_disc = "log", threshold = c("flexible", "equidistant")) { slink <- substitute(link) .brmsfamily("cumulative", link = link, slink = slink, link_disc = link_disc, threshold = threshold) } #' @rdname brmsfamily #' @export sratio <- function(link = "logit", link_disc = "log", threshold = c("flexible", "equidistant")) { slink <- substitute(link) .brmsfamily("sratio", link = link, slink = slink, link_disc = link_disc, threshold = threshold) } #' @rdname brmsfamily #' @export cratio <- function(link = "logit", link_disc = "log", threshold = c("flexible", "equidistant")) { slink <- substitute(link) .brmsfamily("cratio", link = link, slink = slink, link_disc = link_disc, threshold = threshold) } #' @rdname brmsfamily #' @export acat <- function(link = "logit", link_disc = "log", threshold = c("flexible", "equidistant")) { slink <- substitute(link) .brmsfamily("acat", link = link, slink = slink, link_disc = link_disc, threshold = threshold) } #' Finite Mixture Families in \pkg{brms} #' #' Set up a finite mixture family for use in \pkg{brms}. #' #' @param ... One or more objects providing a description of the #' response distributions to be combined in the mixture model. #' These can be family functions, calls to family functions or #' character strings naming the families. For details of supported #' families see \code{\link{brmsfamily}}. #' @param flist Optional list of objects, which are treated in the #' same way as objects passed via the \code{...} argument. #' @param nmix Optional numeric vector specifying the number of times #' each family is repeated. If specified, it must have the same length #' as the number of families passed via \code{...} and \code{flist}. #' @param order Ordering constraint to identify mixture components. #' If \code{'mu'} or \code{TRUE}, population-level intercepts #' of the mean parameters are ordered in non-ordinal models #' and fixed to the same value in ordinal models (see details). #' If \code{'none'} or \code{FALSE}, no ordering constraint is applied. #' If \code{NULL} (the default), \code{order} is set to \code{'mu'} #' if all families are the same and \code{'none'} otherwise. #' Other ordering constraints may be implemented in the future. #' #' @return An object of class \code{mixfamily}. #' #' @details #' #' Most families supported by \pkg{brms} can be used to form mixtures. The #' response variable has to be valid for all components of the mixture family. #' Currently, the number of mixture components has to be specified by the user. #' It is not yet possible to estimate the number of mixture components from the #' data. #' #' Ordering intercepts in mixtures of ordinal families is not possible as each #' family has itself a set of vector of intercepts (i.e. ordinal thresholds). #' Instead, \pkg{brms} will fix the vector of intercepts across components in #' ordinal mixtures, if desired, so that users can try to identify the mixture #' model via selective inclusion of predictors. #' #' For most mixture models, you may want to specify priors on the #' population-level intercepts via \code{\link{set_prior}} to improve #' convergence. In addition, it is sometimes necessary to set \code{inits = 0} #' in the call to \code{\link{brm}} to allow chains to initialize properly. #' #' For more details on the specification of mixture #' models, see \code{\link{brmsformula}}. #' #' @examples #' \dontrun{ #' ## simulate some data #' set.seed(1234) #' dat <- data.frame( #' y = c(rnorm(200), rnorm(100, 6)), #' x = rnorm(300), #' z = sample(0:1, 300, TRUE) #' ) #' #' ## fit a simple normal mixture model #' mix <- mixture(gaussian, gaussian) #' prior <- c( #' prior(normal(0, 7), Intercept, dpar = mu1), #' prior(normal(5, 7), Intercept, dpar = mu2) #' ) #' fit1 <- brm(bf(y ~ x + z), dat, family = mix, #' prior = prior, chains = 2) #' summary(fit1) #' pp_check(fit1) #' #' ## use different predictors for the components #' fit2 <- brm(bf(y ~ 1, mu1 ~ x, mu2 ~ z), dat, family = mix, #' prior = prior, chains = 2) #' summary(fit2) #' #' ## fix the mixing proportions #' fit3 <- brm(bf(y ~ x + z, theta1 = 1, theta2 = 2), #' dat, family = mix, prior = prior, #' inits = 0, chains = 2) #' summary(fit3) #' pp_check(fit3) #' #' ## predict the mixing proportions #' fit4 <- brm(bf(y ~ x + z, theta2 ~ x), #' dat, family = mix, prior = prior, #' inits = 0, chains = 2) #' summary(fit4) #' pp_check(fit4) #' #' ## compare model fit #' LOO(fit1, fit2, fit3, fit4) #' } #' #' @export mixture <- function(..., flist = NULL, nmix = 1, order = NULL) { dots <- c(list(...), flist) if (length(nmix) == 1L) { nmix <- rep(nmix, length(dots)) } if (length(dots) != length(nmix)) { stop2("The length of 'nmix' should be the same ", "as the number of mixture components.") } dots <- dots[rep(seq_along(dots), nmix)] family <- list( family = "mixture", link = "identity", mix = lapply(dots, check_family) ) class(family) <- c("mixfamily", "brmsfamily", "family") # validity checks if (length(family$mix) < 2L) { stop2("Expecting at least 2 mixture components.") } if (use_real(family) && use_int(family)) { stop2("Cannot mix families with real and integer support.") } is_ordinal <- ulapply(family$mix, is_ordinal) if (any(is_ordinal) && any(!is_ordinal)) { stop2("Cannot mix ordinal and non-ordinal families.") } no_mixture <- ulapply(family$mix, no_mixture) if (any(no_mixture)) { stop2("Some of the families are not allowed in mixture models.") } for (fam in family$mix) { if (is.customfamily(fam) && "theta" %in% fam$dpars) { stop2("Parameter name 'theta' is reserved in mixture models.") } } if (is.null(order)) { if (any(is_ordinal)) { family$order <- "none" message("Setting order = 'none' for mixtures of ordinal families.") } else if (length(unique(family_names(family))) == 1L) { family$order <- "mu" message("Setting order = 'mu' for mixtures of the same family.") } else { family$order <- "none" message("Setting order = 'none' for mixtures of different families.") } } else { if (length(order) != 1L) { stop2("Argument 'order' must be of length 1.") } if (is.character(order)) { valid_order <- c("none", "mu") if (!order %in% valid_order) { stop2("Argument 'order' is invalid. Valid options are: ", collapse_comma(valid_order)) } family$order <- order } else { family$order <- ifelse(as.logical(order), "mu", "none") } } family } #' Custom Families in \pkg{brms} Models #' #' Define custom families (i.e. response distribution) for use in #' \pkg{brms} models. It allows users to benefit from the modeling #' flexibility of \pkg{brms}, while applying their self-defined likelihood #' functions. All of the post-processing methods for \code{brmsfit} #' objects can be made compatible with custom families. #' See \code{vignette("brms_customfamilies")} for more details. #' For a list of built-in families see \code{\link{brmsfamily}}. #' #' @aliases customfamily #' #' @param name Name of the custom family. #' @param dpars Names of the distributional parameters of #' the family. One parameter must be named \code{"mu"} and #' the main formula of the model will correspond to that #' parameter. #' @param links Names of the link functions of the #' distributional parameters. #' @param type Indicates if the response distribution is #' continuous (\code{"real"}) or discrete (\code{"int"}). #' @param lb Vector of lower bounds of the distributional #' parameters. Defaults to \code{NA} that is no lower bound. #' @param ub Vector of upper bounds of the distributional #' parameters. Defaults to \code{NA} that is no upper bound. #' @param vars Names of variables, which are part of the likelihood #' function without being distributional parameters. That is, #' \code{vars} can be used to pass data to the likelihood. #' See \code{\link{stanvar}} for details about adding self-defined #' data to the generated \pkg{Stan} model. #' @param specials A character vector of special options to enable #' for this custom family. Currently for internal use only. #' @param threshold Optional threshold type for custom ordinal families. #' Ignored for non-ordinal families. #' @param log_lik Optional function to compute log-likelihood values of #' the model in \R. This is only relevant if one wants to ensure #' compatibility with method \code{\link[brms:log_lik.brmsfit]{log_lik}}. #' @param predict Optional function to compute predicted values of #' the model in \R. This is only relevant if one wants to ensure #' compatibility with method \code{\link[brms:predict.brmsfit]{predict}}. #' @param fitted Optional function to compute fitted values of #' the model in \R. This is only relevant if one wants to ensure #' compatibility with method \code{\link[brms:fitted.brmsfit]{fitted}}. #' @param env An \code{\link{environment}} in which certain post-processing #' functions related to the custom family can be found, if there were not #' directly passed to \code{custom_family}. This is only #' relevant if one wants to ensure compatibility with the methods #' \code{\link[brms:predict.brmsfit]{predict}}, #' \code{\link[brms:fitted.brmsfit]{fitted}}, or #' \code{\link[brms:log_lik.brmsfit]{log_lik}}. #' By default, \code{env} is the enviroment from which #' \code{custom_family} is called. #' #' @details The corresponding probability density or mass \code{Stan} #' functions need to have the same name as the custom family. #' That is if a family is called \code{myfamily}, then the #' \pkg{Stan} functions should be called \code{myfamily_lpdf} or #' \code{myfamily_lpmf} depending on whether it defines a #' continuous or discrete distribution. #' #' @return An object of class \code{customfamily} inheriting #' from class \code{\link{brmsfamily}}. #' #' @seealso \code{\link{brmsfamily}}, \code{\link{stanvar}} #' #' @examples #' \dontrun{ #' ## demonstrate how to fit a beta-binomial model #' ## generate some fake data #' phi <- 0.7 #' n <- 300 #' z <- rnorm(n, sd = 0.2) #' ntrials <- sample(1:10, n, replace = TRUE) #' eta <- 1 + z #' mu <- exp(eta) / (1 + exp(eta)) #' a <- mu * phi #' b <- (1 - mu) * phi #' p <- rbeta(n, a, b) #' y <- rbinom(n, ntrials, p) #' dat <- data.frame(y, z, ntrials) #' #' # define a custom family #' beta_binomial2 <- custom_family( #' "beta_binomial2", dpars = c("mu", "phi"), #' links = c("logit", "log"), lb = c(NA, 0), #' type = "int", vars = "trials[n]" #' ) #' #' # define the corresponding Stan density function #' stan_funs <- " #' real beta_binomial2_lpmf(int y, real mu, real phi, int N) { #' return beta_binomial_lpmf(y | N, mu * phi, (1 - mu) * phi); #' } #' " #' #' # fit the model #' fit <- brm(y | trials(ntrials) ~ z, data = dat, #' family = beta_binomial2, stan_funs = stan_funs) #' summary(fit) #' } #' #' @export custom_family <- function(name, dpars = "mu", links = "identity", type = c("real", "int"), lb = NA, ub = NA, vars = NULL, specials = NULL, threshold = c("flexible", "equidistant"), log_lik = NULL, predict = NULL, fitted = NULL, env = parent.frame()) { name <- as_one_character(name) dpars <- as.character(dpars) links <- as.character(links) type <- match.arg(type) lb <- as.character(lb) ub <- as.character(ub) vars <- as.character(vars) specials <- as.character(specials) env <- as.environment(env) if (any(duplicated(dpars))) { stop2("Duplicated 'dpars' are not allowed.") } if (!"mu" %in% dpars) { stop2("All families must have a 'mu' parameter.") } if (any(grepl("_|\\.", dpars))) { stop2("Dots or underscores are not allowed in 'dpars'.") } if (any(grepl("[[:digit:]]+$", dpars))) { stop2("'dpars' should not end with a number.") } for (arg in c("links", "lb", "ub")) { obj <- get(arg) if (length(obj) == 1L) { obj <- rep(obj, length(dpars)) assign(arg, obj) } if (length(dpars) != length(obj)) { stop2("'", arg, "' must be of the same length as 'dpars'.") } } if (!is.null(log_lik)) { log_lik <- as.function(log_lik) args <- names(formals(log_lik)) if (!is_equal(args[1:2], c("i", "draws"))) { stop2("The first two arguments of 'log_lik' ", "should be 'i' and 'draws'.") } } if (!is.null(predict)) { predict <- as.function(predict) args <- names(formals(predict)) if (!is_equal(args[1:3], c("i", "draws", "..."))) { stop2("The first three arguments of 'predict' ", "should be 'i', 'draws', and '...'.") } } if (!is.null(fitted)) { fitted <- as.function(fitted) args <- names(formals(fitted)) if (!is_equal(args[1], "draws")) { stop2("The first argument of 'fitted' should be 'draws'.") } } lb <- named_list(dpars, lb) ub <- named_list(dpars, ub) is_mu <- "mu" == dpars link <- links[is_mu] out <- nlist( family = "custom", link, name, dpars, lb, ub, type, vars, specials, log_lik, predict, fitted, env ) if (length(dpars) > 1L) { out[paste0("link_", dpars[!is_mu])] <- links[!is_mu] } class(out) <- c("customfamily", "brmsfamily", "family") if (is_ordinal(out)) { threshold <- match.arg(threshold) out$threshold <- threshold } out } # get valid distributional parameters for a family valid_dpars <- function(family, ...) { UseMethod("valid_dpars") } #' @export valid_dpars.default <- function(family, ...) { if (!length(family)) { return("mu") } family <- check_family(family) family_info(family, "dpars", ...) } #' @export valid_dpars.mixfamily <- function(family, ...) { out <- lapply(family$mix, valid_dpars, ...) for (i in seq_along(out)) { out[[i]] <- paste0(out[[i]], i) } c(unlist(out), paste0("theta", seq_along(out))) } #' @export valid_dpars.brmsformula <- function(family, ...) { valid_dpars(family$family, ...) } #' @export valid_dpars.mvbrmsformula <- function(family, ...) { ulapply(family$forms, valid_dpars, ...) } #' @export valid_dpars.brmsterms <- function(family, ...) { valid_dpars(family$family, ...) } #' @export valid_dpars.mvbrmsterms <- function(family, ...) { ulapply(family$terms, valid_dpars, ...) } #' @export valid_dpars.brmsfit <- function(family, ...) { valid_dpars(family$formula, ...) } # class of a distributional parameter dpar_class <- function(dpar, family = NULL) { out <- sub("[[:digit:]]*$", "", dpar) if (!is.null(family)) { # TODO: avoid this special case by changing naming conventions if (conv_cats_dpars(family) && grepl("^mu", out)) { # categorical-like models have non-integer suffixes # that will not be caught by the standard procedure out <- "mu" } } out } # id of a distributional parameter dpar_id <- function(dpar) { out <- get_matches("[[:digit:]]+$", dpar, simplify = FALSE) ulapply(out, function(x) ifelse(length(x), x, "")) } # link functions for distributional parameters links_dpars <- function(dpar) { if (!length(dpar)) dpar <- "" switch(dpar, character(0), mu = "identity", # not actually used sigma = c("log", "identity", "softplus"), shape = c("log", "identity", "softplus"), nu = c("logm1", "identity"), phi = c("log", "identity", "softplus"), kappa = c("log", "identity", "softplus"), beta = c("log", "identity", "softplus"), zi = c("logit", "identity"), hu = c("logit", "identity"), zoi = c("logit", "identity"), coi = c("logit", "identity"), disc = c("log", "identity", "softplus"), bs = c("log", "identity", "softplus"), ndt = c("log", "identity", "softplus"), bias = c("logit", "identity"), quantile = c("logit", "identity"), xi = c("log1p", "identity"), alpha = c("identity", "log", "softplus"), theta = c("identity") ) } # generate a family object of a distributional parameter dpar_family <- function(family, dpar, ...) { UseMethod("dpar_family") } #' @export dpar_family.default <- function(family, dpar, ...) { dp_class <- dpar_class(dpar) if (dp_class != "mu" || conv_cats_dpars(family)) { link <- family[[paste0("link_", dp_class)]] family <- .dpar_family(dpar, link) } family } #' @export dpar_family.mixfamily <- function(family, dpar, ...) { dp_id <- as.numeric(dpar_id(dpar)) if (!(length(dp_id) == 1L && is.numeric(dp_id))) { stop2("Parameter '", dpar, "' is not a valid mixture parameter.") } out <- dpar_family(family$mix[[dp_id]], dpar, ...) out$order <- family$order out } # set up special family objects for distributional parameters # @param dpar name of the distributional parameter # @param link optional link function of the parameter .dpar_family <- function(dpar = NULL, link = NULL) { links <- links_dpars(dpar_class(dpar)) if (!length(link)) { if (!length(links)) { link <- "identity" } else { link <- links[1] } } link <- as_one_character(link) structure( nlist(family = "", link, dpar), class = c("brmsfamily", "family") ) } #' @export print.brmsfamily <- function(x, links = FALSE, newline = TRUE, ...) { cat("\nFamily:", x$family, "\n") cat("Link function:", x$link, "\n") if (!is.null(x$threshold)) { cat("Threshold:", x$threshold, "\n") } if (isTRUE(links) || is.character(links)) { dp_links <- x[grepl("^link_", names(x))] names(dp_links) <- sub("^link_", "", names(dp_links)) if (is.character(links)) { dp_links <- rmNULL(dp_links[links]) } for (dp in names(dp_links)) { cat(paste0( "Link function of '", dp, "' (if predicted): ", dp_links[[dp]], "\n" )) } } if (newline) { cat("\n") } invisible(x) } #' @export print.mixfamily <- function(x, newline = TRUE, ...) { cat("\nMixture\n") for (i in seq_along(x$mix)) { print(x$mix[[i]], newline = FALSE, ...) } if (newline) { cat("\n") } invisible(x) } #' @export print.customfamily <- function(x, links = FALSE, newline = TRUE, ...) { cat("\nCustom family:", x$name, "\n") cat("Link function:", x$link, "\n") cat("Parameters:", paste0(x$dpars, collapse = ", "), "\n") if (isTRUE(links) || is.character(links)) { dp_links <- x[grepl("^link_", names(x))] names(dp_links) <- sub("^link_", "", names(dp_links)) if (is.character(links)) { dp_links <- rmNULL(dp_links[links]) } for (dp in names(dp_links)) { cat(paste0( "Link function of '", dp, "' (if predicted): ", dp_links[[dp]], "\n" )) } } if (newline) { cat("\n") } invisible(x) } #' @method summary family #' @export summary.family <- function(object, link = TRUE, ...) { out <- object$family if (link) { out <- paste0(out, "(", object$link, ")") } out } #' @method summary mixfamily #' @export summary.mixfamily <- function(object, link = FALSE, ...) { families <- ulapply(object$mix, summary, link = link, ...) paste0("mixture(", paste0(families, collapse = ", "), ")") } #' @method summary customfamily #' @export summary.customfamily <- function(object, link = TRUE, ...) { object$family <- object$name summary.family(object, link = link, ...) } summarise_families <- function(x) { # summary of families used in summary.brmsfit UseMethod("summarise_families") } #' @export summarise_families.mvbrmsformula <- function(x, ...) { out <- ulapply(x$forms, summarise_families, ...) paste0("MV(", paste0(out, collapse = ", "), ")") } #' @export summarise_families.brmsformula <- function(x, ...) { summary(x$family, link = FALSE, ...) } summarise_links <- function(x, ...) { # summary of link functions used in summary.brmsfit UseMethod("summarise_links") } #' @export summarise_links.mvbrmsformula <- function(x, wsp = 0, ...) { str_wsp <- collapse(rep(" ", wsp)) links <- ulapply(x$forms, summarise_links, mv = TRUE, ...) paste0(links, collapse = paste0("\n", str_wsp)) } #' @export summarise_links.brmsformula <- function(x, mv = FALSE, ...) { x <- parse_bf(x) dpars <- valid_dpars(x) links <- setNames(rep("identity", length(dpars)), dpars) links_pred <- ulapply(x$dpars, function(x) x$family$link) links[names(links_pred)] <- links_pred if (conv_cats_dpars(x)) { links[grepl("^mu", names(links))] <- x$family$link } resp <- if (mv) usc(combine_prefix(x)) names(links) <- paste0(names(links), resp) paste0(names(links), " = ", links, collapse = "; ") } is.family <- function(x) { inherits(x, "family") } is.brmsfamily <- function(x) { inherits(x, "brmsfamily") } is.mixfamily <- function(x) { inherits(x, "mixfamily") } is.customfamily <- function(x) { inherits(x, "customfamily") } family_names <- function(x) { family_info(x, "family") } # indicate if family uses real responses use_real <- function(family) { "real" %in% family_info(family, "type") } # indicate if family uses integer responses use_int <- function(family) { "int" %in% family_info(family, "type") } is_binary <- function(family) { "binary" %in% family_info(family, "specials") } is_categorical <- function(family) { "categorical" %in% family_info(family, "specials") } is_ordinal <- function(family) { "ordinal" %in% family_info(family, "specials") } is_multinomial <- function(family) { "multinomial" %in% family_info(family, "specials") } is_dirichlet <- function(family) { "dirichlet" %in% family_info(family, "specials") } is_polytomous <- function(family) { is_categorical(family) || is_ordinal(family) || is_multinomial(family) || is_dirichlet(family) } is_cox <- function(family) { "cox" %in% family_info(family, "specials") } allow_factors <- function(family) { specials <- c("binary", "categorical", "ordinal") any(specials %in% family_info(family, "specials")) } # check if the family has natural residuals has_natural_residuals <- function(family) { "residuals" %in% family_info(family, "specials") } # check if the family allows for residual correlations has_rescor <- function(family) { "rescor" %in% family_info(family, "specials") } # checks if category specific effects are allowed allow_cs <- function(family) { "cs" %in% family_info(family, "specials") } # choose dpar names based on categories? conv_cats_dpars <- function(family) { is_categorical(family) || is_multinomial(family) || is_dirichlet(family) } # check if mixtures of the given families are allowed no_mixture <- function(family) { is_categorical(family) || is_multinomial(family) || is_dirichlet(family) } # indicate if the response should consist of multiple columns has_multicol <- function(family) { is_multinomial(family) || is_dirichlet(family) } # indicate if the response is modeled on the log-scale # even if formally the link function is not 'log' has_logscale <- function(family) { "logscale" %in% family_info(family, "specials") } # indicate if family makes use of argument trials has_trials <- function(family) { "trials" %in% family_info(family, "ad") && !"custom" %in% family_names(family) } # indicate if family has more than two response categories has_cat <- function(family) { is_categorical(family) || is_multinomial(family) || is_dirichlet(family) } # indicate if family has thresholds has_thres <- function(family) { is_ordinal(family) } # indicate if family has equidistant thresholds has_equidistant_thres <- function(family) { isTRUE(family_info(family, "threshold") == "equidistant") } # indicate if family has ordered thresholds has_ordered_thres <- function(family) { "ordered_thres" %in% family_info(family, "specials") } # compute threshold - eta in the likelihood has_thres_minus_eta <- function(family) { "thres_minus_eta" %in% family_info(family, "specials") } # compute eta - threshold in the likelihood has_eta_minus_thres <- function(family) { "eta_minus_thres" %in% family_info(family, "specials") } # get names of response categories # @param group name of a group for which to extract categories get_cats <- function(family) { family_info(family, "cats") } # get names of ordinal thresholds for prior specification # @param group name of a group for which to extract categories get_thres <- function(family, group = "") { group <- as_one_character(group) thres <- family_info(family, "thres") subset2(thres, group = group)$thres } # get group names of ordinal thresholds get_thres_groups <- function(family) { thres <- family_info(family, "thres") unique(thres$group) } # has the model group specific thresholds? has_thres_groups <- function(family) { groups <- get_thres_groups(family) any(nzchar(groups)) } has_ndt <- function(family) { "ndt" %in% dpar_class(family_info(family, "dpars")) } has_sigma <- function(family) { "sigma" %in% dpar_class(family_info(family, "dpars")) } # check if sigma should be explicitely set to 0 no_sigma <- function(bterms) { stopifnot(is.brmsterms(bterms)) if (is.formula(bterms$adforms$se)) { se <- eval_rhs(bterms$adforms$se) se_only <- isFALSE(se$flags$sigma) if (se_only && use_ac_cov_time(bterms)) { stop2("Please set argument 'sigma' of function 'se' ", "to TRUE when modeling time-series covariance matrices.") } } else { se_only <- FALSE } se_only } # has the model a non-predicted but estimated sigma parameter? simple_sigma <- function(bterms) { stopifnot(is.brmsterms(bterms)) has_sigma(bterms) && !no_sigma(bterms) && !pred_sigma(bterms) } # has the model a predicted sigma parameter? pred_sigma <- function(bterms) { stopifnot(is.brmsterms(bterms)) "sigma" %in% dpar_class(names(bterms$dpars)) } # do not include a 'nu' parameter in a univariate model? no_nu <- function(bterms) { # the multi_student_t family only has a single 'nu' parameter isTRUE(bterms$rescor) && "student" %in% family_names(bterms) } # prepare for calling family specific post-processing functions prepare_family <- function(x) { stopifnot(is.brmsformula(x) || is.brmsterms(x)) family <- x$family acef <- tidy_acef(x) if (use_ac_cov_time(acef) && has_natural_residuals(x)) { family$fun <- paste0(family$family, "_time") } else if (has_ac_class(acef, "sar")) { acef_sar <- subset2(acef, class = "sar") if (has_ac_subset(acef_sar, type = "lag")) { family$fun <- paste0(family$family, "_lagsar") } else if (has_ac_subset(acef_sar, type = "error")) { family$fun <- paste0(family$family, "_errorsar") } } else if (has_ac_class(acef, "fcor")) { family$fun <- paste0(family$family, "_fcor") } else { family$fun <- family$family } family } # order intercepts to help identifying mixture components? # does not work in ordinal models as they have vectors of intercepts order_intercepts <- function(bterms) { dpar <- dpar_class(bterms[["dpar"]]) if (!length(dpar)) dpar <- "mu" isTRUE(!is_ordinal(bterms) && dpar %in% bterms$family[["order"]]) } # fix intercepts to help identifying mixture components? # currently enabled only in ordinal models fix_intercepts <- function(bterms) { dpar <- dpar_class(bterms[["dpar"]]) if (!length(dpar)) dpar <- "mu" isTRUE(is_ordinal(bterms) && dpar %in% bterms$family[["order"]]) } # does the mixture have a joint parameter vector 'theta' has_joint_theta <- function(bterms) { stopifnot(is.brmsterms(bterms)) is.mixfamily(bterms$family) && !"theta" %in% dpar_class(names(c(bterms$dpars, bterms$fdpars))) } # extract family boundaries family_bounds <- function(x, ...) { UseMethod("family_bounds") } # @return a named list with one element per response variable #' @export family_bounds.mvbrmsterms <- function(x, ...) { lapply(x$terms, family_bounds, ...) } # @return a list with elements 'lb' and 'ub' #' @export family_bounds.brmsterms <- function(x, ...) { family <- x$family$family if (is.null(family)) { return(list(lb = -Inf, ub = Inf)) } resp <- usc(x$resp) pos_families <- c( "poisson", "negbinomial", "geometric", "gamma", "weibull", "exponential", "lognormal", "frechet", "inverse.gaussian", "hurdle_poisson", "hurdle_negbinomial", "hurdle_gamma", "hurdle_lognormal", "zero_inflated_poisson", "zero_inflated_negbinomial" ) beta_families <- c("beta", "zero_inflated_beta", "zero_one_inflated_beta") ordinal_families <- c("cumulative", "cratio", "sratio", "acat") if (family %in% pos_families) { out <- list(lb = 0, ub = Inf) } else if (family %in% c("bernoulli", beta_families)) { out <- list(lb = 0, ub = 1) } else if (family %in% c("categorical", ordinal_families)) { out <- list(lb = 1, ub = paste0("ncat", resp)) } else if (family %in% c("binomial", "zero_inflated_binomial")) { out <- list(lb = 0, ub = paste0("trials", resp)) } else if (family %in% "von_mises") { out <- list(lb = -pi, ub = pi) } else if (family %in% c("wiener", "shifted_lognormal")) { out <- list(lb = paste("min_Y", resp), ub = Inf) } else { out <- list(lb = -Inf, ub = Inf) } out } brms/R/brmsfit-helpers.R0000644000176200001440000005175613615316722014673 0ustar liggesuserscontains_samples <- function(x) { if (!(is.brmsfit(x) && length(x$fit@sim))) { stop2("The model does not contain posterior samples.") } invisible(TRUE) } is_mv <- function(x) { stopifnot(is.brmsfit(x)) is.mvbrmsformula(x$formula) } stopifnot_resp <- function(x, resp = NULL) { if (is_mv(x) && length(resp) != 1L) { stop2("Argument 'resp' must be a single variable name ", "when applying this method to a multivariate model.") } invisible(NULL) } # apply a link function # @param x an arrary of arbitrary dimension # @param link character string defining the link link <- function(x, link) { switch(link, "identity" = x, "log" = log(x), "logm1" = logm1(x), "log1p" = log1p(x), "inverse" = 1 / x, "sqrt" = sqrt(x), "1/mu^2" = 1 / x^2, "tan_half" = tan(x / 2), "logit" = logit(x), "probit" = qnorm(x), "cauchit" = qcauchy(x), "cloglog" = cloglog(x), "probit_approx" = qnorm(x), "softplus" = log_expm1(x), stop2("Link '", link, "' not supported.") ) } # apply an inverse link function # @param x an arrary of arbitrary dimension # @param link a character string defining the link ilink <- function(x, link) { switch(link, "identity" = x, "log" = exp(x), "logm1" = expp1(x), "log1p" = expm1(x), "inverse" = 1 / x, "sqrt" = x^2, "1/mu^2" = 1 / sqrt(x), "tan_half" = 2 * atan(x), "logit" = inv_logit(x), "probit" = pnorm(x), "cauchit" = pcauchy(x), "cloglog" = inv_cloglog(x), "probit_approx" = pnorm(x), "softplus" = log1p_exp(x), stop2("Link '", link, "' not supported.") ) } # generate integers indicating subsets of the posterior samples subset_samples <- function(x, subset = NULL, nsamples = NULL) { stopifnot(is.brmsfit(x)) if (is.null(subset) && !is.null(nsamples)) { subset <- sample(nsamples(x), nsamples) } subset } # get correlation names as combinations of variable names # @param names the variable names # @param type character string to be put in front of the returned strings # @param brackets should the correlation names contain brackets # or underscores as seperators? # @param sep character string to separate names; only used if !brackets # @return a vector of character strings get_cornames <- function(names, type = "cor", brackets = TRUE, sep = "__") { cornames <- NULL if (length(names) > 1) { for (i in seq_along(names)[-1]) { for (j in seq_len(i - 1)) { if (brackets) { c(cornames) <- paste0(type, "(", names[j], "," , names[i], ")") } else { c(cornames) <- paste0(type, sep, names[j], sep, names[i]) } } } } cornames } # extract names of categorical variables in the model get_cat_vars <- function(x) { stopifnot(is.brmsfit(x)) like_factor <- sapply(model.frame(x), is_like_factor) valid_groups <- c( names(model.frame(x))[like_factor], get_group_vars(x) ) unique(valid_groups[nzchar(valid_groups)]) } # covariance matrices based on correlation and SD samples # @param sd matrix of samples of standard deviations # @param cor matrix of samples of correlations get_cov_matrix <- function(sd, cor = NULL) { sd <- as.matrix(sd) stopifnot(all(sd >= 0)) nsamples <- nrow(sd) size <- ncol(sd) out <- array(diag(1, size), dim = c(size, size, nsamples)) out <- aperm(out, perm = c(3, 1, 2)) for (i in seq_len(size)) { out[, i, i] <- sd[, i]^2 } if (length(cor)) { cor <- as.matrix(cor) stopifnot(nrow(sd) == nrow(cor)) stopifnot(min(cor) >= -1, max(cor) <= 1) stopifnot(ncol(cor) == size * (size - 1) / 2) k <- 0 for (i in seq_len(size)[-1]) { for (j in seq_len(i - 1)) { k = k + 1 out[, j, i] <- out[, i, j] <- cor[, k] * sd[, i] * sd[, j] } } } out } # correlation matrices based on correlation samples # @param cor samples of correlations # @param size optional size of the desired correlation matrix; # ignored is 'cor' is specified # @param nsamples optional number of posterior samples; # ignored is 'cor' is specified get_cor_matrix <- function(cor, size = NULL, nsamples = NULL) { if (length(cor)) { cor <- as.matrix(cor) size <- -1 / 2 + sqrt(1 / 4 + 2 * ncol(cor)) + 1 nsamples <- nrow(cor) } size <- as_one_numeric(size) nsamples <- as_one_numeric(nsamples) stopifnot(is_wholenumber(size) && size > 0) stopifnot(is_wholenumber(nsamples) && nsamples > 0) out <- array(diag(1, size), dim = c(size, size, nsamples)) out <- aperm(out, perm = c(3, 1, 2)) if (length(cor)) { k <- 0 for (i in seq_len(size)[-1]) { for (j in seq_len(i - 1)) { k = k + 1 out[, j, i] <- out[, i, j] <- cor[, k] } } } out } # compute covariance matrices of autocor structures # @param draws a brmsdraws object # @param obs observations for which to compute the covariance matrix # @param latent compute covariance matrix for latent residuals? get_cov_matrix_ac <- function(draws, obs = NULL, latent = FALSE) { if (is.null(obs)) { obs <- seq_len(draws$nobs) } nobs <- length(obs) nsamples <- draws$nsamples acef <- draws$ac$acef # prepare correlations if (has_ac_class(acef, "arma")) { ar <- as.numeric(draws$ac$ar) ma <- as.numeric(draws$ac$ma) if (length(ar) && !length(ma)) { cor <- get_cor_matrix_ar1(ar, nobs) } else if (!length(ar) && length(ma)) { cor <- get_cor_matrix_ma1(ma, nobs) } else if (length(ar) && length(ma)) { cor <- get_cor_matrix_arma1(ar, ma, nobs) } else { stop2("Neither 'ar' nor 'ma' were supplied. Please report a bug.") } } else if (has_ac_class(acef, "cosy")) { cosy <- as.numeric(draws$ac$cosy) cor <- get_cor_matrix_cosy(cosy, nobs) } else if (has_ac_class(acef, "fcor")) { cor <- get_cor_matrix_fcor(draws$ac$Mfcor, nsamples) } else { cor <- get_cor_matrix_ident(nsamples, nobs) } # prepare known standard errors if (!is.null(draws$data$se)) { se2 <- draws$data$se[obs]^2 se2 <- array(diag(se2, nobs), dim = c(nobs, nobs, nsamples)) se2 <- aperm(se2, perm = c(3, 1, 2)) # make sure not to add 'se' twice draws$data$se <- NULL } else { se2 <- rep(0, nobs) } # prepare residual standard deviations if (latent) { sigma2 <- as.numeric(draws$ac$sderr)^2 } else { sigma <- get_dpar(draws, "sigma", i = obs) if (NCOL(sigma) > 1L) { # sigma varies across observations sigma2 <- array(dim = c(nsamples, nobs, nobs)) for (s in seq_rows(sigma2)) { sigma2[s, , ] <- outer(sigma[s, ], sigma[s, ]) } } else { sigma2 <- as.numeric(sigma)^2 } } sigma2 * cor + se2 } # compute AR1 correlation matrices # @param ar AR1 autocorrelation samples # @param nobs number of rows of the covariance matrix # @return a numeric 'nsamples' x 'nobs' x 'nobs' array get_cor_matrix_ar1 <- function(ar, nobs) { out <- array(0, dim = c(NROW(ar), nobs, nobs)) fac <- 1 / (1 - ar^2) pow_ar <- as.list(rep(1, nobs + 1)) for (i in seq_len(nobs)) { pow_ar[[i + 1]] <- ar^i out[, i, i] <- fac for (j in seq_len(i - 1)) { out[, i, j] <- fac * pow_ar[[i - j + 1]] out[, j, i] <- out[, i, j] } } out } # compute MA1 correlation matrices # @param ma MA1 autocorrelation samples # @param nobs number of rows of the covariance matrix # @return a numeric 'nsamples' x 'nobs' x 'nobs' array get_cor_matrix_ma1 <- function(ma, nobs) { out <- array(0, dim = c(NROW(ma), nobs, nobs)) gamma0 <- 1 + ma^2 for (i in seq_len(nobs)) { out[, i, i] <- gamma0 if (i > 1) { out[, i, i - 1] <- ma } if (i < nobs) { out[, i, i + 1] <- ma } } out } # compute ARMA1 correlation matrices # @param ar AR1 autocorrelation samples # @param ma MA1 autocorrelation samples # @param nobs number of rows of the covariance matrix # @return a numeric 'nsamples' x 'nobs' x 'nobs' array get_cor_matrix_arma1 <- function(ar, ma, nobs) { out <- array(0, dim = c(NROW(ar), nobs, nobs)) fac <- 1 / (1 - ar^2) gamma0 <- 1 + ma^2 + 2 * ar * ma gamma <- as.list(rep(NA, nobs)) gamma[[1]] <- (1 + ar * ma) * (ar + ma) for (i in seq_len(nobs)) { out[, i, i] <- fac * gamma0 gamma[[i]] <- gamma[[1]] * ar^(i - 1) for (j in seq_len(i - 1)) { out[, i, j] <- fac * gamma[[i - j]] out[, j, i] <- out[, i, j] } } out } # compute compound symmetry correlation matrices # @param cosy compund symmetry correlation samples # @param nobs number of rows of the covariance matrix # @return a numeric 'nsamples' x 'nobs' x 'nobs' array get_cor_matrix_cosy <- function(cosy, nobs) { out <- array(0, dim = c(NROW(cosy), nobs, nobs)) for (i in seq_len(nobs)) { out[, i, i] <- 1 for (j in seq_len(i - 1)) { out[, i, j] <- cosy out[, j, i] <- out[, i, j] } } out } # prepare a fixed correlation matrix # @param Mfcor correlation matrix to be prepared # @param nsamples number of posterior samples # @return a numeric 'nsamples' x 'nobs' x 'nobs' array get_cor_matrix_fcor <- function(Mfcor, nsamples) { out <- array(Mfcor, dim = c(dim(Mfcor), nsamples)) aperm(out, c(3, 1, 2)) } # compute an identity correlation matrix # @param nsamples number of posterior samples # @param nobs number of rows of the covariance matrix # @return a numeric 'nsamples' x 'nobs' x 'nobs' array get_cor_matrix_ident <- function(nsamples, nobs) { out <- array(0, dim = c(nsamples, nobs, nobs)) for (i in seq_len(nobs)) { out[, i, i] <- 1 } out } # get samples of a distributional parameter # @param x object to extract posterior samples from # @param dpar name of the distributional parameter # @param i the current observation number # @param ilink should the inverse link function be applied? # if NULL the value is chosen internally # @return # If the parameter is predicted and i is NULL or # length(i) > 1, an S x N matrix. # If the parameter it not predicted or length(i) == 1, # a vector of length S. get_dpar <- function(draws, dpar, i = NULL, ilink = NULL) { stopifnot(is.brmsdraws(draws) || is.mvbrmsdraws(draws)) x <- draws$dpars[[dpar]] stopifnot(!is.null(x)) if (is.list(x)) { # compute samples of a predicted parameter out <- predictor(x, i = i, fdraws = draws) if (is.null(ilink)) { ilink <- apply_dpar_ilink(dpar, family = draws$family) } if (ilink) { out <- ilink(out, x$family$link) } if (length(i) == 1L) { out <- extract_col(out, 1) } } else if (!is.null(i) && !is.null(dim(x))) { out <- extract_col(x, i) } else { out <- x } if (dpar == "sigma") { out <- add_sigma_se(out, draws, i = i) } out } # get samples of a non-linear parameter # @param x object to extract posterior samples from # @param nlpar name of the non-linear parameter # @param i the current observation number # @return # If i is NULL or length(i) > 1: an S x N matrix # If length(i) == 1: a vector of length S get_nlpar <- function(draws, nlpar, i = NULL) { stopifnot(is.brmsdraws(draws) || is.mvbrmsdraws(draws)) x <- draws$nlpars[[nlpar]] stopifnot(!is.null(x)) if (is.list(x)) { # compute samples of a predicted parameter out <- predictor(x, i = i, fdraws = draws) if (length(i) == 1L) { out <- extract_col(out, 1) } } else if (!is.null(i) && !is.null(dim(x))) { out <- extract_col(x, i) } else { out <- x } out } # get the mixing proportions of mixture models get_theta <- function(draws, i = NULL) { stopifnot(is.brmsdraws(draws)) if ("theta" %in% names(draws$dpars)) { # theta was not predicted; no need to call get_dpar theta <- draws$dpars$theta } else { # theta was predicted; apply softmax mix_family <- draws$family families <- family_names(mix_family) theta <- vector("list", length(families)) for (j in seq_along(families)) { draws$family <- mix_family$mix[[j]] theta[[j]] <- as.matrix(get_dpar(draws, paste0("theta", j), i = i)) } theta <- abind(theta, along = 3) for (n in seq_len(dim(theta)[2])) { theta[, n, ] <- softmax(theta[, n, ]) } if (length(i) == 1L) { dim(theta) <- dim(theta)[c(1, 3)] } } theta } # get posterior samples of multivariate mean vectors # only used in multivariate models with 'rescor' get_Mu <- function(draws, i = NULL) { stopifnot(is.mvbrmsdraws(draws)) Mu <- draws$mvpars$Mu if (is.null(Mu)) { Mu <- lapply(draws$resps, get_dpar, "mu", i = i) if (length(i) == 1L) { Mu <- do_call(cbind, Mu) } else { # keep correct dimension even if data has only 1 row Mu <- lapply(Mu, as.matrix) Mu <- do_call(abind, c(Mu, along = 3)) } } else { stopifnot(!is.null(i)) Mu <- extract_col(Mu, i) } Mu } # get posterior samples of residual covariance matrices # only used in multivariate models with 'rescor' get_Sigma <- function(draws, i = NULL) { stopifnot(is.mvbrmsdraws(draws)) Sigma <- draws$mvpars$Sigma if (is.null(Sigma)) { stopifnot(!is.null(draws$mvpars$rescor)) sigma <- lapply(draws$resps, get_dpar, "sigma", i = i) is_matrix <- ulapply(sigma, is.matrix) if (!any(is_matrix)) { # happens if length(i) == 1 or if no sigma was predicted sigma <- do_call(cbind, sigma) Sigma <- get_cov_matrix(sigma, draws$mvpars$rescor) } else { for (j in seq_along(sigma)) { # bring all sigmas to the same dimension if (!is_matrix[j]) { sigma[[j]] <- array(sigma[[j]], dim = dim_mu(draws)) } } nsigma <- length(sigma) sigma <- abind(sigma, along = 3) Sigma <- array(dim = c(dim_mu(draws), nsigma, nsigma)) for (n in seq_len(ncol(Sigma))) { Sigma[, n, , ] <- get_cov_matrix(sigma[, n, ], draws$mvpars$rescor) } } } else { stopifnot(!is.null(i)) ldim <- length(dim(Sigma)) stopifnot(ldim %in% 3:4) if (ldim == 4L) { Sigma <- extract_col(Sigma, i) } } Sigma } # extract user-defined standard errors get_se <- function(draws, i = NULL) { stopifnot(is.brmsdraws(draws)) se <- as.vector(draws$data[["se"]]) if (!is.null(se)) { if (!is.null(i)) { se <- se[i] } if (length(se) > 1L) { dim <- c(draws$nsamples, length(se)) se <- as_draws_matrix(se, dim = dim) } } else { se <- 0 } se } # add user defined standard errors to 'sigma' add_sigma_se <- function(sigma, draws, i = NULL) { needs_se <- "se" %in% names(draws$data) && !isTRUE(attr(sigma, "se_added")) && !isTRUE(grepl("_cov$", draws$family$fun)) if (needs_se) { # 'se' will be incorporated directly into 'sigma' sigma <- sqrt(get_se(draws, i = i)^2 + sigma^2) # make sure not to add 'se' twice attr(sigma, "se_added") <- TRUE } sigma } # return samples of ordinal thresholds for observation i # @param draws a drawsl or drawsnl object # @param i observation number subset_thres <- function(draws, i) { thres <- draws$thres$thres Jthres <- draws$thres$Jthres if (!is.null(Jthres)) { thres <- thres[, Jthres[i, 1]:Jthres[i, 2], drop = FALSE] } thres } # helper function of 'get_dpar' to decide if # the link function should be applied by default apply_dpar_ilink <- function(dpar, family) { !(is_polytomous(family) && dpar_class(dpar) == "mu") || is.customfamily(family) } # insert zeros for the predictor term of the reference category # in categorical-like models using the softmax response function insert_refcat <- function(eta, family) { stopifnot(is.matrix(eta), is.brmsfamily(family)) if (!conv_cats_dpars(family) || isNA(family$refcat)) { return(eta) } # need to add zeros for the reference category zeros <- as.matrix(rep(0, nrow(eta))) if (is.null(family$refcat) || is.null(family$cats)) { # no information on the categories provided: # use the first category as the reference return(cbind(zeros, eta)) } colnames(zeros) <- paste0("mu", family$refcat) iref <- match(family$refcat, family$cats) before <- seq_len(iref - 1) after <- setdiff(seq_cols(eta), before) cbind(eta[, before, drop = FALSE], zeros, eta[, after, drop = FALSE]) } # validate the 'resp' argument of 'predict' and related methods # @param resp response names to be validated # @param x valid response names or brmsfit object to extract names from # @param multiple allow multiple response variables? # @return names of validated response variables validate_resp <- function(resp, x, multiple = TRUE) { if (is.brmsfit(x)) { x <- parse_bf(x$formula)$responses } x <- as.character(x) if (!length(x)) { # resp is unused in univariate models return(NULL) } if (length(resp)) { resp <- as.character(resp) if (!all(resp %in% x)) { stop2("Invalid argument 'resp'. Valid response ", "variables are: ", collapse_comma(x)) } if (!multiple) { resp <- as_one_character(resp) } } else { resp <- x } resp } # split '...' into a list of model objects and other arguments # takes its argument names from parent.frame() # @param .... objects to split into model and non-model objects # @param x object treated in the same way as '...'. Adding it is # necessary for substitute() to catch the name of the first # argument passed to S3 methods. # @param model_names optional names of the model objects # @param other: allow non-model arguments in '...'? # @return # A list of arguments. All brmsfit objects are stored # as a list in element 'models' unless 'other' is FALSE. # In the latter case just returns a list of models split_dots <- function(x, ..., model_names = NULL, other = TRUE) { other <- as_one_logical(other) dots <- list(x, ...) names <- substitute(list(x, ...), env = parent.frame())[-1] names <- ulapply(names, deparse_combine) if (length(names)) { if (!length(names(dots))) { names(dots) <- names } else { has_no_name <- !nzchar(names(dots)) names(dots)[has_no_name] <- names[has_no_name] } } is_brmsfit <- unlist(lapply(dots, is.brmsfit)) models <- dots[is_brmsfit] models <- validate_models(models, model_names, names(models)) out <- dots[!is_brmsfit] if (other) { out$models <- models } else { if (length(out)) { stop2("Only model objects can be passed to '...' for this method.") } out <- models } out } # reorder observations to be in the initial user-defined order # currently only relevant for autocorrelation models # @param eta 'nsamples' x 'nobs' matrix # @param old_order optional vector to retrieve the initial data order # @param sort keep the new order as defined by the time-series? # @return the 'eta' matrix with possibly reordered columns reorder_obs <- function(eta, old_order = NULL, sort = FALSE) { stopifnot(length(dim(eta)) %in% c(2L, 3L)) if (!is.null(old_order) && !sort) { if (isTRUE(length(old_order) == ncol(eta))) { if (length(dim(eta)) == 3L) { eta <- eta[, old_order, , drop = FALSE] } else { eta <- eta[, old_order, drop = FALSE] } } else { warning2("Cannot recover the original observation order.") } } eta } # extract argument names of a post-processing method arg_names <- function(method) { opts <- c("posterior_predict", "pp_expect", "log_lik") method <- match.arg(method, opts) out <- names(formals(paste0(method, ".brmsfit"))) c(out) <- names(formals(extract_draws.brmsfit)) c(out) <- names(formals(validate_newdata)) out <- unique(out) out <- setdiff(out, c("object", "x", "...")) out } # read a brmsfit object from a file # @param file path to an rds file # @return a brmsfit object or NULL read_brmsfit <- function(file) { file <- check_brmsfit_file(file) x <- suppressWarnings(try(readRDS(file), silent = TRUE)) if (!is(x, "try-error")) { if (!is.brmsfit(x)) { stop2("Object loaded via 'file' is not of class 'brmsfit'.") } x$file <- file } else { x <- NULL } x } # write a brmsfit object to a file # @param x a brmsfit object # @param file path to an rds file # @return NULL write_brmsfit <- function(x, file) { stopifnot(is.brmsfit(x)) file <- check_brmsfit_file(file) x$file <- file saveRDS(x, file = file) invisible(NULL) } # check validity of file name to store a brmsfit object in check_brmsfit_file <- function(file) { file <- as_one_character(file) file_ending <- tolower(get_matches("\\.[^\\.]+$", file)) if (!isTRUE(file_ending == ".rds")) { file <- paste0(file, ".rds") } file } # add dummy samples to a brmsfit object for use in unit tests # @param x a brmsfit object # @param newpar name of the new parameter to add # @param dim dimension of the new parameter # @param dist name of the distribution from which to sample # @param ... further arguments passed to r # @return a brmsfit object including dummy samples of the new parameter add_samples <- function(x, newpar, dim = numeric(0), dist = "norm", ...) { stopifnot(is.brmsfit(x)) stopifnot(identical(dim, numeric(0))) newpar <- as_one_character(newpar) for (i in seq_along(x$fit@sim$samples)) { x$fit@sim$samples[[i]][[newpar]] <- do_call(paste0("r", dist), list(x$fit@sim$iter, ...)) } x$fit@sim$fnames_oi <- c(x$fit@sim$fnames_oi, newpar) x$fit@sim$dims_oi[[newpar]] <- dim x$fit@sim$pars_oi <- names(x$fit@sim$dims_oi) x } brms/R/data-predictor.R0000644000176200001440000007533313616057677014500 0ustar liggesusers#' Prepare Predictor Data #' #' Prepare data related to predictor variables in \pkg{brms}. #' Only exported for use in package development. #' #' @param x An \R object. #' @param ... Further arguments passed to or from other methods. #' #' @return A named list of data related to predictor variables. #' #' @keywords internal #' @export data_predictor <- function(x, ...) { UseMethod("data_predictor") } #' @export data_predictor.mvbrmsterms <- function(x, data, old_sdata = NULL, ...) { out <- list(N = nrow(data)) for (i in seq_along(x$terms)) { od <- old_sdata[[x$responses[i]]] c(out) <- data_predictor(x$terms[[i]], data = data, old_sdata = od, ...) } out } #' @export data_predictor.brmsterms <- function(x, data, prior, ranef, knots = NULL, old_sdata = NULL, ...) { out <- list() data <- subset_data(data, x) resp <- usc(combine_prefix(x)) args_eff <- nlist(data, ranef, prior, knots, ...) for (dp in names(x$dpars)) { args_eff_spec <- list(x = x$dpars[[dp]], old_sdata = old_sdata[[dp]]) c(out) <- do_call(data_predictor, c(args_eff_spec, args_eff)) } for (dp in names(x$fdpars)) { out[[paste0(dp, resp)]] <- x$fdpars[[dp]]$value } for (nlp in names(x$nlpars)) { args_eff_spec <- list(x = x$nlpars[[nlp]], old_sdata = old_sdata[[nlp]]) c(out) <- do_call(data_predictor, c(args_eff_spec, args_eff)) } c(out) <- data_gr_local(x, data = data, ranef = ranef) c(out) <- data_mixture(x, prior = prior) out } # prepare data for all types of effects for use in Stan # @param data the data passed by the user # @param ranef object retuend by 'tidy_ranef' # @param prior an object of class brmsprior # @param knots optional knot values for smoothing terms # @param old_sdata see 'extract_old_standata' # @param ... currently ignored # @return a named list of data to be passed to Stan #' @export data_predictor.btl <- function(x, data, ranef = empty_ranef(), prior = brmsprior(), data2 = list(), knots = NULL, old_sdata = NULL, ...) { c(data_fe(x, data), data_sp(x, data, prior = prior, Jmo = old_sdata$Jmo), data_re(x, data, ranef = ranef), data_cs(x, data), data_sm(x, data, knots = knots, smooths = old_sdata$smooths), data_gp(x, data, gps = old_sdata$gps), data_ac(x, data, data2 = data2, locations = old_sdata$locations), data_offset(x, data), data_bhaz(x, data, basis = old_sdata$base_basis), data_prior(x, data, prior = prior) ) } # prepare data for non-linear parameters for use in Stan #' @export data_predictor.btnl <- function(x, data, data2 = list(), old_sdata = NULL, ...) { out <- list() c(out) <- data_cnl(x, data) c(out) <- data_ac(x, data, data2 = data2, locations = old_sdata$locations) out } # prepare data of fixed effects data_fe <- function(bterms, data) { out <- list() p <- usc(combine_prefix(bterms)) # the intercept is removed inside the Stan code for ordinal models cols2remove <- if (is_ordinal(bterms)) "(Intercept)" X <- get_model_matrix(rhs(bterms$fe), data, cols2remove = cols2remove) avoid_dpars(colnames(X), bterms = bterms) out[[paste0("K", p)]] <- ncol(X) out[[paste0("X", p)]] <- X out } # data preparation for splines data_sm <- function(bterms, data, knots = NULL, smooths = NULL) { out <- list() smterms <- all_terms(bterms[["sm"]]) if (!length(smterms)) { return(out) } p <- usc(combine_prefix(bterms)) new <- length(smooths) > 0L if (!new) { smooths <- named_list(smterms) for (i in seq_along(smterms)) { smooths[[i]] <- smoothCon( eval2(smterms[i]), data = data, knots = knots, absorb.cons = TRUE, diagonal.penalty = TRUE ) } } bylevels <- named_list(smterms) ns <- 0 lXs <- list() for (i in seq_along(smooths)) { # may contain multiple terms when 'by' is a factor for (j in seq_along(smooths[[i]])) { ns <- ns + 1 sm <- smooths[[i]][[j]] if (length(sm$by.level)) { bylevels[[i]][j] <- sm$by.level } if (new) { # prepare rasm for use with new data rasm <- s2rPred(sm, data) } else { rasm <- mgcv::smooth2random(sm, names(data), type = 2) } lXs[[ns]] <- rasm$Xf if (NCOL(lXs[[ns]])) { colnames(lXs[[ns]]) <- paste0(sm$label, "_", seq_cols(lXs[[ns]])) } Zs <- rasm$rand Zs <- setNames(Zs, paste0("Zs", p, "_", ns, "_", seq_along(Zs))) tmp <- list(length(Zs), as.array(ulapply(Zs, ncol))) tmp <- setNames(tmp, paste0(c("nb", "knots"), p, "_", ns)) c(out) <- c(tmp, Zs) } } Xs <- do_call(cbind, lXs) avoid_dpars(colnames(Xs), bterms = bterms) smcols <- lapply(lXs, function(x) which(colnames(Xs) %in% colnames(x))) Xs <- structure(Xs, smcols = smcols, bylevels = bylevels) colnames(Xs) <- rename(colnames(Xs)) out[[paste0("Ks", p)]] <- ncol(Xs) out[[paste0("Xs", p)]] <- Xs out } # prepare data for group-level effects for use in Stan data_re <- function(bterms, data, ranef) { out <- list() px <- check_prefix(bterms) take <- find_rows(ranef, ls = px) & !find_rows(ranef, type = "sp") ranef <- ranef[take, ] if (!nrow(ranef)) { return(out) } gn <- unique(ranef$gn) for (i in seq_along(gn)) { r <- subset2(ranef, gn = gn[i]) Z <- get_model_matrix(r$form[[1]], data = data, rename = FALSE) idp <- paste0(r$id[1], usc(combine_prefix(px))) Znames <- paste0("Z_", idp, "_", r$cn) if (r$gtype[1] == "mm") { ng <- length(r$gcall[[1]]$groups) if (r$type[1] == "cs") { stop2("'cs' is not supported in multi-membership terms.") } if (r$type[1] == "mmc") { # see issue #353 for the general idea mmc_expr <- "^mmc\\([^:]*\\)" mmc_terms <- get_matches_expr(mmc_expr, colnames(Z)) for (t in mmc_terms) { pos <- which(grepl_expr(escape_all(t), colnames(Z))) if (length(pos) != ng) { stop2("Invalid term '", t, "': Expected ", ng, " coefficients but found ", length(pos), ".") } for (j in seq_along(Znames)) { for (k in seq_len(ng)) { out[[paste0(Znames[j], "_", k)]] <- as.array(Z[, pos[k]]) } } } } else { for (j in seq_along(Znames)) { out[paste0(Znames[j], "_", seq_len(ng))] <- list(as.array(Z[, j])) } } } else { if (r$type[1] == "cs") { ncatM1 <- nrow(r) / ncol(Z) Z_temp <- vector("list", ncol(Z)) for (k in seq_along(Z_temp)) { Z_temp[[k]] <- replicate(ncatM1, Z[, k], simplify = FALSE) } Z <- do_call(cbind, unlist(Z_temp, recursive = FALSE)) } if (r$type[1] == "mmc") { stop2("'mmc' is only supported in multi-membership terms.") } for (j in seq_cols(Z)) { out[[Znames[j]]] <- as.array(Z[, j]) } } } out } # compute data for each group-level-ID per univariate model data_gr_local <- function(bterms, data, ranef) { stopifnot(is.brmsterms(bterms)) out <- list() ranef <- subset2(ranef, resp = bterms$resp) resp <- usc(bterms$resp) for (id in unique(ranef$id)) { id_ranef <- subset2(ranef, id = id) idresp <- paste0(id, resp) nranef <- nrow(id_ranef) group <- id_ranef$group[1] levels <- attr(ranef, "levels")[[group]] if (id_ranef$gtype[1] == "mm") { # multi-membership grouping term stopifnot(!nzchar(id_ranef$by[1])) gs <- id_ranef$gcall[[1]]$groups ngs <- length(gs) weights <- id_ranef$gcall[[1]]$weights if (is.formula(weights)) { scale <- isTRUE(attr(weights, "scale")) weights <- as.matrix(eval_rhs(weights, data)) if (!identical(dim(weights), c(nrow(data), ngs))) { stop2( "Grouping structure 'mm' expects 'weights' to be ", "a matrix with as many columns as grouping factors." ) } if (scale) { if (isTRUE(any(weights < 0))) { stop2("Cannot scale negative weights.") } weights <- sweep(weights, 1, rowSums(weights), "/") } } else { # all members get equal weights by default weights <- matrix(1 / ngs, nrow = nrow(data), ncol = ngs) } for (i in seq_along(gs)) { J <- as.array(match(get(gs[i], data), levels)) out[[paste0("J_", idresp, "_", i)]] <- J out[[paste0("W_", idresp, "_", i)]] <- as.array(weights[, i]) } } else { # ordinary grouping term g <- id_ranef$gcall[[1]]$groups gdata <- get(g, data) J <- match(gdata, levels) if (anyNA(J)) { # occurs for new levels only new_gdata <- gdata[!gdata %in% levels] new_levels <- unique(new_gdata) J[is.na(J)] <- match(new_gdata, new_levels) + length(levels) } out[[paste0("J_", idresp)]] <- as.array(J) } } out } # prepare global data for each group-level-ID # @param internal is the data for use in S3 methods only? data_gr_global <- function(ranef, cov_ranef = NULL, internal = FALSE) { out <- list() if (!is.null(cov_ranef) && !internal) { # check validity of cov_ranef cr_names <- names(cov_ranef) cr_is_named <- length(cr_names) && all(nzchar(cr_names)) if (!is.list(cov_ranef) || !cr_is_named) { stop2("'cov_ranef' must be a named list.") } if (any(duplicated(cr_names))) { stop2("Names of 'cov_ranef' must be unique.") } unused_cr_names <- setdiff(cr_names, ranef$group) if (length(unused_cr_names)) { stop2("The following elements of 'cov_ranef' are unused: ", collapse_comma(unused_cr_names)) } } for (id in unique(ranef$id)) { tmp <- list() id_ranef <- subset2(ranef, id = id) nranef <- nrow(id_ranef) group <- id_ranef$group[1] levels <- attr(ranef, "levels")[[group]] tmp$N <- length(levels) tmp$M <- nranef tmp$NC <- as.integer(nranef * (nranef - 1) / 2) # prepare number of levels of an optional 'by' variable if (nzchar(id_ranef$by[1])) { stopifnot(!nzchar(id_ranef$type[1])) bylevels <- id_ranef$bylevels[[1]] Jby <- match(attr(levels, "by"), bylevels) tmp$Nby <- length(bylevels) tmp$Jby <- as.array(Jby) } # prepare customized covariance matrices if (group %in% names(cov_ranef)) { cov_mat <- as.matrix(cov_ranef[[group]]) if (!isSymmetric(unname(cov_mat))) { stop2("Covariance matrix of grouping factor '", group, "' is not symmetric.") } found_levels <- rownames(cov_mat) if (is.null(found_levels)) { stop2("Row names are required for covariance matrix of '", group, "'.") } colnames(cov_mat) <- found_levels found <- levels %in% found_levels if (any(!found)) { stop2("Row names of covariance matrix of '", group, "' do not match names of the grouping levels.") } cov_mat <- cov_mat[levels, levels, drop = FALSE] evs <- eigen(cov_mat, symmetric = TRUE, only.values = TRUE)$values if (min(evs) <= 0) { stop2("Covariance matrix of grouping factor '", group, "' is not positive definite.") } tmp$Lcov <- t(chol(cov_mat)) } names(tmp) <- paste0(names(tmp), "_", id) c(out) <- tmp } out } # prepare data for special effects for use in Stan data_sp <- function(bterms, data, prior = brmsprior(), Jmo = NULL) { out <- list() spef <- tidy_spef(bterms, data) if (!nrow(spef)) return(out) px <- check_prefix(bterms) p <- usc(combine_prefix(px)) # prepare general data out[[paste0("Ksp", p)]] <- nrow(spef) Csp <- sp_model_matrix(bterms$sp, data) avoid_dpars(colnames(Csp), bterms = bterms) Csp <- Csp[, spef$Ic > 0, drop = FALSE] Csp <- lapply(seq_cols(Csp), function(i) as.array(Csp[, i])) if (length(Csp)) { Csp_names <- paste0("Csp", p, "_", seq_along(Csp)) out <- c(out, setNames(Csp, Csp_names)) } if (any(lengths(spef$Imo) > 0)) { # prepare data specific to monotonic effects out[[paste0("Imo", p)]] <- max(unlist(spef$Imo)) Xmo <- lapply(unlist(spef$calls_mo), get_mo_values, data = data) Xmo_names <- paste0("Xmo", p, "_", seq_along(Xmo)) c(out) <- setNames(Xmo, Xmo_names) compute_Jmo <- is.null(Jmo) if (!length(Jmo)) { Jmo <- as.array(ulapply(Xmo, max)) } out[[paste0("Jmo", p)]] <- Jmo # prepare prior concentration of simplex parameters simo_coef <- get_simo_labels(spef) for (i in seq_along(simo_coef)) { simo_prior <- subset2(prior, class = "simo", coef = simo_coef[i], ls = px ) simo_prior <- simo_prior$prior if (isTRUE(nzchar(simo_prior))) { simo_prior <- eval_dirichlet(simo_prior) if (length(simo_prior) != Jmo[i]) { stop2("Invalid Dirichlet prior for the simplex of coefficient '", simo_coef[i], "'. Expected input of length ", Jmo[i], ".") } } else { simo_prior <- rep(1, Jmo[i]) } out[[paste0("con_simo", p, "_", i)]] <- as.array(simo_prior) } } out } # prepare data for category specific effects data_cs <- function(bterms, data) { out <- list() if (length(all_terms(bterms[["cs"]]))) { p <- usc(combine_prefix(bterms)) Xcs <- get_model_matrix(bterms$cs, data) avoid_dpars(colnames(Xcs), bterms = bterms) out <- c(out, list(Kcs = ncol(Xcs), Xcs = Xcs)) out <- setNames(out, paste0(names(out), p)) } out } # prepare global data for noise free variables data_Xme <- function(meef, data) { stopifnot(is.meef_frame(meef)) out <- list() groups <- unique(meef$grname) for (i in seq_along(groups)) { g <- groups[i] K <- which(meef$grname %in% g) Mme <- length(K) out[[paste0("Mme_", i)]] <- Mme out[[paste0("NCme_", i)]] <- Mme * (Mme - 1) / 2 if (nzchar(g)) { levels <- get_levels(meef)[[g]] gr <- get_me_group(meef$term[K[1]], data) Jme <- match(gr, levels) if (anyNA(Jme)) { # occurs for new levels only # replace NAs with unique values; fixes issue #706 gr[is.na(gr)] <- paste0("new_", seq_len(sum(is.na(gr))), "__") new_gr <- gr[!gr %in% levels] new_levels <- unique(new_gr) Jme[is.na(Jme)] <- length(levels) + match(new_gr, new_levels) } ilevels <- unique(Jme) out[[paste0("Nme_", i)]] <- length(ilevels) out[[paste0("Jme_", i)]] <- Jme } for (k in K) { Xn <- get_me_values(meef$term[k], data) noise <- get_me_noise(meef$term[k], data) if (nzchar(g)) { for (l in ilevels) { # validate values of the same level take <- Jme %in% l if (length(unique(Xn[take])) > 1L || length(unique(noise[take])) > 1L) { stop2( "Measured values and measurement error should be ", "unique for each group. Occured for level '", levels[l], "' of group '", g, "'." ) } } Xn <- get_one_value_per_group(Xn, Jme) noise <- get_one_value_per_group(noise, Jme) } out[[paste0("Xn_", k)]] <- as.array(Xn) out[[paste0("noise_", k)]] <- as.array(noise) } } out } # prepare data for Gaussian process terms # @param raw store certain intermediate data for further processing? # @param ... passed to '.data_gp' data_gp <- function(bterms, data, raw = FALSE, gps = NULL, ...) { out <- list() raw <- as_one_logical(raw) px <- check_prefix(bterms) p <- usc(combine_prefix(px)) gpef <- tidy_gpef(bterms, data) for (i in seq_rows(gpef)) { pi <- paste0(p, "_", i) Xgp <- lapply(gpef$covars[[i]], eval2, data) D <- length(Xgp) out[[paste0("Dgp", pi)]] <- D invalid <- ulapply(Xgp, function(x) !is.numeric(x) || isTRUE(length(dim(x)) > 1L) ) if (any(invalid)) { stop2("Predictors of Gaussian processes should be numeric vectors.") } Xgp <- do_call(cbind, Xgp) if (gpef$scale[i]) { # scale predictor for easier specification of priors if (length(gps)) { # scale Xgp based on the original data dmax <- gps[[paste0("dmax", pi)]] } else { dmax <- sqrt(max(diff_quad(Xgp))) } if (raw) { # required for scaling of GPs with new data out[[paste0("dmax", pi)]] <- dmax } Xgp <- Xgp / dmax } cmc <- gpef$cmc[i] gr <- gpef$gr[i] k <- gpef$k[i] c <- gpef$c[[i]] if (!isNA(k)) { out[[paste0("NBgp", pi)]] <- k ^ D Ks <- as.matrix(do.call(expand.grid, repl(seq_len(k), D))) } byvar <- gpef$byvars[[i]] byfac <- length(gpef$cons[[i]]) > 0L bynum <- !is.null(byvar) && !byfac if (byfac) { # for categorical 'by' variables prepare one GP per level # as.factor will keep unused levels needed for new data byval <- as.factor(get(byvar, data)) byform <- str2formula(c(ifelse(cmc, "0", "1"), "byval")) con_mat <- model.matrix(byform) cons <- colnames(con_mat) out[[paste0("Kgp", pi)]] <- length(cons) Ngp <- Nsubgp <- vector("list", length(cons)) for (j in seq_along(cons)) { # loop along contrasts of 'by' Cgp <- con_mat[, j] sfx <- paste0(pi, "_", j) tmp <- .data_gp( Xgp, k = k, gr = gr, sfx = sfx, Cgp = Cgp, c = c, raw = raw, gps = gps, ... ) Ngp[[j]] <- attributes(tmp)[["Ngp"]] Nsubgp[[j]] <- attributes(tmp)[["Nsubgp"]] c(out) <- tmp } out[[paste0("Ngp", pi)]] <- unlist(Ngp) if (gr) { out[[paste0("Nsubgp", pi)]] <- unlist(Nsubgp) } } else { out[[paste0("Kgp", pi)]] <- 1L c(out) <- .data_gp( Xgp, k = k, gr = gr, sfx = pi, c = c, raw = raw, gps = gps, ... ) if (bynum) { Cgp <- as.numeric(get(byvar, data)) out[[paste0("Cgp", pi)]] <- as.array(Cgp) } } } out } # helper function to preparae GP related data # @inheritParams data_gp # @param Xgp matrix of covariate values # @param k, gr, c see 'tidy_gpef' # @param sfx suffix to put at the end of data names # @param Cgp optional vector of values belonging to # a certain contrast of a factor 'by' variable .data_gp <- function(Xgp, k, gr, sfx, Cgp = NULL, c = NULL, raw = FALSE, gps = NULL) { out <- list() if (!is.null(Cgp)) { Cgp <- unname(Cgp) Igp <- which(Cgp != 0) Xgp <- Xgp[Igp, , drop = FALSE] out[[paste0("Igp", sfx)]] <- as.array(Igp) out[[paste0("Cgp", sfx)]] <- as.array(Cgp[Igp]) attr(out, "Ngp") <- length(Igp) } if (gr) { groups <- factor(match_rows(Xgp, Xgp)) ilevels <- levels(groups) Jgp <- match(groups, ilevels) Nsubgp <- length(ilevels) if (!is.null(Cgp)) { attr(out, "Nsubgp") <- Nsubgp } else { out[[paste0("Nsubgp", sfx)]] <- Nsubgp } out[[paste0("Jgp", sfx)]] <- as.array(Jgp) not_dupl_Jgp <- !duplicated(Jgp) Xgp <- Xgp[not_dupl_Jgp, , drop = FALSE] } if (length(gps)) { # center Xgp based on the original data cmeans <- gps[[paste0("cmeans", sfx)]] } else { cmeans <- colMeans(Xgp) } if (raw) { out[[paste0("Xgp", sfx)]] <- Xgp # required for centering of GPs with new data out[[paste0("cmeans", sfx)]] <- cmeans return(out) } if (!isNA(k)) { # basis function approach requires centered variables Xgp <- sweep(Xgp, 2, cmeans) D <- NCOL(Xgp) L <- choose_L(Xgp, c = c) Ks <- as.matrix(do.call(expand.grid, repl(seq_len(k), D))) XgpL <- matrix(nrow = NROW(Xgp), ncol = NROW(Ks)) slambda <- matrix(nrow = NROW(Ks), ncol = D) for (m in seq_rows(Ks)) { XgpL[, m] <- eigen_fun_cov_exp_quad(Xgp, m = Ks[m, ], L = L) slambda[m, ] <- sqrt(eigen_val_cov_exp_quad(m = Ks[m, ], L = L)) } out[[paste0("Xgp", sfx)]] <- XgpL out[[paste0("slambda", sfx)]] <- slambda } else { out[[paste0("Xgp", sfx)]] <- as.array(Xgp) } out } # data for autocorrelation variables # @param locations optional original locations for CAR models data_ac <- function(bterms, data, data2, locations = NULL, ...) { out <- list() N <- nrow(data) acef <- tidy_acef(bterms) if (has_ac_subset(bterms, dim = "time")) { gr <- subset2(acef, dim = "time")$gr if (gr != "NA") { tgroup <- as.numeric(factor(data[[gr]])) } else { tgroup <- rep(1, N) } } if (has_ac_class(acef, "arma")) { # ARMA correlations acef_arma <- subset2(acef, class = "arma") out$Kar <- acef_arma$p out$Kma <- acef_arma$q if (!use_ac_cov_time(acef_arma)) { # data for the 'predictor' version of ARMA max_lag <- max(out$Kar, out$Kma) out$J_lag <- as.array(rep(0, N)) for (n in seq_len(N)[-N]) { ind <- n:max(1, n + 1 - max_lag) # indexes errors to be used in the n+1th prediction out$J_lag[n] <- sum(tgroup[ind] %in% tgroup[n + 1]) } } } if (use_ac_cov_time(acef)) { # data for the 'covariance' versions of time-series structures out$N_tg <- length(unique(tgroup)) out$begin_tg <- as.array(ulapply(unique(tgroup), match, tgroup)) out$nobs_tg <- as.array(with(out, c(if (N_tg > 1L) begin_tg[2:N_tg], N + 1) - begin_tg )) out$end_tg <- with(out, begin_tg + nobs_tg - 1) } if (has_ac_class(acef, "sar")) { acef_sar <- subset2(acef, class = "sar") M <- data2[[acef_sar$M]] rmd_rows <- attr(data, "na.action") if (!is.null(rmd_rows)) { M <- M[-rmd_rows, -rmd_rows, drop = FALSE] } if (!is_equal(dim(M), rep(N, 2))) { stop2("Dimensions of 'M' for SAR terms must be equal to ", "the number of observations.") } out$Msar <- as.matrix(M) out$eigenMsar <- eigen(M)$values # simplifies code of choose_N out$N_tg <- 1 } if (has_ac_class(acef, "car")) { acef_car <- subset2(acef, class = "car") needs_locations <- is.null(locations) M <- data2[[acef_car$M]] if (acef_car$gr != "NA") { loc_data <- get(acef_car$gr, data) new_locations <- levels(factor(loc_data)) if (needs_locations) { locations <- new_locations } else { invalid_locations <- setdiff(new_locations, locations) if (length(invalid_locations)) { stop2("Cannot handle new locations in CAR models.") } } Nloc <- length(locations) Jloc <- as.array(match(loc_data, locations)) if (is.null(rownames(M))) { stop2("Row names are required for 'M' in CAR terms.") } found <- locations %in% rownames(M) if (any(!found)) { stop2("Row names of 'M' for CAR terms do not match ", "the names of the grouping levels.") } M <- M[locations, locations, drop = FALSE] } else { warning2( "Using CAR terms without a grouping factor is deprecated. ", "Please use argument 'gr' even if each observation ", "represents its own location." ) Nloc <- N Jloc <- as.array(seq_len(Nloc)) if (!is_equal(dim(M), rep(Nloc, 2))) { if (needs_locations) { stop2("Dimensions of 'M' for CAR terms must be equal ", "to the number of observations.") } else { stop2("Cannot handle new data in CAR models ", "without a grouping factor.") } } } M_tmp <- M M_tmp[upper.tri(M_tmp)] <- NA edges <- which(as.matrix(M_tmp == 1), arr.ind = TRUE) c(out) <- nlist( Nloc, Jloc, Nedges = nrow(edges), edges1 = as.array(edges[, 1]), edges2 = as.array(edges[, 2]) ) if (acef_car$type %in% c("escar", "esicar")) { Nneigh <- Matrix::colSums(M) if (any(Nneigh == 0) && needs_locations) { stop2( "For exact sparse CAR, all locations should have at ", "least one neighbor within the provided data set. ", "Consider using type = 'icar' instead." ) } inv_sqrt_D <- diag(1 / sqrt(Nneigh)) eigenMcar <- t(inv_sqrt_D) %*% M %*% inv_sqrt_D eigenMcar <- eigen(eigenMcar, TRUE, only.values = TRUE)$values c(out) <- nlist(Nneigh, eigenMcar) } else if (acef_car$type %in% "bym2") { c(out) <- list(car_scale = .car_scale(edges, Nloc)) } } if (has_ac_class(acef, "fcor")) { acef_fcor <- subset2(acef, class = "fcor") M <- data2[[acef_fcor$M]] rmd_rows <- attr(data, "na.action") if (!is.null(rmd_rows)) { M <- M[-rmd_rows, -rmd_rows, drop = FALSE] } if (nrow(M) != N) { stop2("Dimensions of 'M' for FCOR terms must be equal ", "to the number of observations.") } out$Mfcor <- M # simplifies code of choose_N out$N_tg <- 1 } if (length(out)) { resp <- usc(combine_prefix(bterms)) out <- setNames(out, paste0(names(out), resp)) } out } # prepare data of offsets for use in Stan data_offset <- function(bterms, data) { out <- list() px <- check_prefix(bterms) if (is.formula(bterms$offset)) { p <- usc(combine_prefix(px)) mf <- rm_attr(data, "terms") mf <- model.frame(bterms$offset, mf, na.action = na.pass) offset <- model.offset(mf) if (length(offset) == 1L) { offset <- rep(offset, nrow(data)) } # use 'offsets' as 'offset' will be reserved in stanc3 out[[paste0("offsets", p)]] <- as.array(offset) } out } # data for covariates in non-linear models # @param x a btnl object # @return a named list of data passed to Stan data_cnl <- function(bterms, data) { stopifnot(is.btnl(bterms)) out <- list() covars <- all.vars(bterms$covars) if (!length(covars)) { return(out) } p <- usc(combine_prefix(bterms)) for (i in seq_along(covars)) { cvalues <- get(covars[i], data) if (is_like_factor(cvalues)) { # need to apply factor contrasts cform <- str2formula(covars[i]) cvalues <- get_model_matrix(cform, data, cols2remove = "(Intercept)") if (NCOL(cvalues) > 1) { stop2("Factors with more than two levels are not allowed as covariates.") } cvalues <- cvalues[, 1] } out[[paste0("C", p, "_", i)]] <- cvalues } out } # compute the spatial scaling factor of CAR models # @param edges matrix with two columns defining the adjacency of the locations # @param Nloc number of locations # @return a scalar scaling factor .car_scale <- function(edges, Nloc) { # amended from Imad Ali's code of CAR models in rstanarm stopifnot(is.matrix(edges), NCOL(edges) == 2) # Build the adjacency matrix adj_matrix <- Matrix::sparseMatrix( i = edges[, 1], j = edges[, 2], x = 1, symmetric = TRUE ) # The ICAR precision matrix (which is singular) Q <- Matrix::Diagonal(Nloc, Matrix::rowSums(adj_matrix)) - adj_matrix # Add a small jitter to the diagonal for numerical stability Q_pert <- Q + Matrix::Diagonal(Nloc) * max(Matrix::diag(Q)) * sqrt(.Machine$double.eps) # Compute the diagonal elements of the covariance matrix subject to the # constraint that the entries of the ICAR sum to zero. .Q_inv <- function(Q) { Sigma <- Matrix::solve(Q) A <- matrix(1, 1, NROW(Sigma)) W <- Sigma %*% t(A) Sigma <- Sigma - W %*% solve(A %*% W) %*% Matrix::t(W) return(Sigma) } Q_inv <- .Q_inv(Q_pert) # Compute the geometric mean of the variances (diagonal of Q_inv) exp(mean(log(Matrix::diag(Q_inv)))) } # data for special priors such as horseshoe and lasso data_prior <- function(bterms, data, prior) { out <- list() px <- check_prefix(bterms) p <- usc(combine_prefix(px)) prefix <- combine_prefix(px, keep_mu = TRUE) special <- attr(prior, "special")[[prefix]] if (!is.null(special[["hs_df"]])) { # data for the horseshoe prior hs_obj_names <- paste0("hs_", c("df", "df_global", "df_slab", "scale_global", "scale_slab") ) hs_data <- special[hs_obj_names] if (is.null(special[["hs_par_ratio"]])) { hs_data$hs_scale_global <- special$hs_scale_global } else { hs_data$hs_scale_global <- special$hs_par_ratio / sqrt(nrow(data)) } names(hs_data) <- paste0(hs_obj_names, p) out <- c(out, hs_data) } if (!is.null(special[["lasso_df"]])) { lasso_obj_names <- paste0("lasso_", c("df", "scale")) lasso_data <- special[lasso_obj_names] names(lasso_data) <- paste0(lasso_obj_names, p) out <- c(out, lasso_data) } out } # Construct design matrices for brms models # @param formula a formula object # @param data A data frame created with model.frame. # If another sort of object, model.frame is called first. # @param cols2remove names of the columns to remove from # the model matrix; mainly used for intercepts # @param rename rename column names via rename()? # @param ... currently ignored # @return # The design matrix for the given formula and data. # For details see ?stats::model.matrix get_model_matrix <- function(formula, data = environment(formula), cols2remove = NULL, rename = TRUE, ...) { stopifnot(is.atomic(cols2remove)) terms <- validate_terms(formula) if (is.null(terms)) { return(NULL) } if (no_int(terms)) { cols2remove <- union(cols2remove, "(Intercept)") } X <- stats::model.matrix(terms, data) cols2remove <- which(colnames(X) %in% cols2remove) if (length(cols2remove)) { X <- X[, -cols2remove, drop = FALSE] } if (rename) { colnames(X) <- rename(colnames(X), check_dup = TRUE) } X } # convenient wrapper around mgcv::PredictMat PredictMat <- function(object, data, ...) { data <- rm_attr(data, "terms") out <- mgcv::PredictMat(object, data = data, ...) if (length(dim(out)) < 2L) { # fixes issue #494 out <- matrix(out, nrow = 1) } out } # convenient wrapper around mgcv::smoothCon smoothCon <- function(object, data, ...) { data <- rm_attr(data, "terms") vars <- setdiff(c(object$term, object$by), "NA") for (v in vars) { # allow factor-like variables #562 if (is_like_factor(data[[v]])) { data[[v]] <- as.factor(data[[v]]) } } mgcv::smoothCon(object, data = data, ...) } # Aid prediction from smooths represented as 'type = 2' # originally provided by Simon Wood # @param sm output of mgcv::smoothCon # @param data new data supplied for prediction # @return A list of the same structure as returned by mgcv::smoothCon s2rPred <- function(sm, data) { re <- mgcv::smooth2random(sm, names(data), type = 2) # prediction matrix for new data X <- PredictMat(sm, data) # transform to RE parameterization if (!is.null(re$trans.U)) { X <- X %*% re$trans.U } X <- t(t(X) * re$trans.D) # re-order columns according to random effect re-ordering X[, re$rind] <- X[, re$pen.ind != 0] # re-order penalization index in same way pen.ind <- re$pen.ind pen.ind[re$rind] <- pen.ind[pen.ind > 0] # start returning the object Xf <- X[, which(re$pen.ind == 0), drop = FALSE] out <- list(rand = list(), Xf = Xf) for (i in seq_along(re$rand)) { # loop over random effect matrices out$rand[[i]] <- X[, which(pen.ind == i), drop = FALSE] attr(out$rand[[i]], "s.label") <- attr(re$rand[[i]], "s.label") } names(out$rand) <- names(re$rand) out } brms/R/formula-gp.R0000644000176200001440000002632213611527526013627 0ustar liggesusers# R helper functions for Gaussian Processes #' Set up Gaussian process terms in \pkg{brms} #' #' Set up a Gaussian process (GP) term in \pkg{brms}. The function does not #' evaluate its arguments -- it exists purely to help set up a model with #' GP terms. #' #' @param ... One or more predictors for the GP. #' @param by A numeric or factor variable of the same length as #' each predictor. In the numeric vector case, the elements multiply #' the values returned by the GP. In the factor variable #' case, a separate GP is fitted for each factor level. #' @param k Optional number of basis functions for computing approximate #' GPs. If \code{NA} (the default), exact GPs are computed. #' @param cov Name of the covariance kernel. By default, #' the exponentiated-quadratic kernel \code{"exp_quad"} is used. #' @param iso A flag to indicate whether an isotropic (\code{TRUE}; the #' default) of a non-isotropic GP should be used. #' In the former case, the same amount of smoothing is applied to all #' predictors. In the latter case, predictors may have different smoothing. #' Ignored if only a single predictors is supplied. #' @param gr Logical; Indicates if auto-grouping should be used (defaults #' to \code{FALSE}). If enabled, observations sharing the same #' predictor values will be represented by the same latent variable #' in the GP. This will improve sampling efficiency #' drastically if the number of unique predictor combinations is small #' relative to the number of observations. #' @param cmc Logical; Only relevant if \code{by} is a factor. If \code{TRUE} #' (the default), cell-mean coding is used for the \code{by}-factor, that is #' one GP per level is estimated. If \code{FALSE}, contrast GPs are estimated #' according to the contrasts set for the \code{by}-factor. #' @param scale Logical; If \code{TRUE} (the default), predictors are #' scaled so that the maximum Euclidean distance between two points #' is 1. This often improves sampling speed and convergence. #' @param c Numeric value only used in approximate GPs. Defines the #' multiplicative constant of the predictors' range over which #' predictions should be computed. A good default could be \code{c = 5/4} #' but we are still working on providing better recommendations. #' #' @details A GP is a stochastic process, which #' describes the relation between one or more predictors #' \eqn{x = (x_1, ..., x_d)} and a response \eqn{f(x)}, where #' \eqn{d} is the number of predictors. A GP is the #' generalization of the multivariate normal distribution #' to an infinite number of dimensions. Thus, it can be #' interpreted as a prior over functions. Any finite sample #' realized from this stochastic process is jointly multivariate #' normal, with a covariance matrix defined by the covariance #' kernel \eqn{k_p(x)}, where \eqn{p} is the vector of parameters #' of the GP: #' \deqn{f(x) ~ MVN(0, k_p(x))} #' The smoothness and general behavior of the function \eqn{f} #' depends only on the choice of covariance kernel. #' For a more detailed introduction to Gaussian processes, #' see \url{https://en.wikipedia.org/wiki/Gaussian_process}. #' #' Below, we describe the currently supported covariance kernels: #' \itemize{ #' \item{"exp_quad": }{The exponentiated-quadratic kernel is defined as #' \eqn{k(x_i, x_j) = sdgp^2 exp(- || x_i - x_j ||^2 / (2 lscale^2))}, #' where \eqn{|| . ||} is the Euclidean norm, \eqn{sdgp} is a #' standard deviation parameter, and \eqn{lscale} is characteristic #' length-scale parameter. The latter practically measures how close two #' points \eqn{x_i} and \eqn{x_j} have to be to influence each other #' substantially.} #' } #' #' In the current implementation, \code{"exp_quad"} is the only supported #' covariance kernel. More options will follow in the future. #' #' @return An object of class \code{'gp_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @examples #' \dontrun{ #' # simulate data using the mgcv package #' dat <- mgcv::gamSim(1, n = 30, scale = 2) #' #' # fit a simple GP model #' fit1 <- brm(y ~ gp(x2), dat, chains = 2) #' summary(fit1) #' me1 <- marginal_effects(fit1, nsamples = 200, spaghetti = TRUE) #' plot(me1, ask = FALSE, points = TRUE) #' #' # fit a more complicated GP model #' fit2 <- brm(y ~ gp(x0) + x1 + gp(x2) + x3, dat, chains = 2) #' summary(fit2) #' me2 <- marginal_effects(fit2, nsamples = 200, spaghetti = TRUE) #' plot(me2, ask = FALSE, points = TRUE) #' #' # fit a multivariate GP model #' fit3 <- brm(y ~ gp(x1, x2), dat, chains = 2) #' summary(fit3) #' me3 <- marginal_effects(fit3, nsamples = 200, spaghetti = TRUE) #' plot(me3, ask = FALSE, points = TRUE) #' #' # compare model fit #' LOO(fit1, fit2, fit3) #' #' # simulate data with a factor covariate #' dat2 <- mgcv::gamSim(4, n = 90, scale = 2) #' #' # fit separate gaussian processes for different levels of 'fac' #' fit4 <- brm(y ~ gp(x2, by = fac), dat2, chains = 2) #' summary(fit4) #' plot(marginal_effects(fit4), points = TRUE) #' } #' #' @seealso \code{\link{brmsformula}} #' @export gp <- function(..., by = NA, k = NA, cov = "exp_quad", iso = TRUE, gr = FALSE, cmc = TRUE, scale = TRUE, c = NULL) { cov <- match.arg(cov, choices = c("exp_quad")) label <- deparse(match.call()) vars <- as.list(substitute(list(...)))[-1] by <- deparse(substitute(by)) gr <- as_one_logical(gr) cmc <- as_one_logical(cmc) if (length(vars) > 1L) { iso <- as_one_logical(iso) } else { iso <- TRUE } if (!isNA(k)) { k <- as.integer(as_one_numeric(k)) if (k < 1L) { stop2("'k' must be postive.") } if (is.null(c)) { stop2( "'c' must be specified for approximate GPs. ", "A good default could be c = 5/4 but we are still ", "working on providing better recommendations." ) } c <- as.numeric(c) if (length(c) == 1L) { c <- rep(c, length(vars)) } if (length(c) != length(vars)) { stop2("'c' must be of the same length as the number of covariates.") } if (any(c <= 0)) { stop2("'c' must be positive.") } } else { c <- NA } scale <- as_one_logical(scale) term <- ulapply(vars, deparse, backtick = TRUE, width.cutoff = 500) out <- nlist(term, label, by, cov, k, iso, gr, cmc, scale, c) structure(out, class = "gp_term") } # get labels of gaussian process terms # @param x either a formula or a list containing an element "gp" # @param data data frame containing the covariates # @return a data.frame with one row per GP term tidy_gpef <- function(x, data) { if (is.formula(x)) { x <- parse_bf(x, check_response = FALSE)$dpars$mu } form <- x[["gp"]] if (!is.formula(form)) { return(empty_data_frame()) } out <- data.frame(term = all_terms(form), stringsAsFactors = FALSE) nterms <- nrow(out) out$cons <- out$byvars <- out$covars <- out$sfx1 <- out$sfx2 <- out$c <- vector("list", nterms) for (i in seq_len(nterms)) { gp <- eval2(out$term[i]) out$label[i] <- paste0("gp", rename(collapse(gp$term))) out$cov[i] <- gp$cov out$k[i] <- gp$k out$c[[i]] <- gp$c out$iso[i] <- gp$iso out$cmc[i] <- gp$cmc out$gr[i] <- gp$gr out$scale[i] <- gp$scale out$covars[[i]] <- gp$term if (gp$by != "NA") { out$byvars[[i]] <- gp$by str_add(out$label[i]) <- rename(gp$by) byval <- get(gp$by, data) if (is_like_factor(byval)) { byval <- unique(as.factor(byval)) byform <- str2formula(c(ifelse(gp$cmc, "0", "1"), "byval")) cons <- rename(colnames(model.matrix(byform))) out$cons[[i]] <- rm_wsp(sub("^byval", "", cons)) } } # sfx1 is for sdgp and sfx2 is for lscale out$sfx1[[i]] <- paste0(out$label[i], out$cons[[i]]) if (out$iso[i]) { out$sfx2[[i]] <- matrix(out$sfx1[[i]]) } else { out$sfx2[[i]] <- outer(out$sfx1[[i]], out$covars[[i]], paste0) } } out } # exponential-quadratic covariance matrix # not vectorized over parameter values cov_exp_quad <- function(x, x_new = NULL, sdgp = 1, lscale = 1) { Dls <- length(lscale) if (Dls == 1L) { # one dimensional or isotropic GP diff_quad <- diff_quad(x = x, x_new = x_new) out <- sdgp^2 * exp(-diff_quad / (2 * lscale^2)) } else { # multi-dimensional non-isotropic GP diff_quad <- diff_quad(x = x[, 1], x_new = x_new[, 1]) out <- sdgp^2 * exp(-diff_quad / (2 * lscale[1]^2)) for (d in seq_len(Dls)[-1]) { diff_quad <- diff_quad(x = x[, d], x_new = x_new[, d]) out <- out * exp(-diff_quad / (2 * lscale[d]^2)) } } out } # compute squared differences # @param x vector or matrix # @param x_new optional vector of matrix with the same ncol as x # @return an nrow(x) times nrow(x_new) matrix # @details if matrices are passed results are summed over the columns diff_quad <- function(x, x_new = NULL) { x <- as.matrix(x) if (is.null(x_new)) { x_new <- x } else { x_new <- as.matrix(x_new) } .diff_quad <- function(x1, x2) (x1 - x2)^2 out <- 0 for (i in seq_cols(x)) { out <- out + outer(x[, i], x_new[, i], .diff_quad) } out } # spectral density function # vectorized over parameter values spd_cov_exp_quad <- function(x, sdgp = 1, lscale = 1) { NB <- NROW(x) D <- NCOL(x) Dls <- NCOL(lscale) out <- matrix(nrow = length(sdgp), ncol = NB) if (Dls == 1L) { # one dimensional or isotropic GP constant <- sdgp^2 * (sqrt(2 * pi) * lscale)^D neg_half_lscale2 <- -0.5 * lscale^2 for (m in seq_len(NB)) { out[, m] <- constant * exp(neg_half_lscale2 * sum(x[m, ]^2)) } } else { # multi-dimensional non-isotropic GP constant <- sdgp^2 * sqrt(2 * pi)^D * matrixStats::rowProds(lscale) neg_half_lscale2 = -0.5 * lscale^2 for (m in seq_len(NB)) { x2 <- as_draws_matrix(x[m, ]^2, dim = dim(lscale)) out[, m] <- constant * exp(rowSums(neg_half_lscale2 * x2)) } } out } # compute the mth eigen value of an approximate GP eigen_val_cov_exp_quad <- function(m, L) { ((m * pi) / (2 * L))^2 } # compute the mth eigen function of an approximate GP eigen_fun_cov_exp_quad <- function(x, m, L) { x <- as.matrix(x) D <- ncol(x) stopifnot(length(m) == D, length(L) == D) out <- vector("list", D) for (i in seq_cols(x)) { out[[i]] <- 1 / sqrt(L[i]) * sin((m[i] * pi) / (2 * L[i]) * (x[, i] + L[i])) } Reduce("*", out) } # extended range of input data for which predictions should be made choose_L <- function(x, c) { if (!length(x)) { range <- 1 } else { range <- max(1, max(x, na.rm = TRUE) - min(x, na.rm = TRUE)) } c * range } # try to evaluate a GP term and # return an informative error message if it fails try_nug <- function(expr, nug) { out <- try(expr, silent = TRUE) if (is(out, "try-error")) { stop2("The Gaussian process covariance matrix is not positive ", "definite.\nThis occurs for numerical reasons. Setting ", "'nug' above ", nug, " may help.") } out } brms/R/stanvars.R0000644000176200001440000001331213611527526013412 0ustar liggesusers#' User-defined variables passed to Stan #' #' Prepare user-defined variables to be passed to one of Stan's #' program blocks. This is primarily useful for defining more complex #' priors, for refitting models without recompilation despite #' changing priors, or for defining custom Stan functions. #' #' @aliases stanvars #' #' @param x An \R object containing data to be passed to Stan. #' Only required if \code{block = 'data'} and ignored otherwise. #' @param name Optional character string providing the desired variable #' name of the object in \code{x}. If \code{NULL} (the default) #' the variable name is directly infered from \code{x}. #' @param scode Line of Stan code to define the variable #' in Stan language. If \code{block = 'data'}, the #' Stan code is inferred based on the class of \code{x} by default. #' @param block Name of one of Stan's program blocks in #' which the variable should be defined. Can be \code{'data'}, #' \code{'tdata'} (transformed data), \code{'parameters'}, #' \code{'tparameters'} (transformed parameters), \code{'model'}, #' \code{'genquant'} (generated quantities) or \code{'functions'}. #' #' @return An object of class \code{stanvars}. #' #' @examples #' bprior <- prior(normal(mean_intercept, 10), class = "Intercept") #' stanvars <- stanvar(5, name = "mean_intercept") #' make_stancode(count ~ Trt, epilepsy, prior = bprior, #' stanvars = stanvars) #' #' # define a multi-normal prior with known covariance matrix #' bprior <- prior(multi_normal(M, V), class = "b") #' stanvars <- stanvar(rep(0, 2), "M", scode = " vector[K] M;") + #' stanvar(diag(2), "V", scode = " matrix[K, K] V;") #' make_stancode(count ~ Trt + zBase, epilepsy, #' prior = bprior, stanvars = stanvars) #' #' # define a hierachical prior on the regression coefficients #' bprior <- set_prior("normal(0, tau)", class = "b") + #' set_prior("target += normal_lpdf(tau | 0, 10)", check = FALSE) #' stanvars <- stanvar(scode = "real tau;", #' block = "parameters") #' make_stancode(count ~ Trt + zBase, epilepsy, #' prior = bprior, stanvars = stanvars) #' #' @export stanvar <- function(x = NULL, name = NULL, scode = NULL, block = "data") { vblocks <- c( "data", "tdata", "parameters", "tparameters", "model", "genquant", "functions" ) block <- match.arg(block, vblocks) if (block == "data") { if (is.null(x)) { stop2("Argument 'x' is required if block = 'data'.") } if (is.null(name)) { name <- deparse(substitute(x)) } name <- as_one_character(name) if (!is_equal(name, make.names(name)) || grepl("\\.", name)) { stop2("'", limit_chars(name, 30), "' is not ", "a valid variable name in Stan.") } if (is.null(scode)) { # infer scode from x if (is.integer(x)) { if (length(x) == 1L) { scode <- paste0("int ", name) } else { scode <- paste0("int ", name, "[", length(x), "]") } } else if (is.vector(x)) { if (length(x) == 1L) { scode <- paste0("real ", name) } else { scode <- paste0("vector[", length(x), "] ", name) } } else if (is.array(x)) { if (length(dim(x)) == 1L) { scode <- paste0("vector[", length(x), "] ", name) } else if (is.matrix(x)) { scode <- paste0("matrix[", nrow(x), ", ", ncol(x), "] ", name) } } if (is.null(scode)) { stop2( "'stanvar' could not infer the Stan code for an object ", "of class '", class(x), "'. Please specify the Stan code ", "manually via argument 'scode'." ) } scode <- paste0(" ", scode, ";") } } else { x <- NULL if (is.null(name)) { name <- "" } name <- as_one_character(name) if (is.null(scode)) { stop2("Argument 'scode' is required if block is not 'data'.") } } out <- nlist(name, sdata = x, scode, block) structure(setNames(list(out), name), class = "stanvars") } # take a subset of a stanvars object # @param x a stanvars object # @param ... conditions defining the desired subset subset_stanvars <- function(x, ...) { x <- validate_stanvars(x) structure_not_null(x[find_elements(x, ...)], class = "stanvars") } # collapse Stan code provided in a stanvars object collapse_stanvars <- function(x, block = NULL) { x <- validate_stanvars(x) if (!length(x)) { return(character(0)) } if (!is.null(block)) { x <- subset_stanvars(x, block = block) } if (!length(x)) { return("") } collapse(ulapply(x, "[[", "scode"), "\n") } validate_stanvars <- function(x) { if (!is.null(x) && !is.stanvars(x)) { stop2("Argument 'stanvars' is invalid. See ?stanvar for help.") } x } # add new stanvars to a brmsfit object add_new_stanvars <- function(x, newdata2) { stopifnot(is.brmsfit(x)) stanvars_data <- subset_stanvars(x$stanvars, block = "data") for (name in names(stanvars_data)) { if (name %in% names(newdata2)) { x$stanvars[[name]]$sdata <- newdata2[[name]] } } x } #' @export c.stanvars <- function(x, ...) { dots <- lapply(list(...), validate_stanvars) class(x) <- "list" out <- unlist(c(list(x), dots), recursive = FALSE) svnames <- names(out)[nzchar(names(out))] if (any(duplicated(svnames))) { stop2("Duplicated names in 'stanvars' are not allowed.") } structure(out, class = "stanvars") } #' @export "+.stanvars" <- function(e1, e2) { c(e1, e2) } is.stanvars <- function(x) { inherits(x, "stanvars") } brms/R/diagnostics.R0000644000176200001440000000563413606326626014072 0ustar liggesusers#' Extract Diagnostic Quantities of \pkg{brms} Models #' #' Extract quantities that can be used to diagnose sampling behavior #' of the algorithms applied by \pkg{Stan} at the back-end of \pkg{brms}. #' #' @name diagnostic-quantities #' @aliases log_posterior nuts_params rhat neff_ratio #' #' @param object A \code{brmsfit} object. #' @param pars An optional character vector of parameter names. #' For \code{nuts_params} these will be NUTS sampler parameter #' names rather than model parameters. If pars is omitted #' all parameters are included. #' @param ... Arguments passed to individual methods. #' #' @return The exact form of the output depends on the method. #' #' @details For more details see #' \code{\link[bayesplot:bayesplot-extractors]{bayesplot-extractors}}. #' #' @examples #' \dontrun{ #' fit <- brm(time ~ age * sex, data = kidney) #' #' lp <- log_posterior(fit) #' head(lp) #' #' np <- nuts_params(fit) #' str(np) #' # extract the number of divergence transitions #' sum(subset(np, Parameter == "divergent__")$Value) #' #' head(rhat(fit)) #' head(neff_ratio(fit)) #' } NULL #' @rdname diagnostic-quantities #' @importFrom bayesplot log_posterior #' @export log_posterior #' @export log_posterior.brmsfit <- function(object, ...) { contains_samples(object) bayesplot::log_posterior(object$fit, ...) } #' @rdname diagnostic-quantities #' @importFrom bayesplot nuts_params #' @export nuts_params #' @export nuts_params.brmsfit <- function(object, pars = NULL, ...) { contains_samples(object) bayesplot::nuts_params(object$fit, pars = pars, ...) } #' @rdname diagnostic-quantities #' @importFrom bayesplot rhat #' @export rhat #' @export rhat.brmsfit <- function(object, pars = NULL, ...) { contains_samples(object) bayesplot::rhat(object$fit, pars = pars, ...) } #' @rdname diagnostic-quantities #' @importFrom bayesplot neff_ratio #' @export neff_ratio #' @export neff_ratio.brmsfit <- function(object, pars = NULL, ...) { contains_samples(object) bayesplot::neff_ratio(object$fit, pars = pars, ...) } #' Extract Control Parameters of the NUTS Sampler #' #' Extract control parameters of the NUTS sampler such as #' \code{adapt_delta} or \code{max_treedepth}. #' #' @param x An \R object #' @param pars Optional names of the control parameters to be returned. #' If \code{NULL} (the default) all control parameters are returned. #' See \code{\link[rstan:stan]{stan}} for more details. #' @param ... Currently ignored. #' #' @return A named \code{list} with control parameter values. #' #' @export control_params <- function(x, ...) { UseMethod("control_params") } #' @rdname control_params #' @export control_params.brmsfit <- function(x, pars = NULL, ...) { contains_samples(x) out <- attr(x$fit@sim$samples[[1]], "args")$control if (!is.null(pars)) { out <- out[pars] } out } brms/R/family-lists.R0000644000176200001440000003306213567710636014200 0ustar liggesusers# This file contains a list for every native family. # These lists may contain the following elements: # links: possible link function (first is default) # dpars: distributional parameters of the family # type: either real or int (i.e. continuous or discrete) # ybounds: area of definition of the response values # closed: is the interval closed or open? # ad: supported addition arguments # include: names of user-defined Stan functions # to be included in the Stan code # const: definitions of constants in Stan # to be put in the transformed parameters block # specials: character vector specialities of some families .family_gaussian <- function() { list( links = c("identity", "log", "inverse", "softplus"), dpars = c("mu", "sigma"), type = "real", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "se", "cens", "trunc", "mi"), specials = c("residuals", "rescor") ) } .family_student <- function() { list( links = c("identity", "log", "inverse", "softplus"), dpars = c("mu", "sigma", "nu"), type = "real", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "se", "cens", "trunc", "mi"), include = "fun_logm1.stan", specials = c("residuals", "rescor") ) } .family_skew_normal <- function() { list( links = c("identity", "log", "inverse", "softplus"), dpars = c("mu", "sigma", "alpha"), type = "real", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "se", "cens", "trunc", "mi"), const = "real sqrt_2_div_pi = sqrt(2 / pi())" ) } .family_binomial <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit", "identity" ), dpars = c("mu"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "trials", "cens", "trunc") ) } .family_bernoulli <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit", "identity" ), dpars = c("mu"), type = "int", ybounds = c(0, 1), closed = c(TRUE, TRUE), ad = c("weights", "subset"), specials = "binary" ) } .family_categorical <- function() { list( links = "logit", dpars = NULL, # is determind based on the data type = "int", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset"), specials = c("categorical") ) } .family_multinomial <- function() { list( links = "logit", dpars = NULL, # is determind based on the data type = "int", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "trials"), specials = c("multinomial"), include = "fun_multinomial_logit.stan" ) } .family_beta <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit", "identity" ), dpars = c("mu", "phi"), type = "real", ybounds = c(0, 1), closed = c(FALSE, FALSE), ad = c("weights", "subset", "cens", "trunc", "mi") ) } .family_dirichlet <- function() { list( links = "logit", dpars = "phi", # more dpars are determind based on the data type = "real", ybounds = c(0, 1), closed = c(FALSE, FALSE), ad = c("weights", "subset"), specials = c("dirichlet"), include = "fun_dirichlet_logit.stan" ) } .family_poisson <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc", "rate") ) } .family_negbinomial <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu", "shape"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc", "rate") ) } .family_geometric <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc", "rate") ) } .family_discrete_weibull <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit", "identity" ), dpars = c("mu", "shape"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_discrete_weibull.stan" ) } .family_com_poisson <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu", "shape"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_com_poisson.stan" ) } .family_gamma <- function() { list( links = c("log", "identity", "inverse", "softplus"), dpars = c("mu", "shape"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc", "mi", "rate"), specials = "transeta" # see stan_eta_ilink() ) } .family_weibull <- function() { list( links = c("log", "identity", "inverse", "softplus"), dpars = c("mu", "shape"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc", "mi", "rate"), specials = "transeta" # see stan_eta_ilink() ) } .family_exponential <- function() { list( links = c("log", "identity", "inverse", "softplus"), dpars = "mu", type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc", "mi", "rate"), specials = "transeta" # see stan_eta_ilink() ) } .family_frechet <- function() { list( links = c("log", "identity", "inverse", "softplus"), dpars = c("mu", "nu"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc", "mi", "rate"), include = "fun_logm1.stan", specials = "transeta" # see stan_eta_ilink() ) } .family_inverse.gaussian <- function() { list( links = c("1/mu^2", "inverse", "identity", "log", "softplus"), dpars = c("mu", "shape"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc", "mi"), include = "fun_inv_gaussian.stan" ) } .family_lognormal <- function() { list( links = c("identity", "inverse"), dpars = c("mu", "sigma"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc", "mi", "rate"), specials = "logscale" ) } .family_shifted_lognormal <- function() { list( links = c("identity", "inverse"), dpars = c("mu", "sigma", "ndt"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc", "mi"), specials = "logscale" ) } .family_exgaussian <- function() { list( links = c("identity", "log", "inverse", "softplus"), dpars = c("mu", "sigma", "beta"), type = "real", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "cens", "trunc", "mi") ) } .family_wiener <- function() { list( links = c("identity", "log", "softplus"), dpars = c("mu", "bs", "ndt", "bias"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "dec"), include = "fun_wiener_diffusion.stan" ) } .family_gen_extreme_value <- function() { list( links = c("identity", "log", "inverse", "softplus"), dpars = c("mu", "sigma", "xi"), type = "real", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "cens", "trunc", "mi"), include = c("fun_gen_extreme_value.stan", "fun_scale_xi.stan") ) } .family_von_mises <- function() { list( links = c("tan_half", "identity"), dpars = c("mu", "kappa"), type = "real", ybounds = c(-pi, pi), closed = c(TRUE, TRUE), ad = c("weights", "subset", "cens", "trunc", "mi"), include = c("fun_tan_half.stan", "fun_von_mises.stan") ) } .family_asym_laplace <- function() { list( links = c("identity", "log", "inverse", "softplus"), dpars = c("mu", "sigma", "quantile"), type = "real", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "cens", "trunc", "mi"), include = "fun_asym_laplace.stan" ) } .family_zero_inflated_asym_laplace <- function() { list( links = c("identity", "log", "inverse", "softplus"), dpars = c("mu", "sigma", "quantile", "zi"), type = "real", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "cens", "trunc"), include = c("fun_asym_laplace.stan", "fun_zero_inflated_asym_laplace.stan") ) } .family_cox <- function() { list( links = c("log", "identity"), dpars = c("mu"), type = "real", ybounds = c(0, Inf), closed = c(FALSE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_cox.stan", specials = c("cox") ) } .family_cumulative <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit" ), dpars = c("mu", "disc"), type = "int", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "thres", "cat"), specials = c("ordinal", "ordered_thres", "thres_minus_eta") ) } .family_sratio <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit" ), dpars = c("mu", "disc"), type = "int", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "thres", "cat"), specials = c("ordinal", "cs", "thres_minus_eta") ) } .family_cratio <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit" ), dpars = c("mu", "disc"), type = "int", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "thres", "cat"), specials = c("ordinal", "cs", "eta_minus_thres") ) } .family_acat <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit" ), dpars = c("mu", "disc"), type = "int", ybounds = c(-Inf, Inf), closed = c(NA, NA), ad = c("weights", "subset", "thres", "cat"), specials = c("ordinal", "cs", "eta_minus_thres") ) } .family_hurdle_poisson <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu", "hu"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_hurdle_poisson.stan" ) } .family_hurdle_negbinomial <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu", "shape", "hu"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_hurdle_negbinomial.stan" ) } .family_hurdle_gamma <- function() { list( links = c("log", "identity", "inverse", "softplus"), dpars = c("mu", "shape", "hu"), type = "real", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_hurdle_gamma.stan" ) } .family_hurdle_lognormal <- function() { list( links = c("identity", "inverse"), dpars = c("mu", "sigma", "hu"), type = "real", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_hurdle_lognormal.stan", specials = "logscale" ) } .family_zero_inflated_poisson <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu", "zi"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_zero_inflated_poisson.stan" ) } .family_zero_inflated_negbinomial <- function() { list( links = c("log", "identity", "sqrt", "softplus"), dpars = c("mu", "shape", "zi"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "cens", "trunc"), include = "fun_zero_inflated_negbinomial.stan" ) } .family_zero_inflated_binomial <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit", "identity" ), dpars = c("mu", "zi"), type = "int", ybounds = c(0, Inf), closed = c(TRUE, NA), ad = c("weights", "subset", "trials", "cens", "trunc"), include = "fun_zero_inflated_binomial.stan" ) } .family_zero_inflated_beta <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit", "identity" ), dpars = c("mu", "phi", "zi"), type = "real", ybounds = c(0, 1), closed = c(TRUE, FALSE), ad = c("weights", "subset", "cens", "trunc"), include = "fun_zero_inflated_beta.stan" ) } .family_zero_one_inflated_beta <- function() { list( links = c( "logit", "probit", "probit_approx", "cloglog", "cauchit", "identity" ), dpars = c("mu", "phi", "zoi", "coi"), type = "real", ybounds = c(0, 1), closed = c(TRUE, TRUE), ad = c("weights", "subset"), include = "fun_zero_one_inflated_beta.stan" ) } .family_custom <- function() { list( ad = c("weights", "subset", "se", "cens", "trunc", "trials", "thres", "cat", "dec", "mi", "vreal", "vint"), ybounds = c(-Inf, Inf), closed = c(NA, NA) ) } brms/R/formula-cs.R0000644000176200001440000000171513606622611013620 0ustar liggesusers#' Category Specific Predictors in \pkg{brms} Models #' #' @aliases cse #' #' @param expr Expression containing predictors, #' for which category specific effects should be estimated. #' For evaluation, \R formula syntax is applied. #' #' @details For detailed documentation see \code{help(brmsformula)} #' as well as \code{vignette("brms_overview")}. #' #' This function is almost solely useful when #' called in formulas passed to the \pkg{brms} package. #' #' @seealso \code{\link{brmsformula}} #' #' @examples #' \dontrun{ #' fit <- brm(rating ~ period + carry + cs(treat), #' data = inhaler, family = sratio("cloglog"), #' prior = set_prior("normal(0,5)"), chains = 2) #' summary(fit) #' plot(fit, ask = FALSE) #' } #' #' @export cs <- function(expr) { deparse_no_string(substitute(expr)) } # alias of function 'cs' used in the JSS paper of brms #' @export cse <- function(expr) { deparse_no_string(substitute(expr)) } brms/R/data-response.R0000644000176200001440000004703513614262740014324 0ustar liggesusers#' Extract response values #' #' Extract response values from a \code{\link{brmsfit}} object. #' #' @param x A \code{\link{brmsfit}} object. #' @param resp Optional names of response variables for which to extract values. #' @param warn For internal use only. #' @param ... Further arguments passed to \code{\link{standata}}. #' #' @return Returns a vector of response values for univariate models and a #' matrix of response values with one column per response variable for #' multivariate models. #' #' @keywords internal #' @export get_y <- function(x, resp = NULL, warn = FALSE, ...) { stopifnot(is.brmsfit(x)) resp <- validate_resp(resp, x) warn <- as_one_logical(warn) args <- list(x, resp = resp, ...) args$re_formula <- NA args$check_response <- TRUE args$only_response <- TRUE args$internal <- TRUE sdata <- do_call(standata, args) if (warn) { if (any(paste0("cens", usc(resp)) %in% names(sdata))) { warning2("Results may not be meaningful for censored models.") } } Ynames <- paste0("Y", usc(resp)) if (length(Ynames) > 1L) { out <- do_call(cbind, sdata[Ynames]) colnames(out) <- resp } else { out <- sdata[[Ynames]] } structure(out, old_order = attr(sdata, "old_order")) } #' Prepare Response Data #' #' Prepare data related to response variables in \pkg{brms}. #' Only exported for use in package development. #' #' @param x An \R object. #' @param ... Further arguments passed to or from other methods. #' #' @return A named list of data related to response variables. #' #' @keywords internal #' @export data_response <- function(x, ...) { UseMethod("data_response") } #' @export data_response.mvbrmsterms <- function(x, old_sdata = NULL, ...) { out <- list() for (i in seq_along(x$terms)) { od <- old_sdata[[x$responses[i]]] c(out) <- data_response(x$terms[[i]], old_sdata = od, ...) } if (x$rescor) { out$nresp <- length(x$responses) out$nrescor <- out$nresp * (out$nresp - 1) / 2 } out } #' @export data_response.brmsterms <- function(x, data, check_response = TRUE, internal = FALSE, old_sdata = NULL, ...) { # prepare data for the response variable data <- subset_data(data, x) N <- nrow(data) Y <- model.response(model.frame(x$respform, data, na.action = na.pass)) out <- list(N = N, Y = unname(Y)) if (is_binary(x$family) || is_categorical(x$family)) { out$Y <- as_factor(out$Y, levels = old_sdata$resp_levels) out$Y <- as.numeric(out$Y) if (is_binary(x$family)) { out$Y <- out$Y - 1 } } if (is_ordinal(x$family) && is.ordered(out$Y)) { out$Y <- as.numeric(out$Y) } if (check_response) { family4error <- family_names(x$family) if (is.mixfamily(x$family)) { family4error <- paste0(family4error, collapse = ", ") family4error <- paste0("mixture(", family4error, ")") } if (!allow_factors(x$family) && !is.numeric(out$Y)) { stop2("Family '", family4error, "' requires numeric responses.") } if (is_binary(x$family)) { if (any(!out$Y %in% c(0, 1))) { stop2("Family '", family4error, "' requires responses ", "to contain only two different values.") } } if (is_ordinal(x$family)) { if (any(!is_wholenumber(out$Y)) || any(!out$Y > 0)) { stop2("Family '", family4error, "' requires either positive ", "integers or ordered factors as responses.") } } if (use_int(x$family)) { if (!all(is_wholenumber(out$Y))) { stop2("Family '", family4error, "' requires integer responses.") } } if (has_multicol(x$family)) { if (!is.matrix(out$Y)) { stop2("This model requires a response matrix.") } } if (is_dirichlet(x$family)) { if (!is_equal(rowSums(out$Y), rep(1, nrow(out$Y)))) { stop2("Response values in dirichlet models must sum to 1.") } } ybounds <- family_info(x$family, "ybounds") closed <- family_info(x$family, "closed") if (is.finite(ybounds[1])) { y_min <- min(out$Y, na.rm = TRUE) if (closed[1] && y_min < ybounds[1]) { stop2("Family '", family4error, "' requires response greater ", "than or equal to ", ybounds[1], ".") } else if (!closed[1] && y_min <= ybounds[1]) { stop2("Family '", family4error, "' requires response greater ", "than ", round(ybounds[1], 2), ".") } } if (is.finite(ybounds[2])) { y_max <- max(out$Y, na.rm = TRUE) if (closed[2] && y_max > ybounds[2]) { stop2("Family '", family4error, "' requires response smaller ", "than or equal to ", ybounds[2], ".") } else if (!closed[2] && y_max >= ybounds[2]) { stop2("Family '", family4error, "' requires response smaller ", "than ", round(ybounds[2], 2), ".") } } out$Y <- as.array(out$Y) } # data for addition arguments of the response if (has_trials(x$family) || is.formula(x$adforms$trials)) { if (!length(x$adforms$trials)) { if (is_multinomial(x$family)) { stop2("Specifying 'trials' is required in multinomial models.") } trials <- round(max(out$Y, na.rm = TRUE)) if (isTRUE(is.finite(trials))) { message("Using the maximum response value as the number of trials.") warning2( "Using 'binomial' families without specifying 'trials' ", "on the left-hand side of the model formula is deprecated." ) } else if (!is.null(old_sdata$trials)) { trials <- max(old_sdata$trials) } else { stop2("Could not compute the number of trials.") } } else if (is.formula(x$adforms$trials)) { trials <- get_ad_values(x, "trials", "trials", data) if (!is.numeric(trials)) { stop2("Number of trials must be numeric.") } if (any(!is_wholenumber(trials) | trials < 1)) { stop2("Number of trials must be positive integers.") } } else { stop2("Argument 'trials' is misspecified.") } if (length(trials) == 1L) { trials <- rep(trials, nrow(data)) } if (check_response) { if (is_multinomial(x$family)) { if (!is_equal(rowSums(out$Y), trials)) { stop2("Number of trials does not match the number of events.") } } else if (has_trials(x$family)) { if (max(trials) == 1L && !internal) { message("Only 2 levels detected so that family 'bernoulli' ", "might be a more efficient choice.") } if (any(out$Y > trials)) { stop2("Number of trials is smaller than the number of events.") } } } out$trials <- as.array(trials) } if (has_cat(x$family)) { ncat <- length(get_cats(x$family)) if (min(ncat) < 2L) { stop2("At least two response categories are required.") } if (!has_multicol(x$family)) { if (ncat == 2L && !internal) { message("Only 2 levels detected so that family 'bernoulli' ", "might be a more efficient choice.") } if (check_response && any(out$Y > ncat)) { stop2("Number of categories is smaller than the response ", "variable would suggest.") } } out$ncat <- ncat } if (has_thres(x$family)) { thres <- family_info(x, "thres") if (has_thres_groups(x$family)) { groups <- get_thres_groups(x) out$ngrthres <- length(groups) grthres <- get_ad_values(x, "thres", "gr", data) grthres <- factor(grthres, levels = groups) # create an matrix of threshold indices per observation Jgrthres <- match(grthres, groups) nthres <- as.array(rep(NA, length(groups))) for (i in seq_along(groups)) { nthres[i] <- max(subset2(thres, group = groups[i])$thres) } if (check_response && any(out$Y > nthres[Jgrthres] + 1)) { stop2("Number of thresholds is smaller than required by the response.") } Kthres_cumsum <- cumsum(nthres) Kthres_start <- c(1, Kthres_cumsum[-length(nthres)] + 1) Kthres_end <- Kthres_cumsum Jthres <- cbind(Kthres_start, Kthres_end)[Jgrthres, ] out$Jthres <- Jthres } else { nthres <- max(thres$thres) if (check_response && any(out$Y > nthres + 1)) { stop2("Number of thresholds is smaller than required by the response.") } } if (max(nthres) == 1L && !internal) { message("Only 2 levels detected so that family 'bernoulli' ", "might be a more efficient choice.") } out$nthres <- nthres } if (is.formula(x$adforms$cat)) { warning2("Addition argument 'cat' is deprecated. Use 'thres' instead. ", "See ?brmsformula for more details.") } if (is.formula(x$adforms$se)) { se <- get_ad_values(x, "se", "se", data) if (!is.numeric(se)) { stop2("Standard errors must be numeric.") } if (min(se) < 0) { stop2("Standard errors must be non-negative.") } out$se <- as.array(se) } if (is.formula(x$adforms$weights)) { weights <- get_ad_values(x, "weights", "weights", data) if (!is.numeric(weights)) { stop2("Weights must be numeric.") } if (min(weights) < 0) { stop2("Weights must be non-negative.") } if (get_ad_flag(x, "weights", "scale")) { weights <- weights / sum(weights) * length(weights) } out$weights <- as.array(weights) } if (is.formula(x$adforms$dec)) { dec <- get_ad_values(x, "dec", "dec", data) if (is.character(dec) || is.factor(dec)) { if (!all(unique(dec) %in% c("lower", "upper"))) { stop2("Decisions should be 'lower' or 'upper' ", "when supplied as characters or factors.") } dec <- ifelse(dec == "lower", 0, 1) } else { dec <- as.numeric(as.logical(dec)) } out$dec <- as.array(dec) } if (is.formula(x$adforms$rate)) { denom <- get_ad_values(x, "rate", "denom", data) if (!is.numeric(denom)) { stop2("Rate denomiators should be numeric.") } if (isTRUE(any(denom <= 0))) { stop2("Rate denomiators should be positive.") } out$denom <- as.array(denom) } if (is.formula(x$adforms$cens) && check_response) { cens <- get_ad_values(x, "cens", "cens", data) cens <- prepare_cens(cens) if (!all(is_wholenumber(cens) & cens %in% -1:2)) { stop2( "Invalid censoring data. Accepted values are ", "'left', 'none', 'right', and 'interval'\n", "(abbreviations are allowed) or -1, 0, 1, and 2.\n", "TRUE and FALSE are also accepted ", "and refer to 'right' and 'none' respectively." ) } out$cens <- as.array(cens) icens <- cens %in% 2 if (any(icens)) { y2 <- unname(get_ad_values(x, "cens", "y2", data)) if (is.null(y2)) { stop2("Argument 'y2' is required for interval censored data.") } if (any(out$Y[icens] >= y2[icens])) { stop2("Left censor points must be smaller than right ", "censor points for interval censored data.") } y2[!icens] <- 0 # not used in Stan out$rcens <- as.array(y2) } } if (is.formula(x$adforms$trunc)) { lb <- as.numeric(get_ad_values(x, "trunc", "lb", data)) ub <- as.numeric(get_ad_values(x, "trunc", "ub", data)) if (any(lb >= ub)) { stop2("Truncation bounds are invalid: lb >= ub") } if (length(lb) == 1L) { lb <- rep(lb, N) } if (length(ub) == 1L) { ub <- rep(ub, N) } if (length(lb) != N || length(ub) != N) { stop2("Invalid truncation bounds.") } inv_bounds <- out$Y < lb | out$Y > ub if (check_response && isTRUE(any(inv_bounds))) { stop2("Some responses are outside of the truncation bounds.") } out$lb <- lb out$ub <- ub } if (is.formula(x$adforms$mi)) { sdy <- get_sdy(x, data) if (is.null(sdy)) { # missings only which_mi <- which(is.na(out$Y)) out$Jmi <- as.array(which_mi) out$Nmi <- length(out$Jmi) } else { # measurement error in the response if (length(sdy) == 1L) { sdy <- rep(sdy, length(out$Y)) } if (length(sdy) != length(out$Y)) { stop2("'sdy' must have the same length as the response.") } # all observations will have a latent score which_mi <- which(is.na(out$Y) | is.infinite(sdy)) out$Jme <- as.array(setdiff(seq_along(out$Y), which_mi)) out$Nme <- length(out$Jme) out$noise <- as.array(sdy) if (!internal) { out$noise[which_mi] <- Inf } } if (!internal) { # Stan does not allow NAs in data # use Inf to that min(Y) is not affected out$Y[which_mi] <- Inf } } if (is.formula(x$adforms$vreal)) { # vectors of real values for use in custom families vreal <- eval_rhs(x$adforms$vreal) vreal <- lapply(vreal$vars, eval2, data) names(vreal) <- paste0("vreal", seq_along(vreal)) for (i in seq_along(vreal)) { if (length(vreal[[i]]) == 1L) { vreal[[i]] <- rep(vreal[[i]], N) } vreal[[i]] <- as.array(as.numeric(vreal[[i]])) } c(out) <- vreal } if (is.formula(x$adforms$vint)) { # vectors of integer values for use in custom families vint <- eval_rhs(x$adforms$vint) vint <- lapply(vint$vars, eval2, data) names(vint) <- paste0("vint", seq_along(vint)) for (i in seq_along(vint)) { if (length(vint[[i]]) == 1L) { vint[[i]] <- rep(vint[[i]], N) } if (!all(is_wholenumber(vint[[i]]))) { stop2("'vint' requires whole numbers as input.") } vint[[i]] <- as.array(vint[[i]]) } c(out) <- vint } if (length(out)) { resp <- usc(combine_prefix(x)) out <- setNames(out, paste0(names(out), resp)) } out } # data specific for mixture models data_mixture <- function(bterms, prior = brmsprior()) { stopifnot(is.brmsterms(bterms)) out <- list() if (is.mixfamily(bterms$family)) { families <- family_names(bterms$family) dp_classes <- dpar_class(names(c(bterms$dpars, bterms$fdpars))) if (!any(dp_classes %in% "theta")) { # estimate mixture probabilities directly take <- find_rows(prior, class = "theta", resp = bterms$resp) theta_prior <- prior$prior[take] if (isTRUE(nzchar(theta_prior))) { theta_prior <- eval_dirichlet(theta_prior) if (length(theta_prior) != length(families)) { stop2("Invalid dirichlet prior for the ", "mixture probabilities 'theta'.") } out$con_theta <- theta_prior } else { out$con_theta <- rep(1, length(families)) } p <- usc(combine_prefix(bterms)) names(out) <- paste0(names(out), p) } } out } # data for the baseline functions of Cox models data_bhaz <- function(bterms, data, basis = NULL) { out <- list() if (!is_cox(bterms$family)) { return(out) } y <- model.response(model.frame(bterms$respform, data, na.action = na.pass)) args <- bterms$family$bhaz out$Zbhaz <- bhaz_basis_matrix(y, args, basis = basis) out$Zcbhaz <- bhaz_basis_matrix(y, args, integrate = TRUE, basis = basis) out$Kbhaz <- NCOL(out$Zbhaz) out } # Basis matrices for baseline hazard functions of the Cox model # @param y vector of response values # @param args arguments passed to the spline generating functions # @param integrate compute the I-spline instead of the M-spline basis? # @param basis optional precomputed basis matrix # @return the design matrix of the baseline hazard function bhaz_basis_matrix <- function(y, args = list(), integrate = FALSE, basis = NULL) { require_package("splines2") if (!is.null(basis)) { # perform predictions based on an existing basis matrix stopifnot(inherits(basis, "mSpline")) if (integrate) { # for predictions just the attibutes are required # which are the same of M-Splines and I-Splines class(basis) <- c("matrix", "iSpline") } return(predict(basis, y)) } stopifnot(is.list(args)) args$x <- y if (!is.null(args$intercept)) { args$intercept <- as_one_logical(args$intercept) } if (is.null(args$Boundary.knots)) { if (isTRUE(args$intercept)) { lower_knot <- min(y) upper_knot <- max(y) } else { # we need a smaller lower boundary knot to avoid lp = -Inf # the below choices are ad-hoc and may need further thought lower_knot <- max(min(y) - mad(y, na.rm = TRUE) / 10, 0) upper_knot <- max(y) + mad(y, na.rm = TRUE) / 10 } args$Boundary.knots <- c(lower_knot, upper_knot) } if (integrate) { out <- do_call(splines2::iSpline, args) } else { out <- do_call(splines2::mSpline, args) } out } # extract names of response categories # @param x a brmsterms object or one that can be coerced to it # @param data user specified data # @return a vector of category names extract_cat_names <- function(x, data) { stopifnot(is.brmsformula(x) || is.brmsterms(x)) respform <- validate_resp_formula(x$formula) mr <- model.response(model.frame(respform, data)) if (has_multicol(x)) { mr <- as.matrix(mr) out <- as.character(colnames(mr)) if (!length(out)) { out <- as.character(seq_cols(mr)) } } else { out <- levels(factor(mr)) } out } # extract names of ordinal thresholds # @param x a brmsterms object or one that can be coerced to it # @param data user specified data # @return a data.frame with columns 'thres' and 'group' extract_thres_names <- function(x, data) { stopifnot(is.brmsformula(x) || is.brmsterms(x), has_thres(x)) if (is.null(x$adforms)) { x$adforms <- parse_ad(x$formula, x$family) } nthres <- get_ad_values(x, "thres", "thres", data) if (any(!is_wholenumber(nthres) | nthres < 1L)) { stop2("Number of thresholds must be a positive integer.") } grthres <- get_ad_values(x, "thres", "gr", data) if (!is.null(grthres)) { # grouping variable was specified if (!is_like_factor(grthres)) { stop2("Variable 'gr' in 'thres' needs to be factor-like.") } grthres <- factor(grthres) group <- levels(grthres) if (!length(nthres)) { # extract number of thresholds from the response values nthres <- rep(NA, length(group)) for (i in seq_along(group)) { take <- grthres %in% group[i] nthres[i] <- extract_nthres(x$formula, data[take, , drop = FALSE]) } } else if (length(nthres) == 1L) { # replicate number of thresholds across groups nthres <- rep(nthres, length(group)) } else { # number of thresholds is a variable in the data for (i in seq_along(group)) { # validate values of the same level take <- grthres %in% group[i] if (length(unique(nthres[take])) > 1L) { stop2("Number of thresholds should be unique for each group.") } } nthres <- get_one_value_per_group(nthres, grthres) } group <- rep(rename(group), nthres) thres <- ulapply(unname(nthres), seq_len) } else { # no grouping variable was specified group <- "" if (!length(nthres)) { # extract number of thresholds from the response values nthres <- extract_nthres(x$formula, data) } if (length(nthres) > 1L) { stop2("Number of thresholds needs to be a single value.") } thres <- seq_len(nthres) } data.frame(thres, group, stringsAsFactors = FALSE) } # extract threshold names from the response values # @param formula with the response on the LHS # @param data a data.frame from which to extract responses # @return a single value for the number of thresholds extract_nthres <- function(formula, data) { respform <- validate_resp_formula(formula) mr <- model.response(model.frame(respform, data)) if (is_like_factor(mr)) { out <- length(levels(factor(mr))) - 1 } else { out <- max(mr) - 1 } out } brms/R/data-helpers.R0000644000176200001440000005066613611527526014137 0ustar liggesusers# update data for use in brms functions # @param data the data passed by the user # @param bterms object of class brmsterms # @param na.action function defining how to treat NAs # @param drop.unused.levels should unused factor levels be removed? # @param terms_attr a list of attributes of the terms object of # the original model.frame; only used with newdata; # this ensures that (1) calls to 'poly' work correctly # and (2) that the number of variables matches the number # of variable names; fixes issue #73 # @param knots: a list of knot values for GAMMs # @return model.frame for use in brms functions validate_data <- function(data, bterms, na.action = na.omit2, drop.unused.levels = TRUE, terms_attr = NULL, knots = NULL) { if (missing(data)) { stop2("Data must be specified using the 'data' argument.") } if (isTRUE(attr(data, "brmsframe"))) { return(data) } if (is.null(knots)) { knots <- attr(data, "knots", TRUE) } data <- try(as.data.frame(data), silent = TRUE) if (is(data, "try-error")) { stop2("Argument 'data' must be coercible to a data.frame.") } if (!isTRUE(nrow(data) > 0L)) { stop2("Argument 'data' does not contain observations.") } bterms$allvars <- terms(bterms$allvars) attributes(bterms$allvars)[names(terms_attr)] <- terms_attr data <- data_rsv_intercept(data, bterms = bterms) missing_vars <- setdiff(all.vars(bterms$allvars), names(data)) if (length(missing_vars)) { stop2("The following variables are missing in 'data':\n", collapse_comma(missing_vars)) } for (v in intersect(vars_keep_na(bterms), names(data))) { attr(data[[v]], "keep_na") <- TRUE } data <- model.frame( bterms$allvars, data, na.action = na.action, drop.unused.levels = drop.unused.levels ) if (any(grepl("__|_$", colnames(data)))) { stop2("Variable names may not contain double underscores ", "or underscores at the end.") } groups <- get_group_vars(bterms) data <- combine_groups(data, groups) data <- fix_factor_contrasts(data, ignore = groups) attr(data, "knots") <- knots attr(data, "brmsframe") <- TRUE data } # validate the 'data2' argument # @param data2 a named list of data objects # @param bterms object returned by 'parse_bf' # @param ... more named list to pass objects to data2 from other sources # only required for backwards compatibility with deprecated arguments # @return a validated named list of data objects validate_data2 <- function(data2, bterms, ...) { # TODO: specify spline-related matrices in 'data2' # TODO: specify 'knots' in 'data2'? if (isTRUE(attr(data2, "valid"))) { return(data2) } if (is.null(data2)) { data2 <- list() } if (!is.list(data2)) { stop2("'data2' must be a list.") } if (length(data2) && !is_named(data2)) { stop2("All elements of 'data2' must be named.") } dots <- list(...) for (i in seq_along(dots)) { if (length(dots[[i]])) { stopifnot(is.list(dots[[i]]), is_named(dots[[i]])) data2[names(dots[[i]])] <- dots[[i]] } } # validate autocorrelation matrices acef <- tidy_acef(bterms) sar_M_names <- get_ac_vars(acef, "M", class = "sar") for (M in sar_M_names) { data2[[M]] <- validate_sar_matrix(get_from_data2(M, data2)) attr(data2[[M]], "obs_based_matrix") <- TRUE } car_M_names <- get_ac_vars(acef, "M", class = "car") for (M in car_M_names) { data2[[M]] <- validate_car_matrix(get_from_data2(M, data2)) # observation based CAR matrices are deprecated and # there is no need to label them as observation based } fcor_M_names <- get_ac_vars(acef, "M", class = "fcor") for (M in fcor_M_names) { data2[[M]] <- validate_fcor_matrix(get_from_data2(M, data2)) attr(data2[[M]], "obs_based_matrix") <- TRUE } structure(data2, valid = TRUE) } # get an object from the 'data2' argument get_from_data2 <- function(x, data2) { if (!x %in% names(data2)) { stop2("Object '", x, "' was not found in 'data2'.") } get(x, data2) } # index observation based elements in 'data2' # @param data2 a named list of objects # @param i observation based indices # @return data2 with potentially indexed elements subset_data2 <- function(data2, i) { if (!length(data2)) { return(data2) } stopifnot(is.list(data2), is_named(data2)) for (var in names(data2)) { if (isTRUE(attr(data2[[var]], "obs_based_matrix"))) { # matrices with dimensions equal to the number of observations data2[[var]] <- data2[[var]][i, i, drop = FALSE] attr(data2[[var]], "obs_based_matrix") <- TRUE } } data2 } # add the reserved intercept variables to the data data_rsv_intercept <- function(data, bterms) { fe_forms <- get_effect(bterms, "fe") if (any(ulapply(fe_forms, no_int))) { if ("intercept" %in% ulapply(fe_forms, all_vars)) { warning2("Reserved variable name 'intercept' is deprecated. ", "Please use 'Intercept' instead.") } if (any(data[["intercept"]] != 1)) { stop2("Variable name 'intercept' is reserved in models ", "without a population-level intercept.") } if (any(data[["Intercept"]] != 1)) { stop2("Variable name 'Intercept' is reserved in models ", "without a population-level intercept.") } data$intercept <- data$Intercept <- rep(1, length(data[[1]])) } data } # combine grouping factors to form new variables # @param data data.frame to be updated # @param ... the grouping factors to be combined # @return 'data' including the new combined grouping factors combine_groups <- function(data, ...) { group <- c(...) for (i in seq_along(group)) { sgroup <- unlist(strsplit(group[[i]], ":")) if (length(sgroup) > 1L && !group[[i]] %in% names(data)) { new.var <- get(sgroup[1], data) for (j in 2:length(sgroup)) { new.var <- paste0(new.var, "_", get(sgroup[j], data)) } data[[group[[i]]]] <- new.var } } data } # hard code factor contrasts to be independent of the global "contrasts" option # @param data data.frame to be updated # @param optdata: optional data.frame from which contrasts are taken if present # @param ignore: names of variables for which not to fix contrasts # @return 'data' with amended contrasts attributes fix_factor_contrasts <- function(data, optdata = NULL, ignore = NULL) { stopifnot(is(data, "data.frame")) stopifnot(is.null(optdata) || is.list(optdata)) optdata <- as.data.frame(optdata) # fixes issue #105 for (i in seq_along(data)) { needs_contrast <- is.factor(data[[i]]) && !names(data)[i] %in% ignore if (needs_contrast && is.null(attr(data[[i]], "contrasts"))) { old_contrasts <- attr(optdata[[names(data)[i]]], "contrasts") if (!is.null(old_contrasts)) { # take contrasts from optdata contrasts(data[[i]]) <- old_contrasts } else if (length(unique(data[[i]])) > 1L) { # avoid error when supplying only a single level # hard code current global "contrasts" option contrasts(data[[i]]) <- contrasts(data[[i]]) } } } data } # order data for use in time-series models # @param data data.frame to be ordered # @param bterms brmsterms of mvbrmsterms object # @return 'data' potentially ordered differently order_data <- function(data, bterms) { # ordering does only matter for time-series models time <- get_ac_vars(bterms, "time", dim = "time") gr <- get_ac_vars(bterms, "gr", dim = "time") if (length(time) > 1L || length(gr) > 1L) { stop2("All time-series structures must have the same ", "'time' and 'gr' variables.") } if (length(time) || length(gr)) { if (length(gr)) { gv <- data[[gr]] } else { gv <- rep(1L, nrow(data)) } if (length(time)) { tv <- data[[time]] } else { tv <- seq_rows(data) } if (any(duplicated(data.frame(gv, tv)))) { stop2("Time points within groups must be unique.") } new_order <- do_call(order, list(gv, tv)) data <- data[new_order, , drop = FALSE] # old_order will allow to retrieve the initial order of the data attr(data, "old_order") <- order(new_order) } data } # subset data according to addition argument 'subset' subset_data <- function(data, bterms) { if (is.formula(bterms$adforms$subset)) { # only evaluate a subset of the data subset <- eval_rhs(bterms$adforms$subset) subset <- as.logical(eval2(subset$vars$subset, data)) if (length(subset) != nrow(data)) { stop2("Length of 'subset' does not match the rows of 'data'.") } if (anyNA(subset)) { stop2("Subset variables may not contain NAs.") } data <- data[subset, , drop = FALSE] } if (!NROW(data)) { stop2( "All rows of 'data' were removed via 'subset'. ", "Please make sure that variables do not contain NAs ", "even in rows unused by the subsetted model. ", "Please also make sure that each subset variable is ", "TRUE for at least one observation." ) } data } # get a single value per group # @param x vector of values to extract one value per group # @param gr vector of grouping values # @return a vector of the same length as unique(group) get_one_value_per_group <- function(x, gr) { stopifnot(length(x) == length(gr)) not_dupl_gr <- !duplicated(gr) gr_unique <- gr[not_dupl_gr] to_order <- order(gr_unique) gr_unique <- gr_unique[to_order] out <- x[not_dupl_gr][to_order] names(out) <- gr_unique out } #' Validate New Data #' #' Validate new data passed to post-processing methods of \pkg{brms}. Unless you #' are a package developer, you will rarely need to call \code{validate_newdata} #' directly. #' #' @inheritParams extract_draws #' @param newdata A \code{data.frame} containing new data to be validated. #' @param object A \code{brmsfit} object. #' @param check_response Logical; Indicates if response variables should #' be checked as well. Defaults to \code{TRUE}. #' @param all_group_vars Optional names of grouping variables to be validated. #' Defaults to all grouping variables in the model. #' @param ... Currently ignored. #' #' @return A validated \code{'data.frame'} based on \code{newdata}. #' #' @export validate_newdata <- function( newdata, object, re_formula = NULL, allow_new_levels = FALSE, resp = NULL, check_response = TRUE, incl_autocor = TRUE, all_group_vars = NULL, ... ) { if (is.null(newdata)) { newdata <- structure(object$data, valid = TRUE, old = TRUE) } if (isTRUE(attr(newdata, "valid"))) { return(newdata) } newdata <- try(as.data.frame(newdata), silent = TRUE) if (is(newdata, "try-error")) { stop2("Argument 'newdata' must be coercible to a data.frame.") } newdata <- rm_attr(newdata, c("terms", "brmsframe")) object <- restructure(object) object <- exclude_terms(object, incl_autocor = incl_autocor) resp <- validate_resp(resp, object) new_formula <- update_re_terms(formula(object), re_formula) bterms <- parse_bf(new_formula, resp_rhs_all = FALSE) if (is.mvbrmsterms(bterms) && !is.null(resp)) { # variables not used in the included model parts # do not need to be specified in newdata resp <- validate_resp(resp, bterms$responses) reqvars <- allvars_formula(lapply(bterms$terms[resp], "[[", "allvars")) not_reqvars <- setdiff(all.vars(bterms$allvars), all.vars(reqvars)) not_reqvars <- setdiff(not_reqvars, names(newdata)) if (length(not_reqvars)) { newdata[, not_reqvars] <- NA } } only_resp <- all.vars(bterms$respform) only_resp <- setdiff(only_resp, all.vars(rhs(bterms$allvars))) # always require 'dec' variables to be specified dec_vars <- get_ad_vars(bterms, "dec") missing_resp <- setdiff(c(only_resp, dec_vars), names(newdata)) if (length(missing_resp)) { if (check_response) { stop2("Response variables must be specified in 'newdata'.\n", "Missing variables: ", collapse_comma(missing_resp)) } else { newdata[, missing_resp] <- NA } } # censoring and weighting vars are unused in post-processing methods cens_vars <- get_ad_vars(bterms, "cens") for (v in setdiff(cens_vars, names(newdata))) { newdata[[v]] <- 0 } weights_vars <- get_ad_vars(bterms, "weights") for (v in setdiff(weights_vars, names(newdata))) { newdata[[v]] <- 1 } mf <- model.frame(object) for (i in seq_along(mf)) { if (is_like_factor(mf[[i]])) { mf[[i]] <- as.factor(mf[[i]]) } } # fixes issue #279 newdata <- data_rsv_intercept(newdata, bterms) new_group_vars <- get_group_vars(bterms) if (allow_new_levels && length(new_group_vars)) { # grouping factors do not need to be specified # by the user if new levels are allowed mis_group_vars <- new_group_vars[!grepl(":", new_group_vars)] mis_group_vars <- setdiff(mis_group_vars, names(newdata)) newdata[, mis_group_vars] <- NA } newdata <- combine_groups(newdata, new_group_vars) # validate factor levels in newdata if (is.null(all_group_vars)) { all_group_vars <- get_group_vars(object) } dont_check <- c(all_group_vars, cens_vars) dont_check <- names(mf) %in% dont_check is_factor <- ulapply(mf, is.factor) factors <- mf[is_factor & !dont_check] if (length(factors)) { factor_names <- names(factors) for (i in seq_along(factors)) { new_factor <- newdata[[factor_names[i]]] if (!is.null(new_factor)) { if (!is.factor(new_factor)) { new_factor <- factor(new_factor) } new_levels <- levels(new_factor) old_levels <- levels(factors[[i]]) old_contrasts <- contrasts(factors[[i]]) old_ordered <- is.ordered(factors[[i]]) to_zero <- is.na(new_factor) | new_factor %in% "zero__" # don't add the 'zero__' level to response variables is_resp <- factor_names[i] %in% all.vars(bterms$respform) if (!is_resp && any(to_zero)) { levels(new_factor) <- c(new_levels, "zero__") new_factor[to_zero] <- "zero__" old_levels <- c(old_levels, "zero__") old_contrasts <- rbind(old_contrasts, zero__ = 0) } if (any(!new_levels %in% old_levels)) { stop2( "New factor levels are not allowed.", "\nLevels allowed: ", collapse_comma(old_levels), "\nLevels found: ", collapse_comma(new_levels) ) } newdata[[factor_names[i]]] <- factor(new_factor, old_levels, ordered = old_ordered) # don't use contrasts(.) here to avoid dimension checks attr(newdata[[factor_names[i]]], "contrasts") <- old_contrasts } } } # check if originally numeric variables are still numeric num_names <- names(mf)[!is_factor] num_names <- setdiff(num_names, all_group_vars) for (nm in intersect(num_names, names(newdata))) { if (!anyNA(newdata[[nm]]) && !is.numeric(newdata[[nm]])) { stop2("Variable '", nm, "' was originally ", "numeric but is not in 'newdata'.") } } # validate monotonic variables mo_vars <- get_sp_vars(bterms, "mo") if (length(mo_vars)) { # factors have already been checked num_mo_vars <- names(mf)[!is_factor & names(mf) %in% mo_vars] for (v in num_mo_vars) { new_values <- get(v, newdata) min_value <- min(mf[[v]]) invalid <- new_values < min_value | new_values > max(mf[[v]]) invalid <- invalid | !is_wholenumber(new_values) if (sum(invalid)) { stop2("Invalid values in variable '", v, "': ", collapse_comma(new_values[invalid])) } attr(newdata[[v]], "min") <- min_value } } # update_data expects all original variables to be present used_vars <- c(names(newdata), all.vars(bterms$allvars)) used_vars <- union(used_vars, rsv_vars(bterms)) all_vars <- all.vars(str2formula(names(mf))) unused_vars <- setdiff(all_vars, used_vars) if (length(unused_vars)) { newdata[, unused_vars] <- NA } # validate grouping factors new_ranef <- tidy_ranef(bterms, data = mf) new_meef <- tidy_meef(bterms, data = mf) old_levels <- get_levels(new_ranef, new_meef) if (!allow_new_levels) { new_levels <- get_levels( tidy_ranef(bterms, data = newdata), tidy_meef(bterms, data = newdata) ) for (g in names(old_levels)) { unknown_levels <- setdiff(new_levels[[g]], old_levels[[g]]) if (length(unknown_levels)) { unknown_levels <- collapse_comma(unknown_levels) stop2( "Levels ", unknown_levels, " of grouping factor '", g, "' ", "cannot be found in the fitted model. ", "Consider setting argument 'allow_new_levels' to TRUE." ) } } } structure(newdata, valid = TRUE) } # TODO: refactor preparation and storage of old standata # helper function for validate_newdata to extract # old standata required for the computation of new standata extract_old_standata <- function(x, data, ...) { UseMethod("extract_old_standata") } #' @export extract_old_standata.default <- function(x, data, ...) { NULL } #' @export extract_old_standata.mvbrmsterms <- function(x, data, ...) { out <- named_list(names(x$responses)) for (i in seq_along(out)) { out[[i]] <- extract_old_standata(x$terms[[i]], data, ...) } out } #' @export extract_old_standata.brmsterms <- function(x, data, ...) { out <- named_list(c(names(x$dpars), names(x$nlpars))) data <- subset_data(data, x) for (dp in names(x$dpars)) { out[[dp]] <- extract_old_standata(x$dpars[[dp]], data, ...) } for (nlp in names(x$nlpars)) { out[[nlp]] <- extract_old_standata(x$nlpars[[nlp]], data, ...) } if (has_trials(x$family)) { # trials should not be computed based on new data datr <- data_response(x, data, check_response = FALSE, internal = TRUE) # partially match via $ to be independent of the response suffix out$trials <- datr$trials } if (is_binary(x$family) || is_categorical(x$family)) { Y <- model.response(model.frame(x$respform, data, na.action = na.pass)) out$resp_levels <- levels(as.factor(Y)) } if (is_cox(x$family)) { # compute basis matrix of the baseline hazard for the Cox model datr <- data_response(x, data, check_response = FALSE, internal = TRUE) out$bhaz_basis <- bhaz_basis_matrix(datr$Y, args = x$family$bhaz) } out } #' @export extract_old_standata.btnl <- function(x, data, ...) { NULL } #' @export extract_old_standata.btl <- function(x, data, ...) { out <- list() out$smooths <- make_sm_list(x, data, ...) out$gps <- make_gp_list(x, data, ...) out$Jmo <- make_Jmo_list(x, data, ...) if (has_ac_class(x, "car")) { gr <- get_ac_vars(x, "gr", class = "car") stopifnot(length(gr) <= 1L) if (isTRUE(nzchar(gr))) { out$locations <- levels(factor(get(gr, data))) } else { out$locations <- NA } } out } # extract data related to smooth terms # for use in extract_old_standata # @param version optional brms version number make_sm_list <- function(x, data, version = NULL, ...) { stopifnot(is.btl(x)) smterms <- all_terms(x[["sm"]]) out <- named_list(smterms) if (length(smterms)) { knots <- attr(data, "knots") data <- rm_attr(data, "terms") # the spline penality has changed in 2.8.7 (#646) diagonal.penalty <- !isTRUE(version <= "2.8.6") gam_args <- list( data = data, knots = knots, absorb.cons = TRUE, modCon = 3, diagonal.penalty = diagonal.penalty ) for (i in seq_along(smterms)) { sc_args <- c(list(eval2(smterms[i])), gam_args) out[[i]] <- do_call(smoothCon, sc_args) } } out } # extract data related to gaussian processes # for use in extract_old_standata make_gp_list <- function(x, data, ...) { stopifnot(is.btl(x)) out <- data_gp(x, data, raw = TRUE) out <- out[grepl("^(dmax)|(cmeans)", names(out))] out } # extract data related to monotonic effects # for use in extract_old_standata make_Jmo_list <- function(x, data, ...) { stopifnot(is.btl(x)) out <- NULL if (length(attr(x$sp, "uni_mo"))) { # do it like data_sp() spef <- tidy_spef(x, data) Xmo <- lapply(unlist(spef$calls_mo), get_mo_values, data = data) out <- as.array(ulapply(Xmo, max)) } out } brms/R/extract_draws.R0000644000176200001440000012645313623751345014437 0ustar liggesusers#' @export #' @rdname extract_draws extract_draws.brmsfit <- function(x, newdata = NULL, re_formula = NULL, allow_new_levels = FALSE, sample_new_levels = "uncertainty", incl_autocor = TRUE, oos = NULL, resp = NULL, nsamples = NULL, subset = NULL, nug = NULL, smooths_only = FALSE, offset = TRUE, newdata2 = NULL, new_objects = NULL, point = NULL, ...) { snl_options <- c("uncertainty", "gaussian", "old_levels") sample_new_levels <- match.arg(sample_new_levels, snl_options) warn_brmsfit_multiple(x, newdata = newdata) newdata2 <- use_alias(newdata2, new_objects) x <- restructure(x) x <- exclude_terms( x, incl_autocor = incl_autocor, offset = offset, smooths_only = smooths_only ) resp <- validate_resp(resp, x) subset <- subset_samples(x, subset, nsamples) samples <- as.matrix(x, subset = subset) samples <- point_samples(samples, point = point) # prepare (new) data and stan data newdata <- validate_newdata( newdata, object = x, re_formula = re_formula, resp = resp, allow_new_levels = allow_new_levels, newdata2 = newdata2, ... ) new <- !isTRUE(attr(newdata, "old")) sdata <- standata( x, newdata = newdata, re_formula = re_formula, newdata2 = newdata2, resp = resp, allow_new_levels = allow_new_levels, internal = TRUE, ... ) new_formula <- update_re_terms(x$formula, re_formula) bterms <- parse_bf(new_formula) ranef <- tidy_ranef(bterms, x$data) meef <- tidy_meef(bterms, x$data) old_sdata <- trunc_bounds <- NULL if (new) { # extract_draws_re() also requires the levels from newdata # original level names are already passed via old_ranef used_levels <- attr(tidy_ranef(bterms, newdata), "levels") attr(ranef, "levels") <- used_levels if (length(get_effect(bterms, "gp"))) { # GPs for new data require the original data as well old_sdata <- standata(x, internal = TRUE, ...) } if (length(get_effect(bterms, "sp"))) { # truncation bounds for imputing missing values in new data trunc_bounds <- trunc_bounds(bterms, data = newdata, incl_family = TRUE) } } draws_ranef <- extract_draws_ranef( ranef = ranef, samples = samples, sdata = sdata, resp = resp, old_ranef = x$ranef, sample_new_levels = sample_new_levels, ) extract_draws( bterms, samples = samples, sdata = sdata, data = x$data, draws_ranef = draws_ranef, meef = meef, resp = resp, sample_new_levels = sample_new_levels, nug = nug, new = new, oos = oos, stanvars = names(x$stanvars), old_sdata = old_sdata, trunc_bounds = trunc_bounds ) } extract_draws.mvbrmsterms <- function(x, samples, sdata, resp = NULL, ...) { resp <- validate_resp(resp, x$responses) if (length(resp) > 1) { if (has_subset(x)) { stop2("Argument 'resp' must be a single variable name ", "for models using addition argument 'subset'.") } draws <- list(nsamples = nrow(samples), nobs = sdata$N) draws$resps <- named_list(resp) draws$old_order <- attr(sdata, "old_order") for (r in resp) { draws$resps[[r]] <- extract_draws( x$terms[[r]], samples = samples, sdata = sdata, ... ) } if (x$rescor) { draws$family <- draws$resps[[1]]$family draws$family$fun <- paste0(draws$family$family, "_mv") rescor <- get_cornames(resp, type = "rescor", brackets = FALSE) draws$mvpars$rescor <- get_samples(samples, rescor, fixed = TRUE) if (draws$family$family == "student") { # store in draws$dpars so that get_dpar can be called on nu draws$dpars$nu <- as.vector(get_samples(samples, "^nu$")) } draws$data$N <- draws$resps[[1]]$data$N draws$data$weights <- draws$resps[[1]]$data$weights Y <- lapply(draws$resps, function(x) x$data$Y) draws$data$Y <- do_call(cbind, Y) } draws <- structure(draws, class = "mvbrmsdraws") } else { draws <- extract_draws( x$terms[[resp]], samples = samples, sdata = sdata, ... ) } draws } #' @export extract_draws.brmsterms <- function(x, samples, sdata, data, ...) { data <- subset_data(data, x) nsamples <- nrow(samples) nobs <- sdata[[paste0("N", usc(x$resp))]] resp <- usc(combine_prefix(x)) draws <- nlist(nsamples, nobs, resp = x$resp) draws$family <- prepare_family(x) draws$old_order <- attr(sdata, "old_order") valid_dpars <- valid_dpars(x) draws$dpars <- named_list(valid_dpars) for (dp in valid_dpars) { dp_regex <- paste0("^", dp, resp, "$") if (is.btl(x$dpars[[dp]]) || is.btnl(x$dpars[[dp]])) { draws$dpars[[dp]] <- extract_draws( x$dpars[[dp]], samples = samples, sdata = sdata, data = data, ... ) } else if (is.numeric(x$fdpars[[dp]]$value)) { draws$dpars[[dp]] <- x$fdpars[[dp]]$value } else if (any(grepl(dp_regex, colnames(samples)))) { draws$dpars[[dp]] <- as.vector(get_samples(samples, dp_regex)) } } draws$nlpars <- named_list(names(x$nlpars)) for (nlp in names(x$nlpars)) { draws$nlpars[[nlp]] <- extract_draws( x$nlpars[[nlp]], samples = samples, sdata = sdata, data = data, ... ) } if (is.mixfamily(x$family)) { families <- family_names(x$family) thetas <- paste0("theta", seq_along(families)) if (any(ulapply(draws$dpars[thetas], is.list))) { # theta was predicted missing_id <- which(ulapply(draws$dpars[thetas], is.null)) draws$dpars[[paste0("theta", missing_id)]] <- structure( as_draws_matrix(0, c(nsamples, nobs)), predicted = TRUE ) } else { # theta was not predicted draws$dpars$theta <- do_call(cbind, draws$dpars[thetas]) draws$dpars[thetas] <- NULL if (nrow(draws$dpars$theta) == 1L) { dim <- c(nrow(samples), ncol(draws$dpars$theta)) draws$dpars$theta <- as_draws_matrix(draws$dpars$theta, dim = dim) } } } if (is_ordinal(x$family)) { # it is better to handle ordinal thresholds outside the # main predictor term in particular for use in custom families if (is.mixfamily(x$family)) { mu_pars <- str_subset(names(x$dpars), "^mu[[:digit:]]+") for (mu in mu_pars) { draws$thres[[mu]] <- extract_draws_thres(x$dpars[[mu]], samples, sdata, ...) } } else { draws$thres <- extract_draws_thres(x$dpars$mu, samples, sdata, ...) } } if (is_cox(x$family)) { # prepare baseline hazard functions for the Cox model if (is.mixfamily(x$family)) { mu_pars <- str_subset(names(x$dpars), "^mu[[:digit:]]+") for (mu in mu_pars) { draws$bhaz[[mu]] <- extract_draws_bhaz( x$dpars[[mu]], samples, sdata, ... ) } } else { draws$bhaz <- extract_draws_bhaz(x$dpars$mu, samples, sdata, ...) } } # response category names for categorical and ordinal models draws$cats <- get_cats(x) # only include those autocor samples on the top-level # of draws which imply covariance matrices on natural residuals draws$ac <- extract_draws_ac(x$dpars$mu, samples, sdata, nat_cov = TRUE, ...) draws$data <- extract_draws_data(x, sdata = sdata, data = data, ...) structure(draws, class = "brmsdraws") } #' @export extract_draws.btnl <- function(x, samples, sdata, ...) { draws <- list( family = x$family, nlform = x$formula[[2]], nsamples = nrow(samples), nobs = sdata[[paste0("N", usc(x$resp))]], used_nlpars = x$used_nlpars ) class(draws) <- "bdrawsnl" p <- usc(combine_prefix(x)) covars <- all.vars(x$covars) dim <- c(draws$nsamples, draws$nobs) for (i in seq_along(covars)) { cvalues <- sdata[[paste0("C", p, "_", i)]] draws$C[[covars[i]]] <- as_draws_matrix(cvalues, dim = dim) } draws } #' @export extract_draws.btl <- function(x, samples, sdata, ...) { nsamples <- nrow(samples) nobs <- sdata[[paste0("N", usc(x$resp))]] draws <- nlist(family = x$family, nsamples, nobs) class(draws) <- "bdrawsl" draws$fe <- extract_draws_fe(x, samples, sdata, ...) draws$sp <- extract_draws_sp(x, samples, sdata, ...) draws$cs <- extract_draws_cs(x, samples, sdata, ...) draws$sm <- extract_draws_sm(x, samples, sdata, ...) draws$gp <- extract_draws_gp(x, samples, sdata, ...) draws$re <- extract_draws_re(x, sdata, ...) draws$ac <- extract_draws_ac(x, samples, sdata, nat_cov = FALSE, ...) draws$offset <- extract_draws_offset(x, sdata, ...) draws } # extract draws of ordinary population-level effects extract_draws_fe <- function(bterms, samples, sdata, ...) { draws <- list() p <- usc(combine_prefix(bterms)) X <- sdata[[paste0("X", p)]] fixef <- colnames(X) if (length(fixef)) { draws$X <- X b_pars <- paste0("b", p, "_", fixef) draws$b <- get_samples(samples, b_pars, fixed = TRUE) } draws } # extract draws of special effects terms extract_draws_sp <- function(bterms, samples, sdata, data, meef = empty_meef(), new = FALSE, trunc_bounds = NULL, ...) { draws <- list() spef <- tidy_spef(bterms, data) if (!nrow(spef)) return(draws) p <- usc(combine_prefix(bterms)) resp <- usc(bterms$resp) # prepare calls evaluated in sp_predictor draws$calls <- vector("list", nrow(spef)) for (i in seq_along(draws$calls)) { call <- spef$joint_call[[i]] if (!is.null(spef$calls_mo[[i]])) { new_mo <- paste0(".mo(simo_", spef$Imo[[i]], ", Xmo_", spef$Imo[[i]], ")") call <- rename(call, spef$calls_mo[[i]], new_mo) } if (!is.null(spef$calls_me[[i]])) { new_me <- paste0("Xme_", seq_along(meef$term)) call <- rename(call, meef$term, new_me) } if (!is.null(spef$calls_mi[[i]])) { new_mi <- paste0("Yl_", spef$vars_mi[[i]]) call <- rename(call, spef$calls_mi[[i]], new_mi) } if (spef$Ic[i] > 0) { str_add(call) <- paste0(" * Csp_", spef$Ic[i]) } draws$calls[[i]] <- parse(text = paste0(call)) } # extract general data and parameters for special effects bsp_pars <- paste0("bsp", p, "_", spef$coef) draws$bsp <- get_samples(samples, bsp_pars, fixed = TRUE) colnames(draws$bsp) <- spef$coef # prepare draws specific to monotonic effects simo_coef <- get_simo_labels(spef) Jmo <- sdata[[paste0("Jmo", p)]] draws$simo <- draws$Xmo <- named_list(simo_coef) for (i in seq_along(simo_coef)) { J <- seq_len(Jmo[i]) simo_par <- paste0("simo", p, "_", simo_coef[i], "[", J, "]") draws$simo[[i]] <- get_samples(samples, simo_par, fixed = TRUE) draws$Xmo[[i]] <- sdata[[paste0("Xmo", p, "_", i)]] } # prepare draws specific to noise-free effects warn_me <- FALSE if (nrow(meef)) { save_mevars <- any(grepl("^Xme_", colnames(samples))) warn_me <- warn_me || !new && !save_mevars draws$Xme <- named_list(meef$coef) Xme_pars <- paste0("Xme_", escape_all(meef$coef), "\\[") Xn <- sdata[paste0("Xn_", seq_rows(meef))] noise <- sdata[paste0("noise_", seq_rows(meef))] groups <- unique(meef$grname) for (i in seq_along(groups)) { g <- groups[i] K <- which(meef$grname %in% g) if (nzchar(g)) { Jme <- sdata[[paste0("Jme_", i)]] } if (!new && save_mevars) { # extract original samples of latent variables for (k in K) { draws$Xme[[k]] <- get_samples(samples, Xme_pars[k]) } } else { # sample new values of latent variables if (nzchar(g)) { # represent all indices between 1 and length(unique(Jme)) Jme <- as.numeric(factor(Jme)) me_dim <- c(nrow(draws$bsp), max(Jme)) } else { me_dim <- c(nrow(draws$bsp), sdata$N) } for (k in K) { dXn <- as_draws_matrix(Xn[[k]], me_dim) dnoise <- as_draws_matrix(noise[[k]], me_dim) draws$Xme[[k]] <- array(rnorm(prod(me_dim), dXn, dnoise), me_dim) remove(dXn, dnoise) } } if (nzchar(g)) { for (k in K) { draws$Xme[[k]] <- draws$Xme[[k]][, Jme, drop = FALSE] } } } } # prepare draws specific to missing value variables dim <- c(nrow(draws$bsp), sdata[[paste0("N", resp)]]) vars_mi <- unique(unlist(spef$vars_mi)) if (length(vars_mi)) { # we know at this point that the model is multivariate Yl_names <- paste0("Yl_", vars_mi) draws$Yl <- named_list(Yl_names) for (i in seq_along(draws$Yl)) { vmi <- vars_mi[i] Y <- as_draws_matrix(sdata[[paste0("Y_", vmi)]], dim) sdy <- sdata[[paste0("noise_", vmi)]] if (is.null(sdy)) { # missings only draws$Yl[[i]] <- Y if (!new) { Ymi_pars <- paste0("Ymi_", vmi, "\\[") Ymi <- get_samples(samples, Ymi_pars) Jmi <- sdata[[paste0("Jmi_", vmi)]] draws$Yl[[i]][, Jmi] <- Ymi } } else { # measurement-error in the response save_mevars <- any(grepl("^Yl_", colnames(samples))) if (save_mevars && !new) { Yl_pars <- paste0("Yl_", vmi, "\\[") draws$Yl[[i]] <- get_samples(samples, Yl_pars) } else { warn_me <- warn_me || !new sdy <- as_draws_matrix(sdy, dim) draws$Yl[[i]] <- rcontinuous( n = prod(dim), dist = "norm", mean = Y, sd = sdy, lb = trunc_bounds[[vmi]]$lb, ub = trunc_bounds[[vmi]]$ub ) draws$Yl[[i]] <- array(draws$Yl[[i]], dim) } } } } if (warn_me) { warning2( "Noise-free variables were not saved. Please set ", "argument 'save_mevars' to TRUE when fitting your model. ", "Treating original data as if it was new data as a workaround." ) } # prepare covariates ncovars <- max(spef$Ic) for (i in seq_len(ncovars)) { draws$Csp[[i]] <- sdata[[paste0("Csp", p, "_", i)]] draws$Csp[[i]] <- as_draws_matrix(draws$Csp[[i]], dim = dim) } draws } # extract draws of category specific effects extract_draws_cs <- function(bterms, samples, sdata, data, ...) { draws <- list() if (!is_ordinal(bterms$family)) { return(draws) } resp <- usc(bterms$resp) draws$nthres <- sdata[[paste0("nthres", resp)]] csef <- colnames(get_model_matrix(bterms$cs, data)) if (length(csef)) { p <- usc(combine_prefix(bterms)) cs_pars <- paste0("^bcs", p, "_", csef, "\\[") draws$bcs <- get_samples(samples, cs_pars) draws$Xcs <- sdata[[paste0("Xcs", p)]] } draws } # extract draws of smooth terms extract_draws_sm <- function(bterms, samples, sdata, data, ...) { draws <- list() smef <- tidy_smef(bterms, data) if (!NROW(smef)) { return(draws) } p <- usc(combine_prefix(bterms)) Xs_names <- attr(smef, "Xs_names") if (length(Xs_names)) { draws$fe$Xs <- sdata[[paste0("Xs", p)]] # allow for "b_" prefix for compatibility with version <= 2.5.0 bspars <- paste0("^bs?", p, "_", escape_all(Xs_names), "$") draws$fe$bs <- get_samples(samples, bspars) } draws$re <- named_list(smef$label) for (i in seq_rows(smef)) { sm <- list() for (j in seq_len(smef$nbases[i])) { sm$Zs[[j]] <- sdata[[paste0("Zs", p, "_", i, "_", j)]] spars <- paste0("^s", p, "_", smef$label[i], "_", j, "\\[") sm$s[[j]] <- get_samples(samples, spars) } draws$re[[i]] <- sm } draws } # extract draws for Gaussian processes # @param new is new data used? # @param nug small numeric value to avoid numerical problems in GPs extract_draws_gp <- function(bterms, samples, sdata, data, new = FALSE, nug = NULL, old_sdata = NULL, ...) { gpef <- tidy_gpef(bterms, data) if (!nrow(gpef)) { return(list()) } if (new) { stopifnot(!is.null(old_sdata)) } p <- usc(combine_prefix(bterms)) if (is.null(nug)) { nug <- ifelse(new, 1e-8, 1e-11) } draws <- named_list(gpef$label) for (i in seq_along(draws)) { cons <- gpef$cons[[i]] if (length(cons)) { gp <- named_list(cons) for (j in seq_along(cons)) { gp[[j]] <- .extract_draws_gp( gpef, samples = samples, sdata = sdata, old_sdata = old_sdata, nug = nug, new = new, byj = j, p = p, i = i ) } attr(gp, "byfac") <- TRUE } else { gp <- .extract_draws_gp( gpef, samples = samples, sdata = sdata, old_sdata = old_sdata, nug = nug, new = new, p = p, i = i ) } draws[[i]] <- gp } draws } # extract draws for Gaussian processes # @param gpef output of tidy_gpef # @param p prefix created by combine_prefix() # @param i indiex of the Gaussian process # @param byj index for the contrast of a categorical 'by' variable # @return a list to be evaluated by .predictor_gp() .extract_draws_gp <- function(gpef, samples, sdata, old_sdata, nug, new, p, i, byj = NULL) { sfx1 <- escape_all(gpef$sfx1[[i]]) sfx2 <- escape_all(gpef$sfx2[[i]]) if (is.null(byj)) { lvl <- "" } else { lvl <- gpef$bylevels[[i]][byj] sfx1 <- sfx1[byj] sfx2 <- sfx2[byj, ] } j <- usc(byj) pi <- paste0(p, "_", i) gp <- list() sdgp <- paste0("^sdgp", p, "_", sfx1, "$") gp$sdgp <- as.vector(get_samples(samples, sdgp)) lscale <- paste0("^lscale", p, "_", sfx2, "$") gp$lscale <- get_samples(samples, lscale) zgp_regex <- paste0("^zgp", p, "_", sfx1, "\\[") gp$zgp <- get_samples(samples, zgp_regex) Xgp_name <- paste0("Xgp", pi, j) Igp_name <- paste0("Igp", pi, j) Jgp_name <- paste0("Jgp", pi, j) if (new && isNA(gpef$k[i])) { # approximate GPs don't differentiate between new and old data gp$x <- old_sdata[[Xgp_name]] gp$nug <- 1e-11 # computing GPs for new data requires the old GP terms gp$yL <- .predictor_gp(gp) gp$x_new <- sdata[[Xgp_name]] gp$Igp <- sdata[[Igp_name]] } else { gp$x <- sdata[[Xgp_name]] gp$Igp <- sdata[[Igp_name]] if (!isNA(gpef$k[i])) { gp$slambda <- sdata[[paste0("slambda", pi, j)]] } } gp$Jgp <- sdata[[Jgp_name]] # possible factor from 'by' variable gp$Cgp <- sdata[[paste0("Cgp", pi, j)]] gp$nug <- nug gp } # extract draws for all group level effects # needs to be separate from 'extract_draws_re' to take correlations # across responses and distributional parameters into account (#779) # @param ranef output of 'tidy_ranef' based on the new formula # and old data but storing levels obtained from new data # @param old_ranef same as 'ranef' but based on the original formula # @return a named list with one element per group containing posterior draws # of levels used in the data as well as additional meta-data extract_draws_ranef <- function(ranef, samples, sdata, old_ranef, resp = NULL, sample_new_levels = "uncertainty", ...) { if (!nrow(ranef)) { return(list()) } # ensures subsetting 'ranef' by 'resp' works correctly resp <- resp %||% "" groups <- unique(ranef$group) out <- named_list(groups, list()) for (g in groups) { # prepare general variables related to group g ranef_g <- subset2(ranef, group = g) old_ranef_g <- subset2(old_ranef, group = g) used_levels <- attr(ranef, "levels")[[g]] old_levels <- attr(old_ranef, "levels")[[g]] nlevels <- length(old_levels) nranef <- nrow(ranef_g) # prepare samples of group-level effects rpars <- paste0("^r_", g, "(__.+)?\\[") rsamples <- get_samples(samples, rpars) if (!length(rsamples)) { stop2( "Group-level effects of group '", g, "' not found. ", "Please set 'save_ranef' to TRUE when fitting your model." ) } # only extract draws of effects specified in the new formula cols_match <- c("coef", "resp", "dpar", "nlpar") used_rpars <- which(find_rows(old_ranef_g, ls = ranef_g[cols_match])) used_rpars <- outer(seq_len(nlevels), (used_rpars - 1) * nlevels, "+") used_rpars <- as.vector(used_rpars) rsamples <- rsamples[, used_rpars, drop = FALSE] rsamples <- column_to_row_major_order(rsamples, nranef) # prepare data required for indexing parameters gtype <- ranef_g$gtype[1] resp_g <- intersect(ranef_g$resp, resp)[1] # any valid ID works here as J and W are independent of the ID id <- subset2(ranef_g, resp = resp)$id[1] idresp <- paste0(id, usc(resp_g)) if (gtype == "mm") { ngf <- length(ranef_g$gcall[[1]]$groups) gf <- sdata[paste0("J_", idresp, "_", seq_len(ngf))] weights <- sdata[paste0("W_", idresp, "_", seq_len(ngf))] } else { gf <- sdata[paste0("J_", idresp)] weights <- list(rep(1, length(gf[[1]]))) } # generate samples for new levels args_new_rsamples <- nlist( ranef = ranef_g, gf, used_levels, old_levels, rsamples = rsamples, samples, sample_new_levels ) new_rsamples <- do_call(get_new_rsamples, args_new_rsamples) max_level <- attr(new_rsamples, "max_level") gf <- attr(new_rsamples, "gf") rsamples <- cbind(rsamples, new_rsamples) # keep only those levels actually used in the current data levels <- unique(unlist(gf)) rsamples <- subset_levels(rsamples, levels, nranef) # store all information required in 'extract_draws_re' out[[g]]$ranef <- ranef_g out[[g]]$rsamples <- rsamples out[[g]]$levels <- levels out[[g]]$nranef <- nranef out[[g]]$max_level <- max_level out[[g]]$gf <- gf out[[g]]$weights <- weights } out } # extract draws and data of group-level effects # @param draws_ranef a named list with one element per group containing # posterior draws of levels as well as additional meta-data extract_draws_re <- function(bterms, sdata, draws_ranef = list(), sample_new_levels = "uncertainty", ...) { draws <- list() if (!length(draws_ranef)) { return(draws) } px <- check_prefix(bterms) p <- usc(combine_prefix(px)) ranef_px <- lapply(draws_ranef, "[[", "ranef") ranef_px <- do_call(rbind, ranef_px) ranef_px <- subset2(ranef_px, ls = px) if (!NROW(ranef_px)) { return(draws) } groups <- unique(ranef_px$group) # assigning S4 objects requires initialisation of list elements draws[c("Z", "Zsp", "Zcs")] <- list(named_list(groups)) for (g in groups) { # extract variables specific to group 'g' ranef_g <- draws_ranef[[g]]$ranef ranef_g_px <- subset2(ranef_g, ls = px) rsamples <- draws_ranef[[g]]$rsamples nranef <- draws_ranef[[g]]$nranef levels <- draws_ranef[[g]]$levels max_level <- draws_ranef[[g]]$max_level gf <- draws_ranef[[g]]$gf weights <- draws_ranef[[g]]$weights # TODO: define 'select' according to parameter names not by position # store samples and corresponding data in 'draws' # special group-level terms (mo, me, mi) ranef_g_px_sp <- subset2(ranef_g_px, type = "sp") if (nrow(ranef_g_px_sp)) { Z <- matrix(1, length(gf[[1]])) draws[["Zsp"]][[g]] <- prepare_Z(Z, gf, max_level, weights) for (co in ranef_g_px_sp$coef) { # select from all varying effects of that group select <- find_rows(ranef_g, ls = px) & ranef_g$coef == co & ranef_g$type == "sp" select <- which(select) select <- select + nranef * (seq_along(levels) - 1) draws[["rsp"]][[co]][[g]] <- rsamples[, select, drop = FALSE] } } # category specific group-level terms ranef_g_px_cs <- subset2(ranef_g_px, type = "cs") if (nrow(ranef_g_px_cs)) { # all categories share the same Z matrix ranef_g_px_cs_1 <- ranef_g_px_cs[grepl("\\[1\\]$", ranef_g_px_cs$coef), ] Znames <- paste0("Z_", ranef_g_px_cs_1$id, p, "_", ranef_g_px_cs_1$cn) Z <- do_call(cbind, sdata[Znames]) draws[["Zcs"]][[g]] <- prepare_Z(Z, gf, max_level, weights) for (i in seq_len(sdata$nthres)) { index <- paste0("\\[", i, "\\]$") # select from all varying effects of that group select <- find_rows(ranef_g, ls = px) & grepl(index, ranef_g$coef) & ranef_g$type == "cs" select <- which(select) select <- as.vector(outer(select, nranef * (seq_along(levels) - 1), "+")) draws[["rcs"]][[g]][[i]] <- rsamples[, select, drop = FALSE] } } # basic group-level terms ranef_g_px_basic <- subset2(ranef_g_px, type = c("", "mmc")) if (nrow(ranef_g_px_basic)) { Znames <- paste0("Z_", ranef_g_px_basic$id, p, "_", ranef_g_px_basic$cn) if (ranef_g_px_basic$gtype[1] == "mm") { ng <- length(ranef_g_px_basic$gcall[[1]]$groups) Z <- vector("list", ng) for (k in seq_len(ng)) { Z[[k]] <- do_call(cbind, sdata[paste0(Znames, "_", k)]) } } else { Z <- do_call(cbind, sdata[Znames]) } draws[["Z"]][[g]] <- prepare_Z(Z, gf, max_level, weights) # select from all varying effects of that group select <- find_rows(ranef_g, ls = px) & ranef_g$type %in% c("", "mmc") select <- which(select) select <- as.vector(outer(select, nranef * (seq_along(levels) - 1), "+")) draws[["r"]][[g]] <- rsamples[, select, drop = FALSE] } } draws } # extract draws of autocorrelation parameters # @param nat_cov extract terms for covariance matrices of natural residuals? extract_draws_ac <- function(bterms, samples, sdata, oos = NULL, nat_cov = FALSE, new = FALSE, ...) { draws <- list() nat_cov <- as_one_logical(nat_cov) acef <- tidy_acef(bterms) acef <- subset2(acef, nat_cov = nat_cov) if (!NROW(acef)) { return(draws) } draws$acef <- acef p <- usc(combine_prefix(bterms)) draws$N_tg <- sdata[[paste0("N_tg", p)]] if (has_ac_class(acef, "arma")) { acef_arma <- subset2(acef, class = "arma") draws$Y <- sdata[[paste0("Y", p)]] if (!is.null(oos)) { if (any(oos > length(draws$Y))) { stop2("'oos' should not contain integers larger than N.") } # .predictor_arma has special behavior for NA responses draws$Y[oos] <- NA } draws$J_lag <- sdata[[paste0("J_lag", p)]] if (acef_arma$p > 0) { draws$ar <- get_samples(samples, paste0("^ar", p, "\\[")) } if (acef_arma$q > 0) { draws$ma <- get_samples(samples, paste0("^ma", p, "\\[")) } } if (has_ac_class(acef, "cosy")) { draws$cosy <- get_samples(samples, paste0("^cosy", p, "$")) } if (use_ac_cov_time(acef)) { # draws for the covariance structures of time-series models draws$begin_tg <- sdata[[paste0("begin_tg", p)]] draws$end_tg <- sdata[[paste0("end_tg", p)]] if (has_cor_latent_residuals(bterms)) { regex_err <- paste0("^err", p, "\\[") has_err <- any(grepl(regex_err, colnames(samples))) if (has_err && !new) { draws$err <- get_samples(samples, regex_err) } else { # need to sample correlated residuals draws$err <- matrix(nrow = nrow(samples), ncol = length(draws$Y)) draws$sderr <- get_samples(samples, paste0("^sderr", p, "$")) for (i in seq_len(draws$N_tg)) { obs <- with(draws, begin_tg[i]:end_tg[i]) zeros <- rep(0, length(obs)) cov <- get_cov_matrix_ac(list(ac = draws), obs, latent = TRUE) .err <- function(s) rmulti_normal(1, zeros, Sigma = cov[s, , ]) draws$err[, obs] <- rblapply(seq_rows(samples), .err) } } } } if (has_ac_class(acef, "sar")) { draws$lagsar <- get_samples(samples, paste0("^lagsar", p, "$")) draws$errorsar <- get_samples(samples, paste0("^errorsar", p, "$")) draws$Msar <- sdata[[paste0("Msar", p)]] } if (has_ac_class(acef, "car")) { acef_car <- subset2(acef, class = "car") if (new && acef_car$gr == "NA") { stop2("Without a grouping factor, CAR models cannot handle newdata.") } gcar <- sdata[[paste0("Jloc", p)]] Zcar <- matrix(rep(1, length(gcar))) draws$Zcar <- prepare_Z(Zcar, list(gcar)) rcar <- get_samples(samples, paste0("^rcar", p, "\\[")) rcar <- rcar[, unique(gcar), drop = FALSE] draws$rcar <- rcar } if (has_ac_class(acef, "fcor")) { draws$Mfcor <- sdata[[paste0("Mfcor", p)]] } draws } extract_draws_offset <- function(bterms, sdata, ...) { p <- usc(combine_prefix(bterms)) sdata[[paste0("offsets", p)]] } # extract draws of ordinal thresholds extract_draws_thres <- function(bterms, samples, sdata, ...) { draws <- list() if (!is_ordinal(bterms$family)) { return(draws) } resp <- usc(bterms$resp) draws$nthres <- sdata[[paste0("nthres", resp)]] draws$Jthres <- sdata[[paste0("Jthres", resp)]] p <- usc(combine_prefix(bterms)) regex <- paste0("^b", p, "_Intercept\\[") draws$thres <- get_samples(samples, regex) draws } # extract draws of baseline functions for the cox model extract_draws_bhaz <- function(bterms, samples, sdata, ...) { if (!is_cox(bterms$family)) { return(NULL) } out <- list() p <- usc(combine_prefix(bterms)) sbhaz <- get_samples(samples, paste0("^sbhaz", p)) Zbhaz <- sdata[[paste0("Zbhaz", p)]] out$bhaz <- tcrossprod(sbhaz, Zbhaz) Zcbhaz <- sdata[[paste0("Zcbhaz", p)]] out$cbhaz <- tcrossprod(sbhaz, Zcbhaz) out } # extract data mainly related to the response variable # @param stanvars: *names* of variables stored in slot 'stanvars' extract_draws_data <- function(bterms, sdata, data, stanvars = NULL, ...) { resp <- usc(combine_prefix(bterms)) vars <- c( "Y", "trials", "ncat", "nthres", "se", "weights", "dec", "cens", "rcens", "lb", "ub" ) vars <- paste0(vars, resp) vars <- intersect(vars, names(sdata)) # variables of variable length need to be handled via regular expression vl_vars <- c("vreal", "vint") vl_vars <- regex_or(vl_vars) vl_vars <- paste0("^", vl_vars, "[[:digit:]]+", escape_all(resp), "$") vl_vars <- str_subset(names(sdata), vl_vars) vars <- union(vars, vl_vars) draws <- sdata[vars] if (length(stanvars)) { stopifnot(is.character(stanvars)) draws[stanvars] <- sdata[stanvars] } draws } # choose number of observations to be used in post-processing methods choose_N <- function(draws) { stopifnot(is.brmsdraws(draws) || is.mvbrmsdraws(draws)) if (!is.null(draws$ac$N_tg)) draws$ac$N_tg else draws$nobs } # create pseudo brmsdraws objects for components of mixture models # @param comp the mixture component number # @param sample_ids see predict_mixture pseudo_draws_for_mixture <- function(draws, comp, sample_ids = NULL) { stopifnot(is.brmsdraws(draws), is.mixfamily(draws$family)) if (!is.null(sample_ids)) { nsamples <- length(sample_ids) } else { nsamples <- draws$nsamples } out <- list( family = draws$family$mix[[comp]], nsamples = nsamples, nobs = draws$nobs, data = draws$data ) out$family$fun <- out$family$family for (dp in valid_dpars(out$family)) { out$dpars[[dp]] <- draws$dpars[[paste0(dp, comp)]] if (length(sample_ids) && length(out$dpars[[dp]]) > 1L) { out$dpars[[dp]] <- p(out$dpars[[dp]], sample_ids, row = TRUE) } } if (is_ordinal(out$family)) { out$thres <- draws$thres[[paste0("mu", comp)]] } if (is_cox(out$family)) { out$bhaz <- draws$bhaz[[paste0("mu", comp)]] } # weighting should happen after computing the mixture out$data$weights <- NULL structure(out, class = "brmsdraws") } # take relevant cols of a matrix of group-level terms # if only a subset of levels is provided (for newdata) # @param x a matrix typically samples of r or Z design matrices # samples need to be stored in row major order # @param levels grouping factor levels to keep # @param nranef number of group-level effects subset_levels <- function(x, levels, nranef) { take_levels <- ulapply(levels, function(l) ((l - 1) * nranef + 1):(l * nranef) ) x[, take_levels, drop = FALSE] } # transform x from column to row major order # rows represent levels and columns represent effects # @param x a matrix of samples of group-level parameters # @param nranef number of group-level effects column_to_row_major_order <- function(x, nranef) { nlevels <- ncol(x) / nranef sort_levels <- ulapply(seq_len(nlevels), function(l) seq(l, ncol(x), by = nlevels) ) x[, sort_levels, drop = FALSE] } # prepare group-level design matrices for use in 'predictor' # @param Z (list of) matrices to be prepared # @param gf (list of) vectors containing grouping factor values # @param weights optional (list of) weights of the same length as gf # @param max_level maximal level of 'gf' # @return a sparse matrix representation of Z prepare_Z <- function(Z, gf, max_level = NULL, weights = NULL) { if (!is.list(Z)) { Z <- list(Z) } if (!is.list(gf)) { gf <- list(gf) } if (is.null(weights)) { weights <- rep(1, length(gf[[1]])) } if (!is.list(weights)) { weights <- list(weights) } if (is.null(max_level)) { max_level <- max(unlist(gf)) } levels <- unique(unlist(gf)) nranef <- ncol(Z[[1]]) Z <- mapply( expand_matrix, A = Z, x = gf, weights = weights, MoreArgs = nlist(max_level) ) Z <- Reduce("+", Z) subset_levels(Z, levels, nranef) } # expand a matrix into a sparse matrix of higher dimension # @param A matrix to be expanded # @param x levels to expand the matrix # @param max_level maximal number of levels that x can take on # @param weights weights to apply to rows of A before expanding # @param a sparse matrix of dimension nrow(A) x (ncol(A) * max_level) expand_matrix <- function(A, x, max_level = max(x), weights = 1) { stopifnot(is.matrix(A)) stopifnot(length(x) == nrow(A)) stopifnot(all(is_wholenumber(x) & x > 0)) stopifnot(length(weights) %in% c(1, nrow(A), prod(dim(A)))) A <- A * as.vector(weights) K <- ncol(A) i <- rep(seq_along(x), each = K) make_j <- function(n, K, x) K * (x[n] - 1) + 1:K j <- ulapply(seq_along(x), make_j, K = K, x = x) Matrix::sparseMatrix( i = i, j = j, x = as.vector(t(A)), dims = c(nrow(A), ncol(A) * max_level) ) } # generate samples for new group levels # @param ranef 'ranef_frame' object of only a single grouping variable # @param gf list of vectors of level indices in the current data # @param rsamples matrix of group-level samples in row major order # @param used_levels names of levels used in the current data # @param old_levels names of levels used in the original data # @param sample_new_levels specifies the way in which new samples are generated # @param samples optional matrix of samples from all model parameters # @return a matrix of samples for new group levels get_new_rsamples <- function(ranef, gf, rsamples, used_levels, old_levels, sample_new_levels, samples = NULL) { snl_options <- c("uncertainty", "gaussian", "old_levels") sample_new_levels <- match.arg(sample_new_levels, snl_options) g <- unique(ranef$group) stopifnot(length(g) == 1L) stopifnot(is.list(gf)) used_by_per_level <- attr(used_levels, "by") old_by_per_level <- attr(old_levels, "by") new_levels <- setdiff(used_levels, old_levels) nranef <- nrow(ranef) nlevels <- length(old_levels) max_level <- nlevels out <- vector("list", length(gf)) for (i in seq_along(gf)) { has_new_levels <- any(gf[[i]] > nlevels) if (has_new_levels) { if (sample_new_levels %in% c("old_levels", "gaussian")) { new_indices <- sort(setdiff(gf[[i]], seq_len(nlevels))) out[[i]] <- matrix(NA, nrow(rsamples), nranef * length(new_indices)) if (sample_new_levels == "old_levels") { for (j in seq_along(new_indices)) { # choose an existing person to take the parameters from if (length(old_by_per_level)) { new_by <- used_by_per_level[used_levels == new_levels[j]] possible_levels <- old_levels[old_by_per_level == new_by] possible_levels <- which(old_levels %in% possible_levels) take_level <- sample(possible_levels, 1) } else { take_level <- sample(seq_len(nlevels), 1) } for (k in seq_len(nranef)) { take <- (take_level - 1) * nranef + k out[[i]][, (j - 1) * nranef + k] <- rsamples[, take] } } } else if (sample_new_levels == "gaussian") { if (any(!ranef$dist %in% "gaussian")) { stop2("Option sample_new_levels = 'gaussian' is not ", "available for non-gaussian group-level effects.") } for (j in seq_along(new_indices)) { # extract hyperparameters used to compute the covariance matrix if (length(old_by_per_level)) { new_by <- used_by_per_level[used_levels == new_levels[j]] rnames <- as.vector(get_rnames(ranef, bylevels = new_by)) } else { rnames <- get_rnames(ranef) } sd_pars <- paste0("sd_", g, "__", rnames) sd_samples <- get_samples(samples, sd_pars, fixed = TRUE) cor_type <- paste0("cor_", g) cor_pars <- get_cornames(rnames, cor_type, brackets = FALSE) cor_samples <- matrix(0, nrow(sd_samples), length(cor_pars)) for (k in seq_along(cor_pars)) { if (cor_pars[k] %in% colnames(samples)) { cor_samples[, k] <- get_samples( samples, cor_pars[k], fixed = TRUE ) } } cov_matrix <- get_cov_matrix(sd_samples, cor_samples) # sample new levels from the normal distribution # implied by the covariance matrix indices <- ((j - 1) * nranef + 1):(j * nranef) out[[i]][, indices] <- t(apply( cov_matrix, 1, rmulti_normal, n = 1, mu = rep(0, length(sd_pars)) )) } } max_level <- max_level + length(new_indices) } else if (sample_new_levels == "uncertainty") { out[[i]] <- matrix(nrow = nrow(rsamples), ncol = nranef) # selected levels need to be the same for all varying effects # to correctly take their correlations into account sel_levels <- sample(seq_len(nlevels), NROW(rsamples), TRUE) for (k in seq_len(nranef)) { indices <- seq(k, nlevels * nranef, by = nranef) tmp <- rsamples[, indices, drop = FALSE] for (j in seq_rows(tmp)) { out[[i]][j, k] <- tmp[j, sel_levels[j]] } } max_level <- max_level + 1 gf[[i]][gf[[i]] > nlevels] <- max_level } } else { out[[i]] <- matrix(nrow = nrow(rsamples), ncol = 0) } } out <- do_call(cbind, out) structure(out, gf = gf, max_level = max_level) } # extract samples of selected parameters get_samples <- function(x, pars, ...) { pars <- extract_pars(pars, all_pars = colnames(x), ...) x[, pars, drop = FALSE] } # compute point estimates of posterior samples # currently used primarily for 'loo_subsample' # @param samples matrix of posterior samples # @param point optional name of the point estimate to be computed # @return a matrix with one row and as many columns as parameters point_samples <- function(samples, point = NULL) { if (!is.null(point)) { point <- match.arg(point, c("mean", "median")) parnames <- colnames(samples) if (point == "mean") { samples <- matrixStats::colMeans2(samples) } else if (point == "median") { samples <- matrixStats::colMedians(samples) } samples <- t(samples) colnames(samples) <- parnames } samples } is.brmsdraws <- function(x) { inherits(x, "brmsdraws") } is.mvbrmsdraws <- function(x) { inherits(x, "mvbrmsdraws") } is.bdrawsl <- function(x) { inherits(x, "bdrawsl") } is.bdrawsnl <- function(x) { inherits(x, "bdrawsnl") } #' Extract Data and Posterior Draws #' #' This method helps in preparing \pkg{brms} models for certin post-processing #' tasks most notably various forms of predictions. Unless you are a package #' developer, you will rarely need to call \code{extract_draws} directly. #' #' @name extract_draws #' @aliases extract_draws.brmsfit #' #' @param x An \R object typically of class \code{'brmsfit'}. #' @param newdata An optional data.frame for which to evaluate predictions. If #' \code{NULL} (default), the original data of the model is used. #' \code{NA} values within factors are interpreted as if all dummy #' variables of this factor are zero. This allows, for instance, to make #' predictions of the grand mean when using sum coding. #' @param re_formula formula containing group-level effects to be considered in #' the prediction. If \code{NULL} (default), include all group-level effects; #' if \code{NA}, include no group-level effects. #' @param allow_new_levels A flag indicating if new levels of group-level #' effects are allowed (defaults to \code{FALSE}). Only relevant if #' \code{newdata} is provided. #' @param sample_new_levels Indicates how to sample new levels for grouping #' factors specified in \code{re_formula}. This argument is only relevant if #' \code{newdata} is provided and \code{allow_new_levels} is set to #' \code{TRUE}. If \code{"uncertainty"} (default), include group-level #' uncertainty in the predictions based on the variation of the existing #' levels. If \code{"gaussian"}, sample new levels from the (multivariate) #' normal distribution implied by the group-level standard deviations and #' correlations. This options may be useful for conducting Bayesian power #' analysis. If \code{"old_levels"}, directly sample new levels from the #' existing levels. #' @param newdata2 A named \code{list} of objects containing new data, which #' cannot be passed via argument \code{newdata}. Required for some objects #' used in autocorrelation structures, or \code{\link{stanvars}}. #' @param new_objects Deprecated alias of \code{newdata2}. #' @param incl_autocor A flag indicating if correlation structures originally #' specified via \code{autocor} should be included in the predictions. #' Defaults to \code{TRUE}. #' @param offset Logical; Indicates if offsets should be included in the #' predictions. Defaults to \code{TRUE}. #' @param oos Optional indices of observations for which to compute #' out-of-sample rather than in-sample predictions. Only required in models #' that make use of response values to make predictions, that is currently #' only ARMA models. #' @param smooths_only Logical; If \code{TRUE} only draws related to the #' computation of smooth terms will be extracted. #' @param resp Optional names of response variables. If specified, predictions #' are performed only for the specified response variables. #' @param subset A numeric vector specifying the posterior samples to be used. #' If \code{NULL} (the default), all samples are used. #' @param nsamples Positive integer indicating how many posterior samples should #' be used. If \code{NULL} (the default) all samples are used. Ignored if #' \code{subset} is not \code{NULL}. #' @param nug Small positive number for Gaussian process terms only. For #' numerical reasons, the covariance matrix of a Gaussian process might not be #' positive definite. Adding a very small number to the matrix's diagonal #' often solves this problem. If \code{NULL} (the default), \code{nug} is #' chosen internally. #' @param point Shall the returned object contain only point estimates of the #' parameters instead of their posterior samples? Defaults to \code{NULL} in #' which case no point estimate is computed. Alternatively, may be set to #' \code{"mean"} or \code{"median"}. This argument is primarily implemented to #' ensure compatibility with the \code{\link{loo_subsample}} method. #' @param ... Further arguments passed to \code{\link{validate_newdata}}. #' #' @return An object of class \code{'brmsdraws'} or \code{'mvbrmsdraws'}, #' depending on whether a univariate or multivariate model is passed. #' #' @export extract_draws <- function(x, ...) { UseMethod("extract_draws") } #' @export extract_draws.default <- function(x, ...) { NULL } brms/R/brm.R0000644000176200001440000005613713614307002012331 0ustar liggesusers#' Fit Bayesian Generalized (Non-)Linear Multivariate Multilevel Models #' #' Fit Bayesian generalized (non-)linear multivariate multilevel models #' using Stan for full Bayesian inference. A wide range of distributions #' and link functions are supported, allowing users to fit -- among others -- #' linear, robust linear, count data, survival, response times, ordinal, #' zero-inflated, hurdle, and even self-defined mixture models all in a #' multilevel context. Further modeling options include non-linear and #' smooth terms, auto-correlation structures, censored data, meta-analytic #' standard errors, and quite a few more. In addition, all parameters of the #' response distributions can be predicted in order to perform distributional #' regression. Prior specifications are flexible and explicitly encourage #' users to apply prior distributions that actually reflect their beliefs. #' In addition, model fit can easily be assessed and compared with #' posterior predictive checks and leave-one-out cross-validation. #' #' @param formula An object of class \code{\link[stats:formula]{formula}}, #' \code{\link{brmsformula}}, or \code{\link{mvbrmsformula}} (or one that can #' be coerced to that classes): A symbolic description of the model to be #' fitted. The details of model specification are explained in #' \code{\link{brmsformula}}. #' @param data An object of class \code{data.frame} (or one that can be coerced #' to that class) containing data of all variables used in the model. #' @param family A description of the response distribution and link function to #' be used in the model. This can be a family function, a call to a family #' function or a character string naming the family. Every family function has #' a \code{link} argument allowing to specify the link function to be applied #' on the response variable. If not specified, default links are used. For #' details of supported families see \code{\link{brmsfamily}}. By default, a #' linear \code{gaussian} model is applied. In multivariate models, #' \code{family} might also be a list of families. #' @param prior One or more \code{brmsprior} objects created by #' \code{\link{set_prior}} or related functions and combined using the #' \code{c} method or the \code{+} operator. See also \code{\link{get_prior}} #' for more help. #' @param data2 A named \code{list} of objects containing data, which #' cannot be passed via argument \code{data}. Required for some objects #' used in autocorrelation structures to specify dependency structures. #' @param autocor (Deprecated) An optional \code{\link{cor_brms}} object #' describing the correlation structure within the response variable (i.e., #' the 'autocorrelation'). See the documentation of \code{\link{cor_brms}} for #' a description of the available correlation structures. Defaults to #' \code{NULL}, corresponding to no correlations. In multivariate models, #' \code{autocor} might also be a list of autocorrelation structures. #' It is now recommend to specify autocorrelation terms directly #' within \code{formula}. See \code{\link{brmsformula}} for more details. #' @param sparse (Deprecated) Logical; indicates whether the population-level #' design matrices should be treated as sparse (defaults to \code{FALSE}). For #' design matrices with many zeros, this can considerably reduce required #' memory. Sampling speed is currently not improved or even slightly #' decreased. It is now recommended to use the \code{sparse} argument of #' \code{\link{brmsformula}} and related functions. #' @param cov_ranef A list of matrices that are proportional to the (within) #' covariance structure of the group-level effects. The names of the matrices #' should correspond to columns in \code{data} that are used as grouping #' factors. All levels of the grouping factor should appear as rownames of the #' corresponding matrix. This argument can be used, among others to model #' pedigrees and phylogenetic effects. See #' \code{vignette("brms_phylogenetics")} for more details. #' @param save_ranef A flag to indicate if group-level effects for each level of #' the grouping factor(s) should be saved (default is \code{TRUE}). Set to #' \code{FALSE} to save memory. The argument has no impact on the model #' fitting itself. #' @param save_mevars A flag to indicate if samples of latent noise-free #' variables obtained by using \code{me} and \code{mi} terms should be saved #' (default is \code{FALSE}). Saving these samples allows to better use #' methods such as \code{predict} with the latent variables but leads to very #' large \R objects even for models of moderate size and complexity. #' @param save_all_pars A flag to indicate if samples from all variables defined #' in Stan's \code{parameters} block should be saved (default is #' \code{FALSE}). Saving these samples is required in order to apply the #' methods \code{bridge_sampler}, \code{bayes_factor}, and \code{post_prob}. #' @param sample_prior Indicate if samples from priors should be drawn #' additionally to the posterior samples (defaults to \code{"no"}). Among #' others, these samples can be used to calculate Bayes factors for point #' hypotheses via \code{\link{hypothesis}}. Please note that improper priors #' are not sampled, including the default improper priors used by \code{brm}. #' See \code{\link{set_prior}} on how to set (proper) priors. Please also note #' that prior samples for the overall intercept are not obtained by default for #' technical reasons. See \code{\link{brmsformula}} how to obtain prior samples #' for the intercept. If \code{sample_prior} is set to \code{"only"}, samples #' are drawn solely from the priors ignoring the likelihood, which allows among #' others to generate samples from the prior predictive distribution. In this #' case, all parameters must have proper priors. #' @param knots Optional list containing user specified knot values to be used #' for basis construction of smoothing terms. See #' \code{\link[mgcv:gamm]{gamm}} for more details. #' @param stanvars An optional \code{stanvars} object generated by function #' \code{\link{stanvar}} to define additional variables for use in #' \pkg{Stan}'s program blocks. #' @param stan_funs (Deprecated) An optional character string containing #' self-defined \pkg{Stan} functions, which will be included in the functions #' block of the generated \pkg{Stan} code. It is now recommended to use the #' \code{stanvars} argument for this purpose, instead. #' @param fit An instance of S3 class \code{brmsfit} derived from a previous #' fit; defaults to \code{NA}. If \code{fit} is of class \code{brmsfit}, the #' compiled model associated with the fitted result is re-used and all #' arguments modifying the model code or data are ignored. It is not #' recommended to use this argument directly, but to call the #' \code{\link[brms:update.brmsfit]{update}} method, instead. #' @param inits Either \code{"random"} or \code{"0"}. If inits is #' \code{"random"} (the default), Stan will randomly generate initial values #' for parameters. If it is \code{"0"}, all parameters are initialized to #' zero. This option is sometimes useful for certain families, as it happens #' that default (\code{"random"}) inits cause samples to be essentially #' constant. Generally, setting \code{inits = "0"} is worth a try, if chains #' do not behave well. Alternatively, \code{inits} can be a list of lists #' containing the initial values, or a function (or function name) generating #' initial values. The latter options are mainly implemented for internal #' testing. #' @param chains Number of Markov chains (defaults to 4). #' @param iter Number of total iterations per chain (including warmup; defaults #' to 2000). #' @param warmup A positive integer specifying number of warmup (aka burnin) #' iterations. This also specifies the number of iterations used for stepsize #' adaptation, so warmup samples should not be used for inference. The number #' of warmup should not be larger than \code{iter} and the default is #' \code{iter/2}. #' @param thin Thinning rate. Must be a positive integer. Set \code{thin > 1} to #' save memory and computation time if \code{iter} is large. #' @param cores Number of cores to use when executing the chains in parallel, #' which defaults to 1 but we recommend setting the \code{mc.cores} option to #' be as many processors as the hardware and RAM allow (up to the number of #' chains). For non-Windows OS in non-interactive \R sessions, forking is used #' instead of PSOCK clusters. #' @param algorithm Character string indicating the estimation approach to use. #' Can be \code{"sampling"} for MCMC (the default), \code{"meanfield"} for #' variational inference with independent normal distributions, or #' \code{"fullrank"} for variational inference with a multivariate normal #' distribution. #' @param control A named \code{list} of parameters to control the sampler's #' behavior. It defaults to \code{NULL} so all the default values are used. #' The most important control parameters are discussed in the 'Details' #' section below. For a comprehensive overview see #' \code{\link[rstan:stan]{stan}}. #' @param future Logical; If \code{TRUE}, the \pkg{\link[future:future]{future}} #' package is used for parallel execution of the chains and argument #' \code{cores} will be ignored. Can be set globally for the current \R #' session via the \code{future} option. The execution type is controlled via #' \code{\link[future:plan]{plan}} (see the examples section below). #' @param silent logical; If \code{TRUE} (the default), most of the #' informational messages of compiler and sampler are suppressed. The actual #' sampling progress is still printed. Set \code{refresh = 0} to turn this off #' as well. To stop Stan from opening additional progress bars, set #' \code{open_progress = FALSE}. #' @param seed The seed for random number generation to make results #' reproducible. If \code{NA} (the default), \pkg{Stan} will set the seed #' randomly. #' @param save_model Either \code{NULL} or a character string. In the latter #' case, the model's Stan code is saved via \code{\link{cat}} in a text file #' named after the string supplied in \code{save_model}. #' @param file Either \code{NULL} or a character string. In the latter case, the #' fitted model object is saved via \code{\link{saveRDS}} in a file named #' after the string supplied in \code{file}. The \code{.rds} extension is #' added automatically. If the file already exists, \code{brm} will load and #' return the saved model object instead of refitting the model. As existing #' files won't be overwritten, you have to manually remove the file in order #' to refit and save the model under an existing file name. The file name #' is stored in the \code{brmsfit} object for later usage. #' @param stan_model_args A \code{list} of further arguments passed to #' \code{\link[rstan:stan_model]{stan_model}}. #' @param save_dso Logical, defaulting to \code{TRUE}, indicating whether the #' dynamic shared object (DSO) compiled from the C++ code for the model will #' be saved or not. If \code{TRUE}, we can draw samples from the same model in #' another \R session using the saved DSO (i.e., without compiling the C++ #' code again). #' @param ... Further arguments passed to Stan that is to #' \code{\link[rstan:sampling]{sampling}} or \code{\link[rstan:vb]{vb}}. #' #' @return An object of class \code{brmsfit}, which contains the posterior #' samples along with many other useful information about the model. Use #' \code{methods(class = "brmsfit")} for an overview on available methods. #' #' @author Paul-Christian Buerkner \email{paul.buerkner@@gmail.com} #' #' @details Fit a generalized (non-)linear multivariate multilevel model via #' full Bayesian inference using Stan. A general overview is provided in the #' vignettes \code{vignette("brms_overview")} and #' \code{vignette("brms_multilevel")}. For a full list of available vignettes #' see \code{vignette(package = "brms")}. #' #' \bold{Formula syntax of brms models} #' #' Details of the formula syntax applied in \pkg{brms} can be found in #' \code{\link{brmsformula}}. #' #' \bold{Families and link functions} #' #' Details of families supported by \pkg{brms} can be found in #' \code{\link{brmsfamily}}. #' #' \bold{Prior distributions} #' #' Priors should be specified using the #' \code{\link[brms:set_prior]{set_prior}} function. Its documentation #' contains detailed information on how to correctly specify priors. To find #' out on which parameters or parameter classes priors can be defined, use #' \code{\link[brms:get_prior]{get_prior}}. Default priors are chosen to be #' non or very weakly informative so that their influence on the results will #' be negligible and you usually don't have to worry about them. However, #' after getting more familiar with Bayesian statistics, I recommend you to #' start thinking about reasonable informative priors for your model #' parameters: Nearly always, there is at least some prior information #' available that can be used to improve your inference. #' #' \bold{Adjusting the sampling behavior of \pkg{Stan}} #' #' In addition to choosing the number of iterations, warmup samples, and #' chains, users can control the behavior of the NUTS sampler, by using the #' \code{control} argument. The most important reason to use \code{control} is #' to decrease (or eliminate at best) the number of divergent transitions that #' cause a bias in the obtained posterior samples. Whenever you see the #' warning "There were x divergent transitions after warmup." you should #' really think about increasing \code{adapt_delta}. To do this, write #' \code{control = list(adapt_delta = )}, where \code{} should usually #' be value between \code{0.8} (current default) and \code{1}. Increasing #' \code{adapt_delta} will slow down the sampler but will decrease the number #' of divergent transitions threatening the validity of your posterior #' samples. #' #' Another problem arises when the depth of the tree being evaluated in each #' iteration is exceeded. This is less common than having divergent #' transitions, but may also bias the posterior samples. When it happens, #' \pkg{Stan} will throw out a warning suggesting to increase #' \code{max_treedepth}, which can be accomplished by writing \code{control = #' list(max_treedepth = )} with a positive integer \code{} that should #' usually be larger than the current default of \code{10}. For more details #' on the \code{control} argument see \code{\link[rstan:stan]{stan}}. #' #' @references #' Paul-Christian Buerkner (2017). brms: An R Package for Bayesian Multilevel #' Models Using Stan. \emph{Journal of Statistical Software}, 80(1), 1-28. #' \code{doi:10.18637/jss.v080.i01} #' #' Paul-Christian Buerkner (2018). Advanced Bayesian Multilevel Modeling #' with the R Package brms. \emph{The R Journal}. 10(1), 395–411. #' \code{doi:10.32614/RJ-2018-017} #' #' @seealso \code{\link{brms}}, \code{\link{brmsformula}}, #' \code{\link{brmsfamily}}, \code{\link{brmsfit}} #' #' @examples #' \dontrun{ #' # Poisson regression for the number of seizures in epileptic patients #' # using student_t priors for population-level effects #' # and half cauchy priors for standard deviations of group-level effects #' bprior1 <- prior(student_t(5,0,10), class = b) + #' prior(cauchy(0,2), class = sd) #' fit1 <- brm(count ~ zAge + zBase * Trt + (1|patient), #' data = epilepsy, family = poisson(), prior = bprior1) #' #' # generate a summary of the results #' summary(fit1) #' #' # plot the MCMC chains as well as the posterior distributions #' plot(fit1, ask = FALSE) #' #' # predict responses based on the fitted model #' head(predict(fit1)) #' #' # plot conditional effects for each predictor #' plot(conditional_effects(fit1), ask = FALSE) #' #' # investigate model fit #' loo(fit1) #' pp_check(fit1) #' #' #' # Ordinal regression modeling patient's rating of inhaler instructions #' # category specific effects are estimated for variable 'treat' #' fit2 <- brm(rating ~ period + carry + cs(treat), #' data = inhaler, family = sratio("logit"), #' prior = set_prior("normal(0,5)"), chains = 2) #' summary(fit2) #' plot(fit2, ask = FALSE) #' WAIC(fit2) #' #' #' # Survival regression modeling the time between the first #' # and second recurrence of an infection in kidney patients. #' fit3 <- brm(time | cens(censored) ~ age * sex + disease + (1|patient), #' data = kidney, family = lognormal()) #' summary(fit3) #' plot(fit3, ask = FALSE) #' plot(conditional_effects(fit3), ask = FALSE) #' #' #' # Probit regression using the binomial family #' ntrials <- sample(1:10, 100, TRUE) #' success <- rbinom(100, size = ntrials, prob = 0.4) #' x <- rnorm(100) #' data4 <- data.frame(ntrials, success, x) #' fit4 <- brm(success | trials(ntrials) ~ x, data = data4, #' family = binomial("probit")) #' summary(fit4) #' #' #' # Simple non-linear gaussian model #' x <- rnorm(100) #' y <- rnorm(100, mean = 2 - 1.5^x, sd = 1) #' data5 <- data.frame(x, y) #' bprior5 <- prior(normal(0, 2), nlpar = a1) + #' prior(normal(0, 2), nlpar = a2) #' fit5 <- brm(bf(y ~ a1 - a2^x, a1 + a2 ~ 1, nl = TRUE), #' data = data5, prior = bprior5) #' summary(fit5) #' plot(conditional_effects(fit5), ask = FALSE) #' #' #' # Normal model with heterogeneous variances #' data_het <- data.frame( #' y = c(rnorm(50), rnorm(50, 1, 2)), #' x = factor(rep(c("a", "b"), each = 50)) #' ) #' fit6 <- brm(bf(y ~ x, sigma ~ 0 + x), data = data_het) #' summary(fit6) #' plot(fit6) #' conditional_effects(fit6) #' #' # extract estimated residual SDs of both groups #' sigmas <- exp(posterior_samples(fit6, "^b_sigma_")) #' ggplot(stack(sigmas), aes(values)) + #' geom_density(aes(fill = ind)) #' #' #' # Quantile regression predicting the 25%-quantile #' fit7 <- brm(bf(y ~ x, quantile = 0.25), data = data_het, #' family = asym_laplace()) #' summary(fit7) #' conditional_effects(fit7) #' #' #' # use the future package for more flexible parallelization #' library(future) #' plan(multiprocess) #' fit7 <- update(fit7, future = TRUE) #' } #' #' @import parallel #' @import methods #' @import stats #' @import Rcpp #' @export brm <- function(formula, data, family = gaussian(), prior = NULL, autocor = NULL, data2 = NULL, cov_ranef = NULL, sample_prior = c("no", "yes", "only"), sparse = NULL, knots = NULL, stanvars = NULL, stan_funs = NULL, fit = NA, save_ranef = TRUE, save_mevars = FALSE, save_all_pars = FALSE, inits = "random", chains = 4, iter = 2000, warmup = floor(iter / 2), thin = 1, cores = getOption("mc.cores", 1L), control = NULL, algorithm = c("sampling", "meanfield", "fullrank"), future = getOption("future", FALSE), silent = TRUE, seed = NA, save_model = NULL, stan_model_args = list(), save_dso = TRUE, file = NULL, ...) { if (!is.null(file)) { x <- read_brmsfit(file) if (!is.null(x)) { return(x) } } # validate arguments later passed to Stan dots <- list(...) testmode <- isTRUE(dots$testmode) dots$testmode <- NULL algorithm <- match.arg(algorithm) silent <- as_one_logical(silent) iter <- as_one_numeric(iter) warmup <- as_one_numeric(warmup) thin <- as_one_numeric(thin) chains <- as_one_numeric(chains) cores <- as_one_numeric(cores) future <- as_one_logical(future) && chains > 0L seed <- as_one_numeric(seed, allow_na = TRUE) if (is.character(inits) && !inits %in% c("random", "0")) { inits <- get(inits, mode = "function", envir = parent.frame()) } if (is.brmsfit(fit)) { # re-use existing model x <- fit icnames <- c("loo", "waic", "kfold", "R2", "marglik") x[icnames] <- list(NULL) sdata <- standata(x) x$fit <- rstan::get_stanmodel(x$fit) } else { # build new model formula <- validate_formula( formula, data = data, family = family, autocor = autocor, sparse = sparse ) family <- get_element(formula, "family") bterms <- parse_bf(formula) data.name <- substitute_name(data) data <- validate_data(data, bterms = bterms) data2 <- validate_data2( data2, bterms = bterms, get_data2_autocor(formula) ) prior <- check_prior( prior, formula = formula, data = data, sample_prior = sample_prior, warn = FALSE ) # initialize S3 object x <- brmsfit( formula = formula, family = family, data = data, data.name = data.name, data2 = data2, prior = prior, cov_ranef = cov_ranef, stanvars = stanvars, stan_funs = stan_funs, algorithm = algorithm ) x$ranef <- tidy_ranef(bterms, data = x$data) x$exclude <- exclude_pars( x, save_ranef = save_ranef, save_mevars = save_mevars, save_all_pars = save_all_pars ) x$model <- make_stancode( formula, data = data, prior = prior, cov_ranef = cov_ranef, sample_prior = sample_prior, knots = knots, stanvars = stanvars, stan_funs = stan_funs, save_model = save_model ) # generate Stan data before compiling the model to avoid # unnecessary compilations in case of invalid data sdata <- make_standata( formula, data = data, prior = prior, data2 = data2, cov_ranef = cov_ranef, sample_prior = sample_prior, knots = knots, stanvars = stanvars ) stopifnot(is.list(stan_model_args)) silence_stan_model <- !length(stan_model_args) stan_model_args$model_code <- x$model if (!isTRUE(save_dso)) { warning2("'save_dso' is deprecated. Please use 'stan_model_args'.") stan_model_args$save_dso <- save_dso } message("Compiling the C++ model") x$fit <- eval_silent( do_call(rstan::stan_model, stan_model_args), silent = silence_stan_model, type = "message" ) } args <- nlist( object = x$fit, data = sdata, pars = x$exclude, include = FALSE, algorithm, iter, seed ) args[names(dots)] <- dots message("Start sampling") if (args$algorithm == "sampling") { args$algorithm <- NULL c(args) <- nlist( init = inits, warmup, thin, control, show_messages = !silent ) if (future) { if (cores > 1L) { warning2("Argument 'cores' is ignored when using 'future'.") } args$chains <- 1L futures <- fits <- vector("list", chains) for (i in seq_len(chains)) { args$chain_id <- i if (is.list(inits)) { args$init <- inits[i] } futures[[i]] <- future::future( brms::do_call(rstan::sampling, args), packages = "rstan" ) } for (i in seq_len(chains)) { fits[[i]] <- future::value(futures[[i]]) } x$fit <- rstan::sflist2stanfit(fits) rm(futures, fits) } else { c(args) <- nlist(chains, cores) x$fit <- do_call(rstan::sampling, args) } } else { # vb does not support parallel execution x$fit <- do_call(rstan::vb, args) } if (!testmode) { x <- rename_pars(x) } if (!is.null(file)) { write_brmsfit(x, file) } x } brms/R/misc.R0000644000176200001440000006546313611527526012522 0ustar liggesusers# type-stable indexing of vector and matrix type objects # @param x an R object typically a vector or matrix # @param i optional index; if NULL, x is returned unchanged # @param row indicating if rows or cols should be indexed # only relevant if x has two or three dimensions p <- function(x, i = NULL, row = TRUE) { if (isTRUE(length(dim(x)) > 3L)) { stop2("'p' can only handle objects up to 3 dimensions.") } if (!length(i)) { out <- x } else if (length(dim(x)) == 2L) { if (row) { out <- x[i, , drop = FALSE] } else { out <- x[, i, drop = FALSE] } } else if (length(dim(x)) == 3L) { if (row) { out <- x[i, , , drop = FALSE] } else { out <- x[, i, , drop = FALSE] } } else { out <- x[i] } out } # extract parts of an object with selective dropping of dimensions # @param x,...,drop same as in x[..., drop] # @drop_dim: Optional numeric or logical vector controlling # which dimensions to drop. Will overwrite argument 'drop'. extract <- function(x, ..., drop = FALSE, drop_dim = NULL) { if (!length(dim(x))) { return(x[...]) } if (length(drop_dim)) { drop <- FALSE } else { drop <- as_one_logical(drop) } out <- x[..., drop = drop] if (drop || !length(drop_dim) || any(dim(out) == 0L)) { return(out) } if (is.numeric(drop_dim)) { drop_dim <- seq_along(dim(x)) %in% drop_dim } if (!is.logical(drop_dim)) { stop2("'drop_dim' needs to be logical or numeric.") } keep <- dim(out) > 1L | !drop_dim new_dim <- dim(out)[keep] if (length(new_dim) == 1L) { # use vectors instead of 1D arrays new_dim <- NULL } dim(out) <- new_dim out } # savely extract columns without dropping other dimensions # @param x an array # @param i colum index extract_col <- function(x, i) { ldim <- length(dim(x)) if (ldim < 2L) { return(x) } commas <- collapse(rep(", ", ldim - 2)) expr <- paste0("extract(x, , i", commas, ", drop_dim = 2)") eval2(expr) } seq_rows <- function(x) { seq_len(NROW(x)) } seq_cols <- function(x) { seq_len(NCOL(x)) } seq_dim <- function(x, dim) { dim <- as_one_numeric(dim) if (dim == 1) { len <- NROW(x) } else if (dim == 2) { len <- NCOL(x) } else { len <- dim(x)[dim] } if (length(len) == 1L && !isNA(len)) { out <- seq_len(len) } else { out <- integer(0) } out } # match rows in x with rows in y match_rows <- function(x, y, ...) { x <- as.data.frame(x) y <- as.data.frame(y) x <- do_call("paste", c(x, sep = "\r")) y <- do_call("paste", c(y, sep = "\r")) match(x, y, ...) } # find elements of 'x' matching sub-elements passed via 'ls' and '...' find_elements <- function(x, ..., ls = list(), fun = '%in%') { x <- as.list(x) if (!length(x)) { return(logical(0)) } out <- rep(TRUE, length(x)) ls <- c(ls, list(...)) if (!length(ls)) { return(out) } if (is.null(names(ls))) { stop("Argument 'ls' must be named.") } for (name in names(ls)) { tmp <- lapply(x, "[[", name) out <- out & do_call(fun, list(tmp, ls[[name]])) } out } # find rows of 'x' matching columns passed via 'ls' and '...' # similar to 'find_elements' but for matrix like objects find_rows <- function(x, ..., ls = list(), fun = '%in%') { x <- as.data.frame(x) if (!nrow(x)) { return(logical(0)) } out <- rep(TRUE, nrow(x)) ls <- c(ls, list(...)) if (!length(ls)) { return(out) } if (is.null(names(ls))) { stop("Argument 'ls' must be named.") } for (name in names(ls)) { out <- out & do_call(fun, list(x[[name]], ls[[name]])) } out } # subset 'x' using arguments passed via 'ls' and '...' subset2 <- function(x, ..., ls = list(), fun = '%in%') { x[find_rows(x, ..., ls = ls, fun = fun), , drop = FALSE] } # convert array to list of elements with reduced dimension # @param x an arrary of dimension d # @return a list of arrays of dimension d-1 array2list <- function(x) { if (is.null(dim(x))) { return(as.list(x)) } ndim <- length(dim(x)) out <- list(length = dim(x)[ndim]) ind <- collapse(rep(",", ndim - 1)) for (i in seq_len(dim(x)[ndim])) { out[[i]] <- eval(parse(text = paste0("x[", ind, i, "]"))) if (length(dim(x)) > 2) { # avoid accidental dropping of other dimensions dim(out[[i]]) <- dim(x)[-ndim] } } names(out) <- dimnames(x)[[ndim]] out } # move elements to the start of a named object move2start <- function(x, first) { x[c(first, setdiff(names(x), first))] } # wrapper around replicate but without simplifying repl <- function(expr, n) { replicate(n, expr, simplify = FALSE) } # find the first element in A that is greater than target # @param A a matrix # @param target a vector of length nrow(A) # @param i column of A being checked first # @return a vector of the same length as target containing the # column ids where A[,i] was first greater than target first_greater <- function(A, target, i = 1) { ifelse(target <= A[, i] | ncol(A) == i, i, first_greater(A, target, i + 1)) } # check if an object is NULL isNULL <- function(x) { is.null(x) || ifelse(is.vector(x), all(sapply(x, is.null)), FALSE) } # recursively removes NULL entries from an object rmNULL <- function(x, recursive = TRUE) { x <- Filter(Negate(isNULL), x) if (recursive) { x <- lapply(x, function(x) if (is.list(x)) rmNULL(x) else x) } x } # find the first argument that is not NULL first_not_null <- function(...) { dots <- list(...) out <- NULL i <- 1L while (isNULL(out) && i <= length(dots)) { if (!isNULL(dots[[i]])) { out <- dots[[i]] } i <- i + 1L } out } isNA <- function(x) { length(x) == 1L && is.na(x) } is_equal <- function(x, y, ...) { isTRUE(all.equal(x, y, ...)) } # check if 'x' will behave like a factor in design matrices is_like_factor <- function(x) { is.factor(x) || is.character(x) || is.logical(x) } # as.factor but allows to pass levels as_factor <- function(x, levels = NULL) { if (is.null(levels)) { out <- as.factor(x) } else { out <- factor(x, levels = levels) } out } # coerce 'x' to a single logical value as_one_logical <- function(x, allow_na = FALSE) { s <- substitute(x) x <- as.logical(x) if (length(x) != 1L || anyNA(x) && !allow_na) { s <- deparse_combine(s, max_char = 100L) stop2("Cannot coerce '", s, "' to a single logical value.") } x } # coerce 'x' to a single numeric value as_one_numeric <- function(x, allow_na = FALSE) { s <- substitute(x) x <- SW(as.numeric(x)) if (length(x) != 1L || anyNA(x) && !allow_na) { s <- deparse_combine(s, max_char = 100L) stop2("Cannot coerce '", s, "' to a single numeric value.") } x } # coerce 'x' to a single character string as_one_character <- function(x, allow_na = FALSE) { s <- substitute(x) x <- as.character(x) if (length(x) != 1L || anyNA(x) && !allow_na) { s <- deparse_combine(s, max_char = 100L) stop2("Cannot coerce '", s, "' to a single character value.") } x } # coerce 'x' to a single character variable name as_one_variable <- function(x, allow_na = TRUE) { x <- as_one_character(x) if (x == "NA" && allow_na) { return(x) } if (!nzchar(x) || !is_equal(x, all_vars(x))) { stop2("Cannot coerce '", x, "' to a single variable name.") } x } has_rows <- function(x) { isTRUE(nrow(x) > 0L) } has_cols <- function(x) { isTRUE(ncol(x) > 0L) } # expand arguments to the same length # @param ... arguments to expand # @param length optional expansion length # otherwise taken to be the largest supplied length # @return a data.frame with one variable per element in '...' expand <- function(..., dots = list(), length = NULL) { dots <- c(dots, list(...)) max_dim <- NULL if (is.null(length)) { lengths <- lengths(dots) length <- max(lengths) max_dim <- dim(dots[[match(length, lengths)]]) } out <- as.data.frame(lapply(dots, rep, length.out = length)) structure(out, max_dim = max_dim) } # structure but ignore NULL structure_not_null <- function(.Data, ...) { if (!is.null(.Data)) { .Data <- structure(.Data, ...) } .Data } # remove specified attributes rm_attr <- function(x, attr) { attributes(x)[attr] <- NULL x } # unidimensional subsetting while keeping attributes subset_keep_attr <- function(x, y) { att <- attributes(x) x <- x[y] att$names <- names(x) attributes(x) <- att x } '%||%' <- function(x, y) { if (is.null(x)) x <- y x } # check if 'x' is a whole number (integer) is_wholenumber <- function(x, tol = .Machine$double.eps) { if (is.numeric(x)) { out <- abs(x - round(x)) < tol } else { out <- rep(FALSE, length(x)) } dim(out) <- dim(x) out } # helper function to check symmetry of a matrix is_symmetric <- function(x, tol = sqrt(.Machine$double.eps)) { isSymmetric(x, tol = tol, check.attributes = FALSE) } # unlist lapply output ulapply <- function(X, FUN, ..., recursive = TRUE, use.names = TRUE) { unlist(lapply(X, FUN, ...), recursive, use.names) } # rbind lapply output rblapply <- function(X, FUN, ...) { do_call(rbind, lapply(X, FUN, ...)) } # cbind lapply output cblapply <- function(X, FUN, ...) { do_call(cbind, lapply(X, FUN, ...)) } # find variables in a character string or expression all_vars <- function(expr, ...) { if (is.character(expr)) { expr <- parse(text = expr) } all.vars(expr, ...) } # append list(...) to x lc <- function(x, ...) { dots <- rmNULL(list(...), recursive = FALSE) c(x, dots) } 'c<-' <- function(x, value) { c(x, value) } 'lc<-' <- function(x, value) { lc(x, value) } collapse <- function(..., sep = "") { paste(..., sep = sep, collapse = "") } collapse_comma <- function(...) { paste0("'", ..., "'", collapse = ", ") } # add characters to an existing string 'str_add<-' <- function(x, start = FALSE, value) { if (start) paste0(value, x) else paste0(x, value) } # add list of characters to an existing list 'str_add_list<-' <- function(x, start = FALSE, value) { stopifnot(is.list(x), is.list(value)) out <- if (start) list(value, x) else list(x, value) collapse_lists(ls = out) } # type-stable if clause for strings with default else output str_if <- function(cond, yes, no = "") { cond <- as_one_logical(cond) if (cond) as.character(yes) else as.character(no) } # select elements which match a regex pattern str_subset <- function(x, pattern, ...) { x[grepl(pattern, x, ...)] } # similar to glue::glue but specialized for generating Stan code glue <- function(..., sep = "", collapse = NULL, envir = parent.frame(), open = "{", close = "}", na = "NA") { dots <- list(...) dots <- dots[lengths(dots) > 0L] args <- list( .x = NULL, .sep = sep, .envir = envir, .open = open, .close = close, .na = na, .trim = FALSE, .transformer = zero_length_transformer ) out <- do_call(glue::glue_data, c(dots, args)) if (!is.null(collapse)) { collapse <- as_one_character(collapse) out <- paste0(out, collapse = collapse) } out } # used in 'glue' to handle zero-length inputs zero_length_transformer <- function(text, envir) { out <- glue::identity_transformer(text, envir) if (!length(out)) { out <- "" } out } # collapse strings evaluated with glue cglue <- function(..., envir = parent.frame()) { glue(..., envir = envir, collapse = "") } # like stats:::na.omit.data.frame but allows to ignore variables # keeps NAs in variables with attribute keep_na = TRUE na.omit2 <- function(object, ...) { stopifnot(is.data.frame(object)) omit <- logical(nrow(object)) for (j in seq_along(object)) { x <- object[[j]] keep_na <- isTRUE(attr(x, "keep_na", TRUE)) if (!is.atomic(x) || keep_na) { next } x <- is.na(x) d <- dim(x) if (is.null(d) || length(d) != 2L) { omit <- omit | x } else { for (ii in seq_len(d[2L])) { omit <- omit | x[, ii] } } } if (any(omit > 0L)) { out <- object[!omit, , drop = FALSE] temp <- setNames(seq(omit)[omit], attr(object, "row.names")[omit]) attr(temp, "class") <- "omit" attr(out, "na.action") <- temp warning2("Rows containing NAs were excluded from the model.") } else { out <- object } out } # check if a certain package is installed # @param package package name # @param version optional minimal version number to require require_package <- function(package, version = NULL) { if (!requireNamespace(package, quietly = TRUE)) { stop2("Please install the '", package, "' package.") } if (!is.null(version)) { version <- as.package_version(version) if (utils::packageVersion(package) < version) { stop2("Please install package '", package, "' version ", version, " or higher.") } } invisible(TRUE) } # rename specified patterns in a character vector # @param x a character vector to be renamed # @param pattern the regular expressions in x to be replaced # @param replacement the replacements # @param fixed same as for 'gsub' # @param check_dup: logical; check for duplications in x after renaming # @param ... passed to 'gsub' # @return renamed character vector of the same length as x rename <- function(x, pattern = NULL, replacement = NULL, fixed = TRUE, check_dup = FALSE, ...) { pattern <- as.character(pattern) replacement <- as.character(replacement) if (!length(pattern) && !length(replacement)) { # default renaming to avoid special characters in coeffcient names pattern <- c( " ", "(", ")", "[", "]", ",", "\"", "'", "?", "+", "-", "*", "/", "^", "=" ) replacement <- c(rep("", 9), "P", "M", "MU", "D", "E", "EQ") } if (length(replacement) == 1L) { replacement <- rep(replacement, length(pattern)) } stopifnot(length(pattern) == length(replacement)) # avoid zero-length pattern error has_chars <- nzchar(pattern) pattern <- pattern[has_chars] replacement <- replacement[has_chars] out <- x for (i in seq_along(pattern)) { out <- gsub(pattern[i], replacement[i], out, fixed = fixed, ...) } dup <- duplicated(out) if (check_dup && any(dup)) { dup <- x[out %in% out[dup]] stop2("Internal renaming led to duplicated names. \n", "Occured for: ", collapse_comma(dup)) } out } # collapse strings having the same name in different lists # @param ... named lists # @param ls a list of named lists # @param a named list containing the collapsed strings collapse_lists <- function(..., ls = list()) { ls <- c(list(...), ls) elements <- unique(unlist(lapply(ls, names))) args <- c(FUN = collapse, lapply(ls, "[", elements), SIMPLIFY = FALSE) out <- do_call(mapply, args) names(out) <- elements out } # create a named list using object names nlist <- function(...) { m <- match.call() dots <- list(...) no_names <- is.null(names(dots)) has_name <- if (no_names) FALSE else nzchar(names(dots)) if (all(has_name)) return(dots) nms <- as.character(m)[-1] if (no_names) { names(dots) <- nms } else { names(dots)[!has_name] <- nms[!has_name] } dots } # initialize a named list # @param names names of the elements # @param values optional values of the elements named_list <- function(names, values = NULL) { if (!is.null(values)) { if (length(values) <= 1L) { values <- replicate(length(names), values) } values <- as.list(values) stopifnot(length(values) == length(names)) } else { values <- vector("list", length(names)) } setNames(values, names) } # is an object named? is_named <- function(x) { names <- names(x) if (is.null(names)) { return(FALSE) } if (any(!nzchar(names) | is.na(names))) { return(FALSE) } TRUE } #' Execute a Function Call #' #' Execute a function call similar to \code{\link{do.call}}, but without #' deparsing function arguments. #' #' @param what Either a function or a non-empty character string naming the #' function to be called. #' @param args A list of arguments to the function call. The names attribute of #' \code{args} gives the argument names. #' @param pkg Optional name of the package in which to search for the #' function if \code{what} is a character string. #' #' @return The result of the (evaluated) function call. #' #' @keywords internal #' @export do_call <- function(what, args, pkg = NULL) { call <- "" if (length(args)) { if (!is.list(args)) { stop2("'args' must be a list.") } fun_args <- names(args) if (is.null(fun_args)) { fun_args <- rep("", length(args)) } else { nzc <- nzchar(fun_args) fun_args[nzc] <- paste0("`", fun_args[nzc], "` = ") } names(args) <- paste0(".x", seq_along(args)) call <- paste0(fun_args, names(args), collapse = ",") } else { args <- list() } if (is.function(what)) { args$.fun <- what what <- ".fun" } else { what <- paste0("`", as_one_character(what), "`") if (!is.null(pkg)) { what <- paste0(as_one_character(pkg), "::", what) } } call <- paste0(what, "(", call, ")") eval2(call, envir = args, enclos = parent.frame()) } empty_data_frame <- function() { as.data.frame(matrix(nrow = 0, ncol = 0)) } # replace elements in x with elements in value # @param x named list-like object # @param value another named list-like object # @param dont_replace names of elements that cannot be replaced 'replace_args<-' <- function(x, dont_replace = NULL, value) { value_name <- deparse_combine(substitute(value), max_char = 100L) value <- as.list(value) if (length(value) && is.null(names(value))) { stop2("Argument '", value_name, "' must be named.") } invalid <- names(value)[names(value) %in% dont_replace] if (length(invalid)) { invalid <- collapse_comma(invalid) stop2("Argument(s) ", invalid, " cannot be replaced.") } x[names(value)] <- value x } # deparse 'x' if it is no string deparse_no_string <- function(x) { if (!is.character(x)) { x <- deparse(x) } x } # combine deparse lines into one string deparse_combine <- function(x, max_char = NULL) { out <- collapse(deparse(x)) if (isTRUE(max_char > 0)) { out <- substr(out, 1L, max_char) } out } # like 'eval' but parses characters before evaluation eval2 <- function(expr, envir = parent.frame(), ...) { if (is.character(expr)) { expr <- parse(text = expr) } eval(expr, envir, ...) } # evaluate an expression without printing output or messages # @param expr expression to be evaluated # @param type type of output to be suppressed (see ?sink) # @param try wrap evaluation of expr in 'try' and # not suppress outputs if evaluation fails? # @param silent actually evaluate silently? eval_silent <- function(expr, type = "output", try = FALSE, silent = TRUE, ...) { try <- as_one_logical(try) silent <- as_one_logical(silent) type <- match.arg(type, c("output", "message")) expr <- substitute(expr) envir <- parent.frame() if (silent) { if (try && type == "message") { try_out <- try(utils::capture.output( out <- eval(expr, envir), type = type, ... )) if (is(try_out, "try-error")) { # try again without suppressing error messages out <- eval(expr, envir) } } else { utils::capture.output(out <- eval(expr, envir), type = type, ...) } } else { out <- eval(expr, envir) } out } # find the name that 'x' had in a specific environment substitute_name <- function(x, envir = parent.frame(), nchar = 50) { out <- substitute(x) out <- eval2(paste0("substitute(", out, ")"), envir = envir) if (missing(out)) { return(NULL) } substr(collapse(deparse(out)), 1, nchar) } # recursive sorting of dependencies # @param x named list of dependencies per element # @param sorted already sorted element names # @return a vector of sorted element names sort_dependencies <- function(x, sorted = NULL) { if (!length(x)) { return(NULL) } if (length(names(x)) != length(x)) { stop2("Argument 'x' must be named.") } take <- !ulapply(x, function(dep) any(!dep %in% sorted)) new <- setdiff(names(x)[take], sorted) out <- union(sorted, new) if (length(new)) { out <- union(out, sort_dependencies(x, sorted = out)) } else if (!all(names(x) %in% out)) { stop2("Cannot handle circular dependency structures.") } out } stop2 <- function(...) { stop(..., call. = FALSE) } warning2 <- function(...) { warning(..., call. = FALSE) } # get first occurrence of 'x' in '...' objects # @param x The name of the required element # @param ... named R objects that may contain 'x' get_arg <- function(x, ...) { dots <- list(...) i <- 1 out <- NULL while (i <= length(dots) && is.null(out)) { if (!is.null(dots[[i]][[x]])) { out <- dots[[i]][[x]] } else { i <- i + 1 } } out } SW <- function(expr) { base::suppressWarnings(expr) } # get pattern matches in text as vector # @param simplify return an atomic vector of matches? # @param first only return the first match in each string? # @return character vector containing matches get_matches <- function(pattern, text, simplify = TRUE, first = FALSE, ...) { x <- regmatches(text, gregexpr(pattern, text, ...)) if (first) { x <- lapply(x, function(t) if (length(t)) t[1] else t) } if (simplify) { if (first) { x <- lapply(x, function(t) if (length(t)) t else "") } x <- unlist(x) } x } # find matches in the parse tree of an expression # @param pattern pattern to be matched # @param expr expression to be searched in # @return character vector containing matches get_matches_expr <- function(pattern, expr, ...) { if (is.character(expr)) { expr <- parse(text = expr) } out <- NULL for (i in seq_along(expr)) { sexpr <- try(expr[[i]], silent = TRUE) if (!is(sexpr, "try-error")) { sexpr_char <- deparse_combine(sexpr) out <- c(out, get_matches(pattern, sexpr_char, ...)) } if (is.call(sexpr) || is.expression(sexpr)) { out <- c(out, get_matches_expr(pattern, sexpr, ...)) } } unique(out) } # like 'grepl' but handles (parse trees of) expressions grepl_expr <- function(pattern, expr, ...) { as.logical(ulapply(expr, function(e) length(get_matches_expr(pattern, e, ...)) > 0L)) } # combine character vectors into a joint regular 'or' expression # @param x a character vector # @param escape escape all special characters in 'x'? regex_or <- function(x, escape = FALSE) { if (escape) { x <- escape_all(x) } paste0("(", paste0("(", x, ")", collapse = "|"), ")") } # escape dots in character strings escape_dot <- function(x) { gsub(".", "\\.", x, fixed = TRUE) } # escape all special characters in character strings escape_all <- function(x) { specials <- c(".", "*", "+", "?", "^", "$", "(", ")", "[", "]", "|") for (s in specials) { x <- gsub(s, paste0("\\", s), x, fixed = TRUE) } x } # add an underscore to non-empty character strings # @param x a character vector # @param pos position of the underscore usc <- function(x, pos = c("prefix", "suffix")) { pos <- match.arg(pos) x <- as.character(x) if (!length(x)) x <- "" if (pos == "prefix") { x <- ifelse(nzchar(x), paste0("_", x), "") } else { x <- ifelse(nzchar(x), paste0(x, "_"), "") } x } # round using the largest remainder method round_largest_remainder <- function(x) { x <- as.numeric(x) total <- round(sum(x)) out <- floor(x) diff <- x - out J <- order(diff, decreasing = TRUE) I <- seq_len(total - floor(sum(out))) out[J[I]] <- out[J[I]] + 1 out } # add leading and trailing whitespaces # @param x object accepted by paste # @param nsp number of whitespaces to add wsp <- function(x = "", nsp = 1) { sp <- collapse(rep(" ", nsp)) if (length(x)) { out <- ifelse(nzchar(x), paste0(sp, x, sp), sp) } else { out <- NULL } out } # remove whitespaces from strings rm_wsp <- function(x) { gsub("[ \t\r\n]+", "", x, perl = TRUE) } # limit the number of characters of a vector # @param x a character vector # @param chars maximum number of characters to show # @param lsuffix number of characters to keep at the end of the strings # @return possible truncated character vector limit_chars <- function(x, chars = NULL, lsuffix = 4) { stopifnot(is.character(x)) if (!is.null(chars)) { chars_x <- nchar(x) - lsuffix suffix <- substr(x, chars_x + 1, chars_x + lsuffix) x <- substr(x, 1, chars_x) x <- ifelse(chars_x <= chars, x, paste0(substr(x, 1, chars - 3), "...")) x <- paste0(x, suffix) } x } # ensure that deprecated arguments still work # @param arg input to the new argument # @param alias input to the deprecated argument # @param default the default value of alias # @param warn should a warning be printed if alias is specified? use_alias <- function(arg, alias = NULL, default = NULL, warn = TRUE) { arg_name <- Reduce(paste, deparse(substitute(arg))) alias_name <- Reduce(paste, deparse(substitute(alias))) if (!is_equal(alias, default)) { arg <- alias if (grepl("^dots\\$", alias_name)) { alias_name <- gsub("^dots\\$", "", alias_name) } else if (grepl("^dots\\[\\[", alias_name)) { alias_name <- gsub("^dots\\[\\[\"|\"\\]\\]$", "", alias_name) } if (warn) { warning2("Argument '", alias_name, "' is deprecated. ", "Please use argument '", arg_name, "' instead.") } } arg } warn_deprecated <- function(new, old = as.character(sys.call(sys.parent()))[1]) { msg <- paste0("Function '", old, "' is deprecated.") if (!missing(new)) { msg <- paste0(msg, " Please use '", new, "' instead.") } warning2(msg) invisible(NULL) } viridis6 <- function() { c("#440154", "#414487", "#2A788E", "#22A884", "#7AD151", "#FDE725") } expect_match2 <- function(object, regexp, ..., all = TRUE) { testthat::expect_match(object, regexp, fixed = TRUE, ..., all = all) } # startup messages for brms .onAttach <- function(libname, pkgname) { version <- utils::packageVersion("brms") packageStartupMessage( "Loading 'brms' package (version ", version, "). Useful instructions\n", "can be found by typing help('brms'). A more detailed introduction\n", "to the package is available through vignette('brms_overview')." ) invisible(NULL) } .onLoad <- function(libname, pkgname) { backports::import(pkgname) } brms/R/hypothesis.R0000644000176200001440000005214213617507115013752 0ustar liggesusers#' Non-Linear Hypothesis Testing #' #' Perform non-linear hypothesis testing for all model parameters. #' #' @param x An \code{R} object. If it is no \code{brmsfit} object, #' it must be coercible to a \code{data.frame}. #' @param hypothesis A character vector specifying one or more #' non-linear hypothesis concerning parameters of the model. #' @param class A string specifying the class of parameters being tested. #' Default is "b" for population-level effects. #' Other typical options are "sd" or "cor". #' If \code{class = NULL}, all parameters can be tested #' against each other, but have to be specified with their full name #' (see also \code{\link[brms:parnames]{parnames}}) #' @param group Name of a grouping factor to evaluate only #' group-level effects parameters related to this grouping factor. #' @param alpha The alpha-level of the tests (default is 0.05; #' see 'Details' for more information). #' @param scope Indicates where to look for the variables specified in #' \code{hypothesis}. If \code{"standard"}, use the full parameter names #' (subject to the restriction given by \code{class} and \code{group}). #' If \code{"coef"} or \code{"ranef"}, compute the hypothesis for all levels #' of the grouping factor given in \code{"group"}, based on the #' output of \code{\link{coef.brmsfit}} and \code{\link{ranef.brmsfit}}, #' respectively. #' @param seed A single numeric value passed to \code{\link{set.seed}} #' to make results reproducible. #' @param ... Currently ignored. #' #' @details Among others, \code{hypothesis} computes an evidence ratio #' (\code{Evid.Ratio}) for each hypothesis. For a one-sided hypothesis, this #' is just the posterior probability (\code{Post.Prob}) under the hypothesis #' against its alternative. That is, when the hypothesis is of the form #' \code{a > b}, the evidence ratio is the ratio of the posterior probability #' of \code{a > b} and the posterior probability of \code{a < b}. In this #' example, values greater than one indicate that the evidence in favor of #' \code{a > b} is larger than evidence in favor of \code{a < b}. For an #' two-sided (point) hypothesis, the evidence ratio is a Bayes factor between #' the hypothesis and its alternative computed via the Savage-Dickey density #' ratio method. That is the posterior density at the point of interest #' divided by the prior density at that point. Values greater than one #' indicate that evidence in favor of the point hypothesis has increased after #' seeing the data. In order to calculate this Bayes factor, all parameters #' related to the hypothesis must have proper priors and argument #' \code{sample_prior} of function \code{brm} must be set to \code{"yes"}. #' Otherwise \code{Evid.Ratio} (and \code{Post.Prob}) will be \code{NA}. #' Please note that, for technical reasons, we cannot sample from priors of #' certain parameters classes. Most notably, these include overall intercept #' parameters (prior class \code{"Intercept"}) as well as group-level #' coefficients. When interpreting Bayes factors, make sure that your priors #' are reasonable and carefully chosen, as the result will depend heavily on #' the priors. In particular, avoid using default priors. #' #' The \code{Evid.Ratio} may sometimes be \code{0} or \code{Inf} implying very #' small or large evidence, respectively, in favor of the tested hypothesis. #' For one-sided hypotheses pairs, this basically means that all posterior #' samples are on the same side of the value dividing the two hypotheses. In #' that sense, instead of \code{0} or \code{Inf,} you may rather read it as #' \code{Evid.Ratio} smaller \code{1 / S} or greater \code{S}, respectively, #' where \code{S} denotes the number of posterior samples used in the #' computations. #' #' The argument \code{alpha} specifies the size of the credible interval #' (i.e., Bayesian confidence interval). For instance, if we tested a #' two-sided hypothesis and set \code{alpha = 0.05} (5\%) an, the credible #' interval will contain \code{1 - alpha = 0.95} (95\%) of the posterior #' values. Hence, \code{alpha * 100}\% of the posterior values will #' lie outside of the credible interval. Although this allows testing of #' hypotheses in a similar manner as in the frequentist null-hypothesis #' testing framework, we strongly argue against using arbitrary cutoffs (e.g., #' \code{p < .05}) to determine the 'existence' of an effect. #' #' @return A \code{\link{brmshypothesis}} object. #' #' @seealso \code{\link{brmshypothesis}} #' #' @author Paul-Christian Buerkner \email{paul.buerkner@@gmail.com} #' #' @examples #' \dontrun{ #' ## define priors #' prior <- c(set_prior("normal(0,2)", class = "b"), #' set_prior("student_t(10,0,1)", class = "sigma"), #' set_prior("student_t(10,0,1)", class = "sd")) #' #' ## fit a linear mixed effects models #' fit <- brm(time ~ age + sex + disease + (1 + age|patient), #' data = kidney, family = lognormal(), #' prior = prior, sample_prior = "yes", #' control = list(adapt_delta = 0.95)) #' #' ## perform two-sided hypothesis testing #' (hyp1 <- hypothesis(fit, "sexfemale = age + diseasePKD")) #' plot(hyp1) #' hypothesis(fit, "exp(age) - 3 = 0", alpha = 0.01) #' #' ## perform one-sided hypothesis testing #' hypothesis(fit, "diseasePKD + diseaseGN - 3 < 0") #' #' hypothesis(fit, "age < Intercept", #' class = "sd", group = "patient") #' #' ## test the amount of random intercept variance on all variance #' h <- paste("sd_patient__Intercept^2 / (sd_patient__Intercept^2 +", #' "sd_patient__age^2 + sigma^2) = 0") #' (hyp2 <- hypothesis(fit, h, class = NULL)) #' plot(hyp2) #' #' ## test more than one hypothesis at once #' h <- c("diseaseGN = diseaseAN", "2 * diseaseGN - diseasePKD = 0") #' (hyp3 <- hypothesis(fit, h)) #' plot(hyp3, ignore_prior = TRUE) #' #' ## compute hypotheses for all levels of a grouping factor #' hypothesis(fit, "age = 0", scope = "coef", group = "patient") #' #' ## use the default method #' dat <- as.data.frame(fit) #' hypothesis(dat, "b_age > 0") #' } #' #' @export hypothesis.brmsfit <- function(x, hypothesis, class = "b", group = "", scope = c("standard", "ranef", "coef"), alpha = 0.05, seed = NULL, ...) { # use a seed as prior_samples.brmsfit randomly permutes samples if (!is.null(seed)) { set.seed(seed) } contains_samples(x) x <- restructure(x) group <- as_one_character(group) scope <- match.arg(scope) if (scope == "standard") { if (!length(class)) { class <- "" } class <- as_one_character(class) if (nzchar(group)) { class <- paste0(class, "_", group, "__") } else if (nzchar(class)) { class <- paste0(class, "_") } out <- .hypothesis( x, hypothesis, class = class, alpha = alpha, ... ) } else { co <- do_call(scope, list(x, summary = FALSE)) if (!group %in% names(co)) { stop2("'group' should be one of ", collapse_comma(names(co))) } out <- hypothesis_coef(co[[group]], hypothesis, alpha = alpha, ...) } out } #' @rdname hypothesis.brmsfit #' @export hypothesis <- function(x, ...) { UseMethod("hypothesis") } #' @rdname hypothesis.brmsfit #' @export hypothesis.default <- function(x, hypothesis, alpha = 0.05, ...) { x <- as.data.frame(x) .hypothesis(x, hypothesis, class = "", alpha = alpha, ...) } #' Descriptions of \code{brmshypothesis} Objects #' #' A \code{brmshypothesis} object contains posterior samples #' as well as summary statistics of non-linear hypotheses as #' returned by \code{\link[brms:hypothesis]{hypothesis}}. #' #' @name brmshypothesis #' #' @param ignore_prior A flag indicating if prior distributions #' should also be plotted. Only used if priors were specified on #' the relevant parameters. #' @param digits Minimal number of significant digits, #' see \code{\link[base:print.default]{print.default}}. #' @param chars Maximum number of characters of each hypothesis #' to print or plot. If \code{NULL}, print the full hypotheses. #' Defaults to \code{20}. #' @param colors Two values specifying the colors of the posterior #' and prior density respectively. If \code{NULL} (the default) #' colors are taken from the current color scheme of #' the \pkg{bayesplot} package. #' @param ... Currently ignored. #' @inheritParams plot.brmsfit #' #' @details #' The two most important elements of a \code{brmshypothesis} object are #' \code{hypothesis}, which is a data.frame containing the summary estimates #' of the hypotheses, and \code{samples}, which is a data.frame containing #' the corresponding posterior samples. #' #' @seealso \code{\link[brms:hypothesis]{hypothesis}} NULL # internal function to evaluate hypotheses # @param x the primary object passed to the hypothesis method; # needs to be a brmsfit object or coercible to a data.frame # @param hypothesis Vector of character strings containing the hypotheses # @param class prefix of the parameters in the hypotheses # @param alpha the 'alpha-level' as understood by frequentist statistics # @return a 'brmshypothesis' object .hypothesis <- function(x, hypothesis, class, alpha, combine = TRUE, ...) { if (!is.character(hypothesis) || !length(hypothesis)) { stop2("Argument 'hypothesis' must be a character vector.") } if (length(alpha) != 1L || alpha < 0 || alpha > 1) { stop2("Argument 'alpha' must be a single value in [0,1].") } class <- as_one_character(class) out <- vector("list", length(hypothesis)) for (i in seq_along(out)) { out[[i]] <- eval_hypothesis( hypothesis[i], x = x, class = class, alpha = alpha, name = names(hypothesis)[i] ) } if (combine) { out <- combine_hlist(out, class = class, alpha = alpha) } out } # evaluate hypotheses for an arrary of ranefs or coefs # seperaly for each grouping-factor level hypothesis_coef <- function(x, hypothesis, alpha, ...) { stopifnot(is.array(x), length(dim(x)) == 3L) levels <- dimnames(x)[[2]] coefs <- dimnames(x)[[3]] x <- lapply(seq_along(levels), function(l) structure(as.data.frame(x[, l, ]), names = coefs) ) out <- vector("list", length(levels)) for (l in seq_along(levels)) { out[[l]] <- .hypothesis( x[[l]], hypothesis, class = "", alpha = alpha, combine = FALSE, ... ) for (i in seq_along(out[[l]])) { out[[l]][[i]]$summary$Group <- levels[l] } } out <- unlist(out, recursive = FALSE) out <- as.list(matrix(out, ncol = length(hypothesis), byrow = TRUE)) out <- combine_hlist(out, class = "", alpha = alpha) out$hypothesis$Group <- factor(out$hypothesis$Group, levels) out$hypothesis <- move2start(out$hypothesis, "Group") out } # combine list of outputs of eval_hypothesis # @param hlist list of evaluate hypothesis # @return a 'brmshypothesis' object combine_hlist <- function(hlist, class, alpha) { stopifnot(is.list(hlist)) hs <- do_call(rbind, lapply(hlist, function(h) h$summary)) rownames(hs) <- NULL samples <- lapply(hlist, function(h) h$samples) samples <- as.data.frame(do_call(cbind, samples)) prior_samples <- lapply(hlist, function(h) h$prior_samples) prior_samples <- as.data.frame(do_call(cbind, prior_samples)) names(samples) <- names(prior_samples) <- paste0("H", seq_along(hlist)) class <- sub("_+$", "", class) out <- nlist(hypothesis = hs, samples, prior_samples, class, alpha) structure(out, class = "brmshypothesis") } # evaluate a single hypothesis based on the posterior samples eval_hypothesis <- function(h, x, class, alpha, name = NULL) { stopifnot(length(h) == 1L && is.character(h)) pars <- parnames(x)[grepl(paste0("^", class), parnames(x))] # parse hypothesis string h <- gsub("[ \t\r\n]", "", h) sign <- get_matches("=|<|>", h) lr <- get_matches("[^=<>]+", h) if (length(sign) != 1L || length(lr) != 2L) { stop2("Every hypothesis must be of the form 'left (= OR < OR >) right'.") } h <- paste0("(", lr[1], ")") h <- paste0(h, ifelse(lr[2] != "0", paste0("-(", lr[2], ")"), "")) varsH <- find_vars(h) parsH <- paste0(class, varsH) miss_pars <- setdiff(parsH, pars) if (length(miss_pars)) { miss_pars <- collapse_comma(miss_pars) stop2("Some parameters cannot be found in the model: \n", miss_pars) } # rename hypothesis for correct evaluation h_renamed <- rename(h, c(":", "[", "]", ","), c("___", ".", ".", "..")) # get posterior and prior samples pattern <- c(paste0("^", class), ":", "\\[", "\\]", ",") repl <- c("", "___", ".", ".", "..") samples <- posterior_samples(x, pars = parsH, fixed = TRUE) names(samples) <- rename(names(samples), pattern, repl, fixed = FALSE) samples <- as.matrix(eval2(h_renamed, samples)) prior_samples <- prior_samples(x, pars = parsH, fixed = TRUE) if (!is.null(prior_samples) && ncol(prior_samples) == length(varsH)) { names(prior_samples) <- rename( names(prior_samples), pattern, repl, fixed = FALSE ) prior_samples <- as.matrix(eval2(h_renamed, prior_samples)) } else { prior_samples <- NULL } # summarize hypothesis wsign <- switch(sign, "=" = "equal", "<" = "less", ">" = "greater") probs <- switch(sign, "=" = c(alpha / 2, 1 - alpha / 2), "<" = c(alpha, 1 - alpha), ">" = c(alpha, 1 - alpha) ) sm <- lapply( c("mean", "sd", "quantile", "evidence_ratio"), get_estimate, samples = samples, probs = probs, wsign = wsign, prior_samples = prior_samples ) sm <- as.data.frame(matrix(unlist(sm), nrow = 1)) names(sm) <- c("Estimate", "Est.Error", "CI.Lower", "CI.Upper", "Evid.Ratio") sm$Post.Prob <- sm$Evid.Ratio / (1 + sm$Evid.Ratio) if (is.infinite(sm$Evid.Ratio)) { sm$Post.Prob <- 1 } if (sign == "=") { sm$Star <- str_if(!(sm$CI.Lower <= 0 && 0 <= sm$CI.Upper), "*") } else { sm$Star <- str_if(sm$Post.Prob > 1 - alpha, "*") } if (!length(name) || !nzchar(name)) { name <- paste(h, sign, "0") } sm$Hypothesis <- as_one_character(name) sm <- move2start(sm, "Hypothesis") if (is.null(prior_samples)) { prior_samples <- as.matrix(rep(NA, nrow(samples))) } nlist(summary = sm, samples, prior_samples) } # find all valid variable names in a string # @param x a character string # @param dot are dots allowed in variable names? # @param brackets allow brackets at the end of variable names? # @return all valid variable names within the string # @note does not use the R parser itself to allow for double points, # square brackets, and commas at the end of names find_vars <- function(x, dot = TRUE, brackets = TRUE) { x <- gsub("[[:space:]]", "", as_one_character(x)) dot <- as_one_logical(dot) brackets <- as_one_logical(brackets) regex_all <- paste0( "([^([:digit:]|[:punct:])]", if (dot) "|\\.", ")", "[[:alnum:]_\\:", if (dot) "\\.", "]*", if (brackets) "(\\[[^],]+(,[^],]+)*\\])?" ) pos_all <- gregexpr(regex_all, x)[[1]] regex_fun <- paste0( "([^([:digit:]|[:punct:])]", if (dot) "|\\.", ")", "[[:alnum:]_", if (dot) "\\.", "]*\\(" ) pos_fun <- gregexpr(regex_fun, x)[[1]] pos_decnum <- gregexpr("\\.[[:digit:]]+", x)[[1]] keep <- !pos_all %in% c(pos_fun, pos_decnum) pos_var <- pos_all[keep] attr(pos_var, "match.length") <- attributes(pos_all)$match.length[keep] if (length(pos_var)) { out <- unique(unlist(regmatches(x, list(pos_var)))) } else { out <- character(0) } out } #' Compute Density Ratios #' #' Compute the ratio of two densities at given points based on samples of the #' corresponding distributions. #' #' @param x Vector of samples from the first distribution, usually the posterior #' distribution of the quantity of interest. #' @param y Optional vector of samples from the second distribution, usually the #' prior distribution of the quantity of interest. If \code{NULL} (the #' default), only the density of \code{x} will be evaluated. #' @param point Numeric values at which to evaluate and compare the densities. #' Defaults to \code{0}. #' @param n Single numeric value. Influences the accuracy of the density #' estimation. See \code{\link[stats:density]{density}} for details. #' @param ... Further arguments passed to \code{\link[stats:density]{density}}. #' #' @return A vector of length equal to \code{length(point)}. If \code{y} is #' provided, the density ratio of \code{x} against \code{y} is returned. Else, #' only the density of \code{x} is returned. #' #' @details In order to achieve sufficient accuracy in the density estimation, #' more samples than usual are required. That is you may need an effective #' sample size of 10,000 or more to reliably estimate the densities. #' #' @examples #' x <- rnorm(10000) #' y <- rnorm(10000, mean = 1) #' density_ratio(x, y, point = c(0, 1)) #' #' @export density_ratio <- function(x, y = NULL, point = 0, n = 4096, ...) { x <- as.numeric(x) point <- as.numeric(point) dots <- list(...) dots <- dots[names(dots) %in% names(formals("density.default"))] dots$n <- n eval_density <- function(x, point) { # evaluate density of x at point from <- min(x) to <- max(x) if (from > point) { from <- point - sd(x) / 4 } else if (to < point) { to <- point + sd(x) / 4 } dens <- do_call(density, c(nlist(x, from, to), dots)) return(spline(dens$x, dens$y, xout = point)$y) } out <- ulapply(point, eval_density, x = x) if (!is.null(y)) { y <- as.numeric(y) out <- out / ulapply(point, eval_density, x = y) } out } # compute the evidence ratio between two disjunct hypotheses # @param x posterior samples # @param cut the cut point between the two hypotheses # @param wsign direction of the hypothesis # @param prior_samples optional prior samples for two-sided hypothesis # @param ... optional arguments passed to density_ratio # @return the evidence ratio of the two hypothesis evidence_ratio <- function(x, cut = 0, wsign = c("equal", "less", "greater"), prior_samples = NULL, ...) { wsign <- match.arg(wsign) if (wsign == "equal") { if (is.null(prior_samples)) { out <- NA } else { out <- density_ratio(x, prior_samples, point = cut, ...) } } else if (wsign == "less") { out <- length(which(x < cut)) out <- out / (length(x) - out) } else if (wsign == "greater") { out <- length(which(x > cut)) out <- out / (length(x) - out) } out } # round all numeric elements of a list-like object round_numeric <- function(x, digits = 2) { stopifnot(is.list(x)) for (i in seq_along(x)) { if (is.numeric(x[[i]])) { x[[i]] <- round(x[[i]], digits = digits) } } x } #' @rdname brmshypothesis #' @export print.brmshypothesis <- function(x, digits = 2, chars = 20, ...) { # make sure hypothesis names are not too long x$hypothesis$Hypothesis <- limit_chars( x$hypothesis$Hypothesis, chars = chars ) cat(paste0("Hypothesis Tests for class ", x$class, ":\n")) x$hypothesis <- round_numeric(x$hypothesis, digits = digits) print(x$hypothesis, quote = FALSE) pone <- (1 - x$alpha * 2) * 100 ptwo <- (1 - x$alpha) * 100 cat(glue( "---\n'CI': {pone}%-CI for one-sided and {ptwo}%-CI for two-sided hypotheses.\n", "'*': For one-sided hypotheses, the posterior probability exceeds {ptwo}%;\n", "for two-sided hypotheses, the value tested against lies outside the {ptwo}%-CI.\n", "Posterior probabilities of point hypotheses assume equal prior probabilities.\n" )) invisible(x) } #' @rdname brmshypothesis #' @method plot brmshypothesis #' @export plot.brmshypothesis <- function(x, N = 5, ignore_prior = FALSE, chars = 40, colors = NULL, theme = NULL, ask = TRUE, plot = TRUE, ...) { dots <- list(...) if (!is.data.frame(x$samples)) { stop2("No posterior samples found") } plot <- use_alias(plot, dots$do_plot) if (is.null(colors)) { colors <- bayesplot::color_scheme_get()[c(6, 2)] colors <- unname(unlist(colors)) } if (length(colors) != 2L) { stop2("Argument 'colors' must be of length 2.") } .plot_fun <- function(samples) { ggplot(samples, aes_string(x = "values")) + facet_wrap("ind", ncol = 1, scales = "free") + geom_density(aes_string(fill = "Type"), alpha = 0.7, na.rm = TRUE) + scale_fill_manual(values = colors) + xlab("") + ylab("") + theme } samples <- cbind(x$samples, Type = "Posterior") if (!ignore_prior) { samples <- rbind(samples, cbind(x$prior_samples, Type = "Prior")) } if (plot) { default_ask <- devAskNewPage() on.exit(devAskNewPage(default_ask)) devAskNewPage(ask = FALSE) } hyps <- limit_chars(x$hypothesis$Hypothesis, chars = chars) names(samples)[seq_along(hyps)] <- hyps nplots <- ceiling(length(hyps) / N) plots <- vector(mode = "list", length = nplots) for (i in seq_len(nplots)) { rel_hyps <- hyps[((i - 1) * N + 1):min(i * N, length(hyps))] sub_samples <- cbind( utils::stack(samples[, rel_hyps, drop = FALSE]), samples[, "Type", drop = FALSE] ) # make sure that parameters appear in the original order sub_samples$ind <- with(sub_samples, factor(ind, levels = unique(ind))) plots[[i]] <- .plot_fun(sub_samples) if (plot) { plot(plots[[i]]) if (i == 1) devAskNewPage(ask = ask) } } invisible(plots) } brms/R/bayes_R2.R0000644000176200001440000000644013606326626013225 0ustar liggesusers#' Compute a Bayesian version of R-squared for regression models #' #' @aliases bayes_R2 #' #' @inheritParams predict.brmsfit #' @param ... Further arguments passed to #' \code{\link[brms:pp_expect.brmsfit]{pp_expect}}, #' which is used in the computation of the R-squared values. #' #' @return If \code{summary = TRUE} a 1 x C matrix is returned #' (\code{C = length(probs) + 2}) containing summary statistics #' of Bayesian R-squared values. #' If \code{summary = FALSE} the posterior samples of the R-squared values #' are returned in a S x 1 matrix (S is the number of samples). #' #' @details For an introduction to the approach, see Gelman et al. (2018) #' and \url{https://github.com/jgabry/bayes_R2/}. #' #' @references Andrew Gelman, Ben Goodrich, Jonah Gabry & Aki Vehtari. (2018). #' R-squared for Bayesian regression models, \emph{The American Statistician}. #' \url{https://doi.org/10.1080/00031305.2018.1549100}. (Preprint available at #' \url{https://stat.columbia.edu/~gelman/research/published/bayes_R2_v3.pdf}.) #' #' @examples #' \dontrun{ #' fit <- brm(mpg ~ wt + cyl, data = mtcars) #' summary(fit) #' bayes_R2(fit) #' #' # compute R2 with new data #' nd <- data.frame(mpg = c(10, 20, 30), wt = c(4, 3, 2), cyl = c(8, 6, 4)) #' bayes_R2(fit, newdata = nd) #' } #' #' @method bayes_R2 brmsfit #' @importFrom rstantools bayes_R2 #' @export bayes_R2 #' @export bayes_R2.brmsfit <- function(object, resp = NULL, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) { contains_samples(object) object <- restructure(object) resp <- validate_resp(resp, object) summary <- as_one_logical(summary) R2 <- get_criterion(object, "bayes_R2") if (is.matrix(R2)) { # assumes unsummarized 'R2' as ensured by 'add_criterion' take <- colnames(R2) %in% paste0("R2", resp) R2 <- R2[, take, drop = FALSE] if (summary) { R2 <- posterior_summary(R2, probs = probs, robust = robust) } return(R2) } family <- family(object, resp = resp) if (conv_cats_dpars(family)) { stop2("'bayes_R2' is not defined for unordered categorical models.") } if (is_ordinal(family)) { warning2( "Predictions are treated as continuous variables in ", "'bayes_R2' which is likely invalid for ordinal families." ) } # see https://github.com/jgabry/bayes_R2/blob/master/bayes_R2.pdf .bayes_R2 <- function(y, ypred, ...) { e <- -1 * sweep(ypred, 2, y) var_ypred <- matrixStats::rowVars(ypred) var_e <- matrixStats::rowVars(e) return(as.matrix(var_ypred / (var_ypred + var_e))) } args_y <- list(object, warn = TRUE, ...) args_ypred <- list(object, sort = TRUE, ...) R2 <- named_list(paste0("R2", resp)) for (i in seq_along(R2)) { # assumes expectations of different responses to be independent args_ypred$resp <- args_y$resp <- resp[i] y <- do_call(get_y, args_y) ypred <- do.call(pp_expect, args_ypred) if (is_ordinal(family(object, resp = resp[i]))) { ypred <- ordinal_probs_continuous(ypred) } R2[[i]] <- .bayes_R2(y, ypred) } R2 <- do_call(cbind, R2) colnames(R2) <- paste0("R2", resp) if (summary) { R2 <- posterior_summary(R2, probs = probs, robust = robust) } R2 } brms/R/formula-re.R0000644000176200001440000005677513615270512013640 0ustar liggesusers# This file contains functions dealing with the extended # lme4-like formula syntax to specify group-level terms #' Set up basic grouping terms in \pkg{brms} #' #' Function used to set up a basic grouping term in \pkg{brms}. #' The function does not evaluate its arguments -- #' it exists purely to help set up a model with grouping terms. #' \code{gr} is called implicitly inside the package #' and there is usually no need to call it directly. #' #' @param ... One or more terms containing grouping factors. #' @param by An optional factor variable, specifying sub-populations #' of the groups. For each level of the \code{by} variable, #' a separate variance-covariance matrix will be fitted. #' Levels of the grouping factor must be nested in levels #' of the \code{by} variable. #' @param dist Name of the distribution of the group-level effects. #' Currently \code{"gaussian"} is the only option. #' #' @seealso \code{\link{brmsformula}} #' #' @examples #' \dontrun{ #' # model using basic lme4-style formula #' fit1 <- brm(count ~ Trt + (1|patient), data = epilepsy) #' summary(fit1) #' #' # equivalent model using 'gr' which is called anyway internally #' fit2 <- brm(count ~ Trt + (1|gr(patient)), data = epilepsy) #' summary(fit2) #' #' # include Trt as a by variable #' fit3 <- brm(count ~ Trt + (1|gr(patient, by = Trt)), data = epilepsy) #' summary(fit3) #' } #' #' @export gr <- function(..., by = NULL, dist = "gaussian") { label <- deparse(match.call()) groups <- as.character(as.list(substitute(list(...)))[-1]) if (length(groups) > 1L) { stop2("Grouping structure 'gr' expects only a single grouping term") } stopif_illegal_group(groups[1]) by <- substitute(by) if (!is.null(by)) { by <- all.vars(by) if (length(by) != 1L) { stop2("Argument 'by' must contain exactly one variable.") } } else { by <- "" } dist <- match.arg(dist, c("gaussian", "student")) allvars <- str2formula(c(groups, by)) nlist(groups, allvars, label, by, dist, type = "") } #' Set up multi-membership grouping terms in \pkg{brms} #' #' Function to set up a multi-membership grouping term in \pkg{brms}. #' The function does not evaluate its arguments -- #' it exists purely to help set up a model with grouping terms. #' #' @inheritParams gr #' @param weights A matrix specifying the weights of each member. #' It should have as many columns as grouping terms specified in \code{...}. #' If \code{NULL} (the default), equally weights are used. #' @param scale Logical; if \code{TRUE} (the default), #' weights are standardized in order to sum to one per row. #' If negative weights are specified, \code{scale} needs #' to be set to \code{FALSE}. #' #' @seealso \code{\link{brmsformula}}, \code{\link{mmc}} #' #' @examples #' \dontrun{ #' # simulate some data #' dat <- data.frame( #' y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), #' g1 = sample(1:10, 100, TRUE), g2 = sample(1:10, 100, TRUE) #' ) #' #' # multi-membership model with two members per group and equal weights #' fit1 <- brm(y ~ x1 + (1|mm(g1, g2)), data = dat) #' summary(fit1) #' #' # weight the first member two times for than the second member #' dat$w1 <- rep(2, 100) #' dat$w2 <- rep(1, 100) #' fit2 <- brm(y ~ x1 + (1|mm(g1, g2, weights = cbind(w1, w2))), data = dat) #' summary(fit2) #' #' # multi-membership model with level specific covariate values #' dat$xc <- (dat$x1 + dat$x2) / 2 #' fit3 <- brm(y ~ xc + (1 + mmc(x1, x2) | mm(g1, g2)), data = dat) #' summary(fit3) #' } #' #' @export mm <- function(..., weights = NULL, scale = TRUE, dist = "gaussian") { label <- deparse(match.call()) groups <- as.character(as.list(substitute(list(...)))[-1]) if (length(groups) < 2) { stop2("Multi-membership terms require at least two grouping variables.") } for (i in seq_along(groups)) { stopif_illegal_group(groups[i]) } dist <- match.arg(dist, c("gaussian", "student")) scale <- as_one_logical(scale) weights <- substitute(weights) weightvars <- all.vars(weights) allvars <- str2formula(c(groups, weightvars)) if (!is.null(weights)) { weights <- str2formula(deparse_no_string(weights)) attr(weights, "scale") <- scale weightvars <- str2formula(weightvars) } nlist( groups, weights, weightvars, allvars, label, by = "", dist, type = "mm" ) } #' Multi-Membership Covariates #' #' Specify covarariates that vary over different levels #' of multi-membership grouping factors thus requiring #' special treatment. This function is almost solely useful, #' when called in combination with \code{\link{mm}}. #' Outside of multi-membership terms it will behave #' very much like \code{\link{cbind}}. #' #' @param ... One or more terms containing covariates #' corresponding to the grouping levels specified in \code{\link{mm}}. #' #' @return A matrix with covariates as columns. #' #' @seealso \code{\link{mm}} #' #' @examples #' \dontrun{ #' # simulate some data #' dat <- data.frame( #' y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), #' g1 = sample(1:10, 100, TRUE), g2 = sample(1:10, 100, TRUE) #' ) #' #' # multi-membership model with level specific covariate values #' dat$xc <- (dat$x1 + dat$x2) / 2 #' fit <- brm(y ~ xc + (1 + mmc(x1, x2) | mm(g1, g2)), data = dat) #' summary(fit) #' } #' #' @export mmc <- function(...) { dots <- list(...) if (any(ulapply(dots, is_like_factor))) { stop2("'mmc' requires numeric variables.") } out <- cbind(...) colnames(out) <- paste0("?", colnames(out)) out } # check if the group part of a group-level term is invalid # @param group the group part of a group-level term illegal_group_expr <- function(group) { group <- as_one_character(group) valid_expr <- ":|([^([:digit:]|[:punct:])]|\\.)[[:alnum:]_\\.]*" rsv_signs <- c("+", "-", "*", "/", "|", "::") nzchar(gsub(valid_expr, "", group)) || any(ulapply(rsv_signs, grepl, x = group, fixed = TRUE)) } stopif_illegal_group <- function(group) { if (illegal_group_expr(group)) { stop2( "Illegal grouping term '", group, "'. It may contain ", "only variable names combined by the symbol ':'" ) } invisible(NULL) } re_lhs <- function(re_terms) { get_matches("^[^\\|]*", re_terms) } re_mid <- function(re_terms) { get_matches("\\|([^\\|]*\\||)", re_terms) } re_rhs <- function(re_terms) { sub("^\\|", "", get_matches("\\|[^\\|]*$", re_terms)) } # extract the three parts of group-level terms # @param re_terms character vector of RE terms in lme4 syntax # @return a data.frame with one row per group-level term re_parts <- function(re_terms) { lhs <- re_lhs(re_terms) mid <- re_mid(re_terms) rhs <- re_rhs(re_terms) out <- nlist(lhs, mid, rhs) if (any(lengths(out) != length(re_terms))) { stop2("Invalid syntax used in group-level terms.") } as.data.frame(out, stringsAsFactors = FALSE) } # split nested group-level terms and check for special effects terms # @param re_terms character vector of RE terms in lme4 syntax split_re_terms <- function(re_terms) { if (!length(re_terms)) { return(re_terms) } stopifnot(is.character(re_terms)) # split after grouping factor terms re_parts <- re_parts(re_terms) new_re_terms <- vector("list", length(re_terms)) for (i in seq_along(re_terms)) { new_re_rhs <- terms(formula(paste0("~", re_parts$rhs[i]))) new_re_rhs <- attr(new_re_rhs, "term.labels") new_re_rhs <- ifelse( !grepl("^(gr|mm)\\(", new_re_rhs), paste0("gr(", new_re_rhs, ")"), new_re_rhs ) new_re_terms[[i]] <- paste0( re_parts$lhs[i], re_parts$mid[i], new_re_rhs ) } re_terms <- unlist(new_re_terms) # split after coefficient types re_parts <- re_parts(re_terms) new_re_terms <- type <- vector("list", length(re_terms)) for (i in seq_along(re_terms)) { lhs_form <- formula(paste("~", re_parts$lhs[i])) lhs_all_terms <- all_terms(lhs_form) # otherwise varying intercepts cannot be handled reliably is_cs_term <- grepl_expr(regex_sp("cs"), lhs_all_terms) if (any(is_cs_term) && !all(is_cs_term)) { stop2("Please specify category specific effects ", "in separate group-level terms.") } new_lhs <- NULL # prepare effects of special terms valid_types <- c("sp", "cs", "mmc") invalid_types <- c("sm", "gp") for (t in c(valid_types, invalid_types)) { lhs_tform <- do_call(paste0("parse_", t), list(lhs_form)) if (is.formula(lhs_tform)) { if (t %in% invalid_types) { stop2("Cannot handle splines or GPs in group-level terms.") } new_lhs <- c(new_lhs, formula2str(lhs_tform, rm = 1)) type[[i]] <- c(type[[i]], t) } } # prepare effects of basic terms fe_form <- parse_fe(lhs_form) fe_terms <- all_terms(fe_form) has_intercept <- attr(terms(fe_form), "intercept") if (length(fe_terms) || has_intercept && !"cs" %in% type[[i]]) { new_lhs <- c(new_lhs, formula2str(fe_form, rm = 1)) type[[i]] <- c(type[[i]], "") } if (length(new_lhs) > 1 && re_parts$mid[i] != "||") { id <- gsub("\\|", "", re_parts$mid[i]) if (!nzchar(id)) { # ID is required to model coefficients as correlated # if multiple types are provided within the same term id <- collapse(sample(0:9, 10, TRUE)) re_parts$mid[i] <- paste0("|", id, "|") } } new_re_terms[[i]] <- paste0(new_lhs, re_parts$mid[i], re_parts$rhs[i]) new_re_terms[[i]] <- new_re_terms[[i]][order(type[[i]])] type[[i]] <- sort(type[[i]]) } re_terms <- unlist(new_re_terms) structure(re_terms, type = unlist(type)) } # extract group-level terms from a formula of character vector # @param x formula or character vector # @param formula return a formula rather than a character string? # @param brackets include group-level terms in brackets? get_re_terms <- function(x, formula = FALSE, brackets = TRUE) { if (is.formula(x)) { x <- all_terms(x) } re_pos <- grepl("\\|", x) out <- x[re_pos] if (brackets && length(out)) { out <- paste0("(", out, ")") } if (formula) { if (length(out)) { out <- formula(paste("~ 1", collapse("+", out))) } else { out <- ~ 1 } } out } # validate the re_formula argument # @inheritParams extract_draws.brmsfit # @param formula: formula to match re_formula with # @return updated re_formula containing only terms existent in formula check_re_formula <- function(re_formula, formula) { old_re_formula <- get_re_terms(formula, formula = TRUE) if (is.null(re_formula)) { re_formula <- old_re_formula } else if (SW(anyNA(re_formula))) { re_formula <- ~1 } else { re_formula <- get_re_terms(as.formula(re_formula), formula = TRUE) new <- parse_bf(re_formula, check_response = FALSE)$dpars$mu[["re"]] old <- parse_bf(old_re_formula, check_response = FALSE)$dpars$mu[["re"]] if (NROW(new) && NROW(old)) { # compare old and new ranefs new_terms <- lapply(new$form, terms) found <- rep(FALSE, NROW(new)) for (i in seq_rows(new)) { group <- new$group[[i]] old_terms <- lapply(old$form[old$group == group], terms) j <- 1 while (!found[i] && j <= length(old_terms)) { new_term_labels <- attr(new_terms[[i]], "term.labels") old_term_labels <- attr(old_terms[[j]], "term.labels") new_intercept <- attr(new_terms[[i]], "intercept") old_intercept <- attr(old_terms[[j]], "intercept") found[i] <- isTRUE( all(new_term_labels %in% old_term_labels) && new_intercept <= old_intercept ) if (found[i]) { # terms have to maintain the original order so that Z_* data # and r_* parameters match in 'extract_draws' (fixes issue #844) term_matches <- match(new_term_labels, old_term_labels) if (is.unsorted(term_matches)) { stop2("Order of terms in 're_formula' should match the original order.") } } j <- j + 1 } } new <- new[found, ] if (NROW(new)) { forms <- ulapply(new$form, formula2str, rm = 1) groups <- ulapply(new$gcall, "[[", "label") re_terms <- paste("(", forms, "|", groups, ")") re_formula <- formula(paste("~", paste(re_terms, collapse = "+"))) } else { re_formula <- ~1 } } else { re_formula <- ~1 } } re_formula } # remove existing group-level terms in formula and # add valid group-level terms of re_formula update_re_terms <- function(formula, re_formula) { UseMethod("update_re_terms") } #' @export update_re_terms.mvbrmsformula <- function(formula, re_formula) { formula$forms <- lapply(formula$forms, update_re_terms, re_formula) formula } #' @export update_re_terms.brmsformula <- function(formula, re_formula) { formula$formula <- update_re_terms(formula$formula, re_formula) formula$pforms <- lapply(formula$pforms, update_re_terms, re_formula) formula } #' @export update_re_terms.formula <- function(formula, re_formula = NULL) { if (is.null(re_formula) || get_nl(formula)) { return(formula) } re_formula <- check_re_formula(re_formula, formula) new_formula <- formula2str(formula) old_re_terms <- get_re_terms(formula, brackets = FALSE) if (length(old_re_terms)) { # remove old group-level terms rm_terms <- c( paste0("+(", old_re_terms, ")"), paste0("(", old_re_terms, ")"), old_re_terms ) new_formula <- rename(new_formula, rm_terms, "") if (grepl("~\\+*$", new_formula)) { # lhs only formulas are syntactically invalid # also check for trailing '+' signs (#769) new_formula <- paste(new_formula, "1") } } # add new group-level terms new_re_terms <- get_re_terms(re_formula) new_formula <- paste(c(new_formula, new_re_terms), collapse = "+") new_formula <- formula(new_formula) attributes(new_formula) <- attributes(formula) new_formula } # extract group-level terms get_re <- function(x, ...) { UseMethod("get_re") } #' @export get_re.default <- function(x, ...) { NULL } # get group-level information in a data.frame # @param bterms object of class 'brmsterms' # @param all logical; include ranefs of additional parameters? #' @export get_re.brmsterms <- function(x, all = TRUE, ...) { if (all) { re <- named_list(c(names(x$dpars), names(x$nlpars))) for (dp in names(x$dpars)) { re[[dp]] <- get_re(x$dpars[[dp]]) } for (nlp in names(x$nlpars)) { re[[nlp]] <- get_re(x$nlpars[[nlp]]) } re <- do_call(rbind, re) } else { x$dpars[["mu"]]$nlpars <- NULL re <- get_re(x$dpars[["mu"]]) } re } #' @export get_re.mvbrmsterms <- function(x, ...) { do_call(rbind, lapply(x$terms, get_re, ...)) } #' @export get_re.btl <- function(x, ...) { px <- check_prefix(x) re <- x[["re"]] if (is.null(re)) { re <- empty_re() } re$resp <- rep(px$resp, nrow(re)) re$dpar <- rep(px$dpar, nrow(re)) re$nlpar <- rep(px$nlpar, nrow(re)) re } # gather information on group-level effects # @param bterms object of class brmsterms # @param data data.frame containing all model variables # @param all include REs of all parameters? # @param old_levels optional original levels of the grouping factors # @return a tidy data.frame with the following columns: # id: ID of the group-level effect # group: name of the grouping factor # gn: number of the grouping term within the respective formula # coef: name of the group-level effect # cn: number of the effect within the ID # resp: name of the response variable # dpar: name of the distributional parameter # nlpar: name of the non-linear parameter # cor: are correlations modeled for this effect? # ggn: global number of the grouping factor # type: special effects type; can be 'sp' or 'cs' # gcall: output of functions 'gr' or 'mm' # form: formula used to compute the effects tidy_ranef <- function(bterms, data, all = TRUE, old_levels = NULL) { data <- combine_groups(data, get_group_vars(bterms)) re <- get_re(bterms, all = all) ranef <- vector("list", nrow(re)) used_ids <- new_ids <- NULL id_groups <- list() j <- 1 for (i in seq_rows(re)) { if (!nzchar(re$type[i])) { coef <- colnames(get_model_matrix(re$form[[i]], data)) } else if (re$type[i] == "sp") { coef <- tidy_spef(re$form[[i]], data)$coef } else if (re$type[i] == "mmc") { coef <- rename(all_terms(re$form[[i]])) } else if (re$type[i] == "cs") { resp <- re$resp[i] if (nzchar(resp)) { stopifnot(is.mvbrmsterms(bterms)) nthres <- max(get_thres(bterms$terms[[resp]])) } else { stopifnot(is.brmsterms(bterms)) nthres <- max(get_thres(bterms)) } indices <- paste0("[", seq_len(nthres), "]") coef <- colnames(get_model_matrix(re$form[[i]], data = data)) coef <- as.vector(t(outer(coef, indices, paste0))) } avoid_dpars(coef, bterms = bterms) rdat <- data.frame( id = re$id[[i]], group = re$group[[i]], gn = re$gn[[i]], gtype = re$gtype[[i]], coef = coef, cn = NA, resp = re$resp[[i]], dpar = re$dpar[[i]], nlpar = re$nlpar[[i]], ggn = NA, cor = re$cor[[i]], type = re$type[[i]], by = re$gcall[[i]]$by, dist = re$gcall[[i]]$dist, stringsAsFactors = FALSE ) bylevels <- NULL if (nzchar(rdat$by[1])) { bylevels <- rm_wsp(levels(factor(get(rdat$by[1], data)))) } rdat$bylevels <- repl(bylevels, nrow(rdat)) rdat$form <- repl(re$form[[i]], nrow(rdat)) rdat$gcall <- repl(re$gcall[[i]], nrow(rdat)) # prepare group-level IDs id <- re$id[[i]] if (is.na(id)) { rdat$id <- j j <- j + 1 } else { if (id %in% used_ids) { k <- match(id, used_ids) rdat$id <- new_ids[k] new_id_groups <- c(re$group[[i]], re$gcall[[i]]$groups) if (!identical(new_id_groups, id_groups[[k]])) { stop2("Can only combine group-level terms of the ", "same grouping factors.") } } else { used_ids <- c(used_ids, id) k <- length(used_ids) rdat$id <- new_ids[k] <- j id_groups[[k]] <- c(re$group[[i]], re$gcall[[i]]$groups) j <- j + 1 } } ranef[[i]] <- rdat } ranef <- do_call(rbind, c(list(empty_ranef()), ranef)) # check for overlap between different group types rsv_groups <- ranef[nzchar(ranef$gtype), "group"] other_groups <- ranef[!nzchar(ranef$gtype), "group"] inv_groups <- intersect(rsv_groups, other_groups) if (length(inv_groups)) { inv_groups <- paste0("'", inv_groups, "'", collapse = ", ") stop2("Grouping factor names ", inv_groups, " are resevered.") } # check for duplicated and thus not identified effects dup <- duplicated(ranef[, c("group", "coef", vars_prefix())]) if (any(dup)) { dr <- ranef[which(dup)[1], ] stop2( "Duplicated group-level effects are not allowed.\n", "Occured for effect '", dr$coef, "' of group '", dr$group, "'." ) } if (nrow(ranef)) { for (id in unique(ranef$id)) { ranef$cn[ranef$id == id] <- seq_len(sum(ranef$id == id)) } ranef$ggn <- match(ranef$group, unique(ranef$group)) if (is.null(old_levels)) { rsub <- ranef[!duplicated(ranef$group), ] levels <- named_list(rsub$group) for (i in seq_along(levels)) { # combine levels of all grouping factors within one grouping term levels[[i]] <- unique(ulapply( rsub$gcall[[i]]$groups, function(g) levels(factor(get(g, data))) )) # store information of corresponding by levels if (nzchar(rsub$by[i])) { stopifnot(!nzchar(rsub$type[i])) by <- rsub$by[i] bylevels <- rsub$bylevels[[i]] g <- rsub$gcall[[i]]$groups J <- match(get(g, data), levels[[i]]) df <- unique(data.frame(J, by = rm_wsp(get(by, data)))) if (nrow(df) > length(unique(J))) { stop2("Some levels of '", g, "' correspond ", "to multiple levels of '", by, "'.") } df <- df[order(df$J), ] by_per_level <- bylevels[match(df$by, bylevels)] attr(levels[[i]], "by") <- by_per_level } } attr(ranef, "levels") <- levels } else { # for newdata numeration has to depend on the original levels attr(ranef, "levels") <- old_levels } } # ordering after IDs matches the order of the posterior samples # if multiple IDs are used for the same grouping factor (#835) ranef <- ranef[order(ranef$id), , drop = FALSE] structure(ranef, class = c("ranef_frame", "data.frame")) } empty_ranef <- function() { structure( data.frame( id = numeric(0), group = character(0), gn = numeric(0), coef = character(0), cn = numeric(0), resp = character(0), dpar = character(0), nlpar = character(0), ggn = numeric(0), cor = logical(0), type = character(0), form = character(0), stringsAsFactors = FALSE ), class = c("ranef_frame", "data.frame") ) } empty_re <- function() { data.frame( group = character(0), gtype = character(0), gn = numeric(0), id = numeric(0), type = character(0), cor = logical(0), form = character(0) ) } is.ranef_frame <- function(x) { inherits(x, "ranef_frame") } # extract names of all grouping variables get_group_vars <- function(x, ...) { UseMethod("get_group_vars") } #' @export get_group_vars.brmsfit <- function(x, ...) { get_group_vars(x$formula, ...) } #' @export get_group_vars.default <- function(x, ...) { get_group_vars(parse_bf(x), ...) } #' @export get_group_vars.brmsterms <- function(x, ...) { .get_group_vars(x, ...) } #' @export get_group_vars.mvbrmsterms <- function(x, ...) { .get_group_vars(x, ...) } .get_group_vars <- function(x, ...) { out <- c(get_re_groups(x), get_me_groups(x), get_ac_groups(x)) out <- out[nzchar(out)] if (length(out)) { c(out) <- unlist(strsplit(out, ":")) out <- sort(unique(out)) } out } # get names of grouping variables of re terms get_re_groups <- function(x, ...) { ulapply(get_re(x)$gcall, "[[", "groups") } # extract information about groups with a certain distribution get_dist_groups <- function(ranef, dist) { out <- subset2(ranef, dist = dist) out[!duplicated(out$group), c("group", "ggn", "id")] } # extract list of levels with one element per grouping factor # @param ... objects with a level attribute get_levels <- function(...) { dots <- list(...) out <- vector("list", length(dots)) for (i in seq_along(out)) { levels <- attr(dots[[i]], "levels", exact = TRUE) if (is.list(levels)) { stopifnot(!is.null(names(levels))) out[[i]] <- as.list(levels) } else if (!is.null(levels)) { stopifnot(isTRUE(nzchar(names(dots)[i]))) out[[i]] <- setNames(list(levels), names(dots)[[i]]) } } out <- unlist(out, recursive = FALSE) out[!duplicated(names(out))] } # extract names of group-level effects # @param ranef output of tidy_ranef() # @param group optinal name of a grouping factor for # which to extract effect names # @param bylevels optional names of 'by' levels for # which to extract effect names # @return a vector of character strings get_rnames <- function(ranef, group = NULL, bylevels = NULL) { stopifnot(is.data.frame(ranef)) if (!is.null(group)) { group <- as_one_character(group) ranef <- subset2(ranef, group = group) } stopifnot(length(unique(ranef$group)) == 1L) out <- paste0(usc(combine_prefix(ranef), "suffix"), ranef$coef) if (isTRUE(nzchar(ranef$by[1]))) { if (!is.null(bylevels)) { stopifnot(all(bylevels %in% ranef$bylevels[[1]])) } else { bylevels <- ranef$bylevels[[1]] } bylabels <- paste0(ranef$by[1], bylevels) out <- outer(out, bylabels, paste, sep = ":") } out } brms/R/exclude_terms.R0000644000176200001440000000300513611527526014412 0ustar liggesusers# exclude predictor terms from being evaluated exclude_terms <- function(x, ...) { UseMethod("exclude_terms") } #' @export exclude_terms.brmsfit <- function(x, ...) { x$formula <- exclude_terms(x$formula, ...) x } #' @export exclude_terms.mvbrmsformula <- function(x, ...) { for (i in seq_along(x$forms)) { x$forms[[i]] <- exclude_terms(x$forms[[i]], ...) } x } #' @export exclude_terms.brmsformula <- function( x, excl_term_types = NULL, incl_autocor = TRUE, smooths_only = FALSE, offset = TRUE, ... ) { excl_term_types <- as.character(excl_term_types) # TODO: deprecate the three arguments below? incl_autocor <- as_one_logical(incl_autocor) smooths_only <- as_one_logical(smooths_only) offset <- as_one_logical(offset) if (!incl_autocor) { c(excl_term_types) <- "ac" } if (!offset) { c(excl_term_types) <- "offset" } if (smooths_only) { excl_term_types <- setdiff(all_term_types(), "sm") } if (!length(excl_term_types)) { return(x) } invalid_types <- setdiff(excl_term_types, all_term_types()) if (length(invalid_types)) { stop2("The following term types are invalid: ", collapse_comma(invalid_types)) } attr(x$formula, "excl_term_types") <- excl_term_types for (i in seq_along(x$pforms)) { attr(x$pforms[[i]], "excl_term_types") <- excl_term_types } x } # extract names of excluded term types excluded_term_types <- function(x) { as.character(attr(x, "excl_term_types", TRUE)) } brms/R/bridgesampling.R0000644000176200001440000002110513606326626014541 0ustar liggesusers#' Log Marginal Likelihood via Bridge Sampling #' #' Computes log marginal likelihood via bridge sampling, #' which can be used in the computation of bayes factors #' and posterior model probabilities. #' The \code{brmsfit} method is just a thin wrapper around #' the corresponding method for \code{stanfit} objects. #' #' @aliases bridge_sampler #' #' @param samples A \code{brmsfit} object. #' @param ... Additional arguments passed to #' \code{\link[bridgesampling:bridge_sampler]{bridge_sampler.stanfit}}. #' #' @details Computing the marginal likelihood requires samples #' of all variables defined in Stan's \code{parameters} block #' to be saved. Otherwise \code{bridge_sampler} cannot be computed. #' Thus, please set \code{save_all_pars = TRUE} in the call to \code{brm}, #' if you are planning to apply \code{bridge_sampler} to your models. #' #' The computation of marginal likelihoods based on bridge sampling requires #' a lot more posterior samples than usual. A good conservative #' rule of thump is perhaps 10-fold more samples (read: the default of 4000 #' samples may not be enough in many cases). If not enough posterior #' samples are provided, the bridge sampling algorithm tends to be #' unstable leading to considerably different results each time it is run. #' We thus recommend running \code{bridge_sampler} #' multiple times to check the stability of the results. #' #' More details are provided under #' \code{\link[bridgesampling:bridge_sampler]{bridgesampling:bridge_sampler}}. #' #' @seealso \code{ #' \link[brms:bayes_factor]{bayes_factor}, #' \link[brms:post_prob]{post_prob} #' } #' #' @examples #' \dontrun{ #' # model with the treatment effect #' fit1 <- brm( #' count ~ zAge + zBase + Trt, #' data = epilepsy, family = negbinomial(), #' prior = prior(normal(0, 1), class = b), #' save_all_pars = TRUE #' ) #' summary(fit1) #' bridge_sampler(fit1) #' #' # model without the treatment effect #' fit2 <- brm( #' count ~ zAge + zBase, #' data = epilepsy, family = negbinomial(), #' prior = prior(normal(0, 1), class = b), #' save_all_pars = TRUE #' ) #' summary(fit2) #' bridge_sampler(fit2) #' } #' #' @method bridge_sampler brmsfit #' @importFrom bridgesampling bridge_sampler #' @export bridge_sampler #' @export bridge_sampler.brmsfit <- function(samples, ...) { out <- get_criterion(samples, "marglik") if (inherits(out, "bridge") && !is.na(out$logml)) { # return precomputed criterion return(out) } samples <- restructure(samples) if (samples$version$brms <= "1.8.0") { stop2( "Models fitted with brms 1.8.0 or lower are not ", "usable in method 'bridge_sampler'." ) } # otherwise bridge_sampler might not work in a new R session samples$fit@.MISC <- suppressMessages(brm(fit = samples, chains = 0))$fit@.MISC out <- try(bridge_sampler(samples$fit, ...)) if (is(out, "try-error")) { stop2( "Bridgesampling failed. Perhaps you did not set ", "'save_all_pars' to TRUE when fitting your model?" ) } out } #' Bayes Factors from Marginal Likelihoods #' #' Compute Bayes factors from marginal likelihoods. #' #' @aliases bayes_factor #' #' @param x1 A \code{brmsfit} object #' @param x2 Another \code{brmsfit} object based on the same responses. #' @param log Report Bayes factors on the log-scale? #' @param ... Additional arguments passed to #' \code{\link[brms:bridge_sampler]{bridge_sampler}}. #' #' @details Computing the marginal likelihood requires samples #' of all variables defined in Stan's \code{parameters} block #' to be saved. Otherwise \code{bayes_factor} cannot be computed. #' Thus, please set \code{save_all_pars = TRUE} in the call to \code{brm}, #' if you are planning to apply \code{bayes_factor} to your models. #' #' The computation of Bayes factors based on bridge sampling requires #' a lot more posterior samples than usual. A good conservative #' rule of thumb is perhaps 10-fold more samples (read: the default of 4000 #' samples may not be enough in many cases). If not enough posterior #' samples are provided, the bridge sampling algorithm tends to be unstable, #' leading to considerably different results each time it is run. #' We thus recommend running \code{bayes_factor} #' multiple times to check the stability of the results. #' #' More details are provided under #' \code{\link[bridgesampling:bayes_factor]{bridgesampling:bayes_factor}}. #' #' @seealso \code{ #' \link[brms:bridge_sampler]{bridge_sampler}, #' \link[brms:post_prob]{post_prob} #' } #' #' @examples #' \dontrun{ #' # model with the treatment effect #' fit1 <- brm( #' count ~ zAge + zBase + Trt, #' data = epilepsy, family = negbinomial(), #' prior = prior(normal(0, 1), class = b), #' save_all_pars = TRUE #' ) #' summary(fit1) #' #' # model without the treatment effect #' fit2 <- brm( #' count ~ zAge + zBase, #' data = epilepsy, family = negbinomial(), #' prior = prior(normal(0, 1), class = b), #' save_all_pars = TRUE #' ) #' summary(fit2) #' #' # compute the bayes factor #' bayes_factor(fit1, fit2) #' } #' #' @method bayes_factor brmsfit #' @importFrom bridgesampling bayes_factor #' @export bayes_factor #' @export bayes_factor.brmsfit <- function(x1, x2, log = FALSE, ...) { model_name_1 <- deparse_combine(substitute(x1)) model_name_2 <- deparse_combine(substitute(x2)) match_response(list(x1, x2)) bridge1 <- bridge_sampler(x1, ...) bridge2 <- bridge_sampler(x2, ...) out <- bayes_factor(bridge1, bridge2, log = log) attr(out, "model_names") <- c(model_name_1, model_name_2) out } #' Posterior Model Probabilities from Marginal Likelihoods #' #' Compute posterior model probabilities from marginal likelihoods. #' The \code{brmsfit} method is just a thin wrapper around #' the corresponding method for \code{bridge} objects. #' #' @aliases post_prob #' #' @inheritParams loo.brmsfit #' @param prior_prob Numeric vector with prior model probabilities. #' If omitted, a uniform prior is used (i.e., all models are equally #' likely a priori). The default \code{NULL} corresponds to equal #' prior model weights. #' #' @details Computing the marginal likelihood requires samples #' of all variables defined in Stan's \code{parameters} block #' to be saved. Otherwise \code{post_prob} cannot be computed. #' Thus, please set \code{save_all_pars = TRUE} in the call to \code{brm}, #' if you are planning to apply \code{post_prob} to your models. #' #' The computation of model probabilities based on bridge sampling requires #' a lot more posterior samples than usual. A good conservative #' rule of thump is perhaps 10-fold more samples (read: the default of 4000 #' samples may not be enough in many cases). If not enough posterior #' samples are provided, the bridge sampling algorithm tends to be #' unstable leading to considerably different results each time it is run. #' We thus recommend running \code{post_prob} #' multiple times to check the stability of the results. #' #' More details are provided under #' \code{\link[bridgesampling:post_prob]{bridgesampling:post_prob}}. #' #' @seealso \code{ #' \link[brms:bridge_sampler]{bridge_sampler}, #' \link[brms:bayes_factor]{bayes_factor} #' } #' #' @examples #' \dontrun{ #' # model with the treatment effect #' fit1 <- brm( #' count ~ zAge + zBase + Trt, #' data = epilepsy, family = negbinomial(), #' prior = prior(normal(0, 1), class = b), #' save_all_pars = TRUE #' ) #' summary(fit1) #' #' # model without the treatent effect #' fit2 <- brm( #' count ~ zAge + zBase, #' data = epilepsy, family = negbinomial(), #' prior = prior(normal(0, 1), class = b), #' save_all_pars = TRUE #' ) #' summary(fit2) #' #' # compute the posterior model probabilities #' post_prob(fit1, fit2) #' #' # specify prior model probabilities #' post_prob(fit1, fit2, prior_prob = c(0.8, 0.2)) #' } #' #' @method post_prob brmsfit #' @importFrom bridgesampling post_prob #' @export post_prob #' @export post_prob.brmsfit <- function(x, ..., prior_prob = NULL, model_names = NULL) { args <- split_dots(x, ..., model_names = model_names) models <- args$models args$models <- NULL bs <- vector("list", length(models)) for (i in seq_along(models)) { bs[[i]] <- do_call(bridge_sampler, c(list(models[[i]]), args)) } model_names <- names(models) do_call(post_prob, c(bs, nlist(prior_prob, model_names))) } brms/R/stan-response.R0000644000176200001440000004527113614244721014357 0ustar liggesusers# unless otherwise specifiedm functions return a named list # of Stan code snippets to be pasted together later on # Stan code for the response variables stan_response <- function(bterms, data) { stopifnot(is.brmsterms(bterms)) family <- bterms$family rtype <- str_if(use_int(family), "int", "real") multicol <- has_multicol(family) px <- check_prefix(bterms) resp <- usc(combine_prefix(px)) out <- list() str_add(out$data) <- glue( " int N{resp}; // number of observations\n" ) if (has_cat(family)) { str_add(out$data) <- glue( " int ncat{resp}; // number of categories\n" ) } if (has_multicol(family)) { if (rtype == "real") { str_add(out$data) <- glue( " vector[ncat{resp}] Y{resp}[N{resp}]; // response array\n" ) } else if (rtype == "int") { str_add(out$data) <- glue( " int Y{resp}[N{resp}, ncat{resp}]; // response array\n" ) } } else { if (rtype == "real") { # don't use real Y[n] str_add(out$data) <- glue( " vector[N{resp}] Y{resp}; // response variable\n" ) } else if (rtype == "int") { str_add(out$data) <- glue( " int Y{resp}[N{resp}]; // response variable\n" ) } } if (has_ndt(family)) { str_add(out$tdata_def) <- glue( " real min_Y{resp} = min(Y{resp});\n" ) } if (has_trials(family) || is.formula(bterms$adforms$trials)) { str_add(out$data) <- glue( " int trials{resp}[N{resp}]; // number of trials\n" ) } if (is.formula(bterms$adforms$weights)) { str_add(out$data) <- glue( " vector[N{resp}] weights{resp}; // model weights\n" ) } if (has_thres(family)) { groups <- get_thres_groups(family) if (any(nzchar(groups))) { str_add(out$data) <- glue( " int ngrthres{resp}; // number of threshold groups\n", " int nthres{resp}[ngrthres{resp}]; // number of thresholds\n", " int Jthres{resp}[N{resp}, 2]; // threshold indices\n" ) str_add(out$tdata_def) <- glue( " int nmthres{resp} = prod(nthres{resp});", " // total number of thresholds\n", " int Kthres_start{resp}[ngrthres{resp}];", " // start index per threshold group\n", " int Kthres_end{resp}[ngrthres{resp}];", " // end index per threshold group\n" ) str_add(out$tdata_comp) <- glue( " Kthres_start{resp}[1] = 1;\n", " Kthres_end{resp}[1] = nthres{resp}[1];\n", " for (i in 2:ngrthres{resp}) {{\n", " Kthres_start{resp}[i] = Kthres_end{resp}[i-1] + 1;\n", " Kthres_end{resp}[i] = Kthres_end{resp}[i-1] + nthres{resp}[i];\n", " }}\n" ) } else { str_add(out$data) <- glue( " int nthres{resp}; // number of thresholds\n" ) } } if (is.formula(bterms$adforms$se)) { str_add(out$data) <- glue( " vector[N{resp}] se{resp}; // known sampling error\n" ) str_add(out$tdata_def) <- glue( " vector[N{resp}] se2{resp} = square(se{resp});\n" ) } if (is.formula(bterms$adforms$dec)) { str_add(out$data) <- glue( " int dec{resp}[N{resp}]; // decisions\n" ) } if (is.formula(bterms$adforms$rate)) { str_add(out$data) <- glue( " vector[N{resp}] denom{resp};", " // response denominator\n" ) str_add(out$tdata_def) <- glue( " // log response denominator\n", " vector[N{resp}] log_denom{resp} = log(denom{resp});\n" ) } if (is.formula(bterms$adforms$cens)) { cens <- eval_rhs(bterms$adforms$cens) str_add(out$data) <- glue( " int cens{resp}[N{resp}]; // indicates censoring\n" ) if (cens$vars$y2 != "NA") { # interval censoring is required rcens <- str_if(rtype == "int", glue(" int rcens{resp}[N{resp}];"), glue(" vector[N{resp}] rcens{resp};") ) str_add(out$data) <- glue( rcens, " // right censor points for interval censoring\n" ) } } bounds <- trunc_bounds(bterms, data = data) if (any(bounds$lb > -Inf)) { str_add(out$data) <- glue( " {rtype} lb{resp}[N{resp}]; // lower truncation bounds;\n" ) } if (any(bounds$ub < Inf)) { str_add(out$data) <- glue( " {rtype} ub{resp}[N{resp}]; // upper truncation bounds\n" ) } if (is.formula(bterms$adforms$mi)) { Ybounds <- trunc_bounds(bterms, data, incl_family = TRUE, stan = TRUE) sdy <- get_sdy(bterms, data) if (is.null(sdy)) { # response is modeled without measurement error str_add(out$par) <- glue( " vector{Ybounds}[Nmi{resp}] Ymi{resp};", " // estimated missings\n" ) str_add(out$data) <- glue( " int Nmi{resp}; // number of missings\n", " int Jmi{resp}[Nmi{resp}];", " // positions of missings\n" ) str_add(out$model_def) <- glue( " // vector combining observed and missing responses\n", " vector[N{resp}] Yl{resp} = Y{resp};\n" ) str_add(out$model_comp_basic) <- glue( " Yl{resp}[Jmi{resp}] = Ymi{resp};\n" ) } else { str_add(out$data) <- glue( " // data for measurement-error in the response\n", " vector[N{resp}] noise{resp};\n", " // information about non-missings\n", " int Nme{resp};\n", " int Jme{resp}[Nme{resp}];\n" ) str_add(out$par) <- glue( " vector{Ybounds}[N{resp}] Yl{resp}; // latent variable\n" ) str_add(out$prior) <- glue( " target += normal_lpdf(Y{resp}[Jme{resp}]", " | Yl{resp}[Jme{resp}],", " noise{resp}[Jme{resp}]);\n" ) } } if (is.formula(bterms$adforms$vreal)) { # vectors of real values for use in custom families vreal <- eval_rhs(bterms$adforms$vreal) k <- length(vreal$vars) str_add(out$data) <- cglue( " // data for custom real vectors\n", " vector[N{resp}] vreal{seq_len(k)}{resp};\n" ) } if (is.formula(bterms$adforms$vint)) { # vectors of integer values for use in custom families vint <- eval_rhs(bterms$adforms$vint) k <- length(vint$vars) str_add(out$data) <- cglue( " // data for custom integer vectors\n", " int vint{seq_len(k)}{resp}[N{resp}];\n" ) } out } # Stan code for ordinal thresholds # intercepts in ordinal models require special treatment # and must be present even when using non-linear predictors # thus the relevant Stan code cannot be part of 'stan_fe' stan_thres <- function(bterms, data, prior, ...) { stopifnot(is.btl(bterms) || is.btnl(bterms)) out <- list() family <- bterms$family if (!is_ordinal(family)) { return(out) } px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(px$resp) type <- str_if(has_ordered_thres(family), "ordered", "vector") coef_type <- str_if(has_ordered_thres(family), "", "real") gr <- grb <- "" groups <- get_thres_groups(bterms) if (has_thres_groups(bterms)) { # include one threshold vector per group gr <- usc(seq_along(groups)) grb <- paste0("[", seq_along(groups), "]") } if (fix_intercepts(bterms)) { # identify ordinal mixtures by fixing their thresholds to the same values if (has_equidistant_thres(family)) { stop2("Cannot use equidistant and fixed thresholds at the same time.") } # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- " // ordinal thresholds\n" str_add(out$tpar_def) <- cglue( " {type}[nthres{resp}{grb}] Intercept{p}{gr};\n" ) str_add(out$tpar_comp) <- " // fix thresholds across ordinal mixture components\n" str_add(out$tpar_comp) <- cglue( " Intercept{p}{gr} = fixed_Intercept{resp}{gr};\n" ) } else { if (has_equidistant_thres(family)) { bound <- subset2(prior, class = "delta", group = "", ls = px)$bound for (i in seq_along(groups)) { str_add_list(out) <- stan_prior( prior, class = "Intercept", group = groups[i], type = "real", prefix = "first_", suffix = glue("{p}{gr[i]}"), px = px, comment = "first threshold" ) str_add_list(out) <- stan_prior( prior, class = "delta", group = groups[i], type = glue("real{bound}"), px = px, suffix = gr[i], comment = "distance between thresholds" ) } str_add(out$tpar_def) <- " // temporary thresholds for centered predictors\n" str_add(out$tpar_def) <- cglue( " {type}[nthres{resp}{grb}] Intercept{p}{gr};\n" ) str_add(out$tpar_comp) <- " // compute equidistant thresholds\n" str_add(out$tpar_comp) <- cglue( " for (k in 1:(nthres{resp}{grb})) {{\n", " Intercept{p}{gr}[k] = first_Intercept{p}{gr}", " + (k - 1.0) * delta{p}{gr};\n", " }}\n" ) } else { for (i in seq_along(groups)) { str_add_list(out) <- stan_prior( prior, class = "Intercept", group = groups[i], coef = get_thres(bterms, group = groups[i]), type = glue("{type}[nthres{resp}{grb[i]}]"), coef_type = coef_type, px = px, suffix = glue("{p}{gr[i]}"), comment = "temporary thresholds for centered predictors" ) } } } if (has_thres_groups(bterms)) { # merge all group specific thresholds into one vector str_add(out$model_def) <- glue( " vector[nmthres{resp}] merged_Intercept{p}; // merged thresholds\n" ) grj <- seq_along(groups) grj <- glue("Kthres_start{resp}[{grj}]:Kthres_end{resp}[{grj}]") str_add(out$model_comp_basic) <- cglue( " merged_Intercept{p}[{grj}] = Intercept{p}{gr};\n" ) } sub_X_means <- "" if (stan_center_X(bterms) && length(all_terms(bterms$fe))) { # centering of the design matrix improves convergence # ordinal families either use thres - mu or mu - thres # both implies adding to the temporary intercept sub_X_means <- glue(" + dot_product(means_X{p}, b{p})") } str_add(out$gen_def) <- " // compute actual thresholds\n" str_add(out$gen_def) <- cglue( " vector[nthres{resp}{grb}] b{p}_Intercept{gr}", " = Intercept{p}{gr}{sub_X_means};\n" ) out } # Stan code for the baseline functions of the Cox model stan_bhaz <- function(bterms, prior, ...) { stopifnot(is.btl(bterms) || is.btnl(bterms)) out <- list() if (!is_cox(bterms$family)) { return(out) } px <- check_prefix(bterms) p <- usc(combine_prefix(px)) resp <- usc(px$resp) str_add(out$data) <- glue( " // data for flexible baseline functions\n", " int Kbhaz{resp}; // number of basis functions\n", " // design matrix of the baseline function\n", " matrix[N{resp}, Kbhaz{resp}] Zbhaz{resp};\n", " // design matrix of the cumulative baseline function\n", " matrix[N{resp}, Kbhaz{resp}] Zcbhaz{resp};\n" ) str_add_list(out) <- stan_prior( prior, class = "sbhaz", suffix = resp, px = px, type = glue("vector[Kbhaz{resp}]"), comment = "baseline coefficients" ) str_add(out$model_def) <- glue( " // compute values of baseline function\n", " vector[N{resp}] bhaz{resp} = Zbhaz{resp} * sbhaz{resp};\n", " // compute values of cumulative baseline function\n", " vector[N{resp}] cbhaz{resp} = Zcbhaz{resp} * sbhaz{resp};\n" ) out } # Stan code specific to mixture families stan_mixture <- function(bterms, data, prior) { out <- list() if (!is.mixfamily(bterms$family)) { return(out) } px <- check_prefix(bterms) p <- usc(combine_prefix(px)) nmix <- length(bterms$family$mix) theta_pred <- grepl("^theta", names(bterms$dpars)) theta_pred <- bterms$dpars[theta_pred] theta_fix <- grepl("^theta", names(bterms$fdpars)) theta_fix <- bterms$fdpars[theta_fix] def_thetas <- cglue( " real theta{1:nmix}{p}; // mixing proportion\n" ) if (length(theta_pred)) { if (length(theta_pred) != nmix - 1) { stop2("Can only predict all but one mixing proportion.") } missing_id <- setdiff(1:nmix, dpar_id(names(theta_pred))) str_add(out$model_def) <- glue( " vector[N{p}] theta{missing_id}{p} = rep_vector(0, N{p});\n", " real log_sum_exp_theta;\n" ) sum_exp_theta <- glue("exp(theta{1:nmix}{p}[n])", collapse = " + ") str_add(out$model_comp_mix) <- glue( " for (n in 1:N{p}) {{\n", " // scale theta to become a probability vector\n", " log_sum_exp_theta = log({sum_exp_theta});\n" ) str_add(out$model_comp_mix) <- cglue( " theta{1:nmix}{p}[n] = theta{1:nmix}{p}[n] - log_sum_exp_theta;\n" ) str_add(out$model_comp_mix) <- " }\n" } else if (length(theta_fix)) { # fix mixture proportions if (length(theta_fix) != nmix) { stop2("Can only fix no or all mixing proportions.") } str_add(out$data) <- " // mixing proportions\n" str_add(out$data) <- cglue( " real theta{1:nmix}{p};\n" ) } else { # estimate mixture proportions str_add(out$data) <- glue( " vector[{nmix}] con_theta{p}; // prior concentration\n" ) str_add(out$par) <- glue( " simplex[{nmix}] theta{p}; // mixing proportions\n" ) str_add(out$prior) <- glue( " target += dirichlet_lpdf(theta{p} | con_theta{p});\n" ) # separate definition from computation to support fixed parameters str_add(out$tpar_def) <- " // mixing proportions\n" str_add(out$tpar_def) <- cglue( " real theta{1:nmix}{p};\n" ) str_add(out$tpar_comp) <- cglue( " theta{1:nmix}{p} = theta{p}[{1:nmix}];\n" ) } if (order_intercepts(bterms)) { # identify mixtures by ordering the intercepts of their components str_add(out$par) <- glue( " ordered[{nmix}] ordered_Intercept{p}; // to identify mixtures\n" ) } if (fix_intercepts(bterms)) { # identify ordinal mixtures by fixing their thresholds to the same values stopifnot(is_ordinal(bterms)) gr <- grb <- "" groups <- get_thres_groups(bterms) if (has_thres_groups(bterms)) { # include one threshold vector per group gr <- usc(seq_along(groups)) grb <- paste0("[", seq_along(groups), "]") } type <- str_if(has_ordered_thres(bterms), "ordered", "vector") coef_type <- str_if(has_ordered_thres(bterms), "", "real") for (i in seq_along(groups)) { str_add_list(out) <- stan_prior( prior, class = "Intercept", coef = get_thres(bterms, group = groups[i]), type = glue("{type}[nthres{p}{grb[i]}]"), coef_type = coef_type, px = px, prefix = "fixed_", suffix = glue("{p}{gr[i]}"), comment = "thresholds fixed over mixture components" ) } } out } # ordinal log-probability densitiy functions in Stan language # @return a character string stan_ordinal_lpmf <- function(family, link) { stopifnot(is.character(family), is.character(link)) ilink <- stan_ilink(link) th <- function(k) { # helper function generating stan code inside ilink(.) if (family %in% c("cumulative", "sratio")) { out <- glue("thres[{k}] - mu") } else if (family %in% c("cratio", "acat")) { out <- glue("mu - thres[{k}]") } glue("disc * ({out})") } out <- glue( " /* {family}-{link} log-PDF for a single response\n", " * Args:\n", " * y: response category\n", " * mu: latent mean parameter\n", " * disc: discrimination parameter\n", " * thres: ordinal thresholds\n", " * Returns:\n", " * a scalar to be added to the log posterior\n", " */\n", " real {family}_{link}_lpmf(int y, real mu, real disc, vector thres) {{\n" ) # define the function body if (family == "cumulative") { str_add(out) <- glue( " int nthres = num_elements(thres);\n", " real p;\n", " if (y == 1) {{\n", " p = {ilink}({th(1)});\n", " }} else if (y == nthres + 1) {{\n", " p = 1 - {ilink}({th('nthres')});\n", " }} else {{\n", " p = {ilink}({th('y')}) -\n", " {ilink}({th('y - 1')});\n", " }}\n", " return log(p);\n", " }}\n" ) } else if (family %in% c("sratio", "cratio")) { sc <- str_if(family == "sratio", "1 - ") str_add(out) <- glue( " int nthres = num_elements(thres);\n", " vector[nthres + 1] p;\n", " vector[nthres] q;\n", " int k = 1;\n", " while (k <= min(y, nthres)) {{\n", " q[k] = {sc}{ilink}({th('k')});\n", " p[k] = 1 - q[k];\n", " for (kk in 1:(k - 1)) p[k] = p[k] * q[kk];\n", " k += 1;\n", " }}\n", " if (y == nthres + 1) {{\n", " p[nthres + 1] = prod(q);\n", " }}\n", " return log(p[y]);\n", " }}\n" ) } else if (family == "acat") { if (ilink == "inv_logit") { str_add(out) <- glue( " int nthres = num_elements(thres);\n", " vector[nthres + 1] p;\n", " p[1] = 0.0;\n", " for (k in 1:(nthres)) {{\n", " p[k + 1] = p[k] + {th('k')};\n", " }}\n", " p = exp(p);\n", " return log(p[y] / sum(p));\n", " }}\n" ) } else { str_add(out) <- glue( " int nthres = num_elements(thres);\n", " vector[nthres + 1] p;\n", " vector[nthres] q;\n", " for (k in 1:(nthres))\n", " q[k] = {ilink}({th('k')});\n", " for (k in 1:(nthres + 1)) {{\n", " p[k] = 1.0;\n", " for (kk in 1:(k - 1)) p[k] = p[k] * q[kk];\n", " for (kk in k:(nthres)) p[k] = p[k] * (1 - q[kk]);\n", " }}\n", " return log(p[y] / sum(p));\n", " }}\n" ) } } # lpdf function for multiple merged thresholds str_add(out) <- glue( # TODO: include order_logistic_merged_lpdf " /* {family}-{link} log-PDF for a single response and merged thresholds\n", " * Args:\n", " * y: response category\n", " * mu: latent mean parameter\n", " * disc: discrimination parameter\n", " * thres: vector of merged ordinal thresholds\n", " * j: start and end index for the applid threshold within 'thres'\n", " * Returns:\n", " * a scalar to be added to the log posterior\n", " */\n", " real {family}_{link}_merged_lpmf(", "int y, real mu, real disc, vector thres, int[] j) {{\n", " return {family}_{link}_lpmf(y | mu, disc, thres[j[1]:j[2]]);\n", " }}\n" ) out } brms/R/brmsformula.R0000644000176200001440000020347313613527063014111 0ustar liggesusers#' Set up a model formula for use in \pkg{brms} #' #' Set up a model formula for use in the \pkg{brms} package #' allowing to define (potentially non-linear) additive multilevel #' models for all parameters of the assumed response distribution. #' #' @aliases bf #' #' @param formula An object of class \code{formula} #' (or one that can be coerced to that class): #' a symbolic description of the model to be fitted. #' The details of model specification are given in 'Details'. #' @param ... Additional \code{formula} objects to specify predictors of #' non-linear and distributional parameters. Formulas can either be named #' directly or contain names on their left-hand side. Alternatively, #' it is possible to fix parameters to certain values by passing #' numbers or character strings in which case arguments have to be named #' to provide the parameter names. See 'Details' for more information. #' @param flist Optional list of formulas, which are treated in the #' same way as formulas passed via the \code{...} argument. #' @param nl Logical; Indicates whether \code{formula} should be #' treated as specifying a non-linear model. By default, \code{formula} #' is treated as an ordinary linear model formula. #' @param loop Logical; Only used in non-linear models. #' Indicates if the computation of the non-linear formula should be #' done inside (\code{TRUE}) or outside (\code{FALSE}) a loop #' over observations. Defaults to \code{TRUE}. #' @param center Logical; Indicates if the population-level design #' matrix should be centered, which usually increases sampling efficiency. #' See the 'Details' section for more information. #' Defaults to \code{TRUE} for distributional parameters #' and to \code{FALSE} for non-linear parameters. #' @param cmc Logical; Indicates whether automatic cell-mean coding #' should be enabled when removing the intercept by adding \code{0} #' to the right-hand of model formulas. Defaults to \code{TRUE} to #' mirror the behavior of standard \R formula parsing. #' @param sparse Logical; indicates whether the population-level design matrices #' should be treated as sparse (defaults to \code{FALSE}). For design matrices #' with many zeros, this can considerably reduce required memory. Sampling #' speed is currently not improved or even slightly decreased. #' @param decomp Optional name of the decomposition used for the #' population-level design matrix. Defaults to \code{NULL} that is #' no decomposition. Other options currently available are #' \code{"QR"} for the QR decomposition that helps in fitting models #' with highly correlated predictors. #' @param family Same argument as in \code{\link{brm}}. #' If \code{family} is specified in \code{brmsformula}, it will #' overwrite the value specified in other functions. #' @param autocor An optional \code{formula} which contains #' autocorrelation terms as described in \code{\link{autocor-terms}} #' or alternatively a \code{\link{cor_brms}} object (deprecated). #' If \code{autocor} is specified in \code{brmsformula}, it will #' overwrite the value specified in other functions. #' #' @return An object of class \code{brmsformula}, which #' is essentially a \code{list} containing all model #' formulas as well as some additional information. #' #' @seealso \code{\link{mvbrmsformula}}, \code{\link{brmsformula-helpers}} #' #' @details #' #' \bold{General formula structure} #' #' The \code{formula} argument accepts formulas of the following syntax: #' #' \code{response | aterms ~ pterms + (gterms | group)} #' #' The \code{pterms} part contains effects that are assumed to be the #' same across observations. We call them 'population-level' effects #' or (adopting frequentist vocabulary) 'fixed' effects. The optional #' \code{gterms} part may contain effects that are assumed to vary #' across grouping variables specified in \code{group}. We #' call them 'group-level' effects or (adopting frequentist #' vocabulary) 'random' effects, although the latter name is misleading #' in a Bayesian context. For more details type #' \code{vignette("brms_overview")} and \code{vignette("brms_multilevel")}. #' #' \bold{Group-level terms} #' #' Multiple grouping factors each with multiple group-level effects #' are possible. (Of course we can also run models without any #' group-level effects.) #' Instead of \code{|} you may use \code{||} in grouping terms #' to prevent correlations from being modeled. #' Alternatively, it is possible to model different group-level terms of #' the same grouping factor as correlated (even across different formulas, #' e.g., in non-linear models) by using \code{||} instead of \code{|}. #' All group-level terms sharing the same ID will be modeled as correlated. #' If, for instance, one specifies the terms \code{(1+x|2|g)} and #' \code{(1+z|2|g)} somewhere in the formulas passed to \code{brmsformula}, #' correlations between the corresponding group-level effects #' will be estimated. #' #' If levels of the grouping factor belong to different sub-populations, #' it may be reasonable to assume a different covariance matrix for each #' of the sub-populations. For instance, the variation within the #' treatment group and within the control group in a randomized control #' trial might differ. Suppose that \code{y} is the outcome, and #' \code{x} is the factor indicating the treatment and control group. #' Then, we could estimate different hyper-parameters of the varying #' effects (in this case a varying intercept) for treatment and control #' group via \code{y ~ x + (1 | gr(subject, by = x))}. #' #' You can specify multi-membership terms using the \code{\link{mm}} #' function. For instance, a multi-membership term with two members #' could be \code{(1 | mm(g1, g2))}, where \code{g1} and \code{g2} #' specify the first and second member, respectively. Moreover, #' if a covariate \code{x} varies across the levels of the grouping-factors #' \code{g1} and \code{g2}, we can save the respective covariate values #' in the variables \code{x1} and \code{x2} and then model the varying #' effect as \code{(1 + mmc(x1, x2) | mm(g1, g2))}. #' #' \bold{Special predictor terms} #' #' Smoothing terms can modeled using the \code{\link{s}} #' and \code{\link{t2}} functions in the \code{pterms} part #' of the model formula. This allows to fit generalized additive mixed #' models (GAMMs) with \pkg{brms}. The implementation is similar to that #' used in the \pkg{gamm4} package. For more details on this model class #' see \code{\link[mgcv:gam]{gam}} and \code{\link[mgcv:gamm]{gamm}}. #' #' Gaussian process terms can be fitted using the \code{\link{gp}} #' function in the \code{pterms} part of the model formula. Similar to #' smooth terms, Gaussian processes can be used to model complex non-linear #' relationships, for instance temporal or spatial autocorrelation. #' However, they are computationally demanding and are thus not recommended #' for very large datasets. #' #' The \code{pterms} and \code{gterms} parts may contain four non-standard #' effect types namely monotonic, measurement error, missing value, and #' category specific effects, which can be specified using terms of the #' form \code{mo(predictor)}, \code{me(predictor, sd_predictor)}, #' \code{mi(predictor)}, and \code{cs()}, respectively. #' Category specific effects can only be estimated in #' ordinal models and are explained in more detail in the package's #' main vignette (type \code{vignette("brms_overview")}). #' The other three effect types are explained in the following. #' #' A monotonic predictor must either be integer valued or an ordered factor, #' which is the first difference to an ordinary continuous predictor. #' More importantly, predictor categories (or integers) are not assumed to be #' equidistant with respect to their effect on the response variable. #' Instead, the distance between adjacent predictor categories (or integers) #' is estimated from the data and may vary across categories. #' This is realized by parameterizing as follows: #' One parameter takes care of the direction and size of the effect similar #' to an ordinary regression parameter, while an additional parameter vector #' estimates the normalized distances between consecutive predictor categories. #' A main application of monotonic effects are ordinal predictors that #' can this way be modeled without (falsely) treating them as continuous #' or as unordered categorical predictors. For more details and examples #' see \code{vignette("brms_monotonic")}. #' #' Quite often, predictors are measured and as such naturally contain #' measurement error. Although most researchers are well aware of this problem, #' measurement error in predictors is ignored in most #' regression analyses, possibly because only few packages allow #' for modeling it. Notably, measurement error can be handled in #' structural equation models, but many more general regression models #' (such as those featured by \pkg{brms}) cannot be transferred #' to the SEM framework. In \pkg{brms}, effects of noise-free predictors #' can be modeled using the \code{me} (for 'measurement error') function. #' If, say, \code{y} is the response variable and #' \code{x} is a measured predictor with known measurement error #' \code{sdx}, we can simply include it on the right-hand side of the #' model formula via \code{y ~ me(x, sdx)}. #' This can easily be extended to more general formulas. #' If \code{x2} is another measured predictor with corresponding error #' \code{sdx2} and \code{z} is a predictor without error #' (e.g., an experimental setting), we can model all main effects #' and interactions of the three predictors in the well known manner: #' \code{y ~ me(x, sdx) * me(x2, sdx2) * z}. In future version of \pkg{brms}, #' a vignette will be added to explain more details about these #' so called 'error-in-variables' models and provide real world examples. #' #' When a variable contains missing values, the corresponding rows will #' be excluded from the data by default (row-wise exclusion). However, #' quite often we want to keep these rows and instead estimate the missing values. #' There are two approaches for this: (a) Impute missing values before #' the model fitting for instance via multiple imputation (see #' \code{\link{brm_multiple}} for a way to handle multiple imputed datasets). #' (b) Impute missing values on the fly during model fitting. The latter #' approach is explained in the following. Using a variable with missing #' values as predictors requires two things, First, we need to specify that #' the predictor contains missings that should to be imputed. #' If, say, \code{y} is the primary response, \code{x} is a #' predictor with missings and \code{z} is a predictor without missings, #' we go for \code{y ~ mi(x) + z}. Second, we need to model \code{x} #' as an additional response with corresponding predictors and the #' addition term \code{mi()}. In our example, we could write #' \code{x | mi() ~ z}. See \code{\link{mi}} for examples with real data. #' #' \bold{Autocorrelation terms} #' #' Autocorrelation terms can be directly specified inside the formula #' as well. Details can be found in \code{\link{autocor-terms}}. #' #' \bold{Additional response information} #' #' Another special of the \pkg{brms} formula syntax is the optional #' \code{aterms} part, which may contain multiple terms of the form #' \code{fun()} separated by \code{+} each providing special #' information on the response variable. \code{fun} can be replaced with #' either \code{se}, \code{weights}, \code{subset}, \code{cens}, \code{trunc}, #' \code{trials}, \code{cat}, \code{dec}, \code{rate}, \code{vreal}, or #' \code{vint}. Their meanings are explained below. #' (see also \code{\link{addition-terms}}). #' #' For families \code{gaussian}, \code{student} and \code{skew_normal}, it is #' possible to specify standard errors of the observations, thus allowing #' to perform meta-analysis. Suppose that the variable \code{yi} contains #' the effect sizes from the studies and \code{sei} the corresponding #' standard errors. Then, fixed and random effects meta-analyses can #' be conducted using the formulas \code{yi | se(sei) ~ 1} and #' \code{yi | se(sei) ~ 1 + (1|study)}, respectively, where #' \code{study} is a variable uniquely identifying every study. #' If desired, meta-regression can be performed via #' \code{yi | se(sei) ~ 1 + mod1 + mod2 + (1|study)} #' or \cr \code{yi | se(sei) ~ 1 + mod1 + mod2 + (1 + mod1 + mod2|study)}, #' where \code{mod1} and \code{mod2} represent moderator variables. #' By default, the standard errors replace the parameter \code{sigma}. #' To model \code{sigma} in addition to the known standard errors, #' set argument \code{sigma} in function \code{se} to \code{TRUE}, #' for instance, \code{yi | se(sei, sigma = TRUE) ~ 1}. #' #' For all families, weighted regression may be performed using #' \code{weights} in the \code{aterms} part. Internally, this is #' implemented by multiplying the log-posterior values of each #' observation by their corresponding weights. #' Suppose that variable \code{wei} contains the weights #' and that \code{yi} is the response variable. #' Then, formula \code{yi | weights(wei) ~ predictors} #' implements a weighted regression. #' #' For multivariate models, \code{subset} may be used in the \code{aterms} #' part, to use different subsets of the data in different univariate #' models. For instance, if \code{sub} is a logical variable and #' \code{y} is the response of one of the univariate models, we may #' write \code{y | subset(sub) ~ predictors} so that \code{y} is #' predicted only for those observations for which \code{sub} evaluates #' to \code{TRUE}. #' #' For log-linear models such as poisson models, \code{rate} may be used #' in the \code{aterms} part to specify the denomintor of a response that #' is expressed as a rate. The numerator is given by the actual response #' variable and has a distribution according to the family as usual. Using #' \code{rate(denom)} is equivalent to adding \code{offset(log(denom))} to #' the linear predictor of the main parameter but the former is arguably #' more convenient and explicit. #' #' With the exception of categorical, ordinal, and mixture families, #' left, right, and interval censoring can be modeled through #' \code{y | cens(censored) ~ predictors}. The censoring variable #' (named \code{censored} in this example) should contain the values #' \code{'left'}, \code{'none'}, \code{'right'}, and \code{'interval'} #' (or equivalently \code{-1}, \code{0}, \code{1}, and \code{2}) to indicate that #' the corresponding observation is left censored, not censored, right censored, #' or interval censored. For interval censored data, a second variable #' (let's call it \code{y2}) has to be passed to \code{cens}. In this case, #' the formula has the structure \code{y | cens(censored, y2) ~ predictors}. #' While the lower bounds are given in \code{y}, the upper bounds are given #' in \code{y2} for interval censored data. Intervals are assumed to be open #' on the left and closed on the right: \code{(y, y2]}. #' #' With the exception of categorical, ordinal, and mixture families, #' the response distribution can be truncated using the \code{trunc} #' function in the addition part. If the response variable is truncated #' between, say, 0 and 100, we can specify this via #' \code{yi | trunc(lb = 0, ub = 100) ~ predictors}. #' Instead of numbers, variables in the data set can also be passed allowing #' for varying truncation points across observations. Defining only one of #' the two arguments in \code{trunc} leads to one-sided truncation. #' #' For all continuous families, missing values in the responses can be imputed #' within Stan by using the addition term \code{mi}. This is mostly #' useful in combination with \code{mi} predictor terms as explained #' above under 'Special predictor terms'. #' #' For families \code{binomial} and \code{zero_inflated_binomial}, #' addition should contain a variable indicating the number of trials #' underlying each observation. In \code{lme4} syntax, we may write for instance #' \code{cbind(success, n - success)}, which is equivalent #' to \code{success | trials(n)} in \pkg{brms} syntax. If the number of trials #' is constant across all observations, say \code{10}, #' we may also write \code{success | trials(10)}. #' \bold{Please note that the \code{cbind()} syntax will not work #' in \pkg{brms} in the expected way because this syntax is reserved #' for other purposes.} #' #' For all ordinal families, \code{aterms} may contain a term #' \code{thres(number)} to specify the number thresholds (e.g, #' \code{thres(6)}), which should be equal to the total number of response #' categories - 1. If not given, the number of thresholds is calculated from #' the data. If different threshold vectors should be used for different #' subsets of the data, the \code{gr} argument can be used to provide the #' grouping variable (e.g, \code{thres(6, gr = item)}, if \code{item} is the #' grouping variable). In this case, the number of thresholds can also be a #' variable in the data with different values per group. #' #' A deprecated quasi alias of \code{thres()} is \code{cat()} with which the #' total number of response categories (i.e., number of thresholds + 1) can be #' specified. #' #' In Wiener diffusion models (family \code{wiener}) the addition term #' \code{dec} is mandatory to specify the (vector of) binary decisions #' corresponding to the reaction times. Non-zero values will be treated #' as a response on the upper boundary of the diffusion process and zeros #' will be treated as a response on the lower boundary. Alternatively, #' the variable passed to \code{dec} might also be a character vector #' consisting of \code{'lower'} and \code{'upper'}. #' #' For custom families, it is possible to pass an abitrary number of real and #' integer vectors via the addition terms \code{vreal} and \code{vint}, #' respectively. An example is provided in #' \code{vignette('brms_customfamilies')}. #' #' Multiple addition terms may be specified at the same time using the #' \code{+} operator. For example, the formula #' \code{formula = yi | se(sei) + cens(censored) ~ 1} implies a censored #' meta-analytic model. #' #' The addition argument \code{disp} (short for dispersion) #' has been removed in version 2.0. You may instead use the #' distributional regression approach by specifying #' \code{sigma ~ 1 + offset(log(xdisp))} or #' \code{shape ~ 1 + offset(log(xdisp))}, where \code{xdisp} is #' the variable being previously passed to \code{disp}. #' #' \bold{Parameterization of the population-level intercept} #' #' By default, the population-level intercept (if incorporated) is estimated #' separately and not as part of population-level parameter vector \code{b} As #' a result, priors on the intercept also have to be specified separately. #' Furthermore, to increase sampling efficiency, the population-level design #' matrix \code{X} is centered around its column means \code{X_means} if the #' intercept is incorporated. This leads to a temporary bias in the intercept #' equal to \code{}, where \code{<,>} is the scalar product. The #' bias is corrected after fitting the model, but be aware that you are #' effectively defining a prior on the intercept of the centered design matrix #' not on the real intercept. You can turn off this special handling of the #' intercept by setting argument \code{center} to \code{FALSE}. For more #' details on setting priors on population-level intercepts, see #' \code{\link{set_prior}}. #' #' This behavior can be avoided by using the reserved #' (and internally generated) variable \code{Intercept}. #' Instead of \code{y ~ x}, you may write #' \code{y ~ 0 + Intercept + x}. This way, priors can be #' defined on the real intercept, directly. In addition, #' the intercept is just treated as an ordinary population-level effect #' and thus priors defined on \code{b} will also apply to it. #' Note that this parameterization may be less efficient #' than the default parameterization discussed above. #' #' \bold{Formula syntax for non-linear models} #' #' In \pkg{brms}, it is possible to specify non-linear models #' of arbitrary complexity. #' The non-linear model can just be specified within the \code{formula} #' argument. Suppose, that we want to predict the response \code{y} #' through the predictor \code{x}, where \code{x} is linked to \code{y} #' through \code{y = alpha - beta * lambda^x}, with parameters #' \code{alpha}, \code{beta}, and \code{lambda}. This is certainly a #' non-linear model being defined via #' \code{formula = y ~ alpha - beta * lambda^x} (addition arguments #' can be added in the same way as for ordinary formulas). #' To tell \pkg{brms} that this is a non-linear model, #' we set argument \code{nl} to \code{TRUE}. #' Now we have to specify a model for each of the non-linear parameters. #' Let's say we just want to estimate those three parameters #' with no further covariates or random effects. Then we can pass #' \code{alpha + beta + lambda ~ 1} or equivalently #' (and more flexible) \code{alpha ~ 1, beta ~ 1, lambda ~ 1} #' to the \code{...} argument. #' This can, of course, be extended. If we have another predictor \code{z} and #' observations nested within the grouping factor \code{g}, we may write for #' instance \code{alpha ~ 1, beta ~ 1 + z + (1|g), lambda ~ 1}. #' The formula syntax described above applies here as well. #' In this example, we are using \code{z} and \code{g} only for the #' prediction of \code{beta}, but we might also use them for the other #' non-linear parameters (provided that the resulting model is still #' scientifically reasonable). #' #' By default, non-linear covariates are treated as real vectors in Stan. #' However, if the data of the covariates is of type `integer` in \R (which #' can be enforced by the `as.integer` function), the Stan type will be #' changed to an integer array. That way, covariates can also be used #' for indexing purposes in Stan. #' #' Non-linear models may not be uniquely identified and / or show bad convergence. #' For this reason it is mandatory to specify priors on the non-linear parameters. #' For instructions on how to do that, see \code{\link{set_prior}}. #' For some examples of non-linear models, see \code{vignette("brms_nonlinear")}. #' #' \bold{Formula syntax for predicting distributional parameters} #' #' It is also possible to predict parameters of the response distribution such #' as the residual standard deviation \code{sigma} in gaussian models or the #' hurdle probability \code{hu} in hurdle models. The syntax closely resembles #' that of a non-linear parameter, for instance \code{sigma ~ x + s(z) + #' (1+x|g)}. For some examples of distributional models, see #' \code{vignette("brms_distreg")}. #' #' Parameter \code{mu} exists for every family and can be used as an #' alternative to specifying terms in \code{formula}. If both \code{mu} and #' \code{formula} are given, the right-hand side of \code{formula} is ignored. #' Accordingly, specifying terms on the right-hand side of both \code{formula} #' and \code{mu} at the same time is deprecated. In future versions, #' \code{formula} might be updated by \code{mu}. #' #' The following are #' distributional parameters of specific families (all other parameters are #' treated as non-linear parameters): \code{sigma} (residual standard #' deviation or scale of the \code{gaussian}, \code{student}, #' \code{skew_normal}, \code{lognormal} \code{exgaussian}, and #' \code{asym_laplace} families); \code{shape} (shape parameter of the #' \code{Gamma}, \code{weibull}, \code{negbinomial}, and related zero-inflated #' / hurdle families); \code{nu} (degrees of freedom parameter of the #' \code{student} and \code{frechet} families); \code{phi} (precision #' parameter of the \code{beta} and \code{zero_inflated_beta} families); #' \code{kappa} (precision parameter of the \code{von_mises} family); #' \code{beta} (mean parameter of the exponential component of the #' \code{exgaussian} family); \code{quantile} (quantile parameter of the #' \code{asym_laplace} family); \code{zi} (zero-inflation probability); #' \code{hu} (hurdle probability); \code{zoi} (zero-one-inflation #' probability); \code{coi} (conditional one-inflation probability); #' \code{disc} (discrimination) for ordinal models; \code{bs}, \code{ndt}, and #' \code{bias} (boundary separation, non-decision time, and initial bias of #' the \code{wiener} diffusion model). By default, distributional parameters #' are modeled on the log scale if they can be positive only or on the logit #' scale if the can only be within the unit interval. #' #' Alternatively, one may fix distributional parameters to certain values. #' However, this is mainly useful when models become too #' complicated and otherwise have convergence issues. #' We thus suggest to be generally careful when making use of this option. #' The \code{quantile} parameter of the \code{asym_laplace} distribution #' is a good example where it is useful. By fixing \code{quantile}, #' one can perform quantile regression for the specified quantile. #' For instance, \code{quantile = 0.25} allows predicting the 25\%-quantile. #' Furthermore, the \code{bias} parameter in drift-diffusion models, #' is assumed to be \code{0.5} (i.e. no bias) in many applications. #' To achieve this, simply write \code{bias = 0.5}. #' Other possible applications are the Cauchy distribution as a #' special case of the Student-t distribution with #' \code{nu = 1}, or the geometric distribution as a special case of #' the negative binomial distribution with \code{shape = 1}. #' Furthermore, the parameter \code{disc} ('discrimination') in ordinal #' models is fixed to \code{1} by default and not estimated, #' but may be modeled as any other distributional parameter if desired #' (see examples). For reasons of identification, \code{'disc'} #' can only be positive, which is achieved by applying the log-link. #' #' In categorical models, distributional parameters do not have #' fixed names. Instead, they are named after the response categories #' (excluding the first one, which serves as the reference category), #' with the prefix \code{'mu'}. If, for instance, categories are named #' \code{cat1}, \code{cat2}, and \code{cat3}, the distributional parameters #' will be named \code{mucat2} and \code{mucat3}. #' #' Some distributional parameters currently supported by \code{brmsformula} #' have to be positive (a negative standard deviation or precision parameter #' does not make any sense) or are bounded between 0 and 1 (for zero-inflated / #' hurdle probabilities, quantiles, or the initial bias parameter of #' drift-diffusion models). #' However, linear predictors can be positive or negative, and thus the log link #' (for positive parameters) or logit link (for probability parameters) are used #' by default to ensure that distributional parameters are within their valid intervals. #' This implies that, by default, effects for such distributional parameters are #' estimated on the log / logit scale and one has to apply the inverse link #' function to get to the effects on the original scale. #' Alternatively, it is possible to use the identity link to predict parameters #' on their original scale, directly. However, this is much more likely to lead #' to problems in the model fitting, if the parameter actually has a restricted range. #' #' See also \code{\link{brmsfamily}} for an overview of valid link functions. #' #' \bold{Formula syntax for mixture models} #' #' The specification of mixture models closely resembles that #' of non-mixture models. If not specified otherwise (see below), #' all mean parameters of the mixture components are predicted #' using the right-hand side of \code{formula}. All types of predictor #' terms allowed in non-mixture models are allowed in mixture models #' as well. #' #' Distributional parameters of mixture distributions have the same #' name as those of the corresponding ordinary distributions, but with #' a number at the end to indicate the mixture component. For instance, if #' you use family \code{mixture(gaussian, gaussian)}, the distributional #' parameters are \code{sigma1} and \code{sigma2}. #' Distributional parameters of the same class can be fixed to the same value. #' For the above example, we could write \code{sigma2 = "sigma1"} to make #' sure that both components have the same residual standard deviation, #' which is in turn estimated from the data. #' #' In addition, there are two types of special distributional parameters. #' The first are named \code{mu}, that allow for modeling different #' predictors for the mean parameters of different mixture components. #' For instance, if you want to predict the mean of the first component #' using predictor \code{x} and the mean of the second component using #' predictor \code{z}, you can write \code{mu1 ~ x} as well as \code{mu2 ~ z}. #' The second are named \code{theta}, which constitute the mixing #' proportions. If the mixing proportions are fixed to certain values, #' they are internally normalized to form a probability vector. #' If one seeks to predict the mixing proportions, all but #' one of the them has to be predicted, while the remaining one is used #' as the reference category to identify the model. The \code{softmax} #' function is applied on the linear predictor terms to form a #' probability vector. #' #' For more information on mixture models, see #' the documentation of \code{\link{mixture}}. #' #' \bold{Formula syntax for multivariate models} #' #' Multivariate models may be specified using \code{mvbind} notation #' or with help of the \code{\link{mvbf}} function. #' Suppose that \code{y1} and \code{y2} are response variables #' and \code{x} is a predictor. Then \code{mvbind(y1, y2) ~ x} #' specifies a multivariate model. #' The effects of all terms specified at the RHS of the formula #' are assumed to vary across response variables. #' For instance, two parameters will be estimated for \code{x}, #' one for the effect on \code{y1} and another for the effect on \code{y2}. #' This is also true for group-level effects. When writing, for instance, #' \code{mvbind(y1, y2) ~ x + (1+x|g)}, group-level effects will be #' estimated separately for each response. To model these effects #' as correlated across responses, use the ID syntax (see above). #' For the present example, this would look as follows: #' \code{mvbind(y1, y2) ~ x + (1+x|2|g)}. Of course, you could also use #' any value other than \code{2} as ID. #' #' It is also possible to specify different formulas for different responses. #' If, for instance, \code{y1} should be predicted by \code{x} and \code{y2} #' should be predicted by \code{z}, we could write \code{mvbf(y1 ~ x, y2 ~ z)}. #' Alternatively, multiple \code{brmsformula} objects can be added to #' specify a joint multivariate model (see 'Examples'). #' #' @examples #' # multilevel model with smoothing terms #' brmsformula(y ~ x1*x2 + s(z) + (1+x1|1) + (1|g2)) #' #' # additionally predict 'sigma' #' brmsformula(y ~ x1*x2 + s(z) + (1+x1|1) + (1|g2), #' sigma ~ x1 + (1|g2)) #' #' # use the shorter alias 'bf' #' (formula1 <- brmsformula(y ~ x + (x|g))) #' (formula2 <- bf(y ~ x + (x|g))) #' # will be TRUE #' identical(formula1, formula2) #' #' # incorporate censoring #' bf(y | cens(censor_variable) ~ predictors) #' #' # define a simple non-linear model #' bf(y ~ a1 - a2^x, a1 + a2 ~ 1, nl = TRUE) #' #' # predict a1 and a2 differently #' bf(y ~ a1 - a2^x, a1 ~ 1, a2 ~ x + (x|g), nl = TRUE) #' #' # correlated group-level effects across parameters #' bf(y ~ a1 - a2^x, a1 ~ 1 + (1|2|g), a2 ~ x + (x|2|g), nl = TRUE) #' #' # define a multivariate model #' bf(mvbind(y1, y2) ~ x * z + (1|g)) #' #' # define a zero-inflated model #' # also predicting the zero-inflation part #' bf(y ~ x * z + (1+x|ID1|g), zi ~ x + (1|ID1|g)) #' #' # specify a predictor as monotonic #' bf(y ~ mo(x) + more_predictors) #' #' # for ordinal models only #' # specify a predictor as category specific #' bf(y ~ cs(x) + more_predictors) #' # add a category specific group-level intercept #' bf(y ~ cs(x) + (cs(1)|g)) #' # specify parameter 'disc' #' bf(y ~ person + item, disc ~ item) #' #' # specify variables containing measurement error #' bf(y ~ me(x, sdx)) #' #' # specify predictors on all parameters of the wiener diffusion model #' # the main formula models the drift rate 'delta' #' bf(rt | dec(decision) ~ x, bs ~ x, ndt ~ x, bias ~ x) #' #' # fix the bias parameter to 0.5 #' bf(rt | dec(decision) ~ x, bias = 0.5) #' #' # specify different predictors for different mixture components #' mix <- mixture(gaussian, gaussian) #' bf(y ~ 1, mu1 ~ x, mu2 ~ z, family = mix) #' #' # fix both residual standard deviations to the same value #' bf(y ~ x, sigma2 = "sigma1", family = mix) #' #' # use the '+' operator to specify models #' bf(y ~ 1) + #' nlf(sigma ~ a * exp(b * x), a ~ x) + #' lf(b ~ z + (1|g), dpar = "sigma") + #' gaussian() #' #' # specify a multivariate model using the '+' operator #' bf(y1 ~ x + (1|g)) + #' gaussian() + cor_ar(~1|g) + #' bf(y2 ~ z) + poisson() #' #' # model missing values in predictors #' bf(bmi ~ age * mi(chl)) + #' bf(chl | mi() ~ age) + #' set_rescor(FALSE) #' #' # model sigma as a function of the mean #' bf(y ~ eta, nl = TRUE) + #' lf(eta ~ 1 + x) + #' nlf(sigma ~ tau * sqrt(eta)) + #' lf(tau ~ 1) #' #' @export brmsformula <- function(formula, ..., flist = NULL, family = NULL, autocor = NULL, nl = NULL, loop = NULL, center = NULL, cmc = NULL, sparse = NULL, decomp = NULL) { if (is.brmsformula(formula)) { out <- formula } else { out <- list(formula = as_formula(formula)) class(out) <- "brmsformula" } # parse and validate dots arguments dots <- c(out$pforms, out$pfix, list(...), flist) dots <- lapply(dots, function(x) if (is.list(x)) x else list(x)) dots <- unlist(dots, recursive = FALSE) forms <- list() for (i in seq_along(dots)) { c(forms) <- validate_par_formula(dots[[i]], par = names(dots)[i]) } is_dupl_pars <- duplicated(names(forms), fromLast = TRUE) if (any(is_dupl_pars)) { dupl_pars <- collapse_comma(names(forms)[is_dupl_pars]) message("Replacing initial definitions of parameters ", dupl_pars) forms[is_dupl_pars] <- NULL } not_form <- ulapply(forms, function(x) !is.formula(x)) fix <- forms[not_form] forms[names(fix)] <- NULL out$pforms <- forms # validate fixed distributional parameters fix_theta <- fix[dpar_class(names(fix)) %in% "theta"] if (length(fix_theta)) { # normalize mixing proportions sum_theta <- sum(unlist(fix_theta)) fix_theta <- lapply(fix_theta, "/", sum_theta) fix[names(fix_theta)] <- fix_theta } out$pfix <- fix for (dp in names(out$pfix)) { if (is.character(out$pfix[[dp]])) { if (identical(dp, out$pfix[[dp]])) { stop2("Equating '", dp, "' with itself is not meaningful.") } ap_class <- dpar_class(dp) if (ap_class == "mu") { stop2("Equating parameters of class 'mu' is not allowed.") } if (!identical(ap_class, dpar_class(out$pfix[[dp]]))) { stop2("Can only equate parameters of the same class.") } if (out$pfix[[dp]] %in% names(out$pfix)) { stop2("Cannot use fixed parameters on ", "the right-hand side of an equation.") } if (out$pfix[[dp]] %in% names(out$pforms)) { stop2("Cannot use predicted parameters on ", "the right-hand side of an equation.") } } } if (!is.null(nl)) { attr(out$formula, "nl") <- as_one_logical(nl) } else if (!is.null(out[["nl"]])) { # for backwards compatibility with brms <= 1.8.0 attr(out$formula, "nl") <- out[["nl"]] out[["nl"]] <- NULL } if (is.null(attr(out$formula, "nl"))) { attr(out$formula, "nl") <- FALSE } if (!is.null(loop)) { attr(out$formula, "loop") <- as_one_logical(loop) } if (is.null(attr(out$formula, "loop"))) { attr(out$formula, "loop") <- TRUE } if (!is.null(center)) { attr(out$formula, "center") <- as_one_logical(center) } if (!is.null(cmc)) { attr(out$formula, "cmc") <- as_one_logical(cmc) } if (!is.null(sparse)) { attr(out$formula, "sparse") <- as_one_logical(sparse) } if (!is.null(decomp)) { attr(out$formula, "decomp") <- match.arg(decomp, decomp_opts()) } if (!is.null(autocor)) { attr(out$formula, "autocor") <- validate_autocor(autocor) } else if (!is.null(out$autocor)) { # for backwards compatibility with brms <= 2.11.0 attr(out$formula, "autocor") <- validate_autocor(out$autocor) out$autocor <- NULL } if (!is.null(family)) { out$family <- check_family(family) } if (!is.null(lhs(formula))) { out$resp <- parse_resp(formula) } # add default values for unspecified elements defs <- list(pforms = list(), pfix = list(), family = NULL, resp = NULL) defs <- defs[setdiff(names(defs), names(rmNULL(out, FALSE)))] out[names(defs)] <- defs class(out) <- c("brmsformula", "bform") split_bf(out) } # alias of brmsformula #' @export bf <- function(formula, ..., flist = NULL, family = NULL, autocor = NULL, nl = NULL, loop = NULL, center = NULL, cmc = NULL, sparse = NULL, decomp = NULL) { brmsformula( formula, ..., flist = flist, family = family, autocor = autocor, nl = nl, loop = loop, center = center, cmc = cmc, sparse = sparse, decomp = decomp ) } #' Linear and Non-linear formulas in \pkg{brms} #' #' Helper functions to specify linear and non-linear #' formulas for use with \code{\link[brms:brmsformula]{brmsformula}}. #' #' @name brmsformula-helpers #' @aliases bf-helpers nlf lf set_nl set_rescor #' #' @param formula Non-linear formula for a distributional parameter. #' The name of the distributional parameter can either be specified #' on the left-hand side of \code{formula} or via argument \code{dpar}. #' @param dpar Optional character string specifying the distributional #' parameter to which the formulas passed via \code{...} and #' \code{flist} belong. #' @param resp Optional character string specifying the response #' variable to which the formulas passed via \code{...} and #' \code{flist} belong. Only relevant in multivariate models. #' @param autocor A one sided formula containing autocorrelation #' terms. All none autocorrelation terms in \code{autocor} will #' be silently ignored. #' @param rescor Logical; Indicates if residual correlation between #' the response variables should be modeled. Currently this is only #' possible in multivariate \code{gaussian} and \code{student} models. #' Only relevant in multivariate models. #' @param mecor Logical; Indicates if correlations between latent variables #' defined by \code{\link{me}} terms should be modeled. Defaults to \code{TRUE}. #' @inheritParams brmsformula #' #' @return For \code{lf} and \code{nlf} a \code{list} that can be #' passed to \code{\link[brms:brmsformula]{brmsformula}} or added #' to an existing \code{brmsformula} or \code{mvbrmsformula} object. #' For \code{set_nl} and \code{set_rescor} a logical value that can be #' added to an existing \code{brmsformula} or \code{mvbrmsformula} object. #' #' @seealso \code{\link{brmsformula}}, \code{\link{mvbrmsformula}} #' #' @examples #' # add more formulas to the model #' bf(y ~ 1) + #' nlf(sigma ~ a * exp(b * x)) + #' lf(a ~ x, b ~ z + (1|g)) + #' gaussian() #' #' # specify 'nl' later on #' bf(y ~ a * inv_logit(x * b)) + #' lf(a + b ~ z) + #' set_nl(TRUE) #' #' # specify a multivariate model #' bf(y1 ~ x + (1|g)) + #' bf(y2 ~ z) + #' set_rescor(TRUE) #' #' # add autocorrelation terms #' bf(y ~ x) + acformula(~ arma(p = 1, q = 1) + car(W)) NULL #' @rdname brmsformula-helpers #' @export nlf <- function(formula, ..., flist = NULL, dpar = NULL, resp = NULL, loop = NULL) { formula <- as_formula(formula) if (is.null(lhs(formula))) { stop2("Argument 'formula' must be two-sided.") } if (length(c(list(...), flist))) { warning2( "Arguments '...' and 'flist' in nlf() will be reworked ", "at some point. Please avoid using them if possible." ) } warn_dpar(dpar) if (!is.null(resp)) { resp <- as_one_character(resp) } if (!is.null(loop)) { attr(formula, "loop") <- as_one_logical(loop) } if (is.null(attr(formula, "loop"))) { attr(formula, "loop") <- TRUE } out <- c( list(structure(formula, nl = TRUE)), lf(..., flist = flist) ) structure(out, resp = resp) } #' @rdname brmsformula-helpers #' @export lf <- function(..., flist = NULL, dpar = NULL, resp = NULL, center = NULL, cmc = NULL, sparse = NULL, decomp = NULL) { out <- c(list(...), flist) warn_dpar(dpar) if (!is.null(resp)) { resp <- as_one_character(resp) } cmc <- if (!is.null(cmc)) as_one_logical(cmc) center <- if (!is.null(center)) as_one_logical(center) decomp <- if (!is.null(decomp)) match.arg(decomp, decomp_opts()) for (i in seq_along(out)) { if (!is.null(cmc)) { attr(out[[i]], "cmc") <- cmc } if (!is.null(center)) { attr(out[[i]], "center") <- center } if (!is.null(sparse)) { attr(out[[i]], "sparse") <- sparse } if (!is.null(decomp)) { attr(out[[i]], "decomp") <- decomp } } structure(out, resp = resp) } #' @rdname brmsformula-helpers #' @export acformula <- function(autocor, resp = NULL) { autocor <- parse_ac(as.formula(autocor)) if (!is.formula(autocor)) { stop2("'autocor' must contain at least one autocorrelation term.") } if (!is.null(resp)) { resp <- as_one_character(resp) } structure(autocor, resp = resp, class = c("acformula", "formula")) } #' @rdname brmsformula-helpers #' @export set_nl <- function(nl = TRUE, dpar = NULL, resp = NULL) { nl <- as_one_logical(nl) if (!is.null(dpar)) { dpar <- as_one_character(dpar) } if (!is.null(resp)) { resp <- as_one_character(resp) } structure(nl, dpar = dpar, resp = resp, class = "setnl") } #' Set up a multivariate model formula for use in \pkg{brms} #' #' Set up a multivariate model formula for use in the \pkg{brms} package #' allowing to define (potentially non-linear) additive multilevel #' models for all parameters of the assumed response distributions. #' #' @aliases mvbf #' #' @param ... Objects of class \code{formula} or \code{brmsformula}, #' each specifying a univariate model. See \code{\link{brmsformula}} #' for details on how to specify univariate models. #' @param flist Optional list of formulas, which are treated in the #' same way as formulas passed via the \code{...} argument. #' @param rescor Logical; Indicates if residual correlation between #' the response variables should be modeled. Currently, this is only #' possible in multivariate \code{gaussian} and \code{student} models. #' If \code{NULL} (the default), \code{rescor} is internally set to #' \code{TRUE} when possible. #' #' @return An object of class \code{mvbrmsformula}, which #' is essentially a \code{list} containing all model formulas #' as well as some additional information for multivariate models. #' #' @details See \code{vignette("brms_multivariate")} for a case study. #' #' @seealso \code{\link{brmsformula}}, \code{\link{brmsformula-helpers}} #' #' @examples #' bf1 <- bf(y1 ~ x + (1|g)) #' bf2 <- bf(y2 ~ s(z)) #' mvbf(bf1, bf2) #' #' @export mvbrmsformula <- function(..., flist = NULL, rescor = NULL) { dots <- c(list(...), flist) if (!length(dots)) { stop2("No objects passed to 'mvbrmsformula'.") } forms <- list() for (i in seq_along(dots)) { if (is.mvbrmsformula(dots[[i]])) { forms <- c(forms, dots[[i]]$forms) if (is.null(rescor)) { rescor <- dots[[i]]$rescor } } else { forms <- c(forms, list(bf(dots[[i]]))) } } if (!is.null(rescor)) { rescor <- as_one_logical(rescor) } responses <- ulapply(forms, "[[", "resp") if (any(duplicated(responses))) { stop2("Cannot use the same response variable twice in the same model.") } names(forms) <- responses structure( nlist(forms, responses, rescor), class = c("mvbrmsformula", "bform") ) } #' @export mvbf <- function(..., flist = NULL, rescor = NULL) { mvbrmsformula(..., flist = flist, rescor = rescor) } # build a mvbrmsformula object based on a brmsformula object # which uses mvbind on the left-hand side to specify MV models split_bf <- function(x) { stopifnot(is.brmsformula(x)) resp <- parse_resp(x$formula, check_names = FALSE) str_adform <- formula2str(x$formula) str_adform <- get_matches("\\|[^~]*(?=~)", str_adform, perl = TRUE) if (length(resp) > 1L) { # mvbind syntax used to specify MV model flist <- named_list(resp) for (i in seq_along(resp)) { flist[[i]] <- x str_lhs <- paste0(resp[[i]], str_adform) flist[[i]]$formula[[2]] <- parse(text = str_lhs)[[1]] flist[[i]]$resp <- resp[[i]] } x <- mvbf(flist = flist) } x } #' Bind response variables in multivariate models #' #' Can be used to specify a multivariate \pkg{brms} model within a single #' formula. Outside of \code{\link{brmsformula}}, it just behaves like #' \code{\link{cbind}}. #' #' @param ... Same as in \code{\link{cbind}} #' #' @seealso \code{\link{brmsformula}}, \code{\link{mvbrmsformula}} #' #' @examples #' bf(mvbind(y1, y2) ~ x) #' #' @export mvbind <- function(...) { cbind(...) } #' @rdname brmsformula-helpers #' @export set_rescor <- function(rescor = TRUE) { structure(as_one_logical(rescor), class = "setrescor") } allow_rescor <- function(x) { # indicate if estimating 'rescor' is allowed for this model if (!(is.mvbrmsformula(x) || is.mvbrmsterms(x))) { return(FALSE) } parts <- if (is.mvbrmsformula(x)) x$forms else x$terms families <- lapply(parts, "[[", "family") has_rescor <- ulapply(families, has_rescor) family_names <- ulapply(families, "[[", "family") all(has_rescor) && length(unique(family_names)) == 1L } #' @rdname brmsformula-helpers #' @export set_mecor <- function(mecor = TRUE) { structure(as_one_logical(mecor), class = "setmecor") } #' @export "+.bform" <- function(e1, e2) { if (is.brmsformula(e1)) { out <- plus_brmsformula(e1, e2) } else if (is.mvbrmsformula(e1)) { out <- plus_mvbrmsformula(e1, e2) } else { stop2("Method '+.bform' not implemented for ", class(e1), " objects.") } out } # internal helper function of '+.bform' plus_brmsformula <- function(e1, e2) { if (is.function(e2)) { e2 <- try(e2(), silent = TRUE) if (!is.family(e2)) { stop2("Don't know how to handle non-family functions.") } } if (is.family(e2)) { e1 <- bf(e1, family = e2) } else if (is.cor_brms(e2) || inherits(e2, "acformula")) { e1 <- bf(e1, autocor = e2) } else if (inherits(e2, "setnl")) { dpar <- attr(e2, "dpar") if (is.null(dpar)) { e1 <- bf(e1, nl = e2) } else { if (is.null(e1$pforms[[dpar]])) { stop2("Parameter '", dpar, "' has no formula.") } attr(e1$pforms[[dpar]], "nl") <- e2 e1 <- bf(e1) } } else if (inherits(e2, "setmecor")) { e1$mecor <- e2[1] } else if (is.brmsformula(e2)) { e1 <- mvbf(e1, e2) } else if (inherits(e2, "setrescor")) { stop2("Setting 'rescor' is only possible in multivariate models.") } else if (!is.null(e2)) { e1 <- bf(e1, e2) } e1 } # internal helper function of '+.bform' plus_mvbrmsformula <- function(e1, e2) { if (is.function(e2)) { e2 <- try(e2(), silent = TRUE) if (!is.family(e2)) { stop2("Don't know how to handle non-family functions.") } } if (is.family(e2) || is.cor_brms(e2)) { e1$forms <- lapply(e1$forms, "+", e2) } else if (inherits(e2, "setrescor")) { e1$rescor <- e2[1] } else if (inherits(e2, "setmecor")) { e1$mecor <- e2[1] } else if (is.brmsformula(e2)) { e1 <- mvbf(e1, e2) } else if (!is.null(e2)) { resp <- attr(e2, "resp", TRUE) if (is.null(resp)) { stop2( "Don't know how to add a ", class(e2), " object ", "without the response variable name. ", "See help('brmsformula-helpers') for more details." ) } if (!isTRUE(resp %in% e1$responses)) { stop2("'resp' should be one of ", collapse_comma(e1$responses), ".") } e1$forms[[resp]] <- e1$forms[[resp]] + e2 } e1 } # extract the 'nl' attribute from a brmsformula object # @param x object to extract 'nl' from # @param dpar optional name of a distributional parameter # for which 'nl' should be extracted # @param resp: optional name of a response variable # for which 'nl' should be extracted # @param aol: (as one logical) apply isTRUE to the result? get_nl <- function(x, dpar = NULL, resp = NULL, aol = TRUE) { if (is.mvbrmsformula(x)) { resp <- as_one_character(resp) x <- x$forms[[resp]] } if (is.brmsformula(x)) { if (is.null(dpar)) { x <- x$formula } else { dpar <- as_one_character(dpar) x <- x$pforms[[dpar]] } } nl <- attr(x, "nl", TRUE) if (aol) { nl <- isTRUE(nl) } nl } # available options for the 'decomp' argument decomp_opts <- function() { c("none", "QR") } # validate a formula of an additional parameter # @param formula an formula object # @param par optional name of the parameter; if not specified # the parameter name will be inferred from the formula # @param rsv_pars optional character vector of reserved parameter names # @return a named list of length one containing the formula validate_par_formula <- function(formula, par = NULL, rsv_pars = NULL) { stopifnot(length(par) <= 1L) try_formula <- try(as_formula(formula), silent = TRUE) if (is(try_formula, "try-error")) { if (length(formula) != 1L) { stop2("Expecting a single value when fixing parameter '", par, "'.") } scalar <- SW(as.numeric(formula)) if (!is.na(scalar)) { formula <- scalar } else { formula <- as.character(formula) } out <- named_list(par, formula) } else { formula <- try_formula if (!is.null(lhs(formula))) { resp_pars <- all.vars(formula[[2]]) out <- named_list(resp_pars, list(formula)) for (i in seq_along(out)) { out[[i]][[2]] <- eval2(paste("quote(", resp_pars[i], ")")) } } else { if (!isTRUE(nzchar(par))) { stop2("Additional formulas must be named.") } formula <- formula(paste(par, formula2str(formula))) out <- named_list(par, list(formula)) } } pars <- names(out) if (any(grepl("\\.|_", pars))) { stop2("Parameter names should not contain dots or underscores.") } inv_pars <- intersect(pars, rsv_pars) if (length(inv_pars)) { stop2("The following parameter names are reserved", "for this model:\n", collapse_comma(inv_pars)) } out } # validate formulas dedicated to response variables # @param x coerced to a formula object # @param empty_ok is an empty left-hand-side ok? # @return a formula of the form ~ 1 validate_resp_formula <- function(x, empty_ok = TRUE) { out <- lhs(as_formula(x)) if (is.null(out)) { if (empty_ok) { out <- ~ 1 } else { str_x <- formula2str(x, space = "trim") stop2("Response variable is missing in formula ", str_x) } } out <- gsub("\\|+[^~]*~", "~", formula2str(out)) out <- try(formula(out), silent = TRUE) if (is(out, "try-error")) { str_x <- formula2str(x, space = "trim") stop2("Incorrect use of '|' on the left-hand side of ", str_x) } environment(out) <- environment(x) out } # incorporate additional arguments into the model formula validate_formula <- function(formula, ...) { UseMethod("validate_formula") } #' @export validate_formula.default <- function(formula, ...) { validate_formula(bf(formula), ...) } # incorporate additional arguments into the model formula # @param formula object of class 'formula' of 'brmsformula' # @param data optional data.frame to validate data related arguments # @param family optional 'family' object # @param autocor optional 'cor_brms' object # @param threshold (deprecated) threshold type for ordinal models # @return a brmsformula object compatible with the current version of brms #' @export validate_formula.brmsformula <- function( formula, family = gaussian(), autocor = NULL, data = NULL, threshold = NULL, sparse = NULL, ... ) { out <- bf(formula) if (is.null(out$family) && !is.null(family)) { out$family <- check_family(family) } if (is.null(attr(out$formula, "autocor")) && !is.null(autocor)) { # 'autocor' interface has been changed in brms 2.11.1 warning2( "Argument 'autocor' should be specified within the ", "'formula' argument. See ?brmsformula for help." ) # store 'autocor' as an attribute to carry it around easier attr(out$formula, "autocor") <- validate_autocor(autocor) } # allow the '.' symbol in the formulas out$formula <- expand_dot_formula(out$formula, data) for (i in seq_along(out$pforms)) { out$pforms[[i]] <- expand_dot_formula(out$pforms[[i]], data) } if (!is.null(sparse)) { # a global 'sparse' argument is deprecated as of brms 2.8.3 warning2( "Argument 'sparse' should be specified within the ", "'formula' argument. See ?brmsformula for help." ) sparse <- as_one_logical(sparse) if (is.null(attr(out$formula, "sparse"))) { attr(out$formula, "sparse") <- sparse } for (i in seq_along(out$pforms)) { if (is.null(attr(out$pforms[[i]], "sparse"))) { attr(out$pforms[[i]], "sparse") <- sparse } } } out$mecor <- default_mecor(out$mecor) if (has_cat(out) && is.null(get_cats(out)) && !is.null(data)) { # for easy access of response categories out$family$cats <- extract_cat_names(out, data) } if (is_ordinal(out$family)) { if (is.null(out$family$threshold) && !is.null(threshold)) { # slot 'threshold' is deprecated as of brms 1.7.0 out$family <- check_family(out$family, threshold = threshold) } try_terms <- try(stats::terms(out$formula), silent = TRUE) intercept <- attr(try_terms, "intercept", TRUE) if (!is(try_terms, "try-error") && isTRUE(intercept == 0)) { stop2("Cannot remove the intercept in an ordinal model.") } if (is.null(get_thres(out)) && !is.null(data)) { # for easy access of thresholds out$family$thres <- extract_thres_names(out, data) } if (is.null(get_cats(out)) && !is.null(data)) { # for easy access of response categories (#838) out$family$cats <- extract_cat_names(out, data) } if (is.mixfamily(out$family)) { # every mixture family needs to know about response categories for (i in seq_along(out$family$mix)) { out$family$mix[[i]]$thres <- out$family$thres } } } mu_dpars <- str_subset(out$family$dpars, "^mu") conv_cats_dpars <- conv_cats_dpars(out$family) if (conv_cats_dpars && !length(mu_dpars) && !is.null(data)) { # define distributional parameters based on response categories if (length(out$family$cats) < 2L) { stop2("At least 2 response categories are required.") } if (is.null(out$family$refcat)) { # the first level serves as the reference category out$family$refcat <- out$family$cats[1] } if (isNA(out$family$refcat)) { predcats <- out$family$cats # predict all categories } else { if (!out$family$refcat %in% out$family$cats) { stop2("The reference response category must be one of ", collapse_comma(out$family$cats), ".") } predcats <- setdiff(out$family$cats, out$family$refcat) } mu_dpars <- make_stan_names(paste0("mu", predcats)) if (any(duplicated(mu_dpars))) { stop2("Invalid response category names. Please avoid ", "using any special characters in the names.") } out$family$dpars <- c(mu_dpars, out$family$dpars) } bf(out) } # incorporate additional arguments into MV model formulas # allow passing lists of families or autocors #' @export validate_formula.mvbrmsformula <- function( formula, family = NULL, autocor = NULL, ... ) { nresp <- length(formula$forms) if (!is(family, "list")) { family <- replicate(nresp, family, simplify = FALSE) } else if (length(family) != nresp) { stop2("If 'family' is a list, it has to be of the same ", "length as the number of response variables.") } if (!is(autocor, "list")) { autocor <- replicate(nresp, autocor, simplify = FALSE) } else if (length(autocor) != nresp) { stop2("If 'autocor' is a list, it has to be of the same ", "length as the number of response variables.") } for (i in seq_len(nresp)) { formula$forms[[i]] <- validate_formula( formula$forms[[i]], family = family[[i]], autocor = autocor[[i]], ... ) } if (length(formula$forms) < 2L) { stop2("Multivariate models require at least two responses.") } allow_rescor <- allow_rescor(formula) if (is.null(formula$rescor)) { # with 'mi' terms we usually don't want rescor to be estimated miforms <- ulapply(formula$forms, function(f) parse_ad(f$formula, f$family, FALSE)[["mi"]] ) formula$rescor <- allow_rescor && !length(miforms) message("Setting 'rescor' to ", formula$rescor, " by default for this model") } formula$rescor <- as_one_logical(formula$rescor) if (formula$rescor) { if (!allow_rescor) { stop2("Currently, estimating 'rescor' is only possible ", "in multivariate gaussian or student models.") } } # handle default of correlations between 'me' terms formula$mecor <- default_mecor(formula$mecor) for (i in seq_along(formula$forms)) { formula$forms[[i]]$mecor <- formula$mecor } formula } # update a brmsformula and / or its attributes # @param brmsformula object # @param formula.: formula to update 'object' # @param mode supports the following options: # "update": apply update.formula # "replace": replace old formula # "keep": keep old formula # attributes are always updated # @param ... currently unused # @return a brmsformula object #' @export update.brmsformula <- function(object, formula., mode = c("update", "replace", "keep"), ...) { mode <- match.arg(mode) object <- bf(object) up_nl <- get_nl(formula., aol = FALSE) if (is.null(up_nl)) { up_nl <- get_nl(object) } # already use up_nl here to avoid ordinary parsing of NL formulas formula. <- bf(formula., nl = up_nl) up_family <- formula.[["family"]] if (is.null(up_family)) { up_family <- object[["family"]] } up_autocor <- attr(formula.$formula, "autocor") if (is.null(up_autocor)) { up_autocor <- attr(object$formula, "autocor") } old_form <- object$formula up_form <- formula.$formula if (mode == "update") { new_form <- update(old_form, up_form, ...) } else if (mode == "replace") { new_form <- up_form } else if (mode == "keep") { new_form <- old_form } flist <- c(object$pforms, object$pfix, formula.$pforms, formula.$pfix) bf(new_form, flist = flist, family = up_family, autocor = up_autocor, nl = up_nl) } #' @export update.mvbrmsformula <- function(object, formula., ...) { # temporary until proper updating is implemented if (!missing(formula.)) { stop2("Updating formulas of multivariate models is not yet possible.") } object } #' Update Formula Addition Terms #' #' Update additions terms used in formulas of \pkg{brms}. See #' \code{\link{addition-terms}} for details. #' #' @param formula Two-sided formula to be updated. #' @param adform One-sided formula containing addition terms to update #' \code{formula} with. #' @param action Indicates what should happen to the existing addition terms in #' \code{formula}. If \code{"update"} (the default), old addition terms that #' have no corresponding term in \code{adform} will be kept. If #' \code{"replace"}, all old addition terms will be removed. #' #' @return An object of class \code{formula}. #' #' @examples #' form <- y | trials(size) ~ x #' update_adterms(form, ~ trials(10)) #' update_adterms(form, ~ weights(w)) #' update_adterms(form, ~ weights(w), action = "replace") #' update_adterms(y ~ x, ~ trials(10)) #' #' @export update_adterms <- function(formula, adform, action = c("update", "replace")) { formula <- as_formula(formula) adform <- as_formula(adform) action <- match.arg(action) if (is.null(lhs(formula))) { stop2("Can't update a ond-sided formula.") } str_formula <- formula2str(formula) old_ad <- get_matches("(?<=\\|)[^~]*(?=~)", str_formula, perl = TRUE) new_ad_terms <- attr(terms(adform), "term.labels") if (action == "update" && length(old_ad)) { # extract adterms from the original formula old_ad <- formula(paste("~", old_ad)) old_ad_terms <- attr(terms(old_ad), "term.labels") old_adnames <- get_matches("^[^\\(]+", old_ad_terms) old_adnames <- sub("^resp_", "", old_adnames) new_adnames <- get_matches("^[^\\(]+", new_ad_terms) new_adnames <- sub("^resp_", "", new_adnames) # keep unmatched adterms of the original formula keep <- !old_adnames %in% new_adnames new_ad_terms <- c(old_ad_terms[keep], new_ad_terms) } if (length(new_ad_terms)) { new_ad_terms <- paste(new_ad_terms, collapse = "+") new_ad_terms <- paste("|", new_ad_terms) } resp <- gsub("\\|.+", "", deparse_combine(formula[[2]])) out <- formula(paste(resp, new_ad_terms, "~1")) out[[3]] <- formula[[3]] attributes(out) <- attributes(formula) out } #' @export print.brmsformula <- function(x, wsp = 0, digits = 2, ...) { cat(formula2str(x$formula, space = "trim"), "\n") str_wsp <- collapse(rep(" ", wsp)) autocor <- attr(x$formula, "autocor") if (!is.null(autocor)) { autocor <- formula2str(autocor, rm = 1, space = "trim") cat(paste0(str_wsp, "autocor ~ ", autocor, "\n")) } pforms <- x$pforms if (length(pforms)) { pforms <- ulapply(pforms, formula2str, space = "trim") cat(collapse(str_wsp, pforms, "\n")) } pfix <- x$pfix if (length(pfix)) { pfix <- lapply(pfix, function(x) ifelse(is.numeric(x), round(x, digits), x) ) pfix <- paste0(names(pfix), " = ", unlist(pfix)) cat(collapse(str_wsp, pfix, "\n")) } invisible(x) } #' @export print.mvbrmsformula <- function(x, wsp = 0, ...) { for (i in seq_along(x$forms)) { if (i > 1) cat(collapse(rep(" ", wsp))) print(x$forms[[i]], wsp = wsp, ...) } invisible(x) } #' Checks if argument is a \code{brmsformula} object #' #' @param x An \R object #' #' @export is.brmsformula <- function(x) { inherits(x, "brmsformula") } #' Checks if argument is a \code{mvbrmsformula} object #' #' @param x An \R object #' #' @export is.mvbrmsformula <- function(x) { inherits(x, "mvbrmsformula") } is_nonlinear <- function(x) { stopifnot(is.brmsfit(x)) get_nl(bf(x$formula)) } warn_dpar <- function(dpar) { # argument 'dpar' in formula helper functions is deprecated as of 2.3.7 if (!is.null(dpar)) { warning2("Argument 'dpar' is no longer necessary and ignored.") } NULL } # return the right-hand side of a formula rhs <- function(x) { attri <- attributes(x) x <- as.formula(x) x <- if (length(x) == 3) x[-2] else x do_call(structure, c(list(x), attri)) } # return the left-hand side of a formula lhs <- function(x) { x <- as.formula(x) if (length(x) == 3L) update(x, . ~ 1) else NULL } # convert a string to a formula # @param x vector of strings to be converted # @param ... passed to formula() str2formula <- function(x, ..., collapse = "+") { has_chars <- nzchar(x) if (length(x) && any(has_chars)) { out <- paste(x[has_chars], collapse = collapse) } else { out <- "1" } out <- formula(paste("~", out), ...) environment(out) <- parent.frame() out } # convert a formula to a character string # @param formula a model formula # @param rm a vector of to elements indicating how many characters # should be removed at the beginning and end of the string respectively # @param space how should whitespaces be treated? # @return a single character string or NULL formula2str <- function(formula, rm = c(0, 0), space = c("rm", "trim")) { if (is.null(formula)) { return(NULL) } formula <- as.formula(formula) space <- match.arg(space) if (anyNA(rm[2])) rm[2] <- 0 x <- Reduce(paste, deparse(formula)) x <- gsub("[\t\r\n]+", "", x, perl = TRUE) if (space == "trim") { x <- gsub(" {1,}", " ", x, perl = TRUE) } else { x <- gsub(" ", "", x, perl = TRUE) } substr(x, 1 + rm[1], nchar(x) - rm[2]) } # right-hand side of a formula as a character string str_rhs <- function(x) { formula2str(rhs(x), rm = c(1, 0)) } # left-hand side of a formula as a character string str_lhs <- function(x) { formula2str(lhs(x), rm = c(0, 2)) } is.formula <- function(x) { inherits(x, "formula") } # wrapper around as.formula with additional checks as_formula <- function(x) { x <- as.formula(x) # fixes issue #749 rhs <- rhs(x)[[2]] if (isTRUE(is.call(rhs) && rhs[[1]] == "~")) { stop2("Nested formulas are not allowed. Did you use '~~' somewhere?") } x } # expand the '.' variable in formula using stats::terms expand_dot_formula <- function(formula, data = NULL) { if (isTRUE("." %in% all.vars(formula))) { att <- attributes(formula) try_terms <- try( stats::terms(formula, data = data), silent = TRUE ) if (!is(try_terms, "try-error")) { formula <- formula(try_terms) } attributes(formula) <- att } formula } brms/R/formula-ad.R0000644000176200001440000002660513621206133013576 0ustar liggesusers#' Additional Response Information #' #' Provide additional information on the response variable #' in \pkg{brms} models, such as censoring, truncation, or #' known measurement error. #' #' @name addition-terms #' #' @param x A vector; usually a variable defined in the data. Allowed values #' depend on the function: \code{resp_se} and \code{resp_weights} require #' positive numeric values. \code{resp_trials}, \code{resp_thres}, and #' \code{resp_cat} require positive integers. \code{resp_dec} requires #' \code{0} and \code{1}, or alternatively \code{'lower'} and \code{'upper'}. #' \code{resp_subset} requires \code{0} and \code{1}, or alternatively #' \code{FALSE} and \code{TRUE}. \code{resp_cens} requires \code{'left'}, #' \code{'none'}, \code{'right'}, and \code{'interval'} (or equivalently #' \code{-1}, \code{0}, \code{1}, and \code{2}) to indicate left, no, right, #' or interval censoring. #' @param sigma Logical; Indicates whether the residual standard deviation #' parameter \code{sigma} should be included in addition to the known #' measurement error. Defaults to \code{FALSE} for backwards compatibility, #' but setting it to \code{TRUE} is usually the better choice. #' @param scale Logical; Indicates whether weights should be scaled #' so that the average weight equals one. Defaults to \code{FALSE}. #' @param y2 A vector specifying the upper bounds in interval censoring. #' Will be ignored for non-interval censored observations. However, it #' should NOT be \code{NA} even for non-interval censored observations to #' avoid accidental exclusion of these observations. #' @param lb A numeric vector or single numeric value specifying #' the lower truncation bound. #' @param ub A numeric vector or single numeric value specifying #' the upper truncation bound. #' @param sdy Optional known measurement error of the response #' treated as standard deviation. If specified, handles #' measurement error and (completely) missing values #' at the same time using the plausible-values-technique. #' @param denom A vector of positive numeric values specifying #' the denominator values from which the response rates are computed. #' @param gr A vector of grouping indicators. #' @param ... For \code{resp_vreal}, vectors of real values. #' For \code{resp_vint}, vectors of integer values. #' #' @return A list of additional response information to be processed further #' by \pkg{brms}. #' #' @details #' These functions are almost solely useful when #' called in formulas passed to the \pkg{brms} package. #' Within formulas, the \code{resp_} prefix may be omitted. #' More information is given in the 'Details' section #' of \code{\link{brmsformula}}. #' #' @seealso #' \code{\link{brm}}, #' \code{\link{brmsformula}} #' #' @examples #' \dontrun{ #' ## Random effects meta-analysis #' nstudies <- 20 #' true_effects <- rnorm(nstudies, 0.5, 0.2) #' sei <- runif(nstudies, 0.05, 0.3) #' outcomes <- rnorm(nstudies, true_effects, sei) #' data1 <- data.frame(outcomes, sei) #' fit1 <- brm(outcomes | se(sei, sigma = TRUE) ~ 1, #' data = data1) #' summary(fit1) #' #' ## Probit regression using the binomial family #' n <- sample(1:10, 100, TRUE) # number of trials #' success <- rbinom(100, size = n, prob = 0.4) #' x <- rnorm(100) #' data2 <- data.frame(n, success, x) #' fit2 <- brm(success | trials(n) ~ x, data = data2, #' family = binomial("probit")) #' summary(fit2) #' #' ## Survival regression modeling the time between the first #' ## and second recurrence of an infection in kidney patients. #' fit3 <- brm(time | cens(censored) ~ age * sex + disease + (1|patient), #' data = kidney, family = lognormal()) #' summary(fit3) #' #' ## Poisson model with truncated counts #' fit4 <- brm(count | trunc(ub = 104) ~ zBase * Trt, #' data = epilepsy, family = poisson()) #' summary(fit4) #' } #' NULL #' @rdname addition-terms #' @export resp_se <- function(x, sigma = FALSE) { se <- deparse(substitute(x)) sigma <- as_one_logical(sigma) class_resp_special( "se", call = match.call(), vars = nlist(se), flags = nlist(sigma) ) } #' @rdname addition-terms #' @export resp_weights <- function(x, scale = FALSE) { weights <- deparse(substitute(x)) scale <- as_one_logical(scale) class_resp_special( "weights", call = match.call(), vars = nlist(weights), flags = nlist(scale) ) } #' @rdname addition-terms #' @export resp_trials <- function(x) { trials <- deparse(substitute(x)) class_resp_special("trials", call = match.call(), vars = nlist(trials)) } #' @rdname addition-terms #' @export resp_thres <- function(x, gr = NA) { thres <- deparse(substitute(x)) gr <- deparse(substitute(gr)) class_resp_special("thres", call = match.call(), vars = nlist(thres, gr)) } #' @rdname addition-terms #' @export resp_cat <- function(x) { # deprecated as of brms 2.10.5 # number of thresholds = number of response categories - 1 thres <- deparse(substitute(x)) str_add(thres) <- " - 1" class_resp_special( "thres", call = match.call(), vars = nlist(thres, gr = "NA") ) } #' @rdname addition-terms #' @export resp_dec <- function(x) { dec <- deparse(substitute(x)) class_resp_special("dec", call = match.call(), vars = nlist(dec)) } #' @rdname addition-terms #' @export resp_cens <- function(x, y2 = NA) { cens <- deparse(substitute(x)) y2 <- deparse(substitute(y2)) class_resp_special("cens", call = match.call(), vars = nlist(cens, y2)) } #' @rdname addition-terms #' @export resp_trunc <- function(lb = -Inf, ub = Inf) { lb <- deparse(substitute(lb)) ub <- deparse(substitute(ub)) class_resp_special("trunc", call = match.call(), vars = nlist(lb, ub)) } #' @rdname addition-terms #' @export resp_mi <- function(sdy = NA) { sdy <- deparse(substitute(sdy)) class_resp_special("mi", call = match.call(), vars = nlist(sdy)) } #' @rdname addition-terms #' @export resp_rate <- function(denom) { denom <- deparse(substitute(denom)) class_resp_special("rate", call = match.call(), vars = nlist(denom)) } #' @rdname addition-terms #' @export resp_subset <- function(x) { subset <- deparse(substitute(x)) class_resp_special("subset", call = match.call(), vars = nlist(subset)) } #' @rdname addition-terms #' @export resp_vreal <- function(...) { vars <- as.list(substitute(list(...)))[-1] class_resp_special("vreal", call = match.call(), vars = vars) } #' @rdname addition-terms #' @export resp_vint <- function(...) { vars <- as.list(substitute(list(...)))[-1] class_resp_special("vint", call = match.call(), vars = vars) } # class underlying response addition terms # @param type type of the addition term # @param call the call to the original addition term function # @param vars named list of unevaluated variables # @param flags named list of (evaluated) logical indicators class_resp_special <- function(type, call, vars = list(), flags = list()) { type <- as_one_character(type) stopifnot(is.call(call), is.list(vars), is.list(flags)) label <- deparse(call) out <- nlist(type, call, label, vars, flags) class(out) <- c("resp_special") out } # computes data for addition arguments eval_rhs <- function(formula, data = NULL) { formula <- as.formula(formula) eval(rhs(formula)[[2]], data, environment(formula)) } # get expression for a variable of an addition term # @param x list with potentail $adforms elements # @param ad name of the addition term # @param target name of the element to extract # @type type of the element to extract # @return a character string or NULL get_ad_expr <- function(x, ad, name, type = "vars") { ad <- as_one_character(ad) name <- as_one_character(name) type <- as_one_character(type) if (is.null(x$adforms[[ad]])) { return(NULL) } out <- eval_rhs(x$adforms[[ad]])[[type]][[name]] if (type == "vars" && is_equal(out, "NA")) { out <- NULL } out } # get values of a variable used in an addition term # @return a vector of values or NULL get_ad_values <- function(x, ad, name, data) { expr <- get_ad_expr(x, ad, name, type = "vars") eval2(expr, data) } # get a flag used in an addition term # @return TRUE or FALSE get_ad_flag <- function(x, ad, name) { expr <- get_ad_expr(x, ad, name, type = "flags") as_one_logical(eval2(expr)) } # get variable names used in addition terms get_ad_vars <- function(x, ...) { UseMethod("get_ad_vars") } #' @export get_ad_vars.brmsterms <- function(x, ad, ...) { ad <- as_one_character(ad) all_vars(x$adforms[[ad]]) } #' @export get_ad_vars.mvbrmsterms <- function(x, ad, ...) { unique(ulapply(x$terms, get_ad_vars, ad = ad, ...)) } # coerce censored values into the right format # @param x vector of censoring indicators # @return transformed vector of censoring indicators prepare_cens <- function(x) { .prepare_cens <- function(x) { stopifnot(length(x) == 1L) regx <- paste0("^", x) if (grepl(regx, "left")) { x <- -1 } else if (grepl(regx, "none") || isFALSE(x)) { x <- 0 } else if (grepl(regx, "right") || isTRUE(x)) { x <- 1 } else if (grepl(regx, "interval")) { x <- 2 } return(x) } x <- unname(x) if (is.factor(x)) { x <- as.character(x) } ulapply(x, .prepare_cens) } # extract information on censoring of the response variable # @param x a brmsfit object # @param resp optional names of response variables for which to extract values # @return vector of censoring indicators or NULL in case of no censoring get_cens <- function(x, resp = NULL, newdata = NULL) { stopifnot(is.brmsfit(x)) resp <- validate_resp(resp, x, multiple = FALSE) bterms <- parse_bf(x$formula) if (!is.null(resp)) { bterms <- bterms$terms[[resp]] } if (is.null(newdata)) { newdata <- model.frame(x) } out <- NULL if (is.formula(bterms$adforms$cens)) { out <- get_ad_values(bterms, "cens", "cens", newdata) out <- prepare_cens(out) } out } # extract truncation boundaries trunc_bounds <- function(x, ...) { UseMethod("trunc_bounds") } # @return a named list with one element per response variable #' @export trunc_bounds.mvbrmsterms <- function(x, ...) { lapply(x$terms, trunc_bounds, ...) } # @param data data.frame containing the truncation variables # @param incl_family include the family in the derivation of the bounds? # @param stan return bounds in form of Stan syntax? # @return a list with elements 'lb' and 'ub' #' @export trunc_bounds.brmsterms <- function(x, data = NULL, incl_family = FALSE, stan = FALSE, ...) { if (is.formula(x$adforms$trunc)) { trunc <- eval_rhs(x$adforms$trunc) } else { trunc <- resp_trunc() } out <- list( lb = eval2(trunc$vars$lb, data), ub = eval2(trunc$vars$ub, data) ) if (incl_family) { family_bounds <- family_bounds(x) out$lb <- max(out$lb, family_bounds$lb) out$ub <- min(out$ub, family_bounds$ub) } if (stan) { if (any(out$lb > -Inf | out$ub < Inf)) { tmp <- c( if (out$lb > -Inf) paste0("lower=", out$lb), if (out$ub < Inf) paste0("upper=", out$ub) ) out <- paste0("<", paste0(tmp, collapse = ","), ">") } else { out <- "" } } out } # check if addition argument 'subset' ist used in the model has_subset <- function(bterms) { .has_subset <- function(x) { is.formula(x$adforms$subset) } if (is.brmsterms(bterms)) { out <- .has_subset(bterms) } else if (is.mvbrmsterms(bterms)) { out <- any(ulapply(bterms$terms, .has_subset)) } else { out <- FALSE } out } brms/R/loo_predict.R0000644000176200001440000001635413606326626014067 0ustar liggesusers#' Compute Weighted Expectations Using LOO #' #' These functions are wrappers around the \code{\link[loo]{E_loo}} #' function of the \pkg{loo} package. #' #' @aliases loo_predict loo_linpred loo_predictive_interval #' #' @param object An object of class \code{brmsfit}. #' @param type The statistic to be computed on the results. #' Can by either \code{"mean"} (default), \code{"var"}, or #' \code{"quantile"}. #' @param probs A vector of quantiles to compute. #' Only used if \code{type = quantile}. #' @param prob For \code{loo_predictive_interval}, a scalar in \eqn{(0,1)} #' indicating the desired probability mass to include in the intervals. The #' default is \code{prob = 0.9} (\eqn{90}\% intervals). #' @param psis_object An optional object returend by \code{\link[loo]{psis}}. #' If \code{psis_object} is missing then \code{\link[loo]{psis}} is executed #' internally, which may be time consuming for models fit to very large datasets. #' @param ... Optional arguments passed to the underlying methods that is #' \code{\link[brms:log_lik.brmsfit]{log_lik}}, as well as #' \code{\link[brms:posterior_predict.brmsfit]{posterior_predict}} or #' \code{\link[brms:posterior_linpred.brmsfit]{posterior_linpred}}. #' @inheritParams posterior_predict.brmsfit #' #' @return \code{loo_predict} and \code{loo_linpred} return a vector with one #' element per observation. The only exception is if \code{type = "quantile"} #' and \code{length(probs) >= 2}, in which case a separate vector for each #' element of \code{probs} is computed and they are returned in a matrix with #' \code{length(probs)} rows and one column per observation. #' #' \code{loo_predictive_interval} returns a matrix with one row per #' observation and two columns. #' \code{loo_predictive_interval(..., prob = p)} is equivalent to #' \code{loo_predict(..., type = "quantile", probs = c(a, 1-a))} with #' \code{a = (1 - p)/2}, except it transposes the result and adds informative #' column names. #' #' @examples #' \dontrun{ #' ## data from help("lm") #' ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14) #' trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69) #' d <- data.frame( #' weight = c(ctl, trt), #' group = gl(2, 10, 20, labels = c("Ctl", "Trt")) #' ) #' fit <- brm(weight ~ group, data = d) #' loo_predictive_interval(fit, prob = 0.8) #' #' ## optionally log-weights can be pre-computed and reused #' psis <- loo::psis(-log_lik(fit), cores = 2) #' loo_predictive_interval(fit, prob = 0.8, psis_object = psis) #' loo_predict(fit, type = "var", psis_object = psis) #' } #' #' @method loo_predict brmsfit #' @importFrom rstantools loo_predict #' @export loo_predict #' @export loo_predict.brmsfit <- function(object, type = c("mean", "var", "quantile"), probs = 0.5, psis_object = NULL, resp = NULL, ...) { type <- match.arg(type) stopifnot_resp(object, resp) if (is.null(psis_object)) { message("Running PSIS to compute weights") psis_object <- compute_loo(object, criterion = "psis", resp = resp, ...) } preds <- posterior_predict(object, resp = resp, ...) loo::E_loo(preds, psis_object, type = type, probs = probs)$value } #' @rdname loo_predict.brmsfit #' @method loo_linpred brmsfit #' @importFrom rstantools loo_linpred #' @export loo_linpred #' @export loo_linpred.brmsfit <- function(object, type = c("mean", "var", "quantile"), probs = 0.5, psis_object = NULL, resp = NULL, ...) { type <- match.arg(type) stopifnot_resp(object, resp) family <- family(object, resp = resp) if (is_ordinal(family) || is_categorical(family)) { stop2("Method 'loo_linpred' is not implemented ", "for categorical or ordinal models") } if (is.null(psis_object)) { message("Running PSIS to compute weights") psis_object <- compute_loo(object, criterion = "psis", resp = resp, ...) } preds <- posterior_linpred(object, resp = resp, ...) loo::E_loo(preds, psis_object, type = type, probs = probs)$value } #' @rdname loo_predict.brmsfit #' @method loo_predictive_interval brmsfit #' @importFrom rstantools loo_predictive_interval #' @export loo_predictive_interval #' @export loo_predictive_interval.brmsfit <- function(object, prob = 0.9, psis_object = NULL, ...) { if (length(prob) != 1L) { stop2("Argument 'prob' should be of length 1.") } alpha <- (1 - prob) / 2 probs <- c(alpha, 1 - alpha) labs <- paste0(100 * probs, "%") intervals <- loo_predict( object, type = "quantile", probs = probs, psis_object = psis_object, ... ) rownames(intervals) <- labs t(intervals) } #' Compute a LOO-adjusted R-squared for regression models #' #' @aliases loo_R2 #' #' @inheritParams posterior_predict.brmsfit #' @param ... Further arguments passed to #' \code{\link[brms:pp_expect.brmsfit]{pp_expect}} and #' \code{\link[brms:log_lik.brmsfit]{log_lik}}, #' which are used in the computation of the R-squared values. #' #' @return A real value per response variable indicating #' the LOO-adjusted R-squared. #' #' @examples #' \dontrun{ #' fit <- brm(mpg ~ wt + cyl, data = mtcars) #' summary(fit) #' loo_R2(fit) #' #' # compute R2 with new data #' nd <- data.frame(mpg = c(10, 20, 30), wt = c(4, 3, 2), cyl = c(8, 6, 4)) #' loo_R2(fit, newdata = nd) #' } #' #' @method loo_R2 brmsfit #' @export loo_R2.brmsfit <- function(object, resp = NULL, ...) { contains_samples(object) object <- restructure(object) resp <- validate_resp(resp, object) R2 <- get_criterion(object, "loo_R2") if (is.vector(R2)) { take <- names(R2) %in% paste0("R2", resp) R2 <- R2[take] return(R2) } family <- family(object, resp = resp) if (conv_cats_dpars(family)) { stop2("'loo_R2' is not defined for unordered categorical models.") } if (is_ordinal(family)) { warning2( "Predictions are treated as continuous variables in ", "'loo_R2' which is likely invalid for ordinal families." ) } # see http://discourse.mc-stan.org/t/stan-summary-r2-or-adjusted-r2/4308/4 .loo_R2 <- function(y, ypred, ll) { r_eff <- r_eff_log_lik(ll, object) psis_object <- loo::psis(log_ratios = -ll, r_eff = r_eff) ypredloo <- loo::E_loo(ypred, psis_object, log_ratios = -ll)$value eloo <- ypredloo - y return(1 - var(eloo) / var(y)) } args_y <- list(object, warn = TRUE, ...) args_ypred <- list(object, sort = TRUE, ...) R2 <- named_list(paste0("R2", resp)) for (i in seq_along(R2)) { # assumes expectations of different responses to be independent args_ypred$resp <- args_y$resp <- resp[i] y <- do_call(get_y, args_y) ypred <- do.call(pp_expect, args_ypred) ll <- do_call(log_lik, args_ypred) if (is_ordinal(family(object, resp = resp[i]))) { ypred <- ordinal_probs_continuous(ypred) } R2[[i]] <- .loo_R2(y, ypred, ll) } R2 <- unlist(R2) names(R2) <- paste0("R2", resp) R2 } # temporary generic until available in loo #' @export loo_R2 <- function(object, ...) { UseMethod("loo_R2") } brms/R/autocor.R0000644000176200001440000004631113611527526013232 0ustar liggesusers# All functions in this file belong to the deprecated 'cor_brms' class # for specifying autocorrelation structures. They will be removed in brms 3. #' (Deprecated) Correlation structure classes for the \pkg{brms} package #' #' Classes of correlation structures available in the \pkg{brms} package. #' \code{cor_brms} is not a correlation structure itself, #' but the class common to all correlation structures implemented in \pkg{brms}. #' #' @name cor_brms #' @aliases cor_brms-class #' #' @section Available correlation structures: #' \describe{ #' \item{cor_arma}{autoregressive-moving average (ARMA) structure, #' with arbitrary orders for the autoregressive and moving #' average components} #' \item{cor_ar}{autoregressive (AR) structure of arbitrary order} #' \item{cor_ma}{moving average (MA) structure of arbitrary order} #' \item{cor_car}{Spatial conditional autoregressive (CAR) structure} #' \item{cor_sar}{Spatial simultaneous autoregressive (SAR) structure} #' \item{cor_fixed}{fixed user-defined covariance structure} #' } #' #' @seealso #' \code{\link{cor_arma}, \link{cor_ar}, \link{cor_ma}, #' \link{cor_car}, \link{cor_sar}, \link{cor_fixed}} #' NULL #' (Deprecated) ARMA(p,q) correlation structure #' #' This function is deprecated. Please see \code{\link{arma}} for the new syntax. #' This functions is a constructor for the \code{cor_arma} class, representing #' an autoregression-moving average correlation structure of order (p, q). #' #' @aliases cor_arma-class #' #' @param formula A one sided formula of the form \code{~ t}, or \code{~ t | g}, #' specifying a time covariate \code{t} and, optionally, a grouping factor #' \code{g}. A covariate for this correlation structure must be integer #' valued. When a grouping factor is present in \code{formula}, the #' correlation structure is assumed to apply only to observations within the #' same grouping level; observations with different grouping levels are #' assumed to be uncorrelated. Defaults to \code{~ 1}, which corresponds to #' using the order of the observations in the data as a covariate, and no #' groups. #' @param p A non-negative integer specifying the autoregressive (AR) #' order of the ARMA structure. Default is 0. #' @param q A non-negative integer specifying the moving average (MA) #' order of the ARMA structure. Default is 0. #' @param r No longer supported. #' @param cov A flag indicating whether ARMA effects should be estimated by #' means of residual covariance matrices. This is currently only possible for #' stationary ARMA effects of order 1. If the model family does not have #' natural residuals, latent residuals are added automatically. If #' \code{FALSE} (the default) a regression formulation is used that is #' considerably faster and allows for ARMA effects of order higher than 1 but #' is only available for \code{gaussian} models and some of its #' generalizations. #' #' @return An object of class \code{cor_arma}, representing an #' autoregression-moving-average correlation structure. #' #' @seealso \code{\link{cor_ar}}, \code{\link{cor_ma}} #' #' @examples #' cor_arma(~ visit | patient, p = 2, q = 2) #' #' @export cor_arma <- function(formula = ~1, p = 0, q = 0, r = 0, cov = FALSE) { formula <- as.formula(formula) p <- as_one_numeric(p) q <- as_one_numeric(q) cov <- as_one_logical(cov) if ("r" %in% names(match.call())) { warning2("The ARR structure is no longer supported and ignored.") } if (!(p >= 0 && p == round(p))) { stop2("Autoregressive order must be a non-negative integer.") } if (!(q >= 0 && q == round(q))) { stop2("Moving-average order must be a non-negative integer.") } if (!sum(p, q)) { stop2("At least one of 'p' and 'q' should be greater zero.") } if (cov && (p > 1 || q > 1)) { stop2("Covariance formulation of ARMA structures is ", "only possible for effects of maximal order one.") } x <- nlist(formula, p, q, cov) class(x) <- c("cor_arma", "cor_brms") x } #' (Deprecated) AR(p) correlation structure #' #' This function is deprecated. Please see \code{\link{ar}} for the new syntax. #' This function is a constructor for the \code{cor_arma} class, #' allowing for autoregression terms only. #' #' @inheritParams cor_arma #' @param p A non-negative integer specifying the autoregressive (AR) #' order of the ARMA structure. Default is 1. #' #' @return An object of class \code{cor_arma} containing solely autoregression terms. #' #' @details AR refers to autoregressive effects of residuals, which #' is what is typically understood as autoregressive effects. #' However, one may also model autoregressive effects of the response #' variable, which is called ARR in \pkg{brms}. #' #' @seealso \code{\link{cor_arma}} #' #' @examples #' cor_ar(~visit|patient, p = 2) #' #' @export cor_ar <- function(formula = ~1, p = 1, cov = FALSE) { cor_arma(formula = formula, p = p, q = 0, cov = cov) } #' (Deprecated) MA(q) correlation structure #' #' This function is deprecated. Please see \code{\link{ma}} for the new syntax. #' This function is a constructor for the \code{cor_arma} class, #' allowing for moving average terms only. #' #' @inheritParams cor_arma #' @param q A non-negative integer specifying the moving average (MA) #' order of the ARMA structure. Default is 1. #' #' @return An object of class \code{cor_arma} containing solely moving #' average terms. #' #' @seealso \code{\link{cor_arma}} #' #' @examples #' cor_ma(~visit|patient, q = 2) #' #' @export cor_ma <- function(formula = ~1, q = 1, cov = FALSE) { cor_arma(formula = formula, p = 0, q = q, cov = cov) } #' (Defunct) ARR correlation structure #' #' The ARR correlation structure is no longer supported. #' #' @inheritParams cor_arma #' #' @keywords internal #' @export cor_arr <- function(formula = ~1, r = 1) { cor_arma(formula = formula, p = 0, q = 0, r = r) } #' (Deprecated) Compound Symmetry (COSY) Correlation Structure #' #' This function is deprecated. Please see \code{\link{cosy}} for the new syntax. #' This functions is a constructor for the \code{cor_cosy} class, representing #' a compound symmetry structure corresponding to uniform correlation. #' #' @aliases cor_cosy-class #' #' @inheritParams cor_arma #' #' @return An object of class \code{cor_cosy}, representing a compound symmetry #' correlation structure. #' #' @examples #' cor_cosy(~ visit | patient) #' #' @export cor_cosy <- function(formula = ~1) { formula <- as.formula(formula) x <- nlist(formula) class(x) <- c("cor_cosy", "cor_brms") x } #' (Deprecated) Spatial simultaneous autoregressive (SAR) structures #' #' Thse functions are deprecated. Please see \code{\link{sar}} for the new #' syntax. These functions are constructors for the \code{cor_sar} class #' implementing spatial simultaneous autoregressive structures. #' The \code{lagsar} structure implements SAR of the response values: #' \deqn{y = \rho W y + \eta + e} #' The \code{errorsar} structure implements SAR of the residuals: #' \deqn{y = \eta + u, u = \rho W u + e} #' In the above equations, \eqn{\eta} is the predictor term and #' \eqn{e} are independent normally or t-distributed residuals. #' #' @param W An object specifying the spatial weighting matrix. #' Can be either the spatial weight matrix itself or an #' object of class \code{listw} or \code{nb}, from which #' the spatial weighting matrix can be computed. #' @param type Type of the SAR structure. Either \code{"lag"} #' (for SAR of the response values) or \code{"error"} #' (for SAR of the residuals). #' #' @details Currently, only families \code{gaussian} and \code{student} #' support SAR structures. #' #' @return An object of class \code{cor_sar} to be used in calls to #' \code{\link{brm}}. #' #' @examples #' \dontrun{ #' data(oldcol, package = "spdep") #' fit1 <- brm(CRIME ~ INC + HOVAL, data = COL.OLD, #' autocor = cor_lagsar(COL.nb), #' chains = 2, cores = 2) #' summary(fit1) #' plot(fit1) #' #' fit2 <- brm(CRIME ~ INC + HOVAL, data = COL.OLD, #' autocor = cor_errorsar(COL.nb), #' chains = 2, cores = 2) #' summary(fit2) #' plot(fit2) #' } #' #' @export cor_sar <- function(W, type = c("lag", "error")) { type <- match.arg(type) W_name <- deparse(substitute(W)) W <- validate_sar_matrix(W) structure( nlist(W, W_name, type), class = c("cor_sar", "cor_brms") ) } #' @rdname cor_sar #' @export cor_lagsar <- function(W) { out <- cor_sar(W, type = "lag") out$W_name <- deparse(substitute(W)) out } #' @rdname cor_sar #' @export cor_errorsar <- function(W) { out <- cor_sar(W, type = "error") out$W_name <- deparse(substitute(W)) out } #' (Deprecated) Spatial conditional autoregressive (CAR) structures #' #' These function are deprecated. Please see \code{\link{car}} for the new #' syntax. These functions are constructors for the \code{cor_car} class #' implementing spatial conditional autoregressive structures. #' #' @param W Adjacency matrix of locations. #' All non-zero entries are treated as if the two locations #' are adjacent. If \code{formula} contains a grouping factor, #' the row names of \code{W} have to match the levels #' of the grouping factor. #' @param formula An optional one-sided formula of the form #' \code{~ 1 | g}, where \code{g} is a grouping factor mapping #' observations to spatial locations. If not specified, #' each observation is treated as a separate location. #' It is recommended to always specify a grouping factor #' to allow for handling of new data in post-processing methods. #' @param type Type of the CAR structure. Currently implemented #' are \code{"escar"} (exact sparse CAR), \code{"esicar"} #' (exact sparse intrinsic CAR), \code{"icar"} (intrinsic CAR), #' and \code{"bym2"}. More information is provided in the 'Details' section. #' #' @details The \code{escar} and \code{esicar} types are #' implemented based on the case study of Max Joseph #' (\url{https://github.com/mbjoseph/CARstan}). The \code{icar} and #' \code{bym2} type is implemented based on the case study of Mitzi Morris #' (\url{http://mc-stan.org/users/documentation/case-studies/icar_stan.html}). #' #' @examples #' \dontrun{ #' # generate some spatial data #' east <- north <- 1:10 #' Grid <- expand.grid(east, north) #' K <- nrow(Grid) #' #' # set up distance and neighbourhood matrices #' distance <- as.matrix(dist(Grid)) #' W <- array(0, c(K, K)) #' W[distance == 1] <- 1 #' #' # generate the covariates and response data #' x1 <- rnorm(K) #' x2 <- rnorm(K) #' theta <- rnorm(K, sd = 0.05) #' phi <- rmulti_normal( #' 1, mu = rep(0, K), Sigma = 0.4 * exp(-0.1 * distance) #' ) #' eta <- x1 + x2 + phi #' prob <- exp(eta) / (1 + exp(eta)) #' size <- rep(50, K) #' y <- rbinom(n = K, size = size, prob = prob) #' dat <- data.frame(y, size, x1, x2) #' #' # fit a CAR model #' fit <- brm(y | trials(size) ~ x1 + x2, data = dat, #' family = binomial(), autocor = cor_car(W)) #' summary(fit) #' } #' #' @export cor_car <- function(W, formula = ~1, type = "escar") { options <- c("escar", "esicar", "icar", "bym2") type <- match.arg(type, options) W_name <- deparse(substitute(W)) W <- validate_car_matrix(W) formula <- as.formula(formula) if (!is.null(lhs(formula))) { stop2("'formula' should be a one-sided formula.") } if (length(attr(terms(formula), "term.labels")) > 1L) { stop2("'formula' should not contain more than one term.") } structure( nlist(W, W_name, formula, type), class = c("cor_car", "cor_brms") ) } #' @rdname cor_car #' @export cor_icar <- function(W, formula = ~1) { out <- cor_car(W, formula, type = "icar") out$W_name <- deparse(substitute(W)) out } #' (Deprecated) Fixed user-defined covariance matrices #' #' This function is deprecated. Please see \code{\link{fcor}} for the new #' syntax. Define a fixed covariance matrix of the response variable for #' instance to model multivariate effect sizes in meta-analysis. #' #' @aliases cov_fixed #' #' @param V Known covariance matrix of the response variable. #' If a vector is passed, it will be used as diagonal entries #' (variances) and covariances will be set to zero. #' #' @return An object of class \code{cor_fixed}. #' #' @examples #' \dontrun{ #' dat <- data.frame(y = rnorm(3)) #' V <- cbind(c(0.5, 0.3, 0.2), c(0.3, 1, 0.1), c(0.2, 0.1, 0.2)) #' fit <- brm(y~1, data = dat, autocor = cor_fixed(V)) #' } #' #' @export cor_fixed <- function(V) { V_name <- deparse(substitute(V)) if (is.vector(V)) { V <- diag(V) } else { V <- as.matrix(V) } if (!isSymmetric(unname(V))) { stop2("'V' must be symmetric") } structure(nlist(V, V_name), class = c("cor_fixed", "cor_brms")) } #' (Defunct) Basic Bayesian Structural Time Series #' #' The BSTS correlation structure is no longer supported. #' #' @inheritParams cor_arma #' #' @keywords internal #' @export cor_bsts <- function(formula = ~1) { stop2("The BSTS structure is no longer supported.") } #' Check if argument is a correlation structure #' #' Check if argument is one of the correlation structures #' used in \pkg{brms}. #' #' @param x An \R object. #' #' @export is.cor_brms <- function(x) { inherits(x, "cor_brms") } #' @rdname is.cor_brms #' @export is.cor_arma <- function(x) { inherits(x, "cor_arma") } #' @rdname is.cor_brms #' @export is.cor_cosy <- function(x) { inherits(x, "cor_cosy") } #' @rdname is.cor_brms #' @export is.cor_sar <- function(x) { inherits(x, "cor_sar") } #' @rdname is.cor_brms #' @export is.cor_car <- function(x) { inherits(x, "cor_car") } #' @rdname is.cor_brms #' @export is.cor_fixed <- function(x) { inherits(x, "cor_fixed") } #' @export print.cor_empty <- function(x, ...) { cat("empty()\n") } #' @export print.cor_arma <- function(x, ...) { cat(paste0("arma(", formula2str(x$formula), ", ", x$p, ", ", x$q, ")\n")) invisible(x) } #' @export print.cor_cosy <- function(x, ...) { cat(paste0("cosy(", formula2str(x$formula), ")\n")) invisible(x) } #' @export print.cor_sar <- function(x, ...) { cat(paste0("sar(", x$W_name, ", '", x$type, "')\n")) invisible(x) } #' @export print.cor_car <- function(x, ...) { form <- formula2str(x$formula) cat(paste0("car(", x$W_name, ", ", form, ", '", x$type, "')\n")) invisible(x) } #' @export print.cor_fixed <- function(x, ...) { cat("Fixed covariance matrix: \n") print(x$V) invisible(x) } #' @export print.cov_fixed <- function(x, ...) { class(x) <- "cor_fixed" print.cor_fixed(x) } stop_not_cor_brms <- function(x) { if (!(is.null(x) || is.cor_brms(x))) { stop2("Argument 'autocor' must be of class 'cor_brms'.") } TRUE } # empty 'cor_brms' object cor_empty <- function() { structure(list(), class = c("cor_empty", "cor_brms")) } is.cor_empty <- function(x) { inherits(x, "cor_empty") } #' (Deprecated) Extract Autocorrelation Objects #' #' @inheritParams posterior_predict.brmsfit #' @param ... Currently unused. #' #' @return A \code{cor_brms} object or a list of such objects for multivariate #' models. Not supported for models fitted with brms 2.11.1 or higher. #' #' @export autocor.brmsfit <- function(object, resp = NULL, ...) { warning2("Method 'autocor' is deprecated and will be removed in the future.") object <- restructure(object) resp <- validate_resp(resp, object) if (!is.null(resp)) { # multivariate model autocor <- object$autocor[resp] if (length(resp) == 1L) { autocor <- autocor[[1]] } } else { # univariate model autocor <- object$autocor } autocor } #' @rdname autocor.brmsfit #' @export autocor <- function(object, ...) { UseMethod("autocor") } # extract variables for autocorrelation structures # @param autocor object of class 'cor_brms' # @return a list with elements 'time', and 'group' parse_autocor <- function(autocor) { out <- list() formula <- autocor$formula if (is.null(formula)) { formula <- ~1 } if (!is.null(lhs(formula))) { stop2("Autocorrelation formulas must be one-sided.") } formula <- formula2str(formula) time <- as.formula(paste("~", gsub("~|\\|[[:print:]]*", "", formula))) time_vars <- all_vars(time) if (is.cor_car(autocor) && length(time_vars) > 0L) { stop2("The CAR structure should not contain a 'time' variable.") } if (length(time_vars) > 1L) { stop2("Autocorrelation structures may only contain 1 time variable.") } if (length(time_vars)) { out$time <- time_vars } else { out$time <- NA } group <- sub("^\\|*", "", sub("~[^\\|]*", "", formula)) stopif_illegal_group(group) group_vars <- all_vars(group) if (length(group_vars)) { out$group <- paste0(group_vars, collapse = ":") } else { out$group <- NA } out } # transform a 'cor_brms' object into a formula # this ensure compatibility with brms <= 2.11 as_formula_cor_brms <- function(x) { stop_not_cor_brms(x) if (is.cor_empty(x)) { return(NULL) } args <- data2 <- list() pac <- parse_autocor(x) if (is.cor_arma(x)) { fun <- "arma" args$time <- pac$time args$gr <- pac$group args$p <- x$p args$q <- x$q args$cov <- x$cov out <- paste0(names(args), " = ", args, collapse = ", ") out <- paste0("arma(", out, ")") } else if (is.cor_cosy(x)) { fun <- "cosy" args$time <- pac$time args$gr <- pac$group } else if (is.cor_sar(x)) { fun <- "sar" args$M <- make_M_names(x$W_name) args$type <- paste0("'", x$type, "'") data2[[args$M]] <- x$W } else if (is.cor_car(x)) { fun <- "car" args$M <- make_M_names(x$W_name) args$gr <- pac$group args$type <- paste0("'", x$type, "'") data2[[args$M]] <- x$W } else if (is.cor_fixed(x)) { fun <- "fcor" args$M <- make_M_names(x$V_name) data2[[args$M]] <- x$V } out <- paste0(names(args), " = ", args, collapse = ", ") out <- paste0(fun, "(", out, ")") out <- str2formula(out) attr(out, "data2") <- data2 class(out) <- c("cor_brms_formula", "formula") out } # ensures covariance matrix inputs are named reasonably make_M_names <- function(x) { out <- make.names(x) if (!length(out)) { # likely unique random name for the matrix argument out <- paste0("M", collapse(sample(0:9, 5, TRUE))) } out } # get data objects from 'autocor' for use in 'data2' # for backwards compatibility with brms <= 2.11 get_data2_autocor <- function(x, ...) { UseMethod("get_data2_autocor") } #' @export get_data2_autocor.brmsformula <- function(x, ...) { attr(attr(x$formula, "autocor"), "data2") } #' @export get_data2_autocor.mvbrmsformula <- function(x, ...) { ulapply(x$forms, get_data2_autocor, recursive = FALSE) } #' @export print.cor_brms_formula <- function(x, ...) { y <- x attr(y, "data2") <- NULL class(y) <- "formula" print(y) invisible(x) } brms/R/summary.R0000644000176200001440000004330613621510177013247 0ustar liggesusers#' Create a summary of a fitted model represented by a \code{brmsfit} object #' #' @param object An object of class \code{brmsfit} #' @param priors Logical; Indicating if priors should be included #' in the summary. Default is \code{FALSE}. #' @param prob A value between 0 and 1 indicating the desired probability #' to be covered by the uncertainty intervals. The default is 0.95. #' @param mc_se Logical; Indicating if the uncertainty caused by the #' MCMC sampling should be shown in the summary. Defaults to \code{FALSE}. #' @param ... Other potential arguments #' #' @details The convergence diagnostics \code{Rhat}, \code{Bulk_ESS}, and #' \code{Tail_ESS} are described in detail in Vehtari et al. (2019). #' #' @references #' Aki Vehtari, Andrew Gelman, Daniel Simpson, Bob Carpenter, and #' Paul-Christian Bürkner (2019). Rank-normalization, folding, and #' localization: An improved R-hat for assessing convergence of #' MCMC. *arXiv preprint* `arXiv:1903.08008`. #' #' @method summary brmsfit #' @importMethodsFrom rstan summary #' @export summary.brmsfit <- function(object, priors = FALSE, prob = 0.95, mc_se = FALSE, ...) { priors <- as_one_logical(priors) prob <- as_one_numeric(prob) if (prob < 0 || prob > 1) { stop2("'prob' must be a single numeric value in [0, 1].") } mc_se <- as_one_logical(mc_se) if (mc_se) { warning2("Argument 'mc_se' is currently deactivated but ", "will be working again in the future. Sorry!") } object <- restructure(object) bterms <- parse_bf(object$formula) out <- list( formula = object$formula, data.name = object$data.name, group = unique(object$ranef$group), nobs = nobs(object), ngrps = ngrps(object), autocor = object$autocor, prior = empty_prior(), algorithm = algorithm(object) ) class(out) <- "brmssummary" if (!length(object$fit@sim)) { # the model does not contain posterior samples return(out) } out$chains <- object$fit@sim$chains out$iter <- object$fit@sim$iter out$warmup <- object$fit@sim$warmup out$thin <- object$fit@sim$thin stan_args <- object$fit@stan_args[[1]] out$sampler <- paste0(stan_args$method, "(", stan_args$algorithm, ")") if (priors) { out$prior <- prior_summary(object, all = FALSE) } # compute a summary for given set of parameters .summary <- function(object, pars, prob) { # TODO: use rstan::monitor instead once it is clean and stable sims <- as.array(object, pars = pars, fixed = TRUE) parnames <- dimnames(sims)[[3]] probs <- c((1 - prob) / 2, 1 - (1 - prob) / 2) valid <- rep(NA, length(parnames)) out <- named_list(parnames) for (i in seq_along(out)) { sims_i <- sims[, , i] valid[i] <- all(is.finite(sims_i)) quan <- unname(quantile(sims_i, probs = probs)) mean <- mean(sims_i) sd <- sd(sims_i) rhat <- rstan::Rhat(sims_i) ess_bulk <- round(rstan::ess_bulk(sims_i)) ess_tail <- round(rstan::ess_tail(sims_i)) out[[i]] <- c(mean, sd, quan, rhat, ess_bulk, ess_tail) } out <- do_call(rbind, out) CIs <- paste0(c("l-", "u-"), prob * 100, "% CI") # TODO: align column names with summary outputs of other methods colnames(out) <- c( "Estimate", "Est.Error", CIs, "Rhat", "Bulk_ESS", "Tail_ESS" ) rownames(out) <- parnames S <- prod(dim(sims)[1:2]) out[valid & !is.finite(out[, "Rhat"]), "Rhat"] <- 1 out[valid & !is.finite(out[, "Bulk_ESS"]), "Bulk_ESS"] <- S out[valid & !is.finite(out[, "Tail_ESS"]), "Tail_ESS"] <- S return(out) } pars <- parnames(object) # TODO: exclude more parameters? excl_regex <- "^(r|s|zgp|Xme|prior|lp)_" pars <- pars[!grepl(excl_regex, pars)] fit_summary <- .summary(object, pars = pars, prob = prob) if (algorithm(object) == "sampling") { Rhats <- fit_summary[, "Rhat"] if (any(Rhats > 1.05, na.rm = TRUE)) { warning2( "Parts of the model have not converged (some Rhats are > 1.05). ", "Be careful when analysing the results! We recommend running ", "more iterations and/or setting stronger priors." ) } div_trans <- sum(nuts_params(object, pars = "divergent__")$Value) adapt_delta <- control_params(object)$adapt_delta if (div_trans > 0) { warning2( "There were ", div_trans, " divergent transitions after warmup. ", "Increasing adapt_delta above ", adapt_delta, " may help. See ", "http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup" ) } } # summary of population-level effects fe_pars <- pars[grepl(fixef_pars(), pars)] out$fixed <- fit_summary[fe_pars, , drop = FALSE] rownames(out$fixed) <- gsub(fixef_pars(), "", fe_pars) # summary of family specific parameters spec_pars <- c(valid_dpars(object), "delta") spec_pars <- paste0(spec_pars, collapse = "|") spec_pars <- paste0("^(", spec_pars, ")($|_)") spec_pars <- pars[grepl(spec_pars, pars)] out$spec_pars <- fit_summary[spec_pars, , drop = FALSE] # summary of residual correlations rescor_pars <- pars[grepl("^rescor_", pars)] if (length(rescor_pars)) { out$rescor_pars <- fit_summary[rescor_pars, , drop = FALSE] rescor_pars <- sub("__", ",", sub("__", "(", rescor_pars)) rownames(out$rescor_pars) <- paste0(rescor_pars, ")") } # summary of autocorrelation effects cor_pars <- pars[grepl(regex_autocor_pars(), pars)] out$cor_pars <- fit_summary[cor_pars, , drop = FALSE] rownames(out$cor_pars) <- cor_pars # summary of group-level effects for (g in out$group) { gregex <- escape_dot(g) sd_prefix <- paste0("^sd_", gregex, "__") sd_pars <- pars[grepl(sd_prefix, pars)] cor_prefix <- paste0("^cor_", gregex, "__") cor_pars <- pars[grepl(cor_prefix, pars)] df_prefix <- paste0("^df_", gregex, "$") df_pars <- pars[grepl(df_prefix, pars)] gpars <- c(df_pars, sd_pars, cor_pars) out$random[[g]] <- fit_summary[gpars, , drop = FALSE] if (has_rows(out$random[[g]])) { sd_names <- sub(sd_prefix, "sd(", sd_pars) cor_names <- sub(cor_prefix, "cor(", cor_pars) cor_names <- sub("__", ",", cor_names) df_names <- sub(df_prefix, "df", df_pars) gnames <- c(df_names, paste0(c(sd_names, cor_names), ")")) rownames(out$random[[g]]) <- gnames } } # summary of smooths sm_pars <- pars[grepl("^sds_", pars)] if (length(sm_pars)) { out$splines <- fit_summary[sm_pars, , drop = FALSE] rownames(out$splines) <- paste0(gsub("^sds_", "sds(", sm_pars), ")") } # summary of monotonic parameters mo_pars <- pars[grepl("^simo_", pars)] if (length(mo_pars)) { out$mo <- fit_summary[mo_pars, , drop = FALSE] rownames(out$mo) <- gsub("^simo_", "", mo_pars) } # summary of gaussian processes gp_pars <- pars[grepl("^(sdgp|lscale)_", pars)] if (length(gp_pars)) { out$gp <- fit_summary[gp_pars, , drop = FALSE] rownames(out$gp) <- gsub("^sdgp_", "sdgp(", rownames(out$gp)) rownames(out$gp) <- gsub("^lscale_", "lscale(", rownames(out$gp)) rownames(out$gp) <- paste0(rownames(out$gp), ")") } out } #' Print a summary for a fitted model represented by a \code{brmsfit} object #' #' @aliases print.brmssummary #' #' @param x An object of class \code{brmsfit} #' @param digits The number of significant digits for printing out the summary; #' defaults to 2. The effective sample size is always rounded to integers. #' @param ... Additional arguments that would be passed #' to method \code{summary} of \code{brmsfit}. #' #' @seealso \code{\link{summary.brmsfit}} #' #' @export print.brmsfit <- function(x, digits = 2, ...) { print(summary(x, ...), digits = digits, ...) } #' @export print.brmssummary <- function(x, digits = 2, ...) { cat(" Family: ") cat(summarise_families(x$formula), "\n") cat(" Links: ") cat(summarise_links(x$formula, wsp = 9), "\n") cat("Formula: ") print(x$formula, wsp = 9) cat(paste0( " Data: ", x$data.name, " (Number of observations: ", x$nobs, ") \n" )) if (!isTRUE(nzchar(x$sampler))) { cat("\nThe model does not contain posterior samples.\n") } else { final_samples <- ceiling((x$iter - x$warmup) / x$thin * x$chains) cat(paste0( "Samples: ", x$chains, " chains, each with iter = ", x$iter, "; warmup = ", x$warmup, "; thin = ", x$thin, ";\n", " total post-warmup samples = ", final_samples, "\n\n" )) if (nrow(x$prior)) { cat("Priors: \n") print(x$prior, show_df = FALSE) cat("\n") } if (length(x$splines)) { cat("Smooth Terms: \n") print_format(x$splines, digits) cat("\n") } if (length(x$gp)) { cat("Gaussian Process Terms: \n") print_format(x$gp, digits) cat("\n") } if (nrow(x$cor_pars)) { cat("Correlation Structures:\n") # TODO: better printing for correlation structures? print_format(x$cor_pars, digits) cat("\n") } if (length(x$random)) { cat("Group-Level Effects: \n") for (i in seq_along(x$random)) { g <- names(x$random)[i] cat(paste0("~", g, " (Number of levels: ", x$ngrps[[g]], ") \n")) print_format(x$random[[g]], digits) cat("\n") } } if (nrow(x$fixed)) { cat("Population-Level Effects: \n") print_format(x$fixed, digits) cat("\n") } if (length(x$mo)) { cat("Simplex Parameters: \n") print_format(x$mo, digits) cat("\n") } if (nrow(x$spec_pars)) { cat("Family Specific Parameters: \n") print_format(x$spec_pars, digits) cat("\n") } if (length(x$rescor_pars)) { cat("Residual Correlations: \n") print_format(x$rescor, digits) cat("\n") } cat(paste0("Samples were drawn using ", x$sampler, ". ")) if (x$algorithm == "sampling") { cat(paste0( "For each parameter, Bulk_ESS\n", "and Tail_ESS are effective sample size measures, ", "and Rhat is the potential\n", "scale reduction factor on split chains ", "(at convergence, Rhat = 1)." )) } cat("\n") } invisible(x) } # helper function to print summary matrices in nice format # also displays -0.00 as a result of round negative values to zero (#263) # @param x object to be printed; coerced to matrix # @param digits number of digits to show # @param no_digits names of columns for which no digits should be shown print_format <- function(x, digits = 2, no_digits = c("Bulk_ESS", "Tail_ESS")) { x <- as.matrix(x) digits <- as.numeric(digits) if (length(digits) != 1L) { stop2("'digits' should be a single numeric value.") } out <- x fmt <- paste0("%.", digits, "f") for (i in seq_cols(x)) { if (isTRUE(colnames(x)[i] %in% no_digits)) { out[, i] <- sprintf("%.0f", x[, i]) } else { out[, i] <- sprintf(fmt, x[, i]) } } print(out, quote = FALSE, right = TRUE) invisible(x) } # regex to extract population-level coefficients fixef_pars <- function() { types <- c("", "s", "cs", "sp", "mo", "me", "mi", "m") types <- paste0("(", types, ")", collapse = "|") paste0("^b(", types, ")_") } # algorithm used in the model fitting algorithm <- function(x) { stopifnot(is.brmsfit(x)) if (is.null(x$algorithm)) "sampling" else x$algorithm } #' Summarize Posterior Samples #' #' Summarizes posterior samples based on point estimates (mean or median), #' estimation errors (SD or MAD) and quantiles. #' #' @param x An \R object. #' @param probs The percentiles to be computed by the #' \code{quantile} function. #' @param robust If \code{FALSE} (the default) the mean is used as #' the measure of central tendency and the standard deviation as #' the measure of variability. If \code{TRUE}, the median and the #' median absolute deviation (MAD) are applied instead. #' @param ... More arguments passed to or from other methods. #' @inheritParams posterior_samples #' #' @return A matrix where rows indicate parameters #' and columns indicate the summary estimates. #' #' @examples #' \dontrun{ #' fit <- brm(time ~ age * sex, data = kidney) #' posterior_summary(fit) #' } #' #' @export posterior_summary <- function(x, ...) { UseMethod("posterior_summary") } #' @rdname posterior_summary #' @export posterior_summary.default <- function(x, probs = c(0.025, 0.975), robust = FALSE, ...) { if (!length(x)) { stop2("No posterior samples supplied.") } if (robust) { coefs <- c("median", "mad", "quantile") } else { coefs <- c("mean", "sd", "quantile") } .posterior_summary <- function(x) { do_call(cbind, lapply( coefs, get_estimate, samples = x, probs = probs, na.rm = TRUE )) } if (length(dim(x)) <= 2L) { # data.frames cause trouble in as.array x <- as.matrix(x) } else { x <- as.array(x) } if (length(dim(x)) == 2L) { out <- .posterior_summary(x) rownames(out) <- colnames(x) } else if (length(dim(x)) == 3L) { out <- lapply(array2list(x), .posterior_summary) out <- abind(out, along = 3) dnx <- dimnames(x) dimnames(out) <- list(dnx[[2]], dimnames(out)[[2]], dnx[[3]]) } else { stop("'x' must be of dimension 2 or 3.") } colnames(out) <- c("Estimate", "Est.Error", paste0("Q", probs * 100)) out } #' @rdname posterior_summary #' @export posterior_summary.brmsfit <- function(x, pars = NA, probs = c(0.025, 0.975), robust = FALSE, ...) { out <- as.matrix(x, pars = pars, ...) posterior_summary(out, probs = probs, robust = robust, ...) } # calculate estimates over posterior samples # @param coef coefficient to be applied on the samples (e.g., "mean") # @param samples the samples over which to apply coef # @param margin see 'apply' # @param ... additional arguments passed to get(coef) # @return typically a matrix with colnames(samples) as colnames get_estimate <- function(coef, samples, margin = 2, ...) { dots <- list(...) args <- list(X = samples, MARGIN = margin, FUN = coef) fun_args <- names(formals(coef)) if (!"..." %in% fun_args) { dots <- dots[names(dots) %in% fun_args] } x <- do_call(apply, c(args, dots)) if (is.null(dim(x))) { x <- matrix(x, dimnames = list(NULL, coef)) } else if (coef == "quantile") { x <- aperm(x, length(dim(x)):1) } x } #' Table Creation for Posterior Samples #' #' Create a table for unique values of posterior samples. #' This is usually only useful when summarizing predictions #' of ordinal models. #' #' @param x A matrix of posterior samples where rows #' indicate samples and columns indicate parameters. #' @param levels Optional values of possible posterior values. #' Defaults to all unique values in \code{x}. #' #' @return A matrix where rows indicate parameters #' and columns indicate the unique values of #' posterior samples. #' #' @examples #' \dontrun{ #' fit <- brm(rating ~ period + carry + treat, #' data = inhaler, family = cumulative()) #' pr <- predict(fit, summary = FALSE) #' posterior_table(pr) #' } #' #' @export posterior_table <- function(x, levels = NULL) { x <- as.matrix(x) if (anyNA(x)) { warning2("NAs will be ignored in 'posterior_table'.") } if (is.null(levels)) { levels <- sort(unique(as.vector(x))) } xlevels <- attr(x, "levels") if (length(xlevels) != length(levels)) { xlevels <- levels } out <- lapply(seq_len(ncol(x)), function(n) table(factor(x[, n], levels = levels)) ) out <- do_call(rbind, out) # compute relative frequencies out <- out / rowSums(out) rownames(out) <- colnames(x) colnames(out) <- paste0("P(Y = ", xlevels, ")") out } #' Compute posterior uncertainty intervals #' #' Compute posterior uncertainty intervals for \code{brmsfit} objects. #' #' @inheritParams summary.brmsfit #' @param pars Names of parameters for which posterior samples should be #' returned, as given by a character vector or regular expressions. #' By default, all posterior samples of all parameters are extracted. #' @param ... More arguments passed to #' \code{\link[brms:as.matrix.brmsfit]{as.matrix.brmsfit}}. #' #' @return A \code{matrix} with lower and upper interval bounds #' as columns and as many rows as selected parameters. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt, #' data = epilepsy, family = negbinomial()) #' posterior_interval(fit) #' } #' #' @aliases posterior_interval #' @method posterior_interval brmsfit #' @export #' @export posterior_interval #' @importFrom rstantools posterior_interval posterior_interval.brmsfit <- function( object, pars = NA, prob = 0.95, ... ) { ps <- as.matrix(object, pars = pars, ...) rstantools::posterior_interval(ps, prob = prob) } #' Extract Priors of a Bayesian Model Fitted with \pkg{brms} #' #' @aliases prior_summary #' #' @param object A \code{brmsfit} object #' @param all Logical; Show all parameters in the model which may have #' priors (\code{TRUE}) or only those with proper priors (\code{FALSE})? #' @param ... Further arguments passed to or from other methods. #' #' @return For \code{brmsfit} objects, an object of class \code{brmsprior}. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt #' + (1|patient) + (1|obs), #' data = epilepsy, family = poisson(), #' prior = c(prior(student_t(5,0,10), class = b), #' prior(cauchy(0,2), class = sd))) #' #' prior_summary(fit) #' prior_summary(fit, all = FALSE) #' print(prior_summary(fit, all = FALSE), show_df = FALSE) #' } #' #' @method prior_summary brmsfit #' @export #' @export prior_summary #' @importFrom rstantools prior_summary prior_summary.brmsfit <- function(object, all = TRUE, ...) { object <- restructure(object) prior <- object$prior if (!all) { prior <- prior[nzchar(prior$prior), ] } prior } brms/R/plot.R0000644000176200001440000002314013606326626012531 0ustar liggesusers#' Trace and Density Plots for MCMC Samples #' #' @param x An object of class \code{brmsfit}. #' @param pars Names of the parameters to plot, as given by a character vector #' or a regular expression. By default, all parameters except #' for group-level and smooth effects are plotted. #' @param combo A character vector with at least two elements. #' Each element of \code{combo} corresponds to a column in the resulting #' graphic and should be the name of one of the available #' \code{\link[bayesplot:MCMC-overview]{MCMC}} functions #' (omitting the \code{mcmc_} prefix). #' @param N The number of parameters plotted per page. #' @param theme A \code{\link[ggplot2:theme]{theme}} object #' modifying the appearance of the plots. #' For some basic themes see \code{\link[ggplot2:ggtheme]{ggtheme}} #' and \code{\link[bayesplot:theme_default]{theme_default}}. #' @param fixed Indicates whether parameter names #' should be matched exactly (\code{TRUE}) or treated as #' regular expressions (\code{FALSE}). Default is \code{FALSE}. #' @param exact_match Deprecated alias of argument \code{fixed}. #' @param plot Logical; indicates if plots should be #' plotted directly in the active graphic device. #' Defaults to \code{TRUE}. #' @param ask Logical; indicates if the user is prompted #' before a new page is plotted. #' Only used if \code{plot} is \code{TRUE}. #' @param newpage Logical; indicates if the first set of plots #' should be plotted to a new page. #' Only used if \code{plot} is \code{TRUE}. #' @param ... Further arguments passed to #' \code{\link[bayesplot:mcmc_combo]{mcmc_combo}}. #' #' @return An invisible list of #' \code{\link[gtable:gtable]{gtable}} objects. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt #' + (1|patient) + (1|visit), #' data = epilepsy, family = "poisson") #' plot(fit) #' ## plot population-level effects only #' plot(fit, pars = "^b_") #' } #' #' @method plot brmsfit #' @import ggplot2 #' @importFrom graphics plot #' @importFrom grDevices devAskNewPage #' @export plot.brmsfit <- function(x, pars = NA, combo = c("dens", "trace"), N = 5, fixed = FALSE, exact_match = FALSE, theme = NULL, plot = TRUE, ask = TRUE, newpage = TRUE, ...) { contains_samples(x) if (!is_wholenumber(N) || N < 1) { stop2("Argument 'N' must be a positive integer.") } fixed <- check_deprecated_fixed(fixed, exact_match) if (!is.character(pars)) { pars <- default_plot_pars(x) fixed <- FALSE } samples <- posterior_samples(x, pars, add_chain = TRUE, fixed = fixed) pars <- names(samples)[!names(samples) %in% c("chain", "iter")] if (!length(pars)) { stop2("No valid parameters selected.") } if (plot) { default_ask <- devAskNewPage() on.exit(devAskNewPage(default_ask)) devAskNewPage(ask = FALSE) } n_plots <- ceiling(length(pars) / N) plots <- vector(mode = "list", length = n_plots) for (i in seq_len(n_plots)) { sub_pars <- pars[((i - 1) * N + 1):min(i * N, length(pars))] sub_samples <- samples[, c(sub_pars, "chain"), drop = FALSE] plots[[i]] <- bayesplot::mcmc_combo( sub_samples, combo = combo, gg_theme = theme, ... ) if (plot) { plot(plots[[i]], newpage = newpage || i > 1) if (i == 1) { devAskNewPage(ask = ask) } } } invisible(plots) } # list all parameter classes to be included in plots by default default_plot_pars <- function(family) { c(fixef_pars(), "^sd_", "^cor_", "^sigma_", "^rescor_", paste0("^", valid_dpars(family), "$"), "^delta$", "^theta", "^ar", "^ma", "^arr", "^sderr", "^lagsar", "^errorsar", "^car", "^sdcar", "^sds_", "^sdgp_", "^lscale_") } #' MCMC Plots Implemented in \pkg{bayesplot} #' #' Convenient way to call MCMC plotting functions #' implemented in the \pkg{bayesplot} package. #' #' @aliases stanplot stanplot.brmsfit #' #' @inheritParams plot.brmsfit #' @param object An \R object typically of class \code{brmsfit} #' @param pars Names of parameters to be plotted, #' as given by a character vector or regular expressions. #' By default, all parameters except for group-level and #' smooth effects are plotted. May be ignored for some plots. #' @param type The type of the plot. #' Supported types are (as names) \code{hist}, \code{dens}, #' \code{hist_by_chain}, \code{dens_overlay}, #' \code{violin}, \code{intervals}, \code{areas}, \code{acf}, #' \code{acf_bar},\code{trace}, \code{trace_highlight}, \code{scatter}, #' \code{rhat}, \code{rhat_hist}, \code{neff}, \code{neff_hist} #' \code{nuts_acceptance}, \code{nuts_divergence}, #' \code{nuts_stepsize}, \code{nuts_treedepth}, and \code{nuts_energy}. #' For an overview on the various plot types see #' \code{\link[bayesplot:MCMC-overview]{MCMC-overview}}. #' @param ... Additional arguments passed to the plotting functions. #' See \code{\link[bayesplot:MCMC-overview]{MCMC-overview}} for #' more details. #' #' @return A \code{\link[ggplot2:ggplot]{ggplot}} object #' that can be further customized using the \pkg{ggplot2} package. #' #' @details #' Also consider using the \pkg{shinystan} package available via #' method \code{\link{launch_shinystan}} in \pkg{brms} for flexible #' and interactive visual analysis. #' #' @examples #' \dontrun{ #' model <- brm(count ~ zAge + zBase * Trt + (1|patient), #' data = epilepsy, family = "poisson") #' #' # plot posterior intervals #' mcmc_plot(model) #' #' # only show population-level effects in the plots #' mcmc_plot(model, pars = "^b_") #' #' # show histograms of the posterior distributions #' mcmc_plot(model, type = "hist") #' #' # plot some diagnostics of the sampler #' mcmc_plot(model, type = "neff") #' mcmc_plot(model, type = "rhat") #' #' # plot some diagnostics specific to the NUTS sampler #' mcmc_plot(model, type = "nuts_acceptance") #' mcmc_plot(model, type = "nuts_divergence") #' } #' #' @export mcmc_plot.brmsfit <- function(object, pars = NA, type = "intervals", fixed = FALSE, exact_match = FALSE, ...) { contains_samples(object) object <- restructure(object) type <- as_one_character(type) fixed <- check_deprecated_fixed(fixed, exact_match) if (!is.character(pars)) { pars <- default_plot_pars(object) fixed <- FALSE } valid_types <- as.character(bayesplot::available_mcmc("")) valid_types <- sub("^mcmc_", "", valid_types) if (!type %in% valid_types) { stop2("Invalid plot type. Valid plot types are: \n", collapse_comma(valid_types)) } mcmc_fun <- get(paste0("mcmc_", type), asNamespace("bayesplot")) mcmc_arg_names <- names(formals(mcmc_fun)) mcmc_args <- list(...) if ("x" %in% mcmc_arg_names) { if (grepl("^nuts_", type)) { # x refers to a molten data.frame of NUTS parameters mcmc_args$x <- nuts_params(object) } else { # x refers to a data.frame of samples samples <- posterior_samples(object, pars, add_chain = TRUE, fixed = fixed) if (!length(samples)) { stop2("No valid parameters selected.") } samples$iter <- NULL sel_pars <- names(samples)[!names(samples) %in% "chain"] if (type %in% c("scatter", "hex") && length(sel_pars) != 2L) { stop2("Exactly 2 parameters must be selected for this type.", "\nParameters selected: ", collapse_comma(sel_pars)) } mcmc_args$x <- samples } } if ("lp" %in% mcmc_arg_names) { mcmc_args$lp <- log_posterior(object) } use_nuts <- isTRUE(object$algorithm == "sampling") if ("np" %in% mcmc_arg_names && use_nuts) { mcmc_args$np <- nuts_params(object) } interval_type <- type %in% c("intervals", "areas") if ("rhat" %in% mcmc_arg_names && !interval_type) { mcmc_args$rhat <- rhat(object) } if ("ratio" %in% mcmc_arg_names) { mcmc_args$ratio <- neff_ratio(object) } do_call(mcmc_fun, mcmc_args) } #' @rdname mcmc_plot.brmsfit #' @export mcmc_plot <- function(object, ...) { UseMethod("mcmc_plot") } # 'stanplot' has been deprecated in brms 2.10.6; remove in brms 3.0 #' @export stanplot <- function(object, ...) { UseMethod("stanplot") } #' @export stanplot.brmsfit <- function(object, ...) { warning2("Method 'stanplot' is deprecated. Please use 'mcmc_plot' instead.") mcmc_plot.brmsfit(object, ...) } #' Create a matrix of output plots from a \code{brmsfit} object #' #' A \code{\link[graphics:pairs]{pairs}} #' method that is customized for MCMC output. #' #' @param x An object of class \code{brmsfit} #' @inheritParams plot.brmsfit #' @param ... Further arguments to be passed to #' \code{\link[bayesplot:mcmc_pairs]{mcmc_pairs}}. #' #' @details For a detailed description see #' \code{\link[bayesplot:mcmc_pairs]{mcmc_pairs}}. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt #' + (1|patient) + (1|visit), #' data = epilepsy, family = "poisson") #' pairs(fit, pars = parnames(fit)[1:3], fixed = TRUE) #' pairs(fit, pars = "^sd_") #' } #' #' @export pairs.brmsfit <- function(x, pars = NA, fixed = FALSE, exact_match = FALSE, ...) { fixed <- check_deprecated_fixed(fixed, exact_match) if (!is.character(pars)) { pars <- default_plot_pars(x) fixed <- FALSE } samples <- posterior_samples(x, pars, add_chain = TRUE, fixed = fixed) samples$iter <- NULL bayesplot::mcmc_pairs(samples, ...) } brms/R/predictor.R0000644000176200001440000004002013623751603013536 0ustar liggesusers# compute predictor terms predictor <- function(draws, ...) { UseMethod("predictor") } # compute linear/additive predictor terms # @param draws a list generated by extract_draws containing # all required data and posterior samples # @param i An optional vector indicating the observation(s) # for which to compute eta. If NULL, eta is computed # for all all observations at once. # @param fdraws Optional full brmsdraws object of the model. # Currently only needed in non-linear models or for # predicting new data in models with autocorrelation. # @return Usually an S x N matrix where S is the number of samples # and N is the number of observations or length of i if specified. #' @export predictor.bdrawsl <- function(draws, i = NULL, fdraws = NULL, ...) { nobs <- ifelse(!is.null(i), length(i), draws$nobs) eta <- matrix(0, nrow = draws$nsamples, ncol = nobs) + predictor_fe(draws, i) + predictor_re(draws, i) + predictor_sp(draws, i) + predictor_sm(draws, i) + predictor_gp(draws, i) + predictor_offset(draws, i, nobs) # some autocorrelation structures depend on eta eta <- predictor_ac(eta, draws, i, fdraws = fdraws) # intentionally last as it may return 3D arrays eta <- predictor_cs(eta, draws, i) unname(eta) } # compute non-linear predictor terms # @param draws a list generated by extract_draws containing # all required data and posterior samples # @param i An optional vector indicating the observation(s) # for which to compute eta. If NULL, eta is computed # for all all observations at once. # @param ... further arguments passed to predictor.bdrawsl # @return Usually an S x N matrix where S is the number of samples # and N is the number of observations or length of i if specified. #' @export predictor.bdrawsnl <- function(draws, i = NULL, fdraws = NULL, ...) { stopifnot(!is.null(fdraws)) nlpars <- draws$used_nlpars covars <- names(draws$C) args <- named_list(c(nlpars, covars)) for (nlp in nlpars) { args[[nlp]] <- get_nlpar(fdraws, nlpar = nlp, i = i, ...) } for (cov in covars) { args[[cov]] <- p(draws$C[[cov]], i, row = FALSE) } # evaluate non-linear predictor eta <- try(eval(draws$nlform, args), silent = TRUE) if (is(eta, "try-error")) { if (grepl("could not find function", eta)) { eta <- rename(eta, "Error in eval(expr, envir, enclos) : ", "") message( eta, " Most likely this is because you used a Stan ", "function in the non-linear model formula that ", "is not defined in R. If this is a user-defined function, ", "please run 'expose_functions(., vectorize = TRUE)' on ", "your fitted model and try again." ) } else { eta <- rename(eta, "^Error :", "", fixed = FALSE) stop2(eta) } } dim(eta) <- dim(rmNULL(args)[[1]]) unname(eta) } # compute eta for overall effects predictor_fe <- function(draws, i) { fe <- draws[["fe"]] if (!isTRUE(ncol(fe[["X"]]) > 0)) { return(0) } eta <- try(.predictor_fe(X = p(fe[["X"]], i), b = fe[["b"]])) if (is(eta, "try-error")) { stop2( "Something went wrong (see the error message above). ", "Perhaps you transformed numeric variables ", "to factors or vice versa within the model formula? ", "If yes, please convert your variables beforehand. ", "Or did you set a predictor variable to NA?" ) } eta } # workhorse function of predictor_fe # @param X fixed effects design matrix # @param b samples of fixed effects coeffients .predictor_fe <- function(X, b) { stopifnot(is.matrix(X)) stopifnot(is.matrix(b)) tcrossprod(b, X) } # compute eta for varying effects predictor_re <- function(draws, i) { eta <- 0 re <- draws[["re"]] group <- names(re[["r"]]) for (g in group) { eta_g <- try(.predictor_re(Z = p(re[["Z"]][[g]], i), r = re[["r"]][[g]])) if (is(eta_g, "try-error")) { stop2( "Something went wrong (see the error message above). ", "Perhaps you transformed numeric variables ", "to factors or vice versa within the model formula? ", "If yes, please convert your variables beforehand. ", "Or did you use a grouping factor also for a different purpose? ", "If yes, please make sure that its factor levels are correct ", "also in the new data you may have provided." ) } eta <- eta + eta_g } eta } # workhorse function of predictor_re # @param Z sparse random effects design matrix # @param r random effects samples # @return linear predictor for random effects .predictor_re <- function(Z, r) { Matrix::as.matrix(Matrix::tcrossprod(r, Z)) } # compute eta for special effects terms predictor_sp <- function(draws, i) { eta <- 0 sp <- draws[["sp"]] if (!length(sp)) { return(eta) } eval_list <- list() for (j in seq_along(sp[["simo"]])) { eval_list[[paste0("Xmo_", j)]] <- p(sp[["Xmo"]][[j]], i) eval_list[[paste0("simo_", j)]] <- sp[["simo"]][[j]] } for (j in seq_along(sp[["Xme"]])) { eval_list[[paste0("Xme_", j)]] <- p(sp[["Xme"]][[j]], i, row = FALSE) } for (j in seq_along(sp[["Yl"]])) { eval_list[[names(sp[["Yl"]])[j]]] <- p(sp[["Yl"]][[j]], i, row = FALSE) } for (j in seq_along(sp[["Csp"]])) { eval_list[[paste0("Csp_", j)]] <- p(sp[["Csp"]][[j]], i, row = FALSE) } re <- draws[["re"]] coef <- colnames(sp[["bsp"]]) for (j in seq_along(coef)) { # prepare special group-level effects rsp <- named_list(names(re[["rsp"]][[coef[j]]])) for (g in names(rsp)) { rsp[[g]] <- .predictor_re( Z = p(re[["Zsp"]][[g]], i), r = re[["rsp"]][[coef[j]]][[g]] ) } eta <- eta + .predictor_sp( eval_list, call = sp[["calls"]][[j]], b = sp[["bsp"]][, j], r = Reduce("+", rsp) ) } eta } # workhorse function of predictor_sp # @param call expression for evaluation of special effects # @param eval_list list containing variables for 'call' # @param b special effects coefficients samples # @param r matrix with special effects group-level samples .predictor_sp <- function(eval_list, call, b, r = NULL) { b <- as.vector(b) if (is.null(r)) r <- 0 (b + r) * eval(call, eval_list) } # R implementation of the user defined Stan function 'mo' # @param simplex posterior samples of a simplex parameter vector # @param X variable modeled as monotonic .mo <- function(simplex, X) { stopifnot(is.matrix(simplex), is.atomic(X)) D <- NCOL(simplex) simplex <- cbind(0, simplex) for (i in seq_cols(simplex)[-1]) { # compute the cumulative representation of the simplex simplex[, i] <- simplex[, i] + simplex[, i - 1] } D * simplex[, X + 1] } # compute eta for smooth terms predictor_sm <- function(draws, i) { eta <- 0 if (!length(draws[["sm"]])) { return(eta) } fe <- draws[["sm"]]$fe if (length(fe)) { eta <- eta + .predictor_fe(X = p(fe$Xs, i), b = fe$bs) } re <- draws[["sm"]]$re for (k in seq_along(re)) { for (j in seq_along(re[[k]]$s)) { Zs <- p(re[[k]]$Zs[[j]], i) s <- re[[k]]$s[[j]] eta <- eta + .predictor_fe(X = Zs, b = s) } } eta } # compute eta for gaussian processes predictor_gp <- function(draws, i) { if (!length(draws[["gp"]])) { return(0) } if (!is.null(i)) { stop2("Pointwise evaluation is not supported for Gaussian processes.") } eta <- matrix(0, nrow = draws$nsamples, ncol = draws$nobs) for (k in seq_along(draws[["gp"]])) { gp <- draws[["gp"]][[k]] if (isTRUE(attr(gp, "byfac"))) { # categorical 'by' variable for (j in seq_along(gp)) { if (length(gp[[j]][["Igp"]])) { eta[, gp[[j]][["Igp"]]] <- .predictor_gp(gp[[j]]) } } } else { eta <- eta + .predictor_gp(gp) } } eta } # workhorse function of predictor_gp # @param gp an list returned by '.extract_draws_gp' # @return A S x N matrix to be added to the linear predictor # @note does not work with pointwise evaluation .predictor_gp <- function(gp) { if (is.null(gp[["slambda"]])) { # predictions for exact GPs nsamples <- length(gp[["sdgp"]]) eta <- as.list(rep(NA, nsamples)) if (!is.null(gp[["x_new"]])) { for (i in seq_along(eta)) { eta[[i]] <- with(gp, .predictor_gp_new( x_new = x_new, yL = yL[i, ], x = x, sdgp = sdgp[i], lscale = lscale[i, ], nug = nug )) } } else { for (i in seq_along(eta)) { eta[[i]] <- with(gp, .predictor_gp_old( x = x, sdgp = sdgp[i], lscale = lscale[i, ], zgp = zgp[i, ], nug = nug )) } } eta <- do_call(rbind, eta) } else { # predictions for approximate GPs eta <- with(gp, .predictor_gpa( x = x, sdgp = sdgp, lscale = lscale, zgp = zgp, slambda = slambda )) } if (!is.null(gp[["Cgp"]])) { eta <- eta * as_draws_matrix(gp[["Cgp"]], dim = dim(eta)) } if (!is.null(gp[["Jgp"]])) { eta <- eta[, gp[["Jgp"]], drop = FALSE] } eta } # make exact GP predictions for old data points # vectorized over posterior samples # @param x old predictor values # @param sdgp sample of parameter sdgp # @param lscale sample of parameter lscale # @param zgp samples of parameter vector zgp # @param nug very small positive value to ensure numerical stability .predictor_gp_old <- function(x, sdgp, lscale, zgp, nug) { Sigma <- cov_exp_quad(x, sdgp = sdgp, lscale = lscale) lx <- nrow(x) Sigma <- Sigma + diag(rep(nug, lx), lx, lx) L_Sigma <- try_nug(t(chol(Sigma)), nug = nug) as.numeric(L_Sigma %*% zgp) } # make exact GP predictions for new data points # vectorized over posterior samples # @param x_new new predictor values # @param yL linear predictor of the old data # @param x old predictor values # @param sdgp sample of parameter sdgp # @param lscale sample of parameter lscale # @param nug very small positive value to ensure numerical stability .predictor_gp_new <- function(x_new, yL, x, sdgp, lscale, nug) { Sigma <- cov_exp_quad(x, sdgp = sdgp, lscale = lscale) lx <- nrow(x) lx_new <- nrow(x_new) Sigma <- Sigma + diag(rep(nug, lx), lx, lx) L_Sigma <- try_nug(t(chol(Sigma)), nug = nug) L_Sigma_inverse <- solve(L_Sigma) K_div_yL <- L_Sigma_inverse %*% yL K_div_yL <- t(t(K_div_yL) %*% L_Sigma_inverse) k_x_x_new <- cov_exp_quad(x, x_new, sdgp = sdgp, lscale = lscale) mu_yL_new <- as.numeric(t(k_x_x_new) %*% K_div_yL) v_new <- L_Sigma_inverse %*% k_x_x_new cov_yL_new <- cov_exp_quad(x_new, sdgp = sdgp, lscale = lscale) - t(v_new) %*% v_new + diag(rep(nug, lx_new), lx_new, lx_new) yL_new <- try_nug( rmulti_normal(1, mu = mu_yL_new, Sigma = cov_yL_new), nug = nug ) return(yL_new) } # make predictions for approximate GPs # vectorized over posterior samples # @param x matrix of evaluated eigenfunctions of the cov matrix # @param sdgp sample of parameter sdgp # @param lscale sample of parameter lscale # @param zgp samples of parameter vector zgp # @param slambda vector of eigenvalues of the cov matrix # @note no need to differentiate between old and new data points .predictor_gpa <- function(x, sdgp, lscale, zgp, slambda) { spd <- sqrt(spd_cov_exp_quad(slambda, sdgp, lscale)) (spd * zgp) %*% t(x) } # compute eta for category specific effects # @param predictor matrix of other additive terms # @return 3D predictor array in the presence of 'cs' effects # otherwise return 'eta' unchanged predictor_cs <- function(eta, draws, i) { cs <- draws[["cs"]] re <- draws[["re"]] if (!length(cs[["bcs"]]) && !length(re[["rcs"]])) { return(eta) } nthres <- cs[["nthres"]] rcs <- NULL if (!is.null(re[["rcs"]])) { groups <- names(re[["rcs"]]) rcs <- vector("list", nthres) for (k in seq_along(rcs)) { rcs[[k]] <- named_list(groups) for (g in groups) { rcs[[k]][[g]] <- .predictor_re( Z = p(re[["Zcs"]][[g]], i), r = re[["rcs"]][[g]][[k]] ) } rcs[[k]] <- Reduce("+", rcs[[k]]) } } .predictor_cs( eta, X = p(cs[["Xcs"]], i), b = cs[["bcs"]], nthres = nthres, r = rcs ) } # workhorse function of predictor_cs # @param X category specific design matrix # @param b category specific effects samples # @param nthres number of thresholds # @param eta linear predictor matrix # @param r list of samples of cs group-level effects # @return 3D predictor array including category specific effects .predictor_cs <- function(eta, X, b, nthres, r = NULL) { stopifnot(is.null(X) && is.null(b) || is.matrix(X) && is.matrix(b)) nthres <- max(nthres) eta <- predictor_expand(eta, nthres) if (!is.null(X)) { I <- seq(1, (nthres) * ncol(X), nthres) - 1 X <- t(X) } for (k in seq_len(nthres)) { if (!is.null(X)) { eta[, , k] <- eta[, , k] + b[, I + k, drop = FALSE] %*% X } if (!is.null(r[[k]])) { eta[, , k] <- eta[, , k] + r[[k]] } } eta } # expand dimension of the predictor matrix to a 3D array predictor_expand <- function(eta, nthres) { if (length(dim(eta)) == 2L) { eta <- array(eta, dim = c(dim(eta), nthres)) } eta } predictor_offset <- function(draws, i, nobs) { if (is.null(draws$offset)) { return(0) } eta <- rep(p(draws$offset, i), draws$nsamples) matrix(eta, ncol = nobs, byrow = TRUE) } # compute eta for autocorrelation structures # @note eta has to be passed to this function in # order for ARMA structures to work correctly predictor_ac <- function(eta, draws, i, fdraws = NULL) { if (has_ac_class(draws$ac$acef, "arma")) { if (!is.null(draws$ac$err)) { # ARMA correlations via latent residuals eta <- eta + p(draws$ac$err, i, row = FALSE) } else { # ARMA correlations via explicit natural residuals if (!is.null(i)) { stop2("Pointwise evaluation is not possible for ARMA models.") } eta <- .predictor_arma( eta, ar = draws$ac$ar, ma = draws$ac$ma, Y = draws$ac$Y, J_lag = draws$ac$J_lag, fdraws = fdraws ) } } if (has_ac_class(draws$ac$acef, "car")) { eta <- eta + .predictor_re(Z = p(draws$ac$Zcar, i), r = draws$ac$rcar) } eta } # add ARMA effects to a predictor matrix # @param eta linear predictor matrix # @param ar optional autoregressive samples # @param ma optional moving average samples # @param Y vector of response values # @param J_lag autocorrelation lag for each observation # @return linear predictor matrix updated by ARMA effects .predictor_arma <- function(eta, ar = NULL, ma = NULL, Y = NULL, J_lag = NULL, fdraws = NULL) { if (is.null(ar) && is.null(ma)) { return(eta) } if (anyNA(Y)) { # predicting Y will be necessary at some point stopifnot(is.brmsdraws(fdraws) || is.mvbrmsdraws(fdraws)) pp_fun <- paste0("posterior_predict_", fdraws$family$fun) pp_fun <- get(pp_fun, asNamespace("brms")) } S <- nrow(eta) N <- length(Y) max_lag <- max(J_lag, 1) Kar <- ifelse(is.null(ar), 0, ncol(ar)) Kma <- ifelse(is.null(ma), 0, ncol(ma)) # relevant if time-series are shorter than the ARMA orders take_ar <- seq_len(min(Kar, max_lag)) take_ma <- seq_len(min(Kma, max_lag)) ar <- ar[, take_ar, drop = FALSE] ma <- ma[, take_ma, drop = FALSE] Err <- array(0, dim = c(S, max_lag, max_lag + 1)) err <- zero_mat <- matrix(0, nrow = S, ncol = max_lag) zero_vec <- rep(0, S) for (n in seq_len(N)) { if (Kma) { eta[, n] <- eta[, n] + rowSums(ma * Err[, take_ma, max_lag]) } eta_before_ar <- eta[, n] if (Kar) { eta[, n] <- eta[, n] + rowSums(ar * Err[, take_ar, max_lag]) } # AR terms need to be included in the predictions of y if missing # the prediction code thus differs from the structure of the Stan code y <- Y[n] if (is.na(y)) { # y was not observed and has to be predicted fdraws$dpars$mu <- eta y <- pp_fun(n, fdraws) } # errors in AR models need to be computed before adding AR terms err[, max_lag] <- y - eta_before_ar if (J_lag[n] > 0) { # store residuals of former observations I <- seq_len(J_lag[n]) Err[, I, max_lag + 1] <- err[, max_lag + 1 - I] } # keep the size of 'err' and 'Err' as small as possible Err <- abind(Err[, , -1, drop = FALSE], zero_mat) err <- cbind(err[, -1, drop = FALSE], zero_vec) } eta } brms/R/conditional_effects.R0000644000176200001440000013340213615315355015555 0ustar liggesusers#' Display Conditional Effects of Predictors #' #' Display conditional effects of one or more numeric and/or categorical #' predictors including two-way interaction effects. #' #' @aliases marginal_effects marginal_effects.brmsfit #' #' @param x An object of class \code{brmsfit}. #' @param effects An optional character vector naming effects #' (main effects or interactions) for which to compute conditional plots. #' Interactions are specified by a \code{:} between variable names. #' If \code{NULL} (the default), plots are generated for all main effects #' and two-way interactions estimated in the model. When specifying #' \code{effects} manually, \emph{all} two-way interactions may be plotted #' even if not originally modeled. #' @param conditions An optional \code{data.frame} containing variable values #' to condition on. Each effect defined in \code{effects} will #' be plotted separately for each row of \code{conditions}. Values in the #' \code{cond__} column will be used as titles of the subplots. If \code{cond__} #' is not given, the row names will be used for this purpose instead. #' It is recommended to only define a few rows in order to keep the plots clear. #' See \code{\link{make_conditions}} for an easy way to define conditions. #' If \code{NULL} (the default), numeric variables will be conditionalized by #' using their means and factors will get their reference level assigned. #' \code{NA} values within factors are interpreted as if all dummy #' variables of this factor are zero. This allows, for instance, to make #' predictions of the grand mean when using sum coding. #' @param int_conditions An optional named \code{list} whose elements are numeric #' vectors of values of the second variables in two-way interactions. #' At these values, predictions are evaluated. The names of #' \code{int_conditions} have to match the variable names exactly. #' Additionally, the elements of the numeric vectors may be named themselves, #' in which case their names appear as labels for the conditions in the plots. #' Instead of vectors, functions returning vectors may be passed and are #' applied on the original values of the corresponding variable. #' If \code{NULL} (the default), predictions are evaluated at the #' \eqn{mean} and at \eqn{mean +/- sd}. #' @param re_formula A formula containing random effects to be considered #' in the conditional predictions. If \code{NULL}, include all random effects; #' if \code{NA} (default), include no random effects. #' @param robust If \code{TRUE} (the default) the median is used as the #' measure of central tendency. If \code{FALSE} the mean is used instead. #' @param probs The quantiles to be used in the computation of credible #' intervals (defaults to 2.5 and 97.5 percent quantiles) #' @param method Method use to obtain predictions. Either #' \code{"pp_expect"} (the default) or \code{"posterior_predict"}. #' @param spaghetti Logical. Indicates if predictions should #' be visualized via spaghetti plots. Only applied for numeric #' predictors. If \code{TRUE}, it is recommended #' to set argument \code{nsamples} to a relatively small value #' (e.g. \code{100}) in order to reduce computation time. #' @param surface Logical. Indicates if interactions or #' two-dimensional smooths should be visualized as a surface. #' Defaults to \code{FALSE}. The surface type can be controlled #' via argument \code{stype} of the related plotting method. #' @param categorical Logical. Indicates if effects of categorical #' or ordinal models should be shown in terms of probabilities #' of response categories. Defaults to \code{FALSE}. #' @param ordinal Deprecated! Please use argument \code{categorical}. #' Logical. Indicates if effects in ordinal models #' should be visualized as a raster with the response categories #' on the y-axis. Defaults to \code{FALSE}. #' @param transform A function or a character string naming #' a function to be applied on the predicted responses #' before summary statistics are computed. Only allowed #' if \code{method = "posterior_predict"}. #' @param resolution Number of support points used to generate #' the plots. Higher resolution leads to smoother plots. #' Defaults to \code{100}. If \code{surface} is \code{TRUE}, #' this implies \code{10000} support points for interaction terms, #' so it might be necessary to reduce \code{resolution} #' when only few RAM is available. #' @param too_far Positive number. #' For surface plots only: Grid points that are too #' far away from the actual data points can be excluded from the plot. #' \code{too_far} determines what is too far. The grid is scaled into #' the unit square and then grid points more than \code{too_far} #' from the predictor variables are excluded. By default, all #' grid points are used. Ignored for non-surface plots. #' @param select_points Positive number. #' Only relevant if \code{points} or \code{rug} are set to \code{TRUE}: #' Actual data points of numeric variables that #' are too far away from the values specified in \code{conditions} #' can be excluded from the plot. Values are scaled into #' the unit interval and then points more than \code{select_points} #' from the values in \code{conditions} are excluded. #' By default, all points are used. #' @param ... Further arguments such as \code{subset} or \code{nsamples} #' passed to \code{\link[brms:posterior_predict.brmsfit]{posterior_predict}} or #' \code{\link[brms:pp_expect.brmsfit]{pp_expect}}. #' @inheritParams plot.brmsfit #' @param ncol Number of plots to display per column for each effect. #' If \code{NULL} (default), \code{ncol} is computed internally based #' on the number of rows of \code{conditions}. #' @param points Logical; indicating whether the original data points #' should be added via \code{\link[ggplot2:geom_jitter]{geom_jitter}}. #' Default is \code{FALSE}. Note that only those data points will be added #' that match the specified conditions defined in \code{conditions}. #' For categorical predictors, the conditions have to match exactly. #' For numeric predictors, argument \code{select_points} is used to #' determine, which points do match a condition. #' @param rug Logical; indicating whether a rug representation of predictor #' values should be added via \code{\link[ggplot2:geom_rug]{geom_rug}}. #' Default is \code{FALSE}. Depends on \code{select_points} in the same #' way as \code{points} does. #' @param mean Logical; only relevant for spaghetti plots. #' If \code{TRUE} (the default), display the mean regression #' line on top of the regression lines for each sample. #' @param jitter_width Only used if \code{points = TRUE}: #' Amount of horizontal jittering of the data points. #' Mainly useful for ordinal models. Defaults to \code{0} that #' is no jittering. #' @param stype Indicates how surface plots should be displayed. #' Either \code{"contour"} or \code{"raster"}. #' @param line_args Only used in plots of continuous predictors: #' A named list of arguments passed to #' \code{\link[ggplot2:geom_smooth]{geom_smooth}}. #' @param cat_args Only used in plots of categorical predictors: #' A named list of arguments passed to #' \code{\link[ggplot2:geom_point]{geom_point}}. #' @param errorbar_args Only used in plots of categorical predictors: #' A named list of arguments passed to #' \code{\link[ggplot2:geom_errorbar]{geom_errorbar}}. #' @param surface_args Only used in surface plots: #' A named list of arguments passed to #' \code{\link[ggplot2:geom_contour]{geom_contour}} or #' \code{\link[ggplot2:geom_raster]{geom_raster}} #' (depending on argument \code{stype}). #' @param spaghetti_args Only used in spaghetti plots: #' A named list of arguments passed to #' \code{\link[ggplot2:geom_smooth]{geom_smooth}}. #' @param point_args Only used if \code{points = TRUE}: #' A named list of arguments passed to #' \code{\link[ggplot2:geom_jitter]{geom_jitter}}. #' @param rug_args Only used if \code{rug = TRUE}: #' A named list of arguments passed to #' \code{\link[ggplot2:geom_rug]{geom_rug}}. #' @param facet_args Only used if if multiple condtions are provided: #' A named list of arguments passed to #' \code{\link[ggplot2:facet_wrap]{facet_wrap}}. #' #' @return An object of class \code{'brms_conditional_effects'}, which is a #' named list with one data.frame per effect containing all information #' required to generate conditional effects plots. Among others, these #' data.frames contain some special variables, namely \code{estimate__} #' (predicted values of the response), \code{se__} (standard error of the #' predicted response), \code{lower__} and \code{upper__} (lower and upper #' bounds of the uncertainty interval of the response), as well as #' \code{cond__} (used in faceting when \code{conditions} contains multiple #' rows). #' #' The corresponding \code{plot} method returns a named #' list of \code{\link[ggplot2:ggplot]{ggplot}} objects, which can be further #' customized using the \pkg{ggplot2} package. #' #' @details When creating \code{conditional_effects} for a particular predictor #' (or interaction of two predictors), one has to choose the values of all #' other predictors to condition on. #' By default, the mean is used for continuous variables #' and the reference category is used for factors, but you may change these #' values via argument \code{conditions}. #' This also has an implication for the \code{points} argument: #' In the created plots, only those points will be shown that correspond #' to the factor levels actually used in the conditioning, in order not #' to create the false impression of bad model fit, where it is just #' due to conditioning on certain factor levels. #' #' To fully change colors of the created plots, #' one has to amend both \code{scale_colour} and \code{scale_fill}. #' See \code{\link[ggplot2:scale_colour_grey]{scale_colour_grey}} or #' \code{\link[ggplot2:scale_colour_gradient]{scale_colour_gradient}} #' for more details. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt + (1 | patient), #' data = epilepsy, family = poisson()) #' #' ## plot all conditional effects #' plot(conditional_effects(fit), ask = FALSE) #' #' ## change colours to grey scale #' library(ggplot2) #' me <- conditional_effects(fit, "zBase:Trt") #' plot(me, plot = FALSE)[[1]] + #' scale_color_grey() + #' scale_fill_grey() #' #' ## only plot the conditional interaction effect of 'zBase:Trt' #' ## for different values for 'zAge' #' conditions <- data.frame(zAge = c(-1, 0, 1)) #' plot(conditional_effects(fit, effects = "zBase:Trt", #' conditions = conditions)) #' #' ## also incorporate random effects variance over patients #' ## also add data points and a rug representation of predictor values #' plot(conditional_effects(fit, effects = "zBase:Trt", #' conditions = conditions, re_formula = NULL), #' points = TRUE, rug = TRUE) #' #' ## change handling of two-way interactions #' int_conditions <- list( #' zBase = setNames(c(-2, 1, 0), c("b", "c", "a")) #' ) #' conditional_effects(fit, effects = "Trt:zBase", #' int_conditions = int_conditions) #' conditional_effects(fit, effects = "Trt:zBase", #' int_conditions = list(zBase = quantile)) #' #' ## fit a model to illustrate how to plot 3-way interactions #' fit3way <- brm(count ~ zAge * zBase * Trt, data = epilepsy) #' conditions <- make_conditions(fit3way, "zAge") #' conditional_effects(fit3way, "zBase:Trt", conditions = conditions) #' ## only include points close to the specified values of zAge #' me <- conditional_effects( #' fit3way, "zBase:Trt", conditions = conditions, #' select_points = 0.1 #' ) #' plot(me, points = TRUE) #' } #' #' @export conditional_effects.brmsfit <- function(x, effects = NULL, conditions = NULL, int_conditions = NULL, re_formula = NA, robust = TRUE, probs = c(0.025, 0.975), method = "pp_expect", spaghetti = FALSE, surface = FALSE, categorical = FALSE, ordinal = FALSE, transform = NULL, resolution = 100, select_points = 0, too_far = 0, ...) { method <- validate_pp_method(method) spaghetti <- as_one_logical(spaghetti) surface <- as_one_logical(surface) categorical <- as_one_logical(categorical) ordinal <- as_one_logical(ordinal) contains_samples(x) x <- restructure(x) new_formula <- update_re_terms(x$formula, re_formula = re_formula) bterms <- parse_bf(new_formula) if (length(probs) != 2L) { stop2("Arguments 'probs' must be of length 2.") } if (!is.null(transform) && method != "posterior_predict") { stop2("'transform' is only allowed if 'method = posterior_predict'.") } if (ordinal) { warning2("Argument 'ordinal' is deprecated. ", "Please use 'categorical' instead.") } rsv_vars <- rsv_vars(bterms) use_def_effects <- is.null(effects) if (use_def_effects) { effects <- get_all_effects(bterms, rsv_vars = rsv_vars) } else { # allow to define interactions in any order effects <- strsplit(as.character(effects), split = ":") if (any(unique(unlist(effects)) %in% rsv_vars)) { stop2("Variables ", collapse_comma(rsv_vars), " should not be used as effects for this model") } if (any(lengths(effects) > 2L)) { stop2("To display interactions of order higher than 2 ", "please use the 'conditions' argument.") } all_effects <- get_all_effects( bterms, rsv_vars = rsv_vars, comb_all = TRUE ) ae_coll <- all_effects[lengths(all_effects) == 1L] ae_coll <- ulapply(ae_coll, paste, collapse = ":") matches <- match(lapply(all_effects, sort), lapply(effects, sort), 0L) if (sum(matches) > 0 && sum(matches > 0) < length(effects)) { invalid <- effects[setdiff(seq_along(effects), sort(matches))] invalid <- ulapply(invalid, paste, collapse = ":") warning2( "Some specified effects are invalid for this model: ", collapse_comma(invalid), "\nValid effects are ", "(combinations of): ", collapse_comma(ae_coll) ) } effects <- unique(effects[sort(matches)]) if (!length(effects)) { stop2( "All specified effects are invalid for this model.\n", "Valid effects are (combinations of): ", collapse_comma(ae_coll) ) } } if (categorical || ordinal) { int_effs <- lengths(effects) == 2L if (any(int_effs)) { effects <- effects[!int_effs] warning2( "Interactions cannot be plotted directly if 'categorical' ", "is TRUE. Please use argument 'conditions' instead." ) } } if (!length(effects)) { stop2("No valid effects detected.") } mf <- model.frame(x) conditions <- prepare_conditions( x, conditions = conditions, effects = effects, re_formula = re_formula, rsv_vars = rsv_vars ) int_vars <- get_int_vars(bterms) int_conditions <- lapply(int_conditions, function(x) if (is.numeric(x)) sort(x, TRUE) else x ) out <- list() for (i in seq_along(effects)) { eff <- effects[[i]] marg_data <- prepare_marg_data( mf[, eff, drop = FALSE], conditions = conditions, int_conditions = int_conditions, int_vars = int_vars, surface = surface, resolution = resolution, reorder = use_def_effects ) if (surface && length(eff) == 2L && too_far > 0) { # exclude prediction grid points too far from data ex_too_far <- mgcv::exclude.too.far( g1 = marg_data[[eff[1]]], g2 = marg_data[[eff[2]]], d1 = mf[, eff[1]], d2 = mf[, eff[2]], dist = too_far) marg_data <- marg_data[!ex_too_far, ] } c(out) <- conditional_effects( bterms, fit = x, marg_data = marg_data, method = method, surface = surface, spaghetti = spaghetti, categorical = categorical, ordinal = ordinal, re_formula = re_formula, transform = transform, conditions = conditions, int_conditions = int_conditions, select_points = select_points, probs = probs, robust = robust, ... ) } structure(out, class = "brms_conditional_effects") } #' @rdname conditional_effects.brmsfit #' @export conditional_effects <- function(x, ...) { UseMethod("conditional_effects") } # compute expected values of MV models for use in conditional_effects # @return a list of summarized prediction matrices #' @export conditional_effects.mvbrmsterms <- function(x, resp = NULL, ...) { resp <- validate_resp(resp, x$responses) x$terms <- x$terms[resp] out <- lapply(x$terms, conditional_effects, ...) unlist(out, recursive = FALSE) } # conditional_effects for univariate model # @return a list with the summarized prediction matrix as the only element # @note argument 'resp' exists only to be excluded from '...' (#589) #' @export conditional_effects.brmsterms <- function( x, fit, marg_data, int_conditions, method, surface, spaghetti, categorical, ordinal, probs, robust, dpar = NULL, resp = NULL, ... ) { stopifnot(is.brmsfit(fit)) effects <- attr(marg_data, "effects") types <- attr(marg_data, "types") catscale <- NULL pred_args <- list( fit, newdata = marg_data, allow_new_levels = TRUE, dpar = dpar, resp = if (nzchar(x$resp)) x$resp, incl_autocor = FALSE, ... ) out <- do_call(method, pred_args) rownames(marg_data) <- NULL if (categorical || ordinal) { if (method != "pp_expect") { stop2("Can only use 'categorical' with method = 'pp_expect'.") } if (!is_polytomous(x)) { stop2("Argument 'categorical' may only be used ", "for categorical or ordinal models.") } if (categorical && ordinal) { stop2("Please use argument 'categorical' instead of 'ordinal'.") } catscale <- if (is_multinomial(x)) "Count" else "Probability" cats <- dimnames(out)[[3]] if (is.null(cats)) cats <- seq_dim(out, 3) cats <- factor(rep(cats, each = ncol(out)), levels = cats) marg_data <- cbind(marg_data, cats__ = cats) effects[2] <- "cats__" types[2] <- "factor" } else { if (conv_cats_dpars(x$family)) { stop2("Please set 'categorical' to TRUE.") } if (is_ordinal(x$family) && is.null(dpar)) { warning2( "Predictions are treated as continuous variables in ", "'conditional_effects' by default which is likely invalid ", "for ordinal families. Please set 'categorical' to TRUE." ) if (method == "pp_expect") { out <- ordinal_probs_continuous(out) } } } first_numeric <- types[1] %in% "numeric" second_numeric <- types[2] %in% "numeric" both_numeric <- first_numeric && second_numeric if (second_numeric && !surface) { # can only be converted to factor after having called method mde2 <- round(marg_data[[effects[2]]], 2) levels2 <- sort(unique(mde2), TRUE) marg_data[[effects[2]]] <- factor(mde2, levels = levels2) labels2 <- names(int_conditions[[effects[2]]]) if (length(labels2) == length(levels2)) { levels(marg_data[[effects[2]]]) <- labels2 } } marg_data <- add_effects__(marg_data, effects) spag <- NULL if (first_numeric && spaghetti) { if (surface) { stop2("Cannot use 'spaghetti' and 'surface' at the same time.") } spag <- out if (categorical) { spag <- do_call(cbind, array2list(spag)) } sample <- rep(seq_rows(spag), each = ncol(spag)) if (length(types) == 2L) { # samples should be unique across plotting groups sample <- paste0(sample, "_", marg_data[[effects[2]]]) } spag <- data.frame(as.numeric(t(spag)), factor(sample)) colnames(spag) <- c("estimate__", "sample__") spag <- cbind(marg_data, spag) } out <- posterior_summary(out, probs = probs, robust = robust) if (categorical || ordinal) { out <- do_call(rbind, array2list(out)) } colnames(out) <- c("estimate__", "se__", "lower__", "upper__") out <- cbind(marg_data, out) response <- if (is.null(dpar)) as.character(x$formula[2]) else dpar attr(out, "effects") <- effects attr(out, "response") <- response attr(out, "surface") <- unname(both_numeric && surface) attr(out, "categorical") <- categorical attr(out, "catscale") <- catscale attr(out, "ordinal") <- ordinal attr(out, "spaghetti") <- spag attr(out, "points") <- make_point_frame(x, fit$data, effects, ...) name <- paste0(usc(x$resp, "suffix"), paste0(effects, collapse = ":")) setNames(list(out), name) } # get combinations of variables used in predictor terms # @param ... character vectors or formulas # @param alist a list of character vectors or formulas get_var_combs <- function(..., alist = list()) { dots <- c(list(...), alist) for (i in seq_along(dots)) { if (is.formula(dots[[i]])) { dots[[i]] <- attr(terms(dots[[i]]), "term.labels") } dots[[i]] <- lapply(dots[[i]], all_vars) } unique(unlist(dots, recursive = FALSE)) } # extract combinations of predictor variables get_all_effects <- function(x, ...) { UseMethod("get_all_effects") } #' @export get_all_effects.default <- function(x, ...) { NULL } #' @export get_all_effects.mvbrmsterms <- function(x, ...) { out <- lapply(x$terms, get_all_effects, ...) unique(unlist(out, recursive = FALSE)) } # get all effects for use in conditional_effects # @param bterms object of class brmsterms # @param rsv_vars character vector of reserved variables # @param comb_all include all main effects and two-way interactions? # @return a list with one element per valid effect / effects combination # excludes all 3-way or higher interactions #' @export get_all_effects.brmsterms <- function(x, rsv_vars = NULL, comb_all = FALSE) { stopifnot(is.atomic(rsv_vars)) out <- list() for (dp in names(x$dpars)) { out <- c(out, get_all_effects(x$dpars[[dp]])) } for (nlp in names(x$nlpars)) { out <- c(out, get_all_effects(x$nlpars[[nlp]])) } out <- rmNULL(lapply(out, setdiff, y = rsv_vars)) if (length(out) && comb_all) { out <- unique(unlist(out)) int <- expand.grid(out, out, stringsAsFactors = FALSE) int <- int[int[, 1] != int[, 2], ] int <- as.list(as.data.frame(t(int), stringsAsFactors = FALSE)) int <- unique(unname(lapply(int, sort))) out <- c(as.list(out), int) } unique(out[lengths(out) <= 2L]) } #' @export get_all_effects.btl <- function(x, ...) { c(get_var_combs(x[["fe"]], x[["cs"]]), get_all_effects_type(x, "sp"), get_all_effects_type(x, "sm"), get_all_effects_type(x, "gp")) } # extract variable combinations from special terms get_all_effects_type <- function(x, type) { stopifnot(is.btl(x)) type <- as_one_character(type) regex_type <- regex_sp(type) terms <- all_terms(x[[type]]) out <- named_list(terms) for (i in seq_along(terms)) { # some special terms can appear within interactions # we did not allow ":" within these terms so we can use it for splitting term_parts <- unlist(strsplit(terms[i], split = ":")) vars <- vector("list", length(term_parts)) for (j in seq_along(term_parts)) { if (grepl_expr(regex_type, term_parts[j])) { # evaluate a special term to extract variables tmp <- eval2(term_parts[j]) vars[[j]] <- setdiff(unique(c(tmp$term, tmp$by)), "NA") } else { # extract all variables from an ordinary term vars[[j]] <- all_vars(term_parts[j]) } } vars <- unique(unlist(vars)) out[[i]] <- str2formula(vars, collapse = "*") } get_var_combs(alist = out) } #' @export get_all_effects.btnl <- function(x, ...) { covars <- all_vars(rhs(x$covars)) out <- as.list(covars) if (length(covars) > 1L) { c(out) <- utils::combn(covars, 2, simplify = FALSE) } unique(out) } # extract names of variables treated as integers get_int_vars <- function(x, ...) { UseMethod("get_int_vars") } #' @export get_int_vars.mvbrmsterms <- function(x, ...) { unique(ulapply(x$terms, get_int_vars)) } #' @export get_int_vars.brmsterms <- function(x, ...) { advars <- ulapply(rmNULL(x$adforms[c("trials", "thres")]), all_vars) unique(c(advars, get_sp_vars(x, "mo"))) } # transform posterior draws of ordinal probabilities to a # continuous scale assuming equidistance between adjacent categories # @param x an ndraws x nobs x ncat array of posterior draws # @return an ndraws x nobs matrix of posterior draws ordinal_probs_continuous <- function(x) { stopifnot(length(dim(x)) == 3) for (k in seq_dim(x, 3)) { x[, , k] <- x[, , k] * k } x <- lapply(seq_dim(x, 2), function(s) rowSums(x[, s, ])) do_call(cbind, x) } #' Prepare Fully Crossed Conditions #' #' This is a helper function to prepare fully crossed conditions primarily #' for use with the \code{conditions} argument of \code{\link{conditional_effects}}. #' Automatically creates labels for each row in the \code{cond__} column. #' #' @param x An \R object from which to extract the variables #' that should be part of the conditions. #' @param vars Names of the variables that should be part of the conditions. #' @param ... Arguments passed to \code{\link{rows2labels}}. #' #' @return A \code{data.frame} where each row indicates a condition. #' #' @details For factor like variables, all levels are used as conditions. #' For numeric variables, \code{mean + (-1:1) * SD} are used as conditions. #' #' @seealso \code{\link{conditional_effects}}, \code{\link{rows2labels}} #' #' @examples #' df <- data.frame(x = c("a", "b"), y = rnorm(10)) #' make_conditions(df, vars = c("x", "y")) #' #' @export make_conditions <- function(x, vars, ...) { # rev ensures that the last variable varies fastest in expand.grid vars <- rev(as.character(vars)) if (!is.data.frame(x) && "data" %in% names(x)) { x <- x$data } x <- as.data.frame(x) out <- named_list(vars) for (v in vars) { tmp <- get(v, x) if (is_like_factor(tmp)) { tmp <- levels(as.factor(tmp)) } else { tmp <- mean(tmp, na.rm = TRUE) + (-1:1) * sd(tmp, na.rm = TRUE) } out[[v]] <- tmp } out <- rev(expand.grid(out)) out$cond__ <- rows2labels(out, ...) out } # extract the cond__ variable used for faceting get_cond__ <- function(x) { out <- x[["cond__"]] if (is.null(out)) { out <- rownames(x) } as.character(out) } #' Convert Rows to Labels #' #' Convert information in rows to labels for each row. #' #' @param x A \code{data.frame} for which to extract labels. #' @param digits Minimal number of decimal places shown in #' the labels of numeric variables. #' @param sep A single character string defining the separator #' between variables used in the labels. #' @param incl_vars Indicates if variable names should #' be part of the labels. Defaults to \code{TRUE}. #' @param ... Currently unused. #' #' @return A character vector of the same length as the number #' of rows of \code{x}. #' #' @seealso \code{\link{make_conditions}}, \code{\link{conditional_effects}} #' #' @export rows2labels <- function(x, digits = 2, sep = " & ", incl_vars = TRUE, ...) { x <- as.data.frame(x) incl_vars <- as_one_logical(incl_vars) out <- x for (i in seq_along(out)) { if (!is_like_factor(out[[i]])) { out[[i]] <- round(out[[i]], digits) } if (incl_vars) { out[[i]] <- paste0(names(out)[i], " = ", out[[i]]) } } paste_sep <- function(..., sep__ = sep) { paste(..., sep = sep__) } Reduce(paste_sep, out) } # prepare conditions for use in conditional_effects # @param fit an object of class 'brmsfit' # @param conditions optional data.frame containing user defined conditions # @param effects see conditional_effects # @param re_formula see conditional_effects # @param rsv_vars names of reserved variables # @return a data.frame with (possibly updated) conditions prepare_conditions <- function(fit, conditions = NULL, effects = NULL, re_formula = NA, rsv_vars = NULL) { mf <- model.frame(fit) new_formula <- update_re_terms(fit$formula, re_formula = re_formula) bterms <- parse_bf(new_formula) if (any(grepl_expr("^(as\\.)?factor(.+)$", bterms$allvars))) { # conditions are chosen based the variables stored in the data # this approach cannot take into account possible transformations # to factors happening inside the model formula warning2( "Using 'factor' or 'as.factor' in the model formula ", "might lead to problems in 'conditional_effects'.", "Please convert your variables to factors beforehand." ) } req_vars <- all_vars(rhs(bterms$allvars)) req_vars <- setdiff(req_vars, rsv_vars) if (is.null(conditions)) { conditions <- as.data.frame(as.list(rep(NA, length(req_vars)))) names(conditions) <- req_vars } else { conditions <- as.data.frame(conditions) if (!nrow(conditions)) { stop2("Argument 'conditions' must have a least one row.") } conditions <- unique(conditions) if (any(duplicated(get_cond__(conditions)))) { stop2("Condition labels should be unique.") } req_vars <- setdiff(req_vars, names(conditions)) } # special treatment for 'trials' addition variables trial_vars <- all_vars(bterms$adforms$trials) trial_vars <- trial_vars[!vars_specified(trial_vars, conditions)] if (length(trial_vars)) { message("Setting all 'trials' variables to 1 by ", "default if not specified otherwise.") req_vars <- setdiff(req_vars, trial_vars) for (v in trial_vars) { conditions[[v]] <- 1L } } # use sensible default values for unspecified variables subset_vars <- get_ad_vars(bterms, "subset") int_vars <- get_int_vars(bterms) group_vars <- get_group_vars(bterms) req_vars <- setdiff(req_vars, group_vars) for (v in req_vars) { if (is_like_factor(mf[[v]])) { # factor-like variable if (v %in% subset_vars) { # avoid unintentional subsetting of newdata (#755) conditions[[v]] <- TRUE } else { # use reference category for factors levels <- levels(as.factor(mf[[v]])) ordered <- is.ordered(mf[[v]]) conditions[[v]] <- factor(levels[1], levels, ordered = ordered) } } else { # numeric-like variable if (v %in% subset_vars) { # avoid unintentional subsetting of newdata (#755) conditions[[v]] <- 1 } else if (v %in% int_vars) { # ensure valid integer values conditions[[v]] <- round(median(mf[[v]], na.rm = TRUE)) } else { conditions[[v]] <- mean(mf[[v]], na.rm = TRUE) } } } all_vars <- c(all_vars(bterms$allvars), "cond__") unused_vars <- setdiff(names(conditions), all_vars) if (length(unused_vars)) { warning2( "The following variables in 'conditions' are not ", "part of the model:\n", collapse_comma(unused_vars) ) } validate_newdata( conditions, fit, re_formula = re_formula, allow_new_levels = TRUE, check_response = FALSE, incl_autocor = FALSE ) } # prepare data to be used in conditional_effects # @param data data.frame containing only data of the predictors of interest # @param conditions see argument 'conditions' of conditional_effects # @param int_conditions see argument 'int_conditions' of conditional_effects # @param int_vars names of variables being treated as integers # @param surface generate surface plots later on? # @param resolution number of distinct points at which to evaluate # the predictors of interest # @param reorder reorder predictors so that numeric ones come first? prepare_marg_data <- function(data, conditions, int_conditions = NULL, int_vars = NULL, surface = FALSE, resolution = 100, reorder = TRUE) { effects <- names(data) stopifnot(length(effects) %in% c(1L, 2L)) pred_types <- ifelse(ulapply(data, is_like_factor), "factor", "numeric") # numeric effects should come first if (reorder) { new_order <- order(pred_types, decreasing = TRUE) effects <- effects[new_order] pred_types <- pred_types[new_order] } mono <- effects %in% int_vars if (pred_types[1] == "numeric") { min1 <- min(data[, effects[1]], na.rm = TRUE) max1 <- max(data[, effects[1]], na.rm = TRUE) if (mono[1]) { values <- seq(min1, max1, by = 1) } else { values <- seq(min1, max1, length.out = resolution) } } else { values <- unique(data[, effects[1]]) } if (length(effects) == 2L) { values <- setNames(list(values, NA), effects) if (pred_types[2] == "numeric") { if (surface) { min2 <- min(data[, effects[2]], na.rm = TRUE) max2 <- max(data[, effects[2]], na.rm = TRUE) if (mono[2]) { values[[2]] <- seq(min2, max2, by = 1) } else { values[[2]] <- seq(min2, max2, length.out = resolution) } } else { if (effects[2] %in% names(int_conditions)) { int_cond <- int_conditions[[effects[2]]] if (is.function(int_cond)) { int_cond <- int_cond(data[, effects[2]]) } values[[2]] <- int_cond } else if (mono[2]) { median2 <- median(data[, effects[2]]) mad2 <- mad(data[, effects[2]]) values[[2]] <- round((-1:1) * mad2 + median2) } else { mean2 <- mean(data[, effects[2]], na.rm = TRUE) sd2 <- sd(data[, effects[2]], na.rm = TRUE) values[[2]] <- (-1:1) * sd2 + mean2 } } } else { values[[2]] <- unique(data[, effects[2]]) } data <- do_call(expand.grid, values) } else { data <- structure(data.frame(values), names = effects) } # no need to have the same value combination more than once data <- unique(data) data <- data[do_call(order, as.list(data)), , drop = FALSE] data <- replicate(nrow(conditions), data, simplify = FALSE) marg_vars <- setdiff(names(conditions), effects) cond__ <- get_cond__(conditions) for (j in seq_rows(conditions)) { data[[j]][, marg_vars] <- conditions[j, marg_vars] data[[j]]$cond__ <- cond__[j] } data <- do_call(rbind, data) data$cond__ <- factor(data$cond__, cond__) structure(data, effects = effects, types = pred_types, mono = mono) } # which variables in 'vars' are specified in 'data'? vars_specified <- function(vars, data) { .fun <- function(v) isTRUE(v %in% names(data)) && any(!is.na(data[[v]])) as.logical(ulapply(vars, .fun)) } # prepare data points based on the provided conditions # allows to add data points to conditional effects plots # @return a data.frame containing the data points to be plotted make_point_frame <- function(bterms, mf, effects, conditions, select_points = 0, transform = NULL, ...) { stopifnot(is.brmsterms(bterms), is.data.frame(mf)) effects <- intersect(effects, names(mf)) points <- mf[, effects, drop = FALSE] points$resp__ <- model.response( model.frame(bterms$respform, mf, na.action = na.pass) ) req_vars <- names(mf) groups <- get_re_groups(bterms) if (length(groups)) { c(req_vars) <- unlist(strsplit(groups, ":")) } req_vars <- unique(setdiff(req_vars, effects)) req_vars <- intersect(req_vars, names(conditions)) if (length(req_vars)) { # find out which data point is valid for which condition cond__ <- get_cond__(conditions) mf <- mf[, req_vars, drop = FALSE] conditions <- conditions[, req_vars, drop = FALSE] points$cond__ <- NA points <- replicate(nrow(conditions), points, simplify = FALSE) for (i in seq_along(points)) { cond <- conditions[i, , drop = FALSE] not_na <- !(is.na(cond) | cond == "zero__") cond <- cond[, not_na, drop = FALSE] mf_tmp <- mf[, not_na, drop = FALSE] if (ncol(mf_tmp)) { is_num <- sapply(mf_tmp, is.numeric) is_num <- is_num & !names(mf_tmp) %in% groups if (sum(is_num)) { # handle numeric variables stopifnot(select_points >= 0) if (select_points > 0) { for (v in names(mf_tmp)[is_num]) { min <- min(mf_tmp[, v], na.rm = TRUE) max <- max(mf_tmp[, v], na.rm = TRUE) unit <- scale_unit(mf_tmp[, v], min, max) unit_cond <- scale_unit(cond[, v], min, max) unit_diff <- abs(unit - unit_cond) close_enough <- unit_diff <= select_points mf_tmp[[v]][close_enough] <- cond[, v] mf_tmp[[v]][!close_enough] <- NA } } else { # take all numeric values if select_points is zero cond <- cond[, !is_num, drop = FALSE] mf_tmp <- mf_tmp[, !is_num, drop = FALSE] } } } if (ncol(mf_tmp)) { # handle factors and grouping variables # do it like base::duplicated K <- do_call("paste", c(mf_tmp, sep = "\r")) %in% do_call("paste", c(cond, sep = "\r")) } else { K <- seq_rows(mf) } # cond__ allows to assign points to conditions points[[i]]$cond__[K] <- cond__[i] } points <- do_call(rbind, points) points <- points[!is.na(points$cond__), , drop = FALSE] points$cond__ <- factor(points$cond__, cond__) } points <- add_effects__(points, effects) if (!is.numeric(points$resp__)) { points$resp__ <- as.numeric(as.factor(points$resp__)) if (is_binary(bterms$family)) { points$resp__ <- points$resp__ - 1 } } if (!is.null(transform)) { points$resp__ <- do_call(transform, list(points$resp__)) } points } # add effect__ variables to the data add_effects__ <- function(data, effects) { for (i in seq_along(effects)) { data[[paste0("effect", i, "__")]] <- eval2(effects[i], data) } data } #' @export print.brms_conditional_effects <- function(x, ...) { plot(x, ...) } #' @rdname conditional_effects.brmsfit #' @method plot brms_conditional_effects #' @export plot.brms_conditional_effects <- function( x, ncol = NULL, points = FALSE, rug = FALSE, mean = TRUE, jitter_width = 0, stype = c("contour", "raster"), line_args = list(), cat_args = list(), errorbar_args = list(), surface_args = list(), spaghetti_args = list(), point_args = list(), rug_args = list(), facet_args = list(), theme = NULL, ask = TRUE, plot = TRUE, ... ) { dots <- list(...) plot <- use_alias(plot, dots$do_plot) stype <- match.arg(stype) smooths_only <- isTRUE(attr(x, "smooths_only")) if (points && smooths_only) { stop2("Argument 'points' is invalid for objects ", "returned by 'conditional_smooths'.") } if (!is_equal(jitter_width, 0)) { warning2("'jitter_width' is deprecated. Please use ", "'point_args = list(width = )' instead.") } if (!is.null(theme)) { if (!is.theme(theme)) { stop2("Argument 'theme' should be a 'theme' object.") } pb_colour <- theme$plot.background$colour } else { pb_colour <- theme_get()$plot.background$colour } is_theme_black <- isTRUE(pb_colour == "black") if (plot) { default_ask <- devAskNewPage() on.exit(devAskNewPage(default_ask)) devAskNewPage(ask = FALSE) } dont_replace <- c("mapping", "data", "inherit.aes") plots <- named_list(names(x)) for (i in seq_along(x)) { response <- attr(x[[i]], "response") effects <- attr(x[[i]], "effects") ncond <- length(unique(x[[i]]$cond__)) df_points <- attr(x[[i]], "points") categorical <- isTRUE(attr(x[[i]], "categorical")) catscale <- attr(x[[i]], "catscale") surface <- isTRUE(attr(x[[i]], "surface")) # deprecated as of brms 2.4.3 ordinal <- isTRUE(attr(x[[i]], "ordinal")) if (surface || ordinal) { # surface plots for two dimensional interactions or ordinal plots plots[[i]] <- ggplot(x[[i]]) + aes_(~ effect1__, ~ effect2__) + labs(x = effects[1], y = effects[2]) if (ordinal) { width <- ifelse(is_like_factor(x[[i]]$effect1__), 0.9, 1) .surface_args <- nlist( mapping = aes_(fill = ~ estimate__), height = 0.9, width = width ) replace_args(.surface_args, dont_replace) <- surface_args plots[[i]] <- plots[[i]] + do_call(geom_tile, .surface_args) + scale_fill_gradientn(colors = viridis6(), name = catscale) + ylab(response) } else if (stype == "contour") { .surface_args <- nlist( mapping = aes_(z = ~ estimate__, colour = ~ ..level..), bins = 30, size = 1.3 ) replace_args(.surface_args, dont_replace) <- surface_args plots[[i]] <- plots[[i]] + do_call(geom_contour, .surface_args) + scale_color_gradientn(colors = viridis6(), name = response) } else if (stype == "raster") { .surface_args <- nlist(mapping = aes_(fill = ~ estimate__)) replace_args(.surface_args, dont_replace) <- surface_args plots[[i]] <- plots[[i]] + do_call(geom_raster, .surface_args) + scale_fill_gradientn(colors = viridis6(), name = response) } } else { # plot effects of single predictors or two-way interactions gvar <- if (length(effects) == 2L) "effect2__" spaghetti <- attr(x[[i]], "spaghetti") plots[[i]] <- ggplot(x[[i]]) + aes_string(x = "effect1__", y = "estimate__", colour = gvar) + labs(x = effects[1], y = response, colour = effects[2]) if (is.null(spaghetti)) { plots[[i]] <- plots[[i]] + aes_string(ymin = "lower__", ymax = "upper__", fill = gvar) + labs(fill = effects[2]) } # extract suggested colors for later use colors <- ggplot_build(plots[[i]]) colors <- unique(colors$data[[1]][["colour"]]) if (points && !categorical && !surface) { # add points first so that they appear behind the predictions .point_args <- list( mapping = aes_string(x = "effect1__", y = "resp__"), data = df_points, inherit.aes = FALSE, size = 2 / ncond^0.25, height = 0, width = jitter_width ) if (is_like_factor(df_points[, gvar])) { .point_args$mapping[c("colour", "fill")] <- aes_string(colour = gvar, fill = gvar) } else if (is_theme_black) { .point_args$colour <- "white" } replace_args(.point_args, dont_replace) <- point_args plots[[i]] <- plots[[i]] + do_call(geom_jitter, .point_args) } if (!is.null(spaghetti)) { # add a regression line for each sample separately .spaghetti_args <- list( aes_string(group = "sample__", colour = gvar), data = spaghetti, stat = "identity", size = 0.5 ) if (length(effects) == 1L) { .spaghetti_args$colour <- alpha("blue", 0.1) } else { # workaround to get transparent lines plots[[i]] <- plots[[i]] + scale_color_manual(values = alpha(colors, 0.1)) } replace_args(.spaghetti_args, dont_replace) <- spaghetti_args plots[[i]] <- plots[[i]] + do_call(geom_smooth, .spaghetti_args) } if (is.numeric(x[[i]]$effect1__)) { # line plots for numeric predictors .line_args <- list(stat = "identity") if (!is.null(spaghetti)) { # display a white mean regression line .line_args$mapping <- aes_string(group = gvar) .line_args$colour <- alpha("white", 0.8) } replace_args(.line_args, dont_replace) <- line_args if (mean || is.null(spaghetti)) { plots[[i]] <- plots[[i]] + do_call(geom_smooth, .line_args) } if (rug) { .rug_args <- list( aes_string(x = "effect1__"), sides = "b", data = df_points, inherit.aes = FALSE ) if (is_like_factor(df_points[, gvar])) { .point_args$mapping[c("colour", "fill")] <- aes_string(colour = gvar, fill = gvar) } else if (is_theme_black) { .rug_args$colour <- "white" } replace_args(.rug_args, dont_replace) <- rug_args plots[[i]] <- plots[[i]] + do_call(geom_rug, .rug_args) } } else { # points and errorbars for factors .cat_args <- list( position = position_dodge(width = 0.4), size = 4 / ncond^0.25 ) .errorbar_args <- list( position = position_dodge(width = 0.4), width = 0.3 ) if (is.null(gvar) && is_theme_black) { .cat_args$colour <- .errorbar_args$colour <- "white" } replace_args(.cat_args, dont_replace) <- cat_args replace_args(.errorbar_args, dont_replace) <- errorbar_args plots[[i]] <- plots[[i]] + do_call(geom_point, .cat_args) + do_call(geom_errorbar, .errorbar_args) } if (categorical) { plots[[i]] <- plots[[i]] + ylab(catscale) + labs(fill = response, color = response) } } if (ncond > 1L) { # one plot per row of conditions if (is.null(ncol)) { ncol <- max(floor(sqrt(ncond)), 3) } .facet_args <- nlist(facets = "cond__", ncol) replace_args(.facet_args, dont_replace) <- facet_args plots[[i]] <- plots[[i]] + do_call(facet_wrap, .facet_args) } plots[[i]] <- plots[[i]] + theme if (plot) { plot(plots[[i]]) if (i == 1) { devAskNewPage(ask = ask) } } } invisible(plots) } # the name 'marginal_effects' is deprecated as of brms 2.10.3 # do not remove it eventually as it has been used in the brms papers #' @export marginal_effects <- function(x, ...) { UseMethod("marginal_effects") } #' @export marginal_effects.brmsfit <- function(x, ...) { warning2("Method 'marginal_effects' is deprecated. ", "Please use 'conditional_effects' instead.") conditional_effects.brmsfit(x, ...) } #' @export print.brmsMarginalEffects <- function(x, ...) { class(x) <- "brms_conditional_effects" print(x, ...) } #' @export plot.brmsMarginalEffects <- function(x, ...) { class(x) <- "brms_conditional_effects" plot(x, ...) } brms/R/conditional_smooths.R0000644000176200001440000002047713611527526015642 0ustar liggesusers#' Display Smooth Terms #' #' Display smooth \code{s} and \code{t2} terms of models #' fitted with \pkg{brms}. #' #' @aliases marginal_smooths marginal_smooths.brmsfit #' #' @inheritParams conditional_effects.brmsfit #' @param smooths Optional character vector of smooth terms #' to display. If \code{NULL} (the default) all smooth terms #' are shown. #' @param subset A numeric vector specifying #' the posterior samples to be used. #' If \code{NULL} (the default), all samples are used. #' @param nsamples Positive integer indicating how many #' posterior samples should be used. #' If \code{NULL} (the default) all samples are used. #' Ignored if \code{subset} is not \code{NULL}. #' @param ... Currently ignored. #' #' @return For the \code{brmsfit} method, #' an object of class \code{brms_conditional_effects}. See #' \code{\link{conditional_effects}} for #' more details and documentation of the related plotting function. #' #' @details Two-dimensional smooth terms will be visualized using #' either contour or raster plots. #' #' @examples #' \dontrun{ #' set.seed(0) #' dat <- mgcv::gamSim(1, n = 200, scale = 2) #' fit <- brm(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat) #' # show all smooth terms #' plot(conditional_smooths(fit), rug = TRUE, ask = FALSE) #' # show only the smooth term s(x2) #' plot(conditional_smooths(fit, smooths = "s(x2)"), ask = FALSE) #' #' # fit and plot a two-dimensional smooth term #' fit2 <- brm(y ~ t2(x0, x2), data = dat) #' ms <- conditional_smooths(fit2) #' plot(ms, stype = "contour") #' plot(ms, stype = "raster") #' } #' #' @export conditional_smooths.brmsfit <- function(x, smooths = NULL, int_conditions = NULL, probs = c(0.025, 0.975), spaghetti = FALSE, resolution = 100, too_far = 0, subset = NULL, nsamples = NULL, ...) { spaghetti <- as_one_logical(spaghetti) contains_samples(x) x <- restructure(x) x <- exclude_terms(x, incl_autocor = FALSE) smooths <- rm_wsp(as.character(smooths)) conditions <- prepare_conditions(x) subset <- subset_samples(x, subset, nsamples) # call as.matrix only once to save time and memory samples <- as.matrix(x, subset = subset) bterms <- parse_bf(exclude_terms(x$formula, smooths_only = TRUE)) out <- conditional_smooths( bterms, fit = x, samples = samples, smooths = smooths, conditions = conditions, int_conditions = int_conditions, too_far = too_far, resolution = resolution, probs = probs, spaghetti = spaghetti ) if (!length(out)) { stop2("No valid smooth terms found in the model.") } structure(out, class = "brms_conditional_effects", smooths_only = TRUE) } #' @rdname conditional_smooths.brmsfit #' @export conditional_smooths <- function(x, ...) { UseMethod("conditional_smooths") } #' @export conditional_smooths.default <- function(x, ...) { NULL } #' @export conditional_smooths.mvbrmsterms <- function(x, ...) { out <- list() for (r in names(x$terms)) { c(out) <- conditional_smooths(x$terms[[r]], ...) } out } #' @export conditional_smooths.brmsterms <- function(x, ...) { out <- list() for (dp in names(x$dpars)) { c(out) <- conditional_smooths(x$dpars[[dp]], ...) } for (nlp in names(x$nlpars)) { c(out) <- conditional_smooths(x$nlpars[[nlp]], ...) } out } # conditional smooths for a single predicted parameter # @param fit brmsfit object # @param samples extract posterior samples # @param smooths optional names of smooth terms to plot # @param conditions output of prepare_conditions # @param int_conditions values of by-vars at which to evalute smooths # @param ...: currently ignored # @return a named list with one element per smooth term #' @export conditional_smooths.btl <- function(x, fit, samples, smooths, conditions, int_conditions, probs, resolution, too_far, spaghetti, ...) { stopifnot(is.brmsfit(fit)) out <- list() mf <- model.frame(fit) smef <- tidy_smef(x, mf) smterms <- unique(smef$term) if (!length(smooths)) { I <- seq_along(smterms) } else { I <- which(smterms %in% smooths) } for (i in I) { # loop over smooth terms and compute their predictions term <- smterms[i] sub_smef <- subset2(smef, term = term) # extract raw variable names before transformations covars <- all_vars(sub_smef$covars[[1]]) byvars <- all_vars(sub_smef$byvars[[1]]) ncovars <- length(covars) if (ncovars > 2L) { byvars <- c(covars[3:ncovars], byvars) covars <- covars[1:2] ncovars <- 2L } vars <- c(covars, byvars) values <- named_list(vars) is_numeric <- setNames(rep(FALSE, ncovars), covars) for (cv in covars) { if (is.numeric(mf[[cv]])) { is_numeric[cv] <- TRUE values[[cv]] <- seq( min(mf[[cv]]), max(mf[[cv]]), length.out = resolution ) } else { values[[cv]] <- levels(factor(mf[[cv]])) } } for (cv in byvars) { if (cv %in% names(int_conditions)) { values[[cv]] <- int_conditions[[cv]] } else if (is.numeric(mf[[cv]])) { mean2 <- mean(mf[[cv]], na.rm = TRUE) sd2 <- sd(mf[[cv]], na.rm = TRUE) values[[cv]] <- (-1:1) * sd2 + mean2 } else { values[[cv]] <- levels(factor(mf[[cv]])) } } newdata <- expand.grid(values) if (ncovars == 2L && too_far > 0) { # exclude prediction grid points too far from data ex_too_far <- mgcv::exclude.too.far( g1 = newdata[[covars[1]]], g2 = newdata[[covars[2]]], d1 = mf[, covars[1]], d2 = mf[, covars[2]], dist = too_far ) newdata <- newdata[!ex_too_far, ] } other_vars <- setdiff(names(conditions), vars) newdata[, other_vars] <- conditions[1, other_vars] sdata <- standata( fit, newdata, re_formula = NA, internal = TRUE, check_response = FALSE ) draws_args <- nlist(x, samples, sdata, data = mf) draws <- do_call(extract_draws, draws_args) J <- which(smef$termnum == i) scs <- unlist(attr(draws$sm$fe$Xs, "smcols")[J]) draws$sm$fe$Xs <- draws$sm$fe$Xs[, scs, drop = FALSE] draws$sm$fe$bs <- draws$sm$fe$bs[, scs, drop = FALSE] draws$sm$re <- draws$sm$re[J] draws$family <- brmsfamily("gaussian") eta <- predictor(draws, i = NULL) effects <- na.omit(sub_smef$covars[[1]][1:2]) marg_data <- add_effects__(newdata[, vars, drop = FALSE], effects) if (length(byvars)) { # byvars will be plotted as facets marg_data$cond__ <- rows2labels(marg_data[, byvars, drop = FALSE]) } else { marg_data$cond__ <- factor(1) } spa_data <- NULL if (spaghetti && ncovars == 1L && is_numeric[1]) { sample <- rep(seq_rows(eta), each = ncol(eta)) spa_data <- data.frame(as.numeric(t(eta)), factor(sample)) colnames(spa_data) <- c("estimate__", "sample__") spa_data <- cbind(marg_data, spa_data) } eta <- posterior_summary(eta, robust = TRUE, probs = probs) colnames(eta) <- c("estimate__", "se__", "lower__", "upper__") eta <- cbind(marg_data, eta) response <- combine_prefix(x, keep_mu = TRUE) response <- paste0(response, ": ", term) points <- mf[, vars, drop = FALSE] points <- add_effects__(points, covars) attr(eta, "response") <- response attr(eta, "effects") <- effects attr(eta, "surface") <- all(is_numeric) && ncovars == 2L attr(eta, "spaghetti") <- spa_data attr(eta, "points") <- points out[[response]] <- eta } out } # the name 'marginal_smooths' is deprecated as of brms 2.10.3 # do not remove it eventually as it has been used in the brms papers #' @export marginal_smooths <- function(x, ...) { UseMethod("marginal_smooths") } #' @export marginal_smooths.brmsfit <- function(x, ...) { warning2("Method 'marginal_smooths' is deprecated. ", "Please use 'conditional_smooths' instead.") conditional_smooths.brmsfit(x, ...) } brms/R/brmsterms.R0000644000176200001440000010052713611527526013574 0ustar liggesusers#' Parse Formulas of \pkg{brms} Models #' #' Parse formulas objects for use in \pkg{brms}. #' #' @inheritParams brm #' @param check_response Logical; Indicates whether the left-hand side #' of \code{formula} (i.e. response variables and addition arguments) #' should be parsed. If \code{FALSE}, \code{formula} may also be one-sided. #' @param resp_rhs_all Logical; Indicates whether to also include response #' variables on the right-hand side of formula \code{.$allvars}, #' where \code{.} represents the output of \code{parse_bf}. #' @param mv Indicates if the univariate model is part of a multivariate model. #' @param ... Further arguments passed to or from other methods. #' #' @return An object of class \code{brmsterms} or \code{mvbrmsterms} #' (for multivariate models), which is a \code{list} containing all #' required information initially stored in \code{formula} #' in an easier to use format, basically a list of formulas #' (not an abstract syntax tree). #' #' @details This is the main formula parsing function of \pkg{brms}. #' It should usually not be called directly, but is exported to allow #' package developers making use of the formula syntax implemented #' in \pkg{brms}. As long as no other packages depend on this functions, #' it may be changed without deprecation warnings, when new features make #' this necessary. #' #' @seealso #' \code{\link{brm}}, #' \code{\link{brmsformula}}, #' \code{\link{mvbrmsformula}} #' #' @export parse_bf <- function(formula, ...) { UseMethod("parse_bf") } #' @rdname parse_bf #' @export parse_bf.default <- function(formula, family = NULL, autocor = NULL, ...) { x <- validate_formula(formula, family = family, autocor = autocor) parse_bf(x, ...) } #' @rdname parse_bf #' @export parse_bf.brmsformula <- function(formula, family = NULL, autocor = NULL, check_response = TRUE, resp_rhs_all = TRUE, mv = FALSE, ...) { x <- validate_formula(formula, family = family, autocor = autocor) mv <- as_one_logical(mv) rescor <- mv && isTRUE(x$rescor) mecor <- isTRUE(x$mecor) formula <- x$formula family <- x$family y <- nlist(formula, family, mv, rescor, mecor) class(y) <- "brmsterms" if (check_response) { # extract response variables y$respform <- validate_resp_formula(formula, empty_ok = FALSE) if (mv) { y$resp <- parse_resp(y$respform) } else { y$resp <- "" } } # extract addition arguments adforms <- parse_ad(formula, family, check_response) advars <- str2formula(ulapply(adforms, all_vars)) y$adforms[names(adforms)] <- adforms # centering would lead to incorrect results for grouped threshold vectors # as each threshold vector only affects a subset of observations if (!is.null(get_ad_expr(y, "thres", "gr"))) { attr(formula, "center") <- FALSE dp_classes <- dpar_class(names(x$pforms)) mu_names <- names(x$pforms)[dp_classes == "mu"] for (dp in mu_names) { attr(x$pforms[[dp]], "center") <- FALSE } } # combine the main formula with formulas for the 'mu' parameters if (is.mixfamily(family)) { mu_dpars <- paste0("mu", seq_along(family$mix)) for (dp in mu_dpars) { x$pforms[[dp]] <- combine_formulas(formula, x$pforms[[dp]], dp) } x$pforms <- move2start(x$pforms, mu_dpars) } else if (conv_cats_dpars(x$family)) { mu_dpars <- str_subset(x$family$dpars, "^mu") for (dp in mu_dpars) { x$pforms[[dp]] <- combine_formulas(formula, x$pforms[[dp]], dp) } x$pforms <- move2start(x$pforms, mu_dpars) } else { x$pforms[["mu"]] <- combine_formulas(formula, x$pforms[["mu"]], "mu") x$pforms <- move2start(x$pforms, "mu") } # predicted distributional parameters resp <- ifelse(mv && !is.null(y$resp), y$resp, "") dpars <- intersect(names(x$pforms), valid_dpars(family)) dpar_forms <- x$pforms[dpars] nlpars <- setdiff(names(x$pforms), dpars) y$dpars <- named_list(dpars) for (dp in dpars) { if (get_nl(dpar_forms[[dp]])) { y$dpars[[dp]] <- parse_nlf(dpar_forms[[dp]], nlpars, resp) } else { y$dpars[[dp]] <- parse_lf(dpar_forms[[dp]]) } y$dpars[[dp]]$family <- dpar_family(family, dp) y$dpars[[dp]]$dpar <- dp y$dpars[[dp]]$resp <- resp if (dpar_class(dp) == "mu") { y$dpars[[dp]]$respform <- y$respform y$dpars[[dp]]$adforms <- y$adforms } } y$nlpars <- named_list(nlpars) if (length(nlpars)) { nlpar_forms <- x$pforms[nlpars] for (nlp in nlpars) { if (is.null(attr(nlpar_forms[[nlp]], "center"))) { # design matrices of non-linear parameters will not be # centered by default to make prior specification easier attr(nlpar_forms[[nlp]], "center") <- FALSE } if (get_nl(nlpar_forms[[nlp]])) { y$nlpars[[nlp]] <- parse_nlf(nlpar_forms[[nlp]], nlpars, resp) } else { y$nlpars[[nlp]] <- parse_lf(nlpar_forms[[nlp]]) } y$nlpars[[nlp]]$nlpar <- nlp y$nlpars[[nlp]]$resp <- resp } used_nlpars <- ulapply(c(y$dpars, y$nlpars), "[[", "used_nlpars") unused_nlpars <- setdiff(nlpars, used_nlpars) if (length(unused_nlpars)) { stop2( "The parameter '", unused_nlpars[1], "' is not a ", "valid distributional or non-linear parameter. ", "Did you forget to set 'nl = TRUE'?" ) } # sort non-linear parameters after dependency used_nlpars <- lapply(y$nlpars, "[[", "used_nlpars") sorted_nlpars <- sort_dependencies(used_nlpars) y$nlpars <- y$nlpars[sorted_nlpars] } # fixed distributional parameters valid_dpars <- valid_dpars(y) inv_fixed_dpars <- setdiff(names(x$pfix), valid_dpars) if (length(inv_fixed_dpars)) { stop2("Invalid fixed parameters: ", collapse_comma(inv_fixed_dpars)) } if ("sigma" %in% valid_dpars && no_sigma(y)) { # some models require setting sigma to 0 if ("sigma" %in% c(names(x$pforms), names(x$pfix))) { stop2("Cannot predict or fix 'sigma' in this model.") } x$pfix$sigma <- 0 } if ("nu" %in% valid_dpars && no_nu(y)) { if ("nu" %in% c(names(x$pforms), names(x$pfix))) { stop2("Cannot predict or fix 'nu' in this model.") } x$pfix$nu <- 1 } disc_pars <- valid_dpars[dpar_class(valid_dpars) %in% "disc"] for (dp in disc_pars) { # 'disc' is set to 1 and not estimated by default if (!dp %in% c(names(x$pforms), names(x$pfix))) { x$pfix[[dp]] <- 1 } } for (dp in names(x$pfix)) { y$fdpars[[dp]] <- list(value = x$pfix[[dp]], dpar = dp) } check_fdpars(y$fdpars) # check for illegal use of cs terms if (has_cs(y) && !(is.null(family) || allow_cs(family))) { stop2("Category specific effects require families ", "'sratio', 'cratio', or 'acat'.") } # make a formula containing all required variables lhsvars <- if (resp_rhs_all) all_vars(y$respform) y$allvars <- allvars_formula( lhsvars, advars, lapply(y$dpars, get_allvars), lapply(y$nlpars, get_allvars), y$time$allvars ) if (check_response) { y$allvars <- update(y$respform, y$allvars) } environment(y$allvars) <- environment(formula) y } #' @rdname parse_bf #' @export parse_bf.mvbrmsformula <- function(formula, family = NULL, autocor = NULL, ...) { x <- validate_formula(formula, family = family, autocor = autocor) x$rescor <- isTRUE(x$rescor) x$mecor <- isTRUE(x$mecor) out <- structure(list(), class = "mvbrmsterms") out$terms <- named_list(names(x$forms)) for (i in seq_along(out$terms)) { x$forms[[i]]$rescor <- x$rescor x$forms[[i]]$mecor <- x$mecor out$terms[[i]] <- parse_bf(x$forms[[i]], mv = TRUE, ...) } out$allvars <- allvars_formula(lapply(out$terms, get_allvars)) # required to find variables used solely in the response part lhs_resp <- function(x) deparse_combine(lhs(x$respform)[[2]]) out$respform <- paste0(ulapply(out$terms, lhs_resp), collapse = ",") out$respform <- formula(paste0("cbind(", out$respform, ") ~ 1")) out$responses <- ulapply(out$terms, "[[", "resp") out$rescor <- x$rescor out$mecor <- x$mecor out } # parse linear/additive formulas # @param formula an ordinary model formula # @return a 'btl' object parse_lf <- function(formula) { formula <- rhs(as.formula(formula)) y <- nlist(formula) types <- setdiff(all_term_types(), excluded_term_types(formula)) for (t in types) { tmp <- do_call(paste0("parse_", t), list(formula)) if (is.data.frame(tmp) || is.formula(tmp)) { y[[t]] <- tmp } } y$allvars <- allvars_formula( get_allvars(y$fe), get_allvars(y$re), get_allvars(y$cs), get_allvars(y$sp), get_allvars(y$sm), get_allvars(y$gp), get_allvars(y$ac), get_allvars(y$offset) ) environment(y$allvars) <- environment(formula) structure(y, class = "btl") } # parse non-linear formulas # @param formula non-linear model formula # @param nlpars names of all non-linear parameters # @param resp optional name of a response variable # @return a 'btnl' object parse_nlf <- function(formula, nlpars, resp = "") { if (!length(nlpars)) { stop2("No non-linear parameters specified.") } loop <- !isFALSE(attr(formula, "loop")) formula <- rhs(as.formula(formula)) y <- nlist(formula) all_vars <- all_vars(formula) y$used_nlpars <- intersect(all_vars, nlpars) covars <- setdiff(all_vars, nlpars) y$covars <- structure(str2formula(covars), int = FALSE) if (!"ac" %in% excluded_term_types(formula)) { y$ac <- parse_ac(attr(formula, "autocor")) } y$allvars <- allvars_formula(covars, get_allvars(y$ac)) environment(y$allvars) <- environment(formula) y$loop <- loop structure(y, class = "btnl") } # extract addition arguments out of formula # @return a list of formulas each containg a single addition term parse_ad <- function(formula, family = NULL, check_response = TRUE) { x <- list() ad_funs <- lsp("brms", what = "exports", pattern = "^resp_") ad_funs <- sub("^resp_", "", ad_funs) families <- family_names(family) if (is.family(family) && any(nzchar(families))) { str_formula <- formula2str(formula) ad <- get_matches("(?<=\\|)[^~]*(?=~)", str_formula, perl = TRUE) valid_ads <- family_info(family, "ad") if (length(ad)) { ad_terms <- attr(terms(formula(paste("~", ad))), "term.labels") for (a in ad_funs) { matches <- grep(paste0("^(resp_)?", a, "\\(.*\\)$"), ad_terms) if (length(matches) == 1L) { x[[a]] <- ad_terms[matches] if (!grepl("^resp_", x[[a]])) { x[[a]] <- paste0("resp_", x[[a]]) } ad_terms <- ad_terms[-matches] if (!is.na(x[[a]]) && a %in% valid_ads) { x[[a]] <- str2formula(x[[a]]) } else { stop2("Argument '", a, "' is not supported for ", "family '", summary(family), "'.") } } else if (length(matches) > 1L) { stop2("Each addition argument may only be defined once.") } } if (length(ad_terms)) { stop2("The following addition terms are invalid:\n", collapse_comma(ad_terms)) } } if (check_response && "wiener" %in% families && !is.formula(x$dec)) { stop2("Addition argument 'dec' is required for family 'wiener'.") } if (is.formula(x$cat)) { # 'cat' was replaced by 'thres' in brms 2.10.5 x$thres <- x$cat } } x } # extract fixed effects terms parse_fe <- function(formula) { all_terms <- all_terms(formula) sp_terms <- find_terms(all_terms, "all", complete = FALSE) re_terms <- all_terms[grepl("\\|", all_terms)] int_term <- attr(terms(formula), "intercept") fe_terms <- setdiff(all_terms, c(sp_terms, re_terms)) out <- paste(c(int_term, fe_terms), collapse = "+") out <- str2formula(out) attr(out, "allvars") <- allvars_formula(out) attr(out, "decomp") <- get_decomp(formula) if (has_rsv_intercept(out)) { attr(out, "int") <- FALSE } if (no_cmc(formula)) { attr(out, "cmc") <- FALSE } if (no_center(formula)) { attr(out, "center") <- FALSE } if (is_sparse(formula)) { attr(out, "sparse") <- TRUE } out } # gather information of group-level terms # @return a data.frame with one row per group-level term parse_re <- function(formula) { re_terms <- get_re_terms(formula, brackets = FALSE) if (!length(re_terms)) { return(NULL) } re_terms <- split_re_terms(re_terms) re_parts <- re_parts(re_terms) out <- allvars <- vector("list", length(re_terms)) type <- attr(re_terms, "type") for (i in seq_along(re_terms)) { id <- gsub("\\|", "", re_parts$mid[i]) if (!nzchar(id)) id <- NA gcall <- eval2(re_parts$rhs[i]) form <- str2formula(re_parts$lhs[i]) group <- paste0(gcall$type, collapse(gcall$groups)) out[[i]] <- data.frame( group = group, gtype = gcall$type, gn = i, id = id, type = type[i], cor = substr(re_parts$mid[i], 1, 2) != "||", stringsAsFactors = FALSE ) out[[i]]$gcall <- list(gcall) out[[i]]$form <- list(form) # gather all variables used in the group-level term # at this point 'cs' terms are no longer recognized as such ftype <- str_if(type[i] %in% "cs", "", type[i]) re_allvars <- get_allvars(form, type = ftype) allvars[[i]] <- allvars_formula(re_allvars, gcall$allvars) } out <- do_call(rbind, out) out <- out[order(out$group), ] attr(out, "allvars") <- allvars_formula(allvars) if (no_cmc(formula)) { # disabling cell-mean coding in all group-level terms # has to come last to avoid removal of attributes for (i in seq_rows(out)) { attr(out$form[[i]], "cmc") <- FALSE } } out } # extract category specific terms for ordinal models parse_cs <- function(formula) { out <- find_terms(formula, "cs") if (!length(out)) { return(NULL) } out <- ulapply(out, eval2) out <- str2formula(out) attr(out, "allvars") <- allvars_formula(out) # do not test whether variables were supplied to 'cs' # to allow category specific group-level intercepts attr(out, "int") <- FALSE out } # extract special effects terms parse_sp <- function(formula) { types <- c("mo", "me", "mi") out <- find_terms(formula, types, complete = FALSE) if (!length(out)) { return(NULL) } uni_mo <- rm_wsp(get_matches_expr(regex_sp("mo"), out)) uni_me <- rm_wsp(get_matches_expr(regex_sp("me"), out)) uni_mi <- rm_wsp(get_matches_expr(regex_sp("mi"), out)) # remove the intercept as it is handled separately out <- str2formula(c("0", out)) attr(out, "int") <- FALSE attr(out, "uni_mo") <- uni_mo attr(out, "uni_me") <- uni_me attr(out, "uni_mi") <- uni_mi attr(out, "allvars") <- str2formula(all_vars(out)) # TODO: do we need sp_fake_formula at all? # attr(out, "allvars") <- sp_fake_formula(uni_mo, uni_me, uni_mi) out } # extract spline terms parse_sm <- function(formula) { out <- find_terms(formula, "sm") if (!length(out)) { return(NULL) } if (any(grepl("^(te|ti)\\(", out))) { stop2("Tensor product smooths 'te' and 'ti' are not yet ", "implemented in brms. Consider using 't2' instead.") } out <- str2formula(out) attr(out, "allvars") <- mgcv::interpret.gam(out)$fake.formula out } # extract gaussian process terms parse_gp <- function(formula) { out <- find_terms(formula, "gp") if (!length(out)) { return(NULL) } eterms <- lapply(out, eval2) covars <- lapply(eterms, "[[", "term") byvars <- lapply(eterms, "[[", "by") allvars <- str2formula(unlist(c(covars, byvars))) allvars <- str2formula(all_vars(allvars)) if (!length(all_vars(allvars))) { stop2("No variable supplied to function 'gp'.") } out <- str2formula(out) attr(out, "allvars") <- allvars out } # extract autocorrelation terms parse_ac <- function(formula) { autocor <- attr(formula, "autocor") out <- c(find_terms(formula, "ac"), find_terms(autocor, "ac")) if (!length(out)) { return(NULL) } eterms <- lapply(out, eval2) allvars <- unlist(c( lapply(eterms, "[[", "time"), lapply(eterms, "[[", "gr") )) allvars <- str2formula(all_vars(allvars)) out <- str2formula(out) attr(out, "allvars") <- allvars out } # extract offset terms parse_offset <- function(formula) { terms <- terms(as.formula(formula)) pos <- attr(terms, "offset") if (is.null(pos)) { return(NULL) } vars <- attr(terms, "variables") out <- ulapply(pos, function(i) deparse(vars[[i + 1]])) out <- str2formula(out) attr(out, "allvars") <- str2formula(all_vars(out)) out } # extract multiple covariates in multi-membership terms parse_mmc <- function(formula) { out <- find_terms(formula, "mmc") if (!length(out)) { return(NULL) } # remove the intercept as it is handled separately out <- str2formula(c("0", out)) attr(out, "allvars") <- allvars_formula(out) attr(out, "int") <- FALSE out } # extract response variable names # assumes multiple response variables to be combined via mvbind parse_resp <- function(formula, check_names = TRUE) { formula <- lhs(as.formula(formula)) if (is.null(formula)) { return(NULL) } expr <- validate_resp_formula(formula)[[2]] if (length(expr) <= 1L) { out <- deparse_no_string(expr) } else { str_fun <- deparse_no_string(expr[[1]]) use_mvbind <- identical(str_fun, "mvbind") use_cbind <- identical(str_fun, "cbind") if (use_mvbind) { out <- ulapply(expr[-1], deparse_no_string) } else if (use_cbind) { # deprecated as of brms 2.7.2 warning2("Using 'cbind' for multivariate models is ", "deprecated. Please use 'mvbind' instead.") out <- ulapply(expr[-1], deparse_no_string) } else { out <- deparse_no_string(expr) } } if (check_names) { out <- make_stan_names(out) } out } #' Checks if argument is a \code{brmsterms} object #' #' @param x An \R object #' #' @seealso \code{\link[brms:parse_bf]{parse_bf}} #' #' @export is.brmsterms <- function(x) { inherits(x, "brmsterms") } #' Checks if argument is a \code{mvbrmsterms} object #' #' @param x An \R object #' #' @seealso \code{\link[brms:parse_bf]{parse_bf}} #' #' @export is.mvbrmsterms <- function(x) { inherits(x, "mvbrmsterms") } is.btl <- function(x) { inherits(x, "btl") } is.btnl <- function(x) { inherits(x, "btnl") } # transform mvbrmsterms objects for use in stan_llh.brmsterms as.brmsterms <- function(x) { stopifnot(is.mvbrmsterms(x), x$rescor) families <- ulapply(x$terms, function(y) y$family$family) stopifnot(all(families == families[1])) out <- structure(list(), class = "brmsterms") out$family <- structure( list(family = paste0(families[1], "_mv"), link = "identity"), class = c("brmsfamily", "family") ) info <- get(paste0(".family_", families[1]))() out$family[names(info)] <- info out$sigma_pred <- any(ulapply(x$terms, function(x) "sigma" %in% names(x$dpar) || is.formula(x$adforms$se) )) weight_forms <- rmNULL(lapply(x$terms, function(x) x$adforms$weights)) if (length(weight_forms)) { str_wf <- unique(ulapply(weight_forms, formula2str)) if (length(str_wf) > 1L) { stop2("All responses should use the same", "weights if 'rescor' is estimated.") } out$adforms$weights <- weight_forms[[1]] } miforms <- rmNULL(lapply(x$terms, function(x) x$adforms$mi)) if (length(miforms)) { out$adforms$mi <- miforms[[1]] } out } # names of supported term types all_term_types <- function() { c("fe", "re", "sp", "cs", "sm", "gp", "ac", "offset") } # avoid ambiguous parameter names # @param names names to check for ambiguity # @param bterms a brmsterms object avoid_dpars <- function(names, bterms) { dpars <- c(names(bterms$dpars), "sp", "cs") if (length(dpars)) { dpars_prefix <- paste0("^", dpars, "_") invalid <- any(ulapply(dpars_prefix, grepl, names)) if (invalid) { dpars <- paste0("'", dpars, "_'", collapse = ", ") stop2("Variable names starting with ", dpars, " are not allowed for this model.") } } invisible(NULL) } vars_prefix <- function() { c("dpar", "resp", "nlpar") } # check and tidy parameter prefixes check_prefix <- function(x, keep_mu = FALSE) { vpx <- vars_prefix() if (is.data.frame(x) && nrow(x) == 0) { # avoids a bug in data.frames with zero rows x <- list() } x[setdiff(vpx, names(x))] <- "" x <- x[vpx] for (i in seq_along(x)) { x[[i]] <- as.character(x[[i]]) if (!length(x[[i]])) { x[[i]] <- "" } x[[i]] <- ifelse( !keep_mu & names(x)[i] == "dpar" & x[[i]] %in% "mu", yes = "", no = x[[i]] ) x[[i]] <- ifelse( keep_mu & names(x)[i] == "dpar" & x[[i]] %in% "", yes = "mu", no = x[[i]] ) } x } # combined parameter prefixes # @param prefix object from which to extract prefixes # @param keep_mu keep the 'mu' prefix if available or remove it? # @param nlp include the 'nlp' prefix for non-linear parameters? combine_prefix <- function(prefix, keep_mu = FALSE, nlp = FALSE) { prefix <- check_prefix(prefix, keep_mu = keep_mu) if (is_nlpar(prefix) && nlp) { prefix$dpar <- "nlp" } prefix <- lapply(prefix, usc) sub("^_", "", do_call(paste0, prefix)) } # check validity of fixed distributional parameters check_fdpars <- function(x) { stopifnot(is.null(x) || is.list(x)) pos_pars <- c( "sigma", "shape", "nu", "phi", "kappa", "beta", "disc", "bs", "ndt", "theta" ) prob_pars <- c("zi", "hu", "bias", "quantile") for (dp in names(x)) { apc <- dpar_class(dp) value <- x[[dp]]$value if (apc %in% pos_pars && value < 0) { stop2("Parameter '", dp, "' must be positive.") } if (apc %in% prob_pars && (value < 0 || value > 1)) { stop2("Parameter '", dp, "' must be between 0 and 1.") } } invisible(TRUE) } # combine all variables in one formuula # @param x (list of) formulas or character strings # @return a formula with all variables on the right-hand side allvars_formula <- function(...) { out <- rmNULL(c(...)) out <- collapse(ulapply(out, plus_rhs)) all_vars <- all_vars(out) invalid_vars <- setdiff(all_vars, make.names(all_vars)) if (length(invalid_vars)) { stop2("The following variable names are invalid: ", collapse_comma(invalid_vars)) } out <- str2formula(c(out, all_vars)) update(out, ~ .) } # conveniently extract a formula of all relevant variables # @param x any object from which to extract 'allvars' # @param type predictor type; requires a 'parse_' function # @return a formula with all variables on the right-hand side # or NULL if 'allvars' cannot be found get_allvars <- function(x, type = "") { out <- attr(x, "allvars", TRUE) if (is.null(out) && "allvars" %in% names(x)) { out <- x[["allvars"]] } if (is.null(out) && is.formula(x)) { type <- as_one_character(type) type <- str_if(nzchar(type), type, "fe") parse_fun <- get(paste0("parse_", type), mode = "function") out <- attr(parse_fun(x), "allvars") } stopifnot(is.null(out) || is.formula(out)) out } # add 'x' to the right-hand side of a formula plus_rhs <- function(x) { if (is.formula(x)) { x <- sub("^[^~]*~", "", formula2str(x)) } if (length(x) && all(nzchar(x))) { out <- paste0(" + ", paste(x, collapse = "+")) } else { out <- " + 1" } out } # combine formulas for distributional parameters # @param formula1 primary formula from which to take the RHS # @param formula2 secondary formula used to update the RHS of formula1 # @param lhs character string to define the left-hand side of the output # @param update a flag to indicate whether updating should be allowed. # Defaults to FALSE to maintain backwards compatibility # @return a formula object combine_formulas <- function(formula1, formula2, lhs, update = FALSE) { stopifnot(is.formula(formula1)) stopifnot(is.null(formula2) || is.formula(formula2)) lhs <- as_one_character(lhs) update <- as_one_logical(update) if (is.null(formula2)) { rhs <- str_rhs(formula1) att <- attributes(formula1) } else if (update && has_terms(formula1)) { # TODO: decide about intuitive updating behavior if (get_nl(formula1) || get_nl(formula2)) { stop2("Cannot combine non-linear formulas.") } old_formula <- eval2(paste0("~ ", str_rhs(formula1))) new_formula <- eval2(paste0("~ . + ", str_rhs(formula2))) rhs <- str_rhs(update(old_formula, new_formula)) att <- attributes(formula1) att[names(attributes(formula2))] <- attributes(formula2) } else { rhs <- str_rhs(formula2) att <- attributes(formula2) } out <- eval2(paste0(lhs, " ~ ", rhs)) attributes(out)[names(att)] <- att out } # does the formula contain any terms? # @return TRUE or FALSE has_terms <- function(formula) { stopifnot(is.formula(formula)) terms <- try(terms(rhs(formula)), silent = TRUE) is(terms, "try-error") || length(attr(terms, "term.labels")) || length(attr(terms, "offset")) } # indicate if the predictor term belongs to a non-linear parameter is_nlpar <- function(x) { isTRUE(nzchar(x[["nlpar"]])) } # indicate if the intercept should be removed no_int <- function(x) { isFALSE(attr(x, "int", exact = TRUE)) } # indicate if cell mean coding should be disabled no_cmc <- function(x) { isFALSE(attr(x, "cmc", exact = TRUE)) } # indicate if centering of the design matrix should be disabled no_center <- function(x) { isFALSE(attr(x, "center", exact = TRUE)) } # indicate if the design matrix should be handled as sparse is_sparse <- function(x) { isTRUE(attr(x, "sparse", exact = TRUE)) } # get the decomposition type of the design matrix get_decomp <- function(x) { out <- attr(x, "decomp", exact = TRUE) if (is.null(out)) { out <- "none" } as_one_character(out) } # extract different types of effects get_effect <- function(x, ...) { UseMethod("get_effect") } #' @export get_effect.default <- function(x, ...) { NULL } #' @export get_effect.brmsfit <- function(x, ...) { get_effect(x$formula, ...) } #' @export get_effect.brmsformula <- function(x, ...) { get_effect(parse_bf(x), ...) } #' @export get_effect.mvbrmsformula <- function(x, ...) { get_effect(parse_bf(x), ...) } #' @export get_effect.mvbrmsterms <- function(x, ...) { ulapply(x$terms, get_effect, recursive = FALSE, ...) } # extract formulas of a certain effect type # @param target effect type to return # @param all logical; include effects of nlpars and dpars? # @return a list of formulas #' @export get_effect.brmsterms <- function(x, target = "fe", all = TRUE, ...) { if (all) { out <- named_list(c(names(x$dpars), names(x$nlpars))) for (dp in names(x$dpars)) { out[[dp]] <- get_effect(x$dpars[[dp]], target = target) } for (nlp in names(x$nlpars)) { out[[nlp]] <- get_effect(x$nlpars[[nlp]], target = target) } } else { out <- get_effect(x$dpars[["mu"]], target = target) } unlist(out, recursive = FALSE) } #' @export get_effect.btl <- function(x, target = "fe", ...) { x[[target]] } #' @export get_effect.btnl <- function(x, target = "fe", ...) { NULL } all_terms <- function(x) { if (!length(x)) { return(character(0)) } if (!inherits(x, "terms")) { x <- terms(as.formula(x)) } rm_wsp(attr(x, "term.labels")) } # generate a regular expression to extract special terms # @param type one or more special term types to be extracted regex_sp <- function(type = "all") { choices <- c("all", "sp", "sm", "gp", "cs", "mmc", "ac", all_sp_types()) type <- unique(match.arg(type, choices, several.ok = TRUE)) funs <- c( sm = "(s|(t2)|(te)|(ti))", gp = "gp", cs = "cse?", mmc = "mmc", ac = "((arma)|(ar)|(ma)|(cosy)|(sar)|(car)|(fcor))" ) funs[all_sp_types()] <- all_sp_types() if ("sp" %in% type) { # allows extracting all 'sp' terms at once type <- setdiff(type, "sp") type <- union(type, all_sp_types()) } if ("all" %in% type) { # allows extracting all special terms at once type <- names(funs) } funs <- funs[type] allow_colon <- c("cs", "mmc") inner <- ifelse(names(funs) %in% allow_colon, ".*", "[^:]*") out <- paste0("^(", funs, ")\\(", inner, "\\)$") paste0("(", out, ")", collapse = "|") } # find special terms of a certain type # @param x formula object of character vector from which to extract terms # @param type special terms type to be extracted. see regex_sp() # @param complete check if terms consist completely of single special terms? # @param ranef include group-level terms? # @return a character vector of matching terms find_terms <- function(x, type, complete = TRUE, ranef = FALSE) { if (is.formula(x)) { x <- all_terms(x) } else { x <- as.character(x) } complete <- as_one_logical(complete) ranef <- as_one_logical(ranef) regex <- regex_sp(type) is_match <- grepl_expr(regex, x) if (!ranef) { is_match <- is_match & !grepl("\\|", x) } out <- x[is_match] if (complete) { matches <- lapply(out, get_matches_expr, pattern = regex) # each term may contain only one special function call inv <- out[lengths(matches) > 1L] if (!length(inv)) { # each term must be exactly equal to the special function call inv <- out[rm_wsp(unlist(matches)) != out] } if (length(inv)) { stop2("The term '", inv[1], "' is invalid in brms syntax.") } } out } # validate a terms object (or one that can be coerced to it) # for use primarily in 'get_model_matrix' # @param x any R object # @return a (possibly amended) terms object or NULL # if 'x' could not be coerced to a terms object validate_terms <- function(x) { no_int <- no_int(x) no_cmc <- no_cmc(x) if (is.formula(x) && !inherits(x, "terms")) { x <- terms(x) } if (!inherits(x, "terms")) { return(NULL) } if (no_int || !has_intercept(x) && no_cmc) { # allows to remove the intercept without causing cell mean coding attr(x, "intercept") <- 1 attr(x, "int") <- FALSE } x } # checks if the formula contains an intercept has_intercept <- function(formula) { formula <- as.formula(formula) try_terms <- try(terms(formula), silent = TRUE) if (is(try_terms, "try-error")) { out <- FALSE } else { out <- as.logical(attr(try_terms, "intercept")) } out } # check if model makes use of the reserved intercept variables has_rsv_intercept <- function(formula) { formula <- try(as.formula(formula), silent = TRUE) if (is(formula, "try-error")) { out <- FALSE } else { try_terms <- try(terms(formula), silent = TRUE) if (is(try_terms, "try-error")) { out <- FALSE } else { has_intercept <- attr(try_terms, "intercept") intercepts <- c("intercept", "Intercept") out <- !has_intercept && any(intercepts %in% all_vars(rhs(formula))) } } out } # names of reserved variables rsv_vars <- function(bterms) { stopifnot(is.brmsterms(bterms) || is.mvbrmsterms(bterms)) .rsv_vars <- function(x) { rsv_int <- any(ulapply(x$dpars, has_rsv_intercept)) if (rsv_int) c("intercept", "Intercept") else NULL } if (is.mvbrmsterms(bterms)) { out <- unique(ulapply(bterms$terms, .rsv_vars)) } else { out <- .rsv_vars(bterms) } out } # check if category specific effects are present in the model has_cs <- function(bterms) { length(get_effect(bterms, target = "cs")) > 0L || any(get_re(bterms)$type %in% "cs") } # extract elements from objects # @param x object from which to extract elements # @param name name of the element to be extracted get_element <- function(x, name, ...) { UseMethod("get_element") } #' @export get_element.default <- function(x, name, ...) { x[[name]] } #' @export get_element.mvbrmsformula <- function(x, name, ...) { lapply(x$forms, get_element, name = name, ...) } #' @export get_element.mvbrmsterms <- function(x, name, ...) { lapply(x$terms, get_element, name = name, ...) } brms/R/log_lik.R0000644000176200001440000010147313620514126013167 0ustar liggesusers#' Compute the Pointwise Log-Likelihood #' #' @aliases log_lik logLik.brmsfit #' #' @param object A fitted model object of class \code{brmsfit}. #' @inheritParams posterior_predict.brmsfit #' @param combine Only relevant in multivariate models. #' Indicates if the log-likelihoods of the submodels should #' be combined per observation (i.e. added together; the default) #' or if the log-likelihoods should be returned separately. #' @param pointwise A flag indicating whether to compute the full #' log-likelihood matrix at once (the default), or just return #' the likelihood function along with all data and samples #' required to compute the log-likelihood separately for each #' observation. The latter option is rarely useful when #' calling \code{log_lik} directly, but rather when computing #' \code{\link{waic}} or \code{\link{loo}}. #' @param add_point_draws For internal use only. Ensures compatibility with the #' \code{\link{loo_subsample}} method. #' #' @return Usually, an S x N matrix containing the pointwise log-likelihood #' samples, where S is the number of samples and N is the number #' of observations in the data. For multivariate models and if #' \code{combine} is \code{FALSE}, an S x N x R array is returned, #' where R is the number of response variables. #' If \code{pointwise = TRUE}, the output is a function #' with a \code{draws} attribute containing all relevant #' data and posterior samples. #' #' @aliases log_lik #' @method log_lik brmsfit #' @export #' @export log_lik #' @importFrom rstantools log_lik log_lik.brmsfit <- function(object, newdata = NULL, re_formula = NULL, resp = NULL, nsamples = NULL, subset = NULL, pointwise = FALSE, combine = TRUE, add_point_draws = FALSE, ...) { pointwise <- as_one_logical(pointwise) combine <- as_one_logical(combine) add_point_draws <- as_one_logical(add_point_draws) contains_samples(object) object <- restructure(object) draws <- extract_draws( object, newdata = newdata, re_formula = re_formula, resp = resp, subset = subset, nsamples = nsamples, check_response = TRUE, ... ) if (add_point_draws) { # required for the loo_subsample method # Computing a point estimate based on the full draws object is too # difficult due to its highly nested structure. As an alternative, a second # draws object is created from the point estimates of the samples directly. attr(draws, "point_draws") <- extract_draws( object, newdata = newdata, re_formula = re_formula, resp = resp, subset = subset, nsamples = nsamples, check_response = TRUE, point = "median", ... ) } if (pointwise) { stopifnot(combine) log_lik <- log_lik_pointwise attr(log_lik, "draws") <- draws attr(log_lik, "data") <- data.frame(i = seq_len(choose_N(draws))) } else { log_lik <- log_lik(draws, combine = combine) if (anyNA(log_lik)) { warning2( "NAs were found in the log-likelihood. Possibly this is because ", "some of your responses contain NAs. If you use 'mi' terms, try ", "setting 'resp' to those response variables without missing values. ", "Alternatively, use 'newdata' to predict only complete cases." ) } } log_lik } #' @export logLik.brmsfit <- function(object, newdata = NULL, re_formula = NULL, resp = NULL, nsamples = NULL, subset = NULL, pointwise = FALSE, combine = TRUE, ...) { cl <- match.call() cl[[1]] <- quote(log_lik) eval(cl, parent.frame()) } #' @export log_lik.mvbrmsdraws <- function(object, combine = TRUE, ...) { if (length(object$mvpars$rescor)) { object$mvpars$Mu <- get_Mu(object) object$mvpars$Sigma <- get_Sigma(object) out <- log_lik.brmsdraws(object, ...) } else { out <- lapply(object$resps, log_lik, ...) if (combine) { out <- Reduce("+", out) } else { along <- ifelse(length(out) > 1L, 3, 2) out <- do_call(abind, c(out, along = along)) } } out } #' @export log_lik.brmsdraws <- function(object, ...) { log_lik_fun <- paste0("log_lik_", object$family$fun) log_lik_fun <- get(log_lik_fun, asNamespace("brms")) for (nlp in names(object$nlpars)) { object$nlpars[[nlp]] <- get_nlpar(object, nlpar = nlp) } for (dp in names(object$dpars)) { object$dpars[[dp]] <- get_dpar(object, dpar = dp) } N <- choose_N(object) out <- cblapply(seq_len(N), log_lik_fun, draws = object) colnames(out) <- NULL old_order <- object$old_order sort <- isTRUE(ncol(out) != length(old_order)) reorder_obs(out, old_order, sort = sort) } # evaluate log_lik in a pointwise manner # cannot be an S3 method since 'i' must be the first argument log_lik_pointwise <- function(data_i, draws, ...) { i <- data_i$i if (is.mvbrmsdraws(draws) && !length(draws$mvpars$rescor)) { out <- lapply(draws$resps, log_lik_pointwise, i = i) out <- Reduce("+", out) } else { log_lik_fun <- paste0("log_lik_", draws$family$fun) log_lik_fun <- get(log_lik_fun, asNamespace("brms")) out <- log_lik_fun(i, draws) } out } # All log_lik_ functions have the same arguments structure # @param i the column of draws to use the the ith obervation # in the initial data.frame # @param draws A named list returned by extract_draws containing # all required data and samples # @param data (ignored) included for compatibility with loo::loo.function # @return a vector of length draws$nsamples containing the pointwise # log-likelihood fo the ith observation log_lik_gaussian <- function(i, draws, data = data.frame()) { args <- list( mean = get_dpar(draws, "mu", i = i), sd = get_dpar(draws, "sigma", i = i) ) # log_lik_censor computes the conventional log_lik in case of no censoring out <- log_lik_censor(dist = "norm", args = args, i = i, draws = draws) out <- log_lik_truncate( out, cdf = pnorm, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_student <- function(i, draws, data = data.frame()) { args <- list( df = get_dpar(draws, "nu", i = i), mu = get_dpar(draws, "mu", i = i), sigma = get_dpar(draws, "sigma", i = i) ) out <- log_lik_censor( dist = "student_t", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pstudent_t, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_lognormal <- function(i, draws, data = data.frame()) { sigma <- get_dpar(draws, "sigma", i = i) args <- list(meanlog = get_dpar(draws, "mu", i), sdlog = sigma) out <- log_lik_censor(dist = "lnorm", args = args, i = i, draws = draws) out <- log_lik_truncate( out, cdf = plnorm, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_shifted_lognormal <- function(i, draws, data = data.frame()) { sigma <- get_dpar(draws, "sigma", i = i) ndt <- get_dpar(draws, "ndt", i = i) args <- list(meanlog = get_dpar(draws, "mu", i), sdlog = sigma, shift = ndt) out <- log_lik_censor("shifted_lnorm", args, i = i, draws = draws) out <- log_lik_truncate(out, pshifted_lnorm, args, i = i, draws = draws) log_lik_weight(out, i = i, draws = draws) } log_lik_skew_normal <- function(i, draws, data = data.frame()) { sigma <- get_dpar(draws, "sigma", i = i) alpha <- get_dpar(draws, "alpha", i = i) mu <- get_dpar(draws, "mu", i) args <- nlist(mu, sigma, alpha) out <- log_lik_censor( dist = "skew_normal", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pskew_normal, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_gaussian_mv <- function(i, draws, data = data.frame()) { Mu <- get_Mu(draws, i = i) Sigma <- get_Sigma(draws, i = i) dmn <- function(s) { dmulti_normal( draws$data$Y[i, ], mu = Mu[s, ], Sigma = Sigma[s, , ], log = TRUE ) } out <- sapply(1:draws$nsamples, dmn) log_lik_weight(out, i = i, draws = draws) } log_lik_student_mv <- function(i, draws, data = data.frame()) { nu <- get_dpar(draws, "nu", i = i) Mu <- get_Mu(draws, i = i) Sigma <- get_Sigma(draws, i = i) dmst <- function(s) { dmulti_student_t( draws$data$Y[i, ], df = nu[s], mu = Mu[s, ], Sigma = Sigma[s, , ], log = TRUE ) } out <- sapply(1:draws$nsamples, dmst) log_lik_weight(out, i = i, draws = draws) } log_lik_gaussian_time <- function(i, draws, data = data.frame()) { obs <- with(draws$ac, begin_tg[i]:end_tg[i]) Y <- as.numeric(draws$data$Y[obs]) mu <- as.matrix(get_dpar(draws, "mu", i = obs)) Sigma <- get_cov_matrix_ac(draws, obs) .log_lik <- function(s) { C <- as.matrix(Sigma[s, , ]) Cinv <- solve(C) e <- Y - mu[s, ] g <- solve(C, e) cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar) ll <- dnorm(Y, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_student_time <- function(i, draws, data = data.frame()) { obs <- with(draws$ac, begin_tg[i]:end_tg[i]) Y <- as.numeric(draws$data$Y[obs]) nu <- as.matrix(get_dpar(draws, "nu", i = obs)) mu <- as.matrix(get_dpar(draws, "mu", i = obs)) Sigma <- get_cov_matrix_ac(draws, obs) .log_lik <- function(s) { df <- nu[s, ] C <- as.matrix(Sigma[s, , ]) Cinv <- solve(C) e <- Y - mu[s, ] g <- solve(C, e) cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar * student_t_cov_factor(df, Cinv, e)) dfloo <- df + nrow(Cinv) - 1 ll <- dstudent_t(Y, dfloo, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_gaussian_lagsar <- function(i, draws, data = data.frame()) { mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") Y <- as.numeric(draws$data$Y) I <- diag(draws$nobs) stopifnot(i == 1) # see http://mc-stan.org/loo/articles/loo2-non-factorizable.html .log_lik <- function(s) { IB <- I - with(draws$ac, lagsar[s, ] * Msar) Cinv <- t(IB) %*% IB / sigma[s]^2 e <- Y - solve(IB, mu[s, ]) g <- Cinv %*% e cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar) ll <- dnorm(Y, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_student_lagsar <- function(i, draws, data = data.frame()) { nu <- get_dpar(draws, "nu") mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") Y <- as.numeric(draws$data$Y) I <- diag(draws$nobs) stopifnot(i == 1) # see http://mc-stan.org/loo/articles/loo2-non-factorizable.html .log_lik <- function(s) { df <- nu[s] IB <- I - with(draws$ac, lagsar[s, ] * Msar) Cinv <- t(IB) %*% IB / sigma[s]^2 e <- Y - solve(IB, mu[s, ]) g <- Cinv %*% e cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar * student_t_cov_factor(df, Cinv, e)) dfloo <- df + nrow(Cinv) - 1 ll <- dstudent_t(Y, dfloo, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_gaussian_errorsar <- function(i, draws, data = data.frame()) { stopifnot(i == 1) mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") Y <- as.numeric(draws$data$Y) I <- diag(draws$nobs) .log_lik <- function(s) { IB <- I - with(draws$ac, errorsar[s, ] * Msar) Cinv <- t(IB) %*% IB / sigma[s]^2 e <- Y - mu[s, ] g <- Cinv %*% e cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar) ll <- dnorm(Y, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_student_errorsar <- function(i, draws, data = data.frame()) { stopifnot(i == 1) nu <- get_dpar(draws, "nu") mu <- get_dpar(draws, "mu") sigma <- get_dpar(draws, "sigma") Y <- as.numeric(draws$data$Y) I <- diag(draws$nobs) .log_lik <- function(s) { df <- nu[s] IB <- I - with(draws$ac, errorsar[s, ] * Msar) Cinv <- t(IB) %*% IB / sigma[s]^2 e <- Y - mu[s, ] g <- Cinv %*% e cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar * student_t_cov_factor(df, Cinv, e)) dfloo <- df + nrow(Cinv) - 1 ll <- dstudent_t(Y, dfloo, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_gaussian_fcor <- function(i, draws, data = data.frame()) { stopifnot(i == 1) Y <- as.numeric(draws$data$Y) mu <- get_dpar(draws, "mu") Sigma <- get_cov_matrix_ac(draws) .log_lik <- function(s) { C <- as.matrix(Sigma[s, , ]) Cinv <- solve(C) e <- Y - mu[s, ] g <- solve(C, e) cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar) ll <- dnorm(Y, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_student_fcor <- function(i, draws, data = data.frame()) { stopifnot(i == 1) Y <- as.numeric(draws$data$Y) nu <- get_dpar(draws, "nu") mu <- get_dpar(draws, "mu") Sigma <- get_cov_matrix_ac(draws) .log_lik <- function(s) { df <- nu[s] C <- as.matrix(Sigma[s, , ]) Cinv <- solve(C) e <- Y - mu[s, ] g <- solve(C, e) cbar <- diag(Cinv) yloo <- Y - g / cbar sdloo <- sqrt(1 / cbar * student_t_cov_factor(df, Cinv, e)) dfloo <- df + nrow(Cinv) - 1 ll <- dstudent_t(Y, dfloo, yloo, sdloo, log = TRUE) return(as.numeric(ll)) } rblapply(seq_len(draws$nsamples), .log_lik) } log_lik_binomial <- function(i, draws, data = data.frame()) { trials <- draws$data$trials[i] args <- list(size = trials, prob = get_dpar(draws, "mu", i)) out <- log_lik_censor( dist = "binom", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pbinom, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_bernoulli <- function(i, draws, data = data.frame()) { args <- list(size = 1, prob = get_dpar(draws, "mu", i)) out <- log_lik_censor( dist = "binom", args = args, i = i, draws = draws ) # no truncation allowed log_lik_weight(out, i = i, draws = draws) } log_lik_poisson <- function(i, draws, data = data.frame()) { args <- list(lambda = get_dpar(draws, "mu", i)) out <- log_lik_censor( dist = "pois", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = ppois, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_negbinomial <- function(i, draws, data = data.frame()) { shape <- get_dpar(draws, "shape", i = i) args <- list(mu = get_dpar(draws, "mu", i), size = shape) out <- log_lik_censor( dist = "nbinom", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pnbinom, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_geometric <- function(i, draws, data = data.frame()) { args <- list(mu = get_dpar(draws, "mu", i), size = 1) out <- log_lik_censor( dist = "nbinom", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pnbinom, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_discrete_weibull <- function(i, draws, data = data.frame()) { args <- list( mu = get_dpar(draws, "mu", i), shape = get_dpar(draws, "shape", i = i) ) out <- log_lik_censor( dist = "discrete_weibull", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pdiscrete_weibull, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_com_poisson <- function(i, draws, data = data.frame()) { args <- list( mu = get_dpar(draws, "mu", i), shape = get_dpar(draws, "shape", i = i) ) # no censoring or truncation allowed yet out <- do_call(dcom_poisson, c(draws$data$Y[i], args, log = TRUE)) log_lik_weight(out, i = i, draws = draws) } log_lik_exponential <- function(i, draws, data = data.frame()) { args <- list(rate = 1 / get_dpar(draws, "mu", i)) out <- log_lik_censor(dist = "exp", args = args, i = i, draws = draws) out <- log_lik_truncate( out, cdf = pexp, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_gamma <- function(i, draws, data = data.frame()) { shape <- get_dpar(draws, "shape", i = i) scale <- get_dpar(draws, "mu", i) / shape args <- nlist(shape, scale) out <- log_lik_censor(dist = "gamma", args = args, i = i, draws = draws) out <- log_lik_truncate( out, cdf = pgamma, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_weibull <- function(i, draws, data = data.frame()) { shape <- get_dpar(draws, "shape", i = i) scale <- get_dpar(draws, "mu", i = i) / gamma(1 + 1 / shape) args <- list(shape = shape, scale = scale) out <- log_lik_censor( dist = "weibull", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pweibull, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_frechet <- function(i, draws, data = data.frame()) { nu <- get_dpar(draws, "nu", i = i) scale <- get_dpar(draws, "mu", i = i) / gamma(1 - 1 / nu) args <- list(scale = scale, shape = nu) out <- log_lik_censor( dist = "frechet", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pfrechet, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_gen_extreme_value <- function(i, draws, data = data.frame()) { sigma <- get_dpar(draws, "sigma", i = i) xi <- get_dpar(draws, "xi", i = i) mu <- get_dpar(draws, "mu", i) args <- nlist(mu, sigma, xi) out <- log_lik_censor(dist = "gen_extreme_value", args = args, i = i, draws = draws) out <- log_lik_truncate(out, cdf = pgen_extreme_value, args = args, i = i, draws = draws) log_lik_weight(out, i = i, draws = draws) } log_lik_inverse.gaussian <- function(i, draws, data = data.frame()) { args <- list(mu = get_dpar(draws, "mu", i), shape = get_dpar(draws, "shape", i = i)) out <- log_lik_censor(dist = "inv_gaussian", args = args, i = i, draws = draws) out <- log_lik_truncate(out, cdf = pinv_gaussian, args = args, i = i, draws = draws) log_lik_weight(out, i = i, draws = draws) } log_lik_exgaussian <- function(i, draws, data = data.frame()) { args <- list(mu = get_dpar(draws, "mu", i), sigma = get_dpar(draws, "sigma", i = i), beta = get_dpar(draws, "beta", i = i)) out <- log_lik_censor(dist = "exgaussian", args = args, i = i, draws = draws) out <- log_lik_truncate(out, cdf = pexgaussian, args = args, i = i, draws = draws) log_lik_weight(out, i = i, draws = draws) } log_lik_wiener <- function(i, draws, data = data.frame()) { args <- list( delta = get_dpar(draws, "mu", i), alpha = get_dpar(draws, "bs", i = i), tau = get_dpar(draws, "ndt", i = i), beta = get_dpar(draws, "bias", i = i), resp = draws$data[["dec"]][i] ) out <- do_call(dwiener, c(draws$data$Y[i], args, log = TRUE)) log_lik_weight(out, i = i, draws = draws) } log_lik_beta <- function(i, draws, data = data.frame()) { mu <- get_dpar(draws, "mu", i) phi <- get_dpar(draws, "phi", i) args <- list(shape1 = mu * phi, shape2 = (1 - mu) * phi) out <- log_lik_censor(dist = "beta", args = args, i = i, draws = draws) out <- log_lik_truncate( out, cdf = pbeta, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_von_mises <- function(i, draws, data = data.frame()) { args <- list( mu = get_dpar(draws, "mu", i), kappa = get_dpar(draws, "kappa", i = i) ) out <- log_lik_censor( dist = "von_mises", args = args, i = i, draws = draws ) out <- log_lik_truncate( out, cdf = pvon_mises, args = args, i = i, draws = draws ) log_lik_weight(out, i = i, draws = draws) } log_lik_asym_laplace <- function(i, draws, ...) { args <- list( mu = get_dpar(draws, "mu", i), sigma = get_dpar(draws, "sigma", i), quantile = get_dpar(draws, "quantile", i) ) out <- log_lik_censor(dist = "asym_laplace", args, i, draws) out <- log_lik_truncate(out, pasym_laplace, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_zero_inflated_asym_laplace <- function(i, draws, ...) { args <- list( mu = get_dpar(draws, "mu", i), sigma = get_dpar(draws, "sigma", i), quantile = get_dpar(draws, "quantile", i), zi = get_dpar(draws, "zi", i) ) out <- log_lik_censor(dist = "zero_inflated_asym_laplace", args, i, draws) out <- log_lik_truncate(out, pzero_inflated_asym_laplace, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_cox <- function(i, draws, ...) { args <- list( mu = get_dpar(draws, "mu", i), bhaz = draws$bhaz$bhaz[, i], cbhaz = draws$bhaz$cbhaz[, i] ) out <- log_lik_censor(dist = "cox", args = args, i = i, draws = draws) out <- log_lik_truncate(out, cdf = pcox, args = args, i = i, draws = draws) log_lik_weight(out, i = i, draws = draws) } log_lik_hurdle_poisson <- function(i, draws, data = data.frame()) { hu <- get_dpar(draws, "hu", i) lambda <- get_dpar(draws, "mu", i) args <- nlist(lambda, hu) out <- log_lik_censor("hurdle_poisson", args, i, draws) out <- log_lik_truncate(out, phurdle_poisson, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_hurdle_negbinomial <- function(i, draws, data = data.frame()) { hu <- get_dpar(draws, "hu", i) mu <- get_dpar(draws, "mu", i) shape <- get_dpar(draws, "shape", i = i) args <- nlist(mu, shape, hu) out <- log_lik_censor("hurdle_negbinomial", args, i, draws) out <- log_lik_truncate(out, phurdle_negbinomial, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_hurdle_gamma <- function(i, draws, data = data.frame()) { hu <- get_dpar(draws, "hu", i) shape <- get_dpar(draws, "shape", i = i) scale <- get_dpar(draws, "mu", i) / shape args <- nlist(shape, scale, hu) out <- log_lik_censor("hurdle_gamma", args, i, draws) out <- log_lik_truncate(out, phurdle_gamma, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_hurdle_lognormal <- function(i, draws, data = data.frame()) { hu <- get_dpar(draws, "hu", i) mu <- get_dpar(draws, "mu", i) sigma <- get_dpar(draws, "sigma", i = i) args <- nlist(mu, sigma, hu) out <- log_lik_censor("hurdle_lognormal", args, i, draws) out <- log_lik_truncate(out, phurdle_lognormal, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_zero_inflated_poisson <- function(i, draws, data = data.frame()) { zi <- get_dpar(draws, "zi", i) lambda <- get_dpar(draws, "mu", i) args <- nlist(lambda, zi) out <- log_lik_censor("zero_inflated_poisson", args, i, draws) out <- log_lik_truncate(out, pzero_inflated_poisson, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_zero_inflated_negbinomial <- function(i, draws, data = data.frame()) { zi <- get_dpar(draws, "zi", i) mu <- get_dpar(draws, "mu", i) shape <- get_dpar(draws, "shape", i = i) args <- nlist(mu, shape, zi) out <- log_lik_censor("zero_inflated_negbinomial", args, i, draws) out <- log_lik_truncate(out, pzero_inflated_negbinomial, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_zero_inflated_binomial <- function(i, draws, data = data.frame()) { trials <- draws$data$trials[i] mu <- get_dpar(draws, "mu", i) zi <- get_dpar(draws, "zi", i) args <- list(size = trials, prob = mu, zi) out <- log_lik_censor("zero_inflated_binomial", args, i, draws) out <- log_lik_truncate(out, pzero_inflated_binomial, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_zero_inflated_beta <- function(i, draws, data = data.frame()) { zi <- get_dpar(draws, "zi", i) mu <- get_dpar(draws, "mu", i) phi <- get_dpar(draws, "phi", i) args <- nlist(shape1 = mu * phi, shape2 = (1 - mu) * phi, zi) out <- log_lik_censor("zero_inflated_beta", args, i, draws) out <- log_lik_truncate(out, pzero_inflated_beta, args, i, draws) log_lik_weight(out, i = i, draws = draws) } log_lik_zero_one_inflated_beta <- function(i, draws, data = data.frame()) { zoi <- get_dpar(draws, "zoi", i) coi <- get_dpar(draws, "coi", i) if (draws$data$Y[i] %in% c(0, 1)) { out <- dbinom(1, size = 1, prob = zoi, log = TRUE) + dbinom(draws$data$Y[i], size = 1, prob = coi, log = TRUE) } else { phi <- get_dpar(draws, "phi", i) mu <- get_dpar(draws, "mu", i) args <- list(shape1 = mu * phi, shape2 = (1 - mu) * phi) out <- dbinom(0, size = 1, prob = zoi, log = TRUE) + do_call(dbeta, c(draws$data$Y[i], args, log = TRUE)) } log_lik_weight(out, i = i, draws = draws) } log_lik_categorical <- function(i, draws, data = data.frame()) { stopifnot(draws$family$link == "logit") eta <- sapply(names(draws$dpars), get_dpar, draws = draws, i = i) eta <- insert_refcat(eta, family = draws$family) out <- dcategorical(draws$data$Y[i], eta = eta, log = TRUE) log_lik_weight(out, i = i, draws = draws) } log_lik_multinomial <- function(i, draws, data = data.frame()) { stopifnot(draws$family$link == "logit") eta <- sapply(names(draws$dpars), get_dpar, draws = draws, i = i) eta <- insert_refcat(eta, family = draws$family) out <- dmultinomial(draws$data$Y[i, ], eta = eta, log = TRUE) log_lik_weight(out, i = i, draws = draws) } log_lik_dirichlet <- function(i, draws, data = data.frame()) { stopifnot(draws$family$link == "logit") mu_dpars <- str_subset(names(draws$dpars), "^mu") eta <- sapply(mu_dpars, get_dpar, draws = draws, i = i) eta <- insert_refcat(eta, family = draws$family) phi <- get_dpar(draws, "phi", i = i) cats <- seq_len(draws$data$ncat) alpha <- dcategorical(cats, eta = eta) * phi out <- ddirichlet(draws$data$Y[i, ], alpha = alpha, log = TRUE) log_lik_weight(out, i = i, draws = draws) } log_lik_cumulative <- function(i, draws, data = data.frame()) { disc <- get_dpar(draws, "disc", i = i) mu <- get_dpar(draws, "mu", i = i) thres <- subset_thres(draws, i) nthres <- NCOL(thres) eta <- disc * (thres - mu) y <- draws$data$Y[i] if (y == 1) { out <- log(ilink(eta[, 1], draws$family$link)) } else if (y == nthres + 1) { out <- log(1 - ilink(eta[, y - 1], draws$family$link)) } else { out <- log( ilink(eta[, y], draws$family$link) - ilink(eta[, y - 1], draws$family$link) ) } log_lik_weight(out, i = i, draws = draws) } log_lik_sratio <- function(i, draws, data = data.frame()) { disc <- get_dpar(draws, "disc", i = i) mu <- get_dpar(draws, "mu", i = i) thres <- subset_thres(draws, i) nthres <- NCOL(thres) eta <- disc * (thres - mu) y <- draws$data$Y[i] q <- sapply(seq_len(min(y, nthres)), function(k) 1 - ilink(eta[, k], draws$family$link) ) if (y == 1) { out <- log(1 - q[, 1]) } else if (y == 2) { out <- log(1 - q[, 2]) + log(q[, 1]) } else if (y == nthres + 1) { out <- rowSums(log(q)) } else { out <- log(1 - q[, y]) + rowSums(log(q[, 1:(y - 1)])) } log_lik_weight(out, i = i, draws = draws) } log_lik_cratio <- function(i, draws, data = data.frame()) { disc <- get_dpar(draws, "disc", i = i) mu <- get_dpar(draws, "mu", i = i) thres <- subset_thres(draws, i) nthres <- NCOL(thres) eta <- disc * (mu - thres) y <- draws$data$Y[i] q <- sapply(seq_len(min(y, nthres)), function(k) ilink(eta[, k], draws$family$link) ) if (y == 1) { out <- log(1 - q[, 1]) } else if (y == 2) { out <- log(1 - q[, 2]) + log(q[, 1]) } else if (y == nthres + 1) { out <- rowSums(log(q)) } else { out <- log(1 - q[, y]) + rowSums(log(q[, 1:(y - 1)])) } log_lik_weight(out, i = i, draws = draws) } log_lik_acat <- function(i, draws, data = data.frame()) { disc <- get_dpar(draws, "disc", i = i) mu <- get_dpar(draws, "mu", i = i) thres <- subset_thres(draws, i) nthres <- NCOL(thres) eta <- disc * (mu - thres) y <- draws$data$Y[i] if (draws$family$link == "logit") { # more efficient calculation q <- sapply(1:nthres, function(k) eta[, k]) p <- cbind(rep(0, nrow(eta)), q[, 1], matrix(0, nrow = nrow(eta), ncol = nthres - 1)) if (nthres > 1L) { p[, 3:(nthres + 1)] <- sapply(3:(nthres + 1), function(k) rowSums(q[, 1:(k - 1)])) } out <- p[, y] - log(rowSums(exp(p))) } else { q <- sapply(1:nthres, function(k) ilink(eta[, k], draws$family$link)) p <- cbind(apply(1 - q[, 1:nthres], 1, prod), matrix(0, nrow = nrow(eta), ncol = nthres)) if (nthres > 1L) { p[, 2:nthres] <- sapply(2:nthres, function(k) apply(as.matrix(q[, 1:(k - 1)]), 1, prod) * apply(as.matrix(1 - q[, k:nthres]), 1, prod)) } p[, nthres + 1] <- apply(q[, 1:nthres], 1, prod) out <- log(p[, y]) - log(apply(p, 1, sum)) } log_lik_weight(out, i = i, draws = draws) } log_lik_custom <- function(i, draws, data = data.frame()) { log_lik_fun <- draws$family$log_lik if (!is.function(log_lik_fun)) { log_lik_fun <- paste0("log_lik_", draws$family$name) log_lik_fun <- get(log_lik_fun, draws$family$env) } log_lik_fun(i = i, draws = draws) } log_lik_mixture <- function(i, draws, data = data.frame()) { families <- family_names(draws$family) theta <- get_theta(draws, i = i) out <- array(NA, dim = dim(theta)) for (j in seq_along(families)) { log_lik_fun <- paste0("log_lik_", families[j]) log_lik_fun <- get(log_lik_fun, asNamespace("brms")) tmp_draws <- pseudo_draws_for_mixture(draws, j) out[, j] <- exp(log(theta[, j]) + log_lik_fun(i, tmp_draws)) } if (isTRUE(draws[["pp_mixture"]])) { out <- log(out) - log(rowSums(out)) } else { out <- log(rowSums(out)) } log_lik_weight(out, i = i, draws = draws) } # ----------- log_lik helper-functions ----------- # compute (possibly censored) log_lik values # @param dist name of a distribution for which the functions # d (pdf) and p (cdf) are available # @param args additional arguments passed to pdf and cdf # @param draws a brmsdraws object # @return vector of log_lik values log_lik_censor <- function(dist, args, i, draws) { pdf <- get(paste0("d", dist), mode = "function") cdf <- get(paste0("p", dist), mode = "function") y <- draws$data$Y[i] cens <- draws$data$cens[i] if (is.null(cens) || cens == 0) { x <- do_call(pdf, c(y, args, log = TRUE)) } else if (cens == 1) { x <- do_call(cdf, c(y, args, lower.tail = FALSE, log.p = TRUE)) } else if (cens == -1) { x <- do_call(cdf, c(y, args, log.p = TRUE)) } else if (cens == 2) { rcens <- draws$data$rcens[i] x <- log(do_call(cdf, c(rcens, args)) - do_call(cdf, c(y, args))) } x } # adjust log_lik in truncated models # @param x vector of log_lik values # @param cdf a cumulative distribution function # @param args arguments passed to cdf # @param i observation number # @param draws a brmsdraws object # @return vector of log_lik values log_lik_truncate <- function(x, cdf, args, i, draws) { lb <- draws$data$lb[i] ub <- draws$data$ub[i] if (!(is.null(lb) && is.null(ub))) { if (is.null(lb)) lb <- -Inf if (is.null(ub)) ub <- Inf x - log(do_call(cdf, c(ub, args)) - do_call(cdf, c(lb, args))) } x } # weight log_lik values according to defined weights # @param x vector of log_lik values # @param i observation number # @param draws a brmsdraws object # @return vector of log_lik values log_lik_weight <- function(x, i, draws) { weight <- draws$data$weights[i] if (!is.null(weight)) { x <- x * weight } x } # after some discussion with Aki Vehtari and Daniel Simpson, # I disallowed computation of log-likelihood values for some models # until pointwise solutions are implemented stop_no_pw <- function() { stop2("Cannot yet compute pointwise log-likelihood for this model ", "because the observations are not conditionally independent.") } # multiplicate factor for conditional student-t models # see http://proceedings.mlr.press/v33/shah14.pdf # note that brms parameterizes C instead of Cov(y) = df / (df - 2) * C # @param df degrees of freedom parameter # @param Cinv inverse of the full matrix # @param e vector of error terms, that is, y - mu student_t_cov_factor <- function(df, Cinv, e) { beta1 <- ulapply(seq_rows(Cinv), student_t_beta1_i, Cinv, e) (df + beta1) / (df + nrow(Cinv) - 1) } # beta1 in equation (6) of http://proceedings.mlr.press/v33/shah14.pdf # @param i observation index to exclude in the submatrix # @param Cinv inverse of the full matrix # @param e vector of error terms, that is, y - mu # @param vector of length one student_t_beta1_i <- function(i, Cinv, e) { sub_Cinv_i <- sub_inverse_symmetric(Cinv, i) t(e[-i]) %*% sub_Cinv_i %*% e[-i] } # efficient submatrix inverse for a symmetric matrix # see http://www.scielo.org.mx/pdf/cys/v20n2/1405-5546-cys-20-02-00251.pdf # @param Cinv inverse of the full matrix # @param i observation index to exclude in the submatrix # @return inverse of the submatrix after removing observation i sub_inverse_symmetric <- function(Cinv, i) { csub <- Cinv[i, -i] D <- outer(csub, csub) Cinv[-i, -i] - D / Cinv[i, i] } brms/R/exclude_pars.R0000644000176200001440000000660513616034534014233 0ustar liggesusers# list parameters NOT to be saved by Stan # @return a vector of parameter names to be excluded exclude_pars <- function(x, ...) { UseMethod("exclude_pars") } #' @export exclude_pars.default <- function(x, ...) { character(0) } # @param save_ranef save varying effects per level? # @param save_mevars save noise-free variables? # @param save_all_pars save all variables from the 'parameters' block? #' @export exclude_pars.brmsfit <- function(x, save_ranef = TRUE, save_mevars = FALSE, save_all_pars = FALSE, ...) { save_ranef <- as_one_logical(save_ranef) save_mevars <- as_one_logical(save_mevars) save_all_pars <- as_one_logical(save_all_pars) out <- character(0) bterms <- parse_bf(x$formula) c(out) <- exclude_pars( bterms, data = x$data, save_ranef = save_ranef, save_all_pars = save_all_pars, save_mevars = save_mevars, ... ) meef <- tidy_meef(bterms, x$data) if (nrow(meef)) { I <- seq_along(unique(meef$grname)) K <- seq_rows(meef) c(out) <- paste0(c("Xme", "Corme_"), I) if (!save_all_pars) { c(out) <- c(paste0("zme_", K), paste0("Lme_", I)) } if (!save_mevars) { c(out) <- paste0("Xme_", K) } } ranef <- x$ranef if (has_rows(ranef)) { rm_re_pars <- c(if (!save_all_pars) c("z", "L"), "Cor", "r") for (id in unique(ranef$id)) { c(out) <- paste0(rm_re_pars, "_", id) } if (!save_ranef) { p <- usc(combine_prefix(ranef)) c(out) <- paste0("r_", ranef$id, p, "_", ranef$cn) } tranef <- get_dist_groups(ranef, "student") if (!save_all_pars && has_rows(tranef)) { c(out) <- paste0(c("udf_", "dfm_"), tranef$ggn) } } out <- unique(out) att <- nlist(save_ranef, save_mevars, save_all_pars) attributes(out)[names(att)] <- att out } #' @export exclude_pars.mvbrmsterms <- function(x, save_all_pars = FALSE, ...) { out <- c("Rescor", "Sigma") if (!save_all_pars) { c(out) <- c("Lrescor", "LSigma") } for (i in seq_along(x$terms)) { c(out) <- exclude_pars(x$terms[[i]], save_all_pars = save_all_pars, ...) } out } #' @export exclude_pars.brmsterms <- function(x, save_ranef = TRUE, save_mevars = FALSE, save_all_pars = FALSE, ...) { out <- character(0) p <- usc(combine_prefix(x)) if (!save_all_pars) { par_classes <- c("ordered_Intercept", "fixed_Intercept", "theta") c(out) <- paste0(par_classes, p) } for (dp in names(x$dpars)) { c(out) <- exclude_pars(x$dpars[[dp]], save_all_pars = save_all_pars, ...) } for (nlp in names(x$nlpars)) { c(out) <- exclude_pars(x$nlpars[[nlp]], save_all_pars = save_all_pars, ...) } if (!save_mevars && is.formula(x$adforms$mi)) { c(out) <- paste0("Yl", p) } if (!save_ranef) { # latent residuals are like group-level effects c(out) <- paste0("err", p) } out } #' @export exclude_pars.btl <- function(x, data, save_all_pars = FALSE, ...) { out <- character(0) p <- usc(combine_prefix(x)) c(out) <- paste0("chol_cor", p) if (!save_all_pars) { par_classes <- c( "bQ", "hs_global", "hs_local", "zb", "hs_localsp", "zbsp", "Intercept", "first_Intercept", "merged_Intercept", "zcar", "nszcar", "zerr" ) c(out) <- paste0(par_classes, p) smef <- tidy_smef(x, data) for (i in seq_rows(smef)) { nb <- seq_len(smef$nbases[i]) c(out) <- paste0("zs", p, "_", i, "_", nb) } } out } brms/R/formula-ac.R0000644000176200001440000005162013611527526013603 0ustar liggesusers#' Autocorrelation structures #' #' Specify autocorrelation terms in \pkg{brms} models. Currently supported terms #' are \code{\link{arma}}, \code{\link{ar}}, \code{\link{ma}}, #' \code{\link{cosy}}, \code{\link{sar}}, \code{\link{car}}, and #' \code{\link{fcor}}. Terms can be directly specified within the formula, or #' passed to the \code{autocor} argument of \code{\link{brmsformula}} in the #' form of a one-sided formula. For deprecated ways of specifying #' autocorrelation terms, see \code{\link{cor_brms}}. #' #' @name autocor-terms #' #' @details The autocor term functions are almost solely useful when called in #' formulas passed to the \pkg{brms} package. They do not evaluate its #' arguments -- but exist purely to help set up a model with autocorrelation #' terms. #' #' @seealso \code{\link{brmsformula}}, \code{\link{acformula}}, #' \code{\link{arma}}, \code{\link{ar}}, \code{\link{ma}}, #' \code{\link{cosy}}, \code{\link{sar}}, \code{\link{car}}, #' \code{\link{fcor}} #' #' @examples #' # specify autocor terms within the formula #' y ~ x + arma(p = 1, q = 1) + car(M) #' #' # specify autocor terms in the 'autocor' argument #' bf(y ~ x, autocor = ~ arma(p = 1, q = 1) + car(M)) #' #' # specify autocor terms via 'acformula' #' bf(y ~ x) + acformula(~ arma(p = 1, q = 1) + car(M)) NULL #' Set up ARMA(p,q) correlation structures #' #' Set up an autoregressive moving average (ARMA) term of order (p, q) in #' \pkg{brms}. The function does not evaluate its arguments -- it exists purely #' to help set up a model with ARMA terms. #' #' @param time An optional time variable specifying the time ordering #' of the observations. By default, the existing order of the observations #' in the data is used. #' @param gr An optional grouping variable. If specified, the correlation #' structure is assumed to apply only to observations within the same grouping #' level. #' @param p A non-negative integer specifying the autoregressive (AR) #' order of the ARMA structure. Default is \code{1}. #' @param q A non-negative integer specifying the moving average (MA) #' order of the ARMA structure. Default is \code{1}. #' @param cov A flag indicating whether ARMA effects should be estimated by #' means of residual covariance matrices. This is currently only possible for #' stationary ARMA effects of order 1. If the model family does not have #' natural residuals, latent residuals are added automatically. If #' \code{FALSE} (the default), a regression formulation is used that is #' considerably faster and allows for ARMA effects of order higher than 1 but #' is only available for \code{gaussian} models and some of its #' generalizations. #' #' @return An object of class \code{'arma_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @seealso \code{\link{autocor-terms}}, \code{\link{ar}}, \code{\link{ma}}, #' #' @examples #' \dontrun{ #' data("LakeHuron") #' LakeHuron <- as.data.frame(LakeHuron) #' fit <- brm(x ~ arma(p = 2, q = 1), data = LakeHuron) #' summary(fit) #' } #' #' @export arma <- function(time = NA, gr = NA, p = 1, q = 1, cov = FALSE) { label <- deparse(match.call()) time <- deparse(substitute(time)) gr <- deparse(substitute(gr)) .arma(time = time, gr = gr, p = p, q = q, cov = cov, label = label) } #' Set up AR(p) correlation structures #' #' Set up an autoregressive (AR) term of order p in \pkg{brms}. The function #' does not evaluate its arguments -- it exists purely to help set up a model #' with AR terms. #' #' @inheritParams arma #' #' @return An object of class \code{'arma_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @seealso \code{\link{autocor-terms}}, \code{\link{arma}}, \code{\link{ma}} #' #' @examples #' \dontrun{ #' data("LakeHuron") #' LakeHuron <- as.data.frame(LakeHuron) #' fit <- brm(x ~ ar(p = 2), data = LakeHuron) #' summary(fit) #' } #' #' @export ar <- function(time = NA, gr = NA, p = 1, cov = FALSE) { label <- deparse(match.call()) time <- deparse(substitute(time)) gr <- deparse(substitute(gr)) .arma(time = time, gr = gr, p = p, q = 0, cov = cov, label = label) } #' Set up MA(q) correlation structures #' #' Set up a moving average (MA) term of order q in \pkg{brms}. The function does #' not evaluate its arguments -- it exists purely to help set up a model with #' MA terms. #' #' @inheritParams arma #' #' @return An object of class \code{'arma_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @seealso \code{\link{autocor-terms}}, \code{\link{arma}}, \code{\link{ar}} #' #' @examples #' \dontrun{ #' data("LakeHuron") #' LakeHuron <- as.data.frame(LakeHuron) #' fit <- brm(x ~ ma(p = 2), data = LakeHuron) #' summary(fit) #' } #' #' @export ma <- function(time = NA, gr = NA, q = 1, cov = FALSE) { label <- deparse(match.call()) time <- deparse(substitute(time)) gr <- deparse(substitute(gr)) .arma(time = time, gr = gr, p = 0, q = q, cov = cov, label = label) } # helper function to validate input to arma() .arma <- function(time, gr, p, q, cov, label) { time <- as_one_variable(time) gr <- as_one_character(gr) stopif_illegal_group(gr) p <- as_one_numeric(p) q <- as_one_numeric(q) if (!(p >= 0 && is_wholenumber(p))) { stop2("Autoregressive order must be a non-negative integer.") } if (!(q >= 0 && is_wholenumber(q))) { stop2("Moving-average order must be a non-negative integer.") } if (!sum(p, q)) { stop2("At least one of 'p' and 'q' should be greater zero.") } cov <- as_one_logical(cov) if (cov && (p > 1 || q > 1)) { stop2("Covariance formulation of ARMA structures is ", "only possible for effects of maximal order one.") } label <- as_one_character(label) out <- nlist(time, gr, p, q, cov, label) class(out) <- c("arma_term", "ac_term") out } #' Set up COSY correlation structures #' #' Set up a compounds symmetry (COSY) term in \pkg{brms}. The function does #' not evaluate its arguments -- it exists purely to help set up a model with #' COSY terms. #' #' @inheritParams arma #' #' @return An object of class \code{'cosy_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @seealso \code{\link{autocor-terms}} #' #' @examples #' \dontrun{ #' data("lh") #' lh <- as.data.frame(lh) #' fit <- brm(x ~ cosy(), data = lh) #' summary(fit) #' } #' #' @export #' @export cosy <- function(time = NA, gr = NA) { label <- deparse(match.call()) time <- deparse(substitute(time)) time <- as_one_variable(time) gr <- deparse(substitute(gr)) stopif_illegal_group(gr) out <- nlist(time, gr, label) class(out) <- c("cosy_term", "ac_term") out } #' Spatial simultaneous autoregressive (SAR) structures #' #' Set up an spatial simultaneous autoregressive (SAR) term in \pkg{brms}. The #' function does not evaluate its arguments -- it exists purely to help set up a #' model with SAR terms. #' #' @param M An object specifying the spatial weighting matrix. #' Can be either the spatial weight matrix itself or an #' object of class \code{listw} or \code{nb}, from which #' the spatial weighting matrix can be computed. #' @param type Type of the SAR structure. Either \code{"lag"} #' (for SAR of the response values) or \code{"error"} #' (for SAR of the residuals). More information is #' provided in the 'Details' section. #' #' @details The \code{lagsar} structure implements SAR of the response values: #' \deqn{y = \rho W y + \eta + e} #' The \code{errorsar} structure implements SAR of the residuals: #' \deqn{y = \eta + u, u = \rho W u + e} #' In the above equations, \eqn{\eta} is the predictor term and \eqn{e} are #' independent normally or t-distributed residuals. Currently, only families #' \code{gaussian} and \code{student} support SAR structures. #' #' @return An object of class \code{'sar_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @seealso \code{\link{autocor-terms}} #' #' @examples #' \dontrun{ #' data(oldcol, package = "spdep") #' fit1 <- brm(CRIME ~ INC + HOVAL + sar(COL.nb, type = "lag"), #' data = COL.OLD, data2 = list(COL.nb = COL.nb), #' chains = 2, cores = 2) #' summary(fit1) #' plot(fit1) #' #' fit2 <- brm(CRIME ~ INC + HOVAL + sar(COL.nb, type = "error"), #' data = COL.OLD, data2 = list(COL.nb = COL.nb), #' chains = 2, cores = 2) #' summary(fit2) #' plot(fit2) #' } #' #' @export sar <- function(M, type = "lag") { label <- deparse(match.call()) if (missing(M)) { stop2("Argument 'M' is missing in sar().") } M <- deparse(substitute(M)) M <- as_one_variable(M) options <- c("lag", "error") type <- match.arg(type, options) out <- nlist(M, type, label) class(out) <- c("sar_term", "ac_term") out } #' Spatial conditional autoregressive (CAR) structures #' #' Set up an spatial conditional autoregressive (CAR) term in \pkg{brms}. The #' function does not evaluate its arguments -- it exists purely to help set up a #' model with CAR terms. #' #' @param M Adjacency matrix of locations. All non-zero entries are treated as #' if the two locations are adjacent. If \code{gr} is specified, the row names #' of \code{W} have to match the levels of the grouping factor. #' @param gr An optional grouping factor mapping observations to spatial #' locations. If not specified, each observation is treated as a separate #' location. It is recommended to always specify a grouping factor to allow #' for handling of new data in post-processing methods. #' @param type Type of the CAR structure. Currently implemented are #' \code{"escar"} (exact sparse CAR), \code{"esicar"} (exact sparse intrinsic #' CAR), \code{"icar"} (intrinsic CAR), and \code{"bym2"}. More information is #' provided in the 'Details' section. #' #' @return An object of class \code{'car_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @seealso \code{\link{autocor-terms}} #' #' @details The \code{escar} and \code{esicar} types are #' implemented based on the case study of Max Joseph #' (\url{https://github.com/mbjoseph/CARstan}). The \code{icar} and #' \code{bym2} type is implemented based on the case study of Mitzi Morris #' (\url{http://mc-stan.org/users/documentation/case-studies/icar_stan.html}). #' #' @examples #' \dontrun{ #' # generate some spatial data #' east <- north <- 1:10 #' Grid <- expand.grid(east, north) #' K <- nrow(Grid) #' #' # set up distance and neighbourhood matrices #' distance <- as.matrix(dist(Grid)) #' W <- array(0, c(K, K)) #' W[distance == 1] <- 1 #' #' # generate the covariates and response data #' x1 <- rnorm(K) #' x2 <- rnorm(K) #' theta <- rnorm(K, sd = 0.05) #' phi <- rmulti_normal( #' 1, mu = rep(0, K), Sigma = 0.4 * exp(-0.1 * distance) #' ) #' eta <- x1 + x2 + phi #' prob <- exp(eta) / (1 + exp(eta)) #' size <- rep(50, K) #' y <- rbinom(n = K, size = size, prob = prob) #' dat <- data.frame(y, size, x1, x2) #' #' # fit a CAR model #' fit <- brm(y | trials(size) ~ x1 + x2 + car(W), #' data = dat, data2 = list(W = W), #' family = binomial()) #' summary(fit) #' } #' #' @export car <- function(M, gr = NA, type = "escar") { label <- deparse(match.call()) if (missing(M)) { stop2("Argument 'M' is missing in car().") } M <- deparse(substitute(M)) M <- as_one_variable(M) gr <- deparse(substitute(gr)) stopif_illegal_group(gr) options <- c("escar", "esicar", "icar", "bym2") type <- match.arg(type, options) out <- nlist(M, gr, type, label) class(out) <- c("car_term", "ac_term") out } #' Fixed residual correlation (FCOR) structures #' #' Set up a fixed residual correlation (FCOR) term in \pkg{brms}. The function #' does not evaluate its arguments -- it exists purely to help set up a model #' with FCOR terms. #' #' @param M Known correlation/covariance matrix of the response variable. #' If a vector is passed, it will be used as diagonal entries #' (variances) and correlations/covariances will be set to zero. #' The actual covariance matrix used in the likelihood is obtained #' by multiplying \code{M} by the square of the residual standard #' deviation parameter \code{sigma} estimated as part of the model. #' #' @return An object of class \code{'fcor_term'}, which is a list #' of arguments to be interpreted by the formula #' parsing functions of \pkg{brms}. #' #' @seealso \code{\link{autocor-terms}} #' #' @examples #' \dontrun{ #' dat <- data.frame(y = rnorm(3)) #' V <- cbind(c(0.5, 0.3, 0.2), c(0.3, 1, 0.1), c(0.2, 0.1, 0.2)) #' fit <- brm(y ~ 1 + fcor(V), data = dat, data2 = list(V = V)) #' } #' #' @export fcor <- function(M) { label <- deparse(match.call()) if (missing(M)) { stop2("Argument 'M' is missing in fcor().") } M <- deparse(substitute(M)) M <- as_one_variable(M) out <- nlist(M, label) class(out) <- c("fcor_term", "ac_term") out } # validate 'autocor' argument validate_autocor <- function(autocor) { if (is.null(autocor) || is.cor_empty(autocor)) { return(NULL) } if (is.cor_brms(autocor)) { warning2("Using 'cor_brms' objects for 'autocor' is deprecated. ", "Please see ?cor_brms for details.") autocor <- as_formula_cor_brms(autocor) } if (is.null(autocor)) { return(NULL) } autocor <- as.formula(autocor) att <- attributes(autocor) autocor <- parse_ac(autocor) if (!is.null(autocor) && !is.formula(autocor)) { stop2("Argument 'autocor' must be coercible to a formula.") } attributes(autocor)[names(att)] <- att autocor } # gather information on autocor terms # @return a data.frame with one row per autocor term tidy_acef <- function(x, ...) { UseMethod("tidy_acef") } #' @export tidy_acef.default <- function(x, ...) { x <- parse_bf(x, check_response = FALSE) tidy_acef(x, ...) } #' @export tidy_acef.mvbrmsterms <- function(x, ...) { out <- lapply(x$terms, tidy_acef, ...) out <- do_call(rbind, out) structure(out, class = acef_class()) } #' @export tidy_acef.brmsterms <- function(x, ...) { out <- lapply(x$dpars, tidy_acef, ...) out <- do_call(rbind, out) if (!NROW(out)) { return(empty_acef()) } out <- structure(out, class = acef_class()) if (has_ac_class(out, "sar")) { if (any(c("sigma", "nu") %in% names(x$dpars))) { stop2("SAR models are not implemented when predicting 'sigma' or 'nu'.") } } if (use_ac_cov(out)) { if (isTRUE(x$rescor)) { stop2("Explicit covariance terms cannot be modeled ", "when 'rescor' is estimated at the same time.") } } out } #' @export tidy_acef.btl <- function(x, data = NULL, ...) { form <- x[["ac"]] if (!is.formula(form)) { return(empty_acef()) } if (is.mixfamily(x$family)) { stop2("Autocorrelation terms cannot be applied in mixture models.") } px <- check_prefix(x) out <- data.frame(term = all_terms(form), stringsAsFactors = FALSE) nterms <- NROW(out) cnames <- c("class", "dim", "type", "time", "gr", "p", "q", "M") out[cnames] <- list(NA) out$cov <- out$nat_cov <- FALSE out[names(px)] <- px for (i in seq_len(nterms)) { ac <- eval2(out$term[i]) if (is.arma_term(ac)) { out$class[i] <- "arma" out$dim[i] <- "time" out$time[i] <- ac$time out$gr[i] <- ac$gr out$p[i] <- ac$p out$q[i] <- ac$q out$cov[i] <- ac$cov } if (is.cosy_term(ac)) { out$class[i] <- "cosy" out$dim[i] <- "time" out$time[i] <- ac$time out$gr[i] <- ac$gr out$cov[i] <- TRUE } if (is.sar_term(ac)) { out$class[i] <- "sar" out$dim[i] <- "space" out$type[i] <- ac$type out$M[i] <- ac$M out$cov[i] <- TRUE } if (is.car_term(ac)) { out$class[i] <- "car" out$dim[i] <- "space" out$type[i] <- ac$type out$gr[i] <- ac$gr out$M[i] <- ac$M } if (is.fcor_term(ac)) { out$class[i] <- "fcor" out$M[i] <- ac$M out$cov[i] <- TRUE } } # covariance matrices of natural residuals will be handled # directly in the likelihood function while latent residuals will # be added to the linear predictor of the main parameter 'mu' out$nat_cov <- out$cov & has_natural_residuals(x) class(out) <- acef_class() # validate specified autocor terms if (any(duplicated(out$class))) { stop2("Can only model one term per autocorrelation class.") } if (NROW(subset2(out, dim = "time")) > 1) { stop2("Can only model one time-series term.") } if (NROW(subset2(out, dim = "space")) > 1) { stop2("Can only model one spatial term.") } if (NROW(subset2(out, nat_cov = TRUE)) > 1) { stop2("Can only model one covariance matrix of natural residuals.") } if (use_ac_cov(out) || has_ac_class(out, "arma")) { if (any(!out$dpar %in% c("", "mu") | nzchar(out$nlpar))) { stop2("Explicit covariance terms can only be specified on 'mu'.") } } out } #' @export tidy_acef.btnl <- function(x, ... ) { tidy_acef.btl(x, ...) } #' @export tidy_acef.acef <- function(x, ...) { x } #' @export tidy_acef.NULL <- function(x, ...) { empty_acef() } empty_acef <- function() { structure(empty_data_frame(), class = acef_class()) } acef_class <- function() { c("acef", "data.frame") } # get names of certain autocor variables get_ac_vars <- function(x, var, ...) { var <- match.arg(var, c("time", "gr", "M")) acef <- subset2(tidy_acef(x), ...) out <- unique(acef[[var]]) setdiff(na.omit(out), "NA") } # get names of autocor grouping variables get_ac_groups <- function(x, ...) { get_ac_vars(x, "gr", ...) } # is certain subset of autocor terms is present? has_ac_subset <- function(x, ...) { NROW(subset2(tidy_acef(x), ...)) > 0L } # is a certain autocorrelation class present? has_ac_class <- function(x, class) { has_ac_subset(x, class = class) } # use explicit residual covariance structure? use_ac_cov <- function(x) { has_ac_subset(x, cov = TRUE) } # use explicit residual covariance structure for time-series? use_ac_cov_time <- function(x) { has_ac_subset(x, cov = TRUE, dim = "time") } # should natural residuals be modeled as correlated? has_cor_natural_residuals <- function(bterms) { has_natural_residuals(bterms) && use_ac_cov(bterms) } # has the model correlated latent residuals has_cor_latent_residuals <- function(bterms) { !has_natural_residuals(bterms) && use_ac_cov(bterms) } # validate SAR matrices validate_sar_matrix <- function(M) { if (is(M, "listw")) { require_package("spdep") M <- spdep::listw2mat(M) } else if (is(M, "nb")) { require_package("spdep") M <- spdep::nb2mat(M) } if (length(dim(M)) != 2L) { stop2("'M' for SAR terms must be of class 'matrix', 'listw', or 'nb'.") } M <- Matrix::Matrix(M, sparse = TRUE) M } # validate CAR matrices validate_car_matrix <- function(M) { if (length(dim(M)) != 2L) { stop2("'M' for CAR terms must be a matrix.") } M <- Matrix::Matrix(M, sparse = TRUE) if (!Matrix::isSymmetric(M, check.attributes = FALSE)) { stop2("'M' for CAR terms must be symmetric.") } colnames(M) <- rownames(M) not_binary <- !(M == 0 | M == 1) if (any(not_binary)) { message("Converting all non-zero values in 'M' to 1.") M[not_binary] <- 1 } M } # validate FCOR matrices validate_fcor_matrix <- function(M) { if (length(dim(M)) <= 1L) { M <- diag(as.vector(M), length(M)) } if (length(dim(M)) != 2L) { stop2("'M' for FCOR terms must be a matrix.") } M <- as.matrix(M) if (!isSymmetric(M, check.attributes = FALSE)) { stop2("'M' for FCOR terms must be symmetric.") } if (min(eigen(M)$values <= 0)) { stop2("'M' for FCOR terms must be positive definite.") } M } # regex to extract all parameter names of autocorrelation structures regex_autocor_pars <- function() { p <- c("ar", "ma", "sderr", "cosy", "lagsar", "errorsar", "car", "sdcar") p <- paste0("(", p, ")", collapse = "|") paste0("^(", p, ")(\\[|_|$)") } is.ac_term <- function(x) { inherits(x, "ac_term") } is.arma_term <- function(x) { inherits(x, "arma_term") } is.cosy_term <- function(x) { inherits(x, "cosy_term") } is.sar_term <- function(x) { inherits(x, "sar_term") } is.car_term <- function(x) { inherits(x, "car_term") } is.fcor_term <- function(x) { inherits(x, "fcor_term") } brms/R/pp_mixture.R0000644000176200001440000000732113606326626013752 0ustar liggesusers#' Posterior Probabilities of Mixture Component Memberships #' #' Compute the posterior probabilities of mixture component #' memberships for each observation including uncertainty #' estimates. #' #' @inheritParams predict.brmsfit #' @param x An \R object usually of class \code{brmsfit}. #' @param log Logical; Indicates whether to return #' probabilities on the log-scale. #' #' @return #' If \code{summary = TRUE}, an N x E x K array, #' where N is the number of observations, K is the number #' of mixture components, and E is equal to \code{length(probs) + 2}. #' If \code{summary = FALSE}, an S x N x K array, where #' S is the number of posterior samples. #' #' @details #' The returned probabilities can be written as #' \eqn{P(Kn = k | Yn)}, that is the posterior probability #' that observation n originates from component k. #' They are computed using Bayes' Theorem #' \deqn{P(Kn = k | Yn) = P(Yn | Kn = k) P(Kn = k) / P(Yn),} #' where \eqn{P(Yn | Kn = k)} is the (posterior) likelihood #' of observation n for component k, \eqn{P(Kn = k)} is #' the (posterior) mixing probability of component k #' (i.e. parameter \code{theta}), and #' \deqn{P(Yn) = \sum (k=1,...,K) P(Yn | Kn = k) P(Kn = k)} #' is a normalizing constant. #' #' @examples #' \dontrun{ #' ## simulate some data #' set.seed(1234) #' dat <- data.frame( #' y = c(rnorm(100), rnorm(50, 2)), #' x = rnorm(150) #' ) #' ## fit a simple normal mixture model #' mix <- mixture(gaussian, nmix = 2) #' prior <- c( #' prior(normal(0, 5), Intercept, nlpar = mu1), #' prior(normal(0, 5), Intercept, nlpar = mu2), #' prior(dirichlet(2, 2), theta) #' ) #' fit1 <- brm(bf(y ~ x), dat, family = mix, #' prior = prior, chains = 2, inits = 0) #' summary(fit1) #' #' ## compute the membership probabilities #' ppm <- pp_mixture(fit1) #' str(ppm) #' #' ## extract point estimates for each observation #' head(ppm[, 1, ]) #' #' ## classify every observation according to #' ## the most likely component #' apply(ppm[, 1, ], 1, which.max) #' } #' #' @export pp_mixture.brmsfit <- function(x, newdata = NULL, re_formula = NULL, resp = NULL, nsamples = NULL, subset = NULL, log = FALSE, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) { stopifnot_resp(x, resp) log <- as_one_logical(log) contains_samples(x) x <- restructure(x) if (is_mv(x)) { resp <- validate_resp(resp, x$formula$responses, multiple = FALSE) family <- x$family[[resp]] } else { family <- x$family } if (!is.mixfamily(family)) { stop2("Method 'pp_mixture' can only be applied to mixture models.") } draws <- extract_draws( x, newdata = newdata, re_formula = re_formula, resp = resp, subset = subset, nsamples = nsamples, check_response = TRUE, ... ) stopifnot(is.brmsdraws(draws)) draws$pp_mixture <- TRUE for (dp in names(draws$dpars)) { draws$dpars[[dp]] <- get_dpar(draws, dpar = dp) } N <- choose_N(draws) out <- lapply(seq_len(N), log_lik_mixture, draws = draws) out <- abind(out, along = 3) out <- aperm(out, c(1, 3, 2)) old_order <- draws$old_order sort <- isTRUE(ncol(out) != length(old_order)) out <- reorder_obs(out, old_order, sort = sort) if (!log) { out <- exp(out) } if (summary) { out <- posterior_summary(out, probs = probs, robust = robust) dimnames(out) <- list( seq_len(nrow(out)), colnames(out), paste0("P(K = ", seq_len(dim(out)[3]), " | Y)") ) } out } #' @rdname pp_mixture.brmsfit #' @export pp_mixture <- function(x, ...) { UseMethod("pp_mixture") } brms/R/model_weights.R0000644000176200001440000002731313606326626014413 0ustar liggesusers#' Model Weighting Methods #' #' Compute model weights in various ways, for instance via #' stacking of predictive distributions, Akaike weights, or #' marginal likelihoods. #' #' @inheritParams loo.brmsfit #' @param weights Name of the criterion to compute weights from. Should be one #' of \code{"loo"}, \code{"waic"}, \code{"kfold"}, \code{"stacking"} (current #' default), or \code{"bma"}, \code{"pseudobma"}, For the former three #' options, Akaike weights will be computed based on the information criterion #' values returned by the respective methods. For \code{"stacking"} and #' \code{"pseudobma"} method \code{\link{loo_model_weights}} will be used to #' obtain weights. For \code{"bma"}, method \code{\link{post_prob}} will be #' used to compute Bayesian model averaging weights based on log marginal #' likelihood values (make sure to specify reasonable priors in this case). #' Some some method, \code{weights} may also be be a numeric vector of #' pre-specified weights. #' #' @return A numeric vector of weights for the models. #' #' @examples #' \dontrun{ #' # model with 'treat' as predictor #' fit1 <- brm(rating ~ treat + period + carry, data = inhaler) #' summary(fit1) #' #' # model without 'treat' as predictor #' fit2 <- brm(rating ~ period + carry, data = inhaler) #' summary(fit2) #' #' # obtain Akaike weights based on the WAIC #' model_weights(fit1, fit2, weights = "waic") #' } #' #' @export model_weights.brmsfit <- function(x, ..., weights = "stacking", model_names = NULL) { weights <- validate_weights_method(weights) args <- split_dots(x, ..., model_names = model_names) models <- args$models args$models <- NULL model_names <- names(models) if (weights %in% c("loo", "waic", "kfold")) { # Akaike weights based on information criteria ics <- rep(NA, length(models)) for (i in seq_along(ics)) { args$x <- models[[i]] args$model_names <- names(models)[i] ics[i] <- SW(do_call(weights, args))$estimates[3, 1] } ic_diffs <- ics - min(ics) out <- exp(-ic_diffs / 2) } else if (weights %in% c("stacking", "pseudobma")) { args <- c(unname(models), args) args$method <- weights out <- do_call("loo_model_weights", args) } else if (weights %in% "bma") { args <- c(unname(models), args) out <- do_call("post_prob", args) } out <- as.numeric(out) out <- out / sum(out) names(out) <- model_names out } #' @rdname model_weights.brmsfit #' @export model_weights <- function(x, ...) { UseMethod("model_weights") } # validate name of the applied weighting method validate_weights_method <- function(method) { method <- as_one_character(method) method <- tolower(method) if (method == "loo2") { warning2("Weight method 'loo2' is deprecated. Use 'stacking' instead.") method <- "stacking" } if (method == "marglik") { warning2("Weight method 'marglik' is deprecated. Use 'bma' instead.") method <- "bma" } options <- c("loo", "waic", "kfold", "stacking", "pseudobma", "bma") match.arg(method, options) } #' Posterior predictive samples averaged across models #' #' Compute posterior predictive samples averaged across models. #' Weighting can be done in various ways, for instance using #' Akaike weights based on information criteria or #' marginal likelihoods. #' #' @inheritParams model_weights.brmsfit #' @param method Method used to obtain predictions to average over. Should be #' one of \code{"posterior_predict"} (default), \code{"pp_expect"}, or #' \code{"predictive_error"}. #' @param control Optional \code{list} of further arguments #' passed to the function specified in \code{weights}. #' @param nsamples Total number of posterior samples to use. #' @param seed A single numeric value passed to \code{\link{set.seed}} #' to make results reproducible. #' @param summary Should summary statistics #' (i.e. means, sds, and 95\% intervals) be returned #' instead of the raw values? Default is \code{TRUE}. #' @param robust If \code{FALSE} (the default) the mean is used as #' the measure of central tendency and the standard deviation as #' the measure of variability. If \code{TRUE}, the median and the #' median absolute deviation (MAD) are applied instead. #' Only used if \code{summary} is \code{TRUE}. #' @param probs The percentiles to be computed by the \code{quantile} #' function. Only used if \code{summary} is \code{TRUE}. #' #' @return Same as the output of the method specified #' in argument \code{method}. #' #' @details Weights are computed with the \code{\link{model_weights}} method. #' #' @seealso \code{\link{model_weights}}, \code{\link{posterior_average}} #' #' @examples #' \dontrun{ #' # model with 'treat' as predictor #' fit1 <- brm(rating ~ treat + period + carry, data = inhaler) #' summary(fit1) #' #' # model without 'treat' as predictor #' fit2 <- brm(rating ~ period + carry, data = inhaler) #' summary(fit2) #' #' # compute model-averaged predicted values #' (df <- unique(inhaler[, c("treat", "period", "carry")])) #' pp_average(fit1, fit2, newdata = df) #' #' # compute model-averaged fitted values #' pp_average(fit1, fit2, method = "fitted", newdata = df) #' } #' #' @export pp_average.brmsfit <- function( x, ..., weights = "stacking", method = "posterior_predict", nsamples = NULL, summary = TRUE, probs = c(0.025, 0.975), robust = FALSE, model_names = NULL, control = list(), seed = NULL ) { if (!is.null(seed)) { set.seed(seed) } method <- validate_pp_method(method) if ("subset" %in% names(list(...))) { stop2("Cannot use argument 'subset' in pp_average.") } args <- split_dots(x, ..., model_names = model_names) args$summary <- FALSE models <- args$models args$models <- NULL if (!match_response(models)) { stop2("Can only average models predicting the same response.") } if (is.null(nsamples)) { nsamples <- nsamples(models[[1]]) } weights <- validate_weights(weights, models, control) nsamples <- round_largest_remainder(weights * nsamples) names(weights) <- names(nsamples) <- names(models) out <- named_list(names(models)) for (i in seq_along(out)) { if (nsamples[i] > 0) { args$object <- models[[i]] args$nsamples <- nsamples[i] out[[i]] <- do_call(method, args) } } out <- do_call(rbind, out) if (summary) { out <- posterior_summary(out, probs = probs, robust = robust) } attr(out, "weights") <- weights attr(out, "nsamples") <- nsamples out } #' @rdname pp_average.brmsfit #' @export pp_average <- function(x, ...) { UseMethod("pp_average") } # validate weights passed to model averaging functions # see pp_average.brmsfit for more documentation validate_weights <- function(weights, models, control = list()) { if (!is.numeric(weights)) { weight_args <- c(unname(models), control) weight_args$weights <- weights weights <- do_call(model_weights, weight_args) } else { if (length(weights) != length(models)) { stop2("If numeric, 'weights' must have the same length ", "as the number of models.") } if (any(weights < 0)) { stop2("If numeric, 'weights' must be positive.") } } weights / sum(weights) } #' Posterior samples of parameters averaged across models #' #' Extract posterior samples of parameters averaged across models. #' Weighting can be done in various ways, for instance using #' Akaike weights based on information criteria or #' marginal likelihoods. #' #' @inheritParams pp_average.brmsfit #' @param pars Names of parameters for which to average across models. #' Only those parameters can be averaged that appear in every model. #' Defaults to all overlapping parameters. #' @param missing An optional numeric value or a named list of numeric values #' to use if a model does not contain a parameter for which posterior samples #' should be averaged. Defaults to \code{NULL}, in which case only those #' parameters can be averaged that are present in all of the models. #' #' @return A \code{data.frame} of posterior samples. Samples are rows #' and parameters are columns. #' #' @details Weights are computed with the \code{\link{model_weights}} method. #' #' @seealso \code{\link{model_weights}}, \code{\link{pp_average}} #' #' @examples #' \dontrun{ #' # model with 'treat' as predictor #' fit1 <- brm(rating ~ treat + period + carry, data = inhaler) #' summary(fit1) #' #' # model without 'treat' as predictor #' fit2 <- brm(rating ~ period + carry, data = inhaler) #' summary(fit2) #' #' # compute model-averaged posteriors of overlapping parameters #' posterior_average(fit1, fit2, weights = "waic") #' } #' #' @export posterior_average.brmsfit <- function( x, ..., pars = NULL, weights = "stacking", nsamples = NULL, missing = NULL, model_names = NULL, control = list(), seed = NULL ) { if (!is.null(seed)) { set.seed(seed) } models <- split_dots(x, ..., model_names = model_names, other = FALSE) pars_list <- lapply(models, parnames) all_pars <- unique(unlist(pars_list)) if (is.null(missing)) { common_pars <- lapply(pars_list, function(x) all_pars %in% x) common_pars <- all_pars[Reduce("&", common_pars)] if (is.null(pars)) { pars <- setdiff(common_pars, "lp__") } pars <- as.character(pars) inv_pars <- setdiff(pars, common_pars) if (length(inv_pars)) { inv_pars <- collapse_comma(inv_pars) stop2( "Parameters ", inv_pars, " cannot be found in all ", "of the models. Consider using argument 'missing'." ) } } else { if (is.null(pars)) { pars <- setdiff(all_pars, "lp__") } pars <- as.character(pars) inv_pars <- setdiff(pars, all_pars) if (length(inv_pars)) { inv_pars <- collapse_comma(inv_pars) stop2("Parameters ", inv_pars, " cannot be found in any of the models.") } if (is.list(missing)) { all_miss_pars <- unique(ulapply( models, function(m) setdiff(pars, parnames(m)) )) inv_pars <- setdiff(all_miss_pars, names(missing)) if (length(inv_pars)) { stop2("Argument 'missing' has no value for parameters ", collapse_comma(inv_pars), ".") } missing <- lapply(missing, as_one_numeric, allow_na = TRUE) } else { missing <- as_one_numeric(missing, allow_na = TRUE) missing <- named_list(pars, missing) } } if (is.null(nsamples)) { nsamples <- nsamples(models[[1]]) } weights <- validate_weights(weights, models, control) nsamples <- round_largest_remainder(weights * nsamples) names(weights) <- names(nsamples) <- names(models) out <- named_list(names(models)) for (i in seq_along(out)) { if (nsamples[i] > 0) { subset <- sample(seq_len(nsamples(models[[i]])), nsamples[i]) subset <- sort(subset) ps <- posterior_samples( models[[i]], pars = pars, subset = subset, fixed = TRUE ) if (!is.null(ps)) { out[[i]] <- ps } else { out[[i]] <- as.data.frame(matrix( numeric(0), nrow = nsamples[i], ncol = 0 )) } if (!is.null(missing)) { miss_pars <- setdiff(pars, names(out[[i]])) if (length(miss_pars)) { out[[i]][miss_pars] <- missing[miss_pars] } } } } out <- do_call(rbind, out) rownames(out) <- NULL attr(out, "weights") <- weights attr(out, "nsamples") <- nsamples out } #' @rdname posterior_average.brmsfit #' @export posterior_average <- function(x, ...) { UseMethod("posterior_average") } brms/R/datasets.R0000644000176200001440000001277013442002443013354 0ustar liggesusers#' Infections in kidney patients #' #' @description This dataset, originally discussed in #' McGilchrist and Aisbett (1991), describes the first and second #' (possibly right censored) recurrence time of #' infection in kidney patients using portable dialysis equipment. #' In addition, information on the risk variables age, sex and disease #' type is provided. #' #' @format A data frame of 76 observations containing #' information on the following 7 variables. #' \describe{ #' \item{time}{The time to first or second recurrence of the infection, #' or the time of censoring} #' \item{recur}{A factor of levels \code{1} or \code{2} #' indicating if the infection recurred for the first #' or second time for this patient} #' \item{censored}{Either \code{0} or \code{1}, where \code{0} indicates #' no censoring of recurrence time and \code{1} indicates right censoring} #' \item{patient}{The patient number} #' \item{age}{The age of the patient} #' \item{sex}{The sex of the patient} #' \item{disease}{A factor of levels \code{other, GN, AN}, #' and \code{PKD} specifying the type of disease} #' } #' #' @examples #' \dontrun{ #' ## performing surivival analysis using the "weibull" family #' fit1 <- brm(time | cens(censored) ~ age + sex + disease, #' data = kidney, family = weibull, inits = "0") #' summary(fit1) #' plot(fit1) #' #' ## adding random intercepts over patients #' fit2 <- brm(time | cens(censored) ~ age + sex + disease + (1|patient), #' data = kidney, family = weibull(), inits = "0", #' prior = set_prior("cauchy(0,2)", class = "sd")) #' summary(fit2) #' plot(fit2) #' } #' #' @source McGilchrist, C. A., & Aisbett, C. W. (1991). #' Regression with frailty in survival analysis. #' \emph{Biometrics, 47(2)}, 461-466. "kidney" #' Clarity of inhaler instructions #' #' @description Ezzet and Whitehead (1991) analyze data from a two-treatment, #' two-period crossover trial to compare 2 inhalation devices for #' delivering the drug salbutamol in 286 asthma patients. #' Patients were asked to rate the clarity of leaflet instructions #' accompanying each device, using a 4-point ordinal scale. #' #' @format A data frame of 572 observations containing #' information on the following 5 variables. #' \describe{ #' \item{subject}{The subject number} #' \item{rating}{The rating of the inhaler instructions #' on a scale ranging from 1 to 4} #' \item{treat}{A contrast to indicate which of #' the two inhaler devices was used} #' \item{period}{A contrast to indicate the time of administration} #' \item{carry}{A contrast to indicate possible carry over effects} #' } #' #' @examples #' \dontrun{ #' ## ordinal regression with family "sratio" #' fit1 <- brm(rating ~ treat + period + carry, #' data = inhaler, family = sratio(), #' prior = set_prior("normal(0,5)")) #' summary(fit1) #' plot(fit1) #' #' ## ordinal regression with family "cumulative" #' ## and random intercept over subjects #' fit2 <- brm(rating ~ treat + period + carry + (1|subject), #' data = inhaler, family = cumulative(), #' prior = set_prior("normal(0,5)")) #' summary(fit2) #' plot(fit2) #' } #' #' @source Ezzet, F., & Whitehead, J. (1991). #' A random effects model for ordinal responses from a crossover trial. #' \emph{Statistics in Medicine, 10(6)}, 901-907. "inhaler" #' Epileptic seizure counts #' #' @description Breslow and Clayton (1993) analyze data initially #' provided by Thall and Vail (1990) concerning #' seizure counts in a randomized trial of anti-convulsant #' therapy in epilepsy. Covariates are treatment, #' 8-week baseline seizure counts, and age of the patients in years. #' #' @format A data frame of 236 observations containing information #' on the following 9 variables. #' \describe{ #' \item{Age}{The age of the patients in years} #' \item{Base}{The seizure count at 8-weeks baseline} #' \item{Trt}{Either \code{0} or \code{1} indicating #' if the patient received anti-convulsant therapy} #' \item{patient}{The patient number} #' \item{visit}{The session number from \code{1} (first visit) #' to \code{4} (last visit)} #' \item{count}{The seizure count between two visits} #' \item{obs}{The observation number, that is #' a unique identifier for each observation} #' \item{zAge}{Standardized \code{Age}} #' \item{zBase}{Standardized \code{Base}} #' } #' #' @examples #' \dontrun{ #' ## poisson regression without random effects. #' fit1 <- brm(count ~ zAge + zBase * Trt, #' data = epilepsy, family = poisson()) #' summary(fit1) #' plot(fit1) #' #' ## poisson regression with varying intercepts of patients #' ## as well as normal priors for overall effects parameters. #' fit2 <- brm(count ~ zAge + zBase * Trt + (1|patient), #' data = epilepsy, family = poisson(), #' prior = set_prior("normal(0,5)")) #' summary(fit2) #' plot(fit2) #' } #' #' @source Thall, P. F., & Vail, S. C. (1990). #' Some covariance models for longitudinal count data with overdispersion. #' \emph{Biometrics, 46(2)}, 657-671. \cr #' #' Breslow, N. E., & Clayton, D. G. (1993). #' Approximate inference in generalized linear mixed models. #' \emph{Journal of the American Statistical Association, 88(421)}, 9-25. "epilepsy"brms/R/pp_check.R0000644000176200001440000001454713611527526013340 0ustar liggesusers#' Posterior Predictive Checks for \code{brmsfit} Objects #' #' Perform posterior predictive checks with the help #' of the \pkg{bayesplot} package. #' #' @aliases pp_check #' #' @param object An object of class \code{brmsfit}. #' @param type Type of the ppc plot as given by a character string. #' See \code{\link[bayesplot:PPC-overview]{PPC}} for an overview #' of currently supported types. You may also use an invalid #' type (e.g. \code{type = "xyz"}) to get a list of supported #' types in the resulting error message. #' @param nsamples Positive integer indicating how many #' posterior samples should be used. #' If \code{NULL} all samples are used. If not specified, #' the number of posterior samples is chosen automatically. #' Ignored if \code{subset} is not \code{NULL}. #' @param group Optional name of a factor variable in the model #' by which to stratify the ppc plot. This argument is required for #' ppc \code{*_grouped} types and ignored otherwise. #' @param x Optional name of a variable in the model. #' Only used for ppc types having an \code{x} argument #' and ignored otherwise. #' @param ... Further arguments passed to \code{\link{predict.brmsfit}} #' as well as to the PPC function specified in \code{type}. #' @inheritParams predict.brmsfit #' #' @return A ggplot object that can be further #' customized using the \pkg{ggplot2} package. #' #' @details For a detailed explanation of each of the ppc functions, #' see the \code{\link[bayesplot:PPC-overview]{PPC}} #' documentation of the \pkg{\link[bayesplot:bayesplot]{bayesplot}} #' package. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt #' + (1|patient) + (1|obs), #' data = epilepsy, family = poisson()) #' #' pp_check(fit) # shows dens_overlay plot by default #' pp_check(fit, type = "error_hist", nsamples = 11) #' pp_check(fit, type = "scatter_avg", nsamples = 100) #' pp_check(fit, type = "stat_2d") #' pp_check(fit, type = "rootogram") #' pp_check(fit, type = "loo_pit") #' #' ## get an overview of all valid types #' pp_check(fit, type = "xyz") #' } #' #' @importFrom bayesplot pp_check #' @export pp_check #' @export pp_check.brmsfit <- function(object, type, nsamples, group = NULL, x = NULL, newdata = NULL, resp = NULL, subset = NULL, ...) { dots <- list(...) if (missing(type)) { type <- "dens_overlay" } type <- as_one_character(type) if (!is.null(group)) { group <- as_one_character(group) } if (!is.null(x)) { x <- as_one_character(x) } resp <- validate_resp(resp, object, multiple = FALSE) valid_types <- as.character(bayesplot::available_ppc("")) valid_types <- sub("^ppc_", "", valid_types) if (!type %in% valid_types) { stop2("Type '", type, "' is not a valid ppc type. ", "Valid types are:\n", collapse_comma(valid_types)) } ppc_fun <- get(paste0("ppc_", type), asNamespace("bayesplot")) # validate arguments 'resp', 'group', and 'x' object <- restructure(object) stopifnot_resp(object, resp) family <- family(object, resp = resp) if (has_multicol(family)) { stop2("'pp_check' is not implemented for this family.") } valid_vars <- names(model.frame(object)) if ("group" %in% names(formals(ppc_fun))) { if (is.null(group)) { stop2("Argument 'group' is required for ppc type '", type, "'.") } if (!group %in% valid_vars) { stop2("Variable '", group, "' could not be found in the data.") } } if ("x" %in% names(formals(ppc_fun))) { if (!is.null(x) && !x %in% valid_vars) { stop2("Variable '", x, "' could not be found in the data.") } } if (type == "error_binned") { if (is_ordinal(family)) { stop2("Type '", type, "' is not available for ordinal models.") } method <- "pp_expect" } else { method <- "posterior_predict" } if (missing(nsamples)) { aps_types <- c( "error_scatter_avg", "error_scatter_avg_vs_x", "intervals", "intervals_grouped", "loo_pit", "loo_intervals", "loo_ribbon", "ribbon", "ribbon_grouped", "rootogram", "scatter_avg", "scatter_avg_grouped", "stat", "stat_2d", "stat_freqpoly_grouped", "stat_grouped", "violin_grouped" ) if (!is.null(subset)) { nsamples <- NULL } else if (type %in% aps_types) { nsamples <- NULL message("Using all posterior samples for ppc type '", type, "' by default.") } else { nsamples <- 10 message("Using 10 posterior samples for ppc type '", type, "' by default.") } } newdata <- validate_newdata( newdata, object = object, resp = resp, re_formula = NA, check_response = TRUE, ... ) y <- get_y(object, resp = resp, newdata = newdata, ...) subset <- subset_samples(object, subset, nsamples) pred_args <- list( object, newdata = newdata, resp = resp, subset = subset, sort = FALSE, ... ) yrep <- do_call(method, pred_args) # censored responses are misleading when displayed in pp_check cens <- get_cens(object, resp = resp, newdata = newdata) if (!is.null(cens)) { warning2("Censored responses are not shown in 'pp_check'.") take <- !cens if (!any(take)) { stop2("No non-censored responses found.") } y <- y[take] yrep <- yrep[, take, drop = FALSE] } # most ... arguments are ment for the prediction function for_pred <- names(dots) %in% names(formals(extract_draws.brmsfit)) ppc_args <- c(list(y, yrep), dots[!for_pred]) if ("psis_object" %in% setdiff(names(formals(ppc_fun)), names(ppc_args))) { ppc_args$psis_object <- do_call( compute_loo, c(pred_args, criterion = "psis") ) } if ("lw" %in% setdiff(names(formals(ppc_fun)), names(ppc_args))) { ppc_args$lw <- weights( do_call(compute_loo, c(pred_args, criterion = "psis")) ) } # allow using arguments 'group' and 'x' for new data bterms <- parse_bf(object$formula) mf <- validate_data(newdata, bterms, na.action = na.pass) if (!is.null(group)) { ppc_args$group <- mf[[group]] } if (!is.null(x)) { ppc_args$x <- mf[[x]] if (!is_like_factor(ppc_args$x)) { # fixes issue #229 ppc_args$x <- as.numeric(ppc_args$x) } } do_call(ppc_fun, ppc_args) } brms/R/brmsfit-methods.R0000644000176200001440000004410013611527526014657 0ustar liggesusers# This file contains several extractor methods for brmsfit objects. # A lot of other brmsfit methods have their own dedicated files. #' Extract Population-Level Estimates #' #' Extract the population-level ('fixed') effects #' from a \code{brmsfit} object. #' #' @aliases fixef #' #' @inheritParams predict.brmsfit #' @param pars Optional names of coefficients to extract. #' By default, all coefficients are extracted. #' @param ... Currently ignored. #' #' @return If \code{summary} is \code{TRUE}, a matrix returned #' by \code{\link{posterior_summary}} for the population-level effects. #' If \code{summary} is \code{FALSE}, a matrix with one row per #' posterior draw and one column per population-level effect. #' #' @examples #' \dontrun{ #' fit <- brm(time | cens(censored) ~ age + sex + disease, #' data = kidney, family = "exponential") #' fixef(fit) #' # extract only some coefficients #' fixef(fit, pars = c("age", "sex")) #' } #' #' @method fixef brmsfit #' @export #' @export fixef #' @importFrom nlme fixef fixef.brmsfit <- function(object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), pars = NULL, ...) { contains_samples(object) all_pars <- parnames(object) fpars <- all_pars[grepl(fixef_pars(), all_pars)] if (!is.null(pars)) { pars <- as.character(pars) fpars <- fpars[sub("^[^_]+_", "", fpars) %in% pars] } if (!length(fpars)) { return(NULL) } out <- as.matrix(object, pars = fpars, fixed = TRUE) colnames(out) <- gsub(fixef_pars(), "", fpars) if (summary) { out <- posterior_summary(out, probs, robust) } out } #' Covariance and Correlation Matrix of Population-Level Effects #' #' Get a point estimate of the covariance or #' correlation matrix of population-level parameters #' #' @inheritParams fixef.brmsfit #' @param correlation Logical; if \code{FALSE} (the default), compute #' the covariance matrix, if \code{TRUE}, compute the correlation matrix. #' #' @return covariance or correlation matrix of population-level parameters #' #' @details Estimates are obtained by calculating the maximum likelihood #' covariances (correlations) of the posterior samples. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), #' data = epilepsy, family = gaussian(), chains = 2) #' vcov(fit) #' } #' #' @export vcov.brmsfit <- function(object, correlation = FALSE, pars = NULL, ...) { contains_samples(object) all_pars <- parnames(object) fpars <- all_pars[grepl(fixef_pars(), all_pars)] if (!is.null(pars)) { pars <- as.character(pars) fpars <- intersect(fpars, paste0("b_", pars)) } if (!length(fpars)) { return(NULL) } samples <- posterior_samples(object, pars = fpars, fixed = TRUE) names(samples) <- sub(fixef_pars(), "", names(samples)) if (correlation) { out <- cor(samples) } else { out <- cov(samples) } out } #' Extract Group-Level Estimates #' #' Extract the group-level ('random') effects of each level #' from a \code{brmsfit} object. #' #' @aliases ranef #' #' @inheritParams fixef.brmsfit #' @param groups Optional names of grouping variables #' for which to extract effects. #' @param ... Currently ignored. #' #' @return A list of 3D arrays (one per grouping factor). #' If \code{summary} is \code{TRUE}, #' the 1st dimension contains the factor levels, #' the 2nd dimension contains the summary statistics #' (see \code{\link{posterior_summary}}), and #' the 3rd dimension contains the group-level effects. #' If \code{summary} is \code{FALSE}, the 1st dimension contains #' the posterior draws, the 2nd dimension contains the factor levels, #' and the 3rd dimension contains the group-level effects. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), #' data = epilepsy, family = gaussian(), chains = 2) #' ranef(fit) #' } #' #' @method ranef brmsfit #' @export #' @export ranef #' @importFrom nlme ranef ranef.brmsfit <- function(object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), pars = NULL, groups = NULL, ...) { contains_samples(object) object <- restructure(object) if (!nrow(object$ranef)) { stop2("The model does not contain group-level effects.") } all_pars <- parnames(object) if (!is.null(pars)) { pars <- as.character(pars) } ranef <- object$ranef all_groups <- unique(ranef$group) if (!is.null(groups)) { groups <- as.character(groups) all_groups <- intersect(all_groups, groups) } out <- named_list(all_groups) for (g in all_groups) { r <- subset2(ranef, group = g) coefs <- paste0(usc(combine_prefix(r), "suffix"), r$coef) rpars <- all_pars[grepl(paste0("^r_", g, "(__.+\\[|\\[)"), all_pars)] if (!is.null(pars)) { coefs <- coefs[r$coef %in% pars] if (!length(coefs)) { next } regex <- paste0("(", escape_all(coefs), ")", collapse = "|") regex <- paste0(",", regex, "\\]$") rpars <- rpars[grepl(regex, rpars)] } out[[g]] <- as.matrix(object, rpars, fixed = TRUE) levels <- attr(ranef, "levels")[[g]] dim(out[[g]]) <- c(nrow(out[[g]]), length(levels), length(coefs)) dimnames(out[[g]])[2:3] <- list(levels, coefs) if (summary) { out[[g]] <- posterior_summary(out[[g]], probs, robust) } } rmNULL(out, recursive = FALSE) } #' Extract Model Coefficients #' #' Extract model coefficients, which are the sum of population-level #' effects and corresponding group-level effects #' #' @inheritParams ranef.brmsfit #' @param ... Further arguments passed to \code{\link{fixef.brmsfit}} #' and \code{\link{ranef.brmsfit}}. #' #' @return A list of 3D arrays (one per grouping factor). #' If \code{summary} is \code{TRUE}, #' the 1st dimension contains the factor levels, #' the 2nd dimension contains the summary statistics #' (see \code{\link{posterior_summary}}), and #' the 3rd dimension contains the group-level effects. #' If \code{summary} is \code{FALSE}, the 1st dimension contains #' the posterior draws, the 2nd dimension contains the factor levels, #' and the 3rd dimension contains the group-level effects. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), #' data = epilepsy, family = gaussian(), chains = 2) #' ## extract population and group-level coefficients separately #' fixef(fit) #' ranef(fit) #' ## extract combined coefficients #' coef(fit) #' } #' #' @export coef.brmsfit <- function(object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) { contains_samples(object) object <- restructure(object) if (!nrow(object$ranef)) { stop2("No group-level effects detected. Call method ", "'fixef' to access population-level effects.") } fixef <- fixef(object, summary = FALSE, ...) coef <- ranef(object, summary = FALSE, ...) # add missing coefficients to fixef all_ranef_names <- unique(ulapply(coef, function(x) dimnames(x)[[3]])) fixef_names <- colnames(fixef) fixef_no_digits <- get_matches("^[^\\[]+", fixef_names) miss_fixef <- setdiff(all_ranef_names, fixef_names) miss_fixef_no_digits <- get_matches("^[^\\[]+", miss_fixef) new_fixef <- named_list(miss_fixef) for (k in seq_along(miss_fixef)) { # digits occur in ordinal models with category specific effects match_fixef <- match(miss_fixef_no_digits[k], fixef_names) if (!is.na(match_fixef)) { new_fixef[[k]] <- fixef[, match_fixef] } else if (!miss_fixef[k] %in% fixef_no_digits) { new_fixef[[k]] <- 0 } } rm_fixef <- fixef_names %in% miss_fixef_no_digits fixef <- fixef[, !rm_fixef, drop = FALSE] fixef <- do_call(cbind, c(list(fixef), rmNULL(new_fixef))) for (g in names(coef)) { # add missing coefficients to ranef ranef_names <- dimnames(coef[[g]])[[3]] ranef_no_digits <- get_matches("^[^\\[]+", ranef_names) miss_ranef <- setdiff(fixef_names, ranef_names) miss_ranef_no_digits <- get_matches("^[^\\[]+", miss_ranef) new_ranef <- named_list(miss_ranef) for (k in seq_along(miss_ranef)) { # digits occur in ordinal models with category specific effects match_ranef <- match(miss_ranef_no_digits[k], ranef_names) if (!is.na(match_ranef)) { new_ranef[[k]] <- coef[[g]][, , match_ranef] } else if (!miss_ranef[k] %in% ranef_no_digits) { new_ranef[[k]] <- array(0, dim = dim(coef[[g]])[1:2]) } } rm_ranef <- ranef_names %in% miss_ranef_no_digits coef[[g]] <- coef[[g]][, , !rm_ranef, drop = FALSE] coef[[g]] <- abind(c(list(coef[[g]]), rmNULL(new_ranef))) for (nm in dimnames(coef[[g]])[[3]]) { is_ord_intercept <- grepl("(^|_)Intercept\\[[[:digit:]]+\\]$", nm) if (is_ord_intercept) { # correct the sign of thresholds in ordinal models resp <- if (is_mv(object)) get_matches("^[^_]+", nm) family <- family(object, resp = resp)$family if (has_thres_minus_eta(family)) { coef[[g]][, , nm] <- fixef[, nm] - coef[[g]][, , nm] } else if (has_eta_minus_thres(family)) { coef[[g]][, , nm] <- coef[[g]][, , nm] - fixef[, nm] } else { coef[[g]][, , nm] <- fixef[, nm] + coef[[g]][, , nm] } } else { coef[[g]][, , nm] <- fixef[, nm] + coef[[g]][, , nm] } } if (summary) { coef[[g]] <- posterior_summary(coef[[g]], probs, robust) } } coef } #' Extract Variance and Correlation Components #' #' This function calculates the estimated standard deviations, #' correlations and covariances of the group-level terms #' in a multilevel model of class \code{brmsfit}. #' For linear models, the residual standard deviations, #' correlations and covariances are also returned. #' #' @aliases VarCorr #' #' @param x An object of class \code{brmsfit}. #' @inheritParams fixef.brmsfit #' @param sigma Ignored (included for compatibility with #' \code{\link[nlme:VarCorr]{VarCorr}}). #' @param ... Currently ignored. #' #' @return A list of lists (one per grouping factor), each with #' three elements: a matrix containing the standard deviations, #' an array containing the correlation matrix, and an array #' containing the covariance matrix with variances on the diagonal. #' #' @examples #' \dontrun{ #' fit <- brm(count ~ zAge + zBase * Trt + (1+Trt|visit), #' data = epilepsy, family = gaussian(), chains = 2) #' VarCorr(fit) #' } #' #' @method VarCorr brmsfit #' @import abind abind #' @importFrom nlme VarCorr #' @export VarCorr #' @export VarCorr.brmsfit <- function(x, sigma = 1, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...) { contains_samples(x) x <- restructure(x) if (!(nrow(x$ranef) || any(grepl("^sigma($|_)", parnames(x))))) { stop2("The model does not contain covariance matrices.") } .VarCorr <- function(y) { # extract samples for sd, cor and cov out <- list(sd = as.matrix(x, pars = y$sd_pars, fixed = TRUE)) colnames(out$sd) <- y$rnames # compute correlation and covariance matrices found_cor_pars <- intersect(y$cor_pars, parnames(x)) if (length(found_cor_pars)) { cor <- as.matrix(x, pars = found_cor_pars, fixed = TRUE) if (length(found_cor_pars) < length(y$cor_pars)) { # some correlations are missing and will be replaced by 0 cor_all <- matrix(0, nrow = nrow(cor), ncol = length(y$cor_pars)) names(cor_all) <- y$cor_pars for (i in seq_len(ncol(cor_all))) { found <- match(names(cor_all)[i], colnames(cor)) if (!is.na(found)) { cor_all[, i] <- cor[, found] } } cor <- cor_all } out$cor <- get_cor_matrix(cor = cor) out$cov <- get_cov_matrix(sd = out$sd, cor = cor) dimnames(out$cor)[2:3] <- list(y$rnames, y$rnames) dimnames(out$cov)[2:3] <- list(y$rnames, y$rnames) if (summary) { out$cor <- posterior_summary(out$cor, probs, robust) out$cov <- posterior_summary(out$cov, probs, robust) } } if (summary) { out$sd <- posterior_summary(out$sd, probs, robust) } return(out) } if (nrow(x$ranef)) { get_names <- function(group) { # get names of group-level parameters r <- subset2(x$ranef, group = group) rnames <- as.vector(get_rnames(r)) cor_type <- paste0("cor_", group) sd_pars <- paste0("sd_", group, "__", rnames) cor_pars <- get_cornames(rnames, cor_type, brackets = FALSE) nlist(rnames, sd_pars, cor_pars) } group <- unique(x$ranef$group) tmp <- lapply(group, get_names) names(tmp) <- group } else { tmp <- list() } # include residual variances in the output as well bterms <- parse_bf(x$formula) if (is.brmsterms(bterms)) { if (simple_sigma(bterms) && !is.mixfamily(x$family)) { tmp_resid <- list(rnames = bterms$resp, sd_pars = "sigma") tmp <- c(tmp, residual__ = list(tmp_resid)) } } else if (is.mvbrmsterms(bterms)) { simple_sigma <- ulapply(bterms$terms, simple_sigma) pred_sigma <- ulapply(bterms$terms, pred_sigma) is_mix <- ulapply(x$family, is.mixfamily) if (any(simple_sigma) && !any(pred_sigma) && !any(is_mix)) { resps <- bterms$responses[simple_sigma] sd_pars <- paste0("sigma_", resps) if (bterms$rescor) { cor_pars <- get_cornames(resps, type = "rescor", brackets = FALSE) } else { cor_pars <- character(0) } tmp_resid <- nlist(rnames = resps, sd_pars, cor_pars) tmp <- c(tmp, residual__ = list(tmp_resid)) } } lapply(tmp, .VarCorr) } #' @export model.frame.brmsfit <- function(formula, ...) { formula$data } #' Number of Posterior Samples #' #' Extract the number of posterior samples stored in a fitted Bayesian model. #' #' @aliases nsamples #' #' @param object An object of class \code{brmsfit}. #' @param subset An optional integer vector defining a subset of samples #' to be considered. #' @param incl_warmup A flag indicating whether to also count warmup / burn-in #' samples. #' @param ... Currently ignored. #' #' @method nsamples brmsfit #' @export #' @export nsamples #' @importFrom rstantools nsamples nsamples.brmsfit <- function(object, subset = NULL, incl_warmup = FALSE, ...) { if (!is(object$fit, "stanfit") || !length(object$fit@sim)) { out <- 0 } else { ntsamples <- object$fit@sim$n_save[1] if (!incl_warmup) { ntsamples <- ntsamples - object$fit@sim$warmup2[1] } ntsamples <- ntsamples * object$fit@sim$chains if (length(subset)) { out <- length(subset) if (out > ntsamples || max(subset) > ntsamples) { stop2("Argument 'subset' is invalid.") } } else { out <- ntsamples } } out } #' @export nobs.brmsfit <- function(object, resp = NULL, ...) { if (is_mv(object) && length(resp)) { resp <- validate_resp(resp, object, multiple = FALSE) bterms <- parse_bf(object$formula$forms[[resp]]) out <- nrow(subset_data(model.frame(object), bterms)) } else { out <- nrow(model.frame(object)) } out } #' Number of Grouping Factor Levels #' #' Extract the number of levels of one or more grouping factors. #' #' @aliases ngrps.brmsfit #' #' @param object An \R object. #' @param ... Currently ignored. #' #' @return A named list containing the number of levels per #' grouping factor. #' #' @export ngrps.brmsfit <- function(object, ...) { object <- restructure(object) if (nrow(object$ranef)) { out <- lapply(attr(object$ranef, "levels"), length) } else { out <- NULL } out } #' @rdname ngrps.brmsfit #' @export ngrps <- function(object, ...) { UseMethod("ngrps") } #' @export formula.brmsfit <- function(x, ...) { x$formula } #' @export getCall.brmsfit <- function(x, ...) { x$formula } #' Extract Model Family Objects #' #' @inheritParams posterior_predict.brmsfit #' @param ... Currently unused. #' #' @return A \code{brmsfamily} object #' or a list of such objects for multivariate models. #' #' @export family.brmsfit <- function(object, resp = NULL, ...) { resp <- validate_resp(resp, object) if (!is.null(resp)) { # multivariate model family <- lapply(object$formula$forms[resp], "[[", "family") if (length(resp) == 1L) { family <- family[[1]] } } else { # univariate model family <- object$formula$family if (is.null(family)) { family <- object$family } } family } #' Expose user-defined \pkg{Stan} functions #' #' Export user-defined \pkg{Stan} function and #' optionally vectorize them. For more details see #' \code{\link[rstan:expose_stan_functions]{expose_stan_functions}}. #' #' @param x An object of class \code{brmsfit}. #' @param vectorize Logical; Indicates if the exposed functions #' should be vectorized via \code{\link{Vectorize}}. #' Defaults to \code{FALSE}. #' @param env Environment where the functions should be made #' available. Defaults to the global environment. #' @param ... Further arguments passed to #' \code{\link[rstan:expose_stan_functions]{expose_stan_functions}}. #' #' @export expose_functions.brmsfit <- function(x, vectorize = FALSE, env = globalenv(), ...) { vectorize <- as_one_logical(vectorize) if (vectorize) { funs <- rstan::expose_stan_functions(x$fit, env = environment(), ...) for (i in seq_along(funs)) { FUN <- Vectorize(get(funs[i], mode = "function")) assign(funs[i], FUN, pos = env) } } else { funs <- rstan::expose_stan_functions(x$fit, env = env, ...) } invisible(funs) } #' @rdname expose_functions.brmsfit #' @export expose_functions <- function(x, ...) { UseMethod("expose_functions") } brms/R/formula-sm.R0000644000176200001440000000607713606622001013631 0ustar liggesusers# This file contains functions dealing with the extended # formula syntax to specify smooth terms via mgcv #' Defining smooths in \pkg{brms} formulas #' #' Functions used in definition of smooth terms within a model formulas. #' The function does not evaluate a (spline) smooth - it exists purely #' to help set up a model using spline based smooths. #' #' @param ... Arguments passed to \code{\link[mgcv:s]{mgcv::s}} or #' \code{\link[mgcv:t2]{mgcv::t2}}. #' #' @details The function defined here are just simple wrappers #' of the respective functions of the \pkg{mgcv} package. #' #' @seealso \code{\link{brmsformula}}, #' \code{\link[mgcv:s]{mgcv::s}}, \code{\link[mgcv:t2]{mgcv::t2}} #' #' @examples #' \dontrun{ #' # simulate some data #' dat <- mgcv::gamSim(1, n = 200, scale = 2) #' #' # fit univariate smooths for all predictors #' fit1 <- brm(y ~ s(x0) + s(x1) + s(x2) + s(x3), #' data = dat, chains = 2) #' summary(fit1) #' plot(marginal_smooths(fit1), ask = FALSE) #' #' # fit a more complicated smooth model #' fit2 <- brm(y ~ t2(x0, x1) + s(x2, by = x3), #' data = dat, chains = 2) #' summary(fit2) #' plot(marginal_smooths(fit2), ask = FALSE) #' } #' #' @export s <- function(...) { mgcv::s(...) } #' @rdname s #' @export t2 <- function(...) { mgcv::t2(...) } # extract information about smooth terms # @param x either a formula or a list containing an element "sm" # @param data data.frame containing the covariates tidy_smef <- function(x, data) { if (is.formula(x)) { x <- parse_bf(x, check_response = FALSE)$dpars$mu } form <- x[["sm"]] if (!is.formula(form)) { return(empty_data_frame()) } out <- data.frame(term = all_terms(form), stringsAsFactors = FALSE) nterms <- nrow(out) out$sfun <- get_matches("^[^\\(]+", out$term) out$vars <- out$byvars <- out$covars <- vector("list", nterms) for (i in seq_len(nterms)) { sm <- eval2(out$term[i]) out$covars[[i]] <- sm$term if (sm$by != "NA") { out$byvars[[i]] <- sm$by } out$vars[[i]] <- c(out$covars[[i]], out$byvars[[i]]) } out$label <- paste0(out$sfun, rename(ulapply(out$vars, collapse))) # prepare information inferred from the data sdata <- data_sm(x, data, knots = attr(data, "knots")) bylevels <- attr(sdata$Xs, "bylevels") nby <- lengths(bylevels) tmp <- vector("list", nterms) for (i in seq_len(nterms)) { tmp[[i]] <- out[i, , drop = FALSE] tmp[[i]]$termnum <- i if (nby[i] > 0L) { tmp[[i]] <- do_call(rbind, repl(tmp[[i]], nby[i])) tmp[[i]]$bylevel <- rm_wsp(bylevels[[i]]) tmp[[i]]$byterm <- paste0(tmp[[i]]$term, tmp[[i]]$bylevel) str_add(tmp[[i]]$label) <- rename(tmp[[i]]$bylevel) } else { tmp[[i]]$bylevel <- NA tmp[[i]]$byterm <- tmp[[i]]$term } } out <- do_call(rbind, tmp) out$knots <- sdata[grepl("^knots_", names(sdata))] out$nbases <- lengths(out$knots) attr(out, "Xs_names") <- colnames(sdata$Xs) rownames(out) <- NULL out } # check if smooths are present in the model has_smooths <- function(bterms) { length(get_effect(bterms, target = "sm")) > 0L } brms/NEWS.md0000644000176200001440000021123313623752000012313 0ustar liggesusers# brms 2.12.0 ### New Features * Fix parameters to constants via the `prior` argument. (#783) * Specify autocorrelation terms directly in the model formula. (#708) * Translate integer covariates in non-linear formulas to integer arrays in Stan. * Estimate `sigma` in combination with fixed correlation matrices via autocorrelation term `fcor`. * Use argument `data2` in `brm` and related functions to pass data objects which cannot be passed via `data`. The usage of `data2` will be extended in future versions. * Compute pointwise log-likelihood values via `log_lik` for non-factorizable Student-t models. (#705) ### Bug Fixes * Fix output of `posterior_predict` for `multinomial` models thanks to Ivan Ukhov. * Fix selection of group-level terms via `re_formula` in multivariate models thanks to Maxime Dahirel. (#834) * Enforce correct ordering of terms in `re_formula` thanks to @ferberkl. (#844) * Fix post-processing of multivariate multilevel models when multiple IDs are used for the same grouping factor thanks to @lott999. (#835) * Store response category names of ordinal models in the output of `posterior_predict` again thanks to Mattew Kay. (#838) * Handle `NA` values more consistently in `posterior_table` thanks to Anna Hake. (#845) * Fix a bug in the Stan code of models with multiple monotonic varying effects across different groups thanks to Julian Quandt. ### Other Changes * Rename `offset` variables to `offsets` in the generated Stan code as the former will be reserved in the new stanc3 compiler. # brms 2.11.1 ### Bug Fixes * Fix version requirement of the `loo` package. * Fix effective sample size note in the `summary` output. (#824) * Fix an edge case in the handling of covariates in special terms thanks to Andrew Milne. (#823) * Allow restructuring objects multiple times with different brms versions thanks to Jonathan A. Nations. (#828) * Fix validation of ordered factors in `newdata` thanks to Andrew Milne. (#830) # brms 2.11.0 ### New Features * Support grouped ordinal threshold vectors via addition argument `resp_thres`. (#675) * Support method `loo_subsample` for performing approximate leave-one-out cross-validation for large data. * Allow storing more model fit critera via `add_criterion`. (#793) ### Bug Fixes * Fix prediction uncertainties of new group levels for `sample_new_levels = "uncertainty"` thanks to Dominic Magirr. (#779) * Fix problems when using `pp_check` on censored models thanks to Andrew Milne. (#744) * Fix error in the generated Stan code of multivariate `zero_inflated_binomial` models thanks to Raoul Wolf. (#756) * Fix predictions of spline models when using addition argument `subset` thanks to Ruben Arslan. * Fix out-of-sample predictions of AR models when predicting more than one step ahead. * Fix problems when using `reloo` or `kfold` with CAR models. * Fix problems when using `fitted(..., scale = "linear")` with multinomial models thanks to Santiago Olivella. (#770) * Fix problems in the `as.mcmc` method for thinned models thanks to @hoxo-m. (#811) * Fix problems in parsing covariates of special effects terms thanks to Riccardo Fusaroli (#813) ### Other Changes * Rename `marginal_effects` to `conditional_effects` and `marginal_smooths` to `conditional_smooths`. (#735) * Rename `stanplot` to `mcmc_plot`. * Add method `pp_expect` as an alias of `fitted`. (#644) * Model fit criteria computed via `add_criterion` are now stored in the `brmsfit$criteria` slot. * Deprecate `resp_cat` in favor of `resp_thres`. * Deprecate specifying global priors on regression coefficients in categorical and multivariate models. * Improve names of weighting methods in `model_weights`. * Deprecate reserved variable `intercept` in favor of `Intercept`. * Deprecate argument `exact_match` in favor of `fixed`. * Deprecate functions `add_loo` and `add_waic` in favor of `add_criterion`. # brms 2.10.0 ### New Features * Improve convergence diagnostics in the `summary` output. (#712) * Use primitive Stan GLM functions whenever possible. (#703) * Pass real and integer data vectors to custom families via the addition arguments `vreal` and `vint`. (#707) * Model compound symmetry correlations via `cor_cosy`. (#403) * Predict `sigma` in combination with several autocorrelation structures. (#403) * Use addition term `rate` to conveniently handle denominators of rate responses in log-linear models. * Fit BYM2 CAR models via `cor_car` thanks to the case study and help of Mitzi Morris. ### Other Changes * Substantially improve the sampling efficiency of SAR models thanks to the GitHub user aslez. (#680) * No longer allow changing the boundaries of autocorrelation parameters. * Set the number of trials to 1 by default in `marginal_effects` if not specified otherwise. (#718) * Use non-standard evaluation for addition terms. * Name temporary intercept parameters more consistently in the Stan code. ### Bug Fixes * Fix problems in the post-processing of `me` terms with grouping factors thanks to the GitHub user tatters. (#706) * Allow grouping variables to start with a dot thanks to Bruno Nicenboim. (#679) * Allow the `horseshoe` prior in categorical and related models thanks to the Github user tatters. (#678) * Fix extraction of prior samples for overall intercepts in `prior_samples` thanks to Jonas Kristoffer Lindelov. (#696) * Allow underscores to be used in category names of categorical responses thanks to Emmanuel Charpentier. (#672) * Fix Stan code of multivariate models with multi-membership terms thanks to the Stan discourse user Pia. * Improve checks for non-standard variable names thanks to Ryan Holbrook. (#721) * Fix problems when plotting facetted spaghetti plots via `marginal_smooths` thanks to Gavin Simpson. (#740) # brms 2.9.0 ### New Features * Specify non-linear ordinal models. (#623) * Allow to fix thresholds in ordinal mixture models (#626) * Use the `softplus` link function in various families. (#622) * Use QR decomposition of design matrices via argument `decomp` of `brmsformula` thanks to the help of Ben Goodrich. (#640) * Define argument `sparse` separately for each model formula. * Allow using `bayes_R2` and `loo_R2` with ordinal models. (#639) * Support `cor_arma` in non-normal models. (#648) ### Other Changes * Change the parameterization of monotonic effects to improve their interpretability. (#578) * No longer support the `cor_arr` and `cor_bsts` correlation structures after a year of deprecation. * Refactor internal evaluation of special predictor terms. * Improve penality of splines thanks to Ben Goodrich and Ruben Arslan. ### Bug Fixes * Fix a problem when applying `marginal_effects` to measurement error models thanks to Jonathan A. Nations. (#636) * Fix computation of log-likelihood values for weighted mixture models. * Fix computation of fitted values for truncated lognormal and weibull models. * Fix checking of response boundaries for models with missing values thanks to Lucas Deschamps. * Fix Stan code of multivariate models with both residual correlations and missing value terms thanks to Solomon Kurz. * Fix problems with interactions of special terms when extracting variable names in `marginal_effects`. * Allow compiling a model in `brm_multiple` without sampling thanks to Will Petry. (#671) # brms 2.8.0 ### New Features * Fit multinomial models via family `multinomial`. (#463) * Fit Dirichlet models via family `dirichlet`. (#463) * Fit conditional logistic models using the `categorical` and `multinomial` families together with non-linear formula syntax. (#560) * Choose the reference category of `categorical` and related families via argument `refcat` of the corresponding family functions. * Use different subsets of the data in different univariate parts of a multivariate model via addition argument `subset`. (#360) * Control the centering of population-level design matrices via argument `center` of `brmsformula` and related functions. * Add an `update` method for `brmsfit_multiple` objects. (#615) * Split folds after `group` in the `kfold` method. (#619) ### Other changes * Deprecate `compare_ic` and instead recommend `loo_compare` for the comparison of `loo` objects to ensure consistency between packages. (#414) * Use the **glue** package in the Stan code generation. (#549) * Introduce `mvbind` to eventually replace `cbind` in the formula syntax of multivariate models. * Validate several sampling-related arguments in `brm` before compiling the Stan model. (#576) * Show evaluated vignettes on CRAN again. (#591) * Export function `get_y` which is used to extract response values from `brmsfit` objects. ### Bug fixes * Fix an error when trying to change argument `re_formula` in `bayes_R2` thanks to the GitHub user emieldl. (#592) * Fix occasional problems when running chains in parallel via the **future** package thanks to Jared Knowles. (#579) * Ensure correct ordering of response categories in ordinal models thanks to Jonas Kristoffer Lindelov. (#580) * Ignore argument `resp` of `marginal_effects` in univariate models thanks to Vassilis Kehayas. (#589) * Correctly disable cell-mean coding in varying effects. * Allow to fix parameter `ndt` in drift diffusion models. * Fix Stan code for t-distributed varying effects thanks to Ozgur Asar. * Fix an error in the post-processing of monotonic effects occuring for multivariate models thanks to James Rae. (#598) * Fix lower bounds in truncated discrete models. * Fix checks of the original data in `kfold` thanks to the GitHub user gcolitti. (#602) * Fix an error when applying the `VarCorr` method to meta-analytic models thanks to Michael Scharkow. (#616) # brms 2.7.0 ### New features * Fit approximate and non-isotropic Gaussian processes via `gp`. (#540) * Enable parallelization of model fitting in `brm_multiple` via the future package. (#364) * Perform posterior predictions based on k-fold cross-validation via `kfold_predict`. (#468) * Indicate observations for out-of-sample predictions in ARMA models via argument `oos` of `extract_draws`. (#539) ### Other changes * Allow factor-like variables in smooth terms. (#562) * Make plotting of `marginal_effects` more robust to the usage of non-standard variable names. * Deactivate certain data validity checks when using custom families. * Improve efficiency of adjacent category models. * No longer print informational messages from the Stan parser. ### Bug fixes * Fix an issue that could result in a substantial efficiency drop of various post-processing methods for larger models. * Fix an issue when that resulted in an error when using `fitted(..., scale = "linear")` with ordinal models thanks to Andrew Milne. (#557) * Allow setting priors on the overall intercept in sparse models. * Allow sampling from models with only a single observation that also contain an offset thanks to Antonio Vargas. (#545) * Fix an error when sampling from priors in mixture models thanks to Jacki Buros Novik. (#542) * Fix a problem when trying to sample from priors of parameter transformations. * Allow using `marginal_smooths` with ordinal models thanks to Andrew Milne. (#570) * Fix an error in the post-processing of `me` terms thanks to the GitHub user hlluik. (#571) * Correctly update `warmup` samples when using `update.brmsfit`. # brms 2.6.0 ### New features * Fit factor smooth interactions thanks to Simon Wood. * Specify separate priors for thresholds in ordinal models. (#524) * Pass additional arguments to `rstan::stan_model` via argument `stan_model_args` in `brm`. (#525) * Save model objects via argument `file` in `add_ic` after adding model fit criteria. (#478) * Compute density ratios based on MCMC samples via `density_ratio`. * Ignore offsets in various post-processing methods via argument `offset`. * Update addition terms in formulas via `update_adterms`. ### Other changes * Improve internal modularization of smooth terms. * Reduce size of internal example models. ### Bug fixes * Correctly plot splines with factorial covariates via `marginal_smooths`. * Allow sampling from priors in intercept only models thanks to Emmanuel Charpentier. (#529) * Allow logical operators in non-linear formulas. # brms 2.5.0 ### New features * Improve `marginal_effects` to better display ordinal and categorical models via argument `categorical`. (#491, #497) * Improve method `kfold` to offer more options for specifying omitted subsets. (#510) * Compute estimated values of non-linear parameters via argument `nlpar` in method `fitted`. * Disable automatic cell-mean coding in model formulas without an intercept via argument `cmc` of `brmsformula` and related functions thanks to Marie Beisemann. * Allow using the `bridge_sampler` method even if prior samples are drawn within the model. (#485) * Specify post-processing functions of custom families directly in `custom_family`. * Select a subset of coefficients in `fixef`, `ranef`, and `coef` via argument `pars`. (#520) * Allow to `overwrite` already stored fit indices when using `add_ic`. ### Other changes * Ignore argument `resp` when post-processing univariate models thanks to Ruben Arslan. (#488) * Deprecate argument `ordinal` of `marginal_effects`. (#491) * Deprecate argument `exact_loo` of `kfold`. (#510) * Deprecate usage of `binomial` families without specifying `trials`. * No longer sample from priors of population-level intercepts when using the default intercept parameterization. ### Bug fixes * Correctly sample from LKJ correlation priors thanks to Donald Williams. * Remove stored fit indices when calling `update` on brmsfit objects thanks to Emmanuel Charpentier. (#490) * Fix problems when predicting a single data point using spline models thanks to Emmanuel Charpentier. (#494) * Set `Post.Prob = 1` if `Evid.Ratio = Inf` in method `hypothesis` thanks to Andrew Milne. (#509) * Ensure correct handling of argument `file` in `brm_multiple`. # brms 2.4.0 ### New features * Define custom variables in all of Stan's program blocks via function `stanvar`. (#459) * Change the scope of non-linear parameters to be global within univariate models. (#390) * Allow to automatically group predictor values in Gaussian processes specified via `gp`. This may lead to a considerable increase in sampling efficiency. (#300) * Compute LOO-adjusted R-squared using method `loo_R2`. * Compute non-linear predictors outside of a loop over observations by means of argument `loop` in `brmsformula`. * Fit non-linear mixture models. (#456) * Fit censored or truncated mixture models. (#469) * Allow `horseshoe` and `lasso` priors to be set on special population-level effects. * Allow vectors of length greater one to be passed to `set_prior`. * Conveniently save and load fitted model objects in `brm` via argument `file`. (#472) * Display posterior probabilities in the output of `hypothesis`. ### Other changes * Deprecate argument `stan_funs` in `brm` in favor of using the `stanvars` argument for the specification of custom Stan functions. * Deprecate arguments `flist` and `...` in `nlf`. * Deprecate argument `dpar` in `lf` and `nlf`. ### Bug fixes * Allow custom families in mixture models thanks to Noam Ross. (#453) * Ensure compatibility with **mice** version 3.0. (#455) * Fix naming of correlation parameters of group-level terms with multiple subgroups thanks to Kristoffer Magnusson. (#457) * Improve scaling of default priors in `lognormal` models (#460). * Fix multiple problems in the post-processing of categorical models. * Fix validation of nested grouping factors in post-processing methods when passing new data thanks to Liam Kendall. # brms 2.3.1 ### New features * Allow censoring and truncation in zero-inflated and hurdle models. (#430) * Export zero-inflated and hurdle distribution functions. ### Other changes * Improve sampling efficiency of the ordinal families `cumulative`, `sratio`, and `cratio`. (#433) * Allow to specify a single k-fold subset in method `kfold`. (#441) ### Bug fixes * Fix a problem in `launch_shinystan` due to which the maximum treedepth was not correctly displayed thanks to Paul Galpern. (#431) # brms 2.3.0 ### Features * Extend `cor_car` to support intrinsic CAR models in pairwise difference formulation thanks to the case study of Mitzi Morris. * Compute `loo` and related methods for non-factorizable normal models. ### Other changes * Rename quantile columns in `posterior_summary`. This affects the output of `predict` and related methods if `summary = TRUE`. (#425) * Use hashes to check if models have the same response values when performing model comparisons. (#414) * No longer set `pointwise` dynamically in `loo` and related methods. (#416) * No longer show information criteria in the summary output. * Simplify internal workflow to implement native response distributions. (#421) ### Bug fixes * Allow `cor_car` in multivariate models with residual correlations thanks to Quentin Read. (#427) * Fix a problem in the Stan code generation of distributional `beta` models thanks to Hans van Calster. (#404) * Fix `launch_shinystan.brmsfit` so that all parameters are now shown correctly in the diagnose tab. (#340) # brms 2.2.0 ### Features * Specify custom response distributions with function `custom_family`. (#381) * Model missing values and measurement error in responses using the `mi` addition term. (#27, #343) * Allow missing values in predictors using `mi` terms on the right-hand side of model formulas. (#27) * Model interactions between the special predictor terms `mo`, `me`, and `mi`. (#313) * Introduce methods `model_weights` and `loo_model_weights` providing several options to compute model weights. (#268) * Introduce method `posterior_average` to extract posterior samples averaged across models. (#386) * Allow hyperparameters of group-level effects to vary over the levels of a categorical covariate using argument `by` in function `gr`. (#365) * Allow predictions of measurement-error models with new data. (#335) * Pass user-defined variables to Stan via `stanvar`. (#219, #357) * Allow ordinal families in mixture models. (#389) * Model covariates in multi-membership structures that vary over the levels of the grouping factor via `mmc` terms. (#353) * Fit shifted log-normal models via family `shifted_lognormal`. (#218) * Specify nested non-linear formulas. * Introduce function `make_conditions` to ease preparation of conditions for `marginal_effects`. ### Other changes * Change the parameterization of `weibull` and `exgaussian` models to be consistent with other model classes. Post-processing of related models fitted with earlier version of `brms` is no longer possible. * Treat integer responses in `ordinal` models as directly indicating categories even if the lowest integer is not one. * Improve output of the `hypothesis` method thanks to the ideas of Matti Vuorre. (#362) * Always plot `by` variables as facets in `marginal_smooths`. * Deprecate the `cor_bsts` correlation structure. ### Bug fixes * Allow the `:` operator to combine groups in multi-membership terms thanks to Gang Chen. * Avoid an unexpected error when calling `LOO` with argument `reloo = TRUE` thanks to Peter Konings. (#348) * Fix problems in `predict` when applied to categorical models thanks to Lydia Andreyevna Krasilnikova and Thomas Vladeck. (#336, #345) * Allow truncation in multivariate models with missing values thanks to Malte Lau Petersen. (#380) * Force time points to be unique within groups in autocorrelation structures thanks to Ruben Arslan. (#363) * Fix problems when post-processing multiple uncorrelated group-level terms of the same grouping factor thanks to Ivy Jansen. (#374) * Fix a problem in the Stan code of multivariate `weibull` and `frechet` models thanks to the GitHub user philj1s. (#375) * Fix a rare error when post-processing `binomial` models thanks to the GitHub user SeanH94. (#382) * Keep attributes of variables when preparing the `model.frame` thanks to Daniel Luedecke. (#393) # brms 2.1.0 ### Features * Fit models on multiple imputed datasets via `brm_multiple` thanks to Ruben Arslan. (#27) * Combine multiple `brmsfit` objects via function `combine_models`. * Compute model averaged posterior predictions with method `pp_average`. (#319) * Add new argument `ordinal` to `marginal_effects` to generate special plots for ordinal models thanks to the idea of the GitHub user silberzwiebel. (#190) * Use informative inverse-gamma priors for length-scale parameters of Gaussian processes. (#275) * Compute hypotheses for all levels of a grouping factor at once using argument `scope` in method `hypothesis`. (#327) * Vectorize user-defined `Stan` functions exported via `export_functions` using argument `vectorize`. * Allow predicting new data in models with ARMA autocorrelation structures. ### Bug fixes * Correctly recover noise-free coefficients through `me` terms thanks to Ruben Arslan. As a side effect, it is no longer possible to define priors on noise-free `Xme` variables directly, but only on their hyper-parameters `meanme` and `sdme`. * Fix problems in renaming parameters of the `cor_bsts` structure thanks to Joshua Edward Morten. (#312) * Fix some unexpected errors when predicting from ordinal models thanks to David Hervas and Florian Bader. (#306, #307, #331) * Fix problems when estimating and predicting multivariate ordinal models thanks to David West. (#314) * Fix various minor problems in autocorrelation structures thanks to David West. (#320) # brms 2.0.1 ### Features * Export the helper functions `posterior_summary` and `posterior_table` both being used to summarize posterior samples and predictions. ### Bug fixes * Fix incorrect computation of intercepts in `acat` and `cratio` models thanks to Peter Phalen. (#302) * Fix `pointwise` computation of `LOO` and `WAIC` in multivariate models with estimated residual correlation structure. * Fix problems in various S3 methods sometimes requiring unused variables to be specified in `newdata`. * Fix naming of Stan models thanks to Hao Ran Lai. # brms 2.0.0 This is the second major release of `brms`. The main new feature are generalized multivariate models, which now support everything already possible in univariate models, but with multiple response variables. Further, the internal structure of the package has been improved considerably to be easier to maintain and extend in the future. In addition, most deprecated functionality and arguments have been removed to provide a clean new start for the package. Models fitted with `brms` 1.0 or higher should remain fully compatible with `brms` 2.0. ### Features * Add support for generalized multivariate models, where each of the univariate models may have a different family and autocorrelation structure. Residual correlations can be estimated for multivariate `gaussian` and `student` models. All features supported in univariate models are now also available in multivariate models. (#3) * Specify different formulas for different categories in `categorical` models. * Add weakly informative default priors for the parameter class `Intercept` to improve convergence of more complex distributional models. * Optionally display the MC standard error in the `summary` output. (#280) * Add argument `re.form` as an alias of `re_formula` to the methods `posterior_predict`, `posterior_linpred`, and `predictive_error` for consistency with other packages making use of these methods. (#283) ### Other changes * Refactor many parts of the package to make it more consistent and easier to extend. * Show the link functions of all distributional parameters in the `summary` output. (#277) * Reduce working memory requirements when extracting posterior samples for use in `predict` and related methods thanks to Fanyi Zhang. (#224) * Remove deprecated aliases of functions and arguments from the package. (#278) * No longer support certain prior specifications, which were previously labeled as deprecated. * Remove the depreacted addition term `disp` from the package. * Remove old versions of methods `fixef`, `ranef`, `coef`, and `VarCorr`. * No longer support models fitted with `brms` < 1.0, which used the multivariate `'trait'` syntax orginally deprecated in `brms` 1.0. * Make posterior sample extraction in the `summary` method cleaner and less error prone. * No longer fix the seed for random number generation in `brm` to avoid unexpected behavior in simulation studies. ### Bug fixes * Store `stan_funs` in `brmsfit` objects to allow using `update` on models with user-defined Stan functions thanks to Tom Wallis. (#288) * Fix problems in various post-processing methods when applied to models with the reserved variable `intercept` in group-level terms thanks to the GitHub user ASKurz. (#279) * Fix an unexpected error in `predict` and related methods when setting `sample_new_levels = "gaussian"` in models with only one group-level effect. Thanks to Timothy Mastny. (#286) # brms 1.10.2 ### Features * Allow setting priors on noise-free variables specified via function `me`. * Add arguments `Ksub`, `exact_loo` and `group` to method `kfold` for defining omitted subsets according to a grouping variable or factor. * Allow addition argument `se` in `skew_normal` models. ### Bug fixes * Ensure correct behavior of horseshoe and lasso priors in multivariate models thanks to Donald Williams. * Allow using `identity` links on all parameters of the `wiener` family thanks to Henrik Singmann. (#276) * Use reasonable dimnames in the output of `fitted` when returning linear predictors of ordinal models thanks to the GitHub user atrolle. (#274) * Fix problems in `marginal_smooths` occuring for multi-membership models thanks to Hans Tierens. # brms 1.10.0 ### Features * Rebuild monotonic effects from scratch to allow specifying interactions with other variables. (#239) * Introduce methods `posterior_linpred` and `posterior_interval` for consistency with other model fitting packages based on `Stan`. * Introduce function `theme_black` providing a black `ggplot2` theme. * Specify special group-level effects within the same terms as ordinary group-level effects. * Add argument `prob` to `summary`, which allows to control the width of the computed uncertainty intervals. (#259) * Add argument `newdata` to the `kfold` method. * Add several arguments to the `plot` method of `marginal_effects` to improve control over the appearences of the plots. ### Other changes * Use the same noise-free variables for all model parts in measurement error models. (#257) * Make names of local-level terms used in the `cor_bsts` structure more informative. * Store the `autocor` argument within `brmsformula` objects. * Store posterior and prior samples in separate slots in the output of method `hypothesis`. * No longer change the default theme of `ggplot2` when attaching `brms`. (#256) * Make sure signs of estimates are not dropped when rounding to zero in `summary.brmsfit`. (#263) * Refactor parts of `extract_draws` and `linear_predictor` to be more consistent with the rest of the package. ### Bug fixes * Do not silence the `Stan` parser when calling `brm` to get informative error messages about invalid priors. * Fix problems with spaces in priors passed to `set_prior`. * Handle non `data.frame` objects correctly in `hypothesis.default`. * Fix a problem relating to the colour of points displayed in `marginal_effects`. # brms 1.9.0 ### Features * Perform model comparisons based on marginal likelihoods using the methods `bridge_sampler`, `bayes_factor`, and `post_prob` all powered by the `bridgesampling` package. * Compute a Bayesian version of R-squared with the `bayes_R2` method. * Specify non-linear models for all distributional parameters. * Combine multiple model formulas using the `+` operator and the helper functions `lf`, `nlf`, and `set_nl`. * Combine multiple priors using the `+` operator. * Split the `nlpar` argument of `set_prior` into the three arguments `resp`, `dpar`, and `nlpar` to allow for more flexible prior specifications. ### Other changes * Refactor parts of the package to prepare for the implementation of more flexible multivariate models in future updates. * Keep all constants in the log-posterior in order for `bridge_sampler` to be working correctly. * Reduce the amount of renaming done within the `stanfit` object. * Rename argument `auxpar` of `fitted.brmsfit` to `dpar`. * Use the `launch_shinystan` generic provided by the `shinystan` package. * Set `bayesplot::theme_default()` as the default `ggplot2` theme when attaching `brms`. * Include citations of the `brms` overview paper as published in the Journal of Statistical Software. ### Bug fixes * Fix problems when calling `fitted` with `hurdle_lognormal` models thanks to Meghna Krishnadas. * Fix problems when predicting `sigma` in `asym_laplace` models thanks to Anna Josefine Sorensen. # brms 1.8.0 ### Features * Fit conditional autoregressive (CAR) models via function `cor_car` thanks to the case study of Max Joseph. * Fit spatial autoregressive (SAR) models via function `cor_sar`. Currently works for families `gaussian` and `student`. * Implement skew normal models via family `skew_normal`. Thanks to Stephen Martin for suggestions on the parameterization. * Add method `reloo` to perform exact cross-validation for problematic observations and `kfold` to perform k-fold cross-validation thanks to the Stan Team. * Regularize non-zero coefficients in the `horseshoe` prior thanks to Juho Piironen and Aki Vehtari. * Add argument `new_objects` to various post-processing methods to allow for passing of data objects, which cannot be passed via `newdata`. * Improve parallel execution flexibility via the `future` package. ### Other changes * Improve efficiency and stability of ARMA models. * Throw an error when the intercept is removed in an ordinal model instead of silently adding it back again. * Deprecate argument `threshold` in `brm` and instead recommend passing `threshold` directly to the ordinal family functions. * Throw an error instead of a message when invalid priors are passed. * Change the default value of the `autocor` slot in `brmsfit` objects to an empty `cor_brms` object. * Shorten `Stan` code by combining declarations and definitions where possible. ### Bug fixes * Fix problems in `pp_check` when the variable specified in argument `x` has attributes thanks to Paul Galpern. * Fix problems when computing fitted values for truncated discrete models based on new data thanks to Nathan Doogan. * Fix unexpected errors when passing models, which did not properly initiliaze, to various post-processing methods. * Do not accidently drop the second dimension of matrices in `summary.brmsfit` for models with only a single observation. # brms 1.7.0 ### Features * Fit latent Gaussian processes of one or more covariates via function `gp` specified in the model formula (#221). * Rework methods `fixef`, `ranef`, `coef`, and `VarCorr` to be more flexible and consistent with other post-processing methods (#200). * Generalize method `hypothesis` to be applicable on all objects coercible to a `data.frame` (#198). * Visualize predictions via spaghetti plots using argument `spaghetti` in `marginal_effects` and `marginal_smooths`. * Introduce method `add_ic` to store and reuse information criteria in fitted model objects (#220). * Allow for negative weights in multi-membership grouping structures. * Introduce an `as.array` method for `brmsfit` objects. ### Other changes * Show output of \R code in HTML vignettes thanks to Ben Goodrich (#158). * Resolve citations in PDF vignettes thanks to Thomas Kluth (#223). * Improve sampling efficiency for `exgaussian` models thanks to Alex Forrence (#222). * Also transform data points when using argument `transform` in `marginal_effects` thanks to Markus Gesmann. ### Bug fixes * Fix an unexpected error in `marginal_effects` occuring for some models with autocorrelation terms thanks to Markus Gesmann. * Fix multiple problems occuring for models with the `cor_bsts` structure thanks to Andrew Ellis. # brms 1.6.1 ### Features * Implement zero-one-inflated beta models via family `zero_one_inflated_beta`. * Allow for more link functions in zero-inflated and hurdle models. ### Other changes * Ensure full compatibility with `bayesplot` version 1.2.0. * Deprecate addition argument `disp`. ### Bug fixes * Fix problems when setting priors on coefficients of auxiliary parameters when also setting priors on the corresponding coefficients of the mean parameter. Thanks to Matti Vuorre for reporting this bug. * Allow ordered factors to be used as grouping variables thanks to the GitHub user itissid. # brms 1.6.0 ### Features * Fit finite mixture models using family function `mixture`. * Introduce method `pp_mixture` to compute posterior probabilities of mixture component memberships thanks to a discussion with Stephen Martin. * Implement different ways to sample new levels of grouping factors in `predict` and related methods through argument `sample_new_levels`. Thanks to Tom Wallis and Jonah Gabry for a detailed discussion about this feature. * Add methods `loo_predict`, `loo_linpred`, and `loo_predictive_interval` for computing LOO predictions thanks to Aki Vehtari and Jonah Gabry. * Allow using `offset` in formulas of non-linear and auxiliary parameters. * Allow sparse matrix multiplication in non-linear and distributional models. * Allow using the `identity` link for all auxiliary parameters. * Introduce argument `negative_rt` in `predict` and `posterior_predict` to distinquish responses on the upper and lower boundary in `wiener` diffusion models thanks to Guido Biele. * Introduce method `control_params` to conveniently extract control parameters of the NUTS sampler. * Introduce argument `int_conditions` in `marginal_effects` for enhanced plotting of two-way interactions thanks to a discussion with Thomas Kluth. * Improve flexibility of the `conditions` argument of `marginal_effects`. * Extend method `stanplot` to correctly handle some new `mcmc_` plots of the `bayesplot` package. ### Other changes * Improve the `update` method to only recompile models when the `Stan` code changes. * Warn about divergent transitions when calling `summary` or `print` on `brmsfit` objects. * Warn about unused variables in argument `conditions` when calling `marginal_effects`. * Export and document several distribution functions that were previously kept internal. ### Bug fixes * Fix problems with the inclusion of offsets occuring for more complicated formulas thanks to Christian Stock. * Fix a bug that led to invalid Stan code when sampling from priors in intercept only models thanks to Tom Wallis. * Correctly check for category specific group-level effects in non-ordinal models thanks to Wayne Folta. * Fix problems in `pp_check` when specifying argument `newdata` together with arguments `x` or `group`. * Rename the last column in the output of `hypothesis` to `"star"` in order to avoid problems with zero length column names thanks to the GitHub user puterleat. * Add a missing new line statement at the end of the `summary` output thanks to Thomas Kluth. # brms 1.5.1 ### Features * Allow `horseshoe` and `lasso` priors to be applied on population-level effects of non-linear and auxiliary parameters. * Force recompiling `Stan` models in `update.brmsfit` via argument `recompile`. ### Other changes * Avoid indexing of matrices in non-linear models to slightly improve sampling speed. ### Bug fixes * Fix a severe problem (introduced in version 1.5.0), when predicting `Beta` models thanks to Vivian Lam. * Fix problems when summarizing some models fitted with older version of `brms` thanks to Vivian Lam. * Fix checks of argument `group` in method `pp_check` thanks to Thomas K. * Get arguments `subset` and `nsamples` working correctly in `marginal_smooths`. # brms 1.5.0 ### Features * Implement the generalized extreme value distribution via family `gen_extreme_value`. * Improve flexibility of the `horseshoe` prior thanks to Juho Piironen. * Introduce auxiliary parameter `mu` as an alternative to specifying effects within the `formula` argument in function `brmsformula`. * Return fitted values of auxiliary parameters via argument `auxpar` of method `fitted`. * Add vignette `"brms_multilevel"`, in which the advanced formula syntax of `brms` is explained in detail using several examples. ### Other changes * Refactor various parts of the package to ease implementation of mixture and multivariate models in future updates. This should not have any user visible effects. * Save the version number of `rstan` in element `version` of `brmsfit` objects. ### Bug fixes * Fix a rare error when predicting `von_mises` models thanks to John Kirwan. # brms 1.4.0 ### Features * Fit quantile regression models via family `asym_laplace` (asymmetric Laplace distribution). * Specify non-linear models in a (hopefully) more intuitive way using `brmsformula`. * Fix auxiliary parameters to certain values through `brmsformula`. * Allow `family` to be specified in `brmsformula`. * Introduce family `frechet` for modelling strictly positive responses. * Allow truncation and censoring at the same time. * Introduce function `prior_` allowing to specify priors using one-sided formulas or `quote`. * Pass priors to `Stan` directly without performing any checks by setting `check = FALSE` in `set_prior`. * Introduce method `nsamples` to extract the number of posterior samples. * Export the main formula parsing function `parse_bf`. * Add more options to customize two-dimensional surface plots created by `marginal_effects` or `marginal_smooths`. ### Other changes * Change structure of `brmsformula` objects to be more reliable and easier to extend. * Make sure that parameter `nu` never falls below `1` to reduce convergence problems when using family `student`. * Deprecate argument `nonlinear`. * Deprecate family `geometric`. * Rename `cov_fixed` to `cor_fixed`. * Make handling of addition terms more transparent by exporting and documenting related functions. * Refactor helper functions of the `fitted` method to be easier to extend in the future. * Remove many units tests of internal functions and add tests of user-facing functions instead. * Import some generics from `nlme` instead of `lme4` to remove dependency on the latter one. * Do not apply `structure` to `NULL` anymore to get rid of warnings in \R-devel. ### Bug fixes * Fix problems when fitting smoothing terms with factors as `by` variables thanks to Milani Chaloupka. * Fix a bug that could cause some monotonic effects to be ignored in the `Stan` code thanks to the GitHub user bschneider. * Make sure that the data of models with only a single observation are compatible with the generated `Stan` code. * Handle argument `algorithm` correctly in `update.brmsfit`. * Fix a bug sometimes causing an error in `marginal_effects` when using family `wiener` thanks to Andrew Ellis. * Fix problems in `fitted` when applied to `zero_inflated_beta` models thanks to Milani Chaloupka. * Fix minor problems related to the prediction of autocorrelated models. * Fix a few minor bugs related to the backwards compatibility of multivariate and related models fitted with `brms` < 1.0.0. # brms 1.3.1 ### Features * Introduce the auxiliary parameter `disc` ('discrimination') to be used in ordinal models. By default it is not estimated but fixed to one. * Create `marginal_effects` plots of two-way interactions of variables that were not explicitely modeled as interacting. ### Other changes * Move `rstan` to 'Imports' and `Rcpp` to 'Depends' in order to avoid loading `rstan` into the global environment automatically. ### Bug fixes * Fix a bug leading to unexpected errors in some S3 methods when applied to ordinal models. # brms 1.3.0 ### Features * Fit error-in-variables models using function `me` in the model formulae. * Fit multi-membership models using function `mm` in grouping terms. * Add families `exgaussian` (exponentially modified Gaussian distribution) and `wiener` (Wiener diffusion model distribution) specifically suited to handle for response times. * Add the `lasso` prior as an alternative to the `horseshoe` prior for sparse models. * Add the methods `log_posterior`, `nuts_params`, `rhat`, and `neff_ratio` for `brmsfit` objects to conveniently access quantities used to diagnose sampling behavior. * Combine chains in method `as.mcmc` using argument `combine_chains`. * Estimate the auxiliary parameter `sigma` in models with known standard errors of the response by setting argument `sigma` to `TRUE` in addition function `se`. * Allow visualizing two-dimensional smooths with the `marginal_smooths` method. ### Other changes * Require argument `data` to be explicitely specified in all user facing functions. * Refactor the `stanplot` method to use `bayesplot` on the backend. * Use the `bayesplot` theme as the default in all plotting functions. * Add the abbreviations `mo` and `cs` to specify monotonic and category specific effects respectively. * Rename generated variables in the data.frames returned by `marginal_effects` to avoid potential naming conflicts. * Deprecate argument `cluster` and use the native `cores` argument of `rstan` instead. * Remove argument `cluster_type` as it is no longer required to apply forking. * Remove the deprecated `partial` argument. # brms 1.2.0 ### Features * Add the new family `hurdle_lognormal` specifically suited for zero-inflated continuous responses. * Introduce the `pp_check` method to perform various posterior predictive checks using the `bayesplot` package. * Introduce the `marginal_smooths` method to better visualize smooth terms. * Allow varying the scale of global shrinkage parameter of the `horseshoe` prior. * Add functions `prior` and `prior_string` as aliases of `set_prior`, the former allowing to pass arguments without quotes `""` using non-standard evaluation. * Introduce four new vignettes explaining how to fit non-linear models, distributional models, phylogenetic models, and monotonic effects respectively. * Extend the `coef` method to better handle category specific group-level effects. * Introduce the `prior_summary` method for `brmsfit` objects to obtain a summary of prior distributions applied. * Sample from the prior of the original population-level intercept when `sample_prior = TRUE` even in models with an internal temporary intercept used to improve sampling efficiency. * Introduce methods `posterior_predict`, `predictive_error` and `log_lik` as (partial) aliases of `predict`, `residuals`, and `logLik` respectively. ### Other changes * Improve computation of Bayes factors in the `hypothesis` method to be less influenced by MCMC error. * Improve documentation of default priors. * Refactor internal structure of some formula and prior evaluating functions. This should not have any user visible effects. * Use the `bayesplot` package as the new backend of `plot.brmsfit`. ### Bug fixes * Better mimic `mgcv` when parsing smooth terms to make sure all arguments are correctly handled. * Avoid an error occuring during the prediction of new data when grouping factors with only a single factor level were supplied thanks to Tom Wallis. * Fix `marginal_effects` to consistently produce plots for all covariates in non-linear models thanks to David Auty. * Improve the `update` method to better recognize situations where recompliation of the `Stan` code is necessary thanks to Raphael P.H. * Allow to correctly `update` the `sample_prior` argument to value `"only"`. * Fix an unexpected error occuring in many S3 methods when the thinning rate is not a divisor of the total number of posterior samples thanks to Paul Zerr. # brms 1.1.0 ### Features * Estimate monotonic group-level effects. * Estimate category specific group-level effects. * Allow `t2` smooth terms based on multiple covariates. * Estimate interval censored data via the addition argument `cens` in the model formula. * Allow to compute `residuals` also based on predicted values instead of fitted values. ### Other changes * Use the prefix `bcs` in parameter names of category specific effects and the prefix `bm` in parameter names of monotonic effects (instead of the prefix `b`) to simplify their identifaction. * Ensure full compatibility with `ggplot2` version 2.2. ### Bug fixes * Fix a bug that could result in incorrect threshold estimates for `cumulative` and `sratio` models thanks to Peter Congdon. * Fix a bug that sometimes kept distributional `gamma` models from being compiled thanks to Tim Beechey. * Fix a bug causing an error in `predict` and related methods when two-level factors or logical variables were used as covariates in non-linear models thanks to Martin Schmettow. * Fix a bug causing an error when passing lists to additional arguments of smoothing functions thanks to Wayne Folta. * Fix a bug causing an error in the `prior_samples` method for models with multiple group-level terms that refer to the same grouping factor thanks to Marco Tullio Liuzza. * Fix a bug sometimes causing an error when calling `marginal_effects` for weighted models. # brms 1.0.1 \subsection{MINOR CHANGES * Center design matrices inside the Stan code instead of inside `make_standata`. * Get rid of several warning messages occuring on CRAN. # brms 1.0.0 This is one of the largest updates of `brms` since its initial release. In addition to many new features, the multivariate `'trait'` syntax has been removed from the package as it was confusing for users, required much special case coding, and was hard to maintain. See `help(brmsformula)` for details of the formula syntax applied in `brms`. ### Features * Allow estimating correlations between group-level effects defined across multiple formulae (e.g., in non-linear models) by specifying IDs in each grouping term via an extended `lme4` syntax. * Implement distributional regression models allowing to fully predict auxiliary parameters of the response distribution. Among many other possibilities, this can be used to model heterogeneity of variances. * Zero-inflated and hurdle models do not use multivariate syntax anymore but instead have special auxiliary parameters named `zi` and `hu` defining zero-inflation / hurdle probabilities. * Implement the `von_mises` family to model circular responses. * Introduce the `brmsfamily` function for convenient specification of `family` objects. * Allow predictions of `t2` smoothing terms for new data. * Feature vectors as arguments for the addition argument `trunc` in order to model varying truncation points. ### Other changes * Remove the `cauchy` family after several months of deprecation. * Make sure that group-level parameter names are unambiguous by adding double underscores thanks to the idea of the GitHub user schmettow. * The `predict` method now returns predicted probabilities instead of absolute frequencies of samples for ordinal and categorical models. * Compute the linear predictor in the model block of the Stan program instead of in the transformed parameters block. This avoids saving samples of unnecessary parameters to disk. Thanks goes to Rick Arrano for pointing me to this issue. * Colour points in `marginal_effects` plots if sensible. * Set the default of the `robust` argument to `TRUE` in `marginal_effects.brmsfit`. ### Bug fixes * Fix a bug that could occur when predicting factorial response variables for new data. Only affects categorical and ordinal models. * Fix a bug that could lead to duplicated variable names in the Stan code when sampling from priors in non-linear models thanks to Tom Wallis. * Fix problems when trying to pointwise evaluate non-linear formulae in `logLik.brmsfit` thanks to Tom Wallis. * Ensure full compatibility of the `ranef` and `coef` methods with non-linear models. * Fix problems that occasionally occured when handling `dplyr` datasets thanks to the GitHub user Atan1988. # brms 0.10.0 ### Features * Add support for generalized additive mixed models (GAMMs). Smoothing terms can be specified using the `s` and `t2` functions in the model formula. * Introduce `as.data.frame` and `as.matrix` methods for `brmsfit` objects. ### Other changes * The `gaussian("log")` family no longer implies a log-normal distribution, but a normal distribution with log-link to match the behavior of `glm`. The log-normal distribution can now be specified via family `lognormal`. * Update syntax of `Stan` models to match the recommended syntax of `Stan` 2.10. ### Bug fixes * The `ngrps` method should now always return the correct result for non-linear models. * Fix problems in `marginal_effects` for models using the reserved variable `intercept` thanks to Frederik Aust. * Fix a bug in the `print` method of `brmshypothesis` objects that could lead to duplicated and thus invalid row names. * Residual standard deviation parameters of multivariate models are again correctly displayed in the output of the `summary` method. * Fix problems when using variational Bayes algorithms with `brms` while having `rstan` >= 2.10.0 installed thanks to the GitHub user cwerner87. # brms 0.9.1 ### Features * Allow the '/' symbol in group-level terms in the `formula` argument to indicate nested grouping structures. * Allow to compute `WAIC` and `LOO` based on the pointwise log-likelihood using argument `pointwise` to substantially reduce memory requirements. ### Other changes * Add horizontal lines to the errorbars in `marginal_effects` plots for factors. ### Bug fixes * Fix a bug that could lead to a cryptic error message when changing some parts of the model `formula` using the `update` method. * Fix a bug that could lead to an error when calling `marginal_effects` for predictors that were generated with the `base::scale` function thanks to Tom Wallis. * Allow interactions of numeric and categorical predictors in `marginal_effects` to be passed to the `effects` argument in any order. * Fix a bug that could lead to incorrect results of `predict` and related methods when called with `newdata` in models using the `poly` function thanks to Brock Ferguson. * Make sure that user-specified factor contrasts are always applied in multivariate models. # brms 0.9.0 ### Features * Add support for `monotonic` effects allowing to use ordinal predictors without assuming their categories to be equidistant. * Apply multivariate formula syntax in categorical models to considerably increase modeling flexibility. * Add the addition argument `disp` to define multiplicative factors on dispersion parameters. For linear models, `disp` applies to the residual standard deviation `sigma` so that it can be used to weight observations. * Treat the fixed effects design matrix as sparse by using the `sparse` argument of `brm`. This can considerably reduce working memory requirements if the predictors contain many zeros. * Add the `cor_fixed` correlation structure to allow for fixed user-defined covariance matrices of the response variable. * Allow to pass self-defined `Stan` functions via argument `stan_funs` of `brm`. * Add the `expose_functions` method allowing to expose self-defined `Stan` functions in `R`. * Extend the functionality of the `update` method to allow all model parts to be updated. * Center the fixed effects design matrix also in multivariate models. This may lead to increased sampling speed in models with many predictors. ### Other changes * Refactor `Stan` code and data generating functions to be more consistent and easier to extent. * Improve checks of user-define prior specifications. * Warn about models that have not converged. * Make sure that regression curves computed by the `marginal_effects` method are always smooth. * Allow to define category specific effects in ordinal models directly within the `formula` argument. ### Bug fixes * Fix problems in the generated `Stan` code when using very long non-linear model formulas thanks to Emmanuel Charpentier. * Fix a bug that prohibited to change priors on single standard deviation parameters in non-linear models thanks to Emmanuel Charpentier. * Fix a bug that prohibited to use nested grouping factors in non-linear models thanks to Tom Wallis. * Fix a bug in the linear predictor computation within `R`, occuring for ordinal models with multiple category specific effects. This could lead to incorrect outputs of `predict`, `fitted`, and `logLik` for these models. * Make sure that the global `"contrasts"` option is not used when post-processing a model. # brms 0.8.0 ### Features * Implement generalized non-linear models, which can be specified with the help of the `nonlinear` argument in `brm`. * Compute and plot marginal effects using the `marginal_effects` method thanks to the help of Ruben Arslan. * Implement zero-inflated beta models through family `zero_inflated_beta` thanks to the idea of Ali Roshan Ghias. * Allow to restrict domain of fixed effects and autocorrelation parameters using new arguments `lb` and `ub` in function `set_prior` thanks to the idea of Joel Gombin. * Add an `as.mcmc` method for compatibility with the `coda` package. * Allow to call the `WAIC`, `LOO`, and `logLik` methods with new data. ### Other changes * Make sure that `brms` is fully compatible with `loo` version 0.1.5. * Optionally define the intercept as an ordinary fixed effect to avoid the reparametrization via centering of the fixed effects design matrix. * Do not compute the WAIC in `summary` by default anymore to reduce computation time of the method for larger models. * The `cauchy` family is now deprecated and will be removed soon as it often has convergence issues and not much practical application anyway. * Change the default settings of the number of chains and warmup samples to the defaults of `rstan` (i.e., `chains = 4` and `warmup = iter / 2`). * Do not remove bad behaving chains anymore as they may point to general convergence problems that are dangerous to ignore. * Improve flexibility of the `theme` argument in all plotting functions. * Only show the legend once per page, when computing trace and density plots with the `plot` method. * Move code of self-defined `Stan` functions to `inst/chunks` and incorporate them into the models using `rstan::stanc_builder`. Also, add unit tests for these functions. ### Bug fixes * Fix problems when predicting with `newdata` for zero-inflated and hurdle models thanks to Ruben Arslan. * Fix problems when predicting with `newdata` if it is a subset of the data stored in a `brmsfit` object thanks to Ruben Arslan. * Fix data preparation for multivariate models if some responses are `NA` thanks to Raphael Royaute. * Fix a bug in the `predict` method occurring for some multivariate models so that it now always returns the predictions of all response variables, not just the first one. * Fix a bug in the log-likelihood computation of `hurdle_poisson` and `hurdle_negbinomial` models. This may lead to minor changes in the values obtained by `WAIC` and `LOO` for these models. * Fix some backwards compatibility issues of models fitted with version <= 0.5.0 thanks to Ulf Koether. # brms 0.7.0 ### Features * Use variational inference algorithms as alternative to the NUTS sampler by specifying argument `algorithm` in the `brm` function. * Implement beta regression models through family `Beta`. * Implement zero-inflated binomial models through family `zero_inflated_binomial`. * Implement multiplicative effects for family `bernoulli` to fit (among others) 2PL IRT models. * Generalize the `formula` argument for zero-inflated and hurdle models so that predictors can be included in only one of the two model parts thanks to the idea of Wade Blanchard. * Combine fixed and random effects estimates using the new `coef` method. * Call the `residuals` method with `newdata` thanks to the idea of Friederike Holz-Ebeling. * Allow new levels of random effects grouping factors in the `predict`, `fitted`, and `residuals` methods using argument `allow_new_levels`. * Selectively exclude random effects in the `predict`, `fitted`, and `residuals` methods using argument `re_formula`. * Add a `plot` method for objects returned by method `hypothesis` to visualize prior and posterior distributions of the hypotheses being tested. ### Other changes * Improve evaluation of the response part of the `formula` argument to reliably allow terms with more than one variable (e.g., `y/x ~ 1`). * Improve sampling efficiency of models containing many fixed effects through centering the fixed effects design matrix thanks to Wayne Folta. * Improve sampling efficiency of models containing uncorrelated random effects specified by means of `(random || group)` terms in `formula` thanks to Ali Roshan Ghias. * Utilize user-defined functions in the `Stan` code of ordinal models to improve readability as well as sampling efficiency. * Make sure that model comparisons using `LOO` or `WAIC` are only performed when models are based on the same responses. * Use some generic functions of the `lme4` package to avoid unnecessary function masking. This leads to a change in the argument order of method `VarCorr`. * Change the `ggplot` theme in the `plot` method through argument `theme`. * Remove the `n.` prefix in arguments `n.iter`, `n.warmup`, `n.thin`, `n.chains`, and `n.cluster` of the `brm` function. The old argument names remain usable as deprecated aliases. * Amend names of random effects parameters to simplify matching with their respective grouping factor levels. ### Bug fixes * Fix a bug in the `hypothesis` method that could cause valid model parameters to be falsely reported as invalid. * Fix a bug in the `prior_samples` method that could cause prior samples of parameters of the same class to be artifically correlated. * Fix `Stan` code of linear models with moving-average effects and non-identity link functions so that they no longer contain code related solely to autoregressive effects. * Fix a bug in the evaluation of `formula` that could cause complicated random effects terms to be falsely treated as fixed effects. * Fix several bugs when calling the `fitted` and `predict` methods with `newdata` thanks to Ali Roshan Ghias. # brms 0.6.0 ### Features * Add support for zero-inflated and hurdle models thanks to the idea of Scott Baldwin. * Implement inverse gaussian models through family `inverse.gaussian`. * Allow to specify truncation boundaries of the response variable thanks to the idea of Maciej Beresewicz. * Add support for autoregressive (AR) effects of residuals, which can be modeled using the `cor_ar` and `cor_arma` functions. * Stationary autoregressive-moving-average (ARMA) effects of order one can now also be fitted using special covariance matrices. * Implement multivariate student-t models. * Binomial and ordinal families now support the `cauchit` link function. * Allow family functions to be used in the `family` argument. * Easy access to various `rstan` plotting functions using the `stanplot` method. * Implement horseshoe priors to model sparsity in fixed effects coefficients thanks to the idea of Josh Chang. * Automatically scale default standard deviation priors so that they remain only weakly informative independent on the response scale. * Report model weights computed by the `loo` package when comparing multiple fitted models. ### Other changes * Separate the fixed effects Intercept from other fixed effects in the `Stan` code to slightly improve sampling efficiency. * Move autoregressive (AR) effects of the response from the `cor_ar` to the `cor_arr` function as the result of implementing AR effects of residuals. * Improve checks on argument `newdata` used in the `fitted` and `predict` method. * Method `standata` is now the only way to extract data that was passed to `Stan` from a `brmsfit` object. * Slightly improve `Stan` code for models containing no random effects. * Change the default prior of the degrees of freedom of the `student` family to `gamma(2,0.1)`. * Improve readability of the output of method `VarCorr`. * Export the `make_stancode` function to give users direct access to `Stan` code generated by `brms`. * Rename the `brmdata` function to `make_standata`. The former remains usable as a deprecated alias. * Improve documenation to better explain differences in autoregressive effects across R packages. ### Bug fixes * Fix a bug that could cause an unexpected error when the `predict` method was called with `newdata`. * Avoid side effects of the `rstan` compilation routines that could occasionally cause R to crash. * Make `brms` work correctly with `loo` version 0.1.3 thanks to Mauricio Garnier Villarreal and Jonah Gabry. * Fix a bug that could cause WAIC and LOO estimates to be slightly incorrect for `gaussian` models with `log` link. # brms 0.5.0 ### Features * Compute the Watanabe-Akaike information criterion (WAIC) and leave-one-out cross-validation (LOO) using the `loo` package. * Provide an interface to `shinystan` with S3 method `launch_shiny`. * New functions `get_prior` and `set_prior` to make prior specifications easier. * Log-likelihood values and posterior predictive samples can now be calculated within R after the model has been fitted. * Make predictions based on new data using S3 method `predict`. * Allow for customized covariance structures of grouping factors with multiple random effects. * New S3 methods `fitted` and `residuals` to compute fitted values and residuals, respectively. ### Other changes * Arguments `WAIC` and `predict` are removed from the `brm` function, as they are no longer necessary. * New argument `cluster_type` in function `brm` allowing to choose the cluster type created by the parallel package. * Remove chains that fail to initialize while sampling in parallel leaving the other chains untouched. * Redesign trace and density plots to be faster and more stable. * S3 method `VarCorr` now always returns covariance matrices regardless of whether correlations were estimated. ### Bug fixes * Fix a bug in S3 method `hypothesis` related to the calculation of Bayes-factors for point hypotheses. * User-defined covariance matrices that are not strictly positive definite for numerical reasons should now be handled correctly. * Fix problems when a factor is used as fixed effect and as random effects grouping variable at the same time thanks to Ulf Koether. * Fix minor issues with internal parameter naming. * Perform additional checking on user defined priors. # brms 0.4.1 ### Features * Allow for sampling from all specified proper priors in the model. * Compute Bayes-factors for point hypotheses in S3 method `hypothesis`. ### Bug fixes * Fix a bug that could cause an error for models with multiple grouping factors thanks to Jonathan Williams. * Fix a bug that could cause an error for weighted poisson and exponential models. # brms 0.4.0 ### Features * Implement the Watanabe-Akaike Information Criterion (WAIC). * Implement the `||`-syntax for random effects allowing for the estimation of random effects standard deviations without the estimation of correlations. * Allow to combine multiple grouping factors within one random effects argument using the interaction symbol `:`. * Generalize S3 method `hypothesis` to be used with all parameter classes not just fixed effects. In addition, one-sided hypothesis testing is now possible. * Introduce new family `multigaussian` allowing for multivariate normal regression. * Introduce new family `bernoulli` for dichotomous response variables as a more efficient alternative to families `binomial` or `categorical` in this special case. ### Other changes * Slightly change the internal structure of brms to reflect that `rstan` is finally on CRAN. * Thoroughly check validity of the response variable before the data is passed to `Stan`. * Prohibit variable names containing double underscores `__` to avoid naming conflicts. * Allow function calls with several arguments (e.g. `poly(x,3)`) in the formula argument of function `brm`. * Always center random effects estimates returned by S3 method `ranef` around zero. * Prevent the use of customized covariance matrices for grouping factors with multiple random effects for now. * Remove any experimental `JAGS` code from the package. ### Bug fixes * Fix a bug in S3 method `hypothesis` leading to an error when numbers with decimal places were used in the formulation of the hypotheses. * Fix a bug in S3 method `ranef` that caused an error for grouping factors with only one random effect. * Fix a bug that could cause the fixed intercept to be wrongly estimated in the presence of multiple random intercepts thanks to Jarrod Hadfield. # brms 0.3.0 ### Features * Introduce new methods `parnames` and `posterior_samples` for class 'brmsfit' to extract parameter names and posterior samples for given parameters, respectively. * Introduce new method `hypothesis` for class `brmsfit` allowing to test non-linear hypotheses concerning fixed effects. * Introduce new argument `addition` in function brm to get a more flexible approach in specifying additional information on the response variable (e.g., standard errors for meta-analysis). Alternatively, this information can also be passed to the `formula` argument directly. * Introduce weighted and censored regressions through argument `addition` of function brm. * Introduce new argument `cov.ranef` in the `brm` function allowing for customized covariance structures of random effects thanks to the idea of Boby Mathew. * Introduce new argument `autocor` in function brm allowing for autocorrelation of the response variable. * Introduce new functions `cor.ar`, `cor.ma`, and `cor.arma`, to be used with argument `autocor` for modeling autoregressive, moving-average, and autoregressive-moving-average models. ### Other changes * Amend parametrization of random effects to increase efficiency of the sampling algorithms. * Improve vectorization of sampling statements. ### Bug fixes * Fix a bug that could cause an error when fitting poisson models while `predict = TRUE`. * Fix a bug that caused an error when sampling only one chain while `silent = TRUE`. # brms 0.2.0 ### Features * New S3 class `brmsfit` to be returned by the `brm` function. * New methods for class `brmsfit`: `summary`, `print`, `plot`, `predict`, `fixef`, `ranef`, `VarCorr`, `nobs`, `ngrps`, and `formula`. * Introduce new argument `silent` in the `brm` function, allowing to suppress most of `Stan`'s intermediate output. * Introduce new families `negbinomial` (negative binomial) and `geometric` to allow for more flexibility in modeling count data. ### Other changes * Amend warning and error messages to make them more informative. * Correct examples in the documentation. * Extend the README file. ### Bug fixes * Fix a bug that caused problems when formulas contained more complicated function calls. * Fix a bug that caused an error when posterior predictives were sampled for family `cumulative`. * Fix a bug that prohibited to use of improper flat priors for parameters that have proper priors by default. # brms 0.1.0 * Initial release version brms/MD50000644000176200001440000004753613624533242011550 0ustar liggesusers1a398aced22b5cd5ca7869ddaa9340db *DESCRIPTION 4f54796dadf13e6dee7a95d7054f1bd3 *NAMESPACE ae8810f34ac651cebe93795f99735d1f *NEWS.md 01ef2d7106976b32ff17fb075975dba2 *R/autocor.R 9a598aa7a2e3089c0b94de1934cece47 *R/bayes_R2.R d85ec209d4a3e5e69596f70170520761 *R/bridgesampling.R cf751e623bd6838580e71f6a133e4835 *R/brm.R fe0ed2b9c9e7a22a352d1260964e994e *R/brm_multiple.R 8a5c78a7711f10432097193ea2be73bd *R/brms-package.R 4d7bc5794453f47e418b24622f8e6aac *R/brmsfit-class.R 1adb2a8055b8f11a218fbc8cc783e71b *R/brmsfit-helpers.R b606e3ab806a749ab493ebd40d318b11 *R/brmsfit-methods.R 3e6d385a13a6c2a9781de7b941522da1 *R/brmsformula.R 73416fef996058d91edb30bbdc6c951b *R/brmsterms.R e51086cab2f716b449af238343363a1a *R/conditional_effects.R 1080042bd3385230311bc6d708ba3315 *R/conditional_smooths.R ac2b90f5c999afde303fd5939a8f2efc *R/data-helpers.R 4e778ea214975d41f6003b2cb79d26c6 *R/data-predictor.R 67b7172ef9a6980f7717aa558ba1c549 *R/data-response.R 148c03d10f944259f4becc40929601e4 *R/datasets.R 047f7c5047412a961f46518ac22225fa *R/diagnostics.R e2d5834e4d345106fd560f249c29f320 *R/distributions.R b03fa7b052aeda9f1bf4a4abab356f81 *R/exclude_pars.R 67b0efaf0e48fc8c40018e823fc03961 *R/exclude_terms.R aa225d3a7685e0d9c39478aed991535b *R/extract_draws.R a95e8028a7eae280e92a117faf2505ce *R/families.R a5d99e72d1f0d449fd4e4715b63cfdce *R/family-lists.R 2fbe511cfb8a7352740d1c48f02aeae3 *R/formula-ac.R 3d56f7f68ae73763c86c72fdc27e6fed *R/formula-ad.R 00781ca53d55b81cbee30e8438b1f6fe *R/formula-cs.R c9ea13d17cb2503ef7005c72c55f6696 *R/formula-gp.R 3c7effa80afe26effc97921073d2556a *R/formula-re.R 66a8b228d8cc00e63ad40156b28782cf *R/formula-sm.R e9d4e9b4e5b7640abdeef4cbb8082118 *R/formula-sp.R 1b41068060600111c50f30e67ae13127 *R/ggplot-themes.R 1028514f006d476287640feb6280a822 *R/hypothesis.R 125caf3f5f459a378cde50c9031c76b8 *R/kfold.R 3065e61d121bcc69cd38e7a1b464b2fe *R/launch_shinystan.R cd0fe476012c7f15c5cf59839582143b *R/log_lik.R 8a690e7ac34696166bca703d47a6ba77 *R/loo.R ebb1f28f7d1f58c0a65d8907ed596f4f *R/loo_predict.R 7fe83256c2ca742c1337ab92a076c92e *R/lsp.R 83df1ffc5ce58a8c7722c71e1a6d8a2a *R/make_stancode.R 109529640d837aaabc3f1eadc54861f9 *R/make_standata.R 67384b9007620537b21bd486dba0123a *R/misc.R 35b2cb34acf0c9ae235cfeeabe25c9c4 *R/model_weights.R a79185a0d73f8d38df4b3da495387656 *R/numeric-helpers.R 1d7ecb0fb3eb0449fd3cee3a8935f746 *R/plot.R 7c3b7096aa50da99c227226e81c58c32 *R/posterior_predict.R a483a1322a004aafe3decf7eb23f9f8c *R/posterior_samples.R 62daebf0700cc56ba06095c36baaefd3 *R/pp_check.R ba4888a5f808e3bb07736ae063da6541 *R/pp_expect.R 4e6bba287b4808c0f5e21fb5f472ae84 *R/pp_mixture.R 81e8f60b3fc2f6fbf6342274db486204 *R/predictive_error.R eaeb44efa214d8eba6d6b28db8543f2e *R/predictor.R 8f189db467f559883f5286d4c55e8bf4 *R/priors.R ce1da0589a0f7d2c0749f200d4fac269 *R/rename_pars.R bf7227b73f1e0084441c58abd41906d8 *R/restructure.R 73eb96387fe446b1ba831d001ae31831 *R/stan-helpers.R 35ab962445995bf9b463c00d3a962dee *R/stan-likelihood.R 2d32592280fd5f032ac0233070647205 *R/stan-predictor.R 5ea89b812585124dcb3af7bd29d94722 *R/stan-prior.R db0690695c3675aaddcae4c2c768ecac *R/stan-response.R cf208fdd27174136c7c629c424e6b39d *R/stanvars.R d5ca40adfb8ce40f606931df8d767df5 *R/summary.R 69e5e517de031a3c92d6adedc44811f4 *R/sysdata.rda b1e127d6143e9d922abbe2c2f4c501f2 *R/update.R 4000738510e38d91963cdda679d9f2ef *R/zzz.R c2102700bc3393b91084d3c59f93f81f *README.md 116ff7400be6169528afbdd013ee2f28 *build/vignette.rds 29545093bb6edb0416e8ca2725949829 *data/epilepsy.rda d3e1729f040540ec7d640ce9d9e1c7c4 *data/inhaler.rda b491f9e27065b6a30dfaa06835d4058f *data/kidney.rda 9f3bd0612df287b987b0d804ca630680 *inst/CITATION bcdbed13a50e7a45d1c737332c1aac8e *inst/chunks/fun_as_matrix.stan 1bd110b34958eb85625a247f2b0d9b60 *inst/chunks/fun_asym_laplace.stan a6d4286c602fa7c20fa9839153baa5d4 *inst/chunks/fun_cauchit.stan f8aa02cb1584ee52cdd2ca3761dec404 *inst/chunks/fun_cholesky_cor_ar1.stan 4e29bfce08917c0581ecb7e6218d0a34 *inst/chunks/fun_cholesky_cor_arma1.stan 4a1dfc8a30ac7db990381493f7d07e48 *inst/chunks/fun_cholesky_cor_cosy.stan 9235311a924a41a116c2b694f780dd1c *inst/chunks/fun_cholesky_cor_ma1.stan 2ab7f74b499445d9d7e4a206b6940e9c *inst/chunks/fun_cloglog.stan a9c8bee28df21b46562b14e780a55dcf *inst/chunks/fun_com_poisson.stan 27d2f4fa90d208b3fc8e994239e03791 *inst/chunks/fun_cox.stan 4a34f3da7fc169ae7734f345be75b3b5 *inst/chunks/fun_dirichlet_logit.stan 18c49c571f330a7246fd0a2f1a621cab *inst/chunks/fun_discrete_weibull.stan e53b8edf5b6f256ecf5933270e99f78e *inst/chunks/fun_gaussian_process.stan 9f49e1d9142b1de3a3bacefd76e79929 *inst/chunks/fun_gaussian_process_approx.stan 5caee0b5d6ceea372fd0b1c88755ef15 *inst/chunks/fun_gen_extreme_value.stan b17b82133dd799ff2477f02feaaa2dca *inst/chunks/fun_horseshoe.stan e8ca4770184d9834b264efe4f6d05558 *inst/chunks/fun_hurdle_gamma.stan a15d564f825cf56a1cd705479df440c2 *inst/chunks/fun_hurdle_lognormal.stan 08f52ff44220f898c68a3a0dd9eedd6d *inst/chunks/fun_hurdle_negbinomial.stan 3323605321012af39364d3ebc2e627b8 *inst/chunks/fun_hurdle_poisson.stan c42b811ca231236919864fbf680a6dee *inst/chunks/fun_inv_gaussian.stan 7b8c9743e9b203bd2f15105ced33218b *inst/chunks/fun_kronecker.stan fb9e84df9cbe026e3e3b3e6d106d09dd *inst/chunks/fun_logm1.stan a2f8c721f77b3bb06e00d692830428c6 *inst/chunks/fun_monotonic.stan f35213fba29c66aa538e78fb2daf4202 *inst/chunks/fun_multinomial_logit.stan c091fad62d25e9bea28a7c54b73ca4fb *inst/chunks/fun_normal_errorsar.stan d1e3e24b15bc39fc0807b76e7ef72cfd *inst/chunks/fun_normal_fcor.stan 15f5f783d5282e1e7762bc98472e6459 *inst/chunks/fun_normal_lagsar.stan e05ddc9672ddd493c4fbc0322e55c5b5 *inst/chunks/fun_normal_time.stan 217bf2e4ce2a6039177d7dad9e1f7070 *inst/chunks/fun_scale_r_cor_by.stan b65877f1450a1d4266c303568189c0d6 *inst/chunks/fun_scale_time_err.stan 8092f198b21aaa36f63b6f603f411fe3 *inst/chunks/fun_scale_xi.stan a68c834d3a8bf2bb1b505e9539f1e4ad *inst/chunks/fun_softplus.stan cfbe7692c75ceb471465aec8b1697ed8 *inst/chunks/fun_sparse_car_lpdf.stan fd91d2c835564aa63101830b4a364266 *inst/chunks/fun_sparse_icar_lpdf.stan 6ac220e229121eba75175685b2978317 *inst/chunks/fun_student_t_errorsar.stan 26449557319287750bb2bdceb6a75d65 *inst/chunks/fun_student_t_fcor.stan 767fe1f822538acdff2c1c0e896c4cd7 *inst/chunks/fun_student_t_lagsar.stan faf59ce025a26cc04204de4058070fde *inst/chunks/fun_student_t_time.stan 15e7bba16664915bcb682a58b012d5d4 *inst/chunks/fun_tan_half.stan 2396fcafffb41122f71465f7306a8cd0 *inst/chunks/fun_von_mises.stan 28240b527b6638f5f7f1c52a03c45dcd *inst/chunks/fun_wiener_diffusion.stan bcacbeab70fc5141db21c788cc424629 *inst/chunks/fun_zero_inflated_asym_laplace.stan 9ea0b8a6d1a6bf5cb00f8835fa4b14ad *inst/chunks/fun_zero_inflated_beta.stan fc249bf75c51cd2f9525ef1943189104 *inst/chunks/fun_zero_inflated_binomial.stan 221508c5adb43ccb0bdb95db0e68c5ea *inst/chunks/fun_zero_inflated_negbinomial.stan 515585bed72e8196eff714ed5270b9b8 *inst/chunks/fun_zero_inflated_poisson.stan 0642c30fcb52c745abeaba0c8767ac74 *inst/chunks/fun_zero_one_inflated_beta.stan e4ef0aa0855537d6d0fc5ac84d59fb62 *inst/doc/brms_customfamilies.R 69d65449bf98d8ba29ae2503635575a1 *inst/doc/brms_customfamilies.Rmd c20466013ecfa9542877769fc49d5b15 *inst/doc/brms_customfamilies.html eed4bcadd0394d075bacb37295c4ebe0 *inst/doc/brms_distreg.R ca0f9600de1e34fea34a37a0d70c60d9 *inst/doc/brms_distreg.Rmd ff2551d71f3d53a7c57a9739b63e6f3f *inst/doc/brms_distreg.html 8b67b962ed93dd592c82bcd84891b04e *inst/doc/brms_families.Rmd 0435bdf9d714ab898f55f78701f6cf25 *inst/doc/brms_families.html c1d37835774a2cd90f6f0bed0d4e74f5 *inst/doc/brms_missings.R 5322acd140b4ccd830a9700e2c5d6319 *inst/doc/brms_missings.Rmd df8c6b426582cd2a47eaf508e42c0d2d *inst/doc/brms_missings.html c08b81d657802e94ccb16d6bf7f715df *inst/doc/brms_monotonic.R ca1dd6fe3b2cfae4237afbf625a151ee *inst/doc/brms_monotonic.Rmd c1f8ca25632b3f825c05bb15ddd3a3ff *inst/doc/brms_monotonic.html ac56c7f51b94aacf85c02089911eab5c *inst/doc/brms_multilevel.ltx 072331464e0285918de0e82bb4cc4bcb *inst/doc/brms_multilevel.pdf 35abd548882af0b4fdd703dc4a8b4f71 *inst/doc/brms_multivariate.R 23b860ab1c7544713364dbc696022474 *inst/doc/brms_multivariate.Rmd 0f94b26031d0a4e5c99aa9b637b1201c *inst/doc/brms_multivariate.html cea8ec1609bfacd49524280f7e699a75 *inst/doc/brms_nonlinear.R ea416ecdf98dd295acd8de0a1ee8a8c4 *inst/doc/brms_nonlinear.Rmd 3262d921e8ed1c102c7ab3647702bc74 *inst/doc/brms_nonlinear.html 241872982b7005a3c0b3b60aae7b15a9 *inst/doc/brms_overview.ltx f80e8a694e3450a3057f2f3c2ea2eda9 *inst/doc/brms_overview.pdf 940a4a573f29b89bd22341a82ba1e116 *inst/doc/brms_phylogenetics.R 0b2f1401cd20b1d97e953c7121c34e55 *inst/doc/brms_phylogenetics.Rmd 7ec0121f4638dadef1edf17675978c10 *inst/doc/brms_phylogenetics.html cdde596f29db2de1ac65f097e22cd97c *man/AsymLaplace.Rd 49cd21b3a9e425196fd6a0a0d30184f4 *man/Dirichlet.Rd 3beff2937168f75c5139074319cfc57e *man/ExGaussian.Rd a5832d6fc6cb728209eac1d8553052e7 *man/Frechet.Rd 0b9d36219226a4900070468e576b468c *man/GenExtremeValue.Rd 31cf55f5e8cf00fde9f4f269206d9058 *man/Hurdle.Rd f2bb16ccf4179026cbcb23e0d2f27bbf *man/InvGaussian.Rd b10b10665525ec9bfccbf16815841d41 *man/MultiNormal.Rd df59c1228bbd91592d92234f3c2e6ea8 *man/MultiStudentT.Rd 6932c669a9c290adbd54ebc0c2316d42 *man/Shifted_Lognormal.Rd 82ac230bf2f07b6b4e7c45db55f4ba24 *man/SkewNormal.Rd fc7278ef3040d050a58687c5cb7312fe *man/StudentT.Rd 2aa450f0579029583ad6f8cd37128d32 *man/VarCorr.brmsfit.Rd 2d9d315d5798efd8818df5c8c64b754c *man/VonMises.Rd a93f1f696c1286a3a50a6339b4780357 *man/Wiener.Rd 2cd7d8030ea9d11257a1bf66b49a0c61 *man/ZeroInflated.Rd 838d18138c101d8fa369a7d2689a58b7 *man/add_criterion.Rd 9e11779785c40c25b312edeb52133c26 *man/add_ic.Rd 429824e07543ed171d0e452dd832960c *man/addition-terms.Rd bce1f3c507c951f22a46950139786e9f *man/ar.Rd e011f283bf502d2935d7a19ded4e5254 *man/arma.Rd bd5c7ae7d007bfaeb93e0ca4acffc33b *man/as.mcmc.brmsfit.Rd c7b7a064c8db97e1b582b6dd0a45a5a6 *man/autocor-terms.Rd 39e4ccb11ea5c221b6ff0cfce6ec5e1b *man/autocor.brmsfit.Rd da486935e1e372d084e029f79cb8d770 *man/bayes_R2.brmsfit.Rd bbcf003cc6a565f68b690d59766a3326 *man/bayes_factor.brmsfit.Rd c07e8f5e0dffb575ed894c2510cf1c5a *man/bridge_sampler.brmsfit.Rd bfd5e0ec7e40d52aef337efd7fd1a8e9 *man/brm.Rd bd4dbef27b7ad3a16d2859478a41ccdd *man/brm_multiple.Rd 2875e985dd2cc978a6982729d307cb52 *man/brms-package.Rd b29b465c1516a09f90e26de652ccee72 *man/brmsfamily.Rd 51bf21e874a724dd73b5f68c9b55448f *man/brmsfit-class.Rd 59f6ae636e43c52ef574f5b0856f07ac *man/brmsformula-helpers.Rd a7eaf375827d1a3164a45d5bb74cc17a *man/brmsformula.Rd e708dfeb8e8dc9370a3ebcad6faf27cc *man/brmshypothesis.Rd 3d86778cbc25329a5ab9f736f6ddf5d4 *man/car.Rd 7b1a956ecbba0ebf6ead9ffe88cc623c *man/coef.brmsfit.Rd 674d7e995abf3e998441501cb183ef4a *man/combine_models.Rd ad619c490b3cb5e4934487daaa34f96d *man/compare_ic.Rd 2e07358c8198fe2ea4905450c8d18216 *man/conditional_effects.brmsfit.Rd 85b15d59b0f479e4f1293b37a303ad37 *man/conditional_smooths.brmsfit.Rd 51b84593ef7fe65c14b187ba14a8b82f *man/control_params.Rd cc599a5bb49d5e7b40c0f9c31c72a48a *man/cor_ar.Rd f6a0e6dbf27b062e382a514d75e985ce *man/cor_arma.Rd 7f439f409b1aa8e77f01687959e46393 *man/cor_arr.Rd 2f850393b76b1fc57b29061bd06e6c1b *man/cor_brms.Rd 46dc58cfcc1ebebd9bc1b972cfeb4352 *man/cor_bsts.Rd baa5073b269f51d7631f4770c1a4752e *man/cor_car.Rd 29113f6a256c09c87abe6ee8a4f6e27e *man/cor_cosy.Rd 95a8c1ae878306b6325bd7348952bf70 *man/cor_fixed.Rd bfe0f0c3cfe150309047b9071a9547ab *man/cor_ma.Rd bf9b10f7a568b1fc2b2bd5c3aaa7230d *man/cor_sar.Rd 64c3133481a9c2fadf1ebac8145c2c98 *man/cosy.Rd b5d550cdefdbf28a5a35e3d2b0d7d785 *man/cs.Rd e0ba12883b7397eaea4b23516c4dab28 *man/custom_family.Rd 81be337f5ddeccc02a7fb4aefd143a2d *man/data_predictor.Rd b28cff42939aceb03fca57c86425e33d *man/data_response.Rd 13e4f0f68f27f2bc543353af0f4d90b5 *man/density_ratio.Rd 5f4c82f71f553a32726ac01d428e4734 *man/diagnostic-quantities.Rd 6b4d5b4ecc180e1c127ba3484beadd65 *man/do_call.Rd d001bb8f4385597b2cd9e70e57ba61d8 *man/epilepsy.Rd 33e22f2dd5e722bcdda22199ff3646c7 *man/expose_functions.brmsfit.Rd 17ed2b215666d03cda2e8c2c715a656c *man/expp1.Rd 016b0f03074edb7a4f1c83950ff25159 *man/extract_draws.Rd ebbceb3446d178098f9cb6d582ae65b5 *man/family.brmsfit.Rd b0f9c56761aa5373f5146bf75ca14d8c *man/fcor.Rd 41837c68b66a3c780242cda1aef2d5e2 *man/figures/README-conditional_effects-1.png 658ae82507c98d7b7cc922928b4a760a *man/figures/README-plot-1.png 5a143f562f85cfa3980dbfc8a1187fa3 *man/figures/brms.png 5fad10a5cc62c59ea429a5ce90191e2e *man/figures/stanlogo.png 8d9434d4eabc51fed11bb8d5af443012 *man/fitted.brmsfit.Rd 5321f784d7b21cca9e2062a930978d49 *man/fixef.brmsfit.Rd b6b96b0711b2614d959c712aa1d8066d *man/get_prior.Rd 51cd878cda84026fe084f5d7b6192be9 *man/get_y.Rd c8e542516a8a03acf04a6fd2a33ce1e6 *man/gp.Rd ce49aae14a7e8d2b00ca164f510e0189 *man/gr.Rd 186923ab8f8ddb39f91d6490ebbf9aaf *man/horseshoe.Rd 6e2d488e7ea52e69cb6140c31bb080b1 *man/hypothesis.brmsfit.Rd 61a6617ab99f95036e423245849a53a3 *man/inhaler.Rd 91bc090feda4bd1d3905237cb210afc0 *man/inv_logit_scaled.Rd 2093a90d612b80195be6167fc790cae2 *man/is.brmsfit.Rd 984fa6fac3feb97ff31b6afa96c6bd38 *man/is.brmsfit_multiple.Rd 9458e5be66ea9752b582f96f8d162747 *man/is.brmsformula.Rd 61ae48d9ca300fb2de7a750346bed9e2 *man/is.brmsprior.Rd e56c691a0c3d841532caa69616de4b29 *man/is.brmsterms.Rd 719230daa3fa48becfd07b2abd132270 *man/is.cor_brms.Rd 268b944218db1d5e121987385a39387c *man/is.mvbrmsformula.Rd 78f11d2eb6a3b6c9d570f2f7545a1401 *man/is.mvbrmsterms.Rd 8f076bf2dab4515f1aa09963ac7d6771 *man/kfold.brmsfit.Rd 755631048673367af69c347bd61dc284 *man/kfold_predict.Rd 6f92f5003a087675b19b3f1d4fc77719 *man/kidney.Rd 82c676486e6ad3c7863ed663c86d9696 *man/lasso.Rd 75c7a5070adaf64e709e6f127c6873b1 *man/launch_shinystan.brmsfit.Rd 7e2da0b2850d16808dc4b0180d1b11b1 *man/log_lik.brmsfit.Rd d2bf96b858e2461131e47da61abcef82 *man/logit_scaled.Rd b00cbd40e281c297039a1a7d0030edba *man/logm1.Rd d062a6b0750bd5acb75f44155556f31f *man/loo.brmsfit.Rd 7b52be6c3d6af037c57f3efb8c22315d *man/loo_R2.brmsfit.Rd fe6882d8d325829a7baf3c9c816bb93d *man/loo_compare.brmsfit.Rd 6dc87ac6247aa313e0ba6ded08e1699f *man/loo_model_weights.brmsfit.Rd 5c0191fbbf12aa97ec5c6984907a8765 *man/loo_predict.brmsfit.Rd 2425f53a48a569e3cb121c625e40904b *man/loo_subsample.brmsfit.Rd 74a047ee5ff1d2396c5bedf69cf60f84 *man/ma.Rd f5bb5943c60c76e20c9b73770023fd7b *man/make_conditions.Rd d5ffc221a84c554936c8db9162080c9c *man/make_stancode.Rd fca7994ddef8c4769e2d0a738b65e697 *man/make_standata.Rd d5c7ec929d293ccdc72b8e0c7d0a313f *man/mcmc_plot.brmsfit.Rd 2886e3b2d8a6b325c704bc1b8b6e3d93 *man/me.Rd d22a6643b14eabebaaf5919e9f347212 *man/mi.Rd 886ffd80fe4941576f384f684cfe963c *man/mixture.Rd 32f839a90c9dd02de95daa1132816932 *man/mm.Rd 0a37977d995692006b90d05255790395 *man/mmc.Rd 36a915f63fb649e8532a26eaa6947771 *man/mo.Rd eb3cb1698b823f1b6cf47aae2d6c869a *man/model_weights.brmsfit.Rd 41d271b33d265ac55dce75c385d429ca *man/mvbind.Rd bd746d483683608f2bebcd60aabfc81d *man/mvbrmsformula.Rd 9944a50c85f28f218c3383578155e541 *man/ngrps.brmsfit.Rd ad04aebb4622ac0614e46a74547d02ab *man/nsamples.brmsfit.Rd 9eb05f631a72104529d0920c3f875a9f *man/pairs.brmsfit.Rd a537b38029c5b7c98cec3f5d38bca563 *man/parnames.Rd b849321e438c2edd4cadfb70e3dff54f *man/parse_bf.Rd 80d566c261c9d470c9eda116fb4a487a *man/plot.brmsfit.Rd 2b471e16ab511e679ed7688e9a414327 *man/post_prob.brmsfit.Rd d22a59f15db6437d4db3f15cb17ffb3c *man/posterior_average.brmsfit.Rd 0098f6639f98381a4fea877349a6856e *man/posterior_interval.brmsfit.Rd badec973eef6cea732c34fc4e13741f5 *man/posterior_linpred.brmsfit.Rd bb67407559a9190cc1e2faa8aa976607 *man/posterior_predict.brmsfit.Rd 5d9e1a2dba5e7347cba2a50083cdbe0e *man/posterior_samples.brmsfit.Rd df08bc8bdf8272c881b99e2d3ebd6c19 *man/posterior_summary.Rd 02173fc8e070e9aefd1cbe922f4eae6d *man/posterior_table.Rd a7eec1a82d881f3b2a3dabbe7d916b3d *man/pp_average.brmsfit.Rd 6ff0e1ef0e649654e1da0c9bebe32c82 *man/pp_check.brmsfit.Rd 1ba1015f345287d62204373b3037aacb *man/pp_expect.brmsfit.Rd 0ef5835f0f02857a4d154d83bbf56371 *man/pp_mixture.brmsfit.Rd dca63acd6a3ad2c0eca66bf2451e27a0 *man/predict.brmsfit.Rd dd5ea1b43f7b7d985cbf533e3ffb189b *man/predictive_error.brmsfit.Rd 9fb4d1382e914f9ff5a306f783091c4b *man/predictive_interval.brmsfit.Rd bd1a1ca17cea17a8bb1cffcb9dbc0332 *man/print.brmsfit.Rd b5e84f4c02d2468e6bace7303cde6874 *man/print.brmsprior.Rd 0c16d6adc2320f0b5816b4c4b8782653 *man/prior_samples.brmsfit.Rd b30d6fb3c1779b0cfef1aa90c4f75d8b *man/prior_summary.brmsfit.Rd d2a0bbbc976f58e0a071488e866fa39d *man/ranef.brmsfit.Rd 157920544e830dc32b5588dc256fd933 *man/reloo.brmsfit.Rd da0bfadddbd78a848f2342692090a7b4 *man/residuals.brmsfit.Rd a6053da975eb6e9de005075391de778b *man/restructure.Rd b353c4a2e483ebbf78124a6534f10f73 *man/rows2labels.Rd def45bd140efdcf8d674bcd6adbde3eb *man/s.Rd 271e1bf5d10ff3bea2512e01635c0de8 *man/sar.Rd f3d51679472530355a6fca0aeb638ef4 *man/set_prior.Rd 2ec2804e54a9ea6f970bba4bf026c8f9 *man/stancode.brmsfit.Rd 0d027e9aba521b5152e17373c02518fc *man/standata.brmsfit.Rd cb1bf407732d48138ca57687fa03441f *man/stanvar.Rd f58044e84ba8bf1b8e8101033ac92233 *man/summary.brmsfit.Rd 0c828311d9e81539787e85a77df9baa5 *man/theme_black.Rd a4cf057023b316def581bc33fab9900f *man/theme_default.Rd b496d758c4442b4bcfa186359280e3be *man/update.brmsfit.Rd 56da09d148c83fa3d6162e071c74d932 *man/update.brmsfit_multiple.Rd d4329014c6586f1d939c80df9105286d *man/update_adterms.Rd 5d7deb44ebcfaf296e987591a59992ed *man/validate_newdata.Rd 099a3aeb9857dc4767d92ca18caf8b0a *man/vcov.brmsfit.Rd 3588335f83c8474907e91de98008a978 *man/waic.brmsfit.Rd 2b545ab36b38afc18e158956ff3071a7 *tests/testthat.R 7a3123ba7dd23b0f21b93e4193099b81 *tests/testthat/tests.brm.R ff5f116c6e5be6bcfbc01155d4fbdd22 *tests/testthat/tests.brmsfit-helpers.R 289d248abb49d6eda75037e9008ea386 *tests/testthat/tests.brmsfit-methods.R d75bd3f07c057f319cdd3c3c51466c0a *tests/testthat/tests.brmsformula.R 8188e9ac3f863c85a28cb2f8034ed13c *tests/testthat/tests.brmsterms.R 92485d4241d453f73b33c356a19f11a7 *tests/testthat/tests.data-helpers.R 48e0290ce8e10f0bfd8537387de09167 *tests/testthat/tests.distributions.R ce57402df301a63c89a9ddbb25247816 *tests/testthat/tests.exclude_pars.R 01fe2d8993373ebdf9cbc0d155b67ea4 *tests/testthat/tests.families.R 4589dbbeadc39ccba77d2bc7ad279d92 *tests/testthat/tests.log_lik.R ed1303ac7b8b35bc03b39b9540bc8690 *tests/testthat/tests.make_stancode.R 25582471c4e2820018ed20838186e2ae *tests/testthat/tests.make_standata.R 979dd368f1d0452fc3d68454c0689c87 *tests/testthat/tests.misc.R 2bf74f455f65c844aec7771ffe596ea7 *tests/testthat/tests.posterior_predict.R 472bb7887cb9686ca6468b76b1d6be4d *tests/testthat/tests.pp_expect.R 0e86a74fc8e04add283588b23834fa56 *tests/testthat/tests.priors.R 386810b18df8b299b848e908453e5cf8 *tests/testthat/tests.rename_pars.R 4e9e157171d3e583aca396205d6f9f0f *tests/testthat/tests.restructure.R 07dabc6f0b0892a2316b3e926235ae41 *tests/testthat/tests.stan_functions.R 69d65449bf98d8ba29ae2503635575a1 *vignettes/brms_customfamilies.Rmd ca0f9600de1e34fea34a37a0d70c60d9 *vignettes/brms_distreg.Rmd 8b67b962ed93dd592c82bcd84891b04e *vignettes/brms_families.Rmd 5322acd140b4ccd830a9700e2c5d6319 *vignettes/brms_missings.Rmd ca1dd6fe3b2cfae4237afbf625a151ee *vignettes/brms_monotonic.Rmd ac56c7f51b94aacf85c02089911eab5c *vignettes/brms_multilevel.ltx 23b860ab1c7544713364dbc696022474 *vignettes/brms_multivariate.Rmd ea416ecdf98dd295acd8de0a1ee8a8c4 *vignettes/brms_nonlinear.Rmd 241872982b7005a3c0b3b60aae7b15a9 *vignettes/brms_overview.ltx 0b2f1401cd20b1d97e953c7121c34e55 *vignettes/brms_phylogenetics.Rmd d03511b5b5f0034e974205b90a81e499 *vignettes/citations_multilevel.bib 07ac5ec3d888046289de19638ab18a45 *vignettes/citations_overview.bib 1e02697a37e36908b7d8954bfaea2e92 *vignettes/flowchart.pdf 598082534ce6cb51d34c01a69dda5088 *vignettes/inhaler_plot.pdf d7d237f55a6850eba15ad5ceeaf821f6 *vignettes/kidney_conditional_effects.pdf 7632f1034a93aa91cd5d27f3430419f7 *vignettes/kidney_plot.pdf 130d165d8715c0e39e51dac5a843d50a *vignettes/me_loss1.pdf 2c51e8bc0ba3986d8e445b445943473c *vignettes/me_loss1_year.pdf 70c11e0b4eb944016ef306a402fce2c4 *vignettes/me_rent1.pdf beff1ce999b4bd7244ecbe2b6e887c9a *vignettes/me_rent2.pdf 8d6a4a639492d0ac1e71bbf25b93fa03 *vignettes/me_rent3.pdf 5b56487f6dc0b92bfe7894ba09264971 *vignettes/me_zinb1.pdf 1fe96ffc00b75a46155b60f534625f43 *vignettes/ppc_mm1.pdf brms/inst/0000755000176200001440000000000013623760773012210 5ustar liggesusersbrms/inst/doc/0000755000176200001440000000000013623760774012756 5ustar liggesusersbrms/inst/doc/brms_nonlinear.R0000644000176200001440000001061713623757152016112 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE----------------------------------------------------- stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ## --------------------------------------------------------------------------------------- b <- c(2, 0.75) x <- rnorm(100) y <- rnorm(100, mean = b[1] * exp(b[2] * x)) dat1 <- data.frame(x, y) ## ---- results='hide'-------------------------------------------------------------------- prior1 <- prior(normal(1, 2), nlpar = "b1") + prior(normal(0, 2), nlpar = "b2") fit1 <- brm(bf(y ~ b1 * exp(b2 * x), b1 + b2 ~ 1, nl = TRUE), data = dat1, prior = prior1) ## --------------------------------------------------------------------------------------- summary(fit1) plot(fit1) plot(conditional_effects(fit1), points = TRUE) ## ---- results='hide'-------------------------------------------------------------------- fit2 <- brm(y ~ x, data = dat1) ## --------------------------------------------------------------------------------------- summary(fit2) ## --------------------------------------------------------------------------------------- pp_check(fit1) pp_check(fit2) ## --------------------------------------------------------------------------------------- loo(fit1, fit2) ## --------------------------------------------------------------------------------------- loss <- read.csv("https://paul-buerkner.github.io/data/loss.csv") head(loss) ## ---- results='hide'-------------------------------------------------------------------- fit_loss <- brm( bf(cum ~ ult * (1 - exp(-(dev/theta)^omega)), ult ~ 1 + (1|AY), omega ~ 1, theta ~ 1, nl = TRUE), data = loss, family = gaussian(), prior = c( prior(normal(5000, 1000), nlpar = "ult"), prior(normal(1, 2), nlpar = "omega"), prior(normal(45, 10), nlpar = "theta") ), control = list(adapt_delta = 0.9) ) ## --------------------------------------------------------------------------------------- summary(fit_loss) plot(fit_loss, N = 3, ask = FALSE) conditional_effects(fit_loss) ## --------------------------------------------------------------------------------------- conditions <- data.frame(AY = unique(loss$AY)) rownames(conditions) <- unique(loss$AY) me_loss <- conditional_effects( fit_loss, conditions = conditions, re_formula = NULL, method = "predict" ) plot(me_loss, ncol = 5, points = TRUE) ## --------------------------------------------------------------------------------------- inv_logit <- function(x) 1 / (1 + exp(-x)) ability <- rnorm(300) p <- 0.33 + 0.67 * inv_logit(ability) answer <- ifelse(runif(300, 0, 1) < p, 1, 0) dat_ir <- data.frame(ability, answer) ## ---- results='hide'-------------------------------------------------------------------- fit_ir1 <- brm(answer ~ ability, data = dat_ir, family = bernoulli()) ## --------------------------------------------------------------------------------------- summary(fit_ir1) plot(conditional_effects(fit_ir1), points = TRUE) ## ---- results='hide'-------------------------------------------------------------------- fit_ir2 <- brm( bf(answer ~ 0.33 + 0.67 * inv_logit(eta), eta ~ ability, nl = TRUE), data = dat_ir, family = bernoulli("identity"), prior = prior(normal(0, 5), nlpar = "eta") ) ## --------------------------------------------------------------------------------------- summary(fit_ir2) plot(conditional_effects(fit_ir2), points = TRUE) ## --------------------------------------------------------------------------------------- loo(fit_ir1, fit_ir2) ## ---- results='hide'-------------------------------------------------------------------- fit_ir3 <- brm( bf(answer ~ guess + (1 - guess) * inv_logit(eta), eta ~ 0 + ability, guess ~ 1, nl = TRUE), data = dat_ir, family = bernoulli("identity"), prior = c( prior(normal(0, 5), nlpar = "eta"), prior(beta(1, 1), nlpar = "guess", lb = 0, ub = 1) ) ) ## --------------------------------------------------------------------------------------- summary(fit_ir3) plot(fit_ir3) plot(conditional_effects(fit_ir3), points = TRUE) brms/inst/doc/brms_customfamilies.R0000644000176200001440000000653513623753356017157 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE----------------------------------------------------- stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ## ----cbpp------------------------------------------------------------------------------- data("cbpp", package = "lme4") head(cbpp) ## ----fit1, results='hide'--------------------------------------------------------------- fit1 <- brm(incidence | trials(size) ~ period + (1|herd), data = cbpp, family = binomial()) ## ----fit1_summary----------------------------------------------------------------------- summary(fit1) ## ----beta_binomial2--------------------------------------------------------------------- beta_binomial2 <- custom_family( "beta_binomial2", dpars = c("mu", "phi"), links = c("logit", "log"), lb = c(NA, 0), type = "int", vars = "vint1[n]" ) ## ----stan_funs-------------------------------------------------------------------------- stan_funs <- " real beta_binomial2_lpmf(int y, real mu, real phi, int T) { return beta_binomial_lpmf(y | T, mu * phi, (1 - mu) * phi); } int beta_binomial2_rng(real mu, real phi, int T) { return beta_binomial_rng(T, mu * phi, (1 - mu) * phi); } " ## ----stanvars--------------------------------------------------------------------------- stanvars <- stanvar(scode = stan_funs, block = "functions") ## ----fit2, results='hide'--------------------------------------------------------------- fit2 <- brm( incidence | vint(size) ~ period + (1|herd), data = cbpp, family = beta_binomial2, stanvars = stanvars ) ## ----summary_fit2----------------------------------------------------------------------- summary(fit2) ## --------------------------------------------------------------------------------------- expose_functions(fit2, vectorize = TRUE) ## ----log_lik---------------------------------------------------------------------------- log_lik_beta_binomial2 <- function(i, draws) { mu <- draws$dpars$mu[, i] phi <- draws$dpars$phi trials <- draws$data$vint1[i] y <- draws$data$Y[i] beta_binomial2_lpmf(y, mu, phi, trials) } ## ----loo-------------------------------------------------------------------------------- loo(fit1, fit2) ## ----posterior_predict------------------------------------------------------------------ posterior_predict_beta_binomial2 <- function(i, draws, ...) { mu <- draws$dpars$mu[, i] phi <- draws$dpars$phi trials <- draws$data$vint1[i] beta_binomial2_rng(mu, phi, trials) } ## ----pp_check--------------------------------------------------------------------------- pp_check(fit2) ## ----pp_expect-------------------------------------------------------------------------- pp_expect_beta_binomial2 <- function(draws) { mu <- draws$dpars$mu trials <- draws$data$vint1 trials <- matrix(trials, nrow = nrow(mu), ncol = ncol(mu), byrow = TRUE) mu * trials } ## ----conditional_effects---------------------------------------------------------------- conditional_effects(fit2, conditions = data.frame(size = 1)) brms/inst/doc/brms_monotonic.Rmd0000644000176200001440000002035713606326627016455 0ustar liggesusers--- title: "Estimating Monotonic Effects with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Monotonic Effects with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction This vignette is about monotonic effects, a special way of handling discrete predictors that are on an ordinal or higher scale (Bürkner & Charpentier, in review). A predictor, which we want to model as monotonic (i.e., having a monotonically increasing or decreasing relationship with the response), must either be integer valued or an ordered factor. As opposed to a continuous predictor, predictor categories (or integers) are not assumend to be equidistant with respect to their effect on the response variable. Instead, the distance between adjacent predictor categories (or integers) is estimated from the data and may vary across categories. This is realized by parameterizing as follows: One parameter, $b$, takes care of the direction and size of the effect similar to an ordinary regression parameter, while an additional parameter vector, $\zeta$, estimates the normalized distances between consecutive predictor categories. For a single monotonic predictor, $x$, the linear predictor term of observation $n$ looks as follows: $$\eta_n = b D \sum_{i = 1}^{x_n} \zeta_i$$ The parameter $b$ can take on any real value, while $\zeta$ is a simplex, which means that it satisfies $\zeta_i \in [0,1]$ and $\sum_{i = 1}^D \zeta_i = 1$ with $D$ being the number of elements of $\zeta$. Equivalently, $D$ is the number of categories (or highest integer in the data) minus 1, since we start counting categories from zero to simplify the notation. ## A Simple Monotonic Model A main application of monotonic effects are ordinal predictors that can be modeled this way without falsely treating them either as continuous or as unordered categorical predictors. In Psychology, for instance, this kind of data is omnipresent in the form of Likert scale items, which are often treated as being continuous for convenience without ever testing this assumption. As an example, suppose we are interested in the relationship of yearly income (in $) and life satisfaction measured on an arbitrary scale from 0 to 100. Usually, people are not asked for the exact income. Instead, they are asked to rank themselves in one of certain classes, say: 'below 20k', 'between 20k and 40k', 'between 40k and 100k' and 'above 100k'. We use some simulated data for illustration purposes. ```{r} income_options <- c("below_20", "20_to_40", "40_to_100", "greater_100") income <- factor(sample(income_options, 100, TRUE), levels = income_options, ordered = TRUE) mean_ls <- c(30, 60, 70, 75) ls <- mean_ls[income] + rnorm(100, sd = 7) dat <- data.frame(income, ls) ``` We now proceed with analyzing the data modeling `income` as a monotonic effect. ```{r, results='hide'} fit1 <- brm(ls ~ mo(income), data = dat) ``` The summary methods yield ```{r} summary(fit1) plot(fit1, pars = "simo") plot(conditional_effects(fit1)) ``` The distributions of the simplex parameter of `income`, as shown in the `plot` method, demonstrate that the largest difference (about 70% of the difference between minimum and maximum category) is between the first two categories. Now, let's compare of monotonic model with two common alternative models. (a) Assume `income` to be continuous: ```{r, results='hide'} dat$income_num <- as.numeric(dat$income) fit2 <- brm(ls ~ income_num, data = dat) ``` ```{r} summary(fit2) ``` or (b) Assume `income` to be an unordered factor: ```{r, results='hide'} contrasts(dat$income) <- contr.treatment(4) fit3 <- brm(ls ~ income, data = dat) ``` ```{r} summary(fit3) ``` We can easily compare the fit of the three models using leave-one-out cross-validation. ```{r} loo(fit1, fit2, fit3) ``` The monotonic model fits better than the continuous model, which is not surprising given that the relationship between `income` and `ls` is non-linear. The monotonic and the unorderd factor model have almost identical fit in this example, but this may not be the case for other data sets. ## Setting Prior Distributions In the previous monotonic model, we have implicitly assumed that all differences between adjacent categories were a-priori the same, or formulated correctly, had the same prior distribution. In the following, we want to show how to change this assumption. The canonical prior distribution of a simplex parameter is the Dirchlet distribution, a multivariate generalization of the beta distribution. It is non-zero for all valid simplexes (i.e., $\zeta_i \in [0,1]$ and $\sum_{i = 1}^D \zeta_i = 1$) and zero otherwise. The Dirichlet prior has a single parameter $\alpha$ of the same length as $\zeta$. The higher $\alpha_i$ the higher the a-priori probability of higher values of $\zeta_i$. Suppose that, before looking at the data, we expected that the same amount of additional money matters more for people who generally have less money. This translates into a higher a-priori values of $\zeta_1$ (difference between 'below_20' and '20_to_40') and hence into higher values of $\alpha_1$. We choose $\alpha_1 = 2$ and $\alpha_2 = \alpha_3 = 1$, the latter being the default value of $\alpha$. To fit the model we write: ```{r, results='hide'} prior4 <- prior(dirichlet(c(2, 1, 1)), class = "simo", coef = "moincome1") fit4 <- brm(ls ~ mo(income), data = dat, prior = prior4, sample_prior = TRUE) ``` The `1` at the end of `"moincome1"` may appear strange when first working with monotonic effects. However, it is necessary as one monotonic term may be associated with multiple simplex parameters, if interactions of multiple monotonic variables are included in the model. ```{r} summary(fit4) ``` We have used `sample_prior = TRUE` to also obtain samples from the prior distribution of `simo_moincome1` so that we can visualized it. ```{r} plot(fit4, pars = "prior_simo", N = 3) ``` As is visible in the plots, `simo_moincome1[1]` was a-priori on average twice as high as `simo_moincome1[2]` and `simo_moincome1[3]` as a result of setting $\alpha_1$ to 2. ## Modeling interactions of monotonic variables Suppose, we have additionally asked participants for their age. ```{r} dat$age <- rnorm(100, mean = 40, sd = 10) ``` We are not only interested in the main effect of age but also in the interaction of income and age. Interactions with monotonic variables can be specified in the usual way using the `*` operator: ```{r, results='hide'} fit5 <- brm(ls ~ mo(income)*age, data = dat) ``` ```{r} summary(fit5) conditional_effects(fit5, "income:age") ``` ## Modelling Monotonic Group-Level Effects Suppose that the 100 people in our sample data were drawn from 10 different cities; 10 people per city. Thus, we add an identifier for `city` to the data and add some city-related variation to `ls`. ```{r} dat$city <- rep(1:10, each = 10) var_city <- rnorm(10, sd = 10) dat$ls <- dat$ls + var_city[dat$city] ``` With the following code, we fit a multilevel model assuming the intercept and the effect of `income` to vary by city: ```{r, results='hide'} fit6 <- brm(ls ~ mo(income)*age + (mo(income) | city), data = dat) ``` ```{r} summary(fit6) ``` reveals that the effect of `income` varies only little across cities. For the present data, this is not overly surprising given that, in the data simulations, we assumed `income` to have the same effect across cities. ## References Bürkner P. C. & Charpentier, E. (in review). [Monotonic Effects: A Principled Approach for Including Ordinal Predictors in Regression Models](https://psyarxiv.com/9qkhj/). *PsyArXiv preprint*. brms/inst/doc/brms_distreg.html0000644000176200001440000053745413623753774016354 0ustar liggesusers Estimating Distributional Models with brms

    Estimating Distributional Models with brms

    Paul Bürkner

    2020-02-21

    Introduction

    This vignette provides an introduction on how to fit distributional regression models with brms. We use the term distributional model to refer to a model, in which we can specify predictor terms for all parameters of the assumed response distribution. In the vast majority of regression model implementations, only the location parameter (usually the mean) of the response distribution depends on the predictors and corresponding regression parameters. Other parameters (e.g., scale or shape parameters) are estimated as auxilliary parameters assuming them to be constant across observations. This assumption is so common that most researchers applying regression models are often (in my experience) not aware of the possibility of relaxing it. This is understandable insofar as relaxing this assumption drastically increase model complexity and thus makes models hard to fit. Fortunately, brms uses Stan on the backend, which is an incredibly flexible and powerful tool for estimating Bayesian models so that model complexity is much less of an issue.

    Suppose we have a normally distributed response variable. Then, in basic linear regression, we specify a predictor term \(\eta_{\mu}\) for the mean parameter \(\mu\) of the normal distribution. The second parameter of the normal distribution – the residual standard deviation \(\sigma\) – is assumed to be constant across observations. We estimate \(\sigma\) but do not try to predict it. In a distributional model, however, we do exactly this by specifying a predictor term \(\eta_{\sigma}\) for \(\sigma\) in addition to the predictor term \(\eta_{\mu}\). Ignoring group-level effects for the moment, the linear predictor of a parameter \(\theta\) for observation \(n\) has the form

    \[\eta_{\theta n} = \sum_{i = 1}^{K_{\theta}} b_{\theta i} x_{\theta i n}\] where \(x_{\theta i n}\) denotes the value of the \(i\)th predictor of parameter \(\theta\) for observation \(n\) and \(b_{\theta i}\) is the \(i\)th regression coefficient of parameter \(\theta\). A distributional normal model with response variable \(y\) can then be written as

    \[y_n \sim \mathcal{N}\left(\eta_{\mu n}, \, \exp(\eta_{\sigma n}) \right)\] We used the exponential function around \(\eta_{\sigma}\) to reflect that \(\sigma\) constitutes a standard deviation and thus only takes on positive values, while a linear predictor can be any real number.

    A simple distributional model

    Unequal variance models are possibly the most simple, but nevertheless very important application of distributional models. Suppose we have two groups of patients: One group recieves a treatment (e.g., an antidepressive drug) and another group recieves placebo. Since the treatment may not work equally well for all patients, the symptom variance of the treatment group may be larger than the symptom variance of the placebo group after some weeks of treatment. For simplicity, assume that we only investigate the post-treatment values.

      group symptom_post
    1 treat    4.6805157
    2 treat    1.2316825
    3 treat    0.5308893
    4 treat   -1.7832597
    5 treat    2.6846450
    6 treat   -0.5458134

    The following model estimates the effect of group on both the mean and the residual standard deviation of the normal response distribution.

    Useful summary statistics and plots can be obtained via

    The population-level effect sigma_grouptreat, which is the contrast of the two residual standard deviations on the log-scale, reveals that the variances of both groups are indeed different. This impression is confirmed when looking at the conditional_effects of group. Going one step further, we can compute the residual standard deviations on the original scale using the hypothesis method.

    Hypothesis Tests for class b:
                    Hypothesis Estimate Est.Error CI.Lower CI.Upper Evid.Ratio Post.Prob Star
    1 (exp(sigma_Interc... = 0     1.06      0.15     0.82     1.38         NA        NA    *
    2 (exp(sigma_Interc... = 0     1.89      0.27     1.47     2.49         NA        NA    *
    ---
    'CI': 90%-CI for one-sided and 95%-CI for two-sided hypotheses.
    '*': For one-sided hypotheses, the posterior probability exceeds 95%;
    for two-sided hypotheses, the value tested against lies outside the 95%-CI.
    Posterior probabilities of point hypotheses assume equal prior probabilities.

    We may also directly compare them and plot the posterior distribution of their difference.

    Hypothesis Tests for class b:
                    Hypothesis Estimate Est.Error CI.Lower CI.Upper Evid.Ratio Post.Prob Star
    1 (exp(sigma_Interc... > 0     0.83      0.31     0.37     1.36     570.43         1    *
    ---
    'CI': 90%-CI for one-sided and 95%-CI for two-sided hypotheses.
    '*': For one-sided hypotheses, the posterior probability exceeds 95%;
    for two-sided hypotheses, the value tested against lies outside the 95%-CI.
    Posterior probabilities of point hypotheses assume equal prior probabilities.

    Indeed, the residual standard deviation of the treatment group seems to larger than that of the placebo group. Moreover the magnitude of this difference is pretty similar to what we expected due to the values we put into the data simulations.

    Zero-Inflated Models

    Another important application of the distributional regression framework are so called zero-inflated models. These models are helpful whenever there are more zeros in the response variable than one would naturally expect. For example, if one seeks to predict the number of cigarettes people smoke per day and also includes non-smokers, there will be a huge amount of zeros which, when not modeled appropriately, can seriously distort parameter estimates. Here, we consider an example dealing with the number of fish caught by various groups of people. On the UCLA website (), the data are described as follows: “The state wildlife biologists want to model how many fish are being caught by fishermen at a state park. Visitors are asked how long they stayed, how many people were in the group, were there children in the group and how many fish were caught. Some visitors do not fish, but there is no data on whether a person fished or not. Some visitors who did fish did not catch any fish so there are excess zeros in the data because of the people that did not fish.”

      nofish livebait camper persons child         xb         zg count
    1      1        0      0       1     0 -0.8963146  3.0504048     0
    2      0        1      1       1     0 -0.5583450  1.7461489     0
    3      0        1      0       1     0 -0.4017310  0.2799389     0
    4      0        1      1       2     1 -0.9562981 -0.6015257     0
    5      0        1      0       1     0  0.4368910  0.5277091     1
    6      0        1      1       4     2  1.3944855 -0.7075348     0

    As predictors we choose the number of people per group, the number of children, as well as whether the group consists of campers. Many groups may not even try catching any fish at all (thus leading to many zero responses) and so we fit a zero-inflated Poisson model to the data. For now, we assume a constant zero-inflation probability across observations.

    Again, we summarize the results using the usual methods.

     Family: zero_inflated_poisson 
      Links: mu = log; zi = identity 
    Formula: count ~ persons + child + camper 
       Data: zinb (Number of observations: 250) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    -1.01      0.18    -1.36    -0.67 1.00     2715     2602
    persons       0.87      0.05     0.79     0.96 1.00     2453     2612
    child        -1.37      0.09    -1.55    -1.18 1.00     2533     2515
    camper        0.80      0.09     0.61     0.98 1.00     3399     2794
    
    Family Specific Parameters: 
       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    zi     0.41      0.04     0.32     0.50 1.00     2803     2376
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    According to the parameter estimates, larger groups catch more fish, campers catch more fish than non-campers, and groups with more children catch less fish. The zero-inflation probability zi is pretty large with a mean of 41%. Please note that the probability of catching no fish is actually higher than 41%, but parts of this probability are already modeled by the poisson distribution itself (hence the name zero-inflation). If you want to treat all zeros as origniating from a separate process, you can use hurdle models instead (not shown here).

    Now, we try to additionally predict the zero-inflation probability by the number of children. The underlying reasoning is that we expect groups with more children to not even try catching fish. Most children are just terribly bad at waiting for hours until something happens. From a purely statistical perspective, zero-inflated (and hurdle) distributions are a mixture of two processes and predicting both parts of the model is natural and often very reasonable to make full use of the data.

     Family: zero_inflated_poisson 
      Links: mu = log; zi = logit 
    Formula: count ~ persons + child + camper 
             zi ~ child
       Data: zinb (Number of observations: 250) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept       -1.08      0.18    -1.43    -0.74 1.00     2897     2632
    zi_Intercept    -0.95      0.26    -1.48    -0.48 1.00     3762     3038
    persons          0.89      0.05     0.80     0.99 1.00     2857     3086
    child           -1.17      0.09    -1.36    -0.99 1.00     3289     2834
    camper           0.77      0.09     0.59     0.96 1.00     3590     2485
    zi_child         1.22      0.27     0.70     1.77 1.00     3776     2622
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    To transform the linear predictor of zi into a probability, brms applies the logit-link:

    \[logit(zi) = \log\left(\frac{zi}{1-zi}\right) = \eta_{zi}\]

    The logit-link takes values within \([0, 1]\) and returns values on the real line. Thus, it allows the transition between probabilities and linear predictors.

    According to the model, trying to fish with children not only decreases the overall number fish caught (as implied by the Poisson part of the model) but also drastically increases your change of catching no fish at all (as implied by the zero-inflation part) most likely because groups with more children are not even trying.

    Additive Distributional Models

    In the examples so far, we did not have multilevel data and thus did not fully use the capabilities of the distributional regression framework of brms. In the example presented below, we will not only show how to deal with multilevel data in distributional models, but also how to incorporate smooth terms (i.e., splines) into the model. In many applications, we have no or only a very vague idea how the relationship between a predictor and the response looks like. A very flexible approach to tackle this problems is to use splines and let them figure out the form of the relationship. For illustration purposes, we simulate some data with the mgcv package, which is also used in brms to prepare smooth terms.

    Gu & Wahba 4 term additive model
             y        x0        x1         x2        x3        f
    1 10.93589 0.6551102 0.5561513 0.52813211 0.9968276 10.58317
    2 18.93006 0.1893538 0.8889957 0.13636628 0.6570060 18.89231
    3 12.43673 0.1979306 0.2378662 0.42468726 0.6998439 15.40462
    4 13.07497 0.8842984 0.1391652 0.01606225 0.1525380 14.06724
    5 13.57551 0.3750519 0.6720850 0.56364082 0.3521884 11.64944
    6 14.95103 0.8740564 0.7017490 0.13180414 0.2523065 16.41167

    The data contains the predictors x0 to x3 as well as the grouping factor fac indicating the nested structure of the data. We predict the response variable y using smooth terms of x1 and x2 and a varying intercept of fac. In addition, we assume the residual standard deviation sigma to vary by a smoothing term of x0 and a varying intercept of fac.

     Family: gaussian 
      Links: mu = identity; sigma = log 
    Formula: y ~ s(x1) + s(x2) + (1 | fac) 
             sigma ~ s(x0) + (1 | fac)
       Data: dat_smooth (Number of observations: 200) 
    Samples: 2 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 2000
    
    Smooth Terms: 
                     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sds(sx1_1)           2.89      1.84     0.66     7.69 1.00      740     1030
    sds(sx2_1)          23.67      6.74    13.96    40.67 1.00      693      977
    sds(sigma_sx0_1)     1.67      1.39     0.06     5.12 1.00      365      674
    
    Group-Level Effects: 
    ~fac (Number of levels: 4) 
                        Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)           5.22      2.74     2.15    12.81 1.00      793     1149
    sd(sigma_Intercept)     0.13      0.17     0.00     0.60 1.00      590      711
    
    Population-Level Effects: 
                    Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept          15.13      2.62     9.79    20.52 1.00      814     1136
    sigma_Intercept     0.67      0.12     0.41     0.90 1.00      659      418
    sx1_1              11.88      5.21     1.52    22.65 1.00     1411     1204
    sx2_1              48.66     14.12    21.35    75.66 1.00     1779     1580
    sigma_sx0_1         1.05      2.46    -3.91     6.44 1.00     1361     1313
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    This model is likely an overkill for the data at hand, but nicely demonstrates the ease with which one can specify complex models with brms and to fit them using Stan on the backend.

    brms/inst/doc/brms_phylogenetics.R0000644000176200001440000001361613623760744017005 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE----------------------------------------------------- stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ## --------------------------------------------------------------------------------------- phylo <- ape::read.nexus("https://paul-buerkner.github.io/data/phylo.nex") data_simple <- read.table( "https://paul-buerkner.github.io/data/data_simple.txt", header = TRUE ) head(data_simple) ## --------------------------------------------------------------------------------------- A <- ape::vcv.phylo(phylo) ## ---- results='hide'-------------------------------------------------------------------- model_simple <- brm( phen ~ cofactor + (1|phylo), data = data_simple, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0, 10), "b"), prior(normal(0, 50), "Intercept"), prior(student_t(3, 0, 20), "sd"), prior(student_t(3, 0, 20), "sigma") ) ) ## --------------------------------------------------------------------------------------- summary(model_simple) plot(model_simple, N = 2, ask = FALSE) plot(conditional_effects(model_simple), points = TRUE) ## --------------------------------------------------------------------------------------- hyp <- "sd_phylo__Intercept^2 / (sd_phylo__Intercept^2 + sigma^2) = 0" (hyp <- hypothesis(model_simple, hyp, class = NULL)) plot(hyp) ## --------------------------------------------------------------------------------------- data_repeat <- read.table( "https://paul-buerkner.github.io/data/data_repeat.txt", header = TRUE ) data_repeat$spec_mean_cf <- with(data_repeat, sapply(split(cofactor, phylo), mean)[phylo]) head(data_repeat) ## ---- results='hide'-------------------------------------------------------------------- model_repeat1 <- brm( phen ~ spec_mean_cf + (1|phylo) + (1|species), data = data_repeat, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0,10), "b"), prior(normal(0,50), "Intercept"), prior(student_t(3,0,20), "sd"), prior(student_t(3,0,20), "sigma") ), sample_prior = TRUE, chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ## --------------------------------------------------------------------------------------- summary(model_repeat1) ## --------------------------------------------------------------------------------------- hyp <- paste( "sd_phylo__Intercept^2 /", "(sd_phylo__Intercept^2 + sd_species__Intercept^2 + sigma^2) = 0" ) (hyp <- hypothesis(model_repeat1, hyp, class = NULL)) plot(hyp) ## --------------------------------------------------------------------------------------- data_repeat$within_spec_cf <- data_repeat$cofactor - data_repeat$spec_mean_cf ## ---- results='hide'-------------------------------------------------------------------- model_repeat2 <- update( model_repeat1, formula = ~ . + within_spec_cf, newdata = data_repeat, chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ## --------------------------------------------------------------------------------------- summary(model_repeat2) ## --------------------------------------------------------------------------------------- hyp <- paste( "sd_phylo__Intercept^2 /", "(sd_phylo__Intercept^2 + sd_species__Intercept^2 + sigma^2) = 0" ) (hyp <- hypothesis(model_repeat2, hyp, class = NULL)) ## --------------------------------------------------------------------------------------- data_fisher <- read.table( "https://paul-buerkner.github.io/data/data_effect.txt", header = TRUE ) data_fisher$obs <- 1:nrow(data_fisher) head(data_fisher) ## ---- results='hide'-------------------------------------------------------------------- model_fisher <- brm( Zr | se(sqrt(1 / (N - 3))) ~ 1 + (1|phylo) + (1|obs), data = data_fisher, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0, 10), "Intercept"), prior(student_t(3, 0, 10), "sd") ), control = list(adapt_delta = 0.95), chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ## --------------------------------------------------------------------------------------- summary(model_fisher) plot(model_fisher) ## --------------------------------------------------------------------------------------- data_pois <- read.table( "https://paul-buerkner.github.io/data/data_pois.txt", header = TRUE ) data_pois$obs <- 1:nrow(data_pois) head(data_pois) ## ---- results='hide'-------------------------------------------------------------------- model_pois <- brm( phen_pois ~ cofactor + (1|phylo) + (1|obs), data = data_pois, family = poisson("log"), cov_ranef = list(phylo = A), chains = 2, cores = 2, iter = 4000, control = list(adapt_delta = 0.95) ) ## --------------------------------------------------------------------------------------- summary(model_pois) plot(conditional_effects(model_pois), points = TRUE) ## ---- results='hide'-------------------------------------------------------------------- model_normal <- brm( phen_pois ~ cofactor + (1|phylo), data = data_pois, family = gaussian(), cov_ranef = list(phylo = A), chains = 2, cores = 2, iter = 4000, control = list(adapt_delta = 0.95) ) ## --------------------------------------------------------------------------------------- summary(model_normal) ## --------------------------------------------------------------------------------------- pp_check(model_pois) pp_check(model_normal) ## --------------------------------------------------------------------------------------- loo(model_pois, model_normal) brms/inst/doc/brms_multivariate.R0000644000176200001440000000474013623756366016641 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE----------------------------------------------------- stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ## ----data------------------------------------------------------------------------------- data("BTdata", package = "MCMCglmm") head(BTdata) ## ----fit1, message=FALSE, warning=FALSE, results='hide'--------------------------------- fit1 <- brm( mvbind(tarsus, back) ~ sex + hatchdate + (1|p|fosternest) + (1|q|dam), data = BTdata, chains = 2, cores = 2 ) ## ----summary1, warning=FALSE------------------------------------------------------------ fit1 <- add_criterion(fit1, "loo") summary(fit1) ## ----pp_check1, message=FALSE----------------------------------------------------------- pp_check(fit1, resp = "tarsus") pp_check(fit1, resp = "back") ## ----R2_1------------------------------------------------------------------------------- bayes_R2(fit1) ## ----fit2, message=FALSE, warning=FALSE, results='hide'--------------------------------- bf_tarsus <- bf(tarsus ~ sex + (1|p|fosternest) + (1|q|dam)) bf_back <- bf(back ~ hatchdate + (1|p|fosternest) + (1|q|dam)) fit2 <- brm(bf_tarsus + bf_back, data = BTdata, chains = 2, cores = 2) ## ----summary2, warning=FALSE------------------------------------------------------------ fit2 <- add_criterion(fit2, "loo") summary(fit2) ## ----loo12------------------------------------------------------------------------------ loo(fit1, fit2) ## ----fit3, message=FALSE, warning=FALSE, results='hide'--------------------------------- bf_tarsus <- bf(tarsus ~ sex + (1|p|fosternest) + (1|q|dam)) + lf(sigma ~ 0 + sex) + skew_normal() bf_back <- bf(back ~ s(hatchdate) + (1|p|fosternest) + (1|q|dam)) + gaussian() fit3 <- brm( bf_tarsus + bf_back + set_rescor(FALSE), data = BTdata, chains = 2, cores = 2, control = list(adapt_delta = 0.95) ) ## ----summary3, warning=FALSE------------------------------------------------------------ fit3 <- add_criterion(fit3, "loo") summary(fit3) ## ----me3-------------------------------------------------------------------------------- conditional_effects(fit3, "hatchdate", resp = "back") brms/inst/doc/brms_phylogenetics.html0000644000176200001440000054101013623760745017543 0ustar liggesusers Estimating Phylogenetic Multilevel Models with brms

    Estimating Phylogenetic Multilevel Models with brms

    Paul Bürkner

    2020-02-21

    Introduction

    In the present vignette, we want to discuss how to specify phylogenetic multilevel models using brms. These models are relevant in evolutionary biology when data of many species are analyzed at the same time. The usual approach would be to model species as a grouping factor in a multilevel model and estimate varying intercepts (and possibly also varying slopes) over species. However, species are not independent as they come from the same phylogenetic tree and we thus have to adjust our model to incorporate this dependency. The examples discussed here are from chapter 11 of the book Modern Phylogenetic Comparative Methods and the application in Evolutionary Biology (de Villemeruil & Nakagawa, 2014). The necessary data can be downloaded from the corresponding website (http://www.mpcm-evolution.com/). Some of these models may take a few minutes to fit.

    A Simple Phylogenetic Model

    Assume we have measurements of a phenotype, phen (say the body size), and a cofactor variable (say the temperature of the environment). We prepare the data using the following code.

           phen  cofactor phylo
    1 107.06595 10.309588  sp_1
    2  79.61086  9.690507  sp_2
    3 116.38186 15.007825  sp_3
    4 143.28705 19.087673  sp_4
    5 139.60993 15.658404  sp_5
    6  68.50657  6.005236  sp_6

    The phylo object contains information on the relationship between species. Using this information, we can construct a covariance matrix of species (Hadfield & Nakagawa, 2010).

    Now we are ready to fit our first phylogenetic multilevel model:

    With the exception of cov_ranef = list(phylo = A) this is a basic multilevel model with a varying intercept over species (phylo is an indicator of species in this data set). However, by using the cov_ranef argument, we make sure that species are correlated as specified by the covariance matrix A. Setting priors is not required for achieving good convergence for this model, but it improves sampling speed a bit. After fitting, the results can be investigated in detail.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: phen ~ cofactor + (1 | phylo) 
       Data: data_simple (Number of observations: 200) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Group-Level Effects: 
    ~phylo (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)    14.43      2.19    10.41    18.89 1.00      934     2083
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    38.10      6.92    24.12    51.39 1.00     2455     2272
    cofactor      5.18      0.14     4.90     5.46 1.00     6227     2921
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     9.25      0.72     7.89    10.72 1.00     1187     2556
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    The so called phylogenetic signal (often symbolize by \(\lambda\)) can be computed with the hypothesis method and is roughly \(\lambda = 0.7\) for this example.

    Hypothesis Tests for class :
                    Hypothesis Estimate Est.Error CI.Lower CI.Upper Evid.Ratio Post.Prob Star
    1 (sd_phylo__Interc... = 0      0.7      0.08     0.52     0.84         NA        NA    *
    ---
    'CI': 90%-CI for one-sided and 95%-CI for two-sided hypotheses.
    '*': For one-sided hypotheses, the posterior probability exceeds 95%;
    for two-sided hypotheses, the value tested against lies outside the 95%-CI.
    Posterior probabilities of point hypotheses assume equal prior probabilities.

    Note that the phylogenetic signal is just a synonym of the intra-class correlation (ICC) used in the context phylogenetic analysis.

    A Phylogenetic Model with Repeated Measurements

    Often, we have multiple observations per species and this allows to fit more complicated phylogenetic models.

           phen  cofactor species phylo spec_mean_cf
    1 107.41919 11.223724    sp_1  sp_1    10.309588
    2 109.16403  9.805934    sp_1  sp_1    10.309588
    3  91.88672 10.308423    sp_1  sp_1    10.309588
    4 121.54341  8.355349    sp_1  sp_1    10.309588
    5 105.31638 11.854510    sp_1  sp_1    10.309588
    6  64.99859  4.314015    sp_2  sp_2     3.673914

    The variable spec_mean_cf just contains the mean of the cofactor for each species. The code for the repeated measurement phylogenetic model looks as follows:

    The variables phylo and species are identical as they are both identifiers of the species. However, we model the phylogenetic covariance only for phylo and thus the species variable accounts for any specific effect that would be independent of the phylogenetic relationship between species (e.g., environmental or niche effects). Again we can obtain model summaries as well as estimates of the phylogenetic signal.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: phen ~ spec_mean_cf + (1 | phylo) + (1 | species) 
       Data: data_repeat (Number of observations: 1000) 
    Samples: 2 chains, each with iter = 4000; warmup = 1000; thin = 1;
             total post-warmup samples = 6000
    
    Group-Level Effects: 
    ~phylo (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)    16.51      1.88    13.06    20.46 1.00     1375     2015
    
    ~species (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     4.92      0.84     3.22     6.51 1.00     1066     1375
    
    Population-Level Effects: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept       36.10      7.87    20.53    51.54 1.00     4127     3380
    spec_mean_cf     5.10      0.10     4.89     5.29 1.00     7691     4406
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     8.11      0.20     7.72     8.50 1.00     5030     4406
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).
    Hypothesis Tests for class :
                    Hypothesis Estimate Est.Error CI.Lower CI.Upper Evid.Ratio Post.Prob Star
    1 (sd_phylo__Interc... = 0     0.74      0.05     0.63     0.84          0         0    *
    ---
    'CI': 90%-CI for one-sided and 95%-CI for two-sided hypotheses.
    '*': For one-sided hypotheses, the posterior probability exceeds 95%;
    for two-sided hypotheses, the value tested against lies outside the 95%-CI.
    Posterior probabilities of point hypotheses assume equal prior probabilities.

    So far, we have completely ignored the variability of the cofactor within species. To incorporate this into the model, we define

    and then fit it again using within_spec_cf as an additional predictor.

    The results are almost unchanged, with apparently no relationship between the phenotype and the within species variance of cofactor.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: phen ~ spec_mean_cf + (1 | phylo) + (1 | species) + within_spec_cf 
       Data: data_repeat (Number of observations: 1000) 
    Samples: 2 chains, each with iter = 4000; warmup = 1000; thin = 1;
             total post-warmup samples = 6000
    
    Group-Level Effects: 
    ~phylo (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)    16.32      1.90    12.75    20.21 1.00     1590     2589
    
    ~species (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     5.03      0.85     3.31     6.64 1.00     1177     1564
    
    Population-Level Effects: 
                   Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept         36.14      7.88    20.39    51.45 1.00     4533     3742
    spec_mean_cf       5.10      0.10     4.90     5.30 1.00     8279     4595
    within_spec_cf    -0.06      0.19    -0.43     0.31 1.00    11026     4155
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     8.11      0.20     7.72     8.52 1.00     6018     3669
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    Also, the phylogenetic signal remains more or less the same.

    Hypothesis Tests for class :
                    Hypothesis Estimate Est.Error CI.Lower CI.Upper Evid.Ratio Post.Prob Star
    1 (sd_phylo__Interc... = 0     0.74      0.06     0.61     0.84          0         0    *
    ---
    'CI': 90%-CI for one-sided and 95%-CI for two-sided hypotheses.
    '*': For one-sided hypotheses, the posterior probability exceeds 95%;
    for two-sided hypotheses, the value tested against lies outside the 95%-CI.
    Posterior probabilities of point hypotheses assume equal prior probabilities.

    A Phylogenetic Meta-Analysis

    Let’s say we have Fisher’s z-transformated correlation coefficients \(Zr\) per species along with corresponding sample sizes (e.g., correlations between male coloration and reproductive success):

              Zr  N phylo obs
    1 0.28917549 13  sp_1   1
    2 0.02415579 40  sp_2   2
    3 0.19513651 39  sp_3   3
    4 0.09831239 40  sp_4   4
    5 0.13780152 66  sp_5   5
    6 0.13710587 41  sp_6   6

    We assume the sampling variance to be known and as \(V(Zr) = \frac{1}{N - 3}\) for Fisher’s values, where \(N\) is the sample size per species. Incorporating the known sampling variance into the model is straight forward. One has to keep in mind though, that brms requires the sampling standard deviation (square root of the variance) as input instead of the variance itself. The group-level effect of obs represents the residual variance, which we have to model explicitly in a meta-analytic model.

    A summary of the fitted model is obtained via

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: Zr | se(sqrt(1/(N - 3))) ~ 1 + (1 | phylo) + (1 | obs) 
       Data: data_fisher (Number of observations: 200) 
    Samples: 2 chains, each with iter = 4000; warmup = 1000; thin = 1;
             total post-warmup samples = 6000
    
    Group-Level Effects: 
    ~obs (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     0.05      0.03     0.00     0.11 1.00      911     2186
    
    ~phylo (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     0.07      0.04     0.00     0.15 1.00      933     2672
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept     0.16      0.04     0.08     0.24 1.00     5774     3052
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    The meta-analytic mean (i.e., the model intercept) is \(0.16\) with a credible interval of \([0.08, 0.25]\). Thus the mean correlation across species is positive according to the model.

    A phylogenetic count-data model

    Suppose that we analyze a phenotype that consists of counts instead of being a continuous variable. In such a case, the normality assumption will likely not be justified and it is recommended to use a distribution explicitely suited for count data, for instance the Poisson distribution. The following data set (again retrieved from mpcm-evolution.org) provides an example.

      phen_pois   cofactor phylo obs
    1         1  7.8702830  sp_1   1
    2         0  3.4690529  sp_2   2
    3         1  2.5478774  sp_3   3
    4        14 18.2286628  sp_4   4
    5         1  2.5302806  sp_5   5
    6         1  0.5145559  sp_6   6

    As the poisson distribution does not have a natural overdispersion parameter, we model the residual variance via the group-level effects of obs (e.g., see Lawless, 1987).

    Again, we obtain a summary of the fitted model via

     Family: poisson 
      Links: mu = log 
    Formula: phen_pois ~ cofactor + (1 | phylo) + (1 | obs) 
       Data: data_pois (Number of observations: 200) 
    Samples: 2 chains, each with iter = 4000; warmup = 2000; thin = 1;
             total post-warmup samples = 4000
    
    Group-Level Effects: 
    ~obs (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     0.18      0.08     0.02     0.34 1.00      680     1059
    
    ~phylo (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     0.19      0.11     0.02     0.45 1.00      746     1137
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    -2.09      0.21    -2.50    -1.69 1.00     2594     2553
    cofactor      0.25      0.01     0.23     0.27 1.00     3807     2974
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    Now, assume we ignore the fact that the phenotype is count data and fit a linear normal model instead.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: phen_pois ~ cofactor + (1 | phylo) 
       Data: data_pois (Number of observations: 200) 
    Samples: 2 chains, each with iter = 4000; warmup = 2000; thin = 1;
             total post-warmup samples = 4000
    
    Group-Level Effects: 
    ~phylo (Number of levels: 200) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     0.73      0.55     0.03     2.09 1.00      716      787
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    -2.99      0.65    -4.26    -1.68 1.00     3443     2372
    cofactor      0.68      0.04     0.60     0.76 1.00     7946     2222
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     3.45      0.18     3.10     3.82 1.00     3794     2306
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    We see that cofactor has a positive relationship with the phenotype in both models. One should keep in mind, though, that the estimates of the Poisson model are on the log-scale, as we applied the canonical log-link function in this example. Therefore, estimates are not comparable to a linear normal model even if applied to the same data. What we can compare, however, is the model fit, for instance graphically via posterior predictive checks.

    Apparently, the distribution of the phenotype predicted by the Poisson model resembles the original distribution of the phenotype pretty closely, while the normal models fails to do so. We can also apply leave-one-out cross-validation for direct numerical comparison of model fit.

    Output of model 'model_pois':
    
    Computed from 4000 by 200 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -348.4 17.0
    p_loo        30.5  3.5
    looic       696.9 34.0
    ------
    Monte Carlo SE of elpd_loo is NA.
    
    Pareto k diagnostic values:
                             Count Pct.    Min. n_eff
    (-Inf, 0.5]   (good)     167   83.5%   783       
     (0.5, 0.7]   (ok)        28   14.0%   287       
       (0.7, 1]   (bad)        5    2.5%   107       
       (1, Inf)   (very bad)   0    0.0%   <NA>      
    See help('pareto-k-diagnostic') for details.
    
    Output of model 'model_normal':
    
    Computed from 4000 by 200 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -536.2 15.8
    p_loo        10.8  2.4
    looic      1072.4 31.6
    ------
    Monte Carlo SE of elpd_loo is 0.1.
    
    Pareto k diagnostic values:
                             Count Pct.    Min. n_eff
    (-Inf, 0.5]   (good)     196   98.0%   1348      
     (0.5, 0.7]   (ok)         4    2.0%   269       
       (0.7, 1]   (bad)        0    0.0%   <NA>      
       (1, Inf)   (very bad)   0    0.0%   <NA>      
    
    All Pareto k estimates are ok (k < 0.7).
    See help('pareto-k-diagnostic') for details.
    
    Model comparisons:
                 elpd_diff se_diff
    model_pois      0.0       0.0 
    model_normal -187.8      18.0 

    Since smaller values of loo indicate better fit, it is again evident that the Poisson model fits the data better than the normal model. Of course, the Poisson model is not the only reasonable option here. For instance, you could use a negative binomial model (via family negative_binomial), which already contains an overdispersion parameter so that modeling a varying intercept of obs becomes obsolete.

    Phylogenetic models with multiple group-level effects

    In the above examples, we have only used a single group-level effect (i.e., a varying intercept) for the phylogenetic grouping factors. In brms, it is also possible to estimate multiple group-level effects (e.g., a varying intercept and a varying slope) for these grouping factors. However, it requires repeatedly computing Kronecker products of covariance matrices while fitting the model. This will be very slow especially when the grouping factors have many levels and matrices are thus large.

    References

    de Villemeruil P. & Nakagawa, S. (2014) General quantitative genetic methods for comparative biology. In: Modern phylogenetic comparative methods and their application in evolutionary biology: concepts and practice (ed. Garamszegi L.) Springer, New York. pp. 287-303.

    Hadfield, J. D. & Nakagawa, S. (2010) General quantitative genetic methods for comparative biology: phylogenies, taxonomies, and multi-trait models for continuous and categorical characters. Journal of Evolutionary Biology. 23. 494-508.

    Lawless, J. F. (1987). Negative binomial and mixed Poisson regression. Canadian Journal of Statistics, 15(3), 209-225.

    brms/inst/doc/brms_distreg.Rmd0000644000176200001440000002562013606326627016107 0ustar liggesusers--- title: "Estimating Distributional Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Distributional Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction This vignette provides an introduction on how to fit distributional regression models with **brms**. We use the term *distributional model* to refer to a model, in which we can specify predictor terms for all parameters of the assumed response distribution. In the vast majority of regression model implementations, only the location parameter (usually the mean) of the response distribution depends on the predictors and corresponding regression parameters. Other parameters (e.g., scale or shape parameters) are estimated as auxilliary parameters assuming them to be constant across observations. This assumption is so common that most researchers applying regression models are often (in my experience) not aware of the possibility of relaxing it. This is understandable insofar as relaxing this assumption drastically increase model complexity and thus makes models hard to fit. Fortunately, **brms** uses **Stan** on the backend, which is an incredibly flexible and powerful tool for estimating Bayesian models so that model complexity is much less of an issue. Suppose we have a normally distributed response variable. Then, in basic linear regression, we specify a predictor term $\eta_{\mu}$ for the mean parameter $\mu$ of the normal distribution. The second parameter of the normal distribution -- the residual standard deviation $\sigma$ -- is assumed to be constant across observations. We estimate $\sigma$ but do not try to *predict* it. In a distributional model, however, we do exactly this by specifying a predictor term $\eta_{\sigma}$ for $\sigma$ in addition to the predictor term $\eta_{\mu}$. Ignoring group-level effects for the moment, the linear predictor of a parameter $\theta$ for observation $n$ has the form $$\eta_{\theta n} = \sum_{i = 1}^{K_{\theta}} b_{\theta i} x_{\theta i n}$$ where $x_{\theta i n}$ denotes the value of the $i$th predictor of parameter $\theta$ for observation $n$ and $b_{\theta i}$ is the $i$th regression coefficient of parameter $\theta$. A distributional normal model with response variable $y$ can then be written as $$y_n \sim \mathcal{N}\left(\eta_{\mu n}, \, \exp(\eta_{\sigma n}) \right)$$ We used the exponential function around $\eta_{\sigma}$ to reflect that $\sigma$ constitutes a standard deviation and thus only takes on positive values, while a linear predictor can be any real number. ## A simple distributional model Unequal variance models are possibly the most simple, but nevertheless very important application of distributional models. Suppose we have two groups of patients: One group recieves a treatment (e.g., an antidepressive drug) and another group recieves placebo. Since the treatment may not work equally well for all patients, the symptom variance of the treatment group may be larger than the symptom variance of the placebo group after some weeks of treatment. For simplicity, assume that we only investigate the post-treatment values. ```{r} group <- rep(c("treat", "placebo"), each = 30) symptom_post <- c(rnorm(30, mean = 1, sd = 2), rnorm(30, mean = 0, sd = 1)) dat1 <- data.frame(group, symptom_post) head(dat1) ``` The following model estimates the effect of `group` on both the mean and the residual standard deviation of the normal response distribution. ```{r, results='hide'} fit1 <- brm(bf(symptom_post ~ group, sigma ~ group), data = dat1, family = gaussian()) ``` Useful summary statistics and plots can be obtained via ```{r, results='hide'} summary(fit1) plot(fit1, N = 2, ask = FALSE) plot(conditional_effects(fit1), points = TRUE) ``` The population-level effect `sigma_grouptreat`, which is the contrast of the two residual standard deviations on the log-scale, reveals that the variances of both groups are indeed different. This impression is confirmed when looking at the `conditional_effects` of `group`. Going one step further, we can compute the residual standard deviations on the original scale using the `hypothesis` method. ```{r} hyp <- c("exp(sigma_Intercept) = 0", "exp(sigma_Intercept + sigma_grouptreat) = 0") hypothesis(fit1, hyp) ``` We may also directly compare them and plot the posterior distribution of their difference. ```{r} hyp <- "exp(sigma_Intercept + sigma_grouptreat) > exp(sigma_Intercept)" (hyp <- hypothesis(fit1, hyp)) plot(hyp, chars = NULL) ``` Indeed, the residual standard deviation of the treatment group seems to larger than that of the placebo group. Moreover the magnitude of this difference is pretty similar to what we expected due to the values we put into the data simulations. ## Zero-Inflated Models Another important application of the distributional regression framework are so called zero-inflated models. These models are helpful whenever there are more zeros in the response variable than one would naturally expect. For example, if one seeks to predict the number of cigarettes people smoke per day and also includes non-smokers, there will be a huge amount of zeros which, when not modeled appropriately, can seriously distort parameter estimates. Here, we consider an example dealing with the number of fish caught by various groups of people. On the UCLA website (\url{https://stats.idre.ucla.edu/stata/dae/zero-inflated-poisson-regression}), the data are described as follows: "The state wildlife biologists want to model how many fish are being caught by fishermen at a state park. Visitors are asked how long they stayed, how many people were in the group, were there children in the group and how many fish were caught. Some visitors do not fish, but there is no data on whether a person fished or not. Some visitors who did fish did not catch any fish so there are excess zeros in the data because of the people that did not fish." ```{r} zinb <- read.csv("https://paul-buerkner.github.io/data/fish.csv") head(zinb) ``` As predictors we choose the number of people per group, the number of children, as well as whether the group consists of campers. Many groups may not even try catching any fish at all (thus leading to many zero responses) and so we fit a zero-inflated Poisson model to the data. For now, we assume a constant zero-inflation probability across observations. ```{r, results='hide'} fit_zinb1 <- brm(count ~ persons + child + camper, data = zinb, family = zero_inflated_poisson()) ``` Again, we summarize the results using the usual methods. ```{r} summary(fit_zinb1) plot(conditional_effects(fit_zinb1), ask = FALSE) ``` According to the parameter estimates, larger groups catch more fish, campers catch more fish than non-campers, and groups with more children catch less fish. The zero-inflation probability `zi` is pretty large with a mean of 41%. Please note that the probability of catching no fish is actually higher than 41%, but parts of this probability are already modeled by the poisson distribution itself (hence the name zero-*inflation*). If you want to treat all zeros as origniating from a separate process, you can use hurdle models instead (not shown here). Now, we try to additionally predict the zero-inflation probability by the number of children. The underlying reasoning is that we expect groups with more children to not even try catching fish. Most children are just terribly bad at waiting for hours until something happens. From a purely statistical perspective, zero-inflated (and hurdle) distributions are a mixture of two processes and predicting both parts of the model is natural and often very reasonable to make full use of the data. ```{r, results='hide'} fit_zinb2 <- brm(bf(count ~ persons + child + camper, zi ~ child), data = zinb, family = zero_inflated_poisson()) ``` ```{r} summary(fit_zinb2) plot(conditional_effects(fit_zinb2), ask = FALSE) ``` To transform the linear predictor of `zi` into a probability, **brms** applies the logit-link: $$logit(zi) = \log\left(\frac{zi}{1-zi}\right) = \eta_{zi}$$ The logit-link takes values within $[0, 1]$ and returns values on the real line. Thus, it allows the transition between probabilities and linear predictors. According to the model, trying to fish with children not only decreases the overall number fish caught (as implied by the Poisson part of the model) but also drastically increases your change of catching no fish at all (as implied by the zero-inflation part) most likely because groups with more children are not even trying. ## Additive Distributional Models In the examples so far, we did not have multilevel data and thus did not fully use the capabilities of the distributional regression framework of **brms**. In the example presented below, we will not only show how to deal with multilevel data in distributional models, but also how to incorporate smooth terms (i.e., splines) into the model. In many applications, we have no or only a very vague idea how the relationship between a predictor and the response looks like. A very flexible approach to tackle this problems is to use splines and let them figure out the form of the relationship. For illustration purposes, we simulate some data with the **mgcv** package, which is also used in **brms** to prepare smooth terms. ```{r} dat_smooth <- mgcv::gamSim(eg = 6, n = 200, scale = 2, verbose = FALSE) head(dat_smooth[, 1:6]) ``` The data contains the predictors `x0` to `x3` as well as the grouping factor `fac` indicating the nested structure of the data. We predict the response variable `y` using smooth terms of `x1` and `x2` and a varying intercept of `fac`. In addition, we assume the residual standard deviation `sigma` to vary by a smoothing term of `x0` and a varying intercept of `fac`. ```{r, results='hide'} fit_smooth1 <- brm( bf(y ~ s(x1) + s(x2) + (1|fac), sigma ~ s(x0) + (1|fac)), data = dat_smooth, family = gaussian(), chains = 2, control = list(adapt_delta = 0.95) ) ``` ```{r} summary(fit_smooth1) plot(conditional_effects(fit_smooth1), points = TRUE, ask = FALSE) ``` This model is likely an overkill for the data at hand, but nicely demonstrates the ease with which one can specify complex models with **brms** and to fit them using **Stan** on the backend. brms/inst/doc/brms_multilevel.ltx0000644000176200001440000016716713606326627016732 0ustar liggesusers\documentclass[article, nojss]{jss} %\VignetteIndexEntry{Multilevel Models with brms} %\VignetteEngine{R.rsp::tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Paul-Christian B\"urkner} \title{Advanced Bayesian Multilevel Modeling with the \proglang{R} Package \pkg{brms}} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Paul-Christian B\"urkner} %% comma-separated \Plaintitle{Advanced Bayesian Multilevel Modeling with the R Package brms} %% without formatting \Shorttitle{Advanced Bayesian Multilevel Modeling with \pkg{brms}} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The \pkg{brms} package allows R users to easily specify a wide range of Bayesian single-level and multilevel models, which are fitted with the probabilistic programming language \proglang{Stan} behind the scenes. Several response distributions are supported, of which all parameters (e.g., location, scale, and shape) can be predicted at the same time thus allowing for distributional regression. Non-linear relationships may be specified using non-linear predictor terms or semi-parametric approaches such as splines or Gaussian processes. Multivariate models, in which each response variable can be predicted using the above mentioned options, can be fitted as well. To make all of these modeling options possible in a multilevel framework, \pkg{brms} provides an intuitive and powerful formula syntax, which extends the well known formula syntax of \pkg{lme4}. The purpose of the present paper is to introduce this syntax in detail and to demonstrate its usefulness with four examples, each showing other relevant aspects of the syntax. If you use \pkg{brms}, please cite this article as published in the R Journal \citep{brms2}. } \Keywords{Bayesian inference, multilevel models, distributional regression, MCMC, \proglang{Stan}, \proglang{R}} \Plainkeywords{Bayesian inference, multilevel models, distributional regression, MCMC, Stan, R} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{50} %% \Issue{9} %% \Month{June} %% \Year{2012} %% \Submitdate{2012-06-04} %% \Acceptdate{2012-06-04} %% The address of (at least) one author should be given %% in the following format: \Address{ Paul-Christian B\"urkner\\ E-mail: \email{paul.buerkner@gmail.com}\\ URL: \url{https://paul-buerkner.github.io} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/512/507-7103 %% Fax: +43/512/507-2851 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. \section{Introduction} Multilevel models (MLMs) offer great flexibility for researchers across sciences \citep{brown2015, demidenko2013, gelmanMLM2006, pinheiro2006}. They allow modeling of data measured on different levels at the same time -- for instance data of students nested within classes and schools -- thus taking complex dependency structures into account. It is not surprising that many packages for R have been developed to fit MLMs. Usually, however, the functionality of these implementations is limited insofar as it is only possible to predict the mean of the response distribution. Other parameters of the response distribution, such as the residual standard deviation in linear models, are assumed constant across observations, which may be violated in many applications. Accordingly, it is desirable to allow for prediction of \emph{all} response parameters at the same time. Models doing exactly that are often referred to as \emph{distributional models} or more verbosely \emph{models for location, scale and shape} \citep{rigby2005}. Another limitation of basic MLMs is that they only allow for linear predictor terms. While linear predictor terms already offer good flexibility, they are of limited use when relationships are inherently non-linear. Such non-linearity can be handled in at least two ways: (1) by fully specifying a non-linear predictor term with corresponding parameters each of which can be predicted using MLMs \citep{lindstrom1990}, or (2) estimating the form of the non-linear relationship on the fly using splines \citep{wood2004} or Gaussian processes \citep{rasmussen2006}. The former are often simply called \emph{non-linear models}, while models applying splines are referred to as \emph{generalized additive models} (GAMs; \citeauthor{hastie1990}, \citeyear{hastie1990}). Combining all of these modeling options into one framework is a complex task, both conceptually and with regard to model fitting. Maximum likelihood methods, which are typically applied in classical 'frequentist' statistics, can reach their limits at some point and fully Bayesian methods become the go-to solutions to fit such complex models \citep{gelman2014}. In addition to being more flexible, the Bayesian framework comes with other advantages, for instance, the ability to derive probability statements for every quantity of interest or explicitly incorporating prior knowledge about parameters into the model. The former is particularly relevant in non-linear models, for which classical approaches struggle more often than not in propagating all the uncertainty in the parameter estimates to non-linear functions such as out-of-sample predictions. Possibly the most powerful program for performing full Bayesian inference available to date is Stan \citep{stanM2017, carpenter2017}. It implements Hamiltonian Monte Carlo \citep{duane1987, neal2011, betancourt2014} and its extension, the No-U-Turn (NUTS) Sampler \citep{hoffman2014}. These algorithms converge much more quickly than other Markov-Chain Monte-Carlo (MCMC) algorithms especially for high-dimensional models \citep{hoffman2014, betancourt2014, betancourt2017}. An excellent non-mathematical introduction to Hamiltonian Monte Carlo can be found in \citet{betancourt2017}. Stan comes with its own programming language, allowing for great modeling flexibility \cite{stanM2017, carpenter2017}). Many researchers may still be hesitent to use Stan directly, as every model has to be written, debugged and possibly also optimized. This may be a time-consuming and error-prone process even for researchers familiar with Bayesian inference. The \pkg{brms} package \citep{brms1}, presented in this paper, aims to remove these hurdles for a wide range of regression models by allowing the user to benefit from the merits of Stan by using extended \pkg{lme4}-like \citep{bates2015} formula syntax, with which many R users are familiar with. It offers much more than writing efficient and human-readable Stan code: \pkg{brms} comes with many post-processing and visualization functions, for instance to perform posterior predictive checks, leave-one-out cross-validation, visualization of estimated effects, and prediction of new data. The overarching aim is to have one general framework for regression modeling, which offers everything required to successfully apply regression models to complex data. To date, it already replaces and extends the functionality of dozens of other R packages, each of which is restricted to specific regression models\footnote{Unfortunately, due to the implementation via Stan, it is not easily possible for users to define their own response distributions and run them via \pkg{brms}. If you feel that a response distribution is missing in \pkg{brms}, please open an issue on GitHub (\url{https://github.com/paul-buerkner/brms}).}. The purpose of the present article is to provide an introduction of the advanced multilevel formula syntax implemented in \pkg{brms}, which allows to fit a wide and growing range of non-linear distributional multilevel models. A general overview of the package is already given in \citet{brms1}. Accordingly, the present article focuses on more recent developments. We begin by explaining the underlying structure of distributional models. Next, the formula syntax of \pkg{lme4} and its extensions implemented in \pkg{brms} are explained. Four examples that demonstrate the use of the new syntax are discussed in detail. Afterwards, the functionality of \pkg{brms} is compared with that of \pkg{rstanarm} \citep{rstanarm2017} and \pkg{MCMCglmm} \citep{hadfield2010}. We end by describing future plans for extending the package. \section{Model description} \label{model} The core of models implemented in \pkg{brms} is the prediction of the response $y$ through predicting all parameters $\theta_p$ of the response distribution $D$, which is also called the model \code{family} in many R packages. We write $$y_i \sim D(\theta_{1i}, \theta_{2i}, ...)$$ to stress the dependency on the $i\textsuperscript{th}$ observation. Every parameter $\theta_p$ may be regressed on its own predictor term $\eta_p$ transformed by the inverse link function $f_p$ that is $\theta_{pi} = f_p(\eta_{pi})$\footnote{A parameter can also be assumed constant across observations so that a linear predictor is not required.}. Such models are typically refered to as \emph{distributional models}\footnote{The models described in \citet{brms1} are a sub-class of the here described models.}. Details about the parameterization of each \code{family} are given in \code{vignette("brms\_families")}. Suppressing the index $p$ for simplicity, a predictor term $\eta$ can generally be written as $$ \eta = \mathbf{X} \beta + \mathbf{Z} u + \sum_{k = 1}^K s_k(x_k) $$ In this equation, $\beta$ and $u$ are the coefficients at population-level and group-level respectively and $\mathbf{X}, \mathbf{Z}$ are the corresponding design matrices. The terms $s_k(x_k)$ symbolize optional smooth functions of unspecified form based on covariates $x_k$ fitted via splines (see \citet{wood2011} for the underlying implementation in the \pkg{mgcv} package) or Gaussian processes \citep{williams1996}. The response $y$ as well as $\mathbf{X}$, $\mathbf{Z}$, and $x_k$ make up the data, whereas $\beta$, $u$, and the smooth functions $s_k$ are the model parameters being estimated. The coefficients $\beta$ and $u$ may be more commonly known as fixed and random effects, but I avoid theses terms following the recommendations of \citet{gelmanMLM2006}. Details about prior distributions of $\beta$ and $u$ can be found in \citet{brms1} and under \code{help("set\_prior")}. As an alternative to the strictly additive formulation described above, predictor terms may also have any form specifiable in Stan. We call it a \emph{non-linear} predictor and write $$\eta = f(c_1, c_2, ..., \phi_1, \phi_2, ...)$$ The structure of the function $f$ is given by the user, $c_r$ are known or observed covariates, and $\phi_s$ are non-linear parameters each having its own linear predictor term $\eta_{\phi_s}$ of the form specified above. In fact, we should think of non-linear parameters as placeholders for linear predictor terms rather than as parameters themselves. A frequentist implementation of such models, which inspired the non-linear syntax in \pkg{brms}, can be found in the \pkg{nlme} package \citep{nlme2016}. \section{Extended multilevel formula syntax} \label{formula_syntax} The formula syntax applied in \pkg{brms} builds upon the syntax of the R package \pkg{lme4} \citep{bates2015}. First, we will briefly explain the \pkg{lme4} syntax used to specify multilevel models and then introduce certain extensions that allow to specify much more complicated models in \pkg{brms}. An \pkg{lme4} formula has the general form \begin{Sinput} response ~ pterms + (gterms | group) \end{Sinput} The \code{pterms} part contains the population-level effects that are assumed to be the same across obervations. The \code{gterms} part contains so called group-level effects that are assumed to vary accross grouping variables specified in \code{group}. Multiple grouping factors each with multiple group-level effects are possible. Usually, \code{group} contains only a single variable name pointing to a factor, but you may also use \code{g1:g2} or \code{g1/g2}, if both \code{g1} and \code{g2} are suitable grouping factors. The \code{:} operator creates a new grouping factor that consists of the combined levels of \code{g1} and \code{g2} (you could think of this as pasting the levels of both factors together). The \code{/} operator indicates nested grouping structures and expands one grouping factor into two or more when using multiple \code{/} within one term. If, for instance, you write \code{(1 | g1/g2)}, it will be expanded to \code{(1 | g1) + (1 | g1:g2)}. Instead of \code{|} you may use \code{||} in grouping terms to prevent group-level correlations from being modeled. This may be useful in particular when modeling so many group-level effects that convergence of the fitting algorithms becomes an issue due to model complexity. One limitation of the \code{||} operator in \pkg{lme4} is that it only splits up terms so that columns of the design matrix originating from the same term are still modeled as correlated (e.g., when coding a categorical predictor; see the \code{mixed} function of the \pkg{afex} package by \citet{afex2015} for a way to avoid this behavior). While intuitive and visually appealing, the classic \pkg{lme4} syntax is not flexible enough to allow for specifying the more complex models supported by \pkg{brms}. In non-linear or distributional models, for instance, multiple parameters are predicted, each having their own population and group-level effects. Hence, multiple formulas are necessary to specify such models\footnote{Actually, it is possible to specify multiple model parts within one formula using interactions terms for instance as implemented in \pkg{MCMCglmm} \citep{hadfield2010}. However, this syntax is limited in flexibility and requires a rather deep understanding of the way R parses formulas, thus often being confusing to users.}. Then, however, specifying group-level effects of the same grouping factor to be correlated \emph{across} formulas becomes complicated. The solution implemented in \pkg{brms} (and currently unique to it) is to expand the \code{|} operator into \code{||}, where \code{} can be any value. Group-level terms with the same \code{ID} will then be modeled as correlated if they share same grouping factor(s)\footnote{It might even be further extended to \code{|fun()|}, where \code{fun} defines the type of correlation structure, defaulting to unstructured that is estimating the full correlation matrix. The \code{fun} argument is not yet supported by \pkg{brms} but could be supported in the future if other correlation structures, such as compound symmetry or Toeplitz, turn out to have reasonable practical applications and effective implementations in Stan.}. For instance, if the terms \code{(x1|ID|g1)} and \code{(x2|ID|g1)} appear somewhere in the same or different formulas passed to \pkg{brms}, they will be modeled as correlated. Further extensions of the classical \pkg{lme4} syntax refer to the \code{group} part. It is rather limited in its flexibility since only variable names combined by \code{:} or \code{/} are supported. We propose two extensions of this syntax: Firstly, \code{group} can generally be split up in its terms so that, say, \code{(1 | g1 + g2)} is expanded to \code{(1 | g1) + (1 | g2)}. This is fully consistent with the way \code{/} is handled so it provides a natural generalization to the existing syntax. Secondly, there are some special grouping structures that cannot be expressed by simply combining grouping variables. For instance, multi-membership models cannot be expressed this way. To overcome this limitation, we propose wrapping terms in \code{group} within special functions that allow specifying alternative grouping structures: \code{(gterms | fun(group))}. In \pkg{brms}, there are currently two such functions implemented, namely \code{gr} for the default behavior and \code{mm} for multi-membership terms. To be compatible with the original syntax and to keep formulas short, \code{gr} is automatically added internally if none of these functions is specified. While some non-linear relationships, such as quadratic relationships, can be expressed within the basic R formula syntax, other more complicated ones cannot. For this reason, it is possible in \pkg{brms} to fully specify non-linear predictor terms similar to how it is done in \pkg{nlme}, but fully compatible with the extended multilevel syntax described above. Suppose, for instance, we want to model the non-linear growth curve $$ y = b_1 (1 - \exp(-(x / b_2)^{b_3}) $$ between $y$ and $x$ with parameters $b_1$, $b_2$, and $b_3$ (see Example 3 in this paper for an implementation of this model with real data). Furthermore, we want all three parameters to vary by a grouping variable $g$ and model those group-level effects as correlated. Additionally $b_1$ should be predicted by a covariate $z$. We can express this in \pkg{brms} using multiple formulas, one for the non-linear model itself and one per non-linear parameter: \begin{Sinput} y ~ b1 * (1 - exp(-(x / b2) ^ b3) b1 ~ z + (1|ID|g) b2 ~ (1|ID|g) b3 ~ (1|ID|g) \end{Sinput} The first formula will not be evaluated using standard R formula parsing, but instead taken literally. In contrast, the formulas for the non-linear parameters will be evaluated in the usual way and are compatible with all terms supported by \pkg{brms}. Note that we have used the above described ID-syntax to model group-level effects as correlated across formulas. There are other syntax extensions implemented in \pkg{brms} that do not directly target grouping terms. Firstly, there are terms formally included in the \code{pterms} part that are handled separately. The most prominent examples are smooth terms specified through the \code{s} and \code{t2} functions of the \pkg{mgcv} package \citep{wood2011}. Other examples are category specific effects \code{cs}, monotonic effects \code{mo}, noise-free effects \code{me}, or Gaussian process terms \code{gp}. The former is explained in \citet{brms1}, while the latter three are documented in \code{help(brmsformula)}. Internally, these terms are extracted from \code{pterms} and not included in the construction of the population-level design matrix. Secondly, making use of the fact that \code{|} is unused on the left-hand side of $\sim$ in formula, additional information on the response variable may be specified via \begin{Sinput} response | aterms ~ \end{Sinput} The \code{aterms} part may contain multiple terms of the form \code{fun()} separated by \code{+} each providing special information on the response variable. This allows among others to weight observations, provide known standard errors for meta-analysis, or model censored or truncated data. As it is not the main topic of the present paper, we refer to \code{help("brmsformula")} and \code{help("addition-terms")} for more details. To set up the model formulas and combine them into one object, \pkg{brms} defines the \code{brmsformula} (or short \code{bf}) function. Its output can then be passed to the \code{parse\_bf} function, which splits up the formulas in separate parts and prepares them for the generation of design matrices and related data. Other packages may re-use these functions in their own routines making it easier to offer support for the above described multilevel syntax. \section{Examples} The idea of \pkg{brms} is to provide one unified framework for multilevel regression models in R. As such, the above described formula syntax in all of its variations can be applied in combination with all response distributions supported by \pkg{brms} (currently about 35 response distributions are supported; see \code{help("brmsfamily")} and \code{vignette("brms\_families")} for an overview). In this section, we will discuss four examples in detail, each focusing on certain aspects of the syntax. They are chosen to provide a broad overview of the modeling options. The first is about the number of fish caught be different groups of people. It does not actually contain any multilevel structure, but helps in understanding how to set up formulas for different model parts. The second example is about housing rents in Munich. We model the data using splines and a distributional regression approach. The third example is about cumulative insurance loss payments across several years, which is fitted using a rather complex non-linear multilevel model. Finally, the fourth example is about the performance of school children, who change school during the year, thus requiring a multi-membership model. Despite not being covered in the four examples, there are a few more modeling options that we want to briefly describe. First, \pkg{brms} allows fitting so called phylogenetic models. These models are relevant in evolutionary biology when data of many species are analyzed at the same time. Species are not independent as they come from the same phylogenetic tree, implying that different levels of the same grouping-factor (i.e., species) are likely correlated. There is a whole vignette dedicated to this topic, which can be found via \code{vignette("brms\_phylogenetics")}. Second, there is a canonical way to handle ordinal predictors, without falsely assuming they are either categorical or continuous. We call them monotonic effects and discuss them in \code{vignette("brms\_monotonic")}. Last but not least, it is possible to account for measurement error in both response and predictor variables. This is often ignored in applied regression modeling \citep{westfall2016}, although measurement error is very common in all scientific fields making use of observational data. There is no vignette yet covering this topic, but one will be added in the future. In the meantime, \code{help("brmsformula")} is the best place to start learning about such models as well as about other details of the \pkg{brms} formula syntax. \subsection{Example 1: Catching fish} An important application of the distributional regression framework of \pkg{brms} are so called zero-inflated and hurdle models. These models are helpful whenever there are more zeros in the response variable than one would naturally expect. Here, we consider an example dealing with the number of fish caught by various groups of people. On the UCLA website (\url{https://stats.idre.ucla.edu/stata/dae/zero-inflated-poisson-regression}), the data are described as follows: ``The state wildlife biologists want to model how many fish are being caught by fishermen at a state park. Visitors are asked how long they stayed, how many people were in the group, were there children in the group and how many fish were caught. Some visitors do not fish, but there is no data on whether a person fished or not. Some visitors who did fish did not catch any fish so there are excess zeros in the data because of the people that did not fish.'' \begin{Sinput} zinb <- read.csv("http://stats.idre.ucla.edu/stat/data/fish.csv") zinb$camper <- factor(zinb$camper, labels = c("no", "yes")) head(zinb) \end{Sinput} \begin{Sinput} nofish livebait camper persons child xb zg count 1 1 0 no 1 0 -0.8963146 3.0504048 0 2 0 1 yes 1 0 -0.5583450 1.7461489 0 3 0 1 no 1 0 -0.4017310 0.2799389 0 4 0 1 yes 2 1 -0.9562981 -0.6015257 0 5 0 1 no 1 0 0.4368910 0.5277091 1 6 0 1 yes 4 2 1.3944855 -0.7075348 0 \end{Sinput} As predictors we choose the number of people per group, the number of children, as well as whether or not the group consists of campers. Many groups may not catch any fish just because they do not try and so we fit a zero-inflated Poisson model. For now, we assume a constant zero-inflation probability across observations. \begin{Sinput} fit_zinb1 <- brm(count ~ persons + child + camper, data = zinb, family = zero_inflated_poisson("log")) \end{Sinput} The model is readily summarized via \begin{Sinput} summary(fit_zinb1) \end{Sinput} \begin{Sinput} Family: zero_inflated_poisson (log) Formula: count ~ persons + child + camper Data: zinb (Number of observations: 250) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept -1.01 0.17 -1.34 -0.67 2171 1 persons 0.87 0.04 0.79 0.96 2188 1 child -1.36 0.09 -1.55 -1.18 1790 1 camper 0.80 0.09 0.62 0.98 2950 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat zi 0.41 0.04 0.32 0.49 2409 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} A graphical summary is available through \begin{Sinput} conditional_effects(fit_zinb1) \end{Sinput} \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_zinb1.pdf} \caption{Marginal effects plots of the \code{fit\_zinb1} model.} \label{me_zinb1} \end{figure} (see Figure \ref{me_zinb1}). In fact, the \code{marginal\_effects} method turned out to be so powerful in visualizing effects of predictors that I am using it almost as frequently as \code{summary}. According to the parameter estimates, larger groups catch more fish, campers catch more fish than non-campers, and groups with more children catch less fish. The zero-inflation probability \code{zi} is pretty large with a mean of 41\%. Please note that the probability of catching no fish is actually higher than 41\%, but parts of this probability are already modeled by the Poisson distribution itself (hence the name zero-\emph{inflation}). If you want to treat all zeros as originating from a separate process, you can use hurdle models instead (not shown here). Now, we try to additionally predict the zero-inflation probability by the number of children. The underlying reasoning is that we expect groups with more children to not even try catching fish, since children often lack the patience required for fishing. From a purely statistical perspective, zero-inflated (and hurdle) distributions are a mixture of two processes and predicting both parts of the model is natural and often very reasonable to make full use of the data. \begin{Sinput} fit_zinb2 <- brm(bf(count ~ persons + child + camper, zi ~ child), data = zinb, family = zero_inflated_poisson()) \end{Sinput} To transform the linear predictor of \code{zi} into a probability, \pkg{brms} applies the logit-link, which takes values within $[0, 1]$ and returns values on the real line. Thus, it allows the transition between probabilities and linear predictors. \begin{Sinput} summary(fit_zinb2) \end{Sinput} \begin{Sinput} Family: zero_inflated_poisson (log) Formula: count ~ persons + child + camper zi ~ child Data: zinb (Number of observations: 250) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept -1.07 0.18 -1.43 -0.73 2322 1 persons 0.89 0.05 0.80 0.98 2481 1 child -1.17 0.10 -1.37 -1.00 2615 1 camper 0.78 0.10 0.60 0.96 3270 1 zi_Intercept -0.95 0.27 -1.52 -0.48 2341 1 zi_child 1.21 0.28 0.69 1.79 2492 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} According to the model, trying to fish with children not only decreases the overall number fish caught (as implied by the Poisson part of the model) but also drastically increases your chance of catching no fish at all (as implied by the zero-inflation part), possibly because groups with more children spend less time or no time at all fishing. Comparing model fit via leave-one-out cross validation as implemented in the \pkg{loo} package \citep{loo2016, vehtari2016}. \begin{Sinput} LOO(fit_zinb1, fit_zinb2) \end{Sinput} \begin{Sinput} LOOIC SE fit_zinb1 1639.52 363.30 fit_zinb2 1621.35 362.39 fit_zinb1 - fit_zinb2 18.16 15.71 \end{Sinput} reveals that the second model using the number of children to predict both model parts has better fit. However, when considering the standard error of the \code{LOOIC} difference, improvement in model fit is apparently modest and not substantial. More examples of distributional model can be found in \code{vignette("brms\_distreg")}. \subsection{Example 2: Housing rents} In their book about regression modeling, \citet{fahrmeir2013} use an example about the housing rents in Munich from 1999. The data contains information about roughly 3000 apartments including among others the absolute rent (\code{rent}), rent per square meter (\code{rentsqm}), size of the apartment (\code{area}), construction year (\code{yearc}), and the district in Munich (\code{district}), where the apartment is located. The data can be found in the \pkg{gamlss.data} package \citep{gamlss.data}: \begin{Sinput} data("rent99", package = "gamlss.data") head(rent99) \end{Sinput} \begin{Sinput} rent rentsqm area yearc location bath kitchen cheating district 1 109.9487 4.228797 26 1918 2 0 0 0 916 2 243.2820 8.688646 28 1918 2 0 0 1 813 3 261.6410 8.721369 30 1918 1 0 0 1 611 4 106.4103 3.547009 30 1918 2 0 0 0 2025 5 133.3846 4.446154 30 1918 2 0 0 1 561 6 339.0256 11.300851 30 1918 2 0 0 1 541 \end{Sinput} Here, we aim at predicting the rent per square meter with the size of the apartment as well as the construction year, while taking the district of Munich into account. As the effect of both predictors on the rent is of unknown non-linear form, we model these variables using a bivariate tensor spline \citep{wood2013}. The district is accounted for via a varying intercept. \begin{Sinput} fit_rent1 <- brm(rentsqm ~ t2(area, yearc) + (1|district), data = rent99, chains = 2, cores = 2) \end{Sinput} We fit the model using just two chains (instead of the default of four chains) on two processor cores to reduce the model fitting time for the purpose of the present paper. In general, using the default option of four chains (or more) is recommended. \begin{Sinput} summary(fit_rent1) \end{Sinput} \begin{Sinput} Family: gaussian(identity) Formula: rentsqm ~ t2(area, yearc) + (1 | district) Data: rent99 (Number of observations: 3082) Samples: 2 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 2000 ICs: LOO = NA; WAIC = NA; R2 = NA Smooth Terms: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sds(t2areayearc_1) 4.93 2.32 1.61 10.77 1546 1.00 sds(t2areayearc_2) 5.78 2.87 1.58 13.15 1175 1.00 sds(t2areayearc_3) 8.09 3.19 3.66 16.22 1418 1.00 Group-Level Effects: ~district (Number of levels: 336) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 0.60 0.06 0.48 0.73 494 1.01 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept 7.80 0.11 7.59 8.02 2000 1.00 t2areayearc_1 -1.00 0.09 -1.15 -0.83 2000 1.00 t2areayearc_2 0.75 0.17 0.43 1.09 2000 1.00 t2areayearc_3 -0.07 0.16 -0.40 0.24 1579 1.00 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 1.95 0.03 1.90 2.01 2000 1.00 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} For models including splines, the output of \code{summary} is not tremendously helpful, but we get at least some information. Firstly, the credible intervals of the standard deviations of the coefficients forming the splines (under \code{'Smooth Terms'}) are sufficiently far away from zero to indicate non-linearity in the (combined) effect of \code{area} and \code{yearc}. Secondly, even after controlling for these predictors, districts still vary with respect to rent per square meter by a sizable amount as visible under \code{'Group-Level Effects'} in the output. To further understand the effect of the predictor, we apply graphical methods: \begin{Sinput} conditional_effects(fit_rent1, surface = TRUE) \end{Sinput} In Figure \ref{me_rent1}, the marginal effects of both predictors are displayed, while the respective other predictor is fixed at its mean. In Figure \ref{me_rent2}, the combined effect is shown, clearly demonstrating an interaction between the variables. In particular, housing rents appear to be highest for small and relatively new apartments. \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_rent1.pdf} \caption{Marginal effects plots of the \code{fit\_rent1} model for single predictors.} \label{me_rent1} \end{figure} \begin{figure}[ht] \centering \includegraphics[width=0.7\textwidth,keepaspectratio]{me_rent2.pdf} \caption{Surface plot of the \code{fit\_rent1} model for the combined effect of \code{area} and \code{yearc}.} \label{me_rent2} \end{figure} In the above example, we only considered the mean of the response distribution to vary by \code{area} and \code{yearc}, but this my not necessarily reasonable assumption, as the variation of the response might vary with these variables as well. Accordingly, we fit splines and effects of district for both the location and the scale parameter, which is called \code{sigma} in Gaussian models. \begin{Sinput} bform <- bf(rentsqm ~ t2(area, yearc) + (1|ID1|district), sigma ~ t2(area, yearc) + (1|ID1|district)) fit_rent2 <- brm(bform, data = rent99, chains = 2, cores = 2) \end{Sinput} If not otherwise specified, \code{sigma} is predicted on the log-scale to ensure it is positive no matter how the predictor term looks like. Instead of \code{(1|district)} as in the previous model, we now use \code{(1|ID1|district)} in both formulas. This results in modeling the varying intercepts of both model parts as correlated (see the description of the ID-syntax above). The group-level part of the \code{summary} output looks as follows: \begin{Sinput} Group-Level Effects: ~district (Number of levels: 336) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 0.60 0.06 0.49 0.73 744 1.00 sd(sigma_Intercept) 0.11 0.02 0.06 0.15 751 1.00 cor(Intercept,sigma_Intercept) 0.72 0.17 0.35 0.98 648 1.00 \end{Sinput} As visible from the positive correlation of the intercepts, districts with overall higher rent per square meter have higher variation at the same time. Lastly, we want to turn our attention to the splines. While \code{marginal\_effects} is used to visualize effects of predictors on the expected response, \code{marginal\_smooths} is used to show just the spline parts of the model: \begin{Sinput} conditional_smooths(fit_rent2) \end{Sinput} The plot on the left-hand side of Figure \ref{me_rent3} resembles the one in Figure \ref{me_rent2}, but the scale is different since only the spline is plotted. The right-hand side of \ref{me_rent3} shows the spline for \code{sigma}. Since we apply the log-link on \code{sigma} by default the spline is on the log-scale as well. As visible in the plot, the variation in the rent per square meter is highest for relatively small and old apartments, while the variation is smallest for medium to large apartments build around the 1960s. \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_rent3.pdf} \caption{Plots showing the smooth terms of the \code{fit\_rent2} model.} \label{me_rent3} \end{figure} \subsection{Example 3: Insurance loss payments} On his blog, Markus Gesmann predicts the growth of cumulative insurance loss payments over time, originated from different origin years (see \url{http://www.magesblog.com/2015/11/loss-developments-via-growth-curves-and.html}). We will use a slightly simplified version of his model for demonstration purposes here. It looks as follows: $$cum_{AY, dev} \sim N(\mu_{AY, dev}, \sigma)$$ $$\mu_{AY, dev} = ult_{AY} \left(1 - \exp\left(- \left( \frac{dev}{\theta} \right)^\omega \right) \right)$$ The cumulative insurance payments $cum$ will grow over time, and we model this dependency using the variable $dev$. Further, $ult_{AY}$ is the (to be estimated) ultimate loss of accident each year. It constitutes a non-linear parameter in our framework along with the parameters $\theta$ and $\omega$, which are responsible for the growth of the cumulative loss and are for now assumed to be the same across years. We load the data \begin{Sinput} url <- paste0("https://raw.githubusercontent.com/mages/", "diesunddas/master/Data/ClarkTriangle.csv") loss <- read.csv(url) head(loss) \end{Sinput} \begin{Sinput} AY dev cum 1 1991 6 357.848 2 1991 18 1124.788 3 1991 30 1735.330 4 1991 42 2182.708 5 1991 54 2745.596 6 1991 66 3319.994 \end{Sinput} and translate the proposed model into a non-linear \pkg{brms} model. \begin{Sinput} nlform <- bf(cum ~ ult * (1 - exp(-(dev / theta)^omega)), ult ~ 1 + (1|AY), omega ~ 1, theta ~ 1, nl = TRUE) nlprior <- c(prior(normal(5000, 1000), nlpar = "ult"), prior(normal(1, 2), nlpar = "omega"), prior(normal(45, 10), nlpar = "theta")) fit_loss1 <- brm(formula = nlform, data = loss, family = gaussian(), prior = nlprior, control = list(adapt_delta = 0.9)) \end{Sinput} In the above functions calls, quite a few things are going on. The formulas are wrapped in \code{bf} to combine them into one object. The first formula specifies the non-linear model. We set argument \code{nl = TRUE} so that \pkg{brms} takes this formula literally and instead of using standard R formula parsing. We specify one additional formula per non-linear parameter (a) to clarify what variables are covariates and what are parameters and (b) to specify the predictor term for the parameters. We estimate a group-level effect of accident year (variable \code{AY}) for the ultimate loss \code{ult}. This also shows nicely how a non-linear parameter is actually a placeholder for a linear predictor, which in the case of \code{ult}, contains only a varying intercept for year. Both \code{omega} and \code{theta} are assumed to be constant across observations so we just fit a population-level intercept. Priors on population-level effects are required and, for the present model, are actually mandatory to ensure identifiability. Otherwise, we may observe that different Markov chains converge to different parameter regions as multiple posterior distribution are equally plausible. Setting prior distributions is a difficult task especially in non-linear models. It requires some experience and knowledge both about the model that is being fitted and about the data at hand. Additionally, there is more to keep in mind to optimize the sampler's performance: Firstly, using non- or weakly informative priors in non-linear models often leads to problems even if the model is generally identified. For instance, if a zero-centered and reasonably wide prior such as \code{normal(0, 10000)} it set on \code{ult}, there is little information about \code{theta} and \code{omega} for samples of \code{ult} being close to zero, which may lead to convergence problems. Secondly, Stan works best when parameters are roughly on the same order of magnitude \citep{stan2017}. In the present example, \code{ult} is of three orders larger than \code{omega}. Still, the sampler seems to work quite well, but this may not be true for other models. One solution is to rescale parameters before model fitting. For instance, for the present example, one could have downscaled \code{ult} by replacing it with \code{ult * 1000} and correspondingly the \code{normal(5000, 1000)} prior with \code{normal(5, 1)}. In the \code{control} argument we increase \code{adapt\_delta} to get rid of a few divergent transitions (cf. \citeauthor{stan2017}, \citeyear{stan2017}; \citeauthor{brms1}, \citeyear{brms1}). Again the model is summarized via \begin{Sinput} summary(fit_loss1) \end{Sinput} \begin{Sinput} Family: gaussian (identity) Formula: cum ~ ult * (1 - exp(-(dev / theta)^omega)) ult ~ 1 + (1 | AY) omega ~ 1 theta ~ 1 Data: loss (Number of observations: 55) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Group-Level Effects: ~AY (Number of levels: 10) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(ult_Intercept) 745.74 231.31 421.05 1306.04 916 1 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat ult_Intercept 5273.70 292.34 4707.11 5852.28 798 1 omega_Intercept 1.34 0.05 1.24 1.43 2167 1 theta_Intercept 46.07 2.09 42.38 50.57 1896 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 139.93 15.52 113.6 175.33 2358 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} as well as \begin{Sinput} conditional_effects(fit_loss1) \end{Sinput} \begin{figure}[ht] \centering \includegraphics[width=0.7\textwidth,keepaspectratio]{me_loss1.pdf} \caption{Marginal effects plots of the \code{fit\_loss1} model.} \label{me_loss1} \end{figure} (see Figure \ref{me_loss1}). We can also visualize the cumulative insurance loss over time separately for each year. \begin{Sinput} conditions <- data.frame(AY = unique(loss$AY)) rownames(conditions) <- unique(loss$AY) me_year <- conditional_effects(fit_loss1, conditions = conditions, re_formula = NULL, method = "predict") plot(me_year, ncol = 5, points = TRUE) \end{Sinput} \begin{figure}[ht] \centering \includegraphics[width=0.99\textwidth,keepaspectratio]{me_loss1_year.pdf} \caption{Marginal effects plots of the \code{fit\_loss1} model separately for each accident year.} \label{me_loss1_year} \end{figure} (see Figure \ref{me_loss1_year}). It is evident that there is some variation in cumulative loss across accident years, for instance due to natural disasters happening only in certain years. Further, we see that the uncertainty in the predicted cumulative loss is larger for later years with fewer available data points. In the above model, we considered \code{omega} and \code{delta} to be constant across years, which may not necessarily be true. We can easily investigate this by fitting varying intercepts for all three non-linear parameters also estimating group-level correlation using the above introduced \code{ID} syntax. \begin{Sinput} nlform2 <- bf(cum ~ ult * (1 - exp(-(dev / theta)^omega)), ult ~ 1 + (1|ID1|AY), omega ~ 1 + (1|ID1|AY), theta ~ 1 + (1|ID1|AY), nl = TRUE) fit_loss2 <- update(fit_loss1, formula = nlform2, control = list(adapt_delta = 0.90)) \end{Sinput} We could have also specified all predictor terms more conveniently within one formula as \begin{Sinput} ult + omega + theta ~ 1 + (1|ID1|AY) \end{Sinput} because the structure of the predictor terms is identical. To compare model fit, we perform leave-one-out cross-validation. \begin{Sinput} LOO(fit_loss1, fit_loss2) \end{Sinput} \begin{Sinput} LOOIC SE fit_loss1 715.44 19.24 fit_loss2 720.60 19.85 fit_loss1 - fit_loss2 -5.15 5.34 \end{Sinput} Since smaller values indicate better expected out-of-sample predictions and thus better model fit, the simpler model that only has a varying intercept over parameter \code{ult} is preferred. This may not be overly surprising, given that three varying intercepts as well as three group-level correlations are probably overkill for data containing only 55 observations. Nevertheless, it nicely demonstrates how to apply the \code{ID} syntax in practice. More examples of non-linear models can be found in \code{vignette("brms\_nonlinear")}. \subsection{Example 4: Performance of school children} Suppose that we want to predict the performance of students in the final exams at the end of the year. There are many variables to consider, but one important factor will clearly be school membership. Schools might differ in the ratio of teachers and students, the general quality of teaching, in the cognitive ability of the students they draw, or other factors we are not aware of that induce dependency among students of the same school. Thus, it is advised to apply a multilevel modeling techniques including school membership as a group-level term. Of course, we should account for class membership and other levels of the educational hierarchy as well, but for the purpose of the present example, we will focus on schools only. Usually, accounting for school membership is pretty-straight forward by simply adding a varying intercept to the formula: \code{(1 | school)}. However, a non-negligible number of students might change schools during the year. This would result in a situation where one student is a member of multiple schools and so we need a multi-membership model. Setting up such a model not only requires information on the different schools students attend during the year, but also the amount of time spend at each school. The latter can be used to weight the influence each school has on its students, since more time attending a school will likely result in greater influence. For now, let us assume that students change schools maximally once a year and spend equal time at each school. We will later see how to relax these assumptions. Real educational data are usually relatively large and complex so that we simulate our own data for the purpose of this tutorial paper. We simulate 10 schools and 1000 students, with each school having the same expected number of 100 students. We model 10\% of students as changing schools. \begin{Sinput} data_mm <- sim_multi_mem(nschools = 10, nstudents = 1000, change = 0.1) head(data_mm) \end{Sinput} \begin{Sinput} s1 s2 w1 w2 y 1 8 9 0.5 0.5 16.27422 2 10 9 0.5 0.5 18.71387 3 5 3 0.5 0.5 23.65319 4 3 5 0.5 0.5 22.35204 5 5 3 0.5 0.5 16.38019 6 10 6 0.5 0.5 17.63494 \end{Sinput} The code of function \code{sim\_multi\_mem} can be found in the online supplement of the present paper. For reasons of better illustration, students changing schools appear in the first rows of the data. Data of students being only at a single school looks as follows: \begin{Sinput} data_mm[101:106, ] \end{Sinput} \begin{Sinput} s1 s2 w1 w2 y 101 2 2 0.5 0.5 27.247851 102 9 9 0.5 0.5 24.041427 103 4 4 0.5 0.5 12.575001 104 2 2 0.5 0.5 21.203644 105 4 4 0.5 0.5 12.856166 106 4 4 0.5 0.5 9.740174 \end{Sinput} Thus, school variables are identical, but we still have to specify both in order to pass the data appropriately. Incorporating no other predictors into the model for simplicity, a multi-membership model is specified as \begin{Sinput} fit_mm <- brm(y ~ 1 + (1 | mm(s1, s2)), data = data_mm) \end{Sinput} The only new syntax element is that multiple grouping factors (\code{s1} and \code{s2}) are wrapped in \code{mm}. Everything else remains exactly the same. Note that we did not specify the relative weights of schools for each student and thus, by default, equal weights are assumed. \begin{Sinput} summary(fit_mm) \end{Sinput} \begin{Sinput} Family: gaussian (identity) Formula: y ~ 1 + (1 | mm(s1, s2)) Data: data_mm (Number of observations: 1000) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: Not computed Group-Level Effects: ~mms1s2 (Number of levels: 10) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 2.76 0.82 1.69 4.74 682 1.01 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept 19 0.93 17.06 20.8 610 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 3.58 0.08 3.43 3.75 2117 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Sinput} With regard to the assumptions made in the above example, it is unlikely that all children who change schools stay in both schools equally long. To relax this assumption, we have to specify weights. First, we amend the simulated data to contain non-equal weights for students changing schools. For all other students, weighting does of course not matter as they stay in the same school anyway. \begin{Sinput} data_mm[1:100, "w1"] <- runif(100, 0, 1) data_mm[1:100, "w2"] <- 1 - data_mm[1:100, "w1"] head(data_mm) \end{Sinput} \begin{Sinput} s1 s2 w1 w2 y 1 8 9 0.3403258 0.65967423 16.27422 2 10 9 0.1771435 0.82285652 18.71387 3 5 3 0.9059811 0.09401892 23.65319 4 3 5 0.4432007 0.55679930 22.35204 5 5 3 0.8052026 0.19479738 16.38019 6 10 6 0.5610243 0.43897567 17.63494 \end{Sinput} Incorporating these weights into the model is straight forward. \begin{Sinput} fit_mm2 <- brm(y ~ 1 + (1 | mm(s1, s2, weights = cbind(w1, w2))), data = data_mm) \end{Sinput} The summary output is similar to the previous, so we do not show it here. The second assumption that students change schools only once a year, may also easily be relaxed by providing more than two grouping factors, say, \code{mm(s1, s2, s3)}. \section{Comparison between packages} Over the years, many R packages have been developed that implement MLMs, each being more or less general in their supported models. In \cite{brms1}, I compared \pkg{brms} with \pkg{lme4} \citep{bates2015}, \pkg{MCMCglmm} \citep{hadfield2010}, \pkg{rstanarm} \citep{rstanarm2017}, and \pkg{rethinking} \citep{mcelreath2017}. Since then, quite a few new features have been added in particular to \pkg{brms} and \pkg{rstanarm}. Accordingly, in the present paper, I will update these comparisons, but focus on \pkg{brms}, \pkg{rstanarm}, and \pkg{MCMCglmm} as the possibly most important R packages implementing Bayesian MLMs. While \pkg{brms} and \pkg{rstanarm} are both based on the probabilistic programming language \pkg{Stan}, \pkg{MCMCglmm} implements its own custom MCMC algorithm. Modeling options and other important information of these packages are summarized in Table~\ref{comparison} and will be discussed in detail below. Regarding general model classes, all three packages support the most common types such as linear, count data and certain survival models. Currently, \pkg{brms} and \pkg{MCMCglmm} provide more flexibility when modeling categorical and ordinal data. Additionally, they offer support for zero-inflated and hurdle models to account for access zeros in the data (see Example 1 above). For survival / time-to-event models, \pkg{rstanarm} offers great flexibility via the \code{stan\_jm} function, which allows for complex association structures between time-to-event data and one or more models of longitudinal covariates (for details see \url{https://cran.r-project.org/web/packages/rstanarm/vignettes/jm.html}). Model classes currently specific to \pkg{brms} are robust linear models using Student's t-distribution (family \code{student}) as well as response times models via the exponentially modified Gaussian (family \code{exgaussian}) distribution or the Wiener diffusion model (family \code{wiener}). The latter allows to simultaneously model dichotomous decisions and their corresponding response times (for a detailed example see \url{http://singmann.org/wiener-model-analysis-with-brms-part-i/}). All three packages offer many additional modeling options, with \pkg{brms} currently having the greatest flexibility (see Table~\ref{comparison} for a summary). Moreover, the packages differ in the general framework, in which they are implemented: \pkg{brms} and \pkg{MCMCglmm} each come with a single model fitting function (\code{brm} and \code{MCMCglmm} respectively), through which all of their models can be specified. Further, their framework allows to seamlessly combine most modeling options with each other in the same model. In contrast, the approach of \pkg{rstanarm} is to emulate existing functions of other packages. This has the advantage of an easier transition between classical and Bayesian models, since the syntax used to specify models stays the same. However, it comes with the main disadvantage that many modeling options cannot be used in combination within the same model. Information criteria are available in all three packages. The advantages of WAIC and LOO implemented in \pkg{brms} and \pkg{rstanarm}, are their less restrictive assumptions and that their standard errors can be easily estimated to get a better sense of the uncertainty in the criteria. Comparing the prior options of the packages, \pkg{brms} offers a little more flexibility than \pkg{MCMCglmm} and \pkg{rstanarm}, as virtually any prior distribution can be applied on population-level effects as well as on the standard deviations of group-level effects. In addition, I believe that the way priors are specified in \pkg{brms} is more intuitive as it is directly evident what prior is actually applied. In \pkg{brms}, Bayes factors are available both via Savage-Dickey ratios \citep{wagenmakers2010} and bridge-sampling \citep{bridgesampling2017}, while \pkg{rstanarm} allows for the latter option. For a detailed comparison with respect to sampling efficiency, see \cite{brms1}. \begin{table}[hbtp] \centering \begin{tabular}{llll} & \parbox{2cm}{\pkg{brms}} & \parbox{2cm}{\pkg{rstanarm}} & \parbox{2cm}{\pkg{MCMCglmm}} \\ \hline \\ [-1.5ex] \parbox{6cm}{\textbf{Model classes}} & & & \\ [1ex] Linear models & yes & yes & yes \\ Robust linear models & yes & no & no \\ Count data models & yes & yes & yes \\ Survival models & yes & yes$^1$ & yes \\ Response times models & yes & no & no \\ Beta models & yes & yes & no \\ Categorical models & yes & yes$^2$ & yes \\ Multinomial models & no & no & yes \\ Ordinal models & various & cumulative$^2$ & cumulative \\ Zero-inflated and hurdle models & yes & no & yes \\ \hline \\ [-1.5ex] \parbox{5cm}{\textbf{Modeling options}} & & & \\ [1ex] Variable link functions & various & various & no \\ Multilevel structures & yes & yes & yes \\ Multi-membership & yes & no & yes \\ Multivariate responses & yes & yes$^3$ & yes \\ Non-linear predictors & yes & limited$^4$ & no \\ Distributional regression & yes & no & no \\ Finite mixtures & yes & no & no \\ Splines (additive models) & yes & yes & yes \\ Gaussian Processes & yes & no & no \\ Temporal autocorrelation & yes & yes$^{2, 5}$ & no \\ Spatial autocorrelation & yes & yes$^{2, 5}$ & no \\ Monotonic effects & yes & no & no \\ Category specific effects & yes & no & no \\ Measurement error & yes & no & no \\ Weights & yes & yes & no \\ Offset & yes & yes & using priors \\ Censored data & yes & yes$^1$ & yes \\ Truncated data & yes & no & no \\ Customized covariances & yes & no & yes \\ Missing value imputation & no & no & no \\ \hline \\ [-1.5ex] \textbf{Bayesian specifics} & & & \\ [1ex] Population-level priors & flexible & flexible & normal \\ Group-level priors & normal & normal & normal \\ Covariance priors & flexible & restricted$^6$ & restricted$^7$ \\ Bayes factors & yes & yes$^8$ & no \\ Parallelization & yes & yes & no \\ \hline \\ [-1.5ex] \textbf{Other} & & & \\ [1ex] Estimator & HMC, NUTS & HMC, NUTS & MH, Gibbs$^9$ \\ Information criterion & WAIC, LOO & WAIC, LOO & DIC \\ C++ compiler required & yes & no & no \\ \hline \end{tabular} \caption{ Comparison of the capabilities of the \pkg{brms}, \pkg{rstanarm} and \pkg{MCMCglmm} packages. Notes: (1) Advanced functionality available via \code{stan\_jm}. (2) No group-level terms and related functionality allowed. (3) Cannot be combined with other modeling options such as splines. (4) Functionality limited to linear Gaussian models and certein pre-specified non-linear functions. (5) Functionality available only on GitHub branches (\url{https://github.com/stan-dev/rstanarm}). (6) For details see \cite{hadfield2010}. (7) For details see \url{https://github.com/stan-dev/rstanarm/wiki/Prior-distributions}. (8) Available via the \pkg{bridgesampling} package \citep{bridgesampling2017}. (9) Estimator consists of a combination of both algorithms. } \label{comparison} \end{table} \section{Conclusion} The present paper is meant to introduce R users and developers to the extended \pkg{lme4} formula syntax applied in \pkg{brms}. Only a subset of modeling options were discussed in detail, which ensured the paper was not too broad. For some of the more basic models that \pkg{brms} can fit, see \citet{brms1}. Many more examples can be found in the growing number of vignettes accompanying the package (see \code{vignette(package = "brms")} for an overview). To date, \pkg{brms} is already one of the most flexible R packages when it comes to regression modeling. However, for the future, there are quite a few more features that I am planning to implement (see \url{https://github.com/paul-buerkner/brms/issues} for the current list of issues). In addition to smaller, incremental updates, I have two specific features in mind: (1) latent variables estimated via confirmatory factor analysis and (2) missing value imputation. I receive ideas and suggestions from users almost every day -- for which I am always grateful -- and so the list of features that will be implemented in the proceeding versions of \pkg{brms} will continue to grow. \section*{Acknowledgments} First of all, I would like to thank the Stan Development Team for creating the probabilistic programming language Stan, which is an incredibly powerful and flexible tool for performing full Bayesian inference. Without it, \pkg{brms} could not fit a single model. Furthermore, I want to thank Heinz Holling, Donald Williams and Ruben Arslan for valuable comments on earlier versions of the paper. I also would like to thank the many users who reported bugs or had ideas for new features, thus helping to continuously improve \pkg{brms}. \bibliography{citations_multilevel} \end{document} brms/inst/doc/brms_nonlinear.html0000644000176200001440000067504513623757152016671 0ustar liggesusers Estimating Non-Linear Models with brms

    Estimating Non-Linear Models with brms

    Paul Bürkner

    2020-02-21

    Introduction

    This vignette provides an introduction on how to fit non-linear multilevel models with brms. Non-linear models are incredibly flexible and powerful, but require much more care with respect to model specification and priors than typical generalized linear models. Ignoring group-level effects for the moment, the predictor term \(\eta_n\) of a generalized linear model for observation \(n\) can be written as follows:

    \[\eta_n = \sum_{i = 1}^K b_i x_{ni}\]

    where \(b_i\) is the regression coefficient of predictor \(i\) and \(x_{ni}\) is the data of predictor \(i\) for observation \(n\). This also compromises interaction terms and various other data transformations. However, the structure of \(\eta_n\) is always linear in the sense that the regression coefficients \(b_i\) are multiplied by some predictor values and then summed up. This implies that the hypothetical predictor term

    \[\eta_n = b_1 \exp(b_2 x_n)\]

    would not be a linear predictor anymore and we could not fit it using classical techniques of generalized linear models. We thus need a more general model class, which we will call non-linear models. Note that the term ‘non-linear’ does not say anything about the assumed distribution of the response variable. In particular it does not mean ‘not normally distributed’ as we can apply non-linear predictor terms to all kinds of response distributions (for more details on response distributions available in brms see vignette("brms_families")).

    A Simple Non-Linear Model

    We begin with a simple example using simulated data.

    As stated above, we cannot use a generalized linear model to estimate \(b\) so we go ahead an specify a non-linear model.

    When looking at the above code, the first thing that becomes obvious is that we changed the formula syntax to display the non-linear formula including predictors (i.e., x) and parameters (i.e., b1 and b2) wrapped in a call to bf. This stands in contrast to classical R formulas, where only predictors are given and parameters are implicit. The argument b1 + b2 ~ 1 serves two purposes. First, it provides information, which variables in formula are parameters, and second, it specifies the linear predictor terms for each parameter. In fact, we should think of non-linear parameters as placeholders for linear predictor terms rather than as parameters themselves (see also the following examples). In the present case, we have no further variables to predict b1 and b2 and thus we just fit intercepts that represent our estimates of \(b_1\) and \(b_2\) in the model equation above. The formula b1 + b2 ~ 1 is a short form of b1 ~ 1, b2 ~ 1 that can be used if multiple non-linear parameters share the same formula. Setting nl = TRUE tells brms that the formula should be treated as non-linear.

    In contrast to generalized linear models, priors on population-level parameters (i.e., ‘fixed effects’) are often mandatory to identify a non-linear model. Thus, brms requires the user to explicitely specify these priors. In the present example, we used a normal(1, 2) prior on (the population-level intercept of) b1, while we used a normal(0, 2) prior on (the population-level intercept of) b2. Setting priors is a non-trivial task in all kinds of models, especially in non-linear models, so you should always invest some time to think of appropriate priors. Quite often, you may be forced to change your priors after fitting a non-linear model for the first time, when you observe different MCMC chains converging to different posterior regions. This is a clear sign of an idenfication problem and one solution is to set stronger (i.e., more narrow) priors.

    To obtain summaries of the fitted model, we apply

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: y ~ b1 * exp(b2 * x) 
             b1 ~ 1
             b2 ~ 1
       Data: dat1 (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    b1_Intercept     2.12      0.12     1.90     2.35 1.00     1435     1798
    b2_Intercept     0.70      0.04     0.62     0.78 1.00     1512     1571
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     1.00      0.07     0.86     1.15 1.00     2068     1602
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    The summary method reveals that we were able to recover the true parameter values pretty nicely. According to the plot method, our MCMC chains have converged well and to the same posterior. The conditional_effects method visualizes the model-implied (non-linear) regression line.

    We might be also interested in comparing our non-linear model to a classical linear model.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: y ~ x 
       Data: dat1 (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept     2.73      0.14     2.45     3.00 1.00     3502     2673
    x             1.69      0.13     1.43     1.95 1.00     3709     2914
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     1.31      0.09     1.14     1.51 1.00     3660     3039
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    To investigate and compare model fit, we can apply graphical posterior predictive checks, which make use of the bayesplot package on the backend.

    We can also easily compare model fit using leave-one-out cross-validation.

    Output of model 'fit1':
    
    Computed from 4000 by 100 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -142.1  6.1
    p_loo         2.7  0.6
    looic       284.1 12.2
    ------
    Monte Carlo SE of elpd_loo is 0.0.
    
    All Pareto k estimates are good (k < 0.5).
    See help('pareto-k-diagnostic') for details.
    
    Output of model 'fit2':
    
    Computed from 4000 by 100 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -170.5 10.3
    p_loo         4.9  2.1
    looic       341.0 20.6
    ------
    Monte Carlo SE of elpd_loo is NA.
    
    Pareto k diagnostic values:
                             Count Pct.    Min. n_eff
    (-Inf, 0.5]   (good)     99    99.0%   1405      
     (0.5, 0.7]   (ok)        0     0.0%   <NA>      
       (0.7, 1]   (bad)       1     1.0%   178       
       (1, Inf)   (very bad)  0     0.0%   <NA>      
    See help('pareto-k-diagnostic') for details.
    
    Model comparisons:
         elpd_diff se_diff
    fit1   0.0       0.0  
    fit2 -28.4       8.9  

    Since smaller LOOIC values indicate better model fit, it is immediately evident that the non-linear model fits the data better, which is of course not too surpirsing since we simulated the data from exactly that model.

    A Real-World Non-Linear model

    On his blog, Markus Gesmann predicts the growth of cumulative insurance loss payments over time, originated from different origin years (see https://www.magesblog.com/post/2015-11-03-loss-developments-via-growth-curves-and/). We will use a slightly simplified version of his model for demonstration purposes here. It looks as follows:

    \[cum_{AY, dev} \sim N(\mu_{AY, dev}, \sigma)\] \[\mu_{AY, dev} = ult_{AY} \left(1 - \exp\left(- \left( \frac{dev}{\theta} \right)^\omega \right) \right)\]

    The cumulative insurance payments \(cum\) will grow over time, and we model this dependency using the variable \(dev\). Further, \(ult_{AY}\) is the (to be estimated) ultimate loss of accident each year. It constitutes a non-linear parameter in our framework along with the parameters \(\theta\) and \(\omega\), which are responsible for the growth of the cumulative loss and are assumed to be the same across years. We load the data

        AY dev      cum premium
    1 1991   6  357.848   10000
    2 1991  18 1124.788   10000
    3 1991  30 1735.330   10000
    4 1991  42 2182.708   10000
    5 1991  54 2745.596   10000
    6 1991  66 3319.994   10000

    and translate the proposed model into a non-linear brms model.

    We estimate a group-level effect of accident year (variable AY) for the ultimate loss ult. This also shows nicely how a non-linear parameter is actually a placeholder for a linear predictor, which in case of ult, contains only an varying intercept over year. Again, priors on population-level effects are required and, for the present model, are actually mandatory to ensure identifiability. We summarize the model using well known methods.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: cum ~ ult * (1 - exp(-(dev/theta)^omega)) 
             ult ~ 1 + (1 | AY)
             omega ~ 1
             theta ~ 1
       Data: loss (Number of observations: 55) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Group-Level Effects: 
    ~AY (Number of levels: 10) 
                      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(ult_Intercept)   740.80    221.82   428.49  1285.35 1.00     1225     1955
    
    Population-Level Effects: 
                    Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    ult_Intercept    5289.35    288.21  4742.17  5862.88 1.00     1152     1745
    omega_Intercept     1.33      0.05     1.24     1.43 1.00     2040     2201
    theta_Intercept    46.29      2.16    42.47    51.01 1.00     1861     1979
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma   140.15     15.48   113.51   173.78 1.00     2802     2159
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    Next, we show marginal effects separately for each year.

    It is evident that there is some variation in cumulative loss across accident years, for instance due to natural disasters happening only in certain years. Further, we see that the uncertainty in the predicted cumulative loss is larger for later years with fewer available data points.

    Advanced Item-Response Models

    As a third example, we want to show how to model more advanced item-response models using the non-linear model framework of brms. For simplicity, suppose we have a single forced choice item with three alternatives of which only one is correct. Our response variable is whether a person answers the item correctly (1) or not (0). Person are assumed to vary in their ability to answer the item correctly. However, every person has a 33% chance of getting the item right just by guessing. We thus simulate some data to reflect this situation.

    The most basic item-response model is equivalent to a simple logistic regression model.

    However, this model completely ignores the guessing probability and will thus likely come to biased estimates and predictions.

     Family: bernoulli 
      Links: mu = logit 
    Formula: answer ~ ability 
       Data: dat_ir (Number of observations: 300) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept     0.74      0.13     0.48     1.00 1.00     2829     2532
    ability       0.71      0.14     0.44     1.00 1.00     3188     2551
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    A more sophisticated approach incorporating the guessing probability looks as follows:

    It is very important to set the link function of the bernoulli family to identity or else we will apply two link functions. This is because our non-linear predictor term already contains the desired link function (0.33 + 0.67 * inv_logit), but the bernoulli family applies the default logit link on top of it. This will of course lead to strange and uninterpretable results. Thus, please make sure that you set the link function to identity, whenever your non-linear predictor term already contains the desired link function.

     Family: bernoulli 
      Links: mu = identity 
    Formula: answer ~ 0.33 + 0.67 * inv_logit(eta) 
             eta ~ ability
       Data: dat_ir (Number of observations: 300) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    eta_Intercept    -0.16      0.22    -0.64     0.24 1.00     1674     1819
    eta_ability       1.32      0.32     0.78     2.04 1.00     1647     1567
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    Comparing model fit via leave-one-out cross-validation

    Output of model 'fit_ir1':
    
    Computed from 4000 by 300 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -177.3  7.2
    p_loo         2.0  0.2
    looic       354.7 14.4
    ------
    Monte Carlo SE of elpd_loo is 0.0.
    
    All Pareto k estimates are good (k < 0.5).
    See help('pareto-k-diagnostic') for details.
    
    Output of model 'fit_ir2':
    
    Computed from 4000 by 300 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -175.6  7.3
    p_loo         2.1  0.3
    looic       351.1 14.6
    ------
    Monte Carlo SE of elpd_loo is 0.0.
    
    All Pareto k estimates are good (k < 0.5).
    See help('pareto-k-diagnostic') for details.
    
    Model comparisons:
            elpd_diff se_diff
    fit_ir2  0.0       0.0   
    fit_ir1 -1.8       1.7   

    shows that both model fit the data equally well, but remember that predictions of the first model might still be misleading as they may well be below the guessing probability for low ability values. Now, suppose that we don’t know the guessing probability and want to estimate it from the data. This can easily be done changing the previous model just a bit.

    Here, we model the guessing probability as a non-linear parameter making sure that it cannot exceed the interval \([0, 1]\). We did not estimate an intercept for eta, as this will lead to a bias in the estimated guessing parameter (try it out; this is an excellent example of how careful one has to be in non-linear models).

     Family: bernoulli 
      Links: mu = identity 
    Formula: answer ~ guess + (1 - guess) * inv_logit(eta) 
             eta ~ 0 + ability
             guess ~ 1
       Data: dat_ir (Number of observations: 300) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
                    Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    eta_ability         1.20      0.26     0.72     1.75 1.00     2859     2206
    guess_Intercept     0.33      0.05     0.22     0.43 1.00     2655     2295
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    The results show that we are able to recover the simulated model parameters with this non-linear model. Of course, real item-response data have multiple items so that accounting for item and person variability (e.g., using a multilevel model with varying intercepts) becomes necessary as we have multiple observations per item and person. Luckily, this can all be done within the non-linear framework of brms and I hope that this vignette serves as a good starting point.

    brms/inst/doc/brms_missings.R0000644000176200001440000000342513623754175015762 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE----------------------------------------------------- stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ## --------------------------------------------------------------------------------------- data("nhanes", package = "mice") head(nhanes) ## --------------------------------------------------------------------------------------- library(mice) imp <- mice(nhanes, m = 5, print = FALSE) ## ---- results = 'hide', message = FALSE------------------------------------------------- fit_imp1 <- brm_multiple(bmi ~ age*chl, data = imp, chains = 2) ## --------------------------------------------------------------------------------------- summary(fit_imp1) ## --------------------------------------------------------------------------------------- plot(fit_imp1, pars = "^b") ## --------------------------------------------------------------------------------------- round(fit_imp1$rhats, 2) ## --------------------------------------------------------------------------------------- conditional_effects(fit_imp1, "age:chl") ## ---- results = 'hide', message = FALSE------------------------------------------------- bform <- bf(bmi | mi() ~ age * mi(chl)) + bf(chl | mi() ~ age) + set_rescor(FALSE) fit_imp2 <- brm(bform, data = nhanes) ## --------------------------------------------------------------------------------------- summary(fit_imp2) conditional_effects(fit_imp2, "age:chl", resp = "bmi") brms/inst/doc/brms_distreg.R0000644000176200001440000000613313623753773015571 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE----------------------------------------------------- stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ## --------------------------------------------------------------------------------------- group <- rep(c("treat", "placebo"), each = 30) symptom_post <- c(rnorm(30, mean = 1, sd = 2), rnorm(30, mean = 0, sd = 1)) dat1 <- data.frame(group, symptom_post) head(dat1) ## ---- results='hide'-------------------------------------------------------------------- fit1 <- brm(bf(symptom_post ~ group, sigma ~ group), data = dat1, family = gaussian()) ## ---- results='hide'-------------------------------------------------------------------- summary(fit1) plot(fit1, N = 2, ask = FALSE) plot(conditional_effects(fit1), points = TRUE) ## --------------------------------------------------------------------------------------- hyp <- c("exp(sigma_Intercept) = 0", "exp(sigma_Intercept + sigma_grouptreat) = 0") hypothesis(fit1, hyp) ## --------------------------------------------------------------------------------------- hyp <- "exp(sigma_Intercept + sigma_grouptreat) > exp(sigma_Intercept)" (hyp <- hypothesis(fit1, hyp)) plot(hyp, chars = NULL) ## --------------------------------------------------------------------------------------- zinb <- read.csv("https://paul-buerkner.github.io/data/fish.csv") head(zinb) ## ---- results='hide'-------------------------------------------------------------------- fit_zinb1 <- brm(count ~ persons + child + camper, data = zinb, family = zero_inflated_poisson()) ## --------------------------------------------------------------------------------------- summary(fit_zinb1) plot(conditional_effects(fit_zinb1), ask = FALSE) ## ---- results='hide'-------------------------------------------------------------------- fit_zinb2 <- brm(bf(count ~ persons + child + camper, zi ~ child), data = zinb, family = zero_inflated_poisson()) ## --------------------------------------------------------------------------------------- summary(fit_zinb2) plot(conditional_effects(fit_zinb2), ask = FALSE) ## --------------------------------------------------------------------------------------- dat_smooth <- mgcv::gamSim(eg = 6, n = 200, scale = 2, verbose = FALSE) head(dat_smooth[, 1:6]) ## ---- results='hide'-------------------------------------------------------------------- fit_smooth1 <- brm( bf(y ~ s(x1) + s(x2) + (1|fac), sigma ~ s(x0) + (1|fac)), data = dat_smooth, family = gaussian(), chains = 2, control = list(adapt_delta = 0.95) ) ## --------------------------------------------------------------------------------------- summary(fit_smooth1) plot(conditional_effects(fit_smooth1), points = TRUE, ask = FALSE) brms/inst/doc/brms_multilevel.pdf0000644000176200001440000157550313623760756016676 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4341 /Filter /FlateDecode /N 95 /First 772 >> stream x\[s~?ok׃-J%_k{v?PXbLZrK~{5(y-iSuJ`__ƀRL0͔0,Ï1,hȤԞILcqIͤdȔhtL))p?0eHdY4 d*:QLKzX3LNikq3MUjƯt>(Z1 ŒŅ6̸@D 35+:x>2kH(YY2Kl ?i3<$p4T% "W`0IaPicQ*@' f# V` fbƁ($EBsӲ646F0!;CyhK/P>EhYDcޡUyP.@َP6F8)'nAD eIK&z(.9( Ӑ&KL ` E2L.({ Ј lج0~o67KwL^`2PiS [\!td&$3 iLDf**Sy|3`?Ǔ3Q'c oo ^rӫ/g5;_eTg;GKu?Ÿ^AEB.dxA+,4TE:D3T0~:lC'( W(*/2L i`(@V 5XRʉw+c&_4cjո>ه9AVe*c;dJʒ/}dJ .C]É`@ Z)ZnVBwȬ$dgI=Ẏf,N33QU)3hb.&LJ_j]H*E^i,GX˰Wh-XJ U`M'YOx!zT;K>G TEoZ̅i t(bX }Ф"|lAuMPEPkŪžt\ֳ^#/qtցiZ`Hdl&@{p{@6$U/=sskBÀ<l_}"7oFY:Et hY?Dӷ函]$1dlNF f9_/f -Q>-Lɸ9YRG^սbFual{alc)~䛃GqapuE%a; [+v0xYIj3S]`ʧoS.f.(4YQK 7ʣKFì &;do "o;UiAB D|F.oUTn h85֋0Z`u}LcxiDHJUAF3,^a,B,k (K<-Rbi,V CPC"pͮeA(Jҁr T5\|hT(u;ly9B\җ^V#Bܨoq߿R5Nh L [8nnoI`2'it2X*;vKi0'͒?-=X;l}<'zWbS [6hURX\c󶲈6 lUkdZ@ o4 l+TzThmkش ؂Cm#61VŴvjhm+HĆt@R17!5q A]6-(д4{}д^ =8haeяs&7op?^pڻF "2oee']f2妝9[Is:l=\Ջz |C"xĐ~%"b6[nc:D]E(J) ]bfCI#D5$g AJ{҉P9R7U.+uMǠr=]u:V"Yeb~&6ܬԻC*?^iuyTaEg\>33]/] a2MirIr)44&4M&f6-'21L̗-83W/sR9b9?y˳^eGϾ ٥/~z0 Û᥽$swII-mHX5![[G4'2X(moǴAgԐmd-J$t0wHx}ֆK\/\ZG??}s(^t+pWDrOO/>ݷvCc{7vX>be2U. o!#})WpjWt+nnsA~O/esԆ}lcu)sKfm4r9 OUdz!Tz"L2\,/[_*Mu%}1\*gT_^mNLZcNf Kߞ_:)Ja$,4ʠCK[<hCGKHc{Ev$ XmI4 M¢c5ZWrO(:VGߛ MQʸ"s Ď>C+L'Թ:J#3. JXԠL (^!>s.s/ Ihud8K}DQ@P?Hmߢ,?/mB];z!ZϊflkF7k=$bf=Ui$g;Q&?@w73,(wMeb2w9]Ѧ8D~::{\OOpSnD[;||?'I=O)9?gb2_䟑SEݥcttd&WySSJI]p2}+8oiyI3N͎љ7k:GzI SX*8`j,y[X͢,M.l;p`t{|j̟S̟&_[7^fcp1:P7}4,h>P`=I%(l Ƙã͎j?Sv >H=E} ŏ``G=Mp5f:,~&O=V7"ǎǝ;xuD~w;?=&aνӃ5{&8 9y`@>_-Fggx?MQendstream endobj 97 0 obj << /Filter /FlateDecode /Length 3597 >> stream xڝZݓ۶BLĀ$Niu'4E|z%sx|"؏v4Y1jq8_i\Hؔv|ZYT/hn6UV5,uKM@oO#Ovc&Ѧ?'A~|lֆLUL7J4vYI\%%٨KXep"*w@ַgKiXJbe8it5 eH0^㜋Ębe\d_ꀆHco~ tÿdZ3tb|,6 ΪrDTZ-ӛ,`[U\iK*vUMgVd{]#r9׷?P\ Ң T^)}^z/Ħ~3 Ay4H!l> ѳ.$+Zԇ2ző`Ss(_*h1 LMfQ#; bChsF f"* _VsҺ$mY'+rIWTD*= t<wPV`V@yb^8tcq_8) mOܭ['<(ABXYfqW؏#AZ̙:qk'*֎C4FH7ɫmbbfE_tuBd#*>-Ar\@"r95~$7gYB'w;2Xp'F@/m3:"_rm6!\ 64,-#Pvs27b1y? qS@;/sΙ 2 +B5\jG0m+T;m+Q .E&BmN$A\l_V9X" ê^lmS9َh$‐|8B9j&ORyEy8}&w*'VB'sr)*ؙdjO>"HI{TYy80< v5lKn)dg}B&iM N5~m1$f<#g(NӍM~'Facl% ZfiY#ԷU# Ґ2lGKpOx^O${M8iP[O=a}ZAQtVcy@=;0lHCRXQF%#"JFHJ4cSBؘB)M4an@шaid3p(ލedw9 ٛ>C'KMCT7;'2̇oYa0/va,>$ʻ9fE*q"hEV$e$儚4˩QHL\* \/*Yo '87 x=m[SXa+@{F -kIph?fR\ d$P7ZsDo{(g6I)Bҕ̕9ٴn5M>W݁.6p|6/rIF`gY\$C$Cڕ9DěZkWIӌƮ [14m?㟁CAiKa84q3Ӥ}<̌مT^k1HˠI?~BPQ&%DqǗu%ƒ?}/g:9}xHO\9?V~V"XWJ>EUH_d[ռ$ RY)$(@g-=emv/RF֐02p+_NBxU* d#Q=kx=Gϗ4(yy:֌1NS+j:IJ[7R$C@k,|&b[b}z>Iۙbxu& 9 ,./6IeZ'̓O'V] y"6\G;摴QJXlDL5GٌuK4AC$~z7;/ˌrJcRh '** FzO!$DJP*yv0mƸ}R[PRy[CSq A=f"~w $02SCt] m(Z'BKSٽat^ iމ[|U)sGFcx5+3zI`g^.;镃=O\MvVnh7R0Hk5R.̈́qRn>lxᨶ&u7,qЙEt%4+q{]K]k-!Ǫ | |\a_w-'g>H}˨(OWu׋ $r=IL{>ΈE+(]xcȓr4MN0㨋@>qq眏xƁhx!aɓB&OP!`NzӅ24Bk>QKY@7dS|ITj9D0/$fގԒ wKwsJ1)>h Xj`+ytX63ܖE\>Ϝck+ACנ ;>jףFh>%qaʋxM8t6y wÝ`{-E…N w|J^q46%?iqN>p*:%57hB/Z sUh,_ HKT6Ȋ㡒Z?"Z^qtW-q{-ܳchK>@/ ,(zODe೗p^jake^:zaXgLG1g'c/^B;4Lgޟ[EjQL1*Ru)lmHa.< )9#M=-V<6b,(/pSGIO.p9 #~xchgGHA6ySp0wnsjB7}AT_T|=]>—羞JO 0VsVw-XWJ.L-* Utj)|M܄_z=Qf=#&7k0aitnmҙ:2Of_;?yvVF Z?ذ0.JME>ѓ޺}|$'et+Bj9"1xyuQV+6gy|7Xjendstream endobj 98 0 obj << /Type /ObjStm /Length 3125 /Filter /FlateDecode /N 95 /First 837 >> stream xZ[s۸~c2;;f;ux'w۴;y%b#u}R%3kYR&E887 XD2MR㩘Od4LLsL)L9 L :dyM & P:HPY\ '1 -C &Z2)IRZ1&:" t#]IG])M@ xe$O#m (% iAӚ80iѡ9O,C&%z`flQa3FD c8 ǬդO5(UE28Ŝ$zf.ZYA-9@ݧ0+t{Kځ{G )aT lN Aw$XZ< J*j dƓ9#Y>"tOϒW&XLY%d4_L#{z 'fj$7LyY< )]xnCN1C @MH'0 !RjbJ)Vȑhsd>{]1toJ4%_.V(mӋIׯh&>*gIdq[R[V^>AxD92 SVm+jQNmO2U0# I tr~C(jBPdϦ@M' $iEY Q?h?x滸纭<,A !$mlwT.!1ݶl$h\HQVC y6SH[tex=8|Dzo':<G~m6fyQuHF1C׀{]=2E?~ݥLS[tz=A>lM&tf]Oy{#ouxo+"V~*n>!sB{iy6E{4>T/Or)WY=[u>_vܣ.opc19yO 68TwRuw:_Or0endstream endobj 194 0 obj << /Type /ObjStm /Length 4520 /Filter /FlateDecode /N 95 /First 868 >> stream x\[s8~?:V98$7c6wd#Jucr&a* Ry\}5F},R*PG"FׅF"TBmAdЎWPSx$Ѵ  KܘH%hiTx.m",]Es רBk.vԆN)hTaE;JFQee c@R0Z^@=JU'$- khZ:C#(- mЗ'鴦GpƅA:ʈy":TF^L.v:Re[xkЗqd_@ 4bE q*+!Ke!?CB WE\QBzd<(!FQӐDP ]$ʘ"ZE \51p !R$w+QQI-^gV^!'==Kyc PWji)Оч1 0_UBo, G:A`B:OLC]m?{Q=x<՛''>q;馇;T9jI{5O:Q.GO?zTKz޷Ec7zԽ{i{cAAQഝ6%zGuAx2h&ſ >!t󤨞tR0t!4|%,U_:`4O)aF3hQB !pS!”--CA~?€ 2+:{;ʖrW۷q#hX؀v+ğSՔj'*dX9 VT)a o'%Mzaڒf.2b2]wϧe'N ULiɘkK} ^. &k !;T`+ _c4T+|/<8#m,, 3Mp֐]n+=/CXESYߏ2]) - W%4N7zt>)6u)Aj+6.is<\ mo !%,:K޵b+*{7I6$L2AhxF#쭠.m;@`l=Ф5n(0NTO}B4zno+URvrCT(!A äv=.HU;kCHP0kQ,R@直$nhX:a+h$8Wy] $g^NƧobJ#mL9i]fZ~IK|kzOi2/evdnG|ܮyHHP3fΝf֏_2Hl%^Hie=02&M8\>o6}^=>~kPνѹ7}~ß]o -zny16Gٽsdw_NW6xΝ흿{9w{ؕ7\I(‘Ô"ob@@7٢7iw㋋>&̔\! n1WU5_0Z :U`j]Re) wj2`YFQlF&b{ZXRE\QjZ5gNs)9eÂxGʖb Zh.ig+<+cqƕa˶fi`_w>׭,dUcཪ[_J77'?i{?_h~`7_@ Z(34,~I%MrϺRظ*={c)iK y$O}`D NIv$g&ùkҳ w h6)6: #10:c+kOCK}hW!f2Y6\ )^8=a맋 vvHs1A8UtI._B4DjT3"#\J6v~Kstut>.n$tө9`V orZ),tuTNᅭ3.sjчfP~H<|Izق@D}="O~`B\d" pP,5mI2q</IxDVWUї֑3Q'8*#"ʲ=s8}pAOZjSK_ȡm*YԵܾ~$iXST/k.:mZP`'VhKX-ѐõ}Q2 ":KOwa;dY}nBOgsB'gl"S7CFfPhl‘ǼC`468k ehptj^Iŧ1ѷ&ur=FͨHP3$#˚O\mZ"N=-i D>QSL^6!2iS4CSqYI厴P y%2J$#dO Yoi[ 7R^eЬg|.2i1k ݼ$s/kY;0l RKimjc؂$m9@g@2pRrT>oU /rZP)-N6TdjYSJ d+B:q/ f4f˱+_JpdjȜ|QZQyh]!î6Dl%ҵNa{z0:Gmܾ6"鯛N;T2..Vveacz V^gF5hIӵ:c֭q⏫ ~/9I;$V8}\ͪ՗y~븅nkn祈%}Fd3ˆS{~&To%/jX .5V3] y6nՃ[m&ȏ2i͸HY ij|ٜK\\]suw_HvCVYӄ [ֹvϥ`O=i8R1 f0`gd)&1dKzy7 2VJ9f)Ǽz:;o{c>ǰl1Tow{mO2p ;_IQIiRL\l,wx8D}h?n~C2= |Ndcs2-TBB9uoo|M-gť.l4h&x-|ߍIOSNbn r'WHp7[ $ G? -##(rqvmlj}lk_\r ?'k0O h븽%` ٛк I5VoSPj6 odӕ] u9A~to28L0fk{ 3 [#[ovJg_+|1ol|Y-endstream endobj 290 0 obj << /Filter /FlateDecode /Length 4780 >> stream xڭ[KsHW6TD mwC &@_|V@HbL(D/EEGU\%E,4[n.o< %,!͛M&˖ |lnVi.c}cS.a3O| b8pt7+=);^;ZwNWDC6=H{UZpnxhe|]X{K/-tkeuyĊ99G7߫2b@dl K<.*gmn%+yv+a8[^0>u ?b͢MyQYZUR.хY .Dߖ{fwe$|J\J?xx+zb%@9Y`iۉ: w)ُcNn.'^$|>"GL_ GIh*qQ1{wԴXV bf#^;XSm!n㊣Oٕ=Z/;CV|)ߔ=5*1r)ȗ{F@JvJꄞ u&XPR' nLTieim`FZ4V{.'6+A妀`zQgۭ`m!3?7%5]phJg|:Uqp)>9" ge7b5 5j2Qf=GکcnX$/:ܜ~V]'lzUa߀Z TQmūzgt92EkRԚMv$tPYwJҟ-òlpDch6/n2ы$ $8bl_.&㛗D oJ#K ,Uwl#vW*]QZx_q۠z BKIܫjF+鎶J`ڍKip&c܃Av=Rux;;;wA( 4&0B>{6̦i[iwz:A ,()6 YYvZmQNZrF O75]ҋc@SG 'RD'wtRO8t :E;m~)/"*r/03`FD%UDD<Q`SMo}b7 *N/chh_ܠ%T8c-2Fq_ڈOP'[QרhGO,zfBռxA[&~Dehvxc)4w_ 0kǓm]LsGx*a./^T Ūܻ]p+s g o譮9AїEy8":iHEDecK&+@j5&Px5<Hy+H͵ro 2J2ptK!|[\`42yXő-y _LB],ųuGx01G43.D)W\V?Ğۉa`BmHblCw4zqQ5Q$>8c\\2ȶFo=sA/rzR=ȄLH\K-2g~Z()$aEpBXf˜ OlUع c: "t85E̵bH"l)aoWT;!x8[r*\fXΛb0<̘PW^HSx!yɡ_dv{7iloNq%~|D:"j>mP n64OLJn= Rq:DgbMȥ,BV@ Lv!0.q܊ynyvϢ"R?.ˇ`iٔEє;zm=QH\f7965~he."Yct%;"k&A(Ii}}G VJWd\+2O1r"2.jXq8DɴGYIL#i.c8I gYEܣU96%֧G"c (A08.&r"#B%1_,_Q#T"m7ĥ-]c! "y.(6S-zrXwbD5}g8~A21נTH\^MY'![4zmol%.sh&̭G3l+~fyW XSܧ`ŒLd}h.պYko F|fS8=aG4Pz$"D`,R9/T\GGI^NTLt؏$QJ6%4pd1*qp&~j|?9wҺeYɂĨ 3(< __ `ҝĕ"H vaf]WlWe)eTO(|Z+康Gw"6`tSBo4V6bQ‚'5A R#)Bih8#7 <޾ǫ\?K$Jln_xr`n8rHER>˫a>J#k2@t64rvQFU[pI"pQY^k%2SտbiE9Eupnܼvn#g瓔ĻW;DTh۳j E^va#T|cA#Ya#X5:GY'/頡- :N̼mRfïY2sm 9[~mg+lS2b~qZԺY7ip+QEr'3PSˊ9% [q^T^[M 376. u^kvs(=mRA TRh@$dށVm]!_ Sd]w#8]2:Vu> stream xڍP%XNݚ-Hp w  咙93s{UUk킚\YI,egdf+Y̬lg(/1*& bg/qGLN @.> 7++?v| W@ gg vBpXX:?'-f jvLl &Ζ` (@;{W|,,nnn&6NvBt7%@vt~7 P43*5@\ x@! ӳ&+Pi,#௳w & `JRΌ[߆&P'gWMR*j wvbv@;)Kښ؀mP'q݃ϛs !f濛0sgѰ8e%2y#;8YYYd^sޞv&sTO'W0o*0` -?џ`?!=Xe<^fvP_w:To; >~0&j?5oZ:R{Z0?C z?\&wېoAR.P?j/uq~^5_S-K+f5_Z@>Dl qY9+5~b Vs~TL@V=/pz?T ; 0qt4@}gx7 Xm휟]yQ'7E~&7>L!? `M`1,!oMv.?rX,Fg|~xAυZ + K_7_\?y`|._/|.d{ו\ߴ?V<`;:;e l%qcJculuDJx)׉Kك^c RHSJ׽QF3{ݤ(E64a3\x0qݾKWwOml~zv_<W0Aeeљkr'\ ~${ [Ru6v"*"]BR QODWӞ˂azN$LX$+߆K՞Juj~*hhɪ= ) Шo }`:2U8QκI}]DUѤӀ z$1!e7kI#Spۇ{DԆgF\ќKyo+5#>!:ʰhs\ :뤐39*.O)٭$(@cj8ܩk׽wJy)\x6|v^¾Oh묽 m>lq1ֿQuu"ۖޛ"L28aJRo傉iK'lGy};5J :R4 ,33_ ЁeZ.a ƥQKT32`̇X´ZZ cp.abz-7?{3\,0U+ B%_AS_Y{;U$"W_l=^ ڱ6Iwp]zND>[yJǎņ-& uJ1=ڿ)J 8U`da. >yٖo9[⚼m(^^RfNi)t("w(9K³Ej}oatbn.C&{xQ?KV NUg2zbj zs &du7vi 4I>ԟ_PkyD:̠/&h;ÔI(3R` RymSZ^O3,eȼ,бZmM!iiz>*miM6;ՅȽ(“/DK݆k{(w}Z_kմXAzXjVq?^G\A; U7n2F:p\VcVK0CS[}(bTsk"Zܨ.Fʀ!qrZ.!ULzG/32}FHLM)Փ5Ig2;OgphK!م
    Q5 hT\c CdqRJpͶ.v˃B q%洦(3ZzáL6ō|HvJۜR + Z{m  GBޑұ\PY?ӷ~ qj(){eX "vDjGg t=: #Hrbe^=̨|>Nb&UMi5 h(EN6NOi[j'ﴺU'3Zk>=mN PϽq7[2S^qiJK6 ]Y(.| ɀq0K[b9M|0g|Fo?o:Sa\}oQ@-?xN:},G!&ƝpkH"ByԴ.|#В[w[oO|EҹADOwĻ!Sao\EHb1ʷi4fb`_+G>2s%4!lPKsQ0$Uw򽣐g#sgI?II; ڽߏ:4cKD "} -P-6#G`𨬽Y%!z]1+L3/rcjwEz97|âY;4`#.Jw ;S2\ %:o\ol.7>nOPBLP2YJ]26yos+;ֻp{sW~+2u=zL'-ц:o?ov +lъo9,f5Vu̠@}>F_GhB Fg\NIAy^NvKH6 = Gl)$=^-:iOgN2mZV$ބ-V!1H[ا~#șF*ejߦet【V 5/Ok {|-I;T;[e'}AT[I0BFHEERg/nrpA1hZj/$ʙ)]XHl7Du?J6Vk~o׶PV+:5%Z3%1  4y(!~]- >D;qcne6k1aki9d47q7ãP7d5iTXp* :R,S"t NAHǪBqNX1))D|f߬^驡C.KrS7tEwnw)%AnrGT-hpCM@_<,~gb!p~!]Nŭ tKtFeݔuA~bc4y!eECCU;z45P4}f8yΑĂNDIƋ_uy'ӭsB ٠('F4"hy$+f^$q笃ɤDa1R+cvhв{P1WƝj K ¡,axrZG yQL%Sr-'K:}0vȍ9 u-D EJ7wcR!OSLg6ֽ|p)~jj n &Ma/aEZUH jgx|t`ˊ 7V^dW*(ٷ8CWz`X)ʇ}Qrx4[2p"*t[QήثBݙ-4 qL­D(1BfFXʮ iKN  E,ъ:¶BdPZI?kH"B7!↳%qOL8,%a6qrY<^QWxWp CUB xBV͞I rq7 Jt6 Ɖ֊ lsohvn+G뵐@d0ǰ=wfZtp)PMBO 6~Zh_מ_bg1ȩsLj`'Bh8B ٙ;ԟ<˜,S9 ]aLpq˹dMPyyQ%*]OJ.=ˣ9+aܷSXZe6M4@.k8_ bԧԒ0npo_%񻮬0IX[=*X6/F؂IxV^!4ˋ qz9o< CH#wެv'=0*xamP.a0d];Pʢ%vߙ[RXEѥ[c XcbEF&Lhe^zٙ4~7* )C$3L 1- Uvįa ,Z|1 <}Wjm&`p6xE"Ǽ90W6!; rNӳ0O΋EqFMBe7 5i9rBL=}W@n&U,K`HMbR'Lcˁbri"29`iUEp 4L9CE>\m{`&^6ff-*<󑷩g\؋E}r\WG٠#c\FQ؂?V 浽CGwkbo dBK"kpvV4Qh^فc bڽ \e`$YhT n,92"9G Xx.;0]. D/!G;4*ۏf8}k k^bMab7'Ʈ [geRwӗP7 ^?RdһdEnؓ$zQ5Fow' m%9 3|11?H6k[+-xbg{Wڇk*k.=uc٢Ӌq(Vt1 lx'o:QacuO(vl0x}}ڦ}{!U'Ϥ Sy{!aP3ZsYSr"@GdWϴXp=P̙ xw֛:.=)RY*g4i MUY̾ EǓZ}s("%j^;n~2Fg),G xc|h\4`w?UOQS_1: s3j9崯/ }ѺpGpfQlՏYGd̰=>sٳ@\Z%g58=]h:¢-;ۧl׏gS?Cp{~O<7 ݇m)hޏ(=XO(EwEݚ܉; Ћ^z4UNfN*S5 _RB2t~ߺFV95߷ɝh8Jzi#XOջɋ%]z=0];-2XC8pOx(J{TblId6LE>UvE59~şSpj؅H3?rZfq]:G=ڈ y,{ZKu#kgԨu'fo,aW/J"05T\*Q:˺}-ΧQ>Nufw(3o.h6l_|!>̡_B ?C;ɢbp{/r>Q_+t#J<"yD~!^炭t8$΋2=:qYřF B# ھ(L6FǬHŲvq#R'ѓ,h+` ( Bɼw7TLR<RL{Gbg}qҿ*}rSEl"D>go'ou j,51' PnGm# U8Qy"+z,vy ]üOM?i-\AEӓ*vrg? tm1' +AU6-!?]OGM0" Xy8rT>LS$ƅA9B*rb{0 YB2_<`J/TFRv ({{('JS)aHMs4|Ȋ)R\nwn,;s*t"P'PvH΀KI! pIC"i( Xp7,y$E6E 'tKM, ^t:p_Mnsr)OkZ@rse1Hu@^_c18fz{BPIH5Ȱ9{V<|VBbΕ`[Q&AI/ӚNMiIXTJJVHH-~y8fa h"[<{{,i WQebG?y^mPfve #0օE %_ptQ;w2X8nTa\a,ꋞp%og+ ǯĺ0pjI))}6+QNuIB?!hQkї4Ç8/_QocTc#YN3|Kl9)H#NIcc$bɳS:h={, y1$'Kpjr"C=0FN&0 ֒^vi6-M-]Y7˴bΕyuNXABUg7N0Wbk6?u\wëu pΕMa=;L>vU~ cJ\4cI-tl@bՔ\KԺv 7zį+lK9w‚~P!R?R<"umY1jD+4,ڳw)N96j#$?Bzx]me~r 2kego[dOm"lAhSXw&T䬿R^U6YR@%SepMN_:yH4.֣اQ{*r G2cB ڬcŦ/M= ,&NZT}Gr Y~^R. [_},N&'tW7k˙?XAH]~(oW& [PaUn`,U8[^(SoI,/&һ6?2US@CiUlҐpctYu3ps=d3wsuҫY"|☰=aNcǡ~$SwT9,d2fձ-{&}NEdCun@>_jDW2q`4gY/Z-.oz eAi 3]E"?Cآw8va"|FꓳSm>|=}c8}t44铔6rǩk)܊jAq_4iJ Qv;lʜ3¾8P8F]u F9*@Kzj'G>}Q~:B F qQٛGO5UҩL%] MS?|D;YTaqU`7NT6XvtoRzDڅ`rmf19^5ُLw##mKU@V.uģ&:٦PA,7kGQ%q6sL! 2f.4v7%+ ~xk],{e06H)W!1NCQ2I͘F TL\Dx}o:3x.ծ9ݘT!>L-J,$ECKh&;1?֒$"mIW+Y3IVA!ƣ>$ F*AS+blϾ頁ZSvBDܿQŲ6habٞ@>E|1&D' zC? vpiSOG?o'hvbM–6~Agak[MߝG|n,Kp}Bp%׶>+J2Tw^ c/=OX/_ނ V|4ZU;Y{T*Ź6߶ gH̉Y QLg$4zAM2 ڞR f_EG*7YEQ׌9-֑@gRrؿ-Mo ۔H]x%{^ ?n&F涵u#2}CUf2@XxP^룱+5}B7.1O)5^E;Z)YNtrN:on>5-HD˾̳(( XMbq1G~rY5Lׇ6nR{8fKL3^dͶ'u׶n= Ű@{駗R*+ l E\BfbuIPYgsfPOꗈ+%t$6*T.8S&ke.I )eLڗv(2]un)h>"k@֬T|ퟯe{7m@(/zl'@hoE @JEO'u6FE<ݵ@_*X% Z,d鏔=_h{ˤ$+FmˣG(`T}?r_EM-|0uNz3!>cnd[WZK I舅0114Uo8diJ7,mS?ӚIwl-rR]qyƠ`c^sDaUYr يogRQ"y~fl9Ï-tz&j:pkzlTe|h3endstream endobj 292 0 obj << /Filter /FlateDecode /Length1 1434 /Length2 6651 /Length3 0 /Length 7615 >> stream xڍTuX]DP[Z:sbf$$EZAK$n[}y~sk9kF-]nkTwr겆j pXXDpXHW.9$vBp# ŀ@(ȃ=`u uaC8{#avn;C8 QQa'(`7;#@AݼU]Yӓʃ@JqpA ',]g' ADhjO&)ki n CxS ri;b*wOAssaw[=#nUo";U ܢ<Ba0/ bq# B~=5n_[An[vAom/ H$o-A t+Nko>xy퀾͊x~~[u xa x]D7[n@^P8"l_\V.Cɽ:'=*u@9C܈ ѵmw75@gbUwm H^l65[ím)ju9kVfH~,f~2RRA '\tuITw`i( |xN5S◡K:U;}l^ǝ}]SEUz Cu45)6?"%^"ܷEQ9_rQ!&iGū^mWjܾ,֮Vp;ݾ~ҦHZ%c:vr.^R*:]P /?.lO|I%C vAg5PB[3}쀽r(+`4LJNkt#xѕаiA+)}H$<7[pȒI ;b>yɔlt-lup,XQVVn5cF|SScM o0&2aw_,ܩLB eL٤Da6"Y걇 -Dg PQ zW$H٢?"U zL4}X*1ҊSҕpa> ObOMv˳I7ۨ$lDWdj$EfAEU* ɖV6eD_CBC|({&9ah'J1WIt?d?3-)܃43x'Zko '}"a-)AgFJv1g^DUdZ7sNBNPFֶqiwmVcQPMPTIB>m6= HNjÞJ.JÐg -805pmBZpզD:;FwcCש|MԷNu}LGG6Ԇ4[%Z6ȯEۥ "ZDzh􀊻D"8 ?`yi1q(p&#g,#$_РO .@%H<(,WWZY< tZ!Q}upLsg,]Bw<-[r@3-^;]ls_ [n3A I5Lhp8fmCI,wsk~ERݔ1/0&t}IM{$hҵkAYZׇ4oۊXZ`ZwrdH$! R?.sK3Od>^B <Pfqb%+#>aD[S%OBUQ ,o*"9FXBLfz&Ӝ$X6< W-;AcgXnZowKgVׄ8ᡴX YӞCM~Px""˴2|+1ouW%23wtrIg.L ͚ 1󜏺*ZN1H?2 A*3,b0Bx%+%cJ m'rOEW4Xǂz%7w ҔiKÖ)^؈uU~Cf #L'=6LFH繫?"^QqAkSuDG)iŗ#sԁKiէD+gق-?7/wYӝr? \QOu>]x.&$61G 1S3k;^/5^ģ̺C{7IvABӼajs1̊KoC})xFze\DqT=/zU^ۯo7"$[g>,`u$s6$urMDc"? ]& c;,R?`WWl\lż@t%4xp1텦`Reˑ s"|i8GT˂/$DVtYWu-ĪC|DφVަvu-!hysaǛOz>z /^U=vgE -kt}yI #{ۻb+DL_=@c$/k YYL%,^H\je#w^msG,8C]adTu=E٘>;RqJ v_Φʟg5SeF]9IZW6S},.fx/>Y/0Y*g 9v ,ϗʆf5{~9h-hr fKJKb{Opɗ .lߪϗЂȟQ4d2D7XeQ=J~\KALXTStko$Y]nq:<-1Cbu oSnoG>=l-;@Nji; \gwlykKW iL',Dv*OP9zB4))7U[x_QN\b׮Q ~@)ū_OEsLwoR?-vszU-u=/D{Hg1dV.<\cHь!BIV<.'-CPɅRắf:IЬ8?'Q^6KFD=܎7>2 #?9jvgV# jHaW?9 "-\9n 6KNHpDvibv{ Zd9汿rZ4y771|to94W:v2eR/^U1"f2Sㆋ#gFuJf,IQ^܂XSұM;f~t豚gz^$㉣n83Xu'r}ಭHx#C7n|H MW)"xh#s{}7|`O"/p}+[V&ig h[EݨREu[r@SN<Ēe4ּwk;w;W>t%463?tN)  nؔOHS*pXQՇIXO^rMvs$K%sGLh1W1D 45\l\/$3qK57NOӅ+g۹.:ݽtS%ȚU9 hTj> ť6Dq覷NkR%o{=c@|~ez|Cv7:1 ۪Ӣ`LTڻT{}jFd;oڴŤ[OEfyWe~ͨ$yqEMzfl%&I!_wu M!sGסbWVb'@zvS*2(`rѾK WSoj.UU%]Vƹb`[u ]DS.Qr|bCFx#;릻#>VLGpӞl`T"݌+ƕlqKګ󌲲UsʰDSQ+k7ALىZ5`ARa:*q̟Pd6M.9ߗI,i,Y zs<:yƁ X _x>5ee8HWMpm:|;L> OXn}a$ZziJ2qO{߽M(}.­{{c=3UQ=H%#ž}#r4chl7Ӆe*xgJ 5#.KӁj_|w=MDeg⯷ϱh f:"4]͸h ]'0KX g.endstream endobj 293 0 obj << /Filter /FlateDecode /Length1 2718 /Length2 23640 /Length3 0 /Length 25165 >> stream xڌP\ -wh]\ 4H=:3s'{EںP*1ٛ%\YXxb ,v&6JJu+?bJMbN@cLd`ouXxYXXxމ nfeP`(<,,]@i#Ɣ/w-`b e45ٛZ]<Łݝ֙Bnb P:܀f_mWƄ@ Pr[fon6V@;g JP(96ۀOoLW +MMm<,V6@< 엡=dsc T?9:Y9839[*WP%mmv.[9MAmd{vvs+;3_E:0kY9e1~,.N<#aj+/%/1_o{99 pqrz/B`eYLVv@1hNV]X~I^fv6/6x3r8Y-(_;s{lAmn,?A o,E{4\yr_QoK IKQZxcZZW(؃j>ZʸA6Z9KZy͔\L-ޖll`@ej zt8V/t9M)agjo8NNƞ!'tf@dgr;!('Yo`~#no`e0KFf߈ ,e~#o"F . o/qQ@\T~#E7qQ@\4~#E7eF K;x~=IM~#_'cSk md[WJo/3mH88~Ilmf̿󳲁HYΠgo#︠ Ζ●+u79~A?bo fK;8/s{W? ,qFj` $#? @PgYȜ W;n ?jP1ՠ`W U\ɬ?f7 hfb+3?Y ;-'hk=etc8 ΠAe:o*]],-.8bAu o? (.@N 41ޡ{7" h4oo:Rqw\`rW+{ɩ mEZІO/CoV%hnI4~hNPiyy2SmAX!RGOȨ.h !Kʍ νWʣxe4l~WeKx1F#Z/`2$} ƅu z+l=q {ws^klΝxx:D7STޢ8 ޅyMy$ IoR+TzFYwB 1v0 Ȕ*Z 0\حDk?5'.L׼f-4vy?: 3ކ%5 5 owj ZIXF%AAtje00,}~6}gea%<[Vw}m]?5Kդ#<ϒ](-&;U+"{=ZX7\| IȓD>~sb"CFgw|(R/=OөfF'ҝ(ƱA^f[?KJD 5E>n ɎhW tVJȿݞ7!?Qu#mERxrg([R;೤(׃W qVݦtGf#e $aP (7r`= cۤ#S6ez>H8*҅퀯W4ё/摍"˄UQ(Qr6vLci@nuں|=|B-tFrguNmp qp#ɽ'/R*v%_#v*(?g.L!ȳTf|E%6}gz?G9Xx.M[FeRE zZLvL֥-'*@ɞss WQE( dc/)|*^UǓӉYY|R^[mjև,׳B6*+S&F4͂~:Gt%2q' Ǖ$zUC +vKYԌOO\?SbJ dz=%7RT[og5OX{Q,D% ,n\zNC_n!?Ok1 v1H yJe!yРDQ)h&s(SP<>62&|1 Ó]blRVv/Ok5>%,|n䒩W ئ#z.eTBE'z`%Rd)5/+b 9v$7.&ê=(* \upBߥmuOqr?y;@[15徹ɦo_ܳ(7|Au==cE[L4+ \^I"q]S1Ȑ+9ߡ}nyT|QB$BʻbA[wR ) 7hͅٮP,%C=}ۛl~ӓnF,K)B&*ϼ_}ʉQ,!qnW=҉HC޼N& . ,,[u>WfPD_^c~&I m0 sG+$ʠ%NXG6s:zvObmSTI>5]HfhIxtnYr Ԣh(&'U+<3UtF켶ɘ6t6y;|\Cwh8W*Yʯ7nYaxe`'˄WO!F6p@O8\nS^xcXc:%t;1 &a|kţe*|٭c3(JLJ߭ZK扃{B-2 I~S6yLk hCccQޕl2]FxP<87|o̡ŠS9(rk,;X|s6j[;O(ᅧ 12[qx{[ yE M;.OJur?r>%O|گ]^Z (xlo4 o-=%"7tѴ*ZV 2ˑfR{ǵ$^C#K!%)렗%`)Q>zNiڔ(Uwy~@C,dӀ1ujtJDp%w5T;E`R9Ȓ6?*1q:{x[FJ''M*ppBN' KW$Aeר-V&Rl&L~[ 6ia6Jpt3o ׬N"_0.t6 RZnoS1M<HHqLᘴuψXp8Z8+'Q0NMwBoD@iK>x`M7,t &4*v&6 qtzq)7\-B\ %RXžj~)e6 $n, 6N$6uÃ=8C|`jV1hc^s.]=mJ͔ܱ&r*;m}sf<.Ra@q-Krk %Q¤ ,Ët:|S0JWUԀHUئGaւv:o5BA Y$,ǖ2:GI}׍>" ,ޙWyD#Q:"[ ?8ǴMx!hUn5]iEDQ.1*Ip0t3/?/ƈrPN9k"AMC\~7ΰK>X5[S7gH`b#/ƚ98(5*FIG PcCd/MTXbCs1SGG ReuP{ YY\7N,4S׻s]"Ir|vO: .7[8'Gy`'QxL* 4*Oz iFDU ,f Ssz4((kKM@CMhaG sįmL#ܥ "7 KͶ3Vj"S|EEuRM/Ub9K'ZITo2`jTЭP@7;0nt Bmͪb+2ROmދz Ss Mfs_#dREhe S$4}~54j .P n?R~Hbx_wz?nK-:Pb uZR(3?D dB8 7qim#fidءxe,XC¤#v7rfjgUO73ޟHT$ ; .ZP4Jo8Mv{@*v\pL\`kCG?@pyPEg+}ծڻBSnT <$lq,u=(y*Gq FM}3/VSg{XgP_!i( {WĚ==ft;GDk]᣸ y%Ca½ѢtO>\-P;2Ng""AhVk;=mSgNoo~,êAD\А~0bj6.jܚѝ-p}S呋 AU+2~Gn1PE8 %C |ALi%q'ED'Rމܾ4֎:%`'0T1 jA~e.S ϩG#lAH݊7F9]H^{V!8+s"w}=PδaSv>8LfCF)2%ظ}B(?E5y&g$0-6Jv1\,6oA52YhbJھaOT5ueqd1fkdT ƻϵIVAB?qJpՠkQh_qrt?V?*ESDsa[Co0U~f6g{Gkw9EiS[ϏK$  2mvNɮE\&#<>{LD5$r D_.pKVA[.1^p/ 6A_LSJ~~T%sccmOp>{R"a$[ EaZF; Ⴏ ߆^6O4e|ߡN9E  >C$V僎$i9C>Հ"y|k0Iȗs  BvzU{LNWa4 oH~E6[dE6Yp8[4Is=C Uv,N?&Ӿ~$EBj H*E.KٱIN!uE3}WDXw]k,U-ߵa8̛$,cWk!h ԠC}u%&+ncTu^ݳ?[]N^^79bq$ S=b!52| |F՘%GSwHbHp.N{N{ ]c٫buG2rt)7FypVS87jГF^ڃ;mF,wyMXᖰyiȌMrRoc|T&?@?t.}B|szj0"x̋l[ EbzukdVk/MqQ}`F\߳N;DbwNʺu3ȑ_ֆN|\) !)U%Vwu_/!T)OU'-j31#@_p./K49|@9F5<]娱rb)^Q3Ii]8';ZCՒC q _E#2)/(U - 6G+sȗܧBHx4F| O#**yJZJ\Lfe¤ I"8rb |.-{jZ]ȺHҢ&3,$~R|S%[:w-=UvFvFQ,uŨ22}^^.Q[1i- bDϾ͍NDYI$R~ߘhḓA#2ݐ SC7VϖTyQ޿/ 䁚:"HiyXҪrG jk]CmlfБE5 mDyS4&*p#ɀ)Dzhbk&[/D{HTqtG^lE?9(.V$`J~/m~KRZbسĒ)3yubcޔ\~]OSyj 6s]3k^"jMb#پg ZAߌ`[t[o>Cûy>4_{j& bATU|X{nV9n!8 4 @𻇅--jBoWZY ]W3g|w5%@ϭ&si-FߋtBrbIܕ /!C>P}b?J%œm1ǗʋlYށ9"CЉwk[]pM` W:*}=mV=kxpqcVkU R3j9B['7c5~J\[H!٪qQ>HhגMyׅ-}xYi!nO0È'h)wW=2 -ֵK*%DizzoӍN7f۴':%>tB|Z;1W9 tly<7ݽ:v_nt}eOޚ},yEzTZ+ErH `On*'Uֈ yw?J +Ξݑr` yH%Byh/ ©#5vҾquK`g)ё]77$ 11ϦvWKq`;1""U^e TMPgLkkQʁܔȢH~l'qm0 3_K/t3de-.~GN5;V5i+vi6/__2;nh)y'iվe]P ԽmBG=21p凗[=8-4}?A&zΗ̙Ft8+Z/JȑM+xAj-zNjܗr0&J ɢ֌K; ءuh (1 t3}!gͲ:)3TldF [oڈS_};Ohfu&J$9W]R}wIq#a6l,6+U_ Q21;Jb Tѕ*{$ TB'.]2DV/n%%OӜSDilZ-=ū[xt9Wȟ + /Rn]%مĂd^2mtX-)Z*L`_ptEQ$8bJk6O*#-c /h-d ? 4O/2;̾@.?lʸny0PxR4$qR[l -Pw lAZH*Lri~uݶjYE$sEiG yj2+ySR?1OfLmfNgYL?Slsb7Y?{[5p3tTүYqUh.&71TtEAQC ET+7zֽPp Әi$:ZUκ?{S~Iw庍 qK7qP*;g!]֙[G+Q'I=xB&.~2MJ#z~s[ Qb CF?(;1c6.%yhLަTFop--@i#,AaG`Y!da&&f쒗OZMۦE\7(PQ#FM}$v( >u}GУ@4+#ha<)q*0)r`18z.n /Mw6s= x8yy-,d|-aGhJ3ХġnKZSIS+c%dG 8(:#.".T٘ddYN^ׂFхîs:m _;m2 ~e!i[ 0Blho]5i@O;V-x.xzqVK(7{C-Kнx| u|Vh]o oAYȦ!r٬dcs0f=tcقfsԴ#{ Kmd)Y ħ &p " 6 mFX~UF:h]P@F][!Uxo{ad> JPu[؍cQ%†3<{c=ڶQ= 转v*dL# څc-sۏeҠ_ \:ra'kw(PA&'0\%5 >ypLJ|gu:5;et<.:v@J7Y .zﳻߺ~Mњ@8ﳄGglˬf`^_wkG?[&+{NW rL=4^TRQC& T4WRߚd~vk#;H aV)U>ݴ#ǚ+O6s 5[E^q GKO9%5jhXn?ds /b=՘vW'0 Sb~ 0jd٬~]h ˝> j 6MQ8󐎴^Pkv5 1-L׍2,Ňb۵sDz#S_lu6io/j etg) ʥ݆+!^B%}%?B <;hkLLϑt.uxwf`O’۟Ji(ⵖLq<=~zB}Lr5&|Cc[*bu`\im*-U89Nz>vXGѱs\Xļ +qfzБUc3IQkTs1΁8]9j.|S>WzaA]}k 46ouJ^j kV;+mE%*o^$Q )Z/A|IU,:4؄2ץie eTReF/5F|/{@W1%319m2+_%>;D¨)`\&Z8{0~ 1IvOI*]뚐i%2i!"Y~iv?3`s;r4 8Td2+^'E(SjR$q6vk_1yS41((v D߹;6#@`^u2Q4!эB:d\m)H|Iyl3َESB{)ę,3XƏ➒W0 ASdE9M@o$ƭ[%[xe!*hVeߡHQu<1 <W0qìF:Ydfb|f ޜMX.VuǮÚn$ ~9 @2Wz%\d@&ӮT*);}$AMrэgu8fE;0G6vx5=8eBC@@N+ R%;-_.4/H'K2=0uV"w9R28Q)^npVe ^q۵gY810kqbwFfebָL9EC'%KiE;YơgVpX3~[|ٝ81\l$  ^RLM1 S~Kct}PGæ[l9:)k+<6f)}͝R𱕆w]i{;E1J~H1qÂ%~Ssea*bK0y$I6,_g2"F:۫01쇁iH9} `^ߠIE-Q>m4X!.-@&V2t񬌚J|Yy{l֗՛e1ۏiY5Q`anSi1A1WԬ`_*wS}ܰJ{/5wlM׺=r,Cڙx̒STixyʫ;ZHHMz'\jRsM-*ZmDzwP 2>i%Ƌ03uZR]Mapf3$TB՗kW;l6GRhy҆zR{z6' vS1v]&ǚDwH)(m &#?%Î"׉˽ ]3zhIgit`^yrXo][*ꋧdj9QCݧdͻD,WOLvwg2g.t"ᑜbܙ~S4Hei\ekzߠ ^ǎ{};Mu8Vu.Qg *@Ru"J O#_/92Ν.wƇgx]p#Deg⟴\7qq 8|uBEQfj ԙ~-oBoPX5A @ pN #,r@̧/v%: !4o̢u>{2u*EkIS>\񆨌 * GMS"#h)U0MI[!Pmn\4l쾐Y㘳1f~lT!I }2VsZtN n)3`iӄ%7)ހ: dX;E&Q,~<HzSr y֪+ف_yCwWA֭xPz>Y0pĕQY|f/*RߘFo>x=TgwD 3!85?n9QR;|gPt8vHu{2gI+=n8Qv@ јKqżJQxt(ń UWX2Y>$JXW1wKCfPsM8PE;Qi~R[u,em 8/~Q\x=G(H'{掎8Į|qS&f/yK enjw|9dOەGdR[#?޻C#jQK@ObT̉&o$1Te$>G;/$=ahz.!\Blەq+3`ON%BX3(__Hbp@R[jB-MC-ݏ:!A bQ6g͇ufҡ}Πs\zz@ >\Ulk ar^ry=]_bJdrM9)y+҅Ȳ4%k|+vfJ0Ng`Al{Fj{ċ]|E N·KCKY!/I-cĬJ+i) ʩJP)Ł甴Nuxx^M TL%JI;•A|h؆>`f &kaWkilܾq~l ZmQȻ/t/rqb\*,TUb߳%Fc!pUvV/!zc C 1k031w,?BOYf®JIc<]X2@`-ڴOmԎZ!WYs&G`@_ vOZG)a Fx\J }@f_ ئpM)2X6=lwbZY a}pcYj7 ;HŃINrڍt,BᩇѾ/4t|xj8+hZ ڬ Z8sE,I}<: =٠P}uؓ>) NٚYT" Єd cTHIʐ3**L;a,=Rt oUؿ}rEa=*`|w_;zR@~HTUD\].NoNue}/غSsu{G?jcެw7r 9*7px *mz`+/\u].6C0W.R;>g{(jF9偪d]"qSkL&,'W?qg}#f[Aiv'_ ߪ+TA]z=*Ld#]dԩ\zm8jd+6-I ڕž0ͽ L)vA#[WQ=Ff-.EK{7g>費9[)ƾ[^gz..ߑx|. C̵˾R3tSe$k2$ư2J'ɏ߾GQthĔqxʚ E;J')VyRi̶Fp0+%XV>#\ _t:_ 9`92xG 1[1:kcg㳤jyF}mÇxP ʡܲ61pWP]Nx&q8gYʮ>Hy`+%YNV$ ؙylI9ܦ2Q2x֯YcijČ _\ HgKx4?z3^W2;HRل4H7$ M1N*u>2_06lrQ`^F8Cq`0T|6z-~b>x]GNw*@BN)fN6̡ -̓7M&fD(7K)gj$DAS=xHpCLgLF|X*;0һw0XilMS V\x_.Y" =;Q+\RKIWԙn::oˮ8N>\vp)R~^=GjqR_8?oTp{ӮC`V1 hFZFP9t:؋Dtp!]am4mĨ `N^ (-|5+b8-mgt$Q>:U6L"aa$Ok n nN?j6ckЩqB6Z<|~_U*e[ȖWvdT3XR*(Wo5"iLB*Hq}Ǭ%66\o~%hWD :A􁟚c}l*WW|urDwc! .F_Gg/>.5@!1A\GzF^|kMrh4Fb${ԶmCg*8-хoA݀]0r ۣY\e:rqt7DT#]U$,#p\!ePwKd%=(G yp#I}GrTjQe{Oߦ٪+ҿVyq܅+D;C%XS>)^M4p37Os@ >hY  <_vG^bBj:};O9TgmL#%<̭|e}(DLl*al$U;r#X<Hހ3^?V""nbճ6Vq.jAm˚T I}}c\H_k _FֺRhddsG9b1cJ9l 8 [+~fS])MhE$v*DH0ˏzʊt9Vkz85_5(W)5pkG.aل㍠ -VdyH6=%C8TB/j pqz1j\XbrUΜlo2)e| Ӛ*T1AF[%#p -1)(L6/>=i&507(dC/>ũi)>KkI'4t\i.ץ0}DX&U+T!֎'1:mnwV{CoPv94./P0^DƼC0ѶQ7|Gy/cm[S]L~&zL$԰/kR:PGJ }| AO+2`HZ=hkqͧ+ 4}vV\.gc@`|=9PO&?XՒ2a!.@" !N P31Xo)Lh;pV)?0v`h8 +#$U* R`Q%klBrDف_ƨǽuj 󿘰K= &?ؙ9ck[y3;x@h0DbB:G#BXM}@V%1 b/wq v<m$Ɖ ۑvD;^iA}F:uV2:MZ`ٛYwFjfiD,\,fBIqm+dSrzopr74|RmIN] ƈb&;G1gs^sss;XSDБ6S&F g}f7RwJ__N3"Ą#[{^誜v7DN´QJsP:Smw (=hR]7WcYY,̸s$%b6FZw[~R6癫^k]ͱˠ˖LC!;(!s:R0#,#舘OaŸ R #SEHe3c_ܻ=z駙I ̴|ĸ&RMm~K tuyzQ?i69?!hf'24Ϋ=ބd]u=d\ë"?>*q⏔yi\ݓd.׸KGh`ɐ#jQC9)t^ȑ)BS]]n]@ZT~E?D6YPQz~/E U8ڻ'wO# j0' ="zMҾ"FbvoT/Z>=ؚM^Ya#־z N(.17#鏸K#! H7}YpM*J>[olW{G$ȯׯӔKT^oKMnb Y=yc숎S]%?RdW|v c~JC>m* դ.7mt>Gu+/ *.emaӦMYK?6'ɆIr%bwׅOMfIfgw@+T<4GDg~1Oak>rWـB +s}A>7s4>Sރ@˂A@ >/}:寖zy1m&]GflBHSq%q?)z[$L ~1hq L\ruY{lPi6DX,&&Vߔ㠈_qm:P!e5 cZPoLk4c-h\Zsy ?i^WSr#mUϨ,&C"uf(@K1ha;fC#d t1Ԛk$}KVcPJ= dy,1N%3>ݨ™"˄Ri- d^ѽ (=i2i'Kf}_OBzw3n;g1."~dKj)C SBgw{vWJo"ϝ>09UmJPd5hPԭN%.7MK#TD27-Ax v4W\j7w1kf!]6uqwIpA}nZ.~f-F>ip"fϒttD:,~ܩ0 Ȁ)@j7QD LBAeZy!qlKS#Rb`sfX2´\Q <,&%k.X6nt[ Z0,r2M\F7d&˝+DD6,VU IcY"U+^US7$L$Lg_WxSOA>%,7e!=J~: w"PE αj<@)~ ~Ld\FLRJH3kɞB˞ !Ő4?MmRgsm` Sl+؎ﳖ7VyqSlᱝ8kicH]!\FM躂6 4Q"MMk}~XZTnz8T~/n_Cmʧ/S~Wn0A^9J^hF3?6V\®^_헮Ad3p 0 !OT]rvφ93ʅ3 B&,eIa]ApR"b$khWKvcYciv͎O>hLЖ8u4S,T @vf%y^}Boјvi`}Z4dtBV#HOWm,ed/o치OqS:lg_ҍ|ͣJc'bje*R!,H؛g:f%MuMF]98hb=Y"^lO(ϫzXJ`F(H`֠>$zv|ug/ 7a\Y*YTBҎx{~}wX<ۆQĆm|8・׵%’Jlў"Tnj6=npo_e.Fa, $ضg.0J= zO/zĸQ|ͺ,t)r[U_(OIIL Buiqf*kY7t-9@~j/&ˇcgFjU*#Y/6R#DM%0!)Nؒ|Z,l&DjQuKʰއoyESQ?'N6=y ` cQ&۳$9_^ t O/Bz[5ޖjoz͏0L`X}4/:G+bm(╇M=jESh%le'm_rro9^y HIx|13Ni|ԺNUMDo -jt-w~!ŧ=lg?1fMęݰ>'1s*Wj؄p,c;uxQRE &D 5 ٴ%He&>X %*eH/qe?rVtLrܥ24%fnfcGJ5aps w SOV& .f'wwVct6e,53)Q\i|?i`}r T੪ҩyC3#$VdS9^1;@ t&VtKM5AVԍuc&D}@Gdԍvߧk"R3xTJ ]p;eB䌶d)1AMy3g=w2*nn9$~H}rL'EOWھ3IZvX@v /w;*e+{WULd+8x()㚦z7 йBooY/l/]$uN}%8EsﶝL>,4 trPa 30 ̔!~:#pIW#JӶ7)ܼJTVo>=I_xp,B7gppdH "lv@I爈Y]*d [ [thn>I_\T>WJ9{b 4/l2t?FS[A\}'Ұ*O:+fDn#5>|W /A i~W\3ѣLN(a[|[ʥو5{ʩnt]T{Ӑ̐;*Gj0T9 `yO%UwUB7Wk_XäL\|#9P$v8,q%E*kxv9P/$>I(_ Yvh 3wVw09^kk #eB%-wE!`kM7_qhE MyCϼw}vq}Z#}ЌzĘ+B=YPp-hE:%V0H{ cZc1m諱'z)3). AAPŹn8h+¢) $Z+.O*Q s{'b BP}@έb M0j nFҀ3Ϩ!1 _a,OO ,;HcC%3٦.Ier+dI !Kۺ*NFU~GH]70ϧJ &&p>;\2̘&TӲe~sz_>IZ n0[JխG|P@5J{I܌ܳ} "F2=Cꧻc~B Jw[֧:)Uqg;ϗI =daVqPev lMn ˭7B)Kup?ST<Jޝ;LZvG %RV: 1A}s:An7EQ @_ՖB}Kcs`|9jV.ULڈ]ؠ#mx9 Vo|aJ e3@¹RE sPΕ۔ =Bu9 f4y3˦WH:!#-v#ì5q]%>&,wYD'd๫Ưf KX6mJ#ysD}g~,tdudOmȐ.fJ?Ka$RyHuC$J˃6p) ;Qy L!ѧt:( ]&ʾ \A #>,Yy#dICTCM1 'r}sm$[7ܼ.$H(Ĕ(ߖ ʱ(T䲥+N9m\D _Jb׃I%u N䔝1z.l=/Η~4U50)^+T$R:çܱ?%G0\ iۃ,Jtd|=25\>ο .o Ig PeSL]t0yNm):7'QHlZ|k`X&oXt57]MXO*I(A;ɉ .Nu<+| KYîgb7| 6sBo? ؠ2:_UmY9IfCy\p㔗^|S6.Џq!0T$ixIޭcruHhsp22_ p4srV yl+jM~70]S vPkjW d7ARU 5j֕OQeQCSX*}Π\cjHy,\BE0tvisD#j vَצ0xpa&O!SiJ1\Iꕙ!WZcB89XZLHe# x+7N m ¹00 >(׻*OgkMQߚ8Cd\ϬێS-sڏNH3QيjBT]4yAЂ-CqYWm 0؇SgGZ~R6G+b)ߥI5m#9Ndk'6 9҅ JWRtʰL}{Wd6uC4@F:   B.eTDGCi}(

    ؀E ksO(nR:K|z quSV%93Qqέ@dM`~ shXf /pApO3rk(cu j(IoX;f6a&o{ suendstream endobj 294 0 obj << /Filter /FlateDecode /Length1 1425 /Length2 6648 /Length3 0 /Length 7625 >> stream xڍwT6 C 9 HK7H 00Ѝ HIHIHHH("ݍA#!7{{k}zz;׽zƂJ({: e*F0XT !MWhG{ PHP Sbpj($@@$d 2`0@ " -Pz!B-ATAN)Zxa|$9@ FH. wÝQ0rCvRg;~ Ѓ'&D8#<(G7 W x"hl@G4m PnPpD:B,"~)B]=P8{ ) PW2@q pxy \e( jH * #.H7tp)"sc`0XRJca¿ !`\~(w#.xy@ !ÝH`=h`zqt[wsM 5~'o2 EDZ [ӋWm5(`qUW^uӗ X8o[0 oy_{?R/9uQ @9ϸn-@q3trw,9׀"pׅ%Mwix[ ?TCPKD\E>v?n   !Q ^&OqQ#GY(O1i0[8q7^ۧs޷l?V_N4 %J8>dFW"8 6+U/[.684M.|SF{X:z`Q( /3o9ogއ@)5an*=vfGZY!jVK mzA~6u{F ZaVr9&?Gކx2.6I$*A$:3+񳱰޷MyŏM,BmE6,v/Ku؇I0u~!Zg$Șfz"`XIg9NqAy.}nh—(S }IKNh-L ^HzL.|P1&F#ڭLQ"m*Ϧ` 7bh hT٧UntMתrjs: H:s;F_"csU9bߪ}'I {o~ |vA} M#zĐ woE?LV] H%}MT~Nڼ Ƽay@Xe'̦YUlK]7;Un-0G|/fugҔO^0A \*V߬ zg ۝gjHHG9H|ҝ+tA~2i}KJoTJw`ƳÌ_Uz}u1架'$X16$7Ǚܴ(kQW{$mߙ .%̋Ƿ lOoy! nwî*^xZ}JPzst.QI7F db1$|$ _.qYǼ4݊}2 *kx5&E݀+(:9 {IU4{Sn;t7)A B!v5 sEg4B=ݒ_z<9^o^1IOOFiu2'6}%tW?]p4믧^tO'"E3vP-7*{s'o <{ Y璷\gTղBOm "o~prdX=bàPY%68Vdq,H:vHWD^7bF"co$ 8T:r6JZo^J̵'0/.*R<͗vqK3+dYRϴ`ևYlgőc &?~IgTI=O1Gd{5z(%^;XJHjf$_ T+0`;ܻsשwS8(uYܜ}xT8G(,yAI3|㈬25>W2azpj]4,4ۙXVfPb)s9U9+Uz[0>B=ϊh=5i=kt*sPш3^ɶl֬s%?[jl^7CZ/q3m^.&L$vήγG29׫S4 :bDt izܘn&5ZZZėIqOJ7.2O|x4Z97͑f{jp&Ne )e>/ʦ͑= swhKEmUP)e7P^ul4g\!iF r+}3 Rcd'0fw?PXz(z`ʫMxg>2O5 z:rH ɪKW6&61~RXd3mgt8r1wI/qzΗɨX2|g\ EҦ" ūUϋX&P|DǡyNfԍ(M_s7 1S4;ΐ k ʰT{M_W07dF X89{RO)LĵYV_]*)=-XT|<\<Qꄌ串w*bo4!M*>]_%7əxFzwkTڎU8Lb7lnDQ 8^ZvK\2e!d!oCd"& 7in iȔXYYgɧfݳ=cҟi0'LhOsz1N1옌ǭ5 5ʯxc Wx"3e f =+RUt&xsghiǛȖH[FGxmKΛe 2Z(_` w̸uZT0-{nb=eݺCFDtCO_ZuN j'߲21 S|.="sFVZECL"س P|nFdJTiVa<b)%K+7;(^ت1:uVLre-48]*Ft6ӻCi7q;%[ڒk"U* ?kD(UW%ru[i8D[GKKO>N N bO~qRkcYOfj܎Z턞ݏQFp'U 4lW%S"auU*qIx fc1`A}Py5pe1^X317a6$@O KnXǐ7Z?pSˡumTﻪdQ3LQs$ՉQ%+xt!kѶ+{ MNmxUok.*U{B/YӋ<2|6bl{-XؚΌR 4l{ɡ^mtG'3O}YC*âVm!9}͓SiCJrðKg>j ?y.GQ:S-؁֏Т&L._2͝f6< S +_tfXde{J'q!}Ezl*oHy|YN6<ۅ+Zq;l:7 =KџuLb}і}88aG2z+ЕդX1n/ykHo/4쐫%OQ*ow@`CL+6`2ßéK?S\\zA)?s V`,=Û/-45?sk%j >6!V|=bί쏡0jj<%PUeh }ψJh/ge.֥F6uyߟ>sMPn|DcSFᵣr6 זF1#"|m8/ssE3 ֡ӕyʱ-EYuB<Ј+']IP}GKУbtDqXnR"y<w˖}~9B~k zW$ y֖lMOv>' v؟J+^ٳDܗz'RmTkZ]4ge '_FbA/>E Ͽ07Ԛlĕijk$Y-"F\Y`rendstream endobj 295 0 obj << /Filter /FlateDecode /Length1 1542 /Length2 7726 /Length3 0 /Length 8759 >> stream xڍTk6 % CR!JK 00CHwI#! " ҍ(ߨ==}kz澯kofz-].i+HsyE:Oܼ|z`8f9aP:LPSA* xyEsș, st`dED9@`Ks(@n r@hi, \Ꭲ<<.0gw0r9h;~'ƍ гuapwsg@ jr *4A?j8/_斖0Gs'jC@M5n`hq!s  sD~eb vp!2Qdy,`O DTݓw[0w5je++WGgP+HY/ fyyyEai˹#7F[.n ߂߰@ـxG ?wD#^_O&nY7GQFCM9<\B.>A^W 8ۋ9(xUZ"ET?}o_0cAn+kiݿ_(B lWW80@W9ϸ+U#f@j`J C?_CAZ0 1Uo14~Rj 5]|BsggsOlD7A71V pCap /#?)!߈8"Dc Fo\("x\@n7p A3\"w*b(ĞYyrQ%Mε9,1<{ֹ #2ղtr'º<۩ݭ^cFhSvύYf3Qޑw{ҵ=X4\zR[>N>(*9NOH.ܻ=j{JC7*TqnJǹEM2ZdMQ2ùh1yLMSݏ/6\ዹZ,sDDeHIrJ<8-Fbƻ`y0euh! fйpi<"FEɃBܤPD.uS…S3| 7>MmuJJ Jk{q~RvS6@RfZb.[Қ3DL Kt#^G:^-h eV%?jtvdr KMCE2U] z#DP{&s~raPZ[w@|L!Rf+C FtV9LEthîOVLL GM'q愠$KA QG/h.P5fz(8 [y^3d죨i?L_YnZ oLz?֋W%uAFJK\K5٬y ͲZ)wV?T 5JK ]xj +2fWDA>a)<ATm_wwULCL6W| Y|ఌ],6MGߟQEFDd4`MҧCS(/" hϖ ߅W)1 Д%z,1 n5+%UX[~Z1>,c҈c9j9нemqa7Y8VŽ .r TruIREJd0@Fc\i`z?ҩb^~,*!<똤)dї1kgϐZbZO_X16딒G=k"l&|+߲V?mjR:B[qyr-i]l 3y,&] 17٣|l*A>cES{+"s5A ϼD<}"\".fVi &J>sn av'P\hܥ8!9=fq<ŴTk"}.TlL0 3]9Z@;!:n?"<[1=D7~dx}Zyl~ے|hVgӄ"M<"bݚ53ViZ6ʃanPYʕCDT63o(%|@p۩ 9q6/Ch&q@6`X9xPzLr0ZS[dk#foxȤ"RSG~] f+3Q-p*D(=Ke˹i*yO^P%^LLA?"LV^C% N-;ՋV\'Ai#vxbtE[?+IYl.FI"ʣۓ^Цcq[EU~KS9mҐ_8*ɋm`y;KyHalXZޑfz7MAGWV)xx[\) F1Os.!.΁8 gϯ[Z?D;4r}NzHr;yAY7?5;XNx?S>zZjWdԏ ܫbVS2۱ϰpהm?XrH,evyUMυ]E#]Ui @-Z.4%.*}ă)5d#!*wKRb +șJ: kr?"-Xpi`d^UUr}D~quZ[FBz98-jѹ,fdDl2\DkypNb^hƬ4rAԔAl>df<}O/Yasn bim%csKٷ"mXTrH&8W>隐|+8>}<"qL,SZ#$ɐEB}ˠ-w|ߓ5-3%I+` ƅt K%<.i)lz!U,mBďZdžo_/uD*¢@13rLDkz:0DDr*F?>a~@^V ']Ys"?-n_M%G7d9}NP9Mwa(**Y|Q$m:ynAWe®M4cg ňp $܄W -D=EQ!3z^[GxV㌚U%`)|tx2Kr)qp&mC\[_)()*L@:KwlK+ٔ`6DV Tҷ{1VyaO-P &$˃"*}эN'y+ܠ0æq{hKD4*$*+2ǻ?g he 0^{g@"^ӰKQr[mkzt=TYc7UڋR4i*e<{nWiXcp˓}_WNb+~';}6%UyY>h6<4}~LZ_P^eКGY.c3~$Td2 OS2bY7ieNӷPE+hJ;~$OX◜Mk@&!yGW﫟)̑pu6d#t~u}_;/ aßAğ3vM,OFKZx4@!w6*?ΫU O^\SBհ)b*7m1$ '}؟YzR,m BJ˫ 9@ԕdR-mԛFӢ27TZx>ɨcM|pOP7bsPޡ1taCɭ!MĘMU3 uܓ V=3bELfk/aU۸<j +Oahŵ✏+)2͈..RUP,pAe^ã[Wqe8ٍQ7v_CC2ȋXtl7ْEۢz[Vx\?QF4]j 6%;{wx'Q$d OK{TudD`1|0Je\^H置f@Ř桗70::Zc0TŔWos߆uidSGHD&M9ֽQ76IRln =@nCnk=d}|zWEʦ=u]0tSوcee8LR s˔NmI#e0Daz]7Ct#o8þkB5oƥɅY"xWż +I{<,WA9\lwxV#=IAtv1!*wAnf6YF")wwn ZO&pxisH[`?^ ].KWVd撆0ي}w`nx$HgeЕnZ2p,r.m"EPi̷-r1eIzz M~qzgT}Q_h*%*? ^bHc۫[NZɨ4!aa5*IFٿڃyB {LINĀf.hOwu@*N"tLUC&/Ŕg%_w=|R, 7W{3B,4U߸FHt@}VeM2Q+j+Z%n)Cɻ _gnI5B^̎C ͂;Nޢ%g-[qFf;Gj9ɞ;:Hь1)Ǻ. 1'v̭}3]NoUj^Utn98WOyrH'՜^lڐ%[MU$HoU>qVx)#+d%`=TPtjQ\LX^lb5P3lE:x*64l Q*LNaccY_$<2),d|>L%w ]K+,$^7z.Ts^ 1SU}0NH?g70){;4n0 ղ'Ŝ MTC@u}IA?f+BI J4:]{xDmT~`p^TMɅ%yVϩQuggߞERCSn:;j[h5JL^|8^pSvkj99CUpyףU>r9MgSʾL0dKYMu7SKT=ow@dȮ1{))u6.Gui%2W> Kr|s/Ԕdx%;e{<5${NCrUd^/gQ #qC\X^ht(X.!NhKNٷB{-OLrȚG"E&_VHXBĭzֶ͛LV h;T\)Ԫ4p7/r@E<|^c<?IZ?|-w(]J m :]( sز9YCLwFQ# =3P MOĉX7.)I78\cYM?3|ʯjT6XCOQVP]ĀY)cSv)cm ݎC 0 4 xuoiztZ1.^MZԨsShQTTXpjc4|- ØT"ڔqKW#~y.7=6ӥ'O,nئ-귏4HYB2SSwF:Yii~56q0,{Xi5DVr?>"a ^:ad".ToOD+p'BS5v$^70VWToUeo%f{ 1}μL/R "c͞V4)lK*+4?2zͮBNVx!e1}8+1?tj9(֜xCuY-G6,ݞ^61P cv,m{ow3Yf^ƢLL;0=}iZ1%vDF'rN`&zђgynLNhx `l YIs1"+pG70ZkĤPFvb85SGQk/~KSUmpxTW&y27 ^ӽI7QapWK߽ V9r_HJwR8o:&rkN}v:cu$NqHe[|´w'[P+Zh%FU^%y8l[@8izK[XN`P2+endstream endobj 296 0 obj << /Filter /FlateDecode /Length1 2074 /Length2 15753 /Length3 0 /Length 17022 >> stream xڌt[ ǶmQvضmIVvww}|s(HTDm 6N ,̼1y33#33+)ֆ_z1ӇLL l`app23Xyց nbn g(lM͜>VG ow5 odX jkdtr_!͜x\]] mLiNf#h .@71F8 ?bU['W C`enqpp1:>~(m1ǀXY?2`bn(J1:9 l24r7p10200;q299992:[Ő0E189Lo?&6&Q0vcR1w~Ň`ffa@7#3V%`Amnt4pޞVo067rMmDM;`fh<_>~7鳆߄ux2X9,lE?Y0dcb 'ُ*O.}  RX O0s0}|n]u_Q_#le/?~uv}yۏ bY<~~~wh"6>Yo6t}_/>$n#a3g2B2a ע_gLYb cT+<2!Z- :v)UZ\ǭ8m{ka&k!C_ kB`"m}v:E쳾-$c]tA&m8*|^l:E` OWOD'w:gޟ8W~Ҿ1zk\֘tl߄D+sIpĽucՁ]Fθvd@]; 1WSr:Ð;~۽9{엋JߊiA\o )eB:Pra?K`<(!dd^ f?s D)p*Gsw;/(^|5sAD Gn02N8]|#^Zk~+RQS54ޘj"y\MY 4(hb;lYz%pjwN 羻y5D@՘w\1W6]C`҈$ zSU3(Ow\!0;\#9a!Ȓ2ӏ9 ~lY^D=TkUvF8n$0rb=ߝIBPqdOPlf:=-լp3vtI7R[7w߆LY&|y"֢UETP.u!0K ^kӅx CIqe DĜȱ8hʻ5Z?' 5[) N NE!%]j(gT8rjDSS>7{?5R7N~ݯ}C1fC'>Q&rTcd#\1S74:y+5#ztUvZW>O%>74J\Swsr'.7n[bThfylk #UTE;uUjo;7ZwS^CzafȘIʖO WoG Re  AذRM4b8&CVa=-?A"_|+ %rF7$R%vqSPzr.~"UrTB-I:9[|sd,k@Vw!?(n`ȮM743}ԟKO@[س!c62I+NF wgֱʠv<ҲN4Lp׸Z!J,,$*?vdR&k` {r'|..kuʁ115} !KhM}?L¨%f!VA m?>^8Qx?6"| *gnQxO^[:ɤ^_4f7N>`,YU lީjp 8WhM?sW]ItI؄QT&k*a;C-߇V-r.\PROPk22akukxEDqxA7=o"l׸wͲ=R,r,*ۥyZ}j fuVu;&&;DNg& HJ!ᠩ4Ac{rnm <~viuOOqM 1*^|wSPtY߬\^9z)uq̏3 6+.r0hd#Iކ& *:d"?Bl* 7 =(1Hov`^0gԱSnHⰿW|1-LÛfWbbw ٯnԵf_!Jl|ްWr^@Z_7Ǻڀ5fF.sLλ$C 7%>}h#= _2pJ4"?*|]ug e ё m8V`_ŷj|2LP8ya17Czz/pT}G/b $i^tˠ!(3Vc̍5,CphˁJCvHk)JQJ$zXTGvRё{֤QTe:[,Ȍˉp,Mc'2aN4:Pr`H+~p_&\-Jq[s;Eanag>wnN\!=aLiO}7C8=:SONa@^=Lljg{cI ooYDRA MqDF -E]Sixj.z $ WyWvUbPK,LER1ohH{ZX,zJl+JSąIx2_4o XVly(e# 'RݖZG*9uF^Qg4rua_֔zؖyB;֪9n7Ub3ӔFrDНEe@]X> ԭS].7j1Vus(n$ MS~ǥ c7]& tS v>VkHݵ<(j01‹4Dh9$](zT< u\8:\da!$ҁΎUKTl|}cƳTm !!!)"飉$Gآ^J ͦ+RDo9BK% 2ߞ6L7Q 5wBMV\=pM/ӓe&T.}X4$6.d/ArϕN%2PlGC} Q bьm2%Q/p'.d{.nD9Х ?tc\Baxx7h[Q8S~#">D VtzFRJy`bS-)0.[[qgGEKN'@/^1fk'dCY+xJBɠrqG- MvFn0Awr4)r3iEbk?uR}";XZMDitG$<@8bڀîArvH}$ C+P5 /zj]&D/ )X<(ɫ`vFc%B3wՏaEIH}Kfy$TqhFfExm vNTGS&Q#rݿ+$QQ݅tK}G\&=Hcs 4/?jwK-$QOd/Wܳ0o 4FrfhuE^7rX ~G/[-!6H EP3>wMQlq+26Osi=з9 _.ET&?M_ ?BPjL˛F| ≣g < mbBlWp4y'5I-^fgzxlPh߄$VvUd(fB<ĩs??NhQ$ARJ+}b" Ua>'sB oUI~r~ˆ*-߆}@RT[3-=Œ e ܲQP6{e/&c/(%O)/J-?Pd :b2#š2!%@ig scwvjqfcEJI~e=!~ѐ!mXy}r@\S>(Fxw]AQ:y$kHHCq+-(ǂ21*%?C/2%k~o5.s9 PC)[{X7u78loād(g].7tOu2%xľlb~bf6ݹsqٛڻvnpaJxMO.=4۵2x!, :ط$H&r"3>k&iѬ6FUd-96gme#m= ޔXaq(-{H,c6̏~ }ZI"Yb 5k$īUii8hĆq\g:9I=tDdht3|#i?$Ug}=T&ԉVQsUfκ]%`o F42IZr:1Kvc'89Xھ [$'Ջ_x+1q8V Mdt-2>-S 1-|sӵMl4y]u8?1娳S*˱ qAyzՂ +.2m6ЖT):L.³0uHJ~1fMT*a hPhֶkND= nt)f9~>/q,Cx=c/D+;PP}*X"hL+8shD"6ÒU$]p knj jq̓F<[1nh9\}exZZZ&:>0 /k*l;O"t Ƨ?]@$9a%/s wp0#Ѯd9f#9ew0頃K07!3.\hkt$V2迠F&%^Oƒ3xޫh;pZD.weUFSS03Atꉇǹ :còo@Ydns཮%Dݟ?SF=9ۓ(ZL}Y 7S*\k b(K\x@S 8|m$ϫ&w7MRޞ׌fl#bMhH-]'U$ƴ9$Fnڻ4Ժؙ;?G~m`<%OރMT2uzh־7:Msj0 +9/ Y Ŷ ;2:1G&  Qҙl|FH-42ߋUHzew\)F/ܝO1rfyO];h$Kjh3h{+ᜮ0*T %hUmڙaZ1v1LU@81*UioEaaj%2 ֓;9DݞVYiO aŸK[FN4#6c/Ä˩j6סrkP! XUցaEprd"Y:Rk$>»DBWpuq.Wf*I!7dIbj}XI)Hu089-/fS&Q:܆ptBw9dbp )rBU.*7DoVK %Ôi-'+r-*?/L&;\kI5t*o;OG)>0Drn BBBza;.%% #xAd%hJ3%3TE5n%-xA4-a8aCn 'qOЩb&]&+hAyH s. 0 b`Efzw*]HjILdeX4UWUU'Y`1S?cѤ)*B ãfفj}˱9[TP?ů)m!R} p^xL=?I ʀyl%_fbcM0"|bK%Rb^/H* o.*[ 8lDO0i@U-"/+OִN8al8a VCj0w5O‰҉^#C0z9;9DI񌒟&r&(Yep1#E/~7p%nXwm!Ɔ(h[_uQA} mS!hNFf$Ms>$=5;T@<99 T9g *Lڍ}7y vO}O4(ڞe_1& 0g⶗Q}i΍+-$ 5[qLCf dZ> B_=5Nsr$Ǝܶ"יoY6h{ZH]Zvha/jl(*$))y"3&-^.XġrFYkNW!b$fPr)YLppL o׿A )4Ĥe3N/Yg-}3ϭ_SRO=OdW< vCFjg|Y3_H !5bjdX Ւ8/3!R?"> l&=GJ]9q69ʋ1cZ`&uI!,3Wֹ;Ռ=b+ MہdW;ۢ6*S6x9$D* 5,I:57{e4Ĩt 0Wmu@RY{'h IK<Hv>b="<h% &DueQ`v}=H uXϝL#}7 ƨ:? 6#~=F1T϶){C1 G`bAR|S4/)>XHXXѪz&S_*L\> 4[mEwgp[;eh54Js7)GG^HF}Zv,Qܱvb< 7:hgM3Q /_bUz1΃u5HsUzU z`WAgAqP=M"2# a"3fަZǠW]K6AZ:[Grw:bXE.BW~1<ʫIM<_v+ǗdDU&d DMA.-pm0zyŃm׬)q( שRv` TvLT:ܨͣ@rAS8aXB.ԅm+ܔ(sH^UJ}* ba`bhݗ xYk­G`"Vi~{p-xN $`҈XgtBRo? JLdb騗-puеT5 F)V-6z4RkUE_&6G`HbLU]}kǡ3sa9ϭ>r3XC1Cg:+wX(d(pS- a N@jV8>UN`B {^B#9ڸOAӉ.N--=3:]Ѫa4hgЖ(̧3ͿT=k+Wy,3n!^"$>jw$[\&_/wbjMi|Ws 0}B\E\m ASWU b4mKnd=l<uL]WN~ 9P(j-Mu+Z3#`ݐjSArw ELJ'xRFElʌrt€8tAdSq WES(5&K<9 ݸœkjW/9j\3 1+ k$ D| 2+Q=Tfy8 Oǟ$xc.u9. #l4+onχ:DJhJ öf~}aE8?JqcU 0w熍It) .ˆ2E -xMKc1hR:)"I3.R:̏ڢ*D`7N-:HFCZ6B !;E\4"Q9yNLv4AU6ҩFKlYj&6M7x->X gTYh+K:o5CX׉M<1َ ;BE bjd/'BЂUO 2 |bۿHճX=~",5fiH <ێX[_)> (It;wD1?@N6[ ɴ1YY{h= UnDR26{uf}.-<5nHn4/_iEE\}S@:|qf nAX)E1"=<) S]yDэ]JPr^ 18Fwo3;ktuC k]_,^3yEhϚ,x( NKO)T7(W-jtS&23!\Ӈj-FdWŇͿKUFu Blf'ofWzGcQ oQg(>,W,$| S;jlRr;vHf4 ^v_Y./~uO_H *'\`һV8] U1ǒrf?IUl10r4*1o\=tM \ ($,iZNki]lGMssGD2N]9@(4 {ۤyxrˆ*H-IQ&,z4˺BO{u 6L"Te~zT/~PmzO-De^DjѹibC-0\F30Hx~*KP˫'mI?=|W+ߗقNxm.5i8j!Xyn[>L}\C[DO[ŹT h ׋@PK)ě$5q}ȭL[Y>>LWRG`gNR Y s[h1;k "|e9E}ْP!3>3L@/4d+ȕ4&vޒ9J!_ңX(La`M,ڍv"2zsqZ9oёY0lX!8#)Jyqd^2-/W) NHH4qYT3j(ڪR-F>ѳ;,^ sZC~/e'r&Q2EbY* a)ґcnqo S"W@3J/v2OFv؎cRc  Y4Qa4]ȭ\C;ilKљJD5R ym>em3K!|誦,%R'nbo7H12.vxMiw@/B2t]:S? kRN+bZȬ԰tM O۝℺Bhp9BA }OKM=:,ܯsЌޣi6bP qJ.\wn]lm'); +!2,wK:L9}οk! ,wc/i]W4;)=%7ܽi*gTwtP^1T ]Lc"N~PWv# 9}dOd Ne"q*,6NG^1vp*PbE7<ۍlh׋ŪfF?9}k-97w-GPD_T,Go؛kG9t- fOt) xj|E@Y-iav<+GC>>7gVkyަp^.顠7'$nF֓ =Y}|62T_7XdWy,9rV)Oe[\3`Jy_"hdhCb~<"v$t [ /g͗.4V5? nYJ+ *n{eUg}@zzH&``lRtzBƌauwaY}Yz^Xvѱ^\QHDȎ<CJuK 'w Vw#w芍zw)[`|=UMyMm(? `{V򉤳Raһ†A/BeKXg"d?%|.ՠB3,&0O7`azLT>Xi;%Efb>nh q73-uU=څ1 \3̒oѢg%A%  هk?ǖQ|23K/mMsu Lv ΢FX<8O2m'̶a ʺ+XHxޅ+EXiwN*GkY n'DaP!7e {5>m~NxxF#!F.)H峬mA<ʸ|"给 %i ҡ= <6x?'J[H#GC0g7J 3sd"cN =.۩'Y^7& m~EMz~1;F#W Iԓ N(Yv[ur+xY\?L.HTW&/87GV-~fyL)^+ڙ: bP553QٯOt>_n;5e )ʢ ㆗:$~(7 QQyb[53&3uRb7ț鵳;-Ќk[ϕHlh\~ZUsK>a CcGq>7Ww ܩp- H}Dok$8-RNBoFML)Ľga'kol,χ#oG8g΋H_hR(a˺noaaV2>Fw\H9ʙOkIz 'WDx^`P1 LlVbVxyzD>kS/c4Xq(.?}z_`\> 0h;YԐw-dL?yWū~{]PcGZ!6M31U݄ډDaB#H?Tg! yS6 q R#W\?8 i΄5VmELYT-u+u~깮#-JxC Nx[dw%j4 _;AeJ@AE(ӎf*نaOjb` @-]?Z)>Xa9^/h/'bd*R;35^ޅ`uV.Mљ߽߬J /fMҿ~82j4eˑ85umEX"?6VhQ׏:7j㞌~ @80f;эRS#=Z#'}AR`b*Aqx?:ŸaZOA4{&&Q#x;ry,Jv~ocۏZf%?&} %2MC8J#%-l: F"wz%~SslK(C~PmWgU,^v "i3dABNaD/)_@ӳ?H*&j[f1S\w!:uZҤ'_D5,~7(v݋0YtGˤAyD^spFLGV ߷ǶT)=Qa(|ͣĕ;ɸ]Jǧ>iyϋ{6ӶM;W)"*xcP5opr6%1|̘36^Bin42+`G/V=Z:J o41F:`tE]lڀ"-!.endstream endobj 297 0 obj << /Filter /FlateDecode /Length1 1740 /Length2 11012 /Length3 0 /Length 12124 >> stream xڍP  Nk <{dp]Kpwww vr{kfާi[ݽj^ry%:ACK}%Ď ,$`ddgddF"'Wۙ#G"W؂-!bۀv2+Q70ع8̌\!ZpD`C =@E"rؽ#Ҁ A9@d6B2@;kD9@ s&vvV @ [zKc~*Z#8  Z.lKdid^`bF(IH@h1 qCF`s@NLɎAZ`s+ԁ1A¿5[ۂ7, 1AlOl2x=wgkt!FahoŠ[ۃ$D漊l\5d`Geg+ПJ?į5ZYZ^@?H@o"$&&!2C*_ov|c|?&>iN%-fАV*,t:f6F3 /[ %t_?);=/}ZN.@Ϡk11~1?MM^_f$fon/h6w:v[ c KU2 CJ_Ab:t\b`'<䯡KǺ! yK[ ^w}?U߰K?v:#\^,!v&F6H /`q8^'#AUq 5l@w?$&_`/ `0/d}* 10__k`/_ez="@_O_rO ml^?w^ i~Ҁo] #3+jEږ(î0%KvȜ`N!sK:Ϊ[b7|u[#MZ1 ߇;Rmmz,Ccz~+I*\ZnKMN)jQG~qr@ U NNJ|9&ۿOdf]('ZI]'uH&ɷ:E"(}(mJl]_WKӢ!WsQ@f夰Ydz"eBNoY,anT4CM/`X~!6vT)gPX,)-303ͥh*:lYF8Z*?qjtɡ#xk rPekcQY?^Qt (M9ViЭƵ ?‘:btz4y֍[Z3 vW4Be-*t?(hqW;j{t+;ߝ,Q o^N3} udrJs')y5({ L4ZyqXzq*N{r>NPI ޅLJBAZ]'Kky^0 j]j~%pz`iqeWY!ٵt I'*rIG-/) yÚߖ:iɓÑ&žMv[ eA~N'1a'G{z]PfqỈao^  )) !vH"0/p[^iۊ/x.bX5}/:Iт ;ͅ!xtA|̏:x-iHʁ:OJ^?p•CǐmBՊ"8/|Nmqofvj;>1|n~CGʅF9U5KE$?,% JDҿ8IVN3KK=9 ,[<ԦiDM*7o !=S&~kۜ 1d-h̓YvH%D"gdAɱ~IG^񡞘]݈[m[*J 4h|!cwcjbMmbӼ}Ƌ~-6H()c)'#1KS|d eI h>;BsUo3]ɹUH^~Eα҈74X{Fd#8RKn߈[_HVxZ}lY^TCzG7њu3\3z^F!vlgdOJgL{_AezPb78ԚL,qK`/F|ZZ '0ޗgHNYLJ|5k9<$n0YynPX dV ,ÔDm.iJ7!6֡QMRJm #iFsөmaB-cUd-0TLk%)ycrL biwL9nh޶dX[j>SFK*vyĨjŸh13֤qq|bd1TI>wOv6+:&g5`4'cOXSLRfO\Ԏu˾icɛ -xT@1XB@*HgynD>fQ)BvǕnh|$CJw Mb!z,L ? u'Fzhu#XzZp 7ŎPe}0^ntXZs} oh}5@7&X8W䡟9= 9pGBv ٲwmր?2\u#8235ޯDJE&'2~`~>"q~)EA+-Nm!;.Ks[()$tV[+[ƌ#L/<#46!ɺ6|X!~%Çh[V }/ꋵ~C d\u3d9A} H.z/x~?sywc+B{yAbӯu1frlԓX˼=X3hEY"6G_j'Kx)pp IqeFcHƉM'O15\-ʹ-yuWWG~ש~:&Yr:#:7!na,w ;}#le3RЃ^^0-lh "zꏙeq]pi/.CF,ˮa^g6w7DvƯ0~ |f%lf?h)>(,Зg:O;74st36Y~N9Pq0ab변O.9{lS]2WK#s4x^bw)nS@]u.D#ù3on.EnV1H4.{Y{cEwaTwJ~}'-a@0gt}Q+ ϝ7iLh,R]coJTә` )aגp b[Ga to]olic 2}8%&߆Jr \E.]/6Lc n5`D4boh8h)cHwrkӉ-ʘ3Q<$Hl;{0F*:wr$`:&9 4쮏v+3f7F}ZQeBn`Jh3oK@2:ʗbPn6Oi@j_T3k̺o'8us8JC5"KGqq:6POnTsx(0R rbs{S . 7Y~2H׽{'0́ȯBR+uGAMյj6%j?Teݓ#3bZ3y!aV_Oj|3}Ψ,2ܨM_&6aA1{ކ|`M}+E^s dQ4I=L\]nK R+s૶ 5X94+4Q)oAj,-]Jl߀f;6̐k;\WUȕe3Fc}uΑU s%{lC8u``h 〴S#7Y%B6Ѫ%iLdWĪg3m#2j8tKrZoew!Cn|[rNUUe;% O"T咻 OR?8Cg !>|L5kd~K&- %V qu4bK}ZvN _Oюt>jEd$6a+l͏ؒUSݘfŠ2Op}ij[پH9{_Pn=,6Z6:@]}C2&8Fg3ŸMt}YO'kywZpǶ2J&] ]Z8Ĭ-{N^wdnxH֌ro ㇓AJ1fvKeS$gFyS0x?wU#dLu9T uyNI}ln|P'DaҒ>;¡){oR!fԃmS 10;m/Nq5A51YKFtOͨ#󽬰`R_EA[6O3yplVFL~q,'q[䑗(NJ=T%^͋JgPX D3`4EJѤnu/6Q!0XD}>bq96'a{,:N&}q%x\Iݿ`qIyQju@C ϩ)eZ}wXx0@njk] FM)NsUhNnCa];? m:PWpyoе)I_$t2[qQoBW_e2A5~(",V8qx$6^7eeKNtojg|2 Xm49Cj,#j`ý  b=Vx9v a O8lƅ4х?E Ưɇ#f5ry5X!e&c9H\F#vł}FI"Κ)hIkĐcVn!J&ŧZO}΃U5sqbÝ0ަ#:cjuE*^pS* "<7So%_%֍zml)]㾫<_n1L( Hnii^unՔ_8{SQ=w;:jP =. BW#%%!9Ʋ@t#.KdI-iشoѾWARho W*]`ϘSf8?#If=dDzRVxX=b[\'ls7⒁zMAri]EJ̡攎a$m# tz&%ZC7}PhH$ڧ1y1fK; EvOS)ް[r<0ҡ__T&u\zP fq$3ip7=Rj6-,,dzhng8e6BIŌj#>Mr/#SeďVBn8t/âO,Ze19UFXDmOG%- 6ч.j4Pϼ-L; ]3}-FAWg$e=R+sOEN<V dΟPGi϶*Ƣ[%Yo 1,ejʿ<8*xoBݔ9Bi!K K\Kh:#p869ĺb+#MhPx jUH\/*X)[Lq,bƹu<Õ4(ǃ2O#&1F2Ej{p^p2'G#~WAй^-:#\ǁR 3IՇ}*r_pz;!Ƚe^NwSx0YWCF穧2jWS'VXHCKm6};*RہPqbJb-(,U:V4NVSi+,*̩,3Ul ΠA@aEb~#ћq79w$'ʫ+^%l =@_U0P9FJ+dQ^VZ}_±f.jeMU2BdQE١D!FFa =q>K  l N5!K߅nu? |VB0Im2XYRUNXDi/<<)$w:u%Ht*BӁpnv>8*$b~9'¿laEYͅ ?2^o.Ho%'b!Jcs빢E>Fklo n> H\_'F& `WK R[\S_Q;I֨;Q ;rn8C ]cTr &\f1Fۣn&|Ōl10@^piXx] /3}fQfFF'ZNxp LJ]l@nbTٞ௫m$Um 3k}nAGĞ8 iAtn0~(߿/AwA}fֱCPK:3y]l]Ljuٍ@ؚYw(Bvo+FSL@ qR&)GԘWFVϚG._d?m\ZJn \*r`O,g{qSvp }f愲^me>*'vYe T.޺&jm\~Y( |Igx;m8\nӌC$Y[j1m:o?bdi3zj5"M=_v Sy2]k|0,`wE{[;GH۽buGiĀM֘!|"$eNǢb*2&(^y M`ܿ5طRԏBaf~tTCCp|Ƙj"Ӣ9mӂq~N<~o9L#' hcD&+#Z,*a+G?<Cj(uF0+V+_1ʶ/KK. - V8,E-UjXX|b]C!윘?3P0ɠ8VhE9nt@oӵU&9q*jC%?)k3l_ "^{e j1e&ѕc1-0!ey3Q$^G!zq` TH{&':RqL{t-%Տ{ \HʉTS ߋ"%d\Td?FYB|ZLD1"˾ODU;7pQ4(rwu|mC $τatͥ> v2$kM7X$ [M CR|[l= Gz}lHx'SM^:%#,P錃Y#b 5$C7NgRn%#`} xdRY7rQ))%@?;vmvQϲ<Ԑ +1snsX8wF olP5m8Ij1sT`yCTS:FMud$EFkzQ_\ѹ=r!8-^ƇY[f/֗(;z >|BRB\jpMdI]|y}LX4m,; )!Q+ʢdt>3yh(Ef/&= \'AE"J2'WOaͱ1JNR#IT_?cuPsֵd}#v/*[.CT b`p1۟Y sɈ2 +Lٚ%BD:mLFtK3 $7ySfi7^sf7A~!-oNjy+Vj s}TDXP5SLFҊH\V.ƅIXeh>]NWG}|#"cy#{yE,Zl7>~c ìK#UsiC7fuC&` 9l%D'xd0pSrCnFSYv`Akt\2[R?uzXye7 wDMhSc7ٽ61K[Oŏfl$:Ƌwm\s0xڋYcdэB󔢓roz "O]fNԔXZ{~u#rD$7UGL"+TU.੯LfULAش^X;w$ lLVTy >r(;Jx Ni4|6ROBӝ_Dj^(#WJ馑&چ‚e+;9j_ o3CDhb[΄%PvEה=3R4f-h N:Hļ2{pNWmU INV.{1¦>:E4Fjf =\ݏ=r'=7DU@F)[Hvj3/T+uw%MIتctf?n|rZQ:t#)F(vҐWHjWvq\: ,T@f"C/u$l5l̈́+9%pLN{vt]Be\QauY%tƍ8`:EI2Fvуzg8V/PUBVL"]tw놿Iy&L_)k8P#L9wj~!D#0 8~+g%gzp9쒷~Cm&üDJEPYu1XWq8Ҳ{5 B=]τBh,԰Åy̩r&nXV#ިkBz +N朣=,;;ˀrECy`-@ڞA&MI%lz^Z/r9qbg[lD$PS6Q=0cCܣνj:ޱxx{LˊF!/J -[dzn}O 9"Ec>JI!OE 1UF)(%efWsJ3+ds=T;X|E?hPG[Ut9I9"!J3αwa4"T)LH-{Ǿ*k RrEE9E=0 BJtO 2HzXȋZB4O[JʮHwsȉiN|o|E\p3:kbX3^Z\x#ۢgLBvOQZ5$+!OyQ)!R'1ْec8%(;y˵wK]¡VCzGM60I{6G,){rtM lZAC_pY3@l?R賓_>գh5RXGլH@ T/ %@(d0Q_\D!;endstream endobj 298 0 obj << /Filter /FlateDecode /Length1 2365 /Length2 21010 /Length3 0 /Length 22388 >> stream xڌPZր4!kpwqh-<{pwnwp9sf&g-kwTdJD@&@IV&^ + J9 d 1'˻LPdj `er~ea 7v23>Tb O'+ K<5|d;@dejl7vڽg45L.ŁݝΙ d!HprNn@3_-n fiBdn lL.f@'{v@hp+MMAvVs+[ @QRÅ`lo3_$E?gS'+g&g+ۿzd+%@vv@{grݓ߇kcr[ٛՆ+PF6"?2 t=L-J/{ {@_+sogc7 O++`G] 4~~I}@u̢r nJQQ;'' Q2w7x.}N);@ BX h, '//[WEIKO~ Awj@3+Wq1~ "oL[}*za޽XXڼ"/o^ {S_ `d~ f}f@-3x`rB`8"&mCb,x,f? `Clf?`CO?^zEעkQ/qע޳=zϮ޳k=]gu&2d~pp%0g cߕ@Onͭ` W7S,=,xYga|o> ?B Owߋu~ux [_Y:8?sxo|?b}_t@8lklcfw?rl~=#S{$/ߩ0uuz˿?ok h2 x!t?ƁurٌmQ BZ3K.x[p?D8_Vo)Yo!uy1!• \}~BTn)n)/Is4VN6**ٹ] Kǧ|1] ;vHv Rxn(&Ja͙L0F*v ۑHZN~}Λ'%- X})Oˤ)4w^(箝Cb HqaaRN-hkF;ǜ(AW[j1 ~ +u =ح|k],;Lc gYU],F Ţ:`Qj~@Uޝ983GT 7N\Sb97Z bu<\Ggj-͔kCr1b?ӈJI@I˹Ôrk,[1L$L<ϑ ^`*%+Չ[͘ *-> =GPm&OkaqlRaV _hYRuFz aruT 4x[V݄|Hdrd,%BްKu?4J>ky#F%En2atd 8E| {QUJ|4=fY{'E ,+\kAǜD;mR  qK#^ BecXV"pqKLOO<@)"X',eb\Զf..NX!4' [0xXkӮ17͓W }$u\n,G9t5Nw+WVPYAy g?&qۼq4m!5%ӗxL5QfN{=y^}I䤴 eB5kO`x.$DDMK4PZyU\o|&!j's8+ju)L`{EI醫_QM fR$> ;ڞ]dSy}W:yWOaVlͯ >b?3;Y٩B8y]ew0؋u-yS=I`:58~f=A}cB0ⴗH{=Gv+^y 1 P_3S1b]pRѩPlpXq&ڝcg49K(#EtNm\uդW(Ž;d&H6{.\3̬`ְ] *z]O$syN$s%r[iIZgԄ?D'3D-EW)d[ޏq)f,3T(;Ynv}1:7h]GWV~z|3ac>cj%ݮYylB$QVi?/?S}{QJdB6fbjto2 !]UztO!B|A-^B*9 !*$@Lu)kD! v\ 8Ϲ|N=&7% !bz8=CAGG*k`xXOIeS߶@[Ia93{;.^D Dg_ME)*'J~`L'm+ p'3 Àvhf`:vך>>#. 0?LCӅ(EС$]S"N}=, i."IxiѠ<>T섒Zրev[ʄgۏG2v8*Yaݎ_&jibޑJخܿF'lꕶ8@ņ'ahvѱcӊ2îcЮ+F7&9u[ P{gn0vcOco/XcLZ ŋy^p}% XMZUփzd=T&8 fWo7dO\ۅi ߜl'8-:ӔʼJ=zg=Swn޶ 咅C \7kEf,_jڟœFtibB/ˀ]906Ku JsWi@d\_Zj|&FINB=cçkb>a1,7wYd#w[4"И 96G,e,v408{9_B6s0wuE ;<1/|z-[SeV s@|/9-+™>.An$ x _=J-Qq ?"LGmaHHd2Ӹii̎>r%73 H=_BE)T IH-3`~\]$(S^.v)MVC—OܭzKM[fsme%D5u`̅XTpH!_x$fc N|)xتڰY=|Q BxMcȠk { =]1gljo6{^u&+k6##Lʗ݋z5>.]B釂^v,ZɃhj zjm"@Pl%]gfra{FO>"EI1A,ܣ Y-c6'XHWwˀaEK;(C?=ͥ _ P<7(H\3MgXGxd'{#yl DtU!&ĴML*z=QeɘkCǹ` m-0;BW Xr7XyD T&(p~(~*/kx=qJ &i}e SK:c|R.>i}> n8Eԡc3V:7(c:BP\aj߶e&7\h22ލrPg^%S0@~^Q2nכOh+ce@g\_LɗKLJaR} ֗ i !=4>=b#!#Oܦ/G#w3Ņ;`CYݕdV\N U;$ eRd17 γB  ҵg'e]%W,ҙoMHAo({ lVRhXp{5܂*ZsU)0I|^:s`i]KXq$n]8:i &I-DD5YsY͗֫)y6.]LilH`5qUTtҽ|bviM}vo(Ӵu fQ%LVı.~,BX9'^7'ՇCL`pp%%[IK9he2Rw#vWf fue$ &Jt>o_w[ ĝ8DwG4a[+ 8A YG]kQzyE1 1Gգ6joR3Lk =$}&p<,?M ,5~gsԎ [4dVYmՓBzS_(8bUjn>sq/]e>J `tM},4Yz.EN =o:|ʚA=y{%+nN}y9`$Fgw➓\tn8"駹tGD*[ wd9VިWK‡Sд=ݑʪ~Ob]LJ?MWg&͵Sfn3B8{ku$d |L++?]<熿v⪊4Sw~^LQ/<} 8pI'A8~p*dcuK Cpz!"p,ϖEH~J0M=xȼU7ư ۉ}+4ylpM}'&;\wHu@mW#Un3A9!گLY#PO7_tXha/õP`Hvo'b!D oc۳`"9]JҢ@r& f f;);ڞHk(ԝKg30>̺nޗZ' ?EH-1&!~o"9a}w0* ݼ*F,l닧.n3ϙ%17 >41cC惌bo .᫼!,[emێуhpvc `hCs:C~#z;7h8YT=f~@%nxA,f7-Ўrkz-G8 9V"nUcJ%[5i[Y#@v;~_>+$9tr01x?9DmL;FpvޢgLr>^iccrjELYT19!G8u0_=[Lof:36CasR?&= XUd9~t/V.J;Xa'_1bPGv5<[g1]-gb (}/.YH»6j=Vxf-%~_I}kd<LXa_qd)@7W `P?<:J"!B2)n . z-QqD04 N}{*GϬW0W j2!Q9Z1/V,Rᤊ$8q` 8cJhr5ք )f+ W-8,_'#W e}rei6B+9ZK}A%ykk#w 7_A8-IY~;ldz1\afM:+ԟ SR?~6 lxɃu'H2ywy˔B2!+]\ST *N9u>Gf˰.-T7#%:y wɃzzpqwQD#w\È>yz82CtSk-6ߊ e<({A5@Mx%ƥݰ!w-&sVH_GwAUehqP/>W¸L ES1b_>˞jթ={Kf Lq ›9BdZOU׬jl5ǞLlOޘ#oZX㗿wB5ܨP(*x٭80$Y8b2:A6Yf|h\8˹I$^Kœd`lz+Z'u\`y-F쏤=S71H,42[o;X{; zSI6 ٞ #C>HڛM=7+=i7Aܤ!p~H^m/cS'd 1 y5c]Jٸ5sF@|6+ţ }Tbs/Âl}:4+NaFo"R#,f{#H!Cr9j]u)ĝbP[Hv۪ N1 `>K|XJu\@r޶MI/~Jbtv%CˢFkגXlG~J-pDllǖOoP-^,D_F9k.EB-wNG %r?K^{f'oGZÝd}jj953\m_?2۞u0ΞRVi+ <`#TcFn&Ƈl5$Ԥ_abۋbs\ga0wt(t3;T]y?d8싆F}df/\-O [NPb,9zl%v_0+h]Np1",m #Gv&!],&JkCb #416D{U!eTJ~XZNrGP y.yJЀ2[fj>B*4يFiCO)kͣd;?% >i*aHZŻoXÊvb`ܛ}Y*E:i.jRi`_PPLn2^N:38AGX7LIQWBkБJo_N[,:B<+yl[|U`['-XGFD2*<d61TeOfyf6,3s鳴{nZ4 ZƵiP>Ls%'ě7Z" Mo\EQ-F?ݗ7#]iJM6!Cˮ"~Zw6+4mB|  s?FkK8I G6jKh6vZ/Y-dB)'DbiU>| $F^MB>6٥tƻDh\If2!5T=2ҽ oQoKcгeLrNV֟p'n.K.$.~@kRÁn2n&"{6g[l1ݺdkO>q5\m4YjF򔆍8lܸHҊԓMooG0nGq# S0v&݁3zx1T*z:vG6 }uiKUM<гHzk?Ъѓ~:k >U|hU]l6]# v92uq3&cv9{cvi/-cL`v21]N2kWm nz54ҡYT0䈽m~ŏL{p *25h٣O_Ŏ`&j JPu4joB~;G  7SȆ&jS3c![XLz'(#2!o<:$vD.ho8# W851MOmVUM4] ̇HL5YnPsم b벛Őp=.!)_y7rRCD kt4wJOc GTE^0^ vI'Z ci@rso@M JiYǭt*+c7bJ-PܦvUqUH+s:dّ4`hz $-A)-*VHNesWg +)gD wӄQĸCП30~S:D|t< ,\M#4TyEDHz]pO[l * ݫuAJ7B?b-їY7GFy'uSnI]thō; LCQCÞ"3pnIGZwNLbuv&U^K8{/jG{dhRמn>/u˪ 5 tv7O,3$X_1AVcUra#w,%e(/icJUln8K_.44Zza(鳺5BӸl-={:*1L DoEJpfBQM[Gӫ89PtޤIꂥ= 2=Ҍ\nıTtvtFJ`l%t Wsj;SdD 5ol`t*bˆ)ڇky""?/9=۵UJ[Owz'&qL2#Y}1)z!hQX0nr^pdxQ @ˑq9pl}6)' 9MrlJ эIWQ`0 2 tj (ќxQZn@ZcMK ;(iKx0Mur}G 4!V|r_bΨG|? !ÆkdF7\ :4)!ma>|Z0Lk^H9Ѹ/UaZcz'|$(߬Ry0ECFlA[yp5j 1olc8p=OP%[d`8'R$&ނYsd(U,<) pm&Y^M1)C4Mlwӡx11<2#9B2 Ⴤ,ڻ.lW0a%mc\dJK.2˜TK 8FG6#0 v)l31^?U׹w>UUY )ߴg8-/BbXaMuD-p²Ux?@ahBx/޶=4]\]L|kܯ&aʴuŸ,Rȵ>2qU5dFsX_LYsmxu8 ? Kى*'2ŗw?!;8Y +!; L\]c%mruD – ā{ǧVE~BUױ yFPv+>n8?PH;$ǃ>:XiqHa9%A:77P֥C(`bMp\׹X].7NP>6vZ.?=FnraTq3360YVDb^{h3E<e@ndʊOΊLeqre<$xaN9/z%CO@gAj9 7C'P+RSDUHg|iG +ټܸ30U!# PD$Sh@"lo@ĉŝ8f; 3GQP_: x\/*˷:.mE/dx=X(>3z۱ܺ99*1X_f-ّǸ f |H#\/g&ɊW D++}ֶFa:Uxkg,Rɗ#EP22T96Ek5W4 #߬XT 1q.딯J'j,f<㫎O@x`̀^$Nu%>Ac,5 }ohVqB!YyVԣa( !|ayN:$H!T0RLf>Io= ufvlQ,?_{~݃o}5^8SY ǡA(NT D鋘4$Lia\E*pbEƑ JƁhеkJ$dRX¯dSIӄ4ɜ6G9> ôщ'mCB%mG37׷n v@J*hcj,8^?t8doGݗ[JND4?l{ߎ˾gN+4ݵo3?8$MZbӬyEG)X(S߰Aptjf?IFG!B`)R2㓆)gMҹRU \ ^lʎ߿l+-VŽ| v:#TN] 0 /r n~yh/N.~asGdgep6N/dūw:BSZUfz|I7g9BIhڰ['_?WzUV莠.p[s@e-pC2~W'9uEf?au#jBLۆ,CCgLdXau$Arw0[.+\M";7 g:HIMĘ+"Xh:L8ZAc0T!hSg:[bPڛ Ϯ&`c1}B+IsR_a̕NhٸieA|sL5='%xQ[zLTaxBe9읺6TSqJZrTm1EX^7۬Y˗ KK>xŞX/4wڐ2*O͚̓BԽZGh}ߨlm@,%Cf+I$I\ ޚ˯,V0bWu8[0t<HโGwLq˕tCo7GhS]Ӊ@d{0J=,ƽ1dwvJю Z膆HU)}yTW${$M'Q6yrgY&L'#.$ac˞StE~HдJ,үQ ,Le #$0;T!Tn|^,F~uC!Yr<8D#C1@svHT,-NuiXޞeA`/4NO nzĥC1/h<Xfv RAP╽Zr9 !r Ҳۅ0dWcl9sA1/FmK'G (SI$K{&Y~-#֠ww2X5bpזi/Lķg;)ŖS-рmYEMҭob0cכ[GWt^0WP47G h}:]v~ =)nli&W U UYpl/(ߏuLt>W_&[nxRoȠK.Z\9Ra]>Kώ/).v?w27h-LMl\7Uވ3ScձCd27&,TvX˾_92MY7P}r",<#?*k,{>k^hqRdgi@sC(x[:%;jhx 2C8&=bP`(Wz u9zY ݡ v镺S[ tkr>Ǡ;>@ay (q-dw3~P,tw;u;4 #C+1^Td_@Y%ޚvW_bz c|%?YM#:+9F•}t()Ĭjfvb r9̛_,`7kν!e (SWfbV7c ߠ퐁/z|Ċ5Yf69ݒƵ6Y @GiAN?ϊN*v8Cd~߶T:|^Ln i0J~$wB@{]2i~N[f)ɲ2N.2SX|)]jm9`1(^ŐURjsnĶ q"E7%gwhO)_+kYFn$0'9e$on> 6,J"U S؛ mj$e4Lm*f{R"_3u]hbBB ڒgjjZ:_{7ENqF{pqqG]kY:RiEH!EؠNn-6#^?* <Lj=e - w(]k'"Y+ޓxi X΃WTq;@M U%H,k*A}+j/9-Iqig*nv K8m¼/Fٯ~gf⮭rJe.~%Ň%@ճV~FWDЖ1OQe˒(<]\ `$u#9!Ƴ"߮0Kܓ;']ၞ#|b6& ϯ8Y{ԓm"HGY_ 6 F)׫S-X gĀ"dX\W&LVmGPluc?Mi95y k/kIזnu=: Q_ ILjLffG6nӻazcw90ٲty=N T`愛Vӳ(rܧ;k76 萸a6v.<1E#KGΐ`5YS?"7j op@ ۷b RƠ-&ny_|E-z@XB?:8= Ig R$p&6=[%)-qtM,ۈ]=VGsY 6=ժxHv=S  utv34aZ7S/o}nppazw0+·hfr|ovҝ#/Ie7y3"!➁p{ k O03i`Ün@RQ{\sF;CFL2BY0F Z͑ÃX82ݢj#MN^CRlr:'?>Nj(,TFzH1R۫a)\Csɩ"u[h Үhz_22%=F][Z3K;)GGgƯbgm`,^ G]ngj^d-;Y덴xS& UXP-Rd@)jN{[r솾׿ ž]n ZÚ#Qq(޸(Ua Cȋ`MsO2e h/=2֜)$keq>Q8$*#rDVq4 0,3 j-#I #^)Gq8Ӵ_BWO)zq.0z u, o\whfd!CmBCF}u 4 bO_$~Lk 3Ad;Dq)Cիb)74HbZg=p i8HLZLοoU 5?`젛>)2$@D#aB ?Qb,0-wQ>3EX+*"{| Aa|>I_`e܍: ;;٢go 3nHˬ1#[L &mGϔ.C%TaJB\f_d'քi7IPsV:}=UQWoK4<'j9KI>{L/.jËS7h&98a0;%ux Z9+hB&ٱ43 9s(znD0kQ:+P#6"zzk'lc8p)'\?49/;p/+Ѐ|/>D E=xD!`>IqX;I@UށI/d"SB p S7(K$7N9Ԧڻof4'@gPqX%Yfxc*ܐ55ݍ~ML3/mՓ! ~KZ=+4lv_#OȫJUr4;| mi`CABIi{$R"UK?$6,E`MzZ\S x2cX26?ǖ>#}c: jD{]qv2w?.3_kdNN؏`!Y'sC)qǺGLf@iT'u 6dN@d}VŠ%>ŀX2 |xQ,LGj ŸI4U+[*hQȽid*-qܱn+cx망 t}$"FTXo"0NЁ^̩/p@=EG( ƻzfU{vcKiت %mwئƸ}/5( s_Ȑ5oe֋ C7wpIt1ӪL+m-jVrphbdaC^KelcX3":$YKv&=dy3@9l0 AC脬P"s֖x9\ĩTRIm'[5m$M Zpiՠt G6Wk1endstream endobj 299 0 obj << /Type /ObjStm /Length 1731 /Filter /FlateDecode /N 93 /First 815 >> stream xXˎ6+/ PM4M&>dKKҢ!^>DYdLiҢ R1nL(0a${(=SKGəX3v\2c1+f%kfAi42x܃HHQ!qs Z{` *@BbbW,**q vRYSHc)lPxPJXuT:wȞ FdRqT8+ T KPVD!eQpAKQq@VIj +i` Qj "ä"nli>44@$Qa̓ M Bs?r4ܒ4<A"AIKj , g)KfuG4UbL+ Ut)C:$%Hy$%!x0/_z{[߲͡훶w=~U/sML);Q g 桭9f*?*vw}Bˊ~  lQG.4ﻁB ߰gUo]"˝'II*49<-~%noCG䢛Z>OըHNH;͓'v}]׬u{n.uԊtMBWO {])]0A-"c2;YTx+R}{p(C6ۺǾl6Mպm߈mfVtzUm!B}58@G+zyvS}Uxor8iۦt{X_5.RKz |v,*=Eendstream endobj 393 0 obj << /Type /ObjStm /Length 2498 /Filter /FlateDecode /N 95 /First 853 >> stream xZ[s6~_A t:M66d-6ItIɗX$q&@wIV(a Z/_ º6 $ƘR"nI$jAA m5:VW Ae4A }7򾮦 ?zG_Z 8j6u~q^Ne{q>_=Uch&"_崚˳./M!P -KKC˘g\(ig!w_3d=g˗˦8*OO H.XdryٰĆnP;FALj8%:&( VJ^cJx9 1tL""6Om<@w S֪~y^Ȳ+5'LNE%rQ6f2+>bj?\擳j'3T#_y?G=>RKCV*:cȾrK=Jn1XLd*6ZL-%gu}뾶Z+뻋tjK9L|˩w G4p7"56 ^I >\ R1*ZVTQZ}n] }'*Tö5F]]\Uκu%sk]c1=AewɃʼ8le"Z2͗|$cj鮸{+CI*X=" ,T҃HdMtK8OJ! ZhAhG.[)ݫnrT05*-@8Ihh $!5<)$: Abv]P'ܳX3d2Ճi;>fcvpr.mm =q?;0/nL=ɕk%Tv W/~O@~$ RW.t]bea@s}+kZ5t/x^Z4`pucW1mR[A̚pCz1rncfwsjKuGR$ǦW m mwI!=k<=@S.^FC&!(ZjVv.QKU(D^勱@xP[ A& %LJ_B<Ŝ_1S҄f#wOR'h uьUs׋ ?ZZU0ؐxD??Ŵ'=[@B4H:CbkhB=ɼۙ V4+FIwqK iw!~;ݭ >Ꮻ%#&OCG_`lQު޼Ȳi/e=+eUeWIvO?zJٲh0?{]*$U07e RY,zf|jfrU&yNl-qAՀ~&&B)tv x5Ӛ$~h\. D4*C_E/ZjJ;ALʴ틕2!58Mť */.X Bk|+^QһЕ=)Z fKx`};=l"%۷CI7 0rP z g8p> stream xZ[s~ׯ#41HlՖ/vNQ4ņ$^8/=Ņ(L(B={9K\<9{lUVR'|Mrgu1}j/Ou:9?7v'tbM_|}R<iLvxK75|ftG> qΉ+&̨2XdG]!Nĝ3SyA9s>Gih˓_O4D%32u ;'ǟUr ヌ=lY$i*qJgeooz쫐*\L\k N@vCIdsM~@gf3 4yzcKD+oug<=h +ұw"kc:ET!e憶͝.mI0:zya/[VQJ1;d;> h.3v}Z-Gy+R,2י/|bM= vZW)pX^尘[#\5bFvpLZ>ƭS6`i_хy*]SS_׫\"㋧`M,chɔeiвCZ_:$h Kڱ'JҪ©%I46"H5D R:8鿐M=OJ{Zx&$HD5crL&Elx\ 4>Ǵa`\j1Qd&Sт }BơiCj-aP*]z-C"ef(-  &Y+ 37Bo|9FxJJ#o$<=WiA>U{K0iE%l@]D7:њY[2 RM7Yu6 s.0v{^lD\7Xo2G'WQv mZ.c1({`*sҖB]|Z%H05 A$c+~ 1M6~a h_b#gOD=VQBĐҦ'ҫh0y003eƺXehH';y%T@AIt@^ϲjcpO|1Pb];aX>,9eq~LfH/и)"ҳ0h_C663 $5%lF=9?O ΐ oe5ڌp1;%k0(4ب{҃Zo:P[wjTJئz{t>2:5Œ#=.,%mDG&ܷi0ư;a:X=ZOxLAO Uً0[-H@Czw^}?Q3[m7rb\]rzy8䍻ZdrÓW.&ƒf TC+NX$01mReplvq-vXgEQv]? hӪLys}&ԅӘ49.|9jzU4h^d%^5uaxX/Qs!'?zB G9t( xĩg&y߹_vJ42Z y=/?2|]jFAy=uI\JѨw,չ7;xƶXۼ6z/`CxMY,¦StVl7bDfQO…N O)?!ޕFocSf2(j:E^H^uAz^ygYoEr^GT0&P'ZKO /:)r~"z)lI|/BC~ʍ lǐ;ٓ?=H!Z3ٳf&`-A._$άbx>ˢ j/ȅio ]-ng3!H(Ry&ikjF{[^(sZS:X:BPHyQ(}gŌPkt=Ƣ49/c;T-HEgצ/uV5x¡BB96," !0Ec*c ժ=ϡ.D?x9$Ŧ'{^px|GAcKOq? (}[FՎ\Ƨ-/ą 㯚enߌj7ؗ2Wf~יendstream endobj 490 0 obj << /Filter /FlateDecode /Length 3506 >> stream xڭZIoHWsP@DXŭ9Ά8n9- D;>_vb{[d4%w.^-G&2QiFEVĕFWѯQumn^&)2`t>~eQҴf㉵6b=NqQ[^?lX64v\Jh?ö%%Z䳐83 릈[1&./gA0Guۆ(qt5ԍjpOJv exxg VWq׮KBE P"~pzLJZɺOSr/eN`/%ƉּV0 \wœlEW_'6OjqP*uHbWI"j;SPȉ2oI<GCq gB=A[Ekn Hjpp*wu< ?fZD%=h$"xޣת#Dmz@M=)qX[,L,S)laGbGmK,mh|30,'{YdW)lDwR^FߠFUlظ4+͇S#OpIJwѲؔ>ZunwbAɝ1'4Ai{8[Dt PlpJ\1w+RwcD5%c\5[]/y聤6I8iǮGwQULZ{z*{E`MOfQ{nF KV @DHҢV츭-xLqmͯSK[ߕl#ߐ+CǝGr5iXaMaqK(rTl>墫6 r5H~-B8ծzۮVH tVȬjf}uԫ`v+H|7CɈEq@k}}(zlӌ])it+6?h %+;&nxۛ^HLɉfCSa6fc[/uk11; `Q>?ty1OgȴDf?'#qnǀl..L&5. Lb1xzEA3f͸<ӓbknW5x9t*ؿlHM`tNqw+=q)̓23#ZJpCW5߃Kǯ-gRf('G)te,M᧭bh"SKWƃFS@TVRzw(!&m0GL:9>oZl4ĆO'~:ܐ^)_] W.7lJ{wH h/RJ߂jY\u?p3">79F?_~+)/H"P%J$tВ Gb$Euzg6t^ϳV #Ljjl> [֭ł)IIp*W(3}@8,l2\.N>}b)ϱҼӸO]HwΧ^3)] `Ҿwο h@/Tă-̽D\@oŸIw>W=%W䱳K-i}A^/qʐZ.?I5oh3I 7]刾vAnK{Ń\䝞mUcWnMB{)p?mWXgh4sw#7@'S"(c<˕Py.[VZ-n ?5ƅ:V%p'R(􍲾ytul @I∄* ܌xYrsnkK ~P BW-em/UMWj6 QaOzxXU$@({tJ  bbZ<џ^jendstream endobj 491 0 obj << /Filter /FlateDecode /Length 3195 >> stream xZKsۺWhCD$ؙ.lىkeRi]0mk$9o@R (t!@<|@q޽{mt8׽NY2l7Qê)x5 1%y)χ_XczVuhx3@ 3&$,vÁsE&ae?3.Z` ]ڀjon+#v uT(DgVE:?yuALkJA{WblX*?.gS2zrXn(84߲q%%w_3:To8yl8U R똨My.`^tSleQE3\!ҫmyL`|<2Qe^8Ya^2Q)U(/cj)04Lqd6mŚH #EE)̵5""㞋$ԩViRig%8Fh$Nk"D 8&TRvMGӹu%] #G7h~L.ZBMX3}DV:kQR@+J{+='̂ >^]zbR:7 zzu8ОªPz0 :zcaeu@*B^JeЅd81 NrT瘝*K!KYvZ:K:pëRnxdYcfrW8aW*=Xg XS_o˓oxJtj &Fq|pE_Cv2{ojT(Ӯ8&vBdjNMpMʐyl+?hujwLL^ݦ`bƨ4K>;U2C_d6O4v'sR:xVEScc;<8MVAr>dcn0$O:6{Rf5~ZJMn 9%$Q!}h1z(Ť2Qi hcrh#~wrmb݅TXg>a@,}T CgW P匣Zs>hNO7e)&/|uD ]x5BM}w$*h - {$D4zQvsfhxa;ҁ 86:d%`]a}a 3ās Yhˣv~X{aʂO&$t_E=6R,ՇB:ai T!C ?,drq+[zth\ zu./B|xm*!zb:+,= },N"l,TBѫߋ Ǒ)|pchQ֊*W[Ѐ6%pq%v!fJs'F+.=@#UZŮ:=W*=='"Rpz\yWe573Pnݴ^4&ȏVP \L骃y؞;氈}j\}sdi,wq/> stream xڵY]s۸}ϯ4Btd3NZm5$'^?_EҒt$f޾8|M6б\..Uu_I<{v-*AC%&%M#kmt bhah\}e&z9ÂyI`ŹTj8S,c-{:ַ<̴git| [aAې5rp*{˨c'HSJࢪ;\rX/.bo]lbB+Hkx*llCڄen(::N osZЙ0;+ʢ* WRXNfɣ߆ִPZ-qN2V$()S\kA4 TD.X j$/T@&i3~J~ F0ɓA^` m&\o;]肭`/lI>ARm$+Aڼ H({+&.F1p!t!f0!Q?B"o$=a=T<8<܈:xTWh6Ĥ.f7W.9m azW+Y <0#H?mSSk)ӖSX0CG*&H_ZK9{%-өxgc&yq?"fV= !y_ uAv֝_q dw,E].Ϧ1V%mUlt{205Q6:zOCAjW3тee滪x{];^4FKMtJD8 iBٿHGf贛KwOz\z妍6[q>!J!pP7u9(ye5;"w$8^bRɉˆMs$G#XbYЭEҙH%RYN'nIxd]uEf 'VJ!N6'-zp9CWsf]S -f;A(p{Ӿk/L#$(vNhX ^@-OG*x*ds{ r1_NgyXRݾ jҙuc3"C%K ȹ'mD!f၏}cqI@.u`( qK *'ϟN嶹ȡ{ -ҌO#G #9> htzT {Cq޶Za^rE>hW 2]} nKs9(΄9 ,`"zj|w7Ng#csL4DNLvf$Q.`"΢WsɬJQS8c|4oYQ=ZϹ_/Xmw\,lQ=kʏ!(i:X} y[>p[lz̍O~[ $/iÇ*We dgͺW>$F'7&nEfo1v=7X4D@M8M#4A"qHƮw >D8YۺLȴ2(!XM6q1Dx?? 9ď|uɕ W؛+yg}3#yo,V-3s#CgM.h&o:t3_'_+Z:p9{r^ Nendstream endobj 493 0 obj << /Filter /FlateDecode /Length1 1495 /Length2 7507 /Length3 0 /Length 8503 >> stream xڍWuTݷK.n`afRPNQRR.}/~q׻ּgI׀Wa !n@~I?_/HfuAC((."v)nZ8@J I%CD %J`-@ PG!(6E7jv>6 1ygjnm0 qW i77I>>OOO D e8yP7>Az@lh!5$`:@Q vn`$pkAm pm;ܮ0P@5 PtFJ ]po(`A: M EPx [~e((W|n2V ~էEBlnwޛ#v#<c;(W+.|Fp;DMO֭o= /&& ^6|1vv6pݶAn_(toD ڸ!P8o? P/,oufü>h>%#5}}˭ JxEb1a3邡VX5 G;=Tǟ w.mĭ!_G-!ek`/ sawyBN&?Xov* a@P/.a75w0(@A5Q6u+.,{]e H$؛oWv:m!^ n!v$~#[A|v>?ox>>?m*P~w$vK7!@H;V7z~&>|ugL㱮(}v$>)6~@-XxSdJd5.I9UՄmg7D|.jDnkONXn`u<}SEA]Iw\]ϑBw1ӛK*GZXQrwAg)]"K<ڭ-B-䍏5 FV>*S_Ds7rXuJ46R'/z)'SU?uб&^B HAKw]-C/+PեUCqY8lCOuFWTiĮ;Ep '`=tZ<1XVqxi)/yCO˥B{H.}}lhYۑ!X%CY.:˵*n,9A )h{FJOa#K4t[K Oz]'a' W\S'yT/Փ̀j$'c'Uu ;ƞЧF:5;MDK*J^U-6pDIUUqc7$ʼd8?ҰQR- !* %舝.<C71Xvq3f…fm{|TnA]kw7DAOXAd+||we |>*7<*!æW_DMcwVH>C*,U"躔)mqYXcVqc$fֽGcq+I:0NAP6XO|kFf9%I_*RV&PR)rm0[9IݹK7Pߋƽ/rW{r Wt8q%;mrib˫EVxKpuZ/ȇ{\>.E^yV}F\߉?dۡ #h #jֲc&zb :XlRTJo~:ʁt[HyRf1<8swv2Qcxv\_?S5شoál\om6hZFXkҴX/DR HmZ@zLAem+pH_d{O4p+<c g8x4߃lRJgc۶1YJzliԿd UEbXq_Ϋ7<(Z%Ϟ<Awb?Es> n)bZ:V&<8ӟi嘎E3^(|$hG2n Ƌ.&6V,7b^W_ގM<gٴz$:g׶hNU^(]Li|.'w$&h`6=-@v<8i [.>"eزջW'Z0Eǹe/WWz[Uiة5`s[1oFrgdXnWjxaS ZJ5#'jЙ^MF`v{G+א{T-:=mc!:(<4Zne҆GJE YN/tɋ$9mcNe`Vl3 V~kcX!A4֓7{r;g8JV,- "kryV۱f:S>H ) eB Պ]=b}h'=l+Q'*)cL)kXWFg0W~ZPǿX\d#U-+XdmM/y=k$oJ6 #s"13ޤE-Wm^:0fw1pTq* wa["EVyW:% L~h3~4BBUC*nѐ$eO2Nͷi!^ɣ./dr‡q4FI_(?!.thP*ӱSaNܡ/_Ô7rڛccui)'\xum"#+HpDOܴA Gӱ FӁsIiAMʢEG`}Np{_}.]^$nO"<=I_n#> m.$4J/X~΢Κc 8ݘF. e/ /ϞV}4Vw o#ݜne$dkȩtAƏJ^ IY75ﶗ8\/ m3ץ}(F>аzo)1&6C'@11-5%O7C~),SOȻZ<(AUόqoYU~ecNb44{`7;9ؓNSԥTXF" g .\)'5~qg$cfQx"sX܎t*侘Qm fnvʷH&-h,_ C9KL̄TlYr0kXgSNZ>LJ…7Q "7ݎ"r- &I]|CǩsD Q=/b&s T&ԢJȈ{OĬFmMȘjX[# =* y51OxqcWg}% e"aT<7`=..SQ#PyNH'| ߥ7yNWC sanx0 |*]'+7hוq5>T, tdaȵoh>%Œu}9^6[\nxFyrr顑[YC@UŠ2 wB/wEC*刧6kf$ns.MRM미#(+unw *L.+ӲPb= ?"WzK!#M9D{-N&?9A$^7 O8#AcoRJW|<J8T.2ͧNؗ U vv`H/$b/UU ɭ!&ce* O5廞ƭk[-^MuIî=-9[9LG[Tqrf 7M_2Q<^ĆU-)#c]+!RPg/,Ǜwa]'53=`;#H[jXm]@݊5E=9 Q_ץ 8ib<-}p/6IɤB߻'eEkt]|qc~kk\knɉm o*=B*O$duι9_6W?xSxx D9ֹ^o6v^Nc˜?;SKSs?pvDwp{#2r3j2b{Z4).j9f/3:=Fݔ=D~}/pq63j٫7/r|Xolk2k\4 o(ňMlRm9S-;$jckN{"O_U}ͬgM&XۂSd|u-^m,-ݤ Ϫs8+rRm|8+5Q:Š?ZOS*~ N[Σ@,9@lG_j_cZCEMxRmhyk=&{O $.+jPJT\5ǃ+Aj ^wSp&(7l]EWbeytÍdΡںd|W rB8 REMD}ŅL4G,zOL}ĿjS%k$sEI%Ƌs)oثsQċs5i8cᥚQ0r_y~@@#d<% u[hv@e/g-;(EBHEpoX[Oy<^ZO^rlc攝޼A CC-ߵ~Z6>@_EgӲbFHIHN E\XH4XSo0DPVx.~QN7i!=4DW򼯉nPؗG`]T|Ö(sGZ>0q=,lˍX`L<ݿ6]?)X'fzv~)O$mNXO{n {^, +\ן/V=E"h_{3K> 7盱X펰sG )ض&8^է 95`}׷APM!fM)T)X9RG%z+,7d, 3>~,gAb ƫ]ky;_DkËwʫSgmѿ>}}Q͆xlb&y}U1 USɟIzLp*B V#ȥiSF'noPnQHzsqj]Gǖ!g"Ac*]f]c Qq9?~e%9eCc.8\oع턾>!B|ۼ5S^3~@*Z@L}zhmFFx &( ?drvpy|riBi)* :3Yula~jwHul!L0 #CAÅؽK By4c) /lp!!Ns/q% %Q_+n"%%i(ܱǔ< +aDMR!FP'৸,dwu)%Pt&iC$/3Y|éhHߍ<,7uZeGM<*'c{' r{.m ǘK?,ө \#&1 O<\*ȕ -=5Z)Zu5q !@CTMϒxA.oGb:C7sQWwiBAg>BDU)WW5Nb6:TYo-MqƾBdnLOY6먒KqwL;ٙ0OP$RܠD.dǀݡ$Lc<M5ZhPwD`!'eV롏j[wج>\7vF59ep0bv尺fT\z{Szf9GՊ8Fd_'P>s5 ,v6s)V VE魞9v<3 )]jVPoH63temF|Z31cEׁra,OU$9}!~?|endstream endobj 494 0 obj << /Filter /FlateDecode /Length1 1428 /Length2 6422 /Length3 0 /Length 7389 >> stream xڍTk6t=sA H+;_ Xѹ|a3\`1,7A:Id` ίܘ~C#ZR9-L7tBH{w4Sh}%۴W,)YUom0{:V igi+BT*q}xefB] ϒoB)T"͡E/NH_#:C^8Y shuyメӝkvr柅{"MeJPﭲj`Ҍ f(WHڧ F~\bi+=1|qJ xղp3\ckǬ&"u<>ŹZ4YXOQz"J rq 5YI,i{/1Uy-֫_7 iGvh2,:g/-9|Qvt@٧4e}%ei mr`Y~v݋[\"mζd4%H2 JxlǮkɩr`=ӵ^Ef U𘪃 m(Jd({k_>n♿a}M.,e0Q4J,q{!yZrD2ڠΰ"tq@Awְ4Ǧ%;zkRyM[ɠx.IK7+%4 ѫvu )kCfLw{F:߻rß ߓ} 5ZsQ,ij(i%O5~P`Ƈ0c>YLJcFo[+Y*W9 8蘮_]Eii9ZeM}D'Α_=}~9f`̐ҽYwU<$ng,49kqa|R6'OxK}-e}(ө]pZ}QC=0$!A{wo|Š*;/*Sd2n\YL9u+먋9MlCK;6[b4EL!^}"5Ih:%? S2O óO_'Q/2.}Ӽh=ݲ;42Z-mrZU{C}C{wLz39r4L?^kS5>ˑccRjVoo4bWbU·|B›m<}~uu'bBYˣzy](5@nݩ&1*j}N~epo>Œ) _+P M䃤.xBsh*ɞMOg- aObrNX`*Vk cFH" ^DV Kӟ$4F ęګ4CI crq/#_% Gr4Nke7jE]ːg5hs#1f1kZ*k\r$N>ԒD}CDe0Þ}`&\kLs#к},^eV 2yt}c2- 5=*bXtbRV3= 7&eٗwLS3d{:zB2($|*UCf6AC|n+ˁ/F >-JV(xtYoTCO9c1;Q8k;`LhM$;(?xDA8x Ŗ*p_a~M @=?o=ѧ< ʽmukwlݙ$ ~?/ؕ7_&YS İ>  f9s:Ez*d\kr-Xn&MM>Mͦ&g"N9gZ{G$`Wuj~!jIJwimΌ2cväɇ?u*k>ގ2J}\-`[TQ$qwGsbbvf?FZL|qާƳ@Q{2t;~1*E@ӈݡuO\E=i8㪰*2m#& N7/fQPZ5W+yaDN،tiG"lNxrz )QII{RP+ 廘Ϲ/]3 ~DRu)<r+OGO_syhd1Ƶ';|-rd~YZBH k?kUE0!֞<;1aֱRdNW1<*JJTi4* f.䜔wb5/kS=ʦmwyn΍_fh]=LS"݌kĻxeMưQ9MFw|KS7AI]agzfmTzfBExX6QV'B;uRU 7zg.\o՝ qLWi[-5 E0- ÛئObl=FYnT+*? j2x3vsvgm%m?> c^l5EpKy3=bL)ěV$wCL5ϑ'T'8lFxy;C9tIe4L&t*KQZ鳱4vw>",_k{nw=b62.T61Dd7:ܕ*uv*0~=iPSK\ 삇R9ս?;T БفJ5dUo,A"3I웵>"F‹6{W%6 u)>^̱X2ӣ܍V [Qp.}{j1olbcסf ;_ o٠oO] v~o,#")cHbZno֕M$33c Vu˪&"c5U{lD[/iޜS%zc~Cӄ1uи=x v9{B\-Ja>s0Ff8hռ7r7Pq;NIĽz5R "AY 4>wHc_"Էͱ]l`0s ؕ 3R˕ K+M0y;zQQk ޢ򏶃%r':L'y7=4J' /e7Ĥ}4nD<A=Ձa_3z9W#lihQ"܋ _?c8\ 5blr<t$ ~Z5b9Ӭe_䒽(QG щhɕ]z7V&YnZAb7`?!,mwkI5sl86jzd&Fol)􅖰>B;DP7ԲI`+k_d'}b޵`{K#֥3"U֊JǵG…)XC[3KnVȊ&~.ћk!^STr@jEL> `HP XkdJ)尠~TYΛS[j8_>X\~fѕK* ={}x} 1| ë߯] Sendstream endobj 495 0 obj << /Filter /FlateDecode /Length1 1385 /Length2 5961 /Length3 0 /Length 6893 >> stream xڍTuXIHO$6fñ9BZA;iDDAIIAJnз~dz纮>χ!=Bbx| 0 @66#8'`3(`0ʧ\AQHE$ P BK p{6PQ>h_@N(,..;(Cá$Pq\uB@C*qqCex^pC{쁿@\`/`90^4 x@0U^ku]a?Zxܟٿ !P(#p Ň!H_@u+!@y} j?7tw>w8ז\2^CbSaЫ"Q^H?ik{W~c$'A Hs¼N~W{c]Q@U`p1h??`0`p$Wn po芄` 7+٣/_GP[S+(X^Q0W@Łb +ANHPNꯡ=dB0 ? WS/ Ϥ@Fp_ '+=hTo)+S@T!tD}pw7^:A?ƿ$#az(w  WJgЇW+fdH(E4+K_ @~>$ sZB~ݪ P4Jf/_oM`0(`r u m<]"N=~ ;Ph}өjCp iE#4R;gQ(h]g0~6B '@&kn;~ў7\/CyM3U֨2oLn ]_:e8R5LG`9c%1?¿ѵ '8S9u}6YwWqׄi쁵RT?mO?c5~;3Y ,Ÿ/+t<-yT(ÇibK xWŚe-lx٢ mequpu}  t};dZ[0Nm۵RзqNO^2PJmJԧޯק{3];l{-<$aO@g6jz.YA Pbە!]hWW.D`Se "&B-Y7 ˬ:|,?~[bqA'ld yi;BnV<1bmp XDg_4X\?)xTM@!&>S U2TKx.'n*.jDHUT1=yzm][־_c=.4$y 'RUHjNܙJY&-P@!i4AA'=paVhzJ˔xWTtF6wrl|#qLhnRٜ躰Iyq -Y[\ ! u%dz˽] "b̧^MӸ K!Htqgw3%K3L@zSYPMB^DsGpLYC:4#DeJE%KOTq 7:wx^2]|$މLrqzn YqB έ7Rig.\cP]Hb(נW45{>Ln!;N yl9'˺5řL &1XgWqc3,xgO !3[NE bDOiaƤ)~r~+v{zkLNfJ%vBSu%u0chd \`vPr}')~֑e6L袂 WF#eu|`'"xtzPp"3lTd^v }tb{b_cۖ/gэ!~hT@zo>TWQ8uC2%TlEI^R<6咎–?.] L,ܓ,~deGS2Ikg Na׈u"oHỌ83ZX9Ckn'~ `,g0#&Y9st{ŪDQBvLekxn>V3]8樃iZ}s 9mK3hSSӍ'n܏RoP<>4۽gE=kQb+cCv >IOJZje Сsqo Y4=H_.`[FkE|י8\\1@tay`۹{!hR-8oZa|ǣ:Qw܊:XL+&yG͵R3l ^[+7ޝKMV,# *ួqv: س-o&:;߯s UW6ͦ\hfH/]D&-zmώ(r$qiKC$.tX+_M^ɅvE}⭜V3kvb̺.6d$9f;wFo}EGfJ,?$xVZH./Մ."N$6h$܅68cM* ҁ.gmULZ -r8%M)=zk`cϾ=PLe]nMtVY-Uɭc6\V/V֝.fg9:y6F<_@CN)&CCiumr$~ lSA~ "b6[2N4#kMO~'eE:ӵlınu];bl( ^IJ\KgH^*;u菉Xxws/YG [a'3=Ƨ'_^y&u gH;1} "EaC/79m[23ueaxBZϨ/ܧnԕX[ :B-3 3h΍o)SOiE_^|(-\n3b_'>wMtĩpl\kLeS*z>!!"K5Mޢ2xDc̰y慯&'yOTW,/0uic^/W 4FA3+ft$o=Qj OҰ&\S;]Z w`ePYcWU {46CVUå.?T lLͨsrx;< I>z]Bw;41)l_sx($XmD aM1.g|asn'D|Ne›_S»0>Q{W&Oū԰x?GmI4w.8xP>?%. ?R&"(|SEFQkFejōGppk&2[Ѱq "Tjح 5rdҠ|> stream xڭ[YF~IA6 q.dȁ#if똈#}TK#;죺.I9g}[*lvmUXm&rEkb+LJMg_=XQ.3}y?'*rYY؆{݇&^ݿ[cϾm*  6yV?i㙵j23U568LNi9=nK . )@cO"~^o27~-R jǕM~Q8+~r|ۅ_p% X1 yj Z.yz$ @lc~ꇯP6όs{dLQb)[@2.5-@ƂHۨ7(|/{v רi!~Dnw{Xm[c5tq:oz- i'֚E@)H(\ r+~ .(tn۷е6Emļe.v{Fkh0&̛Z|x,Seq,6ou]Xx};`֎\vas@دD^7Pp*M 聿U3cߣ;Tt^G q;vEne`VݚDdm_ggeLXsKWw8!.=O@/uϪlK7`iOzXXy =Hw&s@JoYQE 4P m^7AWWg c *'ht0}΁=RcہѨU+JUOmp5nlhiL]e=d2ikjjwjt/^䀘)+ZAK[`U:z) %`XS!Q^jK6wڢnMZX5$8ϬR5/c 1o"!(0ړED)CAk7ܛ޴)ғѦdx#O Q(yYq=4P&9~1͆H1(Mn-T |]U`F>2 R #|h >ք#`VVѝ=u5a*Bφm6(С=rVR5@O{O_-\=r irmhLu&y z6qI:^Qt9zN_" oUN` Tҵr ~d]WV0F!а?\]!%DpR :̀ FȁQtTTFV>3/kiR{$W9Mu0 c}c%c񰮊VYķuqSۏ}ׄnE }ٖh }[34lonD~R٩^f50V㵟H!2L L)pf uB}-/)t$p"k*N SW9Cd=y |烦”э3y';C } x]6̔j oLaK{vbMI8a'pTFQTZs6݅r.vAGr "Zא\h}5lBi&v GBeOyD0g5x n$m. 3ՐT2OG$`J"ė{9RǭB3nt't . eC}iLӧqX4$TϽs1 iʄAy8xʑN^Iw@;B1(0ˀaZT`C*퓾 sآc3?BK]md9H"v(-"3 O>6YGuПSk؄ L,S,4#Rך 1FSDn[% 7HU)ۇ0‚I")erH him%%3}V)5&^Uu-Ӈԑ[z?9펢 QHjNF>@?"9O@8h GYզ{Ñ~P6qm\B>aP''@U]8FbbΡ)XX,c33tdLBm̪0hox8=>ci878.|$n8-::bќ޶ɸ =RӘdW٤ .UT+uP Fn[{OE+k1Al=g^759~/=zZcp%)HFHڭaءvYþxd=7㪘3|i VKLӋDy&XgO0{z#eO##0[e/2]{YOd9Ě!ԻH/\Zu̞4xltFEn6Mb;ka³Oׂ\!8[~ύM#ހx%v:(b!0涞{c} ߅cs=qހ@tmjHҽS|\a/ܯAjMĝ )T_XGfNR4O{oWXɫF>8瓻Ċ.p-' G -ipq%=\qfpL.elEU..M/^&+:9$nl}ĴW衶\$5Zsj԰FJP1N[WTQs(vTC1O8괪uhp(h,;gKr ϧ`mnJh8˵;R' ?E}eӳPe83fNlj" ܰM4fh:7A5 0Ocb!e, ? d}'0oД2$V=ǙX'eIҘaruB9qX{oQ{gy÷' %uNi K$SpהYbSr{v0}N:)q ՙJU4/z/\7(%>GqX0g55rR0JkUGQ,/.$_ !27q3t2 Qi?3pi!;ZxF C3Վcf,qxM:&|']R _LN' )#?&|x],ds#%^+9*5;^It Q@b%Մ-u`.$;݋7Qn yzO{I;ȔDtxdAUT#U4ꝝƇIsɿJJ>աg a+> stream xڭ\[Fv~_G52ax؞ R +ZRrw/9$0zDu9u9t,ç鉶ʳ:zQEʬ6nq>}_uf!wwj۝sWy7,͝.wZL/9>ص4v.=v [yWYtZYQ;~r!dF,\* ~[̧yMh|jqkL ,қzپHKm:OԜAZ"0spe{\y>IKkI폞+?g@  ɜFL: _-:+zt {?Ȅfy]ݽfe+j˳s"ai#$V"B|No7tBnVN}{'I4ܜ:FEfGL=O~tO7F% vg5%d>k3]Ovq9xP͚=NGorIfe{2HhTO ĥ#ٛ8HK-sQجDxD=sSh22Cw+xҭo 'sЉ)ODj=e+!tIB,FrM= 4pRC>TDu|Ij|HD(C}í|PY`Y5^T!Jw-4ٸ,Ǝ; pP̓7 C"|4,k'yANԇA*Ӧ-*CG~ jO&IFtT #55̂rn=e5̆>JIWһ0@9Q29boSV`;_\PLh^>S6b9x^yg9e'-"d'] [N1&S)1]󺾅ԙ*YM\΢1$,z%L4m|5/oXQl)bsA;H1!9r , p$ 7"P,"2WT'oy6#tD"ݡu|-!]O~!+I}g 2c6vqoYabpj|#ZOٱıF%3YYOar%M`]uV՗IqL_$^3M:Vvو6 Sq}^IsYe&#zTYsW6[ 86x6:UzV1N82mY\.-ʦ,K2yl*ՙeiOr9mQD+g>i1Uh/bK .VYaVc&Yi{xpȬ->;kMJWˉq]͔0lΕaw x{>oG%[3^ZIԻȫCUXQK,}V>rpV ZڛU DþUq$\*uQA4WJ|:='$uMRCe0ɘn=v%cbdצ ܫdT2j0X/o UR,hJ~:U&1XNm<]\d I1,Nu](ʫdQz.k5k㽕-TZhK5Ij_ 8R|cӄokX#QbG}CEȗQZW5:~SBtbz2|pq#Ո4;~Jq^De診4C  Zq5/Jk?s_v,m6UOIM]GCOn.! k5SoKh|tS< )NZ* A}@job0qj5xaWl<:נMeDGe!I~AOV4'$%&8kޯxe1T8[FV$g㊋t 4J5# O2KX!L%?0"b~u.#ϸ6ZwC[:'o`>Bku1Gg''A΁Bf19IVUej|K?_uKOXA9hW-7jr06aecc"ó2-OK3A#;h_/D(3=S=@-~ za8b)REEAZꢰ P(EK|R^Wm(J "$mf_2/6+tpB ő#!-O紀G:6~N%;>7]P M8o6~vz3!ar̍]A1TpSb゗xJLE?G&aO\\VرN؈}㔫Vѫ'w/~dV /[T#CD5XU"c\E3|~DA4Ow*o/+˵6"4$v^qZs-ʑx#v Tt"(U|[;1YӴosR:P~svf —1FchG>EP`8dvK}I G"ωV%#kK=,ZպISZj[i2?rNZO.΄G ֩X]3s> stream xڥے۶_ho$3Igx&IJ\ꕨxɴs@*W$pEWo_z]EM䋷w *mlx^Ip'?#¿$fiMouZ,ռiLS,#|z|;"ЫuOiY7A /2t._,me-2yhy-L x qƒljd8P&w8_=j_vYur§Kj}Yޓgň%8=QKƓ8!rⵜ}NxO ܢخ"I!bxiB$%jO6&p#Z/gYbh"@!ՓĂ0ݵ*ϫ!R kvMbm:<KPwߋ x/Lm:`z%; Áv%0?e#JE43Lk'̀}NJVN{乣jjpB\-JӀJ+_q]eV8_)'j/*aXp*H4jF<`&$)L*2~p^G;bI Қ73\=1 Rԟ*y}S;w9;mDJA۰6R? - <_vHLj+omp`lbl&Ob*w2ΊTEjnd=KLP՝wm)xA~ kId;D$ FzJ%W)(Mt}߅`oHmc:l[k}ĶjF6YJd{w˒6 M%~Mҍ=2NkYeճKA苺HcvH&5 #_X šYVٛM'lbSa͑G C?9IcgUhѸ-aFVJyZENTA #-ċF.YD@?eE&fjr S,a6g!v._Ɏ`Q(V)J 7", ̊1͢$Ð4*[ K  "RՌ6ɊѭHB,O~0&- . YֶVf2@2xN 12?UFJNx72ީsB_%#NۭJ-6+Y~5$oGm"m;1U| ODC&„el>B= @PN!P hH.$sThQҺg"|h>G$6hi2KִrKj1UpLxb)2 嬪l1'GJgAJ, r,R $́yS@:"J+ҢKyЂ738lm>$Pk22kjy;8T`QhbP;ʴ G!CdI}٣9v> $H"OZ9bi$aL=|u<+Aܬ:<^~>_:ĚQ1 E`kȾbB@M (x^UP8D&bn!NΫP¾όW0:Ҭ"L?)ޡڞsTIu8}Xe= xٴBK\e o*,"VBQ7iK RC^Gꆂc}{E:3,j8,>802Phګ"0ORGMQ; Y:2+T׆.RbBL"X?UFNncPeLGN#7WXpuۮ|t#'OVMQء)iUᚩ}x@ml(+!yx1:x00 sqp7m6{*Z{BR> 0{xTn39`gõxkm@F%o|!*{M5!sU5/6h1!եueV-3f.tlҤUc3y͹z>kvt[w;'Gp?0#pZ" x_N.]hiZyo舙Ec_qQ7(D䋫Kqɦe᥸<5`ƕ)2\j\Aoa,N!etd@{'igs}S"T#)KK?֌;fT4ynb鼭B϶qT9H0Y4klnvhF>&ݣKڊ&_PXRQM%,]3_*Q~TO}6ZlPrV a [O[yEkg٥xe1`TT&Xpw{R"4vTJmN>hh0Y^QQi9{&dYd/rޚo i}_\CjϑLNbl] P{g>:hio=a$ u t~V&d~O.[8{] "ogOdu޳ WX&9on~\[23 6ư;Ěax8.H3)GIF |xw-&}h/kj&z|+{RzmuWFsӱ0':ow\ԯ O]QHV/mZ6{6>)UFwR>$5<(&vI68(! Qq;5*Qq^|8;쾉Z؞XM9[@.+G9^RY huNCh&Іxwn}C4xt{e t3IљUtyrendstream endobj 499 0 obj << /Filter /FlateDecode /Length 4028 >> stream xڭkštE|4NS$-(xO'X"UR;]R}Egn^|ū7MGu\'7o˨wۛV?՛" 8<z{>頵ive[h6izMU;ñt3/s8ph d+{QV7=mNe>D E=:1 Qƶ̀0דNC">-F L⹲&Fy{i F*gjf&dypkδvLC?צ.POi žU=#Y(#gD'q>UT%vd5,q$ mo`X,7(m11KJL , _>ӽWv`E1'@##6H"/QA~DuiF1tԜ|G=́cGBTa%Da{d}[%nCQmQ˅4x#GRڨVvsKnAB]$"NTV DV+rzԺe @|7[߱2#tq }'uj9=SUXC4Œ@j@qMD [o%Ml{`S7 =]c?$ y'z'Ƃ'GV7Q3d!>-3)E?ᄎ='⛚lBF+[W.V/k*oөv;~9OX8ZaShF'[eptʮ 4Y&]Z}U 3mmKL7>!pln:>@ZpN]_Y?_~ϒO+V2^6&rh51x v",$DV~4bt!w3.Ho5vļ 7A:_CKGAC|q/37,Cɏ#h aiCOpA,,PzxgEKRKWG-t} Єa: ްGׇ0TnF,fr7Pݨx\fڢޫ/bsSj$hR :VOJqY-[D(2WzhZf@U%NK cw#} k:~][U’|تI4ɫȎaoK:)4LUnfJ+xJOy% .U &l Fr~}EwHܟfQċi.8ҘRͨ* +$|)tGdoT~_&g^HTBdCGTB?a(?hRt˃ߎdUyLc [9xIJE1KT ZԄc44YXBIiV0F1t(G*A_kݏ ma4fm3Dsz'D'zA'VwFp =`E8 1 h&}OS"&`&?VbVRWN#i) ӄk )NPI`Y'OÛ^4\N{)4uh 7ԉ @aaDGgVuY|ƒF,0C'vq'",n~f9SS6$1T 2%Y2jʾэ,bL8WEc yNr9VqEy.QEN1zqAj6 "8je e/uj0YU9߇3V6&~{`?iׄυA(1sm%xE5qi( rf qi(?Qؼsb4<~j0ֵe.mv a4r *J㨑lKC_LJM`k]4n!r1h 9(+$AA88,U ԮE҂C]#g&kxTzϝVWS 95 2e\x _ X^{T`br̋asiz'- CQvr(~p-FD8򈚂憷pŜr3K}L*+9zc 9w\0MSD8u+ժw{{Jptޓ\bG.B]IL4fdkɴ$ ya#C`dڋBm_.;+>/k$2*OO Jϻ"4N(rgIBG,}&frxs cSG^C8*,oS*dpF<29b~xo.nGtϼ*2_l1\ QYbISH^fӈ N#罾W$"d -kI}鞟*}8 Tf-Q]J}t`dRNkA6}Z !&EWEYB߁9rīJ0e~x7=,w>;N1@ `/>s!9M^-mP'^4)KzeY~3 䝂ڜOyބ!%=kCjCo:5E톨L+ gmbc-Ϙ:Qb>ѐFzGV(3 kWҦU {`m`HQ:M^|endstream endobj 500 0 obj << /Filter /FlateDecode /Length 1893 >> stream xYo6~_!`c"Vk=C!r͖N>lȻxi7}H&O>wLx볋Y{" ʰҋ4H<(Ի^xNQ1멘ۭKN8'/]"DaoQz{/?!5[%t1+8QAo\b&BKOqY|$jOx2_/B@Z%۽l4gfvdZO={R"zշ)$؂\.hbo?Cz4)]Ĉҽ!>&mIR5B"5j.4`|b43C>=8?bAǞAX^DC*iiRӒOrND?weȍZ"NI($Q&Jԏ,Wcv J2b$aC_@)=,Վ[HL_J |ɀ ؁3<_iKjS%O."%_I\ey3%%`; 1~{% ѐ1tQ2rˆjuKHI4&I1$ )$ѡBI"< 5Dk ( 0riꌿEeoS l~ABYȉ%I)Y7 GѝIL$*d{e 8h&JJK*H)vhFnU/;|g7[AmU^C6# 6HT R$ɏ5 CXpకi{ J-3ÍH|H(;sf?ޕAb[ ;|jS }Scj)\) >i zԬa+܀iJ #R\24r<ѠRwN{ZeAIlt lgZ#)SAnޣ74"͌Bx b܈nN>1a=)Sh2= /O êy ^%Bx<Х'/{RK?Ɲm济; z93(H߁hX-}|S\{]=ųzr {4VXvlsg%S׿^@;֌@"EO}y,o6T-ҏ$T bҵ8obBuNFhT+˸aڈiw#+׬#eVLM@iX KsVZ1Z""=7:+Y ;qb-mBtrm;/AGCQ^a dT8&"s`*QxЏXt=lSj+CXx'C FXiUlP|?ώdΚu>QhZK3rb]i[sR~kSصM;8A_89sߝ>\b5&k`=>o^FD gٮXʾT2Wӑ=?g{teh9naڰk3YJ9 `ZQ#+xr!{]@a gG`Z lVCS$ϏԦeǖ|Q[\:coXQuZ[R581+%|Mʔ*endstream endobj 501 0 obj << /BBox [ 0 0 576 216 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./me_zinb1.pdf) /PTEX.InfoDict 255 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 261 0 R >> /ExtGState << /GS1 258 0 R /GS257 259 0 R /GS258 260 0 R >> /Font << /F1 256 0 R /F7 257 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 4096 >> stream x[͏G9Iw5D9!:!{꽚]d&vr뮮W}ퟷ?>gK{JXI{[{[nmo}ˣƃ|Bɻ?}-ݿ}~ͭսV澺I+mjRާĤK5iv.٤d@% }0v*5 {[% =ٓ sހ0L^²]hw'"d9]5tGPi5^TZ.'C@P}ړ s@} \BߧK@@YQ+ ګ7Ag]rt~>Cv1/Gٺ#4Ml.**a,dAgmc9bB9cs \t[)Ffk嗧mlفt/Eͽa@ fFHэ5gR}]q UiFS@,')dJiiqdCZ?_+'ջ8iw,G3U [q8E˲[v.x߫%yP CevO5!Om5253MieV,~^]z,e{cXFpdžO5-"P3 x7a"Ƭ@՛Ɓf/eըDY/:WOuo zDg\֫fLqݎR(Ok/e]+7 ~hi!r' ,hxQ=~ڻ<tu~XШ,8:|q+#JX8cT"3?~"Y#{FSvr/RlLJ*|H^maH*%{i(M)K Mc#5b4x"O7&7yhAd0rw6-A݉Ɣ 2W  "밹5,J)"Ğ?(`Bj'H;pFn 47H!9a՚|*Tm+c񟽸Y 6_H m/>Mls_}yK7->n6>H[A3;+H p$UCK@(H5 $5ZK@H-,wt;d؏6|*䇽ҚXpV8WЉ?|i b_9[%O#N(:}IU/ H$>Z3`24!F jQÚaRaad5&|FLCI[$_AWf_<"#x[i1/}/&[QMxL sTiHU/$_uDBS## $'PU;8" W 0RR%L~E\{#+WrzHHu@QL@C$֕ $KF@I6ɖ=hdLubdM)\W ̾^vG2Yɦiy ~dUՐ6c$z%,egW2mϳH(H֭p%V/Q:~OI5o#^GɥtGI2y}M UokB};U-/4x/Gkߗwۯү~1E槾~]y--lۡʭU1dQ 1 ;/x0g1WCL$CҍQJ(u xÅq-#:F;'ř-_S'uJ[A-wCyCzhl%]֊zib73_}ݛw'A\5].,;coSK8JcQݛωG8WV>\A&-z! Rw%y.\!7$p&qA $Hu$xyII^& TYOIS8(iXIsE*V 9s&t+XJKsɳi4ٚ@0@V!)m4Ɛ@} >5پCƌ d BnY ߞ,֋)2=&3L@V8,ZȹL z F5T\GC^5r UGaYbx-[cl-rJ9Pu@g%%pIb$Qdw&{A0ՒD"]22xrɍMcQd;ZD8/@*z[$ŁTvNR]R1At - 1ыR49)@+¿ F(>+ ,@ T547J!DDApкh9.bCeTUE5͕J{. *rEdЪ<* @oU*(KJPDv&p{%ږ A*@Rd}g4SK'cVdr 9@db< 02h\7%k[7bCy4-0Aă03A#ι# X^Ϊ||qB.m%Ypѝy^q"rX{f'Le!4e>eew=s>C .a{AբJ>C.G@Vq3\.&-]Bk:L5XĊ[%Ű9 (hL^fLm~eS3Ǵ>bҴ> stream xKoF_K 59|%CEآ[ZDYB$Qa~ϙ,;,y|_3ɢ(~],mD1Q]i[27*B iQ@A0/g&4+˸hß,)",Y0>o ~ n=0K$FN&MVm\݈7@?ߠ@YdHFeզED͟7)h Җ7w&q'S $*ӲJ[u[1w3г, 5uAt@x@no7d儧ƦmS2W~eQF (4[Ű"Ed)jc$)rV6AZ—-O2`mw@.:J~8^߲2%$kfQ7ifkfN=6&&:e/ÿMdOFjHkIVJr;KJSQ_-ևNTDnuj{Jv{T5;+p&X0tq03d+e `lb3` <9-3ID8d)'FRťu bm ǑIݎHt `EhR(kOr67yr,_@b1QԵz 3c$xͫb8j$:*\,ZdYqhz,xi[(2x­$ow|BqzA:5I8[$nUQ,@8=6'$"Ezl+) XHW7Q0VCew" izdd^J4uO3fH\*73i6-+:8>wD&5&ObZ[.=Äyǟ]OM :ךoX UQǿjҍgEU.i7(Y>2 D$:Fj[h"ixMPj#7(&%Z?.icSBX-1ZRhvc{|d^0>T_Ppԇ8_m:X2L|`Djr#QIe'ψI )W*lBo)Uz'LIB[7dJ@,JIH! !_)ʚ#{I:V >jk"`|$ jII(R k1nMo/y0RgiӔ͵TI\t4sI!*s^P1ܥL4t/Zb.sYsp,nldoNΥNx6 }hrKZlUn:]HkI6۽8ػP`+PZR!M-8/%*`h>(G;>VmqchyU߿ [W߀2K旮ZLNR}m;| jܦU=}ݽC.:Ac%̈́𠡕(uRV"kRh?_Hkf_WΚEۂ[S{PŃMQ]vrߙՀv݃ګ P,krSU/w<6 ? EVp7KnǀD޹];+dpwz}%뵑lv9nSCDy*oXQDϢU~_ gDeZjJjN3UB#VVB&24֝ja:JWK"yLZ'ib oP21 LȢ e.X@Y'2BC[- D}eh1ptYw\;p䠹~"^xRendstream endobj 503 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 504 0 obj << /Filter /FlateDecode /Length 2735 >> stream xڥZ[oF~  촻nxwłdID~ٿsENh Μw 'I8pۛ40(Ln'6NF,ɂ"J&ɯ_.m>-K3?li(YE.sInk, Wс`dґ0y?<}~LisxBC.B {gQ^IA# 4Id l/g{!5Qw {J׎H Lө/%t:df f=Ϭ5MGB{Q>#Z3-/6`2j!4)81b? p XB^KUZ9fu>]tC03a'<ǢEnaq)k0]+=v·o W& qӉS#eIH7/E$Ǿkܝd,l\*z!.,+\),Xd'w.@eWyL1n:g+̗}Y AaB}]{ЁmӋj\JT^o(Gd' :li"}?q$ ͔uv2!-.r+|-ht~B߮tZ痰,(Uh\>ȺOBihJp<տn "`:ᖖF%j$uEd!PX.zF=tײcRm|(R"+b؇Gu8yyV< |cZ΂JbUD.4Yx֕1Mw1pI|R?.T  +p1w]wK/4 a +> stream xڍP wwwwwwwwB\ޚ~Vww(IELR FV&>6+ R d Rb`/3.0rVv++7 ?Dg>@ `tAwpt#Ɣ9@lejlP4Y#L qA#` 9133۹098[2ܭ@U hdҘ(V.)A@hnjotG*>:"+E`}8V&GV:9{Z[̭lR L û;ԍR* beGy?fI{3q;;=$wsm̭(ՑY(+7]ppsN%=*Y0/ke|Av1v@ή@_+!̬LA=?@{<, `' 3sg5DUT.J117#'~_?V/[Y{s_龟Rv{h^ZRrx\ Acd1}b<?HO=_ߌuo._s5:Y.[\mm oKViy6LToGX00Yt*ZOOȨ.rh %Gʃ\y'Q_:rP%\>X2GY`3Kb$ø@ț|#KG=e/b{ZTgsƣ%;JY.)?җ4/G槌R(9@ ;;T<|0ᅜH-I܌{qمFOR<.k Ng st93j. E޺oL_3ZCZ|m!z(O<(7%_w%X6`bOvFN^ٓ0ȲሡW elcٹj@hM +{'ؚfR;- МqS7mA~r_.$sTRqL]?y55ܠ:h&l/~q0IxUtZ}UE(OGv7V&#ݹ ,DV%t6O7aˉ؅(%,FLQFxF37nDçxmQ"[x#^3f OshT7]׹Qb&Nyf*P݌wNx(-(tE7n8"͢V(Xu&Y|}~y'mZ\6%YʻB푣I:roGMbMTM."bRe50y-=YQA-:y:4"& §J*RoxzFu*!|G(;뭽\x,&avW?NWJ>QpjHF(|WFՄD2bH&= ǠCHLE:V43gbI 'Y}]g5jʉ@MDD\L=C/skij]wy9d,-!+6]uEV|d%]nL= V82$ɞO_}™r _Iw?4J [W˒ybi I4SuD:]>C95iu&6]4`ȼluN}5EoG&E*0-l"Ri6U-IwAOiZA|ID| C}&-nODж4W'=P Q\Y0!Z Y2Z}=whW#XI(16Qe+DHnƄvcuj.XXhe8m؂+2Y{ЂLu@ee٪=k#c'2]$~H knD8~u! :W"XbVBN/V"4D-mj2вyH` 2./`"dUJx9 "9yh$rN6Msa.5h,o6h>GzC"2kxwT\&Dv1mwv㈞9b~#> u JUY<7po,pzO+Ϊ5<AxKmP8 >Y۵B!9ͷHhU6jCUᲈCɷXÁCh\4d/g3}f>TH{6sѠm*x}}Ћ Uh"dރ_^^ N;4 Vߌ`x8L't".«V` &;z(?tG`S'KVy <<2Q>"}oni0/)Hi-<+Z2goa RXo^i}g!-f(8y~vZT7r3 MOLFpl =:U6`˒h(^lf|933(x"M&uglk_1Cŋy w8XAY% S*h#2j-RChsY/ˏ%%L2yEvz2؛XQr+M\Qx%DA)PPyZ߃v0^$x`_[ȩ6Pc+nmCs''F5T"suTBO偛=K\HOPs3[0,KRTgs^^`xƴ ;@6`.Sɔq+2̇A2^HeTQxUS "ump\ZgIyUʆnWh&<*npyϏ[JKv3\Nlza[1mk`]gEd"}JGr$Ps۬e ^t#F.ĘêTp<{p"ʵ5k|HGs,̩.m 16hbJr-m`wLtW~dKJ3v4'1ߑ{O9-3GdE.o]1?Dęs3i,l`"xM)8c,2њ[ $Yؔő61Mi-==-Qς5\w՘`1#e,J. `lj $\, !%[ diIٵN@SP'4La"3c+cWDY]9Ժ`cȳf[ynaNuTA&CѥBZ=1GǃlJnsg@tGSEu2eR5xc&J4kTYt3x/ێ1M-3UN9Ԅ#S{DvKuֽXlrFm+WoS>Y#*RxaFbէ H!޲S5qs`/[($+cGy,a^(Dt(:4ھxq~Sn UIqS/|VOFNj7h od"?MN :4?+~,0]Y7泄FU0Jh{K$&9KJ'n;fY$7*yKscnYQ0@?^4۹\Vƿ*YXX:귷f/v~[YFu:l1GS>S{r*EHNf4ٞwFrPkd½Tng^,-Dx d$+:NDzL !tOnCTu m-'Kb߰qRCʝP jMj:7v^Ϝ-kFӄVJأ2&cre,]-!R}NERhD3oD落P_vj4fDg$ ` MkgH0ڿ]z`:ZJTl׳T ˄a=a_(cw Gع?yB.Umu'*99l-2o/85sf!UD ol36z$A\ D-L'R zDcR^ >:u kk}Ԍ.xń?9_«V>|- ҿ ( q;ȷ ؓ5#8"m3ٴz-A!L U>> a|:ʇ RHGƎٚS0/া Ird%\B#9[~osbnC&W!.WHu!ps`ΝyqHz^uO5A Ds:G:&w dZeC;pxАzY&*a gg2RxᱠY .DE&eoŻGI'^Lz,H=IjNs]X*8w:Z^`R(IcB7I6z93Mæ_>荱Ot#~@*'t.YU=Pà /(G4Tʙu?704>bhCFPm/E}!=/fhL ÈwHAߑqAB$j E/.΢%X [0_k+! _E|0toq4OO=i[~8U)0{= 8lW";7t1&sHu_'W7sp(!Fl}^k> ]-`0J qIMƾ>H{w&M#fɞ73B{ѩdngWLV=nM}ַ=0jL@ cHQ:ɕrޘ* }#7N ;O9L^< )qeU n4vʴ̒8w4hYδr @0}C??3Dh1K(-vgpRp[ҀH!$"6S+u6S-1F1/ze{E'FMC 9zb"_x!x-E 2 C_q8ꢔtl/U[2+5ZGWP/491u}.1tI"_Քmrz>m `:Ӯv(5a bT>=VW2d[#-^|mQ:dCFc+w=n[ah|%nL7ȰHqJ,#!cJܶixVཐH ^h!wxs t}Q/0t_n RuhS-ezV}%Er $9Y՗(S餃B5(+=|aJvo}ޝ=!P Kr=ѾGɛV}e#䇲4ߍ\. M,8f;7K"x#Wp, _`-"AU3F>t 輍+^\O~7d,>Q`Hf0)|)|2;c9WۈcY)eQbPQ`^O4[y:Lu%UmスPA͕QJ!}0Ҝ;,:_Z*#eeQo_L`Q k Oky݈#%JԵ58 n~ |Ӭ9*%$)r33ՋOFAOE-۴ S=$<a6oj:1m𤩮Т"lkS>֙F)BQpPy#MZdW^tcVn00>ӝ̘Q3 cJYuF% 5/RKM>+tظI,,XdylZ,^ص9,A.A4aIJ(c>b.Ysi纞AF GLM={WdC`m1MEv K [~v8)7c=bɭQ>6H8ᥢ)[NɡH&3]}wAXIm b2v*@\V`MDRmD%LRm0,Rgs(0a/=IϪq܍"fFx(~hy$Ɖf-M/$_HVjxIp_ۥR$GݞSz&OD EzmƗ@/`bG=EksĴܢ9[ܯF51-هh8CH%,/;C#央}h]lSu3=pOvQUpJLqU6[G?4t)/iňa_T]Y5,s R yb5(jZǨfɅJN4+֮WM*EJU?a7|3D0e+5)v=<~qy`شHI{iAR[I1W`#߯X'y>vYҒkhY/ ݿgdLRD9YO83M]b^k6>^,BpWQ~fW:Q<&)˶ Pէz`=) q&`9 cOQ zih՞c"bʋNJ@B4o߱3ȩcÄTP!P!h"L8:T+΢qPҍD_sf̷\ SLiD&.v*iO;"(g !,?ςh7iobPOJ:`f9r,<{̻陸OO{V6AELq;p(,=\v5te Ϙx8nJ;J^fQ(3;" F`smδ1"EI"y?cGsQWtcXfTإ"Y<&剼<4UȌ[^ {쩮I((w_q4bS/pټ)ud҉ӚŚH5)UHqj{\{vr*0sqq4۝rM(ay&7Z+*K%$1+[eH[Ct)ۂUJe mshQeTtF8ʁ+ %kgU{'N_,aMs3(+E֮V:8 xLO' {pFgj |_O38D;yqx3΂dm! k{3*(ѐ dDe|}/KK1pEs9T-CR0 " O&bbn؍\q[ɐ /(X')! U6x"KՖA'/IxSEpmh&ٱz`gDB*G3TiǴZ8#OZ$%sCMڏZj|W gVw:uWw{e2sxő?>Vccn{~? #a Sϟ(5~0bZh WCUK^Tj 3Mw=mLҢ{=f)^"Nf *DNj%'Q;/eT}< \ r;vfv }2Ǐ/#L(<ۙ[cI?=L #BX Y\C/!mT׭:IuOhJ(l #,`ӷ)lǝG*2*g!eK(H{f haUZ~(8s_gD${}[GV17B)^ih6o MFB E8'5"ާ+|vFOy @G.YWYd5"=L05z 7W }'!ȥO :' &F#9w E|FbC{,]NJ]&v3^o}y~lQJH>wyS%7L'àe.S ezlts'\W /r bBG߯1(ל)BcOEfw-n6Z? kmy(8I7hh;=D`ugN9w<׬eWJS;a+oLwB E|6*I%A.z %;7|=ǵ[?nȔn~ЗϛZT> 2l\ nRgH#ނ ԇw©p*ѥQmq`s쯂J<7ML!W+ -R 8 K3;(9mP/ H6&6 \)S#šI%m E^S?j^|u($t3q-g;Z\ ޲':A;0񨘡n5k2{MO Ť]M\W 龄k,#Ъ',"Eݹ{u֣tNK͗oM"'g3#[ T OXLX3lo_c).MOXQq N=rQx5Lw"0ky?IzyVQn[+ |TX8h.^Yp0y =D: ,8S\|>c6HBjW7.y<ÒM4_-BRv~f$?'#Š5DO}#&]pJ=xqpֿ Z_j6Ӿ 7K]̎n`) 6ݔk69Id4|d#$bZyRxcS f#xl&gwx.<2`ݷ:F; VQHhN=&`));䙋`q$]<4C D|)kQvTMAq OL9镰\Y.|2Z_˷=JX[< ^\wnZfȯITy-IËPY?+A?3Enbendstream endobj 506 0 obj << /Filter /FlateDecode /Length1 2032 /Length2 13840 /Length3 0 /Length 15087 >> stream xڍPk Pkpwww-^<@(ݡ88Xqw-V{qmrs&3skJSM b8qs dԤ <윜ܨtt:`W{tz ( ("(An.00''S?0@! T:%L.!!ֿR (Pڀ^"ZK0\0ڸ: spxxx\!wL @  P:];*@/Bb/{% Dh+4@RV+psݿrvhi qp:z *++h"bt/ K_*w}.P 9rf9G+dPK߽8}vG k_eX9q:@Jy899 g҆:^NI/58A/e֠T; u_[,@A/{8_Ə O&/fqsh+HO #M ypUrKg __ꐗ 1'qߔuoFnR`{kLA^v{)_vAv{46uZ4{#Hjqqre,^,sXe|  B|%n>>:ZAC$\O4#ҿ%S0J uD/ O1'>H~Xu5zbt WpDltD\glˆ*[`%8,iI$Hͺr77G!K{wp:n VFɸ [anGa(nj,i \r5`Hh@U1%%29uOMrɒhVUVJaհ*A4g\Ye<"G&: +gEtՆCDSзBh2ś momXt{T=_l>&|2Wg)`ԛ2>S#̃8#%qio]#Z۫xsbgS\`BtIUͦ$n6xjPvl1[s&ڴȏkux[yt|v[0{0r%({$gk)A;Qj) cF0hBLF4#\NXQUxCy%JzAOs9-Z& z 3|- !5 ACJ0I?vOos9U3 sA(K'q]X"(RkB09 ,SCdaCk3cC]xu:j|J.F &`xWi%Fl C[vo!b![UJweJSCi^scς9:.TwAdLz/!1+S}Ȭb,åz{<}<v}h6f'HmR( ݆[N"tl+ %\̃R5J8hFEǨoy5W5T)G\K{ܘ\¢LtxGlC.*Ϊ_iZ6+^參τ D͆g2>=!w7I.97,;Y4u8H@qj^Ofo%t'T.f#ef+ QhЊoN4ò5U9L&Rm\YGŒA.Qk E}e=s[6q2!fև2u7w7QmV\_F9XPbc9Gt$;Rlhrf+RO:BDzӖ:1)Đ\zE콫?/(^ːV&Gf#+$;_hpVñd-_ӏFr9>z81^͔>:|,Y_279g6gp$?J_*5ʃv@|KM%HRY].lMkX~DUyMDJBmt|IIޚv |aVjFU4$z(8 fIY\uL{9 !j$utTs Z_&L:s|걵J?uUPElGmǻ/}4f8&TwʣOߝ*u9x`1n# z&XMZpwQlo7?3nT5,FOV_=+I] {՟-vP |VF?v*LnD.NFƓBL*P2-KmcZ9cAFce rG/Yczm!Ņ7YPk"Gc>dEw|L*;d-j$@~+ߩhA ^DE(WoT|Faeۭ $KN$P6fEo-"5J,*faaO&:Bk nʠ LnB[=+4 ; ]+FΞ@aVd}Mh2-ˍϾfٻR%#/e$#ar1ǰ H_j̭SU+k" |$؈p*gcKɍwWL$-t(#Yyy3Ce@a( l|c!JbP3:5 u4z'_,>CRnc͠8\TC[f3BZ5 *Y7!>ȯu4]sWTwY{ 蠓Y\%gݼދ .Q+fWa`˸ǤuGk2'/+,4V6缙.֬G:m\ScqPi mf^yMkFm8)K7I:>Kqti Ug̡$0ѧӮ%_t|W{G.F_ =K# }^z5$a-q$ ri%Y3*`jc\ F\Njʄ9uhnJ|L0Z%nIp=\P8z[hS{j[6'5(YGcfk"L*X]Y%xp=R.iH;TWQbi_?< %F[5s|\W[(j4.16ܞu0J$p̈́q(PɞWM$ݸH+RQަ'zWtTf,~0jj_U4:ؑ·jKN=h2z±\gÃ"M0Ɲ- ^[HL^Y VȞ"Y+ܟk_~Ooax'[n<8f%~!"Ejq 7LQϜEhw>?ĝCKs7 lXFX3] I- ubLV oJ :FYO0xj^Cx3W_OJ(JyaA2:̞!}&)LהlXXW^= iK+oڙ^ұ)YWpYFD"gi#p&;HݦoMu xbEe۶϶aoͽh^eC&$9|\Y}B_؆RU=eO&ܴXkCN;զYLX0O8}lFΆ8"'3~iM>QFt m܉ڜ%|UV,e 5eC-쭮Efk7i 6iJgB^ ^1>IYQ_h[{35Jb}R1x`:Bm ],֜;;w@^: GTԯm4xɋ-vX>~iu͕ܫ۽?xcb܌Ҳ)vȺn(gV@^PQJ'zaqs v0Ii>Bu@e}y)[.QT]Zm:KMv*ˌ\!<<(u,73\̈/EnJ7w,s% hh Ve=7rGbD)s&<9`po }|c]Q045ҽo H>Pџ);͋w˪_ً7>WlZnw!pKL{dAPGZ߲ ?0,0F"G*֘VܕLGOM[8yB5Ol= /گY`HclQ9i3BX9+L@99^BQC~t vJv E#ɸ"o>Uvw,~+B}*bDo,YmNI']}ʊO{K|Pk=Pydwڬ,eڍoVʷ>׫Ps2$`[\ $#O:fy~B|AM]wx-wW`z #Wp=s^YecY96L)mJJpO3,l^ % ob֡E#j%fQOj3p9mqb:8 vV=:j {1%_ U'zXӓW3gEw$ OGV x7q-r~05N@mfoJ^?!!šAu $<3鏆W zDɤγ`E^dI4)$f.eVY<  i:;T|mhb͑KRңany);n@F* Gk|lҴF&[roy -L:W^1 +9CK{rL, }CbΫ$URu:1W`.|xc=3j'gPMV):4ѕaϴ-7/:KB ;#ᑺFjV'Go:YG"O4x cқd27y2UzPjQ%+⧪PYsM@/J_֋ ٢ ـQET`rg JcL*Ej)y_6^VevxlX8!ay~DBڣ󽳟4UnO'ZmŔO}TJ:ͅ^l6(KgޛXTCEnE^lz'j|jhqn8vfd F+ Mf:4{tHKCbRP35oM !@D[6 D栖CDcLjvwK3Փr(=UT ͝5&` 9f⠚CT^S0<4[@!K&)B!M׏sz-_Ljx=Iʋ"7^gPd Z))ob,~ⳡJtAp.%A]Zu1GQbsV\@ukMT@ۓx?T_T51&ӠD[5?C}Ώ̈ñjgȱQyĝOGV &(FW%:iۯL2E?zL"Xrي웾JZ}t}&#]IaDMHpEd;J]؅Dz]!u]a>?;At2xJ潗R{J5Er Cmunwb6\SMf1 sz^PC OCu`Ζz-)I7>Χus9xh)_e3PxNLh\0]ad>Z}5kYupX5 ʔ\{{o\=$> {PeUM*xN1 U2AB;J7ڪ+$8QFO0iLݶ"%(sct:#JK3+M \ ',O޻#v׷7#m*rU:AGIk(宨ylߗH]y¨ -]*qMo﾿p-#^2gQQ-%6jq'FײZ~DHG[9[R$^i׉B6Ⲇx>y^0XLAf,ꠜ|/AhgACY% UF^PPW04l/2EzBxahE?td$\G_po%=d'"A,XG`>zC50jvZP x#&y1tn:QCC"@esl L IC AGduDV=LW5W"rn(TgI57Zhy%ãvoDJ @g5RCU?V$tVR:|EDV̀}i siwhX7Rmk*$FT2۪ųѾBOJG{, Wp'7q+q];rC*DU05YK8("(zhắߢW}قP_Dpg ~f?CuA<ۤ kƧAͶbc2 gA cfؗ਋,\1jsG-4Ҫ^Jpye;4|9яYO,JuKv9 I_Pi]6֞AQWA ɻ(!&:l*0vK(FR7d?;b 疰JF(t;ST0!.%ԐJ޵fey9l݆e*Xn\#L3i=D$>ZozYeCUx mhcq?ij_{掹6fl.7&מ_-ؒmBpZX 5zhʲUI Oxj5N)5cSSxWۦ2>eG[sv+ᲐLt]|:9na18ەd:IftIJV</Qn mL'EWƟ\gH)ZH(_LC.R2zb^C}{ݒ${Bɘ "Wp(,Mc$HӌFCh9{Ƭ%;ݩmlЄI0EY?:s1_"ҟe{,y^z+5rힻ<\n5 yKp./j]- sKGl 21JE_pId>mF\!exTkΦ΂ZD2 |RGk2|2lqmXo%TS5yBVD|v+?).ylE*5F! gټ3&ՑѷД=ʰy,1FE4W8UM酛:gpLՠƏD teuZ3x'w{ҫ46rLiA!o*i5mpSAa\SF>NȼٕWTD:MIYPa-g-\a8ʴZ t"U%3N:d1FNj^DCz񦧑7D:B7ԩjj},7L֮U `cVpBi:vI8$$TՑ?>GIߘj؀%pJpdyʪSOUM1[}%? Vǐ, snjy>G6!YwʘZLBbV~ W`0.FpD}Ǧt'ה5P)zO_#YXAo&N_gSޣYA?lޛ78Mѽ"Z.z))1$u 4 m9KDԚ )W{VBSp W-u4&,%b3"m3M!nZBO!KuyǬվޮ# >}pe]`kǷoXL!IQL+uPza^-R'94]`,gr? P jI?e*F܄k|lLcTZ4lIU-B ěo{?o y2{t.32b%"`c]&:~a.ˠB{|gsDn? ~1l0>Ķzo*Cv(QKy' /\Ç oLok_/.sHHI:˒mud 218)GRAjw^)5%h*nsk9FGCI9[po<8jf:Vվ\-V]USP7 ¹{몠{ W SΙįhF|T,iX-a2ݏ Xf olnP\Y4qeS|Nwl\32 {߀|֤2lf 4_ l"iox7#c5nrSDaj}1yhriM4DxmӼ:цvװb4)uo4ңODRQB]|6D`PE"}v@>Ԓ +b1R{5lmꗽ@Q"ow@/RXo\Z"p;vW]~[#վ|VKņ %6~&a瀓U?(KrPv ц FU~=GV[YkaD1Gx 2"&%Dv2j]0:?tj #a9P8;lӪ.w`6XDnPq)‰@%*;U&"ֵB7Tڌ*Ls8DI1]FmM]%aդ|\,褻r[5aP yxzcD'Cs=p mi.ZXƿ6Hx{؍}iƄ6|,.j9+T~3gY;J|W;sW[,3I$":bb0.G#镤`XiNdxD21qmqfȃT_x:zb+7$ Ih?ܕd'|6/_g*)G.z̰x5GA9n:T,/,F"c㸠u: 'K;xP Mru[QEi}宒gA`;eC en=l% |bYLyo{fG8hy7淚`{L˒&;F SF2Zk*d*W.6z=[e:/$BxnW1_#&YjqC-?r٘maiLU(P''F?@q:ڈ}6kjD 'S!3Qf D^@CC{>Puf8sjvt-Gdi!doOSS hΉG\OO0R 1|]nUcԹB׳5v@$w+ń,~9~R,&~`^ v|EfK@ɫڅ赛PvNYu!Wmn=1͌HFZ*fA-Ų]I(SXGtQNmDóVe( 9 d]@+If]їHocƀM LCV5ZH0γƏSQ1@V}ګ|tenZ(O[O4[lʶ}Q2N7V\jEӗrd[D?a] ѕXt" .pmp똽ucx_uO8rGkN>CG zFr`2 9zfPuu%eeasjN OsKoLq3p1ie/MR*XfT BS3\~>? PE߲-yM ^9a[!|o(>o:I[!Q(2VJ:g63 Y>e*_u# 0(ӣs#sQ}JBKb;{r2;/VTD GO]Y&Iv 5'2.H_q鿺- T5l$#c:ݪPP[~&"K|c΢O!R{4֪7YUlcm5(wW/$lWBP/˄aCaɉ{-Us9ZCy¥(s `Pf)ˁ4ԙDXZ.r!wS.By)7A8fU鳵jU$a uIgpg wdOb?n@?aS`$Cdc&ʎ+#:IW^{!0="U +Qm5_  :#K[cj{F~7CR?RP *nGiLe9Onayl1V͓ 0ҐGXyr5%j.HK-ʅۚ ^ Qܶh{oPÎaKIury;jO:=ykjFut"WQdFj|ei=D+qr -̬h+QH4胩`:㑴#nȍ 7V|i&× C4"4="u6sԷ>iD9'HanxZ'ϕ뿬Fb|c^.1:)Kkܙ|\[̗s r߁pNM]mc#Kw9I|q kRN)C{&-tDni>Œ70o3/Q?. 6]^r0yҦ L&Oc㛇@`},-=apGN|Ww of. !hCO;F׉LE88,*xz]duJ|T4څ2Kf3L7k销0g܅ͩ}PRU'(/1 ۆ1o2Ptz?=WvnS^X8B?5W踷#O.d~ڱ/{heV~=7}ފu14l\ *hM3&ϘpDLKzz.4ςCXMwU$[uCz~Nx8+.)PZ|]$PՎ42Y}h+oN=gI۪SK380èyXZ #Ucgl* c$i'UO>X)_<-od(| /Z]qw|Jn'/4QE*ۿň~@vR>%IH؟-i=CvHxȖ& >ҀJQd/ga}󉧆[ƀctqW!_ JJW+Vl@𭶣ㄩP2q(['UcE *群!7L9L&AZա/Ewa|vl޴$uٴo\fܦ{ {cKH֍, Nq͔C?ʬ}:;} oZQr\[S;}%FZgA!ݹkW"aSe25?X8?G'cȧ?LY*t}}gc?TZ[ɼw/d lhI#Vg$ PTX*1_yI `Y gkϗ^HSv)p=3 pr~zOdtUep53Fpv(|SmFޙ8RD1(9@{2X#<@2+*7KT/`^! aC-!O\qԛ'jUVs9 л(ԛ%Ϭr uWjДIrxnBOGGF\qB_4wՒ,kT_LܟO癚(O0xo'MuNf$"mF1.T-FW(ɶvZ$,`A!]:}%a 1z5N1|lØ˺:ԧT|^8XNt&V%~_#@EݰS UgrķAgԇcy*5{&(5^&5+Ihv\E3uI- '_#҂`{gcJ LmeO\o2S?8vQ?FG5 ? L@vkN/zRendstream endobj 507 0 obj << /Filter /FlateDecode /Length1 1440 /Length2 6302 /Length3 0 /Length 7284 >> stream xڍt4]׶% z0`ƨ-х-ADD>ɓ}ok}u}>ڇIϐWnQÐ@>IP ' jEB㳚@P8L?JykS!opࡗ+(J$I2j< Jpw? y߿0'(!!A@ @t `(NH$?͓p@N' *r)` 0; }@ C`.^0{p;PC Es8 _x vp7w s8@]!]U->/"\= odwK:V>O0WcV+ 0'4^9@aʰr7A= 8&!H(m` okDe@>  ^@\{( 8Ba~k8?  ן0WXWCUKO0WPBT H8k=s#? g,t!+J@D|'_QWwF^qraJ y;a7jC^nj AstAB=U{=(b5W( ]@n r{x7n (@o|i-d? uܖp#(w`"@N^nnoE{+7^[ooB3SpTs]DYڈ'5LN^ ':;lq6xnED~'j'~e6QʾE xtF?=LB]0[;{x}5^-yl78*d.g'Ҽ7p$,'+=R?lW8H&`=P }'oBI^3]A6h""֪X@&d[\,^7RKZq!nȵ;ү1b4Tu],80^>/%Vl0d&̑m*j[Twiqa~R/W5"Dh &1@ 'j)dw-pĶ9;UU,k3sVP7-_')=hhn\h\'7{Eʹ 1 T}CpwוGR>aҦ?uJ)C̟"|),]bl7Я9sKB#|zEũW]%Hڮf:f3q.rBn$R;NxX7x:ybl\hVr&eo0f}YAJW5~2  hgk}ŅqN-ˆҬwܓ3;畑 e.6 &_|?8" Hb۔ٖqdy6lnn*RyW Rk(S˜~ {k*R 6RD9z_k)1 J9:q$PI_1ο~A(=E87M.֞! |ȲAT״ѽz Ѹ1Ǣϝ!`~*38y' T]۶֍; xPEcJbg;R =vZű*8MP\:^}ܓOb:_8{y'EU48ͥh[[w6r(|I;?ʟ V4?U-.`8wXy{Vih8ȡ5Bȴn$!yoPYsig/x ?^Qb;j ^qAV5L=6kT%` m(@m]BKM8쫱͚kʼo_ /oQ, 55ClN/mfz@F v胱բB;OӫVe/bphV/ce~NJeD,fcR8Y .C8HJ,^ i*aPZ¡y#vTɇE,5e¤ 9DJFZ?:daG$4"{ȆHpUne/+w?\%W؝ۇx%IU[SsAzPEMgb[ֱgXN1>Q'NiMJ3ɐl[I.J8䖡yUs2Q]_݅{ĒR>OHxQ[bU ͚xD5%57F},_5 ϹgI.[*#lҕzhX+Og&E<?UV6ӣ`<l2GTYMfd.|>-~T,;gAc]qtt<7]Hv 8HKw|{6e'ܣL+TR.#-,aϽw^~~K!Et*J5:JVj]Vc~EߚcSv!tc;0x?֕K.No|0_ M%tCr3?(Y u_≠b?`F#l~e]hj-"j`*"L yEzȎ4 V># N3Oh̪4-;a\x_徃t J;BE2:#깵Ϸܓ,%4vgKMc=n!m P8ـK;yz7 WK,UʰDEl`Q[{Lx@-G9r8FBo1* wf/I_0 u+ GAQ(}&h'D>]C+́~RP +E&A6=Q9fn&!M{@ r0H~sQ7{ S1u1bt;TTHenzfR:m^F+aï7E$uV, ԝ`Ha!Ï4V#_-}_C?KUŃzCF`:e՜P5]0xJ M[j45rwL- =Mxf̥$Fk -ڹaw&M"Y IGۜ;2񘂛[2m<3lmiUI)Kk,y{woy(?-:vJtD|D$eJ"i !sjܨ];AQxΠ8IMךVFp]gkL#}aqvg玩RyPn?%=' e4ЖV69:H=Oa4tHiVygUuSEa~e1$%ohiMbMԹ۴AoP)bt@,:Co*^(d\mO +xyE*[l/WS")kECgC9 ~p['to.lڨL_}=B{ySm׻&ҭ2b\ىSpkܧDI٩#O06:@DXEMV_{bSy3Y$%nՏaE?Q?eQߠ3gM44 r*at6V_RUkvY]F3AI`i +nbp _/!ĐκT.NaH0pA6TE_h^2]*rQ4V ~ⷢWߎ>2G4la7926}92yT~ÈL1ybkf``(%} i@h[6\@@L"6_jSѻA8ͥso:8g61F~d޵O4r ۹%)Gc:x:0t{j؍rn .V ?z>Bf|/=}M4{gcbeZ͗)l^XY#Ғ8e->Û56묯uRXU]=;@M~Qy_,f%']$9}zOL4ď21rOI9EG۾ge=%z`(|ovTC%P]A<[nJqMTԹ1s;3]D0ͱGw|z{#nt7D壯3ۘZ%Mw"B3NtͩUbSd'JwCZ>v-I054&Tz5d]8aC7 wtQQY^I3-N\< w*U BcaEp4+^DM ;gޘAX7-BƽwivFjGռ̧oyTLGUD8x|94v!5"]J?~[Ÿ/\t~>:54nfBxoQ De]Vల+ cX lg^c;Fx` i/wiX+/7T5eR}}/ |֐8gaLUYSC?U] 5MT>uYf] f %sr5;/ /. M\)u7Pok2blmXfssVo! z=-fs ar"b'[dTcԲo Hh$<êJ")`=N*[4 "R- )XXwo+פ΅ iCT@R+5҈iGXDϰ^Mxl1dFIY4+#[ϢoξJh'JRng_*IZs# lIt Lױ}^wVޡݫ d弫Q1C.o{n4J=gO0}rcԹ{ӏO{e CmxJJ];ݪ*q#}'{͢&#[x b1әc؅g/ǃA{YA+A͒.r۹Va lO*W)@br]JKFK^8X5"XҔ[7-N8v5̎o `9lTΨ2?m<8iԥ&%DD,!./ :t |û'v!%Z},nxQƚyh[Ac4Zzj*cɯ&TqkˋEO=pےD_,%u3 tLF/ k]kg,QdBEBԉ<_?yuxQnhUvkՓ2EOq d}֍M5vJ'yux%< YRԷ&Zo+;WMRt=Aw]h yZ娴jr6ƹSiuKIދp_wG_I>YLqF:E =Dى]t$8)Uyy SҋLpki<{ ¢gΧO/(H29E z0uSkq õ=Hۮ +үX:Hg)T<-j c <ˤxX 1Lkfy:^Y΀/z;9C;{8\ (wPy$0\Sm/z:]X:S-Cd&ѶͦqiN±XYǕ S4t*\(Qɶ Bhu-UfETCRqҭ)j?3y9/}4"**\Ipt/oz Y>ؑ1Am~21Eо*uk+cJ`NOrznxRKwҬe(*I:`Q=nY%s{;-:1F<өx^1yr< FV}Lyu~.vH3ZsOF F_ڸp|}PUdyV: VU[rq`H;w媩sD{>:m> stream xڍP\hpwww'hC7иk!h $H.9;*zǜ[QihJZ-@r`g(+'@ZUUFGcuǎFru; ! Bm2@s*p q qp88v=l%3 N v>#)(W:@ jg t 玖@G6 "P(Dӓ vcdxAmZ 7 2@ @o6 t v gwg++;@[Q9w pq?ٿ 9 ;Av6k;G@]N e~@#9с9IM?,] P767;y>fYg+i{>;W{s`Og k;g+4!v. EbMhl@P/?/yYڲn m~ C4@v֠/4_7uu_ ,@6vhV6j0x'O& ;;zj)3CN)) ??o ?sl .{ ao15tAnaJ'U_'swtwdOijtݡk ~^{wUAVvN׫>ͳY9y8x۹y4젖ossi~b88y,_#nt{^9_u[>.^>|ψV `gsCSϜ`W'`m ?#"gd_@PnAocrABg3nGs>7w/z_\ o.G.yV(aGѐۿw,397G)|vɳd^g>^gf@h `K0:IRO ēk.։Szvn΢r}u/߭Fӧ<"j[_˹'2НXqyƪ}|? v!{na*VчzN56XHݜ]m9JU@?.۸r@^OK#z 06h$-ExG֩YSn mԑGoמ֯nr8Dm#_Zb[8cpfTvo XLc-~y̤6&n9O'qa75pB92w9໼Fo(Mtd/{FؙзY8ˎ[>KI\*`f a+bR^![KLK>_ bk|0/J4W=ŀ.C|ۜqm8⠯߮E#ۚE~+O::^Й;њd nlp\5%sAT&L|8&(&wZE+fE~ Ub{R }-Ƨo*z,~s845P $t5_']foT8(8O=zgt%rܔ~&Z̭Reԗ)t9%"ᄇ'aЖuγ+;Yyz5xׇ((72~HuH7{}m9N*ǹ7nbt~!ޞLBqL9B /0"YΨKVdZ6&S#f8IviVg@6f}MKBwԏHyD{YCl.6JTӳH>T(uH׌HEC%}8SazQ8CuSTx|~m[l"KY,p/*t5t5=~6(x8bWe_B237p~;M +y&lrX6h xH4InƘ:׌GKYkDLxgKEsdFtsàZW-JQ CZȸsAlw/n ql+(ud*YZ~\`VtmuA>X-BWcNj"̮ɓMMpq%e'3䯖3jx`uؖ7P~~Q)fYbŬD\<Z-ӌ8HϚQHKɒN> 9V]j[HI]ՎtVi2du~ec>իas.{!vt0==1jYO^L=ֈۿ쇆3UՔ(U:uK~ڇAOFo(2dַGQ}@"]_|-8^sG2-Jd0&k%[xП˱?V%)90X)Fjme;ry9P=Hg  M~wP=0}g;Pf*`1x-fK-1X*"u̱}RWLZIKun)K捝,8;(owVzeXİH׸ꧏx0?T,@p4iN 6HZowze6!R}l>%$bRQĈd%Â.6*Rio_zW>Yp9hGCvJ-wuC4GT6./k;C'N(_!5OݔK$uM?}k_d`| cͻU}ɕ% w'3h9~st;)l'\kB bՠEګ0'}&u 7s7 ؅~V dvM0l$پw1+@ ZS]nZ3'=ytǴ^?ĉg.IOU u +pՄw6;vh$z(:?`rϳdNHM^zpc]EڟLgO<T@7 2pETh:R;萔*)#5zcQ"*9`KuF@#/7|Ӄ:QEo|L;\EWHbޣ㓮䗷o˸D*}#%*H{|:|HL—xq;b}AJ  d X@)Yj.󲫋֫rHo}gkSm:kt(6_|{){qѓ\dg pmjͫWVVt8<$~rw͵LRCY!`.[wV|/(w#: 4f :}V&|=:ՠLY802/̈́3+ٹY1,A&d+Ps#fBѕO,6ϹDei0ʈ7 ܮ.(np5I~O=m95s>M:TZ`=f@t5a< =rw4Wy/x34. \#@RTyI\fG4;WT1-*\,, pP% μPy%>YW`hxq -tt(pd5.뜗%(lٟN(;yY.ܼI"YK<~QŋraR NVPy'm+hPeH8F,zۈJ16#ZOK\Fl?< > ;{ײ:PFY{"9`q1\n˱# ඛ,!ƣlܼ|#.Ks8ڮ((Me1@ՠȾ4 s Lt zH/]._qRipŢ^ 탈1ef;O8Sąަ,^ft?Y-SGyc/) .-1&([&eǏ&"Ɉhu)@G$%w%:6Cؑzo/ѽS]017(|19'pSj Ձm76M!>A¿5%2L.zΚp/ΰ2s +ܩ*CJVڦML%({=v7=iwj6jw\tI fkY3'r1U'}bj,$kQ&:2e?섆;ҕ;guV(,&ze_+¸5eA7ym `@UOB{W9lzl!DBNKu-b7CLc ٧8ۆe*`+eE1i۱wkQ|5h~Z9ܼp|œKhZBZ $Gg2%Zmf3c ;ĉmU]ҖxD­,ab 5˝N/훸 7ɰ i'=K<bG鉶rBm}8%4#(T2B010tp@lU䇑aj3[q>+<[7'\&^ ?y 5Ldlync"&*'LGs-b 6Ep۽Gil¡ QI-fBZ~pLiM*ʣwAs~2gZaEe1ٍG o5YvW[|1j7&]o66>Z~P|v 0Us}=,!̄P@~Y6V5ML: `^) Dw߿}4ꖞN^6ֻ#|~g,sf"%Yag(Gا'ToF I2a4ߋjĠF;rcxSb_956?W pW+4pn4Vvn@{I"džᣯ@9M)Xհ΄L."cPNً5zR@wSU5QrǷ\0ە_}tO}jϙFlV|ߺAH['Q;n:u۰Ӿ==t&^"N|2axTH1W0ᗌJL&[5{ g]v?Mbvs)?=m?/O&Yp gܸsC>^MIoBƴ-*9d˧M?dj'K:e-xr:_.q3 ģiC9XTr*d1͆0M+yʂX\ʖ5waT*0C Ž*/^n>5~V6Up Mq(Mkm,tؤ7){pUK{gg\.^ lYv54uQInPv,cu%gfF/!Mè\) 2mƞ|רc}2b ݺV`FWJzQ5qمֹA13#T>eM43xd;ܗ^w6XчV*KX+>KuWr- mvy7}F@izˣ;~ a#hɎecttO`J8C0b+q(yJ$0$nŞ0b>"ֿK0*VnakBu4*?2^ }w2Ao8Z2g~%4O%woZ<k\QCMu\$Q9<ÓYO׳' FdNv)e:ԠJyp׾Xi5ŎOrw5<><S605dUˆab5;V M ]_b&tLї/snxBU*&}R8V{X/koZ邮a#W0fΆ5KOmǏ5$]>'_R%ԯ{c]uVF0]5I.A ogL I^{UdմSvZY9b*mBJ̉(4ƍiX䤩n3>wE۬_za+OkZLVbz `dWQj(Dd|qoZmia=_,AqO{)$ckmk;Lm$ib߰zKآp 9 iхyz!m%Lbeyt~@?-ňo~ܶݫJҜ y:fIld,Jr"}!sn z3E7r ؾCnyp!M1aƂ$Օ[̭UꙠ.f"Nݒ”D%̅4tE"ƶ'V a49 &}[V>WL#sn_"CӖֵLfjwd9_}N,3(SbZ5ny_̉Aj-jD=EU"aYXI+S~Q|ڪX)G?+NOK骁ԧ1?τԆ}Ӻ(#ۋ[5{>3_ҍ9_QQ{K,[+ _n- ݖj,в6t7L(u"v(L-ҋ6D *?O@(VXP_ֺqw08e#ժYP+ʛeff!EY Y+!{6ԆOECx]r>48E?տ!Rx ~ k .(TBp9cU`/\0{_7gUȟzAE̕g/ّѾ{wW,f⋸WFؒӍP"q4XR [WgUPEq`6J kH0Œ HWbx,^#?`ذg~!8(flD7dզ'@a—o4S~3|+,ktj/ Oʙ<>"$?3oz e*/):o 8qA1|2r):'׏,fYwYnĈ_%-ȖM$o pI~f[+V1p`K?QE{/pJ:,Y8o*o2M^߹6E'iujܤPxHk|v' :7 Le.Ff@lR,~牌N~_w>*(f++k_07b~X*6uuZZa&!*P,Tn3 T4|3J(tU;i'g7]C%qGCB*>&b@ _#`@ G@-vNJjCNBb۲|Ocښ&B;I Fia 4Gxd<|^.], >V1Mmvt(/_vR DzG)v1Xnz'75&n*Ug̓}-\loHa =rvW֯?g 1Lzj $3a]=N&fs?iBZrp06a5XP>C4 9.N6њKNw8ٽPR ) acl+>GHje lN\wʲ kF !W-3l yWvWh_YUjGLcHgiI.9(J݄"CNy֡gc@]J ,U{y7RɡKmyQxK "av_S$qAߋb)85_@ïh_qG="`7yVNfTT p.3 ~n>Ll*6̶QOJtMuDx7OKaSހjᜀ-iP{YŮLXmL mO%2kWKva'x߷}!P%YyxDNx|A#2$NR'd]TT XBSׅ/(ՆרJ~6S8t 黕W>T|O4CXnt"5Pl|@*0=0erdS W<#> iW1E1{YwN["YSD ̬\C_9/?cnPQ!uFPq( uaGc6^KPu%R^̖*s#fhlEC6SLoȹ¨+).XF9/}VmX iٶkHPl]3\dTzFWߚSJ$Yuq5Z=)52,a@"O}Sp֜Ug/:ag{F9(46N7+`*rT^TZAk*Vz3L7Ov짚 n|Ěq/t6 wRJ5馥?D lG k"5S)}S,V P+b;~;y:0(1p=2E;^|>A֩Qk")ũWWՏw=xk Om6!f( "gȱ23Oc*P9hV#w6{-!$| s#*"@ɝdFmixCSw*X$${l&:K3+*iFob B+=:|?yCt=H"m>!wߥe\bc[#ew>uz'w0ax\F6P; k.)3ƣ iq&T؉)u'& ?J =endstream endobj 509 0 obj << /Filter /FlateDecode /Length1 1385 /Length2 6008 /Length3 0 /Length 6954 >> stream xڍt4oY[E^U3JZZ" b$D{+EREZyysok_}}>7}CF!1" Q<@MWWKJ||F#vEA `:u溜B HZ$#ā@9u;hpW >5ak dThB0vp'|E(`"P`<<e#]nH j9Ñu8 $ wѿ!!P(B m6G8XG@_GW>A8B;*~Bg+׈boY SC99W_#p(ڽl@lHͯ!`nbH\K ^E-HȂpj'+3?3`(|\!p߆J bp[?j|4`c/ 366Һg"gTUQ|Mq) $. r?ZH-ձ_% PxP @PC,/wC`7Gf qB8zu '. OVC9U AiHR(Gp#< dQG"~-( lx~A+LW<0K>4Pĥ4E_=^#OP7bH A)~Q#/  |ɿ {¡3S(B}uHK6aEҝc3q1K9ٳwq.}q{>kj$E\SI>Gקr sDѼ|fmGs:} XF;Y˒lFv9eLuъ>3޲S\h4w[O(=*i{uqGj|}Ǯ.IVi2Wp4}3ZNP3EZAr)}v]&3uKAv"!,7q=686hm|?t4Cّh@6%~*QЇ")g]7=@ʣFMPgnPyc;~<W#ceM?i.ǫy;- x5 `h#BC?[Jɽƒ)?TqT唀t Ubs@c`NvS!p5\KWb*v=tyG?m?MtHq4]I>(#dh CR;$׿D5y&yICl/'h}TGY5GBҶ#bw3ilZZu'|w)Py?VGrV7M` !:).*t=l45?Pc|ƼaM铜wFȈ~$d++v*ôjWaOjMd?1M׶RznH\`/7ӴM=ЭF94z^}p+pAJ eQN #lo߀K߹,tڗUXóG}cg:R|l?4B${yXo6۲eքVls,ȒpZ0wћ( /S2".b>զ*٤ ʑKagu;O|-5lN|,~fZ)|/8;кbZýWQob{K~:i֑ċm\oy׼x㌻[`י9XdF1Kvj? Yk?aa@bPLƍ~{-"QeK3ZpӷZB]Sq"h,v`S J )'C)i G(ovUͶx 7}e/Ke50٤'0ԴIny2k= JI3zrbi= ign_@i) ?\ʽbJQ\zhu VfkTtRx_6k[  {RMΒUxTq8c~IUg$Dƍɝ"W( ROe$]>%p83ryA{s"O֪fYYM|ž  ;9v˭]&U0.)yG>͗.eW#%:4,+W KiUWxu t:ijCR ˎe-_JiӃ _\NvȻ%=E6I¾4]j0v-ѤUM`pNŝ,BXKJwL}X8'16yPߨ,er"5>v~A[G!ClJ~*{',;`B#7>j'W<|?~Vgo˻m s< CLO;U芲L.ary3bzENV/bGf3~7aD{M1K F.eۛ^\O@ܥ:N1.TcfG'ޙH|2xf|x37qNo7Y `å^5ڜޚEǀ|kc6҉]sn?™5kq KYzp3hR9eq]s$ROݗ( T'ڟlPpaL)aj ]AXGG@;Ǐs=K"OO9U|ZE!Ojjay7~>Dth򟟊o*S38SwF=}p&kB{D pNC!mXYY^2+ފDjl<_"5c59,ɘ9cΟpЬ+#L?9Nۮӄ]Zp4cd}w{;I"/ ZtTjjd|+8Y^%Ii٬ v` Mm ˦Ҿ,L5]RnUuc2|'.?Y/$2~#EpmמȖhE׮7FL gǠT+Gl˟WV|K!{MlB}\bF̬(tVHFX E۹pZp.%df@4ڮuМ=;GZsDŽY]įi )-2UXF'A+˃wU_pQ6tŜ"}c/F n6q^*##{=^,Q9;sl{g a04'0]"AаuWB6tLf {r*;M~Ȓ棖2QHq)_Ҫf5͒M'\ k \ӵ@ #ͦ2`ȻēKͅ~Dc#9#'">⒴!Y|j[P.6<*hVA 1TDCU7j`s}4_j͞Viw1G244AOg<<rN+ ;@m.z)3!uBg>xSe3WY 'Zb!n&/ɆVrȩ[ b aŠ9MdE̫uw$^dԬnghteA/5ԏdT$F ?̧4\; C=LLnŹ>X 3ENj_IY˞&"ں;"2+O9Tqq<8!pǸE wicݻ7͏{{KCzO^ N}gu=_rnixƣK,  C|EeFmb,f{dlViϻkI=bmRIvyaZd/I=p sbwӤ_esN!لEnά-d?EKՍ8wb ii~JSD +D^UdN#Fƍә*dg&%LBL꫋.|cJBllla?NK!EK&iX!? {6.5 8v25(\:#&;pHk~$_tkJz,[XSE[ yҟߏY~b5nz&w]~bָR^Sr&Aql^̸niH`1WhUWk]v$.c.-f4:3hhRReY Xv)Gؼ^ƧUS9Q_8<|hwEK)͆Y!KA/¹.e'طzsTGDۋ0ݺBy8=ǫ2v`9yLF,[xYz+nI}\oNjcVȟ{`AepsI)'\A&I6 G٤YEszkH 'rM|.,;ju1\|2˟&}XЈendstream endobj 510 0 obj << /Filter /FlateDecode /Length1 1599 /Length2 9042 /Length3 0 /Length 10102 >> stream xڍT\k-Oиvnцw'K=@ ;3wzoZϮU]-&%"ste| ղuB6c@\0G$] f6)3G29`0Em-l#I+ srq}̿^ 0??/˟pljqx zW !WW'vv638ZajЀ!.K*f:cähk¬\=\ Gps?ДW:A"+E`= tGNd'deh B2Jl,3GD3(onf 53$ #0{l.Np6-wp3w O#L0`ik 0X:b'b~<|[O+У߿ߌe sz|%et%> ' `Ө]?V0#OsW+`w2أl! x|'O⿳TɸA -o£j\7@KՅK[7ʻ=nY\l p[O_ˮ{נ5q,/0r1Ɛ}:-``bx~PKia!ǞV0 `mx?]߈no{z[~wnCS 990?9N!|OA9(YrBdgiyH^~—;Kac)*Ѳ1 leTkFeT[A3yX[dB9Ega6k>a;3/S 2xVR7y]p7$+R]` DX&U.啳L~vhlKm-YzBkUdPiHhǵ(BfI-wjY wb9H@[+V !ۗTgDHsz஑c#Rwwb^L5}xK]Cǣ[CtZ Ҧc5<}఺sWf"Wh 8ʩl~C1)a`Uכz.V Ī{:ꀗ+%t$]N)Br.Y<8,Tn2ϫVcEn};9@R!g}1,,a$չ93Py;_.r;| < tHIWCpV|g0>y|YgWv~pѨ'/ge"ɥ|eJ 7vnjJLkoefdk Zy 8l_^u_%h6,ھ4vTAuO;Ǫ?DOy 's 7 傣Z؈rHS.΄]y7ڂɐ-Ԙֽ m"2&kěQ S`cmm=HG09sg5t۬ߥ_wgy7)vXZ.V2 ~2ECΕlRQI=._pepdM8 ю JOHsܺZqQӇ_-u[W;huSHs&dhԋ`@ ԭ949Hh[ڮ:kef!1*JU7aNQQwi'[9AGL3s:#lѻ6y7kYIOK|R)B/4j8+͓՘n\U×e7Oj}=b6굳f΋4ދI=)) . U-EL|h7IG6(n+vyU mD"zdIp6uުd'$=*%MZ- 2+LyQ樆ayEqj43hīD.7OYC,uKϏ')( ^y7MrӼ&чsƠ| մJt;TOn=]}=4חn 6<6yM MwbhyC TD/jWj(3>E[>=1c"av<Bkq|)1?Vr+GƓᯜ9dϔu|ael,EmIJ6TalTXN7?}7@YqNC‡ѧ_a߯c^QQuL@c nz֯H} |;#~"sRaad^:˝59AAU> Ndz$i"ٵž453:/$Cw3D ,jdհǿ rN)2ܿDž2/݊ʤw!9=ȯ3cX3IA)|1~!ʺc<7D ;n{;I 0|ċ7[I1#e$pčUH3nxEٝ&P#ߝ' pzVI[,)d8|1M5k^ӍBOq,\ޱfJ;Z,e0օ y!J/>j}gy/?~4JMΧhUVnx cK;NMSC %\HmgPΗT;*1i@ Og9eThpˣoLZ&_\j!vrE^%K"nkѷB%\{Cg/u Q+N8cFK61Q{SZm\m;ũxK39ILKK`ˍL.ɚVG2[`s2?S\վqA[`9VIu!%EX0vlj2ru"RK7w;H dlnC$1%ߊFTVCex! Jݝ%8q‡̨Lw|q}GNm5b7:/`&Bix\-%p//wMOEƩ 8m- ~>N9廂{v6џ{{ؑ6Frvʿt+aM;DzNfnZq8u(>k51 7Jb'%\wDۯ?bFyit{PTz=e Uc*pxC0 8;HViL t~dCi*zgz,ubK;-ok q2KCóla!BL:F ~0x:NJ‹e߭erlF6f̖;ю!8Rgz ՛j6e%YWUç<1w{ۖS?:?9^Hs^ONo/#Q [6ϝhƭurhK!1,C~]ל̚y-kG/ 'g/X}Lnv$~t@.#+C$ Pc]RtFkf'ghu$O\H 2!iqlf\ݬϜL,75?ms|7kW1z, Ͱ=Y<垅 w8L7%WaU(þE?JrhEwD 9)芵T"#^io\ڮwɯfޔ@Tt{r܎D/bîGAۨp U Ɇh#vAz6oXr2y X/wԎ{FRy#o 2aJ'{2g],tmTS EJflj)XSwh4E>m- 0k>j0b+&|mEh/`8l4xR] HsmIDg^RI-rKnku_孭OlZbx Z Id ebqXRlVh5lXԝS3Q {2* 漺{Th-Uc.2JcFTbDo`^|` v_b8ڹg#Sdܾ\$R; ;_q"xACƺ\,z=j^y|# M`<]EAX#9iYɲf#&3xHn_ӽJ;Ijt~T 49kG-PK~uG3u.|gr2p|)&&Z!#BL]:\fN8: x-48T<<'S?8iePn)1#cUeUu BBcpM 1)!+ut"*'S'SZX w U7^;=XliCGWjC֊M}\.Z!qbzBM6KJP.+ݮmA O x@@,%Gޡ1d Ep;g.qq:4BD%lY<8kB$T7<lk+;~WzpR`līGվr11XNTxR҆zR~/B1|[s*_ Pn'H:rn#ΫԏNLw5.IϐdHFGJi337i !U=;2B{64 ׻5'H7*u@vvvBXqeGFIM^)h ijwͥRbxY'+ \4&(U/EE:WQeMިxh04EIڙ(2ՓeLB疬L a.ՋO`@ODGL<-iv7srӃ5$`ra?x!˄}xxLEixJc2jFÌZ7Tu-^פ_ 812)gwf|G#x}ҮxӚń,Nlanh86s fQ'qWn[3罹]@2t"!yH誀ZK)3_ qqHbllTJ<Z:;Ex(LdCX.Ńt$W;Z# F}rXHᠤLs kжgccذDebA#Kt;iț9ԻSi㾊~#7y x%Nou㻲 :..ɘQ'-NMl$o#MIJD'nKgq~6>/ڔVG+-chH!) #KH y68bQ0?GEyVGdd)3|ˎufpUé>Ȭ#ľb`(nM}>Ns =}mdϒ޷0io=!LJ5x7 8/>mEǖeޫaq.di>9/<]OlA},3и+#\}  ޳\Izu^6rn{E . @{ e8 /sM[6N~e@Q3pKuK>]2ƿJJc eM |J4J krA!< 68xs4;k]F2k!6X_=q*[x7 Ww ,7*5 -1hf_8\I3e2MWIR%x~Ͽp#&7 #0v.CȁdZ*j?엞硴(Y~7T[њm@ s[Fj3?zz3W1W!}AfG6^L[ A#7$Fď:E_YxqeNhSQK[!b'XV [.w8j2x|(1UZnK[`" b KDͪ,JrAsFf҉%Xi7 _ԕ QWfe^&#Rd.;u٬}%}p"_jt JT /̌ej t%N;ܠ"#c E޻Pv} w݁|BB1 IS}hgWo=^&1,݈v_?;pVz!Ȩr. T|o7/ xt淫̛qrQ~nJbDt薽3#endstream endobj 511 0 obj << /Filter /FlateDecode /Length1 2604 /Length2 16790 /Length3 0 /Length 18302 >> stream xڌveT[.ݭt-AcѰF A8k~[g0pq;|TԙD-@f@)3+?@\Q]ACʎDEafAڀwen`SE#@`gge!ȅ aacPdȁHT 'o+k7I/֜;@bcnP4u:O47mnEA͉ӓb%Dq].@ _iL&njDаqGt4u{s+PU(;1Vǀؘ_D6;Lm6@#/CS{W lw)QU)8djbjcW,р -h!rp:" \yo[lt-m-,J݉E(++ bee7 z[uo%_bpN '%8%psqo1wl~@0x \l!d99{6,Rz &ZL ebg0spx|&R1O :Z| .AϞK ` rO.acwLR[ea`cA^ m g6[+f ^ QG+h31sr#qZظ[=&5Z;{G 毫t]3_'[*hkع..Hb<XAn`8C%rsXDx,/E7HxX,RE7F̩9E`N߈9#NoA7Ou_9;n6aj`N3Sjpe\LG_? nOǿAp%qp_cb/o#6%;P5N 8\K?8R<lbmiw&Y{;Yl~"78mv\? Y~ss;5w8`g)8Vɜo?n",' Ôo w8%sw#opAn@ ?:QT6p~3pp:pe\`Wco(]M] ;|fcqp=3p5YVp==0|1|.D_ 'n?`+ߟ%@iqd.f[y_+Jɴ;ϭyNʉk E Ϯ3'oJʈP>"4dGBXO;>.fx7XP2' Q.h'.Y b>{9'եRa8+TT!*<)|` LCi|Cn>{SՅe2;U +p&BɭŒP{ѺK^}.5cE JAU/Rs?ec M5g!,[bżXt^?fI8],>ǩD@Ekbƃߛz}GV[e+h9ʯq ?hQH 77brĞH#S sfDA\X{yKb| F޿Uvhl^պRA{5< `jd1bƧSgwTLDc}9!#YcƝ뼓܊I Q3Х?:p7 @ ƣ";Z/\VZ,'#hpv$th} jFԶ^XwO3Jw۝b%_C[F HniA)!6InfR:hm.zb2P6S}āE? E8_5@bXqdf fӒkN,>.WtA<d)Da2/CT-\E \.% <d%^x u$M;P8KfUyC>}1_HEdI%xbZsg12pvÌRxhg}DLa6KbN9uUd_QL_m*#Fs'{NTصf/x(i<8Pkkb8ԱFrwD!t"g*63\3H9U:2)sx#\7&AOگ4xW}EBG9ie(sZEhb&+HfLj?^#}UzJWF.5}uT5iʃ\PK'ʎ"O^f90d\ &US4"[9H|9K7TxE.Ϻ!%U.zHr=C4h$?r5*!Bp6'iؼSů@2DZX<4FCjǑY*Ddn7{&gF^}-3ۓ|>B{0!!}!QƘs zzpK3YEaOjT*ǝ1P\v*T2gWf3 r,潟]d`PqDg(zZP1WtCN˅N"dAHJg/9A4N@ZC,2\+NH#K4k߻3sItNri2CMt`*(k)&ʐ9mq{dk qNV!wlETb|0ˤnZ/LJ#0t!H.+:C*iAdO`n2Uk8wPl&#-FfPB$2۔m0RA̳XWrD.]dޤduP N#\j\ie lh))7PAYyb6lRå_ٶX=e:B.PL1qeCO /}F=WI ::-9>?;O%U0~hY^ !נ}Dv@1T9{N"G)_im뽨5.p%-YMi[)Zyc=~"TjG+>ai!Iv|jwr=TJg+{46ˑ2! 3eXu@]a뷑Lof` 9mLatmNw b&$ZR sթ,u}Vz;ұIefkWwQ6.X--{w񃚖<ֻ*f5C&rp`vET$mXb#s%)]B?0T0[l^Noxoq"',2W3~i˹oO~±έ|Ǔ fJ\Wc>6*HRD yL xŝi/;ePxTe{ .sL6i8j/?w A~Mv\e~]z=ExX}c7@-.UM3pݹ ; ¥M\^)'5׹sTaAZ=|=)řVQb#65I$SdKj|5ZCG4;$0>,C0Cfa &˂!]fݘCԇ|O-],b`pTv&T\r&Ȉ̩>< 4ԅ_<9D5Hm+^ݤ׈\ǶY:eT![\@>nY?τ-=0ppkV37pS>k ޿yrFh0m]q$$՚bbFIyW&hRIP 3ڊR#iyìOV%|r(8NSqIyLnzQ'ܰ9c:/; v1(Z3r|}cȼ+̥[/}_0ɵ4"W_ ,p>3uZ ֌ (\P1 _{L4}-]g؃QԞg1znEewyRėj$ǖjhLJ `1#DfdE!htM{q2ϙxLnao[jt*TIBK?Y_߽e- Ձ^\U^{[mX Z"C Q%/:eo*ϗW*q`%~ -{Ƿ-g9ˊPսQl" UȠj7xn&ߋz ͮ^ &FC3p4&r[BW]2"~xBDy*\VzX2Z!RZt]iT,z3Gc%~ ʸwΝPBDq7@M4{՗ mYsrjwPco3ƇC ۭ-/ʔj=k8X](䀕4}I!Ws ɤ[溲ihQٓ!+ZƼ#oQK٣'5L4hZmW+hg`e|jUː_-|˶> jǞ#+rwGa3/@mRrZC%@ k|i;|õzq`h,lnI2Z>l)#&n~}䈲 uQSYx]*Bv뚻 DE^[! "O펀;^W`8(9w <՚-Cw.MCO;kZY'z bS܃ dA xGyPxYRB}E딯O>.Hxb 4}HaBƨ/81bÿwcw&wkYҌkKUS@ӳ>je ^Cn5+9^Lى9 9 sK" 5m)҃a.5vZZp"ϲsW~ڏ^ 3bC5[WB9 &Їq4fRnD8 }vȊ&^z ttjUl7th!WثKT gJQJ<e T6Mz |zq}@w_(׀}vfYルcZ.m;}u\XD;$ZP4UNɺwuzqxKΫYL2[?XR!~XYs9ϓ8(*Ekv`_mʸ[R:/Ɛ0ym5Qhf y-v]ѠIz7^ZP9Ҷ'] rmX>˂hV{/# I1,(޵5^3Rɏvw ]ؐE!5aAt܅LؕW<$4ZJb *k\7F3/(oKzE FW4Cajҡ涕=qjAWPʔ u J7 `a`<~.%AVqՅhԘ- hVgVtkie>ʻ #&sB5[YșON.K%{@EhPKx73مO ҼC@Dg<51À6fTj66?{ t԰}ΫbFųRfc<6uf:* 4 J*!PGLठ e}Ő:85&i>G~p _0w%LjvN+i'0p(a7  ͖1L,q.7tFzpk6>ʇn>m&F,ҳ}=,-E5k}O$lbUˢ8 .*F"NrÃ}sIƀ~M7.l7_hƷi&Xutd=f6m&b`L  X[k#I'ֈ5ոvfg|ozPc*uQ#5xQ2r $Cw,$ZBxjY:5R'_# JfdY\ ih~G qgO .!PMo y. ͣ jmysv֦.7PCz MjDoW~vP07p%u5.tutA<t>L G+@Dd-$;/iK#DPHgRWN2:ьv?}k(&-h%w2WRCB[d\EmLZJK'vmGwMNm{Gx0WM;(3"uw3MbK{2OPM&@+(q>63R^B߲Nw>?iܔdIrja?2YՅ7eH|0Ȓ*H"34I,UPqmIgSRWCxE Èqo.#A\f.n!җhsgEaz~?g ф:Vdu ڲ85$Qq[ʍl2!!ٻ3LR=T7&G]JI"*T".$Ḧ́_RY5WGo¥&h?H*,[lzվo.0owYqqW %_'q]Z7eOcyd+¶85I9<+@`+B6Lf6#wf9HCi^<nj;I"@zYN$4qeQrnR;% (CZ!fqP9Cܽ0⍡'5񷒒| }* s802PbytCJޟ[FK$҃+P'4GK=68a?\%.uDAIe/0^"p%0vf_ [LzӤ[p0Q}v؜l tEN9؟\Z~x{dta}xՄZW>+$Yyo) ۨE$D,?ߨ&{u<r5,~"A07]ȝ? \`<_#J@s5dujrAv^GF$6-$:ijHX4fSD1ABƂǦi'^{-puV,kXUof>`#o-|2PD 4j<_EJb& -ҏ}_сz Qj T1t=qK/— >idLq졋܎Jb>X1b)oZB#=b]#ltzgP{ߧ) mX:~0. 9L8Ϡyk-> Ab8%AJF:$ʡN] /֡a=gn9agrD^B+so_h-]hD{:2M>Yt._r\MtI!'_|G1O(gLo+==h3eK?j~Ź]z'6, M)r\K/Bt` DOM! iAs 15TnW1|0m& ,iJ7.U8{oF.x. RX#`c #58L5+3 vm| *ڰ,ϝ1n,]I/02E XPfY粟eK޸(j=D/@l֨B>@pnv~pl<3>poIF<ؔZcqG]"bn;IDRN]yqmp6NcڇH@8U1̤=x>rP!f ( VXەNђi w2YϼmƯ%\~偉M_*>*Sq\^J0 ^+fSY)0J,LmN.d Ri7r2NBM4vbqX*q5@Din}ֺnelp8b\c0[SΗ(Sh6dFgTIfOm%9",f~c^>[FEbߵ[TW/&ݯq8^ Hi~c=?.ߗiJrٝ=ua܃ dž[`_O,1~Tt*Cbe2T?dNڏ E|a-➢-yTUwkyDg,!$l-Σ*y|!+Wz6v<ذ=Gcs !6lbȿq:H7[ο*n00YW0eS 9,KE=]͵)c?TËZk>mRlŬ]y3%hI)]BVyDxlMr]uj|qQJC^\AGxaL`P$z,r -|Y?@>z%ym+I#kCB"h_jo%ra}~q BsPYPA >h勤okcn["#LAzջcu| Q@ @S^ZtC=Go_e MK31N.}3eL؍.o2cDW C ' '>3EJ'ԤK!m87?IF~k1JSr!ž}SwE>>U~R LR ց'zKFӔŒB_{Z!c\U"]:C<2(e= Y䴀.r 9_2oKSV`.eYJuCDtAv $$?l]{ :^=]͢OE󺦍bL/HQ}iv>vJ1]<ǍU}]mhJՎ)dSfE 8[;}Ӹ7]p2hw"H{sX ]F4E+qfReoeJy>7胥EBk%]VwA3=˫pĬYnW0pDxbd*KgٸS;?S#|Q]N"Gu]5)N.`u932MeI}k2tH#q#vgzʼ0<4RcR.BS. fD !%2ej`Xpq}0pITJtKXk-X}mRS-\o\өD 1%/6DS"46E^ |RLrᕿ٭@:J A FKf$Z][ ,i?gOd뢡\~ R\Lcᄖc]TaT77x(cscRhȰhm3s:t"QAS`~Qţjd3]Nؘ\`}D[)+83@37}t>V;E$ƾqt9Aqp̅\` #N9cS1&Nѫ4wV䗠~✺w>y{Fwp '/Rca)°O-;w:2b$U,!|f9B7G{.LqC5U%(ߢC=P)T1 ÜmbZ1R̸DcͿ87kk[5 Kck>JC6)u9LF KdM@Hm_~,[&taZv5"%f4ކ*Ay@]Se þGsmu'dƥk;qW0]q3)숩w~༧Co8 =+/B$TM}m=QǗxph>J!iB/ ǚ|O#ttEzWCf{[g?Ԯ]nYL6U# ɻC b dx75)c7ye(}Xh+ 4Yl""v`Ʋmñby{Kza \jJMHJ0{k Vv.[.7΢ rQQDphP?dك}RD j ?6=vcqn LNsDrhAWVԈAU-YAVFD4+/_?{pc4 >Jٻ:Q?{'K閽;spuJwݥD껷*U\25Ĥk~1Q"0`_[ ٹz$ ^^25{'OV!&F/WgcG2I ݩZvXy*gR#t=π >2wd9ߞ?ХD8*xZcK(H$|oKnG fIiM9/)殁0yy ty0MLcy/-l":hB ʅmLwi؀IoR$ +6%"!Qa Ѯw*e&Rhf#GZ&ER&9<1)P>YY:|8E?$Y*84^"pIw \E@z}Ec-j&72S8gc0p 9θQEy1RZG!h6B^ l"h˷fpb~wB.z{,Ꜹo#C;wmGX[st)Қ1fZ[IkܝC#W-~|r,М#ؒ;4. Q:̽ (|XC0J -ȌUW`FCZXU6[/쩛 tb ND#>|16Y{Hz?Y Ɖ`l:ЏvC isbQI\z%ПW]eO{Kzo#FtDa:DnK :mlwOJ<ve7;c;~Z|Ⱦ ꚾXYCg;DNhse0~ĎwhbhQ|A'<Vw|)oLP=iIpaZi-?k9^X&#^,:5P/BGOh5UÌ } ˂ U#*bXոFIw 7Å.s* eE`QFZC6j;̂fR颼e<3: QHcOϙnYU-_5qkyf󟮵ktݮVazM7H5gjouꗳ"eTAʺ~oeBDr2Ňdi= RS\ezT{c݁G}Ulea/VP~t5ͦB@G^4EÏtNr$! K٧zA0EE!)X~Vِ28X,<~'BL#>A6Szyz)8Wd'9<_-zl $cLbrbokɒ%Fޯ;SG?HCLZʮuʌ3/2:..͸ &E0[**K3 d#cԎ&;T̴ۢbUg =Pbryv/>0o|&< S0=exZ=3M%Ч Cږ2IzihŶGXO OZH&h~z ^f%GЏ@*#FO^3OM tΗ{͋HIŊڷos_w! -(~T܈ިn9:_ cJadcGjP]9+`$F@tqZ|$#Y_c,%"!>^o |_ht;ckj+ ̴EY X zQ?p#̧ZUfON\!b S'փ}s:pm%7uveƁn(6#2΍j.4Vā:q+;y !%3»]p ?֢ac;P՝Qa ^}Yfb"X{eIIUvJQ/ƺ w$ѣVyENij_i76 d7ԟ6Ld=l琟c>1Chmou z=XEEKVv%|13W+A7Vf_L .wډD}\YvPo3VhǺ+n z:ckR忔Hj yjg7EDI! *ytNykد͉##UqFO;An0/~+0o̗JSRAP}`cWD;بcAP τA@>#8 _k,5^l-R5ZX:֣Go"vv/w-ť]T{¨(xElNS(S^'WOgrÓ/K"$M=LZ5k))bC7eq;tC 8pc=VM,.YaEhl ֝ğz}ٳB 8;WA;9iz'o0K)s#]yl!jmZAOОeiLN/7.kJ~(Haܡ/u1d)eL!GW֬Oй|LzbZnQo3=[ &{aebDhI2J<8][fզ[8Gkq .Z gG9 n]1֯ R*kѾa@/b<%tʣr:ْÎ}Gvf]YMTuQ ~Q fĎu{:БC&Aڏnii.B;aEӓPGKbr܄cԻiZssUnRa{ Nzb*qϣ@/~Own?toL8sauVvI!eav/<ڔG߸uk T%Q% a%v-}ZyxAWzϥl|zd1D͏,8B=p~گm(ԖHnxmvkterF' !Hi ٠ &~ 988eP53>9<"X's\8cK_D-\mmŎkPd9&c ddx NHA~013XK86(HAXk64p+]z}{omVzgPXVhJVNZqJGňXu$W1ʕ5Jܫ፤(!Z}'?,st&M`踆m&VxHzq6oԇ1y!yZV<.I"\qg&JYi\o;iʃG-S|¼PY9"Szf\rR f2@'l;+̣־vM(tٯN$^s!+=s@:E9!ܷA/j !a޹ =sendstream endobj 512 0 obj << /Filter /FlateDecode /Length1 1399 /Length2 6028 /Length3 0 /Length 6990 >> stream xڍx4\ڶ DAމ6z2fØ3z%]^(%j=Z$D]!&ysk}ߚ羯=u홵9XAFJP=L *F@(*sp1vbS;BJB`m` B{ ¢aqia i  J DKTp(@Wp9TPn>pG' ߷n@XJJw8@]0 抭#F(G nY' MZHKD;'! sAF]aF$;9P/; 5  @Balu@ gs‚J'W"8w0A>p#u1~ #(l< G߭J0v?!p7 Z GQW6!*(WW&՟*ПuA~Hï1nB&HC Do# J `0oЯ>nf ~n(7v X"C=a,?\ p`s#k9ƞ;`Oם5aPo#2X*_Nee7O@D % $$ZH@vw˞8G <Ca pb@"e_{ ?2U. C`IW{W ƪA e=Aཿp:1Xp$ B=aQ@"`"h,5`X 8!ƞ5v%ƪ Mf 3PĿr#=п "Bh8vSmpwJ7-s!AAd_*1x ,-w$ZEa8g9fiL>TV~+g;~:'d1]3ַ| P0#wxJdDngoŕb6s!-sU'zRj (9`MgSǘXuOܻ:4|#:f٨⡲*9\jn0>Ii*W[P CBA=MX ƏTuB|!gxš=A> 닿QBulX=dP m!TzLYh0vs%j+rG,L=Iw{p݃ο Ez~zadzTْ0{3u5A%sf<Ò(ʹ5x(a0v'Gwg> ]f۫ 2l]F^]?8Ϫu3ԋwRLdv=P[}[J5uiׯ`u2^Z籤7~a$&YLzER֡a' y_SYdRs?Vv>`֔E;a{P%m?@ՉlJі?of8c{Ć9>k>5 9 ;hU=Z> i/:a̪s~NfXd-EWg AI lN& '; )n3dr atyb^́hZzCk$Ǡ$*E' (1y,FIE3c-qJU'k~+i3"\*>+ϧ+ZC%S>_ӎ/GRq\R{H]&/C<_.^mN=@̲[?>D%DpJ\Yb5^ .W͏/ӄt$l]z+e+Q.z"2W3"&ʩF'1fɮ]CnՆO~z8No[ye"е*ka],Mi~#{L"%ÉB<~gm)zD# hDw2]ksR.$>4>n2g]qp몏* l^u#⏇ A_Hx3vwnUճ DFGq57u8򒾷PLrcq֙SSqYE5ZUTOr_!\2~?=f#2AUކ7Jw CMR~`:'?%'˭}Ģ|TFHxɺ;BէL4;KMXVZåX*DmE|]l~\#u%]wz"|>7NXĨ^c'@mKoit|4UE]fnYi-uY7yU`c-d6<JJ:q\Ga> *K=e2i1Uwݺ{!U,c8ueoU蒎^f]޶n$ԋ lMˈ^b}">6\c}J\*x`^v!IV6BUgO4 $DupɎ[t, K}:,BŧYTȳS: Պ3u9ݑjԑdBn96Td3ѹ;u$:1'o~^FGI9nd+Kl+}nD/y+#h893cq.N)TX;ХmǠB"$ЗB92Ø ;r3-;_̙vb|Y-b S.4ͭFkb羻t)YD9 [\k@{4ȢcdNp u0{dǞZmsn&.yJLyn NnORd&..?ڲQ]YHes?4t^4IKM4|a$v!($r_g\L?`%uXK_Z߹RDRe0T"4I~zM9F -!2a`a:0g5W FDOE ~ [qu;ڻjP[Ii{4$Zb@եlz~ VJ,GZPuƖ\LX}q^rZ[_ ,ZHU8'pݍc|O݋J>DX1IW|1ћoS_~TLe%ݩ~J{wB@hË7P[q~Q/)CGSIgo\`C2l*繒\hyS :Kq1z Ž.JZQe3TfC52'%,3WRJjmÞSŧ@2(V͉:1oɏ#OnhoH+tcR LG!d"*Vş*%C\.\ ;pk^1Sw˚[AAгdQ$w'0\iPj)>55Lh_QkKPCxb('# H,^(7LL^PX3\j娚-crlnhu3)yަQLTSȒ҆'{3VS:NyPb.K?Rrj&??Aנw5dյ)Wע殏:lʿ8d$`fy+ ogCreks s}%ZWx0U{Q4f|f}R:~n76CYl Nj o;vJݒ3ʴiUҵTjs]oV~2z;IqR3w׍O%L͋9IRG"dHVNփQӈ kpGp?eqy S/~6^t{a}b]KM j}rd\ݺNgm+y!M[ 5s%H~~e$:NF'^䓈|4PLt䉅'[UՅ86gƫnܿ=ѾWA. ,f͋6NFVa1gs?xlzCIp} g!1n+E ʹ$eKș4]z4>1aS"Dy;G߽|qIQKM*wݠO=M*Ą\24xz `W<8W*of=l"endstream endobj 513 0 obj << /Filter /FlateDecode /Length1 2461 /Length2 17140 /Length3 0 /Length 18589 >> stream xڌP c%CCpwww.i݃C]{1sNrz^C)( li²ʌ f:&XRRe3GK尤@{3k?,2}wCYk%`b`=@D K: غٛ:G!%owP h zho P14:O SGG[.zz:}+:{>J)@wj o5:XRJ6Ǝ.@hdmg(Im1 rt@f;X[Y,y1:GWG_6f  l,04Z XY`Ohλ?õq/2662 #'[zk3;'?6"2# ] MJf [/[[{@/3cX}g ,##`41] 4~+@} I}Ìl-~=bz%yibRHAebf28^EA*6pw[?@o,9(~V_o;W59YZ^ur|?6'speFfNVW+~M,%Ah`hhnG94*8uhpZ+ ~v7_ ooILht{t6.6@/?@/qE~#N迈@/1%#o3F~ "oW)FT~""6s{0}޵ EƆ67_+I2Hdg/^ow.͜w&R?M 5];n@?,efJZߙ]1{˖mo;oVuEG w1Ol}m_1kKoX,U۾XɱtW_Ό#wG̜7<#2s;0_``G'xAML}G?c8^?6r> ?{?.{P?{V?;k~Os7:ٿ/ h8oc`^P%B;;CDIhOYn'?qe[V`qsTpKghũV؅Ic>|ι)39tb`kbߢNy$Ha(*_@I>G9Atʥ%#`i)>JZKgKUc{ELĞH9 JcosVVfB}Xx v }QhUW,$Ggyj1IGĉ랫R{",T^|2GԼvҡjT/0 0_(T.^YNG58]\,& $Y P O5Cib3J> H-ULwd?!2y:m<;LԘ*w*AͣYӟw +:52N! r0wejka"UF!24|U)o,]\m;Ҍ_SRTY>mɖ(^Ov'Q͙.a_52CT2ݖ9nbN@G=St#F$W"t]fdg\04*FNVwQ˾{0tz gskW0{(TXJY!S[ [ h̹e%֋z^^؁4<]L[#(]C]pEY^1;r{0YzuWMCڞyOR¶\ցVBm١J,v, ɳs,NZ'.= )LmZC Kui7ɡMiT`$>Fz$@o\.)#=UÍ1!KQE>%vf񖥦]}m;3g"=6xKBD Q QY;(:7ݸ#0Ɉݓ[#ȟ@~]`FFhrԙB_!P}Yh[#Fŵoy`kW^kL[sh]#^F} 2%Bܚj"Gw糋Wbw. MNH;ly. (=jF]J_"o#S[L{^b>BsE63-ѧ:]gpNjo˃A=Ēo >?Lp)X Rgv_΍I5 cQFTp%é:*־WTL-ЩdFt@deH B|<UO>fT9;(~C)@"hRQTEbs>)=:rH'|8ir$rL4 9.P%fq&ED/s:>_0Lz>kf^=[.U؎ꕗlrVCILm%9+Oǁt qi5vi{;+ '0ՁWV,iAnCYM /" YG(`l޻+1UVD"AT#KNlL3UyKeU d7*k%4&h˒``Վ&A [uѷ #'g}+~iqz^6M=8ͩ7Uo{f H=,Y 4 E¹ Τ6?>~ 'U JR!cs,˂w"Uk Vޣ~T3EO" g0DZġ3:U=e2}<Dɓ#H(쨥f]>dh_F#%7 X$gzySX?>bu#k=(hOIV([^dHAQpvmхO%ua|-9twYЉ3ԶObh o\+sU^5/=iH(b#ckPFB{'} CDy*yr4rHs7lhM)|cݔ1⡀nk8w rN ֕$`Q+`uZ"Pz*A(lİnBxEj{xp|Rx9sE)r98IcXiM =+$%˜_akU,rW?;q*֗Ԁ8sŲsa%I ]P%R#u'] >I0b ~B;ll89i_^ cbqͪQ)=뫴{}l+ :'|D6jg5WvG/rɸ]]yfv z:nFcXƸO(RS?g:ҋ3qp= g - }A`{ q%gʉKHfh N@N|D 9j^da\TNXzi6 5֛ v7yT-+-2XR^A#:D΍ȈJJ}+)c$7QH b;n;gx_M~[4NgSx'\wq8\B]DjReb3*]g{Ue hƐ ~%&ɮUrS3*LW&gh}K>ziHBIk=L:WT%R0WSݍq8.Пb9uAAntPhi7K. C\-E]z]5ڣH./}9G%]qΕh`G-i@^cEFC^37ehהI+0enJ^4 rF‹~}m}U"c0שׂZHCcdr~x_Hf1zIfAz.cc6csFEdt}39 Gs=O3ۆ6sDƏ ku23sۑq5lB@"<5E`x7M|\S0]lSN jA Ob8Ij0 4@Y粏=S%xy@58CmӇ{B,,NQ㍃S8gAJ#G(Ht3fpEf0T;hOCNvlA@d|Yyg`z\`uuE-&ᒠ$4ozn^Gi1+֮R78#-AVln &0Ba4yJۮdu2lD6xC:>0D?6xě#L8  N$$fPل0Ζ$f' v]Am%>&;__C/YFI-Tc0٠a79*nSpRǕ+x݆៵fguxh IXed%i^1$@>Hq%KF~LD7R !RYzM(j8%(7;ZjڬeOg{cw;,d~*K6@mO\׳,D:db2/zr.Xַg۞SEPkk Ǹ䛆^ѾPi!*<nUo}~AG\4vtJM˜ sL\g;|~Rb=Pyy/Pf&aZ'AxqyEr.H!PԢ\ᰡM3%_7c \1'4#jWfv|48=E{Qj6/ɉc[fJӇLr-).C?c&Xz.fayb sv` z==Ɏ6ܑyY;|gYTݠ 48*"q+xD54?0e8RSÓ|rҴ1>7r08 9jUKfؐP:Ozc+ IR"ʃq9H04i]v^>B: m-*luY} !L7. J9q!s츁sjs#\TEǩ6q-?^tbNצ:2I(3^ Ĭw.?-/@ <Ĕv]sQ#r)a>gB: Gz4\FC9=ucʯ=vu+0ϳ2챔&w>A?ǢB:ތ!ESQm"UaqUޚX&×Փ@t17hvJ!ξea[_IvhIkDZvYRt\ w[{BNה+QqtrCK"IqH-B:j-F3MZTL~&w}I64tbY5+16ꏃa/(b6U &w:W*N^U~ (SՋt/ZvT]Vn-R_y\FwJBlE^CkxƏA -8$CןSgi[8wUKe+!{~4QHP h>uSz`n2/mN&qkL,Ce?H{m.ٿ)}h+ 0BH <-ܝa1LZޒr ˃6T8)zGll|]p||ݥYک-CcKK}kV7;i-,J13H0}}]!%@NrnKW,ida%7yaH._MnoH#U E֪#!f';<6b5%CdC9&_kh9ΰ-E!NRݧ-8]M;*cx9r!MKăʯ,mZL Q6 f탙uW_i߱}8@6m=FB- ֿB\,>m@V54H:W׹D$wDŽS JiVD彠:!]KHe2¾t?E#S SXOqȻ)<ܞ=G]=R$y#ţHJSG\g !)[SV].o$ zs| Nt cyJ_i:C-ڛf JKWރH3YwSQ!k{XB ] 4/}Э ?Ɯ+oodmN4#uN|SEeL:R%7/X0kUX"YWRkT{> ܮ|䪥3Wzk#iɖA+;*VtKrD9Ņ6DX)cZ~'C*k|ս}s .%fP[1E5ZNp_TVkź4{FX⡷#6m5qA#B+ cY-2y5s;@8oMp $0__\r@QBgL㙮0&FrDJ5@ ](`U61^8v:S:{3Ioqe:V+_ٱI2tJQgŸi8:e`u Ǝb3;dv.}sN@NsW/$k 51Qr9sF4}P&5jZ7ȴ2mH W 2K$S k܉v? j% nJ"f-7޵r4>%*J3qF ZOGg,^7Y %Ğ{(dXYc{'S+v"o["o WE7B ⡫q.ccǽ Ub kA25+Y6/[#3ؔ|7'vnm'OT !ceiL\ӛt(6B*:z$n,u0 b+ j=e VOɊ +5b5'Q2H>?/c4!6Yy9]eg'{j j-\VFf҄RW8爍J2Jg3*$ٕ O28 If{oTB( BUpH䊂>h1ȸ%:E?txUٳ+,2pD*oż:l=RlWWߚny{ XMSRv_N\U~ ksb=Pt\ P_/D׉9镫xERwju( R~Fp&nսD W4Ddž}-R56]n'*%#thp{ŏˤ*C+t' b &_#)&Ά L"0OIeלm77W#<%)ӎo={lv2/yhKۆ ڐ AYl5Sw/5K[W7MZz$?P@{M?/]:\r06 ~88'H5v=NkۼcVp܋KM}s,`3H朏[o7r"A˰uLWr{{~bW-+|uڨUTzE0#[,.);>z YdKg|n&yKUwHTQFRO VA/ `wӃ*8;3LUy=$綼҄ Ĺk!/bV'4#PGKz븩Զ9KqώLQ}cIt[+ԗVZQyLQutն>,z+8d4_>89L/ęSL,$X@z"Ců|jIF+ y *IEICC/ɨUi~f4ّ]hZ;g:)Wq;7C~jUXeo2aE<}hՒ$m{F}KފV2uʔ6'6,sM>o9!CKrQ/3#Ɔ[d7A[v]4Jx6a@<̿=T=GGO|pKj?VFQc;{o|ȇ׋Mr_M0CePUƂ>ZC' 2/7h0ᱶY@ƈk@̘]4>۹#>LXek-hv9oJ"R6Iҫ rƮBܣ85UmQU}ϨT?VֳKUdUţhA1>Cv5hY &f_!`J|K?]d /ͳ&x3%λɂD U>@E mJYiiYh=T\~&U„g2x?}D%-` KӤVYBS'8F vVP-񵞴ф~iqxfTNj,OļXT,% e[6?\ K;;Q!!w5TOQQ|Il[,jƉr}Dvl@E+U)l=0X*IP?hm&8 p&5&Dԫ#UW﹤j3_'Y{q&0ֻgj@9KD#?W{krT|ˀQV |h^6oSCӵri2KwbB? H`XMGwI^ R2}d>#RK>):i%\ZcJq*qq qddL6Bo KHn@SÐSy׹-_M0 IcxIVHZ$T[E^omWfo!Z)Xŗ z}HE\&xqf%]7._R+>%A9qqB kPkD&DƉ>U'iXSs5ZVgb.*'];i;#SDa 5Lۄ_xוp_ܺsE¯:SǗN#͜]CK dxa`xWQ4Z⧝A@/]&nJ6W^ w =BF#^A ؁$\fx@ ķfy*oP &eEe%pE(M>zDg1P]P=׫hs -9G4Q0\3ֈ»+V:נJB (*)ʑt}} tb?d(CfWk~}rW7Q/aDRgŠ:dL @/|e}Cj0 4!;Q7x5fAp z2bU3ݑ ‰h}zNq>{cKc;~ɴT{D11Mu^@o^U|2"cv'0f]79O䊖z"ХΫ D]g-q:7䊶:(5B-ezSK-|aRF.e[ȺpV=_ #2^u ˠk܍}חpyꛖFe+ @kxf/ evV`$!/]2}t Lvͤa TF˽\@Y@w+!aOZ@w?7z k,1^~تF\\{JtLiv +|Ӳz'$n7K~Xkr"\-g%4z.n)Xp Mh;x֗}|Q22hh&)=eXwAa-)[Y}6="g1l-SQ+:1ZL>dr R5YưɺCdyOO&c6 },tRЊ8iȍUgʊfkɭzWX VTg9dEBB݀he&^ ҇}vHŰB*9v7ؽ^EkAɚ3RVkSVPgAܖ f~܅S*Q0F|)?E#>t:z9ŌabnMzTBI} T|~/uM6i? ŵ൞;)>7 )nQfjhccLBYXEU(UzlRy.;TXm_z_-/G @| g[*Z6|J|ر.LTx.gsvG(q G/p,ܭD2MI^~ 5Y&FNp5 y2 TI;1C| ͝y EHv^>.y-@ 8!#\z,ZU_Ev$ c#4i#߬DCz'rf!G,=G19UW‹hpr:W6dhG ߒQ8 h$>yf):h YvP,H_omMϮr?71o.L8GJ.~ CǮV1MiøfqsF?U~|l@M?="jv 3g{dshq_NH*TLfWF&V*7TQ_fpD23sb onقم}] SX Dhԅr0My&ga67c8-1R BL %u^OuFyAF/\%6*o4W9T00/z/CGO0۶7wyN&nWҽ5pSS~ȳnx5f`#PK%^}i) 4i'Fﲏ/ON'Y(C7?o74* LKWI|9MZ҅Xb^Fb%0I]9fNk(:/LUWEDn_uʖYcIdۋ'-K8d9H>Sx+wB 5̼ O.|L4Z`7/b+';g>)&@k7cĨ:5LV "736-SR&MzؓQ^?tDIPǴ ^sjRQ-9asRÐ4mW#;x"ZTFnA9 #gPB_)W=tvR0_D4 ?ٚ='Y#wa,&$BP"|pckbMϙ .c.ԵeMa*t:ۗ}/?7 4kA F e`BPhakkΕ<+}o iؔ%ym+ {Lq`,Iwʱc瞊bLpkO>H᎖Dh[i):g~+.f(^)~Ŭd m`UѨ6$okQ=:+-foS/HqUe)<J8B4˭W4t4sŵ_k+ӹҹ>d0.LDK> >Z-U S;pd$i_9b2!3N0 n(f,Sr#'7zsVJ^gE L8dk(fSTѩ} ᵾ$v:bSGD.R9MCddc\5񚋗u |@"{YT-q}OR: eGY>|Lh *:+ 1Q}[$T"zK8\צּ2uT=VB|\MOAPђ\Q8sD-jnXhr{# xqWC6`¨HSiα2ʕ;$*W'F*Iqدޫ2 H4s4j.|T!)x\Y39]˼NTr.˝s>`_r{+{vUA(%ۡF I`j\آMާud*ꠊ -o'Z{P8|K n*NfsF7<#$S@Y~-!0tk4C,GBLf [KCgsru ËH,O ה!6d81四ÞF0@B dbC]ZCN uU/ YyPXkKB BE ^5jj.rk SUZb=Z osR$|H]HoE/m:N|B_^1 -"ui?.p>͈OHت uKt4Α1OQ8<5QV쯣v*/x~GDԄbc"zp;[< ޤN<7|ˋ?#93g,l P%4MS`m!a)8}0tw@C "Oh1ernt|(LǡaEAC5'=]`(48Kyd%0zHσGNk$}UNL{ǽ'8_Gc7k5Nrs6XENħ$wPj_5bS`j  s^sF;͒ XGWl4M.n}"le%endstream endobj 514 0 obj << /Filter /FlateDecode /Length1 1814 /Length2 9625 /Length3 0 /Length 10771 >> stream xڍT6LwH(%2 R) J 30tJtH7 ҝH7s_k<{?5u8` # Us13f< g0 *A#mr@8T\!^~((G?D(@[Ը*0(Y ##Ւ +""; r[5 䀬h t``RᎢnnn\@.36n  +@_q1tm.u`p734@ 2jr tU _dտO%C--a@jC@ U.;Z"!.0d<CH΁i-9X:.\.`ȯA`k ]A>^:p 7; #/0AjO&HyY[IAG@^BN>~~@H)翓h7o2W!_j;: Y_X"? weIRp@~Y?n7)YW8Rj0@ke@V`W*Á5@9Fd [_V 4a._o |ȽG.H=vk塖0_'(:;=x2x" [n.(  XÜ~]S/o$V"$'@"n l ')]nmDV !6PdE y8ڂ,Ȟ A_'9ÿI#7rca@d6:"Q(d ,4##r?FEog9\ @?? 8,]ῷ/1< jqdKbzMV|.yoqMLj[C vhcVӍYF؃Oyߤ{hqrJmz9y Go@mSarr}JCv֭^S02Y.h3Eq)liJ,8'-Cw⩳Iџt*1x>{ W=Jt\ک )iHYdT(f #%f3xظP92V8g}-Q,W?P\ΒVau7c"/8| 乏ZvU9!a%ޠn㴿H6ΰ]vao`YdU%ݔQK$&ғM>J$;w-&]߮, R^8蘈`1ѽy%oNI"^l+"L6&p?4=(a;x*RYXIō#A8 yfo&CP'-(mzNp] &_M2k%-O|h"L+!h1 ?j|/$QisreQѰHg&su/+ӯO.;MDeN7|%brjvG^D%=xQFj(QG@4V u %= nx&Fp\6u v8 oyLnId3 kg|kOzƻ`Ēk2&ˮnwQ;h>~oIڻ*5~淊7@-hS^fjۅ(9MbQs}'£yU!kROrԱWaq- *8mI#d7پE]Zj[%ڠ4n\er)Kͅy|%?R洼R=^0qxzʹN!K$Np[^w"poyydO2gy7S@"+LsTEKUXT~> q.+2L`.85}aXSl2bf+S#ga1[Byo{޻cN'D>zq%us7~P[O {LNZ>[V-zjCm jvCl]**+ieys:)Nu")t GԋRz.`GXVa%gϸ۪p]>x7Z۞aX&&yy%`8-׸kܶ&\c8 6% ΅K'dLцn{NGX'A1eLL+{m%w/$[b-D[ 0>.y7L֓|$44I^7o)1鼗d-ږj/qFN&J' ͆HFb&o%?5 @H;v'M %0jPNhyVPUĎwvͫ{a+9VGS&HM ו9Ergz"4}ɨށb ־:iU sYLji3:q`?'EA *.E$IV0tee'4ō2Wr?z6L}Зx[Pt._>ux'' q:aĘ8~[ZˊJQWk| ^gc,Q.-2qd.Qqkb*j衴h䟨BxhORM>zJJ+ bgJГae.YAyuI&U߶1EC Ž8wKJ \2g7˧+[C|~Xs|M ÕVv¼m<48LI\{FPl"yXZG#~?U$ΑU4(4>HCEF;![i!dnEסΏM$1`#WO̴TXW̾`lw5t4uS/MEuseYt,ǜMOiyDZ el &F.ܕmͼ!e(o]Vt#Y 䂕JBE CB9%ӨʲjF{1oV;:i:s}ԜgUQ< * Na}# ИTH7JxX)wT܍Ɗf}\gY*&Fr_N;Y{gy3+ lDŽ8i75&)x qF "vV`Nhp89E#M(eHjBjfgm FA0~N:j22Gq/jy tם$زc(,Ƒ6Vi D BCSds~P&JDës.d9wLx3C7[ /|TVce6(S"WMx57 ,:=0~iO;ZI hu]:fB5e[-QvQ.*_6M>!f4,a:1j!AKc>O2yTBZbCXSݼQUGI:k7bj86p aP8UЬ૵NrQ<.")f)ћP%5`YF*8`;kЋ.ٌ`.;bq{8*FS<2Bo3`7c;g:w [}Pr>+3,M)tx3fyM H {\%R P=֒ey RK'4&?oc3Һ̂S2S.g]Rզ\}UISiӯ_c,m![Ց<bυ&3zL顃eK^~C7#O  ;M.qMUׄ8x,RK>߭%"L.½&CB9j[RGHƜ19KI Tѭ?m*Hm.=v$Daw;ͶZ r8Mh7ac{Is<ҡ5_b=S;W&qMΘL.EnwT~e#랕}uwbc;tQn%2~6KY-NʌӞ?9N&WVlJ\.SwHDߺV PhKqR5\'vnѡYYNˮ 縖GvR3I  -Մ(*dIpP3-KR[ w`]ҰL!P_HmLtĿCTCE37ʀ|㷕`'&i\vC 7siaGB G]ZrңEcgBwkL8rñtFZM[O]儒lD |Fqp YN ;\̻03hv59b>YT xqQ쐒ǟv Nf N+gswF'W㠩&_[[ ~x6u+U~({AM#_9]*d(:RH42^KJ:b}gn RCuX pxz[:SVN$9m@vbFBX8)7<(нwrls}`R.c=3Dy9ͤӛMrթ0ePT/BvyFK+ ">hI3֤^x-mX Ty/V}'?- hsm3-M<' R[碌'8eܕsyu8+FC76Cc*򝸨u$B1W< fJ {۟.N[rq޼9H fsjdl"wLX1,NTX46NZcb#Z~R^x`m""ԯ_@fg(s&%%:VbnlJ¥9H.,"3-^OzVĆ${t99 ᾡGs&2pH <"G{10o|i:$Bu82GGrW 5fyiuI:>`n2fc pU9ƎWO跬D+@;WvJgLQ́>ⳣsOZ֣NeQT7$YLvHԩ1~}),Sl]R]z66z$ѹ:vS%2kX|SUBטÉ̍%F_!>|YT6^hZbuu$g m"J 91R,v$":rBaE%G[-;'5rJz?uS{q$.z@\Q!ʻ sdU RUbMwaN/ ^VrTt!afK@" W7kS ϹI ڿ$h%Oɕqpgp ɔ ~&́r%y CvV}$e3GVOt%C_YOˣ:QYtZKG~#Xٓ՚c!U܎zo2?=#AK>)%Nd߮XMoKC: yÕ@|Z(cƺ~sפYFO*d-(D!vOڨĔ5QM]#CY{7SAJnkֈg3alЙ7'}$Q4]ڌ2.)ҿTI}f5~< DJɹh^H?V倁bBKɧ=꨸o_|}:XX$ WIܜ<[ %|WO )̩wefQ>=M]+D،1ZXy+җ_}(^QZAص_#N\n3"+1c,:䃅C{vgڕE֟v4cwgNyR4/ #Bzvl!}[Jjd'Lx@78crϟ$vnE0I- kZܡY0g tjڋlbV+_CCfn􇢪}=J.zMjlqkfMnyDjc׾TpM%Y;]{_ oIU\q&FQWO1=y^l<,f7~ D%wjś|C)+rL$ەoDWX>$P~vŐ/I=qBYݴvr0兯,dZsX_߉PܑbE ?E&&kLb?j{MNvCPGbtVE|eP:rLcl4)G?k|n(`SPs\OݯFE6_-}M;o5/)ɖ`.XE!Xl^!u-e?ɭ`ƦJ5֙h/áюON&HWRotLMA4d0Qꈃ{>c˳7d*hu~0|c{ Zk&3DV6kyځ.lBް'~&jSqjKPatZI\jF4L^G,gXX tP@/=9Innmх6'P?3:0@ 2|]y+zotϨj{i+(^@hYMdENF}*5378AeM()J0!e}jvqS%?r/]r^2жƊ 9tz:[y)3ˢn"0N|YiDS,FԽ-u2:d G D}5 x1ZɚJ#n*, G׈=6;elyiXɑkqsV̳₽2T)E"fNˁ D3lԟ_}c4@X=ʼnQ?ŷVc!f+]gz:<<=-Sq;xCWL"B. 鵖w$ڼSyy>C'ϬDe)b5ڟK8i) wDˏڶ5JJ9-"$"e_'4KH6@{o!7A?_5olTqIݍzbL}Hb#SI gaQaUrc/!o:'rjVY0^g}uC5>/vu[V=-ȞPtVܼTæ)gQFN1p;|f>r+9`Y*!.>aF =f]=x׵!xGendstream endobj 515 0 obj << /Filter /FlateDecode /Length 2012 >> stream xY[F~_JwCT"X7$q]m=;^ 2Ϝ;pr> 'O=.&& ʰ4Ia&yeNNW r8 SX̧ƻW5ԏ{j4*]"=|,˚A@G3aǖ([W }(HLde+EPlp؄=q)Ҡ2M4e.N}&9}X&cz&<7.1ܗ(,S\3βo$1ihZ&ҤdÚ\0`D01Xɏa5`ք2&7yokTs?MvwRȶHo ?[%Q`_6UX%s3jaǩgQQ+"f"Ģ`J\oAS.zW!5ī0Wq̅KfT,G`ItEH}}usVN "NohX56}WIFVBZ1Aͼ_u ځ d̸$yS6-𵛞B:LC),7?92iKQ %܋Z4t.gK 21t] ,ytfA?3)EAҏs[0 ;͝qi;k#Eod\l3@33XڔmvLX~S9pZ2T{UUAK@'K-Δ:1wȯQãҠB ՜;,`UtЗX20l[T;9huҽ`EWYb yvXFy 6\Knr)QFW_ ܋i }f)+|"=pj*)\f~Wd {ťtͳ%ridz0R 48~\Jfͦw3gA)$@NT`&CuX8QYZ {cI d%kLsI&oq,ˮ/YY' ڮ*惝-kiNJjVR7Nvߎ#[4@zD~bo*N9%<h@T[.k~c*I`BŊ=#W=KMk~+1e?ƪ֨M4-m0;&Hn%OHQѺ@SEjI帏 jx,o;!8{O|dLvсѯmYFRlϷB&(ˈ}I$rފTl܍ua^h_]Y F,eN3{8͌~;fڲ4RbLiHi;5iD^b3♨q)a:Ԫ&Xí> .T;{IU" ¨2͘~6jŸOVY~*BPS6K$t_ΌDhF?ěYqxh?q'Iyh`sEYzm>x?22EO \JCe$R:|$ AQ%sz> /ExtGState << /GS1 408 0 R /GS257 409 0 R /GS258 410 0 R >> /Font << /F7 407 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 4217 >> stream xZOGO;ߝk"@B bp$b$ķfwMp:3S]]ˏ_<_~iKIq?y{Z}t{S}}Omi>J۬7OmlxovlcY:`Mt`fJٷ[o0tߎ 6;̑\`-ŧFZz1K3z~B plP?AKf{!M>]n' <פ(@0xDoa9>6\Mepܯ=qʼ_kVɰ|X`jJޯ"y)Cj $ysn2up5"0uK(8r~ޗIx BOhR {c\BzVUĂDp l<# T'27*B:dd`EdtQ.L'K$ɘDr8fTFCÜEӪa`[=_22Lלҙג{ɣW^LW^ 3ϕa~۩:O9*Y>ҹk'ڡ;nK|nݒuҌK3up,3dYP\"ZaC,!`>Y&bXE$82z^ P-T`*:-l@ β,hF%0uZp&NGh-A{k)_I hQB䫀KCnǗ_?O'T=OYEU ]4S儇\[avFE6"u6yjuC絪 yߌ :U]T.c*]\]QҪ.zh yua,VLZg`:lVvU]8Eq5l\EZՇYbe'BYgkœņrCydAɒ=ucQW':˞,ܼhfU]4ݳhޯU]\]ԕ0\]%guQUENRsgua|Vj~Uf~\]R ^]$Ī.`k=.`7AìW]]. ؒ_.V[EruUݭYxZEruȺT4ZxEa%7Mwsba6a[]"U&5i.C5M.qdJ0kAS&u|Cq4x(8.A J0I![eSnn/_ ;L&[#()[folxXW*޽g?W.)Xؾ)Wo??~駯8LJ E"ch(>~1vtcoC@ǁ(^v8 =Eɴi}mޞ\'Z@w(3O75]n9h=y=/!b|.|İ"0҇8Tz,|dpv yڻ{kilȵ1W߽ns6uiYwE}ۿߺJ)W x7CnIxLgtn*Ӳdr `|Qur)æIlww `0mq_'ZPR6B< t Q XJ?gp$J4JCnW~i\ͷ_ž#8RgD-F\iy%e]w't-LmBD"s!0 %J+KP[4O`F1 M©mYne.%Y[~s7{X~I)PIF6_[dOl$h?߮ n[YI{j}_eQӧ:fm`1cWSßEԤ[a_.E=r`v-7%KoE7zQ0]2pmM tw}@:^-uq;r;ίӠ rݿ)1 R] 7_&[ 9LΧ 0bݿmr9Ew8Ӂ}1bZ)E)X[gJU}~*(lz]`#]4dBn;~|Ҿ{:gp *]ĢA dܮwn~av+ȺPpCN( J~渂0|͕ȜV$QW{'hKH~ȊU?ĭɾ_z%;˵gC*URO=Xzc(Zz-.!R^?f}j=،>|z2MKog}joN]?Cz[z"ޓ68JzEl蟪^;^gL~r=pm÷ˎ[2?uGͼE3#8>yQ闗^Zxl@G/g<)|?J/08#'?X^}C*.7x{t }'/?JP$7yNX 2 |A?|o3+Xs [f{z6%71 s>^0'n}K.z^ÁUj fژOySSB8Oiendstream endobj 517 0 obj << /Filter /FlateDecode /Length 2457 >> stream xY[o~Kˢ}h{ER$SZ4uPIԒҺ\3]g 9<3s;$ZGI7wE$D(mYT23/g_լ9mlWÿ \Qn<˲[T85e4OK06O07õ]cjc*ܙ$ 繉晍w\;x4}n W+W22VA[/A*,y jj'+ Ou+ /p *ŭ>zrD;4c7% rl0<3y6Kd  DRܢ(i,qqh<8LyZI-MKʦOEg'KXtO0HbfL,w׽(uZ.RlI4tNx%Uf܌jiQŨ!ݼBvDy(<^vAUϲ2*^L9* yren1&d5_ntgchlj8hN]K$jBN>{αmC]N(ct9OLjUT*u V^]\la[)/²\Qy]&D$DuvbMbrf8Iz]88! I KLY# O(]C%:U{H;ejgw-_GWȗMXK^%  `#o: m F!:5ڮ!U5=qYqvl#g-ݒƹ@e`[)EI3Gؤ%u%F+I; QAhIfj+ܹE) {)Ř*_=8܏5yȪ2@ ࡋ^ԘF0pГ拥JWYz9]hXJf SnOb,(p-󓗻ޚ݇aA }˭&WQ{<zzl gF=|U#LHzX -P7%(9)֜'yHK:f98~xR$\#:Bx|z܌}.pthj&H=3C>d7S<ʓ\Ql9M كGK` <2 נ[[²‘ S [#)OSZ; o&1xaN\Ϗ<* (ir.mBr'a'/r} qHWDU\DU\ڲ.wKt yKoOV<а"5leq^Vq"iԏ&} J̳w*̥bnԭ'ӹL=@וh_9bg :1p_6ךߐ_hH`<-PqUjEi]F5:ˎ0ĔfުЎHcB傍Cz2*H{#.i$^r w>ĘCT֎gHcNYmq%@f8Q˲q~j;r@[yr5z> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 519 0 obj << /BBox [ 0 0 288 216 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./me_rent2.pdf) /PTEX.InfoDict 419 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 421 0 R >> /ExtGState << >> /Font << /F7 420 0 R >> /ProcSet [ /PDF /Text /ImageC ] /XObject << /Im0 536 0 R >> >> /Subtype /Form /Type /XObject /Length 18771 >> stream xMnQWJTv嫗OM_q~jؾr2q5x7 k m5q[պ}nO.W%~_62'/KҴ|-o2MGeWZ)j߶=vkE{?3Zj[\_uR5~_Cq_5bʕb_&;Ugd⭆?oq__?N|+;}gk3q~_ `=e|b2.;V-UHLg;ɓMk ɾwĽfg+.bXQ/Yek+}K{-k,[u}|/lw pq;lva=2"ުl"܋fm]:{C{g$/9Vw~;BqozӢq%W2%q[lOX.*v־pwae_վުRZcope|ִ4q_n""IϣL'= X֬z|Pz.w~}t\hV&&~ՂwbkF{9`e7틤L{쁔߲oȼxK n/}r2ߢgǽĭ1qh+}P[h<$މx[4}(W]~NJѺ8T^ NBݚ v/}!Caen;1tb]MIa)vb\y(1,D:~MbYuj_^kjLLIbƃ24 ˣP\-&0mڴ/@-x,2v2ia%2e|V͆vSqYQ#ӰD+=5-_ l#GgEmq_[[Qtٷ8eCkKxL܆)v_mI[hR 4Ta\9m}_bFB_~eOfkb5WaA#CzѮC;v4bOpv.,hL'^/a@#;ct3녥~lәa蓭tm`˶dX:6mO7E>Ƕt[4+)୆m0|9l>FV ;:W8 d+"84fpL“=-"Xe+,} + VJWr_JUւ2Vi2>y #I\1LiҎ$A,M"2#fDZ}QvB?ѤO[Z,a4MvnFtZOLjRnyb3[!TivԌDl АtrLАs!xp)_а ?AЖs96d_hA͐s3o8}֥qjo{˵Wah|\CA{M` KkJsPWB dxZ|fx՛\0xM6^r{+S|7`/ ^ւwcmZ^lqs+v<4^׸;[~ 41E;dnq;ʹ[eXL b8 \!nXG[*%L~IPJ6hE4R̜Mbs)8T72ŕlҜ~oᰩV6uMztoFEQ`VI# A2ѩ_0ġmߵcDjt_}al^Ƅ̆}o}\ؑ`P2fuZ 3 " c:$P$a1$hv0$eUI 3 X14ǓNL qi, Z1> 3Rn2 3DjM0MlGc6A).Kl6lLLc6&. F̌NP&?NeSj.-wShۇ;2uRro;52C)ۗ o0v[܋a j쇼0vݎ8o%D*~V:n`ؾ4l!.Iv9j2l Pl%&B>R@ٺ>:u@Ú<.?,i-=g㲅4/$s٩l#lg\e2 H+A[>:8GPEVqɨ00R@+d+]O|?V+2Xh؂g' :,eE^ u<^Ejl1Y'.f{{me:GU_o Lۀi2Y.&C,2=e+\:jKTXer?oc]&YMu%^ .[~`*6'r][^X{;űy^:vAp;lRJ leb&[w(b@z -VL@BZ7[>Gz/~[c,ru`cx HaF0ɪ_@_vp@!B[D#?P@}g?ZAb R?`˰yS*A$ÿ8bb&)ʤ DB,&"3ay8J [L- 2Zx<(xGݬrxro'eP15_k2QXǢcڢFL0/BGd Yd ێA$7,m؎Hdಠh[2N/DZxA'y"+3p;Ar;D',--kkز m[ȶ.CB2$2{~$ +O'Va¢Yn2+O^V$U$QW+ǟ Yr-yN"}.b⑘⒐\2.R^".$&h!B*J"G3 -ϛ aMXԤ׃HD[D@*"`^F8͎G/"2пLJ 0*A11fC"qx:}o FH()$!F }.(2GH< ijHEm^ޙV;4 & И'\JB%+d`rܫ niãcGaNY6`cK!kt{+,b ]b玸=ii=xh3h"/ iDw l@=KWpV~&Π MQA=0`PŸY=$aY#@b)F`e7Ib"-2u]@|o) ҂Dq\P뀅4+HDt,Gv-8k_/8 gqPƞec;˸~rK1>d ;[^ G{$ܘ14͖+e7%Ԁ1nU'ܔBcL)Ɠ0Sbt)sXnۄ"R&l/LQ@0St'HaDj3` fqvˀ<Œ7%P/C?e/Bxr^+׍-`2~a /M|B2~/Oc!`E>a.oK}}/[7TeVlYA^*Cwish(;";բ3WFVjg>`R Xi -VJ, ,xn?aelL։ʖFXn'tdɤē鉡“&I5dzNd+MhCK>uʖ,[%s}Vk7 ʖ Xn+u`ŖjX1t.t.BK..LzV+n) S#dL7B9<ŶSu\WW2=o>dcΫ A0/tY?.rX TW(BvT[n+Dc'gbE @-W=7<QmÜDLϸ CrnY E $<\:K"Sy;!qHNE $- !*wMQ,A :! :! SIH8.2HH ?. !BZ<Β,c!UƱED5)zeoƏ4nҶ jE&!UIHfQ@@ &D":2ID&_Y|!ʍ""񀈪rXIDqQU =A"26QͯJ*Ђ0Y?T.{MD$7~MD5VsPeEH=HBE $5Q-"U[HD8=cnzEB]d2 *w(1$Bj{P5#$΀(3$G)þoLX5\ADK0:6J"D9$FDR}S :ʝoz;6 YGïhxMeZ@ii8T3gxBhӒN9[d뇝EKEKaΊ;yd[`'יN'jܱeX6ozq:2)o vr v '3G$:1=I'( v/vr޴"*Rd;% +ЂPd vj}N`C9$e9IMd|SwEo@L;~@ +( P@gQg%d͗pQ HK-Xs 7[W S\Dd¤5Y&:DId<诌XL`"o7h݌F+-`.1̼.j=b$1\O3hJRx&b 1tdJP5f 2#>ьinULHAd4%#jU6B6LVb&/LIL+%F#ɋ"&S҇l+E& шEzNٸ`JwZUTu$F#LFb4 B&єԵ垮/fdB1jl)fBs2[d!/MgUe|1\ۓt̯ǝG̦1Bbr22$fSZ̦|11[%n_/:sf `n fb6[-)fkm'HYn]gղ*idd1[+_bVmy(,^VJP ٮU[dTb2S"ٲ{{3fb֣>Й{I]L KۄJT lt i KFs+yBu XiɮdLG?n(V\)[ cڥPi"KwHVA NWp'dDaEQmPdWnƚHkȬh;vF,%ZYsS\RdĆHJyp2j#EofsP'hg Pẁ =jl1PgE;FB^f($z!rQy_cCfM5zO&]= `  Ms726^GбWwgp` Ltj'uyL6jzab`a"3cz*aݯ0;>7oƾg.*4z,ёu>poi>{Fb`M"gxc@Y唴ă#-C@#b hăv0Lhz|)w?%^!fB#HcL1 L?oh|P/h]u0}Wh&vk@#[ N!f hl4Ns[u"Uu AT\_uCx\4? 4(9И<}TdD9J3% Gq QT5_O;-3̓ʀᓐCțCJ~Ot?'?O:?%9ֽm'Ο{K5woAe&?GtHdP Ah4i?Ń]:vmߕÊ^tly+v9tl`bw+:[սJ)VhNVN:t?צH(tM'=|Gb;*M}8ïg}`EŒA6.Xi)XӃol],Vt"5\Wו8ĊmsrIۤ+JY)q>hE!VLNRV(Ǫ$+B3={IA]WtljATo\$段@G_l-JeXcʁCR茪/Vv }U"SU߬ά5 yvgvfELU7߉m̥+ M~GÅ xlp X@YU(lݲLj;5YDT;C!Nusw*$*V~lV׻qȝ;$;;ΐɝ!;zqʉŝQLT+qgt%w2'SOܩ#$w&ogט qʣŝ*gwq+9SęL}g7-SĝC ɝJw58S~Tq9 .%ws;׻W`Δ8UDh]r;k\(#ř#iˑ3GVxnr֡zcGg3: S0DL ͛tAԼf0!ˆA:0ٕ&t,!i.D :1+QL}r :'{ uń & :E, k1aNbB2(cw751!s mx2񹻘`5:'VHw9h>*$]*$,h]0!D$ D!aULdbCl!aG+qE A@1VaBT˛HS&Df>EP9sqČ6'BB&p[WɈ_1g¦acj~6 hS/}%Gvercp㍭ב{Wǚ8qd}v$;Z&&umHe#U>_&ג#a]36C\]H!x?pdٌ"ȡNQ54֒ lA|qt.n$Gv6yGFCrd'7#kI ա׋#Un/켿Hq8kN*92NNGj# + qő',lB#Ȯy]<4D&He#G+*WT8XOF5u'ϕB3d^iA|n"g,ऻ+w0%;;E;u1{IF_gwJA|H׽5CһP|BI:ǃC߃~?Tg%*2y>o}($yCɫNQ`M)`|]lyYLӣ?OJz0>ca#%9u_Ro۪5/KȎ+*Շuz>|3ks*OȎ-ZdvOȈB,AU$Z;R=ّMW}yԜwE,ٱ?P {ر5ϓu.9XbŪ"48lGVrbǘ2_(!V\jw,vL2w؍8;=Ǹ؍8%‚Ȏ#|dG'=^bA;ʖ5=#E/XrMɎ>!7:aɩv䔏8"`ǙE3uNweT8UQ ';LV#;NeB2ɎdǩdG88ɎS#ɎS ɎSdǩd)"q&eN'qj^q5q˜ vj8Mv4S>dLL)2`C1~?qÊ7ؓ8$+N<ɊSMȊՆ|녕?`ǙvY<`Ǚ58aljr`YĎ0qSȊ=;ĊzΊZ idE/FΩ i^)+N꧆ͤ6S3jDyͽgu7 +xj[xvpFSʙqV .u`E%I`^g'b:c5qYdpdDp,;FFU׬;IFQ=&8؃Z`62ű0DmjG/F#N Ytdbĥ`Dk&cmAuGf1h6 B0ÿVg^kY3dƮDdos(gŌ#fSYsbơ,F2GC&31'3*/fdC0cTsP G 9>ĐEIFE?&bHgCvťɐ׊!^ŐG ĄdȦ,3noi2dʦEdŔMqk2%;S1cʟ*d˔``'ƔW-ɔ]Ydʮ3Y]4dJNd ߘrhh )Xcʲ d3f:XZcNm8v}ɘ|_-1W *oAJK֡CAz`LfRay +W0|'$h;9( #2}t8_M%e= F02uAf~Xi`0iX2S%j^z:|hNtجpd""=.epk Z?C4|yr,kL@y ɲQ0cȁpd,vA.88R4g.ɲqg #SȲ̉*_ȒExYvk-4 JvYVFp( WP#WIQk(þm$CͶM~ ˡ٧σH^_R4"=yT?Ez"hAz"KEڞ ى45;Wdg;!U.#YΤqh-dGҴa Ecɑ4gQ$d95N/MGN^9E2"M޼ K7d5!22AK~#ɯ (2\fQ$iRKF^/o$NF K "o$Hs@4-+42i;7i #Hs1H3I(R\D\Eu ϕ8K-+IʬiBs=I+AK$ϥ+'\! 4<"3?IjHooJ@ ϥY$8z \3IKI҂<{ΌF$M"iiG}@{@ }$Ŋd[H}$Py C}݇|=ʰy|Gs@<ۛ*4-/-}6qݫrX7xg!#:i.e c!b bDr'w5_fA`ս<=wXÃ9>N- AypF6]72IL7!V} dY F$n O9_OBJ9U$.Mvl]2>t.dL1 FLiRύ͢(2V 2VVH'FFܬ)irV"nޑa&cwcbjqxo0psqSl ̈́&H2и*?$q ɨE")ȾyIdId"$C$؇vL$A3A" L?hRI$sMy" @Y }Ni+I-::+S7Ks׭nK --d 0:?-:Jln5>9msI1R$#JܡdRdϯIiϲP$=N̶c R0,E=*d +D:.lX[!k0^k$+~)A(SY Ob',I: xBӒ;ԕR$-1=@ӄG%? KaI|Կ;]c= QӒtCW|#⻲QhI6 a|0MS\fjd129&&^<̅ۦtdIX+$*=6C[*4 m=' ZW m0AzLc숾.m `N`i;,o6jxSڦRkl%_m$^bD`ŪӑqZy3&M4 &BIq. 'Tk*LzZ[([>'TkkD.dGH?~1uͩכKOj.z鶁5/ёb!%:]A\y}!:#/%@Fh~tJB'@ (:G EtLtEj:!=j3yW`h!>:$,% 壓4TT>K8O-!QlU4-I\-ry~cX[ͭ0JB{2@[-Y)&"ȱ7fWSw\:[;coB s@l LJj֔sut %pqʰ&io6272=T}^{kFzLd%@8Xi3R'c&D{ӔNLp^h3&uxPFGF6#ڌ s1 \ݴ*ҥTf[1` &2"HPGXm3<q,$\0?=4W xf >_[2>=2^Dnڢ_[LId7cKXQm? Z7=Y.gb`oyu rT|lUVe0{'H(,{}eq6Dda7\M:۹7WTYࢳBCqd]}cSt:)scSt6\x#ǦxufbܹKѾԲ(woU[~SZ>Gk.s{Sq@r 1m).<ȱVk`Uyt8 gDkte~ip9'RD  h?_kPAU8%bb!g Z}ph/NOF7}'6d3 O>kV30Z-m8!ʼn5<+/~cqV6h5r-N:&kqBDX_k{Y} ^cIؽ8E c+6܈}o辷Nwi8꾷hXu]AV!׍n추#7\سFBƺZ:\sR7!D8׍n Yĝ}^5b]rl?w6)/w>3[?mYx7y>ŏɞ[w퇋~AOŏ~w__}?rTܨ_?ooy5]gR yQxx/}t/#Oǽ-k}d"ONFr9P<΄)^wL;0\XDEqE%w]j){Ox@)^wC<+S?߽mol3ڏzqYTVۇ"Ğjgw?g|r}`v( e17_~~~IH^kIsysg =_ן?Zole _^|vo.ڟb؋qFfW_ /:;_\*w/o} ͹Lgß>9o?CL1+(^w~Fu'y3 3`;x<~<~~p>#~q>#~q>#~q~ǿ+J pendstream endobj 520 0 obj << /Filter /FlateDecode /Length 2201 >> stream xڭY[o~K o4 if !)ZeuKDy7.p(Qظ- ù8OI|:1yI$UQe+USj}Y&:/`֤o"mwZv]8*}u M =<'xph.` zGy/YT6Қ&+@;ng7`w7yb&)r&ͯ7&+8yPVJǛKt3(_0jf~>o ]^vݟcK0܁@3 Xɪ+jr(.,3|EQdylE~N{0r.&l-tj ∍6"!ٖ @3jv_k2Ӕ:%l/綮SVdʗ,svG(El N$ :.SBg8yf"G)aj<+(9U+h>pԣsy/wH \l^ 2! xr2av!<$N'k,|֘.+|Ü="P/.Sx %$VXTgٱ}p`OB4ODh ;D r("'c4Hu`U0 2YeF͎߱Zg|, ڷMXT`n2t$ =Ϭٳۀ08~`.u [DpP3`Z` @M'H5@8^`HCkL[EgIxv9Q!@7\θ‘C@{VKB,'S?nJl ka{-UV5m&8b.wC/Axo„%gT$)>"b}$XuXp2Fcl5yjSY|6 )/3]V<dOvd+ԋ ŒJESghY]9>`t?`(KIN(ˠ.&}(fﯚ,m+*iƞfAO7H d^6"~n?S2x q$ Qk)w5:#(lE*HՏb'L,[/E^rnb >]ʅD2m3j_N` }U$7 ==ąL˜VC%W9N Iq~Wˠ:7.dc0?Iq-" g.$ih4eyqy$ <j4%%iE44XDɞk2 ѭM|N6gi_U5ˈR垧jNR:\Yd:0["EsV3ڒttN>9&IƱ' $nqi'h%z$FIn! BEcFԞ%S V1%Z&$TDvVuYoByuµ/b!t&mPә h~քkZkAS3A0{Vt  q7h o+/ Ϡv8@؉"Tέ a lKajN%a0!~c:wSC{Tcf2(I&zcaEL::C:BQP&ivn1~Sș .tu};͎ըȭ&& VXT^--ʚcrS $+w_#GX ܤxv;m$ 9d'ԯx64.i|ȮS?)\endstream endobj 521 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 522 0 obj << /BBox [ 0 0 576 216 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./me_rent3.pdf) /PTEX.InfoDict 427 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 429 0 R >> /ExtGState << >> /Font << /F7 428 0 R >> /ProcSet [ /PDF /Text /ImageC ] /XObject << /Im0 537 0 R /Im1 538 0 R >> >> /Subtype /Form /Type /XObject /Length 42286 >> stream xKtKr7?Z1EۂȀDH= 2Dk܇%ѧOt[k̈'OۿOQox[VWZ?_k97~~KʘgV~_~'Ͽ\oپ_w5ϪZy_g_H?˯|ߚzh_ySLg_ ~s> ı$~Mq֟M=ׯڿ.\^Nרs>r9wr3Zz9_9QW_k%~ 3c֑1}]戼J ߞsSWn?'p<wfgi #/kwug?~lu=-ۓVwOv-slOݿ&8?"nQ?_]yTnşWk2jyٲ]7!9lf޼;?bf8wu;tiztKvU'zn>X?sLJ[2qe8r~?Mqn^xe30&cb2+2ӷw7ۣGts[B|kn8WS5tsf qBq/MWqkom?Vf'?zܗ6fz>\=r=%`zdiISد 2QbEW$[W4y/ʣzğ%bɣ7Fȏy)+A}:}8F1u{ݜ,WW KH-Od(%Н< /P0ECl(_ StRe:} t52B_PIbxn](WNeR4r=PG4r=Z&.霟G5=O,0еa;v8/BqzϳsݗwuX ~#ʫ=a?c]VjV w]!ͣ/h1+{`0ܙ+i%羴ǤX,uSN|46 ٯ-/f*cy;m@q3.^n ߬pR&{Y\g۷S|ܯ=ngW]K7{Wq=8 =&&C&GMp7ol/8 !l*.sw3M=Z Y yq-h9hcæΖşBT}|[İ#5¦|>-ʂ뾃LokbL3abIFG5ltdbAEGl'&Tt`AZ\`b =Nax“3X:|,11Ȁ^ok;95nAX28?Tg#Z"3 4( tQ}^xeDh~ tfX-5XgspM7^c0,w{k}F@ȶ'=/JGRG2apI4X"myN)z}nȒI_NA+K[ǀ@̀+na\摒'pJMB8 8,OQ Fop(/rd߯ed c*o#'>6Fݏ<%ö=c7e X_cY+Ŵ'C^[fWh;ܲw #Y`iqyGI. H!8Z.^j󈯡?b~|R=JR%}~rCv?!JL 8ʴ_ #MgO<&1vE.8*\HgAʿ[fd h` rdcBݐ^ i\˿GdԮ6]e3k#kq-g- 8W}o ԭ,.e@6u C3~CM6 u&Oĩe#ϿxqS `t0J68l\h,t'\d{~<6wm>d4ot綀p%l #u8b2[) ʐJ% >:LA&;2+1`SY~ VT!A;2~ȏx^dȀ`,Fl? B2 :&2ȰdrFlPf Lud&PUk[u u`l>L" 3)&7]_&C-UC)W(`&c' a2GUdZQ^hld}090H-rə\G3qH :4+"p ɼ഑'lAJXh(9㾄=$@…|b?il ޠu?#hbEb7C`F`Ha ,הw>{TF̯ Z|nI;cyR~?;`D#[Ȅ5Ö׭$ZVJ;_n-@?MJv+!1znSU< 'm'6~ѭB"КB=H= s`zKMT ]="iFBaI[y+D *ttT9=(T^z !! M4[y&DCiVUg~G4AjGisU&HCM)9ҏetUiTp4=_ytI?-NH^ v+$~ݖIVK\?3TOvڷ*2~lfd{ Zse O恙 -ou0 04-f׌=[wp<*Y(#,Tq'X Yibs瞩Fzy#gM0 ƨi$؛^X "b;};#l!q$yvq>]Î8qa]faI;T+/CV]|!w: = B* n/0>hkLV4NwVWVM4.Hj"#XhNUU-yp5|-3|{4,UVVoUR{dV*kX-ͪ҇))p CHjl)USa5)Mj s; Vן+7,%K'X5;*~ʮ:}mT<15t<0S˪H5N-&@@A*~TSE5Uܶ\ HYSlFmL0'"h쩥Pki~ ~SN`,PR+t[~AtDp KnKrTNzVtS{>p?2i/88ޘne=C "8'UMZ,ZTv %Û2A֤IdM#ư$$fYSb5{ ZLZT(Z'Zg֢vD&^D\Pk +BJ C"Дm|j\F! -6TFP_&" wT"tQP*fO"A" [؞)-z u& Y'Mؔ^zF@#ĶTDb8+6U$6 x?Kl6d%uO۲[RFl0[A<$."%0[o'C{ Hֿ=Ba$qeYtLb*3'MbElGĦGNhcPs4\_ІUUq=ЛK^׆w:&{~Σ.77|ňކץ-6<(M冗鬽yw\,`9`9,=N<d ; ;aS<Uyz ;/ C$7{;8yu ;gź-opVr>Rsk\:S7A7=x%b*l"dϪeBlBvf!{#2"cϷo3 Ի213سFv=O˨ "FЅxgJ{W"D®zw"aH JD^4ve{hXA HأHxdzA2 򭯷$7hHQ!ЌyoB*!P[9p((G ._!pAHM$T7ok yCD?1#jɠfm>a(9&Oͭ2$ΐ0/׺Wzv $CzcC&.=}͒b.Uo𺳀 ߄]BX cxEZ6r6 #nQ[>](9: %BIE%%@IWANw``S߄+[M6=Q`YL`!E%K l#T$ڮt`p(鐻"`90` f«wO,5{`Pk%h >aI`9g $vXf%Hk=[/=Xz%Ilf۪\+ .I6Ev>Tq>$;@U` d-|kb APucB$IF,߶rΧxgpH2+I@1$֎j:$N؊f$I> p$66QkFHFm6?!56IzFFDGML(F]$˨MLQ{Vu5&$Ȩ$`R!TqfQo1+KF vM1bԡAF1 QuJ:՟JFU?u߁i6biuaO2O;ȨO:>pA8E f(~^%~D{,:C??/ ~(v;`W,Y<*E2؝ ~'`=IA?6P*3D ~5;uG?[s=1%CďL#H2lDISe.?/?L '#,8sIǎn#+%H2U}B@NHZ }N`N?wB庀(1t0E`k*FhkѩE wt(5oWDηI詑)#hjL? E#\PGE{hDIzBͰc(г儢QHUF-c US(h[((O7^c~d`Csk~Ѐ(:2+ o}Ę>葁2DѡVL(_pQUw&(:4ٞ(:ECTh\/Qtd:DSjVEsWE@)h|?Q&%(c 1؁^DѡVq: %#Z K( qs"&ՠ$Zυ]Έ]DϮdC&UkPTs𨣧gS㱡*S㲉K㵉K5DE"\m0O4AT h#Н^!@C ݌5BC[1wJ@tbzcV4U>-CgO#*UN,HQ CI 7C"f?ˉ&]0f9?0F3nQY09NC"gM"ДS|H1 aF!sޮ'ct]$0cqq5Y $HgĞ ep"A"X#$c6ZXG +j7 ɘbr1'/ 1b{l[=Ō0yPFgMپ2f1U(A>e<12'Ę[)|))L& c*L0<0&4+Ǧ1GS'SUgbL51p P6\*F1RbLTNH2s1#I 'c.i29~ǘ NJ1猩^1(ŘcYdiGƌL2fTm1dL71ɘ#Ɯߪ̡Y1Ve\a*1fOɘTVK 1Xbʥyh c ^2fCN2LD2Llp%sp!WU]SNdY 9:,|~ɘSU2e&SZݟ4 `UΔ9_s_Lw0g_~ ϡ{996dx[ŲdL?͹\ n΂7q,9, v1ysshp!o:p&1=sXV,ݸǙtfBPQ8࿌y(?0`<`RdyD[o)ɠTc"=W?da/$.u*O`dYj3s.HDY̭M( YV8WJ}W0xSGх>_Lɒuu%&P@gO ZH:зF/%Y;gPr#Jv6pyPs |@^*`bPp %ǧO T .ʱRM݉%cLvI8cETGȒ*vM= "vK6Sdf9RcÎSoX%uXR[KnKnXr& KU=dɩdɩYԸZ_Jm%MASd:XKNr$K%gKV}{gs%M~{qe`:~w KNu%P3,9,9uYrfgbySɒS[0#,~#&FdYxȒp\]NvUf~q4dG p}W&KjxXR7c=JKĎ[W&b9@쨎3:Ďv14GvvWZ'캧/Dv٣sUdGZ1 vCVdo5\y:q>& hEvΎ8xOCIǶT6r";?1츱b@N+vVanD 9o,:"dy|h CH澞 2M`d4X0`Gd*#z;2 U:4e7 vbp}Q߉9;`GFh ;w숌-?E0"ΑDz!*#a;2bǪ[`GFy 7ֆ|HUl$FLW0\Qv1ܸ:1"z6{58 7Gz'0P85a62Gx9ʹ,d¡`62bWĈs$F\bD}1digɈ512Ĉ:D11⸧:#*g+FT11bDuɋudQň%F*+&:!L8uT5pj<30Zv0.>#Nw%~2EńCLB1RLqb}T/b Lm99L8}#C$&ߺ[Vq1[_x=L Yz]~s&܉qAo5 n[D7+FyO #~ !ȕ-79.~2pnRpE缑afM:S7-=ϴf{ؘ/~#?, sB\߀!4gH߈M0qN`^~ =k<870'N4DM(s&g&o@A e)o&V9CF9]7D؈ aVX$mz% vv#/M7bzwJ&w, OǞMh-gT/`F 2\O QlɆ ;t#E  P(ӵWPpjD[8E1`wS~KQx'4zgZ9mZ)wmHK~?K(n .Ҷ#90Då#ሂK+Rx(hUoy$%jMofrǥ;Kc WahG N! z*_DťrJ*+ˁKIF@ T\^@T\Dŕ40ZyHHhڕt Wy t\hBt\:mt:q4=G\J\QI\ %f% %WVy#P^\ W6vz%:8>dn&:zF8踊N?]?DUߥfc=­DGY=z):.?x1IzE zI#b=z"F@1vN; Gع~D] gb+$N!LB\O")B^mC*ByD$ĮbNBT1w: bMbJP=6u&q(_"GbDKzG}vosBXl10xqwv#H#/s{&zzIgd|&"Jd!1AzHOQnz XKxzH _2ggu}\}Mh,zҺ@;B㊎#wځ* =ozhGJgVa%Q RQ. Ýډ; M ӗ6 @ѰXe`9PbYU)z~_E oٱ6A1!b9R"˲@Y8|})\#O^oYNؑph #%ד=%-,r#38'X8u&)qV^ MZ&JT.1.Fj3"%x@+jH@3Rc{TPYH(2R)Q^ 5LJ\QkiJ%qHq753L+MJDK_{پo;!qo#K/%nM5$%b>ԥ#s8(qgR"9%>߶]Iyi-nN"w55Țu.qsq>R?M$EnM$EnH[eȭ2PR֙uH1(r'>H['>"w%"-c8#)RSE¢zvF鎐8kb;{LHGXѳ""{7h*COVbxB+\IT 큨Y!c,6yš`1F5ɁE72Ƅǭ!aqg+{vaqG!ny#,n(y[5ǭqrqOq78u. q(x,{×f Q 9)ᑀG u@`q+L8,z^W}ɽ^wKE,.$aQ!Sf=Я__`qq*aq|{^btBroMՀEs!w#|Bڄݸ [3OoV}-qYr1u朓K*b<+Ⱥl`ƌv0<֟O( DV݁l{A7UpS_$hY:#fhY8J{9o 0KX#̗c?UܱH48⎆U`;7_n2KmѲhL Bc2&40p ⎁N8!ܑ1WAfa@.wp@fYg8H$qG84cΦ24,@cN Ef;z_ -6Q$Иi?K_ Sd, ^<eh; ʹ"ǮJaXġB !̎1{ +,]t5Z@ݺاߋDڸQB̲`7@ 1'OŁ:p avfR!c3i.C51HCaT璪bΨ#Ypf)ICǒkk1,%2F ?`r `GvfpaNI3t73 &;j| R.~a}F;%=9,`#yZmtKXǍ7;'mk`3 v̧ d݉a.`m:*4ŽHp5E;Q,;+Ǩ Xv l cXjvGjp?ia:202\0|K_d$6qxelRgaxL԰i^N L~5ZO &\EHEDaC1|klœ e̲T06?d$q l gN*5&gR$Nj 0\,Il@ϵT03WF ,m? Mp鬅K:ʳ'A߆ְTK KœjedyxL"{9"LLfG$&ӻ÷eIlMfy9DO[&3Q6I&qkVyLP(.)i vܗW 'ՙ$o9>OIIR6ḠЙ}ET=۳O%\5$ؾ?xPV䃫3BI"CJJg6M\D>$oh 5J=$~' ʅRP0]:sYJWJN}$Ƽ]%Ix!$)*Ox( Z%4ZwqQCXJpw#@\WI}g~zh 8aB+R2"˫~%qKhEńW+V~׈mߥ~r7(H^XHҊTC~,:6]5yz+TUT,$DuFv"ʕ`pY芫PG!!FR\CH[#b(.;ʊc.Ub͡?ѥR\ԁ#FFc~tc]*g-{XqO*WTJOɡc P\r3vӣg*d0;h }CmU8 䣝+}"DXIt&hJdT>avAw׾D lnڛ rCvwQ'±}TǣW?Om$oqio[埿-D[sV^J%{=U!>o?'?? ?y18w4??kk'?/8Ÿ?ϋ]gğ=sJ?Im>vCϱqǟCƫzZ3^>|u>8Z"J3/ׇd;lstƋt׻gu$:Ŀ3(Et1 Z_w~ޫ/Ϟ%w[f/M/׏Y7Lg-7S|? ˏ'eݽt7X=B+i{?ǫYw, 2&A7~|?[oy |Z>Ǟz8Ŀ3)^z:D7P~ߑwq}G}7}dG mRxxR|GR|GR|GR|GRS]˟⍵ vl?;|IaLH/Y9wש_݋mbZ&)axi<A){ۓ7ٵ |19?Yx}(}m~ z,絘 W .&gH }ك˸OidfufџAr]C '@ y!k{kblLorc\sk**~&8=ݫVᶁN\Sq}}k xyLOe6dLO !5z^<+kZ-k}`(QY{L)g غ<7]g_h]ujc],eu&:%{+u3Uors-OZ ֿ'c4JaML>a#/>7~F)l[7|hܞ&}, @'>!:GJC{)l 'o0hu >jS>Wftµwu b*l݋Q>9h]3[@&o>i J7|-#[/H Qxy"z[}Z?+fzݢzl868%=g?K}YNcC]G׼NCZϸoi}x\sڈ>O~^Ҿ| zzƾ/麌}ϑ"ZuyWz(O 9&gTlk|mhX<^5lC& j&RCM)|~ ab-%ȡBOy9v>qҐlzNE =UU@&1;Vz65i1w1̳=g}_~j]:~*޹~Tu-bې5UC+\ =ǡ~Z?x:s ֯ݛhMvGq?!=O=;؁z{JJo/hn7 =[>I<˘χmyL˞MЧp=5%8;#=Ygiր)5&gvm, =-f`]kNԐ =͙g\Ž9甴Fv9I q։h1gnp]屴ɓ̿~zCoP'GcWw2ʋz.>5-7vL!]<2bZb xؙc93ryYl1J(Hd)g * [[AW䊂ϭdPqb+(* .ejq.Kx0>GΟGC؃~: ZFEح̺$٩awyE/<43G Zڮ*11I8ݸz]ks=4/8Mqlkk܏a׸[~h[h߀_w6îOiI}vMv}">:Et[v|ˎnw ;(;QvN7~!GyhwI-o^_=IO!MKP^PP' 8Fv^NAS/6𮳉۾zLof@%Ќd^4-EN(70I$C *, <0-,,rVd8BаЍKD4ЊÊMC+%A \ib$m;c \{k%N H] Y䤈 -V|Cqd,r Ef== ܨd<+h\OU1P6Kך>}"!}85S#mv?J?SD౞Sč2Е;* ߞ/CןcŪ~酙y^ĉp.ĤO6镕芌R3N<O=?=ws^QT"sapa2BeŅll\q?S9P(q2BeāC\H䐲 K_ 09PDȑa~QRpV 9PxrH$|oqnQC8pde6Fȁ<ج|fXXm?NhyEAX8P&WtǼ7VҊ'c~Uj~BG(96BhU`Cx{Ǘۓ쮠S=?3{R`nN8:5E/bz^R|&ޗNE^h/"e}]Rm^QWI#C{VE{MQ+^FOvK.Co e6Mj<:O)5z =׿5ζv-p*걞raF}7wDD\oA]iWy*. v-v];Hݡ(%iw A$rӭgx}SGܷ<ҢE,ep8\ ~Š X,%KAMz՝ʀlҭ tGI$%ҭ@8+=}I07VU۪lU:p{xNU-鶉nCo!vюL8!Zu>.c7ދN)X0VχV -G&Z`ciuŰb=?9*HU-/\ىsLEx=V*,o6%)Ex2u0VyF3[LŴdجL0lr0Pa b6`1Df:i'dLy'Cd2G,L;#\ 1IA3_0t0,}`,fbuVď S+[0s0lJC psAS39&#s re.  f^82X"+_WGyǦJ] Ff &^8'߆```3b^ڼ3?Z-^hyΗa{D>zc|}1i08.VD%N  d$1V3L qފ|n2jʩFdT2o#"ԏH/JL=qTĐ`o è}I1؟x?P+PoP|E\0'e0'{D-1{D%A2Ȳ<񲨖mKv0P<=g.{(bOes+b/bf2"blJ>0Z*>MN*Mތɢ; M_ZBs.0IEk4?E{L*"K@@{vR /WVA ~{Ov:UϸMiBB!kT2>h/t[ Dp2њ:k{QhMWк>mL 2MBVYMq*{u?p%c,BWbuXB{ [>ӽu`[г>IKow*n,: P_(Vj@ j´߆"c2™r*\ JPyr8BEІ\UUUOFU"] W5h؞@:}Bc *ҕD Mc.*"*t+**]BrP`hP {Uh MWaj,*(-Waj ]2]DWa *o2b$n [t\b S aLb i~~^o݊(69cQkSI 0:L֊j63}=|r AS2\s`I.wba/e=pF\ʹ&{,"1nqCľ^5/H]iܪg/PT86Em/f>Ckǡ/ R%jfݪJj/ jzkN_3%bA7cLw^D.*RD}z_D.AP_D.A8mo}\E#hR2iR.Mpg7@%- B )O { (:J*:?BrO}{D] @(s96_ȕM({\ Na,tK<>O.\"$ @<t.7'\ oOh7!u1bͨ.\r1|\R1dԗ1Pjg= fYpbLv˥7ƔL^O]o{N>\RL"W*?.wˬӇփ/ǥKzׅKI ~"ȥtzayCuGIOJ ^ 7*?4 k_d +KBS_eߐ7o.KM,CutYޔeerIpYBpqY#tYˢd,Q1Deȅ2>7$72]I%tY*~oP_\?25.ZzeˢjrY],*,~eQ\54 cL \eoeQ=5cSg(StQ-Lq̆\x4]Ut4WՄ9?S"(S"((5eFy9R$[wYxg,rT,y`gJ9eڋlTG"eF;\T-~T3_V߀ 3>JҜN(JGh)IKYQ2o$}q%} Ƣ5 >JfNI+VQgH'9(3IeU#)QNaӆFEtJ.V$(VRnCwT:Ӆ#CCEW=8ڟ [H WNITcs8%Ćp蔨N"Ž*)ir 67p.7[5ه3_popr`6D6!!:'EΈiGsf\9#U9CrNYj%s!ɻp z^ 8?F\u~9PpFJ97kcT>v:#Q*1SϊY4 2jR8?Ǽsɯ9IU/ gItF|:#[&.oO`L9'840aMuv0~|:;(Mުϯp)|#/ʵg'cHG8;͟yΎwU>Mј72/i2Flݟ47uJm(83r)”El=}v,QL5QKZGz9S Fșp؜SW!dgȏV79T>Ky^tԋViXΔ@y`P;hY I!S6عExaճsyRW̺48OSt۫G7`?34 9 `*Giȷ9̇1xV3Qi*#˜ tONMs2coC|LҞchbMzK‰"QxKI}:$xKY-u wReJR&ã4Rouio \y}}8hޥ(G3|8xK*nit&Ly/[*2846 /RcV5=N۶=gr^,χѬ`VVC$iQ&/M^H^xeE%C^SSS).j1)5 Uh2?Z ^E9I!ݔZ/-r|{0zMu^[W|SP򚊼W@Uu55Fc]*EL땁JRC3 z0zMI^ŽåD-/L^Rl0r'0yI}ӻ/ BA^CKhe^/ !ueB/'aPxaփ0zacy>xzM x  免 I^ؘv,/l, 6免%/ ^Gz{;&3x3^XAIx]E'Bs$tx^=(8:\^(jY$/opԨ׫MUIE)]I^ސF/o< FH!DJukTUI^Rxu BSTA^ЁVNEMvC?Pͬ(([TT-;u, }>c)}Pa/f2Y5)n^,(`Nn^Tș^oT;.ih|zu&CE+W75L^h\zu&U|&MA2'yu>yu'NU&WW@Dʎ^]ҫũ[^\ezqjo^V@.Ꚛ55bЫC!.âWQ~0(yq]8+W'W-yuq(: W삼mSU(M=uGˋ[d?yq ^{qӆ-=-Q+KX]U K 10l ,_HϮ\m77j#UZUU{f,I(NDqRU#^@qMm7m%XG @8WY%{{TKr^\PK 'YO5B,I倰MUm]m\R܅{dkZlFe؁.*ͥk)#f6A,LǑ #Ou^ ۛnMa(Ǚaa4ّ 0ivګ2a=V+4rUvP񛅗"(j|E6)7W⪾ M͑2Wܴf |H-J6TIge!WI'ci.qfLJoUPHOrVuU^Y&Q%'z‡ߺ>wrp8u!⩲Ē ۹+'7. Cx笜[C딭߼īaX,ݫrhVfrzΆ  eaK[SI="P:ǃU4,5 Ǭ)OY.Tvƒ"s㱻n-9sg J^wGg`Ax R`GAv% \4CxrGo,D/}M|)UKuY _ΗS/}2$/}2"(ݝQNr,:i/H_<@$ex% |iO K$#hQvϻr+KܜϚ ͟G[{6H؞<';{^}oms/$b.6H)a9lQ,ޫ(7xLtÎ*;kSj80IyW* (풮5t+F%@)m FE.7gʰKG"*XVQl,B昘`*-hr FEjPNnpN[k$0r 嵙t=q /%A0r1lESX^`;R/V `QH@Ό&gKF 29>Q~#:Q2$y%*}$eLmGD]SD#zM \Q]fخ(qi4VDSYBD( A)r^~JdψJ5QP)enTE`I"JB?'Ѻr}(FVP\R"Q.Qhj"eM8 PR&jm|!( qQ`HwE jq'w#݄CCBPȄj˗,gWM}NkEd  s_F[!u(BQn%m1sQ.5ܮҞQYIZ>˰~=+g5遼Z%V(kI[xĬikc^,b3]eZ4B282VVOQ(]uҞswM`GC'jBͰBU-=UKyJ[*+Y콲8]e(KS^yeoYYV&$fiE51ԼCKe< u5+~JެJ>WF%BZ 5: ]"ϗ,PP{u`HZZ^u꣑B[Qtl({G:Q} ePAk'ix=B=B{Z| 2 uk-GuȔ=B@[Dٻ=l-P]'Q@,@,dԽ5:{ u6s#!W9eoUAeWFwm$Nԭni ukPFeS;(D5@VEV{zVOx5ig#~N//]94Z=ՄC ` NjҎ$/.羹&"V!q;89 m#R%ɱ gsԃ)w MMjc x t)fm )WvDL'4^)?/cyywq/aVV պV N.em DGpHNrU9B'RVMրD>bᖷ/RNyi8B|IupWbeODUɉh!妒3+=f"C]CO@r:o8$V'ap D)lw'arafg$ .BoJC߅b9\83}Z6* ~k1'0XJa&061ޓ06~JЄ=ix?0,!F}`"L57p}gLm)04d&OKZ_OwHw1~Xըܞ'cfU|-G13y'n=cbax9J%)+[j#bk2Gr $F4z_ɕԻ3a0.є ;H҅j0T5w}oo %fU.H̾5d80 Sno]\}7F'&p0Q50V%1~ػbB2|%so %댹VubJvblPz#Mͦ soItsososodsoUs;f$qbns?R'~>[z^kdZF榞cnd sw s/@}+1特>O=IǨ5>S[ܪ\ox0fn[b[`[܏ԕ}i-dd`nAs7{`&a(`R4U9=D]/iք5vXcTE/!|Wl@p'O7!$Bp% } ^bH؅ÈEl xU@^Chګ;̦7s9YIKu_ZjSuPN4+tt.}Za9{0S\]U w`b@hƙBWU3W701wS)< j-9%vEpuK% :@ԡ?!bȱ>!;m$VoKy*ܒ>97V} +`gpӺ]vLPcK}B%rCiL4c}@jn poYR6T=³Ul_Eb>>;{6+r &?j#I< ƽ, /p`Wʷ /Zgp/0^srpO0^| {q=6 ƟT6 0eep0Q̓2s{ʹ_*upO0SOO,$0L>yGdsMb8LlA&6<@͖ۆ+cCI11Ye `JÏNgsB}R-$^gy3:w}z1Ob|}\5G&w19H;facK ?mci3\޹͗Rtx'Y8ʐ޹fjSNpߩP~3X,N:pIϲ{Ua^k EK$HNz~> an* ?$*XʀC=qF҄Mi4I#Z$5I+wrC"9&Mi`VIS㿦@M3P fLJmtzWAVϽ{iI uXIj,i5I M~'5ƽX_* uB'%$5AHw ᯓX"1HjԠ&!e"51"5Hjlu޽["5wIjll!Q[cHZDR"=HRw^$Nb $CSCY}ΥH G$-(iq$!FBAH &iK").B]$)$HR"$)ﮂS?&Iq4G28v$-IYG@š";&nA\,öCWA54~X/bɚ0=I 3#i!G2S7Ŕ.H{C*^l"_i_s0.I :x$7a{oHaHW HZ0糍FaQ\1^Q~ K|z0UV ᨪáR^w4Jd!3gV@i@ckY!!QbmTdbMD0Y;(JaԲ3(rQ)b8-T G#ͫvĶ;hQl;wl(1>[C ͸=q' <%DJám- XRN,=[?hN \w7Nu'r?{wvoTK v(+E?;(pXn qK:x}øNut<JN)(,L :ռ[cVp);: xUM^;ι݃ %q{͞gf8-sJ:7㺣Eحf}h͜P!v;//XsJx'a}wי5i9E SXnenS3sXX+.攷ҍr׹Db4NT\LTG*q1`\L\Ѐs^3SAS笠ybb .F[\L.h1S4 A.h=/q1G-buس<+.%p10+}\S4:]sP%.󑋹.s1m.뜬k r1Gɽ5D{zԽD.Fe˷fS+\Q "jRqzr5 !Wbwq5AnFf0\q3+1nK.sQ>q3V{;,&U,R5]%5jP5MՈ U_?M8:jX-Ɵ4SLF*$"U#6T WUCpӥ\]6xD9X~~d'NKׄ1Tbg,I=r%15">OX.X. ؔ2>gϐ,œgy+~$_wD3ݵvMSL,m< qL3dL $c&|i*߄CYp(w;h Wm՘*F1q &9ED2FfvNdZ6?hHƨ.z:_7pR'd*dLpB%%bdLQVH 1T5ɘ' Jf1Y]*$D7ӲDYui$dzᶝ"b N@)1"}]@Th`Ȅ@cJ@T*aN"+@Aq]p8 n&=!73|ba >Sq$A}5dil<6V#+3Tbml429!և(h:CFebe;#k2}ЃX2,N&Q`B/!+*JQh=8t>g}X-KjD8|K}CO,N,k\tPbq =KNy;ؠ Ö֏, ϓ"켝Bv+/BQGbX1,Q0-DRKDb&e6vqY2iKԸx)h!1T2!8Yʯ"KĶOD"-oեgхI-tgnS]uz5 nU6m>%ziM"FBHҨY4:c\J:Hi~%IƻAHSI鱴gcܫP@4A{4%H#oi$O{KT)i`˒9U$x DMP`^ ~`L❽ xF]p ]-Z: }3}wӥ otGokvloBUBUV3u! d_&m:Y/:؜+?w .ykw>fuXWU`TTg ,b"!_Á1 q8%F, fKKUZzQC]Tt#$v ,Q43Ov­k<MNke%gk̎g;P)\l6n)D-= vi*,tond ʞllCQ''&26G?(FU(QrF{0,(F=JtgJ<(CgEtsT_@8EJc}Z*E~&]4Bɠd-ڴ4QWea睎+G*)ς"} [D5K;$fA'G#TM֋~\Kt[[w4Д0nDQK,]繾鏈pQeg<2^G  !>.GF|\v7.Ոm w5Pčgz^bJX'&bTN8}D3Je8N|K8m50f Q540͚lA5Y!уWH~JP5274Ʊ.W*%LI^m}T3^5a2(΄WD|*\cbP;l;k1k튕*ȝk \hv]-QINLrJM?'L*…#'̬:^Ep}*] #Y_|Y0gz Ȟ`dOb PY;TDTGOnDb9@,@AT 'ˠ P*4) -q@p$E; d ]+HUU]/- @>bBTH0*  3J"ܯ^_1C*ApHV^9s}#PO![֔p B($ \D1C2 v|vʴ 0]|hꮝ K _ȉ9`1]b:G2Qb8`PMҲ̎ HggOApcQ0Dwi*R eVϖ2oU ?Vu =ɭu? &uY8~L~Ta*ۖ]u[c{] v(GQ*'½ICzG :C垪֡HH83ǵꔅ1OHH8:LԺ alTQ&UG纾Xs.3vr? ?W랛7i e9 M[s"M(ׯ)ʫGd&?J?WtǤA I?lzgע)-Jз4) 91`I*5зWozWiTwbt5w%fLs5 ԫrW{k*ju1oMu}2ʝ gq:3Yvb{|8@ZhMƵp0!XvqLjp˪g]4c,nY]r܅fz.솇0ӻ$)?uKsz`?\KrV0kJ,Xt4E$J ?0kDccJ=ۇ5A=5d3,mY8io{vڛǬT!jev%!f<!>Ge֎ 6fa!`?l}3 LJi.ǔS=d9-e`L7~Ä&W }6Ic 00ڣ&J n>x?Z'/J6 dh}Ywk';A:vK֩G~NllhTM'Y?Z'ތN!ڐ͆|P&26dVZ-ähLu1ad4!"7Y lQT`,~ #?Q Sx5:a4 +4dZ*h! a"mv ]W,{Y,EL2yn%pף3eyɕHʝ5d;,<.uK +s+1bix^=%İb0 v<iaгf>N0  w|J1,iUò J$Ri10x,?)^uL 3c+A{lw6v v zd$jv0$. cɞ(si-gq.| % jⲺ_~.y\?Џr+DgLLK>D{D;8(G$% ixDŹl-M}ͩ7żnȗN ?v+cԑ(1wW>iuM(Bnߏ2)TFR1[ Rw'{TcdBql(z#cxR?f5?ߊ)ϷC s^㴿 8;j~Yk~pix3ZWp~T|}zv7#2.y_2^uu.,XO*7-C K9 Vx?\0}z$}}j_.3O~~\$} >j.+oa?-+^]˷s[w_.Ϳ~W_nfzT+?? >~+>A5>g% .څ0Ms&^*/p]XOz|a{!ށ}ǨV׸|k_k z_kPubendstream endobj 523 0 obj << /Filter /FlateDecode /Length 2143 >> stream xڥYY~_=}&{y^"GSdSC Cί:t7WoKݘ.>(o]VJ5.d7Ǖae9Ÿ-p_~[VeMZ9a6!a#mckxqHs͕vjQNW NTD|T\&v> E摤E›48kuPdՔ,[Q#jc]7{59? 8aaVʟ{^rLz4ÆX070]7MrҲafwW*c}F, S@)@$[:>N$ߣV~~s@=kv+%d!@;>0b)`pc\A(ĭL' lȅˆoX+$otDy}׽Ɓ1wܓ$&]u E%f#QaA)dI_H6;-K)">I=gŽ6؏I y  5 8Ǩ8:E vS;OǤKő;v0MhE]ӡx%o }rW;@:~/uK]҈ARmzLutT!GVNƱob:؇EO7Hn˖N1ύoڤSM1'/H;ٜ)x@Wlᡈcn{'%mx!ˍ<0Kxk>N*9j 2?ch8m JX/u: qD|3['hڊH՗ :ȶDi)[1UykIKh:7_LiےT)NNS$a|%^`d_{`E_D n1w :oWH endstream endobj 524 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 525 0 obj << /Filter /FlateDecode /Length 3456 >> stream x]~"/k$J4@"EQ4m!۲W9r,6wڿ$)Yۻ> (rH{Fo677/uyQWLn*ܯn>KkkB$.2a zMfn|Vlvn}6-for-q,}w-NÁmC V@m ꏭ~`,42MVwG$`n"GwIF(tXI&ͫЋ+KYw8W#+;H\l3?ELFCg7GgU‚IxUQwWE.U3{UeNHOԑSY儛^HR/T%2 $jqhyS r#ɛyZG Q/JONj-6+>Ә  Il,¨E:͗m 1I A-Cl~<"^yi*56J'>׫UEѬRv7]d(+mR[I.2w6$6* ʡI˴y.6*lIyC$L|R@UM`o2DgS*]եR4 @ۣ\l' r!Eǫ^ +(M'vZ2˂ioh )58jR7)+%1s%7R0qN; JE,-Be%!21>wfyg+ 7Gy|B.'C&lwO 'L=ЃTqR,Z<#Y+.]\DPτFݴWiT2PXLH }Q G3IَxqyL<)[iPC)OۭOb3e E(ɓE-='?C%kE3Z c>ǜO qXw+'~'Wg1E)y/ T?$pj9J^jlALS"҃ 0ᜊ]j:L{2>q6EO .^3! q+6]Ȧ%eauj8K'DRvkEj}ܹ$ q;El4ʴB4JU#ҋw8%$ Bde:jF&Mk:1!sL~s Œ7ೕ^r`;h:uqLPʆٷ \؉)C̊XCo`[KN+Dnj]q}5@ⴚλ\kX#3.#XC@BTgO6IiR)ExuSώz= ˲ljS]׌/={vG KAsh{z_SzoHpדWՒٗϹ_m=W. `zMax5hDYVׂ~ ._-?vK"}abϯ_,endstream endobj 526 0 obj << /Filter /FlateDecode /Length 2080 >> stream x]o6=B(6bUD}&E( b+1G$9YwG(IP$xw`D˃gO$QXFN/8a'A.Ldp:>LŤڮd\lտ]O/Us8MdӟBȃiRD\MojרQI 3pAH sODOa!E0MdXdbégS#7jhޮ8׬i>B#\sG1f[-~C0TzEHKLB{"YبM3m^p%ݔd>Gf"68 }Exb'v!ЈaBzҦ1 6̈ziu{9I=FI|YU-+5;Zٖ[qF%I(kB'GM]"߾W;8wԷd q,~*#du1>aJ,uD[J1ޒG!yuM cr] = ff|Azx(=7W'"Ma\LR&Y@ƥ+AO|k r=fs%*qhhs0\ݢ_'~M.ɝ oYi.jNJcu$ʆyڒv*SJfhXK+g8Z+nnEIsf׾m\\o/jiȉofv<c$SK嚺 il^JY U)yK[W풆D ^o#g-.ahAu:~Fؙ屳cRQ"ܪ>H+l|$ <89svvݕI"\02gwlDIV@.ȮB䎯^?#QdYEjhAj{[M+%y9NOJra0M-^o(-c b|+(fSf ^VXcAUW3M9SrDίIBaf%SWO {0,K8P7ۯ؍0ͱj r/2;{O~ *yQkR ݅ #SxMȯ&׮#$- nF0 N-lk_<2wɊq#qrV'ӟB~/9j:&LdW!QWtFN^dlTDn}Eׇ2Soɓqzo^/ɆcFDjf6d}$!aF)E9P|JV; 6S{ٙYݛvQ/0^Ue;\6xgIG}dW|խΖth" I.*a3 Gfߴ vf(3b]CXڗ >U}lݦe&+X?P0hjtgL֫]E 8tQ.j\zWChyu:i]F ɚԅr ?WӼTk]p =Rns|su6@ԒHSQ_nv|vWq1;cijtl0(cyaܚ(Z)A.Miz5%i(Mkd>iU_Ē5-'v+l!gsΣOlÊ<_i:;Gac$R3(SS54Y)HސW4 3GE$z-6ge6 7 B.Tn3<` @l^ĹBrLPJ혮4w* *ռS\S׊K2Yn]O s-O,_k[<>=endstream endobj 527 0 obj << /BBox [ 0 0 288 216 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./me_loss1.pdf) /PTEX.InfoDict 446 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 451 0 R >> /ExtGState << /GS1 448 0 R /GS257 449 0 R /GS258 450 0 R >> /Font << /F7 447 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 2231 >> stream xXˎ]߯RZ"כֿĀHf, DHjŖ%$RC>6Sϟj"1 C#]ki#_"{K~%Z"F?ڌezۭ'}q]c$Z3+qjCшi6t<Њf4rz*J+צ'(asQu)Qf3V]}V1s,KwE2g)eF*1׀OѷKw@CZR[?9p[ip9-#Ÿ,qb_ BM{?zv;".>(sߞc)hEA W'm`T{8Oy$R'+_|ݪa Ly'x 6:L,gw ӚNk_2\]Vqx.?h"`=DS<_~W ĵxdzb',xWɰɣEכ_5Ϋ. b۸bN񔔘?Ά~#-hXї.b-_Tʅi^+_S\!_QLpy<&}|mo~} ,;^gxr~Xa|.coJ<8Og>zKy0k'_=ׯOg#ߡK=9a%CoF+[׭Wy=p=}w{C]/~CO[zumL=Xfz PO]auz>^-(OXrv˛.;:ʣnci+]U~>g7g]vyG}忻@vy y~8#/N^~=B{ih%\ Wc{A6t{7\TmGg~^WGϹSvsfޢc;9,>톶67=}]r{L{4v0^?|/`_Qrt}j9Jj>,G)ɑ|__p ᖑO=?~h4CggV-G9!}`N3]3#vLh\,#+*`ji`^q'F>\ݟ# 1w[/ZJO^]qsnk]|dvke'OI<xK~Iǖ6׫^&<=wYKVuTw|ة?mendstream endobj 528 0 obj << /Filter /FlateDecode /Length 1613 >> stream xڭX[D~ϯxrhOJyKg'J!li%9`^֧׬i$1iTH84G@+`UޤN &vY*%V}\X=YEJa'qux0h 0K"ذ,Saa%l.4HwBڤډi?~ ICX~3B{C#&~ fVO`'<„&*0MJV"L %ghgѢK>(qO,{ u F~ J(MY~X\zId)&=x#HcBunmQ>B cemNDʑoqS63/3gga3l:-ED80I[~F % òhR` WÀ5)Yv:Ph+k :Wر+0DFgM)hTchQZH8P]rŅBe 1 [\{:Ji֮(Bþ{1sHSU3lHwS|+R!KGPg@ -RƜmMC:;%J1B+ޛM߻,'6(j^0PGꑯòk8.B[ ҷ"TX6v0J7"sqv+ qZY\*dW$M9l2+KL֫16+)r-I ߱lXl0ݮRXvꘪ;;J5e *WmG+E۫};N%xJyjv^<3$e(VERW)u"IS9lNUa2Ms0|8haVkQEۖꕸnja1]1J4;~9rj$JF{;85p$ /n] bRWXAeMI 6K6Ձ52pO컁xB?,uEnH!\\)"Qgͪ8W((6pl0Y b?endstream endobj 529 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 530 0 obj << /BBox [ 0 0 576 432 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (./me_loss1_year.pdf) /PTEX.InfoDict 455 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 461 0 R >> /ExtGState << /GS1 458 0 R /GS257 459 0 R /GS258 460 0 R >> /Font << /F1 456 0 R /F7 457 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 17605 >> stream x}Kq}~EɃ~\)X؀ DI6]QU=Zvfs{TeeD>*+>~?<Gx?joWӿG}l[{ά/~?صpE'>?#[_Lsz~G~a<>9giBN|v{xuIe=S7]?MӔL1?~P3%gɏ?~LLP.rhbz6sV%rq)9͵<abz`b{65L36Z}81,qF98?4_igW&f +ޙ؞A\Q&g/WQLs2g\c53jkٞɿp͖ u.e<)!. {&'\ڍM&>Sq))ߢ)R]G>M3;\r KM1!l*TA2\ژ '| ?2)d.K_ӥfsn}_2ޏa b&+_i}^k=&k@)%'o[kߴK^a`Od&5hɹsĐ1[PFSƼ]pnh& <Ècb# M82k2h\z fM$A&&H1lph͊UhP@ǖ0 5m]C5.l gmQn,`߸zSxP#2> FsҡF\EUIk:؝OZ'YCL$ ZE  /Ыڠu _}bH{Bqd=uME#}Mv3 z tr=\%4وVƂDuiX-Hn )<6A^q&}^6$_E׿!1_ش}y:2jIY!_K{eGȱ=`-Y^i=Ҳ<؋) yΑL~J!1=CzشB#* _%Qfr"3ЄmK_)\ң9@C+!a RCiw W+iw߾>=i<@(2I!ʙ|yHX>yH<$yH0" i~Dv9KCMY^XAslgQ\`GE3^dޜ;|9>L!gaɮ}T1UC ØOEW E>ʺ\sf&_oXm -{3j5.\^ APp0a%z 8o@67^&jnLB"` P`'it37!mL7kL-@v0=.#FG3ycze LᙁbKqcz)EhQq`zؘn(c)؎ XXY(L7`z\  L$1rZ 0ܯD\ =]nrѼr0qaz4cܮ`\!σ&'ax0`ɭL7 L7@X9J&+drӣq`E wa\tsLw9L7y MW@d'0=Ā'0z]s@\u? @y,Y]qϒЌx>`4% Ѣ^5Zrh|[K4+o}2y\~@LN }]F%KdsX=^Zofڵknl2]84K{5ߴ'YM{ F/xӘ%:!4;yӸvP0Mljt`y^V1މn1ME]1j,BJdƀc٫vhi8+W~,@"ȰA22O]ROkq v@w!CafQ<ğS9šE_+`"kܛMY2O,pMv!g?iHP5$RGRi8ӭ5.ȱ:[/>NL!(z1+л΀'zvm^R}ʡvn :9}5xS8ho-@7P⅝D[88X>s &Bu_} |oxEA #Pz8TRKx|>*|^LcB{(A&KfA0`DR)}ˌ]H' 3#73n ā/pjL?>X^ PJyTPA[F?P%c1S+͸Bp7&:Zɔ3=%C?U<p'̴]'4'YNLJ\":#N%Ǔ YK%ƿn>Pb K%oŬGJR gdwL>d{KnJZf)+g|tekE jeG3~K7/O2TB?@eQ%/18%Vg!m2~>|z*8I|&sll{tȑ7 #y0^]DS82 PNg<-q%ubө\}ϭeݽ[Ml\8ܑmDaQ4<mIJ$5i7u/x wW,T4-i.*\(ʼnE(b4 {a֋Yg_͒Z , $Y@tnv/=,f87bBe\)9k,p1Җ<92*z2(k dH,~A` Cϋ,c9{ϒHWg@B s>?3"#[ktT$D1D5V 2dHw bQ!V (oxXxXY]ߟr,\e (f=+7w(:8=8Fs/5y.:lهHqK͜8n1[ˬc>'yrgwZ )AIBV0ْldg^C.*I]ȼ̜PM{JˤL8K^h2"{&g$׎,_;*tb,ݯ*Jcz=1| `}k` n~G>ܣ0li2/'| }qB?aߗES_եQ9Kңtn. خKfq9_)h&\iM#(T u 5uIz>(uQUFR*iiuQlEv%M2U}hiu!خ r]躄mA{NH5ʘ)5ɔNFg. hMLaڮM`lJ'uQZrr]2]arW]M7 7@ Vl(Qf2/%Uut]Duj AeBPnflqCvR/.Lel%yȕ:TTT֢:UԄT*&*F*հ7Q1jJ "zL l*M\.AԓKդH亰Xx.خ z$=tc}v+K*޸NT}zj opl-d @D+rj*W ȒtU,ae( )d8#|7!On O=?[+(gJKݦ\n2~p7¸t 5, M&9ppdؙ"̸ɳ^&Cgq+.irc~oeƣj9^5voKtk>jP\U^YYؠ,Ȗ>,r=ASf#hBzB{=XEMNY66ڵJ~r=Z&](\z_O{`*=8q[٣gS,k=ewCujrhO-x%(XdMe3 e|ăxTKC9 zgu U+Z˓z ȉ`MIs:2ą'×_WwY'e @Gt ib\< x"*'%E_Ěfyy" EGCAdjIMOHd j2/ 2N۹2ؔi{!B/$(O/*ǽ*;TVn0DUKV!j 1FT Jd+muF^kj$9zI[Nij&ֹo: h^Z_# e T)]!Em7(MTRP˶\6CyUGjXPY/E!9na?̃P >zBU~$dV:, VrB`-#UvkM`U%uծ냕Uy%dm #.J\N/YceXeSvKXi >Xk/!Fm܊"Vܘ}kn)*Vߟ{p{!{X}cO_o ,$yUG|W;o-dɡ_H9iNUbMW{;}ϧO!^. nkijOQ1޹AO ݧBgmm[)HTZ~ZϰlF$)VDh?$o5׃"`6߆+ؓnlZUgA~qW BߟzPp1y+͉Q|(D$)nx#nд G + iPoDt{PK\Ѥ3V58 h6z0F7{GBÚ>XhzEL&ozN2n%ӹՃzRΒF9qcHhbtT}%=ݯ$=k{ $=3>l%=G ;΢q}Єyg䦘 r}ՃbS _Qc}+nzPGfS&7|1/ccc Ϟ7ד+vzP7v{h3_|V6%|W>("}G }U*u}k|P+ H+BEJo^x2z-z.]σ^4w ˞MacK٣VʲWEg%^֟d/M eO@6a챩uf3sۯ/{Mxx3$Jx}£7E{»ļP]*X%m|^߲ l}EPysiޒ|vYI!~F>9)]|sl~ >_]||ˍ6ŧ2K&~F+3ژ?PUC*CoͿ &K.>Vu!mE)cPyՔAׅg4]NR=UܛrriuIr CNUMUI\mݑB葪N7ʓ[}N%0"ׅ(u V9ZS]m]´LAd?}۔lSASua'D}N%%d6%PkqzL0=rJ0===7m=K=@[M#,zf<m5-ZM@Z!@[ #dЖlo]3sjPL׼M1N/eЖ]lWlћ#j{LכmAЖ @[ڲy/wg߮nHlZ?@{rڳY/kE0h3e$0V'Pآ(VP$Oȳj&Fr^>6%XKh1h+MWË(M"ڊ"6@G @X M%ZOӅ&yVtإɘ_xڋh+B ;@[ ϡh/RMnWlъ>h&3f΋h{B@@[Cb5u^~:{6Js5GWivlYyZ8Gݱb̗pܮآۋqCmOKe V]jtZX:D롲Ke/2ʚK*{c\5*w\\eO؃rjޙ=)oڛsG{dk[KfvR^$(6N{[ثAR:sՔgn8d:^*xٔQx x?JgI*]$j2qtM6)vFr;A:C!wR`zpѭ9t66ٙd \˹ '̸.O2ba P,rDcvF%ڕ ~ {Ip C/nkn2N}"θP`xm** .oį\aY~4J/ ZM|xp?c v0Lވ4cӪ"~܏.FQEDǃjxzsፐP6a@SKT*@oD}E 'wItEpEBf ]6>tÊ]B[^zQ%4c~uEbĥgG1iH2 ^k/M h(U@@ ZJIkvzASaCU-TЦ>>m4֬muuC7Ymە"P퐢}E-ZhI %46MPHqMLN5j]KPO Q+P& i椆=sPڑZv]TԴ+J[@Զ0VԷ*wQEREA{F{&5~Q^^wVt l|ס3'עXbfvv^ulOt{?6̻QXBqN?1*7~>J$u^{ge=,3.{farEacxsGuyi1Dl3hqyL22y[UL|nl`vNV:4 NǺ4yOx?vVJnG79\׫Up"}U>VZ\͐0k=ԬbGkқe*}zjZ =jdOT *{cz٣ŽWƔeJ` ˲B㲷Dž!WI>{η^d&k}!Fx̶ ;; #21(wlG=O F Z|ʶ:_߲ *ǒkK/g!doRvh|!$CJ⫝!%ħw{"ܕ"VgiV邓7e׭'?S _~tJ`fOe7 KU|<ˮtңpv]H}*VSWm$t}4Tm{*5*nۮKkB%Tp\R%(ZBUz?T[ʶ"*[wgKTXEBCڍE5;a4^:5\HyCm4_Y ΧJ %>mʢ>f5Pݺ=r=d^rzzI߯jz,\z,z쬯=82N"=I/ڛ=J,ВJ Ҟ%KE06N2e;3eoId_dS{Cmd#C /Tx(EnEƠ/l O 1 {CxB{y.>`Bxtcl[:YEiF2Hu&z M>&QC@v;X $i#HB׻١;;YĴI'+ݕ7ଭ) .| BW̰IW&Ϯ WWѫO OU#!  ~f_gu =tDE: *cz? 6Uܮ¸ 9;>c'L`{cuaߗ,ew-jE*NUW@gVuJ2fSoe3(cR 8Π;XYm%dce݇">^ ]tdFϝxӥ{C-q8P!&iopĐ-%3y'ĪGU?yY7L Rx2۷iր> 'lW)SrL&PHV|^Чyf{@+7Te+]o7Mh&phc5[E;9WEKa Ԇ@?ka^m<|SraO/WWCy S"z2zfBz4JkJxxnP|,R EYi|ҧro%J)*y>gyX^Irke|zlj!}ԅI^Յƒ# OPbx%ׄWi ,N]dSxoUxyxٗPxDx3 :O<|_ Ol~C_|$JfaSO[rD=W%+O>U\]|,)Mff;~>7G&?!_\xD>ًF|3->ڹ!V|@vUv8ɇw.O@|)EK>w5:Q+7 *N A|.s] (ʮua(9jr=0>Pv.Q2]TumT*ۣVa\߮ #RkRc*RA\ȥ*%#0k¥"Do.AKKCD亄Zu ܻMTpv]%ޮ _2UQ)u~ئu r]L]$SXH-SdBy^]Ԇ &ATuQ{uua,*r9Aax*sJ-P+NPP>_zA\oEP)ׅ6^"EFR]) S互 *TYT0;.U+l)-f*Wۮ צLkm*M5&Uȵlv]\.fޮ\ .G*^yȘzMr@+*5`p5Þը/tE]J{p/ޫg$lV'5+c&hVmf*@N#b60ΎK\ZZ)[cPP9ؑr(/b:89y/araJPs!F~+HK #b1^0SxFZ ki Y+02Fa`nI0ҏ#-vc؈Q<UڜEȘ!"ceE81[E;EhȸUHo-&y2u;~1R< yx02 b;9FFm!FIg`/ #B\>`[x0*aC3rW#Ud:O^WF~]GH?Z^xF\pBC၂~&D4+<8n$ݿb$F#p0za#]#wkHbGF_` #u䅑~~NV`_`F`l#M&f Awi20r$FZ+HpV`}wիi2p_z$HI|ݿx$GW /=5ޑh>>`=O+8Ѯ`>DSK SΠ>FVpJ_A}]8&Cu%{=Y{p=B{jā'+g2 \Ǟl|tGhcuUdJ3;^_.CV l=8.{ oc;iճw@84}1zƒp6"p$dR#^isژ]x7Kkr?rnpw0Lk'0g}Ajk;7Op~#5i KE1XJ1(SPFSPMoUI\>_}Gz1Y1q< ҃@PelTK1VEs}ir p@@0!$bmX )!,˃%eQB`n/V \o#OA4 8O]q&e8, `-3 U=`8a7P"JNRa#QQ%2gQ咀BIPXL[Dΰ©Z9Q@ .(b . bx* 'OZE*.3)neŖ( E@B۸(ve(x-/bWA8)~ Ve .Ul.D8t1*3WXðWu3*|tn#2RNOUۺkЛEݾ(}K_#tv__){#E/}e=_?b=}K_q%ox__Xo^_?G>o^ G>o^G}b=}K_@ & m_CWF >Dɦa}~?qVwҹص>t>/Iv 9IHO浱bZ7Fzfg; H~>-Ϗ Fhϥ .X*.xt~|__S7" H;M5>d3F9<^zx}3/<.[j4FXp/oj[xiÇҼjne[}CX=όS>9}KFFƨRpÇo3]NdžP>GtRo< ӻaף꿯H]1/ǚ5wHِ~2֏.}(vww~ާb>5hA9>hj(Uf~F~>Cή?x}>y|wZ6orꬿq÷pmßBJWuM6zӧ,L*s+sIپI~x{OLhb\Ûy_WwuVzD Sgч]endstream endobj 531 0 obj << /Filter /FlateDecode /Length 2059 >> stream xڍXn6}WQbE>n(źC(I,dm6΍(i8<3sfyvu{hOA>xi/ ױ?(V;~EiZom2D*6a`2CG=;P.Gq0'eV>mW LQh<Ae^٬>8MICvt$7ʭFTo& ن8Yi»vW3Tɛa(Gc4Jqϝg4A:>vI7Axbf<N~tO-!0 vRe8>Q m>vr\=e){j\M6ӹTq;DNi"TV ΧMG5;iLRoXw> &]#RdxrzD~`Fkէ8C.xS.$DLIe %GHƨ HL M:rJ .'2ۼb߉5@B}!Nsj F&$_p)&g&D]ecT"Rtx|xŽ x{@YxJ7_HJBFlI9{^Pcǃ(bq-îҗqA >XSøDe^<㌰|R$5aw Y긏@OL-ٟ@$d hj{Am :|:']Nqrqt N^-") i)sR;YV;Ug^:(ޣ;Qx(JQv=w8s t6XH+²UB*I$rfW<9R=@Pͼ@hE3yqn6qmߒW=V])*)XgRumE|#,"dArdK *ɲv L\9PMdkPxݗ,Q 6/bò!_9XRH,a6:hJ߷;ɧY+!d;@(zC1(>\R¬rq(FB3#หcq|l[f6ڋyeLJN|vE?-֢,yls[t9 g'2zvҽ 6@GӺh |gj{p`d%n|~ɊrGʙx;(.Jt`RmTi%hv׺0 ;+ <=!Qn`(f;]8)Zܹzډ$hW(?6eA12 5Ot)fP_j nk#hvC,y,SlSgwտendstream endobj 532 0 obj << /Alternate /DeviceRGB /Filter /FlateDecode /N 3 /Length 2596 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 533 0 obj << /Filter /FlateDecode /Length 1999 >> stream xڽKo6_UQ^zXe؀ء-ŖcYqS~'Eيt){^FwhۛWDaft3fyX&f6bWYC((ll4 5̦5'IoaZ<؏"~q/~~ÍeMtp) Ќ'?ý%B!;{})cSY餼 |  0IZ9_IWCZfº1D2&I"O^KeD /9[SCBKe_tUd)_?+_^| YĉCvNz*crXU*ȭb;<.,%%f_2j.d2=%rJU 87z -n<]s|fN)O6,Xڼ8SSʱ@[ ,8")P^ ˵PƲqŊ=}G3 "lUIh,1PN[VZbG.F ibZ0"4vY CwG=O\LJ#"ܿPDՆ36'͚0[5Y`l$!=vT`>4 Mw~^HONFb+d|#̆H]eٱZޝ7zFP<MA:+;B'2nC_ UnR WJT F<{aw!x0t+Ǹ \0:Gϖ.pvy~9vK_5'u_kUY5hv !PUQ.!2P1{)G9. KȟvvX1V͎ߵPg\R}vK=-|m̞WWKk=BQ[A l  >pNogHUpr&rT0}-9)Ե)aN>msrv)Tݼc .p f w҄{g9_IN_N>hIMFMcI EXeJMן]Li4ЋYj?piH(pxVQR|ڰ3:Di-R+Bܝlej]..g*b"RZZuۃ2$>5ЀT-|w䯞Lcl#s[R]gB죝ʫVdgc_ 5oQB=e.> stream xYo6_a `*>a-Pk=tŠNlԶ2ia>Hm9]>AEw;lr=&?<=}sӤRV$Ҽ"`е ݷnjlݳE%QM UI xgcS8kX!wB~! tq$6B}x C@s81.͎Gqe gX.; w ٕ.6|HY^9Z}T4EV$}+;ɐ>rWs[S9x`릛'c-a|̙!LO-w]:݉g,>fUNgb P+^□Y p>gVcה=O%.!OC 5/O((l@BE?!51CJGo !hﱶ 9/_rb'J]cO+z%CŰ1RT+вܘؖtɑ䥲>Ms;j%ԾXp_cO.%Y5Kv.\1ȴΟJn,ɪ X,R _1 G3,巉2IN Yy zL$eäd P. p2&%yZ6HX1>Y%0|41\f磘VQ>F`  ~X;]Bn|!yGH-RV+[V!ł7Tj=AȤTW(e+hT(eHQ)0]tTοkdx MYf| '.fp]ڴmqKb_AfKLrR{ʧhұO%8Agr_6\r7hRCaɖT\YY!^ A\9W$ѹ n/qt'9qp}1OluGo_ʺbO^2׎@DG7u!\+0  pḲmPl h'3<]Lbӱ{~(|pvHKd{Gv7><1endstream endobj 535 0 obj << /Filter /FlateDecode /Length 4662 >> stream xڥ[KHWm%E33[3n az`I,ǒ.\o<3UVM(K##ED*[ߥw޼՝I:ݗܕy.̦o.\<ʤeR9A~ZyϚ|[jpfnVvy}v;vlZZnd4_aG+ּS'TZS'Eq-77Ϯ3Y⬅.n* üdtiu Fk^pf@s 뼰C?&aRYIʁݳ0_da |tg Z-ڟyʯ"fw"g/(noAVl^'w4*Q4: ͨ1  Ӓv{/؀Rl*N3|>֖$$$1(dl MV3yUե=WpuR||/ZH 7p]g)&^eIYDUJq̿\?7~A8| Hg'8\b\?~M젿KneF[2{j22 wf'IR*Gr dMI^W3y /rȱڲ c+Fg{WIٱxZ5W9AvMjQagʘ'$oP;{Kװ xxy)f=#??-_u'x x'dvR\2/{,nݱ95&OFR^#QdIhOZôNJn5ip klԯ[BD-,$WE6<""X F*#ձ"dKf~C|b?"`lj`x u!@Ef&[+n˒tid'WE̝tަ4bS ̀G9=s߶2{rcQa+BG,Wy9p+-W؎5zG҇>1fLpk*n4o=jK[\>[xM^3*ݠ|p@eVqzD ׊Niua!9N\3B).䩙 RD0w%~Dfᢎ<5Y,Ԣ4AJ&%(*tp&2E/! ?׳"5@!,z|5Qm+|X4d:BԳ@(sX#IFB[#xzAXZvVeW*KAf~ !#<*M1WvH-Gj *(2i>0uR[)jDym7(D9ꀾֲ:whaz#fV{f(S78Bq8)Aʧy+2s07ce1 /Tۂ*.hV7q6zI}ύu42i( ja({j`z !c+P]CIN@|4e)rBQˏ;d䈡o1Ly7"8^ײړ罬|moe24Ҿ1gkrGID9T㤮𩎒eb2>as&GM$˒#GPWfA_[K"f[đLCPH`:}` {VDH–9⩧!ȡ**?x]tipVjʠ$i[TO8eQ$5YWȗEy rmmg%(|737ppțǖ''f7TfŻ({E?p|$;a zEH8\ΞD}R`"=]&p7'JZ/ d(u1`bJNs̭xH ";=Yt֕׸'}}dqY AD٨9F۹tʈgcNh{,+76ZIe #XhZ ШfQK=WEYb,TNJ3Pey隱aۙ34CCnWSTp10pl ] $FZ Fr7[q#=~STyȏ؎|݅&R 0rD? 5] I,[I.tcđ.V{'@'p;ng8 ܥ({QT ;YXRзC%)f7@S nJ^q@3&Ay&\sޕ8r-.lغRjEmI')o4){@][ijRc{ ĈA_&0㵌)n.7V*^U γm snYe<`𢽉(M5rmsPLLpҲ_xM:eveF#ρD Tj0s-)ݨbLj>GrU~S#3SzTآYl5~v7Lؼdc̵M'jvETr>+᩠tU]3("-$lpز'v,e9]s_B%..Y Z7'1082]YǀJӴlԽd}B%&.+rR $SƣpT^*A;AeESpϷ8H ˻cCuyx-C] G$0c=hU%K4Իz:qxBǿPdF ƍ`pNg_*t@HjE.ʓ7]lQΏA@\wzٶX_4vBPd#%ܔJ*7Y'D/B\yf}>NjZ'm U/Ͻ @k7R~r?BZlBi\T#8עhD1),OFzw(:.>K ;+_H~dh\s?ۃ4Fp+?#= }䅢X8(ٟ r'(Ȏyt5me0?)T\ލY:yiltbv;p ¯Ҵ4yV+6< 8g;Un`i-$QR4#]TUo&0=.bO{EZqH{?G -_J! cA: ? 4|p|1]//Q *fW::2ԕt.g8ħ7nAL .`d{%Er.(a̳HoaN;x\b}pToH {AޙBcWzO2k^(4n'?Q34N> stream x{DoǦK)Ҝ6VoҪLvpvSHTn2endstream endobj 537 0 obj << /BitsPerComponent 8 /ColorSpace 429 0 R /Filter /FlateDecode /Height 13 /Interpolate true /Subtype /Image /Type /XObject /Width 1 /Length 48 >> stream xt-׊ 36ԨkҪHtipSqendstream endobj 538 0 obj << /BitsPerComponent 8 /ColorSpace 429 0 R /Filter /FlateDecode /Height 12 /Interpolate true /Subtype /Image /Type /XObject /Width 1 /Length 45 >> stream x{p-!1{ski1﵍rrjuwMxendstream endobj 539 0 obj << /Type /XRef /Length 300 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 96 0 R /Root 95 0 R /Size 540 /ID [<513cddb2c5e160035430387566f98ebf>] >> stream xcb&F~0 $8J$|aTph*%IE:ϕ3J~ւJ!o7DȤ@Q VZ"?H R߷un$21 -F(INT7@= "HEp%"@/y "4$X*jAlB `'I R)4 bkPz?jMVB@$c0 6Bp-D;hHyeC9$>nS(D; endstream endobj startxref 456962 %%EOF brms/inst/doc/brms_missings.Rmd0000644000176200001440000002322213606326627016276 0ustar liggesusers--- title: "Handle Missing Values with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Handle Missing Values with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction Many real world data sets contain missing values for various reasons. Generally, we have quite a few options to handle those missing values. The easiest solution is to remove all rows from the data set, where one or more variables are missing. However, if values are not missing completely at random, this will likely lead to bias in our analysis. Accordingly, we usually want to impute missing values in one way or the other. Here, we will consider two very general approaches using **brms**: (1) Impute missing values *before* the model fitting with multiple imputation, and (2) impute missing values on the fly *during* model fitting[^1]. As a simple example, we will use the `nhanes` data set, which contains information on participants' `age`, `bmi` (body mass index), `hyp` (hypertensive), and `chl` (total serum cholesterol). For the purpose of the present vignette, we are primarily interested in predicting `bmi` by `age` and `chl`. ```{r} data("nhanes", package = "mice") head(nhanes) ``` ## Imputation before model fitting There are many approaches allowing us to impute missing data before the actual model fitting takes place. From a statistical perspective, multiple imputation is one of the best solutions. Each missing value is not imputed once but `m` times leading to a total of `m` fully imputed data sets. The model can then be fitted to each of those data sets separately and results are pooled across models, afterwards. One widely applied package for multiple imputation is **mice** (Buuren & Groothuis-Oudshoorn, 2010) and we will use it in the following in combination with **brms**. Here, we apply the default settings of **mice**, which means that all variables will be used to impute missing values in all other variables and imputation functions automatically chosen based on the variables' characteristics. ```{r} library(mice) imp <- mice(nhanes, m = 5, print = FALSE) ``` Now, we have `m = 5` imputed data sets stored within the `imp` object. In practice, we will likely need more than `5` of those to accurately account for the uncertainty induced by the missingness, perhaps even in the area of `100` imputed data sets (Zhou & Reiter, 2010). Of course, this increases the computational burden by a lot and so we stick to `m = 5` for the purpose of this vignette. Regardless of the value of `m`, we can either extract those data sets and then pass them to the actual model fitting function as a list of data frames, or pass `imp` directly. The latter works because **brms** offers special support for data imputed by **mice**. We will go with the latter approach, since it is less typing. Fitting our model of interest with **brms** to the multiple imputed data sets is straightforward. ```{r, results = 'hide', message = FALSE} fit_imp1 <- brm_multiple(bmi ~ age*chl, data = imp, chains = 2) ``` The returned fitted model is an ordinary `brmsfit` object containing the posterior samples of all `m` submodels. While pooling across models is not necessarily straightforward in classical statistics, it is trivial in a Bayesian framework. Here, pooling results of multiple imputed data sets is simply achieved by combining the posterior samples of the submodels. Accordingly, all post-processing methods can be used out of the box without having to worry about pooling at all. ```{r} summary(fit_imp1) ``` In the summary output, we notice that some `Rhat` values are higher than $1.1$ indicating possible convergence problems. For models based on multiple imputed data sets, this is often a **false positive**: Chains of different submodels may not overlay each other exactly, since there were fitted to different data. We can see the chains on the right-hand side of ```{r} plot(fit_imp1, pars = "^b") ``` Such non-overlaying chains imply high `Rhat` values without there actually being any convergence issue. Accordingly, we have to investigate the convergence of the submodels separately, which we can do by looking at ```{r} round(fit_imp1$rhats, 2) ``` The convergence of each of the submodels looks good. Accordingly, we can proceed with further post-processing and interpretation of the results. For instance, we could investigate the combined effect of `age` and `chl`. ```{r} conditional_effects(fit_imp1, "age:chl") ``` To summarize, the advantages of multiple imputation are obvious: One can apply it to all kinds of models, since model fitting functions do not need to know that the data sets were imputed, beforehand. Also, we do not need to worry about pooling across submodels when using fully Bayesian methods. The only drawback is the amount of time required for model fitting. Estimating Bayesian models is already quite slow with just a single data set and it only gets worse when working with multiple imputation. ### Compatibility with other multiple imputation packages **brms** offers built-in support for **mice** mainly because I use the latter in some of my own research projects. Nevertheless, `brm_multiple` supports all kinds of multiple imputation packages as it also accepts a *list* of data frames as input for its `data` argument. Thus, you just need to extract the imputed data frames in the form of a list, which can then be passed to `brm_multiple`. Most multiple imputation packages have some built-in functionality for this task. When using the **mi** package, for instance, you simply need to call the `mi::complete` function to get the desired output. ## Imputation during model fitting Imputation during model fitting is generally thought to be more complex than imputation before model fitting, because one has to take care of everything within one step. This remains true when imputing missing values with **brms**, but possibly to a somewhat smaller degree. Consider again the `nhanes` data with the goal to predict `bmi` by `age`, and `chl`. Since `age` contains no missing values, we only have to take special care of `bmi` and `chl`. We need to tell the model two things. (1) Which variables contain missing values and how they should be predicted, as well as (2) which of these imputed variables should be used as predictors. In **brms** we can do this as follows: ```{r, results = 'hide', message = FALSE} bform <- bf(bmi | mi() ~ age * mi(chl)) + bf(chl | mi() ~ age) + set_rescor(FALSE) fit_imp2 <- brm(bform, data = nhanes) ``` The model has become multivariate, as we no longer only predict `bmi` but also `chl` (see `vignette("brms_multivariate")` for details about the multivariate syntax of **brms**). We ensure that missings in both variables will be modeled rather than excluded by adding `| mi()` on the left-hand side of the formulas[^2]. We write `mi(chl)` on the right-hand side of the formula for `bmi` to ensure that the estimated missing values of `chl` will be used in the prediction of `bmi`. The summary is a bit more cluttered as we get coefficients for both response variables, but apart from that we can interpret coefficients in the usual way. ```{r} summary(fit_imp2) conditional_effects(fit_imp2, "age:chl", resp = "bmi") ``` The results look pretty similar to those obtained from multiple imputation, but be aware that this may not be generally the case. In multiple imputation, the default is to impute all variables based on all other variables, while in the 'one-step' approach, we have to explictly specify the variables used in the imputation. Thus, arguably, multiple imputation is easier to apply. An obvious advantage of the 'one-step' approach is that the model needs to be fitted only once instead of `m` times. Also, within the **brms** framework, we can use multilevel structure and complex non-linear relationships for the imputation of missing values, which is not achieved as easily in standard multiple imputation software. On the downside, it is currently not possible to impute discrete variables, because **Stan** (the engine behind **brms**) does not allow estimating discrete parameters. [^1]: Actually, there is a third approach that only applies to missings in response variables. If we want to impute missing responses, we just fit the model using the observed responses and than impute the missings *after* fitting the model by means of posterior prediction. That is, we supply the predictor values corresponding to missing responses to the `predict` method. [^2]: We don't really need this for `bmi`, since `bmi` is not used as a predictor for another variable. Accordingly, we could also -- and equivalently -- impute missing values of `bmi` *after* model fitting by means of posterior prediction. ## References Buuren, S. V. & Groothuis-Oudshoorn, K. (2010). mice: Multivariate imputation by chained equations in R. *Journal of Statistical Software*, 1-68. doi.org/10.18637/jss.v045.i03 Zhou, X. & Reiter, J. P. (2010). A Note on Bayesian Inference After Multiple Imputation. *The American Statistician*, 64(2), 159-163. doi.org/10.1198/tast.2010.09109 brms/inst/doc/brms_customfamilies.Rmd0000644000176200001440000003163313606326627017473 0ustar liggesusers--- title: "Define Custom Response Distributions with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Define Custom Response Distributions with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction The **brms** package comes with a lot of built-in response distributions -- usually called *families* in R -- to specify among others linear, count data, survival, response times, or ordinal models (see `help(brmsfamily)` for an overview). Despite supporting over two dozen families, there is still a long list of distributions, which are not natively supported. The present vignette will explain how to specify such *custom families* in **brms**. By doing that, users can benefit from the modeling flexibility and post-processing options of **brms** even when using self-defined response distributions. ## A Case Study As a case study, we will use the `cbpp` data of the **lme4** package, which describes the development of the CBPP disease of cattle in Africa. The data set contains four variables: `period` (the time period), `herd` (a factor identifying the cattle herd), `incidence` (number of new disease cases for a given herd and time period), as well as `size` (the herd size at the beginning of a given time period). ```{r cbpp} data("cbpp", package = "lme4") head(cbpp) ``` In a first step, we will be predicting `incidence` using a simple binomial model, which will serve as our baseline model. For observed number of events $y$ (`incidence` in our case) and total number of trials $T$ (`size`), the probability mass function of the binomial distribution is defined as $$ P(y | T, p) = \binom{T}{y} p^{y} (1 - p)^{N-y} $$ where $p$ is the event probability. In the classical binomial model, we will directly predict $p$ on the logit-scale, which means that for each observation $i$ we compute the success probability $p_i$ as $$ p_i = \frac{\exp(\eta_i)}{1 + \exp(\eta_i)} $$ where $\eta_i$ is the linear predictor term of observation $i$ (see `vignette("brms_overview")` for more details on linear predictors in **brms**). Predicting `incidence` by `period` and a varying intercept of `herd` is straight forward in **brms**: ```{r fit1, results='hide'} fit1 <- brm(incidence | trials(size) ~ period + (1|herd), data = cbpp, family = binomial()) ``` In the summary output, we see that the incidence probability varies substantially over herds, but reduces over the cource of the time as indicated by the negative coefficients of `period`. ```{r fit1_summary} summary(fit1) ``` A drawback of the binomial model is that -- after taking into account the linear predictor -- its variance is fixed to $\text{Var}(y_i) = T_i p_i (1 - p_i)$. All variance exceeding this value cannot be not taken into account by the model. There are multiple ways of dealing with this so called *overdispersion* and the solution described below will serve as an illustrative example of how to define custom families in **brms**. ## The Beta-Binomial Distribution The *beta-binomial* model is a generalization of the *binomial* model with an additional parameter to account for overdispersion. In the beta-binomial model, we do not predict the binomial probability $p_i$ directly, but assume it to be beta distributed with hyperparameters $\alpha > 0$ and $\beta > 0$: $$ p_i \sim \text{Beta}(\alpha_i, \beta_i) $$ The $\alpha$ and $\beta$ parameters are both hard to interprete and generally not recommended for use in regression models. Thus, we will apply a different parameterization with parameters $\mu \in [0, 1]$ and $\phi > 0$, which we will call $\text{Beta2}$: $$ \text{Beta2}(\mu, \phi) = \text{Beta}(\mu \phi, (1-\mu) \phi) $$ The parameters $\mu$ and $\phi$ specify the mean and precision parameter, respectively. By defining $$ \mu_i = \frac{\exp(\eta_i)}{1 + \exp(\eta_i)} $$ we still predict the expected probability by means of our transformed linear predictor (as in the original binomial model), but account for potential overdispersion via the parameter $\phi$. ## Fitting Custom Family Models The beta-binomial distribution is not natively supported in **brms** and so we will have to define it ourselves using the `custom_family` function. This function requires the family's name, the names of its parameters (`mu` and `phi` in our case), corresponding link functions (only applied if parameters are prediced), their theoretical lower and upper bounds (only applied if parameters are not predicted), information on whether the distribuion is discrete or continuous, and finally, whether additional non-parameter variables need to be passed to the distribution. For our beta-binomial example, this results in the following custom family: ```{r beta_binomial2} beta_binomial2 <- custom_family( "beta_binomial2", dpars = c("mu", "phi"), links = c("logit", "log"), lb = c(NA, 0), type = "int", vars = "vint1[n]" ) ``` The name `vint1` for the variable containing the number of trials is not chosen arbitrarily as we will see below. Next, we have to provide the relevant **Stan** functions if the distribution is not defined in **Stan** itself. For the `beta_binomial2` distribution, this is straight forward since the ordinal `beta_binomial` distribution is already implemented. ```{r stan_funs} stan_funs <- " real beta_binomial2_lpmf(int y, real mu, real phi, int T) { return beta_binomial_lpmf(y | T, mu * phi, (1 - mu) * phi); } int beta_binomial2_rng(real mu, real phi, int T) { return beta_binomial_rng(T, mu * phi, (1 - mu) * phi); } " ``` For the model fitting, we will only need `beta_binomial2_lpmf`, but `beta_binomial2_rng` will come in handy when it comes to post-processing. We define: ```{r stanvars} stanvars <- stanvar(scode = stan_funs, block = "functions") ``` To provide information about the number of trials (an integer variable), we are going to use the addition argument `vint()`, which can only be used in custom families. Simiarily, if we needed to include additional vectors of real data, we would use `vreal()`. Actually, for this particular example, we could more elegantly apply the addition argument `trials()` instead of `vint()`as in the basic binomial model. However, since the present vignette is ment to give a general overview of the topic, we will go with the more general method. We now have all components together to fit our custom beta-binomial model: ```{r fit2, results='hide'} fit2 <- brm( incidence | vint(size) ~ period + (1|herd), data = cbpp, family = beta_binomial2, stanvars = stanvars ) ``` The summary output reveals that the uncertainty in the coefficients of `period` is somewhat larger than in the basic binomial model, which is the result of including the overdispersion parameter `phi` in the model. Aparat from that, the results looks pretty similar. ```{r summary_fit2} summary(fit2) ``` ## Post-Processing Custom Family Models Some post-proecssing methods such as `summary` or `plot` work out of the box for custom family models. However, there are three particularily important methods, which require additional input by the user. These are `pp_expect`, `posterior_predict` and `log_lik` computing predicted mean values, predicted response values, and log-likelihood values, respectively. They are not only relevant for their own sake, but also provide the basis of many other post-processing methods. For instance, we may be interested in comparing the fit of the binomial model with that of the beta-binomial model by means of approximate leave-one-out cross-validation implemented in method `loo`, which in turn requires `log_lik` to be working. The `log_lik` function of a family should be named `log_lik_` and have the two arguments `i` (indicating observations) and `draws`. You don't have to worry too much about how `draws` is created. Instead, all you need to know is that parameters are stored in slot `dpars` and data are stored in slot `data`. Generally, parameters take on the form of a $S \times N$ matrix (with $S =$ number of posterior samples and $N =$ number of observations) if they are predicted (as is `mu` in our example) and a vector of size $N$ if the are not predicted (as is `phi`). We could define the complete log-likelihood function R directly, or we can expose the self-defined **Stan** functions and apply them. The latter approach is usually more convenient, but the former is more stable and the only option when implementing custom families in other R packages building upon **brms**. For the purpose of the present vignette, we will go with the latter approach ```{r} expose_functions(fit2, vectorize = TRUE) ``` and define the required `log_lik` functions with a few lines of code. ```{r log_lik} log_lik_beta_binomial2 <- function(i, draws) { mu <- draws$dpars$mu[, i] phi <- draws$dpars$phi trials <- draws$data$vint1[i] y <- draws$data$Y[i] beta_binomial2_lpmf(y, mu, phi, trials) } ``` With that being done, all of the post-processing methods requiring `log_lik` will work as well. For instance, model comparison can simply be performed via ```{r loo} loo(fit1, fit2) ``` Since larger `ELPD` values indicate better fit, we see that the beta-binomial model fits somewhat better, although the corresponding standard error reveals that the difference is not that substantial. Next, we will define the function necessary for the `posterior_predict` method: ```{r posterior_predict} posterior_predict_beta_binomial2 <- function(i, draws, ...) { mu <- draws$dpars$mu[, i] phi <- draws$dpars$phi trials <- draws$data$vint1[i] beta_binomial2_rng(mu, phi, trials) } ``` The `posterior_predict` function looks pretty similar to the corresponding `log_lik` function, except that we are now creating random samples of the response instead of log-liklihood values. Again, we are using an exposed **Stan** function for convenience. Make sure to add a `...` argument to your `posterior_predict` function even if you are not using it, since some families require additional arguments. With `posterior_predict` to be working, we can engage for instance in posterior-predictive checking: ```{r pp_check} pp_check(fit2) ``` When defining the `pp_expect` function, you have to keep in mind that it has only a `draws` argument and should compute the mean response values for all observations at once. Since the mean of the beta-binomial distribution is $\text{E}(y) = \mu T$ definition of the corresponding `pp_expect` function is not too complicated, but we need to get the dimension of parameters and data in line. ```{r pp_expect} pp_expect_beta_binomial2 <- function(draws) { mu <- draws$dpars$mu trials <- draws$data$vint1 trials <- matrix(trials, nrow = nrow(mu), ncol = ncol(mu), byrow = TRUE) mu * trials } ``` A post-processing method relying directly on `pp_expect` is `conditional_effects`, which allows to visualize effects of predictors. ```{r conditional_effects} conditional_effects(fit2, conditions = data.frame(size = 1)) ``` For ease of interpretation we have set `size` to 1 so that the y-axis of the above plot indicates probabilities. ## Turning a Custom Family into a Native Family Family functions built natively into **brms** are saver to use and more convenient, as they require much less user input. If you think that your custom family is general enough to be useful to other users, please feel free to open an issue on [GitHub](https://github.com/paul-buerkner/brms/issues) so that we can discuss all the details. Provided that we agree it makes sense to implement your family natively in brms, the following steps are required (`foo` is a placeholder for the family name): * In `family-lists.R`, add function `.family_foo` which should contain basic information about your family (you will find lots of examples for other families there). * In `families.R`, add family function `foo` which should be a simple wrapper around `.brmsfamily`. * In `stan-likelihood.R`, add function `stan_llh_foo` which provides the likelihood of the family in Stan language. * If necessary, add self-defined Stan functions in separate files under `inst/chunks`. * Add functions `posterior_predict_foo`, `pp_expect_foo` and `log_lik_foo` to `posterior_predict.R`, `pp_expect.R` and `log_lik.R`, respectively. * If necessary, add distribution functions to `distributions.R`. brms/inst/doc/brms_families.Rmd0000644000176200001440000003271313450600656016232 0ustar liggesusers--- title: "Parameterization of Response Distributions in brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Parameterization of Response Distributions in brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- The purpose of this vignette is to discuss the parameterizations of the families (i.e., response distributions) used in brms. For a more general overview of the package see `vignette("brms_overview")`. ## Notation Throughout this vignette, we denote values of the response variable as $y$, a density function as $f$, and use $\mu$ to refer to the main model parameter, which is usually the mean of the response distribution or some closely related quantity. In a regression framework, $\mu$ is not estimated directly but computed as $\mu = g(\eta)$, where $\eta$ is a predictor term (see `help(brmsformula)` for details) and $g$ is the response function (i.e., inverse of the link function). ## Location shift models The density of the **gaussian** family is given by $$ f(y) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{1}{2}\left(\frac{y - \mu}{\sigma}\right)^2\right) $$ where $\sigma$ is the residual standard deviation. The density of the **student** family is given by $$ f(y) = \frac{\Gamma((\nu + 1)/2)}{\Gamma(\nu/2)} \frac{1}{\sqrt{\nu\pi}\sigma}\left(1 + \frac{1}{\nu} \left(\frac{y - \mu}{\sigma}\right)^2\right)^{-(\nu+1)/2} $$ $\Gamma$ denotes the gamma function and $\nu > 1$ are the degrees of freedom. As $\nu \rightarrow \infty$, the student distribution becomes the gaussian distribution. The density of the **skew_normal** family is given by $$ f(y) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{1}{2} \left(\frac{y - \xi}{\omega}\right)^2 \right) \left(1 + \text{erf} \left( \alpha \left(\frac{y - \xi}{\omega \sqrt{2}} \right) \right) \right) $$ where $\xi$ is the location parameter, $\omega$ is the positive scale parameter, $\alpha$ the skewness parameter, and $\text{erf}$ denotes the error function of the gaussian distribution. To parameterize the skew-normal distribution in terms of the mean $\mu$ and standard deviation $\sigma$, $\omega$ and $\xi$ are computed as $$ \omega = \frac{\sigma}{\sqrt{1 - \frac{2}{\pi} \frac{\alpha^2}{1 + \alpha^2}}} $$ $$ \xi = \mu - \omega \frac{\alpha}{\sqrt{1 + \alpha^2}} \sqrt{\frac{2}{\pi}} $$ If $\alpha = 0$, the skew-normal distribution becomes the gaussian distribution. For location shift models, $y$ can be any real value. ## Binary and count data models The density of the **binomial** family is given by $$ f(y) = {N \choose y} \mu^{y} (1-\mu)^{N - y} $$ where $N$ is the number of trials and $y \in \{0, ... , N\}$. When all $N$ are $1$ (i.e., $y \in \{0,1\}$), the bernoulli distribution for binary data arises. **binomial** and **bernoulli** families are distinguished in brms as the bernoulli distribution has its own implementation in Stan that is computationlly more efficient. For $y \in \mathbb{N}_0$, the density of the **poisson** family is given by $$ f(y) = \frac{\mu^{y}}{y!} \exp(-\mu) $$ The density of the **negbinomial** (negative binomial) family is $$ f(y) = {y + \phi - 1 \choose y} \left(\frac{\mu}{\mu + \phi}\right)^{y} \left(\frac{\phi}{\mu + \phi}\right)^\phi $$ where $\phi$ is a positive precision parameter. For $\phi \rightarrow \infty$, the negative binomial distribution becomes the poisson distribution. The density of the **geometric** family arises if $\phi$ is set to $1$. ## Survival models With survival models we mean all models that are defined on the positive reals only, that is $y \in \mathbb{R}^+$. The density of the **lognormal** family is given by $$ f(y) = \frac{1}{\sqrt{2\pi}\sigma x} \exp\left(-\frac{1}{2}\left(\frac{\log(y) - \mu}{\sigma}\right)^2\right) $$ where $\sigma$ is the residual standard deviation on the log-scale. The density of the **Gamma** family is given by $$ f(y) = \frac{(\alpha / \mu)^\alpha}{\Gamma(\alpha)} y^{\alpha-1} \exp\left(-\frac{\alpha y}{\mu}\right) $$ where $\alpha$ is a positive shape parameter. The density of the **weibull** family is given by $$ f(y) = \frac{\alpha}{s} \left(\frac{y}{s}\right)^{\alpha-1} \exp\left(-\left(\frac{y}{s}\right)^\alpha\right) $$ where $\alpha$ is again a positive shape parameter and $s = \mu / \Gamma(1 + 1 / \alpha)$ is the scale parameter to that $\mu$ is the mean of the distribution. The **exponential** family arises if $\alpha$ is set to $1$ for either the gamma or Weibull distribution. The density of the **inverse.gaussian** family is given by $$ f(y) = \left(\frac{\alpha}{2 \pi y^3}\right)^{1/2} \exp \left(\frac{-\alpha (y - \mu)^2}{2 \mu^2 y} \right) $$ where $\alpha$ is a positive shape parameter. ## Extreme value models Modeling extremes requires special distributions. One may use the **weibull** distribution (see above) or the **frechet** distribution with density $$ f(y) = \frac{\nu}{s} \left(\frac{y}{s}\right)^{-1-\nu} \exp\left(-\left(\frac{y}{s}\right)^{-\nu}\right) $$ where $s = \mu / \Gamma(1 - 1 / \nu)$ is a positive scale parameter and $\nu > 1$ is a shape parameter so that $\mu$ predicts the mean of the Frechet distribution. A generalization of both distributions is the generalized extreme value distribution (family **gen_extreme_value**) with density $$ f(y) = \frac{1}{\sigma} t(y)^{-1 - 1 / \xi} \exp(-t(y)) $$ where $$ t(y) = \left(1 + \xi \left(\frac{y - \mu}{\sigma} \right)\right)^{-1 / \xi} $$ with positive scale parameter $\sigma$ and shape parameter $\xi$. ## Response time models One family that is especially suited to model reaction times is the **exgaussian** ('exponentially modified Gaussian') family. Its density is given by $$ f(y) = \frac{1}{2 \beta} \exp\left(\frac{1}{2 \beta} \left(2\xi + \sigma^2 / \beta - 2 y \right) \right) \text{erfc}\left(\frac{\xi + \sigma^2 / \beta - y}{\sqrt{2} \sigma} \right) $$ where $\beta$ is the scale (inverse rate) of the exponential component, $\xi$ is the mean of the Gaussian componenent, $\sigma$ is the standard deviation of the Gaussian component, and $\text{erfc}$ is the complementary error function. We parameterize $\mu = \xi + \beta$ so that the main predictor term equals the mean of the distribution. Another family well suited for modelling response times is the **shifted_lognormal** distribution. It's density equals that of the **lognormal** distribution except that the whole distribution is shifted to the right by a positive parameter called *ndt* (for consistency with the **wiener** diffusion model explained below). A family concerned with the combined modelling of reaction times and corresponding binary responses is the **wiener** diffusion model. It has four model parameters each with a natural interpreation. The parameter $\alpha > 0$ describes the separation between two boundaries of the diffusion process, $\tau > 0$ describes the non-decision time (e.g., due to image or motor processing), $\beta \in [0, 1]$ describes the initial bias in favor of the upper alternative, and $\delta \in \mathbb{R}$ describes the drift rate to the boundaries (a positive value indicates a drift towards to upper boundary). The density for the reaction time at the upper boundary is given by $$ f(y) = \frac{\alpha}{(y-\tau)^3/2} \exp \! \left(- \delta \alpha \beta - \frac{\delta^2(y-\tau)}{2}\right) \sum_{k = - \infty}^{\infty} (2k + \beta) \phi \! \left(\frac{2k + \alpha \beta}{\sqrt{y - \tau}}\right) $$ where $\phi(x)$ denotes the standard normal density function. The density at the lower boundary can be obtained by substituting $1 - \beta$ for $\beta$ and $-\delta$ for $\delta$ in the above equation. In brms the parameters $\alpha$, $\tau$, and $\beta$ are modeled as auxiliary parameters named *bs* ('boundary separation'), *ndt* ('non-decision time'), and *bias* respectively, whereas the drift rate $\delta$ is modeled via the ordinary model formula that is as $\delta = \mu$. ## Quantile regression Quantile regression is implemented via family **asym_laplace** (asymmetric Laplace distribution) with density $$ f(y) = \frac{p (1 - p)}{\sigma} \exp\left(-\rho_p\left(\frac{y - \mu}{\sigma}\right)\right) $$ where $\rho_p$ is given by $\rho_p(x) = x (p - I_{x < 0})$ and $I_A$ is the indicator function of set $A$. The parameter $\sigma$ is a positive scale parameter and $p$ is the *quantile* parameter taking on values in $(0, 1)$. For this distribution, we have $P(Y < g(\eta)) = p$. Thus, quantile regression can be performed by fixing $p$ to the quantile to interest. ## Probability models The density of the **Beta** family for $y \in (0,1)$ is given by $$ f(y) = \frac{y^{\mu \phi - 1} (1-y)^{(1-\mu) \phi-1}}{B(\mu \phi, (1-\mu) \phi)} $$ where $B$ is the beta function and $\phi$ is a positive precision parameter. A multivariate generalization of the **Beta** family is the **dirichlet** family with density $$ f(y) = \frac{1}{B((\mu_{1}, \ldots, \mu_{K}) \phi)} \prod_{k=1}^K y_{k}^{\mu_{k} \phi - 1}. $$ The **dirichlet** distribution is only implemented with the multivariate logit link function so that $$ \mu_{j} = \frac{\exp(\eta_{j})}{\sum_{k = 1}^{K} \exp(\eta_{k})} $$ For reasons of identifiability, $\eta_{1}$ is set to $0$. ## Circular models The density of the **von_mises** family for $y \in (-\pi,\pi)$ is given by $$ f(y) = \frac{\exp(\kappa \cos(y - \mu))}{2\pi I_0(\kappa)} $$ where $I_0$ is the modified Bessel function of order 0 and $\kappa$ is a positive precision parameter. ## Ordinal and categorical models For ordinal and categorical models, $y$ is one of the categories $1, ..., K$. The intercepts of ordinal models are called thresholds and are denoted as $\tau_k$, with $k \in \{1, ..., K-1\}$, whereas $\eta$ does not contain a fixed effects intercept. Note that the applied link functions $h$ are technically distribution functions $\mathbb{R} \rightarrow [0,1]$. The density of the **cumulative** family (implementing the most basic ordinal model) is given by $$ f(y) = g(\tau_{y + 1} - \eta) - g(\tau_{y} - \eta) $$ The densities of the **sratio** (stopping ratio) and **cratio** (continuation ratio) families are given by $$ f(y) = g(\tau_{y + 1} - \eta) \prod_{k = 1}^{y} (1 - g(\tau_{k} - \eta)) $$ and $$ f(y) = (1 - g(\eta - \tau_{y + 1})) \prod_{k = 1}^{y} g(\eta - \tau_{k}) $$ respectively. Note that both families are equivalent for symmetric link functions such as logit or probit. The density of the **acat** (adjacent category) family is given by $$ f(y) = \frac{\prod_{k=1}^{y} g(\eta - \tau_{k}) \prod_{k=y+1}^K(1-g(\eta - \tau_{k}))}{\sum_{k=0}^K\prod_{j=1}^k g(\eta-\tau_{j}) \prod_{j=k+1}^K(1-g(\eta - \tau_{j}))} $$ For the logit link, this can be simplified to $$ f(y) = \frac{\exp \left(\sum_{k=1}^{y} (\eta - \tau_{k}) \right)} {\sum_{k=0}^K \exp\left(\sum_{j=1}^k (\eta - \tau_{j}) \right)} $$ The linear predictor $\eta$ can be generalized to also depend on the category $k$ for a subset of predictors. This leads to category specific effects (for details on how to specify them see `help(brm)`). Note that **cumulative** and **sratio** models use $\tau - \eta$, whereas **cratio** and **acat** use $\eta - \tau$. This is done to ensure that larger values of $\eta$ increase the probability of *higher* reponse categories. The **categorical** family is currently only implemented with the multivariate logit link function and has density $$ f(y) = \mu_{y} = \frac{\exp(\eta_{y})}{\sum_{k = 1}^{K} \exp(\eta_{k})} $$ Note that $\eta$ does also depend on the category $k$. For reasons of identifiability, $\eta_{1}$ is set to $0$. A generalization of the **categorical** family to more than one trial is the **multinomial** family with density $$ f(y) = {N \choose y_{1}, y_{2}, \ldots, y_{K}} \prod_{k=1}^K \mu_{k}^{y_{k}} $$ where, for each category, $\mu_{k}$ is estimated via the multivariate logit link function shown above. ## Zero-inflated and hurdle models **Zero-inflated** and **hurdle** families extend existing families by adding special processes for responses that are zero. The densitiy of a **zero-inflated** family is given by $$ f_z(y) = z + (1 - z) f(0) \quad \text{if } y = 0 \\ f_z(y) = (1 - z) f(y) \quad \text{if } y > 0 $$ where $z$ denotes the zero-inflation probability. Currently implemented families are **zero_inflated_poisson**, **zero_inflated_binomial**, **zero_inflated_negbinomial**, and **zero_inflated_beta**. The density of a **hurdle** family is given by $$ f_z(y) = z \quad \text{if } y = 0 \\ f_z(y) = (1 - z) f(y) / (1 - f(0)) \quad \text{if } y > 0 $$ Currently implemented families are **hurdle_poisson**, **hurdle_negbinomial**, **hurdle_gamma**, and **hurdle_lognormal**. The density of a **zero-one-inflated** family is given by $$ f_{\alpha, \gamma}(y) = \alpha (1 - \gamma) \quad \text{if } y = 0 \\ f_{\alpha, \gamma}(y) = \alpha \gamma \quad \text{if } y = 1 \\ f_{\alpha, \gamma}(y) = (1 - \alpha) f(y) \quad \text{if } y \notin \{0, 1\} $$ where $\alpha$ is the zero-one-inflation probability (i.e. the probability that zero or one occurs) and $\gamma$ is the conditional one-inflation probability (i.e. the probability that one occurs rather than zero). Currently implemented families are **zero_one_inflated_beta**. brms/inst/doc/brms_nonlinear.Rmd0000644000176200001440000003042513610312641016414 0ustar liggesusers--- title: "Estimating Non-Linear Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Non-Linear Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction This vignette provides an introduction on how to fit non-linear multilevel models with **brms**. Non-linear models are incredibly flexible and powerful, but require much more care with respect to model specification and priors than typical generalized linear models. Ignoring group-level effects for the moment, the predictor term $\eta_n$ of a generalized linear model for observation $n$ can be written as follows: $$\eta_n = \sum_{i = 1}^K b_i x_{ni}$$ where $b_i$ is the regression coefficient of predictor $i$ and $x_{ni}$ is the data of predictor $i$ for observation $n$. This also compromises interaction terms and various other data transformations. However, the structure of $\eta_n$ is always linear in the sense that the regression coefficients $b_i$ are multiplied by some predictor values and then summed up. This implies that the hypothetical predictor term $$\eta_n = b_1 \exp(b_2 x_n)$$ would *not* be a *linear* predictor anymore and we could not fit it using classical techniques of generalized linear models. We thus need a more general model class, which we will call *non-linear* models. Note that the term 'non-linear' does not say anything about the assumed distribution of the response variable. In particular it does not mean 'not normally distributed' as we can apply non-linear predictor terms to all kinds of response distributions (for more details on response distributions available in **brms** see `vignette("brms_families")`). ## A Simple Non-Linear Model We begin with a simple example using simulated data. ```{r} b <- c(2, 0.75) x <- rnorm(100) y <- rnorm(100, mean = b[1] * exp(b[2] * x)) dat1 <- data.frame(x, y) ``` As stated above, we cannot use a generalized linear model to estimate $b$ so we go ahead an specify a non-linear model. ```{r, results='hide'} prior1 <- prior(normal(1, 2), nlpar = "b1") + prior(normal(0, 2), nlpar = "b2") fit1 <- brm(bf(y ~ b1 * exp(b2 * x), b1 + b2 ~ 1, nl = TRUE), data = dat1, prior = prior1) ``` When looking at the above code, the first thing that becomes obvious is that we changed the `formula` syntax to display the non-linear formula including predictors (i.e., `x`) and parameters (i.e., `b1` and `b2`) wrapped in a call to `bf`. This stands in contrast to classical **R** formulas, where only predictors are given and parameters are implicit. The argument `b1 + b2 ~ 1` serves two purposes. First, it provides information, which variables in `formula` are parameters, and second, it specifies the linear predictor terms for each parameter. In fact, we should think of non-linear parameters as placeholders for linear predictor terms rather than as parameters themselves (see also the following examples). In the present case, we have no further variables to predict `b1` and `b2` and thus we just fit intercepts that represent our estimates of $b_1$ and $b_2$ in the model equation above. The formula `b1 + b2 ~ 1` is a short form of `b1 ~ 1, b2 ~ 1` that can be used if multiple non-linear parameters share the same formula. Setting `nl = TRUE` tells **brms** that the formula should be treated as non-linear. In contrast to generalized linear models, priors on population-level parameters (i.e., 'fixed effects') are often mandatory to identify a non-linear model. Thus, **brms** requires the user to explicitely specify these priors. In the present example, we used a `normal(1, 2)` prior on (the population-level intercept of) `b1`, while we used a `normal(0, 2)` prior on (the population-level intercept of) `b2`. Setting priors is a non-trivial task in all kinds of models, especially in non-linear models, so you should always invest some time to think of appropriate priors. Quite often, you may be forced to change your priors after fitting a non-linear model for the first time, when you observe different MCMC chains converging to different posterior regions. This is a clear sign of an idenfication problem and one solution is to set stronger (i.e., more narrow) priors. To obtain summaries of the fitted model, we apply ```{r} summary(fit1) plot(fit1) plot(conditional_effects(fit1), points = TRUE) ``` The `summary` method reveals that we were able to recover the true parameter values pretty nicely. According to the `plot` method, our MCMC chains have converged well and to the same posterior. The `conditional_effects` method visualizes the model-implied (non-linear) regression line. We might be also interested in comparing our non-linear model to a classical linear model. ```{r, results='hide'} fit2 <- brm(y ~ x, data = dat1) ``` ```{r} summary(fit2) ``` To investigate and compare model fit, we can apply graphical posterior predictive checks, which make use of the **bayesplot** package on the backend. ```{r} pp_check(fit1) pp_check(fit2) ``` We can also easily compare model fit using leave-one-out cross-validation. ```{r} loo(fit1, fit2) ``` Since smaller `LOOIC` values indicate better model fit, it is immediately evident that the non-linear model fits the data better, which is of course not too surpirsing since we simulated the data from exactly that model. ## A Real-World Non-Linear model On his blog, Markus Gesmann predicts the growth of cumulative insurance loss payments over time, originated from different origin years (see https://www.magesblog.com/post/2015-11-03-loss-developments-via-growth-curves-and/). We will use a slightly simplified version of his model for demonstration purposes here. It looks as follows: $$cum_{AY, dev} \sim N(\mu_{AY, dev}, \sigma)$$ $$\mu_{AY, dev} = ult_{AY} \left(1 - \exp\left(- \left( \frac{dev}{\theta} \right)^\omega \right) \right)$$ The cumulative insurance payments $cum$ will grow over time, and we model this dependency using the variable $dev$. Further, $ult_{AY}$ is the (to be estimated) ultimate loss of accident each year. It constitutes a non-linear parameter in our framework along with the parameters $\theta$ and $\omega$, which are responsible for the growth of the cumulative loss and are assumed to be the same across years. We load the data ```{r} loss <- read.csv("https://paul-buerkner.github.io/data/loss.csv") head(loss) ``` and translate the proposed model into a non-linear **brms** model. ```{r, results='hide'} fit_loss <- brm( bf(cum ~ ult * (1 - exp(-(dev/theta)^omega)), ult ~ 1 + (1|AY), omega ~ 1, theta ~ 1, nl = TRUE), data = loss, family = gaussian(), prior = c( prior(normal(5000, 1000), nlpar = "ult"), prior(normal(1, 2), nlpar = "omega"), prior(normal(45, 10), nlpar = "theta") ), control = list(adapt_delta = 0.9) ) ``` We estimate a group-level effect of accident year (variable `AY`) for the ultimate loss `ult`. This also shows nicely how a non-linear parameter is actually a placeholder for a linear predictor, which in case of `ult`, contains only an varying intercept over year. Again, priors on population-level effects are required and, for the present model, are actually mandatory to ensure identifiability. We summarize the model using well known methods. ```{r} summary(fit_loss) plot(fit_loss, N = 3, ask = FALSE) conditional_effects(fit_loss) ``` Next, we show marginal effects separately for each year. ```{r} conditions <- data.frame(AY = unique(loss$AY)) rownames(conditions) <- unique(loss$AY) me_loss <- conditional_effects( fit_loss, conditions = conditions, re_formula = NULL, method = "predict" ) plot(me_loss, ncol = 5, points = TRUE) ``` It is evident that there is some variation in cumulative loss across accident years, for instance due to natural disasters happening only in certain years. Further, we see that the uncertainty in the predicted cumulative loss is larger for later years with fewer available data points. ## Advanced Item-Response Models As a third example, we want to show how to model more advanced item-response models using the non-linear model framework of **brms**. For simplicity, suppose we have a single forced choice item with three alternatives of which only one is correct. Our response variable is whether a person answers the item correctly (1) or not (0). Person are assumed to vary in their ability to answer the item correctly. However, every person has a 33% chance of getting the item right just by guessing. We thus simulate some data to reflect this situation. ```{r} inv_logit <- function(x) 1 / (1 + exp(-x)) ability <- rnorm(300) p <- 0.33 + 0.67 * inv_logit(ability) answer <- ifelse(runif(300, 0, 1) < p, 1, 0) dat_ir <- data.frame(ability, answer) ``` The most basic item-response model is equivalent to a simple logistic regression model. ```{r, results='hide'} fit_ir1 <- brm(answer ~ ability, data = dat_ir, family = bernoulli()) ``` However, this model completely ignores the guessing probability and will thus likely come to biased estimates and predictions. ```{r} summary(fit_ir1) plot(conditional_effects(fit_ir1), points = TRUE) ``` A more sophisticated approach incorporating the guessing probability looks as follows: ```{r, results='hide'} fit_ir2 <- brm( bf(answer ~ 0.33 + 0.67 * inv_logit(eta), eta ~ ability, nl = TRUE), data = dat_ir, family = bernoulli("identity"), prior = prior(normal(0, 5), nlpar = "eta") ) ``` It is very important to set the link function of the `bernoulli` family to `identity` or else we will apply two link functions. This is because our non-linear predictor term already contains the desired link function (`0.33 + 0.67 * inv_logit`), but the `bernoulli` family applies the default `logit` link on top of it. This will of course lead to strange and uninterpretable results. Thus, please make sure that you set the link function to `identity`, whenever your non-linear predictor term already contains the desired link function. ```{r} summary(fit_ir2) plot(conditional_effects(fit_ir2), points = TRUE) ``` Comparing model fit via leave-one-out cross-validation ```{r} loo(fit_ir1, fit_ir2) ``` shows that both model fit the data equally well, but remember that predictions of the first model might still be misleading as they may well be below the guessing probability for low ability values. Now, suppose that we don't know the guessing probability and want to estimate it from the data. This can easily be done changing the previous model just a bit. ```{r, results='hide'} fit_ir3 <- brm( bf(answer ~ guess + (1 - guess) * inv_logit(eta), eta ~ 0 + ability, guess ~ 1, nl = TRUE), data = dat_ir, family = bernoulli("identity"), prior = c( prior(normal(0, 5), nlpar = "eta"), prior(beta(1, 1), nlpar = "guess", lb = 0, ub = 1) ) ) ``` Here, we model the guessing probability as a non-linear parameter making sure that it cannot exceed the interval $[0, 1]$. We did not estimate an intercept for `eta`, as this will lead to a bias in the estimated guessing parameter (try it out; this is an excellent example of how careful one has to be in non-linear models). ```{r} summary(fit_ir3) plot(fit_ir3) plot(conditional_effects(fit_ir3), points = TRUE) ``` The results show that we are able to recover the simulated model parameters with this non-linear model. Of course, real item-response data have multiple items so that accounting for item and person variability (e.g., using a multilevel model with varying intercepts) becomes necessary as we have multiple observations per item and person. Luckily, this can all be done within the non-linear framework of **brms** and I hope that this vignette serves as a good starting point. brms/inst/doc/brms_customfamilies.html0000644000176200001440000015121713623753356017720 0ustar liggesusers Define Custom Response Distributions with brms

    Define Custom Response Distributions with brms

    Paul Bürkner

    2020-02-21

    Introduction

    The brms package comes with a lot of built-in response distributions – usually called families in R – to specify among others linear, count data, survival, response times, or ordinal models (see help(brmsfamily) for an overview). Despite supporting over two dozen families, there is still a long list of distributions, which are not natively supported. The present vignette will explain how to specify such custom families in brms. By doing that, users can benefit from the modeling flexibility and post-processing options of brms even when using self-defined response distributions.

    A Case Study

    As a case study, we will use the cbpp data of the lme4 package, which describes the development of the CBPP disease of cattle in Africa. The data set contains four variables: period (the time period), herd (a factor identifying the cattle herd), incidence (number of new disease cases for a given herd and time period), as well as size (the herd size at the beginning of a given time period).

      herd incidence size period
    1    1         2   14      1
    2    1         3   12      2
    3    1         4    9      3
    4    1         0    5      4
    5    2         3   22      1
    6    2         1   18      2

    In a first step, we will be predicting incidence using a simple binomial model, which will serve as our baseline model. For observed number of events \(y\) (incidence in our case) and total number of trials \(T\) (size), the probability mass function of the binomial distribution is defined as

    \[ P(y | T, p) = \binom{T}{y} p^{y} (1 - p)^{N-y} \]

    where \(p\) is the event probability. In the classical binomial model, we will directly predict \(p\) on the logit-scale, which means that for each observation \(i\) we compute the success probability \(p_i\) as

    \[ p_i = \frac{\exp(\eta_i)}{1 + \exp(\eta_i)} \]

    where \(\eta_i\) is the linear predictor term of observation \(i\) (see vignette("brms_overview") for more details on linear predictors in brms). Predicting incidence by period and a varying intercept of herd is straight forward in brms:

    In the summary output, we see that the incidence probability varies substantially over herds, but reduces over the cource of the time as indicated by the negative coefficients of period.

     Family: binomial 
      Links: mu = logit 
    Formula: incidence | trials(size) ~ period + (1 | herd) 
       Data: cbpp (Number of observations: 56) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Group-Level Effects: 
    ~herd (Number of levels: 15) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     0.77      0.24     0.40     1.32 1.00     1425     1567
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    -1.42      0.27    -1.99    -0.94 1.00     1924     1779
    period2      -1.01      0.31    -1.61    -0.40 1.00     5138     2962
    period3      -1.15      0.33    -1.82    -0.51 1.00     4403     2796
    period4      -1.62      0.44    -2.52    -0.82 1.00     5166     2606
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    A drawback of the binomial model is that – after taking into account the linear predictor – its variance is fixed to \(\text{Var}(y_i) = T_i p_i (1 - p_i)\). All variance exceeding this value cannot be not taken into account by the model. There are multiple ways of dealing with this so called overdispersion and the solution described below will serve as an illustrative example of how to define custom families in brms.

    The Beta-Binomial Distribution

    The beta-binomial model is a generalization of the binomial model with an additional parameter to account for overdispersion. In the beta-binomial model, we do not predict the binomial probability \(p_i\) directly, but assume it to be beta distributed with hyperparameters \(\alpha > 0\) and \(\beta > 0\):

    \[ p_i \sim \text{Beta}(\alpha_i, \beta_i) \]

    The \(\alpha\) and \(\beta\) parameters are both hard to interprete and generally not recommended for use in regression models. Thus, we will apply a different parameterization with parameters \(\mu \in [0, 1]\) and \(\phi > 0\), which we will call \(\text{Beta2}\):

    \[ \text{Beta2}(\mu, \phi) = \text{Beta}(\mu \phi, (1-\mu) \phi) \]

    The parameters \(\mu\) and \(\phi\) specify the mean and precision parameter, respectively. By defining

    \[ \mu_i = \frac{\exp(\eta_i)}{1 + \exp(\eta_i)} \]

    we still predict the expected probability by means of our transformed linear predictor (as in the original binomial model), but account for potential overdispersion via the parameter \(\phi\).

    Fitting Custom Family Models

    The beta-binomial distribution is not natively supported in brms and so we will have to define it ourselves using the custom_family function. This function requires the family’s name, the names of its parameters (mu and phi in our case), corresponding link functions (only applied if parameters are prediced), their theoretical lower and upper bounds (only applied if parameters are not predicted), information on whether the distribuion is discrete or continuous, and finally, whether additional non-parameter variables need to be passed to the distribution. For our beta-binomial example, this results in the following custom family:

    The name vint1 for the variable containing the number of trials is not chosen arbitrarily as we will see below. Next, we have to provide the relevant Stan functions if the distribution is not defined in Stan itself. For the beta_binomial2 distribution, this is straight forward since the ordinal beta_binomial distribution is already implemented.

    For the model fitting, we will only need beta_binomial2_lpmf, but beta_binomial2_rng will come in handy when it comes to post-processing. We define:

    To provide information about the number of trials (an integer variable), we are going to use the addition argument vint(), which can only be used in custom families. Simiarily, if we needed to include additional vectors of real data, we would use vreal(). Actually, for this particular example, we could more elegantly apply the addition argument trials() instead of vint()as in the basic binomial model. However, since the present vignette is ment to give a general overview of the topic, we will go with the more general method.

    We now have all components together to fit our custom beta-binomial model:

    The summary output reveals that the uncertainty in the coefficients of period is somewhat larger than in the basic binomial model, which is the result of including the overdispersion parameter phi in the model. Aparat from that, the results looks pretty similar.

     Family: beta_binomial2 
      Links: mu = logit; phi = identity 
    Formula: incidence | vint(size) ~ period + (1 | herd) 
       Data: cbpp (Number of observations: 56) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Group-Level Effects: 
    ~herd (Number of levels: 15) 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)     0.40      0.26     0.02     0.97 1.00      802     1448
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    -1.36      0.26    -1.89    -0.87 1.00     2999     2219
    period2      -1.01      0.41    -1.87    -0.22 1.00     3361     2442
    period3      -1.27      0.46    -2.21    -0.40 1.00     3637     2826
    period4      -1.55      0.52    -2.63    -0.60 1.00     3765     2622
    
    Family Specific Parameters: 
        Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    phi    18.13     16.52     5.38    60.12 1.00     1279     1023
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    Post-Processing Custom Family Models

    Some post-proecssing methods such as summary or plot work out of the box for custom family models. However, there are three particularily important methods, which require additional input by the user. These are pp_expect, posterior_predict and log_lik computing predicted mean values, predicted response values, and log-likelihood values, respectively. They are not only relevant for their own sake, but also provide the basis of many other post-processing methods. For instance, we may be interested in comparing the fit of the binomial model with that of the beta-binomial model by means of approximate leave-one-out cross-validation implemented in method loo, which in turn requires log_lik to be working.

    The log_lik function of a family should be named log_lik_<family-name> and have the two arguments i (indicating observations) and draws. You don’t have to worry too much about how draws is created. Instead, all you need to know is that parameters are stored in slot dpars and data are stored in slot data. Generally, parameters take on the form of a \(S \times N\) matrix (with \(S =\) number of posterior samples and \(N =\) number of observations) if they are predicted (as is mu in our example) and a vector of size \(N\) if the are not predicted (as is phi).

    We could define the complete log-likelihood function R directly, or we can expose the self-defined Stan functions and apply them. The latter approach is usually more convenient, but the former is more stable and the only option when implementing custom families in other R packages building upon brms. For the purpose of the present vignette, we will go with the latter approach

    and define the required log_lik functions with a few lines of code.

    With that being done, all of the post-processing methods requiring log_lik will work as well. For instance, model comparison can simply be performed via

    Output of model 'fit1':
    
    Computed from 4000 by 56 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -100.2 10.4
    p_loo        22.4  4.5
    looic       200.4 20.7
    ------
    Monte Carlo SE of elpd_loo is NA.
    
    Pareto k diagnostic values:
                             Count Pct.    Min. n_eff
    (-Inf, 0.5]   (good)     42    75.0%   831       
     (0.5, 0.7]   (ok)       11    19.6%   203       
       (0.7, 1]   (bad)       2     3.6%   31        
       (1, Inf)   (very bad)  1     1.8%   15        
    See help('pareto-k-diagnostic') for details.
    
    Output of model 'fit2':
    
    Computed from 4000 by 56 log-likelihood matrix
    
             Estimate   SE
    elpd_loo    -95.0  8.3
    p_loo        11.1  2.0
    looic       189.9 16.6
    ------
    Monte Carlo SE of elpd_loo is 0.1.
    
    Pareto k diagnostic values:
                             Count Pct.    Min. n_eff
    (-Inf, 0.5]   (good)     49    87.5%   676       
     (0.5, 0.7]   (ok)        7    12.5%   182       
       (0.7, 1]   (bad)       0     0.0%   <NA>      
       (1, Inf)   (very bad)  0     0.0%   <NA>      
    
    All Pareto k estimates are ok (k < 0.7).
    See help('pareto-k-diagnostic') for details.
    
    Model comparisons:
         elpd_diff se_diff
    fit2  0.0       0.0   
    fit1 -5.2       4.4   

    Since larger ELPD values indicate better fit, we see that the beta-binomial model fits somewhat better, although the corresponding standard error reveals that the difference is not that substantial.

    Next, we will define the function necessary for the posterior_predict method:

    The posterior_predict function looks pretty similar to the corresponding log_lik function, except that we are now creating random samples of the response instead of log-liklihood values. Again, we are using an exposed Stan function for convenience. Make sure to add a ... argument to your posterior_predict function even if you are not using it, since some families require additional arguments. With posterior_predict to be working, we can engage for instance in posterior-predictive checking:

    When defining the pp_expect function, you have to keep in mind that it has only a draws argument and should compute the mean response values for all observations at once. Since the mean of the beta-binomial distribution is \(\text{E}(y) = \mu T\) definition of the corresponding pp_expect function is not too complicated, but we need to get the dimension of parameters and data in line.

    A post-processing method relying directly on pp_expect is conditional_effects, which allows to visualize effects of predictors.

    For ease of interpretation we have set size to 1 so that the y-axis of the above plot indicates probabilities.

    Turning a Custom Family into a Native Family

    Family functions built natively into brms are saver to use and more convenient, as they require much less user input. If you think that your custom family is general enough to be useful to other users, please feel free to open an issue on GitHub so that we can discuss all the details. Provided that we agree it makes sense to implement your family natively in brms, the following steps are required (foo is a placeholder for the family name):

    • In family-lists.R, add function .family_foo which should contain basic information about your family (you will find lots of examples for other families there).
    • In families.R, add family function foo which should be a simple wrapper around .brmsfamily.
    • In stan-likelihood.R, add function stan_llh_foo which provides the likelihood of the family in Stan language.
    • If necessary, add self-defined Stan functions in separate files under inst/chunks.
    • Add functions posterior_predict_foo, pp_expect_foo and log_lik_foo to posterior_predict.R, pp_expect.R and log_lik.R, respectively.
    • If necessary, add distribution functions to distributions.R.
    brms/inst/doc/brms_monotonic.html0000644000176200001440000030337513623754747016712 0ustar liggesusers Estimating Monotonic Effects with brms

    Estimating Monotonic Effects with brms

    Paul Bürkner

    2020-02-21

    Introduction

    This vignette is about monotonic effects, a special way of handling discrete predictors that are on an ordinal or higher scale (Bürkner & Charpentier, in review). A predictor, which we want to model as monotonic (i.e., having a monotonically increasing or decreasing relationship with the response), must either be integer valued or an ordered factor. As opposed to a continuous predictor, predictor categories (or integers) are not assumend to be equidistant with respect to their effect on the response variable. Instead, the distance between adjacent predictor categories (or integers) is estimated from the data and may vary across categories. This is realized by parameterizing as follows: One parameter, \(b\), takes care of the direction and size of the effect similar to an ordinary regression parameter, while an additional parameter vector, \(\zeta\), estimates the normalized distances between consecutive predictor categories. For a single monotonic predictor, \(x\), the linear predictor term of observation \(n\) looks as follows:

    \[\eta_n = b D \sum_{i = 1}^{x_n} \zeta_i\]

    The parameter \(b\) can take on any real value, while \(\zeta\) is a simplex, which means that it satisfies \(\zeta_i \in [0,1]\) and \(\sum_{i = 1}^D \zeta_i = 1\) with \(D\) being the number of elements of \(\zeta\). Equivalently, \(D\) is the number of categories (or highest integer in the data) minus 1, since we start counting categories from zero to simplify the notation.

    A Simple Monotonic Model

    A main application of monotonic effects are ordinal predictors that can be modeled this way without falsely treating them either as continuous or as unordered categorical predictors. In Psychology, for instance, this kind of data is omnipresent in the form of Likert scale items, which are often treated as being continuous for convenience without ever testing this assumption. As an example, suppose we are interested in the relationship of yearly income (in $) and life satisfaction measured on an arbitrary scale from 0 to 100. Usually, people are not asked for the exact income. Instead, they are asked to rank themselves in one of certain classes, say: ‘below 20k’, ‘between 20k and 40k’, ‘between 40k and 100k’ and ‘above 100k’. We use some simulated data for illustration purposes.

    We now proceed with analyzing the data modeling income as a monotonic effect.

    The summary methods yield

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: ls ~ mo(income) 
       Data: dat (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    28.00      1.40    25.27    30.73 1.00     2361     2063
    moincome     16.17      0.59    15.04    17.32 1.00     2253     2196
    
    Simplex Parameters: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    moincome1[1]     0.67      0.03     0.61     0.73 1.00     3032     2142
    moincome1[2]     0.23      0.03     0.16     0.30 1.00     3397     2915
    moincome1[3]     0.10      0.03     0.04     0.16 1.00     3484     1799
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     5.90      0.44     5.12     6.84 1.00     3544     2935
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    The distributions of the simplex parameter of income, as shown in the plot method, demonstrate that the largest difference (about 70% of the difference between minimum and maximum category) is between the first two categories.

    Now, let’s compare of monotonic model with two common alternative models. (a) Assume income to be continuous:

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: ls ~ income_num 
       Data: dat (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept     22.58      2.43    17.70    27.32 1.00     3735     3127
    income_num    14.80      0.84    13.15    16.47 1.00     3890     3086
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     9.16      0.67     7.97    10.54 1.00     4329     2957
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    or (b) Assume income to be an unordered factor:

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: ls ~ income 
       Data: dat (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    27.78      1.40    25.06    30.52 1.00     2466     2205
    income2      32.66      1.82    29.17    36.17 1.00     2738     2462
    income3      43.73      1.83    40.23    47.38 1.00     2746     3031
    income4      48.74      1.77    45.19    52.24 1.00     2702     2804
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     5.90      0.44     5.13     6.84 1.00     3927     2726
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    We can easily compare the fit of the three models using leave-one-out cross-validation.

    Output of model 'fit1':
    
    Computed from 4000 by 100 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -321.4  6.8
    p_loo         4.8  0.8
    looic       642.9 13.7
    ------
    Monte Carlo SE of elpd_loo is 0.0.
    
    All Pareto k estimates are good (k < 0.5).
    See help('pareto-k-diagnostic') for details.
    
    Output of model 'fit2':
    
    Computed from 4000 by 100 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -364.5  5.7
    p_loo         2.8  0.4
    looic       728.9 11.4
    ------
    Monte Carlo SE of elpd_loo is 0.0.
    
    All Pareto k estimates are good (k < 0.5).
    See help('pareto-k-diagnostic') for details.
    
    Output of model 'fit3':
    
    Computed from 4000 by 100 log-likelihood matrix
    
             Estimate   SE
    elpd_loo   -321.4  6.8
    p_loo         4.9  0.8
    looic       642.9 13.7
    ------
    Monte Carlo SE of elpd_loo is 0.0.
    
    All Pareto k estimates are good (k < 0.5).
    See help('pareto-k-diagnostic') for details.
    
    Model comparisons:
         elpd_diff se_diff
    fit1   0.0       0.0  
    fit3   0.0       0.2  
    fit2 -43.0       6.9  

    The monotonic model fits better than the continuous model, which is not surprising given that the relationship between income and ls is non-linear. The monotonic and the unorderd factor model have almost identical fit in this example, but this may not be the case for other data sets.

    Setting Prior Distributions

    In the previous monotonic model, we have implicitly assumed that all differences between adjacent categories were a-priori the same, or formulated correctly, had the same prior distribution. In the following, we want to show how to change this assumption. The canonical prior distribution of a simplex parameter is the Dirchlet distribution, a multivariate generalization of the beta distribution. It is non-zero for all valid simplexes (i.e., \(\zeta_i \in [0,1]\) and \(\sum_{i = 1}^D \zeta_i = 1\)) and zero otherwise. The Dirichlet prior has a single parameter \(\alpha\) of the same length as \(\zeta\). The higher \(\alpha_i\) the higher the a-priori probability of higher values of \(\zeta_i\). Suppose that, before looking at the data, we expected that the same amount of additional money matters more for people who generally have less money. This translates into a higher a-priori values of \(\zeta_1\) (difference between ‘below_20’ and ‘20_to_40’) and hence into higher values of \(\alpha_1\). We choose \(\alpha_1 = 2\) and \(\alpha_2 = \alpha_3 = 1\), the latter being the default value of \(\alpha\). To fit the model we write:

    The 1 at the end of "moincome1" may appear strange when first working with monotonic effects. However, it is necessary as one monotonic term may be associated with multiple simplex parameters, if interactions of multiple monotonic variables are included in the model.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: ls ~ mo(income) 
       Data: dat (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    28.07      1.35    25.35    30.70 1.00     2728     2565
    moincome     16.12      0.59    14.97    17.25 1.00     2457     2384
    
    Simplex Parameters: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    moincome1[1]     0.67      0.03     0.61     0.73 1.00     3310     2331
    moincome1[2]     0.23      0.04     0.16     0.30 1.00     3253     2187
    moincome1[3]     0.10      0.03     0.04     0.16 1.00     2558     1479
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     5.91      0.43     5.16     6.82 1.00     3476     2495
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    We have used sample_prior = TRUE to also obtain samples from the prior distribution of simo_moincome1 so that we can visualized it.

    As is visible in the plots, simo_moincome1[1] was a-priori on average twice as high as simo_moincome1[2] and simo_moincome1[3] as a result of setting \(\alpha_1\) to 2.

    Modeling interactions of monotonic variables

    Suppose, we have additionally asked participants for their age.

    We are not only interested in the main effect of age but also in the interaction of income and age. Interactions with monotonic variables can be specified in the usual way using the * operator:

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: ls ~ mo(income) * age 
       Data: dat (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept       33.86      4.44    25.62    43.18 1.00     1361     2273
    age             -0.16      0.12    -0.41     0.06 1.00     1229     1955
    moincome        14.54      1.91    10.75    18.40 1.00     1148     2015
    moincome:age     0.05      0.05    -0.05     0.15 1.00     1083     2137
    
    Simplex Parameters: 
                     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    moincome1[1]         0.70      0.06     0.59     0.84 1.00     1673     1405
    moincome1[2]         0.21      0.06     0.07     0.32 1.00     1929     1655
    moincome1[3]         0.09      0.04     0.01     0.17 1.00     1622      896
    moincome:age1[1]     0.40      0.24     0.02     0.87 1.00     1789     2329
    moincome:age1[2]     0.33      0.23     0.01     0.82 1.00     2390     2619
    moincome:age1[3]     0.27      0.21     0.01     0.77 1.00     2286     2191
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     5.89      0.43     5.12     6.79 1.00     2877     2454
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    Modelling Monotonic Group-Level Effects

    Suppose that the 100 people in our sample data were drawn from 10 different cities; 10 people per city. Thus, we add an identifier for city to the data and add some city-related variation to ls.

    With the following code, we fit a multilevel model assuming the intercept and the effect of income to vary by city:

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: ls ~ mo(income) * age + (mo(income) | city) 
       Data: dat (Number of observations: 100) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Group-Level Effects: 
    ~city (Number of levels: 10) 
                            Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sd(Intercept)              15.70      4.46     9.40    26.89 1.00     1409     2018
    sd(moincome)                0.96      0.81     0.04     3.05 1.00     1734     2131
    cor(Intercept,moincome)    -0.34      0.52    -0.98     0.83 1.00     4191     2773
    
    Population-Level Effects: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept       31.89      7.11    17.73    46.34 1.00     1130     1657
    age             -0.11      0.12    -0.36     0.13 1.00     1694     2440
    moincome        15.01      2.11    10.87    19.08 1.00     1604     2415
    moincome:age     0.03      0.05    -0.07     0.14 1.00     1510     2253
    
    Simplex Parameters: 
                     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    moincome1[1]         0.69      0.06     0.58     0.84 1.00     2086     1705
    moincome1[2]         0.22      0.06     0.08     0.32 1.00     2610     1501
    moincome1[3]         0.09      0.04     0.01     0.18 1.00     2439     1362
    moincome:age1[1]     0.38      0.25     0.02     0.86 1.00     3688     2835
    moincome:age1[2]     0.33      0.23     0.01     0.83 1.00     4099     3270
    moincome:age1[3]     0.28      0.21     0.01     0.80 1.00     4539     3193
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     5.97      0.45     5.12     6.92 1.00     4598     2858
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    reveals that the effect of income varies only little across cities. For the present data, this is not overly surprising given that, in the data simulations, we assumed income to have the same effect across cities.

    References

    Bürkner P. C. & Charpentier, E. (in review). Monotonic Effects: A Principled Approach for Including Ordinal Predictors in Regression Models. PsyArXiv preprint.

    brms/inst/doc/brms_overview.pdf0000644000176200001440000371327713623760766016367 0ustar liggesusers%PDF-1.5 % 1 0 obj << /S /GoTo /D (Section.0.Introduction.1) >> endobj 4 0 obj (Introduction) endobj 5 0 obj << /S /GoTo /D (Section.1.Model\040description.1) >> endobj 8 0 obj (Model description) endobj 9 0 obj << /S /GoTo /D (Subsection.2.0.Prior\040distributions.2) >> endobj 12 0 obj (Prior distributions) endobj 13 0 obj << /S /GoTo /D (Subsubsection.2.1.0.Regression\040parameters\040at\040population-level.3) >> endobj 16 0 obj (Regression parameters at population-level) endobj 17 0 obj << /S /GoTo /D (Subsubsection.2.1.1.Regression\040parameters\040at\040group-level.3) >> endobj 20 0 obj (Regression parameters at group-level) endobj 21 0 obj << /S /GoTo /D (Subsubsection.2.1.2.Family\040specific\040parameters.3) >> endobj 24 0 obj (Family specific parameters) endobj 25 0 obj << /S /GoTo /D (Section.2.Parameter\040estimation.1) >> endobj 28 0 obj (Parameter estimation) endobj 29 0 obj << /S /GoTo /D (Section.3.Software.1) >> endobj 32 0 obj (Software) endobj 33 0 obj << /S /GoTo /D (Subsection.4.0.A\040worked\040example.2) >> endobj 36 0 obj (A worked example) endobj 37 0 obj << /S /GoTo /D (Subsection.4.1.Fitting\040models\040with\040brms.2) >> endobj 40 0 obj (Fitting models with brms) endobj 41 0 obj << /S /GoTo /D (Subsection.4.2.formula:\040Information\040on\040the\040response\040and\040predictors.2) >> endobj 44 0 obj (formula: Information on the response and predictors) endobj 45 0 obj << /S /GoTo /D (Subsection.4.3.family:\040Distribution\040of\040the\040response\040variable.2) >> endobj 48 0 obj (family: Distribution of the response variable) endobj 49 0 obj << /S /GoTo /D (Subsection.4.4.prior:\040Prior\040distributions\040of\040model\040parameters.2) >> endobj 52 0 obj (prior: Prior distributions of model parameters) endobj 53 0 obj << /S /GoTo /D (Subsection.4.5.control\040Adjusting\040the\040sampling\040behavior\040of\040Stan.2) >> endobj 56 0 obj (control Adjusting the sampling behavior of Stan) endobj 57 0 obj << /S /GoTo /D (Subsection.4.6.Analyzing\040the\040results.2) >> endobj 60 0 obj (Analyzing the results) endobj 61 0 obj << /S /GoTo /D (Subsection.4.7.Modeling\040ordinal\040data.2) >> endobj 64 0 obj (Modeling ordinal data) endobj 65 0 obj << /S /GoTo /D (Section.4.Comparison.1) >> endobj 68 0 obj (Comparison) endobj 69 0 obj << /S /GoTo /D (Section.5.Conclusion.1) >> endobj 72 0 obj (Conclusion) endobj 73 0 obj << /S /GoTo /D [74 0 R /Fit] >> endobj 132 0 obj << /Length 3697 /Filter /FlateDecode >> stream xڥrF2<ݓ$QVUI Q,Ň`@A-E`g݃`]w^\| aGab7w<"ZdQy,~nOGXaqQ?+Sۃf.I|S ?m~b,ȇeyz2hjĻǦg]w z==ָ3AռT0SYb,(œ)hVh, )4<]$Blbe"X32Ҷo#3\qaAVi XgW-N_|wsrh)/ x_[8.#A$Q/>]ǪDu`yi颬iaޒYT'RNg&FUĮw~ESMu?H, 4+Ir[:q4e_M$FUe kn P }tJ;3rCzd,/N,=\abـ4tٖ7Fp mYZN$be7X/ < # ْh{& &X% QtA:k7pv /WYxoGD \b7z6@C4^RR`QqiƁ3e&G݊ff~p|ZZ}V4*8^РޝZ+*3%1 qsx9F Z$hR-$$U&ɠ:[S%E!FH;[7$JJ: y&SߣHҨljD;ɗ!9c(zBkqVj :Ě`?TUhSAĀϚu\%lV:G:ٍZ/쿵ҁمzOL  hɩt2}K #WX9AN5a"1uE $H!g8)eNk`߮g_Yw KIN_ۦ(ğ؈ϧ-'B_ކ`=ؤ_dj,RffeZ䜛j$[`z?wdjtʾEglXnZh+2̠%;)ѼH2[0e}a\#2N?( iܩTL 0a ђ*:Pqiգ(䗝s?󐒊`t{\}K7|d~XS_T<89$U u܁*$I p*m^ z"n 8t9]L [;.O29DoF}]%y|fT9-D(Joȝm{k%bv3 Z*i_lȋV6aCDzTFrLa6l6qrܳ7V!ICvfD @Ka~'x5* [Rh7/ƙ۞}KTa" J$3VRK$j< C5 \Uiq-A< smpKN='t.r"l"˄Xr%3%+RZnOL] #@Bm$}Vpp~yӪ+{{q9WlHR|5+"}KWZHj. tj=RfY]j#9="+J1|7ں^ץ9♐9jMnYYLJ@ C>YO:4JQVL9+x)M$xrqYoA8Md,sFd"Gn)Tl1MԢg[ԉPRBUr=8%jRj#鍺07T8ѫ[5_nTKiβG7Uni5'dw)މx1ޞ=5ѹ]7#yOTJFKJ XC|:V]}Yq7 xeȄEl7DDžk-Ȯg*~ψ;L I$oYhsROb? WHǯ͞]*5:[+p(k8}ŚB5z QgP&s뫭6V3'Is?xM1HқsAك1Es*Dp3aR^JjTDn Zaq6Ɉ>|KS'1*i]F{OܲIN;lxN|;=-65:HFƉQtn?_Y-2-'#ˌ2Caz6}j8hj~%ڏf]g[ͮ\b\B2& +`(2v_~ws?N endstream endobj 74 0 obj << /Type /Page /Contents 132 0 R /Resources 131 0 R /MediaBox [0 0 595.276 841.89] /Parent 147 0 R /Annots [ 75 0 R 76 0 R 77 0 R 143 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 144 0 R 88 0 R 89 0 R 90 0 R 91 0 R 145 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 146 0 R 102 0 R ] >> endobj 75 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [151.829 466.82 189.398 478.681] /A << /S /GoTo /D (cite.brms1) >> >> endobj 76 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [190.723 466.82 212.64 478.681] /A << /S /GoTo /D (cite.brms1) >> >> endobj 77 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [468.844 352.517 522.996 365.315] /A << /S /GoTo /D (cite.brown2015) >> >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 338.968 121.585 351.766] /A << /S /GoTo /D (cite.brown2015) >> >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [123.461 338.968 147.271 351.766] /A << /S /GoTo /D (cite.brown2015) >> >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [152.169 338.968 207.299 351.766] /A << /S /GoTo /D (cite.demidenko2013) >> >> endobj 80 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [209.175 338.968 232.986 351.766] /A << /S /GoTo /D (cite.demidenko2013) >> >> endobj 81 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [237.884 338.968 319.438 351.766] /A << /S /GoTo /D (cite.gelmanMLM2006) >> >> endobj 82 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [321.315 338.968 345.125 351.766] /A << /S /GoTo /D (cite.gelmanMLM2006) >> >> endobj 83 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [350.023 338.968 444.003 351.766] /A << /S /GoTo /D (cite.pinheiro2006) >> >> endobj 84 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [445.879 338.968 469.689 351.766] /A << /S /GoTo /D (cite.pinheiro2006) >> >> endobj 85 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [369.924 298.32 436.16 311.118] /A << /S /GoTo /D (cite.Rcore2015) >> >> endobj 86 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [437.877 298.32 467.742 311.118] /A << /S /GoTo /D (cite.Rcore2015) >> >> endobj 87 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [491.43 284.771 522.996 297.569] /A << /S /GoTo /D (cite.bates2015) >> >> endobj 144 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 271.222 219.952 284.02] /A << /S /GoTo /D (cite.bates2015) >> >> endobj 88 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [221.926 271.222 245.736 284.02] /A << /S /GoTo /D (cite.bates2015) >> >> endobj 89 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [231.63 149.279 424.792 162.077] /A << /S /GoTo /D (cite.lunn2000) >> >> endobj 90 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [427.388 149.279 451.198 162.077] /A << /S /GoTo /D (cite.lunn2000) >> >> endobj 91 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [456.816 149.279 522.996 162.077] /A << /S /GoTo /D (cite.spiegelhalter2003) >> >> endobj 145 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 135.73 203.443 148.528] /A << /S /GoTo /D (cite.spiegelhalter2003) >> >> endobj 92 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [205.837 135.73 229.648 148.528] /A << /S /GoTo /D (cite.spiegelhalter2003) >> >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [297.335 135.73 489.538 148.528] /A << /S /GoTo /D (cite.spiegelhalter2007) >> >> endobj 94 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [491.931 135.73 515.742 148.528] /A << /S /GoTo /D (cite.spiegelhalter2007) >> >> endobj 95 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [117.314 122.181 163.085 134.979] /A << /S /GoTo /D (cite.plummer2013) >> >> endobj 96 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [165.972 122.181 189.782 134.979] /A << /S /GoTo /D (cite.plummer2013) >> >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [272.478 122.181 314.136 134.979] /A << /S /GoTo /D (cite.hadfield2010) >> >> endobj 98 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [317.023 122.181 340.833 134.979] /A << /S /GoTo /D (cite.hadfield2010) >> >> endobj 99 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [401.173 122.181 522.996 134.979] /A << /S /GoTo /D (cite.stan2017) >> >> endobj 100 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 109.243 109.269 120.922] /A << /S /GoTo /D (cite.stan2017) >> >> endobj 101 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [115.273 109.243 522.996 120.922] /A << /S /GoTo /D (cite.carpenter2017) >> >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 95.083 109.988 107.88] /A << /S /GoTo /D (cite.carpenter2017) >> >> endobj 102 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [112.071 95.083 135.881 107.88] /A << /S /GoTo /D (cite.carpenter2017) >> >> endobj 133 0 obj << /D [74 0 R /XYZ 80 770.89 null] >> endobj 134 0 obj << /D [74 0 R /XYZ 81 733.028 null] >> endobj 2 0 obj << /D [74 0 R /XYZ 81 393.832 null] >> endobj 142 0 obj << /D [74 0 R /XYZ 81 393.832 null] >> endobj 131 0 obj << /Font << /F40 135 0 R /F44 136 0 R /F47 137 0 R /F53 138 0 R /F8 139 0 R /F61 140 0 R /F62 141 0 R >> /ProcSet [ /PDF /Text ] >> endobj 176 0 obj << /Length 4259 /Filter /FlateDecode >> stream xڝ[m۶_qߪZ ~hI[24Ly:JZUQ뻯Hrsw$,pzJ^WWY4i],*3s@vʲ"i:g;p2;*)2\ gGp,W)ҌM MңCA͗ 3^[6gy`7 oS.6`H1r>^aˊhf&9:#-}(՝|lw'/庈rO7 B/R.j]^ g9<43n{-dрb?(~<2[,Jr_xg== `>M{ ܅mj7xRp>RCVpv͗z@kO tB![*@a&@1R{F^ j4XnN@+E ndd'׍7y8׽l6&>QˤΫ~з.V!o @ v#/Y+,*-{T~qtT .OGcq* ̓ b0G^Bjef:gpRP ߈s;"̝XIҴy a͉i_՛H?PQS9MxopG߉g_DSWX/48n{Ǽ}dA?>:APpx~^)"cޒ B1E͛ǛZQ}~G"B+E<0zޗY=qQ6lCNۊ53 ђ)[2 Bٹ4ER2o2kF.ַ@n)Ƃ\/tUUqWNm5V~LhQ-tvQ SFI8L=l1\` 9W41 |Veg ;M!\rmP! RvE# *EĸgEتToN!bs A}(S:] y-#0H̆vmH [g-hW aIVM=ybcSiR|t`RWXuvkGHf2Q.ѯ:sH -du9#ALahru;Q L5g:68B΂m)T΅4 Q v]KFV %`f~7LZ5y4X=s`a^+$Ȏ2|O-#Y:(q*O'OSQ\ dW0F]82mf yfB=t٩ɞ˶ịijHQpRrбO*ƒzfEq3-qxQSj8!I[Q 0aAC|ҥ ؍"?o)XRd[SeY`"mOX5 <2v0IFfZv#SڞM?iTJD%R1:ZshLRkƼn&HJ6VaiPd%xֵ02׉\Gފ"ȶB[E>#[98Y!_esJBD2+D4d9A جOʼ8=].(^m}1&!ȮFs(Q@B1;5G'Jt :MжR~pP)skh"!|VWO,ޑ[-}XSqsX<3Mǃ~ͱhslw>ԑdyT7~X`snOPc9`[%YvEx<z9w<>9$Iʤd; k -RJLk 2F]aF)|=901Ptf[([|"dGg<:̓FwE5<ʶ*\*E{A`fqtc29n:9VQy',=;^X*vzAOM4C`\Q-D>W`-u{M`ӯܙU;F.ҷe3~Ri\HۻK`?'RAu5:=n I 흟ڭ+˒/Xu]][b0$Qܻa9h6W\E$Gc &ࡌLlXPSepIסb)swnڝ}r\]~7ʪU5Oqp~KC:X`P4r9h7ht K9& ,->y]h2%;R4G*{Wc\?k06)8G0v\IBRd}oZYX?5&5ib=&w9Tf+e H{ʂ;1˸`n>r~ zRJx]I~߂BG9Vi쵼" b- mc2Ch)m^bݻekk<嵢gqyo+qV4V?te1Z8epOL79 z܇bʟ|Xl5 }"7پo^UDp<-3:,tBDHN}7|)ILoKwJg52y&/D/{E(w y 쵐0/2Ѝ,|ᣋU]bj[$X㌛$'yG2<#6 tɡ}yy }+d.Mڅ,kdcvԍV{Oh1/mCPԌa`U 3N[m:=j橒tDN1lm AxP OtUhu~6)Ϭ$F?A=:=E%U[&ݭ)ׅSY,a#WUf|a9 Ac8 ϦqW^UӬrݏ]cYMn+{}#BԸMy&zԶuKR]XńP.q/6 bfDʮqd~g&:-9!&+2|,zdž3ɲoo^G J endstream endobj 175 0 obj << /Type /Page /Contents 176 0 R /Resources 174 0 R /MediaBox [0 0 595.276 841.89] /Parent 147 0 R /Annots [ 103 0 R 180 0 R 104 0 R 105 0 R 106 0 R 107 0 R 181 0 R 108 0 R 109 0 R 110 0 R 111 0 R 182 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 183 0 R 167 0 R 168 0 R 169 0 R ] >> endobj 103 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [405.202 718.346 522.996 731.143] /A << /S /GoTo /D (cite.metropolis1953) >> >> endobj 180 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 704.796 228.306 717.594] /A << /S /GoTo /D (cite.metropolis1953) >> >> endobj 104 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [231.109 704.796 254.92 717.594] /A << /S /GoTo /D (cite.metropolis1953) >> >> endobj 105 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [260.744 704.796 303.733 717.594] /A << /S /GoTo /D (cite.hastings1970) >> >> endobj 106 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [306.535 704.796 330.346 717.594] /A << /S /GoTo /D (cite.hastings1970) >> >> endobj 107 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [442.828 704.796 522.996 717.594] /A << /S /GoTo /D (cite.geman1984) >> >> endobj 181 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 691.247 102.592 704.045] /A << /S /GoTo /D (cite.geman1984) >> >> endobj 108 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [104.957 691.247 128.768 704.045] /A << /S /GoTo /D (cite.geman1984) >> >> endobj 109 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [134.155 691.247 228.185 704.045] /A << /S /GoTo /D (cite.gelfand1990) >> >> endobj 110 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [230.55 691.247 254.361 704.045] /A << /S /GoTo /D (cite.gelfand1990) >> >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [481.197 691.247 522.996 704.045] /A << /S /GoTo /D (cite.damien1999) >> >> endobj 182 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 677.698 190.991 690.496] /A << /S /GoTo /D (cite.damien1999) >> >> endobj 112 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [193.423 677.698 217.234 690.496] /A << /S /GoTo /D (cite.damien1999) >> >> endobj 113 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [222.687 677.698 246.182 690.496] /A << /S /GoTo /D (cite.neal2003) >> >> endobj 114 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [248.614 677.698 272.424 690.496] /A << /S /GoTo /D (cite.neal2003) >> >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [499.502 664.149 522.996 676.947] /A << /S /GoTo /D (cite.neal2011) >> >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 650.6 103.814 663.398] /A << /S /GoTo /D (cite.neal2011) >> >> endobj 117 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [109.59 650.6 216.245 663.398] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 118 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [218.998 650.6 242.809 663.398] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [248.584 650.6 418.398 663.398] /A << /S /GoTo /D (cite.gelman2014) >> >> endobj 120 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [421.152 650.6 444.963 663.398] /A << /S /GoTo /D (cite.gelman2014) >> >> endobj 121 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [159.304 623.501 225.537 636.299] /A << /S /GoTo /D (cite.gelman2014) >> >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [226.851 623.501 250.662 636.299] /A << /S /GoTo /D (cite.gelman2014) >> >> endobj 123 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [84.236 596.403 281.18 609.201] /A << /S /GoTo /D (cite.duane1987) >> >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [282.322 596.403 306.132 609.201] /A << /S /GoTo /D (cite.duane1987) >> >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [310.296 596.403 333.79 609.201] /A << /S /GoTo /D (cite.neal2011) >> >> endobj 126 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [334.932 596.403 358.743 609.201] /A << /S /GoTo /D (cite.neal2011) >> >> endobj 127 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [167.423 582.854 270.233 595.652] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 128 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [271.064 582.854 294.875 595.652] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 129 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [84.236 555.755 188.664 568.553] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 130 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [190.304 555.755 214.115 568.553] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 162 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [287.032 525.42 407.213 538.218] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 163 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [409.279 525.42 439.144 538.218] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 164 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [444.445 525.42 522.996 538.218] /A << /S /GoTo /D (cite.carpenter2017) >> >> endobj 165 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 511.87 103.814 524.668] /A << /S /GoTo /D (cite.carpenter2017) >> >> endobj 166 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [443.487 373.141 522.996 385.939] /A << /S /GoTo /D (cite.mcgilchrist1991) >> >> endobj 183 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 359.592 117.155 372.39] /A << /S /GoTo /D (cite.mcgilchrist1991) >> >> endobj 167 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [119.346 359.592 143.157 372.39] /A << /S /GoTo /D (cite.mcgilchrist1991) >> >> endobj 168 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [322.403 359.592 428.269 372.39] /A << /S /GoTo /D (cite.ezzet1991) >> >> endobj 169 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [430.46 359.592 454.271 372.39] /A << /S /GoTo /D (cite.ezzet1991) >> >> endobj 177 0 obj << /D [175 0 R /XYZ 80 770.89 null] >> endobj 6 0 obj << /D [175 0 R /XYZ 81 309.712 null] >> endobj 184 0 obj << /D [175 0 R /XYZ 81 309.712 null] >> endobj 174 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F62 141 0 R /F40 135 0 R /F61 140 0 R /F44 136 0 R /F23 185 0 R /F24 186 0 R /F26 187 0 R /F21 188 0 R /F53 138 0 R >> /ProcSet [ /PDF /Text ] >> endobj 213 0 obj << /Length 3631 /Filter /FlateDecode >> stream xZIWvmAr(A@zȞZ&-ɗ&3T!]j{^;~D}դmYT%I^(d朞lY4Ug^t3Ž==bCx]8u2/.]i^橊4☝xuȏEn:SeU])6!YLMWTOwDۭ{=x L~GԽ{ز&c9LomKBCVv˶P-J>) 3ԗ9h ۸$3uPᡜ3tvM&tVFx†tmƫvzaz S`t]724Ui(KP77Ka=pÒOdKuF-ci t;fលg+b)!Z@sq=sJz݈^|+]?~-M5+=LDoص*ՓQ:4ƬF}m8*)mqd{vp( of{wb-Ql^\X\0J K3c)lآRT8=L3=<9yw 5NZy`O.<ಗcO]6J;g/v:St&%@L3 dqP6s/' ghbgFi^) CE]鱖LJQ~Uzf :&}DpnFP}G^%7xȰ)yc?C*+J ;@{-HZfw5C!>F.n 5~el`M˺\5Sx+xG;o_(Avޯn932'~Ё9x眷1k]Q6OM8+OAH:f1T)7Q$GT/Kiz0.βLYԬ7[09{`=AqOMc9}9B\U~i#(V¨ǘܹ!aN7KูN\Bt%Յ(G0e ڲe{X44# 5[py6gÁ:8"&d0Ì!&6X Yj\GtuQUrzаB[s9Q|Rhm' 1"ȩ8hӆ;&]Zw.HBD ~`zB^Ҝ!'D^滥&roѻW!ť>C:p}h{ۚ_:&ʍ#R#FE^~2#&Nθ;I iW-{YAֽO%NmC-ZSRh\Hw}`"5E+?ID -d!Sf\n*Pj͸Xd\N2Ve5Cigi*®s pE+,}:9\2sAM(D>rWp<c+ӎBfb+1VLs#%w6!*Ul&6G /ܛ=>,Il)c> `4m9Ebcc^-ٸUac_9&UWm(M0$·)Pp91SahCDeJc1Y9 @Νn&5NE5&/fwY)4DX/Jbq3Y Nym\E{n% hXVҧ\)*QE|w&5[i Un?eCΕUrYSTT!+܇Qy}DҔE"1p'@BBE;LGNBT@bfN;`N?Е_U! z&,8*\$(w ,jy. MӤCPyY 2cG~Y>ח3#RI^[KW{bJF~{ ]AR7lޠ$RGG3i\`H@D"YȆES۴E\Qqo?.u0Ϭ暘᭷>^[֍aϞۣ2EwR1Χ{W"̗9npYT)pNy d}%,-l z5C>z'β,@U.dhiw$<7I{ǥ0DuZS.'h\)O XDj҉}y' qg?7+.zaPzwVMJ&2qr5D(XCd 12F2XA/F{eNdE7 {C8t{ ̠.~B9I'] +[aK&~q3#ڑe`"(K"rSڒ&\pH&oiQJ2ouudz+e=C$4dͷ?u{;}($'+}BpmyŭҘE+{&j9!Iс[[BJtdK>)|p҄Nu\}^őN T(5 2*STZ_ל)T-t:9fcq>klKRP\+@6-\5օR鷽Bj; I[NqUܢ%6'{/‚}4~trߔuKRy(m`$,N#s\.tX5#<! /NY 0Wp]Sm&^@|FڨGfC/,w endstream endobj 212 0 obj << /Type /Page /Contents 213 0 R /Resources 211 0 R /MediaBox [0 0 595.276 841.89] /Parent 147 0 R /Annots [ 170 0 R 171 0 R 172 0 R 173 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R ] >> endobj 170 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [404.325 691.247 485.842 704.045] /A << /S /GoTo /D (cite.gelmanMLM2006) >> >> endobj 171 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [491.931 691.247 515.742 704.045] /A << /S /GoTo /D (cite.gelmanMLM2006) >> >> endobj 172 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [330.396 623.501 417.707 636.299] /A << /S /GoTo /D (cite.fox2011) >> >> endobj 173 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [422.369 623.501 446.18 636.299] /A << /S /GoTo /D (cite.fox2011) >> >> endobj 202 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [231.524 170.565 301.767 183.363] /A << /S /GoTo /D (cite.gelman2014) >> >> endobj 203 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [305.169 170.565 328.98 183.363] /A << /S /GoTo /D (cite.gelman2014) >> >> endobj 204 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [244.522 157.016 341.364 169.814] /A << /S /GoTo /D (cite.natarajan2000) >> >> endobj 205 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [342.511 157.016 366.321 169.814] /A << /S /GoTo /D (cite.natarajan2000) >> >> endobj 206 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [370.49 157.016 467.331 169.814] /A << /S /GoTo /D (cite.kass2006) >> >> endobj 207 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [468.478 157.016 492.288 169.814] /A << /S /GoTo /D (cite.kass2006) >> >> endobj 214 0 obj << /D [212 0 R /XYZ 80 770.89 null] >> endobj 10 0 obj << /D [212 0 R /XYZ 81 567.881 null] >> endobj 215 0 obj << /D [212 0 R /XYZ 81 567.881 null] >> endobj 14 0 obj << /D [212 0 R /XYZ 81 538.766 null] >> endobj 216 0 obj << /D [212 0 R /XYZ 81 538.766 null] >> endobj 18 0 obj << /D [212 0 R /XYZ 81 421.093 null] >> endobj 218 0 obj << /D [212 0 R /XYZ 81 421.093 null] >> endobj 211 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F23 185 0 R /F44 136 0 R /F94 217 0 R /F40 135 0 R /F53 138 0 R /F26 187 0 R /F78 219 0 R /F24 186 0 R /F62 141 0 R >> /ProcSet [ /PDF /Text ] >> endobj 248 0 obj << /Length 4098 /Filter /FlateDecode >> stream xڵ[Ys~ׯ%9pʖ]Dr`"!$!kN\+39gMlꋻ|UMT̩äR2/Sg|sbhtLT:aVm:&.lL4W멵&eZWI+WoƘ{x>^:hHsC?>#~ n谸Lv~&N&O>-qtZ;MR`lKaTLB_(|Phf~9*d|~_5,iOÉMe1a0-U 4}՘Mh=N|kv<+t =5{{ZBՙMy3"Ѭ%UdF?E?R6#;ORbjwɅ%f1ߐ)]rq'.T<e('rUF-#9}[ ͑ad~Kk0s,Xr4=~ vB'4`|RlΒVҖ=(Zf1,0 u#0$  J`zD]'R؇3& Qm{n=<}m{jN "t;el#޼uPf'nj9tSI9T wM'% E+}\sɊ?]"ĚˠDÊ˿GgU~I'+afG?3lACި+teuv07JQPqIb[p޾O+R|u_th#aUV8 yw@,%$C0,ZЉiNgQ ]k@lG4Wא3כ<$6gθ!ɹL0GB"LjfZr3'7w{#k`EnxV^WFz2wq.4!\ ĩ<հɇUWH٭ QJnNb .y F#(?(Z8#V8@h# `r/Z94f^Fd6(8 suA:F1B @$X 6 /a`*=tRBM]tqRAN?7CImb1 W(f*7Ze5U5ȸF`VqUe?lJ2a%y*/Jo~#GY<|R\ڧ-JQ2Xf!;UG'iުr4qmⷽVEò7h 8<|-z8 _{<bGGcG$QWL(X^ҝ|f:s̕ZI47,ڌ\rW`JY1;WQ[*wtHߢ2ϠF_׊u4hNr:;v PPi+Qi8w>>҅tU6zK.yMsU&Ach⸵^Kr]}8zFL\K؅H^^j!6%buף/lfcE>+:$-XSIߟJmhuP%¾fxbwN*bZ65 ̪4T2Rq0"sP3 Ԕ'0/.#YOK##XveE*:SwG &{nt? вf59He9> endobj 208 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [228.001 691.247 393.607 704.995] /A << /S /GoTo /D (cite.lewandowski2009) >> >> endobj 209 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [399.479 691.247 423.29 704.995] /A << /S /GoTo /D (cite.lewandowski2009) >> >> endobj 210 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [425.53 691.247 432.253 704.995] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 223 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [144.091 614.638 264.331 627.436] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [266.426 614.638 296.292 627.436] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 225 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [248.054 309.842 329.87 322.64] /A << /S /GoTo /D (cite.juarez2010) >> >> endobj 226 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [336.213 309.842 360.024 322.64] /A << /S /GoTo /D (cite.juarez2010) >> >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [147.935 180.318 171.429 193.116] /A << /S /GoTo /D (cite.neal2011) >> >> endobj 228 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [173.146 180.318 196.957 193.116] /A << /S /GoTo /D (cite.neal2011) >> >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [201.696 180.318 225.507 193.116] /A << /S /GoTo /D (cite.neal2003) >> >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [230.246 180.318 290.968 193.116] /A << /S /GoTo /D (cite.duane1987) >> >> endobj 231 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [292.685 180.318 316.496 193.116] /A << /S /GoTo /D (cite.duane1987) >> >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [139.884 166.769 246.659 179.567] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [253.705 166.769 277.516 179.567] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 234 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [134.422 139.67 239.864 152.468] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [242.011 139.67 265.822 152.468] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [270.991 139.67 305.099 152.468] /A << /S /GoTo /D (cite.Creutz1988) >> >> endobj 237 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [307.246 139.67 331.057 152.468] /A << /S /GoTo /D (cite.Creutz1988) >> >> endobj 249 0 obj << /D [247 0 R /XYZ 80 770.89 null] >> endobj 22 0 obj << /D [247 0 R /XYZ 81 430.552 null] >> endobj 250 0 obj << /D [247 0 R /XYZ 81 430.552 null] >> endobj 26 0 obj << /D [247 0 R /XYZ 81 261.885 null] >> endobj 251 0 obj << /D [247 0 R /XYZ 81 261.885 null] >> endobj 253 0 obj << /D [247 0 R /XYZ 97.575 120.724 null] >> endobj 246 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F53 138 0 R /F23 185 0 R /F24 186 0 R /F78 219 0 R /F21 188 0 R /F26 187 0 R /F40 135 0 R /F94 217 0 R /F44 136 0 R /F62 141 0 R /F22 252 0 R /F88 254 0 R >> /ProcSet [ /PDF /Text ] >> endobj 289 0 obj << /Length 4658 /Filter /FlateDecode >> stream xڭ[s㸑BF4A_ٛٹM6k_M.EK"J3_O MՖw@ݍ_wC~N>էMLim&7wˤf9u,i=3G(f;[kz_$)'4qOꇎ'[k8Sc<)rx_qʻT̝3͓(ŠRr } >,x|ƶHKKdoL-KB__3߈qG!wfcڈ(xoo/-OogiZ9+fx[Xtv:]uɗVɵ7ٲC* K'sc=һ́S (.ᣙ!NjJ8qu Į Mfs$&U+$'h6"[v4nlc(k 4XKORF}r } %L=<,UsǽB3x: }bl@&FVb#KD[e8EVk\َ$ G:]&ԏ|Ù$?1wN,䐝7>CDlUЛ]GʲHWWd$Tcqͬ<7 4}M+sڬߢvɍՙ^;gu[OS Bev-̙,vv$ $4hc6wYn[Uxҡ:՛q7Wǁ#4jYIN6ؤK #k=f2V_|{Lv]dGc1pxJW!, aIGVKWdӔ)0E#T+6  :gw]g?lF9;w8tDq_Q ur: B`SXˎך1o! D,,]>(xOWQܥ.+AM)`[Ng gcsTˍNkɺ:U?5 >Ciq=] 8CTrAC  (]cxS^"p|dQhA)(P؀mڎ0]!GU[&:Dnu&×_lvjZ I%+_<4R,G~̔WY:B[K@6^l+@he;IkY#3:ϒ#Q{+?ac@eh2dyB>QGޣrP eh^2u }Ӧ$dX ]ui,j09O܊=]F7͟=wy g\Bk1/$`^۽M8==J%>4~6.$Òx[:\KYV Dȟ86^/c+ O9kp ҧ(hMq31WyVʬ<" gt{%KdN%W$&$ĀC@j{~0ȜϽdIq0Hѡ`G>kjfd4_%L#y?K ]q0pRHx~ #NG3UiL.8XLvOStڐ\~ >>j]jj"*$b|*IL o#:O vpN`wݟ]b8ŧJB,L7V=E]RܓYzЬ?r{>_IaY/imQ?P! K,/4V((~!hN@?R,aA\cb|?`,Qxd(I>|(b0H2 `$ <tqю kKs#J^ZpIZWQf.J3SrL0k{%6*}cgiS&uuK#{q[CՂG.Bx@8SB/EY}ėvguN Nv#Mu3Q$ n8 ${j"y/sq6`SaD6Y&U/s)B.71.hĤ.,VKtKNwg];!6UdEN&3^e]tH YN%'8|ޝD'A:$QCF*.MļbSTM9O&܄;>yų mI =.P pz!^qEq)c|uQ iWʠfoPP+Wx JŠ% [6zG~AtK q/р7d0rl¥,tEzY?M[CnC>q?׀b1bvnWH~-D螁6߰[y`0Uap."|˧زqhSTr!v[ ;~iw\wv$רt7t$̓$&/ w.B: FzaiVHޝ4Y,y fvJ=j*#ZElR5!P8d(:?6=Xa%FCP~e/4ﵜӼYϒJA\}[TBf|ڞLLϛwgšIϲbؼd }(fm&5zrk,䀬˂|M\.IqJmߟVJpW>듰~R.LO”#Zz3FHLk\qp}5#>':Ҥ2Tjfc?TIr> g(|4"!n֣ l+6ƼdyimP9n'E@ ޿ΰ֪"m[m50 6YRZ3(lHF)p&`< endstream endobj 288 0 obj << /Type /Page /Contents 289 0 R /Resources 287 0 R /MediaBox [0 0 595.276 841.89] /Parent 147 0 R /Annots [ 238 0 R 239 0 R 240 0 R 291 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 292 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 293 0 R 273 0 R 274 0 R 294 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 298 0 R 282 0 R 283 0 R 299 0 R 284 0 R ] >> endobj 238 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [241.159 718.346 352.08 731.143] /A << /S /GoTo /D (cite.griewank2008) >> >> endobj 239 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [353.923 718.346 377.733 731.143] /A << /S /GoTo /D (cite.griewank2008) >> >> endobj 240 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [480.411 650.6 522.996 663.398] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 291 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 637.05 139.688 649.848] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 241 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [140.809 637.05 164.619 649.848] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 242 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [153.115 623.501 272.445 636.299] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 243 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [274.085 623.501 303.95 636.299] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 244 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [358.695 623.501 463.123 636.299] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 245 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [468.996 623.501 492.806 636.299] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 258 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [438.668 552.515 488.801 565.313] /A << /S /GoTo /D (cite.watanabe2010) >> >> endobj 259 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [494.953 552.515 518.764 565.313] /A << /S /GoTo /D (cite.watanabe2010) >> >> endobj 260 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [282.048 538.966 406.974 551.764] /A << /S /GoTo /D (cite.gelfand1992) >> >> endobj 261 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [409.247 538.966 433.057 551.764] /A << /S /GoTo /D (cite.gelfand1992) >> >> endobj 262 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [438.668 538.966 522.996 551.764] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 292 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 525.417 134.126 538.215] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 263 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [136.624 525.417 160.435 538.215] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 264 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [207.578 525.417 243.236 538.215] /A << /S /GoTo /D (cite.ionides2008) >> >> endobj 265 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [245.734 525.417 269.544 538.215] /A << /S /GoTo /D (cite.ionides2008) >> >> endobj 266 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [249.993 484.769 315.846 497.567] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 267 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [318.087 484.769 341.898 497.567] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 268 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [347.462 484.769 393.232 497.567] /A << /S /GoTo /D (cite.plummer2008) >> >> endobj 269 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [395.473 484.769 419.284 497.567] /A << /S /GoTo /D (cite.plummer2008) >> >> endobj 270 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [424.848 484.769 493.922 497.567] /A << /S /GoTo /D (cite.vanderlinde2005) >> >> endobj 271 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [496.164 484.769 519.975 497.567] /A << /S /GoTo /D (cite.vanderlinde2005) >> >> endobj 272 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [390.99 471.831 522.996 483.511] /A << /S /GoTo /D (cite.spiegelhalter2002) >> >> endobj 293 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 457.671 173.571 470.469] /A << /S /GoTo /D (cite.spiegelhalter2002) >> >> endobj 273 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [175.246 457.671 199.056 470.469] /A << /S /GoTo /D (cite.spiegelhalter2002) >> >> endobj 274 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [483.128 444.122 522.996 456.92] /A << /S /GoTo /D (cite.loo2016) >> >> endobj 294 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 430.573 176.937 443.371] /A << /S /GoTo /D (cite.loo2016) >> >> endobj 275 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [178.577 430.573 202.388 443.371] /A << /S /GoTo /D (cite.loo2016) >> >> endobj 276 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [394.007 430.573 458.704 443.371] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 277 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [464.577 430.573 488.388 443.371] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 278 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [455.207 277.887 522.996 290.685] /A << /S /GoTo /D (cite.Rtools2015) >> >> endobj 279 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 264.337 109.269 278.085] /A << /S /GoTo /D (cite.Rtools2015) >> >> endobj 280 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [319.434 264.337 326.156 278.085] /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 281 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [503.135 264.337 522.996 278.085] /A << /S /GoTo /D (cite.Xcode2015) >> >> endobj 298 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 250.788 118.873 263.586] /A << /S /GoTo /D (cite.Xcode2015) >> >> endobj 282 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [121.98 250.788 145.791 263.586] /A << /S /GoTo /D (cite.Xcode2015) >> >> endobj 283 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [297.568 196.897 522.996 208.882] /Subtype/Link/A<> >> endobj 299 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [80.004 183.348 203.036 194.427] /Subtype/Link/A<> >> endobj 284 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [512.527 166.864 519.975 178.544] /A << /S /GoTo /D (figure.1) >> >> endobj 290 0 obj << /D [288 0 R /XYZ 80 770.89 null] >> endobj 30 0 obj << /D [288 0 R /XYZ 81 407.18 null] >> endobj 295 0 obj << /D [288 0 R /XYZ 81 407.18 null] >> endobj 300 0 obj << /D [288 0 R /XYZ 97.575 120.724 null] >> endobj 287 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F40 135 0 R /F23 185 0 R /F62 141 0 R /F44 136 0 R /F108 296 0 R /F61 140 0 R /F109 297 0 R /F21 188 0 R /F22 252 0 R /F88 254 0 R /F110 301 0 R /F116 302 0 R >> /ProcSet [ /PDF /Text ] >> endobj 320 0 obj << /Length 2075 /Filter /FlateDecode >> stream xڕXYD~_䈍$$y<g&l8e=uag]VZVyݭj*ol_?oi]1h:;_?2qRbS7vmY7§{k덵6 "ܽ%"`q{H0W|ďk];wDl[mlePd G9nuy(Qޔdy d+u!Z _|N>죮nd;*fk]yfmrb.՞@{@c"G/x*\X!Wڼp 3>a'\ vDz#yAkmZo (kpJ8v^6w-D:ܞ/80WbI0̋JwUa=]? &7M}Tn/{ N!BIԂ@.WMWx?ʹdWvl^p[N :irBHc' v-ߎnW3A%Oy'llM<6llnRB+Dc&lLPNAP#Jᾣ<>aU(|C-=) GƵG;P$qμG ^X;<ˉ@F9Nt"{jG)MkJѹ"Qk5` 4Rtz.JL buƺɏY)N&i 4 ="]|m?)Ƅ#RVDZ~KLkL(aXٚ\+`&v䣤c/ʕ.bz-/s&@~4 x Íic_Λf]}?xI" Ah`:mDTЎ/[w>&^O.ޱS^T*K׋^ڋUHshUP#-E=ooo4uhZhXjoѹR.$yMR>׫o_I6&aDCd]Րy|O;_C~!&^10B S`|!]XΑʾ9r߬A}0wHRWt$ dXy7BJ?m2k+XÒeиMNhP %tE=7DNMÙ$( [s<*q ٘aa WaX_YOW^# >]?ur#Fȳg{a/^l/1h >$tg'M m߭OM`8ƂBne2IIf%_t42NW)tz#oWf0T7:1N)5H Nj&')9?'q}_'Nռxj- `P !G10i a_xSo-a:7)vI 4Kt&ZՀ OmKYz j^3vnj6L;7bdfgفDvsvP]~^:&gYvveܓZʿ< endstream endobj 319 0 obj << /Type /Page /Contents 320 0 R /Resources 318 0 R /MediaBox [0 0 595.276 841.89] /Parent 147 0 R /Annots [ 285 0 R 286 0 R 316 0 R 317 0 R ] >> endobj 315 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./flowchart.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 323 0 R /BBox [0 0 157.276 252.712] /Resources << /ColorSpace << /pgfprgb [/Pattern/DeviceRGB] >>/Pattern << >>/ExtGState << >>/Font << /F8 326 0 R /F15 329 0 R /F16 332 0 R /F17 335 0 R >> /ProcSet [ /PDF /Text ] >> /Length 1630 /Filter /FlateDecode >> stream xKs68ʓqMLfzp[#1R=N~ "!yޚR^ {DyO(+nS6w67\̭'rr J'u.iT!*Jt@f06TpD9ZK[iDlP(K9 iyCId7+Tr#.b|xe`2,֯GXXfaI[WA71j9=qPư[;, &`rEwM9_?}Ƕ~T~r84̬4)O9;~=;g}P Sei̗٬~plAY)1uMmHK40^@ Hrb\ aϊ@r "KD^RcTy D5,wH5$EDAl A!0d հ1ub6$߈eP eanʎVCwX2J9>}&h j(x-en?zc{ALvV>{} s\Q/PCR,4N0UhM`gBfq03( MTSM9dmzn2/\b3lFf3 h>86F96Ćp3ǦoDw7Vp37ZP}g%-=NC1% xj0 _7߯r:nwOv&*–D{:tlL(Yrggǖ \I/r|+Jp=>˕hKsRؙ:KK$=o#DSS sb(L Z1?фaF)M8;yv: rm_dRR!rScF8l"(kFQע![z5$X'Ì9ù=vXpA\6GWM(L^{D@NX96nmP1 #zgwr >^TS]`N %[sJ6ByTpҖ9 vx9D1 ߓV(%\*ʵj~a!rSUѱW*{aR0q0h&w*hPrj@7!SKjZ|avsFbMy\{> endobj 326 0 obj << /Type /Font /Subtype /Type1 /FirstChar 12 /LastChar 119 /Widths 336 0 R /FontDescriptor 324 0 R /BaseFont 337 0 R /Encoding 325 0 R >> endobj 329 0 obj << /Type /Font /Subtype /Type1 /FirstChar 97 /LastChar 116 /Widths 338 0 R /FontDescriptor 327 0 R /BaseFont 339 0 R /Encoding 328 0 R >> endobj 332 0 obj << /Type /Font /Subtype /Type1 /FirstChar 83 /LastChar 116 /Widths 340 0 R /FontDescriptor 330 0 R /BaseFont 341 0 R /Encoding 331 0 R >> endobj 335 0 obj << /Type /Font /Subtype /Type1 /FirstChar 43 /LastChar 82 /Widths 342 0 R /FontDescriptor 333 0 R /BaseFont 343 0 R /Encoding 334 0 R >> endobj 336 0 obj [ 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2] endobj 338 0 obj [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 340 0 obj [ 555.6 694.4 769.4 755.6 1033.3 755.6 755.6 611.1 280 544.4 280 500 277.8 277.8 486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4 390.3] endobj 342 0 obj [ 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 319.4 777.8 472.2 472.2 666.7 666.7 666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8] endobj 334 0 obj << /Type /Encoding /Differences [43/plus 67/C 82/R] >> endobj 331 0 obj << /Type /Encoding /Differences [83/S 97/a/b 109/m/n 114/r/s/t] >> endobj 328 0 obj << /Type /Encoding /Differences [97/a/b/c/d/e 107/k 109/m/n/o 114/r/s/t] >> endobj 325 0 obj << /Type /Encoding /Differences [12/fi 44/comma/hyphen 77/M 82/R 84/T 97/a/b/c/d/e/f/g/h/i/j 108/l/m/n/o/p 114/r/s/t/u/v/w] >> endobj 285 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [358.487 664.149 480.277 676.947] /A << /S /GoTo /D (cite.stan2017) >> >> endobj 286 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [486.477 664.149 515.742 676.947] /A << /S /GoTo /D (cite.stan2017) >> >> endobj 316 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [228.58 231.362 347.705 244.16] /A << /S /GoTo /D (cite.mcgilchrist1991) >> >> endobj 317 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [354.223 231.362 378.034 244.16] /A << /S /GoTo /D (cite.mcgilchrist1991) >> >> endobj 321 0 obj << /D [319 0 R /XYZ 80 770.89 null] >> endobj 314 0 obj << /D [319 0 R /XYZ 166.099 321.694 null] >> endobj 34 0 obj << /D [319 0 R /XYZ 81 283.685 null] >> endobj 322 0 obj << /D [319 0 R /XYZ 81 283.685 null] >> endobj 318 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F40 135 0 R /F61 140 0 R /F108 296 0 R /F44 136 0 R /F109 297 0 R >> /XObject << /Im1 315 0 R >> /ProcSet [ /PDF /Text ] >> endobj 350 0 obj << /Length 4020 /Filter /FlateDecode >> stream xڝ[Y~_'M2-uɋ A}M{=Hz$) {v0vZ")XWEmf7_ܽ]fȻ3̺*w5Uwe5[ξ~c۬nL6ܟ gy7,/n~ˬ55l^G`j/9 }1]|48M!Ιټyn2땾=ҼyM1ٕyeĺ}?mk;raE; 2'~_3ZfKn2aV6=k3N)^D!|H2_m忦?ˇC l$A~xɁƕe^.Hls r_i{'4쇢*5eZISBό<~-nԹW-n[+_nԜu\W=z5GBUR27ƍA[_lAضCд 0yvj*K64ISv]nj?񌏕n[c 㐖! F%.lZ-C;`{W]4F.KwI&7{7~ /mzxu??_i xic(f~Hp^d˸N΋8&*ȃ[WU;+ae# :[v<Eq=Pt:xnMނ?S%ZsPMQ~~=y]W jyRˍ5Yuꕋ,Ѳ5yU/ȋd4qn/&{@jб=a:9lġ.GW@bұ:V (m:BZN s[C膥!UF`;qqVz-9hY=YnE:F4d"qB&tQ^N*,$0Vw/T*ZV I :x{td=7~de0:1}?G;fn!+.t.5>iRZʆX"1ïDA"s :o |yg;(G1K#1HWVuAO9M[1Hлʖٟ0oM*:B{]şg ^7"kemL czJn?P36e^&D1>DK]|aM vL˫/dk)cāYIGo?NRA _x}uQoþn sS~' Y"" Do?"I5. ShT  #b)F?ʴxMoԬiLlK=t#_uwj'y=3-u%^׋@T8K!~4􂂃ɺOAS9a1.i"vD߀o*|N,lR_#xH%FI;@ڹζyxŸ[%.blEb8ĹA_Λ)m.t4BJs=mg%@HrP{i_RĚ"5Ս~M?p6ZPhzZJ CQV`umbPqzUeɣZ˵y[W%6~#@rF!; cNt 2)Q&~kp$ e{xѵךg_ΜMRBKL-0a!6aqY RPGA/;u:_v-RdKb|`aEFwTlyO&\XBFtxrY5Wܴ}GOD\!Eg-uK/UBMnC`Ylɣ /i_¥%֎4^j=+qЇTZǩiEʡY]C2R^/ˊ$K;֤k: JЦB/F+RV:Auh* >).H=v(R*=R^:1q]b[Lz8-Q.+r3>J`\aXTPxk @ć[.%A.yIl/D3 N[~N;) *+syF NRX^-ބTLCi"]V9Q~.oPp7nmTKz@rRS Q࿼R ?7<AMjUMf%xRL0oQjq46}\&k. ߷IRz-L  Rn|$妭x0I~hR[O!_Mi: 9v|"ϮR. M9@gk)2Ptd A 8'Sdp5UVวPbp@h8 Q天q;W0lY;- tX&N]6(U[A'Gu9 ֜6Ti)ae ;eFc $G_8&Ąt34&k]C;"ڼjmj`tBg'~/B=>Dgo1K=]!@ֆj:tѕ۠#誀/x (&_6z֋ĕ bF+'Sn#v)C%hUM 1hٗ~-iWwo~~c(3~- ؿbv``^vFgnݛTܯ%szy,)-D4߲l+԰Ep{ }"2ɛmD? ¤UF]`m&k'e|BAm;#\KC:O~t+L!yR9NNQxF}o-@_Lr|}H/,{2Γs.Q5#im^"ZE(VÀj8ES{upbXD΄8|-j:.SZvr]a~@̌ Sscxo2. x endstream endobj 349 0 obj << /Type /Page /Contents 350 0 R /Resources 348 0 R /MediaBox [0 0 595.276 841.89] /Parent 356 0 R /Annots [ 344 0 R ] >> endobj 344 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [353.575 266.644 360.298 279.781] /A << /S /GoTo /D (Hfootnote.3) >> >> endobj 351 0 obj << /D [349 0 R /XYZ 80 770.89 null] >> endobj 38 0 obj << /D [349 0 R /XYZ 81 665.447 null] >> endobj 352 0 obj << /D [349 0 R /XYZ 81 665.447 null] >> endobj 42 0 obj << /D [349 0 R /XYZ 81 440.866 null] >> endobj 353 0 obj << /D [349 0 R /XYZ 81 440.866 null] >> endobj 355 0 obj << /D [349 0 R /XYZ 97.575 120.724 null] >> endobj 348 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F108 296 0 R /F44 136 0 R /F40 135 0 R /F109 297 0 R /F121 354 0 R /F26 187 0 R /F21 188 0 R /F22 252 0 R /F88 254 0 R /F110 301 0 R >> /ProcSet [ /PDF /Text ] >> endobj 367 0 obj << /Length 4708 /Filter /FlateDecode >> stream x[oȕ0MaUdl&,6m0lv{0|UE$[<|;Xֳrw_߾*ln֨Ym5vv}7onz_FE5 Am>ިv7vUXׅUnUe_w7?fufa I^un& w`ΏxgN<:,]);m{*ST--xKZuÅvoF'^G\1?sG:\̖.S`ߗKf;ޮf\ėk9lTx?)Z[dx&rjN_N𯰳#/?.i ])ZX5"WEmu+W>[\}Fz~'t#2۬y|8q[& qp𦰕NG,dD&hi2JZȈyt=6!YNuGb%`a[:c:.eڝ^ Ϗ>ɑa$"Cz 4- KeNOK{]'_p݃IHD:E2+kc*LvPu폴#2Z v+-O gm1W F{EEF] ]ײ(UYp 4yeBaji-\@?|"' tҮh0&. Oyj\[cAIeI,2\i["3D/>n(sa y]Ñ׏^tqv/ވݖI zߥĦGe)mC Lŀ|H\Ε!u]Q欍HW4uyIWN74fˌ8Wp}ƛ MI[Xɞ4.\YHZda)mbX|-n' i hAVDfOjKb rp ƙ^v,k7SQW kxb`П7-\y4ӽG@Ҍ5&CmRakmsRXUTU}/V&dLKm;Ek ' ;LM^ȗ@ 3;t9:~uqh'9oeItfUe&.OsL{h46JKM3xOfK ԄFxU5xW;dD.iuK849}ro1mIuZ~cb4-HI*'Y˷ER Mϸb ިUb&ѕ5)yݏɜq#r/ ڔG )J5ͼ~Ngq߳&4`xeepl 70e`gt<hؘ,cH?LOҏU/jפُM {V5(JaY%gh(\Fq?>t7^:Dc,HN}[~@1gu))0m[=7o8Sfݼ=}b.Sl.u2q^ºD!}5&H4F+xM# ri4'}M4(; ´LxT{$n.³JeǙkny-Ga~g+B%jAhniѕI.8щ<0i-hpa_+ 0. G^呛BVI>.! C-~p) 1[_R/z}p-7[<]K-އ[x+/fL!*RD٢%- bu\478- M)ß$fD͘ Av2cTr0`0B*ek^\/-UY#DտDBdX6"ѾȤ~5=r%gXO阆tfۜ'* PGm@B44"_ eCy)~24-i_JG*|&5Ch!Zq(/I&dǑ,.lRsld_ӗY9'a!4!~μz7'{Ԇ|];rJ_m}j/l8I{n+A'^$" 0ULา[EC&Sxg$ FUiq%ǓtF ی5Կ] @Mk 8!rhDDAy{ 9hй]'L/PI(nd܈Eqfe9pQ*Ʋ)C2╃{|/Lxy~Z5g9 F'4}jZVՇWEp87q^YV-"z~⽸>xG.b*NHW(} #Z3<*ģpi硄|5_6*.jH'PU)s{1qˑ|-4w-g+xT+ 'j=*û6YjGƐ?ڒ|Xڵ5E\^0r߲C\ ډ O1GZɈ)l"MM¥*09SZBjb]g|xvepU\i e%zNw} tH]Jpe8 ͐YT_LRi #Ķ.~,j2~̱ 6p @b-FiX.oŠ4NSXy`J";PכuX֗< H{|{v8g~~oi_ YrS ]x-ʏW"`-2v8p-so}e >aIh << E<~ۥpCi.l *ʾJb_=!HKup5>S6SiZ_YP9yFXyBEڅp t唚\:ф[32Aߪ_T >h+J0$z>AKT}S<ݏ^*9&}*K(hVKy49p+>v ]@Зiƥ)pIL/_@C1~U8ᣐ7^ -8SM#rX#HMiWZ h ;Q/C1`)Z#Jޗ0_$ ;3󌌅 m^?*?'(=4L9K-&p}RmˬO^k+NeÙƇYMVň%V~Ȝ>ڴl3Pk#ҔW&Ā>.K a IȕVYKȴ.TQO2*g{!~S\ l[fKY{?׫thQ>cF/xE endstream endobj 366 0 obj << /Type /Page /Contents 367 0 R /Resources 365 0 R /MediaBox [0 0 595.276 841.89] /Parent 356 0 R /Annots [ 345 0 R 357 0 R 358 0 R 359 0 R 360 0 R 346 0 R 372 0 R 347 0 R ] >> endobj 345 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [359.26 718.651 365.983 732.093] /A << /S /GoTo /D (Hfootnote.4) >> >> endobj 357 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [395.698 370.687 402.421 384.13] /A << /S /GoTo /D (Hfootnote.5) >> >> endobj 358 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [84.236 231.216 223.67 244.013] /A << /S /GoTo /D (cite.carvalho2009) >> >> endobj 359 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [226.448 231.216 250.259 244.013] /A << /S /GoTo /D (cite.carvalho2009) >> >> endobj 360 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [256.058 231.216 279.869 244.013] /A << /S /GoTo /D (cite.carvalho2010) >> >> endobj 346 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [427.774 150.865 522.996 160.819] /A << /S /GoTo /D (cite.afex2015) >> >> endobj 372 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 138.358 114.535 150.278] /A << /S /GoTo /D (cite.afex2015) >> >> endobj 347 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [119.186 138.358 139.577 150.278] /A << /S /GoTo /D (cite.afex2015) >> >> endobj 368 0 obj << /D [366 0 R /XYZ 80 770.89 null] >> endobj 46 0 obj << /D [366 0 R /XYZ 81 678.62 null] >> endobj 369 0 obj << /D [366 0 R /XYZ 81 678.62 null] >> endobj 50 0 obj << /D [366 0 R /XYZ 81 464.296 null] >> endobj 370 0 obj << /D [366 0 R /XYZ 81 464.296 null] >> endobj 371 0 obj << /D [366 0 R /XYZ 97.575 197.436 null] >> endobj 373 0 obj << /D [366 0 R /XYZ 97.575 142.642 null] >> endobj 365 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F108 296 0 R /F21 188 0 R /F44 136 0 R /F121 354 0 R /F40 135 0 R /F109 297 0 R /F22 252 0 R /F88 254 0 R /F110 301 0 R /F90 374 0 R >> /ProcSet [ /PDF /Text ] >> endobj 390 0 obj << /Length 4654 /Filter /FlateDecode >> stream x;َȑ_V¶hk503̎mx`Ivt-)uMϋqf&%z?.yFF|2{=#5oqdIy-8%X\mqߙ卟+-v1x9l$ddO}vㅔJ/v᎗&+fDbW,:B+BLd=0{\ :/!>#Z*=7_Jtv PBx#rBt# " ~Љ&%ER+/+f=i~@X3Ri\r)H_*Gz.bVnwL:ts- EHڱ|#:/H^.> 4Rŗv"[eu"׀2sW4_O˄C: hRSf*="n4dh."Ӓ̃*,I}m`IOYIZHli~M75kf1GM'Bću>s{ **kr@sd5wr&~`が[z(Rt2B Y$gEÐW,D46Ӿk/2{{5᳼ CߣeDӍ)M`bAtҶjT;TE0uf S!-­QMWI(&Ny>nqDxP˕LᢈIT[QO"%\'r \೛h f#}N+F&ǧZ%AHF/_]\4:%{pO4& @J¼W_}\̃҇{'ȓ[i}GcpQN=^\p2)yhY6[.b }Ԛ_[;e<~awH=pGb<|? x $O0XwLh>ш_fB2SŽ{%`Ud֗##![ٻ{r"~NO glhKʖI~zɸ/V PAs0qL4x/UU5@ozL6#?eBc|/(R,j]O[MTpcEQ2yccG! &w5B<7Q($CE;}\Tr"/'|pЄðQ4$!JƆrv @RW-Ҁj4,9pŒc%kpWZRV(&mqf͠2Vo(#ܮ!$ =٤0Q̗!5!RJG~g(EJVpTEnCG~V7i[w6s娘`bBh7Gq״|1. ȵ\g)ӝ3YՔWϿ{cĹ)n8 )$܀6k.*1w os Iol?, ۍF:Kp:Zav 0I:1ɫc-F=lUA.#2N|RK Krs}DD)2ra1ުQRmx|mhܲ1.wqYcߐ)]|^Ap0ypXIo>C#j>Dje=+Rڋ_?\,|"'IʍctTag@? iˉ 1aK:I ^ve8hqWP ?wlA3fJO6䚹ШT%|}x'kgETUI<:ST,(ՠ(j \! [. w`Q*4>*ҿMǩuf=V?u}ޜ7}.!j%[zsҫ矜 ? "Z扸L'pKe򛈆\?XJc6l;Ią:$lVkCB :m**@h>Rc`bV#$)MDΈ%XV^P78!#:NvsajͣbeIL[Y q 5|D+\ڸ- >TA}W~ 0VtB9Iy_+bŃn֥sN10Et$ZBQ_X1c/̖.#>Ĥ? xb&bՍ[-$Pi3YUyuuǢjmn<!B EU%5?&?+=k2_.+j>@51 j5>ۤqWD ~CѮ#DB5Xty7GW ovrLNo}2ysMx0wE Q3Sj%&cSdg ~F0 *#3 endstream endobj 389 0 obj << /Type /Page /Contents 390 0 R /Resources 388 0 R /MediaBox [0 0 595.276 841.89] /Parent 356 0 R /Annots [ 361 0 R 362 0 R 363 0 R 364 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R ] >> endobj 361 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [182.886 664.149 189.608 677.896] /A << /S /GoTo /D (Hfootnote.6) >> >> endobj 362 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [294.501 664.149 367.075 677.896] /A << /S /GoTo /D (cite.carvalho2009) >> >> endobj 363 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [372.948 664.149 396.758 677.896] /A << /S /GoTo /D (cite.carvalho2009) >> >> endobj 364 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [401.42 664.149 425.231 677.896] /A << /S /GoTo /D (cite.carvalho2010) >> >> endobj 378 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [201.498 566.65 208.221 579.786] /A << /S /GoTo /D (Hfootnote.7) >> >> endobj 379 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [237.913 552.49 358.077 565.287] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 380 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [360.135 552.49 390 565.287] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 381 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [229.867 538.94 268.873 551.738] /A << /S /GoTo /D (cite.gelman2006) >> >> endobj 382 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [275.173 538.94 298.984 551.738] /A << /S /GoTo /D (cite.gelman2006) >> >> endobj 383 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [337.443 441.441 344.89 453.121] /A << /S /GoTo /D (section.2) >> >> endobj 384 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [160.399 427.281 255.429 440.079] /A << /S /GoTo /D (cite.lewandowski2009) >> >> endobj 385 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [258.252 427.281 282.063 440.079] /A << /S /GoTo /D (cite.lewandowski2009) >> >> endobj 386 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [254.609 302.073 375.456 314.87] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 387 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [377.854 302.073 407.719 314.87] /A << /S /GoTo /D (cite.stanM2017) >> >> endobj 391 0 obj << /D [389 0 R /XYZ 80 770.89 null] >> endobj 54 0 obj << /D [389 0 R /XYZ 81 210.952 null] >> endobj 392 0 obj << /D [389 0 R /XYZ 81 210.952 null] >> endobj 393 0 obj << /D [389 0 R /XYZ 97.575 164.56 null] >> endobj 394 0 obj << /D [389 0 R /XYZ 97.575 142.642 null] >> endobj 388 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F108 296 0 R /F23 185 0 R /F40 135 0 R /F21 188 0 R /F62 141 0 R /F61 140 0 R /F44 136 0 R /F121 354 0 R /F22 252 0 R /F88 254 0 R >> /ProcSet [ /PDF /Text ] >> endobj 402 0 obj << /Length 3810 /Filter /FlateDecode >> stream xڭZPWHRIѤA>AZ5]oPo EI7;d,OTzvs7KU|v};w7"Ri- nąKMrm=G ڔkSt_//Q>l>I t bߐ;涷GwG^hWg (xGXf߷| ƽv$2ւ`ymW)[=%\H4 Ԧe N71-+PO! )T<Mܐ:x|uv`еn=qk{IB0{W2n9[G ZȢS㷻o6YiF74Qdl}HJKZV';фm7~s$S02t躳 $f{$ 3t,gZKGH xD%Aj57^Gȏċq%9w~?*+LJσ,&b/MM|i2z̪g05zg}?b6I,KŅ-Q8J (4Ilfj =&=:W~#2,jKh"822$>mV[#2&b^g: R?T^3 ڊ6VWic!9h>˿˦.@Ŵ RI2y!gSU+gM=)ynZHZj%:D%:5 -J !9#'X 1|dYO!YR`d$¨)8a*LVVw=H;Xb㫐"c3"8ԬUCCVsn"-Ges?ni,Ea,j$SǢ$?$hj}+mnUeBf\"+J{Ӡ:Qp#]!7#xޅ )wR=p~z/ BdX| C̚L'^ BM#U|9z>ٍ.F ȔKǔ $ηqM 3zZRAf Zl dX;nM`c(җP#1)wyMʹ2BOWp'~.Rv)A d> O*.ĸ%:P]\55 _ A ٍ 4q/Ay~TzxtS aN!pjT]LJpuy䈃p< L5:cV%Fܕ<[4trA>9tl3X\f81b,DI>𭙹ՠ(u:21`tHHǘQv[yN)sHtgQ@\:7T!/8]PR}ڧd)>V,Cf*qTl`6-p$g+k5稂zZ5u{iI|}S=.Wv>[hcSz7VLV?~S(prxM3'N^{X:AM*ԑoq^p=_|Af`paEei/QX;ŊR4}Pt!<7!74ڨbv?]逴BB R=/+6\9 m@2~">|!xQ`WSaYI_8"69AhCbte=D${ym8'F{L^cH}jos02O`ً`OIXJn})iG=qpđ\+ʳP%Fvt!nrFNztC.a }łE[o4qՂ_''pOOݥlb$cN[/ٺJiEjYiDbm$JxAnsg$z<}"e)N5mzD& NJSxV[tϖof+h(H9gODPF|8d iTnmRTP*UcTu]L|sq]#bؾ܍nw~gɡe$Gu2[`t>e\f~CYsSUśKh9,FGQ"U["#:?M3V4%UHAbG2sesрyϻlߍp*0>@|_5p##[ w!JLG9xt$IoAd:>MlFDUV1rRgKc:FYDwsF鲞NS6Cp(.i[e Ђm%)t'?,B endstream endobj 401 0 obj << /Type /Page /Contents 402 0 R /Resources 400 0 R /MediaBox [0 0 595.276 841.89] /Parent 356 0 R /Annots [ 396 0 R 397 0 R 398 0 R 399 0 R ] >> endobj 396 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [492.488 487.478 499.211 500.615] /A << /S /GoTo /D (Hfootnote.8) >> >> endobj 397 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [308.004 446.22 413.908 459.018] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 398 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [416.286 446.22 440.096 459.018] /A << /S /GoTo /D (cite.hoffman2014) >> >> endobj 399 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [497.749 334.998 504.471 348.135] /A << /S /GoTo /D (Hfootnote.9) >> >> endobj 403 0 obj << /D [401 0 R /XYZ 80 770.89 null] >> endobj 58 0 obj << /D [401 0 R /XYZ 81 540.064 null] >> endobj 404 0 obj << /D [401 0 R /XYZ 81 540.064 null] >> endobj 405 0 obj << /D [401 0 R /XYZ 97.575 131.683 null] >> endobj 406 0 obj << /D [401 0 R /XYZ 97.575 120.724 null] >> endobj 400 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F108 296 0 R /F40 135 0 R /F44 136 0 R /F21 188 0 R /F61 140 0 R /F109 297 0 R /F22 252 0 R /F88 254 0 R /F110 301 0 R >> /ProcSet [ /PDF /Text ] >> endobj 421 0 obj << /Length 3304 /Filter /FlateDecode >> stream xZY~K Ѽ -myH8!8f8/=ȫ}+ Z]~s8b(_.TYte7 mjhL,~Z~weR+:?MZc_]/VZ5UYؖw7ÀE~_#\ 'nczTWukxR8E) Ve2}eZLUu+ΰ˪7r>p^aZUtK\Re*EepW+]0tuCc \F]$2Ee,=\[!kMk&ŤcefLG)!y<(~eY )'!e5Pg-4U:c%=:Zs|o9'ҲHJ'!}`.-I*G䂍 B[ ׷@T"\F'Hͭ&OeA>E"acBN̯_ApY%2hId!L޿g 3S0|~Űc\ /;z)S0g! 9" =s1ˠ'&dpyPHs&R{JX^#qHaDnDw-:Us5ɜayR|Z6~*:Lc*P2^e,M8i(AAc$cDǫ x4${lD JiBR]GzZp9΢ 6TTl Dd\EwĖ{oG/ õxS喈w{^;q' 6$QcbN`d#m-&L)5w1t OECPv PПIv<{AH0⚬R03O%s& 6z|K9(GJN*'di&)V0 w{ tyfF;GMb#Y/vpwIBKܳe;x| V7'u+v1W'@ms`7O-֯)j`r:- 0UQ+U]' :iʼn$VԪNꉘٹiz?z}wij`=$A^<)UJ߳|j1*(>\^hruњzA֭ms,Zms 9G*mRH 1B ޳ Iv&;ӛV0iKe_ާ/BpVb#]/xEF}Z LG Uk{.u2 "/c/]!aeOAx1aEJ(/)LFDoOT**]fBn]uVTT LD5HVcXY;)A!؁ .*D &U5wYI"4e)OtZKim]>={\N]'v9X6e'Ć @TXrXs?DYYaLٲ{C|"[oH1k:7lGib [㜄)[ 5B |F!{0@@.Ovƪ|X cYi0aTsi@lMj"M5hLRזۤ:HNL6{=lJZM `ß7_Q-No⧕N|H_†ߣ:2.~zd]ܵbu6A$TZ*81E=i/%| h['d6I֧?>MRtnOB_dI]b=?iUAie5>=WG1 q;]Spr kjR`6㛆4gS ȥaj]JW/)pa<߻2mbw:Q-qs"ڥCT{)ku8\[u9R[}@ūjze*$g=, Y+m [?jKUEGZd|zCI#pEum0Һ?c.lSܳ O@6 t.1,;z}p*F/5egb_'e,8g{Y4ܗv|q')_ATZo3Sk+†npݜ"֘˶.ֱa@@h=>'s1鲨mo 5J>nOԇ,|;ޅMܒM?4l [KTUD+ SE:#ӷN~G|.)r!ݵ$3ySo 8)sQN8 U>{זC醠 R6y)R6lrƏ+פ&}}?gj. endstream endobj 420 0 obj << /Type /Page /Contents 421 0 R /Resources 419 0 R /MediaBox [0 0 595.276 841.89] /Parent 356 0 R /Annots [ 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R ] >> endobj 407 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [340.43 251.012 434.505 263.81] /A << /S /GoTo /D (cite.gelman1992) >> >> endobj 408 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [439.808 251.012 463.619 263.81] /A << /S /GoTo /D (cite.gelman1992) >> >> endobj 409 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [175.651 193.371 183.098 206.169] /A << /S /GoTo /D (figure.2) >> >> endobj 410 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [173.598 179.822 205.667 192.62] /A << /S /GoTo /D (cite.gabry2015) >> >> endobj 411 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [207.48 179.822 231.29 192.62] /A << /S /GoTo /D (cite.gabry2015) >> >> endobj 412 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [396.538 125.625 403.985 138.423] /A << /S /GoTo /D (figure.3) >> >> endobj 422 0 obj << /D [420 0 R /XYZ 80 770.89 null] >> endobj 419 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F108 296 0 R /F23 185 0 R /F40 135 0 R >> /ProcSet [ /PDF /Text ] >> endobj 437 0 obj << /Length 3154 /Filter /FlateDecode >> stream xڭk @P]j1h A8pa>ԝ`ITH.swIw!0[{7x˫^ GU\fQEQdfaioW 5QR䀃/Ͳg?0p2(U&˗-_.mlغ>\$YwND;]Ek0f8<7<؁X>ʤeTbdQLl}GED-# p-4)%BV¬bR m Q؏iDVTd|?QDI(iwutmW5kJHhɦ`N){N W^<[D<~%ԭDǬiV(O u΢ɢ8'`ys Y |>Zo4t  /Sj'gͪ#JۮLU0dkg] *e7kWQa.U78VRuኝ'8ړad13Н\: *b6GQuQ @1HCauf'!hW-ĵA"'{7% 9y'D6D_XN¬K#p@e%O,>[ Cʑ/_^^>=V o8䉞3PSFOv穃bn xrP@X̅E)@[Qϖm@+A@ Hl#--&qcsQnC .W:v5*Ž 41V\IPylՏr [v*tJ!Yi8aab/ 2:K" S0'&Z {mQd&*M9'i$wUTҌ ?6mxy=e[Hv`oK0[+gѸu_xFd0V+"bB 7l/ì#]D=-S*ǝP3hQ]0Q)@}1Խƨqc ~PHC&Ijxe&ƌf.qORDq!4.;Lq 1)i,' (b;҃CCa;l5Rmn`DW4:ȷyVG\\>[Q4ߝpekqb6K;i"j.q0U^b'nkz=͌0jy< = N*ULRB Oג|Op9 ] ^4pmj$SqfR Sj Zevw7~,a's{'i,R{:&a^ka3o$fQ8|fMld¦P7iݾiZy@nt"4z6'AH50z8-ZBIrkݺ)ٿ͜Tl=XQK[)hYb2(YSDd%R_c2{$Tk~u&1׵ߓ<'CL YE4s9ܫw+985MY\Hc$%C(9MGQ C˷49q|Vc,=6 fFs;qͨ%Xwθu΢Q'%۟٬Y^W f{6c9Gqn|y#Hq$/;ʢ5©IE`Usu0A4԰d%FvCʕ6/L .y x+kZ1&ɓ,EUޗQC?WI u}Q9uԩh;ƣ?l++M~{8Pf_(1VFXIwA[,<kuq-SB)`_CͤҘ(Li$K&nf3 689Lf1!3p LV0rm0kWZ{הcdփ'V [=bS4F̆B~bJ~OVJ _g1_b]O!LsvϮS¾׃%w._2 (ڌ,"Ԃv j2|.T T+/Ʊ3<*qb$V>Tdvrs]nûaܚ7r3W4p0Zy$p<̺SOT]gRܭ2q-h _w.ՎfLZ^s3La#UW67SyOfϢXx)RBq'.ZEJB $/FZ/-B f|=*FGoFzUxP_,9v{V~j0Įj%q)+s4L(?r& 0͞Gkt$ɫL^KA Ӿ*M|@5>\+nA]EZqe7g;|Ȁ^SHҷ<,TRE U$ ˨]`d'ߑ%]7*Mo ՌZ0RIk!r*Rb)]P))"V*W_Rl?16ŇE➠.wJ[0~"YCI9PVRL?L endstream endobj 436 0 obj << /Type /Page /Contents 437 0 R /Resources 435 0 R /MediaBox [0 0 595.276 841.89] /Parent 356 0 R /Annots [ 427 0 R 428 0 R 431 0 R 432 0 R 429 0 R 441 0 R 430 0 R ] >> endobj 427 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [130.064 463.188 137.511 475.375] /A << /S /GoTo /D (figure.2) >> >> endobj 428 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [443.892 353.269 454.846 367.017] /A << /S /GoTo /D (Hfootnote.10) >> >> endobj 431 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [345.139 155.22 410.562 168.018] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [412.579 155.22 436.39 168.018] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 429 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [491.568 107.029 522.996 118.432] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 94.522 102.439 106.442] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 430 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [107.091 94.522 127.482 106.442] /A << /S /GoTo /D (cite.vehtari2015) >> >> endobj 438 0 obj << /D [436 0 R /XYZ 80 770.89 null] >> endobj 440 0 obj << /D [436 0 R /XYZ 97.575 120.724 null] >> endobj 435 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F108 296 0 R /F109 297 0 R /F122 439 0 R /F21 188 0 R /F40 135 0 R /F62 141 0 R /F22 252 0 R /F88 254 0 R /F124 442 0 R >> /ProcSet [ /PDF /Text ] >> endobj 468 0 obj << /Length 4222 /Filter /FlateDecode >> stream xڥ[oƑ(xf7Iv;JCiƚ*ѮewիPZ9~Uu=~U.Vwb훯|2+Upju}Fֹ+z1nqvod[xf|Gڅ].E뒺oi[x4%\:\gl4oM8POҔC#(SbmДO{ƽ'lkicxσvvNL'gU^whR֥:H|GZ1= yiTL,hq61ãH밣p-瑤Ʈ1Te߷`LOHxy7H0U}Δ$|iJ*=yRpfPwҼ:R: vGB+):y&:bEuW!:dMëh".;j4} J{khޝh9KXu5nr'{O uPPK<݈i;u: @7hD{e#DtKk]^%{GR="DRT/EaLgU-Ydm8K3G~|,wqPYM^:A3/2{dž;%T' >j25/9}Z `l+ʪ VVYA2 BQ8;6x&_bFMpt䩮]( [`D}=UŖp$ Y%}D_oID=̋xs#@\鼍6SWVGw ~*b/DW&5s8-/H}wqX0'OP aVe^KΛ&%*㚴̸di!b:Na2<R0‚Qbq7$Ţ_WʋgP G@77L_fʙR[1=>5)#4ܐ;]҂6S`؅ ߡ-t fv9@ ~یcRQ4ΫH„TLS;2$7G*0>a+kxNg8ܡr[pm ԅˈ[CĪv1J 3缔}$E޸:P I':*I,DhE*h e6Dng776&xQ5sѯ3X%rfgM;B%au"i~,0#}E BŴN鸸ďB?)b>8BS`C /D({<,sp/o}wHBJI L7 :]I _n"~0\U6~aU(`U[7 T;V>}ꗑk\'[Sy!SB0 IB}O61SC7MUyaKG^?At;3@ jU.8`jU+5rOv`ybKѯͫг!t lֺXvddH 3;M>k2D壤@=7p10aܟTA1=Mjb0Ln6if{9d2zph8m@aŠP\,ҏ](,HxXJCʂ Ţ@:%S2cJżuݧlJ6\H0}fS,0vA*zq*ۼ`ca"^_5%g{yXB(@Zg_,gq\e"$nC IK \#j>v'n>|y^Lf<u% p} Ev`g PJT|$yL O9gExa_4qOܲ~e_Vsn]j+DtuHɃTE ט٩y0fxetR} h}NG/OW*6L\ZK8+LDH>aѺY%c i? y|iM C6X{<-'pYCK`}uI#dCPh%;n}z{;Ț\hHJA܊D07Xek}R2 BPi! {x?B=B"7t.2f8r|N]ɂ;\lĦ$1Rn1I,r8TʴMQ~$JLBO_e7IgKqEYsEqTd}r3听,KlUoIt9*KgN˜pY%)}Qhs|P,m{IE{ݐһ }/bYXHhvr3Ӏ{Pi.rU#قm2T n\Sunc8k/A& )V8v@:/>J|m,N&멥%@ mJ:},1{A…3'$Sr^ HRբPچćPByIJd >sg *n*fY/S4#ee7>z0LOqkCEniQ{6]C %naeML֒4Te3#_%l}.o5 )O)؛RqF3+i^ #s5j7a&W +8W\B}Dzacxei uHjiHkҢc\,w;sY{,C]%5oXr~< zu-VH1<Ά3ݩD v01oxi7\wjD6 ~bi(.!l.wk`TY΋H.&%:q(*yGʟ[J $"^|:MI&e-cpK+!>>FD^Z. {DLa>ѯo"MTFArUwxjqzVx$$_+ 4.ƖeZsQnPlMA|g 1r}/yG7A18:~][{$Ѯg5KަHv*6wiK ja^6D(jҏ#ok)5>,IR:]M@Gujl'Ed525; TDj XϚ}^rp&GG$ .~!Inyk-ea3x1t\̖X%ǙЌ\ % Ci &n!t8G5}0v i_њGn,_c4EZzb |Z=o_,)sypʹyOzۈW$Oo *q)wQ;%5u"]a빉JNq endstream endobj 467 0 obj << /Type /Page /Contents 468 0 R /Resources 466 0 R /MediaBox [0 0 595.276 841.89] /Parent 472 0 R /Annots [ 433 0 R 434 0 R 443 0 R 444 0 R 445 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 446 0 R 447 0 R 448 0 R 449 0 R ] >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [252.51 683.956 359.482 696.754] /A << /S /GoTo /D (cite.ezzet1991) >> >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [366.458 683.956 390.269 696.754] /A << /S /GoTo /D (cite.ezzet1991) >> >> endobj 443 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [299.869 466.198 348.192 478.996] /A << /S /GoTo /D (cite.samejima1969) >> >> endobj 444 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [350.267 466.198 374.077 478.996] /A << /S /GoTo /D (cite.samejima1969) >> >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [393.506 375.223 404.461 388.359] /A << /S /GoTo /D (Hfootnote.11) >> >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [170.467 333.964 194.561 346.762] /A << /S /GoTo /D (cite.tutz1990) >> >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [195.517 333.964 219.328 346.762] /A << /S /GoTo /D (cite.tutz1990) >> >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [375.736 306.866 415.113 319.664] /A << /S /GoTo /D (cite.masters1982) >> >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [416.366 306.866 440.176 319.664] /A << /S /GoTo /D (cite.masters1982) >> >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [444.45 306.866 484.624 319.664] /A << /S /GoTo /D (cite.andrich1978a) >> >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [485.877 306.866 515.742 319.664] /A << /S /GoTo /D (cite.andrich1978a) >> >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [286.063 204.376 326.237 217.174] /A << /S /GoTo /D (cite.andrich1978b) >> >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [328.803 204.376 358.069 217.174] /A << /S /GoTo /D (cite.andrich1978b) >> >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [364.12 204.376 404.294 217.174] /A << /S /GoTo /D (cite.andrich1978a) >> >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [406.86 204.376 436.725 217.174] /A << /S /GoTo /D (cite.andrich1978a) >> >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [442.777 204.376 489.365 217.174] /A << /S /GoTo /D (cite.andersen1977) >> >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [491.931 204.376 515.742 217.174] /A << /S /GoTo /D (cite.andersen1977) >> >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [253.234 177.278 317.941 190.076] /A << /S /GoTo /D (cite.vanderark2001) >> >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [320.098 177.278 343.909 190.076] /A << /S /GoTo /D (cite.vanderark2001) >> >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [349.088 177.278 373.182 190.076] /A << /S /GoTo /D (cite.tutz2000) >> >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [375.34 177.278 399.151 190.076] /A << /S /GoTo /D (cite.tutz2000) >> >> endobj 446 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [299.976 117.486 349.148 129.391] /A << /S /GoTo /D (cite.christensen2015) >> >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [350.333 117.486 370.724 129.391] /A << /S /GoTo /D (cite.christensen2015) >> >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [429.102 117.486 445.431 129.391] /A << /S /GoTo /D (cite.yee2010) >> >> endobj 449 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [446.616 117.486 467.007 129.391] /A << /S /GoTo /D (cite.yee2010) >> >> endobj 469 0 obj << /D [467 0 R /XYZ 80 770.89 null] >> endobj 62 0 obj << /D [467 0 R /XYZ 81 733.028 null] >> endobj 470 0 obj << /D [467 0 R /XYZ 81 733.028 null] >> endobj 471 0 obj << /D [467 0 R /XYZ 97.575 131.683 null] >> endobj 466 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F44 136 0 R /F40 135 0 R /F108 296 0 R /F109 297 0 R /F23 185 0 R /F61 140 0 R /F21 188 0 R /F24 186 0 R /F26 187 0 R /F22 252 0 R /F88 254 0 R >> /ProcSet [ /PDF /Text ] >> endobj 486 0 obj << /Length 2201 /Filter /FlateDecode >> stream xZ[D~_hU++;3-4a@ȝ;AI[Bv\uq23+ܱΩν.L&W,'*RI&EVĕ&۩Jg?~mRZŦHt7Sӽ}6$E)h?Eij_3]Lg6e]٧"c~k4H$,C,:by7݂JXܑJ˸,Ids{;+ S֌g8544MMH Kij #kwNv0:ntC_O ZHM,k}S=q#L kA(` _ءp_"PUjL:VYꕵ"A[dO+`w+Caƴ:8Mk@[ ,:ꮷ zA1@?Ss(i3wF`C-~e8)yU9O PI`qJ`E0 |mK2Ò| B} {T7ɣp[!M$8knm#҄ꞇYi3 ]_DG7G[?g߫GMEPCc%{ײϜ|yXv.0oA_w.yC$/ɜ_bPt')B"箍ȓ KSB R,ɒI^<5S!ɿ]/^ ??町5&I"6ԍ}7ȵWœh+9ĵFBיZȷ- }*qOyg,iېq 0R:T_iR a@l.y^1x?0pG1; ʻ$%! :(suIXӚs^êbY:p zǞ\,8G{\y%4S/j;fL]0T,w{\yPPʥm) r]H;2w9j`^~ ydT++~|^tR> e=Ԑ-0̾2ɢ% \ bԫ{)ȮNdS!&4iQ3dyb)*$SqMCoY[QZ]֝UDD&u5Xd`?WۥbpYw`dK*eۣ$ ð}~ K.~qN>8$Ji\:wĉ aH\$ܻ{DXal}D_UN Uj<uL|ܯr9sU~ ([nsmTfE"ED:r^";nP1y/yfF=Nn sn>vˉ⧁QHW#wƕm>OߣNgjV9€)AWVÑM2ǎ-=k^߲*A^fFn>ĠizRޞi rkJm/.l./pco2p؄8EֹKw Vd% 6l҅rCUn (|A;u9Qw~DC}GHƎ،HN9|UiViQ䑜RkQ:'19 |8]@_%v$&{Qׯ&o! n[`| 3aV"&~{/h.rwdH% A;,28e!9לF/̓8O3:˞ ,»ٲ*ck`;.sFnjrX>u2 6V(Ri7׎fAtt/$:8{S`yZ6f@ 5 A~_^(> endobj 483 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [128.042 108.632 135.489 121.43] /A << /S /GoTo /D (figure.4) >> >> endobj 487 0 obj << /D [485 0 R /XYZ 80 770.89 null] >> endobj 484 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F108 296 0 R /F109 297 0 R >> /ProcSet [ /PDF /Text ] >> endobj 513 0 obj << /Length 4353 /Filter /FlateDecode >> stream xڥr=_R3铭&N:$cL>@D& $(/eڙLLEboz}7va⨊+_$6l.4[6_?_%>m OQﯮ4]S,Ȗ:*[,>?{p7ߕ!<ʢ<5d8X.,,*g]]'C`exҤb=GZ֭j\~x5)xSlx)pl}J>>ծO8Ǖ|Gdm#mHG#Y~zxf=!#^\4lC +:m5nmeaϣ8C43!ĩ-_-{[--&ŗJ% TEkBsK(- ]QyA~}Y8Af֮pچi?i^[@?6D!-wt~.Re/Zji~ [}\jL|1Gϟ-X?Ѓ E@05C?1Gywox︛h U3;'Ӣv=0s3%XTJ`g+󴔛\W 1c j.d dBwhzwxO#iFea?Iee+"aA(ySah' cg,E8^0ue"CDpǫxCMz?\ I5B}) =(R!+bpM+xXO|FnFjM9Mn"Āh>\N]t,;/`ӓ?H/!R/|֌rۤu!DoǷxQO{Y3'D\xC{UƢx-#IdK2DqV'ȅO';!]嫆gz^+* ksIh< Y#fLT{v3\RD ZI glYTNf$߅-];y/Xƞ@كU[ rܳaP|;"n2) j9Vtrȋ-풬@#ž7Y;n4h4U&劉B:92Q%s K,7vLj 5C=Ijw*uK0c'*S,ŀ.OW|P,1Fq<֦CVQ\8xFt9$Yۛ7Dݜ,Cj mseHZH\&9R(LxLhfI:B ͐ K@R/c5DjjُMS)4pNYUQ^vO">Xde(&& K;! ab!yqa>c~wj#$?X "~3ladyTyx}bٍ*#N=){9,h.\V6<-&Dzsf-#_g;qUb78*v{P߱Knvx7 L頱+'jt3Z7 6IYǂc6NF``5ϦX8q KpLJ] xr+ u`E)`w]rdiGeR| vx7qƐ|Ɗڱ<' E;Me@a'[dp߄ydPO&°;wqLNE}39/ɔ?9z|؎\@Q)4xo$p/;0i^ܥNޞ hB.-2D!."5J {ʁ#A^gǠ5KF]ÍGMoTzv3J1(K1RV%5   URwd3&rsڵstri xӌֿ#uEjdi6x@J(#3) zNmQ-o1aLQąث⨌2(7vXI:c^DbTӁG| QI}^hсWa8V$.D)/?HKrF Qut_P? & n1Ucvj҂ҬJ ~b$>CL.2 7?R"9C)|756B"?Z lhK5|wA[Q=Pse9 jP@%hY B)R+QJh6Y‰ܓ R.Cz'q4kyIn/ޛM F(+סBIi|M ZҾ,|YC\nb |\h|~QS.a2YM4ݻGdI:_vܨ۫(]$ {M#EŖrG| 3C bh ͓ sgDȩLlxӼU,ׂ:*kgʁ::lPf¯Dh6鰱 g⹠>Z vZO<疠i׸ijArѦsC -*Wt¡԰Ѕ{{t2p-')=;(4?@Rl9`ֺc4qrb+AqB|IAK*߮&5E EyI~eT$?NBv#RM7PQ&yQB u{Iyןa[pτ;iHꆣ٩[ttKSa>*|(|DZ|:ӕ XV n oqZ:x, x̙&|U$8+R;'1K,@mWe0`&A$d ^Sį'`߆()$jz0련p5g&C\yq`ӠF7 m¤6@ρ"k'>Ҙ-5UbmTbZtKd%߾o[_à>Z9ehUmnbuI}xp^}ũ{WpR0O>p3ذ駱y$>3heŹorfk3FL}e)~mٔyA=eT_v|q9SKN?$*Q&2bJ &I~ɣNq#;)/4FC\=)*gz1i-Ea!1Eڻ S+N>Ἷy=i4_CLz>aVOـdL>,ű(_n/%$JCM |ݚ]`nk.6.$'*|d_$qu[hcĎl㇏+V3kjm*BN-i8Xʿ~ endstream endobj 512 0 obj << /Type /Page /Contents 513 0 R /Resources 511 0 R /MediaBox [0 0 595.276 841.89] /Parent 472 0 R /Annots [ 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R ] >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [345.814 557.987 403.437 570.785] /A << /S /GoTo /D (cite.bates2015) >> >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [405.716 557.987 429.527 570.785] /A << /S /GoTo /D (cite.bates2015) >> >> endobj 494 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [84.236 544.437 125.894 557.235] /A << /S /GoTo /D (cite.hadfield2010) >> >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [126.561 544.437 150.371 557.235] /A << /S /GoTo /D (cite.hadfield2010) >> >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [179.651 530.888 280.192 543.686] /A << /S /GoTo /D (cite.rstanarm2016) >> >> endobj 497 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [281.657 530.888 305.467 543.686] /A << /S /GoTo /D (cite.rstanarm2016) >> >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [389.28 530.888 441.399 543.686] /A << /S /GoTo /D (cite.mcelreath2016) >> >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [442.863 530.888 466.674 543.686] /A << /S /GoTo /D (cite.mcelreath2016) >> >> endobj 500 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [264.097 346.858 522.996 359.656] /A << /S /GoTo /D (cite.nlme2016) >> >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 333.309 103.814 346.107] /A << /S /GoTo /D (cite.nlme2016) >> >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [415.287 319.76 522.996 332.558] /A << /S /GoTo /D (cite.hastie1990) >> >> endobj 503 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [80.004 306.211 103.814 319.009] /A << /S /GoTo /D (cite.hastie1990) >> >> endobj 504 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [108.476 306.211 138.319 319.009] /A << /S /GoTo /D (cite.wood2011) >> >> endobj 505 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [139.959 306.211 163.77 319.009] /A << /S /GoTo /D (cite.wood2011) >> >> endobj 506 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [168.432 306.211 193.464 319.009] /A << /S /GoTo /D (cite.zuur2014) >> >> endobj 507 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [195.104 306.211 218.915 319.009] /A << /S /GoTo /D (cite.zuur2014) >> >> endobj 514 0 obj << /D [512 0 R /XYZ 80 770.89 null] >> endobj 66 0 obj << /D [512 0 R /XYZ 81 638.06 null] >> endobj 515 0 obj << /D [512 0 R /XYZ 81 638.06 null] >> endobj 511 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F108 296 0 R /F44 136 0 R /F61 140 0 R /F40 135 0 R /F62 141 0 R >> /ProcSet [ /PDF /Text ] >> endobj 534 0 obj << /Length 4147 /Filter /FlateDecode >> stream xڭ[Yo~_#Chɼًq'- N( )g,˿>u!GUUu;yn݇kn,m6{i[ٴ-/I^@TTya "͓g&MH\شKƘ2-lr[40C=u,Gx,7F$)d[3wƎ3v~>谸{&mfSViS׼KA?L#g-OJe[fBX=(ƑΒG2!Oo<@8;Kp9TI~ inK\*B#~X3k{/eajG+ 8D "HpieZ(;)ZXI=R$$qßh)37dU5MyG"BƑ򎬍Yd:[բ $UV{Pd8PYt{/WfO}Һn'Y?eׇEܶMQi=ᠼYХܤة]C0#~nONqp^PD<~urުT;g[LG;Ĥ  |[2ھ@5v Bxw۔Iwk =?_Cy!tnqMR¤Q&z vwVXJ&aQ:Y6UG&b ޿t d9{_u-I[kg&ZgQK6$B8)y^[#6l;*'<Jkp0Pw#1G{lԑ-0x\ t,SաyS,^b#yZCe {w zJSu[t^L3K9+ P%2sGy!Akw s8u $#Hu|"G2$[%NO2X{̍8pB?5<"􅎕eOYEQnwWT?oQD 0|\ uZuGdu~:Ba܋<Ѧ`NL[O`*ޅǂc̭w/o 6״NꔵHc#7k,(v,i`[QA|E8OB"{NJgo9UN=T/y>8/G03 8gr鄑t i)+g…u%+2_ƞiC:`2|y58O l]( [n>"EH#׫=2s$Yؑ)m5v@jy2GnGՉ@L,g-b%H`#R!/[ ~*{-;.\M;ᦓEdơ4ltK9},-QjڴDް}Kh ['2 O?3[X,WƝyi'7N2Cx̚ĝ;O@AnGT` _yZ3oY\U_ՄB}^uy g7'/͡umruvT44Ce3eQiM&qHT6Eu*(w>KCO012.4Ɠg~cD`I!za['4:s[q8y+@>89Lidq+Jah],<7r&l @Ӳ*PH\bּ"dkUB \ciUg0QY\[ZB[.wd\0.m% stc׺Xwp]";_BŪPrѲ~ls7"O[6 D\9'U[Ļ"p *MNW6_&`e<#'IZ"r;$LN*s%عHDE8|:[Q.gVY)P..g2Lr.Z(ώ<Ѓ0!n/;)rb{k4-e~j\ kvq$m [_ 0ԉ{q,cb 4+w8N@@kP>V;j 6[rAM}G{D _.<je! q,Z09qK ?OpupzS8 6\])aq7_VJZw׈guץD cIjt`\mk3z#Yq6-OiXT3g(@W轀ʪ2hh䛞^*IϨ=dYM|DٝTTťh^T8%"E.CCB5N0LdL{u6ssσIsu)ǗMYUԣ0et:M.gl$1AQrrUqv̫el]T0Y):؅J*a|Bŵge ƀ+ř7Sqklf"ۃffgD.{۰aZ8ÃZ1\YjrFc4fg&vc!zfpN-^V ࡽ7\P닒à Hz,ߣIN-4A"|Iu0M{r2Z:ozuxJbH0?5!^V7T; 8<__ Z;uzԅ{7J'jBs!v/ >J@tr} Llc)y RO\URjŤFfmv֧ >g+.QezeU%3cmɥ2jրd,( ѡ:jw?P*>&M|xM⊷G©6ML آwI/I6Iᒼ!C);MRe_06͗7Tx[8Ϣ LE4XùYVŧ='(B'{eIvX/| R-)ZSD9OGu,k߸55b*B"dJWc.ngrdZ"A_8^N܁.#\v]n%wqF @rhoZ.{C =ދ kȴwrrq 㥺R NƑ.4ɘk(1ԥd}tJXn-};OLEFFgRIEUbϨi}u:H!<}A^v}I;u9J@rofȍ?6rU؄W"3OƒXlĈ!9UCfv蟽tFUy BkXn4;/|pӉSO,UNe"'H1a`AiV7x 5ITASjXqn6=9PǵO~]!vqCS@[);&O-7/$}gnDk>-{h> endobj 508 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [515.549 691.858 522.996 703.538] /A << /S /GoTo /D (table.1) >> >> endobj 509 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [130.12 678.309 137.567 689.989] /A << /S /GoTo /D (table.2) >> >> endobj 510 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [484.758 678.309 492.206 689.989] /A << /S /GoTo /D (table.3) >> >> endobj 535 0 obj << /D [533 0 R /XYZ 80 770.89 null] >> endobj 70 0 obj << /D [533 0 R /XYZ 81 134.946 null] >> endobj 536 0 obj << /D [533 0 R /XYZ 81 134.946 null] >> endobj 532 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F40 135 0 R /F61 140 0 R /F44 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 542 0 obj << /Length 1970 /Filter /FlateDecode >> stream xڭYKs6W(MCon촓GLh5DWn]HQf2(pv&cs2 .3tJ]Nr}0vTmc> ބj9ΥogY e=iny [W> Tta4x4',+ʅd& /X)+@ǹ2FРE Ǖ, lAgn>('ĂD)M23&l /;D$X¥yGdʲPyރ5ytz=EѢ).uQ~Fֱ,}Q[ժ IiɁ,~Ek= щNW! tvM:,/@BJN%Pi!K|H<\% k'9dPH C6U& $>fVZַS1!1ql2YZZW:c[ c5[ BUK+{R&cPJR; P,*̠$u @]3Z0) 譑nju4A,DX|St.3&Rh׹mpGpK\rȹI7oE Ž_;6v!HնY-&4C t`bseA %:'^7KJ㪽LV߁,i< t1c F  wEǕ?dn]ֻEXf(%M1_ yEQn:[dI4-RQK *Ңw>$-8/#7̔ c\..X%*TV)!POlwwEuy!D;=%Qro?-7 endstream endobj 541 0 obj << /Type /Page /Contents 542 0 R /Resources 540 0 R /MediaBox [0 0 595.276 841.89] /Parent 472 0 R /Annots [ 526 0 R 527 0 R 528 0 R 529 0 R ] >> endobj 526 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [389.965 137.003 451.275 149.801] /A << /S /GoTo /D (cite.chung2013) >> >> endobj 527 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [453.053 137.003 476.864 149.801] /A << /S /GoTo /D (cite.chung2013) >> >> endobj 528 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [132.181 123.454 173.838 136.252] /A << /S /GoTo /D (cite.hadfield2010) >> >> endobj 529 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] /Rect [179.711 123.454 203.522 136.252] /A << /S /GoTo /D (cite.hadfield2010) >> >> endobj 543 0 obj << /D [541 0 R /XYZ 80 770.89 null] >> endobj 537 0 obj << /D [541 0 R /XYZ 124.025 181.374 null] >> endobj 540 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F40 135 0 R /F21 188 0 R /F61 140 0 R /F62 141 0 R >> /ProcSet [ /PDF /Text ] >> endobj 547 0 obj << /Length 2071 /Filter /FlateDecode >> stream xڭYKD.vܒ P@>*ed;atH#KA+g̲e/^\_\gcg׷ѦpRg݌H4% 95pmT)02>Jًj.q.lpUy.}Gևa ѮDI=ρ!/ƅ{\ο:x +Rm.YUtbކD̨iBX QΙ)3eBp|zMQ/YX0M\eK-0fr)a g-<G`%\wgGQCp<0<> `B#C%Q0 c['bfP>+?̵q?]ܕE)) FryBZJ^sKBR^ȜsNi GXc!{qVT H,`HKHX J7Թ󈢿3c>(6L[_k; +StAHL ͋"w?y[N3u&I\Z_Mkǰ'Â&fՂ[iB"8LޗͲב=};ŃwZ$rC+8?녲 WJDDFh12N0bE j1وLimWP &;^Ιbk,&Њ!p0axuwNϢFIAJ)9Κj!ןs!L]6Rɹ+1w5ൔ* Cq/)ϣ༣4t]fJ`mPہ'+@x ᮺގ/-—B{JK"q'9B1sz0i')ezT !V%*B* ʂvƴJN*}M\S%A>OPE -aDYJG{)lׄѼ{B*`rA (#/CB*{/cJ|\d7tjl"-8 *&$RC"KP*VkS6}A0xX61O <3p@gh+MwfRj!?A` Ci *VKP z2_hFJV7A8!G԰0*'-*NvDc. 7w>FF/ބH1zw-C'娞~r9qhMUS=ݪ p ?*!sYn`M/~g;wBGMaaomQ]v16݂8j !+i|_֍*^'+pQO7HO^ۊSJW]V dtH930$$A bؙO& mQt/YG"_zEi*bklAfod*fѯ|.ng-Ku@D(|ޤ=:&jݡ#fٞvij`68I",xw@e >ů0s$+4!msǟ'°o)jd+>T/&,;t\~3}ޠpy?Aj.|Cɂ&HP$!b5UXYɏ7=IOuWcc?;YT endstream endobj 546 0 obj << /Type /Page /Contents 547 0 R /Resources 545 0 R /MediaBox [0 0 595.276 841.89] /Parent 472 0 R /Annots [ 531 0 R 549 0 R ] >> endobj 531 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [486.706 130.076 522.996 142.874] /Subtype/Link/A<> >> endobj 549 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [80.004 116.832 397.391 128.817] /Subtype/Link/A<> >> endobj 548 0 obj << /D [546 0 R /XYZ 80 770.89 null] >> endobj 538 0 obj << /D [546 0 R /XYZ 123.092 187.996 null] >> endobj 545 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F40 135 0 R /F21 188 0 R /F61 140 0 R /F108 296 0 R >> /ProcSet [ /PDF /Text ] >> endobj 552 0 obj << /Length 1669 /Filter /FlateDecode >> stream xYێ6}WyM"mڴH/1IZȶe+o-;$27V)}%SpᐢvE6@Y9E/gW)0 {rEܱpo(٥D\UO D@{apYmGPXczpY حH@i]@! $2ѯ>0\$96 PpGSֆa0X. 5&oWw#|h='oCo̭֗6嶩reQ',G8cָmTşR}IQ$ţ6Mw 9;=|l Wx΍O}w\< vZ3q?y'T7vN[£K'%Z4cmQ.G soZ4v_:A-H9tY͖C7\r \ /ص;ML5U"v"v_ <z~[gm+x?4=;0ݫ`ʹ_(ԳvwFFʛ9DiJ`q`Npz %1#{]SnZ$(dk߸Rhs[v6 BARA fvWp!Ys_3Qa8#. ~#IYv>_C&.~FokhUߛSg(f;ZT+%FZ πUsjMs_=}rWM_3zѬzN.+*4{]҂t~ w G endstream endobj 551 0 obj << /Type /Page /Contents 552 0 R /Resources 550 0 R /MediaBox [0 0 595.276 841.89] /Parent 554 0 R >> endobj 553 0 obj << /D [551 0 R /XYZ 80 770.89 null] >> endobj 539 0 obj << /D [551 0 R /XYZ 123.753 225.447 null] >> endobj 550 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F40 135 0 R /F108 296 0 R /F26 187 0 R /F21 188 0 R >> /ProcSet [ /PDF /Text ] >> endobj 559 0 obj << /Length 3297 /Filter /FlateDecode >> stream xڥZ[sۺ~ϯC frrS4-ђjIPr4+JT6A`{vl~ūwYURggezVdE\vv$D&JM"Dt7I;&]Hl8K29wFѷ)fSWo& ڏ /DBC$Xp v<'pqas/9SWeY,.7K|2pūˣYGqE-ʢEw}|<Ӑn:سsM7sA lSw4|Vv}#E}NKëZvƚT,!?x%nSԕҕ>e0wґ} 8+^[u ƑTQd ^D$`λY3iC%*';U}!kƛYk &}%G"Kg.N*o?< X{'ak(!$Rmn*Z#UplGcT|"2^p;f n|?YZ@(Íy7$ۘa@Nh ]a#$)Ix#}nVˑ.IѨwyS :=&hQw{`p.SfYNUJ$A;DӹٝF kymU!/cfapZoE!:OWWp m:TVVg6+Ýw";fZkmѹ\3B<):`^4{F+uUA6M*E6eGdb3n`/]\-#sҠYoD7U`'CmuRvu!X b .4zشNOfsJ`7?\ϕqn'>i[}d"X9bQgLd17DBQ$N߄Xll dݢ60E]oa硂V|O{Gꑹ׀f,ґLWcO45+8=H'go D=`IǎkO -h cvA2d5dQ0dk0ruL![P48#CҺ3u `ݔ&.yP\(4\7y A'͚G9kN=>mM+> JkX&M*Mؐ>ÿ\Gb$+rb%^UHU]\G rn[䖛Dw]}hRޚC(w)X?${ap1HqAf/K=*i^5 S*o~4;|86!͵J^o)޷7&^ػs5_,=LY (ND&Iqf `vC6)Tu xT7n Km&obF)GQUכ֊FT 718M..c+`Iop=HF1K*RBmAsnvwɨw,F#HDp!8i0m-RF=#R~碷оIUQ3eY#J ~>U5Z?  |`3_"iG:J1`ͰTŶT;Sâ]*WpeR">2+(W LEA"g!(iSG!U E[cμε$4B>|`hvYr 4^HZY[Uq+|' V l! m_e 55_b.7|3 \r*ôު*$2kãd.v8)hο=89V=Kʡ+.e3z{'XUǘ.#z ,Q>{*;Ғ'a󷌪l]0`J]XG)d`fx+-61Xj/ޜe;F~D ę= BD1ၡC.iʁ]qٓ@Uݕ']Rl.}vaյO۽@Y+<MOH'_u,]1sQ14| 9g16?=y$q$'-:L'|^_c3vФ#_0]G OFOqT6qRf,waVjt~}aD;Q<7*YylCћ.%[=U&6.{>,agObFy6=LR"lJ[hmZN( GOSEܥEK4pLV~.54E8B>U}Z\B߷r-A-VP җJ[).uI5!9ˣNJwǖYzԾgG]p)b-XPit bX%3>q$q ,/xU'd wk^ sKyNs,5Dw3pF#n #~}D endstream endobj 558 0 obj << /Type /Page /Contents 559 0 R /Resources 557 0 R /MediaBox [0 0 595.276 841.89] /Parent 554 0 R /Annots [ 555 0 R 562 0 R 556 0 R ] >> endobj 555 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [418.11 253.791 522.996 266.589] /Subtype/Link/A<> >> endobj 562 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [90.913 240.547 184.367 252.532] /Subtype/Link/A<> >> endobj 556 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [264.071 144.921 408.972 157.719] /Subtype/Link/A<> >> endobj 560 0 obj << /D [558 0 R /XYZ 80 770.89 null] >> endobj 478 0 obj << /D [558 0 R /XYZ 53.727 379.933 null] >> endobj 477 0 obj << /D [558 0 R /XYZ 53.727 343.643 null] >> endobj 476 0 obj << /D [558 0 R /XYZ 53.727 307.353 null] >> endobj 313 0 obj << /D [558 0 R /XYZ 53.727 271.064 null] >> endobj 154 0 obj << /D [558 0 R /XYZ 53.727 234.774 null] >> endobj 149 0 obj << /D [558 0 R /XYZ 53.727 198.484 null] >> endobj 148 0 obj << /D [558 0 R /XYZ 53.727 175.743 null] >> endobj 161 0 obj << /D [558 0 R /XYZ 53.727 139.454 null] >> endobj 557 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F40 135 0 R /F44 136 0 R /F62 141 0 R /F53 138 0 R /F83 561 0 R /F108 296 0 R /F61 140 0 R >> /ProcSet [ /PDF /Text ] >> endobj 568 0 obj << /Length 3271 /Filter /FlateDecode >> stream xڭZKoHWsPŰ_|,0?88kXNhIآ!vo/SJ؃ݬjE {upTfQWm]h$. 3Nz!|-ϦF1?'TZ%Qڔg A}]|fkm܏\;x ǼZ5qO_`Q G6͂Smx$(wbw?4O.j='|/ p.="$1Dz(Cv+.K#vOqŌ 74g!4%9):PnJ \Cu:!ihј^I?Ԏ&iDN<,yDpQ@{Ɣ9k㧞DqBQ l')^ZTZ&LX N`7a3% 0*c&\qFV1(qݐ`,=th1&ώ*{Uō\ojq:MC-I۴㺮 !XPJܨj!Ԑy6jNCkVISo a'\V(L캐V:MJa0v͕eΦκRm'Ϗ5:'ows~l~Ub 2$,xqO1V4 J .~!ǬY._Q.8 Y" Ϸlن"`wM`ȉ.wTZ4U[[T[)H:jNc0ͪj)HuW~ '\R6GLɖKY @D,oxcsa6px yL_x;L-ҳE5hnv҂A&!94PFĹ'd4z[Jk0Gt_ uNH1~60Py埐Yz?n2&fh1vU5x:571mDs*dރHKmY X)䵿"畯|)KH=^V}MX5ˉQM@ϥDQn}oxT&g:һ,*T"-%ZhlƐqIQl)/}Nh@L0/0=yfE4:X`Z\='C>Ld -X3쓣XN=%,7|ctHY~'{I ?[цBxXP"WDl@)삷LL]4 J#D-V,ۿaG2(dsv spLwp38ۤd36G.\r©BDp0Qmn)Sat˺ZV34D JS U^`l wj8b#K#OP-S$2Ί*1X[G8ݺ@X ("R?ʬOs'*[ UYR5uDꕍ nz4z _G+Hcy}|牿G%' ~/|Wo?Dƹp)cW;x5?M[eN0Qc)ת-հ<6x[ i_.Q!I$85xk!MubLsMp"xSWb=Fځ;.ԂM+6,6Vz%} ¯822pR3zki4bSX?>_;@84, c(3"N}߰1G}]\vҮZ@rAUy1L@(̰'Թp0s0TC~1Jw7\@1lUg318W.}5:04"yN^Uf,pCJ(&w\6TO}f+O@F[4fj˪,C>}—>k@@VM n&rIqëkud$AߋbxY_ `ndӆ4:;f~ӑe#2w_ m򼛣\~x_BA@ endstream endobj 567 0 obj << /Type /Page /Contents 568 0 R /Resources 566 0 R /MediaBox [0 0 595.276 841.89] /Parent 554 0 R /Annots [ 563 0 R 564 0 R 571 0 R 565 0 R ] >> endobj 563 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [163.611 579.772 268.497 591.757] /Subtype/Link/A<> >> endobj 564 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [394.746 332.499 522.996 344.484] /Subtype/Link/A<> >> endobj 571 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [90.913 318.95 212.948 330.935] /Subtype/Link/A<> >> endobj 565 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [233.341 281.689 481.634 293.675] /Subtype/Link/A<> >> endobj 569 0 obj << /D [567 0 R /XYZ 80 770.89 null] >> endobj 375 0 obj << /D [567 0 R /XYZ 53.727 735.618 null] >> endobj 376 0 obj << /D [567 0 R /XYZ 53.727 698.358 null] >> endobj 481 0 obj << /D [567 0 R /XYZ 53.727 661.098 null] >> endobj 544 0 obj << /D [567 0 R /XYZ 53.727 623.837 null] >> endobj 257 0 obj << /D [567 0 R /XYZ 53.727 573.028 null] >> endobj 193 0 obj << /D [567 0 R /XYZ 53.727 535.768 null] >> endobj 150 0 obj << /D [567 0 R /XYZ 53.727 484.958 null] >> endobj 198 0 obj << /D [567 0 R /XYZ 53.727 461.247 null] >> endobj 201 0 obj << /D [567 0 R /XYZ 53.727 423.987 null] >> endobj 220 0 obj << /D [567 0 R /XYZ 53.727 386.726 null] >> endobj 425 0 obj << /D [567 0 R /XYZ 53.727 363.015 null] >> endobj 516 0 obj << /D [567 0 R /XYZ 53.727 312.206 null] >> endobj 305 0 obj << /D [567 0 R /XYZ 53.727 274.946 null] >> endobj 192 0 obj << /D [567 0 R /XYZ 53.727 237.685 null] >> endobj 395 0 obj << /D [567 0 R /XYZ 53.727 200.425 null] >> endobj 197 0 obj << /D [567 0 R /XYZ 53.727 163.165 null] >> endobj 151 0 obj << /D [567 0 R /XYZ 53.727 125.904 null] >> endobj 566 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F62 141 0 R /F40 135 0 R /F61 140 0 R /F53 138 0 R /F108 296 0 R /F128 570 0 R /F83 561 0 R >> /ProcSet [ /PDF /Text ] >> endobj 575 0 obj << /Length 3196 /Filter /FlateDecode >> stream xڝZ[WH~ϯXQt70 Y!>#2֭[ ̃qUj`|;~c~H up}weqa#{>!ݔRZ&Ka hٚSY֚,yT |yo.`t#Iv"D>,qP`7ki1]mxuܻD^}{O}e8ϋqqSU,:|i4f1 x-q REa`7e.pˣo.fƋV_GPie;_:. ^[zE˚6zϿƻ!hMIkyi;Q]d.U ATAH D-$S%\32 mѕhrc)碯= AlZ+a$y@m 4GT c8ykcx+h_PIt^*YmΰPd9' ȧ @#Op*1Mc,C2=T3CJ9M}KW!#0&M?J -(y嶙WA"{!7a ] < SIrs1$/*:!82ˠ2=Tp}v%\N8CN:C@\(rSIU6ɿ=C/@O%dG98`@b0$<<^#r%gݦ8ccUb`)`&0"c+ qBUQ@K !d0AuY#P@ 6/Dr%/ EQtnf,xiM*`.#\E4 2DiXn!uM|Jem"luNy5l(>Yzn{ԸW/H8X'r>|jI%Eg"~z d꜉1ldH0 R-W%B#Qlc+4 g(-*N;CKjJP~D$]L@甈>7;1!u)r/CeYnv]&%Sƪ%ତ6(G*=Xk8-ൡg$kJb̴H 4 ff^-~6;4j+S.bT[h'\miKm(,SɹTYR袂#Ou&v"Q}!)%m4ȲZIR)0X` jfvMOHlYҠ^[]'jp|6پ%\()C$$9fUIՆ"[q{ S=nq֡R:F !0Zn׾ -!kΏcÒ9'R]ڽzX\)_7~"AU#|Z3e:!H}Ez 8u YUB?̪N?AMi]'^XmHrC,l u¯eL5bq) orGC1+%y59cva.W0ۇ4ۯS T5D;xEt5vF[ ߇C$\A<>(:y-AǾ`5Лtɳ8QGG&>{qgL48w-%:{7{7jD?6v@fhO+q. B =H\d*=h8q,{4Y;*83$`[)eD %DmI 6<JckKLʪ{K#l }sXn*^Z^TWetB$iY,<l-Ur;HyyS =e̞=b8}$o=_t1A*&4AIo #Y$N^WQ^i3J~CR^|8Mw-`;U۬b%/(1#R7HxWbW;ljS5a;q#&7WYBsFF,e>ne&NE9Pv# dL_& .$Eq&Rȓ+Z`ETxR}G'Ҟې'}Kؚk dž[u]}/;M ձ]]p'.B 0VS^ Kn4@V绶_l)˥Kexζ%+0 *=.Lދl 9TA>8l7TSPٕG~X/ZM/|o b~ZţhŖ M0 gM޿jx n`1ոnj}|P GdRWbc8DMeB4}UcSQN]^vHՓfBKyBaItX 1:ÞR*&=mt&yU|_zuxBiH9 spg8{BXg6jQ9YFpcB&[73]Z&8u| ٳILO^\C%+h2ttQ\?M#, endstream endobj 574 0 obj << /Type /Page /Contents 575 0 R /Resources 573 0 R /MediaBox [0 0 595.276 841.89] /Parent 554 0 R /Annots [ 572 0 R ] >> endobj 572 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [180.639 181.2 411.285 193.185] /Subtype/Link/A<> >> endobj 576 0 obj << /D [574 0 R /XYZ 80 770.89 null] >> endobj 423 0 obj << /D [574 0 R /XYZ 53.727 735.618 null] >> endobj 191 0 obj << /D [574 0 R /XYZ 53.727 699.487 null] >> endobj 303 0 obj << /D [574 0 R /XYZ 53.727 649.807 null] >> endobj 159 0 obj << /D [574 0 R /XYZ 53.727 613.676 null] >> endobj 519 0 obj << /D [574 0 R /XYZ 53.727 577.544 null] >> endobj 190 0 obj << /D [574 0 R /XYZ 53.727 554.962 null] >> endobj 196 0 obj << /D [574 0 R /XYZ 53.727 518.831 null] >> endobj 307 0 obj << /D [574 0 R /XYZ 53.727 469.151 null] >> endobj 256 0 obj << /D [574 0 R /XYZ 53.727 433.02 null] >> endobj 222 0 obj << /D [574 0 R /XYZ 53.727 396.888 null] >> endobj 255 0 obj << /D [574 0 R /XYZ 53.727 347.208 null] >> endobj 155 0 obj << /D [574 0 R /XYZ 53.727 297.528 null] >> endobj 475 0 obj << /D [574 0 R /XYZ 53.727 247.847 null] >> endobj 517 0 obj << /D [574 0 R /XYZ 53.727 211.716 null] >> endobj 200 0 obj << /D [574 0 R /XYZ 53.727 175.585 null] >> endobj 189 0 obj << /D [574 0 R /XYZ 53.727 139.454 null] >> endobj 573 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F62 141 0 R /F40 135 0 R /F61 140 0 R /F53 138 0 R /F108 296 0 R >> /ProcSet [ /PDF /Text ] >> endobj 587 0 obj << /Length 3370 /Filter /FlateDecode >> stream xڵZYw۸~ϯCKZ 8OgL1NvY1wqأ\r%ȲB &1&jlzLYCcz5}uaA9!:h½K"VvS傍/qxklVW\5܁iRY Y?}3K<&R ch]mC Xތ!h9[0,#?@MRJDԦ2elG6?!hi!?r tzfc4>(:XNdy+ZvC&9iHbI^\*QoD]٤ j0B<(wMxWg̚iF6F-rSt*[TE!yV1n(D05**.,ʼ>6Bmq%;vxӵ-:jWJdż]Xҍ,V8tsף\jN }Wy`F=E^ÃeN2¥- Wu[;0byײ w;k!,~}!d'dT/vJccTZ0O%cX㣛ZcIV\Jp@; BCa!Y~،|,r`SK9uc 7*x6WߢO@t@u ֍V̱#JrIa,-f+\f?qdTgw}<{-(k}`B Y12/6boGcxN^EGNt}Ι0fbu>~[K?t2pLLދT%6.uCh<:ɣ{ގir`lFy^Q מDJ*|,R3*Vl#(@7p9oܟt,F:SZM M%) ܸyTa}tJ\I-`A!)vI{t,XU]O{cJtCv$?[J}hB*n8f[+ho+Ƚ~KNmMpUN>FM: CX%iH}= qB_$mB ^~&5֩FA*dmGj͞iRsqCe:M:a*RJa!od"Ze?I*6w1p_>6l@x1&i)9ӉD8xZ*/QO7"sN&+TdkyEo?Vo-rE &w%㪷U+y mkEߩWڛ@⻜vh]b*F;y rχO#}v3JۃoE1_o2 2Ðp)ݼ5/Mb%ߋ:ua PEPlAr+i<'B 9 vf{ʹx]&E1_cX5I#Y S_TЇS{e{ig 7kKqUC.IFl{᧞vn]_-v{r`6Wu2ٽs ̰b=-/>m_X^G b?Nf{' ]QJ Dt9%M!L5a(ሙ[NMN1NcJ7_ ŀ!?.##8xEquou%"^Z9G:=}ĥ 6P3v vh{I_\dhLeYx \ }~:j6ȝetoaZ˿0G@f< "ٌβ$mG IsVr?@X@k)?Ji4d;јkUpgs;Iy?@-R':Uɧ/SU*)GդT (&\i+p8ξ } eB>Zѷ5PŖGCn n9E>ֶTdYJolSIGj6)=˪lBm]l v09_>K!C&KC2`($M2 =?y9(⒓٧X3^GWsLD]W+yK"[+`,5M:X/A4Ot ÈCn`Rf5>nFb\#X]mU7pn|QǜvͤH͏fw endstream endobj 586 0 obj << /Type /Page /Contents 587 0 R /Resources 585 0 R /MediaBox [0 0 595.276 841.89] /Parent 554 0 R /Annots [ 577 0 R 589 0 R 578 0 R 590 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R ] >> endobj 577 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [371.881 575.189 522.996 587.174] /Subtype/Link/A<> >> endobj 589 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [90.913 561.64 161.501 572.72] /Subtype/Link/A<> >> endobj 578 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [423.328 516.702 522.996 529.5] /Subtype/Link/A<> >> endobj 590 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [90.913 503.458 184.367 515.443] /Subtype/Link/A<> >> endobj 579 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [201.202 467.592 466.645 479.578] /Subtype/Link/A<> >> endobj 580 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [363.232 431.727 508.632 443.712] /Subtype/Link/A<> >> endobj 581 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [189.726 359.996 415.154 371.981] /Subtype/Link/A<> >> endobj 582 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [117.575 324.13 308.704 336.115] /Subtype/Link/A<> >> endobj 583 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [154.403 202.985 265.504 214.97] /Subtype/Link/A<> >> endobj 584 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [161.112 167.119 335.093 179.104] /Subtype/Link/A<> >> endobj 588 0 obj << /D [586 0 R /XYZ 80 770.89 null] >> endobj 221 0 obj << /D [586 0 R /XYZ 53.727 735.618 null] >> endobj 194 0 obj << /D [586 0 R /XYZ 53.727 699.753 null] >> endobj 195 0 obj << /D [586 0 R /XYZ 53.727 677.436 null] >> endobj 152 0 obj << /D [586 0 R /XYZ 53.727 641.571 null] >> endobj 518 0 obj << /D [586 0 R /XYZ 53.727 605.705 null] >> endobj 308 0 obj << /D [586 0 R /XYZ 53.727 556.291 null] >> endobj 158 0 obj << /D [586 0 R /XYZ 53.727 533.974 null] >> endobj 312 0 obj << /D [586 0 R /XYZ 53.727 498.109 null] >> endobj 153 0 obj << /D [586 0 R /XYZ 53.727 462.243 null] >> endobj 473 0 obj << /D [586 0 R /XYZ 53.727 426.378 null] >> endobj 377 0 obj << /D [586 0 R /XYZ 53.727 390.512 null] >> endobj 156 0 obj << /D [586 0 R /XYZ 53.727 354.647 null] >> endobj 157 0 obj << /D [586 0 R /XYZ 53.727 318.781 null] >> endobj 310 0 obj << /D [586 0 R /XYZ 53.727 282.916 null] >> endobj 160 0 obj << /D [586 0 R /XYZ 53.727 233.501 null] >> endobj 199 0 obj << /D [586 0 R /XYZ 53.727 197.635 null] >> endobj 474 0 obj << /D [586 0 R /XYZ 53.727 161.77 null] >> endobj 480 0 obj << /D [586 0 R /XYZ 53.727 125.904 null] >> endobj 585 0 obj << /Font << /F64 179 0 R /F8 139 0 R /F62 141 0 R /F53 138 0 R /F128 570 0 R /F83 561 0 R /F108 296 0 R /F61 140 0 R >> /ProcSet [ /PDF /Text ] >> endobj 597 0 obj << /Length 2199 /Filter /FlateDecode >> stream xڕXYoG~ }᧥[q eI^,E+W@SWgxHpWW_U;swYhtn;!U ۻ{3٦F49HstW*N|Sئ*e޻Yѳiw۳YwTb;W3]K%ESa T<V8hϘݬyv+-Go|,]PY?2G۴YW^q{YZ 4 4txdṊxȿe3;n* ^,8vDxqeAbƒRb mO8ÌN*8mTIМ`bEՉz@5NF*? Z!"a\:C/X$_և>d hK8 AHhmY |0>|-mA7ɔKIT|0Q86URbk'QjSh3XP[h\F 'p'.#Aa2;\0LJC?g)LK%:h(appiΛu*f{a"N%J24 ѱvˍ`2mcSriMl0 /Ja lB@q:RgyEp?󫶨 ;IBF}Id}΋ӰeD@k I"UF.QKOhOAوZ2$ :'I.``MeֲX3l| 6bō I6B޸;,&SēB=)NP|F /7IJ"Q"E+lFBwƫ NCԉSЅ3,ћ!ZGoחQ^;+41Z/ *ID Cm(&v^Qn]kg y3]`hb@5wNUtė0NNysȕ!s<#YҰC(LDӀ usL+]k>2QCʂ*xu#"A Ǩ2)0)[g2[(CW^|*dC`#Җ?JFWڰ+v8c;қ],b`I!rS͔>_ %]0mN`ş<0cfC PNRbz Co,!K{bt=@=pDP3N2LHͣ ?@n`P./Lo|Nލ"?\c#Jd?g֦AJsWkLq>\i\F$L6ǧ9 oyƾ * JA,u]= ,c4C/p% {2.s ؈l`z" .(EI$V!n(RZ:VR}/Ax5%9L8-[,y6_v)Ϻ:=e jy(g to?hqsL?m#Gq5&&:>hL\´cg`7f"'OD %9,G%c*ks3F6}eC2@QD}ƷmP;~@Yy[Uk1to!nJg/{L+!sCvd &%̺|n]Wq1u|%i ƶ9ITn]|}(t]K. ݟpnD\ӣnZry@P.۫Ꜯe%lC|+$h$$"*f1s,H '8ᴎN^eAY}2/>V6?=ċ A[Vwop vJI}HCjXᗍz /{h jo:40s/s'UTWA-~{o~ endstream endobj 596 0 obj << /Type /Page /Contents 597 0 R /Resources 595 0 R /MediaBox [0 0 595.276 841.89] /Parent 554 0 R /Annots [ 591 0 R 599 0 R 592 0 R 600 0 R 593 0 R 594 0 R ] >> endobj 591 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [166.591 632.972 522.996 644.957] /Subtype/Link/A<> >> endobj 599 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [90.913 619.423 138.636 630.503] /Subtype/Link/A<> >> endobj 592 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [412.393 583.358 522.996 595.343] /Subtype/Link/A<> >> endobj 600 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [90.913 570.595 162 581.794] /Subtype/Link/A<> >> endobj 593 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [119.505 316.583 252.973 328.568] /Subtype/Link/A<> >> endobj 594 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [109.687 303.034 289.384 315.019] /Subtype/Link/A<> >> endobj 598 0 obj << /D [596 0 R /XYZ 80 770.89 null] >> endobj 479 0 obj << /D [596 0 R /XYZ 53.727 735.618 null] >> endobj 309 0 obj << /D [596 0 R /XYZ 53.727 699.554 null] >> endobj 306 0 obj << /D [596 0 R /XYZ 53.727 677.038 null] >> endobj 311 0 obj << /D [596 0 R /XYZ 53.727 613.875 null] >> endobj 304 0 obj << /D [596 0 R /XYZ 53.727 564.261 null] >> endobj 520 0 obj << /D [596 0 R /XYZ 53.727 514.647 null] >> endobj 482 0 obj << /D [596 0 R /XYZ 53.727 465.033 null] >> endobj 521 0 obj << /D [596 0 R /XYZ 53.727 428.968 null] >> endobj 595 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R /F62 141 0 R /F53 138 0 R /F108 296 0 R /F83 561 0 R /F40 135 0 R /F128 570 0 R /F44 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 603 0 obj << /Length 387 /Filter /FlateDecode >> stream xmRMo0 +| $$vViܪ 褝g2iXl{ yX'$;PpbHMʳ@^=ʲz%8txq7&8f=+)Dk;28?:Tfbjw£]wZ!L !$$d -O|<ڤ03]hJE ^pMSF3NܟB) WB2+Uvݣ}Pwf]q!Q]?&:|e'BmU加TwIɪ4FgNo*9j_\@|SLl6~II endstream endobj 602 0 obj << /Type /Page /Contents 603 0 R /Resources 601 0 R /MediaBox [0 0 595.276 841.89] /Parent 605 0 R /Annots [ 415 0 R ] >> endobj 413 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./kidney_plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 606 0 R /BBox [0 0 612 864] /Resources << /ProcSet [ /PDF /Text ] /Font << /F7 607 0 R>> /ExtGState << >>/ColorSpace << /sRGB 608 0 R >>>> /Length 255677 /Filter /FlateDecode >> stream x콽.MGq&*3\@ $0 A>ʌ(`t_־Ɋ\k+J˴ut߿[O?Ogk?ϟqS+qQ7Ͱ<>8 +8?+.n8t\gċSpV'j/?juY-X՚gZh5wNm7? guwY 'Ɵ'.+jO%<p O%<CGT@^8k$;c-64e?gqlvSpΪ`YqVypV;pV8G{T<:p`W?h.\o.K %#{q)\ןfgu>x;ߺDZoݮZvpOӖ/ޗ;*>8+FЯhgEna96C}V>ӱ;^4 aprj|2x~ԴSFxAf:z6p3 xD3‹3;}ԲAp7^@XkNgi]ma۞ak9Cϟ~9^Y궐bE1T^u#|AdX.sPn\ިE P/BZzu{zq>7laWأ3737z@-k 8ޗ_%n O14~_hʦ%*Ꝗ~ S<@׋m6:?Tⴃ =\xwGW8?;Cupa_3]؄GNxH-@=@t^_PP^\ DMق2ee˛!9jzgXc^n}hTzzejLMSt-9oc*&t:Y-+J6cs^7g,c ZR}UE~Qνj>*T^jB8FeM~d]/?}W8T0UP^X/C2V($֫<|[{ 'xx\ER{+zn2}MAB`f^.3J8~z<3d h8?['!sr08?yp|ڿ!P^|:C8o}­60q>A~0\WZUl|>={ƷzAuʦzAu*M-aҎ?^~p<+K︞mM0YZ}kkt=G%|=Uv!+g;i?_ Y1Vګo Kyұ,>L ՇEf+ջ#~\K{c\&3x]73IEI|}񬑡;ywOdw*ډW:~ފ|Ⱦ0 ފ<ޭ#,w+]{#wĻc9"DŽ|wyNw"8&/ӅaKޖO<ջ,[3FH N3#ĻNsMĻk%ŪJvﲤa=0|]d&xznwO]eCǵWߖ]pҺ53K;Tp=K|+ao;xw2ջw0f#W;衧)mf#wŻ͌wKn3g(ޑ晎_[W: |ߑ-rmi>{||zz~?G\W<3_mn3m=_|s-^ϙ7x=Gl. ozesw%S{<6x~Gm.dz\l9ŻwGoN)=9Ż#ǻ _9ޝxw#^!zC[\y6xw{Sz1pwZon9ix˛KwZoNN-~g`3 x=GNN))x|1bkx|O/O|;; 7o|]wGߕ+}|n਷v>8p[;8ꭝчS=;r[GzKQoxxz+;9ޱpnd}~Yߩa%g}~)ޱ_#rKǏrJzK$R?J9;lfLo9Żyg}~)ot8;+nIopMzKRRU䨷ԯ9;{9ޱ_fS9Żg}~IoJzKg[7<|]wedUF[z\YoViYop9;oSc+ƕbݓݓݓݓuݓeݓUݓEݓ5ݓ%7$0+6⊍chczqW jlߘ%ܝܝܝ۝۝۝meFƕ gQ47lID!R` `2dKf1xBYͬfj3봙e*mf6FY4s0 &nF$&$P%Q1N~$\)Jɺ$̚ldI6"YFc#Zld)&$a$(d>;EkcM8RaNx%ueueueueueueճYtd[dy<`>i [ Px k P K P[X-KVe}ղjY]IrtsauÖˆ5W KNڗO+;/[y97jnGK}GI}GG}dT*#*/J6IIoA1>~¬At.&{ 8݈w 71{8'G};,=G\|8AlT&>In#0AGObO=!\bbvH.@72eV1o(q;B<9?I+Cx]x-0!ݺH:Gsrq$ްD[;!p귒(/ PpkvtzS:HvCȃwtSX 8O voc!aͺXf8E# 0ioo,fŏiih 'CZUE:_,iu_5 ,P4Hw|~Z.9w@u?-_ }`qx7% , cxvt/ eq 8`Kv>,ioFП?$ HOȿn;RćE E5q[+d=1t7=>TZ^5$ q#dSxa~2eĭCbkגgI1CH񄌚1QȸO -TQ3zk;t u-IF!%oPJ{R7mb\H;i\ 2cQp"j (2,5[c85AoLg(DxY!El E;l1X/q~WWoc|qcXWAc]j3sÁB1>*p.8Q0 c|uK2xqЮqzŘ|kyb[ ](UEh]P^燊qd m4+8DEITx1-k1W܌`FEUT+g G(*~"*pb!+]z uec5+k\\ iu4ؠQc8DQ1]Hy-Yl+r̛Xr ko|1oziL:jQ165^q6@E*B*KywcDE|[sc|uc:ܡƭfr*mኊ1oT -=ڸuj/6n:|ё w,p{xpdQcbA/UGq zgt#"[3{G xcot8F;AEO`tr11s:j/8#ǟxx17;|㇎{(F[oX::} zc\/:}Bǔ1):,dw珎,C }_'^#_$Aǘv{ qfLB|бMo<ޘw3n:lzk C7tY|#BkW4 Ļ6 ^ #X4濇wC_@Ǥq C):26ޡn:NjܑvS}yh5}::^EGpȣwJ}7ثw ;z`[z*6wP::]Xv}ߛ[r\-wAoqMuE8O6xqNH8?wW]}JpLZU ĪXxep'ˉA쒢{s>ss=ss?~]?ϣ~Wh>\H.H nnC_:,^L= \I.kvnx=қkN)Ix'=8;)Io9i=N=;G6ﴞ \nz \h=)i8;x֫[wxpﴞk8;tpz%;63w+;Gߕ+}W>|]wG19-#G|r䨷>HNWwʧ))NYߩ^N1ީ^g[Io9-c"xzN䚮xzQToUcSpwNYߩ^w'zꅑ{ꑛYꝇWw)ީz8;kg}zo/;Փg}zTώᑣR==r[)ީ{w'8rYߩ_pww|e}~Yߩ"rw׈#-R?I䨷ԏ9;DN0/9;DNg}~Yߩ(rw=;NJ[[w:\RT䨷o9-kEN^gw;’BLBDY8%p(%0k%ȊldA6YFc#kL`’ d,`E2J7HJ9vžԕווווuוeWϪgճ EǕP< vIbT?jI'4[ P y9%V eղjY^$S 6\Ǟ+=[\6jXrҾ|rXV^yAw˹Ws3/>Z#>J#>:eQQPy WIN㠟û`%zo ީ틉^AxĈ-><;6p,{!u\9`5\67bG|z@I+q^F|qK@@%x0K@a. gqBxxBh>; gqų #'>E`$S`{O:sU_L]D|]jD\<+7ŻLx_]8F#Gx>w^O젋6'I78s̰w~Z;. $ ?H"8=?/#-‘q|~Jz,R*O CoE:v 1Ԧ w_$)$C`2h &7D)e#i)b8 ޓCԞQS;7~zBjqOB%#.RPLiOld,xΡ=Α5# Scy@hsd\+2ý hNd|(GFؘС1c8r[욅7dDF{.#mLG?5]17 9+?1Q'bsi9179ٱ͊1 *Ƹhs{xw)sٔC98aE zc:!ըwŵ9'=k.!2HG|'<7TD˘{{E 9dE{@f)*vsŊ1OIoqO1wh|Qoni|"i=;ci=Q4濇 [Ml_Ao &*\{vKR1sz ~c'_UT7D|c o=--{T̍xgri{ƈo_AoxEtL4VUǁ1s*ޑ0/FcME-}]l:j=cxMI-}K{[[zбa=ڎ|0FGG1;FG<:J,vf 9zt8cw7kў73C­G{C@az?ߋ|z0#ȯ_z(:G~_xб+Awxh(A xxCǕO8!4߃[t|˸O8nm?ݚ}h5Bbбvwty<7= :񾢣Θt*}t_wMn;]מxHxPeG0aJot?Ď=߱>_sC):JEbw'_lNow̺yGq {Л>wSsyw}7vRɱ[.:>+n; Xvߛ[rP$K zK{lczQvT譪ٮHm;]?ÁߦxEG17;]Qбt[`c8A뇰/p>wc;l}='/x>踟c;o,.3vz(8?W:|}Us>z O8l}G1 S_Xׇp/#חSK8t)3YSֿxplzX{8>|} G<ݘ#:N_dWȭ7/X"~ txAg /`v/dE:vv6Ff _8#h'r</ʑyqsHt$9Ñޔ&r3OǓʔ~TD~*[vji;:vV0gG)3:̺g ipW(m'$xJ:v:n'C۹R:v*iϹRΕ$-<p$|3΅5;MG΄1ߕǥs؃~}::wŸ]#t :Jw큎]#u2X= G.d'8 n:ȬʆCjCtnfR+|!qw*{\W<3_mn3m=_|ף8pKk%_S`sKWԆ \Rf=XOz.pI_c3d5]OMm'[n.9INNz:pwSpDN)1_txx|Uϊa[[̧Yo1wx|f91_xxx|]wGߕ+}W>|];s#G|p䨷Oчgwg))~JN=;#t~Y)8; 6Yߩ9;+"tLzK#-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSJN3;[g}zTe}zT>ّR=|]wGߕ+#2*W[zK[[eUjwx~1ީXxhVbJɺɲɪɢɚɒNMšFyfQ\` mjB?؅#55 8/ met@AA8A81Bx&Sd8×c8TY,fi3˴U"mf6D;aLp#ru5cIX1Np(uKFd#+zld96YFb,I0ʢc>FQtk 8R:91{ PW^W^WV^W^W]W]=Eט-~LK~̔LjٳMcX9O +zn̫s-R%RQQ_ p% k$k>|_~,衃^AxĈ->?rAЇE Csq@Kr_3+~WWxu#><|8v9(Sz s<{G5Ȉk~zhr pG% FAǞ4q๧7/A'Wdz㙘 ك8~[?8vwpxO SO"8O. /ɱ$q$ƢyH:Cse b=S R7)@+@(@(@amΎGXzS!dӛ] ۻw(o7F,}kݑXH8Y2z_8rKK0ܒ~% qb3dSjP_^v,Ƃ08oXbk t%Y2_qV_8@2`FFX:>?- e!v{EKn8ǚtrQ$ D0Vh ᯟP4f#=1KBbȶԆH| 1A&H=Qp2!c8~JTsĻ;z4C"3 &C H? kWJN6n:oʊ{ĖH{g>H523Q3AȍAD;c8 c:sOx(!)ukRdBFrܓK=Mz7qkOkd\[p_b Z7%37?116c e[{[1#m 32pT"mLG<ဇB#Θ1(DݘB{ɴ+=M+)* tw@/swH ,:v燊[8{{X"G0*&[y iOOzc8QhxG!7paJT ?r̛*zWxV ~6RIGiT䌯7C+zt{Ϙ{CИx(~h|=荧y1c4GEta=TTǣ=Qq5lĬ4UE_g"lccT$#3*D1oA8'A?8wWԍ缥eJZBG*E/+Rɥ!͎IDtcP }gBC`5:"G=tTG>?vd=ѱQ vtŎR8_#x?Q +Ht_A?8} 5CǍq z;ĕA!߈':Cp(2߅1?ր:,ݠ@Ǔ1[bǔc$X%:4ݣ/d#7uTeǗ1:|~Pv6hOzwzg%8m>[r̛z0{ Ry[fǜzc3:|ytc|:]/1: 껛P-]x︇5;&M/qv)G:FGqtcTtt~C=3:F](u/>xBn|^AoŶrCGg8ة:R5^kJ}Cǯ}wwp`HIpV;]DGz7=XKʱ/c{ '" ;}wvGq z_3;}ʼn߇[{x%::}:~ݸ-wp'_aǽ=AKF~YpWd&>C_|#0ޓړAR zBd,@ X{?H=Ó+<#d Ht8q zCV+C_XY{7\#fgPj 5ߟJ59cg2:~v6lch(r*IG>IC_tci'hKste9cYy&l;IIa|uRt9z%1qt9ο ySf?A}pl/wct0{;wLGMft8w&(G:; NN yUpN1ο 3ߏ NguC~)]ՠԹ.X5:Zw ]a#9A 2tz CGбAtZDGpk"y xGrb0ќxpD'Vүm+ŪW.XU_dɪYG*ZQx.'W:E*A16ll.}?~m$σ撮g?o{<36x~g|sso[:W6x~Gl.^"o=;zlsw撎zH?O5]OUwÁSx7|x#[wZ{-^SK6^%NN)i8;77^rzwsN%;xzz?pMOuʐi6_zSS>dsN%;cN)1_txx|Uϊa[[̧Yo1wx|f91_xxx|]wGߕ+}W>|];s#G|p䨷Oчgwg))~JN=;#t~Y)8; 6Yߩ9;+"tLzK#-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSJN3;[g}zmXMe}zrXىb=|]wedUF[z{[eUZ[xWjwہ7)ڱxJɺɲɪɢɚɒNMšFyfQ\` mjB?؅#55 8/ met@AA8A81Bx&Sd8×c8TY,fi3˴U"mf6D;aLp#ru5cIX1Np(uKFd#+zld96YFb,I0ʢc>FQtk 8R:91{ PW^W^WV^W^W]W]=EWϚ+)cyFs¨~Rϱi[ P )@{(u-k%V eղjY^$?\:rsaeÚ%''Iaݝtw^ϭy57b>R꣤,>:#>*#*/J6II|. AD|/߈w"k = /A"pVx"pVxu#>`zP8% D\Qħ@a.=DF\#׈CAzЏń>8}>g t\{tx>Ocx=mOێ}OcOk 'p=tICL8/p~")O"zj xw<zCxr~VgzCo,ɀhstAyOb=Rґp%oDC @ (B;|ɕam jl|Yaņb}GnIpVčw}M]¤)ޗ(A1>2,~F(6]cYe؏K2C&7Ptcg,&q, ك>z9{_F3>0v<{zO5Նك;N 7Ć\7~Z, oō/(n4!`8u> ;"yae2I$M )KH$\ !sɿdqL唂N&zdcEY-IT A|H0Se$^tSW/׏VɝiR1CyJCҸ(3n{6*#W eƮt ̌^ -3E{2cX)3L.UFYrqf0+#Z eLdeF ikt2#[GƶhXft Ao=.SdF,:q.r(2#]e 3hxǒt3#2X1zў̸̌p`3c2Qd_bEkTɩx~8Ԫ=/_W}GEV*x wE6:Y15|Qqy +2!ȊMT:T`WE_'<㠯ڃ:XFEn<*^6 N>oV*'UԪ\՞߬U7V[}Ta6+U_\`EцY'[{y;-U9YԈ*6,娷pfEߑR![3֞^{[kE_CŶVtG^ {Tþ*/'_7ގCG=*az\H%cww=6z~TБ;~6yhM{Db'vdT}U{cWv|T}a!U_d`=qbx0cq̎zq~_S5c쨱?Ao=:rҞyhyVVuÎ1c=:ŽJG:,:t?d ;tx~#HCߕF$;mNp#} Ú˅_LRGsx\0uDAt{tT=q/#[_HaǶx/#ܗ\4([p*;}-셬׭=/ni?Fǻ/Mt{'Uu8Fxv_: `  dBxpwdHG3@"la? [pL\  0 :2q=7aKuE7ў $8F.}O -)C NJg'=bt_J px:+A\ʍ9΅=#AL_ch(\$I2}a$s1_m䅜"O;JG1w.krWpt9aK_Hcysp$/0HgY"_ȝw!yy | <t}p^w̭1x];}8WTu~pDc\?΍l?/7~|]ws%u-%3#G=BG$4y=w]ꡣvu#:rw]wW==8C oa؃8|#=xxpD'f\w2Ax ۉW,X5?3o8wAqUQ?^kr'̿G糙;?3?Kc^~mWߛ<敟撮g?o/'qƣ wqwޗ-y6t~}B3t[:~Ǔ%^ωG6x='mnz/x~t~[:5_U eOU|J䩊+^-^5^@ίS\H+jC\I.6SOx~sK:Rocs#j;ٜXz8pwӁSﴞszdsN=_ôz*pף)i8;x֫[wZn9ixv^\x 63ף|D!kwʧl.9)#F&qw$N3; |"p[ȇnYo!f|\y |x|agwGߕ+}W>|]wMb>9q[G)1xx|x+;Oe}|X/8|g}zCXH3-CXOI1cc='qMSSc(qw7%1ޱ8;g}z[X ܓb/pKz=]OIzIww&1ޱ8;sg}zpXOсc=;q['zQoxxz~+;9ޡ pnd}~Y߱%g}~)]3ǟk&~Qo_$pOz&[[W \sCKex~)8;%Ng}~Y߱_)pKzNk[JG~)ޡ+bGw7 g}~)޵O8;O?Nz~W[ |]wz8ҳ*-Ҳ*5ǻRsC?oP>xhV+ź'K'+' ''˺'''k'K:4eI``Wj?ŕЦ&1]8RXSJAM,,,,Vn+K7 + )3(#(#W a2UL1|q0/A3KBmf6LY,fh3K4fF$(d$dd"Bt0)ُ+E)YY,FVd# rld56Y,d$d ;eg(:5a P)@J=+k+K+++ ++ˮUWϢgulб< 9vIaT?j)4-c=XR:Rǖ5VeղjY_,ZVWm|}.\9p T6jXrҾ|rXV^yAw˹Ws3/>Z#>B꣣>2꣢>"ꫡdat͝dA_qWhSfnčxĀv7!?6Vh7bXTASeڈWҟˡ\ zgKPUg^x rnī[>7bokAre(U o7ڋ6"0p gQҼ[4Cޅ]imfX= =N { q¨4>s:܁MSQ~d4Vi$WZk9Vv&rtIs}=\+w['f8mcIES~4xQ.OALTZ)5*1L6RT:)q*;;) `yTJdU«r92CTJ{ }xSVE(; كЛG)CEH_SV)p+֣ PW)+֕kJ5Eye1%{d[RW7s1`1.,*\Hˌ^k.B7KЙo/o,zlD\ &r.Zڋ.(KJ+7lVeԝ{/kťP\(eȬܬKʽ@ }\ÌK}\qa\ 粹r[._|h%w㞴\7n1z\̛}-8ݱL<ψIV=R V0_FU> &/76djхy MRAs'\lsC=1eTL4cil^eѻ I8>H!5Fo&COm&^>̘jlgE*LSfM{x2ִG43nZaFqODeQCFY"NƯ=t1#ش.3rNFʌc/.G%3H͗!rX3#ګΡp1cbVoQoAPv驌s=m1~[3O8cFK2c0PF9y)#nyC=$q{63#o8ґړ~sjfp G%+]{Ҳ1s*H<̺ht/U<^9+"f䒣hyT\.9Y gÙANKeV";Ug= kw钣_8{F"f/AUv]Vұ̊aTcp=V/}UXNJ]?cWÒOdrWG=ɮY{8?Tl=/D{isVGxGV/=iOsVha`żksVԻ-Agp#>o:Y>Z=1`f*8~#XaȦl;:PŽG<:&:mr|O~1]{c C{t|CGHÛ#{d{vt:^ԑEݱ2;Z%:5v^dw=荹g<$ܞq2;v,Li?Q# {Op#++ޱ#+~c [%Azb-u}SIQNMȑNQ0~ci|rSqwcwi8-}i{Xk:6hGG\1טaQG]Ao"ut<]4t8xi~wctCߵ&<˗k|mQU:Q*ee#ZcqVG`OEړV=Q:N[#Z[ӱZ9򗖍t/ȿpAוꨵe'RwU{#͎][޿[[>#͎a[|lm>8.:m~cYyu4W~Mu==ɀCǴCJh#pģc.9 }:#uqc\_4RGyrCU~Kuر^vW~OJ"#q͎ygߡaGФ:v X {;_d: HAǁ"GB{wh㟎%䈨Q4ucCII9:>O:BcDP9J DS9Rvñ/REK9^#F]9fFa9n7#Gie9v{O9Ÿazxa^HǑr$g_ Iz9ɗ#Jy9Tj:vS쀣kF: G.1I}e8̴>:tEcч]}t~c{G#?hAGGY?LǢJor4n'JrL t\#xJ=/gC}XUI˒AQa{U&74IMnfqr9x=O܃>fnf>>>>}WAx>Ipw;޿}O>~}O<t''ģW';q⥸ }ⱸ;\@\}W[+p[ʇmnYo)f|yb69)_yx|]wGߕ+}W>|];s#G|p䨷Oчgwg))~JN=;#t~Y)8; 6Yߩ9;+"tLzK#-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSJN3;[g}zTe}zT>ّR=|]wzʕVYoViYo]9ޱ7rwlxhV+ź'K'+' ''˺'''k'K:6eoI`;`Wl&1}Ha81K;+; ;;˷;;M&JBJL2JH"JBLc!` _2sKFRmf6PY,fVi35M-ܓ^GؒZ`JJ1N~$\)Jɺ$̚ldI6"YFc#Zld)&$a$(d>;E1 c:7HW Pl)@]Y{]Yz]Yy]Yx]Yw]Yvz]=kc[QϱK 9VKa>Ǧ l)@'uԱ:ZX-+Veyղj㓼saυÖ- k/'Ա, zn̫s-5(訏j+Y$]s'YqwtK'bn_K=7ٷDC ->}xbЇCqp];`xVݚ~ ~I+ x>`q_]ǹ_lǵ_.C!Xwq<8ϧ@sAx>P8wM 4.Qna{}CoÔx] L'|Swbr4f}s|h}4|qɵͤ勺Uqi۰= {S~$ 81"8 }&C]8? و yd(|mAZvn:p7AB^t?3Ao7q.LJ{]f%PCH5v7'nQ pqyP]A:톰67cQn-솓z PWٛ[2Y }`藀7ba/QEg0,o Y7©_&*CmIoK2CXr_A=vY(N-@] LCXvK:o(5wK~q^¸_ccl jClKn8-\77yCbo见D@Y >#`)C=/#鉎%/ '7uq_@$>{BZ-HAG .>1~q$k ⴃ1Ļ;DM׼Q$ SnS>ڑ2gzAwBR:{.9ojP40foAD :.32j!Œ_4Cc{HqsWdqz1g<(5yx;MG_1SDzƶEFQlg|qמ&?:18/ŮYx*ԕph\ȫY(ҁ1PX0fԍ¦a{cbl{T!d"+X[c!xp_wxwCT&}4k4 {#~oo#st 6j{sޑ`\ަ` xx#6ӡb:.q0.AZxRT#sĘ_av&eQɑ(EE=yc GrSw.GPmܞÀ{fdTɂc8Y]R:3ԇ|}.c׋k~"c#q5@EIAЭxPttT CEG.9_I zk?zkHϠ >Q}T@בz*l='M{7[ѿІ3W@E 6C x:o8Iq}7Fťe y=']#Ao\2aAoxE'X;*dEXm~"r8!ŅYQn~kEVQ ݸxŻP*dޟT1ߵ+w"7wt'+- zEljOp7! Gb'm؃ E/}w!*#}j8:n#fCz!+k7OM㣣Y~8^$1w/p~N+tވwZQ#(&G(:O5L:t<%8$:OV4#!ƃWdsz1P ]"W;G[x?+2]ztw72eȫDp,&~p<n>E(zLGgxx[>))%t~&&|̤Glo7N:<x=p&^zNYw.L"ީ=|ČwxGnw3oWsf#;g;xwΊ?x7 _-2)_[|]o~YwzyYwjmO/ݞ|O~w<+|ǣ_īxw;x?ow~wwz|zE\#.^_=%x~AωK:AՋ'MqMz9ŻwW;xwswW;xw<#;'{w84 E5L-^SKǜʫSx/pw?9isxչxsNeہSx=pKs/pf>!ף|D!5;SKwLj =SSyx|UgNzK0i5-Kw牕s9)_rSyxW]wKߕ/}W]wKߕ/}W򹁣|p਷<8-G;&rwω\4_9;7ENUc|4_vINm|.4_)Ioi>ҙc|K/4z9;^N{:4|9;G_Nّ|x䨷49-_~R|.XOpxd}zYߩyd}zYߩ"rw׈O[EkcM%Üp%5YzF^#뮑eWϪgճmQb?I?Ijy1j4-(Y<5(C%(YK-k%V eղjY^Þg{8lyްiÚg KNڗW +v<[y87hnܓTR_JKH}/DԷCM5;ɚ/}CGqПϗA-Qkc/L{#Μ)6vb7Sg->>:tn؃ l@hdp(rfqò mRxVkj94 ֔mR{xC?bB{ ^ \_]LsrD L/q8],(&52b% (6?<D3_A0,b%7n%z @{pM ܆zCVA]: ûfl wEvV;*ؽ"zްzijxiwrzjװzl{mlzn..cO:m&& LjXC?"kuD}ICnI݃: m2?eW٫-_\UB{d{ 'GbJɃ: 7H5^gf9M[(~݃ˆܭWdo z+-" Nzifd0hv09(C;9h CZ@\?Nu>?t݆d݃63zC[ ڀͷA6@=(CYջ }Z6ƆUGg=_hXP?p:/C|'@-렷~д%bH@Xjl鉃?ZO:X4ԟ"Y#ibZ̟f܃ 6ptA!YsT{؎DxnI"G)$+} lH?4in:ܷA{H{c5H1o kQ;=qB3(+7(;LEF%GdJQU(,Rr)94'GE0a@dL^38s%G%2mɁS8+ǻeqa8QB;e=O&2ևDF52⇋3q ĚcpP"#a:-o~X'zc~?hQ33qB3!1q{یa7̈XaC>mJcFұo3.wpr̟6ft15 gAS+fs5_kOx:{6efN!$یa\fϰa)o3rVHm0; /f}0cxx1"ݬtDbƱ <=1cy=譐S|Y! A+J`ƴQm"f\XYc mI'A{|cFظ`\3ʇq?1|H7_3և|1|ExT8n1#n,͘rԟxhOn̸7_3 O7ƞiF?GE_8?8ZQQ`/kT$1_p<*+䣣9tQ1ax=ܭbt2CGEa:X.A~q~tC؝6x'gro?#8荑޴@arO\ *+yzVg8N#8VV51?[\•ﴢ;Ao_ĻY8.?E{W;g;rSdCS#w;g;P#?wΌwqīY[w Bo[bČwx G[x7<3{9Qsf#O;7R#o;Usx8sn z+Čwx^pd&f#?wx +ǻo$ʗ+_|ʗ+_|ʗS>7p[Gh糝<8;3-q~Qo|L|>'pMSS1|S|*pw>ϗ9g}mY|sOz[[>_)Io|XcNϗ:|9;u{t~Y|sw>gzG遣x';w9ީxzݓ.g}z%.g}z)ޱ^#rK?IoHzK$R=JX9;8^&rw]Nhz o mpG'XtZ8$+\RpA*  ~(*sY48pZnk .o 8l.WAu)ܒCBG'bz)h̟tۏ;7oYib.'l:(y1R: --R_z49hO) .!cœn/͒rœn# dQ "t=9#t 6:)렯 w-)v1@&nPB0"xz՞FraH(PK$2W؃0kx5X~n-TDwxp[fJ_ו7?^j Ǻ _+JሷScUVObjyNV=Vkbg/ay[Xn-9ԡá}w^pCnqV+88}Abk6?^Qm xG:*h/w\-s6?^nW`EyÞHOq~؃nq V'od0+[~]\AQo=-xzo#X<b'Ҟ+zqa }[\񃎏p72*a{8N4rglkE6LFwxxGފw+]ϫxx(pUaMy Sb;P#?wxp\6GV╎_[_ Ybƻw:.;g;nx*93a 21y+93alw]UΙt|x71ÉKpX*93u}Gv}xGv}xGv}xGv}Gv}xƃ-xQĹx|sN5SS'pw9or~rSʙIo)ܲR>͹f|sN<};; Ww7:ʗ+_|ʗ+_|ʗS>7p[Gh糝<8;3-q~Qo|L|>'pMSS1|S|*pwgǛ9;O z[>ܒ=]OIzKΜ;/4_zyxYirwe}Yi>rwώ#GQoi>/Xpxz-ǻ';+\N#;K\NScF䖎R=I"Gz)ޱ%rwqfLXo9Ży.g}z)Tot9;+]nIorMzKRRU䨷T9;{]9ޱ^.g}zYߩ-rw-;]Nxά׻R/ϤToxIzKSccX/9;[^NKߕ/}W]wK߱4rwW]#'z˨q#xz1ޱqhRbǕbݛݛݛݛuݛeݛUݛEݛ5ݛ%kX,FqB1=` l,`w|RXcHAYvp;뷝mgv[YJBjL2jͤ`}5l{`\\l)~qŒbRmf6PY,fVi35 Q0p1%u.$`XRI1N~tq(Ŭɞ,ɞȞ,ȞǞ,Ǟƞ,ƞŞ,`X0,bE0EƵ1@vI #(.F^#Kkd5Yu,z\-^\I1%#FeĨ}`ӼRbM Ћ%(XK[X-KVe}ղjY]+yS=RDxR4M-*XtEFZMG+ B+ F+ JkW Ĩ U #4 Z+ ^֫dAlm~+^W4A*-ߡjA6ޡ ;]m>P`XfArT*X\0F͇-xL rLתGAu)ZyBdW+l*: kAߕ RO`0 ((\E|Y~SAўXa-p2Wԟ? _W狂}OزUg4П|C>zp ʫa8(\E`Bye`d}0<.'CD<& W*N}wl-4tOG*2K^8 pR )ahZp_b̠ahA jb>,h9Ȗׂ4-@ÏO3T|>\6X2hX*\Pix*\Pvh*y zK+DАU&\ae ]+UW4#؇џPV? gghO+ kF<] o4}ud;P4xGd+񈆿y LaPse2!>]?ȐX iC53'ca>E E- ZxWӍc~ L_M-+Cӗ^0n+MJPme8 ZV#C:]i2jYbx E -s ܳ+Rep&T{rd:TFp)л2kyq,a2,oeh.>chcߗv&ޗ0[~S}~`>A*ߗ/\'3;zf󠟵ce `tCIw3nmIO/q KX|Gܜ9<%`bS YE,L/Z+YY XYw^ψ=l/wK@`hq'bK@̋XY!b^dzpų`ƳwqB?KE`.ZqK@K@K@ij)-5TI I=S r+bXhZ.b%K01(PGԈ1@AF 9b P / /00R°"b۠$b !M.6^F[cX-b P])@axQŚƨK PF -l5lc6t8%`1( "ŚRK PHx8"1(dS"\ř29hiQ t%aŚ \K PH9"qqŕ2wg P%+T dU*YAJVP%+(C#adj l g PL_|bb)=(&#xVIA1;~1)(wRPG y-<' N9D †CtG/Ź!@q&&bPljg.&9IAqbRPأ "x % N9b.bPbg/&ʋIAq3bgR/&ʼn؋IAq7b6 #a O P8RŞ/8/1)(;Xp1)(VD [<†-IwGaJ- a\)@bI 5 cBIzRP,O["ՓbŤXwsEaê5 D †CaQPtqZO P.&*1@Xv1)(V8†e W6m8ae' E UycgPx1)(N9JVP%+J/fUBe(lP1 p^lIؠbM K P>6iVӛӛӛӛӛӛtӛdӛTӛDjT2('t @!9PD(vzbBӈQNI$vH;)Nh'y:ZIiEł2x 蝞VPz4bA~qP(hh&14I ͤfB3頙dL*h&FL`t N5XFJ-0D  <,N+_yyyyyyyyy؁yȩDQ?`X NBDI*# YN=FHf$m3Iٌ$lz5=ɚT |mN+J 8/] 3 D{N-F8j( :Q6bZ1-i$LK %Ӓ~iONqniɦZjiq阜Ic:;tV4ΙiJ+YdJ*YdR$Ď(ni}PfiV+YW 655l: `q+GGڣc{8L6iV}KqۓGom؅mѩ{ѱrh΋Mg%[5؃N؁DEoV?Q[LS4Dk* v6kj`;^]]ju)u,ܶNh":ڠ_TM(M/J fm-/f ЬEۇHBUіw8ڄdz}sp:o8ܓW4{We8khcxk1nWY8}L+lñS8p(NO(M@ w x$|=6[<#Ί1nzsέz=ZiJ8n>qw7;On*A;ۂ/$ rSpn=m;3pC8Ew{(O*;v$&;[9d{? ߹ 6[?b+0ËPGg%C1aY)aPgHUz> GC>[ !Yvun筷wü>鍶!`ܵ܆5:vnae_BpC1T0!ngoogaIR>?RwraYb[1?3GcmCΈ(x2' 0CbЇ6H_ zCcpSDCEdQqH|=R0ľ ׎hH !(Ekm)jfomBeШ,&rX' 1dZe L[ȎH/OYRY;8<6 봢?Cvg'[6 +oF&yơȑ<|pe0VA~shrd?AdNa^ocۋ|Y;\#2'^=K(fJH~wSqoZ` jHc `fy.o\jR'>lcR]GmsKt%4XXΚ>*n&v;F'ƢԴM):d4*ƍIY&_Txh WW.cu-@HړƹCNN 6ZSx7(Oj iA}Va _Ckm+5PuԚ6vKk RSkT#jfRW@UkډzP*@Y!./m\گVz2 `Q`%~nitߡ^`j&&jSkrrNN e׉;-t <ƁZ&VdAgw.0VɲWj #BsSa-`V``։` }`Am{],u8a}ygޗx^/Bj@w_ +1/htѹ+?6Ɔo^C]aڕGݗ{<Ӳ! Ǯy4үѮ ݺѬk ҇r©FYuJ#}yItnx " ,0?\eGu\-7׭b8IUڕ\yU\tnexGO\4Ґwc ;.ܸf{qwӮF+3N@#>MomZ.\p7=L˂̾Lˀ9o7Anۀ a^ۀg MA]vg#Lw8ۀo8[i%G+ [@xk3 07O_ #sX"QXʉ,GdӤ6 s88&4tqrm=2@9"@ ]n8q2@9x06q[@; 6&j_bU5PͧQI| 5_`͗_ͩ|ck5?Y-nSpV K8D <`g߱ת旮Wұǃ:;xBc a %xrl<9pV =BcgpXY)8pVމ8pw@5΋qKnѱK.ձKرijRWNTGYI$8pV.0K8+'DIec gɱă%jc=\ 9/A"1(@1@4uec P.O P.w P.ʼn=(Ė{'<S'Ͽ?ݟ??+$$Rqck oſw 7nل_rp&fEKo_\owyd6K}Y;EW}$Yӊ(Rw3]>&_9wxV·k;x?X={V_=cl?{ByLg>gğE3gf.?Y~.iѭUs(_mVg3"aqOS~JhSI9cSV3gE36x? ks/N7?Έ 5*v_ء_?c?ŷ#olBώCg$+tqjNDG8dGQy(WL~M @@ǶtTy)pq ο80z ҟ_7?@6 6fS[\蟟~D'S$V_\onBe؍_ ,}UV_P~|ag_#`SKQٛ1wmLqVC:'aQ|5_ٖ5i>k?nm_n8;>a~ώC ׶ѾG{/.7aVmW}KkT[l9׿m\ض,,n[YbğN1V 8#\#~|n='?J>}۲e_my׿mn[Q۶ȿuS^3BTu?GW֪'ȿާYyD-׈}y5޺Ǐ/Z??X]!G}y԰fE :Zt{a}#NGy9=g -EzwKE/һ6ie8B1[fnCzG{#_^onf*fv1%+ʻ|t3<~Ezy3e*N|?0fƙ?g] I?g]?g}3rYϰ ?g=oIXbtiOӏg-5uߏ?;c/q:>_Y'~ݬfçN;LSO+Nc_ǖ߭c-ßr>o<}nt4[{C~_7_熅7W?˾Y?s<ߖ|h?#s?#}{wߓm;0::W_~Ym9`[k> ZCX@|q~DYRܖq30ז͹ϟBn5c=4<֪̅٧}c ^x9ɻ4_h{[c{1TUuvw[Y{樥gڍ<2s)^~wX͟A>fާiɫDCdk,[\ve=M^~_YrT߃ۋx7'\ndk\E~9 %=A{䢖o\Gŗ@9b5><'X*KxVؾߟxv="fw_x}e?lŪ_a# tZ3.{x=8%[<8m5p[<lzއx7m.3$WrGaYx >Y1lI>L}N,zqüf5kg<"x=4}lkX9<[ƹa k)ةiXZ^f=y_ok|ck.2Ѿhx__}~ڣi?lZNx?|'9?lZ_Lv>韟U{VZ[+v:sg|׺aƳ]XI\vZ/lgKEJBwoUlkՇ-5ƃmmsY{6^_?wEWħԿ"#;+;D}׎SÝE'?wۖڕ;U~xfxmlgG+~܂ס=~oOzNGV]D<z^sg<K+^g܀@~vg7g){#q(}}6^>}YN]xu_/xoܯ)~qC]AکO2_U?sWoAʕ#oU<+Wnr~_E#?gR$ކu6߳w~:l+w:ΊC>YE0C<|;Wh߁U__(z,g?cm+|ٿ".'X>|׺uWDߩN_ oaZK p}Kl]g׻ѿnx[+x;t,,s@_4~y_Eׄ_?/G"U,j;־y$5=jDy_s')%] :<8_7_u p 'c|F1磑3o<=>~=y0~-OO{Co.> k0D _p3Tz+"/Aпj7Q6Ww]2ѿ6]F<_'<zpcqxa3A?H'UJ>.oOLZ-LQƯ~UƯSߔB\bkC%;W_9^xa ^+տ~ K=y!XSGbMuB 8~*W?wCʍχ7Wď+Cx6D{CpK_:p^7שϊocZ0YއEnԿaߛVBi+ǫ7|\ U_υ2Mr ׏şJ^H@"OxZG}S?-c:x_+1:1P|yQyqqnWGQ>A{4~@r{ֿY'%'xֹy9ޯdG%>υxޱߚF`2ĝٗ|0dzBܩ?:+xzzxpO}0ӋWn Ys;o7@~n.2Ï?~5w_qzxAXzqzxan\/m| 2*Q~?_QjÜoeJ~1hpç=/7gLOR~c!q_>_??o3諾5~-=K=ѿݯv|׋x_;@Q;n @>(_wǢQyUznTxzߟkr:W=4^=Ư~_?gtyePv}q8u|Wij3 sc(?x4߅6G(? 2_ϒb??&#w>ܑoB_u^aޯ+Au[cqbW=l?zû{,2 Cs?ElS;[;lG7OUCOG:u+{s;0~Ç{>C+ޟS_xk xy4뱎%3?xL凗xD|;o~,_9=,UOSѿ6=x6oyvujd-hI^#Y4~E?+7=c1+ mofE~XS._'ho̦/}φuòTrd֓@̎Pz9F;qx@t 1aIyϟn`|ak8}͉z'#?oW|\hU߷f{Zg/\_B%wv2IU5TOg=]q[s s=h;!~GT}ާ=[_xA}v~8ߍUvmx[W|WEZ/Yc<[Wjk =7SxОwQ~z͢ϙY)Y|zMz~Xǟx5>ި/T~fOW{)?W۽ok|Ff{P&FfozyC^SzMj\mko5^k^s^k𚡿~WzM/f^SaoUx^krB&ևٿB,loW= zͮB]8ϯk"~;4~ zM?+|zMC^k6+wjoz}S#aw=6gީz!^]hl|?O=wi zͮտ}yu}[]zM`i05e~<^zqㅮ5ߥUgfdS^uSWk߇UߴɌg]]տIVKV="OSoq~C%3g,7^?0kNh\~M^/afg&s/!x} q:ȋ~I|kN|ף*y^s~^wij084~XͿFxKEsZ}׬:_kw]ɚd3_k{Ud!6 Oc&3sfn~[ꭟzMW^U}׬=5x[S>Կ"ޡ;ľ2WzMŗ6@Ѽ^KCkГOc&aο|^zML/}]$ܣlh9~E{C~cox:XYi]h0/Q/}?={F;}=ϹSD>87<}s=q_Oy^黡/hKRt橃/2n}/:}5\_zo]Nf]B{#y~79+T]7#軞'xB=ooQn]1n?'_z}sy<9;g|OK?:~"O2ŬӁoOI|]>W0_9'}TO |?/>Ñ/%_`/7t"˗u:E>':>/}ɗ+/xK]#Y/AWKoq}sʷ/_d{/}y!assҹҧ|U>}u;ҩ/?NQΔIyys$_oCsV[ga=sϛ4H9}>AYG|S><$7sVޡ[򙷠ݗ0Y> |Zt՝/]'}隗p_/uDKaWKoʗ%_:%KgSt=t}җ|Kk] ҵn|7"_:}~xI_z}~KZ7At=Oݷ;<)//yN-?K׺k{]u?ؙ^gqlOa0@`ө,;~$+ݝNخJwN\M[?G Jfߺ~+YW:d|gKåeނt]W ǻ]zMM֥_:m9w<\z\O{ǥ{u:<ոnxQl}?$z9 kӥW<.=|:Kn]ݺq>.t@n^(\zu~K7vygr{N^?ugr\z߶G-3Kou·)\zq>K/.]:N5];_>ԩӟ]WM>.L:gt].]KOgK]ҋN׏ҥw{sեnqEۥG.t}sFv8|!qYd_"]Htҗ7t啸IÈåש\=W83oq#wX| nSθ&]zgboWkg߆s^Q뮺s]E{\y^^rc0?\C7Nf3Χ.}wKw8]ν:SgK/ӿ:yteuΡ3/>.sa"Bp`6y":[ҟ:u篾<8+'Odwt}ӥg;'N'']eK]z:YN>CGD_ I\hWm]C:]zYܟt]yftm;t'׻.xԥ93^3tkZ o]y'q7v<]zWKog=}\yt/\޺tuīK7.]:NP./\yDN .#]yuw]Gf+۝8mu/ۥ㼛x֥2^~\yRtoZᶩ#t{>k8?mvmg+K7/vҋyׇK~ӥR~K7 .xtvg]>k~פMfW+-ut}\tJo..}/Jtu;v5;y$.xt~=n4]Y]ÙWX_Ofѵ6O~_qxq=K'ojKG~;|K/r񚷮x=K7t[02Z]tG̋@GK׭Sѭ?x|/hӟťsեqe3^3]ӥ3_NN]vBG!pkԬ#T?.]'ZkvkFSt+um\ҡzItzc5m8ѥۭT>yuǥwnoxkN .1/S'?GܯpyӥNh#uggz.=_]Uz|^g:B8˺hqqҍ:\:N~¥KwZ^;kxKW~1]zm:M|>.ϐ.]K?_zqWtW]zq߮׏Kե?xIKo췦KgH~.K/̗ӥߞ#xӥ"!np|Ft;\>.pJx͸t?]m5u%'.}uҥ/{]#t.]z۩;+\zottn҉ҥMuұ8]:^Y`b=P]z _ׯ3oY{Y_yX|åʯu{=D\3&ﯙЮ֭m?1:.9S'."Lp٬sN7ӥ7|q]}{=>K7NK'N^tu6Nz8|u(GsR<\zy/l<3v+zYON^77Gi8q:v%}gxҩ/~ٟQ_2N֝t뎯6n..q}\-\:v]g|ߏuN닥KǝK_s]D]z/뜍vcݩg]z^ws|Qu u&K:3QGOޘqڏq\$OcV|9k~ԥ?ҳt˙780&L3=pҥw/۸nhè}9~]z;ǥK:Gw:'xץWa6mSINDtgueC7_=:vб/z霟X'K.?9 ެwKߎ>uЗy"Bt8b9Х܁.=]sq|so~]qitҥ?ۙ[v~zcwr:'9ӥK/gj5OK8.}mgn~A< ]UtW#FĮtgbIW[7>ܷ+ҝ.ۥYbG3l;?.}pҭoK=_ץY+"on.N~L#.L^^qKe9Z]kéǥ؝Fq|LN>tOѥw]yStl]zkO Qެ>?t}[/8V]qt'OK:ty?ѥ7wgtUKq͗סc_KO'KayN>t%tt䱊yt~=\^:[淾iҧhFatҭߪKХ[Zn\讗z6q6sΙÏg}ѝS?Y?<:K.K G:BΜ<̗nxKoM.=-.ݼt/tvؙ⎋nzٸgC7_K|?YK׵zCNqK'3[zG}h֙[p&U5|=k>ǕgXԥS;^:M^pxt]#@t2қypƩKҳ9.PKwAnW].| Enӥ9]zg/Ν+n=ᎉۭ{&^]޶3'$U:ut`}^Gft}өu7ҥ;ӥS䨗~{/6.g]ҳ}:tԥû^:wfM^p35ҥ}Kh+m5oWMNOqץq\:ډ4.҉MKͯ=ׇqyΙGK֥i^KftW]wzԥT.EC>9WWmnPes O:nϛ.YG=aqҭ3wKz.]/g;u 3'd~\];%^Z?қ/ׇogqLХ[RwK_n]]M^{YGh.Vt]ݬNc'^3U:s]ݼjӥ#]:tgԥtUeێOҥ[nt]/҇yyiOo|~bw>usSp8<\z%.d=z\z~#N.(һ/#/_μFF}qǥ+ҽ~u^5dɳ|\MեǍ8ץ7}k>:sW_S/vCg+`һӥԥg*]ÏxVwe҉O=tMG>nݼsϥKou^bu:5]gS[9ffGgkf5>.t]]9=:]cC Vo{kwיǤ6ǝ/\/[&^SGK׵bu˿nGw^瓳^n<~K~_~:;Օ qks\zM|Sܹ޼uxMHK۩>'^sz}nsK:v3rttz?]/}Ku~\:ҳzNn:2^3~Q/} >]ҩNffޗ/:t_qkҹw]r¥YnWm\Сu^9k1?\:ǧyՆΜ93kN+WYNnKo:#uK~[2oi'^kZoN~rK7.8>o~/qf|6up/;ҳ^|k^sp}\K7/vatu9Х~s1[ɏKǑIt麔^mqsK8zw]@sv?7ǥs_μNҗN~ԭn|uҋvt<DZ/.Xo=9:mKON\?z+Y/x~cxҭ7KO?2ߡΜq'm`EuúO}KNt:]J^_׎kz#?أ3gfnkm"sZXq"]Gѥ_:o.u^z]:ʣ^:;Oo>9z7ʾb}?.ݶx?;tnveK/xG< Kƥ7lgts~<,G]ytO{MmlL:7ɳ:CK.}`{h#_NtOC'}9{OZ/.p:gk#]q:c]׫.Y$sur8u"n_Ouq\zt|9͛Kϼü/|a\?^z\ۥ/?b|i\z3.ȧy6SZuKyy6M+gtgt-ҫtE\_#En}\\ftK^.}mN^52뜬K7ECr̍mNqѬs.닳9w=tt"EӕwxqK>.ݸb]p:gc}XlvڌCgGnuߺ濿7ȓ.O׈ե[I~qY/'.=.}/kusɿqGhMޗ.֟#Ptp]7O~s`q5k707 _:s9qsvw7.=:'.֙p~nצC'5޻y>5?]];y.yaѶ^ݯzxtrXUz%.}qץ̌יOY/BĝKå;Kt˸:\z8+ׇu꺹A+/ 8i\.}X;\z>.oKҽ_tƁҟԩ77=>~e׌Нc>qK:u每wǥKw>.ݸN\zw}n.~w|őKwfK~.ݸe]zХwK.}Zo|8^zש?^.K:s:s0ܛotl>mSo.93~/\z>m~\:qқ^p=]K/tċv;nX/<=^zut$:ଯN=q?]uWW\rm¥I!.]Nf~/_9ץG~[ן/^ϴ|8a.8w]zq|ԥߺzqGҳ:.Kևo|t_9y_3ӥiKOKᄒWm~\nN^u.b>̫ןvS}8_F޾[G6+y p;yc]z6]C>C謗^u_M~>t[[ѝO[^:N^o]Х۟қå׸tӥO^wtq̫6kR/]v㸹X?ҥwif&oo\^:+]:.$]:yu .ϋK/Y2oiK7o.Ou]g/:_u3^39|s!^ ]yytML&qGqzw+n^]ХЭshXzq/_KokotK.>znvy~#^3't]tԧtꌯҳ|K>uҳ:\Ц?z^:xͩ.WZt3ץ7gf8]/}yx֙3r\z}#ե#]z:;'НWm&sk?5oK_抮xͥ;oqҥ3'^S]zיڍSg}3_/Ut6]EwNc'^gtuAz6<;^Swn.뼉׼].}X)Y/}Kn8p鱍v.}n^ ]Kk^֛*m4]9#t\z/lʿ\syEz|KK?:uҩ㻢.}.ON]tN|8:Գ7ݺr!?/zg:h&m̏Kַ_}m^myҥ7pv0i#?7]e5:ӥK.Ct:ҭK'*]:ҧ$q[KwKKNZ ]/Ѝ'8qGu.yY.}ҟُJ>uөOB;ӿwf9YcC&-?Q߿bWJ_\wԹ:G}s~nkw]O踉ڼ]7w#MmpW<[;!u8 ~{~ɿ릿]S]7ѵhߺ^gkOb8ѭgN~u_?# >¹EuOk֯m~׹y(G[~ܗqù{'\M8{hhwzu\?{=pk6?{m<[/q>nqug{|PpY}D?:ҽ~{Ѿ^mꉿsG.`'=+x~M9i~n;Y? {5Onw=vcszY:'?q~u\uW듿릿Gg׎/gtg8w{lg]7}ù>Yuofp=x]8߿Oݲ? ^߾~2>}D8?:|xO\oqsϯNz}Ϸh?|ϸ?q{+p_yQ¹ƻ¹ߎvtp>ùѿ_wugwtgԯM~b|5/F8w﨧}EXu|=;]kگҽ8_'/¹g9p'pt 6k={Ko6k:+~Yo:uuumޣσ_1s?o{yuw+W8p+po?qGD;Ź>Oùۼ"v-w;g2o»n.۟9~sw[џùoF4{}3jpSg|:Ff@= ^_w{5ת~||:{{MGO|+W#ڸk8=sW~;{g|ףy¹/oڝv:_g7c|33tsϳpϗN{8_ùS]7}v~Oq7KgƑs=Rj\o8|¹}ҭ8_.O\o8\sso16~8p~swpzڟcs|u+㌯}tmssW^hJ8wG\_+O,띏_u~W]m8wЩ֛l?ù.~>Rhc>sù8?O{>ù s?op+w6q~~wq8s^_7m MIs_:k׵8h1¹){>_mf:lX/y|=ת_qp=G¹'hk蟘Z+¹pgJ^5'7 3us}i#@/m3]۟}믿߷Ц?8){q;w:x8'_b|z ~h37{DC1s?UG=spz4=WwS/>B};׹$޻^^h8; ;ο>i-]~թ_7ݴ^XosF{|c8y7Ipֳ1f8۟1_ֳ>r|Mb<%r「?K.tI+3]P8=~s_ùvKaׇq%W8s{==hۓ%]nSb@\¹kv瓩{ùK뎯|1~w]:vG <_ӱ#s8\z=8ݴ}$>?+:֎ 'W<{^׹9vϷ?{+Wù+`~b}<pއsG۟4gYjpy!zw8w~[4 8:H׍!c=>_mWu8yZY+]妽X֭8Ebhްpog:eFpֽ>K8z9s0tO\ӟùMYmӟV>}J}¹]8sXcg|׿xB5¹}_q5s}܏sj^p߄s8}=ss߿Ѯ1ѿ@׿rz\>s]=q^b|%/)=׫q'{Y#opem>\uw_v߇s8w|;{B{8~{x=q~_$֎%hΧUο_c7t_'Cz\v_|-i=w z6ùEscA{S$@6@wz⟘S1ףp?s?;~wԙù$v|]Y:fgM8wiG}s羟ùpW+כ}sI{3>8=ޅs/O?y3O8<}?sWIb 8O<;ړx+^8}sϯNU9]:%p߄s=pss/t쌯M8>c|<y?ܟߑW`9_0;o:x毗x];]E|a}ww2y{yoߠg|mqkg5Iygu|=txf&߇xM'swև:kvՙ.]'):vGn}3._?s?Y~x=V]$^ӼixF7yޯxMGssyxMKO5sǛF}_xf=zk}8ߋ{g}Kw_qkhUצ{g|tx{Gl2>دx~>8S}Ϗ鬻q]_>;+q=ѱ׸_7){Ʒ2^3{p{3Q>5q8k{;k='֎p{?uiפn}t]E%_M_~н#8ܯ¹y8i3ùpo1iӟ];MQO5{?8?ױ8__'i/֓:Jp&m|Sxi=i=͋xM qߋsB{S/[/\'I|:#psFN&}߃xM6$postK7:v}=q 񚷮r5/hSOxM8|ҽ1^P}=׬nTY_3~_ss=>b5[i͇vcu8o3>s'^SZzwu#'\=5קk3_9zO_n+#^n{s}=8oǹxͬߖe6tēĿ_/=Dxe}lYvnxNGA{Ij|SޕxͣSg3Sx͢opyqy+f?8\¹| )k]|6;$z5+=}psx'^3+#^3¹ϧsk83瞞 ~z<k>ŏx_#^:{G}.篏}O85y]CHбkNjx=瞾 kg}ugU>|so;s~5Ib| 87ZNf?;>xn֝]WTux{ip {s=羯6Eŏc u%櫑"{Opjkv|<k>:y5JG'o&?=Wp${pp/s`{s>s]/P:ťWUwu+^]{_߻_zևN^_^^^tYhttY?p}pۥS/=98qYK*.v uMG_suĉ:t~u}s}ñ;spXo>9Օ>.ݸt ]Ftycw~ 9ҧΧJX_IgܷKl3}q:)]zùҭ:gtuKwmq:v~8]:åS8N:smpU7wٷu#%W+pyҡWܦGKҥ?\.tһGèލ Kҥ]onf]`̯z8ɧK'qt{rsx<n}ҧk:zW#s\yX=]t[tvqһ/`oKG:gxtsً=9cѥϐ.|CKo<.}tCGxәӥե3Хo|;RuN.}X?6ku8]ҭGK\ExNљs϶K}j?-9Yѭ덋 GuK/Sh?{]vsvٰ3}s38}_qKGts\+Kn]z:bޗ#A^\ҩ?K=LgKzѥ*]z-}.=OsYyɧ.yn:g.=wm<5:#qMgKoKo.wt+=~[OuNHou҉֥wkt(e=}ĸtz۹9ucutѥOS]z1Ιʋq}֥:cǥ:]q\<tq[wԥb=tog7]m=[g?.v:'μx~Jitޏy_Y/dt`9?#uuۥKY~_u_:g:g?:y6>vtҍӥ\'.=ܮΩ;ouoť?.qt҇0^ܴnjK7NOť6mǥOn:q]gZN~[?Yn\.tϧzsK7Nuqb8ʿ.WҭK/]:ӥw:׬yX.g^kťwoҥ늶K_Kևå.8u\ҍs.]8k\zݔ\\u`I|Riot룕\uU:sYo]>hq֋ե7:gљS ֥WߺqUӥuNޏK_:nHuzz|t_y_m|;.ݸA]:Q}Gkܿtҗ}ڟ狼 b;]=<қzztutu;̫6?.}X|n}8]tk;|P{tT9gKtꋸa]9/sJލťg!\Xkե[Vq:SNqݼ ~q}{хW"N<ҳ{n:\53pn}roktҭK'Wp~z:Nqq鎟t.]KϋK'ҋ~5뭏c}.].]Kuwy|yz.=t ]X:\7.Oޭ}_<wqKg~zfMttsѿv|8tӥ7]sqKK7o.};p9._ɫ.ݼt+tu>/ҍץ[P|utcN<܏[ǥ߾W0Zg:;\z<å0 ><~Eҳ֥O,t;'sWn&]i?^v qtn}[|:ӥO>.< ۥw3]'N.=]K^uҋ}\uv9q_\zQl>t_åKot8Jw=6KGztyo\|x>ԥO\>tP]oKťKyqq]ХgFNt麡kK֧_/-?n9q:8ݗ.  SkѝӟQޭ]p5I>..=]tkgu΍럴omݜB\n}L\m}ǥ{+Kg:/tty_ӥ .K7v99]z}wx_?yt3Oz.ݼrn!\y|ӥ;֥:d\z:jҮC'xuyKåwJ]_.=tDͳKҳm|ǥå.}޻M}>ҥg}'ItGKw|ǥ$t,qDqMN,Nt'ۼt K??>Cg _9_9SKKwof!\~WÕ[G6.YGuqsfvsOuc13_Ku_֥?.< g_m\kg|}i]ҝҧ?5}cLKuNW?wQ|d^5za Ǹtx#^3tJfٯgkxצ#g.ݼBۥ҇n2OM|S^ҍKn^7]2^~\mܿ/u._tĥmIK77<~W ]:ҧ/qe+-tM^q_~;צ;g|ԥgjpK+qopܷyw|%҇G7t.=z\;/|_.x1]ǟUkGdKNp||KE??.zߺG.O˼+6r}.YG謿bxMU_zykv_~/So<]:oN$6.ԩ#G<etSW^so?#[g}gn;k:vXc_N'[5l3|<9{Ef7o.ϗ.M|%]mtz9kԭ7iS\u~_+?tU_aRެo^2Ut}Y{z5$~;58$N??v-Ew:\ްCǥKOW;_xǥw{s] ]z:>"qփ.zNg.K~ҥo9ߙҙ[?&Nұ;~v& ~K=Y6K}3ǥҥܘ.S/=}ߤ=sFb(޷Cg5;d}6НGK>"n8W:󰬟Kz{һqOn\yKimG=]/=w]z^yBɓC΁NzҩW tsj\zw3ZGKwF>^zpvKǑ[0O]:qҭ/K/֗ebt[vzѝyp.T]볺tͻKo^q+_oڸt,b<՝љWuVݺ.ўåjzܭcץ?/å 9yK5WW\rͺҥΤzkOf=q]/]zY|?k:u+y"/MqqI>:y/׶?ߴlȣ6t뱙G>F-'ut5ҥߪKz<Ӹ~~o\^_/9zn^åuxl>z>#??.b\ze=\CK?.M['^踇ǥ?׌ҳ~z=[uy6~Kϼtҋ#]zK^tKtmMQ/fPNχ^ex͇6Mq]ץgLk8q_o-^xw|ա'^wOf~t#2^3s]tX[/qQo{=r~ze}vW]8񚗟/\zu-lyt>ѧK/'!vmևIt\_ҥS?p'.Y:tϯKo쬗./:sݴq&N^lONDn}M]љ/,3SGzͼ/z68X~2uO.xͨOKg?*]U~u_Y?=z问jlzGfѡ?^Yxp|zyӥKӥLyo9qu=>zܴM^['s+znxMt}z׵Oҥ㨗N=#ӥˑ/]z>{Z޼6.}~\Sӥ7ҧ#?~u:ҿu]tқ75K֥%^x~ ]z8<]Nzҗu]9\:8O?]9+tIuwt}]ugSg5\ҭWKw?>]yEtե?e\zxWׇq8wKT|y.}˼sIK>Nk%<tc~.:~ҽKYuK..}x[7ǥ]a0/8ypygz|=?.tGKo^x2M<C0?>e^5m}^ӥ{}z8׮3/Wu_G]'Eͳ+?rtmWׇ|xiלʩ;koxͬD|I<X/zNBѩtqu,}iӥbtK>._GX \җq|rZ҇p}Y_},]zNݺ:uWyk[taKϼI^^]EΙ/ :$1o_-t׽㣳^:Y/}qקK:}N+]+\}>ӥwK7]:uҥu;/xKԥ.ߪϥK.ͥS~D̿uxb8]^|3_o]hcpԏ6뜷qsUwezs~;a?8XLעKϼ=ts]n~Jqo>;8EzMw8ng'̿љ5J7m4ڬ+=N^|hxNYs"pD8҇vYO&ɭc_>Y/sE|g:3g۬s?|u:ȗ.ݼny9ӑ/I|h]HgN\{=v:m9upۥ>pY/ҭpk.K>.͵ӥKg?us6Y?yXg.utѥ~ĭSgsڦ~ЕӟEK/:o:'sG7Ktzs}t^grK߯:籎.>v3.bYs:':9u`GKsgޗӥq:nn?9G.z>up#9yz>'𨗎NޯXM~Kåt:0ys\t]/}/~^ò~:ҫuNe>C7fMaסǺQ/=#n3]e=\~usZop~\zK/۝3{t}nHt~8ήCQ~D68_Y/ҩiߪn}D_7N͛K.Wc=뉋t1HsƥzU>?\:yX,8x6=?w.yet]/~ӱ; w7ѥg}8t踹Kt⺋q6kO'&&Nfm[wN~keW .}֬^t.oSn9_ЙucK'&]zuΪ3'?~?\z'.䨗g>].>Sә}?Y?Bĺz;g|}tAgNl; '\zItt_{ӸG[WN\?3fGK=p_p˶y6tM]zƥ.=qv9".n@]ҍ3}x\uȹΙgscng‰7,st)ҳ>9.]|}oKg_4]z:naĥҍC֥KoEҭKoeKoĥ7қq'f\zӑwh\z֓ǥg=q1]:q u7"]2o2.լsþ2PNws6۬s>ro?.^?.^ۓ\>|qff|t9+!]UtהK8UXEKO=n)>uurȥ+Kp'S\urgʇ7[/pȥ[SOF}ir- .2^Qt9:t&w}g㫗^\T?|srg:}ʇKɥMʥw$\zѿK#E=b~ɡ{pɩ/6u:ppcs'gs\.7>-wNk8" \zr!r3Э;.oN~1_ʥO]/Ӈ҇\W/].=7>ۇ.3C#2==CWoNNx!\}+]˥79Ǻ~p6u:|">.\t1^'><}KO .^k_.N>[ \}09Rw+kx/+ mlk/ߞu:rwiSwgE?tG}S'^(rįɭO]O.rӺyrM7.= m.}|tH&|˥;~^z'[/ȝ+\/c,r|\n+}K'_\zU:E=k_s}\}.lp_9=g8So&~O~ʙ_g<&\P.rp˥g_>Q&u륧~:OF̯pFj/қoipwakæ0Ƨz'՗KG'.|ssMO.=9z[>ȥG.=ɥ͕[/_c5t9:t~S_å?\zå˫MpպWEX[>WɥKtwK|\\;\9 <қzʝWƟǩ;L]9tm.iW׿ʭSwxS/ն˅|vɱ̯s~S/.=9~ɥ/nOr?%?&9"lj{r^+Z^=?\\\\}7\#K?˥>ɥn 'zKt¥UCĥw9sSg+3rs~?\㭗빡~MX=rQ\zN.=ϷD|\&^xcd&ڷup$pɥ_r7 ltm9ϧUҋtInnb}S.>k#59տYO"N}ӣ=c.|\ͥqkxs5Wj~Q.=ij^3\Mt ?^Orћc\_J}fr|KOnzӷkW5͙ߑ}!ʥK8u.g>;_a'x,9rwxԩ׌qv9$8bKO" M}PҋY|cqs,wE<5LJKϘ\7qppצ3'˩#"9;"T96Y35o?lj^|nb~.Kg#[/=rƫrw˥R.}ȥ?mSY/nSqRn.^mZ9H=u\҃vf&zry¥[OzS{Щo^z[>\\Mj˥7l<>pM=zWzM=_S/=8ͥҋϿ.rk6lG*^"\zҧy郳֟WCwʥ'OzrrKgNN.}ig&לԓ$n\9߼SG(Yy#]G9zpk[?\:Vr ȥs!^\}}srU;'?z~HSǿrһz5O.}sp_K3ғkO.pɑ7WެU\߃K_5ƫ\-\kp|q_.]\P>ҋ}0y^>ܜ:z}t髟\}"҉!.~cw?G>'~zsENlu҇~Ƕ|˩_pM.}YW+\:}ŒKO=׼<\D.z?ҫϷeR9rn&!{x/n|>QY/淭^'\Kg\zi>.\\\oQ^pCnRw9sqMz͆p?tSQGpȡ/u9åi+^zUoZ꫷#_r襣_R K}uX_gW}[ :B1^K!G¥_^|M.>9rAK\:rž0rW.PS9'*ZBܫY)~  &_w{[W޴5cóuvChMn0&儢@599_rs}yaZ{_ygu}_p ^sp|7p+`m-7]+som\o4\y=>{V'8[rkh8}=uupQ56ʛ+eaۅ]:z5?9_yu{m??crw]Oᚗ]ew}\kpAq︞{^ˆc^yE|M[Wt~kz|xد~u9z^7ы=bq=5~ʛkmpk<=`_Erg>}SO0k-;r>rW[ys_\{kp{<羮=ÿ_{_Wpso=ʛc^o_y<.lkxz_z^7v ֮/1[Pÿ>xڠZ=}ZgG 둆1MoJ\ >?}}~#3ؿ_ѯrOܟ R}}3#8{ڟx_{pk>؃%~{˭?q_o:~c?/_y~¿ڗ%8ԃg':C85~+]ϿvGN?-855^?5kWxd g }==cWxt=>-+n[Kn_\ֶ^{~Zi?1'x+op3_yk>.}]ֿj_/cg<.q?c>}}<GZʵXqO׋Zzıpj{%|P񯱾 w򯯟cKg~֣_Ͽ9#^H~Mw<{ޟ||e=?{k)⹉=#:ɭX_Ds}}Ks_~~FMp~vW¿x j]Ip]νWN s$Z/z1E79rS8ջ νupso-mkc7v;~s:^1!?c=ȭ߬_[rܯ=#~Hn5}=:WarO[pWį\Dlp+pc?s_{p/s_| ~cU9. Z}Bs/85v%3S.F]Npkuc8E{/_z Zk }K-+8̇¹)>c>Fp~sO6f_Yo0~"8#[S'^_'\cp~hr |pc?o}?r\;k{kp }ͯ7v_zW }*3U8: W {Ox:8uW{8~kIp&?|y>+|({?x =opޟs%?oGԯ1ruipk}'3 x&^ }'g>=85_6lkqb~s=_{ w`|ֽa~|q|,|_C~~D~ҿ185_Չu981ނso8^Uܗ?O9 \m>N.w_6x2_Ϙ列}p?;9_g~ }NZMpg__k_p۟`65 3_ ~8{+6O{?FgGaUO; kcjͧ6<88kr+W~EE_Ы¿/z_唂ss}w['kUѿ?ƯM~:_n^y 9s_\{9*c~}®wrnkOqv;3 -v_asz8=)׾3Up}}w//6$vg==;¿/ } Ͽvܗ?_')r5Wrpv+?ƯMOo`%}os88 =z>8ޭ /6O]p;Dx }kįM.Q=_羮`ysapkwcs_VlWGw#丣`sp8uWn}ϘϪa }=uIR_9ܳ}e s_~8O8Bw68gso_{W/}%WxνWXO_s?ÿ}~9s[Fpk=*'?38O.^crw9|]?85 lIFp{r_ }ݿ=~59u"/~_ƿrfgp?pYˋB_zM_pY734}#z{s쿾#p=ppWk7`{g }W*6j_7=bs_xa[O"E<5[ۜ:>>5k };ܳ=7s= sK}N^pso[؅pîG<yrkaq9+8jx_KÞ}5 ;8s_]]W8j0=މv­Uuaz[{ù~5{8~j8^QًcCTwIԩ'"85<į^515^| Zlq5x=9^.;8_}Np[K9ر{לqzܳ=cܳ=3 1{x(ы֓[/4{{ùoP/yܗ?=8yYYO9_(7*G3 o_~gk{_\S~o_ыzTp^x^3x+\w5~^s֓GZ?|^_p¹'/(>~%: } ocw~'o8rW!8ewl-i{XϾY75sN8Gs(8{.l"^c|%?O/ ZyOuKooyN8ȕSwYtItvҍS \\zrܥݩ|U. s?\zw<) IyϓKu:pyrrrU_rM>CΤʵ}c!>7N,)s?yGrU}tt&N?!y}W\n&WyҭKN"K<¥Kw>K#i#*'f^ Zw\-w^O.ݼ79ttR:*x;3\}6\:y҇}ҋzݾ/¥9ܹ68LnxK|f{aQH.>Npɥ7\q+Mr#­ghvǙyN8k􂿄K+zuҍK'o\.us6lƋuM{rlϏi.\>\zKnaxNQgr} \9ϓyN6ptҳE.]BtLɥw!\urʥg]\uɥ\:vn.].#tp7^;f>krįQgnppٷI}9{~Ϭ Krօ˥i7>үȏtl`E|_I=vqns\ur ˥'\GLuKN];r9"S _x?ȩ3f_5fZpr]|>Yb*\ur].?_S]n~.8\:vtɥʥzwj~8'ov꫷\ҝҭ{K;cG/}'tfg"tߓK7NߣN3)'\zS .sg_.=& ?WǾ/Sg'~:b/qop-\_o_kKirZr~y׬ծGnl8*N>.#!7bKOO.tr鿴}ȥ pMwrKſ\zrr;fɥi_ CupV?2~}< G|[+2?ɥ\zrs(ҍһ'>U.8}^l]/o.=: x_\ \uB]LV="?'.]I.I۷å ontENzW:.w~Eu?3έ'y񯯶}"0Ӿ/]NRǤMz}tʥ>rԓߗKWo^.>rKk\:z޷}KE.\K_m_9sE\z/S=l>MܾO+8ȕ_ѷν_]ɡå^'rp&[ٚ}_SwX|5Mlt֧o)py|<rpOɥ\zvk`/tÙY1Sߞ\rk{憜98­ݣoSWտKO.'~ENp|opɩ#ԴSpה;I.&n>L.=cbÙ~~0>\__:+هN.=9å;_ʥ\zgK?׳!tm.=ӷ 59t9wqX3uFG(ͥM9s׎~lj_9~r\:ީ#4LJSzMGn. 6޵CνC9t+tu9tS3#\zrU=tkȡ5K[}u{GǍ_ppn.p|Kg|9%;" 0$}Y+"?'\zS]*䦣^һ|6ԗ/O.~tK)k\-Gn zo.ͩc&K$۾/6\ᬳ^ysrk]c>KSGwrK"ޗ;56\:ɥ:U.}s> Sٶ;ɥN.}8޺zɥgfS'.[rNN!4w˝SG:yG\z/yK䬣^39NVrzُ3g>K}vxvrW%.dK'~Kw)~ur'&~pį:M1"W~}KÕK\9v\:\zU<<^ANpL_tߗyå9[$6Y\:kc;C͕KKoe뫫!g~KWX.z?v[3%W~G 1ҋwrå'7R<^Y7~MKKrݼ{w}xқ7_:s>rL?Og͡MS?X&H.}ȝ˥˙?'/N^6ʉ^9ZҝOһ|rS$#p93^>8y"wݬ>:rs[wq<~#Ot;p]n]o_ edM?åWǴ?mt-KW\i߁\C}D9s=!p3o!7n}>3}V.=gj"חzSn+cq3o9t3>"}KC=^zC/}ا`o3ɥ?څ:u9?Z"ȁTK./yNae,\o9y<\gˡ_cYҳFt9ͥGѕy"WξMr}^l=rp驏lj;z|9zꥫWt~or].}ȭ쿉z~:rKoC/Ŧ!Ϸ߷m 7Ito3_NY.r6\^L~'z t(K7ugp['NC/=}>twһz[G9wȥ7޷;QSOe='N+8:<\eȡ$n]ם7K_.\raޙ^-w'2Ko[>:ξ'9I.ʉ7\zʥK.=PǀKo ՛p}`gO.wN|"zҳN .=-tͥW/>rMV~wpu>ʥʥOKkotK8\Ե˥[Ǩ^unrr[/x59v?SOtKor}K[\zrp&M}һKpU9멗n]\jK KrI.}-.G^\돃KkK3OtT?>ㅓKcS/tɥO.`M^zK{p70r#b̩@;ÿn"opr艿Z:"׮^ɥ|!. >娫kꥻ\:ϳrɥW9t+}rå [$^|ݺC8ғ[P>\0~ ->:u׋^z}gK-H.=9u0Wr"R?]iåͭӯ;ǿKw<ȥ˹ɥ]ʥ?KO;UK:ʟ/~{[S߽XC/zKO>Vɡz\==c=B.]bsp[/}`c?t7\z=K:u:SN}C/=n>n\z·n_ қ}mG>ѯ|3rEr+[rKP/l~rֱ$\zrUZҝ^:}{sss}KnR.??t׾ׇKO..}xp]..=3K8c}$>'oƯɝ_Lm.m}u'6/K9!R/]!\p^:uɥoKw8L暜9zsExAK֩r pw}yԓnsl[NN>\\\zO.vI®Ưz˭Q׬;{>̏9kS'g^zå r#rE}~8MuIҶՇKtr3}ɥK\zQ{kʩp76}_K/\z/S66up-N}8tn9tM>V^Y9 uveK$tNɥ9$Yz>|t3tp\:kqёKI.],>ԣoCF.>vK,:Kɕq?^w5ٟ=һ:}Ы٨?Zjҫ4\r{2~}sBzkʝڰK/o9\\}_-5__J}; ȥ:zߕ8%rY759t5?\!sɝS?~|;jk9ܟK7 ކ#u}zܿ-/qKwU.=orå>ɥ`P\OSY]æOpS}ҫǭ'pE}r5vK/Q֓ +ގKF.}e'g nS.]=_W=u9B['?|}9v\}JR/}I}txv6x>$^>:kwr|4WC/9t׸K?\#W}ߕ9}˥xkF_SG(\}3zK!8| >䲳^s~It8׾੟Y:$KWG*Zk6lkCǿNψgMSG;6ɱ݈\.[.='åg89s#{ꥧ>zϋǩ'^s<å0q/Oxҍw/n,t^z;]r˿&^Y~y^#|G/ 7WN= {kr~1?y1^^_.懧:'nlrď?.}KY>y?\zp-rrre_'Z;[Om&+\ 6y)wN>\zK٩\xry-tFr76__m֩I~åO9s9v򜗶g|_}DmKw^O.Srÿ檜s^zѦ}=9~9:u:n 6 z6u:_m#B?._ԏr&ΗK~~Enʩ}t}^p&~ o.]>%wxK\:7S<}rmzɥs焃~SN}SoampKO\\/\zih-#é.;:~/ntu[wmn NM#\z/NyrKos_a;uKoYtu_?O3޿\g͡ͺ>tKO9ɭ˥{ܺqeɥW.׏>/63<%Wn:yѳS_]z=Kr\KW.A.ݺ{t9t뮶^pcKOrt9Jt(!޷>:}n9tqzɥ'gom3KrVO.=ʷ\ur~xkS'o+S.\zM=kbsy9KoϗKw\_.}K/k?#}ɥ?zI$nҹ79BDnCo }|pQNG/aWˡP/y7]8Щ.]-t\u~—:Xȥ''>8stcz>\z?tɥQ@.=GpY7rrY$ȩSwXΉ_3ǿV/>&pgҳY.U.e=&nͥ9uKGȡC=ݎoꥧ~k!{'wK/S/>r#tW~{u9^oٷcӰGoo-wNGҳY.37װ3Ng`'jzɥ".'%^\zݜ9ҿK/8~'^\z7rMN=07m;&? XwXЯ+z>\zU.r3ur9l.=~䗒KrU&^:[&׎[IG.e_p9tÙ{s1>髝\\rʥ~KO}]\wrkv%hr]oirr9rwt'n߶ͥ='޵k?6fpg\oDҧ;,ȧ'N>M.}s̩\ ȵ{ʉ_z\zG_SG|)n_vrur<&7WL6襣ލ_ݾ}"=x!zr9K.qw0?x?^6NxS>7uЛrW8K:ԉbիW/]_.=O~K\T_ѿ&w^#^.=ͥ'gN|ԩ'WDs)Zw:K;Ko \zoursȥgٚ+u[3ɥ'ښ}"W;D>(.$n]O!7azrN9"n۰3ܯsc:t~e>N{PٍMl;c|}sw9t+_9vI^KWK8?gO[/Ү\z{—y?ȭå?ǿu_t8דz7[3.N^w+tcȏv98}:6Y[WU.od~X}jKO.> Snnjjʡ_̙ϊ6$q'Kz]o.]Nt[/8?5Co:]å'G:BSک~ɡ۷G3)wn]-ٰDž\zgx˥mߗM_5Wɵc0tQp9uW85]¥Gz͇+tqp7|t rM=*.=9yPCtR/yK/b=m[_zp#tɝ^.=_pޘYukǩ')r7}:6{O.}ʝ?å|k6SGhȡ_ҫܺ:~5˫^zG/VC;yPg_6\z~Z񯯜‡K/^\z/r5E\:><å?*NC/:[N/p9ܹ҇:B[-g"g5;+9v".up6}"l.z>}ժ:ɩF.Kr.mx*gN|k/\zrW^49[ ˩<Τȕe˥'ttתSS+n$C .jiT~%6v9[$g˩/N".!.7^9zpߏz:}69vㅊ6:B.x0tjɥ[?!.|Ρ>[Z{7gfpI!8яO!~ה+'~Pg/^?^_gߗK!SO=Zza9\4?|˩Q.=g,^\:xrS|\r_r˥rǷY]rk69t_:<KC/ܿ?}zpz&w^xᾋcϮהCD?>uR?QO\:oR_S<;">ՏKO=f:>\zuʝ?K/r>6kWty/χ꥓?KoN߀i= wNN,K>tQɥ_u_wurqv9ȥ9[ zKOn5N~8{rwr/=t_sIKb=+w~16}ɥ"ǝ\z7Kkr^s\漣^{zOrWmWå$=ts-/8{ߣ^> rYO.KM9s)^^zkx_.]uҝ7z|0W}/<^F_aFKz^3|k~^xok.Kw$F\}:ҳқ6G\z`w?.?UY־*ߟ{<+Mۿ?7cC$D?______Ͽvsc#ɹסqpAu^r+o;zT&8!iJpur+oZ:Zs}_y:g w>\ʛ^ʛ!g}rY6ʛ>ǽ;_\q=r?[?oM<8:R|Xwc?,g\?~g_rO]Ͼۻpg98:k]o|oEzoʛ1cNXyӟq?WKùZ"]_ǫ|z7m .28xr8߫r3g ^b%^7?r3W[/x_olWt+o>_x꽯zq$~{П_yu?}}緲8oD{1~sܿ٠wE_5p~v.1sk+og^P}M }#3xz|o 'v 0k\])g ]lxO?r=%泾+_87]cܗ?kںQWtbx?9M+_ճ w=p%^+_yDŽsO:)?n+ֱ{<_l1s>z Pνvrkῂs_vc>{{*?b>k[o/ẃs_c_33tsc'`Mn垯k7zِٗ{Y6'?|گoSy+885uW z0M:~s_c/_Os_`wlϟO{<^c+r?:R/wտF_(x?ïzRo}vc\y5{|c=o={Gn| }]_|~|6ԣ_}Fgɩ?b>Oput9uWd?mjw~7Mƃz-k]{g{ 뻂zoWG gHp?. Z#^_:rOW :/v+_c<695m팿s_Qn }4sXp7;??\r˿#8{Gpۿ܏7¿w$8'v X's_][Oܞ?9l zlا==8\%l5צӺ . o{+Ws_.}|=>|b_<8u}W_џZre# xc2?Z? l3֩׎=qNqㅃs_ݎ]~1G1Yqg f0?8/{ǿ^{矛;98>ɵ+W8;gps߿78=y=Op+C¹i{yipkP<;+ܗj3W/ù)?zz{gr28n{Dʵ_wroSGgY~Y;agn ,}q{3__7_/8|{ÿZwrטOs_gܿWN =pkqcs3K587pȟ+?:Kmzc~G}}Ͽ#9^s_8"~U/,8o/g(zrW]|ַMGW>q`/s{psCp¹Jpc'~E}|&{`}3s_M8=yWߎc~+߷Uݩ^%#ۗ%8u??}'ʩ__z؟oW._9y88߂s?F}uϏC.~ ~KK-hp{<Ɵ;]'6]_Sofɭ_c'ś>8/s??6ʵ3 ǿ_1%}E~X,8=b=7}?W~W>߱{sܗ=8=~s08'8wos 8"_c<#ޏgԉ_~_Ůa'/s885߾į;~{pz&8)G^o3 gr+^p }cpk={puw&^fWn~}׾¿'8oʽOJ䕓/9x^Y\ms k>ks}pyxk }͇6M5W"'O{M(8/s+8&kGs_7+uvp?ȵ_c}s_|\rW1'}q,ާO#k«J>νs_g`x_ѫg} :<p;w}_s_rԓ_CGQp p;{S}u^¿^ `&1|$~"8̗ùnG}\ֿv7S~;{rQy]qzGs\;88n~8(_77sz"85}ܳ^=p:6:/85? g38g'%rW_ %8s_h9yWN Np[o1?^|_ Z._t`w~*8xoo ~~qpSg=s_?Eע|Vpk7\{$>8C9vq_|Y vWs18=}6]xע=y5osAfrkigE}]羞.ȧ{ pߌbvkV]5Kw=Ư7v5%rW :5xk?oחUn]Zz*>P35{_>ݾ֓M }5U~O7~}gSϩL=z5Of^7]34?L糡M~5?<>=^W$Nf[.5rkpLm}2+~Q!D~.zͱ9v3_ pkuCmkp'Bpkv9WMp~ù'o8/pY .,8\!u5#ϗz<&rpk|b/8s}gpkaGk_<$:$!z ڞ:Q }3>s_Qط{=¹!wSzkrɏ˧^39rJNUک'Ӧ^7_}r7s_a_=ܓgs_Lr3ߔk_O@3{xpį[Q _cُg|}׬=#WzcE_a= >S~_kdxùg{P|䌩rY9ԝˑsܳ }o羮cCTlzpY羟wp?z_ݎx}'9uy9v#pk9׌Pkǿ^pQi>os3އszS8u\|\_ovs$oxpυs믲5=~WSbw[}gJkswRY>ߴs__Nub&O{¹'sok&tpkMq}J=;Gx!z͘_s^08WR_Q W~:ub.#^tѷH.].ݼ\'ϩ>ҹɥ'~y|]M~V}Dͺ8{P/[RO}"w]Rɹn.\AU>0v$ș\\prE~XQ/>K.fʙå;}p.=+t|ɥ;?ȥ{r׎rp>ɥgA.].rsׇKF.ݺҧ_L.m>/rs҇\\zׁr\9Ip7.=^ɥzaG߱f.}z>pg<'.r@9%g޳ƍ>b|_p$>M0qɥo<}Xҧ< I8/kS!|w |&n'opهK.m}vm\z:ukl{'؇(n_0WbؗKOnA.]"[Kw[.]nD.| v;3g˙7 1ҳ/O.=9u7B.x}x?/ҳ/+%rgUN\o~=ۇKS3{s˥r͗uȱÙ.n.ݼ\Y\uW9Nԡtuٺ{9~Ι_.~aUK׉/]Y>ͳtsUרKN:4\k~.]Kw?ps}p\țK[N\zVK.,q:5\[;ǥ|K1usSK͏åN_C]ߏ~q=u67cř~t_uq,7_.}vr ǎK?;?jn:Ne|wکyv{\SoX׿>.ݺ_]I].=yqc }ތY/$+׺}\zy~j\73:K'uús K~izp>OK7 ׶\z׭^xϚp߇q?t&uӥ|quSǥߎBx\q Yғ=_u8]z\znNg>q駮JcO]yKOKig3\}ҭץ;ғX|uX qƥ{\z].^L~i]ĥkkr8^\S.%*.׾.ttc9twݺƥKޯғ~8}K\\:}=Oz~vu˥'\k]}t.w~y>̯/gKΩ8wK.X`<ѡSQ׺touaѥ>Tt}uOڙ_/.1}ӥ7.g.tzq8rKyO:[q}_z`_]9uu:u?\ԩS{z]8uׯ ˥OҽCť_ű߸0_>zMG?o ?ogpI8K]-o\]>g.}sӗ`W.ݾEt#t^_tϗ.ݾQuLpҽХ߆K.ݾ0t>tԥSgQ~>9Uw>;:vɞuc_ү5ݏ_ҧ\n]_\e-^qyyҭK\z9׿>=ȕKwF>͛_/a>t.On6]w]yͥ7֓L?׳ǾOt \$2.繺t/틴tݹqyD\}#u:;\zpqpܒtҽ?֥{KKݼ|[g2=9oi]tNnV]tq7]n_8\KO7}å4]}hK/Od#T]}!q篸kG3qqԓ:߸CWpŽ28ݏk׌;g>k}~\M]mKqݟoZԭt~嚛3țu1$uKNnG]zʫ^:z]LvwpYϋKO]A֓t?}gCғ>/XשеүKǥKcK^>tK.>f3qk^:t֯kLf.^{uͧWO.g?h2_9^OqӜEĥХ\Z5OMP79Y/ҧ8H\cg:u1]K7Qn.ё^֩Kwp˥ǵL}^>OgN=I7%7u_}}kC~u'zͩ3C'^S\֕!pȩg?89zM]r=ǯrt/tc\:yӗ=p_ҧg].0qK\k't]3.]O׬nsy[];u+%d|}%tyk:nyOpkΓ.XcX}nwݿ]ozw>^ԩ WzMOX%Ok .^ǩo[^ԩz_>NKO<K[_6tO=D^~\.եK.z{/?.\٩+.}r~ĥvrN93'w/u۷/..ݿ.}Wwupү/{{\4V>̛ng#_N2/}Oޜ.}noƬÒp_w2vSw} ?iΫ;vKV\nrt\s9ͫ?.KG~nq'/|E]˥O+M];KV's\kss=Wץ\:ct֛f_`LqypnrVK7Sn~.5Oѡ܆|}еۿ>c=tϝ}NxoV~yr.A: .}{0\i0gx爷_>gK.=˼ǥFN]ƥSG1yHq/@\;gs֩;އC}O93Г~֭;'/s{6^}κ~ҩ;ǥ'w\z楳[>J\z_/u:}k>֥k^} K?-˺PKߚ#yqSl|å}>fg[]kc?ay үKסf_]ܵ~ީ3´]l5HMޯi>n77ɷn'/}ϸtK';.}x;߾7?\uqѥ]Z77qڧ.Ͻ>yssz}|Kw_(.l%o<.c0>yá/@\zAy_pӺҽ{z/썱}6 }·1mp:XssP}$foơ܆]iѥ۷D>{?___O\Wѩzʭם~{zcWwN~|K_ӥ}S1uUK}tg]k&/|!\4_eѩ>%]ǥǝǥ~q&*n-/1q#}NƬ_qSGsG6/\z$u1cҥ/.ҵǥ?~^ ]zҭSԥϿ\u]w20ut~:K7'uô.;5?y۸tV^zgꌩcɛ| ]x|n]X>g=uAu~yuG܌Y/<:οq\=+y:5/ݾ.{rqW\:yӷ7s;O_6oXwH~c]KO>]u=\'c Owz1͡C73ԕg=߈K˥Wݷ..=5\W܏u_/:uiwpK'?o]ui~_ط㱏ynҳӥ~!^c_izgs_Qn~..>.:t .g|tƥHݿnμt@ׯuut>s]yӺtu^u:t8Ù:tԙ_o8?.eteߗSN~tG>.=yu=[ycwny}p'w˥Y.>quKYN]i\ryyǥ;K\:}O.KO]NI.]}K)5o)φμoKuGb7_n[ò>Sw|ouѥgHn?.ݼG՗zAJɘCW^Ř8~yp߮_Ϝz?ׯNKw~NS.U\z|lyKOpugo#gԩKסp۷Tݬ'5wǥѡ5n:uXᆏO=I\}K?s1fzʙ_q֥K:U]ƥO߿aߗGw~nϯ7^.r|K?O?{K'/w3қy'UKy_N{w9q_ť?y鸸ͥO>ߺtgV^zwl.Q]:qqo^}/W^zoүq3ݥ1Kn߈_ _O&y}_ѥ{ХogJsgqq̸tݓ.qKOK]:uqy?+kki.q鏿o|s>^:{>Q7׏Ko~M?ox_ׯ>Oׯӱ녋}z]NGN}HKL&~%_^9wػqSgz9yWOf}Uy1f~M~:+:yn}RO]Op\σV^:<>[y2^sucs_U:cljK...J~->Y׫>tK˝~%\eDwkG^cK?v'~U9]}mpӭKw?N~U0q[9}6p≯k~^ytͥ?srғ?zM|r>tsh5k:[str}3&Go$@g~0_܌K׭8-~_a:s֯ǩ'9?.ݼԖzWWN䡟sեputOBc]O5us~sͧ~SI^}5}޵5}s!ˑү5eK:oݥ/.>_u3~\?ד#qtߺ#KML&qĥ>uq8>]g~泻V:1q5_lyQs\K?.Y̯q_篸+}tw]}|-M:צSg~?֓ݥG0yW\zwLf/+/WA9c9tq3rzKw.֭'.ԓHP]F5OoN>VoY/\z9u֯9Ϻ?\ 2qrǥ>0??.}'/G8޸#&<.8}7/K}Ekg`L?xO;ݺsSסs67c`˭g򺓗._҇ooƭ{R?꿩3g_x9O_һ_+gK KF\^+c^O^zW\˩!773?~a[^'*R~{M*OQ}]\Nvt򤓗><<>tu.ݾ˥:WOk\C}orMlt9n~޿i\9u:NMrթS׏3Gg|sKq1||PÓ}Nqϩ\.yc"S?OǥGK9F\O^tlk'աқ-.:-/Օ>밮cg_)I_ ?.g9编CoԕΩ ~9ǥ?Y}ƥ׿g^:Bgҧ}!KtХWMMһ}NLs_G}qSSqԟZMǺ9:ץy'/=)Grq&'/n9sD]M}}\:_9ou:suأ39bwL!}Nĥtkߏ}NԆ_z K?>.}xL ̯y].>037kť[tq9ޭup爏c#▓:f~}t>_3fo\zҭ3f_.OB~ߺ9ogթ;[g_ѕSO_Ǽu\͹n.}z}Nĥ }Nƥ{=u:8<gytGƥЯc]vjUwӲω{ƥK?ͻNͪ{0/ZΜ/ߒn].eOQwUK4?{(.=ys#ǸZ9ݥǥm:j]+/}|\n >_]{s[KN>yKr_?2v~=Sg}Sw5֩[1v+9\GK:Ɩicw;X.:{9ouK˩s=}N\yҭKեV^:K\:K:$]}pq7tؓ>3v:}k=uC~ǥ(y'u?٨sZyucc2ο҇?.>q鷯ǥwK~Ut<'oM]?>V]gL^u^>Ӻ8;7K6󙒷^ե:f\+/z{wx\z8<\0{}uS7?g@\zթy}ysodzwO^.}_CWNk޿> /N]gq;'¼tuquǥt:`]0.e_]ucNX]z_\u[^q^uz}\;>;ݥm,u/gқN}\zO\9+]}mKOKonݐ.=ymtuqfe\üt$ĥOu:c]zq}y8^g+].>[_.}ѝSwkӡs=_Kn֥{>ғ7K=K7^Kr\tĥ{?l^u׺guXSқ߼tӖK{tڇ}}u_MǬ_357c#k~SK﾿#O^ԭӷ7tݤy:].~?ίu<2.˥ͼt{߯:sp˥f>Lޜǹ_k~φ.0S_K:䥗2/Y\t_έq&qyZy<.]7K>V8:ZK1,3⢯̯K_eҽ?.߻tǥ߾+}D&:؏K70yף#sgrLK~|t3ftrOfz!~_\}6K/..g?`L_K{t8λugR˥}|ׯ[^㋺u:9u=\y釮;]rq㚇CKO-̯[g8y3)ǾK:Sgny鮯K (\:.W9u|uqdL>uסz^8tݥXy霏qy2/ϋ.ݼr]z\<os:cKo^ϚN|?5/=3\z'a] KЙt}urϕNtDnNWn`L]?C77u%o?OҝSw8^K.]\3vԥu'#K=Nq|K>tO҇~9ynݼt~\7.Mf,yuޯ:t[y}p0?;9B'w^+/|䥓~XOsc 8Sg;'OSY.=N>ձ_㴯-}>Х^_z^::>ǥߣ^qM^3 !Ǿ5?q闯g?ҝ?tIG^rw 9BKO5֥?+_zkRy֥_:kOݜ_ٟ/Wrl0$/Øz+^~_]5#D:y.ݺ-/ѡz͓1:?tեZtKO.U] KK㿜_]yc3P雥K~).=ݯ¥gUKo\p:tҳ>1/3pӭ?~.=U.!q<ץGL>/yr֝_}=Ϸ+^|t#9pȧk9K]3ԥo_O_r ;oi']y+/ԱSOR.F~OGg3:u]ǥOqW\Cw?NNf3o9u}'GԽЩ'<\\4!/jW^z%]zԥj^?>~u|~I91oO\ǥtқ#}"7ݹyNc0KoGky:tU+'K}Ww&ou21~Ӈ\懟t]!_;ϻpkK7W}SY#qkЏ:8{\׳~Kӥ'?<9BoϏKg y^]z31'p.65f~%MN_5.>t?OarNw\::yޖz?G[s=ӡ{2z6utp\ztg5ɳN^ҥSopwH~OWSy0y]}!8t~r_mե'D~Nsoǩ[+.KquKn.vx}\ԙS9ĥO?>yzһQ.]cױ3];}K+zi\Coz,.}'_>Vz_OO4t:8o)papt_ӿ}Sgw_/퟿__ÿ>ܫz9kߴMkߴ'߼Mu2::RkߴM]t6 ν7m׹<7m{[y%/M{[giUۭ}uoڹ.u:ϼkߴ%OM8n(ν/sCԹ; ;oA6t-otJ8~|{cAޛM[kߴso{}Ӧ;ŹwEq]yޯ8ο䩟uݹWm־i5Źs}y׾io:7m'ܻ.^z6'νSso'[}6Tqmhp:վi׾iK>v?üR{my훶-?W%νq:N~ν_+_|4Ot8><jߴq}Ӝ86=_j4=;ν%M8FR{>ݱ׳zkߴ?soW5?\z^<οs:L{?V0?My8f{{>?[-M{3p~ʼn׾ip>I8\pu;.8kߴW[s_߯MSƹ7]/ν}n~7νsoCg^m־io νnq},us=}ӟaW?|{3 Csms=Kj {νM7mc}f>4νm}8}ޗu;t?k'8s+{O ν7u\t3Xw~:7m+}v|uצk_{e׾iK^x;f~=׾ic_Smvr}Ĺwܛ}p-yo#й[z?jߴtХ׾i{oZo:lY7Yףkycgpν7ަ} jߴٷ nϷd|q}W۹\{ޝ{νRqν.pܻ p-pZu8R̃~ܻy8?kߴ[soy_zsYGq5㷮87mֽܻSso} jߴY׎s{g~v֯חsoܛCù{׹7pt]Wso[*ԾiNެŹ\{>oU&u8ƹwν,p-yoù{?soS]⨻qUgsotn~EކyۇqCӯ}Ӽ8v-.y7k4#:9͘uν :ν7˹:qq6_}t{Źscx֯q׳䡗so:){7҇zVGνYׅso:{ש[~98wt-n^2~{^swsw}sޛ;zk;qޏey9Pso<ֹ7 Թ?kOx9>{7o¹7yq?ܛy48~sw}soqܛ}Ipm~[ν% Usw}so {_/7պA{{ν\qMs{W8wkuMDžsoAXg~%y=t_~1˹?s?8wu@{>8v˹W9ԟ8޺p~%߽{νs 3:?й7q5so֙ܛν:r{kܟ][ׯ.~>u<͋νѧMνDq/C9so¹g¹ߧsoqy{QssosߺYswP>ߝ{;Ĺ7͟<_p>ӹpZo>qй~羾v[~v{:rùv~7{Ww_˹wS8wt>ֹ7νMνA9w8n/=q{q6?~m=й_sw?G˹7]ν}sr<}</8wܛ}pU^'ν]Źuޟs}O _so&{'{/B{pYƹ[Osom<8Wsu~so/+=}{w{3rOy7ܭѹ_?osr]ν鋭syj:n=νӧ_6= ={{p?zy%Sg~쫅so:W{_岇׺_¹g ίsoG{q?ù[so ^}si{~ν7.]s}z3vޞY^zS> 3~rs}soù8rmsߓwqƿso{}7׺۱\A:6/ͫŹwJuUs{{:rY_ܻ}p<ס{g?ܳsyνM$8rssso8 {﬏p_68p4o{Oq5{K}96<{cùE{oeOzq|>{soq;9:܏۳SOR_s>Jo{νaSyx_kg_P޼Ĺg{uUS?;_q>786;pYT{p_ù7s?s{#KpK:qͼh{{nuP'{pۖ~|_6tW~=8Z7];;vM8v/^{}s~Wq1S|sz죊s~};d=܏#>t5pӵ[=={Oz {[yoIjwܭչg3#{pYoܭչ؟z^8t=S~1z*: Źc5_W]S׿¡^֏ZߗKm,s|ѹ7[5}s_?OkչC%5uOpWwsg~ֽoݹ>s}¹?ίqMso߿5y8wu-}g֯Qkscg?.c5ɛ\~SI1$swZ_'ק^Ե?q~=t윏s{;:^ǹCWzOƹg~ùsy]syν=ަ7|vνsR쫁so[g~M=V{>_8ˀsw_싁soqU۩so'{:a~ǩ顇ׯM;痟~?=g5qלҹ75:w}νNNν_so)¹soN5n#:c֯q̯?ϭ>GMչǿtPHfs|^_ί:p\e:wu۵yƹ[os+9:so׹:7sLޮsyνѧW?pܽ^Տ>_ݥ*p?ҽԥ)һyo˥>yx9f֡Z]c7җK>;$ŝS׏[K|3g?u>guιE]c"ps|o:X8&\q:e]|Y.119;t͑>mw9ovy犷6q鮳kiް.>RtuntmucK?pt-_o1!ez"OK?.L<~վ SvKߏKMsuKn!.ϋ.}ڧ:fͳy0s[.}|\m_ilw|z0vSwK/[֥Ok}t/gRn9Х_"Nai2fvZnқNխOCyxЩ>uqsN]rq_s_?۱˹1.=k|Wĥc[}> .ĥե_}_μUK~l'./@sCw}N>ϩCեaZ[׋һ:등0y}3gvygg33_sD7=ǥn ]}Wt7.=.Rq<Kқ}Q63g;f~\eu?07S+ƥOo]}t+}nĉK;gp֟./.Gn]˥:uq?:}pݺ\z7?F~_t\CN>'8nNқ˥ǵS>_q؇xutk&u'7{?s:빻\/]|[qAߕ~Pw;C.7u?K~0.]ǡK7FҥB.=n=_sDqS1ίc0=<Y}9u'͓ťn7r̯|d}b]ׇ1uc9ώKqsSg3:utpKy?qθt.=Cn.ywgw#N;\zK:e\+> p~:ױqc`K.aN^C\:u~o>rΩt_.᦯_oo^KK7M~~ғ>xNt>tcťqf].n_A]z#.=u˥ϏK7X?3;Icq[tҗ. ֥71.|G\z>EqwKKwcsNT]zs֥AǥǩyF`c֯CwtGҭcץ~K˩ǥ$qq't7멃qKirAҝt?.<]]˥K.~O׶q{9w/ѥ\9:ul$?ktֿn]+tO]nե{?Kw>.WKХtХ~[xܺ×q]_]z'#.q{[c:_us9u"jǥގKEҗǥuw.қF.OХ?˭SwX˥ǩ>:ql[s7\/ K7^̯^N9ڞ7i~r}:|]:}KJ~/K7R3.=}p>?KOxt t~ҭ+ԥ~.wNΡ;??\#\z8V]yt}n>&.縮U=?}0#<DZ~ĥ}ѝp}q燐?.]ǤKw}Kbs1_Uθ\z_˥_שwdכ1uХMn ]qsK.YNgN]qvt?/V:[.ҩ"p׸t }^Kom.=ϫs>on1> } ʥ[KnO~7}tW]z?ƥ(.6/~kcSg~n^.2޺tcp9t}ҥ_i\z1.> ݏ¥>r=˥ϏK7?UnU]}=KǑqtK?U#|tnCtt>ԥO-]}Kϛ.o:ur7_.<7c$|K׉қ}Iq鹾n.ѩSO|vrp3u:ϻk~.]|ҏn=^3Mf_VKoy#D>x\וǪ}\z>8:ة[\,nؾ/x;gԙ_y?}p=܏#=.'8qץ^ե;}"Owݯ8k}^uC'W|'}:crҗIL\zq-}K8q.?9BcݜկrL_5qҷt0sgGn_\z&GȿL髆kzMSt֝ҭψK,.},gީ錙_~T.Wtߺtt+.=.=OK.-ˏK}rй$wLK̛OfƸ'bL= yϪ%ߚVzͩ3w?Ng~nst֥曧^s}2^8oԙtz\:y\;Wcơ;gt}w˥<&.b\:qޯ}>֥{=ӥN=.~2>6~i\:q\:Oqs.7}%>.Yv9U_zͮ+gZ.֙'G曑zͦSg~ׯ"?zM+˥NK?K~Ͽ\-u7N^tݮy闎98s※y|&9u~:CN.;yӿ$y輯pGKtĹ 'T~>0WgN!|1L֍[uqۺgwKjKtGL:/t/WwY'N:wwq;myc[zpn^ŜOߤ)yq9^.2 ?ҧg~%<.V}΃1}6n:;w>'uH[^:n9;EҟY͏Kߜ9mp鿉3Yus~:W_\:NtO'Bץ˙yoq9ǟZǞt\0o8ǥL\ғ}YKw}a^:ãKngn>=Nkoҿ.|{Kn..=.~8鋀K ~ԩI>ԵZW]yaSk^z7}Nq#ť[KYnIKMi?ᶻҽK$o{W M^zׯN~Nk[˾/]w߲yqsUw\zɷ};Nӭfw>'KO^u~\ -.}cU͑7^}=k}nn^.|ɏg]O҇y3g:ҫNm㦻}6RХjV^:nHؾ/o֫u䫳~re^uBίz\gBn]yG֯n>KoY/:ԥj^z7c9b8W ҭץ_߼v?[.ޞ>{ݏutK^q"ǥϏ:cl܎ouq}ҽO^NHn.s=ӥ?Kχ.=no)yهqǧnW~܆ީKť|n-F~rҥwy:?]z\:t[Ƹt6.Kc9t;S.xn_ \ύuW]u+/˥ǥ~_\u>zNC}?ust~]zuSZ.]N~%O{=ysu"<ЙsO:y8GUW{?u&qKtq͗ե?KS]uί<׃1u:=zcOyac[~[Й~?.=?y|gڇ\/]>yl#ϻvs?r36/1]Ki_\:_y鮇K'/ D:ܼ8|KyЩzᛗysgғ~׳C_xs6]ue^z7tǥ&.қz\t'KϏK֙_~V>3'[\q|m\7Ìݹ_:}_^?]øt+t>a~'r~'I~]a\C_/'c\N!&oαϻ^S~.͕.=}tq-y8~=}_ץKtK.s\tZ.=߯LK֥ӥt\E\rgԡ[?_]f^Wm֩'ίWf?|ҭK˩Ssǥ;?GHvlf}}tt.aKO޹.e&u)sk>:.U~^ԥ=\ϿK߃˾{\qP7$kK_O\zunCts\}ukțy̯tťӷ!yytGgn=oS\:ͥsѥ?O c\:n!.U]P~.zM#z[~[2]_>"/8kƵY:^ҩ8]9ϻK!S7_aL_֟q6\zK7^x_N^:t~}txtԓġ^(Kr=}s=_~WݽukOfӭ3&zq0fx:ĥ*.ݼh\}#>C L+_OSץۧg^y=9BWC.'>y>̎K?Ϫ/)׉K<ť˩3:Θk9_]8tԓ$?]7>t}n\ոtsEқ?yNݼt}u̯uѥ;,N>w͑wݬ'qݥ'?Vn#9BqMwׯñ}6jzCwnw~+OzKn=ISu;>4/=nzMtl.>7Ň}ժO.6zk塳~m:ur^[cꇿy^Kw7/}snxgǎK?=طO\4.]}/>C|\ɺt].铗~TW^:K?wnP\:9qqUOrKNǥ:kƕ/ť~頻}Kt7tԷ'/~InyrpЧ$So^cg<ݥ71.Zy>թS9|=}^ݹ}_>.=C$\1W_:y?ǥ?=}nKO|5ݹ.kƳJ˸C8t0'?}^BeʟٿKg'G6=yCgK:urK~p^NX譮owspK?uk<5.zFrNxzKO:sѥWH~ʩ|t$uĥwrS6^O]͘|q?ǥ>uKn/ӡS1ts]\:үyxq#ߞt꿩3ԥSKUgs_NJCĥy]C6=׺1.]j^NC>+_wަoˁn~.~3K'_NDә.:uǥy'9"^o~]:mt>O^yW9\.=yb0U系t^^yԙ3O$?|rww9r9~訏SNݺ'/ tyyx?.Wǝ:qt:tO=KK\\N7W>ЙqKߏKO>ҹKc7kO^zK':.>tKե:|tmwt%/{qr>{ߢ[=:{s:qq&<>j~98ԕ9wynsҗqIƥN~9n}κk{r/]ema/G\:s10ޟǺC_C?n]ظt/>qMwξR]ϙҧK/OXg;GKO]i~wһݥKIҧN>MW~K9Rқևnn|uo:?$_tt9qNS.=\ϙ_Ƙcǥ'N;.:]5_:lzfԩ ƥ[~/Lu?XQu&J}w;E~~~}WgNNԭ׭[݄.]瑼8z!YYlOt:n8~swFOżs^ p~Ł_coNǸSS.>g]tRn^g\tR\}pցĥ^\z7=9ξk׍ߩ?].r'=uY/ܻKMמ}۱ݺԙ7wgu.gt%O9\ys&F~7޽]KoCg!߻g鿩d[>x\U.}g?7/}>r釿z!yO-:\z.=utݙ.0S'ܬI~:n.:Ӟ䍯nХljҽn.ȭu#9бғ~ҙLcs^'/=__tqSK+C/%OgRCt0uχ|aq_.ϣ.?ETr鯯zWN?:KiqOFny{_SmU+0yͼ9˛}_N1ߏGgNߗ1qGyһ .!]z??|Xu̸˥ۧ3.]ǤKOׯOKW.ςKo_?!/|~mzz}\.XW:H\ArKv.]zsu:cg'yC7/}0f?nҫ:aoۧmѼtOw\u8_]xs?u}=乞;S(.OEY^:tWa!n\}:Vnݺ~:|Swå{ť_ǥ_:tO.]z^wa?eK{[z.?'?77ts>.pݼd\{^Μ]JnU}t|\z3OQny y~qrusc/zA\3n~zɟnί_~u&r齯g՝9uƹۯ=\Еt<L~Y\zM}Kmu2?]os;΄WUXHv`380ىq`v۟ެJT_mbZȥWp3/knr&~KK_ҫ:טҭۚ\uҫcݗ)gNȥyty+otrM}gKz֥K.9z\?.=rɥyȥK\zU_Ru}rp&џꥯW?=pwQ6vʡ;=؃M_?\WK߽z驯>O_.}=W`9zzKS."_*Ǯ>S\ߍ{ɐ;缫Kꥻ?KFp;n`8Aѿnɫ6\Gr鮇ҳ.zuK7>^zԵM.|S/=꥓WxpUH[ns~ɝORsz0{=zU\= :u_}K7Wr5l"N>#xr#%qrUS/}ʙ~_.C.]!ntߗzw9N8{t ʥ[gR.\}^˕Ao]5һn.)>/~Kn}Ksrٯ֩chsKw^?_.ׄN.3L&N>IS'?9qpKroS;һܺKOnU.x|M׬K[::BE\.]NpSWmʭ迈ɥWIrqПs?!n]C/}asZu#*6u_כ3RwC0\zqSN}yj/pW^OftZЩc\Mr֡K['_:=^:ҿ9˥~_!{Y}L.^.{s*.7`SɝS*+u9Yr#Kp% rkXȥ[P.ݺ rP/]*n.=gpoҳ.Mҫ:V؏*wZr\kԳG/7t\uK \|mλڇKo>i^|)E~O]~~?8t&߾= |M8׼/~ǡ^rM.d>Lӻ2_nQ:̷ףȑ_'*䰛u"sK䲛59wt å'zyD~[>uy=uKgޑ89sc&.ݺ;5n'Ь\2_3sϛ9$]!!B_U.~˭?1?Ή~:zC|ҩ&n]+WwC.ʱاM.+-rԱ'ܥ\ySn|ͦzrqs>墻ɥ_S%S1>Q%tH҇N_3gZЩ >'qȱO2̯xS=q^\#G?+'>[gQXƇS+[ဓ;K+N.=9жΆ+8ǒ:BpɥOۉǍpɥߗz%k=6\gEkp;Kr|f;a8om_/!SGˡklG/7wI.9+G&Oyɥwꥣo?>ɥsz釾pLB[9tλܺpȝ߱~|ͬ@fS/ֵ;t$S.ݺ\zor驿\zzupyԡK.].=9ҋ˥{=ҭs~߬ҫzkr盼!z_'n.e:B?ɥW9s$gN]_b;a}oxM*N|xɡ>|#^wԛƇɥL.ÃKGo=KNѫ^..ްS.{?pꭷ7_åח;K?K.K.zKO=򝯹ŇK_gfgoʥJ.ݺBpY'efԝQ/#ON_r/-uK9%΁:~|߿j;_DBLa_׿wC {O}ɹr;=-=A!;}G/{MG~qSҋȹvN/\gIK+rcm{S?ɹ!W_0ȹoMvp;n~wp;n\_ϯ߇Kwusop~?? ~/=t-}wB-Cp;S{krWx ν~yNc[68jW;nǿo>]pN=|V広s/M}?;nӁڙwtGl_1x3a;s[}ufg:;nڊb`߂ }j;[py <[/?b+3_[p?n~M28֯xso]#{S}7/gMwO_s߿U98|ַ-<7nqa=պG}aq=㱪;/8wȹYi1_sLqlvt?sۿe J}˱_ }ώ8 ;9W_W_Ko_1Yw!8na}_}cozz}*8=vkrw\z Z?tsܷ¿~|G=!_z:=kpa?wE|듁ϊqp{=?c>M_nŽ)/ܔK}8 -Wb> };6WW0؋-q룞'>z%~57牽b}_ɳs߿g`߲}$up{[W{px\鏜 ?[W/sz[~$8 |b>kr#kFp?ʭ7#[{g0νp }}L7޿w|#8w~߃S¿w߂o{g3son#{_#38z*swr%Wc'C }k_ۇso#[rO?¿g Ikǿscv<ʭ_1һW{nxlrOWo?9<1-[`|&  >sg~ 898=tCUn2 x[/1gؿ&~5O:8>O7C~Y#nwx=\s ]b~Op?1s~!~u ,;#g<}ko1ރs:78r=<3r5ӿvpހs#{^]OoU~2U}b/o|kW~|V_x{9wpτszIE.w@}xCxvr5[g/8mw_sKkrxNuă_ùg9~{"¿뽞{oG| }ޱ 7vxcoyvk/s%c]xɹo}cO,*^/3Ϫ\-:xfgq{WrćWgog_ps3&=ד!^vshs~ =px]__~_;8ù ~ß-8wފ\DpLs߇3AԻ =pK"tϻ";8w|相'ƣu_s4;h8w~ νP矅c.[y\Mp{==♷zksyO{쿊zna_1Mؿ6KZm]ć\'8;8w={+νs%tkrkׇ38=s6Wbp_G}?/{M0uzWJ^6>,u;^s~>snB\s"^s_9܏__sϖߊ̺,TpWwɱWp= x\r5vkr?qUG%8?5kj_/:~/87^Or{ù91}vk_ܿʽOOR}WpuyOs0.|&nn~.9'lKogb_~_v_O<se_~]®o>>Epyǿz~"ypsUxvu 7]ÿ{kWk'GEn:8w~q>XD>SG 6yQ}ok'wȽsޕ zɭ񾞜 }羷qxamp{vpF~}߉aO+y<~{YɩO=ﺰrpXosc{`?r*^$_{/¹y*^OL:wp3t?^ȱkZgdo؋BuI|W_\_;:0z8}{rizU֙yk?hXL59WȭW淆c~^?K M牋|M5p|{nUn;蕓0grwės}̇xUKn<8>lk&> oӿGf_!gw6_'ʽM|[c> }xܽ~/2S/\u_S|3$7o^#_ g| =/pOs덉M|ʱE<5ù{*'y{/3] {zۿq^O/lk=8܏7pkpR3oBO~|I3 =ss߿b3't~hpO 8kb[/gf3yGfmriXM-W]oZrǹDZ~x3e'<=c|n5\>ņs냆ϳMn<_nb;$_\sb7MrO׍=cGf^=K }W'#٬\/,IR?xc[wK{qwGZuɽ߲|g_9{?VUG_jW淊M#~|~wӿQG!_wc{Z/,xx.o%O+nI.< Ω>#\7wɝ_N\+t98u6پbރK/3q&G\c't2ȥW/tKppƙKOs}taK.}\zr2O9C.]rpɵqN9or>ߗKOv9ϻyå-w;D_<>,lԟ') ѓq%"N>'~ɡw6yS}ye;g>KnGnχ8gl>s_̋r< 7ȡuE2/8\zr;;Ƀ-rWm =&}Dҗ6W4cJ.'ho_[K/r8K7R.=ktɥSO+KS.}>K}uG}G_.yҳ?gȭrwO.ۇKoe^S'y: _EaG$WMhǿqN;녍'g\zrSM3/{.\uv˒KO${ɥ_u\zG^.._9gCp΄׬rɱ#/ҋz0|9뻙q׫~M|ѣI.ݺp}Ht=ҫzrN.}/.NN+z:v`'9̯w9t꾤9"uq!\qk^.Y_͓K$t+t~K7O+yrգK7\zsϞq[_Krռ~?qNwtɥ|9Kr: z˥g\8zENɃ]rꍺ^7xM.2jx?ᲓK_.zr&'^Kr9uo.y*r8gr]m:K/'^8gW9tЉs#\n#VݼȃKn\gc<.z.}a?GǸsȋKn\zOKϼ;tw҇ɥSWa{wr˥Gyrr'rm˥\˽KN}I,lpzp>KT.:p<҇tɼٟrɉ'K?/$\utKOyӁ#o#6mtnrMNrUkrWq^:\=. [)ux -r- #O-# '^ԯ-3q\DKO<ҳ.ҿsi{K.=?<ɕ_˥:5\u6Sκ/ZN.xLrK?rᚋpGKw!^C:Vz{ND..& ntҗ?\:uKO.μ?gk#n]M]Ks|^\|pouЍɝ_cK/K_tEҳN \zUoM.^|rEΜx\zrqrة^\ ̫KK>XOW ksKO=;'^z_kå[wA.]A.].K.=*7r}ԉLΜ<~OK_%W>yɥOE=t8sx3uc~K\z`S缫ɵE~X99[cgٿ|[.{f6:ɥ_rpS.=2Ҧ8\7\r˥wr]kr7K/9%~sp?[Ν,9rrsrp\u]/ɥw^}_\Cǿ}-0{='+9t$~SU.=0\uҭ^cd<K~0>\>\r3+r|K˩?ҧ6:?ktrҝ/һzW:v?Kw='nEtɥ[W.m^κrցK\zrEZS[w׬ .n^79Nӛlo'7,^/͋K.:p?'r1ȥ_\G{rS'Dʕߑg^o\ꭏӟʥxYasޕ}~fʩ3gzɭ_rꜿ|r/-g.n:r䓠}Y}:s"^ԃ渿"grkG9=og~Sr}\m;WjݗX_ʥ~ߵc\zw[jSåK>׉M<._v'`O.=9E|d>Iv<~x\3'ߓ\z;ni_Hn~3\zy.`_ȥ?..(n&t|?^wk69uåW_}gt.ݼv/˥[dpJ>S.c57pYwyלrćS_B~y3̉w+7C _c~{X¥O қuᢍP`yλS0=4ȭ}kq˥/ rú|%N^%NgYyK\z?ҭ+yɥˡ.\z5+~pW.|K/.z%uʭ[ׄ'_Ӻ r\zå':Bɭ͝o .=\ rϑK/ǎAZɕ__Ua^759sdݗ-n;M7{n@k"_3¥^+\x/9ﺵG/+ə3ݓK2_3uS_)g&z߷58 zvr}.gN~\{z9rM 9s kF4qC|͉xsE+k._׿\:8ɥOutrU`*g\:ixrU.=9/t9E$^S}~9gҿrEۺ.}YG`Co}9åɥ Vr7t-gM=;N!8®/[:^#g΁޿W_\zUׇK'(҇zkWrQ@.y#\>Wg^:rGmϻ:6p#ϻ!Co_pSN~:K\:VrćKȡH.Nx:u.W1\:\~a}F:B]/M\*^gåw9k.Ƈ+_KK_Gf\:u.}ȡr!wb=x|=?uk&kSn~Ӄ5폺. 'O.=ߒiqɩCd;篩>I>\端.L*~!2+~_kv9tuqpp霷&ȍGf-p|ZݰٿK:x/~ɡ_'|a|>KQ_;5 \zU߼6'Ntrߛ1ҋukK&\eɥ[H.SgYҋ;5G.9vK\zҭ{,rraKor: _.}srUr?jUMOg>K^2hW؉K__ֱzЉw~C|Mt^K3_3~\:ҭrKb҉$Krޙy|6#0%WNfӏ|Zp_'}3)Kp&NYr{~\z}?}pIȥ?r םq҇07֭iK.͕.n=C/ɵ=.zɥ>x5\x9#‘ԏЮǾ,tK8y9>\zW\\eFN}sDf|C':t"rSKrևK_/qN9W/}|zպ襫*o'Ή\/Ϋ r%^zʥW/1ҧrSG6lԳL.]8'r9SG!t੗n]W/λn n .^zpuy9zKN9ɥ~}rUN?KSH._] ~/cGn.97$ǼK7\"\K.]ۇKg'˥9u9\:qG;g}~d\9"ݷyɥ߻=Gl#KrEnw]NÞ]w$Ao&7=[sʕ\zΧrA7aهq}+>Էə\{zU<ҋ.cSOn|X KeG'/"Տg _+v?i>^O 'q^oə|fp/_.=֎KG:"gNKN}Xꩫ!ι;/GXrAoS8^9lrrr\z~5.P.=99k;vt_K~*>K,}r9y^n)ҝr#္a}0lkpާyKU/=rVɋrbSg#{totarmt^EtNj\-|g^ĆK=&zɥ76qΘҋ6qqNFɥ^|1޿K?\#o6u_' s3M[ĉ}K\:q҉^!'w8_s?wә~}G?tiݗxҭ2̉s>u2 woW.<+o9tM^ƿAE\yr橽zw\z.G\\\yrA4O.8ÍgMf^W/]K'Ω9s[gm~SKKsKrr֑xxҧ;zw^*6G/ݼһsp鯾|v˩ '\zknKK7W.}:[N=ױ>It9Jt{å_# y%үKNrrYrr1rǽ\zS?%N|@Uƿ58?wp? g:&~ėK?ЯT9R1Cn)Ϭ[ڱp_y1{p̟pK.]$S?DO;tK/}zn-gԱ'jr9^ot\҇zEnȩ?GfҭC^-_8cg~utՏKW?N.5`KCx硗w7>ܴgzɝ'r..#z%&ns< S]=Õmj^\u^{=\z=>zʥ*,3*ʡ.~Dr)ʥ[Htp&^c|QN.=9G KOb^DSpgCUW/ntzv0/9s:yY:u"z8ryr嬣 xAѿ~裗8ρU\p$å_}ҭ&n]AtVȥ'9y/l0Vw}& ɥˡʥWO:χKoe'\N.˭.Nr9ɥ;_ɥxZʯӟʥ~x3xp鵪^t3.\zpR/ī.=g\zҭC!^^x^g]59s%>FіK'^''ni+Kr霏&>7t0\z3'}:x?ҭC.x\uҍ7>KO;\˥?zs ׈ȥ6\r篶3׿j_ɥV.] nO.ݺr]}yp\kg.^c,M|'99;/ɥG1tOtLkrw\=K&^r%yқg5XU/Xɥ˵\z\u^.=v߾sm37m38lrw5>5/n\:KS'$;pYH.ҧɥ'ǎ!Sξ4?\:u.ҶNɥiffS㱿:u/mq^9K\u^.>.KC/XלO;p#4s;GS ?\z)rʙ }}|r㽞Bt3^g;G=KorNf.$N&\;:B\-ގn3ЭMf6_SNjuK^:m&nXҝ?}?ҫ9}xқ:5Y7G.ݺr:O0_'n~oOKkM^?}kRW!5܇Krr=S// C^\s~5Љ_rȵzpsEN'I.]=\Cn.絩[ ]cl:}MΜpO\z9uI3\zUraѱ9zpuޣ.\cGr¥WV뫟>̓K}Ot^zׯ^z?pskʥ55=,81tާK䰓Kr Pr3spk&|_KoֱzQ.t9C[Jje>\rSߙ﫩zr^:7[x?һ|s;-n]p9tDKӅKܦ\zLǕK/׎}>\OQmkprU}״er驇>Skv޲cYKz+0K۾9HϗI.r'>z^z9u%y9t9~_ݍX*~pkvuꖢw^/\r7ppͺjN%>?/+Or9$O?oͧ^:_9rs\=\zupKW.]ғ+:hJ|:zSN:h.דOw{e9uI{K7>zC}KOstz=線|>S?3_3Gr W|Wk'_\zE#)_=k)Nf9bW/).3{ݺjp멗k7%yzCzNt>\zK\.80>#.tSz=y:å;һ/t^:ᩗ/Ao}wx9"?ttG?9GJ.]ng7CS^Y_?WE^XpWrsuK=G^\zUU.]n8g{^zp0r˭`{(>ləmy;ҧuS?.97o#}߼S/=3<\9fș7 n;ҭ czrpZ`O\r7:yrWXK%åg"^/9Gn\:uқ|99sm;'Oy=6Un}33bW }Q/sKrE3Ul`9\+J.]_.۽'9G|Щ^ww۩om7O'>&.ܹr#vo\z~:z]N=ҧ47˫ǟzp-9N\:NKw>Kå%&ιK|lȱ.ꥧ:Irpɥ9x✗q9sXwNsǞ\z+o߼}_tK/>כ\#8'sD/ɱ{߭׏^x9FM*W^zCÎ8`>o+L:å7qqNٿ½^z\:9o9jqΪ>իhS%rpd}'WN!qΪ\ܦzy榜ΚM^X7oK]=ҫ˥'W~GՓK?5?LpM.]KO=uoM^䅽z錟K2C܆\zM\:zԗzsə[S=ׯ^~sDsȫKWoU.]nA.SGsD8n)t+/~'ЭKk_ol8KBf>w3˥aGO.{b?\W>:S'lG?bə_1i>z8p5å'*.W3ަ6ß&NDrD/羬oyrqn\[KWO[2|.=FN/E\96p9~kW.]N.=ҫ%S?R.ʉL=MwKM|.=3oW.]Ld/E˥?GO9uKM.S'}9bpet2ϺٿR7aZg#?\zQ.qryp\#|˙_CgW ι`rP/]KsLϾ͋zr[D.ݺ)rr¥[1W/=m|&.nQ.^cW/cدI8v9ɥ~K_n7o9Et9dtK_'yrrr iy "br關9y5wM<:3r?^.&/"?p?T/}u_WK~O.ݺrU}Ftɥ;Cֿ/n䐓KOΜK?zg{=u_v0^?\uRҝݟ˥;ȥȥKҍ'K>\:i^zꝓ .= ʥ ^/z+@.uo9P:Or驷zS&\ɥȥCqyu6s &qL..c.}InkC"tK/>\\uZ^otXқwӿAwϻn9r_'nMt r~^.}91kt8ʥ7KG}8‡a|MҖҋW˥꣣\rKor>2>ȵ{%~^]}}\-wrEn9sz_rֱCgz˭{~KsKw.n t/뫗^"<"Nåf!Lb,N\zor䟤^:-r૗Щ5t𧻓Nܿ>؜W>?.=z76$?KGo)ҋaҋ$rROJu߾R9A.!>;SG~rzѻ|MϛKҍ¥g[tШ}_rK;kһv3>yӿ|). ^ҳ|f{?8ҭ%zyə/c}^)?r59뷕:B].=g+\ΗK\חKKwɩkuys8x5=K竗~ˡE>ҫܺ\9\z_뛯)uk{9vt6ay<ut[\zf>C}esDs_ɥ].}M ~_?K7L.=0SW.\zp?WU'y~N> %y=:B.xEr)ʥON:5K.}kȥ?{g楽rݿU S.=W/ϫ#uKé.-}Cɡ^?"^\4r鵾.=W/hkrWoȥ7WsɥO??KM#n|Xc\:]ɥ/#_|C/=Rt9Z;Kpr^:6H.|?w^|ͨ^uo׼+v'_].ؓKy^:׿6uu&N.^rʥ!ʥO,~M.ݺ2N +.}^:3s<ʩ\zw|,n] I.i9ؙn?O/|'N[n/-ʥ[B>-\kʩ[w3wpSμ>\T~ߗ:B_.K.|Ko=~)t$ntK~_3 Λ|ҋug_n>Ko?QY;q3_I"E7ìc7: H>9s0|Xiu\rwG'_ZgaY'2دʥ^M.|&N[>Ǜ\z^.cC Ω[M.{~tg0 loτ[Ƈw7'_׫uɕ_!~yM۩RlǿRw._:\zpr$>G/\z4ux~oꥷKϺpz'\d-g^|'KK3Kғ[/y=רn]o*/n# .O.}ʽkr7U9u+zWu_] S˩_H<&Ko׼?\zUYֺ˽>M׿_Ͽ~ ~=C  O}ɹ׶swאkF ;u97װ~ajr;n>87}zr׿{ʽ׹۫\ wېS9_r{ ]@-·}cwtU{DV_O!^sq= Oywts__r-D7'^ʶ;n\sooX?<~>b|-ܟ/rw\}ߏ9Op;n_s٩cn+ձk{G.~E`supx >㱾x7[W~M6刺vtgr{>s>w=u|sss߿#8=kGp~`;W-~c> x!>>[{3=?? w}pݱ淃se\㦵9_ߟsx_/gwt].Y]ÿ/uUsuE.xr-^M_z=T% ν6 ~պ#G}|u4s٩,vpoXWؗ&K1 ~yp{q|Vg__7 \Ϭ|W=V,8MznX 7¿r 7;_8;c>s{m+3Fc~W_[g~}o'o>t?r'}|6_y`)_w>G^\pKps~/_k =׃p[GOz 7qZ ν5U48}?rWߨ c<_rXrsO굯\Ǯ1 r#E}1ɭ]̼s^Ӯ1ѿS:@._z~ߥ-rOx?kg g||˾¿G_k1 x\~?#+8+_Sr%羟o=/4uk7 8pٿ/8sO o'@e<} c˽k osKŮ;¿~EFO}rX~;ÿV9Sp;"zSn:8{> }s߿w瓃s@9Frÿ@龾ao*}_ 2p+_Rsa< x_"!hr7 ru԰"|ɵy. 1#[{Ew1~sr+j^kp{>{3c>So+8Fwh8=_l1竊EϻȽop-{Upx};axd$8W.8/U3rYE݀Cv< ~yoor=粝}^_LN:8?rհpڗ^sȹϿίϪռ{Ky\Ͽs( xƿv9v-Wp5+p{+;o7.XEp{>;8ùc ppb&io1c! }߯}nùo>gψwU9uggrW?e|e<}.pWgUr_o9yl89}? Ņ~* _+ߜN;x+ua/Tw_!8w^;W܃]Ono_[W9[p \vZX/g˩?_OsrO!?;!m6!lI'y}_7v?\Nh7&w˽Op]8=w3> s?ExsߟLN(8k>89¹_>}~|+ _:ƿ¿}g'6|8r-Ð}Mxx.Bp}{o{ƋJpyof|t ܷ+lp{>'?#]p;yp_8sg;W }l __ks5gėпc>[_sG3*~+1cgڽ^rwOg{m2c۟{U_~opo7}p{#=3 oL5o$_|<'ƣIxX3ɵs|I87~&: Sޟ'O_\+Iz:g&gk[Ю[UN~*kpo|e_wλ3_85{ˎ|n3=K"_3L׬rk^ӿ=Oqa?ϛ p |MD? ׷羟nUl6W|k׍=}-~~c|Į,lλٕUnaI^8>ulI6[n’kǿIࢋM|v5> םOn/58~!9v_6C=s3=ܷ?>?Ά]M]kʡ 8ù=#{}?_9x {ݯ?sx%{w23Wp ^b~G=~}s9|Mq~p9ùg>_??|u8mOWsQ8\¹q~8'}k\I\;S)~=y8\Og|}WsgzP~=kW:{?O|8k'_˵3=r#z+I<%8=ٿmGfss8_yC?qz8?|z39uҿlǿ/^'n[ۉÅI]L8os|g8>>8؋{דs~6a;W>?¿ZǤy~|M8Oakf+%~a{ùg<}6$bwhk6$rg1'_I888/s-o8?j5IOrù1{#p{ȱ?ݛM17^~z+_'/ Kcå?ѯɥu9;:?"nw˝Qkɩͅ~^8e;y3;!OD.WaCܼ]y0tɥEwt9Jt/n+t/m.=կ/'ΙuK'tyҋ.]rtҍk$>$t90t9 ^9իK%.%>̉sN#鹢\z΃\zU.V?=✝?N.S,^vrvms y_.=9q✷3q|/'Ι5qp}zGO.}h' .g(RoݼÆNy <ҭ N^kr鏿oS̉s.|#˭#$wp:1?$^sD܇ɡ7qNIK/~8u_r .}\z'o0tKK\Ძy:å<қuB҉'>է8ɥWƷ\z39YE.}s~>0t93Yԉ+/Oȥ׷n.Fe;q_.] Ø/3O.]R.ݺ1pm8ޖ59tl^垉sr\zr9KW.,]'~˩Otr>O/+\7\z\T͝{=O.}`[c/89Tҋp7?yɥz#pɹʥO}җ#9\:p'>'/"ۺ3/lܺ:qμ~F$~ۏ8g?8vցK^yr8!_3Ι:uȱr}'rLκ\znROgow'[?^ErM8rya~npYw8gSƿL.ݺ"rS{+;ҭ { .~Nz9um>\u\8gmZdrwuS'i\z'/mp9+29உs \\qywɥ7~e=seLrW9CKCgNw?\u{;1tɥo 폌sppu6Rn=~!_.}}t_.k3\6\z٨rsh'YcKYɥKoQɥw#գK\9qrpsy✑GO.f|ɥ'\z}ʥS;tGt5K7/\.=s.>\,/>?\\PZW }s>rr\zOr;_R~y¥76טSW-_Wrkr˥OчN=YW-ڇx+cK\ylɥ88m_Xrb;YpryKˑK˥7mλb}$BrMK #>"\\\zCN.=G.]NL..國uO.=柗K_^3Hrݿ\zCKgK3'l,r.I=uS7\zn]|ݽ֞|>J2;1 X t^qߣ吝`-=۳b5] kƥwxutϟե7 LKo. \vO}9]vq9tUw~}rt/ׯş|6>..}ҡN5os|qxǟ.>Pt߯s$?/]:j_5y8[Kϼf_p5.fqoK: gCg`/xkҥ/߯i<.=럜_u5UϬg?[<<ӥԓ~.OǙ;~Wv KwVv~M3]sǥ;?ݟ.8}_ݜzt:H]}\tcK|y\ǥ{Bޖ/..n}st]zn{}9]z:ӡίE]}tW+ǺtWҭI;ĥe_uK_]vӇ`Y.=~O]zμ~nҙdy/:q8us>N]=]zOt鏿?spQߺ|U%]Ǐ..}갳^k'Yv;^uz~el!0yþ҇n;5}}>Wi8ҭ/LKқ}u9¥fL߷'5c.=tӥ.ǿ]Μ]߳]z_f~3?.tک,:l5'-uk_O.=v3¥w׺t ug\zW'oؾ1ksu|עC'w LS~ǥ.8ftׯ8׌]zx;MO= :>>rOa^X>x׻ [+cl髖Ǒ}ه8~`^Ǒ_Lt:I]c\a3stk>s\:.XOuO;3Efzԥ7yÓ.}"uaz˾Kw}.nj5o]w7ן.=\.|R]TpO0z=.=.=]c.Zӡ$`qқ~9ncҥq56~KwKSgPיs@uӥ?ҥgBn9Bُ;׳I NIեwk\yt$Y8]:;gz|=_1Kºt.={_}vq|u7\֏Kz1]Mux֥gt?Ǿ/0ubkK7Z>=ҥj>̻r36O.qs8[zcwWӥ״6]z5_|k&;59$yɺtr ҥ;g~-:vט/K]z|^3Df|KW/כ8r\n[]zҫڸ~ӥ?;>kf^c._.Y^^ҽ(#u1}Kw]֝gCnzMzxY5sNpѥ{=Kw~Ƹ]5.}{avkR.=ZgP9]z]۝!pK:p}5u7ʩ׼|?ҥӇ`s0|_u9.å'^O.}-y=+Dkv3LNtKKKWcK%]z.tQ¥ҥ{ץ/_O1w72G֝1}3q~.=:Mg@n]z7xҥ>~.%.}o}Ywu+O~:,ܠ.שKys.Nc[}NuL .yYy=K/gϼu\=;/=u|uyݹωSf3oՙKw_7u?ۥ?:zIcť[ե 9D>ߗ.=>yۥ떯KonNR]}|>.Wq|җ}2/=}NGy"˿K: Ko q>ҥy8}ԥg}X;.{G{]]YK??ؗqamt\>}!t~u:.ȳ&=9q8gsv:.=/tKyҽK~o^O0q"?:5vқuŘ}ԥ]zt|\z>g]ۙ{f0u^>åw,tҝ31þ|\zs_ϺһvMw9];Os+/[;]zեW^]z/9k>.=jo>o\יף$]:{u>?f>y3_X нXuե#ϼsӥO]nҩ=һO7.ݾK鿙[SO}ĩ+|緜_|Ko` ]:;ɗ' }N.uҽ8\dL?t3G_ǺUn>Xttꞎ۱:;3ǾSߓy鼞:v^S7/t9_Cpt9y+t\uC'_åW 'I>S7u%[gz\}tz̩{oC_ǾjK>tQ.Yg7ϵwH^4:]usWsf>[K's>;QwK}qmu;ӥWrsj>w拎tUlj]>һysZҗq_l0ұW-{+/YNMu:][ۥGv>gqrL>n]vqnN_\z1O}NbpHnϕC~UKn~yȌFw߼s>:uo6G}eޜ>Ҏ|]NAn.]ׯK7Bts1]/ӥ9}_p˹?.ݺҋc`q񙗞NpL:Sgnu1.ҩS1y[7`Kax1}#/=ݹmtO?]/cGtq}ҥ>bSwX|>u|~;1u۾:v<:tIӝ^Sq13O KyһnQgs~ӥKΩ~t-v=޿|.}nna<>2o2.g]uztϿG>usǥ83̾/>ҝ_֥ts:tut>'Xߓ.;c\ϣLǷ.}QKoy1?ӥ?:;\c\>`ҝtu0/ݾ'^+եK7Lӥg^|.qcs.}Bygd.=ݒy 5/lN]ҙGtOt^o߯~s>֥߾ks+ut݂.o>OGK//~}\N}y&|8q:f?~[wd^߼tuK'b]n.sKN.]}Ctaһιԩ~Y7֥_ۥ_>~}5.|KglŸuK_Ϻt陿>\ U;u8K'=|p:6\>.}1Ù~}]z7>.7.~ӥE^zчK֭ҽ?.=eȘq鿧݌p]ۥ?:_җnp9.κ?]bҝtC]\n.)WסS_ѥƥ}8tñ}_Uo^Lk<X_qٙ|.}ʯ|r:]M^u<1/݇K2K/%{.q8Μ5gtoIUN]N̗|0v~u<1'!_v:f?nﳏ.\z-.]p8j=Iot+֥{֥^֥ۇLK/.=W^o7oqǝ.uЩ;t-\X^upLC'p9g^:;ykts>u絝KO.. {1ut]nu.x]Ǘ.>Gn9sgCw^ҩ*_t?t¥[g.]ǨK.ޫq1ug;tׯ>nk3/qץ{˟4IsKf^gۥg:}_Kwg^yǿgX]/C~.'?]];}6:w߿]?/W>e>5|ե{?ü߃KwONAá3?\zi7Uǝ.}\uUs_]z[_oܟӥ^^3Kt8^Ok~.p~e_KYGfUХ;3/<5ө3]ǘzqΏOk];k棻?<֯tKߗy̭ 0f~ea]y1f:uj[COOoze?{o...o]z|>}՚nzK%g^z/Wkf>:}6S[G^rW:^OǮ֓o^u1GX>9Byof\G^C/~.}ln^bʯx3}<q?ץKtt\ۨK?]ҽҧcl<:t֯^]y1x{pB\u~\ XuW9:n|<$q{KOpә[9~cſyUN+nڷt˱^M^wsK13:ks5o\u[եw]|7k~?I5\S~yҗ3 һɗO^tݎzt75/]7K߼vkǥ_tøtqK^tg~Mt;GHu}7.tJt}]>͓O|^u>Οzͩv'֥p㨻Kxѥ?GfY[oqr}$yU9KK9]3/ѩ3Ghfg.<[]zzMkuAkb߆7OS~>8KE!oqC|{>+:yQ˼t].>}3G(Kv\O~mt%spMI99Bm!.܆å?:trmҫ.gΘ}YoJ#a]5nߎ.@u߸~ҹ?K;1t;һ}#p];+'y`][>}2G!ǥϮKϼltc~Хwpy;֧utzCCT糮c^3lsWȩ״..pDZSyЙ_c>¥ݏطKסS?]/ϯXv]M߾¸G?쫆{'/Kst9}tCtڷ8>tץׇ>M3.OO{tХ{1Ez_tO_5]9ҋzϥ?a~?r\{]p OutuS]t҇`1yVMKL.~$~گѩ:K/:z9?7g0uq|ҥ?p{w#f8:p|`8ǥn\:u4oեq߼[ťoKwp8G77u錏K>WYqs|˺æS7)\sO5KKuU'q;9 yDq>l~;&;ɭ[~ӯ9>Koy>Sw3f+n>ofN7牡+f: xԩ{>.]үӥ[g?r_3}tיkIy鎙'p҇n}$]O~}8ۥwag#}Nޯ1K_۩x?hucaKב.ǩ˾?LWN]?}uX;]n$]4}ι:0ëuH]fЩs1];k39o]9y8wՅ3/]שKx5/1}8KϼuoK֥S.zc.}tcK:Kx8~w.=ٗNv|>uXӡqK:R/0 Zn8G>Osⴋ+s::֡Ν|8s}\z1}3t:|KgQ/?oaۥYeҋZ3f:uԝ77o]tC73.q~x>:C]z_ۥaSw:,ۥu:r`q>Vq;ӥҥ_nxqA1/y'K.aY3~Х;ϼt竕7y}ydf}]z9pQNv˼qsvNg8c\3KowΜGN]ϙy.p>Cg~ŹK.}l.}z|O._Rh<9\y"sK;]:ҫ/kvgǥ['s>t>qu;uYҭ4/ts6u7ҧnq_W1uMw\>s1qtE_sǥwky陯>'ytͼ]z擳|y:W\zoەqױuyһy!n .wK?=Dq}1_vzW:8z9/Ptg`7o:tC]utO]kKg?*]4wߌ}ΦSg?.t~^{;+懢Sg3zv^zsL6T]z3O;o>:s3Vݺu1鿉fSoN߬әs\7/]KGtKKt}wG~nyNqSg~|{;ls֯t:;]: ԩ[٠r~m>nߗpSNΥS|F^m\8amq_Y⨫׻]ltwoCKY'K.|D]ǺtGK_qsq<~å#0_ܼXgcg׫G^EKѥKWut?;/q/:֡SuhSg\zM{eacc\ҥgD>t޷]:vKǕK]DRn.K]:ҥ}m^u̯pKw}Kw}KnKu_/:p;/S~uau@ B:NN'Kն~\ѝ\N!߰OB8.=:n.ɛ?}:x}u|K=?v_ХFpMK.]KO|?\yܣ+wfqN26IǾ‘tuøv\e^v1_֭sKoK?.K]^5]9u7s8}"u̯қOϾjcǥ';]ݝNݺu\zt_n~YKϼiȸեuyO7I]؏?S}~ǥ'N~.I]z≯t陇ޏ:']zaC'|w<ֵ];}x=+'ϕo?oO^z W>i}S|?ty^.cK:6|tpdۇ˼tB~.W~\ѕ1KN7]}qݾJtһ.$ίtOtb^:uˠK׭oyͺ~:N:}_n}D+ycvq?\z7tNj.d]K>O~wz8}_ǥKg<:Oo)xy\י.>}tYӥOx|ҥߎ'i<ǥK][K_]ϧ\z|kN9S?掼v̯UnǥϝJvKқgץw%Ͻy+9_եu&:i^ϺtׇWbԕ_LSُ֥.\zťwꠏG>T~.mÉ?ίqKpѕNJ<Z:t kzԥW.2.=/צSpKǁsҥ{}KO8/_OpL}_b~.}~\KwZzn3v탱җΜ/CgN\su9 n;]:ok}t֥Wpcҝ?\u̯MNߗ]z qQ=ҋOӥ7Ǻ99+ƭcoi棛CGqQ-ҋg^:y%]#t̯8 ]C W\܏{|>ُKW~}ҥuһ?̿\/[^}||WӅ빲^8ԥ4 ǣK7?oʩ\KtLpӜtz1WLꘜGWzd΁nzYӝswùYk3|j9ᠶKO>s}gН#D^m_K3/.zH]#/}Ω5gҩ!p]Mw^c3?]zn]#k^t:<]zϟᾖ3GptӼ'1KnN}y8ߕ.}8zGwh>YK~Btӥ͟'ѭ~m:ulw sQ9תc7/}1е〻>Wt[zDZy>+Qy+K_z\h:tI}ҥЩ'>QCw g{^tm硗~4/1;s)ydP|?w^ҡӇ߽nYNp+Mzcr}\?{\;K7Dn߽KO}tgy>.:]K<f5_;/=ﳏ./wҟ?\zѡ~R&G"];G^:n~9SI}Q˼tͳ^s~\YKϿff:v\:ǥoKsz~Z^sYO Kԥߺt3o}W ǟ.=2o?׏K2/=/4>>q:sߙ>uN}tۤKw.Y>:K)]zgtrxҥ7@nv1u^Ol^t-?ǥK^tg^덝~.O]z1h#4u5zGe<^֩9ޟt陟N=IutGO~_gߎ~~oHwo?w??_G ^q?vԹQ;{Y~Mhi7~peqC/MK75{yùν#_y7n|K zpg :!7}wv8ߘW~S i+wy e\۵ߘv82} }2ӡ`{M[?!xM~=[~w:*[g1_{=NϻoùZ¹oo{nW^Խg_{}so?k?{8q{-t=޿x;^W|o?:_Ɇs/|pM+:6r\G{p-s}~}|w}\~ νw>'{>{}9~g~z>!{>msŸt<9^N{>νU; \8?[?W|_Ésp17ԯ+mэ8sq~ ^F:w=L-/>'Wskͯ>@3~^GYщ_1Not#޿+}J_}sӹx+ӵטͯ}|_b~5/8{~խ?k1Ͻ: ;;c÷_ƹ];kսr|˸Wq<:s3_=^4| w~u~ }җ~>Rxc> ^F/U=}ϷW~g̾;oq{K\s_d\^F3Y37}ߟp0~:v~3N]+>p ^/{<:|>ӱym^9=wϘ[2?_}7z#p<}{p 羿o/{squϢSz,;[|?4c~^/O̯ {|W=g?b|ͫ_1^+gϊu3C8xӽט/ߌsb%⿯_^[\oׯ85\D8ҭ?7ֳNj~W8燫~Az7_c~;t_uss/6hx82=G`ù0,{>:~_o?b3 ?*W2DZ糇s/pyùqs>yb~Asq+?|f^L8!t¹/p;ʸ|#|Vt{3];=xN"{^o)s9{:{j|cwtK,ҹ)ߌgx?G-Nùsw+|FռpzGp|7pϛ;{>G;pysחq9|Vtz'Ƨs߿ùǿg{~{܏߱5·s^/{GpFztysú;g|w~ս|qѱ>ߌ[䓷_N~u`_]>8t̯#WùùVK8w~c7O`sO8/Ĺk?U]>{'b:˰|fd8zL?Wqe=cz~tϺn.'{:pN>cu׵p=Oǥ{#6Kؙ_8P8z ^_p/{}g8?~ѾVb.~\=׫8߿qqC^c\u5]tr~8Y}t#Gx+W`wK^{tmc 9G¹z ~.ƍ%{><;Kg\\/ :} kpù?_cZt5G蹾ǹq~}=>byuZ>yùaec2w {> <|>Wew)[S?Ooskj1ņ1+[v㼟sϟqKԭ_}|>֛KܖK羏p#.^s/> usM^~~|>b{=g~]s7u~n=OϟoX_sqYc:1~s7qts3ߟ? py?x8w?@)s|d>W|+7w~WӽXo>ֵs>[8wg[8sz^ōG};z$Ÿ?_>:sq=t97:E\črc:Ky8u8wҹ>[b={8w4? ϧK? ^,ƅ]{1>=W_$8p5v̯Y:x_z1fұw cuùŸt_[b+5'5ɯz͑N>5G:~}_qGOǿuڷ1xqc֯{^=xt>{pyG;p{Pi.-_9_szG'5<g?Xኣ^3rz'qwzMs/#׬Ox񅛦^6;5~>z!>8z<]sgXu׬'p{=}/Wke8}>[5];E>pkV?ǣ¹pP3ùg{pz=¹gݯs\c?}_sOY/^3+zM [_s?q?k8'ĹsxPk'^<^g{q~uk:~t_sz:tOL]:p5WsyŘv8¹y]߿ǹE_5K~=O8s=oxp~Wk6z=w.a^/=gqǿG&;8/qex.5?~=C8MfF~'=}ϳw=]pYs=לqP~~w|­gީ[n^ӼpŹg} =?ſ\^Q{cq~w]_=}~k櫳~w;Ï7>\Dȼi0} |{0c~:z5} _u7ݾQ|sM~s8ù?~?>/Wפ=q]p_u5G |p5yYY|Yxֱ3޺wƘ5KQu#޿g?n}_?spz#45s8:8}}=ةo"<5{טo¹Øzp ;"ڮԱ3=o]sO?s?^kzQI]o#oqK4] .}o \4~|Q'89ҳ>åk|>p/ts]z:\j]ĭ[3[wu Μ}N q9}=O7Х3ӥ]ptXҥ߾3]q扥S:J]׾xOKàK7S:e]tsr.o>>K%tt\K:tg.ѩ/}ήեcsY>o>"y|"bܭNQwS:"]ycXwXu ‘ҭ9\zו3Op|KnBޗ?.ub};$}Ko:uܧNN.=ԥ.6|ƥ7os/`ͭ3b]c8..1t:}tpqy|ҭץPY~ϙG>b8Z]e=2}쮛u KOut]zϟԥڹ+.}Fם+>R'[_:taSwKY~o:l|\7 9g~Kg|>ggӾW _Y;g~%<9K.]5xrrL\t+ңuQW/Yw|NߏjqK>}t\һ}tt]:u鿿b\҇Ow~%<]zӡ>tsr\}θХdtG8\z[{1fuT9.g?o.w>'.p8:,7ag}.}zK\H.qW9n}Z]z_K.>f>wkgsBvs>'u`K|$uc;uu:^/ cW><]z_Kusz~ץ_۵sfʩ?w]z|Ks}qͼǾjg3l۩~ՕԥۗKx<9쳁_Μ}طt׋қn}NvQq>S'KKҥK7_L~sv}D9uW:]Qu?uMϩsѥ3.<眗y>.=tο{q髖NkeL/9OsåХեs_/]uWsFݖ.1O~Z{ѥgK%`>2FwKә~v\zqL]ĥCǙD].:6]z|vtoǥ*]:xtӥ?۱Svǥq/tK|)gR7Kؙ_q:G>'993:\s~đwWq.}\~>1 qy.q\uۥ7KYׯ[ҡ[q\~n1?ֹo3u̯_ҧWn..#."]0_En^.]WK)҇vt;҇s\.}߮?ǥftyF].׍K:k\yRt]-.K7_PkѥqYKϺa]O^|}KzIХwG\/.}__qԗxqǥ>nv]VǜϪ?OҭťoХg]?.=?].]gK7Z~T=:s 8}t̯7g9]z) i]znqׯu:tLCLC7% ͧ}"<..}tvqYK>pӥOϺ.=ݪ.>:tot<>q&Cm]zol[꘾/l\zba:tߥKSKסo]va~.ݾ ZS|:zVn^.@\z[_9.}KϾ tt.ݺM]tݾ[NåW~>sK7zqOto9}tt#$,}qn]MNǟSKSw>pL>u߷_n:؇1s\?3x5֭xw\͘>V1u:8u13o\tӥ۷at}|vgq]7.}۳`NGKU̯ǥgK:z1qaߗ+ZםNtXq2~< nmWک'3Otԓҧr?.?t2ӥ{LM\z'F'.};￞.=]..=.=Ϸ$KWnߗɸُ[:uIѩsҙ_f̯8Ϲ?KpֵҽK.='KOgKw~ѥEH7iߗt>ɘ;.p帹Seqzұ~.}t_\uº\ҭեDqy}KJ7ş~.}ҙ~Et8k?t҇Ntsi\v 7̫}9nYOμ}1[~0.=83<\z~p֥G_2|x<ҷ \|CK}åwҽѥK:I]}op=.=g\zQ\z~uo{qyKn]ttu_[gҽ¥T~]9X-Kg^g\^:sᦫ}_pkz}KI~Oޜ_#qycC?Q'rgztWNtzts?H{]7\ҧIt{\z¥OίcҭN|dСNJ|9:t0L,/ts=K__^19B|>gR?.o[y3XT}zM\v5zйؙ_oԝ^xtOy޸['ݲ&}t?Gҽ?]:NzM3֓tUsl_Ky5t~VNqs0.5?.~|2^8ҧ}3qzxRxQ|I~<\z+spYuN~op]q9 y3GG5;c\zӡ_uT\4e+^S][^+.LwnŘp7̟7CvC?OR>i_SJn.|V]9:qptݝ.]wK//ʜ93>:sg~~t}]9}_N>9vx2?wfc8]:o5g֥rGg^x*c4.<5Μp;oίß_1_K}}kBnzͦzͥ+gz.}tv|9^tlaLP/t?ׯKϣ.}uþ7ץ.ޗ$˱*s?psKםnNn.mHq))Y! GKv:}K~`l_p}=|ߕn}#t7=e1_3k׼t^K֓3ť[.tҧ} ptmS?uї.]}gtڋ}6.fȏK:~mj^z˾/q틠K/yХЩoIgq5xYW\o.}\:^sq֥>ҥfP\?sƥ֥.g.Ofnz͢S_}_.Gf/tߺtҷAN7]ߓKO^2fld}D->gA]W[㔫>gstH~>'<99gJgN\ѡSwKω>/.]wKwKt8uoKϣ GԳfY.<'uút.:t|$:/9.`CN~7qa:.3^׾M[ԥwy鍱.1ә0xǥCuҧ.[S:]uF/R޶SVy 9uҿyKtiKǍKߟWs6;xfا˼>:|[Nk:t"t5q},/]nѥOb<}եWn.}oKϼ3wt..=ÿ7ӥ:st.ˁKw^KһΜ:qfuw9:?Xҗ|XwK+O:u1u|><;gȷK}>밮SuCty]K|+|`qܗy8Knb܎`o^:ӥs߮þ.5]y/7N8dM0{ss.=׏ϼ:;ǥO]3yGެIw=7Lps^:t^ly#.}Ltju]w>Xkra|>ҭKOK/>;]|'׏K?gsXyv9u|3w^s a^[_J>3s>gtS.=_:;׋10^OsNh=us/rqpԹKnD%qݜ/y7#țufߗt鸙K.å>';_ӥWy;Nt3KY?.=_>b}}ttRt^ߣocNQZ}{s WSwH>K3.]nkgLߗ3g+?.: ]uHaKfͨ3Х7qžjQa^z36:NC~_s:u>~1.r<>/vGם.w\:v`}8]} t陟K7̼tKϾsKnڼtmӥtc99:]Wt ..ƥ[K\zeltһyfsy}O8ppK9]ǠH_sf>ľ'}N̝W#>;o]9WޛLEnac}QKoU҇yۥ4/}mǎKu:tugץ{KߴNg9 } p n] .wqsUwNk鷝y:Kv.ݏkD\zμt\2.:h\zpK7_P^uuKwN]Щτ;Ƭ_ǥ['KIμ~O^;Ϻa]n_Ƙɏ(޼̃ǥ7sҋ{<⨻nq֯cݎן.=q֥gK|sg?.=]. uw%ҽKKo>?{=K?g_y8۱O;4/^ྯ;txKg.q}K''/]Kϼ+uaË}ctb~֥]sZo3/ԩ_oUñ7̏Ks7qӥ;A~.pu]z˼CЩ>e<t~¥KKZf~FϺt/?tc0g~:k;/w7_-cCqռ5ҽ>yQWK7}˱W;y8Na<^rq?Ϲ:oT%:ާK8w^}t3ӥ.ݲЩL>.:O_GD楷=e:#{d:?w;.kt: LW\c\:t>C1]zُܾ]UK/\z~t:>|7ҏqsM-upۥ_:tg:upۥw}!O:K|pҧy?汧K>N>o_qEN}u:qn_\z:]_t݃.]z_I|?KqK<]Kϼt~|Kx lKZ]./ͷztUgl_72/=O<^q>#ťtһy>1ҹyi9qa4.]7y麟yg^z>\0_S{d^бSNútrKץͿťk;sXe~:$8i^2~ٷ4\vϧ8y8]gnkelKwcKm;Ǚ<>>`.tU6:}p׸tKg?]>Ktsq.tKwLn+_5/}.}89]nKA^zٓyҺteuG>:n.{=:Xȧu8zCOd̗t/pz]܏եqϧ>tlt9e_p/0>3ytqP9]zGl7.?:}g&>yևKop<[J|k>Nߗ3:楛Wd&okzͼKo:לoqŘ>|tҥY.~dOȢ3'֡3>2o#K2/S~.}ryUw~~HtOKK_>N=IuqB.֝Gf+5ɷNuG>8Kw>y~XYs/'۷T.럕Wk^}Wqty陏N= n;sc wҥle'|嘾j!ίɫ<\z\[[N3f:u?cIxS9Bӟ_?{>.|5^39B__.K?K>085:.'^0f~=gҩ#tίV:sXᶫ]Nߗ n=v{!yH^q/K'<]x}8spp}t׸Za3It8W>5'ɼt.}?KǫK_:aeSKtԥ Kݺswuo}bLf$za8$tnjGwp|tE_]/̏K7wt֛שSs_KYI_#G{U|zΙ_9ȼz[תC`ҩ7ѥof:}_G4dǥ{$]S_]tǥKɼtr3/ӗt^9^uk;yoۥW]99Bjk-SmzM=ґ^t}yyטC'G^]/9Bq>ĥGj_q҇3^v׮#^u|kk~y-åg9}ҭ[0kg k;urp_ONK.םN_ҩӇy|3^u_^7sn:b>¥\~mN=Iթ stn^._uL߯Kg$]|K> mVt©W=DqǠeSg\z.}??snn}.K~oW_ӥ䥯?]zab8&\`ɼteK<c$]TN}Φ#z1ߺÕy/o޺ua1QW.t9oy WmSbLx楓>'.GS}瓇Μɧ.}.uPtVK7UoX']}Bty<>NáS_GDt>v|?.pG^zqtǥ} 7\yӥ.e>gۥ:¥[K.+ҩ3ե{BvE46;u:88gvG\>N>xt>a?50]z\ާKo_>b?\zt/<.=]usKƥйoCMM:1ťO3/}N'o9c7o3Cξo\:yߙο҇N:j:>_.餳f3.801'9zV^w:yq~եӏ/]Ko_\z\tݫ.}y7/t 3/ݾ4W]~ҝu󛗞K]zq9;KzKå_vIqz3|]>ʥ{_-]:n!]:.YKo䅧Ko:_xNz>bӡs2_Kw_%]:u n ]:қ.[wHzw_ _tGeVa#=9μ}˼n_tt.#/|s[?o^Μ9t3K/|uw9:t|Ko?>Vq_q' q޷N7w;f~%;ovp޹ω[.Y['ҭ3/aWע;N'bS] o:Nyǩy>.]wq>ԝ32K|z]z1[utþ/w:b\80\| ĥlߏtşy=}xӷ*ҭԥ[7Kw?K'O=}ӥA.}[QcHv97]ٯ?]z潧Ku;/:]}2/=Wӥs]z̯g_N쫖.}1_^v[K.:6̯ҧ^5.ujwN'Gwtpݾ/QwK?ѱ[oXGlKvS3uq2/}W |KSҭS5/]]q#~\N\./K{uűys1qe^z:˾/˼S2o`^ӷkӱϯOpq&NQ7tѿK|Kw}.]b^N`祓ts99]zS^yy3 틂KA?r}D^p~:CKϺ}\z:g\9^]z_SyùM_KOLJKO]:yܗ}6pǗku8.q҇tK[/]r1['^̛:3?"u?tҥ[Kvqԥg^w>uCgN]D߲.0ƥ~GTG8xۼ.}^y8q&N!ǰOoN#/?s%~^NT];Nqt?~ye^zpKhy\:sgtϷ3vp3N瓗.Μxt鮟Kkч#us:㬋}>.=].=?uSsTn]/mYCqa\5.֥m^zί3.y8 :u{UwK_K]Ett]yKy}|]:Kk8f~ t7.tҥot}_pθå|Kw/]:8tb+㙗>N?.b]zO_.>߾jxt3/8.nt鹟8v^zal}bl=wvCy鏯ttt~_8l\z:\O^ut?ӕ;NƸ}|׿K?7<c3/y鷯.yKХGVyvNgNAӭ[O2yN_cY9,KqKvԓĿ]z2Lp_cỴzym~zMuS3_8⪋_3?zx<5G,K'/>]:n}ׯ#O~3/;f!_]>^S>>%t].v䯧Ko:t|dfǺtuҭCץ[yԥS_K]zϧ$k^7p]z:tyu˜eksl㺹1qtMwKo:޾ϟxK]'btҩ/ĥ-.=כt楻>1/~o\Oʮ+S70I"ځLpf'Ɓہ_NH %{^j(2o=?[G7WNޭK \zK_n]]Ÿq/}Yv9Y:u_C@u`K<}"NOK2>ϯX?<R.L:}pԙo_O> ³_zՙ.=.å7^Μ8?Gtÿ/]:n|g#;_1£3o||MkӥOm]p_KQ9(gx5~c]q鬇ҥOyq&>s>q>N|ӡ^(:t?:t.OyJnh]N{K:v wqץssեf.]7K~W{p͙Yu>tǥKo:tIn_Otl>M!vq}үO.|5?'i/ԩ$o~Kt%<ԝ#.It^K_8./M>7]듣_zwL[3cKtzk.p٠_|k_:`..醳УSgGWvǥ['EDCեԩѥK禇h'$tqK]/|KҧgZtOn_]tEGQ~հ_:}ҥKK?׸t>BUgNtcINu,tȧ1/:ҭK7$gw\g&|t˾hK.x.}.lNݗw~W|ۥktϧ.<5 鋒.=7aѩѱ[1^#d](\NӹG/ݺ1tv1?;xwS?o_G?7Z˿__w;йtuv7s_^t\ׇ ^&ù^-{UMmstu8߸3 ^Dz_7n8~xqez?'M?wk87MkU.%{p}յco#^_^^لs}^Mb';X77S' ];x/zu8.׊Щ3ù7c?W|uq?7n;28:/3pT7tz-T8|L=7|/u޸_ތ~39V7n{?E^U]U8~~Vte߇pߧpx1~{~oܴN~8>q._po=_q[ѽ1?,On<Х8_ xo{ 'b0^1N^&kGĻk8pupS_qz|8K߸_qÍ v_:*q3]b|3?8~|U=c/qb~Es_u¹Q7${mcg}_~w]c~zk4oL~u%oί} ?px|s'[~w݌k>sW{?Wqot¹?r3νM#o<^Ϻ'?co;^t̯o돺=WeWuܮ}z5Οׯ3؄s/=G>w~{\oϯ3^qNG~z\q?Z.;kѱ_-1V]vm|{-ùY>/k<s3*]+/~-۳'87?ޏ:{o]ùח_٧Ǯk:#7z}߱^5sgo~]~_¹} y{]Ysx;{]k<4sKq?~+uFXڿ'ֵ?qKߊx~:ףyO|t{ p4s=7~t#W?~f݇pO8zaLνFXoot#x?+֯p_ƹzx>uU}¹s} Lgggy8} ~u=8?>Z}MN<9&cqqsx W|_ss#p1uj¹3];_|k93Řux|W-W|ùpq}ùw8wϖ.8{.ί.Ƈpq2ztd~:u5 . }p-Ww8߯pW̯¹dLo3.Ͽ }|׸~¹G|#{?[:ׇ{$lw1~8nr~xL8w|8ws|#kù3ν.׿];$_q=WT~8>דz?=#8'f'Wifs?:wjpϛ1گ9epzf=;p|q y0Y 83똄s_ {>|;W׸Y' ^sv֯7h¹׃cqo~S8}8z<_w0{?_Kt~sg]6Wߨ#p{ >87=~:N)5|y^:l忟1^9]gKYR'`x=ùpίp1fk.~빟?^.5r~z|I>7=98oW;{ͯcqj5z?Փ{,|g5:+#_x2=Gqǹ^9̯79sp1^~3t7=:8}5u|/ƃqs%{{58Jk_8ǘ+01"_{ޟqscY`kƬ_yz: KX?ùKS;+.ӯ|M]n-Us~ĵ#&_s;5kXWө$}0/!_ r+_#_s|ONf׵8yp+7o}|ͩ"_8uw ЩE:u8~bϋ|M[{錉q׼>dƹo~,'/2>|z<߿_~z?2s/<_ >s]8y3~6tć:tܯs[spse7#wC'Gfx\?¹zmkz<0O?ί֙_txps? /ćsx8q1f~:uWtP_u#u5[kN;8~qϹ>>3\q1> s;x~we88zq3&_ϖ}GtXs >|Mzweuqs|U{gӓ3sSq}߅|͜o5~a8<~75/|h\z q4{9NӼ]z_zՙd?unyǍKo_;$.]wKtͼ\{9g'OIw~s^v+)ҧnGYҍACg7u}?[gWqNu鮋uuBq+up˸tEҥ_83\z.q{JNFtҋ/]rb~|Nn.}R/O>oK ҳ_x9-W p9qK!Gt餛nnUvp8˼[%yeotǥۯug<]~~¥.;֙#Ι<tc1n.t1oKoۭyҭ]åAsҥ{"uKׁ> d3UCu?צKtE7w.8.<]Ϲs|ӥ nLny<y<~9ǥs80EL:qΩ3g6?嘟pK:"X'Cc?{t;:1<7Kw_V\zuѥY^vti\:qtӥts.ɃIԥg qNangKq2ҥg.۟.}PZ.]WKOqeh\;̋Ns'N3~>q[~븉s6q:S'ii]zå[gq7ϣۥs<ӥ'9һƉscs.nһλz?=W`nu$tCGKw~Х^z n\R1.}}5.8qβXҍ ҷsts1.\:yҫNc<.=tu?\]>Y/LL;6w'i]z8'4t6x.}XJ>\ ..~|t.}fgץg?p\:tCKN&1O_>bl~\tӥs.]'K7_nqN~qN_җys+- ۄ֥w K_wť;̋5‘܌;LN3pKWKcr~#.K,:st.:6җyt+utڤK7>ι~-5_q}2|=u8?y:ʙ_c'o]E]X{|tGK~q:y:qg^.=.}ӥwn7>.]KK_:f\:_]2oLn]tu.޶SgƥO n.ǥga[هuL<.?a\).=k\yu|t"uYWK:u:I^b8bݗ>ퟦK7on4]z#w<$.}t%t ҇KѥSwQn|0]яq:qtuٿNgq֯ۺp:t}ǥ+ЍNKwKt q?zi]\uuusK.=쿾lt}Iwu۱.w׈/?.:bttԥ|Ko:c't>Yg#~ߴtvӹsK_>]J~d曱KzѥVcӥKϺCts}K7pԉǥ;')\HKn.=ׇ\_ӍKO]zK'>5O꺜.}ds58]uSqKw2]zƥg]q΋n.tq5On::uU_~:״nvo[g3v]y=u Kw9]5\Xǥ[X.vkq&t鿏ҋκ~/O\z>ҍwu쇎~>ҟ}t:O]z:}\:NL:cqtҧuqYNNw>;k]z:b|qqoҍoo.ZWU7}iGf]uWk⒛תk']v♯>u'q7sqrySNJ=Wy;Dtsa|ee&c^ҝs=]['xt^ť҇uzq[Ǚs__ҭ۪KyDnN$^_~}|/җK^׍K:j\zx17KtKt3/G.!]tWuj%5q䙯yέSp1k8\~~upw.}d[wNݗpYt.=ݒ.%P8ӲY>KK.}_oťj?a~u]'_sZ 5Eq.ݺ҇.|é~zOgKΜ>7'_8.}ї!]zaI~ubs5K.xO_љ҇7O~㎶KC'%_g!ukAե[Auuժn::s_y}7G?y\qt?}K}<~..P~x#5..ҹҥ/ Wq-]:u|c}k[YWMNGK^Kt­Cg77>.>KKvSyutח̛u".=x3_OߥK.]]>o_q] nݗCg#_Ñ߬KױnO~.=q#כq;sҥ؟c={q;K_z'}Rӥvqgҋu~\/KNAok΋$q>pKj]tkӥt>t?t鮧uK'>.ݺHtGuy~u.oaי36ć/[NJkӝOJwuS\~}bs2><72ҳ.}ӥy Gί:2NCtiZթOrpҍϥK/.}X>ӥ:s~K#]u~t֕ҥSYwkK C8n/qt3gM7m\c^N8'nq]V{tG5g3ݓ7~g}0]y!^3OӥOeҍSK_g'Ik;y٥[wйcPKOwNrL\ѵ'q~ԩ'<<>Nit+K/{|E:]YXYgC:Lw^}] pݱ\u3/q9I?~ܒ7ѥg]WzKz/zZҽҭWK__z5smØty:әg~w70O#o޺uצSuC\y/{oףҳ{tCK[E^WNz,^?i~>it]:[߼=z֩Qc].ҝtХ;Dzu9N}^u~sOn9]Sg~_w9yͺ/8ftsΘ@ѭk:tN}|KN8KouǸ?ҍkftҧݺ/:.}n]qΥ[k~sCgN^??;J~Yg \qtǩo}헮S~.ݼ엞uy1{aLt>sN9y:}_:yu-K_.~O_zӡSszuw~ՍnYN:n}sԥ]q8<~c<ҷ:u[?\:#ҏn?ߟӥ|.:c{xytGt].}Y ]yԡӥ/ҳ?.}gz3/}K:scz}-~'׋x_qͼ~eԥ?ۭ8/Ƭ_:CTćӡ[ץΉUΤ3f1;]XԩR>.::һ;\z[WCctyp7K/~K_^|qg֥ft靼/=LrzӥةA?~Y/ct3z;Nd>ЭS>ӥ7s_::V?g2uԱ*gZ?.nNN^:vRgañ/ :nzĥK?;ć.g]̃W]y Kkav3:>҇G\-Х{ե5:oe|8qoGLݺ/Ƹoݼ:.ݳ^eLK׾ks}ԥwK~ۥye{MЩc]mtUN|xO\z:/=엞~c`< ];an~ԥ;Mn]LNS~B|?tEӥ[o޳_z8yҽoN˺/E~QGB֡/]_o.~љ~-u3qp\K7藞cts>.Klt.[tatחۥ~_;'0}^ǥ>Х[jC7DbҥsL^<].\7.Oɋa\xu~GxKonZ[>K~8fy_/8:Vדt3^Kc\sIpMCN^?q.?\.=D/?|\..Y\׈mN|z֯88~niscǥ:ӕO:t~8ҥK7"]cҥe?botպjt¥/+u9_m'_3utok2_~etB7w]+_G~aKw?~.~w!=].IGJ^g<.֩7 c_ҫZ<ܓy~ϳPS3 ]:~rZuם}}[W '̯9~åsԥۍ-N|NaݧKJ~q#_33R Cѥ^>>"]Gwt8.}y0ⳏ./qytaukgԍtuN~Ǯ_c<̫\/\?.]K7;]e/1&>tpt]OnSKե:{Y۫Gqפy 79u'.cG+unұ~-:u|1S'W>_ǥ['DӬY<><3_1K~ҥFu3_볟_3Kҗכҫk8֫G[Н3޺sϱ?Wg.]:K:zētkҥ_A _/pKס_t>g:=~kf~N>BC~Wѡ'W]9wǥS'*]uv1}pG.=,ҩNgt\mq?v~1uK_.=_c~:t֯UN~Sӡ>]zoUׯ9c/gd]p;Wӟ׼~ԥ~}pӥOĜuK>BǥK.zῧsљXwK:t5ԥ[gdK>.=Gcf;'>Nҫ>5c]9$׸o>t}yG.}sf~QK_\5#_u99Μd?t✸uXե&yG~~Ent]p>.~ۥS7 =o~X)vǥOvǥ{}so~\3'n_3:r"ǍƘy/qL͡cg v2:A=xZu59yK>.~t\ӥ엾t/=\/=~ ХgL~MgNҫ3A9N{߻\q1ܣ.{q܏nnz9қ'.pJ:)]I~Yw`S\p|/z✸~ҝ7tbҥ;.y藞/oφg?ﺺ~N>baynK7.ݺ 'K>ci8߸I=tίs~1u.}lNN׵o"dzfסs=:Oz:1ǥuKq꘼?sV:yqӡ_>..=*ѩy]zflu|E^}8Gǎ3-_ֱzNn^.}:]1{W5qǥ|K.wKKsK~39?.=[K'ι?G:u~_:v~uvt9~68]A.뾋u_Kt93I['9Х?jݗq<:2|DžKO>t}9qΡSgpؙ_.g}_s3;Ϻ!ҩk.sB;-?oE{KK_‰s^۩اiGs׎K_Cqsֱ2oKoWμ.|\y]`ZW:Bәu.B>ɓСSWm.}~y֌sp1ί8l\zg͡c ӱ׏3n:Ϊ+o8Ƙk/]׶㼛yqsgK/֡SW-=yEw^]Gt͋ЙW x֥OY'utχ~鬇zy_9ü~5u3OߋK|tOҥפK/UϾYUtiuDix\.:8\]?v1.7.{:Vq>un9\z/eK3yt﫮\uӥG_.=m]엞.~uguU:ɾXåg.*c'NәSjG|p1k{m.]yygs=G|c_[K^o0u pE~һyK߮XW]ӥo^uKu}ӥKϼGtK_:uY/|KOgҋc:.|\zcnG<:u.k_:q#_z~N}^Out^ ҳ:y:ǥ"tu)\`?A>&׻'Kn.=~;_Ա_N:]]N \2حqץp8t]ǎn+]uvtSK}=\z_Zӥ[@^t:u֯Ͼ[w+v헮;'/ԩ.>Lp0κ;~]y޻_:GdtGcgu}\3|y忟78.}K/=ҽ_uŸK..9.<_z:tln.=]xeuԫuK:;KcG7K'p1mN~鏯gkuL￾\z]S\z>ҭK:g[7 ]up#w~u?g|~B]dKt/:cKzƇos ƇMlaOq<ؼKҳAt'.=O?W]zn1ԩc:]utEKo8d:̯:]u_pt/ׯ0f.=/u1.}֙_c>ҥu:yV#_y#:¥K^Ot/.=.}XGQy^./=;KK5KtӼs5]u]p-y{t:uq./'v8~fRե3'>N ۖ|[ҽ^p~^ҳe?5~kѕn}~u-uLa<ҧSgS3]9uK3KNn~x=ntvt^uwſί1ҳt~wӥc\ԱSz ֩!NuJ 7K:#t8=T]zׅgpu_<ޭ;wS?0Kߨ//ҳ_kաӧ8]yj׌3s@ҥoǟ..tg/xkљSǪ׼.yq~Vׯ1֝<=Rućӡ5ućqG(c`L㙯[컱tt#æ o'yå_:q_:twyb|ts~s8u"/:p30t8}Fݴ[g~W7>B:uӱ#=]:wGtt95]':i8{]q[Ƈ?.:#ۥ:u t֥JN엮sե_?_:vI}Ytq|os|y~KNf|tMw몍K'K7=KhRә}p_zY6~r녢['_;8=.ҭcAåるps7S.wݹ]c\['$sGKۡGHgN>Iϯפuk|͢3>u_:S]z?KqefԹХgt}KN>I\KuetŕEԡ^=3~~ޯtֽХg?aݗK~;^K7_3ӥ뗲_ft~FѭEW쿾nǥ/.,׌Cnd:GCԝҭK_֙ҥyқ|q5ǥ /^u֯QnƮ_grkKN.>st___,#߾7_׿IϿ%${{OW?~Md m^l s/۷kی1^ iU˵Yc*[4 [i ܫ~N%yz se?ǃ5ϋimv0ʶ̽& iaE^zM)aJ̽خ^,=¦U sv6-̽6^Hj{`nv~bv^&l^#lZio's/2>{aa"[k]}Mcw2";d0J̽ wMkciܑ̽-s/{2 s/>>¦ղ0d6Ea}6-ɬ#lZ#lZ;¦U s/ÿ?¦"l~{=.zMi=̽v|M v{l'ar⃹s샹ױ_Y4{Viu+*r{rTQNy8#jZ W^U(bwX~}DMkADMݫ#jZ;ٝ`$Vab+8wfxijffC{=Z_l)Fbk;{-ϸ]Z$!N^%"7[@܋)L#dZ yKܫ)%jk{mX;w* ⾨p_;{ɂj}{1?^#o׷#^Zj~7Bkۋ^j( ^ͯ÷Ҫ·;~\@Vۭo <,nK^oxK/OJǿ W.,5GxqۋbD|{xi}]k߯t_qso_ K }KKϋp+5'oy{1=nP^:¥t xO#t{# }ZBZFvBvE=t{5^/f6إ*n/vEW=0N^bn/vGɨۋZ,tn_Hö/m_TRR%ݐ=/ de{8-! a+ۋΐe;d{c}梕!xCׇo2j&/ _j/d{5Sz-!ۋq ^3"+;SBת^DG+ )+ۋE9lߟbd{LhlvDR*z+]*Kv^}j%d{QN!kv^.MvCbG%d{+J :zkE~^(l{xkG&xUޙ=|`{Z^-$l/<`{Ab&`{i߆ l&`{)nDh%_2vCYJ^@SK(|S+bN|#wW,y̓ƳPݐ͸Sn ۋvU a{=\BBbCY`{!.ذ 9M ׺/µ/}*[P]bGGeP{H@դkP{1)^KwJQnQ{9{+u&Z@դwP{݂ȝ5BګԞb3?P{^-:jBP{b]{e@E j/E ,"^AŢDũ5@5Qqb2P{MګpAtEul*fkj/6WDբTj6P{.@u{ZElo2 \Lj/Gs+uqG|=U]6:V_bs@P{fګ2ލsm"}kfa+9BxM{/=i 4}M{^41Ǵð8]X&`ô57`ڗ%/#ֶpL kp_ehz37x!e@W+ +9CEF^z%T^nh/N!ګpZ^|S]Nο/D{"杢=u|@&6?5n~Eκz"BZuXQ!D{F4Z! ўVD{>H!KSh/D{!hϛXan]槢T$E{-=`)ڋARHh/VpB:^# ўw/DY ڋ/h!Kvў#=cXmnN^CWC^-h/@@/Zs1<{,S}\2^3@{`=oBB^6BnnUAz9r!wy-OSG X` n>^V@r ^,Gff5hoEKf&P^l4 h{nЫW)07og̬3lh/<Wƫ*#ݖ_d#3Ӹ&`' #3 vS+ēNjg}> [̑q+xԂyًsoꆳW !=V&j ފ73^,g g˫L'[8{u5-28{'G^kG^fZ^^m#/tbiP^j ^n>/8{6ޑYlSg7R^XLۢG^f3ZnΞAt8{5}SDZj|@^f ʴ̥noq_V>%cLDWsAg^yV@chu {<#-f/>n^[^,^f]LZMd)K`8>2+w/1{ÀMs쵉1a}e%>B1fbM#-zwe)T]^IdcYI`JXOnLZ^oq{ex%f6(f/݊{qLz"揼Lρ .5~_WY/fZ:1a݌?2M"Ef7L^* ^8=2 .ueD:^'fwOR:1{Sٽ T%y-.yQ쵉I$#fw)'f7*ftqp|Ybzo>E fKI$f/mcsbJ>1{m/^m f/bd0{o~ fID٫x^(.fy){vՃw?kmҎݧ11[bv@ד?ڤ^(&f/jH̬~Ŧ`qv7եuZM^&-{2kak,M̗h{ΎxR ~;3~ewDJsy$fGֲg sG<m"$.H̬Y`guI̼YX2 IURJ){Y,'/ز̤evڕA٫ [&dwCY^|dY Ǐ!wyx|c.\@:H̜3Ma& Mdž$f#d׬] ݃3@q3- d-d %rBru\ݑ q"dBDRyz6V?A-y.Aw|x~6H;S^Z)w%7$4Zx^~腬Ř","مK>qϵB:κl'<7/B> p3x|7>y/-a8sx2UHNjN\J09 ϵew˟NwmjN!),oaf6x!d"4w߱ |L3~vx3J Vr|a."!%p0!W>yϳ43g W|="oj[y3gܹYJt]LS9;s<]{8 FlvWJƘrԌOw^ތ;μ;ϳLRs@ϛ65y x3`n!Y=^xN@$94mKx^x(vs~ްNuΗeݟ63$/5 ~Se'i2[1-!;Jy+|M2MkkTMr;$mNԫ2韌{L }Tt2_a緭axPfbdbym[ymd Kv^擝7Yy@23Ɨv~2)"@pәXuQu~on"j9\͏:8R*Ƀp>ԹZy9ʸ:Pux:"YJ>.TY uZ&cJTŽu^#Y9syہ:"_, ؼǝjl: Q@Cx2]8GtPRΪ TyoJ2 8:Gts+nMo BvRc]PgD񒑷c`ya3g1qq~Ǭ8?<&+guL[e,\ "0w:GYAts|dt3n?L} ;ԋ`F^C'S:/6BWo΋PƠ[Gf 꼚W:Q꜏[un9չT6zFlt~I5SP@n<V~[M+XmpFM4V/o57O֜;_U)ը.Zy%od0fj*b:< Nu~mU ]GĈ0G]PRΩ:w#Xu^ZjRy*|9":k]fsb1UbM7*U>*:7 u^nY8M7<=꼊P/']Ջ]aݲ󴱲s(Ϋ]eDd癳 ;UMpsW;Ϝh Ow_!y o]9[5g7Wy^o}VJw^u.DFow_&Vw^Cu{^V61϶LM~=/Zg]a=OӁ=O=iDK=_^s9=d}Kί,2_8sܯ7,tqK]\*OM߬&oLO}^G)]i<͇ܖs-G0fӍ K-5$`Ϸ|sjSN\}3N$>bi!>$>&}))V5v*>=,FJh^A4T- ~>_:4x ץ&GǣQoW4bb5oEAϷ~}[/yWHN}C=ܴuGgz~̍sS>/P&J}^-[>ϰ<%dsPrJyrpn7}^헽y}3>WHϻ) :c ǩ#m}nE}n)+_u`Gnv^iQurLw7ebLX{HTGc}7"}+ye2UC~ERw⾧>/ݷ wep@?us[+M]z>} Cр2d4IB$C{ϨB2׳VfFFyͻ8.ڈ#5y?~^L̿~npƇ~޽:7,+n~xyGIyac|4UDN\/?(}9 ϛ]q9Jp*Ϝ>r}yu?|t*H? Ty씽Nyw^_9?t퓯̽ 9SY7s+p潟9wN]Ep_+gi 'q~[_&@ovߜߟ<N~.~a}f_Oyf~"?loV.fs/#ȅAy5}ğܹJ?N83MCՍn)teO>3ǟ?/>6=۹J>xŸT3M(NIq%Qn~ԙ>>Ns^O3^vviJJ(^Gn_@y{:)6uR qթmU0@~Vtۑ˯gwxe+ OO/x,a9ՙk=]G6*X#J"oҸ~8V-P#hG PFS _@.q3s?y^9somJq H:aWb2^wVB[|Z\M>_j.v+}~- ss&MWgK`^ OqfWi;JO05Ɯɂ=+E>]۞_u9Ad xs4Uu~i.y3Q G|NVތ=_kti ^RtTL[qGV9귪O#Vib<ތ{U볊^[VÒ+9m \|[T*7m|FUvÿ>7@|n`9Y-Z팙LQls/nm tkiMyf*-8&I(E##=o@~y'6Ř vz9kSu6=7gz)4uE U#ٛ=KOUy~ @痲|؍LӀx* Aݧ!ß'<Ly޶,Q\fך"K}z~|j'ui[xX|,''MLt<.tv]Aߗ9aߛ$qТY^:Ra(kE,7 mrc7CYs0ccu7ۡ6iiY5/>oËksq%>WoϏ?\_|0>"Ͷ;s}Zkv1:G#,o7G|ny#2ϽQ'םy>̪:sY5۪.'cZngM1:48ޙ*|-{7{gqSPŭOv&czÖ{]Wj =i7/i'ϡݵ;7YCgq+<'pSe/z~H[i!ERQx15 $?[jRtv+ 7fqݧf߁t?蹝/V-n^>Jg8Y=g5meK2gvyuA|DŽ$ D;5tV7kyPs;4'8]S0}G*3J2qnэ~q1ε mvCBϗPyROUwnt(2(-RJIrlAH`㕓oy4' ۄ˒vߢxp4'f(iKynt\ <#&WE8(MS7<yަoլb<lܮ?%KNyly~;ff禁)ύ@۾#ϻrNrs,)]$su<ly>,YfLTj_y^mZkK3^orQN8T˞iϏ<7Iyn}\e9u znAN=⚿yR_cĩLs3R})ǥ^zCϑ6(UA?U4Ƥiayq,zA@7Wޯs *wy dX9IO6\++=g]RO6??=5)zQzn}Lc6ƞ Fzn^=Ġ)|DTLw=g42q]:#XI\:Xۨ)'q)7ƞ{2\O&=c칾 zh^|I㧝4 4ZAe:+ĞM&Ugp[D{vM;}b{8 ?Qױ'c+ $- 㞛LMU圓{~37̵+qKINs+֤w2=?5?칓My#j+gҖ]\{k`m1YܕA~nF>wm>׷͜ܞ@6>}M|n_!3}n4|6UX}Fۦe@|NQp">1A|Ͳ\&>߿{}n1 yqڦbs9x;u_vysl|>voy^TU>م볋SxX^_Yn6>~g6.|dX|rG_.Nm'>*WYFS>'|n'Ϗ=,}.>*3v4.FczЖ5 HʢK?{n.4{֞bZm\ʼy^AWzn*=6zNW.5ꚥM/J*C)(zd?9|bL ߗ+Šm/26=~Wwp q kRk.FJu6] rWׯ/=(ϳϖ~]VUgJsǦ$')cAltJt ϧ躕tMCOrx+o?Tg#[X?}zUg^{wWǞWY݇-Tg>W M>^}nZp[]N I\kNyWe7t9sS>]jr *,^@s>׳ϭUՕoکN_[t]+{2ܚ RJ돧61x~1Gjή)]'zN|j3e՟o].>RV2PP#>:ck+X3|~uYZUg.hǚ,Kɱ52tz3-Mz~cu  =?9??I|yŜ|5㟌=YG~yeW0P8wy2Xjno)=|J~X¿R?6z?Y[\R^i:ɬ/Yx*H%߅9rv))Δ"_2;ř@y2\թl1fuJ-o,O# ҔKZNo`p .߿sg*՟+Uj:ҊS)=ﶡNRz,0|-I=yQ{4\(z^VIY{>>>>R2MRһrT*=fy可ܣ-޳|BǗ;9e*üܢ緔si9̿z~=oRsfqK;c!zNâ鹩sۢצJ9?oIѡd)8m&c.i%?rOW’ŘCϗk~^u<"-MKs/y䄞'6 n|q >?Bi_rI.$'G?4X ?^fSc82yƚKh~b1 s[%)tSfy5+ɏl|?\|>.' O_BY4[x>6D 緇5o-+ y,=..z>}O6=oRFw=wqyQ彸sq.wKY\p7SEU{G=7{^:ӳ9~󆞷tdrϗ9YuH gES߮ +Wᗞ7/盞ś|>#nϧ9Ϳry˅?s姧ñ|^Bϧ+5!jO[ZS]>͠ > }^s">TV9mՠ>#2hIJGv1[NGR|_ZwOH>Upl8A7Ǐ>s>9[=,pxq|ʫ&Hx֬PΘ͚!g0ǷocC}}ӹ+>z{{?꽂ϝZ?5=`ٷ{Dxa8+p0jf*Cϭ=G굒έ2loMgL ׽&r o??Iʟ[ջ7paN$_\3?oViXПGޜ^/k;k+nz*0ކn[\zsfǯTivMTGoN:›kÑ;yi$* @?X-n*V5^iu|8 nn,:KL!< @9i1Aĺ!t4H>$֬qZ.AYak!݈- uQ~> c/NeaH*w Dto_zUC/}>$GrnčgDغ!v)n(}}[AgM^$ ?nZt Ao\? ])A?%k?t# ͼQϙoA;<}qAsɦ~%B! 2 ?OCι^sZWo#\ r-AoFI=~n,nEЭ O=Vcp<69os~s}篴_n'ތ) AoFIЛK=nK :WŏV%)'%KЛz T $%s/M~ DU󸽾^_IyK+!YկFP*At[0HA/r-ϏM̿$A=Ɵ>,9ߡCЛMЋɣAibnv7|]1שIB]PCzW%BP?M!CzY|̙V`;BeNy*tO(f BWیa5Wc0zOk"+*u߿e!Ps|,9X^!\N~ѠA7|S^wgzoVDL9Sc4M{բY;c׏A$VZʷsZSrնRO^oeSrS(}aqsoNvyslx^ɢ畎A_~ůvϧ-?r /A/ 1xB~?O?q˓ِOAStݼU sHнٕ^ɡs#Zbn {E!!5)ytt!!2""F i7)vA}?%.@)Af{Kk|YɟE lAoE!1{Bi;}JkKW|S+gLt ޽VځTM5D?]u/1 GO tJ?Ƈֿ ɽsǛs:}ޤcKIu׆y!Ы}Bzhtj, u=?K;UoyqͭNzҧ`0dZw&?w'swn KZ&Oyx<`۟gw2ܣ_Nb]ZQ2Kj ?oCW9zzs&@Nz0];jW?hfoWfysօ/=:u$cZ O+Ȭϝ}:\*PJwG,"ܺ 越xi-p= ~xkωH~4CSD>D^O_>@wl=hݗ@xeW6:}lÙ7Uu65i}kNɕetb].?O!&>~2w|s- ),Q}Zt Ϭ:8^Q@:}+|[>s+ۚ);>~~m~*-@w*@w@xnzuRWog-iP@|4ݕ "[5XXBK:@,X.6uF*ЍUW6)SVy7]ֻLSN> t=*ޝ*JF"obM;!>sZ-1}x}-dN9Ӈu$SNDcE膰7[-7Q:%?X7. O.t7+1~x}A1D_>@621.-[l]s2 ׻_U5_g"01}QFyqBeΦOyuTv5Q^?/|њy+CL:㯁[qok]54\Z4sVʠ1nW1^4L-*S'mS_\k[gJ  hSنih' zDӎ dkWmsc޶i7U#gzi=>MO_ϴ-є??z.}h),>%2 CgUW sC'_)`ǭ~;dҙx0܎!2ayْ*^)/CwSQ%0a ih}5"0cO{5;%M9{I u/ݖNf}0a^yzCwsW~UhvW>i43Ku~}vUw? Y6q_ }QczUд+VG/[M4'B7sVBPZmSO!fzhVz*dN)bxeb$B_}>&Nv!tL!t6"tBF.]l]u?Ǚ{ۻ oSǿ_? LOr_}㿎?WI{oJKw3DZ}Q7.3s@w&ckW'{dK.!t~WH;-AaCYuQ>Kwqާ]MPNjƐϿZG}Ӯo ^m-RUѾE.vN;Zk#/*Ќˡ]>ѻ:Imaq/'߅ЮV7ƪ}H~{9?w t(W$2JK>w֬_{W?.~vn6v_xz_R}zcGjk؈Llg7{w!*~W;s&}ѻٯ~R0]jhNOp0zgm\ލDSpvcJa_~7-~g.bSx6Ͼ=Y_?ZF7U] NA9i{G+vewQtQАnry&ۿ+yg7[^tSПU!=]i/;6D{]F?̼Т̻/ȼ8%d?¼wr;qu .k}Cͻ}1"03]ze'V^#* ޻tbHyF+P9>tW:rhq-߻Jw)_I^ף@:!Ǒw`/TTC^w#! kǏ6|C=>>9W9v|t)n̥-ۈw=/IE|w1ֈAxG!zݟ}#'Wpnhnku vcg#]K?R㰇Hxwh"f!^.ƇU#]PxMG{wkuڌT ;Lؗ1+]TƆ}UwAw}c;!Î|W$ŕXqHuQθ|rP!y%&{ QP 6~؇Yf6D x8ߵƾK}ֽ_dw'1Se$aԨ! z"m4=Gt nbaw&!Zi󝧀ߕQ](훃¦TbttḻDaQ1K Nj w~4w7>{qݚO k0]`nYS3e,8 ]V ϟpoAۣBϮKHR=N{n]Pv_pNv'(v~rD+]b-Z{ͲNAݔw {3v+F{tWhfvS9jltb+ɇ90wݯӱ-FIe1ò, ws"x{''5hndU0P;b- ;MX$0&¬W{oXVz|tcLa^  |şqQ|] }ݗ] AG{Hm\71[ xݗ{v݇|q]ȺgDe^ 3`Hڼ9:;Wロ]Z{ i=N2|YI5̺*WY{b>9kXHjJ<лr4q[[ڭьV+Nꮜ doA4_]E4k`2{2u=NAĩ[JoߺWR}!u(ɜwet(. 舡TP(C4[ǚ&ֿ|=m<v[2:K;0mw2q$Ajzxy~ra;=b/{v]=?=wkcP%y#yx/ߍW;;CX:|wꗫ?B箦sʇ9-U˹ҁ_*ƹ _B'¹?w7o欅7Et[ankln`\s,aͮ Q〚]4n^ \)G ffv ܗq/ =h1ׄ(y&%1xn4Z({O v2NQܽ3UwiH9i(.u iGmy ,BaNA:Mo{Oj@q\'~*fߢZvEqo:?ڨ XaGe{Eq`o]ǭ}ÕްߎzCFoMB~T̾wt xߚ{ovoC}06  .YIQ ⛥h|8{G3`~Gs :?:d3k`ovU`Ս 2;b-F.J(%G4b0kxɜ q3}|-;cO*R.n$7W0JQEΏNZợ)ME )33t⠳z }3$P2U)_~]bZtZ.ΈNwhN1XW^;ҡ#!u fB* #t]@Z 8Eq@t{!.7Eq'( _x\4I 6M=h5E!Mu#rE:vzrݛ庣uuMu:S4߻0LQ\=z3gq(W(Nk n_(\@Ű\aJC4}+o{W(sKm}V/v*v;HvmeeCnaoJWvۺ:?:Afm-5 P[$C|Kpv*rOw.Mj[[nRkfWbқegu>ֻd?ќ!Z|T PMtMA6W:f۟]wmi{w-}|w/+BB6E$ߦZR{27ʹΓY⋠Dhώf Eq:?Ukh{QN@n!"g{WN+Rl(Eq 11Af;GY8e0\ZֽcXY%X;PVqݨ0I&Jv/zHF5.~(>T`)fWxm/c:)>?:&8]Kll/y['Xq^z k(._غ) LY,zUrza ;l ;nm[7.1I: 0X- +[Y *XKu@Z}徘ֳʫ^_jZyTԗW-9Djcr9\Rj_{ ҥ⫙ZW].񪹣j1`1g}RW.e{U ëJƫg]ƫJUmujݸل>LXNjy4V« 5Ks@xUq:r&i4KsX5؄}4_*: sU-īWF^lxU#/=aַY[\Z׵7VU-\emǫjjW}$\k+|ѢxrU1[:yīJ,iU;:x:DUWe}?^u\ ܚ99UUO&z{9!xPcEY;By'(^VUƭQ</ jK}|2^ٶWMhj]񪞮BZeU=ū:3ҫ>xUfxթe^\H=Rf*CQEzzնEjUWL}p8۫;W kmm^ճ ^T)WuWW/^u\Ksƺ4Y.ӫޛƫ^ūmHVЛM׫"CovOnxUj񪽂uziW}Y^Ոx'׫N?xCPSƙ՜߻=6EK(x:U~rP47Lǫzj c^rJHPS<ҁUQ^(]Y&0bb47zGnW5r=^%RUuƫ PM{`ч|u@j]D޺īW^uqW[xU^&bJU7"~௚?z*p'z47vQ$ߥiUqzաԫ j:3*t'gOLVūV)^4w/ǫVWū&ti.۵(;&W-Nr4w+RUIW*KsV}īdIzgdi@x;>M5^lxnfn-ìgjGxrKWͷ|5zUxW˃90J6~:.ƫbW5/xUβRNxU 9^UڻƫWH>^utxQ/=WBUYsӫ*Wj!4^ c/t?^Փ[j#WM"^uz}lޢ&޺Ho(^U!R^576xU xUoNU?QmZM =Q1u: ë zgފ{FUǫzW-:jo:?WƫWӏWuwW٧zUoU07^8gxU?xhgD*tatݟMg9mP2ə=>yEЫmWhx{\UYUӫ= ǫňW9^uܒۛz@^WtiNmoW{Vz;tf?A^4"{N }lh.wQ$),$9^g ?zURo~>^ս'jL=AT6F^:fN~%Pm8NӃ{/͜.sj׫V!_Eΰ_{4'Jķx|FxU:U^W2ǫ/l(|[Ϧ3-n]!^ UW:EzyLNANZ[/R> JUj8^FXxեzf>Ų&P ?OYڍ;X4s)_N^#gl 4=HVzUgWj^>^^*j^:RjO69]:.dz&TZ}s.V/|5^\|Nb9oͲRtxϦ(HxRU1W:H񪕍]34Eq>+^>ɜbj/6PEjNA"zyscAo<(Ӂ=JP=J$BwƏ s}{5fUkjYW"5n*sWG+]s+zU5Uǡ\rWӫV4J(것ŰJ}t?jE}k«vU:ӈBWHiU5o^ltCj^v zϦ([x2>xUKԫVt!Cܚ =^U xX䫹nH}ASEq;,#rnTfN7}rJxU{/l"x>7PxUVնWfκW}| '%^o[(RH>6c<WT9([s{t9Uǡիf%/Т[٧ëZnjXVj!*'d%]f"? 7!Z.qz)+Z^iͬnD|q!AMVol9a(UzӃ *iϷ^՜EqW%8Eq]1K%xn?x~kQ\WTpWv|0ZW ի;SWRJn>ݒfYpzU+%q .ٺ'RajU0[wkUOU$xW&cI-#%UWԓ]vSfNxU(Uz{tf;5WS9K&+d9: U@5(8T,g'f]o^ǫN6h. (x@ONQ\Ԝ*uNxպU+?W>^u)HJQOwT ^aCԔ 7a*Rr0UOLq.-Sy՜TUtfU׫1~z7U ƫ>ZwJPsԬ̰&ġ}*Lz8\>zރxպ5WH^~U4zUvdʫBj}xw8UBqOZ84j*RqUوcy{zwS`{UJ5Z%^^'_:xm?aON)YY*|G]U|5KMG u:La!4ܢVǞlzWUAżzv܂Pԋ;!yr~-U Wux{ՔU>sV^~v&3Er $'~4kUùǫn4]KsCOcZЫ| Ks6_*7WGU~6-E- 3a!yfiNzvCnw4wiN 7&'Ƨ*s0a9䫹[(s|Ui*_ yPPل~V"^J0wUy7n ;Ü#_k+IΏWuEzr ^ÚϮ]ԄW,u_zU!ܩHM-A y^l+[Vry}l%whR xUEj 5Ksfig:47TԹLjELE\ AKGUs0n-JxU^uFjP:7~6vjwYӫ>rݛ+&)Pk0L"boL9}h:~#PW^5KsZU+Aub*[czնj*G=FUG$ΰ_UƣWTW^u(' 0O׫[`'NХ!_MxUo,WEy&A(vz+CU+tp櫺"jW:U/o7U@}$`F^\kJ.g$#"~htf[>uEjNA5͡.GU?D9~o/?9xKsJ9{JJX5T$䫲ƋW>>g`Fa#_z^j:hjէkʪVrԶUo_G3/y=_E^XjJ7zQB_"|[1tj:3 %n^D5|Ɛ]@xU˫WfU/ȇS6x'_b9V2$W-9əU6kI<؄%ei䫶/4^ղU=W_ë^TU$_xxl:?@5琠~tzk'1at's 7L]^4%:UHHgU-Zq]U7Ƚ6hfU-WQjJʫ/ǫ΍[̡2$YVʩZG^zUw5JZjVZj|*r깁j fxpWeʳ*9Ji@5W:cJ+ԫjt5^/]5_JGgUMb*zW'zxѤW×2oƫŕtKrN/6xc/+uzS{nx0LBpi&P@|_Rg|ˬ҇ӟ%'ǫV =^ ^m^p=Z@5}O%I|2|1m\`W]m&`2xJ2m\-RsQWf2şxU3R_jH|ř?^uH,szt׫pdj&h!_%YT67 _6_Wm Wn{>_gUK>F< S9'^IjNV/96(!>HX ifWhUyEzզuxUc^5xU^@x:AWͻWV-^TUzUK^RW"_UW&_UUFS^zUU|2!Jj:ҝ_G 7]^u0zӃhIPGzZ s0VtZ׵+TW5UfW9] 3+z<mUjx{5RW@5}96h>/j&5WEfūK?^5( D |57yUaP͕fNW),7&_Ք[Uz7^JoSxU Cz U4)8}UY^ OUퟀW܂l֛ì>櫪U0kլ^ūg:Ts ⟊WUxU=eW~܋"2fMa0(] *_QU3"_MU5MFS=zEM9&W=43(%PM =6h:Ɯ^ xUWÖ&xU6AV"U]+W欕W&^Փjj{ǫVo .īĉW-P^x̀W=wkYjV^3-|jTg׻x0ҡ'_}j*U+5BUx ^tf>S%Amy ^6V/.Wp^F CdwVÔ}Wz+RxeWiYJӁ[WǯWTU')GNE&c}KxU Uǫ WZxfE[n{񪶝W[z9|9]s:ɇwxHիڐ*^)xU:0U-:^&Y^uhxn5kZ[c2mzw-WuY8^8Ӣ8.->^uW4iQ-s[j$njqiCӢ8ȁ3Jim}ji֓+ݔz r=V/񪶍"_ūZqWu)|U[U \H|U}' ,~UPTU^N|g>9ͼuM)mգfͲzUWʫ֓{iE=x8JSwql,C+_5/!^u4>2UQC WNSn7_>~QV/s ]87}e9prp{@Yī:gǫ=M/^վ#MG]jwjtKzOf5W~ NjtUI}XVZWX)p9z'8ivMUЫWSǁd,:!ĮUOŕeyP*%Y,͚TkW0( 9«vf9L3aM𪷩U]ƫZof||ۗ0P<1UuP=J<Sr9<ī˿Qf&|1#2I(WYtEqmGY_xbU6hhX䫞2RU?UE=䫖8NQ;_ $,9]^0^UAy«>LCNYs 4_fYTSWqٮat 34_ѱkV^HTjnOqk׫W-'{҃(Z|բ'7ۼ-C`/Z[Ojtwk=>5_t^UԬbGs_ZofM^;_5fQuz's˟@ī \C86 q>9׫.F-W|SKb0Ô_zr'_դi*;zUzղoi۞"mdW UիN!Cߢ0Eq׫>UUMadJu ^"5WxSǫ3|wW6^jg׫>Ϧ5/HV@5(!H@!U:լWzhtpEw-4ā#5͚7ƨaڠ={jm"Moxť|c0s铹dU:82xպ!aiSEWe5Bʫī>|U'!ũ˫WEqc$_{׫NZ^UQW;^իiQ\zUU%_UO |xؓ9]zzON*ywo꿧ojxUW5WhʑU R|1W@4yq 474*?LXRa~4G¦^Azsnq4d"ju~j,).[]Dvj6bUMr:,qox m4ل"4^usx?"x~/U"5mx /sU+lwfR? K0^5=WW,3a%FzUUexUzUe :/0_~fi2a3Ksfv3U샇(:^u';[T뜵>W5 jzUv6@Y{$,͙lM:ɭ2ƞM0KsmVrU=Vꐯ>;:*5_Z)JarxU/W}$TCS7KsO0^՛1*zHPC+n5WxU˫b'PyJPJxqYkWSΟ9W5|ն}v ^xUgzUj_k? #nMzUuVr!AjIW-MCc#^uT*hZɑU"r05}ONaa>|:70չW^j=|UC˫-zJP yYEE }f9%0^f"U/DǫUѫWjY5vI9^u0iMS!\yW=IP nmnBMj]{\cP5_rxU;_Μ`+SJjg/>5^*9}}WU>^?[xnz^xU~Eaaݬx|S?^վs۫:̏MSƫj֤qlīVijNxS^)W0v4cebl.,iN3#`w4kt@BjW%34Ks4"kqɤeinP:*Sn1ŭYV*:݅4*lB9h 2Ҝ ͥGȧ[VrKJbI׫Z?S"5MS1}s\ūzu֫W6.Z~_<9^PxU'&;_zUT8 6ի^8݇݁LU5 +p'J|FuRU> *rWPPޟ9^ƫīZZxīV[u퐯j P8x'U f«u^Tj}9?TJGtx0WI*,wUG7"|%_={o^ɜ?|U>ȧ[GzU/jrz)߇W5%4*^)yI).2#RMm{Wwà,(u-HZդEʁA 7:!*=mƂWxUMs鐛!MSuMOʘ;WUmWC^1tطd8~ׯWUIU鍣W&^n{;_RJw}pZ)W=^]ǫ@[Uz Wfo\M|q𪧌BsTu0ZaQzgdHsitCs!\麚yo/Wel9핯|2I#/."5W:T|)RUKf9^UtIXU/ j*_ʟp "QU׫V?7ەk+^`5w2xUW)'_hxPnq8LsAOūL5ktCzHfOwëꐯ&uJ嫴A^OjM';AWh<^uS'ǫ=pjݸU]WoJy.PMSxNwPUzDu«PWed{xUs'?Hū:>DW%lv^Q<ǫWZa֗&u.7cxUjGxUR|JGҥ^P< LxUG!v y(z4tNmpë3WW'^ѺF\_ij76jŞ(%9JSȧU02_i0UmW=H嫖f͕覵u? ^CEJb]͎+|Uc*_jNA'Cj 5UmG;^u4.;_׫“Os96p҃C SܚSszGNw)_M%nQ*+^5W$l$qUgQUA=9n ^~#ëWu9m^jWyҬ@UtٛDǫU@5X,gW_ W%_eYaI=FӾy(ZxպeW-WۍWcc:>^ڃ},^|x{k(Y"D Ŵ(nONQ\=>|U_~같v+:ĭDV/KLC"5W:ZOEɝU'(2|%Wuo]4lZ"t:yī"z*a97aN$^w*^)|B}'(NR4(.pz]ꦾ֝aj^`unz{Ixպ߈WcU"5Eq0RUojO^ҙ`H"jWu*hXB0̲R]逓)W=4zJ_MnƫnE)6!_%eQ\Y*jɄN^~U«NwR_2.rLT Eq 9gY|?^@3/xU{-.@6h>Q R2[[Ys *z|Wl{UƫޚӜ׫Vk9L(Tʦ^UYWZ7^zU5^ Vkm;W5sjbxU&We]fH'zՖ:Gmˈ{Sիz \-fz(5a;;`NYPJA%<\ ^WU9C}BJV_UzU9Ы"0zU^v[mCq^5Q n(UCJdar{ʪ"1 /k-;}/_o?͊_g//?𿷿ܝ鏫QFw/F#+n7!{o} &|G]8Hǽ`aq/G}E}.V c}Ër |pð?߾wGq?(u+Q !9Kdۇۇg+QȊy.VYE9낯zG=0ϻZFΜzs=p7>$TQ++QcPo~w) TcczV=yPvݺKǫ1z`%2 ~.2ͮ _wAz/;Dx{I f1?n(JW:,oA-ܛi ARkauu~]uv"x_%]yl%<lT| r0'?:Q5s=;jqns/vs9Oi-3ފ *56LPφI/!]iNӯkuv4]ykasutp>w !ܻ]C ~N$#7xF$-֔=m{0a#h !َ'C :5)kHRװpI<<Ob/¹{)&(1mCt'f;E ALGNَF!htZx2ʩJsOܽ'^w≻?O$+ -x'޻mMmf;Byچ/ a#})j~ʝ_wu_wu`w 3ނ'C/{) ^lG(/A!vO:e- ̮I\Ó½'{ O 'IR9h plG]  O;e-,w}X8pI^Ó½'sdT<QO GvxaBy؎/ A@(/SV{W\ݫ^2{[Fwzʓc\}|I4,,z%,;k" έh%$uCH+1HD %A^B:"u@09mSHru+> endobj 607 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 609 0 R >> endobj 608 0 obj [/ICCBased 610 0 R] endobj 609 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus] >> endobj 610 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 415 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [118.141 100.657 125.588 110.013] /A << /S /GoTo /D (section.4) >> >> endobj 604 0 obj << /D [602 0 R /XYZ 80 770.89 null] >> endobj 424 0 obj << /D [602 0 R /XYZ 128.209 128.751 null] >> endobj 601 0 obj << /Font << /F64 179 0 R /F8 139 0 R >> /XObject << /Im2 413 0 R >> /ProcSet [ /PDF /Text ] >> endobj 613 0 obj << /Length 397 /Filter /FlateDecode >> stream xmRMO0 Wm8N $@oCY2Ѯcݐﱓ:1Uެ94e4/"'3˭ ņd&cVRTdEe@S, zON,3f7q2=2-D}CEt>NE5$ ^E;c/G.0WDNLe2ɺ"q=U֥40'R2Lz^yFޢE95 U`M^"lq²Ų+`}^f'XuKdJ{.G],k?bU`#3}*>{ء]&<́Ph];E~v 3А1}^FdD9@Cv}L endstream endobj 612 0 obj << /Type /Page /Contents 613 0 R /Resources 611 0 R /MediaBox [0 0 595.276 841.89] /Parent 605 0 R /Annots [ 418 0 R ] >> endobj 416 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./kidney_conditional_effects.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 615 0 R /BBox [0 0 504 828] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 616 0 R/F7 617 0 R>> /ExtGState << /GS1 618 0 R /GS257 619 0 R /GS258 620 0 R >>/ColorSpace << /sRGB 621 0 R >>>> /Length 6431 /Filter /FlateDecode >> stream x\ˮGr߯8Ki3]gl m,H ,`/ȈKA^ }u[_o8n='ӎ1/n}wXڽ[zK;ųO~?ǽۓ{﷑ҽ۫>4XH<vpw<-N>dc3\~/67^RÄ8kݰ?_=ǧ_o^~:9}~8L&nb8}/w&r8.ɱ.p;.yb倇,X:Ã'1MPap|b9U߆'ǃgNɿ5l_OίvǮc&R)/noYtk%O^~X<;]| ׷ק[ nX?`_gקlտݭ^3qw;4Ḻ%s133-fLjKrKYJsNְmN8^?/4zn>m~>_?/b6M~{n6L_2__XHڹqT#qi&h_sw \}֯~fn毚d&Zl<6mOa`|Lgjw`'@~3y-AyWL&[a[M~@aw4}xL6iӮmnIczp95ຍS-x,ySLKǒ79zZ/`GZOZo``ʗPi7s#pK_ǦOC 0Ӳ7G2e/_\Gx,^0_sv)B>}{<<CϱeX/]3|D|D|w# y;wCWKS'k[7XW<|߃?p~(>_$79?$uGR>/}_:ŗ)ic}HtH"m|@Eqr!Ϸo5IkcgdlI=o2~q}`[;>=??g3?;Xt@0WO'|0||ȒṞZze;.|/ko zj^B{{Ob}ǧ+ut`cSSIO=gϞO(&^՟^'o{?l6p"* \y_|߾>9 "$㤱="O 8 TTTӌ]otBp"0z;zv|FSٚOFpѐ#υйy:qDžԇ/~ҾSO}?s5؃~k{?ޞqHEiE;$БÓHO#9%<>=5'?Ȩ~F6`㗲o`\wv]zvCFi,>"ya;Msڟ߬g;1ZȀ9E^R^w~7=YXw ,jWMC(Y[w zv/LdW>'v IS]N4Hmeҫ\Ӿ.dYup]/vEh)ǡGrd͝c[ /w\#Aܖ0qϾ_i&~!^w#+^EwC>@cBϯy7 ކFF`Um(\"r)lȻ%E"iٶ0W*~[A zjtbwF0Fl)yu+/j)5VVOqrsGڋ-ʞ/j5@3K rRtdOhg>ns$oft^XKF\0CEzdj9dwPuU4*r~3ے7^oforJCт'xp{z,VW3ʎtv siM]PUM~3[s$@i>Fd[2[變+{ٖTeNyҼET{xiD f7Oo>ܺ(tA;J%99p(6O:bnW֠^of>p.1ȥNUi*iǪN r3 @QSUϪUWU xYU X[qy@/< r-s{I4&: rJ;r1$\Hz!:%G\N9Hj$qzl}|/ڙ];gѨD#d!z5Xwd:$ک uJlQ,ӈ^.␱h`@#ڸf8H&IVpFߟ}tkyp{gL7S)k/xHL0ɦ-uRŊR\|xH: UmK piB!c,Hř E`Ώ vN1!$FĈp$b=6 72-|>0˸N)0@,$Y <!Y!'=83#\6`Gq 9ΐ}BKufcpBF XaqX'WHk+T`y6-\ 7x3WcE 'C0Ϙ4yRQ3lL8WxU>-]8{FK)?`oL$0sW(!0gTMA;Wq+LgbIM@q$]))Ҥ*ΗpqѱosYߢr=h A$HAbQAskZ%SUUNUUQDO2XJ9ʷJtK@҈$ =g49SߩONi,l=q*EYb۔#8eU.P9[xҢ:q}+ fQu2XRzG7e3 3r,TtXfꤑЄfh`Ii~3rY4Ω/АHѰg2oSJe̮JO̦GMw*ٌJ)Է6 NuENխ@˽Լ\X{*w->U֑ӟp 0PT^X& E3j@alFH`I@H{+0V q S} 8x2W` ۨn`,}cO1,ʢ|F`5NE)x>"1CEQ"@U(vzdPgɝ<i"V8ΫNBRqD6e,t8 GD P뭈"ڬ&IFasݹ,`+[ߌe,/ЖC=\eyOҸZrT.Չ=/GiO)|H "VO}s'~jޣVZpEŶ./oo;u.Z|kh^KiR.oH1TN09Ixh{(}? endstream endobj 615 0 obj << /CreationDate (D:20170125183821) /ModDate (D:20170125183821) /Title (R Graphics Output) /Producer (R 3.3.2) /Creator (R) >> endobj 616 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 617 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 622 0 R >> endobj 618 0 obj << /Type /ExtGState /CA 1 >> endobj 619 0 obj << /Type /ExtGState /ca 0.4 >> endobj 620 0 obj << /Type /ExtGState /ca 1 >> endobj 621 0 obj [/ICCBased 623 0 R] endobj 622 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus] >> endobj 623 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 418 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [130.85 110.983 138.297 120.339] /A << /S /GoTo /D (section.4) >> >> endobj 614 0 obj << /D [612 0 R /XYZ 80 770.89 null] >> endobj 426 0 obj << /D [612 0 R /XYZ 127.102 139.077 null] >> endobj 611 0 obj << /Font << /F8 139 0 R /F82 178 0 R /F64 179 0 R >> /XObject << /Im3 416 0 R >> /ProcSet [ /PDF /Text ] >> endobj 626 0 obj << /Length 387 /Filter /FlateDecode >> stream xmRn0 N4A;t0\hbSS$# PG~XE2-SRB-(cQ2B[(XX:cɒ{<=5+A"=ïP |2Gs|(&CI4H(*i%:}E<͍\\SZf'.z5@\q:n %HqtٝI ʓif*8׌mpѨ@#)=P :} ̰nҏl7߱M51ʽz"5\:pFR Hu=uq2LCQS[Ӹ Nsk /5xLԵ~` !w(E endstream endobj 625 0 obj << /Type /Page /Contents 626 0 R /Resources 624 0 R /MediaBox [0 0 595.276 841.89] /Parent 605 0 R /Annots [ 491 0 R ] >> endobj 489 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./inhaler_plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 628 0 R /BBox [0 0 612 828] /Resources << /ProcSet [ /PDF /Text ] /Font << /F7 629 0 R>> /ExtGState << >>/ColorSpace << /sRGB 630 0 R >>>> /Length 232956 /Filter /FlateDecode >> stream x콽.MGqe @10ḧlIc7^SUW?e?a]Ws_{ꟲ<]W?7??O߿gd?]O?Շÿ<cjMO o< ۟~'|fgOypi=]?JןG^x 5>ZKx={a9 ,oQ=8;X q\vfZO)VO Bϟq|ȂSjrTx̀Q-GeGuGeO;ʰQ5;> Uj>}0v' {^8۵O)q ~y?GwN°1nб/°1aq\61|0?LjO]v'¨`*ƨcu\Zom0@9 eWc7 "9^/?u^=@/.EP:=@u<*Fv_|::n*P/>@PyUn!. ^P^EDžQ 5(^5j107~ku1f>?Owu-rCS-v<0/姓-|=.B`=ڍ-=Ekz}x Dˮ2*M<odtusMn&mdS@/ W_i^}?|R4`2ϫ6-=󲅳q>޴xA?/[@{cG'~,Lwwy= ^v S;t˸jzكq^/@2!MOU^le<4]<UiC8ㅿ77,eq_~C1+D e챫J}}0^3\pR1c\z̸]SƮȌ"pM|kx`rgDM8C^b1UA}itNW~=|~yz#^O? כ5߿F~/U2͟B^fP379!^Fji?̸_l*}U"zn?`5!2eSR>R_o3Q}U;%cwTl}u;g/߈'r'x۳ˈ'۳|]o/]Ɍw8,,>"^p?ǻߴ;|d.7y֭Q޺\5ىCoИz )^ӄ@u\vޛE=L_!\LC}7{wࡾC}7twK+wm}!扺_][wW)yګwMoݜ, :x{Њ%}1^/wX7;[x~ջlRsV4ջ+דB߽<nVn>^< }w1{|*nB]⃱/V]."}2*r/-#q?^:]XH+xbQ%/b^ ]d{!?X|﵆ߟ:r^ 7 ),ݵ0Dx˽Ezջ=Bv#~/W!/ջk`| ;rwJ/&Eq<ݥ:|'q!31rxT28~![l_8뼐/k慄Y{`گ%jCژI}W2e?_˼>J^M}_muq_Vn~~%3&3a-% ?Ѻn1_[I~#~>OJpJ %x쒥8,g*Zgx//ɷ t>J~?R{{<9^>%y_ͼ}7~\]>C!f;?暎%yϧG<3on||9z`sIzƷwwy=5% y=fΧdswһb)IONNzesN5SS'pwm^9)ߴyx|f'|ik[.91wwrc|]wGߕ+}|᏾c>7r[GzKQo)}xx|Gwʧ))e}|T/|g}zCT+-CϤTO1cS='rMSSS(rw7EN1ީu8;g}zT;ܓRpKzK=OIzKͬWFNWw^)ީz8;kg}zoƗɇS=pwgGzKQo8-X|]wGߕ+32*#2*=Ҳ*-Rs+5;FJJɺɲɪɢɚɒMkXlFqF1 ` lj`.)q^%ܝܝܝ۝۝۝ەەL+ )+(3(##0*v—cT[Y,Vi+˴U"meDi`L2rIfaMbIFaIJ&!,DcHx(%0k%̊lfA6Yͬfc3k1KF@&τQ0cza8R:f;`Ojd5:&?`^#뮑eWϪgճ:Eб< 9vIaT?j)4-c=XR:Rǖ5VeղjY_,ZVWm~}.\9prݰaUÒ ;箼[y5b>R꣤>B꣣>2꣢>"ꫡdat͝dFAOD|O_wă%9PF/FW7SkЃ¾)8ssAǵCBWuwk^f}}DZǹ' ǵ~xL6"Ni,⅃U)0x&׈ qIݱ) \pt# GZ+Gu$D{ !b}.q@ːGK>]x9d{] ѭ.i83A,vHI'n6C:^?Tz$#-h5>@G֎OПgrG'%)i1`X*8 Cm"d=4>cTư!?K6V, 'C2Aod0ѝ쾜3ŞKX,{#4%7,P `jCٗq`bl^bQ܆8 =cnyCy P&X()~>)CH@-Cz8 AkA?ޓOHz4CCe$k3"cݱH2X$ =P j 9e%/[n@cb,z8VHV:T|y1o9*'+ߖQE} ;tJ*ٿJ*1V|_~䘷 ZBt\QŹrqtXr]񮔶㿣b^fUQ7BWYU+c\q4C"=䩍+(GG?;R/vLT9QQv\Te ؑa&/#;:~wGG=?lzwGIf~^ّbϳu-uqIU:Xww=,; xÎâeߣmO}GGpS ,3vT"*;2KAou:YdgZ Au9Qj? G<:NM/QRfǪ:Z x/`<-'-:j :A܅˶;v]_ z*<8^ ;~ayag B_8bǴ1ٶü`5In_Q^\t$#WrpiÊzAǹ ]U%*!|ѹ~פ|ɊVpt`to<:}:kv%HǀK_P`!#a'XXp4qǃ*ח c:֗r4q)I~﻾3 J^Hz벮O8rx(te3t,.}aƥ/" G}S_r_pT:t?pO%8>wiP<1Ϝ?o8J{ʒxHe:VwV/J*t >CGq EtbEG.h_tûxFGq U/v)hޕ;:#p$fMͪW.XU]ȪY.Z׮ZW:R9;o7P-)h}'̿Gl.}=zm$뽙go~68'5ůgf|NxxKxsO|sKAJ=|yjsǟnsM_**G<ǁ[<k<%S%!lq|;Kf=Oz,p㓞 \C֏=fΧdswԻ#xG=9;)Q9q=pxx#[w\D{-SK<_J{Sz1rw\o9qzxˇKw\oGN-~䚎_!O5l|Sc>p%;c63_9;{"x|MgwWF>+r[̇nYo1vf|y |x|a+;Gߕ+}W>|]wG!8-G|r⨷Rc>;L#;Oc?pwc!qwW$n!g[$z1ޱ)ޱ^8;֛xzUX ec-pwIo%zaΧ$za+xzg+;KXo 뵁c7qOY߱8;ֳGzx⨷XOOgw9ޡ p[w3;+Gw-x7V?c%~Qo_$pOz&[[W \sCKex~)8;%Ng}~Y߱_)pKzNk[JG~)ޡ+bgw7 g}~)޵O8;O?Nz~/x%~3-+&NSCdo8;k.}W>|]wGߕVYoVYoViYoV9ޕy#xvwvl%xXdidedad]dYdUdQdMdIǦ5 ,6t來;66 g kl~8RPc,,,,ޮݮ,h2x%!Eƕd gQ4Fl)T002E3Gh,VVj+ 5P6fJ[YVh2IQ.ɬ#I,#,)T$D`S d]fM6$Y,fc3˱blf-6;&0`IȄQ0c\uLo1G Pl)@F^#+ȺkdճYtmx%t,¨]RϱZ 96M`KX<5cԱeղjYa,ZW-˫U'wK=W{.\7llXsհ}>)+/V^ͭh(訏j+Y$]s'Yu#qrЃxq!`\Āv7l)mĭ h7~# rx6 f@*MLV,;h4*7U<=0U1ySXb![L{pVlK{Cw=!-9W΀jr V#>*Vўh|kOzEaȊXdT1{ח5S/*nȱ\C^=*zwůW:>ړ~!Dǒr4)=)Ǔe/'FbOǔ>ߡ ($UQ#tl!Lݎ.Nӕ#L_cLa9ʔ0Ld9Ҕnc t~L2倇#N_cL:h~#ϸo&ǣ>}#P1L^â/~БD_2 !tDO4Qi,Gpdb!Ǧ rt!G>*QJȑZ x~hUHWUUIYգUJ[UK]= Gr#㣣zȪW.XU]f h ^j)^kW:VAqQIqFÈx{=/y撎czmwޛy?Ɲgo~68枎`sKx9Ļ-ωk߉C_8yVƷƷ5o'~#OU|/G"MGqGyGz pIk W5lni|EmkN'z*p \tPocs#j;ٜXz8pwӁSGwZOl9i=xL/)ZO.||jswZNN)ixֻkwZ/o.9i8;tp%;c63_9;{"x|MgwWF>+r[̇nYo1vf|y;|x|+;Gߕ+}W>|]wG19-#G|r䨷>RS>LN#;SpwlS!rwWDn!g[DzK1ީ)ީ^9;՛"xzUT:eSpwIow%zaΧ$zf+#xz+;KTo=굇GwFi|Yߩ|8;գg}zv䨷T鑣R=LN#;9ޱpnf}~YߩaNSEدg[9n{w|]wefUf[edUF[gUZ[eUjwx~1ޱx㝢[7^)=Y=Y=Y=Y=Yֱ9zcuOtOtlXbCw( 0+6MMc`SpwHAM,,,,ޮݮ,d2^IHɠ \IF ID!)Tq002%3d!,VVj+ u2meH[Y,d9 7\YGXXGXRI( d?^)Jɺ$̚lfI6"Yͬfc3Zlf)&$a$(LE1 c:7L#cF^#Kkd5Yu,z\Ƕ:Ga?.)X-Q&u,ԱK PZزjYbZX-뫖Ueq'wK=W{.\7llXsհ}>)+/V^ͭh(訏j+Y$]s'Yq榳;AOD|O\w 1{ 87ڈ7~,">#?Ru?p cۏF<}%q8G~OPx (/ss~6¨㠏x?=4;OD\A?5}*8>EyЧOgOBE2&fǺmdzS܂I.8r1ay'!2՜b1nw3r<{ƾf)!. :z# 7..gޞ)i؈d -7T (Zn!|džq.gٸd_grC$ᠡTri1`DBC:cD{#cc1ŏ?X)`x![f$s3a)hw )s [Pl԰ryP7WCڱ5t8q7QblxS ܆S`3oż_g, q@ZOH@L3.o C "aŦvEp7a|iO _$@G_|z?{hH1^vC {t :ܸ=$ܸ<4ܠbG?=>o=x2 ty/ܣBoqOqvܹ>;[؃޸=]o={ EGq z;wP]ݥA}辰rv~]p#rl zCCoM%:֤ IGj[85=觾ŽUc:佣xIo2~_lHc{ 8w=-?|@tzx;<v O}ž {7˶؁;k#;gמxbF#= VU^p"ٴ1:ƍ|KԞ<]8EG-g߇kN;}q7yBǾIpݎ= `rlIP 9EG9ac# / ?"ع:&'HǏ MO9E:<w{{2A̛|!-=lY7wp{48=2x~Ep<e _ zgރY(s{{x/i3gh3 GO1猿7ܿ'=py2"3G23p߻gVCNy8 ƝY{W:}W=转Je::_wPg !:J1;B~0>|Չ4_9Zy=k*|=;Ƈ [РlXE8vw}]w޵$:w!]xHu;:O P"|TP#'>K8OS#TQ>5W8,~˽t^ZbǷkx||[W\s7~\Mw- h>\H.i|MF- as \6SOq|ck\'s#j;ٜXz8pwӁSGwZOl9i=xL/ah=zl)i8;x֫[wZn9ixv^\x 63xQ>"pwgNN5;S6ZN))8;o:pz5-|;; _91xxxW>|]wGߕ+}W>Qo)9-#G|هgwʇ))~x||ƗS` cS"rKǯT9%-#7^9;;_)ީ^zxxzT=꽑{_w'NYߩ9-#Gzz䨷T?|]wGߕ+32*#2*=Ҳ*-Rs+5;FJJɺɲɪɢɚɒNMšFyfQ\` mjB?؅355 G jjf wgwgwgvgf1]Y]Yd AAA81B8R` `2dKf1xB\YVj+봕e*meF[Y4s0 &nF$&$P%Q1N~$RuI5̒lfE6 Y,fVc3RL&0aIHQ|v0"%ӛp%Üp%5YzF^#뮑eWϪgճ:Eб< 9vIaT?j)4-c=XR:Rǖ5VeղjY_,ZVWm~}.\9prݰaUÒ ;箼[y5b>R꣤>B꣣>2꣢>"ꫡdat͝dA?P|8G=X'd>Uǹ/Dě}}ٷ}~sxǾ DZǹ;|sx>x7D?C,A_!w<zǵ_΃:^v<8A!)㠏xqG|J@dAqՀ"O=ձ;Ԇ|q;@NS㳧Cdx"Ǿ'*DZ1dzSكI1}:Axw<{;= )\ptۻ Gec!D 2ű$b}.q7*A98~Vt'Yf8tnw7dx@,:=_P:"uj k؎ȧI:= q !vtc{CG S;a1xrW`!՗q;(Y8>?-oiAW"NAo/,]Ao8CS, /(c)8FB',# =bi} j 9g , =^alwjC}m'/hX7!<0oÂS;{/;qz[%Rc5ća;{rlG:ư2oj̸w#3W>{Џ#B2 &C~;!9eh5Ab}O{A!v؎TdԌ'3rOpЏČ1ڎSd/>ˏ"xqa zc|1 kx=%Ǽ)Du*gdGpsvc1qמǺgoIokA[r|#c=lEFۘx=̘{1cn $2p "nc.9=co<Ŧ~&TeLYTDK(aD '  c8Q="b=}سc<器%2*2pbc<V ?NĊx'YIesBҞҨH X -c!iF ٱ[8vv |(jR~p yrł$>G;qKGuL8>8/;p_#50f8Zx.ǻw#;ʆꆁ׈ss=z=?c~<{_x-/<y=//7qI;➎?@'K<'^{<-eǧx8pOc<8i|O6lq|x5r3#-5@G=z#pK^ \w8>S{X'=7S/|7t>ԫSKNNz:pwS#rẇ91rx|fk"x|O/:rcgENz--׬;\rc>o3}/<|x|]wGߕ+}W>|];s#G|p䨷OчWwg))~xx|{_wNww7DN-R=LzKQo9;s"t>5;Ջ"xzST]WwNYߩ^w'zꅑ{:ꑛYꝇT/=RSpwN=/;Փg}zTώᑣR==r[)ީxx~=;n9ͬԯp8;;lYߩ_pw귈5"tLzK G['Q"x~)ޱf3e"x~)s8;ENg}~Yߩ_pKzKNk[ꗊ"G~)ޱbgw7;g}~)޵Ow8;mf;-R Ϥԯ9;;FNScԯ|]wG߱4rwW]#'~%NzSc?oNю,힬,재,랬,Ɡ,ؔ&ņQ^<`Wl$C356o)q~cpwVpwpwowowVowoWnWn4lAaJ2憍3(#6d8 c` ^2Wj++:meJ[YVh2IQ.ɬ#I,#,)T$D`S d]fM6$Y,fc3˱blf-6 LX0`E2HƵ1@&)@0')@l')@F^#+ȺkdճYtd[^IP_I.y0Y-F#%%{%k)eղjYa,ZW-˫U'wK=W{.\7llXsհ}>)+/V^ͭh(訏j+Y$]s'YqKރ'=Ug_C29}nK p8u7gzǺǾ)9Vy>8x/:pnxú!Ǟ=a88kq{*r<{;>{3^>LrCS =}vcr5 ާ^iDZmǵ'ukO]>C].8Oprx A8HS.|O'ie]y^48;Żhs|~t/rpP.<ב7 F#E!NAZˆ8i@:Sam8zN! AG '00&SD MmK,`Xyo|bid狅e=Xts%Ys 6C?#, qz@R:zC/#y|9̎[%hS TCr|5G[Coҷ/3!vle_v, vc‚\;da1os(0Ȁ4J#7F#00{zУqG_2{Zİ-@-MT E!OtL_>wOt318D7# CRH`2tO}ч8zC[}i/ClXI1Clv)3C8Qf܌DF{:#c/:,3A ~12pX!h-VvXOKBd<=d5S+Ao\ό1$2pH#5az)ǼK]dÁq{1~cNx"#nog̍o9oCwc쑎1cfdŏ0o7s1Ê1~(T8Q0c%1j[NT<8*"t{**Ƹ71꺛]/Ñ1/TG==]YQwח.=׭5 *VXke '*^+bazc|1{E7c~+r8?9=^3AEٟOT $xߣ"nyƃ3dw#l*~sa|"5\/Tl+^=a?azgd\·{{t. +sa|C+}!e-ޙ }`Ǥ1`[pء#4b[nArE7Qj\9H5C~aը=tji݈t:b[+G86QU_XsbM䨿w_bG/ߡl=}7PFDZƃ ˾xz_q{{f@yOuiwtTy %G/:= !ǼEGg-hHxpO`ץ=;r^rp*pCMhv{2 }7Wr{*hG8*:=top>_8bݦ(v1 c\H47.9c"+ F}W{$:<'GX Iy_ȅ1GEt~}7:>Q傾SnzĹ@@oȊ ~A} 1)1;JQ.$džc#ӱtt3t7Cp%hHꐭXLEV"ו GTbrQ%w>^SyoUwǘ$OV 1Bd1P0Y|c|x?x;U8NQ9gc&+ty΅|}7[t &X,cZw]M1pU{7 ܑӾ#1HG.ѱx"qF.t&VUwﲤW]$>*]Tk$MzV ]eCPp3 -8t؂>"_w?ɉW pD'f\U$7+7^I*XnN1.J_[t |-2c:'flxgsIAk3'y_ͼ}6t>~is;wg~78lnq|}\J枎`sKx9 x9rs;ƷƷ5o'=lq|gg\{_'s-ϙ7x>Gl.i|[OT}^[+k;KK䭧68686tF|M EWw7m9)_Io)e|qKwmf󅇯o|]w̧wύR>9r[G^))}xx|{wGi|Y)8; 6Yߩ9;+"tJzK3-S"GzLTω\T/McS*rwwNYߩv8;T;ܒR0rOSR=r3땑cSꥇWwNYߩe}zT>ّR=|]wz̬zJzJzJcc;;E;oR{{{{{{{{{cSƚFyfQ\<` mlB7qYYYYYYY]Y]YdJB+(6$dd8 c` ^2Wj++:meJ[YVh2IQ.ɬ#I,#,)T$D`S d]fM6$Y,fc3˱blf-6 LX0`E2HƵ1@&)@0')@l')@ɨ'kd5Yw,zV]=5l+) YF#~d<l–,š’Ė5VeղjY_,ZVWm~}.\9prݰaUÒ ;箼[y5b>R꣤>B꣣>2꣢>"ꫡdat͝dAbAo{l=I'=Ճ~!"`K|oA=ߛwom"GA85Q=Qc/A~9~uϧ1~ 6C4yq;9dAx>#vxaTޘ~zhvwJ@'O6}*8>E#+O{\#N™ i۱Iݱ)߱oA8 Mw]jxBI'A28;!~ȑQ=GZY3vw~eGVߟlH$Kك)iqz8{Ew!@u|~Z¹[C/} aXB7G:{EKnÇx)t4c7b޻{$u? AoQ3E°qy P?ZGΦ.#ibxqy PD#kC c-=cwi oe~uكeބΎ޺@ʛO-CF2st @-I=qF68!%GIá10ZC߮(ᇊ7 c8PS:ڽaLW< UJvs;VTHGx=bFٿukOcT7zkc)c:޽bn ViT"f3c:`"_d@EnTf$9)RZ Z !)@jiz{3p?]jѷhDfFzZwc6{2w0Df(o`(Q<=6{2"y0`c1y1wܤ?n+ĈM|vU{4==oD&zc=YDA`DO"yPO #7)ADzoD$"b^PQ?=R{TmqSS}PWC/H8[^d,<&q)BfTȸBtnFظoF?xI16BE"))3V.)G$%GDG})W;淜BGd\7* #`d B#Oo('P=בt02 X/ʈ {Qu"嵘uןwˌzoW7dB}?X;S=8}]pom}[}f]{o{מ_{9_d]{~-keNA0 7ă,Ȍk;fI $Ș<=jQy')yOPߌ̓'ZXF(;1zpq zwػD42R{}w z{*܌؃DP":-C:ߩgs&SL~7wƌ+$J?,=^b f, #2/|75w[,좊Eؾ36͌K?8K1ݩS~XP-d_z7Fƻ/PR{w̤S wK7Ph#c"3*03e(~k ݯ_.w(~i]!%s.ax&Ttͷza_;y׃x2Tˁ5*xA<*b:G ^(n}"z^:fq6iE&3EgES$EuV":pe)7|f RqfF*HuO.$,{,}댾P*.v ?T]܉g=旝T^uOAƃ =h(3iRy=҃~3(*/NO)c>]bߥ׿CY㿪'==PCk1*fo)/ě *iI 4;OKEb'P[셊Q!:ZnfĈS_\'DHv7b׃b(̳P\[ r=-EEŻKbqT[ԒsN,Ċ'b~KESxV(-8ˍn}xx{k>9_b)oaOb߆q#8r;R? W=p=Yi'#5L>qw{G>qwhxE{5;G.q?q 'a.z8~iU~?{wO>ܢ~`︟8;=io{p>pP qW"毇?`y8G{G);c _qwxEhozG{GgyaȷO{8GE); ‡gw7>5;<\)_`E~|#S1_o)I<|K({|c>axm<F~|#S>opwWz|s[ʗ-[y<^h/pfG~|#SޕOpw3|W[{x|G[7||Ec1_`opw4]wߥ/~]wߥVoVjoV*oVޥy=WvL%68ۑv$v;iݎnGR#ۑ1)` 6w LwГ+&;M {0kL~7؂QcHVdp+ۊmE"yH(208@4=( # `(p0 2bDpD6"SFi#IڈmDFь0Qp㠧Ḱ,Qc0SE %Dz;EK#'둒z$d=XlG2#둊=` =-z3AOpM'z@=` k0P-rW̫E"jvȺj$]5r'[=ɣ?O.)ϓZ zd%'@=y(` IK/|SHJdX%UDvUwC5Fk 7,1lc0E}a}n ݊s#F}q/*ŤQ_,D}sK^Rg\]? xpMsj{>Z?,<ܜU%]pΪbprVc21׃§?&^;W@ }rQp'@5o$%i\q+s})"1C (΅Ёѣ zْ~EuM-+i@5 pY ޗy=Oj 9m@IKsۛ ρ7O0PLbö*/auz 7[2۹f/o/b+~FƬm#Mךa z^cNkWC[ n,^^o.67ƻ nt=b p"a&<$]xb랸E?j7L7na;2\* ꏁJsDEdsc@BPDFD`:gNxpN@t ׁz^G`(B;MxFhxN99 DC"Yl ^AG;IFwDv"y~<{Imb4xG?M?#I1␶~ER#qv Njx|0"b ،DE#.g1<ș ɴd[E2+(bÞ\d))9ۓL|3>qޜeUo'"bYBF2be![L|`(M}};XLM5dkcFN.!̪P2A9KᏌLE22A8)d,}0 3"`Fӡh/Q.%S#zL^"oSF.cҐ$3R2,u^/3R =fIEd%*і*#3>x|?axd%}?Q7̸ஞC/ї3]ȔS`ba4e>ߙ~y0cV?|_b>ߝ2&.M?, 3]L~pq ; w3>4HCFhVEfwgFiVfލA efU<`Fݒ.t!wca̸[2rcO63~. DlȌbB2vHPị,Rl#GЃ`(812f$3U@@U=P"jY-8?M/>)i uH8}흂/\( <d_3Wyf_O$8 ئP1pplG}l'}l=L:u9u9a gjTd\3.XQq=~P'xĦz'&P\$9H_RWT\1U`FStq#(̕MEP7M1Og>c]|7(̏NV)NŮ} !P]z˩wbS[LrT] ~kC4 &~}T"AL>C~(r{ʼnN~*근P\H |b(3"Pi*&/b@'"Nb1EQABXPTT $7(R_4 {x}<(b_ #76<;<;4D3` {~bEJãx\BpS0c]AK⡨Ο':< Ex#HLż]èx' m>9_b)oaOb߆ps89䃆z7zN {'+,>pw{'>pw{wni?aF{3p~RG) OWN=~`4\~pN]9; hv8;.|| ßqCџqw{Г" J7 s-(k0P-rW̫E"jvȺj$]5r.g`@<>z#僞H)XzO ԓ`9VDU"*_HJdW9|1tXcaqÆ9F Stڧ/֗ +VЭq;7nnR_LH}/ŢH7[M5+Кo}EAn)q1I\݈TtA~2Rak.<{x}umY$ifhD+%2Ktx5Qȥ,ȅ%P|M&ɗSWW[^7FA&C7%&TҐ%KTR4 ؞iNlMÝK r2iLp}0\&)r/Kɏ ?.\M< > > > {;2aTgjAq^><)Z%-&ib R!B"2#Y""& &IMlD {རm)$u>kzIeHeUH[8Kn4 7N:n3s&@O L*>q{C@?+{O2PMi l2Pj:Ou3ܹa;mK gLT'qD$7v=ӄciυ :z^?^DsAT1iqU=8E,LQʈQ s拈aI ZnI||q9A|lQ| PL"ByPȈQFcjǴe)8`n T(z#YFT xGD-SQw?6.#vE/+(F {)"xBİ2"E/q,침dbˢ #Eb=A g?FT?3#%?.;) q.̈qˆrB"8#XfDHˈwQ FTwDƖ’O*/T)b_ieIVCE=gQPgE92 {&+cB 3^PCz3#:3&*n02.jRUDddT)zQRUU!U#U%5KaV䭖?vз*73^|̈$ʘ9=AjzbM% WF;y#*G 3*w5(ɬ*63jBKUKt'xQC3U5SQΌ|1HO)ftU?f|"]?`XaHeDX8|*1#dE`[?̈;E|Vu~l{B2*0ctwT#4GF`Qf DF|2 {+#3Kh}1#h0c|_+ˌ˒eFfQOoH{^FgIv1㳨+3Bz2c4(3JG)_F*hXce}2^32b󤂏yQem"H$~Y Wf(W_dSJuΟǪܨhdHCFsMϠ/#:7fLQ 2sefdiC-2OE#Q}.+sBP8t\)#=g'ˬ vlC^{VifgVP|6E?z,3>G236HeFVaf'w*T $ĕ my88/(ԡHP)ҢxHz?8Abxa1)7+Hp*:ζKyO{}2:*H b%IMER$)IR S1ॢ&I!KMIEDgCs=Cx E7AH1:cH;>I<́"Ըh:n(g/hPԸިYW:k>]qPu|Q%ge g55CE*+Iі* oI89ᤘ;>:?O/C~/ZR8ME=xTi.E\R!/ERʻ/EbR {U UA^ɭa zVNbL8V++ J}0zWNs)=.B1:)QT *Ⅵ+;8a0Klc8~'oyr86pzri=: s;\8\9p 8\''=Gizd.zd/~~ia~0?~a~Nʅ#a}.|}|~/ {pף_g=0? 0?O|0O|'>p &_tt8!_u8;]aav8;q7ܣ~pN 5;G hﴟqr~G1ܯ9{{iiF{sw/Nqqwܯ{\{< _{GpSw`8;p8-.oџp|Swho|xD{]wߥ/~]wߥ/~{%Ǟoɟ[G?a=R3- ><R=-+z={|KÑYpwߥ/~]wߥ/~|URÁo)_p|Ksw)G{|^S: NĂ3غݎnGb#ۑv$u;r)s XJ~+%?ɕMIzæv̚[0jJnE"SޜV$o3rD #둍Hzb=R1S F=igzR$ڃ@I&؃`N%` E"jyHZ]-ҮYWF%٢ H=\A~$|s4K0Px `$L@IZJX"*bȰJ$X%U/>k8,1nXb0ǨaNra݊s3nF͍R_TI}/EXT$C-\&hͷ~n^>-~~kXErg[ `e ݚD,`VK b)&΂RQ ̥܆TЮM!04C,pah3YCmGP7C)V(AĊ滃ah'{A};KP HR"HWTJY Y{V3aww:A꠰; aPTn*H&VR0 Ti*邤x{AJ aJbN22HRb Ti\*] LEob y\ɳRThYi*уbA tqB2j!NhjCH["Hz"H"8QC)c3-ҾmۉkIJ"H5ٲ< IR^ viRI!!1yRo3풐2^L_9z&\8>6O Bcp:O^Msؑn̰ *~H-.*cz۲w)҆'z&aX5d@0 S ,,2i;?-c[paPlO J="uY ac^﾿0JQN(pw8C^ I(~㽅}<#69_[Av\}9N*tbsC=;R Б"3 v4|8pשк%UL}V;~?d=@}iJTSϵw/֭2nd4VtbL3ͣi,4Fp> $4op_"_  y<Ӌ#@RUi 6UnT$$/{!2NZڶߤ,,"gʚ!` jpڹmVVcZU)U*m Hyr2UxfU'> UJvW5a_@ (I7}J S bÚ}&S˦ eX誐YSfd!`VeQi$]nPXNf)Edt@> ?"UywF6a{K}67 EZy i)E[Iܢ&H- ޳;?,8첺om־*V%sZTt&*zgͥI}ԡ8z0kA4\I:}*H^ EzK{~c:xEC$iёk^$C**0S KV^d7 ^fd&pMϏC }y6_u %)qTIT CPRkvj Jkq Bxw:mP~ .t^Aq`%Eh*$\l *26ll|ؔROjڙ,c7shIkf^DLB)eq9 Y%J*6HJKfݧg887!P)'gS=JeP6{MTJZfN.$nR?%CfcP7EV6V]G.))zWKSzu<3RCT/Upn|jʗ]Z@ʕ:yuzF|5'Omde]MhԣZW[.5z]q)VV\.$uJwi՛L{UwTwXeVNgvSUb6UOb AD@!XjiC~&,~jAD _gb~pY2l6z~pT&9-^dM`QlK- [J7ŷJjÇs {?8l Pl*{ xrCC5NIx 5^`_ͩxck5>Y4Y"XܬlLnVD V7+[89V40W`'u6X23#223P3nFBMJ&`񳒹6d곾 {ܬ#bd0"ԧ`s`E]}R fw 96)'ԇ`I0ݬ`LnV.V7+ 0Yiɟ̖(`u~f Yy@W8JW0P.8Rp z? :? ? `7\0)m. 1]ڂ Nzzz~5(u,@`JS0P7P`'Gٟl`szz߂9(5L@7~? T^@ :~ `[n߂l'6j-XQo| `P=W0P-8Ro T *E"JAȠRdP)2T JMtZz?舍5~k-8fނ(k-ؼFނ(k` zx e W`PֿAg{ş<<݂k#6ֶAgi_B:v? ~(3P֫[00(- ʺt VOlG`:t?X%$Ol=7s? @Ygn  ʺr e=~VAYCn``P֌AGlX#6܂(k-؂R n p `z`P}[00(MۂAYR?{bc-'6pAGl@@6:m? l? T ʚl e-eڂ-=:bc}tƺj? zj `Q[~ڂAY7m@``PF0`7zh NOlg vOl{@w@s@o``P50E"JAȠRdP)2TؤMjؤMؤM*ؤ T@I@E6I 7N;iqځ7@v`M;&u&ʞɨ'!cېc1m"u6,zauoj 6Q I+p( i?Zf G~M4=cQk:_uVy׆QkCި!gmh24 F B#h,h.׆3QkC5QD-n ֆaQkk͊[@yz`<=Nt1e P -BFȱS9b-)v(ޢnZ 7-pM ̦bSjL4=0U#r4T\Bd xb1-̀(OvP ,S)”`J 0%ң8ChS bM%r40N1aVg 9#ls"[d%rHU"SD%HSXJܤ @ m/,93?|rV|>;L~OZ{\uZ׍";'ك8;;l'_I;OK?jHz>uR~8onñ:xa;ܗ5󦣜Gy'{<2/Ⱦz췟Y%z_ X) 'Y5߽>L(>ĽL>ŸXg?_mco}[/N^Br'3n;;D;CW-ʸO}!mg,̾B6?:oLt ӐPl]dmL~O9`owqd_]^dWI'N_FzƬ> ܟDxk]c' ?yd|?tzs'3ƭ ~gl5Vnݦ`k*?%r ?~ן?w o qFb~dmwwIgW0@;CW?f'PA'xޤD? 7xTO^Gc?Qu:b~$2w\Ў?nv}雄.Λu<>k3O+wSy}Sv? 'I[9nܿ9bSv;‘!Kk,}Ϭ~ggb7--m^YI ?+ j7?gmϚK57O>*dS+,z.&^(Tn,WzL~ϐg9_$~>'rdN,7-~8yX .8 7^mh<h8Um7Q{|?J(:Ϸ_篎q:s=<~5RW%8tYշF!MT:Dz{9?t7g้ ƿ;^AQxլ^舀 y$n^o0Q8~o{%x / VOW/zz;*E} KWzg%.os}#?]/xу s~2o'߁~ob*ƛ:bru7}בH8t/:!gXOG_9%p>rx&0{1^GŃ+~/x|6e~9ٰ; t]O#ω=|Rtzj!91^'0x 񖭷Ó߈xg=x8ݺ^ϭ6*K#a?=tGyBpux ~J[; xW|xb+/XC ~.E1_ޏzqJQw|L\OwE߳?[W~yoZOI΅N\ys~wJŇkk˟*lX_xo¾A|$u#_'p|im'1zߘTs}W>ssobs|·oqq:>_r}0_>WkuߏaXOEW`^-♝=Q<^8p%_^'.x-%w)<dzgvWG`7`1w]|8빆~o:q%w-ߟx~fn~*q! ?΃փxl=Lԥrj<ޏr&^,uni |]% ~ p |f_;xI;~Y;zA.|1x_'14\p~g~sxvy?rf'x~ ֽ:TE|b/ Ɨ_;^7׸^sx,uONsx/fmgtfּ?fˍ Z <8ο?D]A+w<Ճv> nJ?]e ;c+/c~2.čx_yy5ڋR| 4%O6Qlhya5S]LxJ_Ws{JnLLq}}K;0cgՃ/M:( {Z_ĭ=x0+x []g7ghƤ^6c "n<>l nװo_{vs{Se(ÞԽߋ8{]w?z~ {\c|ONN1x?kxWx|60^V횆3qS?_6Mލxdh}o Bx%n]/}Cm:5k=H鏆.Kؿ-̏.S|{w/m dL\aZ?MwX-ɿ]3/c0K-yU߆}hx6/ Ϙŏ›;oN&uv /}k|5T |_:kϵ<{Uhڐxx'z&K|u0\OSrm_)Eqp:7ٍi[۝!ܗ{gm˿'>\叞/=190s<^TZ/FB|Y|/#m?zylxx'ލ_BGxo$zzʿyVAo=b'&?8&Ɠ?[S&<^ic`{;\lv0v|x}lnwr,?6~ #x^$93axD˼3k~^Em;gXY0w G1;1sV{v}N<p_NDgOs60$mW%lT^k7q^c򗃯6wm-'Gu7F|`-GB;DmӟttIm^~]r,=w։os+;c<=ߝ1'`A|^<$boo1~ z{UwاMx6ʯi:gu}&œvxG4.'co'1ޢCȉ-v kb<}6n{|]:Kr/{9%9Ͻ0i![ͿO_~)a< :9x ||*\,,v'w^ċyq]fX >/3za*yosO0|)_[!f>sG~wG|Չ9^]/ܿ\+1;o770Mzą_ΐ}Rzj/g~.=mx8_O?t1EaL7s~<3ω_|ۅxoG!.仕N|. ʿ1P1^Ug'|`gx`'Wg?_$;>3ggyqE~v-(˻s<ޔ?+ϛ|>;ߗ0ƣ`ߗΟ|f.\g&x 3ߺ$; 2ϒ,w b8~u/YU?^/'_t ˱>Jļ&$L4c1/ǫGWuӿta<;0oT/uo+|xGLq.](q?*n=_{U3O 4lÝ|Os%ĕIܑ/_/{OAwly=K[q~MG7?Ϸ&} lEܩlGW|ĎjNxgy'Ooěz3"oO߻ooIh^Svq~pc=׮0G!9ޟl:>xۃG{^53|.̏} u=߅ׂ?:z׷5זgO9c|J9?<ߖ4?ܿ?.̷z` 0_3"a[y"gL9VoJ+ߦ0>m&9Ck^ޟ&9e+ZW^t֝.% Kgҙ'tӗ.=IgN]zGN݄tʋ.~eҕgdtKI1]<}a5.=Kwu>$>ӥCw#]tҥ9Hn:wxҥK@]N{4]@tK_9g 7]zN5.kPW\o x.$^.}OꢨK:]t^^_/]vV:v!tCda!t-ΩK'tItC:rw.}7ħKCoΎ.}SW#]:Kҥ+nn:ХoL.#t 71]Z/ХQtLTg`[r LgN?ҥ' tKI:KN!|V^!C>7u.]:Yҥ}tjK7{U7u4ԥOϧK.qFӥovKg^t:4]zL]\ON}Wtԥ? ]69tkAnuK_+uΜQ]ey{Խ.'ҕa:uפCo/緤ұˏ-o/ӝ3 Ott3Q.tkpR.ҷ(PtY.yҥ8~$Bӥo͇tK߅럺t~ytCUׄtřKWҹwtK#]:Kyw5t~z=.]:;}.ߠ{]҅O5җ.=8xK_ԥo_6s~CnunKW\tMtMK7ҥ=_S.8z1⨛Nk]yqԥNtSf~SnuwK.]uK߅[)t8.ު.]ҷtߖ:*y&]zt{^ҥKtLθқouJ>ÕrKW\t.h>STҹ.]yަKZt.=_I5җtԥwKG:/OtR6tUc+ooKWPBt.]yҥ.}uI&ߡ.}7oKW]0ҳtԥ鐩Kgқttҭ3ϮH~ƛۚ.]ucKO]W+N]y{C1;tM7ܻtqU>j)]:.]:u.~ӥgK=.yK/ɼEJХ9tSyԉO9yHK7>ucһHw:u%ҹqt겋3z!qҋtċ:K_[iҗS7uylC8꾛`_KW^t鬻t3tyAԥvbtӑQ<wHgN>uCyKtUy{Sxԙ+9t=tey>QTwEEHtХoKK,]zQ݂)w 9g:t˷t笓Z.}g<@a^Μ:|>)J=Kҝ3o:buau>7[uWީKґP>t&?CY'T'|M.vs<;uhONҡO 3oJgԥo).]uѤKtMI>TW*Х'~oK7tPn7ҷӥ t9ءK[wk.]Wt ]7K߅қ]KWҕ?dtߦK7zԑf76L߻t۫:K~Rt).]/寓.}Jo)KK%K>Kg wtL^ȿKgt]:{,]z%?~tꞳQg]ҵoOVKg^On]:w9^_KgN4ϧ.])ҙetGҷzR٧tғΟx| Ui8v>u߼]uMtԥ7Y'1]zn]m֩s'o\u\71[ҭs<ԥt:9?+UX{w']zNޢG]'uƧ.Dӥu.} ēv_w{]jԥ~{ХS'gt_.]u~K.=}.tnwҭt6uS#]zK]+KWwt:t|_/̥~LiK7]:uC.I+XJ>>H}.=KgNҡ_4H>/~-?:.}}.]ͧK~FCn|Vt}.]uSKH:ҥ҇tХ/#K:ҥI^txҥ3t<]:uK|܇ƫB]zes5Wԥo[o["Kn?dWTt'tsS+t̷7]t{tҩӟOuQ5өtC3?KJ&]:ҫtMyK:ҥ7› ]:IL:.ҥO>w~:tG>t?.JmuHy}J,]:LKߺS,m}8KuW0Ks .}ק3g_-y|ީKg0ӥ gҙL{ /ML]ҷGn]։|p؋%]:K|Ko-܇tTtg))]:F.HgM]:K_IߔMx 3|^Rxt=*9˩[ҹ ufKW]'tJӝ`uH~Jg>` @]H.{']{z2]zNԽWb9.gK^eoK߉t.<ҥoQt݈6]>Q|*ҥ/1]:KO {/]:aL>iϨK_(]bCmR.;ӥcJxѥ}t;tuqҥKE]ҥ˯ltE.qW3]:s/]FKr_Wg^tUԥoUt'.}tYw\J/[u50ץNQ~/J}SǩsG?uG#]kIo>tҩӯ3[L.tM͋ԑS {&,kv' $h }qg/XKjyƏxjꨫ9o/\ySϼt~GԥӤ3^#\zөӷu ȫ:uš>;a>ͥ3Ap~Zɓ:u3ǑS'..} ]~NIk/:}{M>k:sitWuIk˵[wuq}\z#}fΜ<gt]μ=K:s['/霁 Kw{{ؖk!_dLcM]#:uɋuvμF'/:qo}ҝ{`^:ut9[ץ@O^zsm>6:}vI3|q˼nv~Х\uwKQ'ѥ?/]z5=qz;o9}lqҥgԑ7ĕ߬kaY7hӝ߱St]t,'3Ƀqץ;'?}{pKwKKo*]st/u.w}x~Нqt]}ҫn 9|\:yپ_ɟ?}{9u;.WtG>5T6ySʼtMI_懷K}^tq|>@ޟ>@l7N}ҥ?ouxҙ?.9t\@楧cƥS7Nﰺt\ҥߺme`f~_ӭyKWny5#edv9gJ߿.}ҧ..}ǥD2]:wYg^:n~8o0Gto_#>x\S`N.}x3ǛO%o'.1]z;YrUN|s[n/.GKwtW\'_| 5/ݼZ\e^2>E˥C#שYp2p*/5}qwCӐ?.=y-&kť׎K7̼t^t-Mӧh_.}Kwdt%/C}3`dL}5uMo?Yu93Ϝtq默w}onҝx k?.m\zMK|!]Mqk\zp3B7.]KoNѥ(uO9s|~ץoKwn.=>>.eӥ }u<ޟ.}̯^߭s_:uwv85sp٧¡7ǭO6|>['O&]9>~\/MN҇-\j͏ť\sGpӥ{;7O<ϼtO^zq}}\9y.}뮫mq5.}&Ͻ&&>t ;(]z;۩ku¹tsRt5y07Ig~E}9Iy:b\t}d^zK_҇]_]tof^ǥyKpYMoD >󙗞>>Μ;.ܛ{^{W:sWqQ>n]zh/>K_K~]K:s&/h^:3/=3.ytҗnZƅWdK1tts)n&.=.9X楯K.M=97Kn}ǥ7ӥ߮ |o\:Kܞ}߼t].ݼҿy~u5XS?]z /Z^yu u/}F]]=/y{vo8}ySo1ǔ|bv~ϑҥ;K 7Kw.}{WmV湻oӺf~w{k_p>;o楓?ޭw4Kew76g~qOKy-:y<3Oo^>t.=_iЙr/֭.tr\7kdnNԕ{|7~<ǥc'߼}S\틋.ݹt3;8y}ջ_.}95K\̼f <\ܺǥs{wӡt!ޞqK:Kǡ|Kw.ypۼW\zӥK:a n}I.4LO=K}q|ХK.: \?ҧ?]M]wҧN޸>ԥopz͚{<ҧ8뽷/FItӗqSW2/ۛǗ7/bM<9t_|Х{}\0ƥo$.=uХ/0qQѥo_]wKwq}|\zO\OZ~wRvNjӡqn/o|bdϹtĸtҥuC7K>K.}o.}Y/ӥKFsEp'=\v.˥ʭG߬GO:3/ut:o\?v:792Gg>:sM0uU׾b}.ov:Κ~9ǥ;']ctut O^zsԡ+FuKO;ĥ/{K_:j4.2Wq9GqwQg^zsM^֡s|8y\PNᕗ^?.gEwU_֥z9y\yt:u:09߿\zݿ.둗Kt\z8]X}̇יa{{ǥ3,]z泇KOxҗ~5Ν|#x?yE7K߻9N=t{ծC~tG/5/K7?ؼnҝ۠K/'Kwn.}毓7_ӡ\bK鮣W^:spɼtTqIt#۱K_t95Νm^K_:'>/׽~+tKױ=҇y1Xߞ~^tCNz}wy<[7\̺rw58״}ާ.}yj?xq黙w.=?tץoOKZ]߿<>xz~SqulM-_qӸw{tϗ'KoѥKϼuׯ<ҷNK'Ow;KKOKw.}˗.=,qnݹHK8y]yKzD>}ǜ/\=ҋyKgn˥Kg|oַǥ/ޛn>>Konz JK_u\K~G>.t?qI.֧ p\z8I>cϼ[N_^k_Х"K7/K䯧Kau/'/֭S'wÝե7_?Gz}W曻&%y gC.:uf>^v\z8] ХWKKǵS'rn.:7tFa>z{~8]}Eź|}å/Gq|h\y"ҥ4q^Kǝg7p8fҕ֥30]ҝpd^sp2o!/=C.<\g^zѕ?uitn؝vx|+uiҥSKn~.ҥK?󧷟QG=y8y25uw9;~ӥ=WoK=:t|柳KN_at߿]\7 |]68f ]zxuGQޞ=m"ǥ+,ɻY^'KO]gC1O̼XX/USԥxu]Yv~ߥ;mwzv\vӥ7uo?{uM[3OuG]\ut[O<_]qǗK>^tqK'Y׸t;GANW t<}q3OFS֥-u8p9tҥ<8ϹtOw3/}]MI\v΄.}z,yқs ¥ǟ.9bt~G~79uԥ3Nus|8jҙۻN[v\Sǥo~Y7H>u$q~~t:ҭҽ=uK׼{>]s856_e'׻w\OqK.ݼW^z|^t֧}y7[^kz/oקy~qgҫ~]_ߙXt/,t8ӥNzu=.輫4_E>.=k=uKnwiGKO on>/ uӱ_ݤko/nKo:spݷ}Cn>|g#x}q\z{þ8Kok/'/=4KOt烦KWnޚ.]gf^xO۾BGIwŹ&e#o:+wv}q:CNt;}tYg^:|/N^zסvGv9.׎KK7Pny>ߺKuC>}}tys?t^u|Mk\O7]yGzgz.}K:Kw..}f>}m.}ۧg^}׺t;>p:tӥ;YҝKKq]%Wt KwnnK7t8w9皾B}{u9uSn_\?yrm]ԏ3_v\n߷.=Ku̅m+Cd9N#\z3NK>۾[\{{ͫkΜzvm[~ե2?gbs;cX˹SwN_\p|c ]zw{ӹK եe^za.3/ҙ?]N^mt5\PK/s.y噗^ϺG=;os/\za/ӥu.ﲾM>=^]yE.=KEѥsMI>.8n>'8vw}\I˥~nSg;˼tq;_a횾tqUn[^t'һs}qk]ze}^:k]n3wfb=>}):1]z揗o~ӱCtyt5ۅS/ ]st˼</dnG\Nvu]թwϼCo/ג.=̻Kqٙ.=.6/_pKoo\Qn.z.zo?G{ @|K߹t7}ȇkq1/K~å2/}qҫn=ӥoN8^ug+:u`}o2Y[ԗ17/}Wu[/swN*;Ա;ҽ:ySy~?.}[:qh^:90ҋ/.ݹ&|ttKw~^ ^]#/8ҧsZӥg6r;S>hW\߇yz8O|oO?..}/'~Xyåҥ;H>tvM}^/䩯7;_vՏK4].~{y89 'K'G)]:sFӥ:pxpUqqߗNm#g_]o.}K_N9#96qougĥ zoSnoQގ3_{ǥKOw?ronnHӥ3`x~å|>8i̙ 'Kߗgsw}ӥ7qu}.|v]&\oqNv]9[ToҽNys;sRzv#ץKoǭלt^x}ty-s܎#ϼuo.:+[NNt2ҷ.<3z~~t듺tPwժCXGuwkԏK֣u쏹35sRs+VY?onqӥo|SKg6g~̿ooo8ru3׹֙ԣǥ3G%]v{oS/gd͚9z9G^.9㙗>uޗ]w^_ן oq陏ޜK/:]G~~9қGtz9_tf^z=y0ԩow홧N=w\ǥ[<)+ޟ~kå[q8uԥ{at~tC_NSzo|~qs.ץ\қ'M^:ﯼt/:ܳxҙC.}[ַN= /XG^t{+/]ǥ;A^twҋm.}ڇ}{{=Ν|Oo//{NݼΚz4n}C]o{Kżvҋ.y>w]]^7K6߻د}]:9/w5+?tͫ7/}/Ugz~ǹһyMG[OnNŚ̼Kߗ[o￿Z{^±+~gǿ?_~FO?_oӹ3+νT޸{?O:{сù$νtqEgs/E{1?^\Թpԟ}8>tt%u8r}{5^t~8({i܋N^>{5^2>{1^2={Y܋}8n>{OS^u8Zt܋^2=xq%]x8Bνpys/_Gs/f{Oc|A{>pEs?^8 ¹e|8s/:a{ZS^s ¹ν>q:nW(s¹b܋^.νù8pùt܋. 婿ӹX8O8*{1^{Ĺ&νs8qgcC==vEs/{i ^n]8Z}ksU7ν?sNs9`- s/9㛺.s{|ys/Ecͼ{,pcw_8R}>{?νǪs/|8Ź }:Ĺa^xspEs/8۟9^#{W}?ġ;ùޏ9>j:Bν^tesEgν8W^νTtŇs/oҹq^2>{q ν8^+O8(=??ps>νOs/~W( {}z^.y8sҹνs/Kes/tù8+o~{q νGs/ùby82w^ny8uɺy׵qu3ks/ue{濇s/X}: KGcw1{qν_s/7{w2{tKs/Sg4D^/?{YOpEs/9G!{?{Y\?Kqs^/ uw\㞣 v8s/O܋spy}s/ K^nv8ù܋s.p>{=pKw@8+>s/yXkҹtb.ν4pùKTto{9^o?Gopù%{>wqyĹ nY^rNB8|@y=¹^s kn3-p~zq}νp?t^ܽҹK=n:)pż":N^ }Gy3uW~vҷs/}\dXq^܋^O8ùys/܋8r5t%n}Q8bνpEs/m{桇s/]K~y;{1^[ŕg<8wϧ:w܋n^¹p5]tuνq~?ѹas=pz܋}hG sӭ_qy}۹3:3sXvEs~s/e܋8܋}8yXWs/7}8wt?s^ν7s/{}܋^^u8¹ys/s/ˠ^7ss/ҹW8bνw=??_Szk{aֹܽ܋s)p瞟o8rg'멋_ԃuԏqO︶ziw-{t^vH8g=qe|{o^YGߣ?uy~¹qs/楅s>νm~!νPҹ[ӹ[_ҹ'ν7{Rtzyשs|w~;b6zνԓ^u}%y{ӹXtչB8b=z^ܫ^okp5}8Z=e}{ީG/Cty~ǹ[?ѹs/9!{¹7{O:<܋8w ?Kx&źеS?n'<{νsq|ַoouu޿8w8ɚwKǢ;^sL{n=߭oνs/p[l]{q;G0 kԭo/'ks/ùO=B^_bs}cY3?ν^s/܋4x&ko47]pǛy~]܋spSm:j=:{uq5ùf~x8ZuqXS&;{8q目Ա[/'uĹ νoOWs/^йνpy=sD:ƹ[~gqsz=pEs7{qν8g8w?йsνsGnν8G ^^Ĺs8sGc~?ùνpqY¹=78s?wYS'8pY/ sLֳ?ܟϫx~溽ܟIIgMԩzof{If{8œ~ yh:Ĺiy8=܋sFpK#~Yw_/:H{ѝϬ6];{Q_8yu{\O㖋Sn= 9:܋s|pxqŹf8w/չrueù=ν8^y-ޞm]{zs\_Kѥs/ù'{~Kg>{:).ݿ{љ?ѹ[չs~s@^S-Y gs߿^+Oq=_ܭ܋U^tH8wueSv܋82ͳxEN_֣yWo{{/#ss/sS^3s/頋S'ѱ[/׽}qjz:+Sh{lփƚ1nzs#pOt{i6Wnos6u~[o9xqt5t@n?νs׳ܭs/w^yA:ZN^Թ8׹[Թ[ҹtŹ.8>{g;m/qWG^/[YSǝ?N4{q :}>6ܟ:;n?9Sù|s-*S:wԹ[׹^2>{)̙qԏzyѽ܀pGw߱;1{--;7>ùE:W $:N<{un:[ukpcݬO8veg K=qǹ%{|pG?t=]9]z in.K׭+Ko\^pNҳ-]Iҥ7W 6yۿut[u=(<\ץK..|^׽O>tꑿNљ_6u ۭT֫}\:t>~]L^:TKg.txkЭW56kuut].}y\:Aҧ{X' GK!]:N ]z$ǥw3`ZX>sOOmqw\zүK/qI:u8?Enޮ.I]:ӥXu|bҝӷwpK>/PgMn^.}q͓R>t>@ěuSq/uCyХ֕S'i: |Dz1_VsI;ǥ]nu:_\5>gdztwMzwoOݥfKu۾n ¥Rҟ:skȷƥ]rJ.gjuN\.Rgץע3OqN6?{=.=\q|ҝKY:utӥҫ=#ۥ9>CL.]רK9:.]K{ץKwKǥ_?suܾK䯧~7/kY>6\6.N]w;}vUg^7\CqϜq^/'\zwKo:uI,ɇ1ܺf=WI.{n`\։]#]z#_>K/:}.qrҥ_a]#>u]z_橧KǍ/ҝK<\zo_m}?wܛ­k߯GK[_<^]z¥jx)\]ۺtպA\3)0>uQym[q̻ť?SLk8x?Kҟgo~?Oåֹʟ:ĭӾnp7+ܩpcy=.yn7b=gK:nөt;kl_qm_`=c_:>ҥ_>m_ҥm`ә?:u}t].ϯt1uM%ӱե3o=]z:˾=e[qҫ}` ~\;.#Gn|Kե{w\G߃.ݼf]q_ѵ,{ vdzrM]1;}dt.6]kҏ֥Ky-.ΝqE>zy\zוGx֥/qťguKǥ_wBA__/}}g˥{E_~Nr;K Ouo8zo?z; nY_85˼i8tq!d]eԑO]zqy=v8pK/m=?묩ӥIܡKONӕ֋5[g~ץڙ7KOW'Itmst.|Pqz}_0=Ngs=ӥKv\֭no߯.ݾpC^t#n.>?]}Ϻt~åue[/׏z/׋yҟY3w]:r#>=.#ZXѱWngԥ~\ҕzN.ݹǥ u۷KE]ϧ.}o.=K:~>¥tҧWN>E\6}'kG7f9ַǥIԥK[ԥK=spӥyK/扆K{N}ҕp55saV^uz~å v}ux/zɸz8_қ8K7Cs_޿KNsӥwe_arS?Mߛ8ۧ/ҋNG^^.=~pǥp9kCzD>N^yno7KM3~8'ұO~iM}3ֱS.:}~U^tӥ;(\KO}ŭ:w_:vǷҿ3ohp>ǑJt΅Х;C^>@8pӺtҫҹv.v=_t:M]NP ^N_\יS-DZK/ .8/]yֺt.ꚯO~ߏKrgN.9tu~ӥؙ ǥ[ť:]}:}q1Dwlo~wξھz.=K.΅]䯗b7}p鏋ףR/yt3'}o]sWpS~^=<䯗cַo9Ofo/.G.=^ϙ^[~K/ۼޏK?uҝ3K|Kw˥wܞ3]:.]GKw..7]ҧصsMIGqu#4>tUG^r]ϟ.tҝ;KtX.}q[K'KF]tq>'=~#t??u^^uztCw};vz{Og}Jt?3/~{<3yѥַǥ\ǥKwq\7\zޢK'2]sp鵞#_W\u_/˼tzC^g=@z^^3Lz):+uqߗ ׳Kd焑~s7<\SХw]|w+?]zә_~RqUwNX|ҥ;wJ꜃җz>ul58r?oE=/u\o<\z:ts998m};uz`KwKޞvtүKOKtYuGK?:..뚛[:tw9:sMwm k<їOz1^y]`pXt:\z8]ytK߮e:ugǥ׫K7Uuue̋:rGĥߺνֹ͓W.=z;.}ȫg_|5[~owOΙz}\4=]ұ_ַ?.=LJ]\]:Wƥ'}ynǥ7ågN]t9C\t:5sR4ߏ_.=>>N9~eNǥ36]z|~O~>.Puҟz]ݒsMkW]ӿ=t3krKqչ~'=?_׷n?{qzſ]zK_[q8fr;7sʦ^uIMwN}.:]z[sNbݨwzZK/WǵKON=:>/Sum͚~;7қ{ۅַ۟sr}ҥuM{ƥO.KqYO^su[wNvON>w|եSM>?O3OG]; smӥg^e?xusfu kb͜x=_.ݹ33ǥ>n}}G/ԭo]ϘK޺r<}Sz<'~^iΩv:[Κ1n>\tΕХ;7Eߥs3Lg^t^.}}Q~|ҙjz~Хs{wqY:trpܮcǥ]:oooe=:*//++s.}̛saSN.˥nq\z?~?ңҙ.KYSwYnoo8utc$M5/]Kykխҷq.|\]}tKu]:ם;I^t~<.낋}{|]V^NCpttҥ/y\zסGst߸+KyMgN^r'[~[IIn.tyE ۾3{>^z~w{Ƈu3^?^.}{{W]S'.=Эk!܂S}e~Щ׼tһK/nǑy5}vμӥO^:yE7W]NPuut.mW~wX_:Kg~Qgh4#~W37mIyv8tSO|םNuIΜF{߭^uߋ.NWKۥ9K/p|zGw~O>.>Nzsݓ.]Gvқ8{söo/=k ɿ&/ҩ҇N}n.Ky|ƺ1ٹ=?.}3Bu5on/|q\:䕗m7]z9>/$߼Ч.}ݲP<8_+K|}{5oKI]z:[g>^}K7_YJ#]zig^:y|>up|qo9nuɚ:DթSHn^˥?c_KzON.=Cƥgat来Ko\o/}~?y7׷gw̙]y pɗuIp홗ΜСWk[q37wK3]z>sq~1/ݹ WoZk=#_t2/tuk׼t~̼܂K=Wtp)[K<җn^|?q.y/ҹ~NnH_ԭs|p4]^پX[wN N8]q:]]yǥG.=u鮛y5}8r\7iw?Kp_tJ4w[3F5/ptywq链2c#nH~.ݼA]4_>ypy.}\_Y[g}Ⱥt~uWK!3/} >o]`m>M8y-8ut_5νk^vtc>xҋn濐#oμK|twҝ_q=Cw׽?}t^]:֥͗7e^:e^Vc"/=k!ݮ.},;stgqco׸Kӥ_g<r)']2~fCL/r_ht.}^./]:g^6^tuyMK?q[n:x^q8yۯ .=缥Kו~ury}Kߺsi{ַk\z8 ]z晓1/.p5.w:եgKt~ԩ/9}\N}{_]+>Sgy{ܟ0/ݾ_]yҟ9V~K7]nbMG^싋_ҋyq/gKo3ގG~kxGUe>ץg{t3/rM};O]}:N~:k[qב=>n]3ɓ!N~9un~tԏ2/.}~.>W^zޞ;v/s2/==N]9^q|wks0]ogz~Kw.C};]zg.ݾt~uw)>zoq~n}kss }y-?RX35>N^֩~Nkt᲋[w9KOKM^trqKǝp3ґ_~ȼthҧKҭҫϼ/~˫;]z:˼tJ^30ۋϗNz)..=/^Y]z:q\zKGYC^OǥKױNޑ.åe]zQץ_'[gn˥?.=U..뜯t: EcttuӥW»G7.}s|ݼǷuu6.6v)vt[]u3YR]sK>G^ᅮ^^XK=>]^;ҟҟVӥ7b9t=IZҝ#a^Kwn.}:rq楏Kt9_ƥ߫K/\O8/Cky8^]z7(қ;wu֙Jx[ⓗǥg~:}](]z oԏLϼt̬ԯqyw^s}:X_w\n}üǗn3wj^Μmt:trK7]:d/uI=׬o&<\Kw..K]st#O^zvS^z~\zSG\z=]W]Stct8uѺrWtԷz4<̧o\ [g^]s}QGKO׏KϹ{KwNy|uuԷ.=97~q%o~].2<]:4ޏ[i='N^zK.~_:r윻:Y[v;gܿyÄK?ytoKe^:ϺE:tn'W,tqk5rk=/ԷqYm6tx\}o\3o7S߾?._.}ʩoxo:s\.r@!mz?.әo/楛.}O /7ҥg>ґw:/mogNOu5Sp;ץO+7,.2~eNYaMtu;8sWu/:y.=J߿.2ϻx|KOg.9uNZ#O/]zå}ҝKϥK.y~K핗ǥo_8sOn{^>uԷ7~.}/ӟwK.|L\z5Zμt7>:y2ҋ]n85=>oOg^^ҥSGI>̃ϼpaKKA?yg7u '\Cܺ+Ϋܺ3̼t捽\7/pʚy{FpռA\z-:N^x¥?/ss>^u}qvM_a Х7]5y{|?y~2/Wu>.#:m\Z >K}\yútK7f3/֩W;ynKݎ#\A.6q|Nͧ뼘y.蒋 [NB_=.hK.^&//|ǝ_G;/nv~_g|t[!6NμtK/t 8wu楓['UnU?>/җǏK'ᕗ^tռf^;y?\[K__.9^:}{¥?y?ud"måz;}ҥY߱k'楧pt]+/K/7μ\'vqם.yoқ.N~|Ͼ=9/UnߞٟW\z)]sjt8..yRqՇh^z|Kot=:&\zͦKǩS7ϼ+'|_Oӵ//KW+:t;N~':敗.ѥOqu>ޭ3g]ӭve}:u ҥy7KNy{k?oq8>\2=]:/u鷎G']zݯM]:߫ҥOKg^[3ӥ:y2_¥?ǥ{.=벺J_+/}|\ߺtϧ̟_cn²nWKӥ/d^kƥO0yS\S.}ko&ߜ<u.k]z7?N:]z=GN>7Kƺ9o&/=OKqҧW >1ҝӶuu7O\ǥK|K<K_:xGpԝ7#tMw~Q>.8!]]뽣/;?Qμr\7CǑtܸwy~>.O~܎Ktqw֓9Pq.3//n{K>tฟ μ+sdN:'/͗ѥ SʼKD!&KSn˥:#x:t].ݼm]zgbå_:vd׷~vnבo-oOL:sp̸t¥.=畦K7_'\zA¥|]O~x./Kx߇ӥK䥛q\zu\K.uw͓Yk>5.8]z1/|k[~t)fqǥi_\ӡy'/.G{EnMvsu[>ǥ۷j^V[åתső'KouרGS~㘫}Kw.Kt u楛l^}ҟߍ>OnqKgzvG\K/:tz֡}ׇ|7X0uҟ7_ݮs>.ݹǥg:}v鋋ӑ/y|yKK6ߜ{|q~֥K-Kҫzԝxk~rEΜK';\z^tx8\z+Og>.zEix^?.=q΅Wt]pҧG^un,.KwΒ.ڇ񞳤K ҧǥ;GGCvt.]gK7ڼt~IC]aBt?k.=:~ӥSg^S7=oՑyuCOqyqҥyKC+\zg͜TqEd^n\tνҥ{=`^z>=7k58{\K0\s3ߵg7\Gz6EwND^ǥ{.Wt7sV;k3ɗ_y}+.s}S.=*dbq;9[N~~C'~UҥKO^uq}Koǝu΅յ[g^:s?.fs祟_|?.}\;.oեߣCХ.tҭKwN.=3/[O=z}]z\Sii̭[=_.=ҥ4O^;^~~_~vљS:u{:uKtSN^pOҝKjy;D^\:s8+7kd8pzy3qCw^߿t 9hӥ/\S싻XS/#]s'tuҝru΅ձqM?ԩ}?)]N>yҝK8t~<]zjqo}(\q[o0/oTyoUnl#xg{ӡ׸.8sҝb^zKGNw}Ι:^.yw;Νm׭ҷzTvy{[qqfM87uҥ[ҥ\otu۹ǥ9>7]:dz2ƥtC\|{k搲K'O~o޽=8_Wq]:91ҝK;ǥOK7oX.~tN|t?t]ߧK.{3/9tҟb=K_Kwn.+/ݵǧC'KOw.KO>>ӥ7Gԏ֥StZ?돓#q~v./]k_Uӥq8m};:K:u']ɓq.}˛nztS;E/.vev\l^}ܹ:uqX3'_][/q|[:t..cdw;k,OnN8+gqI^åq鵘'y镹jywgNYgMyӕ㴗9߼-KOW]uUwNuq;sWsǑ}xKWȏ ҝsK#\z^ϦKSKw3@tz4緛+ƥom5wg~]NN+/=<ҧs uU>==sHn}s}_X3t粘>|+stӥߟr.z7.}lXK9bvsMvCnt˥OK'"]:ӥ{~ѥgsRo/~ >-}g^z|k=n} [￿ZJny~P:=?/׿B_D?WoQox}\哿>ҵsvQqW{W>ù?ٟ!o~9qo [ u|U&/~k¹?~KW/#N^>.~ǹ6ߺ8s?\=pX=NqLJb8Q3/=ׯ ~_st"_ku_G]DZ?өsmp\֙Tzù~q>¹?;:}}qM]#us=cb{p pߥ_q|a~uopNܟ׳I.7ù8ǹߥZ_Aze>9>^ù??{]_7x.w>X+ָ{9'bpěÉ^v r]Ź8n@B D B npZ+볿_lӵrppers q]o羯g{g Tڻq}?/hS|_Kr\yG8F׽!ꣃ^q?y{eY};}N=spxh|W>wc^_R8u?sߏWr{,ߩNrg}/?_֗}wz?K~Qks/֛^ql_{zڏν8/ν:ν8=_8B={^/pes/sùpgbP,^/s?w8}n羯ׅvkx_zby9>\b{x?r{<^?ʧӭ=ܫs]b<o;s~ƧIx^1νq`kn1>o:ѯI8=^t}?~{{ H'b|n0[l̷scgsUgs/KߣFZ|__\¹p|;\-΃/{ܯ?~pe9tEù?t\l$}9ov~hq\ xB^.5hG(ν7sY #~=yWN}o<=|hDJv};z·G/xL~W}}8{lp5Gjf$`nS}}g/LxM;~ùg'/۹˱h.'7N}Y;>l{s7sǏw慆s+y8>#7~soB:åzd$ 쿧S7}c&~Ys=ҹWqs9]/ 3߁w^yW8}~֟y_pxh{S3Ĺ)8F޿/Oۋ#Ǫc 7[^Sx6]{n!@\ùg}N2M<:ۻ?;su_ν6rs~o7z'^N9㽯c|Kďs~Q~mn?.:`A._7>{z1ϖeZ/s/:5=olq?޲?=_#so|>{ywxJߗ8|߀sy8s= }qw^ұy_7_>}pO<_:K{}s+ƥE^Y_c&k=FW}OWO_gu_ڍkx ~xryr?q>];߷޿^=8}|=6G/׵rWpOgmfly8}~W/E6ƷW\8}|޿vǟF|"mx8>sΝtg}?/.w|ݣ߄sx}6['~\tՈW¹IN۞tt\z<ùufOߺm~}ɳֹDn|X?#[Ĺ?Ź3>?S={^¹o8rd8}=yi/s:<_܋.;y羏׏`N%-ƣu#>p{<^1L8/~?mùy%¹S8j|8=޺QF^x_s?A5>/~O%˴yx4yl:z9帞sK{G|羟l<}7g8|{u|sb|?AvOgހ^q{[q_G<úwپs8|Ҟ<,ڋpOlߣ+?i8>7SOx/~;}^>N{k@u&pos]{!~ko^R=_B8|}:鬷>pٮ{8|d8~sН;H8=յ+_=6Qs؞ۧ['GO<%ޛ,Dw8"m=px+sާp~ 羏w۳޿w8s/m/G8|s&[Kķ?O<u9=^G[~D|yڞ1ގkw{[ď >^;{ ~{8^wꩳ}S>k mY?k<6.?>#y ވ[_7s㕇W0nю?4¹xP|1>>u#x1{{Z:|^~xZ˫b훺vѽ1^[8߬{Qlw;t=Kg39¹9K8.qi%OEùM:xYoUwKg㺾s/:J~K^|DKùzpy¹n|k'?:/|۶R3>ux&{zu!'Du puxx=/۞=,Cs9k?;8¹=/_q~W⽯5ߚy f[W]4^{g|џ.7{Gn>}/Wʡ[/L->2u3̷=g8|?sI8}uu_qƹE8}hߴyǹx3s~\ױq|KݷؾW"ޫoԹ#~zďǻۏ7{֛џqyu3ökW7.-:vX83z֧"y¹{_z\¹g>=϶zup| GNùH3S^wWw>3>~o:8}m֫{O'O<2]h/M>8N[8{ډ/]/Qpl^6W?t~_'Nrt] .=.v .=.Z]z?oΟX?܍.]wZߙ9a]}*N]z^7.puM<ҽϥKw?CK/y _Νx5n-]]:qt.9\z:6\z:S]:tǥ/?N\z\=GzyZҽҫPu/peYNõҥrԳǥO!\Gfwt9~>{o[qsK^qzqҏ}C|:t.q'K>^[7AK.ҥźjb\G^N}Q^.w^!NyzzKx֥ۥztӥԥfqfqܸ7~/yu>GkK7K7O']7]:ytǎ^[/7s]%]zΫgԉk|:ѵ_oqƁҥt쪟'Ϯʉ|:tx^u%+qKƥW^..=ҥ;/.t3o>yq^{7n ptޫK=.ݸ.Xnxjo!d".~}/^ݞpYk\:!>.]Kt_'] ^åxn^Atkt\z=ǥå;_.ԥ#]:6]z~\+[]O7c&/n.=iå׾̋G\zK/gХtꃧK>SptJCѥ7sBPD^Nn .8z\:5;ҙ7G^:p K uǥåI^qnKN`M +\z3^dbӱc¥ҭ߁KOעKz_.u9E6.X? n9]zgާCChG}ϼȓ֥w\:,7?\z.ݼ@\z?űlSnK/.XU^uҝ'QS[եK7/OZ?<\zqg..=#.=]ytqoH^KOGKI]y\tҋp@t:.=/l8t̓J=r\yt[ǥj.̳+'ѝwcwK7D.=7ǥW:7~?\zl8t!]{/t77 \zQҽ>3ul_ߏK_spa3^Ʃ^7K/cypҽѥitpK7.}1ǥS,0n8wm]t.tҗ8*\tt.Nm\:yK׌S0.=?ƙTp*}=twp9.z tиzc'M}/x6M]yw.XY.w^=t;<:toq.qϼať{~}߫KہK'][w^X}\z.]KOKy ޗyqs{m3O]WqY<]zsh \:ytws^]zۥťҭ;.yItqhx˥OW7=u˩/ߝwzyam/\pK^x{ޡ.qߏ6k< ѥn[7?hK\|ۋK/:O<:ttģa%9שn_.qyaxytďiy!u\:N)]zӹK_pup9o .txZN˥S}^nNNUN˿{͏H<Xe]1̻n?֭ffu\ҩ3go>~ץBt9.z쯎տ~7.Ήlx͟H}ñ͇ץK7~.zút}.WCgn~Gԉ?:u򭧮x4oK/#¥W*Kg<.ϞNz:s8ccǏK:p_uvt~\z|p=a//پ+g~ŷӥ?.yҥw2^~t ҝR.Ɵ>:n>lqåWҫ?qOtOr\]=29~uҳ:pZuҋ'^N=n>ԙ+<]KWu\zg@q:CwRrJ\z-1եK/{qߺ\C/1.K7rqKoփSNyfAvgz9)#!6mȳ>;uΜxys9.=ƃitqҭ{qc.=<.n9]zܗӥ/]zҭ_KԃХ7Z/=i⩗ۓ ҭK8tKY}':t$ q^:ܼF6y8yls0t韮9\/ftC\z\NnzU޲ˢۥgD4pNpt.ޞy{:s7ki:N^ߢz׸FӝXK7.҇u3W]tgl.=JpzƺG7ϕwiu2te-K7.K^c}.텃;.K:|;^mbsS^#΀z1qS׎#osɼpHKw^]9.=_ҏ:t 8.>+s\zEftw]:I=q޷ӥO>.=ki>?/.=]:u.]KХOgyKss.Xgk]җ. ^z?֧r{t-8}_>KAsat^zәӁҽ? s]zawq=å0]ҽK'ҳ|)z8.륿nKgez鱿ҏcm72Zt!^Sҩߐ.guypy>ҋge{K~.yqu˥{ѥWgWwKt_﮿ʩOdz.9N+n_tq)WѥO9.z8㬟?\z^Ot֋M<ӥSﻘgzǮV:q҃WSkw> wKw}q=ӥ;ҥ:=~ƥia"~o\y4HZԩOmt߇nr.vS_7z]GYzKY/=oǾtMwN^ҩn4MwN#ҥ;_>.>tKގ.=aKgqs}_.}K|Kn=>/뽇K֛;?9yvy .=Ӂw|Yz'KzKו^)v:y{5gy.t.0lK7͋:tKO?n^yK.zK<[WwN=Y_i[<1ҭgKo֯$qNС?`x%߿\z:uo^uYO^\N+'/'.}7ysǩK//q۷hSO&Fu7z.%G.kӹ>^oC+yqY?['ώ?<1]yx<K;z:sɤ['p..ӥۥ>yl{4]fFzƥuiC>^]׌o'KϞ.=~o\z^z3pq/ẻK/8֡WiNj.]K~ns nrYOҫҥܟp_/r|K_ynKN^/^z\慺\:~ЩMn8tAc^tKu#{yR.åG讻yY/<]:uE~)Kg~~]ʫ^:Z~yW'K.pq˳:=\zҭ?kt]ХuқOt8['/GOp˥ot~s\Сg]:n]hS6PwۏKKϼS/ձߎ.[ޏS9/.Vg̋KK-s|Kw9w}ۺ}K7ҭK7~K\:yY/tY/= H ]z/|.'<^cޫ;M=/<9GK:.=tOҝ@޸>қ9j笗a??.it7tC7K_֧O<>r.'Nc{_q[/ih|`ӥ;/.]/]~דI^yq H}Oe]z~/y\K~K=.>c+7^>i+&]:9Щ?\z:b&^v^B=>.Ӷ^ե[V?ҫҫqu?z~_]O&Oy{pc:˙^sOw.'һ_tnt /]c]S/}K{yv:uw.Mzse`8xݢMKu_וnn|?]<.=WpCozԥweS/x .Sskg<8tq}^ҍKOߝg6];<.x.Y/zd8穇μ1ĥe}7x]zAS7!]zq܏.n} KzKyH3ctI9q;\zu\tsY;o.yUtΓbt/.=ǟKyn.x~׌םvx©Nmꥧ3ǥbt>uxy\zw_Ki;Νy^o?t7]:{R/}gN}3:.=/\p9+$:tg=u/Wbݺm!}uBxtO<.=ӥ.y)qOKo]t1^?ҽ?ҝz!J8 oO󸾴Kߎ;s]C'K/_7סk׹΍W5Ewugv2tKׅY/=]cuKM5qYyWΜayRõo)]a :5Z/]KzK/ēzm_.=KIeK/]K>ҝG뮗&^^ul_Љoۥk^:tGƥWU\zӶxەqEХ[g骗\o~S/]љo=tmI}hM⼫q5:u{mӡ?n:ty:vꔥ['n[KtZ/N|+\.Kӥw={to~:ƼW6e̻dz.~k0~꥓?닟zy\:tuK?ӝ9nrqK/9}/:tďN!\+]БK]X,ηҩ_K'R^BY_SNq7x/;yHq}t;?Y/.ݺtwExK|tnYnܗ7֙5\..teRK~8']Еot[^uʘ˺bvҥ/K}.=t^z~e=OǾ"~K=3N1ϒGx©C'~<\yzzq%kgvsKwଗ.:bߌ[nߠͼ8f<\;mvQ[+~\BKnyRu8rq|븾μtY?뵿g}xfY&=tGz.xTKw ]w:c'~֩o ㅶ7:v+|8's/]c=p.x|t=/.[Sg^S꣇K/#`tL^t uxҥW]k/:su:qvѭ}әgtwe}yc;OK__.}Kw~]ftt֫ѥ^:gtgW.sy8ХS^:qӥS"]7u֋^z=m8ɣ;Ǒ^zur}k:s;;utҭz\z_]vq~_]euC]'Nt,^s׸N?;𪗞տ~{:;tG7.җ0/8?\t: ]˅ηߛn_8N]?KK/>:νr'֥[ozN=tY/}t f^lOKqK^WY:s{/{,ۋK:xA^us|råj|vppѥ7'\z)'!ҙ+΢K/锫qK>Xt-ХK7!]+]zӱK+.tE7ލkۥ<tCҍK#\N^a/^ ]w3)FOR;'N ]G>]۳^zM^ԭנ}s|KzKqrz+Kg^KUg grt9?S.xq0X/ҙ8]ǯ.å?K:k;o.tsxveoSt!\r8a^sX,_ף.Vk\|0M`[ǹ>K=iK|^u?ںySK:yq,OM]<˼ҭjt,t: \z$]:qz]zGKzs ]tKWNvϠK7O+ƣMW^飍#gt}KwtvSѥKϼ9]yZ܇npy^r\r~Kwv6?yqmå;ץg.8ҩg>ͳKW{O|tt^:gϡӡS< u'K׉z8>;+:ux\:g7mۭu>|rMScn34ӥO9iyA=?t֟¥a算>o^K=.ybz/j_sɷts{uW~ӥ[/n|2gVKhOљ'5qy3չ?o֥g1..X.|~yaނS/]gn=z;tt^ytt..]wbt.:O..tH9/}꥿k.zqye<;^zwhq:~\w8~t8t]}oқ]zӕҫm5O{XߜqfyW5ҫ/=.b{ΜyagYϝ3^ԙߕצKYyHn..u^^å=z:>]Y/Kuӕ=Kz3Oqus\:ӥg}u._ZpvK]ϣҭG.=/?aryv]N=}^SK:q!ۥCƥ.zǥq8u6..]z.zǸ2Nt[~yaS/}fWetK73]zv1nХ7o]qdpγ^zpK%S/orwzOmwZ/]K|ץ/rNqOKO'ߜ'u_֥W{xy|_O?x{*H꽿/t/ڙwuʟ{&\uW֥{?^ۥӥt>OOt?~e>o<Ϻt/t)zu龟ӥstx^.=K^z>}8_ķG>5둳h_K5wǝ.}>Ȼn;^zƣq|pxg.=땇K/s/>g~xs<=+!.|9Oj]cr8>l%KgK_ٮ]tCӥ[OUn]]q .M~4tDszM#t ǪK_ǩ.D^GҭokGG߲>|8h\zփ^Ot4.;@79?8z|p.}龇:ҳ>:/~OڶY?K$.2C7K}atҩ=u[7!:pKU/=˥/=Y|pKҳuqp:eEN<_]uKtov鯎=\zS/='ߚzzƥgm;/.y]^.}qU׎o\:ωۥ<.}ԙw5S+қ~7qәgt].IY/sԡ}Ý=qtu拦KtK.q_K?zY>o^=ۦ^37_Mz]WỦo~3lo['njK7?Gc?tCNʙ5룷Wi}u~#k~gWt.=n=h먭~[ǹgsSG?ұozå7R/zǥrMg~on|9]륿tUg^b6V7ҥ?ǵS,O]z~{5qY_gKb^:NҋLX/yQķG:rxr7߿[WlrKK7.yupzt_םҙ76ܳՙG|_.uq鼏H>3o̳d{c륧;XƷ?l_7tg^ķKINxԵxԉۥ&S/ӱgY/Q]z}N}uK/\uKK /qY?ҩҹ>?~1@qBiꇲ?v({EO??tV>y:}x;}:/Ү<\b8}8}Mrù\=kںpāp3,vN*sOp?r?p"_8}NGloo87ڗF{{pw:phr9w.t?Co}c/N8}թn_ӵu9}9yhEѹs{svop;s׈{8ù7r{tcs÷B6{8ùpη8^ùo. ۗ;@o7Zc^-\K8}p/r?wD/C8ss߷˹Fp}ߏKK~}~>C3 }_71O@8w7t{8ThhZb8/Or}8¹s9A{_}m{I{s=@fxG\¹8¹6w`Xktp;OEb#A_שs翎lϊgTc]php{@<W8wt p(sD,gOOg9=:/I,t?խs9>ۿGh֧ ۗsS>]\NGG羏_~9~M/L{{^s5zc/ngu49OEy c6 ùr?NE:pM?}C}WVן1t+ƻgq9}?|hKיw&s?p9N8=>W=o_ _`<Ҟ]}X[_q^8t5>;t{kyꙏOG=>x='JW>=b<g¹Q^bI=~_N}x^sᲇvchם'$9¹nx;K~1~Nձ|xW{_-?z7N|;}=bt389R8wt<ѹK{Ǿb sqs?p?~{s}4;}|}[_9¹sG];ǵOۺ}=N\_'`և6ڍ jksCj}p?s=}?O,6wW^Oq{|S/ٟ8|w}}_1yȃ )_}ЭWuo|~v;|[by2~o\v?׿~s}t?{s'+_g=p"~¹ttwo^qTGsS_U8?ùՠ]?;u/ˑ}{{5+g7=8|Ѯ1:y9}˹[/M?uo8uu}_toN+';Ir=ƹ끮!">۹q9}}{cpzΝׇthW#5q~'O lTh_2ֽ?ftxt׵vcEB>b]v<#!`/w\_=ԩ?1s߯_˹o{ p_ț{~G~^?EOGǼ8w^ѹ:!yՑq= /{{c`Q [N7~i1~~u_wq+y VsIv/s&Νt݈r+m?v#ƃG'qk,~_3ފs(ؿ¹񽎝xtw87Ɵ8¹nx4ۻOG?:\xozv݆sEå_wڵx.}/_?|s?xpؿ/l1^/]{+c~?]g8v=߷x#xs:xwsĹQ=br+֧>v{<[o?}Ѷ??ѱa8}=ӱ_=cs?TޢphO>9}|џp{^Aw8}<43ƻ?Əy7~^-鏿׌o?għ:tķcs?Ϗx6y>{S'ۻ;⽝;ޞ~Bszď}txC6wF|{Z}}qs9N$y¹F8=~hO[lu6c[?y3ߗsk{x8\=wAkq{}q5s}w.pu9=ދϷ;^~p?}JG<G~?O<}3߅sQ##cȟѭfOi8}ѱ/w9Q~߰M<{1|}?O8s g}8~CO|ڟO۸'s?pT8}h/\?84ow|<9~¹U_8Wx~8|Fs}{[O<0>^b{Yx;I{˝w<>{<_s?p'}/y|.Y>u#{8&?ztƣew}?lkxupsF'8wu8{wp}i羯WἫhf˹Zs>ytz0i+_?o euX?w_,=ߧ/n!m?c1fewotģ}s?[8<q{<{'_f}vz5Y?F~4:9¢#߃Ϸ¹X/hA¹Wg C0:F~5ƹc'~#?OsG/?Go]uķx_m{'pyknGy?нsN|f|F{0u_oëqO7tO7tO7}¹x4K?[lo:v͗g'^W_/xrp?:ow~qN(}oGvO¹xh^^i_p|s?8oۋvvk>kW~3}\}oKoMi<:ηpUi7X7[,ƹo3羯Ǔ*{g~678wߋ$cvU߮q5:j~9 t3ܢt-xϯ+̃u}| $|!fG{DS>.'^חuy3\61sDg7O/M|gxî_/Ĺoon|']>c}E8b2Qp;=iz¹營7Z/kӥ.ՕMn=˥֍]gw~_.]m/h{:]zpFɳk\z׵Ks|e^ogpqS??I;yq>K.FҗnF\zG\".ݸ.[oҿS=..W]7yY<]:}ۧű?ӥKsp\:n{נ;}K>.qn_|?\;'nBs.}8]<t.}:#g{ť7eܠ>={˥Ga]q؏7tO\w>u呧X#O3?LtDt惺\z8,]Ņѥu֧ץ[utХ.nԥSo']5q?菶.Ns>~=ӥ3k^å+ĥoql4]Ƒ㾧q˩^#r_zٸtC|3O1K'/]Hҽ^3Jԟ>yq/\zv﬏oWlܿtWKo勺["//]'.=mtEһ.|p5~8usե<^qN^as8.SO^t:tvuӥ?.}n3ӥG.{O{t腼@z7wB^NUN\q˼ ǥ/} [\qЏyl6q~t:ӑХҥ2]:yҭ_K'n.sҽ҉pҭK'Sިw>~m8k\7]8Ĥ#/:u .cyv8O>yt\:_Mw|0w}>n>]9yv0KN;//tҥ?ǩwylq/t%KXy,*..YMn0\qޏyvK_?Mn.˥7#M~Wol8N]o__u%ǵǩťWpݼ\ze>p]z>$.\uC.=&qWKout]ҭKǎKq韟byGt3W?.]r\ҿ+.c+ǥ3Vt*.{)vK;ť̳t].]K7B{=]˥G.]GKg~t.}qyIn.\_8~ESХ;.=뻿kʼSGyǺt.=O5e\.=^KOGK7q;:AtH92rԥWv)vݿtա҇u~/]wX漫sq<N=jGw\:ξ9*[]{}KCХ_ٙהOw8/@CǑ㤇mꧏG^2]u{t_\ҫp]KuĥW?ҫxU_k^].XnL\z:0]tބe^\_ֵ7~vy8{u˿gSԉ;hK.\?\FK.}åӥ܏tUތot쏖ܶ_..n>uY<Ţ&ޫå?ǥ7KOK6\wFqӥ<ҝJމ7{uOu9ӭ/.utMn}K]An}8]us\:7.ֺtt5t;?.8Х{Х.uxҥSONҭKw,\yUKҿKA7c{:y{t鲻m [WǥKe|r\zE\zҝފåw.Zoq>]][K;.=u56Gt韎yf/{ťѥ[g\zHƣxԭOҭ:p鑞tuzü®Sgצ3'u6tqu9|ЉG@^?ttStcҽtԋtYOJ֙5Ϻtt.zϺt]ӥg'^.Kx.˥{ԥwptwn=Q\qtxtq"?EgNzy\:CqSW/Kqx.=wüeyWu ީvһTқ6Q=\/ҍO.=IJ.ݼW]gtyu?ե{ƥ¥bpUKx.ytKGxr+mo]N\zctyf{|ߥ.s5mqK.޺åty>sKx..˥=8/uCWN.]G.}Nr/>t׸tҫq߱ux .=Ǔ_yR?rtzzƥ{ӥ|K7:]ҳ|{{>:.M.y*t鞟tXr{?K.Giq<ҿʙgKw|K5.=2Onn#G}pqoSϏ.y9t.9Kw<2;u83nGs.x2.=ǫtK~K7t\:qt||ץ_xyMw~[n|.\z|<ӭɷ1.=ƥuΣ.]{tKOK'.~xX8҇҇˫᪫hq5to٩ n>Jt:e|_\Su=\zt{ueKTo ƣ۲^qխSWlԙǵuԷ󻎝x[wǥWoK҇#\ƥK/8']7rpnå;o.t#֥.zZuq{c'WKwқnީsKKx[n~.=w\z^.=wWޭO>\n2}sԋƷ}.鮇N{Ki]zױѺtۯmz1?)"<cӥW'.ѕwӥ_.]ǨK=vm؟zݸ}tq8]9upҗmymKK֝uӥ/qХS1]Эwy\qqYN=g]:ĥK#:v{u};:sSN<:5+XҧL>4]uKO}A;.y,t?ӥW/.TuY~:Nz9i]zk'?Ʒ/å;xj}b>5.ݺ$^tSnK_Non~pttn~.wt=.~7åχKwG]z'D~k}O~-NYש}q~ѥ urĥ[G4]:GJNtg>xѩҭ.Z]z;yao<һ.qU?o:uytaŵKydp|]zt Z^|҉OKtM7G=_ӥS+]?\z~p-χKx]s\z[?.}Kץ˥.zmtqKҙo']zП^>q鯎M}t\҉>Gut&.=K.ʝvҭwK1}oKևԥ@tԥG>u}}{a]#?濏K>~þ8a'X7x>.zz}.ݹE7Ky1/\StGԥ\OW^z5o/:եOy2kEwNLu|OL^qW9(ެpҭKn.;vt_uѥ7|tp2zqKw..yv䛓]t䙏Nyt?oKm^z5Oڷ:u+k]~НKo|o7/=?Op9btG^.]Ko7>y-Ϯ~o:4'}\n:t,^U]st{}Kߏgg~q8˾])]5_߾=\zγץߺpg]z;]z}}M.GKAgttEn_>K[nɥKo۝y=֏okqӹSwN['&] ]z]_qn'?<=]z34/=c=ӧX}qӼ_yם/KUԥls;/e\Kt@ץ91N|祻Kx}K5-K7/^t_̫եs֣_ n}"]st.}op<9.Tt].ݹ ˣOXoO|ԥLtGd^z?km^K&]fLO{9~Ec֥9+ǓuԩG㜯t5Ko:&\zq.ҽХ;p5wkAj:uؚ}}\:}ztOt+]v{3/}oz_XөϏSǥ7{k׼=8ҋ9#'~oX?nK']ԣs+qyKwj:s\ɇ}K.6<]:y9qߙ^~Xw\dPֱ8ti\:sӥI>/qק.9_;/=tn~]oޛS]zCב߬o;}>]B\tOpMe^C]stG>:t3z[3]sv^z\^͗k=I\#қ.7.};>;ǥ9h?uvۥ|Ko.z.ķKY~)5t䇓w6/w~3e͜o^:Kq~n]z7箩4u~\7.]j^.ݹO!oݼt2,]z橇KK:v׼ .rAttyK'"]ҋZ=c{3.|\zN=~y_o~ k8oҝKt陷K7Y ]]\zHnɺÙoz[wK/o:q9gPNOt_ߺGs..}ӥg~;.=G`WΜTKgnpj/w^ԡW=9"{Ko.{.tyK=޺ g.ܟKwyU'?G\z^K/~=x?m~}\st>{Kƥ; ^/q>>'/+p5Gz|s\,ҝK9`:tۏN~q]zѝqKӹK/¥\.Yn?STykzvNj<#/vN׿WKo^Oҋ/O{]#^2;\z@QުysWs;U>=]pəǥquq Gg^k7.]gKtOuagy3,:N;.%n^uIK tp0]gšv8\t:7]z:sW=_{-z¥Nu:O]']s$t>tus tK7xϏK]]z._tz[5;ezKsKo:tnqsp͹$oַ_ݺ:t֣c.=q{|ǥǥӥ_.G:K/wt@uɸV.Lå<Ν9sWK?;WWKt=c.<~K:i͏֥~g>.]N:å¥\ҋK]k~y֩C^~{{yԣܹ5|C?յ3Ǖ|ɚv nߚҿ.}et1ptEKq b0O&.]gKy{gh^E..ǾҧΜq^.1|tΜ.=\z_uxۇo^%OԥK7/=G^qܷ}lŵuGgNޭ[KKz\kwn:`=1Aҫ{O^y虗ڙucuq{Ku3g~_8H˾uFՙs|8p魚wy5K|ttvKu5<\.]K/gZ:uZy5u/u:nnΝx.QW!>Eq酾+]z+c᪋}vvN.yɣȼt 2/Kj^G\zk>>:DӝG]"]_{/.];u /]zӷK ._杇K/Ӂ?!K;_:D8Iuy+,:t7/=oZ:u'?Wi/n}Sեe_I2?>;9u m]}\zq~ sFt:\]:uӥ_nәYv|SǥsuwK;gԝ[xXS<׹)nq/sPtOʼtݴ. ['O&yvrSinѧ>.?.=.:a̧ǥ{}K9DWԑy;]s0t{f]CWauϙkv=nN>.9$;/uͼOn~.c]uۥ]dn..}:y|3/y\z>wtӥWwtGkd:uo^~k<O6{ȫΜ}h?]z>}v7iNn]-3=_5s¥ܑ^tIrM>ͣkC>v_:u;tY0/tһξȻ.}ث8u5ܿf8]ztj;n_wt碘ޝ k]speO>g7z9CgNqԥ\t>ZY&'?Nۧ+qҝO.=/d]z5 Хo{ lnk;7tԁuQnsދ}v䕧K9ҋңp鮟:u_p?7nr7>t6{|чKם}ҩ[>~n\\nCǹ7:֝7~g{]dp{A|ɤS_4ͼy;ӥq鬷K>a]:ҧmq޸k;AZN8o:}{䏓>to{=]z5ϼ˼tustt|?IK[KҝK/ۼt]yB̓¥#2/=q\\zxҫѧX楗mtw!sOF@{ϼp/9֩Gy][ ]z:i`s=NǣK:'k/.zѥׯKiۥۻN]?]}[ť7]KgQSMܖ/nn]9yyKO7KϾb]s[t.=KݺsMkEg|ХשKPx}һK91K:p}w楿uۺѥ;Cnycn_.}xo9k8btM=:åBH^؞/楗.ӥ_K9]zuc[ۇKoyn=ݟN98K9.}:K=x縦Sq* Sҥu~֥}ütKץw3?>uN¡SιPK}7tϟ;gּtݷ}v:tT.똋;㐋]縎KO.NNsX㾫n}hb{/ҙx]Sz=Χtҝ3K#/=џ_\-}.ҽ~0/]k^K/tGwNyn~-ۋyMd^zK.`ե\]sUtcG~ԿӥHuq/?]zz7oOޥSԫ{u+䋵sR]?š?t8r\x'}6t9Qs\qtmߺu\:9\5tnӥOt]\qp麖K]z:u}tKsɃo֏ooO?8?]z桗~|~۳:տog0=᝗_M>:r^OsWoץ7w^͚~G8:sW]ud^sqt:&].̼tW9a^xf^:E[1/}9\7ut\}±ԕKp8>w鏾O..I6/̝^t怹5uy~kC\XcY桗z;]ںtݑy_:v^zCɍKNQ^kեٿ&8r/5sW/z[n^n*.܊t̥/g~{}>ǥs\zeWr9?ݺtya=_K7ԼfwwgֱSԷߏKO'>osG֣uӥ~p'Kޑ.=yS~?.ݼY]s3Kw..K?|祇KԥWt1.K7KtHK.=һN8ҋk۹twt2/}꼋C~3K[\g2/~txKo3۔.9gǥ ޜkKK=ν:9wUt鯏cxq]wnŚ1|59ex=sovpOg\XS_֏q{yۙt/_:b績ͼqҥ`qەҟ/;Uګx}1WvՕԧ]=\SyҩKcK7?Z~8u;Ngnz9t?jz<>:mׇrw;wko:/>uַo[K/4Kw}C^֥Щo7:ySgN9ޗ?tחsW޼t9?7MzXS? ^E]yKtc.}^Y׭Sr:ҙKK3d^:hh(q?_??o??~{2U ~*??vNA:w~so}\X3_'5;? l+ܬ|Zsۮ; ~Y?\T8]n¹tu¹~(n׿?+g^f8s}e_psmp Ǽpu50@㯋_Us_8z {¹n?~/=;G?y˹~m:7'Rȯ_?pvy~̓ oz 羞Oy<8s'o^Ǘ'/?]8~QY{`wsVq #tc_{p5/y3ws_珗5':kS|̫O}t[t9[n_ }ks_5~_8?k2_w9uq߳8sis_>z?ֿt| G}=~qE_{[s{=}}<|?s_O9z*+ѯjsùϯºs__ep}t?:՞ﱎ/z~O8u~o<pdz?fs_Ǘu홷=z=zOۗs_?]>9~yY?o<}kSgթ߱ǿ]۵gs_?Y?W>s[W{^ȭKo}is_rm.z\kΝ?:sŒ@ùvz?ߟC~nq }-/Ǐ_>q˹롛5{'ϼ%w8{pf?O3 ڏχp|w}Tt3q}?k?q8}xs_s_:^ǻνun8>XXXs_맭ףp@a]:׿ڟ νuùw8nǿ뵿߭[p˹vW{S4Wp{umon\oNO=_uaښsx¹pgwq=z<k9?/s_ù}}]/w_Ե?q3O}=?ubzw~zkqօ_˹tw=}}¹_:;ywO=8<os_z8~ 7CqѹWe73_}>-gD8UOS~<=Kx;׷¹ͺpX܏{]pG{OϾpxu/:u|v%n?tu~gǹ5}_]ucoo\=?pV~k/>z 羏/z=_s_7 oe=z;ù{^[7*{ sѹ|Yg=8U\uϧp ׫s>ù.}oc{w}9 G^Oqs_pp?:x_˱=|zysu#o}.%gS ^os_S}tz߿q;tWԓFCuσA|_Էù͚{u~ùףkõ?o¹źgqѨvb]E8u=ퟨ/ֱqʜ'Zx' P8Ab}8yuw\3ao=A8}Q-<>q=;^?Tuܳ>υ:+''>{|:;nO{tԷ9Czڼ%z..=9yqw=#7ׯ8̻o?s_;7߻zb=^o넢F;][߮g\އs_5mcĄs_O؟yw}"|{ԩSW8uùAa]nq= ^z _]ԏ%:pO\73羯ùg}=_:ùG}<:jP=Oԋo<ӹGt׽pmz6|< >F&^W8UԽs|S~3N'wd|Z?~美WO9 oԣsc}Zi}9^m-[8}~ ޺s¹g8] h{s߿qٿs_Gl/֏cND8 羿sS _k쯙]_?; t Nk/sU¹ޞu8ù?ipp }.5)z^?olu]??pkU~G? z|Ix]g.^sߟϴ 羯ùvq}>s_W]hs|;y[C>N^=^Yw{zۏx|_꽯FkԏC}>p8{7Go?et5otrù}{ùc<^#.<꽽Nzl8u3zs¹˚qŏ߿qpnoԣ~}=qU];t0SߎϻInN}}ןù˺;xs}]^w8=bM8\yxsߟgaM?}8}=} 8OSX5c7p-ڰ[sǹ#q{}uoxhq<羾Vԯv|8}/:?ߨgo5t_gxӹg羮wN?x_8?e~8w2tps_uǯkq}s=pg;T8^{t5Wwoq|M߬S _`M6Gk^z1H8|?ZQ~t7ν9 v>oܳ8zӽ8Ĺͺ6k};\W8 =pz]X>tԣܳsݿpbM=:wY>{z{'ܳs_~e]?bt歏k^s_g}νuùg0=ZO'=/8ƹg羞e޾gpZ7Ϗ܏=Ĺ!:K>kWp̣[N4_tO>^`o_q?lXS|721W+{Śz*=} =7pn^]<_wަ3Oe/[on3=}}9^jNztamN~{dǾzK~G?cw/ǙI8ut݆s~ 羞o?Ν2{s2~z&1sp߈sz=Kq}ùg.=}}xԭWMnoW?O`z|t=-_{Dp.]{Wk羾Է3=ߎg8s=Qppp[| ~ߞG${ނs =ܳ^8˛+o9Y*9',>_sz+=ZW/?J;ut?t::.=]ud]f9.1];֥9KR.M>p tjqq^צKΗ.>k¥֥s]Ko]ל.7|?S:+ ?.=O]#]:}ۺź%ںkҝ.Μ=}Iҥp]Ko0]:}htץKG{ץ>^>qmC\:tu%tK.]K<^\ǥW.7.MS;p<^۽?gҥӥ{֥g~=}̿ӥqۿQg:sƥKҥӥWy6ts޻>\zoǾq̣ť۷.WߞۥwoF݃oÕһ}Z׸N>nnP{1^S'yKĥGKuw]:nw]kܺ:{\zߟS,~F_c#_<];89ҥO[:r9ۧK7.åӥvq;\};>ҥOБg;']+]ågyh]k>=.|i\zo;_GXX?]7_XKwx[׎Ky_iq;y%oq};Nbm_\cn]Kos;tߺtK/pzԥ_:jdzSXcݬcN\$]sVt鏮[׈׳.]zΉ\ \3w:; gӺt?pqy]:3ɇKKo#ե;ht/33{M"Vӥ;K^׾u^A^{\z¥;;uW>wéCr].z7g/]:}׺֥Wpӥ7qI7otӥ\zwn۩C3.=ҝkK7K?ҭKgntһst.MKo+ԥ;_q:e}եyKo\tnޏååxK7I^[ҥg^y3եDžK> ]o_:>zŭs;}/}otWKב҇_¥{~Хg.\z-.=>ta~.]Kgny}Eb҇n}Zp-e^ө79.qݎ%u=qJS}~v: ]zөҥg|xu鍾!]:st~K7J͛Z~ΜE]z֥? K׭mcһ}¸KϾf]_+.=q~Ln^".9]3tt qݼV]z7z{/ԏΜǥtutoע;Ǒӥ n(]zpΣKϾx]zag"Nz|8|ݹއu іʳ~\yct|v6]ytq9)һK7]z?voO}ҝ_\~\:suzuMK7nR{uw.'|eߧk8>@7}_~ǖ!zotquӥiwqxj<8ҽå7s.͇KǣWHwsԭr\?KDӥ;WS}ĸt縥KKtϰ]NǏKySt..nݹ5}l ݺs>:NKpt\IK\z^oҧnrgv@KKtޞt靹t>rygۋۇK]׋SI:3?In.8 ]znKѥԥS9\zcùlYv{g`M^|=-]FĥVtt9' \}f.=})]܀u=OӡzϺ n.ݹto/.G~+]J\\z{]o‹}yKy]9tRu鷮Z?Wq tcNmթS.޷SǑ_\oҩץKyܳO1+.=ҝSKKQ^KΩ:'cqޜKKw.]7Klv|]v5%_ǍKK'׺s#N{\?^ =ow:}Mnߞkoz~:uyK.p9wQ޷3M|.K[/=Yϸi[g^?+ĵGbΙk¥dt Kwn.>K]z~;S\zέĥ]u/Un|; ةt>w眫K|Uե;7\p]zcλ.=?tk8/nḛqy=Ki<ҥOKwN.ݹ*^7:w͇rMn1թқsqFKw-.=oҝcKG3pkoǵv9gs\#Rr]zq}o/.%n[&o<];7e=_&]svtyܸtC.nSѯK;]:sulntfv\һyǥ;sp9GEN`a|w\z^KwzBިԙtty>ƥvtBKoO~K-ץ߾côƥvtq/<n".=.ݹyttӥWs}.=.tåG~|ѭS<kӥsp^N^t[Koۙ_1G;'_.Wn~.]KO=r.zts p:1\z{ XgK1]\C:sHk\zաS?:s;tAxMpA_ַs;mqåK7VN(]z S`A94K?D ]z}]:tv߸~~N1]z޿fY_\}Ϝ2ݹwԗuԏǥo_L:ty~zҥ7ۥ_n/.t|J=KۿY֡S_ſ~L~|ti=9]ptyҫJG~f+2KNC޺N7?Y?k8'Kw.kKt9]z{u5/5mn̍ҕoz=EҥƛΜT\~k1*]Ѕwod}}ΙةoԥO5ùKۯ.~']z^k\oK/>_s_.=өo3^q~Ϝ..9|>q[қsktطsc~]sӥw{~\.8p~H^uѸt_w=.ѡ't|.\z3_Y&/ۿ׫tsҥ;H\#e\qӇK;4]s8t|c}?sv;]uy>.һrs.z.܅tgKKtԃu9w ̓ץ7t;]z̭7枦Kr䊦K/KǥťwHqåOu7\yM.pӥw/.Cg^.-p^γOKO^Mμ ]3/}ꞋkNg^z槿߫uΚ:Dq̫}.OnwIN#]]:SKo{|uݵ[wN"KQݺ}yvW]}<>_ҝz?+qoWǛKOe^:}Nuf>y yPNuknq%_GWμ/^K|[' .=]vKѭ\.=>;\Kס;oON\o94/=rd=5}6g/Kw.龫}l/^N$^tқn9ώ'ҧk$Mg=y:.=+"ާuG~:u < zJ^;_:s_.ѿ/q!_թV>f~_1Oq]zǼK|o<\Cǥ:u7t/.};tl\:ߋt\s<5u٤KowWǥ{]c{~\l^t敵NݺNa=Ng~vn߳nptt3/=^ۥ?9>쳛g~c N]I!s^_toUO=yuGN]#וuoyv?:Qn^.t5pקo/]w]:}86y~pytХK{8];U>CӥKzޘ.G]z海ͻu[μ̳<ޟ6#]/0]tܫΜ5v Kne\sWv^:s^y\sN.Mw꾋k=yK7/Un.ݼ>\zқƺt]yv 5/ǎKms.ӥOg}楷]oqt7tuno~ԡ>u{n.p5c}GN.ݼZ] 2/ݼ0]p} xoon\փL~9֥3'/ocӴ3\z{g}/t _]x/ț}{{7yw:ryv\8]z{pt,l}{t~gKn^4.ϻt|/w*ҏۛRYq=߭3/.ɓ'/ .KufyIҳspy>1/W#ϼG'_o/uK>ңo˼tfq¥5ҙ\iL7/=t麧#/fM~N<`]s>v^:./.zܬq=K>35/]a^zNݼt:y2ӿC&/å;w/]zӧh~b>Ţ3W9MN=u;5sMo]y:u\:>;}yg\n:sa_oO=G9=ۥw;NW11/]׽ǥ֙o?sǥ3)_̜ztKwn.g~e|z{/qEWn=aMu{;ҝ;Kossk~u=\\K7ms>{2/}ַ:}qK/:u^q-:s8.<ꝗ;uMCowK'|ΙN^tԷ{Ǹj+s^KvԷץgKϹ_Ϳđkԥ|ӥɻg^z:s.9}lUϼt^q4fNj|0//]:y0'sy{Xw9򘓢Kq3#2_׋KT]zKotžХWߺbv{s..95KE~ʷK׭3wr;[wN=ǓtvKϼs\>@^K:SJuя.y:ӥ Oۥ_ۯn8tԷ/:}/owַ_97zBi\z~_¥7u?u鯮5:Kҥ;Ƽi^vϼt\<..=u5DsH]3by7+EΜt2/ݹKzμtousΜz9yOַ8>\OE{c.B{qۣku:w]}v/kyt ԥ{Koӥ{ӥ{}K̯>š3o'|p>.iҝKO\}qx{{Kzқk7_t?K/>-u_^u-{?.=iwӥKԥ[ĥg sK]spȼo\y^?ҏ5 \zѥ.ﯺ{ǥ\yֻw^z?u˹/ssRnqpwO?tu0/ݹE6/gNԝ_l/kImlҥ{.]78s:qΑ¥KKoC^ЉKK nN{ogNj^K9 [2/tqCmIХ܁W7~7љҙ0=Wwb<~e~y:tѷNz4ݸtӺtpCU96tطsao.ҝCKK۵7S]:yxҝ9;{搒ޜktGg:^'uwCwsg@楓G=9'5s@tIӥOyCd^7.=uq>¥.n¼fku˥3U^b_`]s u|K7_to_K;sכΜz40^N եӟKypLt-Ɯ[]sҥt ]]|7[2~pۥsҥ_nֵ-եuv:sW\ޫyoSvo~\zׅ?_yg^qG' +.GgjG]zq.tK7(]zEGKW抝.t#.].}q:S\z1lq3/#w{̅ʼtv}շ^vUWN};.#t.G6qsйUg^KvC>3#O/a?csM~ؿۿyOåߺ|\:ĺt=N+O\-ҥGO^:t΅ХNzy]:stεN>{һ^?]yc]\StcINntG^:ҭK84]z/eǥ['MNq?ۭ^Yg 7. GK?up"t?3/mҭg^ө<:sS_ƚFӭs'֙_Q:t| tt2/]3/⼽qKn^\[С_8u9t;t.?ޜGz\:)5ȃy5u\S7KwG]z'ҭ3ҭy鯷1Or]Kμ3/=nO~󝎼Koü7_ GuۻtGNt8˺F]z_I;uxK.=0.wWq\p}kL:|bl\z6Ngw1O:uVwXt8q. ?g^:>3?W~!t]K7ov_kq1'1աSKXs˼y]gNy陯nY';oҭ;bMbיq 0߼^cb|\m>.Onp ӥ;FҩåK|޴o֙p2dcgnLauߗ}lg^z'u;/bnȼtze_Ŀo^z{ۛsy~m۾#Oқ%$ \zK>.=}Ց?:'Ľ҇kituKt=+k\ԝ;o0OO9ҝc^zag^ԩ?H<3/=_Kw.=?tOo]~d>z?@ܘß:r\stoKzQ[ԥs=Kϼ\uK7ټkKowre~)>3?'ttGm~>C0/]7i^:sҥg~<.]'KONԥK/En_5.=.<*WѥKO.q<]yC;/}_‘?Ņť7Huɘn.*q~In.]KOK|Ozy<]_ݹkpq×}qn.}ȣjon9Fnߛy҇yǥGKNE>u"]$;/ѩӷ7t䯓O}ڼoO]ՙ_Rxw^zgMyn3ѥdžKoЭguud\^X3\.ϨK7oW.=}uoM>wU}uԸS<ҝyKy֣q_y7k䋎q[oK/֫hk߸/:y=ҝKKouNj̣֣qݾ8?ymg_..=/pԙ{G3ga^z>_O<~}{~3/ΙeN.ݹK5߼tjzoա3'5_tҽ~ץWKzve;s_nonpQG['7]z{hx2/ѡK;\qaå;YI~?q7߇qy}KӥU]Kťv^s0Kg'/O׋Su8u8t98}S]3?ttαå]yӺt u?.z.מsG?Htxm\a_[_?.ݹttqҥ]k^ޞ;߿Oqs ҥ7]ҙ.Se|;kΏK8\;]CimK:vzӥ+&ҭ7ĥۗ.nN_a:ŭ¥g=adqu}֏ӥ鳋ׯ.}tO^?9\:Gts/KO76OO!Su.9>6]}uO/tkqp[][/}ez~to|\^u䇓M5NS1}ҝCK_pݜ.};𦛏Y]zy˛TYΜ<3[Tԏ3_~;>뽟#\z{78?%oӥ.9/ܿ.]K,]zUKϹ!ַ%皼tt陟N~6Fat9zrӥ+{;uCN}|o\sq9gļ{}S?os]9Ktۥ?^8_vԷөo~Kw.=?Kw4.yd^:/.=Yǥɼҥg{ӯ;.]N}[߾t%߇NE}.yK.:ޜKo銋ν&lίp5ۍzD9g~u]x[G?Ǽw\z :~Dҭ#/.j2/׿y~zԝwfw秿ַ_::Kw.9XK>sN۩?ncu9>e67Vݹ{9v;ޞ3/=.~t3/}ߨOӥ7uD\stѕNy~<ƚ|եSH +溕}>ѥU?fNXt-uͼx\z枍\z8Y\z>tKͭH+]+]s{~oiu/.t:&]:twTץwuu#/ڼgS|ٝy-K]KorqԸtT~k_k_Ko_t4.|u۝ =[^a]Hҹ>ҥ_qxns1v^p{?źts2/_]z3Zu8{qKםS/ss.յO;ߟ3G.92uf>.=sK\Sn.tM.=㐋k9EN=ޛysms\f^yƺt..ݹ9.?/YOʼtq.ݹt3O}{/aX/K>o^y׸s t:u xnn~yW]0ǹS7K3)]_ 9'~eXѡy?+?.=vǭ>q7_t9~>Yq˸td^cƥ;wft/ҥS?M^?MGN>8.=]u}gq~ƥw|>̏<ԩo:tc95m\q&+M?FcM=v{WttOK,]ח;/=]'Weԡ?qӡsNja\׿'/̩G:t;ϼq!}?ùn?]po#{M؟yܫuu`c ΟqN卼>s_w{z]Fqܦco v^{ͣbԭpxߣ ds؟sI¹j[?^Oӽq.9z>u>G={?\zbE8w?:޾g^t80k=ss_/pI_57seG޶^ﺿq~X?sas_뢃-p㳜ڟs ¹}ƚ<?_G 3 ^Gįu1}t{yA>}(/ 8q`Nͺ"_@ZuU|9rz}]5q/׌ؿ|K}&bj4똄s_-ޯ,y-g2~e*r5tSb;/1qϺ6ѹ`^/ѹV=?XOs_¸s}:'1ùO8_W8u{=߯y {c&'sqkkc}k>Ȅs_cK8~ӽO|?8wn[tz8ܹѹdzѽXߺB|ӱq_k>W3'wkf'櫻o^޾uk|¹?87n ˹`ձWSכ3s_w?cOg[}__¹eqؙv\c}_}_>Y{}>8ss:y8{_ps3~X_;~Wx>O/xi|3z}?1ӹ?WFN[Oq}}m>|}ݿ/Xo3s_1[ ޏʘx}}~f-}>7%E׾ù}}GGPc>rs]~}}ub-}ngb>1s_;]o!>p8}},{#uIen۳#8cfď}Onop33:Ν:>1y%=8}|7LJs;}_cǗ|x¹?ٿ9:^n'k/*Z߲8yu<3Kxog8/[n8>s_3x~\¹?e8u}׵{8}?Wq:7 ֧::r3~c=}}#q{wL|7~E<{}?>O7A8u9:sqRw֣7籾 羾ďqOC;a?:=/3{މsߧ¹8ٿr8x?KW= 8zN]c38~}˜x4םѱ߬/+?}|֥ ww%{JB຾G_:'֯?ǹ>/+泮V$7cǷNc_C$>}?Խ?/2W.~ |ӱ?Xs_8+ߍG sx&:S3~s_볗sQw`߾u_gw[g`n͗*{^sg?:5ֽ?]_pksө?}_?ùg<K1S3ΝA}'ùKh2}ùg }ù~:X=^QOK_#~\W^c>D`fg¹8u?ൾ*pp+^2fK^#3`<2}]?g[W,G~G Wq:g|֩^s_SߎOwoY.Ƽީ~׉>۩#\G%7/Η&pk:5u¹&GWZPcx+u<|Gƣ>}|jģ]?s4sߟp{ }6οpk : ~_#e=}mď։Wu.6Wz8}pM-Ӿ?߱ޯùg}}_1:qù{8yp;7z='8u\X{pkk_8i0n1?_j5{t5竌W|U:|?^?_#㽷ۉG߼E/GغJ3^ci݂Y"u%¹=S;iitt8/ֵ??G{~?Ig7Οp:XgA~NB>Øo_=N|;g8~K;^o8 羯pχs_'[M8}38¹9UģWeӱόo;}!EeL=Ĺg|P;itzqPo%.gO}t|ùnz|ԟu}9&]uGn'= c/gNZ;its_uoùG7}c w<3>sp?:?R#~O3iǹ3&ߚgoG_:ۗ9sΝ?:^={'^~cs__3#k<4]o8uԭt[zۗg[~ 8>{s_pg^.衛_G7{~?G>:?'յ1v=?=>b7tk>h8WON5u;nwԍ;~i{s_ǫ0˾#Չo{xs%=8u=yv83Dwu>ؿ];௏}#q+^cbqqcu3׼왿.Og<?"ݷ{'ߚ{?~q Wz~382ͷ\3}?^xϿ3}3^co8\ܟѹ[+:/3~???Mn0>]\k|ͷgv8'ltk}{pi?ތ]{=q8&psx};X^:'18}瞾޿ʘx{8ؿO/9~XWp+Y>#;tď/]kG/sߟpk=|;/?nOù/xtu<{:vD|4;_?1Wwpzۿˏ==}N=t}+μ;׎Kw.]wKwNb߸.S'q؍kx=?.};a^ǥåny\zljmmp-tݰ._z~q#OѸ}wvǥW[ԥO2.}?;\z/^/.Itһ4qC]:1N2tuvI‘K^]z)fW{ǥM3ѥݏݼ8H݀p_^Ќ4׸gwzåwGYwKvv%Ӝt.}?>]ut{ҟqtԥƥ_:pt:N]zK+oڿ62n`ay<&Oϻ7r~K{.KOKo۝w;9tKwåyvDuҩ yooIbK7W{N\c{uw x?q~ӥo8CGSz޲<.qԹsn׏K?p?.=iGqågv?Kwt{ץCӥK. .S-]Uwu\v.8sA?q=tӥS^n^.ӥ7k^\=;ܫyqk.8u=pǟW^HgL^Kt]g~G8Dӱ`yqCg~~v#.:+q3gtu7['n}+cWz~Ըt듷.E8]:.=ÙKw}K}Kå{ԩO~ԡ:'QAݿÑқqO5xu|Ϗ.ݟpәo|\\zh]ytJ0]KtWt탺H+~Wbn<:7Kҍ7K['8w :?<;޿pmlstq}zө?֩_ֻ:sǸpuK.ݼw\zһlqY7މgK//..\zǫKN._'Oyn^}|{zt|\z{/]:7vp\z.4w\ҥϧi]םW/tvp0}v)Vҥ_w4;yvcΜC/;.KGK. ..S^?]?ҫuUp-~7^7\Ř:q+]zz88^!+.ѩSw쿾5ƃx/8pқt֥ҥp:t9åB>XdƘv;|ng\tuīӥ=&}__yZF~yӥP ފ;\z^KQߙgw1&^]zm}8]3k:t{׭3_>~y\u ӥ#]~t䏮k.ٯ=\։GntcK.~\oOzk)⶛< ҫn[״u:u8¥7KϿ7zq/tO^?. u^tSס}ա3_ܟtҥ{CcKD:]zIK7K.:%tNK:w/0͘<8tU'zo9&}}ylO\zҭKK.=tKf<on.lq:H̻y]yt.ݺ6v?uэ18*#.|\ޮW|.c2v{ŵqٿ}zΩ.ƥW'\x~\xju鮋q;ᔋuR|g+\zgt鹿ۥx]~mǎ:v^;.Sb.gN_:.;ۥ5ӥg|Qzަ[wu?·n<:v\ut:օ}t#ȭ+'M:e\z/|tӺgNKno];C;.=o|SW~z:.ޏ.]'zN[~Qga\"X^>zqg]z\vӯ|oBuU]åo.v7~|aK߲/u pqݺ1uan:y\vW|8Xǥ?{niKGՉUu1t]~qηvtեgn_)]#n<.;.=AtuިKo֑Yҋ~vq> \zzK.:wۥqaťwi:GW~[N~4뾩 .=K:aɷ>73梁t:ѥS*]CҥԥOKo[iաx/׃tI:\zn'ߺ\V81<\.}K:K﷮ث['ݟ}!ҧ.5^^>.t>xo9]t׻tۥw?b{oƷ9MN?f|;+.ԥo޳ŸD~uz.N9Ot7J>/~ό)uҥOoKN2Kg.>ҭKG?v9e?uo+݃1w_ҳcv֥[n֥S7Xޣ?uMw1я6?]:N|߮:u>F|~C\zIХ_tM}\:G\3.˥/WtKpJtݤ.t:]\z_ogԕSoK\f#uںSKҩ.]K!.=ҥ{֥ԥG[_kt?~ǹ|>in..=9uHtK/<4]zp5sq>s>8r?Y3> N\c\~n>㺟.~{? q]zיKxT7ic7uZW]}Kef<_鼻inSޞޟ.q;'KХWץӥOntuttҷn};_Gpt/.Wi:t}}ǥK~tuCӥ{̋cK>kåw.]'Ky{:txtNN҇c]zeL[z>gwC7oONpL޷_K]qupĥ7ҭKN.}XGť.]zi_5sԣN>uK:8ɥ;; N6uC]:&]c?Nd8&.;yԥ#ޟԩw̉k輷Kסss\:kI cة|S^}Z:ӥw;u7|Ͽtj~q]cc\߼̭8 G˥OН/.gi%ҕ׈ .]ǐ]KCWKطy{E|:]s'qL}t8x=:yvcߏKO'K|y?KNӟ-7>~-nUu!{?_!.ݺ tD~_zҥC;{u|:tsåw;suO..}~CgN^g7áKN]/=_3nAw߿|:+W܋gS_4c\op KO.}o۫۟:X/ץXѥ_Wx3&o/VtvO .KS.QGJ7]z[׾K.~tsK'O~;ut_C'o8֥+V_8Wg?r:Wχf?k|]GM޻/>=~tpt};r/=]|ڶkg?^uXå:yqUW~uߕ{v]nCIuз_]z>O?b/=^Ku :tW]<#ޫ+W~؍kƏ߿\qiХ{3~:]uW엮ӥ{֥[gKg[~yҽ/xM0K?['1~K7o!]z+|9&p[/]KyҭtKסۯE~>.]Kq8K'^..׫K7o^Ϙ~Nfʸzu;.{gKONyl엞n1gsu\C'o}KOK/]~MwNsf1&k%_<]ytm;3.oK?m<:tۥz[g[Dcե[91_)үg1/'tet/~ǥgUOχ>>/Cn<:tN]Kwq~Nw3uzeq:U]gWuOtwnN] ߟOd=tե^u)ѥ{~u\Ƹ!;K~ԥ']zt֭Хg#|m/}:&~xy:u<ν[5_wo ']:ʇyvNt}\.JH޶[_͸t>_ҫrߣuarz)~]m|qLOwҗuR߸tuKxKt?3^KKn$.=lNtօХIԏKǥ77q~ҍK\Qn\zua?z0Na]z~ZwҭGY]N޴.].}_]-ҭËK/=y!_fKn>tYU޷SKo~q8>}}ȇN}Ptjq:t~KҭK~_p63]t8t2~q_u~s)['3_յ['5ǥ[藮S_c/K{]uYn]:]uIz\Jn?\z5K).ҥ{o/K7]zs<>ҍ7/=]r~u<åz\KK~됾:tN//tWuh|=m\e6//.VnWS#]q~ow!Su/}қQ4]zGG>uG]:ѹԥ:엞NKn5wڧ,>ߺ[w]ҩ?q*+vǥW5ҭ`isuco K'p~u^t7^.fL[7S'M⽗wKƷӡ#$] ~CN|֩xxF]WgN/:ۺqN].}8f<~nx4SX:'֫qt_:>KgKN엎J~Uҫm|5ݿ6#xo_K't>~;7vy问_tuR?:uWN>`8|n|ҭ~tt=]h]zWtgtKa> Ktsu?{t/q[K'/]zuG8_>Dtg췽۷1uM/9uRǥ{.9XxwK[\z?c<]z^t.+S\N]+ҽ>.~K6?֙K8|\uMtѥ{~ҳN.|tUgX'u.:\t҉s+/ ?rO^W:ҋqԋLp~/yt*sץSXnGtet.ӥХ=~;T:w:鷐қ~.uen˸F:uw26헮ץ۩u#K&t:=\Kwty~ťWd?w8wx]]zk{L^[7- ..=.: af=;}3nqC'o~:s[@~鹿t.̯Tެ+K?Lɳ?y\z~^t3?M8\Ft靺ۥN*]NI^~gEwN}z]2/Ngn=1yv.eA4Ǧ_ƥ[Fut鞏ۥ_;.M7xډkЯZo/{O\zĥ'M+.}:~cץS6]zҳ:qtǻ|gtgJ=_z[Ǒs|{֟ә?^қSKOҿ_ҭ+KpΣKwp7?q}>4[/4_]:ңN.K?.~/K/uq/ҽI/y5npЉn=/K.\:ӥ~2}tN{fN]rqq}/ű~t3>}9y{t^ץ7ץw.ߝtE.}ЉLO"o\#r}Ƌ .}bܠ'k~'CǸKn\z~_:y/8ꗞ:c}3KuUGu=~gn'n\z9y{엎ӧ_o[WDų_z\Nt铺Xi'qW?{OFW#N4nKw3 v5;`toY9SN^'yUWi:twSi܋yq_1/ѕۯe|rO#qѥ۟F^uݯyvǥ(pcNnޝ.yۥ[ n9-nŸ}\x9ػdnzŹxM4:tڷK:tK~Gct3/uSys;?noGӕ3_?/=#O|KN/пrKҭK?ǵ;\zO}<>oKxǥ7^:uytϓuWu_q鷏g>я=]z_)t/n]]uv~w~_G>utxwc|CMngua~ҳz|?ͳc[wn]g|ӥ@tcCG^6.=w/=9oӯxEޱ.]it~~q?|ԥ>҇~2ХgK'$]yKOwZwuWӓuHӡﻚ7}>{̉:u_ͼ[nxyuvqխ/q?&/Kһ9\zm҇o~/ҥ{.=ֿK.[v:/c<|;?e.=Ywҳxչ_?>S/]]zqY/.ݎ'.=O\zԥ_[O>u]rA[KzP~m?ӑW\SI>ýC7PN|;_O[ÿtq~׷N{8_.YIt%=Su?uWq-5.ҭKog엞_?ױ^YWNz5ܺ:⩺tv~7K .$K']:ީ3K֥¥g\zKwХji:uw՝_=_:å~uXu>ҽҫu\q~ۉhz{usqxc{/[WQn3?:['?_z5uso>']:@_zЉⰛCo~.ݺ#uݺ1G|XҭK7?!]unԹu}Տ<:7øtut[/+\/|t>7ҳ..Ћ܇μ>K}vSn/GXoҭKN߈wO#ov^on'_֭/՝I։w^Ñ.ա3ԩSwko=n<~oN?*u_:KOwN.}[)ҋco׹o>^ψKcG_.{o%3˸PfLv:up :e߳8>b|keԙW..ݾutY4.]qKՇK7*ww1?Kptҥ#G㖟̷ȫND<֝w/w~\z˥{}ӥw]q~҉K'0[|hƣ9Kԥc+Gpe?_R^t):q~7`K.]WKPg?oW<~ӥǑƣqwӡ8Kyijӥ{ҧË]unһ;⽽yĥ{8wk~tu:tХ+7Sw7]ENO|1}Ϫn)]z:+͘|[vOvul|;\.t]M8C'^']:toutҭKtҽ_ҳ.pKϳ:ao??~g({__?u_+ѹs/Cν ]n82W[;ƹ3{k^Fms/ຂs/c|-H~sGluܰ1s=>\I8cs/}8b?"z5߽]?m8Ýs/~+_t+tg8-: ]k/?ڿo=^O82^wN~%>|Sb>9s&{?ێ;o5_х?1_u7A8uux1Bpk~cz 7Cߞu~S'`]~/dz|N4{[z<[7qQ|~=نs_ù7k8ѱ&mo[Y3o8?t%k]oy}|p:7uq]_1߳_17:7||#~W8u^^u[3\O8ߘ}wLx͗ߘ|C?7|~gVq] I^x>~ͧ{ _\J^7߼ܟuwqWc0bx[?Pu8X? ru }oQtW=u36|w̗c>oy=羯gW\ù?f_<~9u؟0ga]{K's_Oycԙ/wד7߼>z~2ν d8uys |st~|ù1 |xgp~}/X{|#}˹>u3#s_]o85o.O?q˹{W| 羮'WvO}|ؿ{9vr.%cw8pOur¹>W㺟}¹^z9u=ұ?u=˹޹speT/?/7qùg;<ck>qk}Sc'?{szggyPn9ףq_ø{_M ̘ٯ~|c;5c>o8:OOGpS8yҩ߱ڟXνt+>_gg韽o;|n{X鿾g:z;_ k}6āpM?'k:'羿߄s/nG^p{}p@apԽr/0^ʼn/ɷٯ|/|֥ 7۝v7˺W\Z|{̧ 美x/s_߇oe3}| 美^]{]6XWp˹k/ G}b=}8W|pŹggz7c:~^O˰^8N~~˹:)[Gq˹nޘO}}{W?xnѭX/O;֏'o֯~m1}+B|Y^u;G'?"93b}>< -q=>?ħu`<";:p+0~-Għ^u$¹7Mo9z]{{=s_ɘ{Msx} X'7??b}o8u}׽Xߺ|˴V8>b>Z8н7='8:O|sq\:pq%ԁùo帞s_ؾo}ߦ51{~ƹ1~Q!'^{߫ƷN~Ո~xXons8}}߸뺏p{_.B77"]Qoo?_E77^3^s_6ùϟ|7~?s_θ>7ugpk=cgŹK:73~sדpx7upo|s_e{ǿspC8&cztoo{.KS8ѽ^?xN}ͧ# |4]{t¹+X?:u¹kn_ ;ӌ{oc=Z>Z/܌og_Wtp7:_t'd8/{wO8ޕxoKx!}]o󸿆s?ٿƣhgLֱ3_#sx}}?ǹΟ߅sp^8s_n^YW'{{2&ޙF<gp+PcScj|8v~5Oi|!:n5z!u¹woùe83b>Ow&>s>os~u}ާ#ᰌ<~3森6}uƷuc;f>!~>c7v];c4گXV]{,߻p+^G0oߺc׈z1&ԉoz{ķùqg<ڱ}-ۭÇs|R_FM~s߿q{=q1n8>ӵMY&=P|g~㺟V8ӵƭk8 >?ng|o x=|k^osqs_/~o}={p?s?G{ٍ{'ޛn0&: ON|#3~}}~;zf8}/{Kp} CZL-^pk}.6;⽳o67ùs_گ߼dp!3{/\N8oss_>||~q}N|_#~kďuFZޙ/t}ǥc'ߚbǕw3c|;㙏|t%Cn>ses_8O?cƣ93M|ߦ_e5r?{WWsƷqw7uw8uϿ.Ʒq||s|:7cމG_s_z/W|fL_>^uFqτs_W'c^on"Ntvď-s_׻!ENx{į+~݌Nn>8nG<| :t_˧/׵khï#;pkt3=Z]v۸u8ѱ3_8pĹAG]p%^o.zOt|O;c?Ʒ/W71_=:r87S_ٿw}}&cf<֟v|kg7OG߾羮ws_͆s_*]{w8p,o=;:.ķ/wƝ 瞾 羾}O|G}oM;WqeZ {t+<<&}?o{ùQW&>¹zs8xWb\Oɷ/'s/:8%^ɷ\}Oq1|mI>>Up+^P?|~ƹg%=}}/|<ףps/[oqŭg{I:]eқ=\ҥ7\.Ct.u ҥۯ\{եӼǏ/ セ9].Y/N%]zn>ÅҟΥ?K8_W\>K?\z0.Ung]W^uң?._ .}$]zԌ.}wKpǥO\&uO30u8ۉkC~oǾ.o>gDbo۝Zؿq5kT%҇u ytJ:\(:KNj\ԙoK҇ӥot#qĸ /N\#.Oot,gĥohnǹK|#Mt߸w;u~㳿U7U7S.Gw2/au֑Х[BN.=ݪ.Kť.}6>.ƣcoa\u뭺\qx\y/;]zc'Nƥ_tנ|>Kq8̫C_qc'OQK=\z_\z:K]_\(c`ɋk:qŇK7/-]uKncռSǑz >y}u.13~͸åtyץ׿\z:C҇urt鯮>]: n]tt^0r;q\<.~׺z3槟e%/tѸtootҥ{ǥҥZtoKn:\q']t=Kn]i]up?q\:_WשNupѺtѦK׵ҽ>ҳy50ۥKn{ť;yyץ{=ťҥׯKϺ 3]:0ώ:WcԥO@鷠Kxy~ץ{a|1&rԉuۤK|1O/g I>w'Ӹx\zhq|pcS7NR?~K:Sҥ:S~_ĥ3]:}q>}#>_K>K:{\z_ktJҍKEg8.]ץKϿGy.tU]>. yby\z{OKt׋t_>\z폭K7WnP]K^ڕygԑ3<;O^<]LgK ӥHnY\~ w;z)]åitqBaKu{t qbt/ytSWKOyUt?t`qMҥ7_әK.}p.]wKҩk.̋ӥǪKpt}vΜ<;oXה:ü#ӥq]ǣK?ӑctOK﾿t] ޳wһp~Ku:$\p]vҍKeҋn7r8Ǽ;Ǒ1+>;/nO]u[tuO!.Ku㩓yqqҥGKOGK?._;.].ϟ.]KY/%)]ќ/5.=4^NХo|}_EWN|źq}ե8tӥw9qKn9.tIuҍ7ҭӭKYn]\.=i,\#0u_խuHqyq8h\+]:ҥXNuta[]{u\stt.[nޛ.ݼt)ѥ{ĥGgדүӥϲ}],:vޭK=6:][ij;c\zӡ3ߥCjѭSwQ ]:[w~=yo8n|v;r\׳o5q=Х[Fn]2]ztmKqt8Wg|S|þN?CI|Oٝ?\z..>i \z.t<.:6éSթ#pٟ}/t޿u_n:yq:j^t.}ǥO?y{]:KOߌGsʉӥNNҋw?v8CG>u5|>yqq!\`.x.]z..܎N`>~~?]z۩oď҇NW>~ҭKwK?m:;?1t܏Iϫ.=|i6\ۭGpYUnq~K9G_|Ցw}qK٤KMGǥ>ԥ[ >]?ҳ..ݺIt*n~k[NuOcZgWv:c^_tҧT]K\vG|ҳ,.=ۥֹg?~_tq~c']t{q;}ҥyƥ|=u\ěct:t|ƥ/>cI~'։q޿q}ӹn(\,f|;+iG\o1Ʒ#;|Xu8.uo{{uLҭ<i_q¥Hҥ?SK.9mn'>uN>~ҭ+KN1ˑ.).}~;c\GnNs\z[Oǫu\tөm~֩ZN'nҧu uWK7.}TǧKt}ԕWҍѥ/]ry>]sDuok¥ԥ:fꐦ 3?1`L~}cEgN>8ۋu:ǥ]z_ߎD>uSwϟK_͘|f^?^7ҭۧKQS6K|եeO}}حc'<_Ŀu_>>.=c\z+S'N߮-t|p?tGKK>}ҥyK7>Kҙ~<\Qq҉7.҇^>.qå].~tKoK1.sIåÕ_W뮦cğMGN?f<}NzNsnTnTGxp~q gK..}گ>GKݺn8t;[']uďK{=ֻtPKqҭK.vqn.uǥ&E>CɇnXåb|p~8޺[K/ڿ7/'./_s|uZpҥ['F}N~Cבu7u=ֿ8|n\w].|t5WGxo}~{N~tcoץS'k>on~.|tKەğӥO|ҧu]w.}oK?py=ƥ+]up K.۸>tոYTN<:XG:hO3MNxkx.l\tԱեOҥ_?]:uӥ{ҥۡ?NN|9]k0o?3.=|ҍGK}tө7\|KvCǮ#¥[.]ut['^ty?/?ߞ{Vt^k:59֥socytһ|q֛qt.Pt: ƥGtgCo1~>NiNJ^ώKׁ_t1ƥLcχ.nKuø ߫S{~]zw9rLS7nPxNҡ:tx҉qcp½ut␺tEt&unj^}>yq^t5.}=nG^#sq9]._N~ǥӥ[J>ǿڏ<:7߲ygL ;|.=].}+_uQpS']z\_u]7^wv~olwm !"-!=]Yv_7XKz}|Q1S7o5y\Kסo-Й}YHNK:+X3o/O]z9Kq$_>8utҥ_:p_7'/}6>Kf^m6.}/y_t<+_toNnpl\zOeKKs'['Y:sAwKkrO9.]z..q@楳?\satM7?3O&NSu[QXX/:8p/.}8Fեguƥ_Y[qtyK/:uu:I|һyu[q0>t]5.ϣҗn}w_85}np;u8?uQ.#/N/Ottt#ӥ?tߝKNGc_ϧyC~E߲݃:]Kd^c^xN3.I_y|StBӥ<;k$v|t[ {IwN]םyu鸤tˑ^Xӧ?.>t~ӥ7^ۥK/2/9Iۥsҝ.#ۥ:uԱu_t.|XX:q8Kwn.s8SwޙX\/\7t鏯ezѭg']"tJ^C︛-\_H5}WoK;>\G>>.}b^}W]uХ۷K7rWrޟ<ӥ?e^} |K7SۧOޞ|.<ҙ×.]Kw.=xtåO>.|O\z҇s¥.}קK{;9Cwo:s~1W)c> v:u9n>K/rǥKg~著N>z楓GK7 κt(.}q=.=3/=uG/Un֥ù߹?:뷷7Kҙ[.ݾ;]y#t7KԚ}~qzoҪS֡q܃ay7g.ùg^zաOo>@d^zH]{9ǕײϷ.}tkxt9>uQo{NKK<;/}s7kץGKҩ} ӥ/زK.ZXS?tCǥqcmW^b{uo/gt.ݾf\zb]W]圃y7u|sڣk-]zͼk^N}[ltq~år䥓.}ؗK_mto9saK7zo:t슮<3/f{o֣N1¥oq˵4y2nǥWt|5]P^pַQ>ץNLuG x2Of&O&u.}eWO}и1x}җsp{y2Kå?:m..}W.|pb׍Kc^zutTݹs\+k殒'^͇OWU]yE~ҝSK_G~Kw.}9_֏]~wۋǥӧy鞟t~t.;sr}sC.'>.9jp7G?sϼtpre^z_wm^q:]z#/V\zNK]z#Ϝt?K/۩3.}W]z:vpүӥ].}ru\|t陏Wutv^zuMLWu̅m:ust{=^w#ӱL+֥[/ѥz5/}=?ҝÅK_z.Ϻb>.o|\9x͗եt;KqW5ҥ2K|c^n֣3ݹ:uׯKe^z|3ǥĶKrW]o^X2?.lNys➏Kw.yyn=u/^?ou㏿g.,{W85}õ}5sM?{̙3 vp?>.K>ԥKzF]z}__ust3OG~Mv˹k.?;yS\Ӫ+gǥ/guF\W\y׋.ON^zE.=ߧ\,]z3<]:\ou]}t+N:srǢn^/qkk/Wַuԣ{\z/IkJ>9.åL\;'/ٷ^^tK7XN~y7\z^W<ퟸ>a7K#\۩x{GO^s;uv|;ۉw69LJ=ʾ;uϓsW;k~.<ӥ wU.]WK7]O;ԑw>_|ѥ;S=]sKu~>)뽟ܚsHkǏN6:ӥ;NC^y|tk湇μu;>m^to㢛|گ=En=n9p[>KwNy8-]*p.註.pe^sWv^v屿KCGG]ǥg~=yumS?ޞ9q}K^ץ?:e]z5?N.}C.=7:N[u:t.ÁԥO.}tCַu/u|Q\zɥJ~w.}y.#/fM4yc5/^qt޸k;tsK>]z:\]z.=oK'}֏?to?]zӡ?9'sSuԷ;apĸb9yݼsONyO]0Z]g'';]ԡ3wfXױSVtbM5yoEn.~]z:❗~>]:ur ߇N|\1:bǥ{.}2g]>ɚ|t>K rp8sZc:v'tt~I8Wzm3G`Y?䥛sKХ;O}П鷮rҷ ַK_nu<ɚ[gq鏾u589>;֥#쏎.~š9LK.=3/å{>ǥK3tK_>>Y K>?Qu.ktK_.2o=\zb\^zCқ|\iY_>u]ҝ;KO]|K_\ʼ.溦K_p֋ҥwtU.}ꔫx=.9N^Coܳ;]Yۿ]X?׃I=sRq޷Kwqޞݮk^攥Sߓ~̭[܎ǥSӥ_tE{=K=]/:k:uy{\st#K_e֡8ӥ3/ѝ_q~ҥ.ütϗtץ?ۡ;'u^#o:sCtҽӥ{EtҝK/ǥŜ]:K<_ϥ>pn`8$\sҥ/cdz{ͻѕS DžKssCNr=L^owty{u}F]b_թ8ѷKvttCKo1]a]Ss['y{yҽJ>}u*,c_ ұSx{KgpKױ͏֥7yNSOuU}}s.B)[ObxKwN]/\ptҥs.KG̿.Kg#׻.1<\(jzqƸt߿#s"~祧c&/w}9nίoM>yxuk{T]p.c]7\6]μ3WwԙwݟKN]w:o/\.W.ݹ:N}utK9Mg~=wt5y}t3ϼZ׈ѥ.o#t5q]:ytu:Y]s-tyΝҥ]eyܙ^u|ǝK/:ut7˼tZs..>too&t\ӷwΙ?G^{_׷MKow\z_I<өSwNtE7NnPbuչWyץ/ƫ;W^xq9wK>ooۋc]ߏp;Nt#cҫy|AoW{.=åϏt:ө/tۋ9'AESK<>3ǹw:x>}1gBμtAK~K.=^ot|;ۥvμ~;3_¢k_} ]9nGKIy)^W{W ?.]WKKG쳻uE.}KқJG~^ep~\3Хg7.>]cwҩ۷Y7tDKi?Stp<g߽.ݼ ̣ϼCOK=SA]}%zK7? t&tK:}wqk^zVyӡguw\?ngKuҫ>;'y{=vEwnǥo.}xǥgKoy2߼̷_Y.} _˾t>u\ώ> ]9kpչ}KOi^.}їKwtyzt|of=:u>tg2?z>y䙗t>jq>0]۵~ʚ6ngx{>@ӽ}ӥ}{Ko>S,>ѧy3/0.t.cKoۙOC:yΜt>_ߒ4{ե_:j\:ӥ[W|qMY>J\z:]y[tȷKtqKO}̭7g^tK敓p6/a}sޕy{K۱ߓo7]zyui ݺ}KO,]?.>ygn.2~G33ώggwةvƥ֥{~7/Kו3}ov9nxt陿}K{}v:uU}ǺG)]:˧K_g\t5y2]N^?uqy/]XwCK׷.wW֥wt.'/}钶K'_~ֹ<_Q]M2?<.^K7OQn^.9ۥ7.yOnߞåKwΈy̼ty\\0?Vx/Ƿ$y:uq㹭Gu;/=&u3W6үʙ]xxn83~yWå?>3tH>u[Y5y2}ȼ̧__әS̒g9SNycõWgWљN 9]:NG.}NVK3.ҋk}\_һ{vq|sMkxK7^S>t]]Kw^:O^\?\:ytӥ;GNw.]gN}GKKwn.ݾt-]ݯϜ#/}ԩ}CΜԥ;ώa^v]zqAv~:¥ԥ/Ct8r^9ҹtn[0/׿y֗u阫xt~}v_K_u;sƥ_<>.ݹrtrG?]#EKou\zש?ӥ.ݹƸtGz~f8^;ۼtrҥr;{>.}C/\w-ftqya\6nzǃK>W?.91t{tM>̫.yKW^XwָSq.:u۹Gg^>{9W}eXe'}Y?.:sqKwKK6ݝ:uq%U:̅-:ǃ.}9\Lt 3/~d&/}\һ3uoQ>.~t]ojtKukK<]z1o<]z3]:9]tuv\tE7ݬ:srk\}ttGK_ַqe?p;t䞑/N^:/K7~k\|w*gbM=_ױۥ+^>u-Mn7sK_ޟEJ/å[_ѥ9ܳ\e^zϜqrjiӍ_ЩϘJwq.lסS:uq癗3.ݹK_5]zׅWӥҥ3W6]zk\҅7}R֕qmF~;.}/~+F^7y:9\ZҝKw.NwߚUvK]z?Kץo<ԣq~q|K^|>pc积ܧsay|gdݏzzk^+i?\:ϲ~p\ӥϼtӥ]uIХ?:jvbst䞑s'O<]z:sKC'.=7楯&lΩG\G_#/{vn99Փ>~+tG/o:9[֩Gw:|.}^>~̟ٿ}>|\sBK{;C|K#.G^Сҭe^zfw~Nߓ>uvS?st;.=җs@t7߼t?ۥO?BnQt"һn:oǥ} ]st}w㾗>tԣ{y:u;yN^\;ǵ1a߮WܞgC}?:3;czM/ָ¥w79GNXө?\z5<]zu͜١C',lg珼Vw]3w5;ۥuԷ/cק.ݹ;/==O77XS~?_?__Vrk:z_o_G?OvB7"ߎ_*?_¿O^޺vp_pO8C ^n^?Ĺ }:%s/U\rms/MޟW7(M˵5Nu s/<~ν.u|pν:F^yKӍq||ν޿{,|¹ץ .>{{܋%uR/büW8tOo/s/u˼pzq<s'pE's/AKν;<ν{ w:R ν\z:w{5ʭ^_s/e'acŹWtAi:pùS^{s/Eνs/t+G>P][ν>=u=x=O{cb{ݿ}=gyk/8L5?{;ν s/̯-νLK{,܋.4{ u4{uJ8^%{yܣ|}}C^2={uK8qȯs^~ؿҭGcs/΍s>^7_]_=]M^K^t8RWw{ ^v۱޿| ?źx#/~>X_q/ﱘs/Eg}Wνsùt/{Źbu8.:rù|Kб_On/s/وcW8ﱝ kzq={8zfz4swץ{_kӹǫt8r_ׇs/]gν8'({={?~q|q¹w8w7ϸwûbC }8}/^s/M'νdr( sp.ν{1>{_q}g¹~pi8Q8ppW\.]{z:܆p58K3<{+98Wol^@_=?|ZW\:LǿνT]w^q\' ν۽cݮ/o:ю;A\WwB=5{]^2?={̏^<ףޯz>?Kzs;t5O^-}'=>Эنs.=?w:b={:pEwsν0t|pչh: 8ν<:;g~ νss/Q-[w-ùùe+^t8w  :':?[ƹn {,:pzzgq}Zu%Oӽ?끋}/WνTv*y_=KyO|?Q؟}u8?{qnν4-O?z<׹^Gsν~g]8|܋y8bT838θp>U{i>}8۽/s/]GzG{/qž^{s~sKwҽ8¹ Q8}'}F;K\={ַts/E {qK8G֣>֗߈~Xf.B8w98?svo=vKk} {o-Wo[(x.ַkWuwamkczpꬫoqE'=8s~vW\ws|>f:zYy^WyB^ >׳uSu%s{\O%s/ۅsUx܋. ~Fمs_sK׀s/[zνd>s νt>oqys~s9 ^no2p|e=u5y<¹g8?Ks/;ν`¹O8޸-{qX_+usx>s^O8-}t9!ܫ}:S3N^u8玾Gѹg}py~羯¹Y:¹s/ν4pszU8}}s/~p{3Ozs^s7{~?ù_ܳD8\{|<Nqp܋sùgνng}qCp{='ܳ_ܾ)[??w kǹpSYS/W8}!;rmùMpu9g.~<¹Gޯ~~\/ >އstԏqW6p53u5;{ֳ¹88{{i曇s/ǹ+[?v Whg~/a=zν.q%b{qn$ν9{7w^<ߎe=:/"{^o,ν8)<w瞟8<܋Oe6:R[oqz^n=뽷quXSƥ_?m8b{q97{Úc.@8\pNz~|~N^_ͬmR}|¹Y{|ps/pnν874{ ܳP^N~E}s8~ ͚~*~f{y=)sv\ss/sۇ~8˽9k/q{7ک㢛psEnν¹?s=8ܫWs˹ߵnĿ\ӿ~ϸ]8YSx?GG~<{^js߯_{>s{CN}㟱?d܋spŹm8Wֹ_Q>O~ùs/76{^oח~|묫֩oùs>s/\`8E^.>V{z{}ܳG׹Fn?= u:֣ND=ѽ7G:~ʚmvsqM?x死?דFߥ3s`m<ߌsz@^s^s/9 {aN.=u9:wo 3O__N~Ǐsӹ[ѹ/sI{i>{۽跾t w8=q۩o_:~<> s9pK3_~98ߣ~3У9tgzk5K:'On=9{16{unq{O]Wƹƚ1s GN}{~d{5~ 'OܳR^t85ۮ/S&k AHg~ur8sIǹg]ssqKpʚzc~þ^{ls/΅ s/M'νkN~kz5ίzo?po=BNuq}еq)t].2>;}..Ka[}sMq|_/'};*׋ttg_rѥ?.[rmwN:Iܿp}Oť^җ>8\|4yѩ77;;Ntҷѥwt/z)>:uǥNdKg^]n8sS׈|MOsǢK7OWӥ[b;_;/|t:W]e[g8鳻uzy*ԩC-n6:uqץ9ۥg;Õ|_O7Kg$.^YXS'ytouoo{N ҳΒ.ݼl]Kt<~tW\҇rpvi_ν3S^sw5uܙ+0t䳇K[~.WqD] ~Ys|5{t) uON^un;kƥש==t{M7}K=WE>tM7O6}}a?uo|Ksltwåc_QAt@toex=.ye_Z_Ϲ x|\z|p3ӥW܂||қNro}\:]3ޅKϺB?voF`?L!zN9]:,]z/MO3.ݹ%yt]9}kKu9O^WGz!tݸk;^aK?~K7ߛuӥ_/.zܬ[Kϧn^.}}vs;.>*׋yٸ9#'a_/9åoJue\zֹ_//xb.ݼp9guwe\?Xύb>.8p-t:_ϾA]z/RGoٷwK'ϛtve:}v֟~nni}{v\z5.} EsAqn֥7c`͑^̏ t_Ϭ2w`u`t_ϾpPnpaMݭcǥ?ng_ָyK>O 2+d#Og:FkMHn.ݼå_]D ^֙zvdm<]Ú>8߇KϹK3Wҏ=ѕ[?6OR^{֥߭KCS/I] G]:\z#p9t3.f\46kҥqm;O ^-8w\wѹnz uK/Z&OZKҫN5:qs\oww\avk*;N9;/\oVMԷǥ?Fztޏ[o.1޹#8uo^.9So?v:j]s)_ Kz_޾ѦK7?Xx3D=z_.'sVяkyKw΅.GqzYtMgݲvv/9snݹx>_OFz:L]q3=>qeu:[>t.^cxqOc}/ݹㇵ}v5\S/oK_oOo5sWϝҶkO|wDzo{E9GzupKԷ:˳z?ҥrё㊫msuvK>NCz^ss8mu5eޛy}qyԥ틫uK‰{˙K9=@ΜM\~.5sWy<o|tnqN*z3сo;J|%:8ߒ^~tɚ©C.}_&=ϿSOLwuͻ$ݾ\z..}kOK'O~{qM7O{ӹW~Yno///]sE;tlNئN9#.}:w`Y߾ޣ>K4\z#KzkW~.=9Ny{ǸjKv֙k:\]ҹ_q|<˹k\y䯧ӥ/~]3?zQY\7:vV:/\zڤKϼs.[_MtL #tַkҶSǥ֣qwԣK:z3wqCwc~#]åةstӡS?uwmݺ7Y?q},\z]|ܳ{8f]z՝NnW9\z悤K6wkw}׳zd}q50GusVҥ3*]z̖?\:3/:;]z:Swjriם;p9*]z/e}N\Gk K'߼ZϏgg. s*k琺ݹ59`{98+w\K/ߎ\|oԡO<[ЙS?tԷK.~ny=&_0X#]z7>|K7?U^s0J>0W Koҧn?"<>^9wR'wk;uёKzu;ҥۍuoItᔫms\3_~59eҡ_?.趛st:s:sovCեs=KSKש_G?Ho#umao^+΅ׇ.ۯϿdNŚ<9[ף:u[K :qGԏץS7=>6֥u5輽bƥ_OgNnDza.^t/ҳ.pt])GKϼ#ONy|ӵu?_/v陯N};η3Y| /\{Щkw5.=9`<0^tm^O+s*EΜv¥_KN.MtHtrDĥߧ+k{\KOO.ݹ tp];p魐pt>tt꣸~KKw.ҟKϥt.ݣNbyҥ.k;y<]F橓o{υեsyҷԥnu?9Gy陟s'}Y'ӝߜWu1/]?͓ԥiu楷^<\z~yݖ.]f^znClkқy=kyn|һۭ|t麕p>.};q#QG.~XK.O2_8\p9Nh].Zu櫇Kϱ#/}o]qy{:t|߭C7/鞛}lv^kn~>K>'\zAye_gz]#/=\PCKU^+Oҏu OvUWnbMKågZt;um;t>+nǹw;o܋y>.=uܺΜ-vs{'B~-;}q<]sSK`^vӥ㪫n~.=]Ot5ON^ם_34/=3/=O]ytӥԩkۻ]d^s`tΡХ_>~y2kݹݵy7:t^twf"sgӎ7]z͗5/=gtwn# Б?ztso1tIuK|}mS>>tv! .ϼtͥKNN^yu5=¥7k]7C{gܑkO}EuSs_\3wK?ۛKם4G^:o)ɓ:t]͚:ſA:}й߮#_:vZnI}}=KW O>u!NCaM N]۝_ɺhp8ϹtsL]:ҥ{~ӥ?=y鏎r͓ѭoKg^|H\zϼtȇ'/Kw\z:t~ޚg.҇k]zaMɓ:u?!2u_̼Ku/ҧ?ye[}2?'yxy2.ܟɓyåζ:Kt9Iӥ/.ͧYܾ֙>uɸKG\N.C.% ]'k/;}.}+ԥg{߮~g8+'?|&O&9}{piKWn߸.=t']z׵:u楧#'s6O.}/nOܼx}~o7tԏދ+3OFg^NեO>.|p۱KG5y5}{W.}py}yү}{ܧ}N9%C׭[~Xw.}tg^qvy\pɻϼ-v>:sK˹tKoޞzҡfy:t#oQ?ŅK7]koϵyVOsK¥ןuny6}^Y%/zףۥXuӹ{#yntP;G:t'Sťg_ӑדtЩ;'w}.};Nҩ'N\Xy}쎼vq'OtԣKougm=濤co}܇2odI^9H楛.鳋ۥ?>/G}{G8񑷎Kg..pw.Ot=~K7msKϹ^3̧!>E2/zܼt?t_K7_9kv|^K߮Vt].ݹmҳ0l^u5SgN=.??ۭu W?n.oXSNN=֩oWӱr-{t= -NhhoOwK'^^>.楛ַmtߥ[_qK^yo~\yGg38xKﮩGtϷsjtt~u)>]z\_ti=:/tny5}{~4/9JX]/_x.ݹtҥ&_?R}|sHN2?!]:sn鷞g?_yU|7ҩ3/NNyK|3K<.]]sV楷K.}K|XS}\:.']h|#/.K!ݹ:s|<ɼtiGoWV[5^4f\WN}_hݹ}xrM^zѡG~̜~peۥ_:su8r|?\zg=6].Y~҇|fw޳yU9M~K:mrU1/ҥz3/9 VåN0Y/t׏K/:N3\åWvwn?xeMҩo]>.o|ՙS_:t=g^zޞya72\^ve:Ωo_s/ԣxHo#oNp돼atҧ__tם}n'g+#-ȼtϟ냋:|b5eg^#'/9 3G"]s#t]7<>f?xѝS98^u?Im~̍J>tӥC;wBV}l^zus_:+;i~X&o|:mgDx#\S|6k?{^J:r~ӥ_zYCҩӯ6]׾tOt~/ϼt_{=K/;Xo.p{Ύyu^WǜU\z?K_;u7琾_?>O3/=.#/=8.t]]2/NR=upG^ QxSgҩVu腺͚޴֩s;uvw]Yn"\zJ^p]tN3X':u_qҙ~Н[M=ң+g>^ѡ'SXknvҳ/+]:22~ ]&\[Y[XNxv^:?/3.۟㼙.tްo9䥛wh^Zc0s^cotOǨ:}wқy޸tae^:uK>yYw9qMN>{sCc{ӭs|8f~8>tqҗu /߼t}qkҟys\zoK<@nst/qߙ>p~2/=܇<ΏҳΙ.Q|w}Zt;Z':v.EwN]|me<@:9D>?ҙO.G^vݿn@vuݥ3בOۏõKwNyk]z:νqkw_IkoO1l_ttm"^Ow;k?^ݹY7D$]}vy|N^uOI>.}O?;ߺŚ_>}q;}u~ףkyWt>nt|sw楳tїS$wu\:uåg]1]:tηץ׏KyҳK;]u'~.m9wR]s|_]s3O=o/teF!"Y}qak>-\z5?ltq5K)\z~?ƥҭf^zunԹ:t'SS9)QO/ؖn>;qtCL^^yW>.}]u8jK8Bҗy۸ttn^NmvkK?.Kť?:[۫:t_.]'a^3/=9>\vwMy6.ݾ^?.6>E0pOJԥw]/._twt:]z>~3d}ӱ~~~4/ݾp??gKr/m)V]ޞzo3'5pYȼtO;/=9+ӥKz9.>ԩ'.=NxC7O_=Х ~?kwtuüw\:snpoN|åo7.}߿kɚvZdsIz/N?\p;.GC7O.֣μCTft*K^m|\}W~|Wɓ!~}\{ӱS/Ǎ_Q~3o\1/2|9saTn>.=w۷W{=^9Mgyчl^¥g=(]sgt㝗q|yu$ϼKN}N<^t<z;枦Kw.}~HΜ1.gw&/=^͓5/r}Kotgtѥ'{w9t5mksNuԷqWԏ./yѩϼ7]pkoM^wp٧}bιNtoS3/>p{.]1`dx}o֑9ɼ:p>E(Kt)Kt䱯tႋxKw.9o[qnvyKqQM^w9yottS>.>t闷9]N}gGe9c7O^y;/=w7uqc_wKyݚ~mn^Gn.~SXS:qKHS>u;ǥ0Ķi:tV_usםS//:u>:~Mܫg!u5_%ݹ.]wN};lx gܜkZ]_qo:C?nҥʩoKO=Q3\{Y.ā9'׽Õ3'ǧg`M y>c3{5Х;eבː.}¼tߟHscq#ǙN^sir;cGnAt_3]S']z]_sz9y%d:kӵ~+~뮫GsHz{4U7o//]ҧƥ0\ۇkבӭ_ѭS߮S$_sϷŚq"/4[?.].>\S]zKǍK/K|tsFcq|8Yqko!e~N#J~|֩㜋rsMq|Cgjѱ?tvw͚zCiԩ⠛sWKK˼tpL>}(\skǥмt;wӼyd^p{...K'4]zD=ZGK>.|)7:sR3_GzZq<9I;Qn=An}G^|~LJ_S'C~|:v'/}ϭ2/ݹzbt;.}_tq<}>..mKm3O2+5Kסo=蚗A]5/}:_=.|t#}֩=y|K|?S}Cg)?tߏ}hxsWgKgNY3kedM=+lK\rq]Xkq\;7/;O^zF#Pt銛sWùҗ߬.=]9Ux.Z_8җF.{zƜRtp?.+yt9NҭܙoN:.G[gޘ;<>CKt+ۧ¥O#/Z?.=#2C}]N=ϜK]c.96=WͿ5/]KwDzop-.6/[]z /]psR[7pqKsM:ksʼtKk^z_\:·K>ٿSgN*<ҧ>K:Ksy:uRgtgys|O2w!뽙N}{9.ѝu']fM=Ku\ȇN7/9 n'޲fMY<_楓cr䥓yy\:~Kw.yo#/]>zֵtҗspǧ7y鏮ܳS^x?ҧcy:sx yu91yCyp{vKNNY=\zΑ;åGq~ҥWo?~.}K.9$[kWt/r9n^Gwn:NKKo;o}1Iw^Õg~:<~G^:ޙ^>.yK;ѯǥSLy^GnBttK>߾K<KKK/ַɷ:tԷ3~p,’go_7kΜ~[Ϲt~ʼ9α e^zw\s¥"q<͹ҩgK~kqҧk1ļev.==E6ly{??~u]ѹW2- _e/| ?ވX/G?^7_oωk%Hަy؎+}!Aspݟo<^͛'5soUν6*qUscwܑ^u8v}ݺp毷fy8KW]ν^c ޾5*yp:j~'ν.3νQW<[s○so۫_G~>ù78q|Q{cN:7o_5pM]k;oun^bMkM뭘~a|¹Col~sp1νv^9+}:Ź̛^uo/չk]Gzw[۟p=ùTֿ:DsD8cIu{+;o.{ù>soż_k ^u}8%]|8?O¹n\pŹn{8z|{itu_{~so퓿p^k8ƺ^y5cg׹vيgpg   t VW1y}nuߗgyxܿ}sg6<}r_W`Lcq<每KgF5sO_ǹ=]\qޯ8k[}=x>w_`71?ynn]_>\pڹO6}ǹtG}u#k{?n]:7}:=0}?o}n:88}\t܇W/'}sQ<>Ǯ./g8qU%}㧏+Jsw9̟o 8>os_7sSsw>Gqu=sg: q'}>>Ź#}u p >݌73>S8Y_:qqk.a~Ge8Odvm|{|׿p[_8/Ís_׹^ 0o׹NЕƹ[qþi׭'|'c>40"ν_:qo:=O?Gכ>׵yu̓¹;7_0 >u?9_׾eo^ǾV>}!O}F܇yo8c#}s>81܇q_8aNN|Pss30_~ܽ~1}DzraC{qݟ| wU? Љ_G{~lV{3uþH #'mùun@>~Ź7o{8w:w8zzoSne}Տh2^eu/ptqCLJs_槑>~߻OnSǑq槧ϟ8aϤNzo鰩}vs{8a3Γ>$O{'_LJsw~mwySouԷq_ԇ;8u7܇y>q~3S7u͛ܽĹdL}9^| >Mw7q4O>}LcS=}գv3KN=Kw'뽗zе_w]/GoI}sC3Ge^ƻNc[6}sup]vקn} u>~܇N-ν1:!ϯ8"}L?NU܇WwکGzCt_yq7}z>&}ygE_>:ù[oùϏ}׹{Kn^#}t~8ΣNx^d{8^+78aԭ?:{X/oP;o}\:pc'1>کoOLxЍܧ또>SĹsGzĹo棒><܇y8>:xS>2Ow͘{/}\p~qsen}S>.Xߞ:xܾGMs_ !=:Lin qv1~֏q_햧CN=ǹ{羮Gs6}ukt{q ƹCsq8989OsnX Csk׽ezq瘿>?ޛ'}n'}}n{7gẄqUo:z͘Sp[o_~eޟOuWܻ~muu.꽮pu7'׹Isq_?l>ϐOl=b8zt|S?ǹw'}u7ܧŹKdN}t9{ܻމs~ŹG|קyq1fc}{ӵ7pO{SҹM;LJs>u'>'}qzp>8?֣?Ozqw?s75q ~ t{__s_oc|ϭo/KO?νAq81.m=zs;ָ8:2q_s_ǻ3v>s_͸8׽emk^>ߟ-o[S~W gøatN>!}q_w'<{S_Y>Yuatǹ'ԏ;oy}>~p^/_G;zy糳ͱ㩗n}??8h5Hws_Gq/ܽs_s_1SǾ}6?:5?9ܭO>G 7ێzuƹAxǹs_b<3ߍ͍4y_]}ܽ1}߭?8?s|s7߇qG{soqٟ'ey{?_wٿ}ޯǹw=8oŹ{xqҽَ?_]>:~ܻ~swsy=;_{mǹ0}r?Mwhg@p8?c ׭d `Y/ѱӿup}ܹŹ.zq}美b|Posrug_:qzue[ޛn=~>p_~N{"z!}ͧN?siԭԷqҩӿ=8ߧs_8~|}sǹ^=ùD]`.=Nҋ1.}q|]\7$䅧OyfSYw߷Ku!J#鳋^>S'_oKߴK7.tYwNЕo_tS}cKg1q##ĥO+.}.i^gമq;ǹ_n >._tuüP]:} v|ttou'.ױХtq:\u"],f҇x1t!r~{ҟ複};3iڥvgܺŘ:vq޸v}{5Ot\KuS~rP~~\z.yA>7Kg}v\wK/>Ϻ/~t]:J;uǥ_~n qNc`W #ڡ_KqͺSnc_{]歏8q}IW>qާեO.]Kt>._ّ.t||K:O]7K|~}vGGa.>ĥz|ۏ\qE2.ݾF]NeݭCqЯl>qu5ۥN:(/7K|klu {.=nws]i:.3i79yq=ťĥ/8~>wwt\=.ک˺us3ϻ+~\K~]M^n`sEAVto/ۥ_9ǥS7ӥkť"ڥ:ɦ3Nu/qy~ώK|\:/NW#/Iu/.}n?uv7y|_.)Kt{Ku:wXx|?}ıqKKw}O]..}uqo~|\yʸ.}|KJg>Et[;up[ҷ+.} Kߨ+7q.(]z!.}u ҷW\>.}_yKӧ:Ia{\z޺ ҥK/BХptݸץ.uҥ[wj#¥w".2pK;ƕutҭ\;?ucsۻu=s\:n_;.}KoKut\Oyqe{\.}KoK\o||]rnOKs]/n>.'/} XN}ɫK+qKӥzooו>XG;?.}q:N]}xt].ЁOv\4En_.?t.>A\]W֥tKӥw}\}p)o]{wȟ?_ ..}ط1ԡYנ]uΟۥ]z.uOt݇K>F]҇U^_v}Yԩϸ֩K$\,cǥߩK7]yX|v8i<7]}q͓ӥ__qss ]wF>ͫ.]K7OJ?\zǥ[>.=7{|C{Kt]>̃ӥ~9>3ukS~\zx\K~gvt]Q:4KK7S毷KХ[? ۥםOw<S[K^:tyqХϓ;..}wlj硳>\w_ҥSԥ7K7.}tq~KOD>|\] .v2a-.>]8\GOS\z;&\z;^]e~u[֍u]JFn.3p+.}:ϝ+]|:Nf|e[uM3ĥХߜ?uďK+/>y{Oҧy{َ:}|N\zãKwץCCLi3ťSѥߏKOI>K".}?O|KoKS?߮C^>|gCC\z{>Kyݸayҙ[֡?^~MǸa~8.ҧڹڟs>֥Smu:ҧyΜuWKһ^Ko'KK\8}=OwMW:K|t^sqzt]zߎK8ץn_.}nu`tҿ>uk׭玻O]:=t}xn:9<:9]u^t'^7J:tAvKWN:.|?;.ҝoyЙOKSﵞKVϧoӥpoե!K?.}vytG/9{KoKO/ץ^:uC\zKґGyGw~NСK.?Ϗ|^tts{_o5t[ƙo>[wԓ1[ѧcy^?]"]z{KѥOױԥ{=KCtץt|tХߜt|ۥuR90O\zKzq׸t?dtҝҭ/e?C?-:kǥ?ԥ{K{Z\9*ҽKבOե}եӟK7oS}Mp]1a7<ߞ:v+߾FK..~|]z;*]:5]]4uwۥkwҼҩ_KuqץCtOYA. .}g|ϯKCǝzv.;.}ǥzt\][>;}wحG}S6t].ҹեvu{|\: \:෎m=owv_n?LҝGq>ĥ{F>;{~1.}ӡqθެsqCtۇrp=өקKEtaѥK]*'9Y_å_;/\^1_zX|g]v_p1]ҽ_qYg>?‘O]ͺ t׽ѥ;ԥv陏҇ymݺ]~}:ug֥ҏҭ+KgKuOc$88cN:|~'ۥK暑l_>.Kǭ?!N:urLԭMtKיlS|0ƥ۩lq麆ץKvKu> nR>.wٵK_/$8ͯK/~x,\dp~9skn"yӺuK?u;t[γ>q1y2<:pL݅vN~w9w^:z{|t5K^7I..(.].|v.:{oxxyz>7_nץg}_>:4|KߗwK?#1u o\KǵKש];.tK7_>!x|z}A9}q䝷KP~qNuKg=v~_Kt:]㸨LߦC|}]z;_uwWy8o\:uK}}vN~\:F>o֥?y>ԭ8>[g=j~~^2_=Y'>{\zu·pko/\o?]7K?t9cǷKW>Erå{_]:uU]zK'nX>[K#ҧyίKS\}睗NN\zK7;¥n}>曻ơcKtq;_0나}>q6/}u~oc̯K?9~>t{~\.C^o>.\zA5/x]9}#KUwopͺ^'>u:?y=}_3֥[Gnn_/.<ߛo;tKw?oy2-EOt;}8者i^k/_Wǥ..uuե>K7?Kgqn9ݎ'ng0?R57>@Su):}ץgo:sS3:u{;yK싻ӷ;|oǥ?:i}.}8=>\q_Ky.p:8]G>uq|}l[NƏK?o~|~{~Kq靏N]K]]zpg|.vۼ~t]..}y¥;_Х{\}S~3>uuDt*qGKםҽt\{v䫔>Ko]N_\.uA.}'^:u8rӛy߭SwU89^{_]uC0.쾸1}{_{gwt#.}o.aL߻kt^yd.ut:]:}u[.ZJgчC_gt;/q;hg~K׍[jNPtuqi]s]GNKґ>?.<.]e<.uf^٭wyKc^Jκ͝'q}{MN_C6]9>:t5O=]On^.]WKc^K>t^Ǽp{G~\wԡS%{/:>~cȳ:o^z>楛ϋKrv|t.spz9N>E:/uFpa]y=p K_ԟ+pT?.} ?:d|}}ҥw:y?޼'C]zޛWt]..]WK7X1o:~?_ǣK y驗||:FNw˥g?}K7RN.}.}<]pzZ߮e_awKו]GM:MqwZ.Ga~\.9y-G:&r|;/]Ko?OiK_.>E>O{¥w=MM#1}v|>.O9.}ǥ?Go] һǥcOb^W)>:u]7K9O7y}?ڥ[ХO?]w7_^S曏Kǿ\z׾[:sN[tǬJ~ẫ0Ou]_ҥ?qct|yzzuu^c?._|ͺLy6ף~S>.y:tN';/|.}k^:!K H]zu^t?wCηu;ב;>q)u۹5/z .o߼vKo~y8[:u{uO}}z.߫ץSǥ:;?tmեyCK>xׅuoOƘuR:Ը9tߙϼ.vۥ?=o:9`ҭיt楻N/.{ 2?Kwݍץ?^g>KwݛK'.fcgtѥҝ}֥_oϯKu.t7+\z_^>uvqVy鮫K_].ҡo3]_t/_?\늾.}=owzS_t.}\v8S?:.nQoOsK;6l2v׍</:tO9LJo>g>.xv9~꽻Sn?swo]:sIeY~x|ץ4l8#tqd3tyy;ǥ'O /-]wui:򸢏KwL}'/~v:<]2/ݼJ9t^>tøtrڥK7uWuoO=q+ߌGsww.}:{twOK7_un?v;ޡcǥoo~Zү߼tlnީ.q_uޏץqtݱ.z'/=w]zq'v>o}[>7cXKv酋9ܸuۥ߯c<9ХÎK/].5ҹ.utӿGwQS|twǬkzt]ynu:l߯cgy鷮Щ+.a}ts\u#]?'Kکo:zq黮ޏ>v/iޟ=y#:G|dWǥvʛя_#Kg^8y=o=۝N>>N.}n.ݼhҷ߼9ҽyy|.=ץ?sIe۱;?oCG?:dzN[~\|˱.]:toN~]`Kw]G]g:rNS~u?og~c^qTۥov۷u\Μrf|73\Kutڥw>|sL|q)g?.}0.O;_ĥy]{Ϻ.ϙ ϥ?UqqDG׍Kw_zt>yۭkΩkāY߱]_5n^:K]vuߛ_x~~]zܠyץ?:ulm:uu1{NJKz~W_upӼ8\xn>tu~:4q˿W]ڡ~NK>u<ñy7c-Kl~N^nPХ:v6ƸC~[mХߏ˾yZKGy=·;ԥSҩv^ɓ~qn>vN}w]y͸7Eǥץyp߼~˥ѥ?:z{Ssy}tG.]m|>y:t_pһW.=?.Ϻ>E{c|۾s+ǥ/Kwtyu ;}v9x۷|y9]gK߿.}K..?]?.ϛ׆KA|ҏK/םWC~ץ]z~p|]h>_Ϻo^[>KKo7K>D祻N.|O^zr}],}ǯ=vK7>''\_?:'/G^ÎKi]Kt}w^:z>[ />@q0/^~>c]KO?_SܞO0_w^z·u\Fݥ]: t]Uҝtm>6y雎8.}Ko>k>{Cyr}_os|C7#/oq8ݺA·K?.uIuw^tU1/ǥB~}]zu1y靧ӷǥO_>CN_ܩSg9o!/ߟK??oǥ^ǥ[By_?]+'/tnǸvӾᘺӺA'ǥ;¥+.:.}{sKu^>ͺ<ǥ]YnqKt欷äKե}Y'1Ωĥ[Wեץn*~5/yt=uwts_uM楛Wd^}>tvny>s7b^}+6/ݾ2]u+¥wߋ.޼~/.xKތ}v) Wԥ{K:s\Й|C}sw:tS_C׹/.ؼ2ov.߭c'&}KO盗'/}]:῿3?.]7LK?u̸uҭK7Nn~.qwusԥ}t].ݾKte].?.1<}x3_qһXWKgvu;}vw]kåǥҩlwN]S3cޭs:?:wpӛӱ.d:uRqܬCZo9hN}/og|җS>9?{]:ucqյ?+\ ͷz]z~t_.|d]:yx]:y}vq鬓yɤ׼t?Oq:k\}bnyS>tS_ף]vǝN}AO]<|ps]/\ʏK9{݀|>/?޼;^.?/Ϻt>ywr:N;.[n=C>zK¼vqiѥ{K]6...]Ko.wץ|@ ..>vt.W}ο>~]:YwKץb~u~N;uӟO=ҷ7?uHw/۾SN _e\z;K\zK_KۨKw/_NM֣.wmt]9ҭ^o~qS֥|t鮓ǥb^L~Ziw7'] ҏיS?n>.ԥn.v]zSg]ءS^.ԩ]gv:ڥ:tq?.Qo75:uǝN}GY?1n|t|2^~u\ukK.9it:qe]ͼtɺus=KwKЭooߺs/n2+\SԥwR]1׭ۿw^S.:ut3cn?.]ťM<;;ļt]y?>o>uŸtۥǥ嘗~ۥץ.|c]{]X:]gKס+s?~r>y8z4.]Cw:uǹus]瓗>t|utÿKlǥҩү7]>yҧ߼z\D]vqC;\wmng1u~3~ƥGy8K.}o>}<ǥn}ѝq/:w|]K /uڥ?tڷq8ΘOїz\֣yqەo.߽ά.FKե?]+:\n_qK/йKK7y&|\t;r;?ys{K>zo緟JixKXW|8O:t'ºby?=.cu']0.}ҥpCzvqҥ{KF Kǽ KK;|v7>n/|ɼtK]:>=i~wqx\z߼toַs]:vc\8p/AM{j gW;4#ל%| l/K\{K^4cv2u|oc 맧KձԋVh}yi7v>eFu8؋aez_{q^߮ND]^^պ PDn@4|V'x;MVz^SNTidw߮-ˉK=^.^ڽXbxzlϮ8ոX:8e_mիi4ue&2<׭ OE0}޼^5^%^ZE)^}|zW^zgWůŠQ"tkRyK}^j˥#B0Q~ݢۇ.;/ ;M?AfQ25|^Fů{BVbo>_u_ԑ捉gŰŭ'ym° kc]8t#3]6\{]=kĘ v85*˭,|e&llyREˋАō(`y>bWχQET^{^::|}avPgxriG L]]nwvWKOKđ3Z*WYjC^:^Q]5Ϯ6~U*2enxO??tˍ3ln2jDAuQt&2^!]`\/(^kANu]ZXɥǭt:=/H1K!5Eb;xۯ I~lw筯"x`wS׽; 2}4G%ܓ5U0$=/=v㞇i뽛vs wB]Swk>֔~*UjF`ݽ۵IW+_)#-,˼w]Q^Zۘ2Z4d+Ķ|v^p- .S'Vv!]F4j!R $Ԟ:8i]QeO vmFS|&)/]S@$]ݯ>מ1NZ&6.#WL.|`vQeCF]tQS4k1S=xȞdί^= ƞ6y}S0:`|uȔ}i.VBaMĩVYK1eSv&j` u#ɛZ[7>Oezs٪ƺү]hެÈ{.ž.rы0[œ`Ϯ`65^.2ih y~s\ңP%K\z9g/aλ]Q{auMv0xK2Q> oym>7k WArRcD6φpW>濳ZΙ!Zyw5!͓!rL̵.!y^֓H2`5tq}F c8Z^IϠbK" s:0g#zy ^+yKORd[|$3U [Ώ?e9Y: Y'IM3/\)7GuۄU.Z}TcqVa*(*ÇSt ]7B\ @y<.<:/=ߣZ6/iC든m΁0VG^ԁs\XHoJ@r sƗG3\\׋c[D"ש^-"W6j. (BWKZ!L= @./.9r%QRˤ2']UqvukTj{rܵ8\|c5q%ez$dRqjSHck@c82>≮O}QVt|IY%x޼5 ^$|q_҆EWc:Tg| Rukrݘ⮜F*.} *7eJ&kS&FU&'60w0c˥Ck* ^.dH<#0⚦:||Cc=xA\ }PaÇB;z\#x6uup&Pa8<# R.U^phApJb2\sp_x okJ ^}=JTWZ W탣Qh@ OauK>_ 1%KpME[`6>kjw%ImFԁ7pvu8< C&PqcT-s ~_$ˤU h7Z@/̜pg]CK:][#PlGi3x'140E{l6&!ӢSpׂg 1DNK5N DvY`Ac*wG3F/ԯ_[0}/H@W#\&޷\-ܷ6w 滿 fE hS;<%}˅}ݏI=5U {w€|7Ʒ\b+ķoCŵmv^w{U`S|tG``x\wae\To[<)B4'*Z˓ykuovkxkzok" k;.[Jz)^ϓ ޚMc3W-{Rq3X=/rNw‚w^ݵkw4rXX[/;OoIT\9$_ɛfHZnot*pOs0=ގ-CHu-E?@HQ8]M-ߣ 2{6FJnIukxu~x[ܚZu?YJl&ɺx\ `VQ5D)?1V!uȝzkO 1ܚ]m[y!U5E_n>zzFu~­C ߴGr{<} n)H,vvw v?4>gFg(ivtxn0wEj5}.tɒ>[L/\=58fRG_-#yI.wmM)b>٢CM^HStd[dF`l# T\y9{tF^(6akMǧ&xWk_4vYB&ǵ$cKa[ܞw-css7y]vCi˕)S>ZWz1-RQh=_mj3Yw Zohg-gE%Y Y/}&L6%n.ہ))w^q&lv[ױfv޾8Ye_߂>׿hY{lvu][HHR>}SN;o?L9Q"ZW%NA,rYQ/R&=Xcc}X:t~b'hXͭ9ǭ)HfEbn@>c \Zݭ|?}g [B uq2 aE Vb-yok.Nms}%f?Һ+IevVWxW{Jju4/6^bWS:]80O?ts՜.*WUz)5\W-3Gxu^Yb2ëZozZʭ1j7y~RwzՒsHe"ӝ!}ۃ.'ehdW8ǫ^+RU1rT9xԫBPU}xƫx7jt=n= O{K'jxMxUkzU^4|6_WE _`,@Ma(R=Ͻ>ߴ<9}9Ukꜯ,ëF^~ӒuūݎW5*5«W5G{۔auDūk.gz)ë?Uw5m>fxzBϮS)StOקz~SUK{L >xK{r-)Rsռꖯë|S4BU-Uk@W / }xUk]^u-W}?SƫNx';zSG23z%l?xF,HpX0r2ǫjpfUWM?U T\մ<]xtyIb^xU~jC>iC:iԫ TWXWSoh{9?x ƫëƫ6^)~7y#^uӍ2fpaFTg >^2xUϓxU)Onj.Kz/W_$)!S{ܚK]n׫vU!P:xCT{@_WF$[:UKW}iǫ~cO{Ua֫jUU)'^:%LM/at y=ujxU}WW~[Wu}Pƫ5u3MU'e.H:˫NWWU+īNKWU&ѫ0V;ūJxxC7xZU=Qī<]xUޅ]|op73v*{S:rxWuīNW`nځϧūjnUi:z>}U]UI:aZpҾǫsU5xv?WES~uA}@5j]^aiĺc_x{W7#^u>Ky=OZNvU9Uߋ'/v;<3%OǥW7^'(ī 6:^UbW5Qj)^ū*Dq bxՍwڪtyս~47ONqk*{W/id^u*RJUY^Wj ^Uī ī:«v1F{S5$twyUXǫu#`JU]SKu^u/⓯OC_7v ~xU:^U W1ۺU4|UMë^5Eӂ+ 9>ݍj1Oav5Y!׃x:ց^] aU"ƫMW58 wz[SۜPХ^5L&2tVM W)r*U]xUsd9ur&xUra]{[ī>>U5\xU1 ^uezU۫rS,΢eAzUaګSq%|v]Og1L)neǫzf^5xUzՓ^j I2uUݴWQƫJBګnx+_}<*Nj[Loxݕ7Uwn{XHnMAwSDѦ 9|Nƫ6W5=^u+W50^Xs2,zxUsWVƫK}C_ƫeUW)HB]ij$ڠzوW/;^UzZ@'8A"5u`hU5G UU7iЫ]W~H >^{UU;L~rndh~pU1tOz|FWݧZ;L|j #ݨ^SqԬG"xUV/2%jZq+᳿ B+xUDC;)b?'G-ǫ·*^u:Wua*~ί^yUUW~ī';׎kfljI{wvn-QxUτa$^tOn}Ҷ$Pk\UmU;yሞūW }}SK!UxUS>!^^YP7Ut)5UsՆW:Z|#3F2iYB bX$*PQEhu`vSq%P7^u2=ߦ {UѾ$s=Wum jƫz1:WRqu}geW5Q*ǫ3ҫ*ǫ^FU^$)H~|%zUU]'xy52t~ ("47*?OxAͲ~E{W-U̻WxUOAUS*-*`RWS=Y!GB 7^3j׾U][IPڃUyUUëگW}Ly=y|5勃W-#U;{׫N嫡}UjīW4Kaī>燒2)~ULx/AkG򪍵tՍ-Dqy2Ѣ-ɣ},YīzZ7UIU?W/^Y_j/ZEcjמxծUY9WdlnūfxXqfYM& y@_iīv *,q빊U7|+RjUSYlTٚtxfzfϮgʻxTëzrë)pc@V7WTgLA^xꞡ|5=\մ>UUg1zUHĩƫW53^{ʄW}񪷸5^uxUϢzՍ@5jz9pZZxbzT!^u>'[A*Gu. \!a*OisT.Wm [wi*D6*zUqM꼌#~"5G:0Y= E{*z[9ƫW=EzUĢ^5Z ZjIm^UW+Z,WmY YIUdؿ]=.68fWPН;ʿ=~3d_ΙN o ^u^דWb_WO/+w͚\W=GE?76Hy7u[S}ܚ2)~!' W ޚ4Bm*x#We&jMCgǷ īzW}$t:y[_^I*kUYDZ2aiƦhNLǫ >ꔯT\ǫzW5:EK M99*r$L5+^5:|E7ifWfMkoMŵaWw9o#^;SxU;aW9U5=mNUī%oWm9%_ו}*Pty(#ӫJJ:jv5NJdQfDY 5v׫tWeR_zUQ<^2@u^'xPq,2Wh/E֓:pk(Z^xUxUVѫv( 聗]@ԋk~.MjZ^UWW}7,ƫ^zETjx~n[8=WEwn4]@xUoUkFk^zUJ7^uWNw%neW/_wl!x iDUO~DaU}y*pzAs>^u*4OZNGīL^JVOjn*Xūzl$ӯW_͚]uj:P5XkGg{o*Obmqiƫʔf;UT_[Ͻ ӫTW=_fM#V^xnUxU&ūZUO_YFW} 9" p5k"16pixUoU훯ZntOMxSʆW"Sj _/,^RN֞"u2xy«<#U5kZ0񪔸7Y0Ttk.7q++b5eNPMOd$qzj͝M8r+rYt[Hnm6Ÿ 0 2ƍʶ]U{AYuOޛ"o" #'TU6Z[,ͫg4,y4k]W-vVXP=[F«Ejp\WUWM@Ի<])= Z̍^tdzyX%t3ـLG_gxU?W l9 )=07a/nʱXʸ<6k}"C!pRͬ+Xꃑ@sWL:@j$WԅUCAD,oQaMWnK**(NMA_|rQFټ eU]qԼ%Uq8=Pɞʆ[E{NcU;Y: ^\p5 s2U`2WKQTíj0)^"$U9NT5s*ြVW|yՋ$xUW-D̫9y~Λ@`j77:mӕUg^j6x"L=W dֆyX @ȏΠzWs3%ΫZ(xUX iVumWE!xU z+ms[uT+}Uje}RYd:L*O^yUZcY uWMv*{-w"uAAGWMūaP4xՎ) `)O;jUo/^55zZ }E5Ql0Uu6,1=UGU7^5]f!3R0J 韐yU+n *U9s&jjY+yJՀjY̫:k^)NIW\3aW  _Qz቙RWMdLHsϥzT-.:LVb@WU/R/a }M:«fK6zUMcU7SG )v[v$ = TjD0WuWj 2«W6O!m)^@j78i}l}U#:*DQ?yc HB,* j`Une^tWuW-d¤ )^*hfNuTmyP#@ @UJp른zC_0 @_9 m}UIU&Z桯|:ɀ4ڷ)16V^K_U!^xq #`}Ut7U ͨydSkejKeӬt0&9"{*^ΩxU@xUk«zjoxa3߅Iūt }UW6rK_ oGx]U"T%"Z jq"^55jXXL": ֝W^ߞīЄu@=ن(*R'Tw0Mat˞ ^n+ȴHUWUͭW%o^5 `«h3UE{2[$^5U WT@IbU5COj(&vLuTk^5Xq*TW 1֌R0zH#*EͫDWmF2g@ yH5*h ^՘jy@ʷTUS77j}[[1L V!p9VU~㨒iV-ljyPj^ii[Mp[tY^!ſWSU{WԀW%^oͫfÏ'=={+%ټ**k Ȼ('dK (^u@XVoEW][ڍZc㫪M*5*96"n~ ^6oU@2U.xՐP?l -vc8U*m^+UCqT49=ǦE+^Dx4ū8WZ|H#*GW&ڬZ| 3E;J 1뫎%*Vò'u ΫZ^ZRT-l6uTP Ӏj[U"$J܄W%o}U3xVl^5Qȼƺ*xˉo5W%ļzx=Wx1/2oA_/b.¤Ϋօn'U)e}3yը۠OE0ëIX*bU= 6s8a|Uq`(U]^i(v3JL&RsUC (z.7^5 ^BZW9!8xվTŁͼ2`ͫV cZD0̫3 ?fgl+xUPoUșW ^5źs}; Z íJLՊ^՚,ͫE-Pxc\lpUɓ1hssT->g% jfJ3kvs%O 2Լ*R4sD,U)þxռ׉W-]IΠzkTkǬSx3|H2zt ^4 z`6b-]AU~.sЃ2VW Si"\5K_5aU˼*WyUx[Xi`Tyb0Q婙H;Lێ&t W)}UW- wy]#Us^ÛAT~yUXūFj]^gxU OW-|4jgxbUjw~ڌ'7UHLpzΫLp΍WuNyՓ*^5 k<5ūaљ u[A_gWdZ<%"^vb7^5Ϋ:/ ^ZWՇ`xUU[d Uj}U4R3+d'Cū@_58x-<誐=uA=WYTeUu3K_&@EigrRݦPr*&T)O5L%bEw(:*Jꫜ@.tuǫWu}{xk!G_ˡ:Y-u^U-+^XNW=U0J-)tNKV ƶP?PUa|5OTK_J@s.k^E8XĔTAjxU «:>U5W6qNy2z j^oſwT)6X1%zǫz z-]j@^SRȋ-glW*x*eV*ͫWՔ ^UO eEQ x CGRdfJxU6~RBAUq`XיVW ^Ռx|ͫWmVnNy\j_IM[ ^XڬHfN& m𪮼'^"«VF;U@H*̫j5YP-K_j]jqh^2c{A& H Z,{z4PXFTKDxUyW܂W=ܖb&RbW }t[깘c[!ë^5NlS8'JJU6<(׽U'j>LwP'٤'k6zͭjWrƫW8WUkz5xU3 ނf"Hf4Y¼flj'UC25m UѢj1 jV*V]@2+i8+~& =O^5C_B%RQmh3R@WkKWmQ'1U2*@m^zW|\<$UW-wj|. ^4-UhjUΫ{}U(«I6i34kK^28HL&RUlPhF)B_yUJ]-^Qlyd'=]^5O]!1Ux,Z+!RTjVSƫb 2P4kIi8Ws1\jbz諒 o^l * K_Uj7T$ͫvq5b*UO WtI@㫷«k^vI,Ie|\?* yXռp0iuږ]HQ楠-xUsZVj'  a@UpxEW ּ*m g6UU +٤h^W+j9^{^5 mUMf a@UW~~Tƫ|ƫLur&؟t| /(S\?O?SŇC?'^c&(ܟSŇEs׋")C~z/ԗc~OAA)? Kɯu~Lz_??:O}/}-Lz?wWqGx|>$s^/uZ'w/>''ttzЏ$|^Ix:}+rKV,ef7o|s7?9 7^̔wojOW;'vT49g]#P؎IIvkR_b;fl'6v-c;'~9w<~LwfNv3M,)Mߟ{%YU#_j,04DX_m63mlMØxk>=1 v4)v4 IxY!i>2/VG&jXW} gE!59֮<vxx:#| a3"FjضWǬArljHq#GHܛG#KTl[pǫD"e_I?#@g=(< <_cTگaHUkoE*ݯp&Zx;˿;wԾ-.oʷ"}dVj{ABQu=L><&y-:.J=qe}ճxhx6h遁vp1P5ʱG:zTK)Tm4qQ@{h}\iUGO}p5#鞃z<REJ53V[T}nXc/1Suq]s18tcL%!cdi(7"5|Lu]{fw@3nvY?fWGk @n/N!{||ww?Ξ\iצ"%{_t7U[I.^ڦrǻr?4;m%=gw@v'3㶻:^u7\z]o>cwmY9c$?#ӮcjN]/);ȋZ\/,6 endstream endobj 628 0 obj << /CreationDate (D:20170125184259) /ModDate (D:20170125184259) /Title (R Graphics Output) /Producer (R 3.3.2) /Creator (R) >> endobj 629 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Roman /Encoding 631 0 R >> endobj 630 0 obj [/ICCBased 632 0 R] endobj 631 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus] >> endobj 632 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 491 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [130.85 112.979 138.297 122.335] /A << /S /GoTo /D (section.4) >> >> endobj 627 0 obj << /D [625 0 R /XYZ 80 770.89 null] >> endobj 488 0 obj << /D [625 0 R /XYZ 130.039 141.073 null] >> endobj 624 0 obj << /Font << /F64 179 0 R /F8 139 0 R >> /XObject << /Im4 489 0 R >> /ProcSet [ /PDF /Text ] >> endobj 633 0 obj [777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 319.4 777.8 472.2 472.2 666.7 666.7 666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.4 666.7 666.7 611.1 288.9 500 288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1] endobj 634 0 obj [865.5 816.7 826.7 875.5 756.7 727.2 895.3 896.1 471.7 610.5 895 697.8 1072.8 896.1 855 787.2 855 859.4 650 796.1 880.8 865.5 1160 865.5 865.5 708.9 356.1 620.6 356.1 591.1 355.6 355.6 591.1 532.2 532.2 591.1 532.2 400 532.2 591.1 355.6 355.6 532.2 296.7 944.4 650 591.1 591.1 532.2 501.7 486.9 385 620.5 532.2 767.8 560.6 561.7] endobj 635 0 obj [314.8 524.7 524.7 524.7 524.7 524.7 524.7 524.7 524.7 524.7 524.7 524.7 314.8 314.8 314.8 787 524.7 524.7 787 763 722.5 734.6 775 696.3 670.1 794.1 763 395.7 538.9 789.2 643.8 920.4 763 787 696.3 787 748.8 577.2 734.6 763 763 1025.3 763 763 629.6 314.8 527.8 314.8 524.7 314.8 314.8 524.7 472.2 472.2 524.7 472.2 314.8 472.2 524.7 314.8 314.8 472.2 262.3 839.5 577.2 524.7 524.7 472.2 432.9 419.8 341.1] endobj 637 0 obj [516.7] endobj 638 0 obj [799.4] endobj 639 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 640 0 obj [665.9] endobj 641 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 642 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 643 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 644 0 obj [599.5 571 571 856.5 856.5 285.5 314 513.9 513.9 513.9 513.9 513.9 770.7 456.8 513.9 742.3 799.4 513.9 927.8 1042 799.4 285.5 285.5 513.9 856.5 513.9 856.5 799.4 285.5 399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4 742.3 542.4 542.4 456.8] endobj 645 0 obj [611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1] endobj 646 0 obj [646.5] endobj 647 0 obj [550 575 862.5 875 300 325 500 500 500 500 500 814.8 450 525 700 700 500 863.4 963.4 750 250 300 500 800 755.2 800 750 300 400 400 500 750 300 350 300 500 500 500 500 500 500 500 500 500 500 500 300 300 300 750 500 500 750 726.9 688.4 700 738.4 663.4 638.4 756.7 726.9 376.9 513.4 751.9 613.4 876.9 726.9 750 663.4 750 713.4 550 700 726.9 726.9 976.9 726.9 726.9 600 300 500 300 500 300 300 500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325 525 450 650 450 475] endobj 648 0 obj [531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1 295.1 826.4 501.7 501.7 826.4 795.8 752.1 767.4 811.1 722.6 693.1 833.5 795.8 382.6 545.5 825.4 663.6 972.9 795.8 826.4 722.6 826.4 781.6 590.3 767.4 795.8 795.8 1091 795.8 795.8 649.3 295.1 531.3 295.1 531.3 295.1 295.1 531.3 590.3 472.2 590.3 472.2 324.7 531.3 590.3 295.1 324.7 560.8 295.1 885.4 590.3 531.3 590.3 560.8 414.1 419.1 413.2] endobj 649 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8] endobj 650 0 obj [361.7 429.7 553.2] endobj 651 0 obj [639.7 565.6 517.7 444.4 405.9 437.5 496.5 469.4 353.9 576.2 583.3 602.5 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9 571.5 490.3] endobj 652 0 obj [333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500] endobj 653 0 obj [638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6] endobj 654 0 obj [613.3 562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6 408.9 511.1 1022.2 511.1 511.1 511.1] endobj 655 0 obj [777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 319.4 777.8 472.2 472.2 666.7 666.7 666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.5 666.7 666.7 611.1 288.9 500 288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1] endobj 656 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500] endobj 657 0 obj [830.6 894.4 830.6 894.4 830.6 670.8 638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2] endobj 658 0 obj [702.8] endobj 659 0 obj [937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8 500 562.5 1125 562.5 562.5 562.5] endobj 660 0 obj [500 500 500 500 500 500 277.8 277.8 305.6 777.8 472.2 472.2 777.8 755.6 711.1 722.2 766.7 655.6 627.8 786.1 783.3 397.2 516.7 783.3 600 950 783.3 750 683.3 750 759.7 555.6 694.4 769.4 755.6 1033.3 755.6 755.6 611.1 280 544.4 280 500 277.8 277.8 486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4 390.3 555.6 527.8 722.2 527.8 527.8] endobj 661 0 obj << /Length1 1858 /Length2 12493 /Length3 0 /Length 13640 /Filter /FlateDecode >> stream xڍPҨ-N{pww'w;!Hp' -|_uoMtjY{KC,jfo safc؀ dGQ؀#h!v|2w$L\^r667`yމ a1(4N K0r3 j vL&.`׈ =v/..|,&,NBK*6Q0-Xij.&N`9p3;^dJ`2`76{ v.6mLhCkITi}y4WnE9?Qx ZGD¬.G3C&ѕ]9ֽWڣhܶo\(_5JfiL~P»0"2=y3B.ψ{Q=J:s'!5.))Zo9y/Qk ?5 )?*82 f+t`Sw渃2l4At䵈!4_+e@Hۻ:5:Y1D'.Ph1gu$WxGa\r$V4zҍV?e*`fAش5sБnìw[+";3-0?eڄ{bXtƥ^YZdQwVc0r{A%d̺wCMUi-Ӊ=c@R-W-{V=Z+OZ-즭}KLpZ uUw |aS{(cXn3Eg2x \^-sŠ@眸z+,4È$m2}V֝Ms*bhK'VPIO}'FO.1QzVtsȶ`L(mh~[ ^l)& !.@2)dS[Vç7#&t3!'g+с qBХ..I@⋥No*YQ{*3Mx섁_ھ|d81U{wW9ihI;0als"%wun@)PRct=}3䱍V*WZ;kef$%0@Y%N򒵐&ur:5c˅~ |vCv(n 6S¹[ AnE{3]y01Sa2w:-ǒN7??L9J‹N{5Cm.}|3>܂+m *aŽOў~nڍ 6/|Z4<x?/'ؑe J.$A[)K rPZ0hO]tZZ˕Ӹ0v;3WKtժQ.~2q,sɖCx|bA.k] ,[8`OQ{aV8o\k[ma‡>ߑls)T5O֮Ҽ "V҄|j= ;{#$NX0퇍;ׄ*|yĮt{Q+ P'hɣR KnQi5tMDXU%= K»Ijkzhqtfn'LYMcR6aQD7 W'uCԙUHLa; ܛ$M/ knIm.eRgKaUw'AޯY?x0'O 4>ǵ]!xW#yy55Jجg!'99d[,$U mqdՍsPT,0~ Qh{2̻IYyHK#X-wNKg~];om x@V]8 ogqxi]\`Ds )ۇ̶~XMdɍguVJv˷ɹI?{_ۼzJ{^WZlx!Kyg{'cQ)ȣOks9Q[+@ 7w|T1}fp|P5Δݣ2" dq?'t c@^sl7O?UOSYzɒzge/lRD1;xIHU@{셸fَx쥻*B*+B ›6qK;. w}IcI#ڀHЍUeI,jѐ' 0r\l:1iG@?ii]'L$F47ex+BD EuF\cZ6-; zz_J qSC: e_4)"ΥZE`*w&yZJxHṆOŹ[Ar7vp8ek>HhO{ž1 0 8t.[1| 45|T(!xX6%_Hk48t?>+k JΣ9С~.`%Cn#^_o>D,}Ç`\Q(GBa bƕW|U3[[͏@z~cl颙B/o iJq tu?teLhz7$y¾ēo[}ܞXQ3Jq2X $0\ü_`0?c\cg} ;XtO2VK %0'h>h55nЪxhL"_7Vj]v N,;j  Lw$P`zol!xX|'%@*)TJCa؎>| ֹқJfi*  eC3Lz6V}~{l0rF疴+F!;Ge< GfwBT߀6nmF?"nAF{FxdFE9p&| u4np| F|Z]f5 JN#fڳȻdPgSUDj \H 8%HE"=5T벂 ;wA^g7WW&#jY#Γ>³5w*m6USrZ`{XIDYXj _37Q0ZOFν}M)u e<8!7n7zNUjNDs(~d廞ke#UI<_mv۹ysUaKܑPGpjCgׇG$i{-gèyL>U.,9 ܁8O2wx{jkB5S ?#IQp/6l#a;LfRC|Q-PHBQ S&t)8y$f^4QFzԎa1RS8Gpi=&e7bt5mfզ6 Q9x8rZ' 3;a bwc)ehsȂrWmg:CPÈ⏚Aä%aX9ָׅp[HiT+[l̪dMԢ;b*Jcy>vy֛E2_k!$7N%lNr*vdiq]\y-+A#\Fى6b%!|Δ^88!ܘbRPu'ԩ#7r}:v7$hzm~݄&*Iڜݝ7J5PO"ZcGƸl=]D)bJql*c=fug՟yAppڭYH1|:;嬚ɼb|#CO"}~p@'rk^)UQg&Uuk9zjjŋ+cUfYz@q6hxFǗsl5icHK>ҐJ.}O+`$sRw-u#z)UbFsEB9'tTiv(?'.^&<#ƆvfEHxri}|IA \B|/翇q4%XN|MCIdvMS`&&yH;|Jˇ1/rIF'Qc#ΣqɼQܨ Q,m,CSb m^r/<%Bj]`[Xу+=C:^xD<BΤ! e1浅iux쑯~w}Τ`t*ײ.;=AKb^'GS7žz1g7腅Ud8%*ӂ~T%PCîRpH?+m'0$Qqaqp3V/$2ŰM*ZMxSbK~Fz7&{G;WׅK.bcie"8׻P;ܚpəF2; BdfU$J[ |> ׅߞ\]U55|}A& $d([m?cW<] k̥Ʃudu94aJT}!a &jțs"b,|#oD)+\$a:zĜ|ׇHCV߭7[0V8SlTXCkTVv!-w8 T4P[Çi[|KmY+BqwaOt.yvgD h - ?ϤC"@66w*e,8)mN'a$\R6###jvr7{!M ~烳~m7gƦ-Npg6Mly@xu2'7:Lˢ>-lNu]cv$ԲƒAM@{ļ]03|ʯ/gvawx ؆LCgU $xO%Ԛf>6&.BWԅ6s_>#g> J Zs%i:p&y^D`qD,^bBrL&1|[~eb%b1 [qϦj{~]5"nPѹ7dO^$h(_?Y~Y-Y_#bX)(T:1`rj6xjKHv=fkZ>8jy*k"?Y? L}C~H#< K {l¢B] U XSb}*a-ɗZ4½>oʷ@-MC#j ϣ[,S>2d;>=Ma9%ʜv]0W H:,4㷓@fjDb1ʌ~n-町ߛM}ݍ.M,0)?/1UP ˍzoGbg-sJ:a.ŗ[j0XDc' ʏ;eW͢ Qa\}\߃w"Nme׼oie\3L,,a\ V'g8BOS\. mk U򇐪Qǥ)*;_ 2G2l͵^ڶ 9󕼕O &FZ|_[?v˩CkigQ1j/Z%p7 "A)SS 9`#>87E,7NUB7#SHkjQBو>EՕ`:2ʟ.1UseP'fB1(}˛3 w$M"XO7NN'= l\Jʍ8~(xЭP+i:x!H<({۫R-R6**J폠V̳Q`iE&IrW!w;\N*ukg s#sMAзN+ÒUGk>ИhQFS%k ~.;IkbHS4@QK{iK&i*í&sUH}!&%w`'+wW bH"(TJٞ^BJK@J&VJ [~S‹! 0QMS^/j6iEZ[> X':n*)^7H]Xb>;QZ$ ]~yk%*s_CW%$/rFZ+]SȤ̦׹3!sA;@DtI`%vf4(]aZf4DDPy$QFBƨyzvϏ¨q@5c&z)s;(yI"q7ݾe%9uDʻ6A"]EpgrCKI@ 3*ei\+Q -@Gi̦?N6i'1sҭ8KiF"QPz^6l`f6h5͙S`]ن8޾⨧`W`!^`V.. lLL䊎kS , Vhz녘p-,'9=% כT3*(+rGB(q yQ SL_wveA7f]獑-u7/\Kvf{+)BL9(vWПZjpCKa57} rP:2N`V o߰Hkdj `jVW{cL&4,pSIT@*LAtж(!:E^|-L=;i ZQ=ߛ4VR5$kf`F77Zlq])t@t4UM抎Wm- F*td Hw"!:2Aň+t0V/ ZP7n H{xLGX #mH}-g"H77L٦V\8f_+j/ev[?kuއާP|-&"Pܿ7Iu5tA7)>@%]qvxbd_'Fd1c SQOc9/B P!*ti9}%S'5l.vѮ'w> =zwFQ 䆟* >koL+Cuf7 0ϖ[u6b(OPZfon0^2&Ehar=-+&BnYNY&ma&findri,/SA(͒պݎ ~0ߋ]-mԻLdMzq:I8}PkQa2bn @,}S_Z_6b*"e5RWx_SR80 R}gk-T MϤ2o!^VAΧFJ%i'{Qj~:);A 7'LPm!b\RPt)ohRs]8n*7R~s!PmĽ(d$!d08%9Ƞpc9NNG<"-|wt ,"C7:p߈JJ9V.hٛB|][96pF ٍ@Pj-y%ʃ|*Jⓧ~nB%v1y9Se2Ѧc>MBG3kXIՋHwxvo`7 Wץx'rT;2Qd?gLCbThlx\!ִh"q?Ƭm{|w/M(?Йd|/!~'7qTU_LNg6*qO70vU|^4@H,&$S\ӏ5s _XN덻ҁmHmШ6j-զ(P<5!Y_,~d&;R-KOg7ƻ[ƿwQ0镡[U("mG+KRG2īL,3}8gP>CsuD#uyٳ{KH- գal7g4TMO._xW2"Lq.](RQ0&2p~ ̠;@tpg`+rz{ Q(U&Tk( nK `# P|"|pϙPH#5L`T"_/ RodPOhs0COXn=O_;T O}y \U{Kͤ{`A%x{ 25Iz&h,~t,m 6W}_X]8v9YyGC$}IrqU!H$XeG1S$~ 5q|xB ʉPa ]aG6]S~5SX JeT)c]ΜDTAmMٞ#{"* 9,FB{efh;ĹPteKI6bқAVxhc=~?P( `⍚-D!1^.nh͆K N –|93^Ár`MNt28Y#qGB硭aG}3%n oeyq!?m_˝Aq@ˬ| py2S-7bD6j:$!h+oMZ$NZ\q(QP-Ϣmk  dsi?z}0Ό૓B8LIee&8/=d endstream endobj 341 0 obj /JNMLWX+CMB10 endobj 330 0 obj << /Type /FontDescriptor /FontName /JNMLWX+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 750 /CapHeight 750 /Descent -250 /ItalicAngle 0 /StemV 108 /CharSet (/A/B/C/G/J/M/O/R/S/U/V/W/X/a/b/c/d/e/f/four/g/h/i/k/l/m/n/o/p/r/s/t/u/x/y) /FontFile 661 0 R >> endobj 662 0 obj << /Length1 1717 /Length2 11430 /Length3 0 /Length 12535 /Filter /FlateDecode >> stream xڍP ;a000 !; Np,@8rϹ}UUo^ݻ{wTb[dPVvA>;VB فK!/4"T;\^A>Avv';` @agPa(An(R`o-|-|$@;K3@9h th-@P A/l yzzXQf rA<@V?J@ƊB жsˠz! hg rv{qqwA/j.  _p{Og%mlsdY^Pf! 9-^Jh/]%fGlyfg+)G~v˽{\geX8۹ּP(r6 (r,m8@_ 5BAm_,@6v(FACF/`/ ;;z+lJ2:LQRep88x|/Ghwl ='egao,U1;qߔuoF؁Nv+^&*]pR=_+ v6(e$mF;7Y;/qcA`7? ;l2@/G8[2Η!7K_e@^N1 }qCP(/M/`Leg/^A/">ۿ~/JR_w`{٭xra/!98l/uyl!v/N14r4e6ϭ.pg 5;^r'Ͽه* QeUy*lpԑz]m5& {0ջjR=MQ?&zZ / 72E YB$[3'AsuHʊLf3HsM;(g" cwL xad0;`ktDz-rԺ%w#VVR?n"l^G"gv p'΋'l+e%4FL:2_ZcU NѧXkw*o}ޖ~NzMDvd@(0 @3˥j~mz$A3_o,plkv]>kIۃ@G膁~Hu`zw7fm2[%4NݷQtљ*t |MmPxcYOJi+U;ƮZnӕc4F_LI]`OGrnl_Uno.S-X)$0"3L=X{^mH2E"XY@^~(W},n\@卧A&0A.o ׫.ĢͽOcL}09\-ק'q_=]|苰cO>ZR-Vxsǡ=pk&Î6__~vH61`X,_!=o/0v6}l|cB-\I+Àlo(1:21R\ ܤ*ʻ`G# >)WfjmvVK[Ev!bJ+#yXO$l&0Rċ?NJ.U<ܝ:9 sd޳D<a%V}DGCETYz-fx"~p.i'kot#RWvX֡S V?<"\&9#b(Ub Rn8Q܋7Ng~2M ׿'tm683bڞ W},wQǮXu|;kocL#@C;;dܱ?{=oDEE@\),Yoٽg6S_)"ؑ6#Ip<5kD\q"DKe} ~FY< q+4/,[o]1[mav:d$&4MMGV~.Ko!+JؠBR;ۊkS5a՗q4a_%B\Ddr3 fwT12ZGy\/)ς?hmF}!SsSl5RK!y9ZA:ǯ,ԾńBV̵s%ֹ=.e~5|͗vAƜ\"R:[\Z#Iو feگN:9MNF: g6.MQQoS{k!"瘸<" D_Iш665tJZ2bNۨ5ΫöRfvVg5BI3cx=pP[Z3Ձ&iz_M~6Cu9^L1dXwn&Z2 㽻 9}a%b|;(qu]N 6]작D |C-n)Ʃ4l23g8.'0w¾&#]n_.+K̢:[("G+&APmTV@{=Uk%}N I5fWؕJ*i,T(Qv`y5ሧ<^qNaq2h0]AgnmK[f3󢲓1#p5yAQ3_f"8~N"}nvTGaM̩!R%;_;IB5xrFB*eXh3abPŅ76{{<4nr0ϹFN4Y C0$* <*Fk:&VIcXfӽ)K_6V'Pޏ(ڐl J_g$eM?%D3g[\Z 3!fg`EGNݸ3HUAxKk?COvAծ2ԡYo98R^lw}5s} lJnnsG8Jz퓹?Rpa MX.'GOagW, % )#$1|]8;k>WŚA) ̱d+?d"t:7&O+)ǠLؕ\;rc;ب Mk KҢs P6*ATŧhļ|:jvm*ݨiNcbAFgpp̘b# S۪SJ8p\ ~dh^t$( Xg;"[METm&{s}7h帕%bz-1V;; ;>Y>ifwXf*<97z,Τj^pr>b- UwBSa3ac ]ю=U`|K>ZgSƋ ~^pzqT;ҳ@tSSiA,fFҷJڢnaaϝ2WU~o?>3?/)}/eb/#}܈wi|4>}pNʪ7Q'DH0"#4̂@gn55gy~[8:'59 ;/ vWt3:`"?R BF~WtLuk<Ł*iJծy%iYޛc}"}¡DBCi6t.7C0a W}nӨ4Z-u+ɴa(>=(Z6P|֊aUȧs{"ZʾϣҍQ-Zzvtu4Vʈm_>-r1 ª*5R+_Pja"ܼ 6ӺhѾ!%P]*˵>,c6^Z8%l6pڤ__-ƛ :ߖ3{*x\pH!8Uu[M?|*=ߙg{˚#wTenऑ@S\)$G:8j2= YS y?yTdϧ:q6quhP}ўBxnHX- v, \ Na022Q2/hxX3{8pLm뗢&%J.qPa5nq|ozC'A$ז_YJ%%R[o]\ֻ+qfaK=([: Zx$ xn~, AKZmSJ'~i!/ q 6 gtL&c.XMx%b~XÚ^w-0%TCW.l̐L âkYFo} ͒!&2rI@՜xR'yf3<ؚ.W-*bvΗ5VĀژަտ[l>8le7rnOG LI(Zfhh:[o`xglKOkW(J%]͑?6<}XLZ<#%2)l>%V3>L` +4*r*2C D릪p0X\Ff} $z>ܜ.lEPMTYJc~*w6c*Z6t**J-6Y2TI%{8!sNAkr n =φcﻓ5;T`39g_ Hqz`E+.<_-U5lu+#2/Ϸu$%˕=xMpWsuέȉݬsc?}?BrIǖveNEwiĥv8]`ÝmFv SJ?DZޝ}bG#BF%)dXai3^Z{VM\,xHQZmD'v#,>TkFKxO g,:8KH|ژݦTCh6=*ӒutGۦlHE.[݅g>:]bܼο 2 sD eę@tΐ]ijo^̢8Ҭ+j害YPnvO~Ë0ebC=2>:6 eE+ԫ\E$\Ndr/)|Rjd6 ȘSM ߶> ZӽOp1~ѪJL,]=m:A+86=tUhf)JW"J+gLDaKy{=gD:0ɹ_e.uy0:/۸o>Rw%)QA]4`M  m,P\ 쭌0G&;G;6 Nswvio™];-^=|3UiC%NOܫG*J$Y7okBZC4TE2y)jLfhn>]L 7M-Lzo6k!GW^,UA$VC*&4 A!`{<|5J6L 2x%rXܽUD l|w?Ebʾτ膃ݗHo"WZ0|oUs%[GhGh0y&;] _on&j顋=cN3!:ďf|&hO ѵ;ᨀlWq{;e QnjB蝷!Ud~1q!UH0{<2Sdfo# uY)]>t\ s)?* EW֖|ڎ\RکwC8umpFrZkxszNpӋRhG0?au+X::>Yl˳CR6spsF-߆N'6ư'y\-}}1)`Zj;pZ>ϞG}3/<>{?NI.rS)H;yRIFlUl>A],Cz,ǏW`WRZ\n)0WF8񄌍@sh'o’ Ҡ;Ź-1ZBipPhZv/4Z}O1x'96o%zkENV[EwO-訚P4YCT>0-MR{@/ߓJ½q06K0/FqL1X9 ߽1;eCK? LsTMBI9To275;[> PڒdX43fGN w޷@4(̈0(;;hX 6GI}[50;337 ڗ/jԇ,s{b1124~x7fj_M!;LA2nV{B'%7+T#E^~|Z Sb8A9ݥpl /%RH.'vy 3S S!jܭ$G:Lmq%Ev7MK Ry w\Z.ޛߝfzU5Ei^ {a{ԃ/Jqq px;½b=:c FBkS[@ m>S>pe>5P6Vh7fuщCiIU2r/8 4C&]2gNK>ͳ}z3 UG/I՛&DYԁ;k{ݲ7S,Ռ_4Ʃ*le}* <%}̝BI 돽\* %u(9CUD~L]uokQw`( ٫r~Y枉Rң=Ta *y{)j9DR>z521Ġnu`S7)1%B2J^gix`"ks} &oPxZ w61*g peG16/SȪ**3 E|5K ,Ɣ_,,ٗ\+P6=I6; B!6 nY ^xɭߔ`V 3Q“|&a~Z©,g?_ThUh:$ nŗxehprK"TN{d(5xHH/15<$bc7U'&!=KIL0}k(8tv曆oځ2kŠr00Lcb۲Qv83MӪ@+MaHt}rՁDkڻeyjDQίQ6ViPrX&w xtje[)EEδAOxl_Q޺o[Jʻ YrP@CxL&tuqAmygu)u>ƾԢZڙlziG!&܄9VJ:[^yv,chl@ʝyqj}c]I-N( jmۅ@󞒓IètUm3v| Džڨ>YQc޳A*/9f C/)Q<}n_7*bx:tT6ٶ%8{жGw0󽉨n ҞVvzfo0B:MsA]k  wަx\E)szͲKpnd^G2T8VcKx5@iE݌KOVta?l|PL5FѱGTIYSkoKz"˥v*ڈN0\N'7|k夠SXDzo]vV #*hVsYZߐ&FH;@|SSy[$&v/ό/Gۖ7Ҡ ˤ]Eϴxp3ZM{0{IaN2۲)dj\a;d0j v% \[hEǒ>Qڢ"k'Ys 0mU6M춗[1ޡ'W.QLRuCOVCZ\Z5|n]*bbbZVkZa-z:󁙜lb|UECǎ42ybJ}E쮛 Zv$TEB]=ᦣuM5c$}䶞9hDܲtz WS -ﺾ.F?#a endstream endobj 663 0 obj << /Type /FontDescriptor /FontName /BZYKEU+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/A/D/Omega/Sigma/V/X/Z/a/b/c/eight/five/four/nine/one/r/s/seven/six/t/three/two/zero) /FontFile 662 0 R >> endobj 664 0 obj << /Length1 2097 /Length2 14231 /Length3 0 /Length 15500 /Filter /FlateDecode >> stream xڍP"5݃wHp`=C9߫fuݫwJR%UF# ؑ &/ †HIrǎHwـ` _m↎Dy0@ `ccahc7t26`"=|XyyXAƆ`9DcC+1?)hm]\\ l̈́h. Gs h 4%`h W"%@Cx5X`' z:@UZh C9V&7D 6ֶ`7 ` %]`V6Ά +CWߥ$E `lut`rY4mX['ݍ˵۸=LA`ӿd82AvN@i9&63#]͙:@//[[ pwzy_ 0;f 0f?AmcofbrMDdE_+ `eeps7!:X~JMmڧ ͥ`:@Aad1~`<Ho??5_:9n./UX_.ͬF$hr46g\hV 0P`dea?2|}>^gouyH _[07tCdy%6NN:]b35* `jc׍rqE2̢7Y70q%#vo'_T*kkozo `6/|X6?zl2oo+;˫.7<ߐ~k r#_t'?R 9^mfkWZUU)ֿ!k 0>Kvsm_%i%_W;5޾>=bGZ?Z??n5^ӻ_չ g]_4~^w?_( h0kch5 mZFv{TD UkoK4WI<BZ[<cU&['p Ej{x>yjYB7CvP9*a޺H VީEz,bT+5ʜ#ud$6}u#{D&(Ck-n}B͡ _  cdCt/IwΣ(Z&8ȔXoQЎsAlx|}o_O ms28XyRtpJ5#xU?Ac =r:>@X-${ջ+a؎9y^^)꺸lF(Pܷg^R`,KOBjDCY}U/BP#52/v#C٩m;Λi',doeTh'faTC~.14,H ͣ&h 1,Q",oR-j9)]6qA+idS kjX E _~^(B;+ y#<]QˢE٥l"fĆκX!ƔΩQN&0"VݥJ7eHQnn%볝FkoG:F]+m |Qpt2/[mV+kl"Fb,sWbzC n2 \+ (S$kKN3^rM?@|ZosY i|?UćUc A∢rKk=nh4ghi[{ KX+@{SsYtLϾIlSy_\=JB ^!K6 @yd.4LO/ WA+ l{ӳ0ՙHa 3tx邷6B ȭuUK ӀNB g[Z(¢XHbNJ\MF>kjVs)5xXˊ[AzGmNQ 4 B?\!keDzH֪{W j]xՏ2+X;b4ۄod=j$ ϶e0i_%}U[0pV1l1'oPIjʫ/tP/YPz])3ؐ FR;÷|, J|R]-Ɗ7^$lF,@d۶4X&+}MbeVȊx(φ^ ,5P\r23W aloDG>`8^]\Ye0ѿ?~x'sUш3?1 %]]U]!'zF!"A&y~1~0VTւQ>f{)V?bWd./8^v @GrTU} 7)? NʔL]! ,ŽbF:-YzEۏI*Z9b+.)$gJ" .F>A^hG7*ط?%r8<0zlU5QZJ avˀmMvLb,NDy7GTe?D&\9j)V Rɫe4$B2ʴ'#_hD*5I#p\b],%绠Xh.t&aNI&AĢ /zk1".oQ~d n_=s.4c*g4%U)0O#S>JVRxU]A7y[`]z/R;QPƐp @`ڞٍN:$bNa5Y]KPOnfE@.'bۘϨɣ “Y! CqݱAoYwl$蓛e7E@yLgoLDD ;X{mviIS3q[~~SCi1+g; {tב{ardLTޣ'gH"3vЧ:Z]-B=:opsj<|nC>D$=GfM yNb &eYQ M6VVB"(^)N(ڳS6UDjQVԍ׋1-%ܼ"rFaN=nqRfi#BIڻ.'z,:-&Rc9x[5Xm> 1ǠaPpyl/ 09 Siba|}QҜ% G+wvtT{ýC$9IS 'uOV;Ȩ"jA1xjFh^qceK7R^ji.=!詜Y7+K.j12)ʄ-up~j+lUU SQh>?)/wB.le>dWNDKGejhN['+Ycor!-%)-KYOZݍj4}WeMȖٽ{󘹻+mwU(}vID2 D;/\",̻T$yd"{QX 4$yڅ+F'<|Y,1+lʷv'UiDM/^t Hn_:ֱ>s@qINĘ$F">3]1 MF(CVr!-Ph \{*yLf=DuQ#)}:)Hh20;Fצ+w9a!EṀ'ABp&U%rRk{Q"(tLQu*M<цMi@jm!!)&[V DFk[pduӪ-ICUS)7'oçC:4Q|l-“KKA9ۛRٳYZU:-tHLi^ʼm]8,0h>b>g8āRxg|n<`D}꒎T!ybVs|4Jظp $LG2#Fbnn kÔƯ;#YIC#S) 8|K+@y#acaz<>z>կ{ %n ȚfʺsIvG3•p!^iyxG~\!a C>nB743An1ܓ՜.?Tq> R λfLO@PVB ƛ]0V9XA7;9H 0ؘƭA>4L|!u(*T(yŏ|&>yבs {X7R MGGe%m㷑 ^{ :k8h(!AY$}0XM9ߒk&`J]Ym$0"qi#ӪKc:cA((_P<,/' \{_K=nFw<.k^*M*eIb3(&Nq0w"l$8Me@ Jmnӯ<6!>69w_ -ϼ!$ /Ҝ+Ci zߘfO$E}O>gP(-^'C\jKDQ7L|awi/&*}n78 PHe>+f^c~mZsFo6]Rș+zr3mW}![z`23&E|8M|8`$*DMqPPU/J dS')PC>@ 2#J2/ROxF$ZR(Y=^m*[ t-Dw[7~/z[["34nڷ~9tHZ ]|*ޮ(czܭ'@ڀmN;nj)ߐj{j/34SqkÞdE'Mdq|^37m)LTӺbs!M04ZeDJdO(ňH6rP6}"4j]wtxaTI*F7*,:7?j!yOtn~I|opB KS^=h ;c>K|^WCH#T୕7k7e nC|Ab[f4>CnDXvMpr3T ?S6Q$ilyv U7=>TH}^1 w[^&FݓoOk䊽zГ6 e|%GTEZ,C&ض睜8ÐWW7V8r,0R_{N'wgqc9(c"I2 $Lސ3K6ZE.Fm84 u&K:`:"㺙1 S^Sk*gsg4DŽ+f}Yרٞ}3f=:e_q+m=ێ^ 2"0u0]!%)3 $_vh\w-7$=^;?? Ym2Vy $4:;$iXnSVV732* `͞6Ġhښ}׵ˡz;(=0V 3ag=^J es؉+NBDx^;rEKJw)?ce|is^\%]JOi4yOh/,Z9%&A!y,{7mxg57w݁mμ&FGo6`?d]=6ឱ~hH $ftm-3HY<~W&Ҟ]kdM`Ra(S nL2?wa0`i` 9}i=L NqL ]LH] kV d xYMAIN:)'h-4Q(A02)QrҊ:c6i/,x22ي%9TsOD:d~nOR{OZZ- NkLoKD\..D=TAR7TlY5G2BgTU />}cRtKvk~;H@ 2N!BmVT=- r׾kqXZLR+A[|NRѬ԰+<>)|R~CǗd;M (2SP*Pv_U쀟0*>hބNBR)p?NDSLR?8y=|,*Iq6I~FbUn+H?+ D!yt'l]2Y7!EʫpRԀp~t*_ nj 6|m,jӅ n\=3zdm.l4e/.ޥصutj4.{a Z~8֯؆l`GW`!=P%! FvRcx^-]RߨԴట>*s@GyͣT X4tnho#MOy`h`{wFPWJxWa̫y~@++fǜlΓj37"k 1h&PJ-q7#/n>7vҼh]rX=>]sTLjzA7ڒdC%ľU 9 yP^o?e l"R2:IW zKXLNڦUf9eN+G? u;Lus>-,JtVU*&yq+,@]PP}[OT(vns3%L>ET/"z`ȠLƽ*3"gl,V@0;;VmQR\8K3./nD+ZgIǭ.2e9='4 BYՃ4^, nAÌN5{]ws76L6XWEPSS$mDLZedi޸Jj:ZrŖ!  c`m d+B#~ځoS=qȨڰh)3W&Nᢀ9iL/Q觅͓< 1>v0v 9AdRqh"ݙOǼjeisDܠu)/v퉊e2 U)Id]D eHB5/\>;Z+O=39= ->ۣ]"|i-*oo\~ Y_v-mV5ʒ, w׺ fI^`HMbʗG9൓hhk`m%FE~N -;qvDaqadْ> vpA?n۪M4 w~]C]NgU "D*3Ѡ} "+Y w!rZ&Eڎ8ٯ#]lyO 99MG,S'd8MFI) #YR6>5niwrJeRDv)A^ Bս͂&qEM=/N{$ݨK27wg Ģae]m^|#b8CHS5F%|=T l\W&K`~^M;4C ֲ8H\fM +}uTN eyQأ|UZݫ@Fǒ#jw5"0y{ T'/N$ 00%ݓw2)mЂ nHs"JkK+3wMC\ɾ抯eM4uMWۚ&͆GݰѝH,O:uxy^X Qd+͑2B E]&0c~<'I37b% w-OKiXTPQy.Q@; o, +}Pj#TV17NJkF[`~TV-JBĘDP}.yJOB_^Ffk>Nm0ƞFzTyB;Ro{ K}*)W Up 4{ OɅ]}H$N,|<[=wL /kg@|yÉ&`V3h-.cl+FlDy~mY?[0Q|Ymxr!cgJ`4&vMF݁m%< 0|L➍ާki0VyreS+:l2V@zH]&>m =֎N6Hw9_Q ٹ T5F9z˞ܒT@Ǫm'PyK)R K1 a5)##jXK?>yQOJ. Q̢=; _f!eQ5n( cC2djdΈ9[|Ц@mA|Uq6_}ܚ3Y6:' lӭߙ>o2UXQ߹J F *< m&ۏ/4yxXSm4o?Gadd߀I< 3! f.|F ]5%P@v >0 xr=)PS7?l68mePPrȾe͕h:%e}Pa*RfAZwV|Z<_+!z lﻭC* FB&/Hl"U=E=䭺mf!`^Ne%ʊA 4BH;κ事9=;Ηky18yM^ȶEzLv.Ufy~\nFم5dW!+=JBx|pô"vC8y%Q'EBݪqVOGkr=k!F&{ќu(]g-|0_q i|l2mלioUSYAGc?/(EYlξ&N'%' tz fMLPS8< DeTΈ< / szuHIC0|MUgl =g:{ dmeRϰL>~(maKCj6 C9*pR7΅xN@=0򱜜:Kj W37eSSԚoJ%,5hv[OUQvNr V%NbѥskK6vPqe;H~1lv7Q/S]`QZ4bF᷒cS,UM2W\k#&< ziuv9-* aURB$U&"a_Տ,8 wTU5c\xs ֭j KGʅf &C69gzR5KG>-6  eF6%D9绣TKN M xigNmʻ3VG䝪f)Lfc )sJ)HcDF,;A-HiTsfϬ|Q(qQy{=Ko-8 ~xbX t EkE~.:@JPMĘ G4wbV B seZTiaVx e|L5Yh $ CIDI~̓0]ԘİL6X[oz%bg@3,:F'W>8hN{S& F瑲(~׮&[jGG/heHL^{/jl9yzZ2zmeQ5lfdTMo) u@nO/#;wр^2 ( i߳N? GE7GVr _5E!y:K#i^B %l\3 ta7:oFANZ ѤkN.DÒrv=fkH:#'G;KO-0Hvj\nD\m7/ rܸa)h!}oA\~1.{@cOkTS`&ߪb9ztVGcf8Hx}6@f-w.p=Ԏ:#{Eᥖ\:!hj0aYԿƜC}GPAY-%zb'tqkfR [пGɽ>קmwun1JTEدgMb +=#dհ(mKs["Z̉1++XT>ܡv \Rgqi4*F r#Ec٧Y)^KD&AUu]ڸC͑c,Mr]U\t*]4'?`<(9I;^7EG3/n)cUYCYȂ.R Aa$?{jDzT^]-g)}Euf*̍ _@;hg 4{8b GNr&"⺈F3ew<  |R84笲d>W\/@ *6q{r̿#م7 j%6v>fuH T} H,~A ^'׽k4X@j>-\i~OGg ރpW鉨#Ϟ#Dؽ2,sb<)j Pmq'> FݤhJǜ;# WEL{>f ܵQJ̧숶ECb8nxR%s wΡ:ԶmUq+u+P^QO6򘂣֡W3 egn)5>7K=5˧1xA҄Px/dSϔ ^=ɄHOZjԮ!U]A'475K} P?C:?ۈ]N.6JRbϴXϣCCɉe!@XѠӓ] FׄG* sp+W}76'&eFhq%pqOk5>W4J$(N6*H8# B}MvS˟ʸPgeJNq w}l^^Q Gqۛj `T&jf0MiQ3{VJ<|X:|JhBy MVi^'Ygʌ̢G$1[UR .Rّtu} 7/ znd2$_ͻs| $ endstream endobj 665 0 obj << /Type /FontDescriptor /FontName /NGBPKA+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/B/C/D/F/I/M/P/R/S/a/b/c/colon/d/dieresis/e/eight/f/ffi/five/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/period/r/s/seven/six/t/three/two/u/v/w/x/y/z) /FontFile 664 0 R >> endobj 666 0 obj << /Length1 1362 /Length2 6073 /Length3 0 /Length 7014 /Filter /FlateDecode >> stream xڍwT6 C% 5tKw C *(!%(H7HII[ֻּ}>y޵YGW)#^> p3nCHăP@ M43H@$ @@ D!p(HDv7 n%Ӗ $ ..;$Cm!&sh q#m0?RpJ:`0=== .h>$^ 8`hjq2pvO 0ᎀP }U + {7 >+;bktq {Vxax@Fb!3 ]9, `wŠp_-Je%TC`Ѐ_)Q0[{#v"n0Uſ = "" e++Sہ+dma__4 a@@b@60{8X3;| drO{ep|u4to< +,A؅?@'Va{M/8 \ZH,ka , SwῲH);;vsn /KZw VH  5<>U +9/V{:pҘ3A>* ^0|Xa:a?h,!`XH%-K`"  `G |J¼~Sχ@b! ls ;$ k`Q/ymQ(~{U ylH[J9:OQU\ӨSRT' Cԏf8dg.|޾! oLm:;7ےb 5]p3 r{{M=]T'gWMW羰Uݵ uX14,^(~x;8bRK5[;+5Dـf4 x}w}Ԩ'} "䌍>iZ[6\H'QD~#Өj|.jFgāS&g.!ެk.vwh:`-۬˄}eMMb ܇kĿoJL܊-Ma _w*<1a`%vL/۹0h^ gHMq?>ur'dp%_W!U9x(pHF3!^V(jr$g)*ۛ{ miHIc/Da~AJxѸh1xvjt3@.:.QrP>ՃliD\fߐWrmGڥm7ZW5)Q[(37mdD6)t5.|\C%uX;\'. ʾKfP G zA|ť^bp5}ւg׆̯GӾ~X ΕHVI"DW:pYme α9棻񙚑ABׄ܀{Q0 "##g:Z ty[j]fʼn>QO~`|Aҧ|y ֐c˱wNwX^Oqy4:RxmOSVGcaGL.נ{6h%$b'cK\:Uqam R9]T"il#Թ@Aq/Mʬwlu_AoZyx6kf!A%ca7n6]!J, c;C1Yi;:IfbnfviXnaB5FiJ['zIanUnj*7wq*q끘F謱}܌·2cɣkq,eA Ϋ_PP䐜A}X6cg?j?Zu䯚JzFr>/Qrdsl4x8u ZH NSLws޽O?(  ~$ ު"Ji3KdYdIhkm/=b>S񚖥kAƁB$^4f_|oL;g0'][ߜ\=ҜμJ뗿%T}[*Yҕd \qtx1/nފ3jc+k@u#dHߍ)\*Eը(3q6m9J!o'5ƍAe-{\ ׬7luzr],Wģor3j[Q?֩g:$OaPA Ej]J#һ#yLO&^ _̔~ʭ^BX|S`{C t"e-0Fݿ|pZg`n1!)E1 kŧq/I;NB΄ոU`Y''j>:}a]R[:x<4E+HfbC?Qtfa$I+ ZKPiwE>ZJotE%?2xiDX~( 8)B )]DVeBiGAد ߋPKzhiZTV]s0AzIe:;5Ϥ=hC7oMM_2^eK77gO~P2;}L剮,:%  ~MdlwNy'p-cӖ'⣸Oo=/"/ IԸ_>M9WHoU yn4AԆ6,PYoЁ+|=&#gtv ^1M#5?aIs^!|'5Zb gJBV%l8v6ȫcҼX GY R+$ңS'SQZFn{ 9zOQ+/C|gq?nv\|ԶeVWm1fLۛXi:;~4Ŗ%X GSTphGL9wT懶z,ݼJa6[JY!7>hZk.Jmڽ2%J |,ǘofcĴFkH\fA`h񮐽AJwwB%wO%bB(@w yKȦwɓhe\kmB2D fI[n.3sӝLeњƏ*?V/cHYh:넠iVK症AiS킚^e&I`ILI\ID }.EbaJ!7M R9~"ۖzpNM)/hc !kfsqm6e gN!̟Wm*KBăcp4ym,n~K[XqzRliazVdrHLJ̦"{@>;6g> UDZLV<ТfOO~ }}GDQpvzy ˽cߟy 'TFl)Ӵ'S oK_ϩcٹ @$W̅OV(ڸZc0q00SdXVY5S4Iz0Ýԃ>=ZZ~B R޹F,a> KO%Da| <_̽#?1<-ҫph%(Nڗ륟jސ}Av4Tp@y)4lF)t>>cEg5N9qOc/Do7c@q0qv6q9EMv`r a#'i.]μq+/ t U̠y[efA 0G]eUVeSQ1RȢ~2*XkHXo܎6 06d<]?YaOiPlYv9ʠR!M1n:.SL.V)cV7fS`z5c0Jqs<+8a cw̞p&DdO= A.~0׍VIq\ݼs.\\l)RS(uMm{EGEGVV|A_3VD Y#b U`;ntwbn[mO WcKe?y2z>x)͜/Y Eu\03HJ"$a>+=82zW*;c!x(-U<4 En} R\;=Z!di!])kVۧs\!hf14s.u QlQ?2>~6-J-S#8Ȑ&Aw~`x߀.Fq3-drOƏ9ս;~+AˣOu/RdxwBRg{&*Ad4D_~)=jgsLWEm3eׂ;>1ķ3C.> 2׌O:I ȳÏz> kμ\i:8U"4 PuyY endstream endobj 667 0 obj << /Type /FontDescriptor /FontName /AKQJMC+CMBX8 /Flags 4 /FontBBox [-59 -250 1235 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 122 /XHeight 444 /CharSet (/k) /FontFile 666 0 R >> endobj 668 0 obj << /Length1 1434 /Length2 6651 /Length3 0 /Length 7615 /Filter /FlateDecode >> stream xڍTuX]DP[Z:sbf$$EZAK$n[}y~sk9kF-]nkTwr겆j pXXDpXHW.9$vBp# ŀ@(ȃ=`u uaC8{#avn;C8 QQa'(`7;#@AݼU]Yӓʃ@JqpA ',]g' ADhjO&)ki n CxS ri;b*wOAssaw[=#nUo";U ܢ<Ba0/ bq# B~=5n_[An[vAom/ H$o-A t+Nko>xy퀾͊x~~[u xa x]D7[n@^P8"l_\V.Cɽ:'=*u@9C܈ ѵmw75@gbUwm H^l65[ím)ju9kVfH~,f~2RRA '\tuITw`i( |xN5S◡K:U;}l^ǝ}]SEUz Cu45)6?"%^"ܷEQ9_rQ!&iGū^mWjܾ,֮Vp;ݾ~ҦHZ%c:vr.^R*:]P /?.lO|I%C vAg5PB[3}쀽r(+`4LJNkt#xѕаiA+)}H$<7[pȒI ;b>yɔlt-lup,XQVVn5cF|SScM o0&2aw_,ܩLB eL٤Da6"Y걇 -Dg PQ zW$H٢?"U zL4}X*1ҊSҕpa> ObOMv˳I7ۨ$lDWdj$EfAEU* ɖV6eD_CBC|({&9ah'J1WIt?d?3-)܃43x'Zko '}"a-)AgFJv1g^DUdZ7sNBNPFֶqiwmVcQPMPTIB>m6= HNjÞJ.JÐg -805pmBZpզD:;FwcCש|MԷNu}LGG6Ԇ4[%Z6ȯEۥ "ZDzh􀊻D"8 ?`yi1q(p&#g,#$_РO .@%H<(,WWZY< tZ!Q}upLsg,]Bw<-[r@3-^;]ls_ [n3A I5Lhp8fmCI,wsk~ERݔ1/0&t}IM{$hҵkAYZׇ4oۊXZ`ZwrdH$! R?.sK3Od>^B <Pfqb%+#>aD[S%OBUQ ,o*"9FXBLfz&Ӝ$X6< W-;AcgXnZowKgVׄ8ᡴX YӞCM~Px""˴2|+1ouW%23wtrIg.L ͚ 1󜏺*ZN1H?2 A*3,b0Bx%+%cJ m'rOEW4Xǂz%7w ҔiKÖ)^؈uU~Cf #L'=6LFH繫?"^QqAkSuDG)iŗ#sԁKiէD+gق-?7/wYӝr? \QOu>]x.&$61G 1S3k;^/5^ģ̺C{7IvABӼajs1̊KoC})xFze\DqT=/zU^ۯo7"$[g>,`u$s6$urMDc"? ]& c;,R?`WWl\lż@t%4xp1텦`Reˑ s"|i8GT˂/$DVtYWu-ĪC|DφVަvu-!hysaǛOz>z /^U=vgE -kt}yI #{ۻb+DL_=@c$/k YYL%,^H\je#w^msG,8C]adTu=E٘>;RqJ v_Φʟg5SeF]9IZW6S},.fx/>Y/0Y*g 9v ,ϗʆf5{~9h-hr fKJKb{Opɗ .lߪϗЂȟQ4d2D7XeQ=J~\KALXTStko$Y]nq:<-1Cbu oSnoG>=l-;@Nji; \gwlykKW iL',Dv*OP9zB4))7U[x_QN\b׮Q ~@)ū_OEsLwoR?-vszU-u=/D{Hg1dV.<\cHь!BIV<.'-CPɅRắf:IЬ8?'Q^6KFD=܎7>2 #?9jvgV# jHaW?9 "-\9n 6KNHpDvibv{ Zd9汿rZ4y771|to94W:v2eR/^U1"f2Sㆋ#gFuJf,IQ^܂XSұM;f~t豚gz^$㉣n83Xu'r}ಭHx#C7n|H MW)"xh#s{}7|`O"/p}+[V&ig h[EݨREu[r@SN<Ēe4ּwk;w;W>t%463?tN)  nؔOHS*pXQՇIXO^rMvs$K%sGLh1W1D 45\l\/$3qK57NOӅ+g۹.:ݽtS%ȚU9 hTj> ť6Dq覷NkR%o{=c@|~ez|Cv7:1 ۪Ӣ`LTڻT{}jFd;oڴŤ[OEfyWe~ͨ$yqEMzfl%&I!_wu M!sGסbWVb'@zvS*2(`rѾK WSoj.UU%]Vƹb`[u ]DS.Qr|bCFx#;릻#>VLGpӞl`T"݌+ƕlqKګ󌲲UsʰDSQ+k7ALىZ5`ARa:*q̟Pd6M.9ߗI,i,Y zs<:yƁ X _x>5ee8HWMpm:|;L> OXn}a$ZziJ2qO{߽M(}.­{{c=3UQ=H%#ž}#r4chl7Ӆe*xgJ 5#.KӁj_|w=MDeg⯷ϱh f:"4]͸h ]'0KX g. endstream endobj 669 0 obj << /Type /FontDescriptor /FontName /JHGHVE+CMBXSL10 /Flags 4 /FontBBox [-75 -250 1278 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle -9 /StemV 120 /XHeight 444 /CharSet (/b/m/r/s) /FontFile 668 0 R >> endobj 670 0 obj << /Length1 1754 /Length2 11627 /Length3 0 /Length 12732 /Filter /FlateDecode >> stream xڍeP\iq `ww'hݝ!Xp'8w4X|gfs[]ս}UMM,f6J]YJ⺚rl66N66jjM- 6U&ijȻ9<ll661; $M@%<B-vpYZfG=Ow dfbP2qڽf43h@@ A'd @XLYNL t: P6 5@ Jl1q^ 3󫓫9 !Pqe?`ga; l`bXliEw&&W7ś&=Cg3'33.YzR`;;3If'؃!^V]XA@9XPY]lll#nfGM?ů}x9}@/g7 o ;;d0ZQ*ZůSr!;OFsfϋfԐS``w3? w$U*W'?Eg( ~` 7df3{b?]_G5IiA?&?63J׭ߦ:Xlkur.&[!fo:\,l\A w*Kق쁪`gW/6{]63x畲7t<''~%nvh+=ڡpXE<VuXe!.?`U8'Uz͠Xu!>3^3M 6kV@׬Dv _rr \^kn݁f(K`3`1"w.k$RnjBWQbݳ{QX/M6xl66?G -5[0yOb8vVtS77٬>gr؝<iHx‚ =& &C,ZVlfSRi"Qr&hg#4#ᴃ^w ƓRttcU 鋏xd| uW1fWtkcIl/㥣9%vZ0y@{2Oe",Q )si3V=NO'{ǣM[᧑^σ%~+F2/Vǣ)k7gr;͈z CR&sTY~P7bƯ060‰%cl<TF!Ã@Oi)'(-S΀ ?YBT}tٌ!=7ot;B !k=}ཹM~|֘$ փV@mMG. BI|tJhcJ⫷+t۾ ϴsiʻf $*6Y sU~cF8PN]o2uֲk 7Й mY\yƘccI!qf~)Y!s S fdz')V2# }mUOU\PsZzPm՞Oq- D5 O Jѐ20ĒEӨ4%{Ւ')1kcՙ%_6i`;@%d: &6k X*]/ `9gհL$:B~a;oM~Z$Zj YM0-Wn*26&[H%NGG-Y$SbxZO5C˩5ޥB2ux 6!fK$.&sgiv8rdz93CQY ,f[#_|ikKu%)m(R7mV[>ۿpuܱ08~Hr|LDaBJb}h zՆJܓhգ52qGdFk<;`+Z-ڮ<|4֠E[""j?{n=qc0U4FW0?.Y#CW\d[ i`ӒU!h P9X<UG mcI=9m![}KIhz`K 3&хOI7RzF8__ߴUq@DR%aNXb5m]E9Ey6ȢҞa?-oPӇ%щ w MT !pupj%mw"/UVsƄx rF]Vr"ic-1DCo>ouw0B>H^V@{p mR㙦c5#GWTUw8ZHŸ7y6V9:)m JdfIs8g,I jo 4(vRS-J}[E4I7Ⲙٲ/ Cˬ^4}3S3QؒOTj}$m<.v|x@Ma@jka@'=J'(]RC 9#K!$|z8e)u-gӽ xD-HS_q|yLW=] $ݤUoެi-/J]l%v[oI p:9 Sp3,X!Ot߮!n Y/Tݕ=i4!鲰1$\`*Yù}z œ{hi<`j3AöE v"= m&b'=%O'yRAQf; d<5rsFxX7(:[ϯc@hn&N˯]x0eps\OE))WY)؈͍NDyM? =M?i8L nȖ˝jf咗}w.ڱ}Ma-ic_ѼJ8Eջxw]_lr[a L >]3j(շ3YVnI0噠Dw׊/?91 bIoD.w gvS'F;X:˅erTg'ɯ!Nm(D_Wdy t}5T`z⸈l #QnV{*/)>Œ@G2$W˟鵘ٗEhxSgՂKfBsDt``?3,*~RS5XDщ&c. 1iC_gf9uKŎ0aRfքJI?HHjdtX ^g &薆{@ԥ[7Lc^̰J%1z {TAvB(%nR~x:qڳ79S,b޴-m^A}t.B_I3!+Cf9,7Ӝ%ZLŸ(ox4ל;?iPth]8~i2 *tЫ-*'p^[k'ts! teSDuV&`9׈SeXy}Mʗٜ6)y uvJv_cqS:JƅDF[uLWNS4iymT57Gg^4v7V sL1]>" ,:3 DCQ"<imq!c8㛮omRل%lǨK3ER.؉!nW|kT*;`p$ %r[k8h߿1aЁ}𣪤w n;J' [--l?nm.KʹS n]fnxPhߕmA]XI-56 '7eYۃcy~YN~/lii7(up}&:D(w_vT[jZj 0]38h #|y3IUD< akm l\ݜ#5V'M*#X֯}Z-gk 4ەhJjew뜢~`O1&o|c YIuUfcUޖ]&\fQ ]o9~܊Ĥ91[M!@j$BNa+cXUAX cAeJc@3 c) _b,؃K$qB=K9=QVjgR=k[UlCzOCDMkt`/kUAe/Ru/hn uA**6Qѧ$(=LXFSߣe}z֖[:TFl,sTO/H+/AOsFa3Tf[Z-M97%I { qgREhNi܆_w,Ѓ{v &T_bٮ>L51{S{Ap #ݾC̹"=ġCP hnȾeW_pm32ZC Q~d\/^|58O ݣEq ؀ vq :Kt m6JB8YGd}sq <Ĥ{gY #nw d)56Yۂ]7b߯6V ڮŖ.;BLݛ??ݱHunԤv7-v!YԼoIIʈ,m<`c mGCilE̴nNT?zB}ۄq;\rYoJ9jI 7l#M39"?'eukQ:v[ɺQ޺_BOhS:Nv Ǧl~&r++$wK^3*2hm ʆմfӣK7TOsAY\lcFHp+L]}֮ᓡ14[7TQo;0 3bc `gX`S@o5\%rMU[ʧc&D 'v 03Ճsև *|9HQGۙۑnA*QO8=ot3{Iyb 3,o+}g`Dj=k_bTkӖ{1v2{ 0̌,.4Z/zF7@iUxq:}$Btu߫$ɌV:us?_nezV;ΩD"Z(dV`LQ,c]̟xͅ9Zl/禐x8f,{Jaӽ"xT)u['"0p38mvUzmsۣ!]5>(ܪzP\PO~VQu=p+uϨw + H%]- "C ߹Zz6]0nO<9A\&;CNK=gUn ̲a~GՓdɭ{!vX+kb{eM:D"6^6z\ޏ7@^p g)U2+JE{$6?҄f:cě/-1_ALO"oچYm"#B("k;$/[<^Y &Ml8⃤VYwn]a,. L(I֊7N8oaRY'mH&MfF9YT?\{e|s2Im\F?DN+& mYjr;qN9{\k$Y>cE|t$pa?(?ff/g+JU qzeeb8AKHMEA7AǠU >ͩ'1dNn Bx-̮r٫G:@ 58= Um49_+bT/x2o_bPp2D^i)$ Z˚~vM= S,2φV.Ÿ[%5,ɮ}y3%Zl6i=xQ`dMxZq3 p6>?OKAkf[|{ݠJiF3ukat<)\j2_~5E/NO۽ mSЎD^b. IRjP8iP>)g3 jp&-.er!GG,&\TG[Ը:\\)bo{t _\!v B<@Α=2'N E"Oq`s>gEa]H 0\M'/ ܴ Mh!d='1^y_P (gIkΫĠ?^Vc;PKX *3/LҲr7}3lnO8,|%|H"Uyv-u.45^St)Enl?2x0$$ӄJ:V,x';Yhoe XYYa"T<3wE$r5@YUv@4ܹBN3p_D՛ª :qi.%#.r9D"1#cI﨨[P WbYRW]oXRb;ItξϫDU=S:2' tQi24(!.ӧAGRw*8gh·Fh#,z(4..K&|lxpQYyChOx ͕s(8R 5 Q0Xb )Z*HӀx6pm";%*⮬^2pakʌJVZ<$5* 68ϿF4b³̔~gtM nI8˳#ǃI!Ws1/v_Dg4G4 XI"ExubTs=ٝAt~9BOzdqBwܤR.P6=D׋a%EV5Q4XFT}<+dx[(kG~NgY3Oܒڐ]~.v^u؏2'Żb U$vDբGf 3r6*/u;M1O1 M)_~udV\J,[wLut5mDg2l:<*4#E- 6@Wcltq}R5[Lt7:cǜV7Y&X<iÔr:yⴏ0(!)MOtO] bR.{6]2rl wƱwY;T9;| (YZ|;x$&} ,.7D=⏴>A2V ~s q4\W_sWV;bat-F)W Jݫ e5ԳdjN1%8) 7; ӺXS&A Q`J~b :V2LY>2؀,J#>2oF̋r: ,}tv7\TqÖD fL8P^WaZz) g,jxd<1Ăݱӊi9r.nj,^7[:C{HΏ9RQT@ZHa=o7+Fa q-*^oIyӥuKpKNέQB"cJs {%Ȯ1hՉ8+-Qّ; Rh[˷9buQSJW~+ ~򖀢 3/2t)uS 1nb=#g0a8!='~'tqáu8e]3Wْr[LFtldz^'qX4w$\ߟVPuPs`I1|-j?*e>le :ysHHwWM4,] ~X;uĒ_ܾF[s2+-[MشRH7^:p8а`}],Ca{rNs ︺WX'ZK_lUFɻh 5ɸ:ȎB{X.H:=~HQoY/-_L C{a #HR@4quCF)7.b|%E7x[z/){R;+U?R, Y+M <(H飳p0tWS 훸1aF)r .-:;tWln,᧜g" ;~rq#טF=Yq0 ^-jxnPan]6vqǩs>ߋ0)W-<;vWtB>dVBt1o@Uz ΢{=CW}^ܝէ߻l^`b}Ձ>JC5Da=DnP)Mȴ*$OQ:юKwb=ҴEP#- <[boW(UY`:@ˠ,;BN.xށ꫁j" l6';+@0E@e#2q{X:E੄;N'Gȷ5)NV]6vryдj⋻򳆔K؁W$oU݀J< 5+j牠vOCXn CZs V Ɔu|g3ϵcGqx\{o_ endstream endobj 671 0 obj << /Type /FontDescriptor /FontName /DSJFIK+CMBXTI10 /Flags 4 /FontBBox [-29 -250 1274 754] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle -14 /StemV 107 /XHeight 444 /CharSet (/A/B/G/J/O/R/S/U/W/X/a/c/d/e/f/h/i/l/m/n/o/p/s/t/x/y) /FontFile 670 0 R >> endobj 672 0 obj << /Length1 1753 /Length2 10186 /Length3 0 /Length 11318 /Filter /FlateDecode >> stream xڍT.L)Phq E ;  XIqwww)N[܋t_ޕofw7 & $q3 $ll,llttZ`o=: 8 !uR@#PPxg` 8BR@g@q$!P7'5 v~~7AN`s@?hhB `á...,@{ J  h` 'gw=XZ`؟M%<* أ; t@ r' Y/߁8!P ` TeX7o y:v@G2c3wC0w6"_`*G 0ݐw+7#wvv@{_G꾃?2q swAwkA\,l\0+B 76/_1^llc{2sk?M@oT9qpNN@7?J5n+x ` qB=h>o/7UѦά@;5  G`}Zaۇ1DG8 i%Xm%>F'wVppXcQG:B,A<6>p?1Uxl?c45>wNNcgM LCm[~U0o!`)0FHkfe*~]ئ]EřSZ7 f*-+*釋' /ru%(z("p:D-z4=_UwOp ëԢQ!S_goUd֯}F*{>&`-0,E%PzKr@<?g#`8`?׳ ﴭM~ֱ"! /}f3 kyZUʅg늑R=Ы̽Ş{y7:"zq=<09eڗsRX *9%g~ýNt~׻wth;'5Av+ DoEST}ن48맛=^6m*'a[{1cW؎l_>kʎ`"A3N+2La,*6 NuݗT$Y]m[jc`bݡIK 9s)#Թ$*vVPښ2>=M۬|;] lx~YH&lʣGƒ3XN7&=dv\:ۧ[&Q &Dw$]0Kct_ZDfs4&6qY|`*c0Dem2M5Y܉'{uPHMfI6Wk*#-Ntpo7;T;uwxhYvF弟E=uW^V!n7k41LӂG EVc '\zDf<QM#8AoSq¡;MBG6vt&gF8ik_r6lJ>WZj^;EO0jjD ^)Sߥ@_(Z<[{1^r>"Bj:Dg=A kޢ $&to o4=q.[^{um%2V!ijL% ej9lT[Vq:hg5-{LFV|,mЕzB,~zXr?3v*:Y`}y[/׉B9ɫ$z)@77}gϟ,S44AG?z.`"uڭ  m9ȷ7[-qVYsyʧ< &N/,|}>s+\‡Ni*:Ty}syQGK3˧B"‚đ3!AT#FT M2&r$D)mv`V~D1';2EmYX:.PWxUɱ0]ϙ%&TWA\۔Wk>5tct m~POBy򚪟c@>?dZ勗2c)ϴ``I"G9Hr'Sy*r![H rNu>ZfJ^"#ܶx{ė.yܷ4dI3oMDT$75/S"IX79flhtv"hO&bAlѤ@L<7 4I)eQQP0 ;>{q?3,T_yh.\4Ha&|ˮ)P|v!t9gjf#H&^隇iJlΆZ$-MoGK7<5"@I@valK9&+ݰ .'p2]jey =Z55n/L(8)auc e{,1"0f^!,ntnoDҵ].7lI᫳bARh4|}rOjNaH;VGyq~ W[3LZR%To1Ox$?ZE7^}%=vܷKLw~o}NF*a`}){&2P(ƾ^_ E^ҍxUl°f_y/mKdDJV%Si ~cB{ ,Kq+bOxʞ|yazOk@% *}HA_4,ɐ`&uن[\DŽhx)Qež_aJ^9>Ԉtx6\AދwE>ҕIPi6cx ݥa }G_5\c~qEc@,%GѼλPZp_#aoBC[nϓ%IgZNwET_vZkoJҁް Rj*\ '4I/wVli4s=0 P$;kJ 1&d$}>/]]ܖևۙАE%|GŪLYN-lCڋ|1g;@ B2JnzMRP3IvǝW J\Mf{>,ZWT J&§yޤURa<+U zN촩R2.9~I%f# V6 Gb~/2~H{R1ʿ,5DkfF$DsLR.*jhh )QqgnR?ڟěE=]qM˺@'̢}/.F&ֺO:ϊؑ abb$"d?5.tF Sm zR3g;ŝbN Յn8i Qb1g:"ʎ{U7MU23uJғt">>wfng6:n]*֤#Wntח,HD3Zk,z&B~ /D˗Yu B<`Bj*չFT f9DNTOJs%Z-$w~\\2k`2o;%"wQxK}BbiRǗ{풺ꩪ{Zn:sl6=doz+kaB:.}㉗TLT12$')jp}!%5Oq}nQjbe]`Z4|J/ ,2+ĀB p-]U`#.UWZxןѿIrJeMj!gEGC`>ݖ'H)5-ZH.??CJ۬yfwNtÿ֬>)YD *>2aF7v3 lM \͘^Oυ{m -+BI,Frey{r6s5tLkfBk{ܡ-[͞,:M/M?o3>J&N1.X W^Rr2k(\ZށvX.!:MlK`#% zh&u$KZ/޻]l_y:d'0'VR~fri!]@ N$x)l¨`'RLqcNAWk_!{/dƻ0 cTyc{őqUv%|L{gFSW73JH>"y۪XJ94 / ѤXy̸%A}" _'kJE"=GׇqxfJy;AtZ܀qvjv z0=ޯļkZ[oHyf =͙{geQje x$c9&C:Tܸ?z#I+25O}j̎IR,NBFoIm-)'?b'AՇ+K aK?}rƯiJA1˼_wYPg\D]UKa}Pj&:U t4Cҽ{ԼDӈ ΫСֽ>EØ\c?tEcXڱ ~M'%: 8Kʩ 6D Z0޺J:Gҡ2`+y$>jń&X=t*IdQ}*|b';tw "xDLt; P_ĚεGJ+MI3j͈پr\Z|(\5xWeV;3Ȝ2"7qUIPOˮ"* R겠.[  )rhπaCsW;qq,':Z"(+@Y+눠U#ҰhgA2Ob竽.\t3Iݒ:ѪaQ]2Ş9~~D{H:q_VY}=kb^Z#NDMO^'hbHͯ~BHqK wl< Fͪe\^t-M}]KN B/I u: ~dK *Ĭ nPwhk:/2XfCX#r~,ѫx1PruIߙ&_\t³l B:dBe)Eb2Da$L$FE=y}^E( l܉lS} Ly(XI7. sT8 +-2`V$?'L&-K-7XfE􃘫_ݓ@\a8A7BuHLS*'}iuDE;&pᒬo'\:C=q@msWj? R.I 9~C;8y+6z _'ށ 6D>c W.%AGZ Y}b8uV `͚|dϐR5@8}6\W)r2{Do_] RU0+eȠ{ `;#Z~U ;;#Lǩ>k7<`8NG.DO%Jg!> 5FW'^ɘ{s|jN΁knyexIJ }rRL㼌pM o *A9P0Hg~PZqO^&oΓrn0IMB偒WV><7#vSmh/NO?e3sJ׏?Q1>7Qn[z%x'Խ:v'.,06bUpH IwӗeaHÚck7Vu b!=ĺkXōP=j@FLǽsOM^܏{%xҦ,oLB8ۓ4zTBXe-Z& Z9ޑ)rY/yY;6;I(IS ,ZBx@v44rAuXe_ 8죞!T"B ]q6˲;4\D!nf䓸$c.aM\q2e|WѰ]A%ܾ{ JPZjN>YҊQ(-\42GZ[f{7Cl_>aEkTB2HlF:o:FI򄟅&i^/oGt4rAo>Kyh(~ڴd!F>4%Ha4/1pBY&\|I4z ޯԾ,QS|^;$@ 0X'Xcu ey~tfiA@dw{S2 za:tM}&UQyh$@~4˜/ߴm.ӉSdcGg@{KWz]ܷ{D^W魜opk!f \xb-![X_lլnrWnKQraT_`Zm9'Qta 9lBE:k#?d֊5r4)c zܚ IdmC4IQ+bÕ+^Zm)@2A>gtMM5YeQ5 +8vp]bW9%|nX/\7Y>;ɪͦz2Pudxm3LXQSPB`a@weI[аVw=jr2!tffW}xANʰrg} -"C+MeDAьfZf=w<>}T/3DttodE aK^+lMYB&AּC$4o&4!zi!Qsv檫$~U BXbZoŗwRn' RwJ'qmhU{èBghޙh}¹J|KۼVټhʥ4_𸩗׌Q<*d5sèꦃ,Fj(1+#>h]nGu;hdbѶo endstream endobj 673 0 obj << /Type /FontDescriptor /FontName /FULNTH+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/D/K/N/alpha/beta/comma/delta/eta/f/greater/i/j/k/less/nu/period/sigma/t/tau/theta/u/y/zeta) /FontFile 672 0 R >> endobj 674 0 obj << /Length1 1416 /Length2 6583 /Length3 0 /Length 7555 /Filter /FlateDecode >> stream xڍt4!$Z%J Fk^ Øރ-$BE/k=HE'{׺wZ|{gww?PGe SB!1<`^@^SSU @D,,p MbsCQHwA1Xi5w, @ ?$/ M 4yj($ M"rv;`n sN:6P$@q9cO"z(8 '/͋rx1]uG0P7@m`H46i s`j]`?`?n߻y.7W!8w2EzÑ;8VxaP/ FaP8j P@mwypį~޲"V CbDSlgNH'aG݅ wu*`]D0HDX@Dsl~v\v!`~p; 0n0?El65$Ouf. xr K/[iVb^I7Tx( b*u=E~YhnjJS^< NO[epWNg~FsDDRBH#}ۊF<):Gn[{^ <,_aC4ݽr 1V)IYp2*D[G/>@HһZ/\ A.5kW˂!뎝׶|xi ce<6'#z?ȵ}=JyVN8'(-K)2"CzGesb s'@ӾRG 7e˭z9@ Vf. =mCUspjnPm_1)wQ7ru'2OKzr25{ 콲'!9h.ARS|V0Oy\傰 pm$ĠU y1"Ku05-1@7-u]Ɍe~MZ^Sx^{ϥ/nK2ᨛqa -4b_n$>{5ic֡Je{&pw  !yZiNMbw>+߾x{uwԼ cvb`?ǭ;.po4[Tq~| }MAtq s4hU;}yp~W_jYN`y52`k-ix١?l~YFY#ޥ1^&!^DtQN͇YXpX*>,{ۃ \6EcHQmheyNg;2a u-aʵ?-N:5jqm|$RMoBB$(roI~4+ &}ǎ4뿸PξWXx-2l2\gnvVO]һCXZܼxEK+ʾvҜrڤBiYqJx2UEL\LWOOh'SO5u&I¯yγeStrUz :0{۱Jk&zaH-ՠ4 ؓWN+oAXBHsɦ-+oa6NO?cga,81y'f@܉'g%bHJ7:{U^34K2(0al;(j=yY-*𡧞]gɇnx-9Bj33}qyLߘizBXd`d.Nȼ|ִ;>~ ;3Q|^٫ b6hVq>G$vVI)b;ۻqMx7{ 5{ЛƔ|+`պ Q=ٜV3/|FÂr-IB-<I;_hfvaI$:Me㗆~v\sHyy _Ȫ=82A*.^""TNK˾WyG"D @U3usE iT|Pʌ܎h3k)$+Dk|(G?4yx/ Nkn3.YLXG Mm -2?Bm^/a`Y\c>B&5ꦧjN%k Pڠ苒4J5LaW2G7eES{a<ry2&uĩ :4=wsS&lۑg, !z=6۠F傂uٱuO';)["h-ld^}[ʯsU„J k[^K:ɔUͬdURIUrWdȹxX  yJ`_--L{jR_wU,qc<#rx_V˳u}ka?ְ !n *ߩ7&*Q3CWh9y0}K&^Nc^klybi^׽ʿ a&dKHBe2•1UmvO~qsc\:-zosP*9Ze PHmKg|ꮻ~Xl-Q|V"_O]ԛJAGZN )CkL3[Yo.",cReHQR]J]]ۤ-RӫO2?Eecz34bo$^fG_,'x+S\0=U1Z>b,>L:!_m`Oc)jFB9uSo0 ]]{@5.FM Lj% a:Nn&JuH3%B;D&Oj:D]L3 H_Aݏ8DvŸ|B)#+c/̵'R_nԂɸ"3ٖhe|`)E|W*P[/6siV (tP0ULfh=l(˖wTuz_F@śuHʎe=W3 'cM?R3<&wӌB+W~r)(PP]f=ދ:!-/]Xu!zj̏ n-S4Qq VpPt_p˕ *ҞP&U}tjoV;SoB#sH+]ёL ~PZ!@*`~:o5:J @AG'9wKs(ǴfLcyhIŒZ9['Щ=%NPASp[;&xP|/$qw71]>PEcLV`7)OVserk3f${mȾF*Nڗs2\`bĔϑ;HXS#Ufd#RL4ɢ 8-c^k/i]+(9yR N\PgI+;vGbrd_:tI;QYNһ fΥR mw/0^̬g2 EuGt}%5KС0})2w엊X-0m;6[Ȭ$^It3#*zI߱xAʎׄfK6U5eKҙ4<(.H/m;Ԍ"Oc̿\`kn8d߯G'0Rs>}M'*_W~\gT;r׊,ˀ^!D,M Qv5~|\YbSfLY(Zkmʶ=5kE xe.p ,h/D:وHPSE뗴\#\m"?ya4Pkw(:GLi*`q<^ŵ9~N!~L۝cm%;ۯF&=ȳbS"V=k|r-eaA&f)z/ y5ٞy~QсKF)^'D.s"e4=*s/>Ӌ bxgƮP*'k&}z˾&^ ;BvWzDsm}?c<͕!ԨH=Ay]yo4;DNR -ʜP?Ak2}3@gfR;&`[_Q!]jC_xaz?\qS=ν|M'rJ%OBI'ִ Oٞm Mڌy dhKvfG0(+h|icNMzKf i*o&d8cSAۦ6Ţ%ƶ2JO-j ~$)6ܣs % PS qgWwF2[Vi 8XGxYHf?hW_.j1`pP\&~ɯpy?'st> ^7:= .~%G\|ÀY&TIiҊ[\a,_җ.orV;cnuMqްLY/{yl݁@Lz!gt́}+jqq^ҐA zs_>acH~T֔IT ͝wO2J[ڙԃtG+xZQʉHژQn endstream endobj 675 0 obj << /Type /FontDescriptor /FontName /LPEVIE+CMMI8 /Flags 4 /FontBBox [-24 -250 1110 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 78 /XHeight 431 /CharSet (/i/j/k) /FontFile 674 0 R >> endobj 676 0 obj << /Length1 2732 /Length2 23801 /Length3 0 /Length 25334 /Filter /FlateDecode >> stream xڌP\ " 4]ww$hp !CpKpn33$WuoQtAA b`twe`ad)ca03123QPYQh]y0sdƮ ;{- `ef3/@ uQ98z9[YX#ڔE;@lejlP0vځ2TL^ Aohll!HCr݁f_ wGPr[`a V@{JP(96ۀl,,W +MM-V@<+=엡dWI1s1urtuat"ӯ0)K؛9]]~'n 4݋;x̭5aȤno$-8x@'ԒWx5/G_J_bP~>sP@?+s ;S_02u-~Gc< ID/3{[IU[TRFՉ:x|ؙ _$}oecWw1b@qKZ 79MAX?S/  I7[ۿvV^H :_SMG4rZWc![;F+I+Ol[l.V+jtZ6G oJ {S_' 0vv6-8>,[4zEb+j` k&_'I70F&߈$/b0IF,&߈$d~#voE7"jQ@(FZEܠZ#Pw(oʮF(oʮkx@u~#dil "׿6P$c;G9z$F /T-hs\LlA,!Gz~gaagftſ@] SL3h X&/'7o20Vߐt]/ܜ2XK/GK AmZAgkh#s\AԻb@Qqsmg?`qÔ/Ehǎ7@89Ll⿙y8מY~ef etce .VjOartAfp]=ppUGAޞ@Px? h޿E:?kS7g]zG@'nq/Ժ6Z߃aw\`bW3gѹ MUfȧm k%gz-*O&w[&}/<'%`Pd )Kƍ~'Y_<>Sl!F=Z/ EI,)+! -ڹ'4ZWbx:8" ֏ޫ_X]pqup!F')}De}JV-x6 ҧ00fTYoq]`XSڈaLYjZf$0]m6N!X♪{ j[6u<; c Oij,/D`B+a̛Au K(BqOV!3^QS\ߋ~ 3h!!&)煸lFybTj 3!eLX^ [ E2RCz^<q*$;Q c A!a}<7f[7C7ոB>t rQJ(ݞ5!;Qu'kETx*~/*ZT;ﻨ ^ԋ[(1] !e#EeH2F4HxJuȦ5u%o7dlҀR5":׹l-,&J5kr.mpuqC؉Orx0@۹8CaslN6eA*lX| ymcHhJJVmsD!ǽa9z¤rwjy&Amm-*L*bVIfgG6UXG<[NEMG .6'.f3쑼a+ y䳽q?9G嗅+wD)Hq[P&,XorzTj䗃=R+T("36eOp;_O84Bٕ$xLgZr5.ablZueq(BpΨ^jDg p--\ xOR9VzB2 iHz~?OYX4xjx]7,Nfy|vtF" OY/at@iߤ-V!Zf&Lv[ 6a~&J @jfٸZsz'HY<,xdaڽܑtEB9Ɇs C#}eB<~43?YRНD^O]>a|YMk(v>w0!#6a z|F~1E9ՌaRj|&R߱ Z-:oF=P_W:oMZQ9?Yg` ڮjp%/DZX$ڕRˁHu;KN|)pZ*nl~({TϷ,E4N&cݦt.Kxډ)O +lU iW ꟥*H[cR.MAy91(#*ip#݇{n4Kމ5<3̝P\f2Y$4 G&°<5#qJM9fr({ȣ2m (?Wz`;]E2#'G5\20 [HhcDT=qR"'~{* N0i߶S1> o1U.e^"*<[lp'[r."30җwya8R:bCy-Fݯog :`d$Y!= ̌ntžiDU1c⨌>~*-jiTW%\޲La7_˘-U:;G&@M$6VT0G`$5]f |VoH㐸|mLg`ϕd=KsUUymR*l(ҫ/q4;FB2`ªҔoNу$ 5j+DHڶy/0MI <&|WxdǶq4R:qt{X]EA*)7C 軆EGdWѭs 5,~Pt?,x, J n8ʡ =Z8;kZ} Yl<;BvF9 ፍY2#~W HqEE8b(Ǡj1.+jΣ;FuG.7OMX|b(Rg@H6ke2] ~D][{BKyPl4?!ǂ]Og_BڿwlOTe+S}i-JiؑA~rLH`T_Bc9R&>@mܳfyr[Zh)lgu6+C1㝏qniZ^Me_& h -n^مX{K3/ ''WE \4 Ҥ!ZJ*DH|3>+w-|`^P9 }XKs2 &ID/)*Rג6Q 3eDBʩE}Yͭ0hKhɊyxjڨȖq*S^? e}96Ӑr"RaTTf2PRWa[ ZzFξ‚5 юB[|Ы&pDC\v7E os 7A}xsgԂ$e?mr7djHz{xϷ3x|i]z}n3*TY*l&|dMٮUGyˬMPO)\e㡙^O3 5ւzp=irm!9:Pt&$P)KЭJ#jUe.g~Nw /Ha)Cju2iМ jg7oo]f\S1P};@fL$9!^>[`w9[۔דMXlI Hl(*Rs(2zi{+7OCC<2~X z> 0glK.v$3!G îKi$"ԋ231|# ?8k8ވ%sd;XfrXHUHVvԨ„2W7vщCB~臭r40 V ~[? - 6F Ȗ|̊=&C `x}G8U O>4TU~Ur(|T,c4Y'L7/bW'_"G2:*]f7nzf\Zd_^c`Ŕ)6̮;fw ^bl*[p;HXb_sr|_^!*#6"Dc O3e[ OfG'ozԶ lU5; DܣS!thGYSO+iyLg鴾$_l@n o[Cm˷ʥ\ȍ ǔ:5!|@=s4S-uncx_Uo#4y3 bz>m7+{̀<;d TV җrE\ V[ԪU S 6؂Z6W9mmw<\돠og{^ (~}=ʹ`;O}Xt.ᛣۅQVsyb,Ƴ=RC8*-M*|:.!9V@.#d3bŶCk.H4mX\fk%FN(aaTn"0C)2\ a-!LSy1TMч$-/#=(4DXX~{_Ht" 7ICKk5lp\"D{OdTkuYd6VTԲCڌ`'6c5o$amn,!ةrR`4͗#cy_L/SN 7=R*jMѶKrJE St_󙦚m;lӜ> i \7eUyڹu'{m㥭,MqP%jm1;35IBrR['&<+#8sPzGrSRt%g9|3, R^nP}J{Z{#ٙ]?;$ }2ZU{vW[q`;)""C^p7.ѩΘ(>KaھܤȂH~lQ]0$ _"֓Kt d!E=.;׽f>yb!U9𮤷oH1[֜M |x ]C%0A53Y lOD'<;HJh<45!"QUEDQrŏf%L(*x\d'ofykD^b@WN? 2'~h1i7išeMD wسeBK32 .#oM[e=x-T}w|_9^f_rǛLr`hLLo~( F6/(.;p_}{z61UOa=_:議Ml TݧGhL)۔g8DL@?=R^ą ?9)ϯsԬF:wF1 T@X8P볇v[5AU^>En B_[/ׁTi^?PHdu٦[fAU{9$q9˄nS1g`&+fUk/xͨ<f}Pc">Ny G\bZQ zxC| r {u[5Y9>6OF5vG"Q…:MhܚCaᆸI6 6I^_nuD`w'8`"D`*s(!+E,֪Y59wWI }b%t. ioo>]T_Qfee, < Z^+I0ahG+g|0M{m EO86%fq5%eFoSʷ2q6U )GW9j70U ï?G'j}a9&v+'< Lꠟ0wZl1V0g`e>&zV]`+NX%g.F^zj"|-QhD7r_ptw&UXʍ:0,3x~Wκ?loz+\P,bV^z×\%j~#*rWYF~R㤣?џPK{&{E)p<O ZiNm 5C"G;yzdPa ãw1QT|A ,EC*'!6gN(0ܘhbCɝq.Jz_>/?HQP9~W?m _qor +g5{5%Ú4Z0]鷞ϲmngu^lդ>돓HWj$=;cCppY.Mǒ;x ԡot ?B|虒߼j9O 5ีhhZ$ ub 4ӛ} u ^R3pꂮUBI6  R g= B1~/Ջ)6C5uXખb]lVӆ/^+T=odQyjx1JE*cyU[^-M2J](+^y-dR=r<ӡG0a=̂'`B{%懑7)ʀg N|7\[`P@G\HP;9؁y.ZmcZP88mu.&!3`Hphތi>=#] HcǣܽG镵6BMpc@MDDd ]ԱrM (7݊BABZ|a&d]ގGļfEZv2ٌ^ #nb2`tE;uFyJГc܄B}0R,N 6齡(u}p$x0 㶉z'2~>nCH#cˌz<ެ*]w-oT*G-]kAhH'e H4p! ~bŸ4]8A?yz3(cZqm$=3j<(+Ws|_x[`&)ܯz'a|DIԣ8ŖڐQeW&ykBm;)p;&Y6FKsC6,^̌cƞGcw6sl')GP o7K:,4-`Uo}}`X*]D29$\ Ze)s=uҒ-waQvz2YC9eCx7iԌUkL)mum[@&5J!oLE=YK$e$[C-MO*wl;X3`/) $[1A#_xݺ,1}-E/JLSwD<-sXHg !ƚO^;hlQc}-_`6WwKNh0\(~igˌ ^y.Sr Nb]]7%4`Q$%r9Ꙓ,-wc<2!Fh-R m t jLLwM!-%˟-@I@9dsW&, LҌ:-76~˃rKh@*^f'ջ dD8(ot%*ո/d2]N'-DOYCĽsz =ၞj9Fr'?!ӅKxSD=3yG ~FJ5wU^C Ȼh}9x\͇mTRUQzSd04Ӳ^/dmHW}7%ꐰtOi =TKZeO/H /MBiޱ#uOk[?zcHojeZ_4zR73ݥ6FIR(h"1O! r|g}[4.|UL>3g{ڣ3[Y}q^Ȭ! XwI{=}Mp1rԞ@HY j~Fǂg'N^7l`F,"WhnHʬ~Ha6L>qKu~r`gwGO{{FMILςV,c Kðö1&ctB|SR~kal_O˗A{èN!}`\v i\`+ >!N&Gz8>8!\~޻^{ܤ,ב0sk>`YxJ45<8F` Ue+\FCTt~$,\O1nwlKc~H[ي盼eEaoɏvxyqF[YlbC`A/LaT`ҝœR7؝؇RkkHJ]EfzV:2%l[Q%j:؉K5?-ڠK\8ar)k1!2\$ u)~bP hn $)Z߉qG.𱙹(mJ5'yܾڭ1GMZ%,T ^*NʗVLMJvGg5DV-U(Ozi̒n Q4_ކ-U9^?"3W粭 D&c.f TS6{h>CUD#RW,=5BM0 8>dUHjSD-:ѷ |猂hM;a_Iã;+9h%\&k~j1r3VoIe*|!4Oa_DxZ_i*n/Q^:I&5E R8;3|;ic4 7wber¯ o׉s =ڿNdOǪPLLy A&=-u;=K'a{$oK[\jpxlم̝T|-q׈, 3kIӧݴ?inԈGăEH MŸMjWVl '7oU*ܫ2V&ʼn߮!iSl]{.}?>dxZX!suRbd[ҒJ"J溼#WCZEoJԏhv+;L '&l tH>x;CJ߅r7 rUl;ԞbA3 iɉ:-i/|/L‹IE4*6#\,A`,`uE;ޡOʏQ]T+VöA?lZe pKW``E^]'R(Y{ qZiDSL!>Xpk.\*f^jN?YAC6ȹdeN#Гic;=tf~e.*6$ hZxvy@~dzDHLsr\qЉ`AI3zyfɧ`P#.MfQ)%)0QVxn y>|LaoPxԩ=}?9قhpZ>#]]tn,MqVJtR0 O{&wnC^)ۢVdž38 9ssThaanx-Ig/c3Gt?ȹ}wɫu\6!M{9qg8 ")0E`+ԡ&|\`,!\ܲJ̓I]?߷YZ]O P6adݟ3q)QZsSN} )e,g;ksSF TNyفj6Cajyy5=P|lF0%x!l?H2 911;oEIC/Y@^dڨ`0]%ȱ?SLW! Fiw ^eB2ڦO p } !vt a5'>0&dPLhe }P\VցI?ϛflwxl,ƛ_:xei!pEp\ntp-N*L҇\0ua65E$u+uo'j(K0w#>@w* 5 %>znR-PPI1 (xxً߼i4x}(*jsaGYw!␣\q deR)[7=;2̅POfvJHA$)t_ve w7 (C琝hJ>9\86FyZpDbKM_{a^+8Z).:^RggwMl0I~Df#LDwdf=1cWᓳo?-,!u{Hb+**7KNV7VnIGH'\}y.O78;=џ&9n[]}?pe0SNRŃS E٦:B$SfM CنrY*2ǽ&RXHVnag]d E !fPhZ#='Ԁ+2HMdGKӒ5H&,^K)Mr6t޴pWorCב;ϼ/EAF9/zá{p!UcQ΃}ʆLT.V}8LhsPqÑZ $,ZTXs]<2e ^[J4]劈Z}Hv"+Ȫ$ۉ70cMl-ԘmrV#r^KTVʏ}zҼIm8^C*_vPxa]1289!*(j /J5.6-ZXrF`ӑ#uMOleTu֮;,|o$v<@ȒP3Б'<(H\s~gu}z ]J&  ;#Ra:M}0,K;>[&%s8w0=I,dU|I~|qF缤iTIFqonLj\%]oH/MjoTIwkMPQi"o"CK1. gMVLJIa RG{m=g \MJ]kU )bŪYo`y1H_p}X"K3d*ȅA.rm7a=aXh-N$:K' z PwF/vG+7NUd]B\v|`+ҥ# T*[myO<4s-t`S?Y DOp7;(mOW*(,G<,k;ƖSęaa8![Q qs5ʵ06Ŗ|6=aNQєdT{qY67E*[yW ^?|ۄcS[L¥il}fԕxF}CbACP1ID݀+I74$ZPn)gR6EY cA_^Խ^<P 4.@BL.<| <.U'ezLƢ8a8{p:Z3sHOij[^AKSF$E"zs]53\\[ Hmd^ j%UWQ!tlLRsf4J°wLxG`~ ӶSFrKm eXtivɓuㄘem;a| x>2_V8AJuՙoÃV`A;]8'k&`*n/M’@Ǖ#jߒrSF"1  c϶K>Ѭǰo5MC&4֛6K"y}!٫'$!&HLCt/kZ"nsel4h!Gօדv+Ka0 ؄IkKo6CaEz^,YKR2$O8#ZN  в7W v́ '"@LyHUO;ö{ܵrW.=&0 T8ymhf잡=@R2"z ^ [^`;ɺބV҇&myJH/S[!?_\o#ȅ|N}0ӗR#nni?A^o`-viP H̾ U+۪Cbe=p8\Hыo՝ߞF"b{i'n*[>h5WG'+A1$))6mx-r0]y"Ӊ>G.ܼ7(#z9- @.p@(O.6{Lu3 @%LWʎw9zC`+7FwNgݽK-=G;ꪄA/z1U*".պF`5/uK ̵q"2=eJ?DDHVɃs§q9P_36F$EjKIc!X[Ʋܥgi[,%)V<& d2飩5#$NJ3;+9{Y}/&%bƉh NC 5? /9GBw$~힁fF;tCpK6s߳Qİ h  ъi:t&%2{%;}Aͤ@_3_Gv_Kdބ})񙨠mYS4@WZCr}WV, }76'ԝc0Ulu8&VO|÷YX>^1҈[20s7G+vu*8&S]4Cu0dbKM^uHUHnR[28w+I63かx@4cNYtF]ZHE. ..DțZzQ 8-gRHJX[#iW!\φsWC Njy"X)n ',ZBM'X1Hէk͆\~V!E4X&FҏR [n8#xB5QceW!`&QfjF iz|%$mky# alpgѦBriyޅX W*ؚ4jdG3P|Io|Mvbx -Bx0'f21 /-y)DFZsHcuim+ Ţ> n%g3=pb+=,w 4$bicµ$ܐՋm/ܻa){{o(F TxXXuC?mW*hxQmRfҴEH <\J`Ph%c9NHzCo .ꌙb)6rZ^NF}-c)gdTeq)p`עdSfex摽8@R9gT)/VBMǖ&A`/ma_|K跮Gg T>!ɕT8oet gW+4 )sb;]zžrv/&h$"U,%Jt=)] IԎ -4AJ[,?'4ߒ?l7I%.i3'`זE.`UJf̰LԍszqMlnSpŧ3v٨½=ً,x}Y}G\ ^Y#k]y)`巗ȪbxLv"w{*tKC_ͽ7&>7 ̕%Mfc$L9^Ζ>eޖ}@2b}aƺ!DUB*|]tHPVS%풲r<{?? ˇЇ'{uO.""OY#ЈQ "LZ4s~t0G D)ydN46[ɢ3JRĩw_x7B@#-7"΢|60_YSƜ9OIRx~E]U5@Γo4j.˜z)E2~6]#e2# f g:x"Z:K$3} "49gP⭾ KA1aUH";( Mg)ioHw?R6MoXu?_M&@Bnqt΃ŋݾkb2d:EMj~:B}LVwּ8bŇWU)V1@3vKOPJa:P8% XsEw ,djhۆf88!d[vFCTv8.f0ʵ+NchvRev-a)Aሬ,Rx|SKFx^y˵W= }b' fiһ;;`~PSҫjH&DJIrJo`sk=zEzBac `$ 2"oj;K~)@&n.U:FN矶'ӫP=}(yңp*^Xɾt4mQ = &6Ƽx_1!̱2j1|ؕy. L5}42=LN\n{dGgsz{\& >dU#ѽG)ras@Zs#k,lwOpbg|{B>FzjudI)Nˎ zud19}FtdֆڎkRёUUYYp2 ib;L lUbWjiӊz"dv%k%p\q1@º^_Yu,<%aife;zWOЪpt,V JrU%GNsNc5bbR &Yg ,DC5hQKM%d$݊#w tz ^I%ɓN"@Wp*ƹ F#pQg̉MCk]&-N[F|h%#ߩ.Vw*b:B.LE+{mbԟJ_s f?]!О3}kuW'*6V\I {@tYV9G:".,gBCXQeV.ojcB'9-b1Ws[+#\-Eg/e ̃4/ktPx):j}HNED[LmDBk!}!C6RFELr}t{ӵ(-b:}:9ƆXe}5yg"CV"#DK_CG! 9( UN.JW799 |;Tw_ݜ!p\ H*2"§e0 CYw: pSmr 96d /" 3 B2CHO*e+ʕ8o.XK[VPPj=})m8V^/cJwlŃ 㓒rfQȰiەX'DAD[*TV ǡ1 0 P7 VVRJ sAeCI[VvG5EM3E2dD9xm- 8O pyѯz~}i of\~#v΢iU6p ~ օHhS~HAxߞ5xBZv4'dd> QM鲖߀_/Nc^WOnC[@Nu;tSt1!W~Hů5$٘ *M.:$F䏊j ̢J˞(w[ij&ҷ=rm=v1ө6N$f:50jYAM,H} (4Ug ?vg5/CȖL=30m&.׊NpI ~'G3ߩGǒ%pv “ 5*uυ3g[%`{ lڻa =A\Ԥ3"L輼{2[F,%SJwU/pjiu7+c;`9$|7C>&CsK&SBr2",OO}!W!ؖa>_ .=*>8~=|@JrMJ$E)A"գw}F0Y_8ґ40'D[!9Mf an%zRz!7ic2%γT88EF`@[`1K- qSnνOWrHm5@r(ږ9BC,6Nd4g= wjH*ǁ?δѺ_c&!!/m endstream endobj 337 0 obj /SYBFIG+CMR10 endobj 324 0 obj << /Type /FontDescriptor /FontName /SYBFIG+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 750 /CapHeight 750 /Descent -250 /ItalicAngle 0 /StemV 69 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/acute/ampersand/b/c/circumflex/colon/comma/d/dieresis/e/eight/endash/equal/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 676 0 R >> endobj 677 0 obj << /Length1 1511 /Length2 7479 /Length3 0 /Length 8495 /Filter /FlateDecode >> stream xڍT6LH(0H %% 030 )-]4HHt"4ߨsoZ3~v;5@z-]Nik%DCrpD: %HGhAB0" `$ #Qfp@  Qj PaW, Cnb v V`@8n;tVP_!XHgQnn.+a+":Wb U.@]gum`V+ f APwtc?Z;_޿AaVVp'g0 @!M5.'Y2;Q`w0l28 :W+ uU!0&ìeNNҕW~rP u/cu=`>6PͯݜaP7_(@ !a\[ F wؠJAm W;DA|[o` B,!P?Q0揌< 0}2CqspTuJF 8y@>(Z`_YU"Eu? 5}Xpc!n Yxiݿ_(9:ֲR`'_z_ݐ(Q_SCȟuUXCݜWv@fw POie*p_ A_ jP+UJyv ؋5b$A57\08@#~$p@Q$Ep7?o_ /u7+fyH;|@(OLa7WVnjSՏȿ_bE0? m;~Qbn3hw$Ma ^EJ ["rdgyk۟W :o (F ?{{kقީuq&'=U_!|f]{ZPl3V?4d g=MɀcI2*f}^">MS|rJqd^9G|1pTL9:fU)ѩ>?`IeSP+f"VQb~ÒųՍ񆏜[D|%H1Eu1CwE)?iJi]v\s?4F0!sONbm3j7 X}c8I'ݟz|=ب GVfQf%&lO ܽz%mjf5 GW >K?Kz+Æт2nuCQBw&T("x;l+e_AANZb!ORY_'FϧIK\h0Ns$+:xj|-Z/>eTBf۔ R]gzO.\Wsuhxi^)W(w#k= ̻L P4&J4=2*oTbVIn H-`aEZ6t7CRZx:=7$SL7hf_t>7?C4?+ Uy&7b1'TAw2lDWj9HzuJ*}r0"!8xzhPG[8Xw5Ғ» X|elz/_z'kkg˭f:^r{vjӬ[ނHo[457SoPeOa7yW#>6ǐi;A: ,ew?B^og \*EE{|}{3[VM[-@Og"9$x;jKXȔ8b$'Žcq6$c05!p7TzTވ|[_#=v-/H)@ݗRe{k؏` l%KXꨕq֎&UvId^ORGr,߇0&E]!Ta:υ>\[(-we5 λ2?&_@?$$_-ULNNLǓ&0l҃6oHqJi  -k2 %h+n.evkHjZ)`mz1;>mGco`K-@ [+KLuO63]4.=Yk=5'mh,y38\}C)sj+ifʯWMup6܉r\q]pFn|o1} VVe@Gg+ YmAaͷi߈l3ܙVkXv~J`P|(m~2bLMAjg o@JAPj:qtZڝT~#ծ*1VōS^Z!$$ܽ|_RhGccSpwl"a3UP löpPg)$OX]riS8k~欵}8.-ʅ?={gmpH=@pgΑ!3ځ4z{4II9!@ˋܣd{IGOTEs` FzS:5Aw mYLc;X|[2|3^( SNkqpy{l6~͜#(tK+H`@ut{5\W%?XQBE;WOWf>46z7uxZ Ao}W~oZУH*>PwH8v|#cМ -&3%_:2Ώ,Ed^sP* t,%F>ۃqn%KamT ƿLrǥVkQ\v~:II-1Il$2eb\b3V_f"cN>jK.6A.gO&fʳJ/ѩ1EfS.3lm@2ۑl>F%|6#V:ľ~%T:5NPaVO^m n>vA`+ $m|Nx2RQW-L4K*~+I6A/DsG=X!|'cۮMY~x80C\*1Yb3:0_$FM'܊[eRpȺazH)#or )=!QZ&hܱuyMUk M9DCaJlk3`u{M+?%Yal_Yr9ldެ 2/~bW@)z 8F>oяKhN;nL(s-ZeQO*/Eo[A5~Ǯ 77%DyK6>PԷ\O+~;!/t/17l%"lSF Z,J ;o/PhniV'$S.k гQ?}D}CQgqEWWE҄@Sbh`A}]vCZ]j-'>-'$ɺc%z;y^'tęG.=8m (=ݯP#cYg>蓓%.o:#-du女fI]'hf)rtD;׽+׏Y3Nq*_z>5`M,bt[]5˙~t{BĂV;|!h?pq\F8UIMl-Wt=]:ks_9tM̲Sslͼ$>g&Ubz_+C}1:NU~/GD˾,:و,/ A#"-I.a\ *gUSPZOphe#k%VR=噆}Q\674bvvKByŪe:.aϤK\eq2'84€MIUUtXװ{`22>}B47'D|/} "bq 2zlnH{plptM ՘㦞I*y L*sY~QC@E 9/5B{u"[;!7~!O'BwTx׊.i`zqyR͡oāԃČqDɒ+<[ߺ#ͿTTZ7#))1mm:y"^o@YcH8T+xfͭ0άpl >p6/] F_zFVȐFg,Q1P5ť][rW^K,El]?%;+WDܥjlyӣӛYm#X6o:)Î_rbGBYGK:L*iʵuD-Z3 W%Xr|V^=pM,Rcl$ h@qg& %&,_7Xj IїtulFbSw›U:Jy10f^w7M#;N)y&\'p132jT"}.Q'UF7xn)SM%b+t(ĊZ3Ah˭1ǭڳդv?sMi uЅX=֏ A[sx |f9)ERo#Оt ZUM-5X>κ D%m,Fedz4Q/nYQ HDOӎn?# l:݅;t }V)l hBp,$>xYS YWCz-HHz4j0]'ϟ;-]Bd+bFiٸYb'#sI:f^ڏw)Lm}YIk$Yb>s+Hݕn6t˞q*/tYN7W+$w7!4M*AaW2_2*_@˾^8:5B0rđv K'~)W*,W K# "3啕ؤ%S9C/,+qmkv,]dpʑJ;d:(ntV3:)+k\aS_sEy@zwnN|m0QKp 犂9ka S }sYgϊT=[1rєsU 9Ơzw1+JD·au$@]^g mD8|*2&m3Aj{ў\a֜\IKֲZ#maJk;UϼT^d7RYZi!|e => WV yW\ol=}Sabzщ;i/8z $o;j WyPsN%Y~;*؜LlO(&رyEϯD|2ajc̛7DY%YT`#@nLc;W4²[%?V{mߩ/y3pn7z:xtg}ph&}`POyP >ˈ/yR'ʶz~FsP--5i}uSsG ǷW Vo3 >`E!JS WY} B?L)O '2M`պOiBT=1uEOG> _%J0r=?DfWe2 =\}A:Y/gQOFb_/unJ-Mdyk\\пstJ>"~F|jOHLQ7q׺anu؁ZDV ^ TU $Þg_px`Evn5g/b~5 EZ! m$;2^ؖ[O rЇ8~)qsf+hdQnCԀ'cB?U:İ[ ."AsB3߁ rTSw>Ȳ?lI7x yD.H[m2]9wfo ۻ[4nG&9O _P1t~`-J#6?ra endstream endobj 678 0 obj << /Type /FontDescriptor /FontName /FKGUSP+CMR6 /Flags 4 /FontBBox [-20 -250 1193 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 83 /XHeight 431 /CharSet (/eight/five/four/nine/one/seven/six/three/two/zero) /FontFile 677 0 R >> endobj 679 0 obj << /Length1 1541 /Length2 7795 /Length3 0 /Length 8825 /Filter /FlateDecode >> stream xڍT6LII CJIt 30C7"  !)%HwtHz9_֬5ώwdzf-]n+HuuxqGaPAHLT\ (,Gț<e9z6WsY"\2 8 P7w9 _4ta`ǿ\I:;;򺹹; x`p'\7-@]AV_4@eق`]9@%@@@pm@G Wi@ mlni sp4z6k0TTqvwC~)C09bnT9@QF`p3ʐdVr0+>y0dCanP?gk0W V.P HY/ $fr 'Җs=Goo#`L!p 3߂p@`CqA#>$_O&HnY7WK_QY^n~!>O <ۋ9(UZEV?}o_0$cAn'g?yQt@~K~?Rs0/9.HÐ_g?8T92PE# +-  i_  r,Ko94~Rj 5]Bs8bMD7$9μ,krI^j~*۪ۉ,Nc-VHS+k8_G(wdj:ph7o Q?0g;<&%=wPr,ZިV]2iP4c9IɈMArN8qr:Nv^%g7Jp?bsL!% (fʃiE@$E ds]CӔyXL9"riCC<`7Ew".x&Df&!,E+?3ǙĽ볲J@ ݾR̟W|KSɿg>]Cğ ij^SK={̊X7L 1BR}`IlAj;#m\ᰩ1;Z%ΪG"g;U/?y2Q1,&ia{n%|SæX09 "ca9P"B`9n=|:usbf%\c-/GwUj <c"M^YXM~.}NNFGXC5y/f͹Jնkhb%93ѫs Pdq ֯W8+ 'B>J ^FsXĈ*GOXi41"A+zPr.G=,]wӆXQ<J#8XuO6@UW$aDLN+V|QdpRy8a+Po#%֦a B|n Q)4wYw/B[WI 9ufhn<>vur'T=5o~i# iPRװaE _HMc6I7Kj,)>?nѡxZgt>gdscm~DZoJ%w;jސC4}Oeš)]e}#Lpw&9CDo%vW&yL_ThDO/?5VcÔ$.ߜO5BǦ=3چP9Cd/:[=Hvȥ&)pk}{.9= \km(Gqxy!:u"`ws1Dq|w  tx:B̑#QЛbc~GHhv (%hbv?B0=y#jL+̄7YgWpcx?}4E|Myk(qd=r-)sjt4k :KwwH4k)=6GRHOA>b (R A'6xGmt|A#Nz&jd2ec 'щARjMac.M?~G%-F ;GR~DcpN'i3x;M?TP)!!AS9MwK\;E׶T{[sh'GB"vEn%y`GYqf-Q egCĹv;2+Z -sjpH]YUQ 2l47Oᆮ\ ±` )>\CgJwsZR߭J#!ZޡzzM^[{)Nxh{l r&Q3nAnOݟ]D|rD4-kSl3E>Gu&ڲإCB3U7nJ郜,vkTu=G( X,ȴ9cG)8!kqT9"m+T@]'4pKuO"~r …om8T~wB.eR87v 'M˓{xl[.f\ݿl90bg;prA5*}Jg=ӁB([.V1-Cnڼ<9"G=73?<ޞ =̬YWF}h"{:[!mDGEd\Ksv&,}]Emi1HO]k7^N8KVP] jq.]gΔދiw}mAx637ĆZy d,8FHQɴ ҉k{b \c}Vhd0ߚGU](pzs)E/묈jiMO?Ct'c%NǨ mDJHB<̣]Q!5T+_EgW(S2r(gm. (O Gy+o)0w͜U2KɝS۰TrػzT3qT>U3߱SYKMxu} v5+6hݹF/1G7 \r7^X'spZ.^i _d̡mUhAXIu`jIq()~<.GS6Yʷ-mRsS#xjOp:- ڼp}B K^~$t'PGk2]7}v/c ]Dδ2`+_gMP;FS$HSf!nJD.4 &bL]=IW2iׁeMi2Q{D R1]iM b+3;bt| 2D8.\/{۾=wO@ڭ,ˤ);ߒ()2") N`q7C1W“ "5rbqa UV6%@l Sx7v:+51KBZ 6Jʪm@ΏƉ_ӿӣͮu֙F*a07TYx >^˚XSvX 6L`*ذ!Ɛ6p|&ȪG_tw;x`EόbYzE$0ʓtHiZiٽ{-BvF#.S?`b,vr=.{'-/K*]Dߛf\+8Ge5 >bK/d5F^} (bخsF<%+T/u}-!>td? w@~1ಒ vd1j) 56Q5fmunҥbL^4{]͒a cF}O/`N=7nes UVݟ`kͅɑN5z{YZ[ʈx*^D_[6l<.J<`da@,#9byKb0F%m{ {`8k:e,,]]l<5ء&MhǨFMKT1ݴHP^ImҏDˌtypKn(q8j+jk>#m1'[PU z46b̏%cvIO“riŋ$dW;4gNgRF`z 'nDiȁ]%k/} Ǡ8#׈&'Byb3X=aϷyV3ե1,_N5TӪF2BShFQlf>֚eu|as[ηZ9=}5Z8%e)ܬΞ]-߆D -̦)Dxq@ي80k7<v, (91'~0 [ }X41м}qKӴWh _bDr\dw\_ b?JsNm܌ER gxcz.goy,g)m};H3ٛ7${г}fqVD…+$t=>[Z ?k {Ff= Xl;vwA5439G[!epQ)\Y p((8SYq3v9&,4t"_Ytd=ΞOFr@$;mb4㛖T{$8QwԔ?J-uBF\yalFu;5Hgc'pf|L-iD*.O}&<%[I]}nr/cSQMy˦Г5㾂T;ڰE~^EՌr;-w[rVr`|pQMH0;j vSt.!:sخgyjzV23SlJ¶53u^~$NbNKCAl|#@# lA cJzrޕYѝ5VvGКC1Ǭ1-l/=qsn}Xk5#o%ч*̞v>,QK WltԱ0ʂ |aoWJuqPfRʙ|iE]}6.cjx9#vsi6"]'{@!-uoҫVwDb?)MB Ŭxמъɗ&aڽ_٦: RغVܸf8k~~(c?KI.:lӺ+ݬz _89PN f>W >.RΛ&_uN5 (|ql0YOYEF0}|ɦMwuɊ[K"vJwP&S+o,j6#M$@Dz>t}b(Z>YpuP6}Ś0_ GᄓA'K$ϕkVbMcQd:^6K,as n˷<]Dž_Zj?Ώ k>%Z pwlQ nr=@PiD {85JٚTT:֗!u9$ި\GkMӫNџNW?/%m>>lH rn5Waw8`&8˼yϏ•0ϣeU2'DR_=k|2 e~"d~@ٕ_Ï4Jq ,cSBk xyoXD—iQ_Aش4M'ܼp!|O*h!!}ܾ󴲑 Kz|%vD0QÌ TFIz]="uk|lu9%/ȡL1~RP?U |`򭊭O:f`Gx u6\wɇt5[Mf*Y̐ M,vMT˭r–5vuZ}ۨ ~\٩>J ؠ˯tחJ;oL/_VAߛ.^(2dn^H%qfoVa75@Imm#/| F2qfKCnRJց3(C-Ѫ&K w4;[|,x+gurd\T,kHnB~.n ܻZUҤ̵ޟx27?:џcN ڱM.H&[3e/]R=mn_=)O@OF%O)մlw ^E )/5pD\^,9F*gp s 7 f ,״όc$Jg:¡-`/M†JJ =Aј$)n/Åډjkj1鹅3 F|>:u-e㐪 C۫ٷOL:*zg$ ̪X1X"K<7zg 'M=Wp6̮w$kb -d}h5S.gy`sv,c:0Igs=|yCNn3_b.mzŭHZyl~'{,\P@6uf Ui+q̰cuEJϭ߶xZ7oqS*)lmȸG&i*2e1<2ws@UOvBo^xYS)RImbq4JYrUw:ZkchMP?y!I+3&;cبN<>#J.wW龳 ʼnxz͵ۼtD:!_A k6Kx,qy:=iw$O&vwt){DST.\'frA4K4`G?}fs/G)\Qi*cۤkK}[Rz/iJLUy2zG; qy_!JO5/BVwHUGIbֳ{yN &,n>(|M VtS.YrY{@W$U߆a5Ä3L˵UM7jV0rh[FȘ*d endstream endobj 680 0 obj << /Type /FontDescriptor /FontName /PUFIDY+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/eight/five/four/h/nine/one/seven/six/t/three/two/zero) /FontFile 679 0 R >> endobj 681 0 obj << /Length1 2150 /Length2 16916 /Length3 0 /Length 18203 /Filter /FlateDecode >> stream xڌP^۲ |Cpwww=@p{{F˘=fwEȈLL\"J\FFzFFf22K0djNΖv8|D ]>dR6&;77##흸n&Yz3 )40qqq5u46X~hlhP74u_.. NTwK /9C[ӿÐT,,1+ۛ:> 6ƦvΟ v&Nϳʒ2ySe jLLO_Dv':yZڙ,mL2..C; m? -m >. .0uN.Ζ6)dLDmmM\aO=n?fv&fI0qu`Ptt5Oħ  0uz[0E`/gO f` L.Nvo04v[a4?;df<&_?}-{;?7AETHRRou {Xtl&FvfQ0Or%\yKSOŠo.9ω5PpF6F?)/5s^]]>g_so?*kjbj.; dgnKt05Qt1gT`6v ΖPtLU֟/ ye4H1;c{`d Of\CS'@og 0wlL v`8 A쿈 1A,??EESX?dQ>T>95>}Ч?3ϗ`/`0i~:Y_ _l|?}v-'/~OJm?Oav?}~~3sagcj?_g>w_dpT/)_0_Sۿ3_dO^ d2uqƮN2]~#~?n0+Kx.+TKþEFϓe/`CCQ\y ϡN}JEykm3<-xmT0;wcbkaޡϐ{ Ha.y.{Ӧ!1gV[*E5պt2%)pQkKѫ#Q]jYM:̈́7z̬RVf? D9p,RiV;/fꯘo8gn"clkZw~D}C3NgREQOR٘@z3f̝F{ xʕ^` -[# V׽ X.۾($Q5!WFZ^' ]֗qʚ0x/z`!R7ZSe7׈> F$EtA=]'2%D$Tp&)3ܺmL};t6!7#ʞ ?i*Sm.fs6+oLLU;XK<@֓`ss[\2InP75TZ>ֻgſ!1#>a:M^P@@'s W-l4&ʋ,lGZN5ѠpwQ<,!h\$vLD9 ԖskY )ݰ0.L<6d|aK_^)k~()a)5@Rvea5# toUu- SHC "# I"iN1cJO䣿ۡiʰ8zCU30WoBi|'\3)~!"W/^.¬eAp-*k1S%Q0Hw{+1B2I}LMWv֎.Fs!`ं+>~U߁rMRΘXpMDKϰN0C OjTϑ($x= )<Me% ;ȗ DX [ cV[fo"%'j=$թ1 e?"+&8Ŝ*:u4eW:],0+oFJ<­n ]}D4Z?n)ω5,{ɪ5nD=[X d0]!"XpZ^W"GT 䔽㔚 wZ]j>4B3eM_a^[k<[PfYȩ-˫:dK}j$f˥7ۈɹ;{qVPXU1"w6jʼnJf=NfR@0x2qQcs[ *~sguXl˝͗q"m\8O-~znn]@ l݊[ -T6"pԸ'ٲqÊ%]D'7;MO(n :_60/rX)f7%~vaYrWhXؗwdL*yk1Mh\0~q꓋(g7R9@B+wp\WH29aq;[{AA\;hʄɝu7<gKv\XsK"ުK`.st{&7hcJΛM.!Boa{o %;艇lhss`yHK Ag?QԢ* (,2ك1օ^8p-4y00\8lm>r-jo-"g?JdTg5žlu-bDaP̂;Be iiܒ`D:OR`05x~3nho&\=JqkKU8OݢJŪ^O.vlOENt2c}N*P<ښKFӞRK"1}FV^qEP|9eѮȖyR),"M;cE7|3&ZYrdUe{mh/ > čK]۲.v%(:S4'CI&9RҸű/Mzt4@Flj T:b P:M(8 u9>H/9È*k?[:W-S'(ȹP !#~F#{\fdSJlsH0469voPj͠ i?%zX E]%NS1tK081*d6U/l#BDi ;ԁ@IBVlтe")Y?h+&lk.vX1ȭ L_{?))ݮaDhq1޽@p'0~L'y\$;3խKboEm}ŢJxK[v= | n[[o gCGw?\N'M!"ڷ4|b]bliމ.ÈF=6 jEQ^u7DTYl俺uH @_IQ&I- x mzR+p0K팀CCHx9GD u`ld}&MJE̋qKC\xSeKs>ql!M3O€+ )u2јw`dY@t&`V>cz #CxHBؿeKQjev@xσp$:R$11vxj;DRX NNr5+ zex(۫ &];\x-?jjj aoohJh4&GݴyCjŶy ~7B3T>{YE0>Ȣ3LšxcXDqup#˴|-I<Ow\O͗7pĴ 1AQx 1U5&z]ia1eAnŜ<ٰ;NQ>)IOyR>p'@P}:?)Dfv!&Un9+uD k ut9?aLwE#ה<BK_dPM$Dlɑ}YZ#@ѬttuL9QtT(^G`,rSjxUP^ 7;cַ$9fI2usJ^-l"O-ΫȤf=P?+6H-/k^Nĸ_mcmk:_1V/Z': HF{S'R[1Ծ5ezt@XEOxVcrK?MAw=/tj1jke]!UbΥ8rCWwd;CIMav-7I)[gpsEgvog!4A 5?BqEФY@P)DBο"|1Ӕ{s :\d<_7ˈa32`v! ysl[ȶ 9?k/u%Z]c\޺;ѕieC[GeHD톫xbL 6gHh j)ej*A9p6*5L, VyvbY/5!)*],'(jI\CE"bL E(WՅ8UI(.qkx[L0;TI0!^]w"tþ v 91h#'|3E$0=#lF\P Nox[ffEw_UZ[e(V >"ZS{ϢgQ7j`=Ja?!%7h,d;vcx|1_NYhY =NDAUlzǿMI]ЮNփ8]E;|̦}pmj0XlMӛ)$fhdƭe(&-$nBd)׺e۹9&r`)us :h E&:>sΒ[n(*6}giqJ rM-9{ hƺQ)7#p-+Q߼6]OW<8xIM2,猡J?b UI엸sx [2䒳HUC4or_ծBڙ5mQ`vͮ-Y)WO8ḻ0ze孪j BPF횥*YgN7ĺ8{Q3_EPC"Eɺ,UwXABU$\ϥhҙR\|%/YI|NË ܕFTDFι'S~oG|KI [:O"ے!#BT^\(.̣BFODZN5dAhT>Ҳw2ӰiOXH9A:mSY\ 1NgnbkWӑY"_Hh_gH1Nv ns[zptUGfsN`,Kң˅.%O1*:߹$vOu\r"3r(~/ϳsyqC6ؤE͔VgHl|c))Ag,j%0hcӔ;6M̵J"Q*k\cTok Zek]LP_br|W:DMOtF:+ 8TISRJyn1=@SduG4c~£UztʩHn1*Ա}3%ʐV"P=ʸa^=9Vs@iZ fIM|ז&xH^ ١ nXq` 3n%DX8"WpoH@H,ywVd,~$I2G+Y AOKqlMuCWPEA۠3g|<}D X2)%pϹK^+݀h 26*HZ ",n#4d"*=+HٶK(3gutBjTs ;cg oXYx:`DLS&3ipH WKsU`U7toǃM_ɚܧOY%s2•B1|ՆV-E.JMؾN 㨗 rx bZ Î;),LUgu, NZ0I^[ @/W8h!8}8jW8MO6h9ݸrŌ姥OWOnd8w[7Ih_39F 9i/Ca\_\T̽Rz\IuU'죦/?HVj r: ZK1C[]zTM<8aW&B^+t"PSx]G){c!V+ꃓM [!.XŜI|R8>J͵9 ,2g:p`NX5~#qevlP佶sA8'5 UC"8US<|^}L /SY |Ra|Ji;($G`MR"ǦmxA;sPk'B/uac̔Z ;#qTubj.M!l {y",Fq[mlKW߈3QCq79 }dSzQ5+K6kZ^ 51<B R=Torީa :)2 iF"Yfɶ*;ѰeG?\|>;2`H-<ԥ'.ZĺQm,CBza!z- nWE;;oqV^xE&(G g3P벸XiF q3,xy$Z9D!lv^eEvsf)`~q#ma{]R M;,r5UCWw_,˷;;biQ@MWb"N &I q*YE]'U"R|M `ŧH :s-f>eY7ܐc  spΘf4ijyո;kիKqFL-rS+3nJLQNfUĒH |hs>͖7E|:.ų\쨷+HvQ=3kb`aO%Hmi[@&^a>PоQW˰b,I_qhs=Z6t5'V-o<)l"n,9Y}vd(6EHFyP^YbāWS*`_*RYsm=e18w^ .j7ċA k#kRS9 pH0%94: ;$3^XOē'd ^pcB@efrWpbZ1`Znݓs<"G5Hfw.IѲSn@#gTKڵY`.1C NCfw3ϥQ&lZ?M6SJ8lu_}pQD϶*0uf^]z:3(Ox/xm`# xZ|b`U1tϓZ콍σqwH%?UɊƚK=Ikmdhwwf}q㛠FĂqďI_j @pɅ>n>uT>Kw9巨E$fj}cH6\/gD{13Z:W9;w2W5Pşvx?8F[^M>,>"ECQĵpŤSCWTgNwt{b:4pUA>Jn{YKH># AY hZlh-ye䨲{|\83:¼+FZ1+Bl;*dyw(D\{]$`odk\:#7"slw 3 |[egdqͽ #|`1_eJ~"fhCG6p TaVPq%D^emG:ҍNp~NRu tEC ILM/ԊRT,/0 YӬ|7Z@hj,?!;=O+Gry3WZj 09k5CMdՃFofq i:Cŕ eyvijyׁG,PJo8u2i4t;+ݳԣD%uXyjoZls~1h3ɜM+v|,lBEִ'"w ;%!W H~k2YPIÏAĭЎo <|g\SWFݣW5)BLHB+G ^YhcNjXGp.!HU⇋zh-"vݜs; )4DM\E֌-qfoM8z`}D~2јľ`´֋V|sA =67z8SxL@,qlЅh9i{[w%bB1 @"\[$8ͯ/ߢV3e;DzP97g! ~ ph2J+F`FV' CJ?wSP^5| 8?dx(eq{ׄ xALYdꯘ kv߬ nA6O =8ǟ=WD0!x I9᤽J2>Lid%^d4?>ȋ*Dj`0.I^-˻ ٹ:p' RحkWPJyKrN&פ- i;^% <2G_3*B-h\XB>T XՏ,Ho?C/^S='=Ȅsd]Hng[ޢfR7XYpGSFrڎv:LEwՇ -qo^wLEb=X:,Ssa88Տ@@R~t鍂a7"xm̺gfʙ^B6k^B*:M$8Ə#AAok DBHRm-|aר/J*ЄGC5Tg@^,OX+n~8QA$ߛKHbGU|d4Y;MIre;`n~uDY]myk+NJ,pp4ZQYHi+,c,\ڛWy{JJ̡1N=P 2rv,Ig[y >,/$u{aJt&(TW\TSXtަ bu2XD.|KmӻeĽ|Zh@% B& &+}Lh~;U׏e8n[ХAySm܈e`g+ë7 *~#X+z*s[U}v $uAoԈ2SCu=6<"Ë45-- q]C)??BR6G@RAVT{bklVL; 봱ɄĀ/eIj NPdJD'i#^lH(lsF]S~Iw /qW0yMnPʫIߝi=WVsVvn[Y.;3wk/V+K>[8N)<uɅ4ŔBnGם W%REA@I膭"W7O~ar:3YC7XG b+sbϲ1A,DSL*؃Vڰ/ngTPKh{ۘM),4*#qB1lQnmQo|LN4]^.et~,vEE.,etW0b<y3Ļ_W˜{@E]6=$LX.uP5h{,3`+#wCYtѧ ?P̈́Ue{hC>)GA2j0Aׇ &s#x" {\`;X܆E]=GFI7PM1gx<3Qmnדl"PRm()0bp/(ztIds #Z]1MLX8`TFS7ω^Lm2(/B`1~h; [Z6#9ؕ2,4xES+J0.ѷk.Vdk#nE rGnq*k" 9>qRН7yVJzC-%o^xU ZsĪLY!6"S7`$]-NBJ o\r8BFqW./W03w%} K/16:nZ~[5O<+,]09)=I_FDKRk"sF3bd"[022 4N(X,Lr +ZVuf_fή*cL|dSλ -UaDrykZӨ D;/I9Ssns0T.Q h3Ù#GuBe+}5;4+z C+$W"y9܉ʃb0vy͎$!ʯ(϶dl&ӸoP Fx/saNd/eԱGŌļ1ă0??N0ia>EUO@Okma).o ?i_ohGU%,T!F֦/1lT0s4"7z)EuSK-T,+ E{w/lϐŻzJ-@)ܳyNQNxQ]Feq8>d, IYkF%*(]!v XBOX%.4GNW2[ mlX/_eDj!Y(^ws+z`ހx`쑻{0SP«e]YqgAtPr- ǎ&3fT( zɯ&fwO058-La}-zhcɡdJ:BZ MGR (fZEŔ j ]q>wuz 䮾z7%oqLe汰h%TGl;FB+%D4ub]@u_`$d?{a12 !xInEe|/7o'}"$!W/ 1ӸE^c3YzLEM]1$S Oi3u/(^i{W]z$#{.qsKAǕ034A OsYx(Ѩ0 WL5!IE,+|AzyQy7bL4F H7 UͅT-}P2,QP$!u)V#SdQX ;u˃qv Nwu>4y-QQSHl:fNl8 Q)xm_LCn7 DjEsCm4iz7C/$^M)HzMEA˾&"&(;H AK9u%~Sy66X\:%?yn  /rRbYs]7156jUENPq BK$FprADXoCea-s#7A?َOÑ8r |טBDQ?5)%L̗ RYtu72w[W1 cO55pfz8椪M; sw*T>& I-K|-UH 4qnmY~"T5{W}\6`@dF;Hj)afpdCD|ː>dC?O-o(SS̲&BC4& endstream endobj 682 0 obj << /Type /FontDescriptor /FontName /TDAIIS+CMR9 /Flags 4 /FontBBox [-39 -250 1036 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/A/B/C/D/E/F/H/I/L/O/P/S/T/V/W/Y/a/b/c/comma/d/e/f/ff/ffi/fi/five/g/h/hyphen/i/k/l/m/n/o/one/p/parenleft/parenright/period/q/r/s/t/two/u/v/w/x/y/z/zero) /FontFile 681 0 R >> endobj 683 0 obj << /Length1 1729 /Length2 10672 /Length3 0 /Length 11781 /Filter /FlateDecode >> stream xڍP.Lgpw 0 K!5 Kv9_uoMt?mow :$ 2$X,(44` ?r-b/#,4>!v9g"đ i6( v ' #?:Sz1[#h >G45CL B@WWWc['0= @. 3JƶJcAhXTC̡Ǝ l sz6q39e ? owYvbkolm@ei `lghly7v1<H - 0~LP''<duB$d|kmq2ۙ.ivpJy#A\<|fj @oO{= 7d@AޞV7BacMb`7;c?&Su7#ig?t?zc[_u>o"y suAf`gBAyX8n 30ϡS{lv `fceZ?_"Nϓ BVb{عƎ(ϭ~F\O41 lx.`qDWnnPOJx߈Tq#g߈4<ʀf@grz!ߐ[Y|b/?yQ}^M _9%|h@ρ\Ug?5cǍ LQg V7^2os}@ސ"vV= k ]g/|!`6XJ 'n~ink GnI}KMψ̂^Btts:u믖Lj,hᡈDh-b-ebSNg1һI=C\ L/kI/Rw:I4RDQt~t&N"Ticg2gGi:XOA LX|v3M:x=_Cd8lՌᑔ4uD[C8PE4hj'KUF'F>g$pls_7Aʮ-Լ'O6!H$IJqб9`Mä{/e):5ށgkИW2,@(q{} gb!6^npɷ٫VjO{?{Aڌ]u}:,"o ~kMYIJ71;S[yx>'6p쇪|hG3TqH/(6qLB/K1tY 'պ29/{ ~E]z˃0%[0Bc$)›U;;ӃKhrglPϯ= "?>=UyLJ=wIIλ\&%58fZУ 1 t;p ::&cbU:>ry:'# ]J(IOO8r$jO>Dix5}OɆ1b [Er$AJDbk!BD-&Jr(܏꙼%c(Na1cQXNfEú#]z$য়QoQ6$̢̫%Ӑ&!4ǃ_)xCkD%M5̦ӎTr jӉ%;UevׇЖ~IQ'wֵ 1-SA:dBfÒ)snd.3Lv}_%h.¯'zJ48Ex)qC7z M7fI5>H< s넒XMv rnEJ!G nȆiELWJ$I _}L;!B \.xb3_\`c|?->`~TG !P 1L#gf5׌]&"(΁X׎|J{vI~f{! uhe !p |-A-ElT4urS{Wq {o[4=5-x(qW0 `EG4.=ҥQKNJ{ 'mF[|W 4ު=NU_$QO߆Am5fZ`wԾ~՚cylKw[EOV7a9=}e׍0#?&蜷3L;2ƃo̚3~81na *6#iH}y!ـ֒P q# #NT2fY#Còwx*CcduKOp>%Vyᾟ]KI(E!l &׷GnQ:'WL= Ivשmh*C~9jE%Jpp :t ŶB/3^ž2KniYOPBc^ܶj/LF*]f v*9-к edI_ރcFCi#Cs뗯qƇM|jNQ{f8trς]Y_)l^('6},Q1K#=%Ã9TSs{ORl6#B Z:YQ!?FVzA8a9 * i *k.D3T}t&Qe|g7GTn|rr5KEO$Ur7UsŬdcͩO/Uvto*ϴ ۗN'٫WT{[}R?2rgmeJTwX&up.zd%ޞ=.>O&; >,is/6y)PJeày7q qo 3bUE|7dj'hDFst,6Y!2#gaUq~kIǤuwy>@KM(tٳYpS&GrBomd[3BCjqk?!"\IA$g(JiBަx[hجw3~W*1l|X3ĜSaG#Lzn3V ekV[m(-\*:-޼xMeQΗ-/w[H0,'<ܬaD:@B4הK4x+E,@ݯ,EyiNaiφWg^ ԣF3,<%OXA"\ i`Θm? YdiC慭_ÃTb#3ҼuG)b rU֪WAAdb Keҋ/;6V J/D;|A`-$eG)8dVOJ^ e ?*x+GA&'A-6(lhǥW5?EŹvۏ=,y΂/ǣ?w^>2 .rTq"z[j%u0Yᴎ3*ircBE~kU^9Uqy# xTIDAѫ91\=*i[eϗo'{ L2NM1)yԙ3{YlxyB\N]:JF= Bw&?~[Fɛ:X=xʤҁZ|ƜuZo(podH@%[QY݇T6Lt4G;ꨟTBaKBg&;3u1=$DeJ~3.'YN/'/5klh/? 2 d,aly>%\rA*r> &8s[/ԕzaDž&k"+@+ }\Y%Ӣm=y>X.r !V_8̶!= Gl٩gb(sy;fZ>+OM^ؒ!8]Bue~~v?\ Bƙ9F}zZ#.h 7PCA+QMgsm+%Uc}=k؜ZZꧧwEu \Z"/y`j_Ȣ Ldͷ3wވF { k2zjӮ "U-`&CRIƭv ^4,I˻']kYJrdBPcč/ŘjwT_"$/(; j>ڿ, b6Fԛ%PFzq!dX5>&"ѱ*KrSMC%6nh )AP1 a,ۙfa}}4DGY.)V65NqrqdT05 gUMQu:XRT呗o8ںUpQtp h B)T'!,9Q.M1x޽_HpeB&ΆP-.G m|q=E@O^=bfmYs0~4Z3EY µФ= Im8>Πc3ul"89`9.Z ,%$H}ͧ)UКJ;o皗1<!Ew$%X 6!|)j$[^̘u}9o #xi& /Z{s:q=)'~s,&^1ca(­%C/+/Y\Cnw׹~% RF:fa vZl:=JN`;,F ?BC M ^\|D̟}Y텰֧ܟZ|b5(@j%tRAw [B~*P (IrwR8R<44?96}"󻳢x0N6a tCUf<ˊ\p!Q#Ӭg;@雄{jZ7(Sͷ#tT"2W쑔3SE*)}bJ1Ġ%ekISnQ6!Bnlo'fr[K ͇Gp҈ u"0ud&7bkuE)MܫTOP|CWT, .mg17n/f'Ĩ;^~v3ߜzռMRz)FS~ƻMDŊOZ5{[OwAXܫMp$}9`_;.h:5ރ`If@)iKgOd(抔Aijk&Q&7ZOjmI]/6K3/K!Fo +x_}'~PIJR<ȅ+>Y.{^Sl$P:zC+`$ncIĻc`tn״ E<֕xLm^%fDWR5q|M-Bј|Oqw_滨'VC*I\}gf$(A1]*o'FYUy2ZNӕWyƺ9k[iR.;Ҋأ%Jdt},5靶VF"t.S9 \9P+Z*YsYAcDo3cMW0q%H1X S&,Jw>7K҆j$o7os=T)K`*R#n}eH}э<6tj߿f =__EXa_ӜZp^0lk{: V]HmBמ l8Uas4,EC_Vgj^AVmH; /YkpB=q6π`O. 4C֡vܞ;Zo&C+sY8a6M;{)*'8=aQ ϙ لZ =I'㞼csuPR5 w*ϼ$ m-ַUĸZWr05jЖK fo(ėS}u2 uW;47;H8% n) }hq!Oc-YQ0*2iVb:<Vj,Tx!kFaP=zW GeĂ_{9-r]beؽf$ogOW 3.QV8k4 ;x,\)т}ti|hzo*o߮: ;s"ܧMcIo2Nxr֚O [*% litgFj}KmBAQq3Z\uGIRXe 2aեS嫠# 8_?FۏȘ?dSn(hzq(VŠQkW~ Лwؾdj;g X:-|}tC;n3$&틹|bx#SKE׍j׬WcKI6WT>f,}btd#mxhh%kJxsu# 7TwyYm2"1F3o8`v,n<:fȿ9W̗a?N"[%ל~ V}5(YB-#`[< Vath/(Cգ@Rt:U#;m껽H&NS5FVp]ft/Hp\_JoOFjocj LMf;Qqi̳۔7rgɈp]b 磚JkۋC]2opٵWa`3j&ȒJ@1ei-*Nm/" YܩVfF0M}UV&$/>Tr*}  uv~3ehnuNyY)ZaԢa_3#ÇEe'ڑQGbv,G3*ۖaw6XukQ"n%Dށ5»#q-P 6Bq`P[lN?fhˎS頭>^N'zR2g91{Ќ푀gVZ 7a>3O!K~'=^${8?)4p`5Nvr?v% /cCS_$Hл=h}Ts$GWm({q>B4w@ʓp=N8Jfu)ѥSGO@98ZϐęE'c`D'G tD۠B-6)U*Jal?SM *DG]Yë?-vX|d%3Ujɪw+vSh!lX&O r#5I~NZR,03Ol~e_I9zakxꗅ uF2f|7NYRoILsѾ@1WxVkqM[{ʵ0h(BV`n~THiN-(OLK ;: !՘~֚jou }1vBEZwdKDN'>"z`yXDÊt0|x~A4clMCF֐MTnU߾-!gg7@qZbo==6sf >2w tQ{ɍX}'Oʣt·ϕ-Fb19m:wOS`4lB@ b4"/^ PL!ٯ~_J[UC-HxD.m7"pAaOZX iE&#}JOlG dMD]S!7AQTlԇbfiԀJ;l6,o8W %bTs9iso @>GeHk B/:G+6g8&K3"5ߛSҕ QY䰾nTRBǩ"++5VDMqu`;xL5>cFN_d:'EmxR9͏((GbsMn:} O25؝_i7{> Gz6OJt,Y}7uz9!s&} x nD3V5oڵA0 endstream endobj 684 0 obj << /Type /FontDescriptor /FontName /UNXFZM+CMSL10 /Flags 4 /FontBBox [-62 -250 1123 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -9 /StemV 79 /XHeight 431 /CharSet (/B/C/M/P/S/a/colon/d/dieresis/e/g/h/hyphen/i/k/l/n/o/r/s/t/u/v/y) /FontFile 683 0 R >> endobj 685 0 obj << /Length1 2278 /Length2 13711 /Length3 0 /Length 15078 /Filter /FlateDecode >> stream xڍeT\۶wwppAw%C+w`so\EY (bfgaH(+hh8Y85l@?$j-_6@SX6Utrȹ9<ll661tr3(nHNޮ6V p 32sژ:MA@pFsS{ BнXY===YLX\6 k nd9$jTN OSW ,1:-p~@c0;; ;?ΦNΦ6VK{ @YJb:Z64wsz؛ ) % 0]mAn,n6d]@/skI4(}:;9,m,Hn@#$vv9`qD,ZYjgo`Y89{1YՔm_ aw S򗫬??5{tz&0@ll߬쿣I 1Y:{LawxKMbEʂLk!h63? 6nR6^@ ?4X8Ul~_5fv6:qJ;z#I e/>XY@`C+Jx9^R_`U7U_ `5sۀ{+-+/Wp3S?jpE"n=x-qp+;x¬Avx~#w0˲<K?ܿN9MD~?!˲S$xX@ǿ,2 xdA@Tn7aSrWTX`Ou`gwG  ~8-AW n|N <-g{?bY]Q;f ;X< ܑ__F kW_8t3wr{{^ApV?E]}I<8?W/x@HK Nm޷׈y2Mph޾q!C@(ەq%gS҇V H$i/& J&9[/aB,~C 3[]jaq,p'@{.pD B~* wc HEj~Cn:{Sفe2'8.;7#-e!/ 0:Sݒtb%+*n[4S;q8eCgO9 (iDž2?}yKxfeξ`ťP|Qy+K!=iu(&>aO'ȸQi h i(HCN) Z]~>]v>_;WSO;K}3zU :>' !b/mTBbS?H]+0pl"{5؏OPge uCyW!V 1?XҘ/cZ=Gb脦LL.cƥ/ylP&@JUCNV 5ϼA>#2Hh ef($o%^kFCV@"` D5מ)NpZ 0Q&X:ٗͭ[1AVvl\պTA{5JySΌcƝŠY0Q3ȵ7*p/  U?Y@OV㗪"Z/\fj!L^g܏enthpv-b,hjF4^UXw)sJw8;bn}!{;F ykHT4dGiZȸ(m:p2P67s}y/ӋER8j JxșzO,6ՃlOK_:g4us#EƺQ BXv8YǠZ}w|B|sUWߠ4HN,H(u9ʍZ 0)V-dSsH-5lxG׻u JX1+,db\pwy.FXo6G}$R oiO{oajPz~;wG&{+tg`&wxC{5"c`{XMGz5>p1jHǎEmV(Kyv,t]q[ VÍi;TE?蘋崸yX75Ɏn !v/hֳKjeH>}P5X`H:1ޟȓhwƩ1+4}zV{Df†3hue rwD!v`.23\:d(p6\5_^QT63pxÅfY2>7D5S:"9˗x ]#'0} 7g/[9,nNki4.- 5Z®SKQ V/8 0ic%F'+WD/7^4LdB.*O᧑3dwff_ S|ڐy'Tu`Ưɴ(LMNˆ Msc kPmґVz.fI(i^ZT=Tf!bH6gYS> Sh)DX>!:AbFܤ0 g-:3L&fqtKV3"dg'ϝw֭'Wd9h 9(Ł1^mUVԚ']CuEU)<䬬F77wI '9z ,#g+ wqϝaȷ;ImuM*}M݊+,UCK7 3= /ޛ,d5Q)$@#4Dc:&E|Q/IS}k#cZ򂮔R׈>Or}Ĕ&G]v--WI7+U <*nbD"^ʍ_dgŷ+WqDg5cBŃI"ELJcQ|ze1+$i\.iv'X Jk x8W/@; 4YH!&T'kJ^C򉜽ƛ!o/o" iX͇_nA$_QBM? J'Bľ51ˠi( Mh J*ϙyukhX g@071E>"_NO|V.CtL^4Ⱥ3MƃQ9Yד;|taߢb^ԃ."v{5;>N?Id2)Sצ܈\׺uWZ/d$/J]ODi3XfL(0,~ΙL\;"G_c}4In\{Cֹ^I㧘gIh a?9g~ mTNA3Ӏ2"JX=w{u!K * J@Vǻ Lmw߭= ΡYݕ=e\1?G:̂K|qE%<AE#;eیIݳosy$9G=2'}(#z/pb,X|6LRi>W|?ղzFlF5hGv@*֜?ѻyt8V `/"np^.6'D>UEe[ )Ryk=y"XjG+S$;Z0l2>Yŧ gKEQ|{4ίyCZ?]K7Ed^#ECr>b >&MHs܃-RX0,Gjn98%9$,iׄ5" l\/׮hZm'y9?otDlKu'oZ r𬵬PX5e.g6غ.LۤBsOXe~"W3~iZȾߚp c_XƗ eNPg>6o?̡:y lJ13V%oeB@"C'ңr(MPhZ3D [2KɺaͽQȯ'NWܜ7Wi|Ac0\\E0xQ}'1\q~eX0=be q0ȿF ņh p}ϵtW#֛Gۭ3dsi|n"UY#"HC>AJ=l#1ՅNQb+- ,SdGf|9x{hYe1tMJ S, o{MDAz[٨]u/)yC9;NæYģ3aTvAAzTݸIzA1#ՊkâNj R=ֶ5"6pl)}#a`*=}%p2`K \-oHZ:&^UZGBB莛;%0;;lM5Q:ίQ 0{5S&XRqP53U pe7lJPpHۅQR}zqG |ǂ^vqSP5f2 ez E?x3'c&VYJ^gIz"V^ 얘-p0wLZ U *ʜS3 _ȑx4~)`%؇QԞg6znAph.J XUPfX5B^E|" c#YX V4NTTk"yKqc̹=$aX1 ݇UDUjӎK%[h NRaOHdWD[7D\AP=>; Tbi5<$JsS $4 f$F[qr[B1o$-;<&&O{[uQUv #)o5ʙ0o'oyzޤlTd" 2~F'\|n~lTʗ^%&:Ϸi7>'T#`ĉ}D2Ie[f }0[Wnt?}?g oo.3CIϱ`[f5m*YMw, oTL:i{"A Js}\Ӂ^\Y^.$LD.#5Ha J_տa=h8c x[Es,vY?.Ey Q ~|'Ȅ1愒-T+q9 'ΦtIl.144 Ut8S bQt`%!ٯ˅1T[K;@"1v5&C֥ZIƶjH/L~.5u^8'w J|tZuw8@3`[nǂsdXG8Z+ɫ9i856]Ќ5-jGkaGL`wk-1odeAKPcik1w>⼝d9(RbpyPw{˂:lkR PtLYv,މ”i$^ gi5ڎbXL>?%mbƵwcy T 4hrb-""CAh}p㋼b51pEA#&sǷ°]%$1eK`, iPg._b#gj"8Y/ԇr &1$_Z(w˗SJ+L5Vx>}uf3j=GcOST(NSuǝ츂%j6Ҭ<'V=林eUel^Mh|+ ^Be͘'-l7,v_q B!.Z8v'\.0BD"+6וMEn̚ YZ2~}Z5^/v^r}XA;+sk 7ZZ 6|"@G.SrM7y!5 ߮Vn6=A ڴŎkL뇸V+u9Eh,,Ni~|r:~,)QJ66ێvH q7^?pyU+|fA8:mYDΗ.f_~jw<t F>@G?ed#d_êK2A|̜qщ8':e9D6*ww +U4h@j_2+o%ZG)IR5:?%t 6챷k"Qak@!&9Y ތ^{buQhݜ+6 sV\=F3RB|DWZkҽSjdQ2)]Q~t;%7]>ݵ$%v׼3tq{*,$(-ySk(v>Z9 _6C5j=7Y1RsxYqDpB}<> bW%v&VQ e:Y {5s;z~F$Uew`J~@lYZL]^Ev(|.Olmf@hg!~F8^![G~[F X]xt8&DҴ\4m z JPG/I%^7J8E59| kZL)$msoJ)_Ц}pȭg2}١J fk0ػ>W *N-sl iBJ]'x@^f&Ay+G݉`4OR@T-ג|#ITBxv:W-& KpdO`ٞGs( ;C:-C7.Q^)ykc[YO-Xe9˷"&ϛ<#ō'z_HuOIL}_HR #v>? #IN@8O5}."SPj>W^n(/AB3NuS){W"?%L Tƒ΂ډH(ڜtOT(-ڷF^oqBpWgSOf$3VBsZt d߾Y6?XTjB!/SӐneNn@Y=4K=r`>1faIⴟP>Pr%0\0-T(KX0?]E\% _h44fp6Pӝ5A_tՕ0XGK hfe y4kRsnrwSL?vDOm(2-,fB.ɖ|̈Xj.OB1h}wV?K/[|,缁lsK&t-2 *0Bę9*oŎ.kdv{eTR?fAăp>vBHvcg eU->kiנ-N⭦3Pŝ6C*]e-La f!\%=Daja_o"(c? $N]>zd|cjHfWܫ&j Е=rX3 ͭn 1)P㑥rx-vN% +WW5VNADrYdsqfaE4{RrKbVo'G Z/4hmuJ~srC}vev UeyA|V p% w!&Y\3̍Jq Lꖂ_3uWԁT=Dp`Z3s,<>R:+%RH?vS5>NuAݦ> nQ@SGԆ aI"kxw΀G:jA2QA农Gi=tTs "j[\/;}DЧ^Ex_N0kZq,9`OLtYvR8`=vC)SJ͓eޘ ܥ*<[MJw.3žmxtk~W26u -)$#:Bڹz\2V={>* Gu(zEv{eWa1eh{3! 0Wfa.agAA*.>yK2x˴6y*^-#tFhc!#,Gh yHɌX\`v}sulA}֍B4UOz)[*?,Ò?&&NQ |E BG&$; 6ƒJFyIWM@V-:-ٮTv sKդ2=H4J,Īn %/y&`>&rLFy}~3i FMGj$"WF䳃hl`5Ɠv݃ԻgIs9ۋ(uF,o~7<8CtGGCL$o 6ס4^#5 L&{oB qwȳ6aֈ l3+"#cD.lA(KhK譸 J%כd fwnUH>MgU_ݑFn,(1َ3*~QQpơː"' !Rs*X#?hIqaJN^7jL!w$"Qa7g_zW0Z cqH\SG|xjO'" +¬1vby}15vHkM!SnTOBΪj+i\%=?]fNBk}XlARY!`'G~92t $1<Ɠ,} Kbs C@r-$S|6)<3n>aS ʓq<ڳ28231RBH]CM,G%n6;>_,GMuĊXVOޅzNZ@5hp ;rޓtR۶ϒ5桋2q}K6JX^զwօ oJkP#@N Xl,|,@ 5$`մH3c^yͪ<%n0q/Lk܁n+XDyENo4!B}M*UB\d2/q6 M1Uf"Y +_l4no^W :w:}gG.sjGb7>CNj*%;8A=d54Zaˏ$h۪&bi*O,rir FdcAT$َ]-!oe/5NV5v{]?WUG})oiTq|$l˛a"2+C!H{ 'Ieh-myZԴ79E49"smOA wT'^eFty mo HےS>io~o\\Vdb"mBJ.lˎ䲘N_''Cc좎bpB*ec͟C7lI_Q7gL/CD櫥G5¦IE"$^J 6FCKH,evANJSdBC]['`^klDT8I+:mup|pTv<{}i"vwPu1%M2}Luw?1"LWz B:7@֖1URfxk=pɸNnˑB?И\ofC maf~J +Ejk^Nj j=)ɧ1#Sr|i9^Fuٙz'H5'd_ge52Nok6CNpϱRv ϺD-ѓeU\O9DS9L&h0~=.I˧ iSꍇX aQƗ}Q/jr51/VT*#Mr5^Nb^Pqxc%`KvCjϯQ01S-08!{];;#^``򁆤Z;&<wA59 P53:'WM/U^Z%g[=xF/_iQ>8MہȽ&Aݏ.ؓJ~: =0a ԡ,/IR22y1 I+:izZfoD= (v<~aNw $O0mg&IgtbMUZ +@)e#K Sc),Xê'lWbYNX~̯& WJI[Ԗ"@N1Ӝm /`tő>[J22R$Vmd˯$9 φ`i!z>49AZ&x+ipD1pE릞ڒ( '%fcȩA.qU<ܴN&PR¢K-cI-3jïس(QXḎ*2Ӫv7u},x=P4o9ܬ2N qArUѯ*gI8bfĔ @T= $^ l "B6t"pGlȘ"*_\`t/^Y@6lD[W*s(`$[u&֯#On&pe&KCTܵv N]|EΘIM*Yz؟xt{"4||4fgQDZjЧB?}sO:V$5 l qĦ+$:ëfJ$+Fê Mm3QFV.MaqV.i9q2EpǘC8 2^>wz8M0&4H77̀O e!N&Gal(BUSrʨ<4fJh#H6q4َz)jj clhIϘ]EFb{26g*Sa!Я5<1SZthEMH"K|E&$"n.$\D_lȭ5/GZDk31M乯WfL|ZSGO6dfDyRtho-[pJ\-{AqxDnͅ!9taTJ᧋VĵqZYo~ZEOMxk4K^Gjȗc4}+Ai~H-9[brEsC"w漼eZ)tS.r/!@Xơ/kJŶ02[[(6*\D)% Y<ٸ.7#ts"ǣ1'*h X̿R~IH^3Cam'_U2m K߀s։@N`I׉$1-"Y"ȳ3)KUDCi#m:sOftF<7_;Թt RH x֯\P ߗoxbۮuD)2q0He܃+`LSujyYjyh m(4`a+j'o{Pz-E)\/H8|6k(?f Nk Kj"%Pێ|LvKpcV. yoNu*hTh@Txl4S[&Κew~ev bꀢ@l1>^$ѡlP6 ȉRl2{!8%IT2ZӪ ?a5  ,PB} GgK<9^#/D b7GG! 20WLn'h9gIToR&`)m󜛵8*uE4HrzG7ރN:$FrܕI$ -vQfs{sGQIwi6 ^4ב(ͱhӢ([M!]&"-IlѽI3I؏IIorʃ~{ָ̹vGӰN?`x>ĕG~#6>ڋveijnbڔ ~x->(A?9XaxjVGMa_QJdXICt" нYZ(ˁ43U(r#L-(勠f]*.`Fr]OYmP "1N?{vI(뜼b;R+[yOF0|lnÝ4)rD}f6bg D%V}9JggJowS% |! Tts,Ƌ8G9)E'4ö$xvf)co~< E򂅛E0 Hx4ֹaа':Yw0o;7~) z OۙU87 0JMQ6щ?L;uN:5?@4"튖Z5C %@dl6r71;<'GOQ]Ե2]j a?-[og+?c{L0-U:.dTp\Q-2(^ S@}>C}3MLZ#\*$'_E+ӎSu8V#ï[}xk-m592zS3ş$?X OȪC*Z˛Ѐ´;A*#ͧA3HOHҼfڭԔ]%r1'0r:}轜_[@kA .sT=\~TXx9{dJm1+S|08tev;R5õİکs4S ɶϯ (W3C1^9/( V7SMv0bīpJNPa5ThQNc17h/SnO*H\2?&&@ EC!jx= k~F{:ߞ4 U+qot''`!QsTuXL;Fg* 5#u1l߉Dn [Dsi M :+Zͧ? ;yfǢ6Lo/:PIեD)o2?`+)ա_Q:mG%HF=U7siȏ [3k!Ќ<Ќӱ]F;ݹv8 {%I||yⓢ L,1ҝS_ DMh쒳KrpJvp6P[B}SFds8Я>h- '~&zk\l?~XzfT endstream endobj 686 0 obj << /Type /FontDescriptor /FontName /LKORNW+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/E/I/L/O/R/T/U/a/asciitilde/asterisk/b/bar/c/colon/comma/d/e/equal/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedbl/r/s/slash/t/three/two/u/underscore/v/w/x/y/zero) /FontFile 685 0 R >> endobj 687 0 obj << /Length1 1459 /Length2 6632 /Length3 0 /Length 7614 /Filter /FlateDecode >> stream xڍ4k6 Zk=z Fޢ!z-z-zKINyZ߷fg}}}ug5ue8 tt Pafօ"!q (&_+Ɂw@58  ~ Po U vZxp ;{Bmw`bpN8A\V`@ 8ݭhv׿JI!⼼<`'V E!;kd: g4fW@nBwGKqYC\wtT_`տ\?ܟ_`++3l*ì]> u[~(hwa uF"xP_3*s0k C"p~'uXu=`>[6Pͯ1ݜy.n%?;|$@ʎ^ΐA_|1 ~P ] ~>Z![( ?wzw}y2c5#} ip,-"BbC_J08@nP>#.Vw_|lG_U<ߎ`'qݐw"PIP}_UXCݜ7߉AfFB PO&ie_?4G( G@-n> bwr?wܩKìֿd/$ pw\^y`wu"^/oKK%vcq)xuvtCW\m_+7W;0ۿb3;i^\\n3BLةO{:"ka]N>9S6:Kű1iґDY=qa Sڎ$G><ע!0F7fMПبX/iElEgIT2Y;hцLO&D)nJFnТ-1?VcS?}ڗۓ,pU)\[>kG  4A` %g.VשVf{[ܣѫOܧSm+{<%v46V'=욡em)($򍊙8_P0B'|وCXb'"헿_]H]d&%& 4ԞOT"x#!FCeSL|d0HU*tA6{ŠSh_QQoozM"wkZN`qZyw6R֒}fYGx~3$ vڕ\(SԐ8h$Ajc:.f,%m/mw=zGEHUcIcep+@ܩUbjre5=E:'2_7h8!#${Vͼ7;pB̠yrA@_VQ!=1ϲ0\:%uoN_Í(:4$F9Q󞉊jh.1y>b۔h#`]JlUKhXjnKF^7ԡ oQ^됬&&}S#h^LCA_ݶpಕT9P2m2~iV2Ibp/ L̖QqMH9)T%%=44N3*_Ra<ԃG> e$C 4 |Dzh&%F1b:.&JeV9FVv@!mߘqMFb wI|=%.!mq^FQ(5) `JAe2_~pG k] Ez3B)qK[ ñV$m;Gف鏀2?ǂx*:XoS˲%Ȇ.V=;9˸*1qz !ivaf_xK :cepI9ORiOKoOr`eMTor(FsiuLEK$r& V^j$?Tt,No,N>}p% I\ce QNREtP=mv~:B$On'|dġhmB)m`EDH̓qO3SD9V/޲'o~[`k!PL-2[I((툯­̵R?y܌S3!/>.`rFUdM˫g|Iנ^+p/+ӡàwTP.|Y=kTHv ~o/oC^urp 8If5BqX ℚ5XIȷ ` >fɶ 8 6k2dBݓ-wq`ckvN@i S*i$;^ԅ+f+sNIZ󓱢u֚mQI(+I|?G|twYT*Tݴ+ lyUpM*4ww'ulveMj ħޯ! xonb?,_'cQ#+B _ hz+2 ay ɠIUHQ}-z|۳e@qEM=ogyJsd5OJV76/_okB晾dKp&}lt!)@jUe&?:>?m[tC>窿2k~ͥV>oQٔ viScf"ȯxс?#$xC%u vuH`]Yyz ISEi^{!c[>d.?1Ͼc1:gZO0D#(17N>Q5*3Z}O{!p|ơdbTUkGbʓ<zPzQ+wsXr8+֊[e݇pDBMU*8t5"[0kLq1q& MO~jڵH1)J5wxآ% Ba6A>^#s2ikUNMf USSc6etE3(J#<#Za@[endiʘǩ ]#m'﷧Ηe06 j݆^TirkQ,~n4ħϟZdmsYyj|{[Gf3UɩO .·Ec5Ĵoj>4\/.#7MTfP4`id% |ϴX1',| |.:I>.KBI3|/--{( dUĒ/ѤۋrpQnm'S$Xv+:)}fA'?cx:3i?C/ rTI5i`59q!IVb>u Eb<P\ɕƭ]mC_*pSRj [,-2.sZbN~j?X{hYCPJ*VH8!jZDp+sfpXw Sā><ƵP>v'B >W$DҿLxS FxNaQH ΗF9΁{0qan>\lC\![4:8OJ~~ȟUJ>,p& jo_m.\%L56qTsY eLd'9s;{?97UВlt=q$I /h$#c"YlL:!GZY0a]CoOߊ'fn[@3aДh =e]: C c̠TmLE1oSEħnjE8W6JRZ=̃g;ץ\g7@ibwl|uqCwlT <I=ӈR͓J^T6v >gN,Cɉ!+IYfΪDWBqXK.rýPp&)9u"'p5໠QMd6ݝ?i'YU%Tp I3NVdM} vQ):*g[Woe"*A/lχj-.,*<˔Ǒ=L ڮٹ ( 3}{9W 5Z{CO:Y* gy$e2]!"k[0+YBkf-%P]>B'Zv˄Ԭx5( ǞXi_m(?a3;=&p,B6%mew((]v<)#u&yNN3Oٱ Q^]:@֥鋁eVg0`yހ>v&o;syLڝ~X9XvcNsجskZ)Bm11yi6Ăt^@2N(xdHl'Ts0$0F*)ϸܳ=RUض> #00Ζ. 4kSCf +?Y ɛ`}@g^(Ԋ~h&ݩ8ixMԺYk1#᳔]RHM ~y,.N1lzTu} <O]~˼E*UZ0n@Ƞn(E}ukj;QD8%>Tq}/(c8FfYZμ8hT(q-pKeQ,qqJ$x/l_ANQ/[Uf3b65O|Rܛ'~6s@y9с,+ #ņo&^$oPcx'xb ucE1c6e+B:dT"1VVbAV'^nv,O,~&/&ѶEwgh(b|wẂ}gdž0$oia9FdZ kEPوƵS ҅Nt{?Ibs@x*9ǒzj훊N> endobj 688 0 obj << /Length1 1363 /Length2 5960 /Length3 0 /Length 6889 /Filter /FlateDecode >> stream xڍvTk.t#%H#1C HtJ0 00Ct7H(JH H )"-!9k֚yzzp +jhF,udH\#1F`̤Wb5Qh@OkO/qΥƲC IeRsG"7 %;+4Vރpwo&"5"^p>Ö?v_*C"Pp}k@J }ua)*%UQP4$+ědIc{&1 *Bc!v<Jk7Q_&b{ؚ91~CCo: m8Pd^#kJ4?&~>d+cIן( c:ߒ4QXP~dC HG-H2FecI`ɗro,LU|Ry۲:Rsbb90i]-3܍5MbGJ ' SS]Y;w_jK1IdfHʺ WIP(EHn r}j*co-$5&*<7q:@=‘zpՑ[WTiv]KavnV\8/Dxp:)Shs679_g\ d, +^n: lު:8mѬPw+]r ӸRԨ5\B؏ȤK3])R vnl]eܽQQ+d0f-ٕQ[UŰQbԔMB6 AC ƀOfhyMWRQB@,vcQ>,gjјJ3cOS  ܳ F+Pe*w뺂ju4Hb]&6B_=sp7#ð!Y@ >7{0n|mKq9Y/$Eپ[X}C*N4^ܐCL>M)eh@TRF%Ɍ?dc:/g|ZwtƵbjbƂidreb(\mj9Xʆ0lESzŠ) M #p?0_PnxI|ҋΔY?xf_U0uWFK:h#cݛ'J |Q$W>1Pl,|JNU䅯ԢAoy!+i~0ک0a~%:R*n#s0/ !Y$^Zm%W+fAБ??;~AxT``,I.:7&q`H?{20yMZ0}gj|:,nDž{̕q遂bΟ}y Y1D} }̝E7, kl *.ò&369:Rؑ9mw-SPv">u᎗Kaxhϑ uNCV#ލA⻩;9MT\d%b;_~}ʧ?bb/OHaKeںQd71fO w+7y Wd_銶l 橯dLKaR\w@Z_wfn\[݌걲sa1^gli Z`xqLx$oPgΔcYߐ-!wzlv^jP;hj*jg[M\fe͝4['׽҄V;8JMnp|Z˟S~Jm~AMCԮ(ʰ3'FK?:Q&_^BbRo=fC>4:>'D,!{|w#QY>~bZQE> +7FX[Shl\,erߦ\QH[&/V{7&t# ;#:9:̡JvH/yHr  H&_>W^``@(i:ȡ"$-8)ʤ|ރGF.⢇7TS׆#W;jyFl[ҸZ72loA W_fѽ{%[eXt<.@U henj9d;ܜ;l(oas9- Z5ugBr?ΰr5YYV'Jm6ŶE/w/a-JBau+Jɍ2V9XnQKnM.߬ਸe9,Qlڪ邢É\ L &W^Vd̫ewGNH Ώ@v(^Mw!R1RmEz^VCB:3jZYXFv2^w^bcpJ"F~=B Ɔ&vUYzVDܡEo-P@YMoM4&˜E'wKKt\  -`m4WMervTf9v? ,9O3go>uU-4 q5q\!!1g#b)LJކ< >9 AYebBF9R/yC^voj6Tw6{'!_SìWj8a.[G&qۨ;Uɝ6u?WqkGy.gN_c\ُKI?ܔ7^>5K+354[9׼naM i,6L`\f"y׌i?y|LDƬ!}N|eNoD#YCfo\IK9[3-Sҿ𸘛~5FNǽ'_#St^=g1)]:Y^CD{2f߬ae9DK8GG/z's:YIPUԜjXUčkɾN> ㅢ8 =3\q?jV͓\,\_t?lo~^)BLCZz@(e`grOsK6UO$~ֹ3觿lu3+wrJU ji"1FpꈩH.(ؓeI\oٓ]9D1tE^ -O<)}QRLs1;4_|ᦘLfsBiORzpiIy BRܱ[ :T󹊎>}%2(O522_¸oTT|aZBD6Dk?X==ݥsucђL4c4mNΜS7̦D߅gMo~xrUգ+)!IJsDix$>] +_ \1jB+"?CuJ&:Lȷ+_CgW'ģ}sllHoӯQm{ $A)$dzV @ WdUx}ePN5Bfj9|qGj cX pѭx">k=Ìm-OY7ߎy/Ut0ѨRbߛEϞM|s'Y_t }Tc|YI~:Sɧrjj  aן6Xߊz}1[#kc8zrRl1EɢbEB7`9직e8f˔GY6(_*AK^,U1>5v :N"*z1Iuh*c `cqzp|M!bYpf7(.JRge\C搓'ꓓ-_|3杉U0U-ӲL',5O 剞fhӪnU7}|g{DX.KfI; @#yfNS%YZ?Yp{;Etj,"Ray] ,*;ig0NMZ_մS+0?sXo0חV]["yZ=lX&"8Y1uCF/_XIȕc |;"Sz5kf*z G˯%C|/םس/Kiś+-sIh';SۚIZ7Ό`O;ԏjx8r:2 }棲|UDr ]F.g\ ޭy==!9 &<z=@[v 03z=ܵXr\o5x,WSC= H|^]Wz9rM sLݜG VU2#Wmy%pxie.}~GwC;l}s$E˰ ha| {WNi8JX{}37C^xIA=@U}L#jY.Pn(\4G7U]t/0zMjAd.o6-xAH.&PW3&R8s\;&JF963UV/p>'ϓ -GeCƇ]nZb)hqL>-v+|۠ 鎁,9j']Ԗ..<P7&.0+InY=bGKl܎Zh,5NW5ࡵ)~;|*=l/ЍWJ1E 5 Gϓe"EQ"CXS 1(qRwII Ow!#tǭ?8l>iyiYARïP/.FI}|LNHY endstream endobj 689 0 obj << /Type /FontDescriptor /FontName /FXEGVT+CMSS9 /Flags 4 /FontBBox [-63 -250 1027 760] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 83 /XHeight 444 /CharSet (/R) /FontFile 688 0 R >> endobj 690 0 obj << /Length1 1385 /Length2 5961 /Length3 0 /Length 6893 /Filter /FlateDecode >> stream xڍTuXIHO$6fñ9BZA;iDDAIIAJnз~dz纮>χ!=Bbx| 0 @66#8'`3(`0ʧ\AQHE$ P BK p{6PQ>h_@N(,..;(Cá$Pq\uB@C*qqCex^pC{쁿@\`/`90^4 x@0U^ku]a?Zxܟٿ !P(#p Ň!H_@u+!@y} j?7tw>w8ז\2^CbSaЫ"Q^H?ik{W~c$'A Hs¼N~W{c]Q@U`p1h??`0`p$Wn po芄` 7+٣/_GP[S+(X^Q0W@Łb +ANHPNꯡ=dB0 ? WS/ Ϥ@Fp_ '+=hTo)+S@T!tD}pw7^:A?ƿ$#az(w  WJgЇW+fdH(E4+K_ @~>$ sZB~ݪ P4Jf/_oM`0(`r u m<]"N=~ ;Ph}өjCp iE#4R;gQ(h]g0~6B '@&kn;~ў7\/CyM3U֨2oLn ]_:e8R5LG`9c%1?¿ѵ '8S9u}6YwWqׄi쁵RT?mO?c5~;3Y ,Ÿ/+t<-yT(ÇibK xWŚe-lx٢ mequpu}  t};dZ[0Nm۵RзqNO^2PJmJԧޯק{3];l{-<$aO@g6jz.YA Pbە!]hWW.D`Se "&B-Y7 ˬ:|,?~[bqA'ld yi;BnV<1bmp XDg_4X\?)xTM@!&>S U2TKx.'n*.jDHUT1=yzm][־_c=.4$y 'RUHjNܙJY&-P@!i4AA'=paVhzJ˔xWTtF6wrl|#qLhnRٜ躰Iyq -Y[\ ! u%dz˽] "b̧^MӸ K!Htqgw3%K3L@zSYPMB^DsGpLYC:4#DeJE%KOTq 7:wx^2]|$މLrqzn YqB έ7Rig.\cP]Hb(נW45{>Ln!;N yl9'˺5řL &1XgWqc3,xgO !3[NE bDOiaƤ)~r~+v{zkLNfJ%vBSu%u0chd \`vPr}')~֑e6L袂 WF#eu|`'"xtzPp"3lTd^v }tb{b_cۖ/gэ!~hT@zo>TWQ8uC2%TlEI^R<6咎–?.] L,ܓ,~deGS2Ikg Na׈u"oHỌ83ZX9Ckn'~ `,g0#&Y9st{ŪDQBvLekxn>V3]8樃iZ}s 9mK3hSSӍ'n܏RoP<>4۽gE=kQb+cCv >IOJZje Сsqo Y4=H_.`[FkE|י8\\1@tay`۹{!hR-8oZa|ǣ:Qw܊:XL+&yG͵R3l ^[+7ޝKMV,# *ួqv: س-o&:;߯s UW6ͦ\hfH/]D&-zmώ(r$qiKC$.tX+_M^ɅvE}⭜V3kvb̺.6d$9f;wFo}EGfJ,?$xVZH./Մ."N$6h$܅68cM* ҁ.gmULZ -r8%M)=zk`cϾ=PLe]nMtVY-Uɭc6\V/V֝.fg9:y6F<_@CN)&CCiumr$~ lSA~ "b6[2N4#kMO~'eE:ӵlınu];bl( ^IJ\KgH^*;u菉Xxws/YG [a'3=Ƨ'_^y&u gH;1} "EaC/79m[23ueaxBZϨ/ܧnԕX[ :B-3 3h΍o)SOiE_^|(-\n3b_'>wMtĩpl\kLeS*z>!!"K5Mޢ2xDc̰y慯&'yOTW,/0uic^/W 4FA3+ft$o=Qj OҰ&\S;]Z w`ePYcWU {46CVUå.?T lLͨsrx;< I>z]Bw;41)l_sx($XmD aM1.g|asn'D|Ne›_S»0>Q{W&Oū԰x?GmI4w.8xP>?%. ?R&"(|SEFQkFejōGppk&2[Ѱq "Tjح 5rdҠ|> endobj 692 0 obj << /Length1 1531 /Length2 7212 /Length3 0 /Length 8233 /Filter /FlateDecode >> stream xڍwX>!5.Q`nNIAA  iA~׮k<<}m:r-TG $  $  `(gC%ڠ6E<B@QI1I(IED %60PC W$^G '>P@BBw8Pm@M"à(|BJ{yyٸ!2y^0PEzB!_Ml\`8#P^6H(mppwtEU5ڮPd?+/Z@at.Wg@jDg(;}@P0`z s{V%GŻ6Gƙ `%>Kik~NztcYj S /=m X)=q#Fq̑v2yEHz*^]xngڪ?܆tO<,iy^* ^$3:zlj;= }ig2?ȉ$D zt77f%ZWsH[W#f{F7N<m&pI;,ߢFsj^<3Yig02\1Vh]Obڴ`ƴ9/,"jo.#~OzF (/3CV*4 6VR|9Ր8]34T 3oۓnh\W;EʩK}2el]-;v?#q9IJi623wߧjFI͏Vg9\Dԫ!zo;wMoO#:)q0﬋`Q"4PG=JȱH&j~xUcĢrG}{úڡIF#,3EZ܂mU3AaWm_vCP"ib'3w&K1Njh^4a+vX2СXs1HͿk}^:>HDE:(_ e0RՄ譖^;FQzU,gjXv/|)bJF#!syToCpYUőEo?OSbrr/zv'q4}ݚq;PƎˑ^|ӹS _YYX3ؚ8X^pP1Va6BcyuҠ$?=uO5Ռ x!^MX~kP#;-Rc-[׾5 xKX<{ΠYyEp9^\|7H:EltS]+ob|l+*+isN7U.un@q\p:VLWJlhe$ws nFe?Zaq -Zn큏15T l.k+}g~@Ʈw40nR˜htC@aUkY805۽{' !^[7Kς+~81]Q+@/2& őĴm~8Ulǫ$k9wȗ[WFx Z9A4F2e؝[wkǍ*d + b[ 2f{ը1in'0XU2dccun;&c})=2ۻ6Fe%]BM=uI[À*<>اvOru]xt* *ډ&RAvq4U>>6:a c/p&xc=N M\IVp$Tgz^Vw4$AM*UT..*c3qț+&HiOؼav+R>8&"4aXG-0C4ͦsR"㑙k q-E@k`iqOSmw>vo_F/$rX\{;Z~\2 #k'g?wͫzt}UoGTVt' ^Zr^ǽWzb` ˞ bae9,Yrt!ɶ[9<=@ (MA+eZuBzz&n\i (.UӅfZ̸Gy]}!@<04V/;惷cn_}HZ/C1>ZT? 1k8 is:o b!eФtZs]#rTk<*hղZ:L+u!4rSŘ'T,'9I3tJ!PwgŸ&XKryEo&;RnXz\Cx~'#9z:zGQ~ҬZGG|tSGj_>e0qOO'wh1]rě /Vzv >I"l\ [V]!A [c$C?%n,MG*Td=\~)o9 +ʱ&u㭸>{pR"Xh˳(+hGF^WRX<i=T69\m5؃+WT<%nw֊gQ7cqL()X#vFʓڣ&_3 }s شJ`mK.϶2M!ò^T}6}W bX̭XYLD;O_}BҤ'zNn}pvάپ@4d^gIaXM߯Y\eKpu+eF<hn#f$|[(@17?iWֻB'6 獎H[TQxoLL'k,6{[[WQ"zCpr- 3=Ų~:> 2ϛl wcZr2?ow-3c4s8AI [Osƒ*4Ɩh#>As\%GfnkE> mpsn,rI)+@z"k;6,T+`nVBsw.QO.ɉ|Rl$Ѣrf!z/t/w-:3{rQX{ pпf̵EY3&UJ72z /X&$zj-,pheۉU1>&HL*m`k5ymtʐQKn-AL<ձ-i+J7 `t61j pS"jj} ]5&K>.tl(3~ARh͸0jmW\o0?`uK~3t;uOv/Exπh͑7ؓ͹1owwi>[MŇ^iRpO)D?aj8>2 !^ܮ8I*g Fk*&rEDd\ ާ?!-b?&)!]#n@"W R\>ۭ8@K>| O^UhjbX⤹x̀i{zWU5 ;kvb;kQ*bo|L)k<\Jt@:ujت08CIY?1gqv{vB;#RIJ:5wWzPk w'x~iwF^~FGm g. .d%6WB }1SD)iDz'j,μ,3c0}KԸK'^P*={ l 9c r㾚T}vv_ۅrI.*vFꠗs.#rFS4={jD[ FD@>oJaզj85ieI67' IG<`eպO=kϊ.s [r͈,8ܵ+V Q814Z\b5jjOlk fDf'scb+0}š4Ps𴥌#q]'b29?Ƹ;`6,[ 0EB/2# \|dnOR-G n%b|'>͙ӿ4. %۩hx9Xܣ #8 } >ڂg}Z6#8x|mu1 7ѱ ڢ&UN[2:M<{N4.*lqBejcBɨnU2Fw?޳Tnnͭ*'[ۜ~w ( m4iU8"0k%UHV_Yuayb<|Z @]weQav|)bg@ȨnLɎDP^D}Z9>|fY%WUY#T,8)0-ޏSkfӂ2y4 EE8KI_Dg+a+*l|&A2_oE6yxTLѦ?k]<K*|;McNQi&Jxў!ޢEAkXGjɐaݜR,c*'f-gȓ ;1F9 &(>اˆUӪv @9*uW endstream endobj 693 0 obj << /Type /FontDescriptor /FontName /GSSULC+CMSSI10 /Flags 4 /FontBBox [-97 -250 1077 759] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle -12 /StemV 80 /XHeight 444 /CharSet (/C/L/P/R/S/U/a/hyphen/n/plus/t) /FontFile 692 0 R >> endobj 694 0 obj << /Length1 1426 /Length2 6335 /Length3 0 /Length 7314 /Filter /FlateDecode >> stream xڍxT6Ҥ#H' ;;IM4AґTM KE{}+k%왽 1aQGQ|B]cK!A0 '`3#0T!@ڧ D8 $ JMDKTP0@ Tn>PG'z .p+ @"#@P)8eP(7i///~+( F$jti `E#P^@wAA8CZ:}7/_^ +ݟ_@@( WGyx@8C"@O G~+CPH~$G_i۬ \]!pW}Pw>m9@`_m=L-?>G &(%..&<@AN0q=!6 P Pi P `q 8e DO 'k8G,c`oOJ\ $$$3Ղ; RާK?g.=Z翅HPL~?wO忲B=`8_Ba>hzS@搿FWz7A V4(_~(R @Q T׼p uà C} A3u װ @Y-1z*b(tcN`тAA0 uCE!4 {  ;z*+]+f 0a-gUJt^|C8 mQݑb(/tp35+ہ_SLMq?~!;x>U3ֽϗ#uHZ&K0d ¶H2|*!f Pj (:!eNC=Wi|f̺|DKnae:r {Cg*6׏=i"ڝ)h>`H쥡L~Ѐ`W;Q)Mg)t gDzy+Q稧|G?pޣ!6%1HoeS11ʉ*UqҟW)ĦbԴN KN-u0gcpCElFg& [${R71 8^ʦ(h( =x -`Jo4~lG~ghJh;Dfƭ&hˉ26xצ!PQjz%L$τ쳉:FS'.KV iK|"87Kp'za6x6ڹm8DʖSצA%r_X?˵P|JnZ}5'>Ng+Gʺf >}t/KX!>NYkeUPϽcС'թJFޞEceU9 S)׺Oإ #͂T~HGBN+0Ym+gd5n'_)N C%/< D|裄hnmN5D 'Rt(,2nr0@m_JxVRf=q}[-4Dg'zL FjɇEMq0&GA:dFNBos^DTάEsxaPl]S={>k 52O02Xf;1o'^S0"EMdz(r/CqSL1}aPdUv$]A[0J4W*x$S܉TgP[W onvۤ_^iƞg~^Ujpoh;4xCasKJw"Oя-17`2;mr?m SX0ugsQʅЇ,N3MV2 əfW({Tz(̺k [?kFuB# ֵ&O\}j7 t|M1l3t1_<|xIەC,9x9hnqw":KGSsx>ρ,}Rf"S$7ù8=)EV[PbSpZ>:u3|>-PR3׉`9;9b#`mÚWyV&a|Qܵ/!Ҹ"6 /j3M!. 8(νVAN3h;9yѺdO{<$ypgkZ"AG~͙|o[5TB6't.F0pILj=C8WjPx;5 UM= ʂ> >7#[[9dG-[p |;Bg11jbT?k2yk,u|_GHWfџ.w ^#%㺵 >w ៊|1ܱ]Mcx̕. 8Ldvw.](}X~\\d"Eh5|]vnKy`נ|<:27 Lⶁ憛la6M[w|^cO܏J_z_SH[:wyɏt=w 0\~lA*nBGۺ|oK4мsNDv` ;|YD*m` 9zߙGJ \'#wj&MZ:3tlnڨBK/4 w0ܝ78HS,la4zAp帿ML&LA'2Sꠘ16`e5M o9ra12{uiA%tt}M(hL~z/-M;)W"UK7[JA"KʌfǁRjTrϬ/nWڒwh}TRN 1:hƈBo ?WNw/ܦ^Pl7–ۃO5Xor F &72Ҧ> L~-&2~u/(#fNřgDVN=v-״-?@aT7,f*g/$?ܛL-sAL*,i/DvE„ߒ6(iYGp=# 7_Lц<Ɉd/ᶉeM)b,Q_7. w1Vl͔$_? pAfnK1۶aX(Ҩ[.O]2ٺ~$b! WaFu[p"~[rʳHroU۽t5keH> z┞U+< _x!ʨ]ڽQQNBmR hj||EpKRjݺ=2'HGO(&uld ? w[f# acd%{P3GV]ly%bЮS񝦇O1\yǜc ?h:+Y⥷+b=[0X Rf֞`YZJASƍE?E;2`ێ-1ݯqDKJ W ׻_?1`S9?JhNVTq>6;Q K؊ZP6I7l.h z/͢fJ|''z=)6Lxc{ %=piX7qeq*ڌ4"82:cn2ڐ(xV.gyW $$=_5i?zI-,_IVlPŜˤXHiǎ_msuŵ&s)tjRe}%JaqK#>Z=Vat arx|d}~dj >*saRZxLx^ʎ K-WWrX>O|eӵ|&}a`+ͽEAGHJ:? e|˵!f{6?󾌅Z΃ ] (v5S,~xAwGuH÷U0\@< /' @6~ mGzw/OԶpy!fdr\wz;HӚ5 E~Bnh2TX(E3?\n~ezz"ngKn[<ْ:_kA=:E [r0:c8$}yPheK`[drzh4y ݱw~ TJ`P5qF{6ڥvWZdeQo髀DfzZrI^_'-ȅbה<*K:F6&ϛum=1ۑSJ̦g%,D8wl{,n}[^%gxA9(Ʀ51]FK]| 1iC,.$j2cnJ.V.cEaSt^̪# Lq+">WͤOm$T`ь; =3Delsc:k.,}|a Ǒ G:=f8u"ؗꕋ2t ?znR:-tRr ڈ$yc붺R5θ?="6V[9LѷEnf(!‰ ;o֌_źu#~jĭ~ ^Ի!yg6S6џq^΍DNA1[9+&9)13JkW /Мnbh(ƌ!>ByVp3KWKCh4qϾS95XF67Unh+K-jyK@v .A5{F0ߔCVVk(+ endstream endobj 695 0 obj << /Type /FontDescriptor /FontName /FLPUCD+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/circlemultiply/minus/similar) /FontFile 694 0 R >> endobj 696 0 obj << /Length1 1374 /Length2 5968 /Length3 0 /Length 6909 /Filter /FlateDecode >> stream xڍTTT]RDJE?bninaf$VA$D@ZEE iAw{Y뜳ykټ\FPL  dF@HTq3QHP8M #tQH(, " ( P uZ($ UE3P_@>-$p @]0F#F(#3aQ'[@/8xa_,a<`@XCp@ ;; s&> ' |gCD:_!U##m3տ~Oo + "  I%%%Lciw&-aձ-?s&5H!T1gِ?`78@  ]A~V{W&AD HU{àp7e~M~J G PXϻ/+x#u !(OK $".& d # 3Qc a=c~:H`"B)Aޡ \(z , ]k ݘuֹ1bdL5x_6ΏaoSf.]P? E8HF,l'S[ZL2{w*%R\pގ]RXq1YQ\/{SE򴻫%*蘯hqe &1'iu:;#۩Kl)#s9RR)Ib T_ t_Τ؜+m\rp@0%C܈D~–:~CȢIasN{_DҒAW C>PsQM^L)-Elr+fo|eż% aJI} u8;Yv]`hZo:e|'sgqemؗ\%5@4;7#h`-+ict5j$efZ:ɘ6S9XqUE5W.џ+1lL?zx9B끐ۭ;V"Ը mpHj (_`qVc|CߗWȞbE&f1'K@cn']k͏Zi^RZr-%J!qzi8ZEutLhJxw;:A :0µhդ~j) 1tRK{ݶE6s7&KqOĴ j8m+m#,:x4Η!bRwIcRƜ5bB5Gyw:񩘊s~uPfx=ix-qbK %=Eƽ_הaHr/!m+Ś^wֹـ_gB{rKD.=Zܦe" ^(v@2HW{g"YZ_P>6ӥ k" Xv+3o#2g{}b^҇%ƒG;GOZ ,m MJ(B[X*Gx Xz'r/&gla{Jmd7ǹ!/7֞dXPhRγzZLǬKff6P. +m^ \=4} h4`mU-Upj'1-Rz/XkeU@Ŗy 烧EfJCrkJ;]DKY )`.N鐳Rui G'rH4No*xN`Gl*ҋvW1 9}N&EH׸MM'K9#n`}D.7(OJoU8&$a~^J?Ltz续'0xk{*Yl4U^:nbT]e20tnuQ- /#bͧ@wxÝϤˑnT]Ё[WLLp'N2ό nQsx"*0:I=ۣx8 (k 8{E{y=y.V8=(3I5v]/QDڝ+kq'֨$cf%a!Dm.5g@[uo zK0,U/^b]x3Ӆ@EyVz{m8 -( 9=gY1G:{a}L|r 6z]b]p% 9 bZ2⪶4p* @-c @*ݏ;j{hA%WFM^hu8f.|mT^z -qXu,ʞ?.G\=˂CUNGjzV_N'Eлק]3c'kRTԧlF$Me ͍P~у5Q`C[s1ǦF.e+Q򢷸/>ؙgabfŲ3OiG,_ <`A>5g{Rv/v3n6$AWmsQV/t+؋ġH֔HNE^[L,;>Ze=H& ₺w=66byAn@ixQkĪP'pip+xRȭ:ln߯rՐ/Dž_G{^{QܢGG&nU M+8E¢W u2=E ՠ8ƚKZ/^;nqcfEdKU J(D=4M)bƃG<"hjg{F=NLS{DIlf ( \UPld5Np||}R{DUjF׵Z`ܹQj9&q[H @7Co[>э]QfAw!-p,J@RqFMW0!!Y,d<:HҭJDʨ[2^H{jodA5]f.w#X f-SXyENfتI~]#(yd;DfpZV?Gl!AsL1̢,L V#/~FisyUAYn79 RTPǽǃe }62+ZfRbDy3Z zNJͣko"s >sx'}Tڼ:lssJ6r@lZKn Wt'e7 (w$ w&6v*xD$Jt<2P|E[{Rex.#~rs:oqÍ@֤n-+ݔڿiIC[%sXYIr?xL;YY(1[:ٙ3@O66Jhr~}LѧK?WGI^w=TKT<  ſMaŤl<\"Ex(}?Ҽ}),-TP9i$zBuLB[׮Y3ճe˵a/r0WϟҚO|ƏjH(I-_lpIKë'd]I8Kk' MOoK$=X%]:~fc= Lg6y<&ͩpWDi(PxQM^F 7&%ٚN>5{yyrBާk&lIKmz4yBDM):h.^l~%9s(ƪ\MJ{m=T%1ܫ-r6#>F "/ Q);c wʺ)W t 䨈1V*G\yLYt\93os˔lMp7OCxX_6^Z|p( O2Eǃ2L3T Η9"L:$'Gut9q#T: +pFzooufZmfQy{AJ#B8&/~cfqWNt# Nb1uVoC7"Clw|Ę0+4[a(˷n~-c}F2VP1̑O0;lZCW;\K'Bo X˖VC7 e#R( l' m#V-RDb %:]?(>H\ˌ?B1%ْ]I<7ިd G3 vG"=#+ ]b̵o7L*s&J)v"7di#A+v.X:DDܝ:LBzmw'mpǗ=+hՀU+yGOL dJ˜e/[!slQ_]OKq?j,aܜrnI3nŠ,<%O8Gh_]wN\?/-Af1$ _3SbnbGS^bȭ<11νM6=rۤuJ nl2%t,#{~O_[O)ZӤ( [I|qV>Z0 O+Xf) v>#ȗ)W;S[;\bҵ*)JLdduV5^ͼ@Լ~!U9;|k.mMMҐ+g|(ۅsWj>ZO߶4pA"m:+30j /d = h endstream endobj 697 0 obj << /Type /FontDescriptor /FontName /CSSKWC+CMSY9 /Flags 4 /FontBBox [-29 -958 1146 777] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 43 /XHeight 431 /CharSet (/similar) /FontFile 696 0 R >> endobj 698 0 obj << /Length1 2394 /Length2 21009 /Length3 0 /Length 22406 /Filter /FlateDecode >> stream xڌT )ARtni)nVn}c;3{5zUEMR FV&>,+ JdJ j I97;+;CG>9@ tEwtr'֌/w=hڃ3ͬ A+`913{xx0ػ29X 1&@  `nm-D0]=,c_ 3wtc#fPRwU9z|9l,VV67Q1w:X8x)<o,%G= 'u-uoERnvvc7xs@[ TU[_,|D,Uhb 2gkkov@GW/ ؋W_* o^I3Gߗ `b>k0q|Xe0398.p~ G `-b,x,_f0K!Vbob0!"(!p-\ע_ע8gC]kxd_bbbڀ\3s$%?X9ͭ.@W#ȾyZw 'hO%o-#@">)e3YQH!+S3-#PojZf|:N} #ѬHFs54cY?.-YWW~M\e]OAy^)?,GkI5Ab ;W[!dȸVA]iv'ڷcLX3CۄҤ3(Me?wf) r&iuz'AEGK9~8NNk ˒C΋&?aS 4'?br&zʵMqp ~#f:!ҜUeU,8Cݱ xv}SKȫ= nIa&!iy_ɪ2x9Brw>"|?F!4Sy5iVL=%-/SI~""+u g*w WTI9މrRT"ms6.͙* -/Fn?FQ'9LhӆpSO0/E,ЮiUv]C^ejA5L*_U5P'?ZmJRoS' RLY 6iqscUYMyK11BQ$̞̚hgs)9(M=Քg=[,k|~>dIMƲRw%93F,T- MAJx)ZAJ;,oz(U(*q|>UlK0-/NX=-[5d"fx_>/uh hlV.8"(`9I.:[mB^[cK r^g -ΏBeWh qȦl(>'` Mߙ`vy'IR>{% W9h}n:1ا2"K&im5ҁϺ󃝳 MaP45ڧNeQ P @uۤ8Vt.2|DoCyT>%v^f%_p:KvR㾋^](śpՁf:ankaꌹ 0fw}L2K[n`zӊf]cxK:N|kst]SZs.VfY_M,˫ &>SD QoRzmbq@ Wv1{`OaܗB\Ol/谊=CmPG{<">/դ+=<vn]D5?HvH[BSwa8 sA)@%<%ΧHD,BKJ6f_8%9\ydTtjTMxlrCOq3F$UP\?7;JU^4,Ǝ?`.D2w۪Z7¬5g^YC" [}M@"{~J,{%z]m ˠ [{Itqc^Xi[6/M -,3Ұ,Q8^lt{2>5:TK%v(?w%~uؑKe j~GƔAŜΞpiu]ޙiP*gک. 1&TV&a?d*+^oߊ2[ WY!i$IJJFMձ/s8}+ tGn@|rjg8toIܐck82`bG؆a߇x_z#Z8>rIfǫ+{A+cr@čcdYEv^:+My7WR+s mEb'8dniӧ&͠c koa&wKiҎf>D'MY45w" xINhٙ d!T7Dԛ Ma编@ DSR{(V? #6<5E#u*7F?w1qc/ӊ3f".c1.+Wx49[fЎp7>7b6AJ>HG@wVܚ78䫭tD:}Vt&ի;__QU䴸6 ӄAOlxmMz/|*m]O=oZ/El_7RD‹n=zBVuZGx S}3Q,5 8f?!>75% `sQaam CpN6v~I]iQfdcc& ZJ2 Wj nװ˗HУ:˯4QL|G55T.[g- ޟc&;caXS !skõ)&W&j..OO5"ȆYMW5C1y֩\'X#zƺoLb6ym'~t4f;M@$ dKm7p7 4!HsSȒP4N(ʦx1mNV_1H^9:֛J@s#ΣUҦmo6O| }KԾC=+@b ซZPry 8ՔEEWBuIM]onIвus71Q 3[7݈l^ڛX7MA]ZS4T~ b&rH/Z (h>Ee(i|Tt*랈Ct}h)VOښ'z[xA}'$o x5y>i4Ez>l7h|#uƎ :73^ 7^O ǧKb<";ޟT?9@80u$7kڽ=Vs<"幏~Űgڳ|^6/eO',7 SpKVwg` ZWOc{BӿڨVfjU@̩+2@=21c8i?voމ儘tIJޯo džau#-)V]1E¼՛ VSüC`5r졧( /٩Wa6;80xs㍹@~Th? 1a{m|ZqGc}-:XBjXǾcpe`!clȯ%˼t wT6XE>a噝L@p%~"n35v;۶;)p'UX ovkHD ,V{D:vU*g;DnrC5YN'k\eNIKΝz©慦$0<"hOQ(a75 hΟD{V$Z9.@N_ZJ)>1 &NU2ڭۭQgbEk{\%>: rzȸcֵkR ~& D{"#|b\ߵ^OMxGz5;@6ukp_kMpW)VTZI&lݪnӱi礅&xmLBpUF*R7zYIh[v ޜŠyq᭗$:.Hh6J6+qDeIz\aДeH'fL~:AлYrd%m~q=!s1+>z+_>ҁ&IMzuL4XW 1_xȖM$ϟZ _6B7?nYqL:mvq0u#m%>ҕtӏLV\kěOU ddSuv:j>yV(y! < mbsZfS-3*>H%^Cy1uh,T!,^\b!_r>d8:i5hd' կ)_=ω?>1ڂD:rx8/=zUȌf/i~l(nFf}oe/ˤ46K~'OzE}[%zc8)&3s$aַ$+~cʚ5il;1M]$D(Wr'{[i'ܛ\#V7|fu'r[],׎7I/DBƯORҷ˳Y>;ޓxmNsD|gSfNVcnpmPMH^alCٵa^$sL,І6hXBdÇeODBpO:l[>QL+!]po>4ȲL o0B}~?r7#v]bH9PMJD-mPJOc)Ojxiálq k.g̣.''/3oo}Q]~n)N1Ixqй㉦ʕ;$9'qEc~Q r0Kۅ]| Ӏ bZ*W4e7{9y,vBX&IQϙ]7!(B/_{(omVyEWcnK[IKi<3M#u;7J- tz9p߹sV4 ]zp5ۇQFO*2c⁸ x6[)!qvg\Vwm.oRuT׵h+)OCkj=gUj.x,,>; |6B`NBž2@ ˌ FE>::[hv*k͂Х8*h-+M'o}"(R7#KƬV:o8|FZr45+hp]}lH &y0Jzy9thwvL2E)uy5G/K}GqW3G' <;Y9>ы<[yMXh.3`؇ƌU{vz~H|:¾/q\Fڵ:>l@{ʍeqk \dgtx{geqtX*o'M*bv7>Iw)?0#'L4bd0X>]OFcfBn~ٙ-&0P3 |S}sJjeדb\S#^2`G,@ףlɉH|vt_i(w̏rNqHQ BGA*N^[8qOcuЇ7VZ&EpDݬa']7#b ПFvhTz.NΦXIkynp $)uƙ ޶};o27S,SR9B'Jn#/S8ޛBd%f,I<[yH(4>X-PQ^&ܩ1Ʉ~@tWLl>>[IE.Tw-#VDV8І,z1WYM*oFO + 4<}qWJ̅\ZlKF5cNC {~_ߙ + .|4FHIl`EUwJYyf֦x722MڬIbvI>8B>ƭlnGt{+$3Vc:hQi a$^N1i=!w9Fa ]1 n#ѷ мoώ_*[Y—cwb鱙$\m[ynF[ō39UemH*w8*_${ ܈gqTԹ?9 ] ijYg8ƶc,ndh֡`;tݩ덜X9f +{n:HƱiTv57tXD}l>9'o.볙KF:P. x-)~|'yJ2zi.{4`>Y0 AǭsN0LU7xݭ޷S#|4kh/qi\+?ԞNQ{ Bi+aΩtc#l4w3ՌvS3gt`f6x'~P|3~>#9vJN9g=SOtj)j͡h(M%@YZ'?i$+ zJD͵#wH S1l  ;j9< 4& G>=5JtkM!kGIجr 2 R# YƴuUE"jx&Ώ{A-|gK5:%+«ݼNQxαߢ?ݿ>c/+曎I#&]CWjXsM@mFͷ2x-WD?1t*YwJb~Yƨ|^SU%(׽HXH?_NhuD@,IyLI >3D0'S :[#Yb: ~n1aoM=%#yS uozCJN18KgU{wd\vf>&Lfoy6)dܫDbv+9^Y*e`Iύ@ kHpFH(i$/y!n5w癴so=σU>Y豜[(9xUb}ItIσ "Cip)dIV-4 %s<.KjlU6ע; _Uw0W?zd M<v1OZWQowd{4bQ {X #o6.uz\-3$VTxCG؈+As?-Ic>lbo,/k_>Dy_F{Gֻ*Yj~<EmdPnD0&DߍWisԭt[wl aVʰ*bf`#f;?C^NɌ#JM{1=*s=_^7Р H9,\FQz&m0eR*D(5( ;o~)OZVb9k%)T{{9[m؏3"A0Fa5XPl-UH'=\eB ~7>m2vlrW_*?5SJߐD;T Pv@$.VHg,,zB=\і'q}b1O;$.'5A(㫱D7;&#,dn,c^H7w`goY6)h{a]>*GۀR@ٵgn,wuwx-UM`(?^ $.0.&  +Wf/(Q/Rtͅg&^oGXhT;Yr;z5YEݔ_^Gj HHd\ՙ3y%UkC[q2Wq+&@[#zg6i˾ԷPqgM\ 5Q, pMG#WT.E";+ѳQ;Z++h@|/QtC'ܮ)!( ʤMq?Ҋ((mVk瓍vڲ t(ճšZK5 QS{>ޱ@XDTP*hA00M {]R=웍9֜H$/r} Hq'prA˹HR7LP HWT*Hqr[sz:vr'"|g%WI3TTϵeVk`C{LIN&*~ݧ)<(<81GUxe+h!Nn2k*5lYm/".Tϱ]%ۤHaTKWMF 7p{ou$4ih`O&w8evⲞe/rpr+K\/b:s|?21%f!Iv)4e ,k >J.Z[ϳjD>uZg=ڹ`;pFVRvGw1Ѯazdzlěmt` (ԓ)p{O%5=shu4_-T 3 /?Qw2!>mm n, :M,/= ;w5 m)Tſ7J<ϟ|!ؾ*4a$jNb/95xB-aA2<}—@\KFPhXE,'D{pstXO!o Zk6ٍ0zRk|[A>4o+ ŧ ?' 4[MUw*-e KQaI6:&x<.c(tWp/Gwg}F( .f+ no {?U:-_FNPH>x +|O:s1.UQjXR"Q^Q`Կ¡LERߩߔGR(Hzdύ]xV4Rj40-(@AѺջj(RƾbҖ4NiWE [K\-DuWXvќBגJΰ (Lٻ x a4uDՠ+'ёJvTQ)ϡ"K F"pA\HV`+9Kx䚐-`Z C%RHb` @{u>Fhّ Qtl(4QUÎ$@.'9K@Ԁ %,esמ So "\KGxgLrZ^jKe1{i?[xGI}DO`k=Ζ®‘91@be ~"c`WҽŬT|ڠɗ&eoxk)ҩ\5whV}R_kZ˜j|ȓ`ɋtҨMfZwouw*s8d>a袨YBh"ӂ'\4AH5_MY 3/&P`SEH"@gϮqK4+gUBzљCC9RqB#$S;Ph1/0TIDauO"V_) ujB HAvbR/}Gqeb̈́9iڵ=hqF%~uCGu4K+E}]a *U/:t3jd~ #د'Sf`ymA]ޒ3Fi6n"[ N_RBػt~fyIajWB=zݳ_@:NX#,,SvR az fki7o3Ϥ[BD=FͰoB6|tdm! 3fLTP35 !QCExto>4m48a,<PiU@xϋ[Ra.)Im52B~|q]E(Eg pc7* 4~ AAU3:Փa)_L ҫ}+~X?sNx'w38,QVټ&G,$ CAO6 }z@״Rٕ p[s ns Vѧ702DZj@zEI{s3#ˉ1f!9~>{RVHn77+S'`)rB)T^3O&HbCYU}6jMV19nzVrҦç?s:ႴS4J82EGOa xͮ > Hp^==gzқEܪ1bn#- kH71ّ \ר=BorGHj w,,{#Eb~6vZo6&.W|r_o)>ɶ]Y?YnvFeb9jGeA6b,uNZ;t0 ]NgR C nN8Qچ&u5tOmdrdwDM*jkّmƂyYMOH9d9а}Mnaig[*+M;uװ3}mJq[!,y5Mh= we5#arӟ k#Z.i#,YKw HQ)0DGeeELnc`yKd.Sn/HJsX^80UO~  0EKju ,+sꖥqB&Z Wk`fU.|&ݼn6\9 ~H 1pt~\р[[r+d),ϋ ޖ-Vk 扫 OY$8r[䥷Lb:(c_rchT>bxz+$bYsOpuK>/lP4ClĘlN?>MAjX8?5HQfG, rG+K"S/*L\8GfQXZ>B[,<~u~,Hqkg{k̠Nx;",CІi@, Zyiw XR}ÁJ mpv8Mn}f f 1zƝNUtS0pHDO/=3yF"V:My&jxK(%)CٸLY>(THzc܇0fЀK+ؔ4Z?},I1ZQǙRo]%ҕu5W.R&޲. ؞zˣhJD BU)рM'D -[ewOךq\pHobrֶPYށLn㋯11ɝA-ZybG x;D!ۦ_x\}pkx0.wA='nc q}Z͎[V#z:6ʓ3*zedV9H)J8_fQ-4=N#]i5dmf PZQe=g,%ˍ`6qjs!AYg szGHTK%/yq k!cjC3H9տPQ_1jn7e2yAɫ>}-!V%VogtHtU7yr Bě-g8SND.9H[ԉ|OQE&DE%ۿ1R[*Ma1*'M36<ԫ&w&hh .b3KHGdKC!j>t$^\\#u `dNUܻf-Pލy(P(!X~HUvRg߸FwV 8B<9Dv 'FxpA7[rUT"]Χ4H Fs6_gN໭|zj._0xx o6!ӽ"RvEt5&ND8'v+FfYԯf C 1(iQ5Ԩ;b(WK}sN|Q52mֵY3NZ0]v>h̑?Ư@ƛH_mo)N7ne\}{uo`3e R;ܚ:Dl2Kh͸Zz?;&ʽR AN?QJ1\{XAff#fNC ˝/Y1/`c>H9#}kTZ7/ʠҷI. Blu D(&^:=?B"ڟ^ _u"*z÷tM=ho)T=WhR952>(hqNˡDlf ]nt2NQ(v,ƱExPRȁHβK5F)"d_eqm{(#{!{!\Dw@@wt:EJlk,#el-_>8J0UX#.)k C]9M.]z@WadZBF+)&w7TaNE}GU¤/Y.|ogiNxs%i<6v;$0q\i-ɸ$y BZܓ=UƋ1x1W/Fn:gNbhG̮͎a)5^o`g^,!^ ^J܋~4o}i7Q Fp𤞺O^njG (4Ӂ$u'qt+mBh}tRI-ә-Ҳx7]+q3tWzT!}Lzd⛋q^^X0 OCCn${~*̽8"6~=u]zly" /m4ٍXΏkt:]uh:3XKSכݻ>EB1ت`uPbf!P7Oe9 ꁤcMm/z!drisY1csL0ygO"U7p_eyc2BV6PI+s7r‰?Z1s[hzX OxHNx&oYDL~a7Q](:_3&%c_x~nz8LlcC:LЊnͶᾍh^oqHBh&q[1V0LI )U< ;s^s21\1s}"a&p=#L7`m5d=4"ڰ*IdSKN w/h=$ܵ0}=GK(2E8M@J_PiG-km/O'g)+, tg6c#STιMn/Pi zQ#" i["8wFu<e֟"_:+,r]PCi{ge޾9k z^CH-{$o9WKwYxçg2_90KuڻT O|X\8 ]tKВ2?ER2&ߚQ+E/JkG׋J-?^;K^;p]b2$pu׊8.kc-D}Wyh 0ӘW`wiwmv.5E3T蔈0\.6+2["nm7Rΐ?%_6mšf|)ƿռs_o' Z)KA 芥'9E}, ǣsmF#\["M%L21ˑT='j[:c_`ƁJYmbn@=wѮx+Ó 4}-(yHVz #C*<8.hTvHha$ ʰFb|}hRX`VN}n̦B޾Ya\g;muZq'mULf9jq{ᗋ_+N~CԺ_ XeLoywS}\@Izl%\ཨmLPTi_v%tC5儷[Ts 4(*/u8̗̭WPR|^J͹Ƨ6._9N:h|\):% ?)8&QՈ{}1Ep(ߜn,H68)~ܭlZU~B{0ϫL`<)\&H ;R4άx~߷`%k wʫ e6} rB".ChnH «z^m;p%gg;NynB~hb'D'n,P $Dtr;@7bu|lû0P Q- Ӄ_2VwIx1x΅fvNRƲ^-QO%}2>:ZR}6>wc >pС]!^M kRU=,+wLj. K\S]u8s/W*SX'vV 9l#Q*:ClJ73 4ۦ37 ję-e%;N{|C ,0snH As E4S5&eXc&dd%Rc`_{aN7Tmn s)NSO(G摃{3q䴄RԎ#]eih>Co{_{K_?4G W,JTЯJ_XE%t0g3z4~yg?zL@ U&Qp$;g@36UUg)n7?ቼ 3wHEa :M @썗i& f{w\FlQ0!?}K}qgQnxfU ژg1fN0imvEÏ}Yf Ǩ&ŧYG>f:l4[wM3ڙ3FRc܀k_YHvĦayoY1LۋXM׹9\ҵ?۱\h<^x,6xtu-:R 㒹t`Il&QJ*efSE|P YL\󏁷z 3y"6.em K-ۅJlwZh5IJ!{J&?;\tnGSu0 *ڔnlRT.0p7cot ~R(J^NUVvu/n\ lm;X"ǩxKgDT<[ d[[9Zp5 48PAAG2$#XI ATRk]wzؑ%ӫOAelV{LƌǕD;;&@KK,]?]r &{6oj؆}vM`"5| ,Is!8DRq/CZc+ܛ6I˔c'_US/. k6Pl3LҾw4 yXΓ=&'t=4B݅: qa9jfW'Z<>?al3 S))8~У' f-@D,1ϯHP;%5/) `BQɩU_`פ+*RU?_7RHxǼcCoMB endstream endobj 699 0 obj << /Type /FontDescriptor /FontName /HTNJFL+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/a/ampersand/b/c/colon/comma/d/dieresis/e/f/ff/ffi/fi/four/g/h/hyphen/i/k/l/m/n/o/one/p/parenleft/parenright/period/q/quoteright/r/s/seven/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 698 0 R >> endobj 700 0 obj << /Length1 1662 /Length2 9731 /Length3 0 /Length 10810 /Filter /FlateDecode >> stream xڍP-gp \`C=xp'{=+`Vj{h)յX$,A7VvA'VfێB v!ؤn/DG@dgp MttH=V#B+q{G#C@plTn6 @{_)mܜ<==Y.֢O @ rY~ P:mvӡh t^ ` %b rTh)(Ԝ@?? #hax!+=& B,/@ hBu @VB|\-\Nn`3Nr2K)Gw`˹{uvGO =RbBf r𰳳s @ N?/3:9:^@/P|] ;ߎF(Kd ܿ `"?|2~Q#W̦a''㔔tpX8y8\>vQX#@v_=_ \/;/gYBߎd3I`{/uw{Ǘ]/Uꪀ,UplE,ܬ`/:Oio`Hybg˒Yؽ"/z١+pl< EQ<<_y!f+%2?d@6 >$`x%h f`vyySa`|)x_//R_/R_/2Kꥐc;^nosy,P;ZֆHzlqrG_"n{jK ]pKtܭr>7ۙe,Է[o2M:tUvQ40XZ|y)>H|=~_NKM "}+X\ "??Lh*3 4c?Se29y6˙뙤NJD3zxI&Ӵ[=2D mA #Z_45XS,[hf X!{&pQ-'k>23 Ϋj D78:@C($9Ϊ/᠗htqwS19 #TX5-7^0ǯ\UBSő$:%rJ1[9#z(wB8:5O0 ªo׃aB!v$VoOhzo B H)~ {ϱz̅ {X[xlMl,CX@G6Y41)7ia=n4,ȹ(9W(e#$\ȻS̞|)v)+3$"AO?"tN^{o0DG`bdU1tPꞯ艏/2#tQ$_ U8ЭE6InƊg}O"aF7Qp>r&-'(:EykYhj nݯc!}E(F ַ4y40{]( ΍'U_`W $-C v3y$~awFd$\E2B/c|. ўG04;Hݹi5J3m8 Ԛzt}Z"W5XQN>Ha {.je f{V7[gLW`L~o}5#S%D06ҘP~?-v|фtЯI7-S7\J6Th?&;|(ig= p)mm XW+ׇAzd H%C\%{ONARLwGoJjQl"}I0ܳUPnɯз?1fҘ: PWerL Tw-Se,bøsA)BN&OӠ.yb{(ܯ~( ʹgrR!!W*-VJƌNt0W-8!rcqdU~EOe+IK'JL٫gD]!Βb* Idɂ~5]=%޿KWd_Jo*PI`Ib93Ov=`d~=軧D)b _cZMGTUI&>3IY^ўMЦŸ-ZBl8L?ٶ{,WC758k疹,52QVOӣ<$R <"^WnHsŇfŔf%%1{A:o{8=8>:'s ; R6xIV&AɡJn &#C\`3&O]7i~l*npI?d1Nܞ40)4%1چSExT:QO%[S"WxZ6dPƨj U#@ruŇ7"KI ^{7ۿy؉A2pC"jRȤう &-)֖֓cyDf)PFӔmꬋFmn%0W,۴^%uKc맢hR!WV$rNھ^r o yN*:<Ť6!2_B^.,ʽj76=c[ޞ()aBO w#dUFA"?afWrk z!t:eet9JK+4|",nႫi]I\qy[k.(sguMbE26]ROp~R\.<2̳'' F| ǵc^y' ;!"\ ˯+aU]G%%榛3{[wD?Wc#rx m5͆*#WGL| OLp,GхCiVM:s||2iʂ(a4Pٽ3& Itl 0æ%L&|m 46 {mB7Ѭrʩ,(q46ͬe̴qhwckjG}JHR7V0ndO/~n}LHVNg4bC+G2kY h.54*z׿=Z4N#"Q&-_!3rquON]>;YgcG$' wB+>C$``>`mۭ9b*AGO49NyGW}A(*؈YƲ\fAqɽp[pVz~VF1cL(/e:QFg> DBbOL'~5!复JuީD$M8;sP1C`7mg'HH芷\SN%yf=\p>{ʟ*oͪH>Oe{=֒s[$圉fSծc6.u]WFL7d>h|&0U~FayF+LTQFݓ$l{I51`[Ny cZ1?na ЦvMk>w},S,-F2lYaY)5Ve꫊orOfk<>q2zgEP\ 3M]"u@nxkKDC4S΀؍D.EO& _1 R-/zXN"'jU1YZ,82mj?;_f[5}Z灏^,k,4#;SOΦV{ha Zxt^P8OM,BuyOFS6sYn>Ӓc$ Y$VRVm%HS[cXOZof(L~_geߨf*҉.x>Ò,lZ){; ~ tYy8Ӗ2Du9ȃTMNJ~<;d7wGdDp+RV->[ณ*33eD{wOρ}aY?$=ec V 5CF=N~ؘ&iMԷ8?0!b2: ^0 =at֌ݯI .oWJiߢ>.szbM4K|Re]d~"#'X[Ų=mk"xn)ւرy:+I~ilӌw/yV3ew87'ti]jvcYA8 35+U|PX!tx a͆ ѴdH 5V5 ن|_vjGP,Ŷ2Zu:3c|I~9PJR#+Kvv_3ʆ=lEׅy-ٓy b^k\ˑJe'@5%"orǬ(+ؖv^ M>%D&!N6*f G8hћrM\)bLm #Qrf7QߒT;_Ir+:\V3*w3=B&WZ/3ps ݜ#8zy{́n\-g-jyȃ_'#zp1Ͷ^ F|5+0S9WLhׇotY?Ho6ڱ㶹Y9ޣ3D~J-<Aӷbs oqdRb { yciZ;J\c44.*_}Ӻ@9xYu.>6Ip0Rݔm& 򔬺&8"ܵLe,> W= lxP}mk!i*mVtZ5ɷY(MW3hJ a#JY(M&Da6z2dVf4u)6rmPL QG QE;S,*wq##^R52trڌn'c$NjK9{ňΕGWطˏاNǦ?]-u|L&>ͻ+#+) ӠNL )_X#|j%cdt %m*#qCOI˼|CGK;ETTO,6Έ4^ySt,D9]c׳2bNmpۊky{Vm%+Ky EX2j~!8r_*Vtg$]H zӜoE̊yF6X6*/\p3>+ҿy#t9г_j.y,GfT=aPOߖ~,懑Mκ>?E_ l$ XJW7pHb&Jd $g p%7.նm}/7=+s endstream endobj 701 0 obj << /Type /FontDescriptor /FontName /QZWXGA+CMTI12 /Flags 4 /FontBBox [-36 -251 1103 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 63 /XHeight 431 /CharSet (/F/R/a/c/e/fi/g/hyphen/i/l/m/n/o/p/r/s/t/u/v/y) /FontFile 700 0 R >> endobj 702 0 obj << /Length1 1432 /Length2 6678 /Length3 0 /Length 7658 /Filter /FlateDecode >> stream xڍt4~D=2jaN2`Dt%$ ]hAtB$}Y7g?}γ"mQXA4@Y*rq!Έ`R.;FIA0F((! K@""R"ݥ*0O$-@R.e;_K-(%PtA#ma(6 ph sm?R:`^^^B0. u 0wOa3!R.7Da`pF"P\ p6B௳NWDH`-AvHg@% `(/"߯=s}?ۧ A" PL-F c(;4@OcWŞ 3Zo[>+&.a.Hg8z`qƍ꿩?C#=\ pljY(&$"Gb Ho\u#?QsFzh ۂ/nlp.n|* 5g q Ci%d Ņp=U ~[@΄aJmI]q0oezzp5 [qLcyx2E&/ 1CbeUUPeٓќ ѕy P{'["NVsi1ҷ&+ lN70Zͦ&(nC>:ckj5%ovTo _F/))J~5A1Dh#0v _*C.1SjfM*`0µܪJ7><g(! ]W_ɻãhyk `L86zV:ݴWF-oFWlhoYm̭>S 1f+ظ'iMWhB hlkh+Q_M&q$h= Y+58ݡ[SٚI|] GKtdϕ ]|pLi,VZƓoalc5G\bSTe`JqC0Y!mώv;bӧ7t 25u>H~⩻@'β()X8fPrVb C%#3^B+ ЩLɾ4+ Huzyxa̰ c|,xR)iHZJPZ-nսc'YkN;+Ŭ;≺!ߊ#h/k/t0۩w>s$!IT#`lmPˎݍŸoXou\=]+*!/UݘEL2;+A1{1٢O1_ǵ*GqiWpW2L}תn$lR,tmY W~ ]T(,( <[^MF|ǫ_9,v<:!zrjB<{٪;P[scN%gsgCdW9]*<OQR8os|Z*-Cf *Uw.<+瑾v\T7Zp, W1;&0s{Y&dRj?h.>YԤla5Iºd]0$!1%cRvMϓ?8<}K[X:>On,U^R$}!m6鮝[՟;̞{if'SگtKΫJRTU/vEs2`x[A\&zJ(D=0=ЫtÅ-[8YQz}x U[i犨|ρ Z6nRO˭g@S4^AEfU"|PSc&r;:'99hU kz#(}`Iیl5mrPX]-_^HFF]=mPepŠo/!̏k78l޼Q]fkb7cH[T $U^JZZv8mz˂PadOvMsU5~жl7h҆ؼH=c_~i& p=եDl m&mñHt2A& <@^6y|@v˧焷֊k:$edW dđZ@'KYEZuA_Ugy|9xOS|wUQ!yVC[S7B: >qʹc7bl{{й<,)B]>]>!,^za܅5zHf)g{9;<0թ8WfY>򄟉Atp-O`DWd|t=ݥ9CڦtlB⑗ƖIה+[x-d޾ u=">̔U֭zjADRB}S2\E%@b# ;Nn+6y]Pb[-,Gp }8;M^ %&xV)i,7S[ ʿ9V s@eGX]|aּxn7!^+y)0dS(f<s~A`GQ!G \jV p/+u>XPS1X6T?BoTqv{l.xGE=~+ژ_1*سRpe>nRlxz ~pNʌcjKmì-h11N^kO}^p%v[s-'uӦ^|:o-Ѓb:im3ߔcQ|8+ʘ51.Z%i[0~̰gzb[ѐbN"Nu ofU៮tx{lrkPϲ.tz`zݏ(¥vh'_+ ɥX?ʍԞUaT={X^s_8Ffnvo p5jtu4伹蕏~ɚ,2:ŭJGQ˿J!vM-Uyq`/ 3lw[ XU2e(zÞ?#PZl5%Nw(x um*x@ͧe0F&42OZCy). :zjܸy,'v/p"_ڸs_Qe~VM_;Mb!KAone-&]R駺{oܹJXM+@}m46·F:Z% FG2M~x0}őz6{  h?hyDu;{ }uŭWsku1J\L45 %HH:ʛ"SDo5jD:X<"35O{vю&tK~dU' ˣ lK44E$GD<|2O!uE= >0Uo뼢&5A=X+?;Mw[E!5i.I\QrwDH}vpxAX {f|>QXV w[2ԗ搂)G#Dd$6= Uogä}qƚ+/gsfS_1d՝ :=ZRg6ɥß˵ޚ2 ƯDa;G:U2ӟ}dڵK&ME"zwmނ.@,/*es}V*9Pd^?~nԦgN/!}\O7އoģ9RFՎ$.uz #t?Ȫ((Ylh{3v=̄cqgQ}O ܼQ"v?&ڌH}~@,=__ +WykBiP>7w}uOy" +w=W OI ]~8l (r?d%cٯ*(2}*Dz>y$Q]ת^H@k5-gKud;@;'':`io.- Păp1V=&+]037tŧoKW_)RAڬH5>Hw--T6&vW|yoċt]MT$M#ސon™/Fm SV|'J}ZqڔA !b ;yjf`-~-U_|Bqq-{xr̐jQ̰J-><]u8Q/{^n-RgUHI2`Yq۔lm|+scFRЏ,̾N raA6Mj5&jSCt%7tP|eĭ^=RLۦzT&px*YJ}թZg]鷶 .<瞬`bAG= (3ѱK9fxWQ}h|꽝<ȝE>yh=_G{Qv] pqq"|k7:'dVW$3Oxvʦ?3~4?Suk.ѺvH8ШoFЁSIG&-|Yw#ߊb'J{ v}=6GTߺb%|սbg%9F˴te,m*@ىF<9:>Ml£,ofkqF-Ȫk􏲁iI} of¬HyR^]m珽I:]{G}t_W?Qpkrspyq_ŤAc)ʧv>A"1o eg49Zǯ`W vwZ6vlE©X%Q IZ pJQ_-N?K0Q2krаHam/87UxPA؈bkvƹtm,ܮ6˔~I1 "am%2ݺ ~zPڄ4v {&SH޲\4]_xng1iE4H|AhL`V*Bv6A`#{6}$+{]HeP?41*y­h/ьܔG>." :–*3{{[hȸ^ n\1aiYru|b^ZZ|GEzDqhŽt[+KRksӔȗ6xhuFdr*sj\2ٱ";xT)Gsq:B OmfJ3쇢:O)~X8$^<&Q[ n'GFAՈWK)8< aaB< DX^&Erg9bUnyNhW=kH)=ʓ%,>}^{ِpg5u\AŅ`R lPqQN*W oZPzF3Z`^yF endstream endobj 703 0 obj << /Type /FontDescriptor /FontName /TZDYZQ+CMTI9 /Flags 4 /FontBBox [-35 -250 1148 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 70 /XHeight 431 /CharSet (/a/e/l/period/t) /FontFile 702 0 R >> endobj 704 0 obj << /Length1 2650 /Length2 18692 /Length3 0 /Length 20213 /Filter /FlateDecode >> stream xڌPN 6qwA Ip~w߫Ɣ1e͹GE$fdvrtgbcfH(ijXY9YYّ4Aʑn 'G?,$\f`;P a`qYYk4YN@7$* 'gW;8Zxv9]Af%3w8=@t ZAwwg~///f37f'Wka:Ftz- P6sS3@+؃,n`GK+!Pq:X?`cf￈@;YX8989V { @EZ۝`h dof6;u3 \?Yݘ@ RN@Gw7-}ap@Va̢rIc!Y\ maWMgJV2 + ' S ` pAHb0]AVX?#Y:96Y4)_7pqE Ox9Z9,KM g=˥[ rZ]_,c3[O zw@ TUZ<V b6& Z-l3{#P `bce?:rY؁o7Hw#J9Z8Yd\3WW3$V$sqh {,̎N`+_G`K `x,/E7HxX,ҿE7bF]7GW#p</8o#hFO7Fxz">7sY@ W l(A#rHs5 57s~pWMW_fpٿ9q%qp]_b]xX/xe  _j'?&ֿz뿞O&Dm~ >@g`>:? 3lzփljQߡ\CnNW[ &sslH43a 8t7 op\<܁XG ߁G$nGTٛA NwD;c=fg['I>@ tOsZx|)z-,l:~Ոy1MR1-~x@O pKXۑ]!{;imlKVk2ITkGZ,8'A$fvn씧uES']_:_ͭT6k\)4Oz&[!%> 4GyE lV:f~2NrX|2c,(Y{u'h V^^2*-E}CwQ J>~[07z'7 '?& |G qך%#]py l3K)kzm'Og5K@C/H@.C5xSiXnhMg0L"r#oL?Wˋ>eH">nZF4c2ONpB-UҧJw&eyoNOa?GkiN!VcYԯ(8,ȋO#/4΍C\0ekF>Gڜ fsCZ'|0GB^D!(&ؚң*Z4XPnm@@]үl}~=Er/\Ϋ rE[y\gqs^z_{?~a>53CPc(h_|(5=Ɯ66%hMsx AVAW؞E̒TUfW:aWG6a:7Ӎ Z=y'b {GshbVV5\<^lZYyInGz܋|; eí/xDs&R ftES3^Q=~)x击\SۅuM sL[m\SXM$*SSb0Z~~fSи_~l? i^|rS>bm{.QuƏC-Dee;>KXxqo֏Gs,PN?~j> q5ڈ. =H㙟؛)7S&Jvh!?eVJ1 [gӒm6Uu^)t*bsDu*wG{ܑt< yW@`)f:/bY iN)UA8/*-`m\_HYs]~U )j!s o7pǝsB_:,<.oH*ô'y+1 UF՗9P>ee%޸cQ y6ciQacmڍqfh:B#W"TQ.W{;`IaEK#K{-NR'5xlT®t r!bCK="naz15YI?Z+%7%nschg-pP9vʿ~)t@(0ZB12:ʜY;#^L۫9q U#|Íxꐝ/OmrЌ)C"ows&'yVe& ɢ 9lYGmT{N䲑ona~sKڻ'B:}j 4lХ=H@2=#q{z$"#,M]W]QN WZM1Q45,a!(TL,FL4Be4%-Wi}ikm-lLˏԽ}VE;FUYv-Bכq8i5s۩9&o{l" UE`e;؈ǧY -/SRעScLl =dβ 2z͗soLG,CcCHT2Y6 Doϱ{j節)BLi{n~w}*Ь:3߈nYc5Q+GwTS8OἫcHLިVDy_x7.~-v5h|.ݡyCGzbX8kaj8 ĚWhܗhGn< U3%Fr4%Pt;Z*>cI K.3mi1kTgJ\2csVJ,oF&'Xk_bJ4"MKQQ膃 #B)fMF}O& ? s8Տ(I ϷPK">tSwއO*"GNX~ sщ0K$^wç$P#M9ZܶS3M_Gg2LU$5fVq~*"#5A#@Ά܉yGCxe?? .幧ț0ҜHFM98}ZV<3ʒHl,>5JPwP>^fvSGt+ Fû?$ BӴH[ 4K )͜)j{9-2apOac[@(ucXX^J6ZgIOv`)v8뫇I141GIC4;z| 9Demal۲ :'fİI\KeR$\a{y\밮d#/]_Ӗ[5V{)l#{ MՒB#bCi#5Iwt0)fA3sO[H2 i,=`ħIHwߕBoƁ2&E/Cg( 6 KՁ_ I*> |š*67TQh"B$0_%3*E2P-=OM;\G:f W?iCcX@xpNƛBE9G (S~ɹP %mֱr72cJ>2EY#"tIk߯>~zR@&ry tq#I9LCdU_R8I jk,UP7 j8ĀHmSA3ǚOa%pB E sX\N9v~kxؘGniO_ ;euq> 1#U{qzZ7-ߥkTy㒢o!A(IH\翯JapD9!Q%33h08g,HTFYå] SIo>E'[,,yrok6,1!J*qפu-#&<2UC*=?XX+q;9ԇXF@o{Zj<bȭH߱6nNY25Rf1u+F?>bgA<"Ҳ Hm@rޠ0BuHDC@ݾW;}gZr`*o"^IjS, YaƼyGZ ԬCO/1<}xZ4o2V5z>ano;EN*ޏm5B,:}C~U%Vc:NG|>hkSYKrΖ"BdzGi3q>B*"cC *G.urjwKדx-hZ/A̴QCށge)t;f׮ E!#] S,ωh*9pZi(]2?=GЅm8P(ꌩ͡($U[5G,^%'6Q0GuuZ02鷑kFnCyol8dC7tpz ~|Kx☰n6̟c'ߌ3M 5;..^m#)#x?hRYyڛU9LFebԠӨzƥNފ2؄rI*4|"84^2kZ%M#" 3F{zVVn?i5.sh0\JA_3.3zWh˖)1=3K*UƂHREYsڟlىg0Vw2D{g MɐtIpÕK9M ۱DJ 0rWeڕcԅ7)<[]T6*+D%Ȧ'@^͉l+}%ȯQۓK+.p:p Sw±L;fthylL# a}{<-̙~*n@- iP*.38J0!d0"-ħ8xThb8PP^lX )efsU﫲UxD2] _dqN4愸z.%eϼBbzGLx'hסWE~g,= y;9$t.Ax&~-aU"@e4/~Fv KQiɟ(kR1\%k$jV7GGw; E`*S%T|^Wj13*(6f, ;V_pXn.l, Wsl-Uwp9\9MGUW8rB\P\ .L Oܡ.1w/x3Iߤ~W#|XРly Ԫ`p I.":@i2(gebh(-<,'wצ#Z8s̈́?j{1ꗢèvCkP1d%wҜHtGs>4yYk}Q1ŗ,OBʹJ|=:FGu'=uǝ'.zFvC{$xO\or2f$+oCޟՖW Jw͗y>Fې"Y)Q/&9e<Ȅ)-:o\+6BƧ}H/2̇-a%V 21)#υcHOA#A8ُ5c%,*?t+(ddC}=L j+RCXEX <J,-M|9 p7O.72; ,k+t$s?&&%' Mp8sLW^ZG>D>˷q8aMlg׏!(/լGUIN8fC UYwּz_KRH\B7Qj "rQ+p-h>0fdaZGT[5݃pj@sv$S v|x!N9ζ5 w a/U$޲ƅ[ ,6ɗurGԤYuEV=B/rN.#O]?y#?\FxϰN<|< | o;%ŧeĥ+٠_Xވշv.)a1jEzMVJJ;6L\g1,>멨j+ه؛CwXsi\a+?N,>Q5GqV- ߈b6O\gi"ag բۊCWl>N4JnQg@89D!.Gdٴqnz-.F T e_#:9&^ڪ\}w_I;t <}=l,|看c$@.͒g唘 ´6''50к2F1 U`uu(į)(ABElMp 5CIتa=7W3n F |7Է9Mʱ+lIb,?8NX)]UqvY*|"߰ʆTbu|mY*Jݘz#mܮqܖ{Nn%!ڭW=K .0&C!H3i9Saƻ-:%!C>(dߒ 94|&rg8M ¤tk\qCǫ CƟPN[#A1: mr/2&~Ly}DȦpD~>Pm3}2zW9rѻcSOB`ֳ4: ؽGݜT[ NK.aJũv`:Q߈bk{ه3=XQNt`VbRX%'Za D%lhJaIӗrFoDi&n.yB}; {jؒ-~kƞT*WopS[.%Pd9!=3zԾl> H9p;Y^^nv|3CWg#'7k!8ra ><.N- "5T,H*ʐ6R>=^yI/z=Aqic%9 \̉m'_kkGyThJg wvDSp 6ϟ i?:|Сj8faR6b\Kn|:DEzL`ߔ| ,`ʢaD [OCO2:z5TB͓y9XDgrhΩ/PSp-0=_nbtF_~5hwV֕7N&/1ʂ"N{Mk<~/΂ήJ>݀FZEL0i+ĉu&|Pb%,9KCo꘤ṟԻ.\eƘ,X~g[%tt^mھDA::sNUN \{\6+Ӗ @ 5PׁUZ;$K?zpnDыr8K4A/ӣ 1ˢdt'Lqx!M']D*e)5J/1*7hfZ?IdDh^-Q' C~1\B'[ @}Ɯe:Es~C=^R^w|H)-#RMqб'Ю=<3y=Aq-ć؈;ef-my;Aq>xӄMU$5,7~sBFZX*9FAqEuo-_W\Hn' a왾6ZMDq3 d :~lU w0"Kܿ:C'q%Q:qT&\&'>1lKNҩeEe~}k'V ɵP 'nə!x&qg3aMN`R)/Y}')R o#Lse!“zp{,TVE[q4Ͻ}a2rO.U!՝5teA48M̂^T[6kS6k3vХ6AïG&>.Zjj)K4c>:+3߯$%x,xlo |slPE$., 'a{ +3L%t$DBVZT:Ѿ1IU?M=O:``lq:TL@Pl攃m3T=f:~L7=d?zОסc8^ }Fؔz]hJWZZDP7\Y&ӼJq7r2qѥCgG%JڛI'%X#Qccij!mS*qha7LCggK{y"HsWZ! vWS䉫R+S3]qDž8J\XoP: o/1\h.m]Y/ע'b+}N֏1ټ!*KYK}مlyb 2٧.:=Ҋ=X#礒02L9.pH% gGe޳k?*gI3$Q6d; wFM!LY%eE/k::"FPO /NAG<*+v^ǕɬQ]:?@x)m\4?O4CإLlG7g9Kf̟s<ĖXpتydjA$ސF1r>Oy Sg6Kbi^ϕ;8!:  ;~6 ۜOXF"I߼I Kt!sVw! ̱1ԤG` ~ EjiGL7KM "̠i*(8k7ucMwWi]QPEʦF,+ r .w^uŊƏ,Wpym7hM(ό%,_WFI$q+"¡k7L֙՟"W,]󻯸\FJq/v#Й>I{d6lA%*#kB"U-kͿThMo|15?;?^0= x-訊*Y6$گN$ekD _42Nsّ.qȆ lGTۭҕs..n0lh8-/ (9-n3rJx /LUF‡g"P94#ly|v;JX}RI­[(:&Pgh|Px&uAcDrLDָ2KC F<\ԙGg+Uͽgdm{P8q$ )# K\mf]NNrc*LBy³iYK|,|ҋbbX)FRNmb@KY])yf*2dQ[ {[M$q"k @0TER*峰Y0..bJOOh+E It}5͂)lXKa9K>' B%~!zI~mG&/މٳqyUoP_'|4Nj.2#^$h5&Lm3v;8~;-̶ʨO;cTaކndv,01tX"fɥh۴ڠj$ejA$|)Ɵ9 OGH[bu/<_A "}PZe.c#hC%'aQ_a<2@-ekAuѸ>cd,!h;m`3\MGj}VSR螚SXWTwT*D~pmz5]h* s,?ѶtiN=l$Qb1 #,+8'6njlЃŅ,`ĺ)'M?0U|~-vK,~>~q ߧYg'b0<&3FCg2' x>MʭĉсjE?L$05}lib~cKQ+Xx^@Tpg #ŕ|'}]kŒV[RAQw[Jjz ِU3ذj!P"QصSFuiy^lzJh]ؐzאb\6֓ V/>4JH-m:ʵ!tݏ.V ɝ}tA<<0YZ/l}>C|ӆb.Xpv)EIp$2p I ^j[q#myzJԦ#/S*AۗgՑGܻZ,zaΰJ<+M#?SjҗZ'\wHXcgIWSnJ1Uft~ؖ$ͫFȣL2_p7ӟ994[s! erkL +~(sلDff;e46DՖyKMُTe ȜzIWrrdW-$,#2 ,}>Vxw5uZOҫ1Q%wW"s"d7G:t+MxL0N}Ƙ`;o}FujEϒ()KT1hTr* Za! ![*1oT_z[8Xqb I4Qk|i0VsH\p+oM'o>,Ľ0& -WL|1XsD$~ s :Z|<>u_ByMyMkO3ekO蝁l4vŐ;3nMbU={N#Ί/Pq8QxW4APvV۫kn򾃯 _ } ^R3+<;ZpXPG!_nDu="Ijx"36uF:$3/#8h73 i)#SRu)~nw{C{Z6m~HČHBX9iI(MsԸg<{zt;ױ🋥 # U*`] تDB4Ol}H}I/ $! ՉTI7،hf'˻EahW 江x(o9Vic>,2ؠqXhQ5b| 9%Ms~I6\Ҡ /mږ_BwYM0_ً$<:LӬǢOMCHM(ʼn\XLsTOY+@{^KyBTv˧fVw#!eIwZ/V=* K;%wSŦI>1+28*9:Ğ+83B)|)i,m5hw2E7x!fZOQ։oJiDǰRsaeM=?B"Ld `A̼WG)VCv/w^=JTГ xhӽ[J R4q˚bo1Be)9:zT͋PQωY 7h!MOXn /SЕnO@ܪv?wTGRŏlRZ08 mx*tϏ4;NM|ODdnepاſLۉ} WL u jI0BpIC'QWUT5зAy MZ%QTj2L[|4(j|8LvLcQmκf^HRkXO[8aZ" 8l.r7~9>֚jW kP #dVH/_J[ -y>;(mYXq fUaL*_yo8(=pN[G[ow#9ϛSa!oiX &p9Ǿ?آg.ϥ⨄iC硚$Hmd= aܫd=/%h}-y:)4␁o*Q0"=UхxI4~bp% ( >Si].hnb>Y?R/X@M?$HTz88}~G$d(lE_J|2F$h3yǧkhJr!2fS} %ڊWC[NfKPmQxzf`%0swūEcl7o,i^Bsx~R]@έ `tp8qWm8RNn#ŞmdH$x0Oe;%; 借\:퀰3L[v==/u0*@ȴ 5Z0D̠h!אD˵wLƂ9w&xxU>$_v٧ID}Ů 'OӑC}!3~f貶Rݕv {rf6 ʼn`&b $: :d24pM=Y*|kqߞrr˰6XćTڻ*;~K3FpƌQm2L8q[4wYH{5}s6@y [@'dvԑAJWH XupB)EÁ,o O2T[6*u W阁\2V|tYG ;e0bNy3 jJ«U'H\R{,4 *` 4Dyp%q0PfUBp߅4R_=qāJQD#p (^{ҨsD>E# %+ɦ;FДWqYN$lgi70F>J9 E&/<<ב1T?[Y@k]pDF3>j~} DpBU؁S+, A`e`@>m>dX7OErp> endobj 705 0 obj << /Length1 1547 /Length2 3046 /Length3 0 /Length 4020 /Filter /FlateDecode >> stream xڍT 8mϒMxA}6}BeܿsÄ-md$WC"RePp kfkBH,Ds`s@2"U~cA,nRD30,RPA) TI$U=/1R8`$2A/ PʊқံHpX"`z^qX`CA 5jT zQ$4Q=k}A<2`Zs[aCra @7 HChD= s@l]'G "m <q@#-Ry$$+ >@l` n:Qfz!A$o dOāBxG\Aw+; 'C.?]axy;HmSGɠ 偐?Xb*"n$@G),wK[!˜D-3Rgo_e04a/X/ŠF Sk!׿FT,} Q0?8Mm03D-IhedPH|y_ ].;OđKWd26IWZ^Bѷo@$*=wW H@A($@T =D!7 =oP@ HTIhd29+}L? S ?Y~oT[OfZnGE6tՖdtj7Y.^<>8=Fv7aW+)4IC,7SmoQM/iwjy̰ݝs1aݧ$^Y_S!ʼ֋鋂ǭhBih0]`rrbFx+ 6Ҥo5AUB½э{ޅZ$>wvhGM`o"S%fꔴzc;8W7YQ3L¦{d f8Dxl ]Z1 f=$$IRW4O5JE,7 n}8tlw8~˨o};kvϽ4v~lePZmqq3񡋕kתCRDP[my?I ~;ܡ_ٿ9͖N)QiNb|u99UwIJ`DorE*bPN'ڏOϤ'Ϫs;^TZz4Lɦ\X5g-V]r 9C Skj.V+o-a}oXxv~rZ/SKzwgk)4RFws ݔy1 zꆎ5+3&o+Ќi*^/GrE,1ߣ!+L㻮?=xq*aS f{s%ZNtl N5WUuM /{3# m=.2ѰZs2$e]%dqeݛN_E<=pswMyu[O|=5W]jx:B} ei"a*тҥzsɬ#{mV?u>acø K jC+7׮FoMl0l=E J8+әw:ĭwѣP!&kz$BnIbr}n:ft< ߸m43 /gUh7*Pbױ 7>G ?xl\Sz'J" ej' u :] '#|q'r-G{fbߏmyǂSz`/ pcMbymF^txgc'@ gnl#ejڻAeL*Hke"1"Z ]|r0R|ZplUQV;G5VUdM ed6 ,<0ȝp>E4l:#-Pv&LtD(d>tHr|w*=NM b w+Oor,BvJ5=c{D*+a&UxAjV/&l941ۓL;fN gTʹv*LaE-1gDPԌk|so4ߢ02[^\%_OLJ +J&Oɑ/OI.eR;do'HS]JaMw|umqwgj_ s9mηN.j(w UEr4} U#ǽ>T8VwiGSY5zwbKJe> endobj 707 0 obj << /Length1 1874 /Length2 10523 /Length3 0 /Length 11693 /Filter /FlateDecode >> stream xڍT6LJCww) %-t4! "凞s_֬53Ϯ}KE$bno 31̬TT o32&do1' &n~SBll6n~6~VV;++&. s3@L%f?Z3:t- dfbP0[mO43ٛ`*A+h;𳰸2:3;YcVU3h0@WgTu+_v5{ l휟3 v@'5y`ON613u0sY,@6@<3 03hblob11} )0yn͜@`gfgͯY~y-8 h(agfokع&NN&Ȭ2bx=/9,vsw^ {'_`ex, ^V `QXLAϊb1q~ݟ^?9鏛b³S4X, /y˟gFA >swgn 30}~~-l[ڎϜl *<.s_؟ >Sq KXfgzߛ߯84C2oo&h]q[#Bʴ3.4CBũrHWt#8ԋ%A{-Dqڀ~`:ӎ8iH~5磣;V.YG/rέk[@jn9iH}Y\9|`&bDz37쉟 ^ǑQ?ޯV;wP^cNQ{'-xE -d1C-䝉ް3I-0x_NAom̡aS6칚8[&kN4tjY_u3( *gZ:~;'gY2<4jRdץb#W~497.,9e 7Lg|9.vNu [^Hq0+QHfLq2Sj4H%HW>J!^F0ghȟᛸY*H1%CKVb1I.n/-? !D{(A4sө7BOVH^(|%Ԍ)\ʔ%"$ʭdFSxVC&e/\/'yhB_|(Յ9sPl~^6fDi,ٽVRyts#h7_vGF;Yh66w"$9/*.äZ5z8#qmaKN2 QIw|h.mnZ+x{frz+אָ*V3[RfGMf܈~xOZÇcI3M2/iఌ8=te !3 X!q \5ć:du0mv5KtS;̆i-')Zxx\p֝TLѽ=$jm}3$LRyŦN9&oy/$nfRІ" ˞Ϣy ;6`2Bĵ]@!;W~v9CTQDm0s`93={ounYd$hpƽͯh|cB>1)=cQ˪.cJw\OCb(ε 5pϋ- n`D!EsV9gG178:0swdhU2ehT _8f(G%b_'<¸!HfT-ղbBaM. åo5w8JlSVe i90lG-rXP|VnTf:Ԋj9 < VULU8D'C_ }6ƾ!D#-1&D D8_Ɠϰzu|p"a)xucK',>)7Frd$OkWe2ï< ̆_ S|m\o neePkX]]j ;d鍃/W7pH TE4Ȭ>p2HABw0aHC]K#<nS?X>qW:-tCG*EoREAcX=Iz2rL'8dMM̓0sk!kUʼn{FsEH[`mΈW9 ynԏ$%ޜ'<%iy铽/jw'3z {=3[aA;1aC/s 6+Ʈ3$C2V305[O懟6E?:PIɚB!IfސdGz!vl#E?ZJ b'[B]f4LϷālU|}y3"dҹ:iN43~d@03FfGC)I,J$:rk0AI"B+;nߚMda*;J yRڥYrYԟ$Ba߳Ԝ1Q=`mzdCYdzWٴ_2-lKxjTn^]0SH7U }]n_yk j.e`r9u+$vZAX^A:z+85Z=N,j7 bpmc)Bk\s 46L^}-ė??\C 9DZP5,6rls׍+24Ii;N4mq39AЏ6h .:osjM5e K25vc1uIu}E6AFwqYllGÏ޽A]:)jσ ^gVk}wCf_k`B5]stҭ{&ThQpX</BX}a4 捃c17ڶEL=ApI vZ QfޢFsb›zy⚀;"qa y`ILW`aI8axNd8ӫN< 2’' ܉kISB ȈDu 7b? >kCY돕H> 虎Qq6˂ L -3WHy:_k64Cs?.>yV2, NًE#q1+p1 @αj)yL~[$bSR;ޠ4]B }yMI[Ĩ=lBLiA3-xY ghᖁDyO{6\fdr[#?bEM0)mG4Q2c ߇u.sۦ0q9QkIh|"e6$GLdg߰H`%]]mCv FYѸM "jKɘy:8#3},ta[jK9d㗊d&^P  z}ر#e:l?+(-zNxK$Hdv:y~2$4/ j?nTcq95O,+$׿ u᲼ZRQK}ږbr l(1=SgI'z'U(Ϧ} |JU5_7J !j]!k۞L k7/FcGOGݕO8Zh]G%"VmRbYVh]2?.w gyw5L({!S#s}˽am(mP}J> 72hTӶHv2)G6}ޤ|>#Rl܈6cw;],+mҾ 4'Nbd?,KUcڜu٫x* 9K1̪˘:>AVm+-9dmX>LnMAJo#Q~7y NA%甊Pi76 V`Iv2(D7#OƦv;w nχEDn38C,P~GAjsDHDgxTfG91]hʢ>1q1O|Xӄ%&'ARBlj)n]P0G?P ~s/V%w%؞*mzh5b|r&rqvR-Z?]􂥬䅼dM =c:݉Au(dj\JQJI# +ŅIwG|!7?Bp8E>KoEti8,/bH͛Sl* RP5gӆki^-vЬRx~h x3ú"Өb'!}QKVZ3t3^#ivkDyG*nj5K&3 [`T\C5?{ 4dWY3tz匸v`oln8=- ^4h \Ă~BJCkGZ'0;/M_џi# ͳ+L)j_hԿ3v9#]jºOObG>&hϧ/sV26eĞJ1Įx.^)*!{u{0X !-UT[69cjװNu? ui K찐>["a Q2TtXu\ksR^Ox)M_gZM*>;hFJ9G=4g Gٝhe(ͫYxۍo≎! ȅ<1)e-jMEBFˌ:ˌ(cN?%UC!s1(B! hkǗUGan.!+s RG̕Æ6 YhֳS_'(d%788o OȺ[ ^`T%GH)Fܾ+%gZh~Jmy[CicIrz _1Cޅ%'.j!z ˁ7"i{PZ[70-rLĻӺd 5p?&`Ua}"( =}Յݥttϒ l_Sq!ח$;H;g`hUx=A!1aX\-Tc2ì4ңaL!^*%D"rc)A1wYY@6=1'8#Yɤ h{`<2,J4I!4mt6 d߲[>*m&|E.Gł UغQs|e&":zNٲNS3}2~W5on5nϲ.¦T4mt)rL!|= =MǻhӻWrUjRضٿAug&Q}BY`A^#i0 e۶!h`] Y)rۛr.gXp/BfNH4=bP>L,AdD̙ܿ\d!omg]AO@ƦueהO.^.dݽm|n5O7$$#h4o혝phxѶWԷ2Mt|ckGXNpFbTL!֨;|˯n0)Œedu-p^mK)ԕ`}M5uhcX 6c0|0B{ֶ$W2v4S WEŞ]ϙ*^>5v\d~w#OAZc˃ȯ-NgDjJ^S[OZv-~ST} }cnT|!hX;E x%Jk!䆒>˯Jo"Û-| 8.9*1@/5n\hV{Jm+!2|qU΍ rVZѧuȩ}ZmuHN`w݈]xx+r?nVn[:ˮpfH&IFEf*l?ptKR7lh};6sN)8Vڹ' 1j,d;x:eSSyw CZt X~HrsJ:Q(: v5lvSY| w^"׊l7O e?c rS/5+ zR|S!ab8pJxDK@T';ݘ+ŝR(]MwIYVkU2ΣW,kړxIpFXpBkD:k.9Vn=ZZg$u;n;KG|yÚW.YTƭKDײ]ea~WGBTwjbXZA IHǷ rVOL*gQe7{R~ǎq&Fn!z:$)GyRkUpDׯ?u|!wj3ןb*(Ɯ2CGmI mRSjQMዽV):2Ȱo=?`H'SRFӮ+GUZ'Z)G.]|5?bi;Qa5Xϲdy'~<^{OM +cWGt4mX†Ô="b:\$zuBNGƨ 05}5bjAʵjo bpϙ_[\1_~EeD-è#&gd,:S]H\q-{l yuze''^;Lrd&/t,$]Kw%! @1y^MF ׎FfE\*.M0L֮GTsz#^SIc !a FF?s(/gVa* SkعR:e%Pd mmZ:r 1l[$|dO83f¿('%3Uq欙)xϪot)TO"Օx&U\U] b8yUNXv/ɲBYÌ-\TmYrͥzJ&g~AM|u{ƺtĸף)g+.M<.Y!abT,h@KM*1wX0sQl @7`tu8} 1Tȅ `X(I<3?$Q$ 5#mKZc"Ǣ֑)<.'|{O3uVT%ow.%/g]՗Pmq6:hԱCd>eA 2 lHSMmLZ›QO 89ir ` ϶x]ElCug7s :ьLIlvh *81>x:( R$7~8D&TQ&y2i, [lY JЭC3gN|\R9U>AkĎic-Ux]E>~*MUhmHMQNVd+OtLUӵQهќ-ho]0jFu|zС,S:w<ӮX#ԃapN{HڮF7ޟچgוMd6D[r^|{O0oć:ʖ&gh&<,cH;/ե8Pfl o]~p~ EO4B*9"cR'[/]c2+P(G̕[؍/f!W >Owd/'!?{%J7OFzbi^4hށy.`əLzc6nԥh*rřL9pE%Vܙ( endstream endobj 708 0 obj << /Type /FontDescriptor /FontName /UZYEPW+CMTT9 /Flags 4 /FontBBox [-6 -233 542 698] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/A/H/P/T/a/asterisk/b/bar/c/comma/d/e/equal/f/g/i/k/l/m/n/o/one/p/parenleft/parenright/plus/r/s/t/u/underscore/x/y) /FontFile 707 0 R >> endobj 709 0 obj << /Length1 725 /Length2 16161 /Length3 0 /Length 16663 /Filter /FlateDecode >> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> endobj 636 0 obj << /Type /Encoding /Differences [39/quotesingle] >> endobj 135 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JNMLWX+CMB10 /FontDescriptor 330 0 R /FirstChar 52 /LastChar 121 /Widths 660 0 R >> endobj 138 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BZYKEU+CMBX10 /FontDescriptor 663 0 R /FirstChar 6 /LastChar 116 /Widths 657 0 R >> endobj 136 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NGBPKA+CMBX12 /FontDescriptor 665 0 R /FirstChar 14 /LastChar 127 /Widths 659 0 R >> endobj 219 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AKQJMC+CMBX8 /FontDescriptor 667 0 R /FirstChar 107 /LastChar 107 /Widths 646 0 R >> endobj 178 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JHGHVE+CMBXSL10 /FontDescriptor 669 0 R /FirstChar 98 /LastChar 115 /Widths 653 0 R >> endobj 561 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DSJFIK+CMBXTI10 /FontDescriptor 671 0 R /FirstChar 65 /LastChar 121 /Widths 634 0 R >> endobj 185 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FULNTH+CMMI10 /FontDescriptor 673 0 R /FirstChar 11 /LastChar 121 /Widths 651 0 R >> endobj 186 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LPEVIE+CMMI8 /FontDescriptor 675 0 R /FirstChar 105 /LastChar 107 /Widths 650 0 R >> endobj 139 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SYBFIG+CMR10 /FontDescriptor 324 0 R /FirstChar 11 /LastChar 127 /Widths 656 0 R >> endobj 252 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FKGUSP+CMR6 /FontDescriptor 678 0 R /FirstChar 48 /LastChar 57 /Widths 645 0 R >> endobj 188 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PUFIDY+CMR8 /FontDescriptor 680 0 R /FirstChar 48 /LastChar 116 /Widths 648 0 R >> endobj 254 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TDAIIS+CMR9 /FontDescriptor 682 0 R /FirstChar 11 /LastChar 122 /Widths 644 0 R >> endobj 179 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UNXFZM+CMSL10 /FontDescriptor 684 0 R /FirstChar 45 /LastChar 127 /Widths 652 0 R >> endobj 297 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LKORNW+CMSLTT10 /FontDescriptor 686 0 R /FirstChar 34 /LastChar 126 /Widths 642 0 R >> endobj 140 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GJPCCO+CMSS10 /FontDescriptor 333 0 R /FirstChar 43 /LastChar 116 /Widths 655 0 R >> endobj 302 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FXEGVT+CMSS9 /FontDescriptor 689 0 R /FirstChar 82 /LastChar 82 /Widths 640 0 R >> endobj 137 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NBSMKC+CMSSBX10 /FontDescriptor 691 0 R /FirstChar 82 /LastChar 82 /Widths 658 0 R >> endobj 570 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GSSULC+CMSSI10 /FontDescriptor 693 0 R /FirstChar 43 /LastChar 116 /Widths 633 0 R >> endobj 187 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FLPUCD+CMSY10 /FontDescriptor 695 0 R /FirstChar 0 /LastChar 24 /Widths 649 0 R >> endobj 374 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CSSKWC+CMSY9 /FontDescriptor 697 0 R /FirstChar 24 /LastChar 24 /Widths 638 0 R >> endobj 141 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HTNJFL+CMTI10 /FontDescriptor 699 0 R /FirstChar 11 /LastChar 127 /Widths 654 0 R >> endobj 217 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QZWXGA+CMTI12 /FontDescriptor 701 0 R /FirstChar 12 /LastChar 121 /Widths 647 0 R >> endobj 442 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TZDYZQ+CMTI9 /FontDescriptor 703 0 R /FirstChar 46 /LastChar 116 /Widths 635 0 R >> endobj 296 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MLMSVA+CMTT10 /FontDescriptor 327 0 R /FirstChar 34 /LastChar 126 /Widths 643 0 R >> endobj 354 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OFLFJX+CMTT12 /FontDescriptor 706 0 R /FirstChar 97 /LastChar 121 /Widths 639 0 R >> endobj 301 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UZYEPW+CMTT9 /FontDescriptor 708 0 R /FirstChar 40 /LastChar 124 /Widths 641 0 R >> endobj 439 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KGLSDI+SFTT1095 /FontDescriptor 710 0 R /FirstChar 39 /LastChar 39 /Widths 637 0 R /Encoding 636 0 R >> endobj 147 0 obj << /Type /Pages /Count 6 /Parent 711 0 R /Kids [74 0 R 175 0 R 212 0 R 247 0 R 288 0 R 319 0 R] >> endobj 356 0 obj << /Type /Pages /Count 6 /Parent 711 0 R /Kids [349 0 R 366 0 R 389 0 R 401 0 R 420 0 R 436 0 R] >> endobj 472 0 obj << /Type /Pages /Count 6 /Parent 711 0 R /Kids [467 0 R 485 0 R 512 0 R 533 0 R 541 0 R 546 0 R] >> endobj 554 0 obj << /Type /Pages /Count 6 /Parent 711 0 R /Kids [551 0 R 558 0 R 567 0 R 574 0 R 586 0 R 596 0 R] >> endobj 605 0 obj << /Type /Pages /Count 3 /Parent 711 0 R /Kids [602 0 R 612 0 R 625 0 R] >> endobj 711 0 obj << /Type /Pages /Count 27 /Kids [147 0 R 356 0 R 472 0 R 554 0 R 605 0 R] >> endobj 712 0 obj << /Type /Outlines /First 3 0 R /Last 71 0 R /Count 6 >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 712 0 R /Prev 67 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 712 0 R /Prev 31 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 31 0 R /Prev 59 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 31 0 R /Prev 55 0 R /Next 63 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 31 0 R /Prev 51 0 R /Next 59 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 31 0 R /Prev 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 31 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 31 0 R /Prev 39 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 31 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 712 0 R /Prev 27 0 R /Next 67 0 R /First 35 0 R /Last 63 0 R /Count -8 >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 712 0 R /Prev 7 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 11 0 R /Prev 19 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 11 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /First 15 0 R /Last 23 0 R /Count -3 >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 712 0 R /Prev 3 0 R /Next 27 0 R /First 11 0 R /Last 11 0 R /Count -1 >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 712 0 R /Next 7 0 R >> endobj 713 0 obj << /Names [(Doc-Start) 134 0 R (Hfootnote.1) 253 0 R (Hfootnote.10) 440 0 R (Hfootnote.11) 471 0 R (Hfootnote.2) 300 0 R (Hfootnote.3) 355 0 R] /Limits [(Doc-Start) (Hfootnote.3)] >> endobj 714 0 obj << /Names [(Hfootnote.4) 371 0 R (Hfootnote.5) 373 0 R (Hfootnote.6) 393 0 R (Hfootnote.7) 394 0 R (Hfootnote.8) 405 0 R (Hfootnote.9) 406 0 R] /Limits [(Hfootnote.4) (Hfootnote.9)] >> endobj 715 0 obj << /Names [(Section.0.Introduction.1) 2 0 R (Section.1.Model\040description.1) 6 0 R (Section.2.Parameter\040estimation.1) 26 0 R (Section.3.Software.1) 30 0 R (Section.4.Comparison.1) 66 0 R (Section.5.Conclusion.1) 70 0 R] /Limits [(Section.0.Introduction.1) (Section.5.Conclusion.1)] >> endobj 716 0 obj << /Names [(Subsection.2.0.Prior\040distributions.2) 10 0 R (Subsection.4.0.A\040worked\040example.2) 34 0 R (Subsection.4.1.Fitting\040models\040with\040brms.2) 38 0 R (Subsection.4.2.formula:\040Information\040on\040the\040response\040and\040predictors.2) 42 0 R (Subsection.4.3.family:\040Distribution\040of\040the\040response\040variable.2) 46 0 R (Subsection.4.4.prior:\040Prior\040distributions\040of\040model\040parameters.2) 50 0 R] /Limits [(Subsection.2.0.Prior\040distributions.2) (Subsection.4.4.prior:\040Prior\040distributions\040of\040model\040parameters.2)] >> endobj 717 0 obj << /Names [(Subsection.4.5.control\040Adjusting\040the\040sampling\040behavior\040of\040Stan.2) 54 0 R (Subsection.4.6.Analyzing\040the\040results.2) 58 0 R (Subsection.4.7.Modeling\040ordinal\040data.2) 62 0 R (Subsubsection.2.1.0.Regression\040parameters\040at\040population-level.3) 14 0 R (Subsubsection.2.1.1.Regression\040parameters\040at\040group-level.3) 18 0 R (Subsubsection.2.1.2.Family\040specific\040parameters.3) 22 0 R] /Limits [(Subsection.4.5.control\040Adjusting\040the\040sampling\040behavior\040of\040Stan.2) (Subsubsection.2.1.2.Family\040specific\040parameters.3)] >> endobj 718 0 obj << /Names [(cite.Creutz1988) 257 0 R (cite.Rcore2015) 153 0 R (cite.Rtools2015) 312 0 R (cite.Xcode2015) 313 0 R (cite.afex2015) 377 0 R (cite.andersen1977) 478 0 R] /Limits [(cite.Creutz1988) (cite.andersen1977)] >> endobj 719 0 obj << /Names [(cite.andrich1978a) 476 0 R (cite.andrich1978b) 477 0 R (cite.bates2015) 154 0 R (cite.brms1) 148 0 R (cite.brown2015) 149 0 R (cite.carpenter2017) 161 0 R] /Limits [(cite.andrich1978a) (cite.carpenter2017)] >> endobj 720 0 obj << /Names [(cite.carvalho2009) 375 0 R (cite.carvalho2010) 376 0 R (cite.christensen2015) 481 0 R (cite.chung2013) 544 0 R (cite.damien1999) 193 0 R (cite.demidenko2013) 150 0 R] /Limits [(cite.carvalho2009) (cite.demidenko2013)] >> endobj 721 0 obj << /Names [(cite.duane1987) 198 0 R (cite.ezzet1991) 201 0 R (cite.fox2011) 220 0 R (cite.gabry2015) 425 0 R (cite.gelfand1990) 192 0 R (cite.gelfand1992) 305 0 R] /Limits [(cite.duane1987) (cite.gelfand1992)] >> endobj 722 0 obj << /Names [(cite.gelman1992) 423 0 R (cite.gelman2006) 395 0 R (cite.gelman2014) 197 0 R (cite.gelmanMLM2006) 151 0 R (cite.geman1984) 191 0 R (cite.griewank2008) 303 0 R] /Limits [(cite.gelman1992) (cite.griewank2008)] >> endobj 723 0 obj << /Names [(cite.hadfield2010) 159 0 R (cite.hastie1990) 519 0 R (cite.hastings1970) 190 0 R (cite.hoffman2014) 196 0 R (cite.ionides2008) 307 0 R (cite.juarez2010) 256 0 R] /Limits [(cite.hadfield2010) (cite.juarez2010)] >> endobj 724 0 obj << /Names [(cite.kass2006) 222 0 R (cite.lewandowski2009) 255 0 R (cite.loo2016) 311 0 R (cite.lunn2000) 155 0 R (cite.masters1982) 475 0 R (cite.mcelreath2016) 517 0 R] /Limits [(cite.kass2006) (cite.mcelreath2016)] >> endobj 725 0 obj << /Names [(cite.mcgilchrist1991) 200 0 R (cite.metropolis1953) 189 0 R (cite.natarajan2000) 221 0 R (cite.neal2003) 194 0 R (cite.neal2011) 195 0 R (cite.nlme2016) 518 0 R] /Limits [(cite.mcgilchrist1991) (cite.nlme2016)] >> endobj 726 0 obj << /Names [(cite.pinheiro2006) 152 0 R (cite.plummer2008) 308 0 R (cite.plummer2013) 158 0 R (cite.rstanarm2016) 516 0 R (cite.samejima1969) 473 0 R (cite.spiegelhalter2002) 310 0 R] /Limits [(cite.pinheiro2006) (cite.spiegelhalter2002)] >> endobj 727 0 obj << /Names [(cite.spiegelhalter2003) 156 0 R (cite.spiegelhalter2007) 157 0 R (cite.stan2017) 160 0 R (cite.stanM2017) 199 0 R (cite.tutz1990) 474 0 R (cite.tutz2000) 480 0 R] /Limits [(cite.spiegelhalter2003) (cite.tutz2000)] >> endobj 728 0 obj << /Names [(cite.vanderark2001) 479 0 R (cite.vanderlinde2005) 309 0 R (cite.vehtari2015) 306 0 R (cite.watanabe2010) 304 0 R (cite.wood2011) 520 0 R (cite.yee2010) 482 0 R] /Limits [(cite.vanderark2001) (cite.yee2010)] >> endobj 729 0 obj << /Names [(cite.zuur2014) 521 0 R (figure.1) 314 0 R (figure.2) 424 0 R (figure.3) 426 0 R (figure.4) 488 0 R (page.1) 133 0 R] /Limits [(cite.zuur2014) (page.1)] >> endobj 730 0 obj << /Names [(page.10) 403 0 R (page.11) 422 0 R (page.12) 438 0 R (page.13) 469 0 R (page.14) 487 0 R (page.15) 514 0 R] /Limits [(page.10) (page.15)] >> endobj 731 0 obj << /Names [(page.16) 535 0 R (page.17) 543 0 R (page.18) 548 0 R (page.19) 553 0 R (page.2) 177 0 R (page.20) 560 0 R] /Limits [(page.16) (page.20)] >> endobj 732 0 obj << /Names [(page.21) 569 0 R (page.22) 576 0 R (page.23) 588 0 R (page.24) 598 0 R (page.25) 604 0 R (page.26) 614 0 R] /Limits [(page.21) (page.26)] >> endobj 733 0 obj << /Names [(page.27) 627 0 R (page.3) 214 0 R (page.4) 249 0 R (page.5) 290 0 R (page.6) 321 0 R (page.7) 351 0 R] /Limits [(page.27) (page.7)] >> endobj 734 0 obj << /Names [(page.8) 368 0 R (page.9) 391 0 R (section.1) 142 0 R (section.2) 184 0 R (section.3) 251 0 R (section.4) 295 0 R] /Limits [(page.8) (section.4)] >> endobj 735 0 obj << /Names [(section.5) 515 0 R (section.6) 536 0 R (subsection.2.1) 215 0 R (subsection.4.1) 322 0 R (subsection.4.2) 352 0 R (subsection.4.3) 353 0 R] /Limits [(section.5) (subsection.4.3)] >> endobj 736 0 obj << /Names [(subsection.4.4) 369 0 R (subsection.4.5) 370 0 R (subsection.4.6) 392 0 R (subsection.4.7) 404 0 R (subsection.4.8) 470 0 R (subsubsection.2.1.1) 216 0 R] /Limits [(subsection.4.4) (subsubsection.2.1.1)] >> endobj 737 0 obj << /Names [(subsubsection.2.1.2) 218 0 R (subsubsection.2.1.3) 250 0 R (table.1) 537 0 R (table.2) 538 0 R (table.3) 539 0 R] /Limits [(subsubsection.2.1.2) (table.3)] >> endobj 738 0 obj << /Kids [713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R] /Limits [(Doc-Start) (cite.andersen1977)] >> endobj 739 0 obj << /Kids [719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R] /Limits [(cite.andrich1978a) (cite.mcelreath2016)] >> endobj 740 0 obj << /Kids [725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R] /Limits [(cite.mcgilchrist1991) (page.15)] >> endobj 741 0 obj << /Kids [731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R] /Limits [(page.16) (subsubsection.2.1.1)] >> endobj 742 0 obj << /Kids [737 0 R] /Limits [(subsubsection.2.1.2) (table.3)] >> endobj 743 0 obj << /Kids [738 0 R 739 0 R 740 0 R 741 0 R 742 0 R] /Limits [(Doc-Start) (table.3)] >> endobj 744 0 obj << /Dests 743 0 R >> endobj 745 0 obj << /Type /Catalog /Pages 711 0 R /Outlines 712 0 R /Names 744 0 R /PageMode/UseOutlines /OpenAction 73 0 R >> endobj 746 0 obj << /Author(Paul-Christian B\374rkner)/Title(brms: An R Package for Bayesian Multilevel Models using Stan)/Subject()/Creator(LaTeX with hyperref)/Producer(pdfTeX-1.40.20)/Keywords(Bayesian inference, multilevel model, ordinal data, MCMC, Stan, R) /CreationDate (D:20200221155814+02'00') /ModDate (D:20200221155814+02'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.7029 (1.40.20)) >> endobj xref 0 747 0000000414 65535 f 0000000015 00000 n 0000011721 00000 n 0000998959 00000 n 0000000075 00000 n 0000000105 00000 n 0000023139 00000 n 0000998838 00000 n 0000000173 00000 n 0000000208 00000 n 0000029023 00000 n 0000998742 00000 n 0000000283 00000 n 0000000321 00000 n 0000029136 00000 n 0000998668 00000 n 0000000430 00000 n 0000000490 00000 n 0000029249 00000 n 0000998581 00000 n 0000000594 00000 n 0000000649 00000 n 0000036908 00000 n 0000998507 00000 n 0000000740 00000 n 0000000785 00000 n 0000037021 00000 n 0000998420 00000 n 0000000857 00000 n 0000000896 00000 n 0000049296 00000 n 0000998295 00000 n 0000000953 00000 n 0000000980 00000 n 0000057203 00000 n 0000998221 00000 n 0000001056 00000 n 0000001091 00000 n 0000061958 00000 n 0000998134 00000 n 0000001178 00000 n 0000001221 00000 n 0000062071 00000 n 0000998047 00000 n 0000001344 00000 n 0000001414 00000 n 0000068754 00000 n 0000997960 00000 n 0000001528 00000 n 0000001592 00000 n 0000068865 00000 n 0000997873 00000 n 0000001707 00000 n 0000001772 00000 n 0000076562 00000 n 0000997786 00000 n 0000001891 00000 n 0000001957 00000 n 0000081746 00000 n 0000997699 00000 n 0000002038 00000 n 0000002078 00000 n 0000100373 00000 n 0000997625 00000 n 0000002159 00000 n 0000002199 00000 n 0000110799 00000 n 0000997537 00000 n 0000002258 00000 n 0000002287 00000 n 0000115948 00000 n 0000997462 00000 n 0000002346 00000 n 0000002375 00000 n 0000006201 00000 n 0000006562 00000 n 0000006713 00000 n 0000006863 00000 n 0000007175 00000 n 0000007331 00000 n 0000007491 00000 n 0000007651 00000 n 0000007811 00000 n 0000007971 00000 n 0000008130 00000 n 0000008289 00000 n 0000008443 00000 n 0000008598 00000 n 0000008908 00000 n 0000009063 00000 n 0000009217 00000 n 0000009372 00000 n 0000009699 00000 n 0000009862 00000 n 0000010025 00000 n 0000010188 00000 n 0000010346 00000 n 0000010504 00000 n 0000010663 00000 n 0000010822 00000 n 0000010977 00000 n 0000011132 00000 n 0000011451 00000 n 0000016771 00000 n 0000017094 00000 n 0000017255 00000 n 0000017415 00000 n 0000017575 00000 n 0000017888 00000 n 0000018045 00000 n 0000018204 00000 n 0000018362 00000 n 0000018677 00000 n 0000018835 00000 n 0000018991 00000 n 0000019147 00000 n 0000019303 00000 n 0000019456 00000 n 0000019612 00000 n 0000019769 00000 n 0000019925 00000 n 0000020081 00000 n 0000020239 00000 n 0000020397 00000 n 0000020552 00000 n 0000020709 00000 n 0000020864 00000 n 0000021020 00000 n 0000021179 00000 n 0000021338 00000 n 0000021496 00000 n 0000011831 00000 n 0000002423 00000 n 0000011610 00000 n 0000011665 00000 n 0000992837 00000 n 0000993123 00000 n 0000995135 00000 n 0000992980 00000 n 0000993991 00000 n 0000994849 00000 n 0000995709 00000 n 0000011775 00000 n 0000007019 00000 n 0000008753 00000 n 0000009536 00000 n 0000011293 00000 n 0000996734 00000 n 0000128911 00000 n 0000128850 00000 n 0000133896 00000 n 0000134506 00000 n 0000145247 00000 n 0000145552 00000 n 0000128789 00000 n 0000139072 00000 n 0000145735 00000 n 0000145796 00000 n 0000145430 00000 n 0000138585 00000 n 0000145918 00000 n 0000128972 00000 n 0000021655 00000 n 0000021811 00000 n 0000021967 00000 n 0000022127 00000 n 0000022286 00000 n 0000022610 00000 n 0000022772 00000 n 0000022928 00000 n 0000027388 00000 n 0000027549 00000 n 0000027710 00000 n 0000027865 00000 n 0000023251 00000 n 0000016320 00000 n 0000011980 00000 n 0000023083 00000 n 0000993411 00000 n 0000994559 00000 n 0000016933 00000 n 0000017732 00000 n 0000018520 00000 n 0000022449 00000 n 0000023194 00000 n 0000993703 00000 n 0000993847 00000 n 0000995425 00000 n 0000994275 00000 n 0000139316 00000 n 0000138707 00000 n 0000138463 00000 n 0000134323 00000 n 0000133835 00000 n 0000145125 00000 n 0000145186 00000 n 0000138768 00000 n 0000134445 00000 n 0000133957 00000 n 0000145979 00000 n 0000139255 00000 n 0000134018 00000 n 0000028019 00000 n 0000028177 00000 n 0000028334 00000 n 0000028495 00000 n 0000028656 00000 n 0000028811 00000 n 0000034017 00000 n 0000034180 00000 n 0000034342 00000 n 0000029362 00000 n 0000027177 00000 n 0000023465 00000 n 0000028967 00000 n 0000029079 00000 n 0000029192 00000 n 0000995853 00000 n 0000029305 00000 n 0000993267 00000 n 0000134079 00000 n 0000145064 00000 n 0000138950 00000 n 0000034495 00000 n 0000034652 00000 n 0000034809 00000 n 0000034965 00000 n 0000035122 00000 n 0000035278 00000 n 0000035434 00000 n 0000035590 00000 n 0000035747 00000 n 0000035904 00000 n 0000036063 00000 n 0000036222 00000 n 0000036380 00000 n 0000036538 00000 n 0000036695 00000 n 0000042646 00000 n 0000042805 00000 n 0000042965 00000 n 0000043279 00000 n 0000043437 00000 n 0000043594 00000 n 0000043750 00000 n 0000043909 00000 n 0000037195 00000 n 0000033742 00000 n 0000029563 00000 n 0000036852 00000 n 0000036964 00000 n 0000037077 00000 n 0000994134 00000 n 0000037134 00000 n 0000994417 00000 n 0000139011 00000 n 0000138890 00000 n 0000133774 00000 n 0000044068 00000 n 0000044228 00000 n 0000044388 00000 n 0000044547 00000 n 0000044706 00000 n 0000045023 00000 n 0000045182 00000 n 0000045341 00000 n 0000045500 00000 n 0000045659 00000 n 0000045818 00000 n 0000045977 00000 n 0000046136 00000 n 0000046299 00000 n 0000046462 00000 n 0000046790 00000 n 0000046955 00000 n 0000047263 00000 n 0000047418 00000 n 0000047577 00000 n 0000047736 00000 n 0000047894 00000 n 0000048051 00000 n 0000048205 00000 n 0000048518 00000 n 0000048674 00000 n 0000049089 00000 n 0000056450 00000 n 0000056606 00000 n 0000049468 00000 n 0000042187 00000 n 0000037448 00000 n 0000049240 00000 n 0000043122 00000 n 0000044865 00000 n 0000046626 00000 n 0000047109 00000 n 0000049351 00000 n 0000996140 00000 n 0000994703 00000 n 0000048362 00000 n 0000048882 00000 n 0000049407 00000 n 0000996428 00000 n 0000994993 00000 n 0000138524 00000 n 0000150229 00000 n 0000134262 00000 n 0000150107 00000 n 0000138829 00000 n 0000145369 00000 n 0000150046 00000 n 0000145857 00000 n 0000150168 00000 n 0000145491 00000 n 0000128728 00000 n 0000057141 00000 n 0000052031 00000 n 0000056762 00000 n 0000056923 00000 n 0000057316 00000 n 0000051868 00000 n 0000049712 00000 n 0000057085 00000 n 0000057259 00000 n 0000054062 00000 n 0000785024 00000 n 0000056306 00000 n 0000054287 00000 n 0000958708 00000 n 0000056213 00000 n 0000054442 00000 n 0000682221 00000 n 0000056129 00000 n 0000054597 00000 n 0000857942 00000 n 0000056057 00000 n 0000054752 00000 n 0000054906 00000 n 0000784993 00000 n 0000055506 00000 n 0000958676 00000 n 0000055606 00000 n 0000682190 00000 n 0000055821 00000 n 0000857910 00000 n 0000061748 00000 n 0000067447 00000 n 0000068231 00000 n 0000068542 00000 n 0000062245 00000 n 0000061609 00000 n 0000057508 00000 n 0000061902 00000 n 0000062014 00000 n 0000062127 00000 n 0000996284 00000 n 0000062184 00000 n 0000996850 00000 n 0000067600 00000 n 0000067753 00000 n 0000067911 00000 n 0000068071 00000 n 0000074309 00000 n 0000074463 00000 n 0000074623 00000 n 0000074783 00000 n 0000069100 00000 n 0000067252 00000 n 0000062463 00000 n 0000068698 00000 n 0000068809 00000 n 0000068921 00000 n 0000068978 00000 n 0000068387 00000 n 0000069039 00000 n 0000995567 00000 n 0000133530 00000 n 0000133591 00000 n 0000145674 00000 n 0000074942 00000 n 0000075095 00000 n 0000075251 00000 n 0000075403 00000 n 0000075560 00000 n 0000075717 00000 n 0000075868 00000 n 0000076031 00000 n 0000076194 00000 n 0000076350 00000 n 0000076796 00000 n 0000074066 00000 n 0000069331 00000 n 0000076506 00000 n 0000076618 00000 n 0000076675 00000 n 0000076735 00000 n 0000134384 00000 n 0000081066 00000 n 0000081220 00000 n 0000081378 00000 n 0000081536 00000 n 0000081981 00000 n 0000080903 00000 n 0000077012 00000 n 0000081690 00000 n 0000081802 00000 n 0000081859 00000 n 0000081920 00000 n 0000085762 00000 n 0000085918 00000 n 0000086075 00000 n 0000086226 00000 n 0000086382 00000 n 0000086536 00000 n 0000151270 00000 n 0000000417 00000 f 0000410350 00000 n 0000411349 00000 n 0000000490 00000 f 0000421475 00000 n 0000086743 00000 n 0000085583 00000 n 0000082198 00000 n 0000086687 00000 n 0000138402 00000 n 0000410558 00000 n 0000134140 00000 n 0000421682 00000 n 0000090289 00000 n 0000090440 00000 n 0000090910 00000 n 0000091226 00000 n 0000090595 00000 n 0000090753 00000 n 0000096353 00000 n 0000096509 00000 n 0000091501 00000 n 0000090102 00000 n 0000086867 00000 n 0000091384 00000 n 0000996571 00000 n 0000091440 00000 n 0000091069 00000 n 0000995997 00000 n 0000096666 00000 n 0000096826 00000 n 0000096986 00000 n 0000099681 00000 n 0000099844 00000 n 0000100007 00000 n 0000100162 00000 n 0000097141 00000 n 0000097297 00000 n 0000097453 00000 n 0000097612 00000 n 0000097771 00000 n 0000097930 00000 n 0000098090 00000 n 0000098250 00000 n 0000098410 00000 n 0000098569 00000 n 0000098728 00000 n 0000098888 00000 n 0000099048 00000 n 0000099209 00000 n 0000099370 00000 n 0000099526 00000 n 0000100547 00000 n 0000096022 00000 n 0000091719 00000 n 0000100317 00000 n 0000100429 00000 n 0000100486 00000 n 0000996967 00000 n 0000145613 00000 n 0000146040 00000 n 0000139133 00000 n 0000128667 00000 n 0000128606 00000 n 0000128545 00000 n 0000149985 00000 n 0000146100 00000 n 0000133652 00000 n 0000150351 00000 n 0000103197 00000 n 0000103403 00000 n 0000103058 00000 n 0000100776 00000 n 0000103347 00000 n 0000659043 00000 n 0000422476 00000 n 0000000522 00000 f 0000658836 00000 n 0000108221 00000 n 0000108378 00000 n 0000108535 00000 n 0000108694 00000 n 0000108854 00000 n 0000109014 00000 n 0000109174 00000 n 0000109334 00000 n 0000109495 00000 n 0000109651 00000 n 0000109806 00000 n 0000109963 00000 n 0000110120 00000 n 0000110276 00000 n 0000110431 00000 n 0000110587 00000 n 0000115443 00000 n 0000115593 00000 n 0000115742 00000 n 0000110910 00000 n 0000107962 00000 n 0000103528 00000 n 0000110743 00000 n 0000110854 00000 n 0000134201 00000 n 0000139194 00000 n 0000145308 00000 n 0000138646 00000 n 0000150290 00000 n 0000150412 00000 n 0000000523 00000 f 0000000524 00000 f 0000000525 00000 f 0000000530 00000 f 0000118411 00000 n 0000118568 00000 n 0000118725 00000 n 0000118885 00000 n 0000000000 00000 f 0000121598 00000 n 0000116061 00000 n 0000115288 00000 n 0000111060 00000 n 0000115892 00000 n 0000116004 00000 n 0000119101 00000 n 0000122071 00000 n 0000124208 00000 n 0000119163 00000 n 0000118248 00000 n 0000116197 00000 n 0000119045 00000 n 0000133713 00000 n 0000122133 00000 n 0000121451 00000 n 0000119299 00000 n 0000122015 00000 n 0000121807 00000 n 0000124270 00000 n 0000124033 00000 n 0000122283 00000 n 0000124152 00000 n 0000997084 00000 n 0000127940 00000 n 0000128302 00000 n 0000129033 00000 n 0000127785 00000 n 0000124407 00000 n 0000128489 00000 n 0000993557 00000 n 0000128121 00000 n 0000132737 00000 n 0000132903 00000 n 0000133283 00000 n 0000134567 00000 n 0000132574 00000 n 0000129222 00000 n 0000133474 00000 n 0000995280 00000 n 0000133094 00000 n 0000138160 00000 n 0000139377 00000 n 0000138021 00000 n 0000134744 00000 n 0000138346 00000 n 0000143202 00000 n 0000143571 00000 n 0000143930 00000 n 0000144124 00000 n 0000144297 00000 n 0000144484 00000 n 0000144664 00000 n 0000144830 00000 n 0000146161 00000 n 0000142991 00000 n 0000139540 00000 n 0000145008 00000 n 0000143388 00000 n 0000143750 00000 n 0000148784 00000 n 0000149219 00000 n 0000149572 00000 n 0000149750 00000 n 0000150473 00000 n 0000148605 00000 n 0000146325 00000 n 0000149929 00000 n 0000149002 00000 n 0000149398 00000 n 0000410620 00000 n 0000151131 00000 n 0000150663 00000 n 0000410502 00000 n 0000997201 00000 n 0000407274 00000 n 0000407418 00000 n 0000407520 00000 n 0000407557 00000 n 0000407652 00000 n 0000421744 00000 n 0000411210 00000 n 0000410732 00000 n 0000421626 00000 n 0000418174 00000 n 0000418318 00000 n 0000418403 00000 n 0000418505 00000 n 0000418551 00000 n 0000418599 00000 n 0000418645 00000 n 0000418682 00000 n 0000418777 00000 n 0000659105 00000 n 0000422337 00000 n 0000421869 00000 n 0000658987 00000 n 0000655760 00000 n 0000655904 00000 n 0000656006 00000 n 0000656043 00000 n 0000656138 00000 n 0000659217 00000 n 0000659648 00000 n 0000659995 00000 n 0000992768 00000 n 0000660417 00000 n 0000660442 00000 n 0000660467 00000 n 0000660636 00000 n 0000660661 00000 n 0000661020 00000 n 0000661411 00000 n 0000661802 00000 n 0000662461 00000 n 0000662540 00000 n 0000662565 00000 n 0000663076 00000 n 0000663508 00000 n 0000663668 00000 n 0000663705 00000 n 0000664340 00000 n 0000664801 00000 n 0000664924 00000 n 0000665624 00000 n 0000666055 00000 n 0000666699 00000 n 0000667332 00000 n 0000667357 00000 n 0000668019 00000 n 0000668429 00000 n 0000682499 00000 n 0000695155 00000 n 0000695458 00000 n 0000711079 00000 n 0000711441 00000 n 0000718575 00000 n 0000718795 00000 n 0000726530 00000 n 0000726760 00000 n 0000739613 00000 n 0000739888 00000 n 0000751327 00000 n 0000751638 00000 n 0000759313 00000 n 0000759538 00000 n 0000785566 00000 n 0000794181 00000 n 0000794447 00000 n 0000803392 00000 n 0000803662 00000 n 0000821986 00000 n 0000822353 00000 n 0000834255 00000 n 0000834538 00000 n 0000849737 00000 n 0000850176 00000 n 0000858163 00000 n 0000865172 00000 n 0000865391 00000 n 0000872404 00000 n 0000872627 00000 n 0000880980 00000 n 0000881231 00000 n 0000888665 00000 n 0000888914 00000 n 0000895943 00000 n 0000896170 00000 n 0000918697 00000 n 0000919134 00000 n 0000930064 00000 n 0000930330 00000 n 0000938108 00000 n 0000938342 00000 n 0000959234 00000 n 0000963374 00000 n 0000963616 00000 n 0000975430 00000 n 0000975759 00000 n 0000992542 00000 n 0000997294 00000 n 0000997388 00000 n 0000999030 00000 n 0000999230 00000 n 0000999432 00000 n 0000999739 00000 n 0001000333 00000 n 0001000940 00000 n 0001001174 00000 n 0001001413 00000 n 0001001663 00000 n 0001001893 00000 n 0001002133 00000 n 0001002375 00000 n 0001002612 00000 n 0001002855 00000 n 0001003113 00000 n 0001003359 00000 n 0001003599 00000 n 0001003783 00000 n 0001003953 00000 n 0001004122 00000 n 0001004292 00000 n 0001004456 00000 n 0001004633 00000 n 0001004844 00000 n 0001005080 00000 n 0001005268 00000 n 0001005389 00000 n 0001005519 00000 n 0001005641 00000 n 0001005762 00000 n 0001005843 00000 n 0001005946 00000 n 0001005984 00000 n 0001006111 00000 n trailer << /Size 747 /Root 745 0 R /Info 746 0 R /ID [ ] >> startxref 1006528 %%EOF brms/inst/doc/brms_families.html0000644000176200001440000006021413623753774016465 0ustar liggesusers Parameterization of Response Distributions in brms

    Parameterization of Response Distributions in brms

    Paul Bürkner

    2020-02-21

    The purpose of this vignette is to discuss the parameterizations of the families (i.e., response distributions) used in brms. For a more general overview of the package see vignette("brms_overview").

    Notation

    Throughout this vignette, we denote values of the response variable as \(y\), a density function as \(f\), and use \(\mu\) to refer to the main model parameter, which is usually the mean of the response distribution or some closely related quantity. In a regression framework, \(\mu\) is not estimated directly but computed as \(\mu = g(\eta)\), where \(\eta\) is a predictor term (see help(brmsformula) for details) and \(g\) is the response function (i.e., inverse of the link function).

    Location shift models

    The density of the gaussian family is given by \[ f(y) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{1}{2}\left(\frac{y - \mu}{\sigma}\right)^2\right) \]

    where \(\sigma\) is the residual standard deviation. The density of the student family is given by \[ f(y) = \frac{\Gamma((\nu + 1)/2)}{\Gamma(\nu/2)} \frac{1}{\sqrt{\nu\pi}\sigma}\left(1 + \frac{1}{\nu} \left(\frac{y - \mu}{\sigma}\right)^2\right)^{-(\nu+1)/2} \]

    \(\Gamma\) denotes the gamma function and \(\nu > 1\) are the degrees of freedom. As \(\nu \rightarrow \infty\), the student distribution becomes the gaussian distribution. The density of the skew_normal family is given by \[ f(y) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{1}{2} \left(\frac{y - \xi}{\omega}\right)^2 \right) \left(1 + \text{erf} \left( \alpha \left(\frac{y - \xi}{\omega \sqrt{2}} \right) \right) \right) \]

    where \(\xi\) is the location parameter, \(\omega\) is the positive scale parameter, \(\alpha\) the skewness parameter, and \(\text{erf}\) denotes the error function of the gaussian distribution. To parameterize the skew-normal distribution in terms of the mean \(\mu\) and standard deviation \(\sigma\), \(\omega\) and \(\xi\) are computed as \[ \omega = \frac{\sigma}{\sqrt{1 - \frac{2}{\pi} \frac{\alpha^2}{1 + \alpha^2}}} \]

    \[ \xi = \mu - \omega \frac{\alpha}{\sqrt{1 + \alpha^2}} \sqrt{\frac{2}{\pi}} \]

    If \(\alpha = 0\), the skew-normal distribution becomes the gaussian distribution. For location shift models, \(y\) can be any real value.

    Binary and count data models

    The density of the binomial family is given by \[ f(y) = {N \choose y} \mu^{y} (1-\mu)^{N - y} \] where \(N\) is the number of trials and \(y \in \{0, ... , N\}\). When all \(N\) are \(1\) (i.e., \(y \in \{0,1\}\)), the bernoulli distribution for binary data arises. binomial and bernoulli families are distinguished in brms as the bernoulli distribution has its own implementation in Stan that is computationlly more efficient.

    For \(y \in \mathbb{N}_0\), the density of the poisson family is given by \[ f(y) = \frac{\mu^{y}}{y!} \exp(-\mu) \] The density of the negbinomial (negative binomial) family is \[ f(y) = {y + \phi - 1 \choose y} \left(\frac{\mu}{\mu + \phi}\right)^{y} \left(\frac{\phi}{\mu + \phi}\right)^\phi \] where \(\phi\) is a positive precision parameter. For \(\phi \rightarrow \infty\), the negative binomial distribution becomes the poisson distribution. The density of the geometric family arises if \(\phi\) is set to \(1\).

    Survival models

    With survival models we mean all models that are defined on the positive reals only, that is \(y \in \mathbb{R}^+\). The density of the lognormal family is given by \[ f(y) = \frac{1}{\sqrt{2\pi}\sigma x} \exp\left(-\frac{1}{2}\left(\frac{\log(y) - \mu}{\sigma}\right)^2\right) \] where \(\sigma\) is the residual standard deviation on the log-scale. The density of the Gamma family is given by \[ f(y) = \frac{(\alpha / \mu)^\alpha}{\Gamma(\alpha)} y^{\alpha-1} \exp\left(-\frac{\alpha y}{\mu}\right) \] where \(\alpha\) is a positive shape parameter. The density of the weibull family is given by \[ f(y) = \frac{\alpha}{s} \left(\frac{y}{s}\right)^{\alpha-1} \exp\left(-\left(\frac{y}{s}\right)^\alpha\right) \] where \(\alpha\) is again a positive shape parameter and \(s = \mu / \Gamma(1 + 1 / \alpha)\) is the scale parameter to that \(\mu\) is the mean of the distribution. The exponential family arises if \(\alpha\) is set to \(1\) for either the gamma or Weibull distribution. The density of the inverse.gaussian family is given by \[ f(y) = \left(\frac{\alpha}{2 \pi y^3}\right)^{1/2} \exp \left(\frac{-\alpha (y - \mu)^2}{2 \mu^2 y} \right) \] where \(\alpha\) is a positive shape parameter.

    Extreme value models

    Modeling extremes requires special distributions. One may use the weibull distribution (see above) or the frechet distribution with density \[ f(y) = \frac{\nu}{s} \left(\frac{y}{s}\right)^{-1-\nu} \exp\left(-\left(\frac{y}{s}\right)^{-\nu}\right) \] where \(s = \mu / \Gamma(1 - 1 / \nu)\) is a positive scale parameter and \(\nu > 1\) is a shape parameter so that \(\mu\) predicts the mean of the Frechet distribution. A generalization of both distributions is the generalized extreme value distribution (family gen_extreme_value) with density \[ f(y) = \frac{1}{\sigma} t(y)^{-1 - 1 / \xi} \exp(-t(y)) \] where \[ t(y) = \left(1 + \xi \left(\frac{y - \mu}{\sigma} \right)\right)^{-1 / \xi} \] with positive scale parameter \(\sigma\) and shape parameter \(\xi\).

    Response time models

    One family that is especially suited to model reaction times is the exgaussian (‘exponentially modified Gaussian’) family. Its density is given by

    \[ f(y) = \frac{1}{2 \beta} \exp\left(\frac{1}{2 \beta} \left(2\xi + \sigma^2 / \beta - 2 y \right) \right) \text{erfc}\left(\frac{\xi + \sigma^2 / \beta - y}{\sqrt{2} \sigma} \right) \] where \(\beta\) is the scale (inverse rate) of the exponential component, \(\xi\) is the mean of the Gaussian componenent, \(\sigma\) is the standard deviation of the Gaussian component, and \(\text{erfc}\) is the complementary error function. We parameterize \(\mu = \xi + \beta\) so that the main predictor term equals the mean of the distribution.

    Another family well suited for modelling response times is the shifted_lognormal distribution. It’s density equals that of the lognormal distribution except that the whole distribution is shifted to the right by a positive parameter called ndt (for consistency with the wiener diffusion model explained below).

    A family concerned with the combined modelling of reaction times and corresponding binary responses is the wiener diffusion model. It has four model parameters each with a natural interpreation. The parameter \(\alpha > 0\) describes the separation between two boundaries of the diffusion process, \(\tau > 0\) describes the non-decision time (e.g., due to image or motor processing), \(\beta \in [0, 1]\) describes the initial bias in favor of the upper alternative, and \(\delta \in \mathbb{R}\) describes the drift rate to the boundaries (a positive value indicates a drift towards to upper boundary). The density for the reaction time at the upper boundary is given by

    \[ f(y) = \frac{\alpha}{(y-\tau)^3/2} \exp \! \left(- \delta \alpha \beta - \frac{\delta^2(y-\tau)}{2}\right) \sum_{k = - \infty}^{\infty} (2k + \beta) \phi \! \left(\frac{2k + \alpha \beta}{\sqrt{y - \tau}}\right) \]

    where \(\phi(x)\) denotes the standard normal density function. The density at the lower boundary can be obtained by substituting \(1 - \beta\) for \(\beta\) and \(-\delta\) for \(\delta\) in the above equation. In brms the parameters \(\alpha\), \(\tau\), and \(\beta\) are modeled as auxiliary parameters named bs (‘boundary separation’), ndt (‘non-decision time’), and bias respectively, whereas the drift rate \(\delta\) is modeled via the ordinary model formula that is as \(\delta = \mu\).

    Quantile regression

    Quantile regression is implemented via family asym_laplace (asymmetric Laplace distribution) with density

    \[ f(y) = \frac{p (1 - p)}{\sigma} \exp\left(-\rho_p\left(\frac{y - \mu}{\sigma}\right)\right) \] where \(\rho_p\) is given by \(\rho_p(x) = x (p - I_{x < 0})\) and \(I_A\) is the indicator function of set \(A\). The parameter \(\sigma\) is a positive scale parameter and \(p\) is the quantile parameter taking on values in \((0, 1)\). For this distribution, we have \(P(Y < g(\eta)) = p\). Thus, quantile regression can be performed by fixing \(p\) to the quantile to interest.

    Probability models

    The density of the Beta family for \(y \in (0,1)\) is given by \[ f(y) = \frac{y^{\mu \phi - 1} (1-y)^{(1-\mu) \phi-1}}{B(\mu \phi, (1-\mu) \phi)} \] where \(B\) is the beta function and \(\phi\) is a positive precision parameter. A multivariate generalization of the Beta family is the dirichlet family with density \[ f(y) = \frac{1}{B((\mu_{1}, \ldots, \mu_{K}) \phi)} \prod_{k=1}^K y_{k}^{\mu_{k} \phi - 1}. \] The dirichlet distribution is only implemented with the multivariate logit link function so that \[ \mu_{j} = \frac{\exp(\eta_{j})}{\sum_{k = 1}^{K} \exp(\eta_{k})} \] For reasons of identifiability, \(\eta_{1}\) is set to \(0\).

    Circular models

    The density of the von_mises family for \(y \in (-\pi,\pi)\) is given by \[ f(y) = \frac{\exp(\kappa \cos(y - \mu))}{2\pi I_0(\kappa)} \] where \(I_0\) is the modified Bessel function of order 0 and \(\kappa\) is a positive precision parameter.

    Ordinal and categorical models

    For ordinal and categorical models, \(y\) is one of the categories \(1, ..., K\). The intercepts of ordinal models are called thresholds and are denoted as \(\tau_k\), with \(k \in \{1, ..., K-1\}\), whereas \(\eta\) does not contain a fixed effects intercept. Note that the applied link functions \(h\) are technically distribution functions \(\mathbb{R} \rightarrow [0,1]\). The density of the cumulative family (implementing the most basic ordinal model) is given by \[ f(y) = g(\tau_{y + 1} - \eta) - g(\tau_{y} - \eta) \]

    The densities of the sratio (stopping ratio) and cratio (continuation ratio) families are given by \[ f(y) = g(\tau_{y + 1} - \eta) \prod_{k = 1}^{y} (1 - g(\tau_{k} - \eta)) \] and \[ f(y) = (1 - g(\eta - \tau_{y + 1})) \prod_{k = 1}^{y} g(\eta - \tau_{k}) \]

    respectively. Note that both families are equivalent for symmetric link functions such as logit or probit. The density of the acat (adjacent category) family is given by \[ f(y) = \frac{\prod_{k=1}^{y} g(\eta - \tau_{k}) \prod_{k=y+1}^K(1-g(\eta - \tau_{k}))}{\sum_{k=0}^K\prod_{j=1}^k g(\eta-\tau_{j}) \prod_{j=k+1}^K(1-g(\eta - \tau_{j}))} \] For the logit link, this can be simplified to \[ f(y) = \frac{\exp \left(\sum_{k=1}^{y} (\eta - \tau_{k}) \right)} {\sum_{k=0}^K \exp\left(\sum_{j=1}^k (\eta - \tau_{j}) \right)} \] The linear predictor \(\eta\) can be generalized to also depend on the category \(k\) for a subset of predictors. This leads to category specific effects (for details on how to specify them see help(brm)). Note that cumulative and sratio models use \(\tau - \eta\), whereas cratio and acat use \(\eta - \tau\). This is done to ensure that larger values of \(\eta\) increase the probability of higher reponse categories.

    The categorical family is currently only implemented with the multivariate logit link function and has density \[ f(y) = \mu_{y} = \frac{\exp(\eta_{y})}{\sum_{k = 1}^{K} \exp(\eta_{k})} \] Note that \(\eta\) does also depend on the category \(k\). For reasons of identifiability, \(\eta_{1}\) is set to \(0\). A generalization of the categorical family to more than one trial is the multinomial family with density \[ f(y) = {N \choose y_{1}, y_{2}, \ldots, y_{K}} \prod_{k=1}^K \mu_{k}^{y_{k}} \] where, for each category, \(\mu_{k}\) is estimated via the multivariate logit link function shown above.

    Zero-inflated and hurdle models

    Zero-inflated and hurdle families extend existing families by adding special processes for responses that are zero. The densitiy of a zero-inflated family is given by \[ f_z(y) = z + (1 - z) f(0) \quad \text{if } y = 0 \\ f_z(y) = (1 - z) f(y) \quad \text{if } y > 0 \] where \(z\) denotes the zero-inflation probability. Currently implemented families are zero_inflated_poisson, zero_inflated_binomial, zero_inflated_negbinomial, and zero_inflated_beta.

    The density of a hurdle family is given by \[ f_z(y) = z \quad \text{if } y = 0 \\ f_z(y) = (1 - z) f(y) / (1 - f(0)) \quad \text{if } y > 0 \] Currently implemented families are hurdle_poisson, hurdle_negbinomial, hurdle_gamma, and hurdle_lognormal.

    The density of a zero-one-inflated family is given by \[ f_{\alpha, \gamma}(y) = \alpha (1 - \gamma) \quad \text{if } y = 0 \\ f_{\alpha, \gamma}(y) = \alpha \gamma \quad \text{if } y = 1 \\ f_{\alpha, \gamma}(y) = (1 - \alpha) f(y) \quad \text{if } y \notin \{0, 1\} \] where \(\alpha\) is the zero-one-inflation probability (i.e. the probability that zero or one occurs) and \(\gamma\) is the conditional one-inflation probability (i.e. the probability that one occurs rather than zero). Currently implemented families are zero_one_inflated_beta.

    brms/inst/doc/brms_monotonic.R0000644000176200001440000000627513623754746016145 0ustar liggesusersparams <- list(EVAL = TRUE) ## ---- SETTINGS-knitr, include=FALSE----------------------------------------------------- stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ## --------------------------------------------------------------------------------------- income_options <- c("below_20", "20_to_40", "40_to_100", "greater_100") income <- factor(sample(income_options, 100, TRUE), levels = income_options, ordered = TRUE) mean_ls <- c(30, 60, 70, 75) ls <- mean_ls[income] + rnorm(100, sd = 7) dat <- data.frame(income, ls) ## ---- results='hide'-------------------------------------------------------------------- fit1 <- brm(ls ~ mo(income), data = dat) ## --------------------------------------------------------------------------------------- summary(fit1) plot(fit1, pars = "simo") plot(conditional_effects(fit1)) ## ---- results='hide'-------------------------------------------------------------------- dat$income_num <- as.numeric(dat$income) fit2 <- brm(ls ~ income_num, data = dat) ## --------------------------------------------------------------------------------------- summary(fit2) ## ---- results='hide'-------------------------------------------------------------------- contrasts(dat$income) <- contr.treatment(4) fit3 <- brm(ls ~ income, data = dat) ## --------------------------------------------------------------------------------------- summary(fit3) ## --------------------------------------------------------------------------------------- loo(fit1, fit2, fit3) ## ---- results='hide'-------------------------------------------------------------------- prior4 <- prior(dirichlet(c(2, 1, 1)), class = "simo", coef = "moincome1") fit4 <- brm(ls ~ mo(income), data = dat, prior = prior4, sample_prior = TRUE) ## --------------------------------------------------------------------------------------- summary(fit4) ## --------------------------------------------------------------------------------------- plot(fit4, pars = "prior_simo", N = 3) ## --------------------------------------------------------------------------------------- dat$age <- rnorm(100, mean = 40, sd = 10) ## ---- results='hide'-------------------------------------------------------------------- fit5 <- brm(ls ~ mo(income)*age, data = dat) ## --------------------------------------------------------------------------------------- summary(fit5) conditional_effects(fit5, "income:age") ## --------------------------------------------------------------------------------------- dat$city <- rep(1:10, each = 10) var_city <- rnorm(10, sd = 10) dat$ls <- dat$ls + var_city[dat$city] ## ---- results='hide'-------------------------------------------------------------------- fit6 <- brm(ls ~ mo(income)*age + (mo(income) | city), data = dat) ## --------------------------------------------------------------------------------------- summary(fit6) brms/inst/doc/brms_multivariate.Rmd0000644000176200001440000002027213606326627017152 0ustar liggesusers--- title: "Estimating Multivariate Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Multivariate Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction In the present vignette, we want to discuss how to specify multivariate multilevel models using **brms**. We call a model *multivariate* if it contains multiple response variables, each being predicted by its own set of predictors. Consider an example from biology. Hadfield, Nutall, Osorio, and Owens (2007) analyzed data of the Eurasian blue tit (https://en.wikipedia.org/wiki/Eurasian_blue_tit). They predicted the `tarsus` length as well as the `back` color of chicks. Half of the brood were put into another `fosternest`, while the other half stayed in the fosternest of their own `dam`. This allows to separate genetic from environmental factors. Additionally, we have information about the `hatchdate` and `sex` of the chicks (the latter being known for 94\% of the animals). ```{r data} data("BTdata", package = "MCMCglmm") head(BTdata) ``` ## Basic Multivariate Models We begin with a relatively simple multivariate normal model. ```{r fit1, message=FALSE, warning=FALSE, results='hide'} fit1 <- brm( mvbind(tarsus, back) ~ sex + hatchdate + (1|p|fosternest) + (1|q|dam), data = BTdata, chains = 2, cores = 2 ) ``` As can be seen in the model code, we have used `mvbind` notation to tell **brms** that both `tarsus` and `back` are separate response variables. The term `(1|p|fosternest)` indicates a varying intercept over `fosternest`. By writing `|p|` in between we indicate that all varying effects of `fosternest` should be modeled as correlated. This makes sense since we actually have two model parts, one for `tarsus` and one for `back`. The indicator `p` is arbitrary and can be replaced by other symbols that comes into your mind (for details about the multilevel syntax of **brms**, see `help("brmsformula")` and `vignette("brms_multilevel")`). Similarily, the term `(1|q|dam)` indicates correlated varying effects of the genetic mother of the chicks. Alternatively, we could have also modeled the genetic similarities through pedigrees and corresponding relatedness matrices, but this is not the focus of this vignette (please see `vignette("brms_phylogenetics")`). The model results are readily summarized via ```{r summary1, warning=FALSE} fit1 <- add_criterion(fit1, "loo") summary(fit1) ``` The summary output of multivariate models closely resembles those of univariate models, except that the parameters now have the corresponding response variable as prefix. Within dams, tarsus length and back color seem to be negatively correlated, while within fosternests the opposite is true. This indicates differential effects of genetic and environmental factors on these two characteristics. Further, the small residual correlation `rescor(tarsus, back)` on the bottom of the output indicates that there is little unmodeled dependency between tarsus length and back color. Although not necessary at this point, we have already computed and stored the LOO information criterion of `fit1`, which we will use for model comparions. Next, let's take a look at some posterior-predictive checks, which give us a first impression of the model fit. ```{r pp_check1, message=FALSE} pp_check(fit1, resp = "tarsus") pp_check(fit1, resp = "back") ``` This looks pretty solid, but we notice a slight unmodeled left skewness in the distribution of `tarsus`. We will come back to this later on. Next, we want to investigate how much variation in the response variables can be explained by our model and we use a Bayesian generalization of the $R^2$ coefficient. ```{r R2_1} bayes_R2(fit1) ``` Clearly, there is much variation in both animal characteristics that we can not explain, but apparently we can explain more of the variation in tarsus length than in back color. ## More Complex Multivariate Models Now, suppose we only want to control for `sex` in `tarsus` but not in `back` and vice versa for `hatchdate`. Not that this is particular reasonable for the present example, but it allows us to illustrate how to specify different formulas for different response variables. We can no longer use `mvbind` syntax and so we have to use a more verbose approach: ```{r fit2, message=FALSE, warning=FALSE, results='hide'} bf_tarsus <- bf(tarsus ~ sex + (1|p|fosternest) + (1|q|dam)) bf_back <- bf(back ~ hatchdate + (1|p|fosternest) + (1|q|dam)) fit2 <- brm(bf_tarsus + bf_back, data = BTdata, chains = 2, cores = 2) ``` Note that we have literally *added* the two model parts via the `+` operator, which is in this case equivalent to writing `mvbf(bf_tarsus, bf_back)`. See `help("brmsformula")` and `help("mvbrmsformula")` for more details about this syntax. Again, we summarize the model first. ```{r summary2, warning=FALSE} fit2 <- add_criterion(fit2, "loo") summary(fit2) ``` Let's find out, how model fit changed due to excluding certain effects from the initial model: ```{r loo12} loo(fit1, fit2) ``` Apparently, there is no noteworthy difference in the model fit. Accordingly, we do not really need to model `sex` and `hatchdate` for both response variables, but there is also no harm in including them (so I would probably just include them). To give you a glimpse of the capabilities of **brms**' multivariate syntax, we change our model in various directions at the same time. Remember the slight left skewness of `tarsus`, which we will now model by using the `skew_normal` family instead of the `gaussian` family. Since we do not have a multivariate normal (or student-t) model, anymore, estimating residual correlations is no longer possible. We make this explicit using the `set_rescor` function. Further, we investigate if the relationship of `back` and `hatchdate` is really linear as previously assumed by fitting a non-linear spline of `hatchdate`. On top of it, we model separate residual variances of `tarsus` for males and femals chicks. ```{r fit3, message=FALSE, warning=FALSE, results='hide'} bf_tarsus <- bf(tarsus ~ sex + (1|p|fosternest) + (1|q|dam)) + lf(sigma ~ 0 + sex) + skew_normal() bf_back <- bf(back ~ s(hatchdate) + (1|p|fosternest) + (1|q|dam)) + gaussian() fit3 <- brm( bf_tarsus + bf_back + set_rescor(FALSE), data = BTdata, chains = 2, cores = 2, control = list(adapt_delta = 0.95) ) ``` Again, we summarize the model and look at some posterior-predictive checks. ```{r summary3, warning=FALSE} fit3 <- add_criterion(fit3, "loo") summary(fit3) ``` We see that the (log) residual standard deviation of `tarsus` is somewhat larger for chicks whose sex could not be identified as compared to male or female chicks. Further, we see from the negative `alpha` (skewness) parameter of `tarsus` that the residuals are indeed slightly left-skewed. Lastly, running ```{r me3} conditional_effects(fit3, "hatchdate", resp = "back") ``` reveals a non-linear relationship of `hatchdate` on the `back` color, which seems to change in waves over the course of the hatch dates. There are many more modeling options for multivariate models, which are not discussed in this vignette. Examples include autocorrelation structures, Gaussian processes, or explicit non-linear predictors (e.g., see `help("brmsformula")` or `vignette("brms_multilevel")`). In fact, nearly all the flexibility of univariate models is retained in multivariate models. ## References Hadfield JD, Nutall A, Osorio D, Owens IPF (2007). Testing the phenotypic gambit: phenotypic, genetic and environmental correlations of colour. *Journal of Evolutionary Biology*, 20(2), 549-557. brms/inst/doc/brms_phylogenetics.Rmd0000644000176200001440000002751213606326627017325 0ustar liggesusers--- title: "Estimating Phylogenetic Multilevel Models with brms" author: "Paul Bürkner" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Estimating Phylogenetic Multilevel Models with brms} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} params: EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true") --- ```{r, SETTINGS-knitr, include=FALSE} stopifnot(require(knitr)) options(width = 90) opts_chunk$set( comment = NA, message = FALSE, warning = FALSE, eval = if (isTRUE(exists("params"))) params$EVAL else FALSE, dev = "png", dpi = 150, fig.asp = 0.8, fig.width = 5, out.width = "60%", fig.align = "center" ) library(brms) ggplot2::theme_set(theme_default()) ``` ## Introduction In the present vignette, we want to discuss how to specify phylogenetic multilevel models using **brms**. These models are relevant in evolutionary biology when data of many species are analyzed at the same time. The usual approach would be to model species as a grouping factor in a multilevel model and estimate varying intercepts (and possibly also varying slopes) over species. However, species are not independent as they come from the same phylogenetic tree and we thus have to adjust our model to incorporate this dependency. The examples discussed here are from chapter 11 of the book *Modern Phylogenetic Comparative Methods and the application in Evolutionary Biology* (de Villemeruil & Nakagawa, 2014). The necessary data can be downloaded from the corresponding website (http://www.mpcm-evolution.com/). Some of these models may take a few minutes to fit. ## A Simple Phylogenetic Model Assume we have measurements of a phenotype, `phen` (say the body size), and a `cofactor` variable (say the temperature of the environment). We prepare the data using the following code. ```{r} phylo <- ape::read.nexus("https://paul-buerkner.github.io/data/phylo.nex") data_simple <- read.table( "https://paul-buerkner.github.io/data/data_simple.txt", header = TRUE ) head(data_simple) ``` The `phylo` object contains information on the relationship between species. Using this information, we can construct a covariance matrix of species (Hadfield & Nakagawa, 2010). ```{r} A <- ape::vcv.phylo(phylo) ``` Now we are ready to fit our first phylogenetic multilevel model: ```{r, results='hide'} model_simple <- brm( phen ~ cofactor + (1|phylo), data = data_simple, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0, 10), "b"), prior(normal(0, 50), "Intercept"), prior(student_t(3, 0, 20), "sd"), prior(student_t(3, 0, 20), "sigma") ) ) ``` With the exception of `cov_ranef = list(phylo = A)` this is a basic multilevel model with a varying intercept over species (`phylo` is an indicator of species in this data set). However, by using the `cov_ranef` argument, we make sure that species are correlated as specified by the covariance matrix `A`. Setting priors is not required for achieving good convergence for this model, but it improves sampling speed a bit. After fitting, the results can be investigated in detail. ```{r} summary(model_simple) plot(model_simple, N = 2, ask = FALSE) plot(conditional_effects(model_simple), points = TRUE) ``` The so called phylogenetic signal (often symbolize by $\lambda$) can be computed with the `hypothesis` method and is roughly $\lambda = 0.7$ for this example. ```{r} hyp <- "sd_phylo__Intercept^2 / (sd_phylo__Intercept^2 + sigma^2) = 0" (hyp <- hypothesis(model_simple, hyp, class = NULL)) plot(hyp) ``` Note that the phylogenetic signal is just a synonym of the intra-class correlation (ICC) used in the context phylogenetic analysis. ## A Phylogenetic Model with Repeated Measurements Often, we have multiple observations per species and this allows to fit more complicated phylogenetic models. ```{r} data_repeat <- read.table( "https://paul-buerkner.github.io/data/data_repeat.txt", header = TRUE ) data_repeat$spec_mean_cf <- with(data_repeat, sapply(split(cofactor, phylo), mean)[phylo]) head(data_repeat) ``` The variable `spec_mean_cf` just contains the mean of the cofactor for each species. The code for the repeated measurement phylogenetic model looks as follows: ```{r, results='hide'} model_repeat1 <- brm( phen ~ spec_mean_cf + (1|phylo) + (1|species), data = data_repeat, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0,10), "b"), prior(normal(0,50), "Intercept"), prior(student_t(3,0,20), "sd"), prior(student_t(3,0,20), "sigma") ), sample_prior = TRUE, chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ``` The variables `phylo` and `species` are identical as they are both identifiers of the species. However, we model the phylogenetic covariance only for `phylo` and thus the `species` variable accounts for any specific effect that would be independent of the phylogenetic relationship between species (e.g., environmental or niche effects). Again we can obtain model summaries as well as estimates of the phylogenetic signal. ```{r} summary(model_repeat1) ``` ```{r} hyp <- paste( "sd_phylo__Intercept^2 /", "(sd_phylo__Intercept^2 + sd_species__Intercept^2 + sigma^2) = 0" ) (hyp <- hypothesis(model_repeat1, hyp, class = NULL)) plot(hyp) ``` So far, we have completely ignored the variability of the cofactor within species. To incorporate this into the model, we define ```{r} data_repeat$within_spec_cf <- data_repeat$cofactor - data_repeat$spec_mean_cf ``` and then fit it again using `within_spec_cf` as an additional predictor. ```{r, results='hide'} model_repeat2 <- update( model_repeat1, formula = ~ . + within_spec_cf, newdata = data_repeat, chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ``` The results are almost unchanged, with apparently no relationship between the phenotype and the within species variance of `cofactor`. ```{r} summary(model_repeat2) ``` Also, the phylogenetic signal remains more or less the same. ```{r} hyp <- paste( "sd_phylo__Intercept^2 /", "(sd_phylo__Intercept^2 + sd_species__Intercept^2 + sigma^2) = 0" ) (hyp <- hypothesis(model_repeat2, hyp, class = NULL)) ``` ## A Phylogenetic Meta-Analysis Let's say we have Fisher's z-transformated correlation coefficients $Zr$ per species along with corresponding sample sizes (e.g., correlations between male coloration and reproductive success): ```{r} data_fisher <- read.table( "https://paul-buerkner.github.io/data/data_effect.txt", header = TRUE ) data_fisher$obs <- 1:nrow(data_fisher) head(data_fisher) ``` We assume the sampling variance to be known and as $V(Zr) = \frac{1}{N - 3}$ for Fisher's values, where $N$ is the sample size per species. Incorporating the known sampling variance into the model is straight forward. One has to keep in mind though, that **brms** requires the sampling standard deviation (square root of the variance) as input instead of the variance itself. The group-level effect of `obs` represents the residual variance, which we have to model explicitly in a meta-analytic model. ```{r, results='hide'} model_fisher <- brm( Zr | se(sqrt(1 / (N - 3))) ~ 1 + (1|phylo) + (1|obs), data = data_fisher, family = gaussian(), cov_ranef = list(phylo = A), prior = c( prior(normal(0, 10), "Intercept"), prior(student_t(3, 0, 10), "sd") ), control = list(adapt_delta = 0.95), chains = 2, cores = 2, iter = 4000, warmup = 1000 ) ``` A summary of the fitted model is obtained via ```{r} summary(model_fisher) plot(model_fisher) ``` The meta-analytic mean (i.e., the model intercept) is $0.16$ with a credible interval of $[0.08, 0.25]$. Thus the mean correlation across species is positive according to the model. ## A phylogenetic count-data model Suppose that we analyze a phenotype that consists of counts instead of being a continuous variable. In such a case, the normality assumption will likely not be justified and it is recommended to use a distribution explicitely suited for count data, for instance the Poisson distribution. The following data set (again retrieved from mpcm-evolution.org) provides an example. ```{r} data_pois <- read.table( "https://paul-buerkner.github.io/data/data_pois.txt", header = TRUE ) data_pois$obs <- 1:nrow(data_pois) head(data_pois) ``` As the poisson distribution does not have a natural overdispersion parameter, we model the residual variance via the group-level effects of `obs` (e.g., see Lawless, 1987). ```{r, results='hide'} model_pois <- brm( phen_pois ~ cofactor + (1|phylo) + (1|obs), data = data_pois, family = poisson("log"), cov_ranef = list(phylo = A), chains = 2, cores = 2, iter = 4000, control = list(adapt_delta = 0.95) ) ``` Again, we obtain a summary of the fitted model via ```{r} summary(model_pois) plot(conditional_effects(model_pois), points = TRUE) ``` Now, assume we ignore the fact that the phenotype is count data and fit a linear normal model instead. ```{r, results='hide'} model_normal <- brm( phen_pois ~ cofactor + (1|phylo), data = data_pois, family = gaussian(), cov_ranef = list(phylo = A), chains = 2, cores = 2, iter = 4000, control = list(adapt_delta = 0.95) ) ``` ```{r} summary(model_normal) ``` We see that `cofactor` has a positive relationship with the phenotype in both models. One should keep in mind, though, that the estimates of the Poisson model are on the log-scale, as we applied the canonical log-link function in this example. Therefore, estimates are not comparable to a linear normal model even if applied to the same data. What we can compare, however, is the model fit, for instance graphically via posterior predictive checks. ```{r} pp_check(model_pois) pp_check(model_normal) ``` Apparently, the distribution of the phenotype predicted by the Poisson model resembles the original distribution of the phenotype pretty closely, while the normal models fails to do so. We can also apply leave-one-out cross-validation for direct numerical comparison of model fit. ```{r} loo(model_pois, model_normal) ``` Since smaller values of loo indicate better fit, it is again evident that the Poisson model fits the data better than the normal model. Of course, the Poisson model is not the only reasonable option here. For instance, you could use a negative binomial model (via family `negative_binomial`), which already contains an overdispersion parameter so that modeling a varying intercept of `obs` becomes obsolete. ## Phylogenetic models with multiple group-level effects In the above examples, we have only used a single group-level effect (i.e., a varying intercept) for the phylogenetic grouping factors. In **brms**, it is also possible to estimate multiple group-level effects (e.g., a varying intercept and a varying slope) for these grouping factors. However, it requires repeatedly computing Kronecker products of covariance matrices while fitting the model. This will be very slow especially when the grouping factors have many levels and matrices are thus large. ## References de Villemeruil P. & Nakagawa, S. (2014) General quantitative genetic methods for comparative biology. In: *Modern phylogenetic comparative methods and their application in evolutionary biology: concepts and practice* (ed. Garamszegi L.) Springer, New York. pp. 287-303. Hadfield, J. D. & Nakagawa, S. (2010) General quantitative genetic methods for comparative biology: phylogenies, taxonomies, and multi-trait models for continuous and categorical characters. *Journal of Evolutionary Biology*. 23. 494-508. Lawless, J. F. (1987). Negative binomial and mixed Poisson regression. *Canadian Journal of Statistics*, 15(3), 209-225. brms/inst/doc/brms_missings.html0000644000176200001440000027760313623754175016540 0ustar liggesusers Handle Missing Values with brms

    Handle Missing Values with brms

    Paul Bürkner

    2020-02-21

    Introduction

    Many real world data sets contain missing values for various reasons. Generally, we have quite a few options to handle those missing values. The easiest solution is to remove all rows from the data set, where one or more variables are missing. However, if values are not missing completely at random, this will likely lead to bias in our analysis. Accordingly, we usually want to impute missing values in one way or the other. Here, we will consider two very general approaches using brms: (1) Impute missing values before the model fitting with multiple imputation, and (2) impute missing values on the fly during model fitting1. As a simple example, we will use the nhanes data set, which contains information on participants’ age, bmi (body mass index), hyp (hypertensive), and chl (total serum cholesterol). For the purpose of the present vignette, we are primarily interested in predicting bmi by age and chl.

      age  bmi hyp chl
    1   1   NA  NA  NA
    2   2 22.7   1 187
    3   1   NA   1 187
    4   3   NA  NA  NA
    5   1 20.4   1 113
    6   3   NA  NA 184

    Imputation before model fitting

    There are many approaches allowing us to impute missing data before the actual model fitting takes place. From a statistical perspective, multiple imputation is one of the best solutions. Each missing value is not imputed once but m times leading to a total of m fully imputed data sets. The model can then be fitted to each of those data sets separately and results are pooled across models, afterwards. One widely applied package for multiple imputation is mice (Buuren & Groothuis-Oudshoorn, 2010) and we will use it in the following in combination with brms. Here, we apply the default settings of mice, which means that all variables will be used to impute missing values in all other variables and imputation functions automatically chosen based on the variables’ characteristics.

    Now, we have m = 5 imputed data sets stored within the imp object. In practice, we will likely need more than 5 of those to accurately account for the uncertainty induced by the missingness, perhaps even in the area of 100 imputed data sets (Zhou & Reiter, 2010). Of course, this increases the computational burden by a lot and so we stick to m = 5 for the purpose of this vignette. Regardless of the value of m, we can either extract those data sets and then pass them to the actual model fitting function as a list of data frames, or pass imp directly. The latter works because brms offers special support for data imputed by mice. We will go with the latter approach, since it is less typing. Fitting our model of interest with brms to the multiple imputed data sets is straightforward.

    The returned fitted model is an ordinary brmsfit object containing the posterior samples of all m submodels. While pooling across models is not necessarily straightforward in classical statistics, it is trivial in a Bayesian framework. Here, pooling results of multiple imputed data sets is simply achieved by combining the posterior samples of the submodels. Accordingly, all post-processing methods can be used out of the box without having to worry about pooling at all.

     Family: gaussian 
      Links: mu = identity; sigma = identity 
    Formula: bmi ~ age * chl 
       Data: imp (Number of observations: 25) 
    Samples: 10 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 10000
    
    Population-Level Effects: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    Intercept    15.60      8.57    -0.80    33.18 1.05      125     3012
    age           0.58      4.92    -9.27    10.05 1.02     1268     3116
    chl           0.09      0.05    -0.00     0.18 1.09       69      945
    age:chl      -0.02      0.02    -0.07     0.03 1.03      300     2756
    
    Family Specific Parameters: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma     3.52      0.64     2.49     4.96 1.12       55      142
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    In the summary output, we notice that some Rhat values are higher than \(1.1\) indicating possible convergence problems. For models based on multiple imputed data sets, this is often a false positive: Chains of different submodels may not overlay each other exactly, since there were fitted to different data. We can see the chains on the right-hand side of

    Such non-overlaying chains imply high Rhat values without there actually being any convergence issue. Accordingly, we have to investigate the convergence of the submodels separately, which we can do by looking at

      b_Intercept b_age b_chl b_age.chl sigma lp__
    1        1.00  1.00  1.00      1.00     1    1
    2        1.01  1.01  1.01      1.01     1    1
    3        1.00  1.00  1.00      1.00     1    1
    4        1.00  1.00  1.00      1.00     1    1
    5        1.00  1.00  1.00      1.00     1    1

    The convergence of each of the submodels looks good. Accordingly, we can proceed with further post-processing and interpretation of the results. For instance, we could investigate the combined effect of age and chl.

    To summarize, the advantages of multiple imputation are obvious: One can apply it to all kinds of models, since model fitting functions do not need to know that the data sets were imputed, beforehand. Also, we do not need to worry about pooling across submodels when using fully Bayesian methods. The only drawback is the amount of time required for model fitting. Estimating Bayesian models is already quite slow with just a single data set and it only gets worse when working with multiple imputation.

    Compatibility with other multiple imputation packages

    brms offers built-in support for mice mainly because I use the latter in some of my own research projects. Nevertheless, brm_multiple supports all kinds of multiple imputation packages as it also accepts a list of data frames as input for its data argument. Thus, you just need to extract the imputed data frames in the form of a list, which can then be passed to brm_multiple. Most multiple imputation packages have some built-in functionality for this task. When using the mi package, for instance, you simply need to call the mi::complete function to get the desired output.

    Imputation during model fitting

    Imputation during model fitting is generally thought to be more complex than imputation before model fitting, because one has to take care of everything within one step. This remains true when imputing missing values with brms, but possibly to a somewhat smaller degree. Consider again the nhanes data with the goal to predict bmi by age, and chl. Since age contains no missing values, we only have to take special care of bmi and chl. We need to tell the model two things. (1) Which variables contain missing values and how they should be predicted, as well as (2) which of these imputed variables should be used as predictors. In brms we can do this as follows:

    The model has become multivariate, as we no longer only predict bmi but also chl (see vignette("brms_multivariate") for details about the multivariate syntax of brms). We ensure that missings in both variables will be modeled rather than excluded by adding | mi() on the left-hand side of the formulas2. We write mi(chl) on the right-hand side of the formula for bmi to ensure that the estimated missing values of chl will be used in the prediction of bmi. The summary is a bit more cluttered as we get coefficients for both response variables, but apart from that we can interpret coefficients in the usual way.

     Family: MV(gaussian, gaussian) 
      Links: mu = identity; sigma = identity
             mu = identity; sigma = identity 
    Formula: bmi | mi() ~ age * mi(chl) 
             chl | mi() ~ age 
       Data: nhanes (Number of observations: 25) 
    Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 4000
    
    Population-Level Effects: 
                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    bmi_Intercept    13.50      8.78    -3.31    31.52 1.00     1489     1714
    chl_Intercept   141.09     24.71    92.52   190.06 1.00     2542     2517
    bmi_age           1.28      5.52    -9.70    11.80 1.00     1325     1459
    chl_age          29.07     13.21     2.66    55.13 1.00     2481     2661
    bmi_michl         0.10      0.05     0.01     0.19 1.00     1675     1986
    bmi_michl:age    -0.03      0.02    -0.07     0.02 1.01     1369     1745
    
    Family Specific Parameters: 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma_bmi     3.30      0.79     2.15     5.18 1.00     1486     1691
    sigma_chl    40.32      7.35    28.83    57.17 1.00     2361     2426
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    The results look pretty similar to those obtained from multiple imputation, but be aware that this may not be generally the case. In multiple imputation, the default is to impute all variables based on all other variables, while in the ‘one-step’ approach, we have to explictly specify the variables used in the imputation. Thus, arguably, multiple imputation is easier to apply. An obvious advantage of the ‘one-step’ approach is that the model needs to be fitted only once instead of m times. Also, within the brms framework, we can use multilevel structure and complex non-linear relationships for the imputation of missing values, which is not achieved as easily in standard multiple imputation software. On the downside, it is currently not possible to impute discrete variables, because Stan (the engine behind brms) does not allow estimating discrete parameters.

    References

    Buuren, S. V. & Groothuis-Oudshoorn, K. (2010). mice: Multivariate imputation by chained equations in R. Journal of Statistical Software, 1-68. doi.org/10.18637/jss.v045.i03

    Zhou, X. & Reiter, J. P. (2010). A Note on Bayesian Inference After Multiple Imputation. The American Statistician, 64(2), 159-163. doi.org/10.1198/tast.2010.09109


    1. Actually, there is a third approach that only applies to missings in response variables. If we want to impute missing responses, we just fit the model using the observed responses and than impute the missings after fitting the model by means of posterior prediction. That is, we supply the predictor values corresponding to missing responses to the predict method.

    2. We don’t really need this for bmi, since bmi is not used as a predictor for another variable. Accordingly, we could also – and equivalently – impute missing values of bmi after model fitting by means of posterior prediction.

    brms/inst/doc/brms_multivariate.html0000644000176200001440000021472413623756366017411 0ustar liggesusers Estimating Multivariate Models with brms

    Estimating Multivariate Models with brms

    Paul Bürkner

    2020-02-21

    Introduction

    In the present vignette, we want to discuss how to specify multivariate multilevel models using brms. We call a model multivariate if it contains multiple response variables, each being predicted by its own set of predictors. Consider an example from biology. Hadfield, Nutall, Osorio, and Owens (2007) analyzed data of the Eurasian blue tit (https://en.wikipedia.org/wiki/Eurasian_blue_tit). They predicted the tarsus length as well as the back color of chicks. Half of the brood were put into another fosternest, while the other half stayed in the fosternest of their own dam. This allows to separate genetic from environmental factors. Additionally, we have information about the hatchdate and sex of the chicks (the latter being known for 94% of the animals).

           tarsus       back  animal     dam fosternest  hatchdate  sex
    1 -1.89229718  1.1464212 R187142 R187557      F2102 -0.6874021  Fem
    2  1.13610981 -0.7596521 R187154 R187559      F1902 -0.6874021 Male
    3  0.98468946  0.1449373 R187341 R187568       A602 -0.4279814 Male
    4  0.37900806  0.2555847 R046169 R187518      A1302 -1.4656641 Male
    5 -0.07525299 -0.3006992 R046161 R187528      A2602 -1.4656641  Fem
    6 -1.13519543  1.5577219 R187409 R187945      C2302  0.3502805  Fem

    Basic Multivariate Models

    We begin with a relatively simple multivariate normal model.

    As can be seen in the model code, we have used mvbind notation to tell brms that both tarsus and back are separate response variables. The term (1|p|fosternest) indicates a varying intercept over fosternest. By writing |p| in between we indicate that all varying effects of fosternest should be modeled as correlated. This makes sense since we actually have two model parts, one for tarsus and one for back. The indicator p is arbitrary and can be replaced by other symbols that comes into your mind (for details about the multilevel syntax of brms, see help("brmsformula") and vignette("brms_multilevel")). Similarily, the term (1|q|dam) indicates correlated varying effects of the genetic mother of the chicks. Alternatively, we could have also modeled the genetic similarities through pedigrees and corresponding relatedness matrices, but this is not the focus of this vignette (please see vignette("brms_phylogenetics")). The model results are readily summarized via

     Family: MV(gaussian, gaussian) 
      Links: mu = identity; sigma = identity
             mu = identity; sigma = identity 
    Formula: tarsus ~ sex + hatchdate + (1 | p | fosternest) + (1 | q | dam) 
             back ~ sex + hatchdate + (1 | p | fosternest) + (1 | q | dam) 
       Data: BTdata (Number of observations: 828) 
    Samples: 2 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 2000
    
    Group-Level Effects: 
    ~dam (Number of levels: 106) 
                                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS
    sd(tarsus_Intercept)                     0.49      0.05     0.39     0.60 1.00      719
    sd(back_Intercept)                       0.25      0.07     0.10     0.39 1.01      243
    cor(tarsus_Intercept,back_Intercept)    -0.52      0.23    -0.95    -0.04 1.01      311
                                         Tail_ESS
    sd(tarsus_Intercept)                     1066
    sd(back_Intercept)                        537
    cor(tarsus_Intercept,back_Intercept)      304
    
    ~fosternest (Number of levels: 104) 
                                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS
    sd(tarsus_Intercept)                     0.27      0.05     0.17     0.37 1.01      487
    sd(back_Intercept)                       0.35      0.06     0.23     0.46 1.01      357
    cor(tarsus_Intercept,back_Intercept)     0.71      0.21     0.25     0.99 1.02      135
                                         Tail_ESS
    sd(tarsus_Intercept)                      664
    sd(back_Intercept)                        756
    cor(tarsus_Intercept,back_Intercept)      328
    
    Population-Level Effects: 
                     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    tarsus_Intercept    -0.41      0.07    -0.54    -0.27 1.00     1070     1390
    back_Intercept      -0.01      0.07    -0.14     0.12 1.00     1495     1376
    tarsus_sexMale       0.77      0.06     0.66     0.88 1.00     2241     1366
    tarsus_sexUNK        0.23      0.13    -0.03     0.49 1.00     2491     1218
    tarsus_hatchdate    -0.04      0.06    -0.15     0.07 1.00      725      903
    back_sexMale         0.01      0.07    -0.13     0.14 1.00     3309     1434
    back_sexUNK          0.14      0.15    -0.13     0.44 1.00     2010     1582
    back_hatchdate      -0.09      0.05    -0.20     0.01 1.00     1046     1515
    
    Family Specific Parameters: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma_tarsus     0.76      0.02     0.72     0.80 1.00     2177     1501
    sigma_back       0.90      0.02     0.86     0.95 1.00     2103     1559
    
    Residual Correlations: 
                        Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    rescor(tarsus,back)    -0.05      0.04    -0.12     0.02 1.00     1954     1513
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    The summary output of multivariate models closely resembles those of univariate models, except that the parameters now have the corresponding response variable as prefix. Within dams, tarsus length and back color seem to be negatively correlated, while within fosternests the opposite is true. This indicates differential effects of genetic and environmental factors on these two characteristics. Further, the small residual correlation rescor(tarsus, back) on the bottom of the output indicates that there is little unmodeled dependency between tarsus length and back color. Although not necessary at this point, we have already computed and stored the LOO information criterion of fit1, which we will use for model comparions. Next, let’s take a look at some posterior-predictive checks, which give us a first impression of the model fit.

    This looks pretty solid, but we notice a slight unmodeled left skewness in the distribution of tarsus. We will come back to this later on. Next, we want to investigate how much variation in the response variables can be explained by our model and we use a Bayesian generalization of the \(R^2\) coefficient.

              Estimate  Est.Error      Q2.5     Q97.5
    R2tarsus 0.4344939 0.02346996 0.3882848 0.4776280
    R2back   0.1996353 0.02724460 0.1465235 0.2531614

    Clearly, there is much variation in both animal characteristics that we can not explain, but apparently we can explain more of the variation in tarsus length than in back color.

    More Complex Multivariate Models

    Now, suppose we only want to control for sex in tarsus but not in back and vice versa for hatchdate. Not that this is particular reasonable for the present example, but it allows us to illustrate how to specify different formulas for different response variables. We can no longer use mvbind syntax and so we have to use a more verbose approach:

    Note that we have literally added the two model parts via the + operator, which is in this case equivalent to writing mvbf(bf_tarsus, bf_back). See help("brmsformula") and help("mvbrmsformula") for more details about this syntax. Again, we summarize the model first.

     Family: MV(gaussian, gaussian) 
      Links: mu = identity; sigma = identity
             mu = identity; sigma = identity 
    Formula: tarsus ~ sex + (1 | p | fosternest) + (1 | q | dam) 
             back ~ hatchdate + (1 | p | fosternest) + (1 | q | dam) 
       Data: BTdata (Number of observations: 828) 
    Samples: 2 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 2000
    
    Group-Level Effects: 
    ~dam (Number of levels: 106) 
                                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS
    sd(tarsus_Intercept)                     0.48      0.05     0.39     0.59 1.01      881
    sd(back_Intercept)                       0.25      0.07     0.11     0.39 1.00      237
    cor(tarsus_Intercept,back_Intercept)    -0.50      0.22    -0.94    -0.06 1.00      496
                                         Tail_ESS
    sd(tarsus_Intercept)                     1060
    sd(back_Intercept)                        823
    cor(tarsus_Intercept,back_Intercept)      460
    
    ~fosternest (Number of levels: 104) 
                                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS
    sd(tarsus_Intercept)                     0.27      0.05     0.16     0.38 1.00      747
    sd(back_Intercept)                       0.35      0.06     0.23     0.46 1.00      437
    cor(tarsus_Intercept,back_Intercept)     0.68      0.20     0.24     0.97 1.00      311
                                         Tail_ESS
    sd(tarsus_Intercept)                     1023
    sd(back_Intercept)                       1247
    cor(tarsus_Intercept,back_Intercept)      737
    
    Population-Level Effects: 
                     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    tarsus_Intercept    -0.41      0.07    -0.55    -0.28 1.00     1441     1365
    back_Intercept       0.00      0.05    -0.10     0.10 1.00     1937     1650
    tarsus_sexMale       0.77      0.06     0.66     0.88 1.01     3238     1729
    tarsus_sexUNK        0.23      0.13    -0.03     0.47 1.00     2806     1794
    back_hatchdate      -0.08      0.05    -0.18     0.01 1.00     2208     1659
    
    Family Specific Parameters: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma_tarsus     0.76      0.02     0.72     0.80 1.00     2452     1508
    sigma_back       0.90      0.03     0.85     0.95 1.00     2744     1480
    
    Residual Correlations: 
                        Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    rescor(tarsus,back)    -0.05      0.04    -0.13     0.02 1.00     3066     1229
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    Let’s find out, how model fit changed due to excluding certain effects from the initial model:

    Output of model 'fit1':
    
    Computed from 2000 by 828 log-likelihood matrix
    
             Estimate   SE
    elpd_loo  -2126.9 33.8
    p_loo       176.8  7.7
    looic      4253.8 67.5
    ------
    Monte Carlo SE of elpd_loo is NA.
    
    Pareto k diagnostic values:
                             Count Pct.    Min. n_eff
    (-Inf, 0.5]   (good)     812   98.1%   156       
     (0.5, 0.7]   (ok)        14    1.7%   96        
       (0.7, 1]   (bad)        2    0.2%   24        
       (1, Inf)   (very bad)   0    0.0%   <NA>      
    See help('pareto-k-diagnostic') for details.
    
    Output of model 'fit2':
    
    Computed from 2000 by 828 log-likelihood matrix
    
             Estimate   SE
    elpd_loo  -2123.9 33.6
    p_loo       173.7  7.3
    looic      4247.9 67.1
    ------
    Monte Carlo SE of elpd_loo is NA.
    
    Pareto k diagnostic values:
                             Count Pct.    Min. n_eff
    (-Inf, 0.5]   (good)     818   98.8%   123       
     (0.5, 0.7]   (ok)         9    1.1%   78        
       (0.7, 1]   (bad)        1    0.1%   185       
       (1, Inf)   (very bad)   0    0.0%   <NA>      
    See help('pareto-k-diagnostic') for details.
    
    Model comparisons:
         elpd_diff se_diff
    fit2  0.0       0.0   
    fit1 -3.0       1.3   

    Apparently, there is no noteworthy difference in the model fit. Accordingly, we do not really need to model sex and hatchdate for both response variables, but there is also no harm in including them (so I would probably just include them).

    To give you a glimpse of the capabilities of brms’ multivariate syntax, we change our model in various directions at the same time. Remember the slight left skewness of tarsus, which we will now model by using the skew_normal family instead of the gaussian family. Since we do not have a multivariate normal (or student-t) model, anymore, estimating residual correlations is no longer possible. We make this explicit using the set_rescor function. Further, we investigate if the relationship of back and hatchdate is really linear as previously assumed by fitting a non-linear spline of hatchdate. On top of it, we model separate residual variances of tarsus for males and femals chicks.

    Again, we summarize the model and look at some posterior-predictive checks.

     Family: MV(skew_normal, gaussian) 
      Links: mu = identity; sigma = log; alpha = identity
             mu = identity; sigma = identity 
    Formula: tarsus ~ sex + (1 | p | fosternest) + (1 | q | dam) 
             sigma ~ 0 + sex
             back ~ s(hatchdate) + (1 | p | fosternest) + (1 | q | dam) 
       Data: BTdata (Number of observations: 828) 
    Samples: 2 chains, each with iter = 2000; warmup = 1000; thin = 1;
             total post-warmup samples = 2000
    
    Smooth Terms: 
                           Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sds(back_shatchdate_1)     2.56      1.49     0.43     5.86 1.01      262      341
    
    Group-Level Effects: 
    ~dam (Number of levels: 106) 
                                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS
    sd(tarsus_Intercept)                     0.47      0.05     0.38     0.58 1.00      572
    sd(back_Intercept)                       0.23      0.07     0.09     0.36 1.00      289
    cor(tarsus_Intercept,back_Intercept)    -0.54      0.23    -0.96    -0.08 1.01      378
                                         Tail_ESS
    sd(tarsus_Intercept)                      878
    sd(back_Intercept)                        441
    cor(tarsus_Intercept,back_Intercept)      443
    
    ~fosternest (Number of levels: 104) 
                                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS
    sd(tarsus_Intercept)                     0.26      0.06     0.15     0.37 1.00      384
    sd(back_Intercept)                       0.31      0.06     0.20     0.42 1.00      494
    cor(tarsus_Intercept,back_Intercept)     0.65      0.23     0.13     0.97 1.00      208
                                         Tail_ESS
    sd(tarsus_Intercept)                      512
    sd(back_Intercept)                        789
    cor(tarsus_Intercept,back_Intercept)      570
    
    Population-Level Effects: 
                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    tarsus_Intercept        -0.41      0.07    -0.54    -0.28 1.01      639     1093
    back_Intercept          -0.00      0.05    -0.10     0.10 1.00     1145     1426
    tarsus_sexMale           0.77      0.06     0.66     0.89 1.00     1897     1409
    tarsus_sexUNK            0.22      0.12    -0.02     0.46 1.00     1223     1038
    sigma_tarsus_sexFem     -0.30      0.04    -0.38    -0.22 1.00     1890     1278
    sigma_tarsus_sexMale    -0.25      0.04    -0.32    -0.17 1.00     1664     1464
    sigma_tarsus_sexUNK     -0.39      0.13    -0.63    -0.13 1.00     1350     1353
    back_shatchdate_1        0.35      3.66    -5.87     8.43 1.00      514      652
    
    Family Specific Parameters: 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
    sigma_back       0.90      0.02     0.86     0.95 1.00     1665     1510
    alpha_tarsus    -1.21      0.45    -1.89     0.13 1.00      660      278
    
    Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
    and Tail_ESS are effective sample size measures, and Rhat is the potential
    scale reduction factor on split chains (at convergence, Rhat = 1).

    We see that the (log) residual standard deviation of tarsus is somewhat larger for chicks whose sex could not be identified as compared to male or female chicks. Further, we see from the negative alpha (skewness) parameter of tarsus that the residuals are indeed slightly left-skewed. Lastly, running

    reveals a non-linear relationship of hatchdate on the back color, which seems to change in waves over the course of the hatch dates.

    There are many more modeling options for multivariate models, which are not discussed in this vignette. Examples include autocorrelation structures, Gaussian processes, or explicit non-linear predictors (e.g., see help("brmsformula") or vignette("brms_multilevel")). In fact, nearly all the flexibility of univariate models is retained in multivariate models.

    References

    Hadfield JD, Nutall A, Osorio D, Owens IPF (2007). Testing the phenotypic gambit: phenotypic, genetic and environmental correlations of colour. Journal of Evolutionary Biology, 20(2), 549-557.

    brms/inst/doc/brms_overview.ltx0000644000176200001440000017606513606326627016413 0ustar liggesusers\documentclass[article, nojss]{jss} %\VignetteIndexEntry{Overview of the brms Package} %\VignetteEngine{R.rsp::tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Paul-Christian B\"urkner} \title{\pkg{brms}: An \proglang{R} Package for Bayesian Multilevel Models using \pkg{Stan}} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Paul-Christian B\"urkner} %% comma-separated \Plaintitle{brms: An R Package for Bayesian Multilevel Models using Stan} %% without formatting \Shorttitle{\pkg{brms}: Bayesian Multilevel Models using Stan} %% a short title (if necessary) %% an abstract and keywords \Abstract{ The \pkg{brms} package implements Bayesian multilevel models in \proglang{R} using the probabilistic programming language \pkg{Stan}. A wide range of distributions and link functions are supported, allowing users to fit -- among others -- linear, robust linear, binomial, Poisson, survival, response times, ordinal, quantile, zero-inflated, hurdle, and even non-linear models all in a multilevel context. Further modeling options include autocorrelation of the response variable, user defined covariance structures, censored data, as well as meta-analytic standard errors. Prior specifications are flexible and explicitly encourage users to apply prior distributions that actually reflect their beliefs. In addition, model fit can easily be assessed and compared using posterior-predictive checks and leave-one-out cross-validation. If you use \pkg{brms}, please cite this article as published in the Journal of Statistical Software \citep{brms1}. } \Keywords{Bayesian inference, multilevel model, ordinal data, MCMC, \proglang{Stan}, \proglang{R}} \Plainkeywords{Bayesian inference, multilevel model, ordinal data, MCMC, Stan, R} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{50} %% \Issue{9} %% \Month{June} %% \Year{2012} %% \Submitdate{2012-06-04} %% \Acceptdate{2012-06-04} %% The address of (at least) one author should be given %% in the following format: \Address{ Paul-Christian B\"urkner\\ E-mail: \email{paul.buerkner@gmail.com}\\ URL: \url{https://paul-buerkner.github.io} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/512/507-7103 %% Fax: +43/512/507-2851 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. \section{Introduction} Multilevel models (MLMs) offer a great flexibility for researchers across sciences \citep{brown2015, demidenko2013, gelmanMLM2006, pinheiro2006}. They allow the modeling of data measured on different levels at the same time -- for instance data of students nested within classes and schools -- thus taking complex dependency structures into account. It is not surprising that many packages for \proglang{R} \citep{Rcore2015} have been developed to fit MLMs. Possibly the most widely known package in this area is \pkg{lme4} \citep{bates2015}, which uses maximum likelihood or restricted maximum likelihood methods for model fitting. Although alternative Bayesian methods have several advantages over frequentist approaches (e.g., the possibility of explicitly incorporating prior knowledge about parameters into the model), their practical use was limited for a long time because the posterior distributions of more complex models (such as MLMs) could not be found analytically. Markov chain Monte Carlo (MCMC) algorithms allowing to draw random samples from the posterior were not available or too time-consuming. In the last few decades, however, this has changed with the development of new algorithms and the rapid increase of general computing power. Today, several software packages implement these techniques, for instance \pkg{WinBugs} \citep{lunn2000, spiegelhalter2003}, \pkg{OpenBugs} \citep{spiegelhalter2007}, \pkg{JAGS} \citep{plummer2013}, \pkg{MCMCglmm} \citep{hadfield2010} and \pkg{Stan} \citep{stan2017, carpenter2017} to mention only a few. With the exception of the latter, all of these programs are primarily using combinations of Metropolis-Hastings updates \citep{metropolis1953,hastings1970} and Gibbs-sampling \citep{geman1984,gelfand1990}, sometimes also coupled with slice-sampling \citep{damien1999,neal2003}. One of the main problems of these algorithms is their rather slow convergence for high-dimensional models with correlated parameters \citep{neal2011,hoffman2014,gelman2014}. Furthermore, Gibbs-sampling requires priors to be conjugate to the likelihood of parameters in order to work efficiently \citep{gelman2014}, thus reducing the freedom of the researcher in choosing a prior that reflects his or her beliefs. In contrast, \pkg{Stan} implements Hamiltonian Monte Carlo \citep{duane1987, neal2011} and its extension, the No-U-Turn Sampler (NUTS) \citep{hoffman2014}. These algorithms converge much more quickly especially for high-dimensional models regardless of whether the priors are conjugate or not \citep{hoffman2014}. Similar to software packages like \pkg{WinBugs}, \pkg{Stan} comes with its own programming language, allowing for great modeling flexibility (cf., \citeauthor{stanM2017} \citeyear{stanM2017}; \citeauthor{carpenter2017} \citeyear{carpenter2017}). Many researchers may still hesitate to use \pkg{Stan} directly, as every model has to be written, debugged and possibly also optimized. This may be a time-consuming and error prone process even for researchers familiar with Bayesian inference. The package \pkg{brms}, presented in this paper, aims at closing this gap (at least for MLMs) allowing the user to benefit from the merits of \pkg{Stan} only by using simple, \pkg{lme4}-like formula syntax. \pkg{brms} supports a wide range of distributions and link functions, allows for multiple grouping factors each with multiple group-level effects, autocorrelation of the response variable, user defined covariance structures, as well as flexible and explicit prior specifications. The purpose of the present article is to provide a general overview of the \pkg{brms} package (version 0.10.0). We begin by explaining the underlying structure of MLMs. Next, the software is introduced in detail using recurrence times of infection in kidney patients \citep{mcgilchrist1991} and ratings of inhaler instructions \citep{ezzet1991} as examples. We end by comparing \pkg{brms} to other \proglang{R} packages implementing MLMs and describe future plans for extending the package. \section{Model description} \label{model} The core of every MLM is the prediction of the response $y$ through the linear combination $\eta$ of predictors transformed by the inverse link function $f$ assuming a certain distribution $D$ for $y$. We write $$y_i \sim D(f(\eta_i), \theta)$$ to stress the dependency on the $i\textsuperscript{th}$ data point. In many \proglang{R} packages, $D$ is also called the `family' and we will use this term in the following. The parameter $\theta$ describes additional family specific parameters that typically do not vary across data points, such as the standard deviation $\sigma$ in normal models or the shape $\alpha$ in Gamma or negative binomial models. The linear predictor can generally be written as $$\eta = \mathbf{X} \beta + \mathbf{Z} u$$ In this equation, $\beta$ and $u$ are the coefficients at population-level and group-level respectively and $\mathbf{X}, \mathbf{Z}$ are the corresponding design matrices. The response $y$ as well as $\mathbf{X}$ and $\mathbf{Z}$ make up the data, whereas $\beta$, $u$, and $\theta$ are the model parameters being estimated. The coefficients $\beta$ and $u$ may be more commonly known as fixed and random effects. However, we avoid these terms in the present paper following the recommendations of \cite{gelmanMLM2006}, as they are not used unambiguously in the literature. Also, we want to make explicit that $u$ is a model parameter in the same manner as $\beta$ so that uncertainty in its estimates can be naturally evaluated. In fact, this is an important advantage of Bayesian MCMC methods as compared to maximum likelihood approaches, which do not treat $u$ as a parameter, but assume that it is part of the error term instead (cf., \citeauthor{fox2011}, \citeyear{fox2011}). Except for linear models, we do not incorporate an additional error term for every observation by default. If desired, such an error term can always be modeled using a grouping factor with as many levels as observations in the data. \subsection{Prior distributions} \subsubsection{Regression parameters at population-level} In \pkg{brms}, population-level parameters are not restricted to have normal priors. Instead, every parameter can have every one-dimensional prior implemented in \pkg{Stan}, for instance uniform, Cauchy or even Gamma priors. As a negative side effect of this flexibility, correlations between them cannot be modeled as parameters. If desired, point estimates of the correlations can be obtained after sampling has been done. By default, population level parameters have an improper flat prior over the reals. \subsubsection{Regression parameters at group-level} The group-level parameters $u$ are assumed to come from a multivariate normal distribution with mean zero and unknown covariance matrix $\mathbf{\Sigma}$: $$u \sim N(0, \mathbf{\Sigma})$$ As is generally the case, covariances between group-level parameters of different grouping factors are assumed to be zero. This implies that $\mathbf{Z}$ and $u$ can be split up into several matrices $\mathbf{Z_k}$ and parameter vectors $u_k$, where $k$ indexes grouping factors, so that the model can be simplified to $$u_k \sim N(0, \mathbf{\Sigma_k})$$ Usually, but not always, we can also assume group-level parameters associated with different levels (indexed by $j$) of the same grouping factor to be independent leading to $$u_{kj} \sim N(0, \mathbf{V_k})$$ The covariance matrices $\mathbf{V_k}$ are modeled as parameters. In most packages, an Inverse-Wishart distribution is used as a prior for $\mathbf{V_k}$. This is mostly because its conjugacy leads to good properties of Gibbs-Samplers \citep{gelman2014}. However, there are good arguments against the Inverse-Wishart prior \citep{natarajan2000, kass2006}. The NUTS-Sampler implemented in \pkg{Stan} does not require priors to be conjugate. This advantage is utilized in \pkg{brms}: $\mathbf{V_k}$ is parameterized in terms of a correlation matrix $\mathbf{\Omega_k}$ and a vector of standard deviations $\sigma_k$ through $$\mathbf{V_k} = \mathbf{D}(\sigma_k) \mathbf{\Omega_k} \mathbf{D}(\sigma_k)$$ where $\mathbf{D}(\sigma_k)$ denotes the diagonal matrix with diagonal elements $\sigma_k$. Priors are then specified for the parameters on the right hand side of the equation. For $\mathbf{\Omega_k}$, we use the LKJ-Correlation prior with parameter $\zeta > 0$ by \cite{lewandowski2009}\footnote{Internally, the Cholesky factor of the correlation matrix is used, as it is more efficient and numerically stable.}: $$\mathbf{\Omega_k} \sim \mathrm{LKJ}(\zeta)$$ The expected value of the LKJ-prior is the identity matrix (implying correlations of zero) for any positive value of $\zeta$, which can be interpreted like the shape parameter of a symmetric beta distribution \citep{stanM2017}. If $\zeta = 1$ (the default in \pkg{brms}) the density is uniform over correlation matrices of the respective dimension. If $\zeta > 1$, the identity matrix is the mode of the prior, with a sharper peak in the density for larger values of $\zeta$. If $0 < \zeta < 1$ the prior is U-shaped having a trough at the identity matrix, which leads to higher probabilities for non-zero correlations. For every element of $\sigma_k$, any prior can be applied that is defined on the non-negative reals only. As default in \pkg{brms}, we use a half Student-t prior with 3 degrees of freedom. This prior often leads to better convergence of the models than a half Cauchy prior, while still being relatively weakly informative. Sometimes -- for instance when modeling pedigrees -- different levels of the same grouping factor cannot be assumed to be independent. In this case, the covariance matrix of $u_k$ becomes $$\mathbf{\Sigma_k} = \mathbf{V_k} \otimes \mathbf{A_k}$$ where $\mathbf{A_k}$ is the known covariance matrix between levels and $\otimes$ is the Kronecker product. \subsubsection{Family specific parameters} For some families, additional parameters need to be estimated. In the current section, we only name the most important ones. Normal and Student's distributions need the parameter $\sigma$ to account for residual error variance. By default, $\sigma$ has a half Cauchy prior with a scale parameter that depends on the standard deviation of the response variable to remain only weakly informative regardless of response variable's scaling. Furthermore, Student's distributions needs the parameter $\nu$ representing the degrees of freedom. By default, $\nu$ has a wide gamma prior as proposed by \cite{juarez2010}. Gamma, Weibull, and negative binomial distributions need the shape parameter $\alpha$ that also has a wide gamma prior by default. \section{Parameter estimation} The \pkg{brms} package does not fit models itself but uses \pkg{Stan} on the back-end. Accordingly, all samplers implemented in \pkg{Stan} can be used to fit \pkg{brms} models. Currently, these are the static Hamiltonian Monte-Carlo (HMC) Sampler sometimes also referred to as Hybrid Monte-Carlo \citep{neal2011, neal2003, duane1987} and its extension the No-U-Turn Sampler (NUTS) by \cite{hoffman2014}. HMC-like algorithms produce samples that are much less autocorrelated than those of other samplers such as the random-walk Metropolis algorithm \citep{hoffman2014, Creutz1988}. The main drawback of this increased efficiency is the need to calculate the gradient of the log-posterior, which can be automated using algorithmic differentiation \citep{griewank2008} but is still a time-consuming process for more complex models. Thus, using HMC leads to higher quality samples but takes more time per sample than other algorithms typically applied. Another drawback of HMC is the need to pre-specify at least two parameters, which are both critical for the performance of HMC. The NUTS Sampler allows setting these parameters automatically thus eliminating the need for any hand-tuning, while still being at least as efficient as a well tuned HMC \citep{hoffman2014}. For more details on the sampling algorithms applied in \pkg{Stan}, see the \pkg{Stan} user's manual \citep{stanM2017} as well as \cite{hoffman2014}. In addition to the estimation of model parameters, \pkg{brms} allows drawing samples from the posterior predictive distribution as well as from the pointwise log-likelihood. Both can be used to assess model fit. The former allows a comparison between the actual response $y$ and the response $\hat{y}$ predicted by the model. The pointwise log-likelihood can be used, among others, to calculate the widely applicable information criterion (WAIC) proposed by \cite{watanabe2010} and leave-one-out cross-validation (LOO; \citealp{gelfand1992}; \citealp{vehtari2015}; see also \citealp{ionides2008}) both allowing to compare different models applied to the same data (lower WAICs and LOOs indicate better model fit). The WAIC can be viewed as an improvement of the popular deviance information criterion (DIC), which has been criticized by several authors (\citealp{vehtari2015}; \citealp{plummer2008}; \citealp{vanderlinde2005}; see also the discussion at the end of the original DIC paper by \citealp{spiegelhalter2002}) in part because of problems arising from fact that the DIC is only a point estimate. In \pkg{brms}, WAIC and LOO are implemented using the \pkg{loo} package \citep{loo2016} also following the recommendations of \cite{vehtari2015}. \section{Software} \label{software} The \pkg{brms} package provides functions for fitting MLMs using \pkg{Stan} for full Bayesian inference. To install the latest release version of \pkg{brms} from CRAN, type \code{install.packages("brms")} within \proglang{R}. The current developmental version can be downloaded from GitHub via \begin{Sinput} devtools::install_github("paul-buerkner/brms") \end{Sinput} Additionally, a \proglang{C++} compiler is required. This is because \pkg{brms} internally creates \pkg{Stan} code, which is translated to \proglang{C++} and compiled afterwards. The program \pkg{Rtools} \citep{Rtools2015} comes with a \proglang{C++} compiler for Windows\footnote{During the installation process, there is an option to change the system \code{PATH}. Please make sure to check this options, because otherwise \pkg{Rtools} will not be available within \proglang{R}.}. On OS X, one should use \pkg{Xcode} \citep{Xcode2015} from the App Store. To check whether the compiler can be called within \proglang{R}, run \code{system("g++ -v")} when using \pkg{Rtools} or \code{system("clang++ -v")} when using \pkg{Xcode}. If no warning occurs and a few lines of difficult to read system code are printed out, the compiler should work correctly. For more detailed instructions on how to get the compilers running, see the prerequisites section on \url{https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started}. Models are fitted in \pkg{brms} using the following procedure, which is also summarized in Figure~\ref{flowchart}. First, the user specifies the model using the \code{brm} function in a way typical for most model fitting \proglang{R} functions, that is by defining \code{formula}, \code{data}, and \code{family}, as well as some other optional arguments. Second, this information is processed and the \code{make_stancode} and \code{make_standata} functions are called. The former generates the model code in \pkg{Stan} language and the latter prepares the data for use in \pkg{Stan}. These two are the mandatory parts of every \pkg{Stan} model and without \pkg{brms}, users would have to specify them themselves. Third, \pkg{Stan} code and data as well as additional arguments (such as the number of iterations and chains) are passed to functions of the \pkg{rstan} package (the \proglang{R} interface of \pkg{Stan}; \citeauthor{stan2017}, \citeyear{stan2017}). Fourth, the model is fitted by \pkg{Stan} after translating and compiling it in \proglang{C++}. Fifth, after the model has been fitted and returned by \pkg{rstan}, the fitted model object is post-processed in \pkg{brms} among others by renaming the model parameters to be understood by the user. Sixth, the results can be investigated in \proglang{R} using various methods such as \code{summary}, \code{plot}, or \code{predict} (for a complete list of methods type \code{methods(class = "brmsfit")}). \begin{figure}[ht] \centering \includegraphics[height = 0.4\textheight, keepaspectratio]{flowchart.pdf} \caption{High level description of the model fitting procedure used in \pkg{brms}.} \label{flowchart} \end{figure} \subsection{A worked example} In the following, we use an example about the recurrence time of an infection in kidney patients initially published by \cite{mcgilchrist1991}. The data set consists of 76 entries of 7 variables: \begin{Sinput} R> library("brms") R> data("kidney") R> head(kidney, n = 3) \end{Sinput} \begin{Soutput} time censored patient recur age sex disease 1 8 0 1 1 28 male other 2 23 0 2 1 48 female GN 3 22 0 3 1 32 male other \end{Soutput} Variable \code{time} represents the recurrence time of the infection, \code{censored} indicates if \code{time} is right censored (\code{1}) or not censored (\code{0}), variable \code{patient} is the patient id, and \code{recur} indicates if it is the first or second recurrence in that patient. Finally, variables \code{age}, \code{sex}, and \code{disease} make up the predictors. \subsection[Fitting models with brms]{Fitting models with \pkg{brms}} The core of the \pkg{brms} package is the \code{brm} function and we will explain its argument structure using the example above. Suppose we want to predict the (possibly censored) recurrence time using a log-normal model, in which the intercept as well as the effect of \code{age} is nested within patients. Then, we may use the following code: \begin{Sinput} fit1 <- brm(formula = time | cens(censored) ~ age * sex + disease + (1 + age|patient), data = kidney, family = lognormal(), prior = c(set_prior("normal(0,5)", class = "b"), set_prior("cauchy(0,2)", class = "sd"), set_prior("lkj(2)", class = "cor")), warmup = 1000, iter = 2000, chains = 4, control = list(adapt_delta = 0.95)) \end{Sinput} \subsection[formula: Information on the response and predictors]{\code{formula}: Information on the response and predictors} Without doubt, \code{formula} is the most complicated argument, as it contains information on the response variable as well as on predictors at different levels of the model. Everything before the $\sim$ sign relates to the response part of \code{formula}. In the usual and most simple case, this is just one variable name (e.g., \code{time}). However, to incorporate additional information about the response, one can add one or more terms of the form \code{| fun(variable)}. \code{fun} may be one of a few functions defined internally in \pkg{brms} and \code{variable} corresponds to a variable in the data set supplied by the user. In this example, \code{cens} makes up the internal function that handles censored data, and \code{censored} is the variable that contains information on the censoring. Other available functions in this context are \code{weights} and \code{disp} to allow different sorts of weighting, \code{se} to specify known standard errors primarily for meta-analysis, \code{trunc} to define truncation boundaries, \code{trials} for binomial models\footnote{In functions such as \code{glm} or \code{glmer}, the binomial response is typically passed as \code{cbind(success, failure)}. In \pkg{brms}, the equivalent syntax is \code{success | trials(success + failure)}.}, and \code{cat} to specify the number of categories for ordinal models. Everything on the right side of $\sim$ specifies predictors. Here, the syntax exactly matches that of \pkg{lme4}. For both, population-level and group-level terms, the \code{+} is used to separate different effects from each other. Group-level terms are of the form \code{(coefs | group)}, where \code{coefs} contains one or more variables whose effects are assumed to vary with the levels of the grouping factor given in \code{group}. Multiple grouping factors each with multiple group-level coefficients are possible. In the present example, only one group-level term is specified in which \code{1 + age} are the coefficients varying with the grouping factor \code{patient}. This implies that the intercept of the model as well as the effect of age is supposed to vary between patients. By default, group-level coefficients within a grouping factor are assumed to be correlated. Correlations can be set to zero by using the \code{(coefs || group)} syntax\footnote{In contrast to \pkg{lme4}, the \code{||} operator in \pkg{brms} splits up the design matrix computed from \code{coefs} instead of decomposing \code{coefs} in its terms. This implies that columns of the design matrix originating from the same factor are also assumed to be uncorrelated, whereas \pkg{lme4} estimates the correlations in this case. For a way to achieve \pkg{brms}-like behavior with \pkg{lme4}, see the \code{mixed} function of the \pkg{afex} package by \cite{afex2015}.}. Everything on the right side of \code{formula} that is not recognized as part of a group-level term is treated as a population-level effect. In this example, the population-level effects are \code{age}, \code{sex}, and \code{disease}. \subsection[family: Distribution of the response variable]{\code{family}: Distribution of the response variable} Argument \code{family} should usually be a family function, a call to a family function or a character string naming the family. If not otherwise specified, default link functions are applied. \pkg{brms} comes with a large variety of families. Linear and robust linear regression can be performed using the \code{gaussian} or \code{student} family combined with the \code{identity} link. For dichotomous and categorical data, families \code{bernoulli}, \code{binomial}, and \code{categorical} combined with the \code{logit} link, by default, are perfectly suited. Families \code{poisson}, \code{negbinomial}, and \code{geometric} allow for modeling count data. Families \code{lognormal}, \code{Gamma}, \code{exponential}, and \code{weibull} can be used (among others) for survival regression. Ordinal regression can be performed using the families \code{cumulative}, \code{cratio}, \code{sratio}, and \code{acat}. Finally, families \code{zero_inflated_poisson}, \code{zero_inflated_negbinomial}, \code{zero_inflated_binomial}, \code{zero_inflated_beta}, \code{hurdle_poisson}, \code{hurdle_negbinomial}, and \code{hurdle_gamma} can be used to adequately model excess zeros in the response. In our example, we use \code{family = lognormal()} implying a log-normal ``survival'' model for the response variable \code{time}. \subsection[prior: Prior distributions of model parameters]{\code{prior}: Prior distributions of model parameters} Every population-level effect has its corresponding regression parameter. These parameters are named as \code{b\_}, where \code{} represents the name of the corresponding population-level effect. The default prior is an improper flat prior over the reals. Suppose, for instance, that we want to set a normal prior with mean \code{0} and standard deviation \code{10} on the effect of \code{age} and a Cauchy prior with location \code{1} and scale \code{2} on \code{sexfemale}\footnote{When factors are used as predictors, parameter names will depend on the factor levels. To get an overview of all parameters and parameter classes for which priors can be specified, use function \code{get\_prior}. For the present example, \code{get\_prior(time | cens(censored) $\sim$ age * sex + disease + (1 + age|patient), data = kidney, family = lognormal())} does the desired.}. Then, we may write \begin{Sinput} prior <- c(set_prior("normal(0,10)", class = "b", coef = "age"), set_prior("cauchy(1,2)", class = "b", coef = "sexfemale")) \end{Sinput} To put the same prior (e.g., a normal prior) on all population-level effects at once, we may write as a shortcut \code{set_prior("normal(0,10)", class = "b")}. This also leads to faster sampling, because priors can be vectorized in this case. Note that we could also omit the \code{class} argument for population-level effects, as it is the default class in \code{set_prior}. A special shrinkage prior to be applied on population-level effects is the horseshoe prior \citep{carvalho2009, carvalho2010}. It is symmetric around zero with fat tails and an infinitely large spike at zero. This makes it ideal for sparse models that have many regression coefficients, although only a minority of them is non-zero. The horseshoe prior can be applied on all population-level effects at once (excluding the intercept) by using \code{set_prior("horseshoe(1)")}. The $1$ implies that the Student-$t$ prior of the local shrinkage parameters has 1 degrees of freedom. In \pkg{brms} it is possible to increase the degrees of freedom (which will often improve convergence), although the prior no longer resembles a horseshoe in this case\footnote{This class of priors is often referred to as hierarchical shrinkage family, which contains the original horseshoe prior as a special case.}. For more details see \cite{carvalho2009, carvalho2010}. Each group-level effect of each grouping factor has a standard deviation parameter, which is restricted to be non-negative and, by default, has a half Student-$t$ prior with $3$ degrees of freedom and a scale parameter that is minimally $10$. For non-ordinal models, \pkg{brms} tries to evaluate if the scale is large enough to be considered only weakly informative for the model at hand by comparing it with the standard deviation of the response after applying the link function. If this is not the case, it will increase the scale based on the aforementioned standard deviation\footnote{Changing priors based on the data is not truly Bayesian and might rightly be criticized. However, it helps avoiding the problem of too informative default priors without always forcing users to define their own priors. The latter would also be problematic as not all users can be expected to be well educated Bayesians and reasonable default priors will help them a lot in using Bayesian methods.}. \pkg{Stan} implicitly defines a half Student-$t$ prior by using a Student-$t$ prior on a restricted parameter \citep{stanM2017}. For other reasonable priors on standard deviations see \cite{gelman2006}. In \pkg{brms}, standard deviation parameters are named as \code{sd\_\_} so that \code{sd\_patient\_Intercept} and \code{sd\_patient\_age} are the parameter names in the example. If desired, it is possible to set a different prior on each parameter, but statements such as \code{set_prior("student_t(3,0,5)", class = "sd", group = "patient")} or even \code{set_prior("student_t(3,0,5)", class = "sd")} may also be used and are again faster because of vectorization. If there is more than one group-level effect per grouping factor, correlations between group-level effects are estimated. As mentioned in Section~\ref{model}, the LKJ-Correlation prior with parameter $\zeta > 0$ \citep{lewandowski2009} is used for this purpose. In \pkg{brms}, this prior is abbreviated as \code{"lkj(zeta)"} and correlation matrix parameters are named as \code{cor\_}, (e.g., \code{cor_patient}), so that \code{set_prior("lkj(2)", class = "cor", group = "patient")} is a valid statement. To set the same prior on every correlation matrix in the model, \code{set_prior("lkj(2)", class = "cor")} is also allowed, but does not come with any efficiency increases. Other model parameters such as the residual standard deviation \code{sigma} in normal models or the \code{shape} in Gamma models have their priors defined in the same way, where each of them is treated as having its own parameter class. A complete overview on possible prior distributions is given in the \pkg{Stan} user's manual \citep{stanM2017}. Note that \pkg{brms} does not thoroughly check if the priors are written in correct \pkg{Stan} language. Instead, \pkg{Stan} will check their syntactical correctness when the model is parsed to \proglang{C++} and return an error if they are not. This, however, does not imply that priors are always meaningful if they are accepted by \pkg{Stan}. Although \pkg{brms} tries to find common problems (e.g., setting bounded priors on unbounded parameters), there is no guarantee that the defined priors are reasonable for the model. \subsection[control Adjusting the sampling behavior of Stan]{\code{control}: Adjusting the sampling behavior of \pkg{Stan}} In addition to choosing the number of iterations, warmup samples, and chains, users can control the behavior of the NUTS sampler by using the \code{control} argument. The most important reason to use \code{control} is to decrease (or eliminate at best) the number of divergent transitions that cause a bias in the obtained posterior samples. Whenever you see the warning \code{"There were x divergent transitions after warmup."}, you should really think about increasing \code{adapt_delta}. To do this, write \code{control = list(adapt_delta = )}, where \code{} should usually be a value between \code{0.8} (current default) and \code{1}. Increasing \code{adapt_delta} will slow down the sampler but will decrease the number of divergent transitions threatening the validity of your posterior samples. Another problem arises when the depth of the tree being evaluated in each iteration is exceeded. This is less common than having divergent transitions, but may also bias the posterior samples. When it happens, \pkg{Stan} will throw out a warning suggesting to increase \code{max_treedepth}, which can be accomplished by writing \code{control = list(max_treedepth = )} with a positive integer \code{} that should usually be larger than the current default of \code{10}. \subsection{Analyzing the results} The example model \code{fit1} is fitted using 4 chains, each with 2000 iterations of which the first 1000 are warmup to calibrate the sampler, leading to a total of 4000 posterior samples\footnote{To save time, chains may also run in parallel when using argument \code{cluster}.}. For researchers familiar with Gibbs or Metropolis-Hastings sampling, this number may seem far too small to achieve good convergence and reasonable results, especially for multilevel models. However, as \pkg{brms} utilizes the NUTS sampler \citep{hoffman2014} implemented in \pkg{Stan}, even complex models can often be fitted with not more than a few thousand samples. Of course, every iteration is more computationally intensive and time-consuming than the iterations of other algorithms, but the quality of the samples (i.e., the effective sample size per iteration) is usually higher. After the posterior samples have been computed, the \code{brm} function returns an \proglang{R} object, containing (among others) the fully commented model code in \pkg{Stan} language, the data to fit the model, and the posterior samples themselves. The model code and data for the present example can be extracted through \code{stancode(fit1)} and \code{standata(fit1)} respectively\footnote{Both model code and data may be amended and used to fit new models. That way, \pkg{brms} can also serve as a good starting point in building more complicated models in \pkg{Stan}, directly.}. A model summary is readily available using \begin{Sinput} R> summary(fit1, waic = TRUE) \end{Sinput} \begin{Soutput} Family: lognormal (identity) Formula: time | cens(censored) ~ age * sex + disease + (1 + age | patient) Data: kidney (Number of observations: 76) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: 673.51 Group-Level Effects: ~patient (Number of levels: 38) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 0.40 0.28 0.01 1.01 1731 1 sd(age) 0.01 0.01 0.00 0.02 1137 1 cor(Intercept,age) -0.13 0.46 -0.88 0.76 3159 1 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept 2.73 0.96 0.82 4.68 2139 1 age 0.01 0.02 -0.03 0.06 1614 1 sexfemale 2.42 1.13 0.15 4.64 2065 1 diseaseGN -0.40 0.53 -1.45 0.64 2664 1 diseaseAN -0.52 0.50 -1.48 0.48 2713 1 diseasePKD 0.60 0.74 -0.86 2.02 2968 1 age:sexfemale -0.02 0.03 -0.07 0.03 1956 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sigma 1.15 0.13 0.91 1.44 4000 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Soutput} On the top of the output, some general information on the model is given, such as family, formula, number of iterations and chains, as well as the WAIC. Next, group-level effects are displayed separately for each grouping factor in terms of standard deviations and correlations between group-level effects. On the bottom of the output, population-level effects are displayed. If incorporated, autocorrelation and family specific parameters (e.g., the residual standard deviation \code{sigma}) are also given. In general, every parameter is summarized using the mean (\code{Estimate}) and the standard deviation (\code{Est.Error}) of the posterior distribution as well as two-sided 95\% Credible intervals (\code{l-95\% CI} and \code{u-95\% CI}) based on quantiles. The \code{Eff.Sample} value is an estimation of the effective sample size; that is the number of independent samples from the posterior distribution that would be expected to yield the same standard error of the posterior mean as is obtained from the dependent samples returned by the MCMC algorithm. The \code{Rhat} value provides information on the convergence of the algorithm (cf., \citeauthor{gelman1992}, \citeyear{gelman1992}). If \code{Rhat} is considerably greater than 1 (i.e., $> 1.1$), the chains have not yet converged and it is necessary to run more iterations and/or set stronger priors. To visually investigate the chains as well as the posterior distribution, the \code{plot} method can be used (see Figure~\ref{kidney_plot}). An even more detailed investigation can be achieved by applying the \pkg{shinystan} package \citep{gabry2015} through method \code{launch_shiny}. With respect to the above summary, \code{sexfemale} seems to be the only population-level effect with considerable influence on the response. Because the mean of \code{sexfemale} is positive, the model predicts longer periods without an infection for females than for males. Effects of population-level predictors can also be visualized with the \code{conditional_effects} method (see Figure~\ref{kidney_conditional_effects}). \begin{figure}[ht] \centering \includegraphics[width=0.95\textwidth]{kidney_plot.pdf} \caption{Trace and Density plots of all relevant parameters of the kidney model discussed in Section~\ref{software}.} \label{kidney_plot} \end{figure} \begin{figure}[ht] \centering \includegraphics[height=0.90\textheight]{kidney_conditional_effects.pdf} \caption{Marginal effects plots of all population-level predictors of the kidney model discussed in Section~\ref{software}.} \label{kidney_conditional_effects} \end{figure} Looking at the group-level effects, the standard deviation parameter of \code{age} is suspiciously small. To test whether it is smaller than the standard deviation parameter of \code{Intercept}, we apply the \code{hypothesis} method: \begin{Sinput} R> hypothesis(fit1, "Intercept - age > 0", class = "sd", group = "patient") \end{Sinput} \begin{Soutput} Hypothesis Tests for class sd_patient: Estimate Est.Error l-95% CI u-95% CI Evid.Ratio Intercept-age > 0 0.39 0.27 0.03 Inf 67.97 * --- '*': The expected value under the hypothesis lies outside the 95% CI. \end{Soutput} The one-sided 95\% credibility interval does not contain zero, thus indicating that the standard deviations differ from each other in the expected direction. In accordance with this finding, the \code{Evid.Ratio} shows that the hypothesis being tested (i.e., \code{Intercept - age > 0}) is about $68$ times more likely than the alternative hypothesis \code{Intercept - age < 0}. It is important to note that this kind of comparison is not easily possible when applying frequentist methods, because in this case only point estimates are available for group-level standard deviations and correlations. When looking at the correlation between both group-level effects, its distribution displayed in Figure~\ref{kidney_plot} and the 95\% credibility interval in the summary output appear to be rather wide. This indicates that there is not enough evidence in the data to reasonably estimate the correlation. Together, the small standard deviation of \code{age} and the uncertainty in the correlation raise the question if \code{age} should be modeled as a group specific term at all. To answer this question, we fit another model without this term: \begin{Sinput} R> fit2 <- update(fit1, formula. = ~ . - (1 + age|patient) + (1|patient)) \end{Sinput} A good way to compare both models is leave-one-out cross-validation (LOO)\footnote{The WAIC is an approximation of LOO that is faster and easier to compute. However, according to \cite{vehtari2015}, LOO may be the preferred method to perform model comparisons.}, which can be called in \pkg{brms} using \begin{Sinput} R> LOO(fit1, fit2) \end{Sinput} \begin{Soutput} LOOIC SE fit1 675.45 45.18 fit2 674.17 45.06 fit1 - fit2 1.28 0.99 \end{Soutput} In the output, the LOO information criterion for each model as well as the difference of the LOOs each with its corresponding standard error is shown. Both LOO and WAIC are approximately normal if the number of observations is large so that the standard errors can be very helpful in evaluating differences in the information criteria. However, for small sample sizes, standard errors should be interpreted with care \citep{vehtari2015}. For the present example, it is immediately evident that both models have very similar fit, indicating that there is little benefit in adding group specific coefficients for \code{age}. \subsection{Modeling ordinal data} In the following, we want to briefly discuss a second example to demonstrate the capabilities of \pkg{brms} in handling ordinal data. \cite{ezzet1991} analyze data from a two-treatment, two-period crossover trial to compare 2 inhalation devices for delivering the drug salbutamol in 286 asthma patients. Patients were asked to rate the clarity of leaflet instructions accompanying each device, using a four-point ordinal scale. Ratings are predicted by \code{treat} to indicate which of the two inhaler devices was used, \code{period} to indicate the time of administration, and \code{carry} to model possible carry over effects. \begin{Sinput} R> data("inhaler") R> head(inhaler, n = 1) \end{Sinput} \begin{Soutput} subject rating treat period carry 1 1 1 0.5 0.5 0 \end{Soutput} Typically, the ordinal response is assumed to originate from the categorization of a latent continuous variable. That is there are $K$ latent thresholds (model intercepts), which partition the continuous scale into the $K + 1$ observable, ordered categories. Following this approach leads to the cumulative or graded-response model \citep{samejima1969} for ordinal data implemented in many \proglang{R} packages. In \pkg{brms}, it is available via family \code{cumulative}. Fitting the cumulative model to the inhaler data, also incorporating an intercept varying by subjects, may look this: \begin{Sinput} fit3 <- brm(formula = rating ~ treat + period + carry + (1|subject), data = inhaler, family = cumulative) \end{Sinput} While the support for ordinal data in most \proglang{R} packages ends here\footnote{Exceptions known to us are the packages \pkg{ordinal} \citep{christensen2015} and \pkg{VGAM} \citep{yee2010}. The former supports only cumulative models but with different modeling option for the thresholds. The latter supports all four ordinal families also implemented in \pkg{brms} as well as category specific effects but no group-specific effects.}, \pkg{brms} allows changes to this basic model in at least three ways. First of all, three additional ordinal families are implemented. Families \code{sratio} (stopping ratio) and \code{cratio} (continuation ratio) are so called sequential models \citep{tutz1990}. Both are equivalent to each other for symmetric link functions such as \code{logit} but will differ for asymmetric ones such as \code{cloglog}. The fourth ordinal family is \code{acat} (adjacent category) also known as partial credits model \citep{masters1982, andrich1978a}. Second, restrictions to the thresholds can be applied. By default, thresholds are ordered for family \code{cumulative} or are completely free to vary for the other families. This is indicated by argument \code{threshold = "flexible"} (default) in \code{brm}. Using \code{threshold = "equidistant"} forces the distance between two adjacent thresholds to be the same, that is $$\tau_k = \tau_1 + (k-1)\delta$$ for thresholds $\tau_k$ and distance $\delta$ (see also \citealp{andrich1978b}; \citealp{andrich1978a}; \citealp{andersen1977}). Third, the assumption that predictors have constant effects across categories may be relaxed for non-cumulative ordinal models \citep{vanderark2001, tutz2000} leading to category specific effects. For instance, variable \code{treat} may only have an impact on the decision between category 3 and 4, but not on the lower categories. Without using category specific effects, such a pattern would remain invisible. To illustrate all three modeling options at once, we fit a (hardly theoretically justified) stopping ratio model with equidistant thresholds and category specific effects for variable \code{treat} on which we apply an informative prior. \begin{Sinput} fit4 <- brm(formula = rating ~ period + carry + cs(treat) + (1|subject), data = inhaler, family = sratio, threshold = "equidistant", prior = set_prior("normal(-1,2)", coef = "treat")) \end{Sinput} Note that priors are defined on category specific effects in the same way as for other population-level effects. A model summary can be obtained in the same way as before: \begin{Sinput} R> summary(fit4, waic = TRUE) \end{Sinput} \begin{Soutput} Family: sratio (logit) Formula: rating ~ period + carry + cs(treat) + (1 | subject) Data: inhaler (Number of observations: 572) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000 WAIC: 911.9 Group-Level Effects: ~subject (Number of levels: 286) Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat sd(Intercept) 1.05 0.23 0.56 1.5 648 1 Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat Intercept[1] 0.72 0.13 0.48 0.99 2048 1 Intercept[2] 2.67 0.35 2.00 3.39 969 1 Intercept[3] 4.62 0.66 3.36 5.95 1037 1 period 0.25 0.18 -0.09 0.61 4000 1 carry -0.26 0.22 -0.70 0.17 1874 1 treat[1] -0.96 0.30 -1.56 -0.40 1385 1 treat[2] -0.65 0.49 -1.60 0.27 4000 1 treat[3] -2.65 1.21 -5.00 -0.29 4000 1 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat delta 1.95 0.32 1.33 2.6 1181 1 Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample is a crude measure of effective sample size, and Rhat is the potential scale reduction factor on split chains (at convergence, Rhat = 1). \end{Soutput} Trace and density plots of the model parameters as produced by \code{plot(fit4)} can be found in Figure~\ref{inhaler_plot}. We see that three intercepts (thresholds) and three effects of \code{treat} have been estimated, because a four-point scale was used for the ratings. The treatment effect seems to be strongest between category 3 and 4. At the same time, however, the credible interval is also much larger. In fact, the intervals of all three effects of \code{treat} are highly overlapping, which indicates that there is not enough evidence in the data to support category specific effects. On the bottom of the output, parameter \code{delta} specifies the distance between two adjacent thresholds and indeed the intercepts differ from each other by the magnitude of \code{delta}. \begin{figure}[ht] \centering \includegraphics[width=0.95\textwidth]{inhaler_plot.pdf} \caption{Trace and Density plots of all relevant parameters of the inhaler model discussed in Section~\ref{software}.} \label{inhaler_plot} \end{figure} \section[Comparison]{Comparison between packages} Over the years, many \proglang{R} packages have been developed that implement MLMs, each being more or less general in their supported models. Comparing all of them to \pkg{brms} would be too extensive and barely helpful for the purpose of the present paper. Accordingly, we concentrate on a comparison with four packages. These are \pkg{lme4} \citep{bates2015} and \pkg{MCMCglmm} \citep{hadfield2010}, which are possibly the most general and widely applied \proglang{R} packages for MLMs, as well as \pkg{rstanarm} \citep{rstanarm2016} and \pkg{rethinking} \citep{mcelreath2016}, which are both based on \pkg{Stan}. As opposed to the other packages, \pkg{rethinking} was primarily written for teaching purposes and requires the user to specify the full model explicitly using its own simplified \pkg{BUGS}-like syntax thus helping users to better understand the models that are fitted to their data. Regarding model families, all five packages support the most common types such as linear and binomial models as well as Poisson models for count data. Currently, \pkg{brms} and \pkg{MCMCglmm} provide more flexibility when modeling categorical and ordinal data. In addition, \pkg{brms} supports robust linear regression using Student's distribution, which is also implemented on a GitHub branch of \pkg{rstanarm}. \pkg{MCMCglmm} allows fitting multinomial models that are currently not available in the other packages. Generalizing classical MLMs, \pkg{brms} and \pkg{MCMCglmm} allow fiting zero-inflated and hurdle models dealing with excess zeros in the response. Furthermore, \pkg{brms} supports non-linear models similar to the \pkg{nlme} package \citep{nlme2016} providing great flexibility but also requiring more care to produce reasonable results. Another flexible model class are generalized additive mixed models \citep{hastie1990,wood2011,zuur2014}, which can be fitted with \pkg{brms} and \pkg{rstanarm}. In all five packages, there are quite a few additional modeling options. Variable link functions can be specified in all packages except for \pkg{MCMCglmm}, in which only one link is available per family. \pkg{MCMCglmm} generally supports multivariate responses using data in wide format, whereas \pkg{brms} currently only offers this option for families \code{gaussian} and \code{student}. It should be noted that it is always possible to transform data from wide to long format for compatibility with the other packages. Autocorrelation of the response can only be fitted in \pkg{brms}, which supports auto-regressive as well as moving-average effects. For ordinal models in \pkg{brms}, effects of predictors may vary across different levels of the response as explained in the inhaler example. A feature currently exclusive to \pkg{rethinking} is the possibility to impute missing values in the predictor variables. Information criteria are available in all three packages. The advantage of WAIC and LOO implemented in \pkg{brms}, \pkg{rstanarm}, and \pkg{rethinking} is that their standard errors can be easily estimated to get a better sense of the uncertainty in the criteria. Comparing the prior options of the Bayesian packages, \pkg{brms} and \pkg{rethinking} offer a little more flexibility than \pkg{MCMCglmm} and \pkg{rstanarm}, as virtually any prior distribution can be applied on population-level effects as well as on the standard deviations of group-level effects. In addition, we believe that the way priors are specified in \pkg{brms} and \pkg{rethinking} is more intuitive as it is directly evident what prior is actually applied. A more detailed comparison of the packages can be found in Table~\ref{comparison1} and Table~\ref{comparison2}. To facilitate the understanding of the model formulation in \pkg{brms}, Table~\ref{syntax} shows \pkg{lme4} function calls to fit sample models along with the equivalent \pkg{brms} syntax. So far the focus was only on capabilities. Another important topic is speed, especially for more complex models. Of course, \pkg{lme4} is usually much faster than the other packages as it uses maximum likelihood methods instead of MCMC algorithms, which are slower by design. To compare the efficiency of the four Bayesian packages, we fitted multilevel models on real data sets using the minimum effective sample size divided by sampling time as a measure of sampling efficiency. One should always aim at running multiple chains as one cannot be sure that a single chain really explores the whole posterior distribution. However, as \pkg{MCMCglmm} does not come with a built-in option to run multiple chains, we used only a single chain to fit the models after making sure that it leads to the same results as multiple chains. The \proglang{R} code allowing to replicate the results is available as supplemental material. The first thing that becomes obvious when fitting the models is that \pkg{brms} and \pkg{rethinking} need to compile the \proglang{C++} model before actually fitting it, because the \pkg{Stan} code being parsed to \proglang{C++} is generated on the fly based on the user's input. Compilation takes about a half to one minute depending on the model complexity and computing power of the machine. This is not required by \pkg{rstanarm} and \pkg{MCMCglmm}, although the former is also based on \pkg{Stan}, as compilation takes place only once at installation time. While the latter approach saves the compilation time, the former is more flexible when it comes to model specification. For small and simple models, compilation time dominates the overall computation time, but for larger and more complex models, sampling will take several minutes or hours so that one minute more or less will not really matter, anymore. Accordingly, the following comparisons do not include the compilation time. In models containing only group-specific intercepts, \pkg{MCMCglmm} is usually more efficient than the \pkg{Stan} packages. However, when also estimating group-specific slopes, \pkg{MCMCglmm} falls behind the other packages and quite often refuses to sample at all unless one carefully specifies informative priors. Note that these results are obtained by running only a single chain. For all three \pkg{Stan} packages, sampling efficiency can easily be increased by running multiple chains in parallel. Comparing the \pkg{Stan} packages to each other, \pkg{brms} is usually most efficient for models with group-specific terms, whereas \pkg{rstanarm} tends to be roughly $50\%$ to $75\%$ as efficient at least for the analyzed data sets. The efficiency of \pkg{rethinking} is more variable depending on the model formulation and data, sometimes being slightly ahead of the other two packages, but usually being considerably less efficient. Generally, \pkg{rethinking} loses efficiency for models with many population-level effects presumably because one cannot use design matrices and vectorized prior specifications for population-level parameters. Note that it was not possible to specify the exact same priors across packages due to varying parameterizations. Of course, efficiency depends heavily on the model, chosen priors, and data at hand so that the present results should not be over-interpreted. \begin{table}[hbtp] \centering \begin{tabular}{llll} & \parbox{2cm}{\pkg{brms}} & \parbox{2cm}{\pkg{lme4}} & \parbox{2cm}{\pkg{MCMCglmm}} \\ \hline \\ [-1.5ex] \parbox{6cm}{Supported model types:} & & & \\ [1ex] Linear models & yes & yes & yes \\ Robust linear models & yes & no & no \\ Binomial models & yes & yes & yes \\ Categorical models & yes & no & yes \\ Multinomial models & no & no & yes \\ Count data models & yes & yes & yes \\ Survival models & yes$^1$ & yes & yes \\ Ordinal models & various & no & cumulative \\ Zero-inflated and hurdle models & yes & no & yes \\ Generalized additive models & yes & no & no \\ Non-linear models & yes & no & no \\ \hline \\ [-1.5ex] \parbox{5cm}{Additional modeling options:} & & & \\ [1ex] Variable link functions & various & various & no \\ Weights & yes & yes & no \\ Offset & yes & yes & using priors \\ Multivariate responses & limited & no & yes \\ Autocorrelation effects & yes & no & no \\ Category specific effects & yes & no & no \\ Standard errors for meta-analysis & yes & no & yes \\ Censored data & yes & no & yes \\ Truncated data & yes & no & no \\ Customized covariances & yes & no & yes \\ Missing value imputation & no & no & no \\ \hline \\ [-1.5ex] Bayesian specifics: & & & \\ [1ex] parallelization & yes & -- & no \\ population-level priors & flexible & --$^3$ & normal \\ group-level priors & normal & --$^3$ & normal \\ covariance priors & flexible & --$^3$ & restricted$^4$ \\ \hline \\ [-1.5ex] Other: & & & \\ [1ex] Estimator & HMC, NUTS & ML, REML & MH, Gibbs$^2$ \\ Information criterion & WAIC, LOO & AIC, BIC & DIC \\ \proglang{C++} compiler required & yes & no & no \\ Modularized & no & yes & no \\ \hline \end{tabular} \caption{Comparison of the capabilities of the \pkg{brms}, \pkg{lme4} and \pkg{MCMCglmm} package. Notes: (1) Weibull family only available in \pkg{brms}. (2) Estimator consists of a combination of both algorithms. (3) Priors may be imposed using the \pkg{blme} package \citep{chung2013}. (4) For details see \cite{hadfield2010}.} \label{comparison1} \end{table} \begin{table}[hbtp] \centering \begin{tabular}{llll} & \parbox{2cm}{\pkg{brms}} & \parbox{2cm}{\pkg{rstanarm}} & \parbox{2cm}{\pkg{rethinking}} \\ \hline \\ [-1.5ex] \parbox{6cm}{Supported model types:} & & & \\ [1ex] Linear models & yes & yes & yes \\ Robust linear models & yes & yes$^1$ & no \\ Binomial models & yes & yes & yes \\ Categorical models & yes & no & no \\ Multinomial models & no & no & no \\ Count data models & yes & yes & yes \\ Survival models & yes$^2$ & yes & yes \\ Ordinal models & various & cumulative$^3$ & no \\ Zero-inflated and hurdle models & yes & no & no \\ Generalized additive models & yes & yes & no \\ Non-linear models & yes & no & limited$^4$ \\ \hline \\ [-1.5ex] \parbox{5cm}{Additional modeling options:} & & & \\ [1ex] Variable link functions & various & various & various \\ Weights & yes & yes & no \\ Offset & yes & yes & yes \\ Multivariate responses & limited & no & no \\ Autocorrelation effects & yes & no & no \\ Category specific effects & yes & no & no \\ Standard errors for meta-analysis & yes & no & no \\ Censored data & yes & no & no \\ Truncated data & yes & no & yes \\ Customized covariances & yes & no & no \\ Missing value imputation & no & no & yes \\ \hline \\ [-1.5ex] Bayesian specifics: & & & \\ [1ex] parallelization & yes & yes & yes \\ population-level priors & flexible & normal, Student-t & flexible \\ group-level priors & normal & normal & normal \\ covariance priors & flexible & restricted$^5$ & flexible \\ \hline \\ [-1.5ex] Other: & & & \\ [1ex] Estimator & HMC, NUTS & HMC, NUTS & HMC, NUTS \\ Information criterion & WAIC, LOO & AIC, LOO & AIC, LOO \\ \proglang{C++} compiler required & yes & no & yes \\ Modularized & no & no & no \\ \hline \end{tabular} \caption{Comparison of the capabilities of the \pkg{brms}, \pkg{rstanarm} and \pkg{rethinking} package. Notes: (1) Currently only implemented on a branch on GitHub. (2) Weibull family only available in \pkg{brms}. (3) No group-level terms allowed. (4) The parser is mainly written for linear models but also accepts some non-linear model specifications. (5) For details see \url{https://github.com/stan-dev/rstanarm/wiki/Prior-distributions}.} \label{comparison2} \end{table} \begin{table}[hbtp] \centering %\renewcommand{\arraystretch}{2} \begin{tabular}{ll} Dataset & \parbox{10cm}{Function call} \\ \hline \\ [-1.5ex] \parbox{2cm}{cake} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{lmer(angle $\sim$ recipe * temperature + (1|recipe:replicate), \\ \hspace*{5ex} data = cake)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(angle $\sim$ recipe * temperature + (1|recipe:replicate), \\ \hspace*{4ex} data = cake)}} \\ [2ex] \hline \\ [-1.5ex] \parbox{2cm}{sleepstudy} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{lmer(Reaction $\sim$ Days + (Days|Subject), data = sleepstudy)}} \\ [1.5ex] \pkg{brms} & \parbox{13cm}{\code{brm(Reaction $\sim$ Days + (Days|Subject), data = sleepstudy)}} \\ [2ex] \hline \\ [-1.5ex] \parbox{2cm}{cbpp$^1$} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{glmer(cbind(incidence, size - incidence) $\sim$ period + (1 | herd), \\ \hspace*{6ex} family = binomial("logit"), data = cbpp)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(incidence | trials(size) $\sim$ period + (1 | herd), \\ \hspace*{4ex} family = binomial("logit"), data = cbpp)}} \\ [2ex] \hline \\ [-1.5ex] \parbox{2cm}{grouseticks$^1$} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{glmer(TICKS $\sim$ YEAR + HEIGHT + (1|BROOD) + (1|LOCATION), \\ \hspace*{6ex} family = poisson("log"), data = grouseticks)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(TICKS $\sim$ YEAR + HEIGHT + (1|BROOD) + (1|LOCATION), \\ \hspace*{4ex} family = poisson("log"), data = grouseticks)}} \\ [2ex] \hline \\ [-1ex] \parbox{2cm}{VerbAgg$^2$} & \\ [1ex] \pkg{lme4} & \parbox{13cm}{\code{glmer(r2 $\sim$ (Anger + Gender + btype + situ)\^{}2 + (1|id) \\ \hspace*{6ex} + (1|item), family = binomial, data = VerbAgg)}} \\ [3ex] \pkg{brms} & \parbox{13cm}{\code{brm(r2 $\sim$ (Anger + Gender + btype + situ)\^{}2 + (1|id) \\ \hspace*{4ex} + (1|item), family = bernoulli, data = VerbAgg)}} \\ [2ex] \hline \\ [-1.5ex] \end{tabular} \caption{Comparison of the model syntax of \pkg{lme4} and \pkg{brms} using data sets included in \pkg{lme4}. Notes: (1) Default links are used to that the link argument may be omitted. (2) Fitting this model takes some time. A proper prior on the population-level effects (e.g., \code{prior = set\_prior("normal(0,5)")}) may help in increasing sampling speed.} \label{syntax} \end{table} \section{Conclusion} The present paper is meant to provide a general overview on the \proglang{R} package \pkg{brms} implementing MLMs using the probabilistic programming language \pkg{Stan} for full Bayesian inference. Although only a small selection of the modeling options available in \pkg{brms} are discussed in detail, I hope that this article can serve as a good starting point to further explore the capabilities of the package. For the future, I have several plans on how to improve the functionality of \pkg{brms}. I want to include multivariate models that can handle multiple response variables coming from different distributions as well as new correlation structures for instance for spatial data. Similarily, distributional regression models as well as mixture response distributions appear to be valuable extensions of the package. I am always grateful for any suggestions and ideas regarding new features. \section*{Acknowledgments} First of all, I would like to thank the Stan Development Team for creating the probabilistic programming language \pkg{Stan}, which is an incredibly powerful and flexible tool for performing full Bayesian inference. Without it, \pkg{brms} could not fit a single model. Two anonymous reviewers provided very detailed and thoughtful suggestions to substantially improve both the package and the paper. Furthermore, Prof. Philipp Doebler and Prof. Heinz Holling have given valuable feedback on earlier versions of the paper. Lastly, I want to thank the many users who reported bugs or had ideas for new features, thus helping to continuously improve \pkg{brms}. \bibliography{citations_overview} \end{document} brms/inst/CITATION0000644000176200001440000000226413433003051013323 0ustar liggesusersbibentry( bibtype = "Article", title = "{brms}: An {R} Package for {Bayesian} Multilevel Models Using {Stan}", author = person(given = "Paul-Christian", family = "Bürkner"), journal = "Journal of Statistical Software", year = "2017", volume = "80", number = "1", pages = "1--28", doi = "10.18637/jss.v080.i01", header = "To cite brms in publications use:", textVersion = paste( "Paul-Christian Bürkner (2017).", "brms: An R Package for Bayesian Multilevel Models Using Stan.", "Journal of Statistical Software, 80(1), 1-28.", "doi:10.18637/jss.v080.i01" ), encoding = "UTF-8" ) bibentry( bibtype = "Article", title = "Advanced {Bayesian} Multilevel Modeling with the {R} Package {brms}", author = person(given = "Paul-Christian", family = "Bürkner"), journal = "The R Journal", year = "2018", volume = "10", number = "1", pages = "395--411", doi = "10.32614/RJ-2018-017", textVersion = paste( "Paul-Christian Bürkner (2018).", "Advanced Bayesian Multilevel Modeling with the R Package brms.", "The R Journal, 10(1), 395-411.", "doi:10.32614/RJ-2018-017" ), encoding = "UTF-8" ) brms/inst/chunks/0000755000176200001440000000000013611527526013475 5ustar liggesusersbrms/inst/chunks/fun_cloglog.stan0000644000176200001440000000030513202254050016641 0ustar liggesusers /* compute the cloglog link * Args: * p: a scalar in (0, 1) * Returns: * a scalar in (-Inf, Inf) */ real cloglog(real p) { return log(-log(1 - p)); } brms/inst/chunks/fun_cholesky_cor_ma1.stan0000644000176200001440000000115713522262066020456 0ustar liggesusers /* compute the cholesky factor of a MA1 correlation matrix * Args: * ma: MA1 autocorrelation * nrows: number of rows of the covariance matrix * Returns: * A nrows x nrows MA1 covariance matrix */ matrix cholesky_cor_ma1(real ma, int nrows) { matrix[nrows, nrows] mat; mat = diag_matrix(rep_vector(1 + ma^2, nrows)); if (nrows > 1) { mat[1, 2] = ma; for (i in 2:(nrows - 1)) { mat[i, i - 1] = ma; mat[i, i + 1] = ma; } mat[nrows, nrows - 1] = ma; } return cholesky_decompose(mat); } brms/inst/chunks/fun_scale_r_cor_by.stan0000644000176200001440000000121113254660260020170 0ustar liggesusers /* compute correlated group-level effects with 'by' variables * Args: * z: matrix of unscaled group-level effects * SD: matrix of standard deviation parameters * L: an array of cholesky factor correlation matrices * Jby: index which grouping level belongs to which by level * Returns: * matrix of scaled group-level effects */ matrix scale_r_cor_by(matrix z, matrix SD, matrix[] L, int[] Jby) { // r is stored in another dimension order than z matrix[cols(z), rows(z)] r; for (j in 1:rows(r)) { r[j] = (diag_pre_multiply(SD[, Jby[j]], L[Jby[j]]) * z[, j])'; } return r; } brms/inst/chunks/fun_cholesky_cor_ar1.stan0000644000176200001440000000120113522262066020451 0ustar liggesusers /* compute the cholesky factor of an AR1 correlation matrix * Args: * ar: AR1 autocorrelation * nrows: number of rows of the covariance matrix * Returns: * A nrows x nrows matrix */ matrix cholesky_cor_ar1(real ar, int nrows) { matrix[nrows, nrows] mat; vector[nrows - 1] gamma; mat = diag_matrix(rep_vector(1, nrows)); for (i in 2:nrows) { gamma[i - 1] = pow(ar, i - 1); for (j in 1:(i - 1)) { mat[i, j] = gamma[i - j]; mat[j, i] = gamma[i - j]; } } return cholesky_decompose(1 / (1 - ar^2) * mat); } brms/inst/chunks/fun_scale_time_err.stan0000644000176200001440000000145613611527526020217 0ustar liggesusers /* scale and correlate time-series residuals * Args: * zerr: standardized and independent residuals * sderr: standard deviation of the residuals * chol_cor: cholesky factor of the correlation matrix * nobs: number of observations in each group * begin: the first observation in each group * end: the last observation in each group * Returns: * vector of scaled and correlated residuals */ vector scale_time_err(vector zerr, real sderr, matrix chol_cor, int[] nobs, int[] begin, int[] end) { vector[rows(zerr)] err; for (i in 1:size(nobs)) { err[begin[i]:end[i]] = sderr * chol_cor[1:nobs[i], 1:nobs[i]] * zerr[begin[i]:end[i]]; } return err; } brms/inst/chunks/fun_com_poisson.stan0000644000176200001440000000756313442002443017563 0ustar liggesusers // log approximate normalizing constant of the COM poisson distribuion // approximation based on doi:10.1007/s10463-017-0629-6 // Args: see log_Z_com_poisson() real log_Z_com_poisson_approx(real log_mu, real nu) { real nu_mu = nu * exp(log_mu); real nu2 = nu^2; // first 4 terms of the residual series real log_sum_resid = log( 1 + nu_mu^(-1) * (nu2 - 1) / 24 + nu_mu^(-2) * (nu2 - 1) / 1152 * (nu2 + 23) + nu_mu^(-3) * (nu2 - 1) / 414720 * (5 * nu2^2 - 298 * nu2 + 11237) ); return nu_mu + log_sum_resid - ((log(2 * pi()) + log_mu) * (nu - 1) / 2 + log(nu) / 2); } // log normalizing constant of the COM Poisson distribution // implementation inspired by code of Ben Goodrich // Args: // log_mu: log location parameter // shape: positive shape parameter real log_Z_com_poisson(real log_mu, real nu) { real log_Z; real lfac; real term; real k; int M; real log_thres; if (nu == 1) { return exp(log_mu); } // nu == 0 or Inf will fail in this parameterization if (nu <= 0) { reject("nu must be positive"); } if (nu == positive_infinity()) { reject("nu must be finite") } if (log_mu * nu >= log(1.5) && log_mu >= log(1.5)) { return log_Z_com_poisson_approx(log_mu, nu); } // direct computation of the truncated series M = 10000; log_thres = log(1e-16); // check if the Mth term of the series is small enough if (nu * (M * log_mu - lgamma(M + 1)) > log_thres) { reject("nu is too close to zero.") } log_Z = log1p_exp(nu * log_mu); // first 2 terms of the series lfac = 0; term = 0; k = 2; while (term > log_thres) { lfac += log(k); term = nu * (k * log_mu - lfac); log_Z = log_sum_exp(log_Z, term); k += 1; } return log_Z; } // COM Poisson log-PMF for a single response (log parameterization) // Args: // y: the response value // log_mu: log location parameter // shape: positive shape parameter real com_poisson_log_lpmf(int y, real log_mu, real nu) { if (nu == 1) return poisson_log_lpmf(y | log_mu); return nu * (y * log_mu - lgamma(y + 1)) - log_Z_com_poisson(log_mu, nu); } // COM Poisson log-PMF for a single response real com_poisson_lpmf(int y, real mu, real nu) { if (nu == 1) return poisson_lpmf(y | mu); return com_poisson_log_lpmf(y | log(mu), nu); } // COM Poisson log-CDF for a single response real com_poisson_lcdf(int y, real mu, real nu) { int M; real log_thres; real log_mu; real log_num; // log numerator real log_Z; // log denominator real lfac; real term; real k; if (nu == 1) { return poisson_lcdf(y | mu); } // nu == 0 or Inf will fail in this parameterization if (nu <= 0) { reject("nu must be positive"); } if (nu == positive_infinity()) { reject("nu must be finite") } M = 10000; if (y > M) { reject("cannot handle y > 10000") } log_thres = log(1e-16); log_mu = log(mu); if (nu * (y * log_mu - lgamma(y + 1)) <= log_thres) { // y is large enough for the CDF to be very close to 1; return 0; } log_Z = log_Z_com_poisson(log_mu, nu); if (y == 0) { return -log_Z; } // first 2 terms of the series log_num = log1p_exp(nu * log_mu); if (y == 1) { return log_num - log_Z; } lfac = 0; term = 0; k = 2; while (k <= y) { lfac += log(k); term = nu * (k * log_mu - lfac); log_num = log_sum_exp(log_num, term); k += 1; } return log_num - log_Z; } // COM Poisson log-CCDF for a single response real com_poisson_lccdf(int y, real mu, real nu) { return log1m_exp(com_poisson_lcdf(y | mu, nu)); } brms/inst/chunks/fun_student_t_time.stan0000644000176200001440000000532713611527526020272 0ustar liggesusers /* multi-student-t log-PDF for time-series covariance structures * assuming homogoneous variances * Args: * y: response vector * nu: degrees of freedom parameter * mu: mean parameter vector * sigma: scale parameter * chol_cor: cholesky factor of the correlation matrix * se2: square of user defined standard errors * should be set to zero if none are defined * nobs: number of observations in each group * begin: the first observation in each group * end: the last observation in each group * Returns: * sum of the log-PDF values of all observations */ real student_t_time_hom_lpdf(vector y, real nu, vector mu, real sigma, matrix chol_cor, vector se2, int[] nobs, int[] begin, int[] end) { int I = size(nobs); int has_se = max(se2) > 0; vector[I] lp; for (i in 1:I) { matrix[nobs[i], nobs[i]] Cov; Cov = sigma * chol_cor[1:nobs[i], 1:nobs[i]]; Cov = multiply_lower_tri_self_transpose(Cov); if (has_se) { Cov += diag_matrix(se2[begin[i]:end[i]]); } lp[i] = multi_student_t_lpdf( y[begin[i]:end[i]] | nu, mu[begin[i]:end[i]], Cov ); } return sum(lp); } /* multi-student-t log-PDF for time-series covariance structures * assuming heterogenous variances * Args: * y: response vector * nu: degrees of freedom parameter * mu: mean parameter vector * sigma: scale parameter vector * chol_cor: cholesky factor of the correlation matrix * se2: square of user defined standard errors * should be set to zero if none are defined * nobs: number of observations in each group * begin: the first observation in each group * end: the last observation in each group * Returns: * sum of the log-PDF values of all observations */ real student_t_time_het_lpdf(vector y, real nu, vector mu, vector sigma, matrix chol_cor, vector se2, int[] nobs, int[] begin, int[] end) { int I = size(nobs); int has_se = max(se2) > 0; vector[I] lp; for (i in 1:I) { matrix[nobs[i], nobs[i]] Cov; Cov = diag_pre_multiply(sigma[begin[i]:end[i]], chol_cor[1:nobs[i], 1:nobs[i]]); Cov = multiply_lower_tri_self_transpose(Cov); if (has_se) { Cov += diag_matrix(se2[begin[i]:end[i]]); } lp[i] = multi_student_t_lpdf( y[begin[i]:end[i]] | nu, mu[begin[i]:end[i]], Cov ); } return sum(lp); } brms/inst/chunks/fun_horseshoe.stan0000644000176200001440000000145313202254050017217 0ustar liggesusers /* Efficient computation of the horseshoe prior * Args: * zb: standardized population-level coefficients * global: global horseshoe parameters * local: local horseshoe parameters * scale_global: global scale of the horseshoe prior * c2: positive real number for regularization * Returns: * population-level coefficients following the horseshoe prior */ vector horseshoe(vector zb, vector[] local, real[] global, real scale_global, real c2) { int K = rows(zb); vector[K] lambda = local[1] .* sqrt(local[2]); vector[K] lambda2 = square(lambda); real tau = global[1] * sqrt(global[2]) * scale_global; vector[K] lambda_tilde = sqrt(c2 * lambda2 ./ (c2 + tau^2 * lambda2)); return zb .* lambda_tilde * tau; } brms/inst/chunks/fun_zero_inflated_beta.stan0000644000176200001440000000334413277406647021070 0ustar liggesusers /* zero-inflated beta log-PDF of a single response * Args: * y: the response value * mu: mean parameter of the beta distribution * phi: precision parameter of the beta distribution * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_beta_lpdf(real y, real mu, real phi, real zi) { row_vector[2] shape = [mu * phi, (1 - mu) * phi]; if (y == 0) { return bernoulli_lpmf(1 | zi); } else { return bernoulli_lpmf(0 | zi) + beta_lpdf(y | shape[1], shape[2]); } } /* zero-inflated beta log-PDF of a single response * logit parameterization of the zero-inflation part * Args: * y: the response value * mu: mean parameter of the beta distribution * phi: precision parameter of the beta distribution * zi: linear predictor for zero-inflation part * Returns: * a scalar to be added to the log posterior */ real zero_inflated_beta_logit_lpdf(real y, real mu, real phi, real zi) { row_vector[2] shape = [mu * phi, (1 - mu) * phi]; if (y == 0) { return bernoulli_logit_lpmf(1 | zi); } else { return bernoulli_logit_lpmf(0 | zi) + beta_lpdf(y | shape[1], shape[2]); } } // zero-inflated beta log-CCDF and log-CDF functions real zero_inflated_beta_lccdf(real y, real mu, real phi, real zi) { row_vector[2] shape = [mu * phi, (1 - mu) * phi]; return bernoulli_lpmf(0 | zi) + beta_lccdf(y | shape[1], shape[2]); } real zero_inflated_beta_lcdf(real y, real mu, real phi, real zi) { return log1m_exp(zero_inflated_beta_lccdf(y | mu, phi, zi)); } brms/inst/chunks/fun_kronecker.stan0000644000176200001440000000064613202254050017206 0ustar liggesusers /* compute the kronecker product * Args: * A,B: matrices * Returns: * kronecker product of A and B */ matrix kronecker(matrix A, matrix B) { matrix[rows(A)*rows(B), cols(A)*cols(B)] kron; for (i in 1:cols(A)) { for (j in 1:rows(A)) { kron[((j-1)*rows(B)+1):(j*rows(B)), ((i-1)*cols(B)+1):(i*cols(B))] = A[j,i] * B; } } return kron; } brms/inst/chunks/fun_as_matrix.stan0000644000176200001440000000065713202254050017214 0ustar liggesusers /* turn a vector into a matrix of defined dimension * Args: * X: a vector * N: first dimension of the desired matrix * K: second dimension of the desired matrix * Returns: * a matrix of dimension N x K */ matrix as_matrix(vector X, int N, int K) { matrix[N, K] Y; for (i in 1:N) { Y[i] = to_row_vector(X[((i - 1) * K + 1):(i * K)]); } return Y; } brms/inst/chunks/fun_normal_fcor.stan0000644000176200001440000000201413611527526017532 0ustar liggesusers /* multi-normal log-PDF for fixed correlation matrices * assuming homogoneous variances * Args: * y: response vector * mu: mean parameter vector * sigma: residual standard deviation * chol_cor: cholesky factor of the correlation matrix * Returns: * sum of the log-PDF values of all observations */ real normal_fcor_hom_lpdf(vector y, vector mu, real sigma, matrix chol_cor) { return multi_normal_cholesky_lpdf(y | mu, sigma * chol_cor); } /* multi-normal log-PDF for fixed correlation matrices * assuming heterogenous variances * Args: * y: response vector * mu: mean parameter vector * sigma: residual standard deviation vector * chol_cor: cholesky factor of the correlation matrix * Returns: * sum of the log-PDF values of all observations */ real normal_fcor_het_lpdf(vector y, vector mu, vector sigma, matrix chol_cor) { return multi_normal_cholesky_lpdf(y | mu, diag_pre_multiply(sigma, chol_cor)); } brms/inst/chunks/fun_softplus.stan0000644000176200001440000000032613445662403017113 0ustar liggesusers /* softplus link function inverse to 'log1p_exp' * Args: * x: a positive scalar * Returns: * a scalar in (-Inf, Inf) */ real log_expm1(real x) { return log(expm1(x)); } brms/inst/chunks/fun_zero_inflated_poisson.stan0000644000176200001440000000610413277404740021634 0ustar liggesusers /* zero-inflated poisson log-PDF of a single response * Args: * y: the response value * lambda: mean parameter of the poisson distribution * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_poisson_lpmf(int y, real lambda, real zi) { if (y == 0) { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + poisson_lpmf(0 | lambda)); } else { return bernoulli_lpmf(0 | zi) + poisson_lpmf(y | lambda); } } /* zero-inflated poisson log-PDF of a single response * logit parameterization of the zero-inflation part * Args: * y: the response value * lambda: mean parameter of the poisson distribution * zi: linear predictor for zero-inflation part * Returns: * a scalar to be added to the log posterior */ real zero_inflated_poisson_logit_lpmf(int y, real lambda, real zi) { if (y == 0) { return log_sum_exp(bernoulli_logit_lpmf(1 | zi), bernoulli_logit_lpmf(0 | zi) + poisson_lpmf(0 | lambda)); } else { return bernoulli_logit_lpmf(0 | zi) + poisson_lpmf(y | lambda); } } /* zero-inflated poisson log-PDF of a single response * log parameterization for the poisson part * Args: * y: the response value * eta: linear predictor for poisson distribution * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_poisson_log_lpmf(int y, real eta, real zi) { if (y == 0) { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + poisson_log_lpmf(0 | eta)); } else { return bernoulli_lpmf(0 | zi) + poisson_log_lpmf(y | eta); } } /* zero-inflated poisson log-PDF of a single response * log parameterization for the poisson part * logit parameterization of the zero-inflation part * Args: * y: the response value * eta: linear predictor for poisson distribution * zi: linear predictor for zero-inflation part * Returns: * a scalar to be added to the log posterior */ real zero_inflated_poisson_log_logit_lpmf(int y, real eta, real zi) { if (y == 0) { return log_sum_exp(bernoulli_logit_lpmf(1 | zi), bernoulli_logit_lpmf(0 | zi) + poisson_log_lpmf(0 | eta)); } else { return bernoulli_logit_lpmf(0 | zi) + poisson_log_lpmf(y | eta); } } // zero-inflated poisson log-CCDF and log-CDF functions real zero_inflated_poisson_lccdf(int y, real lambda, real zi) { return bernoulli_lpmf(0 | zi) + poisson_lccdf(y | lambda); } real zero_inflated_poisson_lcdf(int y, real lambda, real zi) { return log1m_exp(zero_inflated_poisson_lccdf(y | lambda, zi)); } brms/inst/chunks/fun_gaussian_process_approx.stan0000644000176200001440000000324713432733121022172 0ustar liggesusers /* Spectral density function of a Gaussian process * Args: * x: array of numeric values of dimension NB x D * sdgp: marginal SD parameter * lscale: vector of length-scale parameters * Returns: * numeric values of the function evaluated at 'x' */ vector spd_cov_exp_quad(vector[] x, real sdgp, vector lscale) { int NB = dims(x)[1]; int D = dims(x)[2]; int Dls = rows(lscale); vector[NB] out; if (Dls == 1) { // one dimensional or isotropic GP real constant = square(sdgp) * (sqrt(2 * pi()) * lscale[1])^D; real neg_half_lscale2 = -0.5 * square(lscale[1]); for (m in 1:NB) { out[m] = constant * exp(neg_half_lscale2 * dot_self(x[m])); } } else { // multi-dimensional non-isotropic GP real constant = square(sdgp) * sqrt(2 * pi())^D * prod(lscale); vector[Dls] neg_half_lscale2 = -0.5 * square(lscale); for (m in 1:NB) { out[m] = constant * exp(dot_product(neg_half_lscale2, square(x[m]))); } } return out; } /* compute an approximate latent Gaussian process * Args: * X: Matrix of Laplacian eigen functions at the covariate values * sdgp: marginal SD parameter * lscale: vector of length-scale parameters * zgp: vector of independent standard normal variables * slambda: square root of the Laplacian eigen values * Returns: * a vector to be added to the linear predictor */ vector gpa(matrix X, real sdgp, vector lscale, vector zgp, vector[] slambda) { vector[cols(X)] diag_spd = sqrt(spd_cov_exp_quad(slambda, sdgp, lscale)); return X * (diag_spd .* zgp); } brms/inst/chunks/fun_zero_inflated_asym_laplace.stan0000644000176200001440000000455213552555374022607 0ustar liggesusers /* zero-inflated asymmetric laplace log-PDF for a single response * Args: * y: the response value * mu: location parameter * sigma: positive scale parameter * quantile: quantile parameter in (0, 1) * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_asym_laplace_lpdf(real y, real mu, real sigma, real quantile, real zi) { if (y == 0) { return bernoulli_lpmf(1 | zi); } else { return bernoulli_lpmf(0 | zi) + asym_laplace_lpdf(y | mu, sigma, quantile); } } /* zero-inflated asymmetric laplace log-PDF for a single response * Args: * y: the response value * mu: location parameter * sigma: positive scale parameter * quantile: quantile parameter in (0, 1) * zi: linear predictor of the zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_asym_laplace_logit_lpdf(real y, real mu, real sigma, real quantile, real zi) { if (y == 0) { return bernoulli_logit_lpmf(1 | zi); } else { return bernoulli_logit_lpmf(0 | zi) + asym_laplace_lpdf(y | mu, sigma, quantile); } } // zero-inflated asymmetric laplace log-CDF function real zero_inflated_asym_laplace_lcdf(real y, real mu, real sigma, real quantile, real zi) { if (y < 0) { return bernoulli_lpmf(0 | zi) + asym_laplace_lcdf(y | mu, sigma, quantile); } else { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + asym_laplace_lcdf(y | mu, sigma, quantile)); } } // zero-inflated asymmetric laplace log-CCDF function real zero_inflated_asym_laplace_lccdf(real y, real mu, real sigma, real quantile, real zi) { if (y > 0) { return bernoulli_lpmf(0 | zi) + asym_laplace_lccdf(y | mu, sigma, quantile); } else { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + asym_laplace_lccdf(y | mu, sigma, quantile)); } } brms/inst/chunks/fun_wiener_diffusion.stan0000644000176200001440000000125413202254050020556 0ustar liggesusers /* Wiener diffusion log-PDF for a single response * Args: * y: reaction time data * dec: decision data (0 or 1) * alpha: boundary separation parameter > 0 * tau: non-decision time parameter > 0 * beta: initial bias parameter in [0, 1] * delta: drift rate parameter * Returns: * a scalar to be added to the log posterior */ real wiener_diffusion_lpdf(real y, int dec, real alpha, real tau, real beta, real delta) { if (dec == 1) { return wiener_lpdf(y | alpha, tau, beta, delta); } else { return wiener_lpdf(y | alpha, tau, 1 - beta, - delta); } } brms/inst/chunks/fun_cholesky_cor_arma1.stan0000644000176200001440000000136413522262066021001 0ustar liggesusers /* compute the cholesky factor of an ARMA1 correlation matrix * Args: * ar: AR1 autocorrelation * ma: MA1 autocorrelation * nrows: number of rows of the covariance matrix * Returns: * A nrows x nrows matrix */ matrix cholesky_cor_arma1(real ar, real ma, int nrows) { matrix[nrows, nrows] mat; vector[nrows] gamma; mat = diag_matrix(rep_vector(1 + ma^2 + 2 * ar * ma, nrows)); gamma[1] = (1 + ar * ma) * (ar + ma); for (i in 2:nrows) { gamma[i] = gamma[1] * pow(ar, i - 1); for (j in 1:(i - 1)) { mat[i, j] = gamma[i - j]; mat[j, i] = gamma[i - j]; } } return cholesky_decompose(1 / (1 - ar^2) * mat); } brms/inst/chunks/fun_normal_time.stan0000644000176200001440000000534313611527526017547 0ustar liggesusers /* multi-normal log-PDF for time-series covariance structures * assuming homogoneous variances * Args: * y: response vector * mu: mean parameter vector * sigma: residual standard deviation * chol_cor: cholesky factor of the correlation matrix * se2: square of user defined standard errors * should be set to zero if none are defined * nobs: number of observations in each group * begin: the first observation in each group * end: the last observation in each group * Returns: * sum of the log-PDF values of all observations */ real normal_time_hom_lpdf(vector y, vector mu, real sigma, matrix chol_cor, vector se2, int[] nobs, int[] begin, int[] end) { int I = size(nobs); int has_se = max(se2) > 0; vector[I] lp; for (i in 1:I) { matrix[nobs[i], nobs[i]] L; L = sigma * chol_cor[1:nobs[i], 1:nobs[i]]; if (has_se) { // need to add 'se' to the correlation matrix itself L = multiply_lower_tri_self_transpose(L); L += diag_matrix(se2[begin[i]:end[i]]); L = cholesky_decompose(L); } lp[i] = multi_normal_cholesky_lpdf( y[begin[i]:end[i]] | mu[begin[i]:end[i]], L ); } return sum(lp); } /* multi-normal log-PDF for time-series covariance structures * assuming heterogenous variances * Args: * y: response vector * mu: mean parameter vector * sigma: residual standard deviation vector * chol_cor: cholesky factor of the correlation matrix * se2: square of user defined standard errors * should be set to zero if none are defined * nobs: number of observations in each group * begin: the first observation in each group * end: the last observation in each group * Returns: * sum of the log-PDF values of all observations */ real normal_time_het_lpdf(vector y, vector mu, vector sigma, matrix chol_cor, vector se2, int[] nobs, int[] begin, int[] end) { int I = size(nobs); int has_se = max(se2) > 0; vector[I] lp; for (i in 1:I) { matrix[nobs[i], nobs[i]] L; L = diag_pre_multiply(sigma[begin[i]:end[i]], chol_cor[1:nobs[i], 1:nobs[i]]); if (has_se) { // need to add 'se' to the correlation matrix itself L = multiply_lower_tri_self_transpose(L); L += diag_matrix(se2[begin[i]:end[i]]); L = cholesky_decompose(L); } lp[i] = multi_normal_cholesky_lpdf( y[begin[i]:end[i]] | mu[begin[i]:end[i]], L ); } return sum(lp); } brms/inst/chunks/fun_inv_gaussian.stan0000644000176200001440000000337513252451325017724 0ustar liggesusers /* inverse Gaussian log-PDF for a single response * Args: * y: the response value * mu: positive mean parameter * shape: positive shape parameter * Returns: * a scalar to be added to the log posterior */ real inv_gaussian_lpdf(real y, real mu, real shape) { return 0.5 * log(shape / (2 * pi())) - 1.5 * log(y) - 0.5 * shape * square((y - mu) / (mu * sqrt(y))); } /* vectorized inverse Gaussian log-PDF * Args: * y: response vector * mu: positive mean parameter vector * shape: positive shape parameter * Returns: * a scalar to be added to the log posterior */ real inv_gaussian_vector_lpdf(vector y, vector mu, real shape) { return 0.5 * rows(y) * log(shape / (2 * pi())) - 1.5 * sum(log(y)) - 0.5 * shape * dot_self((y - mu) ./ (mu .* sqrt(y))); } /* inverse Gaussian log-CDF for a single quantile * Args: * y: a quantile * mu: positive mean parameter * shape: positive shape parameter * Returns: * log(P(Y <= y)) */ real inv_gaussian_lcdf(real y, real mu, real shape) { return log(Phi(sqrt(shape) / sqrt(y) * (y / mu - 1)) + exp(2 * shape / mu) * Phi(-sqrt(shape) / sqrt(y) * (y / mu + 1))); } /* inverse Gaussian log-CCDF for a single quantile * Args: * y: a quantile * mu: positive mean parameter * shape: positive shape parameter * Returns: * log(P(Y > y)) */ real inv_gaussian_lccdf(real y, real mu, real shape) { return log(1 - Phi(sqrt(shape) / sqrt(y) * (y / mu - 1)) - exp(2 * shape / mu) * Phi(-sqrt(shape) / sqrt(y) * (y / mu + 1))); } brms/inst/chunks/fun_zero_one_inflated_beta.stan0000644000176200001440000000150013277406620021710 0ustar liggesusers /* zero-one-inflated beta log-PDF of a single response * Args: * y: response value * mu: mean parameter of the beta part * phi: precision parameter of the beta part * zoi: zero-one-inflation probability * coi: conditional one-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_one_inflated_beta_lpdf(real y, real mu, real phi, real zoi, real coi) { row_vector[2] shape = [mu * phi, (1 - mu) * phi]; if (y == 0) { return bernoulli_lpmf(1 | zoi) + bernoulli_lpmf(0 | coi); } else if (y == 1) { return bernoulli_lpmf(1 | zoi) + bernoulli_lpmf(1 | coi); } else { return bernoulli_lpmf(0 | zoi) + beta_lpdf(y | shape[1], shape[2]); } } brms/inst/chunks/fun_hurdle_gamma.stan0000644000176200001440000000276413277406136017673 0ustar liggesusers /* hurdle gamma log-PDF of a single response * Args: * y: the response value * alpha: shape parameter of the gamma distribution * beta: rate parameter of the gamma distribution * hu: hurdle probability * Returns: * a scalar to be added to the log posterior */ real hurdle_gamma_lpdf(real y, real alpha, real beta, real hu) { if (y == 0) { return bernoulli_lpmf(1 | hu); } else { return bernoulli_lpmf(0 | hu) + gamma_lpdf(y | alpha, beta); } } /* hurdle gamma log-PDF of a single response * logit parameterization of the hurdle part * Args: * y: the response value * alpha: shape parameter of the gamma distribution * beta: rate parameter of the gamma distribution * hu: linear predictor for the hurdle part * Returns: * a scalar to be added to the log posterior */ real hurdle_gamma_logit_lpdf(real y, real alpha, real beta, real hu) { if (y == 0) { return bernoulli_logit_lpmf(1 | hu); } else { return bernoulli_logit_lpmf(0 | hu) + gamma_lpdf(y | alpha, beta); } } // hurdle gamma log-CCDF and log-CDF functions real hurdle_gamma_lccdf(real y, real alpha, real beta, real hu) { return bernoulli_lpmf(0 | hu) + gamma_lccdf(y | alpha, beta); } real hurdle_gamma_lcdf(real y, real alpha, real beta, real hu) { return log1m_exp(hurdle_gamma_lccdf(y | alpha, beta, hu)); } brms/inst/chunks/fun_asym_laplace.stan0000644000176200001440000000355413202254050017656 0ustar liggesusers /* helper function for asym_laplace_lpdf * Args: * y: the response value * quantile: quantile parameter in (0, 1) */ real rho_quantile(real y, real quantile) { if (y < 0) { return y * (quantile - 1); } else { return y * quantile; } } /* asymmetric laplace log-PDF for a single response * Args: * y: the response value * mu: location parameter * sigma: positive scale parameter * quantile: quantile parameter in (0, 1) * Returns: * a scalar to be added to the log posterior */ real asym_laplace_lpdf(real y, real mu, real sigma, real quantile) { return log(quantile * (1 - quantile)) - log(sigma) - rho_quantile((y - mu) / sigma, quantile); } /* asymmetric laplace log-CDF for a single quantile * Args: * y: a quantile * mu: location parameter * sigma: positive scale parameter * quantile: quantile parameter in (0, 1) * Returns: * a scalar to be added to the log posterior */ real asym_laplace_lcdf(real y, real mu, real sigma, real quantile) { if (y < mu) { return log(quantile) + (1 - quantile) * (y - mu) / sigma; } else { return log(1 - (1 - quantile) * exp(-quantile * (y - mu) / sigma)); } } /* asymmetric laplace log-CCDF for a single quantile * Args: * y: a quantile * mu: location parameter * sigma: positive scale parameter * quantile: quantile parameter in (0, 1) * Returns: * a scalar to be added to the log posterior */ real asym_laplace_lccdf(real y, real mu, real sigma, real quantile) { if (y < mu) { return log(1 - quantile * exp((1 - quantile) * (y - mu) / sigma)); } else { return log(1 - quantile) - quantile * (y - mu) / sigma; } } brms/inst/chunks/fun_sparse_icar_lpdf.stan0000644000176200001440000000256613207755551020547 0ustar liggesusers /* Return the log probability of an intrinsic conditional autoregressive * (ICAR) prior with a sparse representation for the adjacency matrix * Full credit to Max Joseph (https://github.com/mbjoseph/CARstan) * Args: * phi: Vector containing the CAR parameters for each location * sdcar: Standard deviation parameter for the CAR prior * Nloc: Number of locations * Nedges: Number of edges (adjacency pairs) * Nneigh: Number of neighbors for each location * eigenW: Eigenvalues of D^(-1/2) * W * D^(-1/2) * edges1, edges2: Sparse representation of adjacency matrix * Details: * D = Diag(Nneigh) * Returns: * Log probability density of CAR prior up to additive constant */ real sparse_icar_lpdf(vector phi, real sdcar, int Nloc, int Nedges, vector Nneigh, vector eigenW, int[] edges1, int[] edges2) { real tau; // precision parameter row_vector[Nloc] phit_D; // phi' * D row_vector[Nloc] phit_W; // phi' * W tau = 1 / sdcar^2; phit_D = (phi .* Nneigh)'; phit_W = rep_row_vector(0, Nloc); for (i in 1:Nedges) { phit_W[edges1[i]] = phit_W[edges1[i]] + phi[edges2[i]]; phit_W[edges2[i]] = phit_W[edges2[i]] + phi[edges1[i]]; } return 0.5 * ((Nloc - 1) * log(tau) - tau * (phit_D * phi - (phit_W * phi))); } brms/inst/chunks/fun_hurdle_poisson.stan0000644000176200001440000000520213277405012020261 0ustar liggesusers /* hurdle poisson log-PDF of a single response * Args: * y: the response value * lambda: mean parameter of the poisson distribution * hu: hurdle probability * Returns: * a scalar to be added to the log posterior */ real hurdle_poisson_lpmf(int y, real lambda, real hu) { if (y == 0) { return bernoulli_lpmf(1 | hu); } else { return bernoulli_lpmf(0 | hu) + poisson_lpmf(y | lambda) - log1m_exp(-lambda); } } /* hurdle poisson log-PDF of a single response * logit parameterization of the hurdle part * Args: * y: the response value * lambda: mean parameter of the poisson distribution * hu: linear predictor for hurdle part * Returns: * a scalar to be added to the log posterior */ real hurdle_poisson_logit_lpmf(int y, real lambda, real hu) { if (y == 0) { return bernoulli_logit_lpmf(1 | hu); } else { return bernoulli_logit_lpmf(0 | hu) + poisson_lpmf(y | lambda) - log1m_exp(-lambda); } } /* hurdle poisson log-PDF of a single response * log parameterization for the poisson part * Args: * y: the response value * eta: linear predictor for poisson part * hu: hurdle probability * Returns: * a scalar to be added to the log posterior */ real hurdle_poisson_log_lpmf(int y, real eta, real hu) { if (y == 0) { return bernoulli_lpmf(1 | hu); } else { return bernoulli_lpmf(0 | hu) + poisson_log_lpmf(y | eta) - log1m_exp(-exp(eta)); } } /* hurdle poisson log-PDF of a single response * log parameterization for the poisson part * logit parameterization of the hurdle part * Args: * y: the response value * eta: linear predictor for poisson part * hu: linear predictor for hurdle part * Returns: * a scalar to be added to the log posterior */ real hurdle_poisson_log_logit_lpmf(int y, real eta, real hu) { if (y == 0) { return bernoulli_logit_lpmf(1 | hu); } else { return bernoulli_logit_lpmf(0 | hu) + poisson_log_lpmf(y | eta) - log1m_exp(-exp(eta)); } } // hurdle poisson log-CCDF and log-CDF functions real hurdle_poisson_lccdf(int y, real lambda, real hu) { return bernoulli_lpmf(0 | hu) + poisson_lccdf(y | lambda) - log1m_exp(-lambda); } real hurdle_poisson_lcdf(int y, real lambda, real hu) { return log1m_exp(hurdle_poisson_lccdf(y | lambda, hu)); } brms/inst/chunks/fun_zero_inflated_negbinomial.stan0000644000176200001440000000740013277405036022425 0ustar liggesusers /* zero-inflated negative binomial log-PDF of a single response * Args: * y: the response value * mu: mean parameter of negative binomial distribution * phi: shape parameter of negative binomial distribution * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_neg_binomial_lpmf(int y, real mu, real phi, real zi) { if (y == 0) { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + neg_binomial_2_lpmf(0 | mu, phi)); } else { return bernoulli_lpmf(0 | zi) + neg_binomial_2_lpmf(y | mu, phi); } } /* zero-inflated negative binomial log-PDF of a single response * logit parameterization of the zero-inflation part * Args: * y: the response value * mu: mean parameter of negative binomial distribution * phi: shape parameter of negative binomial distribution * zi: linear predictor for zero-inflation part * Returns: * a scalar to be added to the log posterior */ real zero_inflated_neg_binomial_logit_lpmf(int y, real mu, real phi, real zi) { if (y == 0) { return log_sum_exp(bernoulli_logit_lpmf(1 | zi), bernoulli_logit_lpmf(0 | zi) + neg_binomial_2_lpmf(0 | mu, phi)); } else { return bernoulli_logit_lpmf(0 | zi) + neg_binomial_2_lpmf(y | mu, phi); } } /* zero-inflated negative binomial log-PDF of a single response * log parameterization for the negative binomial part * Args: * y: the response value * eta: linear predictor for negative binomial distribution * phi: shape parameter of negative binomial distribution * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_neg_binomial_log_lpmf(int y, real eta, real phi, real zi) { if (y == 0) { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + neg_binomial_2_log_lpmf(0 | eta, phi)); } else { return bernoulli_lpmf(0 | zi) + neg_binomial_2_log_lpmf(y | eta, phi); } } /* zero-inflated negative binomial log-PDF of a single response * log parameterization for the negative binomial part * logit parameterization of the zero-inflation part * Args: * y: the response value * eta: linear predictor for negative binomial distribution * phi: shape parameter of negative binomial distribution * zi: linear predictor for zero-inflation part * Returns: * a scalar to be added to the log posterior */ real zero_inflated_neg_binomial_log_logit_lpmf(int y, real eta, real phi, real zi) { if (y == 0) { return log_sum_exp(bernoulli_logit_lpmf(1 | zi), bernoulli_logit_lpmf(0 | zi) + neg_binomial_2_log_lpmf(0 | eta, phi)); } else { return bernoulli_logit_lpmf(0 | zi) + neg_binomial_2_log_lpmf(y | eta, phi); } } // zero_inflated negative binomial log-CCDF and log-CDF functions real zero_inflated_neg_binomial_lccdf(int y, real mu, real phi, real hu) { return bernoulli_lpmf(0 | hu) + neg_binomial_2_lccdf(y | mu, phi); } real zero_inflated_neg_binomial_lcdf(int y, real mu, real phi, real hu) { return log1m_exp(zero_inflated_neg_binomial_lccdf(y | mu, phi, hu)); } brms/inst/chunks/fun_tan_half.stan0000644000176200001440000000063413202254050016774 0ustar liggesusers /* compute the tan_half link * Args: * x: a scalar in (-pi, pi) * Returns: * a scalar in (-Inf, Inf) */ real tan_half(real x) { return tan(x / 2); } /* compute the inverse of the tan_half link * Args: * y: a scalar in (-Inf, Inf) * Returns: * a scalar in (-pi, pi) */ real inv_tan_half(real y) { return 2 * atan(y); } brms/inst/chunks/fun_normal_errorsar.stan0000644000176200001440000000155213522630123020433 0ustar liggesusers /* normal log-pdf for spatially lagged residuals * Args: * y: the response vector * mu: mean parameter vector * sigma: residual standard deviation * rho: positive autoregressive parameter * W: spatial weight matrix * eigenW: precomputed eigenvalues of W * Returns: * a scalar to be added to the log posterior */ real normal_errorsar_lpdf(vector y, vector mu, real sigma, real rho, matrix W, vector eigenW) { int N = rows(y); real inv_sigma2 = 1 / square(sigma); matrix[N, N] W_tilde = -rho * W; vector[N] half_pred; real log_det; for (n in 1:N) W_tilde[n, n] += 1; half_pred = W_tilde * (y - mu); log_det = sum(log1m(rho * eigenW)); return 0.5 * N * log(inv_sigma2) + log_det - 0.5 * dot_self(half_pred) * inv_sigma2; } brms/inst/chunks/fun_discrete_weibull.stan0000644000176200001440000000125213442002443020545 0ustar liggesusers /* discrete Weibull log-PMF for a single response * Args: * y: the response value * mu: location parameter on the unit interval * shape: positive shape parameter * Returns: * a scalar to be added to the log posterior */ real discrete_weibull_lpmf(int y, real mu, real shape) { return log(mu^y^shape - mu^(y+1)^shape); } // discrete Weibull log-CDF for a single response real discrete_weibull_lcdf(int y, real mu, real shape) { return log(1 - mu^(y + 1)^shape); } // discrete Weibull log-CCDF for a single response real discrete_weibull_lccdf(int y, real mu, real shape) { return log(mu) * (y + 1)^shape; } brms/inst/chunks/fun_student_t_fcor.stan0000644000176200001440000000256013611527526020261 0ustar liggesusers /* multi-student-t log-PDF for fixed correlation matrices * assuming homogoneous variances * Args: * y: response vector * nu: degrees of freedom parameter * mu: mean parameter vector * sigma: scale parameter * chol_cor: cholesky factor of the correlation matrix * Returns: * sum of the log-PDF values of all observations */ real student_t_fcor_hom_lpdf(vector y, real nu, vector mu, real sigma, matrix chol_cor) { int N = rows(chol_cor); matrix[N, N] Cov = multiply_lower_tri_self_transpose(sigma * chol_cor); return multi_student_t_lpdf(y | nu, mu, Cov); } /* multi-student-t log-PDF for fixed correlation matrices * assuming heterogenous variances * Args: * y: response vector * nu: degrees of freedom parameter * mu: mean parameter vector * sigma: scale parameter vector * chol_cor: cholesky factor of the correlation matrix * Returns: * sum of the log-PDF values of all observations */ real student_t_fcor_het_lpdf(vector y, real nu, vector mu, vector sigma, matrix chol_cor) { int N = rows(chol_cor); matrix[N, N] Cov = diag_pre_multiply(sigma, chol_cor); Cov = multiply_lower_tri_self_transpose(Cov); return multi_student_t_lpdf(y | nu, mu, Cov); } brms/inst/chunks/fun_dirichlet_logit.stan0000644000176200001440000000055613433314270020377 0ustar liggesusers /* dirichlet-logit log-PDF * Args: * y: vector of real response values * mu: vector of category logit probabilities * phi: precision parameter * Returns: * a scalar to be added to the log posterior */ real dirichlet_logit_lpdf(vector y, vector mu, real phi) { return dirichlet_lpdf(y | softmax(mu) * phi); } brms/inst/chunks/fun_logm1.stan0000644000176200001440000000060113202254050016231 0ustar liggesusers /* compute the logm1 link * Args: * p: a positive scalar * Returns: * a scalar in (-Inf, Inf) */ real logm1(real y) { return log(y - 1); } /* compute the inverse of the logm1 link * Args: * y: a scalar in (-Inf, Inf) * Returns: * a positive scalar */ real expp1(real y) { return exp(y) + 1; } brms/inst/chunks/fun_normal_lagsar.stan0000644000176200001440000000154513522630123020047 0ustar liggesusers /* normal log-pdf for spatially lagged responses * Args: * y: the response vector * mu: mean parameter vector * sigma: residual standard deviation * rho: positive autoregressive parameter * W: spatial weight matrix * eigenW: precomputed eigenvalues of W * Returns: * a scalar to be added to the log posterior */ real normal_lagsar_lpdf(vector y, vector mu, real sigma, real rho, matrix W, vector eigenW) { int N = rows(y); real inv_sigma2 = 1 / square(sigma); matrix[N, N] W_tilde = -rho * W; vector[N] half_pred; real log_det; for (n in 1:N) W_tilde[n, n] += 1; half_pred = W_tilde * y - mu; log_det = sum(log1m(rho * eigenW)); return 0.5 * N * log(inv_sigma2) + log_det - 0.5 * dot_self(half_pred) * inv_sigma2; } brms/inst/chunks/fun_student_t_errorsar.stan0000644000176200001440000000206313522630123021152 0ustar liggesusers /* student-t log-pdf for spatially lagged residuals * Args: * y: the response vector * nu: degrees of freedom parameter * mu: mean parameter vector * sigma: residual scale parameter * rho: positive autoregressive parameter * W: spatial weight matrix * eigenW: precomputed eigenvalues of W * Returns: * a scalar to be added to the log posterior */ real student_t_errorsar_lpdf(vector y, real nu, vector mu, real sigma, real rho, matrix W, vector eigenW) { int N = rows(y); real K = rows(y); // avoid integer division warning real inv_sigma2 = 1 / square(sigma); matrix[N, N] W_tilde = -rho * W; vector[N] half_pred; real log_det; for (n in 1:N) W_tilde[n, n] += 1; half_pred = W_tilde * (y - mu); log_det = sum(log1m(rho * eigenW)); return - K / 2 * log(nu) + lgamma((nu + K) / 2) - lgamma(nu / 2) + 0.5 * K * log(inv_sigma2) + log_det - (nu + K) / 2 * log(1 + dot_self(half_pred) * inv_sigma2 / nu); } brms/inst/chunks/fun_cauchit.stan0000644000176200001440000000064513202254050016642 0ustar liggesusers /* compute the cauchit link * Args: * p: a scalar in (0, 1) * Returns: * a scalar in (-Inf, Inf) */ real cauchit(real p) { return tan(pi() * (p - 0.5)); } /* compute the inverse of the cauchit link * Args: * y: a scalar in (-Inf, Inf) * Returns: * a scalar in (0, 1) */ real inv_cauchit(real y) { return cauchy_cdf(y, 0, 1); } brms/inst/chunks/fun_sparse_car_lpdf.stan0000644000176200001440000000305313207755551020366 0ustar liggesusers /* Return the log probability of a proper conditional autoregressive (CAR) * prior with a sparse representation for the adjacency matrix * Full credit to Max Joseph (https://github.com/mbjoseph/CARstan) * Args: * phi: Vector containing the CAR parameters for each location * car: Dependence (usually spatial) parameter for the CAR prior * sdcar: Standard deviation parameter for the CAR prior * Nloc: Number of locations * Nedges: Number of edges (adjacency pairs) * Nneigh: Number of neighbors for each location * eigenW: Eigenvalues of D^(-1/2) * W * D^(-1/2) * edges1, edges2: Sparse representation of adjacency matrix * Details: * D = Diag(Nneigh) * Returns: * Log probability density of CAR prior up to additive constant */ real sparse_car_lpdf(vector phi, real car, real sdcar, int Nloc, int Nedges, vector Nneigh, vector eigenW, int[] edges1, int[] edges2) { real tau; // precision parameter row_vector[Nloc] phit_D; // phi' * D row_vector[Nloc] phit_W; // phi' * W vector[Nloc] ldet; tau = 1 / sdcar^2; phit_D = (phi .* Nneigh)'; phit_W = rep_row_vector(0, Nloc); for (i in 1:Nedges) { phit_W[edges1[i]] = phit_W[edges1[i]] + phi[edges2[i]]; phit_W[edges2[i]] = phit_W[edges2[i]] + phi[edges1[i]]; } for (i in 1:Nloc) { ldet[i] = log1m(car * eigenW[i]); } return 0.5 * (Nloc * log(tau) + sum(ldet) - tau * (phit_D * phi - car * (phit_W * phi))); } brms/inst/chunks/fun_zero_inflated_binomial.stan0000644000176200001440000000715713277405242021743 0ustar liggesusers /* zero-inflated binomial log-PDF of a single response * Args: * y: the response value * trials: number of trials of the binomial part * theta: probability parameter of the binomial part * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_binomial_lpmf(int y, int trials, real theta, real zi) { if (y == 0) { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + binomial_lpmf(0 | trials, theta)); } else { return bernoulli_lpmf(0 | zi) + binomial_lpmf(y | trials, theta); } } /* zero-inflated binomial log-PDF of a single response * logit parameterization of the zero-inflation part * Args: * y: the response value * trials: number of trials of the binomial part * theta: probability parameter of the binomial part * zi: linear predictor for zero-inflation part * Returns: * a scalar to be added to the log posterior */ real zero_inflated_binomial_logit_lpmf(int y, int trials, real theta, real zi) { if (y == 0) { return log_sum_exp(bernoulli_logit_lpmf(1 | zi), bernoulli_logit_lpmf(0 | zi) + binomial_lpmf(0 | trials, theta)); } else { return bernoulli_logit_lpmf(0 | zi) + binomial_lpmf(y | trials, theta); } } /* zero-inflated binomial log-PDF of a single response * logit parameterization of the binomial part * Args: * y: the response value * trials: number of trials of the binomial part * eta: linear predictor for binomial part * zi: zero-inflation probability * Returns: * a scalar to be added to the log posterior */ real zero_inflated_binomial_blogit_lpmf(int y, int trials, real eta, real zi) { if (y == 0) { return log_sum_exp(bernoulli_lpmf(1 | zi), bernoulli_lpmf(0 | zi) + binomial_logit_lpmf(0 | trials, eta)); } else { return bernoulli_lpmf(0 | zi) + binomial_logit_lpmf(y | trials, eta); } } /* zero-inflated binomial log-PDF of a single response * logit parameterization of the binomial part * logit parameterization of the zero-inflation part * Args: * y: the response value * trials: number of trials of the binomial part * eta: linear predictor for binomial part * zi: linear predictor for zero-inflation part * Returns: * a scalar to be added to the log posterior */ real zero_inflated_binomial_blogit_logit_lpmf(int y, int trials, real eta, real zi) { if (y == 0) { return log_sum_exp(bernoulli_logit_lpmf(1 | zi), bernoulli_logit_lpmf(0 | zi) + binomial_logit_lpmf(0 | trials, eta)); } else { return bernoulli_logit_lpmf(0 | zi) + binomial_logit_lpmf(y | trials, eta); } } // zero-inflated binomial log-CCDF and log-CDF functions real zero_inflated_binomial_lccdf(int y, int trials, real theta, real zi) { return bernoulli_lpmf(0 | zi) + binomial_lccdf(y | trials, theta); } real zero_inflated_binomial_lcdf(int y, int trials, real theta, real zi) { return log1m_exp(zero_inflated_binomial_lccdf(y | trials, theta, zi)); } brms/inst/chunks/fun_cox.stan0000644000176200001440000000276113522262066016027 0ustar liggesusers /* distribution functions of the Cox proportional hazards model * parameterize hazard(t) = baseline(t) * mu * so that higher values of 'mu' imply lower survival times * Args:. * y: the response value; currently ignored as the relevant * information is passed via 'bhaz' and 'cbhaz' * mu: positive location parameter * bhaz: baseline hazard * cbhaz: cumulative baseline hazard */ real cox_lhaz(real y, real mu, real bhaz, real cbhaz) { return log(bhaz) + log(mu); } real cox_lccdf(real y, real mu, real bhaz, real cbhaz) { // equivalent to the log survival function return - cbhaz * mu; } real cox_lcdf(real y, real mu, real bhaz, real cbhaz) { return log1m_exp(cox_lccdf(y | mu, bhaz, cbhaz)); } real cox_lpdf(real y, real mu, real bhaz, real cbhaz) { return cox_lhaz(y, mu, bhaz, cbhaz) + cox_lccdf(y | mu, bhaz, cbhaz); } // Distribution functions of the Cox model in log parameterization real cox_log_lhaz(real y, real log_mu, real bhaz, real cbhaz) { return log(bhaz) + log_mu; } real cox_log_lccdf(real y, real log_mu, real bhaz, real cbhaz) { return - cbhaz * exp(log_mu); } real cox_log_lcdf(real y, real log_mu, real bhaz, real cbhaz) { return log1m_exp(cox_log_lccdf(y | log_mu, bhaz, cbhaz)); } real cox_log_lpdf(real y, real log_mu, real bhaz, real cbhaz) { return cox_log_lhaz(y, log_mu, bhaz, cbhaz) + cox_log_lccdf(y | log_mu, bhaz, cbhaz); } brms/inst/chunks/fun_cholesky_cor_cosy.stan0000644000176200001440000000110213522262066020743 0ustar liggesusers /* compute the cholesky factor of a compound symmetry correlation matrix * Args: * cosy: compound symmetry correlation * nrows: number of rows of the covariance matrix * Returns: * A nrows x nrows covariance matrix */ matrix cholesky_cor_cosy(real cosy, int nrows) { matrix[nrows, nrows] mat; mat = diag_matrix(rep_vector(1, nrows)); for (i in 2:nrows) { for (j in 1:(i - 1)) { mat[i, j] = cosy; mat[j, i] = mat[i, j]; } } return cholesky_decompose(mat); } brms/inst/chunks/fun_von_mises.stan0000644000176200001440000000216213202254050017220 0ustar liggesusers /* von Mises log-PDF of a single response * for kappa > 100 the normal approximation is used * for reasons of numerial stability * Args: * y: the response vector between -pi and pi * mu: location parameter vector * kappa: precision parameter * Returns: * a scalar to be added to the log posterior */ real von_mises_real_lpdf(real y, real mu, real kappa) { if (kappa < 100) { return von_mises_lpdf(y | mu, kappa); } else { return normal_lpdf(y | mu, sqrt(1 / kappa)); } } /* von Mises log-PDF of a response vector * for kappa > 100 the normal approximation is used * for reasons of numerial stability * Args: * y: the response vector between -pi and pi * mu: location parameter vector * kappa: precision parameter * Returns: * a scalar to be added to the log posterior */ real von_mises_vector_lpdf(vector y, vector mu, real kappa) { if (kappa < 100) { return von_mises_lpdf(y | mu, kappa); } else { return normal_lpdf(y | mu, sqrt(1 / kappa)); } } brms/inst/chunks/fun_scale_xi.stan0000644000176200001440000000213013254660260017013 0ustar liggesusers /* scale auxiliary parameter xi to a suitable region * expecting sigma to be a scalar * Args: * xi: unscaled shape parameter * y: response values * mu: location parameter * sigma: scale parameter * Returns: * scaled shape parameter xi */ real scale_xi(real xi, vector y, vector mu, real sigma) { vector[rows(y)] x = (y - mu) / sigma; vector[2] bounds = [-inv(min(x)), -inv(max(x))]'; real lb = min(bounds); real ub = max(bounds); return inv_logit(xi) * (ub - lb) + lb; } /* scale auxiliary parameter xi to a suitable region * expecting sigma to be a vector * Args: * xi: unscaled shape parameter * y: response values * mu: location parameter * sigma: scale parameter * Returns: * scaled shape parameter xi */ real scale_xi_vector(real xi, vector y, vector mu, vector sigma) { vector[rows(y)] x = (y - mu) ./ sigma; vector[2] bounds = [-inv(min(x)), -inv(max(x))]'; real lb = min(bounds); real ub = max(bounds); return inv_logit(xi) * (ub - lb) + lb; } brms/inst/chunks/fun_monotonic.stan0000644000176200001440000000047413450601533017236 0ustar liggesusers /* compute monotonic effects * Args: * scale: a simplex parameter * i: index to sum over the simplex * Returns: * a scalar between 0 and 1 */ real mo(vector scale, int i) { if (i == 0) { return 0; } else { return rows(scale) * sum(scale[1:i]); } } brms/inst/chunks/fun_gen_extreme_value.stan0000644000176200001440000000264513254660260020735 0ustar liggesusers /* generalized extreme value log-PDF for a single response * Args: * y: the response value * mu: location parameter * sigma: scale parameter * xi: shape parameter * Returns: * a scalar to be added to the log posterior */ real gen_extreme_value_lpdf(real y, real mu, real sigma, real xi) { real x = (y - mu) / sigma; if (xi == 0) { return - log(sigma) - x - exp(-x); } else { real t = 1 + xi * x; real inv_xi = 1 / xi; return - log(sigma) - (1 + inv_xi) * log(t) - pow(t, -inv_xi); } } /* generalized extreme value log-CDF for a single response * Args: * y: a quantile * mu: location parameter * sigma: scale parameter * xi: shape parameter * Returns: * log(P(Y <= y)) */ real gen_extreme_value_lcdf(real y, real mu, real sigma, real xi) { real x = (y - mu) / sigma; if (xi == 0) { return - exp(-x); } else { return - pow(1 + xi * x, - 1 / xi); } } /* generalized extreme value log-CCDF for a single response * Args: * y: a quantile * mu: location parameter * sigma: scale parameter * xi: shape parameter * Returns: * log(P(Y > y)) */ real gen_extreme_value_lccdf(real y, real mu, real sigma, real xi) { return log1m_exp(gen_extreme_value_lcdf(y | mu, sigma, xi)); } brms/inst/chunks/fun_hurdle_negbinomial.stan0000644000176200001440000000624713277405027021073 0ustar liggesusers /* hurdle negative binomial log-PDF of a single response * Args: * y: the response value * mu: mean parameter of negative binomial distribution * phi: shape parameter of negative binomial distribution * hu: hurdle probability * Returns: * a scalar to be added to the log posterior */ real hurdle_neg_binomial_lpmf(int y, real mu, real phi, real hu) { if (y == 0) { return bernoulli_lpmf(1 | hu); } else { return bernoulli_lpmf(0 | hu) + neg_binomial_2_lpmf(y | mu, phi) - log(1 - (phi / (mu + phi))^phi); } } /* hurdle negative binomial log-PDF of a single response * logit parameterization for the hurdle part * Args: * y: the response value * mu: mean parameter of negative binomial distribution * phi: phi parameter of negative binomial distribution * hu: linear predictor of hurdle part * Returns: * a scalar to be added to the log posterior */ real hurdle_neg_binomial_logit_lpmf(int y, real mu, real phi, real hu) { if (y == 0) { return bernoulli_logit_lpmf(1 | hu); } else { return bernoulli_logit_lpmf(0 | hu) + neg_binomial_2_lpmf(y | mu, phi) - log(1 - (phi / (mu + phi))^phi); } } /* hurdle negative binomial log-PDF of a single response * log parameterization for the negative binomial part * Args: * y: the response value * eta: linear predictor for negative binomial distribution * phi phi parameter of negative binomial distribution * hu: hurdle probability * Returns: * a scalar to be added to the log posterior */ real hurdle_neg_binomial_log_lpmf(int y, real eta, real phi, real hu) { if (y == 0) { return bernoulli_lpmf(1 | hu); } else { return bernoulli_lpmf(0 | hu) + neg_binomial_2_log_lpmf(y | eta, phi) - log(1 - (phi / (exp(eta) + phi))^phi); } } /* hurdle negative binomial log-PDF of a single response * log parameterization for the negative binomial part * logit parameterization for the hurdle part * Args: * y: the response value * eta: linear predictor for negative binomial distribution * phi: phi parameter of negative binomial distribution * hu: linear predictor of hurdle part * Returns: * a scalar to be added to the log posterior */ real hurdle_neg_binomial_log_logit_lpmf(int y, real eta, real phi, real hu) { if (y == 0) { return bernoulli_logit_lpmf(1 | hu); } else { return bernoulli_logit_lpmf(0 | hu) + neg_binomial_2_log_lpmf(y | eta, phi) - log(1 - (phi / (exp(eta) + phi))^phi); } } // hurdle negative binomial log-CCDF and log-CDF functions real hurdle_neg_binomial_lccdf(int y, real mu, real phi, real hu) { return bernoulli_lpmf(0 | hu) + neg_binomial_2_lccdf(y | mu, phi) - log(1 - (phi / (mu + phi))^phi); } real hurdle_neg_binomial_lcdf(int y, real mu, real phi, real hu) { return log1m_exp(hurdle_neg_binomial_lccdf(y | mu, phi, hu)); } brms/inst/chunks/fun_hurdle_lognormal.stan0000644000176200001440000000302713277406150020570 0ustar liggesusers /* hurdle lognormal log-PDF of a single response * Args: * y: the response value * mu: mean parameter of the lognormal distribution * sigma: sd parameter of the lognormal distribution * hu: hurdle probability * Returns: * a scalar to be added to the log posterior */ real hurdle_lognormal_lpdf(real y, real mu, real sigma, real hu) { if (y == 0) { return bernoulli_lpmf(1 | hu); } else { return bernoulli_lpmf(0 | hu) + lognormal_lpdf(y | mu, sigma); } } /* hurdle lognormal log-PDF of a single response * logit parameterization of the hurdle part * Args: * y: the response value * mu: mean parameter of the lognormal distribution * sigma: sd parameter of the lognormal distribution * hu: linear predictor for the hurdle part * Returns: * a scalar to be added to the log posterior */ real hurdle_lognormal_logit_lpdf(real y, real mu, real sigma, real hu) { if (y == 0) { return bernoulli_logit_lpmf(1 | hu); } else { return bernoulli_logit_lpmf(0 | hu) + lognormal_lpdf(y | mu, sigma); } } // hurdle lognormal log-CCDF and log-CDF functions real hurdle_lognormal_lccdf(real y, real mu, real sigma, real hu) { return bernoulli_lpmf(0 | hu) + lognormal_lccdf(y | mu, sigma); } real hurdle_lognormal_lcdf(real y, real mu, real sigma, real hu) { return log1m_exp(hurdle_lognormal_lccdf(y | mu, sigma, hu)); } brms/inst/chunks/fun_multinomial_logit.stan0000644000176200001440000000050413433314270020753 0ustar liggesusers /* multinomial-logit log-PMF * Args: * y: array of integer response values * mu: vector of category logit probabilities * Returns: * a scalar to be added to the log posterior */ real multinomial_logit_lpmf(int[] y, vector mu) { return multinomial_lpmf(y | softmax(mu)); } brms/inst/chunks/fun_student_t_lagsar.stan0000644000176200001440000000205713522630123020567 0ustar liggesusers /* student-t log-pdf for spatially lagged responses * Args: * y: the response vector * nu: degrees of freedom parameter * mu: mean parameter vector * sigma: residual scale parameter * rho: positive autoregressive parameter * W: spatial weight matrix * eigenW: precomputed eigenvalues of W * Returns: * a scalar to be added to the log posterior */ real student_t_lagsar_lpdf(vector y, real nu, vector mu, real sigma, real rho, matrix W, vector eigenW) { int N = rows(y); real K = rows(y); // avoid integer division warning real inv_sigma2 = 1 / square(sigma); matrix[N, N] W_tilde = -rho * W; vector[N] half_pred; real log_det; for (n in 1:N) W_tilde[n, n] += 1; half_pred = W_tilde * y - mu; log_det = sum(log1m(rho * eigenW)); return - K / 2 * log(nu) + lgamma((nu + K) / 2) - lgamma(nu / 2) + 0.5 * K * log(inv_sigma2) + log_det - (nu + K) / 2 * log(1 + dot_self(half_pred) * inv_sigma2 / nu); } brms/inst/chunks/fun_gaussian_process.stan0000644000176200001440000000165013407022764020603 0ustar liggesusers /* compute a latent Gaussian process * Args: * x: array of continuous predictor values * sdgp: marginal SD parameter * lscale: length-scale parameter * zgp: vector of independent standard normal variables * Returns: * a vector to be added to the linear predictor */ vector gp(vector[] x, real sdgp, vector lscale, vector zgp) { int Dls = rows(lscale); int N = size(x); matrix[N, N] cov; if (Dls == 1) { // one dimensional or isotropic GP cov = cov_exp_quad(x, sdgp, lscale[1]); } else { // multi-dimensional non-isotropic GP cov = cov_exp_quad(x[, 1], sdgp, lscale[1]); for (d in 2:Dls) { cov = cov .* cov_exp_quad(x[, d], 1, lscale[d]); } } for (n in 1:N) { // deal with numerical non-positive-definiteness cov[n, n] += 1e-12; } return cholesky_decompose(cov) * zgp; }