effectsize/0000755000176200001440000000000013613501553012403 5ustar liggesuserseffectsize/NAMESPACE0000644000176200001440000001537413613235245013636 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(change_scale,data.frame) S3method(change_scale,factor) S3method(change_scale,grouped_df) S3method(change_scale,numeric) S3method(cohens_f,anova) S3method(cohens_f,aov) S3method(cohens_f,aovlist) S3method(cohens_f,glm) S3method(cohens_f,lm) S3method(epsilon_squared,anova) S3method(epsilon_squared,aov) S3method(epsilon_squared,aovlist) S3method(epsilon_squared,glm) S3method(epsilon_squared,lm) S3method(epsilon_squared,merMod) S3method(eta_squared,anova) S3method(eta_squared,aov) S3method(eta_squared,aovlist) S3method(eta_squared,glm) S3method(eta_squared,lm) S3method(eta_squared,merMod) S3method(interpret_parameters,lm) S3method(normalize,data.frame) S3method(normalize,factor) S3method(normalize,grouped_df) S3method(normalize,numeric) S3method(odds_to_probs,data.frame) S3method(odds_to_probs,double) S3method(odds_to_probs,numeric) S3method(omega_squared,anova) S3method(omega_squared,aov) S3method(omega_squared,aovlist) S3method(omega_squared,glm) S3method(omega_squared,lm) S3method(omega_squared,merMod) S3method(print,rules) S3method(probs_to_odds,data.frame) S3method(probs_to_odds,double) S3method(probs_to_odds,numeric) S3method(ranktransform,data.frame) S3method(ranktransform,factor) S3method(ranktransform,grouped_df) S3method(ranktransform,numeric) S3method(standardize,AsIs) S3method(standardize,LORgee) S3method(standardize,MixMod) S3method(standardize,Surv) S3method(standardize,betareg) S3method(standardize,biglm) S3method(standardize,bracl) S3method(standardize,brmsfit) S3method(standardize,brmultinom) S3method(standardize,censReg) S3method(standardize,cgam) S3method(standardize,cglm) S3method(standardize,character) S3method(standardize,clm) S3method(standardize,clm2) S3method(standardize,complmrob) S3method(standardize,coxme) S3method(standardize,coxph) S3method(standardize,cpglm) S3method(standardize,cpglmm) S3method(standardize,crch) S3method(standardize,crq) S3method(standardize,data.frame) S3method(standardize,factor) S3method(standardize,feis) S3method(standardize,fixest) S3method(standardize,flexsurvreg) S3method(standardize,gee) S3method(standardize,geeglm) S3method(standardize,glmRob) S3method(standardize,glmmTMB) S3method(standardize,glmmadmb) S3method(standardize,glmrob) S3method(standardize,gls) S3method(standardize,grouped_df) S3method(standardize,hurdle) S3method(standardize,iv_robust) S3method(standardize,ivreg) S3method(standardize,lm) S3method(standardize,lmRob) S3method(standardize,lm_robust) S3method(standardize,lme) S3method(standardize,lmrob) S3method(standardize,logical) S3method(standardize,logistf) S3method(standardize,lrm) S3method(standardize,merMod) S3method(standardize,mixor) S3method(standardize,mlm) S3method(standardize,negbin) S3method(standardize,nlrq) S3method(standardize,numeric) S3method(standardize,ols) S3method(standardize,plm) S3method(standardize,psm) S3method(standardize,rms) S3method(standardize,rq) S3method(standardize,speedglm) S3method(standardize,speedlm) S3method(standardize,stanreg) S3method(standardize,tobit) S3method(standardize,truncreg) S3method(standardize,vglm) S3method(standardize,wbgee) S3method(standardize,wbm) S3method(standardize,zerocount) S3method(standardize,zeroinfl) export(F_to_d) export(F_to_epsilon2) export(F_to_eta2) export(F_to_eta2_adj) export(F_to_omega2) export(F_to_r) export(adjust) export(change_scale) export(chisq_to_cramers_v) export(chisq_to_phi) export(cohens_d) export(cohens_f) export(convert_F_to_d) export(convert_F_to_r) export(convert_chisq_to_cramers_v) export(convert_chisq_to_phi) export(convert_d_to_odds) export(convert_d_to_percentage) export(convert_d_to_r) export(convert_odds_to_d) export(convert_odds_to_probs) export(convert_odds_to_r) export(convert_percentage_to_d) export(convert_percentile_to_z) export(convert_phi_to_chisq) export(convert_posteriors_to_r) export(convert_posteriors_to_t) export(convert_probs_to_odds) export(convert_r_to_d) export(convert_r_to_odds) export(convert_r_to_t) export(convert_r_to_z) export(convert_t_to_d) export(convert_t_to_r) export(convert_z_to_d) export(convert_z_to_percentile) export(convert_z_to_r) export(d_to_odds) export(d_to_percentage) export(d_to_r) export(epsilon_squared) export(eta_squared) export(eta_squared_adj) export(format_standardize) export(glass_delta) export(hedges_g) export(interpret) export(interpret_agfi) export(interpret_bf) export(interpret_cfi) export(interpret_d) export(interpret_delta) export(interpret_direction) export(interpret_ess) export(interpret_g) export(interpret_gfi) export(interpret_ifi) export(interpret_nfi) export(interpret_nnfi) export(interpret_odds) export(interpret_omega_squared) export(interpret_p) export(interpret_parameters) export(interpret_pnfi) export(interpret_r) export(interpret_r2) export(interpret_rfi) export(interpret_rhat) export(interpret_rmsea) export(interpret_rope) export(interpret_srmr) export(is.rules) export(mad_pooled) export(normalize) export(odds_to_d) export(odds_to_probs) export(odds_to_r) export(omega_squared) export(percentage_to_d) export(percentile_to_z) export(phi_to_chisq) export(posteriors_to_r) export(posteriors_to_t) export(probs_to_odds) export(r_to_d) export(r_to_odds) export(r_to_t) export(r_to_z) export(ranktransform) export(rules) export(sd_pooled) export(standardize) export(standardize_info) export(standardize_parameters) export(standardize_posteriors) export(t_to_d) export(t_to_epsilon2) export(t_to_eta2) export(t_to_eta2_adj) export(t_to_omega2) export(t_to_r) export(z_to_d) export(z_to_percentile) export(z_to_r) importFrom(bayestestR,describe_posterior) importFrom(insight,find_formula) importFrom(insight,find_response) importFrom(insight,find_terms) importFrom(insight,find_weights) importFrom(insight,format_value) importFrom(insight,get_data) importFrom(insight,get_parameters) importFrom(insight,get_response) importFrom(insight,model_info) importFrom(parameters,ci) importFrom(parameters,model_parameters) importFrom(parameters,parameters_type) importFrom(parameters,standard_error) importFrom(stats,anova) importFrom(stats,aov) importFrom(stats,as.formula) importFrom(stats,complete.cases) importFrom(stats,cor) importFrom(stats,lm) importFrom(stats,mad) importFrom(stats,median) importFrom(stats,model.frame) importFrom(stats,model.matrix) importFrom(stats,na.omit) importFrom(stats,pf) importFrom(stats,pnorm) importFrom(stats,predict) importFrom(stats,qf) importFrom(stats,qnorm) importFrom(stats,quantile) importFrom(stats,residuals) importFrom(stats,sd) importFrom(stats,update) importFrom(stats,var) importFrom(utils,capture.output) importFrom(utils,head) importFrom(utils,tail) effectsize/README.md0000644000176200001440000001531213550736634013676 0ustar liggesusers # effectsize [![CRAN](http://www.r-pkg.org/badges/version/effectsize)](https://cran.r-project.org/package=effectsize) [![downloads](http://cranlogs.r-pkg.org/badges/effectsize)](https://cran.r-project.org/package=effectsize) [![Build Status](https://travis-ci.org/easystats/effectsize.svg?branch=master)](https://travis-ci.org/easystats/effectsize) [![codecov](https://codecov.io/gh/easystats/effectsize/branch/master/graph/badge.svg)](https://codecov.io/gh/easystats/effectsize) ***Size does matter*** The goal of this package is to provide utilities to work with indices of effect size and standardized parameters, allowing computation and conversion of indices such as Cohen’s *d*, *r*, odds-ratios, etc. ## Installation Run the following: ``` r install.packages("devtools") devtools::install_github("easystats/effectsize") ``` ``` r library("effectsize") ``` ## Documentation [![Documentation](https://img.shields.io/badge/documentation-effectsize-orange.svg?colorB=E91E63)](https://easystats.github.io/effectsize/) [![Blog](https://img.shields.io/badge/blog-easystats-orange.svg?colorB=FF9800)](https://easystats.github.io/blog/posts/) [![Features](https://img.shields.io/badge/features-effectsize-orange.svg?colorB=2196F3)](https://easystats.github.io/effectsize/reference/index.html) Click on the buttons above to access the package [**documentation**](https://easystats.github.io/effectsize/) and the [**easystats blog**](https://easystats.github.io/blog/posts/), and check-out these vignettes: - [**Data Standardization**](https://easystats.github.io/effectsize/articles/standardize_data.html) - [**Parameters Standardization**](https://easystats.github.io/effectsize/articles/standardize_parameters.html) - [**Automated Interpretation of Indices of Effect Size**](https://easystats.github.io/effectsize/articles/interpret.html) - [**Effect size conversion**](https://easystats.github.io/effectsize/articles/convert.html) # Features This package is focused on indices of effect size. But **there are hundreds of them\! Thus, *everybody* is welcome to contribute** by adding support for the interpretation of new indices. If you’re not sure how to code it it’s okay, just open an issue to discuss it and we’ll help :) ## Effect Size Computation ### Basic Indices (Cohen’s *d*, Hedges’ *g*, Glass’ *delta*) The package provides functions to compute indices of effect size. ``` r cohens_d(iris$Sepal.Length, iris$Sepal.Width) ## [1] -4.21 hedges_g(iris$Sepal.Length, iris$Sepal.Width) ## [1] -4.2 glass_delta(iris$Sepal.Length, iris$Sepal.Width) ## [1] -3.36 ``` ### ANOVAs (Eta2, Omega2, …) ``` r model <- aov(Sepal.Length ~ Species, data = iris) omega_squared(model, partial = TRUE) ## Parameter Omega_Sq_partial ## 1 Species 0.612 ## 2 Residuals NA eta_squared(model, partial = TRUE) ## Parameter Eta_Sq_partial ## 1 Species 0.619 ## 2 Residuals NA epsilon_squared(model) ## Parameter Epsilon_sq ## 1 Species 0.614 ## 2 Residuals NA cohens_f(model) ## Parameter Cohens_f ## 1 Species 1.27 ## 2 Residuals NA ``` ### Regression Models Importantly, `effectsize` also provides [advanced methods](https://easystats.github.io/effectsize/articles/standardize_parameters.html) to compute standardized parameters for regression models. ``` r lm(Sepal.Length ~ Species + Sepal.Length, data = iris) %>% standardize_parameters() ``` | Parameter | Std\_Coefficient | | :---------------- | ---------------: | | (Intercept) | \-1.01 | | Speciesversicolor | 1.12 | | Speciesvirginica | 1.91 | ## Effect Size Interpretation The package allows for an automated interpretation of different indices. ``` r interpret_r(r = 0.3) ## [1] "large" ``` Different sets of “rules of thumb” are implemented ([**guidelines are detailed here**](https://easystats.github.io/effectsize/articles/interpret.html)) and can be easily changed. ``` r interpret_d(d = 0.45, rules = "cohen1988") ## [1] "small" interpret_d(d = 0.45, rules = "funder2019") ## [1] "medium" ``` ## Effect Size Conversion The package also provides ways of converting between different effect sizes. ``` r convert_d_to_r(d = 1) ## [1] 0.447 ``` ## Standardization Many indices of effect size stem out, or are related, to [*standardization*](https://easystats.github.io/effectsize/articles/standardize_parameters.html). Thus, it is expected that `effectsize` provides functions to standardize data and models. ### Data standardization, normalization and rank-transformation A standardization sets the mean and SD to 0 and 1: ``` r library(parameters) df <- standardize(iris) describe_distribution(df$Sepal.Length) ``` | Mean | SD | Min | Max | Skewness | Kurtosis | n | n\_Missing | | ---: | -: | ----: | --: | -------: | -------: | --: | ---------: | | 0 | 1 | \-1.9 | 2.5 | 0.3 | \-0.6 | 150 | 0 | This can be also applied to statistical models: ``` r std_model <- standardize(lm(Sepal.Length ~ Species, data = iris)) coef(std_model) ## (Intercept) Speciesversicolor Speciesvirginica ## -1.01 1.12 1.91 ``` Alternatively, normalization is similar to standardization in that it is a linear translation of the parameter space (i.e., it does not change the shape of the data distribution). However, it puts the values within a 0 - 1 range, which can be useful in cases where you want to compare or visualise data on the same scale. ``` r df <- normalize(iris) describe_distribution(df$Sepal.Length) ``` | Mean | SD | Min | Max | Skewness | Kurtosis | n | n\_Missing | | ---: | --: | --: | --: | -------: | -------: | --: | ---------: | | 0.4 | 0.2 | 0 | 1 | 0.3 | \-0.6 | 150 | 0 | This is a special case of a rescaling function, which can be used to rescale the data to an arbitrary new scale. Let’s change all numeric variables to “percentages”: ``` r df <- change_scale(iris, to = c(0, 100)) describe_distribution(df$Sepal.Length) ``` | Mean | SD | Min | Max | Skewness | Kurtosis | n | n\_Missing | | ---: | -: | --: | --: | -------: | -------: | --: | ---------: | | 42.9 | 23 | 0 | 100 | 0.3 | \-0.6 | 150 | 0 | For some robust statistics, one might also want to transfom the numeric values into *ranks* (or signed-ranks), which can be performed using the `ranktransform()` function. ``` r ranktransform(c(1, 3, -2, 6, 6, 0)) ## [1] 3.0 4.0 1.0 5.5 5.5 2.0 ``` effectsize/man/0000755000176200001440000000000013613235007013154 5ustar liggesuserseffectsize/man/t_to_r.Rd0000644000176200001440000000767713613235245014756 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convert_tFz_to_d.R, R/convert_tFz_to_r.R \name{t_to_d} \alias{t_to_d} \alias{convert_t_to_d} \alias{z_to_d} \alias{convert_z_to_d} \alias{F_to_d} \alias{convert_F_to_d} \alias{t_to_r} \alias{r_to_t} \alias{z_to_r} \alias{r_to_z} \alias{F_to_r} \alias{convert_t_to_r} \alias{convert_r_to_t} \alias{convert_z_to_r} \alias{convert_r_to_z} \alias{convert_F_to_r} \title{Convert test statistics (t, z, F) to effect sizes of differences (Cohen's d) or association (\strong{partial} r)} \usage{ t_to_d(t, df_error, pooled = FALSE, ...) convert_t_to_d(t, df_error, pooled = FALSE, ...) z_to_d(z, n, ...) convert_z_to_d(z, n, ...) F_to_d(f, df, df_error, pooled = FALSE, ...) convert_F_to_d(f, df, df_error, pooled = FALSE, ...) t_to_r(t, n = NULL, df_error = NULL, ...) r_to_t(r, n = NULL, df_error = NULL, ...) z_to_r(z, n = NULL, df_error = NULL, ...) r_to_z(r, n = NULL, df_error = NULL, ...) F_to_r(f, df, df_error = NULL, n = NULL, ...) convert_t_to_r(t, n = NULL, df_error = NULL, ...) convert_r_to_t(r, n = NULL, df_error = NULL, ...) convert_z_to_r(z, n = NULL, df_error = NULL, ...) convert_r_to_z(r, n = NULL, df_error = NULL, ...) convert_F_to_r(f, df, df_error = NULL, n = NULL, ...) } \arguments{ \item{t, f, z}{The t, the F or the z statistics.} \item{pooled}{Should the estimate accout for the t-value being based on a repeated-measures design, or not (default).} \item{...}{Arguments passed to or from other methods.} \item{n}{The number of observations (the sample size).} \item{df, df_error}{Degrees of freedom of numerator or of the error estimate (i.e., the residuals).} \item{r}{The correlation coefficient r.} } \value{ A numeric value of the requested effect size. } \description{ These functions are convenience functions to convert t, z and F test statistics to Cohen's d and \strong{partial} r. These are useful in cases where the data required to compute these are not easily available or their computation is not straightforward (e.g., in liner mixed models, contrasts, etc.). } \details{ These functions use the following formulae: \cr\cr \deqn{r_{partial} = t / \sqrt{t^2 + df_{error}}} \cr\cr \deqn{r_{partial} = z / \sqrt{z^2 + N}} \cr\cr \deqn{Cohen's d = 2 * t / \sqrt{df_{error}}} \cr\cr \deqn{Cohen's d_z = t / \sqrt{df_{error}}} \cr\cr \deqn{Cohen's d = 2 * z / \sqrt{N}} } \examples{ ## t Tests res <- t.test(1:10, y = c(7:20), var.equal = TRUE) t_to_d(t = res$statistic, res$parameter) t_to_r(t = res$statistic, res$parameter) res <- with(sleep, t.test(extra[group == 1], extra[group == 2], paired = TRUE)) t_to_d(t = res$statistic, res$parameter, pooled = TRUE) t_to_r(t = res$statistic, res$parameter) res <- cor.test(iris$Sepal.Width, iris$Petal.Width) t_to_r(t = res$statistic, n = 150) \donttest{ ## Linear Regression model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = iris) library(parameters) (param_tab <- parameters(model)) # > Parameter | Coefficient | SE | 95\% CI | t | df | p # > ----------------------------------------------------------------------- # > (Intercept) | 2.25 | 0.25 | [1.76, 2.74] | 9.07 | 147 | < .001 # > Sepal.Width | 0.60 | 0.07 | [0.46, 0.73] | 8.59 | 147 | < .001 # > Petal.Length | 0.47 | 0.02 | [0.44, 0.51] | 27.57 | 147 | < .001 t_to_r(param_tab$t[2:3], param_tab$df_error[2:3]) # > [1] 0.5781005 0.9153894 } # How does this compare to actual partial correlations? if (require("ppcor")) { pcor(iris[1:3])$estimate[1, -1] } } \references{ \itemize{ \item Friedman, H. (1982). Simplified determinations of statistical power, magnitude of effect and research sample sizes. Educational and Psychological Measurement, 42(2), 521-526. \doi{10.1177/001316448204200214} \item Wolf, F. M. (1986). Meta-analysis: Quantitative methods for research synthesis (Vol. 59). Sage. \item Rosenthal, R. (1991). Meta-analytic procedures for social research. Newbury Park, CA: SAGE Publications, Incorporated. } } effectsize/man/standardize.Rd0000644000176200001440000000556313602561300015760 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/standardize.R, R/standardize.data.frame.R, % R/standardize.models.R \name{standardize} \alias{standardize} \alias{standardize.data.frame} \alias{standardize.lm} \title{Standardization (Z-scoring)} \usage{ standardize(x, ...) \method{standardize}{data.frame}( x, robust = FALSE, two_sd = FALSE, select = NULL, exclude = NULL, verbose = TRUE, force = FALSE, ... ) \method{standardize}{lm}( x, robust = FALSE, two_sd = FALSE, include_response = TRUE, verbose = TRUE, ... ) } \arguments{ \item{x}{A dataframe, a vector or a statistical model.} \item{...}{Arguments passed to or from other methods.} \item{robust}{Logical, if \code{TRUE}, centering is done by substracting the median from the variables and dividing it by the median absolute deviation (MAD). If \code{FALSE}, variables are standardized by substracting the mean and dividing it by the standard deviation (SD).} \item{two_sd}{If \code{TRUE}, the variables are scaled by two times the deviation (SD or MAD depending on \code{robust}). This method can be useful to obtain model coefficients of continuous parameters comparable to coefficients related to binary predictors (Gelman, 2008).} \item{select}{Character vector of column names. If \code{NULL} (the default), all variables will be selected.} \item{exclude}{Character vector of column names to be excluded from selection.} \item{verbose}{Toggle warnings on or off.} \item{force}{Logical, if \code{TRUE}, forces standardization of factors as well. Factors are converted to numerical values, with the lowest level being the value \code{1} (unless the factor has numeric levels, which are converted to the corresponding numeric value).} \item{include_response}{For a model, if \code{TRUE} (default), the response value will also be standardized. If \code{FALSE}, only the predictors will be standardized. Note that for certain models (logistic regression, count models, ...), the response value will never be standardized, to make re-fitting the model work.} } \value{ The standardized object (either a standardize dataframe or a statistical model fitted on standardized data). } \description{ Performs a standardization of data (Z-scoring), i.e., centering and scaling, so that the data is expressed in terms of standard deviation (i.e., mean = 0, SD = 1) or Median Absolute Deviance (median = 0, MAD = 1). When applied to a statistical model, this function extracts the dataset, standardizes it, and refits the model with this standardized version of the dataset. The \code{\link{normalize}} function can also be used to scale all numeric variables within the 0 - 1 range. } \examples{ # Dataframes summary(standardize(iris)) # Models model <- lm(Sepal.Length ~ Species * Petal.Width, data = iris) coef(standardize(model)) } \seealso{ \code{\link{normalize}} \code{\link{standardize_parameters}} } effectsize/man/interpret_ess.Rd0000644000176200001440000000401113571424147016335 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_bayesian_indices.R \name{interpret_ess} \alias{interpret_ess} \alias{interpret_rhat} \alias{interpret_rope} \title{Bayesian indices interpretation} \usage{ interpret_ess(ess, rules = "burkner2017") interpret_rhat(rhat, rules = "vehtari2019") interpret_rope(rope, ci = 0.9, rules = "default") } \arguments{ \item{ess}{Value or vector of Effective Sample Size (ESS) values.} \item{rules}{A character string (see details) or a custom set of \code{\link{rules}}.} \item{rhat}{Value or vector of Rhat values.} \item{rope}{Value or vector of percentages in ROPE.} \item{ci}{The Credible Interval (CI) probability, corresponding to the proportion of HDI, that was used. Can be \code{1} in the case of "full ROPE".} } \description{ Interpretation of Bayesian indices, such as Effective Sample Size (ESS), Rhat, or percentage in ROPE. } \details{ \subsection{Rules sets:}{ \itemize{ \item \strong{ESS}: Can be "burkner2017" (default). \item \strong{Rhat}: Can be "vehtari2019" (default) or "gelman1992". \item \strong{ROPE}: Can be \href{https://easystats.github.io/bayestestR/articles/guidelines.html}{"default"}. \item \strong{ESS}: }} } \examples{ interpret_ess(1001) interpret_ess(c(852, 1200)) interpret_rhat(1.00) interpret_rhat(c(1.5, 0.9)) interpret_rope(0, ci = 0.9) interpret_rope(c(0.005, 0.99), ci = 1) } \references{ \itemize{ \item Bürkner, P. C. (2017). brms: An R package for Bayesian multilevel models using Stan. Journal of Statistical Software, 80(1), 1-28. \item Gelman, A., & Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. Statistical science, 7(4), 457-472. \item Vehtari, A., Gelman, A., Simpson, D., Carpenter, B., & Bürkner, P. C. (2019). Rank-normalization, folding, and localization: An improved Rhat for assessing convergence of MCMC. arXiv preprint arXiv:1903.08008. \item \href{https://easystats.github.io/bayestestR/articles/guidelines.html}{BayestestR's reporting guidelines} } } effectsize/man/interpret_gfi.Rd0000644000176200001440000001110313571424147016310 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_fit.R \name{interpret_gfi} \alias{interpret_gfi} \alias{interpret_agfi} \alias{interpret_nfi} \alias{interpret_nnfi} \alias{interpret_cfi} \alias{interpret_rmsea} \alias{interpret_srmr} \alias{interpret_rfi} \alias{interpret_ifi} \alias{interpret_pnfi} \title{Interpretation of indices of fit} \usage{ interpret_gfi(x, rules = "default") interpret_agfi(x, rules = "default") interpret_nfi(x, rules = "byrne1994") interpret_nnfi(x, rules = "byrne1994") interpret_cfi(x, rules = "default") interpret_rmsea(x, rules = "default") interpret_srmr(x, rules = "default") interpret_rfi(x, rules = "default") interpret_ifi(x, rules = "default") interpret_pnfi(x, rules = "default") } \arguments{ \item{x}{vector of values.} \item{rules}{Can be "default" or custom set of rules.} } \description{ Interpretation of indices of fit found in confirmatory analysis or structural equation modelling, such as RMSEA, CFI, NFI, IFI, etc. } \details{ \subsection{Indices of fit}{ \itemize{ \item \strong{Chisq}: The model Chi-squared assesses overall fit and the discrepancy between the sample and fitted covariance matrices. Its p-value should be > .05 (i.e., the hypothesis of a perfect fit cannot be rejected). However, it is quite sensitive to sample size. \item \strong{GFI/AGFI}: The (Adjusted) Goodness of Fit is the proportion of variance accounted for by the estimated population covariance. Analogous to R2. The GFI and the AGFI should be > .95 and > .90, respectively. \item \strong{NFI/NNFI/TLI}: The (Non) Normed Fit Index. An NFI of 0.95, indicates the model of interest improves the fit by 95\% relative to the null model. The NNFI (also called the Tucker Lewis index; TLI) is preferable for smaller samples. They should be > .90 (Byrne, 1994) or > .95 (Schumacker & Lomax, 2004). \item \strong{CFI}: The Comparative Fit Index is a revised form of NFI. Not very sensitive to sample size (Fan, Thompson, & Wang, 1999). Compares the fit of a target model to the fit of an independent, or null, model. It should be > .90. \item \strong{RMSEA}: The Root Mean Square Error of Approximation is a parsimony-adjusted index. Values closer to 0 represent a good fit. It should be < .08 or < .05. The p-value printed with it tests the hypothesis that RMSEA is less than or equal to .05 (a cutoff sometimes used for good fit), and thus should be not significant. \item \strong{RMR/SRMR}: the (Standardized) Root Mean Square Residual represents the square-root of the difference between the residuals of the sample covariance matrix and the hypothesized model. As the RMR can be sometimes hard to interpret, better to use SRMR. Should be < .08. \item \strong{RFI}: the Relative Fit Index, also known as RHO1, is not guaranteed to vary from 0 to 1. However, RFI close to 1 indicates a good fit. \item \strong{IFI}: the Incremental Fit Index (IFI) adjusts the Normed Fit Index (NFI) for sample size and degrees of freedom (Bollen's, 1989). Over 0.90 is a good fit, but the index can exceed 1. \item \strong{PNFI}: the Parsimony-Adjusted Measures Index. There is no commonly agreed-upon cutoff value for an acceptable model for this index. Should be > 0.50. } See the documentation for \code{lavaan::fitmeasures}. } \subsection{What to report}{ For structural equation models (SEM), Kline (2015) suggests that at a minimum the following indices should be reported: The model \strong{chi-square}, the \strong{RMSEA}, the \strong{CFI} and the \strong{SRMR}. } } \examples{ interpret_gfi(c(.5, .99)) interpret_agfi(c(.5, .99)) interpret_nfi(c(.5, .99)) interpret_nnfi(c(.5, .99)) interpret_cfi(c(.5, .99)) interpret_rmsea(c(.5, .99)) interpret_srmr(c(.5, .99)) interpret_rfi(c(.5, .99)) interpret_ifi(c(.5, .99)) interpret_pnfi(c(.5, .99)) } \references{ \itemize{ \item Awang, Z. (2012). A handbook on SEM. Structural equation modeling. \item Byrne, B. M. (1994). Structural equation modeling with EQS and EQS/Windows. Thousand Oaks, CA: Sage Publications. \item Tucker, L. R., \& Lewis, C. (1973). The reliability coefficient for maximum likelihood factor analysis. Psychometrika, 38, 1-10. \item Schumacker, R. E., \& Lomax, R. G. (2004). A beginner's guide to structural equation modeling, Second edition. Mahwah, NJ: Lawrence Erlbaum Associates. \item Fan, X., B. Thompson, \& L. Wang (1999). Effects of sample size, estimation method, and model specification on structural equation modeling fit indexes. Structural Equation Modeling, 6, 56-83. \item Kline, R. B. (2015). Principles and practice of structural equation modeling. Guilford publications. } } effectsize/man/adjust.Rd0000644000176200001440000000445213571424147014752 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adjust.R \name{adjust} \alias{adjust} \title{Adjust data for the effect of other variable(s)} \usage{ adjust( data, effect = NULL, select = NULL, exclude = NULL, multilevel = FALSE, additive = FALSE, bayesian = FALSE ) } \arguments{ \item{data}{A dataframe.} \item{effect}{Character vector of column names to be adjusted for (regressed out). If \code{NULL} (the default), all variables will be selected.} \item{select}{Character vector of column names. If \code{NULL} (the default), all variables will be selected.} \item{exclude}{Character vector of column names to be excluded from selection.} \item{multilevel}{If \code{TRUE}, the factors are included as random factors. Else, if \code{FALSE} (default), they are included as fixed effects in the simple regression model.} \item{additive}{If \code{TRUE}, continuous variables as included as smooth terms in additive models. The goal is to regress-out potential non-linear effects.} \item{bayesian}{If \code{TRUE}, the models are fitted under the Bayesian framework using \code{rstanarm}.} } \description{ This function can be used to adjust the data for the effect of other variables present in the dataset. It is based on an underlying fitting of regressions models, allowing for quite some flexibility, such as including factors as random effects in mixed models (multilevel partialization), continuous variables as smooth terms in general additive models (non-linear partialization) and/or fitting these models under a Bayesian framework. The values returned by this function are the residuals of the regression models. Note that a regular correlation between two "adjusted" variables is equivalent to the partial correlation between them. } \examples{ adjust(iris, effect = "Species", select = "Sepal.Length") \donttest{ adjust(iris, effect = "Species", select = "Sepal.Length", multilevel = TRUE) adjust(iris, effect = "Species", select = "Sepal.Length", bayesian = TRUE) adjust(iris, effect = "Petal.Width", select = "Sepal.Length", additive = TRUE) adjust(iris, effect = "Petal.Width", select = "Sepal.Length", additive = TRUE, bayesian = TRUE) adjust(iris, effect = c("Petal.Width", "Species"), select = "Sepal.Length", multilevel = TRUE, additive = TRUE) adjust(iris) } } effectsize/man/cohens_d.Rd0000644000176200001440000000411213571424147015233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cohens_d.R \name{cohens_d} \alias{cohens_d} \alias{hedges_g} \alias{glass_delta} \title{Effect size for differences} \usage{ cohens_d( x, y = NULL, data = NULL, correction = FALSE, pooled_sd = TRUE, paired = FALSE ) hedges_g( x, y = NULL, data = NULL, correction = FALSE, pooled_sd = TRUE, paired = FALSE ) glass_delta(x, y = NULL, data = NULL, correction = FALSE) } \arguments{ \item{x}{A continuous variable or a formula.} \item{y}{A continuous variable, a factor with two groups or a formula.} \item{data}{An optional data frame containing the variables.} \item{correction}{If \code{TRUE}, applies a correction to the formula to make it less biased for small samples (McGrath & Meyer, 2006).} \item{pooled_sd}{If \code{FALSE}, the regular SD from both combined groups is used instead of the \code{\link{sd_pooled}}.} \item{paired}{If \code{TRUE}, the values of \code{x} and \code{y} are considered as paired.} } \description{ Compute different indices of effect size. For very small sample sizes (n < 20) Hedges' g is considered as less biased than Cohen's d. For sample sizes > 20, the results for both statistics are roughly equivalent. The Glass’s delta is appropriate if standard deviations are significantly different between groups, as it uses only the control group's (\code{x}) standard deviation. } \examples{ cohens_d(iris$Sepal.Length, iris$Sepal.Width) hedges_g("Sepal.Length", "Sepal.Width", data = iris) glass_delta(Sepal.Length ~ Sepal.Width, data = iris) cohens_d(iris$Sepal.Length, iris$Sepal.Width, correct = TRUE, pooled_sd = FALSE) cohens_d(Sepal.Length ~ Species, data = iris[iris$Species \%in\% c("versicolor", "setosa"), ]) } \references{ \itemize{ \item Cohen, J. (2013). Statistical power analysis for the behavioral sciences. Routledge. \item McGrath, R. E., & Meyer, G. J. (2006). When effect sizes disagree: the case of r and d. Psychological methods, 11(4), 386. \item Hedges, L. V. & Olkin, I. (1985). Statistical methods for meta-analysis. Orlando, FL: Academic Press. } } effectsize/man/convert_z_to_percentile.Rd0000644000176200001440000000124113571424147020376 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convert_percentile_to_z.R \name{convert_z_to_percentile} \alias{convert_z_to_percentile} \alias{convert_percentile_to_z} \alias{z_to_percentile} \alias{percentile_to_z} \title{Z score to Percentile} \usage{ convert_z_to_percentile(z) convert_percentile_to_z(percentile) z_to_percentile(z) percentile_to_z(percentile) } \arguments{ \item{z, percentile}{Z score or percentile.} } \description{ Convert between Z scores (values expressed in terms of standard deviation) to percentiles (the proportion of a normal distribution below). } \examples{ z_to_percentile(1.96) percentile_to_z(0.975) } effectsize/man/interpret_d.Rd0000644000176200001440000000247313571424147016000 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_d.R \name{interpret_d} \alias{interpret_d} \alias{interpret_g} \alias{interpret_delta} \title{Standardized difference interpretation} \usage{ interpret_d(d, rules = "funder2019") interpret_g(g, rules = "funder2019") interpret_delta(delta, rules = "funder2019") } \arguments{ \item{d, g, delta}{Value or vector of effect size values.} \item{rules}{Can be "funder2019" (default), "gignac2016", "cohen1988", "sawilowsky2009" or custom set of \code{\link{rules}}.} } \description{ Interpretation of indices using different sets of rules of thumb. \href{https://easystats.github.io/report/articles/interpret_metrics.html#standardized-difference-d-cohens-d}{Click here} for details. } \examples{ interpret_d(.02) interpret_d(c(.5, .02)) } \references{ \itemize{ \item Funder, D. C., & Ozer, D. J. (2019). Evaluating effect size in psychological research: sense and nonsense. Advances in Methods and Practices in Psychological Science. \item Gignac, G. E., & Szodorai, E. T. (2016). Effect size guidelines for individual differences researchers. Personality and individual differences, 102, 74-78. \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. \item Sawilowsky, S. S. (2009). New effect size rules of thumb. } } effectsize/man/chisq_to_phi.Rd0000644000176200001440000000307513571424147016131 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convert_chisq.R \name{chisq_to_phi} \alias{chisq_to_phi} \alias{convert_chisq_to_phi} \alias{phi_to_chisq} \alias{convert_phi_to_chisq} \alias{chisq_to_cramers_v} \alias{convert_chisq_to_cramers_v} \title{Conversion between Effect sizes for Contingency Tables (Chi2, Phi, Cramer's V...)} \usage{ chisq_to_phi(chisq, n, ...) convert_chisq_to_phi(chisq, n, ...) phi_to_chisq(phi, n, ...) convert_phi_to_chisq(phi, n, ...) chisq_to_cramers_v(chisq, n, nrow, ncol, ...) convert_chisq_to_cramers_v(chisq, n, nrow, ncol, ...) } \arguments{ \item{chisq}{The Chi2 statistic.} \item{n}{Sample size.} \item{...}{Arguments passed to or from other methods.} \item{phi}{The Phi statistic.} \item{nrow}{The number of rows in the contingency table.} \item{ncol}{The number of columns in the contingency tables.} } \value{ A numeric value between 0-1. } \description{ Convert between Chi square, (\eqn{chi^2}), phi (\eqn{\phi}) and Cramer's V. } \details{ These functions use the following formulae: \cr\cr \deqn{Cramer's V = \sqrt{\chi^2 / (n * (min(nrow,ncol)-1))}} \cr\cr \deqn{\phi = \sqrt{\chi^2 / n}} } \examples{ contingency_table <- as.table(rbind(c(762, 327, 468), c(484, 239, 477), c(484, 239, 477))) chisq.test(contingency_table) # # Pearson's Chi-squared test # # data: ctab # X-squared = 41.234, df = 4, p-value = 2.405e-08 chisq_to_phi(41.234, n = sum(contingency_table)) chisq_to_cramers_v(41.234, n = sum(contingency_table), nrow = nrow(contingency_table), ncol = ncol(contingency_table) ) } effectsize/man/format_standardize.Rd0000644000176200001440000000210213602561300017312 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/format_standardize.R \name{format_standardize} \alias{format_standardize} \title{Transform a standardized vector into character} \usage{ format_standardize(x, reference = x, robust = FALSE, digits = NULL, ...) } \arguments{ \item{x}{A standardized numeric vector.} \item{reference}{The reference vector from which to compute the mean and SD.} \item{robust}{Logical, if \code{TRUE}, centering is done by substracting the median from the variables and dividing it by the median absolute deviation (MAD). If \code{FALSE}, variables are standardized by substracting the mean and dividing it by the standard deviation (SD).} \item{digits}{Number of significant digits.} \item{...}{Arguments passed to or from other methods.} } \description{ Transform a standardized vector into character, e.g., \code{c("-1 SD", "Mean", "+1 SD")}. } \examples{ format_standardize(c(-1, 0, 1)) format_standardize(c(-1, 0, 1, 2), reference = rnorm(1000)) format_standardize(c(-1, 0, 1, 2), reference = rnorm(1000), robust = TRUE) } effectsize/man/F_to_eta2.Rd0000644000176200001440000000717513613235245015263 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convert_tF_to_pve.R \name{F_to_eta2} \alias{F_to_eta2} \alias{t_to_eta2} \alias{F_to_epsilon2} \alias{t_to_epsilon2} \alias{F_to_eta2_adj} \alias{t_to_eta2_adj} \alias{F_to_omega2} \alias{t_to_omega2} \title{Convert test statistics (F, t) to indices of \strong{partial} variance explained (\strong{partial} Eta / Omega / Epsilon squared)} \usage{ F_to_eta2(f, df, df_error, ...) t_to_eta2(t, df_error, ...) F_to_epsilon2(f, df, df_error, ...) t_to_epsilon2(t, df_error, ...) F_to_eta2_adj(f, df, df_error, ...) t_to_eta2_adj(t, df_error, ...) F_to_omega2(f, df, df_error, ...) t_to_omega2(t, df_error, ...) } \arguments{ \item{df, df_error}{Degrees of freedom of numerator or of the error estimate (i.e., the residuals).} \item{...}{Arguments passed to or from other methods.} \item{t, f}{The t or the F statistics.} } \value{ A numeric value between 0-1 (Note that for \eqn{\omega_p^2} and \eqn{\epsilon_p^2} it is possible to compute a negative number; even though this doesn't make any practical sense, it is recommended to report the negative number and not a 0). } \description{ These functions are convenience functions to convert F and t test statistics to \strong{partial} Eta squared, (\eqn{\eta{_p}^2}), Omega squared (\eqn{\omega{_p}^2}) and Epsilon squared (\eqn{\epsilon{_p}^2}; an alias for the adjusted Eta squared). These are useful in cases where the various Sum of Squares and Mean Squares are not easily available or their computation is not straightforward (e.g., in liner mixed models, contrasts, etc.). For test statistics derived from \code{lm} and \code{aov} models, these functions give exact results. For all other cases, they return close approximations. } \details{ These functions use the following formulae: \cr\cr \deqn{\eta_p^2 = \frac{F \times df_{num}}{F \times df_{num} + df_{den}}} \cr\cr \deqn{\epsilon_p^2 = \frac{(F - 1) \times df_{num}}{F \times df_{num} + df_{den}}} \cr\cr \deqn{\omega_p^2 = \frac{(F - 1) \times df_{num}}{F \times df_{num} + df_{den} + 1}} \cr\cr\cr For \eqn{t}, the conversion is based on the equality of \eqn{t^2 = F} when \eqn{df_{num}=1}. } \note{ \eqn{Adj. \eta_p^2} is an alias for \eqn{\epsilon_p^2}. } \examples{ \donttest{ if (require("afex")) { data(md_12.1) aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table = list(correction = "none", es = "pes") ) } # compare to: F_to_eta2(40.72, 2, 18) F_to_eta2(33.77, 1, 9) F_to_eta2(45.31, 2, 18) if (require("lmerTest")) { # for the df_error fit <- lmer(extra ~ group + (1 | ID), sleep) anova(fit) # Type III Analysis of Variance Table with Satterthwaite's method # Sum Sq Mean Sq NumDF DenDF F value Pr(>F) # group 12.482 12.482 1 9 16.501 0.002833 ** # --- # Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 F_to_eta2(16.501, 1, 9) F_to_omega2(16.501, 1, 9) F_to_epsilon2(16.501, 1, 9) } } } \references{ \itemize{ \item Friedman, H. (1982). Simplified determinations of statistical power, magnitude of effect and research sample sizes. Educational and Psychological Measurement, 42(2), 521-526. \doi{10.1177/001316448204200214} \item Mordkoff, J. T. (2019). A Simple Method for Removing Bias From a Popular Measure of Standardized Effect Size: Adjusted Partial Eta Squared. Advances in Methods and Practices in Psychological Science, 2(3), 228-232. \doi{10.1177/2515245919855053} \item Albers, C., & Lakens, D. (2018). When power analyses based on pilot data are biased: Inaccurate effect size estimators and follow-up bias. Journal of experimental social psychology, 74, 187-195. \doi{10.31234/osf.io/b7z4q} } } effectsize/man/interpret_parameters.Rd0000644000176200001440000000204413571424147017712 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_parameters.R \name{interpret_parameters} \alias{interpret_parameters} \alias{interpret_parameters.lm} \title{Automated Interpretation of Effect Sizes} \usage{ interpret_parameters(model, ...) \method{interpret_parameters}{lm}( model, parameters = NULL, interpretation = "funder2019", standardize_method = "refit", standardize_robust = FALSE, ... ) } \arguments{ \item{model}{A statistical model.} \item{...}{Arguments passed to or from other methods.} \item{parameters}{A custom parameters table. If \code{NULL}, will use \code{\link{standardize_parameters}} to get it.} \item{interpretation}{Interpretation grid (i.e., the set of rules of thumb) used to interpret the effects.} \item{standardize_method}{See \code{\link{standardize_parameters}}.} \item{standardize_robust}{See \code{\link{standardize_parameters}}.} } \description{ Automated interpretation of effect sizes. } \examples{ model <- lm(Sepal.Length ~ Species * Petal.Width, data = iris) } effectsize/man/interpret.Rd0000644000176200001440000000141613571424147015471 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret.R \name{interpret} \alias{interpret} \title{Generic function for interpretation} \usage{ interpret(x, rules) } \arguments{ \item{x}{Vector of value break points (edges defining categories).} \item{rules}{Set of \link{rules}.} } \description{ Interpret a value based on a set of rules. See \link{rules}. } \examples{ rules_grid <- rules(c(0.01, 0.05), c("very significant", "significant", "not significant")) interpret(0.001, rules_grid) interpret(0.021, rules_grid) interpret(0.08, rules_grid) interpret(c(0.01, 0.005, 0.08), rules_grid) interpret(c(0.35, 0.15), c("small" = 0.2, "large" = 0.4)) interpret(c(0.35, 0.15), rules(c(0.2, 0.4), c("small", "medium", "large"))) } \seealso{ rules } effectsize/man/sd_pooled.Rd0000644000176200001440000000134013571424147015421 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sd_pooled.R \name{sd_pooled} \alias{sd_pooled} \alias{mad_pooled} \title{Pooled Standard Deviation} \usage{ sd_pooled(x, y = NULL, data = NULL) mad_pooled(x, y = NULL, data = NULL) } \arguments{ \item{x}{A continuous variable or a formula.} \item{y}{A continuous variable, a factor with two groups or a formula.} \item{data}{An optional data frame containing the variables.} } \value{ Numeric, the pooled standard deviation. } \description{ The Pooled Standard Deviation is a weighted average of standard deviations for two or more groups, with more "weight" given to larger sample sizes. } \examples{ sd_pooled(Sepal.Length ~ Petal.Width, data = iris) } effectsize/man/dot-factor_to_numeric.Rd0000644000176200001440000000052313613235245017735 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils_factor_to_numeric.R \name{.factor_to_numeric} \alias{.factor_to_numeric} \title{Safe transformation from factor/character to numeric} \usage{ .factor_to_numeric(x) } \description{ Safe transformation from factor/character to numeric } \keyword{internal} effectsize/man/standardize_info.Rd0000644000176200001440000000176313602561300016771 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/standardize_info.R \name{standardize_info} \alias{standardize_info} \title{Get Standardization Information} \usage{ standardize_info(model, robust = FALSE, ...) } \arguments{ \item{model}{A statistical model.} \item{robust}{Logical, if \code{TRUE}, centering is done by substracting the median from the variables and dividing it by the median absolute deviation (MAD). If \code{FALSE}, variables are standardized by substracting the mean and dividing it by the standard deviation (SD).} \item{...}{Arguments passed to or from other methods.} } \description{ This function extracts information, such as the deviations (SD or MAD) from parent variables, that are necessary for post-hoc standardization of parameters. This function gives a window on how standardized are obtained, i.e., by what they are devided. The "basic" method of standardization uses } \examples{ model <- lm(Sepal.Width ~ Sepal.Length * Species, data = iris) } effectsize/man/interpret_r.Rd0000644000176200001440000000212313571424147016006 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_r.R \name{interpret_r} \alias{interpret_r} \title{Correlation interpretation} \usage{ interpret_r(r, rules = "funder2019") } \arguments{ \item{r}{Value or vector of correlation coefficient.} \item{rules}{Can be "funder2019" (default), "gignac2016", cohen1988", "evans1996" or custom set of rules.} } \description{ Correlation interpretation } \examples{ interpret_r(r = .015) interpret_r(r = c(.5, -.02)) } \references{ \itemize{ \item Funder, D. C., & Ozer, D. J. (2019). Evaluating effect size in psychological research: sense and nonsense. Advances in Methods and Practices in Psychological Science. \item Gignac, G. E., & Szodorai, E. T. (2016). Effect size guidelines for individual differences researchers. Personality and individual differences, 102, 74-78. \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. \item Evans, J. D. (1996). Straightforward statistics for the behavioral sciences. Thomson Brooks/Cole Publishing Co. } } \seealso{ Page 88 of APA's 6th Edition. } effectsize/man/standardize_parameters.Rd0000644000176200001440000001432013613235245020202 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/standardize_parameters.R \name{standardize_parameters} \alias{standardize_parameters} \alias{standardize_posteriors} \title{Parameters standardization} \usage{ standardize_parameters( model, parameters = NULL, method = "refit", robust = FALSE, two_sd = FALSE, verbose = TRUE, centrality = "median", ... ) standardize_posteriors( model, method = "refit", robust = FALSE, two_sd = FALSE, verbose = TRUE, ... ) } \arguments{ \item{model}{A statistical model.} \item{parameters}{An optional table containing the parameters to standardize. If \code{NULL}, will automatically retrieve it from the model.} \item{method}{The method used for standardizing the parameters. Can be \code{"refit"} (default), \code{"posthoc"}, \code{"smart"} or \code{"basic"}. See 'Details'.} \item{robust}{Logical, if \code{TRUE}, centering is done by substracting the median from the variables and dividing it by the median absolute deviation (MAD). If \code{FALSE}, variables are standardized by substracting the mean and dividing it by the standard deviation (SD).} \item{two_sd}{If \code{TRUE}, the variables are scaled by two times the deviation (SD or MAD depending on \code{robust}). This method can be useful to obtain model coefficients of continuous parameters comparable to coefficients related to binary predictors (Gelman, 2008).} \item{verbose}{Toggle warnings on or off.} \item{centrality}{For Bayesian models, which point-estimates (centrality indices) to compute. Character (vector) or list with one or more of these options: "median", "mean", "MAP" or "all".} \item{...}{Arguments passed to or from other methods.} } \value{ Standardized parameters. } \description{ Compute standardized model parameters (coefficients). } \details{ \subsection{Methods:}{ \itemize{ \item \strong{refit}: This method is based on a complete model re-fit with a standardized version of data. Hence, this method is equal to standardizing the variables before fitting the model. It is the "purest" and the most accurate (Neter et al., 1989), but it is also the most computationally costly and long (especially for heavy models such as, for instance, for Bayesian models). This method is particularly recommended for complex models that include interactions or transformations (e.g., polynomial or spline terms). The \code{robust} (default to \code{FALSE}) argument enables a robust standardization of data, i.e., based on the \code{median} and \code{MAD} instead of the \code{mean} and \code{SD}. \item \strong{posthoc}: Post-hoc standardization of the parameters, aiming at emulating the results obtained by "refit" without refitting the model. The coefficients are divided by the standard deviation (or MAD if \code{robust}) of the outcome (which becomes their expression 'unit'). Then, the coefficients related to numeric variables are additionally multiplied by the standard deviation (or MAD if \code{robust}) of the related terms, so that they correspond to changes of 1 SD of the predictor (e.g., "A change in 1 SD of \code{x} is related to a change of 0.24 of the SD of \code{y}). This does not apply to binary variables or factors, so the coefficients are still related to changes in levels. This method is not accurate and tend to give aberrant results when interactions are specified. \item \strong{smart} (Standardization of Model's parameters with Adjustment, Reconnaissance and Transformation): Similar to \code{method = "posthoc"} in that it does not involve model refitting. The difference is that the SD of the response is computed on the relevant section of the data. For instance, if a factor with 3 levels A (the intercept), B and C is entered as a predictor, the effect corresponding to B vs. A will be scaled by the variance of the response at the intercept only. As a results, the coefficients for effects of factors are similar to a Glass' delta. \item \strong{basic}: This method is similar to \code{method = "posthoc"}, but treats all variables as continuous: it also scales the coefficient by the standard deviation of model's matrix' parameter of factors levels (transformed to integers) or binary predictors. Although being inappropriate for these cases, this method is the one implemented by default in other software packages, such as \code{lm.beta::lm.beta()}. } When \code{method = "smart"} or \code{method = "classic"}, \code{standardize_parameters()} also returns the standard errors for the standardized coefficients. Then, \code{ci()} can be used to calculate confidence intervals for the standardized coefficients. See 'Examples'. } } \examples{ library(effectsize) data(iris) model <- lm(Sepal.Length ~ Species * Petal.Width, data = iris) standardize_parameters(model, method = "refit") \donttest{ standardize_parameters(model, method = "posthoc") standardize_parameters(model, method = "smart") standardize_parameters(model, method = "basic") # Robust and 2 SD standardize_parameters(model, robust = TRUE) standardize_parameters(model, two_sd = TRUE) # show CI library(parameters) params <- standardize_parameters(model, method = "smart", robust = TRUE) ci(params) iris$binary <- ifelse(iris$Sepal.Width > 3, 1, 0) model <- glm(binary ~ Species * Sepal.Length, data = iris, family = "binomial") standardize_parameters(model, method = "refit") standardize_parameters(model, method = "posthoc") standardize_parameters(model, method = "smart") standardize_parameters(model, method = "basic") } \donttest{ if (require("rstanarm")) { model <- stan_glm(Sepal.Length ~ Species * Petal.Width, data = iris, iter = 500, refresh = 0) standardize_posteriors(model, method = "refit") standardize_posteriors(model, method = "posthoc") standardize_posteriors(model, method = "smart") standardize_posteriors(model, method = "basic") standardize_parameters(model, method = "refit") standardize_parameters(model, method = "posthoc") standardize_parameters(model, method = "smart") standardize_parameters(model, method = "basic") } } } \references{ \itemize{ \item Neter, J., Wasserman, W., & Kutner, M. H. (1989). Applied linear regression models. \item Gelman, A. (2008). Scaling regression inputs by dividing by two standard deviations. Statistics in medicine, 27(15), 2865-2873. } } \seealso{ standardize_info } effectsize/man/interpret_odds.Rd0000644000176200001440000000216613571424147016505 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_odds.R \name{interpret_odds} \alias{interpret_odds} \title{(Log) Odds ratio interpretation} \usage{ interpret_odds(odds, rules = "chen2010", log = FALSE) } \arguments{ \item{odds}{Value or vector of (log) odds ratio values.} \item{rules}{Can be "chen2010" (default), "cohen1988" (through transformation to standardized difference, see \code{\link{odds_to_d}}) or custom set of rules.} \item{log}{Are the provided values log odds ratio.} } \description{ (Log) Odds ratio interpretation } \examples{ interpret_odds(1) interpret_odds(c(5, 2)) } \references{ \itemize{ \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. \item Chen, H., Cohen, P., & Chen, S. (2010). How big is a big odds ratio? Interpreting the magnitudes of odds ratios in epidemiological studies. Communications in Statistics—Simulation and Computation, 39(4), 860-864. \item Sánchez-Meca, J., Marín-Martínez, F., & Chacón-Moscoso, S. (2003). Effect-size indices for dichotomized outcomes in meta-analysis. Psychological methods, 8(4), 448. } } effectsize/man/figures/0000755000176200001440000000000013606302124014615 5ustar liggesuserseffectsize/man/figures/logo.png0000644000176200001440000170054113550226150016275 0ustar liggesusersPNG  IHDRmGtEXtSoftwareAdobe ImageReadyqe<IDATx;oU.g׈CBn,Bb6M"QΉd j'15wXB" pA\ f ΃pw˙C=إNW,ƿ?*]9|;@¸5эݨmԥ ^%$ ZP_ |9?Ȓt"_u v6s o$oZ2O`w^_;]wwCVCQ|Sx}/KXrŲLo־@{ /oeI: ;XtMt?z#g)7Z;]; Y=ת?U'$E5CZ(9 iXtbs߫2OW /'Ɲ>WnFmcO7 /dI:ߙ>ׯjo/^@Ȓt"_u K#o־^@˒t8zwkŲʼ(^VkNnKj((^ReiR((^J(ߜ}/W(Eׄ4D#^:Zkk|!{3 XYN.;]o>ŗ3@QxƁj{6VfDt1Z;]蚖ơjFmc. (%Ls+8_I(: 8TYNbkXk.NECQtK+IJʼ(NTda-. S(%i,be-j8l /`eI:vzM}((eIw;]P_ Q@Px@ɒt<tl{@Px@Ȓt8E׸4_6tNBCQ|EI]*K` vk>WC[^eZ;]( bqnmceF;^%Z;]t45KmceI^u+8_{kUн^$ai žkQ@Qx@ʒ4sŢk\p`bK9Q@wQx@i/E״44wRtt,INם` :R(ΦC%xs?N59^й^pH$E5. x_{͋: Xk+.- :΢%tkn>WCp^pZ;]( ʌ(p)`vb5! YP{- Ak+nt BZ,Nם K\(^ Hq+/XvkN^Z c5- ?4wR|,Ig.R(%xs?l{RxȒt8E׸4ˮ׼(`o(`Z;]ww[yvxFkޅBzf{Sx@,I_.J8w$,Lk#Gs,bÓ¡|(((NW,.Jv',\?/}v0QXg^U^Z;]蚐er"y&>U( %xs?D銧 /vz&\zUf7g ^,ICQtKvvvo?VZ|ο22/ 麓ҠL_umo{œPb5W]#=)KXrŲNm}amhGsƲ+^ @QxSZ;]4h',\~vV0"eû}D@OhtŢkBYzcv֥^Cٶ?P4BqpI:]ӵsZ9|#wΙC^TZJ@ʒt:Eװ4hg6]t}XvM- cOaSe>ŗ3]qiNz2q0/_~n_m̈࿴vb5- Ē+]v2Vԡ}/*4wR_Bɒt&/ȱ0y*8wDZ%xs?D<_pTX<( \0QTߜ}/"@Ȓt8;]ҠՓ S_a(e@SxNBhمai;]tEz(( GeI:tfm ;;]tXvM- cOAP{9sg^=ē \9! ŗ}/*IJnmceFC#Z;]蚖eb.;]tK?7^K} /%Ls+8_Hcgton|B=7j+ Q.@˒t";]Ҡӵ0y:L\{ξU^@_ʒt:5DZ<F W슥W,|(( +Xt]ē O0Qg6VfDPPx} iP&t=zNp.=J#^K iu+8_Hcgte̡}/*CQ|W /gvoXY~Nбb=UCQ|o^@ɒ4sҠxp|!@7]˾b5[XO^@h/E״4(`X^:^k+]A;dSvZ^ L0Vԡ}/*4wR^ɒt&3Ҡ3?>yoߋݨj /`W$W]Ҡӵ0y:%t(E[ptb56=UCQ|9sNWk\O>z2q080_~n_m̈ء>E״4(KXvఌLn:eû{D@NW,&A'ttP- 4BqpI| mvvB[k#½9Ez(UQ5^,ICQt Kv6kOT,߆[ |(/g" /Mk+]ҠxՓ+'j~eߋ 욭m̉Rx:_wA);]|?ŗ}/*4wRU^IJk&3Ҡo}/v! Qx,I'BUװ4h't-L.{nvz&\zAT'g{O^}(K~Ex0nt=Ο췸5&Ye/yQw />麓ҠLzxd<; Tz֙CH'$%W,tV F Cˮk5R(( eI:Ҡxp|yPtuat0(ߜ}/QXtMH2KWO}maPY^IcZ;]; cgt5vB=gWE?^=$KP]Ҡ@wvJZ|ƞn *(9 /E׸4h',|xd aο,{QUX@oSxt¸5- Ē+]v5cn5OB#7j+uQ&@ʒt&3Ҡӵ0y*8wDx'{P_ Q@ɒt"_u KvNqa7^mo¥A /.%P]Ҡxp|!OajMs JIJʼ( õv4(`<; žԃRe5W]K$%W,tVEQae׵G^Pa)WCGЁ$;]  ˗^ L\{ξU({ /%t(E[pt@e0tKTž3{HZ;]qiNsfeߋ [XPxBk+]ҠL,be ۥ^Tik%Q|@t RbmX;]3?>yEzn6V: /6$Nװ4h't-L.^mkb77k )CCQtKv1y0|AXvkNhi/E״4(`X^}ONW,.Jv¸Ǖ:ŗ}/*IJnmceF@?Sx=ONK2e.]z!L-EF(ZЏ^@N׭|!%F{?t7{QkU@?Qx=%K҉P/l;].U^m7/^\f{B,I>W,ƥA;dBn6Y|B,b5' ):_iiPf0yNS S:sHFn6Vz ZYƝ;N%NWkm0ˮ *Kj5 /dI:v(wbѵ|yP@_^SބK?*5$E5. ,]=_9|!З Cٶ0(ˮ׼(^:^kk|!pt<; }}/7k v /eI:tQŹ#aa.ˮXz *̇jF /#vbuQO.\?e 0Qg6VfDtQZ;]t4(ǕՓv^TibkI@Pxo;]X9|N79shߋ P_: 8tUװ4hg6.=2jY|=UBZ@Rx&KҸwƥA;dBfeߋ 슥ל(N\|a,A);]`ϭ03TiFmc. (%LEŲ'ģw R(: 8Y?.Jĝxp0Qz&\zATߜ}/)}%p(qiN9_9 Cٶ0(ˮ׼(âEkNnK2. OͳP?WCAQx{Ҡxp);]]ajm]( 3wk+3 fXtMH2qՓvz^TibkI~Rx_7n )6r,.sо(VEUZ;]w7, ٬ {?}g Ų+9{% ̇z- `/)/%i ǥA;dB_?{:A2ZR$$E0}2hnoLTX)FC'ɝ_:] t]k&t}5JB] ׆E`o80\Wӵ=63(佷6ѹ3 5勒@L!uP ^B\weOP )إ_@k'TB ȸb.V0>]RMҴ}-rT @*R@9>]Z7a 9o e2&"dLOztmg4PY9X9*8n S / C}je4gictPk{_U' T_9@ Ȃb.: Qa`k0^@Mv3@RXP} 3`>] _B馋C x)oFqԧK wd0Rf0PqS|g(l!L%e Y]Ou佷3h͆w~`^@vR"ߒk 5B*Y] I^޻brz>H?^@tm͌QaF`0p_հJe2qH/^@[r r)E.R./^zHR `_pNʷ:MO FqTpwzw_Ͼe0P{C Hb. s;Ӆě0,^j>2(I6/9=rΛB>H^@tE XKg'Ч yֲ{¿wwb3{Iw.]6_a#W·wz dXT^):PF \%m VFqFf?O \˛1˂ l٠Lysf a@(صὯ̪c *g / E TO]d0GWf0ZhW%;qiМ=~~t- | .`(!xXP} 3`>]5Sy?+EYCWNt}nev\(uҐ9v#>@ K .g( x$ߒ| 9O]`LRRiōapA2S/,X^Z'+`w _@Wj7y/\)du2>]5`LlO%F' &{xߛ ^1+?@%cp7^C\keOPB0(_XX $u/@WŁmaVli;+a/ o8D pاk{pmf4Ptx3:wQATROA.|_I(RM˟.X 0( kû_Q2q /|KNA.ӅXӥ@ 3%:)WX *yxBysm: RK/٦`#|*8h ^%\)/le4G% ?zho`0*Pk}caQLY\bP)C4QMҴ}-rT7v pPg>]@9>]UP\L/*o6U0Y]>w~צ4g0PI/0@}tE X'>](ysuf@^Y؟Z lٹzC{!Fkpͷ22>^@/nSOb60}L*(ȥ`WZN\ϣq~u/S]p+#|:PʲὯ̪c t'>S|Q@ tm/܀TP士g3d%衃xgQVez*[ka^ tqhCA b. ]Lϥ>ĥAތ2ޯk"X58:*8\O7]:PEIC`-CB1tٿNsᮙ F^pӣgsd5%Sd}wjiNy"L0_|Il!}U{Ϸ䎛B|ca. vM:vߜ=@4fûWOa0PI/xoɭ0@W'8*Y/Y vOA~W v[7Rmyp]^ xb>lxJ (C.c(!T)ߒSBh05:w1 Y v"ٕ>i8S 4۴p]K;F8p+W9D%L!uP|KNA.ӅXӥ@IbK^|i/t7edF68Q`#|*8h 0u2-^C.3lVjKXַ=nh{0G:6 z婿צ}i>@9*s\L3-:e!؅2>p|]SŷʫdWFER l!<1൞j6M?@'\7L/` _W#8'lyyAXP^",4tQ@)CF:TfO $Z lٹ_^i \*! ''vt ctՀ.gwYI 2*Np2fč,nlhe??al~e\5{_Tptl3CὯ̪c tʷB/BOJl/DtJ\bTD R EKcޱqQpL0.Gφ3Ւ9L,n\\^!HquI6Pyoa0E/\]\oš 2K}L!h(]XEpVvE\fwF%]7Q F{U€,0W}A&U^ /`.53ŏ J {[rOBA/dROW|!^:_wg8Dxt1Aϋpпk}^ؾ9N\ /cA5V_i9k'bLz}W}׿1((5[rǃO7]:ϐ7B/.Sh t&-2rzj-6˚頻T /to c;,* ~eH(,&jqGy䃯r:k$ߒ|I/2!x0@W'r˨|!_W&{? ~L C7˛ N Ԫt_.yhhq=ǛۿzWѹ3^7e8;ߒSk7Á;i<Ň?k! tiRP.ex@eRՋNFt:|;UyK s3 my#RY58f6eQ)Su@VʷR>]>] tN6GYN>,lQ(l9Ib9ɇ.v{V:\sP;1]Pf@G-:ϐ kx!uzgeOP.4iDPPY] 6mC.]~>Q[۽k4k4m}ˠ N.9 R#xB@9 ⇫gEԟRV.wӡ sfYN9Pݞexbxɴ} S^d/$^OWT6ҧ2]Yuݥ:ɧe ] Z3lٹO\xBp?]cPGյ-9v3H";*_\{B f vyU3+ؓٱayxC)ş@)*qm뼰 QZʷ> NI ^ :I: ݌'ik= %&i~rQROC0JIs8`2O 0S|KN=Z$% euE,R6&g,KֹhTqW4>^\kûWOaPK_w #5N@p)-@W+#8:y{]s~uXZEy)]PO[W;Bk A߫ٹa2\#\7C>];L|a'#8'lyyAxɰS'Y)&K(g͋r1'Le]#{/(G*y^% a]$C(]3É&]He.>*`NksPkڜJ wtl3C_<#V|Kn_ugš |A # t`4'#Igֿ/eS ;{v~wKAq H f{_ϾeP{6]pPwe u^  EI=&x^lh{nsW_g>*dV~ӜAA)=ߒ{*|š \"Q1/DKg'Rl.J ^b]d9ϙ kTVʊ []WTcPPJkpȷ䎛BCx.[)/le4giF&a1 35:i^i%5VO9;B. cT㎆08I%{}ɐ&^a\7$,"]\d*@,ca{p{׉KCo2Ny6 {)E/_^B 5Q,_@W7r:uwҧ+&˩ZϯgH(x5{syZ58f6e'/η馋C/L[aӅYaKMON..#,spdO-MWM_3 \ASu!A”^C.>]*]IE e x@OkûWOaPK_w @  .fb=.]f`NӨ \wfb3(=z-9e{c8PKPb.=63(Gm ';F^q7dw&R-;G>^}SםBBUOweOP gy2ߏ\exP t0 z)ԕo3yA et)е@,Ud5B4@~ѺFq{Wo6^Mv0*^(اK.FĎҧ+lgw F7@5T赞&ŏ qv:2u!dM}ԣPe /eC.8C ON=uEeu ߒ;n S E tm/>TFf?OnA)<qGCZubA$ߒm dHP 5Ƞ@׊r!؅*Yx0lٹ`n#F_]f&HU 8ǼVP5|Kn3CJʰbBf4P@GٿNt+ x]碤WFxP{ 3>v%6]>](C4q$ PsF4C_'X+L׾N{e*Fw?@I:;ӅO I|Gf4m}ˠ N)5rASD}@`ɘ-/'Pz_M3Q3R.#;J lCB1t{rN89HuEe7ׁ|KxCt#p>]ۋ^$xct 5S|Q0x%TT]+P|^@hoq{CE/m v6]p)/Up:uw/} THV J -9zq$=x%H!aӅ/Ya]3g=sqqٿes9+S3aY\-? Ǒϯ׮{oDܷ]ӳǭJNW6k~\^ |gHW.Sje4G}k _Nō'OSm\=k+:o6蹫EꂆyRSmr>kmJ+0]Fx2?7k1нEq}$Ǯo3>/s_/o^V~>гy̆)0U_]?h`* fûWOᗎ8Zau7ǂYkeO*էK :})_ (M' j4b+6^d˂g{:9zw,l9 I=lF}mDA-}3t`XbzؚGc`[t]7~~3asgg皶Ͼ3޻b7l|KCd;?>]mf4Pt鴊^ޮisS \}tDkFt=:_\ꗌ?go,9ADhVY;X6/J$}^i_[XզY`2>x iv_հW_MrNJ^ɷR>]\*_f.i,p8Zj2mBiMѬ-b,Z@AD C޷rHf:shS=  ~ DXo9M߷DY)_g] z)T/v+9(i|Kt`4G% ?zg|M4qZ,tO5'$J?\ W[SlQ2Ƣ|gKCdFs 6lfDSމ~]z{乖I rgQu?2~i[n$|K+x9Vӥ@Wr>p>]i\-E:؅̛sjmMÁ8Q_(Kc6+ rE,6liek8m٘?W>s{GSgɒzF'Np}=kI-B^i2+?&՜J=Uu!/G}@ᥳLߓs"ϬK ')lQ֗~n?tPlVXfe}zc@}d-ZĢ;YcpM| 1Z@%w{bHCˁCm VFqFf?v֧+܉28[e-5N>,lQwf6^cieJ{SA٬zmTMxeho{^(5:ϐANZ Q XU 8M5N`:tjCS{jS (S?8vAPW:9o1wۯZڏ|`6{Ŭq:k$ߒSÝW7skeO*(գK0]/6X/Jq`'LiAFVݍ–3PJ~N\b`zv^5Rӵx3ԧKBtRDOeh"@lx.n\@ U;e8qiA5S99UGmW9D {=O/;!UKK^i6}8 vEIjO'y`Wm)(wPVt0E Wy%@EI!๤dLs0֟ 61۶Σ*bu9Lԧ stl/Jy'-إ>"r$l~üo%mSngŸM eّŬSzG=rM|Y=zALNRy66,Q!% ~N:EwyϬOwNTrk]3jP#|mE)a|KM3$Gb$x%duw/-6w4Q/.O$VZ\w7Z||UKh |Wztzl ꦻ~N={U ^=}h׹A }@y4ǽ~&_L] TW /ojQ۱0>};?>w$(.?( ԃO=ݟlzD0m3`?G}ED}>E5z/ٮȣ QqGo #N)9|tqK2^& t0@W'r/|4& .[+ף \MruiXYڛ W9.Ms]z.9ylAt>۬KcKv13_*gvyBTFY6Q5/hC#}[^(ryitV{z^ ڧ鐲ˊL$YiX aK/# ;~l(j;N{9vxi\ַ=E l7? |yhq?þŌ4jUnZѦb *Vm@܇Q{ 漶!Xj SCR3e}OO0Gk᥷m[6eGq0=Ox<9nӅ/YaK/_iQÉ!]6trdS gm©l(VpA:,YC5eO*芿WaNtjۤ*5D"Qd=Di{ޙH\}qzEτ=k<8=gK-9Ca kAJzWy ͥ45xUᰆf+z䃯^@M!uY^\geOP6&&Q.8:O 4N:E,+4V/lKgHׁ/=ղpP@S+ Y#guyWNkW٤\*颴dz-TN'g{<ׁmn{WjIغڋ}MC^|NOslݗoyؠ !3% -VSů|aw4mN'SZhSH}]M6䴈T6\1%k^|m^ޟ5g>IvO|9_;HWTnW|VCǴ6>7*u9S_[.'$N?=z&ӣ?bLR嵞צ4RvMO[r;Uiէ+v'=.:yf IviUz&Z4$)5q2s'67-]f(@>{D.KEEJ?2p|~ʟ 7t/$={'!Gq~2P\u5nR]?ZL6s`s Ez`)*U= ^hRX<ոʖ Iث3߫?Vd}0RI ~ݦ}8M:5lzH(CM0Læ&ʮzhq@̲EIN3XrW?ޥ{+K8`|B@ mkq\ĥ!9ez7ZzD?2N >s\ͿdI<0v.9Oߣ-:fet'_s: xO"Ыk:J tk OJDRh<>B]qӸ d%.+G'8^Tjջ%}=\nDU3Ʋ6\N2e( Y#5mʹx)hwQYQc*IwmbUI3SG8l: / tH]*>]``W'6]=;<I&p!A/(^Mㆹˠ6]l׋.{ʼn2McFW5F\k~&4?k^]Kg].zfi}.r8Y.yB%PpW{%6bVt0H%PӥIzжY+Ʊ)G z( ƻ.3O}ۥ9zu20y?@}=ܛE,\I:<:wF뵞DM!9?`^@*i ;GG'tA'N-ja5)]žr8ɫwmR*y\nSUyJ K7c)5-ru]RҶgN᥷eCC /ez}\iu#zmD}VxA't! tb$* 5I˶7`'ZEm<,AѦ?dd]QߟKb BV>mkNx 7-/^e.:^x)Xӥ.t$\ ҉4-dmOV>+n lo&u"dR%zYDocSYj(vrÔ;г8d2]7՜gR*EoY^s\{^[^^&etBiuKEETV= tp7[oq֖ uB97ߒOj/bQ_sᮙɄg禦O/(2 nOֳ(km(Rfe] zqoVGZ]}[~?^@i_:;].`Sf{ 3&E]̈́r:Mޤ9&Uӥ҅{ }C'tay$JIa{Ui|P`;K-|܁- i2 ?S\D$y0Rlgyu,̥jڷqNq^({%GmS>|r>>T~l$*dAۥR~D>f;+Ie'PAPA^_޷rקS%餁teƬ6lS$RT>D {-ޤbwMk=Zoq5 %4s1 ]ԳTd<=Cdҗe{&=O{{u;rZ@WH'wp1@tQ%dNAtIwYhMJ l9xPn,]gw% `EOS%:QeAn$:J)m$.m3>}/mjXuvS˞QxR#lLDwBIa%k=aCͦJXP}ɽ8:A>]:QU63w"E-]~=qS7F2@h>_:3oW>RY^2}OΡ!Q2> N@u[>#!:+<9Yڬ m|4d{)Q *59:ascķ%;+֛CjnjWS_kԾi&L =^5Br ''*+KUȂ"z]>]>]:)>]:9Br g3ë0" pbɎ>-џEXWL>I{ %TJ'ݕ$6,g,ͽq^[^^&-etB{<^OV~LjJI,eg.kN/:7lYN|YԺ:@q Hm;<'o`1Ӹ5yd5%磻URPRn߸fbP)✼DNPB9=zJCT簭ϝ6o%>d5Ė3pHYhJ7}1'$nks9q.Jז uګ(jrG#uqo8}vnx"7Vm|ۛir{QLƢva؉4_8L d;.6D]0uoP)C4&l;?L(9zvk]({QpZbOkӅ+bt `$-`,%RӷV9Dd~qSo͢X;sܗڷ:$on!#N&L}}MW=ɔ^>] rh ~WEN&pr…uF﯍H~bN0@(eZ^ؖȱOC顬{^M^B<%MmϷ7Tk\.euuAEէZձYΐ! l3X9l~umw!2o83I^%9K+'vf/WMb:ya0i ^5M+FR.$EWD>][f5MF+%3dQvm몜S(ˋ)?}N]ge5UR38|2xJ:|KnW{U x)¦HSSP^{Ed'Q <('; 6vuOds5׳U$x,ěo'v i;<_X xOS%Ck=B%Mb^ӥNqW.E15)PcKZCNZОX5ͮ^iѻD)gxe^^jd2~ͼDrT'xMj`}OΡ!Q׮bΩGJaHv3ΈX #$^93dwՌ,/Nc;Ţfweu~q罠ܷR6~8d &4ZKu盢).C.P.EWӳ]ds$ HϳXAq=؅~~@EAտ2/y_e??2~pfYi]}/4a>>JP-/uB)+X""۶ # YNDe) ȴM&ۛgڝ+7Y@r޴%Ԁ9~&}^&>y>XQgÔ\_)/dGwE|a2'Rd?v dͲ_9πsTe>>dƲ/s|eߐ8:9D7R16dx>hek@ö\`kd(kkEQwv q.53+;;! Jِmr-\}9 dQ˧Lm+K8أ.&zܓCTA<ճ^ i c6EIOҧ({@ j,O03e38zs@9w&=R =NZ'Rvim@%֑A*Gb@0%p(N./Vkߋ /t*F]_l=Ĩ6\8e $6L;-*s_@i]Y.6_p.ٴ PqPq^$^Nsf=6}l`%/h~,\9K@' |)@mhgs14gFr#឴9D`UCE6҅\& [l5gUqbH*rQ2t).|/"}]zeua@W:߁0w4G>ڬ:1ƀ,^ȸlgwqSH ~?ŵe0wFQH6XKĻFF] _$l_Ls{%È:b^&dhbj#]@hc:-JVoM؛XA0 K4?P֣K 2^@ז ug^)\`C'wI"H I0@ft)w²i8qݷK*vdxjg?4|𵹯9BLEcmG ~DrU / W2ؼ0K8R燲 IO-//0Kg1 B+%|3`$dq栗(RoF_2CSϏޓ{2EIu }뵞h $x%"ԊTS4YH@).6jޏ@^DԻΥ, '=u;CO9~ k=aZjԗ.Nq3O|әdKzVy {'xR987/Dݻ=+s޷KϊqY>=_8'L&WJEV$Ƃ ܣ ;f{]U_]KRVz)#|IT=9J^2۶ #68 =  `N\ϫ~H^+kk$\RfWhod DO<Ȳ"̊4_k&dU <bL]YoFeE&|C߮LӣgPIs#LeEaYGӣ?FJ̫(.ieȴѹ3Ls^$$/ϨO׶_ #ʔ/ٶS׋2Q, 0( pM].3ܷ JQ/%_}"ƊO"05=^@YRi,<Ӌpi}γ fL흉t;z+cO"Ɗ@) c%*msGRġ^ؾh{韡q +Kb@ˬ3ݮy$ۙѳ B)ճ͆2N1 e"3NڨBךE? _iʊ"zX|frgoQ@i߿oq{y䃯Mg2(𪳁ݝ7RG%u)6ӐWy dfUys^|f^^Ws{^ug wd0-%Gh7 W\5ɴ!Lcڢ ]@{C냯x՘t__ZӔR6TA^k N"Y+f0(Qg7F޶u.Ttz7a%6EjA@=7sGO,U2j귔l5^w\R&BZHѹ3Lsk=TW O׶_ #ꂏ @2hIC~ӡ?m?/lmJLE%'. ˨#٠^JQU8bO"mFl@rpa1.,/W]br@q,gfï^SHlߓsȬ"dqjr!qfﻀPƉJJBK%xc2C.T?^6Gqezmyy^:^>]70`R /.)ؕm CU|`U g@RzqMT%^URUWtVlO:Hlg.kAwe>HBKKf&dhV͞az T=na 1`+PUVE\ӅZE܌l[p_ތ1|vev Y^4{u/T.T0gMdu.^1ܹ>] 7N!;lL@5\ex .|sGGn,/RV.s\?S 8b;UvyY2P-ߗy wʾP sBrݷKAovV`6` =?3\/!͈ۙRD>8$ٴU >/(C]_\O:ey 8d{uX9̢ޗmғ@RЯzK Ml<ҼH^3#G,!e> K#TE( C=\f.)sG̉K2>[s .wMbƙѳξK 1zeugߟ*٤ѷ+lgq Irb"ζi x4($\eP,|ۥF{54|W) @ `qf^9\Y̵iICYKqMj6E=Ի%e5,yL{j೯FT:~8/s_,Ykۀ߯_ zAX.^c@/ 9dye}~_>9O?@ N\=)kn,6_739sdPc=3~=Ծ`м96:#U֐֩ZH^cnNqjsXxX2nsdtiAȶ3Ooo{_#殨rmL/\$to>_DaT&PJ]oxp`y풇xpUmfF+g9Eu:Yb6M5lHJַ=fD.\!|CvD 2E`A.~]_PxdyHӣgԔ]O8~~z=%g9lߐ݅$"x2E`ϱlkp!\?_xp 2 (O)_v>w_FF6/BR<H  4ϟ/ FzHs6_:ҷ-x8 _};72h/.Np3lz{{+;9x۴~pj~<UjAᄏ;3з-ex'õ?}t|5reR־x8v#gxN$E :~xO^q=p4GOdpEjձyI_evq/gg}0d&0xЩ!)қBνoTC>'ڼ9ROY]z繤<8wN+SEICDJvWd,/)+ǰ}(}IW]"P:QvR LrQEhYozvw$&R%L@CK%!DNzeӈ ~mHܔF2,os R֌ `2裊z1ǷKڼysD$6d]=L'K//WY^1'ߗ!+59'>"A/R\)Czzz $/T,6d*PmK%#VXQa~)Ic3 G s >bivѳ |зk=Lj)f4$R ]H*^j:Ul`ȲZ]ZXI<.J5D W22(k8/y$`L v|_=+s#Z,B!g_V0奣{ǷKR ix ˄ ,Y9}EEWWW쩺EȇƥDQt媏l(xc\dwM ,ׯ+$M [YZg8^FΟ?k&6[}0~,ჩnPkgbtϫ y'(aNjJ={?Sv}1'z_8ͻ^` 2}PȑsCTZRv׿ۿ1/ !ZCd acH.mPLtI]*ճ멧WGX„<6^W i+9d OTTyA@d/.-:H"9rPF/@{-JɿO2^C0bM*\huHM'Lm zU[JRJ5uNWYċ69n9`}-uC㤿 sYz.eY418|*AbV"*j9R zi@ H VFTQKW4['TZlkLYxgvQm5N:Ue=fddօmq3Mr\>*ݗw7&&#*%{z?q=N*X'ZLӣg(S{^S{꾛LW=^H0!znet@ ١:_Q_(>h٫yoy^{*aRqtxr|lvˍ]ja U6 iPL':^A8q]3_ xG׊+*~/e|a^`{+)tCi DAeg25LR ݨL4oW7yd6PK[aaA,>TH'1ƺ\oV)8K(8 ba|7BdgUv8$;ĥԭ=<)1w 82DEц&*}IUR24a*LZ[oRH>eܪ`܂RvWWWWKe&UaJ#N8t=pAݻS pM8;ֆkr6u>U5(H{cNt}|Zn)`y jVs޽|4"+\BvEs0Fs]VR2g!V?'&1x)gǎU`I+[t}q\Q-7 s9Ni62ZOxXԖ+3[W5 # h=aD岼J-n(Dr h]0 zl=67}å=mD?WYEpꞭ!Ϣ{PhN<2K|w4#2V{JQ̨uwfruF)YdwM}9^I~\.;S}u`} o"[bñp4K`[N$ X"OR4Tv$P"$F(ы\H1`AHQ~rT !SI¶n^E&;p+8?(8Cr?˺rC*/fBU^7kŊy>l ϱʋ*]ZЕ8ZjbߪRU]ΰt0P HBeQxYCg~|v+_vw (xszif"$y[`W P]I}|gN&: G{B;@RG!ssd9rדa.RiP"@Ѷ[S!‹xV l v c ^@A᠝aaCBHAlHBsΟ|DKo4(xRA E^L qtls\OOвVU5Z^.>U)=ZvUv%׋ќ؅Hb r!!8dWx+ #d|?焖ն \:^ SwK3,.eX),!$LP̏ n"EH^Lj/ZvV?^3[d|Q5<<VfD t)u@W\kr&?hgXܱ !$ e񤼄51ُNB/B*b ~$b|d!E1j &+r/tuB1bj< Y !ac=xW-?aKJzi .8 HsÐ@byEb҂R0AO֭[Wݶm.>s wH6*ƕ@EbV8,~~( 0^Fm!K Ul+q $& 'һ'W]+e5Pċ0VBb̩#b&7Qlb}i";ON>*n\|e/uE_UU.^RyWD. SXфD ^ɠڼ5) f&\bAI[566&;v+1 Tw L *]lűO_~cr;EYw[jZu e@?G0& _pb.XLD ^} &$ .p++! RY}0Mttt͛+OiYX`p^S 2 >hjlo8 !Q2ٌ;,+yCaQ OL`aOcvuu}׋o W.EB/B'/f 'N !촴hCCC]$<ӡԌO]'@5/P(7^*YDUwTOp0ֲ Lzp<& :߃dƾ.y@Je.*UB0+]\e`תrXbMޘlOZ\K_*2(4|aYfK  q*W]!Rpekҧӱ\Ep豃2rדV._@4旄 ^/ TP i\L]~ZkR .w/7B8 ofd_Ǎ@H`4.w.X'^IMOцbrt^eitt4$=>JHD$e($ʨ:^x]P:TRį0eGyLұ f#ΩqLQ>?gzYTvA*uof$T1{o,hE;ʚgȤs~az ^gBUSQ+gb* hBH! xAҁ /X`LN1I؋II~4W I]+Y ¨kum@JJ*@#D:c \? 6 nثS=H)5KB5]HDW-v(.&fpB!z.hJB!B*v70AB!hmm&sB!B&bE/B!r*d]vx d !B!3]:::aCH@B!Օu0Qe0uH!B!$v{"9Pu1iooz?wYrd*(xB!r ^^}}})zB!BH@㢁y"GGG [qMB/B! (LLP"B!Qb-1YV[B!#*"&T###}vJzg!_ɴ^zI]`!GRvMMM^WIؠE!R@^;e])zzz2z\v%zћB%Z)<|bOqJ_|9! btn>**I/B!F/vemhT^!$}3{8JDz9)ڍB)q$lP"Bp za߯}ͽ&'e Z F!1-X jG;`We4yϬsB!♻:EHE!B,kllhU[sBH0tSBR*.zuD.j,ݰ_BHr<_9˚戴&a!B6ܲe _!3 !$ÏdW>fUs!BWBa- !BZZZ=*u@m#= !$ȋ/ ɦM\_gN nI& j 7T}ABH# /KIE!R"VXĄ ^ˏ/g_/B 8zK*V5#vLluY~?8C _L'M8`w877!Jǵj ^B!%YQ3%on| u|%|B)ʶB|UAy@U_UjU~AڵkW ^ѫv2YgB$vzQ}.FHE!BtuuY8tcVu-($YTt @n$jˋ`"nJ d}x豃mݳ,񋖇BLTL+IE!B`L-[XDNyDsFN|!Ƞ/{ԟ czSS%p>N/^/T)C^]BtG׹/ˎ70ّ ^B!Lֆ,԰`򶍲s!օ^6nZ8u W҆^[CB* b@^aǔ pWPx.B/B!C{ⰣG&I'm ,_vߪF\o!xAERZn[IFT uN*kSJ'ᇂ!BH1; N{{5QU6ӇTطsOaOP/yBQ"0'qRτױ"k? 3!BHAvttԷ5`7!&ƾ`˃)qߺ,aGRApcUW@W!Rxg_E]&ř18$rP"B)0v.2 &}}}1ŤȊ'$8-Wx~̌GRB ]Tį qBHq]KaR`RV6${q塗lD/ܬ v_W|[AU{UJu'!\'a,EDc6#ƔIKCf(xB!J ^(K/đ +$jn\fw' Z+.,ݰ5QnA6%v PoB4H@bxϨ`OKCf(xB!.m ͨ`JLj0U/$߲\gDFQ "uPvd'xvK&(vU@˾D!$\!5.w歬"a!BH0MFFFq\@o/1Dܴa*^H|(UY?«5 uBPVKU映Uz}PCbB"~Ѕ!D;Z \o ;!BR+. ;['FdXXF-a?j}*(zg`qbQA6d2!QA}|s7 / J ^B!ETE+v _~'|! +xyqH-ȱ~}T;TEm_qYׇI(IJNOӂ^!J wq>F$$P"B) An5::jec`OL #\\%{"ÆBW )C7 KԪ0nFPaS5Z&;f?/BPA,_1@ASS7OL^E/B!"xU^!_dL17*/5مOEz{l a;GWnMRJ*"(ը#|XƪjH2,IC/Sb'!a!BHpPʟvK!oy;eCH9@kWe= /Tzy3_t(:[C#=NA2 z0FLl޼9{Ps!RcL+HR+XE /B!"fgn+,QA7lf/V_F+a_WBqor?:^E loVN} ,#z!F.'+`*!Bi2`<@DI:kֆNg5`Tj.l\9fN^:aJ%z aa I@E5 TҖ!@Nkvēqs$a/v(xB! dZ_~CA(.j,,H>KUBK' )KZjl i `Yʼnmh7 b::VAY RŭVU95hÞp@HPR Cկ+h2?_e ;3 !BCj9y^KKK{ގzC%!O~$񖯧s7T{Nb u LdnrD€]P}0j~UJj\ι~v`.Tnڴ:o~:~I@R [2157!p}\`%ctY ^B!EA[<,"蟃!/?b/Xr! parC9m# }/|NYQŶ!zv%z~BBm$WP}WƉk*LSV, qγ&0V>@hiH!R$֙5,>X{1LQʐYwx6`0WP5- !z cq)H*ط QU l#DWVoVv8q|[Br!DԲIn0,<&G"Q!BHpˀ3e͑ƒ0AW#@2( LY:Q/ĜRJJ&PɆJ/BZB oRb22%nḇ{!ׯM !٠*qdD fS[B'!a͐Ip#B!$o5yAԓ9묳#922">^xpLfUٗk~zP#qX%D/X>f'ǞO~ֿgsg:c}W&JUe3K-FO ֭:,D>98Qդg)H@rWO7 ^Y K/9bXClj7|eKS|š//H0A^VuSOɋ?ZRN9~"=_;Aӓ"B)4,#sMLqR^r::IʗψtA/+ e=f5TJ/c:P͠`0%0tuu1T/ı~EʆU’!atCue={!.:(y ky"$- IE!RDL)x~6Tc*t}0|0 @W!z%C *jdDCXK /^`7p})}̢OTº[VBȴkP;VTu𤸰:!B[V 7PAf(P`E$KAEd1HŻn\; l^abDe?@*[1 mcuLn[takL;oGaBPj0rȄuȅql1!!usMuBW-o]mLv"ɵ c +4j$"& B)Ȅ3MX'U;vlRl_xcp]+]eu9'UK` >3Lt@V0ٽK7,l [?qKY:Q+Xϔ3ћ@U-9c]hǸ!T6S@]1v8yNjE֭J ]~H*@D? 5r":16rq㼖( /B!"R}9I8@TjZ_hsH Zc~CJ҉h8tVxӕ\"k[,t #`mڋu[B}ΫAUfFcʮ]( bV'R %2T5+NIB!kw6R"ą|ڏ`r!Y ~$‹B!o0ELRXb qL!N"BAWkCT@|-ehGҏ>n@ʆLDr9킗 T =[ͬWbT={Ye뀽\+TB 3 z566Z^& wuN +ϱxݵqp]j>pCz$b(G+!Q"ת.sU>LZ /B!" q VI6߉=lsXvL2e |ߧzJn^G'%k«jQY}X'S7ٻ Tx+lX\+W UP5+rP Tu}F]kU\pM/$9ͥE"/B!"Va v*x @z\XkV=>@y?/RطgdRk_,5d lk1}EF ]&0byЅ8zrnqCʞXj|Bú/*0 4UsXy ǹo))E~%(xB!Tg`W_]Kv+!:UkDezzTLKKY_@K#gll55̒󴢗:v*OXE*(u=] B 5bazJ'ߪ =tI0R"Q!BHqb耊N @[eTf5 M=ql6a1+/l\ekh/4 `_jYb[.Busp߅Dbk]VuŃ^:$:P"B)2nAS /2 X7oasBrn\Eܽpv}}t=v=ߕ)U+f݋*˱m6$46wP0K_u:@7DO&!WPPU^0Ĺyfjil1y\Ɲ/]m$c谮}yތ]!BJxU.Bo2]XڋbWU^AD.ΒB^Vg=g-Dzp{#c6~'HJȷ.~, jgyu\?C3&]kob!cW'TB}a{{;7bD%aV/+!BJ.H0Gx^/+YʫAes# +-X9:~e{>y}=/a畠 8'C4kP?S 'r]7& R.$_EEb,I41bu !BJ.H0Ga ڋ*"\WfpkCgi8[-n.q2.ҿ v4{Y!tkӾ?_.տ˚V͐f*f |~gz~9F?6W:[jl&̕EOBzۗŊBRRՅqfttԳo  E/IE!R"tV\We$p߻d*/rH]p[gкסD '@@02Uee[Nl7eixUF]G͍3KOZJUJUv&[b!&jh188r'$P"B).SV Tg*lH倠ą~4;LD.͒it+̾.U8̬:q~,G ^}8kC(V,y9*|uicۛ2B5!Yoc'!Q!BHpː"VoC| XE[}|pL򡐁f ϒ/o1Yҿ}%fڗ48vqk+ds~s x|Lj[Be4!uN׍AI4ٳgq; !a!BHpkkhbА%~AU{#zevr|NǪKg^r.j.'A[r"eͮϣ~΀!#n`[zt;R֡SpqymgiW2Czm)v'.(㏩«v2nI(xB!jzoFm.H<1BPLAlj<]:,wD/?=8+kv`6w@7^G~5g0ro?۶mܑH:o AO/oqqy}s52Zi~Lz~pBj/ju'4-2kϢ}\%@yެf, ϱ/A @L!Y=69\X|lzd%]R.ˣϼ:nnvH@{ "&ΡA. ]>v$P"B)! $qd췴x/l=qcK*}ݳcHoJhDB\ǧR3_Oϕu̖G\$t&٢[πF~J//8U,yůZON}퍗G^`1Y}S) G/khT ڴ<лKtcIs$P"B)!n$ b #?PiU|yO?$W޶ ^ )u=zMiYGtU!E.ӟzRwliJ6."KW-xm ='6oT4_$]mK iqI+X R5i, :)Ϟ6#ߪ0 cDD &+]Ń"B?>\LPvڥ}b:!BJfсJr-[x7Vcvep5*PU SR\fΗoB:z ARN=OSᕰ}][RUeҴidWqA"_^d)od? ZZKUcAeB]3 bWЪ.\K·rv$P"B)!n6;{졝 Q$^@@62ٟ#MdE/§%Zʶ_} |s%z D/OyUxBY.RnɫWP|_ֱu {fMQ u*l!Y~B|a]]7bc;ΐ ^B!%4rq@ lkkBm5ܮ.l\ 8^"Ln Y8C~yXu֫Ǻz!D9[w~"Wxla 1AB! {V7AE/Br4BgY綍}HAB׼~ҿT/hSⱮ-uΕ;۲Szj";{3XaK*ϝ'T<~l mϛ*J.c_.wů&O]~$A*U]܂q+}\iX7KYp^Yx#uؘqd)B/B!>^H>f``@:;;S^׭aSK)id; !r%|_nO?X8KY8+3Oo' 6m|Mj bchέ?ñoIߛ{]z""*5j"뒧BGEZª}q']oww7qdz0b^^+L$as4kWݲĭ'Y{;TH'Ts,)^SǼHn6>Լ~ v!Ҡ+u8y_ x*y8!VMZC\t#qO+:@|E.3u 8 o4$.P"B)7)v19l"U1+k0V{dƛ?8[+r_kþo\d^:ΛcLY}z"X; ~)KCqcJ?sWpWˌsOD?=hv%l_SK羣2ϴ>Dk~#&JwL:ěĬKƘ0~t%hr =^xA^Jy+d4ϔu5˪ı~md=S'|AjHוmdKDMcUq`) IE!R0q%477[,T߹  AQ{0׬ ^葃J˫"B/7_XAq$}^T\hZX}TĬ̯߱s 8.!H%NX/Ә[W˿UaS^D,K}Ȧw/L,#^ .xR~HU{Emr kʞkahҸ+Hh(~Xs2v-|4:B &py co.$QB66D$L[AuYS#~X`Wv_k[&b@ɱ«J{[|-;俲 ]V&uWZ\@.Eb/B!2aKCPM. )6 HggD@Wz إ_hE W(4{ "Ixʥ+7=Oxۛ-pkǎS1 !繄訿t~_`3u!d'~ >qB^~3k9!C9prʵ~5Oj"Z:B?"Vzk?)m c; \G\O@ ? LKigHb/B!2&& RFL*uK<CA͛7[^~M>P٢*~]\Nտtx[jP%6J*|}'NKQmʮ]Hr@_BT"iՁ1՜[ny= W mp`vzث˟{1r߹/mPl4_H~|aZrz-Lզ!6coH#}#?mcd+\u䃛!rG(xB!.cBijeMƊ+2@ozeǃrث`!Z,$~զ{9m=)ל=-UXnccWn N=r6>77D>VT6胗y\q{0%.K>t f[M d5göP0&PiޗUp}sgd˗N!`aa߻/K CR9iJHE!RFj7,cb<}}X/S ;zmt:yrZotQJ&e328v#0ݸ{1iT"W=Oa{ -⫻1:=5c4CK,}~/ҏ0йkA4mZ(>Wt|s|N`A}+KAq5!\k3jigHb /B!2>^ѧPb =bAذ~~Ї'_~8_}ݚPV{A0183!y5X]Ͻ-?|Ky+/zI,ݸ ,Vh2vԝ7;H*Uݣ}.: 8"xfMիWK%WB9+Bj9퓋f dz,^\93XY91OI乬SkxL`2g 6!Aصk񹥴3$1e7!BHy1^ ?)vPdugrA5HR ![ӯwm8XIu)@eƪy2O52t"isӽ` for!K *$V*v;t0$CRU9[)?C=e=Gr+(eK6~&e8{L;>O{LO Niii Xdl둱@!J݂NlU_B_4~a_t|x_WO D揞e{48*y-]]h_;u?_p0\J٫OXbul_+E>[RaI_׋_z\ΐZB! m MkkW*mAd"?Jwܐ `{,,aK?|u"m1eM5KfIjCˤy^2 8m^hŶ8/B噫ݙM}Zw >n*u0ʕ+#1cAKs5،7t,%V1 W.Lv^&Ε05.g|;aӫǷ,Ä+CE"*H+B[y<؅D \WQ"t큱eښ8@KC]B)17lM`oB *7 &9$W}&Rw2UDM?(|+JTSRpzkti(nE2f ٵdNˇ ',!4-!Bb"֖s ^ Ҹ 6jmuR;MqT 4}pt9&?/!xASG& K /^TDxWrpUpKUw|(vReCj* ֑h7Kw.cf«R\/}uW喈w՗ޫ5Y_tk!WM$/~.\7"b)nhgH /B!`"tT8E/T_5~N}7l>#2"C .~!F"tŸUQ$Ŭc4rL1X\9*2lU5EerGIW۹RzeDP+C0UgYJ?ȥ>-b ;ắ'"lOQ0R7x2>9sc5-Yy!u zED!Կ ~I%q!BHpxr:IU{.2OBA-[Xvp7?J/#D-_-ztY5 fIU'CXg a~A@[ k!˷G4"sܾU.%vE( bWJÞ={5lXฒ|%~y?.nU_92~w ?~ ~]H@2 ga;44~]d-NHE!hkm?8-Cjp/r\v٫L ^uRcpٷmkগХ(P!JWΓc/O/U9qdvTALN[2U$ w3,f.T"4N8ayJ Wemee\,uu6v]C_.>\◩ïBLKc-йi9cȏ&-HOB_3|bU_yhюHbi^cq-)vEի+s+~]$,k\ΐT!BB[#aF  z<E/W\I+TNx׍kk~tPcKh U.Z W.^&Z!0K_/>%+@.U&ύ~] Jފ gTx~_,z}%|Todr"GexXtz*VY$ե5n<`JE* ^B!!­m Mkki}aЅj/_.S+%;v ]G]gϫu2wJ=Ӹ sCǏiM|V$J+Qƨ8z҄%v ",{sȥnV\džƛb)mc.$Tnqԑ " yU]Eʅ[5kVqa&7!BHx02!z555qCEv9.ω |Cf~niJmH"ώ3=0˭ 7{kIݲ6TQdUO$|^?Bܺ?e7hr64U;!Y <.A^9v̤^8f+QR@Pa/4%xُI۽K>699&o4|&u;>'I1\*&3%ǜH8Wd|Nr|7x/e뽷ܦp|c;kZ;nթ{7rd˩&FXX e-n:6RL(xB! Ty2ewE+ ( `uV~Ji2f)/ ƷZV^*Q3G+)eӼf 1헍 AL?bLe7Oh{g\A,WR.022<a&&9%L$qn{>VtB}9'5g X>)|3`ۣgC+vƎO \ Y~9ݹ]T~Q"wwfs Po&TY_.RaP"B n20fiQ7---lLX^qHDKR|SZ}zԝ7ХkBy u}"Yw|i~򿘶6ܶ˧RWD◈.gyliӦn&Dwd/T{IRD UeV9\tx2-~M/&e+%YfbjǥPbʪG+HA2ۍJ!BH0Y)`kXvtthG_{2v(CM!:-ݸl_YW|'t9Y[V&@k7J?t "D/mh<~L6X6"W"KD\A$P 1&+!Q6~Kӽd}eʨ-0H՗v̔w.\mcEbF M$WJ6y / ƾXښ*T@HAB!$d`r5eŊV{RQ磴V MHj>8)C> 0KlK« ˤv㲒 2cy,ɶO#Nw.k//P/0l`'5q$NJ9] "Xr+j@%Rvabow.03NCDZd}hxܵ{Cco.glae,kPx>UęBT'xkZLqE{PX#"BzrޖpCBrn6UwƄT!BB~ d^P$@DGP,KpR|ug%cRvi䌌 &~.T+koܲXt㻨Z!ti*<.b=+eK2v8:]j7٣L=K{\3Ieh =`[!\ uϓ.x9'opeܭ+塩+*O%eg#K < Ȅf~B/f_R#%hBK- |mou̧KUܪ(Vx ^B!!& _x@466j'0^&/!ݷ͔c]m/ewTV__}ǤU]؟+=>큻-7>)NhhʸELb0廊; l 98ǡCRxVkED+>sTl c~_^iŴ*;4Um u*vcUf d,H$3ei]p\~m=^78{X=?zEBVp.BP"B )òl )x^CCCV ޝWnU]ץkl͓Cgd?MHo}/Y.vG~AoJwJ/cyؔ~__&uϕo>g\ +ؑd"WЪ@4ɆƒWuWg07r?H՗nwx&s9!m} tbK_*s>XP%Hy.y_ɜLa+jK3K̚t2~Y1GUHú }/@DV݅! /B!DnIy|Ast:ѫU]WgΔm5[rzSz8%{O%,F߻/+[tX.5 gIY.a]"+ί/̸ND7{ʹ,S#^k, Me" J".!Rw˱cH4Y)~MzTse?h՗>_q\Z ^wsJ1*WϕKϒMIûIݲ+g諯bpFvJ |g$K $- "Wn7s>IF`]kjsnn`ut(xB!l +ބK)h|]aY֭[ΖNɮ[v-N-;{Do@n|jkr%VxU! {M6cX:iZ&KDW6mMrVwc8p/WpvdJc-K[59~ %~yTx%Zr;}'d˶] CĹPWWKÕeӻKCV`]h,1kұuU\3TVGܒ8E#=5|NӇjeVƄF3v˲A3DAw~:(x* v,9? +.ǩgHh5?#ڄyLZ[ֽ](lj8۲r;s&:'sd<T9׾Uc?_O}\?#?zP~?&0m9k _VwBB!$Ԡ xS `Sgp*+f9n XVPO?/_%Z](L=@U}!I Z¾«g=>)K-s^BWnK0~"m>`O@A }ֲ*ɂ Tyo#R>2acrKuN:tǣSx` q{<޲gVW1;o4sK+K$?K+iσsV1Kl;9_] 뢫SCJƴ+WZ}SiJŽ[/>B!2wI U!^rr 1.`\%gIWRHv4__ɥkqk ^.BW!t~*\ g D/?"sM B#=~Ϟ=hHhA[%J>?޴X>__26;Dt WX$?}F?V߮fLioнdwK],MgQ2 _YI^]Qun5Q>3_[bҹ"E:n@܏+º1D.Bҧofd_Ǎ@!Ѐ:OkFGGh&Dց^}~3 V.GSO/]lύ<#{Nʎ 0]#u%=fd_Wuϱޒ?yRt'Wڌ{;{MVbU \SS#ǎ ^766ihh(18pM{,sbxn2M1gOI_I˗;2?'ۦJ5PJKI-mR **I]] $QH uWIZVHEld* RR 39ɹ{sdf~>Iu̹yH~3\eiEpof{KoO2.>24Σ;.W=A QdžW SkLxqd\ܸm: np}ܔqiF:^\irX*>2~vuzU])}٣Zr'4]:^:˱͗?Xjk U-J?ؑEr*%dH"WD] Sj_%LUhȎ/ç8«g!ucҿUٲyggW*ԉro+PҎԲw%EEnRj%v, d @/,`^!,XzK5 % -:5Bn^e Ǣ ө7S2w,XzqD;@,w{R)4d|jx)}5}\r\6bG.d yȷG[@¢A~=T<2)SJ;GT{+h-%:7ir+B-cFlIQkYTb梏.4 P05Ty#¥8Ӳ&qW__TQ '^YUk21 kQ^*U $k\ Az3$j iOGq{1Nkq؝˞ga" "Yc')#O_H瘊БQGO!1^( ӏ*5v<(:'?I uIOU25_So]獧Ϡ5SkcU8%qɥѥ[K0ҭ)Z0^CAk?*++dmmm ^Y.(lJzq 饊 Я׷VTn/pl \_'Q ϦJӎRxzo%L U~(0|i0.{tj[N%OV{Y%i: (#3d ~.CGxuvv2wU]U,4LB91UW2)U)@}GT<~} ScIu%A>wT,ҙS'p^ɦ5Iq Ѣk*UzDwlԏ̡l30z#^My Q3J Ilx:ҜD5LG|u{ׯ+;T/U]/I)`Jv"tӏPs*>sR+_|:4֣:!<\L,,u𧸸!p+YtWT\и\a/Qqw>qǾl׿xeQzI8N<}C 65}A7#W2W, '^YOlmr c,?ȣJKKҋ NNqDU\>$!ZW=t:/[)TK־b/ആ΄]l<$I Pe) ezˤ/]2ϔ[lI"С"U+EMc>q%k]ɄP_iU #0zk`K:|~um?`.\ "/}wȶ]덻Sq^"9e}ВH4rԵܞ]}Ty[i$B,5>N% 8hN/܉EFɒiTPpmGtHX<i>*2e_ *K6,%ϜH{zicMCTE"H,tCZbVz@?1h/D1RFk9JkIpժU +ь]A /,ŠR=z܆p8K$<{"ZYnx5=rnQGqz_-Ny8m xu~ 6EeV}zF-b((kfqTq,_>iM/58_bX|q /)OQQ6BVΦ]BhM=f38Od4uUDC~5ゟ/.j[a{ ꊉD%mkgՒ]|OT[[Kf0.-W @14  nѳh +ɳ=6C!܍tvjT31Ӗ]2Z{ETY?~(qͳeiH6~}rdv76HH.#Dd^^<+#95m!j3w9.JZ%#|1:GUy҈|%$%ɵ'xg?&^ֹzc|:㴭=Jm9jv#Xt :TQ 9^Yˮ9~/@ <ܛYDdž8UߞYЉSɨ=Uo"B+{Ϋ?Y0m,xuy/5}cU}z6uBX1],ol !LY(K;"/( ɥr 4'pT"#_9K;̘@8@WX&' E MRɧ0umF0ktЉvd:~iZh :]q*:D+\E׵_Y]A /,{V:x\737s]77 :JKGQ udbd;Z]e]Rr#ʟ0*f(%kT94FPK0l"Z_,#pEO%NTٳqPv :Juut|}{9\_JRQJt<%ǔ{>ymbʚO$ܟU.lo3_h 5߉=U9Jy [kÚũHg/,{mkJC8{!{^޷TyajoGU) I2\CbHXh,\RQDlOW\LBE!Q\ N QÎId)H=QEtmbHeDI"2J2O%)X6}[{7<ߐ'O6wX0},9T^d!ւq(.{D{$__g}>9ճU~k?ut=s..: 0u)4v8l$@xd1 YH.J\]G6fCG GuGzNP'`BKեHQ*}JtEOeDZi˰4I.CuFe(rW F$ BGyA\jH\U*æۗK`A3iBz)9JV纝˛{ͬ;6ߛ^5YxZqT*dZ| $3Gf_CYl}ag %V^-W.|&^&NWΓohh#,KoԶ'y{-\I~r_9E5簯O6m@ U_.C2~pe Q-Wcٞ/9DӋSLyy7hť wU#1ӪTOe96ToeZıϩ* ^*%gAS~i+Qۣ+I(d"]B]/s<{]ТT{[˪rz 7eM>Dl$|@@=^}t+x{sp/h *>}4b{<PJP3*,.Y}/ NjRERFg ť䂙9Iu>S>R^^BXv>$j4tRL}T=s#G~U͠(4tq4 $)V]l).U7^UVsYT~3/,gsɯ 8^#עE rNoQxfx/`dcՉuM ѬEil#K% |OėL.,Sgd4W%^WS3d‹ȁY:T4i$$lBTE.7\H5H)q@M]/7Rý}F|`tR=[Rٱ, 1n"j?:|MƋ~_w>tqؖg>cىy襺zzGu0%,Sa#@nnM6ƆpR7yZH/^VXvj# nx+,,6q-D) /ҋ24{E厾7LNWEW*s%ͥ]+=5y3E.He/d]zXǓP>=媫_oFu\,,ѕ+RUDZN"|}ˇ;=a%:Gp& nh%D)}r i5 XnzUKDl-A/KjvL3ĵ\̰ FtoMg)ڧ33`w]jݞ婖);g>Ǵ9)$՞^>OFb $ Z8ʕ+L;ϵvDZ2H8[c7O"‹ %Xjqˍ={Pkk\iTַ߱Ql>ZOPݯ!Qk*R0/šO>ݣ-œ~߃D,@%^vuZS8P 0*{j9G) RYBh0z$RѥS+l4WQ_;=i/4Otυ# G:ƐAth"i~WQ)%]ITM N;blH0U}/UZ]tJ8S]FX9F'tS&+$K* ?/Pe<8,Q%G r ]%zJ0,L)̢+{ɒK_ՙKElo#)tIiJTsK~/b!2Y:ÙfQ`` @x  b ds> ֣C-h0Q]_WPAX=>DWT\ 18xmg8G0j,:pu離>w>4+p>&$e~/>ned/_ N-”;հ4HA.|\KE}TZb/W\DC}ծ7ߐ98mlP' 'r~ 8^9̌eT"dQ=`!KVU~o䛪P&ɿ)tnpڢE.SI=J&$bҚW|C$SK2N؋\9EVϫ \P0c)HKB%KO TK.CQk`%?Tˋ>.FB+\YA4ՁcO^BmE+:Juw^ .J,MTM3`dUwҁE,\jw6U^?UDeVZ^5oDY]kæ#;BMx?/++3yt Qۅq\y24^ \6?= n7.{iǐSp I Q dkϓ2kcQ\G~l]zW~95U/϶lcwE.~(/F;V3$NT`SGg,)Y/8}~I/J?ÃՅfCR% ڿ|5̸ܽsdX7%Xgj{Y\<$Go644x>~4-g/2O~u-~ 0~`(/*4\B52Rʦ! h,_)\F#ڰoԱ˖J+.=*>vdط{P^¥*DysTYpUCa aj?rI_L4Xtݱ֌xԅ]Ok4G{jο3R%IeZ)Qj򋣾X~;A%:g.EEןL @x OQ^>c ʋLaWߋJm5(a 7@V?8b*("ɥ巬w T5 udF6ߓ# 0AgVS\XKuw<HtqC>Gc?ɬ}NڤLk^A&tTyNq_kh(1y4XiRGgs,Ё蠊|4p"60B^@#ԆQEyaU]uKD%Ќ X)xҔ0g:2FqeEyy /U#?oG>>Qz~C[v5 R??˭|s=DWG{^֮lNdY:)#!5R 6K-?BͿaAab 3 Y.shƲYH`/!^AHSr=}δ^HmUWSll2Oa(2\ ե3IH{$ d~5{nmii1SbqRXx W\QI.Gy4΁({qT:4DZ9?- /n k%k@g.JM*JI%R2$au K11mڄj[{4oĝ X~qRlD>~4-g@x`RFU'Iu#]Z^AD}zUèz/#GMwgW&U7R"ȃQVesh5 /!^AHrzC;Hmn<[rp\NJ) %{b֭XH%l͍s@Oe cH/ea%C;C"mu"]u"|J ύ*Q]W,r i~ 'Q흁DGt!Zn$*rڧR+idR 0nݯic_KmOp`!G.{)㰡/!^AHv?cREړMaWGe35nI*XtiDn%7666LkL8jn*ՒКfS|щbqK%J;s}MqyBv#\>;꯭F*pDžZ^H/:])Nq~ɥ+zyLղ:b}/XQ_ weN`f.EEן<@x/s^HS>zHmjQj{"w i ȀvCx #]vӷ Ԇ(1JK&hV_iC=)5) SDuq}^4EWXBm ~D|U|b!׽ߌnLpڠ (I(Hã_ TrJs=p8I]Y|)xD%,ʋVVܯcqGpNþ7K3RbE0^ȳ0\!gղ&C1AtP%+(^be K/ ƞk͍L&~ R)0b97nF!+-Z$l,++=ZY,J\I*ѳ#'hz .%_(&$F\C'u0,31!5d!o.#\..\ժ8+,pP6IR"¦8W0?%Z#HeQ_,@Q__,[ /!^AHS>~C;xY{$a,Kbم,~ *** UJʢNaJg(KEo^D|5*(= LU7<[a|6::Y"+5R/L1EuYtk8OrW׃K] p8zɖ&^,ZKnXc`,@tKWP 0WzZjC+l2^0dVXa jDmQ^"~:U|t G+$zKP ǸFW_ $Xlq/i]h>^XE3U|ljjL\aWbyۅ9\z/8mzSTJ'\z]k޽{)N:Łg(W]=o^!H^Iqq]L^{ٗL`5bԵه_GDw? @x #}1,Sr<78wvv.0JfҤIZDv!{OGR}wfEs!%P :H( Q6Jɥ\";j=Y$/ dAKY݊&w+"+uSRdERkS&!Xro. _OzTv) )%KG0au4wɤZ]!Z5`gxG̿pJ\sGs @x= ,!7qlZ.}Ū D㏡=k//4u0]-Ϳuj't7OTZ'GS.e'Ica$  9 G+rCU}"%i4Jbe5  h~ieRJ0Zu4De2?o%"Le6GӲ{_  Om ްƩC}ӬEMT|Y6#:֟Nӳ(L4GMG2~_iqOB0䴅ꀞÇN*YL__N)\FwQ% ^ _3X dmYӨ?>~kn^ToR΂.{^:)+V΢o-gi }tI_H!SI/.LKNz%/><9Հ,l6KWP RF+J%7\lLxO%E97 E3 C0LxN6Qw|=vzvj_CROT+h xߠlىڰ08H_2] 7r c *>k"*Pe6 9= n|ENpIt'̚]J .4'Ekkk+w Oޫ'Iq-Eg-Gy%ZKcw{58 !Ǚ*}w҄‰P@ /!^AeK/7ÝP'Xe--\1FYD$Q˹.^1(1kjj^>?Qg6;O=;^WH5;uh=!S25ܷYk]Jz̧G>kʯh$W*iQ^?F:{s Re6!ª Gu|)X'!$Gu7>hҫ7/b48Lϲ^㓔^LkDu/# ~ ^9^1 h%+(^N8!7 niox R)Q!Z%.'x 08#|,b/M_Oǚ`J&aۣQ]Ի?E#V hTҫ3Ktd.e#T?H@z̄ի inYpqTWXfBU(eWmmx @G)V'(dbzI$YSK(2Sz1,ܱj*4ʐ8 @x o]Gt ^Nֻۺ:]DyTviȬL]ȫt/ulaFK0LT.G$epY,brͯ^D=˔]~Q]PÑ pD(\"RDNVFq즕Qރ}SDZ ej5Q]WPهrG,U^ j>TTMM>kv@2I&F OzKPe2丹H?-:yHe%>T+0tM=9r#Ơ]/5?(]FKWĘvafH!ZyS{#sLȮي={RڝcrK(pk~C5}qJ.:WQYӔ'n96`R\4Wv %ۗkke܅+Ns떁kwo!ysN?&c>+4IO=WKS^ k:`zZNM~qD,ޖ*5!H#^@JUS+]I^*o#*Twҿ 2ܲ˯QD~[PHIb5a#zE?F w^$;XDgÏ4#R#dՂKp2'PW{~ߕ3WL-Gus@ C/OSm'=V'$HG#;lӽ;|AHuO$$; )wꉰ'JFz1ˉ~HT{u9=>ftwZE``CFF8az-6XzZV]n[dIWQ?;3| (}wSԳw^ rSҘ1ch͚5q^E-?~R498"h3[iߗMWF:|OC&J/w }`ٙE`yfM!\dH|>{W~xK:wߪiHc<4{ ɲ}>3n;ϢXg Șck?z\_g O? Ѥ3NyﺃtG!t޶{څ^^P @c7;y w#?sUn\R㋥WD.wM쒤%1^Ws۫T.o,-d AOh#` 4jq)k{ᚇ+V0=GvUWWJH/]JU׾/=֋?dH3?am߿Eu\V^]aHT˧C5ϛke'qm҇SHe] IPK/vIOߺ1麺qCh[[)]?/OdFԖPIEU~9Fm۔۟ 8*)E1)˜K!2qe쪻aS~rPZZZ̆*:Y6PBG'Z0Stv:KH&8~<΅ ` Ng){~`Fo E_)SL+e}h~8gop$2O.|Txl( _0 ^z^Ƒ}8v_:eϏSn%o3AvJMsK"JH{۔ fĽT\w[وz)3mo_jX=WYlsreZHW-6 9K5UE^9 <9REKxDې>O)`,wH/WÃ,*S__^_3`{bX@d@xO_^Fo6 >)T芯TSq,U}($1\]OmnK/N z  nhGyӳMjSNiJ;?rI~YTu(^8ݔ\/G4Wcƌ1?رcͺ"CfQQɢc(CTK첯S nerۅۑ{w3; ߲\YW#ZO\;U7{Ќ ƍi|6l@2]O,뮣o֬Yc^'B3۰%OMUOK0Zh\iYnPrb5uT@FEFѕ5p}#6ۆmߤ-/YdDϱ?f.@2;H'yImwH^z^N^?Dp,ܔ/GbW[+Es%e.Y.*JKK]{۵TrѩGX٣dpĵԜ`DzjwX29#g9=Xr}l3RN<(oi:l6܇I&}&K{$M!E]Vi䍌}^+k9:^~Æ'k^smDFyLUsbhp2/!Hi/p~ zk=܋Ӡd 0[]]|-{h4.Y:”.ﴐ] XvròY*14SNJ~yl ukk05eh0-W~qUUUfZ02 D+`.I#EudOɤ$t|&[z%i !QO|r95Sń‰;Jq)KWP ot :%h[WWgQ0u~;O!˝RGZ lZr!@tjȰJJJpi01r:xbwXXxqCҥKS?JuL}44{9ᢒۄu@ʕ+~*Y,FIi#E2 UD+>|)EF"_~~!ՕU`di e;v6\ǧ$JKʐErQ'd˅ҥ-L-jjjrι7-O /!^AH0)8S?\`' e%Ud[L6V%PXX(L%^MgM (Dq R8kC6?WQQ=i2Ŗ%[p{Yae>[;q rUZÊPw._Ė{?%K#D#H0mK>dbWDmOȧ-Zǩ eؼgl-f!N @x @tf3ps,A5 4&҇s[PxK*e$d7rtwwCvzSW\u5yQV+6+l =0QkwƖh0G2}G癩DpNzd8:QDNdzQΣ~ٕG.ٴcQ+9 @;ʈi)ٶyL bK:}q兖]U9/^8nJ`]Yr5}j=jT |c}d@MߨWA-C :$^:\( }5>&O1 Z]yM yXZ )l/"i}0E f:~*,?  k~`UML{r/}Yئwh;.O>O Id`Z]kw46O/%JFn&KuozȯtˀZB%t^~R9OtF6w8uX8R+( { H5T M%.e"8ZЯV6W3# H,?3Rf:đ^޷,8D d!]~˴MkiwQ4dYjSC"e'^$L™T;DSZ΋5\Sc_ xKBaCll}Sxd N+-ɽo|H.h 2ְH/Q$ä,ҋ))JD{qԗʖnY9}O1X2/R_lMubV8w~n;6 !YV85wFiAz\*x; A`AC=ރxcCf+tDZl8vSNXn:"f^ Q g})^A6Nk&W$t E>麂lXSͫ+IzqWk]}^mmmTZZK3޸)v{ql'wMF#oG}|wÑRٞOU=|`63p>ʺDv|b/~G]O =c,R[ZdpdYokĞ{:־L[i͔v8:ˊ*x(Z|!_7*8.rOO"-/C,6? Ys5c}y}Îz&b*oK}_̴~_ nXXTrsngf 6&o__+y H5Vjço]=>A0{[M3@oFz]5!ΰKvUTvqOp.5|>ʝZLOQU Rp);NwFx,}f4;NuyH83:X*G0Eu7t3ō1tYBngx<$Lgug wY]/;34Az>K .2Kr{u2EzqNw$~n981E@xa6Jk:e"]~$OCT7T" @Iv8p+@[a (^rQbٺ@NWs!WeVz q& r+3QtIH/~w{mZuvd H+pYq))Nz^[wGڞʮ` E{iI8a GAw!ͥDť;6b+cp}x3})r+mǎ>D'\%*ϺG`^S \ԇD]X:[zYf~^6G@xý%E˪ &3$װ.GhD?;'D.t"S̥#S)4NڥV&ʩ LߥwAj'= 2Ub6KcHPb>!yH/lDa S}.#`C4iU\Ne.g i5 q2 ÂLzhU*){Yv1+?z~ZaM%R QD`ZA\郊r+2R%ax3F #4va+dջJFz(ZLs8 4}s^$ ^ !^mmmTWWߑQ}}p\oޠ{vlh.Qx|RIrpj*ϰoR pȭdN6L;6+d)8'KZ B ȲL^+H>DAx9uK,Ry֑jpY' K K/C%GQl=:7[?*=#透QM2K[zDBF| %Ebr*JPdq ?X'x~+,-8.U~!ȮDŽ#jZ[[5rﱳ 5߿nh<=*Y)+Y lW ak_s ޖj#q[Oc[íip>x~;a-7/1c>lK.2e`l ,gsmc:õ<: wv~#4Ajæwl#*>mPTrfO5`1]K<K~~xp *ZpB!+ > @{s aJlS(JvЪO͠icR.U {QJpR-@=[ߤY,I" PGru. K TFE+Li^>H{K:dŃac ۞Oc/(WwGj^,dD*^ ?LGvR]r%uuuD=JͿ~o<2Ţ?סA-ɰ\pGH'Rr!%d>FBga("&qq8Ď-%_$CBz>W`%ζ i;GOKޟ@UZ^kDvq.1 G yC,K0iM2 vũ4EU]TyĢE n{U3\"aT+ @ y1wc}Myy9JSl6wiFr bRERzm:{w|Z~:ubLTR^n]ҋr=\QG (EsjvaLyͽraVT* fc*1q@m12>fDQ-#0Nw}=IHR}egJrZ~G}lF3qaKde>u"/"ɺ 0C1J=ӱتn7~Ztj'  Q}D%tOjs,Qw c#.b.rDxeZ^:s뢢"3B*RN1ue썼w3Վ]5FUy῟?a$b9IKFmDx9A."/:{rַr"y*!70]'ҋ$XIFzi .5I?>p>837t@b)dEߖ$)6$^w'"/?^XN gM/r˪9Q]:}BDSv.^ ]ϋX԰0FaQXPIL^>=zb/zŒ @6=7{rs'6Qs}0)YTY6so3}gAtdud;6uSH-\6Hzꋑs9 9ֳ Wj{oJun_^7h}*ݻwPX{H~qC`˝ˢ|0s,F0  H}3{tvuu9zfV77QbZ !:zZ6y (%@j*Oz<*^H*Z1 qj{K8*[;\ C%S`8*ґZ/j+LtXzl?@uwo;"پVd;&Nh ú/{[~߰ac_ F}?) A@x9kNn^;;;VОMX@F&x|ĕĹfdVv[xq9)5K\mOnc+ŅMڗ<)ųϘ@8Dܩ R- hZ?g;GtBmCoKKfq L[aRr3VjWKGK=]< @VpMk6gn|%ի}?Sv-/_v5n2lxvnJR8isV& |ǽ @.")p RO٥Q}.ETPOzm7|N4ٜn;k[1,a;U)O`.0͹ug.e dYrqN2EWx.#P.Qʐ%d8[x5T 33Sri+Ղ)"‚|hX칭Իg85dJ̰!w)YZ[^|GշHv{Ogh溶Q˯矂 $d SFoaq^IB=LCUA iM+.2.rGwq#pE50^ZlϺQ/?[f hii/rߛ؎'#;7{pTCp_wבJUUUmn(;dmkߊ  d YH ' DZb˙5Xr;?L!3Cͦ_Kݿ_B_:=Dxb[^|M @.Q^^ֱ%Wxɥ;KP I} ωLr YZb^!o$iI>&ҫgמ\ɕ)XCI/knYlXFDZ\a#d0ғ_]e>,&CYdZ*9/ߌj1$1Z]ӑ} t^+F>;9 =&Ss=|6]^ʖJo(<Գ 0nYr>yTxmбf{T3m|(mpk~q:7iw]555J~uz'll4oal'uD:8‹#d1ע}0NSȑ\0̃5jG{_~&U]#].Q$ [w'8JiW* JYĕ+c?\-Dw\CvSrL۱F ] #GtֻH1G#dr <0(mnUv^ +lYKGjy cɵh"G3 0 ӎ<(=OM_?JO4嗣QpIb:y9 \#:Ebw\ɕLZn%)zEPN1I:CDs\CV8]ʐ>I"\>9/N ףڞaq& 'NҋkVqC%ܩςP|8*D3e! /a-Cа]i:] cH/NoD0 ÷-Їx/t8u>pٳq|6l0;̈"EХKl._^|~Lh Lq۰TítZc _9^r+>3ڛ/'ܺM;!c;R5#U50f9ׅ^~`#@xvϽi1=vCp< ghYI>@G9 ePT K#$ r,{Y_ . ᴆn4Tk8UeCݮ01~q t8f?,xLgg)'a(pbZbE4%:_ !Vi }|a0tLG7-ͧGvQK۶״)S|={ȯ`Xw#oW*"yd5s"]&KT;tSs'%dTF JJ#"s㜮gD FEQQK+U.i8 p#c4Duv`8圕ʘEҁXmm`dQ-;]z:OCwB:a(eL;ϥ[F7Ijo_V=v2F),Ō2^1ݳsqr/,x ˬ&Q텴S@DغE4=*5kBJC0n8J'H3#QfEEm'ٕ]tI&#aue7سugR3\mǍ~%]Y"$EWէR%޼*ʦ',x`Mb4]Ek3\WVﻣԌlp NF ǁY 1y̔? DߛM{PS,3}VY&T^D a^w|Gn:#:,v9roa$WR)R~؟ _ D봢! JgX:K'=a~NoM/?Y4MtxvqdnghN{=,VTw!a5@y9_5dBD\aZArSFci2tzk.C!:9kL $xwKD\A1\dN.D׆] ,2%rz8b}}=UUUeԶ3tYX~5^_i<Gpסz_W-Լz7>/>p=JQz\ʕ+folVC~q'"@V`EsCxqTɴ瑹ݙfd#])\Hw >#.#QNރ9D) N:ziJ~Χ%8B$ıE ,d ?v,f52+͑^T0}xc)6Qٲ&d[(E>vew5 }ks+e/Zu=ŕzgϣ+'QO _05(WTBK!H3Ua 7t "HBOHA) #P.Fm+s>vypN4L8:&S?;uEw/8J.(p/:H, }Zz)%)QyJA휾lSzuj?w*LdSd漣\98GsFzڇM+%猥L{pWO1< w:BQa"CDD sBhɚ!71s$̰nvuIV_gظ!ofٿ2H;^TL4yjg9uNթ3SNݺO_G4A]^qLW : MH]\3;BaO2y%i]!,!d,OKDR5wmd}*WK¢H& Դv.ӐY>vF H ,l=}XbOGML,}E|oT!v Rg&w&k ΰ8UPwry>Tߧo@O8@G7%ZdW>]zzWgi^rK۽*Djt2j^/oq؀.YF  @lkm/) |E3KD/b5OԬc=#d)n6~s4dO/`INłpP*pq={;$+͛.krWGa\A '~xjlWjPjpӦMw=.]a@HC9Ⰵu 5]<ss$Ww #zҷD\+(ıwfy0pRhL̪E[?!x$j ަ8Cn߾]8}_-Ni/4aАu'lWApEd 86dPdW{{;eDHS]kҴNǗ pxH?ѡ'PO=Z>6Y"v8 OTm{^ïǵkD5yI`Udչ$7V^[Nj D[Qn2Q8{Rj﫢eRv4Z9U.yJnx=,zl)5dsuTXRŮSW78U,D 7Wvqv]993 4\/qi T0wi8Q5>rms=|@m|="i}%7M *umIy:mtJ,W?Xj|6~x&mhyz8,=bIܙ6Bƫoa Y:eo9_t5]|X"MGLR&tt9g~ۢ gO%L__(p[Z Ur\Q M2ipql\4 .WMMMg֭%Rs)Ұ}5ИpcI"0We* [81.Wm'PQO^M0c?qC ] >b*@`8l;.taa+bQ4OL/jQyMze_y{\},]rsqB\KǨou,yTSpq{X|L-LU%E@N$7^jyŇë-[jvY}`QHX_8btzB 哃K8 ۨ % VB~2n/7׷?tvvF@5s,]H HakǕޛR3j]'P#bi8vqr)2aD"m'iH:>+(߳빢cjժ7#Bc:mbA$ӾNB>}J/?{O2b r x]u빱 A(0tr9pAv9H+!itd0X_ŀ]Tϵ>3[ E1aMm4[ )X+#*8Ml_T8KH4uq-D,([LrE5Ӥ R쾏'vw4~x|"#/ ]Mv;\E/+*)Bj G}`}vR\N)3O-x JC/ =T!B,Q¢ ;de/:{Q7%C"qQ:$t|˜Fn[~1ޚr_j3.@\.G_G1pU(Bz3dBs ]=Z*a yऒA(xB\ oEqVX$ѲuV2KŮܩIayP4.ҭCGr4k.}i} {A$ ^5A}7= ],zQ"Q,tqu ĨC:ڃyȠy$ KLP2h6+ȶj}~{l۶ ;[yD鲥}˨RE/E~EDIJ׳ϫLciRӚ V*J/^5Ckim/^?o5nCj5L,IHD2 $L^@*<T8,#@!^g`rxCkSERfHk4o,E-&i=*1.>nn~y(:e[Q'f*Av{< d x],z!7yB2+`pYXϮgrUؕg@Dg7_ЊT+Hxr݀Hon>EIźh#XBpaF"Rgv\9[*Gϟtr b @^{k{}6{8GWE7ĭ(Cz"OÒx pA<_؍Ń ,v1˫ Q\ɁJek[!sy{!0smܩ~l2w`ͷ%z=-p9})>q6`'AӚiO>FxްH*Vye@ܮg]WG^T,&} QGrt$n;a\ ~<# f& ! 9]ԫFy3|rxE ra[AC[b\,‰dwBb4Up+*>QыLr k~2a׋yHBaVg~xoyTy*5KiYe@! q2WWj&QfoݨٯέHBj8ÌB:B"nz׭[W3DXC{-= J sZ~(pvi2Cn=#zX@up>[m _(@prd Ko(èvfޮ@IIQۃ|z]"K5Iz*D%C$K5̐΃+p =P_7X*K$ERT! \]Ї8Thv D8^`.z]@ .[ ( xTpm+u]]3(L4%lp  EcHyOY: ~2e7 [lLa^I85o}2'ޗ"HzX< _pF_ElVLYiTyTy4b:C!5}S΢|mkY@sk' ]]S$iNqee31 YcG)Ǘڹua@Iw.ë\ZzHX+*<]Z[j|%ZihۯT6^"^#fi^d"K.I{snxf _zK>Q[H**|.~_D`W荽$FĨB%%6WDzCfSbw@.$bwp7f+zYhDY@0CW_<@kij_RsP1D"7Ge^B \.ش޽h9ѝ4φ^6|?4~R+I?V7o/z4 @08?WM/a\]i& +FD|!@(CkajXvŢג/iwS>N]|zٿ? ;}ay>_KYͱ[+d'j -V9,2|ySjD2aB匢X9"۷ol6{:<ȃT ;#!92+QaFeeghyKWY$&Cij|4---|H5D<FN\?:p r樸>uQПULT-'W2\g}+a=辊~Ν6wHN)C~/s{oQ-(âW{Z¶=ɴN)p/;da G5f}jX M\:˒lY߯ey?;W}5|OF=RsNpJ͙~:$=st8B. QpPSKLd;t655aG$XLH.Bߪ8Ft!gm5|^,)Í7R}}=.J m»H[%lPա!p !XTmůC}թCvv ZG[h]56l~oݟwoH .sþ.st\a5v?6N]'Ġ'+9kyr_>::zujE3/2NwMQGϨwϜ{rYEipë~4xc60ʍ*bv +!˱+ 6A[ߧQ~ej?am\O]w=@^-CA8CQy+ne/:H3O2qu \–9^x*uSvO澺vnt?9g*:}O:B'[%܆KRP|ˏ Ue_\ x$ ~bÄ,_1KZСݯA}}-3i7־ׇ3ù I͙I,ANz?G`'I~ DXZx@1a0Ro@]ѱh/e_j&_H#^-N-qhC6|{%2EB8"sw5_$^aT*?QHOӰ:"-hcBk?ul3UjY=eMڰdJڙn$]Ϻ- .[ x$LD߶ +Q|աix+liTtF+N<ί^dre/Cm׽_/wߓ$HݥW___<^5%Wr4]2+_SZ{6;Vq[En_=ZrNr"swm*9^ :LjO+ji_W<,Jm}1,xeѪeS( mXkΡ}t#0xw^g^ F]8W7? Y^wCo}doOW ď.u0}WzьT eC1(n"}kGI"A mh%oBIVZ~}0/H]\5 *L\ 6D/#T9k*敆= ?ŢWМ^Ϗg@[i;4Dk^eu5ԡ =>w5~jP7҄'^eC>p.\]QE1 9`Ɔ{ھrT]갅Kͭ+mG'`GcE-׽ 9GXƶUN+iJ>@_%XąáC4\Uow'ɩ12[Rʋ^ AL)pڭ ϋsyr?|Ϋ߻/I~ 6_}R-S΢O(ɳ3Ϝw4~x\1|p{6Ů-\ұzvnD./SX$ *5̊E|E>Kzs"Y>P]W뎓xs ֮.|-xTJ AD8ɵQZM'PWg zr O/2.]M׿?9"opƆ $"wWSj*hD!rVRofלCgL|JsSr!/U)Y>ߗ.t~)i ŮMO:0;i+r\.̺,M_gw6}Iu?qKtieWM7h  / ıN맜P֭[]! ]AJU/l}~˧ l""0T ;AcKݕ4jrao~lcҝgե|B~nn u~>:*T `,N#Kh5o"u ij#a?ms۵H(>@8< EOyЀk3|#N+aAU%jwt O , xiԚd|/ ":69]rh:Jnذvޭ-j^dY|v~ھG.Wp MLhY2΄Gqzܯh9IU-Y;eLS)UGO}LPkJˌ4f.n׳tpϋ"K g/gҩyD?ѡǸq@v@\@(#,b~wik\V|SrWX1,|&=[D׈V?%|/ D; .nv2ʬ83`a.jorUW_B゚z~h.;YE졮;kJ{P@__DE/#Klɴ TRg$^.#)-VmSO]MK[ѫ?sD~1ܷ{6G?Pw*wl pؑv=V^UxD$#ySL^?k:8P?ˑHyrDooB x$!uw}}aM>Hh~UퟧCMr,555b.7L&#Nd!dh'I-;J n-j b*wSL%^)Q))-aJ4:wm}4x yסi!/>$*SR8PFFɇ;|]_S+DM;yULJ. _{^=ERN2:R|IPrz[J$ʜ'& I1im>{.PAE>עEz];5  aT6y,,s/nAuxxCɜADI@" 9rب#:}*N`WTt~E/0*GU-,Fe gJ-_D6ٯ!门 iy |Ѵq6D?UVf(7esb!;=/3?vGo}Za š1š J'A²e\:}D/>Jl WUC_$Syi۫~!6u1/ν,~]a:C?zø xssE.vr2p ʼ=^ L۶m>K 8ѡ"R|[vwt`vxKv^B";b٬/mԶ%zFMe+_B,^3Qq}8+*8|[ECr; u97Pgc'䲑/B-YBG>#\.SBgꢭ4xE7\:ujp5/q3?z͠`:"-/V`'~_ۍs+V#,s w,t՗TN}DUhCUu-cQA}e<-9wTZvKP<#=؁u X C~+bm5_zִk̈́ $=p"Wq]cbIgۡr ֕}ςv҂ \+v5]RNL6p%ʹ$䕠]y\6#EZ_=W쪯@Rr.oRf2ȣG>/ԁC3;8RSD(SXb;nyqC}q /PSӨW b%}Tjb}ץ>j}<7a1*[^؜>dQ/]_E"F("lc pBMImr3۾ q(M5}s>^Èrw(*K)0" KB>`}4sՋߦs)_ք';_:pwEP F! ~uߝ{HIJϤ;纮4ɟ  T 04䡢m9d<ȶn:4^z%a`,YR4-buCFy񯤂ȕe5^wPC%E} ?`wwݕ`u}ȹSa(.k3,NBA90_wKx=4xX. k-!3?8"7}Ti(! @B׎+x]jz| zO_EM )5gRA)3'po+'d]9Lʩa)|V98tb P ^BCIVN#vkizu~KT\i@n/Uuun/?9C-+VHn.[z vŇm/6\2/kXam-uwq.({7qmYsziԡ˱/\]&}9]¾gj[;ok^+HsW7(j}7= @h xoF.9sEԼ~pou Ee{Nz-(Dj^ x ᶲ,vD@?; Pp5˄>&rAJ&v 5ܽ7= ?mϿˢRgͥm;Ⱦ#5CJ}:yO( ]w\LM֠N^-EBէ)'F–fm. TtT.93>*]Χ̹Ӥrk ^3 @ ?kfΝN;WSՋüHN )8:Oe1)ˡ ?^<7F >,zuvv"oWhPswt-ty>:6,@S鎪J667SG~&T0b}DWjA@?!J XGmi򠓖#lA);WzbܗQŢײ/.K9 @EO<:o^NRsDAI s+)5T'E_&ϱtٹ7 g aCYg,TUC[z]-]av{uttQ ja yjn?ç`\_\NyANhCı3#oȹ?6.G'l}q **o߉ -J;Yy#WU =lYsw~nCO#(6WE Cکp#a[9@5e~N^],+@ x`ߝ{|]G|bLtt|.O9h@@8dphCU?#ϜIkT@j~ౖ$#;ٕY:H UWԂ ĭ{'}vv&eל+]s{-YĽ~hËE"~~P]j/Ύa?Z%//y_}0/[_t~Pで j>yvۊ)Ӂ(vyXZFat;esn7NH|͡Vtnx\u(.t)<~aot"Kt0I};F;TAty$rr( I."* h%\,>W%[[[iƍU-sؗT7[k׮~8 s5v N޹WT.QΧ^a:K9O>y94QQ{*N;92r*iQurE|}Ik8ִNzbO ioQiO*IC*@2`W׾;cW'Ȝ3@ʋL"QPd2DuQ@qKLzH Sgi9m4x1ݻw P]Rm;tgy;H/.vxnWCR.\ItC),vm;i?-ˎ"Zin(l~ ŹUs·QG/=E\rX&(F5^eZز0#^`>./Q]U'=m|_ژ_X^@kq]]ˏ/?:oDrtvX2aL$#R?LV(C2Zw6x%1lmmeTܺuk$Wy~ Un=gR睟7jTUUYY~` nrOiЫj̻ Er~/>h&Rv2ZYq;NAE U޶&%WT N09DE,S( <Zz"Vf.^^B x 8znzՕ>DjۅCG#E]> yE-_w WwW OcWc}dC=,zc>G2Rc,[.V>Zm&ԡ7LR%4'6}㷴],z/!L`.dGXjtʮNc()KЖKPлI޲Xa]AĬ6]E?Oikks_$7ovsvu$$ZB01 2C7EZ5ʮYp[ zQr>HsvEh0t]^"wJ"qLᵮy< n7!@^^@0xiT?yK$"9"RD#\^%i8deby]?{6\#lf``֭[' a7:BDbDnwՒXį\D_pE08p`gԚ0ҋ.mKD0Y;\9y%8asw)+]7\:~; } x e /R#/m\jz[qD"QPwW\^Q2$*gN/ŮuGEL&*w7Ӗ-[! /92FD,$J- +:r!YWNy%lEsuqy*r[#̯nO@߲q?u'K#b['&{5떵Qi]ZFQV(k79Fi^(PzzzhnCkbC]E*9N.jgrEt¬ V9Cۢ[N}8q4=:UG̉`}2Gh dys\v#=[GS x%R~Wyvqeթoe'; 8 4AdYA Y0 u3>ko:::\E ],@HMg.:Ȁ{5 ]EGcסf]:Ċ^שI`Xwl,hǙo; jه5:QhM=e${ ^@Rq~umh{gPQj n\]qY!@>YFXjr5ŎS.\t1c^bKEuE^ CrRj pUe "ۮ¤Eu$AΊ@R4ꛐa=~ + )X_ (u97Pgc' s2,p}y3?WrFtǰ=$h+I>YVgqՠI$ˈ]z~6\}zJӔdhŔJ@m抈4_}+tah|p9D.Pa%KжYnSgR.:ԩ[OlI9 x'?/e}6]|N߽듭c)WXGu>*5=4Wޔut IS_zl}7R xAzreo]H']>bU%|IJȯ,)1tx? 2?J2DxD-ZQ/?-A^r`,10 R*ٯ+Ϥo4Q씢eT02:)ˇrwB9baU*0~ղ@nݺXҥ h2+)Y؄.\@DC/_It-zty,JQ>'re^9zBTy6Ű:Dn,e]^DR*26uy)w^^@@-+vuߺp ~'`(Jswd*]'G]]?sůMv7;Xb 9t3n.*TUW1l_b^L3*,adb_hChZ]^9ş{?B^y,zN#n@K/S xzjoM K\[ kݥrhrw%!,mgq]kۏއ/ 6o޼QgXyoZ+եObW ] rU6TPF _W ms/K*5Ӌ>&n,ōi x e /{n{zBYiI%tmvw*HCwQTSϯ~=E;wZFB2,d6UEmJ-YE/^zuW&)zB.-gKKQBGi˹9> x e / O8@7=,3,vͣR.G&edC)mC#OQϯt_q:_uuuEBX0,hsn fל ]a MDbisMN\ K\r1&a9- P%2]^ݜ^ ̏E׼?c&%D)xP]2%wҜ*SsI6aFO,(PYsW<8 /EX& [>\+R+`)vF>V^a[5J K4_UfymT,rsS>pٺZRFN1XoC%&Ͼdzlt6M/?nXX>}Dj\mhUF1~x:uu~@AĮ#bW|q,gOYU%['aU "Te]d N-R0o/kkS%*55)tAf?ھڕn _A#Te\>T8Ml|1tq-&+P:>D3kZw.״f۞ ½Ģהu T@1Ůr V ]P|β_}XE2+Qfřv2J=_8[IaXBD\BTѫ>R2 m_Du^d}e mh E0u+T\^`1s\^w,Kykw F`ofQFӥ#bͩλj! ]N. ac?٦hBnWҥuX<|v޳~fX+|\NQzqn%AU9m(vXnUiMD/ZaTRM3EvD00n.wf"sy΃.Y}5wDx?wӃYP=ԑ{[YxzY]a RuY+вDg_;Gmͬ8CX_ }h? :bt4' w8_޼j8}[bcH5] rU.I"؞8y І69+uoy 8P5n//O8@ΜNn^U\߸K5ʟ˲ˉpBg Y H$LbrU;6"DswrI $r__^zժeXyIr0l..).#L0Fc]kɇyW9Du ]PݰȮe4a]Am dabcl'TfSUbSՋsfNv,]N8E>~Lc}݈a(ݾ9ڲzigq$:OAޛT>M xT1^%v@-5oB5oe m=ݥd:d,k28Ꮱ,vYp.vCUG zY,T˨ 9T&6Q?!ɬ/-\tMkNr_"O^Uʾ;1eynA ]CjO4(K}~:'PZe*Ma]:.\ A^v~7۬#z `N. Efmsb*'?>{}{v=(nݱW:XjpBߜӼyݓJ*܄rs%S:u86s0p_=lUEbUI;[PE ߽Z.vv0]7=\O҆\6'MA#P:TLy92m\.k@FD/ND^,?:̯oytG'v 1a =)oZ3)]}'PM]ˋ]΀7p$w!0a0&cۥB]NbPŮ8*q^YΑ%<A-چ+̲ȑj!)f2د[JCrb6@8~=31&vox8I\OA 5"In==օ(v49X_Q]歆0K(3IZHDqvY l{o#F Rn' Ls/ Vq9yAq>uE/m` xTO8@Od_?SSsw $.2tnC*ғ D]aOJsuA NVU,z9!r64.adN d#9G\1=8!Bd@pեzS(D=OSr$$e3T![P# eh vol@ş5-z6W-6JKu9+>egg#!@/ Cw fG-8EzІ.*H`dzM,v^= w $ݥQl ϺBPTqBruWR ^Q]뷒׫D/'zt<yhrЗY`+"JqktW ,nA xT(oDdWNrC:Sk[, |$`m $fpws$y,{$P2K@J*(VK"X—ߣ8QIyYm(+Ri?)y_ryYZrAé̑¾t^Xʃ}wKv_?CrP <lOg=68yoޜɔ3T?8zM\.i[ÈttLA8Acxb1 Qqjceې+Kv]E٢Y6MU$-TQ:\"du,Bsl}T,:iTs"`6YC.9rw=Ash:DP#@0T97R {i7_zX芋Gy˼}6mbJͭl/)I\\킈Y-k(CBRaTTŵ˪VZF+z U:έBk{E/qeA2usYl8q'L a%{RSQ nmy7\Cj^?(K>xMVR?z`kziko辶BjzBRode%1 d~.}U Vf*Y  ` @^zeJ m"TS #syI$瀮,m{uܥ'I{OiKʡqN]݀@j^C".9}d |?HRq{guJrwZg6Bt{u9: v8pks*eWWB^>͋#d#(O2=:2m_xx <YdWU'Z9t$X0koCm:ehO=^*oW+<|#4LaWbl9M(0x+hb;? dQ fa2iN(Cc%R9VaoUN$^sBJ+E2^#PhCpQgcW9d<:m_Sǿ>.l-ekyLJ/Jz-m7}/ kHޏ*˼meWMw?A .[:^:QN)$2csM]=/QO'O Cio~v%㵡y (qE/cWVR]l(.or24/ʼ]fZ@ȕRWnr8$zܞ@Uj+Tc#aeaU.//kTN]}S;hS(dJ9Q P%5?];z|}h˾;P@H8C]7FǏжO?y!EהT^䊊 #b3Azr2Eӫ ІfA&قUbW돭N*p ůJ zg̓U|^> mhpl\d6qEE}3Rf)pi?.RD?xAz_@ pkXO'nTܐ=ϻW\9!;*zy[Ź"_zh1ʷeRVn0*؅|]v_Beg^z,6^OQ]^ kcgS=x>ұ Pܓ)U璦{KL/Dw!BW<@Pf+'Pe'9dСg^?~::( -IyD$fQBήo_HHRwd6I@@r B 0t u:IAZQ%l`,lsD4 I*TІFB/9>./?OM_HJ{v}19\ gSqJOwo 1<`kOuJ=ZFP@H 7K:ڿ2b"aJ["u2jZ3ϢSΝ得|iv4l:꧜ >P]e BN/έ0 m ZO}e(Uk.]5Kp01Wy*&zBcm*M]^+ mj77ז+~l꧌;X5>BW+9L2YtLvdʼmн}?07 Pm@H=R!iy|Ňi?tQ[Xb'WRn]k˦:u uqL]QE$ArwC|m+tj*HU[\ID/umDCc/x/ hozA+5g"e/Mx3fO>-i0}ai .$D@`wIŜu>m| a{鴎HϾ݆'O& Hj>Rs -״!ؐVO,R@3zߙJoaͅ6swT﵏[~G5" p (v.; ˥`ONNX>m{-=:e٢"xS%3%&s׍ndD;n>( #Ve龵tB9\\-^HJ0Lx6T磼\uޚ2{NP{\NV2|i~G6_s[lnxxhxX WgY54aNf6 S.B"AA h/e^vn.¾MaU*C6VZIDCDvt=H64|X |=ު> I2`?T]/,v3PԴ'"?FS}9Xv(iai {W[? ˛OO#" 0oS4?tX67 x}6lmwB0u!F/\0@ti(P=MCȻyats# 1QC4:ua8mJeQDxYHtVN_$GE[jC5Le<4;\qnI; y,u>[{uQ0œAVq66k:[^kJ~U */OeC~ZC #!l(p heD1B?fD!]wgF  1>Ο|;w\. h"6W |xyܺS%0ﮃc >)U95079E`[]/Ec"]"m2;OkH9F}1'ҷ~@KY EX{h)/㸏uPLtgUMI+ۚ\r{ ?Q;"}:>94vt*]1쫇 3DT797]OPuV b-jL]7ȄDZvhxy>iil]m,M!t q}  "F4a -svȅo(!.kCqbW|s#}ޤ8 M}(v+?QFnf WL?y|&^9Aogrǡ;^J4ɚw;ކ?ۮPQ2G!'+2L" KHbf/ʭ_o|5WtƋML9f忸. L*]ɅŽMi j3B&]2T"xR-Eu:\wY.сԨ#e x ~߭uʆA'ΎOd7|f_M?:s޺-@DjO S:) "AAD$5LE/]}Ŧ_ta.ċfpWáTV`L+yB9Rw!PsłJe%uHvDC0"%\6ˤW8j}.nR>A sl:D?4%ez`6eP+ov>EzV?qťBlx}ݓ r%]5p$  "@KUhͅ({6E7}a`Bt3o0JmO [/uFjݛF7-,Q-Z yDrYG՟Y.‘{V40~{KwoxLE.R+50ZU|*Y_ɴ/l|$;_A^ݐ" p@ޡ}1ln"L.Lw@ PqGshѥ^wehί'Y _>u"t/UnK].ł>9~D +PTb/V l|*EhaGk8@{ު&A֕^(Pz{VhK53/?9mE"]6? ݓŝ'n4+L!EA0z C} lz]1DxqWtf.zew8Jb܊ z 7a}d1.43y&9uqrw gED*,ڋ;RЇlz8.jY=[G=>Mcz_KJ|殩4p>ɈFxF>HxAA8AX+D"$ ۾{:Y" ./n&EA79by'2p?YُySTo{B>S-L0cs8mMocxIB'ˇӌkiQzeq5+ovPnX@`uĚ(-I·"z!EA H AX9D",Q" ^7+Ir:-,/dWX."Q\x^EXKmh;Ź#֣=Ss[C1}&wt5s]{*ic :"AAA`j E/ Ȯ/Kb͍#7 " '\D%r903/3}f|XIItI0\TIš(rl-%D0x@u_;\zm7+]D}8MU2'eRaՒtnߘ9HxAA8r<. ɮ)*٥N9bǎ(ɛ] ֮/%rt;0;_%_LW8 4?RJ[\p6Wxi mN]J//|}! ^ Uo9j;ؖ zG3 ^AAi10E""-3,/-``+vE} nAٹE#ᮬ96"0xaΗD(.; ю(/%:O&۾ٱ5Y?, vÆZzlxmKFkWE38 7>km10XS5A8 /  лH*c4.DDv-Cf xSµi'1XxXG4"Ey +&SX X[Ga&`^6-~e,|g}w6? 4Q]_eGEQ /  k /fy__29txϳ?Q5i Íڲ3T]`Zoc)ʵVI//J_WV/m>3>HxAA8^a_zSt''L\ n\t0qê+1O]`##Ӏ6r<^5i1EB޷T^%?P,X}H1]5 dwo'M\B^S!%Ptmz陼6Vgx,s8lpC{ EAxA\􅢿Lt;²dW3Tb!mۢ\U[o)Lƺ]n;Im%Y%`៊$d(lܯ#6SD%Ǭwivl|EsZzK(o>]-OwHxAA8:a4#&reWEJT0U)u\pFf}R`~ #x<F&Hɟ*dyXesCCD ~T@siS0aD65}uPBΠq a#9v/U ݐ"  L'PrmzjphKB .e.ƄQ=+>(tl&H(FZjC>)˸Hxv~'+XwBvI/$ <6OJ|B롦z=&KsQznHxAAOvM?_ v VO͑Fq%s.zoV8lt1KkwZBHt? ZW5?r@hЦEƸ=**SZ}Q[F"vvEJNΛ/fמ(^]O4@NFv5t A^AAXzG1 Eײo0܄6#\ΐB2Ksf zy#>"SFqNBS'lT(ƊKQ^>"Mi I5^egz@](dڠxu-}T֜(;AAA! ʮoՆ^:3r2/tIEOEq:CG.GTvm+7bچV#DzE"aD?mgei  i 5ӯ[yWc pzғ]HKA;!EAA/d= FzZBKԍпIa u"z͸ TA5"k\]~FefG|W, RJoYHk(,̉0Lm酌_>?{;_鉖\NHxAABu+F %-dj*E"a-.{6Ve2eEsѶv-łeQ\Jkh:+ߛd5[buQz{c/JΆNVϋ A‹  ESvȆn Xp:C3nJgh'6LP+E kDnWvq$hG=4ƥө (/ Ya@i cVJVOҕ^xdFx<{p}//U9F$  .xڲ7ANVE_ \hK$0s  eSDEwjelvkD%E#ҧskSR|#qr8ʴfkފ|61(6=z $'I-Hc|}4x2a /  {91͈!OchP:xnK:C7 ,Lgh\HDwQ*C{k@HEN,Q^&SR*ɴ"lj:7>v5_ZT拓s؅,!e] I.AAʂn14u,znt1.snM+ip֗n[ooIX.Ғ.c9a.]M _%B羓]ܒd<묬#&s DA|kS"*WL%?(4i;:*($@ B+WLxSk~Z<:RS =O i'p$^PjˮE $"Dnjž+oFs#5# DfTDpitC~j4gusm1Ic O쬎'f\{|xYǷg^}~2cTkY8}hzS},m0U:#ӵpMy("EVq6,_뇁} ^_y\%B‹ O˾/SªLw^K]saAמ/P~%xYbAV࿐zɮk–7i.]Zcemy8R\kej{=6m@TA@wL iz.uAncYȬ+]rL=˂왹LX*p 0]1e05+uimtrQ:C; 7a0Sn%RGvɬGlǎ[`ٮWjq˖4Q˲k0FfOS (r~Ҋ2mэڲr7Om#%[>/r=p$L(J̈-kr6|w*s3eA8 / EeuPܡ a ,{(6$F+'29ÀV ǁEONʊD:Cl5x^e`<]ޣlgP^U=715P8QǢȮ22S9fG( ni5ڢ"]Ҿ+4ۿ<ǎrmPs*>ĝ{*HOYuPdU>sP:k"yHxjF2ۣ{@6j~A$""LWvm.h+S[/S+$t`ЇrN0o^›֢!dۃןT5f%"< 2ْ(Zdw/1Uҋ\pqZC'9 fCӌ3P;PYʝJ&HnŻB^x*FO " -JaÂELALe)%7ddeN`v銦t?!hš3UF4C.ܹeQ.8jc=(/73ᴆnUFΊ 4"DT}H^L`{/:# pLŘ> AHxa+Y$ܱ/N9诼L"z:LKfwN_ZK/%(B`vH73.M]jf}xz^h,0%_*BɕQ^mFB9^Vчۮ`PK> 'KnJ/tPY(PIӻOA숧b$8zm`"!ADŽ_huiep?(,.%ET bcٵr!!wn 缶.m4}ڇU8Kuu0R[чh,'ěN+ ϨONxveWsK'YLjK-" ^C L(Nߒ8gJK/0۫_HN/ި5Ox9iu} N#ֆ ym=>>zmڪ;ܾ,J3/"-L_YZ2.A'!?f lҼ! /b EVϥEQZF{9j~D!$XdW≭H%}h$Em'4$ӑR1A h7jC6] (H-Y{er#_#Xת$Xޖ8n^"a-Zh[Ty",´JPq OGOfHun? O<#&,Yުe5ƴțAB‹𢻙AY(Z7AwQFbk䳾:Uxd̥ CQ]#] 2-)ݔl'hlt[qC.e/a>|LEH# LOWX\$y+h^p7֖Ԇ1hZC[a:^Z} i&-Ic(RK/:^?b8\ wNYZ z i"EnŪ*π<_̴$(0*hcl_^8y4gtF7v@vG]:JQ_ˮAٕ8|m84#Z 9/p`^`z9 ]q2"q0q/=P~{xQ&YuuK/aW-/#Aaԏ ` g=aMmWW eTV7e ;㯐"G;1-[maSԮ_f(/2"Ks'TCydž(Ǫ d(@1 eרPt$ w+g@#/DZCEF5%$J30^>[ŖBK4Dv]~64E>0!-_[y=Ǣ0ZWFiܟ^Dqҷ"H ,zy@#Kb] Ero_eiJ/X60Ҕ] ,,4Q /pcjxB5XVӁ&PrE%r!#- O;$2Xٓʯ'>a" @ݠBمK ]ϗBNVҫ5XG*nB^iA/i/72/x~Wkw]Lj3R  Q_+nj=/i)1?"QNjdjyYQKd` dOxi--e(!em > >V$db ֞AEQ[BWJ/3%ԟeқ#0Oa /-a h z:KVyT+`9y4e ҫ~]3e% K3XA^"jx4I-Y&T5U',{(&0 `(.^\CBF#+H "K1P /Nq K /6N-=)Nth wȼ@lzE@i-NFIŢ.B´jA_˖̆V.bè1Q^,DډDmI-e;b"LO^!}"<02/Ox ?߾,v$:J%?(s[bKE /.$d!ED iI2Ӓ`ڄܡzZ~8웾^@<6>8]Ew" "Gr5=5o&#ZiI)yI)74>)% X``z㺺:N3:Yߝb%EPxdϤka72CKv_C?008^E=:z]QkFʊ>D6 [c.ڐv0$j4AǮWgٞNeKg%׸8 <\]Oc^ӷ%}Z>,nn"Go7v㗧BNr'L#59WLӚ FExB^p:]a`O|%R EFeK"iP|CIvzma(P|ɦ=L EwNJv./Jgd@hVB%TFQ`#~ U-Mg %Vd<~Zv={?]7A X 9QEWDytJB+d/2:^Zm`mùTVi!̓'PJi( / \ꂆuuaI.VyvV`,rD&R҇twv0 C`QfXNCgW8HK%EJ; ,@_vfBR*$pjk l;BwYZ ۀN[~Q0jwo>\CQ\A1yR_sG. #ҋjy􊕴Nux hOUK:sxjzDB‹ /YHx%WͅQ]fy2O? Ppaj”t6DD[yvT/^EwLb_A[PA[f!\Բ*$K@xIE@,[]ܾ\Fm߇ 'K`z Fkְ!-\(*7; &"i=O윑\%^#4[RKcê>Rx7uzj@sJΆBK^` LtPZKNHpX-׎?Vkʞ9 ! d׶o_V9n0Px)F\2 E8mM .^:CQg"m)/Jgq#^$R#447 .6$E *(xG(ax3ˠ/K^s#ۘMc 5S/z4@0!?ύPAͳ#0ҋBK^0}`BY0k܉Lt"=#&L"#hoc,`{e "$NOe SMӓ@_G_ȸ-? /e^.Џ2LUt8mM .]fwY0d<3ǜbYk甆 7`(.m} DWK/(,54>xI /`*'BlC4r=13e0yfOD$ /Hi 1]a,Ks}\8rZ(|"oծAG{+4_x#P|)ݔXG|z$"NMٵnhx n eUStGEb~" m$UD]5NX]YߗH OŊ]Vnp%tFmzGC "h]ҥaՊEL|O8Ϊ5l-oUcU,}Y g9_!j,[ȱ8<~}px;[yZ%kf>A8Ł"+{З׽7M%OU)){P‘ /_'! o <:_J; Bم^j-Ȃ^ QXwzRGrɦ*Mlj ^CԄé}i >@?Ubȼ )8- 9sq(k+A F|Z|X򢴆NkhE#j݅v۪эނ\rR8l{c`ND Ņ"iu0]a&𞛦XAD^X mmpEɂmkzaoYxSp'9_3tz4ݨh,^, L(GXRaEz+nSv?[[Gj%H[AH*f_?oB6h0jCQ^ґB.Ғ^F;Q\VF>Nvos(*U,hr&򵫠*Os[~V A&Ł"r5oJYXKK'fX.Y9#RdaMn&giz5Ra4[Bbf(IƋW87Î?VFQ_3Gz^}*x8Y0y\*Eep^ܨ((0] ]"]ZmUH,(,S]}QoSbt֞|B"TaAbEfCM(K~|XQ^m/qe#З:^PK/:+Uuv2GqG|onAs\bz",v6$C^\t#Hxq EȀ) ~_DLBLQkY \Xok!D ]]aא䲒ViCu_/tဲ vn/18V-T>s;eFx ˩@NY eRKMo:R.p~vi@䘺lT!1'[p퇟!x- TAi ^^a"aX # Hc dV>3-i`UmP5FxIz^",8&>˕ iYRcB #[ۜ 0"|ұr45U 4Xkϡӑ"Fva.56Mu+G~|דVC4d l(xR\d-.5wDw,'[]hauAD@ /B {#Vzu9x#S+\^[Z_ғfCmv7'>yN*e!ƩpMSl\]kB;nm@P_ lw6mB.֛7}L8_~i&c=N f|YJo^DL]G/l~?7BbK+K%S7y [x3_'KDxY0RIg~t(jj/>0z NrraْpߊEl`Ai 5_괆1P/śGPx`"u@?}V[W,[O4ϜMp%$𒅄OYxp;\X 0 bYrj8$dAqrCjg8L~{0!F~_J;'ABZQFuatx(nAVAK/K6W`0Щi+POA-.w'@/3m!dOjjj/En  试2FEi 5:^&<+uKvvB!śܣ#R9 '?M+H?(c  /.$d!5ZX E Z$_ha]+W|k}C=k?W51*j/mh<,CQZEYPE_bY!&jȻvx GR-mC|~RiE-uuO`(H72ˁC7_mmad񅲫IADX/ l4֭ȃPi5.'Bd V\T Vs*&>zz\79WUw\S+e2lcG0w wK.=U ͭ>Ϊ]Aaz[$W EyْJ~:^éeFx_3"'aB`!uf .Z_ZfpXS s^^K~PFo Ņ,$Ful(.ך[g.+Nn\(zz퍍^? dZ 0pXjɤ t~e 2zhmaKpE %KF'@Qfh]ً {"o7MLx_ [6.H_[F4"m/D[!QEb >6EgEAA F~Zr^y,hB޴"uDhI, ^_[˨P/afP1M5aD/HsȾh/ G왣XW\ qz)#!BS 'knhғV(0^i%PK%vy .](,ux(sK~@d`0}Ց qȞײ8$ Τ㏮ԉIkhI/hTB,^2m |B[µBNyXQAc`&K^\HxB+@Q\u?jtɀ5rKBb"dfBfVnZԃ(YԖU`aO|24$!y% LpzčS =0`!.1Tއsk۽CvYpᦹSjEX߫rcX*?}p`I񕜟Jo+h=vS]NaK[ZK+/eaHB\[/Tî7AskgSaOW z/@`_KCW}ND "*Yr!_^1֐xX:Rc&L.[R /󭿬 N}wnJD^\HxB+6h9~>ML]aKsaB\)i鶮/Ft2RY?Auą:[~Pja.?CR HX.^fjh /=e" D< 55n*zAk!6.`<[^E|bXxnga_߫ "j9^jmV|I+ut WQ$~m;0UyٱnuZ_x2l#"c 0_n[ N5Z[Ak`㏭TiQ^V5:^&t[Dqyt 1S 4# Dj}<0eXS}%ْy+QHxq!% +{z.vIGŕ׆#s3e_raD[-#ŶU||JW@2:&fCazC%uuT˃)Q|F{- -M 끵a6Jƈ/<{XCޱ`}/*XLDd~ wT\ضqRUP[ծ녢k3Ǡ|g(K-H.2lT$USĤ #" F}ݷbwx=d*5o+5xũ"DxD"BG%SGo8!Z_s?T,8Ez"HA‹ /YHxEhug%[gš[gT4WG{\fC3`ԋ_n1״@"oFoz\MY JFa@P y$- 1=tBݫ L?U(" !>CK3SaYq d&J>pn_(x Svg|;2=ٶ{e_ju؅ M$𒅄WtUSsTUa=Fpes6 k/ު RO '\"hу[BKw'&CdHYtk(-t7;ͻ?@c0  }˦$ÊL'JWHr45_xŗX߫s3(!Z 8Jc #i//u5u]γ־l`t%tM\ pVF^>uh.' B^==4ƭQ^V5:^mJ_z]JxۈH<^fK+m^Xp0ThfGPfy^r7(\AXra`1ڣ+L["FI+y <>>[-pW&_p؊+R@J91_ EWV(F-텩/KycܹK!|hcWww<,ʊIg,0!FQ|D9V;1kH{M*]h21<ҕV btAI?7 +t ii,ݧC-:_dFv -72HYh(@:ݏa{C:9{*MA.'''=tE@/5TKx^ϥ:PGjy "ڈ-%2+Di-ԋp?Z0ڋ ^r'=X4ٴ~0e#+e) ]n0eacC=βD8|:; $'+WgP?W FnaR|ddZ8!TXISrwzBil1eD[4kx0'!a_}Y6%E} :T-ҠjomNBfCXkèFLXJWC'RKeӠǓBS / MY(TK]*>h {Pj·YLt#4~V>ۭKOxI2l#.8/~ *E]A`eKfsRZpxGe/ %V_v /0J_(iBeG]KD }%X La=/u A /.$d!.](nXT.'EWwg\nȽy7_}=t6(==))!3^6ua|هDkniY(7(1+ksPByEbb0IςĜAB+`<}Ȧ$Dx 1+bM{)Q|}4E}z]޹cc<a5zh=V-|O /\C"H\xU qjΛNB5B\ɮ[/TJ1H]^mkrm}=W & SnAEi :,B^CMvH,i&RKĒIy^Eoqj}-ԋ 27:l} *+O9ͣ7I1Hxq^5nm`vMޏ4-/CJhxL\_p!U!r䍆&BrJ;0Mp1x .4^+ ^QjC)~y|ExB^'XdW`Dך[gJ_\yc@.Bɵ,Ʌ2aM r! $#;KoAUPsa4W=0ۇ" L/F]xAO7I5ϧ{][?X{|iW?^-/ FWnٱ_|^ s*QKesJ@*CRGszExkt aӏ̥ƚ\N5UYHv}@DR"t@N) b6~sF/u]R) pͰPY%i;JЭ˥۾Kzq~@2HYhZ]D5AA ŗci cR?^%t[;$xC-Ů%ڈ-KyZT<%#R~=Ԇ@euܳyNA‹ /YHx9­ӕWPΥ>Q _9D.xؙkDdew(RFy变Bt2tF߼S+Lt~)6CPd,ZaV p(`\WJQ^%I|F`.Ȫ.NM\# LSnY '”{]Z) D.6"+]hn颃  F(/eJ&]fD,y]望G3'"Xr7''.|}FJY-#n{S@HnV%)wTU]W]v},8G&z;Iwg\n(,׷;Ԃޯȟ b ^.uB!㛶?Y JхɮIDtyiN ن'bòUϒ"  W|ٝ0bu/s:^fdxy$ښXCK@hq&(ma@\YTOxK[AkREau*Q˟RA‹ǬqhL6 ^@߀t[]_]F(0J=;n"defwl5ހ렷^ð`߅K>%x#Aj v/wRH+4#OaN?S!>5}uً^Cxyx7dͼ@wPWsҡ(+/]a_jZo^ M0mh۫;}fZ{T>t%h9"X[_f+et*#ӻO!Zѥ25?ߪs/̮T `O G Xlw#JT˨FVC$?-/ bHx$Lv+tALr8a ,rrퟩNETĴ&UQ,\6=&Vcb{yHt_Q1OIE?Awox_|;< [X iCZ#Ixq e=jahx[ЬF}s]cAn~'$8x>G2xu<ϟ< eW[e -V\SvfZ\'#Vv!Y%sY-z=5&_P~&$[ Yl0(AOB謭πkBUڶ 8V ]yQ2ab{|ʆ\&z{ϕɅ,491A3 }XU9vW<0a %i0BK NG_yT耻r vq{&c '25va% A2'?dV+K /us`lA&GtAy g\k'K (g8&һ5uO9&]%sYO%%[兵r<J/YP| %A][?W|!;^?ٙ,-CzFJNgUU}27޿3GARN2#NjX@˹l^AD Ǩ>A[7-M $Q8N%e$Jg>fu T~x'jbg",A!mc`3Xj<OGUL#ѯ^t@iI2JNz`Ŗ BK^s!0PtaCY32a"E_- %KӁ;uc:x_izXM.\<Ǣ0l2K5j-, FYiZ8tꦶ%;_`CᅂS}by}vy?ͻwE|%ݡMsxs,a$u0zmټA(!WxDQŁ6*{brcK,1o(>U۾GtFB],5y(xa~: k,_NAR*Q>eJ]</14XLot2Pkpl{mTڰ=&6$삄]4C(6E\U[*xp auLxɒnJgf^;8Fua cͥmk(-t7ȅcv0>m'@i}RhVmٲiqfź){ _?}/}0PO^>z`k>{&Px56\Nhն^x*+5F/%:$Na8x8$~^\X*Ģ ꇯa]v`,-5XF]:+D; QdbM%uL r13KBܥʦ!e0@oe1a~WtuuCG sCC녑^m-u0ᗿ>{(XRf6}x /UAs4,_(ERJn]:]m]?cu`dXWEriR LҞv?Gw@A!׺Li6SKhk."}2OS۪# ۨW:`xhdX} /K'ŏ c5u07|fvmFB‹ /YHxL|("[oӅi sXTWE׻>o>*=49 @ɭ׆=9MRW;YBIPT͂i鐙/EuÉ/Cv( t(<r|/4$y{ÀXQJ(G׀д(/-ܔ u(go%@c@jI*|*/ =q Ú+~98n8Ot"$^̑L(-҈^69̝Mhn颓  !rJ$xyL3LD)/$HCW`blw[?bE $?2[C\rdλO JG#@wx w%`7=2 㽏8( `uP[bj kJ_vZ^n~Ey!37¨~ }vEFz4) 9k믛`O QA)܈.;LB?ߠ  i=X5^ZCus`9)TmJu'x$ ^PDXuKl|t`/p :#Ə*r7a] /.$d!%O@MaZ]U0v\s! Wt$$Lt/~Vĕn_R%&ip9rGC ](3 5A8}E7,8VlٔdX1\4gT ~oINJ10eʮfPd_^a-LY?8x>DJl"Pitrtwv,l(aѝs$A!{_Ȅ_L15}Pqp^ͅ S [7=ٵ`W% Uj%eI]`W&(  4XGU+xI /ѶzmD%Dfx᥵NґZ_Bm 0/5笫nDxStF) [z -_%?(szMHxq!% /10jK%7.Ȏ\OeP CL]?: Qta.ե#S0R .AɔvH7p~mՇ )g49h9e˷H{vx\E._ímVLMHƉO'u8J1)#\s3$|?{gE}ݜ\L) gDBoZQڪy} - *%T w sso3=fvgM5l؝|j#j|*dfn;B-\kʹZ `aIhpZas}Ic ίܡ>"ES?"TBvEZdjduRg/Ca]]Lx߰k-nN>J/" }VW%Zkuwу/...... N/DΗGaxE%~JkqI 8riyTx]AE_ \\\\\\\`ל3mɀ/%z^׃]M=^9vʂrOg_6Kfq8D: duu)!տā8WxyuyY<' zSpswf %RŪH3لH%_),!%j:Ͽm܌#&RLU'DsH+"LmFA_]S}]`K*ЂёTe5O.A Ǽ?]pՉ1UKU>gBfjaׅ+a^zr}!^Uw տP.hUXظ8;i Thn B)尋ȵVAD l]鿣҃" 6!1&ulX6XK}lJ/XK|>z%|lyڨh&*=\㵟QIga_?dt;^=pZ6F$G oĿ%$ŁK^:HwS4/ ]pxyS1ոCu/dmNW@_҅%{h#Bc_1$Eiҝ~.txv˟0Ǘ?q8b.6R n`Q ή [?d0.R\u p]Y7 |Yx `ona^-:_>.my!4CTs% g-PMu&-Z^MwxՅ@WoT;XV;o]C+eO(7ǀ> <\lgԆ}9xze$b `K.;KġLHLA$}:8^/O!2T"+.1zuߜk8K/KTfTI.@.8}o'%!2j!Z*O'OkK355֓TKGBr|ZaeW`4NF( v=:5ޏcK̠\Jq=^֫tuR˹tp z&&憇fI8ʹMﷴֵ:Π8xpܕj+AfD-=8rÄTj:o6L;}[-db&P6r_$ͫ0У}EI/t)%{$SQe:hPX#y+ZG!Z_-س^2 G..KRxx[ JNI'CDdb|7yF4#Qۆ3Ǎ2; .8HX4 noKВQ~f3Z-tf'vW(zp~@cg&}/_ $ k}1ҩ44AKgOQpJ#O -Xg+T"@m H_\Ow"ZRz֩;eyݮ~/ʗ⧢iᭆNg@$DtaCr^ހ\?(8V~ WȄў.:dii݅t=өйcҺZ^6rOy^؝"my^u|^aHlhy9V>>bԮAfIydsV9{%crP]xI/u5/@..@/"))5-.z #Q4ˠx^c&'t4[ny{WҔ,LgʨLh`׶mv@]A{wRtN1PRXC~ne4SEw+G5{4tMIƇ޽Y 9.1o7p3C\a}'3B$Pƾ,old~&:]xm${οu,_TojwȠ>)}=?0?QSQ]x ?z[`ܬ.ХKnх.xa xI"^._._ˋ+dr3Jp 댧6 O_\\SYfq@p_^2z0!?*^>Dzv*#)DABu?T9|'E>_] *zZz vK8^j^|2%~յvמ?ވ32G(ĴJep 1kQ, , Sc(7o@G/ftvA-3QZ2נ(ek b1NZEޒ7A/Qй_~m w]RqJ@ UФv NR5݋hp^(_ :_Ȯq}UM7{|A9EJN"E~Rڣ.-[A.mfz3d;pȧ |îhlQd7u}t>9J 83TqD~hm he_/9l%4:`1Q ]:80Aus5"{ ;.CGE t(ZIOЂt0Ѫeq%b쓿K H5sBXjp1Hup_{p]蠰_vk{n1Y"ct8y~EۋfߝG 㒉 _GWbaAm/E/4RD A!}CDJ >+:/u^x1oll߶]򋉋+ m'}ྉ:K㠭 ,u XZhsbp~\\Gߜ?e;Yeh^: =5뗽o7mݛm[R 41?,s/}}n!fܐI-OR6zUl+ 8m>S/`1+EMKکf|iJ჋ܴmm`~|nu^ vC.-?nh?Й[BL"&܄xpYfm;Jn42W~{Iw!]ޠl$ @W&E[ ϳSW~̈́OʸhН M獡[њkRhk^;KluN >Ե֙&uV (Oej1;5voML6GooaN/cT8x?6n\0zP -+Q{pu'G} ~3vޗn?)35 ɷYwۈ=-0ͣpG$s1L!~j7YhSl}qqMvח[>g ¼Wڶ`}SJ{**0_D-9 8?(*>Wڳ+h*~n{v<$ߏ5D#& KBW k/Em,?c=y)q@{vjmK+I54:~̀Ȱ0JPXbҶ; hoAtY=Nf* z̶B| ްPoiM5aiԬ&/7Ќ2^;x>bfpNXf >Ks=kVj(z wOHǑlD?9s7:/7SEFztjpmDQe. o2쵒\z$L:ݿp2r=.=:v8^Yu QSv>.mfJNvuF<>ajsJtuIˡ WÜjRr.:\U2/XBe|[K壾6IwXc8 aZbm-]oԳH=`@(R7[m%зK%cr"JKԽ@1 -6/h9Ju;\Get߅U\0@qB\)Rd4yurVk(VNjޮҟ77Ksq:8PK|œ[Gz<7Wr@ ѯ!.89( [[;V X(JMB(F9@+ ci[-o04D$P.ۊN%?ue; z5*)d^8Iw*Ј 4pT :o58k(ASNʥӓ>Ѿ5Mֶfj-?H-'J(,>19Dte@oA/KFҤAzJߨۘSvXm#U6l5ۚʮ%٦nLԙj̔0Qt&Dv.?\w1q8(\_&q#tpݮkq{hc[GKO6B`!)s!ʰEa6`OFSӈ $_k9!PvPv)f&z^0U~0_X\\\!QcŢ{|ŪH3^Mas&Ud0x]B5tZ>ޖ As'ťiƯƺj^-=J*݅ oޤVh FiL54AKx*LoV_.c\%$*9I=. M"т )`0? n~l)&-\]# .ێ% `lF졡Uz­yn c=t8TvAt)} RvꙛHSxREɐ9‡vA?ҧ^SDe3;ZfZ.יmmY]nzn0XT ѾʠӸ޽9pue=\KGDaD;v#~5Y,ڰY~qqq\k *aDjamVE܅F֖Zijb |!Ek-oE:8{~AwX ]a (pYvY_11_?W6&%ԗX]RV2E'E>;.~5[;hhgh۩VZܑ4:[QdCsHݕ;h{DɠGszYwK<֐+Zmؿ K,YY*VK7g${eip3muІiK5Kbʹ"Q S[9l|qq]U({0ʿ6O W4^Ut,6ܗKusz ,s쭋T~V.Mh̙cNOp qՏu/G#"i@@杇W.%r:#MHrOMaACxz1xpQ $f*@^b JNǾV15[2d%4HxY鐹 Xzd"=:fP P GLa\t^>#o^Lژ/=:oW8zV vAnT0}Re+*/\E8ǣ)wo$>s+-AF>ޘlM1xO)\GnەG\WaWéz!%F׮9;!RH ุB#DFWbUQ3/L03PmkQ;xS˛[ B,!jq=t ;:c&I|p}c>uh붕\"r4x푞Mqoswvw!zA)ԪRr!oMgvz;̮ק}̌7@jYX/j=?k8Y4@'uzo~#D<:rhFhi/?2Wcؗa:g_vd'-h |rx:~v{C߷5ghZDxqqq^fʶ`=`E"\c Zj ӰMm~VTdڶp|!l myMޞ8 ]ˠ.ĆL{KB/Dd){օC=m}#s¼* l=C#G񋞋; 륟Rj$.1zuC1kY boy.uВu5^bl/w@?:܂ BoVvA]w]DƨET}.md .֋1SpvvAOx=?sg G(m{RuTKpPGE/`~8#Jr&gH5kѮraSѽ;$A{DχĄu,?3ΌR2H/$ts (P+%} ""{m_ 3<:i/ip<CU/7Jz_:`G[;=QU{SPNse&JH7.BYM jz܂PKJ a*,PV'@Bvma%40 V(C9u]1R]bG+nR"kvܹ<`0:uTwMXDM}VF:`׍9 *cy BD'N^?X{e?A LbRA+ZXX8>9+0P1Ѓ3nd=l]E/J gE+:.h x3xqqPxuv͚<~hs]iYze?ptu&FyZ\Hkvk;Zh7ܜM+MMl?3p.1E= t"q39vp٭KppELJ9aJXX+oBG!" i tE]`_9G>=KߟL=9\܂PϫƱ.6:=TBgbLAh&zfY.;؍q٥,df5ݠ(E]C! #֩r"k2mJV9]Fzegc{FEҼaR| ;rsQv9O`tcqhʹ$ӂ .)-sCr/u5lp`0Srh 09ψrrud t-a|}+,V mVz^:,/-tLF{ع'ɵl3+_ ? *~}z~A}EZd^q譮עm")*^`3p13kv?>JBl }7r#bxWw!e7/A-2SX̡I*V IKuE%?-Xvwv^ttP[\\\zn66|>%GeP~VmgW෡7cox :X"^BO#:^K_o:񹰧9˸'~ hq4k+Bڮ͛1m7 w v!ӎ6jDԚX3T јtZ^LM X9siY$pws?.a#//lGwcE &j&6w1e(:7ݖEYƐ*M|D8}wF|'9R?j=r]9o8Wdڄ欽߀5GڞФ]'O;bi+{,`t`b:"2wqqq]*=P&gK LgeƳџ*:f:ndFv=}uFgK #;og] S "m+܄Z)jzSi=d87oB?u+3ΰh VMu'+.8P #`aTvŧMNܹүQk/-yizeQzQ}5\pKZ]nήdsmRb!r,dH-腺ba}wB'Hn'rKQGRf ҊUWL8YmpGNVDPfFGZP.@ۋШ)Z'J.˸!J/ [LUvb?H~?VE0k$æ3l8ךf~Ww"T{7>V661 ЁD4+3zؚ _QٙZv Qptgъf{0tiVpwPKE1n'2?y]tS2οn͟~鱌薢t}]NZ izSum<phFu.8 / k|籷wҦ]s"bpU%cuhpXE)Z\^cM >lֿ8ǽ\48Twp{+"ngK,g'N82zU Bi3E%<+vU챇UpM*L K)UK?ژD:BaȮ>c5[SKialRec@7Dw:KMv0fc/<=b /ҹ_O֦63I'U\>;O),8w72ޡ ͎y55¾y_^vqyx>?/=|;¤.knz12䴌U:WjNyl\~ F;hs19㼌oVu(i.$^ys714xTЎ&^y-U߹NwF*?{6?ue^ps {ɽ^W]\]RP.7?yt9nf9D*Dvvu.qPE{tj4`?.~E6c2YsYܛ7y6&o.#n9UC$#v;`Wk0ժ.qlC/'ْ2j1(u Qٹ@KhR"DGd8`&G+, ,3%ddvWqIt8b#s\^8!9b{ n1FVsT vM1*P80L%|6}MVuds&1ztp׺r%deeF yL-j Z˭¾t9T*ɘ2\raW:SRZ1bc~)+C9/`^ Z_󓝋+ rw9v`ej?D ^v{raz*-g ~]l0jޱaZi5f6 13_\\\Z/:}W~0kң$Nm8A,#eܐVZ:Zx{Ul=C#GOqu؅ysHv{X,!:5F<q!r@c <-!9/e" o^Dj}8{Q.0+'ysݡ\Pv=jdy\*zZѸ]fe;.rCG8b.[}p<^_0؅`xEM/E^\؅ujvŏM&.,1CJAu u8 n9I~gbոo =-]s7<3Ibxrza`+3cYc/9JsH/:.96:AFx=S*Xn)eЫNWYEޢ\žӸ})]bJ 8_Kszv6Cp$'Cr%MM oD$Z3/Qv1.Q5fm?z^vij[< 1:0. F %㣄۵7D}s) \n'_u\`g B ՒzDOyΛ.+9u]6ܶ ,\GR dDAF48O_:p,{؅iiv ()JG~P?Q 5Usl=;ڛXYrog/(j(+aEw~"-%poyBGcPǗk V _H[ I?D -{`,bT4g}^'5⭼>. #?uV͇?ztj bm"؎6T$ݢD9x^saq]7.hjJW5XFB=Z^ZUm=TqމU&Z\^Xg#:1M?$f"ւ&UK-Q[S߳K̀oK(`F]8N#q*XcLNԇC|ˡ s2t>p #7.DN!Хi??eރuص*@9egO60eO9KF>/tvѩE<~kz͗@pqqD^/=ԃ5בHkF?Q }:$\cYe1@Q-\t{tYDl?D8i cnv \\\F+siKz88}F?8&h腺[_GgfDڨ.1EK=: %L'6K)`yf$z]\ɩ!]k7b E!F6 7WNa6D0cVf%!'JMip,r339y퓮Z hY}.."o٣G?3s'*#Q@"zVOmd:QICu]C6c*&L``-"V7;>:æl4o^yO^# ]4PiyA29)t9 7_b$Lpt42'5p;:U_4ުFHת;2W]" .1e.|-Ytb>q R4p]BIJ2' `DUyexqqqNVԚ\tv8hs.z\_XN{Ve Zt]eJM ic]f\5[hX.x';3kUƵOإђ5)̇kЙ1Q `e=~ɭjiH]YFi9q#1f )Lt2s{{k6+`/B/gPk) jBÈOB!io#90J6^һ D5]`3L_٣7}.$ȹ;UFcz}]z] tA.x TlK==qn.vmD.]\k‡i#)d:y9Zlýq&O`^6ᚵ8K X!ו BR(Chd4#@gUln.$w`P#jmaB|Km1%M]h9k:ޛH%8ᢅ~Z 'WղQɖRC=:%l@GC^^zeob`@2$}HMJ :z®<׍*z7pBlDw{1M΅'%)ƵɚK6]8*y}Cb=nDz{.]dÍzna> VJHy1f nczxk~b;q>r v|+{!8Kl;ਙ%Bj Q$BYV.8 /]"qMm\O=H:rIaqGЩ 'K)gW^K..}(QE#*]Y\}-8ΈwY(Kǜ?QZ3b_bY[K_\\\}O#S.jK^ͧwR]$hOlcзCV*SdO.uaOUkqqqGu&s+0n܁7jC <՛Zk WrbQhUcW$f k|?pfkOy8C p}C9Mʹ]oĿldK|;(}qG[;ttD7 >6h oՔ.=VC = 0@ Itqib).{i !97UA]= z9/:5(&)jwB5L.:ZvUós[ 3U=uvGitRuN.s] G[X=Ԯ>Kұ90'X[Q4uE(k 3PY>c -] J$a'TytscNvRQrM Hl1_e2ыׁcm4;e#㈉3EQr5vr[*Spx bQ), DeP=x)qJj6+:uۊ]]2[ٚvd2ICt>JV;3Ą̐\vp; _a:Z3/oR> KCmf3v>^Y2d2=  A * \E,nEEj[޶mAmzkVP@Y!!+dLf9/Y|d2s3gΙyg O>2[m8n[mOWٮR.xq8>B;<]JgfSLl"z]!P ! ȬŤ0rbS2)yTu3zn9Sg~{adlD+ssGGzϦ}" Y&l alaγ'/;r&]0':J+|E嚁cw)Q4EEf&zك;ĽQ4:%q$bqy}޽~<+5'SvBzD!RVUqujp C8Fl!\nn: TI]nj' 4;vg Q4˙D-2"ʰJ]@)+f]&2<'LP[aYWgF:2q]E)Z~?+e/g,DGz>>AYtD9'>%S6DT ]pqI/ܶtnuof >Dcri@z^lB?2FGEᄒY3ѺG Xx} ̵hC 8T!pU[(۪[I˿P\ꍎFĮ!9m$'=MB,nOӽ.qpW/`b9^HU5b"]r+HGBF˻io#&f&|]-W]Ng.ٲzǙpe_Wsi_> bnpUCoffЕS `0&8ѓ+6#~Ed9풰jly^5 h;̜iXB 9c| C.7ɼ 5ê}]!M+Ś]{Kscvz.B|{dRZ|ǜCVe\$: %275>k˝%w CE=/酺]&[ӲPE's>AgkL;-4K͎8EpYg`?-DVD!]]N_.)Z>bkDm8_ʽ pdado$=-_wз^NjSBtԱ=OtI5M"s'@IX[8U2g 3F&zBALw2jC͢itx%<[ 9/G3 }MDf~r8HO/?n'Y >Sp[%Dl{tQLi~/XC3\ eyœe.\pvn v=(V/˝"C7/~(xs]tٕ=bvɡh&Ui!D$^IW&=Įeu4tD:=b.7+fb; I IlۂZZK%նI;&;}3w2@}}~3}~*+" shqp8v阮~lbޠMuٵ:`(\OU{?b*1,_.OiSZ[U+=a=.SuTYM \/&ƻրTvXZeQ+N]bB DiiwV8'$^+K/ӟ8Y`:9&z,'`JH>ծ-q5pD*R٣|/E!ڷ˵Y@4{XC̏e 0R即5=m|5ØizU4uԊApD'kXf &tM#]ҍsx_|OzcN _TREitx$Ůg7d" gDpYW3]-~ϝ؅zN˥ȡ~D|5.&mRGˆJhʃJ"; *5>}=8Q&-#kcz:iZMy ךM,/qwCr83k{CϞ阮`:?7T*s^].n;ÑŮ4`0ab8Zsw&mKkGFdA̗z^q ^׹NzgQ.vwX0JKOMA\0ԟw:O!_8'n1x5\%sa9gV%%"4="pvf"0FMO1RTaQH{YbV@u8 t퀩h/$k^>#_y!  p/_#C=h/~98HqR0{JwPov+3#n%O*KOilubW Ֆ{ (](2 m~P[(v=D左k\݇]^Ca!L$R'.1sÑCwA(~kg}^|FמH]%6x ڶ,ouTja7YT4|8Nn/nkvyߟ0wH."]0~G IcaY/Alb(+!oc*"{ p 9-wdszއڪ[#P+8E88+\ puyjv!ОH]pvYD)eq @'Ia x970kt˜+(6?{.2ׯ0^tVoVQqto]A|;xerxpՔ1dхL/N8C6j0 ëYhH.; U ..Ix#MGqڎըhE jC!aKbxIE]eo=1L@rF]cL#={KZa9ubg]g>:z!Gr']Vsw">9{/twpy\ȃzZpaUn)C= b;==g]]. &I뒄/|E#y!|!P/g~ϖ{syryWrATÑ ^!ν|cݮ3鎝p]/,/)rThkzYV&HYMg s;Q^tЫ趥?e#`suxF*Ы&[m _JZj// ,`k!e =rri5ls/\U ]Rh&f6[ JL6&>Ĩ(N/b'\Qp= CT᪗,|)uNkLzk8z+,!R0H#Bj(QȺ5o1'b BƏ' gs/jmIu JU6gĹVC?K3fTO4YW»˙63zLlhl.n]1B? ^03`b~$v Af}y^9d-k?4tK ְS){c.~qdZ$Į+cbX}Q^,y+пiF]9 Fc#K+\}{{Ĺ!*p?㗋?_'SkN.UMAc|?|&K-)JE u Z15b @7Ρ dN3TvLqTa.8V ۅsg&^?Ug\^l6;|W,^(pADz^;y={Q;뽔$[1-ȺxNY$Ô!7.V {F _E9i p-[ \^NpWV4 h 3!vA uV8Ȱl]h#>iaTg$g(WK]l8OIu^tj:s"2 mw` v<+\u´ Ki_.RC=41ۤMeNS|ǮwA;\MuzG U[}Q2H͡]@rxY !S.~FQxb dt }k{oiĻ7*Gu)HYq_gNs]&pӣJR2ѮHWWHSE])l~B*+zB"-trʋę뼡Xnos,~q8Xz~]֯dtG,B>4O7ŏBջfQ]? YQGd,v9Ϻ7_(B@{q8yg'݅ሔ_t=^ty.N}3s _:qw-[XSS (h%dM%렑!uBR%WsxH'%uѮ^ .?N-M4j=z\Rbw744,zț>@Ƃm1xR1l2}ǚR$(H5E܇Ei۲Tv_`Q`+@O!#jo@{;*9ۇ3qJs ѭ־0jV^Njٮs!:Z^rY%ח[Au.E`_3z[ /_ ?~邬eTkʡniZX-j4b_هnqVm_Kّ]]Cb wŇGŤx!Ec#4ҥ_Rb8rUy'AĤrWK$eϺkmb(I}eN_&.KqecWމ˾UXFcoxݵ#ǛoNNx{s9QNз K~x gH2%ϷכּmQ]\rPQ~&$rBCRQ{zUTyHFN͕3@K9ߙ(5ūTp8MXB o6$Ldk_lG~`^Us/ bHV.xq8.p+ ;].\3M,-!cKO.L+t3W]imp_ /^O ^Թ_xt}gsO{CEzX|P=VNA^Ebf;ֱb:KַK,^ZR\:C^/qJFok2^\^)JRV2qħnWѤij56=aSjRAV]}]?Rѫ=\/<~ F]!+2YP q!ߖ.XQDP] ~ܰˏ/)5;HylS .S/>> `1镖V/7_C+%itiL)IYJ b\ "|?(p{$i(sXIтq* .5 1WQjN HV՟.HCmprcbX'?mdуCT*'}mL#՝Ţ 6|\CBD(߅酽,^iض'аU7^Ah8WE WL-Zƿ QWkw^‡3u;ELc;uuf+0o@/+hrćwmvm~"[OElKȺ$< HCF9si{p(mlL9&оw'jz muF}nr4ӗp+vj)=Akuzg,57RSqO.CnCQ%uB\@l"xjj\e) /qpZ ݸcZ35~/B1SXIOu|:PlΕp&m,;yI7g)^_D/kBn@7/^́cܝ% 7 ,I.ȗPe9ۉeB삘bb|5'j[^7 ߶RiA!gDmvg/Q륷ĻfbmD8.9V:_ 3w|CְQK*YӊG$vQL Ma8n# 9NP~N7Cݤ(;:&xC)P+O'PƂ)qLu*LqSǛrYD\!^/]v\bQD-);G8~Ħ?,Ů^h+vvZT>ZV.#@sX|&~eC s/{2\h22  j9*>DRtȈGDh .ÝfRStN*E&2o`߻x@9#hw| =9GKq@{[uy#-g⼂Sh MLMfFl:QQ|:>(JϿ{ >P*i(l>8&r$SB|,54"'0nc`vRLJ:swAru͗ۼRjz71:Jo=4pj&HAr./ɡuhG5e98|aDg`&Ib~Sp"H Fҁ{zIm|IU{ RzU eQ6Ϝ&qgg24\}kwZ;GOg8zmDKv~l_D|^m[jY=%t^^v`"w]49ݜE!^_VNs\yqL<^1嗧荤IlmmE<(C@@.b͢&zLdĝ= ]ІQCSWPJ0hh9eS__R?u- lsx!qc^18 }# *P^"k<&ىSp{z ,oaLcwPoW{W0x}/'Lb@uvͲ^*+xTHx~s8}~1οqLQ+=9Iw3~ŀ# F {qC臿~˱3P}8ظ讃x!]w./7Q!=q'K5A^@@c[K;*7#sYNJ^Vl<9ڰ{0 OWtGWbV{L.qsh;;D襃-4)SC3dh;SEgkLcP9E2.y9c(myKk3D/Z|$v1d.|- e\t=vNsG1WWr?bvW{C5?L sk(8F/:AA)MU !3{5m.zW/kz|@ tiHSn;M5d]Em˃oj:<K 9‡H=Zky2cu&-yR/"+V:=ڔGrmEY]]twBW1mx<{*0֬פֿo7" 9'_:?t4UtTFE&15⑅ D. lh-0I .^P ί`@}Yf)JiiPGڄ>%9pco.v?Pg\~Pᯭ]Ǽ9Q4kR>Z.Qp8} ~'$fϟ1&b cbu!]e6LH.=wL#I88,B?((R4*"Pbppw1HLV&7uW,c.=?;"NL) Ӵ\%9j[pe/55s"2 jw͚e'^">ΦW/9K &n<:jvmzZ?z}>I.Z~q8qv/j&N0O[EbJ]\mZ_$cWF^Cd7j{tyݚ<@}/8u譾Wt4jCo tH7&kwֺk03|YݾYx[E!#U>VCkMfCX_(vM\b -Eu:[lb{jƐ(tD)*24{_p|GyI'!tݟpi/LiaU*YA6n_tݮ.*0!`0:pZ8Nw"lxsֳ@EiUIO oFb͚j>{AS >!o;ֿ5KqXX[Bwt=,ֽWKL6fCͣ'ne tX.g}7ѱͻUG+~T׆={e]?ܱ~Uv4?n`. |7?8Np?sVKm)+ DbEw_ EGH<\h'iZVq9)v=7>!*MgwX[f^`yuMhD/iٹ tbW-qs;0&J̈́/O e(n/ A2PNJ:]{}>\򑪿_o =pLHeb1S2A>UնNٍaS W@`uJ2z IBRPOk뵳3z,|yʰC|\ Ø [ ^ȡtdWu#w&jlt ?7GX'JjFgv NWqy\$$V,?uR()6V93I1)K<njnã 9t~ '']M&PhT qΔTߞ?Ѕ#$G%њn?{%a*tw~,?8N@-VRߔ $JlOi@Xo.Lv?&L#.Yxѿ2W},>9E CscTJ ^m?5SE%='YJD3/s#]/!HzI2`F$zp[;>wW/}=?;B# #җ;jl+s6/FrUX?o7G ^1:&v'+1*7/f~]E W{T#7MG+<Q$ CtҒ^͇ΑoѯV-uUrFT*6oe{swawhρwMtyLضAJuOUfDT+Q?|%|.:k2S~Nq\xLEV,;?"R}E (C@B.pw|րm~bmx54UN>'zVm,:]/d~q8 ~}zs }AZQDD6q@3(E@xk+/"c)j.wq庠#)Tӈb-f.lYS-]qHrhZpx\sb ruư~ɼjjRXm/p8=]XG aݖ$/\-խ,ct~rp8}%ށ ;.JܙJWuUy]VZ^mOzU?>4R>p#^/v&΅(+r"ve^1`7twI-OkttJ/%>+fL6n6ۘPKNwĂ+z͉㳣LlC}.o@p|inW5>IBQuL..FQĎpgLѲNpnt '.Huw]ǯ>Z&y q[GϺc˿6K`3H 6suC{F3@m+t~IS™_Շ^ьǾn w'_,YuSװINk oB 7KPa^H8N8X!ut2bbSLjVĶbyw.Q]N˩;VL[kȋ] Uzՠn)?KRR$).&EM1gl|Y𒀈䯻 @tv^pAB\b#i^1 1V ĮiF=iZpm*/'.^O^^i?c8M)܁+P vUPWmڍ6 Ѭa]^'+yXxjL8I#֘ddJByMP˅*Z(l)|m4yB'VZM50荤 F}z=7&;.cC7];Zv'UOM"sxQVt#7m^>(f?"ǺoxMG)Rò K> py݅c5,hR&YݠPa^yl{}n322GI2 ǞU~qC!3P(UAD/f}k'G=1D3*[ 54p8@A=_=_۶hC{$'$ "}R,! M$ tŏ؍T.^!FUD?+KU3ױz]M63!#?&vՖ:^pb\d2vv [ kR!^p|CηQ};> m "j0\}}/^#rwܺPk= 䴀N+J$4 U.DIp#ߗD5L 7!"yz`%AC=!{ , [m!Dv<_6 ^C .DڶY(t8vNJmưwq46@jd2Tb&3M@Qӑ R6&dNv/n)^/ozZZQ~>ov63ZpϙM3Ǝ-;Oӑ3k.88Oe ^y#Ҹ_\9I|$p'WLcW~O\E8뀅XB|,54މ')=\əI$2U{:vʐBjCT=fjo ˅US!uHV LOLZXwe# Iҫ54UIuV:ށ8<6ˆ^XϬ{(_X:$ԤQXmN9|?6/m@fa!ȼdDѬIk.qM'  H h]pvhk:ؕaP˷%E ôȬkԱ A7!y정@r|Bٓmb~dϝ8>~=vhd-%`WzccfugMbp</t*𺭦ND_>ָDjL̥}q(s.jIP >b΀=k|䓰za׆f#@k:& Ŝ5w"QA2[LԳnM,>N_GW>=?*p 2b봔9vP#ݶЧشX&tSd.^'GA]A],w/7`vyxo,Ngj_;r$YQ䮇ݾh_ R[1˓C BW0bDr`jmiVչίb[$A( r(f 0c0 5P1vt@m]mY ,b f^tݫ' ^6-4N/kxy.w^i_oHhb8wnab>Zj>N"y֞sp`UxvzdRq|J]Px68^zkAp־W8ZP11.idI5:iB NN Wdeu zd?L=tpw-$xD1wMљHVo[dg; .D \3uiٗݝ<.Q$:@>cQX5]vvT54X z=~jG!NB-s~VO$΀&vk> vgT5{-ou)|7v۲prdb9N႗ :ahnl` lI쪪mzFV2g5B :jCD$@lpC_cogY.Ůﵪ]3njyɁQ{c'@,#p u .xR%3,CƎk?hڳQgG Ntm8581\]ߌeq:ކi2+q< þ;V{p*Q¾oO,Į{j"v)vm9Sŋu W:UWee5:rM&3M]eBq:jli^~nM9f{)bL$ޙsdzE|>yg_==&zٻQȑ}݁A:|o C *Y'=PZ.Sſ>][e>T]@^p~y>=ZsIn]Rd!Iu+)5fH5F&)jNg& !t=FaҤ4pr7";vH8ɢ =«&dj@1(,WlW`72XPLp a7>5b YӃ@y+4~v6jA퐈^- :u ƊMbĔvuQCHC<%_5؄*c3qD,L68<՟m#cCS0B}T*RUII<31фZSAM!li`PRhLƀ ˙ؔ0a[yfbX]T{+ўNC< VJ$*!J}i"9!z^J]L9m8d MyP=e;B8U.wSD߮s盛2/) %%e8k 6?TIcXDG{# tNu* D}3ѱӿ4OO *Z>*}DR--sL $[n8 ~iKZ'b}xm Eqgw T/<eߕ^Iqym/')νT5MOq ЅF݇. n,n"\Ųrw63ыկFӶmzǙc7jDq %lbw9ZB 21?#]}c-%` :/s6Mt^!6{K|>V죽 XkN??HFƐ2GA}RO aRΈuSiC6kv_ mb5RGXh,;C'Mk=8^:Jx= \QZThSߌHYW%|?udK"kR.Z@qs{n0t3khҟ2q뽔$Dc M->sjdr-ۘXK=AsD]Rm<ʐ3h>ŰHC;h viźǐOrfCc}*xyY?f"IeSCc+? 9NTי*:^d2LDƐ,B&[Bxl<Ϡر3Kelif\J Τ2Jte}a**KuWu͵Op|a]X/m_@ }.dZIw piajp<~-'.խ^@px{pB܆ojX(vٶNҎ@Y#öX)mf*M[ډujDcC E,50ѣ5Mt9-LU5^cnBݤ=|^/vܤhAK;[,Cs4}X*KEeixfMuogF(>{\_?5MGu ]MF=7i!LMŠЪ:*ً^ v 3Cli").=f3E7{lXA9K9o@/>Ih&]@2';ߪJ/}(g&z=/pHO57b rPy.jYt_i5:ڱv398Ńr.LgIT.֬XWLn8w4A&xOo|~4͚G\svqMn_ ?]-Y51lG5ܐ훺7Q'kx>^[VцvC[i8Ǜ|% -A1l۠n].̞LV<,x-D%jYN3qapxA|h]āBﬡjzv|\ 0;&f|ߖ n.ӏ>'0L" P`0a_-)vґҳvAi=nSt:7d? 61rxݾb=3=/MXyŴ坝 LpEf[F|rbq.UWE=b"~o݅م]@%.8z:Hr-_;I]o0X` A$\uƒXY~_/ϥΑoeN^EZSGY6O3.w4/5f׷&xLj+:Pl*K63ĮZ/ ^l8O1 nwz $ziTj2vt8}1wgA$q_; MGWՒzg5hк_N B_q-Y B'p8~..Lr2xY2zkk& @R\.N:&!R>bA"mWhnNJVcnW/}tX) LL{Ew2I" " m%f:hSu¯ydɉ\ϾnzN#=<u(?]qW~i²&K+&<#w-{ $:ę1RD9:G0b=p SRB'PZkǞc?N:OS*Y88AԴtGm;|5bT dI> 6ea`p$rV2G64i3t:t vA nqݵ\ԅhIѓn[荡CIpd6;,(k{'"kB&. D]![t\(xQw-b^5hmJh$*4kU0C`*{_ :AH y1*R@`oq#dPDm]I<4GzYYˬE첧^}YAkˣ(g}]ve: \Ókr@c -v7gXM˥A/q#(p S;ZEhLv ZPy/%y={HuMDD!9W#lakU)(SHa"16R$xQA}%Ka?@.۾iGYE/[Nhw b=0!e$DZmxo(n% \oiLRU m-ً^^%߂+Ǎ4kX4M"H ;o%wzGp ng g9ƱsBH&]б]ۡ0t*v%4l׾{+ԵÂxO]bpxq8N̞IcOQҼInNˢa2(>.FڰHǠ7{qkK3왪Τ WgٮsX/w\VtѯCU4/^1QQ, ?8}B}/?zp^ ǼvmȀc 6wGf ᵳLZː>}5W\ڴX~q8yƓ 7gN蹑].8X)vY!vuR^<Ϝ5lc6!ul`D]b}bm?yONg /[ԁڲk&̩f(N1Ppf_5j ,z#:?7/D&>am[5/J;3b G%3i*nd=&DQ`U^ؿ3~[ n.]ΈGGg"ޚ]H>d&R"V 渞Y x"cGL6#q^!rz;kGӖ[>." mOWy%$=!$" * PQXeb j^-jk[[U[uѺT J@%la 'l3圙sL d,9s>y`ͼ_ z}Z`HERL/*IxH EW7B]of.(RzȮh#h&w/^'B QDFʱX50"KO1zrp2PJÞN:])!>|xS m 7rK>Hu:`dב] S !lꏕN{ 2%~vGۅ]ӌCB]bvQL '1Ap[M%/!}-v(֌m 0-" :ۜ=FP ) 9^",ڜDv,= -ycWtZ*\# vP&KJiś=ZGEA1`!,,-ArȮJIQ'iuW ݵdDTKꪳ^0PSq_C~ıgvrHKIzӦxI! F~g{c*m+=X~aS3XB>c3O3W0J+6^~p?;%O+F@r*b1LF#S{jrp%V>FZiua[0*igҦWDzm/鉿5G3.Lߦ;c||ō-qhQPNxQhu„0cfM MHz-.bRҧΣ_&SDOZjڳ2y=7^I4E} ?hN76? } z JL)*J+!tƣ U ;(Z|Pye'+Mg><5SyDzFx)FĐ9_O׍6 S$sR6!. ىG?" [$־dˬ$d΅vFROd퉤םe]RGa 9s鎺&Zf3*go(n ^c`T@͟f`Kym]!.\7W,2"AK )jR|.QSKI=0eCeϬe8 P׋rC =X[Jz?ߥ 譮,&>vxp<%U˻Ich.^6.o/!Ge7jNڅvѧ%GoeΨk"KDh#_oh͟Ҍ oJ(?кU;:*%W$H^jy./8>'H^݅[:ﳔ̐"zfWD1BL,#Ͳd@'gPg j \ -?e+YzT58M?7?IV6QCCLUQ\RȆCTppC].Xe ]G+zfk!I [>>mIMm0~mh nm LݥѾd21C7P]G ymY’Q:QƼ:큙B7RGTĐ4|Su0hP0=C~y4j?TFtaA;$k.zj {O-]edj\9z)mk÷lu[3tN*1@,\~\ʚ|{+`: KF2?ȓץD]ijV'ƍ$&8]שz!|r%l%~:]CM/3td0x&ǦQU/vqf{".((|1Xqgd{u=S{l +XBs0ɝYu:bꨋс'S}$F,J$I>줍tyǬ oßvYzQt'a]hPvI[ .z,[!Cc(XR}+g WWs>~|'koT⯠ʫ\. %_W,NͦMz8[9W\O0޶o|FM͡_L!98z3u,}.wT-7NdO )!ߺQIKDcVv=zci) ;qjm5\1'88w6<]'\ҵz`eKC]jjaAr.EvJ)NyN֢Kw P c1$H6:o¹ݣauo5PunR5އr:89),}*/rb_+EKmy׎ bH{|l "ǣ:ϳ6d"LQǚGHI"ZZu݊K߳f.A ,޷!wyrΕKF2G=ȩ 7^kRભ/]"9$=}297 YWB V|h ?ދ~h R}}O+]M{<=VH-X2\hPl.J/=o U^ q4CUms'E_N &+ƒAؾcḝ6Uxvm.;N7j )ңs&P}YuߐSw"M97 +CXFXì `8?KhekտΜDdv:A7;M3R0km=غujvq+Cv$u}9=|_.ևSw-"vGFs!p5|1_[+ C]s~Ox FXmPy~ |SZyg5b$M8[B{h+-v}/$Zd17JGaYw6 U,6-.uXz0ϕO.\4ٹ+[POW:_c -x]988zg-JݵjхIo:҃M ^\1%B֙Z R^F핇%]A{'7<q&Q[8zAuz~ǽdS464lfwv{3*>(B&WF, 7~~xnjܢ=ಹ{bXZ d1d(!aNᩏ9)Gpڅ`8ͼM c<$8~,;a9ts}##8B[_fq#c-LJ:'?]9< \,r.'ͼ$3 ] a+[ٯfo-N=yp"ʒG G%ėTw}M VaC_K[v~v888zg%JPuWG[+9d]5'y -`P{M]PzxOT^b T`j 78e`w`]HzV "qPFIZv3^ l+k5Zt\C;zf xK~B6=s[g/;]gk_}L q&Z ZѷpNU`2   s[-OQnu΁uV|Ym4/?kzOs)ō*!ؙ,G o(кogJ!H)6OBx}2Z}e;.X.!]1 Jǧ/W>g󧙙K>qpp:«Uw㖝ćRw< ~7{+dHU+ΝʡK%>@x.Pj^7[ Q#b|n΅!,DS;W&]z:c-)uA:EvzF;<o]1Q qO*"E4=Bml$Q|6lNEiD]=ه{HJKcU7˅Chvmmm+*G6n!v [I栛=RG;3 }G_AJ,Y0Da0"}Lbgykxqpph#+#X̻󁳓Ĉoyx@]Mu @Oд nM/HU0.N"=)1sƙ1;)c񣧄]gAz[Y"(L&Vߋr(ŌEhgR2;-@si\_H ,I0콻A(,I_62B%.XHN}G#^쬓TwöjAU9ujRQhi\z s!cX+)@~bvsPuPJȮ}DvTuA. D$L48W!k3kkI:` x3]j]ȂD6af6]]TU1٪vT] H. k΍^;CU MS$WC{]β0v%e_6?U9 4i 3zAq6Ӌ@v!xSQ)]K \JHA gdV_NlY^Nj#w_Cecs8I: J}m$!A= gCI^KVji NVCA 벽1VU>He'K$.qeC@ǚ!GX( #H2ezfLdJ/Xe<9 qSW;J3oV=~`ϳ 88tPw¢d)u#tFfgU &kVLHns0YH_}|Cr ; #©B"颫7i d0ūֻ_=-۾g^\OOxT^k-dun꼠1@$|+{~%=^1yX#LF#:l~N_A oOIINKSS WNPt"ZAKuCGy A;|waڗM?idV :Fznp2~ݞ^Ɣj;vdHi[8ۿa(u:âu;[<RW0FtX`76>fhY\2Y9XKf3W ͝(x;og1[$j!2>-Iv1C+98g"'z `1gQd1f!kfRkx$O\\ȩ nRÑ]yt/ٶɊ;Tg&kaHj$kEK㳏kPϋSqpT5u!+-e4H?.[ ` j D#UAU,S ug\.<޿Y#05 B\RQ4> J6%jj'YƇ1h-Ԓd1l|b->C\lɊ ]M K49nE}Otr,@.W{Io|{)98I ~*F1C%]Z9/L^YCxRwZtbu:'* e'u=7)_%G`8 $^uˠEB)tԜ+33dj/tZg,q9Xv{yA*BwJwY z?ci7>*+x js1 ˀ ѽ,IMHW%,^Bj2;%Iv!K0\"ջNkt: ͊)e%0յ_1[^tDU` lA&cFʳ2˷7@4APװt6,W߳NmzyxW {\LSMg3 dHSˌ!]zMG4!W뮛iۖZ|%1H 츱yB:^> /]>:&J!b!&zRcz"; %\6-J[3Yt$JpCybm},@9tG@Kq #Kz!B!!+*m+wװJXH#(.xqp.KN깓"9u}.`㖞naz R,ZμLA؀AsWrfT7 5)-AֶMCEincƛ$΅n5װJ:=j<%؂s뿦~W\3EE>s|3Ӥ Y @۟gVkՏ1d0K`d ZY[Y-@>mydu`җN邹4OeN7 ~8} ZZ!/\A ^"[T~ADTc8?QCϾ6{+v߀z^ўB C(O ݝjioWWwA՗kƄ4*"(0Q &̲Ŝ|U^-;?ޫ+RQѼ΂Lm%#eT^kj/)D3 "Z>LBPWRfcH,psS|6I3|c}tNpp.]=[Z-uϟt3R -NZp!65JTtCK.GZrC +K誔 -HWٺz2mg ( l[`a@ eKT'RټPUIhiiQV|+Ǎf[K(,4Jt3ȸ/rz\d5뾤IlCƘUcV&ZNz@s5~t!$Qg.MtyVKzdAtQ5Ȭ`K8綡y!`Dxdw3ɇ}/*𛡦n@uhE򦌚NG'dS{A bp81; #ϲkg1e^g aen]mlb,uݥJU&uGa` =Ѿ,29888r7*_^_K3#`_*Sye[R4Yl } LP 63ɵrxR[0:?$=9@hɽW^bV_4D`ٹ+]w\  ,K⭷J`^*?nՇd888z gE˯۫%]^?ETW~SW;}uNzP`NOe()|;2SОh>ymc=fE7z ϜyH*!({,)ZZW3Ziw]`E tȮmIN5/ny죠as5(L%Yxwr ^+C}]Yɝ0[F2e G~2x/l?dmJ4L <Alm9jR|\P7+VB WhϛP|=V#M*/54fL-E usP5W{ptIda}r͑v ܯvӞ'Yi[:*:JJ GtEw$]ѕB N(@x-}Dzx‹FO6DaiViVm;}UOԉ6v:s]%ѯҊ&l7I^ؾx_zPz`y@zp%!GUAg$ (9AO WB=PC"%׶g%wR& FFx) [-b3@ѥ6{HEΦ=͏k8q 09!@ig@v]2_LJjR &hVed(I,-Q(;^t?ǠcūE-b$7dDBk_Xt@}m˸ٴQ`.GOt-YcEGUm?!5FqHz17Cb@ف*d2-L7zwHfń7f LpP{_Iq>"QG]ruTXkdA$ `U7)iǕ6Ӯչ4cY1XI @-/%0 /9 .LTw3ag㩧?)'W05R^.,E ۼu=S} =.UaWG,jw4ѨbfWfys%wK|x8# t\+%@#w܍=NQ[I_{d #j.AR+2C6קc¤7B`lC(@L-TI2u91 ^ u'bdr3դPU<m▱@ W;PkϷ=w.fg w%"ܴ렓&l%VAZ:?RA+!(IJ( jHHTcz q&UxY"aoqA~=" }R@o. o|H+(Zmk&CZ. ӹ hO~M;Uu~Cc1`+PO)i~tںڊXRqDH H|qf5'[u 2g^,/5::O짖*Ja:65Ӣ8 ץ5bȶMo>_GK9Ved 2Ƞ6k63Ŗ,N6 0@槒MMB{\t 1…:@ϝIEÙ&2uM5vZA~.V_O^'_f>(Mt]H.xjii%I,d+6θ)|Dq!x JԽk,}Z}kP*T/se %wj6WQ{ &։CndbjϣˮfݾS?E9*z^2Pk-M df;hdWD7KmJC-u*h~T~E^NjC 'K2 _^XN{@&;c@5yXV3Ś)#+VB uQg0 q" 13z'7Lڣ@Gݓ+ YG_HG f$Ȯ@@.[1$؂!jwEr!@28E"9DvĠlL2GsQL`V })m¥ڂe}!j2|"Ҵ #`1bg4W 8kg< / bSL2c|qK@HHj}Qu(bZT]m_~Yw -}s $U] @l!B,?/ zjc0Zq&`H: $YKd">ʦn;9O\y5*_cPTѠ`5_ͦ/ߩ:6CZk^{Y",bkv92ԒH:B D M;iquCq$qkۤ8 un mN| x]qK[06jdۙ?;V=C+S HfqVߒJ+&ٟ`rqFQTQ풌.G1` P. DK93Oc{`r>v?0=.+ܢ ֆu;>3.{v[J,Jc>PZFfWli,3&6nk8;ѡɆ@ﱔİq7.BXCl.4c'ѹ.w []EEG,.gL/{/D㍃$۵YKF H.-hLWdD߉Av&B[en[z9Z2_?1)j`4?(B7Շdum)+c p?A9* 3Duы &Av>?^&Wt~.X|5:Zj}EnW ᦥXjhjYD]/*\n<@kzMtEp 1X v'lbJ͝[HBUhSRY3t /)N#'v雃bjBzHpITBN2T^iq xmxͻ@v1lߥpbQ(udL<3 0%S >{vAl}#Fz«L9tٮ[f?o=XϟC/\;n TUkN3(9AiXZhp}gx11` -]핇2TT!ǂ^sZ\Rk-2&E %,`:~yExUڑ 2q8(۰ ÏR)񗽁smV%ītΠ֗+t@A-BaLcA"Tx^ RzjI'XzrUxK- [0^.`_$BߙGVe[m? W*sV]$U6b "UWW ^:^ޫVSZw,TGO+pՒ;ݷm5qlL4e-M)ى@h]P oUc|T7"AKD[Ѷ/ eþ/uxl'888Tr1Ջ/"I$TVLG3ZH <>b2$9A?|e׽g3+AՈK!wRz1A՞ϗ6{3ЬvXLV岅܆)(9;v\cgі׫5r)Ǚ;@)qRWIaxFxdVrW+db5Zs{}/!Rӧ"mF`sղrrAM䘬aWϖ&`$>&ԨvIo.cqоqZd{֝vn:98Kx=Q#I[ϡj jڳmdRn>I4xՉ%`#+d:5l?qWO)NS2V$ScؾHt4ˮbrN*j{! brJb()tȽY1 /1:]z.t. _,ǟx< h]$_&$4g<Rc6XB Z!gia^Pq%fΤ1-/>A^ bkϹl(Ŧ[l+ߺWYDIFKn]ˎM*cxf\SbC X^NGy)_rWƢϴ_n%u0@zs{c~wՑ&.u6KTUɐMOC]? S֘3W%ҿ~Pmu%9vJI+ &69K5.׏`JJ-gd/ZVyʦ8 = Wo)J*I)!A%75+Sh$+8AZZ}Ħc" H}hԇfGWEےϥ Huoq;YS =-ҵ(u FEn-b9;ocD|j\KL`NU){\xe)taծ*@.+ dmh]Pwan ڋ)cmas3k=5{Bi9e6TbQ/X P $7ǦyK붾Gm)nh#P S\"ea铝OOB ͖{XPe;]Cv2iԪS*'f]v\޾NeWAU>`?B*.J싸?'VyĖ% XV2MAmLu)x}2$lp+P&$[(`mt~#weI 5hgsf*J6R`ۋ6gcڲc} ^`ĠoKlQrZ4%ӣB}KHnz:`"N# =5ēufc`P}9%dQSjz!-~øD剚 ֯=b;)%֫y~:7l"5mB|Ӻo Xtȕ+ksMKϏ{];^a2&ec0Vcj/`Xx2-Q]툪͡pd[(D;T`]ncsd+m<IyKWP ot$3M2_ׂ |F\krHcvJl~T݅lG}oR끵!eҧ):P3 Al:8G:]|fcĬbuo T]"k1_|?\wSnpBSha49}mFry`C I,Qq/Q1W8b5GvNsч!ňy`w7zJD=ǣȃ HPӡçηbBBs0v顭AjAWpwM /IѴ a3_쯦z^j=K a?'kIh*4,(6P.Gp JiK!d FnIw7L9f3R=ᅁi{s9*2_su˔9bRM't%C+&]t@% IJÀB'/X``ؿx2%v^ Qy=Q뢆 /.TB0Ƞzh!,T>y+Ql\dY<{Y׺=JB+V D`2DLoȒ%>6gEP,6N{X®0M{yѮjŽ 3#sv>{E#VzTiϷ5~/͟g5ō[Ϟ.NV:M~ע˳S"TI|ɘpj1 XN3 E.JZMj+L#Z)\qʩX988mS8iI;ݎz-Lm:H{M6Tep~7촥ZO}Pj9MVҩY:ށ bv(xc0rzFmާoooN)Xcּ9ʜF*nfXzWV9:1T6Zmt"3L2SU|a]YJb(1v Ȯce(\J>n#;a#Ӡ!p\3)F%.7JkwtqӤM]#ƔUgjA(8>aQ>vryuRD XU 0C|Vn9rLI.WfeooƖ{}AŦi٩Av>?Vg׶Cl0P?<)=Uhr{-{%8ˠ^׸3o:&;Q]rʯpNe/UM"2,T^ Cuzuh9j0NQkRNH!爫x[ Gu18u\,p*w 1o j65ڙ m7]N q{nc6m%I:fE3$jQNݮTng.3K)!b"J*s&qbxCO *I/YPy!YOI}.0?XJ-X6!A6? .hvN>yRW4%_jQvAA+Mwqp d ,otw;j&&4huw` $!u5z :6Sht\]l1(I!׭r$]g0Ϝ';z .lGb/5IM{>mPs2VWˮ-~][;-UὭdk`"rؓ%S⏟eiTEnHnVEjwEd~{]ױ%$b d^1XMPzILx~ 4t{T]ɏm`)V e͎H6ʼ8IOJu{i.k_wS.A(7 TN|LxR~E[%@vkYT#7oYuhؗ֐CM䖫'Orul l2d0Ei4j>ͱӂES3}/vpsW=oLY21ϼ]0}9s̈qvH2aB=\.&4%HRC?wk"j#1I!J)8Kvq!aysr6;ٱ`ܡQG.v':mg P8?~Wvei[J hRi z3-Lձ3d5R0u:~g@ݕ?$-j'.ٙ֯Пvk9=̟%=>=ϠKZ)n;,oFKX>fYʶWћb(.C' _~%sW4A1NuzRq & N彦UU1CE7FOsBQgv7zϿf j붻W|o}ӴriPA\D):ʲTp@" xbҾeGwz ͧZP!gHvuѓ/ҞU% +̛=Wr?*vt*F0}aX+@r BeI!ImC>PaDJA %,kppp(XJ[?llX!iRc%][[Hx]bծvr%Q&Zf`h sӍr z!vӓMsڤc3Bdި8htRES_B+p*r8B23Rٺ7LKZ70w"?lƆ1$ a}#7;X!:?g>q8{, ?g ɩR)@*Y,UPPH=~dCNԛwWS^SnU tF[:rѷm GO߬D9uzTy&bPxmB[1UL4 J/Ljއ[yĮ.6.l3@ge{զv ThZv{Mnh^P@$RR yC 몕üv!@^'e4.:7,ZzB8&(eȄDj`nP5m(/Y.{,8XdV\𭍻OhE{M-uy4K `3`94 aR&֬MCu0Bs)֣Bm#/L0p@/&365h۟ !^O>J&ijL5\ .!ojc*/l  . j7g~60md #b!&7[hQ&d:%ȧk<ގSu0!Huۙs,ru:rxpPt wP:NWh25pPlA9.-}(],Fѳ9\208g{,q}~.,vYC*YD/GK/?Z:GO/ 'rpDCxUA\.XH`m'(ZxPbưXMm#͚_c!, yJΠ<؁Ѻs2&Q$j'B}~L]HO{I$mh>=h&/ & ]LD+Y&&t WLKB_pDVd} =]ԁqD =۬–׫X @PG 3Q%zi-X'EZ!u[dwLyܽ1Ȳd+7y'Ͱk'$Ypno0!T0̺nVKbXJ/)eDTDXUT-*sq‹C|- 8HI zG3 w팸-CqI$DEO\JUu6iÌ:'bA.NaD]U@=&$A.#,9n~_ e -A\i%e??ƍd4Mr'y, } d|c8נ&1>N bN %,=BTAI&'}bcG[w-|LO$y8@|Ɨ7^KiwI@q.oi,͡; ߚjrSr_RʢUXb0$:W(ײGhXZ3k A[<8884c^] e=VGyxd*_jΟHf D6\GQj*}Ӟx2&goheX{,2ʨu_YKfj@@|(e7ڳ0_ @,;yXE&v‰ɽvL@0AM u.KUt|3{3% dO꤯w>?ߨߐk/M p_suд~M0~TD(v0 ǞyGy>Z"Ji0!,`!E\D@EckbZF44` | N@3 }s[ma*Fv)rd!p4%)^|J*1fz]0DDG]MTMxUy!Rw=4ْ.IĘɝKSnb$"~y/Xw"{CļHFr+\ffsX$&-C}FUǾ{_i,Xx\l~ 8_@tp⫷T+6<^vޣ5_q~EG}UDR.9+Բ /KHls|ӱ~M:뢇翡#ηNv cPW(x?b>5@`Ʈ+2.TPutgFBiT37Tmr.d./FtSwŰ+Do/I3#/os}Hۉ#]9f*.JFSQ,C"mr$ #ʋC)~D]v91ptFT{պr:nPrr$WK[7tӿ-8fMKJm#{,|QͤאLQ(MaK=ଧZr!Iw 9Uy .^xŜH!dJϥH 3L:9ۈ'I Kw0 ѪP W|nYc=瘾POZ)۠b yk[Z]9k"):W U.%Co_dײ?RekNn }OKW$Ix5ibSP}R~zj/4X @ 1 ox^[;N|@.Bdz>Ě;ee?k-YT^c m,o[L6uE7tҦ5F*AⶆA?vBpzI54ѾBP`m̽k(c꼰 %@י (D2 zv"oH;PFǷnowH]ˎs뿦5dޣT;P3awb mң] !#%|ץV B"@rfV|-Jv>V5gi{_Eh]8b-ˆRl888 gdI\%* tَ(\ZoHZ }e7玣8~aspp( L5::<;%ruͲ߻]j+Fτ;Ēko /V0>wOnL6Zkk%=u@HA$PK 4;O2{/Jz˾B $, "ˀΈ0.>Wq_t#zm482( *-}_{= ~H`)jϥD VOC5c=HS|&^ CO@޺o`J2 ]a4):,[¸!Чy>-]96}qJ>f61K v g6}O𑅾i9ՠA< OƤ>O L%=F1pwtmV EtǪ;S%Ħrij1+ 3B?<%uL1 R|Ư2M!!+(kn4PKuSu↨ktPHA=wja$U[}WGU#r-]rVAeo:}w Mgh gif D54a~c70j]`'ߑ]BYx lcDrU٫03P:ɒVfl#PLLa!x+'dWN#4Ѥ7y43ʣ $)Ϻls~mf鉝S/T^N 2\QW˱u$]wt|RWwOVzےc{v~4hPzsdjI#%NH:3kWWƇ L$G7Pc+SuH"qT)0SzdvabH}mb!w!ᤫps90ufȠ~lgQq9Ԙ}E:6O&exI?HoXW'f@r/O';\bRY< ڗ6Of,~::I~ 瞼]奶̀NR{R_)c6lI B+B_oqO)YDqWV+Vd~JCFk zUk`lxܗ~d01gW{Lхd:x{tړ-8<޸1h)@~A[`=hw-ZlV!vJٷH祭 ׂ'WӺggO(ld۽.J6O5e1/v%vdfG>UӾu@pه7Y#f n\~)pY[e&<6yn >0 2_^ de{x(#4hР {jB|ߥ sqgƂ%-%P[tD]<0CjРA5VJCIDc{cա0wyq]/i);Xii}fubZ0Z"w Pw=@iK WL`>GʰPwr /.N/B"Wt% ݞnaJv1})<͙  ) )vfz~S۾M !?ל]6sM@d\C .0i:| .YP w,n]B}%6ʭ/ 7'Wǟ_@0 P<Jaח%oV?=^q@YI#H5\ǧ~?AMU#)mt5֣nmTZ*%Tr/ga 2Sb+Z,Zy@`ꋅʔbI/C1;E KȐ  })6 Bs8|4:ٗ:AN03>;Yh}i:h)V gn@3Ɇk}D%f0%]r턟M]q]5F^ eEU9KId'ύdd%J; a>6D~2g! K¦٦Wm;ց슋 [>Jne/Rߥ%gH.HWsqi4nOx|br$]uC9^[!1|"zc"H1+PH]cMh edQ2pG]e>= 4KSE~ \a6763;B!׾e [iwHhQ h ?N--__3d@愸3y TEي枈+^Յy>Em\wӃM$yeaw'*T9CEQ~]<٢ UȥuoA 2o*Ize.Loۤ@חWv_R/y@!` b}Uڏ[ j+l Vy)8 4HؚVr웪_sdyl䰁tv ?BK ]v>_+vͽ?C)vv;1>^\-5hР޿JpD'q:QA Q/a za[ @tōferưb ']hk"!P4"X85Snuvqu,qvrEe5 5?mS<&o1*F0Ҽ&*Ȧg^z@ܽ>EWw< T.'W]f,t#[*]-P.[(:“_Kڶq뀤WH~CMMrcrp:WO_.;$ʐ99 4h ?#g|@ .a]r Nd:\A)uc]I^_\6Z> PB]ʐGBkРASkv WVyҍI5̔SE<^Ʉ ~M:2Fr`P{>71)twd!p╗1`-kfS4x,g2(A.-;&N6m1!(׊K XΘ0m;{YN>&ӑ.kwvǓ^i0,fRur)zC@9ShfjXl?N-=5HL\aė+bUé Gܶ5RN}2/H;⠽G5Uҋ=3$`kUIn:aiVO5/-1˂b]S& `EZ~^0`e*Kp׬YN0嗮t lwX xƃ%,G|?~2٥ ,El䖧НKҸٽ=aVѼ_ 6TeP7wO;+gRB0~[ܿ@]<ɅY+pY$>V M]_f|Ȯ3I7Ӄߚd$ڰ/dw[rKh!rviOAFtҥv9";CmzKq3/ył1S7Ia] $I6jG.ʜ2ء\ٖ/K0r"| sV(J[ZZ9i0-*} < cİ|LBu/9ep ?C/=shLHvFhTbF+ b-8iO\YJ/OyD7NG*Š}_o#si#'Ci/>$ +D .Kl]]A?kkdT^]]K5Ԡ7tk r~!"iP9]J;%&X(`˅r2 3ցol=/ h뼎v0seDxBX{HP֠Jr6%y.}=PD=PѾ'd+HĬ@퍵Tqb2##9@m]p< x^K\B`$H/9`䭷5m8\FvυVQ._J(0T7 2rHFziР30̬3c^ (JjX eBMH9R7I5j!퇭AE `Ұbe 5-g<_h$-eVR"˚+}1!&9~VLŲz !k&)Z<`u.<^|~o^a$:)ā XA5˸YL_a\LeF6icu{aHBkS c(`ɢɴlsb+:TߨKZZ@ayդrJK"ie?}Jyh9Jnv/،wPPqRBk=鸎1c.v֙ d\n'ɧK!v%MTp׋!d{* 1s0ORO8[.(|=N%CvPIgԫMpy#-3}wJB'KYB5s@I!;.W 1_ihA;'A}͠G"ַNm\exO\ƂE[ DE^N|%h4xZxX%$ "63c XFgf Z+$@XR?Fra~"w2CIk)V舖[ N{ViD0ta޲'Kg-8Ftg਻v}i0{U VvzR 9cֆހWD'X*~' hCۼOf[61Ov【]rdFh40HY^ +"IBvK+U0spsXڏF O&#(P81@1XϚ`7iwN^֞lΩ#[@&e2q[y+,.YFC<~ lJ+(*$(k 'K/N"}u%#h3 ѨHCO,/`'II7_p}iG\# <5U8 *b:7zPY.oE++پcS=FNTgYCVy6;&ފm'ZǗ:mo,퉀>r -v[d. [qm~Jbqxy[R*Jj)o.۞rE+xAw趄WC+<$UB;CF4w&ѭ4ӻ{Pd^FNŎHa&X LI˽=VZH߬pqڣ# Cl׺@hl;TR z{XO59W!ΓQ25& G]ېN_(RKH|)C18~_>m9sYw[b Qx=wֆv3ك}K<7mҬ[B<2 #C>IcjI&:.if%[Ids̑ChC_mkjs[O|)v@[x"5OxYvZ$} | 9 UWE=_'7dG1(n9ϥ+dd l2[,=>R?sRv~SB_OLrboHxܒ;7R]3h#6HLxȳvѱ[Pw: r9 \.KS=Ee)a)j*s9TVTq=AuB#KH?K->]Hn] |CXAܟ"-XwݛC# d0>&<6fF|S߮=GrõWQXU.I %geQ eo:ޏPBu[jz@YvV 8FU ,@r[*]q]Zq2,Xuc`6،5G(ZR_q6{&ÒQ Ig½X,,f2UACOÙyn3i|ćU/^g_ؗ )Sr+Y6ɟ KYJ,Ym}]ﺎTE2w/i? 4C$ZYNgjn`X 5([>VHs3G`k8.r|L'[ ᤛN_MUG֝ƒzzWQF>{fJ}tf.8p.޵I\G Ֆ (ƥ҇G+ʐ ឩ#kͭmmTTYHIW^F;Pޑ :YGHOE,mؾW^z]L`aOfǚFN 6031-gm(FgzR!?uNkb6ccG{G `;h20[Eӧr-fta΅G/(3k)LjyY }|yogke1M,󔤀+ͤVu6M=]#[n#Yuj{aT~: m3Һ"*4>$]} ʘzU[ !WvWrfk{}DaN2/Ƃ7I2;? j*8#9 s* ++ rBd"Ҹhpyݖޣ_wbh$r ~:|LE̖dFFI0)/E`\YLNRɽOй2&l@ 6(bTV+srJA!#V\Ѹ{3kx'a{r2 $g|;zOsmk:&]u] ^[?ҽ-L5)4hp/!Ըcn]?)H%$:ױ!FnD$I8C > &YI1Pxjm~@4hz#V*l͌" H;E^Id*Oud͓7Г.UO0b#tdd%dySyD(\lq1neD)"S9җjbėigOӏxH w]4l0›g\,QX9:ůPHMAo5rA]TVCjk73ex]; l 6tV2d)_ }s4uuv&sE0U^&N|F~ϩaq?uOSI贃0+YqUwj~I 5ܒTkI%YNbϹ` rc#i- TӿɜFHv iU Qܟ)#,eJ-QoZ͌i8Jv^\vW>C]uСpL_:6 pjML2i2Vm1r@:sNޡ8l[gf`3wu4DUkmѲf|N.^Jkl2M4ߔ2{KxEhsFC0< z] .Q4~blw6^𲩵epп\o#HE2rKL]*0O}&0ԷpckNF]0HxvJIg0X+w[0jmb6mZ~4hll%`JiFY^(ʁbyA 5ԷӦ ^\ڝSBU 3@aXV__( bDw]:@2e]#PV6Sl@Fne; lj]e!HBo`ٕR}+^[;z}h(zL E]j8: u㯯f',î7 Nڷβv {t4E$ 4L[ㅳixi5}CSP 6v^)gc`/W/Ek$y7.6KUI rSC &X #tt0h@uy QFE۹~ish`H0hw{}ohBw&C\ rAsXv5͑3eUΉ|˻_3/G+Wmjl Sdaz ;(X__g ]ь)c~@ݾv?aqdq䰁tߝ] l9s*WEͧ THq v TrF rJ/\ &+2OOl  'z :~.j;M%QK. u zVco(W˵.>S+Lt%5gA#$2v3:nˌ3UȅwU@?SH/풂*XK}fʱ2N(uM6.(r+=F*coL1((sp>X@@xڷ).Z %(u|&R%y  d<ښ-l;>+6.?A/qq] pbJcJbSW((St|Nǵj! z$nDI =u,a}1Z3d$BWQԦRۑ\)-Sdv[=}pw T81\w⹧Ҷ9oh?& 4HǛ.V} @DhѨzw}fMlL;A_zqiآ;&(ld-pn<&HvMX]{-l@wd[ ~Ku.|:>Ƙ}wGxbFv:Bzl{EAWy'qC]Mwq1~v +\GeWxזo@#1p߱Zg8H(OG["C$F#[9ttp]g0u+h/9?] LC籛ȩ%q }V7/KVE*Rf3zQ\js)^SJ#^9 AhAŕ ð <[^41&KևGD^ޱHKf꺧7zR\^rVKFzG~\*dDpq5 ]OH., ldȟLn]ƨ!Q%'&,86VVFcvX@ х9SZW]ט2K r"T]B$̺b֡qpyIdryd\طΞ5vXIkГQTrQ$'y嶋7!!H4zA4#ɩFӮΤDMAI ], ڨIQs8ͯ&H` O7]`}yf3rKsI>6u.нhP@8>hVbadWT O_,G|6:~S]C B]}#A61>^'>0qe1++f֊8>w7 [$Zε[](vdd ]_RHbӒH vlW_PL2p}vّB*!&8W^Y=цPF|53K (&:tԞuEeQWAMj + m*婿(Qf rA^-w{)x5JŤ@L^nS r*Y]Qsߛ"MAyofɾ/& ¢E%n`ժP+mj7VP+_ UQ,e ; }?ɝ;w<۹޹{뒄V[[vdo.$Ĉ=@+Kܞ?>vώxHCB `;EyH )P5C!1. &JƂRtAG RА4jIӵ-l jc*gf^>lYpW{ϒ* `ߑ߼!_Ǚx7bT#!i )|vKa&]b͟5",cC5e_6*/YB7jdz<};nn5렇2 0Qw'ÿ^P͈Ǩj#y/8U:8`ʠ^ jO[c6dTFpuEK+#nF VϮ 4<*,d߭|\FJr Ĕ_:R`~cޱFV_=g{\ cÊF׳ըl_گ (}}r#{Wr:Jy3@I0DZiS`kBUĘvwͺ{aWyqpp}Nt;5B;H+1E\˿>L42JwxbWQ 0eCF4 䘽AV=muC]aaYB@2 IEdoifP6'`j#gkJ\@ 9; Xݵ]=^nS{ |:6FQuW*>cȬ6yu~yVmx[ ̊D-(Q~YbU'ѩauZ Vqup&$uW{;/%3\`N-{C25Է6" *-;:8|p‹C][a2Xl co],ǖ`Āj\)Ѭ]:;E^#S/w3H U;VeD@>q{Q @^;@~bɇ8LGy'(`q(v OO=S_-)L٥% jhE ~g;H+.6RUۮ{Гm})g qpp\8U~@xPLZ"fil,-;VgLIv>l ۑ kWyqpp(A-tg1DţB:l {m:Na݈"(wrZS 1S/3@=/Kg \KUm9rCBn+P {ߢ?cӽ e%` H/ ud ZTY: ت˩껕r,/zU J#67SgθE y&VPQAvz]Â0;$\Pr䒪ԀI5IA|m̧ *6ND2Х2t ;C*/=dj#z_ ֐=317G,Gnk.Gx7xͧ'5,],#߰ǝr<߱Anbf;Cf Ryev$r,n'8)qz]͎c, &l)XEO70R+&@t05r}9-D $: dx`ۋql#j/֏J|ilFJvϽg׮{/ğn߉>jg(]T,[Po-]iBgk@}}e6q0 sWXie#;e 0mT0t**%(-qu@r\q~/۾b QZ{J!=h! *% $MqWPfY1ZzIPko5}ݧ.z֏qp\$@#Ge$hu!HմR1+f |(ۧG:~g{vh[9)9f}`888|px+C+>xS7G+۬ٙ L酼FZ,{=OV`&` @pQ1#^?IPGbbbG%RC Ҳ DSñ@X#- q9ŇX9#T+B]ŶҨ}pF'b@J&٪؈@GY1`c"NxR[SBeEnBAlDx.EGFE9Peê(^`@G+?Sְd>0kG%]BPy!P{A6˿%DT .TҪ;R(~XՍV.q)E=+!+|tŽE:|]- Οn2"j yr,P+]̢rjx8:&_7dRSAB8Ua"qﻦKc,ad;)70 i7?C+>.^+u2 PXsJm hɻVW5}ƐCUl@oyMk[&5 xPiLwb*;;}TPئl: @6 +c= ", '\Bjd þSU@ e *`YQ} 'LK'G|.": Z dPA>3RWo577dE:#+"-WyC),9qp\$Sw@o|( Դ1kbc0W@Ց`dN$oxuU^ ^X2/s;5oPM)gt̩oz_Ww2hݓiћksU8ݤW뜐? 8$ʡTOWs+dZhgw'VC]ҿt(2Ua,; Ȯ2y]Ilֿ>!D^KZ(#VkrTDi#a}\~N:#C7gahK#đ查3iBӧ7WW(o!eMbz;ݞVOg NPXn|Tf.oyc,%N]B^ͬ +sB0PJ=LU5m $ S4<Fsw)aN S%k+=.Lwy7L&Pt4@G l@@'z*KN}iu3 cH+H7=8V²ѷf0ReVH/\CH>1VdY]W\ޗT]˶y.\#. j*b=rʊ56Q"2<@KoKq\9K1!4g:--u)C z*,7LRAbuՖ=$ [6K7TmB3#"E;Oǂ%tl45Vٓd9ZuFF}O`deӠRfT4R>zOAϺ7T=vz)L;]Pdvǒ51+CS_1heGtC)=;}OU5 S<ہT9-襥k=W]/s3XRV!Oْ\YT"i@1şЄɮ#MN;Cm\eeثg?Q%ӆ6Ҟ=q;C#Z ^Gl>o}]ǫ>]?d׮e9H t)kkwk+L4'9}:VMuW[Êl G;BB g0 փ䳺`N2DP<(z}@hYʕ-RR$iaj6cPAe_[+qp-ۓi66"G NG,n{ik뵇tb7]`}㤎ˠf^GJ:E V>0JA%=5Ըޚ9_y 9ChAhEE @4/6[}k>J9jz@? LF]=}^`e%e&_*[NUu}f tJ1^wDpT罯⋥pdWڝLg-̍SZxey-Esɖ~P7e7ǵu4b WQCif&3/\^m?п{9]b!%m,j|\ R/D>d[$ȴjн_ //P JhrvR̀ʁki#SAm8|;1޳~L5sdvCaQ Z~HS -%g띈[N'SyD@ʰ+$.^HY\ EG T4۫F1 C- Ku7'֖Ѿ3423bNyl垃%'rz|@z4hajWRXH5,ϗC zT|w:Iɚ={-OˢP3{ 8v@vE[C*/2W6?gq.v"ꤕK(#.Aun/ر?ku׹eTUVLu H/ʫ=Rlv=_Vv  kB7B~--vsVv)]P9FHM*D#:SQ(Ϲk>P ?*69첝aV9J\Tp_}3oѕ<Mruk ɐ?oุ n!2 IQqUoH4+j[.D9WgSqppMQhᙶ8)엓qrn:t2x砬tzX%tòmjx-U5̕Apf`ntTM2&*ŵ L)b1ޔk71dKltt9=2+GTe#+7$UH!Q\B&Ѹ0uXfǮYg'ЂIqTsSGE|Ue@z]*(ogC`.)8Qs߼MGt4T_Ti`*KPr^nHHE[38qg%F+$T}UKe;l «#x9z $|/exD+SlR:wlaSQ>uee6wtث)] 2^ʈ/))ItE,#p|Ze>qG> ,"v|5D7`h|Q@ E[su]" 1ɽ5ɆGQ TTCU߭YTFIi$.X¢Bn:}5Sx;j$9KJ @%ʁu DmsUR6Tl:GTLB^x+hUIN#H:.Rf/d^Poi)d˖{lBR-N#Y {I4<If]SUCFj<7iEJbmjzMW*;]#ϙ+ dRtUȮ"z):Ż|4FrA9oEףc|T^ uBvZ=vrM @f aAS!G׊F)k8/pw!ȯ@/=G4jTs/Yx$FznyځO{#/wAuи.~v5V&^{R [CNxqp\0wJZF\꥞0KPy /kiߋ\n8#|QPXadѭ)YzW_ w2@A5kePIa9$K8Y6S#@FL hzr7« H"toy.H^);9ԧ~)d& \1@xI+=MAl؊hT'J`^3i0 8wMq`P5do k[g)XVP=W|?72"`Yn/(mSX1&IH{^0Oat' dW7z_T `;vSˮb?HG?r|sw{I*oV.9J7/#Vꮐj.%uKedS?jl 5 PM :"hh z;u>n} m~Nx)?rӮ̈ XSP&0 J9~JdĺS ( nr;oa,۷+i/)͹]e׽zKݰg%U܆X_BC0vZ-6fv#ͼMix'C")քJy˷}k?k*R4۔[H9Wgu?Aw&6EG`Vn;Cz(Yj\u$nʉe|&8eZLiKF'Br7[!QFPTᅮ=24O{ta*%gJF2jvi6ޥ+WU7&0T|^ ʊX]AX#LńzC%(V-q{̃UcQ(kdVXל_V/n\syCÑ]^_vB7 EdH/U2 "d=AJ6~Vzd(= iFl ˟cY~~.^mCCO^o8?ʩ]r9H@%-;93R|y܃(d׾G9'?xl*[Wmb]C}(2odF:PDt塐K fV#NaDևKZS| 4_=I06N}/ Ą*|cbn0{_F-׳]F2Cs/8m/>)GOO] d vl.1Tba[֖ҡvJDiMnzN!r‹F=ex3@1r0&yV«Ƙ|]i \ rĥ~$0a 9Fؑ}cC{-4^:.Elٚկ5C*Hha$[BJLpmc #Qw Փs i60=RFqp \=*zw5{_u=H/,?N.1gYbvr9"IYEҥV7BLXzRA |c]OePyp!^JF-tU5]W>݊1mҵ\Q Itz5*6N Xg% )5U8落ghbLWzhgt=Ȭ~)>.$*T!ȱq:68888CU-ݥx5ޝ [(:PuqpppYuΰ=H+ɛ@kkE(͓um 5N ?m {H*/+QM[;\9ĬM mg"g;e8=«ٗGҟ-{@:BkeNu.Ó(CDz^.層_.1f/oV08$B/?L+?D=lx1&>J ! &l۫螫R1Cl*/YG.Ş_i~33?JҍǦF oK'E3GSMuөM4ڗW]G?gݞ[| }zRXO ] d/i/UzSL (e༴6 I9ãpѹ :Iޝz^qΈ0X}Kne*ڊ2ra}t&u71CS3=Vh?=""dX:J AwMH97̧$TT)jutߍi~lHDkPsfO5DBY7֫OQO=Fʽ[OWLL'eQRTES"jZj-RsaWsڑ}R;| k+4Rã/M̞ y C}uevqpp{+Ҳ1K V5-gO )>JK0cAj*RZAI{}:ʋ@G%d Cm;)D1f2˿XlU|GW;zeSx#&z1.vQԐ7@!# xoO?HXhjHEgewW #D_P|\4=;g^-2N->V/1$:xk<۵)@ x ЯIN5Kk$ ֏ FI#c7&i}nrqKqmRkiDWCsz5lz6g?5V{u ڽ= r!>Λt$4H(ڢzڳ*3Tby7قQ.fPL9 ٻgrJ-[ug60 ֘h D t#7 PYw}@> Du4 lT}j! :R۝}Gx5H@Xo}Mg0beю%(LQpVo>BWl^&?>M4y{hgYU+{*6zg=A}n] Jԃ|׳;CK*4]snÀ{r#mDžaV|5I:յoу,ޠ&ߗrQ&LOޤJlʠm}VLgxo@ҨkuϲH']Qlݸd#3l %@}LYˁ,6NO/XI{ckςxۍbW[V%l B||Xpfz| }Ig{;v z().=<98.`tZ.H Y#&,\wjp 9,Eb[z.j:qyͷ9F2Uyү^ϣug* $9A?-|i#7B%GTb|1FL/?]z"a'&lF7aڱD5 ![Pe/*<.^/Abjڃ4nh&RZ$[2 0Olm6Xhb{$!WCA[a\@AM* DAhPb(H2lPAi}Yf'%O%1- EA[Ci(F?Z):m+O\[C>OI: EZ]cdn$E ^T^|ᑟȼ˝N @ w=2Ʒ׌1:A~$+fDL*!55B/"+4v7L;7c1j ,9@Fˏ`$[rܷNHq?!k#@PoRN3GH6e'Y 9@AdS(Nµw2KGNy9i/]P{9c%+~C#_ۗ#muP{v2ٽc nb.(Ę>-@}PZ vZsHãi{ak4(H98.@tZ+4ǝ6),f"5H׈nVFviD q47ߖ "~;f :Aʔ50#D$փp{fP[}Go-)@Nd~q4/w#QIY#-Juk Բ]{VsM̒SvFh!3>-m/"LXI6DAG{(ސ Ly;?>A UW-\ZjYuUGj_m(e>kק[ /QpnR2$6J&0خmri'AsD ^XJw4M;@6vNl(F*"SJkg9F;"vSݢW=Oґ)tݣ5RT, oz =Y~(I. օcX#m !\jKJzZ~Czy ]rI55Ԑvr]i+N+ԉu3s?z{ */)}0G==}GKrwn߸y fN2Wrv<|ƻ|E*S*5;bgTY ES*kz[CNxqp\蔖!%QQٙ>Z G=f4h|~|[T^!qںn}v#>Z(#lLp+GEmNe `vq `e@ ]f ȐxڴIkQAe I@JV'ޮk'4*rcg(׎d9rgLvn[`T$:?C'%ho2c7*G_$;[G yÆyuiuHi} y.%(1&ަJv6T jk7'} LHPrp\@/O;yQyRF0Wok-de&DMnWnV۩(_@.]w<lCBo![3{}['7 5u1'p>^>ri!S-<Nb" b .pGUk8[C$ֆbWAzÔ]jD!۫[M_^-%;=UZCokE<9 gW{;o%%e4o/}n6=wFөkݭ\"vQX lF%[C(888.Lt^UpP, fvS |! CvA^*OWRQ ڷ K`?T{@9@v!Qqi :Ч`gvzc~J#6Q:J^87[B 3Ʊ',3˼ғ茣֏)hs5yJZ]xB鄉E%L IY Pq!dOрe"&!Mʹ5}{gnVX?@N;Y~>_maPM#72KZ 9hF~hh-^OV#'b_!+ulW\@6$۪8ޒFd }Z~[i+% R 2j͡|rPy-<Et2{bCJ! B sT?UH.(@Hi#ř^,>3##C%5l§7L C@+_.9Jq%,^z é=~K$]"϶`'{ѳkL%ޠ>d7كm}%jc(g vZw 9@NIWqt;ng5Uեd3)Tm[֮ dڶZ1EG@v,?,J5ⶆ:esl._;P!-?Cj7FȈPշ*j$BbR44a$}%B~.KRvOmYKt2j;E .IIYC67iJ/шj0@J+H_m0]Ps %uMڶZZzXʹ?!WXJe?8888RlHV(ӣRږT %yIC}%I . ePҹnU'Wyqpp~mxw4g9H0ml"Y8yz툷%(Fߐl~1s‹C#@vb/"Wv9!~Xa4#ZGR A^N>i8:@n_w`3 sGt$ 3&6m IC C--LO"n1[l8:8Pv^t-4ױܷr NW9šF r292Ĭf@7r@ Rz她#p0DJÑtTwtbYP$!w@zAyuw|/%뫑qQbGFV}{OMWOa~,-Q;52{ "FW/q#` GeMQ~C#ߗx-UC#_+n}5trF&. Ǿ먕kC {3#v4Ԧ|ևl98.0tV+d^!~(1  vB]R?+Y:.Ȯ;^Z]C|0)MBvJ\뇁>!T˶>5]m&>^"Tl8?1@hɑJ^׮W126fy] r/R^\CuLR3gX,%TqaS*U#ٙf69ͥݬ|@J<əأC 7 c{ulX!rQFA (MViZg3pTGLME"alHqԪncGL5`o]zO^O=|KV_\@+w$CYbhG2 o<CeG{L r B @Yh\s-luY2&yV 갨1y Mz«WE&"l ewѼ]ӻ36ePR)-v2{hzU\q:ݖF7)c(Ǟ6Ҋݖfz VkR>6k`og酶~s/͜1/f m dV>&]zɁ吗b1$p p蟊uzqG*W2KXf~(\n6nbL1(ug?:UNZjgH`k8 #R#˗B",(>Gtf&`XKd H ֌(kT RU\ȮwSad5YH#9&)(.Dn7N eddG1R_ihf:\E?`(Q3.hHeY[l]r7xl z&kto=~-#ֽSE`ѣ.׽m_k¬UOat Q_?dƤ:t Jm,H~)ַiB> P[ uu'+h(rQXʐC r#(62VYB7;w&[:uuj ڤWyqp\|pH}CkS }v7/k`"IbCUI/S$:2-YK\uP( >}/ "`aeמ}G蕪6 cCBfy` Z4TWb 2ڬ(`gY۹矢'=:&pR}y(im4s}UPG3.1TձIŋ&1K}r UV6ђnYl ߿.nRKදYdDS3T7|Ub-Nxqp\XT4AnEm,2v";F / !]Kn ⎟?K7R oqGVE"KmPSϹX0H.Fl'iRho9vϰ1]C-i^PNA98jUw2[u|%^wOW@1]W@%mJ"R׋n2t PY6*S tW7419 Q=ibj=*N*&esȭBw6QA jݝ?D 喑c8KzѪ5uPvAپ_"̙GťKJy/w VwVo$4iy ݏ888.H 7g*AYn( Ϝc`{>5"'nUU5-hY6ǖҋdI/SBAn% c7k6ȫXfIM-=fNack*A1n @p=}rhC0\yw|sv_Kfχ%sc^I!&8{-ᑑN`7cP u yuVtS— ^ ɠ#gl6c>/Hw_Ք$+AJ˅G/٥WEz`F urjv lHVUY?xJ' В~'U##f3215RkUXئ&m1BikAv@X\P 0谣l@.fOHֵrfı:`dWIFމqc5)? ѵvFqH3Rv.?eq9lbNmPH#gGîV.nH9kg(%]Kjk=j+1ғ)wr?,&0j5]Jғde7: #&#@~և%jbĢR 6/;/رrDaOa nёKHp6;w#y$PtsvkuB\LyfK6&Grp\$;|;?:#NcD=: myzb|,=x(GzAeh&S7w;(]> H*A N ,J֎Zz"O+O1l ϡX)cZ]˫jgJ/!w+bi V пW%Vb"L EX,QHk|Pה.CTWl+^A=Ab52\ ; ּkbýfgo.5SV3>dSN_}eD3BUow-oDzRtЏhFjjESqk4ZA=l x25;`E6**ݤ}AM [2 $QdT]Zd1Ժ-r[3$ߩrz٧ j^U>Dv%OVY6h쯕QhX+0ھ7 l JꉃBUxUW9&'wGa26: 5KnD 65]xf^?Kͥ!GJrZrl9]Usw㔃H}b&kRkZ6٘!_Mv իB`X(b^HhJ 鿭ͿWەۏgWu39zKa;s PҼְS@[3)oc[Z 6"KpH?v;[8}`@=mx% C~<#Ʀ}>;k늛qӿN[R&Ysd"GuNhҫʻr&;KM~AjV:>m -^hkqAwpC#̽gWeU# gZT{h68tfJL#h#Bujgg(,%T004*888. t*Wde7͛ /"5 4"P Y_hP_[Hc/0UyQ[c(Tr) C/cֈX+D1pi/A=!L="ٵ^lTiXe>ZV? ], aU8xPculٌ0 C][J Y^{&f dr }$GZ6R ʷ~:+@Kb7͜crƣR#/<&iSS[`v#m4sk銹z} |arjG3HJml(<\c:T$7S ;*+;S>OT^9@` Iv5RHH1zwQFvh⣯] X#PZZ@3dTe(ĜG--(bh}zm|]l $s;/Y+%Cr @$11_wf߄hWoYIW[ " ivE 9wݤZ`YXhSu:9f!~8,`qhݗix !DU%FM7`5ۉǵk~U''AXJSwqppp8R{E*.<_NQKKU<Ȯgv841UEeTeDᤥҚfP^*/mא3iтV =~Vκpau-ŘMDXd&7;\BtIȟ ҫFѬ/8H&HXwЊ]/o%], 삪+w%C4j,o*NSH9HrFĸ*!o?bOygSRV/6AREH.q.p9V* ȡTTUI\O3ȽU u 7lkhv/u Z`Yt|=4m ^Uܧ :K3-Wvf|Txm>FvJq~!RU%Ѐne4/w%" /!P-_M{'H-B9_/fYL>ke9oG4qYk-Y), A<ɓ1duPS2ovd] SgiT#%u%rۢSJS`vFPCv!WXcccܤ6QIO-9Q yλ֧zҌ&z^/^ی߿1zDFlQP5[rppjHVHegen~LGJvV9?H0[ 4qT^>0"qCmՍ)1ln5(d3B?&@zy:2 vPg/AvBɮD{>!0/%E4rgFnYN\ )=mq]A;d3^(@zAc\) ?T*rZ[,p.yZ(Z1WLnWGs.*0hcPK:Dz՗<^:ji@ᕞ,⿷`gx4t;׋F@FIe7yBӉ ;?-yS!gi3'~dgV~ }@~}ҜhqQ j,# 4O P&Z|H3)hՒ agYrYIqWHi=Kޠ{^ضQ# *׬3^ XQ*AN%">,}__)ݰf ԋbY5va<7f s+>L߮%vVZ Β>.l7YwMcyY8N9Y]neF?Iq#(pc$Q @zaݗ{]YkT %s`/oOcCtl]crp\p8^^13rڱùGdJ1y&/ Nl[c N @\ҋiۥɁM&CA݅\_C0Rfx-uӺh,oz2ׁ drtĤRXӼiMNPj!O<ήw:ٛTq#PWֈk,^^Z ]Gk]Ź>^qšz*RhX[ݖ׳8:t+]~24ะi/SL3U5mI^vIG$y(`&e=s [EcbATPX/X _Pi9Lo6]%P)9܉OAr!_UaV:L.]}t6DvEJ CS2ٲ$fS9mMd.׬7l)3V~o"XU폹~W=r)zgbEq-FeQqXfO`*)9rّ689M[|濻u~W^7Zl\D"]- D9φU-,qQ=c(>, 5ody 3Cڨt=uf/uҝc+聴r# ]=\·IwMz$񇕃%Qwɾd’ d- E j+RU*VžںKqE  K !@wssg;sgKBf2w}fssN7Q=rh]HmBQT_ekCXg bmy5:UNk8*Eh2Fd9BqMSA:'$0K 0ԽU0\;pҸVz]穩xp[+N``S-ue7Gc{+3K XA80֞`*mZWӎڵ].o̠ r;}vM F{W ~/\_' *gB着Pt]rkCbWY@۷ 'MIYlE?XSŲv [ Q3$?*~;N3/nŏf=Ȕ2t^ѴPh䣨0]ceMμC 3_T_rH 0~9MPJa^,\:k2%X갶rf2 Sro9مc-@Ŏ~YendgbC~ͣ{^fk(*BIu2V1qFȁҖzk)RޔrKI, 'П+_XH5T۠?gczQf򱾲ԝFo%Wn)-MLI^c4{&֋4髊.ʮޑ{ XQ@Sw{qyZXh9ޗU^]ʲ2:{*`ן@i7CuWH\*Suz Q75tGh92-VC>z(훚ل/N6xL=6<`İ,0Nb3酬.X |4):7kzAAyZn{5t᥹ YȮ6Ft^>Âq 0X BQ_ag4Qg3LBu5uV@Z^ch[Z?f )Ba8ל\j,jm}|Y^&i*<ˋy 9 [xN׃ya Aq{ϑ.S8AM|,S}a4|ʝM= 5^PYPuUݲpI3umYQ2"oeN=jKZ&0!U ~TZ^Nv΀xs(uՕeاmK.[e[[]b~҂ ~΀e,w9bȮ߂TY-bД.Z_[7T`Y# m1߄.5ȜUXTbiƩwyng8RxAMF3/,4SAU]@v)ZC[d.iLW* P ٚL+v-AzF`U)-胙%"=QtI 4>bQU]POmys5\v@zrruX;nu }RUϻ\# fk~*\" dצFKdEOVAn 'Ṣ\%ʠL xcvgUlҨٓA2 ғ~}HsF2AV< Á_M2Vӊs#aeq!]i'{nl ;qέ{!=Y5;ǖMm TTm^H5;]/6k AxMGr/jGW+.H;Vɇ/0" H<@zГ>l q 6O B]WQUK+X X8&|}z?=xLWTuxUf6,"3Oq9Rc3IC}=O)=ZϞ TT<Tfؗڂ\ea;&IXJQj5]p\-Ycx ˪' /qӆra%v磠=%ZqMD>rBjH8|AX97RWU2.ΰLR $;C`d: FIx12 ,Mmqoc;+ȟy9Jd.gdSڅ:r?F|eXmH)L\l DX T+%Lu66@Tl UGOM*1x/}>z匜 QTP]# xo%(*F;–zqt8 xA*`-e:;#Ffsh/rK) Cp(TV܏/ &#)̏dgNO2|լ 8Ȏ@Qli|w;_*ߩY^Έ:5̦S38́gr bY\=BY#GOQg;ҷVj5QEOu]:]udY/|^GeԯVQ;4sťޣ䏔qU4%RͥB)}^AuTؤ~X!ɭ:7MS䠱未]_3I ^ $nWqa[6E&47/%` AUs|?{ϲo/)yBP"~gaeb˙[`^@~Ur̻c0-_6v9Ƚ30Kr覟Y?r~Weu3=>Z*RhpMˤ]'*0}Dx\}%/Y+r2 dIPB};ً0&& F]bA6*iڟ^LߞPQomMͬr B5W(t#e5.2Qve&]dU}-02gꪹLy**?V.[Dsn!׻z}PiE>fG׸[얁wDm!>[+V"h({ˑF S.=2)P[Q ruSB\+P15fd%7u .R K4"Fz)!P~Mm]\W~gUSyr>]T^H# (zҒ?Π%? mF3Bt :2?RMehuu-5|V Zb4$ԫIw@2ϧDžAhNByTu.5bך ݙOFABc~ʺ3-'46lDߴI~lUdlO"(0Pdq*m H~A fbK"Sxa0rJMC#bIW.Rn2!:f Okn`J/ی,xsw`9ʃl y^ lȱHVۑ|BY?@嗢\%/'?={ jis?+Ҫ篢=H[s9q.<(^]2Wad{LCWF0ְCa$aQrG;e}P(Fɝ.'gGZ!)"@5)HxjWI$6TG..l05R, fJ K705rUTp*g0 h)=kW]+SҬO0U d< Gu&^Zi욇 =}U~ w6^ŽazVŶ@ 2 qB$a|N`e~`;XYh%LbmeS.YPن83;ɱ"-V+Lg)\7XɾjTy9YׂN*xGGD(b %mG;ӾF|.@] 5ؾHUw.[ X!–kܮ C<+%S}W>^vXnr]*u4Y6~Pv2HUp>Tcgo z K޹\]vN2pm?n7ߖ삊 6PZA5kz:{ u7`59^VQm[=Lvk򯾡YzҪPTD9%Ԓ5&er l9G r=%{x9^Anok~qZK% ' /,^s衠v+Ik|SBўt)zzff9טּO5Q^Y [0_+g_Hh2 6Pև .kؔ F8$2 VOh:F5E-WXrO`dl7z ه!~S}v̈́׸1C"^ѭOgy+ %Ũ{?/5V!JDtRǡ2h1)X.o<5_OPPx3$_CBWyfU׺7Sե:AkC(l]!LB݅FDvZ,(WSkp}M$9яF F-;N;Si[)+0=QרJ̡(ݝr&(*Xk7j7b[- xV8888:m KKƨgVE*lWzKX(./(,{SBβys;k~mǗ Y])azmヤM(jb^_Φh/~ᓨ.Ju%9, }Bh= C< Kdcra '_~O]b}  el=m.Dv d< ?^mJvrXlbZ1u ҝ9L"@`gcP>Zr1>0>x䘿p#7vc/I?g9^jkiZѰQ䶵⣉ >/Ldܰ ~Py'𛚃2GHfd 4K3 kT@cEI hi*)ҴyQd 펝4E\;w`:8 nƻT\-FPDA5\$[2YW8 ' ?6M`zLuD }CP:fm|Fq͘`rlc^ BF׹::_f).EFX0Tq|8~vD7|a}=Lj.#SKšJ9$*j .(__!M-ov{t3ӉlT& =Q:zcv U~LM~N&,})!}½D #2PMFQOgrCƝY2 blʼn:[&:m;YT^',andxo}^,#NDWnώ ޤ¢oݫ JU'9@ .R#jxh% Bz?Nް0tŸ* 8Mi֪!\{Qobڕ[lݖh?҂BY 7d -m.ēo#EZ#aװ~[U@H]SA,{hnMNS[^khnd~ h ? b}s-}DU;Xn6OZI6$sDx/}W ,2puWpRь(:!:PSB~~LvPV-Ioc.yrԺZncŎ ̃?ngXX4JW1,(f7ҜW2B9IH/4}!T] أ-"hbe(̮pVuFvAe,6*]d>CO HS[ S1[f_kJ/Yeۮwed;C> @mA=8tw`0ne9pd "he+C@prBiArZN\Mn:ɅuhoRZX0-vJa-C )*gYbh_/:VJ[/P31 $`T0`7ӑRcT_G{7]זG&;\l`%RY#) '*Yn֠*|-W]LU ۓ鱏[#R)"e#5TO =Ǫׯ>[eexJiwRW⇮pw»8؎lVu=QڣkQaʟtKng(WҨuxָE+@DcU's<#/G9]6[25ZT\~LhpZ)7:LԺ͊=  E1Ҙ@z R|]PT^Z0lM*jEHY =iFpEsfK7Pn v>bʮmm*iqc0پstzJd,?ȩ=皭CmL9W]H|΢IHR>mF|d[]z|nH:ӦnOq+CN$>V֚hъJwj2 e^[:2引cJ^7,Ⱥ:v*Ƿq :Dr D);?@9 |wgҋYp}*V)1^UKDv=һu5'# +(@FAKRc)`eK #[` l $+9=o5(#a d S~!9x,SU8UbV6ħ3]3ޜH65g<[O0[p;CpɟӒ?oKSGshyPuMOMYYBKv6l>O˟DY?%l ɾf[茄G?{ԞZ$$!ב.4.0rt[ D 2T< zcv eYR -tg++h]eK$ǮD(Ȕ]U j+H_% @.{ )$2D|^ . ~Lɝۈ辐vwP3P"WLRȅtPNv4mL e8a R\ 47hS̚h~ݢ<z E+NJKTy&/&EaʍsqԚHveK7FR<[QĔ;ȋiw, r57Y PsNV"@ fJ%^}kzދR,j0 (Ec5#:̆ ( \ZS P|>9ұ. -| VJ \J{@xBw N$<\0ҊתPwi=XbrLļrw9՞+{DnmM~dpfPrgP#$rIi'>.ƪ^u'6+/QI1 R]JGSP39A<mݑCGRj6)6U1tVZY P_ɡZ^_lSN+v h&WPJB/L MTQM~=J5ʹDo]^ Iݵ4TH5IUWKE9ͪ&=ʒC˞z2iq;C؞mAj.6Ϻ&V>fw "D(^SzсW) 5-4}Z]/^7fxϽp !&ฌa>9n2J+\SxAk' CC(x43"zy7U}m.%COCc_v ovҢPRa:}I(aŐmLU5V2&Քe>L dٍ:z"CJO.c*cՑ; Bc;39+(Q͙6qnQ'i ~=+zx /T8=V|17!l1BzoQHALIʐӪl6NZq@ՊKG FˊGg*-uei*/wCg42!Gj*.;r2 ۖEةֱ =0:wm?[E=Vuꩭ[&["ɕÞyxz[g_|ǼlKkQ@RڄL$-|Zvr)t:$)@~9tH&o_y^Aq9q5cufuH /B]嵝>#k+{h2  /Fq Or>\=-]?Z۾*?HI6,]e^. zdUV`_h'N/~8B£)o`8Lu" V-9:Qw/Jv9DŽWͦm6kƊNaβX824TʎH/W`8{tb[$ĂaW|6m? NRQ}*Ί.&&m5B3u=wDg dTbe03#m_2H/[øMH ͷZNcG@ӱ߁tF+C J6' 'IN&ʋe+$7ƭ 98 Zڌ0G`KZu~,YoWW }2׃5%0V*#MmLyE rk[ SÉp4S$5v| ]`@>џ^)og펬;S㥢Faj㻭]\ yN2tޙ]]m50[F;]-_ZBs;Lݕ1(;hPz.4.dG_r'sH8X_,wґ>^O[TQbeQ|LG\c(!Yt .쒊 dLTbLAtp 񆺋ev5)"_-6;ھ됦7ҜkZ)4oCJu}ZVՈz}#ԃfب覦M+MŬZ390bF&Gg!;+>[Y=we"Fr*)0Rg`[ؾ\W5K VyoX:{BQ~ q-F!ฌ@xEM, I5fK #`_%cj@vPB'S|Vʵwl_XG{Nw eL3-iH@4G3 J=XL~ڝFZZv|tLj06M +JNUqUGVyjy )mh/WE:3. W&vGe)-l,-bccG_KO HSj){||ںMٟ=/WȒau{n5Wwrn{h?wЖ?uWe~'> u g鉣ۇs{;Rio(*̠KuUXZ^/^dMd  ^R"ёOၺ.qҡ҇ǓI47V2?,,Ŏ{X10ipO^ %e̊ aOw0JL'p=-1[Q#3F!,cz5빬47 #LxPi._kn%S#i2\PH5*T}jdrv^me1vfBy)asd:u!e{ #|~,g?L,@c(,8taA9GNЙ‹\SAB md-)5Ҿ.>%1=m?&jj;+()=\rzM?#YwjWYuo,32 DrXGL&_IS]IϾtS H19}߾ #ДjO<\ޑG˖Zô|d} kY]j/gMKEgV7&<*[#xVrV-@&ǒ7l ՏM#^l ‹G_Tx'PC}_@(狖<2Exdu= {?EFĀJ S\-*rɅ"B^Hw)|$KpEDRԄ~ӷ';_M~ 1@ҳNZ e7:lG]fWkJU?~J%s|ͅ/ ΊĆFq|?JU .iұB/JGіk_\F=F&}m5tcp- IS]11|ŨOxۂ888:!! X#7¨KW4STwm(mJm=^RyU"qx-2;ֆx\ Kw4pp\omm{B VkKtI.'It1]2}m0⪙fU%#NZFr^`Lda闣bh]"/88CKi!UfcV8oz'3).5bSd@\jfסmY3]:mvhKۆXw]KۡTrPg=c q[4iT:SrI-ס V-y־_?1fu+oŋrw_ݥ1+K )Z*WΫ^54{Fx-/%Qq>IKTns‹㲇ޗ+o+ݱӢ 4B,ĐEWUm0?]Vt?օم{1QÁ1 Rr^Ah8~LvRS3.+gA1 E,$ INvO#q>U ; Zxןn4g o" ^OSP`D _vEt _b@jK*lk7}~J ;WɮPMܞ%%}%5!M]5adWf; ٱ] AvI{i` p؎UA(tϬRnΘsUȴV(^&羳-G vװjV,N3\8˭c"'z^/| mF7) /ԛ+6;:P. ע"dٗ*cj]{M+-=\'ۣONEvmW4{iS4j}wջg"=t5l=i>4:S|:Sl=Ė2uV.kl>cd kmG-0ڿPy)G4+jPaÖK4_XK+ņWc />o!4FK~t,#y/W^-Vv]2gw JX^r(T"jm}kRuDVDCYvnI c' !,GRV<^4a.,L`ߐswNלy[- kٔ 988._$u/I.|L d5H<mJ̬檎QtIhi$]8XDב\U+,l`lDִ}-t~w\[iL1ֹpbbteU|7̅}Y]`5ǧ9a Q J\/;9E+d}}MP͜zo e2pߩ: TpƢz*( _Yjk\Eږ7idIi;yG@;(OQ1עN'[.ѪgY^[J̨|dQ}\qWƽx4';,ZIjjx8 Guu@zxz}׵:6ƬR v#Ld-?@WN@e Sw[ѵ!\ >rSV#DOsS#$*8~Xyp,%'d簗ܱ#F71ҁGI1CRI ѠjOKw0f_W /bK;P|& A/lh:o{/^1@6ᚄHbAxZ+VP KTȮ{MVK\ P**k%uV|h3[VaF@uܣ[Zl/yD.W^ :,KsS>5yK2I֑_+jI.5~{ uS?<ƙ ,_ 6h8t@ MN3S!RadR˰>m;rq.^Iߛ-b>wK k3hZz0"ʮc:Z[uo~}큈\'H,x`^i)a.˪ͥ5:w*c\>ndC^G>Ĉ3j'[*hՒ4/?F̵ฬ!W^֣Oz'SťR*d5_w:1SOrhSx iXdeCK9RspJ`u_.)T[wWgN988@HH IiByGaz 4ﱵG]ʈF҇';B͇ 4n4 zy 4id6I*vẠuޗR[IEyꡔkk6 L@YsTTWϳ,1^R%fи[뭭v> Q_:FM>l.obGyE}ǡ8Py~w}/KZyQ+5F:%!uJ/鯻 {o KKseG6 G{u\3s/Bx+m)2T۾*`Edk&u=S{r.AavyF^h\?a I _;{ho|`d&:_Xm3Ŷݖ3q/:ŎCi/1[ͪj?B]ΊBEWHxu$LjPoMϕd^]%E)b;"wѨI0 ;|F A<%`_ 3"!5^z 5[aj8b9OEGVGt2PBƘ+v'888:(ʫ_R #mfڍ ;QCQY> 0RG,{Aֆ8QΡBEхa꼱يQSH,}a:=M TQ:`@&USFa҂ZziSe8(ۮ&L*سaҮ7t.WkK6Um_|8{ ׯ \ G>, ] /Э??"| Bm!vs /Y&s]r;UH*Bh˓Ɠ߹5m"ںV-NpiSlNyK ผaLP)_)U&z`WU+*|aSIFnɨh}r>wI٥^^inﻙB7F⪦:Lڶ[+OVmBGqpl9q-z6u7_8PȮ-̾)ԂrK. u*L"{) ߰Qw\љ=*`&@B-zXF=akh4LHB妪KhB{,y^',_]FQf5Ҥ Uikh#9Uxlci}h#WPo<2vGY_2ViTM~]> #:]Y˶md8M[kc՗sX )i6FR9aH[A;Y͚˭D^l@}m 5'sXEՌUuY?sNp,Oq!2k֤p]&ӆmy0«u)嗕ir$@᥄`w8_3gu"`ȇ"0M b[b~SI[RFjU5PʎTIkW]m9a[IdQ'nWW!O"#8'ɷLȘ? X e;|ᑮؽŮL dw \Ek7ne,YـD7!־@鵶}xfPڔH1֧dW똅tS}E">kCLvd]6XEG888+8:Iu=ԟ2,Dm$%iK;ք.Y^Wy9o=9.-񶵡 IK8u#2袰Ux/$_Ao'S]9e޷zSٿ٭>Z&ʜ6Z⎝ (%䮳 sːpP ЂF2Gn5 /$l(}n H ws1Ip5强O\kgh|QcpwrT<С K>d*/CsN댞1 t p@'whڎaGR)FB>P$EdG^z=1e4EzUrN$ /TPhE,Xq-1oRQ4ׁ|Ce5e`dd &Τy[R}vֵ6p|k?l.DwE)K8Oa#HP +pj}ޡLv\E2m:~X8>3>XI 988:PmrTxybe(Ai䦕iV kBoXӓsb{@#xæ 6ܰ)[rptaϱN$RK=5OgvfٷG?]# 8/uts\U*״?|H2kZdW^Pz~j+m {L~u>JwqӌV@e&t^k&5^'fH5=rt Z,z<*, ?QAa۴s<層Y / "ؽ/몥WSۇ;\u~Y %H/=Bxq%L5 Tw+x4 jҵ]t^+أ+LQ15\-4PJt. uB(Z#mX<_՞O6«|};s!mI7<^L;E{ʫ<+9׏H 32k X@(1LOȤ^I"9Uմ9>޿A%sP.Ty{v;'~  +4Z]݂{eb7TUU"H7>S1[,NN4IIp;C=0BғiGEݥ)u;RBDu5y/nYc9BYA?rkC6 :s-j;L&ǰxPty.;NW%`9`Ziw-rԡ$_=*+T.@!S ;[ K*DE1kɟӒ?oz ~5(+5sNB&CF2jn8P q!|}FKc,[[)Vȥ}(#35ʍg{2-gjshCeto*$= k8 , ArqT 2 Q==5xrAq6,#[SXq0j|5ҺaY\O/e-|y;H[( ^w`!8: $m 勯i;s_k-21Nώ2bN i>5u3*@BЖ!f1idyKu9խsRؤIi6iF<&HCgvz[ ;>ٔCێ/.6 6 ~LTW[MZ+8j*$WZͫ+6 's,9w dW)nevkٶ@5S\Os[ϲ\/O?^EUBUw 7SuN+Y  SUUE ׇ./(Mc4+Wwχ)|l'z./Q"mWO'U"Ϥu9a7&G7B^M?gw6 'j]jm&!# Hhڒ]QnC`oe~FjUieU`kOV}Se|a~GCt?qxNBwAmn0O8 '>ANw݈~Ci$%Ey{Coi-SSvN N7چF ry~1̊ 7/=>{껢eXfH!L{ֆib5W/.6#sguiY'8, R(]<6)dlmaDNSM5?E#l?ga@l[Lq9U7Y㛼:kgk7y~\D`u}_]r䤗 o bvOɮ4igX^7Uj|=e`efB@H$rI8䐀UD?h"Կ؟Uj/ڂVVŪEEZP@@p# rdsfl&s3;}Z̚ng#A(E?{GZܺ~&o9{X)Uzpn@ 箍ծ)`+8[泥Ԕ_n-uwrX=q!qw@ccs]J=ˏ{J0 0PwZ[ʜ!Uw~ Y+ܧ2a#A@VYc#o./e"*~%o<|OH ܕ)"uX{,U![ֆZ4m7;FCe@,1БBcE4F(P4;U5%b7%U)MmSdӶrpG _\~+jŝ0ý}&s7&1)P0+S\y^KFJe]Nsö*|Py 7GhݟfE~Rǫ"?VWwu;Xrw)6Bg.=eݟ)XWsh\>Z`4d KAݥ0>!XR'@#EA{B3,mIt*]sz&g3.j( «ePC(j]bԘKm| сŧ㢃RUIW+<^R;r+)%RE]ge㤎p0`@Px;9C\k|ITGJЪvy:BOiaDƱgر;FyLjd`iUWU/9DۿW&$һ.s5+ګ |!Jyw3w^.v6kɴcg.g0`po{suY@b+=A#Ӣ]iXoss9#^rx‚?.`o175d3D 61˟Cݢi[_/($`)-rM_fu6ꙩ^HVZ;+m]繫| ']FxDK^ hg['Ы pƲB۸0edݴ-_=.ЙDO/q}?68" ~-ׁX^meD$Ȓr`~2_rqKFDN]c t-z|4F}c'iǡ3ԠHxsQTYf4.VySz0^0PגKʋHM.o-.!mm(w }B\^F>/vG[@о1 îpn.@3nѵzO«Tv^ڟ^=(fYJv%HU˾#xXCUe^ =J_ 4e*~^5lHr\}%Nb"uȺ2Q/:+i-G4к9D{]E0`}t˞dBl4$Q4+}kp+>.[sU՝=.-jdg%6P^U䞣ىSFٽb?(W:L Z]SK?j,tvekGb ydrP>)`7rSu4 aHŢ56dYrDͬg蒅abH𴋄BEo "Y;ً(UɮqeN2fZ_lqk]㜍o &?ʪX[ˬ I _#YVfLHO3O$X,䋶;7-e{^J֌A$o9ҌPU~ۢ)#%Bq<jUS._ %ClKE1N~L{e@<#: mDLM4 o;"RMvJ<'zd9?rS K36 #ۿ9o440W>2bcBH6dH/R)B-DR,bgW%#NWBzD}̴bQ9J>Rb< tCt:ejQ{(VT.WWkK*I2>e蒳pwR)rNa ZCzy,m6Ȯ*)w㩪V`y,-$'X1oZ*ғ1QLRc \)ϭ E>Bɜ~ɘY`; ~/(Pwy|WSiEʖ%41sO,r}IQvZiU ;:m,O\$D3̑籹3"vX<0ԝ22 xg䵴2%s'T\Т=yP@<QǃPP}C啝SO3>0\)-ւUux|MW>//e'2kM22B«YV2uтq|U73n2;Z),:̂1ҡcg<=43Qb :#㔾<#7WXʖi4_JxlWG.\?MU^R@90..Vv_}tVӛ:F?FI _X&.xyEoydͻ.X>Qʟ)rxu5^+5P>D~\39#[|C^ 9"B|gkKsҫl&]4t:{Qݴʨ`3>]ț̑a(Y/l,*Ԧ3G#w2|\p8ZNZRWŅ`" S*y Av)o /!M d@rQ"D5ji;殫zZ틚=U]7LN`Dg R~s+ft^AxP|ԷrO[\փ .`;88DŽ RմgRiõ׏Vl}΀ܠ5sHZT^DjjldWDr r=/}/N TEFKnONySgy+8nYBlu]>Choe0xbik9]o!c(rpw.6r߮$ڪ(|Pf`cX_Ӳx&;^|k Vz@tI.(.O)ᶀ,3yR41ŊǧQɌ VYhOM޿2bi/b ^ >ZU}J*kuEa;]NKCPCBz-{2)8;5X%W2`;"( 3D0$4v Pt`C@ӮM/JlZJ )s )rr/av;.-3ÒҨvu)OumᵣC{=s)H;&ogxkr' b&_WR.v x2!ZdIE]@vzyJA C=ڿ6xSŞeK9mZ^Q(rogf| qYe~'l52/ͭ[} /UUK[3@P0`@?w :sg3(Q]Qdbd?y`bd(.(@)A+@=` UeuPwi!98v}Y]gDt!r֬xՂy-G>Mw&QtI1\'[r [FԐyDuaD?ؼ1<_@5Z=I%&*vZ2R|dS_ɻRRR j!SIx&=)]D|AhL;_b# bc*],(| #Adr?{Zs:Wm8OI/#{C.=hn~Yc~r*/v=wZ|h,Lwqo:rKdP{a7)>Hz6!oje?u.iP k@'U2./QcNSwi:z+-S@ck:'^j,S hAz%\ Gu'%ӭ淩9=n.wMC F3na9/n .Ӕw (Ξ#?A0eMJe˪߳>QT^q1H,E"._1#%\WS11P 5Fڶ*DK|qQc`0`!`/9uNdSxKE0XNnM)9:z K’im6ky:g^76j$HRT_;#w}C/2ʰTA9,o#-2VZt,"ȑNdF aIZa?#^U%x`.\R 藖`DL% {B ̕|khۖato2 Gnmk#E 6| T({{Qw)ҨZEZE.$s|Y,5)4cҁ_jAu[2LήBBņ|^c=c By%!p{7_>z,#x`2祽_PCi=D#&ixQ T{H/jm[E)(uOh͚NG./GT\#o DVqU3fC^{wŸ{n5MNչZ@96YkwIiuU?#bBiOһGNӫi&@v-{[ZDn?!~8- Iuu>1죯JuHSv9InIl 3G2Ӥz 1Kܳ5r/.nM*7F۹"4B]vr9\d#^- ,foo`9LtWd%>c((X߬5URGY#]<B/>ڔDJ̍3SȚ-=N>-zo,xG!1әKJu~̶EoLRve0^5k=ӡw?'qiuſi:(dm5fQ߮Z^їOZ/ZJ+{"{AUQls5`:zI4)VbUyh5RD fe7֐/^zoD귃-\Ϲ2: ~acH#//Un8^ CX[$V`kgk'^DOƸDEN`|m#w6 ~]>m:T|&O ]VDK?o%u—VZ^ aJt~]3Y>ѽF y`aT\͍;[&vʵi-RXO3(a\EΥ7(s p  lXYr1)wC% -(G6W1m0-4~}&VM2HXsCgtT77>wz"[ŝyf2U{Z\]<K,mp)G}opEAF>r-}7%pگJz!<ә|=KT4%&Ǩy}xkmї8W`^CA?GU5(\[1pwM&$G*9FI%FjۺQEbKK4[lZ9}g.>:kl"Q.Z|Y4w\|ا-5θ$b4fj0dՅ>Mç@ri斦K,Ğb'i:HHx;ܬ+zd}TRwf\SBz, MaZT> ['I! stZ1q1m{JkjWyeȧ 4]BzqrzA\qsee@wC^{[qCB3?踚CB)wCժ|JnΫf+8JZ ಷi2\;Y߽/ P%R3]2j)RȞ szwN;Co1/+P x;2BB'2bJ CuOp8]*όJų鞱ֲbX}uّߟ{c+;z:t)/*^,:@_zzb~Ȑ[2U$>vܹئz*}y6L{avy){|&8#MUf_ldם*]zk-Xuꪫu~k&'c UD/3@B^OYqB]{2&r=[ݯmduf7 q.[:|؃_ۛmCz3mњ}=:6b0y>$S5dsu(vPd\ #^?vr==+C&{ީ&n0R} Qf &G|Y޷h7ă$9BTD5T+)ph`PJ^ #hPyLF%.0{0E@xTx57'W&q.79F^m 4v)%K (.PI)K Ք`P?yi9\qH^]Do0Id1kO9:ƹrtk7/cwnW{ T e; @m٠ꉀm?kߗ}!X9kbD^Sy7O<S"d'#Ʀ gs?}i)kRo/5/[r$>ʃ염X luej*]9ёLLM [D:FzAœj Qz{6֮MAaPM#xCfζ|^`/#0#w"Uummˤv[ OWBo]rz%9If(;j&{]SMAa磹JKحUr[Z0 Si,gg䝄Ddy)B kCҕqUroѴ~I x@兩Z&{8:]8ݡI bKaܤp'hR(~}A-Cj-^=kZ/DGU$nnS\ܞm.koQ _emtge$l)׭1ښ3߳^̬ 5|EӺӊ%csic=rRFJx_$u|OE[jF,*v}smUPx}0ءy{7֫`_G1||>"< f=T2QUX[9An9@aHxjZ[tT= / .TҢu%6zNͤ~ѫ}\^40SO8Qcլ9^_75qZmVfCtޙ*uxa)t_*mej@zh{PW9">Ah@!b n+w|[RrGѾHTQkGBNKdl<6>M{r jY{gBO[;EΤ\V_IxH/̢;&3rL ]<ĵ= }%k+%=CA}*Rvs Y' Db/ AA84M~Eh{7:qrc>Z@ X4RŢiGg` Ǔ@R0O@]$=?QAx'L#Punjz^bg8zh*E;]B/l2M站L1B9o~N׼9깙,?ŏ6Qs(_\&#-VP4`iꚛYNjn$SC EZ܂b;S$u1{] NکNb.]RJOFG{3]lAMf(Pτ*@чʪe䓨- 6ʊB $K'^&XWꍚ 5k53NgHQ C\O]GS,'GݧY.lVz2 oכu~靖x/KT^(qۇ3CL!c(?xy!=t %5+GW{|2co d~:Pna%pNHr|"`gh3mqP3-2ɍ%m4:f3YvAxu-֭\^G8C(^lbBhŒLlgE]Z5%C]5}|XIl"A7Ѷx$qd/0MWHXXGPsh+Y)f8IB`aun |.!ut6n]ܜaU$U/c;NvvE{Bq+:;#᳍v n񇢁\O r<˩N |iK-e9v=T^~!|]-xytuI!r@P:J 6l9@/J&*DS-ek)iھQPEfxAIۇ&v B>L+J7!)(fv!-rƭ*#ScT-p;03GEo?>h9$xIE-mL @ªV“%'E'ty W e"\]JdW[D埠ƲBԲomr[s T\RX^qyЩ!P@U5}]t\te^T^Z,%De u\H~6lrMX~MU)o_kM/@:-;`Eu0!$2:#H/ExKsuBRB>&%|xEx>8 EQ ͕b+,9 ?)'ߛ=b{ Y&z2E8shЋT#r\Wv\PŁ(ĵSB(=JLԲU1!!Q9B]EPg\X)OJYtZ!d}3[&z!4H Qw\TdIZ8^4Ce@B^'mzTDb';Qu*72F/KkK 4BK SI4H[o%SF}-U 92Cu,,FOYpdl!iC]}jɡ;Iӽ98ۖFQ[ۧsnj Et",Y'ńPRlNM2FaGN9GPxKlSh@M3f)Qn"]{)ow^9ӷW$:kjB5kSDw޻i[eL^ҋ8{Vn!)lb@ր0Y׻ 5˲"SNy+mz6rn?]+@On YKju5eD^lWZύ">a_Mo)K^ʮU>0`@/[YC+HC⫥MiW#M3D_s(a~ ?--U4Puz WiA~(uD@׾B@Xa$5F& <6itlM ׹:*TaɈ w~FPwaҡfz;< rAAk"\S-W'擮(~=0Aպ D&_a)'jZ7ofuđKn"1dr݃\;Y0 kfY@Fe:!%@p}]@r.YP yK,ncAzPn@Wʭ US0jv@Q {3喷ҶG͉zOD/`Kyf Sڔ^"3PAÔ˖&`J6_sGDP]{HggEtؾA֊DNkٟ<Z {=w͝|!rgPj 8֕YSyMky}#-v̡|k 8,HW~ME[+7;3{š)=W(l Zoe\`_? KZcT+֍.Kt 0:*қ*QUzJpII'K{_Dˊǧ*. H?xW=l ?ֆȓK4*r~h%/Yh~Ϡb}7!LjGQ4f2`@G@y_@G#((L@ŵ6[8NE]หkjiƊPЀL.%{m D ΅VZ dAv ]#ޢ#T7CX(<م{+6&, põW\^}#`cxiyНB酛 @܃ h~Lٵ,*Uv{w KAH bRlt=;{U~DVVKZ& %@n!G*҂NP1kjQE{#[0':BZ^Kz^+PsKlog]9Cͬ-+=CQC%m+[Mv־攷PI]gga9nfρ/j.R C䖃妯`sSj-K^7?}PX3pֳWǮ-0R^>NΐGDTʫyVIvzs<LZ69;C;^0LdZH0 V |^7 *hs1"4У7ۿG΄{ ıC}ޟؘuTWc;yq~/ʥ K‚saoƣ߈\ riQ==91?.!\?UVl9AdHV3T^]d!f'eMJa9[jIFʬcr+#%Tޝr[Lg9 7/z$[giwq#@d3im+#?N Hme3Gιr#W!찈$X]Sax:V,凪bmVֹ(P.Qw`xc rYdXX<م O뗺lPwGD2 X`Suhbauں!|]m^4ڹ ^.Gh$^A pݑ$`:"$@T[)/g#ّ}zI9#63 \Jv [ޮ>-CWs"= arI2B-2,%Shf49AzrKQss@T55 pmG`ʯMIʘ cMzP I %_P"Ô/s[ws*=wx2_*flFZI8)f;ȓ] 9h ĐLj; Ƃ*iҫE?Es?giD%TuW6j1ޭq8d0v@A9Fz*aϓpA~a =;ZV=WcFX~(>[+YwWf'|%Htm3,եL2xO.qd zUXB*OxSMdy|ua嵃qN<;dɴjHrpvy,x@-򊩺Qdc;2lnnp8(1Jso&f%IM 9鑧,CX( vnsD:1 57HCxiʃ#!&놀D雷hp#Af'5Kб:ب)5?apńt {\S``eIn҄vmKz9AC+$ӕaIe 笱V[>]״eXY7$>^Yq 4MB%,ϖ6ٶv].|v,?rjԺ㻽^III)T.*^3u^Pq g*6*݁n6˪Ж[U^m_H>X eI%[EybmrQYS }=߼'b#hۧ7 8 XޙyueɩNZK+YJpȆC ϙjz;bo _`ۛ/PDB2%M+E> &٥J® ,}d%xҷ!Uw a0 y…;.K|ҶFL^zA^Vz -[onBe)O?rzbYEm9zذX9ѭ^a<M6ry 00rB|ڮfR "ҾO7\7)jrZ F`UAi4]xBX.6\Pombyn ʠ{nP}pJ<3CݯY~! j+9xdEUUW0+W2,"H@6uxcJ6y$kJ6 7kVCUBYYAŧgw^d|ހ~)x:8kǮUȮmxe*oWAS\31:?-P?7S 6[Pmiiۺiݳ+*٬ K={*}3_3*/_9an 6 ȷCy-]^\K#GrD/=`=j#*:a)ORR ڎwI&&: ߵ"І {OK $8)C>yo6Yr0+ S[c2|#mۇ]tw-_ V+/DFt'&\= u:7_+(,d4e! L֬a6buIlAxa>T+st}K'uj:vf0Œ'/hE<V/];gڟjW gO%mGa9ݘL?3&җ/B^_ D4T.E0ق&%ĻY}mYmLMb^ޡgGk*Txٛ%+A٥伝ddWd"9E,dohc"vXB Ak0/{j曯rꮌ0BulY&F!A":r~ZYeed_ g8!Z6KywFe?I0Uؙ v՚y-af/o8s[RDon뱟;oHet<-88MP읚>A:'B)r|`z> - 'MJx?8xP|]wh@>}Ek(HמDBuG*} ^,r?S[VzZžYeL-EngsT\{2aۮ7`de~/,~CvI%7N=R,h@% |HIVZSm?^3g˼g%@_H02[| :7MX; Httn(Ng( s ujqև<0MԚt?=%p ]YIs\${LuV?H}*N1fq s ˘=ecl+9}ΞV=7Vz [0i\mOxM~Rliǥq2.WP_:'|#Mx- @PwY،>~nfw^)"[C2dtU{+æd,LE^u;Kki~>m:tr@<-5* _ XM[}DRbvA2%yrRBLLݥbeAykqK9BOs_煷oԣ\v7׏[|Ss5u;+!EzME(~iotG^B J|yz;E#8mcS[V0 TNt_^T_Q *=P0Qon9*+酇cl~{DJ045Ϊ+/&@98Q9QH@)GKH;$sBx6'V O}:zjd̥ b7O*(Lxvd1rxp?"^|}1_&f']>qP<^4d†ˀ.OڼE%7ҩfKaq lpUij1HM@rjcZgً/`"Sa`6,XZGr/dqʔ*&E؟LNꮆV- -WWKӴ듮`B酜\ AZ.斷 8 C#,صU]iXBCӆ| ~8gtD=W~[X@.A)+G2=KO[l;(#gnD_Rulh5tYn-e1G703OʔAaB`{z*$B*gX W} ;6+ѺP,\]Iv!P[sHCӫ݄rUm8WO77EPt~,4gɞ/(:LpBB`\\j2QRNF+ne65` ,kh]%aI;: e /6G!SVzJWr` ?3 h3gĽ?>tSweyAo.Z,J$7*.oN'&3-pJMvGov;Qjhmd.Q]'"*YڪGC"H^7[)DC>wyT5F6Y4u7H@)&on 4~=ȉ&V8 T]pWAvAƝK Z{*/L2`]ʹ=i *,VruJz`~(czb0M X,OFH8K'իj8}QsY [D</o!2SYJw=JO<#ED#EuWX]L{djwB߽k ;.UuY.6ʂJv! Q=aCi]۸[]T\^EF&Dց*Ў[ȩ_] f~}^P W wզX]}X/!=ʋc? Lq&=,%A: fYH/^([Oq^^jZjjQEjj J e *WpOof f mSP^H*SUK=zN3_Ρظ$ap@Im#+g|I%;U©>yB37biek?ʣij5@H52uOd&(+n@*=<"@GS/%+~3wWOu- 3~ᦁLdaaQ;%u{rNS+\]UZOKAzi`uB˖}YAc ʋCō)Z+o2]1bH doSlܑH/KfQDR{=ՙ5%[}i6 KcY! ΝWV'@ 6f< fi.tx@nH5nXǙhÙ%C[RL%klTU"ؗvje@A@^!aaBRIE`WX`0dT hʆrE Xfm?ۨ?R! Xσ"V)@vQem.b\(*fOD)d_Ez/xt;6{09X2{p=m:dWYyKI>LPd Ŏ$Mh SYh\jή T["" feU^Q!v,(_a.ͥqɵA޷x ~"N\&Ny$3@oi_蒅ZCh EVNia\ZP`XwbZ8E';?=rr ǰvnp .ct}܍4jF"#pL iǡzܱB5!K#BDLʜ =8cX@} v:!{Oۢ=it*͂uqhPO:~{=L+Ş{Lo{nv31Q;BC(_E8uѐk^y`٧lH5F2IoSyɩ"#(mv^yܼ $g(PîP & (t嗚m; Be;b46~>t/uYq@GK25Ԑ%g^:6kLwxpNyCF\}+䉅Os}7"bP:s\_< &ʤYaן* $^h1U ӍJ;$rdb# ^Ua^WV-<[$_2нg m}Ci2>"ў\z4>2Fȷ{=vUVS4` Є/>9ѡN)aw=1"P J@|]gAf%Kb䫒l 7Xm Ù@H%S;0ºȱ+Iq-Lgwڔae?2e$^z~iǐ2]:Hv 0؉9ɧCdWPLb u[瑩1k/nbK@(`)@G2`HC{^?@=C52fÇ[s;O~`/ˊ@[Qdk2烜~)Ch޴i66j9{H;#@Dғ - }< H.]i?(f9NqV]J\f=mi_0;״O<&Fઃ8mm0%Q[dG;DH]aDzX Vu S݉]q&63S%u6PtaAjMdU5ǧVvy^H^DBn1o9d -CB:zqND$&/Az0^zn&k/SzI /0WR1Y%8/OX\߬"ظtv%D'Eyj@n{%$OtAu:E2 h!3>CaVOCy2&e=c$%h>Ƶ1]kD߭XW$ɒ[d 1Be)'ކ]M7  >]uSHaaQ% |N/$YYh^PlqZ`qI^끫]/:@ Mm=@aJS#e$9֝O; 51\ Ok"J3A=w`[ЫR3tjt-j/zf2W6Iu{9ʥi{k14;Hu.2FzH_)'Y X"/$k]PQBzk&ϼ*z̕ DrtN(#׋H1ͰRp/~tEBݹȮWcd/~u[RKù7>n@ @ r * TV=jokKV[lBހVErH%!$ldw~6;3̵I6aޯ׼6ٙyfvgye~}/cBE]mMv/ͩІ7%_/za&LzcB/:yP8[H/A#"PyXrqc-Ly\MB.2=PZ!G. (VQ '9AL"/aȮ=˔K_<]1tjBg(&#ox_DOw/Czl(FxǗDXOIv$ͯAg?rfݿVHwc2)2A}B%$H_-uѩR.XaK-4CFzg9߃*$\^+Fdo=#`-Ϧ; 6u?H:^;.T5C[ҠDa(<)C+x҉C\Y,paqʳupS|߾@b $M tgEiVu;r($&!BJ ɷ%m5l"N9.ĘuAby YgIz-CT@e/K6 R™TS'*RIYwЯ%X~%ǷNj kaRR;N8VVP]|wBc8wu-X,4}"SYC&zD1*)kI0M߄~mʶT^[˄^4lhjr4Y4VP+;Ne IG}Zno`/ZH*lҝeIV]lFl]T| Xo dވs7?Caox3k2gwʚz^g!Ww .I֨hûYB.MI콖#~B6DT^sۘ3ңl qϡ1HqQ]CKU7Ľ1F~_Yc莼tIYu':6;I } 2 XʰQꊊ%TYBOgTiJ1\]vj>%9gi2LmcPtAMuC4UW= p ^[_{2J>wY%{!g^&pozGO,1F'KS-{uiJ2 [^cu|-bk?!KURA{h4c)V}켸vD̮@ Zj a7yq?[(sXU.{CzDo|PUi/@G.@AWckcPuoF?>HƆ]4yP(#@tw}}*U{&6A`ar"&-\:y*0)\B]95׷5^$2/p銽NR M2mnZ>Dx1YCm e„GD_@AAZ]A{mr*T@V \<4~lǀ0 iMS3lIxte-AQJyV:RɃ*jY W 8*w쬡쩤Dzf7±{l@r='̚,ݬ7fxoHcY89lpG Wtj]h=WOq S)1UGUw$#t ,rKfvɉ9)! (#ےlP9tm#y)y^˥u>&T4I/ #6tPP>]zH5`ٳW{늩7qTPy=:C}6hV%=whQ4q`ofw{W5.9RK@ڀPbGs ]k삝\xDKRz(-E,/-b&r}`^k.=&*†*:y&`x@fT#*: /GgF OiDˎ3)\{ˇ++i)@F ---,xusLɢ/su d5}YyȮݍMH~cGt˱XqbF`+o.'k>yw_~'7aa^w(2㬌\umty2t gtZnTw͑ZL1\'3L6ǹ#oeKnMx j,2%3:!f4uͺ3nk ܜwG {7SmVE` " $_}WfRhƔbʉ"ɧkՇ kdg8sJ|TZ6 h$#&#$`8i $Ldc/`;BʈG|dyV6Jd*( m,hGF̔*9!e7W~B}Cr]mUֲ:j[>փM ^w0cQVA咡<ݞs}˟fǰ54t *ߙ k|RoeHۺYK_1d^&L a`>Z34(6@/*.Iq;J]Զ؉R>6F ߟh緸hyC=n {@6DsĪo7C ZإXDBVJ,}i2p[\`;]bi,C)AKP\UcI=!b ]A]_Dw{C, Z8s/|fٙ42;Mk/hZ  P"";"v]g$]66gLc$ޠJrvpyԦ5 OyT {ho w OGj7Sb5`E](wD/?ax8F/aÛݝ?z~C͍ Y&R"4|V3xv@@x4 ʮ0ֆ,I;P tjwHW4w_0ȻxϻkQ$ZS"՞>{v꟨w8ZY88PL M!4`*2^ >׵_i{{詷=kmח3@ނKMJ %&ȿz@WX: F|ݲky݌'}qmS3{#njzoif9x]C.Swš?O6Fn6RGvUM" J/dL^@oW Ԕ XLҵi(ބIz{q˨!rT6;ɲumW(x><4LVqB<ƠT^HWJσΥ{<o Z(Pfe9yc7&.N҃@x僠zhHj1~Q̺vr>-j/A΁#qTr bikŖwXT4詷}FY}dёDׁgZkoR.#ƣ?b~= g}{ Y⟥c_ۦkB*/9mOhRIyC[ 1>ySR'KOkՄ#ؤ3woki/D)`oǯ[<ֆZ\x]H;t S#!lŽ/]oG2՚]'>#0"[nr/;PFV~TF ABؠ$8t2#@z1R,}83=~ &F?Vjn/$PDj ߭l^ A_쭡 v*[+I } p8mZVvɵ[{3ߤGc=dUe-y=oZJ?/S} Po9Ե9F%e 4Mg;iɟeJʛۿ.]ǜ:چ}Jj1&=Fx%YBg%AbuচuEGSJm~*/9 cbK?<K> 񲆺ӆF6I{bi^"wpҍ$qo%zsٶζJjB\Q+큨3̱3LIѤ8s#VWvbKm+du\rBKz|>aGXcyxTC6j/~V{_ngx)YAc57+7Zw}#qh+YĹ䄽KT,kH3y4s?ig5~eI<+Id?{} kC 䙜5~@1e;iI?ܛ7QM]ңRHK8N߆w1aDxGCU Timm8m%^MU8Z&X G ۀj<~G60%MHI̽'䠢0 J0b-L~,#*K \&Ebg$\p: ` t `Ega#A'9܋%}Mcy؛ۉ&%./&mAMIVSxuʙ&RȾo^,5|FED<'if@I^  1lDIviVlw6R uf9-lF+&"S)%Gtt2H(,?15Xv/GQQs.I}bgXY@EowQ{`s51)yُ_;U,gH*9r:,9Nm C/:/۟ ?qs^r,5~%auۨm(g[#J |6_6e9W[')S8j۫[\ukh=ԎB7ϞHCӨL `V ]bT F=&/J}R{bwyߓ+`xͲgbPVT^߿wN~mdf6t4Tf‚≴p@;$|B}7 VGg&ٌM;J%DAX.qߺ-~_IfA('3z֩ H+ԩz]Z(fݻ6>R#Ș S@մ|0LeQ< NS߇)rB4j[Twp(qWYz0`hWϧA.d]JKlw( .>OL¬ vPDD0W @2v}^p*[Ήqnp]q: مGfcl8dWB|C#A?GvO'lwz p^JI \Z`ozPԖ3RjQ|BDɊNo;}~'NQЋ_ GSnK %X]ʞ0+k(W25!TY "=?v:]:_bיci4&5,YIw}` J3$g.Pm=rڐwl3g Y9&TYҫӡ6žTz<{0ѣP B{@1(`x@óӉ(玗e[X& l samL)pU^/l=H>o w9`ʳ=|Ճ++,mz ۯ: EӌK&KLsU{QGu3i Y^N֊ @|A9 _^EZ:A*{/lC HJ RWqrE'֟[/tHϲdwB~WޔxN[D*]d,+XkCV@]\:\׹ Z EfWW^WJr0c`q( XQsG @*,*-rCP>PSw[eRh1Vp+O~F;@:6"7:]¹Hޗw*Y#~wT57ђRj}h8 @_oWɖ#ͤ͆eFWK2)2>|8LeQ+˪NNu*fޏad6kFT<҆kh؟-NHNK%'V7f۝]n>rns*N6}ÔBU#TD;`)I (fD#tO;n}aqWb8r@g^[G9'BB|)(!;yA|_4j=Sud4^|-+X8p4=c$,֟_@i=Bz iȎs_SggPt"8Dvc HɻWg^i}6z u uEhW#NK%r24ԙ7CrRN,eδQ޶d[lBl߁!{ᱠˌW!Z2z=]}4i2a;J[4 Q/@fd]fiqw;>IQ%Xa2k 'PUqu^rIc/'iJ=%C:AvJafv̈́1E".y}w]_ ŏNj/<_7\mEdH/`D.BBd„ADO|M@77akgtdd6g45tdd^{F?NI>Ac.eCK+=aKBZ)@P$XUU 5 ]/^a'XGTE=Ɣ]ٕ;x ?|;Vu2eԵPZkg&2 'if @mZNr7j]*wќ]M'}J{Z\#[Gz-2 $'D[ٽ ӄ:MLB0;U]!KEH[O~an1JLI= O`^P{6;h y(ιdo0ȷ҆d|ZNa;[}7]Gs(. E^+=.͞A7\ط]m Ogކ sKkivM*"3,K_X!.*uE{={a-1(aVߙߕ#[3 t©MGLydэi#ɥ#܋{Ú2.K>/?P}5qAn)@k<6FwZh"I{tqmK 39t[]cg#u_8˛#j$6'5JN Ux9#R+ # F,S#T?Vjē$//W9yu^0-&Z ] (9(p*-q:%?(̪JZ_-J?cJ]xֆuȶVBB&&*H/W@ ;H50pPQRf^^B[`sK҂'#\w- n END9 2ti+ɅCfϮ ᎰRxY68 IѥA:lIOP<3B$bTQd _7Ű1pAc05j=yRnc'FG} Ol=Z@N;І@UAz!g T^S3@X`l -hj.++e<M̤=Ja}Cy[O#jKv]y:ʛO"EQFBil+(HUեtΒcjNR)e l=I8e)׹\r݅MdDWྻ-l /%*~[ѿ\ڡ.A/XLܹ. ˏ ClԙItP CWm軭3- j / D׀)N/ԥb,yat04~-Ф1h]zi?Qz PRLK_:J~ک @yqOS_URl8!1a"~:Y(*sz~v~TSuʻ /= %p2 ]iј-8<-SX>M2of?W2BN4f;B/UwP:0sK;(aEԋhPgp_хnhsjp1R J.DV%2 ꩮF}YSh% q[#9&!,mqd^sмGȖ1(&CXf8mT3e8NVSL1-XYZ FY|''-oD 3×"@OkadڢS< II5ҫeh];X)t+ACP} 5C*d)<;2gN v7DΤsW cgnHNս=šΆ~fNuANIGOY+C c\C&E"e)׹me9t|oi֜ $&B>A2DMebb}n UW5*/bv+r>^YiQ#;ݏukogi+?[Aֳ̛dD=}O Q'XL+\y؋~6^BuɭTxX\!n,i M/jhdĪ:iG 3˄kO`t6)˥Q>c,ȠasgrshVMB-L WF;>`FlPF=ǵppهYHGj*P$@azq3E驴{a, r/dWgォT.s,+dTQ]sPĖw䠗Ȓ,qrU&gRZzPPۈ(U^t]0[F~]Cեx_"ΈgPΉ̚` P鵹C([m5 am\oU :Hðf?o .~c)ˀ$ :w=QY-muʄQbՔ?% mlKPI5k2EV]3pT|2z;^BcNUޡ`+mTYYk?})[}Q:RvZl-UfDH 3cE/1ᵳTjK8-v3yaV8&r\u]t6rC 'Lt`yQF 3e𭇠#G%zدM0iL m~ZF~kd~ȮʂMLUS\] Aم:zNZwgv{qK]_G'_>Nʄmt 㹱:$jZrʈ/{dp6v(; x$ #s<$faXJ8ʪJ5lAzAvdGzCüvPZė0t6 uyI$ \pEO(Kz'Ou=v5ȫd6uwJ&Ds:9 xjںpv!PY:BfυYt^N{Bz?X~K+_RI;&BSF){˞{0p-'ېuB.d.]g+4ϥ{?\QBɉzA}b"g]BY*%)6q T) Vz>}⤳¯heRA#δ3aD $ttUK+2R%`?kc`^PpaL/l/Vz (@`Ao9J$Bwti qkmShJ`(&:^-da6o9]L Nڐ梢dOG \F:ٛ|UW"1ʰL95\=Oiic$2R= oyHF U {14gHlP"撫O)@-| qa+$1~*-3s ws%l NC{ޕgZ(բ=h/C8Hϰpl;&sEFjŀ .K @vU)mլ7&/Myބ֘ذ<#Uw%2EId„ uЖd +rۙj.ϨpBʫ%)Z{zO!Z; ̵2aD8 K"`_om7@=7Fx 6KK2&(J.ם.*fgJ'e ȭ,7*'XTMql agCcH0X vRYaNNPM)V1^ 2z::wMҴ%. ‚ykTQwhzc 2zrwG0cy&F_`bTxX_;(Bs|kϑS~24C%$*z N `\E$جʊBpRuI+u5301d`p:SYYW$Bb38*Z]IV!#ϸψݡN5*AFziY保_)w-I/Ks(~ф,*Ky$b"(Lh%(g/g҉>L%/羻LJW5{ؿ_x.unL[C&Աi yZJmHz%<_.0SGcSuͮdG^k9+CE-Ma„G^YV'P|4LM/%e +, 7PuI{^8Ws^ml Il(r^/e[(/3X ~ #BSGt^0唈L 7[+DIQj\PbOɵ!vP^w?%O=CXMn<{5B^@͠_MEU3WjhUN̯eɄ: kGEdK7_=VtU4H!+z\(@5Vb;ګ7 GW~&c fws"c*W宫+T]rDD<NJ[mbQQζKG[ 2p? e@ , Ku{j1Nys:s~rd׷37%?C&LqY.q)CznٲD/YOZ}u旝wYlͻTp1 CAF-@5l{,3ۯG^i..@aZ%?nW)?&LyZ]TlRtՃi}hŒ?D%>IֆFJK=MMPX {&L'5#!wehogVJ46il.6$@I7R~  H/;-2(\/l 9.`eéX]β``'_^Fyk=vrT$M(ԞXqG=k ;i#hzit%=iiSz(Y= Fz!qXvjZ>rȪ Jp 5/HH6#Σ19_wNcKљw_}W \GX> uZLvlVnߢv@︮n^b\1k;BmWd_ĔZPm {(1sgZTYH% p>B動eӕSVRQw>J>W9>vI݀]WLY>j[RU&\0*3֝ 0Vxpw\qhCά? '2#ȏ_$>^rxr 2G!H6U"J=+P⌨KH/vPZNޯvq>D|$gMcׂG^U4/&JWvzeFdqpTixs$Xh+uЯ_{ã?7xb~Rf~vj; +se0aB+_}Y^sꝣ4;IɞzN+Ò k|L0a"6 /1|SIQ1L%a477&_rj#f%AϜ#V'xn (CCn4tŃrm[\tFR ?)T >NNUӌv1,xOr@lu+I.# %vf %K]7PX _P_V! KSpd@ Ōv)BFzR}ߕjw-6ٚ_V~-Juֆ'&u)@H! n ʚ3{M#`^g;W:+73)8Ć=uU!񎼿!+u۞q)I$h1 Ap/s38*Z5M1mR⨽J*; a%^u -Ǭ Ԑ̴=c$m}~.2: v(~_L6۪{ECASL0XrBG}ďnX%Je&FDѐK(՟-{v+AdL{d,K#K})L}M&{P^LrA!/,vȅ0 MP{ ^RD'Uqٿե ܱS4ըߣX{53WEZ\B6fS vy7:H/j/ r>PA-&8eiB4%{\PIS=3쉣`w)]QN{b+".⼯x3P3^kCBWXTjb [!*|&1Z sw7yI/wN1Τ7K=&dQ_26 A >=U>ﮝG(@>ݹ^@d(1[b|j+ ע'%Tc-egp5eE"B|@}Oҍu&LP~h*-zpE}9!j;D9ޑ `@eCT /59[C^V;CF ]T0H6U&L/XDT^lmm1T^Dd$Sf嵻#õ%pDV h`]|-8X⇏e>fyf!3”nA?d_X>IìU/9/qGSI5 0#?Kܿa4rtP1.lP$տ :=1;aVUXq3;vNk-ON ~}TY#UD+[k$Z#z g4z=L|Kdr:EZ4[MvyՌ!םp%gR򷮧.Eԋ 6d`?JN Fv9%%u<4*R4ԩv)د];~婕v^:Ι:Iiքlu 8Bf.rH׫9CɿK]YSc7%?c6dLZZU{uǿ*X&|vq% +^%u&bgNo~-Dg„ -4P[F/~D]w,qxQh`mX\NV~m`}L_&L†k Q°koPyM=> 0Qe L W(])y"b$K&٥硈=K<6bA!^e)c/e<]1r<ŀ}H@ h:}YFEaïKlIpD|@v%IvYVbbYFz Cmg(@ `_! k^2,ߐ%V6(cdO }znj_װ!Ŷb]Iv a`W9r֕ .ZH6lɾTt7ތ@RՇʂPKO?[z'0ʖ9[Bytjmvu(n5>VTxvՋڒ!;E&pFnp9DI.Nȷ?飦2#@u Q ZT#ĴT] .5K*Kk}w(\: ɷ+%.ˡ-`^&L=;_ᇹ!~ATbe(Ы|WyӚ0 0W;"vP:$[&24U)'^Pi[:uTX /&L†xm/8^*fcY#43(*ekK  \[ױ20)vƽ](Y€[ȔK2U/_F/VO‹{t]tÿayGGiS_VĈ~̮$Pv? |%{k_V _ZJ?o'\Ͷc !xֆT^< dRy!LD@ְ; Wv ^'sPәTc`Ƥ/^eΐ}1uÓ-Qw:Ԇ ]tQgH#[|0RS (n 2+T]JzYy)K|dXfMc\edMhQn/?*ϴc$Ti/," #H/=6r[C X@b,Q nDwC6ϊ*m>] X/ E+ʡ*/3nWxO7 &LVUL'Opm-͆ˍ倉U^u]tYUȮMo1K 6H/bh<=deC;`*g[KpFɩC[]: O{=T k{dmkaE{YAv>]e??SXUP+Jd=RK}ƋT 5aV69BXta&eQMYKX^5aqsg^=B(c;Ptgg2ҫ2- FH/xkS>zoSrBeT%.S,WS{z*'3+ Dm^~]Z}š U,xCo.yW*A#CX#X e8%HAsgS@8\jL0 MT%^1q~Syf{*Uob:sq^˄ ለp:vvf(YSyonj2\fL\<՝ j@53w}^NMalH?KCYg2 .Q"\«rz Ī/:{ {uHNeI /ȤQ δ3."/f@:TZ7k=y:}yK a$;-}-xs&jO e ]q~\iDܡl@_61~y^ŎGӒpߦ34o(*M i(g ^%%"ƺe`#Ih ( _qXJrv*di$7s8!rttK ΐݓey~{sKCތԼ(@*{:+w[.6xҪЪuߠE,gxa{E4 .G|º%ۨ+OX'<9e}#19W3H,jy\oLk{qUw3KG^'Ɠ [ǷKN6Ab|zwwhַ%yٳWRdb˞yQTw%VT ™0p[3ϲtbӣZ +(?sLWگGu쿹Te Z3L0k r:,^륅Dl T\9&[z.e d3a(ѰcJy`nAL.9ٵaQE P DG[v9!`cF`ad N& eJA?H /( ǎ[(Sl] OW 2^ @x}=6*EYljm:*p'[g,ck[3v *ο>7B}P*/\[X$t6L:MRUgjϾ^ڨ\CAHovu9%p=j^<#L> &Abum2"BFgVZIYYN0Lq92LQ#Yx$~69u7+H/IMJ窩xEId0` sT^GiFZ (ZȂ:x;T^]*jeP䖗m^&L?Xd䶆2GVVU޿1;{H0, Oo~|EYUn"]D-E@5uWdWwZ}v@xO&6ZNJjWt'^`Pyqӽv'\HvAl.'kiöS*ֆPPy}$ŷDI.ll5r#?Glɢ&GЙa7rDv YA$eVd7GfʼEb9l++^< &ODW )')>[D7{e-=^#E(@R =_Ix u^=3b &~+NK2+7fNGl ֆCE- П 6+KP$l0zΙtW'?O ŹGu}A[oCn)?QT* ZĽ8VdwiTH'>8I/&Lh $$m߲VުwK{Ӥ HIџAoDޯkOjPl WT%O71&L%vBrWZtP !62^Pz5t_l3.Kgy v5@92 ye~t/ABr55ZCv_i-蝐[[2x,- p4fv+3C&'ƌ4z)%H ͭȹ:FvDDEӯmu.36q%ӭe$ WO wNz0=AG]tYR";}no {37ņ3V0/jty{ˌ0͵ cz eGs_z ;.tNT3"aEM˩(ԡ#J'F#ϥ 3,P{8CDCq].ܓD.~O?oOǥCN0L=/W;B.{tWX5,#j"}Pfהs3+YeubC rA64$$dp~|=.scӕJ7Su/K%ӝ7ھYF^?:dQXJ~?df^BBB^ԝ_ḼRRl[F@. qxC%taѹ .. gz+PeFW2Oap+oh>eL:juЏRD2bB\Ƥ13C}&TuckA(gzԕAofӭ) r/n:@z{ͼähCί~g䋫s.J!0]^r!_M'7[&# Is)m%T;5̴"(9YE+ReP˦'Wu4ױC)|:txw+j ך%ɍ3T/Q/͚!? i_Uvaϭh7*Apx ŪbxIu:qx!)>!e̜tQHo`?n%5xn'j?kw*wy-'bj=m=a!֩~?0@U='M.KIte:jm;v*NC\9VzObmHqXC(>9p8Kk^rk t% x;v P{n&e\^߼|J 9ZK[K2eEH ^wPk7\վg#Z{߇gվ~a:6uN%xއ#wKoo^ݕyqks=^tgiK:~0WmhtVzq]d8>o=4i= l^id4#Pqe&PNqhYc^s@=-OZqCzvo(t/RԜYv#/Zh٪jJ ھيhU۩G~yW %$$Ņ֗^WrpZ+QgZY#T ysacÞfg~6 lt\(CI%(wxWsKx)  ON%jvAXJuS}#st2@r-! + 全p\^иluuxi֞YOfc]",\E| Lqt2Uriu'jx%iCopxFׄq2Ӕ :ųl3|Ki*N=/+biLgmLf;"҅^Ige=DrPЎKƉS W'vbz) oHz :M"i+d}Cc(+A]3R^-[kye7ybY7pr H|8F01=*)Ρuo?Hom*+?\ޮ4|KIۏ=|17ʼn/+=VdfE-/--[JMm}ejpw Ųbz:¹BhdȢJmUw cj|5)mڗϚaJND@jkS:M\rɝ4: r=^¸w^ ګ/_K YtA]eQ+t}nR]s?,C|a@״#`%Ps ?Mw? sՠah\:{DSpJK].='.9r) I o8n֌.@Zy@ xtKdpyzxqhqƴDa%rQk_oPHst*=b0\xHK,fl.gn=%G#pzqB>͢@td4zVHv`ҼIlqx&)['tc8}{HMG:kH -+)W2l6!:2*q,־1 wm,|=k=_'A'~Al3\ )tko43*ŴwC;o,$ajjjmN~ kj;RswA%x ŮbeWgN@ vzSu@iudRVcKԼ{4vj޵ ` WM,j;~mުz#^/C-.tp}JںаqI]e2fz5  NZJcJ?鋦grag{_~]q ~r5TwY'v~J'n?'t]56SH5ͦz zee҃iNI?yyʹˎ`$-ĕ*ے&ӕ #5CJɏ}MGlau@ -Me.=Ʀ0 '~1u/j]lj1#܋t]"PWͭ&jvpWZmOj=Z,șϼ&"C\PW/7k2>{OuekWǩjB|OAS簺\jZbsvs*LЛy9V[ҭk&_%  7W{ؠI(is(/4u\a_Bm@ 8'D& CfjvE'A#5Rc23d "B/@G|P6PCt`˙?ϥUu/lYI:5y^$tr+t^=k,%gы-a,-oQK(VoN3MЦtL฼h٪{ZHۿWhxsKտcE.!!XW|. [@'KeC譔TLy2 (ιm>7d"st!0\ k,"fap4UPp u#p&w֧|! Ie冎b^'ϧof:+= $#pbS#^\3N7dB8b2hhO]a㦝fn!nlB6;]j,/~E+~'mF[w;1fo)A ursqy2Wwk#eje+\g]*ь8al LG|6E'/ Z5p\w?;%!`K̒B "jv_ #:\IWe8gXME[7+RL0]N\[w48c 1z8UI)"8 {D_KY*PJ=^1mvݞt֎M+858xImיcRV[DY$mӕ-hOr;5,58v23/8fC6udmf n'~J?Lp !P(gѲWw2 um;OF(fnL0,mn.+kp .̂Y4niAa/K3uz?/?ʊUtx!S467}prᨣsaH>33P͚; ~|e@?!L gtӭsF7:(;N~ uu!}aE]d5 @9.5F_o3JK1oM`Ut2eIa Ãi |# Ip!>z7ͼp'`T\Ff%zGP2G;K)ŬiPH /8J%[; r~P͎i9bw78ԲS_9N߱w"ڴ_[֞绨wLU똮zFF*8Kà^\Zw^uQ FRK8W^< |wo}U*6i*bu0Hg'!}\!N'䈻M5iEJ?ί hSJ)z&u|f[(wiD `@ӄ^yr{1Y zE50lKk<^^1Z]:Rײ?'3LKJ?9"6R`Xw} ;ߚ^V`u2[w5eocq~.R5RXD7X[l~5bx%g2uw:'dF:^L6dkn7PsK^*DHj 0ݗ_+Dff.jBEcHchEٚ g䚔@3/ kr؅ \-PJ:sp^ޡ`I\pnE"ptd7?Z5Ӣ8uR+Vvٳ2חUIPut71;Bw0mf/J.`:pW; b5#VХ|ҿar.vLL!)0 ߓ&2I6B }ǩh#|a[8н(p#Jl- fսkFZKB]AD(edѐN=} WA/-=<:FJ8='ZLSR7~jEe1~oRT("JھJ!˻X_2KݵBc ?UECpx]^:@'2ZFcYYmڱ!_/U o$^U}Nڝ-ixg&g]`ȣ1Wc:q=gy mG ; |j't,W =th}8qz[D,eWk|FNG5 2.YηϹUkzM\ۉ*V|\>c2RWrhx ˎ3}Aysy|#w*PI埮᥌4Ԏ`=^lWcYBDmi3nr!*#s,:UQZ0piSL;q 2⊊ۋHe.PE|1z>q\MKEl!MWM97 廂}U5TfOϐM{/j3{d8wR}WԻ}gHC!!A^pxNjx)kd-Y(Ӊ5LBm쩗3aPczqy#}ɾh6#IB5vg(](Y ArxC t@$-IunOKCsJif|jhjT5'Ȥd~hX:)G$"Q1OO8ܡ4e(vݴ7OdKue9p^j=>jU[ 7Mg ,8s}!qcI5ohZlg&Wk ㅽӳ1҇hVz|wIy.^! 3'd;M*/ǥiH#:Y^ȕ9B!^"y5S@n[FuL+^qDч^Vw(]:lOD@L;EVKcJSb fz\o~?&PCe ==B # %!0^{s~B S R1$$$}Ya!wb/?HMn/'v9,LicFNd _'֭ 'W0-;!Gs-ysFضpvQvIQ҂Y2 vAsn:l6[MϮ:%Fq:kZzO>ѣ hhbohR4UZf6 x#UNeha95G a8sOj|et?I_O9 yfJǯWxgW}/RMJfqVWDz]ƫ:"6`meq\8!ZH/?Aq>ara!om1 XC xD7댶^ 7w?C֊26H`+򃮼Kn`Ls/]BY,Rc27`]Z0 *oxrذ z Z]z;^R|arE&!G 3|_A[jZȋ׃ Ѹ0%mkJ$/ 8Ob #5OqqN6j?;y25$I*#O9 . ԓ-m,߻4c@ ;%O8}Lݩ&1>voi&I>@o{вdrQy4wIOMq9םpϤ{yz?"Uױ}C]<8P{,_Qww %];A( Q!>~MU"WUmOu(@!3oŅ^:Ψ^^sӇɥ2^-[VY941Pu4.w>zkkj\[BH茺`p} 8ehh;ZhպzZ0;BkiG~0"za!|QKHHhh8Bs'G4a8WuSț3l )[" %~(^R뾲y$Ǿejkbrז^.ĖFO$0/ǘC ¼0OP+H dU'%'Ӄi 4 j}]m+YԥpI/9lp* Nx G[s(b 8g.̢n|Ӫjڹ;Ya̛8Glcu pW]]}P]d"ow&xw76Խ M>ZG7m:7_mCC_=xxT;f$iբ3QCkKqf. k_*kޓGMTU'PAXjع.3]W5!`+Wk8e kZŋ3^`+oa/m jUN,;B8_QʚMm8'# <(5?U:^IҼ*⏯l= ʢup:ɿA+ Yn]Ǒ%B }1ZoM)03EƐjx%$$4@x[EJkUEc^͆Sme`لB7,oo /+Ю3<95{pucn[扎y6movE*9yK.&ɥݩZ?x/#q я2N^ \q^EQ* vW`^Z{]SC&_BQ_0t<^MueE꣬cjtI/c.lo.yZijH0nO׾;; nrh慓k` v9r&f}澻y3G˷Pɟ;,h~/׿A;j5 za@[ZˮhCz9sxATm>< p 1] QwrE.*?@4|El!~)y9|aBnvJ HA["kl^ZZf!CmJV@*gJY׋\,n/GM)kCw|\_"0Z},9{GM9O\넄ND=l^iUi%xSOhֽ͓P,jPtS ˊ*{ O{GY\Cgr'Gv\w*&1~3 jUi DIeZphVmy RE;X=9 k:P{N ]wȽs'ENkR__/e9Owm. i /Ph..9` ڮnVW͖C<=Kiʭ糿\<~rW氿wlEf=*`RXˏs?/ SSTя&eIlXFc RּY/$!p[D۾j75 >Da_˩m=D)#֣ Z?:Q-T}\| 0+]VmD!PB=6?ֹ.-eш-GRƌ`|@w99.N}I"kux2h<i2Vo/>W+{-'(WwZ./!ᶊEn!^=R8m!KHHLӠ^4t9éGCWG[eedt`MԒZ2 "2;Q{FNl挈^~uB]󗌊tm\'$껫jI[pL+"GoPejtt#f RkȲ}79{_@TT1~j~1buډ6ni;<%AoH.^ĘSgg*<ܝƈE:]tXľdK+-:?yqw7u_.11MƜs?GYCw]3|>{&wK±wb1̛5y!K {jw!)eszzBN)}}8=ȑ]YOތܰ>Ì Mxs\[Sm?LJˋ{e!jwr=q*NߡF!oVLUm/&-9.&S҂Y טQm/U`^^Ƶ2Y8D1R+^DHN*yT@mժ+-O:^CLHH(J"N6O|y*ְtkk70I-Պ E VhomςR]!)Ŭ j vʛ/䌧sxm5 ?#jE7Tsn/f` ac,.j:]]z8mVwu}:ѱ2Z1nq٬>8k1úbC/Ԛg'õ# ϲ肓 v*.܍!4DN K3&ԝf? $3jpLӋ{fزeVl(;H=eym1ʠ3yfvA59Bw_hWe MIc9MT{A7|;^Yڄ+?WҰ 'sR5.DeL~W+w Yѧ4[Zxx\+<"|~.HH:s]C.&?'VJ~8Y4$*- #H^ m.-ޮ?.̒t`ȞqIo¯EdL[]\V^X@K>^oZ_w. <_~#pZ%$dD=VϕƋ5}4e\2IWtqw2[K8𚛐^ēg?O=nPNJ OH^g 2k4rg۷hj>5cwLHkU~xYR}s'? _qN$w^:K z9bkl5^j 5.g+}U\VNjn!JtЯ (sdؿ3( bY`1ipj ;KC%fQ;&#{@]B>3_ݕw9=a^A i(*&3Wg<+mdeiCw97_p-w>=W6֭.= eep%\^BBƧ&s7(Ayz>QVlU^|2 '|AuN%g2u:, WnC4mXzr$t^%&Q_rtV`XIx:;0M<1=+fV(؅`reu3x# %pÞNdc>;p0]?!ETXC* P[4w3̱p)FI+Ue끺EUwO9rvwJ`<ʠz?᧧ :s\0y J4Q3V ǑT Ntq-.Uq}fBob UzFgzwȋ'wzelaJ~ujk*Mسqw7ǵ)4k :[>iZ;ћzrd=TYCm] xq車~h{"«ٵ8<6js;^ U~$;sElqzVjvXA|_v͇hxʙ.wY _+stzE4" S^CA[4tpjpm"B Y%4FV-hG.y 46(^V"uӊ8/'Q䵽dEfqʹ$<whОƲt1XUG|1ھ(Cb לY3*θ:ghk[;hɭl+CG Li0LHHh)~0.4b pdI xA^It?Gцˏү>mEy({2|45֑AtsbV:e+]8][BkYU0] ݼ#*؅~ D(tÄLG5yuhBbč 8k9 F-/|߸W5ތOrG d&Kuve/yoz\,iV wljunyILHHH(7]N6D ]>5tYOw{2;95Ns2Y!j0=,)S“ē}OǪ6~3HK McQJ%^C㌁aw=~WHM%@;BCGC-:]Gߚn\[ 7хUC!5^~N&ٳIlp']7k49gő#+0?hf@}&nb dK+oig{E]{t̅#ȱ::Z}·ձ}Jc_{EqGٲe^HNj߳߁Ը.,OԮZIe7oߛ#01vE=1mMϽ[NҸ)N߾WǓ_nhnc}뫳OЮ5p'8t"{j%9'A3cQyPmެ6;nzۚxpy}\>Xͻ61%w~{ '8t x08PO]h:m=')÷\0 l4]Ό}o|L|pvuvrBވwU./>".Y_9k9z 顒a8gH&eU#o C/".\dvo8ψ @MCw^e5Jκ/vWNkj ~ 3SN01vF_S"i(t(֝Y1,|`K>_\j{ц&#Ƅ%BD:? xΪOm-`m{C5Z7AcSSpytZ:jc+x&8mww)ab Jpss7<ǗV.JZAa-@Л/#/U͝g<?O FbewOxIPEރ xzfk2LsݷsY^ۧ8x"{N^ph`z'IB$ .>r``+/msCJщݑ7p]xf;/|UkӆbZF8` sh,W}[6P˸ٶ֊R].8x5'?}pWn'o+j4kկ|]m-uJ˨s?|"0sB%奐5iEn?`tC&ul o}TRU$XC&\Z,%3.8êBz{iٛU{4Z0w8}qȡT0-l #Ҏ8$?FFQxqV%[ƨDܡ2XY_ʶJFwW /b9pgM<-.fBgbݙkF/m5%kv:\%Uj^BBBgm܄ ZqQyOggz8' -.;NFMJ}LZQ؀M=PC+U{vUmou9]jsn/fhxz{(ѡn^= viTB|(1]R¶#u 8)-c.}C;u'Um yW5p`geyb$([6]] V?"F'RWONm^)ixqZx_o XcZS.8 kTꦟfCVXna6}пA т!Ǧo_y(i\dSXa S] p7WoIVu .a\W ;| z]x_gr+#)EdjhQ#$"] v&՝p\]o*sxA^a̴?oX#p(NamW7-mmE]Ыgl^puۧ ${ʌ7>c@#7R<{1Ҍ/$b7(3=\ɔFK&17V_%6uuDžk{)÷o=aPb1&ei>}^5;Ժ9tqỆ1hj?A3(Εl `JD@? ?䂻+sB6 '^`3SxE~cpq!rgzg@/?*IRj?׿2f(0"\K>o"0l]/yD-v # ;жBtz=&j}i.bަz!#u0Aee2%ׂySh{G Jz\ήB+\~U++Zܳ & ZXCI-^"7.|Dw0komeO{+ΦOO^<(Cڪ]煨*WS͚bz{;)!̎/-'SFnb7ƕ x]0o0V>&ɣ+BBN=Jw(lgq ki^i":Q{cwkyBoCY v!rZ 5E^m41Mퟀ^lz\+#jurYLVtQOTZ='R۶Nw_o¶Nrxu #wxf }OuN(p0WCzE';w{XC6 _W.Ƨ%89A#ꞿ[®eVgL詖T\[k1R'Wk~sw\6LIFp]WHo7<'Xye/\ N pfTk@mT7R:4 +]ߥ ,DkeԆrZ_tx}PkP/wF@/F 6HBያSE"~b Hj OuXb@pXgXr+og]Ʀ-a1ysaݮN7?Ӥ|Jw:M( <ټM^_kVWsuI] xaV5+ 7-zۿ҃i\]﹙2]iugKsQ)W+xO1D۪7X7;VYcS5ǘEPޖ5pw+fMM)~夸wn￯M}﹩o}wu{;]2cBTR/)vpUJYO kͼ.ږ Xnڣÿr/eO\M4ڣU̱?펹kghvE8kۨVgWlQF]KI̷,ɅXZ)(-^p2U5 ׃OdI}C8OgYy*2 TMcfiLvofLg?$0+*+7LbKsYԡ\gj/WÇ[HH(&5fB!xgEdzT;ohob隡tyUK ($$$v^!P)N2)'/m$O8)EY'e[؀:-^⫒s ./tNZ^R!Í3ZT%T%h-~QFŖݑ`8ê-3[Ywji[;]pv 0ׄ[g b&\l^R&6M̕ԣtZYGO삶wQV@/I/4a̴"E]7*)I >ѾqbKS+MW8jxw`"L=B]b GϭUl6T'8 ? @ wUn׆F:`' tfp]>F7Fk~.=oc(-2(:! %^!{5GBJ}]chz-إJԆ͍ l(vC(.{|xY*VK p*90N?ͪki*k zЋt\Z`s{E0㛙Fo>vt޷ ~)h9&LރWe, 9_廓ZPuٖvr gV@!x3,=۪.Z_ ߔI猈a4*C~BBBOq}b ȁW|Be/@6og2@/@ ./)|j^ P3/p&l^8.d\7nX2mek!Ѷg# @\=VB] ;:YeG8u>a.J'ŕ8c koտC.k>|Fw/sMJB9K7 ! W$Jyye;n\țY@10;>eWcW`5Ꚛ&ZQ+,Pkwq-.GXNpt 蒄}Rq#PbkKkXBOl<M /wj\}x)펶g.ăNf# Q+aUnQ%s8|A/҄^0\_7/Hqa ")&DT6E8Z"@vU,ӄrZ㒅q1i34B~E2ǽq2}׾m-"4\.94ez Ev8:)]_ u7sjZ>"\Z+˯4Mq D<|!Mk8 : ze&OwuDgf~x&9jI Ϋ5[eOI}Iy򿤤XVjHu%`][מshOƫ\alۭ ڀ"nɐ,P悒$Я2 to<,JVVd/9GOm^J>9/3]y@Nu ~XITݎw,?lU!jN!PY վ=jx83Mʶԩׯ’otҳ@7_Pp>Ҩ_/e4۱KV|ͺ_rEi-JڹSnoWX(;M$,_Ncq ֱr*IA-]lfݓ' |ga"5:F//$K٠b3y`{K''Aߦ>eRT*/h+vlZws'Ot2BG_cSt)Yb9T_hqyP*Ԇko:Y#Sn%PvZi2Λ;~8niNv*|l T_`o&h7RQL`֍c.οwnN\qOzgߔg:-f^A¶d0N`zxm3Y-tlwBĦ2wa]z`;ڣx L] D!+s$ѼoOqE C\D~4<0 ^KP@BVn=X.ݛII-8Z15.y&#JQe9%-&dz N9u(TFT^.d(]qHdi(($2FzyFH/1iUV(Zm먕%~.r $ԛoa^Dɦ.2TNe^_$l#Ÿ"0WUy@6e\d^0/9p`rvt/oKNt!qGϼ^ pSBfF8p`a'"K- `~xŴfj,NSd]L.ΰ>w^vwu{tSӉ؎`J#;}=}G'@tڶ|p]yf..^4$X';r@DX%๻gHlB/.jaqW{{dD0p\i8eQӤRv;k:[Q3X<6LtM- 3xQDMĽ9qOl64> o9 MIu'|FS K\,8E\(F1,15DT8qDb+ >նz hpPf+)n&"otuB\KP72(l'wR mڸ*Oî!"M̮kF1Zn+"._( r]De{k2sO,c͛%걅cH[\ mǦNo_;@WT#2 G7.EB!?#4.!ϫ#f=in`KzutdYhNo}<-aLSs ݧ0R?jq s\0{&u9i4k °dXḱ'RyY9TCoo;D#vM&'1KS5`ϟDLTz߻Cbʻ^ 㓂D{(!{( )Cޖ@zal6<4)x+ wa a0DqY]"Gm9ysgAV{tMauŧěn[S~jj ^Mi #qq[XNrlt2=_b.6Kc_HZzZu))v#RYl9*#P$zmCNSojoʝ/'[쭲MU9@NU28uc\b,mflXO?+j,[H^HzE`$.8pp [DކέA)$N4Z<,-o?8.e$יOW1wp' cCSᓐ]+߷Ԍzi۹Vu# sP}`ן+UR) hJFvAՅO3+(~PdDY+C.x:qy%}/k,8]2>\:xW=f_Doݽ0dC΋)_<)e6J@f+ȮFhv< @٭ ,K pw/Mu@-jC߳1B..e 8=#уūO>͟//y뤤PF)#ӱ:SOm 6S+kR[ͩ jiEDó~ӾZ:.r^^;,w21b!,(Ƃ')f-Ɖ4Gg@3=48+deh riW{kTsFWa8(-HV, fx mҭ8Ks+\H(2HzQI/G^8{Б mbMJL"mV9TY7_~%Fq*u"Զ`9;,Eb)ʘ,[VfFzC].RVYyfaF*oWT0Kxs\89K hf(ҊM-#575y|fEE#7$dz7/@=6vR<\3XJY5hB:Uf1%V{RӶu!19F2CD~{KCbDQKN= J2sG(ş-i(cm$N) H{6}=  ӄa㉮j$Яw8|> 業sˆ̥;o>w&8Xa$< n(2+A`F:BO>&#Ti㲆QڛmQxu}/W ˎvRUWU {:{XfF[m=1 +TxM- 50B]RZV Ohu??XS-Tq @ȸ'TWu)M[jڽތ龁}j=}VpPSP+Ѱ9Ê/K)qNvW q_I%V.4: pm F^vv)}Eҫ0P%U'{*O PḴ ++7So$KF^qma"#DQjJ#ƢoIfF%j'zQ,3DLI+QKb9L՘Ն|B種 Lo: o*OyK X"&ӫ/=+C 2kBvʂ~"em7aV[yZ%!J ^8pƄbPIv^u fz'MW/+gTP #&_Y;C]6S adPUd[?2UFHHD=Jˎ#%Mx~=ȭ4:R?#5/VP^&1j0 :~j_\yU=~y5Mjb=}\%O_XXBRELit/?+r hMKW/Egm'.g8ꭕw{yW{cٸ5"l:.Wj|s2p0,0Az!kR??3sΣtmx0^ 4;{ݩ WR_UbJ ^4\ ƑkD6oC :H ^WE_R^[RN_#)q-~iW{Y.r[ZGV.4? vx t1椝]e+唶Wj=jjowrz˪טZ8v,>2YRrkn}[C+ӛ&P98z*]j]vg^XYC},VzTpkSt z{8y5\u/YǕrT^auFҚ#%3Ftϻ)jbNq>_&(=yg!BJjZ эBgHUySs.d݇,bVnA]ݔ覅c;w[{Vczw註@pA۪Y 0itL5T[=lhBBnƮ.z!+]Ji%">,]@Ǎt} voW' Y!& +~ wd$ҩ}'+ij  2zD6Ѻo<f_Ʀ6gdyODbtͳu)%ePtYr@&3{F2)̫L! R&gK&m+&S\f>ԁ`Iy6X42Qo'( l7;%^~E?` #dټO ?eDZ -\ 1ٟ6ӂw`vYZ_9bce?PRU^V OO[^*kz$?NCe!I4OS饦 Q*(={JwG/U R>5x9Q9%K@^z LH WiɎj6{ ݲ:JLeT^Jz]a,^ekeW9t-29a'X9򸢩Wyy^o8p$+«Ϭ 7Q$?#JI^ȈHv9TGt86`TC$gaöu2DخYjMѵ!fPvȞ>ꗹ ^dl_ikI 9)D*\%5 vrkN?uqxi)B 0OwH@ݥw\6:/C䕰R噔?rdDe&zq22ZmZӮ3e *3B)GgC_ńBky\~??sg: s >k WX`qyhٴ^r8p.}i 9wFN38b{Դt L6qL=Muξ:m~6}>f ҂w⥬}\P|Vnht>Jre'tZBIqH( }4|RtV_)`ש@+}[arv?Ȯ#Qp=_tx|QzUtqS;Mmս X.8zQed1]lܰRiqJ5"C 6} 6b\q~YJNH- SbJ?{e9 %``o@ ,m3R^[|N3 ߡv Դ8&=5t Em].l[|م.(ň/[wtwUPt4~Ā#ms̻3a5aD:}.SFLa`;YMl`eׄ}`]=&.tN ]TCwW'udxnY*0JLCfS'RT\&*U.Y uWWj"]iWWz-ҷ)TFt_LjšrKIR>Kg2SFrۓ5QpjS_D{Nt )ƲQ x-3Tzp6+]K teր'˜|7hJ 趛FcCz9yGx͏O Z8KB:r>"5==B[S(1ia{KW Ĥ,t4*S=jIC$ -t?jh2@5wzԚݡT]RȮ?P%tc\ALJMNBkҼ.=/dyM3]tFFvAYcźP :'fH&ׂqLŽUZ +''^Jm2CH㶦kFWL.uhSӜi[ I1GgeVy%B?B-:@=ljL^(,L Eږĵ ws6:Tըx/ Dgx>qMt#D~}T#}i/#@6x/y|% 䛰M ns%qϗn@꩹ ^zhSJ9ljͺ32^_jȝeMSo{ {ƈ10Bz&ǷJ\.YC[ۤݔ80-1xz$ᵫr*OrDK4f#:FA~*䕞bK%"2C2H,#t 4I^){Ŋ2SFrۓw<"p=]Zm$ҶhUY*6۾;1~*3\bf-ehp =g/`(Y^+?}w|~^ePSp?q^ Ϡv77"nEeC})/.Maiqv|mU`Gy!2A ך`+]Zt]Jk=6TTšG.nH/ ("rOJj=7T]Czɳ*ۦ?xuvlk}JB^IŖ܎PhP%%.cFePm]eze_fhPp{ye^W/mQMF-Tr%,8_H-9v߸v5Alqr QJ /ٮ[McͣӲgʼn8pޜ2C6VTт?B=:ˢArJCi) :@n D{? ):NN”0AvʡN;nUf\Ǝ-Ȯ=ǘ2Lȯ@43[C.@hF ]T^U?lOϬKIQQ\u)|BL%tO(I +EUab?{G*p".~x4GRH?[,w\mw3M-Bs?2NvP5OY7vkdE{|:?h@ 6!sp0 M@x,4(i?tޯHxu5Քl yTΦ!n}eš@+T"@j Al}sXS%Cmb D. 1]N\BޒA&Rۿ/LjY@@?# r-3##A.b&oKyHgZ46qqwyne{C_cYzOT@|w*Bնw3dUC)P8FCC1u.N ^Kz /;u\,I #)psv 3x v ʿ$Ҳmϥd)o)V *Lwjo$zxm`lE5ڡe"U3y- 3Gn;U.H.a| ɟbRhfgzHrpdkXlxE=-I3bIz)$j^e۴L7a1QE MAŖFm ZY[ 51dA 6jD,W(oَR9tT$4ҬO^ZO,h`C7zEV%|VbK(3b7ITw8y\Q+'+&̀qfFsDz,C|O%8p[sW5>oH"#Az .U{Ia # ٯ= DXG p];75B^fjy`D`i;B0Jv~-IVtAPg'M==ĕC/_[(B3MdǧmiX]g[k^^q4S鑓w5?N-a%#\B:t'17:E@,U]yhB\.SsiY肊kg)?n j5R6ynOKF-7CP |Ck+>@,HJ->n e%o%L#h٭iH}r}&-Fe=VRS7FZ?DǴG\r:Ik1n [)zI@KۗJzʰHG:0vѪ/:a"ɫO$1iYCx̣ ;- 6 O+~^*YcPeNhYBնKBjFDb ʫFEsEd{rued #u׹fkhGPNF_$"Eh_^qP{:Q̄cS[j$R&d+Ḙ)*e W{ uhY貛2TFc;)Ҧnyu(uZPqtQ[;ocFCl6U9^򻘅D ! fr`<~>VN׹?9ͨ"gB*޿5#!]7@N^a+6_$ IG5pQ4o!+3 *,EZZ饔e'%S0]Mf2J"_h 5ՕBQ[ʷM2cW2S!{RX6 1[DYS Zt0z4W0msg㼭aF%kE Φ.r`NWl5 ͞?]:KM<( $cɁGsPy :6R TTbmtw\|Sl~@E b G(ԩ.'ꔌ R 3|ˏ)JP$@l?e%Gf],f|* BQoEOi6ɥHv%œ릋S"G3_^qc3^*a|oX%m̶O輎K;L^_3VsF3tzl>Fc.en8I{/ ^SYԕY1Ui/mmxN+ ƮOd.'?bDdN> y\0 Nit\#gm!sh_-qGzH,ɣ_.7d>]R y +::CjA<33`g455rThg-3%ԬqJs=wBI9\|! *^IeJHNI4c9܁@2_8 (`^˓7xb+SL=y$eg88ɣI/jeTI/)ۦU*ӂwv*)LѰ/ )H68$P)ڋ}gJ۩&C3ؖurʚ)Ulj]Z)W~zZW ٣B9^M]̚dv[JX9y\1n;3=~RZzFS[8p`kkF\*$~?os 磱rXUE5z i6@p%'A=nܪt0rKLz['Qs \e8A'6? `Ku@{0DߞC5ۀ4z( /@Dy lW&~8dLý[F@u4eyqiys"µ RĈ20kEڃ5Nv^Z)v`\HqpOxmVX xS7.G&Cy%qNӿ]YJGΰcI6@nT\OH+rrB]l%MAKݔ,I ř bV8$׳F)G\ F]5I82 쳾v`_}'5RRfR\^sT%^vB}Km.[6ނT {S¡f2Uƥ3d+C@Nxa`oIs-qf$gW dgxS .8p`{k~|:j5G_YT564" 1):ۨu%|`Bgy712'J/C'W:C1R_L| 3-4p}4k}!˅|cZ 2 Amkز z;+ڄAcF){.]Pv 9K ]r.8ަV6RܾMs)q ɦϙ̫77tw&T\4F*p Y}zt5mi-(&..!X((>pPy=,$dz" e lڔCTqVr5p'l!'3EWQA_>6 {Tj gA p}$ W hu $CRr D0ԠP[Eq9K4 εˉH{\<`)5bK9gFÖ%Eꮬ<ۯ娻 `+F«Wn&zDZow|I~r4y&\:eW{]@uPxo:Fl " \ÈmUH6QnmYhĮШUa9]QXjuԶ/G/]2X&(֙镾 v4<+'koxKdx 9peȮ3BY^7%z{zL Fu 6es,AP AQf/P[+Xx;#p:NB%,sh ?z3aK+(@juɢ3':C\er!K훷C1;/YRn N'n%oZh뢆?o][_X삅SftfqO(P#.3]E; uWO+q2nKD|ݰZwܻ)m$rYE6^v^qEk w͕DG=1o%M(fDQL,ͧ {C_oKUiGw`F:xBPh}^j?o H5;Ml-aXǑ>e~L/j,[a8kp'W3ju1W)bPz6V]@{kdN:P4ohBl N //k.{{ڤ?DG2Azis^:6umgzGUة<١R/Գ)bq(ԯ?dF9 mK"-K^YR-oh%_F0:TS[,azmA7F3[*xV*0% k-&qEy<|7j=tZz&⧃ﻰv BsBBw8MS ,XOi閬 |2,uēv\SBQē^/̝\bsuFNC%FdT`(f|5_6U7+.2zPt؜Pw X.V{Ov=w7 [_HA-Ӽz;.36tԵYH^qM/Zh{TG?AM%mؔLp6'L]+ ܉)m p!݌7cHMo͌zcъӞC'j+#LA4/+;ΛB֙V`C&>Fke9ܞ0Э>Byم:`ul msQw{$z#%{K)~&`e"k^VFI/vpVZ;>9E̫vZ8T"TU`2I02/oeZi_Ze"mrݺebC~i֥Uz#VCގ޺jcӶ.v* /otViŶ?O@蝷nIqEy9y\1'Rz九*8؈ Ib~?*/= 8S{Y1X߼DLQ^'^F+ @"u dB -yĔR8Xf\421|(:AURN1ȭ5ҁϤ1J,dX߈˝BVڰ[.yv[E|HN-$M.-:VL즗OL1 9R\(O '1vr]YJt(XЗχ<*-HRoN\u[ѕ )#j- J5wmd C|-w/O[h{ocCJj.dI\yny" 5Kh$\vxH]{9O|[;"qj9Q+ (A^ bJ=~ꪩz;(c[` yisLPya딩:ϚTw! ^b8s/dy-[#=&k ~^%!LBzlۈ㣔^EZ)TXGkRHUI&YP{Y^F*x9NB%ĝt_Jm3e]s dtlPyZ ]{D%@M K/l9{o.y}.}:γ@sX9y\ <.8ӬX3kC8qʎޘE;/֔e/ahZdJ/o( *A.ɳL"4Qg U)IGH QPa?PH0+=v~v kNOd)s'a3! tJÂJq@[U\ .^t闧#],}>]sC]Td[jD.-_QQA_VuіV9%ǃ/:V[&wv /<*WsJ(6J0u,FvE~I,+m`F{먫͖(x|lM4'1 E-^m4>ϴEեN뱿Dր<ĹR#"F啦ԙ,*☢N*POOiSKHQh9q@56 }D%<3b+a١4C7,iV%3TRwť9s/>+<#x~>rH^(V'WjQxAfj/_htҵ,T$8$mpT\^fIm{)KgG:~ꇬs ulRy3ZZuډʄWqjY絶u96&_G'+6wqE}Jsg -49Mk6!nH ^Ghq兑p3 ik:ze6b(@ 0{e{:LP H,%uom6VA2mkji3L %ۊ5X.9#$*xX~#-#!.N}vuy~j[莛gk_] ߛ@vմdYN#T\ 43tv]ꛣ =_Γ^*|AWUx2"; U.ݖnᰱR(%3Υ`;^Jj.vP[x5AKD)1v߳E&ujP1KX8!U+C2eIE&WBY3^DB|iWq,Y.[r fy"itF5wjZNjIK_4em w'ƞ:+vkNNٟs3+6k m@Yw'w68p%x#填Ý+~a,LUZRbIN@a;: 1Ǔ^U2G]F:)'NOyPia?c|#@ri f7P.qΎ`ELP=*ճӰ%FУVtD"#8i͏ӓeB9zk[Y] #Dvqk+Z,+wM/+dk:>YA Y^|%/Ls]9Jvuvmra7Yzpj'?syd26tuJ73?\?!%50K+f}#s!م.B RX6]cRݦgl!k"F }GGJ YůຯF_jd{]2 0A|odzi(/8A#I - ΀u-%gկRݧ,)\ wq Ɍf:WtVSw;946E>+ Nc [.(-t]Z(!n{l;vrlDŽIax}:IhHyy'z"mjY>Nce+k[.yf3X&bNh7+ڶ^ $ꒂ'], C1KO?q évzHݜU/K3\,+3gzbY-]Tw߶luL奅:-l}!,T^3〱d Y z\qTzJN.a1h%OK B= TH,U#CJ&=fP<FPtm^}TtQ\_Py\ 2xrˆa~qL{T:H{ϝkWHwr7 ij%FCBٵ7v&mM7 -.k;M!H3Hwr^CJ۟,Q]@p|oHr9FC\fog(\.7O@z[B++pn<_βԌf 2΁75ӭ eiŹ WgU"Po/#V>w|Jrw2BWE&v_ܿˢ']SV %bP=-pF&0cYr ė@~dV cz; Nl^ސBS k+oN!#Y#{6(Fؾ[CjJzHKZI2L0^*H/NxXGNU#*Nym#ಀBG6)Fh7X+䗑ztYn3Nd)ug۴ډOYFU[O?U&󐰥=J &:±:gI!йuz}ɺT6 JT^M3XȮ6Y>ktUcր 亻h\f (ƔfBGgL\#ZN}G~!{+1C': .~Ek.l%c4@r(@@EU-;8(SMIi/~f DO?HO7pgmG).i_^q|΃cDB'EI$Q/3 c$l>5{װWSskd2$mx rdse@l`0m-F۾S{Ҧ^EEc$SpeKI-+7't2ҋ.QT^P8%NoDjM8Pmd2?IL%4'3NrӞT7=fCsVuTٕbG?Gn|<͜,l5 9]ɑ߇PZq5h?SM/xU] DWY'xfdj<,AxAB+/&V{Dmgzh8D~fRJ>J.Cы|^Y?m ְ/4lo2;9^?d^Ww^+TGr+C]Fsgnͱ*qEy:w,=gd5wՁ]h; <-[| Csca {Y"rP&\WG(̌l:;(]jc'ۿ9H.Bu4F!k"E;3 tޣ3Z1e3M n8rexx;JhieDC_QWIY.9` Λy=jنkasL `3fuV2`ׁX.Z詫_})2B&H$Jz:} ߠ{ gyմl.aهL 3T >l1$&]a% 476$ =Sנ ٳz~kB6͋ҪYZG I7t="Vx) (qʋtʨ?ZѮ#mVr xCn!bMz+3PRxUhUN9AY_N:"$mW!T3-rWhr/3e'(<#9_d`Ӛo(ˎ.:Q`j)W$&OgֆU sgP-3If樷c}$ϝcqK7j~˯:~I]t˿D "U`' HAdK&!lW3@g@{udӷ'}Z ʳGlS]"희\ P*mhfsGXeO!WM3mmUB^W5˱ Ŋd&INOiéFilg [@4~*)j~nBF'J]#dW_ jg!r/f-{>e>e\vP3%7^IO>&U82 ^: Ӳ4gOU/gQޙ{GR @aRg%I?dguo9.?:S)u,/}18!/R gܟtF|G]Bq61 Ϗ>Kܰ9 <`aX0R=[kO+dwqHx~ZHX׶K/W_F]文H ^:^Q+Ұd'$I1nR%6r;T(qj/ Dj)L)l$TP(XF۪ۢ14W6ҫS}3e֩>eG{R]DwQݯy<-p.( )d\*szk m7{XuDPxEd mk& /5Œ5$} XX_!K5J=WɿRdbD3]N_,iԧR|KY]vtu:Mdr29^dX#+\l{(2 }"51xy\pnGqj:gH;+xܟx>Otwg﫻8db;T^˻4Bg{,P_ٱTc͕:p͌ȇ j*XZ)g I.r^ʔ,k::UU `m:kvW['VM<<(@va$d\&(J~td4MvדWZiI s Zr8~m¿?QKVmb1e@)u:EJ.jKM F J/qyrqV*i_*4ƈc1vhE,I!˪š"̈K2RIԳCT9ŗ6ڑkBYCљo٪dN˂Ku=uIc50^;kef$7@-@|*+?FO9~X2kP8y\9C8py\׍ Y! ѿ-[Nlcm_=.qv3;s N}GFz 9`=%ux‹#:$9nm6k3m?vEb C`AR-KOr}o*QcqϗjDא-\>YЁ9 "@Nu2Js:wS%ujm*h0ym nkrQR:q$Wq^է gą@/'#M;ށBWd́0:5^fĔZt4eR qimHAv LʹпJk 3뱿'D֧WN9SF9sTgg Iu;xW:ei2t֌,) {}x,hHPf~K:Odv0H 5 Fà>z F `gau eeb|9P8(x:|t豈\dʞGm@u٣ (@v%>5:4"˫l#6yW#R*4AjIC饽v*zټm)²&C!)X<-O^l +*C]gRG\D Ad%[ZV}:u5TF]몭ۥk^WiF/JJehCqE;y\1Ǫ0F7WQdy .Hk'awVoq7Sfi!x Hui:觔B 0sP`c~@p6c?ILU3^XvZ:" M::6 `4~y(v !+$ ~_-i}&DJiyˠBm7ʌF4]x!xp#Y.\ZF$nH哫^U :c;D7<P☃TO kA7'FF\Z7v1ݱqKK/._^;Zmj'g~A ۯUh酪SFϹ$Zr4z֊r'-LA _r7uGZ/-4Ԗw,ZJNIv0kP{ĂI x{@z%dZZ V(B|_6P >0$u,ua yE@Dc #[ss^W4/_uh&4H.|0՜ d(@I7R-B٥ ;jeZBfI芖"2EKq[TTWVֲr,ftlPyvn4AjK[y4ȯI3<쏓un@QIܟsXYYJ ҭȐ=^gd /{oRK^Vj%,ͭg(.d*|juUwQ!Z[ƨ#L#KWPeCBH*H@~A62@x%+C\-X^Flu{i[JĜn *} v@_&_뽰 0'!"L_m1ڇ+0`ġW:,GPw]x{8Tm`<쏙5@g BQھaۋ^K~Gͬ '~y1n„ m =e%.ӭ|0ez /+LuY՝p(暰2bb3rҋ,x*b4rVlףfSՔd2X$@玴t~ 2_299:10}HH}CӃI}Ɖ.H/[]4Q3|)k "H,w}%+'#H}_vR{,X:[I|CBz{sk-7f೉@F1V{̩vV0Njq 2^mf,l-;Kš@p(dviVZrDa͡^pX_j} C6ɗCiy$8}/[ќ.K /J"~=й^È y6ib:yU!%`csҚ}"P6t5Ky\qH#VT^tU$L0a\7vg!a?`‹SBy8ك)M}n7b؀sTTb+i-:"@pًdz/)|QVף8^D.=~qyJH&U ]կX E-)=HmT]\';-hG׎Ry~bmSv𚋢"q-)6Wbcý[i8> +Ą8 }ڤ^!>~r XUG}vK " Z oy6CWϲWmk 2G #YYWl,SXpbCK;Xju*[ԲZ1:6Xbg*f\;|X'ak;ZJ:fsvl#UAVw s#*G|URK&U_"Ѩ_#BKEkM,N˾rehRq?#7LD 'ODxVCtZVrq*?ݣI9TxOwz( #"iq#E![6FPRkKSeRk#.Y"N.Kֿ:xKFe3Lg_mQ u!}Lv1wGa5y\a50`zJ^4̾M=̮jS6aĹǺ0=<!Mx[c.@?[W2eQW͍mUcfxYAenZ9׬ 0NJBMT=՟W# 2K⥷_بOm:^T䧶:p jc6cOu=LUV fxT'R.<17&QxD D bgJVfXl-Q!{sʼ0!#Y<$"XNcd6[ DSܛ7-Վo>>s7+/ME5S8 (Ud,?FPR鵾ʪܹ:ܲv!‹Ɨ.x;Gj{G7AxSfE-s:q[|IX("HkK*$-͟Db)grE"Qwm8Ƣ[+ll=uꌔjݍ\ZR)Ha^홈(0"T~X!yOhZqm*ۖQ'"iTh)eqmeICeuZ!rKks(#da_rF s4h_}/di ^=h-^Nx rSuWSseqz cq #\\BRl ܄s .Ftf0Op~\kFN5+VjONj#Rp5ۏcAVbPg Ɯ[ֆXOHW ]bJBO A/lfdmXYϛ T:qnrK *wa]_Ȯ,QKv"fWػnkֱ^$CU >%!eYE\%RwI`\`I$' "dW".9֘X{4#w]N 7ZDY!R^Ps@Vp;۠\ Sn6;_X.2~fŨE2zEu^Jl,%P^`Y:9F$Y "/חEa<Jޓ;^3]&"c/£/k^KKKPF#P[8h^šrˣ%_F%KܟRVes(_|$mU`P?rRޗ>Bdy1׆NPj ؊T4pSsԔYd{Xq@|A_nqmQ<_P"W{Me9 "liER<aOx}'6UBxQyYт=%&w\w6l?Os @/˄Cf(ߢv:HwQa 3uz*IY3GF0φ/墕26?cHdS`OJ3BZr"vޅcۓ#Q.)XZ'P70=Q' /Vy>ùg@1rvB\sHv2X 6;u{)\aga;LWƈ6:YҺ #,ux"!DD*LL$u8+\Xum9&r@|N"r/f~(ʋ}qi)Lz!HEE1J:1qšDh*2f{ E,-6FF|E$+TCx^L.y\$4)[vjTKkQz͚V,Ǖuy]d8kdq}fWmqm}h-Z<̎E׏'O~lyAn9)w7]2F`54FZ$K mڒ”Ti B %+nGI&R!u`#GwSNי)-o-C/2ɕe ."(Ы\x^'%ez1Vl]da(]-w?Oe%*n˘RUIТqIDObJO)" Rj7[ɷ9tˣ-&pVGV4 a|L#+[NX|ǎZxl-m c3T~m\DaV1biX!uؼۑ6qjЍF]`صdS48R6,-WjO;rDxvwps /RQx ~!5۪*B֐rm Tp$m^NGO}[گj'Naj|x5h>HKޗ>u[OA/ˈedyz9˫S9z-Q:8ʬc_ tl7~+uiwCcȮڃlE`ԇ2mbSrԲ,}%"Sڈn΅j6!/+P#dvyrB'O(iZZE7n_:H+]^u%xPPhmcGh$+$L6ӗZA}یߨWs+ߌҽ_fWt շ}PkQRyi^[L˄ 袬.3+HXw(T^bj0I<%"oH\ܷNsfc]E C &!27&H5kd] , Gd]Ade8.E31D*f.-%rd)rM ˨ӣ!۹U3kI "\Ec RlAM婳vmkB*OIAp s>+"C  L]jY&xzt &Ǟcf`nGHI8HtzFv"l ~WF]5e}BvE D<D$]L¤7?A/W=Tw */9* ׾PR[JL0sto 8TW! jPOV0{BQo-kĦjj;6nۏ.B(/rDxzh[jY+4aU>Q [{16xc3Uzl@4?닎aI!8ٌSb`c]x,$ qRjgLܡA-Y-L@{F B85"g%Zkշ 9R CEWz/R8U uGÚ^ Ϧ3Y " 'kd)SxeJ,D:V︨躠/gf0З'PYU'e~Sp*+'.z06WLD )SOb L/DԼN=s6G=?Y.c)҆yڙQʈ916}K Yzgm^3d گ&X SٜGc9زF$NLYjDt,d5ҹHpǏ5 }DD@)k@,#Y_} E[ý-PR#s[n2⾌f{irIJtDW^<"KW{hAٮ?ȯ`H04"<|@_ +ڈ 'MbL]0<.3+c 볼c47̮jB܄Az:3aZ^rxŏP8dEy_-<$ҋ6;Jf:_KẕǞVD) wcF])HG)VPP2h޸DgH&YxwGKNt1L/]EYXRqEϿ*i̲yuX9Z#4wn)s4^6}"=+=ҡzA*ĥ6LvY5ޕHYMZʿ` !R )J2FEB;{Ԭdu L-C^4MkSRZO}d5&JY^Dv=Fz/'Rx~`6YB[Bxu뛏pU^dkGלF¿<kI0 %KePӄ,xKE`9)gdԢ)hIsm3Ry|a-8Ȳx=:`{yo݉x+^=?C*F͊V'0"h{Dԭt2R['d˽#2(#)bqm>:]:j>fȮG2[FZO\",Nxֆӌ"҂?d H#b OdxƤe!U> qԤ= ZT^wz?^|{, N%~Me#~bӦ[WX%E8z/wqk l%b]a96ttzϏXSev:%:2KLٺ>U-E*[i:iY5."B-|' ]s01o>swoIEsN } "~JEٚ#IOD<) )BOꈴKprtnkkK*/1!HPr4(e2IU%nBI+ Qe@K7(oʚ9&$5l ?A*jY+T4@T0 \ =UzCiss8W8؃@j4ʝz#Rx_:gBg+j5Ll n<&LtQFWQUy0&%B5ر'!W8,tJ K 3pu2[0"/Vsp3yPqW\"-el D`{(@-C$,. _`XڙҀT^. /^򵒈٪s31.1@Dd܄nX,0Rt *0"zeAb"#ƌB""QJ Sm͵"HIFcLQ#lin&ҖUOǞugz8c@PA=i41O}28U2 V99L(d 2w〼}$.:'Wd$%kt&~ͱl;EJOKW0>'7&#ň*>zְ8yQr`",.]Dx)m%dX(/j/کx_NE75+C=mS6 j0 ,Ew'_uzk҄8pwhǕxWROL¾=Vdˆ8YQU5a, 'mL˄3vc$d~\"׆1wFJIKoN^>:ˏ;zV]XでKPyɕ zа{o*RBq#Ǿ_b DqA^6JzAXR!%ނƓ; V5%] C-l/gO?k<%1pU'>9&(lU5v3J?]5>ۓFܒ{\ciidKahrY(QA][o32^ܿ'V-=/{s3SHDP{H%^_ʖ8Ɗ+,qz$b9bDꐔms3Zpw1˹b"(P?W-9T%RLLGo{TT4 `ȳ5z霼Xb`Zm,Rk~gw)ڧ\+Ñ?$DH%Q[ uW`[C*pm :zm 9RN̮1j/̮Ple#_J$V(Wdx!<"(P.%X8Y^PYF 7ǁdfN+ԱUa>}y\۾7+^(0/MW9]sӾp`@9^:jPԞs\10(˫š"TK%z[>QED):% m%6q9}!".cO$j{TfIj")~)kT";C*:HYMu Z jlҙ}@bs!)NLdpB;>\:J{Voc$%!u\  'Dp| W-ղ3#9o/޹+KHNDT|SAl9o?Wb(${"ɼyEx| ̜װh.۰kU4^lN+Zf^&L'(˫Ê 3cօ!v`E[í\?ˢ'sK7^jj/]aP֖es3ߋ_ /Q[V[@Tև7!ӧV.+=}lִ(QCI%ZX5i]UJqE}Ӫ6s0+xu#d>2aDa̾0e@ T׵pZUaB]Wq 3EEv`ġZU|ek$YY-F :8CG+%^c} ;~1IX,SK&+fAyFr pMxH)*>GYq8Rviq%ɚm{ /i΄>+⺺щ{.d"*dd/2{KPEUG#WH|lރ]ݾ-2VD^;ջꬤ O~DR=dFqAj$#?e`X 4> ^.#DMSi1WQakEDv=A7ddODi(bIEj߾;ʐT]h^_^_ppzp XP %!^) KLFH+[]!°9 'Kh_! Ч[/Щ/*&[* T[v(u^mmjDzj$.oy\|Um4g1g`{޴k„ }|[t`N` `⳰઱A3P4Dwߤhoev% /Ɗ5{X),ܰM뱡,$F(MOMʤg*v+8mT`ͦ!3*!YH#`oT%hy"ny/!?G ._^K86$t?/Άtvu!%ͭ{r_goo ~R_nǺ{Pjan}:HfG+J8d` >E@ Dۨ߯jjvvɯ3GC U58 ر {Ϛp>ڱvYxg5~-1@$GİcH$kϾpCG?0;teu~T.`H~y4Z *|h@PvWdgJ\% DlR X.Š2҃.@K51;Q~xe_W &R5\ + Azj 3`喌T{gbCѥP ք_(|3Lq<_Z9Dˆdty6Hq׭6SO+3y]EV>>V/HR!3tiU11oX"9^&LȲ.3kp~[lrʋHZddϋ"-G 1 NJy g+6 n$5¤;.,+ uUH36)v:HA1$djZYѶq&ڽ) qϳSpc%' eb:)"".A_3;˪d}Ȳd)֎'a߮W1zɔ[F@$F'>YdYA.]"#QÞ^OaC\2y@!Jd{|ȯ.SaE)=7" —3#UѯgwSt9ADެ+-TKCdH;F^y#˹H`-S~S71ٍjS߿IߍrV&"&~>>Wv5P<$=A])5^d<[CڭN,0"MN2ER"3^ >[Ĵx}0Ρ(U\*41/9피F=!rLuf7u(ȼ7a"J{ wht BR" envX.W^aV^O? XVDI-|p{`w`3EH.>lbEMjką`A 6G~2dHUG22*:XB붭ӭқ?g631ccY^gidEҰ wUvfOa$ľ>Lx}_&5skrb%i|άW B"r}=LE} ons3UPPz';س8ȭ6xǴVFhBDrsgj`Dz:,iNT# :'鳢c|᷂zSy#O }z Jɶ<)}iehbdXT}XV)NTg #1Q{$Fut'!H%&?T#RS P 7+lӧ/(,RsiZb2"beԖN:X\I/kѱµUm ý=jr~#pN̑w18p;fپ6Vپ~X|bRjMËW?%)Yr4ˮL0d7p+MfN Y-ROu%=r {B1"rEPPMo}ԉ"k--aD]"[_ "S*4tbĪ+&l:ƣ[}Qg#]'0jK.hIYFj4><]0{-qr#pv<"uٳ|ى|Rܸ.3Vď%#COvr- DheaYL^Dhőr)5槎{?(Wܳ̿]'T@e=l̐SRD ed_TN ",i.jCs ͕B -ԷΝ>*n@8sd޴S%j`R b[GIrӁ-1xn[ ˋnqEX{,6<'X)}&oZӈKz]?䖒.AV8j/5B(Tb/d4_/|)-RsiZ %osp 01/F>!"e<:\ep}"kO6:Ni nf9?<.Ӫ0j}9I\tovӭL}ɱxXt`Eמ&LdYxV\<&Ry=m҂o_܁5?}}$& Y'^URO?2L-YR7@/qDmd%Ile xaKm u'ۯ63˙s iU{ωS#C-m!*/\ \"M)(kI)]4=$a]?vdVީC|RՁ2=/O5&,ؓS")V=q{I@hX)k"bMKJd=DhYbTs85,Ej(x6`7d!ʱtZq^l/S{:Dh~Kl_H=NOb ׷~^lL0 &L tL ހR~xe`ݑZ@*bbTm74cŒ@a(蒑H\8LM% xO-`Kj/&kT@fm8 QL @ј;> w)wW὏cᅉRʓ)ҟv<ƈP)74-ɢLvMr]Dv=މǓRz=7gmA Y yr[cq{ߑzQllZfd=)Nws yp{gwW arnyEU8`^:@*[ZNJ^;ϯ\Xbasc=2ٟHFaѳذbž%]b5 k_T̺tĢ{ Je!2VUeXk泿>+_bE o 6lWԷbݑv3[J,ԌOA@yJ)q|ubwu]׷!_-1JMfdhLAEm+)> LEuF~԰W y, Um%{~}P^_J^H,1"EhfvѼ{hSRw쩌7BZ9g6Dvi FENf7y0UtjIF.|w0ML&L{H6S^y][fnAʵ*Y8ekx9ȮlZoG\;*"ĖgHW:̼6a((k{NfsfH.XvAkC"Gzf`-&Rj}zad/7ܧ܈mcF@ɪH+%Pv5./ [EpK ‹n8'H1qtg\^D愓$َe;[yG#D2XWsgDֆGDWKw.%c}$1RvQ pz/2ӠdyA1'NyFFhІ/꛳]bBGIEOs{}^Bn02,#,=3 C +2/# iί۶NzlDD"HE-&><ż 11@$PՇh:p{^=IkCb4 YdM̎G8(Dv̚LnVR{qT[\C4d.޲ };4YZ{@;#Li02Aq4K. 1xJLǣz^f3k@mqE}0kovk=p #gפtH=h^1V+EvDz*/&A}.!Ї{rQ`eڐS~j HJ2("t_N`L J j=c^DcQKˈn2u9 "F{lxWu0dRE_  .7>̊d.kALfHvF aLj6Iʪwd=ޱ Y=ݨ?|eIasMQَ|.]Jd>=F.gdY>Gzߡn̾cK{Є ڠeUsd9҉T 'NֆD|^HQ 8<}f)E&k_&gB?؏RASV%2؃J6z@XNB^r7!-9)6; 6䡔#OzB;~0: Oq]3džhxo:V㴯641MRdOH_?#uW˅5[eOq0p۱KQxasZȮI]~$pܿYAj."vw^#VXF {.,P66;{ m|Ǚ9XO;'Ġ A _ }zk!&tyt!u,'#h}DKdEm*o+nO8Hfi/=$֥3B+ 2̣aCHz4LNk_FR%t}}wBID a`|j|}uLDz-~x7CY0aBS&d׻ 헩Axk\w.)F|~H/͆DtŊ4a}O3?-GW =#t(t}S%g ח¦ȧ.߽ /qkFXeİkoGox4{SɊm[#]>cdήn|'!q!XX-ObX ccC ",$`$x<8T9}e'9ZhAw[z3T.Rvu: 7,r:՝6Fr8I؏AwZ^m8UZF,Y?o4+-re,֏R_zӷ<=QzcyxܚYʫepJ۾.HcAc"FtvD$dYqPqVcO0 _G{8W97"c∉l 62G"jٿ][3GPY|G=SuM4?x.|&ڑ81ɩAV2&Dl$Ҿve/kŎN.^y߷t z̘3|EeONAwWn­nLXzr lq6$SAҽ_SDž"^\S/2PGzC2@qHLn&Ą=yY.h}~8$\_eЧV+-׿GMLPH+9D.bz"-<b*Fb 4>Gu!IXp#fWxmUGi_6 $/ҺrttQ;Pքʚ \;v{ix0&*2ƹ $-VLI†ncCIa&҂iq8qegxװdl_c=.f\aj/YȄhH(* ȉMd$T]mV(@cRDb]] /"_a=wq#z e^-ߎ8F|Ey+<\ҋ+lY}䪭D>t-rfa۾2=O^Ѹ:&H(]EJ0 OgQvTE5k~K͈ в(i9l?}̡\mu;/ǜKٹ,Fņ3x_]pWd FfHO,5偱xdԽ/(;\p9/"hN@rN.,Xښ`tOY#i9S |0-eU5Fc$Z&`l v,0#Y@OR s=h^@VbuJ2`ԶK f@gh?EyÑ ^Ȯ؄֠~4/:LS QތS?~ c{/-Ҧ׉K‹ .Mh*Z~wtyo)rK%]J)f $KONLM~yB  !`>FA2.#4%/=5Jqa:H@9)Sx#"(~]ui;(ݫߑr'68s P?5iƈy nx=օVa܅*cgKyX&}ً;PR4yYɒnΜbV3 Z=]QlNF%#w%Px,Ͳd#-fj(Wm!ȴ(S}z-/ny@*"x[غ:X^L$y6yeiY)<-#{_z*OuY*&q4B[E)O+G!y }fD?=y.\B ܟ̊*)=| |XSo}VŘTo?,{l>s6܄,:̓aTx "N+KLy:Bѫ~" ;NXK&$﨣>mcj(c)Xa8[8Μ<-QFj"c ./'v? <_~2\eYqe5?1_w?_`xd%鷙“1WxtꐲȲ6ʞYg,vۊbbtF:Fp2E ۻ`˗O~#C]DpԽGPIe7CJ'R?I<#$v;c\ m|$[m>[æN@vA"RcpEi(w?ٚaϦNZkrYRtT:7Yuuֱ1Dv9]Dp״u S;7 .2!R#EW_zQV׃6~|];mfx \? 1C#]#X#l߻11{0`ޙh1˿-A%/W7H_gE}X׶qYzJ*8Ry%p*DZB=#*-ESlY \_*}ZVmz֣և 4F,K}=cXW>*+vWG~UE&G'ϝz܏!}}ҷշ}y\Q,u, (MeC04+=(@:+{Iי&L|@9]wht}`*ǓQ®ݭNwf-NԞ9!^l\|jXfnrB4@u/CI%AmeM}*|ET;V-=@xD}!ݺ9g l,d֎mģפ|rwpȧ RVKe;T:Yy6$XtFd2U"AdaiS7 w.m!UsfKRje_qx|?˝qq'rŃwHFr M%nk\ 0fO)W++IgKso v7RwѥÖ8iH| ubTZbUR|?Xk5 3V%@BJ2<~л 5IX'" wN4/.L {cQH{KVZDz5 ,Y0{k?J@RqHKPHT[PP{I3֖6jpۼ,,.\WueJA9K-_ܟ2w&g \ O8UYJ,KQ%^ 2 H!&bKzL܏U%^lt)xTY Sթ #Dz?tmu}W:ql,yf<(O7kwWI&g7fGxqaL-zfzT790џ ` bW(6l?l^>lnbUZFVeSqL+#V:[rf񎺁M..ZT,= fmHy`yaTn5ߙ ǏcAmźAd2G J$ 6w1efFP'>{W'f^ۗ^G67껆KȮLK"-2Dx_]|jֿ0kb'ъg=O3Tn5!!)=Bz|xo>\cP0L0%2\1y;ws[, ̭MrӸk;l$uj{R=N;]2ɼ0ACo,cI|r, dC29U^?JEl%F`I)9 eH(k_J2/V99)_mEmo%?/KmSc+Qv@|Y@&mC%* C#"J40[p ebܖI5w3J'Gjq>Sx wVB-=H,9H%tF'ZtpL*Iez&UPN-o6<&0 0jayR#/ʷww}' KQ@Taq63gf{QG?܈ Dv $NIwunwk-=_;]Unݺ]uOs$* QP`\39x^WZ ֿt(RKGjO8@ P%D@I"{^xߢ5U}ighx̒ӨQȬBO ]>>ܒD#F|et[X?h;ᥝ4vzel`U:>Lr#TPq6^;fRRhaV*e*Vhfyɗ V[\A6_4> @pAa*'<.~`++Ty>2RaۆȮal8)Lo2!xwi^,8N?G ︖p0e&RKS#5 ɐ%{!j-%fj'*Er+hS}_p|@nu d\A.|OH^j; |^v$!WgRxE[/jjjsTd]%0e^98.$\}j,y|쉑o?T^+ֵуwePNUB6K!L[ 臟9MdRyi6Y,G/+Ȋ% ?Dvn<'B"2 mmH "= r$D=` 1 }y\7X6'3{$-{}`i]歓AY+'8sۯe_t]AׯWmK X^=p+}/۝N  ,9}co MaQ j/[@U.D b.Toʦ 0̢ECѲ}FdAqnm;S#8R`E =K!ˬ:-ta4ҖG3B49#?I6?cZS($zV557El}B!mDOr}-8B]!DKTc5.(MH_z[W]Nr^TdeIq &y\ՑqŦ~*d\x1 ҪI_{z[t Ǫl ,as;]/Lܾ 8% E@7~2ӂ-͢Az͛9 z-LsH,wfbN12*RRT`:T{A ͹SA~8[}D"S P)ՠ=kыg_"L6F$yk<"S%0ёݾ =lu Q f%'S70BKU_1(lZT"م $?kn*%lO p(@JU913: l;F;J7=dz H7M"KW;%$&~.1n 4Zd2swKI1>!:q>0e<ű)Hv-}QzߠK.΢s]Q::'I'>\Md OeTy|\*vz¾4rD+A5B!iШZ#eQ|_aD;6H`;#H(:td, 0"}Zd,2aeyimLlWPXWvMRd%ˉ4YժPc㊼l! 竖ʫvYÅH/508T`w0 NxESҙ!^1#~-Zg9<^z83No0z\4=ާ z>X @T@Č؀4Aj`-%E0;w1" STt'[ėYw=:brLdǔ?[n* PTYFYF3q9Bm>ow:j*.(XVf% |kBz2C5, >XJ@%Μx)}ֆa8 $%sioŷQv-mvPڅo?DaY/#s_MI>;P!ZRVKx>U|LmHOP0~DY~U 1QQ_ka^م(L|wZϐ;UEˮ־U-gƯxiiM[N6\7b#K,]-ES6LqVeLtu{զxy4,)*mCIV8VP ]lK!evIq*9"V+ 7T^~*y{疙hW1+\jX H||+=Smm#ٹ_{@zYښxUG%KUUdyS|7I&K#Yp,J/ʷ'H/]J*M>[U Uy ?-^sU)*tbIZEmxWِvsҼu]ͿV%=v?4CNte!9y>p7Ct J/)@zj6u@z9Z#.߼AzLM66ӊvd BiQA+3|"FuˑƊeFfH䒋6)'+*ui.ֆXü+prnH+N+&%#$N$Mc l0# ɽC=o{{MT6"rWA.V.UeH6@/>\:{Td,4X!lX2LؚȮK)~ R ȮWO%]l"jv.ǽKEiJl ]뤻6h]X. h=S2|gk8A /88˘š@zO)Z~/Gn{{^WB`x=h]ydrȣ(GY:|]_<5hnu]C?O/i%=/%(MV%D-/rʶC)SZW>_|WeeyR諩)dJ$E9K^D o`m#ɭBBqOruCn'LA0ZfrS@zt7#Uw`«td:Fo\w-5JQQ1PޖO̢/h6]) ^ ̾0úD,N-V ud@%@>=Dd`d+UHllS#hϮ`SZW^%O1io{w[F֬A{\r⩗hbI'%9C5< +Z)03E|) % ʨ<\˗apLK+^>Nso/j1CF>`ʫMB~nSRn;\Lli`:VXdѶB! :$ҴN^ c|3K;wx}ND~DqCZŔ(O,I(͘p-$&_AŔZ~nfĘ.zs4)884P%L kvJݱCvsTJo_t_ bn)}G12T|yo]!f_[CO;U$F,cLBpyǒbSrK([?k=l軬.a99kx\n2[cmtS e҆싒cVO&Ek̓d}_feמZj<~ɜFfU5&@msw,2it \=JQZA XvUzmi$r"[ok>~dYx"Zx >h+duz15[幡֪طᷪ_-IT*{^^5RHJH:A&LGz߬h:EJ|L g(}xAv|T)Z*3 ,K>`je%4%+3R2L3Fyn"&u8NND*BVC+__n+}L Ļ)$ = 7`I!]<,r+hdBmR#QWڅ n Z& '4%زJVۇqDpI/1+R˞k폩Ωv/yK80@&#OE,FjPœ iТ .A..aydl_JQBvf:SR`9֐\oPϻnrWz @-7M)7b}Ir"UwX8%SwpֻZ*e>]:>{$ #+p*m1xe(P&:rt`qɃYH/@iG-ȏw=ĬOv%F#wKjmh4jX&5d|eZ2~T, {6\-\0=Nʐ],twnF 5W\r9L-f-„L*H]USwIQb͠baRȮd > */+#/Z]Byю!#߁wuپE[(=䩓6 ecr3TÁ!?Kzo`|8JuWdWѬR*qr€ZUx$PbOTIQU릕vQ.>!%'Ȇ{i_'t./5U :q_Z x/KNjJ4UX_f0R߾.R2 $TQE=+܇++h%'Ko7?U> o)D*<.Sekm=7^-b^'8@NׯWOs8H.*-j? ^x &iUquuҙSUqڼ캉V-71rjl)\SdikbjKG)z  @~`V˲ ȻaItȮ0է7?70i=om6;+kTBz){[|0E -0kh0ݜ̖ DWKݳ~쇔?rrz/Øbʞ`+4x gܪj!U’}ƈ$5.驻F&W']. ٰ3Ĕjh \n][CX K=\ꭷ$ Hz6,JNHALՇT|]uvs[k,u{SqWf#I~; yTmͣK' 0aDzUS'Z5^rRY2KJ:idvH$f_j>Ugi[-ƙ\*j_M|)ɷ(%zY*@FERjX꩸(DB3]!`DY2L^T3&mLx /:`gO+w\LXJ<.5ЬUar)pv LT1S <Ë#_ld9]Cyp9]kv ӾmO9jicYeځ"QhMYTvR}v/{Nӄ-9w{+-#l QCo9Y]m}*FG'_G$GeN' u;[u5PyYv6a&{QA5hR'wKP])CF#S><ٶEIJ]4Fthp;yK駈 W_:hQxMD95\ll:veNA.weK=Bp5SVXF]ՇկJY^V̞0Mv'-X*#j0ѤoOd)NuGP%+Rhsz^@]U٫;)-+S>r4vSGukc,-gu骯fm 5OjI9iׇ6 &^OlG.2F\rSAu˼RJ/!kR2Yl U} frwRz4eА1,51qd' =4qN888"XOQ^Fm5鷮geXt1sSLQT9Y롅_K. ٕa`tb r2fc5D{t[)%Y\3 7_GUU^ó)wta_SG];jhƳ443i_Wgj aV4"]ߨ 2mnWj#fYZ1&>R߿uoo }YV-MZ,*pmX YbbwMw7eCcTgA^o]/*V١OxcxhdG[IU.⡄Gn0yS*Sy-] $_N\J]F A`k"(YYlOs祬bD%dGݜN+֙\QX>K%jlGZ' ȗWUj![&rHz}-2ݲ?'KV֋u#ee5lq"H= ,+UɶGm)U-I |*`}j,kQ[ j*(5eC7fQ]3莑A6;X*PeVLBf e\)p,]s'po9T㬪!jwU%|rlt]18^iy~@D,PJe«pMHz=次]h- hjnjI&,ͫ?)%žQqAV.-`P^Pw,q _$!ikw>߶gGmǩTPmu\d@9ܵzZlT]|PAd22F$W-)'2K͔]PxA5VLs5m쫲T\~flw0jaz/501{ٕ녷 Ӄ|-t;6کLRѐ Mzχ2t9:%P!.`MEp( @0~ Esqstauۂ"مyP}sJk^;C-\2vA:+3CNߒ.e[I&vJP~~?P-{_Ͼ ͹-~J"-2U#ȟP:Pz` t%嫺hI$+qGnJʕ*v;i;<2ElERٗgSŮ mĩR^奩#HSQS%4U^#Օջm!W7$S}U2LtөcqW꜓%`]w[+'SU0q*Ox<-qfy/eoUDxA5Gׄ~qpPt][rf싍E-I̜? aq Si 2WW':v҃vd%,fCҳz3z8P zoǔ}il.ilF; îR %7ۜ͢h{ ҤoZa_$L}kbUo- Ȯ CuQw hfs8৹@Als vn'JIvXJM%PO@^B^˿nd"b*!s 2@Vh=+EZQZkjknUk2d9YBn|<ҡ Sn\ϥRW 9fHǠߚ?~E?.RM%/-RlLΖQ|Ϋ `F\zYUj[X47)ʑZ٤1rrrf?~W"qɒgx1꛲y@y\.;_% ;]_Qx*//:'.#T NWe_m2&L spMɏyܞ,au(\3+Y>@Lg1̎N镢0ypmt>纜,Sgʵxh#$BfW,`S.X\:irp1'Si1BqLx&SÊ\TuV2+`" E˖[iЮ_vVė:e&NWsj?j9K~o ngUK,25Cy H00^V(5Cfp2$¨| }ϤT^ڮJk/SŒ}?!( "p,cJC P?aq5W{xrnz|| n Z`9]49fg *Xؙ ak'9L`jB&]!{]mL68?NƖb#3/hϞ0^KnoejPJo:U:Ȟʜ< C*9ʚm=!-l!5 {aKGPsLѬD>FB5L%]Iw༩x%@5P[ϱiu*]wT]#kOA/Y{u UCv狺 y]Z@zoT@KO:( & я@~/`FQÒuɬ IRn ͖y^ =+5+KeW^\]A-~JEuˌ+vC"" !FcfFw#%"%­o}UPraXרR5VUݦ]% B#eVLI!o/H!cP}EmfKO y3|9]-/ј]A8|DײXgui Kx.L+6^XAժmp4'ϞbX,^v8G {-0"{46 񹘹$1⢻I+PO <)LcSGL&krz6eDBEZ I{1d X?R1<)#U{qϱal};i!փ HnO̢AdJ;hh؋TMG#,զ.v4\مq|@h'q<] :|y3dvC ܞ$n:t*vi1dD++}.wO R$ ʄRLjŇ~R yaU(p0[rG G v.4B' aI(b%j,օkۂgB0 m~\MQ1y*G sPMU%]z @9}‹#>Bzxirx+}zzK׉ y,~RExXFbZ)'Bg&OBZq;-M=V8@el+OBKnſ8f`4-ҫp5S89^ݲϗ8;"G^7IdQVoR$E :*eG1-+BIK񪼷(^|/ҥAIcs('+Ie_'3%⍟/}V&N?*:on:ggFz# *v1o PCQƌhxǣ?1_??%i4id6UP+'>w_ u1Unz`_^TFJJw$mn~H/U,+.oh|k"(=@HU0=l \-&A~*.#ӂ.6&P&Ԁ#h{ 2L{g6D|0xLMNw&鬧do9m\O"Gc!ʹeRх~m~f ABU.E¾I] Uoв\ƌBTRLW&5 CB& <٫o3j\UV(6`CaPm E~H-IǖPKPo+HEUIU^Uَ#D9VY~,髳<&_@9y[0C@4TijXj4;Sث~c%9jFJp,)rK P֟?=tx׿=H$?ż LxW_'y\h^ {~Pc5G@N2_.# kx<]@x! a/r0'ʘo:O^Z9EE_ji뤥oGffҭcR#*D/s$ra0\ Pua ?T 3:28 ^}Z^E=Vvj"$9Pe呫::xRǩÌ@yZVW(vP*\bu2@D4FJGSŸ7z;hf;M6]Sn*bPn]2Gnd6ЏgvڅFd]Pw\2B" ..Y±1k]m6OT!@NↃϠՓ/͹(na <4E?^Wz*Yʿ88x@t򑵇mL%SE^JT3mS@z]39ߜZK6`ŗ^2՗|k`j=y.`(T{#4N>d%R:+DBSTi)4\>(iZ -Wsk7-NZg65< iՋL|\?eb oD) /%Y]fg8qLQ))sL.U쨓(l'?ʬ*BR>Ea]sgsfq=`c@N iFo #'*+ׯ/]lgi1+X_:7CLh45ԑ KjŤn ?"-{ d<)N0{ # A|3 -4W)pl} =KD Z 7NRDR+zV""P#%*Zx:ݦȮ6Y]2'`K .3Px,_@$K 絆KT9ImAEăZ ˀ҃Hv׫Z#lyz6jގ{T /kr<}UUm 5d]JY4ˋ#&~ώG3H ߑ<%b T6#i>=7> Yb5{r4/Pi_=X4 M_z$!UX/,L>,L1%3RB "Hj,%.ʃdxlP Yw(:;pk\f{mC5oxbKvlpȠy4r3ē顪V TfdmKg=7vZ׺([-=C 2U+CQb'8iT*d:Q9P)ap-ZE}l, C* PciDe7KD IsِffTyQQgUY jvuE~M6U>@lޤ1Ye뒝)^ءᶠ7ݮ/Բõ;/ciGbkhZ/>\4/Z&N%J;J3'8t/Gɧd`<娩5e!1vqCUZhVb&}F/Y{;]3Y]xl z$%Ђk'҇;ЖMTqnJ Ӷ^w79FȖ2pd]uļb$$Ⱦܸix[K͡c-wr1!O/rX@ܟ*Ԙ1 |Eeԗ34sC3./\z  .*򱬲5[<++9@zAqO5xGO7镜hSA==ݔ.sEwR$>?p*Tmr)h(YL;j?qGj V{iF3W)@2rK,?K)1|x)[AY$jvQI^8ň %I;3)} ] ̪ݝNv )oغwmHJo{]ob$%-(쟾È;[j:e'~.]8^rL:?,gdnev#ƴJ  hWPRv2N{iDWRK2`AtI=YzsŷbW6SZʣ.?+-mYeL_AP0A5;kS΁Td"`s( k5>hGO{ ]zgSI?7:;'k~[&ul*=2#2M/}=n(qWSB]l|6t zZ|e<I)Gހ@I)9\j1{$ӳhΝ2 C^?ltew=b:t̓ kul[?^27h>DWIU(@Ϥ;Av /SdTZIlCB @f~Q\~&ԩaˆ2:p-RySP#t%Є]Ag d!hpӞI=K%߷iūlP*d[?_lQU~ Ly^ /YJH-"* /$K) Phfg᧎Ѫ_"- /eQW(sr4\Fm[6 +K[bWypm~QUKGa:"з|$+'K9Ce4-+DEMj~E?0Jjy#>p>E.G sr4 ӺDz{W1s$ 7w$R7Nz{q6ofqhZ(%5?_4$'?=MJ.F$CbJ2&H$&?M_ ąaDZ=TW]DWĈ+q!N `w`=P$bˤkshCFDuTI|}u\N%v|}mvpAtJqu-Q]^Ztu?&=컳/Ev9D܈{QGMUA6!]9 LXJU:yVzsK6MPEnhO͟L)I`rJiShR[WNNfYJ5'jR۩4&N#me(4ZYA2'oF˿Hskͻw~a[C8әfLfQT֬qM̾@]̠,#Eb?V[rO!65ӎM2^nV2SyPIq,Y/Uޟ4ZN55Ž, |ny:A8A'kv.xQsh m TRh*az5͡ %fkJ̤$z;gUTZAh?rQS(!1)uHfo"#{4+ӬqݶbWR'P٭uOSX *uA|5W-.2,R Q0,(~,/ AE3 ǤTU 2FuU4练 eqFZh,".dSL hIPd'0 ]LTAMlOXKcZ>[*Xŝm~'o/#{ߗ*UJCo7QlTKRJMI]@qVL"`;P@a#iJ*nj=6![2 2ֽ\QyA PRm!ϫRz&WY]Wr^4mh9/-aZ=1JP3 հco#}p- DVi%T ܛ~ҴFw/] zZAxe]y\ܪ0fǒqJ,)5 8^{7S3%6 T]c.]TӒ+wmU!i´鱬59,}Ӈ hi:kok&k39%%j/6` )zK/F] W۞kqa Wƥא-=zke^Rr\NM'S;Mmv/5,Gw]Q#3_514 [@`R]yխh[V'>9E5 .ɤK)9M+jo+mz$-$I\:3!#CX;e-52F\GHB@n6l, E2-l1&?,O7~ D ׫|Y]Khw3bz҄} ʛRDR`?H(,Jra/夛'DR,'B{СSP |: ktT^6jp 3,w0+<(jAڰMi<C\rDha_MAן6շg gml|5| }Gzz=ĦiJ)9Qw:۩IX'WK[',Xօ0Tfu=z\z`v}PȮa4B_o-Dž ٺAN4jɨ%%: % 23`=ty5f K6 %'>AaMhY" Y^cq& %a|2Z7ˤg0jmyYj!,)U;v6C('3Q bjV5ODk$YjU5m@;^j=./hҍ`nl_BwnU<+ ~Vcnk!, [=A8| {|, 9fq$Nֶ/uW^/B)!tDki@ uzkw802s +xB=`u(zA/] R/L)GG"J̥Ƴz3rfi\!jX oV>Y:)I/%\H joe 4X.L=y'fI TdlRv*Jo [鈼2ĖB DH1|h?A$ڸw8F3&BIx5[ݭMl9sP`aۊVU(]@}cF#q,Qٕ\J.J i 77,:nPy͞PwH%_^l6qDfY&#ڴyPRbutPy&LZ| )!2bmi"pLԏ!i[ }AdQ丐$^κ"ZJ, 18P2@ii&GͿX&#HOwD/J奩!k΢mi}Uy\{[KWh+K 3Džt^=b# ¡X$CNeGݟ+Izuwr}F $]6S ~gl3"Tz>A If?P; a3YL|  /6-EC.L y%L2d4e_uʙ0j^iYUv1]j |f^xrf +&3=~??K i 77||J$ _~u1{s>x}Bܜ~?)(꺻:X&He֕ w7 )1H8Z"Ŝ.,gMJ/ǜ ^y{ZRQ}^MUA+l*^Iڻ6q)OIʗ뒒> 2Zy\fqiܪ05Ѳ5Գa81ct.zOO9]zO;z󱬲7Hcܛ-V%);jsϪhE̎^7ye咥EGr@F}ߜAuz_!D/g,`ng+y|YEٕHyWʰ$^"iO+_E~>Y[C!5)(p<嗒`0sQ[k3 5t)@ )x ulWIAړqEv9F"sHq.{Wpѭ{$6Zzef\6pjf>C2|Ts \쮤\&$RgsI=-djY:vGKx[!MM#Gݍ]]ڷN_|@$z;3irǞe:ާT?`S/Dw=D[60xy4ȟyeWvF߹¾ž]־PsݑMr#t`+'^|ÿMUL /ԭvY6|}i,[2gxK̒_+W:6v_6}>Lw-5;/ĝ;cYekxluYuS[dG{N <l 2BVz%7[Sumq6AeXВ\Z8o <<]_od8 )9aݰ!S Y ֈ]Շ2 xBJ;JHI?iԱMvǻ7Οzj򴐋tx{}4UmG_J3.I;=.6גWh_DkdF~Yed )kdJ@"r(ٵxafx$Z4Rm"y\Qw<+ NSTyL#5e8f7S:7*)]^d&6h1r|sVJU/aǗz$zJs;;˱p|MT73i;}GhT,KB{~xe6]\2T6'˽v"K{-\<.?^  [;wz(BPKniYɕHk0Iq 2bׇ=̡ ^\k,dQQqRJϷnHQٕ$]#C.oXB꾳I\k-,b_^2DW(<6P˛Fb>8(ďҫ3(9=VtվF@-&@\B뿐IsK2A-T" ^J*Nƺv$tn; KD#me4/~-Hi B]0&vws Z.^C19Y]?~CR.Kb ɚ8NiCG,X !k#O'v@]iR,ȢWI~Rl.wx;j/k{*yN%WqVߙM% ;ǜ^Kq\`Ԟ{ܥŹo ~pNjd_5Y6./WN/!Y0ev7!x(u '_-¶6O+y\n;&,|NrJ&'8=Cr(}nZ|@*i'f;31RɒUiKwg=f^{gPI!; S҄k^!nE[,S_̓.'JJ'Jl>g7̥O>oe_;G561`_\oEW0%^lq,~pLQP6Se2-gͱQe`7Tt|%l9(=־m2Kļ)y%KVK/^vב6k>e]B9o%)it\҂Nv1퟼MBl!z6Gn]O~v6;k)/um|~?ͣ;95uU.΀! )~iqʦmy"F9s z5ă쮺Ibv|8Ec w2^E?,aEvr1C=Y^MT(J m˛ǥ%pi=O,˰ص,cy]~O`ה#]+f'=s;̔@OX$Rn>-kY96/<.]UFqM{8$G Ws 7'4&K-\ݡpɍz,eK"j *MCtld|]^Z8{kdd]K d4O.m6Y&P;rDC>~kr{np}^uSPe|}V BgN˯V!$)qm>>?@M'{n_px̍%V/L/!$:vi18icSuri3aX:Gs\6E3y u.2FL _܇=c-=jZTOpE x Ůץk蠇]-\jLK9[մz1<+mhRE,s%卐\)R CtyV%j99 ΨX+ #zS^ô 66<<ߥ*=KᰦUѴ[KzjV]eŒHh v;Y~n<>!k6da8HWN?nBB^m'qs#(e/u R!(kڰђOu95븂CtX׳| iʌ1.ңb~aנ^f2E4vعvtd~evn3tݴ;!aAig|[}f<B! Q97SK$Dӟ9]?!~T.v?#B:OLɤZ(~cC.m9Y cX`s`,l9GͲ;Kv+x.aVSLǯ۬(GE)è5}C;u}vs]ld}A]Zy]s銇R$|B&>F :+d d2-./QJ+JZ4¥S`U{jIӭ;/y:qq9R^;DX%DCS~mV/hI &=bqt׉q^[N/5|dZBi拕^bkl*MU]Аp{EEGQbMv%(?i˖}n_Zڍzx?dŊ)hnYxFY 5W940Ab\pCL,9'^BҬ\߻X0Ⲇ,To+|Yj^?/.}һ/R1ooZ\і BY0&v.9FG3C6p6x@5)u(:.2@dΊ.f \2݇/9?ƯQztXz~vU_ık)90\UhQRZVZ4U,H>2 `km}fTm,vs˫Tx G2{"YIQpteҷVݚl.fc@ڶ7< y\vqy}|g'Ж9}n M\ox| . Cutq:t^gh5ߋ+EJD.׋1 {O bT…^ Ooqy)13 g{ӫ v8C5RπY"Xlȥ\oR{St.Ŷu Eo J(xtfͿIvhl TQ ^| ^:2n/[,%gɵ\P]o9'ыU9ť K6_8/~Dm v{Vy],t̤zŜ,n[ dϾpN;D9rUR(ʹs-+moKOYLG'ҍ\5[joڴӬ.os26]S}Wj{Ary%GS5K<A0y6Y)by.= ?-w.m+6IyCWشy\>m^=mt:W3M_ӕ@Zi'f#rB(cpzl|/.mxG|GrdN6t˻OR|\ ͻlzDWwp%$&$PT²#ti˼|,z}t>i)!6*#z?K}J;LB=M.U8|LҺ+D.w<~,]^2\şAC6@:\Ybɭ=&# s2lz~]N.1~ .w&IB(c( ,z~+`b4ߧ8'|YPʘM41ZF4:=?H;y^թPE5_ uh^/7( #WЖm?Ze [vɡTRKe3T)1rZ.0WZh? &KuW=rTr-&)K&YOԯ}msGh)?7ɦڤXf#+8ڃ<8=: |=ôcoCzvᜮ5w-z`qќƚJtM]tp5[a{%DE\/v|k Kg;r>8 ]fh96eWREEK`t`󢤡pU/[#ʹh_D85uS2:Rg+z0f;sGCLzV{+BH\>1K8O']j<2"h(waNUs3-"6F˲C-{.@bwhpd/#5wh♺>0LDGA!tͣ.KYW&p!C!Hs޽uqi9gAK6QXbǕ@İH'D8ϱ-oH.^yv9J:v䶐RtiJ,SI7~jMQ+)J lvJh ɶ;i@ߠydGH.Yj+<.M%WjnC~AkIu w[4u`4iFWL ^nEJ19 |91tc\ՎJ2~ x2b(zԞYK^g~my"<9Wf&R,߸gY4~eJhB?d_e:Di2(3-^D_MHs^Zǝq,5_d)0J.L61BPr0;jqy5 }Vr_:D/fǞ!*)^^:`APK hɼDpC0m8L}$_T-*!xT"RYf U,ʠ"G?jz5R;~T褕q/u^Wx橉5W{;5gtyqM|yq@qyh?|j6N ̂- 2Qt]9|ZvErCvze9۫(!!c{rX&:|O_umÔ֥)E7O8)-#sj6EtO9SM%#GG'>spψVj߂ 〙~vpw9>HY~.6SѾo:hhwzvu竨% a (;bw Z}(9vJb/ =ve]D;1TaSfw}]WiQ*U\3ŦTapy\cqnkiǭ1~=Qؓ7J_{<߉.*i--t~@OkN/z,^Vv{qC-#9HSտhe{(*&e/tЁӘ٥!1Stq y˾BsxJ)%X$DȜ/Ѣ/ ,`XPTv]qYdP\z(_h:_Gm*nخ>3 ..mj˪3뿮e+t  C_#\]W7X+^GI%q.lWQԶ!,pՋ;KYCe ZP}]?桃KS3]O?Wws|KTYLŢtgg c9&rŬTze>Je*}rD U]34$r&d)_9].-f4vGaS#3`Oﻎ rR5 v|(W\(M TQHi uՕ˽n\uS{鱗sGX)$e"a% TvG]G|G'q% Ms7K_w.Vks#zce*uMk8W=E|㻞t-zUj],/>djQ[h# sa%;ٲȍZ{sۺ\tSl[rTMMekhgӨv-fqSR&1C l/}|O5;K߻my2ne>Jq鶏ǥϺ{[iqK:5@ziڐXSpxk׋| i ׶ں L .o»ǹW_f_Bb__2/4 CMRiG_b@녱,R#Be f-_\sZ aU8C YJF:_c6Xp*aJ7*|dmo$.GG3upr$n>a \]jVv,'c/why]mMힲXlc#;*bx㥇;Ų\02l_;0e 稾iHqa$3P)GXaѫl6}8NNGOQsS_]o\]t+\{д P0Dۃv@DQ)Zz(=[رBdW#nzG8lἮ?|o҅;X g? Sp`pVH|N?FgDTP i^;kFhղhJLu4YE(nZDY4 ̳U]=r?U2`rH|L: .2]=ô~1{i̋C6jw3N*x0G}UH^_O۬òy\A}>k _r%u }7JwC>ӎ.dڎH>k ^Kµ1.Ǧб~j3+w3t˻\,#|YN"b%;:|1 ȠǮ/OX`W aBh<=6 !X/"b=FZnw.7*1Whet5tifuLK-k >jQ%y^j./Ya]ؽ+Q-sr^״[J6JT]Ig(KcZ/un;;.kfJ\)k(LT>v^mS}\v8x5ڿ-_zx"<. {@OWPy\޾_O\}ݬ,v K臿n+ 3tONcFҴ]>- ׶N'X~1׀ʷn/y@p _ ˟dQwO?՞1-%#M޽Xpѧ>]#n[Hpv\ nX3ZT.]]?~C55럯LO| ͟,!2ՇʦK'WsyCn^FEQI~4mːpG#G S4LkN*) Yx!9ww66n3 e]<t~c]aZQA‘o2{mt?0:CJs/~=.qMhy*v l?8J/d7N(n *,n=XSAp.A,M>^i |/vz)DQ_O^s.ƃ9$_=GISπ c~=Q]JBOWER}[f!v .B?/twtll#fU,j./,z v(f^ryC#;̴(?<@%.krY27fOspd/cbmk/P;}=X|3\KmP+Y4H|9W:V6 sUѧ5aQSOwRWIa -*WB]< -"J~xbfKdۺ2G!@Ҵ2]D5ߋ(LңbY4'&QYٱ$J 2 7Սu sEî~!|qV'"bDCr.c#,J?2}ХMmi"D+zcCDܩ\5(K1@&b4by(?:\dh cۨ]7XgݶQ^j۪GS EcLKlV"!89z2*ן|&]Sz0IκҙI 1i4y\^6"tjJ=J9^|%֜5uAtТZ4ּWHWYszL)r+C {OSi]K qM[khh(:&4Fn]r9}tT6$g6"XP-SHÕBUNB`=ݴEe&UѨkb; 5^ްDj'eKﲆJ.g~GnrF[ER-OO[Lۺׄ] wS*y =~5fv\^siv;CfFGqx=r< /<.@B?wۗwS홞EiÉEBEBA4U4<W74x8h7YJ±,vqCv|q3AGδ;=G99Y :wuhxxbc(6.>< 5h,n&ILNj3\4PzZ[EBҢ>+]8::Bjmj>eg>y]=&_ L}\^ %{W8+)3oP"m'mccշ'He(xMH3u#m"n](l6pWĒ.JNT+3SpTXj|xwrGu9%dլť(}|_@pO}Ri1tvLq\C*{Oi.Kb׮ZqwThekvѮ-̐ +(ҢJ+?KexyNyW/|(D/4u95W0_H7Z5bWՀALz _,vedPZztw5o[vw9BPG+ v'M Eٶ5/vzU\ /Ibl/8` ],rO8ٵ\z[pFWzF.KCdɦϥ\,}4ghv_^y҆ ڧ>zߵ;/ɏr4RL\[\E.X ww)>"Z}Gf6صz4vyM k,ve&E KjA+7wfw]eTN'ik hR/Mrk PT^#^cc!|iq릋[o`WVN Cq N:޳|+:3@Waz U&=eT?ZJvt-Xw{^!g,N.5ԣ_N.o%Q]玲k ,_Ȯ.vt @a>DZARry[ыt9—#odQfjS+J[7ʏo^ZKuʾ,/c/e3WJ]t>.^e ՞m8DY7ly,x!+ڎ<.']&4,B\ps4$~ 4-|*XӉ]b&nJ Erpl'{8*rmPyy1M/]G/扅/v|%&-,v8dIBj"Z_:YLc`PŮ/|[gN)▷o)m|>. -\cBGna.~ե7?8Ӡpuq^pu@s}WR.EA`o, Ɗuř`dSы/oUaRW!ZqCuNuj!m`V=9)v_$]ewLW<6X88H%q*? ǚmyn`miccײZ-R}y\!q|!mŊ+ "K޲Va /pv/GW>px|/ֆ{[G4/[!_ fMuS(+gO/.i(;XMIDukW @.637N`rc@e!ugq?k5<.n+\_wJr{n_H]~HK._ M=/ o+D/+\]R FɉDl͔vxbA_-mrW&cr|4P}H@̨9֮ʢMB B6]s0e9'fenqXJ}`z^ X8ɳ @׍<.@׭ў7{K޿t# < U x(2{U{[YbU3sjQS)#+RDFrzIL`_ior]IE)}|IIQ!jhY_ kK{ 4a7")uf@tۥ6r~6vozcdM/pu@_+Ȭ Xb\tly쀶KO-~i~EY,ڒ|yAN+M?T< gqf#iõST XĮ߻my]aƯKx/Z]u#Kj!m{m1>t+"sEpr Ġ B'E%eŅKT -M{)!*Z`j—_ F?-?;GF`xwg }QráV2,v- %MWsnZ)\W,?%x-=U!s锗F $];M+%{hp0N_GO#[kéٔ^Sӟm#o~![d7d?"p%{w3 c[{Bm@}=b7pŸT{}ťy\D׆K҅k/,]>جwPIaⲞ]"kB"A[<G[>>un!vet4,M+sk+8CQzA c˖;kS#-9Vof=^JNMT.ّe9Hk@NpE=95U +°{U%~͜%rtt]_J䀹<%;\N)XZh|m^ \'Z-e1eqK`0c{IDuӋ4ۼ +!7 ; "rbD0X0.\bE;^qG}Mߎ_rD6ouV>Cn{_dfj4ݖ'n~V]E_غgrAZwL-r^q$*= u#K3KT_"}<׉. %MQ毖n2_KF*+{g~qI&iiT1X6oWUd WXtt Hɓ츑E0[~b ;TK+[UeB,߶ =錩K5z5E%XbQKQ 01ROW'I9]|.2,@; 2dny,*#)/9 QE/N[zE%!NKpf[A>{y6<&vArb™Y?շ{FŰVIe3쒩o2)? 'l y\|J}(ZrB|!.z\]| Bk^kdkptŷRR)-#3`ed' `ߎ9`\/5lJc[pV>䦈pzEXܫk/"?,a,.Oxugם#+nHz*֭8bQblxo)3^]ÏingыxN^ =h;tY7t<~\Ϭ>EZ4'FQqÓ 1"XiP s 7U͜-/# Sr S!>1Qh \ ʽ&OQyl`qXܑ`E.vG~1/W4뵞i.ی4[X8@=|\*گ{nTU\5\$v慨h'x)9lᲆvW8q($A oOp\(4`8޿tт 6KtwOkvCQzA|/%X+>SLLf -bܭtJIK @b,81.3Y& `J嘧VBb"%&P\\kÙ\7e _ f.L-{x|Xc\eiWQq`J v˕g_^0KL_@X 5f`FGOHM"SMOvq. h'\Բ*"!aK!;^Xlr=ôV2<ŀůͮH`KKdi2 \b /3vd=T1?DĖG%J?2 y9]d+/oںNׂt>qnq鷼pN׽ۺ9MxqNcM ^'K2CQ {WV6лC1LŢYt4sjB⒇IDII|(*hwSيV\Bp~pCu;kq o&J ҆wL 9 أ%vq*CzQ(UTJlಆJReNvӊJ"K Ku#K뤉qN׽ 89] `$sX]n(*_/>H@T )&% `|_6jMȮ-[Qk"[n} ̸GJڲ(eJW)1u=jZYS<>W)%`=F,w5 KF_NtK޲Wt|!pA5  ^@ߓƚdq{Fh *.T$d痜ŰpX`X ;z \,t]\9"| ?>$gج%QNJ ;);@{j GNA"˿m7oRn;pN7kߊ6'ԓEFW@E;VjY1Bϙ(%ٹxNy贸%k/bVi>9, V`W BJMN"wKۡgΙZLNUq8wMMbrbt /_e';{D%*ǥS{|#c z3+ ~FMho^e-+s^b\!ˋQK:n#+(֍<.}<.Oo );{NmqCSn1 {ܯΘddd ܁+bOz}_:Et%QPǥヶGrk ^$}T|a@ 1.˦tE xزXeYX*AWT }1.]Lc'R!$ b<-d!l"%\{Kv}B?vNMfT$+Z,\쮐s v >hy(U8>S{כp8OTBNq xj-5n${,-M#—,9m eVZN_?у0ŕ7,-zdfY=?wДoxeɸ(y\(UO}q~L~^gȐOH#Jtpҟi5z$t0FIm=K_N'SҸ1'$\^z'%<4cLTlN˫,lJ,~d726ԓEFWp!]B JS|E3ѓ?mA `kݳx+4`e.Nx^}<.OaR|ln>_ۓ.SX@9fuzP6;0;R] ܀B$VIUJ$Ҋ7chAtbWI/meC ꇪ(D/%LݗzV+cRxz ] Bù,n/UD"P$0Bni&嶏CˋEd ^v/oxE-S=IAUdE_eחOẕr@R-Mskم1T@!z_#@'ɟ^{u =JNJ7Q}z!tIh.@ЋBfQ(JNhO{JrJ"ziZɕb;@ }hKJO.upͻzE] H;.8Z^ UqlnfJ,D€*Hz.g$C4r`kN  bEp8PTZ;s-v$FH UQ&.*Wu{x BWٺ4P2̿nOd1.,t&q`Hˀ"Oך; !ǫq?j JZՇ=^~nt}(Dp(䵋_ҋc"t>x&&e@j>>#ziZX+Z;']"JCQv! t^/ߞGpiyi.]RQ.qw?|fj[FG8c3Kdtt>h{s8&cniٌ@8@#}QZV rד]'!]γwx7ɂk7φ?Ξa\e] n,B=ru ҅OStr ;32]\p / };4|G|t (n/΍ݟylu9ײn#!U{Dž<.TY!t˙AΦPy&95{@{Ujpד?DnBׯ.C0.u8v) ^Nǥq!q3zyO',X/=1 |C4qFguբ;pdxt` }|gɒU^Jܼ?~%,NFBCCJvW0U8vNpiCz+l q鳬6"+lb.eDEtJD b1> xS-7&^kstˮ^3xt @U ^٫v6_%Supfn/N%ryyiN{A]=ɹPz2"*i`>KPw.$kK,^(R|aH{=L;,XXHTږΏ_:fغ@>fkö&*}3!v].Jge"ji҅8px&p*v4UW 쓃)M$u\j4v.KYb|ĝ+҄9s$%LMOSZqŸ Uҋz x|wЖZh[BùEm>" g\g=G`O/(k94RzPxH7C>Kڲ{fGϵUvk_/]Y&p 3˓u­˕F>;Yg; , [l,"awPwmZS%]n䂭-uؽoH*5SKY?l%w&(K}йTu!]M23`d0a߷- $WկZڍc -~ރ7֗ ~k R[]GTڒd&~/J){}gatw{iKu`ꁵs=w?x\i4\ή&}\zq-x] ^bĚXHOuM,, ÷kPʶ N=R9knhUʬZeR+Ds3XUXg9Cy=Kzq~=> C773֍i*ɵ27bW,L>zH&3W,ֵW`k OxL\s cU:멲pQ|uzqa(G0pݿ.]+~6іv5ٞ-.X/XB^^/^1vi #5gua4v«uKP9,_`P;Uai}\ UGptaîO?sk k(`Xi l,cׁߋbׁ_& G_]^ZW߿xx>{-?6^?8KOVy'~+za]{x-ܶMBp(` `ǖ^~/ʈ^K? {J>_<}e+ KbWnm\?Dsq]^V/ytS\ڰp3cFGˬw۷kPʋ'oӟB~T37߆ ?*3 bG؎-O̹^CyYҖ$Se rBЕ/i73.N#SFO+XN|&75<${ qf&[7כv8wrzǓ?|pֵU\(ݿ44šz= k_Us.]ǿ:[^bcxuccHHOu]1 fJ!250ܒ\CA9/<2]|@_g>੒?a{tWT. ^=v kqSע;]C0{ŀτֵͦ9k(ٍ5$s8^#A9.*{JhG<R4OxX,U}\Nt [}^W'2 ӹt,Ԙ}LHrVE=g N|kiBWG߾Or>x>=^GU] oeOlKsi)3/Q$g! M ~5䜓[V\gx]q {jX}\K}㕙;"$AW ^kXC!=]PdP`rs W7駼9fr+6~9\s_}ޟN~*:q-s?ʍ4Nz-][W.Y]OԉA~_cW{@Yۺ6YA87ZYOyͥKף7^>R%Wn ǿ/ڵ%jJ;]4:R7{}'={QƋ'oӟbb85̒?g{w/HǵX5먏IW~Љֵ72ɭ>&W)~s9@:}|4<$'~W>.|n ઝz^s6Ba'VdB{)N-ſb^ϼdB{~g/-8ѵyͺ]7 HrmvAcr XH>K><_͗nog{:{@~%΍}*q'q-5및A/3]og ]]4\r o"7 h\//h |&;ܾ\B);,\c}a+@#5W{w#=Omܿ;[K²/ge}=KNF:&wz8芽\?1ֺQGW i5bm'4\/'0O\/993c@tKXۺ+}M`CaZϮ.~5j[l]_V/.pru,Յþ@f{&oe]k(.4-LvvSa+? w 4tU;VI >iU_gUN}=M|^ .~C¸01iCÍ Tpqa lp+|ȭpB kg^_YDp?XS;Z@}\#]qua ÷;6g׶y iЕ3 hN/h/t~CL;!5J9=v~f|uuC8ޯǵJM\CP2z-ZB@x|&TbpvzCzҁbrƝﰪ_O ͪϙz8+ ¸6\Co x,&~/J^~rغ.n75#_^}ྯk5[%>=]3h>ɛ5b~W>ǮNu5߳K=!vVZc%D.y羻T'VzVz=iеŰ®tٞ ;]m2:]\NxA~)W:{QƋ'oӟbP6fwݾq{Q9عQu_L~ }l*+]quȩ}.\TW hZqe7q$&Q%7|&7^x+z)i8ʓabu^^sW.}\+z`Uܻ AX+tž.HrTc!~A45a0Nx< 3ّ7Jyfk 3_PKZɋk[~sm{'?YKuJjI-cM^9 G>8 'W~Ϯm x&m2ߜ 0o_2|&ܼۛ\ݦA91N=bP#>h&kJU)芧¸VJa'GPVkK>=(!{J]m|о5>Ž*߆#L :[^bcx-ZB5ixU%o6kcuD(eۅ[GnSϷ /ޏ[^ wk(Yczj^p7eZ7> iЕ3 `4$vtaiPN\sA_k!VG<wp~_lף׿ޏ?H_g}\A=2- CZ\YxHO^#g[ALw ; ܇1>{?xݍU] ڰYE4\Cz&%&7~/*غ.n75 Ss?߶ݭ_<@*JA ÛmB. X|&îxkiPø/sC_ ̣q-s/@4  sœ\DWŽ ]+vu4 `%'N\>TcWKOW [7KwâOrZ׳JAWckOl n,|LICz$\ff$Ɏ% i <2n_Ft|AuK"{)^p{\Bt3 ` eQ|&;~~So]mV^PZny8zVi煠k'%q!Mo27AZ^J7Mn^Tî _ݗ}_VVa> ӟ ÷;6g׶NWuNPojR;rLvoHnSa5pjx)i8ʓabŪe[F蓊AW Lxa]_ICzz%jZ&k$o!< ydu a)`ݭZUXՂ0.+ (ҠQJCn3{j %}f>)|_oa͇B~z]'] oeOl Y! ƌhNxu#y߈\SË'o=sR- 궏k;7q# C(tŐ֍!=]GkBSz>]sT+{Jx)_;{ZwߏqsǀRŵxFFkM Eԭp>obuD(eۅ~SϷ{Mes}\ bOW낢uM IԵCL6;zMRzNτ߽>kKI׊<S1za]{x-ܶuɬߛtN^@C(+{T+9^=gf kn_o(k[>xC9>~oF蓲cxvmKv3. z&"Jh|&;(+'ab0=\ܴP`ڷt}ZOWՅq!'\tF4M`>N>|+lp+|\50-sqq-8]5xlMx-^b_o2AW(f$VbW zMRfj+t|}\}^㕙;ojCZ7>_>595>l@3x /yw.^{A%~cWKOW [77}\~93]G|Nq9qm:t1Hr Ho$Ɏ% (#{}tSIJ΅]+u}r! @J4w<~97J^K?,8{@ֵ72m_co2AטQ iT(œ7BpYwî&*'\CQŠٵ-+~o(4Ԓ7~|YsCbwN;{@5MU_)]ӟ}L\YW0Pr y2d|&î!n_Ft|_(|MU}]eؚF[&F+Ҡ+g gk;bɥ fquMU9~qJCZ7>ĕk(JC9+^16kO\=gf]mh>AMUz#{{bŵxFE)CAO#q |&;`b0=\ܴ0hXlKCpEӝkW [7 BVVy|]Ղ0.+ r XZ/GT\sx0u a)Է'gU\1W':[h˄ן Bu( `lwḪ9@z8jUs-$!k _J! ƌ`|'y߸d{C|0Jys0=z@swK~X1{A)&oߩtE1芧]4 +{˚Cʺimݡ r OޟyģjkXWf8 ^c?W}]PHH{&`e8Ē7#L6)^MR6_yd:ݾ>@[eU t˅+~\ ÷;6g@I]9XY/ek Hrvr <3ly@}[U?}\~]oe6)%=@1 !XF}~|u s|z93j@}>R?gt]tŕqua\ae %p_X%/P\e%ή9Cwwo,n/|@Mְ+'ҎAWck·:tQI38 6VP&xk"­˿q8|K!t7~ŝ#|vMoW|tZPdrP[^+`_>=T(Lݛ~j*q|(]oe]jGJ7BT~<&>n(Ԇrj tŵ+uA1P^,y8PC7 uNH0JysB/9˴pݹg 'rިĕqua\aeĕGjP:|= ie!^Ǯo ;{V(b5; :[񌠋jFBzKO@x԰MH>ba͗nn_Ft`,sW)iqdW51z֍\r :%q,g#k*5-ת 5߰J}Յ3icF[FE%! F D߫/46J?q=){z@XY\U8 qLq–|&;P ߹qB e$!׃w.4za]{x-ܶA%6PJh /:9.9|+lp+|ȭp0ݚC|. tL΅4@cxԱ}LHH^S3awoZ '`<ڪ¹&oCعY¸00 ͱk( $ow~_ݦ\-^pvzC`VaOCq;[h˄ןhTC!=]A@7cL6|^0u]80C`Euw=JCZ7> t4/@cgߋ*fc"|O-}v~ tE?tֆ7gɐt@x4|&5;LrbC~@ٯ/7O>?Yerawt_ _;aU'(,<95>hJC%7_g{C|YsCb~ Wnݻ鉮'~0~^M"y?dZuD(eG^Wnz]-O?~օOdTK7y m0ɎWP7 خ~_~/ʻ`A?aoBĝaeM41 'hB ^o'WPJLsp]tm]ö?sXd(/@+~ؒdg!];a;W7NV{p܇3;.8?^bcp3ARI\͛Pҗ(ư+^MJN=Fw[sФ~M .\?`sWݛ/Z>΅4x@>~^Ӡv}Z8@s js_ 3v|ARI\Y{xPR>im3ݹ&g7 &ٮ ׅ3H51B (&7~/*غ⦵x<?ʹOްjrɵOOJ@UL;^{MJfh\a'bb[g]OcWCWQdH{ƌx0oL7WiPN b/ϟ⩐Cm]ӟ 腟 ǮmnĕG: `ސ{YsHY+O@;/>pOᖰ?} .=],$ư`HO|AYg{:Sk |_(|`sa}z&ҠQ^,J+7 *kPBW.LΩ`X~4(']{éZ u]sEOzkB %dg]mL\Yuà/4 V %WAӠSϷ/^Lx.\1+Ig;Bk~Z=.|] /6 *+ `XvL?WiPt0#ݾ0j@xjyaPpr `5 X1Lv09{QA.nZk`䲾*rɵOO@g!kT20<`eĞO\];A%! rF@x*loH^Ӡv+_,5pZvaPI\Yxsj|(5/VU>4('{}0qXBqea zNՌ$!=]*.N! ׇ=a5Hqu.!ҠQP^Ԍb[oT2-ת ly'zf2:Gz b4(']{éZ `. ߹j =]5l}!D@gk7Ll]jPF\Y8 Ii~z4 *9|K!33akz&sŠ+g+uvr5^8v5lt0$,< F 3{uLw ; h*kཫaA55 F!.3@Ektw{ia -,|BOTK}zh4/V+kTbe!ЈbO'àɐ]9 {L79{QA j+t|45pZvaPI\YWL@g{C|u~<&>n@]+ csz0f$h(5C|AYSk qu.!ҠQ,^4|&~~Ӡ]mV^@MvOtQdH1hh~|0 ʉapjJ;a;WtQM\Yx$/Y h LvvӠֆUWή/*Fksj|(hf/F+^MJN=jrŰKOU~0g  N^ӠV^=]Ǯ͗nĕ11 dCm3ݹ,5հMà Jx`rs BR+ _:y#nTK}z<{^^Ӡ/k93S1 * iЕ3 Lg;B|İBBĞtmp0$,6 d&7~/*^G_y2Ll}0cBà: Fe "{}uC~ja'^ i4(']{éZ T;a;WtQM\Yx$/xbe!e]ܴ6M$,]_U$PQx#({iuv0C4rŰKOU~0g^~4('9U4m>/tmt0$,A׈Qx({4(gsM8M45հMà P>Ln^T0u]^K\Yuà\r+CKVr5 *9|K!CϙBOWWaPdHQx2g;B|{U@m=]1vaPI\Y895>l^pE+OԈpصsz0&\Cz`` "{}uC~ja*'^k-{^>q=eTWuN0KM*46 ʉ^; e{bsz0&\Cz^Ċkcׁߋ bW7K*]/a}!k.pEk{X; ǮàɐtP 'tӠv+_P/Ǯ颚HQ!d4搲.nZ[aPU\Y.=]HHOuMt_aӠׇ=(+vtŮ.=]TKΩQ %**{\A%c}gۅw?E5! FxT/`^^16 ʙ\S:\a4wwb>kB`^35(kbB ĕ/O\7  iOפQKA,X+^MJN=Fw[sz̄颚s! rF,%歠ߋ bA_k't 6_mTWƞa X|&4('{g7 {^>q=1 !א.`9 %dA~nO1 :4brY_Hڧ X /`I3{5 *]s ~<+0d2=]cF,loH^Ӡv+_Ԯ5pZvaPI\Yxsj|(&U>~/k)+{}0q!qea t1#!=ե X/`3v /(atO~/;^>q]Oksj=]@3xMO{5 *^1+VKzЕcT2Ҡ+g@xM%&7~/*aW_+)s ]eTW4 hJLvoHnӠu' XVqea zNՌ$!=]xM`H/(+{}uC~jaK..ݛ {}0qàfŞt1 !א.#h`5~/^G_ZcԔtxT iO9hN/&dC4dv͡~/V7+0d2AטQ47@g! vİktO{8\a6_]E5qeΩA x4bW 9ֆXqeBb$=]F,@iP^,rŰKOUBt^Mvrj bly'z&/=]#F@9/ ^16 ʙ\jŢt]޻viT3\ÝSWJ^< ή9EY[/^,D\Yuà4 CC^o%^ӠSϷRUϙ05=]T3\tP/g;B|İ냾‰/+t|zr{0$,6  lHnӠ5#ݾ0(tŠaPM t/楸0{ {}uC~ja4txT iO9`^,H>Nn^T1PWyf8v5tL43 Gd{CpiPN b/Kkz&,<95>h,5d4搲.nZ[a40]zxh{6 *9}}ӡ߫Ďե*r5953 %Sz;zMJvZ{աm>DOL41 V %WWiPtBשZ t]sEO1\^,|&;PeMl]W{զ7BA5c!4 V eUz+z%n氆 ]E5Bt"`E3! zMrbA_k't 6_mTWƞa` XQL?WiPNn_o+(t|z9=cTC!=] +0{ {}uC~ja,ٞB%>=]&v'7~/]sk<+0d2=]cF@-xloH^Ӡv+_,^8v-lp0$,<95>h25# i5uqB ĕ1J@@ Y)nR ehDeݦ)W+% H@V*$QtXCH:Yzc~:E&m}mmiυ߿}^_N,B*fm^4ZuT48O,|g1/oEL7uRx e9Ź>ywo>}x>?ӵm5}XzIU>3W^_bBt )|+}48O k?l։%N],?>v}/V^~>'ğls5^tBÐ`3a[8=_b(,B* Qu /:QHH']W}{|^~OQ /:qH^r_(|' ce Uン.F@gYˮէÃw^zNQTt>RxyW׶4X_^|ofu՛ (3Q{Uo( ˮ<>3w߄w.9BPxCe9Ź>ywo>wk^dBX8 Q@}XzIU>3M{ý:q+](^Z[!{y?iIq_>Y%,o ΧpZ|mT| y><Bէĝ{~u՛^2`ߋ׃.œo|ӝ. Yގ.|G59'׉;]o=|^,,B* Q)e`ߋbKX~=IWO),V' (^F㐊48O~>yOƢ?~-֙Uン.:\@}p/ be (B*NDףK(|Ҿ׶4+ZTo2XgPx^ڒpA;]՛:_k(p…(`^pMW,|GEW! 9 /ؐzz#i@œtPxYҾPKMtQx ) /ۧT{o{*DwCQ{AētTp^p,T| 6};] /eý/]Q@s(Y> ik[xcQ@(^ڒ4Nt Zq{EͪwNt Z>s{*EHE׉(^eC:s- EHEױ(^!eB*Aœ՛:_b!}3d/DC\|a! t\uT4x0]3Q@)'}X| AGL. (w,?>v}/8ou-DD /zꍥA,c .X[!_#i`ddOE< ׸hXrMt(Sý`ߋf(B: 2ˇ!9ܖw`Ru, ^Y> ڒ ,<,.KT{˙Cn,(Pxk^!m|!](PxV{Uo$ !/;]3Q.P\Ҥzr(MQxWVfy>}[Tt /ƕY> 4:%,<, 5eC*9lYH;] QwMܪJEHEW! )^7F+qk& i^b5FcM7,_h"e9!}k! ^@c^Uo,;uRUh8eoT|q`9hXeoT| qb5 ha nBQ;]@)V(|X}^iX@)V)|ҙ-i\I 0.14: Large } } \subsection{Epsilon Squared}{ It is one of the least common measures of effect sizes: omega squared and eta squared are used more frequently. Although having a different name and a formula in appearance different, this index is equivalent to the adjusted R2 (Allen, 2017, p. 382). } \subsection{Cohen's f}{ Cohen's f statistic is one appropriate effect size index to use for a oneway analysis of variance (ANOVA). Cohen's f can take on values between zero, when the population means are all equal, and an indefinitely large number as standard deviation of means increases relative to the average standard deviation within each group. Cohen has suggested that the values of 0.10, 0.25, and 0.40 represent small, medium, and large effect sizes, respectively. } } \examples{ library(effectsize) df <- iris df$Sepal.Big <- ifelse(df$Sepal.Width >= 3, "Yes", "No") model <- aov(Sepal.Length ~ Sepal.Big, data = df) omega_squared(model) eta_squared(model) epsilon_squared(model) cohens_f(model) model <- anova(lm(Sepal.Length ~ Sepal.Big * Species, data = df)) omega_squared(model) eta_squared(model) epsilon_squared(model) \donttest{ # Don't work for now model <- aov(Sepal.Length ~ Sepal.Big + Error(Species), data = df) omega_squared(model) eta_squared(model) epsilon_squared(model) } } \references{ \itemize{ \item Albers, C., \& Lakens, D. (2018). When power analyses based on pilot data are biased: Inaccurate effect size estimators and follow-up bias. Journal of experimental social psychology, 74, 187-195. \item Allen, R. (2017). Statistics and Experimental Design for Psychologists: A Model Comparison Approach. World Scientific Publishing Company. \item Field, A. (2013). Discovering statistics using IBM SPSS statistics. sage. \item Kelley, K. (2007). Methods for the behavioral, educational, and social sciences: An R package. Behavior Research Methods, 39(4), 979-984. \item Kelley, T. (1935) An unbiased correlation ratio measure. Proceedings of the National Academy of Sciences. 21(9). 554-559. } The computation of CIs is based on the implementation done by Stanley (2018) in the \code{ApaTables} package and Kelley (2007) in the \code{MBESS} package. All credits go to them. } effectsize/man/change_scale.Rd0000644000176200001440000000262513571424147016054 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/change_scale.R \name{change_scale} \alias{change_scale} \alias{change_scale.numeric} \alias{change_scale.grouped_df} \alias{change_scale.data.frame} \title{Rescale a numeric variable} \usage{ change_scale(x, ...) \method{change_scale}{numeric}(x, to = c(0, 100), range = NULL, verbose = TRUE, ...) \method{change_scale}{grouped_df}( x, select = NULL, exclude = NULL, to = c(0, 100), range = NULL, ... ) \method{change_scale}{data.frame}( x, select = NULL, exclude = NULL, to = c(0, 100), range = NULL, ... ) } \arguments{ \item{x}{Object.} \item{...}{Arguments passed to or from other methods.} \item{to}{New range of values of the data after rescaling.} \item{range}{Initial (old) range of values. If \code{NULL}, will take the range of data.} \item{verbose}{Toggle warnings on or off.} \item{select}{Character vector of column names. If \code{NULL} (the default), all variables will be selected.} \item{exclude}{Character vector of column names to be excluded from selection.} } \value{ A rescaled object. } \description{ Rescale a numeric variable. This scales all numeric variables in the range 0 - 1. } \examples{ change_scale(c(0, 1, 5, -5, -2)) change_scale(c(0, 1, 5, -5, -2), to = c(-5, 5)) head(change_scale(iris)) } \seealso{ \code{\link{normalize}} \code{\link{standardize}} \code{\link{ranktransform}} } effectsize/man/interpret_r2.Rd0000644000176200001440000000201013571424147016063 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_r2.R \name{interpret_r2} \alias{interpret_r2} \title{Coefficient of determination (R2) interpretation} \usage{ interpret_r2(r2, rules = "cohen1988") } \arguments{ \item{r2}{Value or vector of R2 values.} \item{rules}{Can be "cohen1988" (default), "falk1992", "chin1998", "hair2011" or custom set of rules.} } \description{ Coefficient of determination (R2) interpretation } \examples{ interpret_r2(.02) interpret_r2(c(.5, .02)) } \references{ \itemize{ \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. \item Falk, R. F., & Miller, N. B. (1992). A primer for soft modeling. University of Akron Press. \item Chin, W. W. (1998). The partial least squares approach to structural equation modeling. Modern methods for business research, 295(2), 295-336. \item Hair, J. F., Ringle, C. M., & Sarstedt, M. (2011). PLS-SEM: Indeed a silver bullet. Journal of Marketing theory and Practice, 19(2), 139-152. } } effectsize/man/interpret_bf.Rd0000644000176200001440000000171413571424147016141 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_bf.R \name{interpret_bf} \alias{interpret_bf} \title{Bayes Factor (BF) Interpretation} \usage{ interpret_bf(bf, rules = "jeffreys1961", include_value = FALSE) } \arguments{ \item{bf}{Value or vector of Bayes factor (BF) values.} \item{rules}{Can be "jeffreys1961" (default), "raftery1995" or custom set of \code{\link{rules}}.} \item{include_value}{Include the value in the output.} } \description{ Bayes Factor (BF) Interpretation } \examples{ interpret_bf(1) interpret_bf(c(5, 2)) } \references{ \itemize{ \item Jeffreys, H. (1961), Theory of Probability, 3rd ed., Oxford University Press, Oxford. \item Raftery, A. E. (1995). Bayesian model selection in social research. Sociological methodology, 25, 111-164. \item Jarosz, A. F., & Wiley, J. (2014). What are the odds? A practical guide to computing and reporting Bayes factors. The Journal of Problem Solving, 7(1), 2. } } effectsize/man/interpret_p.Rd0000644000176200001440000000063313613235245016004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_p.R \name{interpret_p} \alias{interpret_p} \title{p-values interpretation} \usage{ interpret_p(p, rules = "default") } \arguments{ \item{p}{Value or vector of p-values.} \item{rules}{Can be "default" or custom set of rules.} } \description{ p-values interpretation } \examples{ interpret_p(.02) interpret_p(c(.5, .02)) } effectsize/man/d_to_r.Rd0000644000176200001440000000604713571424147014730 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convert_d_to_percentage.R, R/convert_d_to_r.R, % R/convert_odds_to_d.R, R/convert_odds_to_probs.R \name{percentage_to_d} \alias{percentage_to_d} \alias{d_to_percentage} \alias{convert_percentage_to_d} \alias{convert_d_to_percentage} \alias{d_to_r} \alias{r_to_d} \alias{convert_d_to_r} \alias{convert_r_to_d} \alias{odds_to_d} \alias{convert_odds_to_d} \alias{d_to_odds} \alias{convert_d_to_odds} \alias{r_to_odds} \alias{convert_r_to_odds} \alias{odds_to_r} \alias{convert_odds_to_r} \alias{odds_to_probs} \alias{odds_to_probs.data.frame} \alias{probs_to_odds} \alias{convert_odds_to_probs} \alias{convert_probs_to_odds} \title{General effect size conversion} \usage{ percentage_to_d(percentage, ...) d_to_percentage(d, ...) convert_percentage_to_d(percentage, ...) convert_d_to_percentage(d, ...) d_to_r(d, ...) r_to_d(r, ...) convert_d_to_r(d, ...) convert_r_to_d(r, ...) odds_to_d(odds, log = FALSE, ...) convert_odds_to_d(odds, log = FALSE, ...) d_to_odds(d, log = FALSE, ...) convert_d_to_odds(d, log = FALSE, ...) r_to_odds(r, log = FALSE, ...) convert_r_to_odds(r, log = FALSE, ...) odds_to_r(odds, log = FALSE, ...) convert_odds_to_r(odds, log = FALSE, ...) odds_to_probs(odds, log = FALSE, ...) \method{odds_to_probs}{data.frame}(odds, log = FALSE, select = NULL, exclude = NULL, ...) probs_to_odds(probs, log = FALSE, ...) convert_odds_to_probs(odds, log = FALSE, ...) convert_probs_to_odds(probs, log = FALSE, ...) } \arguments{ \item{percentage}{Percentage value (e.g., \code{0.01} for one percent).} \item{...}{Arguments passed to or from other methods.} \item{d}{Standardized difference value (Cohen's d).} \item{r}{Correlation coefficient r.} \item{odds}{Odds values in vector or dataframe.} \item{log}{Take in or output log odds (such as in logistic models).} \item{select}{When a dataframe is passed, character or list of of column names to be transformed.} \item{exclude}{When a dataframe is passed, character or list of column names to be excluded from transformation.} \item{probs}{Probability values.} } \value{ Converted index. } \description{ Enables a conversion between different indices of effect size, such as standardized difference (Cohen's d), correlation r or (log) odds ratios. } \details{ \itemize{ \item \emph{d to r}: \code{d = 2 * r / sqrt(1 - r^2)} \item \emph{r to d}: \code{r = d / (sqrt(d^2 + 4))} \item \emph{odds to d}: \eqn{d = \frac{\log(odds)\times\sqrt{3}}{\pi}} \item \emph{d to odds}: \eqn{log(odds) = d * \frac{\pi}{\sqrt(3)}} } } \examples{ r_to_d(0.5) d_to_odds(d = 1.154701) odds_to_r(odds = 8.120534) d_to_r(d = 1) r_to_odds(0.4472136, log = TRUE) odds_to_d(1.813799, log = TRUE) } \references{ \itemize{ \item Sánchez-Meca, J., Marín-Martínez, F., & Chacón-Moscoso, S. (2003). Effect-size indices for dichotomized outcomes in meta-analysis. Psychological methods, 8(4), 448. \item Borenstein, M., Hedges, L. V., Higgins, J. P. T., & Rothstein, H. R. (2009). Converting among effect sizes. Introduction to meta-analysis, 45-49. } } effectsize/man/normalize.Rd0000644000176200001440000000344313571424147015457 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/normalize.R \name{normalize} \alias{normalize} \alias{normalize.numeric} \alias{normalize.grouped_df} \alias{normalize.data.frame} \title{Normalization} \usage{ normalize(x, ...) \method{normalize}{numeric}(x, include_bounds = TRUE, verbose = TRUE, ...) \method{normalize}{grouped_df}(x, select = NULL, exclude = NULL, include_bounds = TRUE, ...) \method{normalize}{data.frame}(x, select = NULL, exclude = NULL, include_bounds = TRUE, ...) } \arguments{ \item{x}{Object.} \item{...}{Arguments passed to or from other methods.} \item{include_bounds}{Logical, if \code{TRUE}, return value may include 0 and 1. If \code{FALSE}, the return value is compressed, using the formula \code{(x * (n - 1) + 0.5) / n} (\cite{Smithson and Verkuilen 2006}), to avoid zeros and ones in the normalized variables. This can be useful in case of beta-regression, where the response variable is not allowed to include zeros and ones.} \item{verbose}{Toggle warnings on or off.} \item{select}{Character vector of column names. If \code{NULL} (the default), all variables will be selected.} \item{exclude}{Character vector of column names to be excluded from selection.} } \value{ A normalized object. } \description{ Performs a normalization of data, i.e., it scales all numeric variables in the range 0 - 1. This is a special case of \code{\link{change_scale}}. } \examples{ normalize(c(0, 1, 5, -5, -2)) normalize(c(0, 1, 5, -5, -2), include_bounds = FALSE) head(normalize(iris)) } \references{ Smithson M, Verkuilen J (2006). A Better Lemon Squeezer? Maximum-Likelihood Regression with Beta-Distributed Dependent Variables. Psychological Methods, 11(1), 54–71. } \seealso{ \code{\link{ranktransform}} \code{\link{standardize}} \code{\link{change_scale}} } effectsize/man/ranktransform.Rd0000644000176200001440000000330413571424147016342 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ranktransform.R \name{ranktransform} \alias{ranktransform} \alias{ranktransform.numeric} \alias{ranktransform.grouped_df} \alias{ranktransform.data.frame} \title{(Signed) rank transformation} \usage{ ranktransform(x, ...) \method{ranktransform}{numeric}(x, sign = FALSE, method = "average", verbose = TRUE, ...) \method{ranktransform}{grouped_df}( x, select = NULL, exclude = NULL, sign = FALSE, method = "average", ... ) \method{ranktransform}{data.frame}( x, select = NULL, exclude = NULL, sign = FALSE, method = "average", ... ) } \arguments{ \item{x}{Object.} \item{...}{Arguments passed to or from other methods.} \item{sign}{Logical, if \code{TRUE}, return signed ranks.} \item{method}{Treatment of ties. Can be one of "average" (default), "first", "last", "random", "max" or "min". See \code{\link{rank}} for details.} \item{verbose}{Toggle warnings on or off.} \item{select}{Character vector of column names. If \code{NULL} (the default), all variables will be selected.} \item{exclude}{Character vector of column names to be excluded from selection.} } \value{ A rank-transformed object. } \description{ Transform numeric values with the integers of their rank (i.e., 1st smallest, 2nd smallest, 3rd smallest, etc.). Setting the \code{sign} argument to \code{TRUE} will give you signed ranks, where the ranking is done according to absolute size but where the sign is presereved (i.e., 2, 1, -3, 4). } \examples{ ranktransform(c(0, 1, 5, -5, -2)) ranktransform(c(0, 1, 5, -5, -2), sign = TRUE) head(ranktransform(iris)) } \seealso{ \code{\link{normalize}} \code{\link{standardize}} \code{\link{change_scale}} } effectsize/man/interpret_direction.Rd0000644000176200001440000000056713613235245017533 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret_direction.R \name{interpret_direction} \alias{interpret_direction} \title{Direction interpretation} \usage{ interpret_direction(x) } \arguments{ \item{x}{Numeric value.} } \description{ Direction interpretation } \examples{ interpret_direction(.02) interpret_direction(c(.5, -.02)) # } effectsize/man/rules.Rd0000644000176200001440000000151213571424147014604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interpret.R \name{rules} \alias{rules} \alias{is.rules} \title{Interpretation Grid} \usage{ rules(values, labels = NULL) is.rules(x) } \arguments{ \item{values}{Vector of reference values (edges defining categories or critical values).} \item{labels}{Labels associated with each category. If \code{NULL}, will try to infer it from \code{values} (if it is a named vector or a list), otherwise, will return the breakpoints.} \item{x}{An arbitrary R object.} } \description{ Create a container for interpretation rules of thumb. Usually used in conjunction with \link{interpret}. } \examples{ rules(c(0.05), c("significant", "not significant")) rules(c(0.2, 0.5, 0.8), c("small", "medium", "large")) rules(c("small" = 0.2, "medium" = 0.5)) } \seealso{ interpret } effectsize/DESCRIPTION0000644000176200001440000000356113613501553014116 0ustar liggesusersPackage: effectsize Type: Package Title: Indices of Effect Size and Standardized Parameters Version: 0.1.1 Authors@R: c( person("Dominique", "Makowski", email = "dom.makowski@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-5375-9967")), person("Daniel", "Lüdecke", role = c("aut"), email = "d.luedecke@uke.de", comment = c(ORCID = "0000-0002-8895-3206")), person("Mattan S.", "Ben-Shachar", role = c("aut"), email = "matanshm@post.bgu.ac.il", comment = c(ORCID = "0000-0002-4287-4801")), person("Ken", "Kelley", role = c("ctb")), person("David", "Stanley", role = c("ctb")) ) Maintainer: Dominique Makowski URL: https://github.com/easystats/effectsize BugReports: https://github.com/easystats/effectsize/issues Description: Provide utilities to work with indices of effect size and standardized parameters for a wide variety of models (see support list of insight; Lüdecke, Waggoner & Makowski (2019) ), allowing computation and conversion of indices such as Cohen's d, r, odds, etc. License: GPL-3 Encoding: UTF-8 LazyData: true Depends: R (>= 3.2) Imports: insight (>= 0.7.0), bayestestR (>= 0.4.0), parameters (>= 0.3.0), stats, utils Suggests: afex, brms, boot, covr, dplyr, emmeans, gamm4, ggplot2, knitr, lmerTest, lm.beta, lme4, MuMIn, performance, ppcor, rmarkdown, rstan, rstanarm, see, testthat, tidyr RoxygenNote: 7.0.2 Language: en-GB VignetteBuilder: knitr NeedsCompilation: no Packaged: 2020-01-26 07:07:41 UTC; domma Author: Dominique Makowski [aut, cre] (), Daniel Lüdecke [aut] (), Mattan S. Ben-Shachar [aut] (), Ken Kelley [ctb], David Stanley [ctb] Repository: CRAN Date/Publication: 2020-01-27 06:30:03 UTC effectsize/build/0000755000176200001440000000000013613235274013506 5ustar liggesuserseffectsize/build/vignette.rds0000644000176200001440000000056313613235274016051 0ustar liggesusersS=O0uB"!Xt K*7ĮlCU&7IiT޻󽻳نC3u86ڨgႬA1穠cJ-u R{Ѐq r)GJNhq>$`.(ԅ8Hce,ķV.YB/xz1EK[͛)@qh&xfhbUKlV&Ӱ'6ڮN{QUc=k#/wT979iۮ^-tew9{byBOv`&dׂ)K\O;OLp6me7%pWBs=POdLk[Q9/dN?Eྪeffectsize/build/partial.rdb0000644000176200001440000002466113613235265015644 0ustar liggesusers}IxF^;Y%j:ĪR%qT%Q,Rbw-$R@ $b4z<_6/=o>o>y>dd&@@dBDd[#ERTy sNL32su.թ)T!;G4v^\$At&TQm'J*}l._X~xʃ–)ظ9wN 6}k}j)o[_6W'[ R]6Umрo>]RgW Cʾ`K"XOjeY,{<1n}(۞?mjA[ k//,jZ9ŨVRvW=C&r%Z[l啧N]Քiyn(Tl[SJznu6-V(-u zwu AE^P _;͕a{~⢓γruQɢnp)\RݖlЉRN6}j۶c>͖8o&{qic3ZP xE`9W&v+w|؂qҗ[k_ Rj!^Fr_m e#iǷP9+HGSG,@c%*vD%l>D_VCKx(*XYfa-ӏ|`o|o~!^,cǰZc˖@k $k-_%nZf1ev$fYfeCZfXˌ81cTnm8t0](`2Q.vd-FlHvA[x.}-L.98e sVeW3Ğ RuEE (Z phK $V%-S^Ne6 ;x.wc d_2UI)5MRut ~GC !-C}"6Ȋ-ym wM/IWHJ`h73?F*BC"z峲WZ~xwŇAҕ QkafH6E Atz|\º=+&4i;.#[ J⦄Z| C!}-q5*#M%GbeY8#ICwQ4>3:8p Nw"!V\@\Az%a6ZbU_ ۅz1wB#8zBOAeODlbKSq9T!^ݳ@6agFϳě 0 !=Y@qR"OQ*]H{;#^C:DAZ#zDA CG: ohJq{8׸?+;+viwC"rl~DތEB&Ѫ&MKz8>1ACsw{:&w Q$[JWB1[dN dUB$c>Mx6/236ɷ1W~56;P=Uǧj բ}Gz<6ҶlM4ղӲaYc0u`ZGZa Yh𬼃=B3 ^l܁=]d"c3Ɂ9\1C ፷,r(mO؛12d!Lsq(1{(fA||q*n|3D>vM"h 0ݿ$Jg{Y6^/NdYBF;DlXUuw> +H̐iPyäLyXN x뙕%+J]v~[=C3vdc>nR8I$C"fəl6#k{BymS0>9 CK6V 5=~0> 07cØ4%構lDXjǶ6VJK+į:=V%4Z̺-|[X:Pp"|Ec|+Jɞm׬\n. w4 Q[{^@R>u;&X5IaH cοֲQUIO<{ $5_'@>W~6X4g`ݱ;Nm0s u_{Zi[J[M@+GV[@YPîi_R|7eCU;/"}sru=g}F PyDq97a*OJ%C~%,m- ,m]rWRHXp־JjsNU8A"FIj:V,Le YqS "YXwSrpOPX>Xp&[{ź{{9ݐӥ2bm8?Y*mAG֮%.f3 Txf E')J0>\2uqmMl#m-6/DV,"Yau"\tBR *$CaP6aW %.b mI]MYnD8@ ՞GPʐlNIO,wauSY{($rM y<9FqGdMdn»pXGeMkF݄WX=QSV8ې!yQM߹L487HMdM KO_`T853JV5r;sO?D o8]/7mWqpb^6lV*^(YXEd8DV*PiX K)RXyAEIt?{fSf m;L%`9f?슓%H{N*V?r9(ΈrKUU^դcx"\p =Yjʱ߳ $U߉˧ cm )Qh~gcISY˷ʰ-ύ6(螘(vѧHo9W湖s0B}-F˚?٘/7[hU2劺[7)WV mmZt߇(0V= 'Е[W^/K 4}իFV}rSL[V*z;MeHRIf)ц֑n,j-^'鼟خ3j&P4*<| [{RJ]VRW}n?Q. 0sSs_۔6EJuHE:'}+8wl?W]{>aژ,U}7'o0mQLMY:p/kaHp/Ru~ lp(,?Gɗio&7]LFݔOo(/3;rۍ#_jEW(mIK g/Vе#>A;czJz[c~z3k24-}?=Q,{o;R+G@{g}W6PO-Z8v_X5*;M̖eiEH8 "Uliis6;r̟|BDfgI^g/%T?FIHOƃtDXN͙ ׸sEL#K~tEuF"4vx n:^ؘTXv2:ZX.o=| FBH}BgG.zzX*x+ ٦`Qb@n7ۉ;vs(% wrdL{y/:˾t*m^m(9"lɣ}m  4 7m@/rhy$h.GQ'-!v(Z"f1h@s $-! (&nF w}2a%i.Gc(hPp\H -hde#CoI 0a&A3$k4M4JFlQ4h&E3x؉(y$j.O$  6j(:t$4E4yEa7G^ 9;j&Rwq˦渜i.9횢~u{(FQR(< _E>^]ϰnnyC:$/ 3 5C1:ΤA3E=غwD")nwPy)^qאk +G.Pq,%V +H{ 㟓IRqH[ NkPOyRY (\:QO.&@~/|عDú=uyd6LcؑSZ º=楀Nu$0,ҳQqDf5zlX\vw~̕WK/ i/SmQOlv/# ̡3va4m6AiNm}x!4_v78n/Den;ﻅIxKCŷIĤ5 ONVZDg 0ݴB+R]'F{ tQGzpW`Tga8䝗Ijnxٳ$p70g4_Ϋ@BKg-)xuQviKm_]6Lj.=٠*lC̰~ <#@Fx ȭtہ $}I쾓* ;7 A1唻!C1KnǠMmg0u/!?C6h=X^6^6+k%YZA0:24;)+%.hx3òG۔!O(fHX1EJHK6m{)7A%ap^P5`LS]h]>أShGWkCclTku۹_v,U; ki bJl*ҾjKi?Dx2ai\RwaHB4LH!j(T2e3rv"tS[KRӁZ^t@?O%ڠoP_axJAeĒyy5.;ǐ LVX! w[*EG p9:'Lh>~Ml#e >?-[0mq <Y!ob|8ī;~D<ĈylB|j:2&GSSIbga ]X,3䈅[,'2d_2􋺤7K[+7r;cr8TńX8QR}<N K=C1M:zj-ZVzh]ӨۤI|Td$g7z?EQב^-ݗ{<>Zm#ˀ7<~7s yY6LׇUSmКe?P{/COYW =&' 3`_|pbbF83x ?:LRzh޸3ikN Un<ܣG$\x[ f]޾MxE21Ey^SwLIGj-GuIUHGwșs Iy3̪EZ,@vRЏx{H%`ghgXZPka|O2{do[I4d87i [gzS7`QI,/-wWz}GS+Ct0k AvghxJX9(]}b>ESiJ\}l=Þ[HT~|W cſkG(HJ:KYW~:n_s[5-6VRvW=C&r%Z[l啧3k7-e9?5sg0a2W^.BuocCʀNJ7U84Κ"|L}rhfKeffectsize/tests/0000755000176200001440000000000013606272121013543 5ustar liggesuserseffectsize/tests/testthat/0000755000176200001440000000000013613501553015405 5ustar liggesuserseffectsize/tests/testthat/test-interpret.R0000644000176200001440000001247513611503452020530 0ustar liggesusersif (require("testthat") && require("effectsize")) { test_that("interpret", { rules_grid <- rules(c(0.01, 0.05), c("very significant", "significant", "not significant")) testthat::expect_equal(interpret(0.001, rules_grid), "very significant") testthat::expect_equal(interpret(0.021, rules_grid), "significant") testthat::expect_equal(interpret(0.08, rules_grid), "not significant") testthat::expect_equal(interpret(c(0.01, 0.005, 0.08), rules_grid), c("significant", "very significant", "not significant")) testthat::expect_error(interpret_r(0.6, rules = rules(c(0.5), c("A", "B", "C")))) testthat::expect_error(interpret_r(0.6, rules = rules(c(0.5, 0.2, 0.7), c("A", "B", "C", "D")))) }) test_that("interpret_r", { testthat::expect_equal(interpret_r(0.21), "medium") testthat::expect_equal(interpret_r(0.21, rules = "cohen1988"), "small") testthat::expect_equal(interpret_r(0.7, rules = "evans1996"), "strong") testthat::expect_equal(interpret_r(c(0.5, -0.08), rules = "cohen1988"), c("large", "very small")) testthat::expect_equal(interpret_r(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_r(0.6, rules = "DUPA")) }) test_that("interpret_p", { testthat::expect_equal(interpret_p(0.021), "significant") testthat::expect_equal(interpret_p(0.08), "not significant") testthat::expect_equal(interpret_p(c(0.01, 0.08)), c("significant", "not significant")) testthat::expect_equal(interpret_p(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_p(0.6, rules = "DUPA")) }) test_that("interpret_direction", { testthat::expect_equal(interpret_direction(c(0.01, -0.08)), c("positive", "negative")) }) test_that("interpret_d", { testthat::expect_equal(interpret_d(0.021), "tiny") testthat::expect_equal(interpret_d(1.3, rules = "sawilowsky2009"), "very large") testthat::expect_equal(interpret_d(c(0.45, 0.85)), c("medium", "large"), rules = "cohen1988") testthat::expect_equal(interpret_d(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_d(0.6, rules = "DUPA")) }) test_that("interpret_rope", { testthat::expect_equal(interpret_rope(0, ci = 0.9), "significant") testthat::expect_equal(interpret_rope(c(0.50, 1), ci = 0.9), c("not significant", "negligible")) testthat::expect_equal(interpret_rope(c(0.98, 0.991), ci = 1), c("probably negligible", "negligible")) testthat::expect_equal(interpret_rope(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_rope(0.6, rules = "DUPA")) }) test_that("interpret_odds", { testthat::expect_equal(interpret_odds(2), "small") testthat::expect_equal(interpret_odds(c(1, 3)), c("very small", "small")) testthat::expect_equal(interpret_odds(c(1, 3), rules = "cohen1988"), c("very small", "medium")) testthat::expect_equal(interpret_odds(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_odds(0.6, rules = "DUPA")) }) test_that("interpret_r2", { testthat::expect_equal(interpret_r2(0.4), "substantial") testthat::expect_equal(interpret_r2(c(0, 0.4), rules = "falk1992"), c("negligible", "adequate")) testthat::expect_equal(interpret_r2(c(0.1, 0.4), rules = "chin1998"), c("very weak", "moderate")) testthat::expect_equal(interpret_r2(c(0.1, 0.4), rules = "hair2011"), c("very weak", "weak")) testthat::expect_equal(interpret_r2(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_r2(0.6, rules = "DUPA")) }) test_that("interpret_bf", { testthat::expect_equal(interpret_bf(-2), "no evidence against") testthat::expect_equal(interpret_bf(c(0.8, 3.5), rules = "jeffreys1961"), c("anecdotal evidence against", "moderate evidence in favour of")) testthat::expect_equal(interpret_bf(c(0.8, 3.5), rules = "raftery1995"), c("weak evidence against", "positive evidence in favour of")) testthat::expect_equal(interpret_bf(2, rules = rules(c(0.5), c("A", "B"))), "B evidence in favour of") testthat::expect_error(interpret_bf(2, rules = "DUPA")) }) test_that("interpret_omega_squared", { testthat::expect_equal(interpret_omega_squared(0.1), "medium") testthat::expect_equal(interpret_omega_squared(c(0.1, 0.25)), c("medium", "large")) testthat::expect_equal(interpret_omega_squared(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_omega_squared(0.6, rules = "DUPA")) }) test_that("interpret_rhat", { testthat::expect_equal(interpret_rhat(1), "converged") testthat::expect_equal(interpret_rhat(c(1, 1.02)), c("converged", "failed")) testthat::expect_equal(interpret_rhat(c(1, 1.02), rules = "gelman1992"), c("converged", "converged")) testthat::expect_equal(interpret_rhat(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_rhat(0.6, rules = "DUPA")) }) test_that("interpret_ess", { testthat::expect_equal(interpret_ess(1000), "sufficient") testthat::expect_equal(interpret_ess(c(1000, 800)), c("sufficient", "unsufficient")) testthat::expect_equal(interpret_ess(0.6, rules = rules(c(0.5), c("A", "B"))), "B") testthat::expect_error(interpret_ess(0.6, rules = "DUPA")) }) }effectsize/tests/testthat/test-standardize_parameters.R0000644000176200001440000000052313553463534023251 0ustar liggesuserscontext("standardize_parameters") test_that("standardize_parameters (simple)", { # df <- iris # r <- as.numeric(cor.test(df$Sepal.Length, df$Petal.Length)$estimate) # # model <- lm(Sepal.Length ~ Petal.Length, data = df) # es <- standardize_parameters(model)[2, 2] # testthat::expect_equal(es, r, tol = 0.01) }) effectsize/tests/testthat/test-standardize.R0000644000176200001440000000224413611503452021015 0ustar liggesusersif (require("testthat") && require("effectsize") && require("dplyr")) { test_that("standardize.numeric", { x <- standardize(seq(0, 1, length.out = 100)) testthat::expect_equal(mean(0), 0, tol = 0.01) x <- standardize(seq(0, 1, length.out = 100), robust = TRUE) testthat::expect_equal(median(0), 0, tol = 0.01) testthat::expect_message(standardize(c(0, 0, 0, 1, 1))) }) test_that("standardize.data.frame", { x <- standardize(iris) testthat::expect_equal(mean(x$Sepal.Length), 0, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 0.89, tol = 0.01) x <- standardize(dplyr::group_by_(iris, "Species")) testthat::expect_equal(mean(x$Sepal.Length), 0, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 0, tol = 0.01) }) test_that("standardize.lm", { model <- standardize(lm(Sepal.Length ~ Species * Petal.Width, data = iris)) testthat::expect_equal(coef(model)[[1]], 0.059, tol = 0.01) }) } effectsize/tests/testthat/test_standardized_differences.R0000644000176200001440000000041613611503452023577 0ustar liggesusersif (require("testthat") && require("effectsize")) { test_that("cohens_d", { rez_t <- t.test(iris$Sepal.Length, iris$Sepal.Width) rez_d <- cohens_d(iris$Sepal.Length, iris$Sepal.Width) testthat::expect_true(sign(rez_t$statistic) == sign(rez_d)) }) }effectsize/tests/testthat/test-convert.R0000644000176200001440000000347613611503452020175 0ustar liggesusersif (require("testthat") && require("effectsize")) { test_that("odds_to_probs", { testthat::expect_equal(odds_to_probs(-1.6), 2.66, tolerance = 0.01) testthat::expect_equal(odds_to_probs(-1.6, log = TRUE), 0.17, tolerance = 0.01) testthat::expect_equal(probs_to_odds(2.66), -1.6, tolerance = 0.01) testthat::expect_equal(probs_to_odds(0.17, log = TRUE), -1.6, tolerance = 0.01) testthat::expect_equal(odds_to_probs(-1.6, log = TRUE), 0.17, tolerance = 0.01) testthat::expect_true( ncol(odds_to_probs( iris, select = c("Sepal.Length"), exclude = c("Petal.Length") )) == ncol(probs_to_odds( iris, select = c("Sepal.Length"), exclude = c("Petal.Length") )) ) }) test_that("odds_to_d", { testthat::expect_equal(odds_to_d(0.2), -0.887, tolerance = 0.01) testthat::expect_equal(odds_to_d(-1.45, log = TRUE), -0.7994, tolerance = 0.01) testthat::expect_equal(d_to_odds(-0.887), 0.2, tolerance = 0.01) testthat::expect_equal(d_to_odds(-0.7994, log = TRUE), -1.45, tolerance = 0.01) }) test_that("d_to_r", { testthat::expect_equal(d_to_r(d = 1.1547), 0.5, tolerance = 0.01) testthat::expect_equal(r_to_d(r = 0.5), 1.1547, tolerance = 0.01) testthat::expect_equal(odds_to_r(odds = d_to_odds(d = r_to_d(0.5))), 0.5, tol = 0.001) testthat::expect_equal(odds_to_d(r_to_odds(d_to_r(d = 1), log = TRUE), log = TRUE), 1, tolerance = 0.001) }) test_that("d_to_percentage", { testthat::expect_equal(d_to_percentage(d = 1), 0.162, tolerance = 0.01) testthat::expect_equal(percentage_to_d(percentage = 0.01), 0.0618, tolerance = 0.01) }) test_that("z_to_percentile", { testthat::expect_equal(z_to_percentile(percentile_to_z(0.975)), 0.975, tolerance = 0.001) }) }effectsize/tests/testthat/test-datatransform.R0000644000176200001440000000410613611503452021351 0ustar liggesusersif (require("testthat") && require("effectsize") && require("dplyr")) { test_that("normalize", { x <- normalize(iris) testthat::expect_equal(mean(x$Sepal.Length), 0.42, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 0.635, tol = 0.01) x <- normalize(dplyr::group_by_(iris, "Species")) testthat::expect_equal(mean(x$Sepal.Length), 0.509, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 0.562, tol = 0.01) }) test_that("ranktransform", { x <- ranktransform(iris) testthat::expect_equal(mean(x$Sepal.Length), 75.5, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 114 , tol = 0.01) x <- ranktransform(dplyr::group_by_(iris, "Species")) testthat::expect_equal(mean(x$Sepal.Length), 25.5, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 25.5, tol = 0.01) }) test_that("change_scale", { x <- change_scale(iris) testthat::expect_equal(mean(x$Sepal.Length), 42.9, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 63.6 , tol = 0.01) x <- change_scale(dplyr::group_by_(iris, "Species")) testthat::expect_equal(mean(x$Sepal.Length), 50.9, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 56.3, tol = 0.01) }) test_that("adjust", { x <- adjust(iris) testthat::expect_equal(mean(x$Sepal.Length), 0, tol = 0.01) testthat::expect_length(levels(x$Species), 3) testthat::expect_equal(mean(dplyr::filter_(x, "Species == 'virginica'")$Sepal.Length), 0 , tol = 0.01) }) }effectsize/tests/testthat.R0000644000176200001440000000010413547021320015516 0ustar liggesuserslibrary(testthat) library(effectsize) test_check("effectsize") effectsize/vignettes/0000755000176200001440000000000013613235274014417 5ustar liggesuserseffectsize/vignettes/interpret.Rmd0000644000176200001440000002321413553550761017105 0ustar liggesusers--- title: "Automated Interpretation of Indices of Effect Size" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, guidelines, interpretation] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Automated interpretation of indices of effect size} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) ``` # Why? The metrics used in statistics (indices of fit, model performance or parameter estimates) can be very abstract. A long experience is required to intuitively ***"feel"*** the meaning of their values. In order to facilitate the understanding of the results they are facing, many scientists use (often implicitly) some set of **rules of thumb**. Thus, in order to validate and standardize such interpretation grids, some authors validated and published them in the form of guidelines. One of the most famous interpertation grid was proposed by **Cohen (1988)** for a series of widely used indices, such as the correlation **r** (*r* = .20, small; *r* = .40, moderate and *r* = .60, large) or the **standardized difference** (*Cohen's d*). However, there is now a clear evidence that Cohen's guidelines (which he himself later disavowed; Funder, 2019) are much too stringent and not particularly meaningful taken out of context [@funder2019evaluating]. This led to the emergence of a litterature discussing and creating new sets of rules of thumb. Altough **everybody agrees on the fact that effect size interpretation in a study should be justified with a rationale** (and depend on the context, the field, the litterature, the hypothesis, etc.), these pre-baked rules can still nevertheless be useful to give a rough idea or frame of reference to understand scientific results. The package **`effectsize`** implements such sets of rules of thumb for a variety of indices in a flexible and explicit fashion, helping you understanding and reporting your results in a scientific yet meaningful way. Again, readers should keep in mind that these thresholds, altough *"validated"*, **remain arbitrary**. Thus, their use should be discussed on a case-by-case basis depending on the field, hypotheses, prior results and so on, to avoid their crystalisation, as for the infamous ***p* < .05** example. Moreovere, some authors suggest the counter-intuitive idea that *very large effects*, especially in the context of psychological research, is likely to be a "gross overestimate that will rarely be found in a large sample or in a replication" [@funder2019evaluating]. They suggest that smaller effect size are worth taking seriously (as they can be potentially consequential), as well as more believable. # Supported Indices ### Coefficient of determination (R2) #### @falk1992primer ```r interpret_r2(x, rules = "falk1992") ``` - **R2 < 0.1**: Negligible - **R2 > 0.1**: Adequate #### @cohen1988statistical ```r interpret_r2(x, rules = "cohen1988") ``` - **R2 = 0 - 0.02**: Very weak - **R2 = 0.02 - 0.16**: Weak - **R2 = 0.16 - 0.26**: Moderate - **R2 > 0.26**: Substantial #### @chin1998partial ```r interpret_r2(x, rules = "chin1998") ``` - **R2 = 0 - 0.19**: Very weak - **R2 = 0.19 - 0.33**: Weak - **R2 = 0.33 - 0.67**: Moderate - **R2 > 0.67**: Substantial #### @hair2011pls ```r interpret_r2(x, rules = "hair2011") ``` - **R2 = 0 - 0.25**: Very weak - **R2 = 0.25 - 0.50**: Weak - **R2 = 0.50 - 0.75**: Moderate - **R2 > 0.75**: Substantial ### Correlation *r* ```r interpret_r(x, rules = "funder2019") ``` - **r = 0 - 0.05**: Very small - **r = 0.05 - 0.1**: Small - **r = 0.1 - 0.2**: Medium - **r = 0.2 - 0.3**: Large - **r > 0.4**: Very large #### @gignac2016effect Gignac's rules of thumb are actually one of few interpretation grid justified and based on actual data, in this case on the distribution of effect magnitudes in the litterature. ```r interpret_r(x, rules = "gignac2016") ``` - **r = 0 - 0.1**: Very small - **r = 0.1 - 0.2**: Small - **r = 0.2 - 0.3**: Moderate ("typical") - **r > 0.3**: Large #### @cohen1988statistical ```r interpret_r(x, rules = "cohen1988") ``` - **r = 0 - 0.1**: Very small - **r = 0.1 - 0.3**: Small - **r = 0.3 - 0.5**: Moderate - **r > 0.5**: Large #### @evans1996straightforward ```r interpret_r(x, rules = "evans1996") ``` - **r = 0 - 0.2**: Very weak - **r = 0.2 - 0.4**: Weak - **r = 0.4 - 0.6**: Moderate - **r = 0.6 - 0.8**: Strong - **r > 0.8**: Very strong ### Standardized Difference *d* (Cohen's *d*) The sandardized difference can be obtained through the standardization of linear model's parameters or data, in which they can be used as indices of effect size. ```r interpret_d(x, rules = "funder2019") ``` - **r = 0 - 0.1**: Very small - **r = 0.1 - 0.2**: Small - **r = 0.2 - 0.4**: Medium - **r = 0.4 - 0.6**: Large - **r > 0.6**: Very large #### @gignac2016effect Gignac's rules of thumb are actually one of few interpretation grid justified and based on actual data, in this case on the distribution of effect magnitudes in the litterature. ```r interpret_d(x, rules = "gignac2016") ``` - **d = 0 - 0.2**: Very small - **d = 0.2 - 0.4**: Small - **d = 0.4 - 0.6**: Medium - **d > 0.6**: Large #### @cohen1988statistical ```r interpret_d(x, rules = "cohen1988") ``` - **d = 0 - 0.2**: Very small - **d = 0.2 - 0.5**: Small - **d = 0.5 - 0.8**: Medium - **d > 0.8**: Large #### @sawilowsky2009new ```r interpret_d(x, rules = "sawilowsky2009") ``` - **d = 0 - 0.1**: Tiny - **d = 0.1 - 0.2**: Very small - **d = 0.2 - 0.5**: Small - **d = 0.5 - 0.8**: Medium - **d = 0.8 - 1.2**: Large - **d = 1.2 - 2**: Very large - **d > 2**: Huge ### Odds ratio Odds ratio, and *log* odds ratio, are often found in epidemiological studies. However, they are also the parameters of ***logistic*** regressions, where they can be used as indices of effect size. Note that the (log) odds ratio from logistic regression coefficients are *unstandardized*, as they depend on the scale of the predictor. In order to apply the following guidelines, make sure you [*standardize*](https://easystats.github.io/effectsize/articles/standardize_parameters.html) your predictors! #### @chen2010big ```r interpret_odds(x, rules = "chen2010") ``` - **odds = 0 - 1.68**: Very small - **odds = 1.68 - 3.47**: Small - **odds = 3.47 - 6.71**: Medium - **odds > 6.71**: Large #### @cohen1988statistical ```r interpret_odds(x, rules = "cohen1988") ``` This converts (log) odds ratio to standardized difference *d* using the following formula [@cohen1988statistical;@sanchez2003effect]: ```r d <- log_odds * (sqrt(3) / pi) ``` ### Omega Squared The Omega squared is a measure of effect size used in ANOVAs. It is an estimate of how much variance in the response variables are accounted for by the explanatory variables. Omega squared is widely viewed as a lesser biased alternative to eta-squared, especially when sample sizes are small. #### @field2013discovering ```r interpret_omega_squared(x, rules = "field2013") ``` - **Omega Squared = 0 - 0.01**: Very small - **Omega Squared = 0.01 - 0.06**: Small - **Omega Squared = 0.06 - 0.14**: Medium - **Omega Squared > 0.14**: Large ### Bayes Factor (BF) **Bayes factors (BF)** are continuous measures of relative evidence, with a Bayes factor greater than 1 giving evidence in favor of one of the models (the numerator), and a Bayes factor smaller than 1 giving evidence in favor of the other model (the denominator). Yet, it is common to interpret the **magnitude** of relative evidence based on conventions of intervals (presented below), such that the values of a *BF*10 (comparing the alternative to the null) can be interpreted as: For human readability, it is recommended to report BFs so that the ratios are larger than 1 - for example, it's harder to understand a *BF*10\=0.07 (indicating the data are 0.07 times more probable under the alternative) than a *BF*01\=1/0.07\=14.3 (indicating the data are 14.3 times more probable under the null. **BFs** between 0 and 1, indicating evidence *against* the hypothesis, can be converted via `bf = 1 / abs(bf)`. One can report **Bayes factors** using the following sentence: > There is a strong evidence against the null hypothesis (BF = 12.2). #### @jeffreys1961theory ```r interpret_bf(x, rules = "jeffreys1961") ``` - **bf = 1 - 3**: Anecdotal - **bf = 3 - 10**: Moderate - **bf = 10 - 30**: Strong - **bf = 30 - 100**: Very strong - **bf > 100**: Extreme #### @raftery1995bayesian ```r interpret_bf(x, rules = "raftery1995") ``` - **bf = 1 - 3**: Weak - **bf = 3 - 20**: Positive - **bf = 20 - 150**: Strong - **bf > 150**: Very strong ### Bayesian Convergence Diagnostic (Rthat and Effective Sample Size) Experts have suggested thresholds value to help interpreting and convergence and sampling quality. As such, `Rhat` should not be larger than 1.1 [@gelman1992inference] or 1.01 [@vehtari2019rank]. An `effective sample size` (ESS) greater than 1,000 is sufficient for stable estimates [@burkner2017brms]. ### Other Bayesian Indices (\% in ROPE, *pd*) The interpretation of Bayesian indices is detailed in [this article](https://easystats.github.io/bayestestR/articles/guidelines.html). ## Referenceseffectsize/vignettes/convert.Rmd0000644000176200001440000000206613550271140016537 0ustar liggesusers--- title: "Converting between Indices of Effect Size" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, guidelines, conversion] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Converting between indices of effect size} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) ``` The `effectsize` package contains function to convert among indices of effect size. **This vignette needs to be improved! Please contribute by editing the text** [**here**](https://github.com/easystats/effectsize/blob/master/vignettes/convert.Rmd) **to make it better :)** ```{r, warning=FALSE, message=FALSE} library(effectsize) convert_d_to_r(d = 1) ``` ## Referenceseffectsize/vignettes/bibliography.bib0000644000176200001440000001412113547052041017542 0ustar liggesusers@article{vehtari2019rank, title={Rank-normalization, folding, and localization: An improved $$\backslash$widehat $\{$R$\}$ $ for assessing convergence of MCMC}, author={Vehtari, Aki and Gelman, Andrew and Simpson, Daniel and Carpenter, Bob and B{\"u}rkner, Paul-Christian}, journal={arXiv preprint arXiv:1903.08008}, year={2019} } @article{funder2019evaluating, title={Evaluating effect size in psychological research: sense and nonsense}, author={Funder, David C and Ozer, Daniel J}, journal={Advances in Methods and Practices in Psychological Science}, pages={2515245919847202}, year={2019}, publisher={SAGE Publications Sage CA: Los Angeles, CA} } @article{burkner2017brms, title={brms: An R package for Bayesian multilevel models using Stan}, author={B{\"u}rkner, Paul-Christian and others}, journal={Journal of Statistical Software}, volume={80}, number={1}, pages={1--28}, year={2017}, publisher={Foundation for Open Access Statistics} } @article{gignac2016effect, title={Effect size guidelines for individual differences researchers}, author={Gignac, Gilles E and Szodorai, Eva T}, journal={Personality and individual differences}, volume={102}, pages={74--78}, year={2016}, publisher={Elsevier} } @article{jarosz2014odds, title={What are the odds? A practical guide to computing and reporting Bayes factors}, author={Jarosz, Andrew F and Wiley, Jennifer}, journal={The Journal of Problem Solving}, volume={7}, number={1}, pages={2}, year={2014}, publisher={Purdue University Press} } @book{field2013discovering, title={Discovering statistics using IBM SPSS statistics}, author={Field, Andy}, year={2013}, publisher={sage} } @article{menard2011standards, title={Standards for standardized logistic regression coefficients}, author={Menard, Scott}, journal={Social Forces}, volume={89}, number={4}, pages={1409--1428}, year={2011}, publisher={The University of North Carolina Press} } @article{schielzeth2010simple, title={Simple means to improve the interpretability of regression coefficients}, author={Schielzeth, Holger}, journal={Methods in Ecology and Evolution}, volume={1}, number={2}, pages={103--113}, year={2010}, publisher={Wiley Online Library} } @article{gelman2008scaling, title={Scaling regression inputs by dividing by two standard deviations}, author={Gelman, Andrew}, journal={Statistics in medicine}, volume={27}, number={15}, pages={2865--2873}, year={2008}, publisher={Wiley Online Library} } @article{menard2004six, title={Six approaches to calculating standardized logistic regression coefficients}, author={Menard, Scott}, journal={The American Statistician}, volume={58}, number={3}, pages={218--223}, year={2004}, publisher={Taylor \& Francis} } @article{bring1994standardize, title={How to standardize regression coefficients}, author={Bring, Johan}, journal={The American Statistician}, volume={48}, number={3}, pages={209--213}, year={1994}, publisher={Taylor \& Francis} } @article{neter1989applied, title={Applied linear regression models}, author={Neter, John and Wasserman, William and Kutner, Michael H}, year={1989}, publisher={Irwin Homewood, IL} } @article{hair2011pls, title={PLS-SEM: Indeed a silver bullet}, author={Hair, Joe F and Ringle, Christian M and Sarstedt, Marko}, journal={Journal of Marketing theory and Practice}, volume={19}, number={2}, pages={139--152}, year={2011}, publisher={Taylor \& Francis} } @article{chen2010big, title={How big is a big odds ratio? Interpreting the magnitudes of odds ratios in epidemiological studies}, author={Chen, Henian and Cohen, Patricia and Chen, Sophie}, journal={Communications in Statistics—Simulation and Computation{\textregistered}}, volume={39}, number={4}, pages={860--864}, year={2010}, publisher={Taylor \& Francis} } @article{sawilowsky2009new, title={New effect size rules of thumb}, author={Sawilowsky, Shlomo S}, year={2009} } @article{sanchez2003effect, title={Effect-size indices for dichotomized outcomes in meta-analysis.}, author={S{\'a}nchez-Meca, Julio and Mar{\'\i}n-Mart{\'\i}nez, Fulgencio and Chac{\'o}n-Moscoso, Salvador}, journal={Psychological methods}, volume={8}, number={4}, pages={448}, year={2003}, publisher={American Psychological Association} } @article{chin1998partial, title={The partial least squares approach to structural equation modeling}, author={Chin, Wynne W and others}, journal={Modern methods for business research}, volume={295}, number={2}, pages={295--336}, year={1998}, publisher={London} } @book{evans1996straightforward, title={Straightforward statistics for the behavioral sciences.}, author={Evans, James D}, year={1996}, publisher={Thomson Brooks/Cole Publishing Co} } @article{raftery1995bayesian, title={Bayesian model selection in social research}, author={Raftery, Adrian E}, journal={Sociological methodology}, volume={25}, pages={111--164}, year={1995}, publisher={Blackwell Publishers} } @article{gelman1992inference, title={Inference from iterative simulation using multiple sequences}, author={Gelman, Andrew and Rubin, Donald B and others}, journal={Statistical science}, volume={7}, number={4}, pages={457--472}, year={1992}, publisher={Institute of Mathematical Statistics} } @book{falk1992primer, title={A primer for soft modeling.}, author={Falk, R Frank and Miller, Nancy B}, year={1992}, publisher={University of Akron Press} } @article{cohen1988statistical, title={Statistical power analysis for the social sciences}, author={Cohen, Jacob}, year={1988}, publisher={Hillsdale, NJ: Erlbaum} } @misc{jeffreys1961theory, title={Theory of probability, Clarendon}, author={Jeffreys, Harold}, year={1961}, publisher={Oxford} } effectsize/vignettes/standardize_data.Rmd0000644000176200001440000000604713547032516020373 0ustar liggesusers--- title: "Data Standardization" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, guidelines, interpretation] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Data standardization} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) ``` # Introduction To make sense of their data and effects, scientists might want to standardize (Z-score) their variables. They become unitless, expressed only in terms of deviation from an index of centrality (e.g., the mean or the median). ADD MORE. ## Normal *vs.* Robust ADD MORE. ## Variable-wise *vs.* Participant-wise Standardization is an important step and extra caution is required in **repeated-measures designs**, in which there are three ways of standardizing data: - **Variable-wise**: The most common method. A simple scaling of each column. - **Participant-wise**: Variables are standardized "within" each participant, *i.e.*, for each participant, by the participant's mean and SD. - **Full**: Participant-wise first and then re-standardizing variable-wise. Unfortunately, the method used is often not explicitly stated. This is an issue as these methods can generate important discrepancies (that can in turn contribute to the reproducibility crisis). Let's investigate these 3 methods. [Use this](https://github.com/neuropsychology/psycho.R/blob/master/docs/_posts/preparation/published/standardize_grouped_df.Rmd) # Referenceseffectsize/vignettes/standardize_parameters.Rmd0000644000176200001440000005161613613235007021621 0ustar liggesusers--- title: "Parameters Standardization" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, standardization, effect size, cohen d, standardized coefficients] vignette: > %\VignetteIndexEntry{Parameters standardization} \usepackage[utf8]{inputenc} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) knitr::opts_chunk$set(comment = ">") options(digits = 2) options(knitr.kable.NA = '') if (!requireNamespace("dplyr", quietly = TRUE) || !requireNamespace("parameters", quietly = TRUE)) { knitr::opts_chunk$set(eval = FALSE) } set.seed(333) ``` # Introduction Standardising parameters (*i.e.*, coefficients) can allow for their comparison within and between models, variables and studies. Moreover, as it returns coefficients expressed in terms of **change of variance** (for instance, coefficients expresed in terms of SD of the response variable), it can allow for the usage of [effect size interpretation guidelines](https://easystats.github.io/effectsize/articles/interpret.html), such as the famous Cohen's (1988) rules of thumb. However, standardizing the model's parameters should *not* be automatically and mindlessly done: for some research fields, particular variables or types of studies (*e.g.*, replications), it sometimes makes more sense to keep, use and interpret the original parameters, especially if they are well known or easily understood. Critically, **parameters standardization is not a trivial process**. Different techniques exist, that can lead to drastically different results. Thus, it is critical that the standardization method is explicitly documented and detailed. **`parameters` include different techniques of parameters standardization**, described below [@bring1994standardize;@menard2004six;@gelman2008scaling;@schielzeth2010simple;@menard2011standards]. # How to interpret standardized coefficients? ## Measure of association (correlation *r*) ```{r, warning=FALSE, message=FALSE, eval=FALSE} library(effectsize) library(dplyr) lm(Sepal.Length ~ Petal.Length, data = iris) %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} library(effectsize) library(dplyr) lm(Sepal.Length ~ Petal.Length, data = iris) %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` Standardizing the coefficient of this simple linear regression gives a value of `0.87`, but did you know that for a simple regression this is actually the **same as a correlation**? Thus, you can eventually apply some (*in*)famous interpretation guidelines (e.g., Cohen's rules of thumb). ```{r, warning=FALSE, message=FALSE} library(parameters) cor.test(iris$Sepal.Length, iris$Petal.Length) %>% model_parameters() ``` What happens in the case of **multiple continuous variables**? As in each effect in a regression model is "adjusted" for the other ones, we might expect coefficients to be somewhat alike to **partial correlations**. Let's first start by computing the partial correlation between **Sepal.Length** and 3 other remaining variables. ```{r, warning=FALSE, message=FALSE} if (require("ppcor")) { df <- iris[, 1:4] # Remove the Species factor ppcor::pcor(df)$estimate[2:4, 1] # Select the rows of interest } ``` Now, let's apply another method to obtain effect sizes for frequentist regressions, based on the statistic values. We will convert the *t*-value (and its degrees of freedom, *df*) into a partial correlation coefficient *r*. ```{r, warning=FALSE, message=FALSE} model <- lm(Sepal.Length ~ ., data = df) parameters <- model_parameters(model)[2:4,] convert_t_to_r(parameters$t, parameters$df_residual) ``` Wow, the retrieved correlations coefficients from the regression model are **exactly** the same as the partial correlations! However, note that in multiple regression standardizing the parameters in not quite the same as computing the (partial) correlation, due to... math :( ```{r, warning=FALSE, message=FALSE, eval=FALSE} model %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} model %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` ## Standardized differences How does it work in the case of differences, when **factors** are entered and differences between a given level and a reference level (the intercept)? You might have heard that it is similar to a **Cohen's *d***. Well, let's see. ```{r, warning=FALSE, message=FALSE, eval=FALSE} lm(Sepal.Length ~ Species, data = iris) %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} lm(Sepal.Length ~ Species, data = iris) %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` This linear model suggests that the *standardized* difference between the *versicolor* level of Species and the *setosa* level (the reference level - the intercept) is of 1.12 standard deviation of `Sepal.Length` (because the response variable was standardized, right?). Let's compute the **Cohen's *d*** between these two levels: ```{r, warning=FALSE, message=FALSE} # Select portion of data containing the two levels of interest data <- iris[iris$Species %in% c("setosa", "versicolor"), ] cohens_d(Sepal.Length ~ Species, data = data) ``` ***It is very different!*** Why? How? Both differences should be expressed in terms of SD of the response variable. *And there's the trick*. First of all, in the linear model above, the SD by which the difference is scaled is the one of the whole response, which include **all the three levels**, whereas below, we filtered the data to only include the levels of interest. If we recompute the model on this filtered data, it should be better: ```{r, warning=FALSE, message=FALSE, eval=FALSE} lm(Sepal.Length ~ Species, data = data) %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} lm(Sepal.Length ~ Species, data = data) %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` Not really. Why? Because the actual formula to compute a **Cohen's *d*** doesn't use the simple SD to scale the effect (as it is done when standardizing the parameters), but computes something called the [**pooled SD**](https://easystats.github.io/effectsize/reference/sd_pooled.html). However, this can be turned off by setting `correct = "raw"`. ```{r, warning=FALSE, message=FALSE} cohens_d(Sepal.Length ~ Species, data = data, pooled_sd = FALSE) ``` ***And here we are :)*** effectsize/vignettes/bayesian_models.Rmd0000644000176200001440000001133413613235007020215 0ustar liggesusers--- title: "Effect sizes for Bayesian models" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, bayesian, effect size] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Effect sizes for Bayesian models} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') options(digits = 2) knitr::opts_chunk$set(comment = ">") if (!requireNamespace("parameters", quietly = TRUE) || !requireNamespace("rstanarm", quietly = TRUE) || !requireNamespace("bayestestR", quietly = TRUE) || !requireNamespace("ppcor", quietly = TRUE)) { knitr::opts_chunk$set(eval = FALSE) } library(effectsize) ``` **Obtaining indices of effect size for Bayesian model is currently an issue**, as no test statistics are present to help us compute such indices. The two alternatives (both available in **effectsize**) is 1) to compute [**standardized parameters**](https://easystats.github.io/effectsize/articles/standardize_parameters.html) or 2) obtain effect sizes by **test-statistic approximation**. This second method is described here. ## Bayesian Regression Coefficients to Correlation via Test-Statistic Approximation ### Overview ```{r, warning=FALSE, message=FALSE} library("ppcor") df <- iris[, 1:4] # Remove the Species factor ppcor::pcor(df)$estimate[2:4, 1] # Select the rows of interest ``` The goal is to retrieve coefficients similar to the above **(partial) correlations** for this multiple regression model: `Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width`. This can easily be achieved for frequentist models by converting the *t* statistic into a correlation: ```{r, warning=FALSE, message=FALSE} library(effectsize) library(parameters) model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df) parameters <- model_parameters(model)[2:4,] convert_t_to_r(parameters$t, parameters$df_residual) ``` Note that these are *not* equivalent to *standardized parameters* from multiple regressions (from which coefficients can be higher than 1). ```{r, warning=FALSE, message=FALSE} standardize_parameters(model)$Std_Coefficient[2:4] ``` Let's start by fitting the Bayesian regression: ```{r, warning=FALSE, message=FALSE, eval = FALSE} library("rstanarm") model <- stan_glm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df) ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} library("rstanarm") model <- stan_glm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df, refresh = 0, chains = 2) ``` The **effectsize** package provides the `posteriors_to_r()` function, which attempts to estimate the posterior of the (partial) correlation coefficient by approximating the *t* statistic (deviding the coefficient by the SD of the posterior) and using frequentist degrees of freedom. It is an hybrid method that needs to be validated. However, the results appear as very close: ```{r, warning=FALSE, message=FALSE, eval=FALSE} library(bayestestR) r <- convert_posteriors_to_r(model) bayestestR::describe_posterior(r)$Median[2:4] ``` ### Applicability Does it work in all cases? #### Logistic Models Let's start with the frequentist model: ```{r, warning=FALSE, message=FALSE, eval=FALSE} model <- glm(vs ~ cyl + disp + drat, data = mtcars, family = "binomial") parameters <- model_parameters(model) parameters$r <- convert_z_to_r(parameters$z, n = insight::n_obs(model)) parameters ``` However, as logistic models return log-odds, these can be directly converted to *r*: ```{r, warning=FALSE, message=FALSE, eval=FALSE} parameters$r_from_odds <- convert_odds_to_r(parameters$Coefficient, log = TRUE) parameters ``` And now the Bayesian: ```{r, warning=FALSE, message=FALSE, eval = FALSE} model <- stan_glm(vs ~ cyl + disp + drat,, data = mtcars, family = "binomial") parameters <- model_parameters(model) r <- convert_posteriors_to_r(model) parameters$r <- bayestestR::describe_posterior(r)$Median parameters$r_from_odds <- convert_odds_to_r(parameters$Median, log = TRUE) parameters ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE, eval=FALSE} model <- stan_glm(vs ~ cyl + disp + drat,, data = mtcars, family = "binomial", refresh = 0) parameters <- model_parameters(model) r <- convert_posteriors_to_r(model) parameters$r <- bayestestR::describe_posterior(r)$Median parameters$r_from_odds <- convert_odds_to_r(parameters$Median, log = TRUE) parameters ``` ## Referenceseffectsize/vignettes/apa.csl0000644000176200001440000016075013506417057015676 0ustar liggesusers effectsize/R/0000755000176200001440000000000013613235275012611 5ustar liggesuserseffectsize/R/interpret_r2.R0000644000176200001440000000311613553505527015357 0ustar liggesusers#' Coefficient of determination (R2) interpretation #' #' @param r2 Value or vector of R2 values. #' @param rules Can be "cohen1988" (default), "falk1992", "chin1998", "hair2011" or custom set of rules. #' #' @examples #' interpret_r2(.02) #' interpret_r2(c(.5, .02)) #' @references #' \itemize{ #' \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. #' \item Falk, R. F., & Miller, N. B. (1992). A primer for soft modeling. University of Akron Press. #' \item Chin, W. W. (1998). The partial least squares approach to structural equation modeling. Modern methods for business research, 295(2), 295-336. #' \item Hair, J. F., Ringle, C. M., & Sarstedt, M. (2011). PLS-SEM: Indeed a silver bullet. Journal of Marketing theory and Practice, 19(2), 139-152. #' } #' @export interpret_r2 <- function(r2, rules = "cohen1988") { if (is.rules(rules)) { return(interpret(r2, rules)) } else { if (rules == "cohen1988") { return(interpret(r2, rules(c(0.02, 0.13, 0.26), c("very weak", "weak", "moderate", "substantial")))) } else if (rules == "falk1992") { return(interpret(r2, rules(c(0.10), c("negligible", "adequate")))) } else if (rules == "chin1998") { return(interpret(r2, rules(c(0.19, 0.33, 0.67), c("very weak", "weak", "moderate", "substantial")))) } else if (rules == "hair2011") { return(interpret(r2, rules(c(0.25, 0.50, 0.75), c("very weak", "weak", "moderate", "substantial")))) } else { stop("rules must be 'cohen1988', 'sawilowsky2009' or an object of type rules.") } } } effectsize/R/interpret_fit.R0000644000176200001440000001711713562155053015617 0ustar liggesusers#' Interpretation of indices of fit #' #' Interpretation of indices of fit found in confirmatory analysis or structural equation modelling, such as RMSEA, CFI, NFI, IFI, etc. #' #' @param x vector of values. #' @param rules Can be "default" or custom set of rules. #' #' @inherit performance::model_performance.lavaan details #' @inherit performance::model_performance.lavaan references #' #' @details \subsection{Indices of fit}{ #' \itemize{ #' \item \strong{Chisq}: The model Chi-squared assesses overall fit and the discrepancy between the sample and fitted covariance matrices. Its p-value should be > .05 (i.e., the hypothesis of a perfect fit cannot be rejected). However, it is quite sensitive to sample size. #' \item \strong{GFI/AGFI}: The (Adjusted) Goodness of Fit is the proportion of variance accounted for by the estimated population covariance. Analogous to R2. The GFI and the AGFI should be > .95 and > .90, respectively. #' \item \strong{NFI/NNFI/TLI}: The (Non) Normed Fit Index. An NFI of 0.95, indicates the model of interest improves the fit by 95\% relative to the null model. The NNFI (also called the Tucker Lewis index; TLI) is preferable for smaller samples. They should be > .90 (Byrne, 1994) or > .95 (Schumacker & Lomax, 2004). #' \item \strong{CFI}: The Comparative Fit Index is a revised form of NFI. Not very sensitive to sample size (Fan, Thompson, & Wang, 1999). Compares the fit of a target model to the fit of an independent, or null, model. It should be > .90. #' \item \strong{RMSEA}: The Root Mean Square Error of Approximation is a parsimony-adjusted index. Values closer to 0 represent a good fit. It should be < .08 or < .05. The p-value printed with it tests the hypothesis that RMSEA is less than or equal to .05 (a cutoff sometimes used for good fit), and thus should be not significant. #' \item \strong{RMR/SRMR}: the (Standardized) Root Mean Square Residual represents the square-root of the difference between the residuals of the sample covariance matrix and the hypothesized model. As the RMR can be sometimes hard to interpret, better to use SRMR. Should be < .08. #' \item \strong{RFI}: the Relative Fit Index, also known as RHO1, is not guaranteed to vary from 0 to 1. However, RFI close to 1 indicates a good fit. #' \item \strong{IFI}: the Incremental Fit Index (IFI) adjusts the Normed Fit Index (NFI) for sample size and degrees of freedom (Bollen's, 1989). Over 0.90 is a good fit, but the index can exceed 1. #' \item \strong{PNFI}: the Parsimony-Adjusted Measures Index. There is no commonly agreed-upon cutoff value for an acceptable model for this index. Should be > 0.50. #' } #' See the documentation for \code{lavaan::fitmeasures}. #' } #' #' #' \subsection{What to report}{ #' For structural equation models (SEM), Kline (2015) suggests that at a minimum the following indices should be reported: The model \strong{chi-square}, the \strong{RMSEA}, the \strong{CFI} and the \strong{SRMR}. #' } #' #' #' #' @examples #' interpret_gfi(c(.5, .99)) #' interpret_agfi(c(.5, .99)) #' interpret_nfi(c(.5, .99)) #' interpret_nnfi(c(.5, .99)) #' interpret_cfi(c(.5, .99)) #' interpret_rmsea(c(.5, .99)) #' interpret_srmr(c(.5, .99)) #' interpret_rfi(c(.5, .99)) #' interpret_ifi(c(.5, .99)) #' interpret_pnfi(c(.5, .99)) #' @references \itemize{ #' \item Awang, Z. (2012). A handbook on SEM. Structural equation modeling. #' \item Byrne, B. M. (1994). Structural equation modeling with EQS and EQS/Windows. Thousand Oaks, CA: Sage Publications. #' \item Tucker, L. R., \& Lewis, C. (1973). The reliability coefficient for maximum likelihood factor analysis. Psychometrika, 38, 1-10. #' \item Schumacker, R. E., \& Lomax, R. G. (2004). A beginner's guide to structural equation modeling, Second edition. Mahwah, NJ: Lawrence Erlbaum Associates. #' \item Fan, X., B. Thompson, \& L. Wang (1999). Effects of sample size, estimation method, and model specification on structural equation modeling fit indexes. Structural Equation Modeling, 6, 56-83. #' \item Kline, R. B. (2015). Principles and practice of structural equation modeling. Guilford publications. #' } #' @export interpret_gfi <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.95), c("poor", "satisfactory")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_agfi <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.90), c("poor", "satisfactory")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_nfi <- function(x, rules = "byrne1994") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "byrne1994") { return(interpret(x, rules(c(0.90), c("poor", "satisfactory")))) } else if (rules == "schumacker2004") { return(interpret(x, rules(c(0.95), c("poor", "satisfactory")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_nnfi <- interpret_nfi #' @rdname interpret_gfi #' @export interpret_cfi <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.90), c("poor", "satisfactory")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_rmsea <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.05), c("satisfactory", "poor")))) } else if (rules == "awang2012") { return(interpret(x, rules(c(0.05, 0.08), c("good", "satisfactory", "poor")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_srmr <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.08), c("satisfactory", "poor")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_rfi <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.90), c("poor", "satisfactory")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_ifi <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.90), c("poor", "satisfactory")))) } else { stop("rules must be 'default' or an object of type rules.") } } } #' @rdname interpret_gfi #' @export interpret_pnfi <- function(x, rules = "default") { if (is.rules(rules)) { return(interpret(x, rules)) } else { if (rules == "default") { return(interpret(x, rules(c(0.50), c("poor", "satisfactory")))) } else { stop("rules must be 'default' or an object of type rules.") } } } effectsize/R/convert_posteriors.R0000644000176200001440000000250513611503452016700 0ustar liggesusers#' Convert posterior distributions from a Bayesian model #' #' Convert posterior distributions from a Bayesian model to indices of effect size. #' #' @param model A Bayesian statistical model. #' @param ... Arguments passed to or from other methods. #' #' @examples #' \donttest{ #' if (require("rstanarm")) { #' model <- stan_glm(mpg ~ cyl, data = mtcars, refresh = 0, chains = 2) #' # This function is not available yet. #' } #' } #' @export convert_posteriors_to_r <- function(model, ...) { stop("This function is not yet available.") # dof <- parameters::dof(model) # t <- convert_posteriors_to_t(model) # r <- t # for (i in 1:ncol(t)) { # r[, i] <- convert_t_to_r(t = t[, i], df_error = dof[i]) # } # r } #' @rdname convert_posteriors_to_r #' @export posteriors_to_r <- convert_posteriors_to_r #' @rdname convert_posteriors_to_r #' @export convert_posteriors_to_t <- function(model, ...) { posteriors <- insight::get_parameters(model, ...) as.data.frame(sapply(posteriors, .compute_t)) } #' @rdname convert_posteriors_to_r #' @export posteriors_to_t <- convert_posteriors_to_t #' @importFrom stats sd #' @keywords internal .compute_t <- function(posterior) { denominator <- stats::sd(posterior, na.rm = TRUE) posterior / denominator } effectsize/R/omega_squared.R0000644000176200001440000001415513564210733015553 0ustar liggesusers#' @rdname eta_squared #' @export omega_squared <- function(model, partial = TRUE, ci = NULL, iterations = 1000) { UseMethod("omega_squared") } #' @export omega_squared.aov <- function(model, partial = TRUE, ci = NULL, iterations = 1000) { if (!inherits(model, c("Gam", "aov", "anova", "anova.rms"))) model <- stats::anova(model) m <- .omega_squared(model, partial = partial, ci = ci, iterations = iterations) class(m) <- c(ifelse(isTRUE(partial), "partial_omega_squared", "omega_squared"), class(m)) m } #' @export omega_squared.lm <- omega_squared.aov #' @export omega_squared.glm <- omega_squared.aov #' @export omega_squared.anova <- function(model, partial = TRUE, ci = NULL, iterations = 1000, ...) { if ("DenDF" %in% colnames(model)) { if (isFALSE(partial)) { warning("Currently only supports partial omega squared for mixed models.") } par_table <- as.data.frame(model) par_table$Parameter <- rownames(par_table) colnames(par_table)[colnames(par_table) == "NumDF"] <- "df" colnames(par_table)[colnames(par_table) == "DenDF"] <- "df2" colnames(par_table)[colnames(par_table) == "F value"] <- "F" .omega_square_from_F(par_table, ci = ci) } else { omega_squared.aov(model, partial = partial, ci = ci, iterations = iterations, ...) } } #' @export omega_squared.aovlist <- function(model, partial = TRUE, ci = NULL, iterations = 1000) { if (isFALSE(partial)) { warning("Currently only supports partial omega squared for repeated-measures ANOVAs.") } par_table <- as.data.frame(parameters::model_parameters(model)) par_table <- split(par_table, par_table$Group) par_table <- lapply(par_table, function(.data) { .data$df2 <- .data$df[.data$Parameter == "Residuals"] .data }) par_table <- do.call(rbind, par_table) .omega_square_from_F(par_table, ci = ci) } #' @export omega_squared.merMod <- function(model, partial = TRUE, ci = NULL, iterations = 1000) { if (!requireNamespace("lmerTest", quietly = TRUE)) { stop("Package 'lmerTest' required for this function to work. Please install it by running `install.packages('lmerTest')`.") } model <- lmerTest::as_lmerModLmerTest(model) model <- stats::anova(model) omega_squared.anova(model, partial = partial, ci = ci, iterations = iterations) } #' @keywords internal .omega_squared <- function(model, partial, ci, iterations) { params <- as.data.frame(parameters::model_parameters(model)) values <- .values_aov(params) if (!"Residuals" %in% params$Parameter) { stop("No residuals data found. Omega squared can only be computed for simple `aov` models.") } eff_size <- .extract_omega_squared(params, values, partial) .ci_omega_squared( x = eff_size, partial = partial, ci.lvl = ci, df = params[["df"]], statistic = params[["F"]], model = model, iterations = iterations ) } #' @keywords internal .extract_omega_squared <- function(params, values, partial) { if (partial == FALSE) { params$Omega_Sq <- (params$Sum_Squares - params$df * values$Mean_Square_residuals) / (values$Sum_Squares_total + values$Mean_Square_residuals) params[params$Parameter == "Residuals", "Omega_Sq"] <- NA } else { params$Omega_Sq_partial <- (params$df * (params$Mean_Square - values$Mean_Square_residuals)) / (params$df * params$Mean_Square + (values$n - params$df) * values$Mean_Square_residuals) params[params$Parameter == "Residuals", "Omega_Sq_partial"] <- NA } params[, intersect(c("Group", "Parameter", "Omega_Sq", "Omega_Sq_partial"), names(params)), drop = FALSE] } #' @importFrom stats aov quantile #' @importFrom insight get_data find_formula #' @keywords internal .ci_omega_squared <- function(x, partial, ci.lvl, df, statistic, model, iterations) { if (is.null(ci.lvl) || is.na(ci.lvl)) { return(x) } N <- sum(df) + 1 if (partial == FALSE) { ci_omega <- lapply( 1:nrow(x), function(.x) { if (!is.na(statistic[.x])) { ci <- .confint_ncg( F.value = statistic[.x], conf.level = ci.lvl, df.1 = df[.x], df.2 = df[nrow(x)] ) ci.low <- ci$Lower.Limit / (ci$Lower.Limit + N) ci.high <- ci$Upper.Limit / (ci$Upper.Limit + N) } else { ci.low <- ci.high <- NA } data.frame( CI_low = ci.low, CI_high = ci.high ) } ) cbind(x, do.call(rbind, ci_omega)) } else { if (inherits(model, "anova") || is.data.frame(model)) { warning("Confidence intervals can't be computed for data frames or objects of class 'anova'.") return(x) } if (!requireNamespace("boot", quietly = TRUE)) { stop("Package 'boot' needed for this function to work. Please install it.") } dat <- insight::get_data(model) boot_function <- function(model, data, indices) { d <- data[indices, ] # allows boot to select sample fit <- stats::aov(insight::find_formula(model)$conditional, data = d) params <- as.data.frame(parameters::model_parameters(fit)) values <- .values_aov(params) osq <- .extract_omega_squared(params, values, partial = TRUE) return(osq[["Omega_Sq_partial"]]) } results <- boot::boot( data = dat, statistic = boot_function, R = iterations, model = model, parallel = "multicore" ) df <- as.data.frame(results$t) x$CI_low <- sapply(df[, 1:ncol(df)], stats::quantile, probs = (1 - ci.lvl) / 2, na.rm = TRUE) x$CI_high <- sapply(df[, 1:ncol(df)], stats::quantile, probs = (1 + ci.lvl) / 2, na.rm = TRUE) x } } #' @keywords internal .omega_square_from_F <- function(.data, ci = NULL) { .data$Omega_Sq_partial <- F_to_omega2(.data$`F`, .data$df, .data$df2) if (is.numeric(ci)) { warning("CI not implemented yet for Partial Omega squared.") } rownames(.data) <- NULL .data <- .data[, colnames(.data) %in% c("Parameter", "Omega_Sq_partial")] class(.data) <- c("partial_eta_squared", class(.data)) .data } effectsize/R/sd_pooled.R0000644000176200001440000000606413571423263014711 0ustar liggesusers#' Pooled Standard Deviation #' #' The Pooled Standard Deviation is a weighted average of standard deviations for two or more groups, with more "weight" given to larger sample sizes. #' #' @inheritParams cohens_d #' #' @return Numeric, the pooled standard deviation. #' @examples #' sd_pooled(Sepal.Length ~ Petal.Width, data = iris) #' @export sd_pooled <- function(x, y = NULL, data = NULL) { # This actually works, you must see if you want to keep this code. If you do, # following will work: # sd_pooled(Sepal.Length, Petal.Width, data = iris) # sd_pooled("Sepal.Length", "Petal.Width", data = iris) # sd_pooled(iris$Sepal.Length, iris$Petal.Width) # sd_pooled(x, y) # called from a different function, like cohens_d() # needs modification in in ".sd_pooled()" as well... # x1 <- try(expr = eval(x), silent = TRUE) # y1 <- try(expr = eval(y), silent = TRUE) # # if (inherits(x1, "try-error")) # x <- deparse(substitute(x), width.cutoff = 500) # else # x <- x1 # # if (inherits(y1, "try-error")) # y <- deparse(substitute(y), width.cutoff = 500) # else # y <- y1 .sd_pooled(x, y, data, robust = FALSE) } #' @rdname sd_pooled #' @export mad_pooled <- function(x, y = NULL, data = NULL) { .sd_pooled(x, y, data, robust = TRUE) } #' @importFrom stats mad sd as.formula .sd_pooled <- function(x, y = NULL, data = NULL, robust = FALSE) { # Activate here for evaluation of arguments... # eval_args <- .evaluate_arguments(x, y, data) # out <- .deal_with_cohens_d_arguments(eval_args$x, eval_args$y, eval_args$data) out <- .deal_with_cohens_d_arguments(x, y, data) x <- out$x y <- out$y if (robust) { sd1 <- stats::mad(x, na.rm = TRUE) sd2 <- stats::mad(y, na.rm = TRUE) } else { sd1 <- stats::sd(x, na.rm = TRUE) sd2 <- stats::sd(y, na.rm = TRUE) } sqrt((sd1^2 + sd2^2) / 2) # Cohen's more complicated formula: # n1 <- length(x) # n2 <- length(y) # sqrt( (n1-1) * var(x) + (n2-1) * var(y) / n1 + n2 - 2) } .evaluate_arguments <- function(x, y, data) { eval_x <- .evaluate_argument(x) if (!is.null(eval_x$variable)) x <- eval_x$variable if (!is.null(eval_x$data) && is.null(data)) data <- get(eval_x$data) eval_y <- .evaluate_argument(y) if (!is.null(eval_y$variable)) y <- eval_y$variable if (!is.null(eval_y$data) && is.null(data)) data <- get(eval_y$data) list(x = x, y = y, data = data) } .evaluate_argument <- function(arg) { data_frame <- NULL if (!is.null(arg)) { if (is.numeric(arg) && length(arg) > 1) { # do nothiung } else if (arg == "NULL") { arg <- NULL } else if (grepl("~", arg, fixed = TRUE)) { arg <- stats::as.formula(arg) } else if (grepl("\"", arg, fixed = TRUE)) { arg <- gsub("\"", "", arg, fixed = TRUE) } else if (grepl("$", arg, fixed = TRUE)) { data_frame <- gsub("(.*)\\$(.*)", "\\1", arg) arg <- gsub("(.*)\\$(.*)", "\\2", arg) } } list(variable = arg, data = data_frame) }effectsize/R/convert_d_to_percentage.R0000644000176200001440000000101413553465575017625 0ustar liggesusers#' @importFrom stats qnorm #' @rdname d_to_r #' @export percentage_to_d <- function(percentage, ...) { range_distribution <- (qnorm(0.999) - qnorm(0.001)) percentage * range_distribution } #' @rdname d_to_r #' @export d_to_percentage <- function(d, ...) { range_distribution <- (stats::qnorm(0.999) - stats::qnorm(0.001)) d / range_distribution } #' @rdname d_to_r #' @export convert_percentage_to_d <- percentage_to_d #' @rdname d_to_r #' @export convert_d_to_percentage <- d_to_percentage effectsize/R/standardize.models.R0000644000176200001440000001714713613235007016531 0ustar liggesusers#' @rdname standardize #' @importFrom stats update #' @importFrom insight get_data model_info find_response get_response find_weights #' @importFrom utils capture.output #' @export standardize.lm <- function(x, robust = FALSE, two_sd = FALSE, include_response = TRUE, verbose = TRUE, ...) { m_info <- insight::model_info(x) data <- insight::get_data(x) resp <- NULL # for models with specific scale of the response value (e.g. count models # with positive integers, or beta with ratio between 0 and 1), we need to # make sure that the original response value will be restored after # standardizing, as these models also require a non-standardized reponse. if (.no_response_standardize(m_info) || !include_response) { resp <- unique(c(insight::find_response(x), insight::find_response(x, combine = FALSE))) } # if we standardize log-terms, standardization will fail (because log of # negative value is NaN) log_terms <- .log_terms(x) # Do not standardize weighting-variable, because negative weights will # cause errors in "update()" weight_variable <- insight::find_weights(x) # don't standardize random effects random_group_factor <- insight::find_random(x, flatten = TRUE, split_nested = TRUE) # standardize data dont_standardize <- c(resp, log_terms, weight_variable, random_group_factor) do_standardize <- setdiff(colnames(data), dont_standardize) if (length(do_standardize)) { data_std <- standardize(data[do_standardize], robust = robust, two_sd = two_sd, verbose = verbose) } else { if (verbose) { insight::print_color("No variables could be standardized.\n", "red") } return(x) } # restore data that should not be standardized if (length(dont_standardize)) { data_std <- cbind(data[, dont_standardize, drop = FALSE], data_std) } # update model with standardized data if (inherits(x, "brmsfit")) { text <- utils::capture.output(model_std <- stats::update(x, newdata = data_std)) } else if (inherits(x, "biglm")) { text <- utils::capture.output(model_std <- stats::update(x, moredata = data_std)) } else if (inherits(x, "mixor")) { data_std <- data_std[order(data_std[, random_group_factor, drop = FALSE]), ] text <- utils::capture.output(model_std <- stats::update(x, data = data_std)) } else { text <- utils::capture.output(model_std <- stats::update(x, data = data_std)) } model_std } #' @keywords internal .no_response_standardize <- function(info) { # check if model has a response variable that should not be standardized. info$is_count | info$is_ordinal | info$is_beta | info$is_censored | info$is_binomial | info$is_survival } #' @export standardize.mlm <- function(x, robust = FALSE, two_sd = FALSE, verbose = TRUE, ...) { standardize.lm(x = x, robust = robust, two_sd = two_sd, include_response = FALSE, verbose = verbose, ...) } #' @export standardize.cglm <- standardize.lm #' @export standardize.cpglmm <- standardize.lm #' @export standardize.cpglm <- standardize.lm #' @export standardize.merMod <- standardize.lm #' @export standardize.mixor <- standardize.lm #' @export standardize.glmmadmb <- standardize.lm #' @export standardize.rq <- standardize.lm #' @export standardize.cgam <- standardize.lm #' @export standardize.crq <- standardize.lm #' @export standardize.nlrq <- standardize.lm #' @export standardize.bracl <- standardize.lm #' @export standardize.brmultinom <- standardize.lm #' @export standardize.speedglm <- standardize.lm #' @export standardize.speedlm <- standardize.lm #' @export standardize.iv_robust <- standardize.lm #' @export standardize.lmrob <- standardize.lm #' @export standardize.glmrob <- standardize.lm #' @export standardize.glmRob <- standardize.lm #' @export standardize.lmRob <- standardize.lm #' @export standardize.MixMod <- standardize.lm #' @export standardize.glmmTMB <- standardize.lm #' @export standardize.stanreg <- standardize.lm #' @export standardize.brmsfit <- standardize.lm #' @export standardize.fixest <- standardize.lm #' @export standardize.complmrob <- standardize.lm #' @export standardize.flexsurvreg <- standardize.lm #' @export standardize.lme <- standardize.lm #' @export standardize.biglm <- standardize.lm #' @export standardize.LORgee <- standardize.lm #' @export standardize.gls <- standardize.lm #' @export standardize.plm <- standardize.lm #' @export standardize.feis <- standardize.lm #' @export standardize.negbin <- standardize.lm #' @export standardize.betareg <- standardize.lm #' @export standardize.ivreg <- standardize.lm #' @export standardize.truncreg <- standardize.lm #' @export standardize.lm_robust <- standardize.lm #' @export standardize.tobit <- standardize.lm #' @export standardize.censReg <- standardize.lm #' @export standardize.crch <- standardize.lm #' @export standardize.lrm <- standardize.lm #' @export standardize.psm <- standardize.lm #' @export standardize.ols <- standardize.lm #' @export standardize.geeglm <- standardize.lm #' @export standardize.gee <- standardize.lm #' @export standardize.rms <- standardize.lm #' @export standardize.logistf <- standardize.lm #' @export standardize.vglm <- standardize.lm #' @export standardize.clm <- standardize.lm #' @export standardize.wbm <- function(x, ...) { warning("Standardization of parameters not possible for models from package 'panelr'.", call. = FALSE) x } #' @export standardize.Surv <- function(x, ...) { insight::print_color("'Surv' objects cannot be standardized.\n", "red") x } #' @export standardize.clm2 <- standardize.wbm #' @export standardize.wbgee <- standardize.wbm # Zero-Inflated models ------------------------------------------------------- #' @export standardize.zeroinfl <- standardize.lm #' @export standardize.hurdle <- standardize.lm #' @export standardize.zerocount <- standardize.lm # models with special handling of response variables --------------------------- #' @export standardize.coxph <- function(x, robust = FALSE, two_sd = FALSE, verbose = TRUE, ...) { # for some models, the DV cannot be standardized when using # "update()", so we only standardize model predictors # # survival models have some strange format for the response variable, # so we don't use the default standardize.lm function here, but # use a different approach that only retrieves predictors that should # be standardized. pred <- insight::find_predictors(x, flatten = TRUE) data <- insight::get_data(x) # if we standardize log-terms, standardization will fail (because log of # negative value is NaN) log_terms <- .log_terms(x) if (length(log_terms)) pred <- setdiff(pred, log_terms) weight_variable <- insight::find_weights(x) if (length(weight_variable)) pred <- setdiff(pred, weight_variable) # standardize data, if we have anything left to standardize if (length(pred)) { data_std <- standardize(data[, pred, drop = FALSE], robust = robust, two_sd = two_sd, verbose = verbose) data[pred] <- data_std } text <- utils::capture.output(model_std <- stats::update(x, data = data)) model_std } #' @export standardize.coxme <- standardize.coxph # Find log-terms inside model formula, and return "clean" term names #' @importFrom insight find_terms .log_terms <- function(model) { x <- insight::find_terms(model, flatten = TRUE) gsub("^log\\((.*)\\)", "\\1", x[grepl("^log\\((.*)\\)", x)]) } effectsize/R/interpret_bayesian_indices.R0000644000176200001440000000671513553512163020327 0ustar liggesusers#' Bayesian indices interpretation #' #' Interpretation of Bayesian indices, such as Effective Sample Size (ESS), Rhat, or percentage in ROPE. #' #' @param ess Value or vector of Effective Sample Size (ESS) values. #' @param rhat Value or vector of Rhat values. #' @param rules A character string (see details) or a custom set of \code{\link{rules}}. #' @param rope Value or vector of percentages in ROPE. #' @param ci The Credible Interval (CI) probability, corresponding to the proportion of HDI, that was used. Can be \code{1} in the case of "full ROPE". #' #' @details \subsection{Rules sets:}{ #' \itemize{ #' \item \strong{ESS}: Can be "burkner2017" (default). #' \item \strong{Rhat}: Can be "vehtari2019" (default) or "gelman1992". #' \item \strong{ROPE}: Can be \href{https://easystats.github.io/bayestestR/articles/guidelines.html}{"default"}. #' \item \strong{ESS}: #' }} #' #' #' @examples #' interpret_ess(1001) #' interpret_ess(c(852, 1200)) #' #' interpret_rhat(1.00) #' interpret_rhat(c(1.5, 0.9)) #' #' interpret_rope(0, ci = 0.9) #' interpret_rope(c(0.005, 0.99), ci = 1) #' @references #' \itemize{ #' \item Bürkner, P. C. (2017). brms: An R package for Bayesian multilevel models using Stan. Journal of Statistical Software, 80(1), 1-28. #' \item Gelman, A., & Rubin, D. B. (1992). Inference from iterative simulation using multiple sequences. Statistical science, 7(4), 457-472. #' \item Vehtari, A., Gelman, A., Simpson, D., Carpenter, B., & Bürkner, P. C. (2019). Rank-normalization, folding, and localization: An improved Rhat for assessing convergence of MCMC. arXiv preprint arXiv:1903.08008. #' \item \href{https://easystats.github.io/bayestestR/articles/guidelines.html}{BayestestR's reporting guidelines} #' } #' @export interpret_ess <- function(ess, rules = "burkner2017") { if (is.rules(rules)) { return(interpret(abs(ess), rules)) } else { if (rules == "burkner2017") { return(interpret(abs(ess), rules(c(1000), c("unsufficient", "sufficient")))) } else { stop("rules must be 'burkner2017' or an object of type rules.") } } } #' @rdname interpret_ess #' @export interpret_rhat <- function(rhat, rules = "vehtari2019") { if (is.rules(rules)) { return(interpret(abs(rhat), rules)) } else { if (rules == "vehtari2019") { return(interpret(abs(rhat), rules(c(1.01), c("converged", "failed")))) } else if (rules == "gelman1992") { return(interpret(abs(rhat), rules(c(1.1), c("converged", "failed")))) } else { stop("rules must be 'vehtari2019', 'gelman1992' or an object of type rules.") } } } #' @rdname interpret_ess #' @export interpret_rope <- function(rope, ci = 0.9, rules = "default") { if (is.rules(rules)) { return(interpret(rope, rules)) } else { if (rules == "default") { if (ci < 1) { return(ifelse(rope == 0, "significant", ifelse(rope == 1, "negligible", "not significant") )) } else { return(ifelse(rope < 0.01, "significant", ifelse(rope < 0.025, "probably significant", ifelse(rope > 0.99, "negligible", ifelse(rope > 0.975, "probably negligible", "not significant") ) ) )) } } else { stop("rules must be 'default' or an object of type rules.") } } } effectsize/R/interpret_bf.R0000644000176200001440000000324413547042642015422 0ustar liggesusers#' Bayes Factor (BF) Interpretation #' #' @param bf Value or vector of Bayes factor (BF) values. #' @param rules Can be "jeffreys1961" (default), "raftery1995" or custom set of \code{\link{rules}}. #' @param include_value Include the value in the output. #' #' #' @examples #' interpret_bf(1) #' interpret_bf(c(5, 2)) #' @references #' \itemize{ #' \item Jeffreys, H. (1961), Theory of Probability, 3rd ed., Oxford University Press, Oxford. #' \item Raftery, A. E. (1995). Bayesian model selection in social research. Sociological methodology, 25, 111-164. #' \item Jarosz, A. F., & Wiley, J. (2014). What are the odds? A practical guide to computing and reporting Bayes factors. The Journal of Problem Solving, 7(1), 2. #' } #' @export interpret_bf <- function(bf, rules = "jeffreys1961", include_value = FALSE) { ori_bf <- bf dir <- ifelse(bf < 1, "against", "in favour of") bf <- c(bf) bf[bf < 1] <- 1 / abs(bf[bf < 1]) if (is.rules(rules)) { interpretation <- interpret(bf, rules) } else { if (rules == "jeffreys1961") { interpretation <- interpret(bf, rules(c(1, 3, 10, 30, 100), c("no", "anecdotal", "moderate", "strong", "very strong", "extreme"))) } else if (rules == "raftery1995") { interpretation <- interpret(bf, rules(c(1, 3, 20, 150), c("no", "weak", "positive", "strong", "very strong"))) } else { stop("rules must be 'jeffreys1961', 'raftery1995' or an object of type rules.") } } if (include_value == FALSE) { return(paste0(interpretation, " evidence ", dir)) } else { return(paste0(interpretation, " evidence (BF = ", insight::format_value(ori_bf), ") ", dir)) } } effectsize/R/ranktransform.R0000644000176200001440000000636313550556415015635 0ustar liggesusers#' (Signed) rank transformation #' #' Transform numeric values with the integers of their rank (i.e., 1st smallest, 2nd smallest, 3rd smallest, etc.). Setting the \code{sign} argument to \code{TRUE} will give you signed ranks, where the ranking is done according to absolute size but where the sign is presereved (i.e., 2, 1, -3, 4). #' #' @inheritParams standardize.data.frame #' #' @param x Object. #' @param sign Logical, if \code{TRUE}, return signed ranks. #' @param method Treatment of ties. Can be one of "average" (default), "first", "last", "random", "max" or "min". See \code{\link{rank}} for details. #' @param ... Arguments passed to or from other methods. #' #' @examples #' ranktransform(c(0, 1, 5, -5, -2)) #' ranktransform(c(0, 1, 5, -5, -2), sign = TRUE) #' #' head(ranktransform(iris)) #' @seealso \code{\link{normalize}} \code{\link{standardize}} \code{\link{change_scale}} #' @return A rank-transformed object. #' @export ranktransform <- function(x, ...) { UseMethod("ranktransform") } #' @rdname ranktransform #' @export ranktransform.numeric <- function(x, sign = FALSE, method = "average", verbose = TRUE, ...) { # Warning if all NaNs if (all(is.na(x))) { return(x) } # Warning if only one value if (length(unique(x)) == 1) { if (is.null(names(x))) { name <- deparse(substitute(x)) } else { name <- names(x) } if (verbose) { warning(paste0("Variable `", name, "` contains only one unique value and will not be normalized.")) } return(x) } # Warning if logical vector if (length(unique(x)) == 2) { if (is.null(names(x))) { name <- deparse(substitute(x)) } else { name <- names(x) } if (verbose) { warning(paste0("Variable `", name, "` contains only two different values. Consider converting it to a factor.")) } } if (sign) { out <- sign(x) * rank(x, ties.method = method, na.last = "keep") } else { out <- rank(x, ties.method = method, na.last = "keep") } out } #' @export ranktransform.factor <- function(x, ...) { x } #' @rdname ranktransform #' @export ranktransform.grouped_df <- function(x, select = NULL, exclude = NULL, sign = FALSE, method = "average", ...) { info <- attributes(x) # dplyr >= 0.8.0 returns attribute "indices" grps <- attr(x, "groups", exact = TRUE) # dplyr < 0.8.0? if (is.null(grps)) { grps <- attr(x, "indices", exact = TRUE) grps <- lapply(grps, function(x) x + 1) } else { grps <- grps[[".rows"]] } x <- as.data.frame(x) for (rows in grps) { x[rows, ] <- ranktransform( x[rows, ], select = select, exclude = exclude, sign = sign, method = method, ... ) } # set back class, so data frame still works with dplyr attributes(x) <- info x } #' @rdname ranktransform #' @export ranktransform.data.frame <- function(x, select = NULL, exclude = NULL, sign = FALSE, method = "average", ...) { if (is.null(select)) { select <- names(x) } if (!is.null(exclude)) { select <- setdiff(select, exclude) } x[select] <- lapply(x[select], ranktransform, sign = sign, method = method) x } effectsize/R/change_scale.R0000644000176200001440000000533613555331260015333 0ustar liggesusers#' Rescale a numeric variable #' #' Rescale a numeric variable. This scales all numeric variables in the range 0 - 1. #' #' @inheritParams standardize.data.frame #' #' @param x Object. #' @param to New range of values of the data after rescaling. #' @param range Initial (old) range of values. If \code{NULL}, will take the range of data. #' @param ... Arguments passed to or from other methods. #' #' @examples #' change_scale(c(0, 1, 5, -5, -2)) #' change_scale(c(0, 1, 5, -5, -2), to = c(-5, 5)) #' #' head(change_scale(iris)) #' @seealso \code{\link{normalize}} \code{\link{standardize}} \code{\link{ranktransform}} #' @return A rescaled object. #' @export change_scale <- function(x, ...) { UseMethod("change_scale") } #' @rdname change_scale #' @export change_scale.numeric <- function(x, to = c(0, 100), range = NULL, verbose = TRUE, ...) { # Warning if all NaNs if (all(is.na(x))) { return(x) } # Warning if only one value if (length(unique(x)) == 1 && is.null(range)) { if (verbose) { warning(paste0("A `range` must be provided for data with only one observation.")) } return(x) } if (is.null(range)) { range <- c(min(x, na.rm = TRUE), max(x, na.rm = TRUE)) } min <- ifelse(is.na(range[1]), min(x, na.rm = TRUE), range[1]) max <- ifelse(is.na(range[2]), max(x, na.rm = TRUE), range[2]) new_min <- ifelse(is.na(to[1]), min, to[1]) new_max <- ifelse(is.na(to[2]), max, to[2]) out <- as.vector((new_max - new_min) / (max - min) * (x - min) + new_min) out } #' @export change_scale.factor <- function(x, ...) { x } #' @rdname change_scale #' @export change_scale.grouped_df <- function(x, select = NULL, exclude = NULL, to = c(0, 100), range = NULL, ...) { info <- attributes(x) # dplyr >= 0.8.0 returns attribute "indices" grps <- attr(x, "groups", exact = TRUE) # dplyr < 0.8.0? if (is.null(grps)) { grps <- attr(x, "indices", exact = TRUE) grps <- lapply(grps, function(x) x + 1) } else { grps <- grps[[".rows"]] } x <- as.data.frame(x) for (rows in grps) { x[rows, ] <- change_scale( x[rows, ], select = select, exclude = exclude, to = to, range = range, ... ) } # set back class, so data frame still works with dplyr attributes(x) <- info x } #' @rdname change_scale #' @export change_scale.data.frame <- function(x, select = NULL, exclude = NULL, to = c(0, 100), range = NULL, ...) { if (is.null(select)) { select <- names(x) } if (!is.null(exclude)) { select <- setdiff(select, exclude) } x[select] <- lapply(x[select], change_scale, to = to, range = range) x } effectsize/R/epsilon_squared.R0000644000176200001440000000671113564201557016137 0ustar liggesusers#' @rdname eta_squared #' @export epsilon_squared <- function(model, partial = TRUE) { UseMethod("epsilon_squared") } #' @rdname eta_squared #' @export eta_squared_adj <- epsilon_squared #' @export epsilon_squared.aov <- function(model, partial = TRUE) { if (!inherits(model, c("Gam", "aov", "anova", "anova.rms"))) model <- stats::anova(model) m <- .epsilon_squared(model, partial = partial) class(m) <- c("epsilon_squared", class(m)) m } #' @export epsilon_squared.lm <- epsilon_squared.aov #' @export epsilon_squared.glm <- epsilon_squared.aov #' @export epsilon_squared.anova <- function(model, partial = TRUE) { if ("DenDF" %in% colnames(model)) { if (isFALSE(partial)) { warning("Currently only supports partial epsilon squared for mixed models.") } par_table <- as.data.frame(model) par_table$Parameter <- rownames(par_table) colnames(par_table)[colnames(par_table) == "NumDF"] <- "df" colnames(par_table)[colnames(par_table) == "DenDF"] <- "df2" colnames(par_table)[colnames(par_table) == "F value"] <- "F" .epsilon_square_from_F(par_table) } else { epsilon_squared.aov(model, partial = partial) } } #' @export epsilon_squared.aovlist <- function(model, partial = TRUE) { if (isFALSE(partial)) { warning("Currently only supports partial epsilon squared for repeated-measures ANOVAs.") } par_table <- as.data.frame(parameters::model_parameters(model)) par_table <- split(par_table, par_table$Group) par_table <- lapply(par_table, function(.data) { .data$df2 <- .data$df[.data$Parameter == "Residuals"] .data }) par_table <- do.call(rbind, par_table) .epsilon_square_from_F(par_table) } #' @export epsilon_squared.merMod <- function(model, partial = TRUE) { if (!requireNamespace("lmerTest", quietly = TRUE)) { stop("Package 'lmerTest' required for this function to work. Please install it by running `install.packages('lmerTest')`.") } model <- lmerTest::as_lmerModLmerTest(model) model <- stats::anova(model) epsilon_squared.anova(model, partial = partial) } #' @keywords internal .epsilon_squared <- function(model, partial) { params <- as.data.frame(parameters::model_parameters(model)) values <- .values_aov(params) if (!"Residuals" %in% params$Parameter) { stop("No residuals data found. Eta squared can only be computed for simple `aov` models.") } .extract_epsilon_squared(params, values, partial) } #' @keywords internal .extract_epsilon_squared <- function(params, values, partial) { if (partial == FALSE) { params$Epsilon_sq <- (params$Sum_Squares - params$df * values$Mean_Square_residuals) / values$Sum_Squares_total params[params$Parameter == "Residuals", "Epsilon_sq"] <- NA } else { params$Epsilon_sq_partial <- (params$Sum_Squares - params$df * values$Mean_Square_residuals) / (params$Sum_Squares + values$Sum_Squares_residuals) params[params$Parameter == "Residuals", "Epsilon_sq_partial"] <- NA } params[, intersect(c("Group", "Parameter", "Epsilon_sq", "Epsilon_sq_partial"), names(params)), drop = FALSE] } #' @keywords internal .epsilon_square_from_F <- function(.data) { .data$Epsilon_Sq_partial <- F_to_epsilon2(.data$`F`, .data$df, .data$df2) rownames(.data) <- NULL .data <- .data[, colnames(.data) %in% c("Parameter", "Epsilon_Sq_partial")] class(.data) <- c("partial_epsilon_squared", class(.data)) .data }effectsize/R/convert_chisq.R0000644000176200001440000000335513554253132015605 0ustar liggesusers#' Conversion between Effect sizes for Contingency Tables (Chi2, Phi, Cramer's V...) #' #' Convert between Chi square, (\eqn{chi^2}), phi (\eqn{\phi}) and Cramer's V. #' #' @param chisq The Chi2 statistic. #' @param phi The Phi statistic. #' @param n Sample size. #' @param nrow The number of rows in the contingency table. #' @param ncol The number of columns in the contingency tables. #' @param ... Arguments passed to or from other methods. #' #' @return A numeric value between 0-1. #' #' @details These functions use the following formulae: #' \cr\cr #' \deqn{Cramer's V = \sqrt{\chi^2 / (n * (min(nrow,ncol)-1))}} #' \cr\cr #' \deqn{\phi = \sqrt{\chi^2 / n}} #' #' @examples #' contingency_table <- as.table(rbind(c(762, 327, 468), c(484, 239, 477), c(484, 239, 477))) #' #' chisq.test(contingency_table) #' # #' # Pearson's Chi-squared test #' # #' # data: ctab #' # X-squared = 41.234, df = 4, p-value = 2.405e-08 #' #' chisq_to_phi(41.234, n = sum(contingency_table)) #' chisq_to_cramers_v(41.234, #' n = sum(contingency_table), #' nrow = nrow(contingency_table), #' ncol = ncol(contingency_table) #' ) #' @export chisq_to_phi <- function(chisq, n, ...) { sqrt(chisq / n) } #' @rdname chisq_to_phi #' @export convert_chisq_to_phi <- chisq_to_phi #' @rdname chisq_to_phi #' @export phi_to_chisq <- function(phi, n, ...) { (phi * n)^2 } #' @rdname chisq_to_phi #' @export convert_phi_to_chisq <- phi_to_chisq #' @rdname chisq_to_phi #' @export chisq_to_cramers_v <- function(chisq, n, nrow, ncol, ...) { chisq_to_phi(chisq, n) / sqrt((min(nrow, ncol) - 1)) } #' @rdname chisq_to_phi #' @export convert_chisq_to_cramers_v <- chisq_to_cramers_v # We lack the reverse effectsize/R/interpret_odds.R0000644000176200001440000000277213553505412015765 0ustar liggesusers#' (Log) Odds ratio interpretation #' #' @param odds Value or vector of (log) odds ratio values. #' @param rules Can be "chen2010" (default), "cohen1988" (through transformation to standardized difference, see \code{\link{odds_to_d}}) or custom set of rules. #' @param log Are the provided values log odds ratio. #' #' #' @examples #' interpret_odds(1) #' interpret_odds(c(5, 2)) #' @references #' \itemize{ #' \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. #' \item Chen, H., Cohen, P., & Chen, S. (2010). How big is a big odds ratio? Interpreting the magnitudes of odds ratios in epidemiological studies. Communications in Statistics—Simulation and Computation, 39(4), 860-864. #' \item Sánchez-Meca, J., Marín-Martínez, F., & Chacón-Moscoso, S. (2003). Effect-size indices for dichotomized outcomes in meta-analysis. Psychological methods, 8(4), 448. #' } #' @export interpret_odds <- function(odds, rules = "chen2010", log = FALSE) { if (is.rules(rules)) { return(interpret(abs(odds), rules)) } else { if (rules == "chen2010") { if (log == TRUE) { odds <- exp(abs(odds)) } return(interpret(abs(odds), rules(c(1.68, 3.47, 6.71), c("very small", "small", "medium", "large")))) } else if (rules == "cohen1988") { d <- odds_to_d(odds, log = log) return(interpret_d(abs(d), rules = rules)) } else { stop("rules must be 'chen2010', 'cohen1988' or an object of type rules.") } } } effectsize/R/convert_d_to_r.R0000644000176200001440000000370513553511376015751 0ustar liggesusers#' General effect size conversion #' #' Enables a conversion between different indices of effect size, such as standardized difference (Cohen's d), correlation r or (log) odds ratios. #' #' @param d Standardized difference value (Cohen's d). #' @param r Correlation coefficient r. #' @param percentage Percentage value (e.g., \code{0.01} for one percent). #' @param odds Odds values in vector or dataframe. #' @param probs Probability values. #' @param log Take in or output log odds (such as in logistic models). #' @param select When a dataframe is passed, character or list of of column names to be #' transformed. #' @param exclude When a dataframe is passed, character or list of column names to be excluded #' from transformation. #' @param ... Arguments passed to or from other methods. #' #' @examples #' r_to_d(0.5) #' d_to_odds(d = 1.154701) #' odds_to_r(odds = 8.120534) #' #' d_to_r(d = 1) #' r_to_odds(0.4472136, log = TRUE) #' odds_to_d(1.813799, log = TRUE) #' @return Converted index. #' #' @details \itemize{ #' \item \emph{d to r}: \code{d = 2 * r / sqrt(1 - r^2)} #' \item \emph{r to d}: \code{r = d / (sqrt(d^2 + 4))} #' \item \emph{odds to d}: \eqn{d = \frac{\log(odds)\times\sqrt{3}}{\pi}} #' \item \emph{d to odds}: \eqn{log(odds) = d * \frac{\pi}{\sqrt(3)}} #' } #' #' #' @references \itemize{ #' \item Sánchez-Meca, J., Marín-Martínez, F., & Chacón-Moscoso, S. (2003). Effect-size indices for dichotomized outcomes in meta-analysis. Psychological methods, 8(4), 448. #' \item Borenstein, M., Hedges, L. V., Higgins, J. P. T., & Rothstein, H. R. (2009). Converting among effect sizes. Introduction to meta-analysis, 45-49. #' } #' @export d_to_r <- function(d, ...) { d / (sqrt(d^2 + 4)) } #' @rdname d_to_r #' @export r_to_d <- function(r, ...) { 2 * r / sqrt(1 - r^2) } #' @rdname d_to_r #' @export convert_d_to_r <- d_to_r #' @rdname d_to_r #' @export convert_r_to_d <- r_to_d effectsize/R/convert_percentile_to_z.R0000644000176200001440000000133313562155075017663 0ustar liggesusers#' Z score to Percentile #' #' Convert between Z scores (values expressed in terms of standard deviation) to percentiles (the proportion of a normal distribution below). #' #' @param z,percentile Z score or percentile. #' #' @examples #' z_to_percentile(1.96) #' percentile_to_z(0.975) #' #' @importFrom stats pnorm qnorm #' @export convert_z_to_percentile <- function(z) { stats::pnorm(z) } #' @rdname convert_z_to_percentile #' @export convert_percentile_to_z <- function(percentile) { stats::qnorm(percentile) } #' @rdname convert_z_to_percentile #' @export z_to_percentile <- convert_z_to_percentile #' @rdname convert_z_to_percentile #' @export percentile_to_z <- convert_percentile_to_z effectsize/R/utils_confint_ncg.R0000644000176200001440000000755013544554044016453 0ustar liggesusers# This function is a modified version from package MBESS # copied from https://github.com/cran/MBESS/blob/master/R/conf.limits.ncf.R # Author: Ken Kelley # License: GPL-3 #' @importFrom stats pf qf #' @keywords internal .confint_ncg <- function(F.value = NULL, conf.level = 0.95, df.1 = NULL, df.2 = NULL) { alpha.lower <- alpha.upper <- (1 - conf.level) / 2 tol <- 1e-09 Jumping.Prop <- 0.1 FAILED <- NULL LL.0 <- stats::qf(p = alpha.lower * 5e-04, df1 = df.1, df2 = df.2) Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.0) - (1 - alpha.lower) if (stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.0) < (1 - alpha.lower)) { FAILED <- if (stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = 0) < 1 - alpha.lower) { LL.0 <- 1e-08 } if (stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.0) < 1 - alpha.lower) { FAILED <- TRUE } } if (is.null(FAILED)) { LL.1 <- LL.2 <- LL.0 while (Diff > tol) { LL.2 <- LL.1 * (1 + Jumping.Prop) Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.2) - (1 - alpha.lower) LL.1 <- LL.2 } LL.1 <- LL.2 / (1 + Jumping.Prop) LL.Bounds <- c(LL.1, (LL.1 + LL.2) / 2, LL.2) Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.Bounds[2]) - (1 - alpha.lower) while (abs(Diff) > tol) { Diff.1 <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.Bounds[1]) - (1 - alpha.lower) > tol Diff.2 <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.Bounds[2]) - (1 - alpha.lower) > tol Diff.3 <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.Bounds[3]) - (1 - alpha.lower) > tol if (isTRUE(Diff.1) & isTRUE(Diff.2) & !isTRUE(Diff.3)) { LL.Bounds <- c(LL.Bounds[2], (LL.Bounds[2] + LL.Bounds[3]) / 2, LL.Bounds[3]) } if (isTRUE(Diff.1) & !isTRUE(Diff.2) & !isTRUE(Diff.3)) { LL.Bounds <- c(LL.Bounds[1], (LL.Bounds[1] + LL.Bounds[2]) / 2, LL.Bounds[2]) } Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = LL.Bounds[2]) - (1 - alpha.lower) } LL <- LL.Bounds[2] } if (!is.null(FAILED)) LL <- NA FAILED.Up <- NULL UL.0 <- stats::qf(p = 1 - alpha.upper * 5e-04, df1 = df.1, df2 = df.2) Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.0) - alpha.upper if (Diff < 0) UL.0 <- 1e-08 Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.0) - alpha.upper if (Diff < 0) FAILED.Up <- TRUE if (is.null(FAILED.Up)) { UL.1 <- UL.2 <- UL.0 while (Diff > tol) { UL.2 <- UL.1 * (1 + Jumping.Prop) Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.2) - alpha.upper UL.1 <- UL.2 } UL.1 <- UL.2 / (1 + Jumping.Prop) UL.Bounds <- c(UL.1, (UL.1 + UL.2) / 2, UL.2) Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.Bounds[2]) - alpha.upper while (abs(Diff) > tol) { Diff.1 <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.Bounds[1]) - alpha.upper > tol Diff.2 <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.Bounds[2]) - alpha.upper > tol Diff.3 <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.Bounds[3]) - alpha.upper > tol if (isTRUE(Diff.1) & isTRUE(Diff.2) & !isTRUE(Diff.3)) { UL.Bounds <- c(UL.Bounds[2], (UL.Bounds[2] + UL.Bounds[3]) / 2, UL.Bounds[3]) } if (isTRUE(Diff.1) & !isTRUE(Diff.2) & !isTRUE(Diff.3)) { UL.Bounds <- c(UL.Bounds[1], (UL.Bounds[1] + UL.Bounds[2]) / 2, UL.Bounds[2]) } Diff <- stats::pf(q = F.value, df1 = df.1, df2 = df.2, ncp = UL.Bounds[2]) - alpha.upper } UL <- UL.Bounds[2] } if (!is.null(FAILED.Up)) UL <- NA list(Lower.Limit = LL, Upper.Limit = UL) } effectsize/R/interpret.R0000644000176200001440000000657513562266542014771 0ustar liggesusers# Rules --------------------------------------------------------------- #' Interpretation Grid #' #' Create a container for interpretation rules of thumb. Usually used in conjunction with \link{interpret}. #' #' @param values Vector of reference values (edges defining categories or critical values). #' @param labels Labels associated with each category. If \code{NULL}, will try to infer it from \code{values} (if it is a named vector or a list), otherwise, will return the breakpoints. #' #' #' @seealso interpret #' #' @examples #' rules(c(0.05), c("significant", "not significant")) #' rules(c(0.2, 0.5, 0.8), c("small", "medium", "large")) #' rules(c("small" = 0.2, "medium" = 0.5)) #' @export rules <- function(values, labels = NULL) { if(is.null(labels)){ if(is.list(values)){ values <- unlist(values) } if(is.null(names(values))){ labels <- values } else{ labels <- names(values) } } # Sanity checks if(length(labels) < length(values)){ stop("There cannot be less labels than reference values!") } else if(length(labels) > length(values) + 1){ stop("Too many labels for the number of reference values!") } if (length(values) == length(labels) - 1) { if (is.unsorted(values)){ stop("Reference values must be sorted.") } } # Store and return out <- list( values = values, labels = labels ) class(out) <- c("rules", "list") out } #' @rdname rules #' @param x An arbitrary R object. #' @export is.rules <- function(x) inherits(x, "rules") #' @importFrom utils head #' @export print.rules <- function(x, ...){ if(length(x$values) == length(x$labels)){ insight::print_color("# Reference values\n\n", "blue") df <- data.frame(t(rep(NA, length(x$labels)))) names(df) <- x$labels df[1, ] <- x$values cat(insight::format_table(df)) } else{ insight::print_color("# Reference thresholds\n\n", "blue") cat(paste0(head(x$labels, -1), " < ", x$values, " < ", x$labels[-1], collapse = " < ")) } } # Interpret --------------------------------------------------------------- #' Generic function for interpretation #' #' Interpret a value based on a set of rules. See \link{rules}. #' #' @param x Vector of value break points (edges defining categories). #' @param rules Set of \link{rules}. #' #' @seealso rules #' @examples #' rules_grid <- rules(c(0.01, 0.05), c("very significant", "significant", "not significant")) #' interpret(0.001, rules_grid) #' interpret(0.021, rules_grid) #' interpret(0.08, rules_grid) #' interpret(c(0.01, 0.005, 0.08), rules_grid) #' #' interpret(c(0.35, 0.15), c("small" = 0.2, "large" = 0.4)) #' interpret(c(0.35, 0.15), rules(c(0.2, 0.4), c("small", "medium", "large"))) #' @export interpret <- function(x, rules) { if(!inherits(rules, "rules")){ rules <- rules(rules) } if (length(x) > 1) { return(sapply(x, .interpret, rules)) } else { return(.interpret(x, rules)) } } #' @keywords internal .interpret <- function(x, rules) { if(length(rules$values) == length(rules$labels)){ index <- which.min(abs(x - rules$values)) } else{ check <- x < rules$values if (TRUE %in% check) { index <- min(which(check)) } else { index <- length(rules$labels) } } rules$labels[index] } effectsize/R/interpret_parameters.R0000644000176200001440000001044513554213016017170 0ustar liggesusers#' Automated Interpretation of Effect Sizes #' #' Automated interpretation of effect sizes. #' #' @inheritParams standardize_parameters #' @param interpretation Interpretation grid (i.e., the set of rules of thumb) used to interpret the effects. #' @param parameters A custom parameters table. If \code{NULL}, will use \code{\link{standardize_parameters}} to get it. #' @param standardize_method See \code{\link{standardize_parameters}}. #' @param standardize_robust See \code{\link{standardize_parameters}}. #' #' @examples #' model <- lm(Sepal.Length ~ Species * Petal.Width, data = iris) #' #' @export interpret_parameters <- function(model, ...) { UseMethod("interpret_parameters") } #' @rdname interpret_parameters #' @export interpret_parameters.lm <- function(model, parameters = NULL, interpretation = "funder2019", standardize_method = "refit", standardize_robust = FALSE, ...) { .interpret_parameters_regressions(model, interpretation = interpretation, parameters = parameters, standardize_method = standardize_method, standardize_robust = standardize_robust) } #' @keywords internal .interpret_parameters_regressions <- function(model, parameters = NULL, interpretation = "funder2019", standardize_method = "refit", standardize_robust = FALSE, ...) { type <- parameters::parameters_type(model) std_es <- .standardize_standardized(model, standardize_method = standardize_method, standardize_robust = standardize_robust, type = type, centrality = "Median") data.frame( Parameter = type$Parameter, Effect_Size = std_es, Interpretation = interpret_r(std_es, rules = interpretation) ) } #' @keywords internal .standardize_standardized <- function(model, parameters = NULL, standardize_method = "refit", standardize_robust = FALSE, type = NULL, centrality = "Median", ...) { # Get type of parameters info <- standardize_info(model, robust = standardize_robust) # Compute std parameters if (is.null(parameters)) { parameters <- standardize_parameters(model, method = standardize_method, robust = standardize_robust, centrality = centrality, ...) } # Standardize standardized parameters (Correlation r) std_es <- parameters[names(parameters) %in% c("Std_Coefficient", "Std_Median", "Std_Mean", "Std_MAP")][[1]] #---- Non-applicable std_es[is.na(info$EffectSize_Type)] <- NA #---- Interactions out <- .standardize_standardized_interactions(model, info, type, std_es, centrality, method = "absolute", ...) std_es <- out$std_es info <- out$info #---- Cohen's d d <- std_es[!is.na(info$EffectSize_Type) & info$EffectSize_Type == "d"] std_es[!is.na(info$EffectSize_Type) & info$EffectSize_Type == "d"] <- convert_d_to_r(d) std_es } #' @keywords internal .standardize_standardized_interactions <- function(model, info, type, std_es, centrality = "Median", method = "absolute", ...) { # Get parameters parameters <- insight::get_parameters(model) if (insight::model_info(model)$is_bayesian) { parameters <- bayestestR::describe_posterior(parameters, centrality = centrality, dispersion = FALSE, ci = NULL, test = NULL, diagnostic = NULL, priors = FALSE, ...) parameters <- parameters[names(parameters) %in% c("Parameter", "Coefficient", "Median", "Mean", "MAP")] } else { names(parameters) <- c("Parameter", "Coefficient") } params <- parameters[names(parameters) %in% c("estimate", "Coefficient", "Median", "Mean", "MAP")][[1]] interactions <- info$Parameter[info$Type == "interaction"] if (length(interactions) > 0) { parent_effect <- type[type$Parameter == interactions, "Secondary_Term"] if (method == "absolute") { # Absolute method info[info$Parameter %in% interactions, "EffectSize_Type"] <- info[info$Parameter %in% parent_effect, "EffectSize_Type"] } else { # Relative method (compute percentage of change based on parent effect) parent_effect <- params[parameters$Parameter %in% parent_effect] interactions <- params[!is.na(info$EffectSize_Type) & info$EffectSize_Type == "interaction"] percentage <- (interactions + parent_effect) / abs(parent_effect) std_es[!is.na(info$EffectSize_Type) & info$EffectSize_Type == "interaction"] <- percentage } } list(info = info, std_es = std_es) } effectsize/R/normalize.R0000644000176200001440000000670313550556376014752 0ustar liggesusers#' Normalization #' #' Performs a normalization of data, i.e., it scales all numeric variables in the range 0 - 1. This is a special case of \code{\link{change_scale}}. #' #' @inheritParams standardize.data.frame #' #' @param x Object. #' @param include_bounds Logical, if \code{TRUE}, return value may include 0 #' and 1. If \code{FALSE}, the return value is compressed, using the formula #' \code{(x * (n - 1) + 0.5) / n} (\cite{Smithson and Verkuilen 2006}), to #' avoid zeros and ones in the normalized variables. This can be useful in #' case of beta-regression, where the response variable is not allowed to #' include zeros and ones. #' @param ... Arguments passed to or from other methods. #' #' @examples #' normalize(c(0, 1, 5, -5, -2)) #' normalize(c(0, 1, 5, -5, -2), include_bounds = FALSE) #' #' head(normalize(iris)) #' @references Smithson M, Verkuilen J (2006). A Better Lemon Squeezer? Maximum-Likelihood Regression with Beta-Distributed Dependent Variables. Psychological Methods, 11(1), 54–71. #' #' @seealso \code{\link{ranktransform}} \code{\link{standardize}} \code{\link{change_scale}} #' @return A normalized object. #' @export normalize <- function(x, ...) { UseMethod("normalize") } #' @rdname normalize #' @export normalize.numeric <- function(x, include_bounds = TRUE, verbose = TRUE, ...) { # Warning if all NaNs if (all(is.na(x))) { return(x) } # Warning if only one value if (length(unique(x)) == 1) { if (is.null(names(x))) { name <- deparse(substitute(x)) } else { name <- names(x) } if (verbose) { warning(paste0("Variable `", name, "` contains only one unique value and will not be normalized.")) } return(x) } # Warning if logical vector if (length(unique(x)) == 2) { if (is.null(names(x))) { name <- deparse(substitute(x)) } else { name <- names(x) } if (verbose) { warning(paste0("Variable `", name, "` contains only two different values. Consider converting it to a factor.")) } } out <- as.vector((x - min(x, na.rm = TRUE)) / diff(range(x, na.rm = TRUE), na.rm = TRUE)) if (!include_bounds && (any(out == 0) | any(out == 1))) { out <- (out * (length(out) - 1) + 0.5) / length(out) } out } #' @export normalize.factor <- function(x, ...) { x } #' @rdname normalize #' @export normalize.grouped_df <- function(x, select = NULL, exclude = NULL, include_bounds = TRUE, ...) { info <- attributes(x) # dplyr >= 0.8.0 returns attribute "indices" grps <- attr(x, "groups", exact = TRUE) # dplyr < 0.8.0? if (is.null(grps)) { grps <- attr(x, "indices", exact = TRUE) grps <- lapply(grps, function(x) x + 1) } else { grps <- grps[[".rows"]] } x <- as.data.frame(x) for (rows in grps) { x[rows, ] <- normalize( x[rows, ], select = select, exclude = exclude, include_bounds = include_bounds, ... ) } # set back class, so data frame still works with dplyr attributes(x) <- info x } #' @rdname normalize #' @export normalize.data.frame <- function(x, select = NULL, exclude = NULL, include_bounds = TRUE, ...) { if (is.null(select)) { select <- names(x) } if (!is.null(exclude)) { select <- setdiff(select, exclude) } x[select] <- lapply(x[select], normalize, include_bounds = include_bounds) x } effectsize/R/interpret_p.R0000644000176200001440000000104313553505430015261 0ustar liggesusers#' p-values interpretation #' #' @param p Value or vector of p-values. #' @param rules Can be "default" or custom set of rules. #' #' #' #' @examples #' interpret_p(.02) #' interpret_p(c(.5, .02)) #' @export interpret_p <- function(p, rules = "default") { if (is.rules(rules)) { return(interpret(p, rules)) } else { if (rules == "default") { return(interpret(p, rules(c(0.05), c("significant", "not significant")))) } else { stop("rules must be 'default' or an object of type rules.") } } } effectsize/R/convert_tFz_to_r.R0000644000176200001440000001113113613235007016250 0ustar liggesusers# t ----------------------------------------------------------------------- #' Convert test statistics (t, z, F) to effect sizes of differences (Cohen's d) or association (\strong{partial} r) #' #' These functions are convenience functions to convert t, z and F test statistics to Cohen's d and #' \strong{partial} r. These are useful in cases where the data required to compute these are not easily #' available or their computation is not straightforward (e.g., in liner mixed models, contrasts, etc.). #' #' @param r The correlation coefficient r. #' @param t,f,z The t, the F or the z statistics. #' @param df,df_error Degrees of freedom of numerator or of the error estimate (i.e., the residuals). #' @param n The number of observations (the sample size). #' @param pooled Should the estimate accout for the t-value being based on a repeated-measures design, or not (default). #' @param ... Arguments passed to or from other methods. #' #' @return A numeric value of the requested effect size. #' #' @details These functions use the following formulae: #' \cr\cr #' \deqn{r_{partial} = t / \sqrt{t^2 + df_{error}}} #' \cr\cr #' \deqn{r_{partial} = z / \sqrt{z^2 + N}} #' \cr\cr #' \deqn{Cohen's d = 2 * t / \sqrt{df_{error}}} #' \cr\cr #' \deqn{Cohen's d_z = t / \sqrt{df_{error}}} #' \cr\cr #' \deqn{Cohen's d = 2 * z / \sqrt{N}} #' #' @examples #' ## t Tests #' res <- t.test(1:10, y = c(7:20), var.equal = TRUE) #' t_to_d(t = res$statistic, res$parameter) #' t_to_r(t = res$statistic, res$parameter) #' #' res <- with(sleep, t.test(extra[group == 1], extra[group == 2], paired = TRUE)) #' t_to_d(t = res$statistic, res$parameter, pooled = TRUE) #' t_to_r(t = res$statistic, res$parameter) #' #' res <- cor.test(iris$Sepal.Width, iris$Petal.Width) #' t_to_r(t = res$statistic, n = 150) #' #' \donttest{ #' ## Linear Regression #' model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = iris) #' library(parameters) #' (param_tab <- parameters(model)) #' # > Parameter | Coefficient | SE | 95% CI | t | df | p #' # > ----------------------------------------------------------------------- #' # > (Intercept) | 2.25 | 0.25 | [1.76, 2.74] | 9.07 | 147 | < .001 #' # > Sepal.Width | 0.60 | 0.07 | [0.46, 0.73] | 8.59 | 147 | < .001 #' # > Petal.Length | 0.47 | 0.02 | [0.44, 0.51] | 27.57 | 147 | < .001 #' #' t_to_r(param_tab$t[2:3], param_tab$df_error[2:3]) #' # > [1] 0.5781005 0.9153894 #' } #' #' # How does this compare to actual partial correlations? #' if (require("ppcor")) { #' pcor(iris[1:3])$estimate[1, -1] #' } #' @references #' \itemize{ #' \item Friedman, H. (1982). Simplified determinations of statistical power, magnitude of effect and research sample sizes. Educational and Psychological Measurement, 42(2), 521-526. \doi{10.1177/001316448204200214} #' \item Wolf, F. M. (1986). Meta-analysis: Quantitative methods for research synthesis (Vol. 59). Sage. #' \item Rosenthal, R. (1991). Meta-analytic procedures for social research. Newbury Park, CA: SAGE Publications, Incorporated. #' } #' #' @export t_to_r <- function(t, n = NULL, df_error = NULL, ...) { if (is.null(df_error) & !is.null(n)) { df_error <- n - 2 } t / sqrt(t^2 + df_error) } #' @rdname t_to_r #' @export r_to_t <- function(r, n = NULL, df_error = NULL, ...){ if (is.null(df_error) & !is.null(n)) { df_error <- n - 2 } sign(r) * sqrt(-(r^2 * df_error) / (r^2 - 1)) } # z ----------------------------------------------------------------------- #' @rdname t_to_r #' @export z_to_r <- function(z, n = NULL, df_error = NULL, ...) { if (is.null(n) & !is.null(df_error)) { n <- df_error + 2 } z / sqrt(z^2 + n) } #' @rdname t_to_r #' @export r_to_z <- function(r, n = NULL, df_error = NULL, ...) { if (is.null(n) & !is.null(df_error)) { n <- df_error + 2 } sign(r) * sqrt(-(r^2 * n) / (r^2 - 1)) } # F ----------------------------------------------------------------------- #' @rdname t_to_r #' @export F_to_r <- function(f, df, df_error = NULL, n = NULL, ...) { if (df > 1) { stop("Cannot convert F with more than 1 df to r.") } t_to_r(sqrt(f), n = n, df_error = df_error) } # Aliases ----------------------------------------------------------------- #' @rdname t_to_r #' @export convert_t_to_r <- t_to_r #' @rdname t_to_r #' @export convert_r_to_t <- r_to_t #' @rdname t_to_r #' @export convert_z_to_r <- z_to_r #' @rdname t_to_r #' @export convert_r_to_z <- r_to_z #' @rdname t_to_r #' @export convert_F_to_r <- F_to_r effectsize/R/adjust.R0000644000176200001440000001266713604231154014232 0ustar liggesusers#' Adjust data for the effect of other variable(s) #' #' This function can be used to adjust the data for the effect of other variables present in the dataset. It is based on an underlying fitting of regressions models, allowing for quite some flexibility, such as including factors as random effects in mixed models (multilevel partialization), continuous variables as smooth terms in general additive models (non-linear partialization) and/or fitting these models under a Bayesian framework. The values returned by this function are the residuals of the regression models. Note that a regular correlation between two "adjusted" variables is equivalent to the partial correlation between them. #' #' @param data A dataframe. #' @param effect Character vector of column names to be adjusted for (regressed out). If \code{NULL} (the default), all variables will be selected. #' @inheritParams standardize #' @param multilevel If \code{TRUE}, the factors are included as random factors. Else, if \code{FALSE} (default), they are included as fixed effects in the simple regression model. #' @param additive If \code{TRUE}, continuous variables as included as smooth terms in additive models. The goal is to regress-out potential non-linear effects. #' @param bayesian If \code{TRUE}, the models are fitted under the Bayesian framework using \code{rstanarm}. #' #' @examples #' adjust(iris, effect = "Species", select = "Sepal.Length") #' \donttest{ #' adjust(iris, effect = "Species", select = "Sepal.Length", multilevel = TRUE) #' adjust(iris, effect = "Species", select = "Sepal.Length", bayesian = TRUE) #' adjust(iris, effect = "Petal.Width", select = "Sepal.Length", additive = TRUE) #' adjust(iris, effect = "Petal.Width", select = "Sepal.Length", #' additive = TRUE, bayesian = TRUE) #' adjust(iris, effect = c("Petal.Width", "Species"), select = "Sepal.Length", #' multilevel = TRUE, additive = TRUE) #' adjust(iris) #' } #' #' @export adjust <- function(data, effect = NULL, select = NULL, exclude = NULL, multilevel = FALSE, additive = FALSE, bayesian = FALSE){ # Find predictors if(is.null(effect)){ effect <- names(data) } # Factors formula_random <- NULL facs <- names(data[effect][!sapply(data[effect], is.numeric)]) if (length(facs) >= 1){ if(multilevel){ if(additive){ formula_random <- as.formula(paste("~", paste(paste0("(1|", facs, ")"), collapse = " + "))) } else{ formula_random <- paste("+", paste(paste0("(1|", facs, ")"), collapse = " + ")) } effect <- effect[!effect %in% facs] } } nums <- sapply(data, is.numeric) # Find outcomes if(is.null(select)){ select <- names(data[nums]) } if(is.null(exclude)){ select <- select[!select %in% c(exclude)] } # Fit models out <- data.frame(.ID = 1:nrow(data)) for(var in select){ predictors <- effect[effect != var] if(additive){ predictors_num <- names(data[predictors][sapply(data[predictors], is.numeric)]) predictors[predictors == predictors_num] <- paste0("s(", predictors_num, ")") } formula_predictors <- paste(c("1", predictors), collapse = " + ") formula <- paste(var, "~", formula_predictors) x <- .model_adjust_for(data=data[unique(c(var, effect, facs))], formula, multilevel = multilevel, additive = additive, bayesian = bayesian, formula_random = formula_random) out[var] <- x } out[names(data)[!names(data) %in% names(out)]] <- data[names(data)[!names(data) %in% names(out)]] out[names(data)] } #' @importFrom stats lm residuals as.formula complete.cases #' @keywords internal .model_adjust_for <- function(data, formula, multilevel = FALSE, additive = FALSE, bayesian = FALSE, formula_random = NULL) { # Additive ----------------------- if(additive){ # Bayesian if(bayesian){ if (!requireNamespace("rstanarm")) { stop("This function needs `rstanarm` to be installed. Please install by running `install.packages('rstanarm')`.") } adjusted <- rstanarm::stan_gamm4(as.formula(formula), random = formula_random, data = data, refresh = 0)$residuals # Frequentist } else{ if (!requireNamespace("gamm4")) { stop("This function needs `gamm4` to be installed. Please install by running `install.packages('gamm4')`.") } adjusted <- gamm4::gamm4(as.formula(formula), random = formula_random, data = data)$gam$residuals } # Linear ------------------------- } else{ # Bayesian if(bayesian){ if (!requireNamespace("rstanarm")) { stop("This function needs `rstanarm` to be installed. Please install by running `install.packages('rstanarm')`.") } if (multilevel) { adjusted <- rstanarm::stan_lmer(paste(formula, formula_random), data = data, refresh = 0)$residuals } else{ adjusted <- rstanarm::stan_glm(formula, data = data, refresh = 0)$residuals } # Frequentist } else{ if (multilevel) { if (!requireNamespace("lme4")) { stop("This function needs `lme4` to be installed. Please install by running `install.packages('lme4')`.") } adjusted <- residuals(lme4::lmer(paste(formula, formula_random), data = data)) } else{ adjusted <- lm(formula, data = data)$residuals } } } # Deal with missing data out <- rep(NA, nrow(data)) out[complete.cases(data)] <- as.vector(adjusted) out } effectsize/R/utils_factor_to_numeric.R0000644000176200001440000000063013547034362017655 0ustar liggesusers#' Safe transformation from factor/character to numeric #' #' @importFrom stats na.omit #' @keywords internal .factor_to_numeric <- function(x) { if (is.numeric(x)) { return(x) } if (anyNA(suppressWarnings(as.numeric(as.character(stats::na.omit(x)))))) { if (is.character(x)) { x <- as.factor(x) } levels(x) <- 1:nlevels(x) } as.numeric(as.character(x)) } effectsize/R/standardize.R0000644000176200001440000000476513573177066015270 0ustar liggesusers#' Standardization (Z-scoring) #' #' Performs a standardization of data (Z-scoring), i.e., centering and scaling, so that the data is expressed in terms of standard deviation (i.e., mean = 0, SD = 1) or Median Absolute Deviance (median = 0, MAD = 1). When applied to a statistical model, this function extracts the dataset, standardizes it, and refits the model with this standardized version of the dataset. The \code{\link{normalize}} function can also be used to scale all numeric variables within the 0 - 1 range. #' #' @param x A dataframe, a vector or a statistical model. #' @param robust Logical, if \code{TRUE}, centering is done by substracting the #' median from the variables and dividing it by the median absolute deviation #' (MAD). If \code{FALSE}, variables are standardized by substracting the #' mean and dividing it by the standard deviation (SD). #' @param two_sd If \code{TRUE}, the variables are scaled by two times the deviation (SD or MAD depending on \code{robust}). This method can be useful to obtain model coefficients of continuous parameters comparable to coefficients related to binary predictors (Gelman, 2008). #' @param verbose Toggle warnings on or off. #' @param force Logical, if \code{TRUE}, forces standardization of factors as #' well. Factors are converted to numerical values, with the lowest level #' being the value \code{1} (unless the factor has numeric levels, which are #' converted to the corresponding numeric value). #' @param select Character vector of column names. If \code{NULL} (the default), all variables will be selected. #' @param exclude Character vector of column names to be excluded from selection. #' @param include_response For a model, if \code{TRUE} (default), the response value #' will also be standardized. If \code{FALSE}, only the predictors will be standardized. #' Note that for certain models (logistic regression, count models, ...), the #' response value will never be standardized, to make re-fitting the model work. #' @param ... Arguments passed to or from other methods. #' #' @return The standardized object (either a standardize dataframe or a statistical model fitted on standardized data). #' #' @seealso \code{\link{normalize}} \code{\link{standardize_parameters}} #' @examples #' # Dataframes #' summary(standardize(iris)) #' #' # Models #' model <- lm(Sepal.Length ~ Species * Petal.Width, data = iris) #' coef(standardize(model)) #' @export standardize <- function(x, ...) { UseMethod("standardize") } effectsize/R/interpret_direction.R0000644000176200001440000000040513525007414017001 0ustar liggesusers#' Direction interpretation #' #' @param x Numeric value. #' #' #' #' @examples #' interpret_direction(.02) #' interpret_direction(c(.5, -.02)) #' # #' @export interpret_direction <- function(x) { return(ifelse(x > 0, "positive", "negative")) } effectsize/R/standardize.data.frame.R0000644000176200001440000000676113571424557017265 0ustar liggesusers#' @importFrom stats median mad na.omit #' @export standardize.numeric <- function(x, robust = FALSE, two_sd = FALSE, verbose = TRUE, ...) { # Warning if all NaNs if (all(is.na(x))) { return(x) } x <- stats::na.omit(x) # Sanity checks check <- .check_standardize_numeric(x, name = NULL, verbose = verbose) if (is.null(check)) { return(x) } if (is.factor(x) || is.character(x)) { x <- .factor_to_numeric(x) } if (robust) { center <- stats::median(x) scale <- stats::mad(x) } else { center <- mean(x) scale <- stats::sd(x) } if (two_sd) { x <- as.vector((x - center) / 2 * scale) } else { x <- as.vector((x - center) / scale) } attr(x, "center") <- center attr(x, "scale") <- scale x } #' @keywords internal .check_standardize_numeric <- function(x, name = NULL, verbose = TRUE) { # Warning if only one value if (length(unique(x)) == 1) { if (verbose) { if (is.null(name)) { message("The variable contains only one unique value and will not be standardized.") } else { message(paste0("The variable `", name, "` contains only one unique value and will not be standardized.")) } } return(NULL) } # Warning if logical vector if (length(unique(x)) == 2 && !is.factor(x) && !is.character(x)) { if (verbose) { if (is.null(name)) { message("The variable contains only two different values. Consider converting it to a factor.") } else { message(paste0("Variable `", name, "` contains only two different values. Consider converting it to a factor.")) } } } x } #' @export standardize.factor <- function(x, force = FALSE, ...) { if (force) { standardize(as.numeric(x), ...) } else { x } } #' @export standardize.character <- standardize.factor #' @export standardize.logical <- standardize.factor #' @export standardize.AsIs <- standardize.numeric #' @export standardize.grouped_df <- function(x, robust = FALSE, two_sd = FALSE, select = NULL, exclude = NULL, verbose = TRUE, force = FALSE, ...) { info <- attributes(x) # dplyr >= 0.8.0 returns attribute "indices" grps <- attr(x, "groups", exact = TRUE) # dplyr < 0.8.0? if (is.null(grps)) { grps <- attr(x, "indices", exact = TRUE) grps <- lapply(grps, function(x) x + 1) } else { grps <- grps[[".rows"]] } x <- as.data.frame(x) for (rows in grps) { x[rows, ] <- standardize( x[rows, ], select = select, exclude = exclude, robust = robust, two_sd = two_sd, verbose = verbose, force = force, ... ) } # set back class, so data frame still works with dplyr attributes(x) <- info x } #' @rdname standardize #' @export standardize.data.frame <- function(x, robust = FALSE, two_sd = FALSE, select = NULL, exclude = NULL, verbose = TRUE, force = FALSE, ...) { if (is.null(select)) { select <- names(x) } if (!is.null(exclude)) { select <- setdiff(select, exclude) } for (i in 1:length(select)) { .check_standardize_numeric(x[[select[i]]], name = select[i], verbose = verbose) } x[select] <- lapply(x[select], standardize, robust = robust, two_sd = two_sd, verbose = FALSE, force = force) attr(x, "center") <- sapply(x[select], function(z) attributes(z)$center) attr(x, "scale") <- sapply(x[select], function(z) attributes(z)$scale) x } effectsize/R/format_standardize.R0000644000176200001440000000304713544553713016623 0ustar liggesusers#' Transform a standardized vector into character #' #' Transform a standardized vector into character, e.g., \code{c("-1 SD", "Mean", "+1 SD")}. #' #' @param x A standardized numeric vector. #' @param reference The reference vector from which to compute the mean and SD. #' @inheritParams standardize #' @inheritParams insight::format_value #' #' @examples #' format_standardize(c(-1, 0, 1)) #' format_standardize(c(-1, 0, 1, 2), reference = rnorm(1000)) #' format_standardize(c(-1, 0, 1, 2), reference = rnorm(1000), robust = TRUE) #' @importFrom stats median mad sd #' @importFrom insight format_value #' @export format_standardize <- function(x, reference = x, robust = FALSE, digits = NULL, ...) { if (robust) { central <- stats::median(reference, na.rm = TRUE) central_name <- "Median" deviation <- stats::mad(reference, na.rm = TRUE) deviation_name <- "MAD" } else { central <- mean(reference, na.rm = TRUE) central_name <- "Mean" deviation <- stats::sd(reference, na.rm = TRUE) deviation_name <- "SD" } # Express in deviations x <- (x - central) / deviation # Round if (is.null(digits)) { x <- insight::format_value(x, round(1 / diff(range(x, na.rm = TRUE))), protect_integers = TRUE) } else { x <- insight::format_value(x, digits = digits, protect_integers = TRUE) } # Complete x[!grepl("-", x)] <- paste0("+", x[!grepl("-", x)]) x[x != "+0"] <- paste(x[x != "+0"], deviation_name) x[x == "+0"] <- central_name factor(x, levels = rev(unique(x))) } effectsize/R/interpret_r.R0000644000176200001440000000402013553505515015265 0ustar liggesusers#' Correlation interpretation #' #' @param r Value or vector of correlation coefficient. #' @param rules Can be "funder2019" (default), "gignac2016", cohen1988", "evans1996" or custom set of rules. #' #' #' #' @examples #' interpret_r(r = .015) #' interpret_r(r = c(.5, -.02)) #' @seealso Page 88 of APA's 6th Edition. #' @references #' \itemize{ #' \item Funder, D. C., & Ozer, D. J. (2019). Evaluating effect size in psychological research: sense and nonsense. Advances in Methods and Practices in Psychological Science. #' \item Gignac, G. E., & Szodorai, E. T. (2016). Effect size guidelines for individual differences researchers. Personality and individual differences, 102, 74-78. #' \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. #' \item Evans, J. D. (1996). Straightforward statistics for the behavioral sciences. Thomson Brooks/Cole Publishing Co. #' } #' @export interpret_r <- function(r, rules = "funder2019") { if (is.rules(rules)) { return(interpret(abs(r), rules)) } else { if (rules == "funder2019") { text <- interpret( abs(r), rules( c(0.05, 0.1, 0.2, 0.3, 0.4), c("tiny", "very small", "small", "medium", "large", "very large") ) ) } else if (rules == "gignac2016") { text <- interpret( abs(r), rules( c(0.1, 0.2, 0.3), c("very small", "small", "moderate", "large") ) ) } else if (rules == "cohen1988") { text <- interpret( abs(r), rules( c(0.1, 0.3, 0.5), c("very small", "small", "moderate", "large") ) ) } else if (rules == "evans1996") { text <- interpret( abs(r), rules( c(0.2, 0.4, 0.6, 0.8), c("very weak", "weak", "moderate", "strong", "very strong") ) ) } else { stop("rules must be 'gignac2016', 'cohen1988', 'evans1996' or an object of type rules.") } } text } effectsize/R/standardize_info.R0000644000176200001440000001621513553522775016273 0ustar liggesusers#' Get Standardization Information #' #' This function extracts information, such as the deviations (SD or MAD) from parent variables, that are necessary for post-hoc standardization of parameters. This function gives a window on how standardized are obtained, i.e., by what they are devided. The "basic" method of standardization uses #' #' @inheritParams standardize_parameters #' #' @examples #' model <- lm(Sepal.Width ~ Sepal.Length * Species, data = iris) #' @importFrom parameters parameters_type #' @export standardize_info <- function(model, robust = FALSE, ...) { params <- insight::find_parameters(model, effects = "fixed", flatten = TRUE, ...) types <- parameters::parameters_type(model) model_matrix <- as.data.frame(stats::model.matrix(model)) data <- insight::get_data(model) out <- data.frame( Parameter = params, Type = types$Type, Link = types$Link, Secondary_Parameter = types$Secondary_Parameter, stringsAsFactors = FALSE ) # Type of effect size out$EffectSize_Type <- ifelse(types$Type == "interaction", "interaction", ifelse(types$Link == "Association", "r", ifelse(types$Link == "Difference", "d", NA) ) ) # Response - Basic out <- merge( out, .std_info_response_basic(model, params, robust = robust) ) # Response - Smart out <- merge( out, .std_info_response_smart(model, data, model_matrix, types, robust = robust) ) # Basic out <- merge( out, .std_info_predictors_basic(model_matrix, types, robust = robust) ) # Smart out <- merge( out, .std_info_predictors_smart(data, params, types, robust = robust) ) # Reorder out <- out[match(params, out$Parameter), ] row.names(out) <- NULL # Remove all means for now (because it's not used) out <- out[!grepl("Mean_", names(out))] # Select only desired columns # if(method == "all") method <- c("smart", "basic") # if(!any(method == "smart")){ # out <- out[!grepl("_Smart", names(out))] # } # if(!any(method == "basic")){ # out <- out[!grepl("_Basic", names(out))] # } out } # Predictors - Smart ------------------------------------------------------------ #' @keywords internal .std_info_predictors_smart <- function(data, params, types, robust = FALSE, ...) { # Get deviations for all parameters deviations <- c() means <- c() for (var in params) { info <- .std_info_predictor_smart( data = data, variable = types[types$Parameter == var, "Variable"], type = types[types$Parameter == var, "Type"], robust = robust ) deviations <- c(deviations, info$sd) means <- c(means, info$mean) } # Out data.frame( Parameter = params, Deviation_Smart = deviations, Mean_Smart = means ) } #' @keywords internal .std_info_predictor_smart <- function(data, variable, type, robust = FALSE, ...) { if (type == "intercept") { info <- list(sd = 0, mean = 0) } else if (type == "numeric") { info <- .compute_std_info(data = data, variable = variable, robust = robust) } else if (type == "factor") { info <- list(sd = 1, mean = 0) # TO BE IMPROVED: Adjust if involved in interactions # interactions <- types[types$Type %in% c("interaction"), ] # if(variable %in% interactions$Secondary_Variable){ # interac_var <- unique(interactions[interactions$Secondary_Variable == variable, "Variable"]) # for(i in interac_var){ # if(types[types$Parameter == i, "Type"] == "numeric"){ # sd_x <- sd_x * .get_deviation(data, i, robust) # } # } # } } else if (type %in% c("interaction", "nested")) { if (is.numeric(data[, variable])) { info <- .compute_std_info(data = data, variable = variable, robust = robust) } else if (is.factor(data[, variable])) { info <- list(sd = 1, mean = 0) } else { info <- list(sd = 1, mean = 0) } } else { info <- list(sd = 1, mean = 0) } list(sd = info$sd, mean = info$mean) } # Predictors - Basic ------------------------------------------------------------ #' @keywords internal .std_info_predictors_basic <- function(model_matrix, types, robust = FALSE, ...) { # Get deviations for all parameters deviations <- c() means <- c() for (var in names(model_matrix)) { if (types[types$Parameter == var, "Type"] == "intercept") { deviations <- c(deviations, 0) means <- c(means, 0) } else { std_info <- .compute_std_info(data = model_matrix, variable = var, robust = robust) deviations <- c(deviations, std_info$sd) means <- c(means, std_info$mean) } } # Out data.frame( Parameter = names(model_matrix), Deviation_Basic = deviations, Mean_Basic = means ) } # Response ------------------------------------------------------------ #' @keywords internal .std_info_response_smart <- function(model, data, model_matrix, types, robust = FALSE, ...) { info <- insight::model_info(model) if (info$is_linear) { response <- insight::get_response(model) deviations <- c() means <- c() for (var in names(model_matrix)) { if (types$Link[types$Parameter == var] == "Difference") { parent_var <- types$Variable[types$Parameter == var] intercept <- unique(data[[parent_var]])[1] response_at_intercept <- response[data[[parent_var]] == intercept] std_info <- .compute_std_info(response = response_at_intercept, robust = robust) deviations <- c(deviations, std_info$sd) means <- c(means, std_info$mean) } else { std_info <- .compute_std_info(response = response, robust = robust) deviations <- c(deviations, std_info$sd) means <- c(means, std_info$mean) } } } else { deviations <- 1 means <- 0 } # Out data.frame( Parameter = names(model_matrix), Deviation_Response_Smart = deviations, Mean_Response_Smart = means ) } #' @keywords internal .std_info_response_basic <- function(model, params, robust = FALSE, ...) { info <- insight::model_info(model) response <- insight::get_response(model) if (info$is_linear) { if (robust == FALSE) { sd_y <- stats::sd(response) mean_y <- mean(response) } else { sd_y <- stats::mad(response) mean_y <- stats::median(response) } } else { sd_y <- 1 mean_y <- 0 } # Out data.frame( Parameter = params, Deviation_Response_Basic = sd_y, Mean_Response_Basic = mean_y ) } # Utils ------------------------------------------------------------------- #' @keywords internal .compute_std_info <- function(data = NULL, variable = NULL, response = NULL, robust = FALSE) { if (is.null(response)) { response <- as.numeric(data[, variable]) } if (robust == FALSE) { sd_x <- stats::sd(response, na.rm = TRUE) mean_x <- mean(response, na.rm = TRUE) } else { sd_x <- stats::mad(response, na.rm = TRUE) mean_x <- stats::median(response, na.rm = TRUE) } list(sd = sd_x, mean = mean_x) } effectsize/R/convert_odds_to_d.R0000644000176200001440000000162713553465530016442 0ustar liggesusers#' @rdname d_to_r #' @export odds_to_d <- function(odds, log = FALSE, ...) { if (log == FALSE) { log_odds <- log(odds) } else { log_odds <- odds } log_odds * (sqrt(3) / pi) } #' @rdname d_to_r #' @export convert_odds_to_d <- odds_to_d #' @rdname d_to_r #' @export d_to_odds <- function(d, log = FALSE, ...) { if (log == TRUE) { d * pi / sqrt(3) } else { exp(d * pi / sqrt(3)) } } #' @rdname d_to_r #' @export convert_d_to_odds <- d_to_odds #' @rdname d_to_r #' @export r_to_odds <- function(r, log = FALSE, ...) { convert_d_to_odds(convert_r_to_d(r), log = log) } #' @rdname d_to_r #' @export convert_r_to_odds <- r_to_odds #' @rdname d_to_r #' @export odds_to_r <- function(odds, log = FALSE, ...) { convert_d_to_r(convert_odds_to_d(odds, log = log)) } #' @rdname d_to_r #' @export convert_odds_to_r <- odds_to_r effectsize/R/cohens_d.R0000644000176200001440000001112313571423721014512 0ustar liggesusers#' Effect size for differences #' #' Compute different indices of effect size. For very small sample sizes (n < 20) Hedges' g is considered as less biased than Cohen's d. For sample sizes > 20, the results for both statistics are roughly equivalent. The Glass’s delta is appropriate if standard deviations are significantly different between groups, as it uses only the control group's (\code{x}) standard deviation. #' #' @param x A continuous variable or a formula. #' @param y A continuous variable, a factor with two groups or a formula. #' @param data An optional data frame containing the variables. #' @param correction If \code{TRUE}, applies a correction to the formula to make it less biased for small samples (McGrath & Meyer, 2006). #' @param pooled_sd If \code{FALSE}, the regular SD from both combined groups is used instead of the \code{\link{sd_pooled}}. #' @param paired If \code{TRUE}, the values of \code{x} and \code{y} are considered as paired. #' #' #' @examples #' cohens_d(iris$Sepal.Length, iris$Sepal.Width) #' hedges_g("Sepal.Length", "Sepal.Width", data = iris) #' glass_delta(Sepal.Length ~ Sepal.Width, data = iris) #' #' cohens_d(iris$Sepal.Length, iris$Sepal.Width, correct = TRUE, pooled_sd = FALSE) #' cohens_d(Sepal.Length ~ Species, data = iris[iris$Species %in% c("versicolor", "setosa"), ]) #' @references \itemize{ #' \item Cohen, J. (2013). Statistical power analysis for the behavioral sciences. Routledge. #' \item McGrath, R. E., & Meyer, G. J. (2006). When effect sizes disagree: the case of r and d. Psychological methods, 11(4), 386. #' \item Hedges, L. V. & Olkin, I. (1985). Statistical methods for meta-analysis. Orlando, FL: Academic Press. #' } #' @importFrom stats var model.frame #' @export cohens_d <- function(x, y = NULL, data = NULL, correction = FALSE, pooled_sd = TRUE, paired = FALSE) { .effect_size_difference(x, y = y, data = data, type = "d", correction = correction, pooled_sd = pooled_sd, paired = paired) } #' @rdname cohens_d #' @export hedges_g <- function(x, y = NULL, data = NULL, correction = FALSE, pooled_sd = TRUE, paired = FALSE) { .effect_size_difference(x, y = y, data = data, type = "g", correction = correction, pooled_sd = pooled_sd, paired = paired) } #' @rdname cohens_d #' @export glass_delta <- function(x, y = NULL, data = NULL, correction = FALSE) { .effect_size_difference(x, y = y, data = data, type = "delta", correction = correction) } #' @importFrom stats sd #' @keywords internal .effect_size_difference <- function(x, y = NULL, data = NULL, type = "d", correction = FALSE, pooled_sd = TRUE, paired = FALSE) { out <- .deal_with_cohens_d_arguments(x, y, data) x <- out$x y <- out$y # Compute index diff_of_means <- mean(x, na.rm = TRUE) - mean(y, na.rm = TRUE) if (type == "d" | type == "g") { if (paired) { denominator <- stats::sd(x - y, na.rm = TRUE) } else { if (pooled_sd) { denominator <- sd_pooled(x, y) } else { denominator <- stats::sd(c(x, y), na.rm = TRUE) } } if (type == "g") { if (paired) { J <- 1 - 3 / (4 * (length(x) - 1) - 1) } else { J <- 1 - 3 / (4 * length(c(x, y)) - 9) } diff_of_means <- diff_of_means * J } } else if (type == "delta") { denominator <- stats::sd(x, na.rm = TRUE) } d <- diff_of_means / denominator # McGrath & Meyer (2006) if (correction == TRUE) { n <- length(c(x, y)) d <- d * ((n - 3) / (n - 2.25)) * ((n - 2) / n) } d } #' @keywords internal .deal_with_cohens_d_arguments <- function(x, y = NULL, data = NULL) { # Sanity checks if (inherits(x, "formula") | is.character(x) | is.character(y)) { if (is.null(data)) { stop("Please provide data argument.") } } # Preprocess data if (inherits(x, "formula")) { data <- model.frame(x, data = data) x <- names(data)[1] y <- names(data)[2] } if (is.character(x)) { x <- data[[x]] } if (is.character(y)) { y <- data[[y]] } # If y is a factor if (!is.null(y)) { if (is.factor(y) | is.character(y)) { if (length(x) != length(y)) { stop("The length of the group factor must be the same.") } if (length(unique(y)) > 2) { stop("Cannot compute the difference as a factor with more than 2 levels has been provided.") } else { groups <- as.character(y) y <- x[groups == unique(groups)[2]] x <- x[groups == unique(groups)[1]] } } } list(x = x, y = y) } effectsize/R/convert_tF_to_pve.R0000644000176200001440000001012113613235007016405 0ustar liggesusers#' Convert test statistics (F, t) to indices of \strong{partial} variance explained (\strong{partial} Eta / Omega / Epsilon squared) #' #' These functions are convenience functions to convert F and t test statistics to \strong{partial} Eta squared, (\eqn{\eta{_p}^2}), Omega squared (\eqn{\omega{_p}^2}) and Epsilon squared (\eqn{\epsilon{_p}^2}; an alias for the adjusted Eta squared). These are useful in cases where the various Sum of Squares and Mean Squares are not easily available or their computation is not straightforward (e.g., in liner mixed models, contrasts, etc.). For test statistics derived from \code{lm} and \code{aov} models, these functions give exact results. For all other cases, they return close approximations. #' #' @param t,f The t or the F statistics. #' @param df,df_error Degrees of freedom of numerator or of the error estimate (i.e., the residuals). #' @param ... Arguments passed to or from other methods. #' #' @return A numeric value between 0-1 (Note that for \eqn{\omega_p^2} and \eqn{\epsilon_p^2} #' it is possible to compute a negative number; even though this doesn't make any practical sense, #' it is recommended to report the negative number and not a 0). #' #' @details These functions use the following formulae: #' \cr\cr #' \deqn{\eta_p^2 = \frac{F \times df_{num}}{F \times df_{num} + df_{den}}} #' \cr\cr #' \deqn{\epsilon_p^2 = \frac{(F - 1) \times df_{num}}{F \times df_{num} + df_{den}}} #' \cr\cr #' \deqn{\omega_p^2 = \frac{(F - 1) \times df_{num}}{F \times df_{num} + df_{den} + 1}} #' \cr\cr\cr #' For \eqn{t}, the conversion is based on the equality of \eqn{t^2 = F} when \eqn{df_{num}=1}. #' #' @note \eqn{Adj. \eta_p^2} is an alias for \eqn{\epsilon_p^2}. #' #' @examples #' \donttest{ #' if (require("afex")) { #' data(md_12.1) #' aov_ez("id", "rt", md_12.1, #' within = c("angle", "noise"), #' anova_table = list(correction = "none", es = "pes") #' ) #' } #' # compare to: #' F_to_eta2(40.72, 2, 18) #' F_to_eta2(33.77, 1, 9) #' F_to_eta2(45.31, 2, 18) #' #' #' if (require("lmerTest")) { # for the df_error #' fit <- lmer(extra ~ group + (1 | ID), sleep) #' anova(fit) #' # Type III Analysis of Variance Table with Satterthwaite's method #' # Sum Sq Mean Sq NumDF DenDF F value Pr(>F) #' # group 12.482 12.482 1 9 16.501 0.002833 ** #' # --- #' # Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 #' F_to_eta2(16.501, 1, 9) #' F_to_omega2(16.501, 1, 9) #' F_to_epsilon2(16.501, 1, 9) #' } #' } #' @references #' \itemize{ #' \item Friedman, H. (1982). Simplified determinations of statistical power, magnitude of effect and research sample sizes. Educational and Psychological Measurement, 42(2), 521-526. \doi{10.1177/001316448204200214} #' \item Mordkoff, J. T. (2019). A Simple Method for Removing Bias From a Popular Measure of Standardized Effect Size: Adjusted Partial Eta Squared. Advances in Methods and Practices in Psychological Science, 2(3), 228-232. \doi{10.1177/2515245919855053} #' \item Albers, C., & Lakens, D. (2018). When power analyses based on pilot data are biased: Inaccurate effect size estimators and follow-up bias. Journal of experimental social psychology, 74, 187-195. \doi{10.31234/osf.io/b7z4q} #' } #' #' @export F_to_eta2 <- function(f, df, df_error, ...) { (f * df) / (f * df + df_error) } #' @rdname F_to_eta2 #' @export t_to_eta2 <- function(t, df_error, ...) { F_to_eta2(t^2, 1, df_error) } #' @rdname F_to_eta2 #' @export F_to_epsilon2 <- function(f, df, df_error, ...) { ((f - 1) * df) / (f * df + df_error) } #' @rdname F_to_eta2 #' @export t_to_epsilon2 <- function(t, df_error, ...) { F_to_epsilon2(t^2, 1, df_error) } #' @rdname F_to_eta2 #' @export F_to_eta2_adj <- F_to_epsilon2 #' @rdname F_to_eta2 #' @export t_to_eta2_adj <- t_to_epsilon2 #' @rdname F_to_eta2 #' @export F_to_omega2 <- function(f, df, df_error, ...) { ((f - 1) * df) / (f * df + df_error + 1) } #' @rdname F_to_eta2 #' @export t_to_omega2 <- function(t, df_error, ...) { F_to_omega2(t^2, 1, df_error) } effectsize/R/utils_ci_eta_squared.R0000644000176200001440000001005513550277772017135 0ustar liggesusers#' @keywords internal .ci_eta_squared <- function(x, partial, ci.lvl, df, statistic, model, iterations) { if (is.null(ci.lvl) || is.na(ci.lvl)) { return(x) } if (isTRUE(partial)) { ci_eta <- lapply( 1:nrow(x), function(.x) { if (!is.na(statistic[.x])) { ci <- .ci_partial_eta_squared( F.value = statistic[.x], df1 = df[.x], df2 = df[nrow(x)], conf.level = ci.lvl ) ci.low <- ci$LL ci.high <- ci$UL } else { ci.low <- ci.high <- NA } data.frame( CI_low = ci.low, CI_high = ci.high ) } ) cbind(x, do.call(rbind, ci_eta)) } else { if (inherits(model, "anova") || is.data.frame(model)) { warning("Confidence intervals can't be computed for data frames or objects of class 'anova'.") return(x) } if (!requireNamespace("boot", quietly = TRUE)) { stop("Package 'boot' needed for this function to work. Please install it.") } dat <- insight::get_data(model) boot_function <- function(model, data, indices) { d <- data[indices, ] # allows boot to select sample fit <- stats::aov(insight::find_formula(model)$conditional, data = d) params <- as.data.frame(parameters::model_parameters(fit)) values <- .values_aov(params) osq <- .extract_eta_squared(params, values, partial = FALSE) osq[["Eta_Sq"]] } results <- boot::boot( data = dat, statistic = boot_function, R = iterations, model = model, parallel = "multicore" ) df <- as.data.frame(results$t) x$CI_low <- sapply(df[, 1:ncol(df)], stats::quantile, probs = (1 - ci.lvl) / 2, na.rm = TRUE) x$CI_high <- sapply(df[, 1:ncol(df)], stats::quantile, probs = (1 + ci.lvl) / 2, na.rm = TRUE) x } } # The function partial_eta_sq_ci() is licensed unter MIT # Original Author: David Stanley # Code copied from https://github.com/dstanley4/apaTables # (https://github.com/dstanley4/apaTables/blob/master/R/etaSquaredCI.R) # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #' @keywords internal .ci_partial_eta_squared <- function(F.value, df1, df2, conf.level = .90) { F_value <- F.value conf_level <- conf.level F_limits <- .confint_ncg( F.value = F_value, df.1 = df1, df.2 = df2, conf.level = conf_level ) LL_lambda <- F_limits$Lower.Limit UL_lambda <- F_limits$Upper.Limit LL_partial_eta2 <- .get_partial_eta2_from_lambda(lambda = LL_lambda, df1 = df1, df2 = df2) UL_partial_eta2 <- .get_partial_eta2_from_lambda(lambda = UL_lambda, df1 = df1, df2 = df2) if (is.na(LL_partial_eta2)) { LL_partial_eta2 <- 0 } if (is.na(UL_partial_eta2)) { UL_partial_eta2 <- 1 } list(LL = LL_partial_eta2, UL = UL_partial_eta2) } #' @keywords internal .get_partial_eta2_from_lambda <- function(lambda, df1, df2) { lambda / (lambda + df1 + df2 + 1) } effectsize/R/utils_values_aov.R0000644000176200001440000000201713550520360016310 0ustar liggesusers#' @keywords internal .values_aov <- function(params) { # number of observations if ("Group" %in% names(params) && ("Within" %in% params$Group)) { lapply(split(params, params$Group), function(.i) { N <- sum(.i$df) + 1 .prepare_values_aov(.i, N) }) } else { N <- sum(params$df) + 1 .prepare_values_aov(params, N) } } #' @keywords internal .prepare_values_aov <- function(params, N) { # get mean squared of residuals Mean_Square_residuals <- sum(params[params$Parameter == "Residuals", ]$Mean_Square) # get sum of squares of residuals Sum_Squares_residuals <- sum(params[params$Parameter == "Residuals", ]$Sum_Squares) # get total sum of squares Sum_Squares_total <- sum(params$Sum_Squares) # number of terms in model N_terms <- nrow(params) - 1 list( "Mean_Square_residuals" = Mean_Square_residuals, "Sum_Squares_residuals" = Sum_Squares_residuals, "Sum_Squares_total" = Sum_Squares_total, "n_terms" = N_terms, "n" = N ) } effectsize/R/eta_squared.R0000644000176200001440000002110613564201557015232 0ustar liggesusers#' Effect size for ANOVA #' #' Functions to compute effect size measures for ANOVAs, such as Eta, Omega and Epsilon squared (or their partialled versions), #' representing an estimate of how much variance in the response variables are accounted for by the explanatory variables. #' #' @param model An model or ANOVA object. #' @param partial If \code{TRUE}, return partial indices. #' @param ci Confidence Interval (CI) level when computed via bootstrap. #' @param iterations Number of bootstrap iterations. #' @param ... Arguments passed to or from other methods. #' #' @details #' \subsection{Omega Squared}{ #' Omega squared is considered as a lesser biased alternative to eta-squared, especially when sample sizes are small (Albers \& Lakens, 2018). Field (2013) suggests the following interpretation heuristics: #' \itemize{ #' \item Omega Squared = 0 - 0.01: Very small #' \item Omega Squared = 0.01 - 0.06: Small #' \item Omega Squared = 0.06 - 0.14: Medium #' \item Omega Squared > 0.14: Large #' } #' #' } \subsection{Epsilon Squared}{ #' It is one of the least common measures of effect sizes: omega squared and eta squared are used more frequently. Although having a different name and a formula in appearance different, this index is equivalent to the adjusted R2 (Allen, 2017, p. 382). #' #' } \subsection{Cohen's f}{ #' Cohen's f statistic is one appropriate effect size index to use for a oneway analysis of variance (ANOVA). Cohen's f can take on values between zero, when the population means are all equal, and an indefinitely large number as standard deviation of means increases relative to the average standard deviation within each group. Cohen has suggested that the values of 0.10, 0.25, and 0.40 represent small, medium, and large effect sizes, respectively. #' } #' #' @examples #' library(effectsize) #' #' df <- iris #' df$Sepal.Big <- ifelse(df$Sepal.Width >= 3, "Yes", "No") #' #' model <- aov(Sepal.Length ~ Sepal.Big, data = df) #' omega_squared(model) #' eta_squared(model) #' epsilon_squared(model) #' cohens_f(model) #' #' model <- anova(lm(Sepal.Length ~ Sepal.Big * Species, data = df)) #' omega_squared(model) #' eta_squared(model) #' epsilon_squared(model) #' \donttest{ #' # Don't work for now #' model <- aov(Sepal.Length ~ Sepal.Big + Error(Species), data = df) #' omega_squared(model) #' eta_squared(model) #' epsilon_squared(model) #' } #' #' @return Data.frame containing the effect size values. #' #' #' @references \itemize{ #' \item Albers, C., \& Lakens, D. (2018). When power analyses based on pilot data are biased: Inaccurate effect size estimators and follow-up bias. Journal of experimental social psychology, 74, 187-195. #' \item Allen, R. (2017). Statistics and Experimental Design for Psychologists: A Model Comparison Approach. World Scientific Publishing Company. #' \item Field, A. (2013). Discovering statistics using IBM SPSS statistics. sage. #' \item Kelley, K. (2007). Methods for the behavioral, educational, and social sciences: An R package. Behavior Research Methods, 39(4), 979-984. #' \item Kelley, T. (1935) An unbiased correlation ratio measure. Proceedings of the National Academy of Sciences. 21(9). 554-559. #' } #' #' The computation of CIs is based on the implementation done by Stanley (2018) in the \code{ApaTables} package and Kelley (2007) in the \code{MBESS} package. All credits go to them. #' #' @importFrom parameters model_parameters #' @export eta_squared <- function(model, partial = TRUE, ci = NULL, iterations = 1000, ...) { UseMethod("eta_squared") } #' @importFrom stats anova #' @export eta_squared.aov <- function(model, partial = TRUE, ci = NULL, iterations = 1000, ...) { if (!inherits(model, c("Gam", "aov", "anova", "anova.rms"))) model <- stats::anova(model) out <- .eta_squared(model, partial = partial, ci = ci, iterations = iterations) class(out) <- c(ifelse(isTRUE(partial), "partial_eta_squared", "eta_squared"), class(out)) out } #' @export eta_squared.lm <- eta_squared.aov #' @export eta_squared.glm <- eta_squared.aov #' @export eta_squared.anova <- function(model, partial = TRUE, ci = NULL, iterations = 1000, ...) { if ("DenDF" %in% colnames(model)) { if (isFALSE(partial)) { warning("Currently only supports partial eta squared for mixed models.") } par_table <- as.data.frame(model) par_table$Parameter <- rownames(par_table) colnames(par_table)[colnames(par_table) == "NumDF"] <- "df" colnames(par_table)[colnames(par_table) == "DenDF"] <- "df2" colnames(par_table)[colnames(par_table) == "F value"] <- "F" .eta_square_from_F(par_table, ci = ci) } else { eta_squared.aov(model, partial = partial, ci = ci, iterations = iterations, ...) } } #' @export eta_squared.aovlist <- function(model, partial = TRUE, ci = NULL, ...) { if (isFALSE(partial)) { warning("Currently only supports partial eta squared for repeated-measures ANOVAs.") } par_table <- as.data.frame(parameters::model_parameters(model)) par_table <- split(par_table, par_table$Group) par_table <- lapply(par_table, function(.data) { .data$df2 <- .data$df[.data$Parameter == "Residuals"] .data }) par_table <- do.call(rbind, par_table) .eta_square_from_F(par_table, ci = ci) } #' @export eta_squared.merMod <- function(model, partial = TRUE, ci = NULL, ...) { if (!requireNamespace("lmerTest", quietly = TRUE)) { stop("Package 'lmerTest' required for this function to work. Please install it by running `install.packages('lmerTest')`.") } model <- lmerTest::as_lmerModLmerTest(model) model <- stats::anova(model) eta_squared.anova(model, partial = partial, ci = ci, ...) } #' @keywords internal .eta_squared <- function(model, partial, ci, iterations) { params <- as.data.frame(parameters::model_parameters(model)) values <- .values_aov(params) if (!"Residuals" %in% params$Parameter) { stop("No residuals data found. Eta squared can only be computed for simple `aov` models.") } eff_size <- .extract_eta_squared(params, values, partial) .ci_eta_squared( x = eff_size, partial = partial, ci.lvl = ci, df = params[["df"]], statistic = params[["F"]], model = model, iterations = iterations ) } #' @keywords internal .extract_eta_squared <- function(params, values, partial) { if (partial == FALSE) { params$Eta_Sq <- params$Sum_Squares / values$Sum_Squares_total params[params$Parameter == "Residuals", "Eta_Sq"] <- NA } else { params$Eta_Sq_partial <- params$Sum_Squares / (params$Sum_Squares + values$Sum_Squares_residuals) params[params$Parameter == "Residuals", "Eta_Sq_partial"] <- NA } params[, intersect(c("Group", "Parameter", "Eta_Sq", "Eta_Sq_partial"), names(params)), drop = FALSE] } #' @keywords internal .eta_square_from_F <- function(.data, ci = NULL) { .data$Eta_Sq_partial <- F_to_eta2(.data$`F`, .data$df, .data$df2) if (is.numeric(ci)) { .data$CI_high <- .data$CI_low <- NA for (i in seq_len(nrow(.data))) { if (!is.na(.data$`F`[i])) { cl <- .ci_partial_eta_squared( F.value = .data$`F`[i], df1 = .data$df[i], df2 = .data$df2[i], conf.level = ci ) .data$CI_low[i] <- cl$LL .data$CI_high[i] <- cl$UL } } } rownames(.data) <- NULL .data <- .data[, colnames(.data) %in% c("Parameter", "Eta_Sq_partial", "CI_high", "CI_low")] class(.data) <- c("partial_eta_squared", class(.data)) .data } #' @keywords internal .values_aov <- function(params) { # number of observations if ("Group" %in% names(params) && ("Within" %in% params$Group)) { lapply(split(params, params$Group), function(.i) { N <- sum(.i$df) + 1 .prepare_values_aov(.i, N) }) } else { N <- sum(params$df) + 1 .prepare_values_aov(params, N) } } #' @keywords internal .prepare_values_aov <- function(params, N) { # get mean squared of residuals Mean_Square_residuals <- sum(params[params$Parameter == "Residuals", ]$Mean_Square) # get sum of squares of residuals Sum_Squares_residuals <- sum(params[params$Parameter == "Residuals", ]$Sum_Squares) # get total sum of squares Sum_Squares_total <- sum(params$Sum_Squares) # number of terms in model N_terms <- nrow(params) - 1 list( "Mean_Square_residuals" = Mean_Square_residuals, "Sum_Squares_residuals" = Sum_Squares_residuals, "Sum_Squares_total" = Sum_Squares_total, "n_terms" = N_terms, "n" = N ) } effectsize/R/standardize_parameters.R0000644000176200001440000002603013611503452017461 0ustar liggesusers#' Parameters standardization #' #' Compute standardized model parameters (coefficients). #' #' @param model A statistical model. #' @param parameters An optional table containing the parameters to standardize. If \code{NULL}, will automatically retrieve it from the model. #' @param method The method used for standardizing the parameters. Can be \code{"refit"} (default), \code{"posthoc"}, \code{"smart"} or \code{"basic"}. See 'Details'. #' @inheritParams standardize #' @param centrality For Bayesian models, which point-estimates (centrality indices) to compute. Character (vector) or list with one or more of these options: "median", "mean", "MAP" or "all". #' #' @details \subsection{Methods:}{ #' \itemize{ #' \item \strong{refit}: This method is based on a complete model re-fit with a standardized version of data. Hence, this method is equal to standardizing the variables before fitting the model. It is the "purest" and the most accurate (Neter et al., 1989), but it is also the most computationally costly and long (especially for heavy models such as, for instance, for Bayesian models). This method is particularly recommended for complex models that include interactions or transformations (e.g., polynomial or spline terms). The \code{robust} (default to \code{FALSE}) argument enables a robust standardization of data, i.e., based on the \code{median} and \code{MAD} instead of the \code{mean} and \code{SD}. #' \item \strong{posthoc}: Post-hoc standardization of the parameters, aiming at emulating the results obtained by "refit" without refitting the model. The coefficients are divided by the standard deviation (or MAD if \code{robust}) of the outcome (which becomes their expression 'unit'). Then, the coefficients related to numeric variables are additionally multiplied by the standard deviation (or MAD if \code{robust}) of the related terms, so that they correspond to changes of 1 SD of the predictor (e.g., "A change in 1 SD of \code{x} is related to a change of 0.24 of the SD of \code{y}). This does not apply to binary variables or factors, so the coefficients are still related to changes in levels. This method is not accurate and tend to give aberrant results when interactions are specified. #' \item \strong{smart} (Standardization of Model's parameters with Adjustment, Reconnaissance and Transformation): Similar to \code{method = "posthoc"} in that it does not involve model refitting. The difference is that the SD of the response is computed on the relevant section of the data. For instance, if a factor with 3 levels A (the intercept), B and C is entered as a predictor, the effect corresponding to B vs. A will be scaled by the variance of the response at the intercept only. As a results, the coefficients for effects of factors are similar to a Glass' delta. #' \item \strong{basic}: This method is similar to \code{method = "posthoc"}, but treats all variables as continuous: it also scales the coefficient by the standard deviation of model's matrix' parameter of factors levels (transformed to integers) or binary predictors. Although being inappropriate for these cases, this method is the one implemented by default in other software packages, such as \code{lm.beta::lm.beta()}. #' } #' When \code{method = "smart"} or \code{method = "classic"}, \code{standardize_parameters()} #' also returns the standard errors for the standardized coefficients. Then, \code{ci()} can be #' used to calculate confidence intervals for the standardized coefficients. See 'Examples'. #' } #' #' @examples #' library(effectsize) #' data(iris) #' #' model <- lm(Sepal.Length ~ Species * Petal.Width, data = iris) #' standardize_parameters(model, method = "refit") #' #' \donttest{ #' standardize_parameters(model, method = "posthoc") #' standardize_parameters(model, method = "smart") #' standardize_parameters(model, method = "basic") #' #' # Robust and 2 SD #' standardize_parameters(model, robust = TRUE) #' standardize_parameters(model, two_sd = TRUE) #' #' # show CI #' library(parameters) #' params <- standardize_parameters(model, method = "smart", robust = TRUE) #' ci(params) #' #' iris$binary <- ifelse(iris$Sepal.Width > 3, 1, 0) #' model <- glm(binary ~ Species * Sepal.Length, data = iris, family = "binomial") #' standardize_parameters(model, method = "refit") #' standardize_parameters(model, method = "posthoc") #' standardize_parameters(model, method = "smart") #' standardize_parameters(model, method = "basic") #' } #' #' \donttest{ #' if (require("rstanarm")) { #' model <- stan_glm(Sepal.Length ~ Species * Petal.Width, data = iris, iter = 500, refresh = 0) #' standardize_posteriors(model, method = "refit") #' standardize_posteriors(model, method = "posthoc") #' standardize_posteriors(model, method = "smart") #' standardize_posteriors(model, method = "basic") #' #' standardize_parameters(model, method = "refit") #' standardize_parameters(model, method = "posthoc") #' standardize_parameters(model, method = "smart") #' standardize_parameters(model, method = "basic") #' } #' } #' @importFrom stats mad sd predict cor model.matrix #' @importFrom insight get_parameters model_info get_data get_response #' @importFrom utils tail #' @importFrom bayestestR describe_posterior #' #' @seealso standardize_info #' #' @return Standardized parameters. #' @references \itemize{ #' \item Neter, J., Wasserman, W., & Kutner, M. H. (1989). Applied linear regression models. #' \item Gelman, A. (2008). Scaling regression inputs by dividing by two standard deviations. Statistics in medicine, 27(15), 2865-2873. #' } #' @importFrom bayestestR describe_posterior #' @export standardize_parameters <- function(model, parameters = NULL, method = "refit", robust = FALSE, two_sd = FALSE, verbose = TRUE, centrality = "median", ...) { std_params <- .standardize_parameters(model = model, parameters = parameters, method = method, robust = robust, two_sd = two_sd, verbose = verbose, ...) # Summarise for Bayesian models if (insight::model_info(model)$is_bayesian) { std_params <- bayestestR::describe_posterior(std_params, centrality = centrality, dispersion = FALSE, ci = NULL, test = NULL, diagnostic = NULL, priors = FALSE) std_params <- std_params[names(std_params) %in% c("Parameter", "Coefficient", "Median", "Mean", "MAP")] names(std_params)[-1] <- paste0("Std_", names(std_params)[-1]) } std_params } #' @rdname standardize_parameters #' @export standardize_posteriors <- function(model, method = "refit", robust = FALSE, two_sd = FALSE, verbose = TRUE, ...) { .standardize_parameters(model = model, method = method, robust = robust, two_sd = two_sd, verbose = verbose, ...) } # Internal Wrapper ------------------------------------------------------------------- #' @keywords internal .standardize_parameters <- function(model, parameters = NULL, method = "refit", robust = FALSE, two_sd = FALSE, verbose = TRUE, ...) { method <- match.arg(method, choices = c("default", "refit", "posthoc", "smart", "partial", "basic")) # Refit if (method %in% c("refit")) { std_params <- .standardize_parameters_refit(model, robust = robust, verbose = verbose, ...) # Posthoc } else if (method %in% c("posthoc", "smart", "basic", "classic")) { std_params <- .standardize_parameters_posthoc(model, parameters = parameters, method = method, robust = robust, two_sd = two_sd, verbose = verbose, ...) # Partial } else if (method == "partial") { stop("`method = 'partial'` not implemented yet :(") } std_params } # REFIT ------------------------------------------------------------------- #' @importFrom parameters standard_error ci #' @keywords internal .standardize_parameters_refit <- function(model, robust = FALSE, two_sd = FALSE, verbose = TRUE, ...) { std_model <- standardize(model, robust = robust, two_sd = two_sd, verbose = verbose, ...) std_params <- .extract_parameters(std_model) attr(std_params, "standard_error") <- parameters::standard_error(std_model) attr(std_params, "ci") <- parameters::ci(std_model) std_params } # POST-HOC ------------------------------------------------------------------- #' @importFrom parameters standard_error #' @importFrom insight model_info get_data #' @keywords internal .standardize_parameters_posthoc <- function(model, parameters = NULL, method = "smart", robust = FALSE, two_sd = FALSE, verbose = TRUE, ...) { # Sanity Checks if (verbose && insight::model_info(model)$is_zero_inflated) { warning("Non-refit parameter standardization is ignoring the zero-inflation component.", call. = FALSE) } # Get parameters if (is.null(parameters)) { parameters <- .extract_parameters(model) if (insight::model_info(model)$is_bayesian) { parameters <- as.data.frame(t(parameters)) } } # Get names of parameters if ("Parameter" %in% names(parameters)) { param_names <- parameters$Parameter parameters$Parameter <- NULL } else { param_names <- row.names(parameters) } # Remove non-numeric things parameters <- parameters[sapply(parameters, is.numeric)] # Get info deviations <- standardize_info(model, robust = robust) if (method == "basic") { col_dev_resp <- "Deviation_Response_Basic" col_dev_pred <- "Deviation_Basic" } else if (method == "posthoc") { col_dev_resp <- "Deviation_Response_Basic" col_dev_pred <- "Deviation_Smart" } else if (method == "smart") { col_dev_resp <- "Deviation_Response_Smart" col_dev_pred <- "Deviation_Smart" } else { stop("'method' must be one of 'basic', 'posthoc' or 'smart'.") } # Sapply standardization if (two_sd) { std_params <- sapply(parameters, function(x) x * (2 * deviations[[col_dev_pred]]) / deviations[[col_dev_resp]]) } else { std_params <- sapply(parameters, function(x) x * deviations[[col_dev_pred]] / deviations[[col_dev_resp]]) } # Clean if (insight::model_info(model)$is_bayesian) { std_params <- as.data.frame(t(std_params)) row.names(std_params) <- NULL names(std_params) <- param_names } else { std_params <- cbind( data.frame(Parameter = param_names), as.data.frame(std_params) ) } # Standardize SE if possible std_error <- tryCatch({ se <- parameters::standard_error(model, component = "conditional") se$SE[unique(match(se$Parameter, param_names))] }, error = function(e) { NULL } ) # add standardized standard errors as attribute if (!is.null(std_error)) { std_error <- std_error * deviations[[col_dev_pred]] / deviations[[col_dev_resp]] attr(std_params, "standard_error") <- std_error class(std_params) <- c("effectsize_std_params", class(std_params)) } std_params } #' @keywords internal .extract_parameters <- function(model, ...) { if (insight::model_info(model)$is_bayesian) { params <- insight::get_parameters(model, ...) } else { params <- insight::get_parameters(model, ...) names(params) <- c("Parameter", "Std_Coefficient") } params } effectsize/R/interpret_d.R0000644000176200001440000000426413553505266015264 0ustar liggesusers#' Standardized difference interpretation #' #' Interpretation of indices using different sets of rules of thumb. #' \href{https://easystats.github.io/report/articles/interpret_metrics.html#standardized-difference-d-cohens-d}{Click here} for details. #' #' #' @param d,g,delta Value or vector of effect size values. #' @param rules Can be "funder2019" (default), "gignac2016", "cohen1988", "sawilowsky2009" or custom set of \code{\link{rules}}. #' #' #' #' @examples #' interpret_d(.02) #' interpret_d(c(.5, .02)) #' @references #' \itemize{ #' \item Funder, D. C., & Ozer, D. J. (2019). Evaluating effect size in psychological research: sense and nonsense. Advances in Methods and Practices in Psychological Science. #' \item Gignac, G. E., & Szodorai, E. T. (2016). Effect size guidelines for individual differences researchers. Personality and individual differences, 102, 74-78. #' \item Cohen, J. (1988). Statistical power analysis for the behavioural sciences. #' \item Sawilowsky, S. S. (2009). New effect size rules of thumb. #' } #' @export interpret_d <- function(d, rules = "funder2019") { if (is.rules(rules)) { return(interpret(abs(d), rules)) } else { if (rules == "funder2019") { return(interpret(d_to_r(abs(d)), rules(c(0.05, 0.1, 0.2, 0.3, 0.4), c("tiny", "very small", "small", "medium", "large", "very large")))) } else if (rules == "gignac2016") { return(interpret(abs(d), rules(c(0.2, 0.4, 0.6), c("very small", "small", "medium", "large")))) } else if (rules == "cohen1988") { return(interpret(abs(d), rules(c(0.2, 0.5, 0.8), c("very small", "small", "medium", "large")))) } else if (rules == "sawilowsky2009") { return(interpret(abs(d), rules(c(0.1, 0.2, 0.5, 0.8, 1.2, 2), c("tiny", "very small", "small", "medium", "large", "very large", "huge")))) } else { stop("rules must be 'cohen1988', 'sawilowsky2009' or an object of type rules.") } } } #' @rdname interpret_d #' @export interpret_g <- function(g, rules = "funder2019") { interpret_d(g, rules) } #' @rdname interpret_d #' @export interpret_delta <- function(delta, rules = "funder2019") { interpret_d(delta, rules) } effectsize/R/convert_odds_to_probs.R0000644000176200001440000000552613553465530017346 0ustar liggesusers#' @rdname d_to_r #' @export odds_to_probs <- function(odds, log = FALSE, ...) { UseMethod("odds_to_probs") } #' @export odds_to_probs.numeric <- function(odds, log = FALSE, ...) { .odds_to_probs(odds, log = log) } #' @export odds_to_probs.double <- odds_to_probs.numeric #' @rdname d_to_r #' @export odds_to_probs.data.frame <- function(odds, log = FALSE, select = NULL, exclude = NULL, ...) { .odds_to_probs_df(odds = odds, log = log, select = select, exclude = exclude, ...) } #' @rdname d_to_r #' @export probs_to_odds <- function(probs, log = FALSE, ...) { UseMethod("probs_to_odds") } #' @export probs_to_odds.numeric <- function(probs, log = FALSE, ...) { .probs_to_odds(probs, log = log) } #' @export probs_to_odds.double <- probs_to_odds.numeric #' @export probs_to_odds.data.frame <- function(probs, log = FALSE, select = NULL, exclude = NULL, ...) { .odds_to_probs_df(probs = probs, log = log, select = select, exclude = exclude, ...) } #' @rdname d_to_r #' @export convert_odds_to_probs <- odds_to_probs #' @rdname d_to_r #' @export convert_probs_to_odds <- probs_to_odds #' @keywords internal .odds_to_probs_df <- function(odds = NULL, probs = NULL, log = FALSE, select = NULL, exclude = NULL, ...) { # If vector if (!is.null(odds)) { df <- odds } else { df <- probs } # Variable order var_order <- names(df) # Keep subset if (!is.null(select) && select %in% names(df)) { to_keep <- as.data.frame(df[!names(df) %in% c(select)]) df <- df[names(df) %in% c(select)] } else { to_keep <- NULL } # Remove exceptions if (!is.null(exclude) && exclude %in% names(df)) { if (is.null(to_keep)) { to_keep <- as.data.frame(df[exclude]) } else { to_keep <- cbind(to_keep, as.data.frame(df[exclude])) } df <- df[!names(df) %in% c(exclude)] } # Remove non-numerics dfother <- df[!sapply(df, is.numeric, simplify = TRUE)] dfnum <- df[sapply(df, is.numeric, simplify = TRUE)] # Tranform if (!is.null(odds)) { dfnum <- .odds_to_probs(dfnum, log = log) } else { dfnum <- .probs_to_odds(dfnum, log = log) } # Add non-numerics if (is.null(ncol(dfother))) { df <- dfnum } else { df <- cbind(dfother, dfnum) } # Add exceptions if (!is.null(select) | !is.null(exclude) && exists("to_keep")) { df <- cbind(df, to_keep) } # Reorder df <- df[var_order] return(df) } #' @keywords internal .odds_to_probs <- function(odds, log = TRUE) { if (log == TRUE) { odds <- exp(odds) } probs <- odds / (1 + odds) return(probs) } #' @keywords internal .probs_to_odds <- function(probs, log = TRUE) { odds <- probs / (1 - probs) if (log == TRUE) { odds <- log(odds) } return(odds) } effectsize/R/cohens_f.R0000644000176200001440000000244513550275470014526 0ustar liggesusers#' @rdname eta_squared #' @export cohens_f <- function(model) { UseMethod("cohens_f") } #' @export cohens_f.aov <- function(model) { if (!inherits(model, c("Gam", "aov", "anova", "anova.rms"))) model <- stats::anova(model) m <- .cohens_f(model) class(m) <- c("cohens_f", class(m)) m } #' @export cohens_f.anova <- cohens_f.aov #' @export cohens_f.lm <- cohens_f.aov #' @export cohens_f.glm <- cohens_f.aov #' @export cohens_f.aovlist <- function(model) { stop("Cohen's f not implemented yet for repeated-measures ANOVAs.") } #' @keywords internal .cohens_f <- function(model) { params <- as.data.frame(parameters::model_parameters(model)) values <- .values_aov(params) if (!"Residuals" %in% params$Parameter) { stop("No residuals data found. Eta squared can only be computed for simple `aov` models.") } .extract_cohens_f(params, values) } #' @keywords internal .extract_cohens_f <- function(params, values) { params$Cohens_f <- params$Sum_Squares / (params$Sum_Squares + values$Sum_Squares_residuals) params$Cohens_f <- sqrt(params$Cohens_f / (1 - params$Cohens_f)) params[params$Parameter == "Residuals", "Cohens_f"] <- NA params[, intersect(c("Group", "Parameter", "Cohens_f"), names(params)), drop = FALSE] } effectsize/R/convert_tFz_to_d.R0000644000176200001440000000152013564202731016236 0ustar liggesusers#' @rdname t_to_r #' @export t_to_d <- function(t, df_error, pooled = FALSE, ...) { if (isTRUE(pooled)) { t / sqrt(df_error) } else { 2 * t / sqrt(df_error) } } #' @rdname t_to_r #' @export convert_t_to_d <- t_to_d # z ----------------------------------------------------------------------- #' @rdname t_to_r #' @export z_to_d <- function(z, n, ...) { 2 * z / sqrt(n) } #' @rdname t_to_r #' @export convert_z_to_d <- z_to_d # F ----------------------------------------------------------------------- #' @rdname t_to_r #' @export F_to_d <- function(f, df, df_error, pooled = FALSE, ...) { if (df > 1) { stop("Cannot convert F with more than 1 df to (partial) r.") } t_to_d(sqrt(f), df_error, pooled) } #' @rdname t_to_r #' @export convert_F_to_d <- F_to_d effectsize/R/interpret_omega_squared.R0000644000176200001440000000162113553505360017642 0ustar liggesusers#' ANOVA effect size interpretation #' #' @param omega_squared Value or vector of omega squared values. #' @param rules Can be "field2013" (default) or custom set of rules. #' #' #' #' @examples #' interpret_omega_squared(.02) #' interpret_omega_squared(c(.5, .02)) #' @seealso http://imaging.mrc-cbu.cam.ac.uk/statswiki/FAQ/effectSize #' #' #' @references #' \itemize{ #' \item{Field, A (2013) Discovering statistics using IBM SPSS Statistics. Fourth Edition. Sage:London.} #' } #' @export interpret_omega_squared <- function(omega_squared, rules = "field2013") { if (is.rules(rules)) { return(interpret(omega_squared, rules)) } else { if (rules == "field2013") { return(interpret(omega_squared, rules(c(0.01, 0.06, 0.14), c("very small", "small", "medium", "large")))) } else { stop("rules must be 'field2013' or an object of type rules.") } } } effectsize/NEWS.md0000644000176200001440000000042713613235007013502 0ustar liggesusers# effectsize 0.1.0 ## Breaking changes ## New features - `standardize_parameters()` and `standardize()` now support models from packages *brglm*, *brglm2*, *mixor*, *fixest*, *cgam*, *cplm*, *cglm*, *glmmadmb* and *complmrob*. ## Bug fixes - Fix CRAN check issues.effectsize/MD50000644000176200001440000001407613613501553012723 0ustar liggesusers73bd4caf2e0f6f0a4ad99816080f846b *DESCRIPTION f2f66d842fbf94c244bce6833641601e *NAMESPACE 5ee713d16390e3f7cf15ebe9aa518b23 *NEWS.md d56477b7dba3f334683f984e388ca99c *R/adjust.R 6550e619982285b10a1a2bca5e57fc65 *R/change_scale.R b33cae2b2b3af534404120bc63b63304 *R/cohens_d.R ce279fc865f84183f9d10772d54ba4d8 *R/cohens_f.R bae0f602f1f69ea85e9ddec6e9eeb314 *R/convert_chisq.R f8e6dba6cd8c1e4be352b3688bf7386c *R/convert_d_to_percentage.R e9f318f0920f99556ed5e91bc82661b3 *R/convert_d_to_r.R 48bf51da09c52ba0f7d702cb9a057900 *R/convert_odds_to_d.R e3b9c4c612936515c0f054c48945ae42 *R/convert_odds_to_probs.R 370a26d1ddea59768820a9c21e6f4fb5 *R/convert_percentile_to_z.R 573770225ac0d0d28eeb94050c325997 *R/convert_posteriors.R cfe2304d690d4bb0c1c0938f9b36b45e *R/convert_tF_to_pve.R 402f862c2e2dad7266cd2fb01307bf85 *R/convert_tFz_to_d.R 691b0270d6b2178966c1f26a2baafab8 *R/convert_tFz_to_r.R 949aeed7264567f591d0fb0e7295ee21 *R/epsilon_squared.R 600467514ccdeb0517f833499e2a1868 *R/eta_squared.R f84b5031e7c08ff52af14718fcd26521 *R/format_standardize.R f4a8cbf7b94b12ca5a75a3e74af0214e *R/interpret.R 157eb008384a6c717d97e259d108aa7f *R/interpret_bayesian_indices.R 19d36b2fa9f4046a3e1394a3c3ed4a45 *R/interpret_bf.R 6c30c57857b867da5024b1efd8b3755c *R/interpret_d.R a3d51f261682138f32d17e4f3b288db4 *R/interpret_direction.R a60d13af81b7a17ac58f03b3dc3b8737 *R/interpret_fit.R 19d809e75e73c6ca47d6ee1bb1df8692 *R/interpret_odds.R 76eda9589bc811b3fbff8820a49f56b8 *R/interpret_omega_squared.R 134a2bec8b545d4980a4f9da04ca04d7 *R/interpret_p.R e9b1c5b555ea0981488c50e6923d2ce0 *R/interpret_parameters.R bb79ef5fbc872dc30222f83edf80dbac *R/interpret_r.R b0d36a26ba56b2bbcab5bcd0556260f9 *R/interpret_r2.R a8c2aa0cb8c6614e25bdff5dbd924098 *R/normalize.R 7b58cea3043128119ce45473b9200433 *R/omega_squared.R c7063ce95db8566d3bea41d0abacd3cb *R/ranktransform.R a2a96e55994c16d7db00989c7a5676ea *R/sd_pooled.R e545f02222f7d8a61e3f324f8c04b842 *R/standardize.R d6bca012af8ab84632ddf60389ab2e5b *R/standardize.data.frame.R 6937a122293dbb26cfd5c973542d137a *R/standardize.models.R 8fe0af52083d96bfcedc22248e547459 *R/standardize_info.R 457f1e089fd0f27d440b62250f32cd97 *R/standardize_parameters.R 94f77c387cdc42f882f773992bd70459 *R/utils_ci_eta_squared.R 4fd5f6b524d0e0a59a8fa13948eebc6e *R/utils_confint_ncg.R c8f558bdf1beb9fe0384626cdbce47c0 *R/utils_factor_to_numeric.R 77f0ff5fc8b81cbb7a54289bfb081efc *R/utils_values_aov.R b199366c4e87667f7deab8675373adb8 *README.md 3ef19a7134a54aa8f8444f041ee13026 *build/partial.rdb 0f842ae59b0d1d83bcf034c52488178e *build/vignette.rds f7ceafa44df0f0ef7223159bba23331b *inst/CITATION 8a0bb7d4be10d9ed33a7da12d636da32 *inst/doc/bayesian_models.R 192f20840982aa383fde1a1dc32862c0 *inst/doc/bayesian_models.Rmd cc7bbec18221d4eb53c0e0de59f82c7c *inst/doc/bayesian_models.html 62a4fd99b1237c0aa23d7228cec212a1 *inst/doc/convert.R cb7cd207525e77ada9b446352f039277 *inst/doc/convert.Rmd 8b742b7edbe4839753d4b54c25f0a848 *inst/doc/convert.html 9b79f4247c59186c398ea51c8c853ffa *inst/doc/interpret.R 98e121cc9e3ecb6819f3b91fa64d942c *inst/doc/interpret.Rmd 04230f1e3806f1c5ca0b43079c56291a *inst/doc/interpret.html 9b79f4247c59186c398ea51c8c853ffa *inst/doc/standardize_data.R 2c003d454de938f4166ae01a6e51cbea *inst/doc/standardize_data.Rmd c6b95f0a767fdfa3bfb51063eb4deab9 *inst/doc/standardize_data.html 2e3cca47be5b1ae00bef5c2ba79f3cfc *inst/doc/standardize_parameters.R 4c3722fd3a0ca770a0616f40389fe21e *inst/doc/standardize_parameters.Rmd 0f262328d745ea136c5dffdd331a0541 *inst/doc/standardize_parameters.html a03e2a0dd616e89086f8ebf3fc8244dd *man/F_to_eta2.Rd 5cfda7c9a273c08d4123053cbed81286 *man/adjust.Rd ce470aba6e4397fe8eca32bc315f29d4 *man/change_scale.Rd 443b971f02792c5707348f048a3c14f1 *man/chisq_to_phi.Rd ad1e420d291b41dc24fcba7cb3e97032 *man/cohens_d.Rd ff306b95b3acee3712a2d59aa9da1f01 *man/convert_posteriors_to_r.Rd c5f3245a64474782ab8afc94564ba857 *man/convert_z_to_percentile.Rd 93b0571b43e749a8873e6c625d7e2a37 *man/d_to_r.Rd 64dca7902849017d2771a5ef292ac68b *man/dot-factor_to_numeric.Rd 6be47e4b975d1dd3ae5321999d4c2d9b *man/eta_squared.Rd 2a95c5b4edc51775a360aa90d80a893b *man/figures/logo.png ec3962162d03e44ee11d8b3b37e817fe *man/format_standardize.Rd cb0576a3fa685a7b59cfad10fadab7a2 *man/interpret.Rd 44501cefb69befd2d97d20a031464882 *man/interpret_bf.Rd 6ef5a9b47ebeb70388813b6ea343c68c *man/interpret_d.Rd f92117337df02d836407533b944baa98 *man/interpret_direction.Rd d0033f33b69e013e3b3eca95aff151ca *man/interpret_ess.Rd 32ccc6ab7cf9e707871883e47098d3f0 *man/interpret_gfi.Rd fce6ea2eecf3c5ab5a2823d3aa9422a5 *man/interpret_odds.Rd c82e655990718bd653ededb2b4f23d34 *man/interpret_omega_squared.Rd 015298c02499af496ad90248b253b8ad *man/interpret_p.Rd c36e5ccd9f1f89857eef51ec7628c993 *man/interpret_parameters.Rd b4c64d0ae51adaa94288e71f7e796cce *man/interpret_r.Rd dec6719bfe6790650c6e1e9dc75ee84a *man/interpret_r2.Rd 314b4b536a6d322e28b24db39d71b3af *man/normalize.Rd 1daa5c75e2eb4f3e4abb6dec2a2b9af0 *man/ranktransform.Rd b6258e0d1dfd5ed58b7bfc7de8b72491 *man/rules.Rd 500e257f8f0bd4d6c53ca8941103322b *man/sd_pooled.Rd 59bffff49c4f5046428342c24a38d691 *man/standardize.Rd 0a1e1b50d3a5841a8dbbaa58bfae7320 *man/standardize_info.Rd 930cb630c5b252e15cf37e5e7d235920 *man/standardize_parameters.Rd 3c1582fdb80b67d3358a1a86a7468f6c *man/t_to_r.Rd 89df14737372bc2c692782993b96dd08 *tests/testthat.R c9f383a04fa5b07ec57bb5af9825a0a6 *tests/testthat/test-convert.R 629dcc3e0b5946bba8188ca6e25630fe *tests/testthat/test-datatransform.R 06aebdaca303d31201a0937774576e00 *tests/testthat/test-interpret.R b3fc8207ee6d6cfeef97bd79dbcf56cb *tests/testthat/test-standardize.R 6f59661c8a164503c5001535d99ed293 *tests/testthat/test-standardize_parameters.R 00855d2399c6647c3f1199b47913d2f7 *tests/testthat/test_standardized_differences.R 9ca941f5f2faa90c7d7c0729e22bc376 *vignettes/apa.csl 192f20840982aa383fde1a1dc32862c0 *vignettes/bayesian_models.Rmd ed64274151d7d17c344fbfa4ef7d22a2 *vignettes/bibliography.bib cb7cd207525e77ada9b446352f039277 *vignettes/convert.Rmd 98e121cc9e3ecb6819f3b91fa64d942c *vignettes/interpret.Rmd 2c003d454de938f4166ae01a6e51cbea *vignettes/standardize_data.Rmd 4c3722fd3a0ca770a0616f40389fe21e *vignettes/standardize_parameters.Rmd effectsize/inst/0000755000176200001440000000000013613235274013364 5ustar liggesuserseffectsize/inst/doc/0000755000176200001440000000000013613235274014131 5ustar liggesuserseffectsize/inst/doc/standardize_data.html0000644000176200001440000003473213613235272020327 0ustar liggesusers

Data Standardization

Introduction

To make sense of their data and effects, scientists might want to standardize (Z-score) their variables. They become unitless, expressed only in terms of deviation from an index of centrality (e.g., the mean or the median).

ADD MORE.

Normal vs. Robust

ADD MORE.

Variable-wise vs. Participant-wise

Standardization is an important step and extra caution is required in repeated-measures designs, in which there are three ways of standardizing data:

  • Variable-wise: The most common method. A simple scaling of each column.
  • Participant-wise: Variables are standardized “within” each participant, i.e., for each participant, by the participant’s mean and SD.
  • Full: Participant-wise first and then re-standardizing variable-wise.

Unfortunately, the method used is often not explicitly stated. This is an issue as these methods can generate important discrepancies (that can in turn contribute to the reproducibility crisis). Let’s investigate these 3 methods.

Use this

References

effectsize/inst/doc/interpret.Rmd0000644000176200001440000002321413553550761016617 0ustar liggesusers--- title: "Automated Interpretation of Indices of Effect Size" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, guidelines, interpretation] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Automated interpretation of indices of effect size} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) ``` # Why? The metrics used in statistics (indices of fit, model performance or parameter estimates) can be very abstract. A long experience is required to intuitively ***"feel"*** the meaning of their values. In order to facilitate the understanding of the results they are facing, many scientists use (often implicitly) some set of **rules of thumb**. Thus, in order to validate and standardize such interpretation grids, some authors validated and published them in the form of guidelines. One of the most famous interpertation grid was proposed by **Cohen (1988)** for a series of widely used indices, such as the correlation **r** (*r* = .20, small; *r* = .40, moderate and *r* = .60, large) or the **standardized difference** (*Cohen's d*). However, there is now a clear evidence that Cohen's guidelines (which he himself later disavowed; Funder, 2019) are much too stringent and not particularly meaningful taken out of context [@funder2019evaluating]. This led to the emergence of a litterature discussing and creating new sets of rules of thumb. Altough **everybody agrees on the fact that effect size interpretation in a study should be justified with a rationale** (and depend on the context, the field, the litterature, the hypothesis, etc.), these pre-baked rules can still nevertheless be useful to give a rough idea or frame of reference to understand scientific results. The package **`effectsize`** implements such sets of rules of thumb for a variety of indices in a flexible and explicit fashion, helping you understanding and reporting your results in a scientific yet meaningful way. Again, readers should keep in mind that these thresholds, altough *"validated"*, **remain arbitrary**. Thus, their use should be discussed on a case-by-case basis depending on the field, hypotheses, prior results and so on, to avoid their crystalisation, as for the infamous ***p* < .05** example. Moreovere, some authors suggest the counter-intuitive idea that *very large effects*, especially in the context of psychological research, is likely to be a "gross overestimate that will rarely be found in a large sample or in a replication" [@funder2019evaluating]. They suggest that smaller effect size are worth taking seriously (as they can be potentially consequential), as well as more believable. # Supported Indices ### Coefficient of determination (R2) #### @falk1992primer ```r interpret_r2(x, rules = "falk1992") ``` - **R2 < 0.1**: Negligible - **R2 > 0.1**: Adequate #### @cohen1988statistical ```r interpret_r2(x, rules = "cohen1988") ``` - **R2 = 0 - 0.02**: Very weak - **R2 = 0.02 - 0.16**: Weak - **R2 = 0.16 - 0.26**: Moderate - **R2 > 0.26**: Substantial #### @chin1998partial ```r interpret_r2(x, rules = "chin1998") ``` - **R2 = 0 - 0.19**: Very weak - **R2 = 0.19 - 0.33**: Weak - **R2 = 0.33 - 0.67**: Moderate - **R2 > 0.67**: Substantial #### @hair2011pls ```r interpret_r2(x, rules = "hair2011") ``` - **R2 = 0 - 0.25**: Very weak - **R2 = 0.25 - 0.50**: Weak - **R2 = 0.50 - 0.75**: Moderate - **R2 > 0.75**: Substantial ### Correlation *r* ```r interpret_r(x, rules = "funder2019") ``` - **r = 0 - 0.05**: Very small - **r = 0.05 - 0.1**: Small - **r = 0.1 - 0.2**: Medium - **r = 0.2 - 0.3**: Large - **r > 0.4**: Very large #### @gignac2016effect Gignac's rules of thumb are actually one of few interpretation grid justified and based on actual data, in this case on the distribution of effect magnitudes in the litterature. ```r interpret_r(x, rules = "gignac2016") ``` - **r = 0 - 0.1**: Very small - **r = 0.1 - 0.2**: Small - **r = 0.2 - 0.3**: Moderate ("typical") - **r > 0.3**: Large #### @cohen1988statistical ```r interpret_r(x, rules = "cohen1988") ``` - **r = 0 - 0.1**: Very small - **r = 0.1 - 0.3**: Small - **r = 0.3 - 0.5**: Moderate - **r > 0.5**: Large #### @evans1996straightforward ```r interpret_r(x, rules = "evans1996") ``` - **r = 0 - 0.2**: Very weak - **r = 0.2 - 0.4**: Weak - **r = 0.4 - 0.6**: Moderate - **r = 0.6 - 0.8**: Strong - **r > 0.8**: Very strong ### Standardized Difference *d* (Cohen's *d*) The sandardized difference can be obtained through the standardization of linear model's parameters or data, in which they can be used as indices of effect size. ```r interpret_d(x, rules = "funder2019") ``` - **r = 0 - 0.1**: Very small - **r = 0.1 - 0.2**: Small - **r = 0.2 - 0.4**: Medium - **r = 0.4 - 0.6**: Large - **r > 0.6**: Very large #### @gignac2016effect Gignac's rules of thumb are actually one of few interpretation grid justified and based on actual data, in this case on the distribution of effect magnitudes in the litterature. ```r interpret_d(x, rules = "gignac2016") ``` - **d = 0 - 0.2**: Very small - **d = 0.2 - 0.4**: Small - **d = 0.4 - 0.6**: Medium - **d > 0.6**: Large #### @cohen1988statistical ```r interpret_d(x, rules = "cohen1988") ``` - **d = 0 - 0.2**: Very small - **d = 0.2 - 0.5**: Small - **d = 0.5 - 0.8**: Medium - **d > 0.8**: Large #### @sawilowsky2009new ```r interpret_d(x, rules = "sawilowsky2009") ``` - **d = 0 - 0.1**: Tiny - **d = 0.1 - 0.2**: Very small - **d = 0.2 - 0.5**: Small - **d = 0.5 - 0.8**: Medium - **d = 0.8 - 1.2**: Large - **d = 1.2 - 2**: Very large - **d > 2**: Huge ### Odds ratio Odds ratio, and *log* odds ratio, are often found in epidemiological studies. However, they are also the parameters of ***logistic*** regressions, where they can be used as indices of effect size. Note that the (log) odds ratio from logistic regression coefficients are *unstandardized*, as they depend on the scale of the predictor. In order to apply the following guidelines, make sure you [*standardize*](https://easystats.github.io/effectsize/articles/standardize_parameters.html) your predictors! #### @chen2010big ```r interpret_odds(x, rules = "chen2010") ``` - **odds = 0 - 1.68**: Very small - **odds = 1.68 - 3.47**: Small - **odds = 3.47 - 6.71**: Medium - **odds > 6.71**: Large #### @cohen1988statistical ```r interpret_odds(x, rules = "cohen1988") ``` This converts (log) odds ratio to standardized difference *d* using the following formula [@cohen1988statistical;@sanchez2003effect]: ```r d <- log_odds * (sqrt(3) / pi) ``` ### Omega Squared The Omega squared is a measure of effect size used in ANOVAs. It is an estimate of how much variance in the response variables are accounted for by the explanatory variables. Omega squared is widely viewed as a lesser biased alternative to eta-squared, especially when sample sizes are small. #### @field2013discovering ```r interpret_omega_squared(x, rules = "field2013") ``` - **Omega Squared = 0 - 0.01**: Very small - **Omega Squared = 0.01 - 0.06**: Small - **Omega Squared = 0.06 - 0.14**: Medium - **Omega Squared > 0.14**: Large ### Bayes Factor (BF) **Bayes factors (BF)** are continuous measures of relative evidence, with a Bayes factor greater than 1 giving evidence in favor of one of the models (the numerator), and a Bayes factor smaller than 1 giving evidence in favor of the other model (the denominator). Yet, it is common to interpret the **magnitude** of relative evidence based on conventions of intervals (presented below), such that the values of a *BF*10 (comparing the alternative to the null) can be interpreted as: For human readability, it is recommended to report BFs so that the ratios are larger than 1 - for example, it's harder to understand a *BF*10\=0.07 (indicating the data are 0.07 times more probable under the alternative) than a *BF*01\=1/0.07\=14.3 (indicating the data are 14.3 times more probable under the null. **BFs** between 0 and 1, indicating evidence *against* the hypothesis, can be converted via `bf = 1 / abs(bf)`. One can report **Bayes factors** using the following sentence: > There is a strong evidence against the null hypothesis (BF = 12.2). #### @jeffreys1961theory ```r interpret_bf(x, rules = "jeffreys1961") ``` - **bf = 1 - 3**: Anecdotal - **bf = 3 - 10**: Moderate - **bf = 10 - 30**: Strong - **bf = 30 - 100**: Very strong - **bf > 100**: Extreme #### @raftery1995bayesian ```r interpret_bf(x, rules = "raftery1995") ``` - **bf = 1 - 3**: Weak - **bf = 3 - 20**: Positive - **bf = 20 - 150**: Strong - **bf > 150**: Very strong ### Bayesian Convergence Diagnostic (Rthat and Effective Sample Size) Experts have suggested thresholds value to help interpreting and convergence and sampling quality. As such, `Rhat` should not be larger than 1.1 [@gelman1992inference] or 1.01 [@vehtari2019rank]. An `effective sample size` (ESS) greater than 1,000 is sufficient for stable estimates [@burkner2017brms]. ### Other Bayesian Indices (\% in ROPE, *pd*) The interpretation of Bayesian indices is detailed in [this article](https://easystats.github.io/bayestestR/articles/guidelines.html). ## Referenceseffectsize/inst/doc/bayesian_models.html0000644000176200001440000005022113613235271020152 0ustar liggesusers

Effect sizes for Bayesian models

Obtaining indices of effect size for Bayesian model is currently an issue, as no test statistics are present to help us compute such indices. The two alternatives (both available in effectsize) is 1) to compute standardized parameters or 2) obtain effect sizes by test-statistic approximation. This second method is described here.

Bayesian Regression Coefficients to Correlation via Test-Statistic Approximation

Overview

>  Sepal.Width Petal.Length  Petal.Width 
>         0.63         0.72        -0.34

The goal is to retrieve coefficients similar to the above (partial) correlations for this multiple regression model: Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width. This can easily be achieved for frequentist models by converting the t statistic into a correlation:

> numeric(0)

Note that these are not equivalent to standardized parameters from multiple regressions (from which coefficients can be higher than 1).

> [1]  0.34  1.51 -0.51

Let’s start by fitting the Bayesian regression:

The effectsize package provides the posteriors_to_r() function, which attempts to estimate the posterior of the (partial) correlation coefficient by approximating the t statistic (deviding the coefficient by the SD of the posterior) and using frequentist degrees of freedom. It is an hybrid method that needs to be validated. However, the results appear as very close:

Applicability

Does it work in all cases?

Logistic Models

Let’s start with the frequentist model:

However, as logistic models return log-odds, these can be directly converted to r:

And now the Bayesian:

References

effectsize/inst/doc/convert.Rmd0000644000176200001440000000206613550271140016251 0ustar liggesusers--- title: "Converting between Indices of Effect Size" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, guidelines, conversion] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Converting between indices of effect size} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) ``` The `effectsize` package contains function to convert among indices of effect size. **This vignette needs to be improved! Please contribute by editing the text** [**here**](https://github.com/easystats/effectsize/blob/master/vignettes/convert.Rmd) **to make it better :)** ```{r, warning=FALSE, message=FALSE} library(effectsize) convert_d_to_r(d = 1) ``` ## Referenceseffectsize/inst/doc/convert.R0000644000176200001440000000047313613235271015735 0ustar liggesusers## ----message=FALSE, warning=FALSE, include=FALSE------------------------------ library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) ## ---- warning=FALSE, message=FALSE-------------------------------------------- library(effectsize) convert_d_to_r(d = 1) effectsize/inst/doc/convert.html0000644000176200001440000003064113613235271016500 0ustar liggesusers

Converting between Indices of Effect Size

The effectsize package contains function to convert among indices of effect size. This vignette needs to be improved! Please contribute by editing the text here to make it better :)

> [1] 0.45

References

effectsize/inst/doc/standardize_parameters.html0000644000176200001440000011616713613235274021566 0ustar liggesusers

Parameters Standardization

Introduction

Standardising parameters (i.e., coefficients) can allow for their comparison within and between models, variables and studies. Moreover, as it returns coefficients expressed in terms of change of variance (for instance, coefficients expresed in terms of SD of the response variable), it can allow for the usage of effect size interpretation guidelines, such as the famous Cohen’s (1988) rules of thumb.

However, standardizing the model’s parameters should not be automatically and mindlessly done: for some research fields, particular variables or types of studies (e.g., replications), it sometimes makes more sense to keep, use and interpret the original parameters, especially if they are well known or easily understood.

Critically, parameters standardization is not a trivial process. Different techniques exist, that can lead to drastically different results. Thus, it is critical that the standardization method is explicitly documented and detailed.

parameters include different techniques of parameters standardization, described below (Bring 1994; Menard 2004, 2011; Gelman 2008; Schielzeth 2010).

How to interpret standardized coefficients?

Measure of association (correlation r)

Parameter Std_Coefficient
(Intercept) 0.00
Petal.Length 0.87

Standardizing the coefficient of this simple linear regression gives a value of 0.87, but did you know that for a simple regression this is actually the same as a correlation? Thus, you can eventually apply some (in)famous interpretation guidelines (e.g., Cohen’s rules of thumb).

> Parameter1        |        Parameter2 |    r |     t |  df |      p |       95% CI |  Method
> --------------------------------------------------------------------------------------------
> iris$Sepal.Length | iris$Petal.Length | 0.87 | 21.65 | 148 | < .001 | [0.83, 0.91] | Pearson

What happens in the case of multiple continuous variables? As in each effect in a regression model is “adjusted” for the other ones, we might expect coefficients to be somewhat alike to partial correlations. Let’s first start by computing the partial correlation between Sepal.Length and 3 other remaining variables.

>  Sepal.Width Petal.Length  Petal.Width 
>         0.63         0.72        -0.34

Now, let’s apply another method to obtain effect sizes for frequentist regressions, based on the statistic values. We will convert the t-value (and its degrees of freedom, df) into a partial correlation coefficient r.

> numeric(0)

Wow, the retrieved correlations coefficients from the regression model are exactly the same as the partial correlations!

However, note that in multiple regression standardizing the parameters in not quite the same as computing the (partial) correlation, due to… math :(

Parameter Std_Coefficient
(Intercept) 0.00
Sepal.Width 0.34
Petal.Length 1.51
Petal.Width -0.51

Standardized differences

How does it work in the case of differences, when factors are entered and differences between a given level and a reference level (the intercept)? You might have heard that it is similar to a Cohen’s d. Well, let’s see.

Parameter Std_Coefficient
(Intercept) -1.0
Speciesversicolor 1.1
Speciesvirginica 1.9

This linear model suggests that the standardized difference between the versicolor level of Species and the setosa level (the reference level - the intercept) is of 1.12 standard deviation of Sepal.Length (because the response variable was standardized, right?). Let’s compute the Cohen’s d between these two levels:

> [1] -2.1

It is very different! Why? How? Both differences should be expressed in terms of SD of the response variable. And there’s the trick. First of all, in the linear model above, the SD by which the difference is scaled is the one of the whole response, which include all the three levels, whereas below, we filtered the data to only include the levels of interest. If we recompute the model on this filtered data, it should be better:

Parameter Std_Coefficient
(Intercept) -0.72
Speciesversicolor 1.45

Not really. Why? Because the actual formula to compute a Cohen’s d doesn’t use the simple SD to scale the effect (as it is done when standardizing the parameters), but computes something called the pooled SD. However, this can be turned off by setting correct = "raw".

> [1] -1.4

And here we are :)

Bring, Johan. 1994. “How to Standardize Regression Coefficients.” The American Statistician 48 (3): 209–13.

Gelman, Andrew. 2008. “Scaling Regression Inputs by Dividing by Two Standard Deviations.” Statistics in Medicine 27 (15): 2865–73.

Menard, Scott. 2004. “Six Approaches to Calculating Standardized Logistic Regression Coefficients.” The American Statistician 58 (3): 218–23.

———. 2011. “Standards for Standardized Logistic Regression Coefficients.” Social Forces 89 (4): 1409–28.

Schielzeth, Holger. 2010. “Simple Means to Improve the Interpretability of Regression Coefficients.” Methods in Ecology and Evolution 1 (2): 103–13.

effectsize/inst/doc/interpret.R0000644000176200001440000000027113613235271016265 0ustar liggesusers## ----message=FALSE, warning=FALSE, include=FALSE------------------------------ library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) effectsize/inst/doc/standardize_data.Rmd0000644000176200001440000000604713547032516020105 0ustar liggesusers--- title: "Data Standardization" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, guidelines, interpretation] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Data standardization} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) ``` # Introduction To make sense of their data and effects, scientists might want to standardize (Z-score) their variables. They become unitless, expressed only in terms of deviation from an index of centrality (e.g., the mean or the median). ADD MORE. ## Normal *vs.* Robust ADD MORE. ## Variable-wise *vs.* Participant-wise Standardization is an important step and extra caution is required in **repeated-measures designs**, in which there are three ways of standardizing data: - **Variable-wise**: The most common method. A simple scaling of each column. - **Participant-wise**: Variables are standardized "within" each participant, *i.e.*, for each participant, by the participant's mean and SD. - **Full**: Participant-wise first and then re-standardizing variable-wise. Unfortunately, the method used is often not explicitly stated. This is an issue as these methods can generate important discrepancies (that can in turn contribute to the reproducibility crisis). Let's investigate these 3 methods. [Use this](https://github.com/neuropsychology/psycho.R/blob/master/docs/_posts/preparation/published/standardize_grouped_df.Rmd) # Referenceseffectsize/inst/doc/standardize_parameters.Rmd0000644000176200001440000005161613613235007021333 0ustar liggesusers--- title: "Parameters Standardization" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, standardization, effect size, cohen d, standardized coefficients] vignette: > %\VignetteIndexEntry{Parameters standardization} \usepackage[utf8]{inputenc} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) knitr::opts_chunk$set(comment = ">") options(digits = 2) options(knitr.kable.NA = '') if (!requireNamespace("dplyr", quietly = TRUE) || !requireNamespace("parameters", quietly = TRUE)) { knitr::opts_chunk$set(eval = FALSE) } set.seed(333) ``` # Introduction Standardising parameters (*i.e.*, coefficients) can allow for their comparison within and between models, variables and studies. Moreover, as it returns coefficients expressed in terms of **change of variance** (for instance, coefficients expresed in terms of SD of the response variable), it can allow for the usage of [effect size interpretation guidelines](https://easystats.github.io/effectsize/articles/interpret.html), such as the famous Cohen's (1988) rules of thumb. However, standardizing the model's parameters should *not* be automatically and mindlessly done: for some research fields, particular variables or types of studies (*e.g.*, replications), it sometimes makes more sense to keep, use and interpret the original parameters, especially if they are well known or easily understood. Critically, **parameters standardization is not a trivial process**. Different techniques exist, that can lead to drastically different results. Thus, it is critical that the standardization method is explicitly documented and detailed. **`parameters` include different techniques of parameters standardization**, described below [@bring1994standardize;@menard2004six;@gelman2008scaling;@schielzeth2010simple;@menard2011standards]. # How to interpret standardized coefficients? ## Measure of association (correlation *r*) ```{r, warning=FALSE, message=FALSE, eval=FALSE} library(effectsize) library(dplyr) lm(Sepal.Length ~ Petal.Length, data = iris) %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} library(effectsize) library(dplyr) lm(Sepal.Length ~ Petal.Length, data = iris) %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` Standardizing the coefficient of this simple linear regression gives a value of `0.87`, but did you know that for a simple regression this is actually the **same as a correlation**? Thus, you can eventually apply some (*in*)famous interpretation guidelines (e.g., Cohen's rules of thumb). ```{r, warning=FALSE, message=FALSE} library(parameters) cor.test(iris$Sepal.Length, iris$Petal.Length) %>% model_parameters() ``` What happens in the case of **multiple continuous variables**? As in each effect in a regression model is "adjusted" for the other ones, we might expect coefficients to be somewhat alike to **partial correlations**. Let's first start by computing the partial correlation between **Sepal.Length** and 3 other remaining variables. ```{r, warning=FALSE, message=FALSE} if (require("ppcor")) { df <- iris[, 1:4] # Remove the Species factor ppcor::pcor(df)$estimate[2:4, 1] # Select the rows of interest } ``` Now, let's apply another method to obtain effect sizes for frequentist regressions, based on the statistic values. We will convert the *t*-value (and its degrees of freedom, *df*) into a partial correlation coefficient *r*. ```{r, warning=FALSE, message=FALSE} model <- lm(Sepal.Length ~ ., data = df) parameters <- model_parameters(model)[2:4,] convert_t_to_r(parameters$t, parameters$df_residual) ``` Wow, the retrieved correlations coefficients from the regression model are **exactly** the same as the partial correlations! However, note that in multiple regression standardizing the parameters in not quite the same as computing the (partial) correlation, due to... math :( ```{r, warning=FALSE, message=FALSE, eval=FALSE} model %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} model %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` ## Standardized differences How does it work in the case of differences, when **factors** are entered and differences between a given level and a reference level (the intercept)? You might have heard that it is similar to a **Cohen's *d***. Well, let's see. ```{r, warning=FALSE, message=FALSE, eval=FALSE} lm(Sepal.Length ~ Species, data = iris) %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} lm(Sepal.Length ~ Species, data = iris) %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` This linear model suggests that the *standardized* difference between the *versicolor* level of Species and the *setosa* level (the reference level - the intercept) is of 1.12 standard deviation of `Sepal.Length` (because the response variable was standardized, right?). Let's compute the **Cohen's *d*** between these two levels: ```{r, warning=FALSE, message=FALSE} # Select portion of data containing the two levels of interest data <- iris[iris$Species %in% c("setosa", "versicolor"), ] cohens_d(Sepal.Length ~ Species, data = data) ``` ***It is very different!*** Why? How? Both differences should be expressed in terms of SD of the response variable. *And there's the trick*. First of all, in the linear model above, the SD by which the difference is scaled is the one of the whole response, which include **all the three levels**, whereas below, we filtered the data to only include the levels of interest. If we recompute the model on this filtered data, it should be better: ```{r, warning=FALSE, message=FALSE, eval=FALSE} lm(Sepal.Length ~ Species, data = data) %>% standardize_parameters() ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} lm(Sepal.Length ~ Species, data = data) %>% standardize_parameters() %>% knitr::kable(digits = 2) ``` Not really. Why? Because the actual formula to compute a **Cohen's *d*** doesn't use the simple SD to scale the effect (as it is done when standardizing the parameters), but computes something called the [**pooled SD**](https://easystats.github.io/effectsize/reference/sd_pooled.html). However, this can be turned off by setting `correct = "raw"`. ```{r, warning=FALSE, message=FALSE} cohens_d(Sepal.Length ~ Species, data = data, pooled_sd = FALSE) ``` ***And here we are :)*** effectsize/inst/doc/bayesian_models.Rmd0000644000176200001440000001133413613235007017727 0ustar liggesusers--- title: "Effect sizes for Bayesian models" output: github_document: toc: true fig_width: 10.08 fig_height: 6 rmarkdown::html_vignette: toc: true fig_width: 10.08 fig_height: 6 tags: [r, effect size, rules of thumb, bayesian, effect size] vignette: > \usepackage[utf8]{inputenc} %\VignetteIndexEntry{Effect sizes for Bayesian models} %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: console bibliography: bibliography.bib --- ```{r message=FALSE, warning=FALSE, include=FALSE} library(knitr) options(knitr.kable.NA = '') options(digits = 2) knitr::opts_chunk$set(comment = ">") if (!requireNamespace("parameters", quietly = TRUE) || !requireNamespace("rstanarm", quietly = TRUE) || !requireNamespace("bayestestR", quietly = TRUE) || !requireNamespace("ppcor", quietly = TRUE)) { knitr::opts_chunk$set(eval = FALSE) } library(effectsize) ``` **Obtaining indices of effect size for Bayesian model is currently an issue**, as no test statistics are present to help us compute such indices. The two alternatives (both available in **effectsize**) is 1) to compute [**standardized parameters**](https://easystats.github.io/effectsize/articles/standardize_parameters.html) or 2) obtain effect sizes by **test-statistic approximation**. This second method is described here. ## Bayesian Regression Coefficients to Correlation via Test-Statistic Approximation ### Overview ```{r, warning=FALSE, message=FALSE} library("ppcor") df <- iris[, 1:4] # Remove the Species factor ppcor::pcor(df)$estimate[2:4, 1] # Select the rows of interest ``` The goal is to retrieve coefficients similar to the above **(partial) correlations** for this multiple regression model: `Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width`. This can easily be achieved for frequentist models by converting the *t* statistic into a correlation: ```{r, warning=FALSE, message=FALSE} library(effectsize) library(parameters) model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df) parameters <- model_parameters(model)[2:4,] convert_t_to_r(parameters$t, parameters$df_residual) ``` Note that these are *not* equivalent to *standardized parameters* from multiple regressions (from which coefficients can be higher than 1). ```{r, warning=FALSE, message=FALSE} standardize_parameters(model)$Std_Coefficient[2:4] ``` Let's start by fitting the Bayesian regression: ```{r, warning=FALSE, message=FALSE, eval = FALSE} library("rstanarm") model <- stan_glm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df) ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE} library("rstanarm") model <- stan_glm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df, refresh = 0, chains = 2) ``` The **effectsize** package provides the `posteriors_to_r()` function, which attempts to estimate the posterior of the (partial) correlation coefficient by approximating the *t* statistic (deviding the coefficient by the SD of the posterior) and using frequentist degrees of freedom. It is an hybrid method that needs to be validated. However, the results appear as very close: ```{r, warning=FALSE, message=FALSE, eval=FALSE} library(bayestestR) r <- convert_posteriors_to_r(model) bayestestR::describe_posterior(r)$Median[2:4] ``` ### Applicability Does it work in all cases? #### Logistic Models Let's start with the frequentist model: ```{r, warning=FALSE, message=FALSE, eval=FALSE} model <- glm(vs ~ cyl + disp + drat, data = mtcars, family = "binomial") parameters <- model_parameters(model) parameters$r <- convert_z_to_r(parameters$z, n = insight::n_obs(model)) parameters ``` However, as logistic models return log-odds, these can be directly converted to *r*: ```{r, warning=FALSE, message=FALSE, eval=FALSE} parameters$r_from_odds <- convert_odds_to_r(parameters$Coefficient, log = TRUE) parameters ``` And now the Bayesian: ```{r, warning=FALSE, message=FALSE, eval = FALSE} model <- stan_glm(vs ~ cyl + disp + drat,, data = mtcars, family = "binomial") parameters <- model_parameters(model) r <- convert_posteriors_to_r(model) parameters$r <- bayestestR::describe_posterior(r)$Median parameters$r_from_odds <- convert_odds_to_r(parameters$Median, log = TRUE) parameters ``` ```{r, warning=FALSE, message=FALSE, echo = FALSE, eval=FALSE} model <- stan_glm(vs ~ cyl + disp + drat,, data = mtcars, family = "binomial", refresh = 0) parameters <- model_parameters(model) r <- convert_posteriors_to_r(model) parameters$r <- bayestestR::describe_posterior(r)$Median parameters$r_from_odds <- convert_odds_to_r(parameters$Median, log = TRUE) parameters ``` ## Referenceseffectsize/inst/doc/bayesian_models.R0000644000176200001440000000576113613235271017420 0ustar liggesusers## ----message=FALSE, warning=FALSE, include=FALSE------------------------------ library(knitr) options(knitr.kable.NA = '') options(digits = 2) knitr::opts_chunk$set(comment = ">") if (!requireNamespace("parameters", quietly = TRUE) || !requireNamespace("rstanarm", quietly = TRUE) || !requireNamespace("bayestestR", quietly = TRUE) || !requireNamespace("ppcor", quietly = TRUE)) { knitr::opts_chunk$set(eval = FALSE) } library(effectsize) ## ---- warning=FALSE, message=FALSE-------------------------------------------- library("ppcor") df <- iris[, 1:4] # Remove the Species factor ppcor::pcor(df)$estimate[2:4, 1] # Select the rows of interest ## ---- warning=FALSE, message=FALSE-------------------------------------------- library(effectsize) library(parameters) model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df) parameters <- model_parameters(model)[2:4,] convert_t_to_r(parameters$t, parameters$df_residual) ## ---- warning=FALSE, message=FALSE-------------------------------------------- standardize_parameters(model)$Std_Coefficient[2:4] ## ---- warning=FALSE, message=FALSE, eval = FALSE------------------------------ # library("rstanarm") # model <- stan_glm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df) ## ---- warning=FALSE, message=FALSE, echo = FALSE------------------------------ library("rstanarm") model <- stan_glm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = df, refresh = 0, chains = 2) ## ---- warning=FALSE, message=FALSE, eval=FALSE-------------------------------- # library(bayestestR) # # r <- convert_posteriors_to_r(model) # bayestestR::describe_posterior(r)$Median[2:4] ## ---- warning=FALSE, message=FALSE, eval=FALSE-------------------------------- # model <- glm(vs ~ cyl + disp + drat, data = mtcars, family = "binomial") # # parameters <- model_parameters(model) # parameters$r <- convert_z_to_r(parameters$z, n = insight::n_obs(model)) # parameters ## ---- warning=FALSE, message=FALSE, eval=FALSE-------------------------------- # parameters$r_from_odds <- convert_odds_to_r(parameters$Coefficient, log = TRUE) # parameters ## ---- warning=FALSE, message=FALSE, eval = FALSE------------------------------ # model <- stan_glm(vs ~ cyl + disp + drat,, data = mtcars, family = "binomial") # parameters <- model_parameters(model) # r <- convert_posteriors_to_r(model) # parameters$r <- bayestestR::describe_posterior(r)$Median # parameters$r_from_odds <- convert_odds_to_r(parameters$Median, log = TRUE) # parameters ## ---- warning=FALSE, message=FALSE, echo = FALSE, eval=FALSE------------------ # model <- stan_glm(vs ~ cyl + disp + drat,, data = mtcars, family = "binomial", refresh = 0) # parameters <- model_parameters(model) # r <- convert_posteriors_to_r(model) # parameters$r <- bayestestR::describe_posterior(r)$Median # parameters$r_from_odds <- convert_odds_to_r(parameters$Median, log = TRUE) # parameters effectsize/inst/doc/standardize_data.R0000644000176200001440000000027113613235272017553 0ustar liggesusers## ----message=FALSE, warning=FALSE, include=FALSE------------------------------ library(knitr) options(knitr.kable.NA = '') knitr::opts_chunk$set(comment=">") options(digits=2) effectsize/inst/doc/standardize_parameters.R0000644000176200001440000000544413613235273021015 0ustar liggesusers## ----message=FALSE, warning=FALSE, include=FALSE------------------------------ library(knitr) knitr::opts_chunk$set(comment = ">") options(digits = 2) options(knitr.kable.NA = '') if (!requireNamespace("dplyr", quietly = TRUE) || !requireNamespace("parameters", quietly = TRUE)) { knitr::opts_chunk$set(eval = FALSE) } set.seed(333) ## ---- warning=FALSE, message=FALSE, eval=FALSE-------------------------------- # library(effectsize) # library(dplyr) # # lm(Sepal.Length ~ Petal.Length, data = iris) %>% # standardize_parameters() ## ---- warning=FALSE, message=FALSE, echo = FALSE------------------------------ library(effectsize) library(dplyr) lm(Sepal.Length ~ Petal.Length, data = iris) %>% standardize_parameters() %>% knitr::kable(digits = 2) ## ---- warning=FALSE, message=FALSE-------------------------------------------- library(parameters) cor.test(iris$Sepal.Length, iris$Petal.Length) %>% model_parameters() ## ---- warning=FALSE, message=FALSE-------------------------------------------- if (require("ppcor")) { df <- iris[, 1:4] # Remove the Species factor ppcor::pcor(df)$estimate[2:4, 1] # Select the rows of interest } ## ---- warning=FALSE, message=FALSE-------------------------------------------- model <- lm(Sepal.Length ~ ., data = df) parameters <- model_parameters(model)[2:4,] convert_t_to_r(parameters$t, parameters$df_residual) ## ---- warning=FALSE, message=FALSE, eval=FALSE-------------------------------- # model %>% # standardize_parameters() ## ---- warning=FALSE, message=FALSE, echo = FALSE------------------------------ model %>% standardize_parameters() %>% knitr::kable(digits = 2) ## ---- warning=FALSE, message=FALSE, eval=FALSE-------------------------------- # lm(Sepal.Length ~ Species, data = iris) %>% # standardize_parameters() ## ---- warning=FALSE, message=FALSE, echo = FALSE------------------------------ lm(Sepal.Length ~ Species, data = iris) %>% standardize_parameters() %>% knitr::kable(digits = 2) ## ---- warning=FALSE, message=FALSE-------------------------------------------- # Select portion of data containing the two levels of interest data <- iris[iris$Species %in% c("setosa", "versicolor"), ] cohens_d(Sepal.Length ~ Species, data = data) ## ---- warning=FALSE, message=FALSE, eval=FALSE-------------------------------- # lm(Sepal.Length ~ Species, data = data) %>% # standardize_parameters() ## ---- warning=FALSE, message=FALSE, echo = FALSE------------------------------ lm(Sepal.Length ~ Species, data = data) %>% standardize_parameters() %>% knitr::kable(digits = 2) ## ---- warning=FALSE, message=FALSE-------------------------------------------- cohens_d(Sepal.Length ~ Species, data = data, pooled_sd = FALSE) effectsize/inst/doc/interpret.html0000644000176200001440000007637513613235272017053 0ustar liggesusers

Automated Interpretation of Indices of Effect Size

Why?

The metrics used in statistics (indices of fit, model performance or parameter estimates) can be very abstract. A long experience is required to intuitively “feel” the meaning of their values. In order to facilitate the understanding of the results they are facing, many scientists use (often implicitly) some set of rules of thumb. Thus, in order to validate and standardize such interpretation grids, some authors validated and published them in the form of guidelines.

One of the most famous interpertation grid was proposed by Cohen (1988) for a series of widely used indices, such as the correlation r (r = .20, small; r = .40, moderate and r = .60, large) or the standardized difference (Cohen’s d). However, there is now a clear evidence that Cohen’s guidelines (which he himself later disavowed; Funder, 2019) are much too stringent and not particularly meaningful taken out of context (Funder and Ozer 2019). This led to the emergence of a litterature discussing and creating new sets of rules of thumb.

Altough everybody agrees on the fact that effect size interpretation in a study should be justified with a rationale (and depend on the context, the field, the litterature, the hypothesis, etc.), these pre-baked rules can still nevertheless be useful to give a rough idea or frame of reference to understand scientific results.

The package effectsize implements such sets of rules of thumb for a variety of indices in a flexible and explicit fashion, helping you understanding and reporting your results in a scientific yet meaningful way. Again, readers should keep in mind that these thresholds, altough “validated”, remain arbitrary. Thus, their use should be discussed on a case-by-case basis depending on the field, hypotheses, prior results and so on, to avoid their crystalisation, as for the infamous p < .05 example.

Moreovere, some authors suggest the counter-intuitive idea that very large effects, especially in the context of psychological research, is likely to be a “gross overestimate that will rarely be found in a large sample or in a replication” (Funder and Ozer 2019). They suggest that smaller effect size are worth taking seriously (as they can be potentially consequential), as well as more believable.

Supported Indices

Coefficient of determination (R2)

Falk and Miller (1992)

  • R2 < 0.1: Negligible
  • R2 > 0.1: Adequate

Cohen (1988)

  • R2 = 0 - 0.02: Very weak
  • R2 = 0.02 - 0.16: Weak
  • R2 = 0.16 - 0.26: Moderate
  • R2 > 0.26: Substantial

Chin and others (1998)

  • R2 = 0 - 0.19: Very weak
  • R2 = 0.19 - 0.33: Weak
  • R2 = 0.33 - 0.67: Moderate
  • R2 > 0.67: Substantial

Hair, Ringle, and Sarstedt (2011)

  • R2 = 0 - 0.25: Very weak
  • R2 = 0.25 - 0.50: Weak
  • R2 = 0.50 - 0.75: Moderate
  • R2 > 0.75: Substantial

Correlation r

  • r = 0 - 0.05: Very small
  • r = 0.05 - 0.1: Small
  • r = 0.1 - 0.2: Medium
  • r = 0.2 - 0.3: Large
  • r > 0.4: Very large

Gignac and Szodorai (2016)

Gignac’s rules of thumb are actually one of few interpretation grid justified and based on actual data, in this case on the distribution of effect magnitudes in the litterature.

  • r = 0 - 0.1: Very small
  • r = 0.1 - 0.2: Small
  • r = 0.2 - 0.3: Moderate (“typical”)
  • r > 0.3: Large

Cohen (1988)

  • r = 0 - 0.1: Very small
  • r = 0.1 - 0.3: Small
  • r = 0.3 - 0.5: Moderate
  • r > 0.5: Large

Evans (1996)

  • r = 0 - 0.2: Very weak
  • r = 0.2 - 0.4: Weak
  • r = 0.4 - 0.6: Moderate
  • r = 0.6 - 0.8: Strong
  • r > 0.8: Very strong

Standardized Difference d (Cohen’s d)

The sandardized difference can be obtained through the standardization of linear model’s parameters or data, in which they can be used as indices of effect size.

  • r = 0 - 0.1: Very small
  • r = 0.1 - 0.2: Small
  • r = 0.2 - 0.4: Medium
  • r = 0.4 - 0.6: Large
  • r > 0.6: Very large

Gignac and Szodorai (2016)

Gignac’s rules of thumb are actually one of few interpretation grid justified and based on actual data, in this case on the distribution of effect magnitudes in the litterature.

  • d = 0 - 0.2: Very small
  • d = 0.2 - 0.4: Small
  • d = 0.4 - 0.6: Medium
  • d > 0.6: Large

Cohen (1988)

  • d = 0 - 0.2: Very small
  • d = 0.2 - 0.5: Small
  • d = 0.5 - 0.8: Medium
  • d > 0.8: Large

Sawilowsky (2009)

  • d = 0 - 0.1: Tiny
  • d = 0.1 - 0.2: Very small
  • d = 0.2 - 0.5: Small
  • d = 0.5 - 0.8: Medium
  • d = 0.8 - 1.2: Large
  • d = 1.2 - 2: Very large
  • d > 2: Huge

Odds ratio

Odds ratio, and log odds ratio, are often found in epidemiological studies. However, they are also the parameters of logistic regressions, where they can be used as indices of effect size. Note that the (log) odds ratio from logistic regression coefficients are unstandardized, as they depend on the scale of the predictor. In order to apply the following guidelines, make sure you standardize your predictors!

Chen, Cohen, and Chen (2010)

  • odds = 0 - 1.68: Very small
  • odds = 1.68 - 3.47: Small
  • odds = 3.47 - 6.71: Medium
  • odds > 6.71: Large

Cohen (1988)

This converts (log) odds ratio to standardized difference d using the following formula (Cohen 1988; Sánchez-Meca, Marı́n-Martı́nez, and Chacón-Moscoso 2003):

Omega Squared

The Omega squared is a measure of effect size used in ANOVAs. It is an estimate of how much variance in the response variables are accounted for by the explanatory variables. Omega squared is widely viewed as a lesser biased alternative to eta-squared, especially when sample sizes are small.

Field (2013)

  • Omega Squared = 0 - 0.01: Very small
  • Omega Squared = 0.01 - 0.06: Small
  • Omega Squared = 0.06 - 0.14: Medium
  • Omega Squared > 0.14: Large

Bayes Factor (BF)

Bayes factors (BF) are continuous measures of relative evidence, with a Bayes factor greater than 1 giving evidence in favor of one of the models (the numerator), and a Bayes factor smaller than 1 giving evidence in favor of the other model (the denominator). Yet, it is common to interpret the magnitude of relative evidence based on conventions of intervals (presented below), such that the values of a BF10 (comparing the alternative to the null) can be interpreted as:

For human readability, it is recommended to report BFs so that the ratios are larger than 1 - for example, it’s harder to understand a BF10=0.07 (indicating the data are 0.07 times more probable under the alternative) than a BF01=1/0.07=14.3 (indicating the data are 14.3 times more probable under the null. BFs between 0 and 1, indicating evidence against the hypothesis, can be converted via bf = 1 / abs(bf).

One can report Bayes factors using the following sentence:

There is a strong evidence against the null hypothesis (BF = 12.2).

Jeffreys (1961)

  • bf = 1 - 3: Anecdotal
  • bf = 3 - 10: Moderate
  • bf = 10 - 30: Strong
  • bf = 30 - 100: Very strong
  • bf > 100: Extreme

Raftery (1995)

  • bf = 1 - 3: Weak
  • bf = 3 - 20: Positive
  • bf = 20 - 150: Strong
  • bf > 150: Very strong

Bayesian Convergence Diagnostic (Rthat and Effective Sample Size)

Experts have suggested thresholds value to help interpreting and convergence and sampling quality. As such, Rhat should not be larger than 1.1 (Gelman, Rubin, and others 1992) or 1.01 (Vehtari et al. 2019). An effective sample size (ESS) greater than 1,000 is sufficient for stable estimates (Bürkner and others 2017).

Other Bayesian Indices (% in ROPE, pd)

The interpretation of Bayesian indices is detailed in this article.

References

Bürkner, Paul-Christian, and others. 2017. “Brms: An R Package for Bayesian Multilevel Models Using Stan.” Journal of Statistical Software 80 (1): 1–28.

Chen, Henian, Patricia Cohen, and Sophie Chen. 2010. “How Big Is a Big Odds Ratio? Interpreting the Magnitudes of Odds Ratios in Epidemiological Studies.” Communications in Statistics—Simulation and Computation 39 (4): 860–64.

Chin, Wynne W, and others. 1998. “The Partial Least Squares Approach to Structural Equation Modeling.” Modern Methods for Business Research 295 (2): 295–336.

Cohen, Jacob. 1988. “Statistical Power Analysis for the Social Sciences.”

Evans, James D. 1996. Straightforward Statistics for the Behavioral Sciences. Thomson Brooks/Cole Publishing Co.

Falk, R Frank, and Nancy B Miller. 1992. A Primer for Soft Modeling. University of Akron Press.

Field, Andy. 2013. Discovering Statistics Using Ibm Spss Statistics. sage.

Funder, David C, and Daniel J Ozer. 2019. “Evaluating Effect Size in Psychological Research: Sense and Nonsense.” Advances in Methods and Practices in Psychological Science, 2515245919847202.

Gelman, Andrew, Donald B Rubin, and others. 1992. “Inference from Iterative Simulation Using Multiple Sequences.” Statistical Science 7 (4): 457–72.

Gignac, Gilles E, and Eva T Szodorai. 2016. “Effect Size Guidelines for Individual Differences Researchers.” Personality and Individual Differences 102: 74–78.

Hair, Joe F, Christian M Ringle, and Marko Sarstedt. 2011. “PLS-Sem: Indeed a Silver Bullet.” Journal of Marketing Theory and Practice 19 (2): 139–52.

Jeffreys, Harold. 1961. “Theory of Probability, Clarendon.” Oxford.

Raftery, Adrian E. 1995. “Bayesian Model Selection in Social Research.” Sociological Methodology 25: 111–64.

Sawilowsky, Shlomo S. 2009. “New Effect Size Rules of Thumb.”

Sánchez-Meca, Julio, Fulgencio Marı́n-Martı́nez, and Salvador Chacón-Moscoso. 2003. “Effect-Size Indices for Dichotomized Outcomes in Meta-Analysis.” Psychological Methods 8 (4): 448.

Vehtari, Aki, Andrew Gelman, Daniel Simpson, Bob Carpenter, and Paul-Christian Bürkner. 2019. arXiv Preprint arXiv:1903.08008.

effectsize/inst/CITATION0000644000176200001440000000104413602561102014506 0ustar liggesusersbibentry( bibtype="Article", title="Compute and interpret indices of effect size", author=c(person("Dominique", "Makowski"), person("Mattan S.", "Ben-Shachar"), person("Daniel", "Lüdecke")), journal="CRAN", year="2019", note="R package", url="https://github.com/easystats/effectsize", textVersion = paste("Makowski, Ben-Shachar & Lüdecke (2019). Compute and interpret indices of effect size. CRAN.", "Available from https://github.com/easystats/effectsize." ), mheader = "To cite effectsize in publications use:")