vcdExtra/0000755000176200001440000000000014202500463012026 5ustar liggesusersvcdExtra/NAMESPACE0000644000176200001440000000640213164013351013250 0ustar liggesusers# last modified 29 Oct 2014 by M. Friendly # - removed aperm, now that aperm.table is in base # - removed meanResiduals, which is now in gnm # + added HLtest & methods # + added CMHtest # + added functions in loglin-utilities # + added logseries functions # + added seq_mosaic # + added logLik.loglm, blogits # - removed as.array generic, now in base # + added cutfac # + now required to import: grid # - removed loddsratio (now in vcd) # - removed print.Kappa (now in vcd) # + import from ca; export mpcaplot # we are a vcd extension; do we need to import gnm here? import(vcd) import(gnm) import(grid) #import(rgl) importFrom(MASS, loglm) # add inports for all base packages importFrom("grDevices", "hsv") importFrom("stats", "as.formula", "deviance", "family", "fitted", "formula", "glm", "logLik", "loglin", "model.frame", "na.pass", "nobs", "pchisq", "poisson", "qnorm", "quantile", "reformulate", "residuals", "rstandard", "runif", "terms", "update", "xtabs") importFrom("utils", "data", "menu", "type.convert") importFrom("ca", "cacoord", "multilines") importFrom("grDevices", "rgb") importFrom("graphics", "abline", "plot", "points", "text") importFrom("stats", "update.formula") # joy to the world export( expand.dft,expand.table,collapse.table, mosaic.glm, sieve.glm, assoc.glm, modFit, modFit.glm, modFit.loglm, GKgamma,print.GKgamma, glmlist, loglmlist, summarise, logLik.loglm, # print.Kappa, mosaic3d, split3d, range3d, center3d, Kway, Crossings, datasets, # loddsratio, # as.array, # aperm, meanResiduals, HLtest, HosmerLemeshow, CMHtest, conditional, joint, markov, mutual, saturated, loglin2formula, loglin2string, seq_loglm, dlogseries, plogseries, qlogseries, rlogseries, seq_mosaic, blogits, Summarise, LRstats, cutfac, mcaplot, update.xtabs, zero.test ) # basic methods for glm & loglm objects S3method(mosaic, glm) S3method(sieve, glm) S3method(assoc, glm) S3method(modFit, glm) S3method(modFit, loglm) S3method(mosaic, glmlist) S3method(mosaic, loglmlist) S3method(update, xtabs) #S3method(summarise, glm) #S3method(summarise, glmlist) #S3method(summarise, loglm) #S3method(summarise, loglmlist) S3method(Summarise, glmlist) S3method(Summarise, loglmlist) S3method(Summarise, default) S3method(LRstats, glmlist) S3method(LRstats, loglmlist) S3method(LRstats, default) S3method(coef, glmlist) S3method(logLik, loglm) S3method(print, GKgamma) #S3method(print, Kappa) # moved to vcd # mosaic3d related S3method(split3d, shape3d) S3method(split3d, list) S3method(mosaic3d, default) S3method(mosaic3d, loglm) # logoddsratio related methods -- moved to vcd #S3method(loddsratio, default) #S3method(coef, loddsratio) #S3method(confint, loddsratio) #S3method(dim, loddsratio) #S3method(dimnames, loddsratio) #S3method(print, loddsratio) #S3method(vcov, loddsratio) #S3method(as.matrix, loddsratio) #S3method(as.array, loddsratio) #S3method(as.data.frame, loddsratio) # aperm method removed, as this is now in stats #S3method(aperm, default) #S3method(aperm, table) S3method(print, HLtest) S3method(summary, HLtest) S3method(plot, HLtest) S3method(rootogram, HLtest) S3method(print, CMHtest) S3method(CMHtest,formula) S3method(CMHtest,default) vcdExtra/demo/0000755000176200001440000000000013164013351012753 5ustar liggesusersvcdExtra/demo/mosaic3d-demo.R0000644000176200001440000000572713164013351015535 0ustar liggesusers### mosaic3d-demo: proof-of-concept for exploring 3D mosaic plots ## ## split a 3D object along a given dimension, dim, into copies whose ## extent along that dimension are given by the proportions in vector p ## (rescaled to proportions if they are not already so). ## ## The objects are slightly separated along that dimension, allowing ## a total inter-object space = space ## split3d <- function(obj, p, dim, space=.10) { range <-range3d(obj) min <- range[1,] p <- p/sum(p) # assure proportions uspace <- space/(length(p)-1) # unit space between objects scales <- p * (1-space) shifts <- c(0, cumsum(p)[-length(p)])*diff(range[,dim]) result <- list() for (i in seq_along(p)) { xscale <- yscale <- zscale <- 1 xshift <- yshift <- zshift <- 0 if (dim == 1) { xscale <- scales[i] xshift <- shifts[i] + min[1]*(1-xscale) + (uspace * (i-1)) } else if (dim == 2) { yscale <- scales[i] yshift <- shifts[i] + min[2]*(1-yscale) + (uspace * (i-1)) } else if (dim == 3) { zscale <- scales[i] zshift <- shifts[i] + min[3]*(1-zscale) + (uspace * (i-1)) } result[[i]] <- translate3d(scale3d(obj, xscale, yscale, zscale), xshift, yshift, zshift) } result } range3d <- function(obj) { if (!"vb" %in% names(obj)) stop("Not a mesh3d or shape3d object") x <- with(obj, range(vb[1,]/vb[4,])) y <- with(obj, range(vb[2,]/vb[4,])) z <- with(obj, range(vb[3,]/vb[4,])) result <- cbind(x,y,z) rownames(result)<- c('min', 'max') result } label3d <- function(objlist, dim, text, offset=.1, adj=c(0.5, 1), ...) { ranges <- lapply(objlist, range3d) loc <- t(sapply(ranges, colMeans)) # positions of labels on dimension dim min <- t(sapply(ranges, function(x) x[1,])) # other dimensions at min values xyz <- min - offset xyz[,dim] <- loc[,dim] texts3d(xyz, texts=text, adj=adj, ...) } library(rgl) # level 1 open3d() # use transparent colors for the side walls of mosaic cubes crgb <- col2rgb(c("red", "gray90", "blue"))/255 clr <-rbind(crgb, alpha=0.5) col <- rgb(clr[1,], clr[2,], clr[3,], clr[4,]) #col <- c("#FF000080", "#E5E5E580", "#0000FF80") sl0 <- cube <- cube3d(alpha=0.3) sl1 <- split3d(sl0, c(.2, .3, .5), 1) shapelist3d(sl1, col=col) label3d(sl1, 1, c("A1", "A2", "A3")) # level 2 open3d() sl2 <- list() for (i in seq_along(sl1)) { p <- runif(1, .2, .8) sl2 <- c(sl2, split3d(sl1[[i]], c(p, 1-p), 2, space=.1)) } shapelist3d(sl2, col=col) label3d(sl1, 1, c("A1", "A2", "A3")) label3d(sl2[1:2], 2, c("B1", "B2")) # level 3 open3d() sl3 <- list() for (i in seq_along(sl2)) { p <- runif(1, .2, .8) sl3 <- c(sl3, split3d(sl2[[i]], c(p, 1-p), 3, space=.05)) } shapelist3d(sl3, col=col) label3d(sl1, 1, c("A1", "A2", "A3")) label3d(sl2[1:2], 2, c("B1", "B2")) #label3d(sl3[1:2], 3, c("C1", "C2")) label3d(sl3[1:2], 3, c("C1", "C2"), adj=rev(c(0.5, 1))) vcdExtra/demo/mosaic3d-hec.R0000644000176200001440000000127513164013351015342 0ustar liggesusers## mosaic3d-hec 2D and 3D visualizations of HairEyeColor data library(vcdExtra) # two-way mosaic displays HairEye <- margin.table(HairEyeColor, c(1,2)) HairEye mosaic(HairEye, shade=TRUE) # three-way mosaic displays structable(HairEyeColor) # mutual independence model mosaic(HairEyeColor, shade=TRUE) # joint independence of Hair*Eye with Sex mosaic(HairEyeColor, expected =~(Hair*Eye)+Sex) # observed frequencies, mutual independence mosaic3d(HairEyeColor) # expected frequencies under mutual independence mosaic3d(HairEyeColor, type="expected") # expected frequencies under joint independence mosaic3d(HairEyeColor, type="expected", expected =~(Hair*Eye)+Sex) vcdExtra/demo/Wong3-1.R0000644000176200001440000001041113164013351014226 0ustar liggesusers# Wong3-1 Political views, support for women to work and national welfare spending library(vcdExtra) # Data from Wong, R. (2010), Association Models, Los Angeles: Sage, Number 07-164 # Table 3.1, from the General Social Survey, 2006. # Questions: # polviews: Think of self as liberal or conservative # fefam: Better for men to work and women to tend home # natfare: National welfare spending: too little, about right, too much # Table 3.1 Freq<-c( 9, 5, 5, 1, 1, 6, 5, 1, 2, 2, 2, 1, 17,13, 7, 4, 13,22, 9, 1, 7,13, 6, 2, 8,14, 6, 0, 10,29,10, 0, 5,14, 6, 2, 20,38,24, 8, 23,72,34,10, 17,67,36,12, 4,21,12, 4, 7,30, 9, 1, 9,19,14, 2, 2, 9, 8, 3, 1,16,19, 2, 11,28,28,11, 0, 1, 5, 0, 2, 3, 3, 2, 2, 7, 6, 6) polviews<-gl(7,4*3) fefam<-gl(4,1,length=7*4*3) natfare<-gl(3,4,length=7*4*3) long.vnames <- list(set_varnames = c(polviews="Political views", fefam="Females should tend home", natfare="National welfare spending")) long.lnames <- list(polviews = c("Lib++", "2", "3", "Moderate", "5", "6", "Cons++"), fefam = c("Dis+", "Dis", "Agr", "Agr+"), natfare = c("--", "OK", "++") ) ############################################ Wong31 <- data.frame(Freq, polviews, fefam, natfare) Wong31.xtab <- xtabs(Freq ~ polviews+fefam+natfare, data=Wong31) dimnames(Wong31.xtab) <- long.lnames # Quick look at all pairwise associations pairs(Wong31.xtab, gp=shading_Friendly, diag_panel=pairs_diagonal_mosaic) ############################################ # Model 1 - Independence Model Wong31.O<-gnm(Freq~polviews+fefam+natfare,family=poisson, data=Wong31) summary(Wong31.O) mosaic(Wong31.O, main=paste("Independence model",modFit(Wong31.O)), labeling_args=long.vnames, set_labels=long.lnames, split_vertical=c(TRUE, FALSE, FALSE), labeling=labeling_residuals, suppress=2, gp=shading_Friendly) ############################################ # NB: add1 doesn't work with gnm() objects. Re-fit using glm() Wong31.O<-glm(Freq~polviews+fefam+natfare,family=poisson, data=Wong31) # consider all two-way terms add1(Wong31.O, ~.+(polviews + fefam + natfare)^2, test="Chisq") # same result with MASS::addterm addterm(Wong31.O, ~.+(polviews + fefam + natfare)^2, test="Chisq") # or, start with saturated model and drop terms Wong31.sat<-glm(Freq~polviews*fefam*natfare, family=poisson, data=Wong31) drop1(Wong31.sat, test="Chisq") ############################################ # Model 2 - Full Two-way Interaction Wong31.twoway <- update(Wong31.O, ~ .^2) summary(Wong31.twoway) mosaic(Wong31.twoway, main=paste("All two-way model", modFit(Wong31.twoway)), labeling_args=long.vnames, set_labels=long.lnames, split_vertical=c(TRUE, FALSE, FALSE), labeling=labeling_residuals, suppress=1, gp=shading_Friendly) ############################################ # Model 3 - Conditional Independence on polviews Wong31.cond1 <- glm(Freq~polviews * (fefam + natfare), family=poisson) summary(Wong31.cond1) mosaic(Wong31.cond1, main=paste("Cond1: ~P * (F+N)", modFit(Wong31.cond1)), labeling_args=long.vnames, set_labels=long.lnames, split_vertical=c(TRUE, FALSE, FALSE), labeling=labeling_residuals, suppress=1, gp=shading_Friendly) ############################################ # Model 4 - Conditional Independence on fefam Wong31.cond2 <- glm(Freq~polviews*fefam + fefam*natfare,family=poisson) summary(Wong31.cond2) mosaic(Wong31.cond2, main=paste("Cond2: ~F * (P+N)", modFit(Wong31.cond2)), labeling_args=long.vnames, set_labels=long.lnames, split_vertical=c(TRUE, FALSE, FALSE), labeling=labeling_residuals, suppress=1, gp=shading_Friendly) ############################################ # Model 5 - Conditional Independence on natfare Wong31.cond3<-glm(Freq~fefam*natfare+polviews*natfare,family=poisson) summary(Wong31.cond3) mosaic(Wong31.cond3, main=paste("Cond2: ~N * (F+N)", modFit(Wong31.cond3)), labeling_args=long.vnames, set_labels=long.lnames, split_vertical=c(TRUE, FALSE, FALSE), labeling=labeling_residuals, suppress=1, gp=shading_Friendly) anova(Wong31.O, Wong31.cond3, Wong31.cond2, Wong31.cond1,Wong31.twoway, Wong31.sat) vcdExtra/demo/housing.R0000644000176200001440000001043413164013351014554 0ustar liggesusers## housing.R Visualize models from example(housing, package="MASS") # These examples fit a variety of models to the data(housing), giving a 4-way # frequency table of 1681 individuals from the Copenhagen Housing Conditions # Survey, classified by their Type of rental dwelling, perceived Influence on # management of the property, and degree of Contact with other residents. The # response variable here is Satisfaction of householders with their present # housing circumstances. library(vcdExtra) data(housing, package="MASS") oldop <-options(contrasts = c("contr.treatment", "contr.poly")) ########################## # Poisson models for Freq, equivalent to loglinear models ########################## # Baseline model, with Satisfaction as a response house.glm0 <- glm(Freq ~ Infl*Type*Cont + Sat, family = poisson, data = housing) modFit(house.glm0) # labeling_args for mosaic() largs <- list(set_varnames = c(Infl="Influence on management", Cont="Contact among residents", Type="Type of dwelling", Sat="Satisfaction"), abbreviate=c(Type=3)) mosaic(house.glm0, labeling_args=largs, main='Baseline model: [ITC][Sat]') # reorder variables in the mosaic, putting Sat last mosaic(house.glm0, ~ Type+Infl+Cont+Sat, labeling_args=largs, main='Baseline model: [ITC][Sat]') # what terms need to be added? addterm(house.glm0, ~. + Sat:(Infl+Type+Cont), test = "Chisq") # add all two way terms with Satisfaction house.glm1 <- update(house.glm0, . ~ . + Sat*(Infl+Type+Cont)) # did it get better? anova(house.glm0, house.glm1, test="Chisq") mosaic(house.glm1, labeling_args=largs, main='Model [IS][TS][CS]', gp=shading_Friendly) # Same model, fit by terative proportional scaling (house.loglm <- loglm(Freq ~ Infl*Type*Cont + Sat*(Infl+Type+Cont), data = housing)) # Can we drop any terms? dropterm(house.glm1, test = "Chisq") # Need to add any terms? addterm(house.glm1, ~. + Sat:(Infl+Type+Cont)^2, test = "Chisq") ########################## # Effect plots, for glm1 model ########################## library(effects) house.eff <-allEffects(house.glm1) # show the interactions of Infl, Cont and Type with Sat plot(house.eff, 'Infl:Sat', x.var='Sat', xlab="Satisfaction") # same plot in one panel, no std errors shown plot(house.eff, 'Infl:Sat', x.var='Sat', xlab="Satisfaction", multiline=TRUE) plot(house.eff, 'Cont:Sat', x.var='Sat', xlab="Satisfaction") plot(house.eff, 'Type:Sat', x.var='Sat', xlab="Satisfaction") ########################## # multinomial model ########################## library(nnet) # multinomial model, similar in spirit to house.glm1 (house.mult<- multinom(Sat ~ Infl + Type + Cont, weights = Freq, data = housing)) # Do we need a more complex model? house.mult2 <- multinom(Sat ~ Infl*Type*Cont, weights = Freq, data = housing) anova(house.mult, house.mult2) # effect plots for multinomial model house.effm <- allEffects(house.mult) plot(house.effm, 'Infl', xlab='Influence on management', style="stacked", main="Multinomial: Infl effect plot") plot(house.effm, 'Cont', xlab='Contact among residents', style="stacked", main="Multinomial: Cont effect plot") plot(house.effm, 'Type', xlab='Type of dwelling', style="stacked", main="Multinomial: Type effect plot") ########################## # proportional odds model ########################## (house.plr <- polr(Sat ~ Infl + Type + Cont, data = housing, weights = Freq)) # Test proportional odds assumption by likelihood ratio test # NB: multinom() objects do not have a df.residual component, so we have # to use the difference in edf to get df for the test pchisq(deviance(house.plr) - deviance(house.mult), df = house.mult$edf -house.plr$edf, lower.tail = FALSE) # try more complex models house.plr2 <- stepAIC(house.plr, ~.^2) house.plr2$anova house.effp <- allEffects(house.plr) plot(house.effp, 'Infl', xlab='Influence on management', style="stacked", main="Proportional odds: Infl effect plot") plot(house.effp, 'Cont', xlab='Contact among residents', style="stacked", main="Proportional odds: Cont effect plot") plot(house.effp, 'Type', xlab='Type of dwelling', style="stacked", main="Proportional odds: Type effect plot") options(oldop) vcdExtra/demo/yaish-unidiff.R0000644000176200001440000000210613164013351015634 0ustar liggesusers# Yaish data: Unidiff model for 3-way table library(gnm) library(vcd) data(yaish) # Ignore orig==7 & dest == 7 with very few cases yaish <- yaish[,1:6,1:6] ## Fit mutual independence model. long.labels <- list(set_varnames = c(orig="Origin status", dest="Destination status", educ="Education")) mosaic(~orig + dest + educ, data=yaish, gp=shading_Friendly, labeling_args=long.labels) ## Fit conditional independence model mosaic(~orig + dest | educ, data=yaish, gp=shading_Friendly, labeling_args=long.labels) ## Fit the "UNIDIFF" mobility model across education levels ## unidiff <- gnm(Freq ~ educ*orig + educ*dest + Mult(Exp(educ), orig:dest), family = poisson, data = yaish, subset = (dest != 7 & orig != 7)) structable(round(residuals(unidiff), digits=2)) # can use mosaic.loglm, passing residuals mosaic(yaish[, 1:6, 1:6], residuals=residuals(unidiff), gp=shading_Friendly, labeling_args=long.labels) # what about mosaic.gnm? mosaic(unidiff, gp=shading_Friendly, labeling_args=long.labels) vcdExtra/demo/mental-glm.R0000644000176200001440000000456613164013351015146 0ustar liggesusers## Mental health data: mosaics for glm() and gnm() models library(gnm) library(vcdExtra) data(Mental) # display the frequency table (Mental.tab <- xtabs(Freq ~ mental+ses, data=Mental)) # fit independence model # Residual deviance: 47.418 on 15 degrees of freedom indep <- glm(Freq ~ mental+ses, family = poisson, data = Mental) deviance(indep) long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(indep,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, main="Mental health data: Independence") # as a sieve diagram mosaic(indep, labeling_args = long.labels, panel=sieve, gp=shading_Friendly, main="Mental health data: Independence") # fit linear x linear (uniform) association. Use integer scores for rows/cols Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) # column effects model (ses) coleff <- glm(Freq ~ mental + ses + Rscore:ses, family = poisson, data = Mental) mosaic(coleff,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: Col effects (ses)") # row effects model (mental) roweff <- glm(Freq ~ mental + ses + mental:Cscore, family = poisson, data = Mental) mosaic(roweff,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: Row effects (mental)") linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) # compare models anova(indep, roweff, coleff, linlin) AIC(indep, roweff, coleff, linlin) mosaic(linlin,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: Linear x Linear") ## Goodman Row-Column association model fits well (deviance 3.57, df 8) Mental$mental <- C(Mental$mental, treatment) Mental$ses <- C(Mental$ses, treatment) RC1model <- gnm(Freq ~ mental + ses + Mult(mental, ses), family = poisson, data = Mental) mosaic(RC1model,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: RC1 model") vcdExtra/demo/vision-quasi.R0000644000176200001440000000230713164013351015527 0ustar liggesusers# VisualAcuity data: Quasi- and Symmetry models library(vcdExtra) library(gnm) women <- subset(VisualAcuity, gender=="female", select=-gender) indep <- glm(Freq ~ right + left, data = women, family=poisson) mosaic(indep, residuals_type="rstandard", gp=shading_Friendly, main="Vision data: Independence (women)" ) quasi.indep <- glm(Freq ~ right + left + Diag(right, left), data = women, family = poisson) mosaic(quasi.indep, residuals_type="rstandard", gp=shading_Friendly, main="Quasi-Independence (women)" ) symmetry <- glm(Freq ~ Symm(right, left), data = women, family = poisson) # BUG FIXED mosaic(symmetry, residuals_type="rstandard", gp=shading_Friendly, main="Symmetry model (women)") quasi.symm <- glm(Freq ~ right + left + Symm(right, left), data = women, family = poisson) mosaic(quasi.symm, residuals_type="rstandard", gp=shading_Friendly, main="Quasi-Symmetry model (women)") # model comparisons: for *nested* models anova(indep, quasi.indep, quasi.symm, test="Chisq") anova(symmetry, quasi.symm, test="Chisq") # model summaries, with AIC and BIC models <- glmlist(indep, quasi.indep, symmetry, quasi.symm) LRstats(models) vcdExtra/demo/ucb-glm.R0000644000176200001440000000137013164013351014425 0ustar liggesusers# UCBAdmissions data: Conditional independence via loglm and glm library(vcd) data("UCBAdmissions") structable(Dept ~ Admit+Gender,UCBAdmissions) ## conditional independence in UCB admissions data mod.1 <- loglm(~ Dept * (Gender + Admit), data=UCBAdmissions) mod.1 # this is correct, except the Pearson residuals dont show that # all the lack of fit is concentrated in Dept A mosaic(mod.1, gp=shading_Friendly, labeling=labeling_residuals) library(vcdExtra) # using glm() berkeley <- as.data.frame(UCBAdmissions) mod.3 <- glm(Freq ~ Dept * (Gender+Admit), data=berkeley, family="poisson") summary(mod.3) # (BUG FIXED )the large residuals are all in Dept A mosaic(mod.3, residuals_type="rstandard", labeling=labeling_residuals) vcdExtra/demo/occStatus.R0000644000176200001440000000622613164013351015054 0ustar liggesusers# Occupational status data from Goodman (1979) and Duncan (1979) # Fit a variety of models. Compare mosaic using expected= to mosaic.glm library(gnm) library(vcdExtra) data(occupationalStatus) occupationalStatus # define long labels for use in mosaics long.labels <- list(set_varnames = c(origin="origin: Father's status", destination="destination: Son's status")) mosaic(occupationalStatus, shade=TRUE, main="Occupational status: Independence model", labeling_args = long.labels, legend=FALSE) indep.glm <- glm(Freq ~ origin + destination, family=poisson, data=occupationalStatus) mosaic(indep.glm, main="Independence model", labeling_args = long.labels, legend=FALSE, gp=shading_Friendly) quasi.independence <- gnm(Freq ~ origin + destination + Diag(origin,destination), family=poisson, data=occupationalStatus) str(quasi.independence$data) anova(quasi.independence) ## BUGLET (vcd): the diagonal cells should be considered 0 here--- outlined in black mosaic(occupationalStatus, expected=fitted(quasi.independence), main="Quasi-independence model", labeling_args = long.labels, legend=FALSE, gp=shading_Friendly) ## using mosaic.gnm mosaic(quasi.independence, main="Quasi-independence model", labeling_args = long.labels, legend=FALSE, gp=shading_Friendly, labeling=labeling_residuals) symmetry <- glm(Freq ~ Symm(origin, destination), family=poisson, data=occupationalStatus) mosaic(occupationalStatus, expected=fitted(symmetry), main="Symmetry model", gp=shading_Friendly, labeling=labeling_residuals, labeling_args = long.labels ) # using mosaic.glm --- OK mosaic(symmetry, main="Symmetry model", gp=shading_Friendly, labeling=labeling_residuals, labeling_args = long.labels ) quasi.symm <- glm(Freq ~ origin + destination + Symm(origin, destination), family=poisson, data=occupationalStatus) anova(quasi.symm) mosaic(occupationalStatus, expected=fitted(quasi.symm), main="Quasi-symmetry model") # model comparisons anova(independence, quasi.independence, quasi.symm, test="Chisq") # compare symmetry to quasi summetry anova(symmetry, quasi.symm, test="Chisq") # association models # uniform association, aka linear x linear association Rscore <- as.vector(row(occupationalStatus)) Cscore <- as.vector(col(occupationalStatus)) uniform <- gnm(Freq ~ origin + destination + Rscore:Cscore, family=poisson, data=occupationalStatus) mosaic(uniform, main="Uniform association model", labeling_args = long.labels, legend=FALSE, gp=shading_Friendly, labeling=labeling_residuals ) RChomog <- gnm(Freq ~ origin + destination + Diag(origin, destination) + MultHomog(origin, destination), family=poisson, data=occupationalStatus) mosaic(RChomog, main="RC homogeneous model", labeling_args = long.labels, legend=FALSE, gp=shading_Friendly, labeling=labeling_residuals) # RC1 - heterogeneous association RC1 <- gnm(Freq ~ origin + destination + Diag(origin, destination) + Mult(origin, destination), family=poisson, data=occupationalStatus) mosaic(RC1, main="RC heterogeneous model", labeling_args = long.labels, legend=FALSE, gp=shading_Friendly, labeling=labeling_residuals) vcdExtra/demo/Wong2-3.R0000644000176200001440000001254013164013351014234 0ustar liggesusers# Wong2-3 Political views and support for women to work library(vcdExtra) # Data from Wong, R. (2010), Association Models, Los Angeles: Sage, Number 07-164 # Table 2.3A, from the General Social Survey, 1998-2000. # Questions: # polviews: Think of self as liberal or conservative # fefam: Better for men to work and women to tend home Freq<-c(39, 50, 18, 4, 140,178, 85, 23, 108,195, 97, 23, 238,598,363,111, 78,250,150, 55, 50,200,208, 74, 8, 29, 46, 21) polviews<- gl(7,4) fefam <- gl(4,1,length=28) # create better labels for levels in mosaic() ## but, this screws up parameter names: use set_labels instead #polviews <- factor(polviews, labels=c("Lib++", "2", "3", "Moderate", "5", "6", "Cons++")) #fefam <- factor(fefam, labels=c("Dis+", "Dis", "Agr", "Agr+")) # long.vnames <- list(set_varnames = c(polviews="Political views", fefam="Females should tend home")) long.lnames <- list(polviews = c("Lib++", "2", "3", "Moderate", "5", "6", "Cons++"), fefam = c("Dis+", "Dis", "Agr", "Agr+")) # numeric versions for U, R, C, RC models Rscore<-as.numeric(polviews) Cscore<-as.numeric(fefam) # make a data frame Wong23 <- data.frame(Freq, polviews, fefam, Rscore, Cscore) #################################### # do a correspondence analysis first, to see the row/category relations Wong23.xtab <- xtabs(Freq ~ polviews+fefam, data=Wong23) dimnames(Wong23.xtab) <- long.lnames library(ca) plot(ca(Wong23.xtab)) title(main="Political views and support for women to work", xlab="Dim 1 (90.8%)", ylab="Dim 2 (8.5%)") #################################### ## OK now, gives warning Wong23.O <- gnm(Freq~polviews+fefam, family=poisson, data=Wong23) # OK, with formula mosaic(Wong23.O, main=paste("Independence model", modFit(Wong23.O)), formula=~polviews+fefam, labeling_args=long.vnames, set_labels=long.lnames) #################################### # Uniform association model Wong23.U<-gnm(Freq~polviews+fefam+Rscore:Cscore,family=poisson,tolerance = 1e-12, data=Wong23) anova(Wong23.U) # OK, w/o formula mosaic(Wong23.U, main=paste("Uniform association", modFit(Wong23.U)), formula=~polviews+fefam, labeling_args=long.vnames, set_labels=long.lnames) # display standardized residuals mosaic(Wong23.U, formula=~polviews+fefam, main=paste("Uniform association", modFit(Wong23.U)), labeling_args=long.vnames, set_labels=long.lnames, residuals_type="rstandard", labeling=labeling_residuals, suppress=1) # compare with gp=shading_Friendly) mosaic(Wong23.U, formula=~polviews+fefam, main=paste("Uniform association", modFit(Wong23.U)), labeling_args=long.vnames, set_labels=long.lnames, residuals_type="rstandard", labeling=labeling_residuals, suppress=1, gp=shading_Friendly) #################################### # Model B - R: Row Effects Wong23.R<-gnm(Freq~polviews+fefam+Cscore:polviews,family=poisson, data=Wong23) anova(Wong23.R) mosaic(Wong23.R, formula=~polviews+fefam, main="Row effects model", labeling_args=long.vnames, set_labels=long.lnames, residuals_type="rstandard", labeling=labeling_residuals, suppress=1, gp=shading_Friendly) ##################################### # Model C - C: Column Effect Wong23.C<-gnm(Freq~polviews+fefam+Rscore:fefam,family=poisson, data=Wong23) anova(Wong23.C) mosaic(Wong23.C, formula=~polviews+fefam, main="Column effects model", labeling_args=long.vnames, set_labels=long.lnames, residuals_type="rstandard", labeling=labeling_residuals, suppress=1, gp=shading_Friendly) ##################################### # Model D - R+C: Row and Column Effect oldopt <- options(contrasts = c(factor="contr.treatment", ordered="contr.treatment")) Wong23.RplusC<-gnm(Freq~polviews+fefam+Rscore:Cscore+Cscore:polviews+Rscore:fefam, constrain=c(17,20),constrainTo=c(0,0), family=poisson,tolerance = 1e-12) anova(Wong23.RplusC) mosaic(Wong23.RplusC, formula=~polviews+fefam, main="Column effects model", labeling_args=long.vnames, set_labels=long.lnames, residuals_type="rstandard", labeling=labeling_residuals, suppress=1, gp=shading_Friendly) options(oldopt) ##################################### # Model E - RC: RC(1) model Wong23.RC1<-gnm(Freq~polviews+fefam+Mult(1,polviews,fefam), family=poisson,tolerance = 1e-12) mosaic(Wong23.RC1, formula=~polviews+fefam, main="RC(1) model", labeling_args=long.vnames, set_labels=long.lnames, residuals_type="rstandard", labeling=labeling_residuals, suppress=1, gp=shading_Friendly) ##################################### # LRstats the collection of models models <- list(Indep=Wong23.O, Uniform=Wong23.U, RowEff=Wong23.R, ColEff=Wong23.C, RplusC=Wong23.RplusC, RC1=Wong23.RC1) res <- lapply(models, residuals) boxplot(as.data.frame(res), main="Residuals from various models") aic <- t(as.data.frame(lapply(models, extractAIC))) colnames(aic) <- c("df", "AIC") aic # sort by df aic <- aic[order(aic[,1]),] plot(aic, type = "b", main="AIC plot") text(aic, labels=rownames(aic), pos=c(4,1,3,1,3,1)) ###################################### # compare models; they are not nested, so only some Chisq tests make sense anova(Wong23.O, Wong23.U, Wong23.R, Wong23.C, Wong23.RplusC, Wong23.RC1) anova(Wong23.O, Wong23.U, Wong23.R, Wong23.RplusC, test="Chisq") anova(Wong23.O, Wong23.U, Wong23.C, Wong23.RplusC, test="Chisq") vcdExtra/demo/00Index0000644000176200001440000000164213164013351014110 0ustar liggesusersmental-glm Mental health data: mosaics for glm() and gnm() models occStatus Occupational status data: Compare mosaic using expected= to mosaic.glm ucb-glm UCBAdmissions data: Conditional independence via loglm() and glm() vision-quasi VisualAcuity data: Quasi- and Symmetry models yaish-unidiff Yaish data: Unidiff model for 3-way table Wong2-3 Political views and support for women to work (U, R, C, R+C and RC(1) models) Wong3-1 Political views, support for women to work and national welfare spending (3-way, marginal, and conditional independence models) housing Visualize glm(), multinom() and polr() models from example(housing, package="MASS") mosaic3d-demo proof-of-concept for exploring 3D mosaic plots mosaic3d-hec 2D and 3D visualizations of HairEyeColor data yamaguchi-xie Yamaguchi data with models from Xie(1992) for homogeneous and log multiplicative layer effect models vcdExtra/demo/yamaguchi-xie.R0000644000176200001440000001345613164013351015641 0ustar liggesusers## Models for Yamaguchi (1987) data on social mobility in US, UK and Japan, following Xie (1992) ## These models reproduce the results in Table 1, appplied to the off-diagonal cells library(gnm) library(vcdExtra) data(Yamaguchi87) # create table form Yama.tab <- xtabs(Freq ~ Father + Son + Country, data=Yamaguchi87) # define labeling_args for convenient reuse in 3-way displays largs <- list(rot_labels=c(right=0), offset_varnames = c(right = 0.6), offset_labels = c(right = 0.2), set_varnames = c(Father="Father's status", Son="Son's status") ) # no association between F and S given country ('perfect mobility') # asserts same associations for all countries yamaNull <- gnm(Freq ~ (Father + Son) * Country, data=Yamaguchi87, family=poisson) LRstats(yamaNull) mosaic(yamaNull, ~Country + Son + Father, condvars="Country", labeling_args=largs, main="[FC][SC] Null [FS] association (perfect mobility)") ## same, with data in xtabs form #yamaNull <- gnm(Freq ~ (Father + Son) * Country, data=Yama.tab, family=poisson) #LRstats(yamaNull) #mosaic(yamaNull, ~Country + Son + Father, condvars="Country", # labeling_args=largs, # main="[FC][SC] Null [FS] association (perfect mobility)") # ignore diagonal cells, overall #yamaDiag0 <- gnm(Freq ~ (Father + Son) * Country + Diag(Father, Son), data=Yama.tab, family=poisson) #LRstats(yamaDiag0) # same, using update() yamaDiag0 <- update(yamaNull, ~ . + Diag(Father, Son)) LRstats(yamaDiag0) # ignore diagonal cells in each Country [Model NA in Xie(1992), Table 1] yamaDiag <- update(yamaNull, ~ . + Diag(Father, Son):Country) LRstats(yamaDiag) mosaic(yamaDiag, ~Country + Son + Father, condvars="Country", labeling_args=largs, gp=shading_Friendly, main="[FC][SC] Quasi perfect mobility, +Diag(F,S)") # fit models using integer scores for rows/cols Rscore <- as.numeric(Yamaguchi87$Father) Cscore <- as.numeric(Yamaguchi87$Son) # cross-nationally homogeneous row effect associations (Xie, model R_o) yamaRo <- update(yamaDiag, ~ . + Father:Cscore) LRstats(yamaRo) mosaic(yamaRo, ~Country + Son + Father, condvars="Country", labeling_args=largs, gp=shading_Friendly, main="Model Ro: homogeneous row effects, +Father:j ") # cross-nationally log multiplicative row effect associations (Xie, model R_x) yamaRx <- update(yamaDiag, ~ . + Mult(Father:Cscore, Exp(Country))) LRstats(yamaRx) # cross-nationally homogeneous col effect associations (Xie, model C_o) yamaCo <- update(yamaDiag, ~ . + Rscore:Son) LRstats(yamaCo) mosaic(yamaCo, ~Country + Son + Father, condvars="Country", labeling_args=largs, gp=shading_Friendly, main="Model Co: homogeneous col effects, +i:Son") # cross-nationally log multiplicative col effect associations (Xie, model C_x) yamaCx <- update(yamaDiag, ~ . + Mult(Rscore:Son, Exp(Country))) LRstats(yamaCx) # cross-nationally homogeneous row + col effect associations I (Xie, model (R+C)_o) yamaRpCo <- update(yamaDiag, ~ . + Father:Cscore + Rscore:Son) LRstats(yamaRpCo) mosaic(yamaRpCo, ~Country + Son + Father, condvars="Country", labeling_args=largs, gp=shading_Friendly, main="Model (R+C)o: homogeneous, F:j + i:S") # cross-nationally log multiplicative row + col effect associations I (Xie, model (R+C)_x) yamaRpCx <- update(yamaDiag, ~ . + Mult(Father:Cscore + Rscore:Son, Exp(Country))) LRstats(yamaRpCx) mosaic(yamaRpCx, ~Country + Son + Father, condvars="Country", labeling_args=largs, gp=shading_Friendly, main="Model (R+C)x: log multiplicative (Fj + iS) : Country") # cross-nationally homogeneous row and col effect associations II (Xie, model RC_o) yamaRCo <- update(yamaDiag, ~ . + Mult(Father,Son)) LRstats(yamaRCo) mosaic(yamaRCo, ~Country + Son + Father, condvars="Country", labeling_args=largs, gp=shading_Friendly, main="Model RCo: homogeneous RC(1)") # cross-nationally log multiplicative row and col effect associations II (Xie, model RC_x) yamaRCx <- update(yamaDiag, ~ . + Mult(Father,Son, Exp(Country))) LRstats(yamaRCx) mosaic(yamaRCx, ~Country + Son + Father, condvars="Country", labeling_args=largs, gp=shading_Friendly, main="Model RCx: log multiplicative RC(1) : Country") # cross-nationally homogeneous full two-way RxC association (Xie, model FI_o) yamaFIo <- update(yamaDiag, ~ . + Father:Son) LRstats(yamaFIo) # cross-nationally log multiplicative full two-way RxC association (Xie, model FI_x) yamaFIx <- update(yamaDiag, ~ . + Mult(Father:Son, Exp(Country))) LRstats(yamaFIx) # compare models models <- glmlist(yamaNull, yamaDiag, yamaRo, yamaRx, yamaCo, yamaCx, yamaRpCo, yamaRpCx, yamaRCo, yamaRCx, yamaFIo, yamaFIx) LRstats(models) # extract models sumaries, consider as factorial of RC model by layer model BIC <- matrix(LRstats(models)$BIC[-(1:2)], 5, 2, byrow=TRUE) dimnames(BIC) <- list("Father-Son model" = c("row eff", "col eff", "row+col", "RC(1)", "R:C"), "Country model" = c("homogeneous", "log multiplicative")) BIC matplot(BIC, type='b', xlab="Father-Son model", xaxt='n', pch=15:16, cex=1.5, cex.lab=1.5, main="Yamaguchi-Xie models: R:C model by Layer model Summary") axis(side=1, at=1:nrow(BIC), labels=rownames(BIC), cex.axis=1.2) text(5, BIC[5,], colnames(BIC), pos=2, col=1:2, cex=1.2) text(5, max(BIC[5,])+10, "Country model", pos=2, cex=1.3) AIC <- matrix(LRstats(models)$AIC[-(1:2)], 5, 2, byrow=TRUE) dimnames(AIC) <- list("Father-Son model" = c("row eff", "col eff", "row+col", "RC(1)", "R:C"), "Country model" = c("homogeneous", "log multiplicative")) AIC matplot(AIC, type='b', xlab="Father-Son model", xaxt='n', pch=15:16, cex=1.5, cex.lab=1.5, main="Yamaguchi-Xie models: R:C model by Layer model Summary") axis(side=1, at=1:nrow(AIC), labels=rownames(AIC), cex.axis=1.2) text(5, AIC[5,], colnames(AIC), pos=2, col=1:2, cex=1.2) text(5, max(AIC[5,])+10, "Country model", pos=2, cex=1.3) vcdExtra/README.md0000644000176200001440000000623714202240422013311 0ustar liggesusers [![CRAN_Status_Badge](http://www.r-pkg.org/badges/version/vcdExtra)](https://cran.r-project.org/package=vcdExtra) [![](http://cranlogs.r-pkg.org/badges/grand-total/vcdExtra)](https://cran.r-project.org/package=vcdExtra) [![Rdoc](http://www.rdocumentation.org/badges/version/vcdExtra)](https://www.rdocumentation.org/packages/vcdExtra) [![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) # vcdExtra ## Extensions and additions to vcd: Visualizing Categorical Data Version 0.7-6 This package provides additional data sets, documentation, and a few functions designed to extend the [vcd](https://CRAN.R-project.org/package=vcd) package for *Visualizing Categorical Data* and the [gnm](https://CRAN.R-project.org/package=gnm) package for *Generalized Nonlinear Models*. In particular, `vcdExtra` extends mosaic, assoc and sieve plots from vcd to handle `glm()` and `gnm()` models and adds a 3D version in `mosaic3d()`. `vcdExtra` is now a support package for the book [*Discrete Data Analysis with R*](http://ddar.datavis.ca) by Michael Friendly and David Meyer. ### Details The main purpose of this package is to serve as a sandbox for introducing extensions of mosaic plots and related graphical methods that apply to loglinear models fitted using `glm()` and related, generalized nonlinear models fitted with `gnm()` in the gnm package. A related purpose is to fill in some holes in the analysis of categorical data in R, not provided in base R, vcd, or other commonly used packages. * The method `mosaic.glm()` extends the `mosaic.loglm()` method in the vcd package to this wider class of models. This method also works for the generalized nonlinear models fit with the gnm package, including models for square tables and models with multiplicative associations. * `mosaic3d()` introduces a 3D generalization of mosaic displays using the [rgl](https://CRAN.R-project.org/package=rgl) package. * A new class, `glmlist`, is introduced for working with collections of glm objects, e.g., `Kway()` for fitting all K-way models from a basic marginal model, and `LRstats()` for brief statistical summaries of goodness-of-fit for a collection of models. * For square tables with ordered factors, `Crossings()` supplements the specification of terms in model formulas using `Symm()`, `Diag()`, `Topo(),` etc. in the [gnm](https://CRAN.R-project.org/package=gnm) package. * In addition, there are many new data sets, a tutorial vignette, _Working with categorical data with R and the vcd package_, `vignette("vcd-tutorial", package = "vcdExtra")`, and a few useful utility functions for manipulating categorical data sets and working with models for categorical data. ## Installation Get the released version from CRAN: install.packages("vcdExtra") The development version can be installed to your R library directly from this repo via: if (!require(remotes)) install.packages("remotes") remotes::install_github("friendly/vcdExtra") vcdExtra/data/0000755000176200001440000000000013164013351012740 5ustar liggesusersvcdExtra/data/Titanicp.rda0000644000176200001440000000743614202474403015220 0ustar liggesusersBZh91AY&SYW,tU\^]X?ؘP0 RPY`!! 1""!L Dɡ0LHhh= Mh4dҪTPTTP&L4h0d@ dA`#L00Ɉ  IQ$4F')AR #!h !aM(dh di4d 4iGFC@&MOU_Ȫ+_,h* ص@RVVJ%I*C_g<:<$BEY 2ͿwY P_IP3rb;w<>ύm _:xWCfZ8|YҢ}}G-,'-h[]Npcc5]AQS5E4H~jU-eM3 'EkXo6 (KAdC#⚷^HqsՅ->RK a7ʗ\yU[AZ\%~ǡfAX햔qUt-ŲuԨ۶-3V\MYߒJLW)MY&bea#n=@3:q;&ܴ%nO;ݶҺԌ2%.1XsԷfƛcS4Q:bvLv #n$|բԣ ){XQ[{9޴l7qm [5s ѺwH7s?^H0}rve\b%(+rL矂ڟd`^mRgOH.TNʠʥ T̬ʼԤ`ܺ+(b.ߝ7GH.*tDh1 hBP-q E}ruU]V ecUUP`@]EZΛ\S!1 ߋoC칰<$;𞎇Q,pLLFe 0-rfblIąpc\ , 5UA{ǁC"HhDm+F$E2hYR!Y2XآKE#,$ db,ɐIE$lbb2!)4S6P!Mb"`06&D hY (&Ħ"fD2B$b$DDa(AfLD) &Q &PHL!I&ZJ( &̂"RJ&Y1B$S^5,Afb0Ș)$K @5$R3"M$& "Mf"R)E$l R$hĠ20LJ1I&&"Fш6SIK#HRFDSF̲L)0& "(32#A%Dh %)bM(ĄaEdYI% $ J%IF-%Dd 2IE3$@(l<Hi|Hl̐LL$DPsI :M! f! qgәk=МhZ-k[E֋ZѾ  o 73333 33332q3333 {UUUUTwѿ-*gHV@ ;d)$  @ aL@H@=6'c>e{i X PoBaĄD|wDDz-hpZ1c-h Zь1kF0b֌`ŭ^hEҪ6lٳf͛68pÇ`BBBBBBBBBAκ뮺xjAi i i i i i i i nu]u]wBBBBBBBBBC[u]u]UU@{||||||/{mkDms9sϟsӻϞsӻϞsӻϞsӻϞsӻϞsӻϞsӻϞsӻϞsӻ8""""""""3x!B cfffffMq{{CFjdnZFjdnZm֍뮺ٙfFjdnZFjdnZFUUbhss9sY88yFjdnZFjdnZ+M*FZ5s9 m88-dnZFjdnZFjdnZ9dK<f}'\#wt3OXnGzڙvݾOׁ 糛u 0D@7\ `FclCd %kJYK:sHH47#K $+s<&y(sl97پ5:;L,^Vs 7;4'3Nvs#hWg[ri;]$CD46&,}[sG3h84{/X8߉׬1#0IC "e՚i!OLw}'1!E;vQIvF:IE]Xll=VM^*Oͼ; LFXQTQaR(P  +j]&PˋJֱaRBEX*ڵ P-ūkZ)YVjT72!E+aX/̳ ʬ*ĴXR,+r\9aX(QabZ%b0mljR6bմ}8E"BT+֬ e[Ae-ƶ6E[dUjbVXDEEBm*/ (6ׇFRQ D`d "HE >+ySg}ާ `[:,tRVGȽDt>5N /( ǽmNޢy=^2BZqLr_9u;[ZR(*1EF-Q%Z+KYeJmUV%lRL8kJVDQUJǃϤy籧OӳoSoP圚I9ePZ>/h~jҦgC )[f`IwcN$k:lcC(qI$gxw$S {@vcdExtra/data/Hoyt.rda0000644000176200001440000000115114202474403014354 0ustar liggesusersu]kA%^xQDDD~/CIMm/f&i7bE??^ .BsΜ3ɜ~)8Ĝv)3m.N=SؿW'&c9ߺ5x~Xxnſ }ö'9{Pt&یo|\u׌_/̿*{nk&_)zN:5_L wPA{橏/o.u>W?;5O}:{?Azsu_Su)oR~v Gz=K^=SκMeCqxȺGtmW,C_UYsW]U)Ml}}~m-uq[6sO$#o$sxy- àζ~Zg+`4~%Mta=^2cS2d,X,cE}dIo{20[a}ζb/>KdbW|Ńhm Ί~荥 ^' 6g$vcdExtra/data/Heart.rda0000644000176200001440000000036314202474403014500 0ustar liggesusers r0b```b`adb`b2Y# 'fHM,*a``rx0C]BmP /Cˤ T P,gNR &؍̌,/17(- U+X%858eKES⛘gsK *ay90+32KRa|vR0-B1 9ly)E0ɥ@?tsaFK.+ vcdExtra/data/Hauser79.RData0000644000176200001440000000050714202474403015271 0ustar liggesusers r0b```b`adb`b2Y# 'H,-N-2d`` y$X HX b(naI-K)Q?_'f-3}*reMI, ,-1$et̄3c,X0+&9?< 3 @r& n0@Pu :n=:>@;@.Y:j^>}+A\|%T,BWC3u :hKME+3,`!XZB48`Ss˕XV xcvcdExtra/data/Caesar.rda0000644000176200001440000000037214202474403014633 0ustar liggesusersP 0>"88>Vtqc.W{)}w_.QeW<ǀ9H9-ʈ8uT-<t`ɧsDŽ &>W=a鋯k:.8K?"]V-.2R*;CKHe%zʖ?Ek<9)Y^"h3ZgթALZ#WO82q  xZUvcdExtra/data/Vote1980.RData0000644000176200001440000000052314202474403015117 0ustar liggesusersN0IڨHXPEL :@+uR +9^J*P"r9w3YL8qps`]mhry̘;(B܁U _~rdN_VaUIԋQwXFVPڄvr" uM^9#c'$NI8'qQsAXe(*,ӿL꟫8<W8v#êG{;`.OU*NEadDg4S&v-q-5,nz5mH;܊ak¹r(YohvcdExtra/data/AirCrash.RData0000644000176200001440000000477414202474403015370 0ustar liggesusers{po6l. DPQҪ V*Njm6$CMRPtұDQö>;":z/sE:$3'9uι{~dR(O~z*U4]w4+U=B5N~ꧏJUO0yIUD}7iVn@p\3kWWξ|U`z{S\l_tUK*olR[> ә6=ꓠܙ3X}%]̕9\nc%o BjQ}[li{® ;!Y.Ql.ګVO'1v`jW0r`o͂s`JgsyNӂ"/< >&b zԊ<]2J`OnC[ς/{o>z)"s$x؁ykv-O^]'&O?'>lL׃-|S77G-pCƥ_>>?\ =i Wq#GFc_.FNF ܈|[9%0iN}/# >GK.xMqůQ}+x"p:~k?Fg#O8W/oK䉳OO'&F?> vQe'9Ʌ 2S_>EI{i?*| yl %ӻ7#|+|fH||CفgS l}ȹϒG"ϑrac_s?.&x? O]^ 9$|s{7w<<&ĎJT_,4ƼOyW§ɧJU̓h|F0H7<)^(ny+#D,i^ne1{?ty%9Ey-EL_ Oڻy=:#{ٷ3؉#q 5~]b@8wCq?oH>,wzgu|}+eÑG@ꑨBxKz$6UAZ( K#!UK{lxJP$ {DA0=' z9x$=E]~+VOS'C! Aav`n,H@?$|%L|cNA X/"ux荋7Qsz3v!W8u I|%k"OQgtOoE/ӣsOW0 <=5 η]]c u[ɇ@zygc[r_f \+,za?ǰg/nw?Z;TW ϻis5K&3qyi39=P'dؔWv}ɬgfƘ}8sΣ1\Xfi_|c%/Φm.5f\ 1p(}I@Muc"3cLѾAn8c8 d 3fcja:|=~b:fǛ{X>TÜ>L'ME>g0NBfZbb-%e-)M[ŭC>MLaw2V_mXskm>7q{g4%1g5}Cf/պ@?CV=:1o*}f{?mAg1(Ϝ[S=wjCK6x}J$WXo$FR>h03:ftc{4/UrNL74NI1}Xw1իRL*LSf"~Z}aЋ4JhQO1}3k̓l-{ڦ&M!1_yTLd4z\$oU<1Wo%h@jE&U>76K%369\Ѡ=Ƙ:I{迍3-o<[۪sspҐ.|{cd@5.|/;k,dŖ{_8ye(Sk9)_ *:tǡg%z}bv8JTr6}R*T)C{\Tο>v~pSЋzEйv/>rƺf#1N?dL:<%1U)>6C|,;׬3=^`t霅&O'{ߩUCN{Ơ*,򹫜JA!Jfuɺ?:Tokw:5]w< ֖=֛J_M!K53fܡ8q|d;{Fw+vcdExtra/data/WorkerSat.RData0000644000176200001440000000037714202474403015610 0ustar liggesusersR0 5i?|++n8X 5-0c&K$g;KtNC0`kL 5j`%5q"ctSm[SʠFJr`ѽsGS1)yXkj[*&ͤfemyߥ &S0?\ձ߸e%֣O/k:dR AYhIhs2-PL'ު9}ѤL7*. DEfPevLٵ* ,-9Vq^OF.8Yӭ;.vcdExtra/data/Mammograms.RData0000644000176200001440000000030614202474403015757 0ustar liggesusers r0b```b`adb`b2Y# 'MO/J-*882f@*PZJ@h8́PZ&B\ PQp%概 U'VgsL*N+}32ss`}SRKRaSRRb+YN3)(5kdavcdExtra/data/PhdPubs.RData0000644000176200001440000000364314202474403015233 0ustar liggesusersBZh91AY&SY Pߛ@?ހ@ _{mRNhiԢIb&L@& & =@A4h4h"hhhhM"&4d8ɓF!hbh& da4id50@@$\itCPҴ!32&$`Iko=cqӥN cnM8撚pL17 P6G.9Zi鷨2 hAA H'U,{ο 'q8H"F`QE!HjFT@QjBJmY[r5 s2(U(R($x,DM&Z&k2rXv\d~vq$O'×~m;[!W65\tPusip!]ҪTP `]-ؠ'EByLtv-Gc*-Z-`2[gM+RaԊ\ЬivGd,vlf9|_%4g%x? DHZMu#Oyp Q&ƚA5;"ԲFi6A(jVdk&k)aq!䌠NDIӌxs0i 4UZh1,эi0 bҶ0NESI"Ks`1ڣ}i:]Ց2E(--iDL}թÌZDHI1bnhjMt p"IJH&-ӑEv%G)"ۑxеm(1ww^VN}51! 4I5bnz!UƢ j ,R6_9E Zͷnj8&߃kڎ03;I[>O+?xn]N} 9vg3Ʃ$0qnv.m`Z(ۦ\+Ίlҵs0 pDGX5ѠwWF۱{k5K$irNԤzꫫQXa$ Ԝ dsxܰկDT:O8'ɧe9ap-L~8r֓S}CwT,Ϻdm24nl\Ivu`0`7]A0W+K gAɽpyo`kŸԼ^Ai78 {yw<;UW01*֕s"u]dPH'ЂJ?nBl 64p舙BI{TR+mJDQTfe#C_aC51 Tʺ6\X\b΅9jiibR/%♙tc4[Lkk"zljIbq LIW$mزLL؜oe*Lw(*n]faXX /+b-k8-b٨x L@)X&dLX0EUDjIEEAʱE#nq&Tc`ɮ:L]lWiE9 Nj4Rm*"T-7*)q+ sc C0yQ-V,P2\\R( Jդ*#Ffq%]qh\Irʈ[jSܱJ+~ *F<$`#5[8!+LLF6TMfkv6bŧ-+NH@s-U$P(97+ٺB(-iMjD!BV*hTAM RMR@H*D4Vb&  0(2 Lu@9 (w^^VD_!^p8݃2HGӧWA>z"(H_zvcdExtra/data/DaytonSurvey.RData0000644000176200001440000000056614202474403016343 0ustar liggesusersTKN0: DYAE!ؔЀSTbQ8 GIHZ5| ^͌<{nvii M=&|x1c:e̕!˸Z]Fǔ*Q$ܠ8>X3}.53lfEi+_e-+r܀FȨMM?Md&ZÓu4fɛA6[^{*~g?\g/*Q(<+U؆J3ĈUޢIyk|>LG(»Q41}-&/DG#aSIG'ͺd畦;l`@H 8g3vcdExtra/data/JobSat.rda0000644000176200001440000000036314202474403014617 0ustar liggesusers] 0i ADAAD;8.5m#{ŷ cM 5_NNNݼ4Y!@ \?0YݧGAnP[ײ_ܱ3dNeN W̒RG%1PI{ž.zҙ?j ?>c'vBDLa㘆NeOϒe'A3I ]i x AD3USP?b 71vcdExtra/data/Heckman.rda0000644000176200001440000000040214202474403014775 0ustar liggesusers r0b```b`adb`b2Y# 'fHMMc``r036 Z gPJBi4ҮPP큚`f~ (n 49wXu)J0d)^ fe"FQTZ ȳF%!&| if-KI8nV`!2cf̱@mHI,,ILIf +vcdExtra/data/Cancer.rda0000644000176200001440000000033214202474403014624 0ustar liggesusers]P= 0=Z ';YkqrC :KI=H}+-Q KrP@QT3o4Xo6cf."ֳ&*] E/u/e~]=̑FW *I7Nئc +q~-)뱦aϪ8v֚TaE?ȤvcdExtra/data/Abortion.rda0000644000176200001440000000032714202474403015212 0ustar liggesusers r0b```b`adb`b2Y# 'pL/*c``R@!B':@:Nj1Pu TS2s/ v:,/17(% U+q6X-571'cQU0Xhȓ@~hVB`NY\XR /\ZP xD1C719'f"\$1  ,vcdExtra/data/Detergent.rda0000644000176200001440000000044014202474403015352 0ustar liggesusers]RKK@fG#GD ŶZ_Oem5ldw4D7#3K^zEl*e@Hh{,Q;!,ƛo?y|{t~3c;h$wzqKxCj%'8lI_e{A(M:ᔨ& tճIfţ7~(6Xw[4©|(ffk[|l5ZaDkvcdExtra/data/Vietnam.rda0000644000176200001440000000054514202474403015042 0ustar liggesusers͓K@/wKRt7視 KuA@W=dp}Q#g2 Hq dU{1Q7)eDtA-N? $ҧ&]S5e ~)Cz%ٶx: ٙOR-Rrߨxb$Ȉ&XIMR?!KbDƷ{kNw뮂z̃e "wv:W;^ xp<;'p &7}=tMkOR\O 'm&-axQrUq}nǗ`vcdExtra/data/Bartlett.rda0000644000176200001440000000032314202474403015212 0ustar liggesusers r0b```b`adb`b2Y# 'pJ,*I-)a``@!G =T>K@59%3H`g13sSRPgYs2R4~P&[pAQf^:|Դ4'BbjoHf.據^dC7'9'f\$1)'7|vcdExtra/data/Accident.RData0000644000176200001440000000107614202474403015376 0ustar liggesusersUn@=;zYC (%r]#HAъD[@hƞ ^[xPBHTQ!:J$>,DZǰ (w>ff @@/ .)AGrnj=Āvrr> A/ DAφ/JKmFwQͶ3\Znm'lkJI@;]Yd0d$=U~q0Dmh>λ^i+ r-mJ::jQgNYWoIg|]u}\H"F'qvbOm_WhȎ3%_p'Dy2wm#Ɵzc5|$jS Rd;ʷeNufݳ#ZIN'q([\C:/y?9]xȵ&{]51"qqS kO0{n2} F qF$ اʫG`m&e&p:gYRz̒ $F$ FI?!O} 2.מ4c䲝8؈YDzjxm5`N ֤a)5FY$ Jܨy)Ob ՉFjw1 [ dYLB;]*jFC;c(mm"[9V{)J|ulikKE&3er) V "df*WrFikO`aIv BKJ 7[+͐kd$as]xsmL_x.B>f"Wo0mFaȷ=i"9I6FY}\:6'O;wt-6wȫKK{BcTqq2MRxOTx!'B5\̃ 3o=9|p.gV=6rJtyŐ#\C (*=Kƭ}d niJ#JZ :Q`wy!LT{ZF8b'®N!M<'~a0Sjv}%y xEUN2<!K@ $= ]6롌Rۏs6\԰l$VrcF(VRT\6Q!<1 8{'݄G.=_ƪ?T2KKh.Zi@@ c 1?zo T0)Tp5[OXWLjAG1IZ|Ĺz?'BD #jCjӍ;3+lq!%N$ۉU"jU ==+*HCf5\UɰP I#o4 74D`CN L"!h( j^" %α@o"Ie+,ԡc @{DLJ Ҍ`D(Z]Q mDL  AZQ 10+ ?PHZQ+Qr%hB-DلZb@T/O&XPI,Z8zx Ʉk@68ŵ` :# A xhX3R;I)KU*!o*zPC`<+:3XXEH t`5pp0AE9 p <4 j4s5 R)q#'f/y3qRrQ)`C0!4&&Ia&J%(R(RHmj7Gqqp6BlA$w$S  vcdExtra/data/Yamaguchi87.RData0000644000176200001440000000101614202474403015744 0ustar liggesusers픿K#A͉;J 6#"!1\Mƍ?C\#ڈ)-,lK+O8BNHu\w|g2p8fiҘW3Xd,/B=TgL>|)9,_{Jk%k*-SR Ryrݬzi:\}|/+[oEwl!{C = ?2ZS+O#h:Ah;/T ^啿9= s?+bd!posJ\k7Ή#/,%ql8oǸ#4"XwO(=#\٭vO&7hNRtsy 5f% MZ}Y_9W*{ j* ,\$KV 'g}]}[6:de&21@jxэUtcŕ .p JvcdExtra/data/Donner.RData0000644000176200001440000000273614202474403015115 0ustar liggesusersWoE_I'v|@JE**D>Zu'&$^ycf \rH *› ,=y޼ٽvkSdLq, gxl8EcgS^ELטIƟCES(oFSChmD|f6|ʱ6P+a|6v<ϓ$l^%أtd5i(<Ϳ4i9gOYÎC<븃|,&{%sRrYqRrFO2)lY[0i>KƳGKѓcgzC6/?O?8/kxөrwnuc=g0}1{x_߻|C\7~NMOΟ{n?姯R5~ƘG<85?Q{x-S??Mۗgׇ3y^~7~TV=iv~Z#'F} vpkՉ)wx:/GrhW6\?!ay{2!51ZCTEhi-~%݇2 "^ -wE\sQisN"#’kشH+ P P Ek-Ku+ԶTÑzɒXiң.-D}Ta CW3kGG\/x;u5B'gC% /t-%9<&Te~D 78rHQ.5ld6Z(-Z^cԓ&:o["{f>MsP/2W_|C% 3G*cj #d2F,IдUpSq`6f,a2sNJ{{^p܊L*$VT9KJ<[%Ҩ׌/A]Y|PvVj!ڄtA3SCqN|6-M~-MW)`-$Z9M^">`V9>(?t΁*2ԯjkÃV^V'eu[+r yUe7Av Ks:~it|b虈}jM9x 46zIpj emWs"q%y h BhFlsCܕI#5s\oiirz3B=8h="Tf]/n/zR\̛E{ۤYA"].݄\A*R-E oP%>o^|vcdExtra/data/Dyke.rda0000644000176200001440000000042714202474403014332 0ustar liggesusers r0b```b`adb`b2Y# 'Rd+82CpB@i-'6@ PZU = :! J;B}td;eH@ik(mhaÜ xE9Py^bnj1PJG)0v@~~<_>H!4Dq3+`PANԔT{PjbJf^:LS3'5hT_jyqAbA*{ЭKI,Y,ILIfcrvcdExtra/data/ShakeWords.RData0000644000176200001440000000104314202474403015730 0ustar liggesusersuOSQ#VaKSPB# 2KkƂV̴kժUz^@/E˖E_{n3ݩŇs O6Y ~|r:ҡ||^n(չכTj'ޔ5ta b;doznA}؏8^aAGq чIp 80`g1s<q#1K.c3#Y!+Ha 4!E\n&apyp+U}Pٖ_%oO|Uی7al|M:O:q2sE[{~ArlSsJ.I?+Rg(uZ2%uΓrzVrD{nJrXrªMRrR3gGL2"j?  [{{^?{!pH9,՞W7gVw2b6ۏ5Kzo__z6ewӍ٧LvcdExtra/data/Toxaemia.RData0000644000176200001440000000063614202474403015434 0ustar liggesusers唿JA.jB 䌅 H@TD-E %nL0MF|}_rBب;nry; $LHKaEQā)U,1#kp!B G/}u*5ί~HkakEF@H"kg,MΘڿ +^emکE'oG]N mڮ^nK 4O1I904->HyzQh#uü5$nD#6{EPzgF\/ 8nA;~}0Σ>;COlpʪ OU3j/\%tywuI3Inx=#Yɢ-Z\UvcdExtra/data/Vietnam.RData0000644000176200001440000000051214202474403015261 0ustar liggesusers͓N0ۥ4 T11l@Ս Yŕ쨔!ʛ4 ɹ"ʔN|g7؋1c3qxDLbR3&*ϔzR9R':Pka˷}=V3i| a7V*KF_/p&P +Lvqw΢(7#2vcdExtra/data/Depends.RData0000644000176200001440000000031614202474403015242 0ustar liggesusers r0b```b`adb`b2Y# 'fwI-HK)f``r-Vg k-Pe9kf#+0 LhF3d)^hit^bn*j&a:<ac0 a c0a e0Ype g`C1bt%I9 `4vcdExtra/data/Glass.RData0000644000176200001440000000047314202474403014735 0ustar liggesusersN0.B0!Htʀ(HZ" v(b);3EIHÆ>;9wB(%!K@8=%#.[D\+?&h71Ȍ0 Y.w@hq.m*,YHR'ers{- uVt?S/U'$lT{h4;`PmRnM0V|\ V ,G[ozV7>mT-d"kBZ_1gO7"5ȚVSXȼјb!c 6a n^=t0R0"Nn-=c1bzlI\u'c0 EpqWq]d~&`:˰؆}83[xx"q:;1sA8Sxoooooooooooooooooo0O?AOz&ۨ\zI&de]Xp]8>/`sNг?mx8vs=7{uϺw{kt}եw{f=~^˧7gkΩMLeU2 k/l KgrU=)K<std/9vcdExtra/data/Mobility.rda0000644000176200001440000000042514202474403015224 0ustar liggesusers r0b```b`adb`b2Y# 'O,d``%I0C.z[. mT]?[@hP nk3j_:*_ / PL=͟)@ @%y@%Pu`uP<<'Z& Q,nE1PO-b ''$dÌtK,H-B``n^rNb1<`IbRN*D5? WhvcdExtra/data/Gilby.rda0000644000176200001440000000046314202474403014504 0ustar liggesusers]Q=O0&B% L ``%(СMj:nT~%{V`6e=$qՊsl5 /%|"~mynB ? 1QVq~.ݪ߲ТؒkoT{m•œ<3⃓<Ꝫp)I^2.Mq;aol.]Dw]T \4z#a&YNR-nvJBdzҕkx"KM;k'f/\ԟfvcdExtra/data/Mice.RData0000644000176200001440000000044614202474403014541 0ustar liggesusersn0/vC(#R0vX*NV0)XtӞHD".u9UK@(CBdM { Ch16v9_|J3ydSwN5A4D6ç+)Cxb1!!d_OS53LH##$Al.7-Cc|"jE͒NȧWwV7uXvfx{MοܚZ>٧)xHE*CvcdExtra/data/Geissler.RData0000644000176200001440000000110214202474403015427 0ustar liggesusersVOa~zq&`D  )B)C4api\ԁF\X q!7H 9K{K>}۷{n'P$SE*9Ы% #'lnp?$]S )@?PC@%Qe;o5K4+ 8$ZW_(qbr/uR+6Yϧ˵\?6.w-uR)6qnZw^=G-ޯR@on}ZwzX^ <_vvqe9.o6943}cLϞoss]`;p%Lm;x]jY5/f\lGo_o;M}Է١jv#0:cj0빸v,gO|P~8foӣ6yCH #zb}ġx_N&ҚI[ha ƓzʾPfڔ3T°ً'DtLAgfv] gC6}K:0+q vcdExtra/data/TV.rda0000644000176200001440000000107514202474403013767 0ustar liggesusers]]QyfG\pkf.b]Xˎ535P\)r#B)\"AGhSHH~Ϟg}?<,lk5xƷߴ,3oΓ4=\›p e^xs?]E'j){xw{3=xka(I-l&Ps%98w@^mpnG /;}`#P ` a*ֳ N/kzEZI_C.vwrݩZ^g/s}rF{7Uw^=u=w=F^r:w'V^.ةx7[wax߃^kPs2 m.nHKV/CCsG|JпEGA--+B9nZ56nZX-M]t:3+l,?FL:Z L|+I;5?]s0ث6quX~P,N͕꠾Qj޶cvcdExtra/data/Burt.RData0000644000176200001440000000052614202474403014577 0ustar liggesusersTN0: HH,b`@ bƥgAyrA6%|n8c!tn..p6)h9vӨy%21ƪ䝡x{ Mu*ߜC_aBW3YXa,xW~J2dkZ& _h柴"l# J 8x5)m;{Tv[>n[+UW[G0-HG7qHw4ꅒURΊݥwϴdYujO._ПOvcdExtra/data/HairEyePlace.RData0000644000176200001440000000052514202474403016155 0ustar liggesusers r0b```b`adb`b2Y# 'H,rL ILN*i8$0Ck.-P3ҡPJ)@&ݓ+ t4Ԝt(]yj9P fԼP-Qw@x*T]]?\ R9 ҽP9OQP0@J3d)^$Ĭ (AUTZ ȳ8唦B٬>%PojJfi.LKbQ6T++L 05 `0A93K2Ra.vLJ-JIMC +`0{ f9ДPvcdExtra/data/HospVisits.RData0000644000176200001440000000033014202474403015767 0ustar liggesusers r0b```b`adb`b2Y# '/.,,)f``p:60VPZ JAi(&\ v (J8JsSNaȳ$VZXWaK-K-Blk 745h9j;X?L wpxS2DmL 4hcDh=FhhhzL@ graphics:::mosaicplot plot(Draft1970table, shade=TRUE) mosaic(Draft1970table, gp=shading_Friendly) # correspondence analysis if(require(ca)) { ca(Draft1970table) plot(ca(Draft1970table)) } # convert to a frequency data frame with ordered factors Draft1970df <- as.data.frame(Draft1970table) Draft1970df <- within(Draft1970df, { Month <- ordered(Month) Risk <- ordered(Risk, levels=rev(levels(Risk))) }) str(Draft1970df) # similar model, as a Poisson GLM indep <- glm(Freq ~ Month + Risk, family = poisson, data = Draft1970df) mosaic(indep, residuals_type="rstandard", gp=shading_Friendly) # numeric scores for tests of ordinal factors Cscore <- as.numeric(Draft1970df$Risk) Rscore <- as.numeric(Draft1970df$Month) # linear x linear association between Month and Risk linlin <- glm(Freq ~ Month + Risk + Rscore:Cscore, family = poisson, data = Draft1970df) # compare models anova(indep, linlin, test="Chisq") mosaic(linlin, residuals_type="rstandard", gp=shading_Friendly) } \keyword{datasets} vcdExtra/man/print.Kappa.Rd0000644000176200001440000000235113164013351015261 0ustar liggesusers\name{print.Kappa} \alias{print.Kappa} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Print Kappa } \description{ This is a replacement for the \code{print.Kappa} method in \code{vcd}, adding display of \code{z} values to the \code{vcd} version and optional confidence intervals. } \usage{ \method{print}{Kappa}(x, digits=max(getOption("digits") - 3, 3), CI=FALSE, level=0.95, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A Kappa object} \item{digits}{number of digits to print} \item{CI}{Include confidence intervals in the display?} \item{level}{confidence level} \item{\dots}{ Other arguments } } %\details{ % ~~ If necessary, more details than the description above ~~ %} \value{ Returns the Kappa object, invisibly. } %\references{ ~put references to the literature/web site here ~ } \author{ Michael Friendly} \seealso{ \code{\link[vcd]{confint.Kappa}} } \examples{ data("SexualFun") Kappa(SexualFun) print(Kappa(SexualFun), CI=TRUE) # stratified 3-way table apply(MSPatients, 3, Kappa) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{htest} \keyword{category} vcdExtra/man/Donner.Rd0000644000176200001440000000742014003052406014316 0ustar liggesusers\name{Donner} \alias{Donner} \docType{data} \title{ Survival in the Donner Party } \description{ This data frame contains information on the members of the Donner Party, a group of people who attempted to migrate to California in 1846. They were trapped by an early blizzard on the eastern side of the Sierra Nevada mountains, and before they could be rescued, nearly half of the party had died. What factors affected who lived and who died? } \usage{data(Donner)} \format{ A data frame with 90 observations on the following 5 variables. \describe{ \item{\code{family}}{family name, a factor with 10 levels } \item{\code{age}}{age of person, a numeric vector} \item{\code{sex}}{a factor with levels \code{Female} \code{Male}} \item{\code{survived}}{a numeric vector, 0 or 1} \item{\code{death}}{date of death for those who died before rescue, a POSIXct} } } \details{ This data frame uses the person's name as row labels. \code{family} reflects a recoding of the last names of individuals to reduce the number of factor levels. The main families in the Donner party were: Donner, Graves, Breen and Reed. The families of Murphy, Foster and Pike are grouped as \code{'MurFosPik'}, those of Fosdick and Wolfinger are coded as \code{'FosdWolf'}, and all others as \code{'Other'}. } \source{ D. K. Grayson, 1990, "Donner party deaths: A demographic assessment", \emph{J. Anthropological Research}, \bold{46}, 223-242. Johnson, K. (1996). \emph{Unfortunate Emigrants: Narratives of the Donner Party}. Logan, UT: Utah State University Press. Additions, and dates of death from \url{http://user.xmission.com/~octa/DonnerParty/Roster.htm}. } \references{ Ramsey, F.L. and Schafer, D.W. (2002). \emph{The Statistical Sleuth: A Course in Methods of Data Analysis}, (2nd ed), Duxbury. Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. } \seealso{ \code{donner} in \pkg{alr3}, \code{\link[Sleuth2]{case2001}} in \pkg{Sleuth2}(adults only) provide similar data sets. } \examples{ # conditional density plots op <- par(mfrow=c(1,2), cex.lab=1.5) cdplot(factor(survived) ~ age, subset=sex=='Male', data=Donner, main="Donner party: Males", ylevels=2:1, ylab="Survived", yaxlabels=c("yes", "no")) with(Donner, rug(jitter(age[sex=="Male"]), col="white", quiet=TRUE)) cdplot(factor(survived) ~ age, subset=sex=='Female', data=Donner, main="Donner party: Females", ylevels=2:1, ylab="Survived", yaxlabels=c("yes", "no")) with(Donner, rug(jitter(age[sex=="Female"]), col="white", quiet=TRUE)) par(op) # fit some models (mod1 <- glm(survived ~ age + sex, data=Donner, family=binomial)) (mod2 <- glm(survived ~ age * sex, data=Donner, family=binomial)) anova(mod2, test="Chisq") (mod3 <- glm(survived ~ poly(age,2) * sex, data=Donner, family=binomial)) anova(mod3, test="Chisq") LRstats(glmlist(mod1, mod2, mod3)) # plot fitted probabilities from mod2 and mod3 # idea from: http://www.ling.upenn.edu/~joseff/rstudy/summer2010_ggplot2_intro.html library(ggplot2) # separate linear fits on age for M/F ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ x, alpha = 0.2, size=2, aes(fill = sex)) # separate quadratics ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ poly(x,2), alpha = 0.2, size=2, aes(fill = sex)) } \keyword{datasets} vcdExtra/man/HairEyePlace.Rd0000644000176200001440000000332313164013351015365 0ustar liggesusers\name{HairEyePlace} \alias{HairEyePlace} \docType{data} \title{ Hair Color and Eye Color in Caithness and Aberdeen } \description{ A three-way frequency table crossing eye color and hair color in two places, Caithness and Aberdeen, Scotland. These data were of interest to Fisher (1940) and others because there are mixtures of people of Nordic, Celtic and Anglo-Saxon origin. One or both tables have been widely analyzed in conjunction with RC and canonical correlation models for categorical data, e.g., Becker and Clogg (1989). } \usage{data(HairEyePlace)} \format{ The format is: num [1:4, 1:5, 1:2] 326 688 343 98 38 116 84 48 241 584 ... - attr(*, "dimnames")=List of 3 ..$ Eye : chr [1:4] "Blue" "Light" "Medium" "Dark" ..$ Hair : chr [1:5] "Fair" "Red" "Medium" "Dark" ... ..$ Place: chr [1:2] "Caithness" "Aberdeen" } \details{ The hair and eye colors are ordered as in the original source, suggesting that they form ordered categories. } \source{ This data was taken from the \code{colors} data in \pkg{logmult}. } \references{ Becker, M. P., and Clogg, C. C. (1989). Analysis of Sets of Two-Way Contingency Tables Using Association Models. \emph{Journal of the American Statistical Association}, 84(405), 142-151. Fisher, R.A. (1940) The precision of discriminant functions. \emph{Annals of Eugenics}, 10, 422-429. } \examples{ data(HairEyePlace) # separate mosaics mosaic(HairEyePlace[,,1], shade=TRUE, main="Caithness") mosaic(HairEyePlace[,,2], shade=TRUE, main="Aberdeen") # condition on Place mosaic(~Hair + Eye |Place, data=HairEyePlace, shade=TRUE, legend=FALSE) cotabplot(~Hair+Eye|Place, data=HairEyePlace, shade=TRUE, legend=FALSE) } \keyword{datasets} vcdExtra/man/Burt.Rd0000644000176200001440000000372713164013351014016 0ustar liggesusers\name{Burt} \alias{Burt} \docType{data} \title{ Burt (1950) Data on Hair, Eyes, Head and Stature } \description{ Cyril Burt (1950) gave these data, on a sample of 100 people from Liverpool, to illustrate the application of a method of factor analysis (later called multiple correspondence analysis) applied to categorical data. He presented these data initially in the form that has come to be called a "Burt table", giving the univariate and bivariate frequencies for an n-way frequency table. } \usage{data("Burt")} \format{ A frequency data frame (representing a 3 x 3 x 2 x 2 frequency table) with 36 observations on the following 5 variables. \describe{ \item{\code{Hair}}{hair color, a factor with levels \code{Fair} \code{Red} \code{Dark}} \item{\code{Eyes}}{eye color, a factor with levels \code{Light} \code{Mixed} \code{Dark}} \item{\code{Head}}{head shape, a factor with levels \code{Narrow} \code{Wide}} \item{\code{Stature}}{height, a factor with levels \code{Tall} \code{Short}} \item{\code{Freq}}{a numeric vector} } } \details{ Burt says: "In all, 217 individuals were examined, about two-thirds of them males. But, partly to simplify the calculations and partly because the later observations were rather more trustworthy, I shall here restrict my analysis to the data obtained from the last hundred males in the series." \code{Head} and \code{Stature} reflect a binary coding where people are classified according to whether they are below or above the average for the population. } \source{ Burt, C. (1950). The factorial analysis of qualitative data, \emph{British Journal of Statistical Psychology}, 3(3), 166-185. Table IX. } %\references{ %% ~~ possibly secondary sources and usages ~~ %} \examples{ data(Burt) mosaic(Freq ~ Hair + Eyes + Head + Stature, data=Burt, shade=TRUE) #or burt.tab <- xtabs(Freq ~ Hair + Eyes + Head + Stature, data=Burt) mosaic(burt.tab, shade=TRUE) } \keyword{datasets} vcdExtra/man/blogits.Rd0000644000176200001440000000531713164013351014542 0ustar liggesusers\name{blogits} \alias{blogits} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Bivariate Logits and Log Odds Ratio } \description{ This function calculates the log odds and log odds ratio for two binary responses classified by one or more stratifying variables. It is useful for plotting the results of bivariate logistic regression models, such as those fit using \code{\link[VGAM]{vglm}} in the \pkg{VGAM}. } \usage{ blogits(Y, add, colnames, row.vars, rev=FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{Y}{ A four-column matrix or data frame whose columns correspond to the 2 x 2 combinations of two binary responses. } \item{add}{ Constant added to all cells to allow for zero frequencies. The default is 0.5 if \code{any(Y)==0} and 0 otherwise. } \item{colnames}{ Names for the columns of the results. The default is \code{c("logit1", "logit2", "logOR")}. If less than three names are supplied, the remaining ones are filled in from the default. } \item{row.vars}{ A data frame or matrix giving the factor levels of one or more factors corresponding to the rows of \code{Y} } \item{rev}{A logical, indicating whether the order of the columns in \code{Y} should be reversed.} } \details{ For two binary variables with levels 0,1 the logits are calculated assuming the columns in \code{Y} are given in the order 11, 10, 01, 00, so the logits give the log odds of the 1 response compared to 0. If this is not the case, either use \code{rev=TRUE} or supply \code{Y[,4:1]} as the first argument. } \value{ A data frame with \code{nrow(Y)} rows and \code{3 + ncol(row.vars)} columns } \references{ Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. } \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[VGAM]{vglm}} } \examples{ data(Toxaemia) tox.tab <- xtabs(Freq~class + smoke + hyper + urea, Toxaemia) # reshape to 4-column matrix toxaemia <- t(matrix(aperm(tox.tab), 4, 15)) colnames(toxaemia) <- c("hu", "hU", "Hu", "HU") rowlabs <- expand.grid(smoke=c("0", "1-19", "20+"), class=factor(1:5)) toxaemia <- cbind(toxaemia, rowlabs) # logits for H and U logitsTox <- blogits(toxaemia[,4:1], add=0.5, colnames=c("logitH", "logitW"), row.vars=rowlabs) logitsTox } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{manip} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/WorkerSat.Rd0000644000176200001440000000231314202253304015007 0ustar liggesusers\name{WorkerSat} \alias{WorkerSat} \docType{data} \title{ Worker Satisfaction Data } \description{ Blue collar workers job satisfaction from large scale investigation in Denmark in 1968 (Andersen, 1991). } \usage{data("WorkerSat")} \format{ A frequency data frame with 8 observations on the following 4 variables, representing the 2 x 2 x 2 classification of 715 cases. \describe{ \item{\code{Manage}}{Quality of management, an ordered factor with levels \code{bad} < \code{good}} \item{\code{Super}}{Supervisor satisfaction, an ordered factor with levels \code{low} < \code{high}} \item{\code{Worker}}{Worker job satisfaction, an ordered factor with levels \code{low} < \code{high}} \item{\code{Freq}}{a numeric vector} } } %\details{ %%% ~~ If necessary, more details than the __description__ above ~~ %} \source{ Originally from \url{https://online.stat.psu.edu/stat504/lesson/10/} } \references{ Andersen, E. B. (1991) Statistical Analysis of Categorical Data, 2nd Ed., Springer-Verlag. } \examples{ data(WorkerSat) worker.tab <- xtabs(Freq ~ Worker + Super + Manage, data=WorkerSat) fourfold(worker.tab) mosaic(worker.tab, shade=TRUE) } \keyword{datasets} vcdExtra/man/Summarise.Rd0000644000176200001440000000630713164013351015044 0ustar liggesusers\name{Summarise} \alias{Summarise} \alias{Summarise.glmlist} \alias{Summarise.loglmlist} \alias{Summarise.default} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Brief Summary of Model Fit for glm and loglm Models } \description{ For \code{glm} objects, the \code{print} and \code{summary} methods give too much information if all one wants to see is a brief summary of model goodness of fit, and there is no easy way to display a compact comparison of model goodness of fit for a collection of models fit to the same data. All \code{loglm} models have equivalent glm forms, but the \code{print} and \code{summary} methods give quite different results. \code{Summarise} provides a brief summary for one or more models fit to the same dataset for which \code{logLik} and \code{nobs} methods exist (e.g., \code{glm} and \code{loglm} models). %This implementation is experimental, and is subject to change. } \usage{ Summarise(object, ...) \method{Summarise}{glmlist}(object, ..., saturated = NULL, sortby = NULL) \method{Summarise}{loglmlist}(object, ..., saturated = NULL, sortby = NULL) \method{Summarise}{default}(object, ..., saturated = NULL, sortby = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ a fitted model object for which there exists a logLik method to extract the corresponding log-likelihood} \item{\dots}{ optionally more fitted model objects } \item{saturated}{ saturated model log likelihood reference value (use 0 if deviance is not available) } \item{sortby}{ either a numeric or character string specifying the column in the result by which the rows are sorted (in decreasing order)} } \details{ The function relies on residual degrees of freedom for the LR chisq test being available in the model object. This is true for objects inheriting from \code{lm}, \code{glm}, \code{loglm}, \code{polr} and \code{negbin}. } \value{ A data frame (also of class \code{anova}) with columns \code{c("AIC", "BIC", "LR Chisq", "Df", "Pr(>Chisq)")}. Row names are taken from the names of the model object(s). } %\references{ %% ~put references to the literature/web site here ~ %} \author{ Achim Zeileis } %\note{ %% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[stats]{logLik}}, \code{\link[stats]{glm}}, \code{\link[MASS]{loglm}}, \code{\link{logLik.loglm}}, \code{\link{modFit}} } \examples{ data(Mental) indep <- glm(Freq ~ mental+ses, family = poisson, data = Mental) Summarise(indep) Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) coleff <- glm(Freq ~ mental + ses + Rscore:ses, family = poisson, data = Mental) roweff <- glm(Freq ~ mental + ses + mental:Cscore, family = poisson, data = Mental) linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) # compare models Summarise(indep, coleff, roweff, linlin) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{models} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/split3d.Rd0000644000176200001440000000605413164013351014460 0ustar liggesusers\name{split3d} \Rdversion{1.1} \alias{split3d} \alias{split3d.shape3d} \alias{split3d.list} \alias{range3d} \alias{center3d} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Subdivide a 3D Object } \description{ Subdivides a \code{shape3d} object or a list of \code{shape3d} objects into objects of the same shape along a given dimension according to the proportions or frequencies specified in vector(s). \code{split3d} is the basic workhorse used in \code{\link{mosaic3d}}, but may be useful in other contexts. \code{range3d} and \code{center3d} are utility functions, also useful in other contexts. } \usage{ split3d(obj, ...) \method{split3d}{shape3d}(obj, p, dim, space = 0.1, ...) \method{split3d}{list}(obj, p, dim, space = 0.1, ...) range3d(obj) center3d(obj) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{obj}{ A \code{shape3d} object, or a list composed of them } \item{\dots}{ Other arguments for split3d methods } \item{p}{ For a single \code{shade3d} object, a vector of proportions (or a vector of non-negative numbers which will be normed to proportions) indicating the number of subdivisions and their scaling along dimension \code{dim}. For a list of \code{shade3d} objects, a matrix whose columns indicate the subdivisions of each object. } \item{dim}{ The dimension along which the object is to be subdivided. Either an integer: 1, 2, or 3, or a character: "x", "y", or "z". } \item{space}{ The total space used to separate the copies of the object along dimension \code{dim}. The unit inter-object space is therefore \code{space/(length(p)-1)}. } } \details{ The resulting list of \code{shape3d} objects is actually composed of \emph{copies} of the input object(s), scaled according to the proportions in \code{p} and then translated to make their range along the splitting dimension equal to that of the input object(s). } \value{ \code{split3d} returns a list of \code{shape3d} objects. \code{range3d} returns a 2 x 3 matrix, whose first row contains the minima on dimensions x, y, z, and whose second row contains the maxima. \code{center3d} returns a numeric vector containing the means of the minima and maxima on dimensions x, y, z. } \author{ Duncan Murdoch, with refinements by Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{mosaic3d}} \code{\link[rgl]{shapelist3d}} for the plotting of lists of \code{shape3d} objects. } \examples{ if (require(rgl)) { open3d() cube <- cube3d(alpha=0.4) sl1 <- split3d(cube, c(.2, .3, .5), 1) col <- c("#FF000080", "#E5E5E580", "#0000FF80") shapelist3d(sl1, col=col) open3d() p <- matrix(c(.6, .4, .5, .5, .2, .8), nrow=2) sl2 <- split3d(sl1, p, 2) shapelist3d(sl2, col=col) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{dplot} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Caesar.Rd0000644000176200001440000000474213164013351014276 0ustar liggesusers\name{Caesar} \alias{Caesar} \docType{data} \title{Risk Factors for Infection in Caesarian Births} \description{Data from infection from birth by Caesarian section, classified by \code{Risk} (two levels), whether \code{Antibiotics} were used (two levels) and whether the Caesarian section was \code{Planned} or not. The outcome is \code{Infection} (three levels).} \usage{ data(Caesar) } \format{ A 4-dimensional array resulting from cross-tabulating 4 variables for 251 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Infection}\tab \code{"Type 1", "Type 2", "None"}\cr 2\tab \code{Risk}\tab \code{"Yes", "No"} (presence of risk factors)\cr 3\tab \code{Antibiotics}\tab \code{"Yes", "No"} (were antibiotics given?)\cr 4\tab \code{Planned}\tab \code{"Yes", "No"} (was the C section planned?)\cr } } \details{ \code{Infection} is regarded as the response variable here. There are quite a few 0 cells here, particularly when \code{Risk} is absent and the Caesarian section was unplanned. Should these be treated as structural or sampling zeros? } \source{ % \cite{Fahrmeir:94} Fahrmeir, L. & Tutz, G. (1994). Multivariate Statistical Modelling Based on Generalized Linear Models New York: Springer Verlag, Table 1.1. } %\references{ %} \seealso{\code{\link[Fahrmeir]{caesar}} for the same data recorded as a frequency data frame with other variables.} \examples{ data(Caesar) #display table; note that there are quite a few 0 cells structable(Caesar) require(MASS) # baseline model, Infection as response Caesar.mod0 <- loglm(~Infection + (Risk*Antibiotics*Planned), data=Caesar) # NB: Pearson chisq cannot be computed due to the 0 cells Caesar.mod0 mosaic(Caesar.mod0, main="Baseline model") # Illustrate handling structural zeros zeros <- 0+ (Caesar >0) zeros[1,,1,1] <- 1 structable(zeros) # fit model excluding possible structural zeros Caesar.mod0s <- loglm(~Infection + (Risk*Antibiotics*Planned), data=Caesar, start=zeros) Caesar.mod0s anova(Caesar.mod0, Caesar.mod0s, test="Chisq") mosaic (Caesar.mod0s) # what terms to add? add1(Caesar.mod0, ~.^2, test="Chisq") # add Association of Infection:Antibiotics Caesar.mod1 <- update(Caesar.mod0, ~.+Infection:Antibiotics) anova(Caesar.mod0, Caesar.mod1, test="Chisq") mosaic(Caesar.mod1, gp=shading_Friendly, main="Adding Infection:Antibiotics") } \keyword{datasets} vcdExtra/man/logseries.Rd0000644000176200001440000000670714202244463015103 0ustar liggesusers\name{logseries} \alias{Logseries} \alias{dlogseries} \alias{plogseries} \alias{qlogseries} \alias{rlogseries} %- Also NEED an '\alias' for EACH other topic documented here. \title{ The Logarithmic Series Distribution } \description{ The logarithmic series distribution is a long-tailed distribution introduced by Fisher etal. (1943) in connection with data on the abundance of individuals classified by species. These functions provide the density, distribution function, quantile function and random generation for the logarithmic series distribution with parameter \code{prob}. } \usage{ dlogseries(x, prob = 0.5, log = FALSE) plogseries(q, prob = 0.5, lower.tail = TRUE, log.p = FALSE) qlogseries(p, prob = 0.5, lower.tail = TRUE, log.p = FALSE, max.value = 10000) rlogseries(n, prob = 0.5) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x, q}{ vector of quantiles representing the number of events. } \item{prob}{ parameter for the distribution, \code{0 < prob < 1} } \item{log, log.p}{ logical; if TRUE, probabilities \code{p} are given as \code{log(p)} } \item{lower.tail}{ logical; if TRUE (default), probabilities are \eqn{P[X \le x]}{P[X <= x]}, otherwise, \eqn{P[X > x]}{P[X > x]}. } \item{p}{ vector of probabilities } \item{max.value}{ maximum value returned by \code{qlogseries} } \item{n}{ number of observations for \code{rlogseries} } } \details{ The logarithmic series distribution with \code{prob} = \eqn{p} has density \deqn{ p ( x ) = \alpha p^x / x } for \eqn{x = 1, 2, \dots}, where \eqn{\alpha= -1 / \log(1 - p)} and \eqn{0 < p <1}. Note that counts \code{x==2} cannot occur. } \value{ \code{dlogseries} gives the density, \code{plogseries} gives the distribution function, \code{qlogseries} gives the quantile function, and \code{rlogseries} generates random deviates. %% ~Describe the value returned %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... } \references{ \url{https://en.wikipedia.org/wiki/Logarithmic_distribution} Fisher, R. A. and Corbet, A. S. and Williams, C. B. (1943). The relation between the number of species and the number of individuals \emph{Journal of Animal Ecology}, 12, 42-58. } \author{ Michael Friendly, using original code modified from the \code{gmlss.dist} package by Mikis Stasinopoulos. } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[stats]{Distributions}}, ~~~ } \examples{ XL <-expand.grid(x=1:5, p=c(0.33, 0.66, 0.99)) lgs.df <- data.frame(XL, prob=dlogseries(XL[,"x"], XL[,"p"])) lgs.df$p = factor(lgs.df$p) str(lgs.df) require(lattice) mycol <- palette()[2:4] xyplot( prob ~ x, data=lgs.df, groups=p, xlab=list('Number of events (k)', cex=1.25), ylab=list('Probability', cex=1.25), type='b', pch=15:17, lwd=2, cex=1.25, col=mycol, key = list( title = 'p', points = list(pch=15:17, col=mycol, cex=1.25), lines = list(lwd=2, col=mycol), text = list(levels(lgs.df$p)), x=0.9, y=0.98, corner=c(x=1, y=1) ) ) # random numbers hist(rlogseries(200, prob=.4), xlab='x') hist(rlogseries(200, prob=.8), xlab='x') } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{distribution} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/loglin-utilities.Rd0000644000176200001440000001615413164013351016375 0ustar liggesusers\name{loglin-utilities} \alias{loglin-utilities} \alias{conditional} \alias{joint} \alias{loglin2formula} \alias{loglin2string} \alias{markov} \alias{mutual} \alias{saturated} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Loglinear Model Utilities } \description{ These functions generate lists of terms to specify a loglinear model in a form compatible with \code{\link[stats]{loglin}} and also provide for conversion to an equivalent \code{\link[MASS]{loglm}} specification or a shorthand character string representation. They allow for a more conceptual way to specify such models by a function for their type, as opposed to just an uninterpreted list of model terms and also allow easy specification of marginal models for a given contingency table. They are intended to be used as tools in higher-level modeling and graphics functions, but can also be used directly. } \usage{ conditional(nf, table = NULL, factors = 1:nf, with = nf) joint(nf, table = NULL, factors = 1:nf, with = nf) markov(nf, factors = 1:nf, order = 1) mutual(nf, table = NULL, factors = 1:nf) saturated(nf, table = NULL, factors = 1:nf) loglin2formula(x, env = parent.frame()) loglin2string(x, brackets = c("[", "]"), sep = ",", collapse = " ", abbrev) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{nf}{ number of factors for which to generate the model } \item{table}{ a contingency table used only for factor names in the model, typically the output from \code{\link[base]{table}} and possibly permuted with \code{aperm} } \item{factors}{ names of factors used in the model formula when \code{table} is not specified } \item{with}{ For \code{joint} and \code{conditional} models, \code{with} gives the indices of the factors against which all others are considered jointly or conditionally independent } \item{order}{ For \code{markov}, this gives the order of the Markov chain model for the factors. An \code{order=1} Markov chain allows associations among sequential pairs of factors, e.g., \code{[A,B], [B,C], [C,D]} \dots. An \code{order=2} Markov chain allows associations among sequential triples. } \item{x}{ For the \code{loglin2*} functions, a list of terms in a loglinear model, such as returned by \code{conditional}, \code{joint}, \dots } \item{env}{ For \code{loglin2formula}, environment in which to evaluate the formula } \item{brackets}{ For \code{loglin2string}, characters to use to surround model terms. Either a single character string containing two characters (e.g., \code{'[]'} or a character vector of length two. } \item{sep}{ For \code{loglin2string}, the separator character string used for factor names within a given model term } \item{collapse}{ For \code{loglin2string}, the character string used between terms in the the model string } \item{abbrev}{ For \code{loglin2string}, whether and how to abbreviate the terms in the string representation. This has not yet been implemented. } } \details{ The main model specification functions, \code{conditional}, \code{joint}, \code{markov}, \dots, \code{saturated}, return a list of vectors indicating the marginal totals to be fit, via the \code{margin} argument to \code{\link[stats]{loglin}}. Each element of this list corresponds to a high-order term in a hierarchical loglinear model, where, e.g., a term like \code{c("A", "B")} is equivalent to the \code{\link[MASS]{loglm}} term \code{"A:B"} and hence automatically includes all low-order terms. Note that these can be used to supply the \code{expected} argument for the default \code{\link[vcd]{mosaic}} function, when the data is supplied as a contingency table. The table below shows some typical results in terms of the standard shorthand notation for loglinear models, with factors A, B, C, \dots, where brackets are used to delimit the high-order terms in the loglinear model. \tabular{llll}{ \strong{function} \tab \strong{3-way} \tab \strong{4-way} \tab \strong{5-way} \cr \code{mutual} \tab [A] [B] [C] \tab [A] [B] [C] [D] \tab [A] [B] [C] [D] [E] \cr \code{joint} \tab [AB] [C] \tab [ABC] [D] \tab [ABCE] [E] \cr \code{joint (with=1)} \tab [A] [BC] \tab [A] [BCD] \tab [A] [BCDE] \cr \code{conditional} \tab [AC] [BC] \tab [AD] [BD] [CD] \tab [AE] [BE] [CE] [DE] \cr \code{condit (with=1)} \tab [AB] [AC] \tab [AB] [AC] [AD] \tab [AB] [AC] [AD] [AE] \cr \code{markov (order=1)} \tab [AB] [BC] \tab [AB] [BC] [CD] \tab [AB] [BC] [CD] [DE] \cr \code{markov (order=2)} \tab [A] [B] [C] \tab [ABC] [BCD] \tab [ABC] [BCD] [CDE] \cr \code{saturated} \tab [ABC] \tab [ABCD] \tab [ABCDE] \cr } \code{loglin2formula} converts the output of one of these to a model formula suitable as the \code{formula} for of \code{\link[MASS]{loglm}}. \code{loglin2string} converts the output of one of these to a string describing the loglinear model in the shorthand bracket notation, e.g., \code{"[A,B] [A,C]"}. } \value{ For the main model specification functions, \code{conditional}, \code{joint}, \code{markov}, \dots, the result is a list of vectors (terms), where the elements in each vector are the names of the factors. The elements of the list are given names \code{term1, term2, \dots}. } \references{ These functions were inspired by the original SAS implementation of mosaic displays, described in the \emph{User's Guide}, \url{http://www.datavis.ca/mosaics/mosaics.pdf} } \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[stats]{loglin}}, \code{\link[MASS]{loglm}} } \examples{ joint(3, table=HairEyeColor) # as a formula or string loglin2formula(joint(3, table=HairEyeColor)) loglin2string(joint(3, table=HairEyeColor)) joint(2, HairEyeColor) # marginal model for [Hair] [Eye] # other possibilities joint(4, factors=letters, with=1) joint(5, factors=LETTERS) joint(5, factors=LETTERS, with=4:5) conditional(4) conditional(4, with=3:4) # use in mosaic displays or other strucplots mosaic(HairEyeColor, expected=joint(3)) mosaic(HairEyeColor, expected=conditional(3)) # use with MASS::loglm cond3 <- loglin2formula(conditional(3, table=HairEyeColor)) cond3 <- loglin2formula(conditional(3)) # same, with factors 1,2,3 require(MASS) loglm(cond3, data=HairEyeColor) saturated(3, HairEyeColor) loglin2formula(saturated(3, HairEyeColor)) loglin2string(saturated(3, HairEyeColor)) loglin2string(saturated(3, HairEyeColor), brackets='{}', sep=', ') } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{models} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Glass.Rd0000644000176200001440000000416413164013351014147 0ustar liggesusers\name{Glass} \alias{Glass} \docType{data} \title{ British Social Mobility from Glass(1954) } \description{ Glass(1954) gave this 5 x 5 table on the occupations of 3500 British fathers and their sons. } \usage{data("Glass")} \format{ A frequency data frame with 25 observations on the following 3 variables representing a 5 x 5 table with 3500 cases. \describe{ \item{\code{father}}{a factor with levels \code{Managerial} \code{Professional} \code{Skilled} \code{Supervisory} \code{Unskilled}} \item{\code{son}}{a factor with levels \code{Managerial} \code{Professional} \code{Skilled} \code{Supervisory} \code{Unskilled}} \item{\code{Freq}}{a numeric vector} } } \details{ The occupational categories in order of status are: (1) Professional \& High Administrative (2) Managerial, Executive \& High Supervisory (3) Low Inspectional \& Supervisory (4) Routine Nonmanual \& Skilled Manual (5) Semi- \& Unskilled Manual However, to make the point that factors are ordered alphabetically by default, Friendly \& Meyer (2016) introduce this data set in the form given here. } \source{ Glass, D. V. (1954), \emph{Social Mobility in Britain}. The Free Press. } \references{ Bishop, Y. M. M. and Fienberg, S. E. and Holland, P. W. (1975). \emph{Discrete Multivariate Analysis: Theory and Practice}, MIT Press. Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. } \examples{ data(Glass) glass.tab <- xtabs(Freq ~ father + son, data=Glass) largs <- list(set_varnames=list(father="Father's Occupation", son="Son's Occupation"), abbreviate=10) gargs <- list(interpolate=c(1,2,4,8)) mosaic(glass.tab, shade=TRUE, labeling_args=largs, gp_args=gargs, main="Alphabetic order", legend=FALSE, rot_labels=c(20,90,0,70)) # reorder by status ord <- c(2, 1, 4, 3, 5) mosaic(glass.tab[ord, ord], shade=TRUE, labeling_args=largs, gp_args=gargs, main="Effect order", legend=FALSE, rot_labels=c(20,90,0,70)) } \keyword{datasets} vcdExtra/man/AirCrash.Rd0000644000176200001440000000413213771417075014604 0ustar liggesusers\name{AirCrash} \alias{AirCrash} \docType{data} \title{ Air Crash Data } \description{ Data on all fatal commercial airplane crashes from 1993--2015. Excludes small planes (less than 6 passengers) and non-commercial (cargo, military, private) aircraft. } \usage{data("AirCrash")} \format{ A data frame with 439 observations on the following 5 variables. \describe{ \item{\code{Phase}}{phase of the flight, a factor with levels \code{en route} \code{landing} \code{standing} \code{take-off} \code{unknown}} \item{\code{Cause}}{a factor with levels \code{criminal} \code{human error} \code{mechanical} \code{unknown} \code{weather}} \item{\code{date}}{date of crash, a Date} \item{\code{Fatalities}}{number of fatalities, a numeric vector} \item{\code{Year}}{year, a numeric vector} } } \details{ \code{Phase} of the flight was cleaned by combining related variants, spelling, etc. } \source{ Originally from David McCandless, \url{http://www.informationisbeautiful.net/visualizations/plane-truth-every-single-commercial-plane-crash-visualized/}, with the data at \url{https://docs.google.com/spreadsheets/d/1OvDq4_BtbR6nSnnHnjD5hVC3HQ-ulZPGbo0RDGbzM3Q/edit?usp=drive_web}, downloaded April 14, 2015. } \references{ Rick Wicklin, \url{http://blogs.sas.com/content/iml/2015/03/30/visualizing-airline-crashes.html} } \examples{ data(AirCrash) aircrash.tab <- xtabs(~Phase + Cause, data=AirCrash) mosaic(aircrash.tab, shade=TRUE) # fix label overlap mosaic(aircrash.tab, shade=TRUE, labeling_args=list(rot_labels=c(30, 30, 30, 30))) # reorder by Phase phase.ord <- rev(c(3,4,1,2,5)) mosaic(aircrash.tab[phase.ord,], shade=TRUE, labeling_args=list(rot_labels=c(30, 30, 30, 30)), offset_varnames=0.5) # reorder by frequency phase.ord <- order(rowSums(aircrash.tab), decreasing=TRUE) cause.ord <- order(colSums(aircrash.tab), decreasing=TRUE) mosaic(aircrash.tab[phase.ord,cause.ord], shade=TRUE, labeling_args=list(rot_labels=c(30, 30, 30, 30))) library(ca) aircrash.ca <- ca(aircrash.tab) plot(aircrash.ca) } \keyword{datasets} vcdExtra/man/Kway.Rd0000644000176200001440000001037614202244517014017 0ustar liggesusers\name{Kway} \Rdversion{1.1} \alias{Kway} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Fit All K-way Models in a GLM } \description{ Generate and fit all 0-way, 1-way, 2-way, ... k-way terms in a glm. This function is designed mainly for hierarchical loglinear models (or \code{glm}s in the poisson family), where it is desired to find the highest-order terms necessary to achieve a satisfactory fit. Using \code{\link[stats]{anova}} on the resulting \code{\link{glmlist}} object will then give sequential tests of the pooled contributions of all terms of degree \eqn{k+1} over and above those of degree \eqn{k}. This function is also intended as an example of a generating function for \code{\link{glmlist}} objects, to facilitate model comparison, extraction, summary and plotting of model components, etc., perhaps using \code{lapply} or similar. } \usage{ Kway(formula, family=poisson, data, ..., order = nt, prefix = "kway") } %- maybe also 'usage' for other objects documented here. \arguments{ \item{formula}{ a two-sided formula for the 1-way effects in the model. The LHS should be the response, and the RHS should be the first-order terms connected by \code{+} signs. } \item{family}{ a description of the error distribution and link function to be used in the model. This can be a character string naming a family function, a family function or the result of a call to a family function. (See \code{\link[stats]{family}} for details of family functions.) } \item{data}{ an optional data frame, list or environment (or object coercible by \code{\link[base]{as.data.frame}} to a data frame) containing the variables in the model. If not found in data, the variables are taken from \code{environment(formula)}, typically the environment from which \code{glm} is called. } \item{\dots}{ Other arguments passed to \code{glm} } \item{order}{ Highest order interaction of the models generated. Defaults to the number of terms in the model formula. } \item{prefix}{ Prefix used to label the models fit in the \code{glmlist} object. } } \details{ With \code{y} as the response in the \code{formula}, the 0-way (null) model is \code{y ~ 1}. The 1-way ("main effects") model is that specified in the \code{formula} argument. The k-way model is generated using the formula \code{. ~ .^k}. With the default \code{order = nt}, the final model is the saturated model. As presently written, the function requires a two-sided formula with an explicit response on the LHS. For frequency data in table form (e.g., produced by \code{xtabs}) you the \code{data} argument is coerced to a data.frame, so you should supply the \code{formula} in the form \code{Freq ~ } \dots. } \value{ An object of class \code{glmlist}, of length \code{order+1} containing the 0-way, 1-way, ... models up to degree \code{order}. } %\references{ %%% ~put references to the literature/web site here ~ %} \author{ Michael Friendly and Heather Turner } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{glmlist}}, \code{\link{Summarise}} (soon to be deprecated), \code{\link{LRstats}} } \examples{ ## artificial data factors <- expand.grid(A=factor(1:3), B=factor(1:2), C=factor(1:3), D=factor(1:2)) Freq <- rpois(nrow(factors), lambda=40) df <- cbind(factors, Freq) mods3 <- Kway(Freq ~ A + B + C, data=df, family=poisson) LRstats(mods3) mods4 <- Kway(Freq ~ A + B + C + D, data=df, family=poisson) LRstats(mods4) # JobSatisfaction data data(JobSatisfaction, package="vcd") modSat <- Kway(Freq ~ management+supervisor+own, data=JobSatisfaction, family=poisson, prefix="JobSat") LRstats(modSat) anova(modSat, test="Chisq") # Rochdale data: very sparse, in table form data(Rochdale, package="vcd") \dontrun{ modRoch <- Kway(Freq~EconActive + Age + HusbandEmployed + Child + Education + HusbandEducation + Asian + HouseholdWorking, data=Rochdale, family=poisson) LRstats(modRoch) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{models} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Hoyt.Rd0000644000176200001440000000652013164013351014017 0ustar liggesusers\name{Hoyt} \Rdversion{1.1} \alias{Hoyt} \docType{data} \title{Minnesota High School Graduates} \description{Minnesota high school graduates of June 1930 were classified with respect to (a) \code{Rank} by thirds in their graduating class, (b) post-high school \code{Status} in April 1939 (4 levels), (c) \code{Sex}, (d) father's \code{Occupation}al status (7 levels, from 1=High to 7=Low). The data were first presented by Hoyt et al. (1959) and have been analyzed by Fienberg(1980), Plackett(1974) and others. } \usage{ data(Hoyt) } \format{ A 4-dimensional array resulting from cross-tabulating 4 variables for 13968 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Status}\tab \code{"College", "School", "Job", "Other"}\cr 2\tab \code{Rank}\tab \code{"Low", "Middle", "High"}\cr 3\tab \code{Occupation}\tab \code{"1", "2", "3", "4", "5", "6", "7"}\cr 4\tab \code{Sex}\tab \code{"Male", "Female"}\cr } } \details{Post high-school \code{Status} is natural to consider as the response. \code{Rank} and father's \code{Occupation} are ordinal variables.} \source{ % \cite{Hoyt-etal:59} % \cite{Fienberg:80 [pp.91-92]} % \cite{Plackett:74} % \cite{minn38{MASS}} Fienberg, S. E. (1980). \emph{The Analysis of Cross-Classified Categorical Data}. Cambridge, MA: MIT Press, p. 91-92. R. L. Plackett, (1974). \emph{The Analysis of Categorical Data}. London: Griffin. } \references{ Hoyt, C. J., Krishnaiah, P. R. and Torrance, E. P. (1959) Analysis of complex contingency tables, \emph{Journal of Experimental Education} 27, 187-194. } \seealso{ \code{\link[MASS]{minn38}} provides the same data as a data frame. } \examples{ data(Hoyt) # display the table structable(Status+Sex ~ Rank+Occupation, data=Hoyt) # mosaic for independence model plot(Hoyt, shade=TRUE) # examine all pairwise mosaics pairs(Hoyt, shade=TRUE) # collapse Status to College vs. Non-College Hoyt1 <- collapse.table(Hoyt, Status=c("College", rep("Non-College",3))) plot(Hoyt1, shade=TRUE) ################################################# # fitting models with loglm, plotting with mosaic ################################################# # fit baseline log-linear model for Status as response require(MASS) hoyt.mod0 <- loglm(~ Status + (Sex*Rank*Occupation), data=Hoyt1) hoyt.mod0 mosaic(hoyt.mod0, gp=shading_Friendly, main="Baseline model: Status + (Sex*Rank*Occ)") # add one-way association of Status with factors hoyt.mod1 <- loglm(~ Status * (Sex + Rank + Occupation) + (Sex*Rank*Occupation), data=Hoyt1) hoyt.mod1 mosaic(hoyt.mod1, gp=shading_Friendly, main="Status * (Sex + Rank + Occ)") # can we drop any terms? drop1(hoyt.mod1, test="Chisq") # assess model fit anova(hoyt.mod0, hoyt.mod1) # what terms to add? add1(hoyt.mod1, ~.^2, test="Chisq") # add interaction of Sex:Occupation on Status hoyt.mod2 <- update(hoyt.mod1, ~.+Status:Sex:Occupation) mosaic(hoyt.mod2, gp=shading_Friendly, main="Adding Status:Sex:Occupation") # compare model fits anova(hoyt.mod0, hoyt.mod1, hoyt.mod2) # Alternatively, try stepwise analysis, heading toward the saturated model steps <- step(hoyt.mod0, direction="forward", scope=~Status*Sex*Rank*Occupation) # display anova steps$anova } \keyword{datasets} vcdExtra/man/Accident.Rd0000644000176200001440000000711313164013351014605 0ustar liggesusers\name{Accident} \alias{Accident} \docType{data} \title{ Traffic Accident Victims in France in 1958 } \description{ Bertin (1983) used these data to illustrate the cross-classification of data by numerous variables, each of which could have various types and could be assigned to various visual attributes. For modeling and visualization purposes, the data can be treated as a 4-way table using loglinear models and mosaic displays, or as a frequency-weighted data frame using a binomial response for \code{result} (\code{"Died"} vs. \code{"Injured"}) and plots of predicted probabilities. } \usage{data(Accident)} \format{ A data frame in frequency form (comprising a 5 x 2 x 4 x 2 table) with 80 observations on the following 5 variables. \describe{ \item{\code{age}}{an ordered factor with levels \code{0-9} < \code{10-19} < \code{20-29} < \code{30-49} < \code{50+}} \item{\code{result}}{a factor with levels \code{Died} \code{Injured}} \item{\code{mode}}{mode of transportation, a factor with levels \code{4-Wheeled} \code{Bicycle} \code{Motorcycle} \code{Pedestrian}} \item{\code{gender}}{a factor with levels \code{Female} \code{Male}} \item{\code{Freq}}{a numeric vector} } } \details{ \code{age} is an ordered factor, but arguably, \code{mode} should be treated as ordered, with levels \code{Pedestrian} < \code{Bicycle} < \code{Motorcycle} < \code{4-Wheeled} as Bertin does. This affects the parameterization in models, so we don't do this directly in the data frame. } \source{ Bertin (1983), p. 30; original data from the Ministere des Travaux Publics } \references{ Bertin, J. (1983), \emph{Semiology of Graphics}, University of Wisconsin Press. } \examples{ # examples data(Accident) head(Accident) # for graphs, reorder mode Accident$mode <- ordered(Accident$mode, levels=levels(Accident$mode)[c(4,2,3,1)]) # Bertin's table accident_tab <- xtabs(Freq ~ gender+mode+age+result, data=Accident) structable(mode+gender ~ age+result, data=accident_tab) ## Loglinear models ## ---------------- # mutual independence acc.mod0 <- glm(Freq ~ age+result+mode+gender, data=Accident, family=poisson) LRstats(acc.mod0) mosaic(acc.mod0, ~mode+age+gender+result) # result as a response acc.mod1 <- glm(Freq ~ age*mode*gender + result, data=Accident, family=poisson) LRstats(acc.mod1) mosaic(acc.mod1, ~mode+age+gender+result, labeling_args = list(abbreviate = c(gender=1, result=4))) # allow two-way association of result with each explanatory variable acc.mod2 <- glm(Freq ~ age*mode*gender + result*(age+mode+gender), data=Accident, family=poisson) LRstats(acc.mod2) mosaic(acc.mod2, ~mode+age+gender+result, labeling_args = list(abbreviate = c(gender=1, result=4))) acc.mods <- glmlist(acc.mod0, acc.mod1, acc.mod2) LRstats(acc.mods) ## Binomial (logistic regression) models for result ## ------------------------------------------------ library(car) # for Anova() acc.bin1 <- glm(result=='Died' ~ age+mode+gender, weights=Freq, data=Accident, family=binomial) Anova(acc.bin1) acc.bin2 <- glm(result=='Died' ~ (age+mode+gender)^2, weights=Freq, data=Accident, family=binomial) Anova(acc.bin2) acc.bin3 <- glm(result=='Died' ~ (age+mode+gender)^3, weights=Freq, data=Accident, family=binomial) Anova(acc.bin3) # compare models anova(acc.bin1, acc.bin2, acc.bin3, test="Chisq") # visualize probability of death with effect plots \dontrun{ library(effects) plot(allEffects(acc.bin1), ylab='Pr (Died)') plot(allEffects(acc.bin2), ylab='Pr (Died)') } #} \keyword{datasets} vcdExtra/man/vcdExtra-package.Rd0000644000176200001440000001321514202252636016251 0ustar liggesusers\name{vcdExtra-package} \alias{vcdExtra-package} \alias{vcdExtra} \docType{package} \title{ Extensions and additions to vcd: Visualizing Categorical Data } \description{ \if{html}{\figure{vcdExtra-logo.png}{options: align='right' alt='logo' width='100'}} This package provides additional data sets, documentation, and a few functions designed to extend the \code{vcd} package for Visualizing Categorical Data and the \code{gnm} package for Generalized Nonlinear Models. In particular, vcdExtra extends mosaic, assoc and sieve plots from vcd to handle glm() and gnm() models and adds a 3D version in \code{\link{mosaic3d}}. This package is now a support package for the book, \emph{Discrete Data Analysis with R} by Michael Friendly and David Meyer, Chapman & Hall/CRC, 2016, \url{https://www.crcpress.com/Discrete-Data-Analysis-with-R-Visualization-and-Modeling-Techniques-for/Friendly-Meyer/9781498725835} with a number of additional data sets, and functions. The web site for the book is \url{http://ddar.datavis.ca}. } \details{ \tabular{ll}{ Package: \tab vcdExtra\cr Type: \tab Package\cr Version: \tab 0.7-6\cr Date: \tab 2021-02-12\cr License: \tab GPL version 2 or newer\cr LazyLoad: \tab yes\cr } The main purpose of this package is to serve as a sandbox for introducing extensions of mosaic plots and related graphical methods that apply to loglinear models fitted using \code{glm()} and related, generalized nonlinear models fitted with \code{gnm()} in the \code{\link[gnm]{gnm-package}} package. A related purpose is to fill in some holes in the analysis of categorical data in R, not provided in base R, the \pkg{vcd}, or other commonly used packages. The method \code{\link{mosaic.glm}} extends the \code{\link[vcd]{mosaic.loglm}} method in the \pkg{vcd} package to this wider class of models. This method also works for the generalized nonlinear models fit with the \code{\link[gnm]{gnm-package}} package, including models for square tables and models with multiplicative associations. \code{\link{mosaic3d}} introduces a 3D generalization of mosaic displays using the \pkg{rgl} package. In addition, there are several new data sets, a tutorial vignette, \describe{ \item{vcd-tutorial}{Working with categorical data with R and the vcd package, \code{vignette("vcd-tutorial", package = "vcdExtra") }} } and a few functions for manipulating categorical data sets and working with models for categorical data. A new class, \code{\link{glmlist}}, is introduced for working with collections of \code{glm} objects, e.g., \code{\link{Kway}} for fitting all K-way models from a basic marginal model, and \code{\link{LRstats}} for brief statistical summaries of goodness-of-fit for a collection of models. For square tables with ordered factors, \code{\link{Crossings}} supplements the specification of terms in model formulas using \code{\link[gnm]{Symm}}, \code{\link[gnm]{Diag}}, \code{\link[gnm]{Topo}}, etc. in the \code{\link[gnm]{gnm-package}}. Some of these extensions may be migrated into \pkg{vcd} or \pkg{gnm}. A collection of demos is included to illustrate fitting and visualizing a wide variety of models: \describe{ \item{mental-glm}{Mental health data: mosaics for glm() and gnm() models} \item{occStatus}{Occupational status data: Compare mosaic using expected= to mosaic.glm} \item{ucb-glm}{UCBAdmissions data: Conditional independence via loglm() and glm()} \item{vision-quasi}{VisualAcuity data: Quasi- and Symmetry models} \item{yaish-unidiff}{Yaish data: Unidiff model for 3-way table} \item{Wong2-3}{Political views and support for women to work (U, R, C, R+C and RC(1) models)} \item{Wong3-1}{Political views, support for women to work and national welfare spending (3-way, marginal, and conditional independence models)} \item{housing}{Visualize glm(), multinom() and polr() models from \code{example(housing, package="MASS")}} } Use \code{ demo(package="vcdExtra")} for a complete current list. The \pkg{vcdExtra} package now contains a large number of data sets illustrating various forms of categorical data analysis and related visualizations, from simple to advanced. Use \code{data(package="vcdExtra")} for a complete list, or \code{datasets(package="vcdExtra")} for an annotated one showing the \code{class} and \code{dim} for each data set. } \author{ Michael Friendly Maintainer: Michael Friendly || (\href{https://orcid.org/0000-0002-3237-0941}{ORCID}) } \references{ Friendly, M. \emph{Visualizing Categorical Data}, Cary NC: SAS Institute, 2000. Web materials: \url{http://www.datavis.ca/books/vcd/}. Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. Meyer, D.; Zeileis, A. & Hornik, K. The Strucplot Framework: Visualizing Multi-way Contingency Tables with vcd \emph{Journal of Statistical Software}, 2006, \bold{17}, 1-48. Available in R via \code{vignette("strucplot", package = "vcd")} Turner, H. and Firth, D. \emph{Generalized nonlinear models in R: An overview of the gnm package}, 2007, \url{http://eprints.ncrm.ac.uk/472/}. Available in R via \code{vignette("gnmOverview", package = "gnm")}. } \keyword{ package } \seealso{ \code{\link[gnm]{gnm-package}}, for an extended range of models for contingency tables \code{\link[vcd]{mosaic}} for details on mosaic displays within the strucplot framework. %~~ Optional links to other man pages, e.g. ~~ %~~ \code{\link[:-package]{}} ~~ } \examples{ example(mosaic.glm) demo("mental-glm") } vcdExtra/man/JobSat.Rd0000644000176200001440000000217313164013351014256 0ustar liggesusers\name{JobSat} \Rdversion{1.1} \alias{JobSat} \docType{data} \title{Cross-classification of job satisfaction by income} \description{ This data set is a contingency table of job satisfaction by income for a small sample of black males from the 1996 General Social Survey, as used by Agresti (2002) for an example. } \usage{data(JobSat)} \format{ A 4 x 4 contingency table of \code{income} by \code{satisfaction}, with the following structure: \preformatted{ table [1:4, 1:4] 1 2 1 0 3 3 6 1 10 10 ... - attr(*, "dimnames")=List of 2 ..$ income : chr [1:4] "< 15k" "15-25k" "25-40k" "> 40k" ..$ satisfaction: chr [1:4] "VeryD" "LittleD" "ModerateS" "VeryS" } } \details{ Both \code{income} and \code{satisfaction} are ordinal variables, and are so ordered in the table. Measures of association, visualizations, and models should take ordinality into account. } \source{ Agresti, A. Categorical Data Analysis John Wiley & Sons, 2002, Table 2.8, p. 57. } %\references{ % ~~ possibly secondary sources and usages ~~ %} \examples{ data(JobSat) assocstats(JobSat) GKgamma(JobSat) } \keyword{datasets} vcdExtra/man/PhdPubs.Rd0000644000176200001440000000370613771412536014460 0ustar liggesusers\name{PhdPubs} \alias{PhdPubs} \docType{data} \title{ Publications of PhD Candidates } \description{ A data set giving the number of publications by doctoral candidates in biochemistry in relation to various predictors, originally from Long (1997). There is a large number of zero counts. Is there evidence for a separate group of non-publishers? } \usage{data(PhdPubs)} \format{ A data frame with 915 observations on the following 6 variables. \describe{ \item{\code{articles}}{number of articles published in the final three years of PhD studies} \item{\code{female}}{dummy variable for gender, coded \code{1} for female} \item{\code{married}}{dummy variable for marital status, coded \code{1} for married} \item{\code{kid5}}{number of young children, age 5 and under} \item{\code{phdprestige}}{prestige of the PhD department. The higher the number the more prestigious the program. } \item{\code{mentor}}{number of publications by the mentor in the preceeding three years} } } \details{ In this version of the data set, \code{phdprestige} had been rounded to the nearest integer. A Stata version with the continuous values was subsequently found at \url{https://www.stata-press.com/data/lf2/couart2.dta} } \source{ Long, J. S. (1997). \emph{Regression Models for Categorical and Limited Dependent Variables}, Sage. Long, J. S. & Freese, J. (2006). \emph{Regression Models for Categorical Dependent Variables Using Stata}, 2nd Ed., Stata Press. } %\references{ %% ~~ possibly secondary sources and usages ~~ %} \examples{ data(PhdPubs) # very uninformative hist(PhdPubs$articles, breaks=0:19, col="pink", xlim=c(0,20), xlab="Number of Articles") library(vcd) rootogram(goodfit(PhdPubs$articles), xlab="Number of Articles") # compare with negative binomial rootogram(goodfit(PhdPubs$articles, type="nbinomial"), xlab="Number of Articles", main="Negative binomial") } \keyword{datasets} vcdExtra/man/collapse.table.Rd0000644000176200001440000000720413164013351015764 0ustar liggesusers\name{collapse.table} \alias{collapse.table} %- Also NEED an '\alias' for EACH other topic documented here. \title{Collapse Levels of a Table} \description{ Collapse (or re-label) variables in a a contingency table, array or \code{ftable} object by re-assigning levels of the table variables. } \usage{ collapse.table(table, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{table}{A \code{\link[base]{table}}, \code{\link[base]{array}} or \code{\link[stats]{ftable}} object} \item{\dots}{ A collection of one or more assignments of factors of the table to a list of levels } } \details{ Each of the \code{\dots} arguments must be of the form \code{variable = levels}, where \code{variable} is the name of one of the table dimensions, and \code{levels} is a character or numeric vector of length equal to the corresponding dimension of the table. } \value{ A \code{xtabs} and \code{table} object, representing the original table with one or more of its factors collapsed or rearranged into other levels. } %\references{ ~put references to the literature/web site here ~ } \author{Michael Friendly} %\note{ ~~further notes~~ % % ~Make other sections like Warning with \section{Warning }{....} ~ %} \seealso{ \code{\link{expand.dft}} expands a frequency data frame to case form. \code{\link[base]{margin.table}} "collapses" a table in a different way, by summing over table dimensions. } \examples{ # create some sample data in table form sex <- c("Male", "Female") age <- letters[1:6] education <- c("low", 'med', 'high') data <- expand.grid(sex=sex, age=age, education=education) counts <- rpois(36, 100) data <- cbind(data, counts) t1 <- xtabs(counts ~ sex + age + education, data=data) structable(t1) ## age a b c d e f ## sex education ## Male low 119 101 109 85 99 93 ## med 94 98 103 108 84 84 ## high 81 88 96 110 100 92 ## Female low 107 104 95 86 103 96 ## med 104 98 94 95 110 106 ## high 93 85 90 109 99 86 # collapse age to 3 levels t2 <- collapse.table(t1, age=c("A", "A", "B", "B", "C", "C")) structable(t2) ## age A B C ## sex education ## Male low 220 194 192 ## med 192 211 168 ## high 169 206 192 ## Female low 211 181 199 ## med 202 189 216 ## high 178 199 185 # collapse age to 3 levels and pool education: "low" and "med" to "low" t3 <- collapse.table(t1, age=c("A", "A", "B", "B", "C", "C"), education=c("low", "low", "high")) structable(t3) ## age A B C ## sex education ## Male low 412 405 360 ## high 169 206 192 ## Female low 413 370 415 ## high 178 199 185 # change labels for levels of education to 1:3 t4 <- collapse.table(t1, education=1:3) structable(t4) structable(t4) ## age a b c d e f ## sex education ## Male 1 119 101 109 85 99 93 ## 2 94 98 103 108 84 84 ## 3 81 88 96 110 100 92 ## Female 1 107 104 95 86 103 96 ## 2 104 98 94 95 110 106 ## 3 93 85 90 109 99 86 } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{manip} \keyword{attribute}% __ONLY ONE__ keyword per line vcdExtra/man/DaytonSurvey.Rd0000644000176200001440000000462413164013351015553 0ustar liggesusers\name{DaytonSurvey} \alias{DaytonSurvey} \docType{data} \title{ Dayton Student Survey on Substance Use } \description{ This data, from Agresti (2002), Table 9.1, gives the result of a 1992 survey in Dayton Ohio of 2276 high school seniors on whether they had ever used alcohol, cigarettes and marijuana. } \usage{data(DaytonSurvey)} \format{ A frequency data frame with 32 observations on the following 6 variables. \describe{ \item{\code{cigarette}}{a factor with levels \code{Yes} \code{No}} \item{\code{alcohol}}{a factor with levels \code{Yes} \code{No}} \item{\code{marijuana}}{a factor with levels \code{Yes} \code{No}} \item{\code{sex}}{a factor with levels \code{female} \code{male}} \item{\code{race}}{a factor with levels \code{white} \code{other}} \item{\code{Freq}}{a numeric vector} } } \details{ Agresti uses the letters G (\code{sex}), R (\code{race}), A (\code{alcohol}), C (\code{cigarette}), M (\code{marijuana}) to refer to the table variables, and this usage is followed in the examples below. Background variables include \code{sex} and \code{race} of the respondent (GR), typically treated as explanatory, so that any model for the full table should include the term \code{sex:race}. Models for the reduced table, collapsed over \code{sex} and \code{race} are not entirely unreasonable, but don't permit the estimation of the effects of these variables on the responses. The full 5-way table contains a number of cells with counts of 0 or 1, as well as many cells with large counts, and even the ACM table collapsed over GR has some small cell counts. Consequently, residuals for these models in mosaic displays are best represented as standardized (adjusted) residuals. } \source{ Agresti, A. (2002). \emph{Categorical Data Analysis}, 2nd Ed., New York: Wiley-Interscience, Table 9.1, p. 362. } \references{ Thompson, L. (2009). \emph{R (and S-PLUS) Manual to Accompany Agresti's Categorical Data}, \url{http://www.stat.ufl.edu/~aa/cda/Thompson_manual.pdf} } \examples{ data(DaytonSurvey) mod.GR <- glm(Freq ~ . + sex*race, data=DaytonSurvey, family=poisson) # mutual independence + GR mod.homog.assoc <- glm(Freq ~ .^2, data=DaytonSurvey, family=poisson) # homogeneous association # collapse over sex and race Dayton.ACM <- aggregate(Freq ~ cigarette+alcohol+marijuana, data=DaytonSurvey, FUN=sum) } \keyword{datasets} vcdExtra/man/HLtest.Rd0000644000176200001440000000707014202242025014274 0ustar liggesusers\name{HLtest} \alias{HosmerLemeshow} \alias{HLtest} \alias{plot.HLtest} \alias{print.HLtest} \alias{rootogram.HLtest} \alias{summary.HLtest} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Hosmer-Lemeshow Goodness of Fit Test } \description{ The \code{HLtest} function computes the classical Hosmer-Lemeshow (1980) goodness of fit test for a binomial \code{glm} object in logistic regression The general idea is to assesses whether or not the observed event rates match expected event rates in subgroups of the model population. The Hosmer-Lemeshow test specifically identifies subgroups as the deciles of fitted event values, or other quantiles as determined by the \code{g} argument. Given these subgroups, a simple chisquare test on \code{g-2} df is used. In addition to \code{print} and \code{summary} methods, a \code{plot} method is supplied to visualize the discrepancies between observed and fitted frequencies. } \usage{ HosmerLemeshow(model, g = 10) HLtest(model, g = 10) \method{print}{HLtest}(x, ...) \method{summary}{HLtest}(object, ...) \method{plot}{HLtest}(x, ...) \method{rootogram}{HLtest}(x, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{model}{ A \code{glm} model object in the \code{binomial} family } \item{g}{ Number of groups used to partition the fitted values for the GOF test. } \item{x, object}{ A \code{HLtest} object } \item{\dots}{ Other arguments passed down to methods } } %\details{ %%% ~~ If necessary, more details than the description above ~~ %} \value{ A class \code{HLtest} object with the following components: %% If it is a LIST, use \item{table}{A data.frame describing the results of partitioning the data into \code{g} groups with the following columns: \code{cut}, \code{total}, \code{obs}, \code{exp}, \code{chi}} \item{chisq}{The chisquare statistics} \item{df}{Degrees of freedom} \item{p.value}{p value} \item{groups}{Number of groups} \item{call}{\code{model} call} %% ... } \references{ Hosmer, David W., Lemeshow, Stanley (1980). A goodness-of-fit test for multiple logistic regression model. \emph{Communications in Statistics, Series A}, 9, 1043-1069. Hosmer, David W., Lemeshow, Stanley (2000). \emph{Applied Logistic Regression}, New York: Wiley, ISBN 0-471-61553-6 Lemeshow, S. and Hosmer, D.W. (1982). A review of goodness of fit statistics for use in the development of logistic regression models. \emph{American Journal of Epidemiology}, 115(1), 92-106. } \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[vcd]{rootogram}}, ~~~ } \examples{ data(birthwt, package="MASS") # how to do this without attach? attach(birthwt) race = factor(race, labels = c("white", "black", "other")) ptd = factor(ptl > 0) ftv = factor(ftv) levels(ftv)[-(1:2)] = "2+" bwt <- data.frame(low = factor(low), age, lwt, race, smoke = (smoke > 0), ptd, ht = (ht > 0), ui = (ui > 0), ftv) detach(birthwt) options(contrasts = c("contr.treatment", "contr.poly")) BWmod <- glm(low ~ ., family=binomial, data=bwt) (hlt <- HLtest(BWmod)) str(hlt) summary(hlt) plot(hlt) # basic model BWmod0 <- glm(low ~ age, family=binomial, data=bwt) (hlt0 <- HLtest(BWmod0)) str(hlt0) summary(hlt0) plot(hlt0) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{htest} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Fungicide.Rd0000644000176200001440000000353114202241547014774 0ustar liggesusers\name{Fungicide} \alias{Fungicide} \docType{data} \title{ Carcinogenic Effects of a Fungicide } \description{ Data from Gart (1971) on the carcinogenic effects of a certain fungicide in two strains of mice. Of interest is how the association between \code{group} (Control, Treated) and \code{outcome} (Tumor, No Tumor) varies with \code{sex} and \code{strain} of the mice. Breslow (1976) used this data to illustrate the application of linear models to log odds ratios. } \usage{data(Fungicide)} \format{ The data comprise a set of four 2 x 2 tables classifying 403 mice, either Control or Treated and whether or not a tumor was later observed. The four groups represent the combinations of sex and strain of mice. The format is: num [1:2, 1:2, 1:2, 1:2] 5 4 74 12 3 2 84 14 10 4 ... - attr(*, "dimnames")=List of 4 ..$ group : chr [1:2] "Control" "Treated" ..$ outcome: chr [1:2] "Tumor" "NoTumor" ..$ sex : chr [1:2] "M" "F" ..$ strain : chr [1:2] "1" "2" } \details{ All tables have some small cells, so a continuity correction is recommended. } \source{ Gart, J. J. (1971). The comparison of proportions: a review of significance tests, confidence intervals and adjustments for stratification. \emph{International Statistical Review}, 39, 148-169. } \references{ Breslow, N. (1976), Regression analysis of the log odds ratio: A method for retrospective studies, \emph{Biometrics}, 32(3), 409-416. } \examples{ data(Fungicide) # loddsratio was moved to vcd; requires vcd_1.3-3+ \dontrun{ if (require(vcd)) { fung.lor <- loddsratio(Fungicide, correct=TRUE) fung.lor confint(fung.lor) } } # visualize odds ratios in fourfold plots cotabplot(Fungicide, panel=cotab_fourfold) # -- fourfold() requires vcd >= 1.2-10 fourfold(Fungicide, p_adjust_method="none") } \keyword{datasets} vcdExtra/man/Vietnam.Rd0000644000176200001440000000330313164013351014473 0ustar liggesusers\name{Vietnam} \alias{Vietnam} \docType{data} \title{ Student Opinion about the Vietnam War } \description{ A survey of student opinion on the Vietnam War was taken at the University of North Carolina at Chapel Hill in May 1967 and published in the student newspaper. Students were asked to fill in ballot papers stating which policy out of A,B,C or D they supported. Responses were cross-classified by gender/year. The response categories were: \describe{ \item{\code{A}}{Defeat North Vietnam by widespread bombing and land invasion} \item{\code{B}}{Maintain the present policy} \item{\code{C}}{De-escalate military activity, stop bombing and begin negotiations} \item{\code{D}}{Withdraw military forces Immediately} } } \usage{data(Vietnam)} \format{ A frequency data frame with 40 observations representing a 2 x 5 x 4 contingency table on the following 4 variables. \describe{ \item{\code{sex}}{a factor with levels \code{Female} \code{Male}} \item{\code{year}}{year of study, an ordered factor with levels \code{Freshmen}, \code{Sophomore}, \code{Junior}, \code{Senior}, \code{Grad student}} \item{\code{response}}{a factor with levels \code{A} \code{B} \code{C} \code{D}} \item{\code{Freq}}{cell frequency, a numeric vector} } } \details{ For some analyses, it is useful to treat \code{year} as numeric, and possibly assign grad students a value \code{year=7}. } \source{ Aitken, M. etal, 1989, \emph{Statistical Modelling in GLIM} } \references{ Friendly, M. (2000), \emph{Visualizing Categorical Data}, SAS Institute, Cary, NC, Example 7.9. } \examples{ data(Vietnam) ## maybe str(Vietnam) ; plot(Vietnam) ... } \keyword{datasets} vcdExtra/man/expand.dft.Rd0000644000176200001440000000445713164013351015136 0ustar liggesusers\name{expand.dft} \alias{expand.dft} \alias{expand.table} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Expand a frequency table to case form} \description{ Converts a frequency table, given either as a table object or a data frame in frequency form to a data frame representing individual observations in the table. } \usage{ expand.dft(x, var.names = NULL, freq = "Freq", ...) expand.table(x, var.names = NULL, freq = "Freq", ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{A table object, or a data frame in frequency form containing factors and one numeric variable representing the cell frequency for that combination of factors. } \item{var.names}{A list of variable names for the factors, if you wish to override those already in the table} \item{freq}{The name of the frequency variable in the table} \item{\dots}{Other arguments passed down to \code{type.convert}. In particular, pay attention to \code{na.strings} (default: \code{na.strings=NA} if there are missing cells) and \code{as.is} (default: \code{as.is=FALSE}, converting character vectors to factors).} } \details{ \code{expand.table} is a synonym for \code{expand.dft}. } \value{ A data frame containing the factors in the table and as many observations as are represented by the total of the \code{freq} variable. } \references{ Originally posted on R-Help, Jan 20, 2009, http://tolstoy.newcastle.edu.au/R/e6/help/09/01/1873.html Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. } \author{ Mark Schwarz } %\note{ ~~further notes~~ % ~Make other sections like Warning with \section{Warning }{....} ~ %} \seealso{ \code{\link[utils]{type.convert}}, \code{\link[gnm]{expandCategorical}}} \examples{ library(vcd) art <- xtabs(~Treatment + Improved, data = Arthritis) art artdf <- expand.dft(art) str(artdf) # 1D case (tab <- table(sample(head(letters), 20, replace=TRUE))) expand.table(tab, var.names="letter") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{manip} \keyword{array} % __ONLY ONE__ keyword per line vcdExtra/man/Dyke.Rd0000644000176200001440000000504413164013351013770 0ustar liggesusers\name{Dyke} \Rdversion{1.1} \alias{Dyke} \docType{data} \title{Sources of Knowledge of Cancer} \description{Observational data on a sample of 1729 individuals, cross-classified in a 2^5 table according to their sources of information (read newspapers, listen to the radio, do 'solid' reading, attend lectures) and whether they have good or poor knowledge regarding cancer. Knowledge of cancer is often treated as the response.} \usage{ data(Dyke) } \format{ A 5-dimensional array resulting from cross-tabulating 5 variables for 1729 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Knowledge}\tab \code{"Good", "Poor"}\cr 2\tab \code{Reading}\tab \code{"No", "Yes"}\cr 3\tab \code{Radio}\tab \code{"No", "Yes"}\cr 4\tab \code{Lectures}\tab \code{"No", "Yes"}\cr 5\tab \code{Newspaper}\tab \code{"No", "Yes"}\cr } } %\details{ } \source{ % \cite{Fienberg:80 [Table 5-6]} Fienberg, S. E. (1980). \emph{The Analysis of Cross-Classified Categorical Data} Cambridge, MA: MIT Press, p. 85, Table 5-6. } \references{ Dyke, G. V. and Patterson, H. D. (1952). Analysis of factorial arrangements when the data are proportions. \emph{Biometrics}, 8, 1-12. Lindsey, J. K. (1993). \emph{Models for Repeated Measurements} Oxford, UK: Oxford University Press, p. 57. } %\seealso{ } \examples{ data(Dyke) # independence model mosaic(Dyke, shade=TRUE) # null model, Knowledge as response, independent of others require(MASS) dyke.mod0 <- loglm(~ Knowledge + (Reading * Radio * Lectures * Newspaper), data=Dyke) dyke.mod0 mosaic(dyke.mod0) # view as doubledecker plot Dyke <- Dyke[2:1,,,,] # make Good the highlighted value of Knowledge doubledecker(Knowledge ~ ., data=Dyke) # better version, with some options doubledecker(Knowledge ~ Lectures + Reading + Newspaper + Radio, data=Dyke, margins = c(1,6, length(dim(Dyke)) + 1, 1), fill_boxes=list(rep(c("white", gray(.90)),4)) ) # separate (conditional) plots for those who attend lectures and those who do not doubledecker(Knowledge ~ Reading + Newspaper + Radio, data=Dyke[,,,1,], main="Do not attend lectures", margins = c(1,6, length(dim(Dyke)) + 1, 1), fill_boxes=list(rep(c("white", gray(.90)),3)) ) doubledecker(Knowledge ~ Reading + Newspaper + Radio, data=Dyke[,,,2,], main="Attend lectures", margins = c(1,6, length(dim(Dyke)) + 1, 1), fill_boxes=list(rep(c("white", gray(.90)),3)) ) drop1(dyke.mod0, test="Chisq") } \keyword{datasets} vcdExtra/man/vcdExtra-deprecated.Rd0000644000176200001440000000126013164013351016746 0ustar liggesusers\name{vcdExtra-deprecated} \alias{vcdExtra-deprecated} \alias{summarise} %\alias{summarise.glm} %\alias{summarise.glmlist} %\alias{summarise.loglm} %\alias{summarise.loglmlist} % \title{Deprecated Functions in vcdExtra Package} % \description{ These functions are provided for compatibility with older versions of the \pkg{vcdExtra} package only. They are replaced by \code{\link{LRstats}}. } % \usage{ summarise(...) %summarise.glm(...) %summarise.glmlist(...) %summarise.loglm(...) %summarise.loglmlist(...) } % \arguments{ \item{\dots}{pass arguments down.} } % \details{ \code{summarise.*} have been replaced by \code{\link{LRstats}} functions. } vcdExtra/man/Mental.Rd0000644000176200001440000000317414202243352014316 0ustar liggesusers\name{Mental} \Rdversion{1.1} \alias{Mental} \docType{data} \title{ Mental impairment and parents SES} \description{ A 6 x 4 contingency table representing the cross-classification of mental health status (\code{mental}) of 1660 young New York residents by their parents' socioeconomic status (\code{ses}). } \usage{data(Mental)} \format{ A data frame frequency table with 24 observations on the following 3 variables. \describe{ \item{\code{ses}}{an ordered factor with levels \code{1} < \code{2} < \code{3} < \code{4} < \code{5} < \code{6}} \item{\code{mental}}{an ordered factor with levels \code{Well} < \code{Mild} < \code{Moderate} < \code{Impaired}} \item{\code{Freq}}{cell frequency: a numeric vector} } } \details{ Both \code{ses} and \code{mental} can be treated as ordered factors or integer scores. For \code{ses}, 1="High" and 6="Low". } \source{ Haberman, S. J. \emph{The Analysis of Qualitative Data: New Developments}, Academic Press, 1979, Vol. II, p. 375. Srole, L.; Langner, T. S.; Michael, S. T.; Kirkpatrick, P.; Opler, M. K. & Rennie, T. A. C. \emph{Mental Health in the Metropolis: The Midtown Manhattan Study}, NYU Press, 1978, p. 289 } \references{ Friendly, M. \emph{Visualizing Categorical Data}, Cary, NC: SAS Institute, 2000, Appendix B.7. } \examples{ data(Mental) str(Mental) (Mental.tab <- xtabs(Freq ~ ses+mental, data=Mental)) # mosaic and sieve plots mosaic(Mental.tab, gp=shading_Friendly) sieve(Mental.tab, gp=shading_Friendly) library(ca) plot(ca(Mental.tab), main="Mental impairment & SES") title(xlab="Dim 1", ylab="Dim 2") } \keyword{datasets} vcdExtra/man/TV.Rd0000644000176200001440000000501513164013351013423 0ustar liggesusers\name{TV} \Rdversion{1.1} \alias{TV} \title{TV Viewing Data} \description{ This data set \code{TV} comprises a 5 x 11 x 3 contingency table based on audience viewing data from Neilsen Media Research for the week starting November 6, 1995. } \usage{data(TV)} \format{ A 5 x 11 x 3 array of cell frequencies with the following structure: \preformatted{ int [1:5, 1:11, 1:3] 146 244 233 174 294 151 181 161 183 281 ... - attr(*, "dimnames")=List of 3 ..$ Day : chr [1:5] "Monday" "Tuesday" "Wednesday" "Thursday" ... ..$ Time : chr [1:11] "8:00" "8:15" "8:30" "8:45" ... ..$ Network: chr [1:3] "ABC" "CBS" "NBC" } } \details{ The original data, \code{tv.dat}, contains two additional networks: "Fox" and "Other", with small frequencies. These levels were removed in the current version. There is also a fourth factor, transition State transition (turn the television Off, Switch channels, or Persist in viewing the current channel). The \code{TV} data here includes only the Persist observations. } \source{ The original data, \code{tv.dat}, came from the initial implementation of mosaic displays in R by Jay Emerson (1998). Similar data had been used by Hartigan and Kleiner (1984) as an illustration. } \references{ Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. Emerson, John W. Mosaic Displays in S-PLUS: A General Implementation and a Case Study. \emph{Statistical Graphics and Computing Newsletter}, 1998, 9(1), 17--23, \url{http://www.stat.yale.edu/~jay/R/mosaic/v91.pdf} Hartigan, J. A. & Kleiner, B. A Mosaic of Television Ratings. \emph{The American Statistician}, 1984, 38, 32-35. } \examples{ data(TV) structable(TV) doubledecker(TV) # reduce number of levels of Time TV.df <- as.data.frame.table(TV) levels(TV.df$Time) <- rep(c("8:00-8:59", "9:00-9:59", "10:00-10:44"), c(4, 4, 3)) TV2 <- xtabs(Freq ~ Day + Time + Network, TV.df) # re-label for mosaic display levels(TV.df$Time) <- c("8", "9", "10") # fit mode of joint independence, showing association of Network with Day*Time mosaic(~ Day + Network + Time, data = TV.df, expected = ~ Day:Time + Network, legend = FALSE) # with doubledecker arrangement mosaic(~ Day + Network + Time, data = TV.df, expected = ~ Day:Time + Network, split = c(TRUE, TRUE, FALSE), spacing = spacing_highlighting, legend = FALSE) } \keyword{datasets} vcdExtra/man/GSS.Rd0000644000176200001440000000174513164013351013534 0ustar liggesusers\name{GSS} \alias{GSS} \docType{data} \title{General Social Survey-- Sex and Party affiliation} \description{ Data from the General Social Survey, 1991, on the relation between sex and party affiliation. } \usage{data(GSS)} \format{ A data frame in frequency form with 6 observations on the following 3 variables. \describe{ \item{\code{sex}}{a factor with levels \code{female} \code{male}} \item{\code{party}}{a factor with levels \code{dem} \code{indep} \code{rep}} \item{\code{count}}{a numeric vector} } } %\details{ % ~~ If necessary, more details than the __description__ above ~~ %} \source{ Agresti, A. Categorical Data Analysis John Wiley & Sons, 2002, Table 3.11, p. 106. } %\references{ % ~~ possibly secondary sources and usages ~~ %} \examples{ data(GSS) ## maybe str(GSS) ; plot(GSS) ... (GSStab <- xtabs(count ~ sex + party, data=GSS)) mod.glm <- glm(count ~ sex + party, family = poisson, data = GSS) } \keyword{datasets} vcdExtra/man/LRstats.Rd0000644000176200001440000000625713164013351014477 0ustar liggesusers\name{LRstats} \alias{LRstats} \alias{LRstats.glmlist} \alias{LRstats.loglmlist} \alias{LRstats.default} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Brief Summary of Model Fit for glm and loglm Models } \description{ For \code{glm} objects, the \code{print} and \code{summary} methods give too much information if all one wants to see is a brief summary of model goodness of fit, and there is no easy way to display a compact comparison of model goodness of fit for a collection of models fit to the same data. All \code{loglm} models have equivalent glm forms, but the \code{print} and \code{summary} methods give quite different results. \code{LRstats} provides a brief summary for one or more models fit to the same dataset for which \code{logLik} and \code{nobs} methods exist (e.g., \code{glm} and \code{loglm} models). %This implementation is experimental, and is subject to change. } \usage{ LRstats(object, ...) \method{LRstats}{glmlist}(object, ..., saturated = NULL, sortby = NULL) \method{LRstats}{loglmlist}(object, ..., saturated = NULL, sortby = NULL) \method{LRstats}{default}(object, ..., saturated = NULL, sortby = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ a fitted model object for which there exists a logLik method to extract the corresponding log-likelihood} \item{\dots}{ optionally more fitted model objects } \item{saturated}{ saturated model log likelihood reference value (use 0 if deviance is not available) } \item{sortby}{ either a numeric or character string specifying the column in the result by which the rows are sorted (in decreasing order)} } \details{ The function relies on residual degrees of freedom for the LR chisq test being available in the model object. This is true for objects inheriting from \code{lm}, \code{glm}, \code{loglm}, \code{polr} and \code{negbin}. } \value{ A data frame (also of class \code{anova}) with columns \code{c("AIC", "BIC", "LR Chisq", "Df", "Pr(>Chisq)")}. Row names are taken from the names of the model object(s). } %\references{ %% ~put references to the literature/web site here ~ %} \author{ Achim Zeileis } %\note{ %% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[stats]{logLik}}, \code{\link[stats]{glm}}, \code{\link[MASS]{loglm}}, \code{\link{logLik.loglm}}, \code{\link{modFit}} } \examples{ data(Mental) indep <- glm(Freq ~ mental+ses, family = poisson, data = Mental) LRstats(indep) Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) coleff <- glm(Freq ~ mental + ses + Rscore:ses, family = poisson, data = Mental) roweff <- glm(Freq ~ mental + ses + mental:Cscore, family = poisson, data = Mental) linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) # compare models LRstats(indep, coleff, roweff, linlin) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{models} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/mosaic.glm.Rd0000644000176200001440000002006514202260745015132 0ustar liggesusers\name{mosaic.glm} \alias{mosaic.glm} \alias{sieve.glm} \alias{assoc.glm} %- Also NEED an '\alias' for EACH other topic documented here. \title{Mosaic plots for fitted generalized linear and generalized nonlinear models } \description{ Produces mosaic plots (and other plots in the \code{\link[vcd]{strucplot}} framework) for a log-linear model fitted with \code{\link[stats]{glm}} or for a generalized nonlinear model fitted with \code{\link[gnm]{gnm}}. These methods extend the range of strucplot visualizations well beyond the models that can be fit with \code{\link[MASS]{loglm}}. They are intended for models for counts using the Poisson family (or quasi-poisson), but should be sensible as long as (a) the response variable is non-negative and (b) the predictors visualized in the \code{strucplot} are discrete factors. } \usage{ \method{mosaic}{glm}(x, formula = NULL, panel = mosaic, type = c("observed", "expected"), residuals = NULL, residuals_type = c("pearson", "deviance", "rstandard"), gp = shading_hcl, gp_args = list(), ...) \method{sieve}{glm}(x, ...) \method{assoc}{glm}(x, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A \code{glm} or \code{gnm} object. The response variable, typically a cell frequency, should be non-negative. } \item{formula}{ A one-sided formula with the indexing factors of the plot separated by '+', determining the order in which the variables are used in the mosaic. A formula must be provided unless \code{x$data} inherits from class \code{"table"} -- in which case the indexing factors of this table are used, or the factors in \code{x$data} (or model.frame(x) if \code{x$data} is an environment) exactly cross-classify the data -- in which case this set of cross-classifying factors are used. } \item{panel}{Panel function used to draw the plot for visualizing the observed values, residuals and expected values. Currently, one of \code{"mosaic"}, \code{"assoc"}, or \code{"sieve"} in \code{vcd}.} \item{type}{A character string indicating whether the \code{"observed"} or the \code{"expected"} values of the table should be visualized by the area of the tiles or bars.} \item{residuals}{ An optional array or vector of residuals corresponding to the cells in the data, for example, as calculated by \code{residuals.glm(x)}, \code{residuals.gnm(x)}.} \item{residuals_type}{If the \code{residuals} argument is \code{NULL}, residuals are calculated internally and used in the display. In this case, \code{residual_type} can be \code{"pearson"}, \code{"deviance"} or \code{"rstandard"}. Otherwise (when \code{residuals} is supplied), \code{residuals_type} is used as a label for the legend in the plot. } \item{gp}{Object of class \code{"gpar"}, shading function or a corresponding generating function (see \code{\link[vcd]{strucplot}} Details and \code{\link[vcd]{shadings}}). Ignored if shade = FALSE.} \item{gp_args}{A list of arguments for the shading-generating function, if specified.} \item{\dots}{ Other arguments passed to the \code{panel} function e.g., \code{\link[vcd]{mosaic}} } } \details{ For both poisson family generalized linear models and loglinear models, standardized residuals provided by \code{rstandard} (sometimes called adjusted residuals) are often preferred because they have constant unit asymptotic variance. The \code{sieve} and \code{assoc} methods are simple convenience interfaces to this plot method, setting the panel argument accordingly. } %\note{ %In the current version, the \code{glm} or \code{gnm} object \emph{must} have been fit using %the \code{data} argument to supply a data.frame or table, rather than with variables %in the global environment. %} \value{ The \code{structable} visualized by \code{\link[vcd]{strucplot}} is returned invisibly. } %\references{ ~put references to the literature/web site here ~ } \author{Heather Turner, Michael Friendly, with help from Achim Zeileis} %\note{ %} \seealso{ \code{\link[stats]{glm}}, \code{\link[gnm]{gnm}}, \code{\link[vcd]{plot.loglm}}, \code{\link[vcd]{mosaic}} } \examples{ GSStab <- xtabs(count ~ sex + party, data=GSS) # using the data in table form mod.glm1 <- glm(Freq ~ sex + party, family = poisson, data = GSStab) res <- residuals(mod.glm1) std <- rstandard(mod.glm1) # For mosaic.default(), need to re-shape residuals to conform to data stdtab <- array(std, dim=dim(GSStab), dimnames=dimnames(GSStab)) mosaic(GSStab, gp=shading_Friendly, residuals=stdtab, residuals_type="Std\nresiduals", labeling = labeling_residuals) # Using externally calculated residuals with the glm() object mosaic.glm(mod.glm1, residuals=std, labeling = labeling_residuals, shade=TRUE) # Using residuals_type mosaic.glm(mod.glm1, residuals_type="rstandard", labeling = labeling_residuals, shade=TRUE) ## Ordinal factors and structured associations data(Mental) xtabs(Freq ~ mental+ses, data=Mental) long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) # fit independence model # Residual deviance: 47.418 on 15 degrees of freedom indep <- glm(Freq ~ mental+ses, family = poisson, data = Mental) long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(indep,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals) # or, show as a sieve diagram mosaic(indep, labeling_args = long.labels, panel=sieve, gp=shading_Friendly) # fit linear x linear (uniform) association. Use integer scores for rows/cols Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) mosaic(linlin,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Lin x Lin model") ## Goodman Row-Column association model fits even better (deviance 3.57, df 8) if (require(gnm)) { Mental$mental <- C(Mental$mental, treatment) Mental$ses <- C(Mental$ses, treatment) RC1model <- gnm(Freq ~ ses + mental + Mult(ses, mental), family = poisson, data = Mental) mosaic(RC1model,residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="RC1 model") } ############# UCB Admissions data, fit using glm() structable(Dept ~ Admit+Gender,UCBAdmissions) berkeley <- as.data.frame(UCBAdmissions) berk.glm1 <- glm(Freq ~ Dept * (Gender+Admit), data=berkeley, family="poisson") summary(berk.glm1) mosaic(berk.glm1, gp=shading_Friendly, labeling=labeling_residuals, formula=~Admit+Dept+Gender) # the same, displaying studentized residuals; note use of formula to reorder factors in the mosaic mosaic(berk.glm1, residuals_type="rstandard", labeling=labeling_residuals, shade=TRUE, formula=~Admit+Dept+Gender, main="Model: [DeptGender][DeptAdmit]") ## all two-way model berk.glm2 <- glm(Freq ~ (Dept + Gender + Admit)^2, data=berkeley, family="poisson") summary(berk.glm2) mosaic.glm(berk.glm2, residuals_type="rstandard", labeling = labeling_residuals, shade=TRUE, formula=~Admit+Dept+Gender, main="Model: [DeptGender][DeptAdmit][AdmitGender]") anova(berk.glm1, berk.glm2, test="Chisq") # Add 1 df term for association of [GenderAdmit] only in Dept A berkeley <- within(berkeley, dept1AG <- (Dept=='A')*(Gender=='Female')*(Admit=='Admitted')) berkeley[1:6,] berk.glm3 <- glm(Freq ~ Dept * (Gender+Admit) + dept1AG, data=berkeley, family="poisson") summary(berk.glm3) mosaic.glm(berk.glm3, residuals_type="rstandard", labeling = labeling_residuals, shade=TRUE, formula=~Admit+Dept+Gender, main="Model: [DeptGender][DeptAdmit] + DeptA*[GA]") anova(berk.glm1, berk.glm3, test="Chisq") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{hplot} \keyword{models} \keyword{multivariate} % __ONLY ONE__ keyword per line vcdExtra/man/CMHtest.Rd0000644000176200001440000002046114202261165014405 0ustar liggesusers\name{CMHtest} \alias{CMHtest} \alias{CMHtest.formula} \alias{CMHtest.default} \alias{Cochran Mantel Haenszel test} \alias{print.CMHtest} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Generalized Cochran-Mantel-Haenszel Tests } \description{ Provides generalized Cochran-Mantel-Haenszel tests of association of two possibly ordered factors, optionally stratified other factor(s). With strata, \code{CMHtest} calculates these tests for each level of the stratifying variables and also provides overall tests controlling for the strata. For ordinal factors, more powerful tests than the test for general association (independence) are obtained by assigning scores to the row and column categories. } \usage{ CMHtest(x, ...) \method{CMHtest}{formula}(formula, data = NULL, subset = NULL, na.action = NULL, ...) \method{CMHtest}{default}(x, strata = NULL, rscores = 1:R, cscores = 1:C, types = c("cor", "rmeans", "cmeans", "general"), overall=FALSE, details=overall, ...) \method{print}{CMHtest}(x, digits = max(getOption("digits") - 2, 3), ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A 2+ way contingency table in array form, or a class \code{"table"} object with optional category labels specified in the dimnames(x) attribute. } \item{formula}{a formula specifying the variables used to create a contingency table from \code{data}. This should be a one-sided formula when \code{data} is in array form, and a two-sided formula with a response \code{Freq} if \code{data} is a data frame with a cell frequency variable. For convenience, conditioning formulas can be specified indicating strata. } \item{data}{either a data frame, or an object of class \code{"table"} or \code{"ftable"}. } \item{subset}{an optional vector specifying a subset of observations to be used. } \item{na.action}{a function which indicates what should happen when the data contain \code{NA}s. Ignored if \code{data} is a contingency table } \item{strata}{ For a 3- or higher-way table, the names or numbers of the factors to be treated as strata. By default, the first 2 factors are treated as the main table variables, and all others considered stratifying factors. } \item{rscores}{ Row scores. Either a set of numbers (typically integers, \code{1:R}) or the string \code{"midrank"} for standardized midrank scores, or \code{NULL} to exclude tests that depend on row scores. } \item{cscores}{ Column scores. Same as for row scores. } \item{types}{ Types of CMH tests to compute: Any one or more of \code{c("cor", "cmeans", "rmeans", "general")}, or \code{"ALL"} for all of these. } \item{overall}{ logical. Whether to calculate overall tests, controlling for the stratifying factors. } \item{details}{ logical. Whether to include computational details in the result } \item{\dots}{ Other arguments passed to default method. } \item{digits}{ Digits to print. } } \details{ The standard \eqn{\chi^2} tests for association in a two-way table treat both table factors as nominal (unordered) categories. When one or both factors of a two-way table are quantitative or ordinal, more powerful tests of association may be obtained by taking ordinality into account using row and or column scores to test for linear trends or differences in row or column means. The CMH analysis for a two-way table produces generalized Cochran-Mantel-Haenszel statistics (Landis etal., 1978). These include the CMH \bold{correlation} statistic (\code{"cor"}), treating both factors as ordered. For a given statum, with equally spaced row and column scores, this CMH statistic reduces to \eqn{(n-1) r^2}, where \eqn{r} is the Pearson correlation between X and Y. With \code{"midrank"} scores, this CMH statistic is analogous to \eqn{(n-1) r_S^2}, using the Spearman rank correlation. The \bold{ANOVA} (row mean scores and column mean scores) statistics, treat the columns and rows respectively as ordinal, and are sensitive to mean shifts over columns or rows. These are transforms of the \eqn{F} statistics from one-way ANOVAs with equally spaced scores and to Kruskal-Wallis tests with \code{"midrank"} scores. The CMH \bold{general} association statistic treat both factors as unordered, and give a test closely related to the Pearson \eqn{\chi^2} test. When there is more than one stratum, the overall general CMH statistic gives a stratum-adjusted Pearson \eqn{\chi^2}, equivalent to what is calculated by \code{\link[stats]{mantelhaen.test}}. For a 3+ way table, one table of CMH tests is produced for each combination of the factors identified as \code{strata}. If \code{overall=TRUE}, an additional table is calculated for the same two primary variables, controlling for (pooling over) the \code{strata} variables. These overall tests implicitly assume no interactions between the primary variables and the strata and they will have low power in the presence of interactions. } \value{ An object of class \code{"CMHtest"} , a list with the following 4 components: \item{table}{A matrix containing the test statistics, with columns \code{Chisq}, \code{Df} and \code{Prob} } \item{names}{The names of the table row and column variables} \item{rscore}{Row scores} \item{cscore}{Column scores} If \code{details==TRUE}, additional components are included. If there are strata, the result is a list of \code{"CMHtest"} objects. If \code{overall=TRUE} another component, labeled \code{ALL} is appended to the list. } \references{ Stokes, M. E. & Davis, C. S. & Koch, G., (2000). \emph{Categorical Data Analysis using the SAS System}, 2nd Ed., Cary, NC: SAS Institute, pp 74-75, 92-101, 124-129. Details of the computation are given at: \url{http://support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#statug_freq_a0000000648.htm } Cochran, W. G. (1954), Some Methods for Strengthening the Common \eqn{\chi^2} Tests, \emph{Biometrics}, 10, 417-451. Landis, R. J., Heyman, E. R., and Koch, G. G. (1978). Average Partial Association in Three-way Contingency Tables: A Review and Discussion of Alternative Tests, \emph{International Statistical Review}, \bold{46}, 237-254. Mantel, N. (1963), Chi-square Tests with One Degree of Freedom: Extensions of the Mantel-Haenszel Procedure," \emph{Journal of the American Statistical Association}, 58, 690-700. } \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[coin]{cmh_test}} provides the CMH test of general association; \code{\link[coin]{lbl_test}} provides the CMH correlation test of linear by linear association. \code{\link[stats]{mantelhaen.test}} provides the overall general Cochran-Mantel-Haenszel chi-squared test of the null that two nominal variables are conditionally independent in each stratum, assuming that there is no three-way interaction } \examples{ data(JobSat, package="vcdExtra") CMHtest(JobSat) CMHtest(JobSat, rscores="midrank", cscores="midrank") # formula interface CMHtest(~ ., data=JobSat) # A 3-way table (both factors ordinal) data(MSPatients, package="vcd") CMHtest(MSPatients) # also calculate overall tests, controlling for Patient CMHtest(MSPatients, overall=TRUE) # compare with mantelhaen.test mantelhaen.test(MSPatients) # formula interface CMHtest(~ ., data=MSPatients, overall=TRUE) # using a frequency data.frame CMHtest(xtabs(Freq~ses+mental, data=Mental)) # or, more simply CMHtest(Freq~ses+mental, data=Mental) # conditioning formulae CMHtest(Freq~right+left|gender, data=VisualAcuity) CMHtest(Freq ~ attitude+memory|education+age, data=Punishment) # Stokes etal, Table 5.1, p 92: two unordered factors parties <- matrix( c(221, 160, 360, 140, 200, 291, 160, 311, 208, 106, 316, 97), nrow=3, ncol=4, byrow=TRUE) dimnames(parties) <- list(party=c("Dem", "Indep", "Rep"), neighborhood=c("Bayside", "Highland", "Longview", "Sheffield")) CMHtest(parties, rscores=NULL, cscores=NULL) # compare with Pearson chisquare chisq.test(parties) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{htest} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Titanicp.Rd0000644000176200001440000000402613771414014014653 0ustar liggesusers\name{Titanicp} \alias{Titanicp} \docType{data} \title{ Passengers on the Titanic } \description{ Data on passengers on the RMS Titanic, excluding the Crew and some individual identifier variables. } \usage{data(Titanicp)} \format{ A data frame with 1309 observations on the following 6 variables. \describe{ \item{\code{pclass}}{a factor with levels \code{1st} \code{2nd} \code{3rd}} \item{\code{survived}}{a factor with levels \code{died} \code{survived}} \item{\code{sex}}{a factor with levels \code{female} \code{male}} \item{\code{age}}{passenger age in years (or fractions of a year, for children), a numeric vector; age is missing for 263 of the passengers} \item{\code{sibsp}}{number of siblings or spouses aboard, integer: \code{0:8}} \item{\code{parch}}{number of parents or children aboard, integer: \code{0:6}} } } \details{ There are a number of related versions of the Titanic data, in various formats. This version was derived from \code{ptitanic} in the \pkg{rpart.plot} package, modifying it to remove the \code{Class 'labelled'} attributes for some variables (inherited from Frank Harrell's \code{titanic3} version) which caused problems with some applications, notably \code{ggplot2}. Other versions: \code{\link[datasets]{Titanic}} is the 4-way frequency table of all 2201 people aboard the Titanic, including passengers and crew. } \source{ The original R source for this dataset was compiled by Frank Harrell and Robert Dawson: \url{https://biostat.app.vumc.org/wiki/pub/Main/DataSets/titanic.html}, described in more detail in \url{https://biostat.app.vumc.org/wiki/pub/Main/DataSets/titanic3info.txt} For this version of the Titanic data, passenger details were deleted, survived was cast as a factor, and the name changed to \code{Titanicp} to minimize confusion with other versions. } %\references{ %%% ~~ possibly secondary sources and usages ~~ %} \examples{ data(Titanicp) ## maybe str(Titanicp) ; plot(Titanicp) ... } \keyword{datasets} vcdExtra/man/Cancer.Rd0000644000176200001440000000211613164013351014264 0ustar liggesusers\name{Cancer} \Rdversion{1.1} \alias{Cancer} \docType{data} \title{Survival of Breast Cancer Patients} \description{Three year survival of 474 breast cancer patients according to nuclear grade and diagnostic center.} \usage{ data(Cancer) } \format{ A 3-dimensional array resulting from cross-tabulating 3 variables for 474 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Survival}\tab \code{"Died", "Surv"}\cr 2\tab \code{Grade}\tab \code{"Malignant", "Benign"}\cr 3\tab \code{Center}\tab \code{"Boston", "Glamorgan"}\cr } } %\details { } \source{ % \cite{Lindsey:95 [p38]} % \cite{Whittaker:90} Lindsey, J. K. (1995). Analysis of Frequency and Count Data Oxford, UK: Oxford University Press. p. 38, Table 2.5. Whittaker, J. (1990) Graphical Models in Applied Multivariate Statistics New York: John Wiley and Sons, p. 220. } %\references{ % \cite{Morrison etal} %} %\seealso { } \examples{ data(Cancer) # example goes here } \keyword{datasets} vcdExtra/man/datasets.Rd0000644000176200001440000000424213164013351014703 0ustar liggesusers\name{datasets} \alias{datasets} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Information on Data Sets in Packages } \description{ The \code{\link[utils]{data}} function is used both to load data sets from packages, and give a display of the names and titles of data sets in one or more packages, however it does not return a result that can be easily used to get additional information about the nature of data sets in packages. The \code{datasets()} function is designed to produce a more useful summary display of data sets in one or more packages. It extracts the \code{class} and dimension information (\code{dim} or code{length}) of each item, and formats these to provide additional descriptors. } \usage{ datasets(package, allClass=FALSE, incPackage=length(package) > 1, maxTitle=NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{package}{ a character vector giving the package(s) to look in } \item{allClass}{ include all classes of the item (\code{TRUE}) or just the last class (\code{FALSE})? } \item{incPackage}{ include the package name in result? } \item{maxTitle}{ maximum length of data set Title } } \details{ The requested packages must be installed, and are silently loaded in order to extract \code{class} and size information. } \value{ A \code{data.frame} whose rows correspond to data sets found in \code{package}. The columns (for a single package) are: \item{Item}{data set name} \item{class}{class} \item{dim}{an abbreviation of the dimensions of the data set} \item{Title}{data set title} } %\references{ %%% ~put references to the literature/web site here ~ %} \author{ Michael Friendly, with R-help from Curt Seeliger } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[utils]{data}}, } \examples{ datasets("vcdExtra") datasets(c("vcd", "vcdExtra")) datasets("datasets", maxTitle=50) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{package} \keyword{data}% __ONLY ONE__ keyword per line vcdExtra/man/zero.test.Rd0000644000176200001440000000472014202266761015042 0ustar liggesusers\name{zero.test} \alias{zero.test} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Score test for zero inflation in Poisson data } \description{ Carries out a simple score test (van den Broek, 1995) for excess zeros in an otherwise Poisson distribution of counts. It gives a \eqn{\chi^2_1} statistic on one degree of freedom. } \usage{ zero.test(x) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A vector of non-negative counts, or a one-way frequency table of such counts. } } \details{ The test first calculates the rate estimate from the mean, \eqn{\hat{\lambda} = \bar{x}}. The number of observed zeros, \eqn{n_0} is then compared with the expected number, \eqn{n \hat{p_0}}, where \eqn{\hat{p}_0=\exp[-\hat{\lambda}]}. Then the test statistic is calculated by the formula: \deqn{\frac{(n_0 - n\hat{p}_0)^2}{n\hat{p}_0(1-\hat{p}_0) - n\bar{x}\hat{p}_0^2}} This test statistic has a \eqn{\chi^2_1} distribution. } \value{ Returns invisibly a list of three elements: \item{\code{statistic}}{Description of 'comp1'} \item{\code{df}}{Description of 'comp2'} \item{\code{pvalue}}{Upper tail p-value} } \references{ The original R code came from a Stackexchange question, \url{https://stats.stackexchange.com/questions/118322/how-to-test-for-zero-inflation-in-a-dataset} Van den Broek, J. (1995). A Score Test for Zero Inflation in a Poisson Distribution. \emph{Biometrics}, \bold{51}(2), 738-743. https://www.jstor.org/stable/2532959 Yang, Zhao, James W. Hardin, and Cheryl L. Addy (2010). Score Tests for Zero-Inflation in Overdispersed Count Data. \emph{Communications in Statistics - Theory and Methods} \bold{39} (11) 2008-2030. \doi{10.1080/03610920902948228} } \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} \examples{ # synthetic tests zero.test(rpois(100, 1)) zero.test(rpois(100, 5)) # add some extra zeros zero.test(c(rep(0, 20), rpois(100, 5))) # Articles by Phd candidates data(PhdPubs, package="vcdExtra") zero.test(PhdPubs$articles) phd.tab <- table(PhdPubs$articles) zero.test(phd.tab) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{htest}% use one of RShowDoc("KEYWORDS") %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Hauser79.Rd0000644000176200001440000000737613164013351014515 0ustar liggesusers\name{Hauser79} \alias{Hauser79} \docType{data} \title{ Hauser (1979) Data on Social Mobility } \description{ Hauser (1979) presented this two-way frequency table, cross-classifying occupational categories of sons and fathers in the United States. } \usage{data(Hauser79)} \format{ A frequency data frame with 25 observations on the following 3 variables, representing the cross-classification of 19912 individuals by father's occupation and son's first occupation. \describe{ \item{\code{Son}}{a factor with levels \code{UpNM} \code{LoNM} \code{UpM} \code{LoM} \code{Farm}} \item{\code{Father}}{a factor with levels \code{UpNM} \code{LoNM} \code{UpM} \code{LoM} \code{Farm}} \item{\code{Freq}}{a numeric vector} } } %\details{ %%% ~~ If necessary, more details than the __description__ above ~~ %} \source{ R.M. Hauser (1979), Some exploratory methods for modeling mobility tables and other cross-classified data. In: K.F. Schuessler (Ed.), \emph{Sociological Methodology}, 1980, Jossey-Bass, San Francisco, pp. 413-458. } \references{ Powers, D.A. and Xie, Y. (2008). \emph{Statistical Methods for Categorical Data Analysis}, Bingley, UK: Emerald. } \examples{ data(Hauser79) str(Hauser79) # display table structable(~Father+Son, data=Hauser79) #Examples from Powers & Xie, Table 4.15 # independence model mosaic(Freq ~ Father + Son, data=Hauser79, shade=TRUE) hauser.indep <- gnm(Freq ~ Father + Son, data=Hauser79, family=poisson) mosaic(hauser.indep, ~Father+Son, main="Independence model", gp=shading_Friendly) hauser.quasi <- update(hauser.indep, ~ . + Diag(Father,Son)) mosaic(hauser.quasi, ~Father+Son, main="Quasi-independence model", gp=shading_Friendly) hauser.qsymm <- update(hauser.indep, ~ . + Diag(Father,Son) + Symm(Father,Son)) mosaic(hauser.qsymm, ~Father+Son, main="Quasi-symmetry model", gp=shading_Friendly) #mosaic(hauser.qsymm, ~Father+Son, main="Quasi-symmetry model") # numeric scores for row/column effects Sscore <- as.numeric(Hauser79$Son) Fscore <- as.numeric(Hauser79$Father) # row effects model hauser.roweff <- update(hauser.indep, ~ . + Father*Sscore) LRstats(hauser.roweff) # uniform association hauser.UA <- update(hauser.indep, ~ . + Fscore*Sscore) LRstats(hauser.UA) # uniform association, omitting diagonals hauser.UAdiag <- update(hauser.indep, ~ . + Fscore*Sscore + Diag(Father,Son)) LRstats(hauser.UAdiag) # Levels for Hauser 5-level model levels <- matrix(c( 2, 4, 5, 5, 5, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 5, 5, 5, 4, 1 ), 5, 5, byrow=TRUE) hauser.topo <- update(hauser.indep, ~ . + Topo(Father, Son, spec=levels)) mosaic(hauser.topo, ~Father+Son, main="Topological model", gp=shading_Friendly) hauser.RC <- update(hauser.indep, ~ . + Mult(Father, Son), verbose=FALSE) mosaic(hauser.RC, ~Father+Son, main="RC model", gp=shading_Friendly) LRstats(hauser.RC) # crossings models hauser.CR <- update(hauser.indep, ~ . + Crossings(Father,Son)) mosaic(hauser.topo, ~Father+Son, main="Crossings model", gp=shading_Friendly) LRstats(hauser.CR) hauser.CRdiag <- update(hauser.indep, ~ . + Crossings(Father,Son) + Diag(Father,Son)) LRstats(hauser.CRdiag) # compare model fit statistics modlist <- glmlist(hauser.indep, hauser.roweff, hauser.UA, hauser.UAdiag, hauser.quasi, hauser.qsymm, hauser.topo, hauser.RC, hauser.CR, hauser.CRdiag) sumry <- LRstats(modlist) sumry[order(sumry$AIC, decreasing=TRUE),] # or, more simply LRstats(modlist, sortby="AIC") mods <- substring(rownames(sumry),8) with(sumry, {plot(Df, AIC, cex=1.3, pch=19, xlab='Degrees of freedom', ylab='AIC') text(Df, AIC, mods, adj=c(0.5,-.5), col='red', xpd=TRUE) }) } \keyword{datasets} vcdExtra/man/Cormorants.Rd0000644000176200001440000000612014202255013015214 0ustar liggesusers\name{Cormorants} \alias{Cormorants} \docType{data} \title{ Advertising Behavior by Males Cormorants } \description{ Male double-crested cormorants use advertising behavior to attract females for breeding. In this study by Meagan McRae (2015), cormorants were observed two or three times a week at six stations in a tree-nesting colony for an entire season, April 10, 2014-July 10, 2014. The number of advertising birds was counted and these observations were classified by characteristics of the trees and nests. The goal is to determine how this behavior varies temporally over the season and spatially, as well as with characteristics of nesting sites. } \usage{data("Cormorants")} \format{ A data frame with 343 observations on the following 8 variables. \describe{ \item{\code{category}}{Time of season, divided into 3 categories based on breeding chronology, an ordered factor with levels \code{Pre} < \code{Incubation} < \code{Chicks Present}} \item{\code{week}}{Week of the season} \item{\code{station}}{Station of observations on two different peninsulas in a park, a factor with levels \code{B1} \code{B2} \code{C1} \code{C2} \code{C3} \code{C4}} \item{\code{nest}}{Type of nest, an ordered factor with levels \code{no} < \code{partial} < \code{full}} \item{\code{height}}{Relative height of bird in the tree, an ordered factor with levels \code{low} < \code{mid} < \code{high}} \item{\code{density}}{Number of other nests in the tree, an ordered factor with levels \code{zero} < \code{few} < \code{moderate} < \code{high}} \item{\code{tree_health}}{Health of the tree the bird is advertising in, a factor with levels \code{dead} \code{healthy}} \item{\code{count}}{Number of birds advertising, a numeric vector} } } \details{ Observations were made on only 2 days in weeks 3 and 4, but 3 days in all other weeks. One should use log(days) as an offset, so that the response measures rate. \code{Cormorants$days <- ifelse(Cormorants$week \%in\% 3:4, 2, 3)} } \source{ McRae, M. (2015). Spatial, Habitat and Frequency Changes in Double-crested Cormorant Advertising Display in a Tree-nesting Colony. Unpublished MA project, Environmental Studies, York University. } %\references{ %%% ~~ possibly secondary sources and usages ~~ %} \examples{ data(Cormorants) str(Cormorants) if (require("ggplot2")) { print(ggplot(Cormorants, aes(count)) + geom_histogram(binwidth=0.5) + labs(x="Number of birds advertising")) # Quick look at the data, on the log scale, for plots of `count ~ week`, # stratified by something else. print(ggplot(Cormorants, aes(week, count, color=height)) + geom_jitter() + stat_smooth(method="loess", size=2) + scale_y_log10(breaks=c(1,2,5,10)) + geom_vline(xintercept=c(4.5, 9.5))) } # ### models using week fit1 <-glm(count ~ week + station + nest + height + density + tree_health, data=Cormorants, family = poisson) if (requireNamespace("car")) car::Anova(fit1) # plot fitted effects if (requireNamespace("effects")) plot(effects::allEffects(fit1)) } \keyword{datasets} vcdExtra/man/Mice.Rd0000644000176200001440000000303514202242706013751 0ustar liggesusers\name{Mice} \alias{Mice} \docType{data} \title{ Mice Depletion Data } \description{ Data from Kastenbaum and Lamphiear (1959). The table gives the number of depletions (deaths) in 657 litters of mice, classified by litter size and treatment. This data set has become a classic in the analysis of contingency tables, yet unfortunately little information on the details of the experiment has been published. } \usage{data("Mice")} \format{ A frequency data frame with 30 observations on the following 4 variables, representing a 5 x 2 x 3 contingency table. \describe{ \item{\code{litter}}{litter size, a numeric vector} \item{\code{treatment}}{treatment, a factor with levels \code{A} \code{B}} \item{\code{deaths}}{number of depletions, a factor with levels \code{0} \code{1} \code{2+}} \item{\code{Freq}}{cell frequency, a numeric vector} } } %\details{ %%% ~~ If necessary, more details than the __description__ above ~~ %} \source{ Goodman, L. A. (1983) The analysis of dependence in cross-classifications having ordered categories, using log-linear models for frequencies and log-linear models for odds. \emph{Biometrics}, 39, 149-160. } \references{ Kastenbaum, M. A. & Lamphiear, D. E. (1959) Calculation of chi-square to calculate the no three-factor interaction hypothesis. \emph{Biometrics}, 15, 107-115. } \examples{ data(Mice) # make a table ftable(mice.tab <- xtabs(Freq ~ litter + treatment + deaths, data=Mice)) library(vcd) mosaic(mice.tab, shade=TRUE) } \keyword{datasets} vcdExtra/man/modFit.Rd0000644000176200001440000000373313164013351014321 0ustar liggesusers\name{modFit} \Rdversion{1.1} \alias{modFit} \alias{modFit.loglm} \alias{modFit.glm} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Brief Summary of Model Fit for a glm or loglm Object } \description{ Formats a brief summary of model fit for a \code{glm} or \code{loglm} object, showing the likelihood ratio Chisq (df) value and or AIC. Useful for inclusion in a plot title or annotation. } \usage{ modFit(x, ...) \method{modFit}{glm}(x, stats="chisq", digits=2, ...) \method{modFit}{loglm}(x, stats="chisq", digits=2, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A \code{glm} or \code{loglm} object } \item{\dots}{ Arguments passed down } \item{stats}{ One or more of \code{chisq} or \code{aic}, determining the statistics displayed. } \item{digits}{ Number of digits after the decimal point in displayed statistics. } } %\details{ %%% ~~ If necessary, more details than the description above ~~ %} \value{ A character string containing the formatted values of the chosen statistics. %% ~Describe the value returned %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... } %\references{ %%% ~put references to the literature/web site here ~ %} \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{Summarise}} (soon to be deprecated), \code{\link{LRstats}} } \examples{ data(Mental) require(MASS) (Mental.tab <- xtabs(Freq ~ ses+mental, data=Mental)) (Mental.mod <- loglm(~ses+mental, Mental.tab)) Mental.mod modFit(Mental.mod) # use to label mosaic() mosaic(Mental.mod, main=paste("Independence model,", modFit(Mental.mod))) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{utilities} \keyword{models}% __ONLY ONE__ keyword per line vcdExtra/man/Draft1970.Rd0000644000176200001440000000444514202242540014457 0ustar liggesusers\name{Draft1970} \alias{Draft1970} \docType{data} \title{ USA 1970 Draft Lottery Data } \description{ This data set gives the results of the 1970 US draft lottery, in the form of a data frame. } \usage{data(Draft1970)} \format{ A data frame with 366 observations on the following 3 variables. \describe{ \item{\code{Day}}{day of the year, 1:366} \item{\code{Rank}}{draft priority rank of people born on that day} \item{\code{Month}}{an ordered factor with levels \code{Jan} < \code{Feb} \dots < \code{Dec}} } } \details{ The draft lottery was used to determine the order in which eligible men would be called to the Selective Service draft. The days of the year (including February 29) were represented by the numbers 1 through 366 written on slips of paper. The slips were placed in separate plastic capsules that were mixed in a shoebox and then dumped into a deep glass jar. Capsules were drawn from the jar one at a time. The first number drawn was 258 (September 14), so all registrants with that birthday were assigned lottery number \code{Rank} 1. The second number drawn corresponded to April 24, and so forth. All men of draft age (born 1944 to 1950) who shared a birthdate would be called to serve at once. The first 195 birthdates drawn were later called to serve in the order they were drawn; the last of these was September 24. } \source{ Starr, N. (1997). Nonrandom Risk: The 1970 Draft Lottery, \emph{Journal of Statistics Education}, v.5, n.2 \url{http://jse.amstat.org/v5n2/datasets.starr.html} } \references{ Fienberg, S. E. (1971), "Randomization and Social Affairs: The 1970 Draft Lottery," \emph{Science}, 171, 255-261. \url{https://en.wikipedia.org/wiki/Draft_lottery_(1969)} } \seealso{\code{\link{Draft1970table}} } \examples{ data(Draft1970) # scatterplot plot(Rank ~ Day, data=Draft1970) with(Draft1970, lines(lowess(Day, Rank), col="red", lwd=2)) abline(lm(Rank ~ Day, data=Draft1970), col="blue") # boxplots plot(Rank ~ Month, data=Draft1970, col="bisque") lm(Rank ~ Month, data=Draft1970) anova(lm(Rank ~ Month, data=Draft1970)) # make the table version Draft1970$Risk <- cut(Draft1970$Rank, breaks=3, labels=c("High", "Med", "Low")) with(Draft1970, table(Month, Risk)) } \keyword{datasets} vcdExtra/man/mosaic.glmlist.Rd0000644000176200001440000001267114202244734016032 0ustar liggesusers\name{mosaic.glmlist} \alias{mosaic.glmlist} \alias{mosaic.loglmlist} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Mosaic Displays for \code{glmlist} and \code{logllmlist} Objects } \description{ This function provides a convenient interface for viewing mosaic displays associated with a collection of glm models for frequency tables that have been stored in a \code{glmlist} or \code{loglmlist} object. You can plot either selected models individually, or mosaics for all models in an array of viewports. } \usage{ \method{mosaic}{glmlist}(x, selection, panel=mosaic, type=c("observed", "expected"), legend=ask | !missing(selection), main=NULL, ask=TRUE, graphics=TRUE, rows, cols, newpage=TRUE, ...) \method{mosaic}{loglmlist}(x, selection, panel=mosaic, type=c("observed", "expected"), legend=ask | !missing(selection), main=NULL, ask=TRUE, graphics=TRUE, rows, cols, newpage=TRUE, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ a \code{glmlist} or \code{loglmlist} object } \item{selection}{ the index or name of one \code{glm} or \code{loglm} object in \code{x}. If no selection is specified, a menu of models is presented or all models are plotted. } \item{panel}{ a \code{\link[vcd]{strucplot}} panel function, typically \code{\link[vcd]{mosaic}} or \code{\link[vcd]{sieve}} } \item{type}{ a character string indicating whether the \code{"observed"} or the \code{"expected"} values of the table should be visualized } \item{legend}{ logical: show a legend for residuals in the mosaic display(s)? The default behavior is to include a legend when only a single plot is shown, i.e., if \code{ask} is \code{TRUE} or a \code{selection} has been specified. } \item{main}{ either a logical, or a vector of character strings used for plotting the main title. If main is a logical and \code{TRUE}, the name of the selected glm object is used. } \item{ask}{ logical: should the function display a menu of models, when one is not specified in \code{selection}? If \code{selection} is not supplied and \code{ask} is \code{TRUE} (the default), a menu of model names is presented; if \code{ask} is \code{FALSE}, mosaics for all models are plotted in an array. } \item{graphics}{ logical: use a graphic dialog box when \code{ask=TRUE}? } \item{rows,cols}{ when \code{ask=FALSE}, the number of rows and columns in which to plot the mosaics. } \item{newpage}{ start a new page? (only applies to \code{ask=FALSE}) } \item{\dots}{ other arguments passed to \code{\link{mosaic.glm}} and ultimately to \code{\link[vcd]{mosaic}}. } } \details{ Most details of the plots produced can be controlled via \dots arguments as shown in some of the examples below. In particular, with \code{panel=sieve} you need to also pass \code{gp=shading_Friendly} to get a color version. } \value{ Returns the result of \code{\link{mosaic.glm}}. %% ~Describe the value returned %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... } \references{ David Meyer, Achim Zeileis, and Kurt Hornik (2006). The Strucplot Framework: Visualizing Multi-Way Contingency Tables with vcd. \emph{Journal of Statistical Software}, 17(3), 1-48. % \url{https://www.jstatsoft.org/v17/i03/}, \doi{10.18637/jss.v017.i03}, available as \code{vignette("strucplot", package="vcd")}. } \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{glmlist}}, \code{\link{loglmlist}}, \code{\link{Kway}} \code{\link{mosaic.glm}}, \code{\link[vcd]{mosaic}}, \code{\link[vcd]{strucplot}}, for the many parameters that control the details of mosaic plots. } \examples{ data(JobSatisfaction, package="vcd") # view all pairwise mosaics pairs(xtabs(Freq~management+supervisor+own, data=JobSatisfaction), shade=TRUE, diag_panel=pairs_diagonal_mosaic) modSat <- Kway(Freq ~ management+supervisor+own, data=JobSatisfaction, family=poisson, prefix="JobSat") names(modSat) \dontrun{ mosaic(modSat) # uses menu, if interactive() } mosaic(modSat, "JobSat.1") # model label mosaic(modSat, 2) # model index # supply a formula to determine the order of variables in the mosaic mosaic(modSat, 2, formula=~own+supervisor+management) mosaic(modSat, ask=FALSE) # uses viewports # use a different panel function, label the observed valued in the cells mosaic(modSat, 1, main=TRUE, panel=sieve, gp=shading_Friendly, labeling=labeling_values) data(Mental) indep <- glm(Freq ~ mental+ses, family = poisson, data = Mental) Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) coleff <- glm(Freq ~ mental + ses + Rscore:ses, family = poisson, data = Mental) roweff <- glm(Freq ~ mental + ses + mental:Cscore, family = poisson, data = Mental) linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) # assign names for the plot labels modMental <- glmlist(Indep=indep, ColEff=coleff, RowEff=roweff, `Lin x Lin`=linlin) mosaic(modMental, ask=FALSE, margins=c(3,1,1,2), labeling_args=list(abbreviate_labs=5)) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{hplot} vcdExtra/man/Heart.Rd0000644000176200001440000000146513164013351014142 0ustar liggesusers\name{Heart} \Rdversion{1.1} \alias{Heart} \docType{data} \title{Sex, Occupation and Heart Disease} \description{Classification of individuals by gender, occupational category and occurrence of heart disease} \usage{ data(Heart) } \format{ A 3-dimensional array resulting from cross-tabulating 3 variables for 21522 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Disease}\tab \code{"Disease", "None"}\cr 2\tab \code{Gender}\tab \code{"Male", "Female"}\cr 3\tab \code{Occup}\tab \code{"Unempl", "WhiteCol", "BlueCol"}\cr } } %\details{ } \source{ % \cite{Karger, 1980} Karger, (1980). } %\references{ %} %\seealso{ } \examples{ data(Heart) # example goes here } \keyword{datasets} vcdExtra/man/Mammograms.Rd0000644000176200001440000000220713164013351015172 0ustar liggesusers\name{Mammograms} \alias{Mammograms} \docType{data} \title{ Mammogram Ratings } \description{ Kundel & Polansky (2003) give (possibly contrived) data on a set of 110 mammograms rated by two readers. } \usage{data(Mammograms)} \format{ A frequency table in matrix form. The format is: num [1:4, 1:4] 34 6 2 0 10 8 5 1 2 8 ... - attr(*, "dimnames")=List of 2 ..$ Reader2: chr [1:4] "Absent" "Minimal" "Moderate" "Severe" ..$ Reader1: chr [1:4] "Absent" "Minimal" "Moderate" "Severe" } %\details{ %%% ~~ If necessary, more details than the __description__ above ~~ %} \source{ Kundel, H. L. & Polansky, M. (2003), "Measurement of Observer Agreement", \emph{Radiology}, \bold{228}, 303-308, Table A1 } %\references{ %%% ~~ possibly secondary sources and usages ~~ %} \examples{ data(Mammograms) B <- agreementplot(Mammograms, main="Mammogram ratings") # agreement measures B Kappa(Mammograms) ## other displays mosaic(Mammograms, shade=TRUE) sieve(Mammograms, pop = FALSE, shade = TRUE) labeling_cells(text = Mammograms, gp_text = gpar(fontface = 2, cex=1.75))(as.table(Mammograms)) } \keyword{datasets} vcdExtra/man/Depends.Rd0000644000176200001440000000314213771411575014471 0ustar liggesusers\name{Depends} \alias{Depends} \docType{data} \title{ Dependencies of R Packages } \description{ This one-way table gives the type-token distribution of the number of dependencies declared in 4983 packages listed on CRAN on January 17, 2014. } \usage{data(Depends)} \format{ The format is: 'table' int [1:15(1d)] 986 1347 993 685 375 298 155 65 32 19 ... - attr(*, "dimnames")=List of 1 ..$ Depends: chr [1:15] "0" "1" "2" "3" ... } %\details{ %%% ~~ If necessary, more details than the __description__ above ~~ %} \source{ Using code from \url{https://blog.revolutionanalytics.com/2013/12/a-look-at-the-distribution-of-r-package-dependencies.html} } %\references{ %%% ~~ possibly secondary sources and usages ~~ %} \examples{ data(Depends) plot(Depends, xlab="Number of Dependencies", ylab="Number of R Packages", lwd=8) \dontrun{ # The code below, from Joseph Rickert, downloads and tabulates the data p <- as.data.frame(available.packages(),stringsAsFactors=FALSE) names(p) pkgs <- data.frame(p[,c(1,4)]) # Pick out Package names and Depends row.names(pkgs) <- NULL # Get rid of row names pkgs <- pkgs[complete.cases(pkgs[,2]),] # Remove NAs pkgs$Depends2 <-strsplit(pkgs$Depends,",") # split list of Depends pkgs$numDepends <- as.numeric(lapply(pkgs$Depends2,length)) # Count number of dependencies in list zeros <- c(rep(0,dim(p)[1] - dim(pkgs)[1])) # Account for packages with no dependencies Deps <- as.vector(c(zeros,pkgs$numDepends)) # Set up to tablate Depends <- table(Deps) } } \keyword{datasets} vcdExtra/man/mosaic3d.Rd0000644000176200001440000001660514202243677014615 0ustar liggesusers\name{mosaic3d} \Rdversion{1.1} \alias{mosaic3d} \alias{mosaic3d.default} \alias{mosaic3d.loglm} %- Also NEED an '\alias' for EACH other topic documented here. \title{ 3D Mosaic Plots } \description{ Produces a 3D mosaic plot for a contingency table (or a \code{link[MASS]{loglm}} model) using the \code{\link[rgl]{rgl-package}}. Generalizing the 2D mosaic plot, this begins with a given 3D shape (a unit cube), and successively sub-divides it along the X, Y, Z dimensions according to the table margins, generating a nested set of 3D tiles. The volume of the resulting tiles is therefore proportional to the frequency represented in the table cells. Residuals from a given loglinear model are then used to color or shade each of the tiles. This is a developing implementation. The arguments and details are subject to change. } \usage{ mosaic3d(x, ...) \method{mosaic3d}{loglm}(x, type = c("observed", "expected"), residuals_type = c("pearson", "deviance"), ...) \method{mosaic3d}{default}(x, expected = NULL, residuals = NULL, type = c("observed", "expected"), residuals_type = NULL, shape = rgl::cube3d(alpha = alpha), alpha = 0.5, spacing = 0.1, split_dir = 1:3, shading = shading_basic, interpolate=c(2,4), zero_size=.05, label_edge, labeling_args = list(), newpage = TRUE, box=FALSE, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ A \code{link[MASS]{loglm}} model object. Alternatively, a multidimensional \code{array} or \code{table} or \code{\link[vcd]{structable}} of frequencies in a contingency table. In the present implementation, the dimensions are taken in sequential order. Use \code{link[base]{aperm}} or \code{\link[vcd]{structable}} to change this. } \item{expected}{ optionally, for contingency tables, an array of expected frequencies of the same dimension as \code{x}, or alternatively the corresponding loglinear model specification as used by \code{link[stats]{loglin}} or \code{link[MASS]{loglm}} (see \code{\link[vcd]{structable}} for details).} \item{residuals}{ optionally, an array of residuals of the same dimension as \code{x} (see details). } \item{type}{ a character string indicating whether the \code{"observed"} or the \code{"expected"} frequencies in the table should be visualized by the volume of the 3D tiles. } \item{residuals_type}{ a character string indicating the type of residuals to be computed when none are supplied. If residuals is \code{NULL}, \code{residuals_type} must be one of \code{"pearson"} (default; giving components of Pearson's chi-squared), \code{"deviance"} (giving components of the likelihood ratio chi-squared), or \code{"FT"} for the Freeman-Tukey residuals. The value of this argument can be abbreviated. } \item{shape}{ The initial 3D shape on which the mosaic is based. Typically this is a call to an rgl function, and must produce a \code{shape3d} object. The default is a "unit cube" on (-1, +1), with transparency specified by \code{alpha}. } \item{alpha}{ Specifies the transparency of the 3D tiles used to compose the 3D mosaic. } \item{spacing}{ A number or vector giving the total amount of space used to separate the 3D tiles along each of the dimensions of the table. The values specified are re-cycled to the number of table dimensions. } \item{split_dir}{ A numeric vector composed of the integers \code{1:3} or a character vector composed of \code{c("x", "y", "z")}, where \code{split_dir[i]} specifies the axis along which the tiles should be split for dimension \code{i} of the table. The values specified are re-cycled to the number of table dimensions. } \item{shading}{ A function, taking an array or vector of residuals for the given model, returning a vector of colors. At present, only the default \code{shading=shading_basic} is provided. This is roughly equivalent to the use of the \code{shade} argument in \code{\link[graphics]{mosaicplot}} or to the use of \code{gp=shading_Friendly} in \code{\link[vcd]{mosaic}}. } \item{interpolate}{a vector of interpolation values for the \code{shading} function. } \item{zero_size}{ The radius of a small sphere used to mark zero cells in the display. } \item{label_edge}{ A character vector composed of \code{c("-", "+")} indicating whether the labels for a given table dimension are to be written at the minima (\code{"-"}) or maxima (\code{"+"}) of the \emph{other} dimensions in the plot. The default is \code{rep( c('-', '+'), each=3, length=ndim)}, meaning that the first three table variables are labeled at the minima, and successive ones at the maxima. } \item{labeling_args}{ This argument is intended to be used to specify details of the rendering of labels for the table dimensions, but at present has no effect. } \item{newpage}{ logical indicating whether a new page should be created for the plot or not. } \item{box}{ logical indicating whether a bounding box should be drawn around the plot. } \item{\dots}{ Other arguments passed down to \code{mosaic.default} or 3D functions. } } \details{ Friendly (1995), Friendly [Sect. 4.5](2000) and Theus and Lauer (1999) have all used the idea of 3D mosaic displays to explain various aspects of loglinear models (the iterative proportional fitting algorithm, the structure of various models for 3-way and n-way tables, etc.), but no implementation of 3D mosaics was previously available. For the default method, residuals, used to color and shade the 3D tiles, can be passed explicitly, or, more typically, are computed as needed from observed and expected frequencies. In this case, the expected frequencies are optionally computed for a specified loglinear model given by the \code{expected} argument. For the loglm method, residuals and observed frequencies are calculated from the model object. } \value{ Invisibly, the list of \code{shape3d} objects used to draw the 3D mosaic, with names corresponding to the concatenation of the level labels, separated by ":". } \references{ Friendly, M. (1995). Conceptual and Visual Models for Categorical Data, \emph{The American Statistician}, \bold{49}, 153-160. Friendly, M. \emph{Visualizing Categorical Data}, Cary NC: SAS Institute, 2000. Web materials: \url{http://www.datavis.ca/books/vcd/}. Theus, M. & Lauer, S. R. W. (1999) Visualizing Loglinear Models. \emph{Journal of Computational and Graphical Statistics}, \bold{8}, 396-412. } \author{ Michael Friendly, with the help of Duncan Murdoch and Achim Zeileis } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[vcd]{strucplot}}, \code{\link[vcd]{mosaic}}, \code{\link[graphics]{mosaicplot}} \code{\link[stats]{loglin}}, \code{\link[MASS]{loglm}} for details on fitting loglinear models } \examples{ # 2 x 2 x 2 if(requireNamespace("rgl")){ mosaic3d(Bartlett, box=TRUE) # compare with expected frequencies under model of mutual independence mosaic3d(Bartlett, type="expected", box=TRUE) # 2 x 2 x 3 mosaic3d(Heart, box=TRUE) } \dontrun{ # 2 x 2 x 2 x 3 # illustrates a 4D table mosaic3d(Detergent) # compare 2D and 3D mosaics demo("mosaic-hec") } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{hplot } %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/logLik.loglm.Rd0000644000176200001440000000617013164013351015427 0ustar liggesusers\name{logLik.loglm} \alias{logLik.loglm} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Log-Likelihood of a loglm Object } \description{ Calculates the log-likelihood value of the \code{loglm} model represented by \code{object} evaluated at the estimated coefficients. It allows the use of \code{\link[stats]{AIC}} and \code{\link[stats]{BIC}}, which require that a \code{logLik} method exists to extract the corresponding log-likelihood for the model. } \usage{ \method{logLik}{loglm}(object, ..., zero=1E-10) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ A \code{loglm} object } \item{\dots}{ For compatibility with the S3 generic; not used here } \item{zero}{value used to replace zero frequencies in calculating the log-likelihood} } \details{ If cell frequencies have not been stored with the \code{loglm} object (via the argument \code{keep.frequencies = TRUE}), they are obtained using \code{update}. This function calculates the log-likelihood in a way that allows for non-integer frequencies, such as the case where 0.5 has been added to all cell frequencies to allow for sampling zeros. If the frequencies still contain zero values, those are replaced by the value of \code{start}. For integer frequencies, it gives the same result as the corresponding model fit using \code{\link[stats]{glm}}, whereas \code{\link[stats]{glm}} returns \code{-Inf} if there are any non-integer frequencies. } \value{ Returns an object of class \code{logLik}. This is a number with one attribute, \code{"df"} (degrees of freedom), giving the number of (estimated) parameters in the model. } %\references{ %%% ~put references to the literature/web site here ~ %} \author{ Achim Zeileis } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[MASS]{loglm}}, \code{\link[stats]{AIC}}, \code{\link[stats]{BIC}}, } \examples{ data(Titanic, package="datasets") require(MASS) titanic.mod1 <- loglm(~ (Class * Age * Sex) + Survived, data=Titanic) titanic.mod2 <- loglm(~ (Class * Age * Sex) + Survived*(Class + Age + Sex), data=Titanic) titanic.mod3 <- loglm(~ (Class * Age * Sex) + Survived*(Class + Age * Sex), data=Titanic) logLik(titanic.mod1) AIC(titanic.mod1, titanic.mod2, titanic.mod3) BIC(titanic.mod1, titanic.mod2, titanic.mod3) # compare with models fit using glm() titanic <- as.data.frame(Titanic) titanic.glm1 <- glm(Freq ~ (Class * Age * Sex) + Survived, data=titanic, family=poisson) titanic.glm2 <- glm(Freq ~ (Class * Age * Sex) + Survived*(Class + Age + Sex), data=titanic, family=poisson) titanic.glm3 <- glm(Freq ~ (Class * Age * Sex) + Survived*(Class + Age * Sex), data=titanic, family=poisson) logLik(titanic.glm1) AIC(titanic.glm1, titanic.glm2, titanic.glm3) BIC(titanic.glm1, titanic.glm2, titanic.glm3) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{models} \keyword{htest}% __ONLY ONE__ keyword per line vcdExtra/man/cutfac.Rd0000644000176200001440000000606013164013351014340 0ustar liggesusers\name{cutfac} \alias{cutfac} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Cut a Numeric Variable to a Factor } \description{ \code{cutfac} acts like \code{\link[base]{cut}}, dividing the range of \code{x} into intervals and coding the values in \code{x} according in which interval they fall. However, it gives nicer labels for the factor levels and by default chooses convenient breaks among the values based on deciles. It is particularly useful for plots in which one wants to make a numeric variable discrete for the purpose of getting boxplots, spinograms or mosaic plots. } \usage{ cutfac(x, breaks = NULL, q = 10) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{a numeric vector which is to be converted to a factor by cutting } \item{breaks}{ either a numeric vector of two or more unique cut points or a single number (greater than or equal to 2) giving the number of intervals into which \code{x} is to be cut. } \item{q}{ the number of quantile groups used to define \code{breaks}, if that has not been specified. } } \details{ By default, \code{\link[base]{cut}} chooses breaks by equal lengths of the range of \code{x}, whereas \code{cutfac} uses \code{\link[stats]{quantile}} to choose breaks of roughly equal count. } \value{ A \code{\link[base]{factor}} corresponding to \code{x} is returned %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... } \references{ Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. } \author{ Achim Zeileis } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[base]{cut}}, \code{\link[stats]{quantile}} } \examples{ if (require(AER)) { data("NMES1988", package="AER") nmes <- NMES1988[, c(1, 6:8, 13, 15, 18)] plot(log(visits+1) ~ cutfac(chronic), data = nmes, ylab = "Physician office visits (log scale)", xlab = "Number of chronic conditions", main = "chronic") plot(log(visits+1) ~ cutfac(hospital, c(0:2, 8)), data = nmes, ylab = "Physician office visits (log scale)", xlab = "Number of hospital stays", main = "hospital") } %\donttest{ %# countreg not yet on CRAN %if (require(countreg)) { %data("CrabSatellites", package = "countreg") % %# jittered scatterplot %plot(jitter(satellites) ~ width, data=CrabSatellites, % ylab="Number of satellites (jittered)", xlab="Carapace width", % cex.lab=1.25) %with(CrabSatellites, lines(lowess(width, satellites), col="red", lwd=2)) % %# boxplot, using deciles %plot(satellites ~ cutfac(width), data=CrabSatellites, % ylab="Number of satellites", xlab="Carapace width (deciles)") %} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{manip} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Heckman.Rd0000644000176200001440000000505313164013351014442 0ustar liggesusers\name{Heckman} \Rdversion{1.1} \alias{Heckman} \docType{data} \title{Labour Force Participation of Married Women 1967-1971} \description{1583 married women were surveyed over the years 1967-1971, recording whether or not they were employed in the labor force. The data, originally from Heckman & Willis (1977) provide an example of modeling longitudinal categorical data, e.g., with markov chain models for dependence over time. } \usage{ data(Heckman) } \format{ A 5-dimensional array resulting from cross-tabulating 5 variables for 1583 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{e1971}\tab \code{"71Yes", "No"}\cr 2\tab \code{e1970}\tab \code{"70Yes", "No"}\cr 3\tab \code{e1969}\tab \code{"69Yes", "No"}\cr 4\tab \code{e1968}\tab \code{"68Yes", "No"}\cr 5\tab \code{e1967}\tab \code{"67Yes", "No"}\cr } } \details{ Lindsey (1993) fits an initial set of logistic regression models examining the dependence of employment in 1971 (\code{e1971}) on successive subsets of the previous years, \code{e1970}, \code{e1969}, \dots \code{e1967}. Alternatively, one can examine markov chain models of first-order (dependence on previous year), second-order (dependence on previous two years), etc. } \source{ % \cite{Lindsey:93 [p. 185]} Lindsey, J. K. (1993). \emph{Models for Repeated Measurements} Oxford, UK: Oxford University Press, p. 185. } \references{ % \cite{HeckmanWillis:77} Heckman, J.J. & Willis, R.J. (1977). "A beta-logistic model for the analysis of sequential labor force participation by married women." \emph{Journal of Political Economy}, 85: 27-58 } %\seealso{ } \examples{ data(Heckman) # independence model mosaic(Heckman, shade=TRUE) # same, as a loglm() require(MASS) (heckman.mod0 <- loglm(~ e1971+e1970+e1969+e1968+e1967, data=Heckman)) mosaic(heckman.mod0, main="Independence model") # first-order markov chain: bad fit (heckman.mod1 <- loglm(~ e1971*e1970 + e1970*e1969 +e1969*e1968 + e1968*e1967, data=Heckman)) mosaic(heckman.mod1, main="1st order markov chain model") # second-order markov chain: bad fit (heckman.mod2 <- loglm(~ e1971*e1970*e1969 + e1970*e1969*e1968 +e1969*e1968*e1967, data=Heckman)) mosaic(heckman.mod2, main="2nd order markov chain model") # third-order markov chain: fits OK (heckman.mod3 <- loglm(~ e1971*e1970*e1969*e1968 + e1970*e1969*e1968*e1967, data=Heckman)) mosaic(heckman.mod2, main="3rd order markov chain model") } \keyword{datasets} vcdExtra/man/Bartlett.Rd0000644000176200001440000000275313164013351014661 0ustar liggesusers\name{Bartlett} \Rdversion{1.1} \alias{Bartlett} \docType{data} \title{Bartlett data on plum root cuttings} \description{In an experiment to investigate the effect of cutting length (two levels) and planting time (two levels) on the survival of plum root cuttings, 240 cuttings were planted for each of the 2 x 2 combinations of these factors, and their survival was later recorded. Bartlett (1935) used these data to illustrate a method for testing for no three-way interaction in a contingency table.} \usage{ data(Bartlett) } \format{ A 3-dimensional array resulting from cross-tabulating 3 variables for 960 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Alive}\tab \code{"Alive", "Dead"}\cr 2\tab \code{Time}\tab \code{"Now", "Spring"}\cr 3\tab \code{Length}\tab \code{"Long", "Short"}\cr } } %\details { } \source{ % \cite{Hand-etal:94 [p.15 #19]} Hand, D. and Daly, F. and Lunn, A. D.and McConway, K. J. and Ostrowski, E. (1994). \emph{A Handbook of Small Data Sets}. London: Chapman & Hall, p. 15, # 19. } \references{ % \cite{Bartlett:35} Bartlett, M. S. (1935). Contingency Table Interactions \emph{Journal of the Royal Statistical Society}, Supplement, 1935, 2, 248-252. } %\seealso { } \examples{ data(Bartlett) fourfold(Bartlett, mfrow=c(1,2)) mosaic(Bartlett, shade=TRUE) pairs(Bartlett, gp=shading_Friendly) } \keyword{datasets} vcdExtra/man/Geissler.Rd0000644000176200001440000000473513164013351014657 0ustar liggesusers\name{Geissler} \alias{Geissler} \docType{data} \title{ Geissler's Data on the Human Sex Ratio } \description{ Geissler (1889) published data on the distributions of boys and girls in families in Saxony, collected for the period 1876-1885. The \code{Geissler} data tabulates the family composition of 991,958 families by the number of boys and girls listed in the table supplied by Edwards (1958, Table 1). } \usage{data(Geissler)} \format{ A data frame with 90 observations on the following 4 variables. The rows represent the non-NA entries in Edwards' table. \describe{ \item{\code{boys}}{number of boys in the family, \code{0:12}} \item{\code{girls}}{number of girls in the family, \code{0:12}} \item{\code{size}}{family size: \code{boys+girls}} \item{\code{Freq}}{number of families with this sex composition} } } \details{ The data on family composition was available because, on the birth of a child, the parents had to state the sex of all their children on the birth certificate. These family records are not necessarily independent, because a given family may have had several children during this 10 year period, included as multiple records. } \source{ Edwards, A. W. F. (1958). An Analysis Of Geissler's Data On The Human Sex Ratio. \emph{Annals of Human Genetics}, 23, 6-15. } \references{ Friendly, M. and Meyer, D. (2016). \emph{Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}. Boca Raton, FL: Chapman & Hall/CRC. \url{http://ddar.datavis.ca}. Geissler, A. (1889). \emph{Beitrage zur Frage des Geschlechts verhaltnisses der Geborenen} Z. K. Sachsischen Statistischen Bureaus, 35, n.p. Lindsey, J. K. & Altham, P. M. E. (1998). Analysis of the human sex ratio by using overdispersion models. \emph{Journal of the Royal Statistical Society: Series C (Applied Statistics)}, 47, 149-157. } \seealso{ \code{\link[vcd]{Saxony}}, containing the data for families of size 12. } \examples{ data(Geissler) ## maybe str(Geissler) ; plot(Geissler) ... # reproduce Saxony data, families of size 12 Saxony12<-subset(Geissler, size==12, select=c(boys, Freq)) rownames(Saxony12)<-NULL # make a 1-way table xtabs(Freq~boys, Saxony12) # extract data for other family sizes Saxony11<-subset(Geissler, size==11, select=c(boys, Freq)) rownames(Saxony11)<-NULL Saxony10<-subset(Geissler, size==10, select=c(boys, Freq)) rownames(Saxony10)<-NULL } \keyword{datasets} vcdExtra/man/Yamaguchi87.Rd0000644000176200001440000000756513164013351015174 0ustar liggesusers\name{Yamaguchi87} \alias{Yamaguchi87} \docType{data} \title{ Occupational Mobility in Three Countries } \description{ Yamaguchi (1987) presented this three-way frequency table, cross-classifying occupational categories of sons and fathers in the United States, United Kingdom and Japan. This data set has become a classic for models comparing two-way mobility tables across layers corresponding to countries, groups or time (e.g., Goodman and Hout, 1998; Xie, 1992). The US data were derived from the 1973 OCG-II survey; those for the UK from the 1972 Oxford Social Mobility Survey; those for Japan came from the 1975 Social Stratification and Mobility survey. They pertain to men aged 20-64. } \usage{data(Yamaguchi87)} \format{ A frequency data frame with 75 observations on the following 4 variables. The total sample size is 28887. \describe{ \item{\code{Son}}{a factor with levels \code{UpNM} \code{LoNM} \code{UpM} \code{LoM} \code{Farm}} \item{\code{Father}}{a factor with levels \code{UpNM} \code{LoNM} \code{UpM} \code{LoM} \code{Farm}} \item{\code{Country}}{a factor with levels \code{US} \code{UK} \code{Japan}} \item{\code{Freq}}{a numeric vector} } } \details{ Five status categories -- upper and lower nonmanuals (\code{UpNM}, \code{LoNM}), upper and lower manuals (\code{UpM}, \code{LoM}), and \code{Farm}) are used for both fathers' occupations and sons' occupations. Upper nonmanuals are professionals, managers, and officials; lower nonmanuals are proprietors, sales workers, and clerical workers; upper manuals are skilled workers; lower manuals are semi-skilled and unskilled nonfarm workers; and farm workers are farmers and farm laborers. Some of the models from Xie (1992), Table 1, are fit in \code{demo(yamaguchi-xie)}. } \source{ Yamaguchi, K. (1987). Models for comparing mobility tables: toward parsimony and substance, \emph{American Sociological Review}, vol. 52 (Aug.), 482-494, Table 1 } \references{ Goodman, L. A. and Hout, M. (1998). Statistical Methods and Graphical Displays for Analyzing How the Association Between Two Qualitative Variables Differs Among Countries, Among Groups, Or Over Time: A Modified Regression-Type Approach. \emph{Sociological Methodology}, 28 (1), 175-230. Xie, Yu (1992). The log-multiplicative layer effect model for comparing mobility tables. \emph{American Sociological Review}, 57 (June), 380-395. } \examples{ data(Yamaguchi87) # reproduce Table 1 structable(~ Father + Son + Country, Yamaguchi87) # create table form Yama.tab <- xtabs(Freq ~ Son + Father + Country, data=Yamaguchi87) # define mosaic labeling_args for convenient reuse in 3-way displays largs <- list(rot_labels=c(right=0), offset_varnames = c(right = 0.6), offset_labels = c(right = 0.2), set_varnames = c(Son="Son's status", Father="Father's status") ) ################################### # Fit some models & display mosaics # Mutual independence yama.indep <- glm(Freq ~ Son + Father + Country, data=Yamaguchi87, family=poisson) anova(yama.indep) mosaic(yama.indep, ~Son+Father, main="[S][F] ignoring country") mosaic(yama.indep, ~Country + Son + Father, condvars="Country", labeling_args=largs, main='[S][F][C] Mutual independence') # no association between S and F given country ('perfect mobility') # asserts same associations for all countries yama.noRC <- glm(Freq ~ (Son + Father) * Country, data=Yamaguchi87, family=poisson) anova(yama.noRC) mosaic(yama.noRC, ~~Country + Son + Father, condvars="Country", labeling_args=largs, main="[SC][FC] No [SF] (perfect mobility)") # ignore diagonal cells yama.quasi <- update(yama.noRC, ~ . + Diag(Son,Father):Country) anova(yama.quasi) mosaic(yama.quasi, ~Son+Father, main="Quasi [S][F]") ## see also: # demo(yamaguchi-xie) ## } \keyword{datasets} vcdExtra/man/glmlist.Rd0000644000176200001440000000663213164013351014553 0ustar liggesusers\name{glmlist} \Rdversion{1.1} \alias{glmlist} \alias{loglmlist} \alias{coef.glmlist} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Create a Model List Object } \description{ \code{glmlist} creates a \code{glmlist} object containing a list of fitted \code{glm} objects with their names. \code{loglmlist} does the same for \code{loglm} objects. The intention is to provide object classes to facilitate model comparison, extraction, summary and plotting of model components, etc., perhaps using \code{\link[base]{lapply}} or similar. There exists a \code{\link[stats]{anova.glm}} method for \code{glmlist} objects. Here, a \code{coef} method is also defined, collecting the coefficients from all models in a single object of type determined by \code{result}. } \usage{ glmlist(...) loglmlist(...) \method{coef}{glmlist}(object, result=c("list", "matrix", "data.frame"), ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{\dots}{ One or more model objects, as appropriate to the function, optionally assigned names as in \code{list}. } \item{object}{a \code{glmlist} object} \item{result}{type of the result to be returned} } \details{ The arguments to \code{glmlist} or \code{loglmlist} are of the form \code{value} or \code{name=value}. Any objects which do not inherit the appropriate class \code{glm} or \code{loglm} are excluded, with a warning. In the \code{coef} method, coefficients from the different models are matched by name in the list of unique names across all models. } \value{ An object of class \code{glmlist} \code{loglmlist}, just like a \code{list}, except that each model is given a \code{name} attribute. %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... } %\references{ %%% ~put references to the literature/web site here ~ %} \author{ Michael Friendly; \code{coef} method by John Fox } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ The function \code{\link[Hmisc]{llist}} in package \code{Hmisc} is similar, but perplexingly more general. The function \code{\link[stats]{anova.glm}} also handles \code{glmlist objects} \code{\link{LRstats}} gives LR statistics and tests for a \code{glmlist} object. } \examples{ data(Mental) indep <- glm(Freq ~ mental+ses, family = poisson, data = Mental) Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) coleff <- glm(Freq ~ mental + ses + Rscore:ses, family = poisson, data = Mental) roweff <- glm(Freq ~ mental + ses + mental:Cscore, family = poisson, data = Mental) linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) # use object names mods <- glmlist(indep, coleff, roweff, linlin) names(mods) # assign new names mods <- glmlist(Indep=indep, Col=coleff, Row=roweff, LinxLin=linlin) names(mods) LRstats(mods) coef(mods, result='data.frame') #extract model components unlist(lapply(mods, deviance)) res <- lapply(mods, residuals) boxplot(as.data.frame(res), main="Residuals from various models") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{utilities} \keyword{models}% __ONLY ONE__ keyword per line vcdExtra/man/GKgamma.Rd0000644000176200001440000000430514202242352014376 0ustar liggesusers\name{GKgamma} \alias{GKgamma} \alias{print.GKgamma} %- Also NEED an '\alias' for EACH other topic documented here. \title{Calculate Goodman-Kruskal Gamma for ordered tables} \description{ The Goodman-Kruskal \eqn{\gamma}{gamma} statistic is a measure of association for ordinal factors in a two-way table proposed by Goodman and Kruskal (1954). } \usage{ GKgamma(x, level = 0.95) %\method{print}{GKgamma}{x, digits = 3, ...} } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{A two-way frequency table, in matrix or table form. The rows and columns are considered to be ordinal factors} \item{level}{Confidence level for a significance test of \eqn{\gamma \ne =}{gamma !=0}} % \item{digits}{Number of digits printed by the print method} % \item{...}{Other arguments} } %\details{ % ~~ If necessary, more details than the description above ~~ %} \value{ Returns an object of class \code{"GKgamma"} with 6 components, as follows % If it is a LIST, use %\describe{ \item{gamma}{The gamma statistic} \item{C}{Total number of concordant pairs in the table} \item{D}{Total number of discordant pairs in the table} \item{sigma}{Standard error of gamma } \item{CIlevel}{Confidence level} \item{CI}{Confidence interval} % } } \references{ Agresti, A. \emph{Categorical Data Analysis}. John Wiley & Sons, 2002, pp. 57--59. Goodman, L. A., & Kruskal, W. H. (1954). Measures of association for cross classifications. \emph{Journal of the American Statistical Association}, 49, 732-764. Goodman, L. A., & Kruskal, W. H. (1963). Measures of association for cross classifications III: Approximate sampling theory. \emph{Journal of the American Statistical Association}, 58, 310-364. } \author{Michael Friendly; original version by Laura Thompson} %\note{ ~~further notes~~ % % ~Make other sections like Warning with \section{Warning }{....} ~ %} \seealso{\code{\link[vcd]{assocstats}}, \link[vcd]{Kappa}} \examples{ data(JobSat) GKgamma(JobSat) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{htest} \keyword{category} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Gilby.Rd0000644000176200001440000000342713164013351014145 0ustar liggesusers\name{Gilby} \Rdversion{1.1} \alias{Gilby} \docType{data} \title{Clothing and Intelligence Rating of Children} \description{Schoolboys were classified according to their clothing and to their teachers rating of "dullness" (lack of intelligence), in a 5 x 7 table originally from Gilby (1911). Anscombe (1981) presents a slightly collapsed 4 x 6 table, used here, where the last two categories of clothing were pooled as were the first two categories of dullness due to small counts. Both \code{Dullnes} and \code{Clothing} are ordered categories, so models and methods that examine their association in terms of ordinal categories are profitable. } \usage{ data(Gilby) } \format{ A 2-dimensional array resulting from cross-tabulating 2 variables for 1725 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Dullness}\tab \code{"Ment. defective", "Slow", "Slow Intell", "Fairly Intell", "Capable", "V.Able"}\cr 2\tab \code{Clothing}\tab \code{"V.Well clad", "Well clad", "Passable", "Insufficient"}\cr } } %\details{ } \source{ Anscombe, F. J. (1981). \emph{Computing in Statistical Science Through APL}. New York: Springer-Verlag, p. 302 } \references{ % \cite{Gilby & Pearson 1911, from Anscombe 1981, p 302} Gilby, W. H. (1911). On the significance of the teacher's appreciation of general intelligence. \emph{Biometrika}, 8, 93-108 (esp. p. 94). [Quoted by Kendall (1943,..., 1953) Table 13.1, p 320.] } %\seealso{ } \examples{ data(Gilby) mosaic(Gilby, shade=TRUE) # correspondence analysis to see relations among categories if(require(ca)){ ca(Gilby) plot(ca(Gilby)) title(xlab="Dimension 1", ylab="Dimension 2") } } \keyword{datasets} vcdExtra/man/Abortion.Rd0000644000176200001440000000263713164013351014656 0ustar liggesusers\name{Abortion} \Rdversion{1.1} \alias{Abortion} \docType{data} \title{Abortion Opinion Data} \description{Opinions about abortion classified by gender and SES} \usage{ data(Abortion) } \format{ A 3-dimensional array resulting from cross-tabulating 3 variables for 1100 observations. The variable names and their levels are: \tabular{rll}{ No \tab Name \tab Levels \cr 1\tab \code{Sex}\tab \code{"Female", "Male"}\cr 2\tab \code{Status}\tab \code{"Lo", "Hi"}\cr 3\tab \code{Support_Abortion}\tab \code{"Yes", "No"}\cr } } \details{ The combinations of \code{Sex} and \code{Status} represent four independent samples, having fixed \code{Sex}-\code{Status} marginal totals. Thus the \code{Sex:Status} association must be included in any loglinear model. \code{Support_Abortion} is a natural response variable. } \source{ % \cite{Christensen:90 [p. 92]} Christensen, R. (1990). \emph{Log-Linear Models}, New York, NY: Springer-Verlag, p. 92, Example 3.5.2. Christensen, R. (1997). \emph{Log-Linear Models and Logistic Regression}, New York, NY: Springer, p. 100, Example 3.5.2. } %\references{ %} %\seealso { } \examples{ data(Abortion) # example goes here ftable(Abortion) mosaic(Abortion, shade=TRUE) # stratified by Sex fourfold(aperm(Abortion, 3:1)) # stratified by Status fourfold(aperm(Abortion, c(3,1,2))) } \keyword{datasets} vcdExtra/man/mcaplot.Rd0000644000176200001440000000715313164013351014536 0ustar liggesusers\name{mcaplot} \alias{mcaplot} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Simple and enhanced plot of MCA solutions } \description{ This function is intended as an alternative to \code{\link[ca]{plot.mjca}} for plotting multiple correspondence analysis solutions. It provides more flexibility for labeling factor levels and connecting them with lines. It does not support some features of \code{plot.mjca} (centroids, supplementary points, arrows, etc.) } \usage{ mcaplot(obj, map = "symmetric", dim = 1:2, col = c("blue", "red", "brown", "black", "green3", "purple"), pch = 15:20, cex = 1.2, pos = 3, lines = TRUE, lwd = 2, legend = FALSE, legend.pos = "topright", xlab = "_auto_", ylab = "_auto_", rev.axes = c(FALSE, FALSE), ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{obj}{An \code{"mjca"} object} \item{map}{ Character string specifying the map type, i.e., the scaling applied to coordinates for different types of MCA representations. Allowed options include: \code{"symmetric"} (default), \code{"rowprincipal"}, \code{"colprincipal"}, \code{"symbiplot"}, \code{"rowgab"}, \code{"colgab"}, \code{"rowgreen"}, \code{"colgreen"}. See \code{\link[ca]{mjca}} for details. } \item{dim}{Dimensions to plot, an integer vector of length 2} \item{col}{Vector of colors, one for each factor in the MCA} \item{pch}{Vector of point symbols for the category levels, one for each factor} \item{cex}{Character size for points and level labels} \item{pos}{Position of level labels relative to the category points; either a single number or a vector of length equal to the number of category points.} \item{lines}{A logical or an integer vector indicating which factors are to be joined with lines using \code{\link{multilines}}} \item{lwd}{Line width(s) for the lines} \item{legend}{Logical; draw a legend for the factor names?} \item{legend.pos}{Position of the legend in the plot, as in \code{\link[graphics]{legend}}} \item{xlab,ylab}{Labels for horizontal and vertical axes. The default, \code{"_auto_"} means that the function auto-generates a label of the form \code{"Dimension X (xx.x \%)"} } \item{rev.axes}{A logical vector of length 2, where TRUE reverses the direction of the corresponding axis} \item{\dots}{Arguments passed down to \code{plot}} } %\details{ %% ~~ If necessary, more details than the description above ~~ %} \value{ Returns the coordinates of the category points invisibly %% ~Describe the value returned %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... } %\references{ %% ~put references to the literature/web site here ~ %} \author{ Michael Friendly } %\note{ %% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[ca]{mjca}}, \code{\link[ca]{plot.mjca}} \code{\link[ca]{cacoord}} returns CA and MCA coordinates, \code{\link[ca]{multilines}} draw multiple lines according to a factor, } \examples{ require(ca) data(Titanic) titanic.mca <- mjca(Titanic) mcaplot(titanic.mca, legend=TRUE, legend.pos="topleft") data(HairEyeColor) haireye.mca <- mjca(HairEyeColor) mcaplot(haireye.mca, legend=TRUE, cex.lab=1.3) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{hplot} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/ICU.Rd0000644000176200001440000001200614202243452013511 0ustar liggesusers\name{ICU} \alias{ICU} \docType{data} \title{ ICU data set } \description{ The ICU data set consists of a sample of 200 subjects who were part of a much larger study on survival of patients following admission to an adult intensive care unit (ICU), derived from Hosmer, Lemeshow and Sturdivant (2013) and Friendly (2000). The major goal of this study was to develop a logistic regression model to predict the probability of survival to hospital discharge of these patients and to study the risk factors associated with ICU mortality. The clinical details of the study are described in Lemeshow, Teres, Avrunin, and Pastides (1988). This data set is often used to illustrate model selection methods for logistic regression. } \usage{data(ICU)} \format{ A data frame with 200 observations on the following 22 variables. \describe{ % \item{\code{id}}{Patient id code, a numeric vector} \item{\code{died}}{Died before discharge?, a factor with levels \code{No} \code{Yes}} \item{\code{age}}{Patient age, a numeric vector} \item{\code{sex}}{Patient sex, a factor with levels \code{Female} \code{Male}} \item{\code{race}}{Patient race, a factor with levels \code{Black} \code{Other} \code{White}. Also represented here as \code{white}.} \item{\code{service}}{Service at ICU Admission, a factor with levels \code{Medical} \code{Surgical}} \item{\code{cancer}}{Cancer part of present problem?, a factor with levels \code{No} \code{Yes}} \item{\code{renal}}{History of chronic renal failure?, a factor with levels \code{No} \code{Yes}} \item{\code{infect}}{Infection probable at ICU admission?, a factor with levels \code{No} \code{Yes}} \item{\code{cpr}}{Patient received CPR prior to ICU admission?, a factor with levels \code{No} \code{Yes}} \item{\code{systolic}}{Systolic blood pressure at admission (mm Hg), a numeric vector} \item{\code{hrtrate}}{Heart rate at ICU Admission (beats/min), a numeric vector} \item{\code{previcu}}{Previous admission to an ICU within 6 Months?, a factor with levels \code{No} \code{Yes}} \item{\code{admit}}{Type of admission, a factor with levels \code{Elective} \code{Emergency}} \item{\code{fracture}}{Admission with a long bone, multiple, neck, single area, or hip fracture? a factor with levels \code{No} \code{Yes}} \item{\code{po2}}{PO2 from initial blood gases, a factor with levels \code{>60} \code{<=60}} \item{\code{ph}}{pH from initial blood gases, a factor with levels \code{>=7.25} \code{<7.25}} \item{\code{pco}}{PCO2 from initial blood gases, a factor with levels \code{<=45} \code{>45}} \item{\code{bic}}{Bicarbonate (HCO3) level from initial blood gases, a factor with levels \code{>=18} \code{<18}} \item{\code{creatin}}{Creatinine, from initial blood gases, a factor with levels \code{<=2} \code{>2}} \item{\code{coma}}{Level of unconsciousness at admission to ICU, a factor with levels \code{None} \code{Stupor} \code{Coma}} \item{\code{white}}{a recoding of \code{race}, a factor with levels \code{White} \code{Non-white}} \item{\code{uncons}}{a recoding of \code{coma} a factor with levels \code{No} \code{Yes}} } } \details{ Patient ID numbers are the rownames of the data frame. Note that the last two variables \code{white} and \code{uncons} are a recoding of respectively \code{race} and \code{coma} to binary variables. } \source{ M. Friendly (2000), \emph{Visualizing Categorical Data}, Appendix B.4. SAS Institute, Cary, NC. Hosmer, D. W. Jr., Lemeshow, S. and Sturdivant, R. X. (2013) \emph{Applied Logistic Regression}, NY: Wiley, Third Edition. } \references{ Lemeshow, S., Teres, D., Avrunin, J. S., Pastides, H. (1988). Predicting the Outcome of Intensive Care Unit Patients. \emph{Journal of the American Statistical Association}, 83, 348-356. } \examples{ data(ICU) # remove redundant variables (race, coma) ICU1 <- ICU[,-c(4,20)] # fit full model icu.full <- glm(died ~ ., data=ICU1, family=binomial) summary(icu.full) # simpler model (found from a "best" subsets procedure) icu.mod1 <- glm(died ~ age + sex + cancer + systolic + admit + uncons, data=ICU1, family=binomial) summary(icu.mod1) # even simpler model icu.mod2 <- glm(died ~ age + cancer + admit + uncons, data=ICU1, family=binomial) summary(icu.mod2) anova(icu.mod2, icu.mod1, icu.full, test="Chisq") ## Reproduce Fig 6.12 from VCD icu.fit <- data.frame(ICU, prob=predict(icu.mod2, type="response")) # combine categorical risk factors to a single string risks <- ICU[, c("cancer", "admit", "uncons")] risks[,1] <- ifelse(risks[,1]=="Yes", "Cancer", "") risks[,2] <- ifelse(risks[,2]=="Emergency", "Emerg", "") risks[,3] <- ifelse(risks[,3]=="Yes", "Uncons", "") risks <- apply(risks, 1, paste, collapse="") risks[risks==""] <- "(none)" icu.fit$risks <- risks library(ggplot2) ggplot(icu.fit, aes(x=age, y=prob, color=risks)) + geom_point(size=2) + geom_line(size=1.25, alpha=0.5) + theme_bw() + ylab("Probability of death") } \keyword{datasets} vcdExtra/man/seq_mosaic.Rd0000644000176200001440000000641314202244754015227 0ustar liggesusers\name{seq_mosaic} \alias{seq_mosaic} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Sequential Mosaics and Strucplots for an N-way Table } \description{ This function takes an n-way contingency table and plots mosaics for series of sequential models to the 1-, 2-, ... n-way marginal tables, corresponding to a variety of types of loglinear models. } \usage{ seq_mosaic(x, panel = mosaic, type = c("joint", "conditional", "mutual", "markov", "saturated"), plots = 1:nf, vorder = 1:nf, k = NULL, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ a contingency table in array form, with optional category labels specified in the dimnames(x) attribute, or else a data.frame in frequency form, with the frequency variable named \code{"Freq"}. } \item{panel}{ a \code{\link[vcd]{strucplot}} panel function, typically \code{\link[vcd]{mosaic}} or \code{\link[vcd]{sieve}. NOT yet implemented.} } \item{type}{ type of sequential model to fit, a character string. One of \code{"joint"}, \code{"conditional"}, \code{"mutual"}, \code{"markov"}, or \code{"saturated"}. } \item{plots}{ which marginal sub-tables to plot? A vector of a (sub)set of the integers, \code{1:nf} where \code{nf} is the number of factors in the full n-way table. } \item{vorder}{ order of variables, a permutation of the integers \code{1:nf}, used to reorder the variables in the original table for the purpose of fitting sequential marginal models. } \item{k}{ conditioning variable(s) for \code{type} = \code{"joint"}, \code{"conditional"} or Markov chain order for \code{type} = \code{"markov"} } \item{\dots}{ other arguments passed to \code{\link[vcd]{mosaic}}. } } \details{ This function produces similar plots to the use of \code{\link{mosaic.loglmlist}}, called with the result of \code{\link{seq_loglm}}. } \value{ None. Used for its side-effect of producing plots %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... } \references{ These functions were inspired by the original SAS implementation of mosaic displays, described in the \emph{User's Guide}, \url{http://www.datavis.ca/mosaics/mosaics.pdf} } \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{loglin-utilities}} for descriptions of sequential models, \code{\link{conditional}}, \code{\link{joint}}, \code{\link{mutual}}, \dots \code{\link{loglmlist}}, \code{\link{mosaic.loglmlist}}, \code{\link{seq_loglm}} \code{\link{mosaic.glm}}, \code{\link[vcd]{mosaic}}, \code{\link[vcd]{strucplot}}, for the many parameters that control the details of mosaic plots. } \examples{ data(Titanic, package="datasets") seq_mosaic(Titanic) # models of joint independence, Survived last seq_mosaic(Titanic, type="condit") seq_mosaic(Titanic, type="mutual") # other panel functions and options: presently BUGGED \dontrun{ seq_mosaic(Titanic, type="mutual", panel=sieve, gp=shading_Friendly, labeling=labeling_values) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{hplots} vcdExtra/man/update.xtabs.Rd0000644000176200001440000000322013164013351015470 0ustar liggesusers\name{update.xtabs} \alias{update.xtabs} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Update method for a \code{xtabs} object } \description{ Provides an \code{update} method for \code{"xtabs"} objects, typically by removing terms from the formula to collapse over them. } \usage{ \method{update}{xtabs}(object, formula., ..., evaluate = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{An existing \code{"xtabs"} object} \item{formula.}{Changes to the formula ? see \code{\link[stats]{update.formula}} for details} \item{\dots}{Additional arguments to the call, or arguments with changed values. } \item{evaluate}{If \code{TRUE}, evaluate the new call else return the call} } %\details{ %%% ~~ If necessary, more details than the description above ~~ %} \value{ If \code{evaluate == TRUE}, the new \code{"xtabs"} object, otherwise the updated call } %\references{ %%% ~put references to the literature/web site here ~ %} \author{ Michael Friendly } %\note{ %%% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[stats]{update.formula}} for details on updates to model formulae \code{\link[base]{margin.table}} does something similar, \code{\link{collapse.table}} collapses category levels } \examples{ vietnam.tab <- xtabs(Freq ~ sex + year + response, data=Vietnam) update(vietnam.tab, formula = ~ . -year) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{models} %\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line vcdExtra/man/Alligator.Rd0000644000176200001440000000410513164013351015007 0ustar liggesusers\name{Alligator} \alias{Alligator} \docType{data} \title{ Alligator Food Choice } \description{ The Alligator data, from Agresti (2002), comes from a study of the primary food choices of alligators in four Florida lakes. Researchers classified the stomach contents of 219 captured alligators into five categories: Fish (the most common primary food choice), Invertebrate (snails, insects, crayfish, etc.), Reptile (turtles, alligators), Bird, and Other (amphibians, plants, household pets, stones, and other debris). } \usage{data(Alligator)} \format{ A frequency data frame with 80 observations on the following 5 variables. \describe{ \item{\code{lake}}{a factor with levels \code{George} \code{Hancock} \code{Oklawaha} \code{Trafford}} \item{\code{sex}}{a factor with levels \code{female} \code{male}} \item{\code{size}}{alligator size, a factor with levels \code{large} (>2.3m) \code{small} (<=2.3m)} \item{\code{food}}{primary food choice, a factor with levels \code{bird} \code{fish} \code{invert} \code{other} \code{reptile}} \item{\code{count}}{cell frequency, a numeric vector} } } \details{ The table contains a fair number of 0 counts. \code{food} is the response variable. \code{fish} is the most frequent choice, and often taken as a baseline category in multinomial response models. } \source{ Agresti, A. (2002). \emph{Categorical Data Analysis}, New York: Wiley, 2nd Ed., Table 7.1 } %\references{ %%% ~~ possibly secondary sources and usages ~~ %} \examples{ data(Alligator) # change from frequency data.frame to table allitable <- xtabs(count~lake+sex+size+food, data=Alligator) # Agresti's Table 7.1 structable(food~lake+sex+size, allitable) plot(allitable, shade=TRUE) # mutual independence model mosaic(~food+lake+size, allitable, shade=TRUE) # food jointly independent of lake and size mosaic(~food+lake+size, allitable, shade=TRUE, expected=~lake:size+food) if (require(nnet)) { # multinomial logit model mod1 <- multinom(food ~ lake+size+sex, data=Alligator, weights=count) } } \keyword{datasets} vcdExtra/man/Crossings.Rd0000644000176200001440000000366613164013351015056 0ustar liggesusers\name{Crossings} \alias{Crossings} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Crossings Interaction of Factors } \description{ Given two ordered factors in a square, n x n frequency table, \code{Crossings} creates an n-1 column matrix corresponding to different degrees of difficulty in crossing from one level to the next, as described by Goodman (1972). } \usage{ Crossings(...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{\dots}{ Two factors } } %\details{ %% ~~ If necessary, more details than the description above ~~ %} \value{ For two factors of \code{n} levels, returns a binary indicator matrix of \code{n*n} rows and \code{n-1} columns. } \references{ Goodman, L. (1972). Some multiplicative models for the analysis of cross-classified data. In: \emph{Proceedings of the Sixth Berkeley Symposium on Mathematical Statistics and Probability}, Berkeley, CA: University of California Press, pp. 649-696. } \author{ Michael Friendly and Heather Turner } %\note{ %% ~~further notes~~ %} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[stats]{glm}}, \code{\link[gnm]{gnm}} for model fitting functions for frequency tables \code{\link[gnm]{Diag}}, \code{\link[gnm]{Mult}}, \code{\link[gnm]{Symm}}, \code{\link[gnm]{Topo}} for similar extensions to terms in model formulas. } \examples{ data(Hauser79) # display table structable(~Father+Son, data=Hauser79) hauser.indep <- gnm(Freq ~ Father + Son, data=Hauser79, family=poisson) hauser.CR <- update(hauser.indep, ~ . + Crossings(Father,Son)) LRstats(hauser.CR) hauser.CRdiag <- update(hauser.indep, ~ . + Crossings(Father,Son) + Diag(Father,Son)) LRstats(hauser.CRdiag) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{models} \keyword{manip}% __ONLY ONE__ keyword per line vcdExtra/man/HospVisits.Rd0000644000176200001440000000261613164013351015211 0ustar liggesusers\name{HospVisits} \alias{HospVisits} \docType{data} \title{ Hospital Visits Data } \description{ Length of stay in hospital for 132 schizophrenic patients, classified by visiting patterns, originally from Wing (1962). } \usage{data("HospVisits")} \format{ A 3 by 3 frequency table, with format: table [1:3, 1:3] 43 6 9 16 11 18 3 10 16 - attr(*, "dimnames")=List of 2 ..$ visit: chr [1:3] "Regular" "Infrequent" "Never" ..$ stay : chr [1:3] "2-9" "10-19" "20+" } \details{ Both table variables can be considered ordinal. The variable \code{visit} refers to visiting patterns recorded hospital. The category labels are abbreviations of those given by Goodman (1983); e.g., \code{"Regular"} is short for \dQuote{received visitors regularly or patient went home}. The variable \code{stay} refers to length of stay in hospital, in year groups. } \source{ Goodman, L. A. (1983) The analysis of dependence in cross-classifications having ordered categories, using log-linear models for frequencies and log-linear models for odds. \emph{Biometrics}, 39, 149-160. } \references{ Wing, J. K. (1962). Institutionalism in Mental Hospitals, \emph{British Journal of Social and Clinical Psychology}, 1 (1), 38-51. } \examples{ data(HospVisits) mosaic(HospVisits, gp=shading_Friendly) library(ca) ca(HospVisits) # surprisingly 1D ! plot(ca(HospVisits)) } \keyword{datasets} vcdExtra/man/Vote1980.Rd0000644000176200001440000000303013164013351014324 0ustar liggesusers\name{Vote1980} \alias{Vote1980} \docType{data} \title{ Race and Politics in the 1980 Presidential Vote } \description{ Data from the 1982 General Social Survey on votes in the 1980 U.S. presidential election in relation to race and political conservatism. } \usage{data(Vote1980)} \format{ A frequency data frame representing a 2 x 7 x 2 table, with 28 observations on the following 4 variables. \describe{ \item{\code{race}}{a factor with levels \code{NonWhite} \code{White}} \item{\code{conservatism}}{ a factor with levels \code{1} \code{2} \code{3} \code{4} \code{5} \code{6} \code{7}, \code{1}=most liberal, \code{7}=most conservative} \item{\code{votefor}}{a factor with levels \code{Carter} \code{Reagan}; \code{Carter} represents Jimmy Carter or other.} \item{\code{Freq}}{a numeric vector} } } \details{ The data contains a number of sampling zeros in the frequencies of NonWhites voting for Ronald Reagan. } \source{ Clogg, C. & Shockey, J. W. (1988). In Nesselroade, J. R. & Cattell, R. B. (ed.) Multivariate Analysis of Discrete Data, \emph{Handbook of Multivariate Experimental Psychology}, New York: Plenum Press. } \references{ Agresti, A. (1990) \emph{Categorical Data Analysis}, Table 4.12 New York: Wiley-Interscience. Friendly, M. (2000) \emph{Visualizing Categorical Data}, Example 7.5 Cary, NC: SAS Institute. } \examples{ data(Vote1980) fourfold(xtabs(Freq ~ race + votefor + conservatism, data=Vote1980), mfrow=c(2,4)) } \keyword{datasets} vcdExtra/DESCRIPTION0000644000176200001440000000360414202500462013536 0ustar liggesusersPackage: vcdExtra Type: Package Title: 'vcd' Extensions and Additions Version: 0.7-6 Date: 2022-02-12 Language: en-US Authors@R: c(person(given = "Michael", family = "Friendly", role=c("aut", "cre"), email="friendly@yorku.ca"), person(given = "Heather", family = "Turner", role="ctb"), person(given = "Achim", family = "Zeileis", role="ctb"), person(given = "Duncan", family = "Murdoch", role="ctb"), person(given = "David", family = "Firth", role="ctb"), person(given = "Matt", family = "Kumar", role="ctb"), person(given = "Shuguang", family = "Sun", role="ctb") ) Author: Michael Friendly [aut, cre], Heather Turner [ctb], Achim Zeileis [ctb], Duncan Murdoch [ctb], David Firth [ctb], Matt Kumar [ctb], Shuguang Sun [ctb] Maintainer: Michael Friendly Depends: R (>= 2.10), vcd, gnm (>= 1.0-3), grid Suggests: gmodels, Fahrmeir, effects, VGAM, plyr, lmtest, nnet, ggplot2, Sleuth2, car, lattice, stats4, rgl, AER Imports: MASS, grDevices, stats, utils, ca Description: Provides additional data sets, methods and documentation to complement the 'vcd' package for Visualizing Categorical Data and the 'gnm' package for Generalized Nonlinear Models. In particular, 'vcdExtra' extends mosaic, assoc and sieve plots from 'vcd' to handle 'glm()' and 'gnm()' models and adds a 3D version in 'mosaic3d'. Additionally, methods are provided for comparing and visualizing lists of 'glm' and 'loglm' objects. This package is now a support package for the book, "Discrete Data Analysis with R" by Michael Friendly and David Meyer. License: GPL (>= 2) URL: https://CRAN.R-project.org/package=vcdExtra BugReports: https://github.com/friendly/vcdExtra LazyLoad: yes LazyData: yes NeedsCompilation: no Packaged: 2022-02-14 15:45:07 UTC; friendly Repository: CRAN Date/Publication: 2022-02-14 16:20:02 UTC vcdExtra/build/0000755000176200001440000000000014202474400013126 5ustar liggesusersvcdExtra/build/vignette.rds0000644000176200001440000000047714202474400015475 0ustar liggesusers}PN0tmhyQ UަV];JLrʦu%[wVcX(fqBe2cH{B;b)^{l@rsV[e (D\3s0 rjK[(_R#azbϪīR2+vV5X80:X-xd^r+q41q^5vW;[uep=h=WFܩ3z̤rGy rV$=k҅]RK<_|KuTf%{NǑVP8f޷n؏vcdExtra/build/partial.rdb0000644000176200001440000002735714202474366015304 0ustar liggesusers}^ז,_wqlo !`kND'N*AKUJU ̡9=3 9o03[Ja.IiSZ{׾T*NH=D~Nf{؛pqbڊ^̮+evR4顼Q]ޯߴ\n'Sx馿s5Ҕo^Y6MX}0y~(n4 jzo+(݃_6uˊmҁϟ<~tfqXRњaqnꅭYT5C-oO-TKL=6JyjUTN㦲Tʯ:)o6R*1hl^m#6IEr&Nu^ E:X5IcsfmC8p8BoV#8!b컊mR6F<:B*(e]#ri9$d0MٌgǕN8=0{qyHqwt-m=]^^b|=iϙlhs̪^dYU4TRFoٓ'OÊ }$8Ɋs I~8ղm{6,لSJB1u(8_|!W n( pNcrt|dAiƁw@ߑ6{kآY+Gwaj8jLtx%i#P8VXݘZ3njLaE w0m,RԼ໩k[]!"0g|y!Yjݷtg+H3K ֮V[XsGQn aʦ&Z(DsbM f;H7u}mIK$26e]G@$f45 *:҆2k4k ea l[x ZI@"-}Pu7הry;CY?\ lS\\5-Ί@}1K Xʊhm\^('CUOs(9_q"q&CKL¢!  XP~m%TńPќ S`.FMdzaDbhyq2bNCIFs|q|\5kSS3lX{S oz8:^*cem]3y~]-붞W*7#()1*n?}LZIt1Won) -sv uDXv~&Ҳ1f'9  rpMNI6LIE+@o>~sx 7J~HG3o>x?F" 5J /aːPQ e{P]MEK6BEb0pkShqwS/;v W;;^Hg9O1"+pʟ VҌ v~I]ob5!,X(%n X+0"t6}\(qHӠIr0 GKmh% FЙ;Z%"d]; b0x;!a@}C 7qCJD,v jHi;VH!&x R֍W&47j '@~"oS]Kn{_o]^]sq2pt樥?[%~g>d|sП'滟eg|w8'`w҃mj1DA>Zj|W Jg|k|؛iw:CԢLک'iԋPC6t/m!(XS,C457K):tm/*[yCx>s $n 5SCM@ϵ?X~2Ǵ'EЋ ZM*u^uWkT5ͦ*2wdf5mvM)Th@rjr6^>aia:됿/lòNpGd岹Nc9T[LFHoϕީ4վ=V߫ZIBn(bj/-  :(ML F<7?0=eD:$&9jzhcp#Fb-WL$fz_,DZɧEбz6.^!o(U_wr>~Θ[J0PlFD/PJs)|x÷rY:hv.uֈ}nunA Rmi 1$ fH!H+$1pS~-M7Ҟly 4!Q.l݆ oVÒ/n/N)n/6jIJ!֨WAwe< ]OAvH'IQ*hi< 0V 52s68>aSlpZZ 6<:V$%-8⑴*?5@mTy0 weW׻}16)~(<P-1Ou8KKr<qO"Xv?HO?]/Sv9SɵjL9FnjD: /KRsc$0XΚ&3gmgn$ nu<=b'lrzA&'ظ;;"A+Amj|E{QA|&"ĉ3$aQб&'|Y:ΐ\n`{xE8А,?F9 :ֆdRFrg6rgr t>_ i\Ed!U'4x:>,5OsXd!8q zrF/ cM Е;*WOؚ kriA `Md7AZN nx tqC}m;czR]z>a2԰jgfQ OdsH=4 8'=&&(ꂒpD#w(oӥGv+=xH먦cG3ϜZXfmQ!.@Ow9`tNhX_K kt05 |:V _@  izP_7kN2lɰ4^Jd'H`t#&E$bwp R@`[.u^>{ɓtk2Ь_?\Yq=} &w-yH1Az;ERfowvo8~쭸⾁'@Ot^qxULf(%{ efZ?Z!}Iy;TzDO]CbP8$+\VTl*{mkV-7 V˚ngeG5af3ܭh%H<XJE2s+SOhAake[ U'.3ht_3l,fQ2A!`A_7u2EGqtN%gKDu@/%Q*Ս :ޢ =~}…wė5GI&Y ǩsSS[[[_ۮlfYZڜ=OD9[6|pt\"YȎ=7A ǽyaE{Sf\ kk5j1Ͳ=77W_{TSx/83N߹uԯm;u-Q+' g^-|7WӊRf2/ГƉaK\.)B}EDϱP}s,^ }wjeU|WEi{$ m, fikaHW.k9mWI:FUPDYX.+9?=iu"zKmvtst/7,w}aAA/ie;l͸z(OaeF|g:Be tbLT]^_Wڵ96>\Il8܎k o.r;z8 z6J.E9бX\#?C58KQC)hf5e7#궡T⃲By×JBU$eCQ4Xe#lV>YI֓RgK=_m'J-SPaX3rj!&qeT,#;q-m@3gA96N1]uhAO%1w[#ľC<@%{=Q^k?e=Xuw_+tEO|Np(a"BN2%EҴ7ĩ=j]zRmz#Os'O@B@x|Bt^+Uhe3S\f@w`_%kS)fAgp 8A̾VNhKL|l?> <"I';ߊS& MX*4\cᏄgAGscEp1 LnxF|zxI pt[<"s$pD\i| θu dnN T}xVo],ԠqkPG<=7/~/|[zXI/qMshR5s׏jPﴶ"?t`CvikGVP[l պbO̰wmD. n{#QUq/̵$]RKaY`62 x+}06umy^UtkKY%E܆X O(kKF]RbZU6u۴>&or7GD70#욗9C_R_R~@]w , X=y O<3?QT*F$7`>ݷlVɨ4᝾BI_Q"k5\pt̿ѻG {^c-a"3҉][;5ج*RsUG vm ZB4m)` G(ۆYu{^_Ǜ&~O@s}6DяU/(ю` wv|o߾2Π\!;^%8B}$ZK;#TR!ż΃[̦6e1 Iygݧ']-#xO@nAw({)2f=|I"Ev;7^jd\0s-Ju%!́kH^]V͛nϸq~9=7硡^; }*! B=m=MF1@ C@G=,`' W?]a0HYH$҉$-qcOA?OpG]m^kK EʦS*\iSlhG}ZZaн 2z܈XfY>ԁl9lCɤvv%lPs-K!FUf?8X Z_ {ȩV!'9#)I@?]^^b|=y{?GTǬMe/lDZl ym{iYqz6ei)NٓӍR֤칿+*A%V!!TYR{Bf](Bdš x$hQvffa u*]tej3lzvlw8k{>-P?LK#ͺz˫RwhkY3;C]-(DiEC/7g^M 6ި.VPC?Yk.}9x$ŸjW2r"r[FTrQ5+Y!'$Դ&4#ZbP.N &X߈5EiЉX 쮋 -"wqE^dc)6hN[<r;#O̪++qxXx$"~1?憃#Ph[~@*YgC^*toQ)kn{hi+s?+D,XC89c'>8;WPBY[6 kX=?H_}xZZCJOU_;x%BR}*1PY.Bfi0PKœJx|zV0=+w>+tdLܘ,g94rGdš~R?ɬdS Z\m}L{hDlқVsvkY;%t[XD5QO$ XxP#%BJwgRc4aSTMMKxG~;DֵDvށzVK**UxT@WQR c͈VvqTW04*P_p:Ր0S?v t44bhh_&pYc*(*iT U/Uv8Yu^Z*ХTQzh'(k=aRhjɇ5F ʍʊC38#;5,n(egTQYQ`Pa+R|)n(ƺ~2)l9ۥV 1iY96S33S֤cNDdɴ&ijۥ&Imk-&8T@+ zzu9i1 jܰE{“A(BnZROpla58-[x[P;*gCrbHVumA&S$1&O&iP{I)бfTÇg7#gx[>Xa?KW(@x=8<}׳,htrgfoΊV+"gYpٗnan(=<_g犥F)74kg)/6Mb)L8 zVZjףdCt}a=NԊ! A'VJfEOrJ0iI Mk3/hB6Xhbax &w3QYgc_h>CO >8'L.wgr&w='^HE*rg%Rv_p~:Mߚfs37܉(B /,ZHz1>^%hqR8RG=scjf/עG?µRA/VWEl>KDt`kIL*IGľAc}gfľ&ٺ(5I]u_xh[olwU17d>;I4 V#?e>׈:&1c`xC9|E^H4xL9qne6O↢YpSXrBiblҚmxF񽤡ܣ}Q;QjNnru^-ľdveݻRrBwĵM;%bC)-݌kV\.æcε`|.&eȴ|F6+?{t !ER]-:n&7aWgڮ)`2#lrkjY CU#,CExtsa 2ӞqW5;Â+DF]W(W\D.nE;nfe}2gnK@cO !wRRSF=4ܑx<+zhg=Oԍ`>!I1?/ i m7*p%أ_?/6$޳*$V'C~ɞ=]~*_N%u#FZ}WS {];U(- }+s ;k!]'~\pqWN?$מU%nvC$dC`쉽m*ȩּjvcdExtra/vignettes/0000755000176200001440000000000014202474400014037 5ustar liggesusersvcdExtra/vignettes/vcdExtra.bib0000644000176200001440000000113713164013351016277 0ustar liggesusers@ARTICLE{Cohen:60, author = {J. Cohen}, title = {A coefficient of agreement for nominal scales}, journal = {Educational and Psychological Measurement}, year = {1960}, volume = {20}, pages = {37--46}, owner = {Michael}, timestamp = {2009.01.21} } @BOOK{Agresti:2013, title = {Categorical Data Analysis}, publisher = {Wiley-Interscience [John Wiley \& Sons]}, year = {2013}, author = {Agresti, Alan}, series = {Wiley Series in Probability and Statistics}, address = {New York}, edition = {Third}, isbn = {978-0-470-46363-5}, lccn = {QA278.A353 2013} } vcdExtra/vignettes/vcd-tutorial.Rnw0000644000176200001440000023434714202271213017156 0ustar liggesusers% !Rnw weave = Sweave %\VignetteEngine{Sweave} %\VignetteIndexEntry{Tutorial: Working with categorical data with R and the vcd package} %\VignetteDepends{vcd,gmodels,ca} %\VignetteKeywords{contingency tables, mosaic plots, sieve plots, categorical data, independence, conditional independence, R} %\VignettePackage{vcdExtra} \documentclass[10pt,twoside]{article} \usepackage{Sweave} \usepackage{bm} \usepackage[toc]{multitoc} % for table of contents % from Z.cls \usepackage[authoryear,round,longnamesfirst]{natbib} \bibpunct{(}{)}{;}{a}{}{,} \bibliographystyle{jss} \usepackage{hyperref} \usepackage{color} %% colors \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \hypersetup{% hyperindex = {true}, colorlinks = {true}, % linktocpage = {true}, plainpages = {false}, linkcolor = {Blue}, citecolor = {Blue}, urlcolor = {Red}, pdfstartview = {Fit}, pdfpagemode = {UseOutlines}, pdfview = {XYZ null null null} } %\AtBeginDocument{ % \hypersetup{% % pdfauthor = {Michael Friendly}, % pdftitle = {Tutorial: Working with categorical data with R and the vcd package}, % pdfkeywords = {contingency tables, mosaic plots, sieve plots, categorical data, independence, conditional independence, R} % } %} % math stuff \newcommand*{\given}{\ensuremath{\, | \,}} \renewcommand*{\vec}[1]{\ensuremath{\bm{#1}}} \newcommand{\mat}[1]{\ensuremath{\bm{#1}}} \newcommand{\trans}{\ensuremath{^\mathsf{T}}} \newcommand{\diag}[1]{\ensuremath{\mathrm{diag} (#1)}} \def\binom#1#2{{#1 \choose #2}}% \newcommand{\implies}{ \ensuremath{\mapsto} } \newenvironment{equation*}{\displaymath}{\enddisplaymath}% \newcommand{\tabref}[1]{Table~\ref{#1}} \newcommand{\figref}[1]{Figure~\ref{#1}} \newcommand{\secref}[1]{Section~\ref{#1}} \newcommand{\loglin}{loglinear } %\usepackage{thumbpdf} % page dimensions \addtolength{\hoffset}{-1.5cm} \addtolength{\textwidth}{3cm} \addtolength{\voffset}{-1cm} \addtolength{\textheight}{2cm} % Vignette examples \newcommand*{\Example}{\fbox{\textbf{\emph{Example}}:} } % R stuff \newcommand{\var}[1]{\textit{\texttt{#1}}} \newcommand{\data}[1]{\texttt{#1}} \newcommand{\class}[1]{\textsf{"#1"}} %% \code without `-' ligatures \def\nohyphenation{\hyphenchar\font=-1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font=`-} {\catcode`\-=\active% \global\def\code{\bgroup% \catcode`\-=\active \let-\codedash% \Rd@code}} \def\codedash{-\discretionary{}{}{}} \def\Rd@code#1{\texttt{\nohyphenation#1}\egroup} \newcommand{\codefun}[1]{\code{#1()}} \let\proglang=\textsf \newcommand{\pkg}[1]{{\normalfont\fontseries{b}\selectfont #1}} \newcommand{\Rpackage}[1]{{\textsf{#1}}} %% almost as usual \author{Michael Friendly\\York University, Toronto} \title{Working with categorical data with \proglang{R} and the \pkg{vcd} and \pkg{vcdExtra} packages} \date{\footnotesize{Using \Rpackage{vcdExtra} version \Sexpr{packageDescription("vcdExtra")[["Version"]]} and \Rpackage{vcd} version \Sexpr{packageDescription("vcd")[["Version"]]}; Date: \Sexpr{Sys.Date()}}} %% for pretty printing and a nice hypersummary also set: %\Plainauthor{Michael Friendly} %% comma-separated %\Shorttitle{vcd tutorial} %% a short title (if necessary) %\Plaintitle{Tutorial: Working with categorical data with R and the vcd package} %\SweaveOpts{engine=R,eps=TRUE,height=6,width=7,results=hide,fig=FALSE,echo=TRUE} \SweaveOpts{engine=R,height=6,width=7,results=hide,fig=FALSE,echo=TRUE} \SweaveOpts{prefix.string=fig/vcd-tut,eps=FALSE} \SweaveOpts{keep.source=TRUE} %\SweaveOpts{concordance=TRUE} \setkeys{Gin}{width=0.7\textwidth} <>= set.seed(1071) #library(vcd) library(vcdExtra) library(ggplot2) #data(Titanic) data(HairEyeColor) data(PreSex) data(Arthritis) art <- xtabs(~Treatment + Improved, data = Arthritis) if(!file.exists("fig")) dir.create("fig") @ %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \SweaveOpts{concordance=TRUE} \maketitle %% an abstract and keywords \begin{abstract} This tutorial describes the creation and manipulation of frequency and contingency tables from categorical variables, along with tests of independence, measures of association, and methods for graphically displaying results. The framework is provided by the \proglang{R} package \pkg{vcd}, but other packages are used to help with various tasks. The \pkg{vcdExtra} package extends the graphical and statistical methods provided by \pkg{vcd}. This package is now the main support package for the book \emph{Discrete Data Analysis with R: Visualizing and Modeling Techniques for Categorical and Count Data} \citep{FriendlyMeyer:2016:DDAR}. The web page for the book, \href{http://ddar.datavis.ca}{ddar.datavis.ca}, gives further details. \end{abstract} %\keywords{contingency tables, mosaic plots, sieve plots, %categorical data, independence, conditional independence, generalized linear models, %\proglang{R}} %\Plainkeywords{contingency tables, mosaic plots, % sieve plots, categorical data, independence, % conditional independence, generalized linear models, R} {\small % \sloppy % \begin{multicols}{2} \tableofcontents % \end{multicols} } \section[Introduction]{Introduction}\label{sec:intro} %% Note: If there is markup in \(sub)section, then it has to be escape as above. This tutorial, part of the \pkg{vcdExtra} package, describes how to work with categorical data in the context of fitting statistical models in \proglang{R} and visualizing the results using the \pkg{vcd} and \pkg{vcdExtra} packages. It focuses first on methods and tools for creating and manipulating \proglang{R} data objects which represent frequency and contingency tables involving categorical variables. Further sections describe some simple methods for calculating tests of independence and measures of association among categorical variables, and also methods for graphically displaying results. There is much more to the analysis of categorical data than is described here, where the emphasis is on cross-tabulated tables of frequencies (``contingency tables''), statistical tests, associated \loglin\ models, and visualization of \emph{how} variables are related. A more general treatment of graphical methods for categorical data is contained in the book, \emph{Discrete Data Analysis with R: Visualizing and Modeling Techniques for Categorical and Count Data} \citep{FriendlyMeyer:2016:DDAR}. An earlier book using SAS is \emph{Visualizing Categorical Data} \citep{vcd:Friendly:2000}, for which \pkg{vcd} is a partial \proglang{R} companion, covering topics not otherwise available in \proglang{R}. On the other hand, the implementation of graphical methods in \pkg{vcd} is more general in many respects than what I provided in \proglang{SAS}. Statistical models for categorical data in \proglang{R} have been extended considerably with the \pkg{gnm} package for generalized \emph{nonlinear} models. The \pkg{vcdExtra} package extends \pkg{vcd} methods to models fit using \codefun{glm} and \codefun{gnm}. A more complete theoretical description of these statistical methods is provided in Agresti's \citeyearpar{vcd:Agresti:2002,Agresti:2013} \emph{Categorical Data Analysis}. For this, see the \proglang{Splus/R} companion by Laura Thompson, \url{http://www.stat.ufl.edu/~aa/cda/Thompson_manual.pdf} and Agresti's support web page, \url{http://www.stat.ufl.edu/~aa/cda/cda.html}. \section[Creating frequency tables]{Creating and manipulating frequency tables}\label{sec:creating} \proglang{R} provides many methods for creating frequency and contingency tables. Several are described below. In the examples below, we use some real examples and some anonymous ones, where the variables \code{A}, \code{B}, and \code{C} represent categorical variables, and \code{X} represents an arbitrary \proglang{R} data object. The first thing you need to know is that categorical data can be represented in three different forms in \proglang{R}, and it is sometimes necessary to convert from one form to another, for carrying out statistical tests, fitting models or visualizing the results. Once a data object exists in \proglang{R}, you can examine its complete structure with the \codefun{str} function, or view the names of its components with the \codefun{names} function. \begin{description} \item[case form] a data frame containing individual observations, with one or more factors, used as the classifying variables. In case form, there may also be numeric covariates. The total number of observations is \code{nrow(X)}, and the number of variables is \code{ncol(X)}. \Example The \data{Arthritis} data is available in case form in the \pkg{vcd} package. There are two explanatory factors: \code{Treatment} and \code{Sex}. \code{Age} is a numeric covariate, and \code{Improved} is the response--- an ordered factor, with levels \code{\Sexpr{paste(levels(Arthritis$Improved),collapse=' < ')}}. Excluding \code{Age}, we would have a $2 \times 2 \times 3$ contingency table for \code{Treatment}, \code{Sex} and \code{Improved}. %\code{"None" < "Some" < "Marked"}. <>= names(Arthritis) # show the variables str(Arthritis) # show the structure head(Arthritis,5) # first 5 observations, same as Arthritis[1:5,] @ \item[frequency form] a data frame containing one or more factors, and a frequency variable, often called \code{Freq} or \code{count}. The total number of observations is \verb|sum(X$Freq)|, \code{sum(X[,"Freq"])} or some equivalent form. The number of cells in the table is \code{nrow(X)}. \Example For small frequency tables, it is often convenient to enter them in frequency form using \codefun{expand.grid} for the factors and \codefun{c} to list the counts in a vector. The example below, from \cite{vcd:Agresti:2002} gives results for the 1991 General Social Survey, with respondents classified by sex and party identification. <>= # Agresti (2002), table 3.11, p. 106 GSS <- data.frame( expand.grid(sex=c("female", "male"), party=c("dem", "indep", "rep")), count=c(279,165,73,47,225,191)) GSS names(GSS) str(GSS) sum(GSS$count) @ \item[table form] a matrix, array or table object, whose elements are the frequencies in an $n$-way table. The variable names (factors) and their levels are given by \code{dimnames(X)}. The total number of observations is \code{sum(X)}. The number of dimensions of the table is \code{length(dimnames(X))}, and the table sizes are given by \code{sapply(dimnames(X), length)}. \Example The \data{HairEyeColor} is stored in table form in \pkg{vcd}. <>= str(HairEyeColor) # show the structure sum(HairEyeColor) # number of cases sapply(dimnames(HairEyeColor), length) # table dimension sizes @ \Example Enter frequencies in a matrix, and assign \code{dimnames}, giving the variable names and category labels. Note that, by default, \codefun{matrix} uses the elements supplied by \emph{columns} in the result, unless you specify \code{byrow=TRUE}. <>= ## A 4 x 4 table Agresti (2002, Table 2.8, p. 57) Job Satisfaction JobSat <- matrix(c(1,2,1,0, 3,3,6,1, 10,10,14,9, 6,7,12,11), 4, 4) dimnames(JobSat) = list(income=c("< 15k", "15-25k", "25-40k", "> 40k"), satisfaction=c("VeryD", "LittleD", "ModerateS", "VeryS")) JobSat @ \data{JobSat} is a matrix, not an object of \code{class("table")}, and some functions are happier with tables than matrices. You can coerce it to a table with \codefun{as.table}, <>= JobSat <- as.table(JobSat) str(JobSat) @ \end{description} \subsection[Ordered factors]{Ordered factors and reordered tables}\label{sec:ordered-factors} In table form, the values of the table factors are ordered by their position in the table. Thus in the \data{JobSat} data, both \code{income} and \code{satisfaction} represent ordered factors, and the \emph{positions} of the values in the rows and columns reflects their ordered nature. Yet, for analysis, there are time when you need \emph{numeric} values for the levels of ordered factors in a table, e.g., to treat a factor as a quantitative variable. In such cases, you can simply re-assign the \code{dimnames} attribute of the table variables. For example, here, we assign numeric values to \code{income} as the middle of their ranges, and treat \code{satisfaction} as equally spaced with integer scores. <>= dimnames(JobSat)$income<-c(7.5,20,32.5,60) dimnames(JobSat)$satisfaction<-1:4 @ For the \data{HairEyeColor} data, hair color and eye color are ordered arbitrarily. For visualizing the data using mosaic plots and other methods described below, it turns out to be more useful to assure that both hair color and eye color are ordered from dark to light. Hair colors are actually ordered this way already, and it is easiest to re-order eye colors by indexing. Again \codefun{str} is your friend. <>= HairEyeColor <- HairEyeColor[, c(1,3,4,2), ] str(HairEyeColor) @ This is also the order for both hair color and eye color shown in the result of a correspondence analysis (\figref{fig:ca-haireye}) below. With data in case form or frequency form, when you have ordered factors represented with character values, you must ensure that they are treated as ordered in \proglang{R}.% \footnote{In \proglang{SAS}, many procedures offer the option \code{order = data | internal | formatted} to allow character values to be ordered according to (a) their order in the data set, (b) sorted internal value, or (c) sorted formatted representation provided by a \proglang{SAS} format. } Imagine that the \data{Arthritis} data was read from a text file. By default the \code{Improved} will be ordered alphabetically: \code{Marked}, \code{None}, \code{Some}--- not what we want. In this case, the function \codefun{ordered} (and others) can be useful. <>= Arthritis <- read.csv("arthritis.txt",header=TRUE) Arthritis$Improved <- ordered(Arthritis$Improved, levels=c("None", "Some", "Marked")) @ With this order of \code{Improved}, the response in this data, a mosaic display of \code{Treatment} and \code{Improved} (\figref{fig:arthritis})shows a clearly interpretable pattern. <>= mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: [Treatment] [Improved]") @ %\setkeys{Gin}{width=0.7\textwidth} \begin{figure}[htb] \begin{center} %<>= %mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: [Treatment] [Improved]") %@ \includegraphics[width=0.7\textwidth]{fig/vcd-tut-Arthritis} \caption{Mosaic plot for the \data{Arthritis} data, showing the marginal model of independence for Treatment and Improved. Age, a covariate, and Sex are ignored here.} \label{fig:arthritis} \end{center} \end{figure} Finally, there are situations where, particularly for display purposes, you want to re-order the \emph{dimensions} of an $n$-way table, or change the labels for the variables or levels. This is easy when the data are in table form: \codefun{aperm} permutes the dimensions, and assigning to \code{names} and \code{dimnames} changes variable names and level labels respectively. We will use the following version of \data{UCBAdmissions} in \secref{sec:mantel} below.% \footnote{ Changing \code{Admit} to \code{Admit?} might be useful for display purposes, but is dangerous--- because it is then difficult to use that variable name in a model formula. See \secref{sec:tips} for options \code{labeling\_args} and \code{set\_labels} to change variable and level names for displays in the \code{strucplot} framework. } <>= UCB <- aperm(UCBAdmissions, c(2, 1, 3)) dimnames(UCB)[[2]] <- c("Yes", "No") names(dimnames(UCB)) <- c("Sex", "Admit?", "Department") ftable(UCB) @ %There is one subtle ``gotcha'' here: \codefun{aperm} returns an object of class \class{"array"}, %whereas \data{UCBAdmissions} is of class \class{"table"}, so methods defined for \code{table} %objects will not work on the permuted array. %The solution is to reassign the \code{class} of the result of \codefun{aperm}. % %<>= %class(UCBAdmissions) %class(UCB) %str(as.data.frame(UCBAdmissions)) # OK %str(as.data.frame(UCB)) # wrong % %class(UCB) <- "table" %str(as.data.frame(UCB)) # now OK %@ % \subsection[structable()]{\codefun{structable}}\label{sec:structable} For 3-way and larger tables the \codefun{structable} function in \pkg{vcd} provides a convenient and flexible tabular display. The variables assigned to the rows and columns of a two-way display can be specified by a model formula. <>= structable(HairEyeColor) # show the table: default structable(Hair+Sex ~ Eye, HairEyeColor) # specify col ~ row variables @ It also returns an object of class \code{"structable"} which may be plotted with \codefun{mosaic} (not shown here). <>= HSE < - structable(Hair+Sex ~ Eye, HairEyeColor) # save structable object mosaic(HSE) # plot it @ \subsection[table() and friends]{\codefun{table} and friends}\label{sec:table} You can generate frequency tables from factor variables using the \codefun{table} function, tables of proportions using the \codefun{prop.table} function, and marginal frequencies using \codefun{margin.table}. <>= n=500 A <- factor(sample(c("a1","a2"), n, rep=TRUE)) B <- factor(sample(c("b1","b2"), n, rep=TRUE)) C <- factor(sample(c("c1","c2"), n, rep=TRUE)) mydata <- data.frame(A,B,C) @ <>= # 2-Way Frequency Table attach(mydata) mytable <- table(A,B) # A will be rows, B will be columns mytable # print table margin.table(mytable, 1) # A frequencies (summed over B) margin.table(mytable, 2) # B frequencies (summed over A) prop.table(mytable) # cell percentages prop.table(mytable, 1) # row percentages prop.table(mytable, 2) # column percentages @ \codefun{table} can also generate multidimensional tables based on 3 or more categorical variables. In this case, use the \codefun{ftable} or \codefun{structable} function to print the results more attractively. <>= # 3-Way Frequency Table mytable <- table(A, B, C) ftable(mytable) @ \codefun{table} ignores missing values by default. To include \code{NA} as a category in counts, include the table option \code{exclude=NULL} if the variable is a vector. If the variable is a factor you have to create a new factor using \code{newfactor <- factor(oldfactor, exclude=NULL)}. \subsection[xtabs()]{\codefun{xtabs}}\label{sec:xtabs} The \codefun{xtabs} function allows you to create cross-tabulations of data using formula style input. This typically works with case-form data supplied in a data frame or a matrix. The result is a contingency table in array format, whose dimensions are determined by the terms on the right side of the formula. <>= # 3-Way Frequency Table mytable <- xtabs(~A+B+C, data=mydata) ftable(mytable) # print table summary(mytable) # chi-square test of indepedence @ If a variable is included on the left side of the formula, it is assumed to be a vector of frequencies (useful if the data have already been tabulated in frequency form). <>= (GSStab <- xtabs(count ~ sex + party, data=GSS)) summary(GSStab) @ \subsection[Collapsing over factors]{Collapsing over table factors: \codefun{aggregate}, \codefun{margin.table} and \codefun{apply}} It sometimes happens that we have a data set with more variables or factors than we want to analyse, or else, having done some initial analyses, we decide that certain factors are not important, and so should be excluded from graphic displays by collapsing (summing) over them. For example, mosaic plots and fourfold displays are often simpler to construct from versions of the data collapsed over the factors which are not shown in the plots. The appropriate tools to use again depend on the form in which the data are represented--- a case-form data frame, a frequency-form data frame (\codefun{aggregate}), or a table-form array or table object (\codefun{margin.table} or \codefun{apply}). When the data are in frequency form, and we want to produce another frequency data frame, \codefun{aggregate} is a handy tool, using the argument \code{FUN=sum} to sum the frequency variable over the factors \emph{not} mentioned in the formula. \Example The data frame \data{DaytonSurvey} in the \pkg{vcdExtra} package represents a $2^5$ table giving the frequencies of reported use (``ever used?'') of alcohol, cigarettes and marijuana in a sample of high school seniors, also classified by sex and race. <>= str(DaytonSurvey) head(DaytonSurvey) @ To focus on the associations among the substances, we want to collapse over sex and race. The right-hand side of the formula used in the call to \codefun{aggregate} gives the factors to be retained in the new frequency data frame, \code{Dayton.ACM.df}. <>= # data in frequency form # collapse over sex and race Dayton.ACM.df <- aggregate(Freq ~ cigarette+alcohol+marijuana, data=DaytonSurvey, FUN=sum) Dayton.ACM.df @ When the data are in table form, and we want to produce another table, \codefun{apply} with \code{FUN=sum} can be used in a similar way to sum the table over dimensions not mentioned in the \code{MARGIN} argument. \codefun{margin.table} is just a wrapper for \codefun{apply} using the \codefun{sum} function. \Example To illustrate, we first convert the \data{DaytonSurvey} to a 5-way table using \codefun{xtabs}, giving \code{Dayton.tab}. <>== # in table form Dayton.tab <- xtabs(Freq~cigarette+alcohol+marijuana+sex+race, data=DaytonSurvey) structable(cigarette+alcohol+marijuana ~ sex+race, data=Dayton.tab) @ Then, use \codefun{apply} on \code{Dayton.tab} to give the 3-way table \code{Dayton.ACM.tab} summed over sex and race. The elements in this new table are the column sums for \code{Dayton.tab} shown by \codefun{structable} just above. <>== # collapse over sex and race Dayton.ACM.tab <- apply(Dayton.tab, MARGIN=1:3, FUN=sum) Dayton.ACM.tab <- margin.table(Dayton.tab, 1:3) # same result structable(cigarette+alcohol ~ marijuana, data=Dayton.ACM.tab) @ Many of these operations can be performed using the \verb|**ply()| functions in the \pkg{plyr} package. For example, with the data in a frequency form data frame, use \codefun{ddply} to collapse over unmentioned factors, and \codefun{plyr::summarise}% \footnote{ Ugh. This \pkg{plyr} function clashes with a function of the same name in \pkg{vcdExtra}. In this document I will use the explicit double-colon notation to keep them separate. } as the function to be applied to each piece. <>== Dayton.ACM.df <- ddply(DaytonSurvey, .(cigarette, alcohol, marijuana), plyr::summarise, Freq=sum(Freq)) @ \subsection[Collapsing levels]{Collapsing table levels: \codefun{collapse.table}} A related problem arises when we have a table or array and for some purpose we want to reduce the number of levels of some factors by summing subsets of the frequencies. For example, we may have initially coded Age in 10-year intervals, and decide that, either for analysis or display purposes, we want to reduce Age to 20-year intervals. The \codefun{collapse.table} function in \pkg{vcdExtra} was designed for this purpose. \Example Create a 3-way table, and collapse Age from 10-year to 20-year intervals. First, we generate a $2 \times 6 \times 3$ table of random counts from a Poisson distribution with mean of 100. <>= # create some sample data in frequency form sex <- c("Male", "Female") age <- c("10-19", "20-29", "30-39", "40-49", "50-59", "60-69") education <- c("low", 'med', 'high') data <- expand.grid(sex=sex, age=age, education=education) counts <- rpois(36, 100) # random Possion cell frequencies data <- cbind(data, counts) # make it into a 3-way table t1 <- xtabs(counts ~ sex + age + education, data=data) structable(t1) @ Now collapse \code{age} to 20-year intervals, and \code{education} to 2 levels. In the arguments, levels of \code{age} and \code{education} given the same label are summed in the resulting smaller table. <>= # collapse age to 3 levels, education to 2 levels t2 <- collapse.table(t1, age=c("10-29", "10-29", "30-49", "30-49", "50-69", "50-69"), education=c(">= as.data.frame(GSStab) @ \Example Convert the \code{Arthritis} data in case form to a 3-way table of \code{Treatment} $\times$ \code{Sex} $\times$ \code{Improved}. Note the use of \codefun{with} to avoid having to use \code{Arthritis\$Treatment} etc. within the call to \codefun{table}.% \footnote{ \codefun{table} does not allow a \code{data} argument to provide an environment in which the table variables are to be found. In the examples in \secref{sec:table} I used \code{attach(mydata)} for this purpose, but \codefun{attach} leaves the variables in the global environment, while \codefun{with} just evaluates the \codefun{table} expression in a temporary environment of the data. } <>= Art.tab <-with(Arthritis, table(Treatment, Sex, Improved)) str(Art.tab) ftable(Art.tab) @ There may also be times that you will need an equivalent case form \code{data.frame} with factors representing the table variables rather than the frequency table. For example, the \codefun{mca} function in package \pkg{MASS} only operates on data in this format. Marc Schwartz provided code for \codefun{expand.dft} on the Rhelp mailing list for converting a table back into a case form \code{data.frame}. This function is included in \pkg{vcdExtra}. \Example Convert the \data{Arthritis} data in table form (\code{Art.tab}) back to a \code{data.frame} in case form, with factors \code{Treatment}, \code{Sex} and \code{Improved}. <>= Art.df <- expand.dft(Art.tab) str(Art.df) @ \subsection{A complex example}\label{sec:complex} If you've followed so far, you're ready for a more complicated example. The data file, \code{tv.dat} represents a 4-way table of size $5 \times 11 \times 5 \times 3$ where the table variables (unnamed in the file) are read as \code{V1} -- \code{V4}, and the cell frequency is read as \code{V5}. The file, stored in the \code{doc/extdata} directory of \pkg{vcdExtra}, can be read as follows: <>= tv.data<-read.table(system.file("extdata","tv.dat", package="vcdExtra")) head(tv.data,5) @ For a local file, just use \codefun{read.table} in this form: <>= tv.data<-read.table("C:/R/data/tv.dat") @ The data \code{tv.dat} came from the initial implementation of mosaic displays in \proglang{R} by Jay Emerson. In turn, they came from the initial development of mosaic displays \citep{vcd:Hartigan+Kleiner:1984} that illustrated the method with data on a large sample of TV viewers whose behavior had been recorded for the Neilson ratings. This data set contains sample television audience data from Neilsen Media Research for the week starting November 6, 1995. \begin{flushleft} The table variables are:\\ ~~~\code{V1}-- values 1:5 correspond to the days Monday--Friday;\\ ~~~\code{V2}-- values 1:11 correspond to the quarter hour times 8:00PM through 10:30PM;\\ ~~~\code{V3}-- values 1:5 correspond to ABC, CBS, NBC, Fox, and non-network choices;\\ ~~~\code{V4}-- values 1:3 correspond to transition states: turn the television Off, Switch channels, or Persist in viewing the current channel. \end{flushleft} We are interested just the cell frequencies, and rely on the facts that the (a) the table is complete--- there are no missing cells, so \code{nrow(tv.data)}=\Sexpr{nrow(tv.data)}; (b) the observations are ordered so that \code{V1} varies most rapidly and \code{V4} most slowly. From this, we can just extract the frequency column and reshape it into an array. <>= TV <- array(tv.data[,5], dim=c(5,11,5,3)) dimnames(TV) <- list(c("Monday","Tuesday","Wednesday","Thursday","Friday"), c("8:00","8:15","8:30","8:45","9:00","9:15","9:30", "9:45","10:00","10:15","10:30"), c("ABC","CBS","NBC","Fox","Other"), c("Off","Switch","Persist")) names(dimnames(TV))<-c("Day", "Time", "Network", "State") @ More generally (even if there are missing cells), we can use \codefun{xtabs} (or \codefun{plyr::daply}) to do the cross-tabulation, using \code{V5} as the frequency variable. Here's how to do this same operation with \codefun{xtabs}: <>= TV <- xtabs(V5 ~ ., data=tv.data) dimnames(TV) <- list(Day=c("Monday","Tuesday","Wednesday","Thursday","Friday"), Time=c("8:00","8:15","8:30","8:45","9:00","9:15","9:30", "9:45","10:00","10:15","10:30"), Network=c("ABC","CBS","NBC","Fox","Other"), State=c("Off","Switch","Persist")) @ But this 4-way table is too large and awkward to work with. Among the networks, Fox and Other occur infrequently. We can also cut it down to a 3-way table by considering only viewers who persist with the current station.% \footnote{This relies on the fact that that indexing an array drops dimensions of length 1 by default, using the argument \code{drop=TRUE}; the result is coerced to the lowest possible dimension. } <>= TV <- TV[,,1:3,] # keep only ABC, CBS, NBC TV <- TV[,,,3] # keep only Persist -- now a 3 way table structable(TV) @ Finally, for some purposes, we might want to collapse the 11 times into a smaller number. Here, we use \codefun{as.data.frame.table} to convert the table back to a data frame, \codefun{levels} to re-assign the values of \code{Time}, and finally, \codefun{xtabs} to give a new, collapsed frequency table. <>= TV.df <- as.data.frame.table(TV) levels(TV.df$Time) <- c(rep("8:00-8:59",4),rep("9:00-9:59",4), rep("10:00-10:44",3)) TV2 <- xtabs(Freq ~ Day + Time + Network, TV.df) structable(Day ~ Time+Network,TV2) @ Whew! See \figref{fig:TV-mosaic} for a mosaic plot of the \code{TV2} data. \section{Tests of Independence} \subsection{CrossTable} OK, now we're ready to do some analyses. For tabular displays, the \codefun{CrossTable} function in the \pkg{gmodels} package produces cross-tabulations modeled after \code{PROC FREQ} in \proglang{SAS} or \code{CROSSTABS} in \proglang{SPSS}. It has a wealth of options for the quantities that can be shown in each cell. <>= # 2-Way Cross Tabulation library(gmodels) CrossTable(GSStab,prop.t=FALSE,prop.r=FALSE,prop.c=FALSE) @ There are options to report percentages (row, column, cell), specify decimal places, produce Chi-square, Fisher, and McNemar tests of independence, report expected and residual values (pearson, standardized, adjusted standardized), include missing values as valid, annotate with row and column titles, and format as \proglang{SAS} or \proglang{SPSS} style output! See \code{help(CrossTable)} for details. \subsection{Chi-square test} For 2-way tables you can use \codefun{chisq.test} to test independence of the row and column variable. By default, the $p$-value is calculated from the asymptotic chi-squared distribution of the test statistic. Optionally, the $p$-value can be derived via Monte Carlo simulation. <>= (HairEye <- margin.table(HairEyeColor, c(1, 2))) chisq.test(HairEye) @ \subsection{Fisher Exact Test}\label{sec:Fisher} \code{fisher.test(X)} provides an exact test of independence. \code{X} must be a two-way contingency table in table form. Another form, \code{fisher.test(X, Y)} takes two categorical vectors of the same length. For tables larger than $2 \times 2$ the method can be computationally intensive (or can fail) if the frequencies are not small. <>= fisher.test(GSStab) @ But this does not work because \data{HairEye} data has $n$=592 total frequency. An exact test is unnecessary in this case. <>= fisher.test(HairEye) @ %# <>= %# #cat(try(fisher.test(HairEye))) %# @ \begin{Soutput} Error in fisher.test(HairEye) : FEXACT error 6. LDKEY is too small for this problem. Try increasing the size of the workspace. \end{Soutput} \subsection[Mantel-Haenszel test]{Mantel-Haenszel test and conditional association}\label{sec:mantel} Use the \code{mantelhaen.test(X)} function to perform a Cochran-Mantel-Haenszel $\chi^2$ chi test of the null hypothesis that two nominal variables are \emph{conditionally independent}, $A \perp B \given C$, in each stratum, assuming that there is no three-way interaction. \code{X} is a 3 dimensional contingency table, where the last dimension refers to the strata. The \data{UCBAdmissions} serves as an example of a $2 \times 2 \times 6$ table, with \code{Dept} as the stratifying variable. <>= ## UC Berkeley Student Admissions mantelhaen.test(UCBAdmissions) @ The results show no evidence for association between admission and gender when adjusted for department. However, we can easily see that the assumption of equal association across the strata (no 3-way association) is probably violated. For $2 \times 2 \times k$ tables, this can be examined from the odds ratios for each $2 \times 2$ table (\codefun{oddsratio}), and tested by using \verb|woolf_test()| in \pkg{vcd}. %<>= %oddsRatio <- function(x) (x[1,1]*x[2,2])/(x[1,2]*x[2,1]) %apply(UCBAdmissions, 3, oddsRatio) % %woolf_test(UCBAdmissions) %@ <>= oddsratio(UCBAdmissions, log=FALSE) lor <- oddsratio(UCBAdmissions) # capture log odds ratios summary(lor) woolf_test(UCBAdmissions) @ We can visualize the odds ratios of Admission for each department with fourfold displays using \codefun{fourfold}. The cell frequencies $n_{ij}$ of each $2 \times 2$ table are shown as a quarter circle whose radius is proportional to $\sqrt{n_{ij}}$, so that its area is proportional to the cell frequency. Confidence rings for the odds ratio allow a visual test of the null of no association; the rings for adjacent quadrants overlap \emph{iff} the observed counts are consistent with the null hypothesis. In the extended version (the default), brighter colors are used where the odds ratio is significantly different from 1. The following lines produce \figref{fig:fourfold1}.% \footnote{The color values \code{col[3:4]} were modified from their default values to show a greater contrast between significant and insignificant associations here.} <>= col <- c("#99CCFF", "#6699CC", "#F9AFAF", "#6666A0", "#FF0000", "#000080") fourfold(UCB,mfrow=c(2,3), color=col) @ %\setkeys{Gin}{width=0.8\textwidth} \begin{figure}[htb] \begin{center} %<>= %col <- c("#99CCFF", "#6699CC", "#F9AFAF", "#6666A0", "#FF0000", "#000080") %fourfold(UCB,mfrow=c(2,3), color=col) %@ \includegraphics[width=0.8\textwidth,trim=80 50 80 50]{fig/vcd-tut-fourfold1} \caption{Fourfold display for the \data{UCBAdmissions} data. Where the odds ratio differs significantly from 1.0, the confidence bands do not overlap, and the circle quadrants are shaded more intensely.} \label{fig:fourfold1} \end{center} \end{figure} Another \pkg{vcd} function, \codefun{cotabplot}, provides a more general approach to visualizing conditional associations in contingency tables, similar to trellis-like plots produced by \codefun{coplot} and lattice graphics. The \code{panel} argument supplies a function used to render each conditional subtable. The following gives a display (not shown) similar to \figref{fig:fourfold1}. <>= cotabplot(UCB, panel = cotab_fourfold) @ When we want to view the conditional probabilities of a response variable (e.g., \code{Admit}) in relation to several factors, an alternative visualization is a \codefun{doubledecker} plot. This plot is a specialized version of a mosaic plot, which highlights the levels of a response variable (plotted vertically) in relation to the factors (shown horizontally). The following call produces \figref{fig:doubledecker}, where we use indexing on the first factor (\code{Admit}) to make \code{Admitted} the highlighted level. In this plot, the association between \code{Admit} and \code{Gender} is shown where the heights of the highlighted conditional probabilities do not align. The excess of females admitted in Dept A stands out here. <>= doubledecker(Admit ~ Dept + Gender, data=UCBAdmissions[2:1,,]) @ \begin{figure}[htb] \begin{center} \includegraphics[width=0.9\textwidth]{fig/vcd-tut-doubledecker} \caption{Doubledecker display for the \data{UCBAdmissions} data. The heights of the highlighted bars show the conditional probabilities of \texttt{Admit}, given \texttt{Dept} and \texttt{Gender}.} \label{fig:doubledecker} \end{center} \end{figure} Finally, the there is a \codefun{plot} method for \code{oddsratio} objects. By default, it shows the 95\% confidence interval for the log odds ratio. \figref{fig:oddsratio} is produced by: <>= plot(lor, xlab="Department", ylab="Log Odds Ratio (Admit | Gender)") @ \setkeys{Gin}{width=0.5\textwidth} \begin{figure}[htb] \begin{center} <>= plot(lor, xlab="Department", ylab="Log Odds Ratio (Admit | Gender)") @ \caption{Log odds ratio plot for the \data{UCBAdmissions} data.} \label{fig:oddsratio} \end{center} \end{figure} \subsection[CMH tests: ordinal factors]{Cochran-Mantel-Haenszel tests for ordinal factors}\label{sec:CMH} The standard $\chi^2$ tests for association in a two-way table treat both table factors as nominal (unordered) categories. When one or both factors of a two-way table are quantitative or ordinal, more powerful tests of association may be obtaianed by taking ordinality into account, using row and or column scores to test for linear trends or differences in row or column means. More general versions of the CMH tests (Landis etal., 1978) are provided by assigning numeric scores to the row and/or column variables. For example, with two ordinal factors (assumed to be equally spaced), assigning integer scores, \code{1:R} and \code{1:C} tests the linear $\times$ linear component of association. This is statistically equivalent to the Pearson correlation between the integer-scored table variables, with $\chi^2 = (n-1) r^2$, with only 1 $df$ rather than $(R-1)\times(C-1)$ for the test of general association. When only one table variable is ordinal, these general CMH tests are analogous to an ANOVA, testing whether the row mean scores or column mean scores are equal, again consuming fewer $df$ than the test of general association. The \codefun{CMHtest} function in \pkg{vcdExtra} now calculates these various CMH tests for two possibly ordered factors, optionally stratified other factor(s). \Example Recall the $4 \times 4$ table, \code{JobSat} introduced in \secref{sec:creating}, <>= JobSat @ Treating the \code{satisfaction} levels as equally spaced, but using midpoints of the \code{income} categories as row scores gives the following results: <>= CMHtest(JobSat, rscores=c(7.5,20,32.5,60)) @ Note that with the relatively small cell frequencies, the test for general give no evidence for association. However, the the \code{cor} test for linear x linear association on 1 df is nearly significant. The \pkg{coin} contains the functions \verb|cmh_test()| and \verb|lbl_test()| for CMH tests of general association and linear x linear association respectively. \subsection{Measures of Association} There are a variety of statistical measures of \emph{strength} of association for contingency tables--- similar in spirit to $r$ or $r^2$ for continuous variables. With a large sample size, even a small degree of association can show a significant $\chi^2$, as in the example below for the \data{GSS} data. The \codefun{assocstats} function in \pkg{vcd} calculates the $\phi$ contingency coefficient, and Cramer's V for an $r \times c$ table. The input must be in table form, a two-way $r \times c$ table. It won't work with \data{GSS} in frequency form, but by now you should know how to convert. <>= assocstats(GSStab) @ For tables with ordinal variables, like \data{JobSat}, some people prefer the Goodman-Kruskal $\gamma$ statistic (\citet[\S 2.4.3]{vcd:Agresti:2002}) based on a comparison of concordant and discordant pairs of observations in the case-form equivalent of a two-way table. <>= GKgamma(JobSat) @ A web article by Richard Darlington, \url{http://www.psych.cornell.edu/Darlington/crosstab/TABLE0.HTM} gives further description of these and other measures of association. \subsection{Measures of Agreement} The \codefun{Kappa} function in the \pkg{vcd} package calculates Cohen's $\kappa$ and weighted $\kappa$ for a square two-way table with the same row and column categories \citep{Cohen:60}.% \footnote{ Don't confuse this with \codefun{kappa} in base \proglang{R} that computes something entirely different (the condition number of a matrix). } Normal-theory $z$-tests are obtained by dividing $\kappa$ by its asymptotic standard error (ASE). A \codefun{confint} method for \code{Kappa} objects provides confidence intervals. <>= (K <- Kappa(SexualFun)) confint(K) @ A visualization of agreement, both unweighted and weighted for degree of departure from exact agreement is provided by the \codefun{agreementplot} function. \figref{fig:agreesex} shows the agreementplot for the \data{SexualFun} data, produced as shown below. The Bangdiwala measures represent the proportion of the shaded areas of the diagonal rectangles, using weights $w_1$ for exact agreement, and $w_2$ for partial agreement one step from the main diagonal. <>= agree <- agreementplot(SexualFun, main="Is sex fun?") unlist(agree) @ %\setkeys{Gin}{width=0.5\textwidth} \begin{figure}[htb] \begin{center} %<>= %agree <- agreementplot(SexualFun, main="Is sex fun?") %agree %@ \includegraphics[width=0.4\textwidth,trim=50 25 50 25]{fig/vcd-tut-agreesex} \caption{Agreement plot for the \data{SexualFun} data.} \label{fig:agreesex} \end{center} \end{figure} In other examples, the agreement plot can help to show \emph{sources} of disagreement. For example, when the shaded boxes are above or below the diagonal (red) line, a lack of exact agreement can be attributed in part to different frequency of use of categories by the two raters-- lack of \emph{marginal homogeneity}. \subsection{Correspondence analysis} Use the \pkg{ca} package for correspondence analysis for visually exploring relationships between rows and columns in contingency tables. For an $r \times c$ table, the method provides a breakdown of the Pearson $\chi^2$ for association in up to $M = \min(r-1, c-1)$ dimensions, and finds scores for the row ($x_{im}$) and column ($y_{jm}$) categories such that the observations have the maximum possible correlations.% \footnote{ Related methods are the non-parametric CMH tests using assumed row/column scores (\secref{sec:CMH}), the analogous \codefun{glm} model-based methods (\secref{sec:CMH}), and the more general RC models which can be fit using \codefun{gnm}. Correspondence analysis differs in that it is a primarily descriptive/exploratory method (no significance tests), but is directly tied to informative graphic displays of the row/column categories. } Here, we carry out a simple correspondence analysis of the \data{HairEye} data. The printed results show that nearly 99\% of the association between hair color and eye color can be accounted for in 2 dimensions, of which the first dimension accounts for 90\%. <>= library(ca) ca(HairEye) @ The resulting \code{ca} object can be plotted just by running the \codefun{plot} method on the \code{ca} object, giving the result in \figref{fig:ca-haireye}. \codefun{plot.ca} does not allow labels for dimensions; these can be added with \codefun{title}. It can be seen that most of the association is accounted for by the ordering of both hair color and eye color along Dimension 1, a dark to light dimension. <>= plot(ca(HairEye), main="Hair Color and Eye Color") title(xlab="Dim 1 (89.4%)", ylab="Dim 2 (9.5%)") @ \setkeys{Gin}{width=0.7\textwidth} \begin{figure}[htb] \begin{center} <>= plot(ca(HairEye), main="Hair Color and Eye Color") title(xlab="Dim 1 (89.4%)", ylab="Dim 2 (9.5%)") @ \caption{Correspondence analysis plot for the \data{HairEye} data.} \label{fig:ca-haireye} \end{center} \end{figure} \section{Loglinear Models}\label{sec:loglin} You can use the \codefun{loglm} function in the \pkg{MASS} package to fit log-linear models. Equivalent models can also be fit (from a different perspective) as generalized linear models with the \codefun{glm} function using the \code{family='poisson'} argument, and the \pkg{gnm} package provides a wider range of generalized \emph{nonlinear} models, particularly for testing structured associations. The visualization methods for these models were originally developed for models fit using \codefun{loglm}, so this approach is emphasized here. Some extensions of these methods for models fit using \codefun{glm} and \codefun{gnm} are contained in the \pkg{vcdExtra} package and illustrated in \secref{sec:glm}. Assume we have a 3-way contingency table based on variables A, B, and C. The possible different forms of \loglin\ models for a 3-way table are shown in \tabref{tab:loglin-3way}. The \textbf{Model formula} column shows how to express each model for \codefun{loglm} in \proglang{R}.% \footnote{ For \codefun{glm}, or \codefun{gnm}, with the data in the form of a frequency data.frame, the same model is specified in the form \code{glm(Freq} $\sim$ \code{..., family="poisson")}, where \texttt{Freq} is the name of the cell frequency variable and \texttt{...} specifies the \textbf{Model formula}. } In the \textbf{Interpretation} column, the symbol ``$\perp$'' is to be read as ``is independent of,'' and ``$\given$'' means ``conditional on,'' or ``adjusting for,'' or just ``given''. \begin{table}[htb] \caption{Log-linear Models for Three-Way Tables}\label{tab:loglin-3way} \begin{center} \begin{tabular}{llll} \hline \textbf{Model} & \textbf{Model formula} & \textbf{Symbol}& \textbf{Interpretation} \\ \hline\hline Mutual independence & \verb|~A + B + C| & $[A][B][C]$ & $A \perp B \perp C$ \\ Joint independence & \verb|~A*B + C| & $[AB][C]$ & $(A \: B) \perp C$ \\ Conditional independence & \verb|~(A+B)*C| & $[AC][BC]$ & $(A \perp B) \given C$ \\ All two-way associations & \verb|~A*B + A*C + B*C| & $[AB][AC][BC]$ & homogeneous association \\ Saturated model & \verb|~A*B*C| & $[ABC]$ & 3-way association \\ \hline \end{tabular} \end{center} \end{table} For example, the formula \verb|~A + B + C| specifies the model of \emph{mutual independence} with no associations among the three factors. In standard notation for the expected frequencies $m_{ijk}$, this corresponds to \begin{equation*} \log ( m_{ijk} ) = \mu + \lambda_i^A + \lambda_j^B + \lambda_k^C \equiv \texttt{A + B + C} \end{equation*} The parameters $\lambda_i^A , \lambda_j^B$ and $\lambda_k^C$ pertain to the differences among the one-way marginal frequencies for the factors A, B and C. Similarly, the model of \emph{joint independence}, $(A \: B) \perp C$, allows an association between A and B, but specifies that C is independent of both of these and their combinations, \begin{equation*} \log ( m_{ijk} ) = \mu + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} \equiv \texttt{A * B + C} \end{equation*} where the parameters $\lambda_{ij}^{AB}$ pertain to the overall association between A and B (collapsing over C). In the literature or text books, you will often find these models expressed in shorthand symbolic notation, using brackets, \texttt{[ ]} to enclose the \emph{high-order terms} in the model. Thus, the joint independence model can be denoted \texttt{[AB][C]}, as shown in the \textbf{Symbol} column in \tabref{tab:loglin-3way}. Models of \emph{conditional independence} allow (and fit) two of the three possible two-way associations. There are three such models, depending on which variable is conditioned upon. For a given conditional independence model, e.g., \texttt{[AB][AC]}, the given variable is the one common to all terms, so this example has the interpretation $(B \perp C) \given A$. \subsection[Fitting with loglm()]{Fitting with \codefun{loglm}}\label{sec:loglm} For example, we can fit the model of mutual independence among hair color, eye color and sex in \data{HairEyeColor} as <>= library(MASS) ## Independence model of hair and eye color and sex. hec.1 <- loglm(~Hair+Eye+Sex, data=HairEyeColor) hec.1 @ Similarly, the models of conditional independence and joint independence are specified as <>= ## Conditional independence hec.2 <- loglm(~(Hair + Eye) * Sex, data=HairEyeColor) hec.2 @ <>= ## Joint independence model. hec.3 <- loglm(~Hair*Eye + Sex, data=HairEyeColor) hec.3 @ Note that printing the model gives a brief summary of the goodness of fit. A set of models can be compared using the \codefun{anova} function. <>= anova(hec.1, hec.2, hec.3) @ %Martin Theus and Stephan Lauer have written an excellent article on Visualizing %Loglinear Models, using mosaic plots. There is also great tutorial example by %Kevin Quinn on analyzing loglinear models via glm. \subsection[Fitting with glm() and gnm()]{Fitting with \codefun{glm} and \codefun{gnm}}\label{sec:glm} The \codefun{glm} approach, and extensions of this in the \pkg{gnm} package allows a much wider class of models for frequency data to be fit than can be handled by \codefun{loglm}. Of particular importance are models for ordinal factors and for square tables, where we can test more structured hypotheses about the patterns of association than are provided in the tests of general association under \codefun{loglm}. These are similar in spirit to the non-parametric CMH tests described in \secref{sec:CMH}. \Example The data \code{Mental} in the \pkg{vcdExtra} package gives a two-way table in frequency form classifying young people by their mental health status and parents' socioeconomic status (SES), where both of these variables are ordered factors. <>= str(Mental) xtabs(Freq ~ mental+ses, data=Mental) # display the frequency table @ Simple ways of handling ordinal variables involve assigning scores to the table categories, and the simplest cases are to use integer scores, either for the row variable (``column effects'' model), the column variable (``row effects'' model), or both (``uniform association'' model). <>= indep <- glm(Freq ~ mental + ses, family = poisson, data = Mental) # independence model @ To fit more parsimonious models than general association, we can define numeric scores for the row and column categories <>= # Use integer scores for rows/cols Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) @ Then, the row effects model, the column effects model, and the uniform association model can be fit as follows: <>= # column effects model (ses) coleff <- glm(Freq ~ mental + ses + Rscore:ses, family = poisson, data = Mental) # row effects model (mental) roweff <- glm(Freq ~ mental + ses + mental:Cscore, family = poisson, data = Mental) # linear x linear association linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) @ The \codefun{Summarize} in \pkg{vcdExtra} provides a nice, compact summary of the fit statistics for a set of models, collected into a \class{glmlist} object. Smaller is better for AIC and BIC. <>= # compare models using AIC, BIC, etc vcdExtra::LRstats(glmlist(indep, roweff, coleff, linlin)) @ For specific model comparisons, we can also carry out tests of \emph{nested} models with \codefun{anova} when those models are listed from smallest to largest. Here, there are two separate paths from the most restrictive (independence) model through the model of uniform association, to those that allow only one of row effects or column effects. <>= anova(indep, linlin, coleff, test="Chisq") anova(indep, linlin, roweff, test="Chisq") @ The model of linear by linear association seems best on all accounts. For comparison, one might try the CMH tests on these data: <>= CMHtest(xtabs(Freq~ses+mental, data=Mental)) @ \subsection{Non-linear terms} The strength of the \pkg{gnm} package is that it handles a wide variety of models that handle non-linear terms, where the parameters enter the model beyond a simple linear function. The simplest example is the Goodman RC(1) model, which allows a multiplicative term to account for the association of the table variables. In the notation of generalized linear models with a log link, this can be expressed as \begin{equation*} \log \mu_{ij} = \alpha_i + \beta_j + \gamma_{i} \delta_{j} \end{equation*} where the row-multiplicative effect parameters $\gamma_i$ and corresponding column parameters $\delta_j$ are estimated from the data.% \footnote{ This is similar in spirit to a correspondence analysis with a single dimension, but as a statistical model. } Similarly, the RC(2) model adds two multiplicative terms to the independence model, \begin{equation*} \log \mu_{ij} = \alpha_i + \beta_j + \gamma_{i1} \delta_{j1} + \gamma_{i2} \delta_{j2} \end{equation*} In the \pkg{gnm} package, these models may be fit using the \codefun{Mult} to specify the multiplicative term, and \codefun{instances} to specify several such terms. \Example For the \code{Mental} data, we fit the RC(1) and RC(2) models, and compare these with the independence model. <>= RC1 <- gnm(Freq ~ mental + ses + Mult(mental,ses), data=Mental, family=poisson, , verbose=FALSE) RC2 <- gnm(Freq ~ mental+ses + instances(Mult(mental,ses),2), data=Mental, family=poisson, verbose=FALSE) anova(indep, RC1, RC2, test="Chisq") @ \section{Mosaic plots}\label{sec:mosaic} Mosaic plots provide an ideal method both for visualizing contingency tables and for visualizing the fit--- or more importantly--- lack of fit of a \loglin\ model. For a two-way table, \codefun{mosaic} fits a model of independence, $[A][B]$ or \verb|~A+B| as an \proglang{R} formula. For $n$-way tables, \codefun{mosaic} can fit any \loglin\ model, and can also be used to plot a model fit with \codefun{loglm}. See \citet{vcd:Friendly:1994,vcd:Friendly:1999} for the statistical ideas behind these uses of mosaic displays in connection with \loglin\ models. The essential idea is to recursively sub-divide a unit square into rectangular ``tiles'' for the cells of the table, such that the are area of each tile is proportional to the cell frequency. For a given \loglin\ model, the tiles can then be shaded in various ways to reflect the residuals (lack of fit) for a given model. The pattern of residuals can then be used to suggest a better model or understand \emph{where} a given model fits or does not fit. \codefun{mosaic} provides a wide range of options for the directions of splitting, the specification of shading, labeling, spacing, legend and many other details. It is actually implemented as a special case of a more general class of displays for $n$-way tables called \code{strucplot}, including sieve diagrams, association plots, double-decker plots as well as mosaic plots. For details, see \code{help(strucplot)} and the ``See also'' links, and also \citet{vcd:Meyer+Zeileis+Hornik:2006b}, which is available as an \proglang{R} vignette via \code{vignette("strucplot", package="vcd")}. \figref{fig:arthritis}, showing the association between \code{Treatment} and \code{Improved} was produced with the following call to \codefun{mosaic}. <>= mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: [Treatment] [Improved]") @ Note that the residuals for the independence model were not large (as shown in the legend), yet the association between \code{Treatment} and \code{Improved} is highly significant. <>= summary(art) @ In contrast, one of the other shading schemes, from \citet{vcd:Friendly:1994} (use: \verb|gp = shading_Friendly|), uses fixed cutoffs of $\pm 2, \pm 4$, to shade cells which are \emph{individually} significant at approximately $\alpha = 0.05$ and $\alpha = 0.001$ levels, respectively. The right panel below uses \verb|gp = shading_Friendly|. \setkeys{Gin}{width=0.5\textwidth} <>= mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: gp = shading_max") @ <>= mosaic(art, gp = shading_Friendly, split_vertical = TRUE, main="Arthritis: gp = shading_Friendly") @ \subsection[Mosaics for loglinear models]{Mosaics for \loglin\ models}\label{sec:mosaic-llm} When you have fit a \loglin\ model using \codefun{loglm}, and saved the result (as a \code{loglm} object) the simplest way to display the results is to use the \codefun{plot} method for the \code{loglm} object. Calling \code{mosaic(loglm.object)} has the same result. In \secref{sec:loglm} above, we fit several different models to the \data{HairEyeColor} data. We can produce mosaic displays of each just by plotting them: <>= # mosaic plots, using plot.loglm() method plot(hec.1, main="model: [Hair][Eye][Sex]") plot(hec.2, main="model: [HairSex][EyeSex]") plot(hec.3, main="model: [HairEye][Sex]") @ \setkeys{Gin}{width=0.32\textwidth} <>= plot(hec.1, main="model: [Hair][Eye][Sex]") @ <>= plot(hec.2, main="model: [HairSex][EyeSex]") @ <>= plot(hec.3, main="model: [HairSex][EyeSex]") @ Alternatively, you can supply the model formula to \codefun{mosaic} with the \code{expected} argument. This is passed to \codefun{loglm}, which fits the model, and returns residuals used for shading in the plot. For example, here we examine the \data{TV2} constructed in \secref{sec:complex} above. The goal is to see how Network choice depends on (varies with) Day and Time. To do this: \begin{itemize} \item We fit a model of joint independence of \code{Network} on the combinations of \code{Day} and \code{Time}, with the model formula \verb|~Day:Time + Network|. \item To make the display more easily read, we place \code{Day} and \code{Time} on the vertical axis and \code{Network} on the horizontal, \item The \code{Time} values overlap on the right vertical axis, so we use \codefun{level} to abbreviate them. \codefun{mosaic} also supports a more sophisticated set of labeling functions. Instead of changing the data table, we could have used \verb|labeling_args = list(abbreviate = c(Time = 2))| for a similar effect. \end{itemize} The following call to \codefun{mosaic} produces \figref{fig:TV-mosaic}: <>= dimnames(TV2)$Time <- c("8", "9", "10") # re-level for mosaic display mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Network, legend=FALSE, gp=shading_Friendly) @ \setkeys{Gin}{width=0.75\textwidth} \begin{figure}[htb] \begin{center} <>= dimnames(TV2)$Time <- c("8", "9", "10") # re-level for mosaic display mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Network, legend=FALSE, gp=shading_Friendly) @ \caption{Mosaic plot for the \data{TV} data showing model of joint independence, \texttt{Day:Time + Network} .} \label{fig:TV-mosaic} \end{center} \end{figure} From this, it is easy to read from the display how network choice varies with day and time. For example, CBS dominates in all time slots on Monday; ABC and NBC dominate on Tuesday, particularly in the later time slots; Thursday is an NBC day, while on Friday, ABC gets the greatest share. In interpreting this mosaic and other plots, it is important to understand that associations included in the model---here, that between day and time---are \emph{not} shown in the shading of the cells, because they have been fitted (taken into account) in the \loglin\ model. For comparison, you might want to try fitting the model of homogeneous association. This allows all pairs of factors to be associated, but asserts that each pairwise association is the same across the levels of the remaining factor. The resulting plot displays the contributions to a 3-way association, but is not shown here. <>= mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Day:Network + Time:Network, legend=FALSE, gp=shading_Friendly) @ \subsection[Mosaics for glm() and gnm() models]{Mosaics for \codefun{glm} and \codefun{gnm} models}\label{sec:mosglm} The \pkg{vcdExtra} package provides an additional method, \codefun{mosaic.glm} for models fit with \codefun{glm} and \codefun{gnm}.% \footnote{ Models fit with \codefun{gnm} are of \code{class = c("gnm", "glm", "lm")}, so all \code{*.glm} methods apply, unless overridden in the \pkg{gnm} package. } These are not restricted to the Poisson family, but only apply to cases where the response variable is non-negative. \Example Here, we plot the independence and the linear-by-linear association model for the Mental health data from \secref{sec:glm}. These examples illustrate some of the options for labeling (variable names and residuals printed in cells). Note that the \code{formula} supplied to \codefun{mosaic} for \class{glm} objects refers to the order of factors displayed in the plot, not the model. <>= long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(indep, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, main="Mental health data: Independence") mosaic(linlin, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: Linear x Linear") @ \setkeys{Gin}{width=0.49\textwidth} <>= long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(indep, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, main="Mental health data: Independence") @ <>= long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(linlin, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: Linear x Linear") @ The \pkg{gnm} package also fits a wide variety of models with nonlinear terms or terms for structured associations of table variables. In the following, we fit the RC(1) model \begin{equation*} \log ( m_{ij} ) = \mu + \lambda_i^A + \lambda_j^B + \phi \mu_i \nu_j \end{equation*} This is similar to the linear by linear model, except that the row effect parameters ($\mu_i$) and column parameters ($\nu_j$) are estimated from the data rather than given assigned equally-spaced values. The multiplicative terms are specified by the \codefun{Mult}. <>= Mental$mental <- C(Mental$mental, treatment) Mental$ses <- C(Mental$ses, treatment) RC1model <- gnm(Freq ~ mental + ses + Mult(mental, ses), family = poisson, data = Mental) mosaic(RC1model, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: RC(1) model") @ Other forms of nonlinear terms are provided for the inverse of a predictor (\codefun{Inv}) and the exponential of a predictor (\codefun{Exp}). You should read \code{vignette("gnmOverview", package="gnm")} for further details. \subsection{Mosaic tips and techniques}\label{sec:tips} The \pkg{vcd} package implements an extremely general collection of graphical methods for $n$-way frequency tables within the strucplot framework, which includes mosaic plots (\codefun{mosaic}), as well as association plots (\codefun{assoc}), sieve diagrams (\codefun{sieve}), as well as tabular displays (\codefun{structable}). The graphical methods in \pkg{vcd} support a wide of options that control almost all of the details of the plots, but it is often difficult to determine what arguments you need to supply to achieve a given effect from the \code{help()}. As a first step, you should read the \code{vignette("strucplot")} in \pkg{vcd} to understand the overall structure of these plot methods. The notes below describe a few useful things that may not be obvious, or can be done in different ways. \subsubsection[Changing labels]{Changing the labels for variables and levels} With data in contingency table form or as a frequency data frame, it often happens that the variable names and/or the level values of the factors, while suitable for analysis, are less than adequate when used in mosaic plots and other strucplot displays. For example, we might prefer that a variable named \code{ses} appear as \code{"Socioeconomic Status"}, or a factor with levels \code{c("M", "F")} be labeled using \code{c("Male", "Female")} in a plot. Or, sometimes we start with a factor whose levels are fully spelled out (e.g., \code{c("strongly disagree", "disagree", "neutral", "agree", "strongly agree")}), only to find that the level labels overlap in graphic displays. The strucplot framework in \pkg{vcd} provides an extremely large variety of functions and options for controlling almost all details of text labels in mosaics and other plots. See \code{help(labelings)} for an overview. For example, in \secref{sec:ordered-factors} we showed how to rearrange the dimensions of the \code{UCBAdmissions} table, change the names of the table variables, and relabel the levels of one of the table variables. The code below changes the actual table for plotting purposes, but we pointed out that these changes can create other problems in analysis. <>= UCB <- aperm(UCBAdmissions, c(2, 1, 3)) names(dimnames(UCB)) <- c("Sex", "Admit?", "Department") dimnames(UCB)[[2]] <- c("Yes", "No") @ The same effects can be achieved \emph{without} modifying the data using the \verb|set_varnames| and \verb|set_labels| options in \codefun{mosaic} as follows: <>= vnames <- list(set_varnames = c(Admit="Admission", Gender="Sex", Dept="Department")) lnames <- list(Admit = c("Yes", "No"), Gender = c("Males", "Females"), Dept = LETTERS[1:6]) mosaic(UCBAdmissions, labeling_args=vnames, set_labels=lnames) @ In some cases, it may be sufficient to abbreviate (or clip, or rotate) level names to avoid overlap. For example, the statements below produce another version of \figref{fig:TV-mosaic} with days of the week abbreviated to their first three letters. Section 4 in the \code{vignette("strucplot")} provides many other examples. <>= dimnames(TV2)$Time <- c("8", "9", "10") # re-level for mosaic display mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Network, legend=FALSE, gp=shading_Friendly, labeling_args=list(abbreviate=c(Day=3)) ) @ %\subsubsection{Fitting complex models with glm() and gnm()} \section[Continuous predictors]{Continuous predictors}\label{sec:contin} When continuous predictors are available---and potentially important--- in explaining a categorical outcome, models for that outcome include: logistic regression (binary response), the proportional odds model (ordered polytomous response), multinomial (generalized) logistic regression. Many of these are special cases of the generalized linear model using the \code{"poisson"} or \code{"binomial"} family and their relatives. \subsection{Spine and conditional density plots}\label{sec:spine} I don't go into fitting such models here, but I would be remiss not to illustrate some visualizations in \pkg{vcd} that are helpful here. The first of these is the spine plot or spinogram \citep{vcd:Hummel:1996} (produced with \codefun{spine}). These are special cases of mosaic plots with specific spacing and shading to show how a categorical response varies with a continuous or categorical predictor. They are also a generalization of stacked bar plots where not the heights but the \emph{widths} of the bars corresponds to the relative frequencies of \code{x}. The heights of the bars then correspond to the conditional relative frequencies of {y} in every \code{x} group. \Example For the \data{Arthritis} data, we can see how \code{Improved} varies with \code{Age} as follows. \codefun{spine} takes a formula of the form \verb|y ~ x| with a single dependent factor and a single explanatory variable \code{x} (a numeric variable or a factor). The range of a numeric variable\code{x} is divided into intervals based on the \code{breaks} argument, and stacked bars are drawn to show the distribution of \code{y} as \code{x} varies. As shown below, the discrete table that is visualized is returned by the function. <>= (spine(Improved ~ Age, data = Arthritis, breaks = 3)) (spine(Improved ~ Age, data = Arthritis, breaks = "Scott")) @ \setkeys{Gin}{width=0.49\textwidth} <>= (spine(Improved ~ Age, data = Arthritis, breaks = 3)) @ <>= (spine(Improved ~ Age, data = Arthritis, breaks = "Scott")) @ The conditional density plot \citep{vcd:Hofmann+Theus} is a further generalization. This visualization technique is similar to spinograms, but uses a smoothing approach rather than discretizing the explanatory variable. As well, it uses the original \code{x} axis and not a distorted one. \setkeys{Gin}{width=0.6\textwidth} \begin{figure}[htb] \begin{center} <>= cdplot(Improved ~ Age, data = Arthritis) with(Arthritis, rug(jitter(Age), col="white", quiet=TRUE)) @ \caption{Conditional density plot for the \data{Arthritis} data showing the variation of Improved with Age.} \label{fig:cd-plot} \end{center} \end{figure} In such plots, it is useful to also see the distribution of the observations across the horizontal axis, e.g., with a \codefun{rug} plot. \figref{fig:cd-plot} uses \codefun{cdplot} from the \pkg{graphics} package rather than \verb|cd_plot()| from \pkg{vcd}, and is produced with <>= cdplot(Improved ~ Age, data = Arthritis) with(Arthritis, rug(jitter(Age), col="white", quiet=TRUE)) @ From \figref{fig:cd-plot} it can be easily seen that the proportion of patients reporting Some or Marked improvement increases with Age, but there are some peculiar bumps in the distribution. These may be real or artifactual, but they would be hard to see with most other visualization methods. When we switch from non-parametric data exploration to parametric statistical models, such effects are easily missed. \subsection[Model-based plots]{Model-based plots: effect plots and \pkg{ggplot2} plots}\label{sec:modelplots} The nonparametric conditional density plot uses smoothing methods to convey the distributions of the response variable, but displays that are simpler to interpret can often be obtained by plotting the predicted response from a parametric model. For complex \codefun{glm} models with interaction effects, the \pkg{effects} package provides the most useful displays, plotting the predicted values for a given term, averaging over other predictors not included in that term. I don't illustrate this here, but see \citet{effects:1,effects:2} and \code{help(package="effects")}. Here I just briefly illustrate the capabilities of the \pkg{ggplot2} package for model-smoothed plots of categorical responses in \codefun{glm} models. \Example The \data{Donner} data frame in \pkg{vcdExtra} gives details on the survival of 90 members of the Donner party, a group of people who attempted to migrate to California in 1846. They were trapped by an early blizzard on the eastern side of the Sierra Nevada mountains, and before they could be rescued, nearly half of the party had died. What factors affected who lived and who died? <>= data(Donner, package="vcdExtra") str(Donner) @ A potential model of interest is the logistic regression model for $Pr(survived)$, allowing separate fits for males and females as a function of \code{age}. The key to this is the \verb|stat_smooth()| function, using \code{method = "glm", method.args = list(family = binomial)}. The \verb|formula = y ~ x| specifies a linear fit on the logit scale (\figref{fig:donner3}, left) <>= # separate linear fits on age for M/F ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ x, alpha = 0.2, size=2, aes(fill = sex)) @ Alternatively, we can allow a quadratic relation with \code{age} by specifying \verb|formula = y ~ poly(x,2)| (\figref{fig:donner3}, right). <>= # separate quadratics ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ poly(x,2), alpha = 0.2, size=2, aes(fill = sex)) @ \setkeys{Gin}{width=0.49\textwidth} \begin{figure}[htb] \begin{center} <>= ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ x, alpha = 0.2, size=2, aes(fill = sex)) @ <>= # separate quadratics ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ poly(x,2), alpha = 0.2, size=2, aes(fill = sex)) @ \caption{Logistic regression plots for the \data{Donner} data showing survival vs. age, by sex. Left: linear logistic model; right: quadratic model} \label{fig:donner3} \end{center} \end{figure} These plots very nicely show (a) the fitted $Pr(survived)$ for males and females; (b) confidence bands around the smoothed model fits and (c) the individual observations by jittered points at 0 and 1 for those who died and survived, respectively. \bibliography{vcd,vcdExtra} \end{document} vcdExtra/vignettes/vcd.bib0000644000176200001440000006353013164013351015300 0ustar liggesusers%% general graphics & original methods @Article{vcd:Cohen:1980, author = {A. Cohen}, title = {On the Graphical Display of the Significant Components in a Two-Way Contingency Table}, journal = {Communications in Statistics---Theory and Methods}, year = {1980}, volume = {A9}, pages = {1025--1041} } @InProceedings{vcd:Hartigan+Kleiner:1981, author = {J. A. Hartigan and B. Kleiner}, title = {Mosaics for Contingency Tables}, booktitle = {Computer Science and Statistics: Proceedings of the 13th Symposium on the Interface}, pages = {268--273}, year = {1981}, editor = {W. F. Eddy}, address = {New York}, publisher = {Springer-Verlag} } @Article{vcd:Hartigan+Kleiner:1984, author = {J. A. Hartigan and B. Kleiner}, title = {A Mosaic of Television Ratings}, journal = {The American Statistician}, year = {1984}, volume = {38}, pages = {32--35} } @TechReport{vcd:Young:1996, author = {Forrest W. Young}, title = {{\pkg{ViSta}}: The Visual Statistics System}, institution = {UNC L.~L.~Thurstone Psychometric Laboratory Research Memorandum}, year = 1996, number = {94--1(c)} } @Book{vcd:Cleveland:1993, author = {William S. Cleveland}, title = {Visualizing Data}, publisher = {Hobart Press}, year = 1993, address = {Summit, New Jersey} } @Article{vcd:Becker+Cleveland+Shyu:1996, author = {Richard A. Becker and William S. Cleveland and Ming-Jen Shyu}, title = {The Visual Design and Control of Trellis Display}, journal = {Journal of Computational and Graphical Statistics}, year = {1996}, volume = {5}, pages = {123--155} } @InProceedings{vcd:Riedwyl+Schuepbach:1994, author = {H. Riedwyl and M. Sch{\"u}pbach}, title = {Parquet Diagram to Plot Contingency Tables}, booktitle = {Softstat '93: Advances in Statistical Software}, pages = {293--299}, year = 1994, editor = {F. Faulbaum}, address = {New York}, publisher = {Gustav Fischer} } %% color @InProceedings{vcd:Ihaka:2003, author = {Ross Ihaka}, title = {Colour for Presentation Graphics}, booktitle = {Proceedings of the 3rd International Workshop on Distributed Statistical Computing, Vienna, Austria}, editor = {Kurt Hornik and Friedrich Leisch and Achim Zeileis}, year = {2003}, url = {http://www.ci.tuwien.ac.at/Conferences/DSC-2003/Proceedings/}, note = {{ISSN 1609-395X}}, } @Article{vcd:Lumley:2006, author = {Thomas Lumley}, title = {Color Coding and Color Blindness in Statistical Graphics}, journal = {ASA Statistical Computing \& Graphics Newsletter}, year = {2006}, volume = {17}, number = {2}, pages = {4--7} } @Book{vcd:Munsell:1905, author = {Albert H. Munsell}, title = {A Color Notation}, publisher = {Munsell Color Company}, year = {1905}, address = {Boston, Massachusetts} } @Article{vcd:Harrower+Brewer:2003, author = {Mark A. Harrower and Cynthia A. Brewer}, title = {\pkg{ColorBrewer.org}: An Online Tool for Selecting Color Schemes for Maps}, journal = {The Cartographic Journal}, year = {2003}, volume = {40}, pages = {27--37} } @InProceedings{vcd:Brewer:1999, author = {Cynthia A. Brewer}, title = {Color Use Guidelines for Data Representation}, booktitle = {Proceedings of the Section on Statistical Graphics, American Statistical Association}, address = {Alexandria, VA}, year = {1999}, pages = {55--60} } @Article{vcd:Cleveland+McGill:1983, author = {William S. Cleveland and Robert McGill}, title = {A Color-caused Optical Illusion on a Statistical Graph}, journal = {The American Statistician}, year = {1983}, volume = {37}, pages = {101--105} } @Book{vcd:CIE:2004, author = {{Commission Internationale de l'\'Eclairage}}, title = {Colorimetry}, edition = {3rd}, publisher = {Publication CIE 15:2004}, address = {Vienna, Austria}, year = {2004}, note = {{ISBN} 3-901-90633-9} } @InProceedings{vcd:Moretti+Lyons:2002, author = {Giovanni Moretti and Paul Lyons}, title = {Tools for the Selection of Colour Palettes}, booktitle = {Proceedings of the New Zealand Symposium On Computer-Human Interaction (SIGCHI 2002)}, address = {University of Waikato, New Zealand}, month = {July}, year = {2002} } @Article{vcd:MacAdam:1942, author = {D. L. MacAdam}, title = {Visual Sensitivities to Color Differences in Daylight}, journal = {Journal of the Optical Society of America}, year = {1942}, volume = {32}, number = {5}, pages = {247--274}, } @Book{vcd:Wyszecki+Stiles:2000, author = {G\"unter Wyszecki and W. S. Stiles}, title = {Color Science}, edition = {2nd}, publisher = {Wiley}, year = {2000}, note = {{ISBN} 0-471-39918-3} } @Misc{vcd:Poynton:2000, author = {Charles Poynton}, title = {Frequently-Asked Questions About Color}, year = {2000}, howpublished = {URL \url{http://www.poynton.com/ColorFAQ.html}}, note = {Accessed 2006-09-14}, } @Misc{vcd:Wiki+HSV:2006, author = {Wikipedia}, title = {{HSV} Color Space --- {W}ikipedia{,} The Free Encyclopedia}, year = {2006}, howpublished = {URL \url{http://en.wikipedia.org/w/index.php?title=HSV_color_space&oldid=74735552}}, note = {Accessed 2006-09-14}, } @Misc{vcd:Wiki+LUV:2006, author = {Wikipedia}, title = {{Lab} Color Space --- {W}ikipedia{,} The Free Encyclopedia}, year = {2006}, howpublished = {URL \url{http://en.wikipedia.org/w/index.php?title=Lab_color_space&oldid=72611029}}, note = {Accessed 2006-09-14}, } @Article{vcd:Smith:1978, author = {Alvy Ray Smith}, title = {Color Gamut Transform Pairs}, journal = {Computer Graphics}, pages = {12--19}, year = {1978}, volume = {12}, number = {3}, note = {ACM SIGGRAPH 78 Conference Proceedings}, } %% url = {http://www.alvyray.com/}, @Article{vcd:Meier+Spalter+Karelitz:2004, author = {Barbara J. Meier and Anne Morgan Spalter and David B. Karelitz}, title = {Interactive Color Palette Tools}, journal = {{IEEE} Computer Graphics and Applications}, volume = {24}, number = {3}, year = {2004}, pages = {64--72}, } %% url = {http://graphics.cs.brown.edu/research/color/} @InCollection{vcd:Mollon:1995, author = {J. Mollon}, editor = {T. Lamb and J. Bourriau}, booktitle = {Colour: Art and Science}, title = {Seeing Color}, publisher = {Cambridge Univesity Press}, year = 1995 } %% Friendly publications @Article{vcd:Friendly:1994, author = {Michael Friendly}, title = {Mosaic Displays for Multi-Way Contingency Tables}, journal = {Journal of the American Statistical Association}, year = {1994}, volume = {89}, pages = {190--200} } @Article{vcd:Friendly:1999, author = {Michael Friendly}, title = {Extending Mosaic Displays: Marginal, Conditional, and Partial Views of Categorical Data}, journal = {Journal of Computational and Graphical Statistics}, year = {1999}, volume = {8}, number = {3}, pages = {373--395} } @Book{vcd:Friendly:2000, author = {Michael Friendly}, title = {Visualizing Categorical Data}, publisher = {\textsf{SAS} Insitute}, year = {2000}, address = {Carey, NC}, URL = {http://www.math.yorku.ca/SCS/vcd/} } @Book{FriendlyMeyer:2016:DDAR, title = {Discrete Data Analysis with R: Visualization and Modeling Techniques for Categorical and Count Data}, year = {2016}, author = {Friendly, Michael and Meyer, David}, publisher = {Chapman \& Hall/CRC}, address = {Boca Raton, FL}, isbn = {978-1-4987-2583-5}, } %% Augsburg publications @Article{vcd:Theus+Lauer:1999, author = {Martin Theus and Stephan R. W. Lauer}, title = {Visualizing Loglinear Models}, journal = {Journal of Computational and Graphical Statistics}, year = 1999, volume = 8, number = 3, pages = {396--412} } @Article{vcd:Hofmann:2003, author = {Heike Hofmann}, title = {Constructing and Reading Mosaicplots}, journal = {Computational Statistics \& Data Analysis}, year = {2003}, volume = {43}, pages = {565--580} } @Article{vcd:Hofmann:2001, author = {Heike Hofmann}, title = {Generalized Odds Ratios for Visual Modelling}, journal = {Journal of Computational and Graphical Statistics}, year = {2001}, volume = {10}, pages = {1--13} } @Article{vcd:Theus:2003, author = {Martin Theus}, title = {Interactive Data Visualization Using \pkg{Mondrian}}, journal = {Journal of Statistical Software}, volume = 7, number = 11, pages = {1--9}, year = 2003, url = {http://www.jstatsoft.org/v07/i11/}, } @Unpublished{vcd:Hofmann+Theus, author = {Heike Hofmann and Martin Theus}, title = {Interactive Graphics for Visualizing Conditional Distributions}, note = {Unpublished Manuscript}, year = {2005} } @Article{vcd:Hummel:1996, author = {J. Hummel}, title = {Linked Bar Charts: Analysing Categorical Data Graphically}, journal = {Computational Statistics}, year = 1996, volume = 11, pages = {23--33} } @Article{vcd:Unwin+Hawkins+Hofmann:1996, author = {Antony R. Unwin and G. Hawkins and Heike Hofmann and B. Siegl}, title = {Interactive Graphics for Data Sets with Missing Values -- \pkg{MANET}}, journal = {Journal of Computational and Graphical Statistics}, year = 1996, pages = {113--122}, volume = 4, number = 6 } @Manual{vcd:Urbanek+Wichtrey:2006, title = {\pkg{iplots}: Interactive Graphics for \textsf{R}}, author = {Simon Urbanek and Tobias Wichtrey}, year = {2006}, note = {\textsf{R} package version 1.0-3}, url = {http://www.rosuda.org/iPlots/} } %% Software @Manual{vcd:R:2006, title = {\textsf{R}: {A} Language and Environment for Statistical Computing}, author = {{\textsf{R} Development Core Team}}, organization = {\textsf{R} Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2006}, note = {{ISBN} 3-900051-00-3}, url = {http://www.R-project.org/} } @Article{vcd:Murrell:2002, author = {Paul Murrell}, title = {The \pkg{grid} Graphics Package}, journal = {\proglang{R} News}, year = 2002, volume = 2, number = 2, pages = {14--19}, month = {June}, url = {http://CRAN.R-project.org/doc/Rnews/} } @Book{vcd:Murrell:2006, author = {Paul Murrell}, title = {\textsf{R} Graphics}, publisher = {Chapmann \& Hall/CRC}, address = {Boca Raton, Florida}, year = {2006}, } @Book{vcd:Venables+Ripley:2002, author = {William N. Venables and Brian D. Ripley}, title = {Modern Applied Statistics with \textsf{S}}, edition = {4th}, publisher = {Springer-Verlag}, address = {New York}, year = {2002}, note = {{ISBN} 0-387-95457-0}, url = {http://www.stats.ox.ac.uk/pub/MASS4/} } @Manual{vcd:Ihaka:2006, title = {\pkg{colorspace}: Colorspace Manipulation}, author = {Ross Ihaka}, year = {2006}, note = {\textsf{R} package version 0.95} } @Manual{vcd:Meyer+Zeileis+Hornik:2006, title = {\pkg{vcd}: Visualizing Categorical Data}, author = {David Meyer and Achim Zeileis and Kurt Hornik}, year = {2006}, note = {\textsf{R} package version 1.0-6} } @article{vcd:Ligges+Maechler:2003, title = {\pkg{scatterplot3d} -- An {R} Package for Visualizing Multivariate Data}, author = {Uwe Ligges and Martin M{\"a}chler}, journal = {Journal of Statistical Software}, year = 2003, pages = {1--20}, number = 11, volume = 8, url = {http://www.jstatsoft.org/v08/i11/} } @Manual{vcd:SAS:2005, title = {\proglang{SAS/STAT} Version 9}, author = {\proglang{SAS} Institute Inc.}, year = {2005}, address = {Cary, NC} } @Manual{vcd:SPLUS:2005, title = {\proglang{S-PLUS} 7}, author = {{Insightful Inc.}}, year = {2005}, address = {Seattle, WA} } %% data @Article{vcd:Azzalini+Bowman:1990, author = {A. Azzalini and A. W. Bowman}, title = {A Look at Some Data on the {O}ld {F}aithful Geyser}, journal = {Applied Statistics}, year = {1990}, volume = {39}, pages = {357--365}, } @Article{vcd:Obel:1975, author = {E.B. Obel}, title = {A Comparative Study of Patients with Cancer of the Ovary Who Have Survived More or Less Than 10 Years}, journal = {Acta Obstetricia et Gynecologica Scandinavica}, year = 1975, volume = 55, pages = {429--439} } @InCollection{vcd:Koch+Edwards:1988, author = {G. Koch and S. Edwards}, title = {Clinical Efficiency Trials with Categorical Data}, booktitle = {Biopharmaceutical Statistics for Drug Development}, editor = {K. E. Peace}, publisher = {Marcel Dekker}, address = {New York}, year = {1988}, pages = {403--451} } @TechReport{vcd:Knorr-Held:1999, author = {Leonhard Knorr-Held}, title = {Dynamic Rating of Sports Teams}, institution = {SFB 386 ``Statistical Analysis of Discrete Structures''}, year = {1999}, type = {Discussion Paper}, number = {98}, url = {http://www.stat.uni-muenchen.de/sfb386/} } @Article{vcd:Snee:1974, author = {R. D. Snee}, title = {Graphical Display of Two-Way Contingency Tables}, journal = {The American Statistician}, year = 1974, volume = 28, pages = {9--12} } @Article{vcd:Bickel+Hammel+O'Connell:1975, author = {P. J. Bickel and E. A. Hammel and J. W. O'Connell}, title = {Sex Bias in Graduate Admissions: Data from {B}erkeley}, journal = {Science}, year = 1975, volume = 187, pages = {398--403} } @Book{vcd:Gilbert:1981, author = {G. N. Gilbert}, title = {Modelling Society: An Introduction to Loglinear Analysis for Social Researchers}, publisher = {Allen and Unwin}, year = 1981, address = {London} } @Book{vcd:Thornes+Collard:1979, author = {B. Thornes and J. Collard}, title = {Who Divorces?}, publisher = {Routledge \& Kegan}, year = 1979, address = {London} } @Article{vcd:Dawson:1995, author = {Robert J. MacG Dawson}, title = {The ``Unusual Episode'' Data Revisited}, journal = {Journal of Statistics Education}, year = 1995, volume = 3, url = {http://www.amstat.org/publications/jse/v3n3/datasets.dawson.html} } @Article{vcd:Haberman:1974, author = {S. J. Haberman}, title = {Log-linear Models for Frequency Tables with Ordered Classifications}, journal = {Biometrics}, year = 1974, volume = 30, pages = {689--700} } @Article{vcd:Wing:1962, author = {J. K. Wing}, title = {Institutionalism in Mental Hospitals}, journal = {British Journal of Social Clinical Psychology}, year = 1962, volume = 1, pages = {38--51} } @Book{vcd:Andersen:1991, author = {E. B. Andersen}, title = {The Statistical Analysis of Categorical Data}, publisher = {Springer-Verlag}, year = {1991}, address = {Berlin}, edition = {2nd} } @Article{vcd:Haberman:1973, author = {S. J. Haberman}, title = {The Analysis of Residuals in Cross-classified Tables}, journal = {Biometrics}, year = {1973}, volume = {29}, pages = {205--220} } @Book{vcd:Everitt+Hothorn:2006, author = {Brian S. Everitt and Torsten Hothorn}, title = {A Handbook of Statistical Analyses Using \textsf{R}}, publisher = {Chapman \& Hall/CRC}, address = {Boca Raton, Florida}, year = {2006} } @Article{vcd:Salib+Hillier:1997, author = {Emad Salib and Valerie Hillier}, title = {A Case-Control Study of Smoking and {A}lzheimer's Disease}, journal = {International Journal of Geriatric Psychiatry}, year = {1997}, volume = {12}, pages = {295--300} } %% inference @Book{vcd:Agresti:2002, author = {Alan Agresti}, title = {Categorical Data Analysis}, publisher = {John Wiley \& Sons}, year = {2002}, address = {Hoboken, New Jersey}, edition = {2nd} } @Book{vcd:Mazanec+Strasser:2000, author = {Josef A. Mazanec and Helmut Strasser}, title = {A Nonparametric Approach to Perceptions-based Market Segmentation: Foundations}, publisher = {Springer-Verlag}, year = {2000}, address = {Berlin} } @Article{vcd:Strasser+Weber:1999, author = {Helmut Strasser and Christian Weber}, title = {On the Asymptotic Theory of Permutation Statistics}, journal = {Mathematical Methods of Statistics}, volume = {8}, pages = {220--250}, year = {1999} } @Book{vcd:Pesarin:2001, author = {Fortunato Pesarin}, title = {Multivariate Permutation Tests}, year = {2001}, publisher = {John Wiley \& Sons}, address = {Chichester} } @Article{vcd:Ernst:2004, author = {Michael D. Ernst}, title = {Permutation Methods: A Basis for Exact Inference}, journal = {Statistical Science}, volume = {19}, year = {2004}, pages = {676--685} } @Article{vcd:Patefield:1981, author = {W. M. Patefield}, title = {An Efficient Method of Generating $R \times C$ Tables with Given Row and Column Totals}, note = {{A}lgorithm AS 159}, journal = {Applied Statistics}, volume = {30}, year = {1981}, pages = {91--97} } %% own @InProceedings{vcd:Meyer+Zeileis+Hornik:2003, author = {David Meyer and Achim Zeileis and Kurt Hornik}, title = {Visualizing Independence Using Extended Association Plots}, booktitle = {Proceedings of the 3rd International Workshop on Distributed Statistical Computing, Vienna, Austria}, editor = {Kurt Hornik and Friedrich Leisch and Achim Zeileis}, year = {2003}, url = {http://www.ci.tuwien.ac.at/Conferences/DSC-2003/Proceedings/}, note = {{ISSN 1609-395X}}, } @TechReport{vcd:Zeileis+Meyer+Hornik:2005, author = {Achim Zeileis and David Meyer and Kurt Hornik}, title = {Residual-based Shadings for Visualizing (Conditional) Independence}, institution = {Department of Statistics and Mathematics, Wirtschaftsuniversit\"at Wien, Research Report Series}, year = {2005}, type = {Report}, number = {20}, month = {August}, url = {http://epub.wu-wien.ac.at/dyn/openURL?id=oai:epub.wu-wien.ac.at:epub-wu-01_871} } @Article{vcd:Zeileis+Meyer+Hornik:2007, author = {Achim Zeileis and David Meyer and Kurt Hornik}, title = {Residual-based Shadings for Visualizing (Conditional) Independence}, journal = {Journal of Computational and Graphical Statistics}, year = {2007}, volume = {16}, number = {3}, pages = {507--525}, doi = {10.1198/106186007X237856}, url = {http://statmath.wu-wien.ac.at/~zeileis/papers/Zeileis+Meyer+Hornik-2007.pdf} } @TechReport{vcd:Meyer+Zeileis+Hornik:2005a, author = {David Meyer and Achim Zeileis and Kurt Hornik}, title = {The Strucplot Framework: Visualizing Multi-Way Contingency Tables with \pkg{vcd}}, institution = {Department of Statistics and Mathematics, Wirtschaftsuniversit\"at Wien, Research Report Series}, year = {2005}, type = {Report}, number = {22}, month = {November}, url = {http://epub.wu-wien.ac.at/dyn/openURL?id=oai:epub.wu-wien.ac.at:epub-wu-01_8a1} } @Article{vcd:Meyer+Zeileis+Hornik:2006b, author = {David Meyer and Achim Zeileis and Kurt Hornik}, title = {The Strucplot Framework: Visualizing Multi-way Contingency Tables with \pkg{vcd}}, year = {2006}, journal = {Journal of Statistical Software}, volume = {17}, number = {3}, pages = {1--48}, url = {http://www.jstatsoft.org/v17/i03/} } @InCollection{vcd:Meyer+Zeileis+Hornik:2006a, author = {David Meyer and Achim Zeileis and Kurt Hornik}, title = {Visualizing Contingency Tables}, editor = {Chun-Houh Chen and Wolfang H\"ardle and Antony Unwin}, booktitle = {Handbook of Data Visualization}, series = {Springer Handbooks of Computational Statistics}, year = {2006}, publisher = {Springer-Verlag}, address = {New York}, note = {{ISBN} 3-540-33036-4, to appear} } @Article{vcd:Hothorn+Hornik+VanDeWiel:2006, author = {Torsten Hothorn and Kurt Hornik and Mark A. van de Wiel and Achim Zeileis}, title = {A {L}ego System for Conditional Inference}, journal = {The American Statistician}, year = {2006}, volume = {60}, number = {3}, pages = {257--263}, doi = {10.1198/000313006X118430} } @TechReport{vcd:Zeileis+Hornik:2006, author = {Achim Zeileis and Kurt Hornik}, title = {Choosing Color Palettes for Statistical Graphics}, institution = {Department of Statistics and Mathematics, Wirtschaftsuniversit\"at Wien, Research Report Series}, year = {2006}, type = {Report}, number = {41}, month = {October}, url = {http://epub.wu-wien.ac.at/} } %% bad color examples @Article{vcd:Gneiting+Sevcikova+Percival:2006, author = {Tilmann Gneiting and Hana \v{S}ev\v{c}\'ikov\'a and Donald B. Percival and Martin Schlather and Yindeng Jiang}, title = {Fast and Exact Simulation of Large Gaussian Lattice Systems in {$\mathbb{R}^2$}: Exploring the Limits}, year = {2006}, journal = {Journal of Computational and Graphical Statistics}, volume = {15}, number = {3}, pages = {483--501}, note = {Figures~1--4} } @Article{vcd:Yang+Buckley+Dudoit:2002, author = {Yee Hwa Yang and Michael J. Buckley and Sandrine Dudoit and Terence P. Speed}, title = {Comparison of Methods for Image Analysis on {cDNA} Microarray Data}, year = {2002}, journal = {Journal of Computational and Graphical Statistics}, volume = {11}, number = {1}, pages = {108--136}, note = {Figure~4a} } @Article{vcd:Kneib:2006, author = {Thomas Kneib}, title = {Mixed Model-based Inference in Geoadditive Hazard Regression for Interval-censored Survival Times}, year = {2006}, journal = {Computational Statistics \& Data Analysis}, volume = {51}, pages = {777--792}, note = {Figure~5 (left)} } @Article{vcd:Friendly:2002, author = {Michael Friendly}, title = {A Brief History of the Mosaic Display}, year = {2002}, journal = {Journal of Computational and Graphical Statistics}, volume = {11}, number = {1}, pages = {89--107}, note = {Figure~11 (left, middle)} } @Article{vcd:Celeux+Hurn+Robert:2000, author = {Gilles Celeux and Merrilee Hurn and Christian P. Robert}, title = {Computational and Inferential Difficulties with Mixture Posterior Distributions}, year = {2000}, journal = {Journal of the American Statistical Association}, volume = {95}, number = {451}, pages = {957--970}, note = {Figure~3} } %% pointers from Hadley @article{cleveland:1987, Author = {Cleveland, William and McGill, Robert}, Journal = {Journal of the Royal Statistical Society A}, Number = {3}, Pages = {192-229}, Title = {Graphical Perception: The Visual Decoding of Quantitative Information on Graphical Displays of Data}, Volume = {150}, Year = {1987}} @article{cleveland:1984, Author = {Cleveland, William S. and McGill, M. E.}, Journal = {Journal of the American Statistical Association}, Number = 387, Pages = {531-554}, Title = {Graphical Perception: Theory, Experimentation and Application to the Development of Graphical Methods}, Volume = 79, Year = 1984} @article{huang:1997, Author = {Huang, Chisheng and McDonald, John Alan and Stuetzle, Werner}, Journal = {Journal of Computational and Graphical Statistics}, Pages = {383--396}, Title = {Variable resolution bivariate plots}, Volume = {6}, Year = {1997}} @article{carr:1987, Author = {Carr, D. B. and Littlefield, R. J. and Nicholson, W. L. and Littlefield, J. S.}, Journal = {Journal of the American Statistical Association}, Number = {398}, Pages = {424-436}, Title = {Scatterplot Matrix Techniques for Large N}, Volume = {82}, Year = {1987}} @book{cleveland:1994, Author = {Cleveland, William}, Publisher = {Hobart Press}, Title = {The Elements of Graphing Data}, Year = {1994}} @book{chambers:1983, Author = {Chambers, John and Cleveland, William and Kleiner, Beat and Tukey, Paul}, Publisher = {Wadsworth}, Title = {Graphical methods for data analysis}, Year = {1983}} @book{bertin:1983, Address = {Madison, WI}, Author = {Bertin, Jacques}, Publisher = {University of Wisconsin Press}, Title = {Semiology of Graphics}, Year = {1983}} @book{wilkinson:2006, Author = {Wilkinson, Leland}, Publisher = {Springer-Verlag}, Series = {Statistics and Computing}, Title = {The Grammar of Graphics}, Year = {2005}} vcdExtra/NEWS0000644000176200001440000002564514202267352012550 0ustar liggesusersVersion 0.7-6 (2022-02-12) o Fix some issues with CMHtest `types` argument #PR11 [Thx: ShuguangSun, Matt Kumar] o Fix some Winbuilder URL nits; extensive spell checking Version 0.7-5 (2020-12-25) o Fix problem re use of rgl in mosaic3d examples Version 0.7-4 (2019-09-25) o Fix datasets() to work with packages not using LazyData #PR7 [Thx: Duncan Murdock] o Bump package version Version 0.7-3 (2018-06-04) o fix version number for gnm in DESCRIPTION o fix expand.dft and expand.table to work with tibbles [Thx: Duncan Murdoch] o vcdExtra gets a hex sticker Version 0.7-1 (2017-09-28) o Fixed buglet in expand.dft when table is 1-dim [Thx: Long Qu] o Added zero.test, a simple score test for zero inflation o Development has moved to https://github.com/friendly/vcdExtra Version 0.7-0 (2016-01-27) o Added Glass data o introduce links and references to DDAR o added mcaplot() to plot MCA solutions in DDAR style o added update.xtabs method o updated vignette to refer to DDAR Version 0.6-12 (2015-10-06) o Added Burt data o Fixed examples/vignette for ggplot_2.0.0 Version 0.6-11 (2015-09-14) o bump pkg version for CRAN Version 0.6-10 (2015-07-27) o Added HospVisits data Version 0.6-9 (2015-06-11) o Added Mice data o Removed uses of summarise() and Summarise() from demos and examples, in preparation for deprecating them. o summarise() is now deprecated o Now use importsFrom() for all functions from recommended packages Version 0.6-8 (2015-04-15) o Fixed Title: and Description: for CRAN Version 0.6-7 (2015-04-02) o Removed loddsratio (now in vcd) (rev 252) o Removed print.Kappa (now in vcd) (rev 253) o Fixed bug in CMHtest: rmeans and cmeans labels were reversed (rev 254) o Fixed error in Fungicide.Rd, now that we require vcd_1.3-3 (rev 254) o Added WorkerSat data - 2 x 2 x 2 o Added AirCrash data Version 0.6-6 (2015-02-04) o Minor doc changes Version 0.6-5 (2014-11-07) o Added Cormorants data (fixed to latest) o Added LRstats, to replace Summarise. Older summarise() and Summarise() will eventually be deprecated. o Now Suggests: AER for NMES1988 data o collapse.table() now works with array objects Version 0.6-3 (2014-10-27) o Fixed bug in logLik.loglm when the data contain zero frequencies (rev 228) o Made Summarise generic, adding a method for "glmlist" objects (rev 230) o Added a coef() method for "glmlist" objects (thx: John Fox) o Added a Summarise.loglmlist method (rev 232) o Replaced all documentation uses of summarise() with Summarise() (rev 233) o Added cutfac(), a convenience wrapper for cut() (rev 234) o Now use rgl:: in all mosaic3d functions Version 0.6-2 (2014-06-30) o added Summarise, to replace summarise o Added HairEyePlace data - 4 x 5 x 2, Caithness and Aberdeen hair/eye color (rev 223) o Added PhdPubs data from Long (1997) - publications by PhD candidates o Allow Summarise to work with models w/o a deviance() function o Fixed bug in Summarise wrt degrees of freedom Version 0.6-1 (2014-04-14) o Added ICU data o Added Toxaemia data - multivariate response contingency table (rev 209) o Added Vietnam data - 2 x 5 x 4 frequency table (rev 210) o Added logLik.loglm to allow use of AIC() and BIC() for loglm models (rev 212) o Fixed loddsratio.Rd to work with revised vcd::CoalMiners data (rev 212) o Added blogits for bivariate binary response data o Added Vote1980 data (rev 214) Version 0.6-0 (2014-03-07) o Removed Authors: in DESCRIPTION, bumped version Version 0.5-12 (2013-12-16) o Added ShakeWords data set- word frequency counts from Shakespeare (rev 188) o Added Geissler data-- all family sizes for Saxony sex composition data (rev 190) o Added logseries functions for the logarithmic series distribution (rev 191) o Added Depends data -- dependencies of r packages (rev 192) o Fixed buglet in seq_loglm() not respecting arrays o Added seq_mosaic() (rev 194) o Added CyclingDeaths data (rev 196) o mosaic3d() gets an interpolate= option to control shading levels (rev 197) o Fixed bug in seq_mosaic, thx to David Meyer (rev 200) o Fixed bug in seq_loglm() when marginals != 1:nf Version 0.5-11 (2013-07-01) o Added mosaic.glmlist to plot mosaics (or other strucplots) for some or all models in a glmlist (rev 169) o Added loglim-utilities.R, containing a suite of functions to provide a more conceptual way to specify loglinear models by type ('joint', 'conditional', 'mutual', 'markov', 'saturated') (rev 171) o Added mosaic.loglmlist, similar to mosaic.glmlist for models fit using MASS::loglm (rev 173) o Both mosaic.glmlist and mosaic.glmlist get an explicit panel=argument; both get some more sensible default default arguments (rev 175) o Added seq_loglm to fit sequential loglm models to marginal subtables, giving a loglmlist result (rev 176) o Added Accident data (rev 178); fleshed out Accident examples (rev 180) o Fixed use of ::: for R 3.0.1 (rev 179) o Fixed various problems related to use of MASS:loglm (rev 181-183) o Added Titanicp to datasets (rev 185) Version 0.5-8 (2013-03-06) o Revised vcd-tutorial showing some examples of plyr; added a section on RC models o Added Donner data with example of ggplot2 plot for a binomial glm() o Added vcd-tutorial section using ggplot2 for Donner data o Enhanced datasets() to provide a maxTitle argument (rev 153) o Added doubledecker plots to Dyke.Rd (rev 156) o Added Draft1970table and Draft1970 data sets (rev 158) o Added example of doubledecker plots to vcd-tutorial vignette (rev 164) Version 0.5-7 (2013-03-01) o Completed CMHtest methods, adding overall tests across strata in a general way o CMHtest now gets an S3 generic with a formula interface o print Kappa gets digits= and CI= arguments Version 0.5-6 (2012-11-30) o Added Hosmer Lemeshow and HLtest methods, including plotting via vcd::rootogram() o Added CMHtest for general Cochran-Mantel-Haenszel tests o Revised vcd-tutorial vignette, adding a section on CMH tests; removed dependence on Z.cls Version 0.5-3 (2012-03-07) o Added Mammograms data (4x4, ordered factors, agreement) o Extended mosaic.glm examples o Added Alligator data (4x2x2x5, in frequency form) o Added DaytonSurvey data (5-way, 2x2x2x2x2 in frequency form) o Extended vcd-tutorial vignette with a section on collapsing over factors o Removed aperm.* now that aperm.table is in base R Version 0.5-2 (2010-11-28) o Added loddsratio and related methods for log odds ratios, generalizing vcd::oddsratio from 2 x 2 (x strata) tables to R x C (x strata) tables o Added as.matrix.loddsratio, as.array.loddsratio methods o Added some simple plot examples to example(loddsratio), anticipating a plot method o Added data(Fungicide), a 2 x 2 x 2 x 2 table o Renamed summarize() and related methods to summarise() to avoid conflict with plyr. o Addition to vcd-tutorial vignette on use of aperm() with table objects o Updated demo(yamaguchi-xie) to correct row/col nomenclature and add plot of BIC o Added aperm() S3 generic to handle table objects o Moved tv.dat to inst/doc/extdata to avoid warnings in R 2.12+ Version 0.5-1 (2010-09-17) o Added Yamaguchi87 data (5x5x3 three-way mobility table in frequency form) o Added demo(yamaguchi-xie) illustrating fitting and visualization of the models of homogeneous and log multiplicative layer effects fit in Xie (1992, Table 1) o Added BIC to summarize() and friends o Added Hauser79 data (two-way mobility table), plus some examples from Powers and Xie (2008) o Added Crossings() to construct interactions for Goodman 1972 crossings model. o Added datasets() to list datasets in packages o Extended description and examples of Kway() o Added meanResiduals() and extended mosaic.glm() (Heather Turner) o summarize() gets a sortby argument for glmlist and loglmlist objects Version 0.5-0 (2010-04-28) o Fleshed out mosaic3d, allowing display of observed or expected, internally calculated or externally supplied residuals, specifying the initial 3D shape, etc. This completes the 'top-level' work on mosaic3d(), borrowing code from vcd::strucplot. o Added initial handling for zero cells in the table to mosaic3d(). o Added center3d() for finding the mean coordinates of shape3d objects. o Added demo(mosaic-hec) comparing 2D and 3D mosaics for HairEyeColor data o Gave mosaic3d a label_edge argument, allowing labels for dimensions at minima or maxima o Made mosaic3d object oriented, giving it a loglm method o Added Kway(), fitting all 0-way, 1-way, 2-way, ... k-way models in a glm Version 0.4-3 (2010-03-25) o Added demo(mosaic3d-demo), a proof-of-concept for doing 3D mosaic displays o Added mosaic3d(), an initial basic version. o Factored out split3d() and gave it S3 methods Version 0.4-2 (2010-03-09) o Revised vignette("vcd-tutorial"): added some hints for mosaic(), corrected stuff regarding prior limitations of mosaic.glm() o Added demo(Wong3-1): three-way table, with models of conditional association o Added Suggest: effects for effects plots of glm(), multinom() and polr() models o Added demo(housing): visualize models fit in example(housing, package="MASS") using mosaic() and effect plots. o Updated demo(Wong2-3): added model comparison plots, glmlist processing o Added Suggest: VGAM o Extended package description in vcdExtra-package.Rd o Added glmlist() to facilitate processing, extraction, plotting, etc. of a collection of glm() models o Added loglmlist(), for collections of loglm() objects o Added summarize methods for glm, glmlist, loglm and loglmlist objects Version 0.4-1 (2010-02-21) o Added example(Caesar), illustrating structural zeros o Re-named Heckman variables to e1971, ..., e1968 (errors from loglm); began example(Heckman) o Added example(Detergent), example(Dyke) o Fixed bug with mosaic.glm when data in global environment (Heather Turner) o Added sieve.glm and assoc.glm methods (MF) o Added modFit.glm and modFit.loglm o Added demo(Wong2-3) Version 0.4-0 (2010-02-23) o Added new datasets: data/{Abortion, Bartlett, Caesar, Cancer, Detergent, Dyke, Gilby, Heart, Heckman, Hoyt, Mobility} from mosdata.sas via md2r.sas converter. o Fixed small documentation warnings o Switched inst/CHANGES to NEWS Version 0.3-6 (2009-04-21) o Added Depends: gnm o Added demo/{mental-glm, ucb-glm, vision-quasi} o Added demo/{occStatus,yaish-unidiff} o Initial release to CRAN Version 0.3-5 (2009-3-6) o mosaic.glm now uses object$data if available Version 0.3-4 (2009-2-11) o Fixed bugs in mosaic.glm, mosaic.gnm in models with terms like Diag(dest, origin) that get included in x$xlevels Version 0.3-3 (2009-2-10) o Fixed bugs in mosaic.gnm o Fixed print.GKgamma o Added example of GKgamma to vcd-tutorial Version 0.3-2 (2009-2-8) o Added more examples to mosaic.glm.Rd Version 0.3-0 (2009-2-6) o Fixed bugs in mosaic.glm and mosaic.gnm Version 0.2 (2009-2-1) o Added vcd-tutorial vignette Version 0.1 (2009-1-26) o Initial version on R-Forge. vcdExtra/R/0000755000176200001440000000000014202234157012233 5ustar liggesusersvcdExtra/R/Crossings.R0000644000176200001440000000230213164013351014322 0ustar liggesusers# crossings model (Goodman, 1972) # Ref: #Goodman, L. (1972). Some multiplicative models for the analysis of cross-classified data. #In: Proceedings of the Sixth Berkeley Symposium on Mathematical Statistics and Probability, #Berkeley, CA: University of California Press, pp. 649-696. crossings <- function(i, j, n) { npar <- n - 1 result <- list() for(c in 1:npar) { overi <- c >= i overj <- c >= j result[[c]] <- (overi & !overj) + (overj & !overi) } result <- matrix(unlist(result), length(i), npar) colnames(result) <- paste('C', 1:npar, sep='') result } Crossings <- function(...) { dots <- list(...) if (length(dots) != 2) stop("Crossings() is defined for only two factors") if (length(dots[[1]]) != length(dots[[2]])) stop("arguments to Crossings() must all have same length") dots <- lapply(dots, as.factor) n <- nlevels(dots[[1]]) if (nlevels(dots[[2]]) != n) stop("arguments to Crossings() must all have same number of levels") result <- crossings(as.numeric(dots[[1]]), as.numeric(dots[[2]]), n) rownames(result) <- do.call("paste", c(dots, sep = "")) result } vcdExtra/R/logLik.loglm.R0000644000176200001440000000127013164013351014705 0ustar liggesusers# logLik method for loglm objects, to allow use of AIC() and BIC() # with MASS::loglm, giving comparable results to the use of these # functions with glm(..., family=poisson) models. # allow for non-integer frequencies # allow for zero frequencies, with a zero= argument logLik.loglm <- function(object, ..., zero=1E-10) { fr <- if(!is.null(object$frequencies)) unclass(object$frequencies) else { unclass(update(object, keep.frequencies = TRUE)$frequencies) } df <- prod(dim(fr)) - object$df if (any(fr==0)) { fr <- as.vector(fr) fr[fr==0] <- zero } structure(sum((log(fr) - 1) * fr - lgamma(fr + 1)) - object$deviance/2, df = df, class = "logLik") } vcdExtra/R/mosaic.glmlist.R0000644000176200001440000001137613164013351015310 0ustar liggesusers#' Mosaic Displays for a glmlist Object #' @param x a glmlist object #' @param selection the index or name of one glm in \code{x} #' @param panel panel function #' @param type a character string indicating whether the \code{"observed"} or the \code{"expected"} values of the table should be visualized #' @param legend show a legend in the mosaic displays? #' @param main either a logical, or a vector of character strings used for plotting the main title. If main is a logical and TRUE, the name of the selected glm object is used #' @param ask should the function display a menu of models, when one is not specified in \code{selection}? #' @param graphics use a graphic menu when \code{ask=TRUE}? #' @param rows,cols when \code{ask=FALSE}, the number of rows and columns in which to plot the mosaics #' @param newpage start a new page? (only applies to \code{ask=FALSE}) #' @param ... other arguments passed to \code{\link{mosaic.glm}} #' @export mosaic.glmlist <- function(x, selection, panel=mosaic, type=c("observed", "expected"), legend=ask | !missing(selection), main=NULL, ask=TRUE, graphics=TRUE, rows, cols, newpage=TRUE, ...) { # calls <- sapply(x, mod.call) # get model calls as strings models <- names(x) if (!is.null(main)) { if (is.logical(main) && main) main <- models } else main <- rep(main, length(x)) type=match.arg(type) if (!missing(selection)){ if (is.character(selection)) selection <- gsub(" ", "", selection) return(panel(x[[selection]], type=type, main=main[selection], legend=legend, ...)) } # perhaps make these model labels more explicit for the menu if (ask & interactive()){ repeat { selection <- menu(models, graphics=graphics, title="Select Model to Plot") if (selection == 0) break else panel(x[[selection]], type=type, main=main[selection], legend=legend, ...) } } else { nmodels <- length(x) mfrow <- mfrow(nmodels) if (missing(rows) || missing(cols)){ rows <- mfrow[1] cols <- mfrow[2] } if (newpage) grid.newpage() lay <- grid.layout(nrow=rows, ncol = cols) pushViewport(viewport(layout = lay, y = 0, just = "bottom")) for (i in 1:rows) { for (j in 1:cols){ if ((sel <-(i-1)*cols + j) > nmodels) break pushViewport(viewport(layout.pos.row=i, layout.pos.col=j)) panel(x[[sel]], type=type, main=main[sel], newpage=FALSE, legend=legend, ...) popViewport() } } } } mosaic.loglmlist <- function(x, selection, panel=mosaic, type=c("observed", "expected"), legend=ask | !missing(selection), main=NULL, ask=TRUE, graphics=TRUE, rows, cols, newpage=TRUE, ...) { models <- names(x) strings <- as.vector(sapply(x, function(x) x$model.string)) if (!is.null(main)) { if (is.logical(main) && main) main <- ifelse(as.vector(sapply(strings, is.null)), models, strings) } else main <- rep(main, length(x)) type=match.arg(type) if (!missing(selection)){ if (is.character(selection)) selection <- gsub(" ", "", selection) return(panel(x[[selection]], type=type, main=main[selection], legend=legend, ...)) } # perhaps make these model labels more explicit for the menu if (ask & interactive()){ repeat { selection <- menu(models, graphics=graphics, title="Select Model to Plot") if (selection == 0) break else panel(x[[selection]], type=type, main=main[selection], legend=legend, ...) } } else { nmodels <- length(x) mfrow <- mfrow(nmodels) if (missing(rows) || missing(cols)){ rows <- mfrow[1] cols <- mfrow[2] } if (newpage) grid.newpage() lay <- grid.layout(nrow=rows, ncol = cols) pushViewport(viewport(layout = lay, y = 0, just = "bottom")) for (i in 1:rows) { for (j in 1:cols){ if ((sel <-(i-1)*cols + j) > nmodels) break pushViewport(viewport(layout.pos.row=i, layout.pos.col=j)) panel(x[[sel]], type=type, main=main[sel], newpage=FALSE, legend=legend, ...) popViewport() } } } } # from effects::utilities.R mfrow <- function(n, max.plots=0){ # number of rows and columns for array of n plots if (max.plots != 0 & n > max.plots) stop(paste("number of plots =",n," exceeds maximum =", max.plots)) rows <- round(sqrt(n)) cols <- ceiling(n/rows) c(rows, cols) } # from plot.lm: get model call as a string # TODO: should use abbreviate() mod.call <- function(x) { cal <- x$call if (!is.na(m.f <- match("formula", names(cal)))) { cal <- cal[c(1, m.f)] names(cal)[2L] <- "" } cc <- deparse(cal, 80) nc <- nchar(cc[1L], "c") abbr <- length(cc) > 1 || nc > 75 cap <- if (abbr) paste(substr(cc[1L], 1L, min(75L, nc)), "...") else cc[1L] cap } vcdExtra/R/Summarise.R0000644000176200001440000000732313164013351014325 0ustar liggesusers# fixed buglet when deviance() returns a null # fixed bug: residual df calculated incorrectly # but this now depends on objects having a df.residual component # TRUE for lm, glm, polr, negbin objects # made generic, adding a glmlist method Summarise <- function(object, ...) { UseMethod("Summarise") } Summarise.glmlist <- function(object, ..., saturated = NULL, sortby=NULL) { ns <- sapply(object, function(x) length(x$residuals)) if (any(ns != ns[1L])) stop("models were not all fitted to the same size of dataset") nmodels <- length(object) if (nmodels == 1) return(Summarise.default(object[[1L]], saturated=saturated)) rval <- lapply(object, Summarise.default, saturated=saturated) rval <- do.call(rbind, rval) if (!is.null(sortby)) { rval <- rval[order(rval[,sortby], decreasing=TRUE),] } rval } # could just do Summarise.loglmlist <- Summarise.glmlist Summarise.loglmlist <- function(object, ..., saturated = NULL, sortby=NULL) { ns <- sapply(object, function(x) length(x$residuals)) if (any(ns != ns[1L])) stop("models were not all fitted to the same size of dataset") nmodels <- length(object) if (nmodels == 1) return(Summarise.default(object[[1L]], saturated=saturated)) rval <- lapply(object, Summarise.default, saturated=saturated) rval <- do.call(rbind, rval) if (!is.null(sortby)) { rval <- rval[order(rval[,sortby], decreasing=TRUE),] } rval } Summarise.default <- function(object, ..., saturated = NULL, sortby=NULL) { ## interface methods for logLik() and nobs() ## - use S4 methods if loaded ## - use residuals() if nobs() is not available logLik0 <- if("stats4" %in% loadedNamespaces()) stats4::logLik else logLik nobs0 <- function(x, ...) { nobs1 <- if("stats4" %in% loadedNamespaces()) stats4::nobs else nobs nobs2 <- function(x, ...) NROW(residuals(x, ...)) rval <- try(nobs1(x, ...), silent = TRUE) if(inherits(rval, "try-error") | is.null(rval)) rval <- nobs2(x, ...) return(rval) } dof <- function(x) { if (inherits(x, "loglm")) { rval <- x$df } else { rval <- try(x$df.residual, silent=TRUE) } if (inherits(rval, "try-error") || is.null(rval)) stop(paste("Can't determine residual df for a", class(x), "object")) rval } ## collect all objects objects <- list(object, ...) nmodels <- length(objects) ## check sample sizes ns <- sapply(objects, nobs0) if(any(ns != ns[1L])) stop("models were not all fitted to the same size of dataset") ## extract log-likelihood and df (number of parameters) ll <- lapply(objects, logLik0) par <- as.numeric(sapply(ll, function(x) attr(x, "df"))) df <- as.numeric(sapply(objects, function(x) dof(x))) ll <- sapply(ll, as.numeric) ## compute saturated reference value (use 0 if deviance is not available) if(is.null(saturated)) { dev <- try(sapply(objects, deviance), silent = TRUE) if(inherits(dev, "try-error") || any(sapply(dev, is.null))) { saturated <- 0 } else { saturated <- ll + dev/2 } } ## setup ANOVA-style matrix rval <- matrix(rep(NA, 5 * nmodels), ncol = 5) colnames(rval) <- c("AIC", "BIC", "LR Chisq", "Df", "Pr(>Chisq)") rownames(rval) <- as.character(sapply(match.call(), deparse)[-1L])[1:nmodels] rval[,1] <- -2 * ll + 2 * par rval[,2] <- -2 * ll + log(ns) * par rval[,3] <- -2 * (ll - saturated) rval[,4] <- df rval[,5] <- pchisq(rval[,3], df, lower.tail = FALSE) if (!is.null(sortby)) { rval <- rval[order(rval[,sortby], decreasing=TRUE),] } ## return structure(as.data.frame(rval), heading = "Likelihood summary table:", class = c("anova", "data.frame")) } vcdExtra/R/summarise-old.R0000644000176200001440000000571213164013351015141 0ustar liggesusers # summarise a glm object or glmlist summarise <- function(...) { .Deprecated("LRstats") LRstats(...) } # summarise <- function(object, ...) { # UseMethod("summarise") # } # # stat.summarise <- function(deviance, df, onames, n) { # p <- pchisq(deviance, df, lower.tail=FALSE) # aic <- deviance - 2*df # if (missing(n)) { # result <- data.frame(aic, deviance, df, p) # names(result) <- c("AIC", "LR Chisq", "Df", "Pr(>Chisq)") # } # else { # bic <- deviance - log(n)*df # result <- data.frame(aic, bic, deviance, df, p) # names(result) <- c("AIC", "BIC", "LR Chisq", "Df", "Pr(>Chisq)") # } # # rownames(result) <- onames # attr(result, "heading") <- "Model Summary:" # class(result) <- c("anova", "data.frame") # result # } # # # summarise.glm <-function(object, ..., test=NULL){ # dotargs <- list(...) # is.glm <- unlist(lapply(dotargs, function(x) inherits(x, "glm"))) # dotargs <- dotargs[is.glm] # if (length(dotargs)) # return(summarise.glmlist(c(list(object), dotargs), test = test)) # # oname <- as.character(sys.call())[2] # result <- stat.summarise(object$deviance, object$df.residual, oname, sum(fitted(object))) # result # } # # summarise.glmlist <-function(object, ..., test=NULL, sortby=NULL){ # nmodels <- length(object) # if (nmodels == 1) # return(summarise.glm(object[[1]], test = test)) # if (is.null(names(object))) { # oname <- as.character(sys.call())[-1] # oname <- oname[1:length(object)] # } # else oname <- names(object) # # resdf <- as.numeric(lapply(object, function(x) x$df.residual)) # resdev <- as.numeric(lapply(object, function(x) x$deviance)) # n <- as.numeric(lapply(object, function(x) sum(fitted(x)))) # result <- stat.summarise(resdev, resdf, oname, n) # if (!is.null(sortby)) { # result <- result[order(result[,sortby], decreasing=TRUE),] # } # result # } # # # summarise.loglm <-function(object, ...){ # dotargs <- list(...) # is.loglm <- unlist(lapply(dotargs, function(x) inherits(x, "loglm"))) # dotargs <- dotargs[is.loglm] # if (length(dotargs)) # return(summarise.loglmlist(c(list(object), dotargs))) # # oname <- as.character(sys.call())[2] # result <- stat.summarise(object$deviance, object$df, oname, sum(fitted(object))) # result # } # # summarise.loglmlist <-function(object, ..., sortby=NULL){ # nmodels <- length(object) # if (nmodels == 1) # return(summarise.loglm(object[[1]])) # if (is.null(names(object))) { # oname <- as.character(sys.call())[-1] # oname <- oname[1:length(object)] # } # else oname <- names(object) # # resdf <- as.numeric(lapply(object, function(x) x$df)) # resdev <- as.numeric(lapply(object, function(x) x$deviance)) # n <- as.numeric(lapply(object, function(x) sum(fitted(x)))) # result <- stat.summarise(resdev, resdf, oname, n) # if (!is.null(sortby)) { # result <- result[order(result[,sortby], decreasing=TRUE),] # } # result # } # vcdExtra/R/zero.test.R0000644000176200001440000000261013164013351014307 0ustar liggesusers# Score test for zero inflation in Poisson data #https://stats.stackexchange.com/questions/118322/how-to-test-for-zero-inflation-in-a-dataset # References: # Broek, Jan van den. 1995. ?A Score Test for Zero Inflation in a Poisson Distribution.? Biometrics 51 (2): 738?43. doi:10.2307/2532959. # Yang, Zhao, James W. Hardin, and Cheryl L. Addy. 2010. ?Score Tests for Zero-Inflation in Overdispersed Count Data.? Communications in Statistics - Theory and Methods 39 (11): 2008?30. doi:10.1080/03610920902948228 # Van den Broek, J. (1995). A Score Test for Zero Inflation in a Poisson Distribution. Biometrics, 51(2), 738-743. doi:10.2307/2532959 zero.test <- function(x) { if(is.table(x)) { # expand to vector of values if(length(dim(x)) > 1) stop ("x must be a 1-way table") x <- rep(as.numeric(names(x)), unname(c(x))) } lambda <- mean(x) p0_tilde <- exp(-lambda) n0 <- sum(1*(!(x >0))) n <- length(x) numerator <- (n0 - n*p0_tilde)^2 denominator <- n*p0_tilde*(1-p0_tilde) - n*lambda*(p0_tilde^2) stat <- numerator/denominator pvalue <- pchisq(stat,df=1, ncp=0, lower.tail=FALSE) result <- list(statistic=stat, df=1, prob=pvalue) cat(paste("Score test for zero inflation\n\n", "\tChi-square =", round(stat,5), "\n", "\tdf = 1\n", "\tpvalue:", format.pval(pvalue), "\n")) invisible(result) } vcdExtra/R/cutfac.R0000644000176200001440000000056413164013351013625 0ustar liggesusers# Cut a variable to a factor cutfac <- function(x, breaks = NULL, q=10) { if(is.null(breaks)) breaks <- unique(quantile(x, 0:q/q)) x <- cut(x, breaks, include.lowest = TRUE, right = FALSE) levels(x) <- paste(breaks[-length(breaks)], ifelse(diff(breaks) > 1, c(paste("-", breaks[-c(1, length(breaks))] - 1, sep = ""), "+"), ""), sep = "") return(x) } vcdExtra/R/expand.dft.R0000644000176200001440000000216213427613416014421 0ustar liggesusers# Author: Marc Schwarz # Ref: http://tolstoy.newcastle.edu.au/R/e6/help/09/01/1873.html expand.dft <- function(x, var.names = NULL, freq = "Freq", ...) { # allow: a table object, or a data frame in frequency form if(inherits(x, "table")) x <- as.data.frame.table(x, responseName = freq) freq.col <- which(colnames(x) == freq) if (length(freq.col) == 0) stop(paste(sQuote("freq"), "not found in column names")) DF <- sapply(1:nrow(x), function(i) x[rep(i, each = x[i, freq.col, drop = TRUE]), ], simplify = FALSE) DF <- do.call("rbind", DF)[, -freq.col, drop=FALSE] for (i in 1:ncol(DF)) { DF[[i]] <- type.convert(as.character(DF[[i]]), ...) } rownames(DF) <- NULL if (!is.null(var.names)) { if (length(var.names) < dim(DF)[2]) { stop(paste("Too few", sQuote("var.names"), "given.")) } else if (length(var.names) > dim(DF)[2]) { stop(paste("Too many", sQuote("var.names"), "given.")) } else { names(DF) <- var.names } } DF } # make this a synonym expand.table <- expand.dft vcdExtra/R/HLtest.R0000644000176200001440000000401213164013351013553 0ustar liggesusers# Functions for Hosmer Lemeshow test # original function downloaded from # http://sas-and-r.blogspot.com/2010/09/example-87-hosmer-and-lemeshow-goodness.html # # see also: MKmisc::gof.test for more general versions HLtest <- HosmerLemeshow <- function(model, g=10) { if (!inherits(model, "glm")) stop("requires a binomial family glm") if (!family(model)$family == 'binomial') stop("requires a binomial family glm") y <- model$y yhat <- model$fitted.values cutyhat = cut(yhat, breaks = quantile(yhat, probs=seq(0, 1, 1/g)), include.lowest=TRUE) obs = xtabs(cbind(1 - y, y) ~ cutyhat) exp = xtabs(cbind(1 - yhat, yhat) ~ cutyhat) chi = (obs - exp)/sqrt(exp) # browser() table <- data.frame(cut=dimnames(obs)$cutyhat, total= as.numeric(apply(obs, 1, sum)), obs=as.numeric(as.character(obs[,1])), exp=as.numeric(as.character(exp[,1])), chi=as.numeric(as.character(chi[,1])) ) rownames(table) <- 1:g chisq = sum(chi^2) p = 1 - pchisq(chisq, g - 2) result <- list(table=table, chisq=chisq, df=g-2, p.value=p, groups=g, call=model$call) class(result) <- "HLtest" return(result) } print.HLtest <- function(x, ...) { heading <- "Hosmer and Lemeshow Goodness-of-Fit Test" df <- data.frame("ChiSquare"=x$chisq, df=x$df, "P_value"= x$p.value) cat(heading,"\n\n") cat("Call:\n") print(x$call) print(df, row.names=FALSE) invisible(x) } # Q: how to print **s next to larg chisq components? summary.HLtest <- function(object, ...) { heading <- "Partition for Hosmer and Lemeshow Goodness-of-Fit Test" cat(heading,"\n\n") print(object$table) print(object) } ## Q: how to display any large chi residuals on the bars?? rootogram.HLtest <- function(x, ...) { rootogram(as.numeric(x$table$obs), as.numeric(x$table$exp), xlab="Fitted value group", names=1:x$groups, ...) } plot.HLtest <- function(x, ...) { rootogram.HLtest(x, ...) } vcdExtra/R/loglin-utilities.R0000644000176200001440000001375013164013351015656 0ustar liggesusers#' Loglinear Model Utilities #' These functions generate lists of terms to specify a loglinear model #' in a form compatible with loglin and provide for conversion to an #' equivalent loglm specification. They allow for a more conceptual #' way to specify such models. #' models of joint independence, of some factors wrt one or more other factors #' @param nf number of factors for which to generate model #' @param table a contingency table used for factor names, typically the output from \code{\link[base]{table}} #' @param factors names of factors used in the model when \code{table} is not specified #' @param with indices of the factors against which others are considered jointly independent #' @export joint <- function(nf, table=NULL, factors=1:nf, with=nf) { if (!is.null(table)) factors <- names(dimnames(table)) if (nf == 1) return (list(term1=factors[1])) if (nf == 2) return (list(term1=factors[1], term2=factors[2])) others <- setdiff(1:nf, with) result <- list(term1=factors[others], term2=factors[with]) result } #' models of conditional independence of some factors wrt one or more other factors #' @param nf number of factors for which to generate model #' @param table a contingency table used for factor names, typically the output from \code{\link[base]{table}} #' @param factors names of factors used in the model when \code{table} is not specified #' @param with indices of the factors against which others are considered conditionally independent #' @export conditional <- function(nf, table=NULL, factors=1:nf, with=nf) { if (!is.null(table)) factors <- names(dimnames(table)) if (nf == 1) return (list(term1=factors[1])) if (nf == 2) return (list(term1=factors[1], term2=factors[2])) main <- setdiff(1:nf, with) others <- matrix(factors[with], length(with), length(main)) result <- rbind(factors[main], others) result <- as.list(as.data.frame(result, stringsAsFactors=FALSE)) names(result) <- paste('term', 1:length(result), sep='') result } #' models of mutual independence of all factors #' @param nf number of factors for which to generate model #' @param table a contingency table used for factor names, typically the output from \code{\link[base]{table}} #' @param factors names of factors used in the model when \code{table} is not specified #' @export mutual <- function(nf, table=NULL, factors=1:nf) { if (!is.null(table)) factors <- names(dimnames(table)) result <- sapply(factors[1:nf], list) names(result) <- paste('term', 1:length(result), sep='') result } #' saturated model: highest-order interaction #' @param nf number of factors for which to generate model #' @param table a contingency table used for factor names, typically the output from \code{\link[base]{table}} #' @param factors names of factors used in the model when \code{table} is not specified #' @export saturated <- function(nf, table=NULL, factors=1:nf) { if (!is.null(table)) factors <- names(dimnames(table)) list(term1=factors[1:nf]) } # models of conditional independence, given one pair of variables ## Not needed: handled by condit, with length(with)>1 #condit2 <- function(nf, factors=1:nf, with=1:2) { # if (nf == 1) return (list(term1=factors[1])) # if (nf == 2) return (list(term1=factors[1], term2=factors[2])) # others <- setdiff(1:nf, with) # result <- rbind(factors[with], cbind(factors[others], factors[others])) # result <- as.list(as.data.frame(result, stringsAsFactors=FALSE)) # names(result) <- paste('term', 1:length(result), sep='') # result #} #' markov models of a given order #' @param nf number of factors for which to generate model #' @param table a contingency table used for factor names, typically the output from \code{\link[base]{table}} #' @param factors names of factors used in the model when \code{table} is not specified #' @param order order of the markov chain #' @export markov <- function(nf, factors=1:nf, order=1) { if (nf == 1) return (list(term1=factors[1])) if (nf == 2) return (list(term1=factors[1], term2=factors[2])) if (length(factors) < order+2) { warning(paste('Not enough factors for order', order, 'Markov chain; using order=1')) order <-1 result <- rbind(factors[1:(nf-1)], factors[2:nf]) } else { if (nf <= order+1) result <- factors[1:nf] else { result <- NULL for (i in 1:(order+1)) result <- rbind(result, factors[i:(nf-order+i-1)]) } } result <- as.list(as.data.frame(result, stringsAsFactors=FALSE)) names(result) <- paste('term', 1:length(result), sep='') result } #' convert a loglin model to a model formula for loglm #' @param x a list of terms in a loglinear model, such as returned by \code{joint}, \code{conditional}, \dots #' @param env environment in which to evaluate the formula #' @source Code from Henrique Dallazuanna, , R-help 7-4-2013 loglin2formula <- function(x, env = parent.frame()) { terms <- lapply(x, paste, collapse = ":") formula(sprintf(" ~ %s", do.call(paste, c(terms, sep = "+"))), env=env) } #' convert a loglin model to a string, using bracket notation for the high-order terms #' @param x a list of terms in a loglinear model, such as returned by \code{joint}, \code{conditional}, \dots #' @param brackets characters to use to surround model terms. Either a single character string containing two characters #' or a character vector of length two. #' @param sep characters used to separate factor names within a term #' @param collapse characters used to separate terms #' @param abbrev loglin2string <- function(x, brackets = c('[', ']'), sep=',', collapse=' ', abbrev) { if (length(brackets)==1 && (nchar(brackets)>1)) brackets <- unlist(strsplit(brackets, "")) terms <- lapply(x, paste, collapse=sep) terms <- paste(brackets[1], terms, brackets[2], sep='') paste(terms, collapse= ' ') } vcdExtra/R/update.xtabs.R0000644000176200001440000000126413164013351014760 0ustar liggesusersupdate.xtabs <- function (object, formula., ..., evaluate = TRUE) { if (is.null(call<-attr(object, "call"))) stop("need an object with call component") extras <- match.call(expand.dots = FALSE)$... if (!missing(formula.)) call$formula <- update.formula(call$formula, formula.) if (length(extras)) { existing <- !is.na(match(names(extras), names(call))) for (a in names(extras)[existing]) call[[a]] <- extras[[a]] if (any(!existing)) { call <- c(as.list(call), extras[!existing]) call <- as.call(call) } } if (evaluate) eval(call, parent.frame()) else call } vcdExtra/R/logseries.R0000644000176200001440000001147213164013351014354 0ustar liggesusers## Original from gmlss.dist ## I think this is working correctly 01/03/10 #LG <- function (mu.link = "logit") #{ # mstats <- checklink("mu.link", "LG", substitute(mu.link),c("logit", "probit", "cloglog", "cauchit", "log", "own")) # structure( # list(family = c("LG", "Logarithmic"), # parameters = list(mu = TRUE), # the mean # nopar = 1, # type = "Discrete", # mu.link = as.character(substitute(mu.link)), # mu.linkfun = mstats$linkfun, # mu.linkinv = mstats$linkinv, # mu.dr = mstats$mu.eta, # dldm = function(y,mu) (y/mu)+1/((1-mu)*log(1-mu)), # d2ldm2 = function(y,mu) # { # dldm <- (y/mu)+1/((1-mu)*log(1-mu)) # d2ldm2 <- -dldm^2 # d2ldm2 # }, # G.dev.incr = function(y,mu,...) -2*dLG(x = y, mu = mu, log = TRUE), # rqres = expression(rqres(pfun="pLG", type="Discrete", ymin=1, y=y, mu=mu)), # mu.initial =expression({mu <- 0.9 } ), # mu.valid = function(mu) all(mu > 0 & mu < 1), # y.valid = function(y) all(y > 0) # ), # class = c("gamlss.family","family")) #} #----------------------------------------------------------------------------------------- dlogseries<-function(x, prob = 0.5, log = FALSE) { if (any(prob <= 0) | any(prob >= 1) ) stop(paste("prob must be greater than 0 and less than 1", "\n", "")) if (any(x <= 0) ) stop(paste("x must be >0", "\n", "")) logfy <- x*log(prob)-log(x)-log(-log(1-prob)) if(log == FALSE) fy <- exp(logfy) else fy <- logfy fy } #---------------------------------------------------------------------------------------- plogseries <- function(q, prob = 0.5, lower.tail = TRUE, log.p = FALSE) { if (any(prob <= 0) | any(prob >= 1) ) stop(paste("prob must be greater than 0 and less than 1", "\n", "")) if (any(q <= 0) ) stop(paste("q must be >0", "\n", "")) ly <- length(q) FFF <- rep(0,ly) nmu <- rep(prob, length = ly) j <- seq(along=q) for (i in j) { y.y <- q[i] mm <- nmu[i] allval <- seq(1,y.y) pdfall <- dlogseries(allval, prob = mm, log = FALSE) FFF[i] <- sum(pdfall) } cdf <- FFF cdf <- if(lower.tail==TRUE) cdf else 1-cdf cdf <- if(log.p==FALSE) cdf else log(cdf) cdf } #---------------------------------------------------------------------------------------- qlogseries <- function(p, prob=0.5, lower.tail = TRUE, log.p = FALSE, max.value = 10000) { if (any(prob <= 0) | any(prob >= 1) ) stop(paste("prob must be greater than 0 and less than 1", "\n", "")) if (any(p < 0) | any(p > 1.0001)) stop(paste("p must be between 0 and 1", "\n", "")) if (log.p==TRUE) p <- exp(p) else p <- p if (lower.tail==TRUE) p <- p else p <- 1-p ly <- length(p) QQQ <- rep(0,ly) nmu <- rep(prob, length = ly) for (i in seq(along=p)) { cumpro <- 0 if (p[i]+0.000000001 >= 1) QQQ[i] <- Inf else { for (j in seq(from = 1, to = max.value)) { cumpro <- plogseries(j, prob = nmu[i], log.p = FALSE) QQQ[i] <- j if (p[i] <= cumpro ) break } } } QQQ } #---------------------------------------------------------------------------------------- rlogseries <- function(n, prob = 0.5) { if (any(prob <= 0) | any(prob >= 1) ) stop(paste("prob must be greater than 0 and less than 1", "\n", "")) if (any(n <= 0)) stop(paste("n must be a positive integer", "\n", "")) n <- ceiling(n) p <- runif(n) r <- qlogseries(p, prob=prob) r } #---------------------------------------------------------------------------------------- vcdExtra/R/print.Kappa.R0000644000176200001440000000103213164013351014536 0ustar liggesusers# Print method for Kappa: Add a column showing z values ## DONE: now set digits ## DONE: now include CI print.Kappa <- function (x, digits=max(getOption("digits") - 3, 3), CI=FALSE, level=0.95, ...) { tab <- rbind(x$Unweighted, x$Weighted) z <- tab[,1] / tab[,2] tab <- cbind(tab, z) if (CI) { q <- qnorm((1 + level)/2) lower <- tab[,1] - q * tab[,2] upper <- tab[,1] + q * tab[,2] tab <- cbind(tab, lower, upper) } rownames(tab) <- names(x)[1:2] print(tab, digits=digits, ...) invisible(x) } vcdExtra/R/Kway.R0000644000176200001440000000171113164013351013266 0ustar liggesusers# Generate and fit all 1-way, 2-way, ... k-way terms in a glm Kway <- function(formula, family=poisson, data, ..., order=nt, prefix="kway") { if (is.character(family)) family <- get(family, mode = "function", envir = parent.frame()) if (is.function(family)) family <- family() if (is.null(family$family)) { print(family) stop("'family' not recognized") } if (missing(data)) data <- environment(formula) models <- list() mod <- glm(formula, family=family, data, ...) mod$call$formula <- formula terms <- terms(formula) tl <- attr(terms, "term.labels") nt <- length(tl) models[[1]] <- mod for(i in 2:order) { models[[i]] <- update(mod, substitute(.~.^p, list(p = i))) } # null model mod0 <- update(mod, .~1) models <- c(list(mod0), models) names(models) <- paste(prefix, 0:order, sep = ".") class(models) <- "glmlist" models } vcdExtra/R/modFit.R0000644000176200001440000000164713164013351013605 0ustar liggesusers## ## One-line summary of model fit for a glm/loglm object ## `modFit` <- function(x, ...) UseMethod("modFit") modFit.glm <- function(x, stats="chisq", digits=2, ...) { if (!inherits(x,"glm")) stop("modFit requires a glm object") result <- NULL if ("chisq" %in% stats) result <- paste("G^2(",x$df.residual,")=", formatC(x$deviance,digits=digits,format="f"),sep="") if ("aic" %in% stats) result <- paste(result, " AIC=", formatC(x$aic,digits=digits,format="f"),sep="") result } modFit.loglm <- function(x, stats="chisq", digits=2, ...) { if (!inherits(x,"loglm")) stop("modFit requires a loglm object") result <- NULL if ("chisq" %in% stats) result <- paste("G^2(",x$df,")=", formatC(x$deviance,digits=digits,format="f"),sep="") if ("aic" %in% stats) { aic<-x$deviance-x$df*2 result <- paste(result, " AIC=", formatC(aic,digits=digits,format="f"),sep="") } result } vcdExtra/R/glmlist.R0000644000176200001440000000462513164013351014035 0ustar liggesusers# glmlist - make a glmlist object containing a list of fitted glm objects with their names # borrowing code from Hmisc::llist glmlist <- function(...) { args <- list(...); lname <- names(args) name <- vname <- as.character(sys.call())[-1] for (i in 1:length(args)) { vname[i] <- if (length(lname) && lname[i] != "") lname[i] else name[i] } names(args) <- vname[1:length(args)] is.glm <- unlist(lapply(args, function(x) inherits(x, "glm"))) if (!all(is.glm)) { warning("Objects ", paste(vname[!is.glm], collapse=', '), " removed because they are not glm objects") args <- args[is.glm] } class(args) <- "glmlist" return(args); } # loglmlist - do the same for loglm objects loglmlist <- function(...) { args <- list(...); lname <- names(args) name <- vname <- as.character(sys.call())[-1] for (i in 1:length(args)) { vname[i] <- if (length(lname) && lname[i] != "") lname[i] else name[i] } names(args) <- vname[1:length(args)] is.loglm <- unlist(lapply(args, function(x) inherits(x, "loglm"))) if (!all(is.loglm)) { warning("Objects ", paste(vname[!is.loglm], collapse=', '), " removed because they are not loglm objects") args <- args[is.loglm] } class(args) <- "loglmlist" return(args); } # generic version: named list nlist <- function(...) { args <- list(...); lname <- names(args) name <- vname <- as.character(sys.call())[-1] for (i in 1:length(args)) { vname[i] <- if (length(lname) && lname[i] != "") lname[i] else name[i] } names(args) <- vname[1:length(args)] return(args); } # coeficient method for a glmlist (from John Fox, r-help, 10-28-2014) coef.glmlist <- function(object, result=c("list", "matrix", "data.frame"), ...){ result <- match.arg(result) coefs <- lapply(object, coef) if (result == "list") return(coefs) coef.names <- unique(unlist(lapply(coefs, names))) n.mods <- length(object) coef.matrix <- matrix(NA, length(coef.names), n.mods) rownames(coef.matrix) <- coef.names colnames(coef.matrix) <- names(object) for (i in 1:n.mods){ coef <- coef(object[[i]]) coef.matrix[names(coef), i] <- coef } if (result == "matrix") return(coef.matrix) as.data.frame(coef.matrix) } vcdExtra/R/mcaplot.R0000644000176200001440000001016313164013351014013 0ustar liggesusers#' --- #' title: "Custom plot function for mjca" #' date: "28 Jan 2016" #' --- #' #' #' @param obj An \code{"mjca"} object #' @param map Character string specifying the map type. Allowed options include #' \code{"symmetric"} (default), #' \code{"rowprincipal"}, \code{"colprincipal"}, \code{"symbiplot"}, #' \code{"rowgab"}, \code{"colgab"}, \code{"rowgreen"}, \code{"colgreen"} #' @param dim Dimensions to plot, a vector of length 2. #' @param col Vector of colors, one for each factor in the MCA #' @param pch Vector of point symbols for the category levels, one for each factor #' @param cex Character size for points and level labels #' @param pos Position of level labels relative to the category points; either a single number #' or a vector of length equal to the number of category points. #' @param lines A logical or an integer vector indicating which factors are to be #' joined with lines using \code{\link{multilines}} #' @param lwd Line width(s) for the lines #' @param legend Logical; draw a legend for the factor names? #' @param legend.pos Position of the legend in the plot #' @param xlab,ylab Labels for horizontal and vertical axes. The default, \code{"_auto_" } #' means that the function auto-generates a label of the form \code{Dimension X (xx.x %)} #' @param rev.axes A logical vector of length 2, where TRUE reverses the direction of the #' corresponding axis. #' @param ... Arguments passed down to \code{plot} #' @return Returns the coordinates of the category points invisibly #' #' @author Michael Friendly #' @seealso \code{\link{plot.mjca}} #' @examples #' data(Titanic) #' titanic.mca <- mjca(Titanic) #' mcaplot(titanic.mca, legend=TRUE, legend.pos="topleft") #' #' data(HairEyeColor) #' haireye.mca <- mjca(HairEyeColor) #' mcaplot(haireye.mca, legend=TRUE, cex.lab=1.3) mcaplot <- function(obj, map="symmetric", dim=1:2, col=c("blue", "red", "brown", "black", "green3", "purple"), pch=15:20, cex=1.2, pos=3, lines=TRUE, lwd=2, legend=FALSE, legend.pos="topright", xlab = "_auto_", ylab = "_auto_", rev.axes = c(FALSE, FALSE), ...) { if(!requireNamespace("ca", quietly=TRUE)) stop("The ca package is required") if(!inherits(obj, "mjca")) stop("Only defined for mjca objects") coords <- cacoord(obj, type=map, rows=FALSE) coords <- data.frame(coords, obj$factors) # extract factor names & levels nlev <- obj$levels.n nfac <- length(nlev) pch <- rep_len(pch, nfac) col <- rep_len(col, nfac) lwd <- rep_len(lwd, nfac) rev.axes <- rep(rev.axes, length.out=2) if(any(dim > ncol(coords))) stop("dim must be valid dimensions of the coordinates") labs <- pctlab(obj) if (xlab == "_auto_") xlab <- labs[dim[1]] if (ylab == "_auto_") ylab <- labs[dim[2]] if(isTRUE(rev.axes[1])) coords[, dim[1]] <- -coords[, dim[1]] if(isTRUE(rev.axes[2])) coords[, dim[2]] <- -coords[, dim[2]] plot(coords[, dim], type='n', asp=1, xlab=xlab, ylab=ylab, ...) points(coords[,dim], pch=rep(pch, nlev), col=rep(col, nlev), cex=cex) text(coords[,dim], labels=coords$level, col=rep(col, nlev), pos=pos, cex=cex, xpd=TRUE) if (is.logical(lines)) lines <- if(lines) 1:nfac else NULL if(length(lines)) multilines(coords[, dim], group=coords$factor, which=lines, col=col, lwd=lwd) abline(h = 0, v = 0, lty = "longdash", col="gray") if (legend) { factors <- coords$factor factors <- factors[!duplicated(factors)] legend(legend.pos, legend=factors, title="Factor", title.col="black", col=col, text.col=col, pch=pch, bg=rgb(.95, .95, .95, .3), cex=cex) } invisible(coords) } pctlab <- function(obj, prefix="Dimension ", decimals=1) { values <- obj$sv^2 if (obj$lambda == "JCA"){ pct <- rep_len(NA, length(values)) } else { if (obj$lambda == "adjusted") { values <- obj$inertia.e pct <- round(100 * values, decimals) } else { pct <- round(100 * values / sum(values), decimals) } } pctval <- ifelse(is.na(pct), NULL, paste0(" (", pct, "%)")) paste0(prefix, 1:length(values), pctval) } vcdExtra/R/LRstats.R0000644000176200001440000000727513164013351013762 0ustar liggesusers# fixed buglet when deviance() returns a null # fixed bug: residual df calculated incorrectly # but this now depends on objects having a df.residual component # TRUE for lm, glm, polr, negbin objects # made generic, adding a glmlist method LRstats <- function(object, ...) { UseMethod("LRstats") } LRstats.glmlist <- function(object, ..., saturated = NULL, sortby=NULL) { ns <- sapply(object, function(x) length(x$residuals)) if (any(ns != ns[1L])) stop("models were not all fitted to the same size of dataset") nmodels <- length(object) if (nmodels == 1) return(LRstats.default(object[[1L]], saturated=saturated)) rval <- lapply(object, LRstats.default, saturated=saturated) rval <- do.call(rbind, rval) if (!is.null(sortby)) { rval <- rval[order(rval[,sortby], decreasing=TRUE),] } rval } # could just do LRstats.loglmlist <- LRstats.glmlist LRstats.loglmlist <- function(object, ..., saturated = NULL, sortby=NULL) { ns <- sapply(object, function(x) length(x$residuals)) if (any(ns != ns[1L])) stop("models were not all fitted to the same size of dataset") nmodels <- length(object) if (nmodels == 1) return(LRstats.default(object[[1L]], saturated=saturated)) rval <- lapply(object, LRstats.default, saturated=saturated) rval <- do.call(rbind, rval) if (!is.null(sortby)) { rval <- rval[order(rval[,sortby], decreasing=TRUE),] } rval } LRstats.default <- function(object, ..., saturated = NULL, sortby=NULL) { ## interface methods for logLik() and nobs() ## - use S4 methods if loaded ## - use residuals() if nobs() is not available logLik0 <- if("stats4" %in% loadedNamespaces()) stats4::logLik else logLik nobs0 <- function(x, ...) { nobs1 <- if("stats4" %in% loadedNamespaces()) stats4::nobs else nobs nobs2 <- function(x, ...) NROW(residuals(x, ...)) rval <- try(nobs1(x, ...), silent = TRUE) if(inherits(rval, "try-error") | is.null(rval)) rval <- nobs2(x, ...) return(rval) } dof <- function(x) { if (inherits(x, "loglm")) { rval <- x$df } else { rval <- try(x$df.residual, silent=TRUE) } if (inherits(rval, "try-error") || is.null(rval)) stop(paste("Can't determine residual df for a", class(x), "object")) rval } ## collect all objects objects <- list(object, ...) nmodels <- length(objects) ## check sample sizes ns <- sapply(objects, nobs0) if(any(ns != ns[1L])) stop("models were not all fitted to the same size of dataset") ## extract log-likelihood and df (number of parameters) ll <- lapply(objects, logLik0) par <- as.numeric(sapply(ll, function(x) attr(x, "df"))) df <- as.numeric(sapply(objects, function(x) dof(x))) ll <- sapply(ll, as.numeric) ## compute saturated reference value (use 0 if deviance is not available) if(is.null(saturated)) { dev <- try(sapply(objects, deviance), silent = TRUE) if(inherits(dev, "try-error") || any(sapply(dev, is.null))) { saturated <- 0 } else { saturated <- ll + dev/2 } } ## setup ANOVA-style matrix rval <- matrix(rep(NA, 5 * nmodels), ncol = 5) colnames(rval) <- c("AIC", "BIC", "LR Chisq", "Df", "Pr(>Chisq)") rownames(rval) <- as.character(sapply(match.call(), deparse)[-1L])[1:nmodels] rval[,1] <- -2 * ll + 2 * par rval[,2] <- -2 * ll + log(ns) * par rval[,3] <- -2 * (ll - saturated) rval[,4] <- df rval[,5] <- pchisq(rval[,3], df, lower.tail = FALSE) if (!is.null(sortby)) { rval <- rval[order(rval[,sortby], decreasing=TRUE),] } ## return structure(as.data.frame(rval), heading = "Likelihood summary table:", class = c("anova", "data.frame")) } vcdExtra/R/mosaic3d.R0000644000176200001440000001634213164013351014063 0ustar liggesusers##################################### ## Produce a 3D mosaic plot using rgl ##################################### # TODO: provide formula interface # TODO: handle zero margins (causes display to be erased in shapelist3d) # DONE: handle zero cells # DONE: generalize the calculation of residuals # DONE: allow display of type=c("observed", "expected") # DONE: if ndim>3, provide for labels at max or min # DONE: make object oriented and provide a loglm method # mosaic3d: provide observed array of counts and either residuals, expected frequencies, # or a loglin set of margins to fit mosaic3d <- function(x, ...) { UseMethod("mosaic3d") } mosaic3d.loglm <- function (x, type = c("observed", "expected"), residuals_type = c("pearson", "deviance"), # gp = shading_hcl, gp_args = list(), ...) { residuals_type <- match.arg(tolower(residuals_type), c("pearson", "deviance")) if (is.null(x$fitted)) x <- update(x, fitted = TRUE) expected <- fitted(x) residuals <- residuals(x, type = "pearson") observed <- residuals * sqrt(expected) + expected if (residuals_type == "deviance") residuals <- residuals(x, type = "deviance") # gp <- if (inherits(gp, "grapcon_generator")) # do.call("gp", c(list(observed, residuals, expected, x$df), # as.list(gp_args))) # else gp mosaic3d.default(observed, residuals = residuals, expected = expected, type = type, residuals_type = residuals_type, # gp = gp, ...) } mosaic3d.default <- function(x, expected=NULL, residuals=NULL, type = c("observed", "expected"), residuals_type = NULL, shape=rgl::cube3d(alpha=alpha), alpha=0.5, spacing=0.1, split_dir=1:3, shading=shading_basic, interpolate=c(2,4), zero_size=.05, label_edge, labeling_args=list(), newpage=TRUE, box=FALSE, ...) { if (!requireNamespace("rgl")) stop("rgl is required") type <- match.arg(type) if (is.null(residuals)) { residuals_type <- if (is.null(residuals_type)) "pearson" else match.arg(tolower(residuals_type), c("pearson", "deviance", "ft")) } ## convert structable object if (is.structable(x)) { x <- as.table(x) } ## table characteristics levels <- dim(x) ndim <- length(levels) dn <- dimnames(x) if (is.null(dn)) dn <- dimnames(x) <- lapply(levels, seq) vnames <- names(dimnames(x)) if (is.null(vnames)) vnames <- names(dn) <- names(dimnames(x)) <- LETTERS[1:ndim] ## replace NAs by 0 if (any(nas <- is.na(x))) x[nas] <- 0 ## model fitting: ## calculate expected if needed if ((is.null(expected) && is.null(residuals)) || !is.numeric(expected)) { if (inherits(expected, "formula")) { fm <- loglm(expected, x, fitted = TRUE) expected <- fitted(fm) df <- fm$df } else { if (is.null(expected)) expected <- as.list(1:ndim) fm <- loglin(x, expected, fit = TRUE, print = FALSE) expected <- fm$fit df <- fm$df } } ## compute residuals if (is.null(residuals)) residuals <- switch(residuals_type, pearson = (x - expected) / sqrt(ifelse(expected > 0, expected, 1)), deviance = { tmp <- 2 * (x * log(ifelse(x == 0, 1, x / ifelse(expected > 0, expected, 1))) - (x - expected)) tmp <- sqrt(pmax(tmp, 0)) ifelse(x > expected, tmp, -tmp) }, ft = sqrt(x) + sqrt(x + 1) - sqrt(4 * expected + 1) ) ## replace NAs by 0 if (any(nas <- is.na(residuals))) residuals[nas] <- 0 # switch observed and expected if required observed <- if (type == "observed") x else expected expected <- if (type == "observed") expected else x # replicate arguments to number of dimensions spacing <- rep(spacing, length=ndim) split_dir <- rep(split_dir, length=ndim) if(missing(label_edge)) label_edge <- rep( c('-', '+'), each=3, length=ndim) zeros <- observed <= .Machine$double.eps shapelist <- shape # sanity check if (!inherits(shapelist, "shape3d")) stop("shape must be a shape3d object") if (newpage) rgl::open3d() for (k in 1:ndim) { marg <- margin.table(observed, k:1) if (k==1) { shapelist <- split3d(shapelist, marg, split_dir[k], space=spacing[k]) label3d(shapelist, split_dir[k], dn[[k]], vnames[k], edge=label_edge[k], ...) } else { marg <- matrix(marg, nrow=levels[k]) shapelist <- split3d(shapelist, marg, split_dir[k], space=spacing[k]) names(shapelist) <- apply(as.matrix(expand.grid(dn[1:k])), 1, paste, collapse=":") L <- length(shapelist) label_cells <- if (label_edge[k]=='-') 1:levels[k] else (L-levels[k]+1):L label3d(shapelist[label_cells], split_dir[k], dn[[k]], vnames[k], edge=label_edge[k], ...) } } # assign colors # TODO: allow alpha to control transparency of side walls col <- shading(residuals, interpolate=interpolate) # display, but exclude the zero cells rgl::shapelist3d(shapelist[!as.vector(zeros)], col=col[!as.vector(zeros)], ...) # plot markers for zero cells if (any(zeros)) { ctrs <- t(sapply(shapelist, center3d)) rgl::spheres3d(ctrs[as.vector(zeros),], radius=zero_size) } # invisible(structable(observed)) invisible(shapelist) } # basic shading_Friendly, adapting the simple code used in mosaicplot() shading_basic <- function(residuals, interpolate=TRUE) { if (is.logical(interpolate)) interpolate <- c(2, 4) else if (any(interpolate <= 0) || length(interpolate) > 5) stop("invalid 'interpolate' specification") shade <- sort(interpolate) breaks <- c(-Inf, -rev(shade), 0, shade, Inf) colors <- c(hsv(0, s = seq.int(1, to = 0, length.out = length(shade) + 1)), hsv(4/6, s = seq.int(0, to = 1, length.out = length(shade) + 1))) colors[as.numeric(cut(residuals, breaks))] } # provide labels for 3D objects below/above their extent along a given dimension # FIXME: kludge for interline gap between level labels and variable name # TODO: how to pass & extract labeling_args, e.g., labeling_args=list(at='min', fontsize=10) label3d <- function(objlist, dim, text, varname, offset=.05, adj, edge="-", gap=.1, labeling_args, ...) { if(missing(adj)) { if (dim < 3) adj <- ifelse(edge == '-', c(0.5, 1), c(0.5, 0)) else adj <- ifelse(edge == '-', c(1, 0.5), c(0, 0.5)) } ranges <- lapply(objlist, range3d) loc <- t(sapply(ranges, colMeans)) # positions of labels on dimension dim min <- t(sapply(ranges, function(x) x[1,])) # other dimensions at min values max <- t(sapply(ranges, function(x) x[2,])) # other dimensions at max values xyz <- if (edge == '-') (min - offset) else (max + offset) xyz[,dim] <- loc[,dim] if(!missing(varname)) { loclab <- colMeans(loc) # NB: doesn't take space into acct xyzlab <- if (edge == '-') min[1,] - offset - gap else max[1,] + offset + gap xyzlab[dim] <- loclab[dim] xyz <- rbind(xyz, xyzlab) text <- c(text, varname) } result <- c(labels = rgl::texts3d(xyz, texts=text, adj=adj, ...)) invisible(result) } vcdExtra/R/vcdExtra-deprecated.R0000644000176200001440000000014713164013351016233 0ustar liggesusers#summarise <- function (...) { # .Deprecated("summarise", package="vcdExtra") # LRstats(...) #} # vcdExtra/R/seq_loglm.R0000644000176200001440000000571313164013351014343 0ustar liggesusers#' Sequential loglinear models for an n-way table #' This function takes an n-way contingency table and fits a series of sequential #' models to the 1-, 2-, ... n-way marginal tables, corresponding to a variety of #' types of loglinear models. #' @param x a contingency table in array form, with optional category labels specified in the dimnames(x) attribute, #' or else a data.frame in frequency form, with the frequency variable names "Freq". #' @param type type of sequential model to fit #' @param marginals which marginals to fit? #' @param vorder order of variables #' @param k indices of conditioning variable(s) for "joint", "conditional" or order for "markov" #' @param prefix #' @param fitted keep fitted values? seq_loglm <- function( x, type = c("joint", "conditional", "mutual", "markov", "saturated"), marginals = 1:nf, # which marginals to fit? vorder = 1:nf, # order of variables in the sequential models k = NULL, # conditioning variable(s) for "joint", "conditional" or order for "markov" prefix = 'model', fitted = TRUE, # keep fitted values? ... ) { if (inherits(x, "data.frame") && "Freq" %in% colnames(x)) { x <- xtabs(Freq ~ ., data=x) } if (!inherits(x, c("table", "array"))) stop("not an xtabs, table, array or data.frame with a 'Freq' variable") nf <- length(dim(x)) x <- aperm(x, vorder) factors <- names(dimnames(x)) indices <- 1:nf type = match.arg(type) # models <- as.list(rep(NULL, length(marginals))) models <- list() for (i in marginals) { mtab <- margin.table(x, 1:i) if (i==1) { # KLUDGE: use loglin, but try to make it look like a loglm object mod <- loglin(mtab, margin=NULL, print=FALSE) mod$model.string = paste("=", factors[1]) mod$margin <- list(factors[1]) # mod$margin <- names(dimnames(mtab)) # names(mod$margin) <- factors[1] if (fitted) { fit <- mtab fit[] <- (sum(mtab) / length(mtab)) mod$fitted <- fit } mod$nobs <- length(mtab) mod$frequencies <- mtab mod$deviance <- mod$lrt class(mod) <- c("loglin", "loglm") } else { expected <- switch(type, 'conditional' = conditional(i, mtab, with=if(is.null(k)) i else k), 'joint' = joint(i, mtab, with=if(is.null(k)) i else k), 'mutual' = mutual(i, mtab), 'markov' = markov(i, mtab, order=if(is.null(k)) 1 else k), 'saturated' = saturated(i, mtab) ) form <- loglin2formula(expected) # mod <- loglm(formula=form, data=mtab, fitted=TRUE) mod <- eval(bquote(MASS::loglm(.(form), data=mtab, fitted=fitted))) mod$model.string <- loglin2string(expected, brackets=if (i= S-PLUS 6.0) if(is.null(version$language) && inherits(x, "crosstabs")) { oldClass(x)<-NULL; attr(x, "marginals")<-NULL} ## TODO: add tests for matrix or table n <- nrow(x) m <- ncol(x) pi.c<-pi.d<-matrix(0, nrow=n, ncol=m) row.x<-row(x) col.x<-col(x) for(i in 1:(n)){ for(j in 1:(m)){ pi.c[i, j]<-sum(x[row.xi & col.x>j]) pi.d[i, j]<-sum(x[row.xj]) + sum(x[row.x>i & col.x 1, maxTitle=NULL) { # make sure requested packages are available and loaded for (i in seq_along(package)) { if (!isNamespaceLoaded(package[i])) if (requireNamespace(package[i], quietly=TRUE)) cat(paste("Loading package:", package[i], "\n")) else stop(paste("Package", package[i], "is not available")) } dsitems <- data(package=package)$results wanted <- c('Package', 'Item','Title') ds <- as.data.frame(dsitems[,wanted], stringsAsFactors=FALSE) getData <- function(x, pkg) { # fix items with " (...)" in names, e.g., "BJsales.lead (BJsales)" in datasets objname <- gsub(" .*", "", x) e <- loadNamespace(pkg) if (!exists(x, envir = e)) { dataname <- sub("^.*\\(", "", x) dataname <- sub("\\)$", "", dataname) e <- new.env() data(list = dataname, package = pkg, envir = e) } get(objname, envir = e) } getDim <- function(i) { data <- getData(ds$Item[i], ds$Package[i]) if (is.null(dim(data))) length(data) else paste(dim(data), collapse='x') } getClass <- function(i) { data <- getData(ds$Item[i], ds$Package[i]) cl <- class(data) if (length(cl)>1 && !allClass) cl[length(cl)] else cl } ds$dim <- unlist(lapply(seq_len(nrow(ds)), getDim )) ds$class <- unlist(lapply(seq_len(nrow(ds)), getClass )) if (!is.null(maxTitle)) ds$Title <- substr(ds$Title, 1, maxTitle) if (incPackage) ds[c('Package', 'Item','class','dim','Title')] else ds[c('Item','class','dim','Title')] } vcdExtra/R/CMHtest.R0000644000176200001440000002277514202234157013702 0ustar liggesusers# Cochran-Mantel-Haenszel tests for ordinal factors in contingency tables # The code below follows Stokes, Davis & Koch, (2000). # "Categorical Data Analysis using the SAS System", 2nd Ed., # pp 74--75, 92--101, 124--129. # Ref: Landis, R. J., Heyman, E. R., and Koch, G. G. (1978), # Average Partial Association in Three-way Contingency Tables: # A Review and Discussion of Alternative Tests, # International Statistical Review, 46, 237-254. # See: https://onlinecourses.science.psu.edu/stat504/book/export/html/90 # http://support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#statug_freq_a0000000648.htm # DONE: this should be the main function, handling 2-way & higher-way tables # With strata, use apply() or recursion over strata # DONE: With strata, calculate overall CMH tests controlling for strata # FIXED: rmeans and cmeans tests were labeled incorrectly CMHtest <- function(x, ...) UseMethod("CMHtest") CMHtest.formula <- function(formula, data = NULL, subset = NULL, na.action = NULL, ...) { m <- match.call(expand.dots = FALSE) edata <- eval(m$data, parent.frame()) fstr <- strsplit(paste(deparse(formula), collapse = ""), "~") vars <- strsplit(strsplit(gsub(" ", "", fstr[[1]][2]), "\\|")[[1]], "\\+") varnames <- vars[[1]] condnames <- if (length(vars) > 1) vars[[2]] else NULL dep <- gsub(" ", "", fstr[[1]][1]) if (!dep %in% c("","Freq")) { if (all(varnames == ".")) { varnames <- if (is.data.frame(data)) colnames(data) else names(dimnames(as.table(data))) varnames <- varnames[-which(varnames %in% dep)] } varnames <- c(varnames, dep) } if (inherits(edata, "ftable") || inherits(edata, "table") || length(dim(edata)) > 2) { condind <- NULL dat <- as.table(data) if(all(varnames != ".")) { ind <- match(varnames, names(dimnames(dat))) if (any(is.na(ind))) stop(paste("Can't find", paste(varnames[is.na(ind)], collapse=" / "), "in", deparse(substitute(data)))) if (!is.null(condnames)) { condind <- match(condnames, names(dimnames(dat))) if (any(is.na(condind))) stop(paste("Can't find", paste(condnames[is.na(condind)], collapse=" / "), "in", deparse(substitute(data)))) ind <- c(condind, ind) } dat <- margin.table(dat, ind) } CMHtest.default(dat, strata = if (is.null(condind)) NULL else match(condnames, names(dimnames(dat))), ...) } else { m <- m[c(1, match(c("formula", "data", "subset", "na.action"), names(m), 0))] m[[1]] <- as.name("xtabs") m$formula <- formula(paste(if("Freq" %in% colnames(data)) "Freq", "~", paste(c(varnames, condnames), collapse = "+"))) tab <- eval(m, parent.frame()) CMHtest.default(tab, ...) } } CMHtest.default <- function(x, strata = NULL, rscores=1:R, cscores=1:C, types=c("cor", "rmeans", "cmeans", "general"), overall=FALSE, details=overall, ...) { snames <- function(x, strata) { sn <- dimnames(x)[strata] dn <- names(sn) apply(expand.grid(sn), 1, function(x) paste(dn, x, sep=":", collapse = "|")) } ## check dimensions L <- length(d <- dim(x)) if(any(d < 2L)) stop("All table dimensions must be 2 or greater") if(L > 2L & is.null(strata)) strata <- 3L:L if(is.character(strata)) strata <- which(names(dimnames(x)) == strata) if(L - length(strata) != 2L) stop("All but 2 dimensions must be specified as strata.") ## rearrange table to put primary dimensions first x <- aperm(x, c(setdiff(1:L, strata), strata)) d <- dim(x) R <- d[1] C <- d[2] # handle strata if (!is.null(strata)) { sn <- snames(x, strata) res <- c(apply(x, strata, CMHtest2, rscores=rscores, cscores=cscores, types=types,details=details, ...)) # DONE: fix names if there are 2+ strata names(res) <- sn for (i in seq_along(res)) res[[i]]$stratum <- sn[i] # DONE: Calculate generalized CMH, controlling for strata if (overall) { if (!details) warning("Overall CMH tests not calculated because details=FALSE") else { resall <- CMHtest3(res, types=types) res$ALL <- resall } } return(res) } else CMHtest2(x, rscores=rscores, cscores=cscores, types=types,details=details, ...) } # handle two-way case, for a given stratum # DONE: now allow rscores/cscores == 'midrank' for midrank scores # DONE: allow rscores/cscores=NULL for unordered factors, where ordinal # scores don't make sense # DONE: modified to return all A matrices as a list # DONE: cmh() moved outside CMHtest2 <- function(x, stratum=NULL, rscores=1:R, cscores=1:C, types=c("cor", "rmeans", "cmeans", "general"), details=FALSE, ...) { # left kronecker product lkronecker <- function(x, y, make.dimnames=TRUE, ...) kronecker(y, x, make.dimnames=make.dimnames, ...) # midrank scores (modified ridits) based on row/column totals midrank <- function (n) { cs <- cumsum(n) (2*cs - n +1) / (2*(cs[length(cs)]+1)) } L <- length(d <- dim(x)) R <- d[1] C <- d[2] if (is.character(rscores) && rscores=="midrank") rscores <- midrank(rowSums(x)) if (is.character(cscores) && cscores=="midrank") cscores <- midrank(colSums(x)) nt <- sum(x) pr <- rowSums(x) / nt pc <- colSums(x) / nt m <- as.vector(nt * outer(pr,pc)) # expected values under independence n <- as.vector(x) # cell frequencies V1 <- (diag(pr) - pr %*% t(pr)) V2 <- (diag(pc) - pc %*% t(pc)) V <- (nt^2/(nt-1)) * lkronecker(V1, V2, make.dimnames=TRUE) if (length(types)==1 && types=="ALL") types <- c("general", "rmeans", "cmeans", "cor" ) types <- match.arg(types, several.ok=TRUE) # handle is.null(rscores) etc here if (is.null(rscores)) types <- setdiff(types, c("cmeans", "cor")) if (is.null(cscores)) types <- setdiff(types, c("rmeans", "cor")) table <- NULL Amats <- list() for (type in types) { if("cor" == type) { A <- lkronecker( t(rscores), t(cscores) ) df <- 1 table <- rbind(table, cmh(n, m, A, V, df)) Amats$cor <- A } else if("rmeans" == type) { A <- lkronecker( cbind(diag(R-1), rep(0, R-1)), t(cscores)) df <- R-1 table <- rbind(table, cmh(n, m, A, V, df)) Amats$rmeans <- A } else if("cmeans" == type) { A <- lkronecker( t(rscores), cbind(diag(C-1), rep(0, C-1))) df <- C-1 table <- rbind(table, cmh(n, m, A, V, df)) Amats$cmeans <- A } else if ("general" == type) { A <- lkronecker( cbind(diag(R-1), rep(0, R-1)), cbind(diag(C-1), rep(0, C-1))) df <- (R-1)*(C-1) table <- rbind(table, cmh(n, m, A, V, df)) Amats$general <- A } } colnames(table) <- c("Chisq", "Df", "Prob") rownames(table) <- types xnames <- names(dimnames(x)) result <- list(table=table, names=xnames, rscores=rscores, cscores=cscores, stratum=stratum ) if (details) result <- c(result, list(A=Amats, V=V, n=n, m=m)) class(result) <- "CMHtest" result } # do overall test, from a computed CMHtest list CMHtest3 <- function(object, types=c("cor", "rmeans", "cmeans", "general")) { nstrat <- length(object) # number of strata # extract components, each a list of nstrat terms n.list <- lapply(object, function(s) s$n) m.list <- lapply(object, function(s) s$m) V.list <- lapply(object, function(s) s$V) A.list <- lapply(object, function(s) s$A) nt <- sapply(lapply(object, function(s) s$n), sum) Df <- object[[1]]$table[,"Df"] if (length(types)==1 && types=="ALL") types <- c("general", "rmeans", "cmeans", "cor" ) types <- match.arg(types, several.ok=TRUE) table <- list() for (type in types) { AVA <- 0 Anm <- 0 for (k in 1:nstrat) { A <- A.list[[k]][[type]] V <- V.list[[k]] n <- n.list[[k]] m <- m.list[[k]] AVA <- AVA + A %*% V %*% t(A) Anm <- Anm + A %*% (n-m) } Q <- t(Anm) %*% solve(AVA) %*% Anm df <- Df[type] pvalue <- pchisq(Q, df, lower.tail=FALSE) table <- rbind(table, c(Q, df, pvalue)) } rownames(table) <- types colnames(table) <- c("Chisq", "Df", "Prob") xnames <- object[[1]]$names result=list(table=table, names=xnames, stratum="ALL") class(result) <- "CMHtest" result } # basic CMH calculation cmh <- function(n, m,A, V, df) { AVA <- A %*% V %*% t(A) Q <- t(n-m) %*% t(A) %*% solve(AVA) %*% A %*% (n-m) pvalue <- pchisq(Q, df, lower.tail=FALSE) c(Q, df, pvalue) } # DONE: incorporate stratum name in the heading # TODO: handle the printing of pvalues better print.CMHtest <- function(x, digits = max(getOption("digits") - 2, 3), ...) { heading <- "Cochran-Mantel-Haenszel Statistics" if (!is.null(x$names)) heading <- paste(heading, "for", paste(x$names, collapse=" by ")) if (!is.null(x$stratum)) heading <- paste(heading, ifelse(x$stratum=="ALL", "\n\tOverall tests, controlling for all strata", paste("\n\tin stratum", x$stratum))) # TODO: determine score types (integer, midrank) for heading df <- x$table types <- rownames(df) labels <- list(cor="Nonzero correlation", rmeans="Row mean scores differ", cmeans="Col mean scores differ", general="General association") labels <- unlist(labels[types]) # select the labels for the types df <- data.frame("AltHypothesis"=as.character(labels), df, stringsAsFactors=FALSE) cat(heading,"\n\n") print(df, digits=digits, ...) cat("\n") invisible(x) } vcdExtra/MD50000644000176200001440000002076614202500463012351 0ustar liggesusersb68992f7a0767dfff558e0f8d03224b7 *DESCRIPTION 54bd83d63a6c74ec0543e1704b88a5fc *NAMESPACE 88e2d0edd3301f76b71ce29bf7ba29c4 *NEWS 0b9242b2515cf6dad28203c5835b02ce *R/CMHtest.R 7bf2895634e1b0faca9385bd81ccee37 *R/Crossings.R 1963eb3fb347cf99287b4794b4fd57dc *R/GKgamma.R a7a0bf2f6825917c8e31f99c7b25d265 *R/HLtest.R 10217e3a0582ec4cddba2bfc130a8fad *R/Kway.R c8079ae2c1058550fa5b5fda9624dc8b *R/LRstats.R 8e444f0aaaea055b108a478f8ddf2def *R/Summarise.R 650530a623dec352a740a6626baddac7 *R/blogits.R d3838c45cc40201160f85f0eb732d3c5 *R/collapse.table.R b0483049482397dff2bb9ca2ef123725 *R/cutfac.R f35d0b821039af9613f556357d4f2c82 *R/datasets.R ba689f17617d1f6f199d908bafa97fb3 *R/expand.dft.R c1cf46896f5087dccb67fe9e27c7d200 *R/glmlist.R ea1051fba28687e9b147a8912baf9802 *R/logLik.loglm.R 564524d08cf38c5eea4926a1c6e05fb3 *R/loglin-utilities.R 67c413ec19c991bf083e0459eb3ff71f *R/logseries.R e66f1348beffe4281c1eb9b80036e586 *R/mcaplot.R 1384d1ce36ba17ce25b00603306a258c *R/modFit.R 014cf5c8db1d36327db64bc35c5a7ed3 *R/mosaic.glm.R 5ce7705b0b6911d86ed0ee6547fc7218 *R/mosaic.glmlist.R de9b6b1b1b831283a118c2e5e9e72932 *R/mosaic3d.R 1d5324d4c8b0e2cb572aa9e61ddb7148 *R/print.Kappa.R 1925c7203e978e7b778c25a5b2afa0c1 *R/seq_loglm.R 1987e35844f89995f5f071e3c219e848 *R/seq_mosaic.R ebdbee3b568920673218c4610b858562 *R/split3d.R 559c21fac93caf6fe54e3e48a6265c17 *R/summarise-old.R e782855ba6eaecbc19b51e1c4b8d69ba *R/update.xtabs.R c2c481edc3058a26cd2eb178510decaa *R/vcdExtra-deprecated.R 5fe4e1529aa78269afa34eac8595e84c *R/zero.test.R f29ad45c0e9c9e00774148aab1bf1ed2 *README.md 7b20157c9f3505de8d3fb466bf003ff0 *build/partial.rdb b220ed4909dac12a49fa8e6ff1e31723 *build/vignette.rds 9e9f5a59531115d08e1a4e3904d52568 *data/Abortion.rda d28631e2c49f525a100e152a9eb9a510 *data/Accident.RData ade55a126530afe71b7a1f0c6f2559d9 *data/AirCrash.RData da162a7822bae829cfe70fefc4fb3940 *data/Alligator.RData f78b211dc59fd05ee408f9e36a7ab465 *data/Bartlett.rda 095237eb09ee6c0390963dba18bbe369 *data/Burt.RData be694e73113d787376f490ab7b9c2111 *data/Caesar.rda 5f2710dec70694a826d5441deb8e2834 *data/Cancer.rda fcd475580d46bb85c9e153bc3fba286b *data/Cormorants.RData b83df313ba8d797dc8c88f89fc11633f *data/CyclingDeaths.RData 4db9c986e680e4124e1050179db30145 *data/DaytonSurvey.RData 05d9373ce3ae3f4c418b3e14c10c028c *data/Depends.RData 64b2877c9c9632324d08bc4d03f72c17 *data/Detergent.rda f34cd4cb33c50308542125065ff15456 *data/Donner.RData f9d26be5c016b54ecd109e4489a0c6ac *data/Draft1970.RData 390b34d55b25f7d2fcb1dff1bebf440b *data/Draft1970table.RData b73fd0b7e4a37762e9a78d5a2b5ee7f7 *data/Dyke.rda 8e1819cbdaf4df49ec14ff0400845333 *data/Fungicide.rda 63ed6844022ca2aaa4d5cd0b8594ad78 *data/GSS.rda d6b04ac4b77a3eaaeee872b7919868c9 *data/Geissler.RData 29a5b76d19e693832c6388550e42f844 *data/Gilby.rda c243c6a0b3bc5f6b18db3af0a18e776f *data/Glass.RData 96f75a9a79605ae17c5d68800569e1a7 *data/HairEyePlace.RData 9dafaf5aa69dbbccbaf2af343688bfb2 *data/Hauser79.RData c011ecd9d76657661c6d115022f85398 *data/Heart.rda b6eff026e81dc3b85f7f29fdebea80d9 *data/Heckman.rda 86cad7abda4d0a47ea2193e4ce6a2dcf *data/HospVisits.RData 54b4c75dd9bf4a06420c6484ed7078d9 *data/Hoyt.rda 72f070d7e165e79168bc71ea7c936efc *data/ICU.RData 2e13f7a8f621f48a8e66d3dd059a0ec9 *data/JobSat.rda fd0c8ba20b7cf4762223d97920f02fe7 *data/Mammograms.RData 919582b5088c7c4d56a256640d937a14 *data/Mental.rda 7c5137b9e5ad8816db27b35d88e58b2b *data/Mice.RData 6a3ccdb60e1602ab6401569c4a2ec496 *data/Mobility.rda eab6272f18d923a12f5ded44e45ce02d *data/PhdPubs.RData 42041e4e85802dafdb5e0f94225fe4d9 *data/ShakeWords.RData d5a1609b4f6dee6150e8386e4c2b6125 *data/TV.rda 02aab49a34d3fad2b04a4531e52f1b75 *data/Titanicp.rda 0ca91732933417b5368eac203363eab7 *data/Toxaemia.RData f5367f50c4ba0eaa6e114c09a3419c41 *data/Vietnam.RData b266482f90934af2a6059505edadb61e *data/Vietnam.rda 692db9eccdec1d061cde3d8243881b92 *data/Vote1980.RData 2cecc558ee99eaafa004a402ebee1228 *data/WorkerSat.RData 3719df9f2df8ee9b95093b6e396e518b *data/Yamaguchi87.RData 45bc99442529ca940cb36f44333030f8 *demo/00Index b4a763fc0987f60fd6102f1026d483c1 *demo/Wong2-3.R 55e972f403ae9de662d7e9b6891bd2c7 *demo/Wong3-1.R 688251f0404f6dc0b98773ba16415c1e *demo/housing.R 02eba55e051f4afcbdd923d80dd5f7b0 *demo/mental-glm.R f5c6bad4251ba4fc2879ac10f7755bd9 *demo/mosaic3d-demo.R ba4d09ac1c0d1f3708df0885d8b66dfb *demo/mosaic3d-hec.R bcb29a6d18ecaefa75284a3982aed586 *demo/occStatus.R b8e990080da869639effe9c5be96990f *demo/ucb-glm.R be799fa72e29b45c9c5117ad1396ab88 *demo/vision-quasi.R ee93f55378d740b1ab23b8a298739aaa *demo/yaish-unidiff.R ffd20b4a85ca58f1dc3d8d1c3f4efd92 *demo/yamaguchi-xie.R 964c9e1c23eb6829d2186fec14bbd846 *inst/WORDLIST 6a72442bb96d8298b53f4fa08a187542 *inst/doc/vcd-tutorial.R eb27f2a38f78d3d3e66ff80696e2b653 *inst/doc/vcd-tutorial.Rnw a49ac273fec2176f42e4970edb2f69b6 *inst/doc/vcd-tutorial.pdf 3321d04d1eea258c261c59f337c21d1a *inst/extdata/tv.dat d87499ead4bdcce6563da42731b65914 *man/Abortion.Rd 72060b65be9ae4869974146b79384a7b *man/Accident.Rd a6be3319c93696650c53982797a41735 *man/AirCrash.Rd f5f3416a87eadefaee0e88f37642724c *man/Alligator.Rd e8aa86902e20ea5a9dd4b739bf6fca6c *man/Bartlett.Rd 5380b712bb57acc195ae82e3fb1fa71e *man/Burt.Rd 6a22ff1036fb9bcd1b7e0e729962f071 *man/CMHtest.Rd d8ae910df0c07de129ec3b69b3acf481 *man/Caesar.Rd b16ff46a4fdb113c298fa978aec0a4bd *man/Cancer.Rd 53190931ef68d55ea6f61019cf1f1b2a *man/Cormorants.Rd 8491383b7e4ee8a89e64fda529931a7f *man/Crossings.Rd 3cc1d3165952c41c72227e9da91305af *man/CyclingDeaths.Rd 54dfe1dda33d5483207a39102853a817 *man/DaytonSurvey.Rd 9845a79d9242f16318ef94002b9dce5d *man/Depends.Rd c3fe4a311f283fb5af24f9c9c3b8f39a *man/Detergent.Rd 6221ae9fca219d10abf9ad478a73769f *man/Donner.Rd d93bf5718654b64edaf0b134cd88049d *man/Draft1970.Rd e317dcc0cd78d636b6641a52dda9fef6 *man/Draft1970table.Rd 650d7169a8a2b1416ad223862148b157 *man/Dyke.Rd cea3023e1d26b5a76c59b1f4e6ab4c78 *man/Fungicide.Rd bc1760e7dba509ec09b76865fabfff43 *man/GKgamma.Rd 30e2d9db679aa94d2c49a5a676ca89e4 *man/GSS.Rd b1437e6a9cea52525fc1f43ec00ac844 *man/Geissler.Rd acea91c7604486003eeee95a8906bb5a *man/Gilby.Rd 386e653640e44e7b5cb55f53c83aba57 *man/Glass.Rd 6cd448f1777ab751928f60930142536a *man/HLtest.Rd e7b3ee0e86a80bd6ae303c8180c44100 *man/HairEyePlace.Rd 53988fccc0bf853b9bb522076381c83d *man/Hauser79.Rd 25cc2198699598097f1aa330b443d7de *man/Heart.Rd 991025420ed138c76aa5d5d88a0da9dc *man/Heckman.Rd 9d625171fb376059b71b99d1f94ee07b *man/HospVisits.Rd ef7a954e4beefdb7cf84f8fe1f84deac *man/Hoyt.Rd 0f52cfd948ae4639c391b9bb63c86f40 *man/ICU.Rd e3240cc9b40bdfea2d1113c0f970ef5c *man/JobSat.Rd 38619a2fc8ac4a3028f32bf94b268b10 *man/Kway.Rd 9c79c35060171b0ea5d2d7960b35edd0 *man/LRstats.Rd b43fcc6e93a991acd79038b9cc20396b *man/Mammograms.Rd ddb9e0e29d89fd4e20a7a55fad7ac6a3 *man/Mental.Rd b805c5943caae1c9c43d911376571311 *man/Mice.Rd 65bb70e078e10f773017651a7e5a13b0 *man/Mobility.Rd a64e1e18ca114210a4d75e2c72ac14b2 *man/PhdPubs.Rd 6fdfdfc454a752790bfd04c7fb859cf2 *man/ShakeWords.Rd 19ff4c40b4f445d48021fa0dcf0c59a1 *man/Summarise.Rd 5e1054cc83204f1399834dc51ee52e0e *man/TV.Rd 9dfdae432d0f291606cb5c618b9fd2fe *man/Titanicp.Rd a62b058972e3b3c914ebe81bb096928e *man/Toxaemia.Rd ba46552a51ef7fd2e3acb6bc2c12a0cd *man/Vietnam.Rd fe59d7a7284aef51cba27c21df4cfa29 *man/Vote1980.Rd b0a474971d7b8b6921e7220827704daa *man/WorkerSat.Rd e2d1c5edd827bcd18b394325e3eb7466 *man/Yamaguchi87.Rd 6286e9d054cf682373b0880b5f93a238 *man/blogits.Rd dc603b906841137948794e90dddd80b9 *man/collapse.table.Rd d64c532ae465bcf918eee40c427b3550 *man/cutfac.Rd cdca7088a63932032492eb4bc17938f1 *man/datasets.Rd 72e270c4160957d1d79da5e8331b0ce8 *man/expand.dft.Rd 578f9088e7c46eb22a338b1008d06794 *man/glmlist.Rd c79c3f89cd4a8342acb6efbbfd95f936 *man/logLik.loglm.Rd 72447d319ac7398e41dd9848f63602ed *man/loglin-utilities.Rd 49427b5d2c9a599c262ff1f7334f3893 *man/logseries.Rd 98d1b49c2bf0b482d4cf1ab1f836276e *man/mcaplot.Rd d1668c07d59be03d219b588834149f84 *man/modFit.Rd 7537cb31b95f2fe62d0956582b175f4c *man/mosaic.glm.Rd cc0d56586d348968bcaed0a1fef991f1 *man/mosaic.glmlist.Rd d91a290f8e46b34e33589dd67ac8bbaa *man/mosaic3d.Rd 05453d62ff0d832c737ea9cb1062767f *man/print.Kappa.Rd cbc06b6d710e4ecaa9068cb2d296dd21 *man/seq_loglm.Rd a61fa9a36c31f964a89f9a86d18d47c2 *man/seq_mosaic.Rd cec84e260d0b884b8c27073e224a998f *man/split3d.Rd 684b8e8a4e00d39ac7ab3587bc3d833d *man/update.xtabs.Rd 86a2288b811a6468dfa0b3ea39bca4ef *man/vcdExtra-deprecated.Rd a31ca1e1ae6dc6ff0c75f89afc0cb72c *man/vcdExtra-package.Rd de632b234dafeacdc8ab4431324f1afd *man/zero.test.Rd eb27f2a38f78d3d3e66ff80696e2b653 *vignettes/vcd-tutorial.Rnw 2f31459bee0ca5db8893f77b1ae65c7a *vignettes/vcd.bib d20caf9dc57fb78d792790e721f6d365 *vignettes/vcdExtra.bib vcdExtra/inst/0000755000176200001440000000000014202474400013004 5ustar liggesusersvcdExtra/inst/doc/0000755000176200001440000000000014202474400013551 5ustar liggesusersvcdExtra/inst/doc/vcd-tutorial.Rnw0000644000176200001440000023434714202271213016670 0ustar liggesusers% !Rnw weave = Sweave %\VignetteEngine{Sweave} %\VignetteIndexEntry{Tutorial: Working with categorical data with R and the vcd package} %\VignetteDepends{vcd,gmodels,ca} %\VignetteKeywords{contingency tables, mosaic plots, sieve plots, categorical data, independence, conditional independence, R} %\VignettePackage{vcdExtra} \documentclass[10pt,twoside]{article} \usepackage{Sweave} \usepackage{bm} \usepackage[toc]{multitoc} % for table of contents % from Z.cls \usepackage[authoryear,round,longnamesfirst]{natbib} \bibpunct{(}{)}{;}{a}{}{,} \bibliographystyle{jss} \usepackage{hyperref} \usepackage{color} %% colors \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \hypersetup{% hyperindex = {true}, colorlinks = {true}, % linktocpage = {true}, plainpages = {false}, linkcolor = {Blue}, citecolor = {Blue}, urlcolor = {Red}, pdfstartview = {Fit}, pdfpagemode = {UseOutlines}, pdfview = {XYZ null null null} } %\AtBeginDocument{ % \hypersetup{% % pdfauthor = {Michael Friendly}, % pdftitle = {Tutorial: Working with categorical data with R and the vcd package}, % pdfkeywords = {contingency tables, mosaic plots, sieve plots, categorical data, independence, conditional independence, R} % } %} % math stuff \newcommand*{\given}{\ensuremath{\, | \,}} \renewcommand*{\vec}[1]{\ensuremath{\bm{#1}}} \newcommand{\mat}[1]{\ensuremath{\bm{#1}}} \newcommand{\trans}{\ensuremath{^\mathsf{T}}} \newcommand{\diag}[1]{\ensuremath{\mathrm{diag} (#1)}} \def\binom#1#2{{#1 \choose #2}}% \newcommand{\implies}{ \ensuremath{\mapsto} } \newenvironment{equation*}{\displaymath}{\enddisplaymath}% \newcommand{\tabref}[1]{Table~\ref{#1}} \newcommand{\figref}[1]{Figure~\ref{#1}} \newcommand{\secref}[1]{Section~\ref{#1}} \newcommand{\loglin}{loglinear } %\usepackage{thumbpdf} % page dimensions \addtolength{\hoffset}{-1.5cm} \addtolength{\textwidth}{3cm} \addtolength{\voffset}{-1cm} \addtolength{\textheight}{2cm} % Vignette examples \newcommand*{\Example}{\fbox{\textbf{\emph{Example}}:} } % R stuff \newcommand{\var}[1]{\textit{\texttt{#1}}} \newcommand{\data}[1]{\texttt{#1}} \newcommand{\class}[1]{\textsf{"#1"}} %% \code without `-' ligatures \def\nohyphenation{\hyphenchar\font=-1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font=`-} {\catcode`\-=\active% \global\def\code{\bgroup% \catcode`\-=\active \let-\codedash% \Rd@code}} \def\codedash{-\discretionary{}{}{}} \def\Rd@code#1{\texttt{\nohyphenation#1}\egroup} \newcommand{\codefun}[1]{\code{#1()}} \let\proglang=\textsf \newcommand{\pkg}[1]{{\normalfont\fontseries{b}\selectfont #1}} \newcommand{\Rpackage}[1]{{\textsf{#1}}} %% almost as usual \author{Michael Friendly\\York University, Toronto} \title{Working with categorical data with \proglang{R} and the \pkg{vcd} and \pkg{vcdExtra} packages} \date{\footnotesize{Using \Rpackage{vcdExtra} version \Sexpr{packageDescription("vcdExtra")[["Version"]]} and \Rpackage{vcd} version \Sexpr{packageDescription("vcd")[["Version"]]}; Date: \Sexpr{Sys.Date()}}} %% for pretty printing and a nice hypersummary also set: %\Plainauthor{Michael Friendly} %% comma-separated %\Shorttitle{vcd tutorial} %% a short title (if necessary) %\Plaintitle{Tutorial: Working with categorical data with R and the vcd package} %\SweaveOpts{engine=R,eps=TRUE,height=6,width=7,results=hide,fig=FALSE,echo=TRUE} \SweaveOpts{engine=R,height=6,width=7,results=hide,fig=FALSE,echo=TRUE} \SweaveOpts{prefix.string=fig/vcd-tut,eps=FALSE} \SweaveOpts{keep.source=TRUE} %\SweaveOpts{concordance=TRUE} \setkeys{Gin}{width=0.7\textwidth} <>= set.seed(1071) #library(vcd) library(vcdExtra) library(ggplot2) #data(Titanic) data(HairEyeColor) data(PreSex) data(Arthritis) art <- xtabs(~Treatment + Improved, data = Arthritis) if(!file.exists("fig")) dir.create("fig") @ %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \SweaveOpts{concordance=TRUE} \maketitle %% an abstract and keywords \begin{abstract} This tutorial describes the creation and manipulation of frequency and contingency tables from categorical variables, along with tests of independence, measures of association, and methods for graphically displaying results. The framework is provided by the \proglang{R} package \pkg{vcd}, but other packages are used to help with various tasks. The \pkg{vcdExtra} package extends the graphical and statistical methods provided by \pkg{vcd}. This package is now the main support package for the book \emph{Discrete Data Analysis with R: Visualizing and Modeling Techniques for Categorical and Count Data} \citep{FriendlyMeyer:2016:DDAR}. The web page for the book, \href{http://ddar.datavis.ca}{ddar.datavis.ca}, gives further details. \end{abstract} %\keywords{contingency tables, mosaic plots, sieve plots, %categorical data, independence, conditional independence, generalized linear models, %\proglang{R}} %\Plainkeywords{contingency tables, mosaic plots, % sieve plots, categorical data, independence, % conditional independence, generalized linear models, R} {\small % \sloppy % \begin{multicols}{2} \tableofcontents % \end{multicols} } \section[Introduction]{Introduction}\label{sec:intro} %% Note: If there is markup in \(sub)section, then it has to be escape as above. This tutorial, part of the \pkg{vcdExtra} package, describes how to work with categorical data in the context of fitting statistical models in \proglang{R} and visualizing the results using the \pkg{vcd} and \pkg{vcdExtra} packages. It focuses first on methods and tools for creating and manipulating \proglang{R} data objects which represent frequency and contingency tables involving categorical variables. Further sections describe some simple methods for calculating tests of independence and measures of association among categorical variables, and also methods for graphically displaying results. There is much more to the analysis of categorical data than is described here, where the emphasis is on cross-tabulated tables of frequencies (``contingency tables''), statistical tests, associated \loglin\ models, and visualization of \emph{how} variables are related. A more general treatment of graphical methods for categorical data is contained in the book, \emph{Discrete Data Analysis with R: Visualizing and Modeling Techniques for Categorical and Count Data} \citep{FriendlyMeyer:2016:DDAR}. An earlier book using SAS is \emph{Visualizing Categorical Data} \citep{vcd:Friendly:2000}, for which \pkg{vcd} is a partial \proglang{R} companion, covering topics not otherwise available in \proglang{R}. On the other hand, the implementation of graphical methods in \pkg{vcd} is more general in many respects than what I provided in \proglang{SAS}. Statistical models for categorical data in \proglang{R} have been extended considerably with the \pkg{gnm} package for generalized \emph{nonlinear} models. The \pkg{vcdExtra} package extends \pkg{vcd} methods to models fit using \codefun{glm} and \codefun{gnm}. A more complete theoretical description of these statistical methods is provided in Agresti's \citeyearpar{vcd:Agresti:2002,Agresti:2013} \emph{Categorical Data Analysis}. For this, see the \proglang{Splus/R} companion by Laura Thompson, \url{http://www.stat.ufl.edu/~aa/cda/Thompson_manual.pdf} and Agresti's support web page, \url{http://www.stat.ufl.edu/~aa/cda/cda.html}. \section[Creating frequency tables]{Creating and manipulating frequency tables}\label{sec:creating} \proglang{R} provides many methods for creating frequency and contingency tables. Several are described below. In the examples below, we use some real examples and some anonymous ones, where the variables \code{A}, \code{B}, and \code{C} represent categorical variables, and \code{X} represents an arbitrary \proglang{R} data object. The first thing you need to know is that categorical data can be represented in three different forms in \proglang{R}, and it is sometimes necessary to convert from one form to another, for carrying out statistical tests, fitting models or visualizing the results. Once a data object exists in \proglang{R}, you can examine its complete structure with the \codefun{str} function, or view the names of its components with the \codefun{names} function. \begin{description} \item[case form] a data frame containing individual observations, with one or more factors, used as the classifying variables. In case form, there may also be numeric covariates. The total number of observations is \code{nrow(X)}, and the number of variables is \code{ncol(X)}. \Example The \data{Arthritis} data is available in case form in the \pkg{vcd} package. There are two explanatory factors: \code{Treatment} and \code{Sex}. \code{Age} is a numeric covariate, and \code{Improved} is the response--- an ordered factor, with levels \code{\Sexpr{paste(levels(Arthritis$Improved),collapse=' < ')}}. Excluding \code{Age}, we would have a $2 \times 2 \times 3$ contingency table for \code{Treatment}, \code{Sex} and \code{Improved}. %\code{"None" < "Some" < "Marked"}. <>= names(Arthritis) # show the variables str(Arthritis) # show the structure head(Arthritis,5) # first 5 observations, same as Arthritis[1:5,] @ \item[frequency form] a data frame containing one or more factors, and a frequency variable, often called \code{Freq} or \code{count}. The total number of observations is \verb|sum(X$Freq)|, \code{sum(X[,"Freq"])} or some equivalent form. The number of cells in the table is \code{nrow(X)}. \Example For small frequency tables, it is often convenient to enter them in frequency form using \codefun{expand.grid} for the factors and \codefun{c} to list the counts in a vector. The example below, from \cite{vcd:Agresti:2002} gives results for the 1991 General Social Survey, with respondents classified by sex and party identification. <>= # Agresti (2002), table 3.11, p. 106 GSS <- data.frame( expand.grid(sex=c("female", "male"), party=c("dem", "indep", "rep")), count=c(279,165,73,47,225,191)) GSS names(GSS) str(GSS) sum(GSS$count) @ \item[table form] a matrix, array or table object, whose elements are the frequencies in an $n$-way table. The variable names (factors) and their levels are given by \code{dimnames(X)}. The total number of observations is \code{sum(X)}. The number of dimensions of the table is \code{length(dimnames(X))}, and the table sizes are given by \code{sapply(dimnames(X), length)}. \Example The \data{HairEyeColor} is stored in table form in \pkg{vcd}. <>= str(HairEyeColor) # show the structure sum(HairEyeColor) # number of cases sapply(dimnames(HairEyeColor), length) # table dimension sizes @ \Example Enter frequencies in a matrix, and assign \code{dimnames}, giving the variable names and category labels. Note that, by default, \codefun{matrix} uses the elements supplied by \emph{columns} in the result, unless you specify \code{byrow=TRUE}. <>= ## A 4 x 4 table Agresti (2002, Table 2.8, p. 57) Job Satisfaction JobSat <- matrix(c(1,2,1,0, 3,3,6,1, 10,10,14,9, 6,7,12,11), 4, 4) dimnames(JobSat) = list(income=c("< 15k", "15-25k", "25-40k", "> 40k"), satisfaction=c("VeryD", "LittleD", "ModerateS", "VeryS")) JobSat @ \data{JobSat} is a matrix, not an object of \code{class("table")}, and some functions are happier with tables than matrices. You can coerce it to a table with \codefun{as.table}, <>= JobSat <- as.table(JobSat) str(JobSat) @ \end{description} \subsection[Ordered factors]{Ordered factors and reordered tables}\label{sec:ordered-factors} In table form, the values of the table factors are ordered by their position in the table. Thus in the \data{JobSat} data, both \code{income} and \code{satisfaction} represent ordered factors, and the \emph{positions} of the values in the rows and columns reflects their ordered nature. Yet, for analysis, there are time when you need \emph{numeric} values for the levels of ordered factors in a table, e.g., to treat a factor as a quantitative variable. In such cases, you can simply re-assign the \code{dimnames} attribute of the table variables. For example, here, we assign numeric values to \code{income} as the middle of their ranges, and treat \code{satisfaction} as equally spaced with integer scores. <>= dimnames(JobSat)$income<-c(7.5,20,32.5,60) dimnames(JobSat)$satisfaction<-1:4 @ For the \data{HairEyeColor} data, hair color and eye color are ordered arbitrarily. For visualizing the data using mosaic plots and other methods described below, it turns out to be more useful to assure that both hair color and eye color are ordered from dark to light. Hair colors are actually ordered this way already, and it is easiest to re-order eye colors by indexing. Again \codefun{str} is your friend. <>= HairEyeColor <- HairEyeColor[, c(1,3,4,2), ] str(HairEyeColor) @ This is also the order for both hair color and eye color shown in the result of a correspondence analysis (\figref{fig:ca-haireye}) below. With data in case form or frequency form, when you have ordered factors represented with character values, you must ensure that they are treated as ordered in \proglang{R}.% \footnote{In \proglang{SAS}, many procedures offer the option \code{order = data | internal | formatted} to allow character values to be ordered according to (a) their order in the data set, (b) sorted internal value, or (c) sorted formatted representation provided by a \proglang{SAS} format. } Imagine that the \data{Arthritis} data was read from a text file. By default the \code{Improved} will be ordered alphabetically: \code{Marked}, \code{None}, \code{Some}--- not what we want. In this case, the function \codefun{ordered} (and others) can be useful. <>= Arthritis <- read.csv("arthritis.txt",header=TRUE) Arthritis$Improved <- ordered(Arthritis$Improved, levels=c("None", "Some", "Marked")) @ With this order of \code{Improved}, the response in this data, a mosaic display of \code{Treatment} and \code{Improved} (\figref{fig:arthritis})shows a clearly interpretable pattern. <>= mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: [Treatment] [Improved]") @ %\setkeys{Gin}{width=0.7\textwidth} \begin{figure}[htb] \begin{center} %<>= %mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: [Treatment] [Improved]") %@ \includegraphics[width=0.7\textwidth]{fig/vcd-tut-Arthritis} \caption{Mosaic plot for the \data{Arthritis} data, showing the marginal model of independence for Treatment and Improved. Age, a covariate, and Sex are ignored here.} \label{fig:arthritis} \end{center} \end{figure} Finally, there are situations where, particularly for display purposes, you want to re-order the \emph{dimensions} of an $n$-way table, or change the labels for the variables or levels. This is easy when the data are in table form: \codefun{aperm} permutes the dimensions, and assigning to \code{names} and \code{dimnames} changes variable names and level labels respectively. We will use the following version of \data{UCBAdmissions} in \secref{sec:mantel} below.% \footnote{ Changing \code{Admit} to \code{Admit?} might be useful for display purposes, but is dangerous--- because it is then difficult to use that variable name in a model formula. See \secref{sec:tips} for options \code{labeling\_args} and \code{set\_labels} to change variable and level names for displays in the \code{strucplot} framework. } <>= UCB <- aperm(UCBAdmissions, c(2, 1, 3)) dimnames(UCB)[[2]] <- c("Yes", "No") names(dimnames(UCB)) <- c("Sex", "Admit?", "Department") ftable(UCB) @ %There is one subtle ``gotcha'' here: \codefun{aperm} returns an object of class \class{"array"}, %whereas \data{UCBAdmissions} is of class \class{"table"}, so methods defined for \code{table} %objects will not work on the permuted array. %The solution is to reassign the \code{class} of the result of \codefun{aperm}. % %<>= %class(UCBAdmissions) %class(UCB) %str(as.data.frame(UCBAdmissions)) # OK %str(as.data.frame(UCB)) # wrong % %class(UCB) <- "table" %str(as.data.frame(UCB)) # now OK %@ % \subsection[structable()]{\codefun{structable}}\label{sec:structable} For 3-way and larger tables the \codefun{structable} function in \pkg{vcd} provides a convenient and flexible tabular display. The variables assigned to the rows and columns of a two-way display can be specified by a model formula. <>= structable(HairEyeColor) # show the table: default structable(Hair+Sex ~ Eye, HairEyeColor) # specify col ~ row variables @ It also returns an object of class \code{"structable"} which may be plotted with \codefun{mosaic} (not shown here). <>= HSE < - structable(Hair+Sex ~ Eye, HairEyeColor) # save structable object mosaic(HSE) # plot it @ \subsection[table() and friends]{\codefun{table} and friends}\label{sec:table} You can generate frequency tables from factor variables using the \codefun{table} function, tables of proportions using the \codefun{prop.table} function, and marginal frequencies using \codefun{margin.table}. <>= n=500 A <- factor(sample(c("a1","a2"), n, rep=TRUE)) B <- factor(sample(c("b1","b2"), n, rep=TRUE)) C <- factor(sample(c("c1","c2"), n, rep=TRUE)) mydata <- data.frame(A,B,C) @ <>= # 2-Way Frequency Table attach(mydata) mytable <- table(A,B) # A will be rows, B will be columns mytable # print table margin.table(mytable, 1) # A frequencies (summed over B) margin.table(mytable, 2) # B frequencies (summed over A) prop.table(mytable) # cell percentages prop.table(mytable, 1) # row percentages prop.table(mytable, 2) # column percentages @ \codefun{table} can also generate multidimensional tables based on 3 or more categorical variables. In this case, use the \codefun{ftable} or \codefun{structable} function to print the results more attractively. <>= # 3-Way Frequency Table mytable <- table(A, B, C) ftable(mytable) @ \codefun{table} ignores missing values by default. To include \code{NA} as a category in counts, include the table option \code{exclude=NULL} if the variable is a vector. If the variable is a factor you have to create a new factor using \code{newfactor <- factor(oldfactor, exclude=NULL)}. \subsection[xtabs()]{\codefun{xtabs}}\label{sec:xtabs} The \codefun{xtabs} function allows you to create cross-tabulations of data using formula style input. This typically works with case-form data supplied in a data frame or a matrix. The result is a contingency table in array format, whose dimensions are determined by the terms on the right side of the formula. <>= # 3-Way Frequency Table mytable <- xtabs(~A+B+C, data=mydata) ftable(mytable) # print table summary(mytable) # chi-square test of indepedence @ If a variable is included on the left side of the formula, it is assumed to be a vector of frequencies (useful if the data have already been tabulated in frequency form). <>= (GSStab <- xtabs(count ~ sex + party, data=GSS)) summary(GSStab) @ \subsection[Collapsing over factors]{Collapsing over table factors: \codefun{aggregate}, \codefun{margin.table} and \codefun{apply}} It sometimes happens that we have a data set with more variables or factors than we want to analyse, or else, having done some initial analyses, we decide that certain factors are not important, and so should be excluded from graphic displays by collapsing (summing) over them. For example, mosaic plots and fourfold displays are often simpler to construct from versions of the data collapsed over the factors which are not shown in the plots. The appropriate tools to use again depend on the form in which the data are represented--- a case-form data frame, a frequency-form data frame (\codefun{aggregate}), or a table-form array or table object (\codefun{margin.table} or \codefun{apply}). When the data are in frequency form, and we want to produce another frequency data frame, \codefun{aggregate} is a handy tool, using the argument \code{FUN=sum} to sum the frequency variable over the factors \emph{not} mentioned in the formula. \Example The data frame \data{DaytonSurvey} in the \pkg{vcdExtra} package represents a $2^5$ table giving the frequencies of reported use (``ever used?'') of alcohol, cigarettes and marijuana in a sample of high school seniors, also classified by sex and race. <>= str(DaytonSurvey) head(DaytonSurvey) @ To focus on the associations among the substances, we want to collapse over sex and race. The right-hand side of the formula used in the call to \codefun{aggregate} gives the factors to be retained in the new frequency data frame, \code{Dayton.ACM.df}. <>= # data in frequency form # collapse over sex and race Dayton.ACM.df <- aggregate(Freq ~ cigarette+alcohol+marijuana, data=DaytonSurvey, FUN=sum) Dayton.ACM.df @ When the data are in table form, and we want to produce another table, \codefun{apply} with \code{FUN=sum} can be used in a similar way to sum the table over dimensions not mentioned in the \code{MARGIN} argument. \codefun{margin.table} is just a wrapper for \codefun{apply} using the \codefun{sum} function. \Example To illustrate, we first convert the \data{DaytonSurvey} to a 5-way table using \codefun{xtabs}, giving \code{Dayton.tab}. <>== # in table form Dayton.tab <- xtabs(Freq~cigarette+alcohol+marijuana+sex+race, data=DaytonSurvey) structable(cigarette+alcohol+marijuana ~ sex+race, data=Dayton.tab) @ Then, use \codefun{apply} on \code{Dayton.tab} to give the 3-way table \code{Dayton.ACM.tab} summed over sex and race. The elements in this new table are the column sums for \code{Dayton.tab} shown by \codefun{structable} just above. <>== # collapse over sex and race Dayton.ACM.tab <- apply(Dayton.tab, MARGIN=1:3, FUN=sum) Dayton.ACM.tab <- margin.table(Dayton.tab, 1:3) # same result structable(cigarette+alcohol ~ marijuana, data=Dayton.ACM.tab) @ Many of these operations can be performed using the \verb|**ply()| functions in the \pkg{plyr} package. For example, with the data in a frequency form data frame, use \codefun{ddply} to collapse over unmentioned factors, and \codefun{plyr::summarise}% \footnote{ Ugh. This \pkg{plyr} function clashes with a function of the same name in \pkg{vcdExtra}. In this document I will use the explicit double-colon notation to keep them separate. } as the function to be applied to each piece. <>== Dayton.ACM.df <- ddply(DaytonSurvey, .(cigarette, alcohol, marijuana), plyr::summarise, Freq=sum(Freq)) @ \subsection[Collapsing levels]{Collapsing table levels: \codefun{collapse.table}} A related problem arises when we have a table or array and for some purpose we want to reduce the number of levels of some factors by summing subsets of the frequencies. For example, we may have initially coded Age in 10-year intervals, and decide that, either for analysis or display purposes, we want to reduce Age to 20-year intervals. The \codefun{collapse.table} function in \pkg{vcdExtra} was designed for this purpose. \Example Create a 3-way table, and collapse Age from 10-year to 20-year intervals. First, we generate a $2 \times 6 \times 3$ table of random counts from a Poisson distribution with mean of 100. <>= # create some sample data in frequency form sex <- c("Male", "Female") age <- c("10-19", "20-29", "30-39", "40-49", "50-59", "60-69") education <- c("low", 'med', 'high') data <- expand.grid(sex=sex, age=age, education=education) counts <- rpois(36, 100) # random Possion cell frequencies data <- cbind(data, counts) # make it into a 3-way table t1 <- xtabs(counts ~ sex + age + education, data=data) structable(t1) @ Now collapse \code{age} to 20-year intervals, and \code{education} to 2 levels. In the arguments, levels of \code{age} and \code{education} given the same label are summed in the resulting smaller table. <>= # collapse age to 3 levels, education to 2 levels t2 <- collapse.table(t1, age=c("10-29", "10-29", "30-49", "30-49", "50-69", "50-69"), education=c(">= as.data.frame(GSStab) @ \Example Convert the \code{Arthritis} data in case form to a 3-way table of \code{Treatment} $\times$ \code{Sex} $\times$ \code{Improved}. Note the use of \codefun{with} to avoid having to use \code{Arthritis\$Treatment} etc. within the call to \codefun{table}.% \footnote{ \codefun{table} does not allow a \code{data} argument to provide an environment in which the table variables are to be found. In the examples in \secref{sec:table} I used \code{attach(mydata)} for this purpose, but \codefun{attach} leaves the variables in the global environment, while \codefun{with} just evaluates the \codefun{table} expression in a temporary environment of the data. } <>= Art.tab <-with(Arthritis, table(Treatment, Sex, Improved)) str(Art.tab) ftable(Art.tab) @ There may also be times that you will need an equivalent case form \code{data.frame} with factors representing the table variables rather than the frequency table. For example, the \codefun{mca} function in package \pkg{MASS} only operates on data in this format. Marc Schwartz provided code for \codefun{expand.dft} on the Rhelp mailing list for converting a table back into a case form \code{data.frame}. This function is included in \pkg{vcdExtra}. \Example Convert the \data{Arthritis} data in table form (\code{Art.tab}) back to a \code{data.frame} in case form, with factors \code{Treatment}, \code{Sex} and \code{Improved}. <>= Art.df <- expand.dft(Art.tab) str(Art.df) @ \subsection{A complex example}\label{sec:complex} If you've followed so far, you're ready for a more complicated example. The data file, \code{tv.dat} represents a 4-way table of size $5 \times 11 \times 5 \times 3$ where the table variables (unnamed in the file) are read as \code{V1} -- \code{V4}, and the cell frequency is read as \code{V5}. The file, stored in the \code{doc/extdata} directory of \pkg{vcdExtra}, can be read as follows: <>= tv.data<-read.table(system.file("extdata","tv.dat", package="vcdExtra")) head(tv.data,5) @ For a local file, just use \codefun{read.table} in this form: <>= tv.data<-read.table("C:/R/data/tv.dat") @ The data \code{tv.dat} came from the initial implementation of mosaic displays in \proglang{R} by Jay Emerson. In turn, they came from the initial development of mosaic displays \citep{vcd:Hartigan+Kleiner:1984} that illustrated the method with data on a large sample of TV viewers whose behavior had been recorded for the Neilson ratings. This data set contains sample television audience data from Neilsen Media Research for the week starting November 6, 1995. \begin{flushleft} The table variables are:\\ ~~~\code{V1}-- values 1:5 correspond to the days Monday--Friday;\\ ~~~\code{V2}-- values 1:11 correspond to the quarter hour times 8:00PM through 10:30PM;\\ ~~~\code{V3}-- values 1:5 correspond to ABC, CBS, NBC, Fox, and non-network choices;\\ ~~~\code{V4}-- values 1:3 correspond to transition states: turn the television Off, Switch channels, or Persist in viewing the current channel. \end{flushleft} We are interested just the cell frequencies, and rely on the facts that the (a) the table is complete--- there are no missing cells, so \code{nrow(tv.data)}=\Sexpr{nrow(tv.data)}; (b) the observations are ordered so that \code{V1} varies most rapidly and \code{V4} most slowly. From this, we can just extract the frequency column and reshape it into an array. <>= TV <- array(tv.data[,5], dim=c(5,11,5,3)) dimnames(TV) <- list(c("Monday","Tuesday","Wednesday","Thursday","Friday"), c("8:00","8:15","8:30","8:45","9:00","9:15","9:30", "9:45","10:00","10:15","10:30"), c("ABC","CBS","NBC","Fox","Other"), c("Off","Switch","Persist")) names(dimnames(TV))<-c("Day", "Time", "Network", "State") @ More generally (even if there are missing cells), we can use \codefun{xtabs} (or \codefun{plyr::daply}) to do the cross-tabulation, using \code{V5} as the frequency variable. Here's how to do this same operation with \codefun{xtabs}: <>= TV <- xtabs(V5 ~ ., data=tv.data) dimnames(TV) <- list(Day=c("Monday","Tuesday","Wednesday","Thursday","Friday"), Time=c("8:00","8:15","8:30","8:45","9:00","9:15","9:30", "9:45","10:00","10:15","10:30"), Network=c("ABC","CBS","NBC","Fox","Other"), State=c("Off","Switch","Persist")) @ But this 4-way table is too large and awkward to work with. Among the networks, Fox and Other occur infrequently. We can also cut it down to a 3-way table by considering only viewers who persist with the current station.% \footnote{This relies on the fact that that indexing an array drops dimensions of length 1 by default, using the argument \code{drop=TRUE}; the result is coerced to the lowest possible dimension. } <>= TV <- TV[,,1:3,] # keep only ABC, CBS, NBC TV <- TV[,,,3] # keep only Persist -- now a 3 way table structable(TV) @ Finally, for some purposes, we might want to collapse the 11 times into a smaller number. Here, we use \codefun{as.data.frame.table} to convert the table back to a data frame, \codefun{levels} to re-assign the values of \code{Time}, and finally, \codefun{xtabs} to give a new, collapsed frequency table. <>= TV.df <- as.data.frame.table(TV) levels(TV.df$Time) <- c(rep("8:00-8:59",4),rep("9:00-9:59",4), rep("10:00-10:44",3)) TV2 <- xtabs(Freq ~ Day + Time + Network, TV.df) structable(Day ~ Time+Network,TV2) @ Whew! See \figref{fig:TV-mosaic} for a mosaic plot of the \code{TV2} data. \section{Tests of Independence} \subsection{CrossTable} OK, now we're ready to do some analyses. For tabular displays, the \codefun{CrossTable} function in the \pkg{gmodels} package produces cross-tabulations modeled after \code{PROC FREQ} in \proglang{SAS} or \code{CROSSTABS} in \proglang{SPSS}. It has a wealth of options for the quantities that can be shown in each cell. <>= # 2-Way Cross Tabulation library(gmodels) CrossTable(GSStab,prop.t=FALSE,prop.r=FALSE,prop.c=FALSE) @ There are options to report percentages (row, column, cell), specify decimal places, produce Chi-square, Fisher, and McNemar tests of independence, report expected and residual values (pearson, standardized, adjusted standardized), include missing values as valid, annotate with row and column titles, and format as \proglang{SAS} or \proglang{SPSS} style output! See \code{help(CrossTable)} for details. \subsection{Chi-square test} For 2-way tables you can use \codefun{chisq.test} to test independence of the row and column variable. By default, the $p$-value is calculated from the asymptotic chi-squared distribution of the test statistic. Optionally, the $p$-value can be derived via Monte Carlo simulation. <>= (HairEye <- margin.table(HairEyeColor, c(1, 2))) chisq.test(HairEye) @ \subsection{Fisher Exact Test}\label{sec:Fisher} \code{fisher.test(X)} provides an exact test of independence. \code{X} must be a two-way contingency table in table form. Another form, \code{fisher.test(X, Y)} takes two categorical vectors of the same length. For tables larger than $2 \times 2$ the method can be computationally intensive (or can fail) if the frequencies are not small. <>= fisher.test(GSStab) @ But this does not work because \data{HairEye} data has $n$=592 total frequency. An exact test is unnecessary in this case. <>= fisher.test(HairEye) @ %# <>= %# #cat(try(fisher.test(HairEye))) %# @ \begin{Soutput} Error in fisher.test(HairEye) : FEXACT error 6. LDKEY is too small for this problem. Try increasing the size of the workspace. \end{Soutput} \subsection[Mantel-Haenszel test]{Mantel-Haenszel test and conditional association}\label{sec:mantel} Use the \code{mantelhaen.test(X)} function to perform a Cochran-Mantel-Haenszel $\chi^2$ chi test of the null hypothesis that two nominal variables are \emph{conditionally independent}, $A \perp B \given C$, in each stratum, assuming that there is no three-way interaction. \code{X} is a 3 dimensional contingency table, where the last dimension refers to the strata. The \data{UCBAdmissions} serves as an example of a $2 \times 2 \times 6$ table, with \code{Dept} as the stratifying variable. <>= ## UC Berkeley Student Admissions mantelhaen.test(UCBAdmissions) @ The results show no evidence for association between admission and gender when adjusted for department. However, we can easily see that the assumption of equal association across the strata (no 3-way association) is probably violated. For $2 \times 2 \times k$ tables, this can be examined from the odds ratios for each $2 \times 2$ table (\codefun{oddsratio}), and tested by using \verb|woolf_test()| in \pkg{vcd}. %<>= %oddsRatio <- function(x) (x[1,1]*x[2,2])/(x[1,2]*x[2,1]) %apply(UCBAdmissions, 3, oddsRatio) % %woolf_test(UCBAdmissions) %@ <>= oddsratio(UCBAdmissions, log=FALSE) lor <- oddsratio(UCBAdmissions) # capture log odds ratios summary(lor) woolf_test(UCBAdmissions) @ We can visualize the odds ratios of Admission for each department with fourfold displays using \codefun{fourfold}. The cell frequencies $n_{ij}$ of each $2 \times 2$ table are shown as a quarter circle whose radius is proportional to $\sqrt{n_{ij}}$, so that its area is proportional to the cell frequency. Confidence rings for the odds ratio allow a visual test of the null of no association; the rings for adjacent quadrants overlap \emph{iff} the observed counts are consistent with the null hypothesis. In the extended version (the default), brighter colors are used where the odds ratio is significantly different from 1. The following lines produce \figref{fig:fourfold1}.% \footnote{The color values \code{col[3:4]} were modified from their default values to show a greater contrast between significant and insignificant associations here.} <>= col <- c("#99CCFF", "#6699CC", "#F9AFAF", "#6666A0", "#FF0000", "#000080") fourfold(UCB,mfrow=c(2,3), color=col) @ %\setkeys{Gin}{width=0.8\textwidth} \begin{figure}[htb] \begin{center} %<>= %col <- c("#99CCFF", "#6699CC", "#F9AFAF", "#6666A0", "#FF0000", "#000080") %fourfold(UCB,mfrow=c(2,3), color=col) %@ \includegraphics[width=0.8\textwidth,trim=80 50 80 50]{fig/vcd-tut-fourfold1} \caption{Fourfold display for the \data{UCBAdmissions} data. Where the odds ratio differs significantly from 1.0, the confidence bands do not overlap, and the circle quadrants are shaded more intensely.} \label{fig:fourfold1} \end{center} \end{figure} Another \pkg{vcd} function, \codefun{cotabplot}, provides a more general approach to visualizing conditional associations in contingency tables, similar to trellis-like plots produced by \codefun{coplot} and lattice graphics. The \code{panel} argument supplies a function used to render each conditional subtable. The following gives a display (not shown) similar to \figref{fig:fourfold1}. <>= cotabplot(UCB, panel = cotab_fourfold) @ When we want to view the conditional probabilities of a response variable (e.g., \code{Admit}) in relation to several factors, an alternative visualization is a \codefun{doubledecker} plot. This plot is a specialized version of a mosaic plot, which highlights the levels of a response variable (plotted vertically) in relation to the factors (shown horizontally). The following call produces \figref{fig:doubledecker}, where we use indexing on the first factor (\code{Admit}) to make \code{Admitted} the highlighted level. In this plot, the association between \code{Admit} and \code{Gender} is shown where the heights of the highlighted conditional probabilities do not align. The excess of females admitted in Dept A stands out here. <>= doubledecker(Admit ~ Dept + Gender, data=UCBAdmissions[2:1,,]) @ \begin{figure}[htb] \begin{center} \includegraphics[width=0.9\textwidth]{fig/vcd-tut-doubledecker} \caption{Doubledecker display for the \data{UCBAdmissions} data. The heights of the highlighted bars show the conditional probabilities of \texttt{Admit}, given \texttt{Dept} and \texttt{Gender}.} \label{fig:doubledecker} \end{center} \end{figure} Finally, the there is a \codefun{plot} method for \code{oddsratio} objects. By default, it shows the 95\% confidence interval for the log odds ratio. \figref{fig:oddsratio} is produced by: <>= plot(lor, xlab="Department", ylab="Log Odds Ratio (Admit | Gender)") @ \setkeys{Gin}{width=0.5\textwidth} \begin{figure}[htb] \begin{center} <>= plot(lor, xlab="Department", ylab="Log Odds Ratio (Admit | Gender)") @ \caption{Log odds ratio plot for the \data{UCBAdmissions} data.} \label{fig:oddsratio} \end{center} \end{figure} \subsection[CMH tests: ordinal factors]{Cochran-Mantel-Haenszel tests for ordinal factors}\label{sec:CMH} The standard $\chi^2$ tests for association in a two-way table treat both table factors as nominal (unordered) categories. When one or both factors of a two-way table are quantitative or ordinal, more powerful tests of association may be obtaianed by taking ordinality into account, using row and or column scores to test for linear trends or differences in row or column means. More general versions of the CMH tests (Landis etal., 1978) are provided by assigning numeric scores to the row and/or column variables. For example, with two ordinal factors (assumed to be equally spaced), assigning integer scores, \code{1:R} and \code{1:C} tests the linear $\times$ linear component of association. This is statistically equivalent to the Pearson correlation between the integer-scored table variables, with $\chi^2 = (n-1) r^2$, with only 1 $df$ rather than $(R-1)\times(C-1)$ for the test of general association. When only one table variable is ordinal, these general CMH tests are analogous to an ANOVA, testing whether the row mean scores or column mean scores are equal, again consuming fewer $df$ than the test of general association. The \codefun{CMHtest} function in \pkg{vcdExtra} now calculates these various CMH tests for two possibly ordered factors, optionally stratified other factor(s). \Example Recall the $4 \times 4$ table, \code{JobSat} introduced in \secref{sec:creating}, <>= JobSat @ Treating the \code{satisfaction} levels as equally spaced, but using midpoints of the \code{income} categories as row scores gives the following results: <>= CMHtest(JobSat, rscores=c(7.5,20,32.5,60)) @ Note that with the relatively small cell frequencies, the test for general give no evidence for association. However, the the \code{cor} test for linear x linear association on 1 df is nearly significant. The \pkg{coin} contains the functions \verb|cmh_test()| and \verb|lbl_test()| for CMH tests of general association and linear x linear association respectively. \subsection{Measures of Association} There are a variety of statistical measures of \emph{strength} of association for contingency tables--- similar in spirit to $r$ or $r^2$ for continuous variables. With a large sample size, even a small degree of association can show a significant $\chi^2$, as in the example below for the \data{GSS} data. The \codefun{assocstats} function in \pkg{vcd} calculates the $\phi$ contingency coefficient, and Cramer's V for an $r \times c$ table. The input must be in table form, a two-way $r \times c$ table. It won't work with \data{GSS} in frequency form, but by now you should know how to convert. <>= assocstats(GSStab) @ For tables with ordinal variables, like \data{JobSat}, some people prefer the Goodman-Kruskal $\gamma$ statistic (\citet[\S 2.4.3]{vcd:Agresti:2002}) based on a comparison of concordant and discordant pairs of observations in the case-form equivalent of a two-way table. <>= GKgamma(JobSat) @ A web article by Richard Darlington, \url{http://www.psych.cornell.edu/Darlington/crosstab/TABLE0.HTM} gives further description of these and other measures of association. \subsection{Measures of Agreement} The \codefun{Kappa} function in the \pkg{vcd} package calculates Cohen's $\kappa$ and weighted $\kappa$ for a square two-way table with the same row and column categories \citep{Cohen:60}.% \footnote{ Don't confuse this with \codefun{kappa} in base \proglang{R} that computes something entirely different (the condition number of a matrix). } Normal-theory $z$-tests are obtained by dividing $\kappa$ by its asymptotic standard error (ASE). A \codefun{confint} method for \code{Kappa} objects provides confidence intervals. <>= (K <- Kappa(SexualFun)) confint(K) @ A visualization of agreement, both unweighted and weighted for degree of departure from exact agreement is provided by the \codefun{agreementplot} function. \figref{fig:agreesex} shows the agreementplot for the \data{SexualFun} data, produced as shown below. The Bangdiwala measures represent the proportion of the shaded areas of the diagonal rectangles, using weights $w_1$ for exact agreement, and $w_2$ for partial agreement one step from the main diagonal. <>= agree <- agreementplot(SexualFun, main="Is sex fun?") unlist(agree) @ %\setkeys{Gin}{width=0.5\textwidth} \begin{figure}[htb] \begin{center} %<>= %agree <- agreementplot(SexualFun, main="Is sex fun?") %agree %@ \includegraphics[width=0.4\textwidth,trim=50 25 50 25]{fig/vcd-tut-agreesex} \caption{Agreement plot for the \data{SexualFun} data.} \label{fig:agreesex} \end{center} \end{figure} In other examples, the agreement plot can help to show \emph{sources} of disagreement. For example, when the shaded boxes are above or below the diagonal (red) line, a lack of exact agreement can be attributed in part to different frequency of use of categories by the two raters-- lack of \emph{marginal homogeneity}. \subsection{Correspondence analysis} Use the \pkg{ca} package for correspondence analysis for visually exploring relationships between rows and columns in contingency tables. For an $r \times c$ table, the method provides a breakdown of the Pearson $\chi^2$ for association in up to $M = \min(r-1, c-1)$ dimensions, and finds scores for the row ($x_{im}$) and column ($y_{jm}$) categories such that the observations have the maximum possible correlations.% \footnote{ Related methods are the non-parametric CMH tests using assumed row/column scores (\secref{sec:CMH}), the analogous \codefun{glm} model-based methods (\secref{sec:CMH}), and the more general RC models which can be fit using \codefun{gnm}. Correspondence analysis differs in that it is a primarily descriptive/exploratory method (no significance tests), but is directly tied to informative graphic displays of the row/column categories. } Here, we carry out a simple correspondence analysis of the \data{HairEye} data. The printed results show that nearly 99\% of the association between hair color and eye color can be accounted for in 2 dimensions, of which the first dimension accounts for 90\%. <>= library(ca) ca(HairEye) @ The resulting \code{ca} object can be plotted just by running the \codefun{plot} method on the \code{ca} object, giving the result in \figref{fig:ca-haireye}. \codefun{plot.ca} does not allow labels for dimensions; these can be added with \codefun{title}. It can be seen that most of the association is accounted for by the ordering of both hair color and eye color along Dimension 1, a dark to light dimension. <>= plot(ca(HairEye), main="Hair Color and Eye Color") title(xlab="Dim 1 (89.4%)", ylab="Dim 2 (9.5%)") @ \setkeys{Gin}{width=0.7\textwidth} \begin{figure}[htb] \begin{center} <>= plot(ca(HairEye), main="Hair Color and Eye Color") title(xlab="Dim 1 (89.4%)", ylab="Dim 2 (9.5%)") @ \caption{Correspondence analysis plot for the \data{HairEye} data.} \label{fig:ca-haireye} \end{center} \end{figure} \section{Loglinear Models}\label{sec:loglin} You can use the \codefun{loglm} function in the \pkg{MASS} package to fit log-linear models. Equivalent models can also be fit (from a different perspective) as generalized linear models with the \codefun{glm} function using the \code{family='poisson'} argument, and the \pkg{gnm} package provides a wider range of generalized \emph{nonlinear} models, particularly for testing structured associations. The visualization methods for these models were originally developed for models fit using \codefun{loglm}, so this approach is emphasized here. Some extensions of these methods for models fit using \codefun{glm} and \codefun{gnm} are contained in the \pkg{vcdExtra} package and illustrated in \secref{sec:glm}. Assume we have a 3-way contingency table based on variables A, B, and C. The possible different forms of \loglin\ models for a 3-way table are shown in \tabref{tab:loglin-3way}. The \textbf{Model formula} column shows how to express each model for \codefun{loglm} in \proglang{R}.% \footnote{ For \codefun{glm}, or \codefun{gnm}, with the data in the form of a frequency data.frame, the same model is specified in the form \code{glm(Freq} $\sim$ \code{..., family="poisson")}, where \texttt{Freq} is the name of the cell frequency variable and \texttt{...} specifies the \textbf{Model formula}. } In the \textbf{Interpretation} column, the symbol ``$\perp$'' is to be read as ``is independent of,'' and ``$\given$'' means ``conditional on,'' or ``adjusting for,'' or just ``given''. \begin{table}[htb] \caption{Log-linear Models for Three-Way Tables}\label{tab:loglin-3way} \begin{center} \begin{tabular}{llll} \hline \textbf{Model} & \textbf{Model formula} & \textbf{Symbol}& \textbf{Interpretation} \\ \hline\hline Mutual independence & \verb|~A + B + C| & $[A][B][C]$ & $A \perp B \perp C$ \\ Joint independence & \verb|~A*B + C| & $[AB][C]$ & $(A \: B) \perp C$ \\ Conditional independence & \verb|~(A+B)*C| & $[AC][BC]$ & $(A \perp B) \given C$ \\ All two-way associations & \verb|~A*B + A*C + B*C| & $[AB][AC][BC]$ & homogeneous association \\ Saturated model & \verb|~A*B*C| & $[ABC]$ & 3-way association \\ \hline \end{tabular} \end{center} \end{table} For example, the formula \verb|~A + B + C| specifies the model of \emph{mutual independence} with no associations among the three factors. In standard notation for the expected frequencies $m_{ijk}$, this corresponds to \begin{equation*} \log ( m_{ijk} ) = \mu + \lambda_i^A + \lambda_j^B + \lambda_k^C \equiv \texttt{A + B + C} \end{equation*} The parameters $\lambda_i^A , \lambda_j^B$ and $\lambda_k^C$ pertain to the differences among the one-way marginal frequencies for the factors A, B and C. Similarly, the model of \emph{joint independence}, $(A \: B) \perp C$, allows an association between A and B, but specifies that C is independent of both of these and their combinations, \begin{equation*} \log ( m_{ijk} ) = \mu + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} \equiv \texttt{A * B + C} \end{equation*} where the parameters $\lambda_{ij}^{AB}$ pertain to the overall association between A and B (collapsing over C). In the literature or text books, you will often find these models expressed in shorthand symbolic notation, using brackets, \texttt{[ ]} to enclose the \emph{high-order terms} in the model. Thus, the joint independence model can be denoted \texttt{[AB][C]}, as shown in the \textbf{Symbol} column in \tabref{tab:loglin-3way}. Models of \emph{conditional independence} allow (and fit) two of the three possible two-way associations. There are three such models, depending on which variable is conditioned upon. For a given conditional independence model, e.g., \texttt{[AB][AC]}, the given variable is the one common to all terms, so this example has the interpretation $(B \perp C) \given A$. \subsection[Fitting with loglm()]{Fitting with \codefun{loglm}}\label{sec:loglm} For example, we can fit the model of mutual independence among hair color, eye color and sex in \data{HairEyeColor} as <>= library(MASS) ## Independence model of hair and eye color and sex. hec.1 <- loglm(~Hair+Eye+Sex, data=HairEyeColor) hec.1 @ Similarly, the models of conditional independence and joint independence are specified as <>= ## Conditional independence hec.2 <- loglm(~(Hair + Eye) * Sex, data=HairEyeColor) hec.2 @ <>= ## Joint independence model. hec.3 <- loglm(~Hair*Eye + Sex, data=HairEyeColor) hec.3 @ Note that printing the model gives a brief summary of the goodness of fit. A set of models can be compared using the \codefun{anova} function. <>= anova(hec.1, hec.2, hec.3) @ %Martin Theus and Stephan Lauer have written an excellent article on Visualizing %Loglinear Models, using mosaic plots. There is also great tutorial example by %Kevin Quinn on analyzing loglinear models via glm. \subsection[Fitting with glm() and gnm()]{Fitting with \codefun{glm} and \codefun{gnm}}\label{sec:glm} The \codefun{glm} approach, and extensions of this in the \pkg{gnm} package allows a much wider class of models for frequency data to be fit than can be handled by \codefun{loglm}. Of particular importance are models for ordinal factors and for square tables, where we can test more structured hypotheses about the patterns of association than are provided in the tests of general association under \codefun{loglm}. These are similar in spirit to the non-parametric CMH tests described in \secref{sec:CMH}. \Example The data \code{Mental} in the \pkg{vcdExtra} package gives a two-way table in frequency form classifying young people by their mental health status and parents' socioeconomic status (SES), where both of these variables are ordered factors. <>= str(Mental) xtabs(Freq ~ mental+ses, data=Mental) # display the frequency table @ Simple ways of handling ordinal variables involve assigning scores to the table categories, and the simplest cases are to use integer scores, either for the row variable (``column effects'' model), the column variable (``row effects'' model), or both (``uniform association'' model). <>= indep <- glm(Freq ~ mental + ses, family = poisson, data = Mental) # independence model @ To fit more parsimonious models than general association, we can define numeric scores for the row and column categories <>= # Use integer scores for rows/cols Cscore <- as.numeric(Mental$ses) Rscore <- as.numeric(Mental$mental) @ Then, the row effects model, the column effects model, and the uniform association model can be fit as follows: <>= # column effects model (ses) coleff <- glm(Freq ~ mental + ses + Rscore:ses, family = poisson, data = Mental) # row effects model (mental) roweff <- glm(Freq ~ mental + ses + mental:Cscore, family = poisson, data = Mental) # linear x linear association linlin <- glm(Freq ~ mental + ses + Rscore:Cscore, family = poisson, data = Mental) @ The \codefun{Summarize} in \pkg{vcdExtra} provides a nice, compact summary of the fit statistics for a set of models, collected into a \class{glmlist} object. Smaller is better for AIC and BIC. <>= # compare models using AIC, BIC, etc vcdExtra::LRstats(glmlist(indep, roweff, coleff, linlin)) @ For specific model comparisons, we can also carry out tests of \emph{nested} models with \codefun{anova} when those models are listed from smallest to largest. Here, there are two separate paths from the most restrictive (independence) model through the model of uniform association, to those that allow only one of row effects or column effects. <>= anova(indep, linlin, coleff, test="Chisq") anova(indep, linlin, roweff, test="Chisq") @ The model of linear by linear association seems best on all accounts. For comparison, one might try the CMH tests on these data: <>= CMHtest(xtabs(Freq~ses+mental, data=Mental)) @ \subsection{Non-linear terms} The strength of the \pkg{gnm} package is that it handles a wide variety of models that handle non-linear terms, where the parameters enter the model beyond a simple linear function. The simplest example is the Goodman RC(1) model, which allows a multiplicative term to account for the association of the table variables. In the notation of generalized linear models with a log link, this can be expressed as \begin{equation*} \log \mu_{ij} = \alpha_i + \beta_j + \gamma_{i} \delta_{j} \end{equation*} where the row-multiplicative effect parameters $\gamma_i$ and corresponding column parameters $\delta_j$ are estimated from the data.% \footnote{ This is similar in spirit to a correspondence analysis with a single dimension, but as a statistical model. } Similarly, the RC(2) model adds two multiplicative terms to the independence model, \begin{equation*} \log \mu_{ij} = \alpha_i + \beta_j + \gamma_{i1} \delta_{j1} + \gamma_{i2} \delta_{j2} \end{equation*} In the \pkg{gnm} package, these models may be fit using the \codefun{Mult} to specify the multiplicative term, and \codefun{instances} to specify several such terms. \Example For the \code{Mental} data, we fit the RC(1) and RC(2) models, and compare these with the independence model. <>= RC1 <- gnm(Freq ~ mental + ses + Mult(mental,ses), data=Mental, family=poisson, , verbose=FALSE) RC2 <- gnm(Freq ~ mental+ses + instances(Mult(mental,ses),2), data=Mental, family=poisson, verbose=FALSE) anova(indep, RC1, RC2, test="Chisq") @ \section{Mosaic plots}\label{sec:mosaic} Mosaic plots provide an ideal method both for visualizing contingency tables and for visualizing the fit--- or more importantly--- lack of fit of a \loglin\ model. For a two-way table, \codefun{mosaic} fits a model of independence, $[A][B]$ or \verb|~A+B| as an \proglang{R} formula. For $n$-way tables, \codefun{mosaic} can fit any \loglin\ model, and can also be used to plot a model fit with \codefun{loglm}. See \citet{vcd:Friendly:1994,vcd:Friendly:1999} for the statistical ideas behind these uses of mosaic displays in connection with \loglin\ models. The essential idea is to recursively sub-divide a unit square into rectangular ``tiles'' for the cells of the table, such that the are area of each tile is proportional to the cell frequency. For a given \loglin\ model, the tiles can then be shaded in various ways to reflect the residuals (lack of fit) for a given model. The pattern of residuals can then be used to suggest a better model or understand \emph{where} a given model fits or does not fit. \codefun{mosaic} provides a wide range of options for the directions of splitting, the specification of shading, labeling, spacing, legend and many other details. It is actually implemented as a special case of a more general class of displays for $n$-way tables called \code{strucplot}, including sieve diagrams, association plots, double-decker plots as well as mosaic plots. For details, see \code{help(strucplot)} and the ``See also'' links, and also \citet{vcd:Meyer+Zeileis+Hornik:2006b}, which is available as an \proglang{R} vignette via \code{vignette("strucplot", package="vcd")}. \figref{fig:arthritis}, showing the association between \code{Treatment} and \code{Improved} was produced with the following call to \codefun{mosaic}. <>= mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: [Treatment] [Improved]") @ Note that the residuals for the independence model were not large (as shown in the legend), yet the association between \code{Treatment} and \code{Improved} is highly significant. <>= summary(art) @ In contrast, one of the other shading schemes, from \citet{vcd:Friendly:1994} (use: \verb|gp = shading_Friendly|), uses fixed cutoffs of $\pm 2, \pm 4$, to shade cells which are \emph{individually} significant at approximately $\alpha = 0.05$ and $\alpha = 0.001$ levels, respectively. The right panel below uses \verb|gp = shading_Friendly|. \setkeys{Gin}{width=0.5\textwidth} <>= mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: gp = shading_max") @ <>= mosaic(art, gp = shading_Friendly, split_vertical = TRUE, main="Arthritis: gp = shading_Friendly") @ \subsection[Mosaics for loglinear models]{Mosaics for \loglin\ models}\label{sec:mosaic-llm} When you have fit a \loglin\ model using \codefun{loglm}, and saved the result (as a \code{loglm} object) the simplest way to display the results is to use the \codefun{plot} method for the \code{loglm} object. Calling \code{mosaic(loglm.object)} has the same result. In \secref{sec:loglm} above, we fit several different models to the \data{HairEyeColor} data. We can produce mosaic displays of each just by plotting them: <>= # mosaic plots, using plot.loglm() method plot(hec.1, main="model: [Hair][Eye][Sex]") plot(hec.2, main="model: [HairSex][EyeSex]") plot(hec.3, main="model: [HairEye][Sex]") @ \setkeys{Gin}{width=0.32\textwidth} <>= plot(hec.1, main="model: [Hair][Eye][Sex]") @ <>= plot(hec.2, main="model: [HairSex][EyeSex]") @ <>= plot(hec.3, main="model: [HairSex][EyeSex]") @ Alternatively, you can supply the model formula to \codefun{mosaic} with the \code{expected} argument. This is passed to \codefun{loglm}, which fits the model, and returns residuals used for shading in the plot. For example, here we examine the \data{TV2} constructed in \secref{sec:complex} above. The goal is to see how Network choice depends on (varies with) Day and Time. To do this: \begin{itemize} \item We fit a model of joint independence of \code{Network} on the combinations of \code{Day} and \code{Time}, with the model formula \verb|~Day:Time + Network|. \item To make the display more easily read, we place \code{Day} and \code{Time} on the vertical axis and \code{Network} on the horizontal, \item The \code{Time} values overlap on the right vertical axis, so we use \codefun{level} to abbreviate them. \codefun{mosaic} also supports a more sophisticated set of labeling functions. Instead of changing the data table, we could have used \verb|labeling_args = list(abbreviate = c(Time = 2))| for a similar effect. \end{itemize} The following call to \codefun{mosaic} produces \figref{fig:TV-mosaic}: <>= dimnames(TV2)$Time <- c("8", "9", "10") # re-level for mosaic display mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Network, legend=FALSE, gp=shading_Friendly) @ \setkeys{Gin}{width=0.75\textwidth} \begin{figure}[htb] \begin{center} <>= dimnames(TV2)$Time <- c("8", "9", "10") # re-level for mosaic display mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Network, legend=FALSE, gp=shading_Friendly) @ \caption{Mosaic plot for the \data{TV} data showing model of joint independence, \texttt{Day:Time + Network} .} \label{fig:TV-mosaic} \end{center} \end{figure} From this, it is easy to read from the display how network choice varies with day and time. For example, CBS dominates in all time slots on Monday; ABC and NBC dominate on Tuesday, particularly in the later time slots; Thursday is an NBC day, while on Friday, ABC gets the greatest share. In interpreting this mosaic and other plots, it is important to understand that associations included in the model---here, that between day and time---are \emph{not} shown in the shading of the cells, because they have been fitted (taken into account) in the \loglin\ model. For comparison, you might want to try fitting the model of homogeneous association. This allows all pairs of factors to be associated, but asserts that each pairwise association is the same across the levels of the remaining factor. The resulting plot displays the contributions to a 3-way association, but is not shown here. <>= mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Day:Network + Time:Network, legend=FALSE, gp=shading_Friendly) @ \subsection[Mosaics for glm() and gnm() models]{Mosaics for \codefun{glm} and \codefun{gnm} models}\label{sec:mosglm} The \pkg{vcdExtra} package provides an additional method, \codefun{mosaic.glm} for models fit with \codefun{glm} and \codefun{gnm}.% \footnote{ Models fit with \codefun{gnm} are of \code{class = c("gnm", "glm", "lm")}, so all \code{*.glm} methods apply, unless overridden in the \pkg{gnm} package. } These are not restricted to the Poisson family, but only apply to cases where the response variable is non-negative. \Example Here, we plot the independence and the linear-by-linear association model for the Mental health data from \secref{sec:glm}. These examples illustrate some of the options for labeling (variable names and residuals printed in cells). Note that the \code{formula} supplied to \codefun{mosaic} for \class{glm} objects refers to the order of factors displayed in the plot, not the model. <>= long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(indep, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, main="Mental health data: Independence") mosaic(linlin, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: Linear x Linear") @ \setkeys{Gin}{width=0.49\textwidth} <>= long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(indep, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, main="Mental health data: Independence") @ <>= long.labels <- list(set_varnames = c(mental="Mental Health Status", ses="Parent SES")) mosaic(linlin, ~ses+mental, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: Linear x Linear") @ The \pkg{gnm} package also fits a wide variety of models with nonlinear terms or terms for structured associations of table variables. In the following, we fit the RC(1) model \begin{equation*} \log ( m_{ij} ) = \mu + \lambda_i^A + \lambda_j^B + \phi \mu_i \nu_j \end{equation*} This is similar to the linear by linear model, except that the row effect parameters ($\mu_i$) and column parameters ($\nu_j$) are estimated from the data rather than given assigned equally-spaced values. The multiplicative terms are specified by the \codefun{Mult}. <>= Mental$mental <- C(Mental$mental, treatment) Mental$ses <- C(Mental$ses, treatment) RC1model <- gnm(Freq ~ mental + ses + Mult(mental, ses), family = poisson, data = Mental) mosaic(RC1model, residuals_type="rstandard", labeling_args = long.labels, labeling=labeling_residuals, suppress=1, gp=shading_Friendly, main="Mental health data: RC(1) model") @ Other forms of nonlinear terms are provided for the inverse of a predictor (\codefun{Inv}) and the exponential of a predictor (\codefun{Exp}). You should read \code{vignette("gnmOverview", package="gnm")} for further details. \subsection{Mosaic tips and techniques}\label{sec:tips} The \pkg{vcd} package implements an extremely general collection of graphical methods for $n$-way frequency tables within the strucplot framework, which includes mosaic plots (\codefun{mosaic}), as well as association plots (\codefun{assoc}), sieve diagrams (\codefun{sieve}), as well as tabular displays (\codefun{structable}). The graphical methods in \pkg{vcd} support a wide of options that control almost all of the details of the plots, but it is often difficult to determine what arguments you need to supply to achieve a given effect from the \code{help()}. As a first step, you should read the \code{vignette("strucplot")} in \pkg{vcd} to understand the overall structure of these plot methods. The notes below describe a few useful things that may not be obvious, or can be done in different ways. \subsubsection[Changing labels]{Changing the labels for variables and levels} With data in contingency table form or as a frequency data frame, it often happens that the variable names and/or the level values of the factors, while suitable for analysis, are less than adequate when used in mosaic plots and other strucplot displays. For example, we might prefer that a variable named \code{ses} appear as \code{"Socioeconomic Status"}, or a factor with levels \code{c("M", "F")} be labeled using \code{c("Male", "Female")} in a plot. Or, sometimes we start with a factor whose levels are fully spelled out (e.g., \code{c("strongly disagree", "disagree", "neutral", "agree", "strongly agree")}), only to find that the level labels overlap in graphic displays. The strucplot framework in \pkg{vcd} provides an extremely large variety of functions and options for controlling almost all details of text labels in mosaics and other plots. See \code{help(labelings)} for an overview. For example, in \secref{sec:ordered-factors} we showed how to rearrange the dimensions of the \code{UCBAdmissions} table, change the names of the table variables, and relabel the levels of one of the table variables. The code below changes the actual table for plotting purposes, but we pointed out that these changes can create other problems in analysis. <>= UCB <- aperm(UCBAdmissions, c(2, 1, 3)) names(dimnames(UCB)) <- c("Sex", "Admit?", "Department") dimnames(UCB)[[2]] <- c("Yes", "No") @ The same effects can be achieved \emph{without} modifying the data using the \verb|set_varnames| and \verb|set_labels| options in \codefun{mosaic} as follows: <>= vnames <- list(set_varnames = c(Admit="Admission", Gender="Sex", Dept="Department")) lnames <- list(Admit = c("Yes", "No"), Gender = c("Males", "Females"), Dept = LETTERS[1:6]) mosaic(UCBAdmissions, labeling_args=vnames, set_labels=lnames) @ In some cases, it may be sufficient to abbreviate (or clip, or rotate) level names to avoid overlap. For example, the statements below produce another version of \figref{fig:TV-mosaic} with days of the week abbreviated to their first three letters. Section 4 in the \code{vignette("strucplot")} provides many other examples. <>= dimnames(TV2)$Time <- c("8", "9", "10") # re-level for mosaic display mosaic(~ Day + Network + Time, data=TV2, expected=~Day:Time + Network, legend=FALSE, gp=shading_Friendly, labeling_args=list(abbreviate=c(Day=3)) ) @ %\subsubsection{Fitting complex models with glm() and gnm()} \section[Continuous predictors]{Continuous predictors}\label{sec:contin} When continuous predictors are available---and potentially important--- in explaining a categorical outcome, models for that outcome include: logistic regression (binary response), the proportional odds model (ordered polytomous response), multinomial (generalized) logistic regression. Many of these are special cases of the generalized linear model using the \code{"poisson"} or \code{"binomial"} family and their relatives. \subsection{Spine and conditional density plots}\label{sec:spine} I don't go into fitting such models here, but I would be remiss not to illustrate some visualizations in \pkg{vcd} that are helpful here. The first of these is the spine plot or spinogram \citep{vcd:Hummel:1996} (produced with \codefun{spine}). These are special cases of mosaic plots with specific spacing and shading to show how a categorical response varies with a continuous or categorical predictor. They are also a generalization of stacked bar plots where not the heights but the \emph{widths} of the bars corresponds to the relative frequencies of \code{x}. The heights of the bars then correspond to the conditional relative frequencies of {y} in every \code{x} group. \Example For the \data{Arthritis} data, we can see how \code{Improved} varies with \code{Age} as follows. \codefun{spine} takes a formula of the form \verb|y ~ x| with a single dependent factor and a single explanatory variable \code{x} (a numeric variable or a factor). The range of a numeric variable\code{x} is divided into intervals based on the \code{breaks} argument, and stacked bars are drawn to show the distribution of \code{y} as \code{x} varies. As shown below, the discrete table that is visualized is returned by the function. <>= (spine(Improved ~ Age, data = Arthritis, breaks = 3)) (spine(Improved ~ Age, data = Arthritis, breaks = "Scott")) @ \setkeys{Gin}{width=0.49\textwidth} <>= (spine(Improved ~ Age, data = Arthritis, breaks = 3)) @ <>= (spine(Improved ~ Age, data = Arthritis, breaks = "Scott")) @ The conditional density plot \citep{vcd:Hofmann+Theus} is a further generalization. This visualization technique is similar to spinograms, but uses a smoothing approach rather than discretizing the explanatory variable. As well, it uses the original \code{x} axis and not a distorted one. \setkeys{Gin}{width=0.6\textwidth} \begin{figure}[htb] \begin{center} <>= cdplot(Improved ~ Age, data = Arthritis) with(Arthritis, rug(jitter(Age), col="white", quiet=TRUE)) @ \caption{Conditional density plot for the \data{Arthritis} data showing the variation of Improved with Age.} \label{fig:cd-plot} \end{center} \end{figure} In such plots, it is useful to also see the distribution of the observations across the horizontal axis, e.g., with a \codefun{rug} plot. \figref{fig:cd-plot} uses \codefun{cdplot} from the \pkg{graphics} package rather than \verb|cd_plot()| from \pkg{vcd}, and is produced with <>= cdplot(Improved ~ Age, data = Arthritis) with(Arthritis, rug(jitter(Age), col="white", quiet=TRUE)) @ From \figref{fig:cd-plot} it can be easily seen that the proportion of patients reporting Some or Marked improvement increases with Age, but there are some peculiar bumps in the distribution. These may be real or artifactual, but they would be hard to see with most other visualization methods. When we switch from non-parametric data exploration to parametric statistical models, such effects are easily missed. \subsection[Model-based plots]{Model-based plots: effect plots and \pkg{ggplot2} plots}\label{sec:modelplots} The nonparametric conditional density plot uses smoothing methods to convey the distributions of the response variable, but displays that are simpler to interpret can often be obtained by plotting the predicted response from a parametric model. For complex \codefun{glm} models with interaction effects, the \pkg{effects} package provides the most useful displays, plotting the predicted values for a given term, averaging over other predictors not included in that term. I don't illustrate this here, but see \citet{effects:1,effects:2} and \code{help(package="effects")}. Here I just briefly illustrate the capabilities of the \pkg{ggplot2} package for model-smoothed plots of categorical responses in \codefun{glm} models. \Example The \data{Donner} data frame in \pkg{vcdExtra} gives details on the survival of 90 members of the Donner party, a group of people who attempted to migrate to California in 1846. They were trapped by an early blizzard on the eastern side of the Sierra Nevada mountains, and before they could be rescued, nearly half of the party had died. What factors affected who lived and who died? <>= data(Donner, package="vcdExtra") str(Donner) @ A potential model of interest is the logistic regression model for $Pr(survived)$, allowing separate fits for males and females as a function of \code{age}. The key to this is the \verb|stat_smooth()| function, using \code{method = "glm", method.args = list(family = binomial)}. The \verb|formula = y ~ x| specifies a linear fit on the logit scale (\figref{fig:donner3}, left) <>= # separate linear fits on age for M/F ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ x, alpha = 0.2, size=2, aes(fill = sex)) @ Alternatively, we can allow a quadratic relation with \code{age} by specifying \verb|formula = y ~ poly(x,2)| (\figref{fig:donner3}, right). <>= # separate quadratics ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ poly(x,2), alpha = 0.2, size=2, aes(fill = sex)) @ \setkeys{Gin}{width=0.49\textwidth} \begin{figure}[htb] \begin{center} <>= ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ x, alpha = 0.2, size=2, aes(fill = sex)) @ <>= # separate quadratics ggplot(Donner, aes(age, survived, color = sex)) + geom_point(position = position_jitter(height = 0.02, width = 0)) + stat_smooth(method = "glm", method.args = list(family = binomial), formula = y ~ poly(x,2), alpha = 0.2, size=2, aes(fill = sex)) @ \caption{Logistic regression plots for the \data{Donner} data showing survival vs. age, by sex. Left: linear logistic model; right: quadratic model} \label{fig:donner3} \end{center} \end{figure} These plots very nicely show (a) the fitted $Pr(survived)$ for males and females; (b) confidence bands around the smoothed model fits and (c) the individual observations by jittered points at 0 and 1 for those who died and survived, respectively. \bibliography{vcd,vcdExtra} \end{document} vcdExtra/inst/doc/vcd-tutorial.pdf0000644000176200001440000206001114202474402016663 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4904 /Filter /FlateDecode /N 92 /First 781 >> stream x\ks۸ |tB7tvqnn4k;NH.^ʥHQXvޑ%xp;,X$K SL)L[Rn%MeeK#q-OSᑡ$ ^LXE5bH[E}T*+/3H 3a:U th)i%3LfT{ CV(T &:LS0$LjЖ4\) Xc`1tA'dV2 М ˙((a25,2TH4 BHd- Kt 0ZR K lk -KBBЀSxcJ1*3SiMY[")C4S iSK3Zr(X1@ctj$2d#@ $ Oh I` edL,IP2L>3nUb(|[l+k0M֞ x%,3@/.M>Nel>\8']`_g篏٢\ 棛ehp[1(Q9.q8[NKb]lݯ򳑹_!]@Y ! ,4m=W_ }Yvzdi`2ṮWTkQuЗcE4**Ng%M(J W $W2\Up d2S T</, K"U</̙t@RjgӲbruQx Ecktr>,?V>?+dXٌh6MggX[ \61/J汎seOEYC|hD$5r<&_QwŠJp1hZ:%!st3&7nXܰ9@/~:5Nr?8Z8~8NvfI>FKVΗElM6_ۋg|x8~:̆ Su>'!2vz6mJ++|oFi+<룓[s2udS(KC;oƸ6t;DN/}?<E1n1D ?$>x"xIiA@x6d;w@K"0$cŴ inE< [,/h}#c%+J]FnI׹e r%me- %pA;9d:J^;LozB}h+» 䮳d dg  Ԓ& gR:r"j&;to=Et7xyjVVDTfNip8053^y8I]mk1s~_,:0m.~;0"p1 eU;Ʊd/b//q\|I`Qs`)p%f\@YY ?kՍJt,4-$W1&)H%SgM4B/Gl[b'-Gĺ+Gu9Sbe.]oM,׸t5WޤAvwxUPW7kTlً%b]B넴}))IPR|0Yb<"ҡ&8!h?HF e,Lf]Mjǣ Qwd'O)bu};6fwnN]͙o?};,Q3+q]O=xΖ͹# !~6"XhyfP+2gg7p3V/ѕz1d@r9RblZ7)rO^v5 X~9Im:+U]C ߃Oz[ԾzG8"0GC\Q_oœUXN|d->x ֶyE0żkbj8$]Nټ: R¬Y41-ښ2beDmAOĠǻWG޿n0`J hJgj[ߤzVkZSYtOt"O.Uӌ˴6ܕ."Pӓ݌Ժ)`Ip`EvlWyz;o`ԗ\E혳LJPkmi..zܯEvɭv9߲ʧ'ɣ~ [Y6ES.vX)l6'P2jޗHʿtJfigj'9 (E!^\KЖt ,Gɨa; 8c`%&f;O"7RHrBJHA*92dUD54:Oj2Ru7Ά͕VmۙsQ¢i\jp%:R0"2Hqp&ϗ+eSFJ񈒲בqek, Gg,~szT7p֟uY%~-@2re<<>Mn?'-^HepysDJXʎ F%:J]<[Ecj(ʬI⃶ߪI;]L Wg_Ssh;{Pҝa R6شhqK5ƌR6()uPvS#WAnMӓ\"o>[mr:Fj:a5rwt7t5j":c`%Fz;F64i P& MzhjNoU7YKUaG![%dEo!:tȰ֪5lGz@LGu (d:yXj)lO x8gW.^TGJpkiɈLJgUp "eL'dTSbrJA^>:N_kGyN Vg)%WD.5zs;/?b(GiTJZIqܾI`*V4>in+M]|=1>„ZTdjG&;|Xֿ²k#eR0>w5? >֐LxvÎ^lEzto ^Z>Alua՛|PPX&͠h̴NT?Yj˯??>Yl)bP*j;d7ߡi0Vp`UyVEе{&z/MwvNl+Fp?;;xDܜ>79nQ7\\mhl?Y=ոnM:^`i,so(O_>?:w雲;kMֽmkaڔQpPN ElpNO%K*3̏qعs=STݻxu  ^Cխρ߷=Olm۩l*~gxIToju}6y|vx ]B 2:NV^Hc.L!4, 2/@mI Ʃéd1b }FE;oM]l~&%r7E$?́4f;u$4e8%M;eJodtyY)'˥BµSԯTbn[\^ h3f>t|,[`fd%Ů)(+{Bm8} sB^|Tm y^j;?=$'T VFȩ")@̣XR;y4%$P֐E5Lendstream endobj 94 0 obj << /Subtype /XML /Type /Metadata /Length 1393 >> stream GPL Ghostscript 9.52 2022-02-14T10:45:04-05:00 2022-02-14T10:45:04-05:00 LaTeX with hyperref package endstream endobj 95 0 obj << /Type /ObjStm /Length 3011 /Filter /FlateDecode /N 92 /First 846 >> stream x[r}WcRoU[[%Zu${K4I)R&)A (AW1 fzO8:&XLZȌL"]`tILJG 2i"}t)iTG 4PPJ* (,5si,32qWYQXI$DB1,S(Hm)˜T1hϩ Q3hGȜuHhK%V\kD$вԖ$vHJ[̻҆HYH0P P|zcXԖ,xqHxiDdQ ȢI?V2lX4UmaA:.RdF @X@e2X~:KБ잀@s\B@zg^X6ٞrdFMsNH)IfG'@_H&" <@ =:2P.QQ] eRH)EA@ B%$8X*PpHQAP.H2 b_~dOs8?Fg[ bPq>̆Q=/n,<78@ l:<y~vJ9~)UK*W d2L;I=Ikӻ"imSG꠰)Kb[=Jb+[$=Ijk谏. =IU.wU}IR9(b]׏JT=Gy-tCU> z1%J0ϋ"+ޏ"Gd,BI"=Y#nADtUk> J#ޅړFD"j]lzA_U2-'i/%NB=.QthZ%h M_棋"?9?/!?C>^] y~u6_s~N#0_~'|Ϳ1>Mr>S^k8?_ įhzƿ7E^9WBy G|>&|q9sso7'oZX;#H3 gѧ>hJ?ZVo wӎ\Hr.woTW/^@nk1)h";iUnr e @R"@u(6웁E=tT?~ Quyyb>F6}73?aGFgnm5N~}w8po^@a e%:`FxZE'g  ZS&8kͰ {?cLgv5C\KɻMA;6өjj:tרۮ6-s;jhPZu^h],$]lv#]thF*\ku n;'Ϳ}`%_$^L,}m"j,/F/DJ2vo&gl>r05Q\)A! L C1ۊ2Co }Qȕ3Mgr}b|M.Y.1|#-7ghpr3S|EOs)ZD1^ {Vb/|iC|i3|*6"'\8G@ eu*Tel@2ᡘQGo.<&NuGU$H~|{*Tmxhd2*܏3-[BP(Ofm٨N^-ɞ_?h~`mP0a =`B@~"0` h/EЌNdΆ8ӹ, :-2Àwe O#M'3I4&0*S04Y9 *UJB&s>ef 1^gPm|L8"2S04 C]jȭ%rB|,KKB'҆c ]ݭ5+7{S#V/oaz=\A `kEיU&%c-|,d-m{ wbbDa*i&TOC"J&R-Q1 84--dCNt 3,&B(/Kn̡:ª R4cSu^.:'|F&LlQ}##~##2Nn9u~ҶP@J+p*^9{SŽͱ:5jvq쎁UF{PFjM J!-1X@",u`P#xS u4('\ϴĬ]ќa}uqWF wEj^F `1:+uM"anA$PPuɅ^'U!xAdTyCpfٗ pprW '7UytagO`<= `E7CUӖ(‰ |G*:'K7KGtƯxSӏ{g 8iAHf#BBnq9eӮ2z&_4t`b MfDʶHۙc<p_OT;]HIv+N 8Pζt15>Xy(@&k9Jnendstream endobj 188 0 obj << /Type /ObjStm /Length 2710 /Filter /FlateDecode /N 92 /First 844 >> stream xZko7[,!y\liw;&[*Oa)d${.g,YEqsFhh ^ ]ǂfXZՆmi`eBߋh6Jgn\CrMV{QgzQiVgdtF#>;@r2d\K 32]6#r6Z-&R醂NNG._e3/ p"gcl#%鳙He('97yQ/A}oH~2*,9Ny=+I ݈8} d5ȼB 9ia5(dF`@e_7ƫ|*~bv( Ԁ SWϻN:sZ3/Ѳny'gbFS tjukCS;P4-"t3&dU=ŨLOhmv_a lC!~!x/'S4x S}[Wd|46w!l=jA/InE,2P}i[ڞ{:֕guk:JJr}h\o1Hߗ?\Zڦm[ fSu7F;ԁuto }\-3S>W,{_C:CZQv2"˓CK=X]훈u-*N{v̮t7vu-@ޞ ;XSd$璕6lS19  CܷgO;䖇]|ѮZ4;3vR_rSV #o-m5>o;/$rw X@|N?XkD{bw9k_14_w C}:ߨ|hysvXJa$` +`$~$c"|)`΃{N^L>|a~op1٦s 稜"tό,3/ѕendstream endobj 281 0 obj << /Type /ObjStm /Length 3683 /Filter /FlateDecode /N 89 /First 819 >> stream x[[s۶~? I܁N3LrN[恑iSYT$qϷ ) e1e|!N '7WńѸj& ڜe1yϜLyg֢ ҡe((ƕF^3-:<ݲ;AǸϠeLf蔣Wq&r(2Lht/1>d8 nP@+Ϩ7~ԂT (9Z?V+0Gbop BrÔveKz1-2z311 ENDY0cBA2Їٌ ͬt0kCaD ^QrI1'nIΜt4@RJ K*朤g4sށ4s x+k" *p óLŒ[*A mPb,zWbfa z< s4p.] pi4T nHeP 4m!4hE:̹Ф\Qbqa ]"7 S 40f  Rɂx@.dB2*9~bquSźfcVtKH8$M8G,WxL-Q^;*"i%z$7XpWeJu@Yp1}Q8M<s3} Uy\bK~چ%nww|H"6^'Z" hUQ]`d8C XihxGͪ弸g}N Ӏws*ٲkx~kȬ/co f%{(6\G1[$"˾;qSz}N5!Yb# jB3<utt&Ŕd'DNeQrĄl%wU'.O_bw11d5- i}L>J﬎O^zY(|F #e|쾼{:)h>ZYZL"/l%owZ Y 8ljrbS"bZԲj3S>.ױg[GL:Lwk";o}=/ռ\T#{1dI%==J[:>_Afl^Ƣ!n@MS gvK9 W\ EY wloVuyTzDR'^ġ(5o{;5+Z-U=AIL5Bc.Uy#H1M t3ii;9|K-&Ibܣl1erثa$faC),}U]8 A!0Oep;[K/lltzg ?o.ͻDࢾ^SܮI;$~j\6 EVJ^h/~ =gq|UWרbgE͞<i^iEZt:CPUҗjͤhYueMtq8jz&^- 75-}И;M-'-!_z#zבIj7P>F-[b:D`\g#1L:"q|oRVjD6.1YX>b]~ ÏwۇzC rÏ+}P ҵy~LOCc,o`۶X]li1+㪯,?gϞgT 2~/k\]x܉Tړ62-+mz6?1խxvo/ѲYas0ko9nywS]jW0֮(zY +MkzW-:Xx_ ހ~I뼸*t,VeuDqׇfq~IӯŪHgl7ytd"26jZf"rw!j"c#/3Ҍ͔*x_ EޝS݈0Ga݄L?bIX\5oAwDp;"z^R|:!26aN}3xg<8xۆ]+K\˨f܆^fr;)n@;•qWTSƤ7Ut=PM]̋}Uxxh?-fD% e$%%6>nrWbQ]1?N_oўC亮?EJ.:+,}÷'GǦ*xWi%lpcrddBYҘIt)ĪD-h™}ē2P'}H&׷,6!uB ,R6)GO&IلVYba?bg\a?'ϒ>%|"g )S_鐂L'x.ѸrBEUKyP&D,pЮAYqMb(fAnJBg i I~BQ"Q SA%Fi\px :R]R3ā?ӄ>WA PRԄ+'E Y#;Rt<G qVߝ8"fKQ!Փac 1S >B%M*ԔČ-LB\ź/K^r3bY!\Qa a!Jp\Mመp'܅DT2:Lepf`a%C9.LiBGT4%`Qf?%큡7#hOseQAyڛ4d! dO2Cb]E .1|w+I;}ËW$z!Q?D@0=2 0!=?$-,)POx)>aoIV&#*>hM &N\u-%tdSN\W1ዛ6MNE[|#(QWy*m|fߖ6W66Ҷ4vmlҊ9Ks׫2lcY{U-,KǢE8iv&m f;rMF1aM=v,2xg軦ep@~ [\:ldXA:c \ f~,f 6BKrMK)عc:Sg)AypF$xIL5F,Ә: }'y }Ut>-# x|H>///eX7'΍+Icendstream endobj 371 0 obj << /Filter /FlateDecode /Length 6479 >> stream x]Ysq~gGCh}OknhZAr8~X.;ꪬF$fH9c:2;+J z忧o_ˏ.^ŋw/4uUsvo8­tnu|իYgkWo_?71 .ebZo9o6j֯S! 봾YP$&|/')OaI^LGk9!7͚m*Y?3̎Mm] M]ƺWL_?R9wD0.eǶ2vz-x6~*NFG. wB NWIru]獉α=0Q gN!5{@v<{Ǒi#ivp;_[8% RC6aM,dLsD;x[)mӍ 9bx3}&)"${CHɠmO$sJkbRJ'$AWBfsmBJCmNYրuqV~"9˽dUG pU|,CTH`\#Dbʸ6l"MhPa0q@-&"\lֶ@'Nmƥ^hKZ~3;'ޔW @Fcz&'D0zDrF XM`u<9˲HCʲþYКt@dzP!7l4D @ln%L jMhAx$;ǻ^^jlYO+?gjXo bZ֏' e͠l D7<4hIGӏ`̅:'I5Ǿ;%XSd3YmvsE"a捂{XIg^D{tǨ"@Tr[>Tż * 9rҁȣJ$qA]!t'Y9/, ȿo &I= "/MMY ~An86^Al` X͞Bb+cJ<-HV*u6\#!%8JN%%pG[(frl'$"Z9( +yG.rfOOZ}j[/`rR lTM\ӂ*{ Xg Y;O\d7B'}Ρ"-U<߭RC(4J`ڢSe7)}yP*#}Gj `51xCs_>(;_J Ⱦ*@rdtRԿpUSϷ'5Eqô-х/l}SC#4t @.hYw&Y])n|N-HK={EDr e}r۟P84Kb'鐼= 5~FYʂ2L5W5N& Nk&''#wOΝ\?trQ1ԉMK.̜wZ_+e;wOjFaC9&lm޽Aia&'_v1ݛ&#'Uפ~hT6v0l@XK"@#M膜 EJdqDh&$c0LR8 4)ݰ~g|ŚzcQn+@CP)zoV~{onEbaTbl dqyAfx'Pep@nJ|´D GT4z6Y?XiZI,>qLݵ/H&}7 gq /61 .% 7v"Uu^Dh0AYJJ l~h4;&Zǹ h BXklSN6| 3<Xa@_e0eTS:qetoT zd0$c:A=/`eƒncCmsNپg!KFDd|GWҜM)crU)4RkB!N%\"]0&JRUjaQ.dIm-euvQ[Xi{r{.+:FD0`RWa" FZy o4ppF NB<1>?M޲}Zc5tڠ鷏G&q#탳XS+Ұ2g2Oy Ɉk*ʟW Sp3-b6\m[GN"W(YXslRvC(ɦt9=,8"P,}S\_Ȏ`\a-tДأ;4ϟ6hw2Wfr]ο.mUl $(POp t=%'2`,# 枀A{RPDCI8o;%"|U֖A.A8IU'WFP~~7FRKh:SCܧM

BAȀ4f#س``2=eH@wJCKҔ&UkMWԗWtM=Mf\K׆יo>e'Me܌*u;d.Gܩ8B:Ʃf%u-|觾[3^c={E#aܿҵmA0w)S:SGLZ&5\ ׃K|9IקR|8,W'vmϲ ,씍ueC9緛zYϾZs{d|Q;;&R-W^"RirsYHgˏݝ Y],7h&U=ʄMVAMv?Y!dUXYJõ6Vz.j_&et2 #^o9IM)(|)VjSZK8NlM-66d| i$.Ig J4b=KfeQRO" .k6O+_"w4 a̳.0_[$.m銗11}Ff\ %ݟ山R5^LrN=?,Ch)#-A<1 骃dXЍ^HV:tVDg1=9fpFsd`g6Qʡ}ne /={t8%K%b2ьԮ-z_Ixt(h4|v$NGdn0B@՛ý(.V6rro@نg^|0ۋ|)3L'Ob oEoF4޽c;C/'c`waBXD&,Sy} WLiڦ z-;xf fyۈ~Es,)|/[8c/ƕF?"594OLNj%.\3zbD9F܌j焉dt&iʆH-ckg 6Pѿѯ|$l<Ձq+&ނ`LN(}UۅC&4X4YthM  -.\( =ɏ]g+@ QB1X#l|$G y9`ԅ?1`+4b? ,VgCWu^s9&='^AlpZ5 鴞g'ض\rgRMLk^ 7B ,۲d:ŠLKԝ^"4NNsebQr%9m{|y^.Pa#ɜi}i@ԆPS? TJ/O,3嘨qp`=6o~]MX <-񮊴#q.hݤ}“[r,jlMg|Y Ԡ+_?5t,RUAN+x}MjC]sI'/& 8"\ NtZfg8a'}{j<#g /739uӴBDt5(D50M"s feendstream endobj 372 0 obj << /Filter /FlateDecode /Length 7499 >> stream x]oGv?bpO *e@kvE ؋`xҚIѲ {ޫUupHIVOu{G~ZM#[M'}v};-VwG#]ſήW9V4׫GKbB+mը,_\}?|bdN~}<9pFnafxlL < k.&-=Z_ U3FݽG+nK(y=bjfsy&-ִ17,>p©jkw֙DNjqfJ4U"M_ U89I@QhIa9MܒUGR+4r݆(+ ;3Z{7)kþ1,cR 0 c/ ^ _|/G@\ur:ɓXm^ĩ$ db_T e"iZPnwG#ڃ6N PP66 48[5Mtl Tgm2QF]zkaa8:x4L16TA X 0n VCu Z>} ꟰հ @3-{ cZ &a\!m&O_^ D] +G䰆A-{QqTRc@B\趹)XXmWgE喩Bo)5 O\ͧzg%xB5%)Z"_'SCF"Xg5oeq_65bW fٽ+:vPfw8s/p~30Hs ,bwl ̢6[Uk IZ:ɷ%8kotZtW ;?/ -? >mJ>c 2 yЖ2 ԭے9'(;PBQw(8LX=6Еs>銵`ʸ mv CN:03RDx*Ő\ҍo= H?|>ĠIG eu=x m -Mɨ@'ykBX}l#eJO mr>$x`UA5ʭ{;WLiPGI u #|L&dx9XAt Z X /iu=#XOdh2E ,j|y!Z1ʟ|/6ͧ '$eyUWrBZPŧU |2(<\ jcxhIn+CGpQ9:O# dyW`{A\^\B95H(C \4ODcՈ(J|<0DMp1ÝU|D+ -< *wPooȐ(&^ą 6HLJ"QY07Lm5{Hw5uRc w>˔Ҙ;&A*We!Cgaae:\'PVdUa¯ 9(0t?f-TGeR"hH€ԣӮP"Ua.pal(+cS1 h'9|[bcKN &x!m]I-1~5QOs3G 9+u)/&3_9.{'Y)LķaMUUd؛#:0)%:(Scؕ R\"R@"chenZA!sD-#>C4InlciL|HQGtBTK1mt!Gr% >Ac8$?ATqv@B< 5v ez}1 p8p!$z6A2?4HS5^ޅ0U` _k[crq7CCr[I,lY Or" , K} *]>MxRRn2z3ىEq~Wsp΄ҍOem ; a؎:+׉8zK~,q8M " ŌRt,60ZmB@ܫ }epI'*oXY M&7Џ0+ !%5|J&#y!E6=bzѭ--uqwb(mܒ ^AsJ,OJ8`/5 7GKP+b}ֹ*rU8ԆR)5)K 2du~ҁ^B?ZGT`;bYhTb%βRblko[;ZGX=yO.~'dW#%*jZIBylUM\:Kck$`YraGtvN$ 4 09ˉ!$+a g(P uHEnl"yfxyI V cD k:+:}̉ 11*?"* dAG?Df#h Zһ_dla]ޓ`Y@b)YKZ@acvK|_b+My:S[lJ0 c|ش6 e=*b/ *ז% #,X_-(atXD`#y`fs23Y{fdD~CT Z)B +~ 4٩gJ֟D#yۀ64O["`ۆoK\&pP{^90VXgi1] ?i`*%rFhIZWj#xA䒏w"?=<4槻fKOݘ>,.y;n::ڝ7iA7Ӯ`|鴻ڣMg?" T zbЄl>FNI/+؂b!zRvGb B ߣ۩𝝆 F/w>Ҏ?YqSf9ܞL*,j%A%Xǜ/dp iegx!sav9vm) &>iT=J4 Nj4wlI,N MʂMpx4Vq-txFStȗ$+w#٨r"rw_0^p ?FqU %]}>1&Jrj)&M. /1X35zuٚ5>gF78:hUJp|;}y):|ztd`f}l6r].+3g/48 q?ߒ:KR:PX8/-EԐQJ'BMIηgPԔ.VyL$^R|WdȉXemI`ʼnjHIt˯:J!ݎY9_ z9\rRUeԸ. @ޏ-<7 ;lͻ;z4f;r(Ж̤[sF>++=\gǽ5ŀ&`!~^6)tɻ0e$-E3gJaX;2cI!;?߰TGZw,:Mup.1uqi4ޅnMͩwR[D;?)F8ٗc >oB^ +W§Jr󮏚dB,i;I |d0W+m(Oez9\Au~JEBGnLkZW$5"v(m""ժ_mwա *꧗b"=tr>Jz %Pן*FҔq>m&?(C&ruHN8@j1UXڣ!g*Wi_{ yCD*>37 5rmVƔ[=!|=堑R3dE'?vJi*rY_vjcBJQ~:>)>R+Vk6 S>eߘ]ju oAtܵwgV 07M+zsZECO5MQe/;SV~}iW1Y/g%sˢCpEʫ|'|->]cѫtA>bs1סwfàTss)“6*wqIGjP%:cc RBצ.6ɉ%rQY ȓ=jH; Iؿ@,@pd勹+I% df#KFW~i%z'A^uF7S&zǹ(\\z8 {&T8KqwPs n='sw q yٞopݲT"u>I}]=ơ5{r\e{.^m0Cl+\(9iĪ!vo3ub ^5 ufg/l%{O|s`uy|og< ل5&<4*lOK$Q{HT!O=2ꀥV=sX_[E`5f$eJYE+F)QiM6MxV枿 RC Wz']ߞ&ɉMQ&{H u7Tu[}HuqUݓ?@Fo$߅}| #yOsZ4ZDӋӪ]bJ:N|\e~rzE~@W4ri;49}Dr4ίPx2C0gʰ_rx?c.=}QUDh/- O>AzbAdwj0#130x9Dxiw"a,u.4\9GNwMd9CӾIqrL0fT`becig^c<.<>IO/BA8%f_8j,/ ~ kI/MF旺4R>zK}>},OH%Nxb0{3ۦ]<;sxNi{ӧ]4[aoμK:oCbǐ'k}U~Ic;.k iz^Ң $ cyQNnFz/ɂ^{x{)ŢE9> stream x[[o\~_h t7~ IskH(?WD*_rxvbK1A4s9ME'Wf"&2:.4v)7=z>ST)o.5=2?'hI&Nqv.;!ei=+:?=vcu:)T/'Ege!wWZUAΞLGeJQrց\:mIA3KKБvvP #;D.좵2 g1Dnui<+KQqiEi]֒nJRy^wrumҺt>G6ԕs֟뉿aGuʪlEi]Qו%I溴*^1rdȈЕϙ/Y2(M>+/K]X2Dz;o5/3|70-zzL$4^?ػ{O2+f{XGr.5r6U}ZYqSXE/^ƍnr[8Yʱw 1 _+7 e >Ia,tR+*+u>Hnjs93"ei= MqVRwZZ;@ŻeI;vvCfZ:+[rì¹g^g[Ħcfel;śfP".F&䇉#O_A.D-:k m z'qJW8jPn5ҖͫxV5HjyT"_=sB샦 (Э*qϲ 42e!T=yGO; ps}.6Ռ0?MeuPtvQ:E '71Ji:724 лgcԬ "Aaa-P /tb~c[4%/tkx&-$X<.|TC]&mI`qK8$8!T@l鴞3d I~fЎJ8=Tѩ84.Y<˚=p( k#pee^έdtnn-hR2Jil,LIoɜ7BhRR tFoSZNj,Bpu6kYE@x٤΅:="K mn< eΓT;€Af\5ާCH$ASjMx`i#@Y{N\]bQ}US`57ɢO\[/kF_s \b G(WO$`u9'Y:V\Us7(mjrFα,V;F.!_U<6Ã8v"lHxT]ajnǼ7YyaKr|eܷөE#yA2F8 nz,lll&?xo3)Ud@ Cn=iKڌh02%uw?,HFr+"³b/7EؚS c\PҪͿI*8.Fm]!*(~AndpYm|Ug9bהݿ-$6j9x}T2tR"Gal%k<+FD8nۤF (ց5X1;ROtEP?T:_)Dl`lHɌU_SNwiSmuQx"rs''F2{=eZx"3?yuCǮtzgM8D7z o*1~phzZFQ]{u+Ե/T'\${?m-d^ C qF&*Q}mO,Bv%Z \GE 2AN^W>leOV)-L6V&8.X& mL#̆=P;hMmCM(|mBUe9`vdߑ%̏$TcOuiCm-J,7O@r|.i:v[v\;TV1 wʽr\KrZՃV{MpRL*G-F0x{ҍwA~G =#W |pн=k!2Ӭd*?8I/ką~pA,-Dq* EJb D $4s*9@5 5ĭ?JcRpH?fۼSh憢~{3/3] '9=I7no21XnӷBZ[/:+? Y5JHrXsGFD '$0p)ڥ xxUd58_\,AFoT$K4צm-r.x@Yb~k>iMgywr2*NS*|*n)_\XJEbm̓6]v}4>Hhjy98kRO?@^R$\kIT 4$X ~/(5 ٬7ݿdDD}S҅6tF7p=' RzClPfmSw|іGG0OC0 Sty2bIblLѮKJtclAB[}Hjs]Q5vц{ې|85D4ɚzSh3慎 bYm'%> stream xZYo~'#Cf6@{&EYԊ<%K=Uu|u rWF6go3 ot^Fh+z-uf;c=A(lqnc1gƪY!:;%A @R؞yhfJR'^D:(y7e:S-:=ڡFAHPIK Y>ze w͇o~%~WA5(-!alH=Wڹfq:D썃^*,.g[е$x -9 :=wRpf#x͢@y8O4I}D8QLIe %N,U: ) ,#.x0a Ӏ4Lcx0agfK+d=O!<%MKD^^wI۬^/Nn3`! ߽i;Z(NqR.!%sT6 Px~ ƅlo 'V7͛Eǹ Z\77?]^]:btƷ0HCwj"-т^ zbFQFQ@G bCBkEZFfZ~3\z0<8Vc}/>]@@U7]Ar-LjnKrYzrLD_>^S4Sv\;dYZ^gB ƹ] mnn0 pHQznO{̅vUTʢW,톘w`iw7kߞ]G9P⤍ /T{N“MC~{^@xhG 8d̙9P@ZE>CI87d + BE rl;$i.%+ab$0}ڟHc"7C:w6/\XFGw)QlGY'rD4WYIyV2XnR(t-/Ӿi8ɍ(&л+CT xVf39s^5"^2#D' 9,q MȰ~{;[jC.B@Y8]ӛ,,æ8]ӷm{eJ\ *y9^}tq[9O`da#>EN"qcrحڳ%>z1e\g-0e&GAuC&6Q 2Qlj$j($*]m+z l#6C4GVmȆ(I]4LܘʻNħ-F yqV{&>z-#hFӆjvQ6cHZgcau|~^W[< 6B0 2aELǘ_HK_ÀcX.2K]ZlQ?Q~s1I:jG4q4U=8y< eNvI„)VlA"a #a"!_*Gj3VX{1ʛd]yۜ2 x  c9y/u*ܡM8T,eiEjVʪDD*D9~n ԰[zi&;Z |~W?7DHcSE\Ys0bU/ūeHS*\Ώ_ : %uUoDmN0"|qp1 gTMԮ25w)Lˍ0zҸ=~@O*O+ o+ oڂbPGsjp~g)Ο$%$UVb+V&Pe][*~"$' spc.u76X:GgݹJ~́}QaL3 =S&Ҁ@_o<2j#ؑ]$}Ǧ'.?gRXd:>nQ%C_5lu-z.{7~3ݱlSm8 ߊw2xt o&^|c(+xY#Uj%;YE迫HAysU GE+2/>yL>F]d5Cg,WgN~[SԗGIyHϋ1[Fo{ėq}s2F6 4 qgz'ȅUwm?9 > aendstream endobj 375 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2674 >> stream xViTSg1 "ԴPMP[lk]ڪv(ֺ%'*IޛȦ"}OUб9ch=jN3gK?f@1g';yy%l%Hh>3$I R?y9@_†Zl7pokP4tM&9W+FYrZ'/mڈ>C9wM^j´a 7^LG+Q'uHVWnKP+'`MHLѫu@mZ(cFK֧gDFc',LQ-TzFKmvRj_SR*L=#q< -ʢH.N9)E.!=%[*O32"gg$ɳDh1h nKFs ȀKcye CQYva>'ᬱ4:[`͖ E:!--Nh>v >/#kfM< (K#@TLGW巒?R][4{wR1W!R6|m?R3H0|h [T?mAl|q  MG[tr>~./9Vg7I8P 9pl 銮'tk**ba/ vFGKSNRYɶ^`W/,$f!A=T iXϡΞA`G;Vܱ'4#]6:hP9 A8 9 QUt*~6 9@+ ]P^_KAh!Ԭb z0w ǹҒ#$%޸u)`";<9u{,~jKo첞J5䰹-{7*<ǀ ݺorw\sPY,#_ Iȣ<ۏ]@f4 8c)t۬} X+k44n1G|̠x~`z,&Oa>ÓKhb_"m;khcĉ.^$u~\~_96z|%~ME9`R,:-ha~{1TOިL#_-k8 =lwrSV 9u8%،CMM f;FgiL* xxh`AۥJY%5(Sރ|Y"F_mbw8|Dnԛ;\:ժ&UY}zb+H#o.F!g}_2z~t(4,R$oޚA#4풢[ƏXs؇g p%-$8$"IBd*)g\"v#*E᪒#%&rY]mFKKm]Sc-<+"vhI)A~頋h+# Iw(|W{@~+< 0˕YWG{lW P2C"cwV ]ZD硺ao.-gBwǑ3E/򁨞}٢O pmK?⠓?c> 0Eo2gs$=BGR1~g"L=\44%Xd mU84ϤpvOUk;RpP4&¡7 =ѷrGv!bU[s8$FKtӅ[Ȼ{K9KV)1' 1Z{1E:E'DaoL2j.;;-q 5[_.Gd϶ a4 '# {/ZWkMug [a$ϱת+Ng5u9˸֎Z`oW-B^f=3D)DĉAoT!Y@FgK J܂ttYڄ\DwxZ8f[U$17GU֛븼"٬S%UkeQ9يzWgG+z\nw.endstream endobj 376 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4758 >> stream xX TTG}m{O@\_q| -(4ʢ싲6_7Ⱦ,Bh5DLB9FǙh4#,$sΜ9tnݺ~-c12srYs\ӿs12鏃r {u5 ]|b%`%+s=qs8Ea\& S9 r`ݜŋΰnEw@;P_P-耟whݔG̞1# dVPϛSgEms m7Yz۹yy2 3wE`ӑCBׄ u%k>[̘ܶ9ky__pKlb\ ff 3qc&3[mTf;3dV2'f&Ybܙlƙq`b0ky:f>:ld0Pf3khƆe,ygƌgVhP^`bv|~ Vr㹷I?XdQgd`ec>qHu7Ўa ;3QSG0ɥS%|y rr]'jqK̕ 9+J'pwF?ΛgCpRWr0R  8f32,?FF?spg8B$zY o6**_(1;x8v;OѺ3Έ;p]9zek&*!-L\viM %IdHOJCk(NKHx" Ž9數m:|Po ?mvKppGYŎ<+A_ FhF7^P3huxLq+[|xK⬇dΈY3}YYj^,:.WbC&:\TV+G,D0]]8n_۾a--W:G?_6MY;dx<~.م%{iiᔛ-F,$ h)Mp2#Y ԡ q*CQx(۫8<m/5D( x'p5)*-hSd0!6jdC5@ GpU߈H}J%A>5B4D,N|״B& e_XBjb'6cdC4ttguqiI'bӒsB 4jVl! jޢ;3gF*62)KlzHQvmed֒1ـ58 ;M$7J|ػ Q5uM\ѐ]Xq#sɼD|ćZ8v< *b'k̅Qw{.oO(%ggg} F΍W Akj4S*m|̡Bfrqj*z=S iSv~"S,s4G9cdQg`mT0פ^_w-\qiqiQY =q"uySq]8s7 ȵ`KAtRd+O0]G_U15IO̅pK(k0cneSK Y7M,Ӥ VN֪M<>AFa! +ХobJ8}WC*A|^WM!TV?w_9b(gB$$-0] ^㰺b-X;Fgѿt5N%K|ri4M=d )dy ME+ʁĒ>.1@e edns6>̍ށ5~|޻gDžu4ؑնR9I#GƝԸ0IQ+5ʰ7 Imr4.rNJ[nNUQB;^/ӕteyABWPԵ:-} (sѭN<*Tf@u6G[fSNY0 v;t~$hձɊֆ8暢L߬;WXpH=*XvKU\S|录7}H0 !cdC|Ў:}DGn `C;7']4\W;9υzєE*'!4xhH&+g{ş z&C< >-ܛ;ߏHRۀsmӲ{ғqO:kPhҩ=1.GQ[T^W#/x{|5.|Q_4\ky ?5/K;ˤݫL[ׂܿvxրTGbڏyL:iF'p>>qԗFA營#YnedCC\:?ѭóݯ=*(NJԪb]AT#%w@eL >-vݪOPX-J;`"CzBz/O?ozsf"kLt*BH{Sp?\&k3re?O1S LP|{r1-'r0RkE]QliSp\ѱTay +×yDQDm E]N#fWW^rSO]Y5%@%%2^wd6$P9FYW8/&ӕl{*{ M脬d)ޛГ@o>>@)P5/W_yW:٤=oczp=L.O˾q"?ђr\ApxT,ZZLS >fi-)LO~mSpt6=5AS됿\?P8Ҍe2ji}Ѕj<}2x}`Oizk===f?߆Cq}~92Fs f]:sLʄ{2Ŗ &~G5ޚ8m6UP6'U|C9S4i[M8 qtM&`C+87;Kڸ𸖥i>6Օs`7 33"I,@wjnmLx䵳V"#MV鎗HwE:sf|ʃn^oyJ$k"r*_+ogr! ~]@q!;mx#i[^xF%biۛ;K>fCaǙ$uMۻxg'f<(-Y >meJ!:+k?PVendstream endobj 377 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8354 >> stream xztSWºflʕ)C-b {\dKڒ{eƅ! %@Bk'6ɼ?{{߷eս%D W< ??D肵omC >lK- GY.ѡȹ% 2v3N4i[ng?U!n!䅏n!ᶣzЉξ<>36twz`=nBlW;ٚ9so4-v[EQv~ . ض(KBJY"lpUָ\{Fo{M9oc=ώ ?49jiӇ͘9t9aj8CQRS멑jMScMXj35B-S[jHm>>S%dj)J-Q+JjIfQ"8vS=(['5MR}(?#ʒR{K PT7ʆH  z zQH5Z0P/ZCX |}G,-ΊfJ21׶z_O ˆV֯[m~/l6}isn` Ae~1ƐCj\XUBK%'%$]d{|hC:nFG:<:*atl#jmvB~XJ6)W 'Eco÷D٫T}@SFhUVnʵ,Fr @ :'5rH] V5+Mk :]V`=" |KE|+yf uܮ BKЎ2XJnT>r}^*Cɋs8~v3j/6>uх^uvbķ~P->t5#qIJm %=j0Z!tW< ⻱HEh[8OvƦfbY ͧLtK#󐴗=`~<}dzobad"ez.<{ĒW $@{#/7 ?C=PCbbv'8:D-%pHwu`/u::m\6Q>sgR1>JU:Mdχn* c<e,@M!g= aYc @䎿ƛEukl p )$Ȟls&Nk /NoXfh5 & cd Sq xl,f5޲@hsHd4Ѡ%GB,9bvu[ OSNVɈy ՛+K1ߛD&d\K;I= Oݪ) 8=ҙtjd^?}X$=.NRFYLW;Ru b 瓙v.nIt AXW *?6M&o3r7dXja#,ɢvv($DB ; "H%a*`,e[JgٹGm>SFwa Dh.hǃd<_-k+Dآk3<°5B֯Iŗut!Tg* ;%:))6B2fׅafXHĐ \*F|X<pipLw0 V?A4u6%,>kD5h̀!|e! $E6=_f{ϐPQhg,7%:ϊX%A䏤gnjdo.y4@| }bQ7KL82ZES fNu4'_k@XdKEjXٖbD;h@ dekC%HXM(:IEZ R= xf8n:J Æ̑-yNg[>EᆐO W'ߏOy3=N})rU)q@b[Vs h:R҇q߽9j ґ7d/==:Gé3Iar!XIJq ]EgtgT"~RX)" 5P_f< ^`s.dBF-RR?']Q .0!2.&IjM03u+T˔E jU˚1k=ھnrYY֡\}U͹/e!ˍ$ 0= ]kBss!G]2.ȸ>,ک V3*Z7u1c`Cd8k,EC1 N~Q.̭|v=w?=>n^eDi ҋ]t<ы2 ddGCg{} Wcy(&[%O*LY_vPO%-pL]Q88h1 "S)bGb5"}r2E}JbDcI1^F+ H[+2d血)+ :6{tTgɯ%y6?6RǢg^Pyrr_aB+u{/oS'hׁըwVV(H+9c݁@%oGwʶ/'D1l^AyﴎfxDS5pK_ _RcR ^mATm}D]^6{BYŗu1ñYk0tT{ >mjxLns:QӉbOu#G$}e$tR5D{0C)Ꚙ6fPw(g2mf=ıWtac0ߍF&d_C *鎝i,wt 8ל:Tb_s4(cv9g\J~vEMasT0|DSJj1RB:5IJ_ZgƪUAz?BW@kPO6x6g_C}>݁9@oE|r 3躣T6 yh,@7,ʡr,My'%bؗem[,zGqi/ jv~\ܚ<>v4ȎA|J"_ X􋘻l,&j}->on Ŷ?ϔFJSڮ4-KNmHA%>Ҁ}PRM&R6dyEt&GޚW廞6WO>YiZN{v[Jy47̩Cg_p;@|,j#~Q7ҽ$0t(fօ3ĭ;Se%:oZ΁Z9n} =~Iղ3u$%Ʉ/6gy/nxS^ne4-?}ERr)<`uᡁOy32W&v . + *+"ԝd}v PaMlͶ#QyנqPD`,I0!z#jɿdƄ = #X^QJ6t1{AD͂7o* FoDyM_ nF>W>)!JU9wq,FKU4RʸpYSbҞ~'*{&cpdѱDeŖ|?2) f@`k3[$pi@9>4Ln/ tCyڮ ]yf&Bt%!m9{ZHKq dN^6(¶6ͫ\$Un$ȥ\)+X FgvU`.&m]'ܤ PT[TE.&557#{.ݾ޻}ҿH``ۡ$Ed54GEl-J_U:/4>FL#fxi(7'p;5:9%Kt^ )I9ȡZR\4OFs:~i[S6փizc)lks`25ZHc3eqIrn뒥 XeV'fsn^?uσ=ݏ&p̘VY}r| JYV|V&%;3ehܒaj~M?|%,>^?iR#?Ȉ ~d@g+m+QV1w#co|Nå'&+UrҠfvÆ J!8qM1C}/s8Uv:-M#0m_WgsW֜}؀ טյgarٜiYCUuW_̬';JxYlFɶ ¶._ :]DKڿEAhh1Ko&6(IDQ/)كZzzK&Ğ >3< 00NFFVdą+WIbcbW0ɩD=HTܛ5Tg륨 ӏ_GTxFJRQB^JuKrL-$5\SxC\f[cm :!NdID4Ђhv$Y+r[pX,$Ğ|-⾏gM'+AW][|^fbbdZmy.LZ|witis9d. `pɲ`5H<'28twqHX3Ҳp[lDkP#ON+@Y.n)<xb:*&OINzzpP$&o7 PF!Zq/_/U5:o('BF5<( h: cECNy\F~Rg|n G~{8=fy il2F@TB Yx~o]\ۥC$US\ZZf,?ݢM)7spG7&.jedqZ^A"S%isEu2s$ڗDg={ɠR'kv.  %nb/_Y\|rdBxFTE ?-C\^:~ "DКӂlT$DUh {#X>Y' Vߞ,5e Ndh8iqq I1Dђ5](շY P!]gn];] k`Aஉދq\='˒T_I w쁯,<3p.e(Fnf.a%\Kd+Ưu4}Ũ 7$t !D-me V d:rr=ɜ>&>wZoz"(sF FRkԔG~џӳ5' M-S6mamNSyxgT yv`ݸJ7b/il#EhE(7).*1a1 Vͨч&]BWIO=9n5aUFDq#riL:9V.I}"H V&B*Qq]&KB~1xb?& {G;Mz g?rp%YG3I{-v4f2v1h%wUWQvRxk1|}7`@!:ZGX~= G;Xk+LmʹN^XMt߫r*9$B Hw(I*I8H#w'ki)\vA{ WʈE&9=pGFaM,홸cD b~Mˎwӹ4ot_фpDyNvi%?Fchb+ksQ.S/؛pY=<8P"~uY N<[,K}Kv7ٕ{Vw]iaXea 1akĐA\~Kps!a3Mc"l b&Hw-ȼvrI=]DȹX ya O x0)y7ȤtV,k65E^\Cvu:!l@.d?~x= IDCd&ݱ7y2>ov]QGZ|>ԤQs&k C#~ogd̓_dܚȬ(gW m><{NW_$u#L\>5@4c]f_w0/w]zbWDT[Mb#a\`j-%GO_1;e%`f;3'wN'%y> stream x]yPSWeyZ SqIE(HXJAh,K1PŹbb7DK&Rvwq EԊV[z^z`tΜs{/I$X/ϩԋCrsyU$k4/L)d;>53ArG"I\ߤHI|K==$˕ uVZJ$2EPhl"WJRh6I25|"w:E%EYLjP!4U)J_PTjjIJP!ZAXO"XC^ćBF*‘("l 9)"#]IQ&9*DVwd=<̽VD&e;6N?ՠg.0KPYGA8=7Axrk |a̪D +NTLTf:.~}")x-gZR?jGrZ7۴M;u_x:,mػ- ?VܭC.P72kki1 8^Y1MivW- XbY *pj/=2 !2 نps&t@'+*PQ1k_ z3 T$GQAm^caBni*E1~%QW}=bD?9qVۡ'8IOha: LT%1LQ'a~!mgXdukc ̋׆ X B*1BF"(CFnNc(0r z}˶ d(|9Jq ;h,Yܐr*E|z~a]aasS6J#"> stream xYKs9Wta:.~p3; n09̰ KJUf`NRT}\^/7G_#]~]?H}&,NΏx^[>?:[.Uo\Ttg)d ohcN1muWdu,W>_ʐdcs g(m1 T e?gYMG)]$Y*9\%h-p'8jNݮnCk SA³36Րϻ׽}gɯòI΄09l5Y\k\͐qVT;+Oǣp k)D:.gRT84Vw'K)tBgK 7^k8DSqCD},QBwx4H4+4> a{[--U`Lm "n*\)'0QidtW +dB+=|U7Wv:_1 *Wٞ'n:qB/LQ@0k(b.V?8B=6M dUA#28SR;Xt/օsP. I X4 5 9=YX^lMo,wD4Cxk"'Xvj I!j(K.-|MrL+6";\NQV"yə/dd D_h!b((yD`F>r1V(d3׍8NG*@ ^M&WiDfu!})׹-9cR0iE3 *O;7$R"[$$1(A9a_3R)79oJ>t̝Bd'yZFSÔjA:&oNH-G:SUvbn~aJúhg(S0ܙ"72P)/u cTRۦPT{{\hvm`LxvZCe4CD)a`{J(#>.#%3IzK^=JF卣 j=MǵVDT4R^rc3pcxz ޴{`[ǔ6$cdnA4)9KA=gqDdqxje >5BSzRr L+C);)DF,\3Dhd!}dW[GLKKgbo͛_`Yp`ҹKߌ'(foGb\:\jy/)k' Hf$1j/iy2U1{A]'^dɇ3!4Vz'Oc [hS-u::co ΓWoMT]Ҕ56}+>Sy %lJu h10>̳CDu{CS򠕯#kd@r-ݯ_MqrQIF"E_xzȻQwFI=>0Q?4 G!Vr=fݵܮn輍ڨ? wFm>nx@TY!7r*G"Y u t˓?yϟ Uendstream endobj 380 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4869 >> stream x tS׵!NPHu%$   [AlY5kk=۲%36`fj0Cc2$4i&k3HZ& MҮKK#"&N X,֤u[v|Y塹CB?bg0I_‰Q?"i͏L|%aև03;ӑ~fuy~zFQ”EW\8eVƮI+$nI*HI*dӊJb>QT$X"hiRNҼ-2bw4/(vkRNZF? b䥦`mn: śDI%)[JSoKܙ;gɪ1#ď"I,$vqbXO,%+S&ib3b JDsYSGq j [x#gQq&M:J>N=%zG}Z}_˦pP15C;svjH@ ^g] F;Q7D]Aa4ԛ=X6}+<*Ph)݌_wټ7ь9H0DDr/Xn@'t;"^P$A 03Z$NQ ܎b8ѡK _h҇Ж!6*E68#M -ZחC1y%:"[jtJ XbcUp6}h" [?N,g"I8E gj_;2 ^kƨ=O,8Ttyw^G!; r?vic̿}yQ37=t(gZmKϊsw9!a0$B} 暬&;XIѩ4hAQNlm{$3Y3m>Pbn%h5jP=jfg\E4-&}tm z|mȱ=S5r"fw-;U(5\UJj$q6nx@tcxx vV]hԟ|xx?SBoqg%siAo$JL5 7)UB*7ZWF3gL 9`29JEq h<'q6hziBZRjGod4}PB)R2ouqq,V~q->q"o͎=W.2K|v9 u0u⢼҃[@MvQ1_ӝljܭLPY:^T?|fr T̗uiK$ C?/4>dj:[9 |D8hI H*ɩcA4t`P 4(rSwӀ\7؄z\ !ݸ66䳇Ѽ:}v=!, ZWe2Uspjy:X RR _ߣu{̽C;¶~} na .e8FQ1d+M&d%Ƚc.S} =o{q DU 0>`n77옷_/q=;w|?.ΪΚ{oKc g =lWemYx B5h0[%LR퓾zoƟU] iʵ_c3a5ADO?S2͸xxϩUm,'!TQAU?nCCqj0TR467z$vo}-ʇh[eSyT:Q.yRW 䮂g;1d2˙>_>rz(u9WlpR%F̉ |(Z;J M`VҸ\.o8,*[vH+v'֓|޷?}XFóc>Gy)RpA6fMgfɌ`0I3z{㖍kj2Jn/g,#(gnjM*S9fULv jYX2>-.۝z J@4:=6wy*S`x%Ehܢ&ϏY> +١3!4ư47C 5J`F`~CًRkZFV^dhFvm9Z؛^X`PfB4 .FЩՆrQQ| >>xF98"PQB]Ƒ@Yy*ocdX_2}7.xoWP5P]Rn'4-(;, s{_t[&`g6T!48 '8tIݓL!ҩc9{B Q&wedT: )4C%3S,;?k./0ӗGGbx8R&.7[D<foÑoy ԹrzS񭋽^޷9P u!e_^."7F@q: k}XƘd0 8r%H(( 1AW>IC^VfNf~mi#J 6JYEբ`[Qko<>A Fء7 yw|WqN͈VQ;>9׋ @uIV,1:~11))簘*NVc;B2RN;ZvV;*ZbyD_WAزF_۩x桬E/I)|]Jwшw"{Y4҄ uY7ˁ;'lD+5ތBRFS͊BVu"kYecE¬=|tՀ{B<\0II)S)WOsMF[#endstream endobj 381 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7159 >> stream xY\Sxy* jߣZGZwZW:p+ #}Ya ‰#qjVڪ<{!@ws||ύ2CD"B'gɓN}̒q[Ղo-*3_:Y!KᣚDD! ä^2;޵3wwm?a{.]ߟ49rԨig|0sĬPj5ZIͦޡVQhj 5rRkwu8j=5@-&P{&j5L-ާPRj @Mi2j:A9QP+MEqCT_ʎGPj.5GYQA`ʚJI7(WޤP6-eF QZMʜ ^"D|Ч,Bc, aD\c0-7_sk=@>_L1%Mf;^uWwu 8тkÆX-xzON^!6X*`X !0DE4Eܣ9<\!u@!{nw'{q}h#<"9 RXtkS.SGaYrg^^Rplͺw`89̃zӯ}8xCkllȞNId'IQZjH)eeYLiDžh?S۴篋2։LH\5HAbl*yɣ ݵ{Җ5w\RyrAblj#14k8ZO=)l+aA-ZpgF'-3{P0͗e*3Uѵ&eshRW$ٸčl?-?J͇ \>C*,4ϼO"m4Cis8{;ʑ;-4KsZ+C\t7ex:1Y5{˫O{kAMRjJmCπg={jb}41Қ.+yOwa땢EJ>sО&G$`~K= I}Lr`1Tbdd<4ъ@3aKs\OcEpǢkAzV*T@!E+KHlK{A p0vs"=cV"~3粲Q)SPKe!>?`Jր̴R!Lت7YC Fa_.)P)4:6X)($XLHJ%˙4z=h5(#R~\K#Ky@yښӋ3+t:{} _^ Q ,ͪdz?YDk}NB>Ml}.nٙ݇^JlreE „BTss3U߂ DJqkXHVܪ]%%Qg2foRpo*Z㫸5Tm*Q'Xѕ*F%rǕO{I)pCP|L% K â]q/NС|׸̜\zJg#NA(j&'231L}I0yB@: ;S^PՈ{gmZXҺUKVtNđs` @-@/C?HC6 @1[]Gǒm:#zc'C@pupq.;I5'OjG ]]xAq%΅[N+Z6fMPԋLz3P%@x9jv6J/}">unQ<[R*TOc* EG˛΢1)jB*̘TJd'#y}ٸS:'UT^k-reH6q%ir0HJOLꦸuC3acKwxMR/W)C/&ASjI&ݤYy˪IB}Z* ݼt7-9yhFPBrD~>e~{s}M'z/Or㪸FYЛ[X%ľG. e =lx O?<RC*BB*C++n>}J_/ ul}r4Ym圀MYu;8Ciiei>*UMy?m_17q(~ 0rFtv[{3:n{ W򞯊 )HTK6/)/޼ЅlK9|LzDzG!]x.b K#f{4 GAD R2PS/+ QNH1ԀZyM/5V]&iX}x^ݕ ~Qm5/FSKئWveq-[,߽5 :TZzYk} d"a(Ga1~=B{'C%*wR;L?$q Q;ȽވA~O˴!L (QsLvůHX@xe lJSUPi(x[$'"QvZEc#QNTg{Vf6|ufY:@Z,8,=5GZrjݬqf;hv.jnko{Ā/Y$# $8965 %*J#*sʉo`oﺸq㮕-+OlxV9RQWXXZ.{wgM͉}f9XXTTU0mU-j&x#؂\TT) #Rw%F#-ʍOﰻMq\f6K+ *Ȼ9<>d9Xu>Lp'lܼHP.O`[oD&OZH ӄBo/vl TsQ) lbPV,~kcZ6O?*/߁2/%=1h_LBYeѥyyfi^E`%ZˢB<蛭`=< '$u?ކmplrF̂;kH+S*OZcO&YtS - 4"}@dۛTGj4UeII*x~<ى4 qv)>%.o[ۂ#MG$d0JtR<6)26> E2*yMlӯ&TX]7,l(X.u uQyIYt^j:/-xOP1Pm srʲPZQj yy;dqKE V(H,"A脨D$MF8t35(!={ОRkԾIVJ=h8eb_U^Luˑzn\.uBP@S0.D͞3#q4׳Yx$ڝ]w|{T99&Q{vwp0)m' 7lnHYFoнI:ID)DJ%6(IRr/_(@*d[ߔSӅj,"lwZwƠ}5w1ǐ 35/ejaҊ)MG(C"9K" + WWzP۸`t}S} RbFiyRIAվ#\Ib2i{(^c{Q<)JP8}tf_`_q_8_>pߜY3vǔ(.+9v|9bśV98K/$t| fm<:^9cśx(ŊS2ݻop }#g$;tՊ5'[pD -,ILJL"@EF5^(D!(((-PerbO(u^TK% [PZZpmf B$vs)'e1N@5>\/.FIiQrɰ gm餇X.olYO䚰=Ր`N0$k*_ :G8~ !mFb0fϧs%m!-0/AٱkA#[ ot{d'Drym81CIX0_~,ځpa=Z;|uD;[TU*U OzB'-G外M~Yj?a.4BVtDw"Ӱ=^(wsYYA -,^TgdbF!tbi (xY -l%9J]ttۉ/߼~K_pYB"[Qw0xGcZBeLu:H*)_olE,DBL7IbI?HFˎd;Yu~pz.E( %eE8yꙜ?_4\i'peYǷn8 gQ]e˲fD8R^yJ2yG֙7ֻQM)O +N}ր:F_g`xOIe"WQC:Mua7q|E]D-Q S0Ǘn:ݧ:q@{>30@X h#XZZ,Prendstream endobj 382 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3950 >> stream xW PT׶mC߫"*E8KpHQ[$̠ҽAAqe+N!bT|/晧11OfWW:>}k1( v"iv >%ͯݫG0-l%X(¬=+W+=a b EHda~6mm͞=kt;6 |=m=#}<#٬ 0?"bSFGGO 7vMt@ooXCHp _8$h{dosoX00cCo s4+w͟b7mf}4aV21jƅYÌg2W}f=Yld0S{Ɓqd22NLƙY0fae20f1cU}T)*h쐹-X[<8 e}4CN PE['W4QZKڣ%eQqjuq|SFsp->8GEΩ9Gۚ+#L'"|&m-Yg'^4b%1-MqG<7{To1B-\c鄙U߽Q.v's^UǎUן[wln 9n?T’s p#$e9|ϏdzF694C{XzGBQjja,A~7UV_kJ,\+vm}>NZ \+aMګ!7pAd !Eۋv)wwq.cݫ- #Co5RSap! pXCtCkY(k?* ̜{פ%_xAORGk ;-s7105V--I#Yd찉8(+A H %Ob'N]ӌ N?.%XaGn[=O%킹-iۺhW-&?!cEu"ev3#5SE2^kC}``>r&勒Xg姿:\G -G7A Ktʞ"7:.]'ggC w", $8M+GKy?&Z#Ocwj {}e& iXX?SeXvw|SU/p|w)HK; ZM8'rE|y{qIVfW?l7Z}zVVa}dܨd$$@3NUsxՌcΧXq WԉJ`2%Oǯ[qJًv8Rrkiq=a1d0}7,8;;SĨM.NtHZO'*,'*/$nT`_dpʫ䅃F? d%29}d,!.>)b8U ~-sm I)nF􏯍`U/]p?|Kl3DbіyC ;wH<~ؐצj! +((,+Q9N.y/;f\{"*ڗmQ .cc}EQsk_txեš+a"RKջga8BWU糎K,6~~^kB:S?mwQxvU'ڑ~ Q?ٕ'L.+mF8gcY:WQhn65cdueS鼖![8y:OVzgMGNik}͟[ʏrlw^T4JL=F5ݳ}")*sttJKt%>Yh$L„E3!Ĉn':~"Z?eh&hVuq\`=_ QoAەy-y 1v7lOM%p9GmF퍑QqPރv㤯M]`yxrmIQީ#pC8V"\lɝU% ^(lk;=igt28_eY&_'|[54 &tNq픘'7ߍo1QoOuDRH$NГL D`M[g'hvgnIh)t/ #a6,E4 BS"5)pW/JrB㵐(sQEkT]'mNIj|kUmXIԁtZIсcaFlWr|IgJ;rU^{}`diNŕU՗>y(.C8VVk~_G%"L^R^uܽzhJln2:Eju6*'>6 *jm40vtV{owt%xڃSz/y1G8Ȫ}t(* _p4˙8XqMbȏ\0PC> stream xkLSgO)֣K:95s^%c:[F y2*tRZ K mEZZJ- (UGv*Lq[e~X2,s~X[[<~؁[/¶`Sa +p,qof¬X 4-ܠv_IW !aí7 F=8L,;HXC{:Ut32m PIMTVcMx>6vUO8rx/N+?09 R1$q/ whCf@+ۉLN^.-xwrMcH;N /䆑~b9l:D"Oy .`l6%I[&֏m1pD`~y){?0^>̳ii=x+OG- /},2si\;NţB3LlO 8Sìc{ 9!Ò9 $a4ϳ&0дB}R-h lRdh\- ,ܙF9wXkYA D@hU(s+㩫aOj*6qyz"ytL-$R-ereK{!Ge*)wNtՓ2u1U9ȷA+0̱FFTvčx8HDI]њPC=h} 'a>O T@&8(a.&}tq*Q”0YZ ;=N,-,Tiި{' ARlr.6vBa+VءgYs?ׅ$vxLger,bu&^8c?endstream endobj 384 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 922 >> stream xUQmL[e~o۵V;gҥc$,1FSV4A>k]n/\.QhW J?h&ljLt64FCM̏{"vļ{Ns`@!MΚ[ge|nuĮ2%0iF5 ߏBЅPbh~8d jꞯ$#^QB S6X)#3#GX"m*}楊J2IECT3 FTf9P4arQ:7h"(ɾ7NvRv iz?p*ʆ6 `d@ NcnI oI+ ~dVDU˅&^ s97ו#dL_6LVBKJ7+!Y1mdgM "=B9ّt}g҃9rC|i? @4CY~\ j̅h$Mp*EQw` DIF}4 C0{c^%&Vwa-+0UeYrn\, .;Z$<-QЫloUq`6[&)gAѲNF]csSA/4Ox|LjQ2gj D|6Qt,%8Gan6P lcԆHR8r1 :ፍy''=\˿.£ylmW(Pe;.ܺd[՟l4KgcW>mW2cOmQ5R;4; of1=b܄gxww[;GoOn&h}x/.E#(45/(a^)L{{=4iFئendstream endobj 385 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7150 >> stream xy\SW1k^%jEwuoq:6 $$B&!0 nm֪UVZ=c?I&{A>B9>Νu+6l0n ԉ{$_F'zϊ+z|нsà>po/I4 D1#B'L>ut㧇KMON ]H ]/I͔:cܸcEqGIȌ];t(%3tUtrl#S>e(95+36=thwlz AkmY0mQ%KeGD/Z!Y{U=k%߻!qcɛΜ5{#9flԸ'8yiCx 0b 1xXK %zbNl$F/#M(b31Ml!cBb,XD#%b)DD/ˉ b J"$<,ѕ%!3ijlѓK"z}H/ED??B >1L $:J'e^4S5(_o99qJ._bd{l|8MkdĠMU$_xbތp? ޠ>zq8U4M޲ٲ}A8;܆a>O~c&]!b8tK|m4<uGO~ { cEK<֧aa6s2l>5t6⠋@>P'cWE:RR+e] GrA (ϰ?ޥ9d+\.g*<\NM7@9 sr ELJ.Jطb;X4Bs؝!_žʕLr5e_LhYaV.4|"Jq~IoM9(,kEzPI G7-@ĄSbQGj8vp$Wul4͢ޫoI׊&АIh2ˎ&}]si 聉ZYT#w%[#ꁺb`oꩣJ6 ^T|_ر$[ԍz]ʥ*|͆=<<a?RWb*ݭ.k2U_ vlAhT%&ie;ԏlQ!5YEʨ*vjM26݈W*A@}c@o29:"Y+M/f!1\MS<,џQs}L*wY@>j 5j18z`2l@R@E4kl(5/QS̠d;+~|c\"T{{`-б5/)NY>=^~IiK(Hy g+z+^&;@fdswZXF4`mP.`jr/!@q^/(jŤO/=(<83r#wIFt*O}w" kɫdj279ĿwBz_?c1u-G(āC&5@^vxNg?t)@΢棖DSGG} {6g]K|jP \_4Ww[7ֈ7%*LJ kL+ŮHIg)iшfeæSL wZS4VHj8h8T/> F S9] J*Ԧ1_X7lL{l,*AU'`1p5@s(aQ}dLp18K'HףB_[@;>|ςڧ FɂBʟTއ=/G5,#d?za SƝVܴjM9+/N78i`yXkW`[}aED_=ԸUZY_|-<ŷk`uC+5ujn j Z@~QΩJٮ{:\lSY,:/nb+/>'<\YV)؝Y;5c`o8ZuzP ȥ`Z"=d 8Lb99m(=9A 7>BB6)'T7>DS̐)keԼʪ\ՏXzCmor"4&Wls̱$,{MݨV*2v{ r@~ S@ZS*.XZ %l naPyAa> 3jx8yjεhvR e%~?]uR伪=ͫ4Q:4փXJ*󄒠-*z펓!}~jI8p+hɣ՗'xpґ8u~1s)8?=(6净J:<|û}bwt| n[B3AAfB5Źlڮmh@}G<]q~2@+bU_\s9 } 7FW(&0a H Ra$^/i{J =xl|.uT=lϋ؋C!NL'K~OPԕ4vSu`Lr8rgF,y㨰@MA-G=Wx V^Na/ ;t}MԉE0)14I\^1+VgGr{0KJm汶KmkHev;4=un.Q YJԜW]i\T RÁrG6EFTϚ̍+5{SHF/xmsuKG7{׈2Eify`Qh u揽CCn q¾LV&uxm7n~q:Qu6۔ڠ)~//5yMV^0)u; f`eR Z&o6U1.*O ߋo/cSŦz9ɪ2$92Ago@Ŕ3pn7I]G(Dc->Fށ;"V߭ƚ~r ДJ>9c8_0C˦.^[vX /OouKȿ]AA/n lw4GQעl!b@c"mHupx*lf`79݊Aa<e7w;Мוa|Ibڝo;M?aA2gpVʩc%]@6V viwkw|ߚHEV e57 {ޟ X. I.Pݴ p.`3q>wϞtI9⡥*%.ʋ¿@%jWia(I>sٓ=xOtrSbc ; Gn1mq[¡s'?g?ѥm= ɼxꭓOhՎ$y ROZZ Ae؈N]NGv @+ T fUW،oNw%+s܍4(/mCoa''| dbYA9(teŠ246O:7i9 PP{ 1]ݗueTRD\&E޹&B;"̦{T]1pu&-UU59;F nv%gV4569 vb םU_WU9C2 u K"*ȨBsNA脳1^w܀jot8K RղRU)-0`1 %Ō^0+7G"?AU -TŵvIo``KYȰ s &37[Om!-fLVՕ.Eiff0\|yWtIkyuX| \D^b guռ>p,{5Cfܒ-F 0Rf;ppJrl7ug`o~=-ZMR*CKsܯ7yEtxδĸw 5~Xp$&@ciА:xp\,֕^ Ç/- ɱ5Zy-{ջɸ4ռ׹Z>%dv/6Q$ר@Jv 󸅻wy5sѐ^yC5C(p D_v+\+ ȱhe_0 +ٹE G[겵 RXria?"m[P6+8C*脒\oK_mM@GhH}-휫x22u^^[训j3S{ԡwsSr1D+REq!fQ?|X vAPTJc3{/ށ1\o_xa o&coC3k\0oaozCtz>7+ ԹPW4jEuU͎b+3:N@?;%{gl '5Y]pP}b#89΃>]$"%#J@e-UV%`O01+S $LRiX&:4XJi3h^p]qGYtP4 u "2 L^y@@CeAĒ&֓kO08kXjvњYMNf5%j]FƼvP73| k])զl & { q#,5J=/@>5-}:\U9;tJk^9eB4PTFX{}|VoHeD"bn(`z|0V/k `"]F5&DƣjU!w\F0\ ~v[d4M%t YD$MFo(ziHJ<5+ޢ\; >>ZtuBF|i{Zff0b |t3y-uϜ8ٍQQkl;wyOw楻w:žO!| .P 6`*w:&mZZotL ̄;*3/@32lлѠ^A 6ف'hZؾRE8 ΀-2uA8>8HVS /_̺;}Sk:5F+_hupH58Wc^CႷ/$,+ +9i,كӃ?OFp Pmޞ.b=X}[\="{2Ms{sΐa|&%+S)%)l>ixcp;cn6V{AMS3ZFo]uY VY n$ yw)FCy!˕N|o-%S,“8 j1UjةU禖Sfp+J)je`ͺ eTE)*\$Xx܍yDԽ+A^#endstream endobj 386 0 obj << /Filter /FlateDecode /Length 150 >> stream x313T0P04W0#S#C.=C(ɹ\ `1#S a"rN\ %E\ \@U\N \.@3c݀}o]s~Nin^ڎzqu ,#endstream endobj 387 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 ZuA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3鼯=NRP> stream xŽ}fq#p6" ȎĐX3=wZFV g;~zwv@CX,p<_=|ݫW_wQv=\O׬_塔Tzk{~7֧k5~~< k}{T#{][z翾{>W<]c~K;MӀ{7w~}qqH"~i}{S9Twww~~u|;oȿ'XT7/Mg/Ƴw::辺kwW=(ݏ;?~KNђ߯/nC \7~*hht]>'UƵQ0F=m.JĘ|Wս| ~sxg;8j{cC}{G"~(?! _ީ`U;ijީ0ywxǷw7$vkL&jLYי&NXгL{|NG|?_㫤Џٟ|8C~7ߐTvDFWRU'ʃ(kx(|(XUTV4ΓNJqU*/:cd*dօa6u\OkR SApzs3K[Os2U=Fߠ2FG}b65MDLzվI,}&پ9oboR֑?)iADoxUXOsR*}? 69j^~=Q\]'hZ!Y`h^]4i `2;iD߽ 1[sp@ n!8 c?%L 0)ގw<עI9BNL<>qJ'}ip64w&v멼è (4AkBA@P &Z Ӂjh( fo6nڗOVM v֎AW`@]H_ %L0 u!1SQw=':[0FiZE DhQo<ݢfSE0 8xᰮ7!mM@`.hVSlP K|d^Qa% C̀q tϲ* D!nZ 8+}9rJRIh~R\\+ॎdM*%9!?$g*$Ѻ97qb:\2e'V`D gvw͉3Cgz_=i54 Ӌ`"kN$) :Κ(Lje5BF+@Ǽ& 4y bTM MlX¨4I(0GÐ4T38ثW:Q٤һ[UT0ԩ<}v&A+ :PmRt/o% SY;x(+Tˬ6|O6xcyxXQc@}^L|l+-(Nv*`@ثUFaB*7N96p#|"GV^Qۥ ô~_$G&}:02Z](HSp20Pj@ΟpT(aBKVn,l)?.DZu"]l['J,NlcI,ַN;'&Ɖ%{ >5!1Gk`%{׹0_ x_88\$m0{ r p0V0%D)ގRQ鱜Y%>dsD(,^d~jI9tɚ:UFaRLD4UodF4S"Q HErV`%s+ ovނϨc9}.?t~-w{&'RxPH3Yd<. > [9P5#jH1dbp:]u)T;:hKő8CP7ɮq~B<.3QΩFaRޠfRaRsDW-X;{sQ|akCBSlis&W 梅E*6K)̦([sѷy x֓w7+}M-@}ovL1 Ũ˶f F|r\du˃,!z|,i|\M&/%GS3"Aa  Va0!dV 7'Zt DB1 wXymrGd09۫"=შe[i֑ciԯmIUܯJ* dѭVgA֠0An$gV:FV#pkj[)ԁ984%L pގOe?X) p"rAPR[2B ì_&V]2y&yX!`#3Y32G(\n尷B5CÄ0W!TؼdW0Aב88|";}`#*D{#>Y]K5OS*^ nG̤qDD`pd`Cp@ZLuA`2?z?U4>';>>5/Jk[]ioێLus[2k /xcΉIз77 ]cpuch󆫏 va^ B%0 u%͉>#׮u#9C!/:~PaoKvkgs NNZfJ@W&rRV"XM6R 8A;:,jLpފOp"7mX+ Gաr ptJokT(LJpӎofB8ufu~yi4 R G,oXg̠pqC{>[9|2pհǯŽges4JL82 8Ѧe;u }bqX([6-0* ۩;œ3-[nHELo- zaꞐch wqS;þ:sd09GK :޽J΁>E9,R˭vZsM 5v $s xX%<]Qf_Ƹ %7-g/tƋ/M-gtFpfj =ë гQx0ڠpwJ:0'zbOUxp0`6>yŪxz,08R Ԛa0:%K(LJ㰷c;eS3f+ǒ|[J'b\Sȹ(S VUQg얖c##Xj94";KO;yBQ }(STl|dWkbRM),0 Fl&k?w3[*:#ܹR&2PZ|6_Pao y=}\W:Uy-]z>5)zRv '` 82 8Go(F6m÷ Ko~όwP 2ߥ{fQ{#^68>Wa?~^,UcwDGcFR+7)ғQqP4I͇-K-5cX߅&e9iś1^)+)\n尷f[r#qΧMvƭُ0 s ^Dp'|IW 8쭸iZ/3y;[7m3 ~W~cH䆝Ԕ¤4{;>t}uۯ8g V|r 浍mX6d4c(l8پE&i˥0 8$7=wON?/r >STZVX7W. Ĭ0caup0PiPL84r"ҀSFL\YFךZjbs׸ Z5Rg|\5}^ @Mh' U2S~rc"x'kB\yA)'솎se'o Yq S⁩|8|4vC g(($>qx/p̋Ɖ/:tbcg]~%@,N?1rSp-oKqv1a:v+' 4 νI*  p ^4^WOC:uՓs-3Q: |"d eQ|%Ț#M# ;kY6:t^YQ`Z5 _) s@ b PU0\f 9⑍,0䣑ծ!)4gM4_ gLn,ޡl&u˸#kr[̹Nՙ턝v"LsuY sU)9Į, qZNl^U-| a b9UY)>PZ8s2YR턙r 6՞r3;TYStHZku4G?:aXwE^yw":CK;,x",o# #"QkC2h4:&tTw;j)2JtrQ8I:ȏiǼDTp>t8j}%ٴFG;Ϥ\.ߟyC|.|L/ =Iwc#5eKWFd0KOn`kU98.O=iVjyּ7VΑ3 )]g2*θU1יL֍W6׹њL|Y\.s)(\r ,J%\g^A5Պj?e\gˈ2=k+{+^u&;=2qjU`MLpk k~ss i8{W0Ɨ~v뢭:dBJiމ;sEÈi-N90We"KV潞'򴈧^iQؘ35|!Y NW8,ByGE?!Ϯnlpg]ccpjCut 0KXW=ɒfq)HUMHnj9c?DwkwT DT1 sU1mb>%<%hYMt,%/)b! 7 %iDLLҩ`S!ծ*NsX9v^qu,h` MviP բBq8dEa XYV u aXrsx0baw:aZLIQ+&1gQ$*b]iZ0LuI{ AhŷQr˧4.(n8gs Rjp.a{Xe%/jX % w-*k5<}4qN%(l7rmK)f!$ ^M+K@YxIuڤU#&8c)gׁC#&uz>Z_,Il٤|IeћyjII a.%Hy4YS,[tKlrCy]Zi}Jsi@rl;T8H*]UW tVvtFKުsV?'Dղv :LYZR!ޛhi~6KF4#_Q`8LYjuPG}l0Sg=Q YtU1Qk{#D%t,b!RAKjƤTS_3%%)92[B3)̎ėTR?5Ev,d$nHgR<< *<j:%}j*Md5'DCbr:.EF2K46.tu5yTe iasfKJޠjk a BQ6ޥg̮w]u}6unF_g"=ǕWri3l+G,3"oP y"DEWOU0u| ߨNn5'GP=B,s5k=ʙJ)kNW'1E#UWNs旜DXOkr3O )>$+^#TOV]z #RI]C'DeFVѥyǩajs4hER%#f=!-<,pe̛ZKF^rGsgƺlOֵ5/sU]Ӝ ӎf KJj/5=_S՗M_Ţ /*LcdӡY&d8Z6qKn[CfW`e+7j.Yg)ӘGڬ<0OܕUo\CyYlD]X%0aM݋渘-l"6̋:q);dDEF-2 eէ;%>}_9^̓ */F6I](kcHP|jP J|687ou&Q`kĞIoߔkp<}4 fO~Q')p{Gqft3/{5o^-4o;ޅFa8(U¡ޢyMP8uS`kG:>G:(} r _/4y9c/~Tg-V0P7ْoCrUoJh2$$Yۥ* &'vPXuc1Nuaqf*d*B"SH4TD†/BTak, R8a6!b6*</OvkE}Tپ Q ثL$Lca $>-_D1-XSFu.Ix *djЎ .=J-V;k-§ΏD1d- *!$ B`0!¥V[+XHn:B7'mX Uȝ%muaRrߕB 79drh1䲣.? )¤4{;^x~./RÜ@\40= Poof{wcSEV(!"$ l- OqK&p`VbC0 윯`KC{!0JN0:[' ᫥ۧ)WN+S]*a8IuQ@d ZxKMu>AqyU/[}GazZP\Sq0s5JC`0)B4[#>qpwoS,cNwӏXwfawd_5QyK"s)#*RӹRSpF|axÚ06䶔!<vy(&8>cޒwηz]a d4{+iz*apRE rcT Y0rQ +10V@XˊUTU 0 N"i y)H.\/ŷKfZC%ME,Y *!pm0|6%Lp nYgz焸q^ꍮ, 0IF=#0ׁ&uۣQ¤0 lІ5 47+J#dǕ[ tEۋ8-`% #94Q^(aR˭vHDʭ+lH&0+aB4~p0X._`ʐ2̊FaR+/u_'JL~/ݫ7 `>x`#ށ>䢎Sߗ )V{;6MY[hI[hI55I*k```4)?zפ¨h&M*q!#[9$|u9f#/4i\qJ3q0X7NU0zABkj#’]y<:9l8԰?pA[ (p 3$`+QBH2lT? ]_rlEkdz"+[_'f5_op$W`% .8)[V(aR˭v8l~1gIqoJcasks[;:` `& zM3`֛5+m 9P$5i:jyQPXA|Z|j1G9aj>INjr]APW*.a9|*%L M;>y|mGZK?7;|[n #(؁!۬@p0hFx>A7]܁p[ՋJdm ޽J> YuF (\h7_"Ϧz%iV罉4k`h  ţ?‡]Z~oKj}zyurCA$[sKw^Yr92>y9 :bM':F (LJ㰷Cq.EV# KNqJSjm[~(=z&u JUbم0 [xj/Y9ڦjS U]TtUPm$NhP60ވsBLQղ!t߬08CB;\El{0!8U!pl$ lԵKؽa^ իHzԈ a! 7sgD[&5p)5ɖWtjT לao*UK!:qz(80Cb *iL vVCljBV[#^>D0a0O[KZ N]cwiڍQ\a/0|Aa0 00 RȽ:AYZESWQH0 0Wr R!QIC?ŗ4)!g};?꩸ú=\UbcNŨ!Qaoħj ͣUIћ1AlEW+B9?D$M+(IPPԭ[ȮY5k%i琝QX@88uGua)TJ㰷CжV@b_.@A?" pV#RGW|q`j^ [9x-ZS.vLEڪM æ@("ߛfL^`F(\b尷@z:S끑\1._0U d]B. K\0w;nlQ¤0 [9?0N` $OO?Q1b״¡BXDBQZ`nޕG9m{4+@;/껡 03Q%oOY LPp-0G.0 8 3MD|0FIZ=)fR 3)*q[O+8ɞqęN#Τ.r!;O}wݨ%#b|:Q3ERkÚ#iA܋:F (LJ㰷c9{9c8cߌVsA!akc%%G VhhьR1K6h1ӕa$@A_ώu'C8Z+P8DPaoĖ ~-IȆm|uLd aaREdğaAȆ Z쭸1,n{tu ̗Ry3Kɣtd#+p6Fr+/ZW` 1"ǂ\W0XDBZ P9,(,`o1)T>5S#8ty$0|oRx)Nj$?jocA Gyq\kR`&qGm^n쌰Y`"p!p>ɢ8=Q98"1~{e$wQE ڗ%T5 ΅gsr*SR]ΌWQAM@-;YHV𾕤iF",  "Wx8YSGxP 7ʻHI"-M,ǺӾ8wIvf]=Hn]Te~az͋\z;(_oV:Cn:  ZlPw r#qsj|pp>S`s%u0)ގk鰪 ?{24,@ FQNk*s5|sT Mo!XV(.+C F(l 6l#G7ӂ)|F8ꋲKTгe/-|iTԵ L/-q|ZY^Os_X]d-7S{_D:.>0h9O]GBNn8GX?gC8.rc  [V_r,ٴY.𱟠#HyҎ|lۜB,ȓ tlMBsfsTwli)]5 > #bxHa8ܶCЈYW]; 7}+QKD)w u>QBH*q^IDy ,;Y FaeqH|\9^=C6ظrRr7'\őށcŜ;v\p1|D 8B-MRnfI9.RA)ӕI!;-vN{qNJ|N(\qpM885̝38ШB8&(\2MY{"<"R񗈈#"Fa,e` א]'Sh 9eQ{#> > 䭾n[}F ya"D>>tV&1[”zY}ՃRJhVJj[;(e1A)g9=>]{ ~\Re{L۟{dQKq"W-DUAF8.r52+Q|\an$Qy湊$Q@&E:'¤V[#ns|#5v9Hz:koCJם{ns)AQ]=it"%-AW\/Y}] a}Cه:.;=쮻%?a+Iiv4LI .ҝmXT,pnQ`#7NtN:΍3 [9m޴vH)odE욛hRx۔d<'DGndž[Ӕ¥V[+;9&޾&)|'vr&1 c١H@8`{?N)Lje5BV^>PdOCޒS=]O}r0Uf>WO\ *a8+840%L 0ֈ5%0rZ~q3 Zs٧$&LE18%5{w…V{#eQc_,aphTP>VGFFw1EvF*Ih6xL$ 'Tp)e ߔ,#pN1 K1;s)) 9&qqyQ^I|oHvJd²"ΙFቅ31ޱ~+8~)18g^˭v|r<┇hmh*NJtjll]- σ jOm6T{~\~o~+jS/O}=N~{W7޴)6m^~rѳ5]utwSj+&]~. _V:8txUK_: sSOo'BHdŋwJR?.ʗ8-y_6Q%id]; #߉7*Jo:~Qy/yڼcxNغtxa"5kE⋍ 4]MQ(07Vu`L:x L _+a&~X$^h'ё0:c#.atT&܄ѝ02BH<Js-cizMY#5;R*v5:CsQmD`T<ޮz[6T#b4욇no(V];W\n?D+)ry0$eϏ<+x2fYu7+xIfhEnx18 ܓX%KժUM*i3܁fy9T^poɺ2`=طH~ZX1H 4A}q T0H32wďA >zYxqmߥ26dS(9t0͜~˘b@K7x{Ff=*4F]YNwL]~';'.&>i~lr%q?O}+v̍>j.)u^ƍ-x_#+ {0}KW|`m\M|фsBJdx6nQU@8$ m\# ֹ߮</G4c~IP%OK5I4^״uL5 ͉'']66mV֙ DIS=rE ː.4&8=BܸjԠ\AQV4Wk\浚P)k3W7ٌ-e{s4Euޭ굹p2aX,W=OkSv*$e^h, LP{<]EMw\Du" ~ZT/JdA+bȂj`Ҳ&U48,xQcWH\F ߆̠O&IMNj-Y~zXD mCƏCGȎVXbjh; Y1fp`Bd;W }Ci3`CǂaƽB:RQ=+̐i!uxcu&BTY:o|O`Y굉G'գO ҷUyqo̫w7ϓzObڲbW_-nҊl]~ igվ 2hEel=$2!tѯ>YXys7*{L>%&Wrqy\}0wשnKG;" OE^'#>?Sk&>S0Z^\8pOP,dqC!] p6i!0JFaR{'}}nA0$>L[Y%z^8>{4(p$.0 k:[tD#:N.rNONc^n쓇zTX_S9K^=%Zf_Fr'G#ՇeJN=.O]㗿}EKkxr!H=/׿{ce;59y;JHf0o^.b_ <7w9G[-\i(d;gC$Rw&KA=48B\rnI"/ysȺ)okx7w~}῾}-lNl K654L~*<9w;kI/IQf4[;ytDk>TEkވ!'9(v9NDWc*25=Dsx TIߠyEMҡC0F ( g[n}CME?AK6<ug6>qp63GrS[[MB?15'8^y{K~ҸqӨc3w"D' :k&Cn7.BF}x\,1CI9KƓz,1C_''~_0ma#9DK{xcv+1 M޶񫘀:iN?ctۿ{r\>dR=g.%r&uѪ +@N8MYo >#OZڑzG=XՊQC\Um5.}9;QcE2};*Q)|\jl|1^!DϼnM 85۫A,k+]-9>:q?;+GO M(ZH5/K*fR2"*/T%þ}TB 餬v6hb+"9k>t3 Nv:U LfA qoy=HQE=j@S_5[6Rmk~0FkԬcS*W>R߳N[6VšCt)ya\ݠ9$z2B0٪Ջ*ٔXoieA%Ahy>,[y)u$%N 7֤݁{DeiH1+!4]t,~Y2ȬNq{|4GR]\FT%~rdnyH!CF5=^M5&gek\ >qCf.ZrҘ9@g߼Cc&su$ݭ*믋Fy㔆Wǟ'44EzFQ%=쾟=yi''9Y&9.c;‘Os6A| rpjRi9ihC_D79_vNFOc9 >aOҷXEL obRM胤\b*ߋȮGfhwdQ')P?Ԝc.$W%ZpA4W|>:Uͮb]X)"]S:Oĉ{BeQ <<[<Ӑhiio7ɂjl"78J x?OKoZ7 NX`(0#q⌙ Lg6iÃI`~x:ڔryvK D,Dx>F|:q6fgBh1w .a˓z%`@A21}&}sX[}mpeݔ?6J]T@F,xo yɒb!7Yh:b0e㔛^{8=WN2iG?gW9E4O0/f_wse NtǛXT _4M;M|7~$~`_R2zN>f (J?O2us5[' 1xc#-hX_ЦB^tZng.Ѳ&0/-juqep:vӺ_6Qc!RlVY%3^3d(ȫg!2ysy%6& }"R*k b¿ȡdʊa>;F>!y>}Q^a8}$KW)ңY>/CBݨ|U otD)Ж)!(C6l"ՈqNxG7 ig?pZKH ]cսޮQAϙy:l翐-UY< g )?mங0RZ9MTG=ooPŎb[ifVT GII0gC~l7$&s0yHlaN$k7% _ko8Ep ] =ւpgM*6X~r=y_{_m]իh'ffK;*Gi]6Jc([WINօZ75Ý Jʇݸufh _ ~Hq$E!HBRU_Cǖ~bZf QP׀]7d?+o*?Z Vav:W_?k9 ?߅X=1B7"!g玲[͝8mReЧY9Q% ;|LzGw#6_~K!zM/y'/7=ino3ס/f Oc Ilz%Y6|v-ޠF4>62½WQFȊ\\|׾r_]Z]JocSt}J6#F{%jyӐ GRTy^לk<}Tj#Cig? \t[(k23ۏ,}F;CxB;Q_%K qnB%ݗ k=1pWVuu[XME#G ΠU4V%8p+ӗ`C\qOZ7\_Wmb|[UsH؅~U}7?;={ovr~ NYk[4M"ߖj~=m,B&#)'??N`f㴄1}<՟vs x?N,r:u(ݑIGΰoL_͝__ί'ݕƖ>3_'{}Nwwjwz>Ottn1Jyp yGə?ma4(r.%endstream endobj 389 0 obj << /Filter /FlateDecode /Length 3828 >> stream xnGnh mh C4(J%Q(CR:ٙsz*:9b:==z"ӯpBj9]tM')E.5]^Lu.;!?V.=[͛:U]s[Ha|' su=љA\]M]mꧺ:&Rg.좵r\=dyLlKuݐ䜢[(byAD2JqdដWOTlHAEJtCrN)bb&!bT; Q v񧒼mPjbbtQ-L ٖ1VXalHt"D]þ+7ǥpnx2̎me/tP]vN`e~H BFDPDz5_k=Xt6Flu{z$e< { ӳl{B2!cC2˹B^Cp5N;!t(:xAWJDId@ib7R;hknpt$HnH. @ί;32bQA)sHp.;n]fEڣD *(ޕ#FXeJmlqި^ ZiB9D'H0!CU(&ޥ%(º٪[ `(w*uEh4BE\_!sFAWt \=Ѣ S=p/;$^"0,%sZho0%"=ӑ,F!&Ku{-%? ٜNmwdxdz"F`;Kdh | Vmw|RY_v[-=kVu1_kAvρ $Ag}]OF}ZA~(0F=Zʪنx$pFT:4i*gp_ %R7G*Bz"$]L)Uq>bƠv-+f5݆'%fmz(=qs.Pᳶ{oKEuzP:a\> o(rj.Aka~%MA&dIqΛɸ|A_h,U{)`+QE.Ej 7OHNÛrlzG~JHMahODJ5 opڦb6lϔ9`@gB) 8yO"9m$?`V NZDMIoB ϓY;Hebr\ce->csZV٫NL)N֨lW]0ґVTs)w9 Sy~<Π 39:BzǑ(C0l&*t$xTIZU @1 p׆M@R#eO&Ps aVDc@`ᨒ&%".PSPv[T}`AS1yhn-,ȾkL6Gr~9]F4!wh~_ny,ȆK)( CGLAǫ#! ZK_| ڙAQ Z4-%<uZ!;(:TQHco嶡C{p8>^KƳaȣS6oBr=nڣjF(ڇ>,n ;LS)a8kz?>dB@*y̱MyR CMUjPvɉX)Q;H@AE$z90V ,ʔa{DeEj]k,%U% C+ǥAa->k_EzxC<(9COSMhU_qE[֮!Lk% fhS/EwLF礜Rnvu%n"*6fPna Úvk?J7}[E | q+0Vks\g\ oiElpq4nk$AKH {!W>&AFIȘdGmU$ZՕeε[Wԕ'bV9SdT-TEFRz7嵸Kyi]Ej"!'  X64ך2KJoi?^Ӣq!Cj@ !~ 匶 fe zd@xϻ'w 4[$\lW4s+ d*&a̳\, BǚrcS35wGG9~㨐ɳ/_lBkf] J: )$!yo# ]b G})jh1~ƒؼbX!?߶MՖ.ܴ9 >V[^ .Փv°!L»);Gg MWfn^f0lό{iy dOKv=Ӛ/Ro.[㪘% \4 )9+[CkD!P3]fyQ3sG=1 {ebH֐؁EmTxtv0Z8 8.yOs'b^2'/r6 "{h{^_%Ɤ f{p1 PAZp<KRjU+!RxAuN##]QcIrԅ)eXMΦŬez)A}xKӭƲ+f/A.HoYHuqe8X*wCgHNz2T-H!;T &/o![wp"S;0U .!Iv{=ld?:U _QkWLUTmèSۻdY\V1ydˊ8H6Ø65q"S_5I?kiF/We<My$5k掎G٭r ks-QIrk1edX9gHioBw=1<#YV)sĜg8fl]bLo'Xendstream endobj 390 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 *ХC 8QC_Bg|wY˕m_Xց$i,XX8+/pSj&<ۼ:MWHAD3O*g fh*q\C in X3 E Sqendstream endobj 391 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4937 >> stream xWyxSeO"b:2UVZJ'm$i}}mӦ'M4;K٤bYEg"(2:|ޯx<>i6k~$a͚g :;;2iDiNCppרY,z ȭ1́m|17eEEJ"8'+[?5mZW^7#~άY/.(IK-_*(H?7dSg W_||fjA̢fė7dde/+*įM-ȈP ERAFq|^v AjZvNzF ZPNO-,eX.IWֈ327bƽ'Yֱ߲&egmdmb%6`dmg-e-c-gfeZZֳm`&85mayV,4k$!y{#<*;jnG(uc ]1%?s| s&t=1'~AnrD3(JEh9z"*E+*Em'[ dj=С V4%%0!n^s=QƲfȈ*K`$~^Ym`}7\2^Z;8JĠQdSq%mE7̍Q1t~8U{s$W[kv4݇X+m-~4kC >Gfm]\ё}nzVJ5Y4 zfo[%ww!*eBqNU"hN˾Ý@\չeZif*fP[zF=!v_p?u8BQh]w ""tV2Ods{r];s5UZjcT d=jE,S\g;J|}X$HזYn/R6K 4}y][gd2ScOpJJ*sjF̸X>ڋxX/z.'!%j%%=|"R2BfADZw[n6}!aB^R) Q uK|@#cS~:=ǩCB;^\"T+IrQW ) jARA~:5os\m}] -_:tXZjH!u!!K6jSo0qW+*.= % a;No'egcnkh5tKim:t}s;MX]./a|c59볓[B &o`CEMFj||ъL&NMЍ-ʂb~^;/YM;3702NQKH۱Tz߭}?jD5׀lýUrRVk<o'"VSkJ HtiE5k *A9[pJVolKKd&C4z5nÉ2Axgjx}CJ[4{5T'y+oWU+u"P%҆`KS]o0O1qd'&۪a)T $@9U*4p|qhN CDqF@\+(>ARq}B둳ZX<-yz7Uj1b5x+K彪%zܪSa0a.Nힿ~,&k7Qb!V:8L遐ƉvjF`М\r,zadH/i0Ms" Lg矾ytJN& K$ ȗ Ģej0ZF AWV0g횗P!=/v x*6]VWs޲z1&O-E!שZJ檊\(̖4a\KDÔ2{/s"\8+gu"RWͯ=lTHm:F&*lى3yyy+?5_>ES;r-&m5mf/RiU{xA*tj^Qt*z45} uH 5KmPCػ0$L99Ͽ埄݆PiJs{Ќ{@j)̙vリ7܊BhzDތ9?Qh6AeC%!449S HUVVNS;<8k]G1%h2D7f{ӎud/|` @Ek(/[|M?V0Qᴠ2AomA2x[z{v%+^K s22*`x`gCYHQ@1DBM<qCy3Gӏ LTy%/H14EL{c/Bܱ}{i-ڒI=MEc¨K5(Z#X;wi iFԡ4`s50O " 3LR#zF?54G:qĂY6yu}MnJ4b!3oc> %mXw *\:>>J汬=g `^Vl=2٩satGMGz.,H؜s hȥEL6ww%ߐl\_(=YXqj- 9do^Asǝ_< 3} ?Q*y|YmzcDX jѴXMAOHPNyR:SB|(&Gppjq\0>a#8{ [Gw.&aZHYN.)cR.s2z'946v2iUԒg=>U#˰MXȗ9I sЦ~n$lj ®b26}dwÔfm´TUG?~*71Ku2X/0K}d`/Xb`N3ROG /eHFpK`O׫Sk%b%6A(LMsĭ)%Y}6J"mdq_3h5yFb҈O$_@Wx&#ivxua^ձ"pY'*M^d;A[Ս3}Qwo3/ J &0Z̥U]e'5@ l0˿bLiHT*H.Et$˲ 났PȵNS,:V&{}b4 T4 rS`F2QDL)Ip> stream x]O10 *b C 8QC_Bg|wYu`A>E0uŭ F,m1' ߔO*=NRP> stream x<:o"(XpW(@KƋ\zv( Ѷtsoп`l<9ɑ$\X{{*V .MF!win$vxQ:X AJO" Iq0iA,:C_Whml̠CzY`!.e{~_L>ZgDl gk! #w˲IzgT^vx&"|j$H upmi}]Z!I a/x9!+${ 89>7nu!ZlגYA(OO{/Iq&(tߝ[OJ벴·ˢ0I'AZ4 B?N^Z*'i`%*]`S1&Y;+u2뚺vZ5F[ P,ټJ֌Zy6~E$iiioBJ50և2|?@a#|(41 \ZT0|P: WuK뼴]y5dj_JU oJk[Zr4 |z`7#Ls0UaJw|u&`rNݻA)=)\P'hr ظR <8; vGUm'cCs19a VXSg/`Z0[ B/K],h'D{}4FZ#s2\3/^S4&wnq2Ú ~i܃JI@"'$ڕӺ6MQ߾ >!4v{O&&HI1v1)| xNs ,J9ӦoF?$86iO ɯOr]rKIe8'JY7)o06hLv:N#Q%Saj!`H:鯕iFi>M>,&~qsJPʯ8DȩI>@xۄ-Ke~a@`9GC'M\6KРIeE#Ү=R/!ƗedaQߟԓm,&i"wimSB,B8]q&~Zْ#dDv1S%$^!FwV'n]Gi=7B|9^̘6k;'$fXkWnINR(AVQG ׅJtA^t2p`tKAy^ŹEGs t[H   "Hc-VhY[ۗDN &V@8X3 UN<  - _)NF @,=Z~g1Ԭs]ýfl"U }#b~ƥ8jS:+N> HfdWeEHFWY'9#3yU+7tI>.j~eϗd@NT *7nc(. %GUP=%E"I.`!5;KRp ɰv F;XVȎisY$Kyv\SDI\ wy&qAvgq`F=Am^^8BD: >B?j9r+S|($?q0X:f/G>,u6K@u$tcG&t`}VcQ GʓT8]|)SA` fNП<سƶ)Ky1w%XѪ6ztbU;I2?uFk;B;wvWB_5^kQƑH8-T@߅|r]Vbִ/VP5-_'v\h *$y \$h3 ڀI~>v͋<ߟr| jNeBmeE}V-V:b0t4zW ֭I}ZZ'Us?ץ`|nժoKn:*f+}=@S~p5$ C?*(2D: ^yܰVC)鄇|7` αu4PF1>eSrH,Pj [[Ce-Kɇb*wO:t,V; ,:j%ThhxV.U*T#꼏JڂЍeC7jW5\8 8.Q(ڄ qsW-7DGSs|Hcb.d!#t!ɸ/y^:k8F;/ۢefҢb̽Jdȗߒ/6A r>͗|$PdBb-R3Y*/-^ >=PK "2I[!LQ㹄RTUs{.j#CG eݑ ZK #tC@cS9 jzW@3a62 : oU%s>18 '8W:2%Lܱu}~ad]u7&7r橂"O..SEh55t`gR` Qnp'žwVŔ_ jێR:W}Ui{Λ&h hB:O I~U]0=,zs 7jUGyMm(y//߯߯Ge mz}%@B{g#Y)q2E,Kv1\ ~cغv2w 2e&Lta ltȠ\5s y$ !\g]@wC?0SҩFxU3K򉠇tS(~Uz b;nW`#H+O9:RIsyxW`̃,`eCK9;84[)?=R -'Dž9;<=jB[E 0T0`UYohG3c483R.34ï↥Ƭo5>R9YssOm鍃So r`0|P&!_k!ǻ9[2侃|rN9[)v٘ ^^6nu+RA11Qa~Q̌Y '-mgu6`dNieSF$nDN(.84 mM[/XeN,qxR)u{ 1JnQ):c6%=3-Q*VǂdXR7Ó͜N$$'\)i~ga4=dp+,N6G/M`Xh":Pd!QzUt@֦s& Τ%ђNZG_E3#rS҈E:զ$z S&U`f`{I ^~Qqkc/i|!'{q7?0 ZN:00f'g{3L"Ywވ;"&"x CۍA:fc`%CUlĪ V-'¼H}ykIRV%Ƶb쾘"'=׾16ٷ%|$Fp{*J{R\E(Q`RFՃWMLeAGcaPވ9'iӶi? 1iP'㦹i'/C rJHTljQ5?0#xДP/Z&(&r]Uk UMۃS_&j k7!b*#7} ȱN{:,Óea\l&% uHϘh>|axfu|-,2Xܶtǭcۨ%S1IјT$wi,R  ]& *== %Nfo(KazY;Hi^(!ރm">tVVD_›!Ɋى+zJ+Huj/ '2U%d-^0I$/ka):-3 /35ҴS;}Y?Gg%)w1GA7l2Q<&IC(` }(;'"57̂X,z-d\s5abȇU Lg1ű5J7[> stream x[Kqu>=$USF0X,V  /==3 Y5:1NпnoWVR7蠆h:-j{ݯDwM4]sy=T2. Z຋7s n{=tR BZ_ߤ9EiliN;D j6JǛ=q0z}vEo ݠCguD0(b+3dc?Mەt؈ J$:Vw'tL|I!8um`VF S +m[8'VNb[FG[ -߫x3@X\[xZ "^銭r w* l׌qkjv 6t``aPZ6b0 B .ЛZofЪELCݧAx18%$JKj Jò,[ˤn*-^M[/э |djˤWbԟ(cXM 7?RLBh>;dmx^I/ю=3c9i/ {^F= ]mN#2C!lrfNX) [i~f =/Aj Bc,[!ӀJCQiLwwopV;5ig%L"ꌠجCfīi'@n/ AbRw-y?ح%&mɅAF ԜϷWi Ȱ(#i@/d@!sW7F.ca>i hWx ݻ_oPrgF劺1D35H/~pA~wJDٿN1j?^-`{ 6,cB9ev?RrzohKH ķ]TLK&2a.%MN|/n{fr}PDdvh)aٖuTu AK `qhK Ävy„!1p|q !7L/4R"Dj&ksB d4ӦLȘ?I@Dd %OLLqU&AO_ 6*l!ňėk`'!E\P%u^xǦfO̳1b#$ yM8hdDm.Et5źvS ieᘋIC?И ZHpxUc %cN 4I.:wU&a}+9%ʮu[<#`b?\-6Iwv.GmVfI@@*ubp^.I9&|X'puPRpg?༜OAjJ0%y}4,B&DR*-ę-ڣOa`U@ʢ%a8Zo1p{r{RFw TXHkƴ4 :)9Q?+)$r`+8J3A\:һ{L Zeyma(I9p܇C^[2G( e89:Bjd x^!Vaɭ2̳Jyn&83BfaשGu|?d)MD+ ӱ‡\QAG*=qORyamI칟In䈊ގpW\25V%UX5FTsebBA.S rl#`:]e29ٸ_O x12z yfMEt9siFPkUzs~fXX~v5V_xY迚;F5qom[ڐFP_:5kg˽=j{Q"{V} *_I\{қ:L JյFe")cQ Y^Z<#J}_1¡F5 'UU*]qQ0hC4n/:-gPL1Y:#Yw$YG8;YoI&Yб'g%럍=ΞϘN>/t{P5_´|qf0e ,6pJajYmx 0{emLa,TZZ9vƴ+ /-laNAԊ!_N+>Q~P3kb"ż@ 1,}ju7As󬻄㽬;v/{I"7v%SfHȒCQp8z>*DNUB5SLf.ģ'x.9nǔ:3D"Fۢ,q$f<׾ĩgD(k9@0MC-6h]uX-W#I+vqkV`r\m݇? GMdCgLK,+cUD?7,S2m)ᦈS0֪1C 7PD0H^ bam (EQ&!}&\7#I К(k7;31b.TpXu*;cZx)Ej-S8`g-ބTm`@]gcdb2̓˱MO?&Z86 Yλf%JU߳2s־xB1<^ 0?s P P)sf9ҴCJe{ ٛ:(&S*\cK.k5/3]]XOӠZ},8L?ް0+@'PaG>cg,c[dO: 9+MOל=+#PsV㥆ԝn,,U萱i1E(nKsh|Lu\/X' bbtK9<U=B^endstream endobj 395 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4398 >> stream xWyXGvADgAP.Aé*ax%Q uc41x(2GeQ_5n $_=<=GU]oeY씬%I;;lHja6OG1H }k±0d"?w%iYV.ܬY/eՒ t|2%#+trUVs3V90>ˣ}Wg\zVvNb༤5ɡ)aS"],=J9tq 'uqu8jƚ clpf3Ìa2sHƖnjc;f> D31L,813g&2W&qcf3`&̄2Sșs1d</f03ʘ2ƈcΰpƂX23k d m8 }K%1gfAtgEr#oWA)40{pa-ç 2A]FiF[=1v0nm˸Ըl&N|g!ӆ,5tpD넊 ;8Md9ݕ*Ĉ#{{_fX.[D#x*5G464{uvs Xw%^V󯪆g?؊ +9{he` ֪L[5Ъ ՘޷G^:WRtFJs ?8}i3gcG)4k!Nn>{,g%|ʜ܌G; WyxMUPYؾ= 8ω՚ ۮ0&%B/E1#Cx99F4 d5>޴E,\H9pI#R)98J5Y*ܣbi$Z; psj!nhH67CDΏ=ኗfׯُ1:{+:p~{~9IbfR'mō[D_ ! WT[ %'[hj 5o]Fb6eBWǣ67_;u}vb@BoZ$}ѧ1HJ9]y܉=v+ig[jJ")DH9%I)K{T,!-En\IU6=e*3-AM3&' OV'+$cIO␿&1-*-_Ķ QhA2Ta4=A v_wxٔyi"}-o0?qtrסoK5 ;Mk'}hY;C<6݊\䅉~Hpl!`~+|vӚ?nxZ Tj'7C`5x7Q֖.y~c~om `^\1%+kf\j B G_9T a[^VrP})4-y"I!đ<8@jWjE냫 E0HψRTp gM ѴB[KeL[6jZo+ݹ;2`?A׎:~qITqW<6*;PzʅWFMk&䦾\cKQ|We{T>|IF Gmrg;ll$0{'fY+1$ųˢ7=TvJ'VmI>ڮ98Ԍ=sB\/K'BDu7 O&F7*?S}h TH 9ql"ݙh/x'd͎éUa5l@*d6s&( P *-@zK;֞0=qFur!g> YMЩMsf] n m&Wv^7B[v)vNF4lQHy6h0K#Eb˾O$uLB tJ\*Sb5..F(9;)}uFvp䎢]Zgg h{, ܻdR̎4N􏢫KOPtϭ=Nfw=Ք `IFvEK9)~k`/^h0źZ^>ZaJW?6Zja G;j! y[*WTL͒Zq$dJhgo]ɽ>fƶIW1H+VGegP*^M ^Ogo(żcUG sGq+ x~k ](2Gѡ a˯LƯCJj8( d=,[\vc=jE^^jx<^op,!"2>!rn|YUUYY;u v-t:s:oBt:+;΍H(kl,b F$I0a~B?Iï ,> \ˍ1P]6>zꎏy0 Bd".Hknq`RU-,l@;ĊW²}n;zE_jNi~q?)|=> ~urT|Ҍ .DnN1"E |H4$M| .1 ؔD>q!"$!{vj 7>-yL%-ޱ$0hcNA_)͘h/r7ЦPrqLȖ6"=ةhIV_W D˫v(~8Ǹ W{^<%6uN$9k /?reT~yIŧafMRNPSp2xg(/J! ,?B#Xbz; \փ-PQsNέJ⡮D:pZc\vڢpdxh0-zEp@l=#ZYB6Pߙ3-> stream xVkXT^a_PqΞ"&*( #0x8dea eI iM :4/ߞ󜵇c?o}l!aFG LY)ӃTe[vev$&FK;;G9wNh0A 37+& {KJD~=CNᶃ!Сڡ- p#͌d* yb`{%m]KM[0 f_FhI~,Q|y?#ARSǝi6a\~5 dJ2"NDA3#╳S?;(^(pylO_S~O48MxͲofCZ̿\d}{Hk3<;ɻd;q'p;9iNQe*m9Xr~+O_W\QS7Gߨ,{e+G5 K|@GZqREBύOضW 7L2XC͡VTO'8<dˉXԳR~g܆e/UZ&\!-B2l&9Ffêo/Ho?pjnzo2W3V\DG|wܜ䟎~mOvXH/,Y|GQ4 {{y7\5^#@|H-iZ@ͮqcw 瞭ȧ\zzin-BtVG8vGyK Z%a%t)e1Ω6eWY*YRְZRd LWܹ@zfNYVVL]:`ge`ߥc`ꠘwx[xxg-rݏw 3 KJ-0+6^W;5[idڶʿ 0T`祬 Y]pIyo}G5"@K82wUVBHa! ~$AƻtGK{ݯ Rt󚖄gs\A0/2Km'"q8^B FV%tgR-w.ӞFZP^JN"#I,`LK,.ٵ{v2_ >kݐkьW[ֵinYY*.r7kTOZxy%ߤ]:zFG*5$D/2 ^t2QҔ%<ڇ?:R.hd<$^&߹YkyQ|ov`0rG0&~UP Uq9nSC=c'dѭa:{tL"Znܕ8pp{/_=릸j]%>|@ fƽ[Vmeeηxî,['E=;`qW5f:@#ySa*E<&$ZY:E 3+dm4R0afF5Jp45 '䥧3.2Iݡm0v]*}ucqe fvl֗$Qo4! %xך C>%=Tkޟ@i-錾t׊p@&5-lN?]ë6`n(h;S 6Y 4u2gG#ST}yX >WsTd2a/ƃQ-FlBt\{_3y/{4i@u_I\k%UUmu_nKYv8o((xI6Q+BrP<9ֻxt(ȓ(OC\!)9Yܓ:@m8G=HgO@'?<{t-vzN6.;\"(lM^\6܊ץ8e8W!\m:,s0fH#R( (oendstream endobj 397 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1391 >> stream x}kLSwo)bunɽu. &ײ6-"R(^N_@iK@yLtMe%nkL{UqɾLJ9?GXĬ2W""+"lF&KvlKN8΁d6$L/C/%H`X5,^ZvTK+^۰ysF:oy۫DҲbA5/W +U dW ..yi[Ke2ɖu ZAUZptLVՈCq[P%sY*\&rŇDj *+"WkNb> c;+Yܞk@}a/BB-HIۢPMN¸i$vxQ[Lr pwt;h,qo1i Eɦf}_Kja/>`߈<31muR:ĚL.*A'NI o:F¬l+c@*Py)mE\K\4Z|72/9"N rz-=>ʀ06p/!s6)(=wE[֯/ӸVXpؽH@s&^Ls3pfEss0Z#S.@ 6a8-Nj;?pk}h'=0cT\^DCmh#JB+7:&NjhptAq"i`"/,?;rnF]XR}Z sImԀ,:.:$5U-M&JC@*[Ow\אs m밹,d_AR[QCNKd͍\`<<@ȮQOR-K` 4p鳷ʜ{@ k}>^rΣ<"IgfЂ0P?6 ޔEc{0{U)>4NeEj1(hh N[3r4k<`!&FIH)}jIU'70͌«2`RJo(9k(`#55r=]1p[=Hi쏀`m-6{7)|ǎv{NnĔteHʻ5RJGT`wk3oyvftؤidhYkwx|tDIH, /BUp%/>*2R^ʏa-Fy9=P\R+1HhD+4+&u¸=4<>y:Ӗ:Y*9HVGIz1#itEd_̿endstream endobj 398 0 obj << /Filter /FlateDecode /Length 4001 >> stream x\[o~ׯ=vyY^eM @EX7+td>wr{F؁c~%sǙ__{p= ';/wTu98ۇʨGNT:ۛqׅ?zaV:ze;:UݰXeMb]珜MN>iW؜;.8jw?u%Jr&"uմN{z#4N1MWJqTOci 'T^1҇2qlß Vj-mMMw [-7!n#0 8D~`(N8U6g`r#z/iWgL]m790ȫtwPhr.LTGխIB3"o[ۤIƼ1&ifc6>\um]֫:ƭjymQm}&IvUEo| ^ ONf(٨՝/PjA#ȸ?.P$P .Βc! [ ڻ"w-r2ڸ˩M$F?{#0(JCkN?Z !6 wGͅh;¦uւHRua1&ob};y`:1ܦK/AR}jwY"_6#kaHzzà9co }*5;8/um]֫:ƭjymQmyakSa?uW~#|~}+{g }4H9 -οf B 1:!Ln.$p/!SZ紶HDE-_] 큣ykqY64X5>[]I,;6Bn": N<+8Cwpz끴ʟU: cw~ߏLw)kCȐ!o 6RٓXpd]n(r(" 62x:,"`8;SPggh&8`;&;^  > &Vq \ɫ8Z=c48a&ЀXyE,zA*bqA߭k\+1j"HTgb`i: h0.'+PIxUn0|U<ݏTo8-u7a bO5h-Mvf2l4;08VP>#8uL0nA`A%חJ4ڨr蘨= "|cH4ƋVHBTM2ºQ jWU'hV/o0G~%nvf6™&b`tƁ?9eh-׿i[Ja$70se@,F5{qښ{TN[Y?]V׹{P-t o|_Znl<$'Lkk`-!yђ:3> cas>@3an ЭG¯ Irp!uNkAO>) CG,dS!P#@zS[EU7jl.$BXJG֞ gsL'VsjjS37!_+ Aw,iWs-^H?g4N =C'7wVwݮde3[a|S5PkՁt(I΁74#͘?{_kk#z({qrJ']wORB(Gۭ('|BvA@TWctd4Hiթ0nC˱KF\h w53@,XOr6%Eh{Pهѷ =e&]jC<^K TV]j)e`4ؔh)@M&`IKiQ2%\SBG!gS`{YUhqy>{jjr8Ѽuzi^V%-dtYX1@fYj :?LedLiڄ4#?f3Zج,+*<~XYl|ܟf{`Ճu-ܫT.q^ ƒmm ig +4aMNogVIŹՖK%B̽ONur[Y3&i{qz[ 2b4iHQ*?y/s=0QP'n`Ugb0R_ 2neƕ^+ NuA~yQ[´eJ],o]-viP0ZVw!X՛%3^|)2"]URN/.="[%c*Z2En5F[l>vQY8zzwx`yS=Vt'3k]^7<.],?8FM lз܆5^[k}Qj|rCcu]Dx.fk 5hie_i/_[X\cK |CoȌGlaɤ_V8. K~sl]TN96^[A~*#͡c)U^C*sg%辝@6ہoIe@3^-ꗐ.5g7suѯ<ꌌvQUp%R14(]Ҳ"FxUht6La䏽c(orJ\ y[#GsPRB4=7^LjE>.tOkt>H@d{KEY8ߡX`W>\TR8M ZWxb`*?ަ*MN((xY\ N^dҽNqt6[#> stream x\mo$7r.G 7쌛'@r 0pgZi4Hk SEv=#a?fΪ6jf=uه3.?w</&yWgMPl>zq~w?0w`WwvC31.?ۨòXuMzyMMHfٿ9\Jʻ-'fbCo wAeR֔|nu&-dK ž3,Z>N."["vU>K@;Р\coplD_['_A :X`"cTXޭ/VʺefH@GlX{`2"w)< 8k83 H6Ibh$vc2AjuJ hES1a^`͡La$V/b{>l7KhzXgG|=6߁F(֦gb&9H_fڭ K} >7NY6v6஑ 4(# \3,#ݡvyr*TI)2RbL"уTUTsy/FGy:ݻ2%JI#ˁNFh& rŠ3?} fii>`GcsY$*:3@ 2_T^cvtoiPZ4h[@hwB뱶zK]\S/-Lyl `T[zS&MyY[?㿥}}}l=zem}S[ -$kTLVm BĠRx?)43:첶@dFYjt}S;w5}ٺ'=:*fVM 8fj+A<钅5t"ӵZЇt0ӋT(R_[Hu@$ڙjK2cv$HO 蹶>1\idΤXO8:H!Me^u%5_0XFu~{I7LU{y!Xbi*үHdR29f~9I&9$^t=HS 4%_-`^蛾Ѫ=]Q'+hr(ҮkFԤ]jL}%:^plHO 2IʍG-7.,u婢€7kȄ-'&JX@r5JiqRTC-u,XjMTn {˫„F,P|\\\ON#0̰-g$Up3Yu["琼:V!-x.]ƕ,۵P " [ o(ci[&7w$Ί*Uz#,969ưXG6O#{60 ah#H$[zW,s5BGAπa !;m3!Xv4Gd*ɡ҃e8;4 nTh{މPҙ@Ll2rQRl??@W11Dظ(24oJע\QodD@=OnjPx&ô ˬ>2{Zy&cr,N0npjH1.ʩ>v6tS6n3l*hC24L ~H4|fƞ%U?qQ5f}s8#ǭg_LԳSdg_xXFH5uIC>e )'=L,7+o긝1f=]ɽ]9dF87Jrݗp/=B7!roxXDa|e n m4Aqe)J@ѾnB ŃZ1R?.V8J%?h|o+GOĈ`=Cr, ?-,ʍoe_x_r2ʋUV@tOBA|P9(BH1R;Qt9=lƹmș2,j7ɚ0v粌pŀ\iuW݁ (,:0,1"+H{(Q`Ο̛~M}WY( %m.ߕQa:TC2'OMbX &2@/ysf >d711mc!"Fc0rR6cooTk Iĸ{S`/;^5i/k͠&h59vnXH\pZLэ6 11/[9[5`kɘhx>e;φY7KWcIm5 -P{+`8v6ҫM5u~.|ԠNl-C%)kѶ:*6X՚}jHh*U&d`wӭX >f#˱ƲkZ%B%T$ ȍն¡bm^y8-8ho5XئzrH:Z i_>R((K) SrbzG1r(]PsY"$X/ CX#e Dz ީAuޯӼ\$(yF-z\?W})kP:Gq fZ8xiܭ`ˤڀ3SM1[!] O{!8vEc!R#E[Nz7<wQoܰjmN]-Q4^Yےd<(KgO<9<7@ΰ%u V[t~'FXh-_y9]=n|ӉYO ܊~.:q۷V#1/bYjeJ&ː`4T }PLY`!_z^@PJ!Mv|A>@ōvtz6sb:-ifɼyt4Ž3au> ^_F#~0I:?bqYLBHԥL=GMR cQcz5Ջ2N2`N峗MW$i߭jTg@^AdJ*!G cJ.V.L/ %^"t4d-9?]|r' M kƲ[;i@vkʘg ߘj,O2J T!PYDY>.gy=tA[ Bss J{߮jT/$=wa۳R3YLp3aj:-+W6yA{bh޳!woS00m Hz|:|bWgpKئu+Tf;tm&Ok\2P*L!C|I7ߌ͙ݪfn8}ɓ b&|[6ü[;? 42Ļg䁯 TR[P~^.O"'@m)C]hborB%t+Rwhs!<</R KT4S쎷.Knfn@sv:g7wLoy^n- A#a5Bϛ&|*jmJr[&g'I} |T8z>a }F6BZ%O*_֗П9v^>^4荝#xu"FGԿ2M^ i=Y~?N^{)`P޿2+ekF ^ V@A\iU#e ڊc%=N' ǖQ,ue}Pl\ : O l\(':?3omݙ}J-w {_[O;W(cgFgyZ fP>HT>ϫA|\N&o=>ۯ9_3cC%Oc1JRțyQc?7FQ/+JG[ld2r9yC3ϑM5asrUTq 8<_w?]endstream endobj 400 0 obj << /Filter /FlateDecode /Length 5078 >> stream x.{s+ |$/ xOi#'.352YK ڑщv j:r@ .eI^#c'U;~hӶ8-nXx+ W6ʼ?hm9F)H| jRg"DѵzB/Z*psa1 V8"m>fCb[ O )N+aN#EJ+= -8cvd&GYn÷ Bp9m |(A?aEhqթIxL{tϰ'V)Gnvgzoٙlvդ\qA].7Dj5"?~Q7 x'`3a=B3«̰ze2%l0aP*tUM:S-εHOk+ 9Ck4IQۂRAmk}jw-zldZwLkZZ붵:#ˋ\d#xwې^/@cg9 or*(PJjyDh>hI l%2{V TsقCB< 2 ^%*LKmWDRwU3BPMؽ7u#춁A# A`&-<*50Zֺoo߶֟qWokkyJwOk+#]JbdCuHQpJV0X$GF>Ua0` q V%Py^ޞ`oW/mk}w !fͭJNjRb1;b;Z:Dg`!|Mqg tQTj,!] 6m~Gh: UCFYC6&{JxK;Rs.EYfvߴ Ȃһi}#pLnWjפ8v[?w˙2{^[ka%@o\3Ϋ ;BU߽H\l a Hl£sKqkY WY1T)[0?S"Dlxd@pnW݉t¸<-Ÿ8:EC`Ӗ q ȪK<¤i4xAm@Kn.>hGڀ|dflW}X8Uґƌ®2;y,N8c_tM$^Ƕ?ö&:@!Vnw{\3.L0&k= e=fИ{N)C BH*bD4jvVŌƎ[4>V2I&BkHzoIBp~Ly8Ta͟"pg)( @ 35HvSL:?l|F %* IP9B/L%0/?ܣ6"?=-FRZdfL$́!G~C$*y*OC3Zz) ̀;+QW# . f@$g0~N{.Qc]zb:6ukmmgC l!c,TFH6떋 hVʥ]13"4оDi*9V*YA$Z9f8Є\;Jh &d9݌,WznO=b$ hO$ C 7`[!٣ $adjvOQPp4>_OP*zIh'@VE[&Z|8#3Xp7)#T ~n(Q݂*B4;8i<.~{SDMff𕄓,J2Td`|I>fnCꘛ0Kg{n̗$H JktǚNOP'JI Rgx1xcI]|_HR &w1a3l/@ȅUhJqP-XLAkVd|nrTHg"ClaS P:91NeD'V& 6$r؆7%EVz"(=bDeXXHɞYupDQC2:!1mJ2˩&!~UqCj{R~$;q#"\y1БbW0RS*`B ͂c ި=T .=wj8xP EyO٥2(*MWZÃi*&ӓҢhnY'B.ܿ.3E5b6u2LbR+gqV/.=π'R}gwJ)pXr̙o]n[)~Ԑ.!-g$E_Enj@z= $'{"Ilګ!K.aRR`QrfB \,l<p`)2I`0* M>9^-헽yTR&?2UGB'T6C}|}f =kcKzr7:?΋عUkldvme~z \;N7v1ʗZ FfUkZ3_w>SOߡ9 |>@{|L-l 53]h]7p_u9h\E,W K_/PUpvA!9qtŻ !3(F n'xnUW) Yˈ YlK(+lNz` 381G3[+s7̔89@7 'M_Fr|s{ +uF9:{=`=0o Eq}$=ZZEgcyP#O3ih`:M;iNy̸GΣy +Μ!>)Ϙ.GA9L0f'[ySL'':;Ctk??G G += =YS{OnMQUepfTit\FHM9}^rO޸'mG'i.*kS1<)0mAJNG248+W=vThax{(a2c{ǎ3y!ѳ+w /< '8o C˞xZ8oGӕPz/s|`1p]=8wwLyޏra;>UDcgq;;0GDj47O"ٔ؟p>誸+UX,$+'z R wx9|nWj7gs]zV|ٻćEfrwV;qboPg+lw)7O$^mh Z8g1bE)6?ƛyZny̞ᆎU?}ZPeR=>KM7 E `d[;#\*+-,V;M"==m`#=`>5onnA+=ݡJj3ݡyxR>t ]W ѵ\y! WAnzE"NRj"xWA"k-:>~Z;nVȹ4xiG}\O&|լ/g:y.j3]쓻 '|Pc,[:h8Y4ݯ L[<8^) Uk*M:} W}>jva9?>U~<?=iL? ϐO% ?1ax~[!|f:{C}dy .An<țofϐ{&$\aOagH+lfm&V5,݅ ᯑ՞w])z?DWqRZ` !__;^-<[xV5L܄A#J792 @06 q_ކkP6 HuDW#UhgTW,J,XwOڗj":UlKX<}*ܒ2ÿf5!ٌMY`SX^a+< h~䜽=l9Au^Mѣ ?~]䗎6żeU|>#}fT"2 o<K!!NV,0V́p*;Et&౜ _D2%+Dh ЈuK % %_QFT:~,TL4kFDbyv%_TlJQ^3"ŝpqP-Y pr]Qvf愓p~T򨠌R-(=/XRjaؗ V/\T 9^!ECL,wyQ(>tART@]l> stream x\YOeryck~00R_jowW߾$3bUu45 6I 3/(nON/OL.goNaD0 )hZ^G™Qۅ v~=~PK1ø\a;)\IhbB+5l`!aR1R~B[it[75뾻Z7 qX)q-Th!zVJku ?\BƄЬw=v{!E,y)Dp0 _lF0<|y}"lNd= +omBF1a?QnGK q鯾^`h~\*7bڊ :8 Z,ğ3SشM$!\ .J`c2F 4fFq~NkpQ!twy~8ˤ)RH 8O=Pt(ј5 fݟp9T7ay7uj>.O`o+؋0 Tfv>FȄ TTyi'd3gc݇.鸏ubE@u8=TxU&]"V$uOD8D+vɸ b]HGv2 _nE?[3#*a51bSf~AGJ;Q5]f >Μn#Jm -+g%-֔n7yPJkD$Ph 2Q.h+AGvy=eLJ,l \ {] l{HEF%f>WcJf+fq"hto=i֘w5zBXNAT'*hjZw':ɡxaO<۲~Ā`ӿMS=]J]!A&BJX6;BTCTsԇ:{X}6 8.nĖ@k9-0L uR]Ʌqa!p5BHCT9H̭gY@O9g7u5 0r hh^\|gh zDCOm`f{,O0ؕSCׄA+mpY 6r6M!6Uk2tK΃`h0w|-Þ} W; D hl~P; rn'qsf' I{$( <2 HhQ>;h'xPBD㓆Y9j]P}_ Tc.C +ckf%9oM` 9k̤3mX٠[jڵp@34`MQ0 YNIK=y:h- :ӘEZۉ" v(aHFK|dZl">"c%BsI@Z U9s,aIOD^8@ۥ_✕qs_\vZL= /X4@._n$K``O=!V~Ofڝ7T@]۠B#0 W3ت'6ݣrb%jXc_c#.-!>A {"{N2c3@Ǧ<$hIHy{ʱԞ [Ԫ~jJG&/qB.lOt !څ:d||X&2Un;aVz_0^0&_QVL4cϷT*Q˲U崪LLBe:ՁJ}2C'RE Ŵ:S4w,U%[!B/hh Yd?'D2q/C]a%(UK=?)D1 S>'DQa;# ĥ;Cwru'x}nMm%Huͯ\<|"w5vrB۔6W ,$20R1;PX!vx^^!w25\$YK-u " t]y**+xn=*-xCp?{)xt&d<{뚪pΏʳ!K>Pv@QtHVy=OlU#ۼ.Oo|.2eOgl4Ņ/{iH k&qPKRg۴ƪӲzv[I11<4,^URQǯz:kI#Oubxwja/=U.UKBvјoEiR/:{ڻϻθ+[Ϻ)0;^aeX}AeWu}Ah%8|K T0,v&i˫k붳K2^pjye0*KֆZ:|^𥘬30M^5 (R u;y*ʻPr/U|ieVtPEʆ5@m&D:uY]{*]"VAi3Rqvjw.$.<{ċ b`L).yΘ>ASKw{T.t6ye9޽{?cKjE^:ձ2ocە\ 8I\l r]06QnF QrxN^Ng'Me8U=9'Rf5<]{ʎ ϸ<v3hm Y!Tїt3jgyZoڷ}SY{?sƴF뿼U;qc b4ZA*;Gx;7>4KFϛ;?8;#\h"]iL!piL%7+?6\ nGLesSӽ_t1 4w x|1*e32lD'6e bbNR~Tq|xQQܕ}lD EUOnF Lwnzֹ9we\/Uh@>CRLM*lNn %2ܟ'H{vݰQ!Eءv7Nx=YS b|&i'ɯ`Bݺ咞9G?]R|GpSN*Dd"`(6 A6G$?').ԘR]6$&w%V3Ɇ9ѣN#Zw[Z UE =#CwW?vEeebTFr q_=.\bf1jʵRx8{<2Lӗ(O7ldwY]ڨ0tg\4j6zd2yn >1]C!m2> stream x\[\qF?bJ*ͤ8G_$UXLnpo+ gpf/R8NF_nۅB/^](],<RESnqxz? ) MX`Vr"U5 ¹ (n0#2ZRy -q9d.u1ҀHC'3,ߤ):bƊIXY?{c.73EXtd*!;'Ɓ^9-}ȡe *;Bzlx/7N6zp9`t^$ P|l(%6׉"tsd-*ـ|Q:(,8xEIboλ>֧wq'Dj9N #+Ls vxJ4e!7n$󨣽UOU@oP,YYtfL K/oPa[HP@,{3y;.pcA0VLs'B8X&^rU)8Hx^3Tl0 80 MoMP S)Sle৙#OK 8PKF-N- QL ;.e nL ֜%i`+&[#8V7ä} Oȫ#2:BAz "XP-I骣㤏;|ډIi1?Gyy\bolx`ұ6`(r 汸&p(p3N^ڊSapM: ..ݣc.| zp1uXbhmhWumY\#b_YNeU;M9I͒*iLhlNJluz>0٭QwE(;9Q|W4j6"9l553uWZhe%)Q3q b *3E%,*gZsP1fg? ŋRGja}l#,.&u}s~G)H7(7r2j۱=lGC# 1Wv%THwyXbϓtZP2gpdSke 6$n7lsi8ʛ}>u1qSZlr,`]8 ![8WDth9L㨠r%ǁ?w)3e7#% :kv `΁~O;HD<-e-qa?""J!!Em)2Ui) QR@EO[C\FL걖wC5Э~DXk4o*}[lKf9IwjƦm䴚0v54Ji~k4LIs~]kP򐥔c&̧ͰLh{A͏,[^O .!N= W%BQ!VRlN8&jic˱~ޖ%ڊmz-MܤGO }@esT^oL>pNv954amvTaSk¾!p>]jJq?DCn]&E@k|Ĥumk:@ܦ|NӽEP59$>4+.UD񅟶[}zIh`mr'ĚقDE3!Y&wvYm?0܃LmDŽARo??Fcw{y fɽr01Q^#Y;=;Tt#Z[:H3C7zL /ɓdiUZQ_Z Q:)F-ޓA$J?ی 1ЋK=M("#%ۋo=d-2=s .\y]_sinp؋EB0}WƬu ZCU[%A'V /i.XӢ/!_5b0@v[!ݲ94.Q]0zBh?YBє1m8"j$:?Ėd|rX+TPۻAƐĸTjVvSሶzׯFQhL=)0iL:Uwһ]uM ?lS |dV,3O$v LNn.φZB0b~N-^g2ii h]7)Nz3ymo׀aC\)X4(Q+IKgo(Բ*3Va[#]n5f"$+uTco3|6nE]ٹcvoU4O$N8kj;aRoO ֻy=[#b Z⽄ꢸ賻);.廧D u/8lqWsN[‚ I~9++fv7\/l5/mqKN<+L -c¶fQij3;s- sfS%מ"3ޕ Ԍ>]ӮlXNQ$fL[Y=tgR_EKEb*NdD 0qoUmVOzW6c`b4e#dO Vm?7{4v[Ef= #3Ew˖2Ulxp*.]'Iړ'?^_j(B7p}?HP:oD^fu^# )Z&uWeH^'m1x7`|J-MǓzofJYmZO~;MwQ--9¤Ccd.N/;bZfUPudѧ /ZqQqK9Χ;睯bN2﹟"`Qf27ZI^Txv4nűVɳ@Sh61[vM3-_|32 㫔H+_L̏UEgTC:$em0f]F ERɛ`A"86zKWn!^dj&̀o;Y\ 1bϫZxxf(k7wY7P W_9 #L{;?UɑG4˩nQO2,bꏛa> stream xZ[s~`/3]6Y팭8iۜ!u%1O~{]򈤕v'= ˹}r&I-JH/tE;+ 1HKb쿚"΋ <{,#/'?,VmIx[;~O}M`K"[[lVepnl3B; p;(K O(~N- 14V1_z iEwTQDzL0q ?_HG{ƃ*2oQr/}R_ǽDXwnQ\3=!0-`ؑ\$t;'IF5 1S]~/w NT鋁*[-Baf#nDW=_=('HS0kqyXZ`Z]u!Y+-TWVY#wV ?SJTmJ!9Jf]H!9 y lZwh%hT%h_,y,Q(Z- נ0u"-*g=3wFo&\$(JhS/1#rw";Tv`|KNP h"0Tz/;1 =dRjڍށ"xےZ ozo+=;T$De퐨;_6AW*8B A$u$]I툰#TTIp&F۲;G8Ҡֆ0Sl)%dͨeLWz[UbוgPmk93!ke%T2,af@nBQ:RJ1 5L읶(*Tsz] v qJ[瓧s^l`fLr8NuL)A'~gIx 3O*"MṚI \ ՈmXOܤT2j(hUg(Zr<1:y ÁYVᔶ8O]Doh1'|Lau L%uɲB*[e!HG\R94J(ƈ!OUfR4bƙ5!!}2d {z^c-\*GU(+ʎ nu#aBln"ㄩ$dը$sN6c=Fc77B,pJHG D{ O ܤ~2^\ 5ƮG7{OgWs55prAƷaWFrBӪJͱhX [ly6͋_(!-3K`jgJz]HOt@}ŽB.9Rb0nuN~`y YKKP ye'B2o97hsBBzXGUc7{s裯SV@us%S΂kUĺFpj0aXu+қH5܈3b2*si=D\AQQU/ߵ?S%noaSR V69pݭ=*k[8a-"+ v蹛.mR]1}>Orm~2!P\$û^t^Vshp{V(XEI|xQ$fҪHJ]UT\{V} Hյiio Bi9a7x>lJoxS%&J= sp3D"\w '6?G;.1[  fDiT.D<puwggo w')tf M,ȼ"8|KE"VI"]dNa$Oe14ԃ OJ#!1!.P1s-__'Rg6+~$Sp1iC8xǷڔ~5u1aYR/Q/uhu^3Bˊʢu}ly݇A j=3|ZgG([4"_"fQ%iQl  1eFMvo nM <9Z!_uCbH/ "5n|p*޼M*$I {RԘJ_FK?P%9Zw$ ҿR*V~ )C O϶Ns;|Gu#z}ۏv@XDK(n.֞N &endstream endobj 404 0 obj << /Filter /FlateDecode /Length 4012 >> stream x[[s[~Îy%t&NzڴMc>8􁦮DJdGuqJN;~|Xg WGΎnxuZ_͞.a33?z#lyz3FgQ;1[^0, X{+p>gRr;bi3a00I 82, 밊`@rvq.&LaTtO[3 CƸz-erqaGLBAuƥJf)lGxYڝ;2q"q\=:c֧]3wv PL t_"'ΈBrq^K`p`B_PkE]t_`3 <ORgj8 c<ZsuEj8}: ՚?x`Wy.dp) Q }|&UÔIf_T#[YB G5֡IigGAWČs鍞ygW aweշP#f $ԌzFV.i\NDxSU]9;腈!XQ<~ҋ$GWdS<"fs.IKNlwU^.챛 S%&,n5Ar;bKqPk[nIfy9:)>fcW$*>l,J#٘߷1 P $!IE: OXڂQE~ (IF%Lҡ6wU#&ED˧h:9$d56wDDp,092t@G38A6* ,LB:Xsg@BPA@rH$ H]ˢ_Ft0Z5-A#c%(l\~e՛ԧQ.Rsg˹z8$DH; SL|5q/Ay'S3wPj:!Z,u vdB-ԶP,ԪP;Uu )3>pd}Abz3p71PhoXHѧπ2%f +DݰAtsUF PlEo ک 00*DHӷ+pܨq#"~ m#SQl?uD S2kĂy! $Y}x>^W?쁄T w k@^=hy=x4"o9/:xUWz[j,mgׅ$d@ 㢓<+}̦3ޓ,LAaW  IWTi~Ӄh:84W-{rE^tnν]OC]v\&pMjO9/;RXM):ˠFɵ"+Y1zJdmj{UWVtTuPЙaWR)仲IУr%G "wru`0ٲ]O[r\Bz&m'sE1e .jy>v)TσUu~MɞT7YmoeP|F|,ەjP~10aizY6fn uw֫WX& /IbJ]mg3PEXf.8#xUvYVRcEuzl/M8ђu$g*:H?rkW^-{, Hz$1\hIb R'gR%i?Z>\MIݝŲ'5qNv(P1<4w|ǽ:~q=:.Ņ=bBhMTH!y^$j%F>Cf3R#̈QA QTh jWBY C nԃf7Jk_S,̤60emvQ(1b|:$KUȩ&>:m&U*ʚvRcOWd\CB5_3Uۤ&4|3ޤqХ6Wۄ'v *N  gMMA$q6I{4ɃzTQގVM1'4o mSKIj-lN.yZQj.)|*=T`[a/;* 1]ݏ$`׼#2-QDmZ-?*5P>ޒ֍X_\rS4SnT uv5Z;8Av:V+¥.ηdrsP#R ]+,ׅv3]g:Yݮ.~I Q+ozÝ=6CK!BƇt4vli.NƎ{&gCڍ-)lizf Z(8d]դF7@t׽uM>xJ|&$`j3}U7~7W[s{>j/IsFx֫~E7~+.l, -]pL6pmc~ruͻBWWmqnbN PeeЭ5j@Rsqk |d&rm3\1Ǡ[OH0=fy| 7׹U.Ue9'-`J>Z(PR-ǽMk@3Ce|S$uVz.k׋[B{ \Ⱦaٴғ}WĖr֓OZm\OR{;>IOu_zdOi7{eMXaݑcu5EϖG?պ endstream endobj 405 0 obj << /Filter /FlateDecode /Length 4089 >> stream xkoG ȇ-ߏIa;v"PIOTu]ܞmqp^><wuD8y}"3̩}V]B/M8u6:NiZ,R*4*t+ ZnТ.M01j!k!d"aS-qHD1B. BXi郋,FgLh6%B2$Zd+@6v2,p@:_ -)^6PVd\ SAn+db9J@"РB޼@?֝响 Nۓ/~"1MΤ0%:x  Ԓ֦w*DPsPF#].*t]ڋ +tW 혯?v;.8QEe{3&Iխ$lwUM{к؂J*Q:`+=EmРEm/PMI%uOvA/ 42RE 68L&lN4p edPvMY@GYlU0D_0}G~ 0u1vrZJ>zZEj^>zl+ }{'Pe*V:bg;]6k@U9f]+ Ln{YI.@-`mOĵVADXf'o|!eE~ળ]-tDay7QQ4]2=.-0)|"Ih|λ$J|[+ﺽCy'%.H}.eLL$;ICH95Zag$aA $Z>hVz^]ž٣h.dK*rN3c()iX Q{89"O0vy I}@:7tԟ1(8%5Ra6M RhS҆ۮOqes:r5 erKxGFS)RF1a=8+ ]c8i[+bMV,`MDKhLܐ/tH" 6_i 8Yp7,LLޕ@όD=')(;>-JXIȆUAwA]wt$ #mJ-nP_Y~xbΉq!ԩeݸfX5OqfO=&ør {)bV5)"7e+ecU<}{ċJa,UNHN^n*i#ۇ^r y½Mգ+r0gz_G!֓u!.ٟU3 /Zm9[1oLMEؐ5Kn*tE>tTkOv~nuRCB+BRp{荄.TUr~<z6rH̼kTu|dfe; w 5wV4n&sTG Q -HtKPy/TImSJʧQCnIb>]ѿBPX37RrzhЏ]ن,zpF0 c"͊ǜ`lU-RO# vuȗ,XnZZ] ÉH8óa!>5o:Y!)=G\0-c=5zo!e&^2j7ҭWF\B4x|eV0D%.@B(^3(+ɠ%P};z \x4=-۳r >96NsnU%hog)"$jFE *a22c.lXcU5])Ljzp%GRl:fKnke] @Lj)oBw&nv]('loӰ]e}n , B-Ѿ[&69KҀ3>srZgۊlE8ϝ% ;kT0H]Z]8J7 3THۂK lE!N*& [Ô"lִdډsdTUH["T6*KܥPޕc]֑spY]kȷLmZl{7UwקB%E7T[W2hlpDʈy/+Se@n׫K'wjeA|WJÍTV-pZ^#qA鸘>!Qx[#ڈMȽu?J!mtQ-&[>2pMļ$J[D⤵;tm0sUQ ?jEe)ő4V2(ˤiň3鴻%ͅt ! YԳkR'}`%btt$p|_%ypJjoE ɻRY^s4x8 h |[L~N"==if 6Mءa3 ppw>l̘Zrn:=IZgISC$vqtw3yPH M(_]!vH\ѥHa%k9>F dme TT$3&,8ԁ)b;䁐Zf Dc+U=7BqZ͢v B,ՁAW%Wf'׊=GENR_y5/zoADaۂăO٘cڛ q5gH0)Xp8$NQDE9R83~ZZc,je Q'ҏ.:2eqyF#OWZ PN$~[YO't Oو3K BV$'g'5ڂendstream endobj 406 0 obj << /Filter /FlateDecode /Length 5738 >> stream x\YGr68pc=6!` Xi`}hδFCjŅ/򌬮jhd/q#&_GO_ŏ2)\| -):6Ͼ=F0I6.yOOJH=\dp.l\Ik1z^ ^Pq{m~vBm1}z !q2L:͍ %~QJoY 8`Jh;zG|z:aHcf6M И#^AЉČjQQ }C=ցIH_Vڡ-Bpy"7LZFUk,V"ʡIe5O֒v`!/Z/g[C_?m`^up Cfb,p!u^S(#xb՗{&?]҈r}Cط} $]N2"s#lt*卋}f2 AUʤiFhW~o tE |cWlQ*̝gtPh!!Fw#{SpNm24MCD#ܠfex\Bg+ӚO;gl 1k$c!$sW"8`e @ˍˋmMVm@VM!)"8oN ;,WIR?~@Ée^"4]Ev2A@=Ӷ1ɳl+釒 rqr$m#y)FnV BZX,K.$BAk;N;= ǼL ޷L#WZK?Sk4c Jk1N Ԟ9ln06v&4ȺI |TjWKARNPGֺ>jO/LlXy, &κlR`bȎh[] ؇zt`}fqD4M<\kffu'& ^(ԍokK:"Gu'yQH ̇:td %1 $nj߂ ê2-c?y2iE-7/l,ewP9 a[QC,ƛv'S2 H]oCgI&:J o뿾Yd\kT.Ϛb lM ZY!}|1 Kvͳ4-Cwb5p6ʛI@g/ix 4I}BkW 6ۻcqʌWCfsNE <"*t{bHL>EbOF!f¢;<8ʚ,`K54C[h<4ϝ.GyQ ~{~ζAA6KM&sl)شdmFV$_\nZ%VN/x?ORb˕3rYJV0b6*cV0*ݻaPp8f'=6%I9ܜ1l}u쟾 2Ju>pX޵e{:wW釅_ߴ'vuS鏟/K}?wRt2~!H~۞=}֞>mO”zo*'j?ܞ$ӟ!Âh'$F$o4zB:Bz ُs2l{$j_^HJX@3l%3pQ[SMCR8:BmmH763ڵu][K x9m VNč$ )9ҺҮ%I9m$JB{sҥq%]Kܤ䜲3X1IXʇ?⺴kk2nNF F U@8 G.+6.#mXIrV04Kns֍Қb&]JQXX8'6h=I5_? CHa 8"[Z, 0wF@`9Q 3ڵu㹴Fv4)_VPYMJ%hk.Xȅ3.I8Pv lwD.-Z掶 tFT\uڷÀk7 Qm,cJȽFL$bj`RoaY  #9ܴ@"4<贾:c'5"dBd.Щa޹i*t GC~ :5@3QSU)!ahOtg"vn)w~4yknyk JZB񐩼L +fj8nZ R7H;YP,%Ȝֹ0rAb~jlaN474t'SӤ|M΂N\9/-s%9wX6jNrft۷ W嗣 rgl]zSDk̴^5m*V߱\ꂔ6@>5CW8w.q"瓭no[vK:h${',S<gxH;رjma" r=cW +Ne;aTrKY]EXgg.R *_zT R N(\3 g'3J'e?OҬ ~@NM47Ox'Zd0N@DPP~h1 -\fb B˝4lyprA'P2UxAq fnmV _+&|/l?+gj.Y gdq:$?%HeTG*ZZ4!*F@qUi#9 rR&dg 9s~(d!X^Vl{BzKt12{m-Ï#,fݎUmTA c/hf=ů3 YO51@r%:y_7?3or*RHXfT\^jDg3sSd.CZձ 9\=_NLVl,DrbZϲšrn ʤ2V2UܰZ{$T8Vthd|(~^($o >ʐ' ] )7鴿/nA_-]hGcU!RBUH'Ղ5|zh]P4PAlש>Owf(-hLid8-!Jm%l6b;ln4:Pj% k9=Ymow_c_<99,~6'ժBrT Ni~{!-?`r%CVV)bNksV:9 ݃+i 'G !U֛o /.m 2.2SpljWW8*[ 'J]A8 FRK7S(iVdD]uX)JDJk7;NEnRZ] 5M-2E00Ik~645(O UVR: Ay@WݍӎF/;ԑy:b4:̲~ N#ME? μx!k0DF%)w:Q+SZeN1=bGvinyk6ε pey ccô$ɶء=у.xur÷5Mnpf=)l{ڒ"/t(`I<_w(W^/ v@xIbؠ@`yAH6ք7I҆|8~Dh bh#[LۉxF6AF虾gQ2}%r=H^OvbR n r1( fLH=N?R [L2{`ՄI|=e,yple9J_/NDV"0|&$yrKʻɐU+<:MRYԻ22!jshnv(‰ޏ'4熧~_0|t8IB#wy+O zs1\/꧷ ^n/|~nL=!,ͧ'>j7̒fW>sJX✺-VZc|Y3?Q1jjJn>5.P&Y9Ha֫J֜5;cJplJcVH3)̆4FGÁ qkX6w64D+NV/l:A> stream x]Yo$Gr~at< I^^, c+5$L#͋#22#shTW^q|qdi߉K={N7tsD_O.nO:7F'8uBSnpo;[Rvީշg{*r!ܺɭ{7zWmn]]n=֘[7ܺQ0̀Np"DA?Qvuy enj3>ls!"oC^J.$|ϝ4,0$Y Na|oW/%+Kx^-{Ǵ.2.Cd5G#RTun]V:rl~,b ǎ9Bǽt(}d(.yg (7LRoNt['6 =um>9,r_zw (u~Ⱦ/fҟүGYZ:31tf0\MAdY뉵9 {lMjKM/JCVF-CsNn> ?* wgx9g<Nn^&Hwi {M%,~@P;V;2 NÒ|F^kġiK]פ1qM֣҃K1xϕs pOc,_8ޭކ su^^\`i׮&WZEGH10<-$,-Džs[ޑhU0f@mqFнp G J]oĤ5.ȻqGɡl,) <)5lҪib-'30VXKFd\h:fgg:Cg'z`&j>/; gOhu[)ط|jz]q}ܺb.r' 3 !&{ %9-hja:$ya:<* ]UFxbQ ȖђiC+: mXFu"ÎACɐQ5[)W u #@u"( tWT@ijSq,+ ]`HSuq@1^_GPl=^eT^r}7ۀ AK|QNF3R-Օ|eX,xq6YΆu]45^u4)nl U x 9g1.N!c{QK C5OM.Nhm,8\zb& ˂~O3n&qH@ڠ ZH"]}&`baj>oP AR@$B(#s2-,0c LLnjMcz(A#Q6u!*UDyRw<ƵCEAY9$ûM^Qׅh`E희A҄UPT(P9 C|bxDwPu8ʞpܢ QdA|L {{=;P8r6F>pIJc " =KzKd1Oc];ipA@ R:謑C`PB"(pEI¢ɑBj¨,X^VF1}c$/ctǙ,17׉"ŗұY4@0d@4NCj0zlVDwN˚-< !l2Sj;c?U[fpAт9Pe,DQf<\|sQ؋@πC(6s"nvzI?P[fb`ҹ Gr0y2f5JWh]"1u @ɆB14S!"vQ zQ\W|wJԟ z G^=T}XVnfx^,!j-)F-@xd[oy@3N &6 0p,HO,fC+n1{<,YpntjYQ>"n;p*YR _+`%Ѕ *hj(l&eTa.nF!2b<ҧ&\.DX"4ﵣxkz??PAk@ G#W%L;eqCBak95|b'*ˊ$*Ȩw);8IcPLSvY)׋gje#jm\r颓42h8N9u.7 8R44Y_+ea*lM9tgCO6m\_4gG1P, Ap%:%KFfK,ew*lJVJˍnSHYK;qñf_=܂?p,hĿj`a-3t@Iͼr],w:3(g5CTSAژAb1*0NL-*%l% ȭ Y4{DDnQ7]Ix#覐SЌnc9ĒfYhݘ-- 1*0ę!;m_L̮u|e>й+A߮HRP %L$eC'[]բQ|?n P0j"%+(*> ]|7oam BtPǼ#! u0 ,rdMT - @t1~I*:i.PL" Puȫ Zիme;`NEf u&fFi]rGUc_n弙~WOZ76TUe=Jׁ 'j]s=Hcz$pջq{_ys4,%w}s&HFl$1{φRgLn`' {ަ7@{cC˻AL*9/ zݞܜ1h@FV?Cqq6Z4V5pG%ثA<*okxݫhTufk$TO Cڛn,mxkZzN7c% U= 8Ļ6u$ʴI9&Ү5FZh<=gag)պad]PzUn}[gB=..P}G*íI74U&ғ\X4M/@_}rq|TB.nrۀqRɋWeFI,dpsgz#Aĉiw9{zAzl@;M-]n"T <]՜1î`iO^}X4_冗ec8?/N!ZC}R"n9H1-| Rɀr[U۴M]Sxl[DhF?[{HyCe}ࢗCgu8>J¥,˖&E3E8V6@ j*r֙; (B*y\@:DSgRXTy 9]NWH HS] 7*ȷXc#_p ~3Q/%$_mm' f{ƤNZ-GT DCz$JBacSrHIHC.[]oI}:^Ej2:LX>'QroMH냘 Aw{I7 CAm&*FV K{ѢtIC]8^3i >Pׅ"ӌY]cʞ=IN,1roàܷw 2}ݞ=ҧCg?˄l7 v`r?OOY2LjL0?P|ңׂwv"pv翾y[@{4>?3qc|i_ (*ő"Ln@t~g*-3G |+rO[fCұ֙?]o<}> stream xX TW֮DDBbhkq!q↊"M umA5D dĸDq0Dͦ"L׍$9sW޽P&(@`x͆Y?QW>XSkWanh 0IèQV0KT4 APXnݴٳv>ulA^?`5R_ w)O?/iG_4tΔ)QQQ݃'H|;EI}6x{I"<햆Kֺy9cqHPhKb&KLQԜE!C , .X+c6`o0ivO3ߞ=g ZGFGS Fj~9[@ k(蚐EgϽN8\)q)b\L`OS7C Q8&o7MOA~v9ZסE?g+}"q;_ߚw[Gp~NR膌{oٺyX$ú(Ĩ яν8gqb ^TϏ zPK#?YE6c1-s{b=FMfpF4JO@;iI8&qWmpQl qpqƢwow^# ;-܄2auϡ'[ 3rD-ȅDyZR'G3o8QZ/ЊUɪB`J u;:~T !*3̦[v$YAItzOڲU|M.eWۛ.sk&.x_TPJ>I3)~w\"Ceb1>g :!W)XAzYq[ב_!c@Ewp ZZgГQҾף@LY=7ej+BoC<Yo'Ղ(,#H){A H͌ s߾)X-L$ks=1a.S^q*K/PjdAr K*i4yMˮVրڂ?C*s!0{G9f*~L4C28Ur<~lO#-;Tf РkhTǰ^@r.r&>x)w6p34k9|QY ԣz1W{9 ۔wЋf,Tl(]XʀƪDyMb?ETdX{"v<[V/~Cwh`5ObzxJS!\S=,9=-xm9%sorUz\0M}SeKȅ># xpQ{\R9?R/ס[lن&}y`@yt"'b!I0Ȃ P 9"?4?ޝEj SYix?yNЁya2y"g،EڴPCvSIAn4ƌR)l&|efz[soJnC'o;煠S=Pygn$d&m1df1!IV'hu~:Sg- XTՕT.pMէ@Y@z||I^]-GWp/W30w3 D a[>pMpJR(56ڋyB7PRE  !M&_$ Ox7B1/vTʓk6S$!޻+l&u6! 85!#1BN[{ަLJ@)J-PJ6u@]Ck IVXi@+~2Eߗ U~^v@ܬ>;cbU,9:h_mSky QCeA% ~adBFf^P@[})W?qwH@* Aʔ4N *J)" ȴWU w'PQⅦl\G-Y$.yP"" nǼO=$u LG7G!{ҥ cBKt}uMIX`' +4'<%M$R"Cfz^=ݝs b?|S(w\TwUv0:Qu+hj}:Ц:ZB>E:l @G{{6*i߅_ qpX(C-D %оwm!7BvQ/zj?pf:-a)$N42r̬ы&|@O3~@}^R$ +ktfzlח$pYcjB$[φ\ÇGsB'rk,gNLEj4P=U@о/jR# E~5Ef0| _QK>J ;Fn(DQ5{G'jUz:\O3ī2]bƆAO;Sf߁}ѶEQQQa˸~.!3q*!&ӧصVFv7JZ0k"~1G5n3G8O]`ۡ1ې7S(= @-~ۗ`?ao[`8.ʆ0\&2nS+{Iȼm9Zhh :!?b̞͝TMݛȬ3IPPyXcMN^V1Ӱe fC~RP Ư"44q@ IN۶uO2_v!x9`s҇x9ۙHN,|Dk󃩷'C|axɀ2jKBR iL:%#g/^Fv:9D0-CmaKDe(d< DOjPW])jV+ 9 !"/"4S  ޟN~j!2܄t,sdį*lr 3 s.RkA=B>]aybnS LY[`^>EEO{Rȧ!aᓼ3ȭ8lj&X@=&9fiۍpCvS.Z5 U(),PC2~ ӗK{e h!1fܗvaV V/VpmzH5lqQ}qsgK Esǩӝ< d\mĈ9ڢ c+`ג. vJkӣJ sm*]IZ|*W2I)>W";-H?t ^NS( msl3)sQ`~FJ` 1Fd /ޫܫv܅P]+aiZE1FW) *& iS,=Blێ8?/񎼭փZA#P89 wk8rqy"ت}y?p=1 Y-vX wPQǠ`.RS v-pyr0RܛdE+Iz2glNIuETI2d*sLQq<ͧ`1W4sXtpMV2msm4UDunQ$HX,nj-P9S\NZU4BbSH>Lv2#M;U=ZsV+iΪw q0'(+ICpɿ3ׯLi|?<,2r۶dAzOiCKԚl6N}!/1LTCx82o?֬·?w&sS3[oæo! Y$;t9 raIH䌈$ i 6=%NbTQܖqY+z֮LE$SY"eź*rwi~|q Wڂ"\hٵ!euskC)endstream endobj 409 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1037 >> stream xEmLSgK;$7Qڛ./5!D@ta 2DJih~XZˆL# 8:$E97`2ɂsٹ fwٟs< ICEQtV_/lm!B)cH9so) VH{iaP" E٫Og9^sZv.1%E%%$p6j2ڹ<#o1یXTqj潜v睯{<8:*Oy+0W]nsa|={6[9.;BhcFwO iP42BT2Q1ڇN )D[$Eȅ.JJSŐĐڐ#NJ14#2#e$ I,9i33~<=#+Mr=CpSܓtk;*_ 4,wf^7^Ɓnp*e;i!$ e4!xe? zH"zٲV%?A]Wz0_8<{cVVN}5 Gdaw&]%N)~`O#t9vhR5$k7|W]UBYWY!` l=5O`,c"Q*ҾBCkF!f|0#{Ql8E,—t0ͽZО#)jGikQu`ݽw3>:V&ϐS1GvG&P  z|jc *N]{ww߼R}":|41^mlTm:/4)6&Eendstream endobj 410 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 * 0~ 8ʀ0%!tpw'0^G#8|QcYZ`ٲcay⢼M2^>B4^!3Θ^?&SM4yp 8榹I*`~xS v/BSmendstream endobj 411 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1453 >> stream x%{LSwo{*":E">6]},*N1Bm PuPA|PO  P"NB).dm!Qc皟KVX~;DDР_(&4KOF}lB7'xV=7FvFxQHۗjA9C4K>?X\k#qA) K|U}h E~~FqR0׫1Kn4PUJ JJ>H9g(x]|AQ*}EQ ha0E)j Rcqxj5rxWtU-.uv]:OCk^Y|M=c/$)U(1d$؛֢ѶarXnZg_ k8e'/lṵOF-=`>gI4S%6 ʬJ@MS*t8{A6s`5V~kHq|qmj9!^A~[//tڎl*yP̛楋CVŨe(9vO%"S(}Z.zh,l09R9/M)k^"*\,3zW}ov9C] kWT9ʍEVrgn-0W'*S"ʢUyklc's95 wͥJq!$*-C!%#}`-Ւ&k nn2.jYt0,&ҡy!NOheo*g~c.㲄CuMI)3?5A8TpbZe](~*}ZAt ` |weXeLly;A~F׮ͩ]:הZ^3) Y]u[ZjۡzsAc6{e/L'I Cϥ(FϏ}8}E-3Iʓ.'W7]fΓW+-Ϋ,Jx((41 gc<ϵ~Z޲9y`RK"!բ|ҜQh%^-td~.q喐$#yIkp,W/ ehJ'.vޤ_:i38@1kGflIY4|K( A TGԭ՜)[cOfHP?//ZGݝV̝l6[NX4ɵ ﷤ ƹ`^5-,,Qíœp)9X0ƭ8uB/ȰU6r(`8i+82e%{W p ZԗןP 7"`_2s%h2vu.(1.]BRp 0GGOHSendstream endobj 412 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1451 >> stream x%yPSW_x<KB" ZRdP T%$#pXLCITTP@A)XEFVȸ\6ܙ;?w9pB#"' _v#!.ixVQxV´^HGޣQxI83Yzfi1Z-vbs۶z9}h-Wsg42sq6WԹL!ITendstream endobj 413 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3577 >> stream xWyXSg?1prOGzm]qK*ZDE !I a K(% ;Ř@d jL.Q{k:h v}8?y{0x@O𬯎N>kqLD.|`zuJ :xy4>E%hŊe.\-ɢPEHqJ"EǬUQ E 懊ճ==Q[ErL) X/(<al\" EDFm'~g9;=燨ZJxLl!> 3D$—A% ?]=-bD''bxо޻},_r& s! 1 ŝLX7qX4JDgRxk ŅϾ|oB#nf/yu:]"J20C ˌ9x`6}a*h=`%;(F. No͏W-׏gl!h$) \r^p)d$J@:8)S rd$]R0C5˨y2'95`|A iݼц7T#^_{>; dthze?A쯑6B3y,0:h5ٞiH.Svpwiv fuՃ֡<&V\V'.ktlL _*{*%!Y XBBS99jsBSxJajup06EhcQgmќ7}?<-|HhXBꚸH%ߑe)mnp2 KsߕC0a"Dysu=3AQV8 x^K.pCWWQsWmͷ Mxc'i$qcWU@"'U$[K ȝxrL۶l |DToDGQQLM+MfIgGEnT sT~};c%/ѷ7\?~K45V2TVhjP%?z2}iNʪX}\w)D56..,R^iD䨔 Dm kk?L@iF!hS ?Pde$/$`[ϡ]Q R`>IaKQ ʌQM V'+ۗ[0sn²rT뻵Iulq~:x_hP>Kx;;%5:AWV7%Q'GT|RX{Ɵ+yȷAH-S#E6"̊Dui e 4([+ѧ#Tw`~ f]̀z˃g>40GCs̟5fø3Ʀ%ejͻlz'(rH&[:#0]&*L?v~8TuAMڵC|ϩ[]pڌa]GMgNV7rnz1w>A*f ckonzJ[$5&1Upo:&qúo)od:P9 bOz_!5IEH%X5iTU[=0}_:sT[Zy /\ VcYm@|n=< qҨGg ]*<+o[t}PwUeW0&ܲ@-'3rseۜEM.=S8o/h(!rBU.e:dwE(<O[Q婆VaKz˜+6DW+EzAY.(Hdk \CW£;?Fj4{Lѯɾ71M)#q ~%F [m]M-mög.[ߞEWtr<L_"96v1lLSf2dJfD4 j]{9\:8M[/XNXi4rՖsO6Hыdx?tNܿ9fj; 1}wRƚ={3- }QU{"XLG `_V E~'h n7SRq{3:оy0`Ϳ\~!eE3q d()d!9{_;=r>\} ePB"I'$„ܛ֨Qtt_"!-*5݄Me, /[ kI\,0;Y'xeA+Z1endstream endobj 414 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1912 >> stream xyP{i9<%F0"x V.A r>cUg۬:zk,&{)?҈_~}}ZBDdlssԂ"^!s׷)xl3P.!Ht:S'r$? K/Ө8uRV4 HG*,]UFE&C-|\Pq :-/ߜQUBuWqHN%Z Ds*YSb+""%>&"L/ \ ̗%4^wu|>%WUu^vI-w{:A@7:CPP)9IL8Zm4H ]ӓ9l" 'GG JI)+@bXF`} }ҡ?tK PVN!E񘣧dJǵv=|f"? ۑCyqdJ9Ϝv?,l}̸?#;ЦRhk+Rɔ'*1RǞԩڷ)Y&-%$Ht3t2 x d#Px!Ph1}»{O]ƄLacq=T*|0jSM̐^P$ w۷W˚qE|zSfWtC&c٢zm9g/d2(2&{s\W_licm\~U3Abw e):NR~Ue T5@ڭ%ۊ"1Y!Zqþ >cRKNeGJ7Ui!3є @mG;$9GG#w;:BxA6fXGI4]&_=˸z{qђNHyeQyM_Ԓf]؄9dRj.[ +e2NRĿQR>[,p7EE.7P<[Wn,-/zʺ粳xU_ kʙ)"8s C@^{&~^beKJ-PXk@>i~Ŭ-5Z/KQ4 Ǒ{#v(OuWUIG`vm(4A _+}c"*b1v.Q]2@QK z_m-ar۫7tf]ҪK)P 5[E lU]j!+ CɬIW}Ңɋ?TM|z߇T&tLN`RIGl~Jj> stream x]O10 * 0~ 8ʀ0%!tpw'0^G#8|QcYZ`ٲcay⢼M2yU!tVDWU}gL/T)Φ SIT @s$Lg);@Sjendstream endobj 416 0 obj << /Filter /FlateDecode /Length 3539 >> stream x[Y~G H}IloIF{ҎVNj{"S=# a luXb)z7?\|B,/2}]/>-crˣE)>*t6*>HZ+۝DcBuǫ΅{Di |ҦwRu/F=Myӱ6[hA`q .iA+7.vj\P"ʚ%Nb~7y4Ϥ2<ȣV8BIZXq2P 9fd J1.zdz3RU#L 1£(T-`z 4(b΁̵TyًC: n9˴-l32];8~[ F1&`GޒoD5&ˁ=.Cd2^i.u`UB B`0F'۬d/DtgwNeK߿BV f<48] MbVOȚI޵r5Xi;}07Qi 6,SU(}WM R;~d1+lpևĠ֠-Ezaĺ])>+1ҋmm45淸zٝhsKa8Z畎1A)R͜K[2~{MQ=QQ2N:c=p%ĪZ G@ oU%<%*`"12f-(+D}ND};!pj\s3:Y_=|^B}f|P#f Ǝ%|QGF"+o+yONw [f!3ـGa8+go*%CrK|ʴ]i._D9u;1uk|H^Ozk^ OLb'%s29R\ y<6 [ʆZ J=xH́jfYMNLhj{_UDvԨ UZǴdC YYbvGQ'*r)#'I?]v{NjFU5<0Bs`MYU<_.%az͓L\Ti%xH+Np9 崽V8T '5T(\6 f) .s~l{ 7 /7h:g 㚛pǓp'03TIJqб7^P6S\wP+o85ؤWbL % ⏎n!OF0hPCXi iwvJji {vKq1 pzO`9HWz|IIRg8jU-A7T?z J jpGEY ~9 SAIl!/B֫ PTWOf:Ũb=B1? Q6!Zڃ <йuK"yh@cMr˽yzKfET?&u/Ɇ=ȢV/F[ f?痩r_5ʗbݲ}gea).AN%w0 nlt{Flzojh R3 :HZf_!2VZhӒX~`%,-r!5RGY^ q[469iL6>Jz.~RQAZ ;pU(=ON-Vf?gmR&eւI=4@RK%/iNXꥆqeV5 Zkn 5YR=)₳U ׸xb}ktw_TSv1`;f M@S =*GwhBjқq+B^;MqR )]%!`FפcICr7ԪRYYo/S6KP3w o-?aRRd(axܞk`D8ld[ tQhe V3A<\m2,.W08Fh"U[mkTyS3YՔ_?ys`ttkFTF 9o*]J!^^ kܖ ֡"HUNQe~QK]9[fk-QǓ~wCpEn?z2_uw~$[XslCypo:'7m|פvDCgx5MB3Մ{NPs%ju-0yPp*W΃(2Oވ6FmommwBp][[ OIzkduA|B(ʤ<*a%x?}gcA_TM@E 㛚I6WR`"YA 5:fPW/l/L ̬rXzk NOHh]G͕C*B5oyb|0)ŀdh3eh♜ .W:w;%f|8&Xs>y@;|MUxWyj: |b}bh-"c!u)n 8;̝`q1"MOO&Sa<`#Uc+ )$jSR⣇X$qS>?%I;e}ǵwi} k4b pSϘ;gf?8RP'8 6_>2e%uɗ>(I[/9SFmThs`Cڌ'}j h?%gviD|atwFZj+eg^/#jAVC~R5F1w4?h*-.a өToG FwC0cAϣg |!endstream endobj 417 0 obj << /Filter /FlateDecode /Length 156 >> stream x313T0P02Q02W06U05RH1230!U`h`T025`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmߚYK\=6s+fendstream endobj 418 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 m@HUt!TDi:{H20gmyXց$i,XX8+/dU_Lq8B4-^!֘N?FSͩ+h0w%ES&qMsT2Χ|!>ESqendstream endobj 419 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 vA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3鼯=NRP> stream x]O10 ZuA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3|ʫzӴxO$ڪZc:AMq6?M%k17MR{;RA|ARSkendstream endobj 421 0 obj << /Filter /FlateDecode /Length 5196 >> stream xiOЮjKAC̊ 9ݙ HTeU753><0$|#+ ?A +/[ON'2==-.~~=;Ctʝ?9#婏F`6ߟ=lk^Akjr Ze>JoQi¹rkf'9Ĩ g\Aƛͫya< 13CW5Di"bt6]P q: ~s>]nroI%vp19 Vs"SU!C6 PmhtdtW`A2E daI7;2v8JEe2E"vmUkwwh!D;rjw_c;uUx̴R& ʉAh?mtCpt+akʼ"º9 I7/y ݁R~F0MWE7jg[@3_YZ2!@ lhѸD&YRq0vQR+:BAU+[DkO$IVjIMUpQn$+B @#x_*tY3uy}\4`>q%%52(#/MhMo^Y6ܣ!f)nK*IKUOD ;i*fQ:jy4B~*q"a +SxdH Z=&#ZU Rݹ5ѫ%/6',ej NM7b!j'Hߞ(f:#nؤ]3Uu/$#; ^MBSOm[(Pa|5e dZe' - \ }K2{,HL=XTQ~[#sݤif !ݪNF'*N'I,YUsc]tRz9<]a^DFU"{]v',р>lTƁl<]4w7vs6BLR -R7X+J%o{_Zk5z@ }^Wh%iB*d+#yZV|VBczT!@VGh'޺ 1*BM*t1Buoj3=7 }G-zžw Cv^W{%EywÏ~m>e6o+c&*,\e}/g|r@B>`6Z'v# ai/yZ"E\p[9R>b 'BW# 3#6#Blm3/|Mۈٲ Ϙ \$sx\3J%$ڎG,-?]UBD[9Vh{y:kcF2`_ ao4EI:}Ǔ7+5@J >(F7˖ZVLKl认'S"vdb,LШ2 Jm'f]֠ /_ !lܖۚӜDg4VE⒍׃=5I? lY6p%?a{6~C'_KV6~%]f%el2"B|Z}t41?Fs)͉X-f2K_Us.molMjo5ZEYUHnqQm,q?~ju^T#99xF*-Ru8xwi'ڻWГm-aH}}6OFOkt]U-`6T]($Rdy]1i +%ҡ!Oۼ/3b'H9(%`6f~q9Hw88uwLD˖|jY>11Hj&Ks]s 㚥DRdQ{i"'z ƣr JX*5(DoPLi&Oq>dEǒ%LK}25i.r&ɔ'g-[,eIE8 ̎b즉ײ}'UZn> r>&4>h{+𮙏˻0V:˾B%]_i\ls>X*D=Dl]}ҩۀFaE3l +ǡntq5fU)=2 ~ e 5r7 vfdh>ZrTV qYIpzޑ^˴W5] Ci"؊s9IhJJV-zIVh].tȗ(W(W4@g؋X7֢湹&=` U"а:` 7 T8WL=77ScY3ռ甇XrNt{\ H+L܄)#K?L57h~`;gqfkfh1\lVN@Y\!L{85t<]6]G[/W%M:Y!U|ɇp}=hMQ>/&Pvp;&lGlfV,|Jif !fsTY0KM|Y4 9kX;k6?E⎵Dq0=P Z"pTvuί3`8~Ѭ Yጼ> stream x[[q~G <́_8HAXrICE4ÿ=_utW$ p8S]U]յg57>ԧAw)_ǑPk~Rm+ B*^| F1|h[UBR.\(?KDke^¡˕ RHHі›'Z-^/{}ɞ/Ii!gI9R%֤x"d%/JgwJz1eƛ5 .2+]X# io#Ml~bg&y[^"TTU|(2 ."Hz_]r{l;GИ8..CLNI@d`Lo۹`2̐Tg9> 6fQ1NOfie"T~nZ4JEjbd{Aӻt[_}}*GOI5]}͒AZ_"C} w_e\BY` vx X4c[>5}=,3 uwUMdI*L$`w3xH/7?7k惯y L~;|{)!y&24J%`?N%!8I#&NӟZ!=}o L[ZPL秥ƿ菄ggg9&ΙW~Q*%.VȚZȲX"ag24=k2Q(>dr>,.LITvvS+q!}W"QQW*%vvBq n앜G9!.( J*\iJ$c4Ev f3E)Z$zw2YX:n]) ڻJA7LOERqvgiSj-bЧl%*V*#aGǴEkddп,FOh± ՝/ܜ \yqUBP𩓂3/N!dl`QI9HEtabY@);p3- *n% LhP+3 WDoT5JS+D,Ιu st XWu2nm[Rkc JT[Gj%#1~$R_bJYImtB<*nIh +OQRxTp h&x:UB4re4!=*InYyx&l$`v"<΢B8A)P^F *==nx0o])[uNgJ_Rx`CҘ#`?E"q죐)t i(mAWÇZW*8t.#L@4ipJHK-wv(is@J+EA0!W&dEu|5MH9`t(kbP~~s)*?<Ε8d")PRMmڢ5PxFmW\~/q+{8G0`/57Ȏ&VqaHd+ ǘXGIX85aƎ*-!*݄XJ@wi7XR86nPRCCO\|9i/1g?`W4nft2L傲bHHV3[&NUuE x,%q1MgH&]%Q!xV ޹;7057mzٖb7X} Ia[ac3<@QRxS>}3&gwC}P6]搢tClf^W>sFDjѠUoaPFnJ"lip,hp WY!S5bezsՍӸ~{nN\ׅ5@& *z&IƓOHUJZk"-a]7o<2_5ebg43P%̧r"&7z]HR8e!nd6T3ݏQ\{oڥuQz&r ̖Qλ@bj#vX9ނ&Qog )$AHMP_.O OݥA3eY IDX/#q`մ)qivz`*U5*\]Pumj* hXem[*jWAd5f]ʸxbQtG* hp`6R}a҅O]W)D!Cwgah<3(VG*Grs+V*sl ԠcqPa5wAW[JTD[k:44 # K$,) W/ViX,$~4l ^~f^̢SeؗE֪6]s0hn;G꽲&{FD@VMsG|5ȍSGʂ%Rb90&DE8\[y($g-K;uCJq@Q3ޤA2o }V"C]Pt'jSLWb@-3ig,ĈS1}j~*f}ih2-PoRZƾ]TTTVQո+XTo+>J{h}v.|VxE˷av4eaqbx[|C<䊂N%&% tJ Yb|(Ʒ:*e G_#C]^GDۀeiwdDp&I<z)}m^L%a^_s\sf$wGʡ|kw,Y@Aaa4*IS51 )j#+ZKvNљf =JrSN&S^nxUmOo Gh2ykD\ i].q3q(D ><ux}Ij;fP9\eeL߃?bo.9ҁқxb f:$xgb܏Ӫ򧠓gόE>YiZRUov?*Os|+4˜ ۘ>ߘ3ԡ3 M:I.2$3FG-wju,~SNhI*/6W\ ֿ~K"Pb cޞcm^A͓:R?W4IHttWϨQѵɝ_I [xTx#4@xcu c>r$: ͳ5G!/O* \PnoU;ZW9lϪQj|G/;$'1K}UVQ ts4M"VUY|F0Pr*ξyQ*;Xo5NtT('FSĪTgslUʶ&{ 6X9>tY RLiu}@AF'z; oQrͷY'#6:vE+p2Uly[rStꯆY<ҭ~.VU8ukB`RQ)|.Tr^ 2uǹhcKˇxc:mx-F۷G}rh** CRBel2(b$xDm˦TCMl.v@%w #cկ.U TjjP"yCBӬEendstream endobj 423 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 ZuA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3\UiZB 'mUu1 R 8KW`JM5☛&e=O) >Sgendstream endobj 424 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 thU@p' aKB,N>z ":ր#ME݀ gnʿ?`3]$sWBi )(HtUwXI%0lھ?M%k17MR{;RA|CSoendstream endobj 425 0 obj << /Filter /FlateDecode /Length 229936 >> stream xٮmIvJq!=8`EЦ R@!2 ڐ*Yj(JzhfuNRpkE3f3o>9_>o>esE~ۣ_~E-yWe~Ki|~w~Ky۫> _>`=O?Ax߽. ~m^/>x^~n7S~z__ojm?UigB=Χ_[__]?~{3w9^ס9է}woO}<v?)O~W3Ňſ`w>mO^$}~uX!|J>2'x;oy'iT$MG p~>}VJ93\{}^fŸӮ_~ѿ;\ۊEyϳ~=_))}t:˃νֹ\QٻW>;dm<3.穾ٗeps\;<7niؕ]y=qg@*w\c{j x-Tmmzv1R0'a]qrWx{4l̨vyu7^iA>ކ>s/}6ʙlaZ寢[_] >V/uO/݇hVK}CyY~Om׃zp}幾0.^=k|h7EV%=KĠ ~,ob<}=[wR鼏LY !>U?~k~祭G\\nw/:Rz\qk-V׏y=&ԯu~^7Yx~Xy\n-֘G>9;C괄`gp"xȐ,;f_ o57?]@?_\J fL53S0X=q3}{σRVo<ǒṪzm,<{.i.=(z(ߝ3)dBpim_ '#LʡĂGт>}I?XJPQlj㩦Nxo1K;6?wR ɹ21|%ʏW+w/i;aO-C6Š%FZY,xos&wݏd'sܻ2Bjn@x\0 (~Zf -MN3Ow~ӵށp4>W΅w§Xnvw|1/WR|G;&._}HּIsxN=2.Zm?XzҜT{5[OG=do$Prmρ|~0k͞hGUBўr)n%=5;^4.Gt&S<{mOqXvzgz?|;0mOب{-0&Qiebҽ߽$N:1= ~λی\>hL?hG넌Wc8J~d~GVr?<.OOW{G7|?O'?hO?G?&u_'Ry?ſ?~{s_kWN;T7=\w?*ܤ>vӟOo*(~v)ƳRz9S ~~6J-8r*G6 ˲a",_?ݷ|\~ iҏ05[r#;.[ֳ#Zћvlt#ig_|£{_?k;:7ζNN5rV|v|%NHB#8Upz~C7,=2&益##tMB[YV!H#-9%`,Ոpz9~d#]WG iCi@wUHd.:P 2a ޶@Bo}a>t;-#Q oHѽrIJ˓[ i YWo5 zխ= z$5OYFzKœ{F4 2fO#$}dž^H-"$/! 2 g5M!ӽo CDBW)FjܭWJM D*c #/H͓UpK#H֯F1],w H,YX dxf-^\ND$LT `˄D*Vk[ JxD$`[Ϙ8 PRp#=d#ÿDZ $)YHRz 8:yFz\FEtd2Fn7Q8@(U?Cel{3xԜ8HӍ!)~k݌@OsjUDcW-Qf9HB9{js##-z棻)s/_* 2}3O+Usw A;ldhT׺/^C_@1g\LSgM=iu@J5GF{?iAɝԈd2"Dw"#v#س}Md)=d/"Ⱥ%S${jQXA"i^隳6c(!0e)#{u :J R3>ShD3)ѣdXC[B1AƧkBuސTwш\]@Z}#ȃ-7K|*YHv;[ U[~tF FH5SC/$k}QY4f-N وλvl y +GxEdf!<R'/ a@ R7\ypf 4s I9̖kУxv>NlСr$m%@+H叨YZ[;<>~< JMSjH闿pLIB@ \v-@ {PɅM .i(È_Aϵ:Zǎ<E :!ᆿ`ė h\힚G>GfP]n?nqӄ>{% _p:ˣAQp:?qX;P)[=_u/  ~f,ix3H^,=HB#;`L5*D_,%k h^%z]~hҳ'+z-', hh#-4q؅hL6bbN{!տZYo較[p1`e?av 1(p+h]3%@`GVB&Wx,*mFjX$0ݎg͊z%w]1HҤFb:u35x࣎/#Ko }G8JA @`R.…XƽMB!\$RKq@4a@5" (q(1%DM-yMuUeG{U ĽzL-3vj/zH*.'8h1jpp!: pWgAwR.-udad`Z1%33^2B{EYVѼEibP$:_79g5oHR.%['8v2Eb H۶^w6cBvq 􁔋Zvm SXE V'Rtqx%8!FS 6r»iSw?*su"PϲؼfWNxz5d*  "*!bvץȴl9bUcδd ì;ԻgSigL*3f"N v8PGɟ}h^`aLXUܳ,@|8 VD?,#2,#l0@c1@ukP:[ GmYHL BPCt!Z͔qh^Y=%a:@ E7Ӡ,NI("5Mv*i iK; 7v} )sL5i}JR2_,pbilέ]EqSѥDj&t U[PFΞdjجd za@=á[sro6g;*ɺ s5ˉMdpSlu~=!*VAF⥙doƦD,t ^y>aW%LZӝC; O^; pk%Y=?'SziCELNs3-:=Ezw:|@M`tFE` i9V `jDx+<̆xAUP]xQ,wA:'WstLaUf[@@!.I  =@a! S5}/JLoDЯ~9 X|uto@*itS-c_#a@hf$axMءkOS ק\k>+He$&|n-Xk ?N$|&!\Ƒn\oLJ@PG |S798  8T{Q؝arx_Ƥq~ ׄo9x 1:Ykt*K@aV'CmPkY!` yl^,=ZS|@9+5AJq;J>gX ع+ip)wS5 r1ul+S0Sp8m4Kx 79+TN zyO}7S+nzj,*5]!`d kM9WSPtz#N=rɕc]wZ&f 7_BF !̹j4y+#@Pu2+\{vp Ŗcwl)Xd8d 3mVB$:sR}z~8 >yt"RrcV l#16H8,95t**C'W!CVCU[Kw |KAc;ͧ ',&4ytJ}K |FR'4WSM8AmW{?<2k@:+M&<=OTJ!vY 9HRW-у^1`(l}W%^ b R& +]㝋mKr3M}ٷRR)WI^u)+Tx %g7C;t)ȎLD]@`omGKs[ }c#Xo[>ԒWl刀/&_C\zӢJė($\'!ކESR x0vcsْp*ŀQ`6=e7i\`8d3{2T̀{0Cyq叮1ƒ%Ѷ I ,eZX׈"aD|y?-ȸQ,0u DX>/=̣5zͣշDuA5vH%غyy_"" O 3 >Y%@E6FB 2ƌH{4 .;z<0@8ыP٧|cF 美1)Dus3//.q=xىWx /POA ?gi-gAҽ$B_ 靟8 w9-kĩ-?H8eȣ)81\+HyGF%I5Mv` 0)SH76@,t Jwx~Bl{uEkt4=#AA͙@,3Qo q\[ÀqA0 %E1I[H,_^T:KCQg7Uu6⸄H!h% } `]΄bFHpQoТN )+r  Vo[v'BLE(7ҌQf"͝1%u8H Od/9uϩ{!XkLa;ȍq^qC|T=GB$눘!zҒN ъYJYr_/2ae⸓MM`'I5K&4el:iÚK؎:zcXK2A[">D"_NiET;8]کjq `2^pAq|DKq#]"WR5䤗Wu"'WrcN8:7=u0,y7yxD=G'vuN񘗢U{9ɼȩS>p+\kHMի\",IgP,_J;9d'=-USjJ1o*mr7UdUUSS+wA¥.@=Ւzr4vWf5!v4B+ժYnߘ@Ĺzk_B9EhvSq+h^"IwΞ)6$XQxa%;uFėx@T9ars–Ǵܜ0oNؖ׎kl6QJ{!en pVh'SZy7 ,χS#ȨAHqvW؅ϒ#> yH@H29Ӟ75SY#@,& o8-D; ι[ bQRėv URX-(,D2bn<ԅX,EtTx8hg}ufO-f5薢d9XnψxnEc g oŷ$SEN>s5;K;)g;er|'S3ʀDYtv/t4?OSGD3!~lyɤzj3"2lecNԗ D XFR}#3nN/ً7Y4 qb<4h`G)_»j(V83˾tK$=ߊ(It߼^B'"=%m' d'4;ODT"no&sq| D´.;;yp;/d^x_RPLNDoeDwQHNy\#Ds)*DX24 ԏ(٨BDdWB5;1{=Za`a[Z^(;  jKb^Ϛ g@ a V7ahaXmP$L#2#oKVcq_  v q¬ :۔Hێ, 93/\l5wGru(@o:$0(wJ =J`mpupӇwE"J *40`}tinD p" kDHL99@> Wg_t(ήmڶї$D8}j"B'Bp$ãf!hO;hU]18, .5a#V1fbkڱJ@Gg7f,r^5t5f e飼ʽG˾r S7+D3=ΦxN%LN #R#73K 9&+HL! (f):]ݜf ϴB5gM冇{hJ%VDʽyj(7v_FD4bᴮ|8&030 $@XV|KOQMxJH"^^R,)KNYve\jJ/+ESL2 (=趴1kֽՑY:U]m#ҫr[ 祈HoXPڝ8 };J $;2Wqp:۩-fxiJ *xܬ$baVsM:a&rS Hy)Ι[D{H\z!ȒKdW #&@N؝Dq5Xʒdʉ#Ŕ-N\9_E ="E.)&)@>30ނ1Yٹc\+2`1\b(L+Du `v"Joy*]r(}A7]U߷N6pz+0 ܎b*+Z>rE-ZÙ:9?Hv/A^h2u7{b',]≭JNBPdhf?/ Hg0Qb@84;fnKt@J2tXS" Y!ᡑ͑ ND \$D( c9ʀdrY*SpmƬn@DYcd' 2[2y̧;-kil&bw⥠<)N[2ez!ln{iPf }pC,^{M] " LdʣlKlK"l~+?ȼnu{hȯ:J"YЊ=JXdc-#da5^9\"ɴ_0YXy{nJICdav1EV/l {&sۜ6 ňWF!t:mF 5LJVWM\H)BB)0k!OH2"7A{$EF@,//EָWw݇"#"WԞ<,ҺA32V/wCa3aB@dM'_8CI ~0x+~74Q$w܊A΃qi4z ˆЭ)BD}HD E%UJP-Ǖ;HFd*r*<r$l)[ݏX7IBi7{2\F)!/z0ڍȷE9b~ e#)͋2)3\v)L1r™mE)㦉l~蝕3]L;jݶFHjf.Ҕ5xM=#F^h?NZ#nu YP%Yw15c~ Y9I\l5Z74)}srܥ@Z֧F CZ7bu\@>N{B.xs }!,?ꎱX"uhL $zFKimd5%Λ+L@<@摚kVLȦ?oΒ-U%U4W塇_xUPKx=kdwʅRNx*\KX̿3\ q.U3u"Y,F͊ IKl(A ]DD ^ui` J1ԗ5bpVV8pc\ےrzD'z~8 jDX@\6\t#&7#ASemZ-|<Cl9X8f#>Ķs&,/* nXJ~73?sg k a(4Ndo8q۾_D.Ң|` Ёx( !zd_[ y% ">{펮ۭeC2 }^p1taz||;`aFl i~*m-hF,m7CgP A:jtAa $~ r&`_9~ۉ0)RUQ&ow$6BKz\E|d={G hw9;PdA1xa2g|琎pE x [ i;l}7Jov":(@e!jj(#=ĥ2.wV9 =]I@"RԈ) CGZtհ)3#EDBňв"4Dbt2#+Eyo}txK-{]T@bel)z @ \`?]Hnue}u+rӁgm0= D7М8{(Nrʾ3V/.Wj16TW+I6Ո+4e\uc5P 3,IeX/;!*yC.x TzAn6]llB+뒲0i&!y_:lt攩E`S2B@xxK)⋈ TЯdXet4hE ;@\/2EH\p-HEž{E1~nR:&%A.&ݻhs"4Cp-;"puvmr6yb ZqLvP?׋Í|I1`.ߢ[7JSPByI:E[]b'Qp)ON!|ǁ],%g>zo2-"]DaPB(oHR@H}E*+OSV[BZz@fˍsD+u[!x1DTr $o>m3qv{0,W4 "m>ދjPKpdϽEkhդD(Xw3;u?-.x/{{HvGD"#KHqt{$U G7e1葪`A- NV(R%Yz "l9J 1+,e;؏b"zJoZ y+!5Ni71논go>e~??gi| d bw篿E˯t晆_O_g ?G!µXgz-o_~_` υn5D{7EQK/oPSL ~g{$W@( }XvHY9=unj9<%܀W5{%@4VeDrXQ儶pre!( m+4pB r&MAbYW\M<$U+m؛)+jl\*E]Z2)g% F#C܉D֘; B̬ȰRool[aVb#bf?Qn197]sftMIQ !@N@dz\^:'dVKWGZ+ra4qrZ b5B"GbX9s.dQ̤ #(9JL n_B*;( -Hl(E )T[I͓$Xu9 sHN#;M_$1(he8e9W2!BV`iSn %g1a8܃r*H\*`\rxp W3츆 \9ɲɖ#J9L9p2Kh.#ܗ(li-5gDoa+K9On ;t0a3ݙʯ)dw>UB}F,SPRr J׊TV!FD]\pd>v;GL+Ư H R)ȾeS eN3S;-D{2AA =+IbDRp!`$F=/b,?˔UEG#O8E򠻯B dlDXl C %MM eC)2d5$_"8DAd|BP@ RR@e8ܾJ{L&>rj3ETvQ'cFȤ5r,FÂGR~~Hf+4 5, S;%]TǢNTǢ+CwP-kاRxFL.gĒݮUB$ vP)FRbpMx[%+9Dc:wS$g ˹U!^uYA8{Н#8IxgʒI C m&jJdqO]:Ihx*CbHYB " n~ ^Ya]Ϋĩ&jHn&1S{ y%AO2ǃģI: _ %?6~]@ғU,$WFJ*.Qd3f4N1hFIh %E X}y^)%s]"qɞe>p!~\ vd7hn`0x%TV2ZTc^!9=dg,%.`J2]͵}Se&:'ރ%ĦIZtzk@\CeV=``9sK㭂6 ԙ򎁸 tحQ9MedARH9 tɔa QXer K.C%E|.!{$(3yU[X"YpW:ߌ+ݱ­E=#pBZvAy ueQr& 1B(ȭD!($"lP뢕(S"P:SqM$<ʭsMYYCR^ged)Τmzs%*0N+93XvEvF+G 2Et%Q o]( >FZ8tވr0A\a[pbQԔcxR ^] {)r?HQ;szM5b`M6z]ЬG7;E"d5Jd,!5<~ʵԀx :?M1V*hTbKR+9q ftԴt{@Hso&=~TS,f^ɻ\s>Ν^ln ukJ]4ҲHE+쮧uӂ`=znGO4́zEj AM@T#yфHo/DVqHE;r]1uF=`C_hݼ. ֲsX2gECdU{ ;W(49(J7%T*S,VЀ7E۪L+f'r[9!iLVY@H?vH~[BI߾/I,KIqGU0 E8oN4N㛢]r\5*>\|A$E/bUH@#9?Us|\=ieHٟ^Vq.A}. (LEA '=" ]E[%5~NlZePBBYCayJI<3…^u\0 "\j|z8svX$ka 2x|LWiMHzPTu^N (`(QP}N)$- S ^$_ȵ/^. E]v/$ȸ1/ 0jp #js$@w/GqD_#m` ahâ nnA+<@1yV@ֽFbqDm+*8[6vc0l{6֍0C2!3]6h0 ;xxy^ "g/ň;S63E4Q`dDzx)302ߧav0b3vxű#j@>"R*S?;Due{#/h=4%p]iy:k@uZ#‘+R ܶpXR6f#=)}dI D&b#8H<bD1)V« /Fv> d1(;"Bp ~X(o9H:a>krkl\ހ5Vr| A7b (o@Ps,+|%xMaϮ#sB?y2Le6d\ 'Hc1U"ޙ*ဘ bn16*9Pv XVE"-%kR%r 0&'er} @jN,oK晒"-sH$-8Ʉ#o_a{g YtlBsDdKd6rFe!׎u8ړt ]rmЌxhČD*hxr,pz4X`%?`wu 7{v@L2uCۍ-ԧn RshYr/K}+ZT~Y IRn7§N"'n&*Ԛob8`;L/MI }Ŋq;t^UpMw9b9R,b IE$)Ҷ#?] s#}Ix'iH(q۸RZ>w3qa $ TR$NGMr7 ld>N_"#/!(:H5rޤ]o@<iKã%48O; X!;iH,N;GZSm$ÎFѦw?iAۗKM  IF &hV[k+Hs7:/j+CDCSfK.52oY ӣIf7\76g)X%"r4[ jz+'XL)':r` N1V=#S_Lċ)iIu&zS nFqZЉV;pRIF%dv[ [q|@U3a0tEW %^UG#L%bj͟ʤfW# {M!6]k$Fi7'+iΨG[qr%u'댸?SM*|\g"rac_ $ڌ ` "@iFV[ ӎU"x ݔiF"[v=#>K3̌b|+݀JR 5J" ׸2ӌhK0[PNA% `J1x#wHK~/D dTP|݈.u􉨢YoK 39G-)bHي*uV&#ݢHrS |PY7m?Fu" -FX.{ FbH+ T5Uual 3i;)cvMRO ( $QnYﬨ ٵbvMmLя<DSk efWv@fz@@2w,"R=HQaS0{v%W ň5F/}'Aqw|Z+IQ # vY@^ҟȺwpDUa·BSX4\&׃ C sEb&^!|t6^١J>^R4 x^*12 ]*˖ "Z W Nܒ (Ĭ4`j%B29!T0BD 9N{9T]l8*@6 ]f5fM6k9 Hjfse0әU|P#"^+3KDFަw >i^,6r=EtyۈX1YepIDfo_Ԏ{gQ NsoSIm0pb @|#LhI 2~t j7 b9EG>ś0^t%x 㲇d+]a_9LCEp%@Ҽ>*|p 94{nш79dL .ENv.*;;^Ua^p`+YUIosݚcEŔ.wiT( ZOW6 P?C"t# B0i)]d)r ~x&s(ֳ|lnɵ͘ 'AGR/4ֈ9#w0l;fEw-hXC Iq#ʓ$5\ѽ9˜N( s7:-vBWuPFbU6o _#ldU6v ĵUp Ԭ7V1$tOe:\DIZ` 9)PIԱ;(~˗#%& Λ J!ĵKP6,`&:(xf"QW~k<h]^ +w9"f^3zӼɑ,DF‰X|W|QJYyD_jۚ%P@xz]uS^qja faވe  !,K vP~-!3̉6yKeݞEBKGq,oWFx<,.y9,V?oRJ  ,MK`'޵fD0v+ ;h"%pf[&`Eje".I@,B#<WDoxih3XBfyÌ-D)8Pe 8cv&I멜D$+UHyT/Q `y[C`y!.J6S 4NWYYƉl.4K2 EDc;ا D'9 D s: .L?Έ `x:̜"?'ǑKzDpODL"zbuq % ^Lԅ!}uUtMz dgv>WB!v'P#gnBEO Ғ^ eƝ8@YzmYMdt# &9r^ @x@ʿJH:#ۈk2??rSK]%I'g~/ dqؚM ko yr KU??2ܦBwHQl#~8@ JF\e:IǂɃLdײ2$ׅY:i9-k?Hk"˻%gF,PB 0"܂@ W"e$Q9QÝ;zc@s};9lE;Ȋ혹t+JQbV?4R֌N{A Do4NP u XC8{KCu)Ykc m55mUD5 T.6hkiWD*lv;:092XnBH|I5CDmzg5f$.5g@|8yւ>g1R&ly9K%Pѳp޾OėCLA|Ri ǭQb80*x^av(nS[/˽Lɗ#f^W^ WIS;ʢjKӀ{rc"Ft@<6UT@(ڔ#vJzu F}nYKKvS񉫊!cUF\hVIdpdxTŁve0M_&۔2W.0ݝ`m^aH`\BOn0]`tĘ@W*&FKAfӄ*A-'myFfx{َGn/J y\ D?0p6բ ]dڰb*K(!41\/tnƧm@DJ(dcr DuQUJet:^4$FD?ź|mt7Ϙ[m&UC.#W.WZFD!/ Qٖ)-Sg\` D,}Yk&JV_0rMBc^>j*Duݏ @`I|7u%)@DGB2'|*}DfE%s ʸwPnd} QZvӌp yŜkbNFQ̧K4 S<{zC ]e.A|fsR d&g!&_ vMMf gAڊҺpqܾbfb{ [ $*9X]_|Y ,|=3-Dhs٫hLB@D3*1Ňz n HNNy buhr1hG_ Tg J_'y8t 0<6<~Mk.(I B+J@dxa[?tow \! &_Qy`!4_!xM4uN 3G(z*z)Ҭ)t$2O3C7UqUu8o>>z fXt2Yw/66u nFz!7;:C_z%Fj4{;Id {\ȥ@ɺbݫ|ٴ B^YɉQ𧠙˿'M{f2M&_\@4MOMb}h҇9és˞avu7f7S-W޾X&pC΃K sfR+{F1W _"K3ciТ],yb5jZc-F 'ޒ|Jw8dW-n)j_8ȧ{eHon][k ;v4k[=tQ OV.5DbvzѥRNte?@0gGPA{ҋԙH1;ΖGL}ݼL20"*e^B$z]BJֻ#Wy3~{G74$׋Ə},PFG@):F\AG"3'0o\F]]G۱%$u7R55ttbrH$ D~> a!+M?K"Xޭ6g?o}ֲwpMfЕE;@0@)|}4[C!n]22.,vLwcաHZW#U?$N2'(]_"JEQdrNDJ[ J[恈RLJG#R B&QhJc?-^DRKE$$\V»# c((JSȋ%G2Zp DFkO.Wvݙ _ުovEnz~m{YudixڧweDv';q5AV{ӇxhK&s4 λ pNvvNo@Xi JxSLD>[2@ w{Df"?: c7c+a F!vu"@,X9+PpI,ɬ0 2Fʭ@|;d@l[tQ͸9H5p l]zTfRLW?K꒻{5ne<@ ai:8Zu?p@ {4UWn)-չh@tղ{ O͢;%"Dojٽb^>g3="zquȡ +-DE!jŊ"Sef3/.Y )L S <ܣ t9x JDn&FWD 8V4JY4T_Nx4M@<ݡ^g\n :|)֓WK.DzP3RC n51;“ʫ:zUk)2)nr?mŎȟ>Zj(Z ڦep9SQў/e5?Zm9Y.k aKm kQ&0C}3 x6E%X#]"3zǨL\эȁNMN6ߌ .$ECQbY%,yhE{=_L/2t̠Wlk YF7P]/&i2DR&Vt]@tLS vOnFoRk7/L VG'ILc(DCQ/[&2ZN Fgҍ4 Da5K7b20:2'Pll&'&K+]rmUv-hfh 2RddDB T]L s9ڃ %>m!!dbQZ8:T.љ GSc~N8F$ѧrY8\1|..O o dHN N}ˏS8 ~N?qYkܧ J;H" @kOZӐ i@8+No:8]#h3ӆ:#)n G|:dqMD! L$̨lx5 l84{"Ӯ6^ў>緧y#x /|᥉_2i&%l ux#>3v0\BXA3LD&4>1Rt Qo5DZb@ź{'ipU!q o7U<$&?%G)nph 3an؆ge #h6{d9F\Z<-xh Dsةc&NŐqsFh:Gt6ʕna~z5m^ $.za~aY3=L 0mFh[<.+ x$9$Q+0],̉O#8ĻcopD-D* 3b"uyR= g}LY}+}5RƄ߸/e ZTMTfR'5u0M ZFJVb.'ADQ1T fwµZa6ês4E"dcLl^RU[ɗ10]Fp+#p*ű^Gj$ MxZ NDRm6AD6uo]v)ig Ri UaqKwFu_CDL4225`[O]Ii+wO_|=mP‡F+?#L"7ٝ& HgFzY5t+4Vό܅@p5RYfs܂;12vLwA-" 8;"OXn 2=Y9r<]9E-d xz#cY >B*{~ b6F7Vfk8SݟIZ(yF/Eĩ@;H=Si⑖"o$dqh qx q @nHr @ć)ґr0А?CZqv-;١"HkxDj~l3Q#=| ?` (Gj~ ~u҃xu^1_x:L5eXˍwIܰZ# AN ~=Ō1AV~Wi';7b\ NjP# X8 4- N=߈K=@ so \8Iz47L g] 5[!tIc|=fnfF VcO1/JY𔼩fH ehPp ;0;0SV3IЛy 83;>N )X`? c@\V}hT|'9ȒǀXd!@@NjD 義xu= |{dBjM51 ՕǀZ:x4E^鴜%HgskE)t]==kG:q GFK-h#"3<tSu 92~PܞzzVfV>19D|Cݳf9d,$M}чG6EZwe`8_zkbnx[ZlhJ6TVzQ4T@Yiw~+!U]MȠ]~nnnqHɭ&YXxkA*c}a؆CfIQ@p6Ht#Z$z+^6ۨLi'k@1K |SѰ~*LGÞ)le{ @Rrrٞ0s Ty ; 7 )rt"mqY< NyOsVz>9zlwe; qJ֬cv!f^r539.xUF?>8F?/C@h҆' ʚj6Ixhdy.A=&.A͏5i2?BD&J*7-RYrgRmUby=j[Biф9]0xՔZ{*;40ϲYɴ]7t%iqcqCE HqYbyBTݙh&7@jTt%~9Bt4(!6өשM|վO%[IZU*n*m-<W"G΃+פ"WU.qU֓E֓LjʐQŦx7A#/-M{ Ҟ!qg4P0R.?=EC^""K_M󦠒I^s TKjJI@<`#+i@/~ ?B4rn DZUtm^,eqՌXPU] u[Z3>2yX"O0 'Zom9 kSTefNגPm~SXn욕%8DZtQ5LBgߦK,!1/:6oB H}1ηx czcC5l(p™kb%rne!)W\.+IvbvQ?05*۠ƯO uNȪ! *O-K\kʆӽTDU"p\hrޗ {?^hL.fH1;*3 $U|ksXhox4tb@] D Djm@4^n~"՚PcbcTB) 6)xBdJDZ9s/GrRM{ p5TbG )8uv阒s@tk2p YH *wBKt>*+@<5 ?-M>u/n=d@1C S hTrBP r0/ 2h0)%`*O[ a<Ԇِ!@S H@פ)Md2sF^ u6Bo%€7r@d]0or|!g/xVod=/@x|7y aRդ-<1"/vuFRQy"_|CC/:^{֊胓1IUy n9J_ d* sp5IJC\=0F23 HU#@ATN~,} c^C f)@z\%;7T ʍ8Hr< Y n `!F,dN ` yYq4)? L hsfK8 /j)qɦj%(nJ ~7Vj$fJNo\.o-%x@غ7\+CWԴ}Tܣ-Tg&yoYHw_xn@gOU2Jo F%YE 8ymT.O@p$g@@:_SvSyYzrx@=eA_pY\^egH-Ξ)2@pHa{ nRq,As"~ƓDg *ިP̋Oi2(,%>=nfVK"ziьN)s_U<<*L`bL@Xߤ ! G|)y@}T59n]~M%^nR(ʊk:ȒI/[:} }^0ljSb&$jT@u0= !n[KV(b#+̀7WCJ1Đ5. BG75Ŝ HvRYCQ7dNԧF8:Q)șNoFۙWF0loo^XQVE#xQr@ply/8Xh'Ƈw"/*Nr'yjq"8I5X5]H_V Y=g׏r !R2rG2-_VqQt!!Ie(!0qojHO1*um)Sas:2cN #kD^Wǵ:lr7KQ :]qa%8)EC--2a5/<*+Vk]^oF"H*čM!LMiMc@' hę:8v:v (iJ?g{*I8[KXUrF?l-Oz_m5kl75/'tXډT01qn'*iKopXKOʉ4&Y pcuuiw'5t&?g8o* A%l=xj;H# lTz ДƠQ*9B4T(R1lF%+De9!U,{b: rUq/@t#ABC,a|۠`$#&'aU镾/vdp[#w;jm0KH1fiIϏWn+kfZQǬGѰoZFfWeUDv%fh+*ΦC8Mu0c>zmd/It]@KQ7c_(ڤ^[9Қ62`:N0%Ǐ_tmMŠɥ͊ pX GV4:6KS鈴벯V:{[{{-W"a`e^x/&wl 1~ݜ-Ȅ•`pږ:WL1SQ_ b1r Q2V<!Ef.VH##iNqe):D<#` j7Ⴡk]5B\Ѱp9 #Δi*Y-NMݎ'ʲ]@'x=3oN"DVD p#C4Tyb_DH_Ofن<+tNkL N3[wBeQ~Wtp DvpI ͨ{13`^YS ;zi뛙_llToF4-Sr t DQJD{@w+ny on\&\)ЭJ Љ'ǀy昣\;jQWSP88V^^׶G`4h @xlJAPlizT׭jfsL`ƒ:A:¸@Ņ0. TAgL8t8; - }-p)#u+ˁuL`{(Ar-F~"6E1 8ȁ+ ۜĽu f"qMT]ūȬFypmOe9ū[H-B{4 vY$ C?^ ͍@Hڛ;cQfm)86{#cf(N7bvL5^cOΤyg@Ye#rp^Gh:Rc'{q ì[ @ /`r*9w7i~@H{)Y4 U|[ %Oz <ÝV\}F07bD?uz+څ/D᤽xs}#d{F#/ ߑc{Nn*HLQPW>QL$6`?*N0$xD׀iXGh"jƦr\#K$Y}=A ]_!}{S}DٙdՖ$9` @a@43[S6؝2?mߚWJHMxi)-|NiaS/?lѹlkrIq *ֹ5y>xr,D5~u"֛ fuZEË,*؅^ {EOnm>XD Ҿ=⁨Z*V>9nJdg2 ǽ50~:rB DC( *87snYs$[&J jSj=֔Z ;AUJ˓;AMutU.[K^ 5h'HQuy%q.ް[@ I!C? xP[aϱ޲͸.D~@=:mu r=~ ,~o ( ݲҖ~n;7)p~jcjm(#=mȆ[o#оnX-_>l!Wl؏ӛʏz<s3@Mv5>)KQJ 8-Yx@q!d>=Zks~4G4(tjw5@.2 WjKj6&׾QAo-Z & JMka#p —߲/j;] *`2 `wr|X=i]y:]Zթ.D(rUp3P4VZiSJ>6(]"]na2pNTzl\eW*k C+IdP0w->.#(Nm0Q=RL=:fK@`Cw_˪0jUf& mM#wP/\ga0QՅS\:,*fceLhhh)Trt}/=eTh D̝ IxӨTQHNulqc'KF,@p+ZIr19`Uٔ-{2GT T'A5//Cd>Bk=,_~$M5Mb*.=%a0~=i) Diا뒸[ '~Jn8C=px21cS &pP>H4!0-,t+8V2NɋަU3[MZ,qiNoO:!Fa%Zeĝ62'\ X@( g0imЄ?BX+utsJq/CRJ6N.ȇ `deX}њ%SZ{K,Z"S)mԶL6Wffҕ 1$.N@n"hs'mqP')mKr's\ϧSe5tU \ jwtIT>ЕȺ(3]졖ML=ҀLF j!ÖЎ%vRIZ| ؈ab KW!!w7 d)g=h f θ{c" ڤN1]6) >i' ʙUtruP[ѰOq#9zv #Աƥ5L6k"h&Ɓ`:m{gOng%?;"!ǎ"@92<18F:CΡ3-)֙r?uI1v?= RzMxU5 R ;Wӯ5L7ɋ$'_$;k"-d}M& 7|ӓ61[;tS9[UKL\*4W# Hq޽+D1W4^4nIw&]zf_S ̟[ZXWp9|߅c[#",e\|ik8\5]sM]i#FzI;zZ3>6܋f@p/ ĸt ܭZTZg=/GXpMo-L*t d#ÊB¡I1=LJ%%-RIR |@3]Mgt/%镞Sj+0\d%}xkngCzx* XSmFctgŽ~(F簬*5oKLc$"a*Z~#0⹂4nki*| 0-%(b9 Y<51V%J%Jw d<G| #j"E3=G`VDc!5Q{ZIDW!{}V*H"C۪GdK8ſT@ ".q;$|1k7a>$83si!@f$g|ŧ#D׿_ U֏AϣύzMP/F.fܥOKALGuAK˴ #t1 !G1F^d}ā<ZJM].[(C)1!J_.Su= \Q?oggHrw1Z^?o(Ï_7&>v3/~oÏ׊?XT?ؘٟ9$/~5'~487xo18>5dV_M/_gHcxa fAƜ_|H(ro_HcaR!``MNcjq׼Lq;vDذM0y^v_vhoE"b D,톝F"  "d6lPI "]6UcSjN ¤(" "V׆ aD A~Hd ݢ 88pcO@ d`@>5yǻ[6@`(\ʡ4nX5B@+5{@jZt|OD_X48Ȓ=(O@dtM D >a`#pzDOcHS>wQ៛Mq}\!b׉qIHΑ{;Ty|qtd" D@KRÆf?c@bA*ԑf֍ q!n=l~H,TCdM+u9vgfنvb9 \odsl.l/lp-r@88-9_sPO'"U84W`}^ͩ/bn]Jj6Ӏz"]89Ӏg59l!vGg7/dm%*E@wݛ5yDwklWM~^wcpi6/~ך:Nxw<ܣӛ{p&cjCݬZ> 89@tMdK5ђݙzC_QCD1-avt (@ HFpaMy <_}>&M:܌Q 1KZ KD^M]ҽ >u>JCxј\DVF>):B.r{ᔌۜB0fgPN/HѧP3WT2]4w>ULmliI.7hq8x%Lm@E@k>KϼwQ ([Qq)6Wb2+Z_pL.nOx97fz؂>41ę4t'꛱ ı4(qf`D>AH<L3|Pg_Die88\׎;mt&ŗ(3uB&>p"(]xe(Е=z =AYÏwJcQP㛟hk萀8ofo4 (n^~Ug[#+CQqh6T=8{iduz84.A߶8B=CbgR| ;Bex hr˜X"<~jbOY7hoЃg5 ùރuawg1vO?Σ 3 wzzJ]bЃyݍg8ݜ%5=k^z0| bܼ{'>v^ b, H^JRpwcu?mg8+IDӃ)p !%#-.҃yuirB$J4 @t7bi_#~ #1 b*Sy $t0l[ v1&z6EH2{i%+AmZ.b9  ݃F,=hj[WmzС*7W%i uyxWT҃1:ޫ߁l6+?^R2ֽW/3艢hARrDbO*;o3f(SxGZliђ,t؃[FzT4t!Pݜ…T#;/ щPssnݮ84@bR$xv BzovcO{d96cC=z3TFMTHAq;vnKQ[1(o{ $[#yUРoR5OE[od~]KAf?v{#۟AQ졏$R~~0r }iv$w}` z?HCϯҠ$iz4d˨;zL"^]gZpH/+O17:zH#wM,~ހpy2Y@ '/\k*Aq@pq8Ƶ@ ֕ЖׁؖH_w 9 ͭ:,{?pA6=$,&2:; xAlޫ5{\94[#a٨[qN`LkVr v-gqmΥ@\|sfXnY MfN|hu)sزBW|MSl=^!eԚ2}IT?^n2 = |0> +޲,fHafƧ<_8e4xTmB me$&hat 6B{ ]5֕=<5l7f\HԀC=mqޜ/0h^@?jdᘢawa'0C %1Ez(\%PtNkcOM 1~GڋV]?On`slwOmԾr+򄻳$ 's~+Lϩev;Sk~v͔Xak/|ͼNddO52Hƒ_r~;;B&Ħ@4Pefbsg\<=&׈U6p_m֚o'2?لX=8lm֧4QAep=o8?^ތqC |I@lE}.vXvٖm=\@ТFgաfA!5*Wq o^Up+^Hc( V`"JǴ]C2 zL[mm P} y n["I88e[iw"qH\ ( o"aFڐ`FDOv(]H7񤁨APMblj)ԍ7{Ѽ5 az4,E"0ka%V DE)iEG.lځz"+ۗ~iVwtm0D$jj Kf}QDwZGj0 U)P7tCWdrT"m2HE1@CZ>v eϙJ3T.nrn,XB F E l7@ń P١X@:G*ZZXGJB z.V!/nji,<@YidyR[i x7c$5"5C_,?Mj?5wH}>-H_N8@'klu^S<۝r˰H"`}e؏ԾGjoξvN}lB:r 2; R;N=eDdPb Dw Ƒqx¬UK8?(űSǃX9#$ocv2妼HOӉ:lD+ ʆF26 4B6LK1˞= C=ᅠ! o/`p$|e͘/dm=a~cBd ;:me"bS ٶ="ӻD9\݌hx! Qv3G}#}V42dkG 7JFP*Yde`v2YOlAvvt pz68 63g `x&b8%}p2" ಛWmMkeMpܐftI+[Y{gQ25\ Mؑ^뻦3an>LwuQ,2tٗ Mv'Y@@οȐ^vR9rtli?;9SW3A9+,m)۴goudpww~1)'oj%ߤ` ay2nq~~ܚ@?qWH^S((5"jܼu2PT : TnʍLj N-j]gKM=V!6 @C3<v;ugُhi;=e?מT O#ī#?]%C (]R'$vc=p2YA;>WlJsoxbl8Zs6cp`Ŏ4Fwz.R \h7}b-x,LHG";F>Ǎ.@4J}<ŲJV(9sP-JoTWqh}o:A|E)ag932L HYBgu׽TQ)UŽTVmpʭSe\8;;D3u7}j`R>H:`*k]BɫKA/!P,Y/K~pCV[~,Y/K~s "g^‘T!^(H޼OqwRz4!]S nY{UH\8gqvחQ%SoRv_W>m[@Tvzػګȗm o^"Q$7 bcB?p JD)*A)p r?po?8$m%bO+֡9Ó"d ؅t.#[ 8N(dw3Ky;fj,9v"ʿu:HA6-{]eaa(dc5މeX %H}R2 @tGi-@Qxyr`ye6vf1' ԲoFZv}nlGu*XIg[6ʙkCO G:z##^DXxo[ӱ896Ȧay>t ҮɌNWcT1?fGOcRoHB(ZS?4# Q׊]tu!K2~R ̡A4y2 DoXx7uВN8 hf#7w"-K2 D~hL=Qli} )BGZi291i&ӵBctsS# r:Kfc2n7,9Omds4I N;ѳ((DO]h۞/B`e6Lk٫@=rMcKy5mv>$4=?(zK.#&݄HtlG{,1go@?؟ FgYO}Οp:[r>2@п}cDL&14xܰTr k]>ev݁T|JV7g4;нS~;?^ԝ$I}=6gȽ;nܻS{׮hPT ѽW~qU(̼[3O-*y@ycNW*^ݰt|ʵ#2{ jMoDC <`|3hnF- dN]0>C@ j9MUv!ǚ ᰥԩah e͒"txU]fvsb[N=79Uz,2 fQ|YkKq#Gژ@dEL[I%S  b3`C(xTny2)f^q(&SK>| n,_4r' n1+Աo5/lӵSe"_qN-[ J6~U~&kp5v- 45(L6IӖj}h}ؚ}Lkn=")SD ^˩^dhqfU!mJT3-$] UÂ!:"5;H#:?eAk uL2(Z§6U.ش5GbF*."$wv%к kӍ;) tHz:%XAJh<&KE$t7F7 U$FҢOyjZ&6oGvL|G/RGGϹ ~oUzs~/ht936~Gc(|<.5kxe{ :|1ZHSQoi[nSL?iO-HR>Җ[|]өE)WDʮET{S5s&wrb;#;X 4Gd4M|+Ő.hphxa)DD%*q[Gq, aҼ؀Kq(F(ДƤ{R:pM!=y.#:Z\*?ђJM g-\Rhz256B ±J\kt{Irb]nRBI5k\tZA5K*."jmӦ)PT=\ev^E}o!֛x/iU9R@[>/ղتww3m^3a:sꋝ%vaYlz~V]َ)a&xO`r箷b.v `˱i`u R]1n_*nqgH̢GF1gAR # lf^KpC164e@Gb0Z "0+4Œ}8`s#T3m,wt"Ce 'wiĪFVOL=kl^0g^%t `s/kv R8Wi݁[6qU<8v;{ dPt[(}DO}dIle൯{ EICr *wU,#!vO"AcK xU wCJ.N@Tl.4= Ѭ0xL%tW-ë֦S sfx8' U! +D_bSid.#ڟL!Qatr?K˸U:gV{@W:(.*DEJ0WYTnk 1 ACS"IvάHNHNVJ Wj%ǔ&#Uj^ )bc<^I|(nsyv<>tsz9Y2 ѯ3e#rɭӈTѓ+IfLMJrhPR +Q+:Ma̽MT0YaW{%kW1o~/^iqd Aȴ=5#cW14Ur= 7è0G]x$d_w|>\,&c_Q3eGuV'|cc+ЧAܡQ$Åh$ٙ&qNlyYձɑKܣ@tss9v\ l=0?79L[^|NK}`øP"bVKZ.!4k:Ldbtq 6x:Un]YD& <,1g"4t RkM{mUQ=iCfôz>;}..c1%|xja7t҉%SћͶ?K7 i@l.35~b]erU=[Up#1N&`$ = B^??׏Z/~+ r^|5~o~DxW?PяkwNJm_ڟۉϜB6w#5,uN_=&Ȓx60p3Hd p/قACJY 1oEXφZnq0QBڦWڜtC |U-iцT*Pp᫟_#ŴaDZ%#SVKCѕ֊j "'!!HALid"sANnS|y; L?*׏T$y>;'VX(\D YXn[%Im!B@]"5u;C)UZ#y)`p諚ɢW=62A ޑ@ȯ*1hx\5Epz1OV W;T"z8zƲ3q1E0& k}p=FE@&C# t%(8ѩ138(Jij  %Ml rDrE1L _Qsd`6+D'#-\@p/#ׁcAzJkVпe]DCGR! f  vH ǔPз;nE\ζ@l܀cg!wt!yLDT+8:8@%rIH ]K٠Z*JCP"{q!Tz( b I`Oܦ9e|^D'4|~(L\E ?+o<НFp,p&pt36̩;E,nx$`KȔn r(DfnfnflnE`s9GoH!ͯSi0NDq] HR̴aG N`"'9CE&Ȃ̯yht0Tp!RȆNÚ#tm6":IȞ:ܷI4\t<s g$:v!ſFnߩ>e2 ]%]|ObVcl9 w龙*(_b:J`vdC⊻PD,ͱ`Ob#4J'ǂ GUcHN8 mȨ>ǚQAXءaLAN ]!(h4BPz@7Gq#ER`S( &Wu^"qpS~i 3u;-t 2C ,N=SH}iTMP>49v 0NV%pyZ~^ڠ0cH(0S)LEvpgUK1-Ml14VHï=xf@cu7* d i]y~oq@t&m|VIQh\Na'~JIᵜ T%Z=C4&W/Ha5;RfAL!nK1@ 6ТOʂzI$l4*L#̺ܼR- ɐ2 ?53;VDj,)ZX+7sHb*=6܈j%@zc >WQMAtBi'6(B>8 a(Ԙ ;Q2 JL1EL[(5wܘ.spD5 be "D 2B9.z!x!Ӂ2sȜaˢlVZE =ásAdelOԬl J} . ƚpmۣ/*]A mWct},syP|t>m28Ca)`C[ţPpv%(m %tĥNj .? [6bsx4l~6`>+q$-OpPiS½dpn޼L̅'<t FWd:*CiʥG{xjXu&&xQ^2ؚAFQܬkp/:=^CqZr1L?lUllZ H(ȶAsnb!Uz +jVh)k6T9+;XGXc:c&"<}X3 UCiLʒ+hĴ(_10Z fע@(G.橣amDxXW\jH@(gӈU8?:oIz>FsɃR8D  wc m Ph(  `w:jedi[" [`G,!hO` t4\z5 56ۓc&czE⊙%Ǣ XPmPVfGV2XFr-'Qjk0uOÚxccŝu[C_We8܌rPPi2]l\ Viǐ2?JT)cFg\Yݰь2FaLUHd ESWیRs~f, ˿IQ_͕J+-ֿZ^b _T7!J8 %J<;CqnX8pwXu򏩂l(KudUTXyM'GB hw,e Qt@Pj5֌!-J"YFy׺/_c&eGw(^| Ew"V'UQv':*z5q),z|*z}"75Db)[Ս5;XBnX,` &۪d, cGW~3`Ot+`J6ʹ/+nFƫ|ڧEap:ݻ$[ sm et\mⰺ8 JZU-v HIׂ+u ċ!\;g4%vSsN0 V~pdg>0jLvsn ݢ/9oUi;VINo&H%7Hal+DHC"$Vey $tv*Bg?-ԯ^Ʌ ,or1js e )"HNa#&CoF\  E8`x*\ d"5;߰OPEEy=sə!fkb.h/ Ffr*9POrhmZqg˩VӦ1} 3_m;t s< I7ڹ@TD7Z@TD7ʩ&63EL&QNf8 3bg꿡4Rf-XqùP@KdP*`T^$&7(ZTzJDؚ$ bMA? ݞ(';LLmPZ/v>A:pyC4r3nv!d|,e#QbZOiP2 :\ݠ<sD/l H QUIT"BMkP0vO.PjIj[OxӤ2E[ԌZ R j5AE{.]dbcM=EpaɯJt. MQ;Jcew Ugȇԃ[(D?!8RZ:8zMYʥ̈́VPL =8!jMm!ضZ9 S~^ --3MUc53uӮC W-{zϚi5l5#V9CQ+(RP^Bt((( y(dZST&f&F<8ՙ9ADK@QPcYŻwV'^EUYgd@I%z_(*o=㻹GnZL4|((njC9I~L`m.Rso\bCjRs/~<:+=ax?Vf +ceZ9>i5ie=vq7l# 5ROQPJ{מ*: x)gN~5Hgv2QCIp_O_ù}t Hkq&L"\1J hi_MdPݝGGwZLw_ ^+$p+}-UI0N Le;ev@zgП{â GN0Gif\[*l.Z$Yt`% J6<[ŶP]%7~HkOPjK[hحJOy4w+V`mC&e++",|iմs30;6 S=lyW׺ U5`o^@ d0N+s2el=׻2[㼇Iܸڅ 0[jBܺGBÅ.RTo cgE x>䛕)w}Vڤ_=r3 P:}s0U9((tbj&k^fcBn4L 7JKhj=}tWQ"de_3/JaVq#Ja1me.-1\TLəͤLQ`(es14f-4& ,F?8! c>9 vqa (Tq/| sU{H>Q{3谹qǼPN"<|n 9XɥAN)k^~Ria,90,%aYX)O`sčo2aGpWsHpR getD&k{ҵ EB cʑ1P]^ԥW:-U}w!5ͷVc0F)rkZ2C ^'Ԝ]^nƃ.0O%mJAX cbWĄYRG(cru&Ecu:PL V|䈵6s,Oqr-2SquӇ>gw̵Wtr}$☧P!!NCv9ȧmOΏ Eٰh6_Gҽuę[*?o̸tNӇ`ثVp>.FbŢ0=!Ó|Y!dbpJ(Ct^ҍ#tOf)\>Q#P=Y6_>_M8"C9]4D:V b}͚iJq4v(x!on ,WE.7KH}==zgAEP_O&xSKWkaLf)ɓ1EQ]t>c'}_codže}Oq5<8W)'/ϰj}<~PmW(|s `ʳBQ!}\TOk7L Îi'+W.e`lVC,Mhj(M+c+,ʼw+c>CU8){<>ŊpkqD<ȟPGRW^Vpy|dlF/Z|+\z“g?Rjf{r|'DbLPMeRt@]19P&뚚Gq6rYm5t!!\V&!-Ŀ䖣6lGo3u>nӀT< "fԷ$ksxE֬N4qR{6xmUB-ls]lArwZjNJU:TYdサPdۇEͼPP0՜b|l@Y&ݜWʝh'W7.nm\=s7?7?'29F֓r(Ĥo569\ưEwi2F13(F:Mt9P\ 4~> AⰕnX ̖؈81Po^R]UePF@99xP451VP7[YWp[TN+u~Uque GyⷆODa8n^{ MU~\}]}\}sr- QCYrOgo:^D}JVO|7xjRҳUwA2^_0QåpyhA/Ů+(W73 7^[CRaa])B(nA[ 辙TŖ/u|# aŮ018fTGhpEա)(Ɇcb}k_\)fc0$f@P9r'g^~͙_xtgV&6 ~̉U2Μ=玪sG8ӑǥo1+դ#Ygsv^.3'!7[Qߴ7hGx`~Q+[!zSlg,PF@T!y|\: %xg:1f.I|rw.',Bm F_c"(|bH~_b1A[@_,cVwIY/v2PE=ao)L O/`R=mi)ip+b'W}?DbsxLjF(8 [):BH}Wߥï$`<Erhi!\ LҶYXy:Tp]CBIn)lE:* h~B-!n$=7XA%eB{_z*< B{Ô&>;5"E4qW F4GrЯ%&"N 2\\@#GOXc8O(*?SK<=Y>`œ&r*蟮ECBhb#  "'5 %iR2+fP6AAodP/U)Xwōql`h)W1aʵ\+MCSX&]MA\q&ܛ+Θ+B31$5& X%c#r%-Qiy5WM4b^'V+{` ZRk@V*شj\1\2ʶW.brk?i^h" б&PpG|;tx A*+6Ӏai~ 0ePȌ[@G)Z+vi$N]V2ԫ6 tj_B٦iqԦLꞗC^%2 E.KAݓaп`>H[n14򐺷hvRgx|[3ܮTzjF'ȀJ$.yT},Kzv[FE~)*ڙEOe%kܗ=Vk3K:T东4rh?\" |LBH:g;N/Q2tl '_ȪPp$`@և )CJz]`ʇ EvT~TABW*1aQa1>>-%wr M;"53B76YO> Q "4;E*`(2h :u2;떹w:kZ(ѣ4S-Cg QV7Sie߱8iC\3O+OR*y#~;I R@̄Pp*v},ʴ&RYh6u^q$ o4 ;;fB9 g8[Zzlس%Sl>Uv(g[9&]q_ 7)6m{^QmZlgsIlA_Q';XT@A}9'X_eq_eZ(>4cw,pp,g6?CL7c> N ˫F,T@*7]̇?2O2/>joT%i]уG6ӺtU $D ʻ$ 'V`oIE`̗Ǡ5=qUL^^JtTP] e /a*吮+ %P|a`dB n(Z+hj F"=ǃ WYJTi=bX=?K.oPv*h&]WA^$*yevRU[y8G,gqfa;~'%Pv*. l)ݓȡ#΁viT.ukq(zX#wcg=+]. ru/8-e/0Ja8M;-ʹL~*Y?pY ){9M*w ѡR1@*HOAK3]3?がj"-f|DN.Bz4JusTqɩ4DZ݄Loc0Uv;"^Q *^ Moe˰' 2>%I!y?x7~*߯ӵgA}qNshvt|=iWMf6KVhT GjI*FHkjv3uUclՔ(U1`~ECe'ZX%Eh<@O4OER9+.jk'KM}N& ]4'ӥ8{U6%1aDiQXOgvȺ"ު7,u𞟤Mm#$r|5}3Z# QSȹ |ģreb<书2!˯AF=ՐU_zcCnr$伪`ݯWeA`N^Fe/T5U,8AU`p !O5D0  Ĩy'Uf!"Q8E-}^!El#QʼnvXYK& c &B1pR9_Io$W/܍ rzćܧ (o!1PԒ* &:}xGwᐃt\zE@:{ [_Q<1) <\CTM[M\j8l1 L* !K3,6tOaX^Y\@/J,KvU+i}֘&5r@ vS4BQBM@J[p=+g[13*/(FKzŭ1b7}aqIŀ*a2x"2r/8(RTwb N2ZIODGL Wbl -&%aJWy=U۩G sie䩠75rLFc^Lۿc|; (k \hkExCQՀyirp緰dtaB@7LJÊ'8ßag#U" ?h6NLYOŭ}hҼ^TpO$x( ݜH@6WM\tb!Fi]N'=EZ!:txG^x1T{kƷ/sP:B3g0n7A jOE8՜~1:" ct; WhÐVI*bX(a܂t'L.m&@±0J]OL:S({$$tO؆>YQ f@*Y̗DZLj9GhA&XaCQ M!tz \[~PB.<8$e7md3" H֡\0 agWUQ g0UX(.L^#K}do@f2P5*]LFci0W\݉~~\rk(44Y E+gAJ.lE}=̏ kh1@)\du'4RAKZK@.`FJD9G>d?r/뉑>IXp,L&ȐDa"bnj%_qrkc+6bt&`t#ra7du:~hfpJUɯR@|X +5fFA)>9M(~fo>NݑW6OCpz?z =x|l 5w Yug3ZeJd,1gkC9+B'isI{lH_*/#DxC2D0Q=c|^ѫLe_VZcm*z[f|u;#'xȥP$*v "CQ![8ǻܓ;&.6,=}>vw w ʢAmVYד'1bۼlV1 [SpU?j 3Ksg’SOA(*ᙰĩ: KTLפfT@xƒQ% _uTV/2߹ V_U̥/5 Ek {ՋL(YRRLg tĘF1mX(Ku1ZJ-,ڙ=X3 mQq,Zh>QsSAųP(A #4 [.z(bMgy"s2UL+Zƛ3XSRVP6(j-(DEu\7!n(JŮV`1ɹPffW>vrPP]33 XW\IM;kBA,^32XQ=nzT)xrQ5XUbj9יqBA?8cq tG>Hz c >jIAfN~xQ9R7T*FGw}P;OkwuNY:ICkwʅP :g r5ߦIT/vF-nFS+rybrzuú"'EP<8E'pΡZ:Tpޛ_&_P,IzʬBl q%לYkT ۡ]Դu EzJG׷ 7YKWUuֶ2TZgTHԌ:R3Xh8Æ"~=B@*83a3@1g&S!3:BT.g "U=aqE2\ex i QNaI 5-U?b,h60 ˸6>>!ze7dNռЛH4.E]b@(rB'/ t%pZj&J GSPlKu_8CC Г7|:ǀs6YX\ Ivɥ5mv,F N1526IEnG^B]t/ᅌhEU61ZyP+IC}t2{E/R C#YқDVcA{I긓5x A{,SXC NJOab#bUoe~}ezv LS6>.?rtöPyE˕J e.+Go΅ǟ4 gt2)'UEuw)I)$jӦKgYgP9uU" @u=*f_P 4xGU_EMvI=wCO_4C@Kh 2z0Qn6#򵾙#x([*V!܋K`B 2bJW/\D@QMйo-sܫ2HO(% q7Gt-s]Dv o,Q-$tuHLUq6Gxk?79ͺPT1PXMP԰ e<ڴ-_T^QG kKy<VUZl#N? )%~y|6$w՛gM@,5++oPc.W=*.%AMÿl! 33rCPCkK\YK>ƙ4("*^>hDD ,bj/4Jɂ1s(MC T7aЅL..ج}P\JrFr/e 'V2Wl(} /B78hROC(S?QN[9Mvq~/|N5{Neg}ᾛ^Bcm :*Kيɢ1C/4+p GX 9 7jq&OKq}aM;;˥pa,ןζvni-XhԐomyvu sYoﲛvZx7Am`9o|v~2#23ij;qhk o"=ӥCZCOsxpl3q] p x)'K(xt,]6N>`!7[[C*҂'mWDn*-8~^Бʑ_7+kSZ!w̅pj&.{ v[!m(C>ٝn;^;'qSJvyDžn[U Bvs ݶCeʜ+ZMόV(K{m:CcR`$2]Aoz~;MbHhPߓ|13^VÆ"%񿳂T|ƖmbWo@i!ZFbmgIih<.tMC#7,H X|\sAjff.j@=EZHg$@N "~e?j @Q0'cL#kQ|>)0N.*&D9l^_5/d__ q C;!§,8þ.bg 3ƾL?*YDZU NxHQR|)e=_LK |js݌(u.HA+ئXABRlz8m5+<r*S_Tt/uƪFQ빊VO7qNޮdjyzqc6J(&WC@DIPqFoǮ3^ZXfީm.(,~BA;;vt[n#R{=٘ k(r QR[%*K,.Dݡu$O%bPQXJ,YYШf/|V(A. R-dqXJeڹTM^ldf\^D)^UjZQoQkJGUUNXTԗŰ ' oTHqQw Q>+بA0L~4O_R1kbei{.T6Ou?x9yJ[2`yo0aO$0i4Oәן@7 jKӎi%ƢZO7 "tATcYNevk*^ Q??'xl%zwVt)G!2_EW+ o|=c  Y߽`*P4Pb>׊ _!F1!kư=r<9|5N/EԳ*hH RF62D2.eZZ#GVHjQCؓZn3}?Vcr|a^hq'1z qSVa9@. MqsGIa^ H`Ps# C$@A.<\7!WpH3 ď j/:w'jHW^B^|#8~P94!"tYv#Cȱ_VE:^-  d5]+EpH#T8~19D)@q\\BcBR CLP9n(QEI*"&Cma6tE. wp]) 6Q'WEP+a [ FCen NUv:XAP't. W_D=́ -D@9~ }qzmZ,y nŋEËjW( J@#@QuC_m".-eJ>yNU׾yЇGh`I~4 MahzIJNƨ'P1C!XˡgHux(t nbB(Pmj`rTA{VX?k_3*WU.hٍҡۀ/nWZʡ,&T$04ǭˍ;Z?9oN(P4!KWab &XE/,*vm~l[1.[hU}XEcsay8}oOP4xp@zR'7Ez#b96u^=u/RѹQBQ8M ]i(z^TדncRf/KRRv'Nfy YݚFAf^oa6Щ| yɡxԆԴI4<d{FN]'*O9HdC(NN`z cx-t_b" qMLi|T3lv_|NMޭGKNN{0Mx ٵQC[7e sQ\kK@LNRK &b]NZ+,OLT\/ $0n;<{n33qkCQ2N"d)q4.D6t ۽ r.mا(:^|!b\ X2{0zsRnzƦvqU/SL ,Z6.ªhy =B8űzRPʫㆿ$Nl!"kd:1#V\ JLS+xo))[u< Uux /֣W"ݪrh"(.WZo.ǎ٥/->Udz= %-W:\wF]w"gcmZ^⟲՘Z*}aiT3b.Q\0w.^,ۣ%5=z?n?YXv.sٛNT2{5ZGuQFu 1TUvO ݇WQuQFlچ)4$H9RYQy\YI/m-Ӣd9^nbepˇ;Y9V tkV'#S@;-E|\nx"ugO7H|#r-j,V3LKi#[˿}Ug+Y}וYoWiX"dHf A%1LZE>AZE}xAmFQ!HKNhm~ <@4&@^3aȤ}t0Ug*lrI'1BAx*9JNu'tl<}z`lG6$c'(6 :`0~zRPKfl*.ӽ"Z885]Drd1%і}25ؤrEI7S^MW:=@<.(p3 *G3+dXX% |ʵx:2ap!jp/`Q: K-ٸmPN]zl @neOBCf,TrxcgvB wWCF_UM1#pX;&"086};AD Z /( ;iXOue1ΥZ_'KU\hlUնG(zOU'{P縲tpl=z-XCN;^bpC@wu@;bcVYqk.WUff|O+kP Pp͟ΠR8/:(c(Yp촒}g y\0e τgy`]Gw[5"c-ӇPM7+iy2a08vm%q6SP~?f8 .q2@=Gh=ܝֲ2zD)v@5j30l)r)n\}6b-5M%Vn~0zJ]x9Iiy q*;~̸*TSdedCAͽB"6hEc OD~fQ5 r7mVjS9N4YA+0V01"'Z*!uOpKB"ae04GD)x,>xc)|"ܯk$Gv<ÿܿ\M&9MRM}obś,6Iś!E*$&&&*~mbE"(K^^m8w|Hśo7 "cn7ze|6I%7Qk+$MR&UhMR&98MśԢ3K3 2s7:\{mս*?6MʝHV9VR> B)QWOϿ}ů?b=+w:o?Om???/Ðq61?Ɵ=_|ӿ#ޚOß~46{, v}?տ>?7u?~D%2Ł9wݟ3|_cQ?Z0nYeg(1 &aBPc+PJoV3`ÉG̉Y6Xlxn=T8۬©(CW0opԪnVՇjNbm|8u*ka' ?.Ch(Sl:XEEkE35a&7s24/8Ŏ N9Eʅ֊Wx({M4E\T̊-sSTXu{x*M-#t!:p'` G#_ !cY@Ǧ&ӑ)k?p@їer'o hT8JTtcҩ6@ЇPEa`U wgqyG&C( Y/xoD~09Gu^ASm۫C3]|hFy )A_.^].^[Py488(ٵ,~BR\㰳6~!pZ5 >bFdz)8<'-raSz?[o UU!]BNʅ5kRs`qYg L`ZRCŌ0<(BCҴ=ytqtDIn]sLjK.܍8\l ,* DcmϗzLlW?Psm5T_6݅4ŊE(:XůWUNӏR/U~} EPp˼JAK#.$ !U;TV낡|'BIEoˆ .6j{骕ώwުn`B(X\h8zP(+v|(ޓ}^YVܼ2xB)BSQc*[ȉ6U~>_PkiqYGPOF 6HO[("HaBT!&J#WfUEwo{:Tn'QͬZiRf6+4^GBաRWz#g\>p*Ij #Z_L,+Uk'Ml1I ^0pG)kӋ,1:߽7cQ%мJq|GSRPjWF%u7*XkpK"-J =`}YH]"3Yt|ؚx&V;kq<$OnV`ExWgs $%Ɗ3ծ'L#o~ #Erq7oEDdy.nIkraR.c=wgF.#!ムؗ8|:8|&:> ?0,Xɤ)Q7p.n$_d!DOft A?}9K{GGĿٮyp(G_=K_-}M_M~FF81c厰s5׼qS^K. XmR$ލt7<y EiChyDžEfY4=6;'v^q]F6Dy%S]h+VN;;o0jvpn7YOH]0\ "lLSm z瓸TЬg䩫fGE93sՃ9\sH6857F>5iIid_|\gzYԸOTV"`@y:@֪Ѥh: V;).QMiɪ%33Vr56 Ho\x#u_ ב>piޫE@[lnCHKևrdKb:Hhق|- $Xs>6I3 a%my5540i @&_~(ҔZ=M]շfi#"<4&HnW[$+ YV׋xz?腳VB1KqrR*0A yùVkbFq+ӏVl6% %WHbݨ/F+k9NsŹ}}1Z}F><=}FF5ޠٹt'}FZX#=G}-~1HW@\r̟%2BiDŽsDcjKB?*?r9xT?'5jo?86B;8?ei#N[,|Fi#(LYB~$A$Tr"݂ YYm7XV͞ @;2"]4hjuy9s=Q:N${vf)$)0?}ܜTlOYZ%S33=b2Ek<$/\4Uzad*ЭUK%SIէru}\am22H EYpoUtS9%S0^w*Ŭ8 $;dGĪntkW*4VԪF?+\ d0Jd圹F= 2/jт?2է6d%,m{Nּo9vyy04}%"\$ 6 `H?@~2rajn~ \CarFd a֡n-LFisZۼ@z 6Y_! d9ss7,|Ryiy2zj٣72B8sd04kOLIgy)1m3èN4w2xȁiM[<[u4~~Loq?qw09 |/(%krCf<Ə.L5_YI:y* WL?̺Uh-4VӑJ:yO^q*/,6Zu+2OdO'DDLcb!:: 7=vqz:Y] 6S Jv SԊ71^/&w'Gep|GٝȂEDfBr|ꗶ8wdVd ըgڞ*nc&,ӀO.2?jb{qMD7qpKFrC*3wusX|qD ^q3z^p^j jdqk #"AN_#9mj"x tƀBb,^ ﰃٙ@|a|xn`s~ۜŴHݲFj͞hUF^*W#06* Dldaa-fL69³񝑐̑^9ѿ{(*I&nrG@O͹~Hg$s#uꦍ<= #1<9]] )hѪ@@M+Dyik ŶQfqbP̡݊XI=oQScPHA۵5X؉,ۮ *W4t`Naf9S/ E A.R`ꁈ>_u 4u,E#szI:(҄}oQ:/[!^itmwtSGC! E)ޔ6t dY1~  fA ҲC\"@>bHSh"v0r`9Vdg"zX"wրG(=jH I$U8t N^c۴f Lrq39,$"9/S4Ҋ%VrTH+ģ>MhkĒDި i$#Rp)8cxr/ғGD,AB[ږ&.AptOCd=H} 'X@ZQAI+Gk'{^gzIi\l&hQAv iu}T ҈I ֜t?f#*f-4qiW֛}rXдװHa, [ hWa_<4L_f<ԗX)Tos58}/7b o T$PD zFbD'(" Քǃ%)%Tp>tC@ƶ1'S貔v?MJuyQ!n"}S7} ]ZN$w$o{(dstps(mG֧.'`N SqX\T4ifaVP!vfa>$ (k6ҀrDl,f˙>L._y) &0O$N@j Z"D$L\Rf&*H3YTD'%ꙗz>.A["FC/="@fï>%T6#(EX)'B:+/ƞHۻ>%)}hq5KJO+9D[O~^R.jB>6k<}3wXc޹(}O2{u 5 $ 5 iDA 7Bd@8LHeO[N Z(RoJ2]& 7L:Jɿa'DC>J0/($HԞ5Ґb2|bx<%@8rkX~`S3q =;XZQ ?G2P,e(25/9-?PuW4[Y*$'w(6&A]? =0 zn/Uu˝ tgt(r;2րea'i;NBnZ R6k^뭅Y4L탶.my겓ᲸG&&u6G[ <ᵦ,OgHW<޵-]YiI|<`r RЫ |.۔ @]!^7:]k#y/;=oNQE~ͥ}C¦0tOESɊ`#{$ZBX+}\S=S_JK%E =cR1犒 bYkq eȢgn 1צGHZ!1:<(8vg=ns Wj[ [[x ۢ#{7+ONǫ+պ=P8 ~>,"[~|/X^r &d"! 2M%'n y2yCL<=I8m=Oԍj"x@;6qt[&eT/$D]xɃۛ$G֓ S3+2#s #LuYNJܕʰg_])ȋ,'{oUhC]ٌEic-NzOV3:r*^b+38vk%eӋFY>QΠmŮZ=EeKh2B|7.φu夙1f8 y=f8DmrV_??]Y&yB3_+!4IJ튉igD_?vɋ,OϫnT23.-N~oۼڏ5Sŷ]-GzRNQ5odT5!-yo-駮+&w"|7 Effz^q,}V \ݤ^"|4dzb"ꗗ+ۻe]fw˲n7ve4sKS{,'+D>49{]I$qV]̎^eKS/87-/_ldx 7d/|LN r885. >+}HR}tz Jkm^0Ӈyj+hŕ:'!(*?SLԁ䮵oZ`]\nc%SMd #M%%B\n2_f쎦^N}@s)u4 nIj_7d rC;+Yge7vP+{}m6rJ*j*GkFMOa^25@\9"ZVb~+ȇ(~srI6ON :1sRrÇ S 6t9O?H#oKpZSN'?yCt' uAYaxhw5Jȫ?iDd뉄W 7uM^^$2X$!ʤX =W_ɘ5UdL.j/L-Şhu :*3]Ӫd؉h ri.fիy,1u>'xzs&L{_*iG<_347|u&@]48 NؗN%q2h*.A|="X;2 f EʢcA_::RͮGd玑w<\)?w3I?<[[}UrM<=.֡{(J0sΝu+Dw.oqs>ES~ܯ$ vR橝$GU&(QaV’[ՀG"R/X" (EQ$H\4C-N(DcJlOO9Lqĕ:^],R?=p"nV'>X'nI` 1p_$'źRyGτR1=S`f&gxx'4/A澬p`?jAv"ޅ]<h7kê<xqx[f~Cn ɂ(y2t-}Ty YӾ6i9i6A5û|ux{6OTΣ 1a؇3IvCMhtZѕE7)w*SD/7ZU \ĤɆG>1̕De!% >|=cHD>ٔԩݣyh2M?uaJډ?K#[f5{i3J0vK3xɖ줾hϢ{)],'9j!0_`k"n2:~XSጄ > b*93}kf!Eo #2Xcd :McHj_sEdN1 ?Q튺M^XOؐ16CcJ<R݊03&J%>Hmߨ8}vfh 'N?6ALgT)OgS MEUEuO9@ E+-q2ڦw(U8fmNk46yJp-p+*-iŭSt:ma%&'e7*f1i!U#Dt?;EPliGKD|W$0.#\-YaVuZ,&t 1IL9(R=VGM TdN|٘ywI'MoG: 9[.dzZOEizNZm,f>LvGMB^iM\ <7O}$9Q[z]Q]Ujdk!qREةb;#鯅Z# $ՄCYdOB088 J)E@V@Пl ʐ'cpr햱hd,7AyWp^'RU 'et?y޺~&[3$I$`Ȗ >M^_)_{]jŊ0^p/;R֮ϭs%SkkHMuBh%ecBf^ƽd~4=%e;tnjudJ3ٛ'9igo8cs^DӲx=[rh!h@Ϧ3S@,_X<ҽy A9NSt>Sj u˶Kkk륩 Nk ssGN^eX>k\zEt*xRw*6ќXO;O8a =׏\Ҧ\9'ͺX[ ̉;--FSQ3z _KI %>frh,rWޜCD/Jة??m&_'*hhiO#`g$iQGl63-D܋Q.}>u%Ct6?lDwF ʵ/tvK4:C+*x>h}3LS76MϦae)j]S@8$25:&5[kHX&?Hin{.;j<]F|l3D;30!~M tA_D䟥["ӧ''?]"W!ƾq {lXڊ~'IèJ~ CosyaR8l{`s?$pr~WN{)!,IX#\HK?nH_̐]ޚ+׶Iq H}!GVVj6d,39v{}\82F2ÈU&~SmMO )KkT ?n{XRP`y^u0}٥rʟVH6JoSd0>Mg"}|o+}[E|l( 5/S?+:>eBy&\o~܇57v,9o/Gh{K-$,1%15ih0>9B`doEuݖ{ ) }X;#jnՀDx5T }uyOG;d ~);Ypۡw?.e2JDi)T'[ݮ:N* !f%da+96Sojtƿ dտ%in&GY-.Tx~t]T܉`l>!t/F!P?#x~UVAcc5_d2vf8z}"@7!V;K%1=⢜=xPJHD_{XԉX= LLjyݲR=?69WPCc.a4QoN^#Ad%};%+Ty cd.hwVfl2_HAX]Ƚ׏ӽ;#X4La8 4O)үVYROTԓ͑B,/x/`iLD“30c$Cgۧ9AjiӦh+s6s(GDLigLOE)O:'vxBL^eEWYk7^.8مL(9X(B%(vM=dHYyb#kw@tW8{P_Y-NX8O|(N"'>~C1gdp2_+md&czFR`d)dgW_; HT j4ZΉnZBlk.] ?_Cõ8& sI,172Dd xZv5CtLɋ{ ) st($䲦-'6 p۞O]__-RYfh ;1Ǚr؁B:_~4~/ F a\ˬ~5 Hų_u/ үip^iMI\i}\ÕPSL \0#LE<uOA[QT;"z\np@jl>p E=!B`:d_ jޔJߋ!'2(+V>XCb6^5M_Ovf!u˃ϋ)N S%5^3?4O,^ĨɭP"Ng<0'>* u2ZfV\mG,nR>m7}kתs͞)[Df+#ξ;W= r2C#T-:Sh:%u';.Uk(*h -:Q9>lPB|ps^~ O9dZ-"++B\/^CCj?BwD+ d'B͟E2j<>v*?H#MpkPj q5C5c e [zG)d>K 1xIf _C)*HoY6Dl>&j֯wf'p,2}),.ZQ4I&j:<2f}dE}&OnC*ݮ/8xf+i|bVvQ?_2%PB|Z]2c^*޷Ny꒻N +锫.yNYMTuɴeXCo&wPEX^&iM& ~y97pDj^6L^2>^\ U`ѹA 2jw}:Llx D}-\ݘ `UX-IXa9r%XUc50ƪ5&!$Yֆ,kDV3{Ln6z }}>=>FHyN4MYKv9.FTun?k FS9nML8y 4cMFҞu)K9W\6Xmh1-eՇ/B$dh&l H\ {BS;y4 k8@P TӞ4^[ jr-s vmL>:گw%nSwSOH ЉZŃz RâTָE\",~j$q(%sUFr(j$R։*6)clSrcN^"%d"9+Q#S$h*MUgHDFWXvXeKQ^LI`USE-V6WO4 iAy0Ӷ|:ńHt-bVG%l %ޫeunԯՒ<~WÙXd3O-R_@Ñb ]mײU :EF.OlT?.f_ u.~tDqA`ҥ)q"j`﹮8(覯2_1t,*_1tܟ):{z iqMNR4Ffj;]{T1|ݯբ-ZϽa=m4&)!ߡEԵ#90YOHQwHڨ:*Cp\C3-|cT[Ħd\C8LV Oc:M U^yaUuUGQZj  Q|mE"z:4SD`ğ0}x _ȏDIDTn'Ԧ 1Lk4@YNcgw+}02%ҩ t â,߮+Duq8ljJ=CCP9]"%UFvNfwao33/t擭ަCgV/ţhsieomEo+sLF{ʨv]Wb"fνI6[oziap1K0Id~q\%EgX@|d' D9쇈N6)ԭtj~,~adwh֢D;L"Ⱥuh`|j<6Dt{9GMTorY}ނrBE:d7>tR$Up:?2+XH;ٔ%|n}+ǹ#w[ ׏KnJt8݃L6&{(% a=""d+;gʓ0Ol;Mϥ 3t 2QS^hb@b JjgzMY#H"b?d5$6l\u?Obf"':|6)b3aԦuj0cu"ڒ^ǸGFw96y?;{S𳝷4 NvR*5ˑ a@Ѷ?)\ijrI.$`[.-(sUvP{=y ]pP?]KY?]ŞBЩOI\ۯm{D[tTSm91Է˜r|2xh7żW) M5eV2^`e&/}/ЫcȀ'L߱G.j_iOpdE%D4,pie0k~r,,OD:xD9}I)H#-U}l]#*b,?)fi藆egh~79%WGJqE8KrVbHt*9rN~RHW]씖=ȗ첇.ٌ#N-mh1 H{IW'"+.~uT,~6ةws#W"@d>0!ɭ!aH=x/cZY~pϿ#Qf;#Q~-#\;>#{E, 5窐2],$ ?k#iHsj,+ۼDZ\ iL68F#$!zubV'qN R"{c5)V~y_’Ĺ^ jMZ@SN,3RHw5 @Ph{.{m6+$_֪nn@; Ɏ$"ij2$Ҽ;gxrkvc L |a3Lm}x2ɦ(3.'͹.hdslV 01s.WP^՛5$m҉2uD Oo}˚ZJI\7>uo|c{, $$zT08x[ A$qsrFg@$' OnobQ9gCA盠>Xsxɚ'W0%@ӇTݗVIO}>D\Ѹ 'DE4el;ݗU4k/{<@w t/V<8ɯϦ}0mIϦ}e>,'Ap׮EҐ}y Wh=8i&E@piPvxN 7,9Z@,;W.t5='yMZ&~:Gi@0U#3 GqoŨsV3 Sd2T ߱C2{>*BޖCb֛̏K8XBhb\FEZ#XYQ|ףk"G_"$ttQH3r6SQ(֜E!>S]~WHΧ43ݠّ.SˇhS)<ԯGGWƏ9r(ڽBt4%`q֥װvYA#(xda`?oQ$&= ym Uq_{غP`IP2!Źbߔ*lO3s~[Qh{Z4 r~K9W&j˝mpc>ߞeA).)Jn9!z/KDLhpkj,tӖB]’ {Zbӡ׏[fV.ǙH[=g.g݉_s@E !QY0˨FUZq2;(m zxb2d鉠$ K[ەnĂ%dLec$0-lfȿ,T|MFɖ||2sˤR1|v3|JMXxcXS`өo6 PZ(U){W[իi@,C8:V96;@FҁD:=e{ X5K ZT% Vkyb !29n{O|oĮ]սw+ò}͸KN]ﻜ`]LCYlX׌׬;5srtΕ@sN*7hϦo\8+nh uol9Fזy7d &8$L<CA6ͼPpDoorCtù28vϬW`)gkԝr\5ܞ-.bt}=(ILk[u~2UO& pg|52 񇚜B ,V89)vq=!/2,gYߺ{=[{Fe5ѳ}tD*;,jZq3Ș^gگ$JC2\K0F/c h ˰Rk}Ƭ+4w.**+9U^`<}jk)TlL#tܿҔfo.8eJZG̪$[ .z7?JsV󼛒=ȝFhcuDԥ6ʼn%sǕ|7ohaGt2l[gդ9=+YAqR.fm~Km'.ȓnƑ2a2(r4Z\*¡_ǾlD=r0DB1DŽ;QfYЦwíw08:|i D#D{3'&w79OrqbWب2z042҇)ACȷiJޑ)Q{iB) zT{]8uK Hk?Sr~ܛ@͂]m$&"^xB٨Ӓ0_6Y:Pؘ;>/; Z!ߛŪo[ZL0l%"b&5ͷk#XYp*Nv*_91"̺L3e`tl$׃s%4ͿUw3dT@^i1r>$[[]wj%=7{1s}[@ B=^ I3eOD4rGҤt#Ug7 AzD4:=lC_7B},[-9>HOh;迈t{kqC闤5~j&S@v2nDȢϕri`KE[-f q9PY@`]?F8;T`?m9xcy4Z<\LOkFRuQ]rzeO|տ$y6_4tB 95M: A3"#@ ڄ!nsyX$Məods0(/\ŧC}!l-A^AZխ0%D#&-z:`:Cv7ݢ7R^Q8 q~p[o{wӹ|]JVlb(LɹVMKk\˹J+jA(&mwM8--)%q{VA {snUէdaF)SN}jJbG2"f} )pj]%<2R&81D̈L@^D@ȃdNm)Q/݀XxƁ4}ǝ|VD k3 od68n#9nvM 2Ędf.DڟALH4R6jm{Xi'Xze#2 KL[..9% (@X M:,W0!jLZeEsMDXyM$ԟjZczLv3M㒦។Դ,2uT"U~ĭt+;>LI5|>MݡWR(%?RlAѪR *!B]fxpF`.7O %>:",D|as)4u_EQQJ19V_7ZkۤZsͶzŵ65O:ҴK-b!e%1ert)RnEp6YKQzFe[ Icoa*fq{ ݼ.iʧыI-iD֋V'5aKznIO92oJAMO-}my<ixɋbtkQQcT"Zɽx͒Zɽxq#6I>@嘧  7F86{;&#Dl=ԁC'AS)$ܶIpc.ٶNizCݝ[kw71n-5nZ5b~swCU}7Z%:+0Kx(SG=8dopɧ1{W00)ePrˣ}v9EpIs%ּƷ7*]cFT N ~\Qq֖&mE~(:QWQi=\/tc,{i(q_]9'c3ҽgÙ_"/тԾ|G3Q(,. ze {eVMmudc84VIפߒH.NpqQhj?L]*t)hbl"}4n@*Knf6J9CW(!}gB_[w)w; ˾>_gQAx=3k ifs"1 3%g"#)WZɻ,)hqҬ8o–ikC:eLKkCSf=y~Q@;Lhw֏p84 rAK-Ŗj| Sp_W[.}O)4(Ep@Ac>oG[;F'B#3?!B1I)YkP O@^V6o@r1TVpH>]vq@`gE_2w5x5SH3C7;/&kWt\['6ѓ4tSɗ[:I+^Y< >*W*49J;5sXb3_+x\!x9ȵL@afM'B0JD٬clȌW(N0~ML]E#˄R6(lb}Yݎ9,] a2 ɺ.t4/gV82{q觔뛈s5O)&%k Kr5_pX|mJ\Xb5NzL+uHsNqi$>PeDhɮ,]w!ɵqaN6Bz],`1߮MzL@2*($ mO`H:茶Ğtŏ0\x0Hhҥ y ~D`Ǿ\F#V` #_ ~IܠdA<#xQ,2}/ =T 5 o>~`po v =c%*y@>bS,0NK )ӥ;nnou]6"mD)$4 _do ?Ak;pUp@y oϺs#8#h3Z9B>ċ).Yl,F /$0|m_ %+44~eZ>dɱbt~s*" S $ӦviU(s!*M[h"Y?Rl-kVٍ'/P^_Sgp̫f5`'J ǃd_P+Pf?!M^+Fj)e/*y4 [PNG'5~uE:mK4H䈯{@ȃ,YWܠEVP:'ұ:1\ru>|u IS6Ǩ/6'Ns؜V_z&LPӗ_"'f6\Yv•5oMSJG.65v,χs4]glz? ;oN_L-9pM䛖KHNrf>}C2R)FL𑋲׸ WAo6:ؤ0҉N$a,.:#WIUT9I:i-Lt:9p\NDDK\(O8~;XBw ;+.uES՛e%TDc4k.?M-#[" :90=Q])B>wD| ;:2ߙBr2P];HŢVMjvuj8l,\)( yB9D!f#7rUXBW!R8s7S]g3 ?~Ԕ' 6_2t"Z[Wݒ#/qB(>~sļ@֯$P&2 xzٲ$C7zN;iBYDZ!=2hZ8Mq:$=q3y=Q=L]Opa(0F 6GS><a6뢓54Zo5Y-z4dzֆtz2w7A_=[G;丌QLzɲ<~ŝQ5O0@ B .(x7 Y"ĉӬltOC e b¡*PpJB:;ne xY{vF\`?asofٍJM ^U=FCQǐ60Nӗ1a=*`lh9Þ1XkX. (+]I2@ؕt?6ؕ"K"Cbr7 M)@Uӕvk8_/K(輋_/KJl,&)rt-ζ9xo?"hd&,ܚm si- ^C{z !X85#if(!Hxyg|FߛI\4!Yʀ_SAQmX~ ]% Bכe?:锜0m7Di5xy2==C_tnP|u]MBYi[D-ʉbϣA^OzRYp G ݱ,lѽcl A6Տz-bVwnK.pUL m@5+*"w{:v̨߯s4˚+!T`4HGc9Z7)N_`/Χ<.)2@3Pa%$PC&vȽbzIJ wM-Fm$m[Kv7QcXZ:g ׇnJ8T-3e9l)B/By1¥o* e2ѓ*D @0f<52b\ h<S@[ |u[7'҉PtnCQ[Ƞe*ex@ѽ/0g(|@yUel(& rDSg=O2| CS_f{3jmT{U}rͼ]#)raFM|^EỲ ?"DW1h4_kzQ7|Px78b|2.дWֶ*DcZֻE O=G?^!|5;HCyH`Z[=KJ76HtayDXf:8XLudnye,7o>: [%",T6IM@PH;d{{ f}Mws=Lq9JKo ݘldv7&2րˎ }4IDz_d[ldpAG.@}Ⱥ>#&=͂PM⋼;lp\=JYwRd9{fYz%>f۫;+yɶpmn\Hh2P7[,rdkmVCmtsl>06.BkSģIbAx=k~N+$ / KXQMh$,7&42i2ks+܎n8VQ4ܒHEf\ Or)F66qpM,#]>yf(?<@]78p1.&XA`)𳞑̍qf~2aqE-?ɍ^f "M=K8#T.A<o5ZAeD>%Bmgi\iHv[gAty(QX[эbd7y um ) vb2AmU' 3wX%<SNFP@ܒ=P@&$37 $j&hquH Ϛh7CV1"@af{,ϵCA K"P2\$,`L$6"J`hd'VlWHSLhd+4.e{io4m=lI>pM=xCb&dl', G#[`zO6Vp= }YX{>$yG ygv~cO/R&b(OX~',h\'X%p `v\ie%9FjirS)9Iu̕Cid~YnE2!t6y+fszV _̭pTA!. ‡|@9!$WuCQt0W M;|Z9m*|9(D|pͨ3,p}@QgX~BFxdT0r L*VVd\Q(!dAcDBXȾ[~K4o˙14Y}r,.\L!R 4LQmJ(xpd4^OqW ,Phe^wӛeB]Q PAr|.|Y $92=Y%wvI=<$%ʗ)X)SXWVƃ~5AcDB 4&*'ݑz( d49J(c.7|HɞYp8N~V__K^SVӨ6Z9ٷPt[iVԩQkm3A8 sdmcR[leUe䦷UPtβ*. J%љ-oLGq< ~Q<>x=u]GAT0 Eb('ܲ}_ʪLlu%w{!CyWoR򉊡ž)(tЧN}T(jiJe-zz, r9PuQaӹSA枡Rc 6@Eۇ|8o,>/QimKQr{ͷ4Nwu|(*4ս`*xPukx9ZjŅǩt{x9mt7{O5is9ybNl 9`l$zBYUzn@4+Hp)vjOi? ߊ:"Hgq Q|`\YPHYi-nϧR֧}\hRR??Ev9G\WʩaDK0@lJ:"̶/Pdߺſ P=oBj[Xo9wYދO~'~Q\:<|(HoplU,jT@z&R+5* {u7~5TdkjSl::RQ@QGZY|#[k4VSđZٓhRr!V#rH+mS^=$ձxVl7l ]앁]b<03lPw벼-z+:BgGV~WD5ڴ}8Džrs`Iu*9"U/'^5!\C82yJfX͋Q|mbp@e!kS y?/[PFfׅRlZ]cC髖qጧA?sX[Fa (:KjVùVoxx_3 GtPtJovedOVL7< <$WDM@G$jβ*&Y;GY,K7Cs>x:Wpr 5e1)mݽ)췚ǡ FNǹW9һyQ;f«f!Ic;G?<Wm7#cj۾9m窃ɆE "5 ښ‹w(nFkq<,Aڽج!x lUvb]cqB;gFtǪW[Tfsr_Bە H?[vxZ^i"E ,vBW[xv[ݡۘu{.F ZqUWEh–iד tᙈIW3dak/, g=N&Ny.S~W,kC0ޠQl;4-i0 !umK%[+%Bz4` Ӯ%jK~U1a#0Ŷk !$zX:0~)&샊ʶR\TrclA]M-5lcPQrLq?ͬKAy('ʲ{UfZ}Eo/bge l-:˗lTb}/:ʧZ(:jKVc_]ؗTNjQ,.?Z g; \tf $\GGGJz{<Ǥ<`%&BD^k6I*X!91F3ڳ ,Jk/F }KPHP;=cD]V@2 ~f^쾔 :OJK4jZKѵ]EJwR=0c#8]cE.*ޘ'E(f܏~q@IɈP~q2t0چr$mM';@SrPnFBp=A @mf&``?:I^n"VZ )>%@I!fDUfv?ĔpJϰO 1AmM۔ B%3jmb>t=QKׂ%p8&$~dA:nu$ .n!&(2#8ݦx;g(GV5(~3p_7 AÔC3>5c7O9u-f-Y"r ~|2s`p5ˠz F::6\j~+|=W٠s3iXFB N8@ty_ V}qy*9r+] 5$X(rgP 0Ȯ0'ԃyrig)`ؗ X. rw@K9#"M*lDGq2'< i/axeEX+{wzX9^A7NwQ}Y~׋7^/zQp䋬_~ȧyѡ"+]a$Yy^y4E^Tcy^duCih:_usW??%k*)_~ſ|E?*_k߽W s~?ymӯ_xcNLso_?xU_1&??ҘRb/ޟo:!܏C X??Ǝ?/iN]EVFz~%i/[Χa=>?@Jk@J)c +lSR2EυUöR XJ@V[iRhM,SI߮TDb!HZᥚ: - v$/1;ȇPt6(X ͈m(EEPdf5q*M„f::j󻈎">'TNVk 88(|FtUc\]"ߨjNlBoJE ϫsa @0<ۤAVۗE5F(saMHNMAá٫ZJ:I{bH 'P WJKHk9TtEnnifl .A2PU(bYrg ؏ v*A/=2:ETB\bp(cX;F/le6+T@э_+Ǯ,e?W `MԕS(uC2}Ax ݥ$Ȍfcp_*{ R}I+PR=uT; fWwPw^3ָ'{e*WV E+ԆXq"x2ssmPܚE0@QɋU&c.@`slۅ`(ͨے#$<tT OaWۦKUAæeQh+֦2)e:NT2HIᘲƮѣAe > j^O/8r`S pFU L*@izG^E#5G۠[d龛hPtf5S{"X<&4L ŲP= : Ȃ%޸(?5L,Jd@% LDpOb"/E<@聢B$cr=PbcyCuH0*]UC2Un`?p BA4Y臝l.yC0UU`>\z,< \_\GsC\>*,v=0*ѱ EU:{4,BIQa4$;Ȏl >(\AqZ,mPT$*6nt;1Qm1,8:j+ J8{Av~nEҾy*RQVQ^S7K:/ό/I[Ez<؆JOؼUwT9^aBMŮ:Pt*6`J?jqz% Ω~f:K! %tTu-LuZ@enCK7}P_]# P Mg Y"諲|{0hU%/ *8BpnmdXjP#{KCh\]׭CPWu@Ie::Y7UE!诎lP\గ:HPJG vj`,z8 ֱjl|-JAuYaAYY09!Mk2OHD"n}1].sq~ά]Դ#rK U{u[t* {8 .k:5v Jxx*^=(ۼ8䲌fÞ\eri}_%Xu[(ZC!=drJMS1LS= f>#ݽ=|jĵ#,6 !Nk;˲gNÊe:^*=wzV?O=kl(*\YCޝjhpKP`OEC̮=C7 ba7Lq]?+Jj葉eb(plZVz:u-+p~ZY$R=+̆?`l. z~b zJayVpo6a,yk]{M踚Փ\t;ǫ[31ս:1=+e\՜..Zk=vOkzXG ץz$cW~[S|Z\^ra"Fm+W}fWG]9"\}IiOsDmN6v ~zX{ FQ׭XT>oaFxNHR]qK滢_Oy$PBP2}^O e%9ɡ/78C Kn*BR8ٌn2$OV/_|!3:R|*]DVCQQh.5=T|I<6#2]bpg(%RYأԼv^[X7/ޏI?bD)ZKF>+ѡ-bz4#]Ġ0"%ZYݥ[fgt P="31|@lyo!ywqiK.S/[|3}N<ߊIs"(O•{<|Lkow] NB/vCv·CE\vlOEtPn`yo䡢_bq(d^Ŧgr5E=> -|+6 )Q7w[> E_5-gi7F3wqjLBoV5XMWƆIk-ltHBp$an=a(<^Ʀ7;"7t#*m%Pz: q NF}e씠܂TuoSMlc`앀 t4`4(ۃ(ȁ(ƸrL^(EC&C6OiPyPC.߳=r *⎛9ẕHԬ."PJt Jc' hpEB0g7%fH_$o\!,EfR-5Y jz8|UKJKUҀkb{܃Yʂse), p )mᥑPbJI?Ni5+Eif)斓h(] S-WU1,_ ;QC[N>Cѵ#b4Bo1_9}EFG"A:lJe:Km|?W''6RP%GѶb6ϯSp 3 E b_ A>wXEEǸlu\mLZ() .k Ϯ>u*S|C(ieψ^J`s>iƹԅ"d'HZO;r WPBZ\ c E"U^EaiL\t##*JsOޅ'ZT xqem&YɥZ99 %M{C.vtE]b](~>lxԊ}Us|*{?ʒG,]?*fjfa)+Bc*JR;Aѹ8ՠ+efWrE@Bh@pV]i+\$BɹX/VI#an$9Jd[Ż;I-O>Qܒ+@Qذ` B;Ebf( й 22vlmBQ3/|DDP(`Xκ+Tm֕mm _#a0D~ 夐Q͎W*stW ]bvGv~KL!81[xK E uL*f n(hU Vi) + 6׀bqloT Ber%+ܤ߽O]$"NY({ O,~냫2^?ʷ2ճ;6rGFu*K;dJMVVwּTݨ(8?1(R؊\a!ϋq[ lCP]CQ{uvA\8` ˷Gby\Hs/_'O~<.:?AQM9c{)@9o~䨈uK? PW9$FTr??Jϟn G|,8|;; y/{I AP΃ :KeFͩJR%,=FCZ9oe5h$6Y(Y6y{4^?ΥW D Y%Kpm>sWzMnG'_XZ~2<+ OJJ~01'Ց[̓bF ] OX_s#9bJP9Ä"}6vc\0ݖi߲oC8%J!I^/iabz SyX@kpTa ӥN0fKS̛&BWtWnI/RB&ߚL ,Cw\VGj.(p-0q1|h~KRa=,Ooy,l+xUvACu nφ_ H-9Wo?fw#0-<<3eh_$㦯}zٕK'9YIt<2>r d7 G`2m'(h{FDqD͝@D~G} m?/ںPG:Cpy#Q Eb?CI >L({3zOPЬO>xr zRx`2t L,NibyGd\w<E`0s{@)(lfE]x z(ssO~paSU;OEDe ('_RTtkEvPM? vw6]ҳV1o,X2e<EQ>q.&c~H*r8P녢އSydAgEEŏf'Q eW[LSN9pA5qD,?]U"3ܪKj]CvtiFwLB>[M6.gQ(zD6#gJ aM*ѬqoS<_,V!W*j}nQsVe[U2BxJeӷK#*j,u2Ȫ>^wlQw,*.ĭPD_$zo,TkEqIs)>rRrH&\-%`ףʲDC, !Ab3BCSK)A6`!T.3EX]Bvz#Ѣ.uNT0)QTӲwۖs*p7NdUJTT0νTPp;'F)dN)EpLJIeDI.P=#|8}Q tIrTŁ^ot=.JיB9J)K5N>+y[<=^ϑIPQV5aťHW(Cݬ:9܈ A)Q%RP Ɏj: btQ}\3E ,<lա WtPڕ?s L[ݝ(̻w­( P^FIT4E ]SQu@NE)_nN?;zZ2ޠ$ >YF  HVO*)[S J+P< g*Q>aZ"b/6D+ a-k1uN_f.tH蛸: (p|,іQ%|J=[ 瀟[ %*{,ure8O)bG6[.*4 7E<mQH [ F ȳ١5ѦZEdFuƪF#2o*+b`ac8(7"Eҥ "/P>4VќVbx (PL|^3#\+kDNKX0 hw&ˆY-[VyAYv1=Ftris8N9Қ 8} wNzQ1ktb>o݈g3P7mNgCy ?Yg3V&3|vK~MS>wga8Bl 3Qj衐/otYK*YSl<$}γ%<Yp4!wmPԐe2)~!5gno?&̩a#a:as&I?EE?=,=g9Π)CpaG xUE$K)Xjl_ 'U BQfxйpvK"Nsؼz Ex*S-G!P԰ Wć<}?s, CuM#" |SLRI _"~)(W*vaB{*9\ 7LDU+Ggָ VG̤Pt)$z"!˅- ExަY.>Tp[ISϴ(xU\iQ~Lao1=9_O'e UMurcwÆ5:.u, E oZoI_dӈqһ4$Ljc]E_ ǘ~Ycpóa^!X4p:Mh51Cߗn5Izt^/*@l^b(/y \.Sfzl  ~ct{dvx^z,aak*1F)߾YJɑ=kDYӷ&I{ 3t}ܫhVΤߙL' dymM:H\抦WLWqFL]-}qmÊnf"QjO$a])l15HCClLQ rnoc7+'*c(xN ++Uj6PZi %j40ckF |Ćb J 2~ Bu[WA w3K0B &TX]`kUUh4}y^m*5w 7_cU7Z E{Z¶^ůعf4i^C ڽLiAЧO^G\Tb9 Ut++׭x--Z`vTy(g0NH1$Gk^E$u5AWM@=-ea&JsٚN_˚1 q̓VP+pL諈- Wv cYSf8w3|)Շ]kM+׭9~(ڀG}'^뽂'ty\]9ؕJܧ8J``i;$UcIγ&6kЭf:hH m~piF9gr(#IKaoyئBoM @qnO >NTMw\zA 3\}&{܉ 7[YĦgMX@l t. 416jq3$0?n+G7aC3w-!pp}xQސ%F48v |vT˿=ʈj{\ad V@O .#-槗{ 9Bvnƌ+]^Ee7#2:,&i8].iPr4l^Ҡ3%9]cl)HkNu"`F<+Ly;M刔LـO('D81,~,GT]<Jz_5e"w]왶/~>Rgmsm\ic\QsPs(#L3o!ܯy2Eտ^HqPfMax]<*E+Xm^KfAǪl :Z냬NKJGz(7L7\1Lƹ %e{weXXKR=PX1res[7AB_ɟ.B"@M9)"Af;^KmHhiD&47jc=XJwl'tbۘ;zw닄VA5+'C|"%ݭ}S]#MP}j!>,$T~J͉| ]w@D5.`l?Hl<$}zDG>J6qT#=p38*|p*Kȕjd[]P}1 XܑAdqN} qSM`zWe !TX  1A2DcHwf<i"੺KFu8&u8تB Z\CA73J큃U_ыJE7"-v_lsV ('X{|pq}Gޕgō#u<nPՕqyph H]BnsIL3| 2.J;L.X%*9-8T@g#v|](z;y|h}2@Ltc}bhݶsy299 ޴i3Im!Na:d܎gy<Wh˦׌f¤s,@ \D !:Wq5ȩ[j3Qoiȋge:z]=+`+߾゚)_)~/%_qiLv_?z>BG?޲OkoM.U-pұw|&X ^gԋYn( /+A0iՑc6ߧv6 .  NX:<퐙EjKi28;^" OkBV BS%VגMOb)?WcAƑ [}UJO1ʶ.ݶt+ a%2mhՕx~:"t!GR.H,62j5>nY€>=e1B~GjJ"XP7Ɣ4 5/r̀@FEͦ/5Eg6OT;,nBxpt/!N,}c_|;>+GwDx \#/Vz;fw1BQBM6fvzBF ài c͔6l7PD,zh]G V@PhL.EJy t T *bNcQ4ə=B s(\w3=~VP$y! $OOO/%?UAd(]ܒa)GpkntԃO.lB'k<4gSI`O|1t(l}?M֊՗2fs!6ū>Q`'R|P^S2uL%'"0jU.(]MeW,]4azr(Plu$x)z7kk'[ 2giPgG.XxT"==L}| ^*º融0bga@y5;l_F촺]v=]F>,(+9Y[-9.ƗOҠcYV@.'˛b'2 2n )s/9k.љy΄[/V"C =  ˻*wŵ/=>w'"za9FUcQ&79|AF!_I>RƵ1d1 ތ^gI)u#}!\Us\)fsQ(!Ru37Drá: "aҫY!G_#R۸RCiRsl,qb.U&Pj*d%@w):}1?0s8Ic(CL{D '[dA\|PtB9O@s &.-^BiRs$!A͟;l)&vMmeAn+(p~hJ0Bײ#q p/r9=1PG[9E}TJK.ŒH$:$Eh%iDI%E' -xW#ޫnm_ ͢lU&z$m%A V8W e(j3]r?,L*D_đfj|yy@|UFNEWVFcej EyQ݄§_(zʗכ"\WSzL y\jHXM!9ggNz;,}p:RLz*Ƒ^m\uiW3) T:>;ﭢ4ƯYvIFsB?7ԔRY+CQY#p<ťxM1lDQcP ̞ V|2w_Chض(f}£lKHс2K zshbn_P 7LU ^,ICfU;ΆCP+ߕOsoi]Fɴ8UO\V-Il(KgZH[D(eԷ Hf͋(Q .ux2֟kS;v;*ܝUՃS=TCO|:m1t,؃$OTu2H. IF~Bu4 6z)Bѫ/|[TD)*qYc&&{$q{xjCsd Im!g* ^BZ:IS@8HOٓ`DXB%*RUse QSPtK,52ީ; r|O;\*jց ;:."(EP@_A"hD uSЍ=M>^a:SI#˜vX&jZUr4~'@q=FqHthQH_Cj, >YEZr`㈇;-u[ݴ;3AU\ E2WG!x\>h6i(NYݗ =v`;]wA}S To_^jdJd-Aֱ:nLqQd]>xf[jбi/LVٟ+l4Tފ&(Ң /E(Gb=4K(T:掩O.BPڇ@+vvwR ωȷ}Gɪ8Vj~ywm)\mL{-G?M?/&3\y8D|Crq,(Gl]XvmP#L{be~񷣝6NJYxJ l`r mɧyYmeq3jm7W̕~ahuJߜ(y ۮN+M<: z$ y; )c 엶 N`<\ PF,+9y5Q)襬 JP[(_}o8áp8s[pz:2(YMwQn֟ƒsT(Zi Pn׉ P|neu9 db(R6फ़Ԋ0@^B9FnuɅt0{ [FEY+3#'Z +,7\<]C ya1i?ZO7mP5MҪׄpdnD ߄Xȱ9a ʑ>:L(c.-<[Mx(Qm&&HYGsZw- mЈ, (-9bgq`$p JV,O&xohU( y-0B@p-? 푈ؼS=824/s9lN *sJ@{!`r褲.MA+"o,ufŬ&WN=+QQǫaDJ:s' /Гtwy艛0 D9[V"lhW]"Z9ZKNH=p9(Jy"F50G s,igT,~h@ 9oDV1qÑS]\^3ft>fhXyVy6g-ox!)3iJ/ҳ@FS<Z< &gAT5A31'_eGEΝ rab @p,}}DqR!gN?"g!os 'KarE΂]{1Љ w)\+Ա/:oo!E87g;v56\>>(vX>$PiRH.ޘ"R`BʡW{١ԓ~sQb# Wt;+j$-HC!pŖQ#';|$Tg2fV=84 MƽyFY~|Z ")nlaQHnĹ8DCU _%'2i!c%4f4s]VGır2 d*i5Ե]#"+s!q 7׏-OWv[#w݂)q˗W<8uhp%R%D@wU+@{ %SzeLn"ۅIK1zYR^e~ԅK^-~-[e$ %wBAVg\(A'tLAkmI wL!Zq y2VJSY/n25^:~}|x<5;\|͏at,L&~2w ?dG,\ #ScN<WD:Ų j(H1# ,E>Fh^KE9H$kVΡ7a`37:%({aaij򑡦 ]&Pɗ fhGf7y;B6cyMN[S53HEg=\q"r.t \D(iv$ɝ/|$p.Vɫ7@qz#5?`4WzzUOW62,r|]U<[ m63}/fP)W \&s¨ m "y,P`B(v>ڝ8r>xd7g"$=T!v+.D\<(R,Ygf(  l$K*TDk/Ή-GlmTO! u7ys79¥肶5߻s ˣj's `{1,djݢI읹wnZ=2UJX0 5w(hE/r|nRG)ed{9,%c J,֖ :U@va#/mHºZvYI3?:>CY>_zd>yBe2]h\]'_xBȾJqJ W wv)v]MHbqmf桢uE-8TV3*mz0xSe|u[FMPdG5ܤ0` Km@fadž ź:(/Ƚ 馠h ~ Etao9^m_xSX:T4ݭUK@;S>n |(mAu~~|Na;y)ǘC^^·%CpNLzRYfH ˏhmcwPG9th9C]xҞ8 ;t e/{T# V>WaП/9aӰnb_osvf nez R$ $ B4R`*)hQ}{TȲq^(@'˃+jzE _!BϬPׄf1jɈ1$"o֓K"'4ΔCi~696.`QXtJBn&o\I&_#9ύ HL1?J{.U}i #ȔWiO@mu"\s?O,5{j4 FUvڂg^,1ĝu!=2Iօh\[OmN)=Wĸ?﷾F/Ѧ2ECF&R2$ @<珬i_Ti{ lj/g>N*ՙbSwV-oe}@o<+Fl7̭|n> —>ڲ&"pjRHP{ eba=rBNXPY$_̋Ɏgςvro[#KICJaQ 6.̄@66/wN."9pV*fJj_T`T,:dJ\12_vQ!*(.Q!簭V4~9oNBPŕVRiSHLau\LEn-Fyn? je NTq߅PПrY|x\}!AX/x>#ҴSu2!=YqI&5%t8e퉍}*j~ 5m&/)kL h#S6Pv0%YY0?Scqw6h7$S \>4妎ןw%ɶPڃT{(gQ3%Ԗ@<g_[߻6&\y>{ s@AA{1};;a P>ZT`ԘE/$$,_|̉LK䉐cwuecwu\&t@*?'RZz",wPC9g (ut̖խyuy%g6Ԛ} Kgm{<05#ٺc.X#plO_r\oAk=,jюM,z|MDj w6+JD/`؍";a.x&<֩h yl4y6̙4;s\n~ w)$1 6ؽb@jMIrUl豫>[.*+C"srLNzW1a[i'j>MKD#埔tSޟʁs 5ύâ#Cc]x]fc}E,BFCrUCvboڋ-m=rhAmqw>nqoYލL^=Ķ8N {Lyܶ~VŶi6Jo0wIN[*:m6KV[wBxl5Jv5"d|T^<)s>RTWo93#ań=r>j9F ] H׉Akv-O7ܪ1_j:8ݾUڤ&ƚ a[̘xȇ4̐eؓRFCql"- N t(ȇ4$lʇ7mp:q4dōqKry]:;#_!Tf'7ؗ]Z{eLeߋS=DL7aMoٴMk?:* g{m5X~Qm.w۲_v6wd ɵF~}\ki| G{Gu O\5L#zaFn,L[{%x>î ޵%N|f7-Mk7♖ u YrU1J_q}AZ2eQ>$@\4_#DM9`F"rxK  1[?CW>tmlCAVs'VD_ͨzNV$C_!Ep,Mf~B9c% lytϛcW \saE y}+ +zܼ\{QoIB洃(tx^: a8];\72Y.a@|V+^YW#$Fp-2| q75|Ŝ'o9}]ekm4^aXhyo7N :͔1!ۘ _.e>=+,;I:!7<{ݻ@a#"C@dzːhQ{bqmĥ}H@6 Hr]} kUC|G۵A kD4q-9 ]{I4ً{+}2OZkWAOM*ZCI<=> PGoJJQt5'"O6LnS| 6';jz8G4=GEt{ɿ`?K]/bzxJI+q E7ˏߒy""R}#GdFL?uB|>-l 쉃} ljXY?|W[Q{q{>FMȟo{@ {IٺХষIJǹ쵟&Хbzm9`80tZTahH kJ.EGe!Lޚ@\L|å 7v+<0ҕ LUꍕ zX!9I|%SDDѧxeoY _PwM_NZu%-zNڠ%q z[cc3ը[.kO#CzϬY4+Dm~ ?B{RϒԲo; iZwl;Yw\֡*G^ y~zE.%@܊7sW7O' Inj1XYa(bZʉ~/qk\qc!IQ`ᏢPKZ*N=zѕgY/ZiZ+E|HT,>`tg=7*~fbuO+Ry6K\Z2xcِ\p KvkшTOvڲ>"E+:Q[wX7:_{{-kC~QKٽca͗fSUot=}Bi1KABqwu-Y6K$g/#Ky;[cyh>=/'c95 xHI6jgtUi8 F&;32yg/#4$ohaAi߰#}t"03E3lHi_]1YS/2huYؿF=.j׋͂:a;1rj}Ӫm.Gl񥮈Nӵvb3i=|,ʋi;▏{ce&ȑY"В@=^ڑtټ} U~];M8=x)Wng_>!@,{ٴ$oH\},#vOܱgIm2n+;|3MKC_dqɫ9n%NOlbD9J&tK^ڑ݃˸ -k9SLmX$?;ńD!2p:.9C 'ֶ:7_ĭ}> گ/ PiSƥ a黵ws\ 2ɰQQ,kR9ɨ2uNJaXoݎRWa5hKE8QZMQr‚74_B!N fO/6FQǫ&Ļm7ܥ'_XYߓ*yډ+6!]5erU}{ #/ f:c= ҡGR2 &=L3AMZ/A?G\_xvkbZrR>-z |7%M~@xh ?as-p>+S36q+8O)&x SV$Gbsg3KN#'SSa*osb[ZiYW&Szޑ.hyΒhے - rl[B%@g[)2O{5ƯC-Ozv$hW3d3K#+íߕV/ڌ ky^ߟ'y ;Eͳ{}O47 #>:L{}#O6J1 /9n/i6B##c2`gVY0ȽVY0iL(ʂ)Ԅ9pIE`kyܘ'([OT^$鬰RCkk&mȣ@+dJcFUX>͇9d+IcbT-C=3e?I 0뺦Ě_6jmEn^#԰q&Zf~|E@|y$)؜]Fv xwiއ [a[䰞/s% nx1w[>1HEDzYӶ;AX D43|Njĵ4>O)wDlaozqg y>m7o?DyE;:m( {c+IC?O Q,ehXzJ=gJ(K#dAm0]#}L,,[/ K獞̎b(L.1A๹"=<~jxwU=_+Vl|Jx ;/Q#|(HicHJmǸ1yDW2'6Žx?v,-,2u&m2u,E#VIls@U^>&t-֊%[i#΂%}$VR,o{*#BGv-4J;8x [29`Cﴸ,Z}f  AـZ%vDNcomy}[# ez^NWO0S uYG3gk zL/!=/?;~%_ U;wDlX\/K);5`ܑ}&" "kiIi(~ԟ{zpSQ EZ*T灌M݊xhW6g-C-n5?@sv!mxkGʅy +~3 Rtp)^)-.tJI xJ#łK:O8PmK3 i AUi[s t[&b/8rAR4NIDXWσ*g+LN_ҫ# -F!Q9G~%fE.Xj‹Jd:xEA㋏i-ٕ1{-rX1ˆ!uڿY1Ǵ_>r` 悲LϪ_ HthjVD;" gNpo4!Z( )𢻚ەi{21<)m B'N4ёJhmIq4#E_ёZ$r2d?;ڀpyL#n &rIM1QEB m;P/NK_!>DVփ'2Czm>"Zfả_FŌnw̙d1T oROa,۶dL'iK"Y|+_>nf0ߌp;iu|R" [ܿO+vn0Bܝc9IЦ=LtY˘c ?]@\-'Etʊ#.V> \v궯?6}+؆Ms ko̺R&+ f3gh𕻭O%6ql~}u[|ݯw=Tt13f H$bedU9?YljS:_HY,H3x(rqz{PG|/Rgyr-iHO_]^@^QvͿ(Q1 G1 T^ krlkBFOm. ĵWD]"ap Z6LJ]Q Yͼ FlZ3-#=̂iOW#rm_yXF@)3$Itda#R 5~$2[MޮE"$"jMF$¦hFn!aK6MF{!2o]޿83 5I_lmלAHl1& }\ ޚj~;NP>٤*ݚ [S ixkg /S $e7'18] S@{MI+j߮Jԛ;SGLګP֚֍D&P¹!/j%n{ ڭE>%3` >ewפ{Mݕ/wԕlZH {xo~S-yk~/"(ܶ#/=kn\պ wge_ ά@Xe >@PuIJ#G]ݒן+&!9,34+oƋ_üA.ٵ2m+4'';\cć$պ_D &AGڱK9%lX`h']׭&aY_ά1*V ]Cjux_KD$;b kԲΊ*k_J R!ǻQŠZ2MZ-9DŽz;{[1 e ='5{=;m!~|B$< bԆl2ϓb$vbo@wL 7efX~ȵOz$ 7<9Co-i8+.do͖ΒB"6W"a;lӹ}i @+<9vUm ۇ[,>Wިv 5]"tO=j6'IF( t0?25e$db~P ^gGIOsɇtع$$K9*_>%`С|H7C;5|Kz*I7gzezƝqH;O._m?;$QhL!R1& &i;.a@hěv N`_Sçٿfۿf0;= t^H_]Fה +ʁ˞ڲ!rM "%\%R /Oش2DSV1䚮gtͼB.uH3>VP$1)c)㸶2rOMH!JdH+qEDK+׈ b]A]l"٘@dET S ؀LQh*v-+`4`%q=kwA榬_iȠyG2s}$36nJqKq`Gɇ<>n&BtX7`ɝ>m\z>6@1/L cz' S+ CGF=ym_>v/MML(:'y>cG3el8aObLyn0ⵊ)I$o|7O8qe %_Γj.PI~ܳ!2O~KtD`e D!(ơM=z\?Ͷ>.P8mΡԥb~ ĢB[g}סԵcس7٦[ 9$rr?+|l{LS)+=BU[J7uLo{~Z6 6 rHi%61R[1y0Y8)s%!W0cO3FK$Jy(id ${Z(mRJ?<~6<^@DWX5k''D\_d#7p)'-Mqӫ%brTz[ \eXK&2o?f+(_WxJ?*n:r ⺺8% #8^"^o=, ju7JD\6oƛogdň$&?~D;֮ ׿rhF6]?pHg.?E7d<oez o WaUas7*zȮW$7$h 9=@kx )#-6'h몐2td/Ħ[T8ІlSH_ /ěZ,f: 8/m ibԩKiqor77{@ɚ#O ŏG+S>|$nf5E[c6(WeiDD4!y&t9"U V@͋;T|#F~+|GVrW|9q!/)%h.K=Pc5x oΌ=Dcx VUL;/cuEΌ](r pI"yYD8"Iv<6Lj ^ĉ^VK@>&NÌ/+Vlޱ졆geDm/Lc5PZIsP}rgc/Ё$7B8e<$|I A^Η)rxǮ/U1i'-۶n1TYƁ1#Qz//:P,CQqɥ<q3޷K셑u_! :rrp%8_UUR4pqcHw;a"nZO H:)nl+nR gW"ʔf%: S.Zc&\1pEq&dy%#٧ތXHef[ԧۚjWmu3boתT,oIic֗{*e2T;eJZ91OZ΂1k "o+\R[.Nyh`r:,z_rU BT@lܩ TnƴvHC;#; FCrYe`q햴rִrUN-aYreO Z\mQ kL%\|F-1E=Ӳ5uP;TO!;cU x\7su;QN+o qkQ.϶8y,+qI ÂN^M 8}TWkWW_f~l!:|:F9`E06L+9@輱D + k!VMDԌDlo`=/ Ӽ9^w#N ' 9јaS]d{8yHUڏ*b}M>?]KI (z(o]QPg}!V<;eپ]IgQd Xv o p $Ʃerx(N ;K>:-fg6\ՠ)h|_Qwn:j2++fQ*#a(ڈ"\e5tгZcp.ubcgT7k!ڑyH|T> C v[(1@ xַ+]*)te>-{#Jb1MtMzᖭ84qLV)t#~-^n%v-ԏ׼7 ӿjk[bފuymB\^Ɗ0+cŐʏ߼ VĖt rnr^tjjJa媸SaWjnWEK=+S]"WHK@h@7CA͛Y$ .X;)@4g+<k9z}coC0}R{%'=&⧒k?Ե/3&9~ ,ӻWOv':+vU MN}1cH=&-$"qU߮@=4#Ws*g%;EF+@5_~t|׼,7!fqدW_ D9~G8qB0҅"I;b5_!~w>`ugSt:hDF~/f- _We*x2w6PyaY ?]̖Fz@Խۦݔ>}>wi Dm"!*z&.g9;E/gkMs]A H^Ei߯GHtwa{l_5k@ `G 3#>b*YMcSOm,Wܵ:uGܵ7C^%=cm֮vM?@Z6/uTcU\ +̽;c)&ؙad Me~ŷ$ck( S__.t S F4nO*>F(At/+hf6@t{,Fmc,'DѤ@@'@wlw?͆$ }.Zrޫx`4cx h[Ȍ#!Q"Hwq#ȭwԻ'nwA|ͳ,QN(xsDb֝\||SnN5eObjk2F$T(VoULgvNfWTitimC Smv7 ]1NXWDI{iΧE Ѵ&$ 2ډAҊ%`WOwi>cș"}V+yy]\ʸG>5OtШn9٫Z."n-Ws&A;8`[NǕ_O0 Mtϑ6\ȉ܌yoʅpBdXe]5&!y?882T ȑ3JA-,{88n]/CbT_l DF#iB\n$&y53NWj/j'gy Փ/:-&$\7 7o}1[scʲ ;$fLE}à2-3yL&caxZ@ J'7 ߽^acIcŀFJߛdt3T$/ꊟV( ! ItDŦ-ux"V!:#OBuГE,% ,}F-}%(p}?T(ű刈=-X$|Y`^ʺ@Oc'.X\^弾[wkss^O}B$b͑?J+ʽHɛ'h7"זW%ؗ@K%[Vua,"Q-fg-˪ 7#CۻOWk wҡ$;AX!d@﵀5b@aHf7jhĹ҅x)SHoyJ[3dž[iT*a̭OT rMcK-=hm[ч'uV,yOݰ`YIFMx7_,{ZlQX5<>SnP۲g?j3*{| , gb#k/kR1gUsw"8q}W6Ծ%Ծ,.`K>BA uL oG4 e`jbeNnf$= [0#Þ4s2C yU<Ï"0w6ZϢD) 9NT ?6tV3{^cÏxTJVrG8+!g$>M.ZE;1"LuDs}v_ / nRhE4zGCpiQoM46cհ> "јqf-NѵUEBzCR\""e"=e_Nǖ'TG H?M ڷc "}+sZVL}aNV{aiV<=zR<'^R$|4O#"ZE"7XǦfJ&C"xUf]Jzd\sHsK ~9%iԤ5c)^>2Ii`iT~2%<~ycw̪S[_@6pB< 4Gds~䎹J(%n:Pg[)LHvoz.룋/<_Ske@ޒ+xwR ZFVA+L#%< p{J[}9 I5B-)w-N~xJińK !A4LL#;%~L|JmGso*X qNH{1O Fy!tԼ?۞wԛP졭ډm&j|jiurf$%[$7=v/Lk˄JK|$r.[Sexl$71–=!t@#|WɘV"fצy,9–zϗ;GN'HO)4iR?7ڐ#W˗NFXLvDÄ ЊV228h;MQD9`C?5nױ &2DZ =58]R(DuC_uBAnׁ }.k&̡ mBӼh*!74..$RhGc=$M.NWQ##J7SFeH44jaiò10atGHhu sf98Vi"o]DUMc~8L"LX-Z!=a(ljdH Gk D3NBnDq|*%ȧ2!I!)q^Uf "o5!{o|ecҮ~N(*h//>QC4RH::$9$HC !Xn?n"u!a дݯ.k4^ݣsH!uȕ}!ArBrȱsH!9:IsH!9䵷B{Ԯ~ C03S g1wʥqo;+5>A߇똲D:r}еOUo>~o>AS_xb>ȏ.]ۅ yꅿMTԯuǘ}|Qm~^j.Q= L> ?bqrNI; ^?.hG?j/'˟ˉ ǿ˟uwo???^׾+)_?_XoxY]z0kO\36~O/ ]LQZ)EaxBVO!{{ow׿/Oݟ@? _l\-p' $1(~?wO?r*9*_pMI,?͉h2Ffp_@&DcP1(ӁhW~D4sl#hC0)A9]lfMثm.!73hFlB4bCg`B$2}^.>11h. |m_"nBᙽ7׈꒯JD@%DpkSFp]9.thdϬ 鞳Ͻ=@"Z9&"g#i ˁ<>jLϬ7}}{Β3 {젱"4o-3*ofGR""g 7\w"o65a//~EDShh"q!͗j*7>QG{Nb@@dѽĜ9j7s裍a"n9B@A.^l 'оE92"2 gId"Zqh!ӿbMoiRy#5KFDPqP9MTq NZ`v w<ɛ#:MS_C1ղ'ꆮ~MHH+Dܢ7qL08q+< t#Wd׿zsRVqNjBŠ4Vn`;1B\t:l&Lo f*s;̷U"M#o۷F-cJi'R_LW%minOO}h]ts"M:ڣ4oG>O C$7:m'qDf$G%*wDDvb]ggcJOW,yyŁ%آXnې9rOp[Dt[߹rc䘈F;4L!Ϳjwٻv!Wo>svw ok֎3Z}hBuW7Zz 6D4r *Ҿ,#5ִ[R "!@ l. hH+ _cWւDnmAM,n-N_衵(L`GDh[;\]'6\WL?CQC8"lfL!@5y\ivok,ML7+j*ä.U2zY3]ޞ?׷=XYg M>o(.V[!.kBbi2"HJ9e.3FLoNÒ'&g` vn7fSA.2/.-72q"hy^M8nb~Ua0> q2=IIȪJ*?n|ŝ5†dHWHkAG( Fvm'j[^~/!y5aΌ6Kyrn'|7}ե:y_UUyeƒiRz#PpX5MB^ K* 2}& N؟Nq1pe`ת-Hoc?c2\psJcQ 66M#?{{2fR9.%Y~$;lAlwak {B--h³p p:t?ɢ̚rL5vJHX<m!`.'$w }=(+8Wj y'ob9餹G7kV2ӿ..|֡oCFIC="`frdWOIҤE 9ObD/YUY@0zW([toMWRN׺.tvׯSU6xZC77!vR3iZ;40Ic Ճ,'+@x,Im'܌O;@jBv,vq$U5H͋0 0GqD6ϓ; g i+]yO<@c9g%DE䉟*zd0 +2%QDU YzgX8g΅̉T-G,-5/V5ҳ-̑ "E"IOGrqy 9afKH&ayfGṫk`jָdiwc"r#UF!@ܗh6'7Tn&mi6ִ$^Ռ:/&DrΣDQ53*'BvNS9yT{ѣ9Oj.sV"$>L$GqSv8Ɵ]q"\Tu?^m;31v#1^?8t8-]P܊p٬jpڬr:nYWj$4oNDfVZn]Y1UV^"}/A9.!r5FzۊشO!.-f?٧r+e7ng9=]7<'  g~\ ~qz_Tqeo&軦¥ҵ{d%LF!h Zޛ jwDVO1 eF7anǾBZ!}U|oxVYeϛ]ۇQ zHkAX$@:SP4Cn*5iRYy>l6# 6;Ͷxqöx>ebr8IЖ^U݇DFj82¬PL L7a)oBB@ a!'採ӯ} g^*R{#A$~N{3D.x*=i cPqx?Y H/۶`" E/2O:j}4 s۴X$"BŐ|X Lj ~b+sB=" IDB$> 5#m smEtgEYO07P[|BgBo2ǘjk'T̝c"UCqMţU΄3-RR0'`įj3Eh԰=ŖiN: ö'bvšXbXBSQ5z Y4̘H 6#fRS{ZkbMP3Dķs4ˋ4![D:fiEf=YT`kи͕17/p>@ܧvy^\kM`"ypC~“ňW}-|{Ld1e[:w[W a\ @/n;="X )W}&ABTSeϏjWOL]ѻTvX(~+#h u * V` LTC"V=Zsnz#xz `,K~`e Dj&\Yy4oG ćX\ +[4PX^B+- [mjBb \n)a+dXk tꊠ~+nEGqe! Q `bvUWiGpᙳِ"Mzd=N67̯Uu߳cXcF뼾,n0RquzI02 )NS8P5#9C&JB1WiЖa=t-qf!AWF~&zj<=Cv}!B=2-&\_xz E![vȳG58>x̖" YHD$~򚨓d$("Ot6"-TD_ .KlNw+ bPJ<;e' #JS$e"r M#W=abZvYe Q.FMܨ佼]ڣ  r 1+ jdC꓏eGs? QG zDݪo=J-gIT ePjօ[+!s48?w]]IZjï+Cٗ++Q5kB :~W5٢E_y#&ꕜH'G_҉x#W75oP)ゝrp3J/]!e @ ri {6xr4 _B$2ڳA4 =#| R*xܗbW^@K``='©'UgD:vfuU0bApet-Dޟޅ ?Q"tm E]'2m!̈́ ZBCLbW6"q v)OĻBI~Lޟ'_ J[BTH;7 ʚ#ҁKM|!&(F֏K%!ҷe')itؘN8wfo,S[?:bqBaѹ׏ Lk'}Ũ?"ϗ9o!"N7a yB 4M\`8UqcONhf-7'ma~S&S8'X!9]߃/eH9s ޛRڹWӨnm͒g XaoI䲋Nir1Jg.G@BݯkkS"Sը' חPTӉFR橴AP֗yaX~|vBE+$ ߯6`%B`R!!w]&?/t4zUN+ZB-Hsf,%ç1(G">O4MaA>}>sҹ{8FA(ZVsD ZFh>npڑ9b'i*Nr_LLx=b5|CYWb3L ԕsY6+7kzz_QY;XY&6|o[$d}vIB>;hT_W[yCNoŽJ`P_GB M)`Hmy}cteĒQ ˃_M";峞bakfq4咆sx3gr?zW!N+Elj $= ș2 3 ?OF(2BC1* G\4}*ýulxu ?;?J.qeC?|®M!gnk gC-Cz[|dN #*SUR?S+WZoKIh_OC'8jd~gk`1W~EWQ_E&P>xY㛞ֶr Z^5ΪȻ@pʤ%(wR;;4m5ef\~cS6P<(OFS1V4¬[-dȲjE›pF](_cb вl5O|a^SioҤK7P<,GV0hmMq}劊_t J.JCɥ[fy?w|&>|#ъ FE`$&pcMnC aICW}=Gtu(_Jל(x N׍0Yl~/W\p٭ms eTk(;zl}2ϳw=κWpd-QRփ[{go }p ȌӪt5,%{T T<(6s1ϚUo0^FzL>*XJ`BqǓItl1S$<:f }|!!L*G -y&/(>P!yMLv${ϪfufŘx~g9S0_;Mc-s ^4̕30{fW-&P*:Z/<Ҋa8w[8Rb+{8&duN{Z6nADC> ެ_mAt:' @+Xm$e𘭨&m yWQ|T9ѤcF9z87}Jk=rXC񗹲72SҪ>,wn4 '^d$|q+/W'K|]Gś]4O_ǤNA+kNc:b6+Yդ_% |ȋsϽh<>GO9yp*N$UW!m[ށogZ"m}C6ٵ3cq67'N(=hۿĥrN<:$eggnVxoaxS>wy:IoksIF$b]rQ؅B&QBֳ9^q %[hەbeof%71I5a8 + 3I ܅ #1IF~wfkĭp詈IR`uL%9e:\]gh"-|*w s}ZL f4 mz_#_3=90(^Nţ *m4uy;e)nV$rMr׃ dߣ*!IC4Fٌ$H|$AcoE*GAҍ98GӎbM}?suM=~=8T*B µgA,_nn9uVvD6[=_fD!~ùA@gg+8KE)o{5CrnBw+ QrV$XϗT?ut)PٟV jou,["ݹV]54$[$>~U387uIZTn["̿XkG!/?MT~s5kC M&G(9fVO F@@P*ͬ9m!\p~E? GY-JE|&pݣ ' )5 =(^t.Ko=:sǴ)Z{b65IC\ڗ@>̔B8>[Ӵ70+UBVLTx7Z{bSQw?%p0`C'HL AQ>yŠ>gU'Gsêi%MʮpH8†{(M֪,E #b7֔gB^Mx<لݟ7cc6epZc>j2"*i.#xJ P#VrRȐ3r26=s_eOΟ׿k??':#uoo??/owobjǿ[/1ƍY'qͭs}6lqe̎` |0_E(*Z6WkԜ_EЯUS|~L&(8L U %<{6|k2![QI?3~imQw tw.(*>aSﯡoZ}mg0k_[6Eo dPL;1Ry-+/&ab*27³~MĔ_chPfy4`J"kkۆXZ!7,( :~AWo+Ok%*N]5˧E&][CS=E+:M\yyU"keQ-wYgZ;|Tݴﲌd zC(sus(yD@~lv˴8BYPՑֲC= {>W>qL l=OE~P'+Řǡ/$@x域WԀ OLY؊hWMZ+9,OGJO'`#;X9 ( %(J{DIV02Jt~ȘO4O}C kX++ J~&k|25$>U !j}1@y2)KnP|'TnԈbL·El̓- TƦj(Ī|.4b3hl2m"e$O!|3]wAQ~;i١ ka*8y6LiK+cFgUԝg:S(ʔ E:N3\*8ZCrvEh?zx/g%zGA[J0b!ҁ UXЄ:BƁO=e;ʁw1{&xG%DҷXO8eTvAx%K(D52UqolX[4(P⒏{*[jy}O}?༧w7{~(!yo<{Ѡ('YU[Uߑ9}V)Xc ZqE?4Wq/pg Aƒ r6)j( FO㵓y9媀qC淯(:`l?e Cqq 1YqaU {`q}Xo.Wֲy`䋞l3rS0sF_I0?Յكb~48cY?PNj矂s%М"B_gcُ nFUB!CMY Ϸ7tQϥ-Y')O@@.&)q73+VT#ͫPj|L8=͐F[4% {$uT|Qmaq0B7W-uGc5Ẇ!@ߩ[Yv]?'ȯY&!=T&E6MB HHiLD]9Gbթv&!=A*DĹ-+zL!ORWv ).y'4AuKyѓ鬎DwuK3+CˣQf寧 k2׃%FG:NV!ߜܲJxB\`31+%POL:_c"a@}ʡ`**Hw 7SZȻ2߫,|4nqy>'in練8AK."޽)(V}_OY?,_AF pDFJ [Rңy#Fby) ]z0E[_pTyhiS4j# ##L(̺.Z o3Z f;~# JV@:̡O3s;)A״jSJTexӝ[x:յl">Q|3݈N?zB3@f"ȥQ iri[/*MTW<x@}ժ{kdJWuŇiמ(<[*MQ`zGs][D>'g=)w]5WgV7@M7tPjP}:ἳnA#PRM~ >X>V IqYv= d9PYuo1~W8b qs9aNy{W:v=;;BSWPZϬOjw Rx}7J Gu{޽ou~s*bMb2dg>i8 orwIa Uf˵ 7]ۓQybԇk\ޭS یIyz^P=:O螊u>MM*"Bcq*86* 5DQ{@Š=5*W?ͤp[rO3(Ko`](77'HwI̵B0sP w]phIQ#A&i9_7闠Bd~:(b<_[ -T%;t{aE7:npHAt*>N[D_'T`P؟SF**&%%:ā *HK oY[vkGiuf^.R|/pyU*'$- RTN%]6?B%>75G; Tl)g+HK [E-PWoL;%OTdmS&NJ h鍣GIoǏ3GIA2 cr~LXT:Qe:3ͮ|hǨ&jo>PB#i\l8O1I9?f8*aNʵnG< Pp7o;_5~<~T<$r\ܒ"dݖt-8#ZK|[?G*)[KwК-7 }n`e2lz%OACqBЧ^4I< )vtBޢ8G}g KřpQޘw_1zG +߲Dkem ?9^|\H7ʊ^eذu<>l*Aa~A_0Y"xݲ:~"928dzd5GK`^捓DͽZ'4+[u-܊bWKxEj.컫muۦݺ5翮V| |wc ~9\n ۛ;$ۮ[[;${S6L? l~j=p934YS*V<`LTWk}:_ OD=\GqM@zx9%=E^׈Kȑ|D0o& xR,MOM}ٟ2𞬰o2#\[bJl#=ܗtOFd&kic1l_$]41'͉p,5" 8h6WPmwpI`wǻۅX'PHz|gw(CB)NWou73qtxjR~(<#.!J;aC$?LCa(>B;oޢA& (?+TcSGOx濉ǿ= Ί]6!6G޽s k0OCVgS]vM9oV7_+T_ 1H"PtIaHqD==mY8Ԛ1m!"~ia1ieI w*mU ׯ5_w9^Cs2.P$WRGL2+D2wu '|2+(q;HW `| =h-!3Y&;zff(x\s]N hЊYňF̍H# TLiG]p1v/5n_#'NZl$1 8"Z=S捄Y*r@k}GG^w%;!uI6rq̷}:OTq"[\uECtIN* g+quxJbZ!.)Z5oP۷'XSET?JV'Vk¬ x1,!O,^ ֞Yg!xo$Cm6:@@ZUhBFIO}ú)408dy[@[:f_or*3J^s4Me+oW )b*`0Jt-c ʻc@)&DUUTǎ}耧#TW-t#yK^.yMWbOa)I?*L0ZХ.ԥT L3GWӖ^>e*hq˧\7%Uټ)L?()L|o//Jkʋ|#^`XnBЍg g; 3r(ʌϰ)(OSP?潿t"\)M'(덗Z/TE -~ n΀%Xz1M&4kVD` %p"b`b HnGXWnU`)s[+ҙ^ϖQCqn f)\p) s`@ H6v|{D{m?(QDǭT[B1aYh}л{g#>茈]<8`/uG ~vZB jV;PxLDֈ5lVP)( mFV.L*'"F :>S+F_9ᐾ"FvȒ7Aa:a,P#/(A >Q9O¯ޥJQozH xv:<+ 5x:gl<`LU-g57HPȳ BVFj߄NW,5CQmNF_A2df FYA b-Lk((Bޕ:fJS{>[dKSL-e}p?Ⱦ2{[1}G!X4E7t%ˆh`ћz#p|v5\N#gьWJ+>zZ@ lQyl [StF`ftkl*IQ?-@0tl-;[/ s' Cֶ؎:Ѷͭ:Ivn9è*_|"(*LTϝA-t!ߚ(f[Tas3)aB\֑̕E#C^'*:Vp]ZtY7k9ÉܽqAQQ"Z0΂@zˈT2hWR %q =7QPHiP/X|L_v(6cNcRn)of2 %srip@A輹tap@/&MGϨ.Hh6#r xk.8,7_PĴs#ﳡF^|g6>COxCx GHU-#V=6/f{}0h%#=,1>U&ԯ(O 'tt~!{s'ap*ufw7K?yACN7%5S2>wU8 !Uvn `to7z3RVAtPHy5Ӣ{+3`low Lz%Wɪ 6m;Mљk[bmQY;Ukb|BNcWFgPna'ƅD(x(*5QG3iVej d.#`gڮ+W]XSuJnT.]OaM}_usMCEݫա#jaM@,j0L5MړQ`Qb!bh7v(^TVG}8睕d(rWKo?Tk.G :)Gom׎p(uBXa!;?x1e?N*?>N,1n=돬QP1uz8Q Aȡ<۞E5Qgt dԺe >~%8AoO!9~>iԨi(Ϲ}gs9ۻrNlDL!cOnIgQ䠂E ߽R ,P~Eo_=:\^Fu߰ŎSYP4HgM8;Թ1(ׯr Ww70g7݄~5s e}>XHЅ,#9k+E_ytR"o<_Yuk;AY~2 @^Y;WΔ9T}I#as wY7c6ͺq1x7j B"N YD`Ս[M G j_w>x(h[ -fū3<(BE?Hr#kUd[cdǯbx}!:N&\~zGѢʯ4(Ͽ}^QQ[yߊt([|O}qKש{"8xmF#J~cOjثmW_/1W}Y_4/CWߪ8j(ׯ:3E6/\B|YpNgvڶ:oiv{h_!‹eUtk+:V` jͯ8; Up,.i 吺v?k2Wj<=ﯝP_x薋ud5;݊D+SP<z Xք{H:[5dOhoomćs@s2=U'.[c폼8ƛ~c(*܎K>d~jbn6/V]:" 뜁aBcv]vB ~oouI үקܕ]; ɃP,>OLy&MP<1Egj)rxgٵ^YTrsLX`ꗛ?r$\+Ȓ%@3Ρ0u >P$jhR1$b-7٤5T}]UP|7\]3һE#YC('\dk4xƿ}V) F,,afzqzKn !~ 4(Ϝ'g,kfAaP3u~`TX P~s?߷vh:{ Rv4u8w%zt1ߝ{I.(I\ &(i|T3T=ŵTx$:ќ$:|WR!' Jyv2Wdb+qzrvxy6 !ߊٍB'f7tfϊM3Ws>1;NQ }\MQ+y'ASC=ž%c~#;=[AS, rB0ӿ P#<0_H -׀u}_JooIծ7 v?E񵃚}0 |zo/ѝTqЯqȚKN2ʾ9\e}Db~n^}L-7@IeB3#l9>x{˝ZokQ!al5VR\Lëcl'`̇fi  FaCk[Pfnj]Vs۟5bWJm3'FÈ32ͣZG ^oc"EaQѝjŕfAwgIIN'duc5 !7D:ʤ&+K8v<vTw 4](\ẔUe- ) 3KP*sO~R*򾺛xkܳ7+6ī|Ma."aTRบkH@?}Z6oth&6H S`uoO['ꑤTmɅ&qжӕc#4GijjڥA: F.iĊKN޴'qe{ԁZ2}Px՞ҤH-^_*-q"SvΫ !(L}mDNOU#e"4wjsg)|x4W'BWX.߭++%4Dz§c ~at ֊STlN!V(8gqB# )Zwɘ;RjNn|1_GSxq5m>ɭALeo-MPI!g*h;OG`/훝4bdZ1E"!2Pe>"u %9*w[$iygY9|Aڐw6q咖KܫU"w#tBԉS4* ՞Mܺ97Ds1<S3K!(X>C. {@'tR:b{2O'ݹ~e,Y[#vBa?a}F&É'xߑ94ۂOƬԩdQUˠȞ dB $8X c3qhF#JuJNoYm3T̸T f ޫrXnI2$z"`MI9$EqGM8upp" re# ]ᄀ-@xݝny{} ݵ~\爁< L/1<.HL׽mOX 8I}{pd~͆H{seۮq 8vw_|g]=ɟAphՄD@푢OEa}Z (axY!T;#O2eu.C KRKp]V=*t[!edB3Al"}&(ML.Ki8C6n-^*'n_Aʪm+tDa? 53}$)#Bsr3RE%?*Y3r]<)g3Sݲ\U~xYsΡ~=jWT_JaY<׺47܆2GhEB3͋C<^v:婷TKwI er}•Qgo{ٞzݾ@#jq|Ƥ z{lL-~7l9 V2/]W`k̀; pdkE\E>yc֣4͖gi6{c6}՛zm>4 ]$-g&57z:bwN^ѝYI}Րޓp֬İIuBW|k>F7JfDP2!3#.[7m2m]'ʲ_7o(ycKG՘Ί(-|t[o, !3# <Ч^Žo.{DO.{ڍT (llU}CV*&xܮ|rΦqxNΞp6/߀DpurSw-kS mZ3Rr*k%"30*3GB7󞟄mKENM>0dV7f۶jUiyͺ"Qͺ h=v#k_;~ZfܹtԩȨiczxy 5?Y5C-+Q\<|iHG(V Grb7VZP8R O x=ℽ߂GH RqBa Y֔AZ0wg@ܭw坨'ԭ Fnl}PȪE|EA/ߊU;{b2;'{J LRfWm(L*QkMƞ4 ^H Q\)gJ:+gh'{*KQЯSuЯ P 㤂3weXъfhw̒$In_$R@ Zp`Qb!'-D6gV$ H ( :kEȁ5jEw m\|=0-[_(6/patw)LS°5s30 _XVE^s4d%S^De[yjQgg-],kwq%J>K>kA0G- IljκvewQ6$)Yr sX8LFl"2/}LOn?1zhX;p(yezCV?5T8ʦ*cS={i3&י>r$xWw2bCLHM_lJQ3U´|-^ {sC8X6^cHfp;p'.(?fm~~L-} J\Q?Ͷ[vE@ۘ?97(|أ 9Fמie@/> Z=dgh3 J2DH #j>ԒWH*偃b7)YH5M:W"2fxn!*L ([ IK*6MsO,0'3s&ǵ'PxR͓SJ<`.cϛ |UZ?aAnoV0h7l?h#ZM_v)׊OrTQýÑ?H+g!؍~GƜQ#[MH)oA7xߚ'rYu?a;Aπ}YOxv x[ˎi bvA_5_ޢf|%0YU)G#3c;z47g9ښ@{aiD[^ϺŮHe;5WLry><-z'G}DUo^yr_]μRW\W".IPQwK2|γctUv ; %=tҜ3p=ہ,rm:Ԏ7S!kl^Zd꠴ݑm8axi_8άn^~\YiހS(b-$CvS$u$yDG9R随-JF"G9$`ZϙZ~PBuPf= #'à|PDM6k 7)n\#3~,mȫMD,vJAʃݩ 5ƙD&%r;*<3z!y>Fb([SP*2NƋxgD`Y62H:䆈{UFö9D+|ze Apt"3tox͛&׭+IAto 02eh|LYtǞLP  `"ʇc 8ӭGP ݸ0z B'~Enfy~ aFʏ%\^opwFk>3_%o?ʨ67DQw)# .}+N8oUGoES8UF}VY"+oFfDNb迋G9 [cttӦW<v E}gU7C);+Sx='B/&P ωs2] ͰW . pV;ՠQx[iʜ? fUôwLˌhDӦXW-jRָ7u&z WKePQ.&tkk+.$HLm_[1g̛'&Cy '6?.APN&Ӟk0̲LM1xi&s}9SdŕNw Z_DS%( R򋄡Ka\N~BLT|0Eͷ."c#04UԤ3ϥ0Xٛ=ZA(30xٳeGb朎=JΡ_X*@A@?'Wtk(¸+{RubB,L~}zg̩d8:Ɠڅg`p*H̬r^}2X:p/߃ҕ:ce>bw>=񆰞)ȱsec0f@ФR0'Xb~/̏_?tDhqMH"S# Y~+[;>wfw@۾kvho>e4\L@ݹ-*7q>M>k}yb_6ϙ5Q#Ń@Ru;qvjC3N)y0k7;@o[ i ] HeK~$y=彚e;$#חhK"8T> {흛"#Qvݞ2[M{sIg&3;]6ǫv87gmތe[q~C+ƒ,tVXJ-xXsB̜l]G1~vmUN#}S^x:*m|Wī-R#& +q~W}Ti،p; &7=89C;nuLi6KDAW EDQ%ZJ|7R%ڶ)'B3I(- oB5w}(Wװ!W&n"+3,BJn'hb.}E:ZRLָldFZ: !Eӻ9/oaBOo#xG`(f ŅhTLP W(>+`]WVԥЖPd%#类^"W+z|LM<(%pŠIi~T]pޣ\ ˊ(Fg(ޗ;}Nd(z yXLXuk2a|hqfWK(>F+"_;1 ??LF4O,@yv,RJzȿ?ddʳi-LBAMc) P|TôD8O):É&zŏ_!`[(}2Ud͑Gk&jtn3<֧7)}`xaU)GV3v^47G+jܬZk8wefGOL0J j M3 (Ix\s,g.iV1|rE zAq1|s%o_X@"Γw.⑤Ȇ4 /7nYgw#֞tZV1/Vg[x/83 ku3 wdRW6vtȼgqn2:rV e?1^meL ^ 'ON5RE,xY b˫?(fԝ? q3'M^ (mGzf 1aPXwEg_E1 nϘ#?P# ?(2Ҍ1 ;΍Uܶb9@ioŏikd~EV¦WDQFGyUZQ,nJ~8=<-ſA'<l_7zs>_AV!oRXxDq+4 E[x74DD#lnk~zUpo;ŸdojUμ<=aU=XƪegScjޠ֫3}O<4-Ax ZZ"hMovPr?diUk.MkM~yrY׽Ic9<&P.:I7uo/+䮂]!7y&^0/VgTIssR5Q`)%fV3ޅy욷}9y s&ܺ7gS(#G9;!Lt%s&q7 Ѣ,GoaҶb7GL\D}¡)OH P?"1Ɠ 1,^{]#ų=^?ySVP?L*rf"=an8ov<Ǝj=z2@vޮzt=!gz}%j,l=Zueٞ]ELgsd$87 %u(>ϙ~2Lx,)Z0obf3A<'Yfr{vyԳRF{,p qW!ARxg'E'U_Z Z$5|Mu%ynbr_`Q-|>j79wTcY? nauHWY=gY+mAr=u8f#DpZWqcx~Ð0O||@* UYַNu?yȞEDW׈'5kU7^rU9iKӠ:ckYej_o> jVx/0 éX7Ŕ ;b:kK="]UD ]ՍBT6_>5*S9d:0d9Du\)˩[=>Sqgߟr\gߛ}O,]KP\nBd83'zR wݙ9\}9C)^8g?w(ܜ]@Ż{}vS 0!^-j/Z÷fwq+TSgg]9̇`V_o˒fS7LJ NKB̈ޘ[;P =oR s(B_$r'M3WO: HJ"' ;Hz2H[ZA$Tf2HLSg>3BrvSI"yjKaع#w@.8?*Qy> /9Q|3 !#찱Ӏ k7nAy|W۽oUW]ړz9#n+`WVYk~^+eYa^yg9] [a6v77T2Ѝ_X_cF7O1eϲeqGhjl",'/R~#5+[7tܞ "6,2Yƚ@ĎE؄,Nάi4+ns}'9(;ْ[RKv;UY\ʎcpʅksJ.>֠qv!EUiuƩXA1cW.\17_ ø6X#^`.ز dV/thJfĒ,wuÕa;zznUJ_0ӞL~k= 99m%BMox1vtH|իMMe5HhJ&f!r w&%_eM x\*rZ sglv׳3t>Cǐ^}44!<2r94H wS8\y^_vW$AO_\nc*?p4ZuO\ >@~+ fp{+4UU/&iCH_P{W@OD6<u܉5I-+s'DZ::$7܉%܉Is'W%EFcO2U6s: 4JSǠ_8%e0El geTő5̟Sfr$"0e!H_Og21Y'`M#"_'e'tf kD"Of WVilFTBzJ`e:ߕ;;}cp'Tl6?Hؗl$ !v, 1tyA~,-}AABRc%:A}jav^An9A A?=H BAtV'D򠠂{z<(vfaJA<((:Ot3u8+o?ɿ|QyWl@#~s6moGg12~9BA=~_o./Lz?*B"1ϋ1a c'v#v_ǿ?;ǟK~ӿA86{FF9FSkIZ%w@0~pa3RՊ`W-vyh)MAR N1n;br/e90|Q)z(uf˸LX1Ӏ!نaYl] +ͷa6Y|痆8b,aK@K6LjP$clI uq_m-׫0qGMj5MޯſaS4 .l ݧ @hD:X뱧|G#}*YupD쯸ƵW`R˿ V?8 .R.ڒ7:el'\,XTgj(8`#j{' <,VIJTTؤ]-,ļH[]Rv j&]JήX@vFŎ_Φd2@(U": Hr_$BaaJVC!38]i.yGDZ >=^VC>RU7 :#WAK/Y2,VfgH7ӄb?\{x7@FߐN RQi`< b'Ei4laȨ|  sYMqT D*e0[}? :mdv6"l:{V*fc1%JID-2O"MzXl*M@Z" \Ki tUX|=LA> Ajn0^zؖf =@tavh  t)}8;bh8,j(f`S=nAc=,\4CC N97 ƯH9DtF{&DiY_S0U1 6┳7g|7 hDz>:WUo6>}vVV_|D8S:+Ƹ9B mQ_cs:'kce!M>0b@@Ͳ<Xɋ`pBv"?cf8 e>{XjpAE~Pdbs5㰀f&=|U䭱fʾ+2HxT;}Ϛ鋜>XJWcz؛ ',Zp2\ٛ=ܹxaYR3C=9 arW~("@xrV1Ú?n "Peٌjug})v /7r3-, lp:E@fl ixnqs, 9(x0[ë^dRmszi{'۰WƎ!h;EӸp;+ֈ(`^Mۿ9Ť#JD.dCj&1oIZ$fxQv:z$ !goTwxap̗D40jwp;)=Q[ae]i'Pkq-|>Q¹7{cU|{l+s݄6 1ڈTr T1ʊ'|>y'P*?!:!,XF*n+a%bn }QYmޚ@%r@~X7],G>Sk@:ŵp^HFqg T-k v;#N Bdd 8EM;-EDxc۠Hr =8>qI; >1{l*§Z,X7kI$7^!Ѓ] 1RFU&ĵY)Y 'tA򙱬cLAAACpOF.zpT6kΝʲO;Ip|`qҏ1ͷڃ:<+*1n) oUjɰf8Fǧ=}Z,Ξ*J[# y)N;LB0q2֪/Ixp&5`&`>r;ԭV_Wcl5Q`uU4]S@}qm$A-=cBc ѹ؏69z*=!D#/r{ !FN(j^˸f k‚'3}z/DzX6nfAar9#hP*9n&OdeYGhBo[?HϢx(b 7m}"UDO`WQ9 1K͏a[ߍ#X(P~4b:y}Cvl-Ͼ._ߓw⸖ ;C}6x3،G^bC ܹgF-3ՎAvHCZħ {M Zo'Dc$y;@p*&W2zKCP'MDzoI@F N<݇Þʛ߻WT#czLs! Ѡ~e(Q/R1n=(zHbu˱V3wzm/-RA&- {hzun'?3iZܼw\ܗW\?[!XxtV@brc.5oMsPRvpaMJ[A{=4w .9r_=2{w*^px_l[ďr>m"Ӆ49 ;M3<4Papm6:M\zx7Ư ~wpF=_ŀ?,*N~,qHy}Q6ѯ!3ǀ$,6RںW* c4r9` ,Ȱ񈉣0%0w9F/ܤ >*9\sKcf2r~Y9MAYn35[ٕHYThTWyMP/ͩa'8xo㐕3J['tc /yjo|f?" #;i4^{(y)UԑKx#WAĀe+a ~S: rXA2/ep$|4rpK~sqk5¥P{[f3;+E51&M{Xy䲒J6f*UinmIKd5,Hf+n*PN/I%F˱ƀKl']D3oaX:cqw&ЛȚ\Wm/[`a]x0^f K $vVknGh\9FPɫy~:P{np[j Vڃ.17BWk@OK~. C~uaײG>x; pՙ DŦ<[=%,/vT@⁻LhX%-\Pqma;FK1a)1s n 5K庨6`ŋ;sFvmG *.uDMP Lf̭˜0C׳(Ñ_pą!\F[Ơ}.b/=uS"{!wp\Z/X0 #C!e2Hl*Y;Y/PՁ) =e \qN"QarJ!w!x#vQ~Usg]fG %w'"}h'{-`~VRz*;p,I=NƫlZ!?OTRt%z̙nM,% T"@UJJii#`̰ˀ6j 1K¿JE, <ς 6#sA}id%z\+]4[ u8t-Kr '1qzgՄ>t-HÑT9[bBT.7XAIXL ^l\,M>pj qb{u!: bkQŎk8Jn Jhe SquҕnSeJ7g-qr ;S!zB #M@zQ=%yx}=I?\\39 D1! DuX).."zjnZja^m=<U`d@D^ GYEwm{ЅtUj`P b|ݭ3k!/Í<*K*sO D0Աt"Wz56sX{8v \Yaaܻtb\1CF2&" DZZ×j)Vд BPȆd@,<"7xBb~ߐ d=* -B ŲTU(&f! 4 K$[@$@IuTǏy @66Ipxw4Z f  upҀH~DB '.hm"Cŗ)o8C!;D8q]%_>`@$4F2{/jf\khc $]>@,c@Pr8tQ}/*$'~ըPQJD`bItxcM F'o;> "&T5BOx5Ů)7z {vfhLLm{;^,jZj7V7&konoC7QW`3ec *ލTb Xov;gִ驚Rϼ~GM譪f U 7}+nr9{_"j SaFDq \I=q`@MBX"HtS=O@gnϡB"ީvNm Ix wщ՜;ºDqL,وp(FB`wܦٶP:I["a[qhg Dy2"|ZٟS?jveLvc[`Q{ 9m`J~_{M 4D %~!@OX oF$D7e{Kdח&w{9aZYr{id陋4l% [9i|I\0v{T~O%4Xh__vbF%N8^!xZ' &H{6y< H W0AFkﴣ]%ۯ]qx7xmJ_v*KW~;#b*D?K?lm,j߲fm$AnJMҙv J|d}6t:H 4p 5.|\'cT):ugHs&<۩ Q[VLW_ޭN.9c֖C_Nr r8ɃP̩J2^^DfHg,CVRandRLfu@CNiC#6o&_>~%3,,Mg '&kq-ԞS < .?i%c'c0 Sumccff6 $n6 d@2,P!C'wzAˎy1a 8i Em~=f^S&9v/I](j'Ȳcy[0?Xώ5|.ώ ˳cez_2J>a} #]F)N4,O27\' uuw`.^g'?D?19F:wFz͏Wc߹'*pQ97NGdɱ Yl?;t®kG6Ygɂ#9/yX5. aʍV-/'xgͳl'P#"iFYcP7)ݶw ]ۄ4fhe[SHpz Qdݹ~dݭ-g!߾d< }y3>蘞&X{4,2RdCPo=+g\Qmxܵo[ғ|8yR^߷ ˌ5hU/ԻPZm i'wߺ6^]E]^L_~H}uKgiOխM&@,@tq  Prąab05Pnv#%yܷLi Va-fP\+Pf7LQ-NjsAPQ0\t3N< ԯvdY8ʜoȉ%2 #ׯ@1y|.%x !rvE ZOoC.| A7q*>uzfA)lcIϳQoϳe=mvdT qC#ǩ9M:[SCU(MAX|ąV #]j!ӎh@D{߮.HvLϢ4}V>+(>}fz1$ u#V9O @w3- A|%Uq ܉'qwa_ig %O syR‡784y!LLGeƴ |nIf @XD05ӰБ~Kl_oDq^HAMSr8}!4*DX-МD\٘.r۸qߌCi>ԱLr^"Lи9f֯o7p:>Z~ MT)P=/jrSUex+&l?6qU6;4 ݾ~3ߨ 4շ9~y ccQt|,|Fp5}jnwWseϬ_}t@~u@-^9F.~5_I YfKW~yzm.~@]ō#CG /Tg=>Zj \-/iC! %@8c zW#UN'0؁DMJ5XqV?{)!J%2,woC㑗h d["h DoXz`/ñbJ;y#9TheEX_V]L{BQ8&Z@*TIǖCYҴX#reʑz{ YJObDzT/~ SS /7&btqƅ,(@:.؞ƓCTjhJ1dHϲszg%XD4jM}еʶB[s==u䊯UžWnhᨭEim>DJ.cVq"K4@YTThCjZ]Gz6%1]'~fg,vjc~b Gʳgifu"^Ԏgi٥>K3j`ixTD̂ZNQ)LAUY @Zk,wf~ikJVȰ.iMr9[~\Π4GZ>Ě|xr0PE-Jڜs-mKIb\g x)KԚ3!. @6ERjc!uK񩥑yإ* \BF Iъjԗ5;rKQ(#egwgqڻ(7$Ң5V@Ug>VjxcuOc}w"*Mcؓ"=KoAv@Nb 4ʱbnDT36Qj֯MK:-ȅrBkȥ̰o׃SnM/_ЇkK[7؄7 MṐ!ׂX&,ѼKU-!iVn{IpCR*+dǔE31s}XA0. >ؗ4V."lvC*8q4 %w6OI|u39_!#mZH CJӕ0EV239 xvFbDi.ҵw ͔E&4flc4avc)S bYD#~\:p.ia2qtL^W*}N@\II*aiU0Jr>bUmSL.»/q2({* % '_[߃!+{lhjdfdfd0-(-+q{V☹4F7…@kJY.-N5ms?9'DH]@aF̈z`YpI%UiZX2,JDQe 7yM)@ȖoЕ96nrɄ)D[M_Rk.5d*03J- O{xX0wHjxblو]SEs[`KsSͻ_5w ,IꓠAJ*{"8'NE+@=)u'BBYX}S>yNUl!VڳpyFo)%2'F!.\/ sJg^9'Ym]Ii;CLj2Dgf]z[&ßO/Qȵp}l]r1Hxm#n '1VϏ ,fi{y-5KƄ|~vdNk>h{YL G? jA@50TZr*}*B٠n]E∇ǥ8Į9`D[օ&Q=v}ǤW%=:Fhchtc%̪EI2w/jj]ZuՇe,@8[JfAߜAC6t ]~ ]7Þկ߉Ux"ղH}8 ?[kqGp%o u9r?t;[Xʒp SaC,nd-ue+<$]r8!|JRÖM9;'۟qT0#p/L~~ ibe`R7Gp2y9ous=^!B^)Aj"0GG0);UOg5y@TCvāF=YƉ*{[_Z)\t `@i/A{ s)]_[D](ŀaSAHRګ>S@̦q^:b }@0''m^^J9w@P̧#Ea1$^ cYyC&OIj#p*ÚH\0KDĬrVN/gI@N"(rq^rVM>~ʁy|5M-#p4XUDS;̧W9);_QWG~~ ?<+ ?ڟ?#+o72~ j}O?c>_x 0&oi!EiE L-wbfaYS'E.%ZKf\[:hQΪ [@V~q_\Ok3|&$<d8V9_u)E {#6q.R@XJmR|&B ~lW˜ӌX-&idWܒDm^߶CL`oqX'zGۼRj@N#FG~@ tޟ Ͻ"-.iO_&!Yr34m/ÖL^V;B?S I)Z DyS3#”R9</nIQa y~sZ oŎa$*fyMm[ 33rJ"We}%lpM*Y >AGC-ٗ4jiYmc)4Ξ~]ܝbkѡG#\Nտd$R؅'%mnύcY5fmLŦI)IӁo?[42 fB4+5$k)5%\o1V mmLN `@4 &LqWM%y2[ۄI;}!H1YXdk>*DVS%䇪WhY\qbCwu̦&rrfcC;@qG:jDo!r-]set/6 !ȴ0BdY(IwZ]>m@lōA{Rw.vPЃ!V ۫;p=fvd4[w!bdXM"_"GƷ-Q:M(\h{s 3!02d22mIq8l#s=vaOpu-.JaA ӷm8P'Qn*tv 6ᯠ:> 0G;ܖ*/Q>a sM^@A%o*፵% bU``W (s x%@ -+%1l` "YqZŀ]z SDR`Qde~ɒ'/H^G|sl' 9Fx;-oS*&p>^hTd2D/A75])%CV+X2d21Y:12U/b2`mDiߚsпQF Kyʿhv MMliʦSO!8AÛz"z2) p!pxg,3N£GW6PSՏSYj dЮȚiR+r}Ľ940BH̖/1G#$g4ld_ EIQK_Qb`sdޤb/ "JWTUFJ9P]D$#*UNd /qJR\ NKx'o-Rw0VW#iPVf9`o~_;T%!=ҙd,d&#`PVnTƹy5*IG2prTqZuW; +6E1)*una6@!!R0r3AZqj]@+Nij͡R@Ng4. 4R/=`Yp>X zʥSZ ZGՋW~x.^d= ?s-]RAKb0t蚺Օ%(#809T?U62tMRFuhGt-"tuN*WGy?f]7 y0*6 ȢѤJ&!yޝ&M Dzs 0T@bR$2HTsr5:졟X8|A\+h$ MI@K铀B% r  'SG OHЧ86yf<}$}%~:yut!1$z(i |\ -@|7= v:hҮ=\oO"|LLU.B9Na"|+CMe>cipX_ 5Ulhz@FH2W^scR/ڙ{30zOG+,@UML5=n+hSˬzA#jz'rƧeݼyPZ}fiqx&:E5GX;9[=eO1jd&S0wY<jKa*\)L fme4H{MhH>_rW/ CW/!%l@5} h .'=R϶9 J xնr?Ń+!PM Ide޿o 0bR@͞ I7n^ v^Q4TS8fKmys)}S"BĪ;n@|܉o#ȳvod^m$n;̛ cCyeehREH48T7LMw:5A*2ZD]Y bRM}O$K*="NvNg.͋7!jۛ&-ġVX@s[|fќ283H%R'rƒi4N@3l"q\cIjWۮBjJDf/䯰cQ B ȴ)Dj ~?[``&s `3⨔$ k%>(\:Vbi&a+ǀ6L=ddT:!`CJxPNok 0y_i=H}l3S.UL¡ӛ\=nggbCc(HݔPu&B.\FpJŃ//2$A ꑚ>X|B9* iN?M_ԣudF0Rft: ᪷&Ǡѷ,~4O4-hw]bWzAExȔTA;9ceZ'}gIumVQ$+y!=A{_ \s}wp*p ^YOFSl@u4lx wST2 Ulu)ՋA ѧzj ͉" x@Uq>Rj*2&JD 'sCybS&JC''TOޏsT* 9FrSd":g֑6=䘪QBB*1 QU F*Sо2O=-8SwG|#}h'h`cEZrUP,J\tK@1B!kus@@0H70x;$@$a*D @s-@`@r=dtZ q=בX|{).N&4IHBe  SYyqmwN~!Rs iOHג,dP \)v UN{n#Ps . q8=)ڟ&)Z"/'Ll!eLXW=g̪+zY\蛧޴&t[8Qd.90ݴnc]bk \MdZDu+ŲT W6&d̎O!2yY&$ iGޕQ7aj(t78\d_ۭE&/sykS]ⵦaE./뒁8^+AݔlؑHcHD]UHq'`h'R.#>.cAI 6.#y=2~AW:#9KYx (y-(Cl%GAN-T~4=y\'a^ʮo{cVct}jZtAs i +ݳ\W0/]+RqY>`=Ӌ9]{`% 7B/KM֎{ n&9"t9ӛ1ౚK+2]=B ED{1Q[swKˍNwTRR [B4\4*TĀpS:,I=}6C|O]@ɮIQ̒6W6bk:#u4;LqLx "2ԿJDͩ|I!0ҵ774Hµ@g{4d?U]=OHUղɧ}VIPP%=KG/c* ȕMi^{%7d _F-ȫWuzwKw͞r/p{\,mkMX@n^ Iy 8x"Kkʘ~뉂gfrQ$0},Z,vsi1g 蠴nD@ D/i D5!7*J5b VNptVڴ" HR&|@$(1p:;xl̵*O`B@')5+&@$ìoJ\yG?o}R";}R߲y{尐N}˅ Sf} N>vC% _XY-iY<`l3WHә': }H)% /~h6_-4Sᾛ坴2S/t]^ǡ:[ uzJԮ]^r-Y)^r  vq9DMCu>jf)^X^@$й^rئg &6EsYdTU'X^"̳M G,%h{y*QtN# V>f-~tUi W5T61-ZвZ)DMHE{4/I|%2snʼ j z]7W0 ~RVsIF*2jGpyblӌ7WABTo g}*2 a0TcjcT/7oٹ!D:+Z{Fm Z ^u˾CM.@&[4: j]6@$D|z cs .w T4tFLׄ%D*qЬLi DiK?^~=\% >7{p OdẺyR7?/ؙ~ 1*1/q4x!L/D=D>%#v=nfɃKdf 0#Al <@y!!Aa_\'b-à-<4'bŪ䦠H ζQ375p *9bI\1BjذO75lᨋ 0.<+"40&wQ'FDNI :mTRn56~v.qpP`^ C .:M#3>l]]u &90kQg$o Est#`+90jbҙRGLΡ5Rqnl 5"ш[ )@T^fq|x SAՋix1MǔN^Lb0bD^LmgJm۝Ӥ`[5qrH *Qh "-*Z΂#^강u uqR:6 Y4ZcKvR?."FnLpu a׎=\R P>*!nd⼶A2t:2+zz% a yŷ ![NU*:b_uPȻ"(>JAkiV™ӣ!5|k>Iȣ_ib}x*DBԶ4}ͨu g @!qj+FS/ek@ 8MƗSB/SIke^v|TxKݝ:@.eS(x$ c2=QdI}!' 6Jky RDӞv $6O<ğe , {g4]9Ch}^QJHXHLVП?aaRW}Nr=\]]%1kJ߫PqB dZbs-UI ݲ[isnmJ=}aPv _#Sv_P›^P$@l(Le͏05Tq]$ʅ8Jk@޷P!׍\!LJ;ب/;ml0imc;󛒆p"z\yhN9y)DžcO=Ɂ3ft$bAL׃4 3ٖ|.R{Ng01b6HjȧvI_>9U} / rGG(#J tfI;fYхj107V5'-0$Yl?T,uL^=LI^F1'id3DMKuw(\"Oynlv(b!}S*Ƭ|(r8g4:"Y1N8K}KWRM:3>V$xך23vﲳ7`Mg53'jGVvmCOv5^`G<۵G#-u l@tEl$WCS6ҔW_FtD<"F# &D3@-ؗzT9܅& I=} >ŵe3BC"]- I= đj@2.Z> I7FYϺBgLُ-C,n_LL?=~eA{&P~ˆpqwL*lfRe7#do@N'͝`5nR}FٞdPwz6rǞK)]i6oO <pDgnHbkhL@Ȱ :P pe6"7f 7sM;@spgv8!E¢ņetƿ8U&QbCss%XX:&Ug(6TT@~,Gu 3CpF7cMbc?2Bo@Nc 7*Ŗ 5Yc9VRP/3TdI/fˢ Ƒ?7}R]k!Pdo3 Sl.p!d "7Vgb/~j(hVԽ9#(a4(QU7Q|+՛QnCFiN[LG`2ڴ'Bѫ8iQC<htS">xMA '1SBZǴj)BщN"}]Eu;D14)فd5sGkl$ròy?*`>qD}XiҽrpK/L|QWxQ+Ce+%3#ڻt g$]J@ز Zjf&!߷Q$laxLhV:?ܢVD<^2r ʽS\Ը VTн L ;آO@z1$p#2U?PbSXNR[ϑP $(־ds$9Gf4#F 0@3d9.fKi Ѩy7G@S8BN?2 {سD=S D= D{rXI[:rԀ0 1lncm&,nA~. !vff-ĖYj^ig1<6|K鳸Meؔ'@%"ʄgj -g2)31rwUj7(ؙ~'sL `p9I}k5TXluCC R yvUP@xCmjBEc|~YiG7g!:2Ugko]2^g7z@/ t\*짛Sp2r);x gf3ffIR d}=@؏v5 :'IjO~/G4wel#;d?OЅs:ouIk26tqmdhx5C=K7pێ]iB:jhDPNa8%f_rѽJX<$g$ e YHvEv1G"4/ZG gעcD@靾^桰ɴ-M p7pxn+GC7+p{4PsI'Q[}ܪi( n4A 5q  W^.q|Cm3%d`܋H@rtXaD' (aDܹU3NO< tkfuy6a3h'z^_2 yѴoxgQ0냆-X%%Yu\%: B i&PfѨl:x`%]sxfgƞYv jб6,!Mڛzz4̑F@hZi}a )k"9phYi_ xg2,1W"~L.‡fIo";-N5Y88  ׯsViu2MNlwFM Dhj}HQPr3 #mRo"I]I.7\ זȔM|YtS(G:mf]-fm0]wiM{h[!M]pye+avѤGQλB_-L&9~Ki"X?j|Lv,r*b}- cv9qncV\bCq,G"臎?xLZNMzDDЗEJ`Uw ;' |}ouI{mYctƻg]qϤ_V+: Aw{?QAEo_₰WA)־!"6]C["NɳA:髮bdȟ"?NqSw1n7Ytanu pFX呦P{1OH8[°@,Jk0x% :W%AAݦ3>6? Gl@%Ua*xmK@e1CU9Yp5ijCFA(y updr~6mzMYh x<17WΜSڭT Z)K )KBFAVbFOVbF N(9N<Fr&N6m~ Y@dsDBiC 3HiCL[ZpI0[t[Z`bIN@/)̂DBթz>vP\yUÅ*(IdL9\]I  i!u@gzjIe~oi읣[^ͮ9QWr@XF< #(6"h z߽mzx۞ٺ~@d,;NKRoK)/מ=Z鷧ȵkR4" ~3Ydz}M ia<5I?sfq\ij LȵgCd-5)ł nj`cv ܍8(SsCT|ЛnnRp'c@>đ# ɾGˑS3=ȊobMxgc^&܋h-l{&͹ȮIի۽q3 V*uIZ |qV9[M=1netg>"ì;Ho8%;HjwgD.xs†O@6b댷dre*~i[ސvqhWrK& %fń3}MjRQ쑡f`-X 7 k`紉cּŇ3_xHJ+DE@ B {<% {V:B4t>Ԅ!yl9MĚGob֬|KvSnMY.)ؙ85;uuJyR<82sAaK sV>0gMUzMBb&8S7W"7jB8H: ,zOT'yƗ M#Q'b2Xb>Y.&mSyoݷv;O*֬Oc5E֝ Yqq”J8_BɍKPPT|)Oa4|e="QGYOt4ZfaY%|6ܥ}/5L%1.>4m17zbhrrn9ŭ/kJlr α_тJeɇa}%1{a!JM*ZAK&rH00G'9(_ 3/wZ=E/Y}"zsXEG J݋1:MzɈ)?NlCe"|It"M=Uo5T@r }}3 Чjl0D$ X 9ic 9ۣ4Z}Ж$%8DA,,ț&MVW0`JUԣ?jZ$5Z D$!z%ӊ*-c^,(XD9-f5|ѹ"F8c-0f QېI7w[ɥjcE=.EaM Ѧ^1YY2*2 -;>D3xR3JmY䳉?+=sX1n3d= j2Q_8S2HF/ja#$e y5!:m$9hN"S#N&Zh`M."@# [%@aaKSK=ⰸɭÍ"*̠l}ȐZ(2pRfM~<,y^yyXFlw$ ɁdypyX٢)Ssv!I^ \YejsZ(5X4 )h+rc1 x=-fPZ4$03/̟"vV.!`횾֢G+'VVg̲DhIT5fPo{d mt1k*,a[#C:hc!"2Ñi[-Nss"% nͿ\\ w\C5i3`Vjl#,OdXl8+W5|]b{s(sHp4oC|vx$=R5p&_^=UUP#w+caÿ(!67x!F~eXw>'1< g< g%G/k0@ ϥi!LbPS W Cف[Y#axI G ILW;p1{JPKL1m\,;+ e1pv+1jȭښCR3Na=";#YGc@1(BIg~H\ L5}PBGac3GzOHm[x\2XAwz؇ 1HcB Lq7 V8Ȧu׈rFMJ*R^qD h>U,}d$0{\UzF1ኙj~vvEaQlpz2J 0IWҧ1@dPTf,Ac\1d88x$]4ٴD8GN\ꗪVOQKPX F% p,l[%Obm_&{3fbS4/o>q΍sRgI1bN”|"+c@X;|^Y=|@^_(]lL0 ɚ q-Wd|es"c !PE6y\AC&A{%%JZa3Aع!!0ORNLq㔮q8m#:rn{O+AڷI_bX88tG ˚(Iý Y P~,vZS! ; LD˧\ ݌a%7KZ5QSQaKvSQA pYB1cEE†!]{Т F R-`ϰxMYWpM&y6|g")VQۊ&I&o!\|4-9פK; 2hg Rh^,oLsgڔƛPQϴ fH K' _uOYH }ߎ. D=hj/뫈D ԟ(Pd5Em3SM"]n COQP<6²5!l 6E _ؕiπE@'⫥|23ABiBv51]I؆%ɢ#x.'^p! NyE-UkA˔ܬEξ8dspT9; I mE^iҢ+_A?h'm7cԕ|in~&7F!S~ͯ h ֵ@lÇviF9}2p-Gϱ]{x@ .){~>y0?1U۽ۍݜ&kDgWJ'T XAǀN9AР9bpqfĜ5FPH"|%xužOfF sʒgLj!D0Bq!NIMa.LPnNc`$d"-C66O eMӑ 靇! ͠TJ&ӉFkp]]2&B&71 CMd]q2ctt7U2gn6Xa4iLx۵{iؐb]^ 3;1Bm^@,,6ΏW}a0;D027.[k 3 qsgHc,!Ҳ$I-P0OLvv) κ =c(Mf qYiW;B\"Cz]|Nf+lS0r)m׫x*,Ů5W]5IA|YN u#|YL&&VB>=4AZJg6ӆ1mJRE$J]!*D\ۦ{ަEP0w[B/y_ŝU^jnڳ&D߻wra ቝWgBG3yʡzKT^5dy򒯡ʓu Kރ5\:N\\ǔ}l*Bk+ĤEW4fWcWckԗ=D-WMK>@dQ !:fIS͆AY] b Q4K_/n;ΝO> 9#G#WM>!Ew[io.l yfKI\˵9`B¿e|)H-pI gE&$ϒs̎efPtqtKQP@&gQ{E\Aw*bD;Q(u'c DiIDx\#|@/6-Ydt^(X!QEp"{"|ЂgΏ}<H}@0z@7%@AFfdo,k^CTw!z3Hw@ W9"MwG`㎼9f7VƁS.+,6R f'Ols=#_4k&hq9d~q3a2# ȫd DPSc8  kQZF{WHqw2N MH5-͂'3.z'/QMm6R3ߩU($.y(_& WG8>xMĠJ8 h9'2|yqFTag3d.FTDZsE팰hA4Zv.wZ4 sEBM"6#NSDqqL>e\S}N>\k[Jg 6[5(M*]¾xDb`LGHc*$!R;"M!:SYE_UUh$ G")Mˬo2i[3sPg\tYatu3 -UkscU  *E3K"ph-:@*mθᶸ#j%6 <:™vCiûYֹn͍D_A{hR B75l3#1){ h$Ps\Ɂ+eE8QiؾQ 꽒 :E@(|3{r(lOkH$=xX U]Хq\mq复%xfvwX)urVn:'gܷ%T EBY'}xVT-N8o`O]e"egv^*\=;4[0emYaw7`nM1 _lB7j6eУ2Aj;ShX(UT-sMSjܾ@sӳflJM]Jۿ21?T;f ̿Cd|M#O; Q{ԱsW-!J mXb8EkxOI@GohZ Pa8Y*= >jReog lܩXyfGl4fބuҳ/'QL CTOfgB[.9qj'b։|{+Z(/^M ` @](f{(-D[bC!3H׉X\񐧤rHWDml̛Ru0-B3=: Cכ!SE9jT yE15-!.U^$9r6ک4Iu 8w},;[|CЙ4\j0Qa!uR2ISgufEHBueB'U%4ii[ܞƒ0&@PK}½uf&x!l<,c~ɶ!:zPhP.)~̯3ލ I;E X}i8 Y?W.Z.NGYK!R6[5ӳ$ mzגkIJFDh*˷ėL{-I =h__?G)"ϒm .dŬd,%O4@NubհJ^6H'u+Xh1X|4S+t݅ktjP!0^XÓ;Bm-v‡=HTq§!b8tujaY;z;muwVօtvFnzյ\<8&ǒVYWA x{5-Cc /kx?mV7[2jV񽚪Ձ(T:[p5Ub$jdd*UD] W]*&7"?^#G@~޵ym]Fs$W#IjUFU7Rq<!%Pb|3$lfGs h΀\5?"tL%? 4"Fd /`P7sRVB<궖 tPm[ok|}[joX׈s|Z5ֈDaT4-.-;زvngG:!:NAl$^6 /:~r)qV-|p0E~čs‰ܓ^9H![ؐ6C6mfW}wfmr"@kU ۅb'8l5p@.Z-n'g!5C:6!&b-kr,i}Ñ.Ć#o~3P5>EM\Ktk nUi-%dwoJTte8HH 5 [7SJ AkSUt3ʙnlP Xo RDFܨ՝84ڂK J0#A}׮q%3 1Mkq:,D(8f zpQ(2]BEޤ*rS(Ks ;PڵH Ԛ InPmtWP?Q䞂[34:i8kI3p x% LfZd.Wڤ&\ Bq/+=Q!hAI!K ·*U ==e)`T"zZݧ2{ H=} : -F01C2yFv&TSEiz6ȖsHЭȏ\;;zЪ IB,>Rŋl6$َАd:c9!Ml*)B&5*t ;C25כ0y uW Wf8f8׌DSlt lfFi%t J} x73,άpAj^]i#QM| ,pYJs7xN: ݒ#'sM̓Md9).D9we=(M8F6Қ\Vf;ґ@bv~Z՘͝{?愗Bb3m KBܓ F}E ʈ/h:}ތIR)3!_b Pia?9_1s9GrK =r?rE)sIFXMG~ssd.{DѬ$s2aYPIB Y;ۥlߥn곶`1[ &c&G}0yt=%9عCfr)[NIN[. -½<}64p2UA7 +UT~LCuTU a~uZvAU~ s@Ku!([CMmlgsu|kFox::xINsmqhEpYKm'Сl&Gx T ZI;]΅Qu @34[m N'm|+۴;ݖsoG>)@1CfC`\9Y{%( hoV;Έ_5CPҗQn8̲9* ҖC~F/4W>N1.;- UrEA+T-#Fc~e:|*j 9@{c1[z}5G:Mgw`.šɁżY&l[v68\41*Y@vO~qi_D]KyCPR4 @B+MJJpx|ҽ͊pTLىl&*'E"Ra((9@TR  a!̀h vHf FBE_d@Ӓ xffF47R㙕"|/d3+W l 6 mccTY".2D%7R+=u2ASs\f}DlbdO d$b_1S㹉D{3ȯ@ _E QH_W?~}tXedɓWH*@ozZ݇8 CC&=.CCa@@F8Cb܈IS9 /d! gQfsbNxqH ~y"]!!K>?^Clo@tV>y/72 $YCJe( VbXl`Ot\1 ykmoeƀצkL_ۊհU,74%~|mkx~Ƽ?Oo^1UJ:Z>w}k^S׶Uf{YctO;`渉Ov2lp wA/y=|g]m\[Njd󯮗{~mU}] c87Qx tk|wo_1\SF ~i[zmW h?cItbK n ZǘԮ+{\ny/ Eگb0>nw[MKs\SP|7w;^GdO/ڶ.߷;xujLo o GU ɷ0 槏_w yS~˪V~J`ۣEkpw4zȇs݇7Σկ?%N>8N򎇯kx|xuG+OUkv]PW̫Izc1C-wϊʾ:çaL^4:e,_g~5Kkjՙ݇~'D#I9z .%R~___?D/>>~(-֚}ukuVٳvG18^W_ꂮҍ֫Z ^\]kҮ|s|{flQ>,ᄡR3e?Y1>7G}?>ktQlxvV*Yc?(g\uevfY<:^.,#3Y9wV~Ch9f^E:'Y {?٭X?鈏}1޴ ;W*S}q~·+˕"4 ]Hmp:Ra!}-+WƧ~ߣ=u$x{g^jRWAV!Ye[k jʟח(һg)-`LkZ.ۧf,YQ<WEgy'o_r˨l׊gXtzMB__WaV_9-=ן?_}:~ cG߾ fW/go]EtlE=_~wSN#~?Ϟ{w(׏z=W_,CaKw>Ӧol˺_V֎#s:?[Ìna?ڏݏUf[/e<+Tv}iJ`}zp?8TΧ( YR݋s|(y6=>V JtN}>R~3^ ]fzF; %c`Z4nζgq竪:e C \]qCz:V[yRa4b[Z/^h~=S BUп7~k f?5z5pL$?/>v6\nΓ|X#1 kH mۥ.V QR5$svi41*hXW䶔17zK?Wt[L2gH~M 9m*e-&lb)w}82iެձhr]'/cT;<Č@VY}x^w^Xm\9i!t/GkBR,_cZR>Cue59K.z5׋pbbLL :O=w^4/e{s*\K7qS-x8̯#8Ϻ4(UGWu?i?> stream x[[oGv8ȏǞ@lb$Z0ݵ>0")#S* 󝺞֌݇ 0dVW:u\SMy6Cvu޲lP_5c@د??bW* A eW9omWj,C"?UJPe ֧Gs/n eIl{Qޔ#g=4m}{$2@E5= P7S!-ZU߾eЁP¥CLC~>Gx(Gu9mA ; ShE~U<ӅNNd}5 + _Xu~Ʈt @qy eBNd }^ KF/풒Zf*YG(P`jz(̉6="PBޓ^~&r]i!VkӉ<`F~ԓ"5Yǘ5~LUfVTe^dj5.*25"0/QUY9pĉu`8#|45hJ5VD)ʁŽc a45:0@sS\it12aD'AwZ<=aYB¢AXe69CC^wuUtO|L3UbK؎t1\+NudxW+tF9v*  <Ʉ 2e:" 4lwu#"E#!VLVOdPܢ5à9cO)"@.ᖜutF#1H9lRĒ)Iy$f9:}ܱx=v2 08q ' H:nIA=sZy+ΰ"VvMw͓oB\6wPL Κ$iAY>PC KW9rp`Y ,jw^*8yc4+l:F$ yUHnR+Q,qAaiEW&h.]ڬgy_Boރpf?hH'-a`:B GKzVo+_C)h(R!LmfWV!ْ,ɔJLtPY. @$ʠRY)h 4^e@.񼍞C]ч۟>܎PPsCo 73Grw\sGyέȌpm-:c-|!*\-J&N,@Tjt4u^In䉀g..'ٻP;jP1'U V|!pcyNK5)EB(ֱL!ȓ@yrfB3HGR*Ti/ Ru3NJ-OAvyNdjOr dXP!ċ1~Eٚqs,TvB*j@$< !ɪZ8=2d,/;rmڑImWCs$r~9L բGi.m7,axe4 gEd K(Įz`0tl3KU?m^Ѯ#2rNEldPTq zV\o35QV]u;]Fp4G0>7Uza `t3`<` 0\ӽ֯;lIj1gpn$l'PK ^QzKm+@&@>˻ͫy=}Fjsδ݈aδmme2]TȄ YٰjV 7JSbG;Q7Fխw T`_]\y0₩Q:A+_E9}m2e뚕ʷ[W۵:~g,ETZ?քxPGF AHW d^l#0?Cj. o"+ǿ#mVpV#\-ᗒEx!1I386 ]%_$g9MCBkQctQ?ʗ/3_+1^&$)㛹b {aL; _. _=:lf(f1 u_X Y=J_1ՁFl^̒O:$N7EV6ZȶVz5~VNs~hp *jFwmt?^5 u Ms70RsG˳nrnr A>ޞ34R}dݶwdמ-[Aށh{?ņNIft`ڮnOd_>teAwR?w]~t԰kMB_u]ب/@C,vʕيԧ3(u&n0A=nԑUn@,śS9͋:?ums\#{JM[ܛ{ef@f`޶Rtz6t  }=+ OY7l]s#DpӻZumwS1 Ѻ! uvvw;2Qt]O4WoT\Bndl׭_@3D|Yendstream endobj 427 0 obj << /Filter /FlateDecode /Length 5546 >> stream x\[odQi7}K00;vb$,.zti)Qj32SEE3\Śk7 C4%<.ƌqV?ʲg(Ү=7z9ڢp绕0(@>0s]M<H ֨F0=z$ [Rdşe2(F ef\)9rqJL^i%D2xɢ-E#0Lsܢ)Pa6S]F6 [@7&#Iiw[hXo|r*/r"uYk8-yrxY}M^En?#4?-pJk\+KJVY-j7_hW-:k/i-@MU׎n50Áa$ZπUP |S Aw۸ghF&O L]m^G4ɺ]̦GʀdN|oH ui<ؼFM9&68/1sNk[g>֦ӷ?>Di8L0 J= -ZVvR>\(]+X'|F)X A2»;o50`DF9 ZG/eGUߙgbzkPOqS 6[?Иjt{Ǒaj V* t8Ot u}P<,?c VNMq:N$- U]] cREiġF1WB"^A`Ӑ5 ӯQy"YN`_Zkt@ Y &h+اkџ8#ތx]uZ#P\<sȵn]duX6=J]sT+-sKًk9(.F3HK3ItӖ~/=~G'U`ДiEꨅǨ`xRf&ӳT2hLU)fbJ@S &2B@aD0B5waSv0& +"Fwq?/et:L] f\i?Kd4Q믘|hv6?˭o:ra\dhSkg[b6^=Q{Άu'螑M^ܺȭθ?J0 &Ol-i}bҞ) 遲N-[.a88eGiC-R(؝zBOS٩%/ڝsN\vZeN9"7kL't.Utۃ!ձt }+CXΐ^A @ӿMlGrMw}v{8*QM"q=Sq.Ԋ!$B6XF!oZbl]A ûdpIȾ:||P`Ecg_tM+ȑ_dv ,ǶJԆ"$/THdS\<~(B:.GoU@!3bI4KU./ $7_ $O cs_S,`/T. J\©@4O\ύ&Cu8F1n!A$BԎw-5 prڌ>yL{`S*kzWBϭ2W?[9nC&]bj|}FΑZI9RytbJۿݦD5]gѠ46Ďio&ݧ+&^e,VgbeQiXIij]5@9-8z!E]0 -ϗNFDŽ:pLcJ=v%Q+y8\}9ח1^9Y]ōyB/oU jǷ= aӱ1UxGOV]7=Ŋl.\F&PB9[S$Dd)E(Qؼ[vhK2?ںl0J\#L\œש".Rc:$O]xR睡u3!}:< 1S$8.U`e f3%G7e!?9>67U7ϥ`\[sfT vkWUn *BP*춻~a)u|`]*>^嚨uQ6uM@*iuyr^cFr#:.9T f3_QW 7ɚtT6[|-s-We7&VWQ0[YduHlEL&%yilZ*i4*-)`Ji1u;Ynm ګ^3Z%y*$}uSʤA9.CRDr%=>y8DRaPUxigѺeS&tXK7}GJ]n{*_pX|7g9C }`]Bi ` o س$GDXJ&7-j5:1y ˜a EindYug~riv$:W\z|\dɊЕ> stream x\mo$7rQFf|'\qދ?A0liF֬vWɟS|-h"bW~Q ݞ|Ud.O~>Cqv;| +Cvx$mգ2f4^nO[Z&h>ar8X֍X= Vݯ?QS!`^?u.躎.Wu.|}jW:9Ѹ0FDɅuՃJd:RuQ%#_O^woA.]r)1/\?[0'&bW>$_ '㯽eG3i5 N%|+ t~_ai2L=KjsWx4c&!0m0 -Mbpqw:۳Y{OXNq3ֽ>*l[3x knL>z<91ZڟOYH.F s:z`nhUA?4L"3j@F9ic9O" Vilv`'Y^|uh;p5W<Y`e7~cRpL;p) @F̚\[:f|5BZ\%'|\d"-!T)\ܴWE^jͻI0۱ԅk͂_ƛ:|.#6Qy  q8 ht. wOj;H̫V55:1~X0`R^&$s{ BImC'm&z54lZIø7XOIH`sˮFFjTM2c W,ǴD s ;'<̈́2f)Tՙ#q[;v2Ia VD)WfqٙjzӔѹh`9ܽb%^ jd` zȸzsLUt$3t9\#{/::yu[I'tX3"(q$ы .vαwe-J%NfGdiFg/'m?T;}6n :jºh Qˤmbֵ8rczao:7}')9xl9jT~!Y/dOӅs 'u[{*CS:v\B\v6X @k<'~Uh2钥$h}rNߞgȗZӳ[cjQe=¯a`Q:bv>]4EvL4psDT|k ]^?l_D`D&OP$3Ʒׯ b 1thpܞxٞTV !#ӉunD<,/co/{y,|Ugӽ-]go{Gy?|$ Xݠ0wp@ Kk: xKxu3:<D !e!<wy˨59|C7pQ\{\N*|c&[+8ӈ+6p G 3Wfy8X F.q`Pe/#ϵ#Ǭv$;={%^mXXe&J ֙nUlUZ[UfUYتKwB*aḦ!坔1̟Զ;.'Ukj:>Q}]Q lfS顄0E/iv 43P%˔seelIBbNϘ~MIU8'SAXTb;B:f1|V]+K. Ė$ЛZ7Fر'~hbv&6FpopFH< ωP 4AY[Pt\7-XVd vP165It8Ta$e:Ph6?1+%Vλ$I0Pxv| 2Wc]w2v̊g;C[!K&!}6Hj2 Lg7kiuǦS{K#'Hx@spD wi<,Vԧk^ƞ =iu;߯#V7~wi4em[}1X>I0Zl] ?CbZj{f1U8\jj-V@%x/4n*>W;`D1fO0*=?,w]sNIm͆o2< .a /[k"t.̈5ЌtZ_%Zd[Ueu1Am Qd_+iI_mXac#M_d4c+%HLq}OZ"gfHḰEΒf#JВ bl Ir`YdrUMMл&mK]N3뇈r wF6Lxt||Q޷=˷g(ҭQnb9d|~1Fģ@RpJzb)bY-U)7PK񎗲:/@w9,[0[yudO৵1^ԹݖV4k.9GT(WZwɲPZWONPlxddS+c3Ga Z}vr]msX2y!h!stmoGB{Y#LzH3\Mao=ne>hxQ' 3I.GθlgS sU.UYܷ]jTąW?cfQ4z}wlm`}|E\,HǿOOK.ű&EU<ý8KZV(Di?*@'Hz"~B=#91MU[zV.]2R/"? TkşL ƁtB&9'p|7?E>W"6xY2?'6kԯO=6oéTFKTH /N)o N/YGʰd ݞltP7Ss3Rۧ8-b;*ϻޕղxEuյO:6Tſkf6WCH~w'vh(4 b1z fk값 eKXN|<[u̻tt߬''}2OJ@胏"o*-ճvY}+~>EFr@];uio^cCb0d*gaUډG XliیmC^Ox?oo?"ķ; O|TFb}>A& c]bfCoZ̓=v =3jEpeoޝN""{0ptcПzbILHM&ueR׺vF"nELI,Xt6b2}7Q6s}\Y&}NHKd4 GaĊ|NΨrs;x.n5TK& Ù HaI\ԔqxIJ۝)(⟧℥hSkceXї<ұU_3%='5zR3cz9A1nr՜O@ IWoQx8D߰lTU{kN4~,cG:@NڀY5(v1@CwL |ЙUOvq4Ѿ8m5NèmMsz_Fj Üۣ+jǮ-ceǒ-N|SnzeAO R2ZY[*2sˬzuiֲTJ6ԢoIMF'xRevPDM (s!~2 B,^wT`|u#QLBȞ9;d*6I$3pd,>Bp\G/ll#m<^o* u(sP[d|0sQs4#2kM`RL .y*i}h2"]mΛ<DY1SZt=(l# {]#FA?Q(OVI-Idk)NzU6wYSc"(ߝ5]r>I17!Mu26 ѣxOcw6+b_/Ԩ@LubMwBi;I7]M7͎ޤw懫lr.D=᪘m"՚(;髨0]-"%w< Tp(uInvD霌]S@^TZ+D~*^>mTw[)&KTS*W$m|6\Ǖd%E>,n,vI/e: f*|Msg:|]Q}x0Lat f2Mvoؘ? .Xn Јd%aW;SmHkd0duߒ"uGAБsj:gb:w^EM mH 鏦ԝIyh|erjzȻ %>NzKѨ^o1Mg*=pc%x/:}eVY0?5 ShOzOw!})7_?endstream endobj 429 0 obj << /Filter /FlateDecode /Length 5689 >> stream x\[\~dž#݋鳼_v]؉da5X`CK=ɞbק!HNdXWEy!˛X\|&ӯ˛70B금Ct-.^r!e `Z\ܜm_UjA/Wr"|S[/j뮶6Lz͗̔_ϙCV..; vR'7 CO.\$Q-2$z[qzp{ʑd{;!)u?js_w}][Dkՠẞ4RFFT_Ʈa2Y፭wDbk-Z9Ԗk-_n-*jP[OHڊrBp8/_e|E:iWd'֗^fCm0^hAGHeֳdsYs~|kCmVQU>[Q #ןq52Y}m} AhoT&F񚡸#S958c6==i#k<1fP0m)LpdQjDQǭQ1לjbxD?0}$NٟeZi5 }$$ؑG j!B:l'i $SBk'3i6ȯG'K1{7'h_#I'7D5Z39%qT잴8VDnjBJ;G͐fqQҜE㈽O>Ub:w$ii>=H8>bH+4 Uv)HkycPU9rh` i5_Hs, O$Z[ \)w@0PO@Y6u ˩AO#H_lsA ׮yTyG0ohRwT (9fg~ #L;(ȧytN=h׶x(LOgZmFO0˅..١wP8`҄G1(2|o|p,@G<𣝓;J:jkp,mh,VrXŠ`IĠF_TCr`{6b&b]6F,1HAWsWlMPG,2([62Yj6ӰP%+\:`OZ`0B|.Ar02H)R5v-Jp FVfok@wǕ oYJK$q'Y񰄰D~e9!lP[c@c㟢*Ã^!K@' G'&*lpok4YH\:o |XjECAnta+h:8Y>\2VNiG^BwrK/~ ?$7 n8}wЏ5lXV{V/6F9*:@yl=ZpM)Wa\W&JInum|6Drߴy3bGFcԲ>hmDAC KZ;8Ď_6lR\n&Q `#rm`/C_- I oZ⭞SR@#/pKk%rng<=lT+1Útj\;DKTWSAB/AA'VD)Yu0|PؔCtYT 0v( zW#9;cF6YwΛheFoH| =8qPsRLdܿp1T޶e^5ϟ ' e'Na`jFi,"vKzڮ;D<^OLI wJC5sM1"RZʮ1M6e`/ gQ*e'NcN ԆhuwE!TiSq)s;ؔ[nM:h$ ?;۷y$NF^h B29KezquD0=|%{txb2pxˇOo -ϼa@D{n'ŕܻDá2em??kS<Ճ>+ l^}}U[Oj V1d+|)J QHq82`lA[809`Gk0/֙2]~><PBacx2!<&6{gp>P : "0#,! tù.VvGs nRhPe*,ݴRH#tG1) $A6V+Fyz. rqt}d,iK_^,МVq `V5>cS1D`~\O+HKdtᙃ".QxiWkL”J0g YPΠa P֘ 8J~N C\_Y,/"9$VT?`< ]O0UXAw禴VV" IEq[JVO*EIQ%X˘ib-GXBM!!\BgeDuDo<D!UQձSUFGc-E#LA{\[T? ^%(6 = 母i9צ\ lINsQO03`˼OH$;gVH!K xUW3YCPQҴT|:; ޥ'_ g*3R5ja: \R@ÉY\8Pl4 ͪkZmAVuϴ笿'@09+P0!cĀJdX2f;y@?tosE4<{ =46K{9|76W̓+ }2$\c˴ :S|!ݯ]sV h*V;3)֣W ##jP +!gQ M;:reG6"d7N?9~۷%hux )gx"Ë}DÈ-ve#%AGXN^yX/n{_L%U+$yI.Πw5M,rJUxBFWΪ8 1^fp*``ַ6P,L mw.4sMJ"!RClq?V)F8dy.g ( 9zMLA?nA.DZc9 -0[Tޛg@߽'z4- _+:btM׋biT6%u/t5e0kGwWE">RHcF7%fst@'#<& &[9lgEer\ -:98Mוm˜{b}ż9t&SEYV.j@Xˊ{CGw3(V]͍=KlmW2 _AIY :MLӂh ejH'4Q_4os/$W'f'G !4i=ǚP W|ꪻۑ;Cg6s5BƢ.4̹QL?- ѶYvԿ$pE.rߘpn8-d€"-$!me%REfp3-V-gEN)$)!ojEVz,uNO< ˀ|q [h"5=R6dzN^rw=dB4S?nDyӇ})"DwJN2SuB‹D} ^=oxX*=_C]BXYqȿ_~ӢO RNM5Z%0CuԉkX/ [A1сH%"]9|xX/)tNQ,*c}WF46cI3V-e#< K,aS^$+fĿ@q'VCw3*W~z'[N`n:r_]> Qm<600&KO "ԒazA1D(~N&Cq3P %6Ia 9˿Yl |jפ!287*=S54KuzAjQ V/}\PY:UJX,4xKl/!RHw1}m ֏0v}?$G8aAQ2sȸ[4(( W1%$ ^P~^/@xY@1xѱVp6\XhlhVB[P≷ NW_1!T`]`˖/$6P_ xdFOt@Z{o0O#/!szu:/ItfWTsU1nxjn'M{,HAM 6W:܋''O[mh!!6mJ}!|oأ@y26Zm|EaXE獃$[pWĔi⻂H{d`7 &@SA׀xP:!x2!eqw2?͐b 3Y%@JI7>P1C_9|1^s?:q3ݒ=+<l> stream x[oG#V.NtD$Jpem%WU35H.TTUǯj?&7_{2=?˳w$v)79xwʉԺQM\ jrpdlg aF(x&fj u2Ns# lAY`pVM/ .ʻzP*;x"^r l=}.fEl6WsX'RwdR;dgF:`)ǁ<4oU U IH#rם:fqc#;awM5jzH L-T/aIo;K"}u^ N-_S| Ӄ402=/>J"+/d&Af /@1]rnh"|2N٠.k.W`Ky@Cs-}筞%2,Ն>eDi?]:0w Fp+y!Jg1AE \ܨjA3ak1 1)%Uj)6;BR+\8';HkIjv?]'+w%]*Ϩ`]W]/b2w vy2$\#˹ܙVբW [$`ϊb ?A;Ь" 6QRQ'6B;\yٚե3AhڈM@ChNׁKl%Fz٨żd =cS;{od1 Y`XgM6b\#An!U`y)T\*Q@eMr)S² ˲*fƖ$V~YY@$Åy9 [-3`GEuҢtJPoY-H ctժ:m#7uTj{>mԎ+mKr R 6&܏k|j}6^HxyVCt?e UϹ|JWmg@(]{fCrra+X![@vF)${BӰK&>j[C0 ZB}! )TL+rb+'[ւ lg!pCk!zb8ZB'\iՠAb:N }2KJ`.%{;ڭK񶀑y(;1`1x9Ocxvй$fx5%vqⶀˋ1"΁c:QcfQ3?` J 'NYdpsu?>!Xm$]RT;9)yza^68a{ɇESZUR+uUJ=ԺRd Vg{EdeϕxTEo/4yiX# ϕ_ J\ ݁d_U֯hx^Æ_6֮AOiRsV!R:)m!xRZU9{a}LobRˆJu2c2O';wuqrW F]_q =u6Z3="j{gz]S;#Jvw\JrN?Zwk@y3 ony8pAָGD2#@o0W G5f>]6z2]0|j_H'JF#;F<3;MfʷC:7,?@3y/Tib(-_mKnv{We8h,D~i vͽQ}Xz*l].S-Ak7[pXy#lz ϣ[p*-sRjXn߰vVi7HF&,i!V %v?iHan<Ɗ)D5 pm!-&d3ҟװQ'/=C }gb}Ƹ.\MGf|R|00AjpT jF5(gc ٴװ>iYeIEBCM"8oUB?nendstream endobj 431 0 obj << /Filter /FlateDecode /Length 4581 >> stream x3 p03DggLrٱS21nV";|-_DP!#D PAܷmkmDů袍hj#FɛO٬3|1 89?4*'=ɋ6o6лHw1P9r6{C4v認mDhFmiF`3rF)JДr |p7tSM>O-X Lm}Fwkb׏lZUWDqQ/K<3mWÇ|Пȇ'՗y&ncv2^dž{7!'4lR#45#|O5摽jr1}l"bZGbOFJ syU=Xl0QN90̩L.[7UBpyB!uQM(xWB-hӀTCW 7)juB .ѧ-yp)MqM Rg DGbZh eag㺠၁{J:j-=GፄT OCutFƲ 3EP E9<ۜjrD>ph1j"*%~L4!@sD ~w|q-sO1¦D YzAtqifL,!Ég rar XlOIUz>J(V>Z痛7ͻa,Zчt0ȄY|QKť\M:e5|B넩Lqr.OI&]Zzݡ)ɰ.t3nd5(G%tos&e2S%#l% Xpdc]Q樰9F;l~SjӗZ59"3O+Þ#b%V4`ɽ!9(dF\ B!;x/>}s(ύϾGi&[=O zE1GkSʎŴwW6t  SPI|lUm}xZu־6WjOHTMD2 aPrtu܋5K/Þ@$L y\U^(#Sq!Ås0UHQDO*/1 $hETQ#&3\g2v{վKOr^;%y!G gd9ar8.X6eVTpM^N.=CɟOr_ OlfQN,U΢'reiՙթdX>h1,xm37'/aРNx-˚CJm WDIRHEֹcj.CICU1|Y$ U2h#m8n\9ƕ&mUϔӃ.0P9a݀CvF=z1 ^mx;Q;*K*!u2~0; 6$<#)cb{枒A:5}VAyf5/so۰VBݚPOM>f@nx_ذ l*7=[y7M.xrPʺp9h 5^Sy~77 lI\&.Y^"2' |Pw0bo)X%{׾˙ZAL&5{\ NxGw5Rbgł)*;fNmt)FdeM@u-ed?Nnx ǔ0thknZlWa:?ꌮw"=I=F"//A?OgϺKHUcHj0uujNGKEuY.ݤmPf?WS| 9#דT\.ٱD$'B4A`juZ$Ri^J+7ڃ(mŞa'M?*F3zn2Bvӿ 1y)~V˧WmtKPkzYx^]~}5ҩ7xN1Fc$32Пlt ~(a6 Ms*=r0N?q9naz͍fbɆ#,[u~0٢:64ս73g薛Bs L=? ra_ oicb!oo[L?{m%r1 Ij \l# $&J^'#0%[YG)TO~||ݝ7jJfr˿k˿.M dӼ7a dZzw=+MR} 8Bxh57Z8grX9SMY<&1ٻbGHR%^^I1F iѲLuK(sܟZRRCHiʞߥpfCS8 K,>k]JjwvMQrzR}]:3lU൲+VpI9'%]{W2|zcxwL<09KtsJGyu^RT9C>oX(`șT1{ +ܧ5G@;|rpȬTTkE)vc\LKaR,喦EUqv"#} 8 \г31yIY r %K?V"k/Ou5|䐘gX̄k@n)YO^o9|krۯA7?-> stream x\Is\Ǒ15,s cYqX18&@d֖Y5yb PWKVn_VU\ W^ӫ#:?Hjh!\):V'orWrfv傝lPoןI(zJVltJncbT\߷ʳVJm]+mA׭tɺqu򧣓_}JoZ錭ֲ̧U>'"Ц;jO*^ ZZ˺ΟRv6NtpRNZ#~-%{-u+ݴx('[|}5㮕ZiJB~K1jt nIey*^ J<"#rwx.l R '!5u+v w^'oƌ#,d70Ÿ63.}Ρٔo4zp"rjx0JS+VRI㠋` !YnZIm_J^jc1 ,D4(/=XmtΆ}XfTu[i7v*(`!sbHցEY DZ` OOIenm.Kh,'i9i%Ά+_@/֘h&)~0Ԥ >iP%S2&ub F'IiσcI &j ݇<pM^)nĤ㾥BhPa3Au`PV)s__c`& G Nw(Av}nrG" alJOm{a)\m4FeWu:wX9wuI+ R#C4J1yi8}f0gw"BVuF͸͌.x`l{F Rn9'kIWaɼ!tD/ )HApР K7FPk=R]_EЖ>Nj c`UU,1ԲF$) x`&ؚRTC,Q#k&Pؘ Z{4 #8C` i xs1:_` |EI3!# ,BVMb෽aGZg~}<8'ܓT#~E `}Jw!|JȋſE|8=P=͠g L} faoГu!iH>mwtJox@#K`&c8rq/u)ۃ_OY&귭Fb׭C(&o\]>%Tu~7`Vz?Ωǻyè:G< s0:ƅzzIFJvz4uaAid{wġ虀`A:X5h}|U+Ѯ13L^ XH a͢u&J'oa D|W{Z=,5=[>,5߰>DŀD冥|'ڃ R9HF%epv7# [& ;:zS$k38#Kf'YeRtBUwa)zI ẅk׈ m.J%TQ: vA- o5o{B2# 'dt8ps !IX yKQXJ8@"]FS-x*&8AR,[8h !bʫh-ƃje5(9`>\D\8M|< lkMR,.}rl& IK`6dHn*eYHH7vɫ7y6, KBy RHN2V&)DDb"HOW/@m+sDoov&<iae@2'RC 8]ū8xn//ߡf1h4]o @m+6-BˀÆb05|GZYtER9n.艌d N0H}N^!ყ0:{NI-?=Nf {gIYf}ls1hQo_yeE[.YN|)P,Ls#!~7ZtuΔ+n*!KgFlTۻ*Q_ϥR6s}i/>hm;?h."Gs7Ir=/<-*=L79o}M{8Z+ 8 g]A?DNaS8s฼Ƽ%vdݕŅI'ۗ2g \^8neltMyBgGk!p^|%q}i3mbȌ]6Y `=L@_d(6ψ* BRR>(Szb1YQǫ~u$/>uq>8{6D)_[' &D8P㾐k=Wd}WΐuHdFZ!ֱ7uûC["gx=l@!Of}'mhp[B&-/'1;`Gݙs9GP4[׋V8cէTn| pip[ZNׁUO A!A{J>"pgD=$&hsKzxyL̪~/P,#쥢=.Nodw3< o;2zI52<(D}4_^"YsX`v V9@e,3\ڽ;p¤4Ō:T5CT/X;Vgyȣm:=쥒`kM/ w)TRhpĒ繛hA4Cf;`~JtimNj'NubӃ>Z@zcn쿥%ز jtёUG^%#MyyUԍ]ߋJy9y\wdC=UK;'wؽ8X!,:;c (#  2/1ghK,3Q&+հkWNCewT=;bO  ~Ց#W[>WWGR+[s ^7~>rۼ4v[[.ɇߣH|Yhn7n443zg7y  y u'4jՌ $ ń-O'5iD,tF"wvxd&aQ(Jq\Cׂ؝1zf NYuAb9.6˖̲mQ-{a*7t/|`W=(}Z>!,1]3"_:+Vdsҧf!XAwKdzVKxV=㡾+CM#AJҟZe+}9G%XYe-}zlG:Y ?_R90.⡫*72=d3y %zpJ=mF h} gvrA4P+DoWv`D^> gx9Gd^ LCG-+{{ۖHi~mo1Ч] QCP#=Q!rLqXS$޷,L@Qwy U~@%]Mzw˯[HW474?&ԕDT#tWhnD9.glD(}GYYye%t;4F ֦>%DD[1Z| EnrbEcuHYR=.8Wʩہ4_\,2U`n-0!$\m[ZDpJz+tJ_V׵[˜ef tjZ1(zC x}чxf!C)*_+?_kendstream endobj 433 0 obj << /Filter /FlateDecode /Length 6117 >> stream x\[o7~O~Mr:KEHf&YL;e`q"ɲײK-ۧdjYvCGuX䛃qP#WO98~2=yD>Z(vGϟ@0(\)胣Om:T86kW]_/oI!ӏ?֯qB ~ׯy@9?R9ѿ>fjG~rgo|D@9-@?^ PÿkFr7²i՟0uZRC&;+VM|"Fc0{n y a _ \j/S}u46%~4[ޚx MB}FB&BhxC ^"hfRA$̽ۈH@;?I~>Kax% a>x ߭|W[bl:j1CH_,V9!~昤<<,!)2ilpck04848&-q#iAA ! ^E^ 85859LZ?@lMZ9?u?l>?c=h;*$+HZ20t:#1ϲQ ZߏIyn~8ݘAP';~٘ 5Tcւ3w4Ơ{1I{n@sd~1)~A! YE\=\yʉڒKĺToL-r\v".w;jjmr|#X}]A 7,8/2 $%hF;giqm%3qdLUFP2Ɂ "7?)2c1,caXyh-V`L\9J ^,JBAM]/C< I!RF1|{+ԥWhf#j1EB yƀ|,AXxK41}ki-r+"R6G%]Fnrȭ%D#YTâquZ!+ '5 K@ryv$T06:۝6_W)8!"IXϨZehE%A`gMNy) {jas͗?b`-Vc6W0eDѭd+Tp>,p`F YRl% PdZVDRX9sN,=Qv0!@0!UW>!:B@YՒtjLXV mÈu ȀegsvV5,GeA!t5N,5hT0Ѵ ;u4)Ia{֠q)Uki BE3AL WɏS䝇S'pP A*vgБg`7u7?l_B|\vZY;np4 kyjF6>My0Kr$eXcɎ1̺ʍØ(fm Rc {ӔrȓwF3ME[c3_UJ,-m̂@y|x.1BsL߶E-tdA̤7:D`I*hּ?uCU^ER%m̅/C,f!J?OAEvlhz}t`ɇ.}-Q!]Q3*'+vT8J,fѫق#Ct,E"а m*;J5 /}=a|o,wH:6a%*ɣusԃevt=XN l M,8r.#TU5bo!\ƜWzPtǬ"׌4Ҏ)o)'*GM3.߃/Q_U:Y?ʈbh@]8ٰ|CqxyӡɗzcӔQI~a)3<~ey]5͟n4`b@=v0Y"wytI͎aGw\OGSsCbZA+S꘎ʉ0Ŵz'%Wm D@Z9!e>H+`)WeS53\=O x4|ǕTFIPRfMḦ́V#xVj"dzũh]Y,[IЮZJ.c=E/ȌZ{Y} ?Hh%_/b|jĵ Zyu,C|Z p}KvaF\_#QmpOCVT\'M HPBSJCl&+L*u8P;\حM0=ynHhֻr4èDXRP^Ix5 7bY,B,VUHNAߢ_gˍ=14TΥRUt4z_!rgZ,ݎW21AUnuŊW b<Ȣ.Jl =S!zV̉>䚉oYyJv5ܪQta^p/9d#:tn/MYcf&05Weqыz I>v1 01O1$}?}~c(=z1qyEx"UjKgdc +\܀Yp8SbҫGx#|J<uKb?_\tN%/k幟z9ڵf)h*)fh=5<7c[c Sfnqͥ+,X7iY+AwI)UbpRb/JgG*G$ >n<".Kѓ}f O˰4I=׃*[?8UfW&g7`tp^t-l|ec{PwƯS9 C7`Xv]PCo؃$c/G8^;xGK?UQ~'M,`FD+=!d֯_dK/^`%_<B,(/C/IKz!,XbFV&}A2MPT4+dީ4r6ֶJB_.Qm&,"ժPU ]Fu:=?;!Hh(g.2gGWtpW]־ޜM*M ٳ&qYaQ_I'^K.P\|Q6G.+<.yy!Ζer#$]*XlV[k$[M qiAf-CEW p'.E\Er#Ff¥CxƸa5#oCgz4H*:#$v[^ _>Ӫ0|> {as=q0uQdzrj/P v"K珯]1j=Xy_ S?si/M[ {kWoy,mļ9ңj)9"m#y4@^[ 3.kj'>H|^dqsaip um/KoذGAh5BKbы? "J¦yzVc¶r?9/fxw&;}tRcJUw)\tƠhM;.6l۾%$Wydrd4/CSRhUJ;T Jh©(iC=<ґC08:V¹ţ1b5 :M0zRǟ~3oD|d0Kp Wy9RRiˊXI*)"]vs $t"X;(lijt'M#@!&d0 4iPZ=mN+e;&%Lb~ Q+Y|0ut) a~rT8zD|u^oZ[Pz?:^fDž]JinmsPEbﲖ>͌k7x2 %u`slcqdKfݑ8;$8EЕhNϻEIBp*W/a{Z}Člv`ߔ w7$.i<^>~tԌK!wt),[p#pS7eMހLK4wjΗ աw§^_qj;GkF9cyfB!eH~ca X5. j9z(eewWWUpٱ侣/lző((]4^ul@^cfxg39S6IE߻Av> stream x\[sq~G#,asaE,Y+RY~YC>=v%q9?uĿO.;-ۃ?'Y3gR Fw 3(l?tW`\ _2ݜp%l$è:kTlE׃WѡAs ;1&r7˻ VY7246XeYZƮ U:rK`cq-Ѥ J:~~8/Pu=ʾ<ɺe1Ȇ1;5QA'V~OJ_GX1͊526NmlPzt(,~[ccA0Rb/Ŏ,#]p0=^`O*м - Tv[H *P*4PTlikZ4S"xB9w=p췛A=?\>;WLf!{_tb 7Ӧ+zŀ1刄s1IxD/oukhϱguiwzsz~u?~" Bw h!mg4@gY3Š20/ Ce{ ,w#f[@Ԡ4+3 G@3QYfQgZ` oĮgq\|t|h]!,fswT"#P47o.oAk`i{;/12rZ쇔.6'ۗ:ҜvЎ MƳW Jt.G_B쮶~!yb2]Zw[;1@tDQKE6 i'X̀APs $/ʗ0~h#Mvd3T ht-?Q>ЇС˜&Y&ШJBfϣS]a@b<`ŁhwzfS^`Ӹz5}VUp#45<.#ZU #+>a+f O@90HP|ĴZOp5phQ|kcJ5{X E+W \~8 uwjv!z1-e}G,󔕌iQbn ()ͼ_waxWJHn,jɇZ?sH{yx$mECX5E w$@6+QM[ }z ID+c mB N"I'#R2YU?m쨵F{ ~~C҈J.ş t 3BqIkm$v2׌jQ0Rf۰aUPe6j[OjVu{=\F]hDZѵ)mZ%^"SdeN {5F|E8'-O8کOG(4{  b[lg # W Bzn݌jFE)9kݥM! ɏ'׏A72F*5kua@N&Y,v5[N) ߳h &.I\ngML׀ݫ7IJ=*C@ oN{Ef_ewo&af8UFc I A9 jC[гĮ6N 0Yw _Ph3)c8[?IEtI|?s媲1_ c853&dUݜ{z՝(wYZiŌS{:Bge%_M:_7E*}_fH13=~1gsҌ}@'Ω3JK 'HF߫&#EFC9A5l9$n>r?FkqlFb8YhHeA- ?f{ ,sr|0l̈i4{0 x4QǰaJcpq$s03kD-7M+oZ-̉) DCWAyhQXnY*0E Z Tli";TPbK \RKŵmוZݞΐ9rR0K4Oקn;GV_"PZH @RtGLH AuC/!EA1>yJM Ly9+hLp w#AmGCCBmYlh(Ŝf]ft3Lc)L5~ƮUž,9As!\T<f$ON pt3vzRWяGi"hhxʩӿ22 0!Q.vW4,*t0Ra_rʗۨ>h  X= )#R`ئg7;7`ib/{V+ T $ɚ?؜:na"Rk#+]|xGם[:@뿼n(YLr?!2_80*&Lw@v`l達]AH>o<_a(?׹ZLR!Vg K>[qMI=ZB)=}J,=a o1If1tE׸Ά!;$o&?iA$*qبh0GR #fWU*2J[!Tli"TPJPRKI_AŖ*a)GNA+.1l(|n^O9?j} ~Fj VSB?BNHBG0?$!@doHb`HD2H02n&X9cO$GQid.՚6$sBӯؓl #DKF)@p A,KL@oU|KH&U~~bKIPAŖ*@ Tt+:;"On|b'SrNUa#v W'@N8474d}T~C8 /n]o)1?X;/Pk j^VQ%}Z?Ra8 hǖ(zVꌆUG:C9ҒnV_ 6}ݑPkt|Z=FCq z.,!u7~gLp6`n;cs׏ә~zgϙ~Ӊ^WyzxCtCU"!wT Uvg^g1u$>Vg\Bz4{g&%T_VWx gziQ,]l՞^R _-VSEA%ӂBYb3DR-NP;ޢEAD:E ~][ S 02C׃(ZY='#s-wTUFx3}V+*j^bp]/kH!!clj|k4O5”Ge@هwZ:ڝxF`fux^o' / 6o2qyT*l①En맲“h4zB՟+ 'iltn.*dbI ъe@l™m5q9 L*~QܶFg؁^6\-lyf}|F Q%. x>qh.?r3S 3lt9mva`U~OXg{5f ` m7DeuFO(;BVqOSñFֲkqRdr0 /,UB̒җ+lXM2HF6ߗHA׭w_#7>))G5˵ l#[]NPISa|lIMhz=6O$ZTG5Xߧfz34`D,g:RzrgGЈjn(kQafφ6Wl4 EY|n([g$sX(.}{dendstream endobj 435 0 obj << /Filter /FlateDecode /Length 6215 >> stream x\o\7vW[qᗎ6dP/f7) Cv%Y֮Q$َ_wH^g,;FQ19$Ǐ4L&/{ru#?'WA!TG7rx~uk#\]q$WR+M)]I,y-V^=K妔՟?ogt_JoKi[JnVtUJgxn"VrSJ'TR<#!`s?$U!:՟K#Hꯧ\/\R_\EH;yWJҷW-m)ݖߺ#?tq? y~WJߔҳRWt^u#R:/Kq]tD}㲣4>^I̒F7Өܔ[k*C),o-ԣY=Z1MS\D&OZK5(V&aPiR.xdV/A@}$"4̊ Oaϩ`S1ZZ-i@+ 3s6.;$bgI S$&xzFjD I:4arߖ~4V (O!<.mcsQJUBcMzQ|s, 4fRo4g2S0*mf5HʦLCKHD މڜK@<1u9&"ZВ8C`@T.c[tA§R(QS&3au.@L5T:H^vԝ: >8XtxU`I$( '+QUv]dzUtRJcdzUT{ئuO|6݆<&h`E04oZA%ټueW>U) rAZ>'7'w^$ph'P3/cBY;ץTqXR-~?Fb=fNyB8g3 ROfhgC~EL'Ե^P-Xa%XOvI y5[R`Gtv; N':`;#3 #5"MaFߍl $p?Mp`239D%*2K]mn*Mzw;r}ᜰm" ZPhI#l oS Y"gZZ刭0~jgkԲ_Zi;Zp75r2žE5PJvX˼8{cLd`8Dg}!> C)ą-|\/5^HU¤?/w=5; /"8`:^&)2/PGM.9 m!,uT(&d֩zIEYzyG*^ZjiY I;.\sH$} to%_syҨRM>@#rk]ICtD~12eTpL2,L0hlw]iO${/bhL^w}7w  J:MVF\ֶ]愨3׬3iDLtqs`U4seX밽ɞ7g>#l7I*xgmF8E}b n홥snÐO.ugm5ՓL.20Lvgӛ(9 N}{\Üb볦v=nm1<4pXL&A+hu.hL٬mPMwXu|/Ƽf]M3fxeW;6b~:Vkvf2V ^f¶'!.]cQ6:E|o2ߔw̙]zEc[Z$-}8K$I_IJ4NC.{5@;+uƏm;'w4o,zeV/(_t*]RٽBeww+ᏥdڻOjz0ߣRz4dsVessUkk&ݩể ٗM/KYgėEYςjcħQ5w\>7`W@.jgtաWK&^Uco:h^,7UMgܞvzpﶻgl<\Óߓh>ZB{QC~EgIz ˴û9/`'>FY><|X&IѢju{zRߩ<*aEa^u/Eͫo>zA; [_O:62Gx*xЉ:tJAm&)bjѢ*cEUCͪ!-iݲ;D۳W=M>"~spz=nk㟓J?mwekr\ Ka4[۳Oi tЃYHZ(4XmM|w 9;zI aӍqx&Rju%. 1D3^^ME# bk|DobzԞ>;Iйfh列 C_%zӸXVGB²2 zK| S[z+Rk-M0֪QQm\Xi-i]Ԕ /DyU*QD! PrECd r7{lHbPZژ\nnOTi+fXqҬ6φ' =wªjE7Jpyx)j ,楓䟞]o.WgW~w}rVV48x ):'BS 13(GŐdP^ .3tvz1iݘjECs(v '(ۙe&ְRH|A- KFn%d[z/3Lց&7H̬1231YQ{w-ŪBdͲ̏taԝ(Ciz`+D*XOalK$H zZ s2>st%LL#O#?H;=t/KK(eCPv~3 MZ5kKbae)T vI]vg8dC 5P6Oc䯞o_xVXӽbzX1bPt}g_>+ o^kD12KYڜJD>uژ&$ )) Oɐ~b1d[:Vt}ޤK%GYe_ӳcb&ܟ-M7n__l.nQ"@WUDZHBZ<ڱv-H`k9dSjn9z6isg:p)U\S2y`@d&CN@(mP3%O7iOBY(K%y22͡SP@LZ 9iN3,J54T<ځ]YB e Y>?B)=>Ӓ(_if?bb|614sZriqa߂%4pY\8?gWAf1vi@fNj$p~LyBp]:"aȦ<x4i'1( # p ȁj8q`5 @"^R-p\S @A@d3g;%_C"n,(; j.RI([Pg>QYH JcKaYL _<yH (O٬kY&H2٫j%-럡Y%}}vNCT7Lw]m !`-\zNO݌ 93Ոi6'?3%KA1qS}6Lm3/oC M[#1O+<@cM =~p M_fKLx}?f*i95pk^ؤcǼzC^E2U Ķ,%5ȋ;-[w~X63o:biv:6q_$",Hr 8=9:ή [YA>ā!@%4yo_OvY<;~kC .pyGu6L`+L$j1 -"o6,yo(<vb2iOQhue*w4ynz%/3!MFO ='wK uJV7z ̊ "1㴻"SļV/> ^9OVKNZ~h*IcFY{Y05N󔼬[f[?EV l=[ɼ5&%D{nTk,s~$gip/dԍrD?U W^}Uޛ̩`RȳoZغpk@)z9x`V]{EWstg2Qf_ʟ$xvrpF8*igF۳4ċc5`o)wkߔWe^>!\3mFPU@yI_Lt>n&AbQℜK_k$/۳rǼcӋgE♴m>癧JM}(6&(\3J<νO Fc;dW j{$YIW|]_"ůc\,`B94VǮE[%{& "ۣ,v3L꓉obt􁊛%{rpQ^jLR2iI 'i؞+> &?(1h[e_t`?4e p-u2GN3"-}sXcKiyIK 'rCPc -5} 7z6q,NHn+ a.-/edFX6*.]([^5 endstream endobj 436 0 obj << /Filter /FlateDecode /Length 5684 >> stream x\[o%q~ >ݼ4/l;M& #8k8#i5hJ,*YEN N6/ź~UOQN/x{9szp2^|/ΡGpqNNқQGN]9'/6g04YoL;I N4av3~r1Wcp{8Na;f~*.'?48ۍ4y?|J|p+hzX\Piv4!5# lh hjwEkhߌM$m԰}D=E5P3x{`m^Lv\6 탞V0Ӕ~J 4l,D9 fX4ꠂB`8))RI;-֕ LzԳ:^nveu|7SvkdyCO@=f 2oVk}3WOİڹ;ewe8<2(L1γJf̨Di`ѫLq+H; C(*7@;JSьAL`ׅWi>Bw@\IdZ4]x@g1CĴeLs ƇV`K4Gg<7M@phg8 Q *r"bv)IKPM]Mqp ߰؉׏ljVKB>'IPoA7s6Λi:|^˦p )ڬRvz!3,]0$pXt~ ~xüT[hL">"y*r"h޳0棅.h}zŖ= % N3i!hk?M-eUFiMg5dd!T,&i% iejOaCN%]ϠLX )0Һ.]i]ֻN˽4RZWK뱴.J뮴nKkK[Ki'1J6ҫY2#%p@yF0{Ļnw,RѣdJhU!_0I)pK us6k B'0ޖ֮ͯ 5]PZqy^Z/-7WnJKΗm)EoZn_,oˎUiM}V>,K?,1,ng9_wuD~!9R,KG\(YICb#8n_Zc>,)7wu_Zo#ws_H̤{yUi$/-9331zY//;!c,LQ[+ K덠Mba =2# ACܽ Ju)PC\^'c^ 0ami8lWir+Lj[2$lsE5Ap0R=䫙bHv{_էpEgr5S#f}UQӰ1V$%Z.>2B!\V *e' k^vCJ텈eRd׮qWue"s^Ƀ chQU9qxKZe|hCB@P; (OlY?η_$^\WG86(PUw LP_Mѡ\}xsOƎ 8& {GBx?])?1„ڌ"0鞴<n*Brْt-(ǂtb ϠwwNHxh/e4IQ6R$!\ rzOX@ׄ7Z_i;TǛ;6*jՏEXq_.!vՌ\PzL`2g,v=1h,PZHٮ+R>be8y!tp! *A4s;9I[]@" &%&"# ~-Y쮷3v ̪r^Ӂ?dM)Axh]7Q$ ' rhK3ThhOe1ԗ 1!*}|+-ݭuIU6,MLiir!zBE{߉:-!Oz {X8x$K|YخG';b+`rxh5/I{ jkM`~#IFƠx(* f-M$xXdl:FǴ` 9.1*A˻ӣnAez) Ì/7%\/oI׃fgcZPWU!oj҃CÁ a-o/|GF8z 4U^*?h/$Ȉax !>\ u" I&i)WOY^W r.Яp3N7䙁a@0X;Bfi~jIE#j"z M֑8b?*Pxsq+aK ,rՁ`o.8[5G,)[Z'}Sߓw17먠J-a%t=Mݳ/SU8H֤/X/%%2lGe“0zm6.A%Kz4_qǠ2Q*w2en錺%{s_%=,V0 ES[J"JŖ{Z=Vp ^lKNP:(4&W#d`x!i*< $E`0J`3ة+|-ƾds`; szR\Rm+9ƘS|"YN}H QB=w~Q ge/㛛K6 ȟAMW ζhVfYAoMO((zSy9ڲ#AJLn+&gSw ,I4GRI.k:PÁdanwP!!vC`t1M]规b9 65Z@i"th0Lp;Ր?i]T֫J\3jUWT͂A!JW"q 1艠,xe!u&"n&RC4(^{S_GX :٣O\eRdH- x%)aJP!@lưKŒ1Ұ,Qj+^> #֬EBʯpxM2_Ak8mMQ^s^-K;F$b e8N߷1xuJ3^DcHhKؼ NXA#hLǠG:Sڃ63Aia"X"`^Ċ>GpeZ:7SߙЩBw4P͛uU}R77pӟg`qk jȂyqYX`4† ,+Z˗~OR98:EjSD 119EMԝ:Tg\;D ^x0Tŵ@<%|r//v*sD!,OnO^B/;ºl@#tZ8Ɩ̝=`.th31zvc@٦o9b{B$9U]ft9L a0kS ~ɜ^eo P.=8F. bŮ&IsQ~rmm`{?\\ɕد;rv]7enw0Ɨ;!_V+ f`+a N-׾8wyI.\ch$0yn)|} }uUo ڔ$!  ׯ$o^d.˗ƱESh Ciᕅk |檴^lQ207I;͘a )غdFAVb2KX.L#+W?N ebGn~2CDWUǓĄ[Ӟoz6j abP3r)Rd|T"H| uKz JYLlt*J8JHS()jڭ!*Kusc$ Nmom2Jc6SM&N!^,@V '$u&Y_(jٲ޳xpk]j5/Jwp1R|}p]aq1eq m}M;`W$ǯb߈az]Sل^sJ:u֩SϜ*9dM9͗ݏi_z4-֥5e_q?nU>:LF83iέr!U͜><O` ,³v/xqU8amt{Jx Qlw!9 x?x [xL_ wT,MvgiepMݪңy"7'iGzf] q\_B_',E;, mʪN|-ߞm;endstream endobj 437 0 obj << /Filter /FlateDecode /Length 6716 >> stream x=koeqߕ! :>$_ .4hJڵ%]YҾ!3|͐^~XgH=CiK]}QǗGG"z;>s̱QR[?J?c<~~}S=MUɩ77c1e<7\J tb>zX쌟+ebmɧh8@K/gD &ˀ ;}c0ֻY88Ek>d}:G3aܿn\P>#iQNhְ͉)c%ap۰U@eÞD'Z64qXLƢǰ+%5-p/b䰼0ef d>ԪS %<>bZsLc\el )%B/iX$`VB%F1o5D Һ, N}ēƪHop'Ͽˠ?2ܟK@$wXR f: R#nK몴PZ(C{@ٓ"elk%Qd@ a!a'9. T-A{g IQ­s ߓ<@D҃ݙJrҥZnA{fš?SPݣ5&$_=0e"=\ul"DZP@3gL"@zy5D|`>a`*=r**:f85Dpt, x g5:[NzxnO(_{ `9'Z;>2nK몴_uiݖ}i)uo|4pW:q.y]盗__uQ}gq*Կ-(} [/K+s4vPJ8P뼃E&*.K뜣17?c#yErdӗz9QweP:_wwbG{YM_Uo59ىS .@1tY|sDϖbFkc-$<ɂq,g.pιJ⢄GlWϜqn.<as}'f|qlnX]n8xuV nv'%8K[bMͫ$[f `;X~y;YB)5> 5N N8Z-zAʐȁ}zd6\LΣI*05Lo*r/[J%C }@-SV9X&j f xޒ*Wff~Xmgdq˟=96nJr&lط|Z [Mڤh?igi..l*Eӱly(&v~ҿM7W`f5c &Y1Uhd$E|Tl܍jwD5A*֠Y <[x{u ߂6fht3!7#datݒe̘ca Z1 F6bTClPy5_1^]fkbI:,[VFEXA@mƀruE ߘ&Fۦ1EhSMh}.\'sGa&NXgsTn4I*:Ȩmm V- Pe%:Ы"mH9֍ Ԅ9^Q\YqN2+&%Fؗš[3؂7gyѬ Jk|%(dc*T+ϫBO&d If*xbq3]k6U"fă.WI]u2`eh|L-ZV U"q ?.VBfKܔ8@$Okgi B+4\>g',M lkcZ(9,X:cUo XգxT9 HU!y_K\D. tukT#f@оņ1ktJE\iSa`HӺ" iwp즒/<_<ZnX$ii~ECTad6ǵNalX6(p~I X)&+Drxx5:rdxB"XO=!UV w!f1R(RUyň~ha^x,1yd"h_vJMXy uRU|W+_/:lTs߁׷2Ŗ[eF‚z7G[=)" !% ổܡ!Z DY<FJr l^u< r$\d;,eK RQO.[**`}489c;`rM?jmF@ FM)0]J)Cf0Im'0(wH$8fN(ݩs;صp $Ttj2p>)x'n^M*$ڽ[*.#IV Le`n \9BD=Hy"/I6KV1`.dNMEew]`PWq40p%mWB$MiY36 O*LS_!Ns>zHl(U,{=%a,KHg7!, D FQy֕6R 9nT ~m 7eE^#>,fP8t8GԔ#$ 2@ECYW%%4-.%>1`!k<,NzyYd=n VLB[;U?gT  m&!pUF< eʑu;Zv#nu-Qoջ4".ԁ-X贲Jjs%墉)ɻp (.L#4&+Q+fn0wD" xQ!Gb M`+gaFpx_9|qHOJJHuoi%^ PM}’sЌ4;aQfv!m/?pR 7[[=*c7r̎h(^ XtZ!DIrJHe$m'z7R'׫Qs+fSIʹw^M  "ԱҦb-X$OvEH<n&RIz]l\oo0)TspĪB*{pTVC% G`2$X~ F@f[qs-4FL.֜EB%R-<#\Su١S M؍RױoZϦv{vq&\:W])CR ]\J무ڻeis%d E\o`wxD1H,qweW5|v:!>/W{ɏul>kB͡6X+9`QaEsitDQ4sཫNBӴ'~t匁Zuh梃Ң=zO;yB(yv,>~[:N|oo:}W %J`Ӻ睾ߕ־MAc6)~j3_ TzOAվ#4" 77zl5I":Y:UX|?y3uΥsN]:E1H*(ՓOgOgO;̇ q6onٿh7,~k"ISU>"!ۀg%.6Dz,oK^ċ.C OzA19[N;_ίP:>$ګ:lGVInFZAu5޽Bа[EͰ(iL {6Tp‚}߻JK/-Ȧg5w*^%J%e]үgW?qtV%/PWInFGVy v7:Q|K6f3XA=ц쁄Bmt@v &:q1F{Y(7Z[{T"X̖BR.`Koor]f.Unf,cqwF`H(ᠤ~* #!b_6,~J+, n“Mu\P%E&bi/KP2{"uNU~_Zed1x5 Q$1wf9->ܺS0\c T7l}{/Y,)"͇%/dB΍\ oJ.CߔOTE.z mGVؗdQpp5 c̬M-z+2eǎsY B[h3>G~D{0}wo( ?lXXAwa4PƁ2zw,:Cߨ7'@MREՕ*H*cU+-+Wa攌=Ux+Y(SU;ަXbB0k)`R']>֙PQe82`܆wcU)lիeKcOR6`Yxp@SigeqpVBEA8S\p&3<]!|z'ʨ?3؉< {\@aξR~ˈ3k(g 0*A'J-gDRArm:}ᢔңi(KU?X>u/'eҢZ?90C;į tA#!#ٱ{ɳh*{RT~Q[6a|&ט>HmyZWgAaMuD$DNg2)nZ{fc2/Ͻ[(|{HZC{;?5}OfzwiqEF:˔ $.Mwr(Ua;tGrc|I$~6Vh{*"٫{Yҏn _mjחa'{(1YPdվ&j ~1.?-0d * c+"Opg,URk^ ,zϚ ĭ~mh8뺈힍Xw8T/ҏh?TG=3 r[XaB܋n ڍR ΦƍX>GG/繱%,}e7vVݼ'P̩K/JUhendstream endobj 438 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 *b C 8QC_Bg|wYu`A>E0uŭ F,m1' ߔOK^{+x"VU b'h9w fh*q\C in X3 C+Snendstream endobj 439 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 348 >> stream xcd`ab`ddds ~H3a!s>VY~'Y9|=<<<, _^ ={ #c^qSs~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWvt-(-I-ROI-+I,b`````b`bddwEN3[S|5I_no,kw1^pxVn쾿y43wO> stream xkPTes\㥖t`Ϟ  -k]DxYγPq4WԴUkjr)6M2||M3}j3y9w 2S6F3jLjaBFδ>7 `b _Ga\9 *ޒ&p)Hqy)I ,]2s=gG;Ir^S!M/x֧L\VV,kޘ0I*+Hw#_ʐ])+cƇis}2|E1|"'!6MTOIC2IԾBM"XM 꽨 20U@GOEΧ QE#~`֝haxt6W!Z* :1,Z3D}?( y-[eZ*9:c}\;onfeӸP2'OQfPʅJBߢܛK6.ocWQݽb:vC +p6tFcL[<%/iѤt>{̩COS߲34j_ T"ܵsx8z2Jy<5A}n((j z_(Vt\u J`,-#TQxnCVNG6@ xxa+#}ء>I 絺 a=%j-V݄o޹dMHYjQc1gAxk6nKO@`;u|@;CH6IGyA5j 765ƌB>g|\J]z{%T9m%'O|.$H߄b:y<37ٿDZ5@WX4aFIvєz| og?8pXzu ai_ >5w9dy -PըbΡF}o2)uIMa c>@ȟ5zLendstream endobj 441 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 *ХC 8QC_Bg|wY˕m_Xց$i,XX8+/pSj&<缪:MWHAD3O*g fh*q\C in X3 ESqendstream endobj 442 0 obj << /Filter /FlateDecode /Length 3559 >> stream xn\N#'s l Ø(: Ee+{75áH!Q,FZ}6}G{>3rz~stV8Go?|v}ȕ7NډË'FDž3>zyl"&Ft^'*bH-|v nP 6A< g$^j K_Qh;|3TЮ2:i䢎VhasW LhYGWutRGespjK|E|)OpvfVXcǎh':9ksH0xApጠǡ#6/hUGs9${Bx8aݳۄ®P2c'>>z`lP6C乲I& .zþa#X ;Ӿ7+ا%DŽ,Q}{GFu/⫂o97Yts6Zn`ɸޛZZW!z !g'a k/6BMc!pJx |2ř?OKEK/24x@GNϕΰg?k$4*>s):@Be9OPހᧈaʳ֓Vo;#[LeUy!I㶍rߛ}6e2'..!~NvH3H)7|1adGwr]vn#ƾy~Qū}6F|FpuחoBk$4Yem / 1ةkbǂB@sB>>,ZWO_qTOq2e|u{XL]t#izK*n2ߢKz78=(n#Z(ΞDhv鯿+^߲Objb0l"PyÖ¦Ro6b]M4Qȯ`2ՋLmᚃl{Ȃ>:N0_!ڄ/5UW)X"y3JZe" ]HU Lyt!A"'j9W#5%m:׭XƬo3^+QJ1)ܴ|8,a,Ĥ<"|!] e>X`;W)ߴ-9R toو8rt*8qҝe&\Deت'o&1=X)=c)h3QRnf KI/Ha<뙱AGŇNK彖iiйyQNCEI>:peNJUfJE1lnRJ{G4 ڒO` ms vS*m @mҟ9N7DJL`N^TT0ې ^VWp"e' N:!Tez=ĝ/Z*0بD 4FeϴiJVkPsL8 \vM?>m[oz+kM_li}NN6> %8*D )9fpშ|F_`S0ױxf-TzEtmR7Bs51jr6#A>xԪk^I^'m)&bzh|EW P 7vW ³;%m%UW"% 1yv.:"Ŧ$jҸWlWdhVX֕u~BN:C@tu6;%Xܾ>G` t󸏛c]}.&gɆ^{:lͦ9D}[hPkdH]#F3.PٵjqgSʗY^20֎fj~ ]ʲJYU >\:JXQ9VM{jV:" qCCPZužꨭCA WA mu-~1ȬTB±% 2G65E^5- ^y=N0 ǭ_]E"x'cG3{SR-wX7OJVS5_ZN¿u' t2/2hYԵ f:FMBsW얲@maj*!ƷUv]u  cz^˾dT5&n{2}I[JٰbIOb ^_6ddžjZѪrg6R桪ؗ=\TB/%nٿ V fa` wMz+-kžEb .Z]6w Y]ʍbPSu뜔Wнzrp!˩A LM-|>U*97ՆܩITy@7ϰ_WT |!N>_Ħw.&Zr\)besS95iN?+<}"}_EeFjʝs [C9Q;y&ˈ*|VGݳm"C (`tD U+F)/{EޯGS.4DC&ݎ)s*M~]'/v7 Voʕ4SzPV}LOw\Da!gjK =COd uI7*kb#> stream x]O10 vA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3\UiZB 'mUu1 R 8KW`JM5☛&e=O) ?yShendstream endobj 444 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 vA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3tΫzӴxO$ڪZc:AMq6?M%k17MR{;RA|ASlendstream endobj 445 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 mAR | u*C(M~ISt;,2 ":ր#ME݀ gʿޞk I>C^[+x"VU b'h9u fh*\C in X3/BSmendstream endobj 446 0 obj << /Filter /FlateDecode /Length 163 >> stream x3135R0P0Bc3csC.=Cɹ\ `Ac# RN\ %E\@u\@E\N \.@3c݀}o]s~Nin^1PBC/'Wual6.&.WO@.Ӷ/Sendstream endobj 447 0 obj << /Filter /FlateDecode /Length 163 >> stream x]O10 ZXҡUqP(/ СY:ߝ|reA>E0u- -m1,O)x@fw5|s^[+x$E b'Φ2?M%K17MR{;RB|ISendstream endobj 448 0 obj << /Filter /FlateDecode /Length 11284 >> stream x}߯dq+.7t@Dm@~0ͮ|{g5;Z~ߞ<Ůޕ%9h/xo x]*hr$QS_}ѷ_gRGK<ߔ.]/kN#{1qmc%UHMRlRJVJ+UVSj")Jh٤􍌔y?OS +4~zrۉ@ot$"`~Gw/^FC?B^3/n}ki\~xּ/I)@ ZvBGCx/&5kQSS7xJ|,Dn8ΆaiD>"sڢg <󾷧X#dh`_[^I Wh*Zҝ/% I|%=jAt#}CQ`P!";5W)1QtNtqh QS`1iiII4MmβvgٯZ]" |emBCѣ@j!v]琵Rw[37;z\E6cA")uAÀϙ GbKAGaCCPå݅ O$daDZ %ѼX~\vJ}$EQf g a a a a5a *dC%B)d"9z1R!H1<蚸ŘݱģĢv };#/`q˧o!\Ԭ,coc詍tGC( SdBĕ.˻WܻOYn[x $F}.%_^bR}yv8ͯhW/D/@dtGYc@]hc5>_Ǎ;l(ZAtO$o޼uߛݐxpj<Ŏ;dnmGSf]#t˿U,i-N$>1_D ^?393Jo_l߿9Q%>{'&iw8k瑴+2S4=KBmc({eδGa^ fQISPLu7Qlz]51` )Q:~olS2cjZmgrkOIV3̫#=D*F덈?h⁙>}ZOD͏Xnnm~X>&hο;?}X~v _=|oȝJcT5o~R'hnKj|_->֧?GZ>P7.1o bzMo[۫=q0ۧH!"THwn=jJ&|`C0?&^-߯Uy!iV-^ d:hƿݎiwlr>ǃ`8j{Qb{r^wا9XS4 kFWt+26 'ol!HĀd\B Pࢤ{1Q~*YyT-8Fzf~bq&2=Ѝ!/NL*M&AHKd{@x'i$#ط GyBIRqRP A^=H rdWr̝%5 iC&$`۠I#.P". y> jL{8R8Ob ;S@3)oH⪐ѯWi"-,]r{&u u}` nIŝPiwFHX"\ᤝ k(R(q (Әz"xn|7pDAA9;9,j2Z+3BU5mkc`;eBMtRLk_OCɌ3{=ԗ RLfieàm[iBMweJmX%#Ob˒R O:pЉQ8H-EH՗ ,„4#CBLW  i1d,0Ãy~AI4 h؁4Z$up 2*z2td0rl4"j!-yBhk2;4-DH1#<B& *9zHɌãE:H;a3RK|vz*_0( A=@B@:tED@H?R;HN*y.!B]w_C}o0@Ca`@N5AKCL$س$'#H/^0'ƈnzIDq$+2!e҂ :ի\rtRBD%TX*6H|b.UO^xF*닆/O1!VBE:B ~:"YWY`C*Y\<ڍxa;BZ!@lW=s2CfcB$̇VR!nICL@G1#CIssrlZ?zD=$O j_[ iCB+3}\h֑n0$OQ-Y2؛Ւs.ќsA=\ಃ I*A=.1G*jj.7Aخ"NxV<<7#^+Ry2ȴJ.:280uђ%U!`gD\ՋzR) w0s*Lx!T^h!`JA|/ m9qy*w\PdD9}&;\130>‹[JL_t\鎘QV+TWx"WϲqјbjU rQ#$YUߤ3%M-85_+OS j8hYZr橠RO= TO( BJi**Q;i%TAdx7J Rjk Z,!qYnaM"IG( ZDo]1N= COIB6#`jR't 4%x&Wia u<,zHz0v8޹g;O#dMff=!Qֹdb/2c%,* yl+;@7)EQiduĢs`T  ZAk!nFp[ eNQ^y $C2FĄ 6E:)EN|Y"A ,+h2F:M^$VBackWu;W! ;du!(LQETrH(nMhׇL],vgr3h>/2hH,/p5X5eQD1X7~ &fB @ll' |!cUqgȴ՞l 7]@ܐSYY] 48V 5g;y<`* d±OIY2Y>hAO@'Y50'hc ,$G\ А|#?]bC pb/cZ]ĭ'[CiHmO@cvHToy00,6=W EdcYX n. k* 2@,e K@ TtiYjZ m{.X- LȢ,ylYZ[din^z7qs؈0ea'b6@nX|1lX CQ I{R8ѨZ/ o3=p: }88jn+@- L ߞ۠R onF閭..8(Jwl٢N 7l@v-vc}yֽxr`c 1a yHi }Dawzc9@y\dc 硓\awze9Ic4 Q.uo*g}滜Z m_O-p쑂Jrlin=4Z.SV [>j ǹ Prnln=}]$gcn wr='Cy -nG Ԥ@XH[> #x0",7 $g{ve &31߅b& n$@(1֌f*{ccc!X l{҄ PXj t$ (q&5ro!XY niY<${@`[>Ye'{'‘@ǣ2 `dꝀ,pX= `ʠv[QޡhThcs#iQ l"c5 GRic7I=e lqTO@i_dX['[uO ({$88}K2ofC2f0" )4C6gKy[4/ckI *~,ØBTFl*Yd\L0C}(YapD4;6}WȪDM Z[PqA J3f+OR1c$/tI3I3(9iƈF3Fu3!Mq[FT԰'XhEN_Oq3aҌ˘mҌ{{=iƋi:5 DtlEyq%$su'*јaۜDc9f{=yƕíE4FX6q ,1Bqhܒf*Lq Ikgܐ')ϸ}g_yƍ^AR}&ϸuϸ Mq#C<3GU{};,[30!gi{)&h%~]Dc4mߓiu"3ƈ$'Ӹ%]e>3 &Ӹ3_O1P4Lޫ4y,9ƝֈMdh Py'Ѹpg Yy61dI5>I5fDHJ5>3(* pDpk&H/L11ik+_O1Aj܅zrS1W\Skldkx6E67zE6^P0S'٘W-$PXq@]dNB(ٸG$wd'}l^VҲ;2J6 ild>&wv5x`vb6$<}Qz=c1n'xcRlg!D|Nϛ>h<>{S|s0.]gw\z)䳉|ƑJK>g@,)I峭|F]>>C>QDsj>ͥ87R|3|.gDx3}vϠY>gkN3C}0uY>SA6Kx9>o[x]vw>%$ߧ,fs}KY>Sgso3}v@wI>|9>~J8$J - j? 3kQr+zb5|U:|%_WUC|e_}W(UL|_ WLUU|WWpyPWb|E_uk\y_Wt|_Wq}||!_i#r|EG$ +K<}&_UT|U*_W|,_IW|._WJce{kiš+jn⛯ +r\:_׹s|_s%}AWh"t }Mu #‰k4:ԣ+FN+X*j+sꝾ§+F}5R_W5+{کꊴ:֫+++N+ʽJ¾ڰHƾk(:ˮ׼tsiWZcxnVC~/=l3*q?"ğFqY;zpbO?;[s4?g|П!>8ggҟisO6O?g<ןsavΗsjϻ?7gݟs|3y{pOpG,τpd ϧ Gp Gxxx^8z#xx9ʐgyg'yg99&gK=`Ty֕#fyw9 gy&#y>ݑ<s] xy|ـ1Yyȉ9鹒NٝYH깦9깯9g빸9xÞcyȎ̞9ю6Վ|ٞ}OLpO|r9t]wvπ,yϤl{}!\R|փόp>`< =|Nq%>Ac.>ƥ=%\ 2rH>[AFzQ.yʥW ,3|Yc>g ,6(g:y|>[%C3}vˀtI(}Kt .>gQ[O]b>e>;g,_ 쳅}F:>{%8h's]~R}K9>|u}nϟ9wI.Kgd_ U|W/5|_+S5|]_w5 ԉ$| _׭-| _#6|=*!wFt뎏8b sUaoRP" h4BtS7vV]u֔-60B{+V?YRqL˛`l> .?`yK2Jw1/FA Eͧo? 3_=iy+tPy&UoF)E6)l%Xk"yfB;{sis_aA͓_&雜AdL__.W'!?J1%;[$,. [.f#Tr08o0B Н};B͖`o0B[M Bٖ`V̰BB{7P5n؄x3)ċj'#X !n6XLVFM&L鵛Pol[hVMhF3RN`UWoBe'`-}3&ԯaF Y&L`j lBw+>` X\M5ɛPI[,tN`2߶6M )' 5Sf+4lPO|3&dPP$SfM(b7lBm}^oB97XmxY6'`ruMڌ7X!|ބ& uSf+ XwM(mS lBN82HdM' B7lBcs'`6_K0ZXn9MhO Ű7|V= M f `@j lBqfUM(mZ&dk `wO`{/tBc+ЀYM#,ZQq?[N{y\>-UpWZrwHӷ$~HN.rw<._@g҅W|橻w_qn.6f|zZ?o9Ubۦ&kh~x)84򎭪gZJʣ6;/> }4eS%gN$Gɼ0 0vqds kE;kh#?9+( wD j+o{ ?e8B&2G-?9W\R~yY6EOendstream endobj 449 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2056 >> stream x{PSw%{Uivq7ԮQ1.݊"Hx<$Q%@{B Ȃn4Rصl;uݺ:خ.^fg/Nۿv~3If=ű0 q~RrJ²_ 83;6ڱs3gM}(Adx)fLGW1%)zuvL#%XlwRuD/JkdRXPH(fLQjbyAB8HRRu4SNm˥gy>reF%+2| f+V,ɔfɲs0l+ ێRjl [m6bdl96¥0YX/8|s*b/_ dcb`D^|42Cq7*j,ļ%sFu2@hiᐕ+4A 2sb5-t096+ ^*@hb(,T07mccЙZBsV EA8n:Ѷ*YجP쐽fv,'TUjɉ!^ߧxe3'~:v\ sumUwM¦z RZK={6t$umvʥЀ7o5]אSz S4jU=7_H|#a>ډ6KBm:GP Ztkh.ϭH;w<hϸȷbh*xa&+ΈyJ)^f˳+u@YvY8۫j QXFM 0R#U>5;e0oFCR'p<7& >;6 ޭG+Ռ!zOXu7|0;'Ndˌp,q9ݵž\LRP,w.SDŽrd@% &B|ps4DMX*<{Q; ~b@]wiܵD`!.4Y [ݜ ću ~G/~dCN)E#o?y\ih#n:q_ߨ)5 fcC3Nas33|zVh<6s)!'Ʀrl!j߻ϝ&h:Z\i%Uvh]RL [_a'WG5z(כJ_dt=v/uɃ3IN^ۑ*f86Qpz|6EQS)^wdd6 Vendstream endobj 450 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 343 >> stream xcd`ab`dddw 641~H3a!O/VY~'Y9,:|=<<<,k-={3#c~is~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWqr-(-I-ROI-c``` b`0f`bdd S{N|qo1~K $_i?"}w}>|g|g.904<_Nӿg^8wT\׹X*y8O>J}endstream endobj 451 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2293 >> stream xUypeè`[cDDF"JH. 9If&@Ey3rL&g'p#& q9,wqw\z[eFЭ{dT$J&cWϝ76WzD&Mo]?JݿG=BM98 u> G)PL+LzSʹ #{.ZZQƧ3T=VѦf&S2z]LTT~~umnHe~>CZ5Ҕ˴2!ERj:^צr5Eqeyzc)5>Mv[bv$E@Pk'T"ZBmRsרe *zZI-⩩Ä *2S7e'47T0|T>_`B5=9jA2+!0 QgQYZ#:4j3iPPZoqXI~w2%kn(m92Kd^/a%0r7x\|ϳ!}B**J<17FKPۘ!x~gM5,mVqݰ=8GZ2o2 >'I _.`Q._rG6VdX,H1vR{b..p/N@NK5hˋZr-@yh2{Q:3[ͥ|FaJp:h%砀@xF/"?>/^:VQ4z7/DTVDhA]8wkM w ]Ak%nG_.*w-%1@P343kEҬg)m;£qhW.H \4L+ҋ |vWv6`kK c0ݳhٻ%M|׎&h͹o_o | lV @Ia *wԁu(N](ku+յK}ߑvNA5dfY" 84ȭϦ?39φL&%m9\oRSi(sIzZD_r ޶(i,E FqPC Y*+g]8 V6[3 Se,@B $8,S^uPkkă ]WȎG[Ύ><Ц͛^qutuLBǡc!`+2x兰]>:kӉO5_N0ʋT0"dmްe17O@Ǜ=1D?7;67 ~ 5$, z0M*F]P ݃!s,T$du W6eIRU^֩.p5MBcFoɃt./"W68?$9Wvvs̚0(`.͂ai:؄b8xb;:Oϖ!tJmiTv"j )n#za䎻E;=tƠO).wŒ;j[POjTW\{5; R/y8Jnk? %MAC]gh4{ 9Q<@d7"Ф#'2;EfyyqAȑ y[4qqȻ[0XHdbl(ii:yWWx*?C}aDVT9 O6^flnͽ2;hֽWZѷr,5>BvM%C2Bi6vhs F16Tʻ~1c$.8{9)Q֑qGWh_/%7`k؋恋TSomŠgE&"t|~l s3мGD 5v@47y~3n"(oF.l;gF?y}°-9xY`;o(&X22>r_ɛo1֕@ SQ'0p਎N6;CKP!Ϯ5by;/ϳDT0)<H¾%g~_ͱ$k@"݀$/x(W|q=;?H0NlGh]wx MS`ѹ }-|uڡU6 UfJGa"bx]mAZg}b)g-L4m JQ. endstream endobj 452 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3271 >> stream xuW Tg֭$S*Y:*w14(*iTVّ},*"ҀJ ͪH :&cD5d&+95&?uNs}J˜c$e2/{85)?q5}ya֕X,L_<"OP5J$a{wG)l}g)-[bxsewB#B.!('X5wTvSD \5N'jbD1,4JQs!,$<:?B0NhCȨhgծ}]ۿE2tfd63[qgf3kf.d1wGƉyY,b\K La2VbŘ0qU@z$6"'K,6Z_<|yūf9?O0%b".62@_lRv!$As-fŠp4<-"3L*eMZ.{h(shFLIrĚ^ L*^Aj'y'T): ~tR?-ǂ:J&ڇΕǬIzDn)j-b ȺDB^$tq;96K,GD bqtnĞ+4:#w޼ʵ`Eu-l<$mYy<5lsu+b8l y@=V{pNW.+V `)&1\)28Yypﴩ!{Jlhp}ss4A9]P 7b:YzqIgT|]\ i|QLSIWSa 0=ח<K5`AV<R h%_[`u?&x :d *$5<Y1ޭĂ ѱ#?52 8OY~&Bdr)|`mo16F)ޕ^5HNT ˉ0<[6Hр&;M $L M @ױmTؽU`Y-=R\칰ʠhmݻ.ݼ;^ Yꬤ,!cc֨3gLDfO,|YKS着FEM4ꋹLz"CBPӑR$*躆*}_ MLxUʿ'#^zyrM!o7R A/I,(X^P{6=RinWWZb*ڣy%y,Hc+*O?]TE&j#s=wk ,KbRP>T쩈[즏p:)\ p{ ߿vz{ꑅMAnU2M<8 K5f<^B[*LqUzS5tӟ 1`o.'J4F86֔tʯ(FAP,~yOM Qz+넮MZo 9h>s_# #KM{׼K,Q5ңFӯ} /%RrPt~ 6VY.~RvPu9 y:c%7t%8C*a49uRwdmΥ,)ngl&];Sݸ}@"Ixj*h *Nh<1?k3%q&R[`HqkΗ6Is'0sMT7|>&UMÇ5dyaro]!0_1 e 9WIPӭ)-2~ gёbY=b Tx"n0UbDn4tio|6Ϟla + TԖ.a^W5f 8pj|8VCv*A-dzXA5U?6Eאܒ"sp3•`K&Eup5TŹ/_ՏuAا2'-U% P/_8IҺ}P:uUozrD*]TC˻e HR;́o_QOz_Op<= ]`{%Ȑa;2Ku%5]18ؼkg>F&r;nJ9t\`/!Lm7Ң Eٳeyl4Wo |cP9{ 7krgYZș8#fYo:;-eJzwˈW@7+s~ɒr 3 4;e1!’a K?)endstream endobj 453 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5390 >> stream xX TS׺>1s*xmB,jbs3($a A@ ́@*Ctk[-:][VR[C7lk:.ѵ}DAH$Xnt/"A+b _G%ۼ/Y[[1n|٥#B#Uq x gOv8_Wꫤn WƹTF̝6-&&fohpE ]cAQ}{\)]Z9GxhD_&|"a=""*E)WDf7l 0yT3fƬs2(füx2 kFf3la2KmżLe4f,gV0+Uf-3yca gxf83.H/df0!r=#*0x6\&)gw}ܕpgȬ! 2m/s?/2aCçkKx㈹#^uju^ QcXҷWir!ii$+Ľʠ:Nͨh*ifS g2du sdRf^j )'3B; ,ϮU^#qOTwm`l8OZ,٫yxv V; Sp t] Й9}oRTص`88zĒ*9a^TTANWFQl~ b1GO=qJaOƣ=:#KI o_XdV'Μ.ip""W|!Q ߱#8)f^A]'z!f #!q.qO y 5Y'K!1"+U]yU#3$EBV C$I)d'&Xq;/Wwts}kd `rnƽCqw~ C6m/s&';_h=SrMF vCP ⷿ@nܿu}F]:Kf<(Bׇ$7Ւ[U ЪHr3I؄KdZYH*ٮiayP̄e7S1EhH iS)qL;aoL~z/8D!_]Y]p8gB',e(ҟPj>])h͠u}4/ZwINf\<_ACXj Bf 6K2Q: )`PJ&[ &#a.oaZ R699M-gSԜ.RY-kM=|&鐦j~1%J5DBJ gCra^_^&.(jݮ1Rٷݼ~2.Z|$0gqqd֒"n 9 TiŐSNi6T~Ƒ&1f2guLpI=KSv]ovCz1|X(b; Wh"{XhX\ŃC-iY;|2(jv0@1o pҊ]xo U쟼vxߢ)m=ISLhfDVo{P}̉p:/q9_`cf't6RiUZ1@5lj\jfwiah=A $tΎArxϹLSa3B8z I:mj4r }|~-8~olG@ $i4H8*.fC-=ngrzƐBWp0OUЪUs'Γ(^K1km;hm~]a<ꏶ0ysVbFR @fAf~/qLTK dgs14a&Cm|[|ۀ3^-+U@8U*E:Gω#%ۀwrm]yEm,T^=pg.ϔekME!A[sq]Jq/6qܾ?) YJT,=S@Ooss͍5-0i"hTZ\-J0'i9>5Ok(,(F, {V|myeb:O>Az8 u\9ΊKj̵ Ɔ;ˣfiJJVC^E8fmB! tAjĀVhvZMRQ_PYzxTo.zi#Cv7DsymwHloQשּׂcb-k,TPR~&U V Y`jK4P-b}E4\)R".>§5_;_#ŕ›e'\lF N!TI)H]e.G,0+EVV2_Yzt&>ɕ # 4y*Ш@?M\!r+pxtqVA-`QUk|^gw9qE6t,gddBjQ_s&JRJ.dᆬf#{,b}'5ݹSu20ףLVBfr!@V^fv0 vFQ/Xa4W`ii$ K?$*2$-kAz˃%K5T{$Гf$"NJQ7{AҎrjA9&%{h]W٦}#x.h A\e^5nl:dp''*(V8w)<7)Yw5 bTS 5K'7IN1U\W &fQBnL`T/&7xA~z;Bֿ2}eUP .&c͇WeAOvhq5CΧ9$MjNEqҌX*4T.1U_w-XaYjɝej~/6O{$Xk rEn Wb5&6R siQYR‘WIꤚdw uާ`Ue\PQ bYܷϝ'+!T͊ѽ'R|mY>ҙ`80JG.iAڀh%MZ}^EfʀnQVLܭa$ *zzCLGP^d# 5pϱGڹGĩ4:7$i[Z-(})2 79?؇4Gр@=Ri@Jt4'$pV^Z--ƷtϏ}hiҀӗΗYG_~ៃio˾^k oז};8{ǒ'Pgǫb$H!<ك+=5z|Gff2 Qg&N MRIQc <"9OO{Pde<3&ҭ`&HA[P~B$mFmۂ@IX&=ԜƐ_&IO}WȦJ\WiR*iv_葮EǩSs !E (h2v-"*:15RЀn2bz2F)Bkx~(:PAšw`,9)dz.,Um:fݎoBP(E͞_^+kp5|jFo~,NR%SP%Ƌ}QgPH׬Fe2 I* 藴Ng Nܲ]}ky!_ݸhR'ħ%/ϑe98r ;.'|7mm꼪}UrtҚp4ysj⥲(fZjqWԂ"ֳ_tRiz5/[[__YYU,m\A~i 'HUh?u):Ȅ\8$|~td2|y؉Y>fHEe"eᰞR˺'U`#͂/nq=nXPH-\rh,wF,@U-mh=Us@aM,7v-QzWQ_l.i(z/o|OD^A26$f'_e)8d)4=(OҘ%B~tx.ОU_99Hނug+Nt О^FDŘLe h|8:Jjn7(qwFؿv%r'unFNXsXZOà7}b;S#쎮]4C@ȮAB@S)%{? E9w |A'xHV\M>{ZSh:y.replZt?ϟ4㾙r~(Ek¤b ~W^Ai=2RJUae9]<:̯>p:ֺ{{KܿyV1|Qx ?C>!SS5H4S= ǹڸظЕ]"Og :5;yIH *kO!{,Y> stream xcd`ab`ddds ~H3a!S,Unn}=I19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU;TL:)槤1000103012۽3'c|G?ܾ~s,{_7a> stream xW TSg1֢5^:vj⣶>ZDBB& $^$ oXZn[;lkwf=ۙٳ_ytNggϞ=9''"fpx;o>ZB,#kcVB.,i_y U,B .SPM,,Ǐ_a5<3D wb$/>XvXBhڵR4!=$P5l0~OFI4xq9 $ Q ~0qsD,ˎNۻ V*bD$)^b8@l&b+xNC]jl*hjeDZ^ 2$dv]5 }S~F fw>0IZLNdsQޞ|31\7*I_pֿWC9CsvQv9<d7'#y*1L-=殮cTj4YSUX[;w>Yl>+aga 7Y^:6x+ϯ~<ъ雿ׁwfÊl ouTd"g\_+4_RF"H<JA٨Ž+hC|틠l,?%޿Olgy)E [nڸ-,'jPNeؽf97 0 |{v|Y+)#fgcrӧ\.yb.4rMI*֭舘y?*<JHɷL 8LjqJ[* NZV$/)SILÁ?U-8`*{#wPɗtg: 䅢EiQHch)_EHxUf~ +'mV=l B+St̂d f}q~U쓫.%O\>u!DҺD?7C|mђMќ@/rS@^WŤWa_*:\-S!8W_~[wtS9MIPE~݉^Q-̾|0by0t`&_p5Z*lkl(9 މ{ccP Ci Fw(9ҷ].eW=ҽ/9OTkfR78G] 9v1OFP&v1Mk1K'%SU72-"9+t;wFSּNU6B88&gML& eclԥ noffܷFut:57q,7b2N*|ȓRLo)wq!`oZŒy *pU[>onQIj%@"TG@+ SA gG{Eh!94ckO̮%Gqh8jG@5DqenǺ$o")S8h^r8c`*l?Hwg]^]ai~TWt,FA Ԇ9&ދx7|1_Nwa6AP1偁Uuxkn8/;]"am髼-SM0˶ E)B0ʃU))g JBO%=zYijRR5GE`cY]?~rOc[;]^uR-(S -vV8ְN J_,<#}P}|z-Ubvv6έ ĭۯyވ YGGF_MۋQ!ֿ/$ J]9ukJWMUj7Tsmo?+iL!jI#\ |L#bZ~bmyxoá h f.$VXtF%LdB?_D૎Iev)V]2 p1g#Q`| >u@_eW[y0#I{6`>堥p\~PU[ZRR**l2MTպ|wMvۧD/ "ݤJ% GwDü m'p*֥V?lіJ"$`vBv m V_rjWbf_Q v;e< ף  p5*هBz<= c0MQjAî wsfendstream endobj 456 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 mR | u*C(M~ISt;,2 ":ր#ME݀ gʿޞk I>s^[+x"VU b'h9u fh*\C in X3/CSoendstream endobj 457 0 obj << /Type /XRef /Length 341 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 458 /ID [] >> stream xcb&F~0 $8J8 slAi43JN3Khj% ro4in-96䦂H k > "?Hſ Drn" @Q&8 "Y[@$) NoA$Kk""&/A@?LNN VlA$$&A)6_ K8$.2BO~pD%4q<`A!(u n060[*̞vsX a8Y?!D %IFx&lW J`dׂEBMNM endstream endobj startxref 548257 %%EOF vcdExtra/inst/doc/vcd-tutorial.R0000644000176200001440000006546414202474377016345 0ustar liggesusers### R code from vignette source 'vcd-tutorial.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### set.seed(1071) #library(vcd) library(vcdExtra) library(ggplot2) #data(Titanic) data(HairEyeColor) data(PreSex) data(Arthritis) art <- xtabs(~Treatment + Improved, data = Arthritis) if(!file.exists("fig")) dir.create("fig") ################################################### ### code chunk number 2: case-form ################################################### names(Arthritis) # show the variables str(Arthritis) # show the structure head(Arthritis,5) # first 5 observations, same as Arthritis[1:5,] ################################################### ### code chunk number 3: frequency-form ################################################### # Agresti (2002), table 3.11, p. 106 GSS <- data.frame( expand.grid(sex=c("female", "male"), party=c("dem", "indep", "rep")), count=c(279,165,73,47,225,191)) GSS names(GSS) str(GSS) sum(GSS$count) ################################################### ### code chunk number 4: table-form1 ################################################### str(HairEyeColor) # show the structure sum(HairEyeColor) # number of cases sapply(dimnames(HairEyeColor), length) # table dimension sizes ################################################### ### code chunk number 5: table-form2 ################################################### ## A 4 x 4 table Agresti (2002, Table 2.8, p. 57) Job Satisfaction JobSat <- matrix(c(1,2,1,0, 3,3,6,1, 10,10,14,9, 6,7,12,11), 4, 4) dimnames(JobSat) = list(income=c("< 15k", "15-25k", "25-40k", "> 40k"), satisfaction=c("VeryD", "LittleD", "ModerateS", "VeryS")) JobSat ################################################### ### code chunk number 6: table-form3 ################################################### JobSat <- as.table(JobSat) str(JobSat) ################################################### ### code chunk number 7: relevel (eval = FALSE) ################################################### ## dimnames(JobSat)$income<-c(7.5,20,32.5,60) ## dimnames(JobSat)$satisfaction<-1:4 ################################################### ### code chunk number 8: reorder1 ################################################### HairEyeColor <- HairEyeColor[, c(1,3,4,2), ] str(HairEyeColor) ################################################### ### code chunk number 9: reorder2 (eval = FALSE) ################################################### ## Arthritis <- read.csv("arthritis.txt",header=TRUE) ## Arthritis$Improved <- ordered(Arthritis$Improved, levels=c("None", "Some", "Marked")) ################################################### ### code chunk number 10: Arthritis ################################################### mosaic(art, gp = shading_max, split_vertical = TRUE, main="Arthritis: [Treatment] [Improved]") ################################################### ### code chunk number 11: reorder3 ################################################### UCB <- aperm(UCBAdmissions, c(2, 1, 3)) dimnames(UCB)[[2]] <- c("Yes", "No") names(dimnames(UCB)) <- c("Sex", "Admit?", "Department") ftable(UCB) ################################################### ### code chunk number 12: structable ################################################### structable(HairEyeColor) # show the table: default structable(Hair+Sex ~ Eye, HairEyeColor) # specify col ~ row variables ################################################### ### code chunk number 13: structable1 (eval = FALSE) ################################################### ## HSE < - structable(Hair+Sex ~ Eye, HairEyeColor) # save structable object ## mosaic(HSE) # plot it ################################################### ### code chunk number 14: setup ################################################### n=500 A <- factor(sample(c("a1","a2"), n, rep=TRUE)) B <- factor(sample(c("b1","b2"), n, rep=TRUE)) C <- factor(sample(c("c1","c2"), n, rep=TRUE)) mydata <- data.frame(A,B,C) ################################################### ### code chunk number 15: table-ex1 ################################################### # 2-Way Frequency Table attach(mydata) mytable <- table(A,B) # A will be rows, B will be columns mytable # print table margin.table(mytable, 1) # A frequencies (summed over B) margin.table(mytable, 2) # B frequencies (summed over A) prop.table(mytable) # cell percentages prop.table(mytable, 1) # row percentages prop.table(mytable, 2) # column percentages ################################################### ### code chunk number 16: table-ex2 ################################################### # 3-Way Frequency Table mytable <- table(A, B, C) ftable(mytable) ################################################### ### code chunk number 17: xtabs-ex1 ################################################### # 3-Way Frequency Table mytable <- xtabs(~A+B+C, data=mydata) ftable(mytable) # print table summary(mytable) # chi-square test of indepedence ################################################### ### code chunk number 18: xtabs-ex2 ################################################### (GSStab <- xtabs(count ~ sex + party, data=GSS)) summary(GSStab) ################################################### ### code chunk number 19: dayton1 ################################################### str(DaytonSurvey) head(DaytonSurvey) ################################################### ### code chunk number 20: dayton2 ################################################### # data in frequency form # collapse over sex and race Dayton.ACM.df <- aggregate(Freq ~ cigarette+alcohol+marijuana, data=DaytonSurvey, FUN=sum) Dayton.ACM.df ################################################### ### code chunk number 21: dayton3 ################################################### # in table form Dayton.tab <- xtabs(Freq~cigarette+alcohol+marijuana+sex+race, data=DaytonSurvey) structable(cigarette+alcohol+marijuana ~ sex+race, data=Dayton.tab) ################################################### ### code chunk number 22: dayton4 ################################################### # collapse over sex and race Dayton.ACM.tab <- apply(Dayton.tab, MARGIN=1:3, FUN=sum) Dayton.ACM.tab <- margin.table(Dayton.tab, 1:3) # same result structable(cigarette+alcohol ~ marijuana, data=Dayton.ACM.tab) ################################################### ### code chunk number 23: dayton5 (eval = FALSE) ################################################### ## Dayton.ACM.df <- ddply(DaytonSurvey, .(cigarette, alcohol, marijuana), ## plyr::summarise, Freq=sum(Freq)) ################################################### ### code chunk number 24: collapse1 ################################################### # create some sample data in frequency form sex <- c("Male", "Female") age <- c("10-19", "20-29", "30-39", "40-49", "50-59", "60-69") education <- c("low", 'med', 'high') data <- expand.grid(sex=sex, age=age, education=education) counts <- rpois(36, 100) # random Possion cell frequencies data <- cbind(data, counts) # make it into a 3-way table t1 <- xtabs(counts ~ sex + age + education, data=data) structable(t1) ################################################### ### code chunk number 25: collapse2 ################################################### # collapse age to 3 levels, education to 2 levels t2 <- collapse.table(t1, age=c("10-29", "10-29", "30-49", "30-49", "50-69", "50-69"), education=c("