lsmeans/0000755000175100001440000000000012634550020011727 5ustar hornikuserslsmeans/inst/0000755000175100001440000000000012634421507012713 5ustar hornikuserslsmeans/inst/NEWS0000644000175100001440000004542712634421507013426 0ustar hornikusersChangelog for 'lsmeans' package 2.21-1 Changed R dependency to >= 3.2; needed for rbind support 2.21 Changed implementation of pbkrtest.limit - now based on number of rows of design matrix. Added support for "hurdle" and zeroinfl" classes (pscl package) In 'regrid', dffun now implements a containment method Additional annotation to clarify when results are on the linear-predictor scale. Added courtesy wrappers pmmeans, pmtreans, pmmip, ... for those who prefer "predicted marginal means" to "least-squares means". Output is re-labeled as well. Export a few hidden fcns of possible use to package developers Updates to "extending" vignette Miscellaneous bug fixes, including repair to d.f. method from `regrid` 2.20-23 Added 'get.lsm.option()', works like 'getOption()' but with defaults obtained from 'lsmeans::defaults' Added pbkrtest.limit option -- to limit object size of 'lmerMod' objects for which the K-R method is used, to prevent excessive time/memory Fixed bug that occurs with models where the response is not discernible from the call. In plot.lsmobj, int.adjust now defaults to object's 'adjust' setting (as it should have originally) 2.20-2 Fixed error in df for joint tests with aovlist objects (but existing ref.grid objects need to be rebuilt for it to work) Patched problem with rbind with R < 3.2 2.20 Added 'rbind' function for combining ref.grids into one family Added "[.ref.grid" method for subsetting a reference grid Efficiency/robustness improvements to recover.data for certain models Removed 'mixed' support -- afex >= 0.14 has its own lsmeans support Added support for 'nnet::multinom' objects Returned table from 'lsmip' now includes a "lattice" attribute; also an additional 'plotit' argument to control its display Changed DESCRIPTION to produce a clearer citation 2.19 Added optional `params` argument for `ref.grid` and related functions - use it to specify variables in the model formula that are not predictors Added optional `vcov.` argument so user can override the default vcov() with a function or specified matrix Now supports model formulas containing `$` and `[[]]` (and related exported function `All.vars`) Revised support for survreg, coxph, coxme -- strata and cluster no longer in reference grid. Previous coxme support was bad for other reasons as well Added as.glht method for 'lsm.list', similar to other methods for this class In 'contrast', when 'method' is a list, names are kept as-is whereas previously there was an implicit 'make.names' call Imports of globals from default packages per a change in CRAN checking requirements. 2.18 In DESCRIPTION, moved all Enhances packages to Suggests; Enhancements can't be tested and cause headaches Fixed bug in lstrends - 'data' argument was not used correctly Fixed bug in cld where fatal error occurs when type = "response" Added temporary workaround for 'maov' and 'manova' objects (error in stats coef.maov now fixed in R-devel) Re-enabled existing code for 'mer' support (lme4.0) -- previously had trouble with > 1 Additional_repositories Made "dunnettx"-adjusted critical values more robust Coding improvements for adjusted p values and critical values Added 'consec.lsmc' and 'mean_chg.lsmc' to available contrasts Added support for the CARBayes package 2.17 Removed unneeded import of 'Matrix' (could have done this in 2.12 when I stopped using my own adaptation of 'pbkrtest' code) Bug fix for gls, lme, nlme objects with 'weights' argument Allows for character predictors in models as well as factors Exported selected S3 methods for lsm.basis and recover.data for use by other packages Added 'post.beta' slot in 'ref.grid' and 'lsmobj' classes; if not NA, holds sample from posterior of fixed effects. Also added 'as.mcmc' function to return posterior sample of lsmeans when 'post.beta' has data Added support for 'MCMCglmm' and some 'mcmc' objects produced by the 'MCMCpack' package 2.16 Added support for 'nlme' objects (for parameters in 'fixed') (and associated additional vignette example) Degrees of freedom now produced with lme and nlme objects (uses containment-like method) Addition of 'name' argument in 'contrast' Now built with byte-compiler enabled Bug fix in lstrends when there is a multivariate response Corrected error in annotation for Tukey-adjusted P values Other minor bug fixes and documentation improvements 2.15 Clarified annotations for Tukey and Scheffe-adjusted summaries Moved estimability code to a separate 'estmability' package Basic support for model objects in rms package Explicit non-support for gam (previously ran due to inheritance, but produced the wrong results!) 2.14 Model weights are now used instead of frequencies when weights are not "equal" Fixed error in 'lstrends' when 'specs' is two-sided formula Added more/better references for LS means Yet more enhancements for for clm, clmm, polr... "mean.class" mode, uses response name for "prob" mode "scale" mode does lsmeans for estimated log-scale Enhancements to 'weights' argument in 'lsmeans': - May now provide a matrix - it cycles through its rows - weights = "show.levels" shows the factor comb's averaged Added 'reverse' option to 'pairs' Added 'type' argument in 'ref.grid' for convenience Fixed some errors/omissions in documentation of 'update' One-sided 'tail' spec now applies to CIs as well as tests New adjustment methods added: "mvt" provides exact one-step methods like Tukey, Dunnett "dunnettx" is approximate and only available for 2-sided cases Added contrast fcns "tukey" and "dunnett" - these are pseudonyms for "pairwise" and "trt.vs.ctrl" resp. More adjustments are available for confidence intervals Tries harder to use only appropriate adjust methods New 'estType' attribute for 'update' related to the above 'cld' accommodates when 'multcompView' isn't installed, thus can still pass checks without that package Removed .old.lsmeans and associated vignette 2.13 Provides for equivalence, noninferiority, etc. tests via 'side' and 'delta' arguments in 'summary' or 'test'. Also for non-zero null values via 'null' Added support for ordinal package objects 'clm', 'clmm' Option 'mode' added for 'polr' objects, defaulting to "latent". NOTE - NEED TO SET 'mode = "linear.predictor" TO REPRODUCE PAST RESULTS FOR 'polr' OBJECTS. nlme and lme4 moved to 'Enhances' field for consistency ### Added limited support for mer objects (lme4.0 package) ### I dropped this because it messes-up the CRAN checks Added 'adjustSigma' option for 'lme' objects (works like in 'summary.lme') Fixed error in handling offsets for 'polr' objects Fixed error in omitting modeled covariates when there was a multivariate response. Fixed bug in 'contrast' that failed to update 'pri.vars' which, e.g., creates an error in a subsequent plot Fixed bug in plot - it had ignored xlab when horizontal = FALSE In lsmip with type = "response", the vertical axis is now labeled with misc$inv.lbl when available Removed frequencies and offsets from row labels in 'as.glht' Fixed 'as.glht' so df may be omitted or set to NA for asymptotics Renamed the 'parm' argument in 'test' to 'null' Removed superfluous "P values are asymptotic" messages. Revision to function producing estimates, SEs, and df Added provision to specify 'estHook' and 'vcovHook' in 'misc' slot to allow for custom routines for estimates and covariances. '.is.estble' is renamed 'is.estble' -- exported and documented. The 'by' variable for 'test' now also works when 'joint = TRUE' 2.12 *** Developers supporting lsmeans please note: *** *** Change to lsm.basis prototype: Added a "..." argument *** Removed own patch for df from pbkrtest in favor of its Lb_ddf. This means you must have pbkrtest 0.4-1 or newer Added 'plot.lsmobj' method to display confidence intervals These plots also optionally can display comparison arrows that attempt to display significance of pairwise comparisons according to their degree of overlap Added 'joint' argument to 'test' Fixed a bug in vcov Modified 'auto.noise' so 'side' has levels 'L' and 'R' rather than 'R' and 'L' (so not in reverse position in plots!) Added support for: gee, geeglm, and geese objects (gee, geepack); glmmadmb objects (glmmADMB); mixed objects (afex) Added 'lsmobj' function to construct an lsmobj from summary statistics Overhauled 'lsmeans-package' help page to provide an overview with links to key functions, and integrated details of model-specific implementation in a new 'models' help page 2.11 Added vcov method for ref.grid Added 'weights' argument for lsmeans - may be numeric, or the string "equal", "proportional", "outer", or "cells" Enhanced 'cov.reduce' argument in 'ref.grid' to allow formulas, useful when you think covariates depend on other variables. Also, when cov.reduce is a list, it may now include anything -- function, logical, or formula Additional dataset 'feedlot' Now 'cld' does not break when there are non-estimable lsmeans Fixed situation where one error message masks another more informative one Added possibility of 'summary=' spec for lsm.options, which sets defaults for summary, predict, and lsmip Improvements/updates to vignettes Minor coding/efficiency improvements Removed 'df' arg for ref.grid, stupidly added in 2.10 (we can set df as part of 'options' arg) 2.10 Support for 'aovlist' objects (does intra-block analysis) To use, avoid contr.treatment; use contr.sum or other that sums to 0 Added 'contrast', 'test', 'pairs', 'confint', 'cld' methods for lsm.list, with 'which' argument defaulting to 1 Added 'disable.pbkrtest' option (via lsm.options) if you don't want bias correction and K-R degrees of freedom with lmerMod objects Added 'df' argument to 'ref.grid' constructor, also 'summary' and 'update'. 2.05 Corrected error in Tukey-adjusted confidence intervals New dataset 'oranges' Completely revised, improved vignette 'using-lsmeans' New vignette 'extending lsmeans' New 'mult.name' argument in 'ref.grid' New 'lsm.options' function and associated support for setting display defaults for various objects Improved estimability checking and ability to set the tolerance via lsmeans.options(estble.tol = ...) Added estimability support for merMod, now that lme4 supports rank-deficient models Miscellaneous small improvements to code and datasets 2.00-5 Additional message showing what factors have been averaged over Now adds offsets to predictions when model contains offset() terms (but not for an 'offset' argument) New 'update' method for "ref.grid" objects Broader support for transformations (see ?update.ref.grid) Changed all S3 methods for "lsmobj", except 'show', to S3 methods for the "ref.grid" class, since they all work just fine for this class as well. Added an example for 'lstrends' Removed unneeded misc$ylevs element in ref.grid objects New way to bypass unneeded package-loading from pbkrtest Added an example for lstrends as there wasn't one Fixed minor bug in summary() - a try() call should have been with silent=TRUE 2.00-4 Reverted to code that just loads pbkrtest and its required (but unneeded) packages when pbkrtest is needed 2.00-3 Slight change in use of attach() in lsm.basis.merMod 2.00-2 Added some support for adjusted confidence limits Minor bug fix to make recover.data work with more gls models Fewer unneeded packages are loaded 2.00-1 Fixed a minor formatting issue in a vignette 2.00-0 This is a major redesign of the package. Single function 'lsmeans' is replaced by methods for different types of models and specifications, and returns an 'lsmobj' rather than a 'data.frame'. New functions 'ref.grid', 'contrast', 'lstrends', and new 'summary', 'confint', 'test', 'glht', 'cld' methods for 'ref.grid' and 'lsmobj' objects. See the vignette "lsmeans-changes" for more details. This version is easily extensible to various types of model objects, and several more are supported such as survreg, coxph, polr. There is also full support for na.actions, and for back-transforming results when a response is transformed or a link function is used. 1.10-4 Fixed bug in cld spec that caused multiple letter columns 1.10-3 Added cld capability Fix to lsmip so factor levels are not re-ordered Added new dataset: 'auto.noise' Fixed problem in documentation link to another package 1.10-2 Added simple support for models with a multivariate response Bug fix for case when only one contrast is specified Examples that use lme4 package are made conditional per CRAN requirements since lme4 version 1.0-4 and later depend on a non-portable package Dependency modifications to meet CRAN requirements. Includes adding multcomp as required package, since we enhance glht 1.10-01 Now works again for 'gls' objects 1.10-00 Added contrast families for effects and "deleted effects" Added "scheffe" option for 'adjust' argument Added lsmip function (interaction plots) Fixed Tukey-adjusted P values for d.f. near 2. (Note: ptukey does not work when there are less than 2 d.f.) Allow covariates in 'specs' formula (also allows covariates to have multiple levels and be part of the reference grid that is averaged over in determining LS means) Allow cov.reduce to be logical - mostly to implement a 'unique' option No d.f. or adjusted covariance matrix for GLMMs (questionable validity, plus pbkrtest won't play along) Now checks lengths of contrast coef's for conformity Fixed a bug in estimability checking (occurred when qr.R does not return a square matrix) Efficiency improvements. Now requires 'plyr' package 1.06-06 - June 13, 2013 Added support for lmerMod objects (gitHub version of lme4) 1.06-05 - February 13, 2013 Fixed a bug whereby unused levels of factors can create havoc. 1.06-00 - January 14, 2013 Added a 'trend' argument for estimating and contrasting fitted trends rather than lsmeans 1.05-01 - December 5, 2012 Fixed a bug that occurs when model contains expressions like (a + b + c)^2 or other expressions that expand to interaction terms 1.05-00 - November 2, 2012 Added an 'lf' boolean argument to return the matrices of linear functions without evaluating them Added a function 'lsm' and corresponding method for 'glht'; thus, now we can use lsm() much like mcp() Changed examples with glht to integer df -- due to a recent change in mvtnorm glhargs$df is coerced to an integer before passing, but in lsm() it is up to the user to pass appropriate arguments to glht 1.00-00 - October 19, 2012 Added support for factors in 'at' argument (can use it to restrict results) Added columns with factor levels to lsmeans table - for possible use in plots Extended trt.vs.ctrl.lsmc to accommodate more than one reference level (Thanks to Florent Duyme, ARVALIS - Institut du v?g?tal, for suggesting this) Refinements to print methods, including new class 'data.frame.lsm' to display results the way I want them If 'glhargs' is used, those elements are now of class 'summary.glht'. We can still use those results in the same ways as before Added support for adjustment methods in 'p.adjust' (stats) Included a couple of sample datasets Various small bug fixes (e.g. subsets bug) 0.99-80 - September 19, 2012 Now finds degrees of freedom when appropriate for all but lme objects (For mer objects, get df only if 'pbkrtest' installed) lsmeans tables now show confidence intervals instead of t tests and contrast output shows p values (both assuming df are available) Added a 'conf' argument for confidence level in lsmean intervals Added a 'glhargs' argument; if provided, lsmeans passes its contrasts to the 'glht' function in the 'multcomp' package Added an 'adjust' argument for popular single-step multiplicity corrections (uncorrected, Tukey, Bonferroni, and Sidak) Contrast-generating functions now produce an 'adjust' attribute which provides a default multiplicity-adjustment method The 'check.cells' argument is now deprecated. Instead, we do an actual check of estimability in rank-deficient cases (currently can happen only with 'lm' objects). This check is not optional Renamed the vignette to avoid confusion with the regular documentation Returned object is now assigned class "lsm" which has its own print method. 0.99 - August 27, 2012 Now can handle predictors coerced to 'factor' or 'ordered' Now can handle predictors deleted due to rank deficiency Now can handle models with matrices among the predictors (uses 'cov.reduce' on each column; 'at' not supported for matrix covariate) Added support for gls objects (and documented that it works also for glm and glmer) Added a check for empty cells in the design (relative to the model). This (by default) forces a NA to be outputted for any lsmeans that are corrupted by rank deficiencies Generates a warning if specified factor(s) interact with other predictors Better and more comprehensive vignette Added a whole lot of comments to the code (you won't see these, but be glad, as it greatly aids maintainability) Added error messages for anticipatable user errors Numerous bug fixes and corrections to documentation Still no d.f. or P values. Those could take awhile. 0.90 - August 14, 2012 First release, still needs some refinements and bullet-proofinglsmeans/inst/doc/0000755000175100001440000000000012634421563013462 5ustar hornikuserslsmeans/inst/doc/extending.pdf0000644000175100001440000071047112634421563016154 0ustar hornikusers%PDF-1.5 % 44 0 obj << /Length 328 >> stream concordance:extending.tex:extending.rnw:1 38 1 1 5 1 1 1 0 7 1 1 2 4 0 1 2 5 1 1 2 1 0 1 3 5 0 1 2 3 1 1 2 1 0 1 1 1 2 1 1 18 0 1 2 3 1 1 2 4 0 1 2 2 1 1 2 14 0 2 2 4 0 2 2 1 0 1 1 12 0 1 2 11 1 1 2 8 0 1 2 4 1 1 2 19 0 1 2 1 1 1 12 14 0 1 2 1 1 1 2 19 0 1 2 8 1 1 2 4 0 1 2 37 1 1 2 1 0 1 1 5 0 1 1 6 0 1 2 4 1 1 2 7 0 1 2 14 1 endstream endobj 47 0 obj << /Length 2690 /Filter /FlateDecode >> stream xڭn C2kf`xcb jLoiv,Uȡ&$WU޾W?eKetUbVeU&E+C~ۭN/?|^W?6FPJ;d|r}9!h<7xh;U6YLYϰ'n@@ zvG&kyÛ'%pi7sO.8N$.r|r{W(үU 0]\"6EGZ OdgڋXrfE\"}/2EG&Ԯ??&E?x`=;^9VNDL#}fw[ TK^ (l(8ͺVU}A4'"Hh5R;}/o"w t2r ev9ڔL4|'2Ѷc=~2 d2;xn.$ UV²D3+ע:dR[LF:ϟn(iB) ɞJ{7$Cs7diINk9V7T_5ȟYGH*!͖"hzJPyU,4<_Ȁт6SOgER(paGˏ{Of nLC~u-n\K=.k%"4kXޔ%"gezY$.4r $xeR6"¼ y-KkM-ĘUQm;*RS 1-OJY*]Tc_Bx\3?pG\41r͗FנqlZ2YV4czG|4dzI;6&U'GR'0QJKo#fch uEaWmUI" H;ў-[׀ )zclH݂ݖ*iZ5oplI%LOq·ω#R6\.QaPK) E.CÕZϥ!! M?ITO |()=/r (a1yM6,6`!F} 1jUY`Ctq.*O](Sλ^)A;!\h\i("Qx I4FڭPK/VdiS%~( xЂW 5IJ{W0.k>@[`!-uBT k[ }x!©4 7 qȤf6,z9T3#T1̎fo^NHssa60#Zȸ௜{Sx-8=dFx= L#|/ >cx'< UDKD Sr,Oތ8Bc) }.tŝ SO{[^}miD\Aec\~c ӾQ7ωreI F/7<gldɗ dо}£tn9z& NMh1h~Ϳo0T$Q)_0zDJkwn2*VI ? F*oN9Yh$2z aѽLp3p`%o)UYk$ Gg4JjҜq|F=&Sߋe]-/L(j]Ev'cA*i厡M. 0MgOK/48čw? endstream endobj 68 0 obj << /Length 2136 /Filter /FlateDecode >> stream xXI7WtS\js2&8_t@|\J $i$cS&Zؔj vrk5W-'m>_J*׌btUV倒БmaU J9HdƊh3#1{zp'8۬%͜Sl}TnN( '^j!NI +xwjI;k$T.2Uo- VZ;?ṛ] vɾc!6)utYćĠra@-\n5Cq77D䰝sι:'Be㔦V* @,!ˋIs 46EICU9GC:S82A|)ge-kd)^z"w2^,Vv$ll= ꆴ=mz[*B8aڸɛ[wH`x Ȏ=]Bl=x&5ŇNqkukӝkaB]FƆǷymX4h#m[J:_BZ*W]7mMFvm 2^bͰMV{$K vžo|8b^S%JiiٜF#y>锭Qu"Nف. :ַ4RmE@~wS l릗gs.ˌأP9ylzte-*EwSO8 83&)C@]nQ"+Ud,SGg:B|2h-sQ[ӽc@ V400S0cE&w2bFa! ֟cُTTCisuqU><4)+ Gbӗ=L.\mx&lZ40LW)z &J_~űL}4j&:/m(Ü0;96mIJe2NQmSD4eA<-ٛ+H-y _φwGe%lCFbҶ\zޅфi%vY7)_;n (Z$"ԏ>LnAE~(LB4F 9=s}De`Yv6Bdas/ht!A󱕿7+ǒ%eO+M^MV&zS+ʢ)(;A3q:|ffiC<]I)M'ySq_S#E/$=/z."g,Ƒ'0h y6 /Al3{~:C `uaUE4y%dbF^zRK;~%/g ^v"_}KPVQOpM̩"\>Ogݤ\G>Ղ$RBQUlR[80'22\n=w,p+XY_/]|i'ҷAK_K0끅~#!ʹᚩ^˪F0xB|A02wݝl6yFL*3O5>dJܾ 钘Fi/rR@} amdQ3.$=<|]*[aQꊷ7G//Z endstream endobj 72 0 obj << /Length 2768 /Filter /FlateDecode >> stream xڭَ} 5"s;vYz&W6bDȃ`1Mytc|pQ`IFK򬾢q1}0{`B S&vY,)wҤYxG,$&01> 9CoG};hEsow*Ỳ?A + *ZM8Lہh V'4Fb v@K3CQDܱ=BW[}+ pCVqE;FzRR dVUsĤf'uF 馲߫+qdHRUR+t)}, $oQ'O褆c{gA^ OeBTkeQj%H0ڞ>[뒴*bi6s$[&9ś+ܓșwT`Tt#}NbyDޏP*>UR/ 3(]bR> *)y#;me}t˒={hu8W;U|AΌ(ifAۢ.]\z*r\L&;%B6lwzM A+4%y~Loxn%Hj"MEY,vtej]wƙxv s`UYLGQ= QDl{&. c0+iJxY1x cOȪǽZ>6{Sƽ{ //B0\C(?Nϟ9qv#5kEbʅk<[_ 76?wN?"U/2ȟ-^Qvދ$Nz6:= `^|@ޕ!qr M#WSiUN#9L^arU& V@@*`l<0׋m`c<2XY^-8%,pUA%cIج!ku}w$%RCQ6XxVM*Sd |:^'f9[3_*Ͳ9烨CҪǴA/J"Alm 6 e鉽a%BNl.-IxiyZ2Z VҔ#H}'b }srP,k#.>{ʩ$KK0b]qz i(\)@ҢfeAJQ?-BiΕJ:F\AT ?D_\(f3Y0ݢp:ET$]a2zJ{Dg\gf%hcic:D!#DzBޯO 8[NXb~[}.IQCڇy;Bޖ |Е@]i(ٞmR3s4s>y0JIK X$w" w.Ķf2gIzAFٮKjk~Ϟ M &7ћ δk%MM/X7e8°U|mU{ -!»ٞe.-ݍR_r88բ WEOU@Crר0K2礼*Bw' (Eh n\+:ɸ?H$g`]KSMCanE!hkUMT{#ۀJ4^ezp~iBФ&&4& cTQteeI.pJ]G7(kiW7TY:F^sceM)Dj6Kl))pTHxk~ggj%5ֹU6$}}|q C;i ./y">E(U"ӟOazz9D?_ aj%-D/)sed\ŕ0?TI]M 3|M יPqhY߰*E$k^$ %Y aFBͮx.7w}W&q6ZInAR j86H%Tx=\S1¢SsfZ \k }`YZ;ӱDq PH|jz/Z9{(TUK~~x?id endstream endobj 79 0 obj << /Length 2291 /Filter /FlateDecode >> stream xڽ]oF=BWTD[.?su<Ae6%Go,wH-%M&ϥ\>L&2ETj$ Ű8i5kULWxn/lzf +xٗ@MN^%> Qep7j|gK\ٔ}9_|ZB$BHư]}(%y+Ryk]wRSy' zgF"ASJEѵx̳YekHfwI |4i+ڧgA1X睍PChl,L kgWm慬^aSd,B_j)ᖷ&cWPvwǻK/QE2V!+p}OKvQӐ@J/] аB Qv/j: %Xӻ8g,X7rj}>UGĚ WM'÷)13[Nhܙ;&WϘOx)v$hmg$;ƤK"񆬱%Z'GD>#6kBu`a!e=cuМⱯ kna_&(FzAxd;a ӗi L}{TGҖz0w11k&h >{9jFyL~$-t9 fgbckZ߄Ro!^&O,/-z&zFdeP=K!>8$ގ٠G^u9n) PSl-=8ɦjl@Cۉg"MsC!t:vchXqѐ cNnj\Pw'U2IR{ 1"&:.TE"ҨbYx^)ݝɩ_he^ͮiE*hATRwdm€}vv諚tu5G hN4w?A STκ~m5f2ƘTa >==/nDgldFT?[_!w#gk}MAJ+)('[j9> ~(yEs+á#w*ʾ`-_7BQ"wx X:[(l[^*w-봿h~.YpݣPh]]||R>MqEty[vuǚoK_wB`߹{XEE2<mpWjet˝:&+ˮ+sÕv(,+]:BY1QB=4xV{> stream xڭZY#~7?íix>ϫ4Uڛ2Ucvk̶0hgp;ʩ[Aϓ|q x!'h>s9)sjB F;t2u"hLs{RC5¾%zb[FkEў`ORMjf@TMmGn6T{zxd2ngH׸8=%4h8C[h6~z&N:NV~VFghgv)̝K%%P`? 𤝭Q(Gٽ*M@Ah+x9qLi5$LB?ª̖Pu;ncݠ_yݰ`?hI /O[~ XFԌVV?6𺴑L;Xd)I1QrRm27$%+$[ϦtGEPw6hGzHY1'鋓hiO1~=2hXH}"M x}th{dX BWѝQrMyJ9"g R)mgLi,q^VTUP@ET 1[a4,k.@P^4ǑY# It3BY呆aEOh@D [Qw!Hu[Fԕ56:mLbZf_JS;RaG82A8Q^, uI{dD~US=KVpyUva"O?a$.{8!u_DiV9Ӫ{&Wi%.ֆJh.RJw!쮱KbucFga#NC-ǃ/d2_C68Lc 9HqiQ] U-Wbzv-T쳉߲bsC/5KI1*|z;۬XP(H0 sY$P;{keCA`E7"Sr\SW}ҡ.ΊfZqfE7`kfMƨ+ q) QV@[6g3SлD[1oko|[AF&ubGk%2]]!Kl~i#3s!øTL(AEp%SW~q-np7},pŁ ~HFÞۋ`1e(9 >M)]<\O4q4#m#oVGJJ,*tϼsDNnFj{'B [:aZ9^hx^pt.Q[0,09 eHO8;-!A>>ɒ;4i$DÑt"+xo=އu SM\Veh\z- ”]庚lƀ/FQʴ!ZGQbM*Qq7=.rVnT^ySZ .Ց8@*-uM[3rIi$UJ%(Y(L/57b{u.豩{Xl{!8nt:i}%黷Y7-k]? ^ƷքEH8d];iK@Ҫ'%>\ɻL* 9Xgׁ;?ySDG[$lZ<2zC:lի\'fւ("\\(@n W[\$x$! sJ͸)kmc:ȔPj|)B :dۻ̧e@* 4.q0&G`=G#6&7H7ruWi1r)Y[NЪSLWuW`x 63H)s3*](HPY*W4s^4a u6'|B.Ttq;X`6skxsx}BlHg1w*nC#r3+&`\"ؿ? $+[nRh2›stkX!)AHa҂|MCsxpb{5+Y6k U;l%|+cTrRʄ)w5lmޟo`8$>z^ >i Zi)(~}^eM_5A} %o jϱq9r*"Z㶪tUPj}Da9YMPϮy,&YZ |zFZH^_ܲ{xK U\Ϩd갫đX="޶\%~C!>?=" d0_*l<<[E\e 6&CCvr(.7PxX!4}.}r2%@Z}yβp ݰIǐ{͡K~-YfrbpV Yp$9dSY ΖLz!ee>eSy~8WGA\94Njhgc8;~CˁV>]R9d7hICM(PȂejMۣ֖Ps,-"}$MWXk]gy x 5|Y?{ !Org-B3$)1#?N8eYsG ;ٯ5"~fwph8$uJʌŜR ސu\Ag%j X:/%[(*%v UmtV'Ux*;dQ*0k:NbTgVmT\uUSNi.آOdC.VtutՒ>bT6_([=KwS5.AJ`r!M "R-W\JxU}{nZ IA  " c$$qu3\B$sT:o(v{$H.Os{G$z 2a0,#L5} |Rˋ$hT>SpKeI!8s 0Tb.gYVIej-= +a2[[sLγ|D`s GE==V{]iZe lR8z! 8ZxȤc j i|56uq(ϼx$#IXo"yWwOQtj;<]^]C򪳚J~m'Żx1r'V!jFv'S<@wEvE|7gi IY?)`-=x(5(y]> stream xڝZo6_6H곇;`vn>}Plqc[9Il7_Lg>Ȗ!9g~3?{U\,mF]\o.2EqQeMP%o/I}xv߮0hRU7]Fd>QiQնI{ukE,n3FSݸSΓkQ+]{-C*CnƒJځإ:ZΧ8yF 8N:zd/C4&׏=|I?P&NJiV:ys> d S4L*KCǴ=7X.N,LW)3DĤ7xǕ"$ VܱыQ=qY9B'XBDdsJWL*t S&&/H5>u+IerkeR$+h;;\y[d{AU&-a[ Gw1RgTo;mtR?0rkr%" c:g)V.1j5rUr,ğ8TV0a 'V,#)P\ 9@Ѻ^XDXasa.D^$L4V {GZ:XkVdbL{'-MI RpGQ ȃYP\Ё):a͈@FNu-Y/qBf[6{6a1zޗw:,{`V\JXunFWs%=dOx*mҼѿZ+xl^kmD̒HJp/ITǑ#ˢdwbM؋BLOnnu v"+gZ.9:6)˨j.TdkUU\^)J gLD7C=JlS]8[uDu.C haFV^CGӑ&--BWIVl]tpc w` DТS.nL̠`b_EϣGªC h~"3 ^݉-D@iw4&XuX-&sL  Nm:+>ϴf.0eJE1p`#zװC|*tcJ7:y{d *wj*Ty ]~y5έvx.=0EzPF, 8=ߟ$rh#vR <.ŭyP-^2Nm|blIS#UϺUl4Nf?[# Nb> fE"ضOE%;)WPט.A d6$+V3aDxْ{$#ĻCh#U|]ix., D&Z .xr@!{y')~GnݍJ\;r_ t>Bl^q^ƎEĿi~v[.@?X.DDeh-#`dr D݉#Lzr1Z)'ΈժT-~.MEpDȝ08>ViXU4A&q^^Nĝ <8XlbV"je]M6*k j.t "g4߿*KGj= KK%_z F'QU:-U3u jf&$:?ˀ!g儰g"6]:k4zN( \U2Yj2aC@ĕ7@WPDU&9qťXʳ(<1ejC-A> dIW`DgϤg|%cD>{/ר:O4k|]}sJ$K>K0A266 cs쬋zVV*|Z`e#Bp(&ީdS?o:s=#95JSl{UBF%k+^8ł?X^'.?7Ƕ@$wB9cޚ+38L L}6$N${)<僬ʎFJ |}Rj&L*h'sy>tycM=c3hS>^.] FCρ{CvKHS OHn]JM4Y^s,ɉO>15ʞ ^UEvө }Ki;R">פkZd::nlPѽSp+OJ$Vst;9|`΋˧DM ch+T|Yk؄0 M,?q8 4'c'"CﱄT &Eŕ$YFIR(܆ISyѕ4Wrlܩ*Jǝ0V`dKmJO. %$vUG yfE{%.=;2'D/#~ݭS`ՀZ,]͇5qn&"Q8KB{C{ھـ1f粼t٧ )D"b-y~}>H ˳+9m{wVBiF&3'^]xsI3?RUBM=&Q~p5\ 4Pɞ_P`W"5ڄ{LwGaAiҮ 5$hcD+'Ӌ\6RVX;c8eyqi[V YTbg xv^ [-9=ϼEUޯf=1UA#|Ja.x >EwTNo)؀6Z J2Rwyxr; B n}p;5n!pzEӕ鰹_pWay4U=*I!g@ _`4|~'خ|\jBaN&(zqOhyda\V4TU~dޟ6jOrMRƝ*<ᧀ`l^p:9 E,i1?kiD5&uksNopcPo@v~u cxo0ќ"O޹OV$闩矀17%E~FX8U"TXsk,|Mh`u]kU]2 endstream endobj 97 0 obj << /Length 2509 /Filter /FlateDecode >> stream xڭYKI6͇X xn>p$J#$*3soOAE|D5ݻ>4Fny4M7*}ՙۙ+L.j:wfV8rl t (\srZH)`V䍛$#V|щ]3=qp(]9'h&L7*ڿ{tw[&۶E="sUP~It;쁰̺Z$$6-iy<0nd E(OlO||xZl2Ԫimp$Sd +Y5ȩߐrz\E5eì(%o!bUtCٵv \7VFU9Ѐ0E֪lKc!'6,ʓN$1XwnZ/Pϟh_<{ MmQ {"+6ij*>@ֺ4G x$S/hwfJ5E5r܇x݊DHTx\% ʔ5hF a9ϋ)VBQ VcpJ}Q` b yK>:zHݽpTm8c8<*(4o:AU@1yǵ䎇- 7T[1$DE$*EƖ¼% |TJy9oʩҞ%szmȑlJn^6q=NV]`Le"m0[>5p^:MehM l`EA}H,"QدStg3{3]%MyfHI ^ kg$ŋ9 Ur2lG]抩L-rįuּ*|IhpW'b,U$VUXA੘*n%u]SsWOV0!|I\?$1Ʌ7foRC%EK,Lc"3<'yDw9GG?d&~iyH*,vZ5ΜO󫑆muLؾ޽L1똋|7a$(?9$&sɜ }i^8 &S02NRl +3FTm Lm"vi --'t c;U' {Ԕ 3"ލXšFeg<>y>s>%I%e#y{OdB^L1B0U]:D/@z?x9JGьF`M TIG*UFvn髉[@j_nlR8!̀ƝPy\iXBqQ$247w+W$jljbuMq&$ʹU 4vua=;Þ'W&M-e\0NK%%5Tq^eĤ&~KG B9I>e cRBu%Өt鸚Qh݆w v6IEd^{ \AVlG=ܠvO>t3qIi+)\G&_Eū׫y#݃7jņWR‡E+ELqQ&tGm%R+:RK佞ɲ'@E׼J3Pѩ "oHJlȄEyf +G~2FGn׾L#Z6\sdaGq+Hq)A,kH|Bs]}V2?1FpD34mǤcpj?@!8z丄2yIAFrol4Ȕ1Bo?p1ؿd=MϜKgE|x#G pb~,J+M:qC 6ۜvɥczݗ7U{Z#/@w endstream endobj 122 0 obj << /Length1 1621 /Length2 10847 /Length3 0 /Length 11895 /Filter /FlateDecode >> stream xڍP[-Ӹ 4Mc[$;N23wޫ{6H) Q6prsrrAAv.W,j Ppp99ܜB2t dvV5v3Nlgc y#ђ %$$;@ :Ԁ[kFK#@0;ɝl# @ ' GuQ:v)]!^@0*p9x8[m%UW_ƪ#@KK'W x#V]^@;GūRkn s9#a^,l%rQd:w/_6<\9t<@JۼP#A|miGWПJ?į=_Y^P|݁  9'd~7~\?~>2?^1<-[)- eqqy*9[*uN*o0 L\?D7|p?O?JHO=_=oWz@^@uTJ8ZN |)g]da.uX4G;gO te|rOuy;[z@0zɯV ?Y `wv^XQQ~!? CHHz7V@.5? /a(p|MeD.DD?kIy @ K9KPЎZ)R/qL&6W{ 4RiýX[rWOGm_R4͒vQ~N NI5 #H=;Aw)}r(Wn(_ ܭWA},fӍ5.Ao3KDa#Gb9qu=7BĂp;nJ{71-!9~2oiq|@T·Y=b "phXvj.mwe6QrB@@ـFW`RM3\jCfxDClm򵇢T/9H+no܉Z w3'8 f J`zL;_Nk=h%>¯d*܏-H1`Ѹrv+vب ?dˬS(rk̓,pʪM(qR#M9ssɝLFRlj@c)\bIj2͞h69F&1x[4W@EģH6)˔ify7p7[,DU4RCX*PGvC3'n{)3:7-ɚ0Di7yKJyX>[FNzQYL2L& BWR깦[^\lP^EHF󝤧C0]]Ea]HzJ{bs)2EE9 qBqN#j<=W6L7s1)1sXAa/u+H[C .%*`H6G- K:WkܭA ӓ:VB?E1XGI6\֘i'@ Sl4ߩViڝ7hb^tpNTSSL&}+ J_yҼp+4nm~[8t梢WXۋ[I$:RW&]a3߭dOjkncpT`f!kcRhnN=JZ3w`v/Ǝ6gIM:(o8ڛƖbHrcz.eJ)I`ߵk;nC/C>KvyXPSoRFkILC ,,S"hEwQ3 E[mȏr߷]8Ƃ=h -K`:ksyם#e؎@1V0(jX6x6LN[F N5.'}2Mi l2i難ؑ&o W g_>C#v273aQl6O7) |.5 Ȗ@eCiɃ9l&UR<yyW;ʸ4}aǺ՟縰aP1_Zx"}?JǬL,+>XTspwV,4ʕuq+dmb/38tuCEr^ OCN%H=Yc)[:jup0Ypgg]QJ$%B0_xo1΂L9k&C /gc6;W?VpgĴ=-B~FWQ|kxca uDψ'UlwGwJx4S&>0pL\)#8V"Ip | Z֘ޱav/;v"tI!n\v6|Q. l11\eUKcQL[KGiT`i+BWK`;>!)=&ceu\6sY2~|^CW]HA +`q="q3cx}woa"mqhMԻZdUN+yLexro\h=3S.'q|Gύ;%mb'%rnn sS#]SydG!Iߪl CF3s6BYlm/?!hp26(ȑ_HR{|BZz ʘ{U _to>~x]g rL4 SfS1ўɚy$09tA4ECM£Â`" \~M"vDa>^M!2矓6;XICXU8ġkF}Q )(~atY:.A`aÏ0Yr]b 6rb`'!Uѷn(zR>P*ݞ6RJ$Nv-30GK4Xi$L3r?BlCӽ!$+ADR6HFdEÞ~LgfαtQȼZp3!fQG^3pdON.ݨ*)ġYw)8RQ }pZ>6og#`G۶¡˓Wq4^xٷ?N3QgS'UCIŠBJ$*HF?VNOԱĽEV1QJ"?Zr|Rܟ`v:hfD#}|1 :F!9>ШMk˥E2RY|TjXOh<zN)TQ胜wcDw\/߷5 _*Pq5ODIKP.Nm7 ֨LXg$ R G= q?͋P\%ZAn,DH>N O:7j*]Ś8 0bC-ZQpUL#_ꀤCgC{}EVHt)w%L?SP޻uabQ캛P;JO.!Xe >#:D6ݢd m[ݣrv%n_|g}\a9CtBdOx<ř~]ˈB+,sH]z#s&->wg6xRl_$0 KP[r+'оm;'=]9Dޞhq'>U-c$(p aRI]bljN#ƚW뚻,~ʠmɋL)ƺ/ vKx-{O[vd Ii)n.w'QDKdLuǯ-xTK*Ӗ=7;DCD9m<CPae Wi4)XZ-u7*ut6s(TL=kǰ Ex*<̾ϥ]׋R4mej븈:Rԏ Z]`_Y@ΜJ;f91"ls:w a- z:Br 5Z;ʱ96]eߌΝ^5?Zj4(Ov8P0{^ 8tB~]~H8~Cv#ׄ-f[5ñ#oDE^ฑPgcp"*tǫf3E϶Ff-=6=>[*.x|ڊ4*yFhDhf[QbկmJ-0 Jhjy`N{u:X񞿌SrLiXHvI ԷYYSLlwX>_2RY2DN!ii 1& y֤I͹%ɓVrQբ; fjlAJdI![BܧcTbSސ;vc2/~w[J2CSيqsO֯k1sreߊﴀ˗C3OXQ#ރe$۟cS\E8'$J@C"0: ,aeZF6%q/x!S@.r7 :εo[ ja,=xD7=0-΁ 55'Վ&e &Su%"nM@v,l*4 d4$\'TF2]2ztDt^$@Zߐ1!.O7u6y׃.UN$7 !@:1tpރYY%11Ȗv!2&i!$'ѣYg5Q[֍5evӈG r2ǁ;QӪ&wЌ)#j"+[X6[h$.yF>['Ԑ- <=ZTt&5䋓2-!}%tJj%P3sGQgY[, :+:CEKv o6AoM~_$j_hܟԭDshk&t+~0 NSdYui) `A{HtFWyʉŀ_dL~oQrOR;#A˔nEn+ N==s^vYbas![C GAlvU+-|C)TNUbKhH<1rnq`!-i^JFUxeT.A+٨PN"Kw5އ\ pPZW_?3ۅ9m!~ߧ3:SlLŅ6P)$q}4na )j=)@#i]Tȸcx ءn}&T74CWx+|(SRҴ^|I*Ԧ;9RpOVHBoں0mP&%E2JcwN^ [NK?_0 X,<~č"/6gi=12-'O?Jq@n Z.*v61yOs!:CAQ؄1;7]k롓(ɨ/~Rzx5 iOs!q 5>\N'+-oF#j]fqВx́a26ϐbT'cqjP  uO8]CY&ÅGy31?hV0B6x .skVn~]2V4,U@#4KGMG бԎrl \8#ɵpdFfҚ^)<@Eeq 38Щ yfJ#*atW T?֥m"} M%o $x1 50"ÛsQh5|Od;I=JGʁ'J$AI"E@.yE>I?Xݘre s֊0d74`)dWU_NyVN$r D5AEg Њ|ߨ18O|{haWOCڮ[\0`;M[MC I^dteJATRB}̬ ]o,}n$9-rGm ?K;UPlX d!h`Ɔ]xm㠅}Wnt;0 ':0@Ys2D$>dT·3r<B2 c5ul39/[j{JNE_d dJiyTS4>: {Ka-vȂ*%crh"8HK+pXl4V:oN*ķ$0YgX .+8k, FAj!]sd1ОJ\PSv/h!jA =3JjK@QblF_Fc?٧]Z?S*O҈cG6&'l~=L"m6g OmNo.98!sˈ1&N*xЬT_$9-Z#CYG_ 'V7 v5;VX \Wq5nXL"4mҞ#Jjmo'7Dp)]RϷ c cAWFg罵u=儫Jو1HBf57d{^<d\j(-"OM칒; $5 {pIPK8oMSWmH$m~h=xj ',_"d̅v\; ] 'lJXT:/v㒣}D C/HBAЕy@|{aN~}H'mӻ1H#ol %f{}e V3N\D'U"AZ3&Kyۅb_U-aWI&ї\ji5H-X"ёHM"Xx{5f^\&kJ^vJ;NO W+\~LИ&8P bqJ(*MtO?.a.Juka^P3A rR_+ ŤOz*ăyߤ=[î20[MvNJj7vDWmQm;n^{w :g懝q|l-ʂjAS63Yd(tT8sunXOp."tKBpVJܗHA4` *OJiNV;Z'pt:a|F ĩA[dѽМwj{=.?%hć~_ G >Ah1y]S+.j4(o|*B7[;yoY0,y@- )[Rq~B0ڷ D84-Y}_TCaj|m oMq/&b#I .|&P?Ԃn2LMΤVԗDi՟hknϏ3* Sň>%xż!z=SNZJp *U}ԑ(;Zw.k}x%QWW)ŬVDJXVҋW9Y狺Zg{|Z-" +3FR~J^˃s=O9 &dPLjE"a:D qq]`"d7fQ$C}k5~ծw9}\/-Ks198ϗ\ SwyP 7̤u5'IBZGW%߄xw2KA烎#PV{'{I<5\mtq^tԣH骩_ߩ`o~p o=,CJu҄Kޒf3 䗆)%{(z6V;M gpgiԙ+mDg%aK65MZW;ٚ)7W94(͵{Uu}mleŰOٶќ0-+&G%ټxWf&E~uhBR ` *PQ<&Ө,E> 9f/is$uKS\tL2]UM֯mȻ 1En,zf#oϏ `*np3̕;Zt-odJy !Dʣ\8u!#:Wxml Meiʿ@֑1$P3xq YY Ff˅6J'e}bN6UJ=LGWxhk8>O=puJnUy,N{4+QT|>(w\!q,]®(y)#JTCR.wD#\wAV167tG-aK }1[*[̤o풎䈄i{ 0b9*ZzFjjlry:UY"5lm oaoRwh]\Ch FxwqA10!8Q34聍) ~$bיō@@is{*`KV[*ْcSU+rjGd}Vr"8n} -i:w]CՓ}9E#㉔L m Kt浥ePJEґ~$ _Rf[LjI򟋤'40;Ү➊G_$aFƠL!zG; **XBY CX퇻m+"yP_5c`Ȭ uV1Xm;<,igZIGޖww|uqlhЯۢYk` ?xBi{"+C$` qNzS7;QBx?LS5B6ь2%kfidfo/8SѧeylIW-DV?|6[,#\3X͐q=h M&hƷ%k/J"uJtW+leNxS8 XoN'wHvU*}9y&6rc-P F>Ygd{ӅLJou=0"٠\dmVꓒFZ 5?CmbvE4|> stream xڍP-Ӹ;ơqw ,8<8wwxdf{Eں9kLYI dٻ01D̬TTV.4NV {E9]l.o {- `geO ȉ nfeP`ȂTb O'+ K>50:Y],voMmj S+tqqgaqwwg6sf9Y1ܭ\,@g {dјV:@.N@hjotupll+w!+?MMAvVs+[ @IRÅ`lo;oflekluc m¿s6urpqfv=#2o,ao&ڻ8#'n4};wO.ndneof{ 3W {+GW_1o&l@+++7zZn6`6 pqrz `fe0ZX#S 4ݿ@M~l?S?E]FESKᯑv<L\&v.6uO9'ݷse4@ׂ"M@?Bcb5},?RTUH?_ouuy.oٚOmD-l>F+gI+rӮ{l gO |oej|8imy)sq=Xߤf{[G3*0ۃ\RoANo"',#v?"7}Cj 71:::~b/` 0?o7_ o!o,,V76omxx  9bF[_=kp7퍩?sF@7? ߞj~bQuq+mZ r5SW'M<@aqd.ĺ&;iT:&E6$/AkN7"I?Ж$hH`ÛTZ} U'wZ&p Dj{ቘԅw}}4m ;dr]yQ0{N1Ek| ,5ɜ#qa":s}3=J*π{Q譳s?R܉OG y12I-,;]5V6,9\`#g5YǢ@0ށaX)dX&Zv;FN-O3a>J3WT`>e϶$!״B0 y}|~S4u_Mr]t=O!x}ǥt?O RYe1:x',^ByV:2 Z2ؽFXwTq Y0+NƤ[vC =FR}M<5)WT$G|*U&,x`V%jgRt4Tje8B\-C+!3ydC{rX U_a^0 \1;+i3"CQǺ2o!UŽ| ᩎ2n{bSoCKYVsJLqw(wt [C40ROs5⍹un#>Wb́oNst]-Kbfsg |Bwv l3yiЏ$(ْ.t Qᇘm!EeN6h.wK)%M^H9^ >.Ֆ N-p&U\) ja*5Pnie$&x.i`Jyu0KVJxj3~1/xЃjjqHfTTG/ rKO<:%_xiC0vLk[_(5u*f꫐N7S:eÎ/'$3Π,ރt< aTSt0~?M/! m =\ܚqN}Pbg?L"4l3 +S4gGm.JK|ڂQy#L2s>CA*_8ɂ AT̤T8΄Vb^/ , = :> _A`:ƪnT6aL8L ]k]X&SuRUNȪx(零~ P\j2#w3a|=Wڴ}qaw|E{f\syڜ-\d2`IĔ7-kb5'Uf<-!@T$H0s]A'_̯<,`%`AƈՏж2 CОm;w$UY߰FӑacyJ._~֚ibvK279%mÏ.~dXUJU6GNeDwK{+ ߐz]Bc$U;J'H]No/U&bcC;˄RM=]nj"891VW"[6ҝ"L SM)*rZU.PLm&c:fJ,Ójb{=OJVb!f6I,*Z ^fOr3 :deгC#%a3gG0mطvA5xZ1 &V7E,2rl.pUFX]f_лGoNOUg ^vːp,@`ޖѓ^&JJݸwҮ&MKG@~vUP1'=ϠR{Q'Yg !BhDu$/確_Wydvr,iD۽^O%@E\Of0""$9$|}V#MzԊsw8nkDBu䆀j2`'Oq=:t5>_*ѭNWREOz\\I[nغp *yy(_RV \X0<;;z.9y- o5lt2Bʟ_Mb}o(ɹ;QI׼LPf넙NQ/ș+Tnhg4⪘ꀯmNٟ.\T˚19CHDFO97aǫ1e[ψIQ&yY֤:j)ʷz%zF&FXd0E5y*sJDTei|xd[lEG厩6IÎ?1tZâZWu*ӷ%!܄<)_!~ Q9eA#icΖw.ٛ &1Csvkrmzwyۥ4#[d[sۏ GdNcN1]HQ nl\i3ОR<$SCVIz|eWpE=ҕ [9S07M$r4C4ݛ0ˁ$YL _GW9 Fm>zu/#տ3eLMgF,o0# 3jp3]='G^.$9, W|~pd XEe; j!4l?FIN\+fDݑ=cұ'LMIq}?rTY٠'vqE`{@kQ7vjW!8LX͙'j2 )}֬%0,4 A=KǶ%R+@ʯb{tWV.:ɚ`3v;`KJ ׭t`V/MTL}9ԵyfX BMq4>2Z*q{onX9]g(_P ~΁3 h2m:,'ѳ,4!8ꤪ0عoP'–SY$gsdu's|PI@4 c*)!O-o˅AZ5ߩp/Iنȍ9k\Z? yoG=0)KJ(~/E5YO"kq}D$tS~r:"ʬбA08~~|݅n]ptm\{-!jJ٠7`ؖ-܄8kyoq^.68۰MV^w ]r%/u< W WEJ k%rG_G%cHsP'uC=XзӮuVICNxitF ,̐ZLfʎ4r.o3neS+=[ ӭNh[ќI?,H[vE/ZؘZ-Nh2QZBI%~}B>wx']qFJB4lQ9 d$ieC1t\p93'c eN<>l#VvvJz/2b|-Ca ="qtf%BFήa-Q䛸m3[u;iS%ʷBPɑ1ЕơIOWp3qת;;ED+j<s?0Bt*AhBSםq;iH9 Exb wSU)E4{\#W͐X6]נz]l~ JFxTakbI| 8 mjяq J{3ZcKxwq(^RU'O+ŜgO6CWEGf Qn=#$3Ӹz&m _/'@-l[[Lg+PqHgI8'ȗME*U1n jOy6DՍ2>I~KUr%V6S.iZ?|B-#䥈'Rf(.}<lK@O4vr!ݵp>^LY碖d}pnPtIB~^0Y])L"Om$(p3 -YGkY3DJ?1M(ZDF.x/HJ*'FeK5X%t|Zp2:n}_2#ݭ ]k g̐G~ciwpa`|R~ڌsYZh^: _J-o۷MQ! ,{nz+RNS&~ Qۥ`wrҞj^;QοB1B.;i@ǔ磔YӵNh,;Ѕ{w KHNE4ᥑE}.4x+uҜz> Fcy}KrWD^ CSHfޛm{ngSͨm"AȔ~!G"֊*ޣ8}B]dQ9RF?%/iH@d3Ʃ,uC']d> ٲa*~*>R 8>?ؓhx')md^ v8)dT޴ncd6X{ Lp٪JM~l[whmI%?W@dMR- A~N/c-=y0Rf0D# 4$E|9ZZ;6&c#IT&7G;F.7m9>3ݭϟ3iR#-\.J1خWczf`9n۩-.D?%S7F/ǹ}4j` _zX[dA۷"FXi+)&dŗh߿mPtB!)DsR0CmoX$}<' ,)@$? !yؗ0ٮiwbg>[~H45i?x5/5"]6"hO~Qws~w랍 ™"IS*Dg1/ڪ &9dnN# \_b꾈(kj4,ʚE@<~ǞXTElj4̈́a->fELedk;i;*PqzA6֢gCgXB/^+?$OI觀w~r""z>ri YKKVf;&/~_Sc%/ſV]GLJqzBܛ =t˶OU;\hEFPcY|AK%ێme2Fm4!Ê~X ?aoInܵIm/|WP?|d8 0q܆C#ӍVZeHIۯ;T>ևUqKɆ9M;fvz@lOC HhVB:G4Qg!nk՚;injodylׇ~T, P4րge)y.O ًg0ǭӆh03N**ϲ^eEJ贖Lsթ:Euۃ֫<8 3E= ZyDL =4V*s-' ~\?-Tk֜} qg~lo_8d͚V1C̸*H>;T# GbTtYcJm%)^ EͅQ@{M{}G zUG*Y.aH2LH]a4m ƠE'zi_?F,tzR,MR.:_8 =BE-͒g µ&0cK(pKRC=z1S25t h)Ye]/tE#dvF0}TQO,"/ sthp7Ehl-RR8K$*%YDc}Y+k5ɘo۟ᗨܭxsZ𱏖Jl.RyW$h]%X ՗െac2aG,4ǥ}vn?yi5Ջ)6 R\Iǃ kzӫNm¹7> jB©A/z =s|12P%eO]mM 3(>.eL{G dCycT>7gҸ7^8A<8mbvo'^4gzcslGİ>ǡ ,AW:WF/6.oniib32B9E gE[vw0^'._CʹQEIiX[fUW?B}2#:r %ZdOY㥭{*bͮ?KKsr@jS *9 }巳EbaL}t^ok,r6㹴*F< ^S3}Oum #//KAy `C mLfq׻>Y=ǿ4W.&b;5 9ڢp*WfmT֫ rW֮^?67V= "탏$?? bj'j┗qԍ-C ̲:pN(OPx?OLoC */;9CJ$zxb*Daed8LIn]+ ){߳u8q!F Irzze螠^JI 1_\ܪǥk 17OnC$Lq8ZD')"/5E9}YTH䯐-tzLbc%uH۔Z"ax0+g'7&@oljy|.RȌ?k鎈eRtm+~6n E0o!&gx7;D&9`,v)Qc|;RWN55VmO4M*Ꮊ,lݑiz.KL%nA]ƉgKm#. v 㘾b[+3S%3Vۼ js,z7Mb ghfF&Ka#F < U\~cfVBFH-q} vVBbڕ`\j2Z\b[<)f0 _n*[;d5ytke nH*'Iq1;>@L k5cg^ef^@!Wvp{XN&iij| Rs(˫ EtJ-7ϝ#SZgܳ4bk=O`L[}cW1L6O)PԻF;fp^My ٞxMMZEa2?bnz$+5O4hbIls_BLKZ/;Λ<8NCGE|v~.'W oI +<0+IZ$CH@ j)^>^S%HGLOJ%<"[Zh h vF+=;$sK\WX{i-“n RdTv/gO?>8.pu#tr ax|)\ƒGĕ<[3txϜVa`ޜ޲<e)W3Um&O]r1#>)MC)ϑĕ#WT_^.T6НQ&MQč6l,5HoCU?gb̐rH_!b-5ubTC-,,LJ mML]{WnDlGEŋPuMS;z2>dVIcy;vd83?a!#uNqݬd$T8Mba{7rRٲ6Fp *IN gL(d?`WoAi z)(iXM,m!s2M2+xVba7 v3x/}H)l(+!i_u|_O d2r)>׵VjnG7KB4|T+'MWzlZϸ(kVsX,g8IQSLL섯;SgE%4YGvxFyu W'$nb`Cm bd"}]E;jRBW>@kbn.|b8>"? 4/ yAO`+ǎz'2YŞۦ>, ,}9^SvjxB$V U2srKtzU3U#Sk1xIw1N>ԥDE`+zBŨ&Q74004: $/<.y/B:p&}~q0҃sNzt:ǣ)CёwRrf;Ef-do){FCd{)ɸUQ4S#0J0&/68 ޴qPD`0>e$jHM9/BVh`ڴb.{ aie<1:nIzU|meTF}4S)i'𽚮Fƺe䓩-(g>Lolt'nD$rXhR#>QNΐDiuf9 YE(6Ym'ƭԤЕ HMgET|LnUrVB=r =@ ݼk*y.(zc-CIHA['OfH&O]V8ĥ゙^l#4 !wE) vQ@-I^|UĴ1tz2$*+@e+g6~ZROJmQ\[wμo_z<(UQY TU2PdatKVQJ_yc_wĊ9dק+ ecZj&XlN¥f> NkCp[3`JUg.`׌g:;ZOe ݟї`ֺi[.K`Ënuf`(Fe2a#*[[K$J|$%3r=j8.D PSKGĈrrIYh(4?ucNSmFU7ټZ",+ΑO "R4[-Fzg{WB ~؋H__8WQ9tP 5~[D=Xxv< ,?D+J'r.B24٣@# z1J2\ sO:kU> stream xڍwX}?RP i7FIwƀF ]Jw) RJ  )!t3yv]9=~m"l!4(X$T 0$ 񮈿n3DdE@OQ@W X ߒ @4VD:hVEc|HG'A4FXO=g@Okn m0A;འXpE(e ف&z@C  s9@0_x Drh7 D90/84 EBaҡ@ e# pp, 㐮?{p({U~֧"{3\ D;l#bB{ `*uQ I 'H@?0aM޿ F  9hIPgBp,%i-9ፀ&'pP*e/a9;BÅ6QۅD)ݧ` ;~Ku>B I~7&˔`{ntR*;pSU!ɋTNXA{gUiٗOfX?dYbOnCc 2oʵ*ii^x_UgUXi6ʏύL:?U gs|5NK֜ɝb_|h1*h$} I8 Ol.:a>S]#?oظTS+DxZ:%eOdz},|ﴷLWƠb}k3 oE^3cU}+E徭n_>E9rwD1 D(^FoOTjx7u/H Y{{A 4`|ɞ޾&k6(XaRBKa2hXa߯]1C4Bc~SՏ.ߧ7YK|۪<ۜ7V2Rk|0b,;W8,m9ahkTX {^l6x!'rݡAc\.Mܶn\4ҋB!]z!on_eGG=x1 :_7 #8P<|Y?|uji9 `B4oD)ZVX_02|m_8ƭmw|q@'H2_U؝trٸ:QCօKMsZD*Ae0sbWhVM akdWW\Bɲ4+!NNv.(ׅ ?^G Y6<) JΕa: - ʑ0+&Ø/g9>+l_hNV[~ZϬQ &_) HzU IhkZf@<ЦY؋DJ$;@.*g ^w>iYUz{ҵ] ZʺuQ32ek96uP-0틗eN;+g9F=-,;\etٔ#T[}${إJ$XѰ<vT8%b[vv|-bi^h !E$Rbҫңw(,>}k9rfPPw өp/4j?kz bGdu#L{{”IabJ댥 dw`paibپ o4|ۃL?wvgxT>KqIaQ~\]PcҖNbSχؒkz_\o;=^DAҁIXAl $ dVBw9cs7tZ|Xz6#{F^° y#džg$~DdIy/ԖAbB}uՊwȭwR9\]Mu1\F蹁3)$Y{{Tm.~ nW t,&hHSI~n >. R=xj"H~BA3<3{QB|-x/LܔFN!՛ R'^RWiaV@oPXcUw6#G퀇B )fz>A;i U+|'Ŧ:!:+5gN=0(l%}3YŸZW3תkD}s}O-"șH3va+Dy-D #l|9w3vm4WLL_^.(GHy멽PNnwcP֘5ۡ{ET7*fj"#r:雑']q!U$;OHN]Y ) mK]~ ^*RyJG,YIa81'H%wt! wS3[xJx׾Ԝ Ѻ>oMu)Z=y^34k[λ-ct\Jq5K8L්oQTwOܔ}'>gڷXd$I,m̵]kbR,d6A,P$MxRuL%Y>4,$M% /ߎ8uyuȊB㹍?ƁmE=p-9aV/Z3Dj ~HD 2G,oN_ "\A "yKR lfmbt|Pq?MЊs#⛻>[(FV3^Ffr]8OU3d> =p QAMngN\*RC%Cosp FÃ̻1Εַ[!qu܂.`t=9ҠA .;W7 zImV^uL\h_(~y3^QNuyfs}L ~|Ik%Ԕ46# S]g޼g-P f:?: t1¼~}Xl&ܮ싮XW+[| [yZ[ܑ!ʖd-QylmL/BbuLlB̳ׄ/(p.\mU8-wQ##0Q4͘Y'+M;؅}(Taf#vJ̺U=;bhW$Kq2},Zam5u5pz3EBx""} 0Se9dtpЇ{IIirFa[_m6K9F䂛mHp>MmDR Lm\R)%{ޣ)[z u3G}/Z'b *D?vV%Ut|М~EHE^k F,FɄ~',g%LvuJШyp}H=}apV P獬6{~)aYr9c/ ib"݆}Y=H}μK o̓lw{vR ),N![6|ay(4lǒ* .qlj2OOx#by:#<Կ|5ّu7?϶]xp"!D*[YPVκ8wIIFVӥÙ5H x+qyO0jn at`b;FkijrUsG8z s'uI Lὢ?ZcgoS}`ZE/?Kݦvu/0@&jپ(bߩlҷ_hr!;s~˒S+U|+=k'da=. |rLUd*׃.]V/wu))vdbQQ>o+B'؟}5|&żQiaPQ%uukE}{|{k6q-ۛRbDxʩ&Ez$^AbxVp;)CoLݙy۰](iBD[ݰ־%2nW]P&49IUƨу .7gvLuwHYG=MS N 7SK,4EQc&kU['(SA\DͿf$s/1Ya)vUr9QJv^bc,R͏J2bxk\^+-R@"_^9P?I߅U~bϠ׋ D[o7dsLL5#.)j!vGJm_>!'#LE?ď0SyS 1jzc{h$5@.~ty'fw:skxT}J~W(3*M_xn!>$w792Esǘ'ΰ"<` HVGs%&ܬqɔŦ8Jek6 kyB6e96B\PWg%ۉy>mnBTBUp=:)mަo`?--q91srMy*sMc^s2??>E>6nUսəxGqs<` N*X{D{-_4־F^O%Au3BLT/ݿ厀d20|Mhbnh:M\Л;3wt5m7A]boCH>rVm4֎ROpvةm$s֌z={بb݋YNYmH=*`ˑtxTqoi=r2m J_UȗNixk .&.YgTMI}{/rYA{Nw!|^"c/N[-/nL$Ȩa$ ƔZsH6 M~;绂 9.>Xt:LHΈ%ze _u7,>Mu* \]J1EHqoկ5j7oI hC^pEĝ dMFl&]J WN֌<it41,\M&SJCKG|ʸtwV/X=LhK7q UmV~VaRO \ LnAQ8hAk{F%3U &jGA4[#VL׸<ЩjESsg>GPK PU ÐC`1l3o"wm&yAr^փ2L|2LPב^ߝ\SegFֿh=%d+.L'Vb{P9:SKݾP=D,>c).]\xLE,bs*٥Y YZG.od}v0@UUe*0ܴol7u\>d#e=4˜#|ahMlq|\@Ez˒pڅvӁZj\$GN% V e}qPt#$FzCyXv 3`l*)` |vWh: endstream endobj 128 0 obj << /Length1 2475 /Length2 20635 /Length3 0 /Length 22059 /Filter /FlateDecode >> stream xڌP\ -Cpi=@pwwww$@n!>23wWWTA-k9 92P֙ ,`bbe`bb#'Wp##W::Yra 4t~:\̬fv.f.&& 9rD ]-L );[[20srr:Zd ́6o v@gPP;;s121819Q,J@'+` *N˕L 71x Pm6ۀOo /gCcc;{C[ [35 /&L05ehhdojhamhfW1AE[dhadaD_4o]5:;Ohvƿ'kekf051U= PR7o :挿U<)*񲷳0r2t]>^*&#-o71o6|G w61~ImLl=~5߷*I]:!!;w{&= גq}/?i+ikj;۷6OƮ,?A /T\XoKsKM6mi]@ l:Xo!ښYF '1 w\וY[,~=Vo_2z{t8_*7ɯcac::z nl\oL~M (K7b0 FF߈(/`0F,F߈(qFooA_S7zTU~7N2"FoElo:c;_fhd03BkF11t2C[Vo l۹8Afb|#=07a&# [>[ߚi|=3ھb~'l[1odoo-[kοgG9cٌr:un /3?aXV7+?M10uw+ޜ6C_6@?FF:Yg˘*Qlc#fmX7o?]{c:?+cǷ 9By}=݁p3vA߃*Gy'ɷՓ[\+Vo:Q6ECcƷ0{ !ŧW~vVom"rp~-dq8df[q]d>J5Rǿp<(}ʙyf-+T,-Qkio*,N8d8Zh^B{RX^EKs eDS*rL0a2{|`;#/)޵=[>ayϙpVÖHuA?W/ycqSZ*nN-Lh GPV%v'q.X#c!Wbhduއ͑'7Iry}Py9.J?Ou~,[@P?, ԩ )ztNloyYpE[Rn}\奊 1 _Qu^JCB2aI)Vdi1^g2,7<y˝t`\k<'dNg+} ٲ az84X#x5dg{th6q=W*%˘ r|waQ)./*8RiA$Y371hs02W;E$xqZtBfboW}󳕬ղ}?TKCLx,H < .yI, #r48J0>~UY-\}|pט\gOq{WbT[ƜOzw#pV J/de35 Gzbu3ނǧLhJ3,Ic PwaJ{ k gx,R!KSt3M%K*Y??|Zn> DHRUxJ й~c\q:N󵉦tmh;W:Ә{ΙYsWP*n-q;dY&r:y 73?Y܉>8˘Lon11F T]=3}̶';#.kx綾΢kWҵ (4Bv9aFK4)` h_X!aز)_QNVVd{q`S~٢~n|2{ڒG %3˸Oۼ)h'=:S)+Y2"gOy0zݝhzݕnB ʒE&H,$øSy†^"!zn]5OE8i+&$$胗ҜԎn,-}30#v3Iꨫ/-[{~YUz-D0ٌ̇ bD)Ȳc=Z6^=F}E./%+B̩ E Q@,)/Ze*ac4E(3@A`kjb]^)fU (^fؿ,:~4{s< 4…* bJ*{⨎ӯ*e&)B3 Z./SdSSn DBD+gXkt0+$,WwMDlAZN%19U5YyGDY2q^t{Efa_@)熃Z~}p>qT[$<| OϨg%9%r"d2/qsfxRb5<Ұۇ #y]C>LXPinVSΏ/mR0K^p}ep5)(? pް,RV`/A}[<18Dm/2}$w^'MsCNoM|di/~RCxپ u KړyK>3pvMYLN38hb?OVf/6Q5j5 $I!)7s=E Bk 3?t;} ͚m?{ /^[7yx i9 ;a=ܩF<QX Xm?|ebܨXBK8jGqV[Y#('PPJ2B#{.~:"(@4=` nh֞;dS,ݖ{9^sI 2GԻht Uss Wpb9G/gҁk@F%לs^ڵ9)ZGmp5) ;kU)5?N0&KdcP% } WV#G%-Vxgji{yl S h q*Ը>9#SFg六*8MJo]*W < 0Q1 GڣS&,[5#`3'd2qѩT 6zdkt{ ݉}ED߅<C3CX]a.gC4@ s?L%.bCqlj x(g[ %JLw%f߫ @X^}8)]5 0Sp'Z{QpEUmin]BdT9q4ؘMĞCIƉ$֌"3vƇ8qz."%2N]v rjpׁ}n%!=%!CCY\d + VwN1Ná?7!},zd ^&Y1?9P/ٚQh X-Ev+k?0.0g1EvɿUiYP^61"RSO?x Kofo4waqP;c"/~ϺM>64$u{Hm}Mc72%^5ז3T{@Q*&Aw`T(2P3xbl\e4l#Ip[cʴ ]0exRDمk2F6430ܛkqn0\"lMaKO[OnU*`x(Q3x TfJsh2G|8_1Wh~XRO@z9وj4"c^IaU/&䄈ׅ(`:N wX7 "a]R"C'LEEOnn R݅j-1T:MIce DW/'@W[b:jU%=e͛\瓴ĹgF?e_f>3&m'R:COi>z1vC5黿)P;%fdE=sz 7lPyn}M[E.:.ZO&4Q DoLqΨ%1t%y?9 ]^aw9vHjm joG9z@HR%6[HxzlqkҌmy5z3'<N ѻ꯽z x'gh(ânGxٞ;2AXh>>=ݑwNk!SmC>'3 y!UXk{^F$ E~8&}?6Tw$, 875<}nYqpH4vu%(Î6jPslpsKXx Oƃr}ɷ1f~,1$^|s}OKV=Ee72E6&LdK$DYiъSRinq8GZ ѣD~u.EeM =SEDy=)ҝ&4Dm2vʸ*He^ߏ9(e&.3CGKޚc}Cu yd{-oA"@{s|<[a|9c5iF dBa~^~=xSg/ >ܐ$7*YuHb:ϷzSq)JD )WŞdtE~#nwDD\%FNjRЌ|'ij+8 P|5~lv(ڻcb(trE:UrS#WcD*\sbXrLU<ߨg[ޛ6ԙG/2PS' uyӒ}7& zUq  윺9cmЁs>~y\g3Ou WR$.:. Ct567]I#9YC5Uu|eK,|x>/ZahZ4&rj~ڃuz;)5Kwa}iNv _97IʼBvJZN>2\~%6ͅ3g,ݼ83?L➤t~`_`-`=#{C 9Z2 :+o/r&T£ڡoL{CV{,״$r4$k;ٞ~Qz "w2@Է=wqzrĎe]pPvO! 44#8 #%━ݘKX?&EOY$8:*5迋 ~I{BΣذnN?|T1tˤm<1nDsȇ]YWAS YQ^1_NI0V.Y]w Wxw6iOPkW|Iyix&rG^Q=x`5*!Dj4G+~/?B.iB]ՖݽyȜp6ܰ060"lmO&E%pډMWw ,shf&7cޔq]y?29T+I5QG9`Rpv3pQјCJc (,˺xm2\!svI5`Į= D$V:Fw{7E2{Ιh awK^W]YW4"Cۅ% JYjiHS׆:Ǥ A. f R`E"cS1Y'Q٬ Ȏ =g69raͷuC^xU7N9Jjs)z s h)2P:Sw״С8m*#ÙQĬOVAC9% 8Zq!1*痖A\w!ɒXʼn7IQ le9ϛ*zEHwhTcL'ndϠqӃ˒ 6Nag0\i4iڞN)vxx^E/ ?ي) hM(.rr+QW.xkj0kU_\g9}xWص]ŽTndR—#7OWˊŨ)Yމֈ|lz [)K9(3 AqԷ)eH!0*S䙸*kK,;kÄi^a08:"_b?Eg<&42YxNy;=$L:5dyzLG_I2T(nAvRbM*S0،-g9BИ@\IvZpDP5B?4qۙ%Ʌ(k9Ϥ|kqq-`k+o ݙ04S5L{ fB2ye%$X䨝yeWq>5LܘHƽ-z,ܨR/nuD%QAͫ9`zH;Eѫ:tN".h/_Ч)Dvh8 6~@$G/9[NȩN.k 긴 'O6؈Ϲt/.ܕE43ǖO6;{ނ׀,M9ᮂ!O}FAs)?f]B>cAذRk+@Tu72ApL) k A!3Xqmp1~L1ֶ8*;ݲ޾І)/z;~ q5VL*R{o۬-lt&Z䡯FUh@߅-e3&M`UL#;UWY|%X~a'w>#?dqxh1! n3J ƏCʞR5yO1:yR4G0dXi[Mu)`Țiߊ&YF6Geh-`.NQ.w1[]J`sh6شHOޕq Y,juoSGWA;1Jvךs€Uk1/=8̌y_XewܳzCp.U[)0%ΐL$vsl@/bәd҅c'; Acɤ L;뙖tMaoHᛓs0J_ {d}x)ْH fG~ܵCn!'qXjk 1jHs(fG3lk[SgI /㍫]'9.ҞkGE|q2*!sYQ3 ,G#EbwqD{R,'%;C/)< !L2l*H\0C# t!g!|66D Z-p͢`3I(wnUoʡBG7ѶX0Omh}7Q^.9|w׈ . B[&˜|8* u]!:ɣ%l}~5*UY_Px\ŕ Zޢܛx OK8T^w XKIZyׄ\)eGO 6a0wS-1/4Cr#KϨxc qs[ ̤,!ZGO" &'-$bN9ko\ 0BYZ_Lr;D";9Q=s#)Vo{$MLRF _ÜƛVeVl?H6O^>4-7ٕZFߎ'51N|'a"Z*‹*Ig@OU=\B~h r؏V?}%Qn11Q)n7%4'xMݨZ3<:b0cx~: >47n43xDU^&zuУ8-g%'e7Oj> A3,9 腯\e&Ye2(X7>~<"%e?#e 8i$[D1h]c8?v9!3>;U ᚁsk%CP~VUn|ⰳOl_ᕵ MRU]etEjCnBSJE}jE@W8U̒Wi1߾/j(QiRtW̓3=N܈&hC:Qkt9&5[ $h~|Yy.4@B{\3}d6aaIZfT姊̓hs5Fƽж쎬vcK fL " TUnXnPi&! n|nՔVjuhb\ /`R,^"thGJG.2qh|]s*/ť^>(E:߷r f%cjA5qF}~:!ƣ-ξݞ*9ׁI)Z5?+L֖ '%AmED0gJ 'd;GI.xHRG$Gna>00#I@&Ǚ i>E)¾ G޼5ze%w (+unJ+EeJeDUB2>hG1*ݓ]­R`EٔVp+cX~0Z4ΙPEE*uuk #猧 ZkUکL6Cvƭ'̌ޔMFlds^rG!2ӦL95uP(C{ HQ8hZٱCiúuLe1M-|r]PFgLzYsL{u}kb ! Ϲ)]0*[s҉o'Ѣu/N>>V. bF?5m6WR۾2_wr#\_Nyn4"(1u胙#Ċz] ASM(9S2̖(hkV(zuy xO*)`_%Er>3\+pRbw#+au9l9*5RE>na'Bfb > ś;#cXF4Hsz%F89:+[Yەy*KHK3A;cGA[̙|{QLqHTCS\:K"awqͿ$+M1zr)&ESpҮ ps ٕJxǛDC9{!N5=.8(}3Gb} W)*ȿg0sjo3iq̖Q/3^ؕ(]^ O]x ME؋U1p>73d L;}Z*1STV7݀sR۵&؟B\AW0y鞙#` X<ewb柤u~|e/,(0dYWBsn g'FuM sJ2WjʐʀF%ER( _HN#)"9;A?Ns%W [?;>ME!2:j֓rRw΁'= 9x\ `:Vɹj{UC#mVcv`S@gj;ݝݏDXeՀ*ҘKTpXe2Zg/e>M-TP 9kԩFQtwƄ"FND87D#Juؖ?d)F M1M_,6@/NsФo8h2KÚgnCyy^up#4i@ *VkƢ32$+` ,4=P,4W|ϴbD^D Np%Z*nٙztm i|t[MTgF*wz(E{J೪j/f [>OA!1 }֮VmA_[n֫Sx@~n"d#|HM5:/+@494$ZL%N ωnSau3\U#qW;AoQW   >=r- s5 3g3:%,pAg' db^S\-ZEMq=$uƁV41č%5!+iM -Gn;Xq3 L5 +c| Cqކ<*J}{d4:G ,_;\LiwhN8~Zœ/؍np>_\sEotˤKlwPmҠmuCMJ|a _~TmLgHk޹2+C%<"lS5Z:͔hUHKE'fEI&f>+wq<lX9Wbਛ"8yLKh>C%|~6`"xs;Hev*6RH"*yqb5{LNma :N.#Vp$ \B^d?{Ig⤄A*SSMHgZv|!c~m:BTލI $IAs2x^D{JC*>F'2^>I։ ,L\So)bb>jÖ5Wz .7K]$$-1%|?2/)HiAQг|BhDZX&h=~I OY~IaW/ 0İ3&2²l}e}]<dQ Wt,ly J / :WyJÆHqHy< ns FF%d?*?F8Xt1{Ev$ 7z,,be2<&0GEr|0R c#Z3Gr}3D*ʓNrykvK@bpђA7S ᅫŻ4pD 4yr \ղnty#ߣ7XԤ"j:-Bl˕E5io-IōveZȥrP< V="/k e;O&8bi @Tz"phd"5j,$59l <Ƣ&ǙפRͧ/vw ^["B=Qf0WSH}iGX1Wo UZdsEyqO;Yg&%$(&,_W\ue#xh@t'_wƨh5Iٖ-X3~y~f`YH8KVTRR1G[h@-CQaS_"8QFb N Zdk4]:v8sL#)A)}c=2mKUF-tʀ@fZݫQz-dVw$Q54)Ě<"[yʚy/Jk s ]YәǨh;d iE8{t@ѤO9cR,؍{:ͿEb`TFG#~g/\Gp'7qh 4 ЇzrhBUhY}R4]X9M6ȥ^z?>CsPU,* 8KöXbO_NI0+>Ŵ AB<2:AȺv/ +j(bO$} _(Jz’x;8#'"7#Rs=l9"bS< c"5؋^Yz dF_=ENBb_kCt `DH0LݰbtGt%kw>a8Hr13@.Oi,h!t[ńˉ!H.`X]dCN=R?:⨳r!I,z|A=*6 +uW[Q!.[cZL*rF&TҰgPZGqk" ܏aRuZmH}jczBmHQ/ZZ,ɢ[_q:?g&n<ĺl+q008Cő Y d?|{1')7y";F΍>a_h,>p/ H~^sZչVsJ/|pl_=bqӝ?@>w=6ShHj;̏ܦTʐ(T( LxMƇjB(v[0o\ 36P&-%V#`q;BUE{Jz3sI]wD$iwc/F%K >qgPfpE%ٳ s}b+ ƒaf5nyee[М h-;Ei%+x+JNh4NEh [)Ŀ[d|7t~Oֆa&v';W! , ]:/dGۊAQFe22E ŀu̿=F!\CU"{+Lrt2_N[Iz*Fr D\7`Nn\]x7MQdV5phҝ*$P=C](ȆdjVU73rN-jn̖EMT;?$z祱Uvnxiun>GA)7PC9e1'R7d{d6`餅AMn.gH+ G=ԅ7ίw-A5dXRFVb~b_Ap.$ DVtU[?lq) Ҍ&2瘳gIag:<#,00Ơׂ{|{Kl"Oy|{yrfK0{wγ+Z%2u`^ .6@U;}mdNv Ba z3:K3XըYW& Zp9._=Z8 |cZ)g@>_V'%&O]wq3%r0­M,p*E8/h;$[wZmیcUeJDZqTg}F/m(r˴KNHPeɚۉ}Kpqo @![G@D3rugh`(+Ȉ٨+ΥQ xB*4Ć٣EN&Jgg[ÅD^WiT_MWaM۱Nԟ }@ѥޛn+3Xt+W朻x jQr Ky-e$^J=Z* "pgb}1!M/:&撐X):Uql'0&ۘ8qa@GNrcNH> ?vCM`{ꖐr]bTL_D98)( Z9ui|'- ;ʽK4Ο'c5sZ s#:aToqr$,wy+IT.,J\@ ~K3!6I60Fhn=MGtH0B yBfRqlg'5b4P?A*ӹyw_T/O +ja+г^˂}BX>& i%Ef\W՘P /ƺdo~O{+@r[3%HDx;5 Ƌѓ; VVDznPyҲGr@H681ܝS5uƐ(VٻlpV/璾Qa#O+oD}CBH˧iL}Ѕݓ /YokFpٍ{]RzX *P~Kt - ˪i\QGPFq3 Y-E3i p9`^Z!iSS|a 7TYqTjE'ivKzI͑snDZՏ ]_N[9(չdh5#)Rm. xC'bGXԕ]й#vJȮ)N- Iz4cD>i~${qC./( cj[q9>:I<-Qڴx|BKrY?6鱊(ҩ|.5^ﳡsImUXHtc(lB[?o.t7nCT{+}en؊:C˒YYFWkn3$Zf2Z2płz>+~yyIfiq[Rؔ4ܱHP~ x9/&36f ZC"SS/{o2q~)TAe{l|J54 3HbsfEoꣅrV\zzFꦭS'ov  εP*/z <?UyQ*C,V18nQ!z `A5by< <.|lmO/V=9q PHA@Sv1.(T0|)EF;b';t'r{5,]ŎBƁз7]qJB髴wǟ[ j|*/6xPCIv/m_3? EAߴ*4a- -$l1IZ1JJ1OpFs;@7op wL +;윘=49^/" &cUW_ :r_DU꼼h` mQ*)w#A* C#n='S 1DŹٽ|/@K ~MۡF!LBZ0.%{:O.]xq JJF ~ {%a:>r=ƽ 8"Xh,;3ҖU6-&WNztWyx<9l#oHO'@pOM;5p L{vH@={Qo[^VLFsՙ4qMfѭe2<~ ]ʆ!{ړ0 2I8Bh mtu5!Ř yϛjQÿ s'׿0a_~Tq4qb7N[Iv %`ab bOGTk-|/W ˺ #|N'yX# 樇_ 2ڀTNLT7+Y(x@/aBI̠_}"h LjghAJ4%pݥKz6hsE:9 ̢N.>2xA2 `l/$>$LWС-<kA+ַڧjͩYZ"6 "T)׋qvbIj%Ö|!3{ʦ*%w|X@Y C{x+@~SBGxaz,룲2'rȮԃrQ*Luʎ7i6##0^0Ocs,"S5K+w$^A5v`]ə)T~{Tf#L_*7 -pyg)jʺW}Ķ{{I̜jT*q I8½ȩ/Y8 t#J @O>&2oӼby*][|5DA5! ~g=k⴪u%>ӲLctP*[6v`>M~`/qfVfq t\XAĞdUIg%32z<\ s`Sv;F.fH~t7k_[oq­z?OWx`d"̋%h.Ҋtp9O wKt!&-Sɏ9@?pMK"Q6,Az!6Q|qzXWj1BP5Bpa#OxjGLj:RǴ Yɔ3+u>IC|"m,: )&94Qw[$V۟E#@Ok=Hl! Ud[rˬ*J(_QJZ%/ |) ?%; .[b mPR|7[4 ˡ:hڂf8jJcb[Dv`8?$Ԧv_=zXP6?N>7+#(Wrxg̑#k̋.@jLJq &U!L] Y6zW8ׂ޲te  6EQO~kA0X0-Q!JԻLe+ I_T{?߽Q endstream endobj 130 0 obj << /Length1 1686 /Length2 9562 /Length3 0 /Length 10654 /Filter /FlateDecode >> stream xڍT-SBqw-.8$CkK@Bqw-E ytfkVOa㒵ڀ878@^db]@1 A00"/yhS?iB!5OOXOD+G(L`hrԠ&<vp?_-OLLp+4 NJ.=-p877 @e s2nL&#Om  .`[1bT5n ȟ:p:7 #f C`@[IXC~;Zx@㭽.6tn PX?x0܃{DiOYb'uuAS@:C=bg{;O7ˣ  [G}@|͏ACLk/o6 0fa`?3#bmsrrP? _ &* wk_] lӰ_n;Q ?+k?B;Mې4vYO5[_W#П; {/ ~YPtp[?! ql_GEAK*Blv7_H` Yb> _Hv ?4 @!P(6D<#Q~lAbۿ#zL-| <`/п.]|?اۣvxLx#kЏЏ"=z`xo saj,}XU,7)Wl\ 7l59!kKn-E E;ÖTݶ_6q7}4\2w-jL:EDW޽>}K#;5X\qσ˦ mrgȟhM_\N=Щ%s` '\T{tR0R _L0e-Ydΐ~pMsc^X03R ƭѧ ,iN?h vnYIGI =B4̸Q;dlWWpiZ>m:_ѧZT>Ubw!>9͆wzعRX 356Hն+`qPŒx^PR3d4` X9bˮkƼ;".7(*!xp݄1IߤMeՋM8#4O xWرI ؋} }9K$L4=U@krW j69bL_TZ^\l>[ޗWfhmY4=wB$ni'|?x[%dpg{/J>W}a)fܠ_v"!PW<v"|3X:w)\w [&I%=MDZA Ŧsv޻ g8Zig8 ԝoS{h <؎Vu~*<%j8DKgepҮf8Ќz:WKCH(n\-U%Mר /(!E½ yÙr"N?)у"_gR[Gߖ1a?Ēy@ 9dMnDʛtdqI5x/;B<+@@#b!p*?Em!B-Hpv9ճIءw@ \.&:zXŐk/E/h ֌鐰nI8 y$B>tFqȁp*}3bS&TT ɐ`sBC&nv cL lK^RU43gh$ O+/lݍ#6TɪjYiϽ҇wE]*dkKddvsdݬ׹$[ dP ,[9c`~g׃',2bU:UG,`ޗ*z4hMĹ6؎rs/]KaGvGMȑdn9i툊p[knĵ~* Eg}bZuS%~//.2S)t;Vۦĭ9OnY,/&ZګD ZfV Q0sQ$ ,_7csZnt,H= Hѝ|\ehXS "Sz>Oފsu߇9T<6ZG,/՗v>د vSxU.eQF(?N΢ ob8 )NӘڵЇb!ejd?-@ - ӫS#rLa1<(g: WU`*U%M,%c.Et٘aZ >yO wXL?a||Ko^7,3!5 зh1T!K؂~CHY -kYhSj#ӧ`ZpXaѭ kx4*HVF&,. &9rbX<4zYa#dG4!SgxC!FeɆx=M1&H1ڬ1Ӿ06Eۭpxn+o:Sɛ>ZTDe?%O- (mJr"薐aNPͧ@uFY) UX~B^E~81[%MW_5/!( ݳeC>u)BRyj-1^,Y4C:LʥH ֫z6FS{64K|^;{[;-I?/\@QyGqԜ3Tt)Nj4j+Զ#6t6Ӹ$j(<.N?U{K-=aaSS._DGCn@|#Qp7Y2eMXǎ_'z0Vlt 3dDx. q?yH*G܈3o\ܶJF3L?eVTD`O;{E-9ZD=#JMi@}8Gojac^XY7vX05n!!: Yf~ݒXi+@CLRx^eh`:=۴ (m'15@ߘpfX-Ҩ -]ˏd#J>ܗO E#|m`u.my.R-wbdBߌ,|FGXQ}z_v-EgUR^EwTdu'!=5DDיO? K`vIyi7SPbrH fі,pq{y2_b &S`΢nՔ/gP c֡MhB=~A$-'剒a?.Zd9Ie¹iHL>QU{Ƈ &.P.7f!A@OP٭ԎrVMN'ijOw+'Ẅ,| 1XJ!e<cʳW#e-k׷^.k& |2;qC UrAPTOD0P9ray$uu⺧-~ؼRRG>0vْy` kNYd.D5*#}Ok%F/:<fB$ISROY# ,eK@)y5M; 9fVW}̀e5vOz{>ЎV\̫CW?kzWCWktga"LED>1%"D?7} ,r~1#~1Wi3ZY*/VzLPp'뒝w|*^z0쳊ixThjSϧRHV*~C9<ض6GV@Z2/j;f-G clBr!2: tUj$s}gLHRlxOJ7GkNZ3'!3M?bo5ʨOS%~# [[5ka$#_-$2sB^\;xQg|!EH59C`):[A5ʡE;'ل2WGѻ9hX9a:Uu!VnQV~q,9Q>$Y)$KRĴF\TUh V:EP/.´ pߊ{ZE`yq,`RxeG^M@_~ËA?Mfu.?X h]Sf8^-'*{)ck"pvAssWk`h^"D097Sqj/8uw(حNj¹~@'ku#Ig*I'xνޙ+:Yy[{TW~!5a!"*Mr(reoNNuDfKF4ƓKw]1ie#B⧙nl`?Uf}ݷY~}wq:E>B4u;x9pS%u"Ec1 *UEkތ}cLyQ(w^ 3ǘ杹6FkEZ%n $=yS]W mS n{03#]|m=͑\F*dRQdWygM{\ӵrBd]A]y Sw2΍B8<c":uQPܪ5Q=$qNiSzAE0\%B`~7);Kq.+bU3lS֭s#"Uq}雭,MaBfu4 ӒmS\ jS7ߊȢb~C rՓ9O|U Kܝ@p[iuC0EèIqЈLؘrkm_e O5{=E;M~+go^o582Fq5N8z#xGrYZH+vjmT _R\ ~~!elD_EHAҀg=vi( z<:Sae^y`ϙj99Z Db>&l!wiJ`)ѓRP$w7Mu'mשλřS/HZuK( (}elA]&\ x*qO^qhendI ?K&g.}~#.An_V mRڛ?C0\[nȋd/c |α5V+xEbx̾NLg;CʘNt-->ߙ>,]3 pjW,hЪk<'#HXҦUk? T'jy:/2&j"?HUXO 9 ҥh5A!NGO*wq-?>)VmO:2tVs6`7oAOҵ(|a>49'rϠiyDDChi 2}p8Z'OwTAVH"xy \ G e#jwR H`Րi[{;)W#Lې-Hv +MFӏԍ&9\t1m^Cٽ~y]ԁ"ӝoo:$p #03& YTXR3CJ53n>x,̺{jCL *kC<Q]b&O8@熟VgF?-a~#?:|spw#k{KD#%qȩ MG_4Jtݰ5SjJq }/ N|g7JF/Ę PLM iMieCF.c3f!]YTm|/|CTzHVo'H|4602lTg|%D9J8E ,+ç'A^ -JTa5T \>PutAVE(DDM5.wޡظ eKN8XB>iJ8̗<_5GM3;ધ%SkL3K?6$!CA˽+ 63qR^x>&p4y6[^ϊEEsܰž2N;Uf*[P[vCx(~%wG?Z\ެĔMj1WUA֌˘*Lީy O#5ԾeŨ6 |#%_Њ|<5qYAul6{K fB'XLBŠh혣P)oX7pOcՏq؈ɜ,՛ITA 64NB߄qѤm@y%c'L]R*y GY8}[GlSQ.9i3/-F>]vO. %ʡIEoJ2Vז3uR65_:ڧ77q}q Tyh~ZrtfQaЁƦ[F=i{e>JVǞ`C+`XϽ,ݖr+`Ԧ8?N9A tnEyˍ_-Gl]ZCQQskP1]O8iwǗ;Tغ\,U+k 7}8PNm#Phd؏OD9_!Hϭ:wo =ޙqQ6ub\;ʍR 5ҩYUٝv.}q$.r|CEX=O*E'*=$Z)(TTd!/ NE\.o,KXĽ 8S-QH$66;CDmnU_lB6O{#M6DL{;-m ;EO/#=O k+?cR}]-ժf.:LZNtXU}mc\!Hl`cPCȡs0AD߅SrHj(UHZldPRbo;> l{;NGI/«mpU0A|^0xO*'F}?Δw}xNN C5}b-fz;W=ȑɷ5o?g2[7V<;&^6lP%/m,u6'Y۳(+j-X.EB3joexAJl{4};Zo6 zRKU>}/ ІCu_!@RIrsHTCT*! #_B endstream endobj 132 0 obj << /Length1 1467 /Length2 7408 /Length3 0 /Length 8395 /Filter /FlateDecode >> stream xڍP- !8A ! 2[wI Hp <8%Dp[x$9sWWS5ս^RbZd7VN6A&' NˌN rqC! Hn6i#O (;8/998\!B]@@ \餠N.``dp H8\@@f r|\ЂZAnJ l$tte؈2}2y7+I)0>IIE C Pbw?{u #߹Tָ1/ W YwnvYwG@T=ПUY׫| * Y,m]א9! u+׭`dY?=οXB~MK($.^^/(Z~k=XC]K/ov@N;n ` 9c!/nCGo-]\'}]@^ K9P]]XU'θ4ݎ^#K J*cuNȚ˅DP ùWm~wfɚ;m &J$Xſ;#HWΏ^'U_y4bnGKK%)x8BYbjd7VrT&c/iJdftx׾\ ׳>+\]$$x/|%)ia*W5ُF_Pb0 WF޿Xyr䏌z#.ՀE/@Ϋ[Q e|cxj@q4l9ѹ>&K::a^y?BIwMLK/XRQgLN/f?HⅰCdU6o't_?٠ٞ6YQio_; c&VݳKF]^Eh\қ= vi;վH9"'?wlK#{ ;觕(:&ݏzq',QWنI_2Xݐ)h 3d #Ҋ{uo_<~%|(H6QL߫ZLn&cckpW!G%/LYM{UV& 1=AO&ݴ{Vaӿv@;Aѓ/6_):_@]'b[Ĉ5BXu8M6*7Fnr8[cUtS^x J%Nɘ5⑄4O<f  A_փe;L"j&I_NƎzRMԘTzHǝe.M[M&FK.?s`qndaZ϶&*͔j%PHB9&[}QDE :~"g%Pď+>>GT( $Xy!Id\o亂OÑO}r3!v2V>DŚ4z.e5wܓ'U8զ7m>HYZjМi6<+'qq\z-̳T@gu t+Ѝ̸ 3 7oE%7k\۬U>;5 mN^ TS}pNDeA)soZmN*[H^dU3aL\&wWA,qe 5=BO/5y+%@Q.w{?0 p(HGhgV`/}9]֞ =J߶Ba-| gu$c-Τ ?[=G7oh1c$N4m+ȸX6"?],HǬfV20/wO{9vոP>ۈ`&yס&NJ+2@oX7jzi+ C-TfbvKBS5I-jE9 Xsqg@6B =)qi<% dE^ފd`9 )ۥp6Byu1h6iEC@/"m!C["w(-dϺ"Ňa77WqYlG;o8ʈWxE&-=׍4S\Y{t<#3%i~-87ۿDRcn1-P *UVx=1jGSOb=WdhZVO'(W ^U1NV8pRJ83 c9zQCӜ G o{#  |˙`~xk S=X l͙JZw$rU?3WHZ@ e (ƺ 1 ?$61e#RQ۝Ca:K ”%W^M;RY-*[]o3V eM(*f!%kK(p;Vɶ q$Jܔ.-E.#}%v;Zs 'tGR3+?:nl־*aP#?VŦ糕VRq;NDNՁnYU{?fx}^i%bA%Z3)bCךF+|Ӆdfo!Bkbz%fiӫϱ?KOc?W(g ޺Zv 喇{>0fe䉺g , n{ÿ"֚>7ctBY3/z;Ǎq7R\K)G)$|Õߡ ,K~@;~~KBY'R]/`('7Nųϑ[9KC6(|9Эfių9+^5tjگWF9^x宗,vxn-V+^O 75>w3 ,,C.wCghԘz2]qe=qre9*)І(:]ti.|i&FK oBteP]K(#Țk*vْGel͖x^PٹMT%eOp}GC8rM^ԓt*ǧ ITaAh U:txd#I;N|eb-f=0-=|6LrϚAb[U: 0V֔jfdŪ=IIӔ*JVhs}/M-w@kʼir'9F#U(J * p˫ \4w9>;7bfFFA$۴<T~O1uޮJ#a漢P%Df5f t$FHitն[(ON08)\NMΪފHlX}\)ޔ>Zȗ~˦J9y+eyQ_OTˎ/2?är2bA P(&j|D/LT*@K&s-D3ê!=ϠmiBxd;BrB,}/&ѶKnDCQ0g/\Pwupenr_5f`Gb읇+5! xqO'6߱; 47HlmWceUSz9fS 6BA0xqCzHt+TCtj^= OXi9PFnhC t=u#"ڞ) l:Htdƣ9 DM xGOq,8PXwsAeS1P څ~; {Cw_$G.=Yw]Sf^|i=ec 626mc}}j4#t^m}q f e 7soPd~T(E=(Tu/G5uqZK_F8~i^dL׌ژٹVn)i%h`\d|46 喬 kTh6iǢ>S;>)|k5!YBr)zJMQ6H<(t` %B8MNBW q%mmfzKJBqldq^k-{G]$TbFqe2 DoЬ6LV/rxHԞSw3x:F$*=p+#@FԥWT=rKܼ%U!ƸJQ? Nü./!>y[EjF ?df14 %|[P!IybȱŜ/l z팤0+zu`ЎyuSZlrxqzO="Tw'ŝjP7ѧv uOyqMGKeWcyĊQh`M6iJ&t) ~9FR2 ލe r?>a0n2w(!:en_|, 'H&"ѠXkI^]Ľ&YA=9hBt?)8$ivm!ߩh+Zg3Ξn|kghՀP`WԜ(c˝JUxK$8a7HC/X샄c{=kF:$tQ\턗_xU0րS;#ϱbfL|B2-" `\D@X^oVD;^ ^{ŝ(%ۓœ>.mEVrɨ$KL!yTώܜCۺO0WvS,S!loihLܐB;~oulZm$ W4 "HE$5[0<)PFKӗcҔNJ%D@ :P'e(j(Gofia6$(I+hQE9T 9ҽ s3(NRT8j2ri&H"F 45zD[ZbXu{z4-2ȗFcQStwš&TƤ.>Pv"{̌$3JG)m#a=%`^̔3QSj py 9LB!b.1Bq*k zRŮB zy*&[TWƓ 4TS%>=ĴAf,٢N즿Ŵvylt0˓ʦ^MM{fu60Pa#_⽝'$O_E\B`tZ+ `9Zi'a҇H`7r=yWΘ{k)˕}/gN]xP'ZWDLkչǜeIGTE:)2L+'|_JlbiFP/HsuzBb&dmZHL*@8eP$]0,F;]1&7qْxFVGWr QbyVC?YQTh 䡘;dwZG%LIdcA\1۾1)̘1WKLD{ބQ_xiYjlOxI}6;xBViZf,N)+ӋQx%+JKM]_ԅ:a;>uIi (0],5Orm.2icI,KyP]xffﳡ\Vli15FSIY|IXR@lp/4I!<Y:Ve,LЂ7̈́0oN5|Փ<ɒaj:%7a%1dj}iK*ku[ !&lw*m +R5 ߅jY:$GU})7Vz~+ƾ ~)m|&C3Z9kW1*m7OuZr",5)s%@ZnjLWlj nVς dBq_X- q)YjⓄ9.LIXO$1Dfvkq޶[ %K X[Ѫ\P#a=AJvM8NMCm䰗f}8HFVCxo_4$*T,GP9=]{A|}sm vJw,72\^UF9z_(`Vn:tOH!LTǾ(>+#4؅4AUB d[7{<\,S9c>C~jgꢄ;Jxb8 l ׊<DAOV,eV't =x#>9/qHUZdr]-̕n&݂(k uf3^}5HnVXFGx(Q:3C= Y 0fI4@xn?$[Y@Jו{CLX;KN!50~!*]clTd']KP"x.)dT(Ъ{.Y%f[{o|4f c>߮b=\_%ekέ'(B.k7*_b?6%5ۦqfoc y c6#LXEEInO};qB+PvYI0wt9YOPWG賽}-˭[}%U&WQGH2>HuD̡Nj=?gEZ uiQW^sWƘ( 邢hjqf103`V7%nk)_BBJ:*6,<pBg@WyWa+6V⠝6/%'Tw(pLu&b㫙.Ҭy)a>Bn/Jbq> stream xڍT6LH(0H %% 030 )-]4HHt"4ߨsoZ3~v;5@z-]Nik%DCrpD: %HGhAB0" `$ #Qfp@  Qj PaW, Cnb v V`@8n;tVP_!XHgQnn.+a+":Wb U.@]gum`V+ f APwtc?Z;_޿AaVVp'g0 @!M5.'Y2;Q`w0l28 :W+ uU!0&ìeNNҕW~rP u/cu=`>6PͯݜaP7_(@ !a\[ F wؠJAm W;DA|[o` B,!P?Q0揌< 0}2CqspTuJF 8y@>(Z`_YU"Eu? 5}Xpc!n Yxiݿ_(9:ֲR`'_z_ݐ(Q_SCȟuUXCݜWv@fw POie*p_ A_ jP+UJyv ؋5b$A57\08@#~$p@Q$Ep7?o_ /u7+fyH;|@(OLa7WVnjSՏȿ_bE0? m;~Qbn3hw$Ma ^EJ ["rdgyk۟W :o (F ?{{kقީuq&'=U_!|f]{ZPl3V?4d g=MɀcI2*f}^">MS|rJqd^9G|1pTL9:fU)ѩ>?`IeSP+f"VQb~ÒųՍ񆏜[D|%H1Eu1CwE)?iJi]v\s?4F0!sONbm3j7 X}c8I'ݟz|=ب GVfQf%&lO ܽz%mjf5 GW >K?Kz+Æт2nuCQBw&T("x;l+e_AANZb!ORY_'FϧIK\h0Ns$+:xj|-Z/>eTBf۔ R]gzO.\Wsuhxi^)W(w#k= ̻L P4&J4=2*oTbVIn H-`aEZ6t7CRZx:=7$SL7hf_t>7?C4?+ Uy&7b1'TAw2lDWj9HzuJ*}r0"!8xzhPG[8Xw5Ғ» X|elz/_z'kkg˭f:^r{vjӬ[ނHo[457SoPeOa7yW#>6ǐi;A: ,ew?B^og \*EE{|}{3[VM[-@Og"9$x;jKXȔ8b$'Žcq6$c05!p7TzTވ|[_#=v-/H)@ݗRe{k؏` l%KXꨕq֎&UvId^ORGr,߇0&E]!Ta:υ>\[(-we5 λ2?&_@?$$_-ULNNLǓ&0l҃6oHqJi  -k2 %h+n.evkHjZ)`mz1;>mGco`K-@ [+KLuO63]4.=Yk=5'mh,y38\}C)sj+ifʯWMup6܉r\q]pFn|o1} VVe@Gg+ YmAaͷi߈l3ܙVkXv~J`P|(m~2bLMAjg o@JAPj:qtZڝT~#ծ*1VōS^Z!$$ܽ|_RhGccSpwl"a3UP löpPg)$OX]riS8k~欵}8.-ʅ?={gmpH=@pgΑ!3ځ4z{4II9!@ˋܣd{IGOTEs` FzS:5Aw mYLc;X|[2|3^( SNkqpy{l6~͜#(tK+H`@ut{5\W%?XQBE;WOWf>46z7uxZ Ao}W~oZУH*>PwH8v|#cМ -&3%_:2Ώ,Ed^sP* t,%F>ۃqn%KamT ƿLrǥVkQ\v~:II-1Il$2eb\b3V_f"cN>jK.6A.gO&fʳJ/ѩ1EfS.3lm@2ۑl>F%|6#V:ľ~%T:5NPaVO^m n>vA`+ $m|Nx2RQW-L4K*~+I6A/DsG=X!|'cۮMY~x80C\*1Yb3:0_$FM'܊[eRpȺazH)#or )=!QZ&hܱuyMUk M9DCaJlk3`u{M+?%Yal_Yr9ldެ 2/~bW@)z 8F>oяKhN;nL(s-ZeQO*/Eo[A5~Ǯ 77%DyK6>PԷ\O+~;!/t/17l%"lSF Z,J ;o/PhniV'$S.k гQ?}D}CQgqEWWE҄@Sbh`A}]vCZ]j-'>-'$ɺc%z;y^'tęG.=8m (=ݯP#cYg>蓓%.o:#-du女fI]'hf)rtD;׽+׏Y3Nq*_z>5`M,bt[]5˙~t{BĂV;|!h?pq\F8UIMl-Wt=]:ks_9tM̲Sslͼ$>g&Ubz_+C}1:NU~/GD˾,:و,/ A#"-I.a\ *gUSPZOphe#k%VR=噆}Q\674bvvKByŪe:.aϤK\eq2'84€MIUUtXװ{`22>}B47'D|/} "bq 2zlnH{plptM ՘㦞I*y L*sY~QC@E 9/5B{u"[;!7~!O'BwTx׊.i`zqyR͡oāԃČqDɒ+<[ߺ#ͿTTZ7#))1mm:y"^o@YcH8T+xfͭ0άpl >p6/] F_zFVȐFg,Q1P5ť][rW^K,El]?%;+WDܥjlyӣӛYm#X6o:)Î_rbGBYGK:L*iʵuD-Z3 W%Xr|V^=pM,Rcl$ h@qg& %&,_7Xj IїtulFbSw›U:Jy10f^w7M#;N)y&\'p132jT"}.Q'UF7xn)SM%b+t(ĊZ3Ah˭1ǭڳդv?sMi uЅX=֏ A[sx |f9)ERo#Оt ZUM-5X>κ D%m,Fedz4Q/nYQ HDOӎn?# l:݅;t }V)l hBp,$>xYS YWCz-HHz4j0]'ϟ;-]Bd+bFiٸYb'#sI:f^ڏw)Lm}YIk$Yb>s+Hݕn6t˞q*/tYN7W+$w7!4M*AaW2_2*_@˾^8:5B0rđv K'~)W*,W K# "3啕ؤ%S9C/,+qmkv,]dpʑJ;d:(ntV3:)+k\aS_sEy@zwnN|m0QKp 犂9ka S }sYgϊT=[1rєsU 9Ơzw1+JD·au$@]^g mD8|*2&m3Aj{ў\a֜\IKֲZ#maJk;UϼT^d7RYZi!|e => WV yW\ol=}Sabzщ;i/8z $o;j WyPsN%Y~;*؜LlO(&رyEϯD|2ajc̛7DY%YT`#@nLc;W4²[%?V{mߩ/y3pn7z:xtg}ph&}`POyP >ˈ/yR'ʶz~FsP--5i}uSsG ǷW Vo3 >`E!JS WY} B?L)O '2M`պOiBT=1uEOG> _%J0r=?DfWe2 =\}A:Y/gQOFb_/unJ-Mdyk\\пstJ>"~F|jOHLQ7q׺anu؁ZDV ^ TU $Þg_px`Evn5g/b~5 EZ! m$;2^ؖ[O rЇ8~)qsf+hdQnCԀ'cB?U:İ[ ."AsB3߁ rTSw>Ȳ?lI7x yD.H[m2]9wfo ۻ[4nG&9O _P1t~`-J#6?ra endstream endobj 136 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍVT۲I HG~)JOBޫT)B PHQ MQK'"MJQ HE=w{kV|3g|^>oj!qA`8ID 46W )D$,ly#XAX?$pM,#ڴ`81 {P*UP@iD_ @R kb|Hw-(UTTX$a8x" X`H.)Dxp>J`p`` 'JH`C`v 1)0`caX@4x#1ij }#菃P)+;cP>0t0!U#)\N]9¼0xX s!:.訛0bu"}p~R~H_!^6UB!8?ЯXxcBc?k7$W >`+4rDA |D+e7e&naH7 ?w (pEq hF'E!DAȯϿWDnb.X@Hw440A^RZP4@\3) Wcn@O[WM_/ae!2Mp{Ni;c,oߨ/0;/Wj#Wc+>FԀ:ߗA!\M8[70!=($*#7 Gj_꒖`X,,D1q'D"~3K18b@l/ p`A)/#X,QVO<_F p~˛*y%J'M Tiϳfi=LEv&bRC͇AoWhx%-ՖB}CEzד_b0g "M[4[z.oH{T^U}dpQNJ$V0K)A8(lL!nVhȧ~\B\v|;,.5V 8>K Fe>8膏(\ F&_zM~~}Z m]/ZB7b2ұD 2#NN _KK' {0<ϭs1 {{2_e_w+| ߌ^U8 :#--pYږ2cU#ѸH8Wᢐpr,spp^-Q:Ly5p͖%'ՈNzRЪEq))飷Y[ȋhxu/%9߱{V޾gBO.֧VMyJ9uњiNH>~[ҥ y\iƈ< +PvQ)ݵVWrg6r+Q j-ZO mSuѦ= EaNB_kŌ5ಳp [. j-j2ٿry?g3畦1Y"s6|4~qjhiY!}SU,)+ׂڃkjӯGXf ="6O*{OVTbjL¸4LAیyy>HJʙs<;ߍDyfV5~`lsVUʫ)"Ž%M`kuu܏'t}ZGm6p5pQa5+ t4BmIw?57>pܘEa8㗺 vnYںM~:YW9OFU&5ZV(S7 ;~Ig,H!,B{=X@ 6_XPUmKog~|J2/:H{}{R \Ń(q^D:2wQ97K.VSU+(kMzVؙ<1  lP=!f!*7B6G qaQ<:Y] yO+QW9z\≀v%F]%f8& O:d 6M5=S'u E[!.òi6s>-p;bW.c<-rHrB*lsH:'n9ŗj>Űmܽp-$+!{ϷLsrvJ.j#ɽ]џ򹜑_.A[h*YH^ęう8vD# <+s-1{S%ޟt#PՔgWQO"Ǭ$hȘu=9U}Nc ;eMZ=d2[剦ܮ)j+(ȨfoG]nqJYތ$? )/(\c#/}H^VD_TnQϭgeW>h|gjƭILdfDHY3e Le-9SKs$ \UX ٫;>}O43uF})b t]aTnHpi/mC7)Ӟ `N;xubȃ]e^S׿2o={M5nC6ژyZ=Wo1WGF[1ϧ  c4M*be>ހFˢ\Fa#;A(T9e1^zmKeKrוu5#_ 0o=@qe,BvrPSʕe:Y(sMgeB \k>4su_f&Ukz9 ;Z\oipTlw^-]Y廦Z$-}l,q9+m̐x|Y(Q=˳sVzm2wAM2kMƈGm\M+ԫ/=Ż滺SRo-9 61^+ Fv0xz`t9 R]i^rf Vy\S G"-c&f:ƁG +2{R:N|6y:a5ɘUFC.Q.Hn`{{> -QMPTڪ7t0 >3Z4rƾF68JPSDxO_)Py7a)jN6v'"ldhz!ծ/l[:G&ԪlhFG>A*^M;ժ 7ZCHщk]1]z:҆4~z_w&n0!-(",adg#Llm' [qto_7/NNsUaj{[F>ʰ~,jn(WWX"&^ॠNadΓb\d\.4Itzy4p'-̉pus&k@) ^$}kK"/ NEBc}~ӗ^ӈ/|OOC>PîuԸ_CpT+F2 )Em9Qq(>Χ։'uHyg<'R q?K947-D.rZGf5f5#ǵzW ҂1Zbk-* ҮfnZURCyz.,vj Oj2+ӖZwWQ`g?Lf12Χ}Q5Ѵc%\&~tU-7cKKUA:_wզjuuxK 1V[/1"kMSɁO]1{CwJwa'%oM-kٜq+DQ}*EF_O{ǎ.F0 ^|R-hxv#Ua عyFbgCRn!!%VXpK}>n)-)``uGܟ{vaIc̐Kȑ.!cuQ%[2HytI) M *kO?mfRtV &:wFR2VGL6za˴48S]e'''MJnfzBesc.7)$]c@q+)/sBcE&B.>}jX@{KtV.v}${P7mTeK=>iOb0Ib21"1M;0bI<:7tg9%f.Ht[ lz+G3iv_Y = ݔq3EKe f]Z4}F6+5Gh7L VNr+*PZŸ4ҦC8u}}y4+3кx9.p9s>ǩ>۔2wN'(tw |cꂝI$eW5.0)<ۅ"mxҵ &6 N*Q i>+ù;8 X)|8j~I9)É>%w|TwﲿU ǖ! &jHЅ/`^wعbԇHxpWu@gw7U5շ\\"F +-8ku >;o3{|2~)h~?_G1dMj}gVVeiv0!<,/qNCLudSV6bb^d;fTrÐƌ䔀S=rS)A]Jat'@jY5v?YaY+S%cNҽ՞eW;Z?$,ZL<M3(2Ŕ[3ti5 [>3Jh2̝W\֫Q6ZRlA=G'[S. f"X+ʝ$@"_}$ gswVh7oUݶT`rZLBIi5b<1 BƳMCݴ%DT٬،4C|ޖsKuntd“مW#5,ݧ+o1D4pĔ:}i05j0ugMi8o50]n,gS z2޵?٬P?p XXϳ[&F\857Yw<)>gWBu4 gS,"8AV+BÊ);AŖ$|?ɽ+V%V~bCSE"^Ε/jQJ{ Թ>yXVUȭh;dtW?.$AKY?xɁŤVq^_~<7AV/=U"Jc3rB{7`B{p?CkGW7IsO gŋ {sM> `Sqf]sUE'ZxS o<`9jޏ1fޡPvySO\X4d{!"D]#MR6grh0A ɢvl( 8`Oe V}oJM}oDksKOQ2N1Wx]Rdg`\30@B@QMl/:oW1 endstream endobj 138 0 obj << /Length1 1357 /Length2 5943 /Length3 0 /Length 6878 /Filter /FlateDecode >> stream xڍTT]sI``[DR.iw޵];g}>y!REm 0!H&pEB۔@(6pP\JP $((/G8B pIȦwF@QSpr⼿.`hP` (n # *% rAx##`hU: $!0Z48\fƷb0meh%Y18Elbg⤣TYjTKr)bISɫхW[w8ռhAIo~K NG{{hD w=XfBn@{tj W^EʍV:ޡXSu"CSL@`^k*.U U&=_:Y GHr|NmGr-EKqM#ZV k Nl*.EYgj{M2d~E~aD >NAu-pAT &"b8.fSo/lx2yšq4AWHXb. TW}jb/6T8Shf>q.@|S݋z\‘լVqI+wʓ#GFPToG[Ls*6ҧd~Wi6{!t᭟.Mʂ5V$&ÛpiWƄ}y岄[,=y"cIp]!F.ڑzBPCV&7"7ke sM.@iX2:[HRg1"%<\S.5a„t`!P5[Qm5V'ټua*^eK[ǁ3j.;Ʌ(+,M1Tjz!نa齙5l`h:tqLC*⭱l1{'Ǒv16;[\Z8w.UkPJ9QjH4j僝SV߾cL/2H" t6&6VJ8ЩOo)&.2ta ? =Vj~>3J*ȩ2p7;ց\9rYrz:GOvU,'g# (T?{f{@Lgj%D y;j>.eHW88)+5 n& d&bŲ+~hJɀ+4"71 ^jg7 u5Y-cJ޼i}>= d5 ѫ@w= "ۍ2k}aa-/fj 6Fcc z4+"j/i|7֒B_pR+hG0dB[Ȑtm2 VbZjZRfwi%iǥ˘_zi5FGߵ iJI)9_*7Qw7!W~ٓ~BDyLM pd ͰvuyCk)zf#EZnF.Ne6]R9+]&(!_JIVv9u>T9qlKY˻XWd)K_3m=WsKރFW;u4̮SrV]'u,&8yFV{|yβ1?gL$HrM+8oƻ.Z:wI~- - ~ !Wvct5ǺV\=bB(c2xc=\JJ{!Q)J4{Ȱ:f,/ Z*.|f  huW*:Dpv>8?*ul"yV_ݞ& +>&mNc7:wL25&. W :TvͻaSSSw`}h/7p"J69cy ű939*ڈJu`xu,hrwwВ#pGmto{4;.R ihBfHPɁ-׻ls 2^jv)atgLǓHfܘ8@;RJZ^6rR`wX0IL2쾺=*_kת옕a1ݚ\`~t0\&8HikGG4Kz(c5IeSŎ(RUx P9nFW`. z4t$:3CՃ$?K1VD =u.n."iC  fS/qwQeTnx9RVv@l>jR#3~~d\eɥK6dËpu &]GUK[$|9 Q2FW[sd1Fb=)Mj stK5w{7j"n^x~c$ 8#5[ɺ ?hS3,>[[ b*v^ɇp3}03}?"ƾFZ[agY;".D͓-(Dז %56;  ]5!'lwY_ A!Y]y%2YA"<$n=YD3Qcf<䃶: ˄/mqT}~ϗaĎhtZ*2zN]^gCț1k'&>߬Vߨ~/-w\]/&0uX\-^>mޱQ"tm{i떥TϫQ\L܎L~rbP Wn`;N .Ny3?=^Y\- lQ(-3Tз,w7EJZ~ߖМkn;UL2h[[;>_άHگ#2 Ň5S=&'3uxe21jI`,9!H59;}rP`ŰWH*'G[5xc+i>ޛy>#bOpR\ ~K{jCܭ1q'H e zPv{*32SxXVu7q$#et#kxϧrxnsN}H;mz3zODwd1Ŭ&/ W3&' N.(NIT:bT[?xI<;uw²M{z 5W0?p[wLQ[ #WĿp@3I4slDp^`*Wy´w9e=IDlJt5kz= N)*R5 8}<i\'bDPo٣=XU$Q&`(FjSx<XcZ* P׈哇VwrB( 0O)mpXMRzJ.Qݪ1_ÄYtE Ŗz&c]z&?#ۄ0# btgmɇl6eǜ_Ƽُs6S(m ],GW&?0~gacok1k3W ^j)fV#c5]z1'?EQcs xmU'ׇ!7Tt.uݾJO`'gAyqzwRq_gGS`YLwv@*Y 7b5==&ge?tƵ& h]eVt@vWWgcpY"l0hٔ}f۰>L%!~* 5*n\J?{[r}}5%-QT6 {qiPQCR鋙NK඄U$kONv?Kfzb7?6cWД  PN.-)Hs3$aTEM7dGz+tEج'p#)<̐GC/rhp Y'vLJ"ˣ37wY"0ץnsIV^#`)J.`}|.2[a;WM{;BGP?XT5/*jPgI +?'_|3.v_Qh̾e^. Ni"7~&Uov-QBtMk8U[!BeWtrC:(鐘SsGomyJ5{3T:Q>]u>Ag>9NI쵷Qx_tח[ 0ݦh(t&x7!CHzR攕u]8@} 9Xu haҋy(,FQb;>q*.i]:}G:̢_pܭ$BߕzE|rc[gU̶=iTұe\  .|T#"fphh]Jɒ v{#+r&1-3"(i aN/J){g9enُnECjD~iժTP4?IO _^~%ј=&c0(DtaLM5^ x6G-i`x F&x "np5lgobjk郷 ] KJڨBOjuYj/'VjxC]#! aFǙr?6ы4n)?>)6Ө{99.Pu:ŨJ0gYx懍 *:siӹ9Acrΐ΢r3SJww?Ms:J;zeٵuz]njbxgX˿Vl7}*UfA $Eu*۞ [4hNOnL.\.VH6\6u1sа]y|= QT 8̊|ە9)g endstream endobj 140 0 obj << /Length1 1731 /Length2 11464 /Length3 0 /Length 12571 /Filter /FlateDecode >> stream xڍPX.[kKpwoFq- =\ݙz~Gs9i(4Y$, Y(ĕ] !`gbegDڃ耜]P?R Lb \^A>Avv'; ΂i; PB@.h4RPG/gK >? gPڀ^2ZP 0B ۸: yxx\X֢  @rvY(tY+ @Xjt^`  b rh+TA2`j /?!:-,@b ۃJ C _ $J/: g r2K)?i3ֽllXZQ#6ŋo5' 9@6lrCz)AWg7?88` W9 A;d~3`2x?>9̖%beӒRWe$%. ';r(j@X+"rK&k1K2 nn<MQ/|dh`{_e/_S]_ 9Vk\"E TZ5*ɵX0{0uX8GUv/<,X@-.N^xYCK `c@]_\/h&O`q9lA/~?o$`~8mGl6?K"N/lyl"/L/y!/y/y^/_rxܐ? 3!Kn?1s^zo y,fB!u!5$,;"4;X|;1S3֜%R{d)~4 &=>&hL':Qx$Q?@Jʢ%W'K&ɍC-֣g@Xn5)h<DTH,d(8g3W89 Lh~1\E>뜱w?W*8]߼}c@D36I#@8SZu޳E"9mu3iu[MБ|N-k3uRůn3uwZI_X٦. L?~Q&բgGx|[~͕S[IGyEۍ7剏YܥFtMWxjcJt tU)<#&ݎfd-)d:EKLZa sv&'l'jV"yd!ح;6;*l{\ q wvL1M_!#,]S<|p_C` dI$|p[fǐ\#}<8Kj*29R;Ic -/e22-Yҽme<]/QEK+JP1æӱ+-|r2چ!Auef^ f˷֖7iE,_I5TW~(/3E'Q‹@,MGAAdpoVK~.J AtU$Y[rS=_~'OLFU6WhBo탆ƞiyyL~snkhL6~^ wg5\cPctU,uKOʓ"bn}ۦ`(%-BP݈_t s=P7"%r [Y3) @_b(Q qq-YМ:i a)=f!DΕ]+(Jݨ0±cհwvZ]1bo27)V>-6n= 7X$Lڊr$;S=iakgBA;Cus]~f T,wj'T.9-BRF2MNE`CUc o(b&/@6;~t"-|1g(Z*^*6U`;Zt4^,4qQ1|brIK~{$hvR/$1xcUjeC4~v5jD /Y;ɉ&)"̯_DD(jEtƕ =mjKҀO)Z(4>TTjn!~?r6 Qm󖽲1LL3SKFw*>ؘ6,;~]-;~!At3]LUv8lμ5LP}۩k]`xfߴ]턧VE.U;;imZ$nII~k.#"Y+?OëAJV) +Ka riIK f($b]z 8~ݢMH`iQl R_4NuJƘ@:H<ׄ|p3tq8;a^(-2Ո.`zEP;vרpɊ?\-k*.O)Zhxn,Dg8f>̍:Mr)֊B((ff /O ^ i.3%B7H.⹖ŶȽjyAa-@SZWclW]:QQL|A~MZ^x.Mq2oSj;;)Խ?POZ0@5nJoMaS7Ȝg6[hJ1t[ g~uban9m>D&ѸoWBHLrcE$J o.3駏$9uw,ѐ%f,Yԉ1Me?s*wWc9ŽML; u g;w5v#v)U7J/Vh0EDܿ+l;҉'զg 8/nB { Ĉ}b1`cV58 u Zbg^u\jT ͘N{"`&e A[Vɋ}M *$ M9->FU>WzvQj*/cyQfj]gm4 qJQǡ&Dz~M8F>AtI-Rڽ+yZ&AՓC/>Fx (x}w`5}'Pscj' WY^7桞f搀FƳ5)ﰏҠ u9x0)5gǟ̠Ő"Jl|dc$є8n*D޲1檤>cVU(89qcOjM湿)f}܆FzI o'bOFo iSG\]@_y1˅À@µmJM(=2ؙ#-2S`HCZXn.y@rK S VR+FWK%N|s9N.e'%:>" Q3LOpgA`7:.l]WzH(&U94bUV3((O˩ Uzؕ/uRBm,#XM&tz1#og0|ߖp03Sgæ~٨;YE$mMQ:*[It;x/NJcu`#;ZyFo%՘) Dyh?C.#\\I>L:9b݋X:F<ֻh=0{ O({J%X=^N:ZXɟkҡ3lqSbttv g-fZ9Co{ (5=87XGfsW!Lsٞ){$Z"zAw(%'Ôڭ'2#jq `u<[6B=|? h;Z2ˎv`Q0u0'F> 1;#u%;gjI%9j~+RMS3LB8(t[ ၑy1Kԝ.gwbuT TS2D C8S۞Pa>Ju4m)=:sJ]+ʹ)CFl_XgFktRJ*m S?uvVP=_FL a {?};VJ NcB5(~;J?]?_Mt g)ہnp4A y8=`xx^^]"9/=/R3~1~cfH)qmo|a8, hN''DˏIg؂P›cI11HDf $;^7 Gvn.O+2d8B3 Zk=n̯> kސQ:Ok(rGL쌇{KtRdRNZTN qa/c8㲩>(8ސ㴃z<8_نx\[d$=K1Fa#]Sg*W)rW T*C}U*x{.BiGPI0(U /}x3iշ,58 榭lTV0u *,v]j1A 3K0Nuk!Wx-QI&8e shDsi{U/Xm ;nq˥N3ek5ͷZ_tw#;18ؠ6v8W`!p ?";<ؒ}. k?s MpZo\0~݉ Գtbzq&SWlbMq蹨<t" 7.ThsJ2 9+}%IN{'KV鱜+ (sT O0uؗk߃jvUѝ)¥c\TC3 N,*V ݮ'>6G߽:8`ۧPFar7=%g (IWddWaĜAqu8-1Km$`(IΑ2S)!$PI̬9mPcɹ#^+8dtZB^NcRb^LZf AU_qԵbQꙷ#s~Pel9 j1taj 'b?|XT̪v5T.p)3$(x+`ZF\Tdx"Ę&x= "_EmBD-iI I+숃T[k[$:psI5K"XiJ̾<;(jj4zD 46%8T-6adyQe bOImQGR)LE+nO2!3qy/_E̊.PK{j#vtJDrʢ߲+ eg^T˷ض17=@91'4f׿]̈·>d_7A8vl%F{jȝ6ުj BG-Ed֧g ^' l_~d\j#1 bvD&OwgQ櫬9.NV mh21k.ȰwfձD a6DztI }盅]H " qm7ësS J &O ;ҁ1a:e=7y+L"͹X!?5 ,#.&Ivn{B#<{;x gY _ O"}xq9(JCO2yXxzG `%rn #a*Ig;X"Z@ gDwdvwQ<"2Nj#DElz`Oe'* u;b <3t$u;È1О*d&Uo.^z>(Bt ߣ=1ٕӏ ʾEZT_;^ YgKI# NhzYQ99~kE4~[[0E8N3}!A:<~t2}{9aQOv;3yM<:p%A{I` eX|)/}/9<ڹ qF H6ae|:^r4x4a#p[Po{KGVґwgWgJi5WdRcW BaPP36~U+壸1}[؋(G. ]U>8E5nwx+퓿O5D3Vk@z[~Q 1 NY:Λ%O͙Dn PҺ0T?(} +l}0O6", I»X* UſDזhx97$`Ց\H5HPq1gKY> ;'!k-W#^6p.'ɘ4q"..(yoP%=Kz11'fq1:^VST J\5=%,2 L|?y$ƨ;~-jLykzQyjw|:I߱˅#XD<.|E3جd>72j*~!엏9y耵Yz}Qp3tb%\tC{&^b%;pbeOk7"Ґ9IudFwOOpGhvmO q4H%_iX)l Ӵe̦udڴ| ]3wi񞈾OL (|kѓJDO:i| I7jr F7pKyIV=uZ!N:1jsrJ&֞ӔxA%Zh^M?i4NȕW٬-'* H2Z_!@fm-i jeb!5<[FkXvirz{gDUmBeFN9ĝc+[@oyU'(nƃ@d./fGtVj,DDžM֭ED`x{}xμU<G/0ߣΡweB &:o$J(VkaW<=r(E:KDT"EAD$l_}0YdI~ӐY_g/ު/aKFK `d7Ej;o þ|jFO 0{WTD&7~˷F#X݂IrZ't-a\ 8vbaF_tؼr+W]QҹR:pJU,O%!PLySy+(il=?ߚ k9QO;5`Oiɟ"C~Dbߢl} h7&BZOư1(^} ^D ʌYkaa $[͠nQ@NfTFtahp F_~d"M #;udRq"y%_7 MՇ aUg,AaH :O֪&pd [V:*ԂyUft..Cb5\< 7801|J.k _#gS.ųнBu >jzGʯ6VטD 4«̃ LXޓ`D6cH|֔Z(#.Uam i%5e7xW~_Șn#Lߝɝ*No 9~/j~?cx4=j8~:tLXs);؁)p"wC((#RWo\a[٠ZS=XnXO"鏅@[ƚʙEe);ƾ\8gPaUfhrbDM_j~<~+_K$C7^&Ǘ\KQ UoKV;r8?J:b3N-";/Rn&gF:g+~wDj/R2iArtgHWEϱ._)YЈS8ټzM.,wnd^Rl$LmOCĈ@8 ;A^9edM9{In@gZL'%#CA嶲WΊmŤoǂJ:2?TZdvUG˨[j{ys)!wUO`},bS0c0YY&Ť&+1,`Mj=Qo{U/sT CaX-G{VW%:5v]k yHs\Kze|՚Ωgbp~ ~~X\YM}JI䩠v]cE[8p|# فçe _tppOсT>$G,j%"AD  L=iJ(wGJ }Eǎm7Ex/~vhi\i뇯?}Cx|6]D?SŨ.pFRqw}GFdaWAWeTV= _ Z#~ik#M++ x,A6,M1P}\[IE83 ę[lY 2i[&z|2UcWN!굕1o.L!#I _Tu+nV 1l<~U⊮ɻ0z[:00740t &ZN)LONږ{MoMN^}}x?N am%Ps[ZñfkXwϥ+~Lb6 7׳J {$l@)+@\|r2Bص,՗,N+!JFi*Z\aCє_e-wIODH#=9_(>?xcY`AՌ\ &4Ŕt@oBf$U +ke8hj4 UW{`A ;ʼnm/+++٧~}-Hgbx,s*T&o:ķ`u޼v{펐vφÊ9בF9Zo~_I, L2:&(qk ʹûDZɌK2hOQ,TdW˭f!K,ݿrAm5M.爯ƴ]6}J{=ׇk n_/Ɣ$/BGTlt.WGk Vӣy!% ٗiFdJ/ʂg6]ȭZfƄ u&841{n*K9=ij)\j奍Ct3om>aB [U|=m22;%Zxьi t #MMJAu+ g,Fh=vFEh : ʶqQ3<GƁObpjp׺eßzk]oW0lSg4<>Zr@"wKLxH  o .^R[@ 뇏tN =^,{tL-Q M{-qs.jd+ B1x^$'}Dkf;cU#j_ 6Ƥژ>F׽?4Z endstream endobj 142 0 obj << /Length1 2201 /Length2 13396 /Length3 0 /Length 14729 /Filter /FlateDecode >> stream xڍveTk.PkqwwS@/.ŵ/VN;YY+yf枹PSj0Ý`G7fv6&;Z cAڂpAtfn syyll$\ 3? '&oÿCj  +&;dXO~۝!SR{+[m;b'"nU7R&v: K_".*?".`!$CeT ys8V2NS[+4v_awCWw!pW}OKCp@pHA>@k-] -p분@/B0Ԯ)Aؓyw3;9Jz_/5WRuFV :+ODkٲYm`VڿCJ+wpEz ȏ8ZEC"˵Lw|lĕlXqKG,ohNVKaO 'j1ZX̼F>h2L@d%.&?fƈ ԗ(qX,_(c:3UIS "*$AKا;? g=c GQǢqTzVbR1-zXfY 4X,@CT==Y\lϧdcWeػ>֯9O(]>Y\7]!r ׵?B jޫI(q`"䤗©d:&V!ub ط+`5mxa=)Kzt}3w-sk9h-7C((s-#uoLJE|le#t\AG)a8PB]}]X\6|_޿3)Yk2z JxOhLlPO mB9jFVʗK.>nX7.BІV_mb0\ g-׾9>&[\(?I9iPr+.kЋk2"p['=-uCq_ߛ?(Jayܷckk*a*)i}Y;ͭ4o\PīV  ~ Ev_Eo _`z{/u7n?le~,"̡b.^Gֻ9bc ǁ) L_OS֊d!4qZ)ZtAWjM.Tf#/uA(] +WYM ۃ4Cˮ x11-Fk.\/>ړF6W~ do吕,nI1 ;irֱL$GZ}gD:vljqɴC JQ5,a Q9 6sDu,5o] JV*M .L$MX|"9Q98n-D\2]%^?|! : b#]|{k1-JSlT#'n뚧. p)3`xdLc wjZ:j}UU4FVj-&'bHO6qE\ ӻJ8lj8 &# J*O,ha.^ubn  fZ^<Ռ(C2L8~ztA5T{Io^܌+ҜY-8ްv f'\ndٳ#M9!om=kf?OgG>DPcs!b[erlwй=_LSGԖ^~Ld2}۝x^{Z\,-~TO" \ _׹R1POsPu~?`L5jbY$ 2{1161t5.!k8$W"< KjLJu\Fd.5,pVjUW3jJn"I(:I0lֻ{QBR&ՙ\Q)<V(b=%KʂTVB[Wo,2!fx赘7`ozX?a)3˃4__ >4a y6.w#FE,La1Q Ox$;]j[,z8锜T>"X?\e=(ќ ߈~`2;_F2zqFj=P°@iTxԧ*&6aPlF"Ł@\h<+hͣړ|4k|67"ǷqXC!AR Y\ML5|.'6 9Y.^Y%9&n͚玗zo2%7fUd ej[9 Q._'k_(6akj}"% ;PΔnS" hmIP L`>88| JfvrDU_E{I&Jo <^fvj.JJC)ouʩo'ouI\t1d2 *°WZ T Ϲ0lnA_{ZTL:Ybg8C^w SݧkiW>v\\:!W0d*q M[Cf̟I_XO΍.]Xk$ "&dno-3C,fn)vl}:G<Ҁ|y R39$Dq.`RM"N.XF jmF)@N$`'ju|=gd]˵| kh!#QۊZ_ .ߩ%&bq_Bhx#kKbKMM}ٌ$!/@E(ssSJ,蹩*Clv0Sd&@`/) W%E;LN8W5n jg=3՛xWf;@@D;cbt>ؽ,iݮYc|Ez#, f {CΎo3Q ZHc<˖xU R 772ʐHi/+5K(|Q0j\捾0  Lb(Sh75Sw+?ʹnWIxRǵO~F wf'ry, 8L RCw}Vj8aParo9ґS }0qhNn[!՜.(sn{{#xۋ*Nr%GxA=Ԁt+Ǿ!v j+Q)Uzr:ӈ!K&|c2P8oAc7)kLu3;`3תp7擹`]9 DS(Ji+n7#ydGYB}Õa.ԺExk8]kctbWM^8Q#>KSL!!jEꜵS*K=LBĔ!%~7dHLaڛ רw~RV Yp?F얨e-N0I @|3ꪙ!sKܹb9D,Q]/c0[Mx,uX}30׹̊+ F= O f-P rJϧUN-R p@U{ڝP[Hc-xNpE/G$*?K?mi|r#n2i|~vFݶd:Q\iK>ڧI2$=i8LQ63ŷߢ7 &A$F":OrneG?=T\8fE*fOF~Jv1s.򾎦DS=~_꫘gIq?7yf4ץ-K:)rI1ް&U¾>_2TxF4T6нg)K$ .o rmSL5%$C-񋀏|_S%ȡ< eaOX Fghsa0;ϫj48W7dD~RŬ^GlWS(8MT1 {L\:03F_˿o?͏'$ym؄*ULěۜQ79E /IIy@vPsTBb m4}1QU*mc OGB @Ħ1twD)7S2hm0zbl{4[iG8D#jjY 0pW.#"<|.8gyf'k~Hme C%Ta8iï;`C&:%4߶-ZrePÐ:^fq^1* n&0iw(R8 4%ʈT̸Wg?%T|]b/I:g[M/n_LTT`=ɋV9_U:Sq^ S,PniA8=G0ɸ`EV< ὧ ) aBG?r:Ϣi͇<[ R;Ffߜs&~zzfkdy_} ,)39($1S5 tH &RCAKb3ζ5fh6[y j~IÑO៹mMe f,uk ]蘉lZP ?>r[[ 5+varI v_4U6Сv}Ƌdߋa|&\e3 ΨɕNj͋1Iq~U}-ywԷXyNd|]%ƯZ&`[DPP:;Mgi1<0 P: [yM$1X: KG_n%,W/(2PVZ G?|*_Yk[*aL D?o{hdT6|Xp++u#^o#:Pu=-`ȷr>~wWIcSȯ%+CXʉH]ȱh v#ߎ,U [zUS25hC?R#`ꑄ-)s߈fzܧr.Z ?fWM&KUA1{~J !"@I0qO-" GɁAyVE+VA}ǼEו]!UЎj_Z3pʭrwHO"Է7W%.*-l; 3u5n_FemQ{v`l=]E~k6tNzh!sӻq1>&~ulCΟeNesk&0&̡ul+0p=Z(*4F@8-`>E`sgUܔU1cng3iJA@F_;a9CqDHaWw/Ts`[kM]^{KaŰF{̑eiVm<|c kUPVDu ѐ -q.%nqW|rI81<5[©"[Sڃ'|y( d=_N>yO=ϟ` ޺)`nͮLd WrtnB\9ܺڲuʚm]QUS4}P18λf81mn Š,¼Ngnf2u#ib?SyrQWwi51_N=8b*ܶkɺs2;­(6ϭRӄeI8CZ=MF<XkG;71o-6%}CZ~=~zSsXfά)1J<S o.-Hh_;yz ={{ⷰٮ(C7vϺp[~MS.YlVg}pKETe* ٠`盙cz6aZ)ȟթ$Zq5^!vʽ 흘Ћ OQPsrYwGE?ZU}m 䐶Kfgk<U$6nk@]8:A/s8)O@.h[G`}Wfy|ë*~ZmB `MփQ(CQk8I]&-aOb7 On*b[ޡifRjb~&Ex$KT9yxQq}-֜EW32N0S0 5!zSļ1>WJx}Vi+BYC`KD2W!\ۆ6P0F^}ۂEʕ]Nji`Cc4e3fY ܃H9] zQC`짘uL76XU_5{q*7* ^bxu"ܶI4@<Ծ54ٷg1߽,̗pZ`u: &~^~‚ҋtn\gFje]Kc5FkZ!Xɝ᥮ }NV:''/:z!}ҷ3ƪ%w0$Z+fGz! k6Wd#^W|:򡢤ӵʧ5* )mo1 qF+D'Ĉ@hl1L. +p'lKƕB$ 3@29.|phR==LBz\`z,.Q$r5k)l޹I׻ |gVrߔiE;bYzogenNZ7ͥiT%a 5hݬ"W8OE9ax(=ᘞ[r)}Vh"HoDk̟DtIX"пXDK{_rM"01LonP,Q!˚7S5$bST02.DŽLO'én[7\{M:QR uץxuN Ym-Br5I.'/ˡ;\#٣ \35= !/#Zb{:C5|93v h`{CH!N-ᑒo-@k-'S‡engAZbpQwUv'dySԶتwWvK]T^"6YVH7=3sjN8s3-DszL\QhxUC/Z"W hG%Iah+&!BWEUO*Q$;y Hƪ9h9tT5kϪbsnShX \S 5HKPSt㊒%?کefTgϙjaIx-q]!C./Ͼ.6 |SJMXy+ V JݶB' xKH W2-{Q ;JMp9 6&vO&Vh X!h4U8H }1]7kے'Z %:e QXlC~"<{Nֺ3w7Gosi2Ȣ;A&ee#G ^ZB u$Zd1VԖ Ҏ UmU=ۂˮ8Yi>RJUvZ\/nC/9!EPLhh5o!{z_T: ӳ6:"l`·>]ۤ~sSKPLBLe1Q5c{)y%P UVJv3OUYu 6GX`7-,?tTV8Vq@0ΘFc/Cc²u "ڍUQ`yiXY=k[XgWX92B/{cFڱY}d_l$1lVw |o9~.q8[:Ƶ3&^X|UT5Hs9 ޲TqkPB 2pWVשΚvLf۔*$ALN$vBm E![u5xT>sD^,tVT/2͒4&],=sAd4kY օԛL$z/V !DHF4[ 롓$ZMCCnx\^?41ABfS Օ?B̃k&"=ݞ*7֋HM*NYNsv&YQφk \) dp5uH7 vwbGOVcV2NAG/W#VÊsCDh<8_LʀӼ ψHzrʳ;}nBHwQi FDIs76 u F]#c*.Sa,oQ-ܨH.Mcȩ57h6[$ 1YH  6Vo[2Kt`$|]MIc ?\|'\OǢ5vUcn!k;)茕*Cŋ^3!{T< io^]2sbC5HD0%FU4̝.wZרzئQhx;q8Ĥ[{T&;,xd',vg`!՘O ż3~JUts{CވF;Ϫ@(^Culыu,"rk2<*Z',\hraA3(7+Ԋr91Wod4ۼvJm :6nL?c8'{KOU@3M)*;;dJtV}*a%ۘN?AŁOI] wRNR6xp;`x=^D>K]dJ3dxvgR'9GN׭!Ǹ.S?eP=ypq7r!4zCw ~~>4ʦ$%4M)'&t CH[G d uZXژ1)4 K ^CwKs]4SQgWjdW~5kƒdZ]3cHJI,TqD>oTf$d~u^3 3GcbvX %'7%/)o6![h z7hgHqKi'˵o&Wm<؀Cc#i!t$nme |[q }x _ E1s[ewU*gݚOpWmQܧLįN\IF^^sS(u\wZ)i8"d V*$ND՛:ci:)rs+זr' lQL:Hv6]4(/x)r^ ߼Oa> {ͮhܻ9F!KzW9Nc: jɛy%"HB(%nge.p߈A~!I vcO;:r1Y&%QWogYT#lNn4Wn*\&GD_B9Å1?ݏ endstream endobj 144 0 obj << /Length1 1591 /Length2 7824 /Length3 0 /Length 8857 /Filter /FlateDecode >> stream xڍTT.y:IibJJIi$nABN/u:k9gk & "!89A"&7x9A L-(A De!#d2`ĝ2(ܼ@D+P03&4 je'lp v$!NPs0 P#!wv& Ax'5 w;YnP5q8B,_-*`{ȟqb2ZP?pK   e4Uc? ؁?psrO_`ssYP;*ĉpG`/C3 ځ ~$]lu@8s:C~+ݘeap{{ >n\-  YBaڰpqz:@da# ~$ ܚW-o%/]ޞp 7rtB ߊ"Lnnj VP??;AЯ/;Yav>b.E%glRJ xrp< @XXF *,ލ鯊]7 Aw?lG_Q<ߊ\~0P;?-낸[e*T*C,.U@Afe rPwan_ivPD u p#on{Rff< ??}48apĝ pמ7` wu/o$(p)x.ͿF* wIwv?\PA>_.zw w98\4ЦƗx6VcK&H۷P? O<) 'm̸!E6,@ZجI~Zt ,Sv $Q}HI"C,U.<+u@t B]7g^}2<ݥ|ϫH03wⲪ휧&O^> "2;B1?27۠Q2K,4|;. ؚ[X6 NPG^BfTs>L&G )b٣~bVm=΀ٺ90h,ɞwo3'~5'` vŨ]۶o7UVUA]0(0߅49X'PJ+}Qoqɟ-1;gY(ZO6$.'Y+ZM5Ľdw􈷶]×9ؚܖ7\*:- haʇqq;1. HyUHjBm *7lw?ӴrN{rӟM2nK7-~1$aU+.!E4сG]RyaM%ٴ̻e/_AS1DJV)rlO,{M DG)wďU4)I+ ӟi'd Sb*  x{"dkxBJ˹ǕJCƩYNŁG\ѮDk~C)BAv~5el&%ka)s~%{i"%L3eë7z@Đ:qo=yP/qk`#!!yש[*m85~\!YxL87]N %l|MIY+h_(>#*l $Z~K<0@B2$01MLt]< i=UkPp]xV,d”~㒎~`Kt$ N> ';aK,xk6Mrq*Vg;?HxJ ia%Z6Ɖ΂$)X4f=3IadߌfZՂH-K>VJ*ڦL/"K/v/ O^֑=hi<n 15j嬞)x!o\Ci2pDLS}*ď ۥ=U LTyt hV9N*hNV^0iߕ@IH%6W᳅v-Bg=-2ybUD}\l.SxF_TG! \H%QѨLX1˵^(ujb,G|:m!ԏCQw^;?;{3>M{"h)~H! m;WGBQw82e9}z,Gj﬩T{7[Ucoa# ynnzTh3ɲǝ_s&#Ʊ[j'YLT6t/24[⪼BO3^+y=߮[0ej1{BRTT8b&<Ų2T?ZU`+5Rԗ-h &oFBm-ڽd+8~^qxD1$V0#(ʪǺ%&Ț9WXu:XHDdIAF0=N]tc̙H7=jpP]1jt,WK%Hd;G=dw0MahR+v>#A{FyJ]E:R[I^G4V/Pag1;!aBH4)Z%T <9s~Or3kh.4J^>zúЯM?m@P*fј1$#u3V5=>\>e]D-C6mdE1MK; seDZ hO"}V&&*+V'pmkp4:S@b',  '8vU0]x-syPMޗўbfeN|j {=gS s<`іR'mn&mqn jY}ŎX%v8yѽYUԒvEZOAo e_mA(=QRx g|k)ԘC}jCF?Nj\DcO{mw 5,o_~<6-v,i7?ݫZ׮/Ll!FˊxqP n,`kS%ǶD b,.FV#Nƿҡ9:x WRhB7Ph+W6KB+ԲL QO4%Mri_e"1xf t'4= 4<6ݨp)rFB BM@nJ&rbx^HI. '_#KebuCikީCPS|l͉JR7L/r7gV<])~ǂSG L}oB< ΁lě_Lj53ؾ#<ַ3d&); f=X[M3NSH4&xh#D+Ne/%}T ~翣BDƳV%*,窋10?A)g Kw+ X;-dyLM@哼9cs]hܦvd$>$#5 -T;:+B|{-ہv`O\%FGl¤@]XMy:?G鐛k3JC~:V~\qՋo'JS`)WŪ3G[^ap;U$tPNZ:mi[)6Y`ul.aW$Zgq[(*H=aìg8| p^DњI}ZO,R>(F44!x ̗r==4 D 46X>9?G 7Vtxp0uE4; VAptH[#^kzI vެ˖bX)bMDr[KrKABFc ^?<^9YCq^|cps+@sMy',Ŵˎ" twN>޼ÎϖF)mTd{Y wȲTW29V).|!qu6yņmi\XJõIY+.ptc6ՀdHFYƷeX(=|>3X拵POr☰d zb{LG8YƮf' 3oe cC鏐@#/d:96I@;cgRR}G“F7!?V h1\\y;/Ff \xXyLQ ΉZV5) V^D{ԝ&)ŵU}KPeXyzp&'o3i,YjS>Zȷx sӯ=N&yݸJζ(B&snc(NšzˀC !yqjU1alz8MU&z̽x]YA,K"$I_CqBiC-i ;nt[޲)B9/vo\gjId6Jѧs.Y>eH^U%{6Hux|E,jk:X3ž),5Q;>Utx뽑%43Bv9ҎxK̩IZnA|礌}h\^&czB=HBupF9؃{UTW` G=ɣKn}]ܼo֚+8Sc {/dR=rzQ+Q esK`-#C3'!w^mS{+Rʟ7݊v9rܟU$^hVkO4?%$=}Ihm'km,lػŧӄr^֨TRutrҸWٌ @4jk[w،т4m릇ہP?tD:TR&݉d,p`e *zt)=F%A[(ڕfj݉A<~r^;su[rGn-1/ʻ[bu~/_()qҟ=M'rCvB?ǗߢQ畯;Y.1eWysߥ- OJ`+8G[hxpmVKv!/aԶ\4F'&v'Y5h[U/P= 2L3ڭIE?U hA%LwbJn&ڭ:͝!jlaZWx5qptçem'R-əFݽ)Ê2bRi24~B>rލRE "G}Yd&)r1-h Qr,S}M,fAx/3t#d8>)Ry@h}T ~ag$kH}|HrzcYFY4ѼX=|ʤ/F`!r+ds֬6@@r9NfBpc3I>52WeVYF)ڒ4Ԧ Q(5mx +tܪ[H-A6PN0_^t۰ `>kfxq2n7бPj ᱧ7qa8w kYغڞV D ona#݌Y1,qĊf4y6PANJʊ%NQ1N˿2-;d 3V FMXĺycǴ|R/ ]%u (cuH*%)kW痶y4gD~ h#YeL}f$6?k6u_kUs -(X-{la4S&+&Hک;Zݹ73tmzU*&¬hϻMD"_~}&g韟voqڈ%דRc0S8sJ+f?}㩽kfFHpxL"}RXnHT ˿';jIC=D!w2/GOx6.LXrm,oy.'>_ ~й]-SG )~'G1즺gR)̒%H!b)Աgw?nCށ_2𖄯myׅu[sR4)YBե]RoH{J!=hc=dٳ\?XoSF 農_̴c"=U9X‘鎐_8O\% Uf |6fT~\6+!A$1hiAjOt$VJf0ՔIs0Ϩ=P7TƇ*{\ۛkFu/{1*S+t_dU+&SQq4wNԍkLM^4bo?{VJyBEC~댒E}7 7nk&BBǡe:لѵbh3HP~kBU% ~VpCoGZ.?=#W$dt{BG/DYE2J? 4'k&V ~\k/"ϫO]If%ZntgW.R+."eƧlr}pziu2X]jv;S)HŻݺxRU1![yx.Ӳ[h&6Hƍ\g !'Q(uzGGçf\#[ RX),N>7ymy4tf ku? ŋa^Y=wh]ENh1`fi: gwC75teOy*D,օ<AUfR,{(-Y{ݪڊԮm۔'a F˪5JG_Ih}?;D endstream endobj 146 0 obj << /Length1 1445 /Length2 6614 /Length3 0 /Length 7596 /Filter /FlateDecode >> stream xڍTS[6, "tH&BzDtJAMzU"Eo93왽gs?RE@PHH(PI@Qa !7'6b\(!1P0ʧ^QH+$d@2@ (7ma& u!VF=1p;{:x!|tm0t" p(_%xeX0Eñ= vM``w+a(ʁCHW-ZECl$ O?ٿ  Fz‘vi c=0pA]p u0@M|5\ 8"GQWmVE*H T(j=E#ۂ_cغE pgW̕ R@q؋Z r_F1pCvWm@[8 TrCaW珁{́W=b- E4 t-$.#HJ$ yiOH6ݱ ߵtPWąxPz;俪_y"?qqE\WQWR@/rpWj`WbPD!p5! / ) GB\ؕ W)WHK ؓxť;oЕmi FW)|0יJKD\-DeJDeJD1A@Lqo_B\1+fUۿo( !EA>s({Vw\.{sn!ik8g,^ ?m!}w>L}MofST[v;O젬(F~%G,dcGς$E׊V\̤7NqLŔa\ .S HJya0xR]8Éy䛮m{Z% S1P{itǴ3Dլrƣ$C9ߴn赀7ړid6ɢ@Ԗ' Xk4'gw0M00NټB;ׄ  hֿ6밗v0ϫ/gp^f7YZ.ӟYo++w˜I(X"b<}*MgKn{0%! +!y<#NS#a+j0r[HY\pYqA5A(ʓ2˙@B/hYihM UÞPٿR{rѮЈW!6z"a\AvNתQ~{OfFTDFËA۲4RHgK1`(V̟5(E^<) s2kcէhsrk 7bm:^A^~윉ǐrOγ7PNZ$cV㽍h'`4PW"o30 ==Q @-`>J?ښPH٣kpPz xO^Q\ }zu~til*[=3qԯa$-7e|Nl[A%^NDd\J}GE#8czoiGLX]E,޴Tk>쯾r) ; T3߯ݳbN5>cU*iknZem^gK us{g4H `J/xƛ.̳ώ]rѹy}c /j Sh:fCg8E3 寿>y@^E2ڦ%zzmgngD *MR:cu8[݀[v?{QpN\kؿ ė.'x {ɒ3U&/2p[Ák%;=k$Put`"}:O}Do 3rNYmVZz߳#ϮnΦK&x ғB#9BaJÄ$9dj>Xás/?\n2Y{e1u#9-Ad*ȲIZ͑.TίB?me#[@k0dBoI[ETۣ!Ew*Y߃FYjtΗy!̡S*Y7MgM!@Gx)v" d=ϊO>hz7V Bqv;O^38a O}d~0(—T1*j\6$%>`1u,6䯉$ӡ7gƒKs) ߳ .eoxA*c}f Z{/n:=!iSo+>r󅁯ђŖyfH>BJh :{wEyR[d}$&-x[{dfď# an:ޢ O- $j(#-䬃CA^%",[1,燇 92<]>6d5~/7&ckK1E('/پ󪝄:CdRl,fo4戃O5U|JnW(lW]/# Z]%1-]]U)Cr\%Rߣ>7),D]ڋMr騅3WzGKT6<0%+PXimU2nHZokOОg)Wu׍p'|]p+ ]P$Ug;r$<9A3#zj&*wf>y`Qf5fY{ 7| VN,IcF J!L{V}r[A7oe'q"+z :bi˩ё&x++z%k< >b{ i|h|?6+T@ .óZsO۞z^XϭT,~+[퓨-rJqOIs}Xt|9j 9Xѹ(UH[܍ O!hUM6dx&V% U./{TvLu0LI"F\ɸ2K]M2_nq]K?ֵ8g?[{ۗ [ZL~8bS~f} 7;*9ʞ8Fre S`QG ݐH̶~EQ AlY<6NxP@N(Ф^ճ*T Kvh@6l0:[!_ fYE&k#؊- d>QۦV%<)<=YT9LXCR=?p<+U3lMtm=u 'DN$pK]Ά8EzijKquur8J:Ix;>O _CM dqF6<-9 ;'Y͉\XNp-؃4Ɖhv.cPc6THVDwLF~⻱aD<=by;$o&/u˗hh;X?f]<=xq.PE?Wp|!sTsa(mZ\/8n0B~IB9’-PRA[Byn#{D1D^`tu\4]Տ;!UrDA5SrW ɪu.VTH7}$aGM84gʓ@[lVq(u[>Q8 [c.RlzC8%nM(ϼ Mݒ\ٛyBIs,;fel~QuZrWL6v ί<_Lftj C*OcmӿL_"s7Ro,r0rhݓxmy[qd &Jl37'#ù҅ɣU,2+S.N4${+ H+jI_Afhsq%c I6%Tw?NeMRD49dҒ}`j0L0npǩW^Z~@yȉ0Taif <9 =oHfG?I mk3Xt6 ))߁>?^Vr Y'TP ^wiE1nόW(i+QoP]n gG־VTS5ᔜP yR8̸.Ǻē Q'NڕC]Gf'z2}5M{h x?ό/y*ijf:P,Crp]LC/4|N|{uR=R8t5/GuCIcꁇ Ήj/A}^g|5ήzJʯ>&˂'y_^ҶhdΞ:%#c^JQ-Q._`i㼊8N}%_t&Ӑ>}?7e >+˺:֯D  @;m KI"LM ''?fHcv_ Dž`/)XM1WJi~>rho|BI%HԘ6,&?譝,'@PlFwMfvf tKϸ~Vr":6Z"5d6pqC} 438YiUNLxU&nM/?Z㲏tőn._=PWy{nj_4=v7v'4x/aפV}7⻫u>uE3H(ƧkTm|%Wx6kAj5nTw'f1ևԟ/!9It+g2 'X rHͬR>Ip3k=%}wDELlI1PK:+u>b _DGɲZ+ !Nq7C>gA-˕ {4[K^U߃k7WB/Q`~?Rh#/-oY-EηJ ZyZ52^ۣ7`o` ڇǑ%/>{%̓br80y}BSĻky #h 7utzֳjX((PM/N+PzkTI[K%`&$y+ |; ~;󁑫:m:-=5H3# \ISdq+x׳4SLT߽jŞK4븶^>w³QX"m<_ztozV$JFit~ȴ{t|a~UWm7P܁J!L'JOw$$#:Bs)%ewsot Qceн=2gHg2 9]j#!.nApE'ndF,{*وE9D}yPK$V&7u8 68 a]aT">OR,h[5\N=bʅMvWM`˦d8E9BX%ub%vGK/b\zTL{q~,U7SC;V?Gexu3o^axs"z}_%limH./v6˥t [Mi)|D#uVJnPkm%J'57\>ՖEO`Q%:rL:fm-~*GNY/}"#T4eYn>s㡉G; >Jy)gJG5z#sTIst΢8JM*jA2.dT٪7 [{2WȳNGt.!Ћ Ki\h); ߁*J ܍W΄Tgթ@KZ~_:/|硿t3]v|/Ogaadf9nV"(&uY2+:{H ilSfjX endstream endobj 148 0 obj << /Length1 1417 /Length2 6158 /Length3 0 /Length 7128 /Filter /FlateDecode >> stream xڍxTT6"t 90 ] ҭH {y}kڳz3k1)8"8O( P1@a~ P LH(. %= )ۣD  E%$@(7! P:t8Ip:9ypb n`(бG9A0|SrwC# g_ }atw8 ^`P v  !X}ugV#7 (h+i_FEEOH'!  DoSj!_hπpKV.o?AY]*W sEnPZ( гo;B=۪GO h>P*ER_ɯyA`} ˆ2+)DK UMHD`aK>kJ/JGo11Ax:X @ DBBh={@{ G~z ]ߓAsT::oOck1I"(gx9jӏkf/TDNq^<|^PP<+v 舠uˌ l@bgmőj6w!+su7rRb(='eΠC+wa>`f]CX<$M 40|MP쌣a=ÛL"ZњH ~)C4y-H vEs$H,;3ECžMNJ!wml@n ך[ɪVq>VVЇMm^љA_Xhc.5='YP:]&>񹢨>}bt%eevYʜ)~s7z@9dޕ׿ܢ!r̔[EU5JO 2,VXdI4&)4&7ҽm!Mϱ(F$XK`U͉"J)cL;Z=zBϾ Z]H= qn2c!BBxF']04H89dSL Z*ڳb}K]輏E{=$TUzo|=)F[B gWwbq//l\lX 2b)JN0!P9U![./god'OtDL]TPX GO d<ρߺُÇ7g>WVb|qfC~9`ͯSn~6] 뱯ȱ>ۖ%<8q@RIEozmp w6H$l /nNh|-U`3(JK@դ.E<<Hu9̛<2 ০$Pͼ]1&?ZbMpWGO=t|m̈́o0l Q=tq F#j-h'^-ƃFO&w1csK޵k?;m(g~d>0QR{Vmܵ|,o~eT>\L(ޜ3",U׬Ձb`CƎkrު섍)Sz-#ndy_S;eMxS%/&/< T@ ^.b Ԝ3P"9J;^[,jDxM Ix87LgWcʫabZ:~+2?X9*FJ9{G~xм7g|qɷ5ʁ{s,Sj7k4 imPqB+ NC~ w30"RڍuR]K <?%Ȱ3TCNw%>8S"xkd69sQ['/ snIt|2VZ G=nOȊ)C0pdJ zLj<)DԚhSq{yLا Sb`%rѬGutqHOZt. BUDg:F#2*eYbsb~hǘq}ǧ#`dq"8m!=[І8.6x^=i77WnDwaDlwYJ:*l_@h7_$0!S0E|^p/2.<(=w*(rz!T{(%qϾ`/|˶bڢ^a/9? aUޅתrW_78)&ƂHqK~ޒ̑[f`SIۧH0SvnsM.)8iqkb.6s-ZU`X ?<0kܙF֗=JdFZ~mUz$~UI\DL S&C/dnrgzEp9e R xyx_T ) ~%LQ۔@OĿ#ZNG76 ,@歵b{ iiz7O5u!7G Ae;=gY$Tک\dX{ڒ_:43(=ġQ\fᵗGΦg=A>j7t%mwަSVN$ܫy a=Uɏ+c()$Ǐ%ߧˮᖙṬ9t8eTI};Wdi<]O"4ݒ/(ƒhKVW (.jKf7&x\Yrnd+<+̋n)ڃ:J4qMptc_}tN;m7fAMR\/k8YĘc\沚~r2D ,8eYŹt _"c/1Oc7z. (P=YY&g4]rEZ?ث>AZ גv(aeȟ~z3}j9;aRV3zGݪSض?gRz{nܴg{qCN6bo'spS]?26?AIƹUpN@j֋.}snڱ-Wґ1w0 ّ>mg-*Y'_TVX ~g})sc|ܮ0Z6xw~['P6{$_JZΰ{M]U2ZҞhP~q0ݝ g-SYW,gܒ;::M D؛kG.V? b4k["=uOxT<ɬWjrҡ5S9m VqCr\$^sZh%^|=0.ٚ:`jzwؐT 1/3Vwʋ'r'xSmwWTe:B{p մ6ZbkF+SLCnoݖH e"8y.6.I(R`u]!WH)SSLinnYֲ̊|b|Ή7I3d^LIY8R8L)c)4 wZTX&֛/Rdc޹Ni|qP~lCԅS/q4__zxvP0LV.B`{Ii9=X:gjbi(=׫kͰUQ:.{-p LՔ^1rg i6_JT`hQhEO5YIKuͫ+dh΋A߭O#xqJ"WjN&"oY2zbP\%*B* XOrǭ 0ߚ݋[Hv#{PstЪz2 +r3OЭNWRL$Gu8%r+{+H(,lZvZlx*G_K_ϕul9z)xTzxEJagmp[r$\#q U*=1W%E]a/JH({M^.k#]¤Qh3P鎔<*bGَq'qnmOh w'P8z<ĵ8p8fV**7O"~RÒ)U1ia™A^En; a,֖UAݛ[=\OwLYVB$( K>4^ N5b$wIJ-u8}ӱ[e+$=u91ȃMﭬȫ,Y'_̦C*mZ }H&1wcJ9q$d&! hN^7 n ]*#KX?& [Qh:`&XS6p- D\)Wg SOy[3pEKjmlF-8iƻ2lgfIH5ybD| JK=Up>`,֊p(ͧoN~J!*R,2?G y\W5^Fmo{v#e)YJZJXuOU1z㔒Yir+Oݥ +8DY7URe"I~]2-[p1cY2Mh]Wp}cP^>Tw_;V>wzi!}!jRGYQu$IRj=kx/NP Wu\Zf[^~?|.~pG8Qᄂ9b/wyn>̒ty8@,,OfE=l>Ķ:B彍$>o ϼ&;;sY+aG~RmYUq^Ƹ{_=NςĠ.>1pm ],d'IN_CYp߭o+q!%QeDCEAB𭫍 *]< 45._&hc4ɢT`Tgaz_phҪ,دV/,LP$쉑Yn<|s˫ XUMȓzFdmoziHk1fȲ `ṿәWyi^m/1cz,;E39Tp f|7U O5\/>4a"=3|`XuOf}'4"ǡGՁ%^no: C2cYt3a8K qv}Ӕ}[IJh2#e&M]!D |Rzq=6:BNm$s슾ۋ1j9Kw8ΏUԋUVc^=?-owor4 \MIݑWc! 9PJJ LRx&تsMQJLMI@z~ Yg 8X CTqI1Fj4#!պpZ'w=Sڇt-ULj fB^.؏)j-JPt#Rju~UZ2崣hjZ+&"5p̜M~}a )W7`o&HHlYZ'\L Iŧ4x;)!4+עOtR endstream endobj 150 0 obj << /Length1 2586 /Length2 18373 /Length3 0 /Length 19873 /Filter /FlateDecode >> stream xڌtk G;&m۶3mƶv4ޜz5k̵qm{߿RBeZA;#3-#@XVELKJbl T dag#]&bn(kg r02ٸٹL 5sZdRv@'XRa;{G 3s8 00rr:Zd ́6 v@g1wv碧wss3qs4㣤Y8N@GW ௒r6J%[8Glgf -N..&@G{t @hci_" `ja ȋ9; mM24v{7t564z7;uC"s2vwvsFh,jk"lgcuv+? G{=9\+[;7["S [ӿ0qWppJc.-3:X8@؜*k񲷳0z9Ύ.@?`&#-ow1?- `7 3mK+j)(JRSJ!!;w- `d/?Y)ikjO]o®L?A _.9(~+aߌ:7#1k1XX{c>.; k TŕX_.ښYH '1 w߳_{fma Tsf220r[N# ;Q%cbe::z2O++}M1^#ec %b Fz߈@//bgЋFz߈ @/sF^_Ω(Fz߈@נS#h8ߣF,N.6Q8[X0%~ '$p}42tC𞸑1h_6c8=c;a7g$66kMﵚY[ECOP./{~SfmGeڿv.}71]o{9濋{o9w=y?XXl[w(w.%Cٽ;"w24 ?=KÔodyBwM>;g6?z !-f}7wz8vxOwZ<#~j\|G0wzz?{~vߚ݁ư?팹-낿NΑQzppyDJ \wLEZX&x:nm kKTl~֏Wm>18Up,X?K"` %Ez/^?P2W&l6Z5J'x43-4ʹ;JT<5I4sSÂZ S76  AWIQ:WJ:.S.mILk$>}p0YTuKXԦnnby-Ez{a0w&Pr^{? n4oO릴=GM``WD^|d!q8 ,3KIj,Nܕ;E B$#"d4ԢTsPj`/9\콲kqH?y6zX'MI4XǟjW!G$g,Ir HT ̴NȆ> Q=6G@k} 3kiNUǍA`դ_Ѫ,8( H($ˉrpw enoe.]E!<2zY-o.]Zy"GyN! 1lK{/n oڸ\wQ꨺ڡu2CL2ݶn"NÛEK:1 5۽hAؑ99*w=ͪTqUx:]Ԋ8{S/no6/ܺG՝StJ?GjmoVW1#׆_l?}iHY^Ha-dPa\}W@YըSpmr@SFtɥ[>PJ䷢esibG4 1D˹ fG_J/LߴgGFSͯ#Z6_~Ú DBB2?s \RƔzΜ GbB>48#͛VdfN\}i*eCzl!𖊱:L :>B2IuuZ.1Yt*py-O~&/NLO?K"`(,§(0*F3}\.-vCϣFCtWmewGb~L[ hqnpFْaY=-u\1;𦋹GGEO%f']O<^ ucn{Lrz=;JST=_ZEِ'U"{͈}3Txf]*PQ[\O4 2`SAVp%TSsT{Y&\( WI|-xI?$tL:Dy$PULNG*4 ^M0i,Dcd o\(c>HEr9M#GirD9xrl, 9.efq&%6 ~= hr?1 :w8ٗOցe%n?T' *+2d9k!wѤfRƿ9&Ttp;Y 溵'B@ElA©JJ|Z4!wL$\.n.K(x!5[n?vTП?~P%5 ; >rEu}gqgߍOsd˚hh́&E Xs1 #'g{/~eyvQ6 pބԗ#eq f?_"KӴ6?k67e Jr12ck,wA8B5 +VޣAL nWcޘ%X_B]#b? Ă _=sE(9 S'~%AWUyzURUM~s5w_z ǧbqV_ͷ,> 3IW+xakzsjwQz-^tg\0v蜠,=DpJU2$Xָsr77}sS~ I,n463{>.'? ;lH?Or˕x]o  -̶Eq:}1*cH`+Tɏ7U49HjηeDvHqDuJ-;^$ cW\O f-A· |{.>$z2fwٯEχ*EfB ?9U_ĎPu{?.4ޓ3ٝPr ?虻S&, _:1Wt\#){vI$(6 ) aV&l JQYrAAx"S("~]F1YRgG&~6 ~sJqtz!C$Ӡ۔DB6sgfYHp Pu6fuuF]-vNZ hMC=`Tfu2WEkQab[ytl.:'G' QI v]LƋV %Ю6Ip$a/FBSKޫ+S_pInB3WhLB0smo""a8m`%G(w=3 !>usG8pK`6O8  52}\xɓ#HXV}>dxF#e X$B ( z+of>D`JFx;-&Yb~iifU" g< .j,ޡïOӝfK/aX1sͮ9&wgDʪ Y{a+@ͣY(Nߋ״ v?CuD@Xl┇) *iԞQ*;+p7oRkI5̵;e.PǂE V+rX(Qٌaۂ:=\K۬Is?z^{}2&רڛ6z8Ac5a+sOxs{΂m`AkeKXUE]֗ԁJeR#)Rz6ʤ.4.29N{^ Md1QeQ2{p:[M:?YFƳjVKO(^ C.H8m>ݬ_nE[᮹%F.B!gNNxҗ\oeΜӃ5qr7'xDaZY^kPRM بpJw0;,Cnmo}ф'ζ\%a0JPKRM!~` }΁HVh$GO}г,] K~ 0MV*w]Mhk/m8ݞm d7 vP 5Į^I OE$3qe)'!m5|a V'1aGhLޖ}y|(97k# l;4kԏPk`[2Wq@;i2+Bf?i`xWM~S2AgﱇUc0I?pR#>I*u [ F^(4h)d~v`yк}{{n*/4ŀr4b{XMI(ipι;3%q(+ ;uĂ8cpI [/*B˻9r9puRN_e4j>$A8~cYJ\~0,KIwfE;jb*Q7*X9hsfODgpVVfIxW*'Ԇ5owkˬnpҷw%l{_=]̠B*fHiː>**iS`fEEIL^%gAK59% TcKJ&TrcP-GJ:\pֱ lx/]L`/%a ڷGP,.)aGc3꨿6 M;mIL' s.8~cwC r|mIQn&P[p/sgCQ3Dd,%ߴ?u9c5Acl |9|Z%~~)֙9HFs?KK؆6sFK lw0sؑw5nA@"<=o<8KtT9[0SlSV2hfCJ74Ҭb#.dynl%!J|~ Ul4uL"|)>I9CilĠ[0D)0d:y?&2=uc d*јgG"3"kj/oE0%I~5?*4NX*%}S#!hG5* FK+ts2O޷KYv`gI<&@ix=ߡfjB Vh3N"|âSJdd򈐤Js¼%Ac.R5w y;Ȍݶģbx}~@90KA8.\jsf(7RvWX:sU ,cS椲po(ܓӼ!m#I LOYddIZW$_ a&Y(R%cCkSf1MTBȠ%b&>SJ.F ́fVZvvkh;%A9྘|'ir*ҶͬFtD9PӲC#On21Y<:Pk l{s :m/hЀ}ǸxYӠd@J_z߼x{rjKFbl?Ө+HV;N:SrvF5خm 9g!;^qTqNrQMjEbQl82Z[]Q2*5\ Q6Z5 6b(eo3Ѱ{J.Ơvr}yvVJdaGIv$y7 8=NQXk6D-uCu69esQ)\B#p<Ҩ+p ?'o|aְX{D-̞˗"?Bl5 j<8#&šjrLדՖuq0Ǐ )k ㎐?GH<sN)X|k _o թG3#)3/bN.vA*ײN&AۓI")\8*5PU(O!m 6ڷ GE݆}Ik*&Qsm3n;3 ƅ)Շp'(^_hVHX;8Rg:gSSېEʨ+o˰'RV֛7.]O7хw{3#fPm"`ʎrVX~L+#l$/BcnuGv)96nM/ݩm+[/U֫S4qmlcfMhۙgY^i9)`WwJNe,fImffa t ӉqWDQ 9Iڷy?JnAHTI/4Rƥ(r2rTApW8R{UO[Ivg,i/̩\쐵3ܻZog"/JGbL78 pҿO m8] "Q ج=+! m j;nWN.7 a$a<KU>ҒOKBI|r 'I0jg5 [f;rZ[t}QE{PT2ܹ2KVBY͚rP_K?njv9lNuԬ~f0|lH!| /o?';;8Bm\d܅`Nku0ϹҲ[G\u`Ǝ?Ay)"KnyɈ1o캨EUPȢJ^2{ԌIP_g`"( t)e}&B˒V\SwsxVN0bSk|{ړ1xeo,(舙҂EGeF.xEpx[[F/ݧf뗚'^>Ǧ3bEZ6%ʻףYT|8,Aj: ,.TCp& 78 .HeC7ܶۑQݾpA&Ż xh{MUYRdA#߿OM1HOxvK001E˰LAĎ{*'*r@/& 𸯖"Ɵi<43ѓm5zk]m>cX Ei0J)ϩ7by`"V!4}v:ILGTrpD$[c D+/B%Q\a{690Vv/[4%FyDh?73LvioOG`XúTtט?Ϟz\N%cXR+hւhh . |eTȨ*b<%L $f3z`fSc9'%/H>:@((3i‡hr^yڏ&I\tEZ!z@5Kk.4T)/&sʑzdqZq Һ'K\nt} {1Uo4,nSf"^op]5~Y8݀ņ4i =\p)I@ H1Kj80+e:za6 ֜?%JM1JñMOW?]P^zCd˰j4~M쫴hc\ds ,t{&]F$D:N 'z*ۯֱnTnDg9߈ɨ8Jڱ('EQ} @> =`R\O!7$g1Ur|(9OzXuRAYx|Vhl#N.0j :/%SWvNSgDY(]1?dZ{n'@tſn'SrZu x~ ).[ Wl8҉i@EXJ.RI^1铭ȧSdofbRq,8wjݨuY v ŭ[_!PeU{d7FyR.8 )&DsvAީz9s ΜFWxue*7Z}N Bew{dŎMu)Egf~Z2<1 |feB0wt*cn1. `耚6s,G Ģ{#]q%GS #$Ȭfڅ / ˀH/~;<$ TE_KVV*7 z$|VVWZ%ynv֥6aQ551QmN{dM53LW&_`^7/wzg[^^IZePYi4MV1 1iUp4LǓuR+g##}3Z¢WiI%8%2b ]]"gFx,.\1:D. i0]I1=.$Xp~TAX Xy9 ph{S2kJj;ՒLKg||@~}fAEB,nN_ @I#wy{ћIE- yNr(0=RfVO5d, z"ZD/H Ɲcxv1wJ:VS™fLZ_LM8>fڸ|ශưe|7Xܹ?ν6!$b#6J 8IaƂ2fn?>|X:j⋲3 nI@t <{r`i!KBc:Uȯ[k),P dEWC N+h+V|'[ q>=8N9}cϩ E-ᖮy)>w:wҤLIZ luc`D]BS:|j]YaH#HUzQ!u M0<.h7&t AwߖV5PNQ>”;^&E"/{tw3hg$y&z F*Ry/Lޟ $L~lTh7z bDռ ]b=R@T9YT]Pt^;mIPnzI0LbJ 3X6#FG,vwBD$Aָ8:a(k 8IYQos @d.zarUKTh \ׁV6Ltl al-݁c>=6g[5*ODodn!V+M% `HƵ Zϣum ;i( إ v,j++[E Z\=c DNШf@mQ6eBM ֻYbSJVk&ؿ 8D Ml'IR/87 V83 ҠjK+&n[+xd܋e)=/-FFm'vػ: Sg9급nE%\Q3~bm;g7"sYxc-Ĕl0%|U@OnE-b!8d}z0CTWo[\IǏZ ]j/Q_AS0znlu5.zoo`>Զlڦa.%P]6.v]@UV> ˂gҏi]R}UHʼ1Tt.N7C8_'ޤ P U "OAn|L/# d{$Wn B#FšJIhZߘ%,: wNKgvoɋ41'Ho DA/Xbpˮp nb߿VYfeTv#*8\l&]:j U˷gAp\1 }q%ߔ^/ʆ*z(l﮺8p;nk%&+6B E_T)> mbFN;&T!DuN}:jDrȴ9Uz y󹩤غ{\#]fiǸ{Ѣe{ٌhFTQ۱ovv1F5nntnPP&C: G9K'90U3jc~☹#fCTlOKC>vֆdN8;xxj2Q%'^=Hzx[+D'ifU#54 #kӗa;,-BȤDn+*f聒 4:l|YL|*d2rj3߂irPp?ѻM*b6w)eꌜ.;+T ~3ƓKOM_ e-\= :IUJ~?7cc;E##VK;^7a@QP{Ce*W}#~PI7ĕVN00dܟ2Ub E\ C^ $|sVQAgpK0Qؼ99 u x!ϒfjb(~,/vhY$Au;'V:ތu,"<ȶ"BK./yjTxz,Da !uC=+8,>֊\ŵN)4L0g6>$ܿX;8} t&wUu3 8 "$o#K2x6,=W ݚ8eaYXZCx:*9D gEx;۟jCE(}jMu S죥oǫnOPN`s(A9+dVچ(w}_œNo)lH"b"Z[:#)U{IѤaŨ\tދL`9z%'$4yIV82'5t wg=J׫K﹞~:n}P. w#5N9eB!A'&ō7 jޝI#+=^ӳIɂ%rhjJA2 \/pc=@-~6b C$dBj{ :o2͒ K0nzPZ0yFl/KYxoψ/FZK/_BqjVDmWRݰg2k ˒5׭x>hgZxRqm`4cw-{I[p6 kpͫnt%uRAآֶy&)g^6u>G>l$G^,Aon6c͟iXmCp2 5I6xgF&pJ֜rƧo c+afF0v:eʼnSZ4IiKSc_؄v? WuvCDAXF\;.O+tž(G@vhlC1\r{;G oH9}&J)P1ѯ+2I?<&k9"4\[̷\I2{G="7p8R=AJ6/P굥O99hCU{|ʆ %8#S{ZzYS6Ȑ;xf9_o5_e.CΔr츼nYfޚofJځQ_L@k3ZgSnuY@D;c 1W.p 6>W]`[Eɨ ϳ4X.{G7uw ;q遟 ׸W+m"gB 6MiV ;TTǯ!] !|ĶrpeR/@"SŵN& 5m =%+mzOFmZDc.PC KFd^B\平2D5y')L?|4-<(?%s\mF[J+0>c=eqƁR ſe`/Lŋ H67C{KJ5߹HZL(;yN)<@0Iޤ4_fV%*hO@_#$R%_H0(?F QIFd' \|SV/qw )tSv/GAwJ2 k6\;y) S ${C"$TI,i⯥/ }NT4?~}#|$y:go*-:zR]6?N#٨xoʩ}:H  q#Xԇv+-mi  2p-֣Y:Q2$؞JC1 ^ƏFA'`⺤yrĬ`nQʠQ2rm3$X~jߤ.9#57:pe-#1~d1 MFڲ}yՊ:Y_o4(F]o#n/05P'jx,L~OEX6U Y?yoWrfdADā9Jy\Ne]|bmfLbqk9uSZ- VtVhK H T'< ' U! ]9˷lՃapNq͐s%r%Q _sj| ] 5RUVX4-z6z%cA/tlպrJRP,)__B;H.+ A޹vigK,ǚ+83w+Yؓ: ga੺IA-\?uԎ(_pu7% (!'yTp*5l~Yvt D`Ƣqܻ+H EXvBYR6^q;H}cLACN>Zgܕ5LYʑkhn yD^p0y~;6 сPuϬt: RrL )ut Ug\HH`&CPB͝7gOްե+a 'JAK i}ƪ>DSY;l,0@jlB E=@}[\aC SiQ8冡Ps(d`dJ8`?P=Fpǻ>r^5ld)) bQ0=`{ s$`E+=7鬦egGXd|*9Ubܚ׏^j0r(2[hR}:u§R:2ݤ2]^?\ʃ,*2nV$dRmO8>4rJMLDhN ` >\ޝv!tcN`&pyV'䮸Z"*T6"Mt߿ Mbԛ|&+>z=z~'kPfR0'*ys@y'c"8@19b;~ ^Q)5ݧ )NN~WvHe|-X@pL㵹1e8 s``TENaOcZ614t+< մQc4G} UpZtꋥ˗ nV|gytUVU7'jWcFa{JR X[Fb5k ;Zvt~bkɈm˨xhAI-\0S,b!dJ,%oX$G5zqk/]"D)![?f?'O{2rNP '"9t93Ҟw(䈵33D? ]6ѕgG,rTO}=^{596rx&)z @塘,dSʬeHJ*_Tg#gh G[!5YQMKM{Z`nHI;eZ@;£srwt/˴r͇A4M2l|^6s 26o< B;% Q4lS^sdGbU*;İs&g[[E^ $+mנtځ.K8FQ\dn-:Can^$ЂlY1JX5+0 ^D0~,2>qk{MlY93^wy*e^C, ([(({M Ĺy1J^VzO߇z{wƙFE؆Z# ;]M_HؠfɰD ࠖ1oLlٕM]LiQЊ{@ 6 ?LAs]R\ĭX۠N P -> stream xڍv 4T}B$!o203D}y1f0JHY-Jʞ],fB,Zh]~3~y{gh"!:DU )LM!)@H`8*%gd HfFQTHvE @ %H  d9,z6RX`jDwo2ə HYӢ[HơQ@Euݠh0!q " T)rNEO0) b͖}5q`ꌣPTO  Ń0 AcHqp?7[(4"xN ]qU@0(<h(l4T(h2ΝJ=7@cV'`Ԉnn Ja٬, {+I8nF<@?m H$ L`n)b?w;pXzPP4=@?튿  `ph*:,CbCOy6~HbH{1:bɟ-V1$ &!y 8HJ~G1D~VEBSU0'D~qXD )AɾfHҋ0(7[*zDh5,yWEEABp$18*y?f{@C"ybH?:hЮA(;:Ml.4"Q,IRRF Eb.N R!,G*{6E? wd87ڬ8n"A(mۢC7+ mJFmMۂ A&C9[zhWD|KA`<OX.SM]VSX[LS[昑0CEXwgg(:ӡRfeEI =)|z<$\<+waLGdd$ RIQW~%HYT~1ͫ~VCh[<Ӭ:ˉӊSu:@lNF@GsȌSXŒ @r\:MgOpgUݝS>J(i(R`%~A)m5CIcY ϋWf"%Rs=c! C,+'i+,~¶ʢ@MHNQFGxvX姴TL"ۮ ^G4^$L:K?oy暽\ȧ{4?z  . .u{Zs;TerPi.X#ֲ1Ԛ)fB35 |{˴? e/^OKkfҕX$k dB5i;hf'"kXy^}PPAfI{.CLNY 'ׁ~{y+_q&{<a '\ҍ_.[:O75aKp~^" oWk`9E^{VֵYOي'΍+Y 157kWi8}IRV譜*xTX15gN|$ÇClM)䫷榻'zB1UrQ@pۊwMmʛAT1Wtݐx ǷJP]tYU quYuc C %W 2jѳf8W1cp+ ;8 2IoOh>z>z6f@=\}.-c %%wHnăf\fҲ;^r U,&Medro%9hp*nmV'sn`x2hꮸ9k GWmTtIW 0\ch)!gw&]6M%3䴰 &to(~INU.]đ埳@lӛ31c *ĹLr,-ʁIX*>:`|2P{skNw70^;&cFFRTzؖtv֜\- KjibmbjBxGD࠹.CfI~7]Y}:Z[J˽CyK !u1}Oߨ[ -A2ӶSr61MN:~=3. 8kԺȌ])xA11lI2-qP4P<\XbΛO|B7X>v3hH$Z{2!*nlf SЊ*LQ]AhϻmYaS]Q!ҿyGF)]!ڹ[ef/>^(udҟmY(O_[aat6./(#EȳͰDҼ^فY#/zS.ůƣuen1`dRp{nl_IH׵v1Btd&zdVTC;6\GIN3 h>;0&ve7GfM<-J $^`yyl#;⹫R !V,q轎 AR"zZf$nvHz%-F ã6>Fua`)hm+JtȲG{X(eJ3.犞'=wIIsop鬁N,ӗJswqNj٦7?=7aīEJ'm1b#O-:*R,%so?JMV&'}\fYsn-RmcUӒ>6/qkfwy]19j_xbQnπhtНܱ[%̘|% Kc+GM0bь|tg!Ԡ4&d:YGև>˞qU髫2!v ,N KuMT"psȨ|iYs}vo+I'Ž1-Aַ&F)w# bj'ڲv *RkfѲx{e>Gpᷮ*{]+ZZ{FMRN.ެ}kJwB>Ej^\xX&d<!aA7pL`@I ״>]K'`1`}OS/8țdX=0'ZpKmyƾ13Æk}L6zs"|G_^?LntվvjyUp<jb[ϚgU޿ Yz1O* ijѕvvFZg`l]G箙cfh !HoJK0ܑ&;FtՑ bK߇eQط_2f URf-%w} V:ԌMvOLj*}!|uz->Ù7U߿DCg`V.An$DetL?d҄<9֌;t . Y"xx{&Z\R{ o9C`6gn_(t<)\CޤGH3LR endstream endobj 154 0 obj << /Length1 1364 /Length2 5892 /Length3 0 /Length 6831 /Filter /FlateDecode >> stream xڍtTT6CJ PnaaKBB@RI))TZI)Q@A$?ƽ߷Yy~~w<52UuF;(XP703S`)10X$ `"a 0R_u %4 XtqH@B USI0X_@4FЀ΀F@h_ %\W TPP0(@0wP0EC0?R\Qvb=Ž ^bh &0/s~5 Ba: f?vS 83 .Lu[0w6Ŀ B/\HpKK_  (_@ M!$ĉ]9R5  <^b^!LY嬎vw^_i 00(a6B{\(g_M8 9#?ytA[qRE~KߧWIzu[q0 }He+-]T~ #Au9JjO ;GȰD^$h])æWdF5PsVjBk7jov:+7e=?"l.* 6X6 k3A'/ :_U? tFzr [OnxzvNSj.|@K  W݋w'K Ix45V:jR:UL(]J[K3 ^(?׼Lw-P)㹵6!d"B7L&XTx҉[RF$ύmɪ8'Ҏrb[0\ƚf K+'8 V*BxM1.dE}5[4#Qa;o]ZYcQozA j%5%-s tx-.A`֑qh;_+Aas_jͲD]4Ou$Q)88 vc#eXڽ.~Z.#C-6Kg8>Z10B~i34c%õ@ExdQ'O;;@m_7_CQ x΄VpiE?]t7 .y0EU9%Zks+2#Wj>lkfmѭ$~LV]ܰAKJ6Q3ǀׅĂk+iwSRtV=_$^m9s]yt&"э `³`#Ncq(g %,ף;ѰA/w|>7G?U-UI;UI'GhjmML;j]u'w?>feO^*uYbQ%|Љ䑂^{8hy(p\t wcFm[N/'IJ?|@aU#tU=҈@-ׇ$ث0}ס{শU.v‘.a~3פ>}[(gc1[s/Jρ(e[Ǐ#]拨إoPCyjܽ=0tlُ "7|?J fމՕ+U ]T4U~Nfh}8+3wC7x71FB&"G*~%nJ78;z@n䩡 ?/neA65. KSںЏDZهVqTůYN&K(>%5&ip9"Z ,U'uDSL>ǝJu -zз2ZC:N3 Qxv/ߵ'^Zg50&"CUdMow5y1 s7 !NIBrTa XJ( Ց M\dYlg2<_z۴Xw?]ԎRˈOf!fQ>MiQУd>| MŃmיC| T9 O# ~=M`yPΟo$A1jo<19ѓUf;Ij؃[%EN4E5xثΨ2#RewOkKg ˩&-+WC,559}WF%Tm+4v bT ̓!,ϑ7D.Nn}Ēl^5;>WÏG7)T:ڒ%8 WARi-Δ)gQ9g[M PP2yKDIt!M~Ӣ6g_]_T`HfM2߳X_ɂӫ=:BО!|m7|<:}^ǐDMQD2.|_5s*IX RҪQ{5˯S3wY*5daONٵZy)eP#7ҙ4jy4G$ \ۻ Z7Qm܍|'r#ϐtK61k!̹5N':l~r*_HoQj=r _ *"Izbso29aYh&--1Yp|eU7Ƌ7E1MC?t5r٨`>v8$*+ ~,`R殔L˃꺊zQm]"Vd釡"E?˜ 6ۭjfߌqA bq8f@J,q H[IHNȸvZۇ.Lm(m2 n$S 7mh⟯V8L#FidUrlRikIE'vXW MWsKzL(R_sgt5p&5dA!cq G۔+>AK=J{>BÚ;Xvo%8OBƥ)F:npX)~Y`b3!e0gòMt]2ߦ]☩ʭ#?Y\tZ劸z?Kqee\i1&%AyY+f}?ִVƘX*l#'kV4Nn-i7='Q!_?a;|Zfi@+ n0zuiTXp%>ͩ'ӂm۵yZ@\v.+]('G%ٙ+wuNFނxEymNL-9 r]f\Q9IZؘFG2BULoy1~jvw߮7/۹&i`ԟ )=Os#q̕ݶ~OB^,p*"8giSq a?Y=fbG`-I:.cL)q,ҝeTzv s]1L)aP}k>s$@0|X,πB2fDqA ϼˈVRmYo#ÿ^5ohd6"|Ma Y ݿ{5JzRK-VXCUY*&: /o ^=X]M#i|W/|0V!'u3eI (7Zp:Bu}&lWk8ɍD"I|ep=^'k.zjwKZ9Yq}/hؒ(ByU Cž#q{}$NwE H ,tՁ~8j{" m^3bvu>ך,f)BSF\׺n!!?t*)5yCfeu-+"NGRoq%O=4{0?b.v*_]8c?vg`F6ȑQ:UAJ7Ayns}HZ-%cvyIG÷ݫ+ \} ~2ù ?SFS84]re٭}K<\Kɇ#+v Um%i!Ao-B'6'Vf]OtRXDVP_UKlmjhQ`T鸭,Zis_.,Do&x}#~<`fv`ϴ_d5.v6}U6ނ*eDp|8D6ڋlK`:i > _ǫui7UضEXJ$~Ry[뭀:6{Uj31 3dlwmsrqu͡>~WmhQshRxۮEHڀǫm~+J$|;?H5cEPHh$*Ȝ7۱{of'V> stream xuS \w.(hXe1$H\BdLa&L YTBRP""hA+ ((ĺn/_{{{{|v`0UB!lȆ+prRP1r3זenN"0L# $Q$"ry 0OI21.@v *8\K -h(| I1Lwv+pKS "eq DerXZ 45pe|` 0ꭾ32#A%U]u|S^:Ngdt8*LF^u`gO6me;-w>{9zO?_lh}a|B|e NZRgFz-q_Nx{[UsuWyzVAAUE/#g̲=Z?ؓko%4i-r6 kݶ#Z){Fө YA:+"{#x*Em+P0n[.bd;;3' e0cK뿑x=C۷.89;: ^om!L1jh/LCW9>](§l)Yh6}avhA))X8{Zu^rqbx7IޑusىWe־4xC\󰺺4tߎ;M}.hc,^cVϩt3\x3'p즩ppdunfA Xߙ|Z\$S}fcXgYzKi7_nvuó7 \ K n1`dZY?ǾsmrrH 0./X=Iv&L/D/@=6oW A{WCLJ;kEnkRR0v=> 9$"Kgh~mwsg r(-[\Nnv{t J%Pq^LRd>}hQvWͣY)33B6<e<(&_w9 {1λ}nZ]le|K6Xd?7Ɲ!8 endstream endobj 158 0 obj << /Length1 1614 /Length2 6413 /Length3 0 /Length 7211 /Filter /FlateDecode >> stream xڭWw4N ZԨ -0aLfHtDN%j轇J{ι{~ߵ(#AQ!Ae 6Ksr Wa 23 qD9* \c ;`u&p]x@`?'!p }Zz =A`w{u^#u8 `BX8@ o AAo pB`(MCB\G] h EbU Tqa~FCu$?kk/'w-{ E#a `H w4/  h55OD¼d#DEŮk:`k;A¿WE e# ^p q$C`Kxo* DH?"Oܿk?.>ZA$t r¼]# qw(Z EC=!`(]O`P8Z?g up_.w!.lXS]C {!w'?QoAQ 1#-.o*YAA=m_gn:Y F  _? (Եnu8Yt@< 5#U˖&Q@d~qN2+$POktyoݘdamκN酰M> < IӥC#s:q/# Kq$uH*A1{}+n萻'~"#z,7a5eUp!S@H?`)Lg c?(L^Xa1߯Y3Gƒ%b4 +Q00T0R8a}C?h@޿T 2ɤrmjj5@$rKKrlw6TVsO\y`B=\~@\G Pvٖ"{1FU<5L[*JINJY J& JFߔTL08Qjߚs$oΨ$vUu3O]wK4L׽] d8;ֈ-q#jLIY'6,.B/?5Qd6Ee[ :Rs$-_NcrׇwR4'?ܺ\+?dVe}k!R=vn8ӣoM6MEk.{Q YֳXn u , (]޾GkNsIvD?>`QT-x%gm|,H/-['D{VG%ӈM{ܨ_cz3!UcFG6WEs+x=e9w]VQg~U&}zE$y7e,/:3'O;șw4M[>駍/;]S95-h07;ʅkUهLG[[T*7QfÚ2|So_VSymYHaE\r( VUfɧ৞0fbv6 uq:(]QKd`$XI0ڐ)^ ʨ,{+|)|՜??pmqN8}2AQDg݀L`ξl%*/ <m¡c5im/shA'IЙ'qRVQˣA;݌XyHͥ613o3IϟuV`ZcIPnɀ|[Dؚ:,T!<ǝp_͹VJ?,)Z6ވafO׺wᤶU&j{$6 'Kɐ {L[7IYgpUuw¤k4Ue H"{cM8  ۭ 9U)eh6:6|l)C 5Hfu%}e~ JݽY"F@;{FgEki̧Gw5)#ӰR*?JUޙDu4EԏJt*Ri؞bBҲb2FX}Kbau3Xl~~R 1㭽$tV٫e(`^NO a?4{LE[r&f\~/gp8[hqmgұ}Qͳa,ʑ;e  }1Yg*3qJUtj3?l=t?-b{}v̓neT{ {~xԏB6\_gv~ ܇w>9P=e$lvxs7il:8xm4h}^}ĬS)Iⅆ( =o) fjti,O\ge6^t ӝGE =z {5/ mo=;~Rh᧊5GYC\xlo]x!TmdVWŀhqMt h^=u9Q0@l"ǹp!8!$"VV[,Tx'h9[02 c"rRDԷ" l3;W,pɊ 'Mă}"ʷ!t2OGN޺Kw7R2h3InFV]+5(_\*dك'i- w9,,] }->g:bsD}l {s!Y#g,Z@|P$IH6Kt4W >zAPU3%3hE=魳@2QMvg0eCbt| vw~<2=T:1ѐ$bx skx֋ma0@$+"λY"6#*%D"[/o2w?>@O*`Ofń"Gŝ:smTa*'q1?t=XE@Ofc S- Y7:̻t8R;WoMSѵ\=E([`:݉܋TѨ$ zKq{Ghǥ3YE[h$l9;U; "Ta{{iEkC u&MJJ#%"" _rsX`zP}o{LW Z_y=gr4/KòCܤ_s#~ОR+z%]~?s5Q5Z7]f)~ݫ)i?)UMnfQPߑ$KA[VاX!)Y۲A_B*GfHߢFs59hS&́t lx٬Dy.Ctfyʶʖo< õ   5t{ܘl/>NYPFWXɈo? ػ I*1H$xԯ%.g=BQĺ;V_m᧙_3\cբX%{fIYFmiWYn.ݠPB?QrdA>[ZI]ڳ(S*]DUm>hY vU;p~3v_ip̩gisϱW$#;Xl Гff@TyMoqIpB9>"&U o>vyRQTk:{@XFj=!A إ-vHmŴQcIg5X!OJNUQ.'^d["1;a2́AUqB~ᬀ>)~ ia䍧0RIm"5r`߉%8@ߚ:g"\fJw9g{Ӿʛۢ#0r;FWHKKZ![FR/ۻPo)cJ}@|&]1(/{mdʻHp$coJ%^\QldEHhgĸ[EK+~HdYqokElӃ֘E<-9Ūq5sƤ6+ˮ{%s𓓗j__|LJL-ݔydw5F1U1Uk;Gtܑ5!K^16Tٜ=!i`1SGCf+LIWn}T7۝cHTsWv샄+ٳ-Ul؏͟ݡ8ϖ+#.Fߝ+",wM)ialaIaJt̳2M:߹l:ybלMQ d'j7j<}[Rk&GhAZ`s~ N@TbdO0&EhM(1qv0)K ĻBX{o{~fN1'SKj9Z x_r ‰8͞G=u% xUPI#p3w[wlُf /M e6%ml_)T*{Ɲ E_lp}[~$5T[ON# !hsL;q0_t˚ NnIxA&b6ɂsSѹan1 ㆗ |tЁdSJ>.idݢPLZ#ClH#ط`v -1%?1E5HJ+=ݙ }\36%MXߟI}O+;E8o + u-c*J rT^]G9PԔsoa>gD &+<j}&k Zk'}g6/4F~HXCBb͟RGumU/q}c1A+LQ@J`eX;j[+֪7vtcÐOyw{Cvg# dUq\]&ZS|Q ; ڈl6$j~ aP0 ~#p}/EQIYKمr16v.jO-3]StHy!(xW:,,JۮɥwCZ9F~e^be"p%Xo5n.QGMm b=>Oyņ)oo(җop]پ'Qے,^*[)A)w;Vw@+1MRh"HPxE[*`g,sxYi5,g}kR@%UMVΏ[ts~(ÉB{'/w.?Ȉ:3Gy6w!MZIISh#Rs>BE2LS ?1xdsYiKݕ~Nve֨~]c*1jXG#Gn > stream xڭweTђ-  {  $hpwBpwwHܹ̯yNU]jWBMEb8p u`3KDEbox1HAf. PH- qп`0011'`OMg 8\^ 5@ `Rjz *rz9-5\ 2 dXA? %Oiά/X3#r ntb8 go` 5spy rZ!b%Dؿ^ .P %?xؘ zq V/ ?%x]@˟\@%l K`/( j :;`οoCF'3lŊ%5Ϩ(8XA[:max!af q{,V(l*ʬw"H"Feߡe]`3{K1eGEكSGAQp1{i0eA@K5 ҧv-K  rviڀ,4.s/s62*LM (?P$%!/^^ '?qr|8u~g ^f[u27 ip1s|4q[B/y;@;eB(6%=ե wXڠ7رV ϯ*PfPmTczqSqLב<%b^mc `3.FO=uSy^]{kmq"h  [#G7X`phwo8C$fʊF2#Oa xBsm֪SҔyYCem2DQ%ʥ.EG6C?ҳaDI\T¼ %篓pE'U+~hzNnO^T8lo-!1!Y=jDèv$*>s[qk'A1W ﻭt+a\Ӵ(KiLb>P%>]L 7ں#׻d!l(iuViMs?i( Z@5oy%x0cLIXW}}+@c]D2xn^^kP>x˨; YVdJwpa5&e3|1pj4p`}t)i zЌtx☶9^A~Hj~:y{Ѐ [U}#M(QHeWA~4߫聩iufj%s/^eE iNK^'Y2?g]TFUlDM-ж6P)׶2ԉ S@Ƕ^=@n-3hhΪwn&{/'w}5B*\MxpulgdK2xdbHs,@aއ..lކ`(KKp7.ogX(<˵BQ(מV=~{hXe1 (xVpާmLO Yԕ%Fe?5*1\_K(B(`=JƼnhnZ#='Ok, CTO |T 2D]#c 4#Qa+9OڎEIoEN.~enC?Ώ2bC1dYr[Vl?YեSF 4:t 0\Md'`L$#G6ǪY02PA}Ctnm3X9CZ2bh'pDՖU4 YBӨÝXE-8gSխ1w;%s1/%ņi%r ^Ю2,ۯa|}~?9A.QS1눓֣D ꝌLsؾ s-ʥ1{_MP03Wbmtӻ, ? xΌā %Bw)D2azb>mZ>.ēL4:DT xyRO?5fk裇'.9Yķ)`fl.(3~: p[Mˋw;Ξ}M>Ps3S]@ۀ]w/}tG7DE=;ܴ$x,󊷈; UaDdgqok~3>R2YWO68=˗bL AQ76+JZP<.DĐ-Usiu&0d93I?$_]7a11_6@{;w+a]o-ZCޫCNkkv˄aHηfaߡ^#ߦe}k9c#v#A}8uS HLpO{sZjRZeMLs!؛QvrB9В?9i*[x]'9| H荂\*FtX;O)JI[4x%ḼDycb6ld;Qö%"[Nm$~7hK&mA {{gP 9C OEb}ybƶ$cYX1.?3S|=l__WjqNWג^~QoXB5Y70{ڻ|HͿR^|Bk _sJW} Yޫe"o[Y[F0vk4O<#Kk, L(WL$}p [Yγ fAIUt,+gX#!whd.` /M<*Ӹ$DGO$V&J!|VyⰌEVMh#I&(.A`+8}BFyYrO;Od,i$Y%44(PzVLiltXWtť:ك9lSC6!8B䶋gB#w<ɕrBwTe_1(˳n&v ge퉵1^)4]hc``& hz"`iﭔ7ʃ>gG iԎjRozM& r;ٝkZa#DsԄ72i“2t9E|t~sj_WKgcܜA;FGո1ʼnTR 5NB@OSBi47=J0k<.gcUDƕDUa<ã07T),߬HY ,\+<ˑ?ou61TL;\x/r5FV3$ڛ03Y~*Xzlul?">.zcPT9"vja~O.נW\46?dRw+%T [-V9ڝFI ~Yf8ٙRlh>=ѹO]Æۜ7O&^1^3J¯\K\+8q߉\W?*ՁI*J'$4w=[y pcm Q|qvHNsJ6qҹo6vA׽VΉSX{+6ZVs5ȝj=U_w N9heY9*ۈPO u}Dz`J.?[fN2!Zg8M@Wz?0)Ǥ?r@<}.n ]^?NG{\UslY GViu,DL7j_VF=z⛥DR?rV )4XPɡ*>GW%Q d8h H ڝ{.s[W5ONw,Nim/=l,wnA M=-VY6ps;Pqݎ;-LJnpdD^WWr k܀6 Yeo3MWU4.*aU"Id&6,YI׏` ˎz~_v-辆=WOYtWfcI4GǚYE4V?LWaY(00d = f55K멳LmTWOxxW,F>KYѣn Vܳz-h嬹z}А,Գqp[[c}+ du: 4Xo]}!'\n0 VeJ<KDwt"*V?&Ky=݄n h/R8mcڎ~5Y1UUwX|6.Af-8.ߞ:- !v߻ 湷D4džM_MQHs,eу!?@%~A@IBQq/$>^W R|%Qq4pgs45!Sna FOܕMeհV}@BZrĂ.8'ORaGg}Ho++( h= F׋,59?mHlW.(|+MJ$9ZWjW(q".XX OE#^Ҫ"P*KwKp0s4ǺproN#ƣ(DMܶl^K_wJ7,&}}8\9馋߁ J.,o٩36„E I vᕕo~<-ٞUW\؏sFlݰxU= bj::Os>N6P\5B{aqԨIjTlj~8"$_͟qz]sm /Y%x{Jq`Dsc Z#7'j%J/XfռBrҶMI[mkD:˽iXyzM3Ĺaa:taIDʔ4_!~ӛ(Dw%UёU?XJXO% )/nyNeVNFg"zi|v-}˰Pn!Mj-+Ma!dS*6f&Mg$a`:NNұzZ ƚIJ,ZѮ ~rƤ|FisrG \>C;m҇jcKA?5 ׅ9YnӦ=Qmt᥍a)a>}HJ,tѕĆ&rn(` aF9a-]VEq%MQ9;Ғ-R, zfs{#QӔuN&/@􍛿->4NEJx *jՍ:@<,M@߶02gKkA竝׬"0qzyFa:'XsF$8Eq{j0<d a`lHi@MΚ ͼ7@I᳛ eu6ȱAr ,;i.OzkGmWq/nf|41w[7&.6Ũ{磍Y<[Nog-55S 0ف;2>]*Q5xnLfjL BÿYwf= F4=- ]6T U!̨2 1' vףFWm/s+L弄uUƈ<`YJ|dOA ϧa̐[*knw^PCV&I NG@($k0Na‰C]:B7w/\;3,%RE-ԧiCq,o7б#6]ELّ{FI[m}Jh rTJiK%vFhBib…#ZR` Op$AIZsdɚU91NAEHɍDU5)N@X:R[eUj$2_H`B@;JLF^};b{&i:Kǫ˥g1rڨ;_ m9@ɫ4,4ivsk&UV|U4v3g֢]oEHtP?V`ƎZFٝ|ZvJ ) `Wk֍&QRujFKz-A==#)i@JU*g=x6ls1/[N1tzϗ4f!9JgbKC'|-PBh&#B+;32;ŅSAAui&F\B`P)zUף3K;.Gdf>_*,_O]Xm:Sƈ,$Ȗtix06„#zys8fuz42"+L|^㰖dNX~F?pڼzCN-s3( {삄UWzמ[]?~vW̳?lGNOt̏U%&`G\SV&!H4 @qB4ܩ@<aϬ"bjFyJ%bGaL,xYxq^cKb .;?0~1K==R*(}v|~P-"|'iqmQ(oUv JxBGJL_Bq~naS㛪LJBvvaX29˴ܪ=@zrFҿqP-L]ROCkmg)&J4j[kcnwzB *"ږǪ|hgMօw4 r }A3.oRc*mukf,F_!g$6FOHKDHߴ,8 endstream endobj 162 0 obj << /Length1 1620 /Length2 6499 /Length3 0 /Length 7316 /Filter /FlateDecode >> stream xڭteXm6Jww8Hw7ҝP3 0CHH#]J JIJH>xc港uu8u1!;'/( 064BOe ܙؔݡ(E@!( , c(#\}a(-]v>#wH  G:C]Pw@#(rap(@YhT3C]wM=00@ \{;F@`[Cq)"+ z!^+D}`H n({@~pgG)q|ݑHsEUh ;O? (7w.;(Cm}rߑ၄8^;"w4wܿ>{[WWϟhC!p{~M@P Xv =.BtG.I\U׏IߴL^iquS9R?XzI$xC 3vMbt1A#VEWXcm"8{\,'Dഷ $hd5;['w`d'RaNAظՁo0/<%/:i#b*w,|iB5vD7&tg`y0 TZI;Gօ#hpBF%5:~6b~r”zM"f ? SI3V:IwXDTߒSwAec/:M4-a__kUz I¸`vЏ,\/ہiq.7s.yXx/V'˃T58}m5)A?ű#/3GRWNņGhk<U~Ɏ"'p.^Wr c\`6C cB.L.eCB CoP^d9|dP_k˩E' (+Ƙ#-SELk N95~&kkLh8'%) r6-#a݃M ɸ#d~P+ 7~O5jRg b"O0gvȬ#L88bzr{|5t}`i^Eo!Y[zJрy]pY Y.2͂FϜ T&V<S|GlO2_JYEl \FgaZJ9G=L%"qv%uog{@`k|\YD͚;+?hٜpt3& 앪$ID=.ZM=i͕Z} Mop& !I>VS3}˹Mo9MG {>;$lRW??)*!뗽8=eً`q*[b5 l"œF(_Ex=( әVܓ_ z89˿Ubl҃ vM+f 'c81 c-o)-3n&AR%,E,WRp֚ ](w6)n+]$k{隷kCEn\NwxGy^k|f1 ЃSi lW%<%?︎3jB:(l"kT0/՞¶C2>|EAFc4fou@s< IgzjpHAcݖߺ,!qC'O&* jy:&Mpۙ~%nU35g)þ/)r%Ftd)XsucT}]?L#۵s㱬3*"!P][OpmmۃθC28oԧ4Es"aƃΫJ KAC)շEmqsY>G0nRuwEne"ST*VsҼҢe5#y񦨕5*A;% >kf a?W hmFtP%ٓ*j'WhHBA>[PY*O7={LU З։qLXޡ;+*SiW }p)ZcC@~zEM9GF?d6=H;K$-0T0s?H7y*ݠiޅRUV??GȨfXQmzrsbHȨ(O\WS@|EJR9y g%KXMy2d±O5RRLEBzjQwUxWKc;w&6"[j ÝAZ^OI*{`ZiC5',!*16W>*t+gHBg׃G\ĽϷNv^^[1Mvd5elT*Dm]G漙o//H~6?"2/3BV4r]W'dȓ>oڄE ]67/ t$tIb8`7>ef/<Ȫ|Q2Y.0VOE6^{[PI!1-1mu+ HK5 x{\ҤN}{P%ΉT4UzP, 1L]8$V':[O=fe `9mnᡩez;)ZmQ.UYpzHb T Hذu5TjL=|&(0]j;sٱoc MzA_DHdC!R3?:Z"c` ?_XrLP73N{X&Ni] 0BFpY^Ϲy;g-r4O9p)^ڢv:OߍE㮦t#"IR8-  6VV~pT bq 1$2 ;#䖳c@Dw|0E*k~Mz+䳲Mʄ0My)z4^1: .S >}~zKD2_/ `ҡ/y=t}p ԧ΀\Bj|fH^㛐-B^l/W01fT;|:vg|?n\%7ET}0In{uN~r^fh4fc+ob !=.USLR[Lr/-Z1f}Iˑ^uԪ`ݓ#n1a0љ\LPvh/J΋-YvOt}Itu=LDs 7ӑ&Yq[JB"뛄M3א)S{v,g}2nbކ0z}>)sh5/Nk#FDnA2]};jj=$l ͜7$Z5"ezO;341KHuѠ\^]ZC.'cL*]04%l=b TqA^!8_2IFwa;lvr\-5Ӓ"%dW72d ٹastZ0xՑ)ywO}# bSQ>;M<OಛOeD s_\w '91؂5>KJE2N$o_{6]mRɫ&00)'cC]ּ$6rVc3hlCݒ+'йHIQM z6CCVUThKͷB/Щ#َ;x ((SEzAHVU[w,-A2KIgh!0_-\ak Z$}µfvj_YKG_ $qK'gh]t2IBRAxѫm\Ĝ?Q[+/5{܀u/{ڲöKR,t% [te4tpw4 Γ( 6Ҩ~1lvϐf+n#+NR{n{Q3QL7[)Pևt4~qpN~6okkׄ;;jS <2a!"]GnKOOþ^&mqUo n ZZS;7.?U(khSU ^jJMmCv_#M 0 l7?2&`s‡ם)o꼘Hg=*^ ߖE &h<i]JJLK-Jv?ƿr>c\aREcuNe.|}3 >ju#rhI.͋8c(?+n)Vl=VumSAW뢫"?ZǂTCHFKʉo_Hw!`|?5퓭[cRjS:A@-1["qkJ7AB;bTyG7nEᯕޢ2h'a*"=$We㏠_7R\h77%< 陇MΫ\ ,Yve<hlr3G[ >&ƟcWҬV*/ePyngBb-^=oˏr<},x{RFkt|;[4JbM_R?PmE/\yTsGi_M=ݎJwl qvt{ xF)cM2V-UFQ=JDh5В {6\ Hm 9FQ+SH5\P4|FxId-K\L4|>I׽"QoAg^7-x`㠀IzmN%to̙ [^sKNiY*H,$bX]9f{[_56.p vbo%Wݼaq\񣥫%\dŦ2}5ZfCVIiR5U6I@s)ㅕJq.IjUM*Vt!|SJB2i cT>//6s>gK~1,6. $~hxd'|,KVq]ϽR 6$KiWrQpj7nx~Bjqxyg+^ (bW%V@컼u9QiXVyN vLq^zJz``ҤCwBg\۴OZTZ{bYs1B;簱)◴jf̦/(],?ŏ.`Pˠl> stream x[mS9_]*!!Yؤ1d{5gl ht-;R 'Qx+d.b.RaPBJ()PNh(q4Zh-LFQ #0R;F ŌYB&"8'<wRDcS"r`W0=,HjGB3 ]N &xa!~ڽ;pV\ x'J/dW:  Ѡ#Lߡ!zЎw 0D?0TEr{H<@LS[ב5p@E#:$քuNA;  v%4V3Z-AB3R:a#>NYSp ``G(6#ppBG!@Dm AܐJ e[['EuH#{#qOfHg$ eay5Ofd#qeɦ(VAټ";َiZgrܕ?~7MʋnX%ެ'zXD|rs}]Nf G(? ;|X qzUI/8*fWrp:~MFV F,'vYm,?7cn%gLqQ1wlfz`8`~.DvԻ,:ϊl*` dŴ)y/n9(.xaCb` F!&@"|-ۦƖ@?CV10r- dt.t. B*gցovCXo:ۨ¶AT]׮6;`c&v-b\ʭkz*!MͰnm z 8'8*S.Wk따眇l6lIu޲F|wRveUI!^|gF9d} 2}o(8N$nX=Bap GŁ4IO2.!ͥRl/>4 -<2c>iH!ZfSB S=sR5%F!i'&[Y1iW߂UP)gÒ ڮBơ̅4qDPB" Nw醄S{S9N,(.ef~I BKZTӤ6q VV#Rk5[}WG.$\,YU@QfrJOfNіo=q)stF0|[oɑ7i[Km`Ta֒21mnIz%;%%Ziz^v#v[x'Wtx>ɃG>s:UKk;Xß @ ֮ kӲ|3"|b_H~z}Nr'5_щs R͕i \z;x^UAwV τX # QVͭQ F@9K*Kq2p$n`|Y}v!6kB7IqLAQy4_YͭDkox14n֖o4іXX'A~m{Y]P>)i P )#ORUR4@E3LGS 9g.qAIF6N!J<ʛI¿O $q4ɠ`PŗbMgv5)lWdM&Pyz| C0rJW5c5,Ӧ r-U-UNk6debR66Q֋X-['oѫmtyQ4W$\w/^۹i2"Mpx{jlq-8d4qml Vqțn<9D!}Jͷ7V-ai+S V9g/NNIu*?\"oW)FIb#ŭ/Ft{"J~(Um/oz5‡Щrf|600yW_Quzv{glt5l@ qO^֛`xQJЛ|s^!p%=Q?GuXK: W=U#3ǧ|o|OOlьzX-CQ )+Zfst=~rN`}AٍZbuOtߥ~l;r鰓Ҕt#Ww}ƒ vC_(ͪ)Fۗ~9]fWOwKKLPuP\[Nw:2mn_b/oώz؃rrxbPW?zP]`,%sRHՓ ySg[/r^\0"R􃱚#fn䁗b%_qX&V˄kn篦q;ϛ-ғjt9w?#k+ՌtC^[Bl=l//K,83K) Jc! d"윲욮Z o+%m5%/8 =b endstream endobj 174 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20151216205211-06'00') /ModDate (D:20151216205211-06'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX) kpathsea version 6.2.1) >> endobj 164 0 obj << /Type /ObjStm /N 42 /First 333 /Length 1282 /Filter /FlateDecode >> stream xڭXnH}Wd,{[D ᖅd5&H3_6v!Z(twUSUmB>P?L$K(hJh E@aC mD2 BQh,} a$Z%kT%Pθ'dbP%8̈́LT x8 W*# j&C(1dBЎ.0 @3$H^*`GIC T>pONE3, Q 8WA:^%^m-IfxpFѻK͛f^&1Mx  BW.R/_L~}k9W} ^Z <1E564D9838265F09C78BBB69AE6981E6>] /Length 458 /Filter /FlateDecode >> stream x%9LQq!n AqܗBZ6ښ{+kh~̛;/"_(jGZgM$A6*u27"l'-%Zi)`XX4rFCe=hФFO m e OO&JMLJ:MHH^Nw]Q{䅼۠STsm3l _vv+:z\殷z)&''{>]Яw0VxCpQ8S0 sp.(g3__ƥN_N}NWWwNפs.iq24242=tSe-n~tGU';S5XwjU/)!uG>ZN5sYWTӇQ endstream endobj startxref 233071 %%EOF lsmeans/inst/doc/extending.rnw0000644000175100001440000004210112634421563016175 0ustar hornikusers\documentclass[11pt]{article} \usepackage[margin=1in]{geometry} \usepackage{mathpazo} \usepackage{fancyvrb} \usepackage{natbib} \usepackage{hyperref} \let\dq=" \DefineShortVerb{\"} \def\pkg#1{\textsf{#1}} \def\lsm{\pkg{lsmeans}} \def\code{\texttt} \def\proglang{\textsf} % double-quoted text \def\dqt#1{\code{\dq{}#1\dq{}}} % The objects I want to talk about \def\rg{\dqt{ref.grid}} \def\lsmo{\dqt{lsmobj}} \def\R{\proglang{R}} \def\SAS{\proglang{SAS}} \def\Fig#1{Figure~\ref{#1}} \def\bottomfraction{.5} \title{Extending \lsm{}} \author{Russell V.~Lenth} %\VignetteIndexEntry{Extending lsmeans} %\VignetteDepends{lsmeans} %\VignetteKeywords{least-squares means} %\VignettePackage{lsmeans} % Initialization <>= options(show.signif.stars=FALSE, prompt="R> ", continue=" ") set.seed(271828) @ \begin{document} \SweaveOpts{concordance=TRUE} \maketitle{} \section{Introduction} Suppose you want to use \lsm{} for some type of model that it doesn't (yet) support. Or, suppose you have developed a new package with a fancy model-fitting function, and you'd like it to work with \lsm{}. What can you do? Well, there is hope because \lsm{} is designed to be extended. The first thing to do is to look at the help page for extending the package: <>= help("extending-lsmeans", package="lsmeans") @ It gives details about the fact that you need to write two S3 methods, "recover.data" and "lsm.basis", for the class of object that your model-fitting function returns. The "recover.data" method is needed to recreate the dataset so that the reference grid can be identified. The "lsm.basis" method then determines the linear functions needed to evaluate each point in the reference grid and to obtain associated information---such as the variance-covariance matrix---needed to do estimation and testing. This vignette presents an example where suitable methods are developed, and discusses a few issues that arise. \section{Data example} The \pkg{MASS} package contains various functions that do robust or outlier-resistant model fitting. We will cobble together some \lsm{} support for these. But first, let's create a suitable dataset (a simulated two-factor experiment) for testing.\footnote{I unapologetically use \code{=} as the assignment operator. It is good enough for C and Java, and supported by R.} <<>>= fake = expand.grid(rep = 1:5, A = c("a1","a2"), B = c("b1","b2","b3")) fake$y = c(11.46,12.93,11.87,11.01,11.92,17.80,13.41,13.96,14.27,15.82, 23.14,23.75,-2.09,28.43,23.01,24.11,25.51,24.11,23.95,30.37, 17.75,18.28,17.82,18.52,16.33,20.58,20.55,20.77,21.21,20.10) @ The $y$ values were generated using predetermined means and Cauchy-distributed errors. There are some serious outliers in these data. \section{Supporting \code{rlm}} The \pkg{MASS} package provides an "rlm" function that fits robust-regression models using $M$~estimation. We'll fit a model using the default settings for all tuning parameters: <<>>= library(MASS) fake.rlm = rlm(y ~ A * B, data = fake) library(lsmeans) lsmeans(fake.rlm, ~B | A) @ The first lesson to learn about extending \lsm{} is that sometimes, it already works! It works here because "rlm" objects inherit from "lm", which is supported by the \lsm{} package, and "rlm" objects aren't enough different to create any problems. \section{Supporting \code{lqs} objects} The \pkg{MASS} resistant-regression functions "lqs", "lmsreg", and "ltsreg" are another story, however. They create "lqs" objects that are not extensions of any other class, and have other issues, including not even having a "vcov" method. So for these, we really do need to write new methods for "lqs" objects. First, let's fit a model. <<>>= fake.lts = ltsreg(y ~ A * B, data = fake) @ \subsection{The \code{recover.data} method} It is usually an easy matter to write a "recover.data" method. Look at the one for "lm" objects: <<>>= lsmeans:::recover.data.lm @ Note that all it does is obtain the "call" component and call the method for class \dqt{call}, with additional arguments for its "terms" component and "na.action". It happens that we can access these attributes in exactly the same way as for "lm" objects; so, \ldots <<>>= recover.data.lqs = lsmeans:::recover.data.lm @ Let's test it: <<>>= rec.fake = recover.data(fake.lts) head(rec.fake) @ Our recovered data excludes the response variable "y" (owing to the "delete.response" call), and this is fine. \paragraph{Special arguments} By the way, there are two special arguments "data" and "params" that may be handed to "recover.data" via "ref.grid" or "lsmeans" or a related function; and you may need to provide for if you don't use the "recover.data.call" function. The "data" argument is needed to cover a desperate situation that occurs with certain kinds of models where the underlying data information is not saved with the object---e.g., models that are fitted by iteratively modifying the data. In those cases, the only way to recover the data is to for the user to give it explicitly, and "recover.data" just adds a few needed attributes to it. The "params" argument is needed when the model formula refers to variables besides predictors. For example, a model may include a spline term, and the knots are saved in the user's environment as a vector and referred to in the call to fit the model. In trying to recover the data, we try to construct a data frame containing all the variables present on the right-hand side of the model, but if some of those are scalars or of different lengths than the number of observations, an error occurs. So you need to exclude any names in "params" when reconstructing the data. \paragraph{Error handling} If you check for any error conditions in "recover.data", simply have it return a character string with the desired message, rather than invoking "stop". This provides a cleaner exit. The reason is that whenever "recover.data" throws an error, an informative message suggesting that "data" or "params" be provided is displayed. But a character return value is tested for and throws a different error with your string as the message. \subsection{The \code{lsm.basis} method} The "lsm.basis" method has four required arguments: <<>>= args(lsmeans:::lsm.basis.lm) @ These are, respectively, the model object, its "terms" component (at least for the right-hand side of the model), a "list" of levels of the factors, and the grid of predictor combinations that specify the reference grid. The function must obtain six things and return them in a named "list". They are the matrix "X" of linear functions for each point in the reference grid, the regression coefficients "bhat"; the variance-covariance matrix "V"; a matrix "nbasis" for non-estimable functions; a function "dffun(k,dfargs)" for computing degrees of freedom for the linear function "sum(k*bhat)"; and a list "dfargs" of arguments to pass to "dffun". To write your own "lsm.basis" function, examining some of the existing methods can help; but the best resource is the "predict" method for the object in question, looking carefully to see what it does to predict values for a new set of predictors (e.g., "newdata" in "predict.lm"). Following this advice, let's take a look at it: <<>>= MASS:::predict.lqs @ \RecustomVerbatimEnvironment{Sinput}{Verbatim}{numbers=left} Based on this, here is a listing of an "lsm.basis" method for "lqs" objects: <<>>= lsm.basis.lqs = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = coef(object) Xmat = model.matrix(trms, data=object$model) V = rev(object$scale)[1]^2 * solve(t(Xmat) %*% Xmat) nbasis = matrix(NA) dfargs = list(df = nrow(Xmat) - ncol(Xmat)) dffun = function(k, dfargs) dfargs$df list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs) } @ \RecustomVerbatimEnvironment{Sinput}{Verbatim}{numbers=none} Before explaining it, let's verify that it works: <<>>= lsmeans(fake.lts, ~ B | A) @ Hooray! Note the results are comparable to those we had for "fake.rlm", albeit the standard errors are quite a bit smaller. (In fact, the SEs could be misleading; a better method for estimating covariances should probably be implemented, but that is beyond the scope of this vignette.) \subsection{Dissecting \code{lsm.basis.lqs}} Let's go through the listing of this method, by line numbers. \begin{itemize} \item[2--3:] Construct the linear functions, "X". This is a pretty standard standard two-step process: First obtain a model frame, "m", for the grid of predictors, then pass it as data to "model.data" to create the associated design matrix. As promised, this code is essentially identical to what you find in "predict.lqs". \item[4:] Obtain the coefficients, "bhat". Most model objects have a "coef" method. \item[5--6:] Obtain the covariance matrix, "V", of "bhat". In many models, this can be obtained using the object's "vcov" method. But not in this case. Instead, I cobbled one together using what it would be for ordinary regression: $\hat\sigma^2(\mathbf{X}'\mathbf{X})^{-1}$, where $\mathbf{X}$ is the design matrix for the whole dataset (not the reference grid). Here, $\hat\sigma$ is obtained using the last element of the "scale" element of the object (depending on the method, there are one or two scale estimates). This probably under-estimates the variances and distorts the covariances, because robust estimators have some efficiency loss. \item[7:] Compute the basis for non-estimable functions. This applies only when there is a possibility of rank deficiency in the model, and "lqs" methods cannot handle that. All linear functions are estimable, and we signal that by setting "nbasis" equal to a $1\times1$ matrix of "NA". If rank deficiency were possible, the \pkg{estimability} package (which is required by \lsm{}) provides a "nonest.basis" function that makes this fairly painless---I would have coded: <>= nbasis = estimability::nonest.basis(Xmat) @ On the other hand, if rank-deficient cases are not possible, set "nbasis" equal to "all.estble", a constant in the \pkg{estimability} package. There is a subtlety you need to know regarding estimability. Suppose the model is rank-deficient, so that the design matrix $\mathbf{X}$ has $p$ columns but rank $r>= lsm.basis.lqs = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = coef(object) V = diag(rep(NA, length(bhat))) nbasis = matrix(NA) dffun = function(k, dfargs) NA list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=list()) } %@ And here is a test: %<<>>= lsmeans(fake.lts, pairwise ~ B) %@ \fi % ----------- end of cut --------------------------- \section{Hook functions} Most linear models supported by \lsm{} have straightforward structure: Regression coefficients, their covaraince matrix, and a set of linear functions that define the reference grid. However, a few are more complex. An example is the \dqt{clm} class in the \pkg{ordinal} package, which allows a scale model in addition to the location model. When a scale model is used, the scale parameters are included in the model matrix, regression coefficients, and covariance matrix, and we can't just use the usual matrix operations to obtain estimates and standard errors. To facilitate using custom routines for these tasks, the "lsm.basis.clm" function includes, in its "misc" part, the names (as character constants) of two ``hook'' functions: "misc$estHook" has the name of the function to call when computing estimates, standard errors, and degrees of freedom (for the"summary" method); and "misc$vcovHook" has the name of the function to call to obtain the covariance matrix of the grid values (used by the "vcov" method). These functions are called in lieu of the usual built-in routines for these purposes, and return the appropriately sized matrices. In addition, you may want to apply some form of special post-processing after the reference grid is constructed. To provide for this, give the name of your function to post-process the object in "misc$postGridHook". Again, \dqt{clm} objects (as well as \dqt{polr} in the \pkg{MASS} package) serve as an example. They allow a "mode" specification that in twio cases, calls for post-processing. The \dqt{cum.prob} mode uses the "regrid" function to transform the linear predictor to the cumulative-probability scale. And the \dqt{prob} mode performs this, as well as applying the contrasts necessary to difference the cumulative probabilities into the class probabilities. \section{Exported methods} For package developers' convenience, \pkg{lsmeans} exports some of its S3 methods for "recover.data" and/or "lsm.basis"---use \code{methods(\dqt{recover.data})} and \code{methods(\dqt{lsm.basis})} to discover which ones. It may be that all you need is to invoke one of those methods and perhaps make some small changes---especially if your model-fitting algorithm makes heavy use of an existing model type supported by \pkg{lsmeans}. Contact me if you need \pkg{lsmeans} to export some additional methods for your use. A few additional functions are exported because they may be useful to developers. They are as follows: \begin{description} \item[\code{.all.vars(expr, retain)}] Some users of your package may include "$" or "[[]]" operators in their model formulas. If you need to get the variable names, "base::all.vars" will probably not give you what you need. Here is an example: <<>>= form = ~ data$x + data[[5]] base::all.vars(form) lsmeans::.all.vars(form) @ The "retain" argument may be used to specify regular expressions for patterns to retain as parts of variable names. \item[\code{.diag(x, nrow, ncol)}] The base "diag" function has a booby trap whereby, for example, "diag(57.6)" returns a $57\times 57$ identity matrix rather than a $1\times1$ matrix with $57.6$ as its only element. But "lsmeans::.diag(57.6)" will return the latter. The function works identically to "diag" except for the identity-matrix trap. \item[\code{.aovlist.dffun(k, dfargs)}] This function is exported because it is needed for computing degrees of freedom for models fitted using "aov", but it may be useful for other cases where Satterthwaite degrees-of-freedom calculations are needed. It requires the "dfargs" slot to contain analogous contents. \item[\code{.get.offset(terms, grid)}] If "terms" is a model formula containing an "offset" call, this is will compute that offset in the context of "grid" (a "data.frame"). <<>>= .get.offset(terms(~ speed + offset(.03*breaks)), head(warpbreaks)) @ \item[\code{.my.vcov(object, ...)}] In a call to "ref.grid", "lsmeans", etc., the user may use "vcov." to specify an alternative function or matrix to use as the covariance matrix of the fixed-effects coefficients. This function supports that feature. Calling ".my.vcov" in place of the "vcov" method will substitute the user's "vcov." when it is present in "...". \end{description} \section{Conclusions} It is relatively simple to write appropriate methods that work with \lsm{} for model objects it does not support. I hope this vignette is helpful for understanding how. Furthermore, if you are the developer of a package that fits linear models, I encourage you to include "recover.data" and "lsm.basis" methods for those classes of objects, and to remember to export them in your "NAMESPACE" file as follows: \begin{verbatim} S3method(myobject, recover.data) S3method(myobject, lsm.basis) \end{verbatim} \end{document}lsmeans/inst/doc/extending.R0000644000175100001440000000751712634421563015604 0ustar hornikusers### R code from vignette source 'extending.rnw' ################################################### ### code chunk number 1: extending.rnw:40-42 ################################################### options(show.signif.stars=FALSE, prompt="R> ", continue=" ") set.seed(271828) ################################################### ### code chunk number 2: extending.rnw:53-54 (eval = FALSE) ################################################### ## help("extending-lsmeans", package="lsmeans") ################################################### ### code chunk number 3: extending.rnw:62-66 ################################################### fake = expand.grid(rep = 1:5, A = c("a1","a2"), B = c("b1","b2","b3")) fake$y = c(11.46,12.93,11.87,11.01,11.92,17.80,13.41,13.96,14.27,15.82, 23.14,23.75,-2.09,28.43,23.01,24.11,25.51,24.11,23.95,30.37, 17.75,18.28,17.82,18.52,16.33,20.58,20.55,20.77,21.21,20.10) ################################################### ### code chunk number 4: extending.rnw:72-77 ################################################### library(MASS) fake.rlm = rlm(y ~ A * B, data = fake) library(lsmeans) lsmeans(fake.rlm, ~B | A) ################################################### ### code chunk number 5: extending.rnw:83-84 ################################################### fake.lts = ltsreg(y ~ A * B, data = fake) ################################################### ### code chunk number 6: extending.rnw:89-90 ################################################### lsmeans:::recover.data.lm ################################################### ### code chunk number 7: extending.rnw:93-94 ################################################### recover.data.lqs = lsmeans:::recover.data.lm ################################################### ### code chunk number 8: extending.rnw:97-99 ################################################### rec.fake = recover.data(fake.lts) head(rec.fake) ################################################### ### code chunk number 9: extending.rnw:113-114 ################################################### args(lsmeans:::lsm.basis.lm) ################################################### ### code chunk number 10: extending.rnw:121-122 ################################################### MASS:::predict.lqs ################################################### ### code chunk number 11: extending.rnw:126-137 ################################################### lsm.basis.lqs = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = coef(object) Xmat = model.matrix(trms, data=object$model) V = rev(object$scale)[1]^2 * solve(t(Xmat) %*% Xmat) nbasis = matrix(NA) dfargs = list(df = nrow(Xmat) - ncol(Xmat)) dffun = function(k, dfargs) dfargs$df list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs) } ################################################### ### code chunk number 12: extending.rnw:141-142 ################################################### lsmeans(fake.lts, ~ B | A) ################################################### ### code chunk number 13: extending.rnw:153-154 (eval = FALSE) ################################################### ## nbasis = estimability::nonest.basis(Xmat) ################################################### ### code chunk number 14: extending.rnw:194-197 ################################################### form = ~ data$x + data[[5]] base::all.vars(form) lsmeans::.all.vars(form) ################################################### ### code chunk number 15: extending.rnw:204-205 ################################################### .get.offset(terms(~ speed + offset(.03*breaks)), head(warpbreaks)) lsmeans/inst/doc/using-lsmeans.R0000644000175100001440000004603712634421563016404 0ustar hornikusers### R code from vignette source 'using-lsmeans.rnw' ################################################### ### code chunk number 1: using-lsmeans.rnw:49-51 ################################################### options(show.signif.stars=FALSE, prompt="R> ", continue=" ", useFancyQuotes=FALSE, width=100, digits=6) ################################################### ### code chunk number 2: using-lsmeans.rnw:135-138 ################################################### library("lsmeans") oranges.lm1 <- lm(sales1 ~ price1 + price2 + day + store, data = oranges) anova(oranges.lm1) ################################################### ### code chunk number 3: using-lsmeans.rnw:141-142 ################################################### ( oranges.rg1 <- ref.grid(oranges.lm1) ) ################################################### ### code chunk number 4: using-lsmeans.rnw:145-146 ################################################### summary(oranges.rg1) ################################################### ### code chunk number 5: using-lsmeans.rnw:151-152 ################################################### lsmeans(oranges.rg1, "day") ## or lsmeans(oranges.lm1, "day") ################################################### ### code chunk number 6: using-lsmeans.rnw:155-156 ################################################### with(oranges, tapply(sales1, day, mean)) ################################################### ### code chunk number 7: using-lsmeans.rnw:165-167 ################################################### lsmeans(oranges.lm1, "day", at = list(price1 = 50, price2 = c(40,60), day = c("2","3","4")) ) ################################################### ### code chunk number 8: using-lsmeans.rnw:176-179 ################################################### org.lsm <- lsmeans(oranges.lm1, "day", by = "price2", at = list(price1 = 50, price2 = c(40,60), day = c("2","3","4")) ) org.lsm ################################################### ### code chunk number 9: using-lsmeans.rnw:182-185 (eval = FALSE) ################################################### ## lsmeans(oranges.lm1, ~ day | price, at = ... ) # Ex 1 ## lsmeans(oranges.lm1, c("day","price2"), at = ... ) # Ex 2 ## lsmeans(oranges.lm1, ~ day * price, at = ... ) # Ex 3 ################################################### ### code chunk number 10: using-lsmeans.rnw:195-196 ################################################### str(org.lsm) ################################################### ### code chunk number 11: using-lsmeans.rnw:202-204 ################################################### ( org.sum <- summary(org.lsm, infer = c(TRUE,TRUE), level = .90, adjust = "bon", by = "day") ) ################################################### ### code chunk number 12: using-lsmeans.rnw:209-210 ################################################### class(org.sum) ################################################### ### code chunk number 13: using-lsmeans.rnw:214-215 ################################################### transform(org.sum, lsrubles = lsmean * 34.2) ################################################### ### code chunk number 14: using-lsmeans.rnw:223-225 ################################################### org.lsm2 <- update(org.lsm, by.vars = NULL, level = .99) org.lsm2 ################################################### ### code chunk number 15: org-plot ################################################### plot(org.lsm, by = "price2") ################################################### ### code chunk number 16: using-lsmeans.rnw:247-248 ################################################### contrast(org.lsm, method = "eff") ################################################### ### code chunk number 17: using-lsmeans.rnw:253-255 ################################################### days.lsm <- lsmeans(oranges.rg1, "day") ( days_contr.lsm <- contrast(days.lsm, "trt.vs.ctrl", ref = c(5,6)) ) ################################################### ### code chunk number 18: using-lsmeans.rnw:260-261 (eval = FALSE) ################################################### ## confint(contrast(days.lsm, "trt.vs.ctrlk")) ################################################### ### code chunk number 19: using-lsmeans.rnw:269-270 ################################################### pairs(org.lsm) ################################################### ### code chunk number 20: using-lsmeans.rnw:273-274 ################################################### cld(days.lsm, alpha = .10) ################################################### ### code chunk number 21: days-cmp ################################################### plot(days.lsm, comparisons = TRUE, alpha = .10) ################################################### ### code chunk number 22: using-lsmeans.rnw:297-298 ################################################### rbind(pairs(org.lsm)[1:3], pairs(org.lsm, by = "day")[1]) ################################################### ### code chunk number 23: using-lsmeans.rnw:303-304 ################################################### rbind(pairs(lsmeans(org.lsm, "day")), pairs(lsmeans(org.lsm, "price2"))) ################################################### ### code chunk number 24: using-lsmeans.rnw:310-313 ################################################### oranges.mlm <- lm(cbind(sales1,sales2) ~ price1 + price2 + day + store, data = oranges) ref.grid(oranges.mlm) ################################################### ### code chunk number 25: using-lsmeans.rnw:316-318 ################################################### org.mlsm <- lsmeans(oranges.mlm, ~ day | variety, mult.name = "variety") cld(org.mlsm, sort = FALSE) ################################################### ### code chunk number 26: using-lsmeans.rnw:326-327 ################################################### org.vardiff <- update(pairs(org.mlsm, by = "day"), by = NULL) ################################################### ### code chunk number 27: using-lsmeans.rnw:330-331 ################################################### cld(org.vardiff) ################################################### ### code chunk number 28: using-lsmeans.rnw:342-344 ################################################### # Ensure we see the same results each time set.seed(123454321) ################################################### ### code chunk number 29: using-lsmeans.rnw:346-349 ################################################### library("multcomp") days.glht <- as.glht(days_contr.lsm) summary(days.glht, test = adjusted("Westfall")) ################################################### ### code chunk number 30: using-lsmeans.rnw:352-354 (eval = FALSE) ################################################### ## days.glht1 <- glht(oranges.lm1, ## lsm("day", contr = "trt.vs.ctrl", ref = c(5,6))) ################################################### ### code chunk number 31: using-lsmeans.rnw:358-360 (eval = FALSE) ################################################### ## summary(days_contr.lsm, adjust = "mvt") ## summary(days.glht) ################################################### ### code chunk number 32: using-lsmeans.rnw:366-367 (eval = FALSE) ################################################### ## summary(as.glht(pairs(org.lsm))) ################################################### ### code chunk number 33: using-lsmeans.rnw:370-371 (eval = FALSE) ################################################### ## summary(as.glht(pairs(org.lsm), by = NULL)) ################################################### ### code chunk number 34: using-lsmeans.rnw:374-375 (eval = FALSE) ################################################### ## summary(as.glht(pairs(org.lsm, by = NULL))) ################################################### ### code chunk number 35: using-lsmeans.rnw:387-392 ################################################### data("Oats", package = "nlme") library("lme4") Oats.lmer <- lmer(log(yield) ~ Variety*factor(nitro) + (1|Block/Variety), data = Oats) anova(Oats.lmer) ################################################### ### code chunk number 36: oatcontr (eval = FALSE) ################################################### ## contrast(lsmeans(Oats.lmer, "nitro"), "poly") ################################################### ### code chunk number 37: using-lsmeans.rnw:399-400 ################################################### cat("NOTE: Results may be misleading due to involvement in interactions") ################################################### ### code chunk number 38: using-lsmeans.rnw:402-403 ################################################### contrast(lsmeans(Oats.lmer, "nitro"), "poly") ################################################### ### code chunk number 39: using-lsmeans.rnw:406-408 ################################################### Oats.lmer2 <- lmer(log(yield) ~ Variety + poly(nitro,2) + (1|Block/Variety), data = Oats) ################################################### ### code chunk number 40: using-lsmeans.rnw:411-413 ################################################### Oats.lsm2 <- lsmeans(Oats.lmer2, ~ nitro | Variety, cov.reduce = FALSE) Oats.lsm2 ################################################### ### code chunk number 41: oatslmer ################################################### lsmip(Oats.lmer, Variety ~ nitro, ylab = "Observed log(yield)") ################################################### ### code chunk number 42: oatslmer2 ################################################### lsmip(Oats.lsm2, Variety ~ nitro, ylab = "Predicted log(yield)") ################################################### ### code chunk number 43: using-lsmeans.rnw:454-455 ################################################### str(Oats.lsm2) ################################################### ### code chunk number 44: using-lsmeans.rnw:458-459 ################################################### summary(Oats.lsm2, type = "response") ################################################### ### code chunk number 45: using-lsmeans.rnw:475-477 ################################################### Oats.Vlsm = lsmeans(Oats.lmer2, "Variety") test(Oats.Vlsm, null = log(100), type = "response") ################################################### ### code chunk number 46: using-lsmeans.rnw:489-490 ################################################### test(Oats.Vlsm, null = log(100), delta = 0.20, type = "r") ################################################### ### code chunk number 47: using-lsmeans.rnw:496-497 ################################################### test(contrast(Oats.Vlsm, "trt.vs.ctrlk"), side = ">") ################################################### ### code chunk number 48: using-lsmeans.rnw:500-501 ################################################### test(contrast(Oats.Vlsm, "trt.vs.ctrlk"), side = "nonsup", delta = .25) ################################################### ### code chunk number 49: chick-plot ################################################### require("lattice") xyplot(weight~Time | Diet, groups = ~ Chick, data = ChickWeight, type = "o", layout=c(4, 1)) ################################################### ### code chunk number 50: using-lsmeans.rnw:522-524 ################################################### Chick.lmer <- lmer(weight ~ Diet * Time + (0 + Time | Chick), data = ChickWeight) ################################################### ### code chunk number 51: using-lsmeans.rnw:527-528 ################################################### ( Chick.lst <- lstrends (Chick.lmer, ~ Diet, var = "Time") ) ################################################### ### code chunk number 52: using-lsmeans.rnw:531-532 ################################################### cld (Chick.lst) ################################################### ### code chunk number 53: using-lsmeans.rnw:543-546 ################################################### lsm.options(ref.grid = list(level = .90), lsmeans = list(), contrast = list(infer = c(TRUE, TRUE))) ################################################### ### code chunk number 54: using-lsmeans.rnw:551-552 ################################################### get.lsm.option("estble.tol") ################################################### ### code chunk number 55: using-lsmeans.rnw:563-564 ################################################### lsmeans(Oats.lmer2, pairwise ~ Variety) ################################################### ### code chunk number 56: using-lsmeans.rnw:568-569 ################################################### lsm.options(ref.grid = NULL, contrast = NULL) ################################################### ### code chunk number 57: using-lsmeans.rnw:579-582 ################################################### nutr.lm <- lm(gain ~ (age + group + race)^2, data = nutrition) library("car") Anova(nutr.lm) ################################################### ### code chunk number 58: nutr-intplot ################################################### lsmip(nutr.lm, race ~ age | group) lsmeans(nutr.lm, ~ group*race) ################################################### ### code chunk number 59: using-lsmeans.rnw:599-601 ################################################### nutr.lsm <- lsmeans(nutr.lm, ~ group * race, weights = "proportional", at = list(age = c("2","3"), race = c("Black","White"))) ################################################### ### code chunk number 60: using-lsmeans.rnw:604-607 ################################################### nutr.lsm summary(pairs(nutr.lsm, by = "race"), by = NULL) summary(pairs(nutr.lsm, by = "group"), by = NULL) ################################################### ### code chunk number 61: using-lsmeans.rnw:620-624 ################################################### lsmeans(nutr.lm, "race", weights = "equal") lsmeans(nutr.lm, "race", weights = "prop") lsmeans(nutr.lm, "race", weights = "outer") lsmeans(nutr.lm, "race", weights = "cells") ################################################### ### code chunk number 62: using-lsmeans.rnw:633-635 ################################################### temp = lsmeans(nutr.lm, c("group","race"), weights = "prop") lsmeans(temp, "race", weights = "prop") ################################################### ### code chunk number 63: using-lsmeans.rnw:640-641 ################################################### with(nutrition, tapply(gain, race, mean)) ################################################### ### code chunk number 64: using-lsmeans.rnw:648-652 ################################################### library("mediation") levels(framing$educ) = c("NA","Ref","< HS", "HS", "> HS","Coll +") framing.glm = glm(cong_mesg ~ age + income + educ + emo + gender * factor(treat), family = binomial, data = framing) ################################################### ### code chunk number 65: framinga ################################################### lsmip(framing.glm, treat ~ educ | gender, type = "response") ################################################### ### code chunk number 66: framingb ################################################### lsmip(framing.glm, treat ~ educ | gender, type = "response", cov.reduce = emo ~ treat*gender + age + educ + income) ################################################### ### code chunk number 67: using-lsmeans.rnw:679-681 ################################################### ref.grid(framing.glm, cov.reduce = emo ~ treat*gender + age + educ + income)@grid ################################################### ### code chunk number 68: using-lsmeans.rnw:712-714 (eval = FALSE) ################################################### ## rg <- ref.grid(my.model, at = list(x1 = c(5,10,15)), ## cov.reduce = list(x2 ~ x1, x3 ~ x1 + x2)) ################################################### ### code chunk number 69: housing-plot ################################################### library("ordinal") data(housing, package = "MASS") housing.clm <- clm(Sat ~ (Infl + Type + Cont)^2, data = housing, weights = Freq, link = "probit") lsmip(housing.clm, Cont ~ Infl | Type, layout = c(4,1)) ################################################### ### code chunk number 70: using-lsmeans.rnw:759-760 ################################################### test(pairs(lsmeans(housing.clm, ~ Infl | Type)), joint = TRUE) ################################################### ### code chunk number 71: using-lsmeans.rnw:763-764 ################################################### test(pairs(lsmeans(housing.clm, ~ Cont | Type)), joint = TRUE) ################################################### ### code chunk number 72: using-lsmeans.rnw:769-770 ################################################### ref.grid(housing.clm, mode = "cum.prob") ################################################### ### code chunk number 73: using-lsmeans.rnw:773-775 ################################################### lsmeans(housing.clm, ~ Infl, at = list(cut = "Medium|High"), mode = "cum.prob") ################################################### ### code chunk number 74: using-lsmeans.rnw:778-780 ################################################### summary(lsmeans(housing.clm, ~ Infl, at = list(cut = "Medium|High"), mode = "linear.predictor"), type = "response") ################################################### ### code chunk number 75: using-lsmeans.rnw:788-796 ################################################### require("nlme") options(contrasts = c("contr.treatment", "contr.poly")) Chick.nlme = nlme(weight ~ SSlogis(Time, asym, xmid, scal), data = ChickWeight, fixed = list(asym + xmid ~ Diet, scal ~ 1), random = asym ~ 1 | Chick, start = c(200, 100, 200, 100, 10, 0, 0, 0, 7)) Chick.nlme ################################################### ### code chunk number 76: using-lsmeans.rnw:799-801 ################################################### cld(lsmeans(Chick.nlme, ~ Diet, param = "asym")) cld(lsmeans(Chick.nlme, ~ Diet, param = "xmid")) ################################################### ### code chunk number 77: using-lsmeans.rnw:813-818 ################################################### library("MCMCpack") counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) outcome <- gl(3, 1, 9) treatment <- gl(3, 3) posterior <- MCMCpoisson(counts ~ outcome + treatment, mcmc = 1000) ################################################### ### code chunk number 78: using-lsmeans.rnw:821-822 ################################################### ( post.lsm <- lsmeans(posterior, "treatment") ) ################################################### ### code chunk number 79: using-lsmeans.rnw:825-827 ################################################### library("coda") summary(as.mcmc(post.lsm)) lsmeans/inst/doc/using-lsmeans.rnw0000644000175100001440000016664312634421563017017 0ustar hornikusers\documentclass[11pt]{article} \usepackage[margin=1in]{geometry} \usepackage{mathpazo} \usepackage{hyperref} \usepackage{fancyvrb} \usepackage{multicol} \usepackage{natbib} \usepackage{Sweave} \hypersetup{colorlinks=true,allcolors=black,urlcolor=blue} \let\dq=" \DefineShortVerb{\"} \def\pkg{\textbf} \def\proglang{\textsf} \def\lsm{\pkg{lsmeans}} % double-quoted text \def\dqt#1{\code{\dq{}#1\dq{}}} % The objects I want to talk about \def\rg{\dqt{ref.grid}} \def\lsmo{\dqt{lsmobj}} % for use in place of \item in a description env where packages are listed \def\pitem#1{\item[\pkg{#1}]} \def\R{\proglang{R}} \def\SAS{\proglang{SAS}} \def\code{\texttt} \def\Fig#1{Figure~\ref{#1}} \def\bottomfraction{.5} %\VignetteIndexEntry{Using lsmeans} %\VignetteDepends{lsmeans} %\VignetteKeywords{least-squares means} %\VignettePackage{lsmeans} % Initialization <>= options(show.signif.stars=FALSE, prompt="R> ", continue=" ", useFancyQuotes=FALSE, width=100, digits=6) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Russell V.~Lenth\\The University of Iowa} \title{Using \lsm{}} %% without formatting \ifx %xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %% for pretty printing and a nice hypersummary also set: \Plainauthor{Russell V.~Lenth} %% comma-separated \Plaintitle{Least-squares Means: The R Package lsmeans} %% without formatting \Shorttitle{The R Package lsmeans} %% a short title (if necessary) \fi %xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ifx % IGNORE xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %% The address of (at least) one author should be given %% in the following format: \Address{ Russell V.~Lenth, Professor Emeritus\\ Department of Statistics and Actuarial Science\\ % 241 Schaeffer Hall\\ The University of Iowa\\ Iowa City, IA 52242 ~ USA\\ E-mail: \email{russell-lenth@uiowa.edu} %\\ % URL: \url{http://www.stat.uiowa.edu/~rlenth/} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 \fi %xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \SweaveOpts{concordance=TRUE} \maketitle{} \begin{abstract} Least-squares means are predictions from a linear model, or averages thereof. They are useful in the analysis of experimental data for summarizing the effects of factors, and for testing linear contrasts among predictions. The \lsm{} package provides a simple way of obtaining least-squares means and contrasts thereof. It supports many models fitted by \R{} core packages (as well as a few key contributed ones) that fit linear or mixed models, and provides a simple way of extending it to cover more model classes. \end{abstract} \section{Introduction} Least-squares means (LS~means for short) for a linear model are simply predictions---or averages thereof---over a regular grid of predictor settings which I call the \emph{reference grid}. They date back at least to \cite{Har60} and his associated computer program \proglang{LSML} \citep{Har77} and the contributed \SAS{} procedure named \pkg{HARVEY} \citep{Har76}. Later, they were incorporated via \code{LSMEANS} statements for various linear model procedures such as \pkg{GLM} in the regular \SAS{} releases. See also \cite{Goo97} and \cite{SAS12} for more information about the \SAS{} implementation. In simple analysis-of-covariance models, LS~means are the same as covariate-adjusted means. In unbalanced factorial experiments, LS~means for each factor mimic the main-effects means but are adjusted for imbalance. The latter interpretation is quite similar to the ``unweighted means'' method for unbalanced data, as presented in old design books. LS~means are not always well understood, in part because the term itself is confusing. \cite{Sea80} discusses exactly how they are defined for various factorial, nested, and covariance models. \citeauthor{Sea80} suggest the term ``predicted marginal means'' (or PMMs) as a better descriptor. However, the term ``least-squares means'' was already well established in the \SAS{} software, and it has stuck. The most important things to remember are: \begin{itemize} \item LS~means are computed relative to a \emph{reference grid}. \item Once the reference grid is established, LS~means are simply predictions on this grid, or marginal averages of a table of these predictions. \end{itemize} A user who understands these points will know what is being computed, and thus can judge whether or not LS~means are appropriate for the analysis. \section{The reference grid} Since the reference grid is fundamental, it is our starting point. For each predictor in the model, we define a set of one or more \emph{reference levels}. The reference grid is then the set of all combinations of reference levels. If not specified explicitly, the default reference levels are obtained as follows: \begin{itemize} \item For each predictor that is a factor, its reference levels are the unique levels of that factor. \item Each numeric predictor has just one reference level---its mean over the dataset. \end{itemize} So the reference grid depends on both the model and the dataset. \subsection{Example: Orange sales} To illustrate, consider the "oranges" data provided with \lsm{}. This dataset has sales of two varieties of oranges (response variables "sales1" and "sales2") at 6 stores (factor "store"), over a period of 6 days (factor "day"). The prices of the oranges (covariates "price1" and "price2") fluctuate in the different stores and the different days. There is just one observation on each store on each day. For starters, let's consider an additive covariance model for sales of the first variety, with the two factors and both "price1" and "price2" as covariates (since the price of the other variety could also affect sales). <<>>= library("lsmeans") oranges.lm1 <- lm(sales1 ~ price1 + price2 + day + store, data = oranges) anova(oranges.lm1) @ The "ref.grid" function in \lsm{} may be used to establish the reference grid. Here is the default one: <<>>= ( oranges.rg1 <- ref.grid(oranges.lm1) ) @ As outlined above, the two covariates "price1" and "price2" have their means as their sole reference level; and the two factors have their levels as reference levels. The reference grid thus consists of the $1\times1\times6\times6=36$ combinations of these reference levels. LS~means are based on predictions on this reference grid, which we can obtain using "predict" or "summary": <<>>= summary(oranges.rg1) @ \subsection{LS means as marginal averages over the reference grid} The ANOVA indicates there is a significant "day" effect after adjusting for the covariates, so we might want to do a follow-up analysis that involves comparing the days. The "lsmeans" function provides a starting point: <<>>= lsmeans(oranges.rg1, "day") ## or lsmeans(oranges.lm1, "day") @ These results, as indicated in the annotation in the output, are in fact the averages of the predictions shown earlier, for each day, over the 6 stores. The above LS~means are not the same as the overall means for each day: <<>>= with(oranges, tapply(sales1, day, mean)) @ These unadjusted means are not comparable with one another because they are affected by the differing "price1" and "price2" values on each day, whereas the LS~means are comparable because they use predictions at uniform "price1" and "price2" values. Note that one may call "lsmeans" with either the reference grid or the model. If the model is given, then the first thing it does is create the reference grid; so if the reference grid is already available, as in this example, it's more efficient to make use of it. \subsection{Altering the reference grid} The "at" argument may be used to override defaults in the reference grid. The user may specify this argument either in a "ref.grid" call or an "lsmeans" call; and should specify a "list" with named sets of reference levels. Here is a silly example: <<>>= lsmeans(oranges.lm1, "day", at = list(price1 = 50, price2 = c(40,60), day = c("2","3","4")) ) @ Here, we restricted the results to three of the days, and used different prices. One possible surprise is that the predictions are averaged over the two "price2" values. That is because "price2" is no longer a single reference level, and we average over the levels of all factors not used to split-out the LS~means. This is probably not what we want.\footnote{% The \emph{default} reference grid produces LS~means exactly as described in \cite{Sea80}. However, an altered reference grid containing more than one value of a covariate, such as in this example, departs from (or generalizes, if you please) their definition by averaging with equal weights over those covariate levels. It is not a good idea here, but there is an example later in this vignette where it makes sense.} To get separate sets of predictions for each "price2", one must specify it as another factor or as a "by" factor in the "lsmeans" call (we will save the result for later discussion): <<>>= org.lsm <- lsmeans(oranges.lm1, "day", by = "price2", at = list(price1 = 50, price2 = c(40,60), day = c("2","3","4")) ) org.lsm @ Note: We could have obtained the same results using any of these: <>= lsmeans(oranges.lm1, ~ day | price, at = ... ) # Ex 1 lsmeans(oranges.lm1, c("day","price2"), at = ... ) # Ex 2 lsmeans(oranges.lm1, ~ day * price, at = ... ) # Ex 3 @ Ex~1 illustrates the formula method for specifying factors, which is more compact. The "|" character replaces the "by" specification. Ex~2 and Ex~3 produce the same results, but their results are displayed as one table (with columns for "day" and "price") rather than as two separate tables. \section{Working with the results} \subsection{Objects} The "ref.grid" function produces an object of class \rg{}, and the "lsmeans" function produces an object of class \lsmo{}, which is a subclass of \rg. There is really no practical difference between these two classes except for their "show" methods---what is displayed by default---and the fact that an \lsmo{} is not (necessarily) a true reference grid as defined earlier in this article. Let's use the "str" function to examine the \lsmo{} object just produced: <<>>= str(org.lsm) @ We no longer see the reference levels for all predictors in the model---only the levels of "day" and "price2". These \emph{act} like reference levels, but they do not define the reference grid upon which the predictions are based. \subsection{Summaries} There are several methods for \rg{} (and hence also for \lsmo{}) objects. One already seen is "summary". It has a number of arguments---see its help page. In the following call, we summarize "days.lsm" differently than before. We will also save the object produced by "summary" for further discussion. <<>>= ( org.sum <- summary(org.lsm, infer = c(TRUE,TRUE), level = .90, adjust = "bon", by = "day") ) @ The "infer" argument causes both confidence intervals and tests to be produced; the default confidence level of $.95$ was overridden; a Bonferroni adjustment was applied to both the intervals and the $P$~values; and the tables are organized the opposite way from what we saw before. What kind of object was produced by "summary"? Let's see: <<>>= class(org.sum) @ The \dqt{summary.ref.grid} class is an extension of \dqt{data.frame}. It includes some attributes that, among other things, cause additional messages to appear when the object is displayed. But it can also be used as a \dqt{data.frame} if the user just wants to use the results computationally. For example, suppose we want to convert the LS~means from dollars to Russian rubles (at the July 13, 2014 exchange rate): {\small <<>>= transform(org.sum, lsrubles = lsmean * 34.2) @ } Observe also that the summary is just one data frame with six rows, rather than a collection of three data frames; and it contains a column for all reference variables, including any "by" variables. Besides "str" and "summary", there is also a "confint" method, which is the same as "summary" with "infer=c(TRUE,FALSE)", and a "test" method (same as "summary" with "infer=c(FALSE,TRUE)", by default). The "test" method may in addition be called with "joint=TRUE" to obtain a joint test that all or some of the linear functions are equal to zero or some other value. There is also an "update" method which may be used for changing the object's display settings. For example: <<>>= org.lsm2 <- update(org.lsm, by.vars = NULL, level = .99) org.lsm2 @ \subsection{Plots} Confidence intervals for LS~means may be displayed graphically, using the "plot" method. For example: <>= plot(org.lsm, by = "price2") @ The resulting display is shown in \Fig{org-plot}. This function requires that the \pkg{lattice} package be installed. \begin{figure} \begin{center} \includegraphics{using-lsmeans-org-plot.pdf} \end{center} \caption{Confidence intervals for LS~means in the \code{oranges} example.}\label{org-plot} \end{figure} \section{Contrasts and comparisons} \subsection{Contrasts in general} Often, people want to do pairwise comparisons of LS~means, or compute other contrasts among them. This is the purpose of the "contrast" function, which uses a \dqt{ref.grid} or \dqt{lsmobj} object as input. There are several standard contrast families such as \dqt{pairwise}, \dqt{trt.vs.ctrl}, and \dqt{poly}. In the following command, we request \dqt{eff} contrasts, which are differences between each mean and the overall mean: <<>>= contrast(org.lsm, method = "eff") @ Note that this preserves the "by" specification from before, and obtains the effects for each group. In this example, since it is an additive model, we obtain exactly the same results in each group. This isn't wrong, it's just redundant. Another popular method is Dunnett-style contrasts, where a particular LS~mean is compared with each of the others. This is done using \dqt{trt.vs.ctrl}. In the following, we obtain (again) the LS~means for days, and compare each with the average of the LS~means on day~5 and~6. <<>>= days.lsm <- lsmeans(oranges.rg1, "day") ( days_contr.lsm <- contrast(days.lsm, "trt.vs.ctrl", ref = c(5,6)) ) @ For convenience, \dqt{trt.vs.ctrl1} and \dqt{trt.vs.ctrlk} methods are provided for use in lieu of "ref" for comparing with the first and the last LS~means. The \dqt{dunnettx} adjustment is a good approximation to the exact Dunnett $P$~value adjustment. If the exact adjustment is desired, use "adjust = "\dqt{mvt}; but this can take a lot of computing time when there are several tests. Note that by default, "lsmeans" results are displayed with confidence intervals while "contrast" results are displayed with $t$ tests. One can easily override this; for example, <>= confint(contrast(days.lsm, "trt.vs.ctrlk")) @ (Results not shown.) In the above examples, a default multiplicity adjustment is determined from the contrast method. This may be overridden by adding an "adjust" argument. \subsection{Pairwise comparisons} Often, users want pairwise comparisons among the LS~means. These may be obtained by specifying \dqt{pairwise} or \dqt{revpairwise} as the "method" argument in the call to "contrast". For group labels $A,B,C$, \dqt{pairwise} generates the comparisons $A-B, A-C, B-C$ while \dqt{revpairwise} generates $B-A, C-A, C-B$. As a convenience, a "pairs" method is provided that calls "contrast" with "method="\dqt{pairwise}: <<>>= pairs(org.lsm) @ There is also a "cld" (compact letter display) method that lists the LS~means along with grouping symbols for pairwise contrasts. It requires the \pkg{multcompView} package \citep{mcview} to be installed. <<>>= cld(days.lsm, alpha = .10) @ Two LS~means that share one or more of the same grouping symbols are not significantly different at the stated value of "alpha", after applying the multiplicity adjustment (in this case Tukey's HSD). By default, the LS~means are ordered in this display, but this may be overridden with the argument "sort=FALSE". "cld" returns a \dqt{summary.ref.grid} object, not an "lsmobj". Another way to display pairwise comparisons is via the "comparisons" argument of "plot". When this is set to "TRUE", arrows are added to the plot, with lengths set so that the amount by which they overlap (or don't overlap) matches as closely as possible to the amounts by which corresponding confidence intervals for differences cover (or don't cover) the value zero. This does not always work, and if there are discrepancies, a message is printed. But it usually works. <>= plot(days.lsm, comparisons = TRUE, alpha = .10) @ \Fig{days-cmp} shows the result. Note that the pairs of means having overlapping arrows are the same as those grouped together in the "cld" display. However, these comparison arrows show more about the degree of significance in the comparisons. The lowest and highest LS~mean have arrows pointing only inward, as the others are not needed. If the confidence intervals and arrows together look too cluttered, one can add the argument \code{intervals = FALSE}, then only the arrows will be displayed. \begin{figure} \begin{center} \includegraphics{using-lsmeans-days-cmp.pdf} \end{center} \caption{Graphical comparisons of the LS~means for \code{days}.}\label{days-cmp} \end{figure} \subsection{Multiplicity adjustments---changing the family} You may have noticed that in the preceding examples where $P$-value adjustments were implemented, those adjustments were made \emph{separately} for each sub-table when a "by" variable is active. Some users prefer that all the adjusted tests together as one family---or even combine more than one family of tests into one family for purposes of adjustment. This may be done using the "rbind" method (similar to using "rbind" to combine matrices. On the flip side, perhaps we want to exclude some tests. This may be used using the "[]" operator: simply specify the row indexes of the tests to include. To illustrate, consider the previously obtained "org.lsm" object. In "pairs(org.lsm)", we obtain the same results twice (as seen above) because the model is additive. For the same reason, if we change the "by" variable to \dqt{day}, we'll obtain three copies of the same comparison of the two "price2"s. If we want to consider the three "day" comparisons and the one "price2" comparison together as one family of four tests, we can do: <<>>= rbind(pairs(org.lsm)[1:3], pairs(org.lsm, by = "day")[1]) @ Note that by default, the \dqt{mvt} adjustment level is used; for complicated families like this, ordinary Tukey and Dunnett adjustments are usually not appropriate. We arrived at this point by a circuitous path. In the additive model, the above conditional results are the same as the marginal ones: <<>>= rbind(pairs(lsmeans(org.lsm, "day")), pairs(lsmeans(org.lsm, "price2"))) @ \section{Multivariate models} The "oranges" data has two response variables. Let's try a multivariate model for predicting the sales of the two varieties of oranges, and see what we get if we call "ref.grid": <<>>= oranges.mlm <- lm(cbind(sales1,sales2) ~ price1 + price2 + day + store, data = oranges) ref.grid(oranges.mlm) @ What happens is that the multivariate response is treated like an additional factor, by default named "rep.meas". In turn, it can be used to specify levels for LS~means. Here we rename the multivariate response to \dqt{variety} and obtain "day" means (and a compact letter display for comparisons thereof) for each "variety": <<>>= org.mlsm <- lsmeans(oranges.mlm, ~ day | variety, mult.name = "variety") cld(org.mlsm, sort = FALSE) @ \section{Contrasts of contrasts} With the preceding model, we might want to compare the two varieties on each day: <<>>= org.vardiff <- update(pairs(org.mlsm, by = "day"), by = NULL) @ The results (not yet shown) will comprise the six "sales1-sales2" differences, one for each day. The two "by" specifications seems odd, but the one in "pairs" specifies doing a separate comparison for each day, and the one in "update" asks that we convert it to one table with six rows, rather than 6 tables with one row each. Now, let's compare these differences to see if they vary from day to day. <<>>= cld(org.vardiff) @ There is little evidence of variety differences, nor that these differences vary from day to day. \section[Interfacing with multcomp]{Interfacing with \pkg{multcomp}} The \pkg{multcomp} package \citep{multc} supports more options for simultaneous inference than are available in \lsm{}. Its "glht" (general linear hypothesis testing) function and associated \dqt{glht} class are similar in some ways to "lsmeans" and \dqt{lsmobj} objects, respectively. So \lsm{} provides an "as.glht" function to do the conversion. To illustrate, let us convert the "days_contr.lsm" object (produced earlier) to a "glht" object, and use it to obtain adjusted $P$~values under Westfall's adjustment procedure (not available in \lsm{}): <>= # Ensure we see the same results each time set.seed(123454321) @ <<>>= library("multcomp") days.glht <- as.glht(days_contr.lsm) summary(days.glht, test = adjusted("Westfall")) @ In addition, \lsm{} provides an "lsm" function that may be called from within a call to "glht". Thus, another way to obtain the same "glht" object is to use <>= days.glht1 <- glht(oranges.lm1, lsm("day", contr = "trt.vs.ctrl", ref = c(5,6))) @ By the way, the following two statements will produce the same results: <>= summary(days_contr.lsm, adjust = "mvt") summary(days.glht) @ That is, the \dqt{mvt} adjust method in \lsm{} is the same as the default single-step $P$~value adjustment in \pkg{multcomp}. One additional detail: If there is a "by" variable in effect, "glht" or "as.glht" returns a "list" of "glht" objects---one for each "by" level. There is a courtesy "summary" method for this \dqt{glht.list} class to make things a bit more user-friendly. Recall the earlier example result "org.lsm", which contains information for LS~means for three "day"s at each of two values of "price2". Suppose we are interested in pairwise comparisons of these LS~means, by "price2". If we call <>= summary(as.glht(pairs(org.lsm))) @ (results not displayed) we will obtain two "glht" objects with three contrasts each, so that the results shown will incorporate multiplicity adjustments for each family of three contrasts. If, on the other hand, we want to consider those six contrasts as one family, use <>= summary(as.glht(pairs(org.lsm), by = NULL)) @ \ldots{} and note (look carefully at the parentheses) that this is \emph{not} the same as <>= summary(as.glht(pairs(org.lsm, by = NULL))) @ which removes the "by" grouping \emph{before} the pairwise comparisons are generated, thus yielding ${6 \choose 2}=15$ contrasts instead of just six. \section{A new example: Oat yields} Orange-sales illustrations are probably getting tiresome. To illustrate some new features, let's turn to a new example. The "Oats" dataset in the \pkg{nlme} package \citep{nlme} has the results of a split-plot experiment discussed in \citet{Yat35}. The experiment was conducted on six blocks (factor "Block"). Each block was divided into three plots, which were randomized to three varieties (factor "Variety") of oats. Each plot was divided into subplots and randomized to four levels of nitrogen (variable "nitro"). The response, "yield", was measured once on each subplot after a suitable growing period. We will fit a model using the "lmer" function in the \pkg{lme4} package \citep{lme4}. This will be a mixed model with random intercepts for "Block" and "Block:Variety" (which identifies the plots). A logarithmic transformation is applied to the response variable (mostly for illustration purposes, though it does produce a good fit to the data). Note that "nitro" is stored as a numeric variable, but we want to consider it as a factor in this initial model. <<>>= data("Oats", package = "nlme") library("lme4") Oats.lmer <- lmer(log(yield) ~ Variety*factor(nitro) + (1|Block/Variety), data = Oats) anova(Oats.lmer) @ Apparently, the interaction is not needed. But perhaps we can further simplify the model by using only a linear or quadratic trend in "nitro". We can find out by looking at polynomial contrasts: <>= contrast(lsmeans(Oats.lmer, "nitro"), "poly") @ %%% Fake the warning message <>= cat("NOTE: Results may be misleading due to involvement in interactions") @ <>= <> @ (A message is issued when we average over predictors that interact with those that delineate the LS~means. In this case, it is not a serious problem because the interaction is weak.) Both the linear and quadratic contrasts are pretty significant. All this suggests fitting an additive model where "nitro" is included as a numeric predictor with a quadratic trend. <<>>= Oats.lmer2 <- lmer(log(yield) ~ Variety + poly(nitro,2) + (1|Block/Variety), data = Oats) @ Remember that "nitro" is now used as a quantitative predictor. But for comparing with the previous model, we want to see predictions at the four unique "nitro" values rather than at the average of "nitro". This may be done using "at" as illustrated earlier, or a shortcut is to specify "cov.reduce" as "FALSE", which tells "ref.grid" to use all the unique values of numeric predictors. <<>>= Oats.lsm2 <- lsmeans(Oats.lmer2, ~ nitro | Variety, cov.reduce = FALSE) Oats.lsm2 @ These LS~means follow the same quadratic trend for each variety, but with different intercepts.\footnote{% This is the promised example where our generalization of \cite{Sea80}'s definition of LS~means makes sense. Suppose we want to compare the LS~means for \code{Variety} with those in the original model \code{Oats.lmer} where \code{nitro} was a factor, we want to average equally over the four \code{nitro} levels, even though \code{nitro} is a covariate in this second model.} Fractional degrees of freedom are displayed in these results. These are obtained from the \pkg{pbkrtest} package \citep{pbkrt}, and they use the Kenward-Rogers method. (The degrees of freedom for the polynomial contrasts were also obtained from \pkg{pbkrtest}, but the results turn out to be integers.) \section{Displaying LS means graphically} We have already seen the use of the "plot" function to display confidence intervals and/or comparison arrows. The \lsm{} package also includes a function "lsmip" that displays predictions in an interaction-plot-like manner. It uses a formula of the form \begin{Sinput} curve.factors ~ x.factors | by.factors \end{Sinput} This function also requires the \pkg{lattice} package. In the above formula, "curve.factors" specifies factor(s) used to delineate one displayed curve from another (i.e., groups in \pkg{lattice}'s parlance). "x.factors" are those whose levels are plotted on the horizontal axis. And "by.factors", if present, break the plots into panels. To illustrate, consider the first model we fitted to the "Oats" data. Let's do a graphical comparison of the two models we have fitted to the "Oats" data. <>= lsmip(Oats.lmer, Variety ~ nitro, ylab = "Observed log(yield)") @ \vspace{-12pt} <>= lsmip(Oats.lsm2, Variety ~ nitro, ylab = "Predicted log(yield)") @ The plots are shown in \Fig{intplots}. Note that the first model fits the cell means perfectly, so its plot is truly an interaction plot of the data. The other displays the parabolic trends we fitted in the revised model. \begin{figure} \includegraphics[width=3in]{using-lsmeans-oatslmer.pdf} \hfill \includegraphics[width=3in]{using-lsmeans-oatslmer2.pdf} \caption{Interaction plots for the cell means and the fitted model, \code{Oats} example.}\label{intplots} \end{figure} \section{Transformations} When a transformation or link function is used in fitting a model, "ref.grid" (also called by "lsmeans") stores that information in the returned object, as seen in this example: <<>>= str(Oats.lsm2) @ This allows us to conveniently unravel the transformation, via the "type" argument in "summary" or related functions such as "lsmip" and "predict". Here are the predicted yields for (as opposed to predicted log yields) for the polynomial model: <<>>= summary(Oats.lsm2, type = "response") @ It is important to realize that the statistical inferences are all done \emph{before} reversing the transformation. Thus, $t$ ratios are based on the linear predictors and will differ from those computed using the printed estimates and standard errors. Likewise, confidence intervals are computed on the linear-predictor scale, then the endpoints are back-transformed. This kind of automatic support for transformations is available only for certain standard transformations, namely those supported by the "make.link" function in the \pkg{stats} package. Others require more work---see the documentation for "update" for details. \section{More on tests} \def\tj{\theta^{(j)}}%%% Notation for this section only The default settings for "test" yield traditional two-tailed $t$ (or $z$) tests of significance against zero. So if $\tj$ is the $j$th parameter (e.g., LS~mean or contrast) being estimated, we are testing the null hypothesis $H_0: \tj=0$ versus the alternative $H_1:\tj\ne 0$. We can, however, specify different types of tests in the "test" or "summary" functions. \subsection{Nonzero null values} If we wish to use nonzero null values, i,e., test $H_0:\tj=\tj_0$, use "test" or "summary" with the "null" argument set to the desired $\tj_0$ values. For example, in the Oat-yield example, suppose we want to test each of the "Variety" yields against 100 (actually $\log 100$ since the response was transformed): <<>>= Oats.Vlsm = lsmeans(Oats.lmer2, "Variety") test(Oats.Vlsm, null = log(100), type = "response") @ Note that "null" should always be given on the linear-predictor scale (in this case $\log$ yield), even when specifying \verb|type="response"|. We could have specified different null values for each hypothesis by providing a vector of three numbers. \subsection{Equivalence tests} The preceding results say that none of the variety means differs significantly from 100, after transforming. But this is not the same as saying that we have evidence that the means are close to 100 (that is, absence of proof is not proof of absence). To make a strong statement that an effect is small, we should use an equivalence test, which more-or-less turns the hypotheses around: \[ H_0: |\tj - \tj_0| \ge \delta \qquad\mbox{versus}\qquad H_1: |\tj - \tj_0| < \delta \] where $\delta$ is a specified threshold of equivalence. A common test procedure is the two one-sided test (TOST) method \citep{Sch87}, whereby we obtain equivalence only if we can establish both that $\tj-\tj_0>-\delta$ and that $\tj-\tj_0<\delta$. In "lsmeans", we do this by pre-identifying the less significant of these two tests: \[ t = \frac{|\hat\tj-\tj_0| - \delta}{SE(\hat\tj)} \] and the $P$~value is the \emph{left}-tail probability of this quantity from the central $t$ distribution. In "test" or "summary", an equivalence test is requested by specifying a nonzero "delta" argument, which in turn is used as the threshold $\delta$. In the Oat-yield example, the following results are obtained using a threshold of $\delta=0.20$: <<>>= test(Oats.Vlsm, null = log(100), delta = 0.20, type = "r") @ So two of the three Variety means are established as being within $.20$ of $\log100$. The natural log scale has the special property that small increments on the log scale translate to approximate percentage differences of the same size. That is, a threshold of $.20$ corresponds to about a 20\% difference: $\log 80 - \log100 = \log.8 \approx -.223$, and $\log120 - \log100 = \log1.2 \approx .182$. \subsection{One-sided tests, noninferiority, nonsuperiority} The "side" argument is also available to specify one-sided tests. A right-tailed alternative may be requested using "side" partially matching one of \dqt{+}, \dqt{right}, \verb|">"|, "+1", "1", \dqt{superiority}, or (see later) \dqt{noninferiority}. Similarly, a left-tailed alternative may be specified using "side" equal to \dqt{-}, \dqt{left}, \verb|"<"|, "-1", \dqt{inferiority}, or \dqt{nonsuperiority}. (And for completeness, a two-sided alternative is specified using "0", "2", \verb|"!="|, \dqt{both}, \dqt{two-sided}, \dqt{equivalence}, or \dqt{=}.) In the following example, we test to see if either Golden Rain or Marvellous has better yield than Victory: <<>>= test(contrast(Oats.Vlsm, "trt.vs.ctrlk"), side = ">") @ The one-sided version of an equivalence test is called a noninferiority or nonsuperiority test. It is obtained by specifying both "side" and a nonzero "delta". For example, to test whether Victory is as good as the other two within a 25\% threshold, use <<>>= test(contrast(Oats.Vlsm, "trt.vs.ctrlk"), side = "nonsup", delta = .25) @ We find strong evidence that, with the stated threshold of .25, Golden Rain is nonsuperior to Victory (so that Victory is noninferior to Golden Rain); but not strong evidence that Victory is noninferior to Marvellous. \section{Trends} The \lsm{} package provides a function \code{lstrends} for estimating and comparing the slopes of fitted lines (or curves). To illustrate, consider the built-in R dataset \code{ChickWeight} which has data on the growths of newly hatched chicks under four different diets. The following code produces the display in \Fig{chick-plot}. <>= require("lattice") xyplot(weight~Time | Diet, groups = ~ Chick, data = ChickWeight, type = "o", layout=c(4, 1)) @ \begin{figure} \centerline{\includegraphics[width=6in]{using-lsmeans-chick-plot}} \caption{Growth curves of chicks, dataset \texttt{ChickWeight}.}\label{chick-plot} \end{figure} Let us fit a model to these data using random slopes for each chick and allowing for a different average slope for each diet: <<>>= Chick.lmer <- lmer(weight ~ Diet * Time + (0 + Time | Chick), data = ChickWeight) @ We can then call "lstrends" to estimate and compare the average slopes for each diet. <<>>= ( Chick.lst <- lstrends (Chick.lmer, ~ Diet, var = "Time") ) @ Here we obtain estimates and pairwise comparisons of the slopes using a compact letter display. <<>>= cld (Chick.lst) @ According to the Tukey~HSD comparisons (with default significance level of $.05$), there are two groupings of slopes: Diet~1's mean slope is significantly less than $3$ or $4$'s, Diet~2's slope is not distinguished from any other. Note: "lstrends" computes a difference quotient based on two slightly different reference grids. Thus, it must be called with a model object, not a "ref.grid" object. \section{User preferences} \lsm{} sets certain defaults for displaying results---for example, using $.95$ for the confidence coefficient, and showing intervals for "lsmeans" output and test statistics for "contrast" results. As discussed before, one may use arguments in "summary" to change what is displayed, or "update" to change the defaults for a given object. But suppose you want different defaults to begin with. These can be set using the "lsm.options" statement. For example: <<>>= lsm.options(ref.grid = list(level = .90), lsmeans = list(), contrast = list(infer = c(TRUE, TRUE))) @ This requests that any object created by "ref.grid" be set to have confidence levels default to $90$\%, and that "contrast" results are displayed with both intervals and tests. No new options are set for "lsmeans" results, and the "lsmeans" part could have been omitted. These options are stored with objects created by "ref.grid", "lsmeans", and "contrast". For example, even though no new defaults are set for "lsmeans", future calls to "lsmeans" \emph{on a model object} will be displayed with 90\% confidence intervals, because "lsmeans" calls "ref.grid". However, calling "lsmeans" on an existing \dqt{ref.grid} object will inherit that object's setting. Certain other options are available; for example, the \dqt{estble.tol} option sets the tolerance for determining estimability of linear contrasts. To see its current value: <<>>= get.lsm.option("estble.tol") @ Defaults for this and some other parameters are saved in "lsm.default". \section{Two-sided formulas} In its original design, the only way to obtain contrasts and comparisons in \lsm{} was to specify a two-sided formula, e.g., "pairwise ~ treatment", in the "lsmeans" call. The result is then a list of "lsmobj" objects. In its newer versions, \lsm{} offers a richer family of objects that can be re-used, and dealing with a list of objects can be awkward or confusing, so its continued use is not encouraged. Nonetheless, it is still available for backward compatibility. Here is an example where, with one command, we obtain both the LS~means and pairwise comparisons for "Variety" in the model "Oats.lmer2": {\small <<>>= lsmeans(Oats.lmer2, pairwise ~ Variety) @ } This example also illustrates the effect of the preceding "lsm.options" settings. Let us now return to the default display for contrast results. <<>>= lsm.options(ref.grid = NULL, contrast = NULL) @ \section{Messy data} To illustrate some more \code{lsmeans} capabilities, consider the dataset named \code{nutrition} that is provided with the \lsm{} package. These data come from \citet{Mil92}, and contain the results of an observational study on nutrition education. Low-income mothers are classified by race, age category, and whether or not they received food stamps (the \code{group} factor); and the response variable is a gain score (post minus pre scores) after completing a nutrition training program. Consider the model that includes all main effects and two-way interactions. A Type-II (hierarchical) analysis-of-variance table is also shown. <<>>= nutr.lm <- lm(gain ~ (age + group + race)^2, data = nutrition) library("car") Anova(nutr.lm) @ One main effect ("group") is quite significant, and there is possibly an interaction with "race". Let us look at the \code{group} by \code{race} LS~means: <>= lsmip(nutr.lm, race ~ age | group) lsmeans(nutr.lm, ~ group*race) @ \begin{figure} \centerline{\includegraphics[scale=.75]{using-lsmeans-nutr-intplot}} \caption{Predictions for the nutrition data}\label{nutr-intplot} \end{figure} \Fig{nutr-intplot} shows the predictions from this model. One thing the output illustrates is that \code{lsmeans} incorporates an estimability check, and returns a missing value when a prediction cannot be made uniquely. In this example, we have very few Hispanic mothers in the dataset, resulting in empty cells. This creates a rank deficiency in the fitted model, and some predictors are thrown out. We can avoid non-estimable cases by using \code{at} to restrict the reference levels to a smaller set. A useful summary of the results might be obtained by narrowing the scope of the reference levels to two races and the two middle age groups, where most of the data lie. However, always keep in mind that whenever we change the reference grid, we also change the definition of the LS~means. Moreover, it may be more appropriate to average the two ages using weights proportional to their frequencies in the data set. The simplest way to do this is to add a "weights" argument.\footnote{ It may also be done by specifying a custom function in the \code{fac.reduce} argument, but for simple weighting, \code{weights} is simpler.} With those ideas in mind, here are the LS~means and comparisons within rows and columns: <<>>= nutr.lsm <- lsmeans(nutr.lm, ~ group * race, weights = "proportional", at = list(age = c("2","3"), race = c("Black","White"))) @ So here are the results <<>>= nutr.lsm summary(pairs(nutr.lsm, by = "race"), by = NULL) summary(pairs(nutr.lsm, by = "group"), by = NULL) @ The general conclusion from these analyses is that for age groups 2 and~3, the expected gains from the training are higher among families receiving food stamps. Note that this analysis is somewhat different than the results we would obtain by subsetting the data before analysis, as we are borrowing information from the other observations in estimating and testing these LS~means. \subsection{More on weighting}\label{weights} The "weights" argument can be a vector of numerical weights (it has to be of the right length), or one of four text values: \dqt{equal} (weight the predictions equally when averaging them, the default), \dqt{proportional} (weight them proportionally to the observed frequencies of the factor combinations being averaged over), \dqt{outer} (weight according to the outer products of the one-factor marginal counts), or \dqt{cells} (weight each mean differently, according to the frequencies of the predictions being averaged). \Fig{wtcomp} shows the LS~means for "race" using the four different weighting schemes. (Note: If the model itself has weights, then the total weights are used instead of counts.) \begin{figure} \hspace{-.06\linewidth} \begin{minipage}{1.12\linewidth} \hrule \columnseprule=.2pt \begin{multicols}{2}\footnotesize <<>>= lsmeans(nutr.lm, "race", weights = "equal") lsmeans(nutr.lm, "race", weights = "prop") lsmeans(nutr.lm, "race", weights = "outer") lsmeans(nutr.lm, "race", weights = "cells") @ \end{multicols} \hrule \end{minipage} \caption{Comparison of four different weighting methods}\label{wtcomp} \end{figure} Note there are four different sets of answers. The \dqt{equal} weighting is self-explanatory. But what's the distinction between \dqt{proportional} and \dqt{outer}? To clarify, consider: <<>>= temp = lsmeans(nutr.lm, c("group","race"), weights = "prop") lsmeans(temp, "race", weights = "prop") @ The previous results using \dqt{outer} weights are the same as those using \dqt{proportional} weights on one factor at a time. Thus, if only one factor is being averaged over, \dqt{outer} and \dqt{proportional} are the same. Another way to look at it is that outer weights are like the expected counts in a chi-square test; each factor is weighted independently of the others. The results for \dqt{cells} weights stand out because everything is estimable---that's because the empty cells in the data were given weight zero. These results are the same as the unadjusted means: <<>>= with(nutrition, tapply(gain, race, mean)) @ \subsection{Alternative covariate adjustments} The "framing" data in the \pkg{mediation} package has the results of an experiment conducted by \cite{Bra08} where subjects were given the opportunity to send a message to Congress regarding immigration. However, before being offered this, some subjects ("treat=1") were first shown a news story that portrays Latinos in a negative way. Besides the binary response (whether or not they elected to send a message), we also measured "emp", the subjects' emotional state after the treatment was applied. There are various demographic variables as well. Before fitting a logistic regression model, I will change the labels for educ to shorter strings. <<>>= library("mediation") levels(framing$educ) = c("NA","Ref","< HS", "HS", "> HS","Coll +") framing.glm = glm(cong_mesg ~ age + income + educ + emo + gender * factor(treat), family = binomial, data = framing) @ The left-hand plot in \Fig{framing} displays the conventional adjusted means, where predictions are made with the covariates "age", "income", and "emo" set to their mean values: <>= lsmip(framing.glm, treat ~ educ | gender, type = "response") @ This plot is rather implausible because the displayed treatment effects are the opposite for females as for males, and the effect of education isn't monotone as one might expect. \begin{figure} \begin{center} \begin{tabular}{c@{\qquad}c} (a) & (b) \\ \includegraphics[width=3in]{using-lsmeans-framinga.pdf} & \includegraphics[width=3in]{using-lsmeans-framingb.pdf} \end{tabular} \end{center} \caption{Estimated responses for the \code{framing} data. (a)~Holding \code{emo} constant at its mean; (b)~Using predictions of \code{emo} for each \code{treat}.}\label{framing} \end{figure} However, "emo" is a post-treatment measurement. This means that the treatment could have affected it (it is a \emph{mediating} covariate). If it is indeed affected by "treat", then \Fig{framing}(a) would be misleading because "emo" is held constant. Instead, consider making the predictions where "emo" is set to its predicted value at each combination of "treat" and the demographic variables. This is easily done by setting "cov.reduce" to a formula for how to predict "emo": <>= lsmip(framing.glm, treat ~ educ | gender, type = "response", cov.reduce = emo ~ treat*gender + age + educ + income) @ This plot is shown in \Fig{framing}(b). It is quite different, suggesting that "emo" does indeed play a strong mediating role. (The \pkg{mediation} package has functions for estimating the strength of these effects.) The predictions suggest that, taking emotional response into account, male subjects exposed to the negative news story are more likely to send the message than are females or those not seeing the negative news story. Also, the effect of "educ" is (almost) monotone. You can see what values of "emo" are used in these predictions by looking at the "grid" slot in the reference grid: <<>>= ref.grid(framing.glm, cov.reduce = emo ~ treat*gender + age + educ + income)@grid @ whereas the overall mean of \Sexpr{round(mean(framing$emo), 3)} is used as the value of "emo" in \Fig{framing}(a). \ifx %%% Old covariate example is commented-out %%%%%%%%%%%%%%%%%% \cite{urq82} reports data on slaughter weights of animals that entered a feedlot as yearling calves. The animals came from 11 different herds, and each animal was randomized to one of three diets. In addition, the weight of each yearling at entry was recorded. The "feedlot" dataset provided in \lsm{} contains these results. From the feedlot operator's perspective, both diets and herds are fixed effects. Let us fit a factorial model with slaughter weight "swt" as the response and entry weight "ewt" as a covariate. %<<>>= feedlot.lm <- lm(swt ~ ewt + herd * diet, data = feedlot) Anova(feedlot.lm) @ The interaction tesrm doesn't make much of a contribution here, so we will work with an additive model instead (which also ameliorates some non-estimability issues due to missing cells). %<<>>= feedlot.add <- update(feedlot.lm, . ~ . - herd:diet) @ Here are the "LS~means" for the herds, and a compact letter display for comparisons thereof: %<<>>= cld(lsmeans(feedlot.add, "herd")) @ No herds are found to be different---not a surprise given that the $P$~value for "herd" is about the same as for the original model. However, these predictions are made at the same entry weight for every herd. This is \emph{not} the right thing to do here, because the herds differ in genetic makeup, the way they were fed and managed, and so forth---which affect the yearlings' entry weights. This is an example where a treatment affects a covariate. Each herd should have its own reference value for entry weight. This is done in "lsmeans" by providing a formula in the "cov.reduce" argument. The formula "ewt ~ herd" indicates that the reference grid should be constructed using the predicted value of "ewt", based on a linear model with "herd" as the predictor. Here are the results: %<<>>= cld(lsmeans(feedlot.add, "herd", cov.reduce = ewt ~ herd)) @ What a world of difference! We now see many significant differences in the comparisons. By the way, another approach would be to simply omit "ewt" from the model, to prevent making inappropriate adjustments in the traditional analysis. With such a model (not shown), the predictions are similar to those above; however, their standard errors are substantially higher, because---as seen in the ANOVA table---the covariate explains a lot of the variation. \fi %%%%%%%%%%%%% end of commented-out section %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Another use of formulas in "cov.reduce" is to create representative values of some covariates when others are specified in "at". For example, suppose there are three covariates $x_1,x_2,x_3$ in a model, and we want to see predictions at a few different values of $x_1$. We might use <>= rg <- ref.grid(my.model, at = list(x1 = c(5,10,15)), cov.reduce = list(x2 ~ x1, x3 ~ x1 + x2)) @ (When more than one formula is given, they are processed in the order given.) The values used for $x_2$ and $x_3$ will depend on $x_1$ and should in some sense be more realistic values of those covariates as $x_1$ varies than would be the overall means of $x_2$ and $x_3$. Of course, it would be important to display the values used---available as "rg@grid"---when reporting the analysis. \section{Other types of models} \subsection[Models supported by lsmeans]{Models supported by \lsm{}} The \lsm{} package comes with built-in support for several packages and model classes: \begin{quote} \begin{description} \pitem{stats}: \dqt{lm}, \dqt{mlm}, \dqt{aov}, \dqt{aovlist}, \dqt{glm} \pitem{nlme}: \dqt{lme}, \dqt{gls}, \dqt{nlme} \pitem{lme4}: \dqt{lmerMod}, \dqt{glmerMod} \pitem{survival}: \dqt{survreg}, \dqt{coxph} %%%\pitem{coxme}: \dqt{coxme} \pitem{MASS}: \dqt{polr} \pitem{gee, geepack}: \dqt{gee}, \dqt{geeglm}, \dqt{geese} \pitem{ordinal}: \dqt{clm}, \dqt{clmm} \pitem{rms}: \dqt{rms} and descendents such as \dqt{ols}, \dqt{lrm}, \dqt{orm}, etc. \end{description} \end{quote} \lsm{} support for all these models works similarly to the examples we have presented. Note that generalized linear or mixed models, and several others such as survival models, typically employ link functions such as "log" or "logit". In most cases, the LS~means displayed are on the scale of the linear predictor, and any averaging over the reference grid is performed on the linear-predictor scale; but there are exceptions. Some objects have optional arguments that can be specified in the "ref.grid" or "lsmeans" call: see "?models" for details. \subsection{Ordinal-data example} The "clm" and "clmm" functions in \pkg{ordinal}, as well as the "polr" function in \pkg{MASS}, fit polytomous regression models to Likert-scale data. They do this by modeling the ordinal response as a categorization of a continuous latent variable $S$, then estimating thresholds for this categorization and fitting a generalized linear model to the cumulative probabilities for each threshold. By default, "lsmeans" produces predictions of the latent variable. The example shown here is based on the "housing" data in the \pkg{MASS} package, where the response variable is satisfaction ("Sat") on a three-point scale of low, medium, high; and predictors include "Type" (type of rental unit, four levels), "Infl" (influence on management of the unit, three levels), and "Cont" (contact with other residents, two levels). We will assume that the latent variable is normally distributed (by specifying a probit link). <>= library("ordinal") data(housing, package = "MASS") housing.clm <- clm(Sat ~ (Infl + Type + Cont)^2, data = housing, weights = Freq, link = "probit") lsmip(housing.clm, Cont ~ Infl | Type, layout = c(4,1)) @ \begin{figure} \begin{center} \includegraphics[width=6in]{using-lsmeans-housing-plot.pdf} \end{center} \caption{Interaction plot for the latent variable in the \code{housing} example.}\label{housing-plot} \end{figure} The plot is shown in \Fig{housing-plot}. Generally, the higher the influence, the higher the satisfaction. Overall $F$ tests of the "Infl" effect suggest that it is strong for all four housing types: <<>>= test(pairs(lsmeans(housing.clm, ~ Infl | Type)), joint = TRUE) @ The tests are asymptotic (signaled by "df2 = NA"), so they are actually chi-square tests for the statistics $X^2 = df_1\cdot F$ with $df_1$ degrees of freedom. Higher contact also seems to be associated with higher satisfaction, but terrace apartments may be an exception. Let's see: <<>>= test(pairs(lsmeans(housing.clm, ~ Cont | Type)), joint = TRUE) @ So the effect is inconclusive for both atria and terraces. The "mode" argument may be used to choose what to examine. Modes \dqt{linear.predictor} and \dqt{cum.prob} create an additional pseudo-factor named "cut" for the thresholds at which the predictions are made. <<>>= ref.grid(housing.clm, mode = "cum.prob") @ So here are our estimated marginal probabilities for "Infl" of being less than highly satisfied: <<>>= lsmeans(housing.clm, ~ Infl, at = list(cut = "Medium|High"), mode = "cum.prob") @ Compare these results with those for the back-transformed linear predictor: <<>>= summary(lsmeans(housing.clm, ~ Infl, at = list(cut = "Medium|High"), mode = "linear.predictor"), type = "response") @ The results are similar, but somewhat different because of the back-transformation coming before (first case) or after (second case) averaging or computing confidence limits. \subsection{Chick weights, revisited} Previously, we used the "ChickWeight" data to illustratie the use of "lstrends". That example made the simplifying assumption that the growth trends are linear, which is clearly questionable. To do a better job of fitting the data, consider instead the idea of fitting a logistic curve to each chick's data. The \pkg{stats} package provides the "SSlogis" function for this purpose: it is an S-shaped curve (scaled from the cdf of a logistic distribution) having three parameters "asym" (the asymptotic value at which it levels off), "xmid" (the $x$ coordinate of its inflection point), and "scal" (roughly the difference between the median and the .73rd quantile). Also, the \pkg{nlme} package's "nlme" function can fit a set of nonlinar curves such that the parameters of those curves may be modeled using a mixed-effects linear model. Accordingly, let us fit a model where each chick has a logistic curve for which the "asym" parameter varies randomly for each chick, and for which both "asym" and "xmid" depend on the chick's diet. We chose starting values by examining the curves and making a rough judgment of the typical asymptotic value, midpoint, and scale for each diet. We need to keep firmly in mind how factors are coded; so we explicitly show that we intend to use \dqt{contr.treatment} coding, by which the first mean is estimated directly, and the remaining estimates are offsets from that. We need a set of four starting values for "asym" and "xmid", and one for "scal". <<>>= require("nlme") options(contrasts = c("contr.treatment", "contr.poly")) Chick.nlme = nlme(weight ~ SSlogis(Time, asym, xmid, scal), data = ChickWeight, fixed = list(asym + xmid ~ Diet, scal ~ 1), random = asym ~ 1 | Chick, start = c(200, 100, 200, 100, 10, 0, 0, 0, 7)) Chick.nlme @ Now we can use "lsmeans" to compare the parameters based on "Diet": <<>>= cld(lsmeans(Chick.nlme, ~ Diet, param = "asym")) cld(lsmeans(Chick.nlme, ~ Diet, param = "xmid")) @ The result is that diet~3 has both a higher mean "asym" an a higher mean "xmid" than the other diets. This is compatible with the results of the earlier "lstrends" analysis, but grounded in terms of the parameters of the logistic curve. \subsection{Extending to more models} The functions "ref.grid" and "lsmeans" work by first reconstructing the dataset (so that the reference grid can be identified) and extracting needed information about the model, such as the regression coefficients, covariance matrix, and the linear functions associated with each point in the reference grid. For a fitted model of class, say, \dqt{modelobj}, these tasks are accomplished by defining S3 methods "recover.data.modelobj" and "lsm.basis.modelobj". The help page \dqt{extending-lsmeans} and the vignette by the same name provide details and examples. Developers of packages that fit models are encouraged to include support for \lsm{} by incorporating (and exporting) "recover.data" and "lsm.basis" methods for their model classes. \subsection{Bayesian models} Certain Bayesian models are now supported by \lsm{}. For illustration, consider a two-factor Poisson regression example given in the \pkg{MCMCpack} package: <<>>= library("MCMCpack") counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) outcome <- gl(3, 1, 9) treatment <- gl(3, 3) posterior <- MCMCpoisson(counts ~ outcome + treatment, mcmc = 1000) @ The result is an "mcmc" object (defined in the \pkg{coda} package), but it has an added \dqt{call} attribute that enables "lsmeans" to do its work. Here are results for treatments, averaged over outcomes: <<>>= ( post.lsm <- lsmeans(posterior, "treatment") ) @ This is a frequentist summary, based on the mean and covariance of the regression parameters in the "posterior" sample. But \lsm{} provides an "as.mcmc" method to obtain a sample from the posterior distribution of the LS~means (that is, the original posterior sample iof regression coefficients, transformed by the appropriate linear functions.) <<>>= library("coda") summary(as.mcmc(post.lsm)) @ Since "as.mcmc" produces an "mcmc" object, any of the other available methods may be used with it. \section{Discussion} The design goal of \lsm{} is primarily to provide the functionality of the "LSMEANS" statement in various \SAS{} procedures. Thus its emphasis is on tabular results which, of course, may also be used as data for further analysis or graphics. By design, it can be extended with relative ease to additional model classes. A unique capability of \lsm{} is its explicit reliance on the concept of a reference grid, which I feel is a useful approach for understanding what is being computed. Some \lsm{} capabilities exceed those of \SAS, including the "lstrends" capability, more flexibility in organizing the output, and more built-in contrast families. In addition, \SAS{} does not allow LS~means for factor combinations when the model does not include the interaction of those factors; or creating a grid of covariate values using "at". There are a few other \R{} packages that provide capabilities that overlap with those of \lsm{}. The \pkg{effects} package \citep{effects,fox09} can compute LS~means. However, for an unbalanced dataset, it does not use equal weights, but rather it appears to use ``outer'' weights, as described in Section~\ref{weights}. Also, it does not check estimability, so some results could be questionable. The emphasis of \pkg{effects} is on graphical rather than tabular displays. It has special strengths for curve-fitting models such as splines. In contrast, \lsm{}'s strengths are more in the area of factorial models where one wants traditional summaries in the form of estimates, contrasts, and interaction plots. The \pkg{doBy} package \citep{doBy} provides an "LSmeans" function that has some of the capabilities of "lsmeans", but it produces a data frame rather than a reusable object. In earlier versions of the package, this function was named "popMeans". The package also has an "LSmatrix" function to obtain the linear functions needed to obtain LS~means. \bibliography{lsmeans}\bibliographystyle{jss} \end{document} lsmeans/inst/doc/using-lsmeans.pdf0000644000175100001440000151652512634421563016761 0ustar hornikusers%PDF-1.5 % 148 0 obj << /Length 1427 >> stream concordance:using-lsmeans.tex:using-lsmeans.rnw:1 47 1 1 5 81 1 1 2 1 0 2 1 14 0 2 2 11 0 2 2 43 0 1 2 2 1 1 2 16 0 2 2 8 0 1 2 6 1 1 3 14 0 1 2 6 1 1 3 2 0 1 1 19 0 2 2 1 0 2 1 3 0 1 2 7 1 1 2 9 0 1 2 3 1 1 3 26 0 1 2 2 1 1 2 7 0 1 2 1 1 1 2 13 0 1 2 5 1 1 2 1 0 1 1 15 0 1 2 2 1 1 2 4 0 1 2 13 1 1 2 20 0 1 2 2 1 1 2 1 0 1 1 13 0 1 2 2 1 1 2 4 0 1 2 5 1 1 2 20 0 2 2 18 0 1 2 3 1 1 2 4 0 1 2 13 1 1 2 14 0 1 2 2 1 1 2 14 0 1 2 3 1 1 3 2 0 1 1 11 0 2 2 1 0 1 1 27 0 1 2 5 1 1 2 4 0 2 2 17 0 1 2 8 1 1 6 1 0 2 1 14 0 1 2 1 3 5 0 1 2 1 1 1 2 1 0 1 1 3 0 1 2 3 1 1 2 4 0 2 2 4 0 2 2 4 0 1 2 9 1 1 2 1 0 1 1 1 2 1 0 1 1 10 0 2 2 4 0 2 2 4 0 1 -4 9 0 1 9 1 3 5 0 2 2 1 0 1 1 28 0 1 2 17 1 1 2 4 0 2 2 4 0 1 2 13 1 1 2 10 0 2 2 28 0 1 2 13 1 1 2 1 0 1 1 11 0 1 2 9 1 1 2 14 0 1 2 3 1 1 2 13 0 2 2 14 0 1 2 7 1 1 2 1 0 1 2 4 0 1 2 5 1 1 3 5 0 2 2 13 0 2 2 15 0 1 2 8 1 1 4 6 0 1 2 2 1 1 2 7 0 1 2 8 1 1 2 25 0 1 2 1 1 1 2 4 0 1 2 7 1 1 2 1 0 2 1 16 0 2 2 1 0 1 1 15 0 1 2 9 1 1 3 5 0 2 2 13 0 1 1 9 0 1 1 10 0 1 2 10 1 1 2 12 0 1 1 11 0 1 1 11 0 1 1 12 0 1 2 6 1 1 2 1 0 1 1 12 0 1 2 2 1 1 2 8 0 1 2 4 1 1 2 1 0 1 1 1 2 4 0 2 2 4 0 1 2 14 1 1 3 5 0 1 2 1 1 1 3 24 0 1 2 9 1 1 2 2 1 1 2 2 1 1 2 3 1 1 2 4 1 1 3 5 0 1 2 28 1 1 2 1 0 1 1 1 2 1 0 1 1 3 0 1 2 6 1 1 2 11 0 2 2 11 0 1 2 2 1 1 2 11 0 1 2 1 3 14 0 1 2 1 3 14 0 1 2 5 1 1 2 1 0 1 1 1 5 4 0 1 1 22 0 2 2 14 0 1 1 14 0 1 2 9 1 1 2 1 0 4 1 3 0 2 2 13 0 2 2 1 0 1 1 24 0 1 2 20 1 endstream endobj 163 0 obj << /Length 2905 /Filter /FlateDecode >> stream xڭ˒۸_ړT #7'5NR;[ZZO8c'Dh4f:YMɻg~۬"g4)l>q<,&Lffj~mO%Y^FX}';TvŽgc3x37g5c;(?9bl9=hX'77%UV25B|Ҽ︱9"v|=#n}-bZ,qV 7;}f0+mSGtW6*r$K,Mliof$g=<7&g2gDwMMhw&inMYf{:&x#^tm| _,) v-.pn*Qnj2WJ#ް((]6}4 $@5A ~5Ka(-+!$~u< r`m8ʝw a{ Z[4K6P:gV &zV=xԸFeqARt Sa8l+Pxn*=Y8(3GՆn:gHN eA4? B"%10 SEdy0qWT$wH姙Q %mCZb D<wRv*0)NOSc獵,_su*ac.ZT-e `޲/d# 8v[:0X_wwt*p|M*G,'1©L~x[q=tD"wl׏O-  ! 5?3 "lF~<ED'Rei*:8> rĀWΐvs'_zaD-0Ăa􌐁.xćZD|Q!|ծnD文H]´ RhwmIBH6 Bhf!(d`||?s-ަ5QtOJZ>h4rߢaHr6I1~Ȫ7],sPqQ\k%.:7r ~J,II+l<ԂRAYkQwc*bs@B俻[d^,\ +f"wӴ`L/Hh sCnʎTc_nHXP!AYZpF냌DvKHYUnZv1\1hĐGA+v.}q҉4.tPpe=j#XDuPVQKji.,"VF|T}XQ]%mac PgF[K'  #Q䨎H,uzւ^Kj+G2tNuel TQfߏk dEw^)><Gu1^ܭ4j= 5o !@*oA`oO2A-]uI]T>CX5¦Vrt5=yJQH霺w˳rjJlG˯16R_e/&*+jFu\ʹD kܰVNvbB Jn,O x=Nla9CK.qx:f @pu7_ajo[)n;:O endstream endobj 185 0 obj << /Length 2693 /Filter /FlateDecode >> stream xڭZKϯ0rkėdz AL#LmZ.䷧^)YuEŪb=>;[/o2yʦzq{(Ȫ4jq];˕R&re *iZq?n\,J!lҰ)';M$ǯ5;6;nޝ}O`s \'.y} N{\vTtrJnM#j ~{S@gmh{ k"EGhߡ"Quʤ 4 |Δ%zw6tqGAVcK-+xϔթ0@ N'o VFeɞh<݄-YjdA$= oG "=l[f_vE=LVg=76#z'Obd$U:-J5 cf/5DmSѡ$Ad{bZZ4sIa\%H .eVХ5A8|"οZ $՚+rw-ClߓQ>6ƺ婩(;KsJZeIkfYޚ?##cZDވۣ(+]DF&Z]lw;!4 o|4sNaV'}Q+wZ_\d )Y.D Wyh܉4>`*Yꬊ;M}cFB!E.@?qƉN)̻& k?lV(Yź0ec 9uV{?d'RHY] ؤ%.5 &RW:^cW Kv{( Ѽةi1:&e+qh,k0hom3z)fMAb2C0rU<}GSiU<,l&v΅dDQQG&@Ϝ1v>fd3)s E J` |ٕza>WQw xR} LJlAA6PV|4% \ TWa><˜88 {.ٕ7{ERl]f,L3ua*B%&rg}+PeK e\u0iKulI*W)HQs'koVl͟w(PNo9Cƴk;~HZ}?sdЀ9w!u4 >vrd=mNSO3 3π"TsFUxFof"o0+*ΕyW#>"F/db6GX!#ۚ\(7ooLȎҧM{L\|5S'кƈt6Llt.Pf M^G0H٦WoAG|'\=Zih"׼# =4W`.!?>v~i7D " _ iԔꠊuVچ4%U|NUOEdr\x8gG+.dZC~Cܔ͸FS' r>g6fҟ c8,\ O)2/$d #6҂njdd5K燃5=C/u) وRґfx%CNb K@ot)aQn2#)S8W r) ȶnHl 8j#8:u}e#< &|XŵOrf-"(_x\?E0>Ss s}y 5lGl`EvtbWBjW] gP2ZN)LWp0"S|jO+ Y18ID&ΪQ *-]qU#iB+ADF_ a<ҡiBӆ |"N_iQXiVOT%d1HpoPyǓVlvTw GٺKB} KW^8E|@ bKɅ hd#Ȯhˇ2K37d**8 xse,T ;w?9;+B bN% > stream xYKo6Wۋ )P`[l =bHn_9-B4obU+W7󂳪a /eMŔuWY><'-]ۻ_L3Lm][ֺ[+1ߋ_ojKp^))`nt@{7ݢL>slvNwWHPa(Wf.G ,ŜJ& ֨e7+׭qZf4覭Q&섥 J*iTLK]H@J\$K4R_1Jc1bL큝)cO@iG3֤nmpy4s:=PX& V럃Ь ?dLr I@ R"P3b&9NQ$5Ava)IDc?>8}$IXFMg55րZSKRК\O(KQXfG5җs.*/{ˤЌ]fNsINt6̡It2v?Lٌ@3nDlHHrxc! yI< Uك?X~(fjk6I;wtƚ&I9˾v}WO P,J$v܈5?q0b)켞lj${kteS%֤_\9W<tƘx]!ΆHTΒ>s(&|^h6yaH'IvBߪ* _'Ix & oL*r'O) gp@ QE%widn!2 Q~h:]hAsq7\ԕ" MP减՞h=Qq>znq \~ܵϰ݇ }{ =Ͱ- Gm:ݯD]1㜗`x;O],wݫ[:Vۍgfc̙-C]"L鸲u^l 9z{"$M*#;\ k5:kS.-t{ٺ> stream xڽXnF}Wcl_s$2A&;ԶH/I=EKFg0 dUSUjJdI rd,E򖤠Hj$IC'@8RTR%.o08#٢ ɘd DHպ0Ų$LDr@#/!f; |(T1J"GQyp(XHHpI`"cdk$EP*Rf xCĨa<(܉<+ÞfeIWHF I F-h`]Z&3\ f4 r.B"ҳYF>@r܀["2pDS1\\ /.C DX@$ %2^80" Qi0*X+cPS1#z*F[p:),2F椁-Cv AHhs&JmRJEUd4/ gٍ)؀ &Zx @%:Fxf4;h|܎}XM)'t *["?|M+U{h4PKrLTU-nWi4~-*6S_3?^EV͸)uH83pZ:7-g9z!0vAny%ݿ8p^tZ9y_u=X3;֗M=qqf~ڄZn {WP"5{hsAV"KY5fk35CQj5mT#ԩYY35eS:ˋz^5";ju8eŷ,(sRD]Kc䶔D['Y9~ k}Ԋ9P/bjnQu#m싇 }^ugi"=2Têl: -χ-D:#吞{ȍ+Mݩ=Xs5Z}\v-l&DGPaJCG_&1W ;CE)3 U=qHl^#Rfڮ:xݧGCIC]7-[|5 _z^HЯ4{[,E1;AHhb[]fbkU ֻWg páE{Zr}Dr/o'0u^,7^QQQ11Yenmڄ>T^u" tkL``Kx.nK>%!K^h}ʟޭէE鵹Mi[>7B)Vop=?O|_8"p8@ϋ\{[1`.~ q]Igù28p-F~PF)9ǡPa7.>a\p+q(aԳ }Iq<#ju]|vVK}QF̕%N{p*<>9=p)( <)űA@8,[_Fb 8*sW^? /Noٖӝrh8(c(=hW&xo #wA[76~'xzyTx3}&0{w?yKy|}> stream x˒_KIЩ*I9]Di14O>ݍnsACh4ƨvfwgZj~3լVMgf4)B 95Ӌei,bC "!+V *(J6n"ܞXYfw53}R\bY|j2YetM_)ZQ'rn#"U b*G*X rY,M]R {~&-$~+p  !DŽddzK g&P2DK@cvg>+yw9w#h$qOG xƙ@152ffޞD${EnpCxfE-8/k7'yAB*5oO (Cˑ{05pyGv0q$Dp~śSgEC3] }@tUm.:&ε/*:z ;H1-(W;RUI\@4#|y6tH\b cԅi5u"T>GQ,3EՔCF [$@tW 텗b_4 V-պh>M>[\jxg,cY"?ȜHU#1}ϒrJ;*);vc}8sZV $!Yց0$%<= 1- gY|MI"כ!{Aqdr2q Sn{A1B@sIxa_~Ɲ~L>zXG3$/:.ɡf'OD{!I?$.)lxY)Ox`NFQq3N %lٜQ֋Cn3%_Otc|IGiV}2 +np pq@- a d)\^TpX jHgLE;([;P.dV<(.cTQ*>%گiWx=>xbVdcѕ*)| Ou 󡴬\QBgDT L !V WrX8ËB`9ŏl-X$YpӮ0(ǁv*UebY@ ;Y-~#K]SF >Dʏ$GZ{XQZ2o-T=M}ׄG!oq%sbo `ټQA5&H YО{qnQOn j)K{w?&yWD"u`.*DZJ.S\{^7P2=yXVӼjHAuA>vKCqb>d"pKϾ55[nԜ-#0?nXKBe}u $ouMvf>PR}VKje=_F qI"/0⪹V7{z͕L}K<%!RF$#iYU, )BQj4]\@H 2s ZY8''38{@aPz 8GgB$O†L zP ]LMѡ 7#pSs{(s$db%7gw B)s[@8Y*LB:n.*[eR/vU=EVڂƤ)O&]o֥0EPA$h X2j/BMƒ =A(-P6 oU`UpO}K ;whFˠ~tO!a&^K0MV8-\ Ք31jŚ*Rh*ᇵ.p2/%;o;&ܥn%]iS*[/:)pygM&dl2wΝwzrlz^ay3-V0$r4a. A;c)Eebz/=?ޫr-e({]z+{V+z=F62(awxpيl\/|10/9fzVc,6l  BPu)هw Sϰo'>yWh|ΌlԚ1t6gJwbҶ`uStS2|DHfũtQ l3T>e4ܨ)0Vs)-^\[]Fz1Pޡof&>n$gLewS+Р{ *Tx⯧XWjU\ b9YW27(mfK(]J,> stream xYKo#ϯ&fsL` $rHrhKmKz#=U⣥m$9bb')9IO_R%EAMo'^O BZZL:ӕj洙vM@[C;@@weFM{h-M: ?YcC+h#]'h QXA3+Tv2SF8≑qk<40^ :Eqyjp*< X7o˿̚~Ho2 XKk󒓙vIټH; $ yufFY33?nzb}?JɡTp-# VaM>Up>7mޱʌ*w/JB($4ɚgպl#FϔrwYs vŅBcvrȧȻ1~ܡ=,j-nkLLʻu=]vWڃ$z݊eȰ!0tv>.鶸q:Q^:I!g)wMuѢr\ MG>?ӏ7?Iv^ԪWa)Ft¸n.1zO:`4Xs{H!i!} C}ܾÛ>";̸LFa<(hƂπ@3~Lf*A?>o*(q())Y y0|śts5k+ ;5,%`uq>;`[w#ۀ85;Vfz~Ԇ4;8s|=h6WyfኑRxdtw\v rG ԢU5 <,[#BN(4|0; m@ Ul}>)y^@eƨ Qg,Lp&DC^rC9V?́cfh[_1rNS4nbQGQWHG%jI =mXA3ymJY_Qz\/Q0oO i dMtDSJ}.VH3݊$ W\BHo`vSJ%@LSǢBF3$C}Fhtt9+?G hoDco0m*\G-3Iinܿ?A${,e՚ T΢('X9O0 wbXWbUyeUJSв$kߡ4-*?0*T\ JB-EN,ZgڌF݆( k0%aQӯ}ZC= 3B|W%%h>^(DcX-p6۴ø+V\EU%=9Gǫ;4wꦬ5ڔS[RQ6rOcVB>_zޱCL°!$&=X8 c.t~B@Z4ھDkܔd#6FCuY+Gk ly ־~CY'Mwv;dhb<+}D~} iY~h#w ǡ$?,;SJ+AgO1W4frOq"&ӸxxcpgQrO >,XTRnE]VK,p:w=IAG9ur˼醙ߟhT!Szn@ݿA#T endstream endobj 214 0 obj << /Length 2544 /Filter /FlateDecode >> stream xZ[o~_!Ra1+md 4ȺCZJe%;2Cr$.Z\efq>峿՛;=S*\ =+*˭]gB3X*6|gۄ?ǫ?{_TUy`|yJG\} ,;];([:@65΃7',ab)|҇˶.&y*CrP{`ĻdVLWZʆsux~:#uYaIFbvk@-VAʑ{^?QAM`Ҙ*/ 4Vv a<ő5A`4 *{uX,Us0v{ ?:H>pnB n]]dAIl\ $HTͿB`|1ZkAGp;+^!\B P\D8n@6.BDK؊Z3O5NqvyT!W&`i.mISrvASǻ|ݢ4qcOPGw? >_,Bp3dyW,{8:0^*20 fmޡpR(E*S/m([b߰{ ƃtIl9ml8uǺ H|O0SA@ 4L2V{jN?tɴeM.2. j2D.:vrJ"!bAZ1ʺbhBbk4Xd;2@M9E{T}\cC`.i~E .Unހ d#qp%?Ex> K#injoqbx9kD\}r~HB-ZPK OrG9riuX ؎ԲB-LE*c*eئ_Y^UݗW%lB,V]q!^ =}}7E{aw- g9j&+y4P+& bK-`\tH+ܧ_~"T%3LО7c&5d2۔̍T&3/h%4"X-X|:G{\`,@XubPe]‰;%>cT5:ƽpߗki7oAl9) }!iq.ol)\E=O`%+21n;~/ۓ 4=|KM7&ƞ?~+~C}OSk | $(MmCs=sz9t\f6Vއ=tIlDK:R<셃6䘵Lo$t9.2H4F}lxt}AKCE"q:=.B3$ԦH%gJmQ c^ 2;(w@iW2TM! S6H !2P~! V ܻ.a*1ohWݶϖPQxfJ'p%MdӇ&#ϼBߏFZ3ʔJ}3kY0rxFd7>5aiCadoɡH?3Ui载'mYXAXß'*ؠniG)ϙGpUMd\:=w WNE}6,);K8ܧwHCgTi3~v!?t$fIiTO+5<$%?Ǘ2`#1't΁37=qm^b"e_WUe%_T`٫tR9ëE~`k*1+%U5$*/}#lよgMt-_UO>Fyb|{/+,^oHΛ݁qtCfq6zM:B- LK5OHwG}۔f=e@1S\bV}ͷNE?~]wic(I<}<Кl{4wZ!„5 ͝. p{Wp_rlw_(u=>z`=x}RZ0AajRs4nX.qp6k‰)&Qw+^ ۇϯrY j\Uh 5M>UYÎsYʜzw7bɻ}*xٟX;nv;]:H UW+XB۫< [m5IzZګF@S$F`?)Z,"^R!iEH0NlT@ ɈDz[&MadYyDJ IxT\Q NTM#)(^#C}+P0r•*_8`oFe0βe=z讀 endstream endobj 221 0 obj << /Length 2578 /Filter /FlateDecode >> stream xڝY[s~_ٗ3+ L4;N;;mq>ek#v 26Hs>Y9˛Rw)lv=k,mQ:8Ǎ ?Ÿ盪7 [y8s N^{c\3~Sp eaxH0D̾lhre& $W/;bdʌ2Ğ߅/ Km05kal]Rr^tvRU0SW<؈`~`kڈe*,Zt/tQ,nyzG.{ziww-K~gn`00g4QHȕuaK 1F6Aں.]f|Q^W奁?[ەp;2"Y('m_ I"hjךՐCmwBۨ"IJ2\hA>R?%~VMK믅.p/R3 gxc 5] P!'XjJĉߍVI=m ]pӸ\P"oNMbr›)ZY:WGн p+^G.xLL׈c ܀s]NGyd&glB"R0 |IJJ2qcvIb* 0w0_ ZTXx8&Fy<DP.n5F:/XT\~tQ"JJPeuVy"e $L!F yU.( fxqۄ3DuK*n+[Q\Q+PON$"M¥Y2 Q(JօD>s\^fE-hxV['ڻ$Eh吜@uFS[(ʶ3OOcּݏI$J˧v\B'#tޜQL?WBz3$SiJWu'UjzO Bp^7;4n"&.4KK$wq:6ArG=*x\;Nؚ`65.,向 ;^ųipKj%mlL59@ʿj#~}+v0o! ]`uwr1\8QwX?۠JĈpx~!rObDug?s\Ò&|{2'zfG^@o.QVW(j,6 &4 ;BٽX Ǘ3(&,>)O1sºZ3֛X;(ih) !=WU`]4Ѹl 􌨫hqr5; /){ (7͍"NAǧxE9.-vRf݁ R!cP4i[&I#0ȕ۴ *A+>0SR/E-*ai&zٕPm5y3Z QUE,p{KaZ[>ܣM<1rH4a.p!@G&A{ ]ƙUCly Wm0lY 9jl<8&i6iF؎} W()<~Vn8]Szr8/o:?弎#N,†biآ f@k{=T1p@p'dB݋N):8Rf})P@j~JU` JZzFP!!M܇Ҕ4SMp.qQ]⊢J |]S'okNZ(h$c{bpTurs`# 6(*L'x/d*K3(LK;C$*HD*@J0 m^Kk#eh)s#5RnS}[֓υbC?D07ҷX endstream endobj 227 0 obj << /Length 1733 /Filter /FlateDecode >> stream xXKoFWB+h MR() ZdZkKQbz(ffgvY臋3oY"(7|{EZEA2xvWů;8IoHei*ZFfi^h]-73Y;K1z9K5gknSLT|{?ˋ@$:^v"is vՏ kJ[0w< AֆKI [? Ae⊑NOLU"Ui/\׳$&_d=<-U2i3\Չ@E뻼VHb6zL撛HL2}/Ө;bX3ik{0KyZZp&4RI+&Q2m$'}!MkZ̖M J2τENYiVq^hKN5"I6~JQ8ց%i;nm:=:C4omxF`w]w$݀曞Ffզ߮Σ/L;v ;[yrA]/㢮E ~*~mSSjsA&19q| a ["DQ0 DLXz t')&wT,E^&n("u;t)-üE#ǫn鮑ECa(p\ZϴP⸰%HQ7<"w! W~e2x#oqad"vI׈2隽hW7;7fUB8nw?$ QG5l]㊊Hq;Q~': xckd.+w#*C[};>h흠 [vkY4㜩Wnw|qE GutAXo[ʚ74w]uh)B-(e&j@OaUk6.][[R5tpN3=P`='ұZM&M-rK 9H{̣.'BT S@&GQl .xyC1k9rOUˆ|+x0C[pҬa, >#$},Fb gFșՕp#pJ qR'))[I)uz)Ytk|ӧ io+E1KG㚢OWT=gr;κ` &eSNiQp^e2=λ[rP{9rBIzr jQSR LDUrR.w$3*~.dzWqAo}\:S>EB͍q4ci{y0Z$(Xbm"W6 ,N}"E?IJ1DT'6K*)] q˂KRNGSFn #'`|q@ y$~1mNi<xv8r jgkJ(qP + C]1igڠTjNX|#RҐ\Zoh0KVj@_Y endstream endobj 218 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./using-lsmeans-org-plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 229 0 R /BBox [0 0 432 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 230 0 R/F2 231 0 R>> /ExtGState << >>/ColorSpace << /sRGB 232 0 R >>>> /Length 959 /Filter /FlateDecode >> stream xVKo7WQ>tkC/Z jh>A˥֒m) zؕ>΋W@p\nԛ?~GQk ^ygf*(8 6# ܩ_6#@JhHb\>}al@v@O5F  nO_HD~&83@u!8{wy$Qj0uַX4qqW};1ڗQ`qvײe]&yBJWN0:i|b_FLԟ|\sQʝJu2tC&JN}l_4k>?lmĎi1IMO2{F*sϑMu7/Tm~\r*U dM`#i7C[j?aל׫.zaͭi7]; =+g>[mC򳗔s81pt4>kLiTn 7MqH]3Nk?pzua@d4Uc؊g&c;?8$-&?' Ђ|[l`ta꣬jpEYC5., ['mY(+Zq}0÷Z=~s8i'm3., (+Zlx<G$2`K|p 7^N C9w ?wtwunI'x3~wo?c0 endstream endobj 234 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 239 0 obj << /Length 2492 /Filter /FlateDecode >> stream xZY7~,d}dbo863KmQcV'﷪XhΩ=`Sw `LM)ڊ HaLYR0\=pp [/||9q`.ќ׎m۰W*Ԣndr߁?]HiÓ^Z 1-C=511y-'t'#%/Eһb36Jxt~*іp b݇ t$K޻".IXu/   U5 ÏXZ}Po?lڗمk^R&]!'Ǔˬ9;m}ebxܤdDuD|xٿ\bg.W\ҕh8_I/a!)c@ݬFZbʈFYiB1 =) vZY5@S`=yp8^)lc tho 9 :[G %C+4yw%  ʉzvWVRk>{>ե^ĸKbkS,91sS4\?W6dGUR4@7 GA)LZY{) SF&)jA(o{hEgb-;wMy2Ķ}6`$7+]2)pW.bu؟(Fl8d61/zT/ڌk2RdtTeE^eىzchi+b{VupUcB4CGA V W3ĤZVuB凜yMp[VBρSEWY8 GiYI2H{2qB?dِ5%L_^Y3?lHy_FHkWMK6Wc sݶŷ%E M8‡KS . -8UұHR %S%YZc2nsFTwyd=%TZ:8m( ]ۅ^\V*L6c^{y+M Y<=8-C>zHmi_*'[5N3PoI;/-poay^3w)ekQ5]tUNTs׾YfЦIoXTqeh Pi^Na8=Eg/chZK_d($e@"w=X BՕm.^_}T w?/~ 6*$,'t^R8ѣ}@['{IT磽;X OMˀopM!9^yXs#Cj 'lw4+9Y {{Ubgamt)\9Jx.OdnΟ`MIfoLKH /uJIOGxCۥC7ltZWtK'qQ)Z{yj{| Oouf pNI$Fgś@_-`Uzxx [daI.R m!s<+Qǝ1]+ t'{%v02ѳ ۈұ'¦F$Tz;[5z|ǹM eFGN\_g; ˂|08<ϰ gv Wщu\LIP ,\c'}ܰiKF[W&ó6) "ըV.a9U0uS-aF*55zPZam$&m{ S6;jbg"iT + a.aItάUBTMxa*@\Y5Ĵ~-ȉ >k#LĀC[l3$U'DlvīU '=FVC &Sryx#ځw7K$ endstream endobj 246 0 obj << /Length 2809 /Filter /FlateDecode >> stream xڥZY~_A$`{n`ŖIh P0˙]ErW Sg>**]<,7' MfaLTM(:oueY1EФ)]'/~ŷ_k{lzaҤIa~a<ؤ[]^W,˖j{MC܌{ۓLL0e}Cs<~p[ڢJ* 93e܂ NJG&UUC#K%Q)f|qa3bB$<>Hc1"!d'JbKN踀&K^v ^xk|d~RNOO1wL^~a>O; ;~aV^N2HUXR=-A@͒ADU: g&z6R(}+̼`I_}Z nlo4o&T &zmdN֒A$p}H<>cuLVk[.ǝg %FrW359 L_tT5P͘;6|؝,x(-=8=ڤ,V㫓+ؽ^mǵq'$.LTC7C6:(Y6LHϘ0Qp4phNr=rͷ*@&YkVE?]P4u骪Ⱥ;nPS6YnG!~G.yy5BIޢXWul܉s;pWX? |PrSf4_TanӤR&NAXI?I²Ns@bCIa+=fWf#fс\4&N";u/#>;#IClcˤ)|q+."3vI>_m8΀fƌL?WP f2 i:Ha)O4 EbOA3'e("y+޹+]qtg}qƳӌy$hX('r2OzhNx[OD~oT Fa4(^QeD*/1S x-GXmZAu50tXfG?dq`v)aM93;صxzCb * fL M4^z^ HΫ2< #zu1B zÝf `hぇKSبhbG*k#hHKQG6NA80C(A m![.EWkݽ9>3m8@!̳)6aDFqC#WIHDmOH>c:%"U ^I0;ڔLеՠa m/;iL12-IawׅqA;ϯ>&P3u} ]譳f}P‘z.ڐJK &E=_lg_0OK@Aj1N$[;.QHD}sї*a6Rpف01b8[u\=h<^7YdQ Ț(@S5AgqqJ4mY\׳O~Ke:u9:PY0 QHEZf5؏m/s,aQ4>wiINgT{ԣ|mf 晰KǮGJ>?0.\Vhz*1J/Aj׆?#U=2ҌcjZS:Sa. ΆH9Сrۧ>rmվYiGZmz zYf3*JnF+yDW};0҈תeͯOMя<.oNΫ?r/bZ/d)%s\as^z߯Kk  "yFƮy7ϛz,g endstream endobj 254 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 257 0 obj << /Length 2055 /Filter /FlateDecode >> stream xYKPT@MC*.lW**6{HkITK~%h&~$Y(@Cf&f_כzWϤzVySJ4Pnu EQe=< ~X^[Ƕ~VX}";9`~Pj ]mn*[lwkUȵ́lώ=ue{FgDZ7UE)]_J O⿄8HD&p"q١sU9E!p:ofEntc{["]xAH߲LEUg8egkp -no_Z*a1Q3ںeK9 ˻(Dg,]q'v`fjUd($h]1wu%kۆ"(*ZX^iR'07e"¾ 3j/I-ٓ~iSչ 0R2{i3aEukչe8@QͰJH`= wR=/ad|Ha!+7ށ0OJڹd.@1dk@L%:'#A)CJƎ,z„&/\և֍hRஒH, Eֹn8GrQ? +ny4G 6Kcu`]RyM B{7FK{ L Ama5CգAAjP*7|d-nϳ9l2{MYhW*6!QKw:.P|S2q<lQ)?+Z// @.W􇷝uζ[ I9j3T4"[#ǖp(ҟ W}u]йʟ`䯞7mƀqr{m{d#_W:{L'RqAA׽B@IIOjuC㵧2—%'atQl=+&p?X&p#oarmCJJ<ܕÙmKSj9sZ8OX|(pD$9`;![f5,c/}O<{]~H/eyg+YAs9?W]ҿI&)(yGdFͤ ]* x3|n`^w[J(wyRe^lmO\\%ȕ4W.o(W:צ\N5!,QXT|{`+d?-'_~U\Y["g/߈gv2+pآ<$\b(m՛`enQ$PM:g7f8%hW˄ӎ]5wvv \_5p"p %Ej)i-U*x A[I:- pPTyGY19Ĵ > stream xZY6~_aKd`$ =0}Am -w: ,*%v&CduXn^}ElE+7wZ-jі¸fKYb '47Iװh|vj~;~ R;L|q왼 @$ 4bŊ3bE6y^X3Tu+ l{=3 +x[lu![Bba!۲61">x2NX~|;x5v!jkoL yGaODb'÷[HCc, Mrwn+NdJ =X '1#!g+#K%M0eeI")fո啓N Iv eJA^,1-ۓ|>WFR CD:L&W-͇xvĺz w'nM 7s< Ws7)ʖV؟` st<.BF 3H[ $qt) f&+ɟh9]&)ɮNɸH-,=Iiqo?ܧ&iK$WFh=FFTEV4$C \TEC-򞊪2oVD&hUIL*'0-<yrseb\"iNypU&8e!K7L(e)fCx,(z(8[z"teֶ,F Kbrb:.FU9JykfВi2^M>h"2J; t+*x.E:ru(7dU4$X:T㢬XV1SXTħզĊŽ֥K556Z畴b*,!Th/vf5qO*fwUҌ&ۂ%,337,v2]Mb0w Dp[:Է9V!j }6gG&dKA=휸= RHS]Lid_ī'זNoL-M}@~ܳf7_`SF{>?ZYԦRt#Ӯ2X*SHAצ8#Ҁ;fW?H7 FzȁOyBʙx!FG*5Uk.1F9GMSz&QO0/@S mO6rEi `؃6,fH8dm&K@ȓ--6bxvv|؍+st=n #,DA{0Fc SB/s_yAA_/_cM$*U[ 60NRU U}QRdZa(VGZ[1*Ǝ >.XWR&8Su/mT؝lkTu/" "۞DtR|r?75" d{tK2QnҝǶGap9Cjw}HO҈K焏 ,rt퐸]iXΣ=M=}"Eq{b~i}Iv/opi 5;rU`r#[9Qr y L 'q?iJ~O"l @b7*aX1MnnaW;XIGёc*ޘg:V9vt2d@@\kTN_-9Yєo^] endstream endobj 267 0 obj << /Length 2953 /Filter /FlateDecode >> stream xڵZYo~ v/#Y 8b-`6A@pY R#G|ruF":f~q{_*_Byq*Q\/媅~콼 WKQ(zT\f*oUC~~N q/T1Id%j2E%l 5OC3yܙԢ07Mlq'Wgr*[d ˨es$L6SXT%&>x [$H $NSj/o&־{.-*H1چӔ ~a7>%hQ;A ֳko3Ku/LcbM%Zg M:y#_/n;u7A{'?g9"$'BF+a{Z#Te}Ά$ꎙPDxYBpjeK#ʥvXAt6}iU /SF91bfRU!?=ڀFQFhS*V֢9(ۨ Y ֠6-nbѲL\Xd魃uoCRr]Y/jQʽ .+sۗ}ʺM~Q~@qꪉknnrL݋l3@ޢ]ʕ[&%A AxrE#_L$5RP0 <[p ykI3ѨfPa\v|mW#xDwAS#hQ~;Vo(7qpw(Rڑ2KwU)dYA .,ܑ+23mr±ۻ-@Nwv _cֱfgܤSB)ObkA +QSڒ";Zb}9EмDh)~Q(KE of\u *i&ZheܛhMI5\ԕ׾Ul!&cK]rͬ~6M5% [Gh^kgB"e%L]Y2 fj6z =+1\ɤ=1WkYG̜;QoJ VnY\?KtRϏKJ{Y !KV0` D/]TZFzmMˠLs-ߪ ?\YQ9J D,LuQ؜\!C>&6ه\Zih`2p٨Z nrE{gt}y츙1%YgՎw.@[_}h9؇-~sjvŐRFЖs<7QdW[m)&w : ~gOxscDl fq&K)Lc&)1ڐmHR΢B ӗ.t;C =q)0輯zl!y(Ceڙ4g]g ?DL9 ;̆1n˖bEd[Vg~#gi ä{5>t߱BOq2&>F));a|#k' )4#(NH3G攨:#yl󏫼 Ze S=< /|O<،$SpEa .Fd2`se9 OCPp8XxGGh[=rҝM/#3#xsw)%BOXs K4πJOmMV lf,W%^U}foUd~|4>B=gd![=.'@64ʗC|E~0lQ/n Ft"ݵl1Q"eLKH* 9ZPŨ1:! YN#@=hޤ>BxG'܂ <>.S.m+:+W s9<,ffDP"5Ré LU dLҐhM.Tw^|eDYE jŔu-Y}! REջ-D9ۍ}VmR)xf,v'Yç蒉 gPH:(Kr9ܢ"X {CE:wg _A)1Zj,-gCN}CegQ>-!VȟP^8=V&WP qh?Ayxk伴 n>ׇap5>}~9̚OGY =/hT kThNCtG>,K5MJ֦J{t D$Ys(!>bS #&1 vY@Ų X6\ưk} _L9{)+AVB&%L=s跎Q^u4.+!WCPPyc Ma at \BN-0uAr{JXH?s^"H(5sK*./nTןX՜$n|`Aͩr۾6j}yO endstream endobj 279 0 obj << /Length 2982 /Filter /FlateDecode >> stream xZY~%Ģ8sm-)ˁq[ډan_''Wki>J?f{Ĥ9V[Aޭ])O|."\Gpӑ=^@VJ*Z(ڣG)W w{I.Խ< :!3j:Y !܆ulZ2 @՝qJkbD4ъZ"Yww&# B5wɍwe \`J3cd 1?Ual#;Kɢ/4hYk굷",P/NrƉ\8$j ')~v'Ks3] ;j7"[kPΏܴtN;ҞJˠN Rͧ n9^ڣwqH8fDrT7_#js/[5\e)ALd \j_b1Pv-<]vfL ,X>`"\w{1.d_/ &,!8)ҀKsN51U.]YIJPElH7 `b!c?`) ` 5ieT274Sbsb Yyy{iL="K0 ́+0;Ȑ}M'fR}2Wo U\zw-#م #‹TJ*2Pف09k͂v U$o|Ew 7k6\yܦ&0 AɜO[wzKj!R}Rq\fPUrVmTdwT\Tve72jOc儝䢑Y~^q 8.7|!XIʥCF:Ĥ`7=HffF_'7jF>:)M/y^c1E%R sj0f\a z ?fġI SV2c k5,>'(e|<s.bV#1\Ʋ ߱l?gA:DzQ\r%#*˓>ĕ7 { mZ xjߺw1hQ:딷<C0N0RKJxq(#ۓjV"w''.XpA>P=Ke* gS}&ԝӔ1AB݇ wi΃|MPy>EX7 Vrv$'0,QXp޺HtcƷ $A题r!In #+6DqEU}v_6e&t0V Ŧx}_VG4}4vH'hy1 U%n:V endstream endobj 291 0 obj << /Length 2362 /Filter /FlateDecode >> stream xnFmedİ| 62A"f\frHdD=d~vEc_6BdwuuZYJ䇋\]|}U&&K6uRii4ad-.ͬ .<ӄ-L=ko3 ϖa໽{S,ih^qXӷ,v< `v-"d |BIIl Ę> -8ˆrрWvD'M(h}?9JvGuT4!8h@W:+=wa1{m_obMGcx FѷO|b[E &`@.BYA`'ly>34QP]fM-j:v8y`f5jۡq=10Ҳ'nŸ|gSk|X+įTTvjhE"Ƹ u{Bs?8$fHj1>EHcg ͭM]c?Uh7\H` ygTp&<}*4C\f$e,J;x 74lKYs&_M[<@/ͱ0z[0R,d ",/0//]v郢>YWO2ӅAϩ(Uaа'1W^Wq{x|<}n8)+%*U6(T1dM$Fx=L˴"G(չnGIt 2D# zAD4гH둫&Nu޴)F0^:^5N*nIf csEY:%<6ÄLUWΩΔWzЄ=dž܈r!/Jcol<_5Q^)TNw]G8*"ɱ5vГw~O7;Klͧn$|cw}f\U np7!mi]fԇ]s.Hv/]]|TIeb{,Y` z@T2o>Ivl]duR3qa@9S_"ؕoڈ^:`6{V̿xO7B(DxO+eV {CwZ;o&+϶S7t̃9ɘu>wE?7]ܜ1_OZuF4o!>EL>Z}v endstream endobj 299 0 obj << /Length 2426 /Filter /FlateDecode >> stream xڽY[~_A%9-"u6hx>8yJԥDޢo"ڱӢ0l33oiwWiBGY]ѠА&O:^~*Kmm~p⥋TiMXe&֕:z\xKcLl~XZkWv?ju愂:>G;?U~9ָةJ* oy;,5-OcF02/#FPZ-?8D θw&9ܘ$Mwq[d3V҂ ږ<]wCj.xsPw;cfׯ@uWq"Y,K];\owmE]%\TyR~MY<~PLd2Ȝ) ,-j0Yt荊(zoI%ScVU|?I:Uf2[+JeSX_JR=qRu,GCs51EAtrUӧ a 7<[cLS܍^Ϡ@7g9LLtb/&Uq"'+FQO8$LL(Q>#l(Pbh<~'FB^xV qVв 5,HHEXq.$DrTJ,Lܢ}YXXOA1*(H'`Rǖ;:S ܖPH_y1ٮ0(pe+ !mDܨ &5!Ĩ4_ i#-lDÞhχϓ<F܌yXBsV`/SeAO!XV9*Dp =غL8QI\DP_s k b] pSz Reܞe*+_[s `cjP}=L,CF 2CKG]+9\N{ EH|qߒgY^அ#rjBiY3uxۖCgJyycd_{d.6|q2\!I7 < R=~p<^< tc: 769ߴD]iܹ1U΃MTn2c6yLań?z$ N#wI;!gJv:f 8k ߱i?m#]qB|= g" R2>GЇ<_{R(i>M5Ж^dt'"koaL?w}ݱ^G9}Yap9,tNA9"s- F 9j pd1ӴuYoαVEbbL6~ a.pBkuzQOy K9WMsx_WɣhQO麷?9Ht58Mi/o;1q?fX`d@*)5p懎ۉGK( L.p!":s# ؼ? Mҋ o)Ml VxfJ7qp|%: ivw;IamJkØAbBn“elDs e]BE[?܈ *@s|9U3Bdc!_4#t @hѼ]8Ax/{mwGa&~oOiq)1H),@́ ["IS T =np3%g[ső ,xx\Isddvrw_+0aN]=zq#_<'_A=R;՞ с؂=@XL䶜so%gϧ6+<+f }`fp b/\хlF|ErFnY"L􉃃B04ij2~w KLmd]?$gw_G ^|6]Şݜ.J:Ϳ\""$dNj4Iz+˹8wL!X5RtS>4;8=7N'e!;|ܻZ endstream endobj 295 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./using-lsmeans-oatslmer.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 303 0 R /BBox [0 0 432 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 304 0 R/F2 305 0 R>> /ExtGState << >>/ColorSpace << /sRGB 306 0 R >>>> /Length 1008 /Filter /FlateDecode >> stream xWMo7ﯘt^Ec!=89RXIȿ̒\Цa8Ejս<{ VZkǻ]GCOFG6:R*j 7K/xX#?nx/?a57BL Ϲ>,ϛpay2G xZ8ck v8O3~3"n>ኞ RTII=l=-$:Z 6@Ȯ Qm4 n,XJl]TqZ,1=|jG2VQiw= I$z*)2qR{&#_u$ "TDjRMN bғRUQ*I5{fe7`u'$Ū~<oyWi/\t'nWWKKow_&<3Ŷ݌T+je:7 2S2w!]?2*”qr~cP}Y H%GRI<C ]4q\k?PVy> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 296 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./using-lsmeans-oatslmer2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 309 0 R /BBox [0 0 432 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 310 0 R/F2 311 0 R>> /ExtGState << >>/ColorSpace << /sRGB 312 0 R >>>> /Length 1010 /Filter /FlateDecode >> stream xWM7 ϯ>Tk6)ڬSx޶ȿ/9FfS0i>JA{sr18}VZkǻ'CπFUG(6:Rb g?`50[m a?ťS~iS'uPk8!WGGpi X.)ktzܰWhkjv毦N]TqZ,1=|jGi2V 6F$De$z*)I3#$";!$?)I)i% Ť!4D"4DSMSgW55|fu?`q'.?gXFeKnx'ȹ8L|0t|y^Y2Ve +o E`ۺ#a3,2z.zJ`."m<tZ%{,!>!'?=㘮H efA|.Jr' [[|E&2dD -gO_q. endstream endobj 314 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 195 0 obj << /Type /ObjStm /N 100 /First 872 /Length 2050 /Filter /FlateDecode >> stream xZn7}Wy $vh" ЋE^jlɐ4d[5O]3lQdʬlϤ8{d ]hUUU6n@QxHXXtSҨHYF;DFYdQ;p!+&D&d;K@h,YA.1WF#W$/Y!Qj!ۣ7"FB@/MV@ A>$W1jrV>F?R. @b@% i0 %h C%6>aFBVbvba L AFD4H. r&`@7B|!*x$ӳB zE}W/AB&18T Qb$0B=`Fhf12@%I' $D^"0!F@*#w^1HՓ̗5*HLɔ%`H8$`kJ$4UshǨHBb1T ĤAb:OUA{F-_0`nsaJoOm=W'՟t,i_W52AuAA.fl<|>NLf8C]M&S4uRA<,<[JAv~^޿O>Y=+]e::E0*gNQ'OApa4l ު黩W/ϧ9}"":(i=k^ 10)6;8V'Ţ~7A1dqqqʥ=VeLawv^ "Rq1MA ŚBmkNOHwnЍ J3LPuTC~mJ7LcCE7tZڗN(G3lhʶjiGIM"&IęȵYDe2)A3:ew?,f-1iC-񁠴b 8_,$?ڦO݌a8A^a&7L ?x:9kYǺxg[ލy ~j1Ru3u0IstB皱G;~^JRχumxu~<|x?_Tǣv29qoX9^I3|-rtMeǓg]27'pdqݴAm5leR+^]J2L7 }.ArE8d@ WP,A{HO]s\]q͘iǼo]ŮI(ͦ=p0>}it*%?RJRL)sHږ3${c I&=P{ˑ:9`HE9>ݍm-!;h M7(''?pBp-ٗ/3oL+t=dlIh&!:,a9dn͈x(G9>  H9W~jOuê2ۤ+:x>˺Erp N0^; ZqM\`Yu8wG5G"Vs4a 0`"nǁIa$ ݢ ~g8c[% vmkQ#d&o)Li@i@)y.x9;ڂ~[)rz\c/4$qӑѮV\0rYdD;#ya-w/y+罷h]j((wtVWSD?K}#kNGZ1Q1fۈvpb\vlޣONpch^Ö 9 y]y1ރEnC;3,|Z,~z\u1x˻M5imch,l;:iVGY.Yߌ^t endstream endobj 318 0 obj << /Length 2275 /Filter /FlateDecode >> stream xˎ>_a%n`SHYnl`29xluwl˱ փTI-w$Y*B/~xo>؅.n]:*vܘYc&9Ms]~OvoFzk_ܬiwZ `d6B 4G0 fV`z%FNT q\tiX/HbRN+&5 1S <qn>+_9UWbe >rACڤd,*C2Y`\?M[z%?k/l*/ 悖uO;Aȶ=J8 74rڳZ!uckU0SMl?x`+X־%PC *hO~5gנ*Wϙ}z~켲x,bc 6  j$':wgYIFyNtlY-)|BzL -ǘ%#-3? xGڎ=f &'֖UM@ 9d&ػ&IU'|},Nut H(άo#<0,0ʽwnC]e55q\_5  ^2|=iZ1h0zd5?2>͵8DFb'?⧰1J-n%3RȵwGFPBˌGc9A #VƲZWDF2@PzHCnML|;~ѹsOqς#BO=C"0I0kQ^73D2y-EǁIC~= kk_W?5EQG@3Iq9m&5\%Џ+ylQD3BQ m꫙o${-ЈY|(]pbp 0 W= 0_IT̃'J^Zg.8T#LffkQqIn^QNϫFAD>"'~}f'8`QnGwvvTK\q;ؾ5a%}*7N|qx௱3g9{';--/؀i ƅ#hi -3WaLgܶ>7B8ʖ7w/̷O`IN-k^v`EwU>ıV;Fs?%a_S 4J[#g:E.j쁮s/,v>LSD3~, r6etw.Qps-wP1*-057nv}*omy m G%,q|ЃI]K p]*y1D=-TK4H_!?^YNC3j_֗H(eC8;.Uۋ%H=QwsWT4B:W;:!=/O m`)er鲻uԛFu3[|+uNfErwoOљ,r0qa5`wo H endstream endobj 325 0 obj << /Length 3671 /Filter /FlateDecode >> stream xn#}k 6kAl'<~HjE"r7گO]}̰)i Y#y 9GuwUuݬ&&~vϽhfҘISurzr0>3~bf?-?V_t?o'R]iXMfۖ^@aok~[[: 8qW=^hEUe,Fh TaOVa􃬳ג:q[K顝ش N^faՒ6hrƤ nQÀ+_eCkTƱ  r ^?VboD+:!ЬwN&3[9e̴Uuwx&Gzv_ u8+W:NDL"@V]| (-%20f[ D[WJ]Τωt.\RHvs-  y H'ay}13tED<+B袥:n%04r~'8{F \G|Yh1WyVQV5dPFilNe {U֨ҿ7B%Tl5D(_ iD_dz0y+&A3y*{Q`,_Js3iJ6xAWξ\tQ}qZ8,7DLuU~ggNz8A aفߡ놠.g,V\A !4cOvT/1 ept"zpy~ ~`(^̼F=Sԇ z?4IL} 2K7ܸa?n"Z9e G73<]P#5EW_It|$' ۼiǷī7CS 0XnfA:R%:O",:}5v쾗7ҽ龐ݰ]nη2,ʳgHW']U2Cj5!A5iL#]t2Z"fXױ HciiX>1Z"s9 [$D,8p٧Y6Ύr-pq_pHx$.z<^Add %FArѿc&1>%^ÍZq2 M3?JEg`v&ڞxozZnɫ5-ZԲ -EȺi|Z <̞P"N/M=7-]?RV{r2_:e|[9.-Ix CCz{˦3PЊZ!MKSIG<'m: 8``Ǒ]QS-q*2rsp*M[JI`z9+2K-Oj!#'o)a6!̋.UUL6pb:bi6^S  Լ|xỖcVۅђXƏrgNk/cC>=nlt + %lCpJ DA+~fr`lD\,P8ÀvLDlE aƹQ,*g:o"l^UpZv6gFˢp?cHƗ*g aϦ/ic *HE_DӜX?YLNN8Qdr%rVQoU]u–q'YQdD#vI]7i#^Jc:xA:#/2=+=r2N,Y2l>y̖y`J)5WXەPd=.9k,SdIsBd娅mFY1Ht}LfU:VmF`G{v1Ba:[͂` -6m"{XF|0h I;wC1\}ZV*[ ߭D'%d[-mW8;?[⌆ŲXrK*3r[L[$|\TBkj9ذ9O62Zb)o|w]~xސH0im=T0Yh&8[H84rTCZu 2quq͝OjZvh ^|+.pΘec?kMn<#U4 Ջ/Я&zb kdq⇟:ABoiݤL{wxX 5`C8kӗtnP_bIՀd3,dI]*J3[%F Dry6*+_T4jz6|pS*{ivQ&3 R"` Jw2} mrgM֪N8Tv g;B(0DFKYˆS7/~Cr7D|ęR0IQXuNC Y.U*J0O^N b; ^( F-^jcZS .&ĵCpYۏ!myƇzyL{NȞu᪸7]IOP*1]*@(KtaB"<ֆMChaJBZY8WcSת.2_ILɿQU VT<8>U8HYH3m^T.12^yAWEiVtLmS87g endstream endobj 333 0 obj << /Length 2742 /Filter /FlateDecode >> stream xko @9@rH ŝ~Ϣl9ίvV:?E;H\|ՉVy}r8I\f~řpµk YfJ{|7uWFWa8˜v׊.zsYodLCwW+P@srx񕆡 FT`@2*WXGT{!sGI[ՋT-r[Y1L5WwXӲ:څl̥/l>6VTr)B<%x2+&BU2]ҲXYPf\5{#!_V!q~GZфp߲/GȮa:/y=1ݥLj0vzUOB"-#rYFneW: %q)B"D)&7{a`Θ*FW8ejBS좱c<8y`51?"|Db^>b,u$+~uԌ%FljmbF5y֢ܨ4t;< pPyU$,ZY۪keUSynڭh+۵mjTjJk"-ᆥudҫO&l0ƀJJ^)/ilFlAM8I+WES$_Q!:MMUl='lUO.'W%Ay!HC#SVzvǯal dz9C7 )c>ֻNp{|院#OߑѬjV,\kPl -bCgq{S+mOmYYZR*mb_q#%FMɕ2{:IahG*-Q5 Ḧ́ 1Vy/Um-'Vs507i2m^j"c1fr;mhu^9撊if?o24\BlNǒB3*fSLaL<:gm:Uj1(OZ&A\@J`JSLAn 1BU͖)2 蠫OgU˫:r$,9)1_w!wh򺮧ܞOa;&w(XUjc \lLYEXzZ{C\D~P3LͲeHQ࿄4e_UfV le^[d +]< W/38/b\xR8V=ũ;IH}4ZI!JQ!%.dRYa%BKB9ݺ餿SQuL&*xX<_F<+TWkoVg5{X`śO~ە7ۍv%"=5HٝMZS [Oނܩ.m:e][{NEn8z!^b;4T6$sh)XCR'Aebr;7s&l Q?Po[4{4>^sfppf?bIGx4>]@[Ѫn<C2rNzs`0+O(ϴ]^Pg˨>?T T͓z|򑑰J\t^#;1u?YYwV"Bm*OƵZ"?٤&Ѳu|0Mɵ{J 8양JKjj| >e;%^nGӦb(`O5*[4zk zhdPQZ,ss6 I_w_BmJ]FHDmѫ7#o&qFvD>KsMuF6Ru~{NG-ۑvNFPik1X)9/芺;vմ|ڽ1c{{=0jF2Ѫ{z4.YVG*WTxgǙnh=Bmg&zŞ-=m:mƗt9Ԝ7'R𣭰t{Pof?J?\CSŸWP< ϛ5UTd&"DK߂hxW xJIdQX8! '@^& p̾и{G/yƓfB_(hYRŢN)4gP˷ ȟCgJچ jy6VIJubWBnآ~MPaju8V@x[W$OJ'v'W=Nw.uzN_OVf`E.&c9㾘bo ^DNç#}%꿙W3?cj_MWʯ~ɿV= '_7oXG/YZ*I:w=#tF3$*$bqQdگFZ"Gk|ULlJ,-FCn$ L5L?/9 5 -8.@6$$݆'=!m!dyX^Jb h$NbA˚]\-nq09^ .`3 ` endstream endobj 339 0 obj << /Length 1603 /Filter /FlateDecode >> stream xڭXKoFW9Im_AC8iKS9$=0%DE(;%2m`K~ٕN։N^IL؞}:SyJa@(lEsbl&h?/hU$UbRY:W(2y?<3?μwW0#]2^iY;iVa&/uLjk1c9Δ51GWxnďG FZۍLQ-Ao;r%W1*Ǜ-{BvNj-3P>D2HfƩ4e>hEc<פ(S-Zp3 D p f<ױ+y-kkc 3R4Uh-`TH sT~TZtÀU.YKD$c#̔6=5vss}ROKŁeMr H`UL͝'ZD|qV͵V Ƒ{8DPcZHUu"i!@Q򙦮?u{j"4ڑD`op7 &{'\E/B0\T{VRMsQOza"่ F;8̠ƛ2dk:L_[ {~[ *5 j_J[\Jf3HqRUxx+>0X ЫHEQb)r dxh2UlЊ:H64?\^"M\_jճ/&sz/S IVg|4# =Fgַ܇&pݴt@ _Ü/3yHD`,'rv!2cgwq켋>κcB{O*!jW>_ȓ8ئqt>.RFp>jA3(0p`VlD hIZqB3\p?.x% oXHp 3R+kɾ:9w? {!A##ljz 7n{ ݞB j!k oc>U}I endstream endobj 336 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./using-lsmeans-chick-plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 342 0 R /BBox [0 0 576 252] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 343 0 R/F2 344 0 R>> /ExtGState << >>/ColorSpace << /sRGB 345 0 R >>>> /Length 6175 /Filter /FlateDecode >> stream xM6r+^D#~փ$,8b*NKOo;t#գ*V,۷7s/y}/ܾe]u^~OylԱMqqV?ݾzO?|}{_?zl/%9>4}_?^Փ ݂_z u/?en?p~}?bn?ri%ś] MX| ݞv8m{~C_p:{\S M~Yħes2SԭúY:˟v[luYWC9ؘmCXB(G~VVmẎŸtkbQYjOm{۫5uطO?85ߜ{77̏,?ԬqpyspGL?؎Wmwk dIk*ho?߶e Z/BZR*W:s}oy dlKzDO+,m[̯jzcyn:s^ra;OLSdz~ ξ=a:K|dQK7d-mnTJ oq65{=m1 6e xJ+/>;i#ܚEzGnhta5h=׶uv<};6ًQgjwnwl/G/@܁lcw阰FV޶{ubo oyK߷Q%H.8elnt-aNl>~m,*X :XXӕUgndM Vj~we5ܕUʪ9kª]J(%:h&ޥD 5* 뱕U4V۰J9f9ͯ"./WU~"G EXع+g$dk]Yѕմ_5ye#~5 ~~Pjůfª৬nH+LLgoje Z(rjW-F Ƃ*H[eª='Yݰs CYɍu9(+ªƱª)~U~5j6:f҃_$Fl^XUt%,VH9xlϱ+cGWV܏<}L-36MlQiD61%MBSW8)^f& IxA tf: ^ve΄AxS{8w(¼s-0W0-yV8 \ѝ*nפnȳP )&%l S8)&xVVLl`%춂.n9fT lj!wZY+-s*|`Y6+U&\!Sq5e ʫY8~`GivUf)B_wo"+ >$|bM~ނ2WM댃=QkN_k !kLsk_wnxkg0S܂+fsTbJx nlh SΖ- ڤxZHmQOh԰dZpX}mZ- 5!e,E퓋1%HsNc,0{Rx5@Ng-^ J솇m1 Mcx1 ʬaf]&PSYc>*<"B. LYϏ~BC2Abi}X>-=$g uwqS&߽gvnq^$\EUٙJ"jŢ۫b)fbc b%Tf sy*]lvc:dg{fcc SlgVTm߄ZXCO *`t{E򘩋ȥk*a n"š@;:Z:;GSoB@I8uj,PۣafRظ[%,O r'cP+c:5{ r dDW[y+EqX|r*c[h2AX9qpK&*EܰZX0߹%m&gJIY0<o ֌KPF-vۄ.؆n؆R\YwVRlŊ"TŠ'8\k׃ ɥbƮ @ Qx4~|<97lPêR$Kugm{rkBk2)Hɸ:pU{x؃'CfC@q߃j%dRYDW4Sd?~B6xGM.MGK- JFp^ma{b:۟k GuIl>Y0rVt]3Lo6kK&-yfЦ=GcD~ۡ9X[ѩ,+W-|kɎ}Ec|L8E+*kLugaE] X|5̲}QIwJmy*5b,RhWfÂ?Ype0 cY~ YBWhOQ[N=l%ر-vVl`[ZlHMY&>r8>.Pt1e\]ut9\ΣښpTreR- tʵ+*#Q{PKdl)tHVp v\L)dTMPɿ{"#>(ROBeY}n1v=ύ;rK$GtEԵ.$ s11k(F)j.C^p: /B)gtKSjEզ['=Rѕ.wrCTN[CW`;XHE7tQWp :++ךcʓO^gr ,޼vZ-!IՖl)WK')ŗ/UX2|Ny3^  YHM2UR?N0:czA׈oUߛaj^cxZ5˞BD^6*$-U]ۄ`S4 &|bU֖azAOjޢ4V\ۜ77PV$Bv=hW4 _M@ *\U|P0UU\wc9[$ ?H4{f\:L6|OJ%- xmr3_ C? wm|kfW<-r!^˪No(%N/unK^8wS56@k_!# _v7JvWI =$W3_` Ť<WN\d},:Z~q1 xKŬ{9Y2_[ִә긫Hs;=X,0]uʰKGu8l?ma{m{t / cπ:gXI}ԑIP ~ԯ{>Soj_#!w,qtC;9vhU8vcgPuJ;]z"ǎؠu:n{emN DL5 rx,/u/ڂ%gT;9rjGaTj VrRY۪zӆd{jC^iVTmI,+(NR.քFu.SsWt2G 2GE ]F!:CiNg]ITڇFSկ*vu=RFWRCPr5Nw\LN[NӒ>N DuV.^%{ޱ+wGvU|.zVo7նx⫋_W]y+;HQ5x$/V T|1mX+3cF c^C">9RWz;ϝޒSTzE]WVh,?E 'j;)eWU.OȮW+$X.w0]lyr܍]EFcw[[Qvυk@ :^8bW^4xSm{篚BG_7C/K9xT-n>f/K RZTz+>0^)JFWT-lvյ*TZT-Ћ}NžXb&z >PH%@12U/#K!ʀI)q|]^:j>Y *b6\PKoo2弆_l3"nS~}oF6~Abi!~߀䌕_i_}_YJoWz;*~7_6~>z/5~3r㷰18[6|zh.z)K/&NmbƯ?FΓ#Dmﶱ[e3w޴/_6~ElWm)7l{~韱엂ߙ3;o#` &CV<\`zli"u 0|}Y;(y[n̯5 PJpaXԝ`qL/>~J/?I츸Յ=A.>~V٨4Je |m_<{hU msU֯!U:N+±V7,(zX, mя%ӣj7ATxל7"LFjS[XXq6iKgI)XN*Vl IGe*' ~"pR&?L<(2eh%;E3є]G͸GSŸW<6׸5,/rwkAl?*J.I-fJ/ ]|5|;WjwW ])^m`~U5k, )V))؍F^-`zC|Y5Ie fC? z/ '6UmXy?{ܯ 5b5<#;kż7a_dKV'Ng+%wW*RhJ;󆯸@gӈomo%oH?kJv׸_/&9m`)J?S0K gTו<ⷴ9W*v'7jqWVz5Z[%qʯv^U~]9~ z > dPIrWM/ߠድ/?_JjwfWo _x5nE7 ^yU آg@rD h N__,^KZ0~>!k{}G~^g6gg_Q~uc=O߉/b񋭗nFHz{<}!Ź򻕨-NNi {~C;VۊƯnf +_=Xӫ>Y)?I^w׫Km?/#Q endstream endobj 347 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 350 0 obj << /Length 3174 /Filter /FlateDecode >> stream xڥZYo~_a*-%Hf(u<%DGoB'JxY\W7}OՕ.TS4vuUUUU4pвiZ6pup٭4YQyzn˲ Цg+^b =\O2 ˼<n0҅_nkkxZ)e +W a.|v2!ȰgUix*鯤aY'zl#d]yrNv&*wC iU0!P};ɶ:vJ}N?gLF.ʄ^}uBg¡j72։A*j荑x)U!CsOV;7*N,bO&sAo ҄3o!R&-̓@.vaܼxg%w y y:'2z#+]bu]F~@Vo; ^7|g'AX#;{;^ w@q%SՂ [fs.{MR"4SϺZ̾GGGТ;a#Hv﹍4e712pB;~h!} :<_6mU]U1di0EuOL8x6p6ǚi7?rOOFы4(-ǯFu_ʖGZMo30aD's=c@/! :!|DcݵCG & W`НQ HM\}"[z;N̎V"Ț`;J`8zy_;%v* $d`_gm9-w[FS T D)ސѹi࡬SHq6~#jkV~p*E'JXswc-[d6T#Z !@= -*j=sq n+ lQ>" Md{co\ gK#x|44B&Z<F Q+vȴ=Pn4 bu/G`^X)&:Y56sU'5oi}9kh*Xu(jxhR8%0F/Id}J!,)Q%BmIФ si3PY<3frJAtYӜ!QBl7Rn+U&,,>OJѧ!Ԩр$DQ(ID-CY0}lӲBׇr˟mkU;&kV}bhHq3[fӗP zb\93[o(yϫ}B8d­uA^J,r!ދ4]t(̪}̈Rt&:@әTS)}0}%U:qgJIdS7%v3T Q:2=+ܸ}{ $]PڎR8q:\Cܢ} R'KJ?m:dWχ yb\ҷ.H$uU2ՋS{?aMV@RMm*-@,@~bgtBlwR\dxVKk( bzh$!;C8pK) ZvMw8 !)slAU!S :'O<ȵ}:_搳SG;Ka  =^ -|ׯ q3"bv-x^}`] )\y.VLdQEp;GRn$U;y?gV]6c +$]sB9\Bnͫ15z웩KURZڧIQ?"Zk7F<BC9DEG.P^Xn0tG6FʏrP4e bQi^yqTl2nj*o!s'VUT599FuX2 Lc ua Ekof bРQŖw)>8$Gx|n/R-!,FCsbP2â0 h`SR tt @$?_\df|"GJS峷NV0V:5*r\$2Jq?*h3:xm,6E 3'lBpgD*YjW/ߑm\^}/j}T{ `Aj3 C*.O]\>1]2ziHI>&pAB}ޡºZ(eXMd' GmS7eѰ >ƦMP[L({ڿhz=^Nۋ:;V^%}BY|gKWK_|Z4ъdS{]^O~ >}vJdg.pA=2 SLk{ `D{{-3:BhJP>]:C%kIC qJ^')sɒ@x}J܅ :FspRh.J tQNEY &9U:e8h "p0qd!t"aR^}PQ9-sZU8EhCLEg#@\ %)U ዖ SVǒG>9d77ET`SeQu({x!w־2P'EMZrT!0P$kYt{~lS0xuFJptF鳂x BI2VgXQ/ѿ72uLل}MTf@1@Wc6~8[[V<J 0~JV[h+gh7oc]: endstream endobj 356 0 obj << /Length 2481 /Filter /FlateDecode >> stream x˒`| +Ub9rIb'UX"JK؍*-9fzz==bHfu:;CQ^ƦH aYq]A" dDWS} bAԭqa9x|ud&$N 6Npp| [ˌ|&s;wR=&(3YAIgl{aU%RzW $ki΃8ad  P& >Pw9O'2ϒwMC V$+\0̗)9^'k&Al'g"rg&dcGQZ̩0(j34)YQT#TM%6kc|hE;‘U8N76޿12"S#9p"粮#Mw0`vdc•_tKQfl|:CP]6Ojtr֢vyT <&/G8 N }DE{joVď Œ%w;Lx(튑>u܊KU!W4#k r"ZFpS pa?C<0*oH92NDDm>LtTO]>bO):j"Xt_:ڶ]"t( s8 c"/~ۋ>lᩭ3L,s8ַp7&Mtr7Q:aOJgrjìqnD`7w?T!j y`y{sb2j MN%XSEZM3W[qa*=zgX}l"U)-% * +aIzv|m-R ϬE؟a$cx,F%Sȏ`oTs0YfR%9/_ɴeܐ#53&R,i%γRd=C=H) Q?@Y ٩ٜ_;E7uCAg!ri u&of`s u5BH'p `l>3-nsa78 k%H N,4/O}' cAtޙ*⠪ K"DVx8Wj~挓wyP! ?jI0rCPㇼ~#&]QzTq;͔V*3t-MESe+t U͸i^_2X; n|ȎkbS  %]F= %uMox8.~qM MXvWF@#@r?F8Z*&_mS3)s̩L gj=oY?WBDF㚘\mMy"Q;mz#Wρny /I5|2Ns/Z8[),^ci?DўI _EH~4jkaƛJ, ea2 nVik!`w(}!UuTqͳ_Fǣ endstream endobj 364 0 obj << /Length 1806 /Filter /FlateDecode >> stream xڽnFQ*B3pɡ@&M #]b Zm!H]Eo)HZ0h߼y6Jf׳dY2z̘2.lL2-gLlkڌ 7rxf~~1HFgO_3UR&6NtUiZ>_-| 7(Mӹ{, k Zg+Xv;\[ڼix.l1Hc}Np0V5B?Y$/B#&$;dly^sX;xJxbx"2IVX*{ <=)#h3%GA,"vYw$/jYa4Bz~qRK:B>"3YtI刮υ*|LsN2 Tv,Hy(< %=̏B *H%NFw^y%bS-8*=JMd]q/b"rWĤ(K aJ 'Lx,-cWZ=t sXK?qJeoO dC-k X0PK"T#y%r1D {uKDt4Z 7SֱU[Ta$Mec7ā)^ęa!ÓZ7Áy-KmlM'.Sm}yUbc 9tOcVq^6v=FRh+iLa^5Kfm9(_}Ͽ5U=(  erZ X/Q0ąɥ@dɎCqZ,%V+i$! GT3*r;2Q=_ N*;]-r@Ŕ'i1\g|̎ZY)݆Kt4$*l< ƭ7=#F6[#S*#Q! TdVl(h8fd*0H4*\o{-ٳ&9*ߒ8ƣ(=qΞ!¿{~ڝtxJ- gMD Hp9ytS DpoS*Y?mG_s NSV(VV"N vwiނQ 7&:*8qrDF`b &Adqz&fUHB['ώ\d3DAwvx|oy#lH(3KZ w0;~ {u > endstream endobj 359 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./using-lsmeans-nutr-intplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 367 0 R /BBox [0 0 432 234] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 368 0 R/F2 369 0 R>> /ExtGState << >>/ColorSpace << /sRGB 370 0 R >>>> /Length 1316 /Filter /FlateDecode >> stream xXIo[G _1Gˡ:hZir0rd%k[|H$!9pF]0n_o>|3.`{3޾W;¤⅑2-NbzǮ&gL 6)& [}alz14=08! wȽCÓl֋ruƦ70P ypN}bM8;r>z>3.s3ܯ C\A;VIM`$ 4Kh 9]yn'J X~nj Mdn8TJ%]H·M5~&HG!*lT&ol P%TΉ:ބ[0Gt'Ÿ_a 1wqϧ}a[(( ~`[gVm%pfWHVחfw`K+xִ a)Q~O犐 RjgsN?_2Z$|5@u~1}7P_WoD> v>Rab{6>]=MqZB;EX=zW+*@a;ؗb<C) {(m mJ*xP/#Ч  a%"BAo2n$3=O)v ~2| n݄yG9(x` d|\>؍_5d0>I&ѿ0{ AXi9; hom<04E5@1K +ed''+Q0 *mNNS:`Lr#xi"N3 a endstream endobj 372 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 376 0 obj << /Length 2557 /Filter /FlateDecode >> stream xZ[~_!\D Eh4A$ڝ"I4kĶ<μ&Rg>x$Ə9m?)~~u2HT\* 7ABUJm11WIخ"%Uu 8k;tԪ(In<쐖~{Rae3+r;; zn5޾MҪ҂H(W"6v+@c5ya/BڜxW?4JL@#dWԾB8 "( Sh|lf۳tz߱-/\TgG"@_X=}߾Cax^sXA'gd!m*9J#mD''q o /I$w &HEaG/pRU<۾I Gю-Fj5Ȗ;'0<LG˽ l_E'xw GDy{v=m΀؎RDOU؍eLLX4`w Z*|2uwki?3M㴔5~{9ІaadDgAWei`*'fB>Z-ѱԑ#$[#45V9}gBMݑc>Rڙof} >˺˜j8gGsN A@?2p. G48kP$lhk'UA%reڠ^`^"}ՍP|l)IeK :_2E3Nz⹷#+d؟yᕅYWOb c4iozk}GEʯUU7Y80Ӗ-fN.!@kD\a?ኦj&K1I q͈4ᡘ ~ ~J}B1)JN =')&Lsx Hw^-ypIilAx͕gsq4L# i4~{ Ebr\f=yI=1bxW+bnxqUh[PثgP.f#w)C.+N>C1 x 8шc6l%5Q1 L]kHN@:[gd> i4E,]R5wVFnH#iTd"w# vG2J -flOև֣Ej̼$95|hE*ؿ4C@jPmߌu@+{micvΉZI^sF;DxULR T7А֮B̘_ 0왦#lSf}UzSęQ<鷺c'Q8i2%W{`AHSK<{fqVP Xψ=nn+  JJ0au1R$>81MQ,웍͖.Pb8QJYRFp :΋*ؾ.Da}w(>zP)i.B/*9]Z ?vQG|*XƥއJDYq4'})KaMǭ.w4믥S큱ȂӀu:%١FsNu8|E{ǧsz]B|я P\1cyd#;oa3M2t|n}ٻ}"/U+,Xڍ ʥX&QDkCb,cihWP{S7γ{-euxP{ؠY2qZp*x숍b^$eU샷w(< Su8QUPNRh$ʸbUPK߿r VXjK.C[Cȸ Kjr׃7; y.Ik8-97/Y׻{=NSRUl8}H]DԂ2x6%=\< ?s/Δ"hI͛:0JW9ͱV*^t$52_L"[JV 8˒?t:J endstream endobj 383 0 obj << /Length 2421 /Filter /FlateDecode >> stream xYYo~%K@k.I` v0@d?v܍;Ԏ(ZA~!%Ѵ %z>W,v"'W' PU+e )L7HyY U6PN~ k=9;JmU<,*Ql]<_T-r,Y:BC'YJn^Cy E@Ǵ#rWң8|][(P6H8W_<"VglNT Ekp9KmgP8XCtqODrL܂N`1і-O{yԲ-'j(%J >~b+p3ES[t84%7Lg;knz)H?@U $UUs}fulBz?Ie28£ˉk*\hD%K6:DQ=蚵Xxh: ^ɐ`kM=OvqX-#/xSS&r[dGg&x6Kv $*VC7cOle VyChR#ammYSǪ(P:ªT~%`h ɸ PBY)Q6o@64݌2&xأ&kD fIE=LjQf*{9Qzo_K*g7-/[r 2 2RYFKMҴ2 ԓX8lM3ia5I:$po_ vј< V 4 D^*w0"=MW@MbO%؁"ǕJ ՘{?5;l$U5to=]1 p?*]ucC&9: פ'^3ORTKנAxo74B@>#ԋIe[ቖ`_yrY,T7dO[1Drg'M O6ōndin:Q7WBzѭe u*K0*!p%8\EDs"ez{i[V%9vʶB[:eIZ!{:l$4eVhY ST7@|zw+ڸVufn~{XNʨ2IIn G1MGp<ӿWv߂MC#զΟ:Y:b6<782&]b8gy+n2X֞16=t*M@ DWiǣvQ ]U 2mE0[20H Mu`wM7s9>ѵ7TOpv"ЋlXC#h׭|`S1\=׹X<0KᖁFv­̷L]Gj n9d?@L.,6mj3̟i`f09aζ,|]_A3bsMʥ|UW?ۿ@+E:8$$RqTuD#JUQYA*hm1 O[ 5~"UxB+@ EsW>LNԏ8@#b"[x?_!'ao>8FԠ֥.E)f212yW ϥj?evMܯк1z/6`{ljݔ¢SuiQWw!̅>8pZǔ!1yzU-lU=x4'8ٰ+ՀL#L9vql%&dziKtۡtu,(2 :%wRmAe iB^2p|lh+ds UO%EJKԢ'ke",jHւ|KȻ2kh@?T|cO=ń ufwDzxIM<[ y=9j < fsY+LhyO[Jo)К,5$NWd{,c L|g̓uHc fۈGf>ng@{>NVΘI3aܦ%G'٤/@{#hu/BV8lMM;y1Ax݊^4µ4Oኁ&f Їtl~l_8 4K9uz@&)tk_3ݬBk(q4GBmdaLV~GqMȻWgI A(c>Wy endstream endobj 394 0 obj << /Length 2590 /Filter /FlateDecode >> stream xێ}BX\uIt٠(t֌ؖkyf@oϹ4},Q!y7m%Y#7WUT:Mt)muRœErN~H\iOX, ?w?wWo4%Vx3ʝNV_)G).__2TRMYZ] 2)IZ+[L;n mvcVe3.9gX3C?{vm{^qw1lE&HetT& Om:xknTnKsM5j̳b*J@n#d\UYOlnn]+\UGHesX ;ynqm檠^Gn RcUmLVȧb<@n֦(/!dL,&”f\+s,mE繫*冫IV'.U*n-k8)cKKt+ kPm@^(l n[%'Ga?}ċ\oJW^XiҔ섡eC/L|˕uAv-6mGG<ؕԵr iኴkMOW{ &=A؉'jNpZQix,7a7 x \%8y֖ijT{zE̲j2MIJ?=s)jagG vEswȲ=tH$ 혗Ö^`a_{zV|b37 oq'Ov|C2#LXޑ/ n{+:6y$Zb.39rMsyKӠ[4i۞]IϷm?w{:<+?5},NQ_O~@L.gvCAvxaKz, fARق _&znL9Qe韃Le!Y LɡUAa*!%iq덿|k%WAh|'dϱ{V!Q>oER, 0="6E&3;b/[֐F٠)D\RX tt~7,L<{EDhS sXXgYe(E?%lɸyXj$ i'B~HH"{9ㄒbU$$\g$О=@azY'cLWgSMpӁ@\~y8|9N8q&uA6-_G6$,JD K3 s[އcEPI!piڴ$]Mz;ٜd|k8ƂnK E 8MQ9H"Qގ|G&7}BB zE9DP5eUY2l>3̵TBg؞ks(<(X}OqJU}'ERJ@)*p'ΠMԪ :f#EeQb>uכ^yO ȵ#7*{u%d3`+v[y<$)2DU`!pz%P5`t crKB13A9M^T"6>Bhɸݳzg 4m-:Y/Zĝ6B&73$nPԑ}2ϞUwG;N~5s 9$.gǡ/%]YWP/ Zf(Tr[b;ʄU~: )]9Ry*D :kJsaWw,kxu~QTʔnT6#µ.1S|k*Ty6s*WUvΰ5g)dfE>4%VuX܎эibJWQFn~!lWxK8nڽ' F-k f9R.[q;cwƲ:j*gڵ 댙^I֚nrCKKV[& f`UOqќ# qsvWCTO0p;2?&P2N3\\fo܍?IvLr='ΨzWq=p!;𦬞d\;rp #{wN\"]jnAsˍ.O> _tM1WP endstream endobj 388 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./using-lsmeans-framinga.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 398 0 R /BBox [0 0 432 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 399 0 R/F2 400 0 R>> /ExtGState << >>/ColorSpace << /sRGB 401 0 R >>>> /Length 1271 /Filter /FlateDecode >> stream xn#E>_GGޮ~pHC 8D{؍'N TcL6sZ9]u~T\uJ*]tȻeEW'\V[q?F?'B;7wJ/O>yjfKfXD^\kӉX]7e)Q$SKb׋@\;[N< '.>%s|;Ȧ# HF,;F3 1Œ":Hq 29TbB`A_쀮 w0# zpk K$W"<: 9ʔZ$uYe'掘%r۹ZtvCNҫ$qˮ1j25tҀ/ ×D)tKt=o,fyun6|}}PfB5Sv“M(@j#4ғ2pȧAat:h_a؝Kأi{ u IbݶH,Ljش:{K肳tM"u*6mIKaYfBSVYBcXEV(P{YB;$ N@vʺ09}PN*l!|tSM -0' X1ĮV;#*8.H. 8fΜ$c 4Zy$"՜Sw+RC|B)Ii4SSdydǘԊs߬j*L?jz=1q %n$<wHa)0P4Q  RE1:Q9YW4k1Y O9JpzTS=< 8 _; 湺^QbQ f(j(F1nbX/*/E[0Ÿao9ШN0sx̼8ݐ[E68Πԛ{ NƓ`4?K $5;3~}zibQ{kr%:+% =mE 8)چ3t1œ$Tӑ-LG6pbJ dę >z!HG|9qٵ<\Ϲ#bfO_>#/y4N,f桾p*y?߇?u$* ]]7#02^x՛NP=Ţ_Tٲ&{ʞ~ S"eX(3tRC endstream endobj 403 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 389 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./using-lsmeans-framingb.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 404 0 R /BBox [0 0 432 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 405 0 R/F2 406 0 R>> /ExtGState << >>/ColorSpace << /sRGB 407 0 R >>>> /Length 1220 /Filter /FlateDecode >> stream xXKo#Eϯ#DoW[Z8$B,qLSՏrO∃-f@ ݠRJﻋݷuWUhI:WZ/~QbN,՝_Gtf93s%(aT\/>l/KX^7g#HS2 IfIwr#?G?~ AFkQImb%@&Qi&tITK(%aP:]ERp'v%;_ZOJ2~Rw$ U*4kOi.ЅGm;W[$~v2â>@Nh%++'~!T/db}nZ)K JpL} RE<COnW+ŃIB{~jbbB+G .TWrOkZQ;W20_RԕXVLYYUiu5Z}=@6uRNrl@JLbKk[BpZ% TJg\>e|P 'p$ 1ủXNsyPL'V'] n@S#'l0P@U3ovjrP-}|1Ȍu~9vcMjŵo.jj\8G_σ8(ݝ:BT*{9XQQUhW՘a cuŜI6? !/>7{ rA}&ˍb^=v}޿<=nYHؒM䶸Y\Ϡ/ w endstream endobj 409 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 414 0 obj << /Length 2765 /Filter /FlateDecode >> stream xڽZoq6/QZ\>@Pb+~<-;f(r8p8UNrw%?wD)985qe#J擟 Y,JwM/n/+6;.ubwϥ-=q15,|8,Gp.`x@t鉜-zXt=E b h^S.WVV{)`0mNJQ6PΑʏ^t~UPus zngkY{cMz2ZX(k4_\:*q;_\YJ$XwA~E mP ]@v|U.:‚|Mbj h$m0s4շb{COidڥnfܷ Qj=TUv9O@dhzXYYhSa]1BOء#vE8*0C"*ohF[hg=-] ^_L)iXm&Ix}4+o ncjW NdKAWM Հ/vL>"Ue$ڱ&ha -GĞ8jlwLg]u ̹>Hvuԅ4d+Ԅ *@AA?u ^Ml;m`0S_#.N֕s9O]AZorՄ".}"Y _ƉdYx't.{ZgDSi㽧Ɩrh<{dW7>U0~,vYl7=fU,'YɩuDSh:Paa27i%,Hi()@JWRJ{gt| <@nyVW46CENGGol_K}ַ؜;kz*b[r# '+ aKÖpҸ-j”P/g?VD91OxY.ʬf"|GdUbkHg5ϩWD!@yxecYF^bFOUoDUHl++f0<35; ؾZF":gM,0Yy(ZR븧/q`AϊYy m~>$?JBg lN!AxdP9Zϒ<ԤduoaU\͝ z[-lM̴b>\sJ-F4I ‹00Woo6ؼx0FnLJ/L~.V+j(DVs&S`lm x'NN ̨U2|jQJ1[P8(ʝ]&3ZI)5d]We&Lt%tyGcTRGySY ? vpwbV(eњII5賋_HzVHc w\jJ`u51唵#g JڍXSQXR R!b* 6`dHhkLw5܅DgBDHvY级i`RT2cȤ+).l)Q"U㕔.G4Ƌd_o@=2Pñ;AC#5;)&V4^Mrb-/-l f%&=]J])^1@\!:9wIZ}rF?`6^u4!XVF *~ט '5}I9 1K]WYjPƀ"mҏTn _<U rr)^P1#9x%O2oĬ -uDL;LchӥeOE6XJn3QH!N|c1)R m9<6zbPKU\lۿPg3je n}:=xf!`v)ZtVhBk5TၠA&AYp7ͤi_s^ep#Md9҉5_ʌJ-%%dA{E8s= 懂.3UeY,G g{]:})M$E6<)[k-((ߪ $101x&eѱ¦ҎÁS7_ %SJ3yےCqiWjKN ךtJO'\bi+Y oguwcځ=w#Cn?!h0LjOcJXB&l0A&n4mMY8Xw-4F%_ƌ|Y䗋)CZ1Mj8kP֜gFGWgaz[rf{p̣%7qt1`D>E)N;vgpn,ANy<ܽ;Fp:УBqݼ[[wVoo8*W +Fgo0Ja{r 8)J'6;YWLlֻsU_&m:1є6~/V8F Ӊz?P endstream endobj 420 0 obj << /Length 3285 /Filter /FlateDecode >> stream xY=ؗjИIibSdith4qֶE{4I Dz> ]?7Tig׫Y]+SY*`d96tfW_ћ*^fuoh8fRUEf[du[@ZeY |8G|9DD 1Ke ;ReꌐU%1di$km ˵r~kxGw4;TZdQ._ p+x;`tH CWs[y@cV|kS{ALRye^&fS\VB>5(9l`jG?nVUqw?1ӔW#ջ1bMt Z+=~n% lTɉќLLSXi]1^_Qۈ_ fBą$*xHVC `u9kIM߈!'-dX[q%ly`Z,e߹27F8^{|U$n[ [rj"Sn|x;>(Y$3c;vMN(̛_[d{d~?u14`A|+#c^3m(KT t^ -//)M$%7cŚK$r5iUH-G26*Qa S~VHvfwMN*hW"]%?o$p`ȼ+t~# '][,V'ۖAT8v,YChyrsfi n`GA?U᪳vNYvaaws5{qr -CI:"ה=/=0O/wΜ3w!S&76ζ$<j*zjlnc*iOCP,$iH@$$UV䏲+Z<>WB^6.Js=)o [Lj_ GF gIȂ|و"5_I%Ǿ Ϥ Lۯ8ӈ j@4tC^ N`[diPFzgX i.`+N>EK Y<Љa>1|*(M8tʹc e0pVs%PR6\dͅF0H:q, %?u@ОJKϦ[ gatɢ߄fKp(*=&  ,-N`;b;9dwc aRjx#Ez{E| R2 r]zn]ޠa7p 04O'3ͼR6;V쩲QJg>ps;4v.aj]!WwWa{hkBnC>iQ.{WH*Fnq 4D༼@fCR~-B Y4_=9} y`P6҆[iTiyYϚU(IצA§y_  "  Gў; .jhYGƻe}YnU]X dfb/O fvč(3Aۃq4i*Gǘih~Ue w3^gK [qqыl^Uփ ql AY*K4!$q5ilT˚ hО _'t7魉z^G2&GbԎ+L8{c=Ք=L3UˠE2iqһe Wdł* )z _^ɩk~{&j@4Tm\ A!ЌE^-_8~34e/QOAҾ6U2o] ,)HW侇0n9őp#qݡp1;PT5ب$u8vzRI Ԫ|"rrbs!|'Be^В[dz-EboyOX:dM7.}$O'V-D[?E_񸰰rKċ]Blfo> ﳡ;KUVhL!ZL49 TC.CJl5`"I)jsu5y4+)"}*MYHGΗeP{RB҉#ײKV`h;#C1:A^~GG] ~-FzVڸS]m@;) 'Nyw(v;=!*Yr2$ΑW̭U΃]zTC}n\[?5ReJS*er3j'5lQZg0沉OcyyS UJkw&l1Ʋ|M.M9bx Bs#*] 4,{6%%ïUat,I+_Tx]Ct,TʼPXd`?;.KǍ+Qe@qVI@A g#tո e_?Tnn!xws]擥Ouhҥ|_9oo>~nI& }NrSF8's <{a9. endstream endobj 425 0 obj << /Length 1559 /Filter /FlateDecode >> stream xڭ]oD= D|^{@:qH@xxp)qNBvffg׻;mlg>of Oq Y&"`E9Stґn|~C @p~z["TD""ɃLQr|iX^R~Z#`>?6~p#D0F4: ~vQD*\\FeHka`uUF,rTGx̄CȢ"-EDe*NYk:g?5tY)"UEeFd JjV*"+3Ec^)A'& 7I"`c#`5E E i'pJ#DVzV9Xeb$$x!*. l$2*T Aæ~[q=;qG-S@x'EXv*WM:% #EKyEӑ mط]@Ձ2V&)Pď!I,O(!DZR`X@m y[5&Q|4Aɰ; H֤QUHqQolV;qxp+ϮFtH,qt'4c\%j2 4z7A5O80^I%҇ +erbR4#){зq9bpft#q̝Y+-I gvǦXym\TI:J9HQɅrTdDF!J™'Rggc m},xV~|mŁe:~6f ҇e!G(H,6G uhLi׿g& P~fPQsܲ7tNfx7H'Jߚ(v@=x֎z9Ǵb&%φ EPc<:8V}t8zc'~q\dөcz&:@+!OuZg&yiOn>qF4,SN;l~XJbhS~\cΉbTc[Һ1}UNy2ڒ@Zy˛mO~8}> /ExtGState << >>/ColorSpace << /sRGB 430 0 R >>>> /Length 1684 /Filter /FlateDecode >> stream xYKo7Q:CuWh,#[nګ%lə|. 'Wۣ٪{y3vy .`uWW $ό'Y}&Vvx^2%%-7r{u|VVznܽhͭdsgÖ}ޮ?^_>\.Sq|q\Yfdr]m/|u>_Wgؗ=c5~>u{yB1)6,`(]7)k/PF$W 6d\$.` L6|myȆ5WP$>(u`K b/7d|Z[IX~apQ[[+B߷Ȩ -t6idOYGW CwKt_I$܉jeߛW4i |ǟNFg) 9H2KGF`IPx]m%p?NKG<`P\(MDVo:lIjxh烤c/@8^5pPᚔVPJ䣅g-X!-:,YCd9&q*x 3y>{b!{YjAn.%8r%Χƹ5AjMv=5)u'QuobA~^0$V]G< mʿ#W>H[CKE7gt#7_t8{TaIXGJdG:ýo-Ϭ) =? ?'iDK)ГbVNb\t Tu\:wPT=. DN1O⛒aP&2 Je;BQ%aY*M (eK6agK4=Na%5K"t6uiFJmۊrnp&ĻM|3geZ5@OO9 endstream endobj 432 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 320 0 obj << /Type /ObjStm /N 100 /First 878 /Length 1979 /Filter /FlateDecode >> stream xZn7}W1yr[H4mhN:R E=mnY]RAΒ3g.$)g<SIxςv/}fRo4I_xʥ\=B 9^ _|=LȘOJhxCz|H1P tJ‹*t,,Ւӈ϶0o·"`keý*@Zpn2xtڟw(|4!_l|v8›ppm~~>lzq3'[*5֮+ ήԫ~wh=_׍Uwϗчc/?pUߏ _sJU/ONT ~1zxtxyY j3#4\ny:-HuYkIMdSQrfR[Yq>w9s}n䀮cCvQĺa} A hafX`eU=`S\E^>^5#{-&n,l5PK$;n5ص/P(D%'o+'&Zg̉HFMzbF[lUİ*wsE9:=p2. Mdss17am8sz())buSF0rBvol!a'EW^:}阓eWl݂ϲ9[xsuWngu}qKϯ;vՎoz[rTu)xBմrBx endstream endobj 435 0 obj << /Length 3070 /Filter /FlateDecode >> stream xɎ>_!݈EX,.$%q01L>9pHv<(ȷ*j$U^})2]ݭ՟_r͋/5ƬLimV72[i9u]\z2{5\;p}ԥp5t/ {{+4s?|N oBfq?o[A;Ҍ߹]c07!/pE+J ZfɎϷl < s $j8,F!>`o2I:sKs/V:KkŻ ^sS7 RQו(p}E'P)k1G!05%\(̿6 H+/A4ydZfg0AY{@ϲAF$Bf-=qwɼȅJ04vi.0SE:kJBO-e%dԬWE򭐥$c\ve G kK/ {wo8gy]x⦅leVv+~G?-8F8+:^EZh!DVh4"7´k" 90N4 Hn#biuXyB]#G15h =a_gՕBJbm5o@A855,yO*{;kNBgR]yMCt#:iV$yBpx;= _﯅csR kA 4@x$[nC%6Ijw:1e9PN$̑okk@ k[-o–- xft F&g;JA]`3yl煮P,Y\l_JƸĦ5l>h[?@sQWcCځqz4O=p%VldUAu KGx  Ј# eDخ߬m'e4v#F8;)MyV؋;.x#x 2=3Opϑ-”r-|iUJj =[YvX 4I*4MܕW? o$c\&XU)FJ@ؠ[D泖{Q dیP3X@Bx$7RBXglq1h.GPd7T̹:ٜc xy׃7{ dP; 7bO%IQy"P3Qğ6@QJ/`FYqa"+@pu轢b|8v*p>;|I9$ tǩv0Q ݳNS uLTxIlXYMMt5PMRz&6V>㒪-fvk$9I#c?b8]CCiXf :ʤr-r{TXm[Zo]Q~3e4s/0M&Mp^V~ ھ}sҪ3bTyj]bP\ z""6m&cU (l' >w7>2MQY=Q^awɩTQX<& x*F X Girj#@ P^Ѕ Ӣnn! *[ұ75IZKΜWIh&4(ݪPJ*r8)F.=b+2( Ͷj͑gh Qp$ְFBͮJv"aw!#$)d C5,|e9)۷O-ҾW! )z*dԶ7m)va՞%+Rك8\|kD÷os!=b7cw+IQkVGAle4,[Igg68c"(]K9 H煜 `HvZ>JZɭzaSź,9 [D2WB\_&e\e 3ΥV2+NT糠}.FnJఎ"\]~@O@t6 w 8MaP-y4}" !;kښNq`?P$zt@Cdpb{A*?qT1D-WJۥx%uNuEWmrRMj_<dmQAu͛K ٶq& (8Ltvx=.ۇ2\>KHn4,_e8x?υ> stream xZKϯ0dcF|!E`-ږNK!ARi$ADRz~U,'w7+7ZNV&Earי___lҽj7֚ټvy_4R's55r*J/篂94NZOׄ{IwI+ZSKZhMXkiME8+rJ$!$0J+Z7 (zzD-L$N3d"v'$~w~~-M! ijRD5\ؠ?h=p"bH~)#tV:-a(p f*3do^Y֙Xr,x G B]&IғtMlcΙi_فV7(qy!3_|\jo jhpF2\-Ҟ P;b2_`(/{8XD`' %L76Z71snE{QSDUZ^WH)5s_³ʚCS,(4)Znk+.J=}Ο~D%8ѝx{Oyhxۈ. 2w17.\K!?Ѻer-,ϸ=x{Ix]_In)yUQ[|E 蹀8%LR rH 8"aME+NKU#:ХuAqO˙ՒXi^g;\(FZGX5*/3\|je6eI*'efmX加Xu@0Zg uʤCM⼉vCcA( .),4y7g#geJyc4W\S5U @42[Oiw|=KZŢ'V*m2K&d]wYJo9]j5PaI5ƋAa:-E])*U)3DE_dhd#`R̜%3oe)3&s.o'<1<1l^XH:Wddogf=ylb$%}X:ڷ̎66s1Y5l"~ZfLzzgA@imE0Lq5~:|.\NhAX"P|‰JBqx9aBU\ƕdJd}kq58uC|?edwƼv*3;.Izlb,{ΐrbWhV[nl71 eOmh_ՙ-gnsuXhSgYHcVߘ-_UFTR*4;|"a/hhubf v# `{& .UM[**dkJRPN?}e=V=␕|`X'd7gE0>a{9qv9Q+ x#Z6h'5j7tO*7}3*:H9EO/jz<%@DaQ?@6i0,0X-I53u8aj` 3kNqb0B6kƧ^w )/>a xF/.u\rHwuTu-Sͺu}3{D ]N2ANױN!!v,խ4۠Z^W._## "F.&r`P@lh`{ƟSFk/d2/B {P*:h9Xݿcs endstream endobj 445 0 obj << /Length 2142 /Filter /FlateDecode >> stream xڭY[6~ϯ01KR.&lH9}jAem|9k'}^pF,E "3ùr?Iz{[gJҺfY.K!ݭg$jL;_(mʵyOT%jRaHs-ub(e-kXtEZ,W\玉.sXލ]qpeR÷yw{q#z\zV41TAFabgFL+EfTv^YN TЀ|aIVv]~M8nB*d6= Q`[mێ?ÎflGiѱ DŽJ-N9CJq%}g.mT'-tEa srs/NQzɢ'*ta=Y GP' Q%Rꚋ@EyG3Zlڲ?}FSO=)3!LキmiwWYƕJM8w\YsOoc@k_Ocfs-=GL$*n{Zȿ뫾 Bzp<]$G>wwNMǦ~wKE Lds ǥn1$bU*2A2璎SƌVP# Q9PԘd5ډU>RHMLHks[1hZ< cOd[},1:Y#2!Z%1EwtNTd&]t@l|(vw8 " Zei8ҝ} aJZ)/k4-}unyd8Oy.V2v5f V*!G\&"Ͳ&ڒ9{[Њ9KOi-iG +EDMC"h# !DHN 䌨"L,>PG*Fdt Ds!"ʚʗBP!.߇Ev4Tn3ÈMR utVO! ɡ/:3Y17+xw\z%1>fӧyag\'˪܁# 羦zrcR'y6BSJAo{(xJYc~MaB O2l&R=]<͝_yɗLus ]162>мc95fRZttiȊNPoT-x9DQ5"6' cTO0jh}E*X'Χpc;rkY}M/q 4P~amEvY - lc@8FʫBeƻ$PK9uyyܞy\E<Ẃ6g!TZb÷24L)pͶ ` iUr''&ؓm,G==#Oo5]o<'yMA~(TGv~Ge֯D9*#x>G]#1d+>e󋿧)uBg?9]oip+<BU_LW7:ְ`됞sVьm/ut1wy8EoVPN=/AI7g9EFp]_Xά`,-CnJ~ G52E|[?CWV[fu b:_+8%޲lTWKt܈PeYJB9!BEeg7LoX>'_pq,TlYGҟ6!o_V7[ a/2ľ{,ʂ*XRq f6&QMWU`3[:ĦMrS؞.5T'q]E~r)Ý ,&.)FN!߅;ч{P1#m"N8oHǦ+;_,+T)EA> =7w~3J endstream endobj 462 0 obj << /Length 4253 /Filter /FlateDecode >> stream xڽ[YsF~ϯ`e*q9p%%N쬝uIrDRcyDv緯 @jA&03蹺gtW>ivTQV*uzt=3gcMX&-k>Ͼ/G:UUZiDڒe\Aؙ*xyS/L[U2ƁXWzM9s=m݌׺pʔ419*fr`o2B-jְb ⿛7WLˀb~:9)*+O^wBO^S=^9?wr-^FBꭼ:B/P§^(IbaM*PoH0]P-'gOjTf!cX~u*ͪ'P{@dmhl qiWɩ^h`= 9[>(Bi`TUܺQ'\R%=HS۞ |s+C`7o&B%x;lKDhi;Ga}@"s&VKv-RV*S2*7=.w*ʡDʤagNvC@_t@.܁dSy`ۍǙ;q*҃-i=hVLR3zCvy5xJ[PJ3 !&=XЬ^p $Gڝ*f򝟗k;q[mQ-n1gCA #3!0wB>'0Do{<6?I2]vٯ@*IFbaFԺq|4qH]2NzyXC#j\[}U+٭ZpŠĩϝ;|ޒ'oaiUتZǺX>(\zktYʵ9xTSNYŝQs[hP5]ߒQ >>V q Ze+眹N(AZ6&T!\Q׃Їy|hNYw>5- _ N "˚f:+(2F3o([ S+`^ qFw~öm|Ⱦ(Y40DD_ev isS cCeVՒr H+Zgc 8X phݣGpD`Yo]#;{|(ɓ&/|.%ը3-WjsCҥk*H>=4a5a$aykYI)"Uq"uZd P[&TL2GdTB'Y})%HxAQª6ǔ9Ӯ 'bpSc4Eg'p)KN*Th2(ϫS,ep4sTNH_%MGzA ŇKR8h.8o-#H+%8s*%sipQJf'-㯟$ʔͺ){+4W*"Wd&/sP2YH5\W,y?2)Krh)=b…Mvh1n&ljE67S狵,q\Zif/9} m=mVt<u̟"yR_Y.5ppdAcH~6kf,ͻfCʟs! f V vAc,Dz0$Ȩ(mꯪ(kQ,E TF* j*2)$4'PYG5p B12^- 07!勷ZېNexb;npPܳ+`xg& FrL[V.?-0&ϣٖUlκ2i_BS4))p0tM! Πe!5i/1k_=8eƐ#ɒ@Ak1Uk16M{֧Ŝ2R=b/Y7%{1>Y1W|Ȧ/ ̧[M3ox{;ܒ~pL/sQg3wVᖛN;jZ~N:(8dFo0QetxMOtvN|ӇT zv%mۘߜqy?ZkA%G0x0̗BI,(ek61Qe6*-UW>Rpm 8Ji19(]W]6Jer_ۼ| UP䝣/Yz-m>ȳ.|fiOOD!%6 0,ݝX. e781sFBn.gS޳!crUnZi5Wo3!Wꀅ7dGK`/݄TAtwdBBlN'S7?@) ^}J]%I MԀ57ߛ(Unk .ElW_O endstream endobj 478 0 obj << /Length 2461 /Filter /FlateDecode >> stream xYn}&HBf {u!#Ӷ%Q2N|RCPb6V:Ea %{G7OLK25'owGz(_*ʧal}ǧ&e)<% jhnJR3x(~<?S cESy?;l+|rkoYRhǓ[pv*]C}=U2l P6nGyêp4M%&9X2>C9f:鷾|З/"pAJA,/hdTAYo+ڱjD;ܜ?W L|OӎP, ",@+CPd ŐnhKl֑5]&x&!y퉵Ede4'>& ʳ?Asj2tYrW T':.:" ▛-(]x~<RjymI0eVDnt[[&5Ųdd6a9QM< ͹h7o.MNOY~JIZe"5_ҪʽUh?ZZ{GB+":ިٛZ g[ܹ* q W/Ike4X,V_y [Y"uGetuKj^NZbNh,a? FO5 oar'Hno0K [Z/Rye2xmЉVAAYIɶt m (1X^2=H9{oݧ<8ThKKr}7ͻzS6 ގ 68F}*jcV̀+dKEH٦L嬾qGޱ>Tˀ~E'`%o@kFS.W=~ RYc ~4ԿPkPZXDҮZz&pn[u{qKS7o.v`1g/+d:-^x,Үf!"B9t}:"S شPk5ŸC6.M/#w0֤#{7:.{"کV8)~0|/AxYYv"tqdMxdJO! • $#h +lGA=v|M݊s"s/ёMl mcJ?$C ^S=C/9Ӗ} yEy ᇄY%zmǪERCTggq4od{(f낊;^:yQ endstream endobj 507 0 obj << /Length1 1955 /Length2 15467 /Length3 0 /Length 16672 /Filter /FlateDecode >> stream xڍT۲ ]Cw !8%[pwwys={c7zoVͪ5k$J "f&@I{ #3/@LAT OAfBb`3a7}6 '/ /33μqc7+3#@O!lea XԦ4.DVc%cESc[RP[@LLv.4w+%@tv*hlOi5K+;TA@hjot|P|q,o=?`adoD_ƦvVs+[ <#D07hlofleklAtc2blratF|l>q+gǾ{2pm[ٛU#+PF?6  :L-/G >^2>Vx/c7 #x)`;hoqV]c0G9zM3JɈ:EE<^ Vf ';Q2؛;x-cGz?B߹>:9M?X?Bu_Y_*t߄ YTMGWd@ boamr)YL-.5hV@% 3}Lѓr?/)ao`ה~'! 8=&F{G83_'`o `qF<&".߈$7"7Ȣ_T}#NoG7o4/bg@wC;cۘ}%|&|4rGG AT6m?cZu!C?GW1L Kg?X?ĸ Y?y 5uuvu|t}'@SS`|wIY}Te矮0I4"I#k+o^ 0__ L/M}Up*R?@G&|`K"ɕY)ѽ_ʣ~luA3OKC%m(~<3#2P;'7'oE ; ~nl®8{)TN);[Bu0 +(yy&l&< : [fyЪ9P%R:A61pj@(#`"ᘷYϵ@HߗXGH1l嶲ɜnU4!.N*oSC!dqn椧7(9?%Β%d^~oM3*k8NZ6޵\a䯔b5eDBNx;` 7(O$śy4 l"F@-_˻tk3q?^NJpu. ggbΒGhl9$%D5YBTH Xi&ynl`Zet!vM(uqK;7j]̤E)T[h]fxD "QCVtcƍ'[Ա%0q2@*mF6FbNn?MgZ \&1Aʫ\3T;FSު#ZMdMBbE5_Y-)Y9aA=y 42kQ{K%U}%Qrdpzk/-= O~5)JI69'.]D`KB3j_u;e8z_٨(8XS֠#(訓~o3 C$Pڤ:V# EIhc>7c`RtRc˺- 8-LmypWML&)=R*39RSF)Pq5%t6_ 9[8Hi;QVNk&coͭv8$`mI|UWxght!~L-=@` U wo#ѣmW]c(pX?t/W$@\*QھZS>x#eGnX߽UfG*&GMԩIk~Qtm0>R%kw뾈)_;,b m&bfjK8!3AzkSZ9ösFk,@:/CqS] nnqIgtQ7Ѡ9÷4gK,TC}M;LTgDkfˆY'H`| y {s"k$SjcDz\dڧ 3ZG]~sl7"AgtEe骝=8K3÷9/XH} k.XuϝEB:W*JV{Sgnaz"6MUP[ܐi]2xn<_/ @sgl-g῜Pؿ_zڠ.0šVՄ yaGMƫP2.n'Vthg)%=J:UPK]̦0sz';^V ϥZeN ]j.A]U]+ \|jYeIk1:\MQrX-st$wp ụl,ԏfze*R(fԨ-^m"6UiW"{~v7z5$O9}MY&SZH i 5?*їwЭcR#i/Ks|Yn .36,7ϤWv,񾪲Pnj#Bk 32gk,я2uE%unS٩dta4;hk<䝺y=Qo!|uY֭#-ڿ[l:l!PavwXQeXZj [i?NO hCZIT*{iJ1%b5Y{f 0.uqO򈢢F 8}F0i Rɴs-Ԛok.]},m5`f r4&3Kz0b__ 3+.S '0~״*2. w*"(^hTD@/ 0eʑ>UNG3N!jw59K[(D␃_W|/6Dyԅ Tf5ě5\:A%lHJ2fiDnì F ğNJ3ζrhP en8z~D [bJ _Q-ɆMRVV}=Zag u !@6rʒQBEXLg'|..l)F)Ԧ2wV Őn3& q_]' \u)J0&GŠ^ $ePx /x S,4&0/_̌&)$:1H_=lhVr1~u9̤].Bg~MG}y,D {5Zw$%9u/z+֐d{+pe4xF<`SķLwm0 #HH(X#d,Hg9 ;-\X2Q泄`''$o >#:'6cckf*^ ofap&X~)Z1#8xEP`lSu%N~Z}P&yǞ/~Cַ$Wd]vk-ד֔oݺϚ-" KqoAoO|.o3X0" /bWqFjsvֲ˘iq$Xw2"C:4N[^g{X6]ճC%-4сxhnٳ~8e}9qHt͘$:r#3=Opp3[ؤ? ~RzO"#Uk1U.'TS΢!nz30[h&yWd(˦r>/E>۹nk7Ī'귕ն6uV@&lFu$UO 9U Vgitȁ…cDE3gvXfrXXEQ9%SjVVgïm) ‡3E[K9,}oni^#~HjMtA9!;CD&< f.Rӎ+[siC$.֏ jHQmYak  p>Uc[E#J0+s/M'u`\0t{?p(ni#aӺt&{wO*hȈ`:[,-CƦ2^,(uu0cI}`J/Y8Q [aZ'iVzhi A8pE"t?o#ȚЩuCSR7!Iφ])SWw3ln{U/=6 ߭RU/w7L=0=krXqHdr(غ8w9P7|fĨ}u;"Ttžʪhg/y,ޅ[ɑDWFNśE/ 8j v%kiyrȢO٬2N?"[˵EӴ`A/>'5ڶl\׼{x5QTRWioX)=5@]s0' _r߲G&^CiM <TzVǍJV87` ֍^KntԆ=sM6g?yd$n1xǜCX$. \SsVK,B%he^P19$AjTkkw1!&8ɯK 8vrKRgh18&V4v1THiAUM0k*^fT (8/=_G֤Mť9Aղ&228b Nƌrih􃕈bI\TYv  ,ۥ!V3!huHv=@_i,|Qї3 9l|% npA=X;;OKu[] >̰N۲C-\u 1QрR  \j=]N5x);'@̨צ&c$-Wn4q'Nu]6Ļm~Ư5DË&1>D}qZWu|W]JrbN69`Ad0mZkh_Tj4eIU5ffOkN/v'Ն V/e=<}[q]ڄ8.kpҸ)gTOm+QsO!Ht)JC{9r17p |QqvnJYgIaJv v%eGXtMQXF[󶽺*dVB%FK23ö*"̷5JⲭeeRsgyxjg\k:\K6V֭Ĝ*%&s_OG fFF[T\ <<c"2O~x# ۅ;"6 YIGʂ0a[m Rs|1k" Eϛ|#i>EҖ"obmB:4٦vk6B*?;APܝxA2DO)9GfU/<ڢB-kL` ;Źhb2[G[?f/(gO\]yYcv%G&$h@טy='c7:),WW%[f8u%n_,K/k^q )W1Du`F2/vaU܋lC9!i][|/Ǣw@'\|7劉qcIn, nz16̘T^9tq>/ޗZ/C]A^" ѧnܣ)UëI8<l*$<ь@MDy/7SGLG.IHw_ςGx~ųm$y*o|ڠ%XWQf{o+XYؓyڶaYNim"9MX[6CB7 K.4Y0 e!T+z sBv7f]kP7rbDhZ *0xfV#lȴRahHyHF^pN!A`H濯cy˶Po[`.&=TRIJhpV&py9goU'WI4^;xZ @rW]M.J"0X9,*UMn 1e}"&%hӕǴ߀5 Q* nS>-g/Z0GOOg/G;̐ddt% ?p ͯ^ ?`21PWz֤Bod-:9pdoS~MK:s`k[48g7(ױ}Hyfz ;BT)IRvFZ5ߟ%rU%(Wj5#}AqE5SIdF8xluiwj^΃;?͸ɥ G߄}Q Xg{# e/m ̵zleOɞ% f|+[׎(D.9Dkvbbh[gڵ,ht9ųj_F_50!M81RuBk0aIOɸb6ǍK%LtE 'jnj!AwQs6 3pq?Hh6hz adl5{MefÆ<I~oG} KV<{|r L ydo=\G # `WMF2&qCVRq4æk4|rX풚:Y<0-xR`#Qhdhej4ňBR^v CȹP bk+\>ozWnk2/ymD^vzKX#WhiwN\8CRs.39E!ȨE:xeswa!z! mZW c\ɫ)6U_(r׊y&til B":ToALƸj:=8l{bpT_dGwb&A'HYq,ڽZ9ԁ %{y0i10Y?ޅ,sTM*en$iOmA >,ߴ;0;5,3eeDӶ$-IBQ.X,\ x]Vjz2g`#StAwm[9 9\$ǜ}fQjUjO%݋.g73g` 2Wck[@956-m "}.x;+;Ƃ 3f=4σ"[_8:0A,~/6$u)lV7]fQiGiv"ɹr?t \og#k {tE+Wդ:N͠Lכ&\bM:"쐺#֬YSݙ8`,K6EkMzJEu FԿ"8O;pSQO\UD蜏 p}M'>Go[:%GkKXk!OHo6aDPуXbÛV\Bob^G,]ՕvJ]@;z7OY ֔v=G9x4\+Ш[fR2NRUPi j9 /1[ˢk̰u0nb{> C:2Uqgrx 1=Ab(ڍ%+T\x60Y~/=)݊ڞT: hF^"qN;Ɋoe*gy&^g lvA?iCV|Ql֟_-3Dj$9aV=E$,[C:Bk$Ln_4zcm9 U֓Z:1e |AyН&õ0#6'ե4¦ij(I3`wOF 'b(J$9/:8wvXaz gr7A>-Ek( !_X6S1dFI-k~(@vg:& )#Gs UV`t7.33_~D͈>((,8BbG^ -4}swNT:Y Dl ;;:{YAvgie9_/ǧ!$ [KR]r YqXxOHr@0-u&o Vu++c^s+  N5Ɠ6K%Zt<rTXvG&-[Ma-N}*oQ]%,$+d&Xnx6OTY5/:-[/ bkbpYR )ő+BGq'f8gY%Y3d E\w=+{62궁C)n|9um5S@s \Vq[@X&>O|Ld6wj0e?!bÕL%ڰ_Vs,w9Z-&V ߱XQ! [?"fdj'' S0tbۯ#DH`dP2$;-}k&{ ? ,,)mf|PA Sކ40QjgH]^06DOuSz. rJTA, f#n²lb3K ͌A-;o:u%Ѥ49ׇ4cEw! =" o?b.٤Iix}':>Zaʉ@,M,Q۶lU.X,yH6DA~h[n.}֪\&(W>;aFȕ6"%tՃr{)5d}Ad(^9c7zH!‰^vlDٳpE@0%џd^gN7~<\E˪_*L ϓN=ƥZ>ZEHع]5EE M7gےR?oW@va@j0,unKBZB>w`]cigj&"Coޫf+v*me ;Z xBCXsΊ"|>8'0/dݓ IB?1 j\'"\sJ))B.v,n3ȚM>1Cq/F!fҁ@zi~s dBR0.kڽ;)H Sxt*  \p[HaMH;aD2j~ƌ lN1Rw.]mVۧvSʉ'ζ^6l x<М:6uoDxhUJc^)5oɳ֛_]g-7t$Ch~cnPlB@~ ^fps#{EpPBKfaib0'=v}xF/$2"]|+Df}*k,_ބqDRQC0ؽ%^]Lf:=XBUȞ*@{5̽!iig?{*Rn_.*LC_3=(Z\oyzBH:xrjs>X<)- |j3-6%(C =Gx⫋ OkE{zߛQLD:)ۙ0hZ3" H'NODv酽&_D") ͜h軍FbA$V>s?)l6L&_xv43\_ÃFgI+ͫ͏vImaqa+M  8^L /RvQoMKk!8dG A.$wXnkD׃|ZBl3f  'hTdT9~ o,JbȮaE=Vv5TͯU$+N٨[ 30Wy=T M%jCa-39[MoNjG靡wMHO{z.bDMҳ3Fg EX"!:`} ܯp ˙|0N(DZphQ\|ix͗g8W \xШw7Z upFv%2/G 7n܀Ao"yg\=UH_Ibq\Qei|J}o'~eh\\pjO֒Fj?Xq= +YUQ25,/KeSzM,+]!B1%MP fX";.6mIƢ/D^B;CgR "G]- 66`%|=Ds‘G z{vxB$ƗǑεu@(04P\>"OFÞd!hJު;Z@#+şYO fs}`mjOyr(UOU((WMp$dħoYUDVS:bhU_Yǀ=nYuȽ^M+dT I f\mhgI. !zLJ3~ۛO_)Yŭ% \NԨYg .~:iλ oJ xf4VҒT]>'12hАy?_ endstream endobj 509 0 obj << /Length1 2230 /Length2 15510 /Length3 0 /Length 16836 /Filter /FlateDecode >> stream xڌP[ -Hp k ̙ޢ X-ݽrby%zAc[C=37@XFHGNld\hnkaӇM#P l`f0sp3sr31Xh 1p170$mmp¶vfNu/ʈIt5 cdhd`P52:7#+#)5 t:IX-lfC0Xm?Rm% i`nt_FFv66s+ @NL͉``cWGGnT|(>G#s;'GGs42EfQca[kk#_1w}ݝߗkicjdbncl cg;Fs{gȿc>Lpl@';'h1U@/'_ ޞvv@os8OG O"8ffhjn 4ܿ@cL? 3r+fTW:lzvf33+ <>ӟ\ [PKcr?d+ߔ:DbVVS76rw:;}l.P5߫+dke}N hcj6;͝*- P@|ed|8~\ߒ6Fm ;cXh tll>R&p(;Q/߈(qF? (_ `>X?E`/`XG? }hP>q} ?裺Q迈gdkqe 12>t= `Z8#Cɟa&.`m?tl̀6~%?b2j1ta>m! v;o~|C?C:?B@Hewx)$|~qrG‡$n~ru~d?X?b?<5rvprUX}&@7꒭OE]PC +ԗy=TjzUN'$$̀wI}(뻢TkDǭ Сm ^/z{p+3XCǂ^^ୠݒ9Ο\~L,)WsHGDi/f-@9Р]!/ͣeOIyDzjn<.zlT(8jߢMRx N^,) ,2!]jD6g%^-9.Cޝ 5R!=RA˩,{eˇsT:x\tt:g MOtK;w2 n eC»@ aViå weS>QR1f3l(j#CUh|ѳ`R?%=e? m-+9igc-%{m ƥ#HYjf OTȀqV$QⵄrO5̖΅W 'xJ͜u A*3g%3L\wK2`q,W-*ʌ49PV c~OF $kִ3mMUys~܅{i ?& \H:}.OŠ e[*"|_n^m:ٯLh3t'3W#D-٬4f1`nDdj5W~!Rg}ɔ O>w_ ]=Gۉ'baऔQjFpKXHxAeuШH^5B,P]\Q{oPAl 2¶  ж Ivwpˤj"/71yQك D5FOkRXh(:[4pIqJ$m =b`u;=xp>JSʻ4s=N 6eHEsgl&}uroUڂښT]c5Y^KS}Œq=3f|?A'[Ad\ 4ݗ62U1l}A֚qϖf'zPV60q? d{/r&g̍0,^eX~O;TI^s/yڪz3A[ч- G'6?+(\OEOjJރaK S9|ĵDES[>W탊C ,MD; gn8 PTzr3ȧY~6?3yG^w5PDf6$ ?#W3=u!هTh*.lc%޼Mu2vvt u Ow1](+ :8mɟ2^VhZ&5F9Z۞W4 [>VD1Lr3?L0:׽sh/XU=]I VKUM; dXEM2^MNg6yAofݾ_YE O<1_Ds<у<aK $ ˀ&W-~Z0 YKL*y'e{?ga]Ih6 Z RVh:Dë F%; N_k^&Eɞm:eK]gFdI\Hj[MH>sY,Ys@"Ez:/8\=xlVxgL ˃r\N91d&.NTy,!C !ިm~A(9i9f?j- t愹(="y߅r4boYׅxh*J/0)ڧub;s! * ~Y Xp,,WE]kWgw9@U\W>>$)$\߰i:Vߺ ,y>e& Zr@rwmT%+ Y&7ź/I.Z ԘXR u |lZ*eԟ>Ss l$:1Owv\W(HyR~ V0kifح& c*H I8z"ek{RcKHȱ oTldTQWQʖVX|m[u_O6fQ?v?;8bX5bk1 U CgEuL ~7 K: ?4\i˜S~U^T[p{wK$c=W o- *gC{.PӮ ˀG} t>2KrI=@#$cyU/16%|&׃9wWwrDZ>y58+Yu]0uCVOvͩFHvwNH귞_cA{+}2B߶EXnti&;Qa@y?ɽCl^1K7_Ǭ~0wExkt>Trv᭕J0p3"O{Gk则~v1K{VA|pL8[14#[ٌ"'eEji HO9g=a^v\nUN LPN-8| ф0It-ݑ ވgm2A0dP+}G1|5;OK׈%ɊǕ3huo̳AA43UAtUAn;MAZ$UrLj9B"aT 8?Mzޝ߶xvp͐!EKȁ1sjջo/oȆw/)K fGU`49V.7YYu?$gk͞m2Ϸm>떙եKE:ci29z>>~4aqP=v*?+b{d#C^PDqΌ:CVIRzÝBFи!Os3>3ROLPX>T|>\;.;$0]ԝ_e dQVJɣ!w\M]89c]7޼ZȱtbvnF:]_^R{^*hjFH&ٷѶn Z5@/Q'Vl@ܗ ]%3P D\6-'q~@,pg+?җ¿GhKnmA A{˅9h]YO9( X KQ,uDTH g}QYQz+G"K8squE,w(yV$؍ u>V3 f!0e&lC爛1Ooo)c+л1٬;: ̊rh7?J(g#~?K2S ]ͨ!v08;߷OT‰@YCsȉoˌtgH)CAO3M!X6䤔(B2]u=aTlP%c$QQu6"^ oHN?N򕶴?KF&pbWpC $;axn1ϕ2:̻B.8tJ:@c|M{{}p Ț3:$5+uZ,å-{7zmաCu.ZI EtH]Qbrqp͙c5k.㺧Λ 5rB>5>pG"D4f2ݥ2ڐO+ݭ,{E#X9uˁ@u[PS8GVo?KTꀓNȦ1bW1O7kRk4fOd#jȯgqMa@FT)&8VԦXjup@<īO_9sS寯&zJ$| wxBp#BI^F1ncZEAj3OjhzJ9^mKxX^46vdɱ6t]p6#=3(D+,/ Jj% }2MJ- g֍-y֧zSK8|B]ǎkk/{e :o:yMf~ eV!?Ǵ~z ! 25^ۓ~φj_wsFV/n "2dP.ǩ }hF.)X,~+xO#LCܰ㝃!#U/ج}Ջo1Q%,o5o^gCGۅDGEb3r0M"oϫ&sncFeo \>_h : rCکZG wm:|xRw dI/?<%kUh+tm4C4rol#Qiɠi房}ѕs7n&( #$iOkc׋IGMqXMΝڰZ RJtsu %qJ0Yz *i4VDjt|6@h'+%O:o{?Et CE5RfV~e`qĖrKv{ :tB5C=DaO6{MNGl~ۡܯVkcl{*Z9B pGHTPdjiC+t]-+Ʉ~_X]DPތ?ԱG]vI«!᩾5)8'] Z6#:שnב X:oCT3ױΡxh8);T 4ee>ߞPB"}%,v&֬$/u;&Y}TY, %"S!O4 fLIW &p6iǒ1 8=VN\D-,π8'a}<сsS{I~q⬇bWE؁ɞzgVyj(bEgFRkfC뷟p7g]X]&( Yh m.}UsPqf 9/R8OZ$X8 ?v&mKB' ^#rH׳3%CHx I9'GI@waȒp[>+*b yvE%ks+h prdžۺM}p}xždڔO!sSgm~mG"0E̼/Z|Ο#X !a=(qnL1 r5)T-ԑLbAMSqT;#3-c +z:-Αp}V]}nY38T"|fy<XDq_ UUOe>GqOǫ_ R ~ݲ"4{l6 7DzUIF5c[i#Jc~/f msBjA"sc"H\xK?fNX!MOnkgU:ZhTδ4.~Ĉ lniU FGr534%aS(Q-;W~h"d>%uy&ElfT|(s ϵ HK3v<)GGyT TР0L$t"瀦9b^SV4蓜(!'kz0ys+.+hӪ{]ж*+kCv|oL/ %9iГ5S jsNYӺ16Ucpt6+r L`VRSԤuE>S cY~5EDăN~8C}\խ̎l;*$Vޠd]%0%=@~aBL\_Rv[";B6>GAs7j}/0csg9r-,oygTIItVW>S8]=MfkTn]D ,wON>` ՄByryYM.i2-x\Pew4Y1k6_2kv#i/SQ[NnK& iLnl!|u ɽxt20H۸.) "߀.W5p*bxN}6O(9=^q]![-#hmQ ŷPIdQ%61D=Rm<{jP'FF|.yדLP%p[I7yNNm/N¨|& .&Th}Z=% ¼ư|&kd]f#K@@\7!NE4fJ*~C[-*O!YOqp8_Q`Ş]5mRS+%Z$Wkl!`нcX6kҧ+٦p<)+bntb{k8P?8"Gd{'߻RuԿBFZqht+xI'VR_UDn'ʇ1IvKy.eX-pߗjգ/!^oXSaX]92|;~U$3%\¨sVztaV۾jѻ=o`.|鯜[:̺qUa{ۑ.%i V,4d%΅EeP~h1NVNZ\H|z 1$ou=9(nT{wde<B%Eq"_]` 5걌Ee>QX3ӶUoacYR:q/My6#AHꎮ_i%j+5r-_FNl5~i{x1:D7|3Nf٫;ieԇ*q|$`lnVG)B2bAc-ęػX^󚌪ΒfMrL~TX)oת?$id=χyg.ėz_]eƕ ߜr'@S("57GGzN6RH@ANz#YpV6Ϲ ÑPR1bf1o74SЈw"02:Y8E 0bA<è Ќ"\{xu I¿̳p&.Kel`!ƇL609&dx?Td.5{~˵z~ Pɖo`@zM)EOcyEd5j&&.X zQPtPsXءKӒ⪱>`;1E;:3p_9<1B3VdJ eA9e~J?>4Xf1A *i%T͆KPFZB+s>R{VZbA9U]DTHK>$0_ܥqY30 aw-3d7SChö]?sU,9fh $hVJ_,w)4ѝ6ˉFw퐽Yƃ|tqm'^bmkw."u"ߛQ!jo􊀰pZ SYkx;WmA2=<`g-SK3.T/ ԡkK |D~GP33Wo#m= v:R(w.AKN@W}؜Ttzjx'0/%4]y1! ! Q=Z ;qd 7=u6qLy(aA |o)ƒm q#,1Z7!D :pLqqG-hٔ,@d]g67Sf2%F~ RuJp+W|-ovxݗ5NrE`~/~#JPӍh@ř Lg f%8zStqS+AM18Ԁ mU WIb|慈*f42s"K|8ViGH+4j [i <'~u x@&Tj)e#r$n\6~P],E)&XwPS" [G,|\YqC,o8bAI[9X5 u9 ~%ά?r. ס=Hq) ɖ3hؑi}`vs:!Cm|*O8T-fחOJf{*b=~mӔk4N`_A4{xZF_ybc#t(kvs5shef?P .,m\x׊Ϩm:Ʃ>$"T? ˠ㟭rיB㼔SՏGh ~)qd,Ƶ@<ޱ:b ÷ ", +DVBDZ9nv$ucIw2^˝L`&i( ZQ^tɍ*h3)qÃޒ>e CzYSЯ7p+_Y0Y9l|*IW r)IL9|R{aw]w3j?lS7T/Bᆺt^I]BIھ^ 5)-|@<',:UOGu5'#M Ųk+RXh!\ jn ͫw8"nҹ㭙AXZCM7ץ#vȊxd.\{]q29>;e"ϯ aKT0u[Ϝa:3F_\HݵMZ'lNP3D] N{\ͳ+Ŕ.M*S,GRsVu!/4462~*nuL_*Pnje.Da ]LB?Մ&#ZR"YZhF1kDx\I BsNQ5DĺOc]QT4_1>&xI[+@Km>DI IycťC8& .aJ$>ЧMgFqDžNKkNJΑMYrc;; wEd]lwY7YpIMqH kc^{ i϶!^7=q@ ʓS/8 T!ϱcdE}InSvvu>rQd-M9yx?e[̿/ߞ' +;gЎ@/ b$kaiqZ*&U ҥ!/4'7:G6MƏgAzVkȌ9޴ zhe4I#RJEuA"zߡLCY3JCZiO $ͽCK %GӕAJ9Mg"f@^f<`u8hO<CSnƴUC\xQxHYE'ǐ-d{iA]7TAǓBӴq9/f ȋ\$}UJ[z_oUQe &jΟ0ԈHlK[=JwzGL)~h HL(V(<($v1uAa@m^(ȊuMK6bx-Fz""a6?]C ZrXc5,Y#@RrQCUn~ó!-(Os­j0ZN#VSbjJ|}iݱtӀ5|a +K{8F`0yMyKsY.Ḁw1WWKfzzaͻbf[#X8̰7< _w2+|t ddqTzXC[4$1TXENz Pl,i-J)ceWe:8axv.\S)VXSyɆA7|-sc_w1ouPM@h}Q\oQ" *0Pβ HbDDǣM59`Ngn7g|X60Z*r UUp6A[F؍eׂ ~ ?J1aD5ha-ȡ2W#L -TGڤo:nm@]`U)A˹??*fe] jj߻ 0{3bn)vI0y帽t,뱨|L'tvru?3XGN9\YfvU}IMF x}agDjǰ t,DYl~YTjS󲧖:X2njYFpp":F4@![ 0 K~\Y=zDB"RAcn!fk~c$[B?c |ir'' Z+ֈPD^W{ObA#aQrm&arvmM4=Y;&BBc ."Ѩ:{bϽ!d:IB< l4_lBj:_CG|"haXFc`Y?A*BOJxH{ç 86ǃ9MNT⊳ ,{rZF~⽺!vª Ytg,8ϐjʜFj ze:"DᲿ]KG% Vn tM)#!ިT5b6yg%,9rl ɤRP":Vҭ nu& (8+4Ob!*Sq < =SF-W=߷d"eANǷ|F),ٛPhvEឆ<4JG 8jU҃Vbցey Jƍd=빊wNT'9(fydQ,Ckߔeoc 1oب@~a5z/Eqbf>KKsZDv9%e-մeGbga2.ɞqfxQt'I=OU*͂}Vj {''?x/nQgYuQj$%DI~y.OkfRP*X;HbWbs&һeC'7ϯ !_3~HNfDGnJLǔ;wOWJNղXҨ$WFM"hs_]>҄êFOZ})HbGeZhb5WL/FԺc ~z)Ưl,Z;̗"jyUbvaQ/ @Q=quwǥw̮Si W/iꃀ8F#r"S*$$h}?DYjQ׏L2\uR5*<愀ƕգiGWM5LgVmt0.r#>yC'KJ9s2: 'uV=E}y:=Ĝ,=d>!'mt!@*nl06$5.HHK=QТOKrRJ]T O $N/Ed 71;P2o]:'޾,j͸d_N3׏ovNBFcGxAnk1b!o87WP> 1S]vAlqG6Ӱ|nN7L2Dkp-aG73Jg?uKh1hXگ@|7#ff a.Y4%#iy r=)ti7hel@k#T@MaMօDB:䃂:}&%3!$n^kr-9y=$+9e3:]^$%ov A;_\CwWEpRFv%}Ü @zn7#k7$owعŀ_{S+ c$ rm}[7i|,+BvX dz\RpMt,!ˢlDu  ꍚ:ugF}F,lH Wl_'Bq*2#fpQͨ\ͷe8љHV?+1Ѣh|ec#=Da$UHRV/Ig*i`/iCgϵaL$ʕɚsG$ވUk[FXʉ :OYe56 ĹcMmOw #ښJԤlΣj{Ns Kmw endstream endobj 511 0 obj << /Length1 1703 /Length2 10346 /Length3 0 /Length 11431 /Filter /FlateDecode >> stream xڍweT.V(ww)n%@@ ܋(nťKq-Z"ҙ93sν?ZlgkFCC f9rpsE2:@ `00@\< z` (/  r}ɂ\0G <@0@r`` bcX?fK )0b r\m-AP6vbN"\\ N ;j `+j qb0tl!.a֮ 8hB,.AnV`8>@[Qv'psr߉ ,-aN G/ U8]=] GDrA G̓RMb 8p@E9Z.oދ#wy8!VֿGrsu8eb=0ـ]@ PPv=-m~r8 `8 b ~qp7Ͽ0VKWOG3O8` |!7ά`P4C햖y|8x<@7 @ߙ4@:W5 gÏo?M߹`  h-?B_jCۓ?r@4.Uڮ(\/EEluWMRWQ;p7>I@J%+Т{4(kQWڃC՛rq]{W% %lmAo7S|»yC`IN GI)ub0iƋ[beC$N6aQĠ&@UWY}:>ّt[V/'|}w?8,Y[=cHrgHԵ?+w |柑c`(NSfV]ط%mcEF}|= CKoTB[&<ز t)j\z~C[[K={} Sj*_Ȼ#Hdb]#Ȍ4PT`%X"~Lr9r~TDxiIOCgY9(U&@5vפ=SG5V!rO3ܲGIΡg}:>DJ 3+qdq ##;leI}\A` Įd=p*]4aZ*'],gEƛH ʯSyHq}H&V>xN>a֤cZ1lC؊&O0mT>n XQX4z\(#T*E٪㓿^)NXP{Rt6|{W#)ʶ+De?؉4s`O8=NG7vszy$/..7 -Sۚ'>ٖu@J; NxysL5"Y8*H0.+;_=m AsVR/O.i9EC Yd5q% c &Avc./@أЅśFɥ^kl=OTVd =(OM]S<}+QYH/gKs"$F"=$躿:m;YuGS\ 06[Xo,NyHVHj,r:%X37ɼ}WV>L3L䰒۟*dp?/6Y'@KOܰKx׆՝9M9۴/۾Z.Uz_qD:41աU>FojeI#9I䁃qߖLïq?߹;z!!dl7I2#6%eR [B;)2!fxw& UZ#DaJ3*ixXF(;ޠ feDL{uZ5;Wcer䖏66zmkH, Ofm#OnfhZUi?0]?4%4&8b@3:pT4YU!*eߦ(ӦRWώ`*Ŕ78%,ӖIfySΤ+ZM9T Ԁ Ykett 6'5DN;IҸ?'D]8;=w>=LP HрWՊ=E_>iPޮ49D;yvb/_c4TVq{c[ܻ;g۽#;2m8^P+axvFM@(bn,O7k)X9mrbJET̒|Hρ_QC;1= ++lB9Ԇ?xΊ< BzgUjj'nkF"_wAКay{ L]_S1ōЄ¹$xv%R\rҪsO>ֻ}]\;UT.80>GNB'1LY\Bȑ9MOzoLÂQfw$W԰Xe a>=+;9 D>Չm\&mF)SR9y~ox[!n(~ՓKκ20hm*c iXҔXc/E":b!ZHCn=Ry &iT:5JI~ePisHY>C=JNn^Y+htOPI=ۑw[$VU>Oϔ G&u^+Z@߃( I+;h7ʪQ+]pN ߸bdy&&-!kVB_%2 'Q=/Te^]'ba0ݎ~R ʡ`ofCJ|[*0qٵ%$ަ<$&Ռ/MyzA'Pf@G}4e ulS/X(ڙ݋LxɏBgL9m8SXPԤG&tiY|yĞTw%.Qףu<.تWw͑NáuvEǧI4DҞ}n6\\&QYZOlc[' (~`Rr 0xD蜙cQEyYfhPλ7B YCgPEjN,kPl"πãFMaCK^FD>m]bFehS9|hf8eSAl1ug!G.2xm*KIד#cI9DHQ hsA=;uGK~~ukt"C |)ImD2)e/Cc+p.ND.?{ó "4V|=h*Co\f" i=o`{}y /Zw7EL^O5C{/i~毮 @<ʋńS]@4 &)ԻLf2snO+pT\I!}$]3TUfay)(Djhňf 71 |3,k{[ |\v5N;Dx 4&%l񣡢ACzr-B_ +FCs2/V?S9[TъBiP~Ƙ"e:i{kŸ󍑔/SoS1ݬ^=nfWs:J9( Shi4&ݎЛ_twt]~-&p1 Ғr֜95=il0}өsw,3KOM.̚#VWkgklȅ}cPawe1嶷%{zTBYY]I%`/{)9 H)gg2-I o3X }&bO ,"^c v }ua{$ A/ i1h! 9DцՠHtp3^c\kUnj4U5Us_N:@W"|6ޛN#r jc֚rl3qzdL9'2^cRs fXD7rUtZF?V+l'7T8ͩS hY y%.y \̅exGdF;Eڸ1pIbc)5&h(ʭAdS(k:䶭Rh(a#1!֧N"3rg%DAK+w煦祩$]K(|'r 'gQw޼ o>*O%:KNkfVΘ5$O[%(%o<1w;Im|tB7bxu~2GH̫0*ܰ3@QA}|hXqTYE8TM2! 길d+LB_ " CT;JKBsNBQEc\K֖s ]PQQ dVtcFW~."{:w"eCj&9:/Cu>Æi)hS1S4B@]I>AϡKJFSRJ0'sn'_=ŅR,5bN~ɱusb,'_^7C?U鑥"<$I #8oN?ݼ {0:OGcOw!H i RX̨AC~۶:שϻ(&v'Qn:B9ޡKpuR H\`\~8`NrQArd+f?kkWlˎ/gBY;suiMƭ2/֡2,L)pnC=S!7l7hm{٪ LBvØMw5$[ [ TJER;$?H7R]43%Ix"54БǚxcFXGeS*mv> _bB*3OF,{A䘂QFld[MVȢ@4it''(pDͱt0% ?c][iJ "Zɻ/2-kWNo 9gA,AMݞf2~Z:; fWHR0 Lx8ݨiDqQSMHB]->keajys#ī*s~?QK,7iA62J6Fv}( >UkS`3t\OL r0zCA|T%݊%ߖ)ұk k*b/Íąƒrt՞9æM9wLf+A9zҠ3{kyo !5n1(OҺRC!{)YA;A¾» S;@/$c̈0EÏ[7NL?oSdM_j*"Ȭ#fjvS $d']<5X TI^ BFҧ=&\rb_Xr%Y yCeZ`-!ΑOU힖Rlcv »j?6Y=dٚ9bvF;owFPdjDɺ6[dZ)E!&VkN:* 0#x[Eo%JL#FzWqnBǁM~TuB)薹W׷P'DwNq;.rFo5bT^霆 :fd$Hw- 2P4L" :$KI!3oNd:$X8NC!@d0k4(⼑AnA)p&rQ9lb7O3`li] J^bl&a&RUE:Q<̄cJm6QQѦׄ6h5AբLUfHv11(+D0F8ls`!fLadK6MfaW3|DV|O4<*OX~C H;+,p3gi荕ߤ] ^]XtHp2 f>" LU:"""}3r؎DS/ d׭+RY(~d8y?F2Levz"98 .(MK>(*xܖ\&)zG 9,]G C#eZs|2F^\0y<=,<>5L(폪↹$A`MVqm$ԎU8Lny5{*5c{1BVen̓ʾL"',mIp}J#kn./˫$ a)6lNDۨ㷸Q&lF>;/p^Rf]9 ~ . cvMt^ 3"íTC3n?@V>fjj"1nxIˋ(}&ȻV -~')@a3K~ť͑1o`p|ʞA])*vhW=|o OVl0kk_Ƙ&"Ns`ӑs2HY ]It@т6:`lnaxB.+J'1<{q xfp_ĵLyDW ǧ VANkCOpfe| la'뼛 <~Esy,W;ƞlvm/!o6b{)3r@-8Л`#;[5;O\a/{o`dўw}| j 쟣~akdϱ?s=Sx1h=HY9WdlǺ G(vG)+cCk9s1gDf|K08@٣^OJN )JwnK20NVtL lzߕk^yjk7kUV\@25 *ϯ]7p#"~\0cPE;^GNE1 E[]5pV;Y@`w~ωƷ^3yMNm?$ ?a_ZN\u¿IF &Hl{֥o >EsH` @,hqLh3IXCh|*\`[>qjge-JQg-xO:ϥO `djt[*nE('1B'\@2~QfߣSgyE2h?U^^$jNE~K4:R^sk ^?3tרpbq h>J(dɌRn3ym2wT+#k=E+kSL 12 2;l[vҕ|}3.f&F WDSOt!jrر-iLj/4qW'#؁ncԜ^-$;cNVlQC7]Br9\ۋHAN\kr9QcoQ:8W4c y7q-v稊;H?[gU=Klh-.(Iسôe,9~ESۚy2bD=|'U`Pa29@SW}5ionk@ \)=}rcpBzm<'mABeh K`cDnr'>?yhZGmW—PZVu3IPΖtVUjN&i]Ro4͜Ctj'Zs2rAG*=_ύZ:׺XwS傹ЅZo g~ _Rl؛c_ HU^Qk[/ c:2Etݒelc X4A\lʅ*BE79M5hJQ%΃? `4+6*Y `\[^Xk gZP6ۢ8nV CbϲxOx>5l 1NʮP"mRa㵦34D9fB O4ʒf_U&.)dDV8۲%x17

3X79cbт+s\CU*D IڧOZA;NX.eք@,0dg%}VvY^zJZ~Z$x>"t'g[6l`2Ӏ?JQMjdzi_tޒH YM$̃#r 1ޔ1y=QG lco.YrR F˫y͉fTiLД{j6 Lo!:n_"TܢЖbpZcYMN>fO4'tj^\$Up$EɶVő8]~9PK ϊ'2]0>AyDC4oFm'{ya1P='&Q8 NzjTl0#ѦkȊn)xzl<6qQ1ڇ%Мf!ac~\=|q";j NTpҽijb[DBm%΋/U" ܐjY29T=ULYc_ٷ'#.9w⌄,ot/Ĥ98j8C`G /?o^gg*73b}O%Ed ө܅~P'g>YͿb3 \8b|V/[2"%z/%x3,r}̦:p+bFt [çR?saҧxfH<}f|ϵs uakV- endstream endobj 513 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 515 0 obj << /Length1 2662 /Length2 23349 /Length3 0 /Length 24849 /Filter /FlateDecode >> stream xڌT  Ҡt 90twIK HwwwH HwwwHqmuba;g(IDLv gFf^* 3RRde@h ;@Y vqcW+3#@tBptSZ _[1`l G45ٙZ=CAolhlhh!HKpr@3ƶ+cD[Z9-W3wv3v+S 2:j2%{ oc /?޿@9<@s+ @IRݙ` 2ehld7v5161@RD` .L읝l~e -+?q+G)LO= 0*ŞId,B-:8x@Ԓ=/%/1/{;{99pvtx/BdaY:LV `1o ;@{,_~_eR{%FwDE^ Vf˯%/?i+2-M? @q˥hZ 1s0?X?_.6ےoB.66iml<1/3g_S-G4r_1D@6Ihllj-ue6V կ <сO=^ɿT@7׉rp=C# ̀-1d v9"('Io `Lb7I70IL I7b0IFl&߈$sF\~#p.878]7GW#pt]7GE<` =@~=KM~#鿈3/IIlm &? \^ X@[3c'?d ~Sf 쿠`r3c%Mh`? wvXz[AXegn?K=vO=vɀPl_\A6@ߣagGÃÔ/Q\N=?]/_B;gBVOt4b7wNN@[.//38_f.wX[dž[fK v=vyN t;.9.~@S;S`ֻJ7Zɴ ^m.>V:ވ|F]ڔ^ y:l mNPih:݂87m,PA]x[3=td,e kl;^)ő3*;rH?5 (LN:3E?s3u}31B"Gs͖祳~sTթO}dKt/Ig֫0oۜ{I %T= +HPCO|;V'@057LCG2%H *@vs.sτ F.37L GG3)Y7t NggxlFihR%³VbUuSALgke،E$sy2R=۳z<9'e-9*[G {uA!<7f{7%%XvgenaչU3:RD"o7{LȏE]Imbh e&!zIL@^ 5H^6$ŪP#秌RY*/x[V3餳8U_Ю6hIC›EClOScT$b(Id3VQ=}S3[-&BֹNj 6 <@sgpzFz 2h䬅$Gb۹ZwK &|0yç۞6ϥ ZdUV  ]r%b#d~jvWgg&pXxǙ(²ZiI\g_SbJUSv%vWRT[ӚGo;̫D% ̥#1^3zw=( /dlxЉ_h1. vH yJ!y,Ҽê%3t헖(}(%/< WzsMiqn,2˨6?^%Rd)5~_Pbu'v 7QI`wŢ5 * \upLߥeyOq|?~O[11嶾ΪoWܳ (7|~㲗%j{" [~. h6sa@$R+Pp*b8H+9ߢyjyT|RBNfw5ł S8:nКP[fdB< !\oVjuW6Je ,^bMZ5Qybbtۯ6|^ÝH4s`@d^svh]84[ZgP&"~rv H3V P<^8K2 nIXBH$ֳylQPyZօ-}iE@)/!,%դ}6hGuRp݈"]ܦqMՄݫ|\C4p/T2+Pԕ_]2C A~  .QFt6^@ۙXCasN6|Uec ORGBJUGe掇!h!Q>NaԔ$Uw~OC,lӀ1qbxBw9Op)wF9X;AhR=63">v2y`l]q]6LsEWq)7s}<XFm21^b3aBnSr|9S 64HsQ|kyfϥ?!PW߶FهQ ԙ_'"&am6K]2Nwc-ȏ8lVgH'ډ'hqAW11hi?D<9̀Hk9 ibUm9ۑK6R~ШV[Ite|#(*D=OoԱϣ 7f9 FA(kb*TSftR0>UsysڡW%!5$.&:HGQW B#3L֩[HKi o_zjѸ^j  ZV>  &Iz7sx bY"dTnЁ/|E>qFdScƩRN6{K2ˉ'o U)-ECNgv&^q3Hbb$^8Z~:G;8 5 'd3 ST` {7r=0&ә(t "Y7, p*:  upz=8o:1i1mk[A[CM<$*Ntf4$+)^Cdb IĪnX;tH&c-ߢ &6ݺd.KcS;b{AV.ѧ:'&蓈z "w,΂ܣ RN}$g(PJxkF]jgܲViyms9Vch)]qYDAYp0d37[ _qqh'k"Q0qϦC>~I$muyL|pjxM׼[ίd0Kj$h7c-8@},O|Ntʗ@r pcIx 7#/@h+rܓEL0GǗ8:V"0Ɇ|8dk!Y[1N*[i`w*L'i::'.3͓h<"* :?"Or lF|=A޲Xa;WØ-U4=G*PU6vd0 >]Z מAqilM',G@$n񙊊lz*wT^ci'$=S7eL!դ_`ZO^]A_% 65.DH=: )CTyoעG6ëX@a?}av̋-x,) O ~4Iqڒqt8)d3 \Fr)^h8=툺O$~}`F  HqFC>d(Ǥh6.lѝ*pyW呋 FU+2~Gf1PIJ&CXӴے"S|Cc;֭E;TnXn_KE<N U R^o 'L?ϲP"t+GhHv92&&@ܱ7AfT.e1 !"OC葂$ T9?OFFI'NBͮ- c< *-ۑ!Dh zN\ZXo}u̜HxX\:j]~w,{ً/]@dK_ۼq.#o)Ҡt2.}/LO }WN?ȼ7)Jx{I1N u`sm x=SE""{t%;aM- IYjh䋸_ؿ BQIiJb;aJ=059{SzC\,^,v D0',hM˯ei&2=\;Dc7=$s'De>VIq %ovn R:Tz(.S/*}O_UL?][/R6:1 e)9jtW6 nft|kGCW*ư*ЫRT钹'R=~~^05LuH~_,%FcSI$%xwFwP'Ԡt>[f:=29,S6o.[i#!ʫCao5h,0"x̬*,ZP堥b6ʼUCv:N!>9ӵjyӶ"l13gjHxq35f s izK5eئG oaۭY&:>G`wN?ȺvˑxC"\Ԇ}\MCL~LU ]ZzK*paQȔr XeIT]PW dtq:YLoZŞ~IV<"M[ @l-VDTf"cYg*|"f2bFLa> HNOa7#OiroGfԶ#GEz{pjH΍K+suTkoi 2TKK( Ƞ@?gWi݁4X'9'_2˷w&z: qLyp_ (ncשZUUUu "nr8; ~1/ٕC*_kt^ iaQkBm".-Jn2ɌH+u$x XW[fvw}sb l*m-זbT(}VϗZՠprvHu⊰hÓ4ٖ=( Bi쳓鑉7 =I֍ F6*QZD"Q P:5oGY?W`8 |E1UGF ׺Zڣ]X.A5js 7Ҝr{s]4,*j-xdCI}kHRK,:k/TO[pD*ʗ81E7笋U%nsFk\KK {摙31e/OtZl̛+9OO|5PZbr174S_f"7]%vxLWٞzģ" 6ۢzvf@gu6v|LWsmV9og,:4_YtK V᮪i=nhQp q-)2nAa.fN6njtCc.&3i-FkE:D1x D7*PKm|c>aNN5FKU', F$t%nRH`2TfouNVbJ_O[U=^Sh Jw#Dj;Z`cV##I~[? z>d[52i1Zɢ12E_AyOo1 {gvhK影jݞ[ o;\ P\.EOO c`O*܎+/8uWtGziUJt)*)_!S3JbkuBsZ}#ё];=( >6Ϫuߥؿ""U^y DMPgTkk% eOnBdH~E|۴! g&G!^H-1fsZmv&>'y|!59RDW?HC),N!&nahJ%[ao;4ًCvEDH䩕]3;hVhP+`y5E D]K?jQ2GisiNÜä}CR1n+vn6+П_7ua̴͘d"R(TT?P`^6yK5<1pjicQO(bMzW`@5yhqfg@vT+{9II=__ؕ؟??r-S=ͺ*[o}o6{ ĘD~gPoW;Dj" p1Cc1ok V@KMbCrV$ IV#4?=­/ۙ ıI0_[Z]nc7as^ns+ۗȀ2\"8&*k|-f%)hoY5Y}ߺ]ü8M4T7CC풏4*lS(2PC\4Gÿ уv&W!XxK׊@ܢDS8ffҞY(豴ƙ'cnP64Fw8c`]O:.ot$zÛ%w1ckQIk3[DV&*=t&,S qe1ŋ-#>U"J AiXs%oZ}T|~ 5<(ӯ!#6 JTS.`ƙS>"n_JՏ1RT1~XJpbcwObP3Zu0XEnDL򒆉? (V|vyiokbH2 XrQ0Gɦ^ dbSjgRMD>](XsX19шѪͻ$q 1U / =>:r钆ZcJM u&L)ÁoiOΠm%͛Ӓ~ hC󉎿H*Sȶw+_TvC%9@mOgAŌR-EҐX'Y 䪬(zq^/nKi"!rBo~_' Is~`Qř~fg^޷h>jZuJ 3ɥlJhݽVi';y}:oet.@9:K1I+J)B9VIn^ćr,3p1C>]qwS:,?iڻQd2XȮS ѩ!hZvKJw@Qvѥ)R2ɰ@Ͻ3kCxص$or8IJt= [9Y=  ѓtsOXN?oͶٜrI/! <ꜹZ<UsȃMUpx—bRЮ%nƨu`T {0p.!'w~{848qD].oߨ*g7Y|sHV0% o|q/ljLK3M=22XU%5u'5I3fIѵzg_lTDu_;) nlbjqR]:ƱZEEӞ'~A~T245_seCd/>N(, BCm[֓ޚk^hpx%uj1'h}kPm^pRf=Oױn%w}ƐB[*ƊĖC5rF,ce3~j8 qkI:[jS;~"81 Ũ1iuF!#"4A}mvif)7a-̒]Lj+*WqyuA;iM|"ͣ_``c&3HW `z|G-D alVޅ"Q]f{Æ| Efl3)7蟼6wğY~`n }]!4ĽqWIz2Q֟Xv-1Ӗ>lH>4Vn,%Fy6';^-G# KõNk?U( o3!2{iivEϗo=>B|(=Xz~4w|q^TMQLY.(@fQViW Ug)>5mк|~s@:sI$VIOfq8+#2Stv, 0"BZ8zKc ܁Ziy(_KzS5dKB zǾ*~xcz^zD&L *6'.P{ЯeEJN [¡sh^cKy?f1<S-IA͆x+oA 0#C>:z ʔ3!cw&z_@v+fp pW].7}W Q!/\~" ꣦Pk0!aWVNJ@z8}6ehH-[;l5FK@/^܈V ֨IEv{fm3zkNoj\zZ'2uZվ~eq;r k~|X=(wlYoDmLܨ7!4#b}P e2+v5sOپ!ͰkB">( WYZAe.۳ ($0'K$GgH+n<=5Q|L"T ynˉD>tlIєmZeFd` AśN$MAbz%^N~ơKߕ|5"0͖|:qAPÅg(uUӇ =^4dxoXcwNAm 96NZb=Aj _VCعU7_Np^.!.ׂ4a9 ,Ps.S =aK%#m-2ѱ!@~Kҧ_t!s¼ vpVأ'&QE167@)0G=&Y͘({#jy_&-X޼] r?%G2wO*tPvTwHo cQBWroBK&LbE|p܁K2ϥ+&hv_\ >B/qv_фU,xK3WO4^:4pOIq]%+Ya%, \jhh~ V$Z:'tb`;lҹnxB4NL6pj"pp'ɘx=j }IeZ{jrkCeYK %J(JO&8H^ϸD1m8џ rޙ-])T ɦǢʸzW'6;}ȴx'0\AfHZ@֎g)zڢǷ;gIPV4T)Pv\LW犡H Ug*m9X ՘sx)U.A/b`g,QynF:rC0sGt蟸p׋idi\+1NG0*Ͷa I26`.zFOHP ۑĶ ;V(;j/]EA3^5~8VC6x;t=BƜQ7#"ޣQ} G&`>} ኏C!wbisX|p5!FC2~)HNd?՞UJvm1@J (ֆÌP%uSu9@Ȣ o[!8L6`&_[igRIyVMMCR)6Cn+!U)AStH%ZyxPw5b1.NrzO)I_xYq4ITgc\lsm@qޗNMk+#v-Ke Mg,gT &6%[ypUNWHgV!Q5Bd"zb%.49N.Kz?&ed>KeZ{2[mhq?9uVk)̴!4Pĵ}gS _ם-:k2Ni>F7rۈy6tLװx*"N Zuک#ymhlkBHv|q2Qdc6͍@:8{o U$q^9FA6Tb:VniY}g AVVޥj=6_g$n t6814T˞ NddAq1KASNDJ6 >}<o*Y m. B4š,l9q{HnPi'?h qeT u–GGbEO\Pz+gZXZtcwGr+ΜQϾIOtbi)=0^"S\!ݬEC0P&8hV7w[ "E"41jW.:pŸr*UHB@qѐdevHZZwBҭ`s^!'Q *TqR T)a::W0 Gis78 2!Bے`u͐Δ1HL9З4߶ 7#!h($J{snji}0v#=V{bNZUʎ 2#MCnn Qy*W:#ȼXp{8'z'*BUd,د,"bB^!4mpcodIm)W9Ϣ֔,dxޚO;_EUbvֶ/\;sw 5w$)xwtv7cWWk 7W*?E;itjZm0Ds*\K-DA q~{ &DO?2B(x}2HO[2 y[ݫzjE呟p#Ϳ1:݌.Z)>lf5ϐb%Q/3]oި~ͧ8C\8x:χG.u頳*j\[0i4X 89{8nUE+G q\n-4_Ct^[_C̮лd9V傟Vn.!YZ-$h[Ll_(魝oI%|aZC"IPl{G̙^݈ʱԇ̣m0Rr׀(8"}*<Ƴ*NH4r=b%X~x`̳p|.o9J|ΐMc){:#a &K6)$P\U"/ؙl>Q7mz$Jkqc*޻i O*#6|%bWϏ_: > \wC COޥbM` Ή2]MZ/(ĹAq~sy#(yΥȒ ֔X&whfpkBkZBBEeϲp]FV˰"_ -]&siҳ`)N4u6f_OTÅ;}#-('J=qzϧ;lU3yD酸Zw*yH\̵-V]WJ]\3?sxBٹs$wǜ\_.)4Ubft.6>_+? BZ)[Ы2ri1^n[@sL Hfo#Q{hd:$< ;_q>W]1V8~tk !-m ]E3tU4V!xH%Y4k1еN^dKۦ'}XMڟ^eo/SZw,Ph?_{.:`*: p=Έcl1%V U09I0 :R}vtKe)5Ɗ .~Wd@d-4BtW`9Urρ#r^܀M}_ț`Ub7Rg $ \ޠ'U <ϫoGjȼhvK< Hr] )1jo6j#v2Ļ4׾01*~C4ֲtlZfƿ7s>a(c.$iULA\2 ?wC;{MX uxX7}_y()j~Ӵ^#SW'nّz6%J_R 7_C>n9'' %^p n'V(C. Ui[:B/?(GDhK W;!NZkJa-.I܂3Z!$3iL2Sn,7[U$*_Cy\#QIrioJm[''ϸg/` /8|x^)^sl//% XfxYYnozQ8$RFrho'K’K=^!Q۫]@cO`ܷa;I ?2W|U 2SuaW1 >[㍍}5ͯf'˴^6_DkVtp\j%Vy*E^iC0dye͑[0C5`o9Hg[x޲.j)W*取?V)/r 6'DE P9Ei;f*ɶ ]!cm={ӝg5#c|v,~ Q6>"}!ܛ |^0*;Pa{("t8 n"zwiDi$/Z)ǝtARW%O9xM' \t=A8o<8 @b%dZ\XC$Xw uf;x W@PiYyV%$X3,/@#'$1vC7ХEP.ryK; .{J:?5*'^C;kq.R!2tEiGfCtJ6av/o! Ƙd.E ~E W f.=^i}fȤ x_/UFP~(˗B&?[|vHvbp2(ugBF[r^~2))n E0w2v S~|zⰢwŞ|c ʬx>n0H8ow7K3qޜƁ;I<"AF|B/=tԆ5M)Df)cpS 7j壦ukF:ڊ46-0Hd8Q" ZhzsG5Yext=,ؒ.WpIݽ5$]u!؜ZpV.lhdk÷9,ƨhB(b`Bc8w<݅%&6O#HiD~L3IAΕS^a{6޸ҥo@4A,3dz' 1eXPԯ-js tYAՖe[ҾHsyjt+V(P̟*]A"<^COhêWwѼsqSt.t~:Uѕ.Nrtd_>55wK6}+zL"LE^-.UD̑##x$jgi6}YnlrK0d bOmTh6#箔bXǨ37se\ =|Es}\ۦc,G"e+:Ϝ*~{'*j|}abysqF!qyKdI)*I0GN?RR\MuvAv<+j ܰ)73@4;)~JsnwԏtՑq\X֯ml¯QtU͝x,޺Y42u1qO#gƴ?La9}YMY5>O* VI,Eoj nO$d`(~IdQ5QllLI%~$71ڋ&ǟHl692*TLE 2)-/Y/RM4aK՟bSĨ93pc!@ٮLvN|Yo/X${7Yײ3o.&`10FtSNw1ܐ$?6}ჿ#;Ɔ4I_.u1ABK,h1Mh\gpcJ>d"mw;Re`oE1֛ NG~1஑{66OX*]jWac9?/8[^q"0fջ8A!cl4^7\  `noW\ßR5ꑚ倏ѕS>yYdP|&(6v#-Tx9H!>M¼Bk6y蹂{EF![iw'~2~F-g!y>Q%^$_yaR8Q/QiDI\a̼׉KEwbwEdM`]3S4J#؄E5qd nv)0(AfLܸ~Õ%&KҴ 6Id6ҖwY6a9(wdwK-]F>"(=DyZX*k&?#͖<Ϲ'mShc~ ](ЭhC֬6hɚ% fd^f2"w~CI]r},cha?*m\Kp4dm"[[ X[Qrc^R6|Z8NnU8tZq㡋Ew+:3<sdcQ 5m@`r A\g['V|#ѿE#?wnԙ?3V0 tâ _~tܾ ~Y\5u!so_U81&[:Y5{Hq3B|+}g+ 'Fe% iSvcܫai~Mg* E:zRSTO*džPN&ş϶HGay\pl9=jLY:wCKrN#03+ XY\/E|uGfQ-XRFV?-}9$ƶ i !vY\1wKWevMQ+';* 7d^<&3Y0H?^q63o1cٯ+t'Lzdڇ3B _Gi:f ]ckYHKyڨ+.׆Vrq3vsG@M\ ljC$;IAlin>e(L`Hk,ļ=ŵT,m7S  +SLK$c3:y4GwLv]ah2STtΚ>G_7Y'{wRZE3ݡ9l}5/w?78+ 4d,){&6A.iy$`, D Xݼ6ҡ[f}ޖ X ؄F0f#="M!yD~D/h4х}]8= }w]qꉱ€LޢRM9XG M9(AŃEgv"CsDMP+A<~t{檣%J[8?4Nr{z:Oinkap^1רSE88Nwc`rQlC{zKzUUaWCy8ꋄ:Rhz"*(,9 ȹ s/kȫ $B|_au (||xb?r+ej_!<ҽ3#B`7qpJcvX_}\3GmEb7i͉ :`+hThйYPy(&{>іuB_s}n0XD{("#xygd]G$դA1FOD~_f?A:1|{rbSYǭ71y tμ DX4Vc\YDb e tFޜŴ &;Iz|DƪeOPG'|Jqa+LtSv[;i=zEtD)lv_O:+zK13]ӣ0<85{+`ߵ-:&gY+-2j|=L_I F. 7~"LN(%zB^TۙSDv\&ƽ Rx5]Ps-gVv{ "B >׹b!rZRmѱ|g}_ YҌhdX5E7u1ĉ|jWU1(ac0zhF um ؍I&0_/_\Qn!!P;}f cxز†aJRmPv/ŹԆF"5(eÃ?bZMliW~j! y:u*zC#hݑW ;Z]-\JP:h">§ǀe˛y8ג4UQvo) l8xuﰚeM48Xcy)]yT^ 7cP+uI~OuvY5r&ՀԠ, I;Z9Xpl Fu\/獉- ҅s]{ z a@Li|X̸HNxh>7@$RzڑR(}+*mP`5U6E&M -0ch(?HէsW?}i AdOH%?B"`rQ7vO4M)rruϼQzv=hܔoUɲ5VMh)c +X[*X`.~hx8|dҎM&u+VhOQ5j~lGv}O 㵫p%B 6X[]!z~C& sq ]  DwIs2@#/aрͱo 9}aQyU>{㨳( ͽz р>K(s倸]DAC jG\bw=`v q1XyLυ$n QS\gR Edcf6(UJ8lŚ3$y.81!i&.J| VrAPP>Aʬ{w >HV^hեs Я.@-{'ztb5?g׀8cu @XfzFhu_vDpyn_iQbcVjfhqdc]`^ćCĐ- eY2+~&եK1t'|$.f4h 9/Vm5?˙)/s+8+U6-rv‹ʬ[pcKknV/nJ,FEf[q7~OaCc_,Ҩ]#5bPs֤k?:X5hO JVd;QLhgw[l!Fy}eXn6 BUgk1yWa \Hf̅h[} MfHGE@F}H9y sfhvҭb OZQ=6!WaREKxR8k1KCm2ݚcj *`ڴsVe6/鮪/ߒ&h@JLi iHl~ѹD3@?vxN/y!'D]nbg;r^D݋9Н ?_c1n]Wm ۶7sv$}Dvʋv3Ns=1ZOT*¦dCr <> stream xڍT-Sܥh(V\ 4C/Rh^\>sc72Ftj▎@G 3; @RYƁLMrmFBA`HBf./6)38eG0@ ```cp'"2sYY `32'dm?tv~~^?@ P6s:t0h:Z.UNIݝb-Bp4@3_ Sl@5\ @d;d-Ks@ +X&g`gaL6ptp2{+=*0[hfof73 @F\`29[@@N., ?Fd)K-%`g?I @cdf`￁liN`;W!/&6k |zXذQ^ NN! +qz` pA`_@C@E^`{/_㓐px3sr9||^n6WQ3͂w<ٗSaݠw-t5nf?SGn?ͺ_e  kg Wʻ8c9ˀ 8X<6SˣP1cX6K]h 3+S٫grDFdߣXRoqyTiq8zOH {=>E-@0]^O5nG絭q ?7{M +.PF{]aCܙI5 jȭ¿{赇H!\/N HQm=Kj8l2ʏn*MaE1cD~Lk:m"q{g1t*uss^]{j #q4~c.51M1ӂ ~L7c?{z ~6̀,}S #Q-?y竱;i=Wue^ϋˆ6"z/`EvzHRw[  l<^,V_TȋiϧQn0QE/yK}rڪ}zC3^D#CNꔋx1:wkr XBM(JA^cGc8qTYpCx >O&ӋJZ+H15ްp Xeғp+KǢOvl?YvɳDZhz2ϴMZ2rnڗYj>:í󕹤4fȻU q!& IqD>AE<Myc7D#DfeԨb\(bPx\tI$,?y6NUӛno}DDZd8H҃?7'0дq9-@65NOLEהZC]Ӛ4IŲ#Q#jŕkF\45Ѡe04T;rW)4Y@uF,xw&&n o5R=D5z|R[x5z UA{7cY-1wobDG ^7CW*.@bJK3Jd̺QoxiƒwA+wS;-ԏt51x5 z餫(8 EߋQ*FTb,V,A 9Qi#N>ogwGIYe^L} yȐrmmk_!q!")QxIC,I.tCEyݛú`81y!PuEJuؔ [ ͧ=OgNlx\/oCyޘ^Zȳںӎ /!"@5D ý@ f,lx-~hD~# (VI<2 A\:,YI`7jf l!Wv_)#[:=g40-0 nqQ%Ӈ3yyMjH}Cib[N$cmB,goLBR97V:*`"Iz1`=仍. ,0NJJk´;J z%e4Q4gqX”=cX0Gd/'Y-?co '*J2㫈X'>5lx^ʓ']r#Uɿ IIʈ*%L Yxc Q{'qQZ cA$i6|8HAf4CC<UlVc5=S9m=y;3}A}r<0(XƗRUx'5/ȡ4%'镌f5"!4H PprP>RmM+WMY8]5SM Ïzp,*?%=q*V]('Uxnkd(ւ{lVD I2Hɱr`'_zcĻKϫ-3qNQ8 | t5txImr6mR&ȔbxdB 18it<:1D[lCD=Ge^V\vh$6c16+7!BUk'[kiSG^y֊a8qbfX(=G{ٽa[c!>E{N{TPVQUhCR0 -9&.PbANdOsq]btGل;Z9Z(9!jA'N^1O9'xYIȟ ~ 'd-ˑ8 817KT|`d2`a}%`gV.ɷ26Ư/o<>[RujTPԃւo)Kal#d$JyQ#xtin^ [Y`ێ V_[ωܬce_~.-ŌWȝK:bY4s@Hjb͂n,C8ޯNUJeإ mlWXW~y㪑6qdk61U]۶7 :7 EFCכ}?EL4l>ť-e>.+fj4cdA" ĔHrȂq/ p*= !xWsͶ21[[gME܅CR- 9AHҧŖ/Œ,.&L.AfֹtC PHIc>OID_cˆ-d!ی̀/\]¹O;N~z3qlC ώ`~y αsa6К(^=w.1 r=n[Wrܢ`ŤF$M$R1|Q YRaT۫cYLY\zM F#6 2P#G%jb{+-ETnNl/\;:ђI,γ/߲/Y5Gh0 zru )TVK%Ywǯ;fbQ$!guX۳Gp[P{㹺İ|d --.Oě5QkXCYM>z\#;BxɅ[wR.A9z|3eύu:g&m$2EF7K(MPZ@{j'-ʰ56zFY3mqղpj9dM\dm&&fФە{pERCAaF9o81\e\@UzFE+#G1c_PSդЯh9}먱וzb!}dɶfUUKa+]ܞL~yn˶xխK6[iO>sЉLT:*|.s@{E+02pL*JCfzs>[0&IZ=G-PN̖ :QC$|!JZَXk^~a`HKŅvqrh~wezLN.@%CvHpSrUjH=HOUWٌ;t\l! VKE"o{',K:}q ⫸Q2>iYΩ M㽗,ƽ}Y4u^a#Aiڧ4YL+osr6o<}TfA ghlZ5j^B?b@h"~4~Gnxk׏19Q`6_ʃmcnP? 2$7vIR)l]'A~+}+[ʏ%4~ja;Un㯥'Ά'Ыۃ )B܏I5S&N9oAѿEkaq⏼G*8 w>M~b:QK6~qg YhQj߿Wr|DCF:Pyb{dҶV\ `+Hvי8 BX9W\/ c!ܿ´HaMER*V!B׿Jp 6WhmTWzA~B>sNDXvGdV eBml"@9zW_~OJ.DJrГeXlbXHZBDKy=bh8[*N]#av`V\i/J޸\Y!y`u'k]øe>9 w#<0)Ki琏=A?:?|!"(%tM}2o? q:b̶Q4c2_P'!"~$ [7yٚ3F~6Ŝհ6WS# ιYѬ3N\VJV/$ !E-ou19JI0yӪ=MGEs( Yrwc7ķ705Q_<ܳ F! X AM0T)[aX&f_Sʼͫhy%([s{f^eQ|o.J\1 ˴uP ɽ3qwk<-]55]1As=x3u"ל6J_a3+=qy'o+l[?pЇ4uIC*-wq7!woF *a}B;C;8&E@X {eVJ)2԰1 *ANJP OTo +0ʌP#wE}Hq$W؉+MyG̈x y{tϼΙSI\mrhaȢu-2oXwU%X8mzy0?|y6.ɘ2j4Fq7c:"/`ȏ}C1qE?$3'1 { za_j^K_c";L5Ͳ!E9ױ-M??Aegq/%R]i6R?{VTF}T}V>, jJ$N8L21l4|b$c: ]|1-u;1FX&2zrP$?9Ҍ.}A=* 7;-Pϟ0мl& UԘ$NLz<5*ЮT`+O%{4r< LKwj n‹v.m<9bٛJwAnݖM'C0-T+[mz6PJ+6;cŐȪ$qMeϩRROM` MKOr &K'8v kL LJYАk&?;ge3[T6Pu㢆?."_D#Hj#DC#CGа[eK"/ D!t}F_,g8Ѱ}j\X7v`~Ps&:w>%bx^}uc_>SIJUAA+f Ƥy-;NF 9î1H%/i N[~v14sHW؂:Ceh^)a9U+} `B}]XCo_EV7LȿҴ薈+V>`30nCqD/d~أrPZ_JVM/ O:UBl{מP[E"x5ut1$ kF`%Rϥ ;>ʀ[~N;w塌LeVQF1#$y7bMO/6"O"ϼ?1HùHIfNhGI- -ˍxW8}=iqWuquVd;@+ȟ2mtQ]`C1Tk̓;˙ UzFU:a_f߆zk/yGSC$evxGWS(N^I TX}QyzU̪9D)A=M:1Te@?rN&D KKl[Qu:D|B:Ri%bGPaƌfRL8&jN{q%Dg!L*?,{[^ >,~2as'M!+"ߪ|Ѧz'G {rFFrLV\Aը2MXtmޤI&nt ٗe*w [usqKxWPJ`roKt3)! C˵TUnqn᎔g_q:6jtk2~B!Ij7 }nw=LZ%ՂAc'd\?b';;@z1i}BD4NyFu6D r«+ݣysdl"6n^7)0[<ō`˯;Cznp1 ѽ}HNJy{PHɬ ݪN£׃h27]aJ97ZLON?qUY{ǍD8]nG_N":vz;^qxƗ~Z݈oɫcC˙wIU$QZRwVdpV[^@ ( %wgjk[wً}%}9nk$ŘZ`fWz0p(̅֩ˬLK$D4% ~>r6l^gej={|uWL>Ѵ`PXNʺW%~Ǩ 9 "3D;s:0QuDCb$"L-`Yz$ҧ1U??!84 }MD#Rb!tyVC!ߥk U{Cqw!ۦϓ@=Oֲa/62 +:)N圴Jeo>7F|dFckf6JHe% KH1B#0 L!.@&٫#啒++o$l8̗Ch#wůI['-׺šơJq{V*N%SH?}|.^R~Yo И\[t~+/1hY endstream endobj 519 0 obj << /Length1 1422 /Length2 6941 /Length3 0 /Length 7909 /Filter /FlateDecode >> stream xڍvP\۲6w .; ,Cp`݂$xpB\#ɹsUwu^5 40K Hjq @^N AˍΠrqàAvY=d,y0(@ ~&- x@a. 5@\aN.`[;e `bp HB@.`+ (@y\ ܼ0'ĕb+@ 5W5 Og ;6xt8@Pw58@[Q!!7'+; qz#.Z"Z8-<,ߕ[$5 ՞ ͕E_iwYj- @@P7W_ɀ]@Vd0O_ jm kw'.]((хB3ee+7؁ `lz|Zxn. issVnK-wG7x.`/Q{_&A>_.}M i?y|9xy<@?@O,࿪K*gk6X̥{-ƍ@+.H7` /£f {SAfVd v7f8P[o#UY!sCA0W[ 8YV7"C璲P+ pqF> 8 pqBan!60_'*mqy\a>Mn #GIV..C[4}@^ +YH}]XU$'ö~ K 6JKuNȪ˅dڧ^ܥMYsE{߽ȶ[;$vD{h:_Z+1vv($/212]$K8iZd7JTVc/)j$6to| xg|+ux\II I(G&}v^)m)W5ُFWa6k?܃"z䏌z#!݀U?@ޫG IKiՌDI2kص%YX0<џK{ضP?`Ɣxbk\/]8=_cPt>Qҹo=oԕUV5^Ms V ɎUFJEWNXCdg xw<>NW }^ҭ3Q~M+.]~# 琎 2jSc:#Fԧ̄ ay4xMJoP5',!Bw-(V&&Jd$ h|O=sT X%Yfm$nV1z ndCaeya_h.|E]k*|)C=eKf? E7p NĥXAɳi=em qr`[h̾~du3Qt\"wᔡ vR^9K-JEc5.퇏A۬9@a 0çK:3G[Ws9 F٨n-R;!m#+Y](?0M yLI٣۰ۉ.ũb "&5݊pp6,K9+FQc2GώddGMio{ |˝`~tk W;Xl˙L\; h $.H"VsIacHxq2ILLE%T3V[ō/(;_uz5mxoQ=|I-V\%lBQ73q.NlӚh7^A;oBHUܭʹDx<]vG Y={pp0vT+=aJwBQWՍrNJ)JanUl:A>gI%-01^o1q.hЎ4NHl[9۞ui{ϢD?(~/7jՅl^zq]'H衙Qh#EV#2ěe3Jܨ=/?1c_|T2Ƅo]K:dE IލlJ 3˄43行d,N(:e~xwC8M$Yjz@C(]ۑrpdsѩ2R/"!K?19{Nې͐!q#.0S'9EЭg%hYߕ@)!=jk/Q. sJTI=86MAo&9Q0_:VJw"!37jNGOoXѩ8n9˲RlGB*4NWɆ4Vw#:\s,%&HC]h3t[Q G%4?nelO}"'x#!\zWzacKj AhXbU l=۽Fce9M*'1erKj?1YS!4x`][yꈌ؏j۲Q>mށƶ!G:3t$ ?Sqxڒ⫝ڛ*3ͳD'7[OB}S_X=3ݷ$)ˁ؁D#U*J^KW>sT32I-r _rpsSPĆ0~="w"Du*Ob!׫&,!S(:e%V漢P%fѵf u&DHkv׶ [ABRR L'xN&go]Qo-IbXc\!є>V ~ǶJYuyQ_:OT%H$#|FgwX4Nfy=V/F+||6jrD/LL*@[6s5D Ê!gЖ ҇Ǘ&D/tG/z DCj̣9pqSgo ކk+wTzyo7^y v&yȪ# E]W$c;.g&}9g-UDLKF6V1L-tYZuM-3Y2Zդs !Kk͒/1X-CӗүR4[zwTxs74\ݡ*#Hs2\[/c ֱ 36^~K{N9hFWW\7fkQ ǷfT.'Zwefo0i9?S)q:7K/w 1P3zjk~fZq8fEΠ閈Jeq؀H[NagJWA?ɞAHTC,ӏgF`*Ť Ѧ@L(U@j,$-{9)I\`tK.:d|. .g"vS bsWT^Wᒺ0n2z[8en]|,Ũ׊^Kѿ8M ECW$<#Zc&YE=9`B|?)<$/iqNCS-"(Wzg=ՈgЊyI' 91Ub*z4/wreW-B;RU/I Kqn~b{IHW-ϴLHs ~ASZn8378~~q;3 C@44c2Ḉ&Xdm~ ~{Y(fE>nG\MmBJ7|RQ'΃elE6!y4OܜC4ڻO0ΕGw!ew`S1Ѣ{Xl!3PAMwH=7'8N[HvmE)t iB\GHDVgT <ȸ; 6iO]7lrfkAQ4EdxeRbC q4~T=u"ߛ/?S e'gR+GD?8Kh'-c%}R'`ǻTu h-oe b eWkN79;ЛJ]9Wjp O. #L3񟣀P*/CnQjB>*vpvI?; =c4Ur.VP'~Z6xKi3*L⺜Tu}IJ%B2ғurNp ?"m˜߿nGחAsܾ/SmT?AbGɣt԰=23,<-Q$Mwhl )UAt_ofV_ӒPh㛮@ݟ 84W诌L%oD"Vm">e 3ta,U,bro'tn( ‰ gR޷ Ucw? ?ڏkt ȹk+RI0hy3jJdQs׸- Q䘬 'wSr#fC_AJZmo]kBFUY<|hː(O;NjDX Tν*mw'͑~Y4 LD"NY[XO{^-8ůƻcמ aXBЍkD6`74-o)ղ!bJKc!oGU7b?Ek#ܘ 5y}|UMÃq]<)dZT\SPZ~o#2&],o0U~e#{b'=zVO<ɾ]b[9o{=4Eݤ{Y3*iAI8Rd{뢊jo$pl}RihՂR:ВPK)Q0'ŧ’HkC$b-ijR~V'#"afuZ%;؂jOPM>VJ]Lhh&Ͼ|EhDQ.V`D$HdhZ߿L#`@jV&p}g1nWbnzY3GmQV;]D?#n3#S+}OyFXN4º'.Z l#Ou endstream endobj 521 0 obj << /Length1 1391 /Length2 6283 /Length3 0 /Length 7231 /Filter /FlateDecode >> stream xڍvTl?%1:I(FݝRc  J" DJBBI)I%>}gl~}wLD D!1"`Q>s8 YоpR?jh! %`iy<eB!p(PPAh;_G ?TTAp( 4`a|F( haxˋB(00q|ah W@C1Q6Cb hx0/Cf:@#oa_W/_( H7+ 4b/C/  x߅C*&@_Q_ׯ~_E @_hAbD ήp\,p?_x7@ by~+`|Xo7, bSO ]P Gad@mx` '{<\PHWLZBKwVXqeF1S,U_k1e3v )?ݿ/z4~k- K}~mj0⿵:~Tn^D&<b @PnkH1AA 4||)5P˯BhH?b$Ăk `(]QhyJ/𷌟 GPM |]o9 &QЛw=^}{X 40·d% D7Ӑ ȉEv}^W:îyMӘjtrb:nJ C\y9'2“ a._,q!a@V` bC i=ӊ","JG pbD8viGF/tS$sGc_ڲp3|U]e-+)+F`6@!s+"RڲύVʆ>VlT3;UDR+;t[q WܭOe_? sMAaF?kFյh1j.jMa8W1Uv}\k<^"%UXס;+Π}C! x ;ŏZXO">D;ׅS}8^NE* YŦ fblc$.xٙy}Z^5e`Rz-h״%+%e+l}+v;ڄ~|QR@ ѿpc*˭+mpϔ'Nmٵ(oV;ۧ{&HK>ByS0EOH$dښIRv̕4:KO\(La~~:r0qczх@ye^ :<5" 4 噷9Ug>ӵ$g@3=ڂMŽ'(w>j0VJ0{XE l'SˀzX5%]6LWt0z*?CYe[@C ۓoq_gw6ۍd8LA,N3q=1ƒ&sDRMp"^r,9rXkWy @ikrUsllZZ{Js<8QѺ.5L}-`a-ix?xoXRX(HSiFRz̧=ɃJ2@- W %Po竲"mF@X!Cp`l nN5n_oddux$+qq:QN$?jk^@b_/L0 Qp-$rl7IT. <6 Pcʙ?/H{V eE5l)F,a2kW}WjG3N,d;Z'B c5)-2@ΆPz6 mާueOB A9k甏,BP' iHɽz\ .쑝qoN1(saBti6ǁm"lŸ释_+i$kv!e4z`%,);TУЕ|{̹kɃ~C*Wɦ=B>V7|?cd)&qGƭLWΈ62mq\uIű SYZ ȈV?z/-w R9~d_@c˩/I b"n0~#A\Q^RlUɭ~%87 DJ6z.30fUM/iij֠Dg{mc6P͢6iscz mG[a,->8oUc32GHo>gsdy]$2@~(sw-oFU4֛Һ.JZ)%gQ\/lޝf\')yhO&_P5\umOz5F/oi{@{Q 7z05ᦝ추_my.!-pWB܆t;1YL``bZH²Q*xhNG Q7EfS kmKtL -豺76aEY\j.Ds23 UH4V"Oom[w5:cD~k#umlV~8PGg'%/gm1 '2͞u&ٶm(KYl އW#~ĝGʃG{86?NPJEP3a t7IEȩ˳Pm-eRW*dhJoel-A;Wh(UKdjV9rZdhܗR r MR6JY&)-SUΝ w [L6_Dz Tm\vS&u\JWiN Rdti%jH(.q6#ܦՀv7^᰺>!@$`Muɨ/{ܶsbѩzApT}=hlzu(ѭ&~!Κ+}!۶J5we&ZwS R2^yQ0!P;:[6fUпZ_I?Cc6&>ɌT]IOHJ"; MKSӝʨ;[QM /y_Liy8J }%[qq^ B 5 {~o?ysq$| %YǞRሻʸ2p9\@. rHqIN<֟wF-htxV䚺̛+MGUc(tw.O9Aak1Ȱ,Qm٤Ju=#1浘T~'ݾXDcMʂdd%߽5?]WD<k}>sѿ ꩽ*aPKMH~rmx#Uh[Ku~u' .(7ѥa}[o4stI,<~簢/sd Pvҋqoݱ}]ywn/S\wJ@'w eԠ3Z<+7ߕ5Vi!}MQF]͖_E/3;Fꦟ%L/+4(O'?Y a[yOf+, 9+,4AAhczNWy\id~t[qjSJ0wly4G5**Z@(ow}p6j&3`n2i-<{" .yLA5mh]vFlyo®g{c_5VNq&2wzUˆ Kvрy2|[ݷCmI )G*@zpi9]Ҙ͛+/}?=mҒxu'GS3j"94wE)>o^|ZD0+<3Md*I^1 έ} ^:،O9tUkNW"Wc!:oˊ}VX1C^g,A<)ښ;G57?0'.+(>ülSwSozA\q5g[128u^O\%qwJj|Uzo:56!7{fh&/Q~-$j ̣QCWD$w/2pC y pP[}.e\3횤 ;7wZ&scm 7,a܏?'3,ڞnYߧթQXG5bݧ\eF\u7 IVSZEKZU -psttO(α|c0fR]} ]fӏ*o7#raH9t4laس)EUQ~eBDԆWߊE)"SxXeG\a>R&H fh\Il+8^}^(3_)1tRO% ͽ`3$YȒ14k MW ?A?駈W*F"}"_WhOr~5P Y`bxsUo¹ #gfs WCߑE7;ye?nby&W_CS$!JBM3dkr>=^X!(X\@zr?d$Uq &l~ҾF=Xv tJXLssi['CPSƣGD^Δe`]XΔvB19xf ;|lʼ.u뾩[AKl.vӇ ',[(x]G ɪRJ,ݹ^_ULmLO@mm!u0+J8 bCJ{#9rCdTMh3XNlzVvb\BM&i-IwMuS'=ٗ\v;[S [UL&bmGqx ֟kwZEy{0(WcB jWJɁ9"bUsˇ$6Bm޺fW]V^{gB_/y$f&6Ǝ#HTL\N;-ae?L'y/R &Z ݒ\t ~q0亗j?FS b`){\X`E7JJ&tZ01;>&pC3Ԛ He1SfQ #5z9<]T~F\-]&KH0zU*1GLF? #Ľ޽ }ӯ#jf(rAJai~ڝro_,^x*ۏJjJBYڊ|E7qi^7(7 ؊Lk{d,SU"Eԃ≋ޜ?)hHҔ3~1B~ T; O*x8xh5/KKwX4kI"G]r)WH`m,Zbx][6d-{\8u휫/0Rk%x B-T:9qff:]/}i;)'ڱ/\ q)> zA1ԗ#tU Y6UPا5{3!h0E<ӣ(xPۣޭbZXZG/ endstream endobj 523 0 obj << /Length1 1391 /Length2 6272 /Length3 0 /Length 7222 /Filter /FlateDecode >> stream xڍtT6t 2 Ctw "%RHJHKt%ߨ9y}kz{_ff疵Y`P$7O ' cf6#!?(à(L 2ӄAjnPeM B1\`{$*˿6vPLL;@XAVH3*^&DzxxX9#x`p\0B [vZVΠߍ1 ?>aPl"PnP[ Wh5ppy v9XAP{h+i =\+/C+rCQ (PvA"x`ȯyA]"V "xSA6[=V'(ljͅ vu*eAHr_QܲA!^.y|B| @ug+_U Z v?ciP& ?ݿ/z Z_Gk xG & 6} [kUVC}`dF8ׂAP ||Cm@[B-?S*Bm`_H`[yF>@ڂ<3!Q.T{~;<g[F͇‡B<`qQ%rd77xXJƃ{sDjy+vn9x%!v {elϊl'27>_Út[|-7[>Q|å6q5 rhBPcqu%#;V)] ݪVw]:cmT4Ŝk5Mň =$:9$}=zK#d?b{܀񞚉ڄthGnY7+iʶ5d d{SKÂyT\5*zY%ѹ!K0pQmSH5K;| !>}ՆJZX$z)-{c9+}z4/Y*p gUF͏sUV2MK@* NK 6E ᢓj*] $Dw^R}Jz`TY*maCZ1-G8Xd1&])lW ,{LVĠdDNCZ;Dm1^&9F1al}6^gcg{j`,@4s6;¡ ?txRQԒ:འ󱷪]`+tAec^ V4}IL&\;w :nY:zEScwTX$fϒ8wWK }y@HTm 47!Y'nXjfDN=X h3t2Nm9υ GO}) XMii! RHRv@eP7U&*ml;%)D܆! wFJ^]P7r(߸d{)ܧUuq $Ѡwhо4A"QiGS˞M=r&=~wYZUFl(_Nk\$NL #輝ooi4:ξuDVmhA-pq`܎?1{iģ@}C6ضgolJB"_ [sG_KOXSy&1X֤+XkƐ@K&Ok{=Qu=RRx[)L^wMz0W+N8&~bO/Er9Mg}2Vjne؎G.;q>^5ѭ9t+16^9zo*iS.H7=ٿ\7;3Z09)T(2T^QS-Qɹ;@F.XXh}p]Kn]Q!6Ń y͕>4QO߳qnȳ&a>#pS|;GM5K7ẗ xoD39]XO(6O-Zo \cB,Rɻ=^紃ox&&PntVJS).5i¼+|i!˃d͖[!7rKV+7 Wm˓"LV68mIsnv̞ٜqY]RuQ$UWkRآNO?MM׉͗bY~>oUE?3+lޝѐ?|ȉAHW:(}+2ŞE-逾$pjkoQߜ#pOulca8#6\ oLjB[Ɋ!ӷj{ kaTV8CIǝD.<#/~k'ŇtZ$v󾑵i#C+4КâϽ+tR^sNH^{]}튎 4 VKl@_7uMRX: -1/;s"aѠ3t-T*F4Ěʜ]7d7DH1_> P#R 7}VGGdNU-p9llx*>kGztf.ktBi3Ԫ$+6 =N.Q } :M?<6'FhrP+E i2}϶<ƴəI|=xK\=63;x 17.T{RX_iZLw?137900ծ}ﲵA=f,w-۔Iy*V\[6mPp00dǰ0}Q8(~i#~U-IHՌ}+4P_G1Pvs=M" xB?=Z?xR{Uhhej}MfF-^8퀑g179[HU)Fڳt6 Ǘ#S+Y8+x'g@iSU0dSSE `o0LF3 (Swޤz5vX Lbd %pL0+TPsԶnv:b%+.=kYMa+Ѩ;vȟJ:|918"4)I<쎱 ] [) OWUbᖅ09H|s~TP֖g)MP$xԔ/C\b~- aU_{RPqzlm+Sݪ iܽ2Gw&>!&L;Z#ph_odqDCIV^G=>p''+kZF H &+$ޙYbu{M{6L| G{78|4ҿ=RVYGaBqP%Y C}GYV\[ jmHyxfuv%''7bޙhS:3](FS u0 Y 9]fp&4^J'r#57n2y*^:!vikrLYh昙w;*Lk+ڶo}|Sڏ.wK/8MQzfƭ"܎s ǽ%*גZ<r>\ICÉyzh >v,en_nV ꈯy^EAzLe/mгE,}ߔV+ @9wu`AJV• 91|aP}"!% !8x;EZbTrNGCQrrnW ؆|o9DbxLD]Q#}])}f# Љ&}p >"g<% )lb5׶ E|qq/yMѻ?rƚgi?~%^v[VoKw^h јY)NQe"JsK8"qix†%žrІCYtW%ɠ]F0=!Ki9ݍ&?eX8;{ڐy(=Asbk'?5pR"8:HսøΎ AqJ]=no= solH{e1^W,fxauƻd_/1Ta>~`:gdsm-:a}S *7U~nB?BUu1+wseyEᢳAs4`@Id+އ7H:QQg;un˶_C$֣Ζj~{ʤG26h) ϒHp.}I ziuj4@UiV&0}/|վ*9 *uAESA+GiU7֢|Evw-RHeG<هreanN@+:]Gڪ+hمWn >jaN:[y;4dx[m[J`ltGk2Fm -edQG!4:뵘-h-]djP/<Ũ Siͺx8 AO ۤ|-ޜ-nm^m7ya8^QheZh1W3+ @u}哶Ti!l z+JEN4{=8$۶R*Y Hw76',Z03O%zjps$XLez94WE:Ļk*$ Ew/7ZȾ S]u;赫 ƫLَ{xpM{~?f6S-D!THj> zZ̞N`:5DPGmT8cb1͞npNu*lbqY/ E̬<7װ)iI)` vL47)P҃2?uPZejG͂`Q1v3MQvX-X'"]3ӳ^M8%kG1L~ ~zS endstream endobj 525 0 obj << /Length1 1971 /Length2 14282 /Length3 0 /Length 15493 /Filter /FlateDecode >> stream xڍP۶- ڸCpݝ!www <ܳ_^uU71k * &F@ ['Ff^2Bd Otp/4tz:d,lN^.^ff+33: ]@&yF Bdf~<i,<<\ cC9DcC+1_%?;9212Z;2: \ANe#hC.@0Fx 9/nmmL*rE;_rn ?dCcc[k;Cwd(J1:9 mL4r}7t1YI !0|:Gc##Lyo5~b {ݙVKϿMA6&H0qcR;x7c3:8xX@{؜v?,{{L%AxOGC o#x `4S 4 ߼ >x,?>y}-[+\&u-IIu?%"bd`0r0X8\]!oJۘx"ޥ!S4`>@?l<MU/H8[YZϫ۾o@J;rM>j, |[elp|?]#mmM.VN;#'`{ ]7b0Ia A& w?`2qA<& W?f2d0E1)@yi g/`w;owV̭,+w;]{7\ߏpW 3w|J@_klt//YW 2ORk|a\vp~DIt%4܋+N}'ByRښ<458*\7@G*tbo %Cc̍;k[@X¾A,s CZEQ<'BXZ+7乻_hٓo2qtglZ[1媬ݸZ8whcӔ"G2؋kKn- ?ҧ10W#mj\Ɩ;YrAT{ 5%MUmN5l@£NS_=)+<3uoy.Y_xre\/IbYl?j|&3W%(1y m&-7mD3(n/@V&Sap R^5-om2m}}d}Bǚ0H[P'}¸Ģtq n8g^Ok!4Mbg?Dg"#Ԓ; >>\'0}K/tNTa}ui[?C ;pw5*kB:oJ9,xG؝uwیQq5 -[wi{3 tJà~۝9{엋=˾uҒ>p_S*I@/SA 5' `_?㽠?G63> qT:iA[Z|~W7 ZE&n&x'>r7܅';\ދ+~mOT5*z9XGR C%a;}2kq!!tcv.POKPf{3lw#o潇 .-B9you|9& l{@Я53%:_504:{ݡ'f cL fy?d#\|7J[awjhPAҵ+'(ՙ)GV$3mt'KUhA܌m]UDKAfAy,5<$OZj*J@ZŮ#DfBKM AXd0W7^-"wj}΃9.l RiZKZF`#yw[tkb7H).k?Hv{VZjƊ13WXƃq+ Pq `J_(WlԷ!i9uj}Ve|1}LMnVqqTU}Or E VC>14Unom/ӝc0V |y,KC7՗m'1E/~-43*%VN|>|S E} *OBOAqE1NO .a0Oe^j:Ⱦf^_04?G?;,@X *eU2y&c83@^x7R7Noүw-hR~ RT&iQsoa3v2vqXe0 ߙEdd¾Rf/i|f֑hɽ`e:Yl6+a1-HÛd<[12bw W;ZO!ZbtΨGb^@4 7"ر&`Qux6sذdC׼ Al+"dٲ8hβ#{[nBxSSފ[@.kT{:/H}%r֋UϾ.a{/1/91fgr5QVNU%!*O>xbLd2MkQnt&~q晃1x-t9IH<0xvm;^ *-%o/ZD 5>VZI2cpb)kf KQ|xXf kTI  &]ib=,pV‘#gN]e ;W)پ hѧXkkFv#iv3֪9~7U& _M 63KAVHY|nQ#l4I$ojۖLetqaFX=h@,L&C,f̏^ow!-"&v|V\9jx QT;`chrH:QMxkp ?r_rTԼ o tv\bq5.~4K@<2i)<"[pJ-ۙtEjZaɤF SpzF4jAS{0tyszz <ų/?q+'"IҩD'kyCto$kFYqrCfn\æ/Ov#źפD^[LjFzͦU%Q{lf66c"NL׿/#!OTXu駆@+,oLC@Tl&mğ8ں+\t:!?D¶o~upL|mLHvrkB6\虱HT_( (G]{` ФigmsPv !}|&G 7 [ Ss+JW.3ՔMBGvDc' 8O$g8G 2"p Q`oB%90nN\M3@€'%e.&۽񧁑%Ai[ݪ_ip]Xio"?$jII}fxUphfDxm OM`"(S?R{KWHjgyRܮth/rI%#F33p~xWwIȼNTv>+ I(BwM{?vP eK˥3Լ&%/Qte] MΪ[¹c0Ӄx?!a3"U^ |pX yC/])&6LIAgrMcG:>֧FxuKz=) _7a4f lh61|]R$H~B٫R-o>oc(SmGW% uv ?aP6 P'+iӊ~ [Tͬsы9/q,E| Ξ ; LH@}"4UK@X8O&I9wx4la*.OIW~1o~Lsof!@j$SnL , r_ I\ &Z^~1/ګlۏ¬t &;.`pwڗȹZ b8Qy^hW3Բۏt0!tmBŘЙ1S"ښwp ϨQIqq$E ^%wp&ѿ\+x٭~~tN7 :Ukòo@^*gn|@FtCBq:ӺݙF$6 1 .McۭbmfŢ`DxoQΔP0v25!=EՖ^w3+#6KP-4!؉D?aj'.mBnԅJ0{9CH X ;0vc73HND7kO1-!|ԡzJĽOmb\Я"LA8]I"\^S^VXݬ`H줿 TG *,ʼny& K%o4~ָdڸ'p(wA9+]pX=CYd Nn+"%S:g{ |ekn:Z{$Δ=l~{fumoyvۧ+W(!͡Pb,5{ɊIJ !S"8G 4]Rcg@/E~MwmqYQKMUAmKsu4Y$HqfO9S$TذV=hHͼBkR .Q+x\HM?>KAYP&m sLФXh? 6U~ |cFW;(O;FiZ xg]NܧB=,2WH:aѥ:sTKO#%ȰBMN4_k4 ]!u,tgl&d%iu#Z#'z=A ii}`QѽPVI.MF,ƎH aPQNm2 .=3H9y].3K'JE\f qL";iͷ"Uƨjvm݂<|p1@bo7^SWTW*$iS|LBب`q9J'^v+ IJ 똤> 9 D:}։: ͂ɡMX] G ZuqlcrhvH :XR]אj6V,2?-> V0h~8w#v&r9)'6>^hS+* #r/h}ɎUi:OPU̶n$toI`.'R6I&!ҨNI165_v0(kM"}vtHW$|B5bT'$a6 NwxpZqC5!rA<$oGpsϒyarmIRCiw 3ľ7jo͊g}hGxu3,& @蒉sPhЉ^8i%>OnxO*8QjsFVqK̺u{W&$h 釞޶ BmK.#{`>, kep_a4hܗ{LOI!bJi^xF0mbzos;Ȕd"G?Y .q0Qoٱe7-zFVk!l;XU%<޷פ5PoQ \9$oZw/E=B٢V,PqӒR z ,Otfzj]i/kv(WUX?-o 5xCE-t P! X.9Wɪ?I*u5x6{Nm[hٝ {Qi cmܺ|Ek_t\1w7~Ne&!zd#tSn*,/t;uCK9< 4Nzn|<+X'Qb+swIvf:?(SL7zN+RuBhOn!:b1n9 WxGsB d2]_T{X.SѢռͦG2du`a#p.$7SkrO L.}":1c$nI"`]k|꿢"=X{/rPbHm\8ެ KK#2jߢt}BV^uL k|ZGy=P,ˎ5X8H^1S2q%}cD6d4s= NJ6D]wk\ݺ.C>EiIxFz2g1"~@UΤnj7r#jhS)-=K1}`TDJxGuҽN)'s1zh7SpSE;hqM|!~"qRj5(Ƃ7I!uc̬+M~c9~p%{eF|r%ښQ]T^soN z%OBm26~e>~7Ie\  Y^^v~T9Ä#tuY (lGI -5~f'JxFO_E[O;d{ڿiwf q sI(e18ϲ)^GR{ @90Fw)Lц&1M\9fVޓ 2pM~z֤ Adj"t #m?`C"*94u/Q'S =? h=T;l ԕNL&"FݰϻZJ qxg<<3c]o$mؐ`]%I]zƝ MO >ONMK4⾻4;¥K5|M鑋33=u DSuǰ{O 9".&@<ݓOX]^VM<ͺtkul->7L@f[}PtVLT3YJ*6#h KS!¿- ʻ8)B!N.թc˾b7# ZE-=HMW<~)!f[WQ= YE~3g.VC"oᙺӰ`hG8zU H(ydY{JYBo(X3=Ґp,dq4*vP/0+~vZV#z+(}n_gUl)1-)x{am]1XeCȟ-L` :N (Kp١nvQ7wq,q=lk|YItqms'KTK0p%ؿ idjSwB&T"Ǘz[}J|Woz|6Doa٤PTkYH R\ka_xF Os*7Q5ҧW+X&rʁ(Ӗawɑ݀nq<+ݧQjͪRr.EVk*a*+}Εu"2NuX|s7|#ILjx\klyư%ҥ{jO 56kya}AU$C+'h&[nA'\j7W_^gD5TL}< JϚvU+Ub^y[T}40}jϜKJN$%uWC3¬)c Bݭ^=:|[.D3#!0#@coj?cc\I/@j?!:J.%0=!d1WWI{_|"{X)ߥLSZasW֝鷚̓>!vlLmGt~^Vw\0-v*,_yR9߆ 7}AgXO/;^ ܓ;YcOJ=݋x+ڄYQTѺ Vح`4V/X`'~x\E\[mc$B%$~G`O%'Ю*24H/>IɢVTl]feGQ0#:_*.Tv͌T0nMVzެ$]c/GZ 8 K>ԩ ڭh6 jXݺpus+0x˼BW.P[R9jbFL%9LPbWRK$ނBXlj( KQLf$A!]V+%ChWH)Ȃ!lJjkvs8"Xfys?k.mfk%]\ӈVU|Q77}A^]o2#(FVEdpE*`Mz3D ̅~999v 8+74'3NE>.;1 jCh9Vނ8Ԛ;;<ٹ/n^oFRN*F 35|uwVVL5.¶++M6_@At7o8BXR4*`_,y͚xmv 4- 0$Jb`ɏvz^ CDQdX|'(#RE4sjH".rS,HwgfөEO =M`HQ%Cd5˶v&('HZ!z>;K`X<O+aRR{:fo]2U\:,"åQ޾ݔ}HẔII̾!Kmu(B 2/<Ħ(nVA_:0%(D̢p=aHO#Z֏+VMLWt{TWQWB ߻Kj}ۯV8a~q$fy~3ྷ@t$TdF 1roҺܜz[;R `.: bd[aėzʛdĿi0Fl'1'tJ7DdhXD (Ê^ʬ}ꍫ5d z FhFjצ>7|q =9veܖpenPO>}Љ0\Z`8|ʥ!Hn1(-gQRSַ=z 趵mIcK6_>Hچts,`$w F,I5~O$ר}fNK(pͭInBeQto!}ᛍ;0ps|#E;*U1>--arM ,=H{g: !Gj[$Űș R`23Oy  |7#8eȇ m0/fO8?&x,nGXڼ"_#cbBl皵ZW $2 :XT+ ZiC{˲a5Hm/3f3F]xofE/|#*PʐAN m4[V DK̂(ez\[3A/ )k+}7׽Ar}f"ݮAeTC( l TX~lkL3棻_'f/]+$߲^%On^4b۩a4o^d!S~=xeA)^ )6zCRij79#vE᭓DbJ8\rndFP.sډUn}[!'HFLת><_;om b/BAdН'rؘXǼ6ljBw/-ʍ z@fM [}U}l=!*nO`b.60vHg\ VB)wWdƶk9qihV3TG׫]_wU4oW>#] :нn.+K͘{'"a7 Wl97gUpMʤe.5A|c+$;<zwy~"!tTY7-maUaat,=@)R XjFvowD=6F7JT|6Qoe3Y邿Q`G4脉Vj^uj0[1b~{y {iX)|YT4o޳3;^TR)$c܊>خOLE ^_mmJΨT⪮JVo`& PP.zz%PwB&N;fA?JWRKoxt 88f ƴpu &(2 *UEkX&ĩ&U<'Œ8Rk#Ыm[Z藼Wob#,)_C Ʈ~I^?Fף b^$fs[~cF˒Jǰ>-j>|bsɩ FO;V_Jdp2Ya52rf7sT5h'ISǩT5D4'Qq>2>jfov1p\3k x kfyG> stream xڌveT/ 4CwwKwwCwwttIww!- qsYkf~OޛDIA(ao WSSca03123"RP\l8@'g_2N@c0M,*ooqX8yYx<#h 3v2v@gD Q{O' PXxx:L.@[GSc)_&-]\xm,i K 4N`l '9FD %,U{swc' LJvf@'?@UZܿ)smd/ecSS{[c;Od(J1x~ 8ۃ݌A6&`o VsOΦN gFg,~ZLh;>1\yOZlmgnbnrtJG LBC8:Ly:dM`0?n@+o#D`!&S2?}xWՕIdpp|ې1?*mgnwBOn m)؃3z̦/k[Ϳ$G0xG<®.u/{f W͕v1xx9M9Kj ,5Skq Uovfw`d *V7 x9̀g X`n&ߤ#N`LbI `XLRI{ ?A =A`;IkA` 02VMA S?tV0\@6f쬿9[)o#.l3kbNƦ@d?o? pLA`6A'&[?Y0& 83{`7Lr;7 8w?*pAnͶwXE05 [L]t%HnZ1' 6\ʿ >G۲o㟺]۹ښ>- |3 l/-p`|09OEtq+ O :ڻL WY2X|'\ gcg˿LC(grt~p.)mb=AM.cnAp1Q ث ^@ \Z]l+@qqޔ/Ī.FߝawSՕ1rOǺ=;9KLiRJZ2,_<ݚG3J*_z/> '5PsPꜤNBPt C5˟^gQ< cЙ2/.1fT$*Fs"o9g$].LKxƺY-;e?tA}̥ڿ/sQ:\K#/XLbtV:ZQ]pb6w9ꍹ{qYW6W)nw#]Oay ',B[Op^mw%8 ph?% l h`zgdu N}&3Fd7Krw{$mS-L\VUyOOŗjyL5M W⾴ $ O.@=^+IPа@[j,ǧ_g }[uz!^˄S{vV!V =LØ-SQ.3[}ϛ@xȈ 7H͇C/u3`9§a/"@n4捈(;⨩tg<"AǺ"t^Ҍ/'ĭяm뇚V&a5n>+y`̫C/*ϊ 9F13(/y κEFE^E`jݣ ~ʯYџXnº"%A?oW_]RԎ9@)N/Fx/fё8nua@QSEF]^AQf>@Ʒ^El@Ȳ\ +*1U<ԕ-AJW A.(Ns-H.%&P}`£N H٣Xri@r1G3\E&˼D,Px$ل%`(?|5Cl(ML/y@Rhz}UR܃2n AF*k5M>F#|MFx"3fWL7jHz']7D 4kfjsFw.-&z5' C;.f] q+nۢqn2#7ٚ2ه|lMzf 3z";X!hFv;fW>D'4[mRKH=쌍>:F gb!F,uiYRs*(H4'~ Ym;G(t RcCu 8دt- L SZ%nVvMǡK]r*)WJ7)Ua ;*mɢ{NqnU% g*]􂲖 Rj.P>+&[ \xiZ -tHwZC|Y!r)cOC 1xE;KCvȣvv6]6^3`{xF󕥸mG,c]fdU@haܯBSWIp#n}ukNTg/ĝƄ/ xot=O`(K#08|gRx ~-j{UI>l8v~.S6JzI O FOrm^ #ȼ/..OһHI܉H﯃a:\wjFBs)WvsO(fM/^$$\8#㟿9C}D'+c2pϲ/t(֡6_h=pנ*Q^K6;pqAI*L( K7mo`t;\ѐnن5Ntne+Ѣ\:M [.4'b7ȭj![Jq-'. Z }_ZH1|&b8E2?mY 2xW YWh~e)FB*ӮiFpYH_V۩0V#\ @H41M^0V6@Aѯ=8iXRs5?VwxѠ7Nc הmw\lsϚ w؀aD EcXoY9W[֒/MoX6/gJ6h\㗂puU _<泯ueoXWH{0$+0jt\$sO^"bMߒM侟my-= aU{4c٦VU44wq\QE?Bo/-"So1GWm <,溱UԞu2T{nJ{h۹zZdލ-;0arMƄO Wxħq$/[~/is3}tk2͍+Y֋ f 9 ޖգ|R< 62n3R95EBL{0JCs>M5(ܬT/x59zY2x^M""\C >8Qڽg{ڢjh:Uh͓^ i);N\?³ߝ:<Ɨ^$8' TKw^)hτlClQ$BÞ_k7o]'*_CTdT.xEj!I]&켅Jqe!!F?s 2'YHq}C8x8^uyEtpu"KWV叺@,"]sb~^uOf0Scϊ7cűSf|p,ߔj5e5ȀmNzW׏b<+x+!A+14C}#+ǓPp \"@RyۻBC9(.qw,!aoE=oPV^ r'DBӱ+'ZzCŖ_ #:N>jAU*bjZaYlwX} RՓÑ-gURYpKuGTfg$y+dN0rdq 6I&uZIMi0)ЋQoeKWCOdC3-*pl|PH~+KfvAW-V#tˑIe[ҩ(MYSwA+sbߖۼmK׉W7_ 08Hl|.Z6e}.7X5SrM/,I%f^6 A ށʔ嶥SLkli|j'/h ,.)$<|YdF.Olfc\r> A?#KWok+daW89 0N4^N }T~rjX$nC$G>db dJRR @v}rԊ.PJ.` HN>T,\h)>զe[+HCM8%mXnRʠ78.lͷgmw Qa¥˱Y0ӯ׳ۊ: !kps'IqJOLud18% ;QYR>S >'ky} @ZA%v-0涴U*Ţ );qDS)ƛ_'q3R^(@3-%~ǥk2׷F\.o.!0ϚDxBTd-rG 1Cg">0ҩ:joTԽpɬ(foآW{y.L5Jf-AYkC6 bQn,| 9 Jׁ Wߚ7V_|M͕UE _직~bё6/ufL|(,\ױd]l35(E;k hAߤ"МWT< B'Ql|1B )S+1^M WSIj Lv@(рlnEYظܹ,;s_tn:Ǚ+C byI˯8. gq4 ho h&yĎ%9 rbbʚP :ߥPW`MU mdm`Rgj=l0~, -0_:xtފ_F&e?i8F7B6ncf Af1އ C*_ .wUOp}M>g`wy1kȻ灺\2K_m謕qf^?i٣\4}s΢`}~)zC ٗ,P䧮%:ETh(5!׳!JCGfE!IG;$(p`"Z27_:{b7:~&G+/I4}1p qEDMN}HtTcGq?}`s2S&~^Q7դ ݙxTX ;Q~`/g|8HN xg tޡiHQ>bMD.L kVB[)62>64'(+WS`1DhH' +C8fIݑ:XqkjZ 2k qv{7in|4Hye&z0:I#>^ef*W$XOc3 fDg-at6FG8K||: m4W d푟&Ҍ񬐌ߺ|o7p7o#NCǪ]g4f8 5l8d <Ϻ*Ĥϰ㴋G^"sٜf?xMHNj-85/Y$9h6&D} Y*cϗh_1Tm`~w(NdZuF߭w۔/NZڣfn] $|*_/ԭEOi't>`z:0aW>̝_y::'Af4WTCq!`<~}v+읪lh_tqWfurf_%{?T96xW@vz+초/!э0 J3Ml"3H`u!JX[jus{EVA=7>4qv=Y!ei25iI% j)snuM6F#v{.W2'9}r=nD H$?=\{a L'yi *dJn>T-;DݦE) d1"K_AF7p*xAx2_?s3#YgF|OGdlN 4kܛ`_ӫ c?vSND2p;96"ǑKz7V"!CE;2٧]>>Z ?^=LnNgKJ[&.nw_!uŏ筲ύ)s9K-6wi~LNvDw5i]{\BG*M;32QTPy]ᵫ#E&}$xh:@v&^Sor% )1q]4ON{9.;?6t1ծ (qY]ĕ3DO1&*.1;R8FѴ6Vr(+1giGp'!*qϫUTP 0gXJ2X3N{'O+Yc: B k/D*Q1Oͼ2{I&?sT߅̘_{7hg;3`'rK({QoJ!3U -sD0G\]3P@VON^%?z \dP̗UJvL{jH6R>{u[G'yѱXVkxTJfہ [5i2ZW%hT ~p&/ H@exOIy~څ&u+/y\sXy 9jWZt 0]eɔ6˾Knpxt.!rSmg?Uj_3T9*h |]\ޙBG"n)}K[Vd nVXaV&CaJ$p#*2o#a!!lZH eȵL>F:\c۰ P3 W\o_tfTZG)D63ă|]VZvi҇T]v} 5~DQx߆+35\M;'^ oM6_!L|~{Q i3 УΖ޷9u@yɱ2'( >ךּjgqIHˌmKѓ]éJ99F&qoy9Ζ93z4T &&9_mr{ "'v>?kHF } ҚZ.9WV&w3>shi% HҨvh ZS wrNGujЯvSⅥy}_rI_s :@6o၀A@fqkە]ST$`Ҭ̅)9۽{9=M\gRTYu Y"huDW3A ]vSH-l JQB~JgV(?ݰʚ֗ v>$Le&rIJ!ɗW8_l~#?]vj*Q+fSh#惌24rH[?ԠDjhف}aat%ٰW-͇9Se#TV}~jK*vVFmh?LR2^pMn{PiQYQEYI A!&؂ۓ -C~^9E{wlѤL|fZը/ "59{,CϿ- tAף Kf"Q0)tԭ}&rPD48|CܼjYgTO` ҈Rd_>u%qRw$kmI}s(s7 F _WnG{-[Ik4nd>qM\1ʎrd=lm۸EA#E獚ˏN;d ٠h\cO0:}KKceoY_ 6q )QHF5G-Γf#i32wx23uYNgzAq bK>dMmei.sַ 34H`5Mķ9tY_X$wGMP s/)>? 0GQ dҽ-.1ZN%CW |M<a .d7GOVA:@/- b"' W *: ?# c+%O6L_M7hݿX)szTLAQ`?"ݯ@8A #?*l_*xfPm+@>Lˉ-LiP CR#N;]=j` ``I$FT.hh\FKT;|7iw414F+x, 3\f|̳FvM65'jΨn5Ew&TmèRJ7\0Лү<׏>?+7ֈNhT9=4P CL?As̬;t.>>\^Y:@B~\a[ų87ҿ2w+OU!|zly3AـopbL<F ӄC M.'gekA[F#,~Rײ8DDZfW׻žuXJuneHzr9Ã=f&s2o/ųhB~xg|"I|z,^Ϟ}#r* şFVxc.K߬\5rsd\/PdwpƶfgvZ-vnbq{*_% ,)Mnln慨Kk/{WTZ Vi٣TtKԏMP"7c_LYۨ|GǙ G*u]6ܡt/mФ\e8hYV)Jܞs@# E=Prơ{L3P!Fc@J5O rY0zT=ӵPd /rʻ Y{w3ە&9G{scJ3bs'F;9;%6s P,_;SX[nZzxjl!oAZ=mS=ݺ^hGė}M bqS$0k+OZp韏jȅ`2sa|XA卷r.p;,%}//NjI *%L I<#ujK_7Dс&f}<(54#l<ԘUv?T)"p?/̋LvakL@c gЏ Hw|I:I4FŁ[hvj( J5ZRqD IDBh @>>>QY(Okiy{Z!E-> hs_Oub?9x-:;:éwH'@,PI`~yK&БgχRd(wXzzu- =mk ]>6GY;AU%6QD*s28SR}c 30H]P|Y{i!mmj0eߊj.֜?Ʀ"F2^Yq/$l['07j`Rp<[ &lŪ giJ z^ ksBn0RfIʒK`pn\{wfdY欥m,k s )@-Fe>jQ2_"/NP1׻6PjQm}?tSl"r> =1~sB݇Hy$r |~ GR=*Fz޷X`#=\Yi+JCχ XBv{_ q9VwLt^1N5/ z"L40X1  9.(N3ZOAɘoOhĎ1;6]v}q1Ɔ:fO:k}z;(`8 :yJ\C[^~@jn&5ͱ gbcO}o,ԁpSm\qlݭtU_˨l7l3z`8AbVa˪|7j6YDŽzSW?uW[tBC]ޟHX%VA~>uo+m,{6)=3I_mƣ~:ïq5e}m<}.׏՝&?": ? }Mjg9O\N8ttɵԍH]cOc֗[_Grr\=䨙[*Eln3jW6U; %T."̪E۫;w#7Ӯ]9+UϠ{ȁ09FzI2oIH_-ODԔqvTϝZVgVӥ&Buj/Ą=@Z o Oܢ+p2wЭ4BkA|Z0#&bBYJq`\١f`;##NtPv$4\{ys"5I#҃Ay};Ko^GBǮ*]whW(]q@)Μ6UsXpC2gSN3ɊW&nh 7&M+"3A2∰4~w7X `u1:n]#.Η5}*Qsox&"Jp>˖7ffU5iE!DM1 QIloo w(/C&#N_B&IAȑ_0CbLL6to+ !T4^ڂv$={{vChFnęIQ y(ۏ{u[T DV=Ejv_z`MށRc Xl::Eq%|?1\yC'yń!{/'WmE&AFJ$% au׫9,3N,ypEq%d0尿O+^oσPb.go:$u`>b#@nZc7" 6if%iIܩqDd;}D!7"]z9;k@mt{# iB9Dٻɮo!2pinVjo¹n9xJ>;yM,Ϟ(i^rKSrWzy*Td”FD)Mpx!oEVy5*0־å ˶GmҡJyP'?58;o*Ps=m/k3 SBy#!?N p`ISى =`bgV}Wx[sw,t! Z*[[͚3~u.v`!XF81"|Kn8=V>n8m dz`)Ah.z3<")Ē#DyΞԴ1dқ v?AG6Sʯ{CZ qC4g0x2WfnD>n=3pOSuW>_lYU7 ,źK endstream endobj 529 0 obj << /Length1 1426 /Length2 6392 /Length3 0 /Length 7357 /Filter /FlateDecode >> stream xڍwTk6" %%0t 59  1%!(t*J H 4HtwzPG_ * Ddoͱ*eI%:LIX~~CRZt`iߢ<(OaxJ~Ir{8Gj$X%}34P,/F6*\ch[ʷUY/KsxD9:i9{ #1`P6Ò4w65s}~pDI {h"+FPdy6ݕ۷5!/g{P's>-P5#Q؁n 6!]0!ob ď-n)-]"0k"\1yBISv>G[ _?~xܳ64H!̭hg#\2tӔr}vf"?oɩU ;s}YB3O*5QNE[yBE.U`Qs<:Dt^U9֌fL%R;^wZgTI3XCd݄5%+i3n{ >tMÕI(HYrR8/m%*J/K";QaT [d75J;|# ccx?fF~.ýT{ &. ǶU4YF=9u0#Ҧ,lɖ|KNC9Mjy1ie+涮b/xk~3 M1-MW)`i2N5FViТEsS :>O9]`4s="!|RJۺ3xOCmtT7w1؞_ K`mU ʓg(:3e׷+(]ax9o{"vvl$pm? wꧮy]N'gM:8/%w=h/9|QQnJWkD{ޘa2d;%wNr[naR+9`Ԉ4݊mqn1) ":TH(?8 ? sRjw%Cc>̗e7YH/okt9<+IVCUpiL^IAO/rIv!Rg}dbOT0Iկ"<^~%Cnz\{7c@nq/")^ 12u'-TOL"BտqmڞSqbVZnVHh⿔ ?:AMSrJN,1fŭ:4<e8=J[+v~t'et,*">,`iԯR(oSޡ(A%n{1FcŖ6Eo` R񽗁NaWX#Ԟ @(yY1C5ŠS6NTyz~_b)>\փ3Md˂yAUa) [9ߖX ޶jD?櫾T̬~ LR!i/N?ng9uLn9D]' 9 eBQRvhUE8*}A^@Ǥ cN-J4<ߑ>G=q 쳶LYg_:rX9Ygb|w0ښJy;$^3&ƇnbTD}NRon& |'}=v 3Ny[q0-J׮9O2 +DZ}cBLln<%?;B8X4EAI -U}A<ѭ>]ݎ]1vֵv1jFEfw2ؼZMd}AimhtH[B3Fq +vdywS{ɭ{?\ڔ 6 nT'7Ə+ao[%Vo17ǎ].,<٫BkɎ}fvw ( g|] `z 2QcSmJzE[τG-Dk%f1i l^ŧ.Ǹa"Fp;0 LݗIbL{Na]XHEZrnUr0Fp!}$dUHKu,H%Cb7lw10Dc qiڬܯ!\X>f%EU2rDp9Ѥ\KfE Ĥā;5ȸ"L,jV#4.d0iinr 4峥Fu\S ~-ڐ݉~9ys^K[ѥA'j%LȀ i+wdPZ W"ߛZ1L?X xԸ|#e.e_лbբI&>yɇ^'텞 gmycC/ f1v q(I9|׿vJ@L\5$(5hMGhS**c g3e:Jܘ, FQ=5t bvMhF,s hj=4Ĉf% '4; - ?4s6~5%_73]JVSTސJrH#s{%[ɖSVWmS@5Mm*%RkD\3Bg־ӨjHޯDS%ʪۉ٫'J˙7ҟ׊?Ccbv{7`X&Ӱ}PnV.IYQt;NM2ZTfyZ^T"2>DhEGP2F6]c!UA*PFxeVOQ5N- M|S4Lqqr]bR)N_Ee mS&9n"Vixf-ϣgp-,ɹJ;]* ;iydUOkAb Iv5P^b6dRy%VW5RˈoϷh\oPϞLr8&mTkw{i:wB8wa΢.{XkRyWj4q3Ni56y9*T/.%s1W b{"ȱmGsRbm;5IKU']e˺QMfoMvE(3/aw]F6V} FV"9ߑuo48'ةXGu3SUGLY=ygZ"'Y4$9髗[Z;_7/Tr 7^öL3cHtpkSx~vsx]0 P K—! c qN(1.~ g|d:Ug=`}b>_Y0B%8o\ɻ) E͉Rsbx>L*$J5q|G^wbڠҗQhIDh-K/k>qB؄[TvmKaBO2ힻ|=sHő+%-q?XLw E~h˞*D7}[<'0 o~`ia롴t0#¾!w슸RxHM3GK1&UM'a.7hu=৹oZr{t<$- lj-谦ح_YKЛL[sݟ(E9;׊,ٲ2IMWLHл7;^v`84ޏ _M)$'FXՋ1in(~2Zs x9j; 6}b_h׏::|[0WP\otb!cTo\X4hˈg3g*sRSKOՐ~^s1>$ԃ)!>zNe~8w*޶`gI=`x@PgD{q*§)FϪvx*=Ac)54G5/fHr_JgqPu(Iaiѯ`s3:&kOUV/!}9֗SVG!ƥɌXq%J*]s)݀20ҐRfHzzi|Ah :Cs3f@)?Q ̇=Ư~*C~j+-\c__ujlX`)De ޿']ǛkK)V$"&21y)}; MfnRݏ͞9%ؘ94:pb6Yei۔mKMw2o|BgaM(C*]C\*٧?B6hȓ*Y/ZzOq w{["f}W}ʍ(^Τ Wbk-0%uL9++j[LILս%V ͯHDPnA endstream endobj 531 0 obj << /Length1 1444 /Length2 6338 /Length3 0 /Length 7320 /Filter /FlateDecode >> stream xڍwX>!CD-%RArFl0FI#!"! HHtK H;}]9<<}?8ٴh+ R@E (`a';4@`\h@1SaqH 4  K IH@a0X/ #T# pp*0H[;,nptP@ [sBp$2vX Bcl=X;.qGX Ԅ9! !]@6X9pㆲF`ZP$w?B~'p3 Dm!Pֿ0GW4.C:¬p߽Ày 71Hg+kH_epVD;9!PXW^ ۴Am~ b,B!( ¹lX Bp;_Ky9#~~qSz;6AH sG7mH8hETǹ68 `G`_p$F>eA=]me]]f;z HJ@!PBLB0䟍G (Gg?iHxƱ`10&U-AD?OnX48AjCkG`a8IȣlqÉt =H,8G$ vEdp)`p2;.W58{QemKnb@gpFx&3PBcq)@܀@4\ŀ\"@A?([[b@AoPjn Nكk/@x"14\:ؾDBG͆7% 6u5VzKb?2杢,D'k4yPutwNS4G-R)KwTZb0,#}#Ju[+BYhZcpa׾Ɠ7ƜQFc$C/T(..[`Ӛa(9[T 7˞-eN Ŗ9 4J>yҫ}.)'3m5_'/.= y[;{l8|v#@_/M~b%؜fB*%c<,4f܋_nw Iy%2E } MIVԵƪA$yVȌb^ 4O_2xeВ9D9^Ч{uVШj' 놎2%.jT1LDtI#AS<^Sʺa۹b+9Ech*-6gcj*ZZޅ3__;xܬmm` #|xQ:7gh:>}+ ؎&yF 5!A%@4O<͋b2W$Q[$w܄u}j5ߚʩ?PX|[au[,^(2Ud_[8|bE. 'zƈԝ<@pb~Os'L˃4?)$"UDj|f go sҰ ʰQR>E&=5tVlɧݓvW7٤Yp!˝&湓+ kjy;z͹ N nt زt^0$JC(0IȋOKqxRCҲ$-ػ oCPkGƦ!fq.VR3Ag l(tgx'-:n"}*U(DApNqz䠔]loʌl`eεE9љ<-t"Gt/ُ9ӯ+˄U1FZz]䷹=$ SzuW(=d_z9~w1w2Ws˴?G$b#'^R |I) ;M}~%^}eo\Ԙi#Pb gZ<]־ztaQ^kn$S.4Sclz~dNPIkpa|wNOg(!02<ܖɫ 5|{rn÷ax횅"Uru&iLSH4GZ{:$TeUZMUЮn,}7?ZѲ3 eǝy1bs:7YL/dAbӣKIpyHA*%Y}@ޛHrAR%DLHң1Wal/`R N!, VV젋XT5Xf=O4E[+^B] "+(+ΓNlܺ $qԮ(w!5*Sɱ-tQx!9+m3^F)~|QĎ?:^fUq'kW VC/sg|Ϊ>*}-c_WB]9@dh8{ٿkAD40g+c|" ߚM׻6dK'2kAN~5tZU.=;)wwW~4qaAJ{#s3&lix4vxy2]wZ< X{XlshZ7GD8d5X71L~g~ͺz⹛*N^Q-jofe˕%= n}l/]ZjJLkC,%i$;ohȣ3ϣRI#w. /Aq#g.Q>KxH2eΗtޖŻ 3wӜ\#"WG#%z%c ɨOm1[Y5T> "D  ?}'6zP}erQڥ ]DQFI!+ē2@&$ݢA\<E6M}ɖG^RjuZLk~_"Y*$*b$im?l?>S, E[~yר_9aIQ"SQu%@Un 35ֶk9=N/?D S7)0Kߌc&eY6@uH({Ds?OrV}?0bl _͡'{ɴ{@FH\I{Nk^(KUT~YsJE7N9 7S#8m!<=0Ec݊}?o}c7_c>n! ɁﳄY40@T..ɘGUzF2 *_MK } |s1xؐb@'y&!;?ĕE4w͡}ޓіu+ P^r{1p@ǁ̸L'R(^52iSqpiЙu\v_yGB| Khd)\k-pDo~ռ%2+%5N3d}|^d?߳j6sb ٷR7iJ7I!_<_!z.ֶ+Kd9I4Ѫ?Hg@d?Բy2qJ&nCߙE>СaS䏽#ilk~5|:2NRb6`u#k@OKs#"'g$ȯ9,_;~]?:a7U& R8:M(a`(4vLFQTGe1]E\E\/8Jr×FrkWd5k|rkoykǕ{3"SKj01M-:/,]IAg[&Am}h[%c)!9I+Q=/R/fL8K6{=Rx*-ۀ 26w }zK{o ?Sj#'\*yVl~mq /`W6uȮL9cE<[#ACVjEg|o^󦿖2Lm28>atWfAm׀7{zzKH2ڮ$|)PBWY~56ԞȞ te o+Ҏ!H[f^ A<}?ǐ4^i47/ H80Τ.uRoZ \9ۑ{U;+Hh{q(3C ?/#+$q߉f3$: ~JoޢD(ZZp ' ~6IGz &Ɓp{gd<*@Շѷ11Q<.zZ^'_:A}Gif)S@AxGV1~4/K}H6YCdgHl$붍l㩛,z֗H2Bd1B\Rf`:7EuH9O|e'~y_کOmTp sgD\upkp ##y2]ֶjWpKH#1ϜT-@w@F"t飴A0eɐm_x ,b| NUq:޼%15pb-۬ o tOgZ/!qkBV ̼l"tƜ}@0@STpBi[ܮiTq{Cy\/1۲.Ӛs GLXyvV^>EF2cxŃ"*WyoOBԽ5ĩiMR;,Ģ+#lUr=3>ȑpy>5jӒUs+<뻧|4̛)g0@lщy {m:\Y';\d^4  -[䴞B#ZQjiKo)lIɆ$:ì8dlh}^nͳ}f ZmusƢ`vgKlz*1s!W'$hM]A&%|D?ef&%d Tԉ$)d_Ő0_0Dk&HW>}7p(؀s[jJMZ;Ndؗą[3T-Q/Pk-;a;T艢o~?M=/HaW_ Kн19 K!?ESvnJ?2$K\^dJ//}acSd⫴ Ʒ)(&ZvS>믊2O$ t9T(ӓ4u<3")ego%F |3YޛP?%+5\H3^4+-F_-;=`W\FMow|I@ |kө#M,ƙ@z1CfIR$Jo #f- /H5KӺR%:t Ju̫mh7wX&H|QsShnQБՏ<=^͆hi#n=)`BN6Dk{]9H;]ͷp_'l>ᴛEu3tM԰f暧#M!mR/$*)8ZKרvO}τϋTUH~.~eƂ:']ˊk#؄'K8u;x57[r={vgos8 =OkOlެ HzPg>A}D8y;䑓,ŷ9DѸ{Bp؄;ƻ-7M0+oh*H%|ZχLuErI\%KGZC0ϩK_p,u:,54Ir\"աݝ:G@9du@g12$#5' :[~wrW[ɫU}1I_[57K ^pu^zɸuazO DSqge\mG˯RGX}8T$-33ݠWu!@850=VOm>T*l8L Q6x)}.a=LkHr*mCܽV_dɿEmF_OOԊgsÓ#q?D> stream xڍx4Z׶DDމN`3bF'z.z K=%:IoYkfγ<{Oag7S#!8O_Pcd!$&dg7`qBvS;K/;Bc(4QhzB"!qi! iAAD4! 4p]utB-  qpqEFWN(?ɏpw$* t)`Ee0B8AA8CF=7/_?O?޿A῝  P͏F_D @=PM:h+SuC!Pد~A puQH_=C@ss.pvUM}x!(9 Fp8ˀ@ B?$@{@+B!! B!P8?05ݡ+AygVC}FڦJJQI I bB|5_=hOpKV.ЭA'ovW;#U췝/aBa>hz]@fZWzUDw"h>!Q~Aѿp(R CQ Tn`P8D0h/A 䂞"H4 *pل@ww!+1+b( ]cNb@77w7߸8@@X kABhS!G)D:@ =I~F;[{{@ ,$*Vދ(ZWt@c6^cG#V>H9)ɒ7׈]K?ueژMxOBEl&^>JII}|$crq0[z ceq^wh9s lMpo1툑j*8Ѽ3k/YC=)8Nkmǝ0hޥ&c 5?`*BZ`L>gK`!4MFBrTrJsِT 'KǷ$m6ch~, oeTS%mOQ >]W1 ,{b#Y|s(KX ;-2z&:9ScSI*ڔ? REX ;Z{94}# viC)|FN6QiC⯒Y8?C&L^kpߊiK yw5>mu C U"("뎞oۘ=ӊe!ZzB^h0\_XZxNvuk9B=ՏP{=Zvw3]fF,g'% Әg?8mdUR[jc: dRͳRR= #V/r1x: By2\@<+QGնU[6daZzoY4nǾ~cWC;ԴLf/C \*P+vC/_*؀$St9CiniE]T*̚˖a?#Tl`!eȂ{pyl~gb;Ć\ٌl {-n˝b?H|Vu0QFiZ zaaM(v)$KT _4L` ( |?! Jrs]h8WA[ىb8:[Dtqsl(Xes#?sUKp"OkWk^*`bvA:]LqeN< y r>v~u$򊮿PDrl!4r8Y^Mk);+<޹%Oh{q~-BJ;w׏)Lq9r&QFeoH̩)B-B/\t-zU(ԧ/r-Ό ϳ b*^]cĎ]CoEi >QUR$,z2S|}XLV@9#>j>Jܰ{ͪ&@Tr@|g(THktjZYL"Dˁ{ݡ5V? ёs@ WݾԺϴM S}ao1 ~[T9tk4r8YUfvEqYNnL 89S)O(q(rYt.-_e&8Pg*=ݖ.t1Ί k4uJ_}\Qy64|O[-)_OQ+'mI8FtACsJo6~Bidj6 h#:N:9LXtB.Ib%cyT#!l+nT |Y&x^ 0qc>-FH& hy8~s$ ៍ݯ#6~rե+p؆?kɣrP@Mxa<ٵ}-*9F>]nerg$6F=oba&1{.ef 2l~J!dutS _{s3DɟjwT߶ sb0Y DNt$A!n'Gںv{S"TJLgO؎T ۨe *wrpjHD.UEs2w6*):?!e^Ymċa,J8zp=AY|EVI^{>HX#;Bg>}X8@AwϚhǻTG3j벒BdVv`3Y+m(ƥ4˗ҩЧˡ᚞ᅜ9Tȗa15O)Se\.43I8|.st=:K?ct`¯Z\5l"it.I ~Z-Bpq3f8xl8@ w8?X(Jb;P DRAn]fAMlk8r$e=6 Ss9_A:Čq~i-X$yvvu)D\b,N7zz^u'R탟$S = ^]$g2]vCوPaZ א+c)=Owc= 0$% [ . "_vq("<4%DrN<rtWDuNlI!dN '1_ SbN&.5L_Ӑg1.nFR`l M4},󑭉WzbK܉Wt+q6]^޲>ˠZ!Bb{h9.N14{p|_6JM9^[3] YU܄VPnwY`:LuxrRv? rw0i6WJ\Ӽ HqHy=oyqsUuDL 2$lS[MJc\ 0 Do 4H,jUROB.Kqay'y g#R&t$`%YQ=z/i(NT0Dݱ&.~&8Vo$ֵ5W xb0'S \f/n&KJ~I5kkر3%[o 2/S ʓ=voف&MLq7n^ݞѴA^lCoExN]fMBNF.1q74bƚU~cDTjXP'a3)9feә*g[sEDI?kiQ,a[+i|x zy M=@J0cSK{[GT,rK"?h:^μ|v{&ϯY/Vo0aYo}|(3/%ljklֹ XLk]ό둽h72f\^Gs Xp4b1{Gprepa $Y쒷YjyIkm(WtgǵF0|s@"-/'-Jv~J-_k;1aW*{x7 S:4J;|!ӏESt& “-roޤv=ջ:$ʣr zViqD$0 P/ܨwZ>&I Wv& 5w-Cs,JŤ3 !kemcJ'&MO|%N:\;{7_hr)8Ҽ5=9*snheM|Ш⻭VoxȃvaDeqTTM3*_ˢ"ƒO)?|Ju%N -5Ukjϑ x1}v,zȶ39Qd۱e$֙cm91ѻDj`G|r_F`1ѦӂsMI{ жg(oJdMJk4XF6'r^RԎR})U˛Dc(UI(:wToUcO*,Xiv'trJ\͏Ùjh{5k)eqֶ~b-Q|Dpm~ 6_D1N9uǠ]6ya+G;i|ÚlFIG̚fw6chsUAū\iuЧfp~ֹ](}hui|M& Jʊek7xQz(feD 1,B!"Kn`5F..Y3vj.mYKxB Xv@cM#;kV%{p޷s%~kX@°-&WOaӧUQW,q )K6I{[вRမ1}C8.ϡ&uDYEO\ߒO7F?_)-0륍5,j%uƪokf%J8w]tw)BE7Pq.!reYHEE ދa 2<߃0NôL_V#@aoV9B kW'X H*8RhhK2 :,$ވ/2p]%;r6 endstream endobj 535 0 obj << /Length1 2314 /Length2 19235 /Length3 0 /Length 20603 /Filter /FlateDecode >> stream xڌT[ n%kN%8w-xp~9sf&g_kuOSUjMM,f6J\YJrl66N66$jjM?r$jm  gLP wsy8cvH,J,yZ v}#Μ_1{3dj c47hA@W A'hbjvgx\@;WeS{KcAhZ\Vh-]=L7`t4*@6`9v_@r657;:x ; @EZ+/CS;𛿩)_o>sg Y f) =$A@{pmA  ˿ʰpsdr9$m&B#x9x@'5_)vXY~]L݁Wg7? sW 'h7~;gGcۄY-TAOrTa޼mmn C+`k8yΦHogo[ia8]\o5,H,7U/߈*JAV?*_*qX .Ƨ)Ao|J/UAo|ƧiAo|f[}Eo:s!G_jo 8~;OS8fd{|/[֞@X@oIoV?[[u"s: ?o$ [ao@v@?bۅGs^NolNn5.J .7spow3Vomq|?[87q|kןE:M?[\uSM^@G9O@M]H]8EζZ%gAXn:Gk.њOz4?vXK-&I,#E7].}N +fW3LN;sY24U֧𴍿YPc xy9QB:IJ:kff;\.DǏ?>O\ H'>SIF.)3EL#؍S#q &w[96vƫAZ}Q珤GAڅ$><'2|<ܴGvZ֖XIG'C}엃:#2?z#sjMQ)M5RKK}]/6D iR&fM"吂}]0@3-[$#ᆯ!P^OAvg:ijG-}'b̙BE+R#GxzND5׻_S%_)Tb3Ⱦh/%A#p@\Wp|u+,7Ūs+k$*H髥S*d1ú^E߆*C:tT{;0oBkt\r=CZ14@ !>;NK*ˢCQˀ){ݡin(o?xt=A. kwpFHs֕UŏrxS[84{Lbwg=|J[{Qj)c>-)[WFQ,KV39/9$6f)ABx[Ԁ8O{w)|XoOLd>~X QsizOD 4xE :WR<hmn4kTae`Pc$' `n795_r:5idPfe9hP S~*eU 4&.2b[{艃ciS'm qcUYSPkNLD幢(J@Ze϶?s/*^&>˔UZO98XG ·Mݏ:ucQ6aXXVW*|P5 5bmoEfQg 謁Rjk{֦AOP ۓ"![M|K35?ND#Ù23s;^EX]Bϋ!>F,`+6{O%^W–| B 87W]}Q^i~$%i t w<)u9& GAq<\v!-L} (TR~zCFc{7&ŻeoNj4-cXLiq~|=7 F,A ૝s4f`j L8J49^ԕշso c^r y]^>R5YEUlU4\jnC =:$fܻn~!rLP= xO:.;u=gx~#퉽B?D$Q# 򔹟" QЦ/F8X)!q.-KQӫS0[]) O"?lpBRc CsIUh} h0R}&[;kSPOa՞ߨDXe|[­! ;? Z!v.fh)1c_`jٖpىu-f*3ִ*QJENq.瓤s8W 3[P 9FO'Z2"9= Y h1l{{XJ$VkҌAɜ?p\]uԡrab rAčcd[G_>Thu^҆@ͦ@~:IJی_3?];Is0k(HA Sn٫FDmY4CYn^{KDhIGM륻M뺱bhXW>f_ ]Q'CԭJ}G'$ff N--1ՂB0zL`a(qQa{F :ɦuEYǨwh)v'h Bo;^ 2#_C;묾Z8{Eg)=^NA2 RBcjza/9xܬ4Xv*LwI$kl ~m$er`E= ki%B{=K[W.lK!cρgg&f׸ռe8&QPr۲Y/'5_ϔMznWm̅ήMeMLSo1Б&ױdeXi]t^u~<퍻p3 @=)oC~]jf@XA!Lh/AH#+`vDC,7aZM%AQت[U^KaQ&Gk^BڻXZE eT^i_@ᅱOV)pU?ՠWJK`>-h=uZZu"kJ44!1PkxS)ɻ0/VjʵN@W?AȞQN XF~27B݀ɝ'59š?}WYJˇ9쪙;ԋi{p3zEA.ι(Xuϛ7łM,v4>>8m,6hW}us*=AB"[ _ ^OjjN.yEI?;d~?Qnr2ѕ ڨqNc=RGV?a9.ՅDI&iÉ8T/m39ǵ~ĽŘy?Qym~JjEMv0_Tqpv ّ[O./[M^8_N/ )͇_^FcE`"W1ĎC4 A+iZ*2"SC'{pvՁp_E<{I~⍹@ِkAAH>]mkh~Mmp) Iå񳑀2V,*%=ܫk3)KH@Y7D&#cN2;oCOU 3NJdtڭض= _4/:>o˛5xt$OXH">`eX,g'ts~\vx@t+ E{F aBsJ%yr, {}б{I2EQ\*HhT,U="Huxq򂫤GA^F9n=CYw앺-dW1ʄ=+X-g\a pBٿxcB5wz`L7r'R&jN{,خ:N'ӑYIK-|ńxLBQ0f*bK+^`%Ih{V ޔyq᭧|'znUHh*AݡvkZ DIBz<1pSa݉)VNGiH+r| =v ,Wt;5n` uj$>ẙlˎg@WqG,;zE*/"Ȑ;S!iD.~0rPlpUr/o"O EaQ!m9sRK+ӧD`"WHįBW.ߧɢo]E$U-Kn2FWXLS$ %zHF3>-P7O*<'_dJcճue羸S@ 3k@r@TiǏURR\ TJ˦66pJUzE{_% $0F94_Rĕ8 Dvil+1.jZW'9YA_ɚ8^VQ7g6f+Xh>1Mr{]VPZnpk'A˯f>&O$.{2K^x킎sgS`s#"ǘ\ekMw06Q:0W/Rhfh&m 7tv099'"C]ӂyEOm 8J%˂.MW9v)~xPߪD vb+܇yxρrnҢ>㟅 ͖{KxrO _s?cv;`> Ug)oQœzvҙ$=x2sHeCcI @y_f̋kuctEi=0!_0x7 CB:MT,%ϴQem0QkqBH4{j'S |@吷Տ//%- bϴ4ikf4s{N]bdjͩ~tftiH.wW$UP8Tų9 H)I&IuYk0nADu\ϡK#Z]nIΨ? "]u1th!L7#[I%}b$1jƳ><y+RHb6B'tvw`W8cu\[6]k }zt*XQ{lOyʂ1b3uv@S\,ZRA˥p*][&Vєm)w {ÃHy֥dog[<1-{NiAiW"8 vyF.v'$${_exJgTzZ\_t9kz_7MCr*nn\ 1w+ќ,'2uw3D{q<:*@{%q/"!P\5gK6Ud'Mz`qI؛r-AA$<ְVDɖF,LPQ믓X!F6?=kiJDeH0 SAaN)iFVNqNqG.ˀPݏreY>82Dk zqKH쑊J]I NWUGMSlX][u˞-8nbU7,*s-&L:>npZu]v3Z$㇂hmj(s%#?A%')Xng+JզÞ#]o}BC슜^K0hmI|vkr)bL޻%zmSU/%IeH^ވl'V{N6$O#\r{Dp!^x!a{$1L8N[ }LG VfQ Q^,2YMikXY2oPȑ~A8T đ1rf mKLxFJ^1b׎:4K4ڎmf5q}&UE&EpSgTD+ՒنM ~Mqc03 s1XW<$V{xJh>y'Rt# d$d D3 .hO-Ǔ~)ʼnE=>5tQwrB-@oŔMM&Y$uuFt%4-O sIjUZ?^i}Cس-ϻ8I|KI֬'eN5-}#z$f8R|ShMbޮ5U]Gށ㴶GDGwٕ^y:oud0LG٣}ٚĆ n"F۱Z._NSCQ%VahMYVD32>Ͱ x|6^ONlXmɆuNs^;}df_b!H9U{C.3"p 7:Xu* $ݣj2TsnI->p(繼rgbb.8gH*z#3{Smxt7]. ?ʏs#bN]meE'1* ;1\7.8h$򐑯B6@:6$5 !!7j bɽ"{^!ZI%A%1E \pՐMy9'14Oiɤ_V'= Xt}B5Q+I2ݡ2کp^-fb:c1H*Y3Q-Έ֩s)iHBKZ[cOEhFq8ٯf>7ZI2x?hT5P54bE=k 9Zg)g:lw;ŒߜTP?9fҲ1htcyp.Q럢LtoJԉ4z*D!՘LJ D8d߃%sH.6| WOY KSФGDOe@!5%,l%<]ix`fbC! x-{Fr^WhǫH+1f"H_DZA3c1&Gg. 3re),iڙ؁s;dO Gl,#ZTY_:2S,pNUԏȳ='qTKt%ʀ2"ͲKA":Q5JѺғD-e1|%Z1Zx]GDM> @yBW-oɼvC͚Ws=nhu:38ݶ&8y֦KyWoƅ<ps8S{(-'{_\6&.߾ܚ^zXc>G~s Ӡ!ix͓97X!X 淃|fiIQ4I!rZXꔕMW6ֆ;Kyi|]F]t-/L =ʗg5u̪9wQς™ƈ#1h%?A7ߥIcH3,X{1Zza ~ ipt- 4*MsdX [$?/ɖ EWs8E-D8\#̞F ܤ,Bhj Z]t +&L]TèV. b =0LMW,λUڇ* JZ.@I<`TҼ}>Ӳw8%0dTk20%),8⡆ +1ZJ-1ޕBtuE|FVB ĄH ' 0Rw-4 *:9ȐBA,T ܟź :H}׿= n"N& nPasC&?3 lnK^Lr|p7͊ݤ _e\+c$p4,Lu=%hQϘ ?!$-[8K7L2..ne~V8;=9)jTzϯ$ʘ{,\Sю[Vw5B.7TFy_7d|tηoC1&9[)`ŵQ;NV|&DKiZV(SC-jя8t P%:^\wN;C#'~ԛK2 8f*wo5isأ$ i/G~UizOGwhSk3 Γ1}❔kSkADz&dEn*Q1٨"ҝ`DnYhy5n:\eUP@d>ܢn(BG5J pbM$ߙ!ԑ }sCN!?R3 F2Dxς(25ε=¤QZ~a,v@nDI,ۢװ $ "!Wkl+yO5]a>/aWEեWKWVB-E%@c$foi15%vjCb>;¦K*/tpzij lčgpHcLn@V֬Q G0Ģv-ޅh\Ǧ:c%kfx *Z٪k!H\@97P[(> JcEK4:U}ryG;dںNXnpjG4\]Y6]Z7o3+E:< ʹ8|fF8i2QHm(%"I͕ǙG*%ـzSaV9; oʶFCY\jϮߐaFFk"@aT0pdERuy`q~+ /%#anʲn}J.T$(y s3_>:ZJ9܇b,,gZx{{4ƮoZ[0C>9*gΏN&T31d Yf3*uy'Nrğe8/Jyl6DmK80 +%^Rj/s#Z@lPXDs51m'P֔ڡ(g/ 6SHqyB N>Х:W}ic"vҠH%5xkσ](xTa½&p^YHL"Ҧy}W)PrxѲѐkziQHƠMH= ˋϢCp'&ә|nW&LE,/d :ֶ#H:nv1 }aENYX ?wv:8 ^G!i$s>\ ?bpK;"Y5 1rɪp76 Je-r_ө&SiK{Ip*4х<%Yz┒~FJkЙ%Y˗1תٚ|bÖ9xpRFZHAR?mX(6NԢAi}5Bk? }H0B]"~ǘ<8C^S&=̠ZЁm bD/OLDd0/"ͲT&@I_t8X ?SV YO -2wׯLkMVQ9mtg*^fljnQDX14 @PL7\َGfRts鱰d$B*4afNeiO%\!Zj{,y].1{+ċ-I^ -X|o&{(tsXB<G_f~ Vȯ^Ȼ6_կ߼0xd@,mJte#VNf7W{ßMhj4ZXVY~z D\cdLTRCLp܏O +?#Ѧ4-nebR7Bb"!oc67e 4`ʆs?-eU)| i>yEm(4,X2կ5]yAOB."jai[ ,p2C9ro.1$;fw}HEl 3Z>͕wU:T VYz:(ߙ]R({BH:ާ8;9Wo4wϯ+JV>{oIXrMjn&ף\$蔳#=raUI`rzA#qa JZO)U}-CteVP/vlzܖX4иZl \qIds@K zTߪ]S FaER W@԰y}k"9-s.j 'aaXEAO @BY G9(\yT37΃UŕW"9MɢBd6[+XyC*/M=MHTL7~)Q1 ˌ#ysQ3#‰<8ݭ}Jn}$|@Ҡ11JSUUx\OHu!#O/%+m3պ.zxNJfZ|+<@ޝ jjt[F4e%Ĺd׻gPa[9H s/l%6e'iB 9ո8/Iv$|ǬX欬AZݽ%fn gAt~z(>PLw_C&j)Sa-v~սo<닍G[B]3ԇ %HˉǤ?^0K? RMСB ceAɉlLJ #lo@ cIKkz V;Z)) N|pB$No<ҷzZp7zĸM__]zؗ&](|BuOW̚9u鹺}߉p.ꑷ")5ШItnez\)7e7,cRGIca(S yj,B׻xr8`?_>-0L˩"$~1e}Byvĥx&qmvAX'sKaph/('Éu եJ@Gj4ZVi\-H䌇5԰Jl/&ΰex zv_P6juō$%~-TI$ i78m1:"kW'-Bnxx7xv4]6TT_.G-$ C銯E5_Lx_'J#J9)Vrǥu4\L03ݷÝ?KMQ#s+_| 㝠!a/̲䙈[k:gΚ/w6"6FGxf#J-P~ũN/Nwfm_>& po]?YM7^%7klvk`X2ѮlMçpa >W 1hٟ<վ9y aQXghh,ØKY7"`/W6wpC oEzе%v~^XULHp0zOkC";DebݕFF`y|ف;o 5@8 D]k[{%ڱd߹RxمO}5 :ɍ3;!ZN̿-^1RaQ"h=ʐR[zThyAFz<ύӍk`oX1mM-3F J?.޴dњ2Sp&-~,%*"l liy1"15M9/>~"3ޯC!ax4t \˸*n!VGC1;.9fQ ٜZ%%a?BkQ՚t][+2mD8_nnsEa%hФl'SIڄrB`RrӮQl3'm-Wj-ų1`yh[fFq B$e% fq17tXu'1ȈH'u,k.+tZ=>}|nI}}ӓ 8sB R Qf*Q崓^ߍ807cg9ڮJ?L+'4S4e 4:<`Pj{jTv~@LbbP08\uQ&tWY՘XǗOwbVExYB5w0M*mmiuYN'(=k-5BnAOjL;s߾*ҳFEC.Ƭ Q_Ob%x!Vz"N^7 p0kc?5waSXq͸8z7}s7? p |sDxd: x3\B+*}7{q‘ăI֎" j!=-u*[z Ɉa{Gظ\߷Է '" \iGK( J'<VX7|)ADq`em6:xf-ECID^/d^C7n8^b{:jM2.CwC@v}U6܍QæG (FED9ǩWpNtC"p͂$E!TLjo伔Ţ'6\REe^|!@Et^}bo*ˆ鐭'6!;`ՔNJE U%{:vnooؾfn4bnц(tlGf(*/Ȟ(1v@6C<6 eҤ̂ =6^BEKCۈMqNw¡rGY)q4-1߼6&wài+(23;k(ZL>xYsd |aypoZ`coWU#%b!>52*r+b)[d6WmjFݽbA8 AWZ;u K GC T~6B(HLw0AeFpbƭ1OqM[sdz\"сfgV>H E;/>ld@צ{>o(ryb-~IgaQ348 S"cR85Zjy_4{ɞ^@'fLp.>RL.8y]:>Ay\хd/Jk-(g,_l8&x\dY4B a kr(2Xzŷ!(26YNT @Mш7eJGs ʠ1!R~ R(@1A٭.j5ZJ0r 5> iϬ6 &FC*h 2wfN4tI endstream endobj 537 0 obj << /Length1 1477 /Length2 7259 /Length3 0 /Length 8255 /Filter /FlateDecode >> stream xڍt4>QۈuF-чkt2`FD-ѣG]H-D 5kgs}8Xh+$ P CuDp sĠa0#*w0DN"=+ QUꔕPpŐO銰:v/?7B{|2l(/p7gA U+ "fDA`U^ _1qF;lH 6? !|EHk, aDc_]+`*t= @++y(G_A=M=c?퓗G{|E Q!("_-YF BQ6hğn_%Z+"UD A7 WhݰW" tso/ 9하"B"p$DXk?5G$ -WYBB廚/ks.s_%5k@b+̋ꦯ,Qj J ثG? ڕ׵J_oW@ o& h7S oSD |u0̫~`z5˿vE_DXNB߄6V1xuF*ѹ+H?΍k\H*s0r-I=[D`c;Jql ZSkm5y$RzN|P/?)ۻU-@zm86:0frr-Pv̡Nd{ZHtC1.r)asY8cAwbjFh<>n ɰIeBWGUWcpH*0'Rl:^,˝&fods f(}Ï۩HK'Y׬0R[l}J(#dp˘gl4#TIR"hhgb ?rÏ[ v졳ޚ}=Z mŝ;?)ݯ4Ujp obm9Z /_ݐ}xǝgirmuݭ"Hq"=EL+nifVk=_ OOx)K#ɴ W-/X4bW}}\ڭYsy5Y 臙L4 قZE8q̸mt*d/0e`z#ZAUd\0qWvgU艃u=IUD/%T+~=6NJ8zm`JI:Ud0*"! kgL)=uKg7KnɈlrEdSz٭R(-.\%PUR^hkzFB͜Ij?eWfXJ6R6q`[s:vve%W|ܓQ*@&"Y,{Ա,5Ey82]t̫˳rU)N%첛gw>4$Mne5y} Qn$7ug2J"&KcA4됕8QϗN:{^^*AO6" KV/'o-؞3Ti ˵;IoOBɫK%N7/-z5Զ}ty^{B %W?R99,E l[Ed&dzrbh^(~]Cwnvuspq"ZP}ɾBhx4^.`@Om)ճx+gRު-?_&TUoaUCzUB0اL"\+C$tmZ'5MKFF--'wpU/pp"MַGxהU(3iIm@ҾH1F=2ǟʐOnt'WH/\Ь ǃ2^(Z'Gxǃv,ВQpgLm-oNm?:*/% OEO=l#-W.3 UamVAkM~~+FT7sYGUx%&2m^k/MG8tVI?͟6^uVoUZfꭩʪ1gиGUT q~]I/H+WɫSu6 Yov}za禸VD&-u_>8'+?ΠG3R )Tя[v"f ~TCwu3 ӵN,G۰6]RVhwFSo]5q/+.=[|Wː类_hwV UG soE_؋*/TN׹=_%$ xk#.x-Fw>4 .|泮~)!q+>㮧g?ӓ >yhpR&~{,4~⥼'z&Qni/ԌSeYy9Vg%y$2>ʐ l\7;fz1" Nؠ&ED{dFB!&kY!Zgd@c$[D;D4fM>=w ˝{o$^<.*MnoaW仑1v;g:'scYSI;cJvm%q\8ǩGl؋`|<q\+~ݵ*@DIi"G+HOnjy2"ʛRδbl nx~]TO\v+r8pSŊo]lBWxHӴlmJZ=QlqsϻÞZtbt^\w}@VVw]n`*8kDTFXwYsQ%Ec,W̹c.+ȇ ı }8dK5k,S4Ƙ-@/PEadٝ/<:Pq~]H;3i*{IkJd;c}M%1617tR`ᖳ~]Çm9^S@.Ť?g- CFhDX/ N̊:px)S?X+ !x|'1r/K"2fēSbUA˻B2IԕD^Aٰ_hѭwb畓-OT䰥Dܠ eH ket@mknQ"K$t R;^oԍ 帻PuUHܦوxMkD]V=a;)'ch>"FoTЗJ*+g~p!)ޯϷUZtb1i}20B{D >6\osݲoȯwhoJ.>grg>R*zcط)}Cb`&5T=Wu:"a %THfb= symÍǽ4uo~2RyQUTMI$R:j]BjF DˠiB,Y`٣؊ݷS}(2"T;+ّXPg&t솻h)D s?E&9VN{M޹;\&nٔ=9f؈ͨr b۬ 7~)F&#ր&ϕU۫|Izx& \ȬEI\v`T7YqȪ#;0C0fj&V&VБ˱=;d&3aZw1zR6Z}U_2~L8\N*+$[<:]КBaAbˉJEuݱ{MۮNa^Ǜ`^ WPwkRt\"uzY~{`"?[4֡] TGaQʔӴ.sdD>>|j/۰ťf]qAb<=e8ݯn#iLb*eYA D-#N#dazm2 ?\ - 䅊 ̇NpZ2;snɵt`!ٓh\]wR ۿ%^@Kix 7Y֎u,dxrCqB4wyjP/6|sFɢ(mѣ^~}[|Dw4͢|msܲfMN$8Zf~j̵i{%-WDK@_lw2]7iX`g]WVgwjadbNI2G)Gյ)Xy[~jIgGG9c\/$&BOZU6+{0"j=Oƴ)Gjŋ| 68TMF}p/G#ܛ~D.=?n>2ݸM"-Yͬ)Q'ٵ;"&7YF_ݩ,IT}j4Klh[ϳ:|gs/G'Ds! ,*նڸu[LC|E{ %DK,pZN Q>M° ,k-(I^oBAP$K銽R763N s*֠&.BA4YP}Fa/C.M&PP^ !9n)F}lΙD䗈/5㞴h*j&P9L%2%ҷmf l>)]s'oĂVZ5!QAKsu4_gVX)YDLv*qb_(92Ri@=NOJ}b!qKUdzEH!nBPB>*#JN QL\Y>qƓ"!3-2qj3,1|E甼xf3:FwAG-4#ֶY]5c{f !ͰScYnʇ_,TgiW\N:K!3sX*.F^tfGD,)A[XwΖ_4zap\h6r,C$'v/$P"u]}sHZ:kH,o\O4, ,۷:5B\NiN@%5OjzDJ[8 G?v$]E+2zFo:ZpUV;oE*aG|#viQU)5["TܻXa$ q|iŐa=‚6 O:go>㨨ddJJu>#|—-}<)2P/*e> stream xڌP\ ܝCpw`5$;w=sLruUՙ,̀Ҏn,l % v6' 5_: L4u *9:vv^66]  @D-v_9=ou=dnP2uڃ=A@71AIӓޕJ r]<R(Ia rC@@WPS8#&?k V657ww2u9X,Av@"/AS;WG) ,wi15)8s5w9ʑ/32K9XH8\O4ݛ:8z:Y,,J݉UGLBM89@gܚ/N9:9:,iA@`2w@H@`p]@^}6'Δ SʯY|>Tػ3*|b8j>Yˍ0 lmI&Re]~W?\_R1 K$5Y?>ES+k%'\eK~m5etջL oUCZ{_kJn'W ?QdL-{yG|M#8MٴӾ(HO˿;qg`fɆy*`u\ia7~3~t^e˾uwWc:7'K_6^?\ACֺnkwb0G?),@}ŗ^zp$1hu1s3AZ!@7WWWң*j`zB#(\s}}͐΍Wjb/Nk re? ONj]\l搲 \(]iYy;n3sci19"יQf9?^VH,KMaa)B .**4gφ+b,~UcI6ݣ/XdpO^u25QD_qF0 g#5X!f# 5H|KhcOqkY/E- c'(6z'Ɯ{_ oCny[ZV#ZegpC fUpW.mH!wyM7V"ܒ9~';r>gYaDNTwk@O˥o;eV=NoAd*t㨞/lZ>׋Y]; ,#}zepoV^iSjQ!U|g3>  ~^)Q[a,:>VmKoiDCvaMݻwU0Fub'?EQ}B(T/PNM">$SL4Q A gͅأAvX|49Ƙ52!hK| y@5B+#$)U S|W'6hm&P:cN(.ĴsbEdImVgVsf[cs)f!䆁BώdJڝ~Mk#~d xj@E]Iqw&KA_NtB0պm 4{fk*XU`5Mh}CX$A E=^CX[RO \^ܤ;+OQYLy[vܴffLi,O|C?e.a'I[|^RJz=0~%B[3\eXX,̈́1}p0c-J{l]rZS{o`Y䈭D2A8 U89L6ɋ6į֬{}4A,8Ĥ;y3k(kKξ,mUeؒ͸a=8uN1話0ێ}|zX$%ܢ2ɷOS_*iAD.UMGI֐^[ia~9d_kDzu.XGĽ,e̤X<2zJmm|- i:QFLn?xP~k><6?hmŽphUFɜb+>\_ 2Cu#[nec"7gl Q8ů\Gdh^zMQbWHž0N*(noiއ2+F;X~gC: L}'7cNS1}SIP|AӋ>{߻EH?<jRO褄P-G;m7JYdO.ɿg`8"ωօ0Ujz~SPw2U*F9lAaIC#K)Iz=(aba  5=)۴drvȦs7C:l>]TYI0؆5}12 CBJ(Ǎ{I{!DW&K1 !fjzgX&[ mU@S89T] x1%Mdo8~l oj)^&My+ UEpy+ؐwkx Jeos -@~ȟ=/hṪ7 "l He掬n< #d2jՇgD`gT[*S }CHT6Y6BG C+̴g`<9էAryT#~D5_SqE?,8+˓5DO_f>HԿiVI" $\qTZJHۄպkn4owi{. ,=[NaZ(X}I4${Qu3!V{StZ.ԙ_u=*rmӬ F0>.^(D]dK_{s+i || ڎ̚JmU! ?ܗMmגho~WE5TJRqZ/QrL#אI S.+}yu)gTk\6euVJ,ah h'wČhxnq8Qa{nϣYb[@1gVQ)A\#׻xܒ(q}4=8m~ztBgdGEw#x-TwBM/ Q{2P(#>eï,g1kl"NS-HUGrn7@>t)7Ddƈv O.Z*kE pi{!U7X3: ?)Ϟ kr\ZIbWcS:!+dꞿ8{:Aj z{\yd6:e7`fzD|u@^-%݉E1E3_)p;¦.\_E ~YtWyqc7@pq%-1 ^]tH^fj sdjՓ?}hPތߏ4}FC'  UA{,9! BհBπ[쏫Qa1_= e`_ֱrSf^A/Qqm맂 Utv,OͰlF#*<܍ʡ69K{Y7.-.ha:DFm.2⎲ 0̸̒muTΤH/ٻ c^wyi~Jƨ!K(Ha^ߦnx2}k e /ijֆ?F[O=Χ-F0M@=twX2 i,#` įA@2u)d܇ K%1?K <f~{XO,G.׭6:XWlr3 !Awm_jE(w?B@XD+v!U$?tٌqǼvN4# 8zHz{K`&IX³ȊN e"@6pӘXAsg#Iu#Ô:d/sX7&Bo UZ+7|c]qv,ߐoHq#=ZBE&Vt^*9JAX:KAyia T@1 ĈHڽ^#ۊ_Ġ8U#׌1*.qo*$C|aaGW ;fsv:BRuqܖ}Plz\724h֢3:!Eg1# ZiGBǔ9 ,")uPBscȏ Foəة>q+|Wc~]L;`?ɔ h6gǀd&`?N=L%#k\Jɖ[qq'qE~9˂p~ᅧ妣H|􂚌m+QC()>eHeV'rtŃ8"趟D Jv+TDt &{&u X|䂣,_z{je))9*d:j:y.Z\r&-%v&8}DۅTXr[2_3-iXDo5ۄ,~I.UDSgAn: lZ+8g`|yj{yvVIa rf$s#LЕ~^v|,Q.zK^ܦ,ĒI9ISB"AP}̃m HPBi٧:ߟof{}kYxf"mdx;~S0EY[sXLR1P; inAx} :&LD+Փz*@0aP@h{4x+MYzd"aZ }SF?2d&R׫F?+$$D6^#Ȣ:|^5l,ܓzd3O 3Sp¼?@Y77u1WFǵ휖ʅ1-9b>~Þ&ZQ{Bme[76%8Udb3Kdo% ]*a m/qݍ }v4rymL6g [}jG FFJRC-سP|noW)]9уw ŞgF;zm_gg'8"|]E.1v$դ Z ,:?_ '<ߣ218L>3Wv`a><(+*3D!ڗG*}3ǨyL޶B+ כUvq^jw\um͕fO^+wuTUwMúRBx\/;4{+t$<^6AcV]3fȭMMLހ,'Y @xK-}dHJEUuvHOC2|a:ua W̿34N=L!HQ BOV2Y<':"FtxH%s|0c~my6}I/?U)gFELa8}RTu)u9|p ]S|Yt͓r?4A QTK-*jz>O"+X{y .K1cڬV5o;yM;Sy, +ǘp˃5R~-(dvꫭZ]@Eȫ~;yʸ%kkT }:}7%~pu\psy\XYy-ߓ5*RݛghZ}^H{]b#+a Өgj#o/H58: kRB4*q%zJɯ*{g*إ$-_{w{0Ι?e=ߢIJn*2::Q\%ijn &MdS:ihR~)DZCp ^P%~^G`0T%)U1N.eʪ nGW;^h&|0pj`*5$e>b'ﲧ*?Kߐ!v1PzOk@fYL *abK3'y)&ԙbr0Ҙ&Ժ@/{3jۑ9pc6/f^1|>~|c\&*p(:N%Ɇ؊40_q54(>B{~Кԗ#SK7*R /Fm2`Z| ^̿h3byȎ| l$k0QY Uwi;}r Ƶ*~."<`:V8ӭr&M$p~HJRx\1T-\w~/qvN#/ ۱50VءNYl3_?Bi Y(§ԊiayY>X_❟os1ma]\PWKNuco]kń"xSB [E00ڼqKvN.7?M&~̵25]jXv* Oó?0W>ϻ6(4tBލAkL+'vHP20 T/R Zța3a+bٟcq #-m-f1zu/s a} $r1rBWh:('cpժ9hTɊ0M.0pqv(qbƵ*9GsGuņ1D;;۩nQA;5u{q)yrWXTp~xvRdA uD`ԧj#arr^^/=2NҢ @vu $vi|>Dl_c !1򽵣iK8+LKjQN;- n$O$}?C% taD ~_`’.~JOxhD;ܰ{'Hx6?zrM,r„ :/Y t1a|_|Bx=e% Jvg^*҉}{LKYv0"m[kka`bUr"7'Q榊+si -XjT6CO^a~[U>gqQ>'4oHr/ So۬s7?F6JɷPC!ns9dA#V4TcVcXQ*<ª?Ʒ7ʈu*LnL 1}6\巀ZQ^?úZsWi+IaW .qrJ@x1@$Vg.%oט/u[NW5'oqo?FҶX~[j<9e~RP<8|*lRE0&lաhz1>qh{UHjL{.#ҿo,ݝNs[U]?TNsD}p;Kxb_vU!ڝMhm׃(xq}keW .RhސV:| b=ْȺ57"{a9,)!>A Z軄Q_t5*[7;s"!Bțs%U3Rי{M|DV2T}";lǙV͑\cZށދ}VfeTS7]br簸6Ȍ]9ՖnL;D>':8Ѣr>ΉBy"wh4Aq.8V.%Ȟ;j#tX L #8oÖ+zueck%3}rhxSPPm z-hJC$gWJG0 ZZĘM=K.8U*Ƨ aPDŽk-}DNp'Az90u4]ԳiܡxwT7+1iۉ u%66>c BdxxvH]@L΅5Svc>_rFƥ;`ҭ/,Zp(seSclk]]sƣp,96#տB>:}^BNšf3*0a@݌;'*QhA{ zE.tXyjJw~A]TZ(4e0%/׏`)7Dq E}𱅰]񻫋NM^#E~̇G^C7à9/:6-Rcx\a)XxMP JѡxcrkmPM^UTTURwZ2?\S,%u2O>fj^*c{Ѱ{,"y^?C!'":(7xyI-0 $q (k(:cᗠZ>S 9j]p7)"L0o /s-?CDL[Ա$ X)xT6MW(q9brA{IwaYH_y{t K:uE>+//oč zΆ B_<b[8Xx'))]: xjTL ZlֹM8KOƁWD='S:@pN(U6Clm82BArȅt 7\1 dK~ Bo2)v?(hA[&!bѮ&ALbxls*j+z>Yp{qϐ[i'.0;,gbp.ۉ#zs Mq~ T6 lf*#3K'P/15ꎷT Y02$>{L+iVukHS}˘; TkPgmu 3g0?p9}7>gM}AUYd99gJ&4eW DVMpZ[M>Xz! >W-썋+-8?';[mu>?a>]ɯ JLHOf)׫!;CʪK• ]Wj}HiwP^$>5wD%߼r0HO{iA^z!{ Z(y3P f"g`Yrn^n%[|rO]'Ǣ&1WJ)!o[<"+T~:2*7YJ䏊KțVp|oxm{Po|0wZ [?3՘%lYOa5 d7\]qޠ7xjVI4HaQgjgH1V7c>g>\ޯʹ3$_Q=MG|#8ršAp8?* ~~gM=0 pWwI16VʫqW<'cSȜ0_7=~Hm``*Z\a̕9c0W.?{@v7|(%2fd$wK\ǵ`b4H 9O.o0jm\rbFê 1V9n{I7`?"X2|hʸ&f /{1]f\'ϝ0H*e8cㄫFEq58"R.rr7bּ,Sl!BٖeB50ߎtZOp6G+3>k92J م#[:a-kc_hȊ2Yx60aGvȀ0- (T,]\U^j+ &q ei|&4jfc+f?u\5dw]T:38"sImDV7͏)}LO'0.0FÅ Cc-_߱]&*H t#^Ѣ< /1XaY,ͫhJyʦtfLϫUG^ "f ~ۮn5}5nm+7΃(&0:~\y+G9\Z`!"HnMq#?M!WL 2Eɥ=*'QZ2E?S_?/b (\7i]yKJ~n^XGzjtmPMX8uno$vhd`Ub ^GUJ$ԿR$YaSK8j鿏8޿}9 ]NҐ;<[Ʃ ga7c%{}RFM3  L@R6KT^feAt1cьPT}v55 <%pJF /#"ojgWJtތy+pL"0TDTBNF08(kiWjRXhq0U{~G%K8ݢRw.>9с&Gx;sx!J_(G;z)`aț~bxP~}z??kЙaÏ^LUF]'n, XyGӢ_EK. Q7aA+z2 թ]B%{)t8?Qn觑ǃƢ#v]bqSť\ړDG|0JzR7c3RID ۮc>#7ɣ{u3\4'cۊVЫo@O:7ǖ-8ۮ ~ע0ܣ^ҽuEUw4ۍҠ3/ ^\zmnF5"ˆ5ס4@\Ӛ1ϫ5!3?D0nYFf@s42v_ lY['jdxGC^ [mj<6#kO2fe24³՘1ހXj?]1A 5LC=/i O ٽkP>Ѝ[[t` Q4 )m\'h &5mP'Q7jV@%΢hx}Ay,KqٛMn m \fiT7]HBt0K ロeקzeFn>&@Ue4WZdYhB3WWjysPrq) l)Tgz"˲ xxqkH AۭL%׍1He|mX-Zu%\mC̛:KW78ɴK\GI;I %! {5މQQADުvqCA< X c[PG@/` E wwd@Mž֗'J*TPt\UNFi'F|esz7ukSrjyxR"kmCNq2'c%3-^VA ?b$QUķ V"= 񔎍A84|r ,_~U|eCuŤ hs(ao7.]ݣ~BٰLJ z:q "",Oce"zɊMPҌO.a>K6iDjCXk}̽v 3 -Kʣ:(}~a|댕&\#Ĵ[.q]ع .jUN9B]iUOC02'1҆"![huAo3\6 I0&m.98<XTȒvfsY&@$_Xqpu ABs(9OQɎxj,u=_m8m=oڦ0aT!X/mk :9c6|j)O/9Hu KNv04W)g|>\=*r°#fE==92q\o &Y~mƸפrˮVSjM|K=?>19c!zg˜VQ3OV'vz ht_Djd4TJW{d6z#<,vQAJi2X?c„=VI.핞d-H |PåS,/p_?NHyh>хAlxb:/' 2ٱ:?'m fj- ,[ԨUkOzam,6MXbk_;+AEז0B4/k>ъ+tEӬҪi)m#j V7|u&m閒te VR{PeֲM ?.:S],y1&S_ G׏-1b%I>X#+4ۘ3U-$F\_i-7BO D-M,z]i,F۱ۜdUPb%=Q/jXۇ :jˏѯ`h@*06 kH]QD}͌=`^EݷxAV"K+WG 3 ,"j 3e}'sG+R,&q,wRw+eAzWh7!qT]BO ):׈'eEf$O+>p1-쵢ڊ*<__ >v0|Ej\16~n?_Rq6㇖$>(u|:0ޞ.+֥;f FKƉT,{f<5EHa廁u2@A,ݢryi~ĕml$w9ƛ6.q+1h+m7WgВP^3/IlQJɥFh{գD6;IrL_\g?/]S)8R[[Zxɏ5(MOy-ZI!S? LV{EJ2=3 `d18 M \Dg>^֞ǒ"%Ggc+zaPgJ$ ^H  ºLB4*m#حGIls޿혭)/*\om$sTGεG,znH0p6]^QGti8ZqZ T3> x!"ћ#$6l@FưT =)dWRwYLj8mMc*q]2>k{9u`wڟ a~oV!I]\2r&Uc ll(DԾ9i W!L؝kr:X-)Vrc2p*Ļy5;T>լTgjqSeO槔L6,xn;6@'Y}c$ya \$s- IPqgV+@w,xDrK w݊UAE~ppl+CI~YWY^$-^;Atl攳mf= 5?V[ZP N tlQ%lR/2^U ?޾e1,|D28A@̲/ YEA,]Iңqs[\oM*)6I+u3wNV|r7Tq&C`$Ͻ}tpax-w*?8| !*oVB3XYDdksDrװM1RH`tB/N^%֫Q`X"{4xHiLffn#)}$ u3lZņ)Q}LXs'EĆ\mĊX:_PEkx{Ƕ_j?6qsk7^rd Z4ǔD͕C[?UlQy.h< =St S2Ni3CȹZL9dKmiܦowuǧAL9,Nd=@W&:Zñ37q`ڇrl _ȋavrS*m2Rۛa8Z|*OYl $Lb&F?ASyJ n"Tcp,bm-վ/i} lorH2-ؼ,gWˏGiO]:†;AvtAiYyV{h?8|A u '"Mv8#v:4W[ja߲NPoMGFmm5XWB JɯIlwVy:m}xG獮=Y@F?مV#`5d5ϵ魢DV`V0aDR6,mZD8Af`7ꦱ" ц`W@KuXαS> stream xڍP[-@pw'w%k ;  Npw.9|oս5U3{ջ$SRe17JہYXbjjv&6$JJ5R Wj7d]lV.>Vn> ;č]Afy&R da ~=hLi "@'@l }=jo =+%dldd[T@'W`-oeLH5KvU{sj_.vf@'U9`t'E665u0YA6@03hll7v5U1@RD`*yΦN 33Di^,ag&fok ;#O4}m7kmgf0ٙanrtʈjBc,,,<#nj;/_W>^W@9;}o 0&@ ҟf@]c~xx ~%5e$V; `p|;1"X0eڤg5hKuf?#b<Qwۈ$]llrmA6 u_j^Yy{eƯk bga6%A@3%۬{l@v@%{gg ^:k'Jؙڛ/6N.qrX_ : 06̢7Y0KqW`V^yA<1$^,WIQԚ| -Ă]wީ5s!ݏV@g[=AoOE^$a AWh-{3oU=wz]jqrqk۲}k)   Y+dֆC) T&MpgS&-/P]K5-g(ؕRL-zqf|}iO>MBw$Q,S2_lzV̈́dj1suQ[ȏ}x>ѫ m= dؼƼ蔷on2:ɶjT` {liXе4{qϋ*C;;eAwj)h fM-Ҫ)e+o`Ĵ:ϝw‚/ _'I{IU;E΁- LWhT̘?,ZoWIx2tL:nS0s5dj4)0eiuÓoulצ4ɞI==qi[!Uξw+}b$nCmXeSU0:^:\_]V.3kF8ȼ'o,"x?bD, & @4DnZH] {p9 &|y^bRx)PNi3m7FnS{oD9[^wExZDCYK;?Rlq jds+;R9i#`}e\ +'ߡUᗢtay̲ϑyoۯ'GBXi,I4Qta29rAfbt8vLV6Bs0u6wŏula=Rʅs#b+$5\/D.+\{1Υ~PۡC%>7_Я[„lRiϓwyb+ l"kIRFגQҠAa}-*#w/ND]9^Q\>@&q#*y!a"O؝ɛ䤯Cڗ8JD4p=M /}XdF@^wE/&4L>=-ȋ\u^==~Պ4K Iİ4T&myg OÁ/pݬd5v'N𣴿b,$nLU̒- Zv/ %1]t|s=,hC\r F7}_i2~_5S"-%ѐ yTYwVm>U[W󕕣#ˑ,͐Π Fd:Y=`$!?yAپxeC.+ioXeF@188V_Nƥ{Wjd+w<mM)dmWQ#-eLH–Q35wYZqR-g`Ku{h%xy)J :]t \3+B=N6k7 'iFᥚd3ЪY7pMIKo9ݞ5%ԍ"$I&oCo8 <[ b{MdfJ}t f N_F~\DvcgQǛkb-{I.8c3D 3-nz%Q㼂?<-ǘPT'4-v zc kJtWVFGԨhjەP-z zziY9Ђ jN%'qR[(0 '1;pmvwvO >mPΠ7zEy`%t6//]KC9ܿQs{fbQ1A7:[2sr*}@q2ڛ?H9a8Ag[|ۘwg fY~{&)m'NҘE"N~7dCA>Τ'+DAO+u{I != U4SZk?0U_;B?imAFtQZNhX,ks\3jpMAA,1Ui1wIuEev)/STyP^d+0f?pWi*D]BX>%,nU2?:nw1.bc~i mvCv0UjL)l {omM6\-'_K (aO x&S5.PzA11divWlcb p]'}f8=mΙJ*kfG\vOHBJs$2<,|]jߒȔ4^w8BTw~-LJ F`h<ތ #4AwEE)H=ds/ xr8WPz".CfW.&Q/imU -bu_㠪TyG/0߸_5œ%C%ʰ+WuY?ĖBݨA|DjkulAb" xJK=vL,oaL٧k^kÄi`L$YguOTe_tƚhCC@1&TΛ A؇5-"'&چD!w\prIv4_đ;&ILID*J8 3՛M==r0۩Cy]hW1ʫ և%, Gd~=8*U4ҤX,H~k7y?B#q{r0~F`>1CwNV玪]E6ux:n1&SxY L~$Gh o]RMnUO*xάݢI_ b(l/<CIWa"eKDŘT"mWNj@Ј<-+Ѓۭ[c0.Z;㧷?Y]sW0% fN8B#4Q#Mgg˓nGE6ʤ_pҪV`j-*D2CE*:m=z" Y8gG9736,nI/H~ޭ* 9ygCTOiRdB-@HY1۱;hP5J jYj4fcTmu'_/URAptg%}iOZ<[丘G\``*K~@aL0{j!;sPHXMjoCVnxi'] xݐ%jZm%B`):=_k f%3`g~bB%|HMXUG?|pZT]DR0d&N]l]4 ޻ֲj `l#&")ځɵF6۶ţYFly bvl6EBD1mZVN SzŲқQ+};+kKJD J!fw{MjbNv"VondQ闆=@|\Of]\27ShLdTZY,1ʉ~m#~Ę Nr $qזJ[K *x;w[΋g Ty`H#JF"+BEwz8H{E㛹kRjDtc |_SRx5u3"qkbn)"G,FfdF1k J.1'eacudHPv ]t5a#rŰV%KDy)/ğs4,~qm"Eڞ;~Xx7KQzG-1&Id]$q+Ex؇zhJ_/P=knI:4ƌ~=;S18vv&ᚱMr%+.\Y#|`GRH~0/q7fR aT_7lt{bOY׈|bT6@%n,'ƚLDM:E\o|OG/sVB܇([fQ &,sn /B4l+!-oNh& w-& q fF[hͬ :s|Ivv*zh',O˲PaXSf:sR9CFEBj^k-K~[ʱƼ]@U|G.>y* ˤ`i46VIf"$X'#WƦ y;6vZHB6PL/~1v.&ƿ@bD"ݯG UYBDB.S\ 3o$;\I1gEFߔqEK'슸`K6)6Ŀ]*8 (sXU*$|kw7F@neLBz\ri$WmqA w“ŽR.M+`8IgZ\Vϋ.jX[]K/ٻҞ.]ͫ5BěD>WLfld`N0:-mn$^fl2}";K{^H񽜦 zFX,wXv?[zT0XU!4eg{sj\{'9DQTВ5ߗ.bZz=Kc8nLצ`0n)(+h/HԼ73"ѫ LuQ A3tGU굞X+#Fִ攀K(Cr0Ң(r-u{uūC83$Nm_7]8$FV$ Hm:ex+*|78ZN._!MG|m&Mz;o!=Іn!S_'ޘFWzݩ@=קL5t $OqKCL|t2[Uzb]q$^|h^.|h,boFp=cʰU& Bv| nCw@^3؟ Jq) ='[cRA2PaM>\*k"6"hZqb6l2m|d !`;]UT/P&ڪyGیS6A L#\GL?';г6; ,2]eƂ-o.%u+/3T%M$0Zy$%BswTk߉Sp;<^n"ke\d] W {0OJGS@|#7WdfYl$qDyvX'L;6; lP ])Y2쭯-v?ɲg :+gTxwQqu=عZCO_n:KL ѽh+*UiRjH.*KC,t撁0cM=(iRjk+Y; K6,[CُU5r7aZ$skf˞l$iA)ژ]0jG ܭß̟{i\EB\wf}83u@x8mc}k'Hj֬R%.wIh4'TSy! ɴ;T5AO*ϋ=Cm$z,(u<V /3!z;K4.5],x wwZ%B{Ƹ[ i݀|deR9tlcpЯSAH:wҲ #eJ|A;v9Qʥ=mFqriLXV =IJg%37$eꟆ+r^F /~y4}M>^ -ڷ<]vsm`.tQDzBK7-0du g}84إ;xmC缶Qz.a Zk@aiT| uTȂUB*u M%UP\( S׌<iVF/'ʝ>Q&*ƿwLz "Fx'D[Ԕ~ch鑸S`%+#Ob#I)5 g7D"R|v[u 06+c}V?bxp0^ynWc2mZ2k;-&tk/^c+ZnH hQ y7F`劉K6$/l{ /Q/qү|bbRUj@wl3_1zK=&羸t:d}$wMߥF~,jP%mPX+=^LW19v RSV\jEK쨻\F}vs[I8iVJ,wr w+5*6SJTKveJ$h^VU;:=2^@k=%)lp]@;̜|n@"oRI ;mR1~0̴/0EEoT[qbÑϵy+?C]>y0UIv 1:-X&;CGpE3"]']q=Wo*7BN)rf#y$S5Y&zcR [.b4 ms2K ֍ї=(KutݦT`1[hJђׇg>lUd%L\zМ<`_RÈ#ʆhh2(&sz:++X!اTX&>FsZGW=~73R *emr,(~{$F^ U8\SB79xU0ͷLh=8Y!^?vw$`|:XOoQ`|yf ?B/>xaA}ޢ޳/ u9]R g}=7GR#1B=bsi? Iye'WrϰKĴ~eZH=z:=NQWY7J8א۝8}4C.5ۻЬ0`/ƾm|#YF]-0=6/Ipޕ[pquN$TqѮ"oNNQSmYz *ꖉ>x[pZϥdAX=?$`xE?#M[\tZK &|[bXr R%ʓq,ޘT˵(rʱ<y2E[jT^vW"{T+qX8Ϙ ZY/9{6K#"p RW]}Aܨ=Znl (K+&c gˤ!.gs14]č|a [YWyӷ^^n9 V ij '|>`オ %$od4& E \\S8 FǠdƄO3 AiۓQDESǬxᮓx] pɅ($ Bvoޜ'N7[iNnDdqȬBٰ`$2j~`$aM`Pe\>my+-$ZчD"+y9_3O7KQ٭}"|}wac󀲉i(wFC'&\ī4WpY"tZ y"rytsO] }K%I>֜z9 u5"EQCͥȳe_Xj}`[j㈒O C3 ^ZNypCg{;7@!<(XO3chzK%*Wkȹوb þ /#Ǿ <4ô6;`xX٘m/$Zc[ he,(tNohTWI'ԁ? GH&l9Y~UX5QpUZNC]ά\֢^<(n}u$糨0o=a< ܖ%S(j :Nd2!CϨ/OQV``Cc("jNJ$89[1ϳ CHfK! C)Mżau?[&D5XKp5]uɇKSiT Da5)҅nѥ%K *$wY@ "F ⽒)7fgҏ ൕ7:Z/rHx/.޸ѳ<12~y}P &c(f1E~Y\U35+:C̄=;/wʇrj4Zw.p i܊{^bL]ml]vkЕ!hpKm%UcyfPꆽ7r[) o؄y83η :V ُKu|@&_v i9W^t/ꕱLHϐr#/b )[Rb5_kEjk&Ŵqk#鑾[/fF.={X䂗!vwB RJW̪7Iqө]}s/pCnuSn? tFIE]ӭh ;g,YCc8~aƆ  ?Cm.\k8^` uЎ>ϋ$OO ׊t^/wB'CU^CHN uV`OtQRʓ ,s>'!OLHkCHt%}[#5~CU%:Z] 嶶溂gCڙS'܈|ĈF22ceo7cAg}21n; m[]d\|~Mct'I)?S_j9۠E~Yy~WqLyXh-19{U*)9~P  IJo(E%ir5 dq𓧑tg*'s4Ԛ5w%jX)c :'FI>ğ3 Q0:>Yj)%3:M%ph1di6Up}I]dUVͭ3m+WsF.֌x?خXw2"QSt,1[f@U{Tqݔe|hW\nGCT]`>eQlʩEڕO<+FX7I,5`#kϥ*i{sZoUIb≠&_1 ?Pti /ƨ/zk$Bω=qv.oY~&ER> TZ[gWc  v//h=2F6IcϹT_ c%{TFsr[HЏtܢZ(.)O(C?|g endstream endobj 437 0 obj << /Type /ObjStm /N 100 /First 909 /Length 4992 /Filter /FlateDecode >> stream x\yoǒ_b,<}_ $;S8@K#1E*$}Uup(2))< S]]W355JRFpk**|eLj)beV.o}RTzUEGC$!R!a '+ec@#iqv"&eXǹJD0aNhQtAVF S--֡hޢch(TJ#:DK# )hS$*a 44$Cܨ)E0r8wub[$xg#Id{skp鴄[s'ʾr`-IAnYH+ [A]XcXDDZIVͰ44:%Tu2[H_Ҟ:@U &bIH 9 hP2Jz PVAR&l9 dJXI #aU)*`160jX#AXXCc#E;fxIi)<fv^*h 2$Y22ݻ[biSfKܛx>8-&gӃf{5kNbŐ-b.3?W,oJ7l*PGl4z2PXݽ[JAY<:*}YSn<ݤrCS+vr:9k;J7_UrZrֺ ҒTJ[!Y*9][2-ȚJƮiAvق/VIeݾTMd]W*^_IElzQh lKU)W[\_𺂷kLǖ;0-36SfAcq7 =1}i u5ywB(6X#nUWIp07ustIB |y wQ%F׈%F:Q%G2FB70Хt(lKH@ȫ}ه 'ZZݞQb hDFX[dvZÏ# Ab( H$2HӚ:!ǔ?DtٮS~8c81v׻KVx:8'gͰr}zMLuDaT +EJ:s~475WOmBiͫR%KRK` 2dpASydZTN !`_0uX\Y&ϓiTx2΃@7X. yM]IcI ٶ0F/Z郞HgAifU Trrڳ l<m;;;t;Z>L?7ã{`»!+1 }mCbjxhܪTe8: RiPr!SB ΀gc5$vƺGM_+݇]]6svvz:ɀkHPNNh ~p8XPJuv,I^GϞhUiq~__qrx~sm&WC.އ)^ч+.hi-P;۵`QQYփEmX ֡b q=Ҡk᰽[tʲLBEz2Dc9X:KYG?<LX Fj]Z[T _Pin~$"OY0$dN(+z!mq待snҒbt[#sKk`$8\/1!AKxl =qz [D' IdjI,0R-!ne/\N K<~]:Bܒ LIZH;0MkX-2@lmK-Q_8ɇD&V f<2f-#( ӱ&zh CGE6HaG2L?7k(px&цg) $ /96n5;[ 6@y#X%$y$r.yn3H^C:(mY %l7i6e#)7y$Nc.?#+CА 2#ųhF"d|73Y͋ӷY]N*zԏ7UU$jUN9w\/Ko;Gw圖꽿jsS:y1reULثj#Hpȯ@WW\W NjQey}\6c?ӓauڂ0y$X_ f#imF0C _zre+k!MHh_}y#3[wWݍh\P\VƊv =I̲T?IpԋȻ1]?W}%+,+Z\R ,D:U%NO;" wY(_].=뉀m=NGQ[.%sR\1b&( B,an#6Ǚnp~*6۠Ȋv+ŐŁ:P} Er2V쎊B-*mEzE/gșu M҂$-X 43I*.B M5[GOg0Y tJ%Sm`ye}+Zmfݔ>L@G:WHEAg:nY7YV-&:&37h K+B[< 8nM Cph&9w9*̂pmq}{;Bc#SscTD3G@Y&7GBFm[>?hS9?6A]0Sf+bl_9``Jz @w֫+}:SCԼ,åBnn} մN_}Prؓ57ph?&ەF b[^o_@,/-EƠTN'[&'ɷiˢ#1%}cR0engGjq2qޛrzxL4o|>8w޳_ăxV A}[:!{g)Ұ-qopӛ-Aг;>FÃ񨩀~oޜįe'p|Lb[{'P<O3+V q 8H ?7hr6b(>8c1q#NT\?NF̿Lę,o?f AgؓW~9 L!oC`2}G`!,xb/Fi95'G,ďӏxqB=mɡ;k>ï&-L'OWYW٨NFO傳2Vaw 7,X%ZkSj>x?[ɺхuiwͬz=΍s~fV[:/Vn;혀[i}5MǏRtfe0f(˫/cل1y$oז[!g}ټfXfh#/^?$VCeh}+;i3%Fދ'SqIy;L0e6c귇)LV;LٕL=mIwEH oz%8ڻ鍼g_z 1=_P3=zTjItIRk}.t ܣK7.fpzpvAD5$sh`*>L9K,χh.2tiŅ0HyB㳓Z>Z5#W/ ngC?L%\$ͯ3+֮:V$#]?77 endstream endobj 543 0 obj << /Length1 1191 /Length2 1548 /Length3 0 /Length 2365 /Filter /FlateDecode >> stream xuT \LWnGM){?QJS*FR%\EfJy*)E8%oSR)P\Dgǹ_oO u[$p,32y bAr{P̠ 3)Jw|,!ȞiXbQ@HQSS# ._|EL3`%)<RIR,-VEKau (AiB# "r\P!!Fp16&B/ټ2!<^LL'f0$II̎Q0Vv0ID)!բPZ6J)jf(.g푬jzT)dA@O!D15fi ,RBQ(NQ0jMbeS)AN+ $BkUasIPu:,LRKhPG"2(VIO[$bʯX5[̧Hw\ʊa;dFi!@$(#HcG8i!_ ՍIH o@pɷ j e}Ӡp1!Q+g`'Gg.AՑN0l jv<G}ԅ$j'!|6@v`%k3-B`)^H5?4:gqwv3 {Hإ|X5K DiEg&f쩩\`boh&EVT g6Xx҄ӕ.Z^^"ޯ駫x0]ג񉮬9EkܵzYGE~גKi40.8pݕ[1z-珺iKʉ^\)]`qNMi{Wz]k$$]ΐvn45u;'W7\z;|UZߊ2c_{Uj~1Q]~?87m"fb|[)91c)ŧ,/CyV@xՒC,U6Ijz{kInL\sRzᩆvD(^l:U<@oN$ko2-l<7joܟW}kHw@sQ]= 흩0t+{" }c/W-p.ѮkC)Mj_8s G:|Ԛ{PZqD1WW^ Tt$^kW,ʲLߚe"cwܖ~?;$?xy]˸ON+V;|R^wGa˶ϔ/.0c{tAE T~qM3팻Ů!Oߦ&*Jmܯ:w3&ic!]IyEh:ˇs7R6KSvұ!~H̎-MCx`]Gˍ\])KmZO=>Nwundԑސ7.OI,UݸoᝓK=69qE!'/H pq"r|x?ɻ^Ҳ .PzpJ|j ev EBWV 8UQ̵mfg] ]yBX=5Xb~^1:W{7sv?e}̞ YXhWwg~p=^:N YS(%;WJ0[% >pؕI6XuŊN2-3,&VX=GȰXTΣ> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 548 0 obj << /Length1 725 /Length2 16161 /Length3 0 /Length 16663 /Filter /FlateDecode >> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> stream xڭweTݒ5;[ 58]]k}ܹ̯G:vծ:k5 )裃 + @K]Ghk 4;(;of$)g`@fNN @li``bb?=o7!`K{ۇd񿾨\@ - ',QȀA@[- 6C@ g?3{s_AX߰$ 2]yr1Av`,.o=pql]"fp[ݛ L1s;޲~.V@rCon[_%{y \ 9h | +lo/g%a՝ /m=wr@@Ho9\r[9{ ?殎n_3Fh`o 0Y );Tf@O5/KVho @#cߢv`[)#u@ ?ȹZ!ao&;+?`G\bfھo9lzVX8ͧi6Cƿ8uV8=oes]u27i{3Eho6`im;V?:2CZ^p0 NHs`3XT_!Pf\Z?!9gGqwϖ+tCCГFǴf\v}> V]{wsLMݸt-,6 :6oxp}1SV,"7⫋uG7{xv4Z*_-`6BF 54bڹE3{Ȧϼl3Is&0w^R1;,׽xY{TGq *yĈF$"t'q{^a*(tmROq[lIֿ4kh[AN]֌n^vhiNf#qV5O1D~4M)՝5TYBpV8`zKR __ {Đ[ێ:ٻWo RղuWeF.[ lЭZe}@h^EEeap4ܘ?XS~R~}ȴ D S{셰w$/m9Z'8qJ|R(tk;"k]Ľ-pSјjjsQ"lOǤh霐E̍!tKdbL?[c[1Ҧ- SUdtnاzN %(9 1䚨3%%#]?s*I5IYG_Qʵ?WX6-oW& QQR)[VubC˄lJI1gxͷd*eFrNCWИ!WJq'B\L'>>`I{Qon$dD)i*J #apI3Seoۡ U@f,%lAQ t;ՙz_tHL9{:MJVp]qŴƇ]qzb|(Uz漧Mz+,P([{FVkǢpBɸ|!槏~fP<ׂB]$砙~e ӭ5udmW̍z񉨇DF\F8 ^ LVf9ۡgCYCxwO@4/*'YiC^nKQ!+5dC@˶ :ba&^*RqgBrh) ơa F*k]fDq_0"i Ž!3lnS,%aw(㷆)H@:olb3-Z$1kOK6#w7ceM!fͬG#n1ͭyWYizFQ+|7֗bV"NvmR-0c }bDpR$HP]P5q2mX[&IOd+]-?>)_Hr){3cm'BgF@^s(L$-x='2+Yz~úC/ZLY;J>(.Vw-G& aƩn+A+y7e:Gn_;)$)e7ޯl%@H kV-LLgl%8C5xx=OZY+$#7av?Ւ[ *BSAZ1Iㅤd0[$SBvUZ:!%;~e:jgPxf2S}߷#.Es rEv?=z#Vo1yGӨOB3,NCsO[!^+옻L]j RF]e'MeF,4O9r?`6uh)3 f}_撜CzU&0C3;~jMfo|ѡ.H䉂e+u y=0ۃ'|VئSX) `D}j1?Cn}#zd0`' iK0+-S-ZP[xsDGWn3;glU4_q%: @ /K mgЂ0N) _H(\'ѪZS&ɫ2L4zy`AA/La/`ee}[C>7Cփ*&l|afn>۽ԎjC)j3>՝yq0-^"bE"VE %a Cwr^{ZtYr@h0BGF)i=UZ/ J@>>%&*5ia0kVm}MhѷؒMQAV FV) &TfZ W< at@M8xrg<#,ŕ<)~7N=|>kOeǨMTKR!ew8Z΁AS]O*N{bR\zJ#n5B(:{n_i|M4jDQQ]i$"ƎYbO%'0ʫ4 # bP_[>Lo<94Bz'һ( <\E@Uj$b]!@j8>mJ3VIOt/h|AMHVwąy174xM'd$ >,_|}HD4.d/Ykͩ U.#{E% =÷VD,Uշ}þ|9S.z;_k<) %2e R4vpx 8S*Oa rt4QJSԖN>вO ^ӱ$#{ ̓g&@UPz4 `$HRȰ,R'#$Aqt}9mNo/>-Dq|c#Iz@~i70[H#~ snx/Ç(J#F hRϰm|9'Tw+*[m;I'pMGzYG4RWN;a}\m%[(9;o 3|jUz}BjmhR{>`ŏO`5O4ɒ[*oy>^ l8. dQ{}m(+|13=!Z\E Eg;AKYp q#R(W4%$\TcaZn_a4=Lt9 6DL•x#-2jC>@9@ϻ\УޝMLXTxttaMOIJPJ7F|a%SX܍^BʤGb%)h"ydh4VI3A>fIt`dl*x8_:Mt+V=0H-3`ād]BB Qz<3Is}TFCe۟:W*~f2!QA86 f 3ŃJ&} k>aHnd'4WCr+G:Km8"$O5`kG|MkY?L~Cyܩ1=SOͷ\76ӖwYaYA"O! )fsz[uwI8g!̄C?.ΐK>X&f~!]@QSj ,j/2 J#Q<|} OȤ*mQrgaFYģxKtYl O؎<5ݣR&^AR'>IgV+3pgLեXk"Sօ{Lm샋 s'sUi"$Ĥq1{Ug=4Uc>uW^'<.x.;u|6u60\c }P?" VD(wGSt$qOnlP{Y}W$h, DoKRƘIiVzgP)@[uu*Yˆ2ޞ^R3G菇֕ψcg+nZl?LAE?-fUxuyb?Y'#8'h;ts#+a"ߝ2TdD J}u۸?#-߻Jm,atda(Z꘴oc\<ږ*eDv8-qւ_7n^7q ,6;ZEez8N3vufJxer7;}":=6m4 t{*R'9 #1`5="iz]ف2.m5@uxW2IWi2O-~r89lCw3E8咪uc8ZhQ,:c5ku8*`2 TA| _Vf`& *41^R|rWֆ;R[0=UY.aXߒMDg3G/.|0/@'ѣ'Iɳ |Q-0M"PRU[ݘ^ yE2+p~E 5cQx黥s˽R^CXAhK~~a뷌 sdP{T'vf4cR(G_%,yw# 2wςX@:X.r̟U!W֖}&H̝/=~u?:%)TLאk3nGr-_{YSwZJ{'_ d '*=7qtF =Ma!II 韶UġL}W$8\Ecs?:` x~ن G۽Dap M\g&Sv(ztn>QɸkGntEyz{<r9c[\™SV&JibTo@ozS3g\bܱEV];1jQy}+9X6&xrFU?wBDMJح ix_zz.M!'lyS6kbmUj#X3"7FnۯZ ׌=|F|Ss,LG\;vef6X͸jV02l`.QL']ƪ[y]f |灚I,~4Q ̈́HN$:#Opaցgܛ'BFd.X>0dkڬy:6հdҶagGQkة"8$+M:Rm4-zvOz ‐HrBnV#lV#N佂'h/&dJK>[9TJ^]Y\u~s$g?t"ɆNq3U'Gl6|3S*2Gr|=B-P ScJɥ~'zkp}HFX?YP%ӪAw廂2 |I6"<[#9wJJ%1'hS}C$aO˞㟒k0vLCfb"eFXtaZԜxܤ0dRޚA5fЍq?o88@ŪA$ 1{u<2ѮʊƤ\eH4p ݁QpVée׋e7 ĞFL٢Dw WB;Pe%YGmSh)GE]aef?b69֣Ni|,+FjKn'Mn $-6 6#7S5C8AQv.RFV11QMSky vמCR "dCzL9,71I>q, 8ݜu=?>y_!f"`ҙg0tDkظm/Q/ @\4,NA[Y\rU2 3Um((L&26uDžGsV_"v2ܮ}༠Vdv6Ps ;GLOAOa&ھVE=pWk JAb0O)SO?HTbY~QӊXaފ /wpvY TbjKCV %{DFzU>`iy*K]V"kI drAS9 NT?t\(I3 ^Vcl N1cβ -*M&íQ5qݍS6NV:U ?/ C<&%7A5rѧfZ#^5#CtEYuR0v\Z"%Z!c>ǒi_V7MLY\.Lg cȒCP^SnHcqbsZtE \& d&gKƻ 6ppZ:Ϟg+ONCSɉwkNNHCf#UIK`qKq\< lH]gjX2>:;otTvrg=a }R ylӵm~itjD-sl<W/::%$欨!*Oc|`Sl7JB~Z9dXAvP}|?Bdq7RRBj.`w21U?Sv5FVfbgC U>V⟕0 M> &IcE:Rrt2]YţDSPpj&r"Z80jjW ?R6G y8~C*4Άzm>؛'K!^cˆ̴P/m45UvqV[W-dӫfgϼ<4耢1$3twByWYϡ;Ezh_ܾ)D"Uf;ǓkmEt<קh7sMe.JƩ[jڨ)FW1-PS\[U™ƥٝ(OS‚M,T ^3K77QZHv } rTDr@uVTWZ.|ٟ dynwepmFݎ]/ͺ/n_T@*AhװY#qc)s& "Ԭ,34M0&ٯKOĬWR7ȳ!U1Z ܰzv!@D?%mSo`Ekx'Yީ^!E]6od8o.ju ՠ9CI*Y:cLؔ䥮Ў1N2 =`q<튗 Dlg.RM\=GMR_ӹᚷ2N/9leNY(1I5H9%9|_~:W5]HbtFa)4zJrd=VIm/"Dw6zr?d SxL+gw?p-*[E9qbX_n~d V9iVtmk?A1菃y0:.iD⾧&+` ?.J s"&ϰ;YG0k091ż)ޗ0ȺCoO> 18+qI4U'CKO[F*dZkhSNfe<eGCX.J:s$3"\0|skd> stream xڭxUT\і- pw %hQPH$K.-@p w_q8{͵撹8쒖0  % -!0vEW=̏NO/ B`P+XȀA:=@ q0=s0`O9b 0<a`38P ڀV{0@Z]PQM$ CMhYC@ u3`, 5g.IA  vv< .kg y0 wS Ggس3Lsqu9C]Y5dQ On3 Y={Z@nZ=<@ p 8=s?9:CZ63livqyy3 O=FzG W:7sNsnkVQZ\[9s;ӟ=\X9`)L39D?DywFoS˹۫c*? _܁{.=R lftwPgE؅8aA<W hZ,c]PM?0Yۿnw0 BDl&'Vus#:Wdڼ*6/~lu|XWbo'glKfe[dhd4Jp4VKoceHS4bه=ˇ XI،[ "{w!v꒱G_oO r:kZ z W.uy]iW]$~'oeY/5ZBbT@,s؜̵AHkbl~3(9'B"L[2+6Ȁx]0_wEipтHpn|.%&HBzVWYb]G&>Uiwv'E< O|L47q?Jpyi>Ȯ@IM5;E6̀`8}f\- '^QWāN <Ԯ' 8*cQ:knL/cV!x> Z$hBT5uuð;/6\66eJ'msɺrBc[^EbAS_DgrZSB76U;oKC)Q yqjC_qj^_AEX#UFQ q9wڧ4#TsHmnPbȣX^~%zт`)D]}NU p(I=ԯX5BmS7)xPu7/п.cpwqm$w'Ço1`hs / xicF\_W uSh#+)UzⶰTLe[PPAdqmia/s:T`%C" XVvI&d h!&.xj,q<olz\'8Sn6rj)$x2k4:?5픤(kuP X)(dqm˽=m۟B5Դ(u:NHVu;bkٛ޴GyKS t'tԥרlj#V&=#frdƦj%[?Iw ^k;&iO z ~9Buփ67Uͻ!?H XOS,8sMt|h.}uv*v'XT5݀R6F8S@1kY&9iykKҕLwE} e[1ط LGuYngJyeA Qhhj ҡ_[ы{pл WGJ^EF&G1NC8al7rzP2,,5x7]XV8l>T lu?hEBAۗZ{E!Hf3.ɢ':QJﱙf8#PWlSj2 ƫ+ jrsE7NtQ.N{ZrJ40kK  |>Msw{7Ծc{wkGGyU+$)D-sz#^Ikr<2pO̷B%y=V UjS`[!^QS`*pA}.T% ޸GH;=yH!!{EՠƋ*߷bΪ]y oJ~Fg^U5~x6'{Wŭ|4h!.گI6@ -1D6Ɠr|uF-|;1 1_+*KgquΑP.N@GhQ[ŋX1MښU:"Щ OwLt8/)Uwn/a)эw$JJRoܜJ5jI7 E2Z"u sn5FC>C@8._UaPJۂeϬ)(^% N_ ־ 5TvTAFyL&LjݎI!;J,pp3 5PLIh?< .nݨ aVh1>jM(夳@:EPM4xj~E:mOxP!سG7sGdI/Γ&_6&toD=l1;Gi.Ӧ kCGs@1\Z5 -˜9FWh"կ&Yq{j#ˣb%6k $]ȹ#¾qtCJmRIj0yuVmO>f{ ^6x}="b7 ƿҚ8RAu}Kr!Ch5@˓@ H,|D :9,|s{?/}_1X( O 7F 1k"M 1Dppa=,D#CPOd 4Ɗqԯsl7nKZ'ؽK @fÑkhJx C1qm?|.m)/gzj8ek};Z1:c5=cklV#ovyL]C_$)lI甩ۗw * $+門\Te1dІZr[nC_EٗTZ֬1y$i=c]hN׼yy*q}F6trV m 0.Z(|՞ߤHjخ':Vv4)e"@і?\fVM%w,IFl)GPX 봕X-ށ>j UR9PTHIfIn8[9!G}{-YnKsGYZ[(Lȟ@F٨bzAn:{6ѠN<7GYp{L 4Ԫ6_72Y"6m `k1|qםR9F-m rv'Z.Gs%{L 6xaz4cqSXsWڥobwiMGtzn>/'=Y)8}ʈ9=UJJu4pKI6wysvayӐgt왍c*ʨ"͞@7Y//ӔÁ(z򰮬W*%D #j>q<%e({\ݤkCޞ;x£Ɣ/krP1j@~xo2DlU E?ݗ:Q3_5hvnW] Y]>68"B_Qb $I8669#.ytb+v]p[~7gs( 5?=jq&nqTbcC-BLG,R IcxE]3c_[[v# <.g ^r%Yǹyo7<țye)$Rҭ>U+n8Nkݠl|uGa]-KAfeEeHX^04#jJ˴܇| ~NǼny鹊NEj`% D5UJCԧ.eL%ڣ":z3!ĀͰ:QL-B2o,7\He'tAMБ11pvSeػ<9 j4@ڝ$jYٽXҡvfMI%z!Wԡb`TǹfԖUHǰQȆ|  ya c>ݸ 1c\O+sj]y E4\Ž{1`ņ$Dȝ-{|{ګ6"k~AV[KM "}!e! b+upz*zU8o$"j2%=^.8ʹ͝ J-9 wi`V+(u9ihRi=<06&jYUQ.@FNy֐aذYힶneM&!`ؓaӽf(2!xW^}6ħ"vwPyc-ToH:fZW Qةw*abh][ˑ$="[x?JV6x3QYkpHvYySv5jֻۮj0>dFW2ܲF>F_$Es#|. 㑂VlNIe`2tnPlw2kQ`orr_uD}rQ1򫲐;wˉv,_ZŐ}QFP+ fk5{j7[ OƓ2 eLRYg^_(j5QV$2ahQ8>ԫ ߳ ٻ^ET q\v2-fO@{GDe $ZklQvLƯ-#h,qddۯנnڵ#WTP^2ڛmj6bԓmL)L֬I r/zocQ3.p/7%ӭCXT @ v#(V%c}=nv׸$I8z 8j9sM=o0^Mg v Waj5<^7ڙ} `¢$ 6e/D1_pDfQh(9YUB6<&< &B?u^h&QTGW xDž|R)r)M"2E84I4J!nUu0s{p\fxPS H( 7_4p}[P\Oކ̅?PI]V:[xӪ1qH`Cbƣ;yפ>`,Vy'씚g/1:lV̅3&tÖ3# CR3&fJ> U*܇^ ×فxsPZA8(LLyC33ÄC!fV\i}|HXˢnԓNddw 9Ԍw|˅~C}TlKK i!vj휧/sz,c(S]?SwDkeEdU  ۺSO)T~I$dVx{Uk'gnMqHm7k ?t"]id[/q4׆m~7K4)5"~9kqEs֯/I3tZGze)>96`Ƴ2fvPe=o,ZH9GyxvAdƌd cs 4ٗՏFȢt>Ҫj>n=ryf rq*!MUd7WZ?m YiGjϦ*zXV!GmM#F܇ګLus߮:y}fCh{ T5~1e S(rI Ij#\"ںf&BGl9IyP5P9jMz玉pK.a[ҕ%.qUZgSQu"pF2P#$>' kHr.aYFZxv`:"}iO1MRmW"ɭkbj.!#)J~ru0wYN }ψeC].dߩLSw9RSy]6\zPkp_ Y}Jfr_dX.D۽}i-ưqIv #avcPSnfҭ6i[Ţt%$s hwSOEE,L8C:$A>5MWr\,]?f+crݱ UoׂgzqV@ k~|GUZj,YwI& 6)lmsoʄ}HHUj'CYV a*|)u{%P(Ozgfw:ͅTKK.4| Sq8Up~P /> endobj 545 0 obj << /Type /ObjStm /N 97 /First 849 /Length 3153 /Filter /FlateDecode >> stream xڵZr8}W1ޔ_rKb'd'LAiG'_$H$ĪݪKn}Nn4:JJBpf9Q-| $˜D:E0iRZHpK`60.p%VhM8 ~ @T.Z`H8V CNsj5 q"8!`D AaH9!Ð#"DR" n!$Ԉ9)00HAHTg$Ţ6*WlĄ&J0A8 jpA И3Ħ&[dr 8SJ`9M4!V`*ĢJuLZ@hID 4.Fˑyق,Nuu! '_+`!> [0OSh LfPG-3@dW sN) /1hB,RƄX(T&RA:g5 xH`A@ ꠒ@[HTB22SPLNFb z5è$3(Tᶀ՘+F)IUYyɛ뗓|?f"˩qDp5el}pp.o儎GIv}7Jfyz*`|n~giN^$*'4RLGKO˷/gGsKC]/x[ g7A-!v< G&)Z}}\Ҽ~N,ofN!FPL@ϴ_bc%od|_/iv7ߒ%A9,gci*>hVjXw7)Yd~͓bnr&7:MV>M$z]':M,H>OU[$fH=(xkj'B4۶C T*xA2NQrLY9Nn%yh1_dPC@cysE!JY )lb1JZ[dgG4h.%EY d#AN>\cM[ɿ&+IG`㉘S6c-כGټo H|8}[><]x)[2Wχ?;0xW_gK@-KC#8.է1&?}(>>ŻW7z,'+o?}規{gUC~cDN\5O8{bul XS\{ߝ_~0>DjNkN 1ys0}f1x+:AtZG藝 elvHᯢ ;;4O.=z]7;|7;*#/N w;x^{[>ݡnvy ZY6n'* K"„xsb*.]nbIn+w7s9vez{*V҄M >]Ɋ4~s< /,?k;>"X(Wv,sF*ZFa=FyfɪK?CnÐޗf1?7p ]&?ti+[4-Zg %:q'89ȶ)EٰaH0N+Uj,ꔑHd+CaUD윚-QbHѢZu-úVuݜr_`<4v6Gi$m#|tCtͭI!cց;Rn_vcTshҘG.1B΃AC 5d!Cs<پx-g|A싓,<'#==bx=vv Y `YIΖw˼$˸;57@jht#/W*4f#5,,N <¹q³tnƫy.2^gA5HonEɞCc.SD {8߻e!U )/㺬'LXLe#q84S{\e-mH-չ2AvYXŜw96ͼQbLKŨMhAir,-E5to+U-\ oCqoth"F:NKՓ8ԅ$8ýBK{C9@J i 2 QY[:a,EmL -E\/gy GSp0 Z$v0XL4,ƢD]^Ҹ8[4pWo-`jx#DL@p:>i%Gm]w(@:FEǨh <22214E9CAA64B97CF96A2CE29B1BE971>] /Length 1410 /Filter /FlateDecode >> stream x%kheyt9sst{7:;7:QiI2JO}MA%D)E"R""ˏ~]sEE\]#\T!2yD1 h' VЎBA[vt-(D+D;JZJHK@)Z%Z/i(G[&ЪzH+zFn* i lD@;L TD" jzn[2hIkA2m>Z'ihDGO :H[v5hHwhh@+Z m/nm3Zm.MZIhgtK=!Qza΢izhShIU\QU>4yT9w$sGFk$1،9W"g48# FY0&w$&ٻȬWN@(\f͕]8 x<%s(е^ jP#Y&@ Pij55  ujXZ- M7L2SJq]BHU-t5mj-!tJ9ԙ;j-ix<4{96瀑 X/ɰܥ<Gvs/+:ͽ4L2VVyʭl E-`8 1kHph`̀1 s``0`:MZXYs#%6`ꀩaׯ`L49(Z~SI{M 2҉B>5ҍԬ* leTuҬsYmz+KV[Ɔ-ƕjҒݠl-M@Sh0{Eg=fIx0*.@<Q(oGy5<2x1?8ǏXmm(kC]F-ziEg-1~?hbل =SѤŮU+ۊ-vYE3O]P4kYYⴢyqNтo # Tests of lsmeans for lm and mlm objects > > require(lsmeans) Loading required package: lsmeans Loading required package: estimability > > # ---------- multivariate --------------------------------- > > MOats.lm <- lm (yield ~ Block + Variety, data = MOats) > MOats.rg <- ref.grid (MOats.lm, + mult.levs = list(nitro = c(0,.2,.4,.6))) > lsmeans(MOats.rg, ~ nitro | Variety) Variety = Golden Rain: nitro lsmean SE df lower.CL upper.CL 0.0 80.00000 5.540591 10 67.65479 92.34521 0.2 98.50000 6.602048 10 83.78972 113.21028 0.4 114.66667 8.695358 10 95.29220 134.04113 0.6 124.83333 7.303221 10 108.56074 141.10592 Variety = Marvellous: nitro lsmean SE df lower.CL upper.CL 0.0 86.66667 5.540591 10 74.32146 99.01187 0.2 108.50000 6.602048 10 93.78972 123.21028 0.4 117.16667 8.695358 10 97.79220 136.54113 0.6 126.83333 7.303221 10 110.56074 143.10592 Variety = Victory: nitro lsmean SE df lower.CL upper.CL 0.0 71.50000 5.540591 10 59.15479 83.84521 0.2 89.66667 6.602048 10 74.95639 104.37695 0.4 110.83333 8.695358 10 91.45887 130.20780 0.6 118.50000 7.303221 10 102.22741 134.77259 Results are averaged over the levels of: Block Confidence level used: 0.95 > > # Try putting missing values whenever Yield is "Marvellous" > # plus another one for good measure > mo = MOats > mo$yield[mo$Variety == "Marvellous", 3] <- NA > mo$yield[2,4] <- NA > mo.lm <- lm (yield ~ Block + Variety, data = mo) > lsmeans(mo.lm, "Variety") Variety lsmean SE df lower.CL upper.CL Golden Rain 107.825 3.658594 4 97.66711 117.9829 Victory 97.625 3.092077 4 89.04002 106.2100 Results are averaged over the levels of: Block, rep.meas Confidence level used: 0.95 > > # Same as above, but use na.exclude > ## In R 3.0.2, this will return NAs for the SEs and test stats > ## Reported as Bug 15693 - should be fixed in later versions > mo.excl.lm <- lm (yield ~ Block + Variety, data = mo, na.action = na.exclude) > lsmeans(mo.excl.lm, "Variety") Variety lsmean SE df lower.CL upper.CL Golden Rain 107.825 3.658594 4 97.66711 117.9829 Victory 97.625 3.092077 4 89.04002 106.2100 Results are averaged over the levels of: Block, rep.meas Confidence level used: 0.95 > > > # ------------ univariate ------------- > # make an unbalanced, collinear, dataset with covariates > set.seed(19841776) > warp <- warpbreaks[-c(1,2,3,5,8,13,21,34), ] > warp$x1 <- rnorm(nrow(warp), 17, 3) > warp$x2 <- warp$x1^3 / 1007 > warp.lm <- lm(breaks ~ poly(x1,3) + x2 + wool*tension, data=warp) > # Note: This model is not full-rank > ( warp.lsm <- lsmeans(warp.lm, "tension", by = "wool") ) wool = A: tension lsmean SE df asymp.LCL asymp.UCL L NA NA NA NA NA M NA NA NA NA NA H NA NA NA NA NA wool = B: tension lsmean SE df asymp.LCL asymp.UCL L NA NA NA NA NA M NA NA NA NA NA H NA NA NA NA NA Confidence level used: 0.95 > # (Nothing is estimable) > > # However, contrasts ARE estimable: > (warp.pairs <- pairs(warp.lsm)) wool = A: contrast estimate SE df t.ratio p.value L - M 24.5835929 6.065419 37 4.053 0.0007 L - H 24.7443633 6.179264 37 4.004 0.0008 M - H 0.1607705 4.959344 37 0.032 0.9994 wool = B: contrast estimate SE df t.ratio p.value L - M -1.5953197 4.805899 37 -0.332 0.9412 L - H 8.2584640 4.920788 37 1.678 0.2269 M - H 9.8537837 4.687418 37 2.102 0.1032 P value adjustment: tukey method for comparing a family of 3 estimates > > #switcheroo of by variables: > (tmp = pairs(warp.lsm, by = "tension")) tension = L: contrast estimate SE df t.ratio p.value A - B 20.604585 6.155409 37 3.347 0.0019 tension = M: contrast estimate SE df t.ratio p.value A - B -5.574328 4.907136 37 -1.136 0.2633 tension = H: contrast estimate SE df t.ratio p.value A - B 4.118686 5.000739 37 0.824 0.4154 > > # compare these contrasts > pairs(tmp, by = "contrast") contrast = A - B: contrast1 estimate SE df t.ratio p.value L - M 26.178913 7.679004 37 3.409 0.0044 L - H 16.485899 7.867834 37 2.095 0.1046 M - H -9.693013 6.867934 37 -1.411 0.3456 P value adjustment: tukey method for comparing a family of 3 estimates > > # Joint tests > test(warp.pairs, joint = TRUE) # all 6 but reduces to 4 Note: Rows are linearly dependent - df are reduced accordingly F df1 df2 p.value A 9.7089 2 37 0.0004 B 2.4711 2 37 0.0983 > > test(warp.pairs, joint = TRUE, rows = 1:3) # just wool A Note: Rows are linearly dependent - df are reduced accordingly F df1 df2 p.value sel.rows 9.7089 2 37 4e-04 > > test(warp.pairs, joint = TRUE, rows = 2:3) # just wool A but not lin dep F df1 df2 p.value sel.rows 9.7089 2 37 4e-04 > # should be identical result > > test(warp.pairs, joint = TRUE, rows = 4:5) # just wool B F df1 df2 p.value sel.rows 2.4711 2 37 0.0983 > > > # Test different ways of accessing data > ## ... using "with" ... > warp.lm2 <- with(warp, lm(breaks ~ x1 + x2 + wool*tension)) > lsmeans(warp.lm2, ~ tension) NOTE: Results may be misleading due to involvement in interactions tension lsmean SE df lower.CL upper.CL L 38.01851 3.027239 38 31.89018 44.14684 M 26.51562 2.358621 38 21.74084 31.29040 H 21.50623 2.379736 38 16.68871 26.32376 Results are averaged over the levels of: wool Confidence level used: 0.95 > > ## ... using "attach" ... > attach(warp) > warp.lm3 <- lm(breaks ~ x1 + x2 + wool*tension) > lsmeans(warp.lm3, "tension") NOTE: Results may be misleading due to involvement in interactions tension lsmean SE df lower.CL upper.CL L 38.01851 3.027239 38 31.89018 44.14684 M 26.51562 2.358621 38 21.74084 31.29040 H 21.50623 2.379736 38 16.68871 26.32376 Results are averaged over the levels of: wool Confidence level used: 0.95 > > detach("warp") > # won't work if detached > try(lsmeans(warp.lm3, "tension")) Error in eval(expr, envir, enclos) : object 'x1' not found Error in ref.grid(object = structure(list(coefficients = structure(c(39.9798298407202, : Perhaps a 'data' or 'params' argument is needed > > # However, we're OK again if we use 'data' > lsmeans(warp.lm3, "tension", data = warp) NOTE: Results may be misleading due to involvement in interactions tension lsmean SE df lower.CL upper.CL L 38.01851 3.027239 38 31.89018 44.14684 M 26.51562 2.358621 38 21.74084 31.29040 H 21.50623 2.379736 38 16.68871 26.32376 Results are averaged over the levels of: wool Confidence level used: 0.95 > > > # --- aovlist objects ---- > # dataset borrowed from pbkrtest > beets <- data.frame ( + harvest = factor(rep(rep(c("h1","h2"), each=5) , 3)), + block = factor(rep(rep(c("blk1","blk2","blk3"), each=5), 2)), + sow = factor(letters[c(3,4,5,2,1,3,2,4,5,1,5,2,3,4,1, + 2,1,5,4,3,4,1,3,2,5,1,4,3,2,5)]), + yield = c(128,118,95,131,136.5,136.5,150,140,99.5,156, + 99,128,126,120.5,137.5,147,153.5,100,139,141, + 115.5,135,130,134,91.5,155,140.5,142,151,102) ) > # Use true contrasts for coding... > old.opt <- options(contrasts = c("contr.helmert","contr.poly")) > beets.aov <- aov(yield ~ harvest*sow + Error(block/harvest), data=beets) > lsmeans(beets.aov, eff ~ sow | harvest) $lsmeans harvest = h1: sow lsmean SE df lower.CL upper.CL a 136.33333 1.313393 18.89 133.58327 139.08340 b 131.00000 1.313393 18.89 128.24993 133.75007 c 128.00000 1.313393 18.89 125.24993 130.75007 d 118.00000 1.313393 18.89 115.24993 120.75007 e 95.16667 1.313393 18.89 92.41660 97.91673 harvest = h2: sow lsmean SE df lower.CL upper.CL a 154.83333 1.313393 18.89 152.08327 157.58340 b 149.33333 1.313393 18.89 146.58327 152.08340 c 139.83333 1.313393 18.89 137.08327 142.58340 d 139.83333 1.313393 18.89 137.08327 142.58340 e 100.50000 1.313393 18.89 97.74993 103.25007 Confidence level used: 0.95 $contrasts harvest = h1: contrast estimate SE df t.ratio p.value a effect 14.633333 1.220428 16 11.990 <.0001 b effect 9.300000 1.220428 16 7.620 <.0001 c effect 6.300000 1.220428 16 5.162 0.0001 d effect -3.700000 1.220428 16 -3.032 0.0079 e effect -26.533333 1.220428 16 -21.741 <.0001 harvest = h2: contrast estimate SE df t.ratio p.value a effect 17.966667 1.220428 16 14.722 <.0001 b effect 12.466667 1.220428 16 10.215 <.0001 c effect 2.966667 1.220428 16 2.431 0.0272 d effect 2.966667 1.220428 16 2.431 0.0272 e effect -36.366667 1.220428 16 -29.798 <.0001 P value adjustment: fdr method for 5 tests > > # restore old 'contrasts' that confound the intercept > options(old.opt) > > > # --------------- Other stuff ------------------- > # using cld > cld(lsmeans(warp.lm2, ~ tension | wool)) wool = A: tension lsmean SE df lower.CL upper.CL .group H 23.53324 3.489132 38 16.46986 30.59662 1 M 23.74441 3.497424 38 16.66424 30.82457 1 L 48.35296 4.913079 38 38.40695 58.29897 2 wool = B: tension lsmean SE df lower.CL upper.CL .group H 19.47922 3.308686 38 12.78114 26.17731 1 L 27.68406 3.501649 38 20.59534 34.77278 1 M 29.28683 3.244426 38 22.71884 35.85483 1 Confidence level used: 0.95 P value adjustment: tukey method for comparing a family of 3 estimates significance level used: alpha = 0.05 > > # passing to glht > require(multcomp) Loading required package: multcomp Loading required package: mvtnorm Loading required package: survival Loading required package: TH.data > # This will fail because glht can't deal with rank deficiency > # Hope this changes. > try( as.glht(pairs(warp.lsm)) ) Note: df set to 37 Error in glht.matrix(model = structure(list(object = ), .Names = "object", class = c("lsmwrap", : 'ncol(linfct)' is not equal to 'length(coef(model))' In addition: Warning message: In glht.matrix(model = list(object = ), : 1 out of 10 coefficients not estimable in 'model' > > # However, warp.lm2 isn't rank-deficient > warp.lsm2 <- lsmeans(warp.lm2, ~ tension) NOTE: Results may be misleading due to involvement in interactions > warp.con <- contrast(warp.lsm2, "eff") > summary(warp.con, adjust = "sidak") contrast estimate SE df t.ratio p.value L effect 9.338389 2.332591 38 4.003 0.0008 M effect -2.164500 2.018477 38 -1.072 0.6426 H effect -7.173889 2.059398 38 -3.483 0.0038 Results are averaged over the levels of: wool P value adjustment: sidak method for 3 tests > summary(as.glht(warp.con)) Note: df set to 38 Simultaneous Tests for General Linear Hypotheses Linear Hypotheses: Estimate Std. Error t value Pr(>|t|) L effect == 0 9.338 2.333 4.003 < 0.001 *** M effect == 0 -2.165 2.018 -1.072 0.53536 H effect == 0 -7.174 2.059 -3.483 0.00357 ** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Adjusted p values reported -- single-step method) > > summary(glht(warp.lm2, lsm(eff ~ tension | wool))) Note: df set to 38 $`wool = A` Simultaneous Tests for General Linear Hypotheses Fit: lm(formula = breaks ~ x1 + x2 + wool * tension) Linear Hypotheses: Estimate Std. Error t value Pr(>|t|) L effect == 0 16.476 3.655 4.508 <0.001 *** M effect == 0 -8.132 3.023 -2.690 0.0274 * H effect == 0 -8.344 3.047 -2.738 0.0245 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Adjusted p values reported -- single-step method) $`wool = B` Simultaneous Tests for General Linear Hypotheses Fit: lm(formula = breaks ~ x1 + x2 + wool * tension) Linear Hypotheses: Estimate Std. Error t value Pr(>|t|) L effect == 0 2.201 2.790 0.789 0.7121 M effect == 0 3.803 2.665 1.427 0.3373 H effect == 0 -6.004 2.701 -2.223 0.0801 . --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Adjusted p values reported -- single-step method) > > # confint > confint(contrast(warp.lsm2, "trt.vs.ctrl1")) contrast estimate SE df lower.CL upper.CL M - L -11.50289 3.845692 38 -20.38431 -2.621472 H - L -16.51228 3.910237 38 -25.54276 -7.481796 Results are averaged over the levels of: wool Confidence level used: 0.95 Conf-level adjustment: dunnettx method for 2 estimates > > # lstrends > warp.lm4 <- lm(breaks ~ tension*wool*x1, data = warp) > lstrends(warp.lm4, ~tension|wool, var = "x1") wool = A: tension x1.trend SE df lower.CL upper.CL L -8.5838732 2.4676060 34 -13.5986519 -3.569095 M 1.9790186 1.0485628 34 -0.1519173 4.109955 H 0.8789257 0.8971595 34 -0.9443218 2.702173 wool = B: tension x1.trend SE df lower.CL upper.CL L 1.5806866 1.2949710 34 -1.0510111 4.212384 M 1.0019960 0.7825624 34 -0.5883621 2.592354 H 0.3217596 0.6650664 34 -1.0298180 1.673337 Confidence level used: 0.95 > > # exotic chain rule example > lstrends(warp.lm4, ~tension|wool, var = "sqrt(x1-7)") wool = A: tension sqrt(x1-7).trend SE df lower.CL upper.CL L -55.891528 16.067137 34 -88.5438789 -23.23918 M 12.885835 6.827428 34 -0.9891679 26.76084 H 5.722883 5.841607 34 -6.1486912 17.59446 wool = B: tension sqrt(x1-7).trend SE df lower.CL upper.CL L 10.292206 8.431847 34 -6.8433695 27.42778 M 6.524221 5.095440 34 -3.8309581 16.87940 H 2.095049 4.330397 34 -6.7053764 10.89547 Confidence level used: 0.95 > > > > # -------- Transformations ------------- > ## ... of response ... > warp.lm5 <- lm(log(breaks) ~ x1 + x2 + tension*wool, data = warp) > warp.lsm5 <- lsmeans(warp.lm5, ~tension | wool) > summary(warp.lsm5) wool = A: tension lsmean SE df lower.CL upper.CL L 3.813803 0.1826369 38 3.444074 4.183532 M 3.099011 0.1300119 38 2.835816 3.362206 H 3.056508 0.1297036 38 2.793937 3.319079 wool = B: tension lsmean SE df lower.CL upper.CL L 3.282384 0.1301689 38 3.018870 3.545897 M 3.332706 0.1206070 38 3.088550 3.576862 H 2.933453 0.1229958 38 2.684461 3.182445 Results are given on the log scale. Confidence level used: 0.95 > summary(warp.lsm5, type = "resp") wool = A: tension response SE df lower.CL upper.CL L 45.32245 8.277551 38 31.31426 65.59711 M 22.17601 2.883144 38 17.04430 28.85278 H 21.25321 2.756618 38 16.34524 27.63489 wool = B: tension response SE df lower.CL upper.CL L 26.63919 3.467596 38 20.46816 34.67077 M 28.01405 3.378691 38 21.94524 35.76116 H 18.79240 2.311387 38 14.65030 24.10561 Confidence level used: 0.95 > > ## In a GLM > # One of the glm examples... > d.AD <- data.frame(treatment = gl(3,3), outcome = gl(3,1,9), + counts = c(18,17,15,20,10,20,25,13,12)) > glm.D93 <- glm(counts ~ outcome + treatment, family = poisson(), data = d.AD) > > ( lsm.D93 <- lsmeans(glm.D93, ~ outcome) ) outcome lsmean SE df asymp.LCL asymp.UCL 1 3.044522 0.1259882 NA 2.797590 3.291455 2 2.590267 0.1581139 NA 2.280370 2.900165 3 2.751535 0.1458650 NA 2.465645 3.037425 Results are averaged over the levels of: treatment Results are given on the log scale. Confidence level used: 0.95 > # un-log the results to obtain rates > summary(lsm.D93, type = "resp") outcome rate SE df asymp.LCL asymp.UCL 1 21.00000 2.645751 NA 16.405066 26.88194 2 13.33333 2.108185 NA 9.780295 18.17714 3 15.66667 2.285218 NA 11.771074 20.85149 Results are averaged over the levels of: treatment Confidence level used: 0.95 > > # un-log some comparisons to obtain ratios > summary(contrast(lsm.D93, "trt.vs.ctrl", ref = 2), + type = "resp", adjust = "none") contrast rate.ratio SE df z.ratio p.value 1 - 2 1.575 0.3184189 NA 2.2468891 0.0246 3 - 2 1.175 0.2527659 NA 0.7496662 0.4535 Results are averaged over the levels of: treatment Tests are performed on the linear-predictor scale > > > # weighting > nutr.lm <- lm(gain ~ (age + group + race)^2, data = nutrition) > lsmeans(nutr.lm, "race", weights = "equal") NOTE: Results may be misleading due to involvement in interactions race lsmean SE df lower.CL upper.CL Black 1.258929 1.646003 92 -2.0101755 4.528033 Hispanic NA NA NA NA NA White 2.932008 1.346612 92 0.2575192 5.606496 Results are averaged over the levels of: age, group Confidence level used: 0.95 > > lsmeans(nutr.lm, "race", weights = "prop") NOTE: Results may be misleading due to involvement in interactions race lsmean SE df lower.CL upper.CL Black 1.926554 1.3940313 92 -0.8421122 4.695221 Hispanic NA NA NA NA NA White 2.522821 0.6044604 92 1.3223102 3.723331 Results are averaged over the levels of: age, group Confidence level used: 0.95 > > lsmeans(nutr.lm, "race", weights = "outer") NOTE: Results may be misleading due to involvement in interactions race lsmean SE df lower.CL upper.CL Black 2.546674 1.4313624 92 -0.2961356 5.389483 Hispanic NA NA NA NA NA White 3.142940 0.7494154 92 1.6545363 4.631344 Results are averaged over the levels of: age, group Confidence level used: 0.95 > > lsmeans(nutr.lm, "race", weights = "cells") NOTE: Results may be misleading due to involvement in interactions race lsmean SE df lower.CL upper.CL Black 0.3809524 1.166180 92 -1.935181 2.697086 Hispanic 1.6666667 3.085422 92 -4.461247 7.794581 White 2.7951807 0.586592 92 1.630158 3.960203 Results are averaged over the levels of: age, group Confidence level used: 0.95 > > > # covariate predictions > feedlot.add <- lm(swt ~ ewt + herd + diet, data = feedlot) > lsmeans(feedlot.add, "herd", cov.reduce = ewt ~ herd) herd lsmean SE df lower.CL upper.CL 9 856.1375 26.66927 53 802.6457 909.6293 16 943.2625 34.05583 53 874.9551 1011.5698 3 993.4646 23.83657 53 945.6545 1041.2747 32 959.9984 20.47652 53 918.9277 1001.0691 24 984.5125 22.79846 53 938.7846 1030.2404 31 1105.4646 23.83657 53 1057.6545 1153.2747 19 1058.3821 22.24379 53 1013.7667 1102.9975 36 1126.9800 25.97394 53 1074.8829 1179.0771 34 1010.5553 21.88667 53 966.6562 1054.4544 35 1092.9718 20.58269 53 1051.6882 1134.2555 33 1072.0051 26.22250 53 1019.4094 1124.6007 Results are averaged over the levels of: diet Confidence level used: 0.95 > > > proc.time() user system elapsed 1.07 0.14 1.25 lsmeans/NAMESPACE0000644000175100001440000000721712634421507013164 0ustar hornikusers# Namespace for lsmeans package # Imports # From default packages (new req from CRAN, July 2015) importFrom("graphics", "pairs") importFrom("stats", "as.formula", "coef", "complete.cases", "confint", "cov", "cov2cor", "delete.response", "deriv", "family", "lm", "make.link", "model.frame", "model.matrix", "na.omit", "na.pass", "p.adjust", "p.adjust.methods", "pchisq", "pf", "poly", "predict", "pt", "ptukey", "qf", "qt", "qtukey", "reformulate", "terms", "uniroot", "update", "vcov") importFrom("utils", "head", "installed.packages", "str") importFrom("nlme", "fixef") # Others import(methods) import(mvtnorm) import(estimability) # 'requireNamespace' block below allows me to put multcomp in # Imports instead of Depends. if (requireNamespace("multcomp", quietly = TRUE)) { importFrom(multcomp, cld, glht, modelparm) export(cld) # need user to see it even if multcomp not loaded S3method(cld, ref.grid) S3method(cld, lsm.list) S3method(glht, lsmlf) S3method(glht, ref.grid) S3method(modelparm, lsmwrap) } if (requireNamespace("plyr", quietly = TRUE)) { importFrom(plyr, alply) } if (requireNamespace("coda", quietly = TRUE)) { importFrom(coda, as.mcmc) export(as.mcmc) S3method(as.mcmc, ref.grid) } # Visible exports exportPattern("*.lsmc") #all contrast fcns export( as.glht, contrast, defaults, get.lsm.option, get.pmm.option, lsm, lsm.basis, lsmeans, lsmeans.character, lsmobj, lsmip, lsm.options, lstrends, pmm, pmmeans, pmmobj, pmmip, pmm.options, pmtrends, ###rbind, # my own version that overrides one in methods recover.data, ref.grid, regrid, test ) # hidden functions of possible use to other package developers export( .all.vars, .aovlist.dffun, .diag, .get.offset, .my.vcov ) # S3 methods for recover.data and lsm.basis that are needed by other packages S3method(recover.data, call) S3method(recover.data, aovlist) S3method(lsm.basis, aovlist) S3method(recover.data, lm) S3method(lsm.basis, lm) S3method(recover.data, lme) S3method(lsm.basis, lme) S3method(recover.data, merMod) S3method(lsm.basis, merMod) S3method(lsm.basis, mlm) # recover.data for mlm uses lm # S3 methods - # For clarity, I'm showing them all # but commenting out the ones used only interally S3method("[", ref.grid) S3method(as.glht, ref.grid) S3method(as.glht, lsm.list) S3method(confint, ref.grid) S3method(confint, lsm.list) S3method(contrast, ref.grid) S3method(contrast,lsm.list) #S3method(glht, lsmlf) # in namespace block above #S3method(glht, ref.grid) S3method(lsmeans, character) S3method(lsmeans.character, default) S3method(lsmeans.character, ref.grid) S3method(lsmeans, default) S3method(lsmeans, formula) S3method(lsmeans, list) S3method(lsmip, default) #S3method(modelparm, lsmwrap) # in namespace block above S3method(pairs, ref.grid) S3method(pairs, lsm.list) S3method(plot, lsmobj) S3method(plot, summary.ref.grid) S3method(predict, ref.grid) S3method(print, ref.grid) S3method(print, summary.ref.grid) S3method(print, lsm.list) S3method(rbind, ref.grid) S3method(str, ref.grid) S3method(str, lsm.list) S3method(summary, ref.grid) S3method(summary, glht.list) S3method(summary, lsm.list) S3method(test, ref.grid) S3method(test, lsm.list) S3method(update, ref.grid) S3method(vcov, ref.grid) # interim support for old lsmeans function # removed at version 2.14 # export(.old.lsmeans) # S3method(print, lsm) # S3method(print, data.frame.lsm) lsmeans/data/0000755000175100001440000000000012634421507012647 5ustar hornikuserslsmeans/data/oranges.RData0000644000175100001440000000154512634421507015227 0ustar hornikusers r0b```b`f@& `d`aEy @.*`%1̌80vlԲQFC01L` S LbpK򋀬hA2 H  f)X*&[!"a[$1K,lG7[]P)] d\G(<61qA7D堶IYQ+v*/v0zͯA73{gOO!Ϧy䎼(y=AA"G)>i>f9e? Țk-z5.N{ ${U6ŭ񆃈{k Nlp> U)$\28(a\g]xA_5gDބ]=꜃BP䰃ߒxDɬ0tPUnG;{}B累+8l`wX8 /v_bd|wic57_99Ȕig=n -;*xi}lCN~pyr05T.A@ 퐺?PdS>s0y;1f;0(1\.`I3Bxǃv#3^RXJg]VyV/(,H(ȺT$957ְdfmWSzO쐶Z/v7IOa8JztN~s={ݪ5˸Z89RY}\p-clsmeans/data/nutrition.RData0000644000175100001440000000075212634421507015623 0ustar hornikusersVN@jD%C![1O.aAn~3U )!/ %eGy`RIٚ-ϧIvvO2Ԛ8Eg1-za\ gH2۸MdMuFM#UCu5}Ht=lmp5&&,{1!͟ȱ铹(_)GB[~NK)ɋܯ|01(YJ;Ce\PzQhC攎`vqz?b<]/> 4Nřp֍dWhdōўc2G;kY\a<ŗ '˟'t`v틎?hoA+:|/ՍWyFoK}!"Qy -0= n lsmeans/data/autonoise.RData0000644000175100001440000000052512634421507015574 0ustar hornikusersSMK@M- /Cs=x^d H*zg{:ծCxo&vnuR ҄A|u7fqj1C>qq5sv{m53gך=?.k9ُ5C9ѓJEvf.˖,y m>9R5 ײulGf.C.~HiCPOc|V}-"i7{?^|HISg9B Rl`v;lsmeans/data/fiber.RData0000644000175100001440000000041612634421507014654 0ustar hornikusersmRN0؅HG-!)S&uh4 2?аwbi3;}iM !Dw$Eyol87ss\VSW-z7íU?Y^*7GNhq Éo+5o3ƽ2O: a |l9鏄xIO_>yzu5*ߗ&:iMg+1Ԛ6ǯ?Wuݏ QQ` ا9ƻ{lsmeans/data/feedlot.RData0000644000175100001440000000115012634421507015203 0ustar hornikusersU=OA]vHd)M~ DRĭsLl'Ny RH)%E J))SH[nNv" Λy37JL)#PrK}$# RzZSix—)fs"dĖc"KG,Gz- OFsxleɪ eou4kc ':s #>N>fE>ؗcTFPO1ϸ?9ON:7y%םrxx^܇7 Ak?qﲛ؃. h>)>́!c>'wNE=ZxeK"_=^E6v5ZƕZk Vp6}]e<鮕"vLwHlsmeans/R/0000755000175100001440000000000012634421564012142 5ustar hornikuserslsmeans/R/aovlist-support.R0000644000175100001440000001104112634421507015452 0ustar hornikusers# lsmeans support for aovlist objects recover.data.aovlist = function(object, ...) { fcall = attr(object, "call") trms = terms(object) # Find the Error terms lbls = attr(trms, "term.labels") err.idx = grep("^Error\\(", lbls) newf = as.formula(paste(c(".~.", lbls[err.idx]), collapse = "-")) trms = terms(update(trms, newf)) recover.data(fcall, delete.response(trms), na.action = attr(object, "na.action"), ...) } # This works great for balanced experiments, and goes horribly wrong # even for slightly unbalanced ones. So I abort on these kinds of cases lsm.basis.aovlist = function (object, trms, xlev, grid, vcov., ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) contr = attr(object, "contrasts") X = model.matrix(trms, m, contrasts.arg = contr) xnms = dimnames(X)[[2]] # Check for situations we can't handle... colsums = apply(X[, setdiff(xnms, "(Intercept)"), drop=FALSE], 2, sum) if (any(round(colsums,3) != 0)) warning("Some predictors are correlated with the intercept - results are biased.\n", "May help to re-fit with different contrasts, e.g. 'contr.sum'") if (length(unlist(lapply(object, function(x) names(coef(x))))) > length(xnms)) message("NOTE: Results are based on intra-block estimates.") # initialize arrays nonint = setdiff(names(object), "(Intercept)") k = length(xnms) bhat = rep(NA, k) # I'll use NAs to track which slots I've filled V = matrix(0, nrow=k, ncol=k) names(bhat) = xnms dimnames(V) = list(xnms, xnms) empty.list = as.list(nonint) names(empty.list) = nonint Vmats = Vidx = Vdf = empty.list wts = matrix(0, nrow = length(nonint), ncol = k) dimnames(wts) = list(nonint, xnms) # NOTE: At present, I just do intra-block analysis: wts are all 0 and 1 btemp = bhat #++ temp for tracking indexes #++Work thru strata in reverse order for (nm in rev(nonint)) { x = object[[nm]] bi = coef(x) bi = bi[!is.na(bi)] ii = match(names(bi), xnms) Vidx[[nm]] = use = setdiff(ii, which(!is.na(bhat))) #++ omit elts already filled if(length(use) > 0) { ii.left = seq_along(ii)[!is.na(match(ii,use))] wts[nm, use] = 1 bhat[use] = bi[ii.left] Vi = vcov(x)[ii.left, ii.left, drop=FALSE] Vmats[[nm]] = Vi V[use,use] = Vi } else { Vmats[[nm]] = matrix(0, nrow=0, ncol=0) } # Any cases with 0 df will have NaN for covariances. I make df = -1 # in those cases so I don't divide by 0 later in Satterthwaite calcs Vdf[[nm]] = ifelse(x$df > 0, x$df, -1) } x <- object[["(Intercept)"]] if (!is.null(x)) { # The intercept belongs in the 1st error stratum # So have to add a row and column to its covariance matrix bhat[1] = x$coefficients[1] wts[1,1] = 1 Vidx[[1]] = ii = c(1, Vidx[[1]]) k = length(ii) vv = matrix(0, nrow=k, ncol=k) if (k > 1) vv[2:k,2:k] = Vmats[[1]] # Variance of intercept is EMS of this stratum divided by N # Here I'm assuming there are no weights N = sum(sapply(object, function(x) length(x$residuals))) V[1,1] = vv[1,1] = sum(object[[2]]$residuals^2) / object[[2]]$df / N #dimnames(vv) = list(c(xnms[ii], xnms[ii])) Vmats[[1]] = vv } # override V if vcov. is supplied if(!missing(vcov.)) { V = .my.vcov(object, vcov.) dfargs = list() dffun = function(k, dfargs) NA } else { dfargs = list(Vmats=Vmats, Vidx=Vidx, Vdf=unlist(Vdf), wts = wts) dffun = function(k, dfargs) { lsmeans::.aovlist.dffun(k, dfargs) } } nbasis = estimability::all.estble # Consider this further? misc = list() list(X = X, bhat = bhat, nbasis = nbasis, V = V, dffun = dffun, dfargs = dfargs, misc = misc) } .aovlist.dffun = function(k, dfargs) { if(is.matrix(k) && (nrow(k) > 1)) { dfs = apply(k, 1, .aovlist.dffun, dfargs) min(dfs) } else { v = sapply(seq_along(dfargs$Vdf), function(j) { ii = dfargs$Vidx[[j]] kk = (k * dfargs$wts[j, ])[ii] #sum(kk * .mat.times.vec(dfargs$Vmats[[j]], kk)) .qf.non0(dfargs$Vmats[[j]], kk) }) sum(v)^2 / sum(v^2 / dfargs$Vdf) # Good ole Satterthwaite } }lsmeans/R/ordinal-support.R0000644000175100001440000003303312634421507015426 0ustar hornikusers#-------------------------------------------------------------- ### support for the ordinal package # (initial setup thanks to Maxime Herve, RVAideMemoire package) recover.data.clm = function(object, mode = "latent", ...) { if (!is.na(pmatch(mode, "scale"))) { if (is.null(trms <- object$S.terms)) return("Specified mode=\"scale\", but no scale model is present") # ref.grid's error handler takes it from here recover.data(object$call, trms, object$na.action, ...) } else if (is.null(object$S.terms) && is.null(object$nom.terms)) recover.data.lm(object, ...) else { # bring-in predictors from loc, scale, and nom models trms = delete.response(object$terms) #preds = union(.all.vars(trms), union(.all.vars(object$S.terms), .all.vars(object$nom.terms))) x.preds = union(.all.vars(object$S.terms), .all.vars(object$nom.terms)) #x.trms = update(trms, reformulate(preds)) x.trms = terms(update(trms, reformulate(c(".", x.preds)))) recover.data(object$call, x.trms, object$na.action, ...) } } # For now at least, clmm doesn't cover scale, nominal options recover.data.clmm = recover.data.lm # Note: For ALL thresholds, object$Theta has all the threshold values # for the different cuts (same as object$alpha when threshold=="flexible") # and object$tJac is s.t. tJac %*% alpha = Theta # Note also that some functions of cut are constrained to be zero when # threshold != "flexible". Can get basis using nonest.basis(t(tJac)) # # opt arg 'mode' - determines what goes into ref.grid # 'rescale' - (loc, scale) for linear transformation of latent result lsm.basis.clm = function (object, trms, xlev, grid, mode = c("latent", "linear.predictor", "cum.prob", "exc.prob", "prob", "mean.class", "scale"), rescale = c(0,1), ...) { # general stuff mode = match.arg(mode) if (mode == "scale") return (.lsm.basis.clm.scale(object, trms, xlev, grid, ...)) if (is.null(object$contrasts)) warning("Contrasts used to fit the model are unknown.\n", "Defaulting to system option, but results may be wrong.") bhat = coef(object) V = .my.vcov(object, ...) tJac = object$tJac dffun = function(...) NA link = as.character(object$info$link) cnm = dimnames(object$tJac)[[1]] if (is.null(cnm)) cnm = paste(seq_len(nrow(tJac)), "|", 1 + seq_len(nrow(tJac)), sep = "") misc = list() # My strategy is to piece together the needed matrices for each threshold parameter # Then assemble the results ### ----- Location part ----- ### contrasts = object$contrasts # Remember trms was trumped-up to include scale and nominal predictors. # Recover the actual terms for the principal model trms = delete.response(object$terms) m = model.frame(trms, grid, na.action = na.pass, xlev = object$xlevels) X = model.matrix(trms, m, contrasts.arg = contrasts) xint = match("(Intercept)", colnames(X), nomatch = 0L) if (xint > 0L) { X = X[, -xint, drop = FALSE] } ### ----- Nominal part ----- ### if (is.null(object$nom.terms)) NOM = matrix(1, nrow = nrow(X)) else { mn = model.frame(object$nom.terms, grid, na.action = na.pass, xlev = object$nom.xlevels) NOM = model.matrix(object$nom.terms, mn, contrasts.arg = object$nom.contrasts) } bigNom = kronecker(tJac, NOM) # cols are in wrong order... I'll get the indexes by transposing a matrix of subscripts if (ncol(NOM) > 1) bigNom = bigNom[, as.numeric(t(matrix(seq_len(ncol(bigNom)), nrow=ncol(NOM))))] ### ----- Scale part ----- ### if (!is.null(object$S.terms)) { ms = model.frame(object$S.terms, grid, na.action = na.pass, xlev = object$S.xlevels) S = model.matrix(object$S.terms, ms, contrasts.arg = object$S.contrasts) S = S[, names(object$zeta), drop = FALSE] if (!is.null(attr(object$S.terms, "offset"))) { soff = .get.offset(object$S.terms, grid) # we'll add a column to S and adjust bhat and V accordingly S = cbind(S, offset = soff) bhat = c(bhat, offset = 1) V = rbind(cbind(V, offset = 0), offset = 0) } si = misc$scale.idx = length(object$alpha) + length(object$beta) + seq_len(ncol(S)) # Make sure there are no name clashes names(bhat)[si] = paste(".S", names(object$zeta), sep=".") misc$estHook = ".clm.estHook" misc$vcovHook = ".clm.vcovHook" } else S = NULL ### ----- Get non-estimability basis ----- ### nbasis = snbasis = estimability::all.estble if (any(is.na(bhat))) { #####mm = model.matrix(object) # workaround to fact that model.matrix doesn't get the contrasts right... mf = update(object, method = "model.frame")$mf mm = list(X = model.matrix(object$terms, data=mf, contrasts.arg = object$contrasts)) if (any(is.na(c(object$alpha, object$beta)))) { NOMX = mm$X if (is.null(mm$NOM)) NOMX = mm$X else { ##NOMX = cbind(mm$NOM, mm$X[, -1, drop=false]) mmNOM = model.matrix(object$nom.terms, data = mf, contrasts.arg = object$nom.contrasts) NOMX = cbind(mmNOM, mm$X[, -1]) } nbasis = estimability::nonest.basis(NOMX) # replicate and reverse the sign of the NOM parts nomcols = seq_len(ncol(NOM)) nbasis = apply(nbasis, 2, function(x) c(rep(-x[nomcols], each = length(object$alpha)), x[-nomcols])) } if (!is.null(mm$S)) { if (any(is.na(object$zeta))) { ####snbasis = nonest.basis(mm$S) mmS = model.matrix(object$S.terms, data = mf, contrasts.arg = object$S.contrasts) snbasis = estimability::nonest.basis(mmS) # put intercept part at end snbasis = rbind(snbasis[-1, , drop=FALSE], snbasis[1, ]) if (!is.null(attr(object$S.terms, "offset"))) snbasis = rbind(snbasis, 0) snbasis = rbind(matrix(0, ncol=ncol(snbasis), nrow=min(si)-1), snbasis) # Note scale intercept is included, so tack it on to the end of everything S = cbind(S, .S.intcpt = 1) bhat = c(bhat, .S.intcpt = 0) V = rbind(cbind(V, .S.intcpt = 0), .S.intcpt = 0) si = misc$scale.idx = c(si, 1 + max(si)) } } if (is.na(nbasis[1])) # then only nonest part is scale nbasis = snbasis else { if (!is.null(S)) # pad nbasis with zeros when there's a scale model nbasis = rbind(nbasis, matrix(0, nrow=length(si), ncol=ncol(nbasis))) if (!is.na(snbasis[1])) nbasis = cbind(nbasis, snbasis) } } if (mode == "latent") { # Create constant columns for means of scale and nominal parts J = matrix(1, nrow = nrow(X)) nomm = rescale[2] * apply(bigNom, 2, mean) X = rescale[2] * X if (!is.null(S)) { sm = apply(S, 2, mean) X = cbind(X, kronecker(-J, matrix(sm, nrow = 1))) } bigX = cbind(kronecker(-J, matrix(nomm, nrow = 1)), X) misc$offset.mult = misc$offset.mult * rescale[2] intcpt = seq_len(ncol(tJac)) bhat[intcpt] = bhat[intcpt] - rescale[1] / rescale[2] } else { ### ----- Piece together big matrix for each threshold ----- ### misc$ylevs = list(cut = cnm) misc$tran = link misc$inv.lbl = "cumprob" misc$offset.mult = -1 if (!is.null(S)) X = cbind(X, S) J = matrix(1, nrow=nrow(tJac)) bigX = cbind(bigNom, kronecker(-J, X)) if (mode != "linear.predictor") { misc$mode = mode misc$respName = as.character(object$terms)[2] misc$postGridHook = ".clm.postGrid" } } dimnames(bigX)[[2]] = names(bhat) list(X = bigX, bhat = bhat, nbasis = nbasis, V = V, dffun = dffun, dfargs = list(), misc = misc) } # fuction called at end of ref.grid # I use this for polr as well .clm.postGrid = function(object) { mode = object@misc$mode object@misc$postGridHook = object@misc$mode = NULL object = regrid(object, TRUE) if(object@misc$estName == "exc.prob") { # Exceedance probs object@bhat = 1 - object@bhat object@misc$estName = "cum.prob" } if (mode == "prob") { object = .clm.prob.grid(object) } else if (mode == "mean.class") { object = .clm.mean.class(object) } else if (mode == "exc.prob") { object@bhat = 1 - object@bhat object@misc$estName = "exc.prob" } # (else mode == "cum.prob" and it's all OK) object@misc$respName = NULL object } # Make the linear-predictor ref.grid into one for class probabilities # This assumes that object has already been re-gridded and back-transformed .clm.prob.grid = function(object, thresh = "cut", newname = object@misc$respName) { byv = setdiff(names(object@levels), thresh) newrg = contrast(object, ".diff_cum", by = byv) class(newrg) = "ref.grid" misc = newrg@misc misc$infer = c(FALSE,FALSE) misc$estName = "prob" misc$pri.vars = misc$by.vars = NULL newrg@misc = misc names(newrg@levels)[1] = names(newrg@grid)[1] = newname newrg@roles = object@roles newrg@roles$multresp = newname newrg } .clm.mean.class = function(object) { prg = .clm.prob.grid(object, newname = "class") byv = setdiff(names(prg@levels), "class") lf = as.numeric(prg@levels$class) newrg = contrast(prg, list(mean = lf), by = byv) newrg = update(newrg, infer = c(FALSE, FALSE), pri.vars = NULL, by.vars = NULL, estName = "mean.class") newrg@levels$contrast = newrg@grid$contrast = NULL prg@roles$multresp = NULL newrg@roles = prg@roles class(newrg) = "ref.grid" newrg } # Contrast fcn for turning estimates of cumulative probabilities # into cell probabilities .diff_cum.lsmc = function(levs, sep = "|", ...) { plevs = unique(setdiff(unlist(strsplit(levs, sep, TRUE)), sep)) k = 1 + length(levs) if (length(plevs) != k) plevs = seq_len(k) M = matrix(0, nrow = length(levs), ncol = k) for (i in seq_along(levs)) M[i, c(i,i+1)] = c(1,-1) dimnames(M) = list(levs, plevs) M = as.data.frame(M) attr(M, "desc") = "Differences of cumulative probabilities" attr(M, "adjust") = "none" attr(M, "offset") = c(rep(0, k-1), 1) M } #### replacement estimation routines for cases with a scale param ## workhorse for estHook and vcovHook functions .clm.hook = function(object, tol = 1e-8) { scols = object@misc$scale.idx bhat = object@bhat active = !is.na(bhat) bhat[!active] = 0 linfct = object@linfct estble = estimability::is.estble(linfct, object@nbasis, tol) ###apply(linfct, 1, .is.estble, object@nbasis, tol) estble[!estble] = NA rsigma = estble * as.numeric(linfct[, scols, drop = FALSE] %*% object@bhat[scols]) rsigma = exp(rsigma) * estble # I'll do the scaling later eta = as.numeric(linfct[, -scols, drop = FALSE] %*% bhat[-scols]) if (!is.null(object@grid$.offset.)) eta = eta + object@grid$.offset. for (j in scols) linfct[, j] = eta * linfct[, j] linfct = (.diag(rsigma) %*% linfct) [, active, drop = FALSE] list(est = eta * rsigma, V = linfct %*% tcrossprod(object@V, linfct)) } .clm.estHook = function(object, do.se = TRUE, tol = 1e-8, ...) { raw.matl = .clm.hook(object, tol) SE = if (do.se) sqrt(diag(raw.matl$V)) else NA cbind(est = raw.matl$est, SE = SE, df = NA) } .clm.vcovHook = function(object, tol = 1e-8, ...) { .clm.hook(object, tol)$V } ### Special lsm.basis fcn for the scale model .lsm.basis.clm.scale = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$S.contrasts) bhat = c(`(intercept)` = 0, object$zeta) nbasis = estimability::all.estble if (any(is.na(bhat))) { mf = update(object, method = "model.frame")$mf S = model.matrix(trms, mf, contrasts.arg = object$S.contrasts) nbasis = estimability::nonest.basis(S) } k = sum(!is.na(bhat)) - 1 V = .my.vcov(object, ...) pick = nrow(V) - k + seq_len(k) V = V[pick, pick, drop = FALSE] V = cbind(0, rbind(0,V)) misc = list(tran = "log") list(X = X, bhat = bhat, nbasis = nbasis, V = V, dffun = function(...) NA, dfargs = list(), misc = misc) } lsm.basis.clmm = function (object, trms, xlev, grid, ...) { if(is.null(object$Hessian)) { message("Updating the model to obtain the Hessian...") object = update(object, Hess = TRUE) } # borrowed from Maxime's code -- need to understand this better, e.g. when it happens H = object$Hessian if (any(apply(object$Hessian, 1, function(x) all(x == 0)))) { H = H[names(coef(object)), names(coef(object))] object$Hessian = H } result = lsm.basis.clm(object, trms, xlev, grid, ...) # strip off covariances of random effects keep = seq_along(result$bhat) result$V = result$V[keep,keep] result } lsmeans/R/helpers.R0000644000175100001440000006672412634421507013743 0ustar hornikusers### Helper functions for lsmeans ### Here we have 'recover.data' and 'lsm.basis' methods ### For models that this package supports. #---------------------------------------------------------- ### Recover data methods will return a data.frame with ### the original data, and at least these additional attrs: # attr(, "terms") - terms component of object # attr(, "responses") - names of response variable # attr(, "predictors") - names of predictors #----------------------------------------------------------- # generic version recover.data = function(object, ...) UseMethod("recover.data") #---------------------------------------------------------- ### lsm.basis methods create a basis for the reference grid # # Required args: # object - the model object # trms - terms component of object # xlev - named list of factor levels (but not the coerced ones) # grid - reference grid # All methods must return a list with these elements: # X - basis for linear fcns over reference grid # bhat - regression coefficients for fixed effects (INCLUDING any NAs) # nbasis - matrix whose columns for a basis for non-estimable functions of beta; all.estble if none # V - estimated covariance matrix of bhat # dffun - function(k, dfargs) to find df for k'bhat having std error se # dfargs - additional arguments, if any, for dffun # misc - Extra info ... # -- if extra levels need to be added (e.g. mlm, polr), # put them in misc$ylevs # -- For transformations or link fcns, use misc$tran # for name (see 'make.link'), and use misc$inv.lbl # for label to use in 'summary' when tran is inverted # (ref.grid looks at lhs of model for tran if none found) # Note: if no df exists, set dffun = function(...) NA and dfargs = list() #-------------------------------------------------------------- # generic version lsm.basis = function(object, trms, xlev, grid, ...) UseMethod("lsm.basis") #-------------------------------------------------------------- ### DEFAULT METHODS (we hit these when a model is NOT supported) # I'll have it return the message if we caught the error in this way # Then caller can use try() to check for other types of errors, # and just print this message otherwise recover.data.default = function(object, ...) { paste("Can't handle an object of class ", dQuote(class(object)[1]), "\n", paste(.show_supported(), collapse="")) } lsm.basis.default = function(object, trms, xlev, grid, ...) { stop("Can't handle an object of class", dQuote(class(object)[1]), "\n", .show_supported()) } # Private fcn to get a list of supported objects # does this by looking in namespace [ns] and methods [meth] # then strips that off leaving extensions .show_supported = function(ns = "lsmeans", meth = "lsm.basis") { "Use help(\"models\", package = \"lsmeans\") for information on supported models." } #-------------------------------------------------------------- ### call' objects # This recover.data method serves as the workhorse for the others # For model objects, call this with the object's call and its terms component # Late addition: if data is non-null, use it in place of recovered data # Later addition: na.action arg req'd - vector of row indexes removed due to NAs recover.data.call = function(object, trms, na.action, data = NULL, params = NULL, ...) { fcall = object # because I'm easily confused vars = setdiff(.all.vars(trms), params) if (length(vars) == 0) return("Model must have at least one predictor") tbl = data if (is.null(tbl)) { m = match(c("formula", "data", "subset", "weights"), names(fcall), 0L) fcall = fcall[c(1L, m)] fcall$drop.unused.levels = TRUE fcall[[1L]] = as.name("model.frame") fcall$xlev = NULL # we'll ignore xlev fcall$na.action = na.omit ### I once had a reason to put one var on the left, but don't remember why ### Now it messes up if there's a '$' in that term # if (length(vars) > 1) # form = reformulate(vars[-1], response = vars[1]) # else form = reformulate(vars) fcall$formula = update(trms, form) env = environment(trms) if (is.null(env)) env = parent.frame() tbl = eval(fcall, env, parent.frame()) if (!is.null(na.action)) tbl = tbl[-(na.action), , drop=FALSE] } else fcall$data = tbl[complete.cases(data), , drop=FALSE] attr(tbl, "call") = object # the original call attr(tbl, "terms") = trms attr(tbl, "predictors") = setdiff(.all.vars(delete.response(trms)), params) attr(tbl, "responses") = setdiff(vars, union(attr(tbl, "predictors"), params)) tbl } #-------------------------------------------------------------- ### lm objects (and also aov, rlm, others that inherit) -- but NOT aovList recover.data.lm = function(object, ...) { fcall = object$call recover.data(fcall, delete.response(terms(object)), object$na.action, ...) } lsm.basis.lm = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) # coef() works right for lm but coef.aov tosses out NAs bhat = as.numeric(object$coefficients) # stretches it out if multivariate - see mlm method V = .my.vcov(object, ...) if (sum(is.na(bhat)) > 0) nbasis = estimability::nonest.basis(object$qr) else nbasis = estimability::all.estble misc = list() if (inherits(object, "glm")) { misc = .std.link.labels(object$family, misc) dffun = function(k, dfargs) NA dfargs = list() } else { dfargs = list(df = object$df.residual) dffun = function(k, dfargs) dfargs$df } list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } #-------------------------------------------------------------- ### mlm objects # (recover.data.lm works just fine) lsm.basis.mlm = function(object, trms, xlev, grid, ...) { class(object) = c("mlm", "lm") # avoids error in vcov for "maov" objects bas = lsm.basis.lm(object, trms, xlev, grid, ...) bhat = coef(object) k = ncol(bhat) bas$X = kronecker(diag(rep(1,k)), bas$X) bas$nbasis = kronecker(rep(1,k), bas$nbasis) ylevs = dimnames(bhat)[[2]] if (is.null(ylevs)) ylevs = seq_len(k) bas$misc$ylevs = list(rep.meas = ylevs) bas } #-------------------------------------------------------------- ### merMod objects (lme4 package) recover.data.merMod = function(object, ...) { if(!lme4::isLMM(object) && !lme4::isGLMM(object)) return("Can't handle a nonlinear mixed model") fcall = object@call recover.data(fcall, delete.response(terms(object)), attr(object@frame, "na.action"), ...) } lsm.basis.merMod = function(object, trms, xlev, grid, vcov., ...) { if (missing(vcov.)) V = as.matrix(vcov(object)) else V = as.matrix(.my.vcov(object, vcov.)) dfargs = misc = list() if (lme4::isLMM(object)) { pbdis = .lsm.is.true("disable.pbkrtest") Nlim = get.lsm.option("pbkrtest.limit") objN = lme4::getME(object, "N") toobig = objN > Nlim if (!pbdis && !toobig && requireNamespace("pbkrtest") && missing(vcov.)) { dfargs = list(unadjV = V, adjV = pbkrtest::vcovAdj.lmerMod(object, 0)) V = as.matrix(dfargs$adjV) tst = try(pbkrtest::Lb_ddf) if(class(tst) != "try-error") dffun = function(k, dfargs) pbkrtest::Lb_ddf (k, dfargs$unadjV, dfargs$adjV) else { dffun = function(k, dfargs) NA warning("To obtain d.f., install 'pbkrtest' version 0.4-1 or later") } } else { if(!pbdis && !("pbkrtest" %in% row.names(installed.packages()))) message("Install package 'pbkrtest' to obtain bias corrections and degrees of freedom") else if(toobig) message("Note: Adjusted covariance and degrees-of-freedom calculations have been\n", "disabled because the number of observations exceeds ", Nlim, ".\n", "Standard errors and tests may be more biased than if they were adjusted.\n", "To enable adjustments, set lsm.options(pbkrtest.limit = ", objN, ") or larger,\n", "but be warned that this may result in large computation time and memory use.") dffun = function(k, dfargs) NA } } else if (lme4::isGLMM(object)) { dffun = function(k, dfargs) NA misc = .std.link.labels(family(object), misc) } else stop("Can't handle a nonlinear mixed model") contrasts = attr(object@pp$X, "contrasts") m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = contrasts) bhat = lme4::fixef(object) if (length(bhat) < ncol(X)) { # Newer versions of lmer can handle rank deficiency, but we need to do a couple of # backflips to put the pieces together right, # First, figure out which columns were retained kept = match(names(bhat), dimnames(X)[[2]]) # Now re-do bhat with NAs in the right places bhat = NA * X[1, ] bhat[kept] = lme4::fixef(object) # we have to reconstruct the model matrix modmat = model.matrix(trms, object@frame, contrasts.arg=contrasts) nbasis = estimability::nonest.basis(modmat) } else nbasis=estimability::all.estble list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } #-------------------------------------------------------------- ### mer objects (from old lme4 version, now lme4.0) ### re-enabled; CRAN check now seems to work with multiple add'l repositories recover.data.mer = function(object, ...) { if(!lme4.0::isLMM(object) && !lme4.0::isGLMM(object)) return("Can't handle a nonlinear mixed model") fcall = object@call recover.data(fcall, delete.response(terms(object)), attr(object@frame, "na.action"), ...) } # Does NOT support pbkrtest capabilities. Uses asymptotic methods lsm.basis.mer = function(object, trms, xlev, grid, ...) { V = as.matrix(.my.vcov(object, ...)) dfargs = misc = list() if (lme4.0::isLMM(object)) { dffun = function(k, dfargs) NA } else if (lme4.0::isGLMM(object)) { dffun = function(k, dfargs) NA # need to work harder as there is no 'family' method cfam = object@call$family if (is.name(cfam)) fam = eval(cfam)() else fam = eval(cfam) misc = .std.link.labels(fam, misc) } else stop("Can't handle a nonlinear mixed model") contrasts = attr(object@X, "contrasts") m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = contrasts) bhat = lme4.0::fixef(object) nbasis=estimability::all.estble list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } #-------------------------------------------------------------- ### lme objects (nlme package) recover.data.lme = function(object, data, ...) { fcall = object$call if (!is.null(fcall$weights)) fcall$weights = nlme::varWeights(object$modelStruct) if(is.null(data)) # lme objects actually have the data, so use it! data = object$data recover.data(fcall, delete.response(terms(object)), object$na.action, data = data, ...) } lsm.basis.lme = function(object, trms, xlev, grid, adjustSigma = TRUE, ...) { contrasts = object$contrasts m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = contrasts) bhat = nlme::fixef(object) V = .my.vcov(object, ...) if (adjustSigma && object$method == "ML") V = V * object$dims$N / (object$dims$N - nrow(V)) misc = list() if (!is.null(object$family)) { misc = .std.link.labels(object$family, misc) } nbasis = estimability::all.estble # Replaced by containment method##dffun = function(...) NA dfx = object$fixDF$X if (names(bhat[1]) == "(Intercept)") dfx[1] = length(levels(object$groups[[1]])) - 1#min(dfx) ### Correct apparent error in lme containment algorithm dffun = function(x, dfargs) { idx = which(abs(x) > 1e-4) ifelse(length(idx) > 0, min(dfargs$dfx[idx]), NA) } list(X = X, bhat = bhat, nbasis = nbasis, V = V, dffun = dffun, dfargs = list(dfx = dfx), misc = misc) } #-------------------------------------------------------------- ### gls objects (nlme package) recover.data.gls = function(object, ...) { fcall = object$call if (!is.null(fcall$weights)) fcall$weights = nlme::varWeights(object$modelStruct) recover.data(fcall, delete.response(nlme::getCovariateFormula(object)), object$na.action, ...) } lsm.basis.gls = function(object, trms, xlev, grid, ...) { contrasts = object$contrasts m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = contrasts) bhat = coef(object) V = .my.vcov(object, ...) nbasis = estimability::all.estble dfargs = list(df = object$dims$N - object$dims$p) dffun = function(k, dfargs) dfargs$df list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=list()) } #-------------------------------------------------------------- ### polr objects (MASS package) recover.data.polr = recover.data.lm lsm.basis.polr = function(object, trms, xlev, grid, mode = c("latent", "linear.predictor", "cum.prob", "prob", "mean.class"), rescale = c(0,1), ...) { mode = match.arg(mode) contrasts = object$contrasts m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = contrasts) # Strip out the intercept (borrowed code from predict.polr) xint = match("(Intercept)", colnames(X), nomatch = 0L) if (xint > 0L) X = X[, -xint, drop = FALSE] bhat = c(coef(object), object$zeta) V = .my.vcov(object, ...) k = length(object$zeta) if (mode == "latent") { X = rescale[2] * cbind(X, matrix(- 1/k, nrow = nrow(X), ncol = k)) bhat = c(coef(object), object$zeta - rescale[1] / rescale[2]) misc = list(offset.mult = rescale[2]) } else { j = matrix(1, nrow=k, ncol=1) J = matrix(1, nrow=nrow(X), ncol=1) X = cbind(kronecker(-j, X), kronecker(diag(1,k), J)) link = object$method if (link == "logistic") link = "logit" misc = list(ylevs = list(cut = names(object$zeta)), tran = link, inv.lbl = "cumprob", offset.mult = -1) if (mode != "linear.predictor") { # just use the machinery we already have for the 'ordinal' package misc$mode = mode misc$postGridHook = ".clm.postGrid" } } misc$respName = as.character(terms(object))[2] nbasis = estimability::all.estble dffun = function(...) NA list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=list(), misc=misc) } #-------------------------------------------------------------- ### survreg objects (survival package) recover.data.survreg = function(object, ...) { fcall = object$call trms = delete.response(terms(object)) # I'm gonna delete any terms involving strata(), cluster(), or frailty() mod.elts = dimnames(attr(trms, "factor"))[[2]] tmp = grep("strata\\(|cluster\\(|frailty\\(", mod.elts) if (length(tmp)) trms = trms[-tmp] recover.data(fcall, trms, object$na.action, ...) } # Seems to work right in a little testing. # However, it fails sometimes if I update the model # with a subset argument. Workaround: just fitting a new model lsm.basis.survreg = function(object, trms, xlev, grid, ...) { # Much of this code is adapted from predict.survreg bhat = object$coefficients k = length(bhat) V = .my.vcov(object, ...)[seq_len(k), seq_len(k), drop=FALSE] # ??? not used... is.fixeds = (k == ncol(object$var)) m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) # X = model.matrix(object, m) # This is what predict.survreg does # But I have manipulated trms, so need to make sure things are consistent X = model.matrix(trms, m, contrasts.arg = object$contrasts) nbasis = estimability::nonest.basis(model.matrix(object)) dfargs = list(df = object$df.residual) dffun = function(k, dfargs) dfargs$df if (object$dist %in% c("exponential","weibull","loglogistic","loggaussian","lognormal")) misc = list(tran = "log", inv.lbl = "response") else misc = list() list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } #-------------------------------------------------------------- ### coxph objects (survival package) recover.data.coxph = function(object, ...) recover.data.survreg(object, ...) lsm.basis.coxph = function (object, trms, xlev, grid, ...) { object$dist = "doesn't matter" result = lsm.basis.survreg(object, trms, xlev, grid, ...) result$dfargs$df = NA result$X = result$X[, -1, drop = FALSE] result$X = result$X - rep(object$means, each = nrow(result$X)) result$misc$tran = "log" result$misc$inv.lbl = "hazard" result } # Note: Very brief experimentation suggests coxph.penal also works. # This is an extension of coxph #-------------------------------------------------------------- ### coxme objects #### ### Greatly revised 6-15-15 (after version 2.18) recover.data.coxme = function(object, ...) recover.data.survreg(object, ...) lsm.basis.coxme = function(object, trms, xlev, grid, ...) { bhat = fixef(object) k = length(bhat) V = .my.vcov(object, ...)[seq_len(k), seq_len(k), drop = FALSE] m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m) X = X[, -1, drop = FALSE] # remove the intercept # scale the linear predictor for (j in seq_along(X[1, ])) X[, j] = (X[, j] - object$means[j]) ### / object$scale[j] nbasis = estimability::all.estble dffun = function(k, dfargs) NA misc = list(tran = "log", inv.lbl = "hazard") list(X = X, bhat = bhat, nbasis = nbasis, V = V, dffun = dffun, dfargs = list(), misc = misc) } ### special vcov prototype for cases where there are several vcov options ### e.g., gee, geeglm, geese .named.vcov = function(object, method, ...) UseMethod(".named.vcov") # default has optional idx of same length as valid and if so, idx indicating # which elt of valid to use if matched # Ex: valid = c("mammal", "fish", "rat", "dog", "trout", "perch") # idx = c( 1, 2, 1, 1, 2, 2) # -- so ultimately results can only be "mammal" or "fish" # nonmatches revert to 1st elt. .named.vcov.default = function(object, method, valid, idx = seq_along(valid), ...) { if (!is.character(method)) { # in case vcov. arg was matched by vcov.method { V = .my.vcov(object, method) method = "user-supplied" } else { i = pmatch(method, valid, 1) method = valid[idx[i]] V = object[[method]] } attr(V, "methMesg") = paste("Covariance estimate used:", method) V } # general-purpose lsm.basis function .lsmb.geeGP = function(object, trms, xlev, grid, vcov.method, valid, idx = seq_along(valid), ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = coef(object) V = .named.vcov(object, vcov.method, valid, idx, ...) if (sum(is.na(bhat)) > 0) nbasis = estimability::nonest.basis(object$qr) else nbasis = estimability::all.estble misc = .std.link.labels(object$family, list()) misc$initMesg = attr(V, "methMesg") dffun = function(k, dfargs) NA dfargs = list() list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } #--------------------------------------------------------------- ### gee objects #### recover.data.gee = recover.data.lm lsm.basis.gee = function(object, trms, xlev, grid, vcov.method = "robust.variance", ...) .lsmb.geeGP(object, trms, xlev, grid, vcov.method, valid = c("robust.variance", "naive.variance")) ### geepack objects #### recover.data.geeglm = recover.data.lm lsm.basis.geeglm = function(object, trms, xlev, grid, vcov.method = "vbeta", ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = coef(object) V = .named.vcov(object$geese, vcov.method, valid = c("vbeta", "vbeta.naiv","vbeta.j1s","vbeta.fij","robust","naive"), idx = c(1,2,3,4,1,2)) if (sum(is.na(bhat)) > 0) nbasis = estimability::nonest.basis(object$qr) else nbasis = estimability::all.estble misc = .std.link.labels(object$family, list()) misc$initMesg = attr(V, "methMesg") dffun = function(k, dfargs) NA dfargs = list() list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } recover.data.geese = function(object, ...) { fcall = object$call # what a pain - we need to reconstruct the terms component args = as.list(fcall[-1]) na.action = object$na.action #trms = terms.formula(fcall$formula) if (!is.null(args$data)) { data = eval(args$data, parent.frame()) trms = terms(model.frame(fcall$formula, data = data)) } else { trms = terms(model.frame(fcall$formula)) } recover.data(fcall, delete.response(trms), na.action, ...) } lsm.basis.geese = function(object, trms, xlev, grid, vcov.method = "vbeta", ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = object$beta V = .named.vcov(object, vcov.method, valid = c("vbeta", "vbeta.naiv","vbeta.j1s","vbeta.fij","robust","naive"), idx = c(1,2,3,4,1,2)) # We don't have the qr component - I'm gonna punt for now if (sum(is.na(bhat)) > 0) warning("There are non-estimable functions, but estimability is NOT being checked") # nbasis = estimability::nonest.basis(object$qr) # else nbasis = estimability::all.estble misc = list() if (!is.null(fam <- object$call$family)) misc = .std.link.labels(eval(fam)(), misc) misc$initMesg = attr(V, "methMesg") dffun = function(k, dfargs) NA dfargs = list() list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } #-------------------------------------------------------------- ### afex package - mixed objects ### # just need to provide an 'lsmeans' method here, assuming Henrik adds the 'data' item ### These are deprecated as of afex 0.14 - now afex has its own lsmeans support # recover.data.mixed = function(object, ...) { # recover.data.merMod(object$full.model, ...) # } # # lsm.basis.mixed = function(object, trms, xlev, grid, ...) { # lsm.basis.merMod(object$full.model, trms, xlev, grid, ...) # } #-------------------------------------------------------------- ### glmmADMB package recover.data.glmmadmb = recover.data.lm lsm.basis.glmmadmb = function (object, trms, xlev, grid, ...) { contrasts = object$contrasts m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = contrasts) bhat = glmmADMB::fixef(object) V = .my.vcov(object, ...) misc = list() if (!is.null(object$family)) { fam = object$family misc$tran = object$link misc$inv.lbl = "response" if (!is.na(pmatch(fam,"binomial"))) misc$inv.lbl = "prob" else if (!is.na(pmatch(fam,"poisson"))) misc$inv.lbl = "rate" } nbasis = estimability::all.estble dffun = function(...) NA list(X = X, bhat = bhat, nbasis = nbasis, V = V, dffun = dffun, dfargs = list(), misc = misc) } # -------------------------------------------------------------- ### Explicit non-support for 'gam' objects (runs, but results are wrong) lsm.basis.gam = function(object, trms, xlev, grid, ...) { stop("Can't handle an object of class", dQuote(class(object)[1]), "\n", .show_supported()) } #-------------------------------------------------------------- ### mgcv package -------------------------------- # gam - OK - inherits from glm # gamm # recover.data.gamm = function(object, ...) { # fcall = object$lme$call # recover.data(fcall, delete.response(terms(object$lme)), object$lme$na.action, ...) # } # # lsm.basis.gamm = function (object, trms, xlev, grid, adjustSigma = TRUE, ...) { # lsm.basis(object$lme, trms, xlev, grid, adjustSigma, ...) # # Doesn't work because needs the matrices in object$lme$data # } ### ----- Auxiliary routines ------------------------- # Provide for vcov. argument in ref.grid call, which could be a function or a matrix .my.vcov = function(object, vcov. = stats::vcov, ...) { if (is.function(vcov.)) vcov. = vcov.(object) else if (!is.matrix(vcov.)) stop("vcov. must be a function or a square matrix") vcov. } # Call this to do the standard stuff with link labels # Returns a modified misc .std.link.labels = function(fam, misc) { if (is.null(fam)) return(misc) misc$tran = fam$link misc$inv.lbl = "response" if (length(grep("binomial", fam$family)) == 1) misc$inv.lbl = "prob" else if (length(grep("poisson", fam$family)) == 1) misc$inv.lbl = "rate" misc } ## Alternative to all.vars, but keeps vars like foo$x and foo[[1]] as-is ## Passes ... to all.vars .all.vars = function(expr, retain = c("\\$", "\\[\\[", "\\]\\]"), ...) { if (!inherits(expr, "formula")) { expr = try(eval(expr), silent = TRUE) if(inherits(expr, "try-error")) { return(character(0)) } } repl = paste("_Av", seq_along(retain), "_", sep = "") for (i in seq_along(retain)) expr = gsub(retain[i], repl[i], expr) subs = switch(length(expr), 1, c(1,2), c(2,1,3)) vars = all.vars(as.formula(paste(expr[subs], collapse = "")), ...) retain = gsub("\\\\", "", retain) for (i in seq_along(retain)) vars = gsub(repl[i], retain[i], vars) vars } ### Not-so-damn-smart replacement of diag() that will ### not be so quick to assume I want an identity matrix ### returns matrix(x) when x is a scalar .diag = function(x, nrow, ncol) { if(is.matrix(x)) diag(x) else if((length(x) == 1) && missing(nrow) && missing(ncol)) matrix(x) else diag(x, nrow, ncol) } lsmeans/R/lsmip.R0000644000175100001440000000744412634421507013417 0ustar hornikusers# lsmip code - interaction plots lsmip = function(object, formula, ...) UseMethod("lsmip") # object - a model object supported by lsmeans # formula - a formula of the form x.factors ~ trace.factors | panel.factors lsmip.default = function(object, formula, type, pch=c(1,2,6,7,9,10,15:20), lty=1, col=NULL, plotit = TRUE, ...) { if (!requireNamespace("lattice")) stop("This function requires the 'lattice' package be installed.") if (length(formula) < 3) formula = reformulate(as.character(formula)[[2]], response = ".single.") ###stop("'formula' must be two-sided, e.g. trace.factor ~ x.factor") ### NEW: Allow lhs to be empty, so then we get a single trace # Glean the parts of ... to use in lsmeans call # arguments allowed to be passed lsa.allowed = c("at","trend","cov.reduce","fac.reduce") xargs = list(...) lsmopts = list(...) for (arg in names(xargs)) { idx = pmatch(arg, lsa.allowed) if (!is.na(idx)) { opt = lsa.allowed[idx] lsmopts[[opt]] = xargs[[arg]] xargs[[arg]] = NULL } } allvars = setdiff(.all.vars(formula), ".single.") lsmopts$object = object lsmopts$specs = reformulate(allvars) lsmo = do.call("lsmeans", lsmopts) if(missing(type)) { type = get.lsm.option("summary")$predict.type if (is.null(type)) type = .get.predict.type(lsmo@misc) } type = .validate.type(type) lsm = predict(lsmo, type = type) lsms = cbind(lsmo@grid, lsmean = lsm) # Set up trace vars and key tvars = .all.vars(update(formula, . ~ 1)) if (all(tvars == ".single.")) { lsms$.single. = 1 my.key = function(tvars) list() } else { my.key = function(tvars) list(space="right", title = paste(tvars, collapse=" * "), points = TRUE, lines=length(lty) > 1, cex.title=1) } tv = do.call(paste, lsms[tvars]) lsms$tvar = factor(tv, levels=unique(tv)) # figure out 'x' and 'by' vars rhs = strsplit(as.character(formula[3]), "\\|")[[1]] xvars = .all.vars(reformulate(rhs[[1]])) xv = do.call(paste, lsms[xvars]) lsms$xvar = factor(xv, levels = unique(xv)) lsms = lsms[order(lsms$xvar), ] plotform = lsmean ~ xvar # see if we have any 'by' vars if (length(rhs) > 1) { byvars = .all.vars(reformulate(rhs[[2]])) plotform = as.formula(paste("lsmean ~ xvar |", paste(byvars, collapse="*"))) } # The strips the way I want them my.strip = lattice::strip.custom(strip.names = c(TRUE,TRUE), strip.levels = c(TRUE,TRUE), sep = " = ") TP = TP.orig = lattice::trellis.par.get() TP$superpose.symbol$pch = pch TP$superpose.line$lty = lty if (!is.null(col)) TP$superpose.symbol$col = TP$superpose.line$col = col lattice::trellis.par.set(TP) xlab = ifelse(is.null(xargs$xlab), paste("Levels of", paste(xvars, collapse=" * ")), xargs$xlab) rspLbl = paste("Predicted", ifelse(is.null(lsmo@misc$inv.lbl), "response", lsmo@misc$inv.lbl)) ylab = ifelse(is.null(xargs$ylab), ifelse(type == "response", rspLbl, "Linear prediction"), xargs$ylab) # remove the unneeded stuff from xlabs xargs = xargs[setdiff(names(xargs), c("xlab","ylab"))] plotspecs = list(x = plotform, data = lsms, groups = ~ tvar, xlab = xlab, ylab = ylab, strip = my.strip, auto.key = my.key(tvars), type=c("p","l")) grobj = do.call(lattice::xyplot, c(plotspecs, xargs)) if (plotit) print(grobj) attr(lsms, "lattice") = grobj lattice::trellis.par.set(TP.orig) invisible(lsms) } lsmeans/R/glht-support.R0000644000175100001440000000731412634421507014737 0ustar hornikusers### Code for an enhancement of 'glht' in 'multcomp' package ### Provides for using 'lsm' in similar way to 'mcp' ### This is implemented via the class "lsmlf" -- linear functions for lsmeans ### (also oddly reminiscent of an old Lucky Strike commercial, LSMFT) # lsm(specs) will be used as 'linfct' argument in glht # all we need to do is class it and save the arguments lsm <- function(...) { result <- list(...) class(result) <- "lsmlf" result } # New S3 method for lsmlf objects glht.lsmlf <- function(model, linfct, ...) { # Just grab the arguments passed to lsm and call lsmeans linfct$object <- ref.grid(model) lsmo <- do.call("lsmeans", linfct) if (is.list(lsmo)) lsmo = lsmo[[length(lsmo)]] # Then call the method for lsmobj glht(model, lsmo, ...) } # S3 method for an lsmobj or ref.grid # Note: model is redundant, really, so can be omitted glht.ref.grid <- function(model, linfct, by, ...) { if (!requireNamespace("multcomp")) stop(sQuote("glht")," requires ", dQuote("multcomp"), " to be installed") object = linfct # so I don't get confused if (missing(model)) model = .cls.list("lsmwrap", object = object) args = list(model = model, ...) # add a df value if not supplied if (is.null(args$df)) { df = summary(linfct)$df if(any(!is.na(df))) { args$df = max(1, as.integer(mean(df, na.rm=TRUE) + .25)) message("Note: df set to ", args$df) } } if (missing(by)) by = object@misc$by.vars nms = setdiff(names(object@grid), c(by, ".offset.", ".freq.", ".wgt.")) if (is.null(object@misc$estHook)) lf = object@linfct else # custom estimation setup - use the grid itself as the parameterization lf = diag(1, nrow(object@linfct)) dimnames(lf)[[1]] = as.character(interaction(object@grid[, nms], sep=", ")) if (is.null(by)) { args$linfct = lf return(do.call("glht", args)) } # (else...) by.rows = .find.by.rows(object@grid, by) result = lapply(by.rows, function(r) { args$linfct = lf[r, , drop=FALSE] do.call("glht", args) }) bylevs = lapply(by, function(byv) unique(object@grid[[byv]])) names(bylevs) = by bygrid = do.call("expand.grid", bylevs) levlbls = lapply(by, function(byv) paste(byv, "=", bygrid[[byv]])) levlbls$sep = ", " names(result) = do.call("paste", levlbls) class(result) = c("glht.list", "list") result } ### as. glht -- convert my object to glht object as.glht <- function(object, ...) UseMethod("as.glht") as.glht.default <- function(object, ...) stop("Cannot convert an object of class ", sQuote(class(object)[1]), " to a ", sQuote("glht"), " object") as.glht.ref.grid <- function(object, ...) glht( , object, ...) as.glht.lsm.list <- function(object, ..., which = 1) as.glht(object[[which]], ...) # S3 modelparm method for lsmwrap (S3 wrapper for an lsmobj - see glht.lsmobj) modelparm.lsmwrap <- function(model, coef., vcov., df, ...) { object = model$object if (is.null(object@misc$estHook)) { bhat = object@bhat V = object@V } else { # Have custom vcov and est methods. Use the grid itself as parameterization bhat = predict(object) V = vcov(object) } if(missing(df) || is.na(df)) df = 0 .cls.list("modelparm", coef = bhat, vcov = V, df = df, estimable = !is.na(bhat)) # This is NOT what we mean by 'estimable', but it is what glht wants... } # S3 methods for glht.list summary.glht.list = function(object, ...) lapply(object, summary, ...) lsmeans/R/countreg-support.R0000644000175100001440000002356212634421507015632 0ustar hornikusers# Support for zeroinfl and hurdle models (pscl [& future countreg package?]) # We'll support two optional arguments: # mode -- type of result required # lin.pred -- TRUE: keep linear predictor and link # FALSE: back-transform (default) # # With lin.pred = FALSE and mode %in% c("response", "count", "zero"), we # will return comparable results to predict(..., type = mode) # with mode = "prob0", same results as predict(..., type = "prob")[, 1] # # lin.pred only affects results for mode %in% c("count", "zero"). # When lin.pred = TRUE, we get the actual linear predictor and link function # for that part of the model. # ----- zeroinfl objects ----- recover.data.zeroinfl = function(object, mode = c("response", "count", "zero", "prob0"), ...) { fcall = object$call mode = match.arg(mode) if (mode %in% c("count", "zero")) trms = delete.response(terms(object, model = mode)) else ### mode = %in% c("response", "prob0") trms = delete.response(object$terms$full) # Make sure there's an offset function available env = new.env(parent = attr(trms, ".Environment")) env$offset = function(x) x attr(trms, ".Environment") = env recover.data(fcall, trms, object$na.action, ...) } lsm.basis.zeroinfl = function(object, trms, xlev, grid, mode = c("response", "count", "zero", "prob0"), lin.pred = FALSE, ...) { mode = match.arg(mode) m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) if (mode %in% c("count", "zero")) { contr = object$contrasts[[mode]] X = model.matrix(trms, m, contrasts.arg = contr) bhat = coef(object, model = mode) V = .pscl.vcov(object, model = mode, ...) if (mode == "count") misc = list(tran = "log", inv.lbl = "count") else misc = list(tran = object$link, inv.lbl = "prob") if (!lin.pred) { # back-transform the results lp = as.numeric(X %*% bhat + .get.offset(trms, grid)) lnk = make.link(misc$tran) bhat = lnk$linkinv(lp) delta = .diag(lnk$mu.eta(lp)) %*% X V = delta %*% tcrossprod(V, delta) X = diag(1, length(bhat)) misc = list(offset.mult = 0) } } else { ## "response", "prob0" trms1 = delete.response(terms(object, model = "count")) off1 = .get.offset(trms1, grid) contr1 = object$contrasts[["count"]] X1 = model.matrix(trms1, m, contrasts.arg = contr1) b1 = coef(object, model = "count") lp1 = as.numeric(X1 %*% b1 + off1) mu1 = exp(lp1) trms2 = delete.response(terms(object, model = "zero")) off2 = .get.offset(trms2, grid) contr2 = object$contrasts[["zero"]] X2 = model.matrix(trms2, m, contrasts.arg = contr2) b2 = coef(object, model = "zero") lp2 = as.numeric(X2 %*% b2) + off2 mu2 = object$linkinv(lp2) mu2prime = stats::make.link(object$link)$mu.eta(lp2) if(mode == "response") { delta = .diag(mu1) %*% cbind(.diag(1 - mu2) %*% X1, .diag(-mu2prime) %*% X2) bhat = (1 - mu2) * mu1 } else { # mode = "prob0" p0 = 1 - .prob.gt.0(object$dist, mu1, object$theta) dp0 = - .dprob.gt.0(object$dist, mu1, object$theta, "log", lp1) bhat = (1 - mu2) * p0 + mu2 delta = cbind(.diag((1 - mu2) * dp0) %*% X1, .diag(mu2prime * (1 - p0)) %*% X2) } V = delta %*% tcrossprod(.pscl.vcov(object, model = "full", ...), delta) X = diag(1, length(bhat)) misc = list(offset.mult = 0) } nbasis = estimability::all.estble dffun = function(k, dfargs) NA dfargs = list() list(X = X, bhat = bhat, nbasis = nbasis, V = V, dffun = dffun, dfargs = dfargs, misc = misc) } #### Support for hurdle models recover.data.hurdle = function(object, mode = c("response", "count", "zero", "prob0"), ...) { fcall = object$call mode = match.arg(mode) if (mode %in% c("count", "zero")) trms = delete.response(terms(object, model = mode)) else ### mode = "mean" or "prob.ratio" trms = delete.response(object$terms$full) # Make sure there's an offset function available env = new.env(parent = attr(trms, ".Environment")) env$offset = function(x) x attr(trms, ".Environment") = env recover.data(fcall, trms, object$na.action, ...) } # see expl notes afterward for notations in some of this lsm.basis.hurdle = function(object, trms, xlev, grid, mode = c("response", "count", "zero", "prob0"), lin.pred = FALSE, ...) { mode = match.arg(mode) m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) if ((lin.pred && mode %in% c("count", "zero")) || (!lin.pred && mode %in% c("count", "prob0"))) { model = ifelse(mode == "count", "count", "zero") contr = object$contrasts[[model]] X = model.matrix(trms, m, contrasts.arg = contr) bhat = coef(object, model = model) V = .pscl.vcov(object, model = model, ...) misc = switch(object$dist[[model]], binomial = list(tran = object$link, inv.lbl = "prob"), list(tran = "log", inv.lbl = "count")) if (!lin.pred) { # back-transform lp = as.numeric(X %*% bhat + .get.offset(trms, grid)) lnk = make.link(misc$tran) bhat = lnk$linkinv(lp) if (mode != "prob0") { delta = .diag(lnk$mu.eta(lp)) %*% X } else { bhat = 1 - .prob.gt.0(object$dist$zero, bhat, object$theta["zero"]) db = - .dprob.gt.0(object$dist$zero, bhat, object$theta["zero"], misc$tran, lp) delta = .diag(db) %*% X } V = delta %*% tcrossprod(V, delta) X = diag(1, length(bhat)) misc = list(offset.mult = 0) } } else { ### "zero" or "response" with implied lin.pred = FALSE trms1 = delete.response(terms(object, model = "count")) off1 = .get.offset(trms1, grid) contr1 = object$contrasts[["count"]] X1 = model.matrix(trms1, m, contrasts.arg = contr1) b1 = coef(object, model = "count") mu1 = as.numeric(exp(X1 %*% b1 + off1)) theta1 = object$theta["count"] p1 = .prob.gt.0(object$dist$count, mu1, theta1) dp1 = .dprob.gt.0(object$dist$count, mu1, theta1, "", 0) # binomial won't happen trms2 = delete.response(terms(object, model = "zero")) off2 = .get.offset(trms2, grid) contr2 = object$contrasts[["zero"]] X2 = model.matrix(trms2, m, contrasts.arg = contr2) b2 = coef(object, model = "zero") lp2 = as.numeric(X2 %*% b2 + off2) mu2 = switch(object$dist$zero, binomial = object$linkinv(lp2), exp(lp2) ) theta2 = object$theta["zero"] p2 = .prob.gt.0(object$dist$zero, mu2, theta2) dp2 = .dprob.gt.0(object$dist$zero, mu2, theta2, object$link, lp2) if (mode == "response") { bhat = p2 * mu1 / p1 delta = cbind(.diag(bhat*(1 - mu1 * dp1 / p1)) %*% X1, .diag(mu1 * dp2 / p1) %*% X2) } else { ## mode == "zero" bhat = p2 / p1 delta = cbind(.diag(-p2 * dp1 / p1^2) %*% X1, .diag(dp2 / p1) %*% X2) } V = delta %*% tcrossprod(.pscl.vcov(object, model = "full", ...), delta) X = .diag(1, length(bhat)) misc = list(estName = mode, offset.mult = 0) } nbasis = estimability::all.estble dffun = function(k, dfargs) object$df.residual dfargs = list() list(X = X, bhat = bhat, nbasis = nbasis, V = V, dffun = dffun, dfargs = dfargs, misc = misc) } # utility for prob (Y > 0 | dist, mu, theta) .prob.gt.0 = function(dist, mu, theta) { switch(dist, binomial = mu, poisson = 1 - exp(-mu), negbin = 1 - (theta / (mu + theta))^theta, geometric = 1 - 1 / (1 + mu) ) } # utility for d/d(eta) prob (Y > 0 | dist, mu, theta) .dprob.gt.0 = function(dist, mu, theta, link, lp) { switch(dist, binomial = stats::make.link(link)$mu.eta(lp), poisson = mu * exp(-mu), negbin = mu * (theta /(mu + theta))^(1 + theta), geometric = mu / (1 + mu)^2 ) } # special version of .my.vcov that accepts (and requires!) model argument .pscl.vcov = function(object, model, vcov. = stats::vcov, ...) { if (is.function(vcov.)) vcov. = vcov.(object, model = model) else if (!is.matrix(vcov.)) stop("vcov. must be a function or a square matrix") vcov. } # Explanatory notes for hurdle models # ----------------------------------- # We have a linear predictor eta = X%*%beta + offset # mu = h(eta) where h is inverse link (usually exp but not always) # Define p = P(Y > 0 | mu). This comes out to... # binomial: mu # poisson: 1 - exp(-mu) # negbin: 1 - (theta/(mu+theta))^theta # geometric: 1 - 1/(mu+1) # Define dp = dp/d(eta). Note - when h(mu)=exp(mu) we have dp = mu*dp/d(mu) # binomial: h'(eta) # poisson: mu*exp(-mu) # negbin: mu*(theta/(mu+theta))^(theta+1) # geometric: mu/(mu+1)^2 # # This gives us what we need to find the estimates and apply the delta method # In the code we index these notations with 1 (count model) and 2 (zero model) # And we treat theta1 and theta2 as constants # #!!! In theory, above seems correct, and estimates match those from predict.hurdle. #!!! But SEs don't seem right. #!!! They do seem right though if I omit the factor of mu in dp #!!! when link is log lsmeans/R/cld.lsm.R0000644000175100001440000000651412634421507013624 0ustar hornikusers# Runs the function multicompLetters from the multcompView package # returns an error if not installed .mcletters = function(..., Letters=c("1234567890",LETTERS,letters)) { if(!requireNamespace("multcompView", quietly = TRUE)) { message("The 'multcompView' package must be installed to use cld methods") return (list(monospacedLetters = "?")) } # Expand strings to individual letters Letters = as.character(unlist(sapply(Letters, function(stg) { sapply(seq_len(nchar(stg)), function(i) substr(stg, i, i)) }))) result = multcompView::multcompLetters(..., Letters=Letters) if (is.null(result$monospacedLetters)) result$monospacedLetters = result$Letters result } # S3 method for ref.grid cld.ref.grid = function(object, details=FALSE, sort=TRUE, by, alpha=.05, Letters = c("1234567890",LETTERS,letters), ...) { lsmtbl = summary(object, ...) if(missing(by)) by = object@misc$by.vars if (sort) { args = list() for (nm in by) args[[nm]] = lsmtbl[[nm]] args$.lsm. = lsmtbl[[attr(lsmtbl, "estName")]] ord = do.call("order", args) lsmtbl = lsmtbl[ord, ] object@grid = object@grid[ord, , drop=FALSE] object@linfct = object@linfct[ord, , drop = FALSE] } attr(lsmtbl, "by.vars") = by object@misc$by.vars = by prwise = contrast(object, "revpairwise", by=by) pwtbl = test(prwise, ...) p.boo = (pwtbl$p.value < alpha) if(is.null(by)) { by.rows = list(seq_len(nrow(pwtbl))) by.out = list(seq_len(nrow(lsmtbl))) } else { by.rows = .find.by.rows(pwtbl, by) by.out = .find.by.rows(lsmtbl, by) } # Create comps matrix reflecting order generated by pairwise.lsmc icol = jcol = numeric(0) # create fake row indexes in revpairwise order for use by .mcletters k = length(by.out[[1]]) for (i in 2:k) { icol = c(icol, seq_len(i-1)) jcol = c(jcol, rep(i, i-1)) } na.p = which(is.na(p.boo)) # Take care of non-est cases. This is surprisingly complicated, # because it's possible we have some lsmeans that are non-est # but comparisons are est'ble. So cases to exclude must be missing in # the table of means, AND appar somewhere in the indexes of NA p values # All that said, it still messes up because I didn't track the indexes correctly # excl.rows = intersect(which(is.na(lsmtbl$SE)), union(icol[na.p], jcol[na.p])) # So I'll just go with which est's are missing excl.rows = which(is.na(lsmtbl$SE)) p.boo[na.p] = FALSE labs = paste(icol,jcol,sep="-") ltrs = rep("", nrow(lsmtbl)) for (i in seq_len(length(by.rows))) { pb = p.boo[by.rows[[i]]] names(pb) = labs mcl = .mcletters(pb, Letters=Letters)$monospacedLetters ltrs[by.out[[i]]] = paste(" ", mcl, sep="") } # any missing estimates get blanks... ltrs[excl.rows] = "" lsmtbl[[".group"]] = ltrs attr(lsmtbl, "mesg") = c(attr(lsmtbl,"mesg"), attr(pwtbl, "mesg"), paste("significance level used: alpha =", alpha)) if (details) list(lsmeans = lsmtbl, comparisons = pwtbl) else lsmtbl } lsmeans/R/pmmeans.R0000644000175100001440000000211112634421507013715 0ustar hornikusers### Support for overriding "ls" with "pm" in names ### general-purpose wrapper for creating pmxxxxx functions .pmwrap = function(lsfcn, ...) { result = lsfcn(...) if (inherits(result, "ref.grid")) result = .sub.ls.pm(result) else if(inherits(result, "lsm.list")) { for (i in seq_along(result)) result[[i]] = .sub.ls.pm(result[[i]]) names(result) = gsub("^ls", "pm", names(result)) } result } # returns an updated ref.grid or lsmobj with setName "ls..." replaced by "pm..." .sub.ls.pm = function(object) { nm = object@misc$estName update(object, estName = gsub("^ls", "pm", nm)) } ### Exported implementations pmmeans = function(...) .pmwrap(lsmeans, ...) # uh, maybe not... pmms = pmmeans pmtrends = function(...) .pmwrap(lstrends, ...) pmmip = function(...) lsmip(...) pmm = function(...) lsm(...) pmmobj = function(...) .pmwrap(lsmobj, ...) pmm.options = function(...) lsm.options(...) get.pmm.option = function(...) get.lsm.option(...) lsmeans/R/plot.lsm.R0000644000175100001440000002453012634421507014036 0ustar hornikusers# S3 plot method for lsmobj objects (NOT ref.grid as relies on pri.fac attribute etc.) # ... are arguments sent to update() plot.lsmobj = function(x, y, type, intervals = TRUE, comparisons = FALSE, alpha = .05, adjust = "tukey", int.adjust = "none", ...) { if(!missing(type)) object = update(x, predict.type = type, ..., silent = TRUE) else object = update(x, ..., silent = TRUE) if (missing(int.adjust)) { int.adjust = object@misc$adjust if (is.null(int.adjust)) int.adjust = "none" } summ = summary(object, infer = c(TRUE, FALSE), adjust = int.adjust) estName = attr(summ, "estName") extra = NULL if(comparisons) { extra = object extra@misc$comp.alpha = alpha extra@misc$comp.adjust = adjust } .plot.srg(x=summ, intervals = intervals, extra = extra, ...) } # May use in place of plot.lsmobj but no control over level etc. # extra is a placeholder for comparison-interval stuff plot.summary.ref.grid = function(x, y, horizontal = TRUE, xlab, ylab, layout, ...) { .plot.srg (x, y, horizontal, xlab, ylab, layout, ...) } # Workhorse for plot.summary.ref.grid .plot.srg = function(x, y, horizontal = TRUE, xlab, ylab, layout, intervals = TRUE, extra = NULL, ...) { if (!requireNamespace("lattice")) stop("This function requires the 'lattice' package be installed.") summ = x # so I don't get confused estName = attr(summ, "estName") clNames = attr(summ, "clNames") if (is.null(clNames)) { warning("No information available to display confidence limits") lcl = ucl = summ[[estName]] } else { lcl = summ[[clNames[1]]] ucl = summ[[clNames[2]]] } # Panel functions... prepanel.ci = function(x, y, horizontal=TRUE, intervals=TRUE, lcl, ucl, subscripts, ...) { x = as.numeric(x) lcl = as.numeric(lcl[subscripts]) ucl = as.numeric(ucl[subscripts]) if (!intervals) # no special scaling needed list() else if (horizontal) list(xlim = range(x, ucl, lcl, finite = TRUE)) else list(ylim = range(y, ucl, lcl, finite = TRUE)) } panel.ci <- function(x, y, horizontal=TRUE, intervals=TRUE, lcl, ucl, lcmpl, rcmpl, subscripts, pch = 16, lty = dot.line$lty, lwd = dot.line$lwd, col = dot.symbol$col, col.line = dot.line$col, ...) { dot.line <- lattice::trellis.par.get("dot.line") dot.symbol <- lattice::trellis.par.get("dot.symbol") x = as.numeric(x) y = as.numeric(y) lcl = as.numeric(lcl[subscripts]) ucl = as.numeric(ucl[subscripts]) compare = !is.null(lcmpl) if(compare) { lcmpl = as.numeric(lcmpl[subscripts]) rcmpl = as.numeric(rcmpl[subscripts]) } if(horizontal) { lattice::panel.abline(h = unique(y), col = col.line, lty = lty, lwd = lwd) if(intervals) lattice::panel.arrows(lcl, y, ucl, y, col = col, length = .6, unit = "char", angle = 90, code = 3) if(compare) { s = (x > min(x)) lattice::panel.arrows(lcmpl[s], y[s], x[s], y[s], length = .5, unit = "char", code = 1, col = "red", type = "closed", fill="red") s = (x < max(x)) lattice::panel.arrows(rcmpl[s], y[s], x[s], y[s], length = .5, unit = "char", code = 1, col = "red", type = "closed", fill="red") } } else { lattice::panel.abline(v = unique(x), col = col.line, lty = lty, lwd = lwd) if(intervals) lattice::panel.arrows(x, lcl, x, ucl, col=col, length = .6, unit = "char", angle = 90, code = 3) if(compare) { s = (y > min(y)) lattice::panel.arrows(x[s], lcmpl[s], x[s], y[s], length = .5, unit = "char", code = 1, col = "red", type = "closed", fill="red") s = (y < max(y)) lattice::panel.arrows(x[s], rcmpl[s], x[s], y[s], length = .5, unit = "char", code = 1, col = "red", type = "closed", fill="red") } } lattice::panel.xyplot(x, y, pch=16, ...) } my.strip = lattice::strip.custom(strip.names = c(TRUE,TRUE), strip.levels = c(TRUE,TRUE), sep = " = ") priv = attr(summ, "pri.vars") pf = do.call(paste, summ[priv]) summ$pri.fac = factor(pf, levels=unique(pf)) chform = ifelse(horizontal, paste("pri.fac ~", estName), paste(estName, "~ pri.fac")) byv = attr(summ, "by.vars") if (!is.null(byv)) { chform = paste(chform, "|", paste(byv, collapse="*")) lbv = do.call("paste", summ[byv]) # strings for matching by variables ubv = unique(lbv) } else { lbv = rep(1, nrow(summ)) ubv = 1 } # Obtain comparison limits if (!is.null(extra)) { # we need to work on the linear predictor scale # typeid = 1 -> response, 2 -> other typeid = pmatch(extra@misc$predict.type, "response", nomatch = 2) if(length(typeid) < 1) typeid = 2 if (typeid == 1) est = predict(extra, type = "lp") else est = summ[[estName]] alpha = extra@misc$comp.alpha adjust = extra@misc$comp.adjust psumm = confint(pairs(extra), level = 1 - alpha, type = "lp", adjust = adjust) k = ncol(psumm) del = (psumm[[k]] - psumm[[k-1]]) / 4 # half the halfwidth, on lp scale diff = psumm[[attr(psumm, "estName")]] overlap = apply(psumm[ ,(k-1):k], 1, function(x) 2*min(-x[1],x[2])/(x[2]-x[1])) # figure out by variables and indexes (lbv, ubv already defined) if(is.null(byv)) pbv = rep(1, nrow(psumm)) else pbv = do.call("paste", psumm[byv]) neach = length(lbv) / length(ubv) # indexes for pairs results -- est[id1] - est[id2] id1 = rep(seq_len(neach-1), rev(seq_len(neach-1))) id2 = unlist(sapply(seq_len(neach-1), function(x) x + seq_len(neach-x))) # list of psumm row numbers involved in each summ row involved = lapply(seq_len(neach), function(x) union(which(id2==x), which(id1==x))) # initialize arrays mind = numeric(length(lbv)) # for minima of del llen = rlen = numeric(neach) # for left and right arrow lengths npairs = length(id1) iden = diag(rep(1, 2*neach)) for (by in ubv) { d = del[pbv == by] rows = which(lbv == by) for(i in seq_len(neach)) mind[rows[i]] = min(d[involved[[i]]]) # Set up regression equations to match arrow overlaps with interval overlaps # We'll add rows later (with weights 1) to match with mind values lmat = rmat = matrix(0, nrow = npairs, ncol = neach) y = numeric(npairs) v1 = 1 - overlap[pbv == by] dif = diff[pbv == by] for (i in seq_len(npairs)) { #wgt = 6 * max(0, ifelse(v1[i] < 1, v1[i], 2-v1[i])) wgt = 3 + 20 * max(0, .5 - (1 - v1[i])^2) # really this is sqrt of weight if (dif[i] > 0) # id2 <-----> id1 lmat[i, id1[i]] = rmat[i, id2[i]] = wgt*v1[i] else # id1 <-----> id2 rmat[i, id1[i]] = lmat[i, id2[i]] = wgt*v1[i] y[i] = wgt * abs(dif[i]) } X = rbind(cbind(lmat, rmat),iden) y = c(y, rep(mind[rows], 2)) soln = qr.coef(qr(X), y) ll = llen[rows] = soln[seq_len(neach)] rl = rlen[rows] = soln[neach + seq_len(neach)] # Perhaps put some kind of a check here? for (i in seq_len(npairs)) { v = 1 - v1[i] obsv = 1 - abs(dif[i]) / ifelse(dif[i] > 0, ll[id1[i]] + rl[id2[i]], rl[id1[i]] + ll[id2[i]]) if (v*obsv < 0) message("Comparison discrepancy in group ", by, ", ", psumm[i, 1], ":\n Target overlap = ", round(v, 4), ", overlap on graph = ", round(obsv, 4)) } } # shorten arrows that go past the data range rng = range(est) ii = which(est - llen < rng[1]) llen[ii] = est[ii] - rng[1] ii = which(est + rlen > rng[2]) rlen[ii] = rng[2] - est[ii] invtran = I if (typeid == 1) { tran = extra@misc$tran if(is.character(tran)) { link = try(make.link(tran), silent=TRUE) if (!inherits(link, "try-error")) invtran = link$linkinv } else if (is.list(tran)) invtran = tran$linkinv } lcmpl = invtran(est - llen) rcmpl = invtran(est + rlen) } else lcmpl = rcmpl = NULL if (missing(layout)) { layout = c(1, length(ubv)) if(!horizontal) layout = rev(layout) } facName = paste(priv, collapse=":") form = as.formula(chform) if (horizontal) { if (missing(xlab)) xlab = estName if (missing(ylab)) ylab = facName lattice::dotplot(form, prepanel=prepanel.ci, panel=panel.ci, strip = my.strip, horizontal = TRUE, ylab = ylab, xlab = xlab, data = summ, intervals = intervals, lcl=lcl, ucl=ucl, lcmpl=lcmpl, rcmpl=rcmpl, layout = layout, ...) } else { if (missing(xlab)) xlab = facName if (missing(ylab)) ylab = estName lattice::dotplot(form, prepanel=prepanel.ci, panel=panel.ci, strip = my.strip, horizontal = FALSE, xlab = xlab, ylab = ylab, data = summ, intervals = intervals, lcl=lcl, ucl=ucl, lcmpl=lcmpl, rcmpl=rcmpl, layout = layout, ...) } } lsmeans/R/lsmeans.R0000644000175100001440000005445712634421507013743 0ustar hornikusers# Utility to pick out the args that can be passed to a function .args.for.fcn = function(fcn, args) { oknames = names(as.list(args(fcn))) mat = pmatch(names(args), oknames) args = args[!is.na(mat)] mat = mat[!is.na(mat)] names(args) = oknames[mat] args } # Create a list and give it class class.name .cls.list <- function(class.name, ...) { result <- list(...) class(result) <- c(class.name, "list") result } setMethod("show", "lsmobj", function(object) print(summary(object)) ) ### lsmeans S3 generics ... ### I am opting to use S3 methods, cascaded for two arguments ### rather than messing with S4 methods lsmeans = function(object, specs, ...) UseMethod("lsmeans", specs) # lsmeans.default = function(object, specs, ...) { rgargs = list(object = object, ...) ####.args.for.fcn(ref.grid, list(object=object, ...)) rgargs$options = NULL # don't pass options to ref.grid RG = do.call("ref.grid", rgargs) lsargs = list(object = RG, specs = specs, ...) #for (nm in names(rgargs)[-1]) lsargs[[nm]] = NULL do.call("lsmeans", lsargs)###lsmeans(RG, specs, ...) } lsmeans.formula = function(object, specs, contr.list, trend, ...) { if (!missing(trend)) return(lstrends(object, specs, var=trend, ...)) if(length(specs) == 2) { # just a rhs by = .find.by(as.character(specs[2])) lsmeans(object, .all.vars(specs), by = by, ...) } else { # lsms = lsmeans(object, .all.vars(specs[-2]), ...) contr.spec = .all.vars(specs[-3])[1] by = .find.by(as.character(specs[3])) # Handle old-style case where contr is a list of lists if (!missing(contr.list)) { cmat = contr.list[[contr.spec]] if (!is.null(cmat)) contr.spec = cmat } lsmeans(object, specs = .all.vars(specs[-2]), by = by, contr = contr.spec, ...) } } # List of specs lsmeans.list = function(object, specs, ...) { result = list() nms = names(specs) # Format a string describing the results .make.desc = function(meth, pri, by) { pri = paste(pri, collapse = ", ") desc = paste(meth, "of", pri) if (!is.null(by)) { by = paste(by, collapse = ", ") desc = paste(desc, "|", by) } desc } for (i in seq_len(length(specs))) { res = lsmeans(object=object, specs = specs[[i]], ...) nm = nms[i] if (is.data.frame(res)) { # happens e.g. when cld is used if (is.null(nm)) nm = .make.desc("summary", attr(res, "pri.vars"), attr(res, "by.vars")) result[[nm]] = res } else if (is.list(res)) { for (j in seq_len(length(res))) { m = res[[j]]@misc if (is.null(nm)) names(res)[j] = .make.desc(m$methDesc, m$pri.vars, m$by.vars) else names(res)[j] = paste(nm, m$methDesc) } result = c(result,res) } else{ if (is.null(nm)) nm = .make.desc(res@misc$methDesc, res@misc$pri.vars, res@misc$by.vars) result[[nm]] = res } } class(result) = c("lsm.list", "list") result } # Generic for after we've gotten specs in character form lsmeans.character = function(object, specs, ...) { UseMethod("lsmeans.character")####, object) } # Needed for model objects lsmeans.character.default = function(object, specs, ...) lsmeans.default(object, specs, ...) # Method for a ref.grid -- all methods will get us here eventually lsmeans.character.ref.grid = function(object, specs, by = NULL, fac.reduce = function(coefs) apply(coefs, 2, mean), contr, options = getOption("lsmeans")$lsmeans, weights, ...) { RG = object facs = union(specs, by) # Figure out the structure of the grid wgt = RG@grid[[".wgt."]] if(all(zapsmall(wgt) == 0)) wgt = wgt + 1 ### repl all zero wgts with 1 dims = sapply(RG@levels, length) row.idx = array(seq_len(nrow(RG@linfct)), dims) use.mars = match(facs, names(RG@levels)) # which margins to use avgd.mars = setdiff(seq_along(dims)[dims>1], use.mars) # margins that we average over # Reconcile weights, if there are any margins left if ((length(avgd.mars) > 0) && !missing(weights)) { if (is.character(weights)) { if (is.null(wgt)) message("Weighting information not available -- deferring to fac.reduce") else { wopts = c("equal","proportional","outer","cells","show.levels","invalid") weights = switch(wopts[pmatch(weights, wopts, 5)], equal = rep(1, prod(dims[avgd.mars])), proportional = as.numeric(plyr::aaply(row.idx, avgd.mars, function(idx) sum(wgt[idx]))), outer = { ftbl = plyr::aaply(row.idx, avgd.mars, function(idx) sum(wgt[idx]), .drop = FALSE) w = N = sum(ftbl) for (d in seq_along(dim(ftbl))) w = outer(w, plyr::aaply(ftbl, d, sum) / N) as.numeric(w) }, cells = "fq", show.levels = { cat("lsmeans are obtained by averaging over these factor combinations\n") return(do.call(expand.grid, RG@levels[avgd.mars])) }, invalid = stop("Invalid 'weights' option: '", weights, "'") ) } } if (is.matrix(weights)) { wtrow = 0 fac.reduce = function(coefs) { wtmat = .diag(weights[wtrow+1, ]) / sum(weights[wtrow+1, ]) ans = apply(wtmat %*% coefs, 2, sum) wtrow <<- (1 + wtrow) %% nrow(weights) ans } } else if (is.numeric(weights)) { wtmat = .diag(weights) wtsum = sum(weights) if (wtsum <= 1e-8) wtsum = NA fac.reduce = function(coefs) { if (nrow(coefs) != nrow(wtmat)) stop("Nonconforming number of weights -- need ", nrow(coefs)) apply(wtmat %*% coefs, 2, sum) / wtsum } } } # Get the required factor combs levs = list() for (f in facs) { levs[[f]] = RG@levels[[f]] if (is.null(levs[[f]])) stop(paste("No variable named", f, "in the reference grid")) } combs = do.call("expand.grid", levs) if (!missing(weights) && (weights == "fq")) K = plyr::alply(row.idx, use.mars, function(idx) { fq = RG@grid[[".wgt."]][idx] apply(.diag(fq) %*% RG@linfct[idx, , drop=FALSE], 2, sum) / sum(fq) }) else K = plyr::alply(row.idx, use.mars, function(idx) { fac.reduce(RG@linfct[idx, , drop=FALSE]) }) linfct = t(as.matrix(as.data.frame(K))) row.names(linfct) = NULL if(.some.term.contains(union(facs, RG@roles$trend), RG@model.info$terms)) message("NOTE: Results may be misleading due to involvement in interactions") # Figure offset, if any if (".offset." %in% names(RG@grid)) { combs[[".offset."]] = as.numeric(plyr::aaply(row.idx, use.mars, function(idx) fac.reduce(as.matrix(RG@grid[idx, ".offset.", drop=FALSE])))) } avgd.over = names(RG@levels[avgd.mars]) # Update .wgt column of grid, if it exists if (!is.null(wgt)) { combs[[".wgt."]] = as.numeric(plyr::aaply(row.idx, use.mars, function(idx) sum(wgt[idx]))) } RG@roles$responses = character() RG@misc$famSize = nrow(linfct) if(RG@misc$estName == "prediction") RG@misc$estName = "lsmean" RG@misc$adjust = "none" RG@misc$infer = c(TRUE,FALSE) RG@misc$pri.vars = setdiff(facs, by) RG@misc$by.vars = by RG@misc$avgd.over = union(RG@misc$avgd.over, avgd.over) RG@misc$methDesc = "lsmeans" RG@roles$predictors = names(levs) result = new("lsmobj", RG, linfct = linfct, levels = levs, grid = combs) if(!is.null(options)) { options$object = result result = do.call("update.ref.grid", options) } if (missing(contr)) result else { # return a list with lsmeans and contrasts if (is.character(contr) && contr == "cld") { # TO DO: provide for passing dots to cld return(cld(result, by = by)) } ctrs = contrast(result, method = contr, by, ...) .cls.list("lsm.list", lsmeans = result, contrasts = ctrs) } } # utility to parse 'by' part of a formula .find.by = function(rhs) { b = strsplit(rhs, "\\|")[[1]] if (length(b) > 1) .all.vars(as.formula(paste("~",b[2]))) else NULL } ### 'contrast' S3 generic and method contrast = function(object, ...) UseMethod("contrast") contrast.ref.grid = function(object, method = "eff", by, adjust, offset = NULL, name = "contrast", options = getOption("lsmeans")$contrast, ...) { args = object@grid args[[".offset."]] = NULL args[[".wgt."]] = NULL # ignore auxiliary stuff in labels, etc. if(missing(by)) by = object@misc$by.vars if (!is.null(by)) { by.rows = .find.by.rows(args, by) bylevs = args[, by, drop=FALSE] args = args[by.rows[[1]], , drop=FALSE] for (nm in by) args[[nm]] = NULL } args$sep = "," levs = do.call("paste", args) if (is.list(method)) { cmat = as.data.frame(method, optional = TRUE) # I have no clue why they named that argument 'optional', # but setting it to TRUE keeps it from messing up the names method = function(levs) cmat } else if (is.character(method)) { fn = paste(method, "lsmc", sep=".") method = if (exists(fn, mode="function")) get(fn) else stop(paste("Contrast function '", fn, "' not found", sep="")) } # case like in old lsmeans, contr = list else if (!is.function(method)) stop("'method' must be a function or the basename of an '.lsmc' function") # Get the contrasts; this should be a data.frame cmat = method(levs, ...) if (!is.data.frame(cmat)) stop("Contrast function must provide a data.frame") else if (nrow(cmat) != nrow(args)) stop("Nonconforming number of contrast coefficients") if (is.null(by)) { linfct = t(cmat) %*% object@linfct grid = data.frame(.contrast.=names(cmat)) if (".offset." %in% names(object@grid)) grid[[".offset."]] = t(cmat) %*% object@grid[[".offset."]] } # NOTE: The kronecker thing here is nice and efficient but depends # on the grid being regular -- same number of rows for each 'by' case # If you ever want to expand to irregular grids, this block will # have to change, but everything else is probably OK. else { tcmat = kronecker(.diag(rep(1,length(by.rows))), t(cmat)) linfct = tcmat %*% object@linfct[unlist(by.rows), ] tmp = expand.grid(con= names(cmat), by = seq_len(length(by.rows)))###unique(by.id)) grid = data.frame(.contrast. = tmp$con) n.each = ncol(cmat) row.1st = sapply(by.rows, function(x) x[1]) xlevs = list() for (v in by) xlevs[[v]] = rep(bylevs[row.1st, v], each=n.each) grid = cbind(grid, as.data.frame(xlevs)) if (".offset." %in% names(object@grid)) grid[[".offset."]] = tcmat %*% object@grid[unlist(by.rows), ".offset."] } # Rename the .contrast. column -- ordinarily to "contrast", # but otherwise a unique variation thereof con.pat = paste("^", name, "[0-p]?", sep = "") n.prev.con = length(grep(con.pat, names(grid))) con.col = grep("\\.contrast\\.", names(grid)) con.name = paste(name, ifelse(n.prev.con == 0, "", n.prev.con), sep="") names(grid)[con.col] = con.name row.names(linfct) = NULL misc = object@misc misc$estName = "estimate" if (!is.null(et <- attr(cmat, "type"))) misc$estType = et else { is.con = all(abs(sapply(cmat, sum)) < .001) misc$estType = ifelse(is.con, "contrast", "prediction") } misc$methDesc = attr(cmat, "desc") misc$famSize = size = nrow(args) misc$pri.vars = setdiff(names(grid), c(".offset.",".wgt.")) if (missing(adjust)) adjust = attr(cmat, "adjust") if (is.null(adjust)) adjust = "none" if (!is.null(attr(cmat, "offset"))) offset = attr(cmat, "offset") if (!is.null(offset)) { if(is.null(grid[[".offset."]])) grid[[".offset."]] = 0 grid[[".offset."]] = grid[[".offset."]] + rep(offset, length(by.rows)) } misc$adjust = adjust misc$infer = c(FALSE, TRUE) misc$by.vars = by # zap the transformation info except in very special cases if (!is.null(misc$tran)) { misc$orig.tran = misc$tran # anything other than (-1,0,1)? non.comp = setdiff(zapsmall(unique(as.matrix(cmat))), c(-1,0,1)) if(length(non.comp) == 0 && (misc$tran %in% c("log", "logit"))) { misc$orig.inv.lbl = misc$inv.lbl misc$inv.lbl = ifelse(misc$tran == "logit", "odds.ratio", paste(misc$inv.lbl,"ratio",sep=".")) misc$tran = "log" } else misc$tran = NULL } object@roles$predictors = "contrast" levels = list() for (nm in setdiff(names(grid), ".offset.")) levels[[nm]] = unique(grid[[nm]]) result = new("lsmobj", object, linfct=linfct, levels=levels, grid=grid, misc=misc) if(!is.null(options)) { options$object = result result = do.call("update.ref.grid", options) } result } # return list of row indexes in tbl for each combination of by # tbl should be a data.frame .find.by.rows = function(tbl, by) { if (is.null(by)) return(list(seq_len(nrow(tbl)))) if (any(is.na(match(by, names(tbl))))) stop("'by' variables are not all in the grid") bylevs = tbl[ , by, drop = FALSE] by.id = do.call("paste", bylevs) uids = unique(by.id) result = lapply(uids, function(id) which(by.id == id)) names(result) = uids result } # confint method confint.ref.grid = function(object, parm, level=.95, ...) { summary(object, infer=c(TRUE,FALSE), level=level, ...) } # test S3 generic and method test = function(object, null, ...) { UseMethod("test") } test.ref.grid = function(object, null = 0, joint = FALSE, verbose = FALSE, rows, by, ...) { # if joint = FALSE, this is a courtesy method for 'contrast' # else it computes the F test or Wald test of H0: L*beta = null # where L = object@linfct if (!joint) { if (missing(by)) summary(object, infer=c(FALSE,TRUE), null = null, ...) else summary(object, infer=c(FALSE,TRUE), null = null, by = by, ...) } else { if(verbose) { cat("Joint test of the following linear predictions\n") print(cbind(object@grid, equals = null)) } L = object@linfct if (!missing(rows)) by.rows = list(sel.rows = rows) else { by.rows = list(all = seq_len(nrow(L))) if(missing(by)) by = object@misc$by.vars if (!is.null(by)) by.rows = .find.by.rows(object@grid, by) } estble.idx = which(!is.na(object@bhat)) bhat = object@bhat[estble.idx] ###L = L[, estble.idx, drop = FALSE] lindep = FALSE result = lapply(by.rows, function(rows) { LL = L[rows, , drop = FALSE] if (!all(is.estble(LL, object@nbasis))) c(F = NA, df1 = NA, df2 = NA, p.value = NA) else { LL = LL[, estble.idx, drop = FALSE] # Check rank qrLt = qr(t(LL)) r = qrLt$rank if (r < nrow(LL)) { if(!all(null==0)) stop("Rows are linearly dependent - cannot do the test when 'null' != 0") else lindep <<- TRUE } tR = t(qr.R(qrLt))[1:r,1:r] tQ = t(qr.Q(qrLt))[1:r, , drop = FALSE] if(length(null) < r) null = rep(null,r) z = tQ %*% bhat - solve(tR, null[1:r]) zcov = tQ %*% object@V %*% t(tQ) F = sum(z * solve(zcov, z)) / r df2 = object@dffun(tQ, object@dfargs) if (is.na(df2)) p.value = pchisq(F*r, r, lower.tail = FALSE) else p.value = pf(F, r, df2, lower.tail = FALSE) round(c(F = F, df1 = r, df2 = df2, p.value = p.value), 4) } }) if (lindep) message("Note: Rows are linearly dependent - df are reduced accordingly") t(as.data.frame(result)) } } # pairs method pairs.ref.grid = function(x, reverse = FALSE, ...) { object = x # for my sanity if (reverse) contrast(object, method = "revpairwise", ...) else contrast(object, method = "pairwise", ...) } ### lstrends function lstrends = function(model, specs, var, delta.var=.01*rng, data, ...) { estName = paste(var, "trend", sep=".") # Do now as I may replace var later if (missing(data)) { data = try(recover.data (model, data = NULL)) if (inherits(data, "try-error")) stop("Possible remedy: Supply the data used in the 'data' argument") } else # attach needed attributes to given data data = recover.data(model, data = data) x = data[[var]] fcn = NULL # differential if (is.null(x)) { fcn = var var = .all.vars(as.formula(paste("~",var))) if (length(var) > 1) stop("Can only support a function of one variable") else { x = data[[var]] if (is.null(x)) stop("Variable '", var, "' is not in the dataset") } } rng = diff(range(x)) if (delta.var == 0) stop("Provide a nonzero value of 'delta.var'") RG = ref.grid(model, data = data, ...) grid = RG@grid if (!is.null(mr <- RG@roles$multresp)) { # use the grid value only for the 1st mult resp (no dupes) if (length(mr) > 0) grid = grid[grid[[mr]] == RG@levels[[mr]][1], ] } grid[[var]] = grid[[var]] + delta.var basis = lsm.basis(model, attr(data, "terms"), RG@roles$xlev, grid, ...) if (is.null(fcn)) newlf = (basis$X - RG@linfct) / delta.var else { y0 = with(RG@grid, eval(parse(text = fcn))) yh = with(grid, eval(parse(text = fcn))) diffl = (yh - y0) if (any(diffl == 0)) warning("Some differentials are zero") newlf = (basis$X - RG@linfct) / diffl } # remove transformation from object .zaptran = function(obj) { if (is(obj, "ref.grid") && !is.null(obj@misc$tran)) { obj@misc$orig.tran = result@misc$tran obj@misc$tran = NULL } obj } RG@linfct = newlf RG@roles$trend = var args = list(object=RG, specs=specs, ...) args$at = args$cov.reduce = args$mult.levs = args$vcov. = NULL result = do.call("lsmeans", args) if (is.list(result)) { names(result)[1] = "lstrends" if (is(result[[1]], "ref.grid")) { result[[1]]@misc$estName = estName result[[1]]@misc$estType = "prediction" result[[1]]@misc$methDesc = "trends" for (i in seq_along(result)) result[[i]] = .zaptran(result[[i]]) } } else { result@misc$estName = estName result@misc$estType = "prediction" result@misc$methDesc = "trends" result = .zaptran(result) } result } # Check if model contains a term containing all elts of facs # Note: if an lstrends call, we want to include trend var in facs # terms is terms() component of model .some.term.contains = function(facs, terms) { for (trm in attr(terms, "term.labels")) { if(all(sapply(facs, function(f) length(grep(f,trm))>0))) if (length(.all.vars(as.formula(paste("~",trm)))) > length(facs)) return(TRUE) } return(FALSE) } # Construct a new lsmobj with given arguments lsmobj = function(bhat, V, levels, linfct, df = NA, post.beta = matrix(NA), ...) { if ((nrow(V) != ncol(V)) || (nrow(V) != ncol(linfct)) || (length(bhat) != ncol(linfct))) stop("bhat, V, and linfct are incompatible") if (!is.list(levels)) levels = list(level = levels) grid = do.call(expand.grid, levels) if (nrow(grid) != nrow(linfct)) stop("linfct should have ", nrow(grid), "rows") model.info = list(call = match.call(), xlev = levels) roles = list(predictors= names(grid), responses=character(0), multresp=character(0)) if (is.function(df)) { dffun = df dfargs = list(...)$dfargs } else { dffun = function(x, dfargs) dfargs$df dfargs = list(df = df) } misc = list(estName = "estimate", estType = "prediction", infer = c(TRUE,FALSE), level = .95, adjust = "none", famSize = nrow(linfct), avgd.over = character(0), pri.vars = names(grid), methDesc = "lsmobj") result = new("lsmobj", model.info=model.info, roles=roles, grid=grid, levels = levels, matlevs=list(), linfct=linfct, bhat=bhat, nbasis=all.estble, V=V, dffun=dffun, dfargs=dfargs, misc=misc, post.beta=post.beta) update(result, ..., silent=TRUE) } lsmeans/R/lsm.list.R0000644000175100001440000000173212634421507014032 0ustar hornikusers# Methods for lsm.list objects # Summary method for an lsm.list summary.lsm.list <- function(object, ...) lapply(object, function(x) { if (inherits(x, "summary.ref.grid")) x else summary(x, ...) }) print.lsm.list <- function(x, ...) print(summary(x, ...)) str.lsm.list = function(object, ...) { for(nm in names(object)) { cat(paste("$", nm, "\n", sep="")) str(object[[nm]]) cat("\n") } } # Courtesy methods to make it more friendly for follow-ups contrast.lsm.list = function(object, ... , which = 1) { contrast(object[[which]], ...) } pairs.lsm.list = function(x, ..., which = 1) { pairs(x[[which]], ...) } test.lsm.list = function(object, ..., which = 1) { test(object[[which]], ...) } confint.lsm.list = function(object, ..., which = 1) { confint(object[[which]], ...) } cld.lsm.list = function(object, ..., which = 1) { cld(object[[which]], ...) } lsmeans/R/rms-support.R0000644000175100001440000000721512634421507014602 0ustar hornikusers# Support for objects in the *rms* package recover.data.rms = function(object, ...) { fcall = object$call recover.data(fcall, delete.response(terms(object)), object$na.action$omit, ...) } # TODO: # 1. If multivariate - like mlm method? # 2. orm cases? lsm.basis.rms = function(object, trms, xlev, grid, mode = c("middle", "latent", "linear.predictor", "cum.prob", "exc.prob", "prob", "mean.class"), vcov., ...) { mode = match.arg(mode) bhat = coef(object) if (missing(vcov.)) V = vcov(object, intercepts = "all") else V = .my.vcov(object, vcov.) misc = list() X = predict(object, newdata = grid, type = "x") #xnames = dimnames(X)[[2]] #intcpts = setdiff(names(bhat), xnames) nint = length(bhat) - ncol(X) intcpts = names(bhat)[seq_len(nint)] xnames = setdiff(names(bhat), intcpts) if (length(intcpts) == 1) mode = "single" # stealth mode for ordinary single-intercept case if (mode %in% c("single", "middle", "latent")) { X = cbind(1, X) mididx = ifelse(mode != "middle", 1, as.integer((1 + length(intcpts)) / 2)) dimnames(X)[[2]][1] = switch(mode, single = intcpts, middle = intcpts[mididx], latent = "avg.intercept") if (mode == "middle") { nms = c(intcpts[mididx], xnames) bhat = bhat[nms] V = V[nms, nms, drop = FALSE] } else if (mode == "latent") { bhat = c(mean(bhat[intcpts]), bhat[xnames]) nx = length(xnames) J1 = rbind(rep(1/nint, nint), matrix(0, nrow = nx, ncol = nint)) J2 = rbind(0, diag(1, nx)) J = cbind(J1, J2) V = J %*% V %*% t(J) } ### else mode == "single" and all is OK as it is } else { # mode %in% c("linear.predictor", "cum.prob", "exc.prob", "prob", "mean.class") misc$ylevs = list(cut = intcpts) I = diag(1, nint) J = matrix(1, nrow = nrow(X)) JJ = matrix(1, nrow=nint) X = cbind(kronecker(I, J), kronecker(JJ, X)) # Note V is correct as-is dimnames(X)[[2]] = c(intcpts, xnames) if (mode != "linear.predictor") { misc$mode = mode misc$postGridHook = .clm.postGrid misc$respName = as.character(object$terms)[2] } } # I think rms does not allow rank deficiency... nbasis = estimability::all.estble if (!is.null(object$family)) { if (!is.character(object$family)) misc = .std.link.labels(object$family, misc) else { misc$tran = object$family if (misc$tran == "logistic") misc$tran = "logit" misc$inv.lbl = switch(class(object)[1], orm = "exc.prob", lrm = ifelse(nint == 1, "prob", "exc.prob"), "response") } dffun = function(k, dfargs) NA dfargs = list() } else { dfargs = list(df = object$df.residual) if (is.null(dfargs$df)) dfargs$df = NA dffun = function(k, dfargs) dfargs$df } list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs, misc=misc) } ## Courtesy method to prevent masking this generic in rms package # Excluded because this just causes headaches with CRAN's # dependency checking. # contrast.rms = function(object, ...) { # if (requireNamespace("rms")) # rms::contrast(object, ...) # else # stop ("The 'rms' package is not installed.") # # } lsmeans/R/summary.R0000644000175100001440000005030412634421507013761 0ustar hornikusers### This file has summary.ref.grid S3 method and related functions # Computes the quadratic form y'Xy after subsetting for the nonzero elements of y .qf.non0 = function(X, y) { ii = (zapsmall(y) != 0) if (any(ii)) sum(y[ii] * (X[ii, ii, drop = FALSE] %*% y[ii])) else 0 } # utility fcn to get est's, std errors, and df # new arg: do.se -- if FALSE, just do the estimates and return 0 for se and df # returns a data.frame with an add'l "link" attribute if misc$tran is non-null # .est.se.df = function(linfct, bhat, nbasis, V, dffun, dfargs, misc, do.se=TRUE, # tol=getOption("lsmeans")$estble.tol) { # 2.13: Revised to call w/ just object instead of all those args (except linfct) # Also moved offset comps to here, and provided for misc$estHook .est.se.df = function(object, do.se=TRUE, tol = get.lsm.option("estble.tol")) { misc = object@misc if (!is.null(hook <- misc$estHook)) { if (is.character(hook)) hook = get(hook) result = hook(object, do.se=do.se, tol=tol) } else { active = which(!is.na(object@bhat)) bhat = object@bhat[active] result = t(apply(object@linfct, 1, function(x) { if (estimability::is.estble(x, object@nbasis, tol)) { x = x[active] est = sum(bhat * x) if(do.se) { se = sqrt(.qf.non0(object@V, x)) df = object@dffun(x, object@dfargs) } else # if these unasked-for results are used, we're bound to get an error! se = df = 0 c(est, se, df) } else c(NA,NA,NA) })) if (!is.null(object@grid$.offset.)) result[, 1] = result[, 1] + object@grid$.offset. } result = as.data.frame(result) names(result) = c(misc$estName, "SE", "df") if (!is.null(misc$tran) && (misc$tran != "none")) { if(is.character(misc$tran)) { link = try(make.link(misc$tran), silent=TRUE) if (!inherits(link, "try-error")) attr(result, "link") = link } else if (is.list(misc$tran)) attr(result, "link") = misc$tran } result } # utility to compute an adjusted p value # tail is -1, 0, 1 for left, two-sided, or right # Note fam.info is c(famsize, ncontr, estTypeIndex) # 2.14: added corrmat arg, dunnettx & mvt adjustments # NOTE: corrmat is NULL unless adjust == "mvt" .adj.p.value = function(t, df, adjust, fam.info, tail, corrmat) { fam.size = fam.info[1] n.contr = fam.info[2] if (n.contr == 1) # Force no adjustment when just one test adjust = "none" # do a pmatch of the adjust method, case insensitive adj.meths = c("sidak", "tukey", "scheffe", "dunnettx", "mvt", p.adjust.methods) k = pmatch(tolower(adjust), adj.meths) if(is.na(k)) stop("Adjust method '", adjust, "' is not recognized or not valid") adjust = adj.meths[k] if ((tail != 0) && (adjust %in% c("tukey", "scheffe", "dunnettx"))) # meth not approp for 1-sided adjust = "sidak" if ((fam.info[3] != 3) && adjust == "tukey") # not pairwise adjust = "sidak" # asymptotic results when df is NA df[is.na(df)] = Inf # if estType is "prediction", use #contrasts + 1 as family size # (produces right Scheffe CV; Tukey ones are a bit strange) scheffe.dim = ifelse(fam.info[3] == 1, fam.size, fam.size - 1) abst = abs(t) if (tail == 0) unadj.p = 2*pt(abst, df, lower.tail=FALSE) else unadj.p = pt(t, df, lower.tail = (tail<0)) if (adjust %in% p.adjust.methods) { if (n.contr == length(unadj.p)) pval = p.adjust(unadj.p, adjust, n = n.contr) else pval = as.numeric(apply(matrix(unadj.p, nrow=n.contr), 2, function(pp) p.adjust(pp, adjust, n=sum(!is.na(pp))))) } else pval = switch(adjust, sidak = 1 - (1 - unadj.p)^n.contr, # NOTE: tukey, scheffe, dunnettx all assumed 2-sided! tukey = ptukey(sqrt(2)*abst, fam.size, zapsmall(df), lower.tail=FALSE), scheffe = pf(t^2/scheffe.dim, scheffe.dim, df, lower.tail=FALSE), dunnettx = 1 - .pdunnx(abst, n.contr, df), mvt = 1 - .my.pmvt(t, df, corrmat, -tail) # tricky - reverse the tail because we're subtracting from 1 ) chk.adj = match(adjust, c("none", "tukey", "scheffe"), nomatch = 99) do.msg = (chk.adj > 1) && (n.contr > 1) && !((fam.size == 2) && (chk.adj < 10)) if (do.msg) { # xtra = if(chk.adj < 10) paste("a family of", fam.size, "tests") # else paste(n.contr, "tests") xtra = switch(adjust, tukey = paste("for comparing a family of", fam.size, "estimates"), scheffe = paste("with dimensionality", scheffe.dim), paste("for", n.contr, "tests") ) mesg = paste("P value adjustment:", adjust, "method", xtra) } else mesg = NULL list(pval=pval, mesg=mesg, adjust=adjust) } # Code needed for an adjusted critical value # returns a list similar to .adj.p.value # 2.14: Added tail & corrmat args, dunnettx & mvt adjustments # NOTE: corrmat is NULL unless adjust == "mvt" .adj.critval = function(level, df, adjust, fam.info, tail, corrmat) { mesg = NULL fam.size = fam.info[1] n.contr = fam.info[2] if (n.contr == 1) # Force no adjustment when just one interval adjust = "none" adj.meths = c("sidak", "tukey", "scheffe", "dunnettx", "mvt", "bonferroni", "none") k = pmatch(tolower(adjust), adj.meths) if(is.na(k)) { k = which(adj.meths == "none") mesg = "Confidence levels are NOT adjusted for multiplicity" } adjust = adj.meths[k] if ((fam.info[3] != 3) && adjust == "tukey") # not pairwise adjust = "sidak" if ((tail != 0) && (adjust %in% c("tukey", "scheffe", "dunnettx"))) # meth not approp for 1-sided adjust = "sidak" if ((fam.info[3] != 3) && adjust == "tukey") # not pairwise adjust = "sidak" # asymptotic results when df is NA df[is.na(df)] = Inf scheffe.dim = ifelse(fam.info[3] == 1, fam.size, fam.size - 1) chk.adj = match(adjust, c("none", "tukey", "scheffe"), nomatch = 99) do.msg = (chk.adj > 1) && (n.contr > 1) && !((fam.size == 2) && (chk.adj < 10)) if (do.msg) { # xtra = if(chk.adj < 10) paste("a family of", fam.size, "estimates") # else paste(n.contr, "estimates") xtra = switch(adjust, tukey = paste("for comparing a family of", fam.size, "estimates"), scheffe = paste("with dimensionality", scheffe.dim), paste("for", n.contr, "estimates") ) mesg = paste("Conf-level adjustment:", adjust, "method", xtra) } adiv = ifelse(tail == 0, 2, 1) # divisor for alpha where needed cv = switch(adjust, none = -qt((1-level)/adiv, df), sidak = -qt((1 - level^(1/n.contr))/adiv, df), bonferroni = -qt((1-level)/n.contr/adiv, df), tukey = qtukey(level, fam.size, df) / sqrt(2), scheffe = sqrt(scheffe.dim * qf(level, scheffe.dim, df)), dunnettx = .qdunnx(level, n.contr, df), mvt = .my.qmvt(level, df, corrmat, tail) ) list(cv = cv, mesg = mesg, adjust = adjust) } ### My own functions to ease access to mvt functions ### These use one argument at a time and expands each (lower, upper) or p to a k-vector ### Use tailnum = -1, 0, or 1 ### NOTE: corrmat needs "by.rows" attribute to tell which rows ### belong to which submatrix. .my.pmvt = function(x, df, corrmat, tailnum) { lower = switch(tailnum + 2, -Inf, -abs(x), x) upper = switch(tailnum + 2, x, abs(x), Inf) by.rows = attr(corrmat, "by.rows") if (is.null(by.rows)) by.rows = list(seq_len(length(x))) by.sel = numeric(length(x)) for (i in seq_along(by.rows)) by.sel[by.rows[[i]]] = i df = .fix.df(df) apply(cbind(lower, upper, df, by.sel), 1, function(z) { idx = by.rows[[z[4]]] k = length(idx) pval = try(mvtnorm::pmvt(rep(z[1], k), rep(z[2], k), df = as.integer(z[3]), corr = corrmat[idx, idx]), silent = TRUE) if (inherits(pval, "try-error")) NA else pval }) } # Vectorized for df but needs p to be scalar .my.qmvt = function(p, df, corrmat, tailnum) { tail = c("lower.tail", "both.tails", "lower.tail")[tailnum + 2] df = .fix.df(df) by.rows = attr(corrmat, "by.rows") if (is.null(by.rows)) by.rows = list(seq_len(length(df))) by.sel = numeric(length(df)) for (i in seq_along(by.rows)) by.sel[by.rows[[i]]] = i # If df all equal, compute just once for each by group eq.df = (diff(range(df)) == 0) i1 = if (eq.df) sapply(by.rows, function(r) r[1]) else seq_along(df) result = apply(cbind(p, df[i1], by.sel[i1]), 1, function(z) { idx = by.rows[[z[3]]] cv = try(mvtnorm::qmvt(z[1], tail = tail, df = as.integer(z[2]), corr = corrmat[idx, idx])$quantile, silent = TRUE) if (inherits(cv, "try-error")) NA else cv }) if (eq.df) { res = result result = numeric(length(df)) for(i in seq_along(by.rows)) result[by.rows[[i]]] = res[i] } result } # utility to get appropriate integer df .fix.df = function(df) { sapply(df, function(d) { if (d > 0) d = max(1, d) if (is.infinite(d) || (d > 9999)) d = 0 floor(d + .25) # tends to round down }) } ### My approximate dunnett distribution ### - a mix of the Tukey cdf and Sidak-corrected t .pdunnx = function(x, k, df, twt = (k - 1)/k) { tukey = ptukey(sqrt(2)*x, (1 + sqrt(1 + 8*k))/2, df) sidak = (pf(x^2, 1, df))^k twt*tukey + (1 - twt)*sidak } # Uses linear interpolation to get quantile .qdunnx = function(p, k, df, ...) { if (k < 1.005) return(qt(1 - .5*(1 - p), df)) xtuk = qtukey(p, (1 + sqrt(1 + 8*k))/2, df) / sqrt(2) xsid = sqrt(qf(p^(1/k), 1, df)) fcn = function(x, d) .pdunnx(x, k, d, ...) - p apply(cbind(xtuk, xsid, df), 1, function(r) { if (abs(diff(r[1:2])) < .0005) return (r[1]) x = try(uniroot(fcn, r[1:2], tol = .0005, d = r[3]), silent = TRUE) if (inherits(x, "try-error")) { warning("Root-finding failed; using qtukey approximation for Dunnett quantile") return(xtuk) } else x$root }) } ### Support for different prediction types ### # Valid values for type arg or predict.type option .valid.types = c("link","response","lp","linear") # get "predict.type" option from misc, and make sure it's legal .get.predict.type = function(misc) { type = misc$predict.type if (is.null(type)) .valid.types[1] else .validate.type(type) } # check a "type" arg to make it legal .validate.type = function (type) { .valid.types[pmatch(type, .valid.types, 1)] } # S3 predict method predict.ref.grid <- function(object, type, ...) { # update with any "summary" options opt = get.lsm.option("summary") if(!is.null(opt)) { opt$object = object object = do.call("update.ref.grid", opt) } if (missing(type)) type = .get.predict.type(object@misc) else type = .validate.type(type) pred = .est.se.df(object, do.se=FALSE) result = pred[[1]] # MOVED TO .EST.SE.DF # if (".offset." %in% names(object@grid)) # result = result + object@grid[[".offset."]] if (type == "response") { link = attr(pred, "link") if (!is.null(link)) result = link$linkinv(result) } result } # S3 summary method summary.ref.grid <- function(object, infer, level, adjust, by, type, df, null = 0, delta = 0, side = 0, ...) { # update with any "summary" options opt = get.lsm.option("summary") if(!is.null(opt)) { opt$object = object object = do.call("update.ref.grid", opt) } if(missing(df)) df = object@misc$df if(!is.null(df)) object@dffun = function(k, dfargs) df # reconcile all the different ways we could specify the alternative # ... and map each to one of the first 3 subscripts side.opts = c("left","both","right","two-sided","noninferiority","nonsuperiority","equivalence","superiority","inferiority","0","2","-1","1","+1","<",">","!=","=") side.map = c( 1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 2, 1, 3, 3, 1, 3, 2, 2) side = side.map[pmatch(side, side.opts, 2)[1]] - 2 delta = abs(delta) result = .est.se.df(object) lblnms = setdiff(names(object@grid), c(object@roles$responses, ".offset.", ".wgt.")) lbls = object@grid[lblnms] ### implement my 'variable defaults' scheme if(missing(infer)) infer = object@misc$infer if(missing(level)) level = object@misc$level if(missing(adjust)) adjust = object@misc$adjust if(missing(by)) by = object@misc$by.vars if (missing(type)) type = .get.predict.type(object@misc) else type = .validate.type(type) zFlag = (all(is.na(result$df))) inv = (type == "response") # flag to inverse-transform if ((length(infer) == 0) || !is.logical(infer)) infer = c(FALSE, FALSE) if(length(infer == 1)) infer = c(infer,infer) if(inv && !is.null(object@misc$tran)) { link = attr(result, "link") if (!is.null(object@misc$inv.lbl)) names(result)[1] = object@misc$inv.lbl else names(result)[1] = "lsresponse" } else link = NULL attr(result, "link") = NULL estName = names(result)[1] mesg = object@misc$initMesg ### Add an annotation when we show results on lp scale and ### there is a transformation if (!inv && !is.null(linkName <- object@misc$tran)) { if (!is.character(linkName)) linkName = "linear predictor (not response)" mesg = c(mesg, paste("Results are given on the", linkName, "scale.")) } # et = 1 if a prediction, 2 if a contrast (or unmatched or NULL), 3 if pairs et = pmatch(c(object@misc$estType, "c"), c("prediction", "contrast", "pairs"), nomatch = 2)[1] by.size = nrow(object@grid) if (!is.null(by)) for (nm in by) by.size = by.size / length(unique(object@levels[[nm]])) fam.info = c(object@misc$famSize, by.size, et) cnm = NULL # get vcov matrix only if needed (adjust == "mvt") corrmat = NULL if (!is.na(pmatch(adjust, "mvt"))) { corrmat = cov2cor(vcov(object)) attr(corrmat, "by.rows") = .find.by.rows(object@grid, by) } if(infer[1]) { # add CIs acv = .adj.critval(level, result$df, adjust, fam.info, side, corrmat) adjust = acv$adjust cv = acv$cv cv = switch(side + 2, cbind(-Inf, cv), cbind(-cv, cv), cbind(-cv, Inf)) cnm = if (zFlag) c("asymp.LCL", "asymp.UCL") else c("lower.CL","upper.CL") result[[cnm[1]]] = result[[1]] + cv[, 1]*result$SE result[[cnm[2]]] = result[[1]] + cv[, 2]*result$SE if (!is.null(link)) { result[[cnm[1]]] = link$linkinv(result[[cnm[1]]]) result[[cnm[2]]] = link$linkinv(result[[cnm[2]]]) } mesg = c(mesg, paste("Confidence level used:", level), acv$mesg) } if(infer[2]) { # add tests if (!all(null == 0)) { result[["null"]] = null if (!is.null(link)) result[["null"]] = link$linkinv(result[["null"]]) } tnm = ifelse (zFlag, "z.ratio", "t.ratio") tail = ifelse(side == 0, -sign(abs(delta)), side) if (side == 0) { if (delta == 0) # two-sided sig test t.ratio = result[[tnm]] = (result[[1]] - null) / result$SE else t.ratio = result[[tnm]] = (abs(result[[1]] - null) - delta) / result$SE } else { t.ratio = result[[tnm]] = (result[[1]] - null + side * delta) / result$SE } apv = .adj.p.value(t.ratio, result$df, adjust, fam.info, tail, corrmat) adjust = apv$adjust # in case it was abbreviated result$p.value = apv$pval mesg = c(mesg, apv$mesg) if (delta > 0) mesg = c(mesg, paste("Statistics are tests of", c("nonsuperiority","equivalence","noninferiority")[side+2], "with a threshold of", delta)) if(tail != 0) mesg = c(mesg, paste("P values are ", ifelse(tail<0,"left-","right-"),"tailed", sep="")) if (!is.null(link)) mesg = c(mesg, "Tests are performed on the linear-predictor scale") } if (!is.null(link)) { result[["SE"]] = link$mu.eta(result[[1]]) * result[["SE"]] result[[1]] = link$linkinv(result[[1]]) } if (length(object@misc$avgd.over) > 0) mesg = c(paste("Results are averaged over the levels of:", paste(object@misc$avgd.over, collapse = ", ")), mesg) summ = cbind(lbls, result) attr(summ, "estName") = estName attr(summ, "clNames") = cnm # will be NULL if infer[1] is FALSE attr(summ, "pri.vars") = setdiff(union(object@misc$pri.vars, object@misc$by.vars), by) attr(summ, "by.vars") = by attr(summ, "mesg") = unique(mesg) class(summ) = c("summary.ref.grid", "data.frame") summ } # left-or right-justify column labels for m depending on "l" or "R" in just .just.labs = function(m, just) { nm = dimnames(m)[[2]] for (j in seq_len(length(nm))) { if(just[nm[j]] == "L") nm[j] = format(nm[j], width = nchar(m[1,j]), just="left") } dimnames(m) = list(rep("", nrow(m)), nm) m } # Format a data.frame produced by summary.ref.grid print.summary.ref.grid = function(x, ..., digits=NULL, quote=FALSE, right=TRUE) { x.save = x if (!is.null(x$df)) x$df = round(x$df, 2) if (!is.null(x$t.ratio)) x$t.ratio = round(x$t.ratio, 3) if (!is.null(x$p.value)) { fp = x$p.value = format(round(x$p.value,4), nsmall=4, sci=FALSE) x$p.value[fp=="0.0000"] = "<.0001" } just = sapply(x.save, function(col) if(is.numeric(col)) "R" else "L") xc = as.matrix(format.data.frame(x, digits=digits, na.encode=FALSE)) m = apply(rbind(just, names(x), xc), 2, function(x) { w = max(sapply(x, nchar)) if (x[1] == "R") format(x[-seq_len(2)], width = w, justify="right") else format(x[-seq_len(2)], width = w, justify="left") }) if(!is.matrix(m)) m = t(as.matrix(m)) by.vars = attr(x, "by.vars") if (is.null(by.vars)) { m = .just.labs(m, just) print(m, quote=FALSE, right=TRUE) cat("\n") } else { # separate listing for each by variable m = .just.labs(m[, setdiff(names(x), by.vars)], just) pargs = as.list(x[,by.vars, drop=FALSE]) pargs$sep = ", " lbls = do.call(paste, pargs) for (lb in unique(lbls)) { rows = which(lbls==lb) levs = paste(by.vars, "=", xc[rows[1], by.vars]) cat(paste(paste(levs, collapse=", ")), ":\n", sep="") print(m[rows, , drop=FALSE], ..., quote=quote, right=right) cat("\n") } } msg = unique(attr(x, "mesg")) if (!is.null(msg)) for (j in seq_len(length(msg))) cat(paste(msg[j], "\n")) invisible(x.save) } lsmeans/R/ref.grid.R0000644000175100001440000004310512634421507013765 0ustar hornikusers# Reference grid code # Change to cov.reduce specification: can be... # a function: is applied to all covariates # named list of functions: applied to those covariates (else mean is used) # TRUE - same as mean # FALSE - same as function(x) sort(unique(x)) ref.grid <- function(object, at, cov.reduce = mean, mult.name, mult.levs, options = get.lsm.option("ref.grid"), data, type, ...) { # recover the data if (missing(data)) { data = try(recover.data (object, data = NULL, ...)) if (inherits(data, "try-error")) stop("Perhaps a 'data' or 'params' argument is needed") } else # attach needed attributes to given data data = recover.data(object, data = data, ...) if(is.character(data)) # 'data' is in fact an error message stop(data) trms = attr(data, "terms") # find out if any variables are coerced to factors ### OLD VERSION: anm = all.names(attr(data, "terms")) ### coerced = anm[1 + grep("factor|ordered", anm)] coerced = .find.coerced(trms, data) # convenience function sort.unique = function(x) sort(unique(x)) # Ensure cov.reduce is a function or list thereof dep.x = list() # list of formulas to fit later fix.cr = function(cvr) { # cvr is TRUE or FALSE if(is.logical(cvr)) if(cvr[1]) cvr = mean else cvr = sort.unique else if (inherits(cvr, "formula")) { if (length(cvr) < 3) stop("Formulas in 'cov.reduce' must be two-sided") lhs = .all.vars(cvr)[1] dep.x[[lhs]] <<- cvr cvr = mean } else if (!inherits(cvr, c("function","list"))) stop("Invalid 'cov.reduce' argument") cvr } # IMPORTANT: following stmts may also affect x.dep if (is.list(cov.reduce)) cov.reduce = lapply(cov.reduce, fix.cr) else cov.reduce = fix.cr(cov.reduce) # zap any formulas that are also in 'at' if (!missing(at)) for (xnm in names(at)) dep.x[[xnm]] = NULL # local cov.reduce function that works with function or named list cr = function(x, nm) { if (is.function(cov.reduce)) cov.reduce(x) else if (!is.null(cov.reduce[[nm]])) cov.reduce[[nm]](x) else mean(x) } # initialize empty lists ref.levels = matlevs = xlev = list() for (nm in attr(data, "responses")) { y = data[[nm]] if (is.matrix(y)) matlevs[[nm]] = apply(y, 2, mean) else ref.levels[[nm]] = mean(y) } for (nm in attr(data, "predictors")) { x = data[[nm]] # Save the original levels of factors, no matter what if (is.factor(x)) xlev[[nm]] = levels(factor(x)) # (applying factor drops any unused levels) # Now go thru and find reference levels... # mentioned in 'at' list but not coerced if (!(nm %in% coerced) && !missing(at) && !is.null(at[[nm]])) ref.levels[[nm]] = at[[nm]] # factors not in 'at' else if (is.factor(x)) ref.levels[[nm]] = levels(factor(x)) else if (is.character(x)) ref.levels[[nm]] = sort.unique(x) # matrices else if (is.matrix(x)) { # Matrices -- reduce columns thereof, but don't add to baselevs matlevs[[nm]] = apply(x, 2, cr, nm) # if cov.reduce returns a vector, average its columns if (is.matrix(matlevs[[nm]])) matlevs[[nm]] = apply(matlevs[[nm]], 2, mean) } # covariate coerced, or not mentioned in 'at' else { # single numeric pred but coerced to a factor - use unique values # even if in 'at' list. We'll fix this up later if (nm %in% coerced) ref.levels[[nm]] = sort.unique(x) # Ordinary covariates - summarize else ref.levels[[nm]] = cr(x, nm) } } # Now create the reference grid grid = do.call(expand.grid, ref.levels) # add any matrices for (nm in names(matlevs)) grid[[nm]] = matrix(rep(matlevs[[nm]], each=nrow(grid)), nrow=nrow(grid)) # resolve any covariate formulas for (xnm in names(dep.x)) { if (!all(.all.vars(dep.x[[xnm]]) %in% names(grid))) stop("Formulas in 'cov.reduce' must predict covariates actually in the model") xmod = lm(dep.x[[xnm]], data = data) grid[[xnm]] = predict(xmod, newdata = grid) ref.levels[[xnm]] = NULL } basis = lsm.basis(object, trms, xlev, grid, ...) misc = basis$misc form = attr(data, "call")$formula if (is.null(misc$tran) && (length(form) > 2)) { # No link fcn, but response may be transformed lhs = form[-3] ####form[[2]] tran = setdiff(.all.vars(lhs, functions = TRUE), c(.all.vars(lhs), "~", "cbind")) if(length(tran) == 1) { misc$tran = tran misc$inv.lbl = "response" } } # Take care of multivariate response multresp = character(0) ### ??? was list() ylevs = misc$ylevs if(!is.null(ylevs)) { # have a multivariate situation if (missing(mult.levs)) { if (missing(mult.name)) mult.name = names(ylevs)[1] ref.levels[[mult.name]] = ylevs[[1]] multresp = mult.name MF = data.frame(ylevs) names(MF) = mult.name } else { k = prod(sapply(mult.levs, length)) if (k != length(ylevs[[1]])) stop("supplied 'mult.levs' is of different length than that of multivariate response") for (nm in names(mult.levs)) ref.levels[[nm]] = mult.levs[[nm]] multresp = names(mult.levs) MF = do.call("expand.grid", mult.levs) } ###grid = do.call("expand.grid", ref.levels) grid = merge(grid, MF) # add any matrices for (nm in names(matlevs)) grid[[nm]] = matrix(rep(matlevs[[nm]], each=nrow(grid)), nrow=nrow(grid)) } # Here's a complication. If a numeric predictor was coerced to a factor, we had to # include all its levels in the reference grid, even if altered in 'at' # Moreover, whatever levels are in 'at' must be a subset of the unique values # So we now need to subset the rows of the grid and linfct based on 'at' problems = if (!missing(at)) intersect(c(multresp, coerced), names(at)) else character(0) if (length(problems > 0)) { incl.flags = rep(TRUE, nrow(grid)) for (nm in problems) { if (is.numeric(ref.levels[[nm]])) { at[[nm]] = round(at[[nm]], 3) ref.levels[[nm]] = round(ref.levels[[nm]], 3) } # get only "legal" levels at[[nm]] = at[[nm]][at[[nm]] %in% ref.levels[[nm]]] # Now which of those are left out? excl = setdiff(ref.levels[[nm]], at[[nm]]) for (x in excl) incl.flags[grid[[nm]] == x] = FALSE ref.levels[[nm]] = at[[nm]] } if (!any(incl.flags)) stop("Reference grid is empty due to mismatched levels in 'at'") grid = grid[incl.flags, , drop=FALSE] basis$X = basis$X[incl.flags, , drop=FALSE] } # Any offsets??? (misc$offset.mult might specify removing or reversing the offset) if(!is.null(attr(trms,"offset"))) { om = 1 if (!is.null(misc$offset.mult)) om = misc$offset.mult if (any(om != 0)) grid[[".offset."]] = om * .get.offset(trms, grid) } ### --- Determine weights for each grid point --- (added ver.2.11), updated ver.2.14 to include weights if (is.null(data[["(weights)"]])) data[["(weights)"]] = 1 nms = union(names(xlev), coerced) # only factors, no covariates or mult.resp # originally, I used 'plyr::count', but there are probs when there is a 'freq' variable id = plyr::id(data[, nms, drop = FALSE], drop = TRUE) uid = !duplicated(id) key = do.call(paste, data[uid, nms, drop = FALSE]) key = key[order(id[uid])] #frq = tabulate(id, attr(id, "n")) tgt = do.call(paste, grid[, nms, drop = FALSE]) wgt = rep(0, nrow(grid)) for (i in seq_along(key)) wgt[tgt == key[i]] = sum(data[["(weights)"]][id==i]) grid[[".wgt."]] = wgt misc$ylevs = NULL # No longer needed misc$estName = "prediction" misc$estType = "prediction" misc$infer = c(FALSE,FALSE) misc$level = .95 misc$adjust = "none" misc$famSize = nrow(grid) misc$avgd.over = character(0) post.beta = basis$post.beta if (is.null(post.beta)) post.beta = matrix(NA) result = new("ref.grid", model.info = list(call = attr(data,"call"), terms = trms, xlev = xlev), roles = list(predictors = attr(data, "predictors"), responses = attr(data, "responses"), multresp = multresp), grid = grid, levels = ref.levels, matlevs = matlevs, linfct = basis$X, bhat = basis$bhat, nbasis = basis$nbasis, V = basis$V, dffun = basis$dffun, dfargs = basis$dfargs, misc = misc, post.beta = post.beta) if (!missing(type)) { if (is.null(options)) options = list() options$predict.type = type } if(!is.null(options)) { options$object = result result = do.call("update.ref.grid", options) } if(!is.null(hook <- misc$postGridHook)) { if (is.character(hook)) hook = get(hook) result@misc$postGridHook = NULL hook(result) } else result } #### End of ref.grid ------------------------------------------ # This function figures out which covariates in a model # have been coerced to factors. Does NOT rely on the names of # functions like 'factor' or 'interaction' as we use actual results .find.coerced = function(trms, data) { isfac = sapply(data, function(x) inherits(x, "factor")) # Character vectors of factors and covariates in the data... facs.d = names(data)[isfac] covs.d = names(data)[!isfac] lbls = attr(trms, "term.labels") M = model.frame(trms, utils::head(data, 2)) #### just need a couple rows isfac = sapply(M, function(x) inherits(x, "factor")) # Character vector of terms in the model frame that are factors ... facs.m = names(M)[isfac] # Exclude the terms that are already factors # What's left will be things like "factor(dose)", "interact(dose,treat)", etc cterms = setdiff(facs.m, facs.d) if(length(cterms) == 0) return(cterms) # (else) Strip off the function calls cvars = lapply(cterms, function(x) .all.vars(reformulate(x))) # Exclude any variables that are already factors intersect(unique(unlist(cvars)), covs.d) } # calculate the offset for the given grid .get.offset = function(terms, grid) { off.idx = attr(terms, "offset") offset = rep(0, nrow(grid)) tvars = attr(terms, "variables") for (i in off.idx) offset = offset + eval(tvars[[i+1]], grid) offset } ### =========== Methods for ref.grid class ============================= # (note: summary-related methods moved to a new file) str.ref.grid <- function(object, ...) { showlevs = function(x) { # internal convenience function if (is.null(x)) cat("(predicted by other variables)") else cat(paste(format(x, digits = 5, justify = "none"), collapse=", ")) } #cat("responses: ") #showlevs(object@roles$responses) levs = object@levels cat(paste("'", class(object)[1], "' object with variables:\n", sep="")) for (nm in union(object@roles$predictors, union(object@roles$multresp, object@roles$responses))) { cat(paste(" ", nm, " = ", sep = "")) if (nm %in% names(object@matlevs)) { if (nm %in% object@roles$responses) cat("multivariate response with means: ") else cat("matrix with column means: ") cat("\n ") showlevs(object@matlevs[[nm]]) } else if (nm %in% object@roles$multresp) { cat("multivariate response levels: ") showlevs(levs[[nm]]) } else if (nm %in% object@roles$responses) { cat("response variable with mean ") showlevs(levs[[nm]]) } else showlevs(levs[[nm]]) cat("\n") } if(!is.null(tran <- object@misc$tran)) { if (is.list(tran)) tran = "custom - see slot(, \"misc\")$tran" cat(paste("Transformation:", dQuote(tran), "\n")) } } print.ref.grid = function(x,...) print(summary.ref.grid(x, ...)) # vcov method vcov.ref.grid = function(object, ...) { tol = get.lsm.option("estble.tol") if (!is.null(hook <- object@misc$vcovHook)) { if (is.character(hook)) hook = get(hook) hook(object, tol = tol, ...) } else { X = object@linfct estble = estimability::is.estble(X, object@nbasis, tol) ###apply(X, 1, .is.estble, object@nbasis, tol) X[!estble, ] = NA X = X[, !is.na(object@bhat), drop = FALSE] X %*% tcrossprod(object@V, X) } } # Method to alter contents of misc slot update.ref.grid = function(object, ..., silent = FALSE) { args = list(...) valid.choices = c("adjust","alpha","avgd.over","by.vars","df", "initMesg","estName","estType","famSize","infer","inv.lbl", "level","methdesc","predict.type","pri.vars","tran") misc = object@misc for (nm in names(args)) { fullname = try(match.arg(nm, valid.choices), silent=TRUE) if(inherits(fullname, "try-error")) { if (!silent) message("Argument ", sQuote(nm), " was ignored. Valid choices are:\n", paste(valid.choices, collapse=", ")) } else { if (fullname == "by.vars") { allvars = union(misc$pri.vars, misc$by.vars) misc$pri.vars = setdiff(allvars, args[[nm]]) } if (fullname == "pri.vars") { allvars = union(misc$pri.vars, misc$by.vars) misc$by.vars = setdiff(allvars, args[[nm]]) } misc[[fullname]] = args[[nm]] } } object@misc = misc object } ### set or change lsmeans options lsm.options = function(...) { opts = getOption("lsmeans", list()) # if (is.null(opts)) opts = list() newopts = list(...) for (nm in names(newopts)) opts[[nm]] = newopts[[nm]] options(lsmeans = opts) invisible(opts) } # equivalent of getOption() get.lsm.option = function(x, default = lsmeans::defaults[[x]]) { opts = getOption("lsmeans", list()) if(is.null(default) || x %in% names(opts)) opts[[x]] else default } ### Exported defaults for certain options defaults = list( estble.tol = 1e-8, # tolerance for estimability checks disable.pbkrtest = FALSE, # whether to bypass pbkrtest routines for lmerMod pbkrtest.limit = 3000 # limit on N for enabling adj V ) # Utility that returns TRUE if getOption("lsmeans")[[opt]] is TRUE .lsm.is.true = function(opt) { x = get.lsm.option(opt, FALSE) if (is.logical(x)) x else FALSE } ### Utility to change the internal structure of a ref.grid ### Returned ref.grid object has linfct = I and bhat = estimates ### Primary reason to do this is with transform = TRUE, then can ### work with linear functions of the transformed predictions regrid = function(object, transform = TRUE) { est = .est.se.df(object, do.se = TRUE) ###FALSE) estble = !(is.na(est[[1]])) object@V = vcov(object)[estble, estble, drop=FALSE] object@bhat = est[[1]] object@linfct = diag(1, length(estble)) if(all(estble)) object@nbasis = estimability::all.estble else object@nbasis = object@linfct[, !estble, drop = FALSE] if(transform && !is.null(object@misc$tran)) { link = attr(est, "link") D = .diag(link$mu.eta(object@bhat[estble])) object@bhat = link$linkinv(object@bhat) object@V = D %*% tcrossprod(object@V, D) inm = object@misc$inv.lbl if (!is.null(inm)) object@misc$estName = inm object@misc$tran = object@misc$inv.lbl = NULL # override the df function df = est$df if (length(unique(df)) == 1) { object@dfargs = list(df = df[1]) object@dffun = function(k, dfargs) dfargs$df } else { # use containment df object@dfargs = list(df = df) object@dffun = function(k, dfargs) { idx = which(zapsmall(k) != 0) ifelse(length(idx) == 0, NA, min(dfargs$df[idx])) } } } # Nix out things that are no longer needed or valid object@grid$.offset. = object@misc$offset.mult = object@misc$estHook = object@misc$vcovHook = NULL object } ### S4 methods ## use S3 for this setMethod("summary", "ref.grid", summary.ref.grid) setMethod("show", "ref.grid", function(object) str.ref.grid(object)) lsmeans/R/lsm-contr.R0000644000175100001440000001264712634421507014212 0ustar hornikusers### functions to implement different families of contrasts ### All return a matrix or data frame whose columns are the desired contrasts coefs ### with appropriate row and column names ### Also they have two attributes: ### "desc" is an expanded description of the family, ### "adjust" is the default multiplicity adjustment (used if adjust="auto" in lsmeans) # all pairwise trt[i] - trt[j], i < j pairwise.lsmc = function(levs,...) { k = length(levs) M = data.frame(levs=levs) for (i in seq_len(k-1)) { for (j in (i + seq_len(k-i))) { ###for (j in (i+1):k) { con = rep(0,k) con[i] = 1 con[j] = -1 nm = paste(levs[i], levs[j], sep = " - ") M[[nm]] = con } } row.names(M) = levs M = M[-1] attr(M, "desc") = "pairwise differences" attr(M, "adjust") = "tukey" attr(M, "type") = "pairs" M } # all pairwise trt[j] - trt[i], j > i revpairwise.lsmc = function(levs,...) { k = length(levs) M = data.frame(levs=levs) for (i in 2:k) { for (j in seq_len(i-1)) { con = rep(0,k) con[i] = 1 con[j] = -1 nm = paste(levs[i], levs[j], sep = " - ") M[[nm]] = con } } row.names(M) = levs M = M[-1] attr(M, "desc") = "pairwise differences" attr(M, "adjust") = "tukey" attr(M, "type") = "pairs" M } # pseudonym tukey.lsmc = function(levs, reverse = FALSE) { if (reverse) revpairwise.lsmc(levs) else pairwise.lsmc(levs) } # Poly contrasts - scaled w/ integer levels like most tables # ad hoc scaling works for up to 13 levels poly.lsmc = function(levs, max.degree=min(6,k-1)) { nm = c("linear", "quadratic", "cubic", "quartic", paste("degree",5:20)) k = length(levs) M = as.data.frame(poly(seq_len(k), min(20,max.degree))) for (j in seq_len(ncol(M))) { con = M[ ,j] pos = which(con > .01) con = con / min(con[pos]) z = max(abs(con - round(con))) while (z > .05) { con = con / z z = max(abs(con - round(con))) } M[ ,j] = round(con) } row.names(M) = levs names(M) = nm[seq_len(ncol(M))] attr(M, "desc") = "polynomial contrasts" attr(M, "adjust") = "none" M } # All comparisons with a control; ref = index of control group # New version -- allows more than one control group (ref is a vector) trt.vs.ctrl.lsmc = function(levs, ref=1) { if ((min(ref) < 1) || (max(ref) > length(levs))) stop("Reference levels are out of range") k = length(levs) cnm = ifelse(length(ref)==1, levs[ref], paste("avg(", paste(levs[ref], collapse=","), ")", sep="")) templ = rep(0, length(levs)) templ[ref] = -1 / length(ref) M = data.frame(levs=levs) for (i in seq_len(k)) { if (i %in% ref) next con = templ con[i] = 1 nm = paste(levs[i], cnm, sep = " - ") M[[nm]] = con } row.names(M) = levs M = M[-1] attr(M, "desc") = "differences from control" attr(M, "adjust") = "dunnettx" M } # control is 1st level trt.vs.ctrl1.lsmc = function(levs, ...) { trt.vs.ctrl.lsmc(levs, ref = 1) } # control is last level trt.vs.ctrlk.lsmc = function(levs, ...) { trt.vs.ctrl.lsmc(levs, ref = length(levs)) } # pseudonym dunnett.lsmc = function(levs, ref = 1) { trt.vs.ctrl.lsmc(levs, ref = ref) } # effects contrasts. Each mean versus the average of all eff.lsmc = function(levs, ...) { k = length(levs) M = data.frame(levs=levs) for (i in seq_len(k)) { con = rep(-1/k, k) con[i] = (k-1)/k nm = paste(levs[i], "effect") M[[nm]] = con } row.names(M) = levs M = M[-1] attr(M, "desc") = "differences from grand mean" attr(M, "adjust") = "fdr" M } # "deleted" effects contrasts. # Each mean versus the average of all others del.eff.lsmc = function(levs, ...) { k = length(levs) M = as.matrix(eff.lsmc(levs,...)) * k / (k-1) M = as.data.frame(M) attr(M, "desc") = "differences from mean of others" attr(M, "adjust") = "fdr" M } # Contrasts to compare consecutive levels: # (-1,1,0,0,...), (0,-1,1,0,...), ..., (0,...0,-1,1) consec.lsmc = function(levs, reverse = FALSE, ...) { sgn = ifelse(reverse, -1, 1) k = length(levs) M = data.frame(levs=levs) for (i in seq_len(k-1)) { con = rep(0, k) con[i] = -sgn con[i+1] = sgn nm = ifelse(reverse, paste(levs[i], "-", levs[i+1]), paste(levs[i+1], "-", levs[i])) M[[nm]] = con } row.names(M) = levs M = M[-1] attr(M, "desc") = "changes between consecutive levels" attr(M, "adjust") = "mvt" M } # Mean after minus mean before # e.g., (-1, 1/3,1/3,1/3), (-1/2,-1/2, 1/2,1/2), (-1/3,-1/3,-1/3, 1) mean_chg.lsmc = function(levs, reverse = FALSE, ...) { sgn = ifelse(reverse, -1, 1) k = length(levs) M = data.frame(levs=levs) for (i in seq_len(k-1)) { kmi = k - i con = rep(c(-sgn/i, sgn/kmi), c(i, kmi)) nm = paste(levs[i], levs[i+1], sep="|") M[[nm]] = con } row.names(M) = levs M = M[-1] attr(M, "desc") = "mean after minus mean before" attr(M, "adjust") = "mvt" M } lsmeans/R/rbind.R0000644000175100001440000000354512634421507013367 0ustar hornikusers# rbind method for ref.grid objects rbind.ref.grid = function(..., deparse.level = 1, adjust = "mvt") { objs = list(...) if (!all(sapply(objs, inherits, "ref.grid"))) stop("All objects must inherit from 'ref.grid'") bhats = lapply(objs, function(o) o@bhat) bhat = bhats[[1]] if(!all(sapply(bhats, function(b) length(b) == length(bhat) && sum((b - bhat)^2) == 0))) stop("All objects must have the same fixed effects") Vs = lapply(objs, function(o) o@V) V = Vs[[1]] if(!all(sapply(Vs, function(v) sum((v - V)^2) == 0))) stop("All objects must have the same covariances") obj = objs[[1]] linfcts = lapply(objs, function(o) o@linfct) obj@linfct = do.call(rbind, linfcts) bnms = unlist(lapply(objs, function(o) o@misc$by.vars)) grids = lapply(objs, function(o) o@grid) gnms = unique(c(bnms, unlist(lapply(grids, names)))) gnms = setdiff(gnms, c(".wgt.", ".offset.")) # exclude special names grid = data.frame(.tmp. = seq_len(n <- nrow(obj@linfct))) for (g in gnms) grid[[g]] = rep(".", n) grid$.tmp. = NULL n.before = 0 for (g in grids) { rows = n.before + seq_along(g[[1]]) n.before = max(rows) for (nm in names(g)) grid[rows, nm] = g[[nm]] ####as.character(g[[nm]]) } obj@grid = grid update(obj, pri.vars = gnms, by.vars = NULL, adjust = adjust, famSize = round((1 + sqrt(1 + 8*n)) / 2, 3), estType = "contrast", infer = c(FALSE, TRUE)) } ### Subset a reference grid "[.ref.grid" = function(x, i, adjust = "mvt", ...) { x@linfct = x@linfct[i, , drop=FALSE] x@grid = x@grid[i, , drop = FALSE] x = update(x, pri.vars = names(x@grid), famSize = 2, adjust = adjust) x@misc$by.vars = NULL x } lsmeans/R/MCMC-support.R0000644000175100001440000001067012634421507014517 0ustar hornikusers# Support for MCMCglmm class and possibly more MCMC-based models # Method to create a coda 'mcmc' object from a ref.grid # (dots not supported, unfortunately) as.mcmc.ref.grid = function(x, names = TRUE, ...) { object = x if (is.na(x@post.beta[1])) stop("No posterior sample -- can't make an 'mcmc' object") mat = x@post.beta %*% t(x@linfct) nm = setdiff(names(x@grid), c(".wgt.",".offset.")) if (any(names)) { names = rep(names, length(nm)) for (i in seq_along(nm)) if(names[i]) x@grid[nm[i]] = paste(nm[i], x@grid[[nm[i]]]) } dimnames(mat)[[2]] = do.call(paste, c(x@grid[, nm, drop = FALSE], sep=", ")) coda::mcmc(mat, ...) } # Currently, data is required, as call is not stored recover.data.MCMCglmm = function(object, data, ...) { # if a multivariate response, stack the data with `trait` variable yvars = .all.vars(update(object$Fixed$formula, ". ~ 1")) if(length(yvars) > 1) { # for (v in yvars) data[[v]] = NULL dat = data for (i in seq_len(length(yvars) - 1)) data = rbind(data, dat) data$trait = factor(rep(yvars, each = nrow(dat))) } attr(data, "call") = object$Fixed attr(data, "terms") = trms = delete.response(terms(object$Fixed$formula)) attr(data, "predictors") = .all.vars(delete.response(trms)) attr(data, "responses") = yvars data } lsm.basis.MCMCglmm = function(object, trms, xlev, grid, vcov., ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = NULL) Sol = as.matrix(object$Sol)[, seq_len(object$Fixed$nfl)] # toss out random effects if included bhat = apply(Sol, 2, mean) if (missing(vcov.)) V = cov(Sol) else V = .my.vcov(object, vcov.) misc = list() list(X = X, bhat = bhat, nbasis = matrix(NA), V = V, dffun = function(k, dfargs) NA, dfargs = list(), misc = misc, post.beta = Sol) } ### Support for MCMCpack , maybe others that produce mcmc objects ### Whether it works depends on: ### 1. if there is a "call" attribute with a formula or fixed member ### 2. if it's right, even then ### Alternatively, maybe providing formula and data will do the trick recover.data.mcmc = function(object, formula, data, ...) { if (missing(formula)) { cl = attr(object, "call") if (is.null(cl$formula)) cl$formula = cl$fixed if (is.null(cl$formula)) return("No fixed-effects formula found") data = NULL } else { if (missing(formula) || missing(data)) return("Requires both formula and data to proceed") cl = call("mcmc.proxy", formula = formula, data = quote(data)) } trms = delete.response(terms(eval(cl$formula, parent.frame()))) recover.data(cl, trms, NULL, data, ...) } lsm.basis.mcmc = function(object, trms, xlev, grid, vcov., ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = NULL) samp = as.matrix(object)[, seq_len(ncol(X)), drop = FALSE] bhat = apply(samp, 2, mean) if (missing(vcov.)) V = cov(samp) else V = .my.vcov(object, vcov.) misc = list() list(X = X, bhat = bhat, nbasis = matrix(NA), V = V, dffun = function(k, dfargs) NA, dfargs = list(), misc = misc, post.beta = samp) } ### support for CARBayes package - currently MUST supply data and have ### default contrasts matching what was used in fitting the mdoel recover.data.carbayes = function(object, data, ...) { if(is.null(data)) # Try to recover data from parent frame data = model.frame(object$formula, data = parent.frame()) cl = call("carbayes.proxy", formula = object$formula, data = quote(data)) trms = delete.response(terms(eval(object$formula, parent.frame()))) recover.data(cl, trms, NULL, data, ...) } lsm.basis.carbayes = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = attr(object$X, "contrasts")) samp = as.matrix(object$samples$beta) bhat = apply(samp, 2, mean) V = cov(samp) misc = list() list(X = X, bhat = bhat, nbasis = matrix(NA), V = V, dffun = function(k, dfargs) NA, dfargs = list(), misc = misc, post.beta = samp) } lsmeans/R/S4-classes.R0000644000175100001440000000205312634421507014203 0ustar hornikusers### S4 class definitions for lsmeans package ### ref.grid object -- for a reference grid setClass("ref.grid", representation ( model.info = "list", roles = "list", grid = "data.frame", levels = "list", matlevs = "list", linfct = "matrix", bhat = "numeric", nbasis = "matrix", V = "matrix", dffun = "function", dfargs = "list", misc = "list", post.beta = "matrix" )) # Note: misc will hold various extra params, # including at least the following req'd by the summary method # estName: column name for the estimate in the summary ["prediction"] # infer: booleans (CIs?, tests?) [(FALSE,FALSE)] # level: default conf level [.95] # adjust: default adjust method ["none"] # famSize: number of means in family ### lsmobj class -- almost trivial ext of ref.grid, structurally # But origin can be very different from those of a reference grid # In general its 'grid' will correspond to some set of # linear functions of grid points setClass("lsmobj", contains="ref.grid") lsmeans/R/multinom-support.R0000644000175100001440000000472712634421507015652 0ustar hornikusers### Multinomial modeling ### Example for testing ### From: http://www.ats.ucla.edu/stat/r/dae/mlogit.htm # library(foreign) # ml <- read.dta("http://www.ats.ucla.edu/stat/data/hsbdemo.dta") # library(nnet) # ml$prog2 <- relevel(ml$prog, ref = "academic") # test <- multinom(prog2 ~ ses + write, data = ml) # # same as recover.data.lm recover.data.multinom = function(object, ...) { fcall = object$call recover.data(fcall, delete.response(terms(object)), object$na.action, ...) } lsm.basis.multinom = function(object, trms, xlev, grid, mode = c("prob", "latent"), ...) { mode = match.arg(mode) bhat = t(coef(object)) V = .my.vcov(object, ...) k = ncol(bhat) m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) # recenter for latent predictions pat = (rbind(0, diag(k + 1, k)) - 1) / (k + 1) X = kronecker(pat, X) nbasis = estimability::all.estble nbasis = kronecker(rep(1,k), nbasis) misc = list(tran = "log", inv.lbl = "e^y") dfargs = list(df = object$edf) dffun = function(k, dfargs) dfargs$df ylevs = list(class = object$lev) if (is.null(ylevs)) ylevs = list(class = seq_len(k)) names(ylevs) = as.character(object$call$formula[[2]]) misc$ylevs = ylevs if (mode == "prob") misc$postGridHook = .multinom.postGrid list(X = X, bhat = as.numeric(bhat), nbasis = nbasis, V = V, dffun = dffun, dfargs = dfargs, misc = misc) } # post-processing of ref.grid for "prob" mode .multinom.postGrid = function(object) { # will replace portions of these as we go bhat = object@bhat linfct = object@linfct misc = object@misc # grid will have multresp as slowest-varying factor... idx = matrix(seq_along(linfct[, 1]), ncol = length(object@levels[[object@roles$multresp]])) for (i in 1:nrow(idx)) { rows = idx[i, ] exp.psi = exp(linfct[rows, , drop = FALSE] %*% object@bhat) p = as.numeric(exp.psi / sum(exp.psi)) bhat[rows] = p A = .diag(p) - outer(p, p) # partial derivs linfct[rows, ] = A %*% linfct[rows, ] } misc$postGridHook = misc$tran = misc$inv.lbl = NULL misc$estName = "prob" object@bhat = bhat object@V = linfct %*% tcrossprod(object@V, linfct) object@linfct = diag(1, length(bhat)) object@misc = misc object }lsmeans/R/nonlin-support.R0000644000175100001440000000513512634421507015275 0ustar hornikusers# experimental support for nls, nlme objects recover.data.nls = function(object, ...) { fcall = object$call trms = terms(reformulate(names(object$dataClasses))) recover.data(fcall, trms, object$na.action, ...) } lsm.basis.nls = function(object, trms, xlev, grid, ...) { Vbeta = .my.vcov(object, ...) env = object$m$getEnv() for (nm in names(grid)) env[[nm]] = grid[[nm]] pars = object$m$getAllPars() DD = deriv(object$m$formula(), names(pars)) ests = eval(DD, env) bhat = as.numeric(ests) grad = attr(ests, "gradient") V = grad %*% Vbeta %*% t(grad) X = diag(1, nrow(grid)) list(X=X, bhat=bhat, nbasis=all.estble, V=V, dffun=function(k, dfargs) NA, dfargs=list(), misc=list()) } ### For nlme objects, we can do stuff with the fixed part of the model ### Additional REQUIRED argument is 'param' - parameter name to explore recover.data.nlme = function(object, param, ...) { if(missing(param)) return("'param' argument is required for nlme objects") fcall = object$call if (!is.null(fcall$weights)) fcall$weights = nlme::varWeights(object$modelStruct) fixed = fcall$fixed if (is.call(fixed)) fixed = eval(fixed, envir = parent.frame()) if(!is.list(fixed)) fixed = list(fixed) form = NULL for (x in fixed) if (param %in% all.names(x)) form = x if (is.null(form)) return(paste("Can't find '", param, "' among the fixed parameters", sep = "")) fcall$weights = NULL #trms = delete.response(terms(update(terms(object), form))) trms = delete.response(terms(form)) if (length(.all.vars(trms)) == 0) return(paste("No predictors for '", param, "' in fixed model", sep = "")) recover.data(fcall, trms, object$na.action, ...) } lsm.basis.nlme = function(object, trms, xlev, grid, param, ...) { idx = object$map$fmap[[param]] V = object$varFix[idx, idx, drop = FALSE] bhat = object$coefficients$fixed[idx] contr = attr(object$plist[[param]]$fixed, "contrasts") m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = contr) dfx = object$fixDF$X[idx] dfx[1] = min(dfx) # I'm assuming 1st one is intercept dffun = function(k, dfargs) { # containment df idx = which(abs(k) > 1e-6) ifelse(length(idx) > 0, min(dfargs$dfx[idx]), NA) } list(X = X, bhat = bhat, nbasis = estimability::all.estble, V = V, dffun = dffun, dfargs = list(dfx = dfx), misc = list(estName = param)) } lsmeans/vignettes/0000755000175100001440000000000012634421564013751 5ustar hornikuserslsmeans/vignettes/lsmeans.bib0000644000175100001440000001507112634421507016072 0ustar hornikusers;;; .bib file for lsmeans @book{Box05, author = "Box, G. and Hunter, J. and Hunter, W.", year = 2005, title = "Statistics for Experimenters", edition = "2nd", publisher = "Wiley" } @inproceedings{Har76, author = "Harvey, W.", year = 1976, title = "Use of the {HARVEY} Procedure", booktitle = "{SUGI} Proceedings", url = "http://www.sascommunity.org/sugi/SUGI76/Sugi-76-20%20Harvey.pdf" } @techreport{Har60, author = "W. Harvey", year = 1960, title = "Least-squares analysis of data with unequal subclass numbers", institution = "{USDA} National Agricultural Library", number = "ARS-20-8" } @manual{Har77, author = "Harvey, W. R.", year = 1977, title = "User's guide for {LSML}~76. Mixed model least-squares and maximum likelihood computer program", organization = "Ohio State University" } @techreport{Goo97, author = "J. H. Goodnight and W. R. Harvey", year = 1997, title = "Least squares means in the fixed effects general model", number = "{SAS} Technical Report R-103", institution = "{SAS} Institute Inc." } @article{Sea80, author = "S. R. Searle and F. M. Speed and G. A. Milliken", year = "1980", title = "Population marginal means in the linear model: An alternative to least squares means", journal = "The American Statistician", volume = 34, number = 4, pages = "216-221" } @article{Les04, author = "Lesnoff, M. and Laval, G. and Bonnet, P. and Abdicho, S. and Workalemahu, A. and Kifle, D. and Peyraud, A. and Lancelot, R. and Thiaucourt, F.", year = 2004, title = "Within-Herd Spread of Contagious Bovine Pleuropneumonia in {Ethiopian} Highlands", journal = "Preventive Veterinary Medicine", volume = 64, pages = "27-40" } @book{Mil92, author = "Milliken, G. A. and Johnson, D. E.", year = 1992, title = "Analysis of Messy Data -- Volume I: Designed Experiments", publisher = "Chapman \&{} Hall/CRC", isbn = "0-412-99081-4" } @book{Oeh00, author = "Oehlert, G.", year = 2000, title = "A First Course in Design and Analysis of Experiments", publisher = "{W.~H.~Freeman}" } ;;This is out-of-print, but now available under a Creative Commons license via \url{http://users.stat.umn.edu/~gary/Book.html} (accessed August 23, 2012). @inproceedings{SAS12, author= "{SAS Institute Inc.}", year = 2012, title = "\code{LSMEANS} Statement", booktitle = "{\proglang{SAS/STAT}(R)} 9.3 User's Guide", url = "http://support.sas.com/documentation/cdl/en/statug/63962/HTML/default/viewer.htm#statug_introcom_a0000003362.htm" } ;;\item[Tukey, J.~W.~(1977)] \emph{Exploratory Data Analysis}. Addison-Wesley. @article{urq82, author = "N. Scott Urquhart", year = 1982, title = "Adjustment in covariates when one factor affects the covariate", journal = "Biometrics", volume = 38, pages = "651-660" } @article{Yat35, author = "Yates, F", year = 1935, title = "Complex Experiments", journal = "{Journal of the Royal Statistical Society} (Supplement)", volume = 2, pages = "181-247" } ;;; R packages... @article{effects, author = "John Fox", year = 2003, title = "Effect Displays in \proglang{R} for Generalised Linear Models", journal = "{Journal of Statistical Software}", volume = 8, number = 15, pages = "1-27", url = "http://www.jstatsoft.org/v08/i15/" } @article{fox09, author = "John Fox and Jangman Hong", year = 2009, title = "Effect Displays in \proglang{R} for Multinomial and Proportional-Odds Logit Models: Extensions to the \pkg{effects} Package", journal = "{Journal of Statistical Software}", volume = 32, number = 1, pages = "1-24", url = "http://www.jstatsoft.org/v32/i01/" } @Manual{doBy, title = {\pkg{doBy}: Groupwise summary statistics, LSmeans, general linear contrasts, various utilities}, author = {S{\o}ren H{\o}jsgaard and Ulrich Halekoh and Jim Robison-Cox and Kevin Wright and Alessandro A. Leidi}, year = {2013}, note = {\R{} package version 4.5-10}, url = {http://CRAN.R-project.org/package=doBy}, } @Manual{lsmea, title = {\pkg{lsmeans}: Least-Squares Means}, author = {Russell V. Lenth}, year = {2014}, note = {\R{} package version 2.10} } @Manual{lme4, title = {\pkg{lme4}: Linear Mixed-effects Models Using \pkg{Eigen} and \proglang{S4}}, author = {Douglas Bates and Martin Maechler and Ben Bolker and Steven Walker}, year = {2013}, note = {\R{} package version 1.1-0}, url = {http://lme4.r-forge.r-project.org/}, } @Manual{pbkrt, title = {\pkg{pbkrtest}: Parametric Bootstrap and Kenward Roger Based Methods for Mixed Model Comparison}, author = {Ulrich Halekoh and S{\o}ren H{\o}jsgaard}, year = {2013}, note = {\R{} package version 0.3-8}, url = {http://CRAN.R-project.org/package=pbkrtest}, } @Manual{multc, title = {\pkg{multcomp}: Simultaneous Inference in General Parametric Models}, author = {Torsten Hothorn and Frank Bretz and Peter Westfall}, year = {2013}, note = {\R{} package version 1.3-1}, url = {http://CRAN.R-project.org/package=multcomp}, } @Manual{mcview, title = {\pkg{multcompView}: Visualizations of Paired Comparisons}, author = {Spencer Graves and Hans-Peter Piepho and Luciano Selzer and Sundar Dorai-Raj}, year = {2012}, note = {\R{} package version 0.1-5}, url = {http://CRAN.R-project.org/package=multcompView}, } @Manual{latti, title = {\pkg{lattice}: Lattice Graphics}, author = {Deepayan Sarkar}, year = {2013}, note = {\R{} package version 0.20-24}, url = {http://CRAN.R-project.org/package=lattice}, } @Manual{nlme, title = {\pkg{nlme}: Linear and Nonlinear Mixed Effects Models}, author = {Jos? Pinheiro and Douglas Bates and {R-core}}, year = {2013}, note = {\R{} package version 3.1-113}, url = {http://CRAN.R-project.org/package=nlme}, } @article{Bra08, author = "Brader, T. and Valentino, N. and Suhay, E.", year = 2008, title = "What triggers public opposition to immigration? Anxiety, group cues, and immigration threat", journal = "American Journal of Political Science", volume = 52, number = 4, pages = "959-978" } @article{Sch87, author = "Schuirmann, Donald", year = 1987, title = "A Comparison of the Two One-Sided Tests Procedure and the Power Approach for Assessing the Equivalence of Average Bioavailability", journal = "Journal of Pharmacokinetics and Biopharmaceutics", volume = 15, number = 6, pages = "657-680" } lsmeans/vignettes/extending.rnw0000644000175100001440000004210112634421507016461 0ustar hornikusers\documentclass[11pt]{article} \usepackage[margin=1in]{geometry} \usepackage{mathpazo} \usepackage{fancyvrb} \usepackage{natbib} \usepackage{hyperref} \let\dq=" \DefineShortVerb{\"} \def\pkg#1{\textsf{#1}} \def\lsm{\pkg{lsmeans}} \def\code{\texttt} \def\proglang{\textsf} % double-quoted text \def\dqt#1{\code{\dq{}#1\dq{}}} % The objects I want to talk about \def\rg{\dqt{ref.grid}} \def\lsmo{\dqt{lsmobj}} \def\R{\proglang{R}} \def\SAS{\proglang{SAS}} \def\Fig#1{Figure~\ref{#1}} \def\bottomfraction{.5} \title{Extending \lsm{}} \author{Russell V.~Lenth} %\VignetteIndexEntry{Extending lsmeans} %\VignetteDepends{lsmeans} %\VignetteKeywords{least-squares means} %\VignettePackage{lsmeans} % Initialization <>= options(show.signif.stars=FALSE, prompt="R> ", continue=" ") set.seed(271828) @ \begin{document} \SweaveOpts{concordance=TRUE} \maketitle{} \section{Introduction} Suppose you want to use \lsm{} for some type of model that it doesn't (yet) support. Or, suppose you have developed a new package with a fancy model-fitting function, and you'd like it to work with \lsm{}. What can you do? Well, there is hope because \lsm{} is designed to be extended. The first thing to do is to look at the help page for extending the package: <>= help("extending-lsmeans", package="lsmeans") @ It gives details about the fact that you need to write two S3 methods, "recover.data" and "lsm.basis", for the class of object that your model-fitting function returns. The "recover.data" method is needed to recreate the dataset so that the reference grid can be identified. The "lsm.basis" method then determines the linear functions needed to evaluate each point in the reference grid and to obtain associated information---such as the variance-covariance matrix---needed to do estimation and testing. This vignette presents an example where suitable methods are developed, and discusses a few issues that arise. \section{Data example} The \pkg{MASS} package contains various functions that do robust or outlier-resistant model fitting. We will cobble together some \lsm{} support for these. But first, let's create a suitable dataset (a simulated two-factor experiment) for testing.\footnote{I unapologetically use \code{=} as the assignment operator. It is good enough for C and Java, and supported by R.} <<>>= fake = expand.grid(rep = 1:5, A = c("a1","a2"), B = c("b1","b2","b3")) fake$y = c(11.46,12.93,11.87,11.01,11.92,17.80,13.41,13.96,14.27,15.82, 23.14,23.75,-2.09,28.43,23.01,24.11,25.51,24.11,23.95,30.37, 17.75,18.28,17.82,18.52,16.33,20.58,20.55,20.77,21.21,20.10) @ The $y$ values were generated using predetermined means and Cauchy-distributed errors. There are some serious outliers in these data. \section{Supporting \code{rlm}} The \pkg{MASS} package provides an "rlm" function that fits robust-regression models using $M$~estimation. We'll fit a model using the default settings for all tuning parameters: <<>>= library(MASS) fake.rlm = rlm(y ~ A * B, data = fake) library(lsmeans) lsmeans(fake.rlm, ~B | A) @ The first lesson to learn about extending \lsm{} is that sometimes, it already works! It works here because "rlm" objects inherit from "lm", which is supported by the \lsm{} package, and "rlm" objects aren't enough different to create any problems. \section{Supporting \code{lqs} objects} The \pkg{MASS} resistant-regression functions "lqs", "lmsreg", and "ltsreg" are another story, however. They create "lqs" objects that are not extensions of any other class, and have other issues, including not even having a "vcov" method. So for these, we really do need to write new methods for "lqs" objects. First, let's fit a model. <<>>= fake.lts = ltsreg(y ~ A * B, data = fake) @ \subsection{The \code{recover.data} method} It is usually an easy matter to write a "recover.data" method. Look at the one for "lm" objects: <<>>= lsmeans:::recover.data.lm @ Note that all it does is obtain the "call" component and call the method for class \dqt{call}, with additional arguments for its "terms" component and "na.action". It happens that we can access these attributes in exactly the same way as for "lm" objects; so, \ldots <<>>= recover.data.lqs = lsmeans:::recover.data.lm @ Let's test it: <<>>= rec.fake = recover.data(fake.lts) head(rec.fake) @ Our recovered data excludes the response variable "y" (owing to the "delete.response" call), and this is fine. \paragraph{Special arguments} By the way, there are two special arguments "data" and "params" that may be handed to "recover.data" via "ref.grid" or "lsmeans" or a related function; and you may need to provide for if you don't use the "recover.data.call" function. The "data" argument is needed to cover a desperate situation that occurs with certain kinds of models where the underlying data information is not saved with the object---e.g., models that are fitted by iteratively modifying the data. In those cases, the only way to recover the data is to for the user to give it explicitly, and "recover.data" just adds a few needed attributes to it. The "params" argument is needed when the model formula refers to variables besides predictors. For example, a model may include a spline term, and the knots are saved in the user's environment as a vector and referred to in the call to fit the model. In trying to recover the data, we try to construct a data frame containing all the variables present on the right-hand side of the model, but if some of those are scalars or of different lengths than the number of observations, an error occurs. So you need to exclude any names in "params" when reconstructing the data. \paragraph{Error handling} If you check for any error conditions in "recover.data", simply have it return a character string with the desired message, rather than invoking "stop". This provides a cleaner exit. The reason is that whenever "recover.data" throws an error, an informative message suggesting that "data" or "params" be provided is displayed. But a character return value is tested for and throws a different error with your string as the message. \subsection{The \code{lsm.basis} method} The "lsm.basis" method has four required arguments: <<>>= args(lsmeans:::lsm.basis.lm) @ These are, respectively, the model object, its "terms" component (at least for the right-hand side of the model), a "list" of levels of the factors, and the grid of predictor combinations that specify the reference grid. The function must obtain six things and return them in a named "list". They are the matrix "X" of linear functions for each point in the reference grid, the regression coefficients "bhat"; the variance-covariance matrix "V"; a matrix "nbasis" for non-estimable functions; a function "dffun(k,dfargs)" for computing degrees of freedom for the linear function "sum(k*bhat)"; and a list "dfargs" of arguments to pass to "dffun". To write your own "lsm.basis" function, examining some of the existing methods can help; but the best resource is the "predict" method for the object in question, looking carefully to see what it does to predict values for a new set of predictors (e.g., "newdata" in "predict.lm"). Following this advice, let's take a look at it: <<>>= MASS:::predict.lqs @ \RecustomVerbatimEnvironment{Sinput}{Verbatim}{numbers=left} Based on this, here is a listing of an "lsm.basis" method for "lqs" objects: <<>>= lsm.basis.lqs = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = coef(object) Xmat = model.matrix(trms, data=object$model) V = rev(object$scale)[1]^2 * solve(t(Xmat) %*% Xmat) nbasis = matrix(NA) dfargs = list(df = nrow(Xmat) - ncol(Xmat)) dffun = function(k, dfargs) dfargs$df list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=dfargs) } @ \RecustomVerbatimEnvironment{Sinput}{Verbatim}{numbers=none} Before explaining it, let's verify that it works: <<>>= lsmeans(fake.lts, ~ B | A) @ Hooray! Note the results are comparable to those we had for "fake.rlm", albeit the standard errors are quite a bit smaller. (In fact, the SEs could be misleading; a better method for estimating covariances should probably be implemented, but that is beyond the scope of this vignette.) \subsection{Dissecting \code{lsm.basis.lqs}} Let's go through the listing of this method, by line numbers. \begin{itemize} \item[2--3:] Construct the linear functions, "X". This is a pretty standard standard two-step process: First obtain a model frame, "m", for the grid of predictors, then pass it as data to "model.data" to create the associated design matrix. As promised, this code is essentially identical to what you find in "predict.lqs". \item[4:] Obtain the coefficients, "bhat". Most model objects have a "coef" method. \item[5--6:] Obtain the covariance matrix, "V", of "bhat". In many models, this can be obtained using the object's "vcov" method. But not in this case. Instead, I cobbled one together using what it would be for ordinary regression: $\hat\sigma^2(\mathbf{X}'\mathbf{X})^{-1}$, where $\mathbf{X}$ is the design matrix for the whole dataset (not the reference grid). Here, $\hat\sigma$ is obtained using the last element of the "scale" element of the object (depending on the method, there are one or two scale estimates). This probably under-estimates the variances and distorts the covariances, because robust estimators have some efficiency loss. \item[7:] Compute the basis for non-estimable functions. This applies only when there is a possibility of rank deficiency in the model, and "lqs" methods cannot handle that. All linear functions are estimable, and we signal that by setting "nbasis" equal to a $1\times1$ matrix of "NA". If rank deficiency were possible, the \pkg{estimability} package (which is required by \lsm{}) provides a "nonest.basis" function that makes this fairly painless---I would have coded: <>= nbasis = estimability::nonest.basis(Xmat) @ On the other hand, if rank-deficient cases are not possible, set "nbasis" equal to "all.estble", a constant in the \pkg{estimability} package. There is a subtlety you need to know regarding estimability. Suppose the model is rank-deficient, so that the design matrix $\mathbf{X}$ has $p$ columns but rank $r>= lsm.basis.lqs = function(object, trms, xlev, grid, ...) { m = model.frame(trms, grid, na.action = na.pass, xlev = xlev) X = model.matrix(trms, m, contrasts.arg = object$contrasts) bhat = coef(object) V = diag(rep(NA, length(bhat))) nbasis = matrix(NA) dffun = function(k, dfargs) NA list(X=X, bhat=bhat, nbasis=nbasis, V=V, dffun=dffun, dfargs=list()) } %@ And here is a test: %<<>>= lsmeans(fake.lts, pairwise ~ B) %@ \fi % ----------- end of cut --------------------------- \section{Hook functions} Most linear models supported by \lsm{} have straightforward structure: Regression coefficients, their covaraince matrix, and a set of linear functions that define the reference grid. However, a few are more complex. An example is the \dqt{clm} class in the \pkg{ordinal} package, which allows a scale model in addition to the location model. When a scale model is used, the scale parameters are included in the model matrix, regression coefficients, and covariance matrix, and we can't just use the usual matrix operations to obtain estimates and standard errors. To facilitate using custom routines for these tasks, the "lsm.basis.clm" function includes, in its "misc" part, the names (as character constants) of two ``hook'' functions: "misc$estHook" has the name of the function to call when computing estimates, standard errors, and degrees of freedom (for the"summary" method); and "misc$vcovHook" has the name of the function to call to obtain the covariance matrix of the grid values (used by the "vcov" method). These functions are called in lieu of the usual built-in routines for these purposes, and return the appropriately sized matrices. In addition, you may want to apply some form of special post-processing after the reference grid is constructed. To provide for this, give the name of your function to post-process the object in "misc$postGridHook". Again, \dqt{clm} objects (as well as \dqt{polr} in the \pkg{MASS} package) serve as an example. They allow a "mode" specification that in twio cases, calls for post-processing. The \dqt{cum.prob} mode uses the "regrid" function to transform the linear predictor to the cumulative-probability scale. And the \dqt{prob} mode performs this, as well as applying the contrasts necessary to difference the cumulative probabilities into the class probabilities. \section{Exported methods} For package developers' convenience, \pkg{lsmeans} exports some of its S3 methods for "recover.data" and/or "lsm.basis"---use \code{methods(\dqt{recover.data})} and \code{methods(\dqt{lsm.basis})} to discover which ones. It may be that all you need is to invoke one of those methods and perhaps make some small changes---especially if your model-fitting algorithm makes heavy use of an existing model type supported by \pkg{lsmeans}. Contact me if you need \pkg{lsmeans} to export some additional methods for your use. A few additional functions are exported because they may be useful to developers. They are as follows: \begin{description} \item[\code{.all.vars(expr, retain)}] Some users of your package may include "$" or "[[]]" operators in their model formulas. If you need to get the variable names, "base::all.vars" will probably not give you what you need. Here is an example: <<>>= form = ~ data$x + data[[5]] base::all.vars(form) lsmeans::.all.vars(form) @ The "retain" argument may be used to specify regular expressions for patterns to retain as parts of variable names. \item[\code{.diag(x, nrow, ncol)}] The base "diag" function has a booby trap whereby, for example, "diag(57.6)" returns a $57\times 57$ identity matrix rather than a $1\times1$ matrix with $57.6$ as its only element. But "lsmeans::.diag(57.6)" will return the latter. The function works identically to "diag" except for the identity-matrix trap. \item[\code{.aovlist.dffun(k, dfargs)}] This function is exported because it is needed for computing degrees of freedom for models fitted using "aov", but it may be useful for other cases where Satterthwaite degrees-of-freedom calculations are needed. It requires the "dfargs" slot to contain analogous contents. \item[\code{.get.offset(terms, grid)}] If "terms" is a model formula containing an "offset" call, this is will compute that offset in the context of "grid" (a "data.frame"). <<>>= .get.offset(terms(~ speed + offset(.03*breaks)), head(warpbreaks)) @ \item[\code{.my.vcov(object, ...)}] In a call to "ref.grid", "lsmeans", etc., the user may use "vcov." to specify an alternative function or matrix to use as the covariance matrix of the fixed-effects coefficients. This function supports that feature. Calling ".my.vcov" in place of the "vcov" method will substitute the user's "vcov." when it is present in "...". \end{description} \section{Conclusions} It is relatively simple to write appropriate methods that work with \lsm{} for model objects it does not support. I hope this vignette is helpful for understanding how. Furthermore, if you are the developer of a package that fits linear models, I encourage you to include "recover.data" and "lsm.basis" methods for those classes of objects, and to remember to export them in your "NAMESPACE" file as follows: \begin{verbatim} S3method(myobject, recover.data) S3method(myobject, lsm.basis) \end{verbatim} \end{document}lsmeans/vignettes/using-lsmeans.rnw0000644000175100001440000016664312634421507017303 0ustar hornikusers\documentclass[11pt]{article} \usepackage[margin=1in]{geometry} \usepackage{mathpazo} \usepackage{hyperref} \usepackage{fancyvrb} \usepackage{multicol} \usepackage{natbib} \usepackage{Sweave} \hypersetup{colorlinks=true,allcolors=black,urlcolor=blue} \let\dq=" \DefineShortVerb{\"} \def\pkg{\textbf} \def\proglang{\textsf} \def\lsm{\pkg{lsmeans}} % double-quoted text \def\dqt#1{\code{\dq{}#1\dq{}}} % The objects I want to talk about \def\rg{\dqt{ref.grid}} \def\lsmo{\dqt{lsmobj}} % for use in place of \item in a description env where packages are listed \def\pitem#1{\item[\pkg{#1}]} \def\R{\proglang{R}} \def\SAS{\proglang{SAS}} \def\code{\texttt} \def\Fig#1{Figure~\ref{#1}} \def\bottomfraction{.5} %\VignetteIndexEntry{Using lsmeans} %\VignetteDepends{lsmeans} %\VignetteKeywords{least-squares means} %\VignettePackage{lsmeans} % Initialization <>= options(show.signif.stars=FALSE, prompt="R> ", continue=" ", useFancyQuotes=FALSE, width=100, digits=6) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Russell V.~Lenth\\The University of Iowa} \title{Using \lsm{}} %% without formatting \ifx %xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %% for pretty printing and a nice hypersummary also set: \Plainauthor{Russell V.~Lenth} %% comma-separated \Plaintitle{Least-squares Means: The R Package lsmeans} %% without formatting \Shorttitle{The R Package lsmeans} %% a short title (if necessary) \fi %xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ifx % IGNORE xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %% The address of (at least) one author should be given %% in the following format: \Address{ Russell V.~Lenth, Professor Emeritus\\ Department of Statistics and Actuarial Science\\ % 241 Schaeffer Hall\\ The University of Iowa\\ Iowa City, IA 52242 ~ USA\\ E-mail: \email{russell-lenth@uiowa.edu} %\\ % URL: \url{http://www.stat.uiowa.edu/~rlenth/} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 \fi %xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \SweaveOpts{concordance=TRUE} \maketitle{} \begin{abstract} Least-squares means are predictions from a linear model, or averages thereof. They are useful in the analysis of experimental data for summarizing the effects of factors, and for testing linear contrasts among predictions. The \lsm{} package provides a simple way of obtaining least-squares means and contrasts thereof. It supports many models fitted by \R{} core packages (as well as a few key contributed ones) that fit linear or mixed models, and provides a simple way of extending it to cover more model classes. \end{abstract} \section{Introduction} Least-squares means (LS~means for short) for a linear model are simply predictions---or averages thereof---over a regular grid of predictor settings which I call the \emph{reference grid}. They date back at least to \cite{Har60} and his associated computer program \proglang{LSML} \citep{Har77} and the contributed \SAS{} procedure named \pkg{HARVEY} \citep{Har76}. Later, they were incorporated via \code{LSMEANS} statements for various linear model procedures such as \pkg{GLM} in the regular \SAS{} releases. See also \cite{Goo97} and \cite{SAS12} for more information about the \SAS{} implementation. In simple analysis-of-covariance models, LS~means are the same as covariate-adjusted means. In unbalanced factorial experiments, LS~means for each factor mimic the main-effects means but are adjusted for imbalance. The latter interpretation is quite similar to the ``unweighted means'' method for unbalanced data, as presented in old design books. LS~means are not always well understood, in part because the term itself is confusing. \cite{Sea80} discusses exactly how they are defined for various factorial, nested, and covariance models. \citeauthor{Sea80} suggest the term ``predicted marginal means'' (or PMMs) as a better descriptor. However, the term ``least-squares means'' was already well established in the \SAS{} software, and it has stuck. The most important things to remember are: \begin{itemize} \item LS~means are computed relative to a \emph{reference grid}. \item Once the reference grid is established, LS~means are simply predictions on this grid, or marginal averages of a table of these predictions. \end{itemize} A user who understands these points will know what is being computed, and thus can judge whether or not LS~means are appropriate for the analysis. \section{The reference grid} Since the reference grid is fundamental, it is our starting point. For each predictor in the model, we define a set of one or more \emph{reference levels}. The reference grid is then the set of all combinations of reference levels. If not specified explicitly, the default reference levels are obtained as follows: \begin{itemize} \item For each predictor that is a factor, its reference levels are the unique levels of that factor. \item Each numeric predictor has just one reference level---its mean over the dataset. \end{itemize} So the reference grid depends on both the model and the dataset. \subsection{Example: Orange sales} To illustrate, consider the "oranges" data provided with \lsm{}. This dataset has sales of two varieties of oranges (response variables "sales1" and "sales2") at 6 stores (factor "store"), over a period of 6 days (factor "day"). The prices of the oranges (covariates "price1" and "price2") fluctuate in the different stores and the different days. There is just one observation on each store on each day. For starters, let's consider an additive covariance model for sales of the first variety, with the two factors and both "price1" and "price2" as covariates (since the price of the other variety could also affect sales). <<>>= library("lsmeans") oranges.lm1 <- lm(sales1 ~ price1 + price2 + day + store, data = oranges) anova(oranges.lm1) @ The "ref.grid" function in \lsm{} may be used to establish the reference grid. Here is the default one: <<>>= ( oranges.rg1 <- ref.grid(oranges.lm1) ) @ As outlined above, the two covariates "price1" and "price2" have their means as their sole reference level; and the two factors have their levels as reference levels. The reference grid thus consists of the $1\times1\times6\times6=36$ combinations of these reference levels. LS~means are based on predictions on this reference grid, which we can obtain using "predict" or "summary": <<>>= summary(oranges.rg1) @ \subsection{LS means as marginal averages over the reference grid} The ANOVA indicates there is a significant "day" effect after adjusting for the covariates, so we might want to do a follow-up analysis that involves comparing the days. The "lsmeans" function provides a starting point: <<>>= lsmeans(oranges.rg1, "day") ## or lsmeans(oranges.lm1, "day") @ These results, as indicated in the annotation in the output, are in fact the averages of the predictions shown earlier, for each day, over the 6 stores. The above LS~means are not the same as the overall means for each day: <<>>= with(oranges, tapply(sales1, day, mean)) @ These unadjusted means are not comparable with one another because they are affected by the differing "price1" and "price2" values on each day, whereas the LS~means are comparable because they use predictions at uniform "price1" and "price2" values. Note that one may call "lsmeans" with either the reference grid or the model. If the model is given, then the first thing it does is create the reference grid; so if the reference grid is already available, as in this example, it's more efficient to make use of it. \subsection{Altering the reference grid} The "at" argument may be used to override defaults in the reference grid. The user may specify this argument either in a "ref.grid" call or an "lsmeans" call; and should specify a "list" with named sets of reference levels. Here is a silly example: <<>>= lsmeans(oranges.lm1, "day", at = list(price1 = 50, price2 = c(40,60), day = c("2","3","4")) ) @ Here, we restricted the results to three of the days, and used different prices. One possible surprise is that the predictions are averaged over the two "price2" values. That is because "price2" is no longer a single reference level, and we average over the levels of all factors not used to split-out the LS~means. This is probably not what we want.\footnote{% The \emph{default} reference grid produces LS~means exactly as described in \cite{Sea80}. However, an altered reference grid containing more than one value of a covariate, such as in this example, departs from (or generalizes, if you please) their definition by averaging with equal weights over those covariate levels. It is not a good idea here, but there is an example later in this vignette where it makes sense.} To get separate sets of predictions for each "price2", one must specify it as another factor or as a "by" factor in the "lsmeans" call (we will save the result for later discussion): <<>>= org.lsm <- lsmeans(oranges.lm1, "day", by = "price2", at = list(price1 = 50, price2 = c(40,60), day = c("2","3","4")) ) org.lsm @ Note: We could have obtained the same results using any of these: <>= lsmeans(oranges.lm1, ~ day | price, at = ... ) # Ex 1 lsmeans(oranges.lm1, c("day","price2"), at = ... ) # Ex 2 lsmeans(oranges.lm1, ~ day * price, at = ... ) # Ex 3 @ Ex~1 illustrates the formula method for specifying factors, which is more compact. The "|" character replaces the "by" specification. Ex~2 and Ex~3 produce the same results, but their results are displayed as one table (with columns for "day" and "price") rather than as two separate tables. \section{Working with the results} \subsection{Objects} The "ref.grid" function produces an object of class \rg{}, and the "lsmeans" function produces an object of class \lsmo{}, which is a subclass of \rg. There is really no practical difference between these two classes except for their "show" methods---what is displayed by default---and the fact that an \lsmo{} is not (necessarily) a true reference grid as defined earlier in this article. Let's use the "str" function to examine the \lsmo{} object just produced: <<>>= str(org.lsm) @ We no longer see the reference levels for all predictors in the model---only the levels of "day" and "price2". These \emph{act} like reference levels, but they do not define the reference grid upon which the predictions are based. \subsection{Summaries} There are several methods for \rg{} (and hence also for \lsmo{}) objects. One already seen is "summary". It has a number of arguments---see its help page. In the following call, we summarize "days.lsm" differently than before. We will also save the object produced by "summary" for further discussion. <<>>= ( org.sum <- summary(org.lsm, infer = c(TRUE,TRUE), level = .90, adjust = "bon", by = "day") ) @ The "infer" argument causes both confidence intervals and tests to be produced; the default confidence level of $.95$ was overridden; a Bonferroni adjustment was applied to both the intervals and the $P$~values; and the tables are organized the opposite way from what we saw before. What kind of object was produced by "summary"? Let's see: <<>>= class(org.sum) @ The \dqt{summary.ref.grid} class is an extension of \dqt{data.frame}. It includes some attributes that, among other things, cause additional messages to appear when the object is displayed. But it can also be used as a \dqt{data.frame} if the user just wants to use the results computationally. For example, suppose we want to convert the LS~means from dollars to Russian rubles (at the July 13, 2014 exchange rate): {\small <<>>= transform(org.sum, lsrubles = lsmean * 34.2) @ } Observe also that the summary is just one data frame with six rows, rather than a collection of three data frames; and it contains a column for all reference variables, including any "by" variables. Besides "str" and "summary", there is also a "confint" method, which is the same as "summary" with "infer=c(TRUE,FALSE)", and a "test" method (same as "summary" with "infer=c(FALSE,TRUE)", by default). The "test" method may in addition be called with "joint=TRUE" to obtain a joint test that all or some of the linear functions are equal to zero or some other value. There is also an "update" method which may be used for changing the object's display settings. For example: <<>>= org.lsm2 <- update(org.lsm, by.vars = NULL, level = .99) org.lsm2 @ \subsection{Plots} Confidence intervals for LS~means may be displayed graphically, using the "plot" method. For example: <>= plot(org.lsm, by = "price2") @ The resulting display is shown in \Fig{org-plot}. This function requires that the \pkg{lattice} package be installed. \begin{figure} \begin{center} \includegraphics{using-lsmeans-org-plot.pdf} \end{center} \caption{Confidence intervals for LS~means in the \code{oranges} example.}\label{org-plot} \end{figure} \section{Contrasts and comparisons} \subsection{Contrasts in general} Often, people want to do pairwise comparisons of LS~means, or compute other contrasts among them. This is the purpose of the "contrast" function, which uses a \dqt{ref.grid} or \dqt{lsmobj} object as input. There are several standard contrast families such as \dqt{pairwise}, \dqt{trt.vs.ctrl}, and \dqt{poly}. In the following command, we request \dqt{eff} contrasts, which are differences between each mean and the overall mean: <<>>= contrast(org.lsm, method = "eff") @ Note that this preserves the "by" specification from before, and obtains the effects for each group. In this example, since it is an additive model, we obtain exactly the same results in each group. This isn't wrong, it's just redundant. Another popular method is Dunnett-style contrasts, where a particular LS~mean is compared with each of the others. This is done using \dqt{trt.vs.ctrl}. In the following, we obtain (again) the LS~means for days, and compare each with the average of the LS~means on day~5 and~6. <<>>= days.lsm <- lsmeans(oranges.rg1, "day") ( days_contr.lsm <- contrast(days.lsm, "trt.vs.ctrl", ref = c(5,6)) ) @ For convenience, \dqt{trt.vs.ctrl1} and \dqt{trt.vs.ctrlk} methods are provided for use in lieu of "ref" for comparing with the first and the last LS~means. The \dqt{dunnettx} adjustment is a good approximation to the exact Dunnett $P$~value adjustment. If the exact adjustment is desired, use "adjust = "\dqt{mvt}; but this can take a lot of computing time when there are several tests. Note that by default, "lsmeans" results are displayed with confidence intervals while "contrast" results are displayed with $t$ tests. One can easily override this; for example, <>= confint(contrast(days.lsm, "trt.vs.ctrlk")) @ (Results not shown.) In the above examples, a default multiplicity adjustment is determined from the contrast method. This may be overridden by adding an "adjust" argument. \subsection{Pairwise comparisons} Often, users want pairwise comparisons among the LS~means. These may be obtained by specifying \dqt{pairwise} or \dqt{revpairwise} as the "method" argument in the call to "contrast". For group labels $A,B,C$, \dqt{pairwise} generates the comparisons $A-B, A-C, B-C$ while \dqt{revpairwise} generates $B-A, C-A, C-B$. As a convenience, a "pairs" method is provided that calls "contrast" with "method="\dqt{pairwise}: <<>>= pairs(org.lsm) @ There is also a "cld" (compact letter display) method that lists the LS~means along with grouping symbols for pairwise contrasts. It requires the \pkg{multcompView} package \citep{mcview} to be installed. <<>>= cld(days.lsm, alpha = .10) @ Two LS~means that share one or more of the same grouping symbols are not significantly different at the stated value of "alpha", after applying the multiplicity adjustment (in this case Tukey's HSD). By default, the LS~means are ordered in this display, but this may be overridden with the argument "sort=FALSE". "cld" returns a \dqt{summary.ref.grid} object, not an "lsmobj". Another way to display pairwise comparisons is via the "comparisons" argument of "plot". When this is set to "TRUE", arrows are added to the plot, with lengths set so that the amount by which they overlap (or don't overlap) matches as closely as possible to the amounts by which corresponding confidence intervals for differences cover (or don't cover) the value zero. This does not always work, and if there are discrepancies, a message is printed. But it usually works. <>= plot(days.lsm, comparisons = TRUE, alpha = .10) @ \Fig{days-cmp} shows the result. Note that the pairs of means having overlapping arrows are the same as those grouped together in the "cld" display. However, these comparison arrows show more about the degree of significance in the comparisons. The lowest and highest LS~mean have arrows pointing only inward, as the others are not needed. If the confidence intervals and arrows together look too cluttered, one can add the argument \code{intervals = FALSE}, then only the arrows will be displayed. \begin{figure} \begin{center} \includegraphics{using-lsmeans-days-cmp.pdf} \end{center} \caption{Graphical comparisons of the LS~means for \code{days}.}\label{days-cmp} \end{figure} \subsection{Multiplicity adjustments---changing the family} You may have noticed that in the preceding examples where $P$-value adjustments were implemented, those adjustments were made \emph{separately} for each sub-table when a "by" variable is active. Some users prefer that all the adjusted tests together as one family---or even combine more than one family of tests into one family for purposes of adjustment. This may be done using the "rbind" method (similar to using "rbind" to combine matrices. On the flip side, perhaps we want to exclude some tests. This may be used using the "[]" operator: simply specify the row indexes of the tests to include. To illustrate, consider the previously obtained "org.lsm" object. In "pairs(org.lsm)", we obtain the same results twice (as seen above) because the model is additive. For the same reason, if we change the "by" variable to \dqt{day}, we'll obtain three copies of the same comparison of the two "price2"s. If we want to consider the three "day" comparisons and the one "price2" comparison together as one family of four tests, we can do: <<>>= rbind(pairs(org.lsm)[1:3], pairs(org.lsm, by = "day")[1]) @ Note that by default, the \dqt{mvt} adjustment level is used; for complicated families like this, ordinary Tukey and Dunnett adjustments are usually not appropriate. We arrived at this point by a circuitous path. In the additive model, the above conditional results are the same as the marginal ones: <<>>= rbind(pairs(lsmeans(org.lsm, "day")), pairs(lsmeans(org.lsm, "price2"))) @ \section{Multivariate models} The "oranges" data has two response variables. Let's try a multivariate model for predicting the sales of the two varieties of oranges, and see what we get if we call "ref.grid": <<>>= oranges.mlm <- lm(cbind(sales1,sales2) ~ price1 + price2 + day + store, data = oranges) ref.grid(oranges.mlm) @ What happens is that the multivariate response is treated like an additional factor, by default named "rep.meas". In turn, it can be used to specify levels for LS~means. Here we rename the multivariate response to \dqt{variety} and obtain "day" means (and a compact letter display for comparisons thereof) for each "variety": <<>>= org.mlsm <- lsmeans(oranges.mlm, ~ day | variety, mult.name = "variety") cld(org.mlsm, sort = FALSE) @ \section{Contrasts of contrasts} With the preceding model, we might want to compare the two varieties on each day: <<>>= org.vardiff <- update(pairs(org.mlsm, by = "day"), by = NULL) @ The results (not yet shown) will comprise the six "sales1-sales2" differences, one for each day. The two "by" specifications seems odd, but the one in "pairs" specifies doing a separate comparison for each day, and the one in "update" asks that we convert it to one table with six rows, rather than 6 tables with one row each. Now, let's compare these differences to see if they vary from day to day. <<>>= cld(org.vardiff) @ There is little evidence of variety differences, nor that these differences vary from day to day. \section[Interfacing with multcomp]{Interfacing with \pkg{multcomp}} The \pkg{multcomp} package \citep{multc} supports more options for simultaneous inference than are available in \lsm{}. Its "glht" (general linear hypothesis testing) function and associated \dqt{glht} class are similar in some ways to "lsmeans" and \dqt{lsmobj} objects, respectively. So \lsm{} provides an "as.glht" function to do the conversion. To illustrate, let us convert the "days_contr.lsm" object (produced earlier) to a "glht" object, and use it to obtain adjusted $P$~values under Westfall's adjustment procedure (not available in \lsm{}): <>= # Ensure we see the same results each time set.seed(123454321) @ <<>>= library("multcomp") days.glht <- as.glht(days_contr.lsm) summary(days.glht, test = adjusted("Westfall")) @ In addition, \lsm{} provides an "lsm" function that may be called from within a call to "glht". Thus, another way to obtain the same "glht" object is to use <>= days.glht1 <- glht(oranges.lm1, lsm("day", contr = "trt.vs.ctrl", ref = c(5,6))) @ By the way, the following two statements will produce the same results: <>= summary(days_contr.lsm, adjust = "mvt") summary(days.glht) @ That is, the \dqt{mvt} adjust method in \lsm{} is the same as the default single-step $P$~value adjustment in \pkg{multcomp}. One additional detail: If there is a "by" variable in effect, "glht" or "as.glht" returns a "list" of "glht" objects---one for each "by" level. There is a courtesy "summary" method for this \dqt{glht.list} class to make things a bit more user-friendly. Recall the earlier example result "org.lsm", which contains information for LS~means for three "day"s at each of two values of "price2". Suppose we are interested in pairwise comparisons of these LS~means, by "price2". If we call <>= summary(as.glht(pairs(org.lsm))) @ (results not displayed) we will obtain two "glht" objects with three contrasts each, so that the results shown will incorporate multiplicity adjustments for each family of three contrasts. If, on the other hand, we want to consider those six contrasts as one family, use <>= summary(as.glht(pairs(org.lsm), by = NULL)) @ \ldots{} and note (look carefully at the parentheses) that this is \emph{not} the same as <>= summary(as.glht(pairs(org.lsm, by = NULL))) @ which removes the "by" grouping \emph{before} the pairwise comparisons are generated, thus yielding ${6 \choose 2}=15$ contrasts instead of just six. \section{A new example: Oat yields} Orange-sales illustrations are probably getting tiresome. To illustrate some new features, let's turn to a new example. The "Oats" dataset in the \pkg{nlme} package \citep{nlme} has the results of a split-plot experiment discussed in \citet{Yat35}. The experiment was conducted on six blocks (factor "Block"). Each block was divided into three plots, which were randomized to three varieties (factor "Variety") of oats. Each plot was divided into subplots and randomized to four levels of nitrogen (variable "nitro"). The response, "yield", was measured once on each subplot after a suitable growing period. We will fit a model using the "lmer" function in the \pkg{lme4} package \citep{lme4}. This will be a mixed model with random intercepts for "Block" and "Block:Variety" (which identifies the plots). A logarithmic transformation is applied to the response variable (mostly for illustration purposes, though it does produce a good fit to the data). Note that "nitro" is stored as a numeric variable, but we want to consider it as a factor in this initial model. <<>>= data("Oats", package = "nlme") library("lme4") Oats.lmer <- lmer(log(yield) ~ Variety*factor(nitro) + (1|Block/Variety), data = Oats) anova(Oats.lmer) @ Apparently, the interaction is not needed. But perhaps we can further simplify the model by using only a linear or quadratic trend in "nitro". We can find out by looking at polynomial contrasts: <>= contrast(lsmeans(Oats.lmer, "nitro"), "poly") @ %%% Fake the warning message <>= cat("NOTE: Results may be misleading due to involvement in interactions") @ <>= <> @ (A message is issued when we average over predictors that interact with those that delineate the LS~means. In this case, it is not a serious problem because the interaction is weak.) Both the linear and quadratic contrasts are pretty significant. All this suggests fitting an additive model where "nitro" is included as a numeric predictor with a quadratic trend. <<>>= Oats.lmer2 <- lmer(log(yield) ~ Variety + poly(nitro,2) + (1|Block/Variety), data = Oats) @ Remember that "nitro" is now used as a quantitative predictor. But for comparing with the previous model, we want to see predictions at the four unique "nitro" values rather than at the average of "nitro". This may be done using "at" as illustrated earlier, or a shortcut is to specify "cov.reduce" as "FALSE", which tells "ref.grid" to use all the unique values of numeric predictors. <<>>= Oats.lsm2 <- lsmeans(Oats.lmer2, ~ nitro | Variety, cov.reduce = FALSE) Oats.lsm2 @ These LS~means follow the same quadratic trend for each variety, but with different intercepts.\footnote{% This is the promised example where our generalization of \cite{Sea80}'s definition of LS~means makes sense. Suppose we want to compare the LS~means for \code{Variety} with those in the original model \code{Oats.lmer} where \code{nitro} was a factor, we want to average equally over the four \code{nitro} levels, even though \code{nitro} is a covariate in this second model.} Fractional degrees of freedom are displayed in these results. These are obtained from the \pkg{pbkrtest} package \citep{pbkrt}, and they use the Kenward-Rogers method. (The degrees of freedom for the polynomial contrasts were also obtained from \pkg{pbkrtest}, but the results turn out to be integers.) \section{Displaying LS means graphically} We have already seen the use of the "plot" function to display confidence intervals and/or comparison arrows. The \lsm{} package also includes a function "lsmip" that displays predictions in an interaction-plot-like manner. It uses a formula of the form \begin{Sinput} curve.factors ~ x.factors | by.factors \end{Sinput} This function also requires the \pkg{lattice} package. In the above formula, "curve.factors" specifies factor(s) used to delineate one displayed curve from another (i.e., groups in \pkg{lattice}'s parlance). "x.factors" are those whose levels are plotted on the horizontal axis. And "by.factors", if present, break the plots into panels. To illustrate, consider the first model we fitted to the "Oats" data. Let's do a graphical comparison of the two models we have fitted to the "Oats" data. <>= lsmip(Oats.lmer, Variety ~ nitro, ylab = "Observed log(yield)") @ \vspace{-12pt} <>= lsmip(Oats.lsm2, Variety ~ nitro, ylab = "Predicted log(yield)") @ The plots are shown in \Fig{intplots}. Note that the first model fits the cell means perfectly, so its plot is truly an interaction plot of the data. The other displays the parabolic trends we fitted in the revised model. \begin{figure} \includegraphics[width=3in]{using-lsmeans-oatslmer.pdf} \hfill \includegraphics[width=3in]{using-lsmeans-oatslmer2.pdf} \caption{Interaction plots for the cell means and the fitted model, \code{Oats} example.}\label{intplots} \end{figure} \section{Transformations} When a transformation or link function is used in fitting a model, "ref.grid" (also called by "lsmeans") stores that information in the returned object, as seen in this example: <<>>= str(Oats.lsm2) @ This allows us to conveniently unravel the transformation, via the "type" argument in "summary" or related functions such as "lsmip" and "predict". Here are the predicted yields for (as opposed to predicted log yields) for the polynomial model: <<>>= summary(Oats.lsm2, type = "response") @ It is important to realize that the statistical inferences are all done \emph{before} reversing the transformation. Thus, $t$ ratios are based on the linear predictors and will differ from those computed using the printed estimates and standard errors. Likewise, confidence intervals are computed on the linear-predictor scale, then the endpoints are back-transformed. This kind of automatic support for transformations is available only for certain standard transformations, namely those supported by the "make.link" function in the \pkg{stats} package. Others require more work---see the documentation for "update" for details. \section{More on tests} \def\tj{\theta^{(j)}}%%% Notation for this section only The default settings for "test" yield traditional two-tailed $t$ (or $z$) tests of significance against zero. So if $\tj$ is the $j$th parameter (e.g., LS~mean or contrast) being estimated, we are testing the null hypothesis $H_0: \tj=0$ versus the alternative $H_1:\tj\ne 0$. We can, however, specify different types of tests in the "test" or "summary" functions. \subsection{Nonzero null values} If we wish to use nonzero null values, i,e., test $H_0:\tj=\tj_0$, use "test" or "summary" with the "null" argument set to the desired $\tj_0$ values. For example, in the Oat-yield example, suppose we want to test each of the "Variety" yields against 100 (actually $\log 100$ since the response was transformed): <<>>= Oats.Vlsm = lsmeans(Oats.lmer2, "Variety") test(Oats.Vlsm, null = log(100), type = "response") @ Note that "null" should always be given on the linear-predictor scale (in this case $\log$ yield), even when specifying \verb|type="response"|. We could have specified different null values for each hypothesis by providing a vector of three numbers. \subsection{Equivalence tests} The preceding results say that none of the variety means differs significantly from 100, after transforming. But this is not the same as saying that we have evidence that the means are close to 100 (that is, absence of proof is not proof of absence). To make a strong statement that an effect is small, we should use an equivalence test, which more-or-less turns the hypotheses around: \[ H_0: |\tj - \tj_0| \ge \delta \qquad\mbox{versus}\qquad H_1: |\tj - \tj_0| < \delta \] where $\delta$ is a specified threshold of equivalence. A common test procedure is the two one-sided test (TOST) method \citep{Sch87}, whereby we obtain equivalence only if we can establish both that $\tj-\tj_0>-\delta$ and that $\tj-\tj_0<\delta$. In "lsmeans", we do this by pre-identifying the less significant of these two tests: \[ t = \frac{|\hat\tj-\tj_0| - \delta}{SE(\hat\tj)} \] and the $P$~value is the \emph{left}-tail probability of this quantity from the central $t$ distribution. In "test" or "summary", an equivalence test is requested by specifying a nonzero "delta" argument, which in turn is used as the threshold $\delta$. In the Oat-yield example, the following results are obtained using a threshold of $\delta=0.20$: <<>>= test(Oats.Vlsm, null = log(100), delta = 0.20, type = "r") @ So two of the three Variety means are established as being within $.20$ of $\log100$. The natural log scale has the special property that small increments on the log scale translate to approximate percentage differences of the same size. That is, a threshold of $.20$ corresponds to about a 20\% difference: $\log 80 - \log100 = \log.8 \approx -.223$, and $\log120 - \log100 = \log1.2 \approx .182$. \subsection{One-sided tests, noninferiority, nonsuperiority} The "side" argument is also available to specify one-sided tests. A right-tailed alternative may be requested using "side" partially matching one of \dqt{+}, \dqt{right}, \verb|">"|, "+1", "1", \dqt{superiority}, or (see later) \dqt{noninferiority}. Similarly, a left-tailed alternative may be specified using "side" equal to \dqt{-}, \dqt{left}, \verb|"<"|, "-1", \dqt{inferiority}, or \dqt{nonsuperiority}. (And for completeness, a two-sided alternative is specified using "0", "2", \verb|"!="|, \dqt{both}, \dqt{two-sided}, \dqt{equivalence}, or \dqt{=}.) In the following example, we test to see if either Golden Rain or Marvellous has better yield than Victory: <<>>= test(contrast(Oats.Vlsm, "trt.vs.ctrlk"), side = ">") @ The one-sided version of an equivalence test is called a noninferiority or nonsuperiority test. It is obtained by specifying both "side" and a nonzero "delta". For example, to test whether Victory is as good as the other two within a 25\% threshold, use <<>>= test(contrast(Oats.Vlsm, "trt.vs.ctrlk"), side = "nonsup", delta = .25) @ We find strong evidence that, with the stated threshold of .25, Golden Rain is nonsuperior to Victory (so that Victory is noninferior to Golden Rain); but not strong evidence that Victory is noninferior to Marvellous. \section{Trends} The \lsm{} package provides a function \code{lstrends} for estimating and comparing the slopes of fitted lines (or curves). To illustrate, consider the built-in R dataset \code{ChickWeight} which has data on the growths of newly hatched chicks under four different diets. The following code produces the display in \Fig{chick-plot}. <>= require("lattice") xyplot(weight~Time | Diet, groups = ~ Chick, data = ChickWeight, type = "o", layout=c(4, 1)) @ \begin{figure} \centerline{\includegraphics[width=6in]{using-lsmeans-chick-plot}} \caption{Growth curves of chicks, dataset \texttt{ChickWeight}.}\label{chick-plot} \end{figure} Let us fit a model to these data using random slopes for each chick and allowing for a different average slope for each diet: <<>>= Chick.lmer <- lmer(weight ~ Diet * Time + (0 + Time | Chick), data = ChickWeight) @ We can then call "lstrends" to estimate and compare the average slopes for each diet. <<>>= ( Chick.lst <- lstrends (Chick.lmer, ~ Diet, var = "Time") ) @ Here we obtain estimates and pairwise comparisons of the slopes using a compact letter display. <<>>= cld (Chick.lst) @ According to the Tukey~HSD comparisons (with default significance level of $.05$), there are two groupings of slopes: Diet~1's mean slope is significantly less than $3$ or $4$'s, Diet~2's slope is not distinguished from any other. Note: "lstrends" computes a difference quotient based on two slightly different reference grids. Thus, it must be called with a model object, not a "ref.grid" object. \section{User preferences} \lsm{} sets certain defaults for displaying results---for example, using $.95$ for the confidence coefficient, and showing intervals for "lsmeans" output and test statistics for "contrast" results. As discussed before, one may use arguments in "summary" to change what is displayed, or "update" to change the defaults for a given object. But suppose you want different defaults to begin with. These can be set using the "lsm.options" statement. For example: <<>>= lsm.options(ref.grid = list(level = .90), lsmeans = list(), contrast = list(infer = c(TRUE, TRUE))) @ This requests that any object created by "ref.grid" be set to have confidence levels default to $90$\%, and that "contrast" results are displayed with both intervals and tests. No new options are set for "lsmeans" results, and the "lsmeans" part could have been omitted. These options are stored with objects created by "ref.grid", "lsmeans", and "contrast". For example, even though no new defaults are set for "lsmeans", future calls to "lsmeans" \emph{on a model object} will be displayed with 90\% confidence intervals, because "lsmeans" calls "ref.grid". However, calling "lsmeans" on an existing \dqt{ref.grid} object will inherit that object's setting. Certain other options are available; for example, the \dqt{estble.tol} option sets the tolerance for determining estimability of linear contrasts. To see its current value: <<>>= get.lsm.option("estble.tol") @ Defaults for this and some other parameters are saved in "lsm.default". \section{Two-sided formulas} In its original design, the only way to obtain contrasts and comparisons in \lsm{} was to specify a two-sided formula, e.g., "pairwise ~ treatment", in the "lsmeans" call. The result is then a list of "lsmobj" objects. In its newer versions, \lsm{} offers a richer family of objects that can be re-used, and dealing with a list of objects can be awkward or confusing, so its continued use is not encouraged. Nonetheless, it is still available for backward compatibility. Here is an example where, with one command, we obtain both the LS~means and pairwise comparisons for "Variety" in the model "Oats.lmer2": {\small <<>>= lsmeans(Oats.lmer2, pairwise ~ Variety) @ } This example also illustrates the effect of the preceding "lsm.options" settings. Let us now return to the default display for contrast results. <<>>= lsm.options(ref.grid = NULL, contrast = NULL) @ \section{Messy data} To illustrate some more \code{lsmeans} capabilities, consider the dataset named \code{nutrition} that is provided with the \lsm{} package. These data come from \citet{Mil92}, and contain the results of an observational study on nutrition education. Low-income mothers are classified by race, age category, and whether or not they received food stamps (the \code{group} factor); and the response variable is a gain score (post minus pre scores) after completing a nutrition training program. Consider the model that includes all main effects and two-way interactions. A Type-II (hierarchical) analysis-of-variance table is also shown. <<>>= nutr.lm <- lm(gain ~ (age + group + race)^2, data = nutrition) library("car") Anova(nutr.lm) @ One main effect ("group") is quite significant, and there is possibly an interaction with "race". Let us look at the \code{group} by \code{race} LS~means: <>= lsmip(nutr.lm, race ~ age | group) lsmeans(nutr.lm, ~ group*race) @ \begin{figure} \centerline{\includegraphics[scale=.75]{using-lsmeans-nutr-intplot}} \caption{Predictions for the nutrition data}\label{nutr-intplot} \end{figure} \Fig{nutr-intplot} shows the predictions from this model. One thing the output illustrates is that \code{lsmeans} incorporates an estimability check, and returns a missing value when a prediction cannot be made uniquely. In this example, we have very few Hispanic mothers in the dataset, resulting in empty cells. This creates a rank deficiency in the fitted model, and some predictors are thrown out. We can avoid non-estimable cases by using \code{at} to restrict the reference levels to a smaller set. A useful summary of the results might be obtained by narrowing the scope of the reference levels to two races and the two middle age groups, where most of the data lie. However, always keep in mind that whenever we change the reference grid, we also change the definition of the LS~means. Moreover, it may be more appropriate to average the two ages using weights proportional to their frequencies in the data set. The simplest way to do this is to add a "weights" argument.\footnote{ It may also be done by specifying a custom function in the \code{fac.reduce} argument, but for simple weighting, \code{weights} is simpler.} With those ideas in mind, here are the LS~means and comparisons within rows and columns: <<>>= nutr.lsm <- lsmeans(nutr.lm, ~ group * race, weights = "proportional", at = list(age = c("2","3"), race = c("Black","White"))) @ So here are the results <<>>= nutr.lsm summary(pairs(nutr.lsm, by = "race"), by = NULL) summary(pairs(nutr.lsm, by = "group"), by = NULL) @ The general conclusion from these analyses is that for age groups 2 and~3, the expected gains from the training are higher among families receiving food stamps. Note that this analysis is somewhat different than the results we would obtain by subsetting the data before analysis, as we are borrowing information from the other observations in estimating and testing these LS~means. \subsection{More on weighting}\label{weights} The "weights" argument can be a vector of numerical weights (it has to be of the right length), or one of four text values: \dqt{equal} (weight the predictions equally when averaging them, the default), \dqt{proportional} (weight them proportionally to the observed frequencies of the factor combinations being averaged over), \dqt{outer} (weight according to the outer products of the one-factor marginal counts), or \dqt{cells} (weight each mean differently, according to the frequencies of the predictions being averaged). \Fig{wtcomp} shows the LS~means for "race" using the four different weighting schemes. (Note: If the model itself has weights, then the total weights are used instead of counts.) \begin{figure} \hspace{-.06\linewidth} \begin{minipage}{1.12\linewidth} \hrule \columnseprule=.2pt \begin{multicols}{2}\footnotesize <<>>= lsmeans(nutr.lm, "race", weights = "equal") lsmeans(nutr.lm, "race", weights = "prop") lsmeans(nutr.lm, "race", weights = "outer") lsmeans(nutr.lm, "race", weights = "cells") @ \end{multicols} \hrule \end{minipage} \caption{Comparison of four different weighting methods}\label{wtcomp} \end{figure} Note there are four different sets of answers. The \dqt{equal} weighting is self-explanatory. But what's the distinction between \dqt{proportional} and \dqt{outer}? To clarify, consider: <<>>= temp = lsmeans(nutr.lm, c("group","race"), weights = "prop") lsmeans(temp, "race", weights = "prop") @ The previous results using \dqt{outer} weights are the same as those using \dqt{proportional} weights on one factor at a time. Thus, if only one factor is being averaged over, \dqt{outer} and \dqt{proportional} are the same. Another way to look at it is that outer weights are like the expected counts in a chi-square test; each factor is weighted independently of the others. The results for \dqt{cells} weights stand out because everything is estimable---that's because the empty cells in the data were given weight zero. These results are the same as the unadjusted means: <<>>= with(nutrition, tapply(gain, race, mean)) @ \subsection{Alternative covariate adjustments} The "framing" data in the \pkg{mediation} package has the results of an experiment conducted by \cite{Bra08} where subjects were given the opportunity to send a message to Congress regarding immigration. However, before being offered this, some subjects ("treat=1") were first shown a news story that portrays Latinos in a negative way. Besides the binary response (whether or not they elected to send a message), we also measured "emp", the subjects' emotional state after the treatment was applied. There are various demographic variables as well. Before fitting a logistic regression model, I will change the labels for educ to shorter strings. <<>>= library("mediation") levels(framing$educ) = c("NA","Ref","< HS", "HS", "> HS","Coll +") framing.glm = glm(cong_mesg ~ age + income + educ + emo + gender * factor(treat), family = binomial, data = framing) @ The left-hand plot in \Fig{framing} displays the conventional adjusted means, where predictions are made with the covariates "age", "income", and "emo" set to their mean values: <>= lsmip(framing.glm, treat ~ educ | gender, type = "response") @ This plot is rather implausible because the displayed treatment effects are the opposite for females as for males, and the effect of education isn't monotone as one might expect. \begin{figure} \begin{center} \begin{tabular}{c@{\qquad}c} (a) & (b) \\ \includegraphics[width=3in]{using-lsmeans-framinga.pdf} & \includegraphics[width=3in]{using-lsmeans-framingb.pdf} \end{tabular} \end{center} \caption{Estimated responses for the \code{framing} data. (a)~Holding \code{emo} constant at its mean; (b)~Using predictions of \code{emo} for each \code{treat}.}\label{framing} \end{figure} However, "emo" is a post-treatment measurement. This means that the treatment could have affected it (it is a \emph{mediating} covariate). If it is indeed affected by "treat", then \Fig{framing}(a) would be misleading because "emo" is held constant. Instead, consider making the predictions where "emo" is set to its predicted value at each combination of "treat" and the demographic variables. This is easily done by setting "cov.reduce" to a formula for how to predict "emo": <>= lsmip(framing.glm, treat ~ educ | gender, type = "response", cov.reduce = emo ~ treat*gender + age + educ + income) @ This plot is shown in \Fig{framing}(b). It is quite different, suggesting that "emo" does indeed play a strong mediating role. (The \pkg{mediation} package has functions for estimating the strength of these effects.) The predictions suggest that, taking emotional response into account, male subjects exposed to the negative news story are more likely to send the message than are females or those not seeing the negative news story. Also, the effect of "educ" is (almost) monotone. You can see what values of "emo" are used in these predictions by looking at the "grid" slot in the reference grid: <<>>= ref.grid(framing.glm, cov.reduce = emo ~ treat*gender + age + educ + income)@grid @ whereas the overall mean of \Sexpr{round(mean(framing$emo), 3)} is used as the value of "emo" in \Fig{framing}(a). \ifx %%% Old covariate example is commented-out %%%%%%%%%%%%%%%%%% \cite{urq82} reports data on slaughter weights of animals that entered a feedlot as yearling calves. The animals came from 11 different herds, and each animal was randomized to one of three diets. In addition, the weight of each yearling at entry was recorded. The "feedlot" dataset provided in \lsm{} contains these results. From the feedlot operator's perspective, both diets and herds are fixed effects. Let us fit a factorial model with slaughter weight "swt" as the response and entry weight "ewt" as a covariate. %<<>>= feedlot.lm <- lm(swt ~ ewt + herd * diet, data = feedlot) Anova(feedlot.lm) @ The interaction tesrm doesn't make much of a contribution here, so we will work with an additive model instead (which also ameliorates some non-estimability issues due to missing cells). %<<>>= feedlot.add <- update(feedlot.lm, . ~ . - herd:diet) @ Here are the "LS~means" for the herds, and a compact letter display for comparisons thereof: %<<>>= cld(lsmeans(feedlot.add, "herd")) @ No herds are found to be different---not a surprise given that the $P$~value for "herd" is about the same as for the original model. However, these predictions are made at the same entry weight for every herd. This is \emph{not} the right thing to do here, because the herds differ in genetic makeup, the way they were fed and managed, and so forth---which affect the yearlings' entry weights. This is an example where a treatment affects a covariate. Each herd should have its own reference value for entry weight. This is done in "lsmeans" by providing a formula in the "cov.reduce" argument. The formula "ewt ~ herd" indicates that the reference grid should be constructed using the predicted value of "ewt", based on a linear model with "herd" as the predictor. Here are the results: %<<>>= cld(lsmeans(feedlot.add, "herd", cov.reduce = ewt ~ herd)) @ What a world of difference! We now see many significant differences in the comparisons. By the way, another approach would be to simply omit "ewt" from the model, to prevent making inappropriate adjustments in the traditional analysis. With such a model (not shown), the predictions are similar to those above; however, their standard errors are substantially higher, because---as seen in the ANOVA table---the covariate explains a lot of the variation. \fi %%%%%%%%%%%%% end of commented-out section %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Another use of formulas in "cov.reduce" is to create representative values of some covariates when others are specified in "at". For example, suppose there are three covariates $x_1,x_2,x_3$ in a model, and we want to see predictions at a few different values of $x_1$. We might use <>= rg <- ref.grid(my.model, at = list(x1 = c(5,10,15)), cov.reduce = list(x2 ~ x1, x3 ~ x1 + x2)) @ (When more than one formula is given, they are processed in the order given.) The values used for $x_2$ and $x_3$ will depend on $x_1$ and should in some sense be more realistic values of those covariates as $x_1$ varies than would be the overall means of $x_2$ and $x_3$. Of course, it would be important to display the values used---available as "rg@grid"---when reporting the analysis. \section{Other types of models} \subsection[Models supported by lsmeans]{Models supported by \lsm{}} The \lsm{} package comes with built-in support for several packages and model classes: \begin{quote} \begin{description} \pitem{stats}: \dqt{lm}, \dqt{mlm}, \dqt{aov}, \dqt{aovlist}, \dqt{glm} \pitem{nlme}: \dqt{lme}, \dqt{gls}, \dqt{nlme} \pitem{lme4}: \dqt{lmerMod}, \dqt{glmerMod} \pitem{survival}: \dqt{survreg}, \dqt{coxph} %%%\pitem{coxme}: \dqt{coxme} \pitem{MASS}: \dqt{polr} \pitem{gee, geepack}: \dqt{gee}, \dqt{geeglm}, \dqt{geese} \pitem{ordinal}: \dqt{clm}, \dqt{clmm} \pitem{rms}: \dqt{rms} and descendents such as \dqt{ols}, \dqt{lrm}, \dqt{orm}, etc. \end{description} \end{quote} \lsm{} support for all these models works similarly to the examples we have presented. Note that generalized linear or mixed models, and several others such as survival models, typically employ link functions such as "log" or "logit". In most cases, the LS~means displayed are on the scale of the linear predictor, and any averaging over the reference grid is performed on the linear-predictor scale; but there are exceptions. Some objects have optional arguments that can be specified in the "ref.grid" or "lsmeans" call: see "?models" for details. \subsection{Ordinal-data example} The "clm" and "clmm" functions in \pkg{ordinal}, as well as the "polr" function in \pkg{MASS}, fit polytomous regression models to Likert-scale data. They do this by modeling the ordinal response as a categorization of a continuous latent variable $S$, then estimating thresholds for this categorization and fitting a generalized linear model to the cumulative probabilities for each threshold. By default, "lsmeans" produces predictions of the latent variable. The example shown here is based on the "housing" data in the \pkg{MASS} package, where the response variable is satisfaction ("Sat") on a three-point scale of low, medium, high; and predictors include "Type" (type of rental unit, four levels), "Infl" (influence on management of the unit, three levels), and "Cont" (contact with other residents, two levels). We will assume that the latent variable is normally distributed (by specifying a probit link). <>= library("ordinal") data(housing, package = "MASS") housing.clm <- clm(Sat ~ (Infl + Type + Cont)^2, data = housing, weights = Freq, link = "probit") lsmip(housing.clm, Cont ~ Infl | Type, layout = c(4,1)) @ \begin{figure} \begin{center} \includegraphics[width=6in]{using-lsmeans-housing-plot.pdf} \end{center} \caption{Interaction plot for the latent variable in the \code{housing} example.}\label{housing-plot} \end{figure} The plot is shown in \Fig{housing-plot}. Generally, the higher the influence, the higher the satisfaction. Overall $F$ tests of the "Infl" effect suggest that it is strong for all four housing types: <<>>= test(pairs(lsmeans(housing.clm, ~ Infl | Type)), joint = TRUE) @ The tests are asymptotic (signaled by "df2 = NA"), so they are actually chi-square tests for the statistics $X^2 = df_1\cdot F$ with $df_1$ degrees of freedom. Higher contact also seems to be associated with higher satisfaction, but terrace apartments may be an exception. Let's see: <<>>= test(pairs(lsmeans(housing.clm, ~ Cont | Type)), joint = TRUE) @ So the effect is inconclusive for both atria and terraces. The "mode" argument may be used to choose what to examine. Modes \dqt{linear.predictor} and \dqt{cum.prob} create an additional pseudo-factor named "cut" for the thresholds at which the predictions are made. <<>>= ref.grid(housing.clm, mode = "cum.prob") @ So here are our estimated marginal probabilities for "Infl" of being less than highly satisfied: <<>>= lsmeans(housing.clm, ~ Infl, at = list(cut = "Medium|High"), mode = "cum.prob") @ Compare these results with those for the back-transformed linear predictor: <<>>= summary(lsmeans(housing.clm, ~ Infl, at = list(cut = "Medium|High"), mode = "linear.predictor"), type = "response") @ The results are similar, but somewhat different because of the back-transformation coming before (first case) or after (second case) averaging or computing confidence limits. \subsection{Chick weights, revisited} Previously, we used the "ChickWeight" data to illustratie the use of "lstrends". That example made the simplifying assumption that the growth trends are linear, which is clearly questionable. To do a better job of fitting the data, consider instead the idea of fitting a logistic curve to each chick's data. The \pkg{stats} package provides the "SSlogis" function for this purpose: it is an S-shaped curve (scaled from the cdf of a logistic distribution) having three parameters "asym" (the asymptotic value at which it levels off), "xmid" (the $x$ coordinate of its inflection point), and "scal" (roughly the difference between the median and the .73rd quantile). Also, the \pkg{nlme} package's "nlme" function can fit a set of nonlinar curves such that the parameters of those curves may be modeled using a mixed-effects linear model. Accordingly, let us fit a model where each chick has a logistic curve for which the "asym" parameter varies randomly for each chick, and for which both "asym" and "xmid" depend on the chick's diet. We chose starting values by examining the curves and making a rough judgment of the typical asymptotic value, midpoint, and scale for each diet. We need to keep firmly in mind how factors are coded; so we explicitly show that we intend to use \dqt{contr.treatment} coding, by which the first mean is estimated directly, and the remaining estimates are offsets from that. We need a set of four starting values for "asym" and "xmid", and one for "scal". <<>>= require("nlme") options(contrasts = c("contr.treatment", "contr.poly")) Chick.nlme = nlme(weight ~ SSlogis(Time, asym, xmid, scal), data = ChickWeight, fixed = list(asym + xmid ~ Diet, scal ~ 1), random = asym ~ 1 | Chick, start = c(200, 100, 200, 100, 10, 0, 0, 0, 7)) Chick.nlme @ Now we can use "lsmeans" to compare the parameters based on "Diet": <<>>= cld(lsmeans(Chick.nlme, ~ Diet, param = "asym")) cld(lsmeans(Chick.nlme, ~ Diet, param = "xmid")) @ The result is that diet~3 has both a higher mean "asym" an a higher mean "xmid" than the other diets. This is compatible with the results of the earlier "lstrends" analysis, but grounded in terms of the parameters of the logistic curve. \subsection{Extending to more models} The functions "ref.grid" and "lsmeans" work by first reconstructing the dataset (so that the reference grid can be identified) and extracting needed information about the model, such as the regression coefficients, covariance matrix, and the linear functions associated with each point in the reference grid. For a fitted model of class, say, \dqt{modelobj}, these tasks are accomplished by defining S3 methods "recover.data.modelobj" and "lsm.basis.modelobj". The help page \dqt{extending-lsmeans} and the vignette by the same name provide details and examples. Developers of packages that fit models are encouraged to include support for \lsm{} by incorporating (and exporting) "recover.data" and "lsm.basis" methods for their model classes. \subsection{Bayesian models} Certain Bayesian models are now supported by \lsm{}. For illustration, consider a two-factor Poisson regression example given in the \pkg{MCMCpack} package: <<>>= library("MCMCpack") counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12) outcome <- gl(3, 1, 9) treatment <- gl(3, 3) posterior <- MCMCpoisson(counts ~ outcome + treatment, mcmc = 1000) @ The result is an "mcmc" object (defined in the \pkg{coda} package), but it has an added \dqt{call} attribute that enables "lsmeans" to do its work. Here are results for treatments, averaged over outcomes: <<>>= ( post.lsm <- lsmeans(posterior, "treatment") ) @ This is a frequentist summary, based on the mean and covariance of the regression parameters in the "posterior" sample. But \lsm{} provides an "as.mcmc" method to obtain a sample from the posterior distribution of the LS~means (that is, the original posterior sample iof regression coefficients, transformed by the appropriate linear functions.) <<>>= library("coda") summary(as.mcmc(post.lsm)) @ Since "as.mcmc" produces an "mcmc" object, any of the other available methods may be used with it. \section{Discussion} The design goal of \lsm{} is primarily to provide the functionality of the "LSMEANS" statement in various \SAS{} procedures. Thus its emphasis is on tabular results which, of course, may also be used as data for further analysis or graphics. By design, it can be extended with relative ease to additional model classes. A unique capability of \lsm{} is its explicit reliance on the concept of a reference grid, which I feel is a useful approach for understanding what is being computed. Some \lsm{} capabilities exceed those of \SAS, including the "lstrends" capability, more flexibility in organizing the output, and more built-in contrast families. In addition, \SAS{} does not allow LS~means for factor combinations when the model does not include the interaction of those factors; or creating a grid of covariate values using "at". There are a few other \R{} packages that provide capabilities that overlap with those of \lsm{}. The \pkg{effects} package \citep{effects,fox09} can compute LS~means. However, for an unbalanced dataset, it does not use equal weights, but rather it appears to use ``outer'' weights, as described in Section~\ref{weights}. Also, it does not check estimability, so some results could be questionable. The emphasis of \pkg{effects} is on graphical rather than tabular displays. It has special strengths for curve-fitting models such as splines. In contrast, \lsm{}'s strengths are more in the area of factorial models where one wants traditional summaries in the form of estimates, contrasts, and interaction plots. The \pkg{doBy} package \citep{doBy} provides an "LSmeans" function that has some of the capabilities of "lsmeans", but it produces a data frame rather than a reusable object. In earlier versions of the package, this function was named "popMeans". The package also has an "LSmatrix" function to obtain the linear functions needed to obtain LS~means. \bibliography{lsmeans}\bibliographystyle{jss} \end{document} lsmeans/MD50000644000175100001440000000576612634550020012255 0ustar hornikusersf8ea45f035c18e1e800b1e08e8e4543c *DESCRIPTION 6a4bd5a9b9d1bc04d592e734c4e44d88 *NAMESPACE 81b8d6ed7fa4911183eba1c47d938ce3 *R/MCMC-support.R 0c1e1e67b366e333c59ca1d4bc906e80 *R/S4-classes.R 95b9f9ba69b8bc1055d2071ad50e217b *R/aovlist-support.R fc4a9c967069dafcae6245b8737cc350 *R/cld.lsm.R e5bc0c0106fee5f8b60eabfa29b5e9ef *R/countreg-support.R 54b63f31e3bea39d3e37ec09836161b5 *R/glht-support.R 31e006455401777b6ed297e68bf43319 *R/helpers.R e9e4975adf11cfefe004844e2546b94a *R/lsm-contr.R 9bdcfa0b20edb9d2498139e44f909094 *R/lsm.list.R 682cdc1f5acd2945616e36c6f8c9b439 *R/lsmeans.R 023c0a5cd47917faa86b333d1e9be683 *R/lsmip.R a20bea4c3cb0e7b22d8640ad7ef19dc1 *R/multinom-support.R aecd5a482db0bec6c0cb67caa7263b6f *R/nonlin-support.R 5f1cce2820fb04f54dda2b3b181c0ff4 *R/ordinal-support.R ece38aedcad99b64b4f5a74c9f7db3f2 *R/plot.lsm.R 2a117fe733baeb21a33e2ae077b91fed *R/pmmeans.R b229c8767dbf09f7c562d7beef50cc9c *R/rbind.R bb480e87e35f599aded6c27e24855616 *R/ref.grid.R 47170af1f5012f10b5a3ba0fa84021e0 *R/rms-support.R aae4082048d1a9515a8d872869053e83 *R/summary.R 0fbf9b6b092e397b2c3bd22ecd5a06cd *build/vignette.rds dd8a9e9e6180f65bff84a40f25943636 *data/MOats.RData 2d7a1d217def5e4ab094c7f019a7d27d *data/autonoise.RData 991422f691ec5cdee38ab0d613e2a89c *data/feedlot.RData f204c1431e151e2459178e8f4fc8f0e8 *data/fiber.RData 298a5159a77e201ffe1410cf80282eff *data/nutrition.RData 2b03398ef2214b51371430e875d964cc *data/oranges.RData 8e69fc102574ca31e50f7bd873f583c5 *inst/NEWS 35d101d38e7efda82971d573740a4731 *inst/doc/extending.R df43e4086f564606c5e4cc161c53564e *inst/doc/extending.pdf 8ba55dabcb58b91cba0b35490fa0bf2b *inst/doc/extending.rnw 625c2a99db7b44020626904a438f80a6 *inst/doc/using-lsmeans.R 66a0808af485b929028eed415fc302e9 *inst/doc/using-lsmeans.pdf 63ee40c1977b64cb47fcf7e31df89e6f *inst/doc/using-lsmeans.rnw 973374a99676131f00cabe705e5fde34 *man/MOats.Rd 7073c84580b0826caf2d10479596ac4b *man/auto.noise.Rd 7f6d7494796dc12d1307d9adfb506574 *man/cld.Rd 98ef9f484be985fc10f4a3ef168c2364 *man/contrast.Rd b4e5397f0f1d90e0ed0f4e6d0bd01976 *man/extending.Rd 8acf14c497ccb2cb78366a461bb5856d *man/feedlot.Rd 76e8383265d34132ecef76141aa6fd20 *man/fiber.Rd fc19727e78e1b78e6b06d68f495ad125 *man/glht.Rd aad911cfedb8b6182a08a85c6ce42243 *man/lsmeans-package.Rd 8222b5e279641e7af4b1b8364a7dc626 *man/lsmeans.Rd 09168fb853b1ef7a4a7885f22d83848e *man/lsmip.Rd 9f1a977da91eb0a23c5d05cbd8d395e1 *man/models.Rd 14561bd752782024533ef1ef5e06f0bb *man/nutrition.Rd b8e3e18b69fb207939f7e42497519d6c *man/oranges.Rd 8bf9ba39266c94b5bc16f71a81a1e51e *man/pairwise.lsmc.Rd 473a2369b6c504d740478574e292494e *man/ref.grid.Rd d55dcaa810dbe202b27234b523019436 *man/ref.grid.class.Rd 8e7775fd376e8535de7ec2513b000ae3 *man/summary.Rd 4fe8f946d6d43056fd7c183e6360e939 *man/update.Rd d36fdf54f5ba0150f90a567b23b5225b *tests/tests1.R 9346d4a5569d69c0d49e3569570f98bc *tests/tests1.Rout.save 8ba55dabcb58b91cba0b35490fa0bf2b *vignettes/extending.rnw 57809d96b40c92d2b432152eaa8dc914 *vignettes/lsmeans.bib 63ee40c1977b64cb47fcf7e31df89e6f *vignettes/using-lsmeans.rnw lsmeans/build/0000755000175100001440000000000012634421563013037 5ustar hornikuserslsmeans/build/vignette.rds0000644000175100001440000000035712634421563015403 0ustar hornikusersuK0C|(\NlFFCE[∭N3Äb4iajy\F `q!gR"Dsѥܕ|iRE[[]jRw-J^C|HCچ64Rĵ{Ao͖ehshGI ʰK,#j.8U~1ϫPy`Rџdӂ'= 3.2) Suggests: car, lattice, MCMCpack, mediation, multcompView, ordinal, pbkrtest (>= 0.4-1), CARBayes, coxme, gee, geepack, glmmADMB, lme4.0, lme4, MASS, MCMCglmm, nnet, pscl, survival Imports: graphics, stats, utils, nlme, coda (>= 0.17), multcomp, plyr, mvtnorm Additional_repositories: http://glmmadmb.r-forge.r-project.org/repos, http://lme4.0.r-forge.r-project.org/repos LazyData: yes ByteCompile: yes Description: Obtain least-squares means for many linear, generalized linear, and mixed models. Compute contrasts or linear functions of least-squares means, and comparisons of slopes. Plots and compact letter displays. License: GPL-2 NeedsCompilation: no Packaged: 2015-12-17 02:52:36 UTC; Russell Author: Russell Lenth [aut, cre], Maxime Herv\'e [ctb] Maintainer: Russell Lenth Repository: CRAN Date/Publication: 2015-12-17 16:09:04 lsmeans/man/0000755000175100001440000000000012634421507012511 5ustar hornikuserslsmeans/man/models.Rd0000644000175100001440000004367012634421507014275 0ustar hornikusers\name{models} \alias{models} \title{Models supported in \pkg{lsmeans}} \description{ Here we document what model objects may be used with \pkg{lsmeans}, and some special features of some of them. We start with those in the \pkg{stats} package; the other packages follow in alphabetical order. Certain objects are affected by optional arguments to functions that construct \code{ref.grid} or \code{lsmobj} objects, including \code{\link{ref.grid}}, \code{\link{lsmeans}}, \code{\link{lstrends}}, and \code{\link{lsmip}}. When \dQuote{arguments} are mentioned in the subsequent object-by-object documentation, we are talking about arguments in these constructors. Additional models can be supported by writing appropriate \code{recover.data} and \code{lsm.basis} methods. See \code{\link{extending-lsmeans}} and \code{vignette("extending")} for details. } \section{\pkg{stats} package}{ \describe{ \item{lm, aov, glm}{No extended features. Note that the \code{lm} support often extends to a number of model objects that inherit from it, such as \code{rlm} in the \pkg{MASS} package and \code{rsm} in the \pkg{rsm} package.} \item{mlm, maov, manova}{When there is a multivariate response, the different responses are treated as if they were levels of a factor -- named \code{rep.meas} by default. The \code{mult.name} argument may be used to change this name. The \code{mult.levs} argument may specify a named list of one or more sets of levels. If this has more than one element, then the multivariate levels are expressed as combinations of the named factor levels via the function \code{\link{expand.grid}}.} \item{aovlist}{Support for these objects is limited. To avoid strong biases in the predictions, the \code{contrasts} attribute of all factors should be of a type that sums to zero -- for example, \code{"contr.sum"}, \code{"contr.poly"}, or \code{"contr.helmert"} but \emph{not} \code{"contr.treatment"}. Only intra-block estimates of covariances are used. That is, if a factor appears in more than one error stratum, only the covariance structure from its lowest stratum is used in estimating standard errors. Degrees of freedom are obtained using the Satterthwaite method. In general, \code{aovList} support is best with balanced designs, and due caution in the use of contrasts. If a \code{vcov.} argument is supplied, it must yield a single covariance matrix for the unique fixed effects, and the degrees of freedom are set to \code{NA}.} }} %stats %%% !!! ALPHABETICAL FROM HERE !!! \section{\pkg{afex} package}{ \describe{ \item{mixed}{Support for \code{mixed} objects has been removed. Version 0.14 and later of \pkg{afex} provides new object classes with their own \pkg{lsmeans} support.}}} % afex %%%Support for the \code{full.model} element of these objects is the same as that for \code{merMod} in the \pkg{lme4} package -- see below. However, for \pkg{afex} versions 0.10-113 and earlier, the \code{data} argument is required in calls to \code{lsmeans} or \code{ref.grid}, as the information about the original dataset is not preserved in the object.} \section{\pkg{CARBayes} package}{ \describe{ \item{carbayes}{The user \emph{must} supply (via the \code{data} argument) the dataset used in fitting the model. As with other MCMC-based objects, the summaries and such are frequentist, but the \code{as.mcmc} method provides a posterior sample of the desired quantities.} }}% CARBayes \section{\pkg{coxme} package}{ \describe{ \item{coxme}{No additional options. Support for these models is experimental; may throw errors or incorrect results.} }}% coxme \section{\pkg{gam} package}{ \describe{ \item{gam}{Currently, \code{gam} objects are not supported. Past versions of \pkg{lsmeans} appeared to support \code{gam} models owing to inheritance from \code{lm}, but the results were incorrect because spline features were ignored. We now explicitly trap \code{gam} objects to avoid tyhese misleading analyses.} }}% coxme \section{\pkg{gee} and \pkg{geepack} packages}{ These models all have more than one covariance estimate available, and it may be selected by supplying a string as the \code{vcov.method} argument. It is partially matched with the available choices; thus, for example, \samp{vcov = "n"} translates to \samp{vcov.method = "naive"} \describe{ \item{gee}{Available covariance estimates are specified in \code{vcov.method} as \code{"robust"} (the default) and \code{"naive"}.} \item{geeglm, geese}{Available covariance estimates are specified in \code{vcov.method} as \code{"vbeta"} (the default), \code{"vbeta.naiv"}, \code{"vbeta.j1s"}, or \code{"vbeta.fij"}. The aliases \code{"robust"} (for \code{"vbeta"}) and \code{"naive"} (for \code{"vbeta.naiv"} are also accepted.} } If a matrix or function is supplied as \code{vcov.method}, it is interpreted as a \code{vcov.} specification as described for \code{...} in \code{\link{ref.grid}}. }% geepack \section{\pkg{glmmADMB} package}{ \describe{ \item{glmmadmb}{No extended features.} }}% glmmadmb \section{\pkg{lme4} package}{ \describe{ \item{lmerMod}{If the \pkg{pbkrtest} package is installed, degrees of freedom for confidence intervals and tests are obtained using its \code{\link[pbkrtest]{ddf_Lb}} function, and the covariance matrix is adjusted using \code{\link[pbkrtest]{vcovAdj}}. If \pkg{pbkrtest} is not installed, the covariance matrix is not adjusted, degrees of freedom are set to \code{NA}, and asymptotic results are displayed. The user may disable the use of \pkg{pbkrtest} via \samp{lsm.options(disable.pbkrtest=TRUE)} (this does not disable the \pkg{pbkrtest} package entirely, just its use in \pkg{lsmeans}). The \code{df} argument may be used to specify some other degrees of freedom. Specifying \code{df} is \emph{not} equivalent to disabling \pkg{pbkrtest}, because if not disabled, the covariance matrix is still adjusted. On a related matter: for very large objects, computation time or memory use may be excessive. The amount required depends roughly on the number of observations, \emph{N}, in the design matrix (because a major part of the computation involves inverting an \emph{N x N} matrix). Thus, \pkg{pbkrtest} is automatically disabled if \emph{N} exceeds the value of \code{get.lsm.option("pbkrtest.limit")}. If desired, the user may use \code{lsm.options} to adjust this limit from the default of 3000.} \item{glmerMod}{No degrees of freedom are available for these objects, so tests and confidence intervals are asymptotic.} }}% lme4 \section{\pkg{lme4.0} package}{ \describe{ \item{mer}{Only asymptotic results are available (no d.f.).} }}% lme4.0 \section{\pkg{MASS} package}{ \describe{ \item{glmmPQL}{Supported by virtue of inheritance from \code{lme} in the \pkg{nlme} package.} \item{glm.nb}{Supported by virtue of inheritance from \code{glm}.} \item{polr}{There are two optional arguments: \code{mode} and \code{rescale} (which defaults to \samp{c(0,1)}). For details, see the documentation below regarding the support for the \pkg{ordinal} package, which produces comparable objects (but since \code{polr} does not support scale models, \code{mode="scale"} is not supported). Tests and confidence intervals are asymptotic.} \item{rlm}{Supported by virtue of inheritance from \code{lm}.} }}% MASS %\section{\pkg{mgcv} package}{ %\describe{ %\item{gam}{Supported by virtue of inheritance from \code{glm}.} %\item{gamm}{Not supported at this time.} %}}% mgcv \section{\pkg{MCMCglmm} package}{ \describe{ \item{MCMCglmm}{Currently, I have found no way to reconstruct the data based on information in the object; thus, you \emph{must} provide the dataset via the \code{data} argument. In addition, the \code{contrasts} specifications are not recoverable from the object, so the system default must match what was actually used in fitting the model. The usual \code{summary}, \code{test}, etc. methods provide frequentist analyses of the results based on the posterior means and covariances. However, an \code{as.mcmc} method is provided that creates an \code{mcmc} object that can be summarized or plotted using the \pkg{coda} package. It provides a posterior sample of lsmeans for the given reference grid, based on the posterior sample of the fixed effects from the \code{MCMCglmm} object.} }}% MCMCglmm \section{\pkg{MCMCpack} package (and perhaps others)}{ \describe{ \item{mcmc}{Certain linear-model or mixed-model objects are of class \code{mcmc}, and contain a sample from the posterior distribution of fixed-effect coefficients. In some cases (e.g., results of \code{MCMCregress} and \code{MCMCpoisson}), the object may include a \code{"call"} attribute that \code{lsmeans} can use to reconstruct the data and obtain a basis for the least-squares means. If not, a \code{formula} and \code{data} argument are provided that may help produce the right results. In addition, the \code{contrasts} specifications are not recoverable from the object, so the system default must match what was actually used in fitting the model. As for other MCMC-based objects, the summaries and such are frequentist, but the \code{as.mcmc} method provides a posterior sample of the desired quantities.} }}% MCMCpack \section{\pkg{nlme} package}{ \describe{ \item{gls}{No additional features. Degrees of freedom are computed using \code{N - p} in \code{object$dims}. This is consistent with \code{nlme:::summary.gls} but seems questionable.} \item{lme}{Degrees of freedom are obtained using a containment method, i.e., the minimum of those elements of \code{object$fixDF$X} receiving nonzero weight (but with a correction to the \code{lme} object's intercept df). (This is similar to \pkg{SAS}'s containment method, but I believe \pkg{SAS} does it incorrectly when the estimands are not contrasts.) The optional argument \code{adjustSigma} (defaults to \code{TRUE}) will adjust standard errors like in \code{\link[nlme]{summary.lme}} when the model is fitted using the \code{"ML"} method. \bold{Note:} It is possible for the \code{adjust} argument (for \eqn{p}-value adjustments) to conflict with \code{adjustSigma}. The workaround is to specify both: e.g., \samp{lsmeans(mod.lme, pairwise ~ trt, adjustSigma = TRUE, adjust = "none")}} \item{nlme}{Support is provided for inferences on parameters named in the \code{fixed} part of the model. The user \emph{must} specify \code{param} in the call and give the name of a parameter that appears in the right-hand side of a \code{fixed} formula. Degrees of freedom are obtained using the containment-like method described above for \code{lme}.} }}% nlme \section{\pkg{nnet} package}{ \describe{ \item{multinom}{ The reference grid includes a pseudo-factor with the same name and levels as the multinomial response. There is an optional \code{mode} argument which should match \code{"prob"} or \code{"latent"}. With \code{mode = "prob"}, the reference-grid predictions consist of the estimated multinomial probabilities. The \code{"latent"} mode returns the linear predictor, recentered so that it averages to zero over the levels of the response variable (similar to sum-to-zero contrasts). Thus each latent variable can be regarded as the log probability at that level minus the average log probability over all levels. Please note that, because the probabilities sum to 1 (and the latent values sum to 0) over the multivariate-response levels, all sensible results from \code{lsmeans} must involve that response as one of the factors. For example, if \code{resp} is a response with \eqn{k} levels, \code{lsmeans(model, ~ resp | trt)} will yield the estimated multinomial distribution for each \code{trt}; but \code{lsmeans(model, ~ trt)} will just yield the average probability of \eqn{1/k} for each \code{trt}. }}}% nnet, multinom \section{\pkg{ordinal} package}{ \describe{ \item{clm,clmm}{The reference grid will include all variables that appear in the main model as well as those in the \code{scale} or \code{nominal} models. There are two optional arguments: \code{mode} (a character string) and \code{rescale} (which defaults to \samp{c(0,1)}). \code{mode} should match one of \code{"latent"} (the default), \code{"linear.predictor"}, \code{"cum.prob"}, \code{"exc.prob"}, \code{"prob"}, \code{"mean.class"}, or \code{"scale"}. With \samp{mode = "latent"}, the reference-grid predictions are made on the scale of the latent variable implied by the model. The scale and location of this latent variable are arbitrary, and may be altered via \code{rescale}. The predictions are multiplied by \samp{rescale[2]}, then \samp{rescale[1]} is added. Keep in mind that the scaling is related to the link function used in the model; for example, changing from a probit link to a logistic link will inflate the latent values by around \eqn{\pi/\sqrt{3}}{pi/sqrt(3)}, all other things being equal. \code{rescale} has no effect for other values of \code{mode}. With \samp{mode = "linear.predictor"} \code{mode = "cum.prob"}, and \code{mode = "exc.prob"}, the boundaries between categories (i.e., thresholds) in the ordinal response are included in the reference grid as a pseudo-factor named \code{cut}. The reference-grid predictions are then of the cumulative probabilities at each threshold (for \code{mode = "cum.prob"}), exceedance probabilities (one minus cumulative probabilities, for \code{mode = "exc.prob"}), or the link function thereof (for \code{mode = "linear.predictor"}). With \code{mode = "prob"}, a pseudo-factor with the same name as the model's response variable is created, and the grid predictions are of the probabilities of each class of the ordinal response. With \code{"mean.class"}, the returned results are means of the ordinal response, interpreted as a numeric value from 1 to the number of classes, using the \code{"prob"} results as the estimated probability distribution for each case. With \code{mode = "scale"}, and the fitted object incorporates a scale model, least-squares means are obtained for the factors in the scale model instead of the response model. The grid is constructed using only the factors in the scale model. Any grid point that is non-estimable by either the location or the scale model (if present) is set to \code{NA}, and any LS-means involving such a grid point will also be non-estimable. A consequence of this is that if there is a rank-deficient \code{scale} model, and then \emph{all} latent responses become non-estimable because the predictions are made using the average log-scale estimate. Tests and confidence intervals are asymptotic.} }}% ordinal \section{\pkg{pscl} package}{ \describe{ \item{hurdle, zeroinfl}{ Two optional arguments -- \code{mode} and \code{lin.pred} -- are provided. The \code{mode} argument has possible values \code{"response"} (the default), \code{"count"}, \code{"zero"}, or \code{"prob0"}. \code{lin.pred} is logical and defaults to \code{FALSE}. With \code{lin.pred = FALSE}, the results are comparable to those returned by \code{predict(..., type = "response")}, \code{predict(..., type = "count")}, \code{predict(..., type = "zero")}, or \code{predict(..., type = "prob")[, 1]}. See the documentation for \code{\link[pscl]{predict.hurdle}} and \code{\link[pscl]{predict.zeroinfl}}. The option \code{lin.pred = TRUE} only applies to \code{mode = "count"} and \code{mode = "zero"}. The results returned are on the linear-predictor scale, with the same transformation as the link function in that part of the model. The predictions for a reference grid with \code{mode = "count"}, \code{lin.pred = TRUE}, and \code{type = "response"} will be the same as those obtained with \code{lin.pred = FALSE} and \code{mode = "count"}; however, any LS means derived from these grids will be defferent, because the averaging is done on the log-count scale and the actual count scale, respectively -- thereby producing geometric means versus arithmetic means of the predictions. If the \code{vcov.} argument is used (see details in \code{\link{ref.grid}}), it must yield a matrix of the same size as would be obtained using \code{\link[pscl]{vcov.hurdle}} or \code{\link[pscl]{vcov.zeroinfl}} with its \code{model} argument set to \code{("full", "count", "zero")} in respective correspondence with \code{mode} of \code{("mean", "count", "zero")}. If \code{vcov.} is a function, it must support the \code{model} argument. } }}% pscl \section{\pkg{rms} package}{ \describe{ \item{Potential masking issue}{ Both \pkg{rms} and \pkg{lsmeans} offer \code{contrast} methods, and whichever package is loaded later masks the other. Thus, you may need to call \code{lsmeans::contrast} or \code{rms::contrast} explicitly to access the one you want. } \item{Objects inheriting from rms}{ Standard support is provided. However, with models having more than one intercept (e.g. from \code{orm}), a \code{mode} argument is provided that works similarly to that for the \pkg{ordinal} package. The available modes are \code{"middle"} (the default), \code{"latent"}, \code{"linear.predictor"}, \code{"cum.prob"}, \code{"exc.prob"}, \code{"prob"}, and \code{"mean.class"}. All are as described for the \pkg{ordinal} package, except as noted below. With \code{mode = "middle"} (this is the default), the middle intercept is used, comparable to the default for \pkg{rms}'s \code{Predict} function. This is quite similar in concept to \code{mode = "latent"}, where all intercepts are averaged together. Results for \code{mode = "linear.predictor"} are reversed from those in the \pkg{ordinal} package, because \code{orm} models predict the link function of the \emph{upper}-tail (exceedance) probabilities. With \code{mode = "prob"}, a pseudo-factor is created having the same name as the model response variable, but its levels are always integers \samp{1, 2, ...} regardless of the levels of the original response. } }}% rms \section{\pkg{survival} package}{ \describe{ \item{survreg, coxph}{No extended features.} }}% survival %\references{} \author{ Russell V. Lenth } %\note{} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{ref.grid}}, \code{\link{lsm.basis}} } \keyword{ models } \keyword{ regression } \keyword{ htest } lsmeans/man/oranges.Rd0000644000175100001440000000257712634421507014451 0ustar hornikusers\name{oranges} \alias{oranges} \docType{data} \title{ Orange sales } \description{ This example dataset on sales of oranges has two factors, two covariates, and two responses. There is one observation per factor combination. } \usage{data(oranges)} \format{ A data frame with 36 observations on the following 6 variables. \describe{ \item{\code{store}}{a factor with levels \code{1} \code{2} \code{3} \code{4} \code{5} \code{6}. The store that was observed.} \item{\code{day}}{a factor with levels \code{1} \code{2} \code{3} \code{4} \code{5} \code{6}. The day the observation was taken (same for each store).} \item{\code{price1}}{a numeric vector. Price of variety 1.} \item{\code{price2}}{a numeric vector. Price of variety 2.} \item{\code{sales1}}{a numeric vector. Sales (per customer) of variety 1.} \item{\code{sales2}}{a numeric vector. Sales (per customer) of variety 2.} } } %\details{} \source{ Download from \url{http://ftp.sas.com/samples/A56655}. } \references{ Littell, R., Stroup W., Freund, R. (2002) \emph{SAS For Linear Models} (4th edition). SAS Institute. ISBN 1-59047-023-0. } \examples{ require(lsmeans) # Example on p.244 of Littell et al. oranges.lm <- lm(sales1 ~ price1*day, data = oranges) lsmeans(oranges.lm, "day") # Example on p.246 lsmeans(oranges.lm, "day", at = list(price1 = 0)) } \keyword{datasets} lsmeans/man/ref.grid.Rd0000644000175100001440000001606312634421507014506 0ustar hornikusers\name{ref.grid} \alias{ref.grid} % handy for extra documentation... \alias{ref.grid.object} \alias{summary.ref.grid.object} \title{ Create a reference grid from a fitted model } \description{ Using a fitted model object, determine a reference grid for which least-squares means are defined. The resulting \code{ref.grid} object encapsulates all the information needed to calculate LS means and make inferences on them. } \usage{ ref.grid(object, at, cov.reduce = mean, mult.name, mult.levs, options = get.lsm.option("ref.grid"), data, type, ...) } \arguments{ \item{object}{An object produced by a supported model-fitting function, such as \code{lm}. Many models are supported. See \code{\link{models}}.} \item{at}{Optional named list of levels for the corresponding variables} \item{cov.reduce}{A function, logical value, or formula; or a named list of these. Each covariate \emph{not specified in} \code{at} is reduced according to these specifications. If a single function, it is applied to each covariate. If logical and \code{TRUE}, \code{mean} is used. If logical and \code{FALSE}, it is equivalent to specifying \samp{function(x) sort(unique(x))}, and these values are considered part of the reference grid; thus, it is a handy alternative to specifying these same values in \code{at}. If a formula (which must be two-sided), then a model is fitted to that formula using \code{\link{lm}}; then in the reference grid, its response variable is set to the results of \code{\link{predict}} for that model, with the reference grid as \code{newdata}. (This is done \emph{after} the reference grid is determined.) A formula is appropriate here when you think experimental conditions affect the covariate as well as the response. If \code{cov.reduce} is a named list, then the above criteria are used to determine what to do with covariates named in the list. (However, formula elements do not need to be named, as those names are determined from the formulas' left-hand sides.) Any unresolved covariates are reduced using \code{"mean"}. Any \code{cov.reduce} specification for a covariate also named in \code{at} is ignored. } % end of \item{cov.reduce} \item{mult.name}{Character, the name to give to the \dQuote{factor} whose levels delineate the elements of a multivariate response. If this is provided, it overrides the default name, e.g., \code{"rep.meas"} for an \code{\link[=lm]{mlm}} object or \code{"cut"} for a \code{\link[MASS]{polr}} object.} \item{mult.levs}{A named list of levels for the dimensions of a multivariate response. If there is more than one element, the combinations of levels are used, in \code{\link{expand.grid}} order. The (total) number of levels must match the number of dimensions. If \code{mult.name} is specified, this argument is ignored.} \item{options}{If non-\code{NULL}, a named \code{list} of arguments to pass to \code{\link{update}}, just after the object is constructed.} \item{data}{A \code{data.frame} to use to obtain information about the predictors (e.g. factor levels). If missing, then \code{\link{recover.data}} is used to attempt to reconstruct the data.} \item{type}{If provided, this is saved as the \code{"predict.type"} setting. See \code{\link{update}}} \item{\dots}{Optional arguments passed to \code{\link{lsm.basis}}, such as \code{vcov.} (see Details below) or options for certain models (see \link{models}).} } %--- end of \arguments \details{The reference grid consists of combinations of independent variables over which predictions are made. Least-squares means are defined as these predictions, or marginal averages thereof. The grid is determined by first reconstructing the data used in fitting the model (see \code{\link{recover.data}}), or by using the \code{data.frame} provided in \code{context}. The default reference grid is determined by the observed levels of any factors, the ordered unique values of character-valued predictors, and the results of \code{cov.reduce} for numeric predictors. These may be overridden using \code{at}. Ability to support a particular class of \code{object} depends on the existence of \code{recover.data} and \code{lsm.basis} methods -- see \link{extending-lsmeans} for details. The call \code{methods("recover.data")} will help identify these. In certain models, (e.g., results of \code{\link[lme4]{glmer.nb}}), it is not possible to identify the original dataset. In such cases, we can work around this by setting \code{data} equal to the dataset used in fitting the model, or a suitable subset. Only the complete cases in \code{data} are used, so it may be necessary to exclude some unused variables. Using \code{data} can also help save computing, especially when the dataset is large. In any case, \code{data} must represent all factor levels used in fitting the model. It \emph{cannot} be used as an alternative to \code{at}. (Note: If there is a pattern of \code{NAs} that caused one or more factor levels to be excluded when fitting the model, then \code{data} should also exclude those levels.) By default, the variance-covariance matrix for the fixed effects is obtained from \code{object}, usually via its \code{\link{vcov}} method. However, the user may override this via a \code{vcov.} argument, specifying a matrix or a function. If a matrix, it must be square and of the same dimension and parameter order of the fixed efefcts. If a function, must return a suitable matrix when it is called with \code{object} as its only argument. } % --- end of details \value{An S4 object of class \code{"ref.grid"} (see \code{\link{ref.grid-class}}). These objects encapsulate everything needed to do calculations and inferences for least-squares means, and contain nothing that depends on the model-fitting procedure. } %%%\references{} \author{ Russell V. Lenth } %\note{} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ See also \code{\link[lsmeans]{summary}} and other methods for the returned objects. Reference grids are fundamental to \code{\link{lsmeans}}. Click here for more on the \code{\link[=ref.grid-class]{ref.grid}} class. Supported models are detailed in \code{\link{models}}. } \examples{ require(lsmeans) fiber.lm <- lm(strength ~ machine*diameter, data = fiber) ref.grid(fiber.lm) summary(ref.grid(fiber.lm)) ref.grid(fiber.lm, at = list(diameter = c(15, 25))) \dontrun{ # We could substitute the sandwich estimator vcovHAC(fiber.lm) # as follows: require(sandwich) summary(ref.grid(fiber.lm, vcov. = vcovHAC)) } # If we thought that the machines affect the diameters # (admittedly not plausible in this example), then we should use: ref.grid(fiber.lm, cov.reduce = diameter~machine) # Multivariate example MOats.lm = lm(yield ~ Block + Variety, data = MOats) ref.grid(MOats.lm, mult.name = "nitro") # silly illustration of how to use 'mult.levs' ref.grid(MOats.lm, mult.levs = list(T=LETTERS[1:2], U=letters[1:2])) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ regression } \keyword{ models }% __ONLY ONE__ keyword per line lsmeans/man/pairwise.lsmc.Rd0000644000175100001440000001325312634421507015564 0ustar hornikusers\name{pairwise.lsmc} \alias{pairwise.lsmc} \alias{revpairwise.lsmc} \alias{poly.lsmc} \alias{trt.vs.ctrl.lsmc} \alias{trt.vs.ctrl1.lsmc} \alias{trt.vs.ctrlk.lsmc} \alias{eff.lsmc} \alias{del.eff.lsmc} \alias{tukey.lsmc} \alias{dunnett.lsmc} \alias{consec.lsmc} \alias{mean_chg.lsmc} \title{ Contrast families } \description{ These functions return standard sets of contrast coefficients. The name of any of these functions (with the \code{.lsmc} omitted) may be used as the \code{method} argument in \code{\link{contrast}}, or as the \code{contr} argument or left-hand side of a \code{spec} formula in \code{\link{lsmeans}}. } \usage{ pairwise.lsmc(levs, ...) revpairwise.lsmc(levs, ...) tukey.lsmc(levs, reverse = FALSE) poly.lsmc(levs, max.degree = min(6, k - 1)) trt.vs.ctrl.lsmc(levs, ref = 1) trt.vs.ctrl1.lsmc(levs, ...) trt.vs.ctrlk.lsmc(levs, ...) dunnett.lsmc(levs, ref = 1) consec.lsmc(levs, reverse = FALSE, ...) mean_chg.lsmc(levs, reverse = FALSE, ...) eff.lsmc(levs, ...) del.eff.lsmc(levs, ...) } \arguments{ \item{levs}{Vector of factor levels} \item{\dots}{Additional arguments, ignored but needed to make these functions interchangeable} \item{max.degree}{The maximum degree of the polynomial contrasts in \code{poly.lsmc}} \item{reverse}{Logical value to determine the direction of comparisons, e.g., pairwise (if \code{TRUE}) or reverse-pairwise (if \code{FALSE}) comparisons.} \item{ref}{Reference level (or control group) in \code{trt.vs.ctrl.lsmc}} } \details{ Each contrast family has a default multiple-testing adjustment as noted below. These adjustments are often only approximate; for a more exacting adjustment, use the interfaces provided to \code{\link[multcomp]{glht}} in the \pkg{multcomp} package. \code{pairwise.lsmc}, \code{revpairwise.lsmc}, and \code{tukey.lsmc} generate contrasts for all pairwise comparisons among least-squares means at the levels in \code{levs}. The distinction is in which direction they are subtracted. For factor levels A, B, C, D, \code{pairwise.lsmc} generates the comparisons A-B, A-C, A-D, B-C, B-D, and C-D, whereas \code{revpairwise.lsmc} generates B-A, C-A, C-B, D-A, D-B, and D-C. \code{tukey.lsmc} invokes \code{pairwise.lsmc} or \code{revpairwise.lsmc} depending on \code{reverse}. The default multiplicity adjustment method is \code{"tukey"}, which is approximate when the standard errors differ. \code{poly.lsmc} generates orthogonal polynomial contrasts, assuming equally-spaced factor levels. These are derived from the \code{\link{poly}} function, but an ad hoc algorithm is used to scale them to integer coefficients that are (usually) the same as in published tables of orthogonal polynomial contrasts. The default multiplicity adjustment method is \code{"none"}. \code{trt.vs.ctrl.lsmc} and its relatives generate contrasts for comparing one level (or the average over specified levels) with each of the other levels. The argument \code{ref} should be the \emph{index}(es) (not the labels) of the reference level(s). \code{trt.vs.ctrl1.lsmc} is the same as \code{trt.vs.ctrl} with a reference value of \code{1}, and \code{trt.vs.ctrlk.lsmc} is the same as \code{trt.vs.ctrl} with a reference value of \code{length(levs)}. \code{dunnett.lsmc} is the same as \code{trt.vs.ctrl}. The default multiplicity adjustment method is \code{"dunnettx"}, a close approximation to the Dunnett adjustment. \code{consec.lsmc} and \code{mean_chg.lsmc} are useful for contrasting treatments that occur in sequence. For a factor with levels A, B, C, D, E, \code{consec.lsmc} generates the comparisons B-A, C-B, and D-C, while \code{mean_chg.lsmc} generates the contrasts (B+C+D)/3 - A, (C+D)/2 - (A+B)/2, and D - (A+B+C)/3. With \code{reverse = TRUE}, these differences go in the opposite direction. \code{eff.lsmc} and \code{del.eff.lsmc} generate contrasts that compare each level with the average over all levels (in \code{eff.lsmc}) or over all other levels (in \code{del.eff.lsmc}). These differ only in how they are scaled. For a set of \eqn{k} lsmeans, \code{del.eff.lsmc} gives weight \eqn{1} to one lsmean and weight \eqn{-1/(k-1)} to the others, while \code{eff.lsmc} gives weights \eqn{(k-1)/k} and \eqn{-1/k} respectively, as in subtracting the overall lsmean from each lsmean. The default multiplicity adjustment method is \code{"fdr"}. This is a Bonferroni-based method and is slightly conservative; see \code{\link{p.adjust}} } \value{ A \code{data.frame}, each column containing contrast coefficients for \code{levs}. The \code{"desc"} attribute is used to label the results in \code{lsmeans}, and the \code{"adjust"} attribute gives the default adjustment method for multiplicity. } \author{ Russell V. Lenth } \note{ You may create your own contrast functions, using these as guides. A function named \code{mycontr.lsmc} may be invoked in \code{lsmeans} via, e.g., \preformatted{lsmeans(\var{object}, mycontr ~ \var{factor})} The \code{"desc"}, \code{"adjust"}, and \code{"offset"} attributes are optional; if present, these are passed to \code{contrast}. If absent, the root name of the function is used as \code{"desc"}, and no adjustment is requested for p values. See the examples. } \seealso{ \code{\link{lsmeans}}, \code{\link[multcomp]{glht}} } \examples{ ### View orthogonal polynomials for 4 levels poly.lsmc(1:4) ### Setting up a custom contrast function helmert.lsmc <- function(levs, ...) { M <- as.data.frame(contr.helmert(levs)) names(M) <- paste(levs[-1],"vs earlier") attr(M, "desc") <- "Helmert contrasts" M } warp.lm <- lm(breaks ~ wool*tension, data = warpbreaks) lsmeans(warp.lm, helmert ~ tension | wool) } \keyword{ models } \keyword{ regression } \keyword{ htest } lsmeans/man/lsmeans.Rd0000644000175100001440000003630312634421507014447 0ustar hornikusers\name{lsmeans} \alias{lsmeans} \alias{lsmeans.formula} \alias{lsmeans.list} \alias{lsmeans.character} \alias{lsmeans.character.ref.grid} \alias{lstrends} \alias{lsmobj} \alias{pmmeans} \alias{pmtrends} \alias{pmmobj} \title{Least-squares means (or predicted marginal means)} \description{ Compute least-squares means (predicted marginal means) for specified factors or factor combinations in a linear model, and optionally comparisons or contrasts among them. } \usage{ \method{lsmeans}{character}(object, specs, ...) ## (used when 'specs' is 'character') \method{lsmeans}{character.ref.grid}(object, specs, by = NULL, fac.reduce = function(coefs) apply(coefs, 2, mean), contr, options = getOption("lsmeans")$lsmeans, weights, ...) ## (used when 'object' is a 'ref.grid' and 'specs' is 'character') \method{lsmeans}{list}(object, specs, ...) ## (used when 'specs' is a 'list') \method{lsmeans}{formula}(object, specs, contr.list, trend, ...) ## (used when 'specs' is a 'formula') lstrends(model, specs, var, delta.var = 0.01 * rng, data, ...) lsmobj(bhat, V, levels, linfct, df = NA, post.beta = matrix(NA), ...) pmmeans(...) pmtrends(...) pmmobj(...) } \arguments{ \item{object}{ An object of class \code{ref.grid}; or a fitted model object that is supported, such as the result of a call to \code{lm} or \code{lmer}. Many fitted-model objects are supported; see \code{link{models}} for details.} \item{specs}{ A \code{character} vector specifying the names of the predictors over which LS-means are desired. \code{specs} may also be a \code{formula} or a \code{list} (optionally named) of valid \code{spec}s. Use of formulas is described in the Details section below.} \item{by}{ A character vector specifying the names of predictors to condition on.} \item{fac.reduce}{ A function that combines the rows of a matrix into a single vector. This implements the ``marginal averaging'' aspect of least-squares means. The default is the mean of the rows. Typically if it is overridden, it would be some kind of weighted mean of the rows. If \code{fac.reduce} is nonlinear, bizarre results are likely, and LS means will not be interpretable. If the \code{weights} argument is non-missing, \code{fac.reduce} is ignored.} \item{contr}{ A \code{list} of contrast coefficients to apply to the least-squares means -- or the root name of an \code{.lsmc} function that returns such coefficients. In addition, \code{contr = "cld"} is an alternative way to invoke the \code{\link[lsmeans]{cld}} function. See \code{\link{contrast}} for more details on contrasts. NOTE: \code{contr} is ignored when \code{specs} is a formula. } \item{contr.list}{ A named \code{list} of \code{list}s of contrast coefficients, as for \code{contr}. This is used only in the formula method; see Details below. } \item{options}{If non-\code{NULL}, a named \code{list} of arguments to pass to \code{\link{update}}, just after the object is constructed.} \item{weights}{ Numeric vector, numeric matrix, or character string specifying weights to use in averaging predictions. If a vector, its length must equal the number of predictions to be averaged to obtain each least-squares mean. If a matrix, each row of the matrix is used in turn, wrapping back to the first row as needed. When in doubt about what is being averaged (or how many), first call with \code{weights = "show.levels"}.) If a string, it should partially match one of the following: \describe{ \item{\code{"equal"}}{Use an equally weighted average.} \item{\code{"proportional"}}{Weight in proportion to the frequencies (in the original data) of the factor combinations that are averaged over.} \item{\code{"outer"}}{Weight in proportion to each individual factor's marginal frequencies. Thus, the weights for a combination of factors are the outer product of the one-factor margins} \item{\code{"cells"}}{Weight according to the frequencies of the cells being averaged.} \item{\code{show.levels}}{This is a convenience feature for understanding what is being averaged over. Instead of a table of LS means, this causes the function to return a table showing the levels that are averaged over, in the order they appear.} } Outer weights are like the 'expected' counts in a chi-square test of independence, and will yield the same results as those obtained by proportional averaging with one factor at a time. All except \code{"cells"} uses the same set of weights for each mean. In a model where the predicted values are the cell means, cell weights will yield the raw averages of the data for the factors involved. Note: If weights were used in fitting the model, then weight totals are used in place of frequencies in these schemes. If \code{weights} is used, \code{fac.reduce} is ignored. } \item{trend}{ Including this argument is an alternative way of calling \code{lstrends} with it as its \code{var} argument. } \item{model}{ A supported model object. } \item{var}{ Character giving the name of a variable with respect to which a difference quotient of the linear predictors is computed. In order for this to be useful, \code{var} should be a numeric predictor that interacts with at least one factor in \code{specs}. Then instead of computing least-squares means, we compute and compare the slopes of the \code{var} trend over levels of the specified other predictor(s). As in least-squares means, marginal averages are computed when some variables in the reference grid are excluded for the specification. The user may specify some monotone function of one variable, e.g., \code{var = "log(dose)"}. If so, the chain rule is applied. Note that, in this example, if \code{model} contains \code{log(dose)} as a predictor, we will be comparing the slopes estimated by that model, whereas specifying \code{var = "dose"} would perform a transformation of those slopes. } \item{delta.var}{ The value of \emph{h} to use in forming the difference quotient \emph{(f(x+h) - f(x))/h}. Changing it (especially changing its sign) may be necessary to avoid numerical problems such as logs of negative numbers. The default value is 1/100 of the range of \code{var} over the dataset. } \item{data}{As in \code{\link{ref.grid}}, you may use this argument to supply the dataset used in fitting the model, for situations where it is not possible to reconstruct the data. Otherwise, leave it missing.} \item{bhat}{Numeric. Vector of regression coefficients.} \item{V}{Square matrix. Covariance matrix of \code{bhat}} \item{levels}{Named list or vector. Levels of factor(s) that define the estimates defined by \code{linfct}. If not a list, we assume one factor named \code{"level"}} \item{linfct}{Matrix. Linear functions of \code{bhat} for each combination of \code{levels}} \item{df}{Numeric or function with arguments \code{x,dfargs)}. If a number, that is used for the degrees of freedom. If a function, it should return the degrees of freedom for \code{sum(x*bhat)}; if additional parameters are needed, include them in \code{\dots} as \code{dfargs} (not abbreviated).} \item{post.beta}{Matrix whose columns comprise a sample from the posterior distribution of the regression coefficients (so that typically, the column averages will be \code{bhat}). A 1 x 1 matrix of \code{NA} indicates that such a sample is unavailable.} \item{\dots}{Additional arguments passed to other methods or to \code{\link{ref.grid}}. For example, \code{vcov.} may be used to override the default covariance estimate, and some models allow additional options. Some models require \code{data} to be given explicitly. See the help pages for \code{\link{ref.grid}} and \link{models}. In addition, if the model formula contains references to variables that are not predictors, you must provide a \code{params} argument with a list of their names; see the example below for \code{Oatsq.lm}.} } \details{ Least-squares means (also called predicted marginal means) are predictions from a linear model over a \emph{reference grid}, or marginal averages thereof. They have been popularized by \pkg{SAS} (SAS Institute, 2012). The \code{\link{ref.grid}} function identifies/creates the reference grid upon which \code{lsmeans} is based. For those who prefer the term \dQuote{predicted marginal means}, courtesy wrappers \code{pmmeans}, \code{pmtrends}, and \code{pmmobj} are provided that behave identically to those that start with \code{ls}, except that estimates are relabeled accordingly (e.g., \code{lsmean} becomes \code{pmmean}). If \code{specs} is a \code{formula}, it should be of the form \code{contr ~ specs | by}. The formula is parsed and then used as the arguments \code{contr}, \code{specs}, and \code{by} as indicated. The left-hand side is optional, but if specified it should be the name of a contrast family (e.g., \code{pairwise}) or of a sub-list of \code{contr.list}. Operators like \code{*} or \code{:} are necessary to delineate names in the formulas, but otherwise are ignored. A number of standard contrast families are provided. They can be identified as functions having names ending in \code{.lsmc} -- use \preformatted{ls("package:lsmeans", pat=".lsmc")} to list them. See the documentation for \code{\link{pairwise.lsmc}} and its siblings for details. You may write your own \code{.lsmc} function for custom contrasts. The function \code{lsmobj} may be used to construct an object just like one returned by \code{lsmeans} from user-specified coefficients, covariance matrix, levels (or row labels), linear functions for each row, and degrees of freedom. After the object is constructed, it is \code{\link[lsmeans]{update}}ed with any additional arguments in \code{\dots}. } \value{ When \code{specs} is a \code{character} vector or one-sided formula, an object of class \code{\link[=lsmobj-class]{lsmobj}}. A number of methods are provided for further analysis, including \code{\link[lsmeans]{summary}}, \code{\link[lsmeans]{confint}}, \code{\link[lsmeans]{test}}, \code{\link[lsmeans]{contrast}}, \code{\link[lsmeans]{pairs}}, and \code{\link[lsmeans]{cld}}. When \code{specs} is a \code{list} or a \code{formula} having a left-hand side, the eturn value is an \code{lsm.list} object, which is simply a \code{list} of \code{lsmobj} objects. Methods for \code{lsm.list} objects are the same as those for \code{lsmobj}, but they apply to only one member of the list, determined by its \code{which} argument. } \note{If the model formula contains variables that are not predictors (e.g., degree of a polynomial, knots for a spline, etc.), you must add a \code{params} argument to the call} \note{While using \code{specs} as a two-sided formula or a list is a convenient way to get a lot of results with minimal effort, it can also create confusion when additional arguments are provided, because not all arguments may be applied to all the results produced (see examples). Thus, the safer route is to do things incrementally.} \note{\code{lsmeans} and its relatives can produce fatal errors or incorrect results with models containing splines (e.g., \code{\link{ns}}) and other smoothers because the required information to reconstruct their basis is not always available. A model with \code{\link{poly}} involving two or more predictors will almost always produce misleading results without any warning; but \code{poly(..., raw = TRUE)} will work correctly.} \note{For a \code{ref.grid} or \code{lsmobj} object created in \pkg{lsmeans} version 2.10 or earlier, the information needed by the \code{weights} argument is not present; so a message is displayed and averaging is done using \code{fac.reduce}.} \references{ SAS Institute Inc. (2012) Online documentation; Shared concepts; LSMEANS statement, \url{http://support.sas.com/documentation/cdl/en/statug/63962/HTML/default/viewer.htm#statug_introcom_a0000003362.htm}, accessed August 15, 2012. } \author{ Russell V. Lenth } \seealso{ \code{\link{models}}, \code{\link{pairwise.lsmc}}, \code{\link[multcomp]{glht}} } \examples{ require(lsmeans) ### Covariance example (from Montgomery Design (8th ed.), p.656) # Uses supplied dataset 'fiber' fiber.lm <- lm(strength ~ diameter + machine, data = fiber) # adjusted means and comparisons, treating machine C as control ( fiber.lsm <- lsmeans (fiber.lm, "machine") ) contrast(fiber.lsm, "trt.vs.ctrlk") # Or get both at once using # lsmeans (fiber.lm, "machine", contr = "trt.vs.ctrlk") ### Factorial experiment warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) ( warp.lsm <- lsmeans (warp.lm, ~ wool | tension, options = list(estName = "pred.breaks")) ) pairs(warp.lsm) # remembers 'by' structure contrast(warp.lsm, method = "poly", by = "wool") ### Unbalanced split-plot example ### #-- The imbalance is imposed deliberately to illustrate that #-- the variance estimates become biased require(nlme) Oats.lme <- lme(yield ~ factor(nitro) + Variety, random = ~1 | Block/Variety, subset = -c(1,2,3,5,8,13,21,34,55), data = Oats) (Oats.anal <- lsmeans(Oats.lme, list(poly ~ nitro, pairwise ~ Variety))) ### Issues with lists of specs test(Oats.anal) # Uses 1st element by default confint(Oats.anal, which = 4) # or confint(Oats.anal[[4]]) # Using 'pmmeans' wrapper ... # These two calls apply the "bonf" adjustment to different elements... pmmeans(warp.lm, eff ~ wool, adjust = "bonf") pmmeans(warp.lm, eff ~ wool, options = list(adjust = "bonf")) # Advice: Do one thing at a time if you want non-default adjustments # e.g., wool.lsm <- lsmeans(warp.lm, ~ wool) # summary(wool.lsm, adjust = "bonf") # contrast(wool.lsm, "eff", adjust = "sidak") ### Weights # See what's being averaged over in the above lsmeans(Oats.lme, ~ nitro, cov.reduce = FALSE, weights = "show.levels") # Give three times the weight to Marvellous lsmeans(Oats.lme, ~ nitro, cov.reduce = FALSE, weights = c(1,3,1)) ### Model with a quadratic trend for 'nitro' # Also illustrates use of `params` argument to list non-predictors deg = 2 Oatsq.lm <- lm(yield ~ Block + poly(nitro, deg) + Variety, data = Oats) # Predictions at each unique 'nitro' value in the dataset lsmeans(Oatsq.lm, ~ nitro, cov.reduce = FALSE, params = "deg") ### Trends fiber.lm <- lm(strength ~ diameter*machine, data=fiber) # Obtain slopes for each machine ... ( fiber.lst <- lstrends(fiber.lm, "machine", var="diameter") ) # ... and pairwise comparisons thereof pairs(fiber.lst) # Suppose we want trends relative to sqrt(diameter)... lstrends(fiber.lm, ~ machine | diameter, var = "sqrt(diameter)", at = list(diameter = c(20,30))) # Given summary statistics for 4 cities computed elsewhere, # obtain multiple comparisons of their means using the # Satterthwaite method ybar <- c(47.6, 53.2, 88.9, 69.8) s <- c(12.1, 19.5, 22.8, 13.2) n <- c(44, 11, 37, 24) se2 = s^2 / n Satt.df <- function(x, dfargs) sum(x * dfargs$v)^2 / sum((x * dfargs$v)^2 / (dfargs$n - 1)) city.pmm <- pmmobj(bhat = ybar, V = diag(se2), levels = list(city = LETTERS[1:4]), linfct = diag(c(1,1,1,1)), df = Satt.df, dfargs = list(v = se2, n = n), estName = "mean") city.pmm contrast(city.pmm, "revpairwise") # See also many other examples in documentation for # 'contrast', 'cld', 'glht', 'lsmip', 'ref.grid', 'MOats', # 'nutrition', etc., and in the vignettes } \keyword{ models } \keyword{ regression } \keyword{ htest } lsmeans/man/feedlot.Rd0000644000175100001440000000367612634421507014436 0ustar hornikusers\name{feedlot} \alias{feedlot} \docType{data} \title{ Feedlot data } \description{ This is an unbalanced analysis-of-covariance example, where one covariate is affected by a factor. Feeder calves from various herds enter a feedlot, where they are fed one of three diets. The weight of the animal at entry is the covariate, and the weight at slaughter is the response. } \usage{data(feedlot)} \format{ A data frame with 67 observations on the following 4 variables. \describe{ \item{\code{herd}}{a factor with levels \code{9} \code{16} \code{3} \code{32} \code{24} \code{31} \code{19} \code{36} \code{34} \code{35} \code{33}, designating the herd that a feeder calf came from.} \item{\code{diet}}{a factor with levels \code{Low} \code{Medium} \code{High}: the energy level of the diet given the animal.} \item{\code{swt}}{a numeric vector: the weight of the animal at slaughter.} \item{\code{ewt}}{a numeric vector: the weight of the animal at entry to the feedlot.} } } \details{ The data arise from a Western Regional Research Project conducted at New Mexico State University. Calves born in 1975 in commercial herds entered a feedlot as yearlings. Both diets and herds are of interest as factors. The covariate, \code{ewt}, is thought to be dependent on \code{herd} due to different genetic backgrounds, breeding history, etc. The levels of \code{herd} ordered to similarity of genetic background. Note: There are some empty cells in the cross-classification of \code{herd} and \code{diet}. } \source{ Urquhart NS (1982) Adjustment in covariates when one factor affects the covariate. \emph{Biometrics} 38, 651-660. } \examples{ require(lsmeans) feedlot.lm <- lm(swt ~ ewt + herd*diet, data = feedlot) # Obtain LS~means with a separate reference value of ewt for each # herd. This reproduces the last part of Table 2 in the reference lsmeans(feedlot.lm, ~ diet | herd, cov.reduce = ewt ~ herd) } \keyword{datasets} lsmeans/man/update.Rd0000644000175100001440000002034512634421507014266 0ustar hornikusers\name{update} \alias{update} \alias{update.ref.grid} \alias{lsm.options} \alias{get.lsm.option} \alias{defaults} \alias{pmm.options} \alias{get.pmm.option} \title{ Set or retrieve options for objects and summaries in \pkg{lsmeans} } \description{ Objects of class \code{ref.grid} or \code{lsmobj} contain several settings in their \code{"misc"} slot that affect primarily the defaults used by \code{\link{summary}}. This \code{update} method allows them to be changed more safely than by modifying this slot directly. In addition, the user may set defaults for all objects using \samp{options(lsmeans = ...)}, or more conveniently using the \code{lsm.options} and \code{get.lsm.option} functions documented here (or its courtesy wrappers, \code{pmm.options} and \code{get.pmm.option} for those who dislike the \sQuote{least-squares means} terminology). } \usage{ \S3method{update}{ref.grid}(object, ..., silent = FALSE) lsm.options(...) get.lsm.option(x, default = lsmeans::defaults[[x]]) pmm.options(...) get.pmm.option(...) } \arguments{ \item{object}{An object of class \code{ref.grid} (or its extension, \code{lsmobj}) } \item{\dots}{ Arguments specifying elements' names and their new values. } \item{silent}{If \code{FALSE}, a message is displayed for any unmatched names.} \item{x}{Character string holding an option name for \code{lsm.options}.} \item{default}{Return value if \code{x} is not found.} } \details{ In \code{update}, the names in \code{\dots} are partially matched against those that are valid, and if a match is found, it adds or replaces the current setting. The valid names are \describe{ \item{\code{tran}}{(\code{list} or \code{character}) specifies the transformation which, when inverted, determines the results displayed by \code{\link{summary}}, \code{\link{predict}}, or \code{\link{lsmip}} when \code{type="response"}. The value may be the name of a standard transformation from \code{\link{make.link}}, or, for a custom transformation, a \code{list} containing at least the functions \code{linkinv} (the inverse of the transformation) and \code{mu.eta} (the derivative thereof). See the Examples. } \item{\code{estName}}{(\code{character}) is the column label used for displaying predictions or LS means.} \item{\code{inv.lbl}}{(\code{character)}) is the column label to use for predictions or LS means when \code{type="response"}.} \item{\code{by.vars}}{(\code{character)} vector or \code{NULL}) the variables used for grouping in the summary, and also for defining subfamilies in a call to \code{\link{contrast}}.} \item{\code{pri.vars}}{(\code{character} vector) are the names of the grid variables that are not in \code{by.vars}. Thus, the combinations of their levels are used as columns in each table produced by \code{\link{summary}}.} \item{\code{alpha}}{(numeric) is the default significance level for tests, in \code{\link{summary}} as well as \code{\link{cld}} and \code{\link{plot}} when \samp{intervals = TRUE}} \item{\code{adjust}}{(\code{character)}) is the default for the \code{adjust} argument in \code{\link{summary}}.} \item{\code{estType}}{(\code{character}) is the type of the estimate. It should match one of \samp{c("prediction","contrast","pairs")}. This is used along with \code{"adjust"} to determine appropriate adjustments to P values and confidence intervals.} \item{\code{famSize}}{(integer) is the \code{nmeans} parameter for \code{\link{ptukey}} when \code{adjust="tukey"}. } \item{\code{infer}}{(\code{logical} vector of length 2) is the default value of \code{infer} in \code{\link{summary}}.} \item{\code{level}}{(numeric) is the default confidence level, \code{level}, in \code{\link{summary}}} \item{\code{df}}{(numeric) overrides the default degrees of freedom with a specified single value.} \item{\code{predict.type}}{(character) sets the default method of displaying predictions in \code{\link{summary}}, \code{\link{predict}}, and \code{\link{lsmip}}. Valid values are \code{"link"} (with synonyms \code{"lp"} and \code{"linear"}), or \code{"response"}.} \item{\code{avgd.over}}{(\code{character)} vector) are the names of the variables whose levels are averaged over in obtaining marginal averages of predictions, i.e., LS means. Changing this might produce a misleading printout, but setting it to \code{character(0)} will suppress the \dQuote{averaged over} message in the summary.} \item{\code{initMesg}}{(\code{character}) is a string that is added to the beginning of any annotations that appear below the \code{\link{summary}} display.} \item{\code{methDesc}}{(\code{character}) is a string that may be used for creating names for a list of \code{lsmobj} objects. } } % end \describe In \code{lsm.options}, we may set or change the default values for the above attributes in the \code{lsmeans} option list(see \code{\link{options}}). Currently, the following elements of this list are used if specified: \describe{ \item{\code{ref.grid}}{A named \code{list} of defaults for objects created by \code{\link{ref.grid}}. This could affect other iobjects as well. For example, if \code{lsmeans} is called with a fitted model object, it calls \code{ref.grid} and this option will affect the resulting \code{lsmobj} object.} \item{\code{lsmeans}}{A named \code{list} of defaults for objects created by \code{\link{lsmeans}} (or \code{\link{lstrends}}).} \item{\code{contrast}}{A named \code{list} of defaults for objects created by \code{\link{contrast}} (or \code{\link{pairs}}).} \item{\code{summary}}{A named \code{list} of defaults used by the methods \code{\link{summary}}, \code{\link{predict}}, and \code{\link{lsmip}}. The only option that can affect the latter two is \code{"predict.method"}.} \item{\code{estble.tol}}{Tolerance for determining estimability in rank-deficient cases. If absent, the value in \code{lsmeans::defaults$estble.tol)} is used.} } % end \describe } % end details \value{ \code{update} returns a copy of \code{object} with its \code{"misc"} slot modified. \code{lsm.options} returns the current options (same as the result of \samp{getOption("lsmeans")}). } \author{ Russell V. Lenth } \note{If a call to \code{\link{lsmeans}}, \code{\link{contrast}}, or \code{\link{ref.grid}} contains a non-\code{NULL} \code{options} list, those options are passed in a call to \code{update} on the constructed object before it is returned. This allows you, for example, to override the defaults used by \code{\link{summary}}. In addition, user defaults may be set using an \code{link{options}} setting for \code{"lsmeans"}. It should be a list with one or more named elements \code{lsmeans}, \code{contrast}, or \code{ref.grid}, used for setting the defaults for objects constructed by functions of these same names. Note that options can get \dQuote{inherited}. See the examples. Unlike the \code{update} method for model classes (\code{lm}, \code{glm}, etc.), this does not re-fit or re-estimate anything; but it does affect how \code{object} is treated by other methods for its class.} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{summary}} } \examples{ # An altered log transformation warp.lm1 <- lm(log(breaks + 1) ~ wool*tension, data = warpbreaks) rg1 <- update(ref.grid(warp.lm1), tran = list(linkinv = function(eta) exp(eta) - 1, mu.eta = function(eta) exp(eta)), inv.lbl = "pred.breaks") summary(rg1, type = "response") \dontrun{ lsm.options(ref.grid = list(level = .90), contrast = list(infer = c(TRUE,FALSE)), estble.tol = 1e-6) # Sets default confidence level to .90 for objects created by ref.grid # AS WELL AS lsmeans called with a model object (since it creates a # reference grid). In addition, when we call 'contrast', 'pairs', etc., # confidence intervals rather than tests are displayed by default. \dontrun{ lsm.options(disable.pbkrtest = TRUE) # This forces use of asymptotic methods for lmerMod objects. # Set to FALSE or NULL to re-enable using pbkrtest. } # See tolerance being used for determining estimability get.lsm.option("estble.tol") } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ models } \keyword{ htest }% __ONLY ONE__ keyword per line lsmeans/man/extending.Rd0000644000175100001440000001643112634421507014772 0ustar hornikusers\name{recover.data} \alias{recover.data} \alias{recover.data.call} \alias{lsm.basis} %%\alias{.all.vars} % documented in the vignette %%\alias{nonest.basis} % moved to estimability package %%\alias{is.estble} % additional ref topic \alias{extending-lsmeans} \title{Support functions for creating a reference grid} \description{ This documents the methods used to create a \code{\link[=ref.grid-class]{ref.grid}} object from a fitted model. } \usage{ recover.data(object, ...) \S3method{recover.data}{call}(object, trms, na.action, data = NULL, params = NULL, ...) lsm.basis(object, trms, xlev, grid, ...) %%% %%%.all.vars(expr, retain = c("\\\\$", "\\\\[\\\\[", "\\\\]\\\\]"), ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ An object returned from a model-fitting function.} \item{trms}{The \code{\link{terms}} component of \code{object}} \item{xlev}{Named list of levels of factors in the model frame. This should \emph{not} include levels of factors created in the model itself, e.g., by including a \code{factor} call in the model formula.} \item{grid}{A \code{data.frame} containing predictor values at which predictions are needed.} \item{na.action}{Integer vector of indices of observations to ignore; or \code{NULL} if none} \item{data}{Data frame. Usually, this is \code{NULL}. However, if non-null, this is used in place of the reconstructed dataset. It must have all of the predictors used in the model, and any factor levels must match those used in fitting the model.} \item{params}{Character vector giving the names of any variables in the model formula that are \emph{not} predictors. An example would be a variable \code{knots} specifying the knots to use in a spline model. } % \item{expr}{A formula} % \item{retain}{Character vector of operators to retain (escaped as for \code{\link{gsub}})} \item{\dots}{Additional arguments passed to other methods.} } \details{ To create a reference grid, the \code{ref.grid} function needs to reconstruct the data used in fitting the model, and then obtain a matrix of linear functions of the regression coefficients for a given grid of predictor values. These tasks are performed by calls to \code{recover.data} and \code{lsm.basis} respectively. To extend \pkg{lsmeans}'s support to additional model types, one need only write S3 methods for these two functions. The existing methods serve as helpful guidance for writing new ones. Most of the work for \code{recover.data} can be done by its method for class \code{"call"}, providing the \code{terms} component and \code{na.action} data as additional arguments. Writing an \code{lsm.basis} method is more involved, but the existing methods (e.g., \code{lsmeans:::lsm.basis.lm}) can serve as models. See the ``Value'' section below for details on what it needs to return. Also, certain \code{recover.data} and \code{lsm.basis} methods are exported from \pkg{lsmeans}, so if your object is based on another model-fitting object, it may be that all that is needed is to call one of these exported methods and perhaps make modifications to the results. Contact the developer if you need others of these exported. If the model has a multivariate response, \code{bhat} needs to be \dQuote{flattened} into a single vector, and \code{X} and \code{V} must be constructed consistently. In models where a non-full-rank result is possible (often you can tell by seeing if there is a \code{singular.ok} argument in the model-fitting function), \code{summary} and \code{predict} check the estimability of each prediction, using the \code{\link[estimability]{nonest.basis}} function in the \pkg{estimability} package. The models already supported are detailed in \code{\link{models}}. Some packages may provide additional \pkg{lsmeans} support for its object classes. } \value{ \code{recover.data} should return a \code{data.frame} containing all the variables in the original data that appear as predictors in the model. Several attributes need to be included as well; see the code for \code{lsmeans:::recover.data.lm}. \code{lsm.basis} should return a \code{list} with the following elements: \item{X}{The matrix of linear fcns over \code{grid}, having the same number of rows as \code{grid} and the number of columns equal to the length of \code{bhat}.} \item{bhat}{The vector of regression coefficients for fixed effects. This should \emph{include} any \code{NA}s that result from rank deficiencies.} \item{nbasis}{A matrix whose columns form a basis for non-estimable functions of beta, or a 1x1 matrix of \code{NA} if there is no rank deficiency.} \item{V}{The estimated covariance matrix of \code{bhat}.} \item{dffun}{A function of \code{(k, dfargs)} that returns the degrees of freedom associated with \code{sum(k * bhat)}.} \item{dfargs}{A \code{list} containing additional arguments needed for \code{dffun}.} %%%\code{.all.vars} is an enhancement of \code{\link{all.vars}}, whereby the operators specified in \code{retain} are left intact. Thus, \code{All.vars(foo$y ~ bar[[2]])} returns \code{"foo$y", "bar[[2]]"}, whereas \code{all.vars} returns \code{"foo", "y", "bar"} } %\references{} \section{Optional hooks}{ Some models may need something other than standard linear estimates and standard errors. If so, custom functions may be pointed to via the items \code{misc$estHook}, \code{misc$vcovHook} and \code{misc$postGridHook}. If just the name of the hook function is provided as a character string, then it is retrieved using \code{\link{get}}. The \code{estHook} function should have arguments \samp{(object, do.se, tol, ...)} where \code{object} is the \code{ref.grid} or \code{lsmobj} object, \code{do.se} is a logical flag for whether to return the standard error, and \code{tol} is the tolerance for assessing estimability. It should return a matrix with 3 columns: the estimates, standard errors (\code{NA} when \code{do.se==FALSE}), and degrees of freedom (\code{NA} for asymptotic). The number of rows should be the same as \samp{object@linfct}. The \code{vcovHook} function should have arguments \samp{(object, tol, ...)} as described. It should return the covariance matrix for the estimates. Finally, \code{postGridHook}, if present, is called at the very end of \code{ref.grid}; it takes one argument, the constructed \code{object}, and should return a suitably modified\code{ref.grid} object. } \section{Additional functions}{ A few additional functions used in the \pkg{lsmeans} codebase are exported as they may be useful to package developers. See details near the end of the vignette \code{"extending"}. } \author{ Russell V. Lenth } %\note{} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{models}}, \code{\link{ref.grid}}, \code{\link{ref.grid-class}} } \examples{ \dontrun{ require(lsmeans) # Fit a 2-factor model with two empty cells warpsing.lm <- lm(breaks ~ wool*tension, data = warpbreaks, subset = -(16:40)) lsmeans:::recover.data.lm(warpsing.lm, data = NULL) grid = with(warpbreaks, expand.grid(wool = levels(wool), tension = levels(tension))) lsmeans:::lsm.basis.lm(warpsing.lm, delete.response(terms(warpsing.lm)), warpsing.lm$xlevels, grid) } % end dontrun } \keyword{ models } \keyword{ regression } lsmeans/man/ref.grid.class.Rd0000644000175100001440000001417012634421507015607 0ustar hornikusers\name{ref.grid-class} \Rdversion{1.1} \docType{class} \alias{ref.grid-class} \alias{lsmobj-class} \alias{lsmeans,ref.grid,character-method} \alias{show,ref.grid-method} \alias{show,lsmobj-method} \alias{summary,ref.grid-method} \title{Classes \code{"ref.grid"} and \code{"lsmobj"}} \description{ A reference grid encapsulates everything needed to compute least-squares means, independently of the underlying model object. The \code{"lsmobj"} class is a minor extension of \code{"ref.grid"} where the linear predictors for the reference grid are transformed in some linear way such as marginal averages or contrasts. } \section{Objects from the Classes}{ Objects of class \code{"ref.grid"} are most commonly created by calling the \code{\link{ref.grid}} function. Objects of class \code{"lsmobj"} are created by calling \code{\link{lsmeans}} or a related function such as \code{\link{contrast}}.} \section{Slots}{ \describe{ \item{\code{model.info}:}{Object of class \code{"list"} containing the elements \code{call} (the call that produced the model), \code{terms} (its \code{terms} object), and \code{xlev} (factor-level information)} \item{\code{roles}:}{Object of class \code{"list"} containing at least the elements \code{predictors}, \code{responses}, and \code{multresp}. These are character vectors of names of these variables.} \item{\code{grid}:}{Object of class \code{"data.frame"} containing the combinations of the variables that define the reference grid. In addition, there is an auxiliary column named \code{".wgt."} holding the observed frequencies or weights for each factor combination (excluding covariates). If the model has one or more \code{\link{offset}()} calls, there is an another auxiliary column named \code{".offset."}. Auxiliary columns are not considered part of the reference grid. (However, any variables included in \code{offset} calls \emph{are} in the reference grid.)} \item{\code{levels}:}{Object of class \code{"list"} with each entry containing the distinct levels of variables in the reference grid. Note that \code{grid} is obtained by applying the function \code{\link{expand.grid}} to this list} \item{\code{matlevs}:}{Object of class \code{"list"} Like \code{levels} but has the levels of any matrices in the original dataset. Matrix columns must always be reduced to a single value for purposes of the reference grid } \item{\code{linfct}:}{Object of class \code{"matrix"} giving the linear functions of the regression coefficients for predicting each element of the reference grid. The rows of this matrix go in one-to-one correspondence with the rows of \code{grid}, and the columns with elements of \code{bhat}} \item{\code{bhat}:}{Object of class \code{"numeric"} with the regression coefficients. If there is a multivariate response, this must be flattened to a single vector, and \code{linfct} and \code{V} redefined appropriately. Important: \code{bhat} must \emph{include} any \code{NA} values produced by collinearity in the predictors. These are taken care of later in the estimability check.} \item{\code{nbasis}:}{Object of class \code{"matrix"} with the basis for the non-estimable functions of the regression coefficients. Every LS mean will correspond to a linear combination of rows of \code{linfct}, and that result must be orthogonal to all the columns of \code{nbasis} in order to be estimable. This will be \code{NULL} if everything is estimable} \item{\code{V}:}{Object of class \code{"matrix"}, the symmetric variance-covariance matrix of \code{bhat} } \item{\code{dffun, dfargs:}}{Objects of class \code{"function"} and \code{"list"} respectively. \code{dffun(k,dfargs)} should return the degrees of freedom for the linear function \code{sum(k*bhat)}, or \code{NA} if unavailable} \item{\code{misc}:}{A \code{list} containing additional information used by methods. These include at least the following: \code{estName} (the label for the estimates of linear functions), and the default values of \code{infer}, \code{level}, and \code{adjust} to be used in the \code{\link{summary}} method. Elements in this slot may be modified if desired using the \code{\link{update}} method.} \item{\code{post.beta}:}{A \code{matrix} containing a sample from the posterior distribution of the regression coefficients; or a 1 x 1 matrix of \code{NA} if this is not available. When it is non-trivial, the \code{as.mcmc} method returns \code{post.beta} times \code{t(linfct)}, which is a sample from the posterior distribution of the LS means.} }} % end of describe and slots section \section{Extends}{ \code{Class "lsmobj"} extends \code{Class "ref.grid"}, directly. There is hardly a difference between these classes except for how the slots \code{linfct} and \code{grid} are obtained, and their \code{show} methods.} \section{Methods}{ All methods for these objects are S3 methods except for \code{show}. \describe{ \item{\code{show}:}{Prints the results of \code{str} for \code{ref.grid} objects, and \code{summary} for \code{lsmobj} objects.} \item{\code{str}:}{Displays a brief listing of the variables and levels defining the grid. } \item{\code{summary}:}{Displays a summary of estimates, standard errors, degrees of freedom, and optionally, tests and/or confidence intervals. } \item{\code{lsmeans}:}{Computes least-squares means and creates an \code{"lsmobj"} object.} \item{\code{confint}:}{Confidence intervals for lsmeans.} \item{\code{test}:}{Hypothesis tests. } \item{\code{cld}:}{Compact-letter display for tests of pairwise comparisons} \item{\code{contrast}:}{Contrasts among lsmeans. } \item{\code{pairs}:}{A special case of \code{contrasts} for pairwise comparisons. } \item{\code{update}:}{Change defaults used primarily by \code{summary}, such as transformation, p-value adjustment, and confidence level.} } % end of \describe } % end of Methods section %\references{} \author{ Russell V. Lenth } %\note{} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{ref.grid}}, \code{\link{lsmeans}} } \examples{ showClass("ref.grid") showClass("lsmobj") } \keyword{classes} lsmeans/man/lsmeans-package.Rd0000644000175100001440000001467012634421507016043 0ustar hornikusers\name{lsmeans-package} \alias{lsmeans-package} \docType{package} \encoding{utf-8} \title{ Least-squares means } \description{ This package provides methods for obtaining so-called least-squares means for factor combinations in a variety of fitted linear models. It can also compute contrasts or linear combinations of these least-squares means, (several standard contrast families are provided), and in addition can estimate and contrast slopes of trend lines. Popular adjustments for multiple-comparisons are provided, as well as graphical ways of displaying the results. } \section{Overview}{ \describe{ \item{Concept}{ Least-squares means (see Searle \emph{et al.} 1980, who prefer the term \dQuote{predicted marginal means} (PMM)) are popular for summarizing linear models that include factors. For balanced experimental designs, they are just the marginal means. For unbalanced data, they in essence estimate what you \emph{would} have observed that the data arisen from a balanced experiment. } \item{Reference grids}{ The implementation in \pkg{lsmeans} relies on our own concept of a \emph{reference grid}, which is an array of factor and predictor levels. Predictions are made on this grid, and least-squares means are defined as averages of these predictions over zero or more dimensions of the grid. The function \code{\link{ref.grid}} explicitly creates a reference grid (\code{ref.grid} object) that can subsequently be used to obtain least-squares means. The \code{\link{update}} method is used to change its properties. Our reference-grid framework expands slightly upon Searle \emph{et al.}'s definitions of PMMs, in that it is possible to include multiple levels of covariates in the grid. } \item{Models supported}{ Many linear models are supported by the package, including \code{lm}, \code{glm}, \code{aovList}, and \code{mlm} in the \pkg{stats} package, as well as fitted-model objects from several contributed packages including \pkg{nlme}, \pkg{lme4}, \pkg{survival}, and \pkg{geepack}. The help page for \code{\link{models}} provides more details, including, in some cases, additional \code{ref.grid} arguments that might affect the subsequent analysis. Also, some models require other packages be installed in order to obtain all the available features. } \item{Least-squares means}{ The \code{\link{lsmeans}} function computes least-squares means given a \code{ref.grid} object or a fitted model, and a specification indicating what factors to include. The \code{\link{lstrends}} function creates the same sort of results for estimating and comparing slopes of fitted lines. Both return an \code{lsmobj} object very much like a reference grid, but with possibly fewer factors involved. } \item{Summaries and analysis}{ The \code{\link{summary}} method may be used to display a \code{ref.grid} or an \code{lsmobj}. Special-purpose summaries are available via \code{\link{confint}} and \code{\link{test}}, the latter of which can also do a joint test of several estimates. The user may specify by variables, multiplicity-adjustment methods, confidence levels, etc., and if a transformation or link function is involved, may reverse-transform the results to the response scale. } \item{Contrasts and comparisons}{ The \code{\link{contrast}} method is used to obtain contrasts among the estimates; several standard contrast families are available such as deviations from the mean, polynomial contrasts, and comparisons with one or more controls. Another \code{lsmobj} object is returned, which can be summarized or further analyzed. For convenience, a \code{pairs} method is provided for the case of pairwise comparisons. Related to this is the \code{\link{cld}} method, which provides a compact letter display for grouping pairs of means that are not significantly different. \code{cld} requires the \pkg{multcompView} package. } \item{Graphs}{The \code{\link[=plot.lsmobj]{plot}} method will display side-by-side confidence intervals for the estimates, and/or \sQuote{comparison arrows} whereby the significance of pairwise differences can be judged by how much they overlap. The \code{\link{lsmip}} function displays estimates like an interaction plot, multi-paneled if there are by variables. These graphics capabilities require the \pkg{lattice} package be installed. } \item{\pkg{multcomp} interface}{ The \code{\link{as.glht}} function and \code{\link{glht}} method for \code{lsmobj}s provide an interface to the \code{\link[multcomp]{glht}} function in the \pkg{multcomp} package, thus providing for more exacting simultaneous estimation or testing. The package also provides an \code{\link{lsm}} method that works as an alternative to \code{\link[multcomp]{mcp}} in a call to \code{glht}. } }}% overview \section{Additional information}{ Examples and discussion are available via \code{vignette("using-lsmeans", package="lsmeans")}. Some features of the \pkg{lsmeans} require (or are enhanced by) additional packages that are loaded when needed. Since they are not \dQuote{required} packages, they are not automatically installed with \pkg{lsmeans}. We highly recommend that users also install the following packages: \pkg{multcomp} (if \code{\link{cld}}, \code{\link{glht}}, or \code{\link{as.glht}} are to be used), \pkg{multcompView} (for \code{\link{cld}}), \pkg{lattice} (for \code{\link{plot}} and \code{\link{lsmip}}), and \pkg{pbkrtest} (for models fitted by the \pkg{lme4} package). Starting with \pkg{lsmeans} version 2, a new object framework based on \emph{reference grids} is used that increases flexibility and provides for extending its capabilities to additional model objects. Use \code{vignette("lsmeans-changes")} for information on the user impact of these changes. It is possible to write your own interfaces for models not yet supported by \pkg{lsmeans}. See the help page \code{\link{extending-lsmeans}} and \code{vignette("extending")} for details on how to do this. } % add'l information \details{ \tabular{ll}{ Package: \tab lsmeans\cr Type: \tab Package\cr License: \tab GPL-2\cr Other information: \tab See DESCRIPTION\cr } } \references{ Searle S.R. Speed F.M. Milliken G.A. (1980) Population marginal means in the linear model: An alternative to least squares means. \emph{The American Statistician} \bold{34}(4), 216-221. } \author{ Russell V. Lenth (author), Maxime Hervé (contributor) Maintainer: Russ Lenth } \keyword{ package } \keyword{ models } \keyword{ regression } \keyword{ htest } lsmeans/man/fiber.Rd0000644000175100001440000000227512634421507014075 0ustar hornikusers\name{fiber} \alias{fiber} \docType{data} \title{ Fiber data } \description{ Fiber data from Montgomery Design (8th ed.), p.656 (Table 15.10). Useful as a simple analysis-of-covariance example. } \usage{fiber} \format{ A data frame with 15 observations on the following 3 variables. \describe{ \item{\code{machine}}{a factor with levels \code{A} \code{B} \code{C}. The primary factor of interest.} \item{\code{strength}}{a numeric vector. The response variable.} \item{\code{diameter}}{a numeric vector. A covariate.} } } \details{ The goal of the experiment is to compare the mean breaking strength of fibers produced by the three machines. When testing this, the technician also measured the diameter of each fiber, and this measurement may be used as a concomitant variable to improve precision of the estimates. } \source{ Montgomery, D. C. (2013) \emph{Design and Analysis of Experiments} (8th ed.). John Wiley and Sons, ISBN 978-1-118-14692-7. } \examples{ require(lsmeans) fiber.lm <- lm(strength ~ diameter + machine, data=fiber) ref.grid(fiber.lm) # Covariate-adjusted means and comparisons lsmeans(fiber.lm, pairwise ~ machine) } \keyword{datasets} lsmeans/man/glht.Rd0000644000175100001440000000526712634421507013750 0ustar hornikusers\name{glht} \alias{glht} \alias{lsm} \alias{glht.ref.grid} \alias{as.glht} \alias{as.glht.ref.grid} \alias{as.glht.lsm.list} \alias{summary.glht.list} \alias{pmm} %- Also NEED an '\alias' for EACH other topic documented here. \title{ \pkg{lsmeans} support for \code{glht} } \description{ These functions and methods provide an interface between \pkg{lsmeans} and the \code{\link[multcomp]{glht}} function for simultaneous inference in the \pkg{multcomp} package. } \usage{ \method{as.glht}{ref.grid}(object, ...) \method{as.glht}{lsm.list}(object, ..., which = 1) \method{summary}{glht.list}(object, ...) lsm(...) pmm(...) } \arguments{ \item{object}{ An object of the required class. } \item{which}{Numeric index of which element of the \code{lsm.list} to use.} \item{\dots}{ Additional arguuments to other methods. } } \details{ \code{lsm} (and \code{pmm}, which is identical) are meant to be called only \emph{from} \code{"glht"} as its second (\code{linfct}) argument. It works similarly to \code{\link[multcomp]{mcp}} except with \code{specs} (and optionally \code{by} and \code{contr} arguments) provided as in a call to \code{\link{lsmeans}} or \code{pmmeans}. When there is a non-\code{NULL} \code{by} variable (either explicitly or implicitly), each ``by'' group is passed separately to \code{glht} and returned as a \code{list} of \code{"glht"} objects. For convenience, this is classed as \code{"glht.list"} and a \code{summary} method is provided. } \value{ \code{as.glht} returns an object of class \code{\link[multcomp]{glht}}, or of class \code{glht.list} if \code{by} is non-\code{NULL}. The latter is simply a list of \code{glht} objects but it has its own \code{summary} method which returns a list of \code{summary.glht} objects. } %\references{} \author{ Russell V. Lenth } \note{ There is also a \code{glht} method for class \code{ref.grid}, but it is far preferable to use \code{as.glht} instead, as its \code{model} argument is redundant. } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{lsmeans}}, \code{\link[multcomp]{glht}} } \examples{ require(lsmeans) require(multcomp) warp.lm <- lm(breaks ~ wool*tension, data = warpbreaks) # Using 'lsm' summary(glht(warp.lm, lsm(pairwise ~ tension | wool))) # Same, but using an existing 'lsmeans' result warp.lsmobj <- lsmeans(warp.lm, ~ tension | wool) summary(as.glht(pairs(warp.lsmobj))) # Same contrasts, but treat as one family summary(as.glht(pairs(warp.lsmobj), by = NULL)) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ regression } \keyword{ models } \keyword{ htest } lsmeans/man/cld.Rd0000644000175100001440000000637112634421507013551 0ustar hornikusers\name{cld} \alias{cld} \alias{cld.ref.grid} \alias{cld.lsm.list} \title{Compact letter display of pairwise comparisons} \description{ Extract and display information on all pairwise comparisons of least-squares means.} \usage{ \method{cld}{ref.grid}(object, details = FALSE, sort = TRUE, by, alpha = 0.05, Letters = c("1234567890", LETTERS, letters), ...) \method{cld}{lsm.list}(object, ..., which = 1) } \arguments{ \item{object}{An object of class \code{ref.grid}} \item{details}{Logical value determining whether detailed information on tests of pairwise comparisons is displayed} \item{sort}{Logical value determining whether the LS means are sorted before the comparisons are produced} \item{by}{Character value giving the name or names of variables by which separate families of comparisons are tested. If \code{NULL}, all means are compared. If missing, and a \code{by} variable was used in creating \code{object}, it is used as the \code{by} variable in \code{cld}.} \item{alpha}{Numeric value giving the significance level for the comparisons} \item{Letters}{Character vector of letters to use in the display. Any strings of length greater than 1 are expanded into individual characters} \item{\dots}{Arguments passed to \code{\link{contrast}} (for example, an \code{adjust} method)} \item{which}{When \code{object} is a list, this determines which element is analyzed.} } \details{ This function uses the Piepho (2004) algorithm (as implemented in the \pkg{multcompView} package) to generate a compact letter display of all pairwise comparisons of least-squares means. The function obtains (possibly adjusted) \emph{P} values for all pairwise comparisons of means, using the \code{\link{contrast}} function with \code{method = "pairwise"}. When a \code{P} value exceeds \code{alpha}, then the two means have at least one letter in common. } \value{ When \code{details == FALSE}, an object of class \code{summary.ref.grid} (which inherits from \code{data.frame}) showing the summary of LS means with an added column named \code{.groups} with the cld information. When \code{details == TRUE}, a list the object just described, as well as the summary of the \code{contrast} results showing each comparison, its estimate, standard error, \eqn{t} ratio, and adjusted \eqn{P} value. } \references{ Hans-Peter Piepho (2004) An algorithm for a letter-based representation of all pairwise comparisons, \emph{Journal of Computational and Graphical Statistics}, 13(2), 456-466. } \author{Russell V. Lenth} \note{This function requires the \pkg{multcompView} package to be installed. Otherwise an error message is produced.} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link[multcomp]{cld}} in the \pkg{multcomp} package } \examples{ warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) warp.lsm <- lsmeans(warp.lm, ~ tension | wool) cld(warp.lsm) # implicitly uses by = "wool" cld(warp.lsm, by = "tension") # overrides implicit 'by' # Mimic grouping bars and compare all 6 means cld(warp.lsm, by = NULL, Letters = "||||||||", alpha = .01) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ htest } lsmeans/man/contrast.Rd0000644000175100001440000001525212634421507014642 0ustar hornikusers\name{contrast} \alias{contrast} \alias{contrast.ref.grid} \alias{contrast.lsm.list} \alias{test} \alias{test.ref.grid} \alias{confint} \alias{confint.ref.grid} \alias{pairs} \alias{pairs.ref.grid} \title{ Methods for obtaining analyses \code{ref.grid} and \code{lsmobj} objects } \description{ These methods provide for analyses of \code{ref.grid} objects, or follow-up analyses of \code{lsmobj} objects: Contrasts, pairwise comparisons, tests, and confidence intervals. } \usage{ \method{contrast}{ref.grid}(object, method = "eff", by, adjust, offset = NULL, name = "contrast", options = getOption("lsmeans")$contrast, ...) \method{contrast}{lsm.list}(object, ..., which = 1) \method{test}{ref.grid}(object, null = 0, joint = FALSE, verbose = FALSE, rows, by, ...) \method{confint}{ref.grid}(object, parm, level = 0.95, ...) \method{pairs}{ref.grid}(x, reverse = FALSE, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object, x}{ An object of class \code{"ref.grid"} or its extension, \code{"lsmobj"}. } \item{method}{ Character value giving the root name of a contast method (e.g. \code{"pairwise"}). Alternatively, a named list of contrast coefficients that must each conform to the number of least-squares means in each \code{by} group. This is just like the \code{contr} argument in \code{\link{lsmeans}}. To identify the available methods, see \preformatted{ls("package:lsmeans", pat=".lsmc")} You may define your own \code{.lsmc} function and use its root name as \code{method}. } \item{by}{ Character names of variable(s) to be used for ``by'' groups. The contrasts or joint tests will be evaluated separately for each combination of these variables. If \code{object} was created with by groups, those are used unless overridden. Use \code{by = NULL} to use no by groups at all. } \item{adjust}{ Method to use for adjusting \emph{P} values. This is passed to \code{\link[lsmeans]{summary}}. } \item{offset}{Numeric vector of the same length as each \code{by} group. These values are added to their respective linear estimates. } \item{name}{Name to use to label the contrasts in table headings or subsequent contrasts of the returned object. } \item{options}{If non-\code{NULL}, a named \code{list} of arguments to pass to \code{\link{update}}, just after the object is constructed.} \item{joint}{Logical value. If \code{FALSE}, the arguments are passed to \code{\link{summary}} with \code{infer=c(FALSE,TRUE)}. If \code{TRUE}, a joint test of the hypothesis L beta = null is performed, where L is \code{object@linfct} and beta is the vector of fixed effects estimated by \code{object@betahat}. This will be either an \emph{F} test or a chi-square (Wald) test depending on whether degrees of freedom are available.} \item{rows}{Integer values. The rows of L to be tested in the joint test. If missing, all rows of L are used. If not missing, \code{by} variables are ignored.} \item{null}{Numeric value specifying the null value(s) being tested against. It may be either a single value, in which case it is used as the null value for all linear functions under test; or a numeric vector of length equal to the number of linear functions.} \item{parm}{This is ignored, but it is a required argument of the generic \code{confint} method.)} \item{verbose}{Logical value. If \code{TRUE} and \code{joint==TRUE}, a table of the effects being tested is printed.} \item{level}{ Numeric value of the desired confidence level.} \item{which}{When \code{object} is a list of \code{lsmobj} objects, this specifies which member of the list is analyzed.} \item{reverse}{Logical value determining whether \code{"pairwise"} or \code{"revpairwise"} pairwise comparisons are generated.} \item{\dots}{ Additional arguments passed to \code{\link[lsmeans]{summary}} or to a contrast function.} } \details{ Though \code{contrast} is ordinarily used to create true contrasts (whose coefficients sum to zero), it may be used to estimate any linear function of the LS means; and \code{offset} expands this capability further by allowing additive constants. \code{pairs} is equivalent to \code{contrast} with \code{method = "pairwise"}. \code{confint} and \code{test} (when \code{JOINT==FALSE}) are equivalent to calling \code{\link[lsmeans]{summary}} with \code{infer=c(TRUE,FALSE)} and \code{infer=c(FALSE,TRUE)}, respectively. When using \code{test} to do a joint test of L beta = null, an error is thrown if any row of L is non-estimable. It is permissible for the rows of L to be linearly dependent as long as \code{null == 0}; a reduced set of contrasts is tested. Linear dependence and nonzero \code{null} cause an error. } \value{ \code{contrast} and \code{pairs} return an object of class \code{"lsmobj"}, which is an extension of \code{"ref.grid"}. Consequently, they may be used as arguments to other \code{"lsmobj"} or \code{"ref.grid"} methods. The user may, for example, compute contrasts of contrasts, or re-summarize a set of confidence intervals with a different \code{by} grouping or confidence level. The ``grid'' for the returned value is simply the set of variables that identify the results. For example, \code{contrast}'s return value is a reference grid for one factor named \code{contrast}. \code{confint} and \code{test} (when \code{Joint==FALSE}) return an object of class \code{summary.ref.grid}. When \code{JOINT==TRUE}, \code{test} returns a numeric vector with the test statistic, degrees of freedom, and \emph{P} value. } %\references{} \author{ Russell V. Lenth } %\note{} %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ Additional \code{"lsmobj"} methods having their own help pages are \code{\link[lsmeans]{cld}} and \code{\link[lsmeans]{glht}}. Also, the \code{\link[lsmeans]{summary}} and other methods for \code{"ref.grid"} objects also work for \code{"lsmobj"} objects. } \examples{ require(lsmeans) warp.lm <- lm(breaks ~ wool*tension, data = warpbreaks) warp.lsm <- lsmeans(warp.lm, ~ tension | wool) # Polynomial contrasts of tension, by wool (warp.pl <- contrast(warp.lsm, "poly", name = "order")) # Same results with a different adjustment summary(warp.pl, adjust = "fdr") # Jointly test the tension effects for each wool test(warp.pl, joint = TRUE, by = "wool") # Compare the two contrasts for each order contrast(warp.pl, "revpairwise", by = "order") # User-provided contrasts, ignoring the previous by grouping contrast(warp.lsm, list(c1=c(1,0,0,-1,0,0), c2=c(1,1,1,-1,-1,-1)/3), by = NULL) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ models } \keyword{ regression } \keyword{ htest } lsmeans/man/MOats.Rd0000644000175100001440000000307112634421507014024 0ustar hornikusers\name{MOats} \alias{MOats} \docType{data} \title{ Oats data in multivariate form } \description{ This is the \code{Oats} dataset provided in the \pkg{nlme} package, but it is rearranged as one multivariate observation per plot. } \usage{data(MOats)} \format{ A data frame with 18 observations on the following 3 variables. \describe{ \item{\code{Variety}}{a factor with levels \code{Golden Rain}, \code{Marvellous}, \code{Victory}} \item{\code{Block}}{an ordered factor with levels \code{VI} < \code{V} < \code{III} < \code{IV} < \code{II} < \code{I}} \item{\code{yield}}{a matrix with 4 columns, giving the yields with nitrogen concentrations of 0, .2, .4, and .6.} } } \details{ These data arise from a split-plot experiment reported by Yates (1935) and used as an example in Pinheiro and Bates (2000) and other texts. Six blocks were divided into three whole plots, randomly assigned to the three varieties of oats. The whole plots were each divided into 4 split plots and randomized to the four concentrations of nitrogen. } \source{ The dataset \code{\link[nlme]{Oats}} in the \pkg{nlme} package. } \references{ Pinheiro, J. C. and Bates D. M. (2000) \emph{Mixed-Effects Models in S and S-PLUS}, Springer, New York. (Appendix A.15) Yates, F. (1935) Complex experiments, \emph{Journal of the Royal Statistical Society} Suppl. 2, 181-247 } \examples{ require(lsmeans) MOats.lm <- lm (yield ~ Block + Variety, data = MOats) MOats.rg <- ref.grid (MOats.lm, mult.name = "nitro") lsmeans(MOats.rg, ~ nitro | Variety) } \keyword{datasets} lsmeans/man/summary.Rd0000644000175100001440000004172512634421507014506 0ustar hornikusers\name{summary} \alias{summary} \alias{summary.ref.grid} \alias{str.ref.grid} \alias{predict.ref.grid} \alias{print.ref.grid} \alias{print.summary.ref.grid} \alias{plot.lsmobj} \alias{plot.summary.ref.grid} \alias{vcov.ref.grid} \alias{regrid} \alias{rbind} \alias{rbind.ref.grid} \alias{as.mcmc} \alias{as.mcmc.ref.grid} \alias{[.ref.grid} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Methods for \code{ref.grid} objects } \description{ Use these methods to summarize, print, plot, or examine objects of class \code{"ref.grid"}. They also apply to the class \code{"lsmobj"}, which is an extension of \code{"ref.grid"}. } \usage{ \method{summary}{ref.grid}(object, infer, level, adjust, by, type, df, null = 0, delta = 0, side = 0, ...) \method{predict}{ref.grid}(object, type, ...) \method{str}{ref.grid}(object, ...) \method{rbind}{ref.grid}(..., deparse.level = 1, adjust = "mvt") \method{[}{ref.grid}(x, i, adjust = "mvt", ...) \method{print}{ref.grid}(x, ...) \method{print}{summary.ref.grid}(x, ..., digits = NULL, quote = FALSE, right = TRUE) \method{plot}{lsmobj}(x, y, type, intervals = TRUE, comparisons = FALSE, alpha = 0.05, adjust = "tukey", int.adjust, ...) \method{plot}{summary.ref.grid}(x, y, horizontal = TRUE, xlab, ylab, layout, ...) \method{vcov}{ref.grid}(object, ...) regrid (object, transform = TRUE) \method{as.mcmc}{ref.grid}(x, names = TRUE, ...) } \arguments{ \item{object}{ An object of class \code{"ref.grid"}. } \item{infer}{ A vector of two logical values. The first determines whether confidence intervals are displayed, and the second determines whether \emph{t} tests and \emph{P} values are displayed. If only one value is provided, it is used for both. } \item{level}{ Confidence level for confidence intervals, if \code{infer[1]} is \code{TRUE}. } \item{adjust}{ Character value naming the method used to adjust \eqn{p} values or confidence limits; or to adjust comparison arrows in \code{plot}. See Details. } \item{by}{ Character name(s) of variables to use for grouping. This affects the family of tests considered in adjusted \emph{P} values. The printed display of the summary is grouped by the \code{by} variables. } \item{type}{ Type of prediction desired. This only has an effect if there is a known transformation or link function. \code{"response"} specifies that the inverse transformation be applied. Other valid values are \code{"link"}, \code{"lp"}, and \code{"linear"}; these are equivalent, and request that results be shown for the linear predictor. The default is \code{"link"}, unless the \code{"predict.type"} option is in force; see \code{\link{lsm.options}}. } \item{df}{ If non-missing a constant number of degrees of freedom to use in constructing confidence intervals and \emph{P} values (\code{NA} specifies asymptotic results). } \item{null}{Null hypothesis value(s) against which estimates are tested. May be a single value used for all, or a numeric vector of length equal to the number of tests in each family (i.e., \code{by} group in the displayed table).} \item{delta}{Numeric value. If zero, ordinary tests of significance are performed. If positive, this specifies a threshold for testing equivalence (using the TOST or two-one-sided-test method), non-inferiority, or non-superiority, depending on \code{side}. See Details for how the test statistics are defined.} \item{side}{Numeric or character value specifying whether the test is left-tailed (\code{-1}, \code{"-"}, code{"<"}, \code{"left"}, or \code{"nonsuperiority"}); right-tailed (\code{1}, \code{"+"}, \code{">"}, \code{"right"}, or \code{"noninferiority"}); or two-sided (\code{0}, \code{2}, \code{"!="}, \code{"two-sided"}, \code{"both"}, \code{"equivalence"}, or \code{"="}).} \item{deparse.level}{This argument is needed by the generic \code{rbind} method, but ignored by its \code{ref.grid} method.} \item{x}{ The object to be subsetted, printed, plotted, or converted. } \item{y}{This argument is ignored.} \item{i}{Integer index(es) of which linear functions to extract.} \item{horizontal}{Determines orientation of plotted confidence intervals.} \item{intervals}{If \code{TRUE}, confidence intervals are plotted for each estimate} \item{comparisons}{If \code{TRUE}, \dQuote{comparison arrows} are added to the plot, in such a way that the degree to which arrows overlap reflects as much as possible the significance of the comparison of the two estimates.} \item{alpha}{The \code{alpha} argument to use in constructing comparison arrows.} \item{int.adjust}{the multiplicity adjustment method for the plotted confidence intervals; if missing, it defaults to the object's internal \code{adjust} setting (see \code{\link{update}}). (Note: the \code{adjust} argument in \code{plot} sets the adjust method for the comparison arrows, not the confidennce intervals.)} \item{transform}{Logical value; if true, the inverse transformation is applied to the estimates in the grid} \item{names}{Logical scalar or vector specifying whether variable names are appended to levels in the column labels for the \code{as.mcmc} result -- e.g., column names of \code{treat A} and \code{treat B} versus just \code{A} and \code{B}. When there is more than one variable involved, the elements of \code{names} are used cyclically.} \item{\dots, digits, quote, right, xlab, ylab, layout}{For summaries, these are additional arguments passed to other methods including \code{\link{print.data.frame}}, \code{\link{update}}, or \code{\link{dotplot}} as appropriate. If not specified, appropriate defaults are used. For example, the default \code{layout} is one column of horizontal panels or one row of vertical panels.} } \details{ \bold{Defaults:} The \code{misc} slot in \code{object} contains default values for \code{by}, \code{infer}, \code{level}, \code{adjust}, and \code{type}. These defaults vary depending on the code that created the object. The \code{\link{update}} method may be used to change these defaults. In addition, any options set using \samp{lsm.options(summary=...)} will trump those stored in the object's \code{misc} slot. \bold{Transformations and links:} With \code{type="response"}, the transformation assumed can be found in \samp{object@misc$tran}, and its label, for the summary is in \samp{object@misc$inv.lbl}. At this time, \code{tran} must be one of the named transformations valid for \code{\link{make.link}}. Any \eqn{t} or \eqn{z} tests are still performed on the scale of the linear predictor, not the inverse-transformed one. Similarly, confidence intervals are computed on the linear-predictor scale, then inverse-transformed. \bold{Confidence-limit and P-value adjustments:} The \code{adjust} argument specifies a multiplicity adjustment for tests or confidence intervals. This adjustment always is applied \emph{separately} to each table or sub-table that you see in the printed output (see the details on \code{rbind} below for how to combine tables). The valid values of \code{adjust} are as follows: \describe{ \item{\code{"tukey"}}{Uses the Studentized range distribution with the number of means in the family. (Available for two-sided cases only.)} \item{\code{"scheffe"}}{Computes \eqn{p} values from the \eqn{F} distribution, according to the Scheffe critical value of \eqn{\sqrt{kF(k,d)}}{sqrt[k*F(k,d)]}, where \eqn{d} is the error degrees of freedom and \eqn{k} is (family size minus 1) for contrasts, and (number of estimates) otherwise. (Available for two-sided cases only.)} \item{\code{"sidak"}}{Makes adjustments as if the estimates were independent (a conservative adjustment in many cases).} \item{\code{"bonferroni"}}{Multiplies \eqn{p} values, or divides significance levels by the number of estimates. This is a conservative adjustment.} \item{\code{"dunnettx"}}{Uses an approximation to the Dunnett distribution for a family of estimates having pairwise correlations of \eqn{0.5} (as is true when comparing treatments with a control with equal sample sizes). The accuracy of the approximation improves with the number of simultaneous estimates, and is much faster than \code{"mvt"}. (Available for two-sided cases only.)} \item{\code{"mvt"}}{Uses the multivariate \eqn{t} distribution to assess the probability or critical value for the maximum of \eqn{k} estimates. This method produces the same \eqn{p} values and intervals as the default \code{summary} or \code{confint} methods to the results of \code{\link{as.glht}}. In the context of pairwise comparisons or comparisons with a control, this produces \dQuote{exact} Tukey or Dunnett adjustments, respectively. However, the algorithm (from the \pkg{mvtnorm} package) uses a Monte Carlo method, so results are not exactly repeatable unless the random-number seed is used (see \code{\link[base]{set.seed}}). As the family size increases, the required computation time will become noticeable or even intolerable, making the \code{"tukey"}, \code{"dunnettx"}, or others more attractive.} \item{\code{"none"}}{Makes no adjustments to the \eqn{p} values.} } % end \describe {} For P-value adjustments only, the other Bonferroni-inequality-based adjustment methods in \code{\link{p.adjust}} are also available. If a \code{p.adjust.methods} method is specified for confidence limits, they are left unadjusted and an annotation is added that says so. Also, if an adjustment method is not appropriate (e.g., using \code{"tukey"} with one-sided tests, or with results that are not pairwise comparisons), a more appropriate method (usually \code{"sidak"}) is substituted. In some cases, confidence and \eqn{p}-value adjustments are only approximate -- especially when the degrees of freedom or standard errors vary greatly within the family of tests. The \code{"mvt"} method is always the correct one-step adjustment, but it can be very slow. One may use \code{\link{as.glht}} with methods in the \pkg{multcomp} package to obtain non-conservative multi-step adjustments to tests. \bold{\code{rbind} and \code{[} methods:} \code{rbind} can be used to combine two or more reference grids into one. The \code{"["} method for \code{ref.grid}s may be used to obtain a subset. The primary reason for doing this would be to redefine the family of tests to which a P-value adjustment method applies. In \code{rbind}, the variables defined in the objects' grids are merged into one grid, and the returned object has no \dQuote{by} variables and the multiplicity adjustment method set to \code{"mvt"} (as this is likely the only appropriate one). \code{rbind} throws an error if there are any mismatches among the dimensions, fixed-effect coefficients, or covariance matrices. \bold{Non-estimable cases:} When the model is rank-deficient, each row \code{x} of \code{object}'s \code{linfct} slot is each checked for estimability. If \code{sum(x*bhat)} is found to be non-estimable, then an \code{NA} is displayed for the estimate (as well as any associated statistics). This check is performed using the orthonormal basis \code{N} in the \code{nbasis} slot for the null space of the rows of the model matrix. Estimability fails when \eqn{||Nx||^2 / ||x||^2} exceeds \code{tol}, which by default is \code{1e-8}. You may change it via \code{\link{lsm.options}} by setting \code{estble.tol} to the desired value. \bold{More on tests:} When \code{delta = 0}, test statistics are of the usual form \samp{(estimate - null)/SE}, or notationally, \eqn{t = (Q - \theta_0)/SE} where \eqn{Q} is our estimate of \eqn{\theta}; then left, right, or two-sided \eqn{p} values are produced. When \code{delta} is positive, the test statistic depends on \code{side} as follows. Left-sided (nonsuperiority, \eqn{H_0: \theta \ge \theta_0 + \delta} versus \eqn{H_1: \theta < \theta_0 + \delta}): \eqn{t = (Q - \theta_0 - \delta)/SE}. The \eqn{p} value is the lower-tail probability. Right-sided (noninferiority): \eqn{H_0: \theta \le \theta_0 - \delta} versus \eqn{H_1: \theta > \theta_0 - \delta}): \eqn{t = (Q - \theta_0 + \delta)/SE}. The \eqn{p} value is the upper-tail probability. Two-sided (equivalence): \eqn{H_0: |\theta - \theta_0| \ge \delta} versus \eqn{H_1: |\theta - \theta_0| < \delta}): \eqn{t = (|Q - \theta_0| - \delta)/SE}. The \eqn{p} value is the \emph{lower}-tail probability. \bold{Plots:} The \code{plot} method for \code{"lsmobj"} or \code{"summary.ref.grid"} objects (but not \code{"ref.grid"} objects themselves) produces a plot displaying confidence intervals for the estimates. If any \code{by} variables are in force, the plot is divided into separate panels. These functions use the \code{\link[lattice]{dotplot}} function, and thus require that the \pkg{lattice} package be installed. For \code{"summary.ref.grid"} objects, the \code{\dots} arguments in \code{plot} are passed \emph{only} to \code{dotplot}, whereas for \code{"lsmobj"} objects, the object is updated using \code{\dots} before summarizing and plotting. In plots with \code{comparisons = TRUE}, the resulting arrows are only approximate, and in some cases may fail to accurately reflect the pairwise comparisons of the estimates -- especially when estimates having large and small standard errors are intermingled in just the wrong way. \bold{Re-gridding:} The \code{regrid} function reparameterizes an existing \code{ref.grid} so that its \code{linfct} slot is the identity matrix and its \code{bhat} slot consists of the estimates at the grid points. If \code{transform} is \code{TRUE}, the inverse transform is applied to the estimates. Outwardly, the \code{summary} after applying \code{regrid} is identical to what it was before (using \samp{type="response"} if \code{transform} is \code{TRUE}). But subsequent contrasts will be conducted on the transformed scale -- which is the reason this function exists. See the example below. In cases where the degrees of freedom depended on the linear function being estimated, the d.f. from the reference grid are saved, and a kind of \dQuote{containment} method is substituted in the returned object whereby the calculated d.f. for a new linear function will be the minimum d.f. among those having nonzero coefficients. This is kind of an \emph{ad hoc} method, and it can over-estimate the degrees of freedom in some cases. \bold{MCMC samplers:} When the object's \code{post.beta} slot is non-trivial, \code{as.mcmc} will return an \code{\link[coda]{mcmc}} object that can be summarized or plotted using methods in the \pkg{coda} package. Specifically, \code{post.beta} is transformed by post-multiplying by \code{t(linfct)}, creating a sample from the posterior distribution of LS means. } \value{ The \code{summary} method for \code{"ref.grid"} objects returns an object of class \code{"summary.ref.grid"}, which extends \code{"data.frame"}. \code{plot} returns an object of class \code{"trellis"}. \code{vcov} returns the covariance matrix of the product of the object's \code{linfct} and \code{bhat} slots. \code{as.mcmc} returns a \pkg{coda} \code{mcmc} object. } %%\references{} \author{ Russell V. Lenth } %\note{} \seealso{ Methods for the closely related \code{"lsmobj"} class can be found in \code{\link[lsmeans]{contrast}}, \code{\link[lsmeans]{cld}}, and \code{\link[lsmeans]{glht}}. Also, \code{\link{test}} and \code{\link{confint}} are essentially front-ends for \code{summary}, so additional examples may be found there. } \examples{ require(lsmeans) warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) warp.rg <- ref.grid(warp.lm) str(warp.rg) summary(warp.rg) summary(warp.rg, by = "wool", infer = c(TRUE, FALSE), level = .90, adjust = "sidak") # Do all pairwise comparisons within rows or within columns, # all considered as one faily of tests: w.t <- pairs(lsmeans(warp.rg, ~ wool | tension)) t.w <- pairs(lsmeans(warp.rg, ~ tension | wool)) rbind(w.t, t.w) # Transformed response sqwarp.rg <- ref.grid(update(warp.lm, sqrt(breaks) ~ .)) summary(sqwarp.rg) # Back-transformed results - compare with summary of 'warp.rg' summary(sqwarp.rg, type = "response") # But differences of sqrts can't be back-transformed summary(pairs(sqwarp.rg, by = "wool"), type = "response") # We can do it via regrid sqwarp.rg2 <- regrid(sqwarp.rg) summary(sqwarp.rg2) # same as for sqwarp.rg with type = "response" pairs(sqwarp.rg2, by = "wool") # Logistic regression # Reshape the Titanic data Titan <- do.call("expand.grid", dimnames(Titanic)[-4]) Titan$Died <- matrix(Titanic, ncol=2) Titan.glm <- glm(Died ~ (Class + Sex + Age)^2, family = binomial, data = Titan) Titan.lsm <- lsmeans(Titan.glm, ~ Class|Sex, at = list(Age="Adult")) summary(Titan.lsm, type="response") summary(pairs(Titan.lsm), type="response") # Nonsuperiority test: Is any class no more likely to die than # the 1st class passengers? summary(contrast(Titan.lsm, "trt.vs.ctrl1"), delta = 1, adjust = "none", side = "<") # Plot 90% CIs on the response scale plot(Titan.lsm, type = "response", level = .90, xlab = "Predicted probability of drowning") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ models } \keyword{ htest } lsmeans/man/nutrition.Rd0000644000175100001440000000341512634421507015036 0ustar hornikusers\name{nutrition} \alias{nutrition} \docType{data} \title{ Nutrition data } \description{ This observational dataset involves three factors, but where several factor combinations are missing. It is used as a case study in Milliken and Johnson, Chapter 17, p.202. (You may also find it in the second edition, p.278.) } \usage{nutrition} \format{ A data frame with 107 observations on the following 4 variables. \describe{ \item{\code{age}}{a factor with levels \code{1}, \code{2}, \code{3}, \code{4}. Mother's age group.} \item{\code{group}}{a factor with levels \code{FoodStamps}, \code{NoAid}. Whether or not the family receives food stamp assistance.} \item{\code{race}}{a factor with levels \code{Black}, \code{Hispanic}, \code{White}. Mother's race.} \item{\code{gain}}{a numeric vector (the response variable). Gain score (posttest minus pretest) on knowledge of nutrition.} } } \details{ A survey was conducted by home economists ``to study how much lower-socioeconomic-level mothers knew about nutrition and to judge the effect of a training program designed to increase therir knowledge of nutrition.'' This is a messy dataset with several empty cells. } \source{ Milliken, G. A. and Johnson, D. E. (1984) \emph{Analysis of Messy Data -- Volume I: Designed Experiments}. Van Nostrand, ISBN 0-534-02713-7. } \examples{ require(lsmeans) nutr.aov <- aov(gain ~ (group + age + race)^2, data = nutrition) # Summarize predictions for age group 3 nutr.lsm <- lsmeans(nutr.aov, ~ race * group, at = list(age="3")) lsmip(nutr.lsm, race ~ group) # Hispanics seem exceptional; but, this doesn't test out due to very sparse data cld(nutr.lsm, by = "group") cld(nutr.lsm, by = "race") } \keyword{datasets} lsmeans/man/auto.noise.Rd0000644000175100001440000000405412634421507015067 0ustar hornikusers\name{auto.noise} \alias{auto.noise} \docType{data} \title{Auto Pollution Filter Noise} \description{Three-factor experiment comparing pollution-filter noise for two filters, three sizes of cars, and two sides of the car.} \usage{auto.noise} \format{ A data frame with 36 observations on the following 4 variables. \describe{ \item{\code{noise}}{Noise level in decibels - a numeric vector.} \item{\code{size}}{The size of the vehicle - an ordered factor with levels \code{S}, \code{M}, \code{L}.} \item{\code{type}}{Type of anti-pollution filter - a factor with levels \code{Std} and \code{Octel}} \item{\code{side}}{The side of the car where measurement was taken -- a factor with levels \code{L} and \code{R}.} } } \details{ The data are from a statement by Texaco, Inc., to the Air and Water Pollution Subcommittee of the Senate Public Works Committee on June 26, 1973. Mr. John McKinley, President of Texaco, cited an automobile filter developed by Associated Octel Company as effective in reducing pollution. However, questions had been raised about the effects of filters on vehicle performance, fuel consumption, exhaust gas back pressure, and silencing. On the last question, he referred to the data included here as evidence that the silencing properties of the Octel filter were at least equal to those of standard silencers.} \source{The dataset was imported from the Data and Story Library - \url{http://lib.stat.cmu.edu/DASL/Datafiles/airpullutionfiltersdat.html} (sic). However, the factor levels were assigned meaningful names, and the observations were sorted in random order as if this were the run order of the experiment. } \references{ A.Y. Lewin and M.F. Shakun (1976) \emph{Policy Sciences: Methodology and Cases}. Pergammon Press. p.313. } \examples{ require(lsmeans) noise.lm <- lm(noise ~ size * type * side, data = auto.noise) # Interaction plot of predictions lsmip(noise.lm, type ~ size | side) # Confidence intervals plot(lsmeans(noise.lm, ~ size | side*type)) } \keyword{datasets} lsmeans/man/lsmip.Rd0000644000175100001440000001023612634421507014126 0ustar hornikusers\name{lsmip} \alias{lsmip} \alias{lsmip.default} \alias{pmmip} \title{ Least-squares (predicted marginal) means interaction plot } \description{ This function creates an interaction plot of the least-squares means based on a fitted model and a simple formula specification. } \usage{ \method{lsmip}{default}(object, formula, type, pch = c(1,2,6,7,9,10,15:20), lty = 1, col = NULL, plotit = TRUE, ...) pmmip(...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ An object of class \code{lsmobj}, or a fitted model of a class supported by \code{\link{lsmeans}}. } \item{formula}{ Formula of the form \code{trace.factors ~ x.factors | by.factors}. The least-squares means are plotted against \code{x.factor} for each level of \code{trace.factors}. \code{by.factors} is optional, but if present, it determines separate panels. Each element of this formula may be a single factor in the model, or a combination of factors using the \code{*} operator. } \item{type}{ As in \code{\link[=predict.ref.grid]{predict}}, this determines whether we want to inverse-transform the predictions (\samp{type="response"}) or not (any other choice). The default is \code{"link"}, unless the \code{"predict.type"} option is in force; see \code{\link{lsm.options}}. } \item{pch}{ The plotting characters to use for each group (i.e., levels of \code{trace.factors}). They are recycled as needed. } \item{lty}{ The line types to use for each group. Recycled as needed. } \item{col}{ The colors to use for each group, recycled as needed. If not specified, the default trellis colors are used. } \item{plotit}{ If \code{TRUE}, the plot is displayed. Otherwise, one may use the \code{"lattice"} attribute of the returned object and print it, perhaps after additional manipulation. } \item{\dots}{ Additional arguments passed to \code{\link{lsmeans}} or to \code{\link[lattice]{xyplot}}. } } \details{ If \code{object} is a fitted model, \code{\link{lsmeans}} is called with an appropriate specification to obtain least-squares means for each combination of the factors present in \code{formula} (in addition, any arguments in \code{\dots} that match \code{at}, \code{trend}, \code{cov.reduce}, or \code{fac.reduce} are passed to \code{lsmeans}). Otherwise, if \code{object} is an \code{lsmobj} object, its first element is used, and it must contain one \code{lsmean} value for each combination of the factors present in \code{formula}. The wrapper \code{pmmip} is provided for those who prefer the term \sQuote{predicted marginal means}. } \value{ (Invisibly), a \code{\link{data.frame}} with the table of least-squares means that were plotted, with an additional \code{"lattice"} attribute containing the \code{trellis} object for the plot. } \author{ Russell V. Lenth } \note{ This function uses the \code{\link[lattice]{xyplot}} function in the \code{lattice} package (an error is returned if \code{lattice} is not installed). Conceptually, it is equivalent to \code{\link{interaction.plot}} where the summarization function is the least-squares means. } \seealso{ \code{\link{interaction.plot}} } \examples{ require(lsmeans) require(lattice) #--- Two-factor example warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) # Following plot is the same as the usual interaction plot of the data lsmip(warp.lm, wool ~ tension) #--- Three-factor example noise.lm = lm(noise ~ size * type * side, data = auto.noise) # Separate interaction plots of size by type, for each side lsmip(noise.lm, type ~ size | side) # One interaction plot, using combinations of size and side as the x factor lsmip(noise.lm, type ~ side * size) # One interaction plot using combinations of type and side as the trace factor # customize the colors, line types, and symbols to suggest these combinations lsmip(noise.lm, type * side ~ size, lty=1:2, col=1:2, pch=c(1,1,2,2)) # 3-way interaction is significant, but doesn't make a lot of visual difference... noise.lm2 = update(noise.lm, . ~ . - size:type:side) lsmip(noise.lm2, type * side ~ size, lty=1:2, col=1:2, pch=c(1,1,2,2)) } \keyword{ models } \keyword{ regression }