flexmix/0000755000175100001440000000000013741010604011740 5ustar hornikusersflexmix/NAMESPACE0000644000175100001440000000775113673623016013204 0ustar hornikusersimportFrom("graphics", "hist", "lines", "matplot", "plot", "points", "text") importFrom("grid", "gpar", "grid.lines", "grid.polygon", "unit") importFrom("grDevices", "axisTicks", "hcl", "rgb") importFrom("lattice", "barchart", "do.breaks", "histogram", "lattice.getOption", "llines", "panel.abline", "panel.barchart", "panel.rect", "panel.segments", "panel.xyplot", "parallelplot", "trellis.par.get", "xyplot") import("methods") importFrom("modeltools", "clusters", "getModel", "ICL", "KLdiv", "Lapply", "parameters", "posterior", "prior", "refit", "relabel") importFrom("nnet", "multinom", "nnet.default") importFrom("stats", "AIC", "as.formula", "BIC", "binomial", ".checkMFClasses", "coef", "cov.wt", "dbinom", "delete.response", "dexp", "dgamma", "dlnorm", "dnorm", "dpois", "dweibull", "factanal", "Gamma", ".getXlevels", "glm.fit", "lm.wfit", "model.frame", "model.matrix", "model.response", "na.omit", "optim", "pnorm", "poisson", "predict", "printCoefmat", "qnorm", "quantile", "rbinom", "residuals", "rgamma", "rmultinom", "rnorm", "rpois", "runif", "terms", "update", "update.formula", "var", "weighted.mean") importFrom("stats4", "logLik", "nobs", "plot", "summary") importFrom("utils", "getS3method") export( "ExLinear", "ExNPreg", "ExNclus", "FLXdist", "FLXgradlogLikfun", "FLXlogLikfun", "FLXMCdist1", "FLXMCfactanal", "FLXMCmvbinary", "FLXMCmvcombi", "FLXMCmvnorm", "FLXMCmvpois", "FLXMCnorm1", "FLXPmultinom", "FLXPconstant", "FLXfit", "FLXglm", "FLXglmFix", "FLXbclust", "FLXmclust", "FLXconstant", "FLXmultinom", "FLXMRcondlogit", "FLXMRglm", "FLXMRglmfix", "FLXMRglmnet", "FLXMRlmer", "FLXMRlmm", "FLXMRlmmc", "FLXMRmgcv", "FLXMRmultinom", "FLXMRrobglm", "FLXMRziglm", "FLXgetDesign", "FLXgetParameters", "FLXreplaceParameters", "boot", "existGradient", "flexmix", "group", "initFlexmix", "LR_test", "plotEll", "refit_optim", "relabel", "stepFlexmix" ) exportClasses( "FLXcomponent", "FLXP", "FLXPmultinom", "FLXcontrol", "FLXdist", "FLXMRfix", "FLXMRglmfix", "FLXMRglm", "FLXMRlmer", "FLXMRlmm", "FLXMRlmmfix", "FLXMRlmmc", "FLXMRlmc", "FLXMRlmmcfix", "FLXMRlmcfix", "FLXMRmgcv", "FLXMRrobglm", "FLXMRziglm", "FLXM", "FLXMR", "FLXMC", "FLXMCsparse", "FLXnested", "FLXR", "FLXRoptim", "FLXRmstep", "flexmix", "listOrdata.frame", "stepFlexmix", "summary.flexmix" ) exportMethods( "EIC", "FLXcheckComponent", "FLXdeterminePostunscaled", "FLXfit", "FLXgetK", "FLXgetModelmatrix", "FLXgetObs", "FLXmstep", "FLXremoveComponent", "KLdiv", "ICL", "Lapply", "coerce", "clusters", "fitted", "flexmix", "getModel", "initialize", "logLik", "parameters", "plot", "posterior", "predict", "prior", "rFLXM", "refit", "relabel", "rflexmix", "show", "summary", "unique" ) S3method("as.data.frame", "simple_triplet_matrix") flexmix/data/0000755000175100001440000000000013740572351012664 5ustar hornikusersflexmix/data/NPreg.RData0000644000175100001440000001026413740572351014617 0ustar hornikuserswXT. (URE@]E{W;,%Xb#DޢXFQZA Dfvst?K<̞3sVM"V<ϘgalUMqmK4k6"gRkXprxWzNVÕgJS!m>}z3fC\; ʸmG0l~/B} KJPi]a\icYۮfh<_n8<-$+;@㗸 h޸qWURZk>5{*4>A-Jy(N{ˎqJڣq;ߢ+z~?$o3W~U>]}_)3i"qDG4Y7f-8S_z]z6g:r=Z1:+/[@nW%CydZg%\zQo4岖ϝ247:5Ih8= )2:s5l:E[z޾C6 NI.vB<OڎSQۼWvJtC;hO! Dn(@mӕh3f|)k~-6_x>q,~&-Cw^ Ġ՝mtߠѱ>/u+48|_>/䢼y~xF۔5+TZ,܏]T4]]$u5Vt6Sh\ʪ:Co+DkdvZ: }A}w(Yove[<{_r}ol 4zwOuA(?sbuZNFm~C9:z2ʳzGlcܟyofM<sҸRpSi}#. 4"B|Gh^߱3uU})\5e cdjO'ʝ8&L>Y.@Qs~$# ĭh,($:O^Em!vyt/9j;䝈3tk1`8I:٤7;prZv+\e#`_9_":؇ܧxjhvۆNn.&?]8(۪͇7zoŀ2!39&[v\^ f)4iwn, Ȳ /1P/7U-S\Ur})s6B3{C?A޷MRC -7;*"xGGc euOvCcsUKw\ZUG r~9"u4[:)ob/SD}x5gW,, 7wlQ#A mk]w "vz籍Yhf-xd$h{N-KOjY#߼rE;wu!4(:1pQnR "_s&(!JY5Ǩ$w^4Ic7R-ghuv<"267JXp+̛r!D0V dΎӔ|5'\1?ۀK˓rPA!ו<\ )'l,AWy ;wm^s̯9fu5{[vt-i3n?3Sނj@sh ވ{3uhv;]lgZCirT]]A47s{{p+pôu(|xǔ´LL||:W\g%* G_L}oħc~ gx ?;6?Y6n\qx6_2\lu'`J溡}l̾<ϣ^v ̫N7<΍7t߳yfhuyy=3gۆJC?44cq}n|O: wǗz>x>Ҽ<8 74Ss^C|OS}R?}}5*z}? 'a'k&ScXa116[8`1Ng Sqx`<1^ac`1 10Ƙ@L&#Ĉ0b#0rĄ`B1apLF`0ZL4&iiiiiii鎉cz`zbzazc`ba7?4ߙ5+"}EH"WB_Q⊱) IMDjbRd&'58D!"qCD"8D!&1qCLb8!&1qHCB8$!! qHCBR8!%)qHCJR8d!#qȈCF28d!'9qȉCNr8!'9q(CA P8ġ q(CAJP8ġ$%q(CIJP&¦Mߠ>i<7bh*WKЏS3s Z V ll u28082818302cpcpg`db0x3021ghАCCc@ `& M wAq \!/ͯQћwC ZOx~CHm}y BZ1ԡ#פIJ}ov*UiUBRZѪVJmBjRڄ&6! MHmBjRD&6MDm"jQD&61MLmbjS&61IMBmjP$&6 IMBmRjRڤ&6)IMJmRjRd&6ɨMFm2jQd&69ɩMNmrjS&69)MAm jSPԦ6)MAmJjSRڔԦ6%)MImJjωJ3OTgOˆW?R1flexmix/data/Mehta.RData0000644000175100001440000000067413740572351014646 0ustar hornikusersݒS@/ " :j0rw|XkZf0~D(GvA;3mn;׵RW%|ys:zB{C*ʤ`?U!B[\G. G<(kWSi$KjRG{Z]YW=fۜ+5Wׁ|&y#D*5 ne2$^qN% qD#c1`MR2hno6}np}u1/s'ZX@_` 0`.H Ȃz>hu~@y(%i$,yQJߟo_hb5MfbB0000000000=YyLo`flexmix/data/bioChemists.RData0000644000175100001440000000744413740572351016063 0ustar hornikusersBZh91AY&SYr=bB H@P`J_2mxmBC}>("h@4 x)mFM2li4)$*&0`F4M4i4 FC j~*zPڃ i& @h0F#FMOTHP& & i0220 A#@=C@Fh2'56O) 42h FMCMhS`%e16!^{o_M]&a%[+jY%N>qlc}>N. `B::tw2 R4 & QU2K  f`̀2&91"ֺ}~>bCS[СQvقK8:"$[[&#dLe#2 R!!$) C,hdbId*A4RIB &bYbKEgjF JhiE3BM%`DD IX3 š5wD́23"If̃(2 ̊30f`0fDgMWk-nW;|ʈ1J}Oqp@́m 0iA]༷Ky PbJ#P  )PIdSFq{"ׇ1YwX D PW$ ]7E4s2& }ݰ.I7:JD;͵:\:: qAB-w.acb""qv7#guZQM-TM| WpOa~)2#K757 mn3{78*] ߔ9GpGHq8l"#6ԟ0ZM"&=,'W.:6yT`Ά{U_Þ n^׾lݫgI" c~gs3=Bݱ_^Ֆ qhüxkx>)Rad# m{y)w*FKԳ幑DJϯN9ϧHY 4dzWuQя}eflŴ6 Ӷ5]MvZqmͯj iߑi~f:C:N.Ya➌~'g(ۀ"cl͘<*㯝\y=ܕX5Z-Ҥznf1q޷3D: I4Oaf 8tVqǔ嫋 wE;r"ll|W%GbC7G&b”8K5vma[|{6][XUӪ1OooR3%vKyQXm/ܬ ɂdLuB֔Fy4-E֣68F[EZvFǀȠ ZSc.>aamXƕe]bHN9NfuY6jq jUPiˑC[BEkb#XM:ۗY*#AU"-ޛ5ԑ+2MTf"YS5?xRZ4 =Ƿh"I@IR$& % jWͷ#8|2+1**ԻJbVT#Vl|HhIT/|.)f'Cq!L5Z5wvAQJpl䶉Z[FKFŭK78b=њt!*LLHDYymߒKUcܔ'PA@.$Giy㮕ǎ BrfQ[[`Ѷ6ڏ+O0j:|y4i9Pe%rZ)@aDF!AND*"Юr$bUBEn5*rUȦ)4# 5F"tWPF!YFTПX=YpF$ r"C+ ҩ% F @WD`А"\㦨IssZxW ز_A9 V4WYp**SvqO >z~7?kTB|~k 1[m;aNZF((w:;I5p BHNv]11 [7P:NdN`:www`ާߕmmnsfffft%NkZ0AUUUUUAUUUUUUUUUTJcKۖfffm*****vSfffqZֵkP P P P P7pֵk[ʀJJJJ33337T%@T%@T%@T%@T%M6lͥ@T%@T%@T%@T%@Tߟfs37ѕƵkZ(wwwwwwwwwwwwwwwwwwwwwwwwww>67{2:Jh͵܍s4Hpw,SI## ̰4ѫ3v"(HtDflexmix/data/dmft.RData0000644000175100001440000000413113740572351014532 0ustar hornikusersBZh91AY&SY55.Ȃ@?P(U&D4G4Mh14hj JUQIi M07SUF 4A4`4(4@ Oԩ*zQ@4 JTd4iizIAƋ!$#d57TR56ޤRvJB^٥IkDІջ\;Ms4u[i'gBtA(ݜRa=BiăhibSb%YRccQR&`g#!Gg,ff2Yqe:rnwH"IyYdtp=)΍sHIr8I[Z p^ @X) 'Iɶf֋[NV[vKlp-[oH"qqD' 㓤@҆[4^yymcB2) BcAHIDMI ([ dVF >}x\xEO }n&v`w^nYhmZ\D[d(8:+;!8NkqBֶ[g瘶lYv').ldH'ցabIM1LD6h"$H w!.P6qNGVv"#s8 @G8ELRNPwMM9ЧڱvALK01ׇ=#E)xyu!fOX5>JtӢ]R-ƓǦ,(yY' ~өv)΂ jC |O"@@A2=MQYJH Q)dfmCG7{zD5J&F #ŽCװTDDx峡jw}f`π33n"{֩%mbr尃Lcè9A`9Ah.T!A툉5BKsh/:x&fX遵ϭ @ls0`CR֚TǼ<'RCM#w {WPliO\T \3s߰^gP1zeɦK3G+x B4)EBz.i!0yU ߍ>NU@;{9|>ο?j(vI6/7~ӧN<^k_DT< (yG\Dj8G##l9i &y$SA::8l@dzgPPRkME% H l+AMQؗ& E V9Jչ]v]]UiZ]PӕEsc4!hMM-)T4(LJDb5{еMEVv4׊:&S@C}:t333333335kZUUUUUUUUUUUUUUU^<=檪5UUUUnjsUU[UV檪7uUy=G| $$ ,8jJI$I+U$VI$TIZ$RI%jJs$<޵RI%jJI$I+U$VJffej32YZw߿~0qIH$" L 6$A$ $ḼVffV뮺뮀9ffej33Z̻yI+FЪn8(UUUTI$I$I$I+www{{`B`7ێ.kkZܘ|bRP XV(T]&}Zs1#""b:]wB#1>>A4@_@OG(')„flexmix/data/whiskey.RData0000644000175100001440000000447313740572351015274 0ustar hornikusersBZh91AY&SYE(ؿPP4\ xW )UUިp M&OHiO)ڀd4zB%Iy%hPѣA24 @&E4dhi@ 2a0d& ```i4IILA @4MɠF2h:3DvJ( " Ad@D#$ )d "EY@U*DTb,hiݕn(VAҔUuNTx17y[zC,TRr]U6(|nZrХ\DTIlQQ5U#9ITWC,WSsXYF5TwM+))WMbNlAg@Ŧܣof֪QRUҘJaT nQ&lbƚeGoO p@ /:w=>~΅>ziSi-׶PhrVf1,*N  X0M|̐ 6pbWԮ/2f꽚K݅lAJ,V6* d6$ ,AeB'7ϲ "C>v/ optz"HH, $n*DKjIqy]!)JRuq7{F-j)g ӹaX1-ӒQĆI TD%Q"RHJ$P)"D)$RCZTReU$j45o4-9+X!ȯ2e{ªŮqv۷nݠc{{{{{~bp 4<**I%ZI$T$eF*YQVTbT$j֥I7_eʵJIV$RIQUeEUVTUYQUeFI%Zj߭]ufyʵI$jI*$Uʊ**ʊUf6V+ƚìٌc*$UI$TIV$*ʊQUBhk2 M1e@f 禚Lc, 3M41Y*UTDDDDDDDDDKj*:Pkb{T~B@8ѨrH) 'nu}I 8'Ԑ<ǟa'> w/R?:hά$2T:k$uj#F*j}<ђ Os_,  00P?a 緍fיsqe3eКoy2tiƬhAO{*2ty%egFi2۩ MVM2eu$RZp4A!Bțo71Rړ^s(:2!B3`94P¬JnN.Ͱ4,j >pSp5֎@b*uD g4$i3BEP Q%*# 1{&mY15É`IYm(@ƒv2 LWwW~P2+L9I(h0n2ȥ٦k9ݶrc1'N[kEEJ8! '2PRR(9h̓i^UfCq, nQM8"Q5g-H1]pؤ0(P=Q䔴><R?WH߃&cc2ȏ B#$C̈o]Yl=eD!"3y( ms"C)b~''*Ww ^bs)$^N(`prt#x_X#LcԄlmཌpoS/Zer jSDkބ\\ãRI 8'N@ 1?/*xYd^1Zf5)-I c'`2Sb:krj4'Q=VZd [ODn4qCj=<6\cibD^ (ђl/BKlm@-3,:~ջ!Ŏ |.N_&^`(׷4ɛ}8Qw.I4e>ȒH۾/{xQYlWv &xxs b NgnkQGX6/p&{=?qV7Lr<Mw4X(+cq4z8s{}nP1&3I{E7[qLGΥڦӤIQtգ088U9=ױ4p1 ݮyk쳰G vM** Fg!7t;X¶~?e{/mO _ ??a-a6#׿ȿ?]}JC彡⍚xy^C[~8m9j[a~6'|S+0K_DMa!S/VON_`3i{/{v- Ttb WuazjɏAӡR>(Wlqj T| lP9q;>(S%=?l/ԝ񛒧`c]9J %s̞ .y)=WêTM+aCn`/3t-dZ(^S  BM-Pr]M$T6,;ᅤP,ˌ37Lk}؏;$])Y[Ci9zWlN݌uwwrj}$ܷ۶|HWMNuǷxә7&K'<2|ʠ0}V5@m*5RjV;[gzr\Ý;kPtyY  #nN>œzKwu7dONM?\׸εZY= '3ź>U/VO:S{jHwZ()(b6%E,UЂ `U^yP9涃[sŠ{B5E3 it<<6OIHAX?{jn#<||Ӌ^PpӃy C'wz^+/vw t.3f6< >aaʚէ:]k@\5ho u[AMN~æZf-oFv\M P}Ff@ u#U>֒!N;a8GIeq͕K\Z-Ut,j=ZKf+m@}v')", b=«ߚf0|:e0۟a#.g /Eia-vmXXtܬLPQXwn:'$^ rh; [\*TL^<șw#ײO{Zy3AeZ|Cp~ m.ae92@W\6ׁUЭm{"' j]ݹ6[plǘF\?$9Rڵyט_X<[}Hy#9kA޼qAiTL-˭⛠zd#aeU;?кh,/i*&/rM84/]8hp*}w C٠v-RYNu\г#1ⓖz ,0uqɃ@웰ЋVC@EVYml1rAqEẋLm&j>0~#fDK33̔nn§=mc'sS|)=ٯˉTMcj؞ԗ _XÆnNBSkB [s};}m(BuS˃l^7}SK"WdږIBGu;3.s7YKRQۜǾr6.Zߏ`=L_vѶwN<^9 B| EΘ|!^@ods=].uW F\{x=L}{L߫s= {MOqMDB?_&a5.w^r1N|O]ق#Եz{|8]_C]?"S Gr^ 7>G>7A:5h@l8[`_lSj鴩+q& Ga4ă4#OÕ3Ay$\4׫:N!O/nSgיN8HEMQ ەI[LSW1k, EE6yQEQ9QmQC-Zkk>϶eI!qq'zY7k؏jfDxC#R[?R>ㇵ+l"TAi zF;F~nf1 (aKW`6h҄@l^ vFجʱfXۇno˰b6E]hUFx46c|MkȜރ-u%csv.-78HhEwhM Ŝ>13?=DSkaˋf]BOB2ݨ"uW:%ܵUQ SHJis#c@ԗ!L$WVk~ @uݽׁ*qM>T_ HlDґ.1 Dd#[.>CIK7&=v ^ eL dj*vo%\jk)?YxF(2GJYϝ !8sN-|'xEr IIU`9dm{+fANJ4dUTWޅG Ֆ$|P0^F?r ]9`4rNNI6cV k@..yw OP+HD{RA槍ZY`W;M9R| v;5/ (vν ^O_TLxto#] 2GոSܿeE{Oul ̃Jo 3Q)sE6P8 MAϸ)ü ˝c v L + ö|ZZdlTzp;ZAqτ3߮ gv5c`z>a)w&#jQK镑 wgDHȊY޻u ȕ%po`IZcn},{4@\@˻$ Qz% Zݟ,se3z ŴΣqwӁ }!Gl102^k9^_FkcMk7hJZtu$p_^~/Uф?wE%aQv4|NeM yN8߽շ2veyF-@@G8Rwp$Y;-*4,IW;^yj{DcYrV [\hv$Ye;yBkr~ĿPS4F oĒ b4ӗdh 'ؔb櫝?TX4&u{O -Vo7N~J?HnD[p5 Ο-o G5/D oZ]n1@! ޣm_/d4@<=;cGX o᜹r;_ L?YA2j ݅s?wéWēOz\O-Vpv!zQg!εGg .H= g ; pq٢5ߤ8Ƕk{p7hkY *ۥ*qj~y-Z"'.~Bz|WVfdNۡ[IaeNRA{. O^Hn4~c4g4[ Ub_d^GU34p8sMMMw+ X,~]ڏ~ Mv(-Z>{sX[\9ԔN}9R6V)38:hzuZߝW~ljlWpnZg8 ֨U݌auc=ac'6idգ!Zӛc h{MiK"N Ϸaـyx8?u_3k;9lX9Y8?rJKb&p$nnŞEcgR6y q6cdfѶ8]/SG5 -PN #s9%.ٽ_BqV#¥f1( t*u2@q؁4Μԗ*+%4H1^A2m@wڱ2md_>#z@04سc-@Xa1ɔ@JnF+e-vepOON;)y ``h::b%Oun|I76 MC_A k@`C 3'cGA|/36t54" C˖Cn>Ӽ0:"xFM廙Gc ZNi{4Wjj@.xU¼ـ7V$WHY̋׀7hD ʇgy_[hg 69;q+^v[؁dc X&Pi흓'yOA^?u@3=_z'TbΜn%=~OQ: $-lD5}@ְg@y)#AQ} 99[߹(*MΙe m U/Wv˰gJį@QsQ~pX,zhgS$t)v"LmÚSſ&&Ư$RZ>t & 2p~Z(.*ewrS rǵHܿ2/ |"u}\X;[ h*פ'*O>#DYn]p$EtT ub{2A@ZI`7=+F.=}Gxcl ! [W&yb1^gЌW% knѧ8J_8;h)5ӺgQ#BVN1>LrX|_#MQ#gKމ7pnMI%q@]rV  WgY%:(=ALHvO:tgU5 8_o8^sjDv} =;l$8b6 E=;ys pE}T@ujXyc [[Y\}&N_wf].cտ=#F$i?]*ÍUzgv6j``R+q6to'Z8мu'pE:o ADNPWb {&(|oM^ٌf֕u?Zg<Ć+?WX:G)SOlL-VThUQvOtN' O <`c6EMT7P]56:1? U9ץ^ҹ{ϚL>@u5aݩihҎ?2XɖsNԀD?|P]}׌f5upa74'%ycD!P]뾠VʯA11vzMNE4Px043 W1%d͘ރf>|graC5Q9#<30|#)a]vŸJj9ywpo鵟%H7ר"FfQ8^<"6!nΕOmr^?Ʀ[Т{Qhڮ!ͽ)n25.-IȈ?w픋c "~&pœt}\QZHw:..lqU4?0X; Ak?}s6n{ck09pk~6<-٦V6wSǾow mPQl8>w$>e`-eI36 .:-p0%Ȧ%a-Yg_h{KčOQ˅ D4Ù̬RJDş?DC}TДXR>ے(d3F6+ ՠ nxou~ l.DӼFmޑXUg =Xk-- )szh MǶטMJ]=Y^ض8ռYbsQ͢B:T&m]XRBٻìz5%cݨy/vzz7 }͠ ~ߗNce];#/S `Y$4jh=>9>4ao>\n-FmvgsbH][ 6O}.,Ƶ 4M=1i}lJ~D.n4ݾc>구`\8t>"6j4s~s~ٛbj׃Bw؀q86W0J !+-7ʽ;Mq6v{]^>?[Jx+u_/bٯ\j&+~xIc p2GVDޭlgWk@zbdwC R֔ BQD9.Y@{O,!N%wxahscN@WWȧe 'jZs>@gJA=,e쵟RAL;<WhiF{ʲ`* ${6gM@B$sOm[UVk_tJ =-p1}O;t6)yќxC1' 8?X"N#3Fy-mV!Ѻ@pS{ &Ω@mge q~U@0̼$8㊆eQ'G~'AdQzv3fKAxbʼ Orq9O_?(f. ;fPATC BKbWA3I M]5ٯ|ijZnz[AϢ5c/E{q!n^FCxtU04~δkG瞃mBzHɩ]JPQzkB>W OJ{?uW`^^ -bͿeM/ٳ I=P$rRϠ .5?^,\r$$e覷dv_[3C:x@^U,PZRu ކVq eHLtZk?PvsZwƵ; qdI4R6 lls޲i?e [ܢl6ߙ7bA1 jX =ٴ_[QeIV_v+u'Aܯz $K^z:|[dk7@찵ȴIPxC 殟_b½\WH ّy}XD؀- X,&:GEW1Z6S5P04r6k,6=<ZFpdgE^HVb}J$CHwkԁƷ CG=ATћLj 4gz!|aߠ6 c;D)`60۩4hU9P[tvL'J .+V<3J9ռ\DB[Yzۮ:q?#}͠7z]aC/?'Z27AMq0`J؁u% ZN']ޱ D`>pN;?N)>4wEo6?8B7=׺ 8L#@IhW# o.ֱ"}}r~=AMA=t\e{@/@|/P{Vо^ϋHTs7G3~g_Jx=e)w-%e;k$NKUhMJ uV U;tU sb.k>!#+þ6]6 "'-U<] n,~#<45߭v޷_%f.d?)(iyD{ )Ad=T7Ҁ*^8SzwqvI|Un}WG<"$T!]G,yxfΌ,.:4!ysҁִ@qwʪS l. @i;JEF' @xp,g/VÅI@+SV۷rIޟ*0rr }~WB{ E> Vr̷/i0fE9zaG\P瞣8EY:tz" +h9 o\}u)=R@ }9_%wd+ZN:'Yz@NԼ ic,Hm۽Gy5&̋oi߷LJhU^d 37a5F4?DQE]5NT|"rB*uO\hVŠ_gbVTHA#@:pq栶P"<ВC(mI.=3(lvI^.hsAIbNnA?P~IdC@x5M b&<ޱg}@#jη隹1n}/o_= T(,Y: oDl1`eS6akWŶeb`}EF64@i-3צo B*Zʵ0pѹS@845n}zYE},]BrD OL_L>S_w`s9S8ײ?"flexmix/data/NregFix.RData0000644000175100001440000001016613740572351015147 0ustar hornikusersy\KSRѢ}99Znĵ$EJ",)dYB%"R,)ftxM[Gպe![;be~ȜU(>Cu9:([s$PSht0,x?S(odFǂG _);So a}HCI1mm:(>Sx1SXGF? ܉}:;= srBSA('؜M/(ckUquݥ\)ibЦppu"jo`c6ñVM__OW4;7y)jIP{_=Q`:A9Yc NWG w#:˦ZJwYdyQLjP;JfڀܨY`z$~ęI.jm@oFkPSi&?|Z@ .jG7JkQ}sǀFQerih{i6CqI .J&ᇓM5/{V=_P7F})*maykRf_-+c&[J{- aN.Px;3Qj٩)-dTĆTն6@hf-T1,oмT_j>`yɏSWO)/! )V 1+(3|O{d}WNG9Om}ߗ6b ʤV?mkW;CeUtwhpeöKh"N;Kf d{^:} 8{O8A6AWU%B9yՓ 쎢ߪG.Icˆՠ ϸUfd zFH=A@(#;I<>]nr˽'Q 逛AxBT7)-<č;@ꯑ54ܗ?g$Ӆ*7176.-b]Cŧ͇4F10uڊ~:NC-պtcwQeR@x]J;} j͠[t"j,{=,d'딛!IB)8r?Cjܴ s]ٙbRR ht}vW }0l6z1ꌆf"h+/~޲gw3<ޭ˿uDp)CWSlJ% J?u 辟|V'K>}9enS`>m}6 ԧ@m_ݏ+`Gx=㘜fWύIC׳R=ի O=q%WxywᏚ2ie 45;_}?.@f@Kf0w]`qc0`Ln_hJ|֤~uB3Q>gt+5LHxjTN,3pQ!Gd͉@3[ŋo=LiRO W`)Tj(5L)<i1;O 5g"ON e"bQs^Aϝ6yڟis[&Wd[JkoN 9ôqPѻ|i8·CÏRiGu@hΒ~PcoѠ^#˷m1ptrkV_T!b< R/?X|7`̦+ǝ$gg )楧;C͔, P^$hvh$`b(4E'C6G>/;,1v;-bSleD!-T8ʰ 57տ[U͚uքfo~d /p_^G:PfG_^uHǡʆY55j5}^X u^LIֶ_NCf6m-m0cToxtk#5<nѬB'QS ,lkل[qKaвe\ϊ%aԄ яY{eQc,/QJ-Ѕ''<< ?զ}plzg/@1u/#S!ʮOÃD@Ei⛐'5TN2+T9MvEh$h˃;9P:eרqNE. &VZrvw(Ŧ[qEPQMY~Qa"ԳjYfBiՆR|ֳm6F蹝wl*ʌ⩐r4CE8yDRyn]*1KTQ㡟J!{e ^^Ň?A-_Z*\}U޹9ގ ,h _=y7p!˺GO6Gtavעv|s۶}N'p]uiՋ%^uN|BП׺Awz+LNHɽ~=djv,$,?6U;oevƎj)#J K J9yTe :CB5KO. nKG/,wAS12%kFm"~ Er&$:+ +K͉tY΍.A&Ǡ}imԵzm6SsefΝu=z=*њnU9+;oEZNh 44I~DV;;y!/s|Ӽ g*r˿}_! IJ|J8W:O:B8Y Pݡ)<// 8_?A5Hr KoG{CuHU24gꫦ7^1s+ƽ Y73.eu:Ңf5p49JiWgRUbmT5wګٴjY-,-t,t-,l&SDL!Sa288888888888#䌐3BGҮ0flexmix/data/seizure.RData0000644000175100001440000000171313740572351015271 0ustar hornikusersBZh91AY&SYr*Fu'@@@@@y;{="@~hɈ2h1 @gM D7y?Gh!GRoU=MCC@ 44@~`&L&#&AL0&#MJ*2&2 4Fd? %ȏmmmmmi$$ U\nst/62pLn>H<'УJN^Ş]}]'d)D$4) .[L_xU vQe)`K$_K$}q㉝~'dɲgj^X.W%tV&D v<Xɚ=ӈM[;\I9K٤\MH 9&91-\ `G (#?H c];WR.K\mݴ[(]/?;> v}/ # S"Te-+!$ [Zݝ R)JPmmLPj2(2BA@9z$")TȀ%kCWZET$xNU.) ˔RB2VUJ2 G{ҙDMkZִ衡%ֲm&ڒm~65kZֵ lSTR)Jt< 3X%&0f Dc3*S9371P""",0@9ss<8o3-DEAAAAAM5]2 ؏d ȯkDcPN44y_)5MBLLiA4< 7TnnH#,/1+AB!B ƑcG1c\9%"""""""P+]BB[Ȩflexmix/man/0000755000175100001440000000000013740553643012531 5ustar hornikusersflexmix/man/fitted.Rd0000644000175100001440000000213512455415610014271 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: fitted.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{fitted-methods} \docType{methods} \alias{fitted,flexmix-method} \alias{fitted,FLXM-method} \alias{fitted,FLXR-method} \alias{fitted,FLXRMRglm-method} \title{Extract Model Fitted Values} \description{ Extract fitted values for each component from a flexmix object. } \usage{ \S4method{fitted}{flexmix}(object, drop = TRUE, aggregate = FALSE, ...) } \arguments{ \item{object}{an object of class \code{"flexmix"} or \code{"FLXR"}} \item{drop}{logical, if \code{TRUE} then the function tries to simplify the return object by combining lists of length 1 into matrices.} \item{aggregate}{logical, if \code{TRUE} then the fitted values for each model aggregated over the components are returned.} \item{\dots}{currently not used} } \keyword{methods} \author{Friedrich Leisch and Bettina Gruen} \examples{ data("NPreg", package = "flexmix") ex1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2) matplot(NPreg$x, fitted(ex1), pch = 16, type = "p") points(NPreg$x, NPreg$yn) } flexmix/man/dmft.Rd0000644000175100001440000000370212455415610013745 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: dmft.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{dmft} \alias{dmft} \docType{data} \title{Dental Data} \description{ Count data from a dental epidemiological study for evaluation of various programs for reducing caries collected among school children from an urban area of Belo Horizonte (Brazil). } \usage{data("dmft")} \format{ A data frame with 797 observations on the following 5 variables. \describe{ \item{End}{Number of decayed, missing or filled teeth at the end of the study.} \item{Begin}{Number of decayed, missing or filled teeth at the beginning of the study.} \item{Gender}{A factor with levels \code{male} and \code{female}.} \item{Ethnic}{A factor with levels \code{brown}, \code{white} and \code{black}.} \item{Treatment}{A factor with levels \code{control}, \code{educ}, \code{enrich}, \code{rinse}, \code{hygiene} and \code{all}.} } } \details{ The aim of the caries prevention study was to compare four methods to prevent dental caries. Interventions were carried out according to the following scheme: \describe{ \item{control}{Control group} \item{educ}{Oral health education} \item{enrich}{Enrichment of the school diet with rice bran} \item{rinse}{Mouthwash with 0.2\% sodium floride (NaF) solution} \item{hygiene}{Oral hygiene} \item{all}{All four methods together} } } \source{ D. Boehning, E. Dietz, P. Schlattmann, L. Mendonca and U. Kirchner. The zero-inflated Poisson model and the decayed, missing and filled teeth index in dental epidemiology. \emph{Journal of the Royal Statistical Society A}, \bold{162}(2), 195--209, 1999. } \examples{ data("dmft", package = "flexmix") dmft_flx <- initFlexmix(End ~ 1, data = dmft, k = 2, model = FLXMRglmfix(family = "poisson", fixed = ~ Gender + Ethnic + Treatment)) } \keyword{datasets} flexmix/man/flexmix.Rd0000644000175100001440000001266613074144537014505 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: flexmix.Rd 5115 2017-04-07 08:18:13Z gruen $ % \name{flexmix} \alias{flexmix} \alias{flexmix,formula,ANY,ANY,ANY,missing-method} \alias{flexmix,formula,ANY,ANY,ANY,list-method} \alias{flexmix,formula,ANY,ANY,ANY,FLXM-method} \alias{prior,flexmix-method} \alias{show,flexmix-method} \alias{summary,flexmix-method} \alias{show,summary.flexmix-method} \title{Flexible Mixture Modeling} \description{ FlexMix implements a general framework for finite mixtures of regression models. Parameter estimation is performed using the EM algorithm: the E-step is implemented by \code{flexmix}, while the user can specify the M-step. } \usage{ flexmix(formula, data = list(), k = NULL, cluster = NULL, model = NULL, concomitant = NULL, control = NULL, weights = NULL) \S4method{summary}{flexmix}(object, eps = 1e-4, ...) } \arguments{ \item{formula}{A symbolic description of the model to be fit. The general form is \code{y~x|g} where \code{y} is the response, \code{x} the set of predictors and \code{g} an optional grouping factor for repeated measurements.} \item{data}{An optional data frame containing the variables in the model.} \item{k}{Number of clusters (not needed if \code{cluster} is specified).} \item{cluster}{Either a matrix with \code{k} columns of initial cluster membership probabilities for each observation; or a factor or integer vector with the initial cluster assignments of observations at the start of the EM algorithm. Default is random assignment into \code{k} clusters.} \item{weights}{An optional vector of replication weights to be used in the fitting process. Should be \code{NULL}, an integer vector or a formula.} \item{model}{Object of class \code{FLXM} or list of \code{FLXM} objects. Default is the object returned by calling \code{\link{FLXMRglm}()}.} \item{concomitant}{Object of class \code{FLXP}. Default is the object returned by calling \code{\link{FLXPconstant}}.} \item{control}{Object of class \code{FLXcontrol} or a named list.} \item{object}{Object of class \code{flexmix}.} \item{eps}{Probabilities below this threshold are treated as zero in the summary method.} \item{\dots}{Currently not used.} } \details{ FlexMix models are described by objects of class \code{FLXM}, which in turn are created by driver functions like \code{\link{FLXMRglm}} or \code{\link{FLXMCmvnorm}}. Multivariate responses with independent components can be specified using a list of \code{FLXM} objects. The \code{summary} method lists for each component the prior probability, the number of observations assigned to the corresponding cluster, the number of observations with a posterior probability larger than \code{eps} and the ratio of the latter two numbers (which indicates how separated the cluster is from the others). } \value{ Returns an object of class \code{flexmix}. } \author{Friedrich Leisch and Bettina Gruen} \seealso{\code{\link[flexmix]{plot-methods}}} \references{ Friedrich Leisch. FlexMix: A general framework for finite mixture models and latent class regression in R. \emph{Journal of Statistical Software}, \bold{11}(8), 2004. doi:10.18637/jss.v011.i08 Bettina Gruen and Friedrich Leisch. Fitting finite mixtures of generalized linear regressions in R. Computational Statistics & Data Analysis, 51(11), 5247-5252, 2007. doi:10.1016/j.csda.2006.08.014 Bettina Gruen and Friedrich Leisch. FlexMix Version 2: Finite mixtures with concomitant variables and varying and constant parameters Journal of Statistical Software, 28(4), 1-35, 2008. doi:10.18637/jss.v028.i04 } \keyword{regression} \keyword{cluster} \examples{ data("NPreg", package = "flexmix") ## mixture of two linear regression models. Note that control parameters ## can be specified as named list and abbreviated if unique. ex1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2, control = list(verb = 5, iter = 100)) ex1 summary(ex1) plot(ex1) ## now we fit a model with one Gaussian response and one Poisson ## response. Note that the formulas inside the call to FLXMRglm are ## relative to the overall model formula. ex2 <- flexmix(yn ~ x, data = NPreg, k = 2, model = list(FLXMRglm(yn ~ . + I(x^2)), FLXMRglm(yp ~ ., family = "poisson"))) plot(ex2) ex2 table(ex2@cluster, NPreg$class) ## for Gaussian responses we get coefficients and standard deviation parameters(ex2, component = 1, model = 1) ## for Poisson response we get only coefficients parameters(ex2, component = 1, model = 2) ## fitting a model only to the Poisson response is of course ## done like this ex3 <- flexmix(yp ~ x, data = NPreg, k = 2, model = FLXMRglm(family = "poisson")) ## if observations are grouped, i.e., we have several observations per ## individual, fitting is usually much faster: ex4 <- flexmix(yp~x|id1, data = NPreg, k = 2, model = FLXMRglm(family = "poisson")) ## And now a binomial example. Mixtures of binomials are not generically ## identified, here the grouping variable is necessary: set.seed(1234) ex5 <- initFlexmix(cbind(yb,1 - yb) ~ x, data = NPreg, k = 2, model = FLXMRglm(family = "binomial"), nrep = 5) table(NPreg$class, clusters(ex5)) ex6 <- initFlexmix(cbind(yb, 1 - yb) ~ x | id2, data = NPreg, k = 2, model = FLXMRglm(family = "binomial"), nrep = 5) table(NPreg$class, clusters(ex6)) } flexmix/man/bioChemists.Rd0000644000175100001440000000240013740553643015265 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: bioChemists.Rd 5193 2020-10-09 18:38:20Z gruen $ % \name{bioChemists} \alias{bioChemists} \docType{data} \title{Articles by Graduate Students in Biochemistry Ph.D. Programs} \description{ A sample of 915 biochemistry graduate students. } \usage{ data("bioChemists") } \format{ \describe{ \item{art}{count of articles produced during last 3 years of Ph.D.} \item{fem}{factor indicating gender of student, with levels Men and Women} \item{mar}{factor indicating marital status of student, with levels Single and Married} \item{kid5}{number of children aged 5 or younger} \item{phd}{prestige of Ph.D. department} \item{ment}{count of articles produced by Ph.D. mentor during last 3 years} } } \details{ This data set is taken from package \pkg{pscl} provided by Simon Jackman. } \source{ found in Stata format at \url{https://jslsoc.sitehost.iu.edu/stata/spex_data/couart2.dta} } \references{ Long, J. Scott. The origins of sex difference in science. \emph{Social Forces}, \bold{68}, 1297--1315, 1990. Long, J. Scott. \emph{Regression Models for Categorical and Limited Dependent Variables}, 1997. Thousand Oaks, California: Sage. } \keyword{datasets} flexmix/man/FLXmodel-class.Rd0000644000175100001440000000323513673623016015575 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXmodel-class.Rd 5184 2020-06-20 18:27:29Z gruen $ % \name{FLXM-class} \docType{class} \alias{FLXM-class} \alias{FLXMC-class} \alias{FLXMR-class} \alias{FLXMCsparse-class} \alias{show,FLXM-method} \title{Class "FLXM"} \description{FlexMix model specification.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("FLXM", ...)}, typically inside driver functions like \code{\link{FLXMRglm}} or \code{\link{FLXMCmvnorm}}. } \section{Slots}{ \describe{ \item{\code{fit}:}{Function returning an \code{FLXcomponent} object.} \item{\code{defineComponent}:}{Function or expression to determine the \code{FLXcomponent} object given the parameters.} \item{\code{weighted}:}{Logical indicating whether \code{fit} can do weighted likelihood maximization.} \item{\code{name}:}{Character string used in print methods.} \item{\code{formula}:}{Formula describing the model.} \item{\code{fullformula}:}{Resulting formula from updating the model formula with the formula specified in the call to \code{flexmix}.} \item{\code{x}:}{Model matrix.} \item{\code{y}:}{Model response.} \item{\code{terms}, \code{xlevels}, \code{contrasts}:}{Additional information for model matrix.} \item{\code{preproc.x}:}{Function for preprocessing matrix \code{x} before the EM algorithm starts, by default the identity function.} \item{\code{preproc.y}:}{Function for preprocessing matrix \code{y} before the EM algorithm starts, by default the identity function.} } } \author{Friedrich Leisch and Bettina Gruen} \keyword{classes} flexmix/man/candy.Rd0000644000175100001440000000250312455415610014107 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: candy.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{candy} \alias{candy} \docType{data} \title{Candy Packs Purchased} \description{ The data is from a new product and concept test where the number of individual packs of hard candy purchased within the past 7 days is recorded. } \usage{data("candy")} \format{ A data frame with 21 observations on the following 2 variables. \describe{ \item{\code{Packages}}{a numeric vector} \item{\code{Freq}}{a numeric vector} } } \source{ D. Boehning, E. Dietz and P. Schlattmann. Recent Developments in Computer-Assisted Analysis of Mixtures. Biometrics 54(2), 525--536, 1998. } \references{ J. Magidson and J. K. Vermunt. Latent Class Models. In D. W. Kaplan (ed.), The Sage Handbook of Quantitative Methodology for the Social Sciences, 175--198, 2004. Thousand Oakes: Sage Publications. D. Boehning, E. Dietz and P. Schlattmann. Recent Developments in Computer-Assisted Analysis of Mixtures. \emph{Biometrics}, \bold{54}(2), 525--536, 1998. W. R. Dillon and A. Kumar. Latent structure and other mixture models in marketing: An integrative survey and overview. In R. P. Bagozzi (ed.), Advanced methods of marketing research, 352--388, 1994. Cambridge, UK: Blackwell. } \keyword{datasets} flexmix/man/Mehta.Rd0000644000175100001440000000265512455415610014057 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: Mehta.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{Mehta} \alias{Mehta} \docType{data} \title{Mehta Trial} \description{ For a 22-centre trial the number of responses and the total number of patients is reported for the control group and the group receiving a new drug. } \usage{data("Mehta")} \format{ A data frame with 44 observations on the following 4 variables. \describe{ \item{Response}{Number of responses.} \item{Total}{Total number of observations.} \item{Drug}{A factor indicating treatment with levels \code{New} and \code{Control}.} \item{Site}{A factor indicating the site/centre.} } } \source{ M. Aitkin. Meta-analysis by random effect modelling in generalized linear models. \emph{Statistics in Medicine}, \bold{18}, 2343--2351, 1999. } \references{ C.R. Mehta, N.R. Patel and P. Senchaudhuri. Importance sampling for estimating exact probabilities in permutational inference. \emph{Journal of the American Statistical Association}, \emph{83}, 999--1005, 1988. } \examples{ data("Mehta", package = "flexmix") mehtaMix <- initFlexmix(cbind(Response, Total-Response) ~ 1|Site, data = Mehta, nrep = 5, k = 3, model = FLXMRglmfix(family = "binomial", fixed = ~ Drug), control = list(minprior = 0.04)) } \keyword{datasets} flexmix/man/BregFix.Rd0000644000175100001440000000212112455415610014333 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: BregFix.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{BregFix} \alias{BregFix} \docType{data} \title{Artificial Example for Binomial Regression} \description{ A simple artificial regression example data set with 3 latent classes, one independent variable \code{x} and a concomitant variable \code{w}. } \usage{data("BregFix")} \format{ A data frame with 200 observations on the following 5 variables. \describe{ \item{\code{yes}}{number of successes} \item{\code{no}}{number of failures} \item{\code{x}}{independent variable} \item{\code{w}}{concomitant variable, a factor with levels \code{0} \code{1}} \item{\code{class}}{latent class memberships} } } \examples{ data("BregFix", package = "flexmix") Model <- FLXMRglmfix(family="binomial", nested = list(formula = c(~x, ~0), k = c(2, 1))) Conc <- FLXPmultinom(~w) FittedBin <- initFlexmix(cbind(yes, no) ~ 1, data = BregFix, k = 3, model = Model, concomitant = Conc) summary(FittedBin) } \keyword{datasets} flexmix/man/patent.Rd0000644000175100001440000000312712455415610014307 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: patent.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{patent} \alias{patent} \docType{data} \title{Patents and R&D Spending} \description{ Number of patents, R&D spending and sales in millions of dollar for 70 pharmaceutical and biomedical companies in 1976. } \usage{data("patent")} \format{ A data frame with 70 observations on the following 4 variables. \describe{ \item{Company}{Name of company.} \item{Patents}{Number of patents.} \item{RDS}{R&D spending per sales.} \item{lgRD}{Logarithmized R&D spendings (in millions of dollars).} } } \details{ The data is taken from the National Bureau of Economic Research R\&D Masterfile. } \source{ P. Wang, I.M. Cockburn and M.L. Puterman. Analysis of Patent Data -- A Mixed-Poisson-Regression-Model Approach. \emph{Journal of Business & Economic Statistics}, \bold{16}(1), 27--41, 1998. } \references{ B.H. Hall, C. Cummins, E. Laderman and J. Mundy. The R&D Master File Documentation. Technical Working Paper 72, National Bureau of Economic Research, 1988. Cambridge, MA. } \examples{ data("patent", package = "flexmix") patentMix <- initFlexmix(Patents ~ lgRD, k = 3, model = FLXMRglm(family = "poisson"), concomitant = FLXPmultinom(~RDS), nrep = 5, data = patent) plot(Patents ~ lgRD, data = patent, pch = as.character(clusters(patentMix))) ordering <- order(patent$lgRD) apply(fitted(patentMix), 2, function(y) lines(sort(patent$lgRD), y[ordering])) } \keyword{datasets} flexmix/man/FLXMRrobglm.Rd0000644000175100001440000000525012455415610015106 0ustar hornikusers% % Copyright (C) 2008 Friedrich Leisch and Bettina Gruen % $Id: FLXMRrobglm.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXMRrobglm} \alias{FLXMRrobglm} \alias{FLXMRrobglm-class} \title{FlexMix Driver for Robust Estimation of Generalized Linear Models} \description{ This driver adds a noise component to the mixture model which can be used to model background noise in the data. See the Compstat paper Leisch (2008) cited below for details. } \usage{ FLXMRrobglm(formula = . ~ ., family = c("gaussian", "poisson"), bgw = FALSE, ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{flexmix} using \code{\link{update.formula}}. Default is to use the original \code{flexmix} model formula.} \item{family}{A character string naming a \code{\link{glm}} family function.} \item{bgw}{Logical, controls whether the parameters of the background component are fixed to multiples of location and scale of the complete data (the default), or estimated by EM with normal weights for the background (\code{bgw = TRUE}).} \item{\dots}{passed to \code{FLXMRglm}} } \value{ Returns an object of class \code{FLXMRrobglm}. } \author{Friedrich Leisch and Bettina Gruen} \note{ The implementation of this model class is currently under development, and some methods like \code{refit} are still missing. } \references{ Friedrich Leisch. Modelling background noise in finite mixtures of generalized linear regression models. In Paula Brito, editor, Compstat 2008--Proceedings in Computational Statistics, 385--396. Physica Verlag, Heidelberg, Germany, 2008.\cr Preprint available at http://epub.ub.uni-muenchen.de/6332/. } \examples{ ## Example from Compstat paper, see paper for detailed explanation: data("NPreg", package = "flexmix") DATA <- NPreg[, 1:2] set.seed(3) DATA2 <- rbind(DATA, cbind(x = -runif(3), yn = 50 + runif(3))) ## Estimation without (f2) and with (f3) background component f2 <- flexmix(yn ~ x + I(x^2), data = DATA2, k = 2) f3 <- flexmix(yn ~ x + I(x^2), data = DATA2, k = 3, model = FLXMRrobglm(), control = list(minprior = 0)) ## Predict on new data for plots x <- seq(-5,15, by = .1) y2 <- predict(f2, newdata = data.frame(x = x)) y3 <- predict(f3, newdata = data.frame(x = x)) ## f2 was estimated without background component: plot(yn ~ x, data = DATA2, pch = clusters(f2), col = clusters(f2)) lines(x, y2$Comp.1, col = 1) lines(x, y2$Comp.2, col = 2) ## f3 is with background component: plot(yn ~ x, data = DATA2, pch = 4 - clusters(f3), col = 4 - clusters(f3)) lines(x, y3$Comp.2, col = 2) lines(x, y3$Comp.3, col = 1) } \keyword{models} flexmix/man/flexmix-class.Rd0000644000175100001440000000370212455415610015572 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: flexmix-class.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{flexmix-class} \docType{class} \alias{flexmix-class} \title{Class "flexmix"} \description{A fitted \code{\link{flexmix}} model.} \section{Slots}{ \describe{ \item{\code{model}:}{List of \code{FLXM} objects.} \item{\code{prior}:}{Numeric vector with prior probabilities of clusters.} \item{\code{posterior}:}{Named list with elements \code{scaled} and \code{unscaled}, both matrices with one row per observation and one column per cluster.} \item{\code{iter}:}{Number of EM iterations.} \item{\code{k}:}{Number of clusters after EM.} \item{\code{k0}:}{Number of clusters at start of EM.} \item{\code{cluster}:}{Cluster assignments of observations.} \item{\code{size}:}{Cluster sizes.} \item{\code{logLik}:}{Log-likelihood at EM convergence.} \item{\code{df}:}{Total number of parameters of the model.} \item{\code{components}:}{List describing the fitted components using \code{FLXcomponent} objects.} \item{\code{formula}:}{Object of class \code{"formula"}.} \item{\code{control}:}{Object of class \code{"FLXcontrol"}.} \item{\code{call}:}{The function call used to create the object.} \item{\code{group}:}{Object of class \code{"factor"}.} \item{\code{converged}:}{Logical, \code{TRUE} if EM algorithm converged.} \item{\code{concomitant}:}{Object of class \code{"FLXP"}..} \item{\code{weights}:}{Optional weights of the observations.} } } \section{Extends}{ Class \code{FLXdist}, directly. } \section{Accessor Functions}{ The following functions should be used for accessing the corresponding slots: \describe{ \item{\code{cluster}:}{Cluster assignments of observations.} \item{\code{posterior}:}{A matrix of posterior probabilities for each observation.} } } \author{Friedrich Leisch and Bettina Gruen} \keyword{classes} flexmix/man/NregFix.Rd0000644000175100001440000000243212455415610014354 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: NregFix.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{NregFix} \alias{NregFix} \title{Artificial Example for Normal Regression} \description{ A simple artificial regression example with 3 latent classes, two independent variables, one concomitant variable and a dependent variable which follows a Gaussian distribution. } \usage{ data("NregFix") } \format{ A data frame with 200 observations on the following 5 variables. \describe{ \item{\code{x1}}{Independent variable: numeric variable.} \item{\code{x2}}{Independent variable: a factor with two levels: \code{0} and \code{1}.} \item{\code{w}}{Concomitant variable: a factor with two levels: \code{0} and \code{1}.} \item{\code{y}}{Dependent variable.} \item{\code{class}}{Latent class memberships.} } } \examples{ data("NregFix", package = "flexmix") library("lattice") xyplot(y ~ x1 | x2 * w, data = NregFix, groups = class) Model <- FLXMRglmfix(~ 1, fixed = ~ x2, nested = list(k = c(2, 1), formula = c(~x1, ~0))) fittedModel <- initFlexmix(y ~ 1, model = Model, data = NregFix, k = 3, concomitant = FLXPmultinom(~ w), nrep = 5) fittedModel } \keyword{datasets} flexmix/man/FLXMRziglm.Rd0000644000175100001440000000276112455415610014752 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXMRziglm.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXMRziglm} \alias{FLXMRziglm} \alias{FLXMRziglm-class} \alias{refit,FLXMRziglm-method} \alias{FLXreplaceParameters,FLXMRziglm-method} \alias{FLXgradlogLikfun,FLXMRziglm-method} \title{FlexMix Interface to Zero Inflated Generalized Linear Models} \description{ This is a driver which allows fitting of zero inflated poisson and binomial models. } \usage{ FLXMRziglm(formula = . ~ ., family = c("binomial", "poisson"), ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{flexmix} using \code{\link{update.formula}}. Default is to use the original \code{flexmix} model formula.} \item{family}{A character string naming a \code{\link{glm}} family function.} \item{\dots}{passed to \code{FLXMRglm}} } \value{ Returns an object of class \code{FLXMRziglm}. } \author{Friedrich Leisch and Bettina Gruen} \note{ In fact this only approximates zero inflated models by fixing the coefficient of the intercept at -Inf and the other coefficients at zero for the first component. } \examples{ data("dmft", package = "flexmix") Model <- FLXMRziglm(family = "poisson") Fitted <- flexmix(End ~ log(Begin + 0.5) + Gender + Ethnic + Treatment, model = Model, k = 2 , data = dmft, control = list(minprior = 0.01)) summary(refit(Fitted)) } \keyword{models} flexmix/man/FLXMRglmnet.Rd0000644000175100001440000000657213141312145015112 0ustar hornikusers\name{FLXMRglmnet} \alias{FLXMRglmnet} \alias{FLXMRglmnet-class} \title{FlexMix Interface for Adaptive Lasso / Elastic Net with GLMs} \description{ This is a driver which allows fitting of mixtures of GLMs where the coefficients are penalized using the (adaptive) lasso or the elastic net by reusing functionality from package \pkg{glmnet}. } \usage{ FLXMRglmnet(formula = . ~ ., family = c("gaussian", "binomial", "poisson"), adaptive = TRUE, select = TRUE, offset = NULL, ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Default is to use the original \code{\link{flexmix}} model formula.} \item{family}{A character string naming a \code{\link{glm}} family function.} \item{adaptive}{A logical indicating if the adaptive lasso should be used. By default equal to \code{TRUE}.} \item{select}{A logical vector indicating which variables in the model matrix should be included in the penalized part. By default equal to \code{TRUE} implying that all variables are penalized.} \item{offset}{This can be used to specify an \emph{a priori} known component to be included in the linear predictor during fitting.} \item{\dots}{Additional arguments to be passed to \code{\link[glmnet]{cv.glmnet}} fitter.} } \details{ Some care is needed to ensure convergence of the algorithm, which is computationally more challenging than a standard EM. In the proposed method, not only are cluster allocations identified and component parameters estimated as commonly done in mixture models, but there is also variable selection via penalized regression using $k$-fold cross-validation to choose the penalty parameter. For the algorithm to converge, it is necessary that the same cross-validation partitioning be used across the EM iterations, i.e., the subsamples for cross-validation must be defined at the beginning This is accomplished using the \code{foldid} option as an additional parameter to be passed to \code{\link[glmnet]{cv.glmnet}} (see \pkg{glmnet} package documentation). } \value{ Returns an object of class \code{FLXMRglm}. } \author{ Frederic Mortier and Nicolas Picard. } \seealso{ \code{\link{FLXMRglm}} } \references{ Frederic Mortier, Dakis-Yaoba Ouedraogo, Florian Claeys, Mahlet G. Tadesse, Guillaume Cornu, Fidele Baya, Fabrice Benedet, Vincent Freycon, Sylvie Gourlet-Fleury and Nicolas Picard. Mixture of inhomogeneous matrix models for species-rich ecosystems. \emph{Environmetrics}, \bold{26}(1), 39-51, 2015. doi:10.1002/env.2320 } \examples{ set.seed(12) p <- 10 beta <- matrix(0, nrow = p + 1, ncol = 2) beta[1,] <- c(-1, 1) beta[cbind(c(5, 10), c(1, 2))] <- 1 nobs <- 100 X <- matrix(rnorm(nobs * p), nobs, p) mu <- cbind(1, X) \%*\% beta z <- sample(1:ncol(beta), nobs, replace = TRUE) y <- mu[cbind(1:nobs, z)] + rnorm(nobs) data <- data.frame(y, X) ## The maximum number of iterations is reduced to ## avoid a long running time. fo <- sample(rep(seq(10), length = nrow(data))) ex1 <- flexmix(y ~ ., data = data, k = 2, cluster = z, model = FLXMRglmnet(foldid = fo), control = list(iter.max = 2)) parameters(ex1) } \keyword{regression} \keyword{cluster} flexmix/man/FLXcomponent-class.Rd0000644000175100001440000000147012455415610016472 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXcomponent-class.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXcomponent-class} \docType{class} \alias{FLXcomponent-class} \alias{show,FLXcomponent-method} \title{Class "FLXcomponent"} \description{A fitted component of a \code{\link{flexmix}} model.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("FLXcomponent", ...)}. } \section{Slots}{ \describe{ \item{\code{df}:}{Number of parameters used by the component.} \item{\code{logLik}:}{Function computing the log-likelihood of observations.} \item{\code{parameters}:}{List with model parameters.} \item{\code{predict}:}{Function predicting response for new data.} } } \author{Friedrich Leisch and Bettina Gruen} \keyword{classes} flexmix/man/FLXconcomitant.Rd0000644000175100001440000000177512455415610015713 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXconcomitant.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXP} \docType{class} \alias{FLXPconstant} \alias{FLXPmultinom} \alias{FLXconstant} \alias{FLXmultinom} \alias{show,FLXP-method} \title{Creates the Concomitant Variable Model} \description{ Creator functions for the concomitant variable model. \code{FLXPconstant} specifies constant priors and \code{FLXPmultinom} multinomial logit models for the priors. } \usage{ FLXPconstant() FLXPmultinom(formula = ~1) } \arguments{ \item{formula}{A formula for determining the model matrix of the concomitant variables.} } \details{ \code{FLXPmultinom} uses \code{nnet.default} from \pkg{nnet} to fit the multinomial logit model. } \value{ Object of class \code{FLXP}. \code{FLXPmultinom} returns an object of class \code{FLXPmultinom} which extends class \code{FLXP} directly and is used for method dispatching. } \author{Friedrich Leisch and Bettina Gruen} \keyword{models} flexmix/man/fabricfault.Rd0000644000175100001440000000227312455415610015277 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: fabricfault.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{fabricfault} \alias{fabricfault} \docType{data} \title{Fabric Faults} \description{ Number of faults in rolls of a textile fabric. } \usage{data("fabricfault")} \format{ A data frame with 32 observations on the following 2 variables. \describe{ \item{Length}{Length of role (m).} \item{Faults}{Number of faults.} } } \source{ G. McLachlan and D. Peel. \emph{Finite Mixture Models}, 2000, John Wiley and Sons Inc. \url{http://www.maths.uq.edu.au/~gjm/DATA/mmdata.html} } \references{ A. F. Bissell. A Negative Binomial Model with Varying Element Sizes \emph{Biometrika}, \bold{59}, 435--441, 1972. M. Aitkin. A general maximum likelihood analysis of overdispersion in generalized linear models. \emph{Statistics and Computing}, \bold{6}, 251--262, 1996. } \examples{ data("fabricfault", package = "flexmix") fabricMix <- initFlexmix(Faults ~ 1, data = fabricfault, k = 2, model = FLXMRglmfix(family = "poisson", fixed = ~ log(Length)), nrep = 5) } \keyword{datasets} flexmix/man/FLXMRcondlogit.Rd0000644000175100001440000000435613425241102015603 0ustar hornikusers\name{FLXMRcondlogit} \alias{FLXMRcondlogit} \title{FlexMix Interface to Conditional Logit Models} \description{ Model driver for fitting mixtures of conditional logit models. } \usage{ FLXMRcondlogit(formula = . ~ ., strata) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Default is to use the original \code{\link{flexmix}} model formula.} \item{strata}{A formula which is interpreted such that no intercept is fitted and which allows to determine the variable indicating which observations are from the same stratum.} } \details{ The M-step is performed using \code{coxph.fit}. } \value{ Returns an object of class \code{FLXMRcondlogit}. } \references{ Bettina Gruen and Friedrich Leisch. Identifiability of finite mixtures of multinomial logit models with varying and fixed effects. \emph{Journal of Classification}, \bold{25}, 225--247. 2008. } \author{ Bettina Gruen } \section{Warning}{ To ensure identifiability repeated measurements are necessary. Sufficient conditions are given in Gruen and Leisch (2008). } \seealso{\code{\link{FLXMRmultinom}}} \examples{ if (require("Ecdat")) { data("Catsup", package = "Ecdat") ## To reduce the time needed for the example only a subset is used Catsup <- subset(Catsup, id \%in\% 1:100) Catsup$experiment <- seq_len(nrow(Catsup)) vnames <- c("display", "feature", "price") Catsup_long <- reshape(Catsup, idvar = c("id", "experiment"), times = c(paste("heinz", c(41, 32, 28), sep = ""), "hunts32"), timevar = "brand", varying = matrix(colnames(Catsup)[2:13], nrow = 3, byrow = TRUE), v.names = vnames, direction = "long") Catsup_long$selected <- with(Catsup_long, choice == brand) Catsup_long <- Catsup_long[, c("id", "selected", "experiment", vnames, "brand")] Catsup_long$brand <- relevel(factor(Catsup_long$brand), "hunts32") set.seed(0808) flx1 <- flexmix(selected ~ display + feature + price + brand | id, model = FLXMRcondlogit(strata = ~ experiment), data = Catsup_long, k = 1) } } \keyword{regression} \keyword{models} flexmix/man/flexmix-internal.Rd0000644000175100001440000000732213673623016016307 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: flexmix-internal.Rd 5184 2020-06-20 18:27:29Z gruen $ % \name{flexmix-internal} \alias{FLXgetModelmatrix} \alias{FLXcheckComponent} \alias{FLXcheckComponent,FLXM-method} \alias{FLXcheckComponent,FLXMRfix-method} \alias{FLXdeterminePostunscaled} \alias{FLXdeterminePostunscaled,FLXM-method} \alias{FLXdeterminePostunscaled,FLXMRfix-method} \alias{FLXdeterminePostunscaled,FLXMRlmc-method} \alias{FLXdeterminePostunscaled,FLXMRlmmc-method} \alias{FLXdeterminePostunscaled,FLXMRcondlogit-method} \alias{FLXgetK} \alias{FLXgetK,FLXM-method} \alias{FLXgetK,FLXMRfix-method} \alias{FLXgetModelmatrix} \alias{FLXgetModelmatrix,FLXM-method} \alias{FLXgetModelmatrix,FLXMCsparse-method} \alias{FLXgetModelmatrix,FLXMCmvcombi-method} \alias{FLXgetModelmatrix,FLXMRcondlogit-method} \alias{FLXgetModelmatrix,FLXMRfix-method} \alias{FLXgetModelmatrix,FLXMRlmc-method} \alias{FLXgetModelmatrix,FLXMRlmmc-method} \alias{FLXgetModelmatrix,FLXMRmgcv-method} \alias{FLXgetModelmatrix,FLXMRrobglm-method} \alias{FLXgetModelmatrix,FLXMRziglm-method} \alias{FLXgetModelmatrix,FLXP-method} \alias{FLXgetObs} \alias{FLXgetObs,FLXM-method} \alias{FLXgetObs,FLXMRfix-method} \alias{FLXgetObs,FLXMRlmc-method} \alias{FLXmstep} \alias{FLXmstep,FLXM-method} \alias{FLXmstep,FLXMCmvcombi-method} \alias{FLXmstep,FLXMRcondlogit-method} \alias{FLXmstep,FLXMRfix-method} \alias{FLXmstep,FLXMRlmc-method} \alias{FLXmstep,FLXMRlmcfix-method} \alias{FLXmstep,FLXMRlmmc-method} \alias{FLXmstep,FLXMRlmmcfix-method} \alias{FLXmstep,FLXMRmgcv-method} \alias{FLXmstep,FLXMRrobglm-method} \alias{FLXmstep,FLXMRziglm-method} \alias{FLXremoveComponent} \alias{FLXremoveComponent,FLXM-method} \alias{FLXremoveComponent,FLXMRfix-method} \alias{FLXremoveComponent,FLXMRrobglm-method} \alias{FLXremoveComponent,FLXMRziglm-method} \alias{FLXMRglm-class} \alias{FLXR-class} \alias{FLXRMRglm-class} \alias{FLXRPmultinom-class} \alias{summary.flexmix-class} \alias{posterior,FLXM,listOrdata.frame-method} \alias{FLXMRfix-class} \alias{FLXMRglmfix-class} \alias{FLXRMRglmfix-class} \alias{predict,FLXMRglmfix-method} \alias{fitted,FLXMRglmfix-method} \alias{summary,FLXRMRglmfix-method} \alias{listOrdata.frame-class} \alias{refit_optim} \alias{refit_optim,FLXM-method} \alias{refit_optim,FLXMC-method} \alias{refit_optim,FLXMRglm-method} \alias{refit_optim,FLXMRziglm-method} \alias{refit_optim,FLXP-method} \alias{FLXgetDesign} \alias{FLXgetDesign,FLXM-method} \alias{FLXgetDesign,FLXMRglmfix-method} \alias{FLXgetDesign,FLXMRziglm-method} \alias{FLXgetParameters} \alias{FLXgetParameters,FLXdist-method} \alias{FLXgetParameters,FLXM-method} \alias{FLXgetParameters,FLXMC-method} \alias{FLXgetParameters,FLXMRglm-method} \alias{FLXgetParameters,FLXP-method} \alias{FLXgetParameters,FLXPmultinom-method} \alias{FLXreplaceParameters} \alias{FLXreplaceParameters,FLXdist-method} \alias{FLXreplaceParameters,FLXM-method} \alias{FLXreplaceParameters,FLXMC-method} \alias{FLXreplaceParameters,FLXMRglm-method} \alias{FLXreplaceParameters,FLXP-method} \alias{FLXreplaceParameters,FLXPmultinom-method} \alias{FLXlogLikfun} \alias{FLXlogLikfun,flexmix-method} \alias{FLXgradlogLikfun} \alias{FLXgradlogLikfun,flexmix-method} \alias{FLXgradlogLikfun,FLXM-method} \alias{FLXgradlogLikfun,FLXMRglm-method} \alias{FLXgradlogLikfun,FLXP-method} \alias{existGradient} \alias{existGradient,FLXM-method} \alias{existGradient,FLXMRglm-method} \alias{existGradient,FLXMRcondlogit-method} \alias{existGradient,FLXMRglmfix-method} \alias{existGradient,FLXMRmultinom-method} \alias{existGradient,FLXP-method} \title{Internal FlexMix Functions} \description{ Internal flexmix functions, methods and classes. } \details{ These are not to be called by the user. } \keyword{internal} flexmix/man/FLXbclust.Rd0000644000175100001440000000233312455415610014660 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXbclust.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXMCmvbinary} \alias{FLXMCmvbinary} \alias{FLXbclust} \title{FlexMix Binary Clustering Driver} \description{ This is a model driver for \code{\link{flexmix}} implementing model-based clustering of binary data. } \usage{ FLXMCmvbinary(formula = . ~ ., truncated = FALSE) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Only the left-hand side (response) of the formula is used. Default is to use the original \code{\link{flexmix}} model formula.} \item{truncated}{logical, if \code{TRUE} the observations for the pattern with only zeros are missing and the truncated likelihood is optimized using an EM-algorithm.} } \details{ This model driver can be used to cluster binary data. The only parameter is the column-wise mean of the data, which equals the probability of observing a 1. } \value{ \code{FLXMCmvbinary} returns an object of class \code{FLXMC}. } \author{Friedrich Leisch and Bettina Gruen} \seealso{\code{\link{flexmix}}} \keyword{cluster} flexmix/man/FLXMCfactanal.Rd0000644000175100001440000000452612455415610015363 0ustar hornikusers\name{FLXMCfactanal} \alias{FLXMCfactanal} \alias{rFLXM,FLXMCfactanal,FLXcomponent-method} \title{Driver for Mixtures of Factor Analyzers} \description{ This driver for \code{\link{flexmix}} implements estimation of mixtures of factor analyzers using ML estimation of factor analysis implemented in \code{factanal} in each M-step. } \usage{ FLXMCfactanal(formula = . ~ ., factors = 1, ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Only the left-hand side (response) of the formula is used. Default is to use the original \code{\link{flexmix}} model formula.} \item{factors}{Integer specifying the number of factors in each component.} \item{\dots}{Passed to \code{factanal}} } \value{ \code{FLXMCfactanal} returns an object of class \code{FLXM}. } \references{ G. McLachlan and D. Peel. \emph{Finite Mixture Models}, 2000. John Wiley and Sons Inc. } \author{Bettina Gruen} \section{Warning}{ This does not implement the AECM framework presented in McLachlan and Peel (2000, p.245), but uses the available functionality in R for ML estimation of factor analyzers. The implementation therefore is only experimental and has not been well tested. Please note that in general a good initialization is crucial for the EM algorithm to converge to a suitable solution for this model class. } \seealso{\code{\link{flexmix}}} \examples{ ## Reproduce (partly) Table 8.1. p.255 (McLachlan and Peel, 2000) if (require("gclus")) { data("wine", package = "gclus") wine_data <- as.matrix(wine[,-1]) set.seed(123) wine_fl_diag <- initFlexmix(wine_data ~ 1, k = 3, nrep = 10, model = FLXMCmvnorm(diagonal = TRUE)) wine_fl_fact <- lapply(1:4, function(q) flexmix(wine_data ~ 1, model = FLXMCfactanal(factors = q, nstart = 3), cluster = posterior(wine_fl_diag))) sapply(wine_fl_fact, logLik) ## FULL set.seed(123) wine_full <- initFlexmix(wine_data ~ 1, k = 3, nrep = 10, model = FLXMCmvnorm(diagonal = FALSE)) logLik(wine_full) ## TRUE wine_true <- flexmix(wine_data ~ 1, cluster = wine$Class, model = FLXMCmvnorm(diagonal = FALSE)) logLik(wine_true) } } \keyword{models} flexmix/man/FLXfit.Rd0000644000175100001440000000227012455415610014146 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXfit.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXfit} \alias{FLXfit} \alias{FLXfit,list-method} \title{Fitter Function for FlexMix Models} \description{ This is the basic computing engine called by \code{\link{flexmix}}, it should usually not be used directly. } \usage{ FLXfit(model, concomitant, control, postunscaled = NULL, groups, weights) } \arguments{ \item{model}{List of \code{FLXM} objects.} \item{concomitant}{Object of class \code{FLXP}.} \item{control}{Object of class \code{FLXcontrol}.} \item{weights}{A numeric vector of weights to be used in the fitting process.} \item{postunscaled}{Initial a-posteriori probabilities of the observations at the start of the EM algorithm.} \item{groups}{List with components \code{group} which is a factor with optional grouping of observations and \code{groupfirst} which is a logical vector for the first observation of each group.} } \value{ Returns an object of class \code{flexmix}. } \author{Friedrich Leisch and Bettina Gruen} \seealso{\code{\link{flexmix}}, \code{\link{flexmix-class}}} \keyword{regression} \keyword{cluster} flexmix/man/FLXcontrol-class.Rd0000644000175100001440000000333412455415610016151 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXcontrol-class.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXcontrol-class} \docType{class} \alias{FLXcontrol-class} \alias{coerce,list,FLXcontrol-method} \alias{coerce,NULL,FLXcontrol-method} \title{Class "FLXcontrol"} \description{Hyperparameters for the EM algorithm.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("FLXcontrol", ...)}. In addition, named lists can be coerced to \code{FLXcontrol} objects, names are completed if unique (see examples). } \section{Slots}{ \describe{ \item{\code{iter.max}:}{Maximum number of iterations.} \item{\code{minprior}:}{Minimum prior probability of clusters, components falling below this threshold are removed during the iteration.} \item{\code{tolerance}:}{The EM algorithm is stopped when the (relative) change of log-likelihood is smaller than \code{tolerance}.} \item{\code{verbose}:}{If a positive integer, then the log-likelihood is reported every \code{verbose} iterations. If 0, no output is generated during model fitting.} \item{\code{classify}:}{Character string, one of \code{"auto"}, \code{"weighted"}, \code{"hard"} (or \code{"CEM"}), \code{"random"} or (\code{"SEM"}).} \item{\code{nrep}:}{Reports the number of random initializations used in \code{\link{stepFlexmix}()} to determine the mixture.} } Run \code{new("FLXcontrol")} to see the default settings of all slots. } \author{Friedrich Leisch and Bettina Gruen} \keyword{classes} \examples{ ## have a look at the defaults new("FLXcontrol") ## corce a list mycont <- list(iter = 200, tol = 0.001, class = "r") as(mycont, "FLXcontrol") } flexmix/man/logLik-methods.Rd0000644000175100001440000000105412455415610015673 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: logLik-methods.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{logLik-methods} \docType{methods} \title{Methods for Function logLik in Package \pkg{flexmix}} \alias{logLik,flexmix-method} \alias{logLik,stepFlexmix-method} \description{Evaluate the log-likelihood. This function is defined as an S4 generic in the \code{stats4} package.} \section{Methods}{ \describe{ \item{object = flexmix}{Evaluate the log-likelihood of an \code{flexmix} object} } } \keyword{methods} flexmix/man/FLXdist-class.Rd0000644000175100001440000000464312455415610015440 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXdist-class.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXdist-class} \docType{class} \alias{FLXdist-class} \alias{predict,FLXdist-method} \alias{predict,FLXM-method} \alias{predict,FLXMRglm-method} \alias{predict,FLXMRmgcv-method} \alias{parameters,FLXdist-method} \alias{prior} \alias{prior,FLXdist-method} \title{Class "FLXdist"} \description{ Objects of class \code{FLXdist} represent unfitted finite mixture models. } \usage{ \S4method{parameters}{FLXdist}(object, component = NULL, model = NULL, which = c("model", "concomitant"), simplify = TRUE, drop = TRUE) \S4method{predict}{FLXdist}(object, newdata = list(), aggregate = FALSE, ...) } \arguments{ \item{object}{An object of class "FLXdist".} \item{component}{Number of component(s), if \code{NULL} all components are returned.} \item{model}{Number of model(s), if \code{NULL} all models are returned.} \item{which}{Specifies if the parameters of the component specific model or the concomitant variable model are returned.} \item{simplify}{Logical, if \code{TRUE} the returned values are simplified to a vector or matrix if possible.} \item{drop}{Logical, if \code{TRUE} the function tries to simplify the return object by omitting lists of length one.} \item{newdata}{Dataframe containing new data.} \item{aggregate}{Logical, if \code{TRUE} then the predicted values for each model aggregated over the components are returned.} \item{\dots}{Passed to the method of the model class.} } \section{Slots}{ \describe{ \item{model}{List of \code{FLXM} objects.} \item{prior}{Numeric vector with prior probabilities of clusters.} \item{components}{List describing the components using \code{FLXcomponent} objects.} \item{\code{concomitant}:}{Object of class \code{"FLXP"}.} \item{formula}{Object of class \code{"formula"}.} \item{call}{The function call used to create the object.} \item{k}{Number of clusters.} } } \section{Accessor Functions}{ The following functions should be used for accessing the corresponding slots: \describe{ \item{\code{parameters}:}{The parameters for each model and component, return value depends on the model.} \item{\code{prior}:}{Numeric vector of prior class probabilities/component weights} } } \author{Friedrich Leisch and Bettina Gruen} \seealso{\code{FLXdist}} \keyword{classes} flexmix/man/KLdiv.Rd0000644000175100001440000000532412455415610014026 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: KLdiv.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{KLdiv} \alias{KLdiv,matrix-method} \alias{KLdiv,flexmix-method} \alias{KLdiv,FLXMRglm-method} \alias{KLdiv,FLXMC-method} \title{Kullback-Leibler Divergence} \description{ Estimate the Kullback-Leibler divergence of several distributions.} \usage{ \S4method{KLdiv}{matrix}(object, eps = 10^-4, overlap = TRUE,...) \S4method{KLdiv}{flexmix}(object, method = c("continuous", "discrete"), ...) } \arguments{ \item{object}{See Methods section below.} \item{method}{The method to be used; "continuous" determines the Kullback-Leibler divergence between the unweighted theoretical component distributions and the unweighted posterior probabilities at the observed points are used by "discrete".} \item{eps}{Probabilities below this threshold are replaced by this threshold for numerical stability.} \item{overlap}{Logical, do not determine the KL divergence for those pairs where for each point at least one of the densities has a value smaller than \code{eps}.} \item{...}{Passed to the matrix method.} } \section{Methods}{ \describe{ \item{object = "matrix":}{Takes as input a matrix of density values with one row per observation and one column per distribution.} \item{object = "flexmix":}{Returns the Kullback-Leibler divergence of the mixture components.} }} \details{ Estimates \deqn{\int f(x) (\log f(x) - \log g(x)) dx} for distributions with densities \eqn{f()} and \eqn{g()}. } \value{ A matrix of KL divergences where the rows correspond to using the respective distribution as \eqn{f()} in the formula above. } \note{ The density functions are modified to have equal support. A weight of at least \code{eps} is given to each observation point for the modified densities. } \keyword{methods} \author{Friedrich Leisch and Bettina Gruen} \references{ S. Kullback and R. A. Leibler. On information and sufficiency.\emph{The Annals of Mathematical Statistics}, \bold{22}(1), 79--86, 1951. Friedrich Leisch. Exploring the structure of mixture model components. In Jaromir Antoch, editor, Compstat 2004--Proceedings in Computational Statistics, 1405--1412. Physika Verlag, Heidelberg, Germany, 2004. ISBN 3-7908-1554-3. } \examples{ ## Gaussian and Student t are much closer to each other than ## to the uniform: x <- seq(-3, 3, length = 200) y <- cbind(u = dunif(x), n = dnorm(x), t = dt(x, df = 10)) matplot(x, y, type = "l") KLdiv(y) if (require("mlbench")) { set.seed(2606) x <- mlbench.smiley()$x model1 <- flexmix(x ~ 1, k = 9, model = FLXmclust(diag = FALSE), control = list(minprior = 0)) plotEll(model1, x) KLdiv(model1) } }flexmix/man/relabel.Rd0000644000175100001440000000357312455415610014427 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: posterior.Rd 3937 2008-03-28 14:56:01Z leisch $ % \name{relabel} \alias{relabel} \alias{relabel,FLXdist,missing-method} \alias{relabel,FLXdist,character-method} \alias{relabel,FLXdist,integer-method} \title{Relabel the Components} \description{ The components are sorted by the value of one of the parameters or according to an integer vector containing the permutation of the numbers from 1 to the number of components. } \usage{ relabel(object, by, ...) \S4method{relabel}{FLXdist,character}(object, by, which = NULL, ...) } \arguments{ \item{object}{An object of class \code{"flexmix"}.} \item{by}{If a character vector, it needs to be one of \code{"prior"}, \code{"model"}, \code{"concomitant"} indicating if the parameter should be from the component-specific or the concomitant variable model. If an integer vector it indicates how the components should be sorted. If missing, the components are sorted by component size.} \item{which}{Name (or unique substring) of a parameter if \code{by} is equal to "model" or "concomitant".} \item{\dots}{Currently not used.} } \author{Friedrich Leisch and Bettina Gruen} \keyword{methods} \examples{ set.seed(123) beta <- matrix(1:16, ncol = 4) beta df1 <- ExLinear(beta, n = 100, sd = .5) f1 <- flexmix(y~., data = df1, k = 4) ## There was label switching, parameters are not in the same order ## as in beta: round(parameters(f1)) betas <- rbind(beta, .5) betas ## This makes no sense: summary(abs(as.vector(betas-parameters(f1)))) ## We relabel the components by sorting the coefficients of x1: r1 <- relabel(f1, by = "model", which = "x1") round(parameters(r1)) ## Now we can easily compare the fit with the true parameters: summary(abs(as.vector(betas-parameters(r1)))) } flexmix/man/FLXMRlmmc.Rd0000644000175100001440000000274612455415610014563 0ustar hornikusers\name{FLXMRlmmc} \alias{FLXMRlmmc} \alias{FLXMRlmmc-class} \alias{FLXMRlmmcfix-class} \alias{FLXMRlmc-class} \alias{FLXMRlmcfix-class} \alias{predict,FLXMRlmc-method} \title{FlexMix Interface to Linear Mixed Models with Left-Censoring} \description{ This is a driver which allows fitting of mixtures of linear models with random effects and left-censored observations. } \usage{ FLXMRlmmc(formula = . ~ ., random, censored, varFix, eps = 10^-6, ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{flexmix} using \code{\link{update.formula}}. Default is to use the original \code{flexmix} model formula.} \item{random}{A formula for specifying the random effects. If missing no random effects are fitted.} \item{varFix}{If random effects are specified a named logical vector of length 2 indicating if the variance of the random effects and the residuals are fixed over the components. Otherwise a logical indicating if the variance of the residuals are fixed over the components.} \item{censored}{A formula for specifying the censoring variable.} \item{eps}{Observations with an a-posteriori probability smaller or equal to \code{eps} are omitted in the M-step.} \item{\dots}{Additional arguments to be passed to \code{lm.wfit}.} } \value{ Returns an object of class \code{FLXMRlmmc}, \code{FLXMRlmmcfix}, \code{FLXMRlmc} or \code{FLXMRlmcfix}. } \author{Bettina Gruen} \keyword{models} flexmix/man/FLXdist.Rd0000644000175100001440000000255612455415610014336 0ustar hornikusers\name{FLXdist} \alias{FLXdist} \alias{simulate,FLXdist-method} \alias{show,FLXdist-method} \title{Finite Mixtures of Distributions} \description{ Constructs objects of class \code{FLXdist} which represent unfitted finite mixture models. } \usage{ FLXdist(formula, k = NULL, model = FLXMRglm(), components, concomitant = FLXPconstant()) } \arguments{ \item{formula}{A symbolic description of the model to be fit. The general form is \code{~x|g} where \code{x} is the set of predictors and \code{g} an optional grouping factor for repeated measurements.} \item{k}{Integer specifying the number of cluster or a numeric vector of length equal to the length of components, specifying the prior probabilities of clusters.} \item{model}{Object of class \code{FLXM} or a list of \code{FLXM} objects. Default is the object returned by calling \code{FLXMRglm()}.} \item{components}{A list of length equal to the number of components containing a list of length equal to the number of models which again contains a list of named elements for defining the parameters of the component-specific model.} \item{concomitant}{Object of class \code{FLXconcomitant} specifying the model for concomitant variables.} } \value{ Returns an object of class \code{FLXdist}. } \author{Bettina Gruen} \seealso{\code{FLXdist-class}} \keyword{utilities} flexmix/man/refit.Rd0000644000175100001440000001204613074144537014132 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: refit.Rd 5115 2017-04-07 08:18:13Z gruen $ % \name{refit-methods} \alias{refit,flexmix-method} \alias{FLXRmstep-class} \alias{FLXRoptim-class} \alias{show,FLXR-method} \alias{show,Coefmat-method} \alias{summary,FLXRoptim-method} \alias{summary,FLXRmstep-method} \alias{plot,FLXRoptim,missing-method} \title{Refit a Fitted Model} \description{ Refits an estimated flexmix model to obtain additional information like coefficient significance p-values for GLM regression. } \usage{ \S4method{refit}{flexmix}(object, newdata, method = c("optim", "mstep"), ...) \S4method{summary}{FLXRoptim}(object, model = 1, which = c("model", "concomitant"), ...) \S4method{summary}{FLXRmstep}(object, model = 1, which = c("model", "concomitant"), ...) \S4method{plot}{FLXRoptim,missing}(x, y, model = 1, which = c("model", "concomitant"), bycluster = TRUE, alpha = 0.05, components, labels = NULL, significance = FALSE, xlab = NULL, ylab = NULL, ci = TRUE, scales = list(), as.table = TRUE, horizontal = TRUE, ...) } \arguments{ \item{object}{An object of class \code{"flexmix"}} \item{newdata}{Optional new data.} \item{method}{Specifies if the variance covariance matrix is determined using \code{\link{optim}} or if the posteriors are assumed as given and an M-step is performed.} \item{model}{The model (for a multivariate response) that shall be used.} \item{which}{Specifies if a component specific model or the concomitant variable model is used.} \item{x}{An object of class \code{"FLXRoptim"}} \item{y}{Missing object.} \item{bycluster}{A logical if the parameters should be group by cluster or by variable.} \item{alpha}{Numeric indicating the significance level.} \item{components}{Numeric vector specifying which components are plotted. The default is to plot all components.} \item{labels}{Character vector specifying the variable names used.} \item{significance}{A logical indicating if non-significant coefficients are shaded in a lighter grey.} \item{xlab}{String for the x-axis label.} \item{ylab}{String for the y-axis label.} \item{ci}{A logical indicating if significant and insignificant parameter estimates are shaded differently.} \item{scales}{See argument of the same name for function \code{\link[lattice]{xyplot}}.} \item{as.table}{See arguments of the same name for function \code{\link[lattice]{xyplot}}.} \item{horizontal}{See arguments of the same name for function \code{\link[lattice]{xyplot}}.} \item{\dots}{Currently not used} } \value{ An object inheriting form class \code{FLXR} is returned. For the method using \code{optim} the object has class \code{FLXRoptim} and for the M-step method it has class \code{FLXRmstep}. Both classes give similar results for their \code{summary} methods. Objects of class \code{FLXRoptim} have their own \code{plot} method. \code{Lapply} can be used to further analyse the refitted component specific models of objects of class \code{FLXRmstep}. } \details{ The \code{refit} method for \code{FLXMRglm} models in combination with the \code{summary} method can be used to obtain the usual tests for significance of coefficients. Note that the tests are valid only if \code{flexmix} returned the maximum likelihood estimator of the parameters. If \code{refit} is used with \code{method = "mstep"} for these component specific models the returned object contains a \code{glm} object for each component where the elements \code{model} which is the model frame and \code{data} which contains the original dataset are missing. } \keyword{methods} \author{Friedrich Leisch and Bettina Gruen} \references{ Friedrich Leisch. FlexMix: A general framework for finite mixture models and latent class regression in R. \emph{Journal of Statistical Software}, \bold{11}(8), 2004. doi:10.18637/jss.v011.i08 } \section{Warning}{ For \code{method = "mstep"} the standard deviations are determined separately for each of the components using the a-posteriori probabilities as weights without accounting for the fact that the components have been simultaneously estimated. The derived standard deviations are hence approximative and should only be used in an exploratory way, as they are underestimating the uncertainty given that the missing information of the component memberships are replaced by the expected values. The \code{newdata} argument can only be specified when using \code{method = "mstep"} for refitting \code{FLXMRglm} components. A variant of \code{glm} for weighted ML estimation is used for fitting the components and full \code{glm} objects are returned. Please note that in this case the data and the model frame are stored for each component which can significantly increase the object size. } \examples{ data("NPreg", package = "flexmix") ex1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2) ex1r <- refit(ex1) ## in one component all coefficients should be highly significant, ## in the other component only the linear term summary(ex1r) } flexmix/man/FLXglm.Rd0000644000175100001440000000255413074144537014155 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXglm.Rd 5115 2017-04-07 08:18:13Z gruen $ % \name{FLXMRglm} \alias{FLXMRglm} \alias{FLXglm} \title{FlexMix Interface to Generalized Linear Models} \description{ This is the main driver for FlexMix interfacing the \code{\link{glm}} family of models. } \usage{ FLXMRglm(formula = . ~ ., family = c("gaussian", "binomial", "poisson", "Gamma"), offset = NULL) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Default is to use the original \code{\link{flexmix}} model formula.} \item{family}{A character string naming a \code{\link{glm}} family function.} \item{offset}{This can be used to specify an \emph{a priori} known component to be included in the linear predictor during fitting.} } \details{ See \code{\link{flexmix}} for examples. } \value{ Returns an object of class \code{FLXMRglm}. } \author{Friedrich Leisch and Bettina Gruen} \references{ Friedrich Leisch. FlexMix: A general framework for finite mixture models and latent class regression in R. \emph{Journal of Statistical Software}, \bold{11}(8), 2004. doi:10.18637/jss.v011.i08 } \seealso{\code{\link{flexmix}}, \code{\link{glm}}} \keyword{regression} \keyword{models} flexmix/man/FLXMRmultinom.Rd0000644000175100001440000000216612010532150015455 0ustar hornikusers\name{FLXMRmultinom} \alias{FLXMRmultinom} \title{FlexMix Interface to Multiomial Logit Models} \description{ Model driver for fitting mixtures of multinomial logit models. } \usage{ FLXMRmultinom(formula = . ~ ., ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Default is to use the original \code{\link{flexmix}} model formula.} \item{\dots}{Additional arguments to be passed to \code{nnet.default}.} } \details{ The M-step is performed using \code{nnet.default}. } \value{ Returns an object of class \code{FLXMRmultinom}. } \references{ Bettina Gruen and Friedrich Leisch. Identifiability of finite mixtures of multinomial logit models with varying and fixed effects. \emph{Journal of Classification}, \bold{25}, 225--247. 2008. } \author{ Bettina Gruen } \section{Warning}{ To ensure identifiability repeated measurements are necessary. Sufficient conditions are given in Gruen and Leisch (2008). } \seealso{\code{\link{FLXMRcondlogit}}} \keyword{regression} \keyword{models} flexmix/man/betablocker.Rd0000644000175100001440000000276612455415610015301 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: betablocker.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{betablocker} \alias{betablocker} \docType{data} \title{Clinical Trial of Beta-Blockers} \description{ 22-centre clinical trial of beta-blockers for reducing mortality after myocardial infarction. } \usage{data("betablocker")} \format{ A data frame with 44 observations on the following 4 variables. \describe{ \item{Deaths}{Number of deaths.} \item{Total}{Total number of patients.} \item{Center}{Number of clinical centre.} \item{Treatment}{A factor with levels \code{Control} and \code{Treated}.} } } \source{ G. McLachlan and D. Peel. \emph{Finite Mixture Models}, 2000. John Wiley and Sons Inc. \url{http://www.maths.uq.edu.au/~gjm/DATA/mmdata.html} } \references{ M. Aitkin. Meta-analysis by random effect modelling in generalized linear models. \emph{Statistics in Medicine}, \bold{18}, 2343--2351, 1999. S. Yusuf, R. Peto, J. Lewis, R. Collins and P. Sleight. Beta blockade during and after myocardial infarction: an overview of the randomized trials. \emph{Progress in Cardiovascular Diseases}, \bold{27}, 335--371, 1985. } \examples{ data("betablocker", package = "flexmix") betaMix <- initFlexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, data = betablocker, k = 3, nrep = 5, model = FLXMRglmfix(family = "binomial", fixed = ~Treatment)) } \keyword{datasets} flexmix/man/FLXMCmvcombi.Rd0000644000175100001440000000407612455415610015246 0ustar hornikusers% % Copyright (C) 2009 Friedrich Leisch and Bettina Gruen % $Id: FLXMCmvcombi.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXMCmvcombi} \alias{FLXMCmvcombi} \title{FlexMix Binary and Gaussian Clustering Driver} \description{ This is a model driver for \code{\link{flexmix}} implementing model-based clustering of a combination of binary and Gaussian data. } \usage{ FLXMCmvcombi(formula = . ~ .) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Only the left-hand side (response) of the formula is used. Default is to use the original \code{\link{flexmix}} model formula.} } \details{ This model driver can be used to cluster mixed-mode binary and Gaussian data. It checks which columns of a matrix contain only zero and ones, and does the same as \code{\link{FLXMCmvbinary}} for them. For the remaining columns of the data matrix independent Gaussian distributions are used (same as \code{\link{FLXMCmvnorm}} with \code{diagonal = FALSE}. The same could be obtained by creating a corresponding list of two models for the respective columns, but \code{FLXMCmvcombi} does a better job in reporting parameters. } \value{ \code{FLXMCmvcombi} returns an object of class \code{FLXMC}. } \author{Friedrich Leisch} \seealso{\code{\link{flexmix}}, \code{\link{FLXMCmvbinary}}, \code{\link{FLXMCmvnorm}}} \keyword{cluster} \examples{ ## create some artificial data x1 <- cbind(rnorm(300), sample(0:1, 300, replace = TRUE, prob = c(0.25, 0.75))) x2 <- cbind(rnorm(300, mean = 2, sd = 0.5), sample(0:1, 300, replace = TRUE, prob = c(0.75, 0.25))) x <- rbind(x1, x2) ## fit the model f1 <- flexmix(x ~ 1, k = 2, model = FLXMCmvcombi()) ## should be similar to the original parameters parameters(f1) table(clusters(f1), rep(1:2, c(300,300))) ## a column with noise should not hurt too much x <- cbind(x, rnorm(600)) f2 <- flexmix(x ~ 1, k = 2, model = FLXMCmvcombi()) parameters(f2) table(clusters(f2), rep(1:2, c(300,300))) } flexmix/man/group.Rd0000644000175100001440000000073312455415610014150 0ustar hornikusers\name{group} \docType{methods} \alias{group} \alias{group-methods} \alias{group,flexmix-method} \alias{group,FLXM-method} \alias{group,FLXMRglmfix-method} \title{Extract Grouping Variable} \description{ Extract grouping variable for all observations. } \usage{ \S4method{group}{flexmix}(object) \S4method{group}{FLXM}(object) \S4method{group}{FLXMRglmfix}(object) } \arguments{ \item{object}{an object of class \code{flexmix}.} } \keyword{methods} \author{Bettina Gruen} flexmix/man/FLXMRlmer.Rd0000644000175100001440000000757513431544512014576 0ustar hornikusers\name{FLXMRlmer} \alias{FLXMRlmer} \alias{FLXMRlmer-class} \alias{FLXMRlmm-class} \alias{FLXMRlmmfix-class} \alias{FLXdeterminePostunscaled,FLXMRlmer-method} \alias{FLXdeterminePostunscaled,FLXMRlmm-method} \alias{FLXmstep,FLXMRlmer-method} \alias{FLXmstep,FLXMRlmm-method} \alias{FLXgetModelmatrix,FLXMRlmer-method} \alias{FLXgetModelmatrix,FLXMRlmm-method} \alias{FLXMRlmm} \alias{FLXgetObs,FLXMRlmm-method} \alias{FLXmstep,FLXMRlmmfix-method} \alias{predict,FLXMRlmm-method} \alias{rFLXM,FLXMRlmm,FLXcomponent-method} \alias{rFLXM,FLXMRlmm,list-method} \alias{rFLXM,FLXMRlmc,FLXcomponent-method} \alias{rFLXM,FLXMRlmer,FLXcomponent-method} \title{FlexMix Interface to Linear Mixed Models} \description{ This is a driver which allows fitting of mixtures of linear models with random effects. } \usage{ FLXMRlmm(formula = . ~ ., random, lm.fit = c("lm.wfit", "smooth.spline"), varFix = c(Random = FALSE, Residual = FALSE), \dots) FLXMRlmer(formula = . ~ ., random, weighted = TRUE, control = list(), eps = .Machine$double.eps) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{flexmix} using \code{\link{update.formula}}. Default is to use the original \code{flexmix} model formula.} \item{random}{A formula for specifying the random effects.} \item{weighted}{A logical indicating if the model should be estimated with weighted ML.} \item{control}{A list of control parameters. See \code{\link[lme4]{lmer}} for details.} \item{eps}{Observations with a component-specific posterior smaller than \code{eps} are omitted in the M-step for this component.} \item{lm.fit}{A character string indicating if the coefficients should be fitted using either a linear model or the function \code{smooth.spline}} \item{varFix}{Named logical vector of length 2 indicating if the variance of the random effects and the residuals are fixed over the components.} \item{\dots}{Additional arguments to be passed to \code{smooth.spline}.} } \details{ \code{FLXMRlmm} allows only one random effect. \code{FLXMRlmer} allows an arbitrary number of random effects if \code{weighted = FALSE}; a certain structure of the model matrix of the random effects has to be given for weighted ML estimation, i.e. where \code{weighted = TRUE}. } \value{ Returns an object of class \code{FLXMRlmer} and \code{FLXMRlmm}. } \section{Warning}{ For \code{FLXMRlmer} the weighted ML estimation is only correct if the covariate matrix of the random effects is the same for each observation. By default weighted ML estimation is made and the condition on the covariate matrix of the random effects is checked. If this fails, only estimation with \code{weighted = FALSE} is possible which will maximize the classification likelihood. } \author{Bettina Gruen} \examples{ id <- rep(1:50, each = 10) x <- rep(1:10, 50) sample <- data.frame(y = rep(rnorm(unique(id)/2, 0, c(5, 2)), each = 10) + rnorm(length(id), rep(c(3, 8), each = 10)) + rep(c(0, 3), each = 10) * x, x = x, id = factor(id)) fitted <- flexmix(.~.|id, k = 2, model = FLXMRlmm(y ~ x, random = ~ 1), data = sample, control = list(tolerance = 10^-3), cluster = rep(rep(1:2, each = 10), 25)) parameters(fitted) fitted1 <- flexmix(.~.|id, k = 2, model = FLXMRlmer(y ~ x, random = ~ 1), data = sample, control = list(tolerance = 10^-3), cluster = rep(rep(1:2, each = 10), 25)) parameters(fitted1) fitted2 <- flexmix(.~.|id, k = 2, model = FLXMRlmm(y ~ 0 + x, random = ~ 1, lm.fit = "smooth.spline"), data = sample, control = list(tolerance = 10^-3), cluster = rep(rep(1:2, each = 10), 25)) parameters(fitted2) } \keyword{models} flexmix/man/BIC-methods.Rd0000644000175100001440000000105012455415610015043 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: BIC-methods.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{BIC-methods} \docType{methods} \title{Methods for Function BIC} \alias{BIC,flexmix-method} \alias{BIC,stepFlexmix-method} \description{Compute the Bayesian Information Criterion.} \section{Methods}{ \describe{ \item{object = flexmix:}{Compute the BIC of a \code{flexmix} object} \item{object = stepFlexmix:}{Compute the BIC of all models contained in the \code{stepFlexmix} object.} } } \keyword{methods} flexmix/man/plotEll.Rd0000644000175100001440000000253512455415610014431 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: plotEll.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{plotEll} \alias{plotEll} \title{Plot Confidence Ellipses for FLXMCmvnorm Results} \description{ Plot 50\% and 95\% confidence ellipses for mixtures of Gaussians fitted using \code{\link{FLXMCmvnorm}}. } \usage{ plotEll(object, data, which = 1:2, model = 1, project = NULL, points = TRUE, eqscale = TRUE, col = NULL, number = TRUE, cex = 1.5, numcol = "black", pch = NULL, ...) } \arguments{ \item{object}{An object of class \code{flexmix} with a fitted \code{FLXMCmvnorm} model.} \item{data}{The response variable in a data frame or as a matrix.} \item{which}{Index numbers of dimensions of (projected) input space to plot.} \item{model}{The model (for a multivariate response) that shall be plotted.} \item{project}{Projection object, currently only the result of \code{\link[stats]{prcomp}} is supported.} \item{points}{Logical, shall data points be plotted?} \item{eqscale}{Logical, plot using \code{\link[MASS]{eqscplot}}?} \item{number}{Logical, plot number labels at cluster centers?} \item{cex, numcol}{Size and color of number labels.} \item{pch, col, \dots}{Graphical parameters.} } \author{Friedrich Leisch and Bettina Gruen} \seealso{\code{\link{FLXMCmvnorm}}} \keyword{cluster} flexmix/man/ExNclus.Rd0000644000175100001440000000151312455415610014372 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: ExNclus.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{ExNclus} \alias{ExNclus} \alias{Nclus} \title{Artificial Example with 4 Gaussians} \description{ A simple artificial example for normal clustering with 4 latent classes, all of them having a Gaussian distribution. See the function definition for true means and covariances. } \usage{ ExNclus(n) data("Nclus") } \arguments{ \item{n}{Number of observations in the two small latent classes.} } \details{ The \code{Nclus} data set can be re-created by \code{ExNclus(100)} using \code{set.seed(2602)}, it has been saved as a data set for simplicity of examples only. } \examples{ data("Nclus", package = "flexmix") require("MASS") eqscplot(Nclus, col = rep(1:4, c(100, 100, 150, 200))) } \keyword{datasets} flexmix/man/salmonellaTA98.Rd0000644000175100001440000000342412455415610015551 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: salmonellaTA98.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{salmonellaTA98} \alias{salmonellaTA98} \title{Salmonella Reverse Mutagenicity Assay} \usage{data("salmonellaTA98")} \description{ Data on Ames Salmonella reverse mutagenicity assay. } \format{ This data frame contains the following columns: \describe{ \item{x}{Dose levels of quinoline.} \item{y}{Numbers of revertant colonies of TA98 Salmonella observed on each of three replicate plates tested at each of six dose levels of quinoline diameter.} } } \details{ This data set is taken from package \pkg{dispmod} provided by Luca Scrucca. } \source{ Margolin, B.J., Kaplan, N. and Zeiger, E. Statistical analysis of the Ames Salmonella/microsome test, \emph{Proc. Natl. Acad. Sci. USA}, \bold{76}, 3779--3783, 1981. } \references{ Breslow, N.E. Extra-Poisson variation in log-linear models, \emph{Applied Statistics}, \bold{33}, 38--44, 1984. Wang, P., Puterman, M.L., Cockburn, I.M., and Le, N.D. Mixed Poisson regression models with covariate dependent rates, \emph{Biometrics}, \bold{52}, 381--400, 1996. } \examples{ data("salmonellaTA98", package = "flexmix") salmonMix <- initFlexmix(y ~ 1, data = salmonellaTA98, model = FLXMRglmfix(family = "poisson", fixed = ~ x + log(x + 10)), k = 2, nrep = 5) salmonMix.pr <- predict(salmonMix, newdata = salmonellaTA98) plot(y ~ x, data = salmonellaTA98, pch = as.character(clusters(salmonMix)), ylim = range(c(salmonellaTA98$y, unlist(salmonMix.pr)))) for (i in 1:2) lines(salmonellaTA98$x, salmonMix.pr[[i]], lty = i) } \keyword{datasets} flexmix/man/FLXMCmvpois.Rd0000644000175100001440000000175712455415610015132 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXMCmvpois.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXMCmvpois} \alias{FLXMCmvpois} \title{FlexMix Poisson Clustering Driver} \description{ This is a model driver for \code{\link{flexmix}} implementing model-based clustering of Poisson distributed data. } \usage{ FLXMCmvpois(formula = . ~ .) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Only the left-hand side (response) of the formula is used. Default is to use the original \code{\link{flexmix}} model formula.} } \details{ This can be used to cluster Poisson distributed data where given the component membership the variables are mutually independent. } \value{ \code{FLXMCmvpois} returns an object of class \code{FLXMC}. } \author{Friedrich Leisch and Bettina Gruen} \seealso{\code{\link{flexmix}}} \keyword{cluster} flexmix/man/boot.Rd0000644000175100001440000000607312455415610013762 0ustar hornikusers\name{boot} \alias{boot} \alias{boot,flexmix-method} \alias{LR_test} \alias{LR_test,flexmix-method} \alias{boot,flexmix-method} \alias{show,FLXboot-method} \alias{FLXboot-class} \alias{plot,FLXboot,missing-method} \alias{parameters,FLXboot-method} \alias{clusters,FLXboot,listOrdata.frame-method} \alias{predict,FLXboot-method} \alias{posterior,FLXboot,listOrdata.frame-method} \title{Bootstrap a flexmix Object} \description{ Given a \code{flexmix} object perform parametric or empirical bootstrap. } \usage{ boot(object, ...) \S4method{boot}{flexmix}(object, R, sim = c("ordinary", "empirical", "parametric"), initialize_solution = FALSE, keep_weights = FALSE, keep_groups = TRUE, verbose = 0, control, k, model = FALSE, ...) LR_test(object, ...) \S4method{LR_test}{flexmix}(object, R, alternative = c("greater", "less"), control, ...) } \arguments{ \item{object}{A fitted finite mixture model of class \code{flexmix}.} \item{R}{The number of bootstrap replicates.} \item{sim}{A character string indicating the type of simulation required. Possible values are \code{"ordinary"} (the default), \code{"parametric"}, or \code{"empirical"}.} \item{initialize_solution}{A logical. If \code{TRUE} the EM algorithm is initialized in the given solution.} \item{keep_weights}{A logical. If \code{TRUE} the weights are kept.} \item{keep_groups}{A logical. If \code{TRUE} the groups are kept.} \item{verbose}{If a positive integer, then progress information is reported every \code{verbose} iterations. If 0, no output is generated during the bootstrap replications.} \item{control}{Object of class \code{FLXcontrol} or a named list. If missing the control of the fitted \code{object} is taken.} \item{k}{Vector of integers specifying for which number of components finite mixtures are fitted to the bootstrap samples. If missing the number of components of the fitted \code{object} are taken.} \item{alternative}{A character string specifying the alternative hypothesis, must be either \code{"greater"} (default) or \code{"less"} indicating if the alternative hypothesis is that the mixture has one more component or one less.} \item{model}{A logical. If \code{TRUE} the model and the weights slot for each sample are stored and returned.} \item{\dots}{Further arguments to be passed to or from methods.} } \value{ \code{boot} returns an object of class \code{FLXboot} which contains the fitted parameters, the fitted priors, the log likelihoods, the number of components of the fitted mixtures and the information if the EM algorithm has converged. \code{LR_test} returns an object of class \code{htest} containing the number of valid bootstrap replicates, the p-value, the - twice log likelihood ratio test statistics for the original data and the bootstrap replicates. } \author{Bettina Gruen} \examples{ data("NPreg", package = "flexmix") fitted <- initFlexmix(yn ~ x + I(x^2) | id2, data = NPreg, k = 2) \dontrun{ lrtest <- LR_test(fitted, alternative = "greater", R = 20, verbose = 1) } } \keyword{methods} flexmix/man/FLXmclust.Rd0000644000175100001440000000465313074144537014707 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXmclust.Rd 5115 2017-04-07 08:18:13Z gruen $ % \name{FLXMCmvnorm} \alias{FLXMCmvnorm} \alias{FLXMCnorm1} \alias{FLXmclust} \title{FlexMix Clustering Demo Driver} \description{ These are demo drivers for \code{\link{flexmix}} implementing model-based clustering of Gaussian data. } \usage{ FLXMCmvnorm(formula = . ~ ., diagonal = TRUE) FLXMCnorm1(formula = . ~ .) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Only the left-hand side (response) of the formula is used. Default is to use the original \code{\link{flexmix}} model formula.} \item{diagonal}{If \code{TRUE}, then the covariance matrix of the components is restricted to diagonal matrices.} } \details{ This is mostly meant as a demo for FlexMix driver programming, you should also look at package \pkg{mclust} for real applications. \code{FLXMCmvnorm} clusters multivariate data, \code{FLXMCnorm1} univariate data. In the latter case smart initialization is important, see the example below. } \value{ \code{FLXMCmvnorm} returns an object of class \code{FLXMC}. } \author{Friedrich Leisch and Bettina Gruen} \references{ Friedrich Leisch. FlexMix: A general framework for finite mixture models and latent class regression in R. \emph{Journal of Statistical Software}, \bold{11}(8), 2004. doi:10.18637/jss.v011.i08 } \seealso{\code{\link{flexmix}}} \keyword{cluster} \examples{ data("Nclus", package = "flexmix") require("MASS") eqscplot(Nclus) ## This model is wrong (one component has a non-diagonal cov matrix) ex1 <- flexmix(Nclus ~ 1, k = 4, model = FLXMCmvnorm()) print(ex1) plotEll(ex1, Nclus) ## True model, wrong number of components ex2 <- flexmix(Nclus ~ 1, k = 6, model = FLXMCmvnorm(diagonal = FALSE)) print(ex2) plotEll(ex2, Nclus) ## Get parameters of first component parameters(ex2, component = 1) ## Have a look at the posterior probabilies of 10 random observations ok <- sample(1:nrow(Nclus), 10) p <- posterior(ex2)[ok, ] p ## The following two should be the same max.col(p) clusters(ex2)[ok] \testonly{ stopifnot(all.equal(max.col(p), clusters(ex2)[ok])) } ## Now try the univariate case plot(density(Nclus[, 1])) ex3 <- flexmix(Nclus[, 1] ~ 1, cluster = cut(Nclus[, 1], 3), model = FLXMCnorm1()) ex3 parameters(ex3) } flexmix/man/whiskey.Rd0000644000175100001440000000300312455415610014470 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: whiskey.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{whiskey} \alias{whiskey} \alias{whiskey_brands} \docType{data} \title{Survey Data on Brands of Scotch whiskey Consumed} \description{ The data set is from Simmons Study of Media and Markets and contains the incidence matrix for scotch brands used in last year for those households who report consuming scotch. } \usage{data("whiskey")} \format{ A data frame \code{whiskey} with 484 observations on the following 2 variables. \describe{ \item{\code{Freq}}{a numeric vector} \item{\code{Incidence}}{a matrix with 21 columns} } Additional information on the brands is contained in the data frame \code{whiskey_brands} which is simultaneously loaded. This data frame contains 21 observations on the following 3 variables. \describe{ \item{\code{Brand}}{a character vector} \item{\code{Type}}{a factor with levels \code{Blend} \code{Single Malt}} \item{\code{Bottled}}{a factor with levels \code{Domestic} \code{Foreign}} } } \details{ The dataset is taken from the \pkg{bayesm} package. } \source{ Peter Rossi and Rob McCulloch. bayesm: Bayesian Inference for Marketing/Micro-econometrics. R package version 2.0-8, 2006. http://gsbwww.uchicago.edu/fac/peter.rossi/research/bsm.html } \references{ Edwards, Y. and G. Allenby. Multivariate Analysis of Multiple Response Data, \emph{Journal of Marketing Research}, \bold{40}, 321--334, 2003. } \keyword{datasets} flexmix/man/FLXMRmgcv.Rd0000644000175100001440000000376212106642335014565 0ustar hornikusers\name{FLXMRmgcv} \alias{FLXMRmgcv} \alias{FLXMRmgcv-class} \title{FlexMix Interface to GAMs} \description{ This is a driver which allows fitting of mixtures of GAMs. } \usage{ FLXMRmgcv(formula = . ~ ., family = c("gaussian", "binomial", "poisson"), offset = NULL, control = NULL, optimizer = c("outer", "newton"), in.out = NULL, eps = .Machine$double.eps, ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Default is to use the original \code{\link{flexmix}} model formula.} \item{family}{A character string naming a \code{\link{glm}} family function.} \item{offset}{This can be used to specify an \emph{a priori} known component to be included in the linear predictor during fitting.} \item{control}{A list of fit control parameters returned by \code{gam.control}.} \item{optimizer}{An array specifying the numerical optimization method to use to optimize the smoothing parameter estimation criterion; for more details see \code{\link[mgcv]{gam}}.} \item{in.out}{Optional list for initializing outer iteration; for more details see \code{\link[mgcv]{gam}}.} \item{eps}{Observations with an a-posteriori probability smaller or equal to \code{eps} are omitted in the M-step.} \item{\dots}{Additional arguments to be pased to the GAM fitter.} } \value{ Returns an object of class \code{FLXMRmgcv}. } \author{ Bettina Gruen } \seealso{ \code{\link{FLXMRglm}} } \examples{ set.seed(2012) x <- seq(0, 1, length.out = 100) z <- sample(0:1, length(x), replace = TRUE) y <- rnorm(length(x), ifelse(z, 5 * sin(x * 2 * pi), 10 * x - 5)) fitted_model <- flexmix(y ~ s(x), model = FLXMRmgcv(), cluster = z + 1, control = list(tolerance = 10^-3)) plot(y ~ x, col = clusters(fitted_model)) matplot(x, fitted(fitted_model), type = "l", add = TRUE) } \keyword{regression} \keyword{cluster} flexmix/man/EIC.Rd0000644000175100001440000000241412455415610013412 0ustar hornikusers% % Copyright (C) 2004-2009 Friedrich Leisch and Bettina Gruen % $Id: EIC.Rd 3912 2008-03-13 15:10:24Z gruen $ % \name{EIC} \alias{EIC} \alias{EIC,flexmix-method} \alias{EIC,stepFlexmix-method} \title{Entropic Measure Information Criterion} \description{ Compute the Entropic measure Information criterion for model selection. } \usage{ \S4method{EIC}{flexmix}(object, \dots) \S4method{EIC}{stepFlexmix}(object, \dots) } \arguments{ \item{object}{see Methods section below} \item{\dots}{Some methods for this generic function may take additional, optional arguments. At present none do.} } \section{Methods}{ \describe{ \item{object = "flexmix":}{Compute the EIC of a \code{flexmix} object.} \item{object = "stepFlexmix":}{Compute the EIC of all models contained in the \code{stepFlexmix} object.} }} \value{ Returns a numeric vector with the corresponding EIC value(s). } \keyword{methods} \author{Bettina Gruen} \references{ V. Ramaswamy, W. S. DeSarbo, D. J. Reibstein, and W. T. Robinson. An empirical pooling approach for estimating marketing mix elasticities with PIMS data. \emph{Marketing Science}, \bold{12}(1), 103--124, 1993. } \examples{ data("NPreg", package = "flexmix") ex1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2) EIC(ex1) } flexmix/man/Lapply-methods.Rd0000644000175100001440000000313012455415610015710 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: Lapply-methods.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{Lapply-methods} \docType{methods} \title{Methods for Function Lapply} \alias{Lapply,FLXRmstep-method} \description{Apply a function to each component of a finite mixture} \usage{ \S4method{Lapply}{FLXRmstep}(object, FUN, model = 1, component = TRUE, ...) } \arguments{ \item{object}{S4 class object.} \item{FUN}{The function to be applied.} \item{model}{The model (for a multivariate response) that shall be used.} \item{component}{Index vector for selecting the components.} \item{\dots}{Optional arguments to \code{FUN}.} } \section{Methods}{ \describe{ \item{object = FLXRmstep:}{Apply a function to each component of a refitted \code{flexmix} object using method = \code{"mstep"}.} } } \details{ \code{FUN} is found by a call to \code{match.fun} and typically is specified as a function or a symbol (e.g. a backquoted name) or a character string specifying a function to be searched for from the environment of the call to \code{Lapply}. } \value{ A list of the length equal to the number of components specified is returned, each element of which is the result of applying \code{FUN} to the specified component of the refitted mixture model. } \keyword{methods} \author{Friedrich Leisch and Bettina Gruen} \examples{ data("NPreg", package = "flexmix") ex2 <- flexmix(yn ~ x, data = NPreg, k = 2, model = list(FLXMRglm(yn ~ . + I(x^2)), FLXMRglm(yp ~ ., family = "poisson"))) ex2r <- refit(ex2, method = "mstep") Lapply(ex2r, "vcov", 2) } flexmix/man/FLXP-class.Rd0000644000175100001440000000211412455415610014663 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXP-class.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXP-class} \docType{class} \alias{FLXP-class} \title{Class "FLXP"} \alias{initialize,FLXP-method} \alias{FLXPconstant-class} \alias{FLXPmultinom-class} \description{ Concomitant model class. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("FLXP", ...)}, typically inside driver functions like \code{\link{FLXPconstant}} or \code{\link{FLXPmultinom}}. } \section{Slots}{ \describe{ \item{\code{name}:}{Character string used in print methods.} \item{\code{formula}:}{Formula describing the model.} \item{\code{x}:}{Model matrix.} \item{\code{fit}:}{Function returning the fitted prior probabilities.} \item{\code{refit}:}{Function returning the fitted concomitant model.} \item{\code{coef}:}{Matrix containing the fitted parameters.} \item{\code{df}:}{Function for determining the number of degrees of freedom used.} } } \author{Friedrich Leisch and Bettina Gruen} \keyword{classes} flexmix/man/FLXMCdist1.Rd0000644000175100001440000000373613675321507014646 0ustar hornikusers% % Copyright (C) 2016 Bettina Gruen % $Id: FLXMCdist1.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXMCdist1} \alias{FLXMCdist1} \title{FlexMix Clustering of Univariate Distributions} \description{ These are drivers for \code{\link{flexmix}} implementing model-based clustering of univariate data using different distributions for the component-specific models. } \usage{ FLXMCdist1(formula = . ~ ., dist, ...) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{\link{flexmix}} using \code{\link{update.formula}}. Only the left-hand side (response) of the formula is used. Default is to use the original \code{\link{flexmix}} model formula.} \item{dist}{Character string indicating the component-specific univariate distribution.} \item{...}{Arguments for the specific model drivers.} } \details{ Currently drivers for the following distributions are available: \enumerate{ \item Lognormal (\code{"lnorm"}) \item inverse Gaussian (\code{"invGauss"} using \code{\link[SuppDists:invGauss]{dinvGauss}}) \item gamma (\code{"gamma"}) \item exponential (\code{"exp"}) \item Weibull (\code{"weibull"}) \item Burr (\code{"burr"} using \code{\link[actuar:Burr]{dburr}}) \item Inverse Burr (\code{"invburr"} using \code{\link[actuar:Burr]{dinvburr}}) } } \value{ \code{FLXMCdist1} returns an object of class \code{FLXMC}. } \author{Friedrich Leisch and Bettina Gruen} \references{ Tatjana Miljkovic and Bettina Gruen. Modeling loss data using mixtures of distributions. \emph{Insurance: Mathematics and Economics}, \bold{70}, 387-396, 2016. doi:10.1016/j.insmatheco.2016.06.019 } \seealso{\code{\link{flexmix}}} \keyword{cluster} \examples{ if (require("actuar")) { set.seed(123) y <- c(rexp(100, 10), rexp(100, 1)) ex <- flexmix(y ~ 1, cluster = rep(1:2, each = 100), model = FLXMCdist1(dist = "exp")) parameters(ex) } } flexmix/man/FLXnested-class.Rd0000644000175100001440000000200212455415610015742 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXnested-class.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{FLXnested-class} \docType{class} \alias{FLXnested-class} \alias{coerce,list,FLXnested-method} \alias{coerce,NULL,FLXnested-method} \alias{coerce,numeric,FLXnested-method} \alias{initialize,FLXnested-method} \title{Class "FLXnested"} \description{Specification of nesting structure for regression coefficients.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("FLXnested", formula, k, ...)}. In addition, named lists can be coerced to \code{FLXnested} objects, names are completed if unique. } \section{Slots}{ \describe{ \item{\code{formula}:}{Object of class \code{"list"} containing the formula for determining the model matrix for each nested parameter.} \item{\code{k}:}{Object of class \code{"numeric"} specifying the number of components in each group.} } } \author{Friedrich Leisch and Bettina Gruen} \keyword{classes} flexmix/man/ExNPreg.Rd0000644000175100001440000000165112455415610014324 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: ExNPreg.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{ExNPreg} \alias{ExNPreg} \alias{NPreg} \title{Artificial Example for Normal, Poisson and Binomial Regression} \description{ A simple artificial regression example with 2 latent classes, one independent variable (uniform on \eqn{[0,10]}), and three dependent variables with Gaussian, Poisson and Binomial distribution, respectively. } \usage{ ExNPreg(n) data("NPreg") } \arguments{ \item{n}{Number of observations per latent class.} } \details{ The \code{NPreg} data frame can be re-created by \code{ExNPreg(100)} using \code{set.seed(2602)}, it has been saved as a data set for simplicity of examples only. } \examples{ data("NPreg", package = "flexmix") plot(yn ~ x, data = NPreg, col = class) plot(yp ~ x, data = NPreg, col = class) plot(yb ~ x, data = NPreg, col = class) } \keyword{datasets} flexmix/man/ExLinear.Rd0000644000175100001440000000560512455415610014526 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: ExNclus.Rd 3912 2008-03-13 15:10:24Z gruen $ % \name{ExLinear} \alias{ExLinear} \title{Artificial Data from a Generalized Linear Regression Mixture} \description{ Generate random data mixed from k generalized linear regressions (GLMs). } \usage{ ExLinear(beta, n, xdist = "runif", xdist.args = NULL, family = c("gaussian","poisson"), sd = 1, ...) } \arguments{ \item{beta}{A matrix of regression coefficients. Each row corresponds to a variable, each column to a mixture component. The first row is used as intercept.} \item{n}{Integer, the number of observations per component.} \item{xdist}{Character, name of a random number function for the explanatory variables.} \item{xdist.args}{List, arguments for the random number functions.} \item{family}{A character string naming a GLM family.Only \code{"gaussian"} and \code{"poisson"} are implemented at the moment.} \item{sd}{Numeric, the error standard deviation for each component for Gaussian responses.} \item{\dots}{Used as default for \code{xdist.args} if that is not specified.} } \details{ First, arguments \code{n} (and \code{sd} for Gaussian response) are recycled to the number of mixture components \code{ncol(beta)}, and arguments \code{xdist} and \code{xdist.args} are recycled to the number of explanatory variables \code{nrow(beta)-1}. Then a design matrix is created for each mixture component by drawing random numbers from \code{xdist}. For each component, the design matrix is multiplied by the regression coefficients to form the linear predictor. For Gaussian responses the identity link is used, for Poisson responses the log link. The true cluster memberships are returned as attribute \code{"clusters"}. } \examples{ ## simple example in 2d beta <- matrix(c(1, 2, 3, -1), ncol = 2) sigma <- c(.5, 1) df1 <- ExLinear(beta, 100, sd = sigma, min = -1, max = 2) plot(y~x1, df1, col = attr(df1, "clusters")) ## add a second explanatory variable with exponential distribution beta2 <- rbind(beta, c(-2, 2)) df2 <- ExLinear(beta2, 100, sd = c(.5, 1), xdist = c("runif", "rexp"), xdist.args = list(list(min = -1, max = 2), list(rate = 3))) summary(df2) opar = par("mfrow") par(mfrow = 1:2) hist(df2$x1) hist(df2$x2) par(opar) f1 <- flexmix(y ~ ., data = df2, k = 2) ## sort components on Intercept f1 <- relabel(f1, "model", "Intercept") ## the parameters should be close to the true beta and sigma round(parameters(f1), 3) rbind(beta2, sigma) ### A simple Poisson GLM df3 <- ExLinear(beta/2, 100, min = -1, max = 2, family = "poisson") plot(y ~ x1, df3, col = attr(df3, "clusters")) f3 <- flexmix(y ~ ., data = df3, k = 2, model = FLXMRglm(family = "poisson")) round(parameters(relabel(f3, "model", "Intercept")), 3) beta/2 } \keyword{datasets} flexmix/man/seizure.Rd0000644000175100001440000000414512455415610014503 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: seizure.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{seizure} \alias{seizure} \docType{data} \title{Epileptic Seizure Data} \description{ Data from a clinical trial where the effect of intravenous gamma-globulin on suppression of epileptic seizures is studied. Daily observations for a period of 140 days on one patient are given, where the first 27 days are a baseline period without treatment, the remaining 113 days are the treatment period. } \usage{data("seizure")} \format{ A data frame with 140 observations on the following 4 variables. \describe{ \item{Seizures}{A numeric vector, daily counts of epileptic seizures.} \item{Hours}{A numeric vector, hours of daily parental observation.} \item{Treatment}{A factor with levels \code{No} and \code{Yes}.} \item{Day}{A numeric vector.} } } \source{ P. Wang, M. Puterman, I. Cockburn, and N. Le. Mixed poisson regression models with covariate dependent rates. \emph{Biometrics}, \bold{52}, 381--400, 1996. } \references{ B. Gruen and F. Leisch. Bootstrapping finite mixture models. In J. Antoch, editor, Compstat 2004--Proceedings in Computational Statistics, 1115--1122. Physika Verlag, Heidelberg, Germany, 2004. ISBN 3-7908-1554-3. } \examples{ data("seizure", package = "flexmix") plot(Seizures/Hours ~ Day, col = as.integer(Treatment), pch = as.integer(Treatment), data = seizure) abline(v = 27.5, lty = 2, col = "grey") legend(140, 9, c("Baseline", "Treatment"), pch = 1:2, col = 1:2, xjust = 1, yjust = 1) set.seed(123) ## The model presented in the Wang et al paper: two components for ## "good" and "bad" days, respectively, each a Poisson GLM with hours of ## parental observation as offset seizMix <- flexmix(Seizures ~ Treatment * log(Day), data = seizure, k = 2, model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix) summary(refit(seizMix)) matplot(seizure$Day, fitted(seizMix)/seizure$Hours, type = "l", add = TRUE, col = 3:4) } \keyword{datasets} flexmix/man/stepFlexmix.Rd0000644000175100001440000001451413074144537015333 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: stepFlexmix.Rd 5115 2017-04-07 08:18:13Z gruen $ % \name{stepFlexmix} \alias{stepFlexmix} \alias{initFlexmix} \alias{initMethod} \alias{stepFlexmix-class} \alias{initMethod-class} \alias{plot,stepFlexmix,missing-method} \alias{show,stepFlexmix-method} \alias{getModel,stepFlexmix-method} \alias{unique,stepFlexmix-method} \title{Run FlexMix Repeatedly} \description{ Runs flexmix repeatedly for different numbers of components and returns the maximum likelihood solution for each. } \usage{ initFlexmix(..., k, init = list(), control = list(), nrep = 3L, verbose = TRUE, drop = TRUE, unique = FALSE) initMethod(name = c("tol.em", "cem.em", "sem.em"), step1 = list(tolerance = 10^-2), step2 = list(), control = list(), nrep = 3L) stepFlexmix(..., k = NULL, nrep = 3, verbose = TRUE, drop = TRUE, unique = FALSE) \S4method{plot}{stepFlexmix,missing}(x, y, what = c("AIC", "BIC", "ICL"), xlab = NULL, ylab = NULL, legend = "topright", ...) \S4method{getModel}{stepFlexmix}(object, which = "BIC") \S4method{unique}{stepFlexmix}(x, incomparables = FALSE, ...) } \arguments{ \item{\dots}{Passed to \code{\link{flexmix}} (or \code{\link{matplot}} in the \code{plot} method).} \item{k}{A vector of integers passed in turn to the \code{k} argument of \code{\link{flexmix}}.} \item{init}{An object of class \code{"initMethod"} or a named list where \code{initMethod} is called with it as arguments in addition to the \code{control} argument.} \item{name}{A character string indication which initialization strategy should be employed: short runs of EM followed by a long (\code{"tol.em"}), short runs of CEM followed by a long EM run (\code{"cem.em"}), short runs of SEM followed by a long EM run (\code{"sem.em"}).} \item{step1}{A named list which combined with the \code{control} argument is coercable to a \code{"FLXcontrol"} object. This control setting is used for the short runs.} \item{step2}{A named list which combined with the \code{control} argument is coercable to a \code{"FLXcontrol"} object. This control setting is used for the long run.} \item{control}{A named list which combined with the \code{step1} or the \code{step2} argument is coercable to a \code{"FLXcontrol"} object.} \item{nrep}{For each value of \code{k} run \code{\link{flexmix}} \code{nrep} times and keep only the solution with maximum likelihood. If \code{nrep} is set for the long run, it is ignored, because the EM algorithm is deterministic using the best solution discovered in the short runs for initialization.} \item{verbose}{If \code{TRUE}, show progress information during computations.} \item{drop}{If \code{TRUE} and \code{k} is of length 1, then a single flexmix object is returned instead of a \code{"stepFlexmix"} object.} \item{unique}{If \code{TRUE}, then \code{unique()} is called on the result, see below.} \item{x, object}{An object of class \code{"stepFlexmix"}.} \item{y}{Not used.} \item{what}{Character vector naming information criteria to plot. Functions of the same name must exist, which take a \code{stepFlexmix} object as input and return a numeric vector like \code{AIC,stepFlexmix-method} (see examples below).} \item{xlab,ylab}{Graphical parameters.} \item{legend}{If not \code{FALSE} and \code{what} contains more than 1 element, a legend is placed at the specified location, see \code{\link{legend}} for details.} \item{which}{Number of model to get. If character, interpreted as number of components or name of an information criterion.} \item{incomparables}{A vector of values that cannot be compared. Currently, \code{FALSE} is the only possible value, meaning that all values can be compared.} } \value{ An object of class \code{"stepFlexmix"} containing the best models with respect to the log likelihood for the different number of components in a slot if \code{length(k)>1}, else directly an object of class \code{"flexmix"}. If \code{unique = FALSE}, then the resulting object contains one model per element of \code{k} (which is the number of clusters the EM algorithm started with). If \code{unique = TRUE}, then the result is resorted according to the number of clusters contained in the fitted models (which may be less than the number with which the EM algorithm started), and only the maximum likelihood solution for each number of fitted clusters is kept. This operation can also be done manually by calling \code{unique()} on objects of class \code{"stepFlexmix"}. } \author{Friedrich Leisch and Bettina Gruen} \references{ Friedrich Leisch. FlexMix: A general framework for finite mixture models and latent class regression in R. \emph{Journal of Statistical Software}, \bold{11}(8), 2004. doi:10.18637/jss.v011.i08 Christophe Biernacki, Gilles Celeux and Gerard Govaert. Choosing starting values for the EM algorithm for getting the highest likelihood in multivariate Gaussian mixture models. \emph{Computational Statistics & Data Analysis}, \bold{41}(3--4), 561--575, 2003. Theresa Scharl, Bettina Gruen and Friedrch Leisch. Mixtures of regression models for time-course gene expression data: Evaluation of initialization and random effects. \emph{Bioinformatics}, \bold{26}(3), 370--377, 2010. } \examples{ data("Nclus", package = "flexmix") ## try 2 times for k = 4 set.seed(511) ex1 <- initFlexmix(Nclus~1, k = 4, model = FLXMCmvnorm(diagonal = FALSE), nrep = 2) ex1 ## now 2 times each for k = 2:5, specify control parameter ex2 <- initFlexmix(Nclus~1, k = 2:5, model = FLXMCmvnorm(diagonal = FALSE), control = list(minprior = 0), nrep = 2) ex2 plot(ex2) ## get BIC values BIC(ex2) ## get smallest model getModel(ex2, which = 1) ## get model with 3 components getModel(ex2, which = "3") ## get model with smallest ICL (here same as for AIC and BIC: true k = 4) getModel(ex2, which = "ICL") ## now 1 time each for k = 2:5, with larger minimum prior ex3 <- initFlexmix(Nclus~1, k = 2:5, model = FLXMCmvnorm(diagonal = FALSE), control = list(minprior = 0.1), nrep = 1) ex3 ## keep only maximum likelihood solution for each unique number of ## fitted clusters: unique(ex3) } \keyword{cluster} \keyword{regression} flexmix/man/AIC-methods.Rd0000644000175100001440000000104612455415610015047 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: AIC-methods.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{AIC-methods} \docType{methods} \title{Methods for Function AIC} \alias{AIC,flexmix-method} \alias{AIC,stepFlexmix-method} \description{Compute the Akaike Information Criterion.} \section{Methods}{ \describe{ \item{object = flexmix:}{Compute the AIC of a \code{flexmix} object} \item{object = stepFlexmix:}{Compute the AIC of all models contained in the \code{stepFlexmix} object.} } } \keyword{methods} flexmix/man/plot-methods.Rd0000644000175100001440000000727613074144537015451 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: plot-methods.Rd 5115 2017-04-07 08:18:13Z gruen $ % \name{plot-methods} \docType{methods} \alias{plot-methods} \alias{plot,flexmix,missing-method} \title{Rootogram of Posterior Probabilities} \description{ The \code{plot} method for \code{\link{flexmix-class}} objects gives a rootogram or histogram of the posterior probabilities. } \usage{ \S4method{plot}{flexmix,missing}(x, y, mark = NULL, markcol = NULL, col = NULL, eps = 1e-4, root = TRUE, ylim = TRUE, main = NULL, xlab = "", ylab = "", as.table = TRUE, endpoints = c(-0.04, 1.04), ...) } \arguments{ \item{x}{An object of class \code{"flexmix"}.} \item{y}{Not used.} \item{mark}{Integer: mark posteriors of this component.} \item{markcol}{Color used for marking components.} \item{col}{Color used for the bars.} \item{eps}{Posteriors smaller than \code{eps} are ignored.} \item{root}{If \code{TRUE}, a rootogram of the posterior probabilities is drawn, otherwise a standard histogram.} \item{ylim}{A logical value or a numeric vector of length 2. If \code{TRUE}, the y axes of all rootograms are aligned to have the same limits, if \code{FALSE} each y axis is scaled separately. If a numeric vector is specified it is used as usual.} \item{main}{Main title of the plot.} \item{xlab}{Label of x-axis.} \item{ylab}{Label of y-axis.} \item{as.table}{Logical that controls the order in which panels should be plotted: if \code{FALSE} (the default), panels are drawn left to right, bottom to top (as in a graph); if \code{TRUE}, left to right, top to bottom.} \item{endpoints}{Vector of length 2 indicating the range of x-values that is to be covered by the histogram. This applies only when \code{breaks} is unspecified. In \code{do.breaks}, this specifies the interval that is to be divided up.} \item{...}{Further graphical parameters for the lattice function histogram.} } \details{ For each mixture component a rootogram or histogram of the posterior probabilities of all observations is drawn. Rootograms are very similar to histograms, the only difference is that the height of the bars correspond to square roots of counts rather than the counts themselves, hence low counts are more visible and peaks less emphasized. Please note that the y-axis denotes the number of observations in each bar in any case. Usually in each component a lot of observations have posteriors close to zero, resulting in a high count for the corresponding bin in the rootogram which obscures the information in the other bins. To avoid this problem, all probabilities with a posterior below \code{eps} are ignored. A peak at probability one indicates that a mixture component is well seperated from the other components, while no peak at one and/or significant mass in the middle of the unit interval indicates overlap with other components. } \references{ Friedrich Leisch. FlexMix: A general framework for finite mixture models and latent class regression in R. \emph{Journal of Statistical Software}, \bold{11}(8), 2004. doi:10.18637/jss.v011.i08 Jeremy Tantrum, Alejandro Murua and Werner Stuetzle. Assessment and pruning of hierarchical model based clustering. Proceedings of the 9th ACM SIGKDD international conference on Knowledge Discovery and Data Mining, 197--205. ACM Press, New York, NY, USA, 2003. Friedrich Leisch. Exploring the structure of mixture model components. In Jaromir Antoch, editor, Compstat 2004--Proceedings in Computational Statistics, 1405--1412. Physika Verlag, Heidelberg, Germany, 2004. ISBN 3-7908-1554-3. } \author{Friedrich Leisch and Bettina Gruen} \keyword{methods} \keyword{hplot} flexmix/man/ICL.Rd0000644000175100001440000000245412455415610013425 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: ICL.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{ICL} \alias{ICL,flexmix-method} \alias{ICL,stepFlexmix-method} \title{Integrated Completed Likelihood Criterion} \description{ Compute the Integrated Completed Likelihood criterion for model selection. } \usage{ \S4method{ICL}{flexmix}(object, \dots) \S4method{ICL}{stepFlexmix}(object, \dots) } \arguments{ \item{object}{see Methods section below} \item{\dots}{Some methods for this generic function may take additional, optional arguments. At present none do.} } \section{Methods}{ \describe{ \item{object = "flexmix":}{Compute the ICL of a \code{flexmix} object.} \item{object = "stepFlexmix":}{Compute the ICL of all models contained in the \code{stepFlexmix} object.} }} \value{ Returns a numeric vector with the corresponding ICL value(s). } \keyword{methods} \author{Friedrich Leisch and Bettina Gruen} \references{ C. Biernacki, G. Celeux, and G. Govaert. Assessing a mixture model for clustering with the integrated completed likelihood. \emph{IEEE Transactions on Pattern Analysis and Machine Intelligence}, \emph{22}(7), 719--725, 2000. } \examples{ data("NPreg", package = "flexmix") ex1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2) ICL(ex1) } flexmix/man/trypanosome.Rd0000644000175100001440000000321512455415610015372 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: trypanosome.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{trypanosome} \alias{trypanosome} \docType{data} \title{Trypanosome} \description{ Trypanosome data from a dosage-response analysis to assess the proportion of organisms belonging to different populations. It is assumed that organisms belonging to different populations are indistinguishable other than in terms of their reaction to the stimulus. } \usage{data("trypanosome")} \format{ A data frame with 426 observations on the following 2 variables. \describe{ \item{\code{Dead}}{A logical vector.} \item{\code{Dose}}{A numeric vector.} } } \details{ The experimental technique involved inspection under the microscope of a representative aliquot of a suspension, all organisms appearing within two fields of view being classified either alive or dead. Hence the total numbers of organisms present at each dose and the number showing the quantal response were both random variables. } \source{ R. Ashford and P.J. Walker. Quantal Response Analysis for a Mixture of Populations. \emph{Biometrics}, \bold{28}, 981--988, 1972. } \references{ D.A. Follmann and D. Lambert. Generalizing Logistic Regression by Nonparametric Mixing. \emph{Journal of the American Statistical Association}, \bold{84}(405), 195--300, 1989. } \examples{ data("trypanosome", package = "flexmix") trypMix <- initFlexmix(cbind(Dead, 1-Dead) ~ 1, k = 2, nrep = 5, data = trypanosome, model = FLXMRglmfix(family = "binomial", fixed = ~log(Dose))) } \keyword{datasets} flexmix/man/posterior.Rd0000644000175100001440000000225512455415610015043 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: posterior.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{posterior} \alias{clusters,flexmix,missing-method} \alias{clusters,FLXdist,ANY-method} \alias{posterior,flexmix,missing-method} \alias{posterior,FLXdist,listOrdata.frame-method} \title{Determine Cluster Membership and Posterior Probabilities} \description{Determine posterior probabilities or cluster memberships for a fitted \code{flexmix} or unfitted \code{FLXdist} model.} \usage{ \S4method{posterior}{flexmix,missing}(object, newdata, unscaled = FALSE, ...) \S4method{posterior}{FLXdist,listOrdata.frame}(object, newdata, unscaled = FALSE, ...) \S4method{clusters}{flexmix,missing}(object, newdata, ...) \S4method{clusters}{FLXdist,ANY}(object, newdata, ...) } \arguments{ \item{object}{An object of class "flexmix" or "FLXdist".} \item{newdata}{Data frame or list containing new data. If missing the posteriors of the original observations are returned.} \item{unscaled}{Logical, if \code{TRUE} the component-specific likelihoods are returned.} \item{\dots}{Currently not used.} } \author{Friedrich Leisch and Bettina Gruen} \keyword{methods} flexmix/man/rflexmix.Rd0000644000175100001440000000315612455415610014654 0ustar hornikusers\name{rflexmix} \alias{rflexmix} \alias{rflexmix,flexmix,missing-method} \alias{rflexmix,FLXdist,numeric-method} \alias{rflexmix,FLXdist,listOrdata.frame-method} \alias{rFLXM} \alias{rFLXM,FLXM,list-method} \alias{rFLXM,FLXMC,FLXcomponent-method} \alias{rFLXM,FLXMCmultinom,FLXcomponent-method} \alias{rFLXM,FLXMCbinom,FLXcomponent-method} \alias{rFLXM,FLXMRglm,list-method} \alias{rFLXM,FLXMRglmfix,list-method} \alias{rFLXM,FLXM,FLXcomponent-method} \alias{rFLXM,FLXMRglm,FLXcomponent-method} \title{Random Number Generator for Finite Mixtures} \description{ Given a finite mixture model generate random numbers from it. } \usage{ rflexmix(object, newdata, ...) } \arguments{ \item{object}{A fitted finite mixture model of class \code{flexmix} or an unfitted of class \code{FLXdist}.} \item{newdata}{Optionally, a data frame in which to look for variables with which to predict or an integer specifying the number of random draws for model-based clustering. If omitted, the data to which the model was fitted is used.} \item{\dots}{Further arguments to be passed to or from methods.} } \details{ \code{rflexmix} provides the creation of the model matrix for new data and the sampling of the cluster memberships. The sampling of the component distributions given the classification is done by calling \code{rFLXM}. This step has to be provided for the different model classes. } \value{ A list with components \item{y}{Random sample} \item{group}{Grouping factor} \item{class}{Class membership} } \author{Bettina Gruen} \examples{ example(flexmix) sample <- rflexmix(ex1) } \keyword{distribution} flexmix/man/FLXglmFix.Rd0000644000175100001440000000423612456504525014623 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: FLXglmFix.Rd 5015 2015-01-17 11:12:29Z gruen $ % \name{FLXMRglmfix} \alias{FLXMRglmfix} \alias{FLXglmFix} \title{FlexMix Interface to GLMs with Fixed Coefficients} \description{ This implements a driver for FlexMix which interfaces the \code{glm} family of models and where it is possible to specify fixed (constant) or nested varying coefficients or to ensure that in the Gaussian case the variance estimate is equal for all components. } \usage{ FLXMRglmfix(formula = . ~ ., fixed = ~0, varFix = FALSE, nested = NULL, family = c("gaussian", "binomial", "poisson", "Gamma"), offset = NULL) } \arguments{ \item{formula}{A formula which is interpreted relative to the formula specified in the call to \code{flexmix} using \code{update.formula}. Default is to use the original \code{flexmix} model formula.} \item{fixed}{A formula which specifies the additional regressors for the fixed (constant) coefficients.} \item{varFix}{A logical indicating if the variance estimate for Gaussian components should be constrained to be equal for all components. It can be also a vector specifying the number of components with equal variance.} \item{nested}{An object of class \code{FLXnested} or a list specifying the nested structure.} \item{family}{A character string naming a \code{glm} family function.} \item{offset}{This can be used to specify an \emph{a priori} known component to be included in the linear predictor during fitting.} } \value{ Returns an object of class \code{FLXMRglmfix}. } \author{Friedrich Leisch and Bettina Gruen} \seealso{\code{FLXMRglm}} \examples{ data("NPreg", package = "flexmix") ex <- flexmix(yn ~ x | id2, data = NPreg, k = 2, cluster = NPreg$class, model = FLXMRglm(yn ~ . + I(x^2))) ex.fix <- flexmix(yn ~ x | id2, data = NPreg, cluster = posterior(ex), model = FLXMRglmfix(nested = list(k = c(1, 1), formula = c(~0, ~I(x^2))))) summary(refit(ex)) \dontrun{ summary(refit(ex.fix)) } } \keyword{regression} \keyword{models} flexmix/man/tribolium.Rd0000644000175100001440000000356612455415610015031 0ustar hornikusers% % Copyright (C) 2004-2015 Friedrich Leisch and Bettina Gruen % $Id: tribolium.Rd 5008 2015-01-13 20:30:25Z gruen $ % \name{tribolium} \alias{tribolium} \docType{data} \title{Tribolium Beetles} \description{ The data investigates whether the adult Tribolium species Castaneum has developed an evolutionary advantage to recognize and avoid eggs of their own species while foraging. } \usage{data("tribolium")} \format{ A data frame with 27 observations on the following 4 variables. \describe{ \item{\code{Remaining}}{A numeric vector.} \item{\code{Total}}{A numeric vector.} \item{\code{Replicate}}{A factor with levels \code{1}, \code{2}, \code{3}.} \item{\code{Species}}{A factor with levels \code{Castaneum} \code{Confusum} \code{Madens}.} } } \details{ Beetles of the genus Tribolium are cannibalistic in the sense that adults eat the eggs of their own species as well as those of closely related species. The experiment isolated a number of adult beetles of the same species and presented them with a vial of 150 eggs (50 of each type), the eggs being thoroughly mixed to ensure uniformity throughout the vial. The data gives the consumption data for adult Castaneum species. It reports the number of Castaneum, Confusum and Madens eggs, respectively, that remain uneaten after two day exposure to the adult beetles. Replicates 1, 2, and 3 correspond to different occasions on which the experiment was conducted. } \source{ P. Wang and M.L. Puterman. Mixed Logistic Regression Models. \emph{Journal of Agricultural, Biological, and Environmental Statistics}, \bold{3} (2), 175--200, 1998. } \examples{ data("tribolium", package = "flexmix") tribMix <- initFlexmix(cbind(Remaining, Total - Remaining) ~ Species, k = 2, nrep = 5, data = tribolium, model = FLXMRglm(family = "binomial")) } \keyword{datasets} flexmix/DESCRIPTION0000644000175100001440000000344313741010604013452 0ustar hornikusersPackage: flexmix Type: Package Title: Flexible Mixture Modeling Version: 2.3-17 Authors@R: c(person("Bettina", "Gruen", role = c("aut", "cre"), email = "Bettina.Gruen@R-project.org", comment = c(ORCID = "0000-0001-7265-4773")), person("Friedrich", "Leisch", role = "aut", comment = c(ORCID = "0000-0001-7278-1983")), person("Deepayan", "Sarkar", role = "ctb", comment = c(ORCID = "0000-0003-4107-1553")), person("Frederic", "Mortier", role = "ctb"), person("Nicolas", "Picard", role = "ctb", comment = c(ORCID = "0000-0001-5548-9171"))) Description: A general framework for finite mixtures of regression models using the EM algorithm is implemented. The E-step and all data handling are provided, while the M-step can be supplied by the user to easily define new models. Existing drivers implement mixtures of standard linear models, generalized linear models and model-based clustering. Depends: R (>= 2.15.0), lattice Imports: graphics, grid, grDevices, methods, modeltools (>= 0.2-16), nnet, stats, stats4, utils Suggests: actuar, codetools, diptest, Ecdat, ellipse, gclus, glmnet, lme4 (>= 1.1), MASS, mgcv (>= 1.8-0), mlbench, multcomp, mvtnorm, SuppDists, survival License: GPL (>= 2) LazyLoad: yes NeedsCompilation: no Packaged: 2020-10-11 12:04:57 UTC; hornik Author: Bettina Gruen [aut, cre] (), Friedrich Leisch [aut] (), Deepayan Sarkar [ctb] (), Frederic Mortier [ctb], Nicolas Picard [ctb] () Maintainer: Bettina Gruen Repository: CRAN Date/Publication: 2020-10-12 08:19:16 UTC flexmix/build/0000755000175100001440000000000013740572351013052 5ustar hornikusersflexmix/build/vignette.rds0000644000175100001440000000077113740572351015416 0ustar hornikusersTMo1MВHP)8 9 .V5ZpΦv'~8"w쇶=q@31 ሇS~1&}V(Wr4].v3!V NLF1BIӄvUp[c$ˊ * 7R+b '+2 doUb<_%|"I34U'JC |AKUưBGO7KEV[R2VȄ7yå ]n̫L]IЇ˂uuBZACuI!/wt$ob 65mݗp:>|kچR=O 75ގBfo :౩>G&>= library("stats") library("graphics") library("flexmix") @ \author{Bettina Gr{\"u}n\\ Wirtschaftsuniversit{\"a}t Wien \And Friedrich Leisch\\ Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Bettina Gr{\"u}n, Friedrich Leisch} \Address{ Bettina Gr\"un\\ Institute for Statistics and Mathematics\\ Wirtschaftsuniversit{\"a}t Wien\\ Welthandelsplatz 1\\ 1020 Wien, Austria\\ E-mail: \email{Bettina.Gruen@R-project.org}\\ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \Abstract{ Package \pkg{flexmix} provides functionality for fitting finite mixtures of regression models. The available model class includes generalized linear models with varying and fixed effects for the component specific models and multinomial logit models for the concomitant variable models. This model class includes random intercept models where the random part is modelled by a finite mixture instead of a-priori selecting a suitable distribution. The application of the package is illustrated on various datasets which have been previously used in the literature to fit finite mixtures of Gaussian, binomial or Poisson regression models. The \proglang{R} commands are given to fit the proposed models and additional insights are gained by visualizing the data and the fitted models as well as by fitting slightly modified models. } \Keywords{\proglang{R}, finite mixture models, generalized linear models, concomitant variables} \Plainkeywords{R, finite mixture models, generalized linear models, concomitant variables} %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \begin{document} \SweaveOpts{engine=R, echo=true, height=5, width=8, eps=FALSE, keep.source=TRUE} \setkeys{Gin}{width=0.8\textwidth} <>= options(width=70, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) suppressWarnings(RNGversion("3.5.0")) set.seed(1802) library("lattice") ltheme <- canonical.theme("postscript", FALSE) lattice.options(default.theme=ltheme) @ %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \section{Introduction} Package \pkg{flexmix} provides infrastructure for flexible fitting of finite mixtures models. The design principles of the package allow easy extensibility and rapid prototyping. In addition, the main focus of the available functionality is on fitting finite mixtures of regression models, as other packages in \proglang{R} exist which have specialized functionality for model-based clustering, such as e.g.~\pkg{mclust} \citep{flexmix:Fraley+Raftery:2002a} for finite mixtures of Gaussian distributions. \cite{flexmix:Leisch:2004a} gives a general introduction into the package outlining the main implementational principles and illustrating the use of the package. The paper is also contained as a vignette in the package. An example for fitting mixtures of Gaussian regression models is given in \cite{flexmix:Gruen+Leisch:2006}. This paper focuses on examples of finite mixtures of binomial logit and Poisson regression models. Several datasets which have been previously used in the literature to demonstrate the use of finite mixtures of regression models have been selected to illustrate the application of the package. The model class covered are finite mixtures of generalized linear model with focus on binomial logit and Poisson regressions. The regression coefficients as well as the dispersion parameters of the component specific models are assumed to vary for all components, vary between groups of components, i.e.~to have a nesting, or to be fixed over all components. In addition it is possible to specify concomitant variable models in order to be able to characterize the components. Random intercept models are a special case of finite mixtures with varying and fixed effects as fixed effects are assumed for the coefficients of all covariates and varying effects for the intercept. These models are often used to capture overdispersion in the data which can occur for example if important covariates are omitted in the regression. It is then assumed that the influence of these covariates can be captured by allowing a random distribution for the intercept. This illustration does not only show how the package \pkg{flexmix} can be used for fitting finite mixtures of regression models but also indicates the advantages of using an extension package of an environment for statistical computing and graphics instead of a stand-alone package as available visualization techniques can be used for inspecting the data and the fitted models. In addition users already familiar with \proglang{R} and its formula interface should find the model specification and a lot of commands for exploring the fitted model intuitive. %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \section{Model specification} Finite mixtures of Gaussian regressions with concomitant variable models are given by: \begin{align*} H(y\,|\,\bm{x}, \bm{w}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\bm{w}, \bm{\alpha}) \textrm{N}(y\,|\, \mu_s(\bm{x}), \sigma^2_s), \end{align*} where $\textrm{N}(\cdot\,|\, \mu_s(\bm{x}), \sigma^2_s)$ is the Gaussian distribution with mean $\mu_s(\bm{x}) = \bm{x}' \bm{\beta}^s$ and variance $\sigma^2_s$. $\Theta$ denotes the vector of all parameters of the mixture distribution and the dependent variables are $y$, the independent $\bm{x}$ and the concomitant $\bm{w}$. Finite mixtures of binomial regressions with concomitant variable models are given by: \begin{align*} H(y\,|\,T, \bm{x}, \bm{w}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\bm{w}, \bm{\alpha}) \textrm{Bi}(y\,|\,T, \theta_s(\bm{x})), \end{align*} where $\textrm{Bi}(\cdot\,|\,T, \theta_s(\bm{x}))$ is the binomial distribution with number of trials equal to $T$ and success probability $\theta_s(\bm{x}) \in (0,1)$ given by $\textrm{logit}(\theta_s(\bm{x})) = \bm{x}' \bm{\beta}^s$. Finite mixtures of Poisson regressions are given by: \begin{align*} H(y \,|\, \bm{x}, \bm{w}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\bm{w}, \bm{\alpha}) \textrm{Poi} (y \,|\, \lambda_s(\bm{x})), \end{align*} where $\textrm{Poi}(\cdot\,|\,\lambda_s(\bm{x}))$ denotes the Poisson distribution and $\log(\lambda_s(\bm{x})) = \bm{x}'\bm{\beta}^s$. For all these mixture distributions the coefficients are split into three different groups depending on if fixed, nested or varying effects are specified: \begin{align*} \bm{\beta}^s &= (\bm{\beta}_1, \bm{\beta}^{c(s)}_{2}, \bm{\beta}^{s}_3) \end{align*} where the first group represents the fixed, the second the nested and the third the varying effects. For the nested effects a partition $\mathcal{C} = \{c_s \,|\, s = 1,\ldots S\}$ of the $S$ components is determined where $c_s = \{s^* = 1,\ldots,S \,|\, c(s^*) = c(s)\}$. A similar splitting is possible for the variance of mixtures of Gaussian regression models. The function for maximum likelihood (ML) estimation with the Expectation-Maximization (EM) algorithm is \code{flexmix()} which is described in detail in \cite{flexmix:Leisch:2004a}. It takes as arguments a specification of the component specific model and of the concomitant variable model. The component specific model with varying, nested and fixed effects can be specified with the M-step driver \code{FLXMRglmfix()} which has arguments \code{formula} for the varying, \code{nested} for the nested and \code{fixed} for the fixed effects. \code{formula} and \code{fixed} take an argument of class \code{"formula"}, whereas \code{nested} expects an object of class \code{"FLXnested"} or a named list specifying the nested structure with a component \code{k} which is a vector of the number of components in each group of the partition and a component \code{formula} which is a vector of formulas for each group of the partition. In addition there is an argument \code{family} which has to be one of \code{gaussian}, \code{binomial}, \code{poisson} or \code{Gamma} and determines the component specific distribution function as well as an \code{offset} argument. The argument \code{varFix} can be used to determine the structure of the dispersion parameters. If only varying effects are specified the M-step driver \code{FLXMRglm()} can be used which only has an argument \code{formula} for the varying effects and also a \code{family} and an \code{offset} argument. This driver has the advantage that in the M-step the weighted ML estimation is made separately for each component which signifies that smaller model matrices are used. If a mixture model with a lot of components $S$ is fitted to a large data set with $N$ observations and the model matrix used in the M-step of \code{FLXMRglm()} has $N$ rows and $K$ columns, the model matrix used in the M-step of \code{FLXMRglmfix()} has $S N$ rows and up to $S K$ columns. In general the concomitant variable model is assumed to be a multinomial logit model, i.e.~: \begin{align*} \pi_s(\bm{w},\bm{\alpha}) &= \frac{e^{\bm{w}'\bm{\alpha}_s}}{\sum_{u = 1}^S e^{\bm{w}'\bm{\alpha}_u}} \quad \forall s, \end{align*} with $\bm{\alpha} = (\bm{\alpha}'_s)_{s=1,\ldots,S}$ and $\bm{\alpha}_1 \equiv \bm{0}$. This model can be fitted in \pkg{flexmix} with \code{FLXPmultinom()} which takes as argument \code{formula} the formula specification of the multinomial logit part. For fitting the function \code{nnet()} is used from package \pkg{MASS} \citep{flexmix:Venables+Ripley:2002} with the independent variables specified by the formula argument and the dependent variables are given by the a-posteriori probability estimates. %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \section[Using package flexmix]{Using package \pkg{flexmix}} In the following datasets from different areas such as medicine, biology and economics are used. There are three subsections: for finite mixtures of Gaussian regressions, for finite mixtures of binomial regression models and for finite mixtures of Poisson regression models. %%------------------------------------------------------------------------- \subsection{Finite mixtures of Gaussian regressions} This artificial dataset with 200 observations is given in \cite{flexmix:Gruen+Leisch:2006}. The data is generated from a mixture of Gaussian regression models with three components. There is an intercept with varying effects, an independent variable $x1$, which is a numeric variable, with fixed effects and another independent variable $x2$, which is a categorical variable with two levels, with nested effects. The prior probabilities depend on a concomitant variable $w$, which is also a categorical variable with two levels. Fixed effects are also assumed for the variance. The data is illustrated in Figure~\ref{fig:artificialData} and the true underlying model is given by: \begin{align*} H(y\,|\,(x1, x2), w, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(w, \bm{\alpha}) \textrm{N}(y\,|\, \mu_s, \sigma^2), \end{align*} with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \beta^{c(s)}_{\textrm{x1}}, \beta_{\textrm{x2}})$. The nesting signifies that $c(1) = c(2)$ and $\beta^{c(3)}_{\textrm{x1}} = 0$. The mixture model is fitted by first loading the package and the dataset and then specifying the component specific model. In a first step a component specific model with only varying effects is specified. Then the fitting function \code{flexmix()} is called repeatedly using \code{stepFlexmix()}. Finally, we order the components such that they are in ascending order with respect to the coefficients of the variable \code{x1}. <>= set.seed(2807) library("flexmix") data("NregFix", package = "flexmix") Model <- FLXMRglm(~ x2 + x1) fittedModel <- stepFlexmix(y ~ 1, model = Model, nrep = 3, k = 3, data = NregFix, concomitant = FLXPmultinom(~ w)) fittedModel <- relabel(fittedModel, "model", "x1") summary(refit(fittedModel)) @ The estimated coefficients indicate that the components differ for the intercept, but that they are not significantly different for the coefficients of $x2$. For $x1$ the coefficient of the first component is not significantly different from zero and the confidence intervals for the other two components overlap. Therefore we fit a modified model, which is equivalent to the true underlying model. The previously fitted model is used for initializing the EM algorithm: <>= Model2 <- FLXMRglmfix(fixed = ~ x2, nested = list(k = c(1, 2), formula = c(~ 0, ~ x1)), varFix = TRUE) fittedModel2 <- flexmix(y ~ 1, model = Model2, cluster = posterior(fittedModel), data = NregFix, concomitant = FLXPmultinom(~ w)) BIC(fittedModel) BIC(fittedModel2) @ The BIC suggests that the restricted model should be preferred. \begin{figure}[tb] \centering \setkeys{Gin}{width=0.95\textwidth} <>= plotNregFix <- NregFix plotNregFix$w <- factor(NregFix$w, levels = 0:1, labels = paste("w =", 0:1)) plotNregFix$x2 <- factor(NregFix$x2, levels = 0:1, labels = paste("x2 =", 0:1)) plotNregFix$class <- factor(NregFix$class, levels = 1:3, labels = paste("Class", 1:3)) print(xyplot(y ~ x1 | x2*w, groups = class, data = plotNregFix, cex = 0.6, auto.key = list(space="right"), layout = c(2,2))) @ \setkeys{Gin}{width=0.8\textwidth} \caption{Sample with 200 observations from the artificial example.} \label{fig:artificialData} \end{figure} <>= summary(refit(fittedModel2)) @ The coefficients are ordered such that the fixed coefficients are first, the nested varying coefficients second and the varying coefficients last. %%------------------------------------------------------------------------- \subsection{Finite mixtures of binomial logit regressions} %%------------------------------------------------------------------------- \subsubsection{Beta blockers} The dataset is analyzed in \cite{flexmix:Aitkin:1999, flexmix:Aitkin:1999a} using a finite mixture of binomial regression models. Furthermore, it is described in \cite{flexmix:McLachlan+Peel:2000} on page 165. The dataset is from a 22-center clinical trial of beta-blockers for reducing mortality after myocardial infarction. A two-level model is assumed to represent the data, where centers are at the upper level and patients at the lower level. The data is illustrated in Figure~\ref{fig:beta} and the model is given by: \begin{align*} H(\textrm{Deaths} \,|\, \textrm{Total}, \textrm{Treatment}, \textrm{Center}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Bi}( \textrm{Deaths} \,|\, \textrm{Total}, \theta_s). \end{align*} First, the center classification is ignored and a binomial logit regression model with treatment as covariate is fitted using \code{glm}, i.e.~$S=1$: <>= data("betablocker", package = "flexmix") betaGlm <- glm(cbind(Deaths, Total - Deaths) ~ Treatment, family = "binomial", data = betablocker) betaGlm @ In the next step the center classification is included by allowing a random effect for the intercept given the centers, i.e.~the coefficients $\bm{\beta}^s$ are given by $(\beta^s_{\textrm{Intercept|Center}}, \beta_{\textrm{Treatment}})$. This signifies that the component membership is fixed for each center. In order to determine the suitable number of components, the mixture is fitted with different numbers of components and the BIC information criterion is used to select an appropriate model. In this case a model with three components is selected. The fitted values for the model with three components are given in Figure~\ref{fig:beta}. <>= betaMixFix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = FLXMRglmfix(family = "binomial", fixed = ~ Treatment), k = 2:4, nrep = 3, data = betablocker) betaMixFix @ \begin{figure} \centering <>= library("grid") betaMixFix_3 <- getModel(betaMixFix, "3") betaMixFix_3 <- relabel(betaMixFix_3, "model", "Intercept") betablocker$Center <- with(betablocker, factor(Center, levels = Center[order((Deaths/Total)[1:22])])) clusters <- factor(clusters(betaMixFix_3), labels = paste("Cluster", 1:3)) print(dotplot(Deaths/Total ~ Center | clusters, groups = Treatment, as.table = TRUE, data = betablocker, xlab = "Center", layout = c(3, 1), scales = list(x = list(draw = FALSE)), key = simpleKey(levels(betablocker$Treatment), lines = TRUE, corner = c(1,0)))) betaMixFix.fitted <- fitted(betaMixFix_3) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[1:22, i], "native"), gp = gpar(lty = 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[23:44, i], "native"), gp = gpar(lty = 2)) } @ \caption{Relative number of deaths for the treatment and the control group for each center in the beta blocker dataset. The centers are sorted by the relative number of deaths in the control group. The lines indicate the fitted values for each component of the 3-component mixture model with random intercept and fixed effect for treatment.} \label{fig:beta} \end{figure} In addition the treatment effect can also be included in the random part of the model. As then all coefficients for the covariates and the intercept follow a mixture distribution the component specific model can be specified using \code{FLXMRglm()}. The coefficients are $\bm{\beta}^s=(\beta^s_{\textrm{Intercept|Center}}, \beta^s_{\textrm{Treatment|Center}})$, i.e.~it is assumed that the heterogeneity is only between centers and therefore the aggregated data for each center can be used. <>= betaMix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ Treatment | Center, model = FLXMRglm(family = "binomial"), k = 3, nrep = 3, data = betablocker) summary(betaMix) @ The full model with a random effect for treatment has a higher BIC and therefore the smaller would be preferred. The default plot of the returned \code{flexmix} object is a rootogramm of the a-posteriori probabilities where observations with a-posteriori probabilities smaller than \code{eps} are omitted. With argument \code{mark} the component is specified to have those observations marked which are assigned to this component based on the maximum a-posteriori probabilities. This indicates which components overlap. <>= print(plot(betaMixFix_3, mark = 1, col = "grey", markcol = 1)) @ The default plot of the fitted model indicates that the components are well separated. In addition component 1 has a slight overlap with component 2 but none with component 3. The fitted parameters of the component specific models can be accessed with: <>= parameters(betaMix) @ The cluster assignments using the maximum a-posteriori probabilities are obtained with: <>= table(clusters(betaMix)) @ The estimated probabilities for each component for the treated patients and those in the control group can be obtained with: <>= predict(betaMix, newdata = data.frame(Treatment = c("Control", "Treated"))) @ or <>= fitted(betaMix)[c(1, 23), ] @ A further analysis of the model is possible with function \code{refit()} which returns the estimated coefficients together with the standard deviations, z-values and corresponding p-values: <>= summary(refit(getModel(betaMixFix, "3"))) @ The printed coefficients are ordered to have the fixed effects before the varying effects. %%----------------------------------------------------------------------- \subsubsection{Mehta et al. trial} This dataset is similar to the beta blocker dataset and is also analyzed in \cite{flexmix:Aitkin:1999a}. The dataset is visualized in Figure~\ref{fig:mehta}. The observation for the control group in center 15 is slightly conspicuous and might classify as an outlier. The model is given by: \begin{align*} H(\textrm{Response} \,|\, \textrm{Total}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Bi}( \textrm{Response} \,|\, \textrm{Total}, \theta_s), \end{align*} with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept|Site}}, \beta_{\textrm{Drug}})$. This model is fitted with: <>= data("Mehta", package = "flexmix") mehtaMix <- stepFlexmix(cbind(Response, Total - Response)~ 1 | Site, model = FLXMRglmfix(family = "binomial", fixed = ~ Drug), control = list(minprior = 0.04), nrep = 3, k = 3, data = Mehta) summary(mehtaMix) @ One component only contains the observations for center 15 and in order to be able to fit a mixture with such a small component it is necessary to modify the default argument for \code{minprior} which is 0.05. The fitted values for this model are given separately for each component in Figure~\ref{fig:mehta}. \begin{figure} \centering <>= Mehta$Site <- with(Mehta, factor(Site, levels = Site[order((Response/Total)[1:22])])) clusters <- factor(clusters(mehtaMix), labels = paste("Cluster", 1:3)) print(dotplot(Response/Total ~ Site | clusters, groups = Drug, layout = c(3,1), data = Mehta, xlab = "Site", scales = list(x = list(draw = FALSE)), key = simpleKey(levels(Mehta$Drug), lines = TRUE, corner = c(1,0)))) mehtaMix.fitted <- fitted(mehtaMix) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) sapply(1:nlevels(Mehta$Drug), function(j) grid.lines(unit(1:22, "native"), unit(mehtaMix.fitted[Mehta$Drug == levels(Mehta$Drug)[j], i], "native"), gp = gpar(lty = j))) } @ \caption{Relative number of responses for the treatment and the control group for each site in the Mehta et al.~trial dataset together with the fitted values. The sites are sorted by the relative number of responses in the control group.} \label{fig:mehta} \end{figure} If also a random effect for the coefficient of $\textrm{Drug}$ is fitted, i.e.~$\bm{\beta}^s = (\beta^s_{\textrm{Intercept|Site}}, \beta^s_{\textrm{Drug|Site}})$, this is estimated by: <>= mehtaMix <- stepFlexmix(cbind(Response, Total - Response) ~ Drug | Site, model = FLXMRglm(family = "binomial"), k = 3, data = Mehta, nrep = 3, control = list(minprior = 0.04)) summary(mehtaMix) @ The BIC is smaller for the larger model and this indicates that the assumption of an equal drug effect for all centers is not confirmed by the data. Given Figure~\ref{fig:mehta} a two-component model with fixed treatment is also fitted to the data where site 15 is omitted: <>= Mehta.sub <- subset(Mehta, Site != 15) mehtaMix <- stepFlexmix(cbind(Response, Total - Response) ~ 1 | Site, model = FLXMRglmfix(family = "binomial", fixed = ~ Drug), data = Mehta.sub, k = 2, nrep = 3) summary(mehtaMix) @ %%----------------------------------------------------------------------- \subsubsection{Tribolium} A finite mixture of binomial regressions is fitted to the Tribolium dataset given in \cite{flexmix:Wang+Puterman:1998}. The data was collected to investigate whether the adult Tribolium species Castaneum has developed an evolutionary advantage to recognize and avoid eggs of its own species while foraging, as beetles of the genus Tribolium are cannibalistic in the sense that adults eat the eggs of their own species as well as those of closely related species. The experiment isolated a number of adult beetles of the same species and presented them with a vial of 150 eggs (50 of each type), the eggs being thoroughly mixed to ensure uniformity throughout the vial. The data gives the consumption data for adult Castaneum species. It reports the number of Castaneum, Confusum and Madens eggs, respectively, that remain uneaten after two day exposure to the adult beetles. Replicates 1, 2, and 3 correspond to different occasions on which the experiment was conducted. The data is visualized in Figure~\ref{fig:tribolium} and the model is given by: \begin{align*} H(\textrm{Remaining} \,|\, \textrm{Total}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\textrm{Replicate}, \bm{\alpha}) \textrm{Bi}( \textrm{Remaining} \,|\, \textrm{Total}, \theta_s), \end{align*} with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \bm{\beta}_{\textrm{Species}})$. This model is fitted with: <>= data("tribolium", package = "flexmix") TribMix <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, k = 2:3, model = FLXMRglmfix(fixed = ~ Species, family = "binomial"), concomitant = FLXPmultinom(~ Replicate), data = tribolium) @ The model which is selected as the best in \cite{flexmix:Wang+Puterman:1998} can be estimated with: <>= modelWang <- FLXMRglmfix(fixed = ~ I(Species == "Confusum"), family = "binomial") concomitantWang <- FLXPmultinom(~ I(Replicate == 3)) TribMixWang <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, data = tribolium, model = modelWang, concomitant = concomitantWang, k = 2) summary(refit(TribMixWang)) @ \begin{figure} \centering <>= clusters <- factor(clusters(TribMixWang), labels = paste("Cluster", 1:TribMixWang@k)) print(dotplot(Remaining/Total ~ factor(Replicate) | clusters, groups = Species, data = tribolium[rep(1:9, each = 3) + c(0:2)*9,], xlab = "Replicate", auto.key = list(corner = c(1,0)))) @ \caption{Relative number of remaining beetles for the number of replicate. The different panels are according to the cluster assignemnts based on the a-posteriori probabilities of the model suggested in \cite{flexmix:Wang+Puterman:1998}.} \label{fig:tribolium} \end{figure} \cite{flexmix:Wang+Puterman:1998} also considered a model where they omit one conspicuous observation. This model can be estimated with: <>= TribMixWangSub <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, k = 2, data = tribolium[-7,], model = modelWang, concomitant = concomitantWang) @ %%----------------------------------------------------------------------- \subsubsection{Trypanosome} The data is used in \cite{flexmix:Follmann+Lambert:1989}. It is from a dosage-response analysis where the proportion of organisms belonging to different populations shall be assessed. It is assumed that organisms belonging to different populations are indistinguishable other than in terms of their reaction to the stimulus. The experimental technique involved inspection under the microscope of a representative aliquot of a suspension, all organisms appearing within two fields of view being classified either alive or dead. Hence the total numbers of organisms present at each dose and the number showing the quantal response were both random variables. The data is illustrated in Figure~\ref{fig:trypanosome}. The model which is proposed in \cite{flexmix:Follmann+Lambert:1989} is given by: \begin{align*} H(\textrm{Dead} \,|\,\bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Bi}( \textrm{Dead} \,|\, \theta_s), \end{align*} where $\textrm{Dead} \in \{0,1\}$ and with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \bm{\beta}_{\textrm{log(Dose)}})$. This model is fitted with: <>= data("trypanosome", package = "flexmix") TrypMix <- stepFlexmix(cbind(Dead, 1-Dead) ~ 1, k = 2, nrep = 3, data = trypanosome, model = FLXMRglmfix(family = "binomial", fixed = ~ log(Dose))) summary(refit(TrypMix)) @ The fitted values are given in Figure~\ref{fig:trypanosome} together with the fitted values of a generalized linear model in order to facilitate comparison of the two models. \begin{figure} \centering <>= tab <- with(trypanosome, table(Dead, Dose)) Tryp.dat <- data.frame(Dead = tab["1",], Alive = tab["0",], Dose = as.numeric(colnames(tab))) plot(Dead/(Dead+Alive) ~ Dose, data = Tryp.dat) Tryp.pred <- predict(glm(cbind(Dead, 1-Dead) ~ log(Dose), family = "binomial", data = trypanosome), newdata=Tryp.dat, type = "response") TrypMix.pred <- predict(TrypMix, newdata = Tryp.dat, aggregate = TRUE)[[1]] lines(Tryp.dat$Dose, Tryp.pred, lty = 2) lines(Tryp.dat$Dose, TrypMix.pred, lty = 3) legend(4.7, 1, c("GLM", "Mixture model"), lty=c(2, 3), xjust=0, yjust=1) @ \caption{Relative number of deaths for each dose level together with the fitted values for the generalized linear model (``GLM'') and the random intercept model (``Mixture model'').} \label{fig:trypanosome} \end{figure} %%------------------------------------------------------------------------- \subsection{Finite mixtures of Poisson regressions} % %%----------------------------------------------------------------------- \subsubsection{Fabric faults} The dataset is analyzed using a finite mixture of Poisson regression models in \cite{flexmix:Aitkin:1996}. Furthermore, it is described in \cite{flexmix:McLachlan+Peel:2000} on page 155. It contains 32 observations on the number of faults in rolls of a textile fabric. A random intercept model is used where a fixed effect is assumed for the logarithm of length: <>= data("fabricfault", package = "flexmix") fabricMix <- stepFlexmix(Faults ~ 1, model = FLXMRglmfix(family="poisson", fixed = ~ log(Length)), data = fabricfault, k = 2, nrep = 3) summary(fabricMix) summary(refit(fabricMix)) Lnew <- seq(0, 1000, by = 50) fabricMix.pred <- predict(fabricMix, newdata = data.frame(Length = Lnew)) @ The intercept of the first component is not significantly different from zero for a signficance level of 0.05. We therefore also fit a modified model where the intercept is a-priori set to zero for the first component. This nested structure is given as part of the model specification with argument \code{nested}. <>= fabricMix2 <- flexmix(Faults ~ 0, data = fabricfault, cluster = posterior(fabricMix), model = FLXMRglmfix(family = "poisson", fixed = ~ log(Length), nested = list(k=c(1,1), formula=list(~0,~1)))) summary(refit(fabricMix2)) fabricMix2.pred <- predict(fabricMix2, newdata = data.frame(Length = Lnew)) @ The data and the fitted values for each of the components for both models are given in Figure~\ref{fig:fabric}. \begin{figure} \centering <>= plot(Faults ~ Length, data = fabricfault) sapply(fabricMix.pred, function(y) lines(Lnew, y, lty = 1)) sapply(fabricMix2.pred, function(y) lines(Lnew, y, lty = 2)) legend(190, 25, paste("Model", 1:2), lty=c(1, 2), xjust=0, yjust=1) @ \caption{Observed values of the fabric faults dataset together with the fitted values for the components of each of the two fitted models.} \label{fig:fabric} \end{figure} %%----------------------------------------------------------------------- \subsubsection{Patent} The patent data given in \cite{flexmix:Wang+Cockburn+Puterman:1998} consist of 70 observations on patent applications, R\&D spending and sales in millions of dollar from pharmaceutical and biomedical companies in 1976 taken from the National Bureau of Economic Research R\&D Masterfile. The observations are displayed in Figure~\ref{fig:patent}. The model which is chosen as the best in \cite{flexmix:Wang+Cockburn+Puterman:1998} is given by: \begin{align*} H(\textrm{Patents} \,|\, \textrm{lgRD}, \textrm{RDS}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\textrm{RDS}, \bm{\alpha}) \textrm{Poi} ( \textrm{Patents} \,|\, \lambda_s), \end{align*} and $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \beta^s_{\textrm{lgRD}})$. The model is fitted with: <>= data("patent", package = "flexmix") ModelPat <- FLXMRglm(family = "poisson") FittedPat <- stepFlexmix(Patents ~ lgRD, k = 3, nrep = 3, model = ModelPat, data = patent, concomitant = FLXPmultinom(~ RDS)) summary(FittedPat) @ The fitted values for the component specific models and the concomitant variable model are given in Figure~\ref{fig:patent}. The plotting symbol of the observations corresponds to the induced clustering given by \code{clusters(FittedPat)}. This model is modified to have fixed effects for the logarithmized R\&D spendings, i.e.~$\bm(\beta)^s = (\beta^s_{\textrm{Intercept}}, \beta_{\textrm{lgRD}})$. The already fitted model is used for initialization, i.e.~the EM algorithm is started with an M-step given the a-posteriori probabilities. <>= ModelFixed <- FLXMRglmfix(family = "poisson", fixed = ~ lgRD) FittedPatFixed <- flexmix(Patents ~ 1, model = ModelFixed, cluster = posterior(FittedPat), concomitant = FLXPmultinom(~ RDS), data = patent) summary(FittedPatFixed) @ The fitted values for the component specific models and the concomitant variable model of this model are also given in Figure~\ref{fig:patent}. \begin{figure} \centering \setkeys{Gin}{width=0.95\textwidth} <>= lgRDv <- seq(-3, 5, by = 0.05) newdata <- data.frame(lgRD = lgRDv) plotData <- function(fitted) { with(patent, data.frame(Patents = c(Patents, unlist(predict(fitted, newdata = newdata))), lgRD = c(lgRD, rep(lgRDv, 3)), class = c(clusters(fitted), rep(1:3, each = nrow(newdata))), type = rep(c("data", "fit"), c(nrow(patent), nrow(newdata)*3)))) } plotPatents <- cbind(plotData(FittedPat), which = "Wang et al.") plotPatentsFixed <- cbind(plotData(FittedPatFixed), which = "Fixed effects") plotP <- rbind(plotPatents, plotPatentsFixed) rds <- seq(0, 3, by = 0.02) x <- model.matrix(FittedPat@concomitant@formula, data = data.frame(RDS = rds)) plotConc <- function(fitted) { E <- exp(x%*%fitted@concomitant@coef) data.frame(Probability = as.vector(E/rowSums(E)), class = rep(1:3, each = nrow(x)), RDS = rep(rds, 3)) } plotConc1 <- cbind(plotConc(FittedPat), which = "Wang et al.") plotConc2 <- cbind(plotConc(FittedPatFixed), which = "Fixed effects") plotC <- rbind(plotConc1, plotConc2) print(xyplot(Patents ~ lgRD | which, data = plotP, groups=class, xlab = "log(R&D)", panel = "panel.superpose", type = plotP$type, panel.groups = function(x, y, type = "p", subscripts, ...) { ind <- plotP$type[subscripts] == "data" panel.xyplot(x[ind], y[ind], ...) panel.xyplot(x[!ind], y[!ind], type = "l", ...) }, scales = list(alternating=FALSE), layout=c(1,2), as.table=TRUE), more=TRUE, position=c(0,0,0.6, 1)) print(xyplot(Probability ~ RDS | which, groups = class, data = plotC, type = "l", scales = list(alternating=FALSE), layout=c(1,2), as.table=TRUE), position=c(0.6, 0.01, 1, 0.99)) @ \caption{Patent data with the fitted values of the component specific models (left) and the concomitant variable model (right) for the model in \citeauthor{flexmix:Wang+Cockburn+Puterman:1998} and with fixed effects for $\log(\textrm{R\&D})$. The plotting symbol for each observation is determined by the component with the maximum a-posteriori probability.} \label{fig:patent} \end{figure} \setkeys{Gin}{width=0.8\textwidth} With respect to the BIC the full model is better than the model with the fixed effects. However, fixed effects have the advantage that the different components differ only in their baseline and the relation between the components in return of investment for each additional unit of R\&D spending is constant. Due to a-priori domain knowledge this model might seem more plausible. The fitted values for the constrained model are also given in Figure~\ref{fig:patent}. %%----------------------------------------------------------------------- \subsubsection{Seizure} The data is used in \cite{flexmix:Wang+Puterman+Cockburn:1996} and is from a clinical trial where the effect of intravenous gamma-globulin on suppression of epileptic seizures is studied. There are daily observations for a period of 140 days on one patient, where the first 27 days are a baseline period without treatment, the remaining 113 days are the treatment period. The model proposed in \cite{flexmix:Wang+Puterman+Cockburn:1996} is given by: \begin{align*} H(\textrm{Seizures} \,|\, (\textrm{Treatment}, \textrm{log(Day)}, \textrm{log(Hours)}), \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Poi} ( \textrm{Seizures} \,|\, \lambda_s), \end{align*} where $\bm(\beta)^s = (\beta^s_{\textrm{Intercept}}, \beta^s_{\textrm{Treatment}}, \beta^s_{\textrm{log(Day)}}, \beta^s_{\textrm{Treatment:log(Day)}})$ and $\textrm{log(Hours)}$ is used as offset. This model is fitted with: <>= data("seizure", package = "flexmix") seizMix <- stepFlexmix(Seizures ~ Treatment * log(Day), data = seizure, k = 2, nrep = 3, model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix) summary(refit(seizMix)) @ A different model with different contrasts to directly estimate the coefficients for the jump when changing between base and treatment period is given by: <>= seizMix2 <- flexmix(Seizures ~ Treatment * log(Day/27), data = seizure, cluster = posterior(seizMix), model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix2) summary(refit(seizMix2)) @ A different model which allows no jump at the change between base and treatment period is fitted with: <>= seizMix3 <- flexmix(Seizures ~ log(Day/27)/Treatment, data = seizure, cluster = posterior(seizMix), model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix3) summary(refit(seizMix3)) @ With respect to the BIC criterion the smaller model with no jump is preferred. This is also the more intuitive model from a practitioner's point of view, as it does not seem to be plausible that starting the treatment already gives a significant improvement, but improvement develops over time. The data points together with the fitted values for each component of the two models are given in Figure~\ref{fig:seizure}. It can clearly be seen that the fitted values are nearly equal which also supports the smaller model. \begin{figure} \centering <>= plot(Seizures/Hours~Day, pch = c(1,3)[as.integer(Treatment)], data=seizure) abline(v=27.5, lty=2, col="grey") legend(140, 9, c("Baseline", "Treatment"), pch=c(1, 3), xjust=1, yjust=1) matplot(seizure$Day, fitted(seizMix)/seizure$Hours, type="l", add=TRUE, lty = 1, col = 1) matplot(seizure$Day, fitted(seizMix3)/seizure$Hours, type="l", add=TRUE, lty = 3, col = 1) legend(140, 7, paste("Model", c(1,3)), lty=c(1, 3), xjust=1, yjust=1) @ \caption{Observed values for the seizure dataset together with the fitted values for the components of the two different models.} \label{fig:seizure} \end{figure} %%----------------------------------------------------------------------- \subsubsection{Ames salmonella assay data} The ames salomnella assay dataset was used in \cite{flexmix:Wang+Puterman+Cockburn:1996}. They propose a model given by: \begin{align*} H(\textrm{y} \,|\, \textrm{x}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Poi} ( \textrm{y} \,|\, \lambda_s), \end{align*} where $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \beta_{\textrm{x}}, \beta_{\textrm{log(x+10)}})$. The model is fitted with: <>= data("salmonellaTA98", package = "flexmix") salmonMix <- stepFlexmix(y ~ 1, data = salmonellaTA98, k = 2, nrep = 3, model = FLXMRglmfix(family = "poisson", fixed = ~ x + log(x + 10))) @ \begin{figure} \centering <>= salmonMix.pr <- predict(salmonMix, newdata=salmonellaTA98) plot(y~x, data=salmonellaTA98, pch=as.character(clusters(salmonMix)), xlab="Dose of quinoline", ylab="Number of revertant colonies of salmonella", ylim=range(c(salmonellaTA98$y, unlist(salmonMix.pr)))) for (i in 1:2) lines(salmonellaTA98$x, salmonMix.pr[[i]], lty=i) @ \caption{Means and classification for assay data according to the estimated posterior probabilities based on the fitted model.} \label{fig:almes} \end{figure} %%----------------------------------------------------------------------- \section{Conclusions and future work} Package \pkg{flexmix} can be used to fit finite mixtures of regressions to datasets used in the literature to illustrate these models. The results can be reproduced and additional insights can be gained using visualization methods available in \proglang{R}. The fitted model is an object in \proglang{R} which can be explored using \code{show()}, \code{summary()} or \code{plot()}, as suitable methods have been implemented for objects of class \code{"flexmix"} which are returned by \code{flexmix()}. In the future it would be desirable to have more diagnostic tools available to analyze the model fit and compare different models. The use of resampling methods would be convenient as they can be applied to all kinds of mixtures models and would therefore suit well the purpose of the package which is flexible modelling of various finite mixture models. Furthermore, an additional visualization method for the fitted coefficients of the mixture would facilitate the comparison of the components. %%----------------------------------------------------------------------- \section*{Computational details} <>= SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") @ All computations and graphics in this paper have been done using \proglang{R} version \Sexpr{getRversion()} with the packages \Sexpr{pkgs}. %%----------------------------------------------------------------------- \section*{Acknowledgments} This research was supported by the the Austrian Science Foundation (FWF) under grant P17382 and the Austrian Academy of Sciences ({\"O}AW) through a DOC-FFORTE scholarship for Bettina Gr{\"u}n. %%----------------------------------------------------------------------- \bibliography{flexmix} \end{document} flexmix/vignettes/ziglm.R0000644000175100001440000000220511740757251015231 0ustar hornikuserssetClass("FLXMRziglm", contains = "FLXMRglm") FLXMRziglm <- function(formula = . ~ ., family = c("binomial", "poisson"), ...) { family <- match.arg(family) new("FLXMRziglm", FLXMRglm(formula, family, ...), name = paste("FLXMRziglm", family, sep=":")) } setMethod("FLXgetModelmatrix", signature(model="FLXMRziglm"), function(model, data, formula, lhs=TRUE, ...) { model <- callNextMethod(model, data, formula, lhs) if (attr(terms(model@fullformula), "intercept") == 0) stop("please include an intercept") model }) setMethod("FLXremoveComponent", signature(model = "FLXMRziglm"), function(model, nok, ...) { if (1 %in% nok) as(model, "FLXMRglm") else model }) setMethod("FLXmstep", signature(model = "FLXMRziglm"), function(model, weights, components, ...) { coef <- c(-Inf, rep(0, ncol(model@x)-1)) names(coef) <- colnames(model@x) comp.1 <- with(list(coef = coef, df = 0, offset = NULL, family = model@family), eval(model@defineComponent)) c(list(comp.1), FLXmstep(as(model, "FLXMRglm"), weights[, -1, drop=FALSE], components[-1])) }) flexmix/vignettes/mixture.bib0000644000175100001440000003623711703222720016136 0ustar hornikusers@STRING{csda = {Computational Statistics \& Data Analysis} } @STRING{jasa = {Journal of the American Statistical Association} } @STRING{jcgs = {Journal of Computational and Graphical Statistics} } @STRING{jrssa = {Journal of the Royal Statistical Society A} } @STRING{jrssb = {Journal of the Royal Statistical Society B} } @Article{ mixtures:aitkin:1999, author = {Murray Aitkin}, title = {A General Maximum Likelihood Analysis of Variance Components in Generalized Linear Models}, journal = {Biometrics}, year = 1999, volume = 55, pages = {117--128} } @Article{ mixtures:aitkin:1999a, author = {Murray Aitkin}, title = {Meta-Analysis by Random Effect Modelling in Generalized Linear Models}, journal = {Statistics in Medicine}, year = 1999, volume = 18, number = {17--18}, month = {September}, pages = {2343--2351} } @Article{ mixtures:biernacki+celeux+govaert:2000, author = {Christophe Biernacki and Gilles Celeux and G{\'e}rard Govaert}, title = {Assessing a Mixture Model for Clustering with the Integrated Completed Likelihood}, journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence}, year = 2000, volume = 22, number = 7, pages = {719--725}, month = {July} } @Article{ mixtures:biernacki+celeux+govaert:2003, author = {Christophe Biernacki and Gilles Celeux and G{\'e}rard Govaert}, title = {Choosing Starting Values for the {EM} Algorithm for Getting the Highest Likelihood in Multivariate {G}aussian Mixture Models}, journal = csda, year = 2003, volume = 41, pages = {561--575} } @Article{ mixtures:boehning+dietz+schlattmann:1999, author = {Dankmar B{\"o}hning and Ekkehart Dietz and Peter Schlattmann and Lisette Mendon{\c c}a and Ursula Kirchner}, title = {The Zero-Inflated {P}oisson Model and the Decayed, Missing and Filled Teeth Index in Dental Epidemiology}, journal = jrssa, year = 1999, volume = 162, number = 2, pages = {195--209}, month = {August} } @Book{ mixtures:boehning:1999, author = {Dankmar B{\"o}hning}, title = {Computer Assisted Analysis of Mixtures and Applications: Meta-Analysis, Disease Mapping, and Others}, publisher = {Chapman \& Hall/CRC}, year = 1999, volume = 81, series = {Monographs on Statistics and Applied Probability}, address = {London} } @Manual{ mixtures:canty+ripley:2010, title = {boot: Bootstrap R (S-Plus) Functions}, author = {Angelo Canty and Brian Ripley}, year = 2010, note = {R package version 1.2-43}, url = {http://CRAN.R-project.org/package=boot} } @TechReport{ mixtures:celeux+diebolt:1988, author = {Gilles Celeux and Jean Diebolt}, title = {A Random Imputation Principle: The Stochastic {EM} Algorithm}, institution = {INRIA}, year = 1988, type = {Rapports de Recherche}, number = 901, month = {September} } @Article{ mixtures:celeux+govaert:1992, author = {Gilles Celeux and G{\'e}rard Govaert}, title = {A {C}lassification {EM} Algorithm for Clustering and Two Stochastic Versions}, journal = {Computational Statistics \& Data Analysis}, year = 1992, volume = 14, number = 3, pages = {315--332}, month = {October} } @Book{ mixtures:chambers:1998, author = {John M. Chambers}, title = {Programming with Data}, publisher = {Springer-Verlag}, year = 1998, address = {New York}, isbn = {0-387-98503-4} } @Article{ mixtures:dasgupta+raftery:1998, author = {Abhijit Dasgupta and Adrian E. Raftery}, title = {Detecting Features in Spatial Point Processes with Clutter Via Model-Based Clustering}, journal = jasa, year = 1998, volume = 93, number = 441, pages = {294--302}, month = {March} } @Book{mixtures:davison+hinkley:1997, author = {A. C. Davison and D. V. Hinkley}, title = {Bootstrap Methods and Their Application}, publisher = {Cambridge University Press}, address = {Cambridge, UK}, year = 1997, isbn = {0-521-57391-2 (hardcover), 0-521-57471-4 (paperback)}, series = {Cambridge Series on Statistical and Probabilistic Mathematics}, } @Article{ mixtures:dayton+macready:1988, author = {C. Mitchell Dayton and George B. Macready}, title = {Concomitant-Variable Latent-Class Models}, journal = jasa, year = 1988, volume = 83, number = 401, pages = {173--178}, month = {March} } @Article{ mixtures:dempster+laird+rubin:1977, author = {A. P. Dempster and N. M. Laird and D. B. Rubin}, title = {Maximum Likelihood from Incomplete Data Via the {EM}-Algorithm}, journal = jrssb, volume = 39, pages = {1--38}, year = 1977 } @InCollection{ mixtures:diebolt+ip:1996, author = {Jean Diebolt and Eddie H. S. Ip}, editor = {W. R. Gilks and S. Richardson and D. J. Spiegelhalter}, booktitle = {Markov Chain {M}onte {C}arlo in Practice}, title = {Stochastic {EM}: Method and Application}, publisher = {Chapman and Hall}, year = 1996, pages = {259--273} } @Book{ mixtures:everitt+hand:1981, author = {B. S. Everitt and D. J. Hand}, title = {Finite Mixture Distributions}, publisher = {Chapman and Hall}, address = {London}, year = 1981 } @Article{ mixtures:follmann+lambert:1989, author = {Dean A. Follmann and Diane Lambert}, title = {Generalizing Logistic Regression by Non-Parametric Mixing}, journal = jasa, volume = 84, number = 405, month = {March}, pages = {295--300}, year = 1989 } @Article{ mixtures:follmann+lambert:1991, author = {Dean A. Follmann and Diane Lambert}, title = {Identifiability of Finite Mixtures of Logistic Regression Models}, journal = {Journal of Statistical Planning and Inference}, volume = 27, number = 3, month = {March}, pages = {375--381}, year = 1991 } @Book{ mixtures:fowler:2004, author = {Martin Fowler}, title = {{UML} Distilled: A Brief Guide to the Standard Object Modeling Language}, publisher = {Addison-Wesley Professional}, year = 2004, edition = {3rd} } @Book{ mixtures:fruehwirth-schnatter:2006, author = {Sylvia Fr{\"u}hwirth-Schnatter}, title = {Finite Mixture and Markov Switching Models}, publisher = {Springer-Verlag}, address = {New York}, series = {Springer-Verlag Series in Statistics}, isbn = {0-387-32909-9}, year = 2006 } @Article{ mixtures:gentleman+ihaka:2000, author = {Robert Gentleman and Ross Ihaka}, title = {Lexical Scope and Statistical Computing}, journal = jcgs, year = 2000, volume = 9, number = 3, pages = {491--508} } @InProceedings{ mixtures:gruen+leisch:2004, author = {Bettina Gr{\" u}n and Friedrich Leisch}, title = {Bootstrapping Finite Mixture Models}, booktitle = {COMPSTAT 2004 -- Proceedings in Computational Statistics}, year = 2004, editor = {Jaromir Antoch}, publisher = {Physica Verlag, Heidelberg}, isbn = {3-7908-1554-3}, pages = {1115--1122} } @InProceedings{ mixtures:gruen+leisch:2006, author = {Bettina Gr{\" u}n and Friedrich Leisch}, title = {Fitting Finite Mixtures of Linear Regression Models with Varying \& Fixed Effects in \proglang{R}}, booktitle = {COMPSTAT 2006 -- Proceedings in Computational Statistics}, pages = {853--860}, editor = {Alfredo Rizzi and Maurizio Vichi}, publisher = {Physica Verlag, Heidelberg, Germany}, isbn = {3-7908-1708-2}, year = 2006 } @Article{ mixtures:gruen+leisch:2007a, author = {Bettina Gr{\" u}n and Friedrich Leisch}, title = {Fitting Finite Mixtures of Generalized Linear Regressions in \proglang{R}}, journal = csda, year = 2007, volume = 51, number = 11, month = {July}, pages = {5247--5252} } @Article{ mixtures:gruen+leisch:2008, author = {Bettina Gr\"un and Friedrich Leisch}, title = {Identifiability of Finite Mixtures of Multinomial Logit Models with Varying and Fixed Effects}, journal = {Journal of Classification}, year = 2008, note = {Accepted for publication on 2008-03-28} } @Article{ mixtures:gruen+leisch:2008a, author = {Bettina Gr\"un and Friedrich Leisch}, title = {{F}lex{M}ix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters}, journal = {Journal of Statistical Software}, year = 2008, volume = 28, number = 4, pages = {1--35}, url = {http://www.jstatsoft.org/v28/i04/} } @Unpublished{mixtures:gruen+leisch:2010, author = {Bettina Gr\"un and Friedrich Leisch}, title = {Finite Mixture Model Diagnostics Using Resampling Methods}, note = {Unpublished manuscript}, year = 2010, } @PhDThesis{ mixtures:gruen:2006, author = {Bettina Gr{\"u}n}, title = {Identification and Estimation of Finite Mixture Models}, school = {Institut f{\"u}r Statistik und Wahrscheinlichkeitstheorie, Technische Universit{\"a}t Wien}, year = 2006, month = {September}, note = {{Friedrich Leisch, advisor}} } @Book{ mixtures:harrell:2001, author = {Frank E. Harrell}, title = {Regression Modeling Strategies}, publisher = {Springer-Verlag}, address = {New York}, year = 2001 } @Article{ mixtures:hastie+tibshirani:1993, author = {Trevor Hastie and Robert Tibshirani}, title = {Varying-Coefficient Models}, journal = jrssb, year = 1993, volume = 55, number = 4, pages = {757--796} } @Article{mixtures:hennig:2000, author = {Christian Hennig}, title = {Identifiability of Models for Clusterwise Linear Regression}, journal = {Journal of Classification}, volume = 17, number = 2, month = {July}, pages = {273--296}, year = 2000 } @Article{ mixtures:karlis+xekalaki:2003, author = {Dimitris Karlis and Evdokia Xekalaki}, title = {Choosing Initial Values for the {EM} Algorithm for Finite Mixtures}, journal = csda, year = 2003, volume = 41, pages = {577--590} } @InProceedings{ mixtures:leisch:2002, author = {Friedrich Leisch}, title = {Sweave: Dynamic Generation of Statistical Reports Using Literate Data Analysis}, booktitle = {COMPSTAT 2002 -- Proceedings in Computational Statistics}, pages = {575--580}, year = 2002, editor = {Wolfgang H{\"a}rdle and Bernd R{\"o}nz}, publisher = {Physica Verlag, Heidelberg}, note = {ISBN 3-7908-1517-9} } @Article{ mixtures:leisch:2003, author = {Friedrich Leisch}, title = {Sweave, Part {II}: Package Vignettes}, journal = {\proglang{R} News}, year = 2003, volume = 3, number = 2, pages = {21--24}, month = {October}, url = {http://CRAN.R-project.org/doc/Rnews/} } @Article{ mixtures:leisch:2004, author = {Friedrich Leisch}, title = {\pkg{FlexMix}: A General Framework for Finite Mixture Models and Latent Class Regression in \proglang{R}}, journal = {Journal of Statistical Software}, year = 2004, volume = 11, number = 8, pages = {1--18}, url = {http://www.jstatsoft.org/v11/i08/} } @InProceedings{ mixtures:leisch:2004a, author = {Friedrich Leisch}, title = {Exploring the Structure of Mixture Model Components}, booktitle = {COMPSTAT 2004 -- Proceedings in Computational Statistics}, year = 2004, editor = {Jaromir Antoch}, publisher = {Physica Verlag, Heidelberg}, isbn = {3-7908-1554-3}, pages = {1405--1412} } @InProceedings{ mixtures:leisch:2008, author = {Friedrich Leisch}, title = {Modelling Background Noise in Finite Mixtures of Generalized Linear Regression Models}, booktitle = {COMPSTAT 2008 -- Proceedings in Computational Statistics}, volume = {I}, pages = {385-396}, editor = {Paula Brito}, publisher = {Physica Verlag, Heidelberg, Germany}, isbn = {978-3-7908-2083-6}, year = 2008 } @Article{ mixtures:long:1990, author = {J. Scott Long}, title = {The Origins of Sex Differences in Science}, journal = {Social Forces}, year = 1990, volume = 68, number = 4, pages = {1297--1315}, month = {June} } @Book{ mixtures:mccullagh+nelder:1989, author = {Peter McCullagh and John A. Nelder}, title = {Generalized Linear Models}, edition = {2nd}, publisher = {Chapman and Hall}, year = 1989, location = {London} } @Book{ mixtures:mclachlan+basford:1988, author = {Geoffrey J. McLachlan and Kaye E. Basford}, title = {Mixture Models: Inference and Applications to Clustering}, publisher = {Marcel Dekker}, year = 1988, address = {New York} } @Book{ mixtures:mclachlan+peel:2000, author = {Geoffrey J. McLachlan and David Peel}, title = {Finite Mixture Models}, publisher = {John Wiley \& Sons}, year = 2000 } @Book{ mixtures:pinheiro+bates:2000, author = {Jose C. Pinheiro and Douglas M. Bates}, title = {Mixed-Effects Models in \proglang{S} and \proglang{S-Plus}}, publisher = {Springer-Verlag}, year = 2000, isbn = {0-387-98957-0} } @Book{ mixtures:sarkar:2008, title = {\pkg{lattice}: Multivariate Data Visualization with \proglang{R}}, author = {Deepayan Sarkar}, year = 2008, publisher = {Springer-Verlag}, address = {New York}, isbn = {978-0-387-75968-5} } @Book{ mixtures:titterington+smith+makov:1985, author = {D. M. Titterington and A. F. M. Smith and U. E. Makov}, title = {Statistical Analysis of Finite Mixture Distributions}, publisher = {John Wiley \& Sons}, year = 1985 } @Book{ mixtures:venables+ripley:2002, title = {Modern Applied Statistics with \proglang{S}}, author = {William N. Venables and Brian D. Ripley}, publisher = {Springer-Verlag}, edition = {4th}, address = {New York}, year = 2002, isbn = {0-387-95457-0} } @Article{ mixtures:wang+puterman+cockburn:1996, author = {Peiming Wang and Martin L. Puterman and Iain M. Cockburn and Nhu D. Le}, title = {Mixed {P}oisson Regression Models with Covariate Dependent Rates}, journal = {Biometrics}, year = 1996, volume = 52, pages = {381--400} } @Article{ mixtures:wedel+desarbo:1995, author = {Michel Wedel and Wagner S. DeSarbo}, title = {A Mixture Likelihood Approach for Generalized Linear Models}, journal = {Journal of Classification}, year = 1995, volume = 12, number = 1, month = {March}, pages = {21--55} } @Article{ mixtures:wehrens+buydens+fraley:2004, author = {Ron Wehrens and Lutgarde M.C. Buydens and Chris Fraley and Adrian E. Raftery}, title = {Model-Based Clustering for Image Segmentation and Large Datasets Via Sampling}, journal = {Journal of Classification}, year = 2004, volume = 21, number = 2, pages = {231--253} } flexmix/vignettes/bootstrapping.Rnw0000644000175100001440000004660013675321507017356 0ustar hornikusers\documentclass[nojss]{jss} \usepackage{amsfonts,bm,amsmath,amssymb} %%\usepackage{Sweave} %% already provided by jss.cls %%%\VignetteIndexEntry{Finite Mixture Model Diagnostics Using Resampling Methods} %%\VignetteDepends{flexmix} %%\VignetteKeywords{R, finite mixture model, resampling, bootstrap} %%\VignettePackage{flexmix} \title{Finite Mixture Model Diagnostics Using Resampling Methods} <>= options(useFancyQuotes = FALSE) digits <- 3 Colors <- c("#E495A5", "#39BEB1") critical_values <- function(n, p = "0.95") { data("qDiptab", package = "diptest") if (n %in% rownames(qDiptab)) { return(qDiptab[as.character(n), p]) }else { n.approx <- as.numeric(rownames(qDiptab)[which.min(abs(n - as.numeric(rownames(qDiptab))))]) return(sqrt(n.approx)/sqrt(n) * qDiptab[as.character(n.approx), p]) } } library("graphics") library("flexmix") combine <- function(x, sep, width) { cs <- cumsum(nchar(x)) remaining <- if (any(cs[-1] > width)) combine(x[c(FALSE, cs[-1] > width)], sep, width) c(paste(x[c(TRUE, cs[-1] <= width)], collapse= sep), remaining) } prettyPrint <- function(x, sep = " ", linebreak = "\n\t", width = getOption("width")) { x <- strsplit(x, sep)[[1]] paste(combine(x, sep, width), collapse = paste(sep, linebreak, collapse = "")) } @ \author{Bettina Gr{\"u}n\\ Wirtschaftsuniversit{\"a}t Wien \And Friedrich Leisch\\ Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Bettina Gr{\"u}n, Friedrich Leisch} \Address{ Bettina Gr\"un\\ Institute for Statistics and Mathematics\\ Wirtschaftsuniversit{\"a}t Wien\\ Welthandelsplatz 1\\ 1020 Wien, Austria\\ E-mail: \email{Bettina.Gruen@R-project.org}\\ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \Abstract{ This paper illustrates the implementation of resampling methods in \pkg{flexmix} as well as the application of resampling methods for model diagnostics of fitted finite mixture models. Convenience functions to perform these methods are available in package \pkg{flexmix}. The use of the methods is illustrated with an artificial example and the \code{seizure} data set. } \Keywords{\proglang{R}, finite mixture models, resampling, bootstrap} \Plainkeywords{R, finite mixture models, resampling, bootstrap} %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \begin{document} \SweaveOpts{engine=R, echo=true, height=5, width=8, eps=FALSE, keep.source=TRUE} \setkeys{Gin}{width=0.95\textwidth} \section{Implementation of resampling methods}\label{sec:implementation} The proposed framework for model diagnostics using resampling \citep{mixtures:gruen+leisch:2004} equally allows to investigate model fit for all kinds of mixture models. The procedure is applicable to mixture models with different component specific models and does not impose any limitation such as for example on the dimension of the parameter space of the component specific model. In addition to the fitting step different component specific models only require different random number generators for the parametric bootstrap. The \code{boot()} function in \pkg{flexmix} is a generic \proglang{S4} function with a method for fitted finite mixtures of class \code{"flexmix"} and is applicable to general finite mixture models. The function with arguments and their defaults is given by: <>= cat(prettyPrint(gsub("boot_flexmix", "boot", prompt(flexmix:::boot_flexmix, filename = NA)$usage[[2]]), sep = ", ", linebreak = paste("\n", paste(rep(" ", 2), collapse = ""), sep= ""), width = 70)) @ The interface is similar to the \code{boot()} function in package \pkg{boot} \citep{mixtures:Davison+Hinkley:1997, mixtures:Canty+Ripley:2010}. The \code{object} is a fitted finite mixture of class \code{"flexmix"} and \code{R} denotes the number of resamples. The possible bootstrapping method are \code{"empirical"} (also available as \code{"ordinary"}) and \code{"parametric"}. For the parametric bootstrap sampling from the fitted mixture is performed using \code{rflexmix()}. For mixture models with different component specific models \code{rflexmix()} requires a sampling method for the component specific model. Argument \code{initialize\_solution} allows to select if the EM algorithm is started in the original finite mixture solution or if random initialization is performed. The fitted mixture model might contain weights and group indicators. The weights are case weights and allow to reduce the amount of data if observations are identical. This is useful for example for latent class analysis of multivariate binary data. The argument \code{keep\_weights} allows to indicate if they should be kept for the bootstrapping. Group indicators allow to specify that the component membership is identical over several observations, e.g., for repeated measurements of the same individual. Argument \code{keep\_groups} allows to indicate if the grouping information should also be used in the bootstrapping. \code{verbose} indicates if information on the progress should be printed. The \code{control} argument allows to control the EM algorithm for fitting the model to each of the bootstrap samples. By default the \code{control} argument is extracted from the fitted model provided by \code{object}. \code{k} allows to specify the number of components and by default this is also taken from the fitted model provided. The \code{model} argument determines if also the model and the weights slot for each sample are stored and returned. The returned object is of class \code{"FLXboot"} and otherwise only contains the fitted parameters, the fitted priors, the log likelihoods, the number of components of the fitted mixtures and the information if the EM algorithm has converged. The likelihood ratio test is implemented based on \code{boot()} in function \code{LR\_test()} and returns an object of class \code{"htest"} containing the number of valid bootstrap replicates, the p-value, the double negative log likelihood ratio test statistics for the original data and the bootstrap replicates. The \code{plot} method for \code{"FLXboot"} objects returns a parallel coordinate plot with the fitted parameters separately for each of the components. \section{Artificial data set} In the following a finite mixture model is used as the underlying data generating process which is theoretically not identifiable. We are assuming a finite mixture of linear regression models with two components of equal size where the coverage condition is not fulfilled \citep{mixtures:Hennig:2000}. Hence, intra-component label switching is possible, i.e., there exist two parameterizations implying the same mixture distribution which differ how the components between the covariate points are combined. We assume that one measurement per object and a single categorical regressor with two levels are given. The usual design matrix for a model with intercept uses the two covariate points $\mathbf{x}_1 = (1, 0)'$ and $\mathbf{x}_2 = (1, 1)'$. The mixture distribution is given by \begin{eqnarray*} H(y|\mathbf{x}, \Theta) &=& \frac{1}{2} N(\mu_1, 0.1) + \frac{1}{2} N(\mu_2, 0.1), \end{eqnarray*} where $\mu_k(\mathbf{x}) = \mathbf{x}'\bm{\alpha}_k$ and $N(\mu, \sigma^2)$ is the normal distribution. Now let $\mu_1(\mathbf{x}_1) = 1$, $\mu_2(\mathbf{x}_1) = 2$, $\mu_1(\mathbf{x}_2) = -1$ and $\mu_2(\mathbf{x}_2) = 4$. As Gaussian mixture distributions are generically identifiable the means, variances and component weights are uniquely determined in each covariate point given the mixture distribution. However, as the coverage condition is not fulfilled, the two possible solutions for $\bm{\alpha}$ are: \begin{description} \item[Solution 1:] $\bm{\alpha}_1^{(1)} = (2,\phantom{-}2)'$, $\bm{\alpha}_2^{(1)} = (1,-2)'$, \item[Solution 2:] $\bm{\alpha}_1^{(2)} = (2,-3)'$, $\bm{\alpha}_2^{(2)} = (1,\phantom{-}3)'$. \end{description} We specify this artificial mixture distribution using \code{FLXdist()}. \code{FLXdist()} returns an unfitted finite mixture of class \code{"FLXdist"}. The class of fitted finite mixture models \code{"flexmix"} extends class \code{"FLXdist"}. Each component follows a normal distribution. The parameters specified in a named list therefore consist of the regression coefficients and the standard deviation. Function \code{FLXdist()} has an argument \code{formula} for specifying the regression in each of the components, an argument \code{k} for the component weights and \code{components} for the parameters of each of the components. <<>>= library("flexmix") Component_1 <- list(Model_1 = list(coef = c(1, -2), sigma = sqrt(0.1))) Component_2 <- list(Model_1 = list(coef = c(2, 2), sigma = sqrt(0.1))) ArtEx.mix <- FLXdist(y ~ x, k = rep(0.5, 2), components = list(Component_1, Component_2)) @ We draw a balanced sample with 50 observations in each covariate point from the mixture model using \code{rflexmix()} after defining the data points for the covariates. \code{rflexmix()} can either have an unfitted or a fitted finite mixture as input. For unfitted mixtures data has to be provided using the \code{newdata} argument. For already fitted mixtures data can be optionally provided, otherwise the data used for fitting the mixture is used. <<>>= ArtEx.data <- data.frame(x = rep(0:1, each = 100/2)) suppressWarnings(RNGversion("3.5.0")) set.seed(123) ArtEx.sim <- rflexmix(ArtEx.mix, newdata = ArtEx.data) ArtEx.data$y <- ArtEx.sim$y[[1]] ArtEx.data$class <- ArtEx.sim$class @ In Figure~\ref{fig:art} the sample is plotted together with the two solutions for combining $x_1$ and $x_2$, i.e., this illustrates intra-component label switching. \begin{figure} \centering <>= par(mar = c(5, 4, 2, 0) + 0.1) plot(y ~ x, data = ArtEx.data, pch = with(ArtEx.data, 2*class + x)) pars <- list(matrix(c(1, -2, 2, 2), ncol = 2), matrix(c(1, 3, 2, -3), ncol = 2)) for (i in 1:2) apply(pars[[i]], 2, abline, col = Colors[i]) @ \caption{Balanced sample from the artificial example with the two theoretical solutions.} \label{fig:art} \end{figure} We fit a finite mixture to the sample using \code{stepFlexmix()}. <<>>= set.seed(123) ArtEx.fit <- stepFlexmix(y ~ x, data = ArtEx.data, k = 2, nrep = 5, control = list(iter = 1000, tol = 1e-8, verbose = 0)) @ The fitted mixture can be inspected using \code{summary()} and \code{parameters()}. <<>>= summary(ArtEx.fit) parameters(ArtEx.fit) @ Obviously the fitted mixture parameters correspond to the parameterization we used to specify the mixture distribution. Using standard asymptotic theory to analyze the fitted mixture model gives the following estimates for the standard deviations. <<>>= ArtEx.refit <- refit(ArtEx.fit) summary(ArtEx.refit) @ The fitted mixture can also be analyzed using resampling techniques. For analyzing the stability of the parameter estimates where the possibility of identifiability problems is also taken into account the parametric bootstrap is used with random initialization. Function \code{boot()} can be used for empirical or parametric bootstrap (specified by the argument \code{sim}). The logical argument \code{initialize_solution} specifies if the initialization is in the original solution or random. By default random initialization is made. The number of bootstrap samples is set by the argument \code{R}. Please note that the arguments are chosen to correspond to those for function \code{boot} in package \pkg{boot} \citep{mixtures:Davison+Hinkley:1997}. <>= set.seed(123) ArtEx.bs <- boot(ArtEx.fit, R = 200, sim = "parametric") ArtEx.bs @ <>= if (file.exists("ArtEx.bs.rda")) { load("ArtEx.bs.rda") } else { set.seed(123) ArtEx.bs <- boot(ArtEx.fit, R = 200, sim = "parametric") save(ArtEx.bs, file = "ArtEx.bs.rda") } ArtEx.bs @ Function \code{boot()} returns an object of class \code{"\Sexpr{class(ArtEx.bs)}"}. The default plot compares the bootstrap parameter estimates to the confidence intervals derived using standard asymptotic theory in a parallel coordinate plot (see Figure~\ref{fig:plot.FLXboot-art}). Clearly two groups of parameter estimates can be distinguished which are about of equal size. One subset of the parameter estimates stays within the confidence intervals induced by standard asymptotic theory, while the second group corresponds to the second solution and clusters around these parameter values. \begin{figure}[h!] \centering <>= print(plot(ArtEx.bs, ordering = "coef.x", col = Colors)) @ \caption{Diagnostic plot of the bootstrap results for the artificial example.} \label{fig:plot.FLXboot-art} \end{figure} In the following the DIP-test is applied to check if the parameter estimates follow a unimodal distribution. This is done for the aggregated parameter esimates where unimodality implies that this parameter is not suitable for imposing an ordering constraint which induces a unique labelling. For the separate component analysis which is made after imposing an ordering constraint on the coefficient of $x$ rejection the null hypothesis of unimodality implies that identifiability problems are present, e.g.~due to intra-component label switching. <<>>= require("diptest") parameters <- parameters(ArtEx.bs) Ordering <- factor(as.vector(apply(matrix(parameters[,"coef.x"], nrow = 2), 2, order))) Comp1 <- parameters[Ordering == 1,] Comp2 <- parameters[Ordering == 2,] dip.values.art <- matrix(nrow = ncol(parameters), ncol = 3, dimnames=list(colnames(parameters), c("Aggregated", "Comp 1", "Comp 2"))) dip.values.art[,"Aggregated"] <- apply(parameters, 2, dip) dip.values.art[,"Comp 1"] <- apply(Comp1, 2, dip) dip.values.art[,"Comp 2"] <- apply(Comp2, 2, dip) dip.values.art @ The critical value for column \code{Aggregated} is \Sexpr{round(critical_values(nrow(parameters)), digits = digits)} and for the columns of the separate components \Sexpr{round(critical_values(nrow(Comp1)), digits = digits)}. The component sizes as well as the standard deviations follow a unimodal distribution for the aggregated data as well as for each of the components. The regression coefficients are multimodal for the aggregate data as well as for each of the components. While from the aggregated case it might be concluded that imposing an ordering constraint on the intercept or the coefficient of $x$ is suitable, the component-specific analyses reveal that a unique labelling was not achieved. \section{Seizure} In \cite{mixtures:Wang+Puterman+Cockburn:1996} a Poisson mixture regression is fitted to data from a clinical trial where the effect of intravenous gammaglobulin on suppression of epileptic seizures is investigated. The data used were 140 observations from one treated patient, where treatment started on the $28^\textrm{th}$ day. In the regression model three independent variables were included: treatment, trend and interaction treatment-trend. Treatment is a dummy variable indicating if the treatment period has already started. Furthermore, the number of parental observation hours per day were available and it is assumed that the number of epileptic seizures per observation hour follows a Poisson mixture distribution. The number of epileptic seizures per parental observation hour for each day are plotted in Figure~\ref{fig:seizure}. The fitted mixture distribution consists of two components which can be interpreted as representing 'good' and 'bad' days of the patients. The mixture model can be formulated by \begin{equation*} H(y|\mathbf{x}, \Theta) = \pi_1 P(\lambda_1) + \pi_2 P(\lambda_2), \end{equation*} where $\lambda_k = e^{\mathbf{x}'\bm{\alpha}_k}$ for $k = 1,2$ and $P(\lambda)$ is the Poisson distribution. The data is loaded and the mixture fitted with two components. <<>>= data("seizure", package = "flexmix") model <- FLXMRglm(family = "poisson", offset = log(seizure$Hours)) control <- list(iter = 1000, tol = 1e-10, verbose = 0) set.seed(123) seizMix <- stepFlexmix(Seizures ~ Treatment * log(Day), data = seizure, k = 2, nrep = 5, model = model, control = control) @ The fitted regression lines for each of the two components are shown in Figure~\ref{fig:seizure}. \begin{figure}[h!] \begin{center} <>= par(mar = c(5, 4, 2, 0) + 0.1) plot(Seizures/Hours~Day, data=seizure, pch = as.integer(seizure$Treatment)) abline(v = 27.5, lty = 2, col = "grey") matplot(seizure$Day, fitted(seizMix)/seizure$Hours, type="l", add = TRUE, col = 1, lty = 1, lwd = 2) @ \caption{Seizure data with the fitted values for the \citeauthor{mixtures:Wang+Puterman+Cockburn:1996} model. The plotting character for the observed values in the base period is a circle and for those in the treatment period a triangle.} \label{fig:seizure} \end{center} \end{figure} The parameteric bootstrap with random initialization is used to investigate identifiability problems and parameter stability. The diagnostic plot is given in Figure~\ref{fig:plot.FLXboot-seiz}. The coloring is according to an ordering constraint on the intercept. Clearly the parameter estimates corresponding to the solution where the bad days from the base period are combined with the good days from the treatement period and vice versa for the good days of the base period can be distinguished and indicate the slight identifiability problems of the fitted mixture. <>= set.seed(123) seizMix.bs <- boot(seizMix, R = 200, sim = "parametric") seizMix.bs @ <>= if (file.exists("seizMix.bs.rda")) { load("seizMix.bs.rda") } else { set.seed(123) seizMix.bs <- boot(seizMix, R = 200, sim = "parametric") save(seizMix.bs, file = "seizMix.bs.rda") } seizMix.bs @ \begin{figure}[h!] \centering <>= print(plot(seizMix.bs, ordering = "coef.(Intercept)", col = Colors)) @ \label{fig:plot.FLXboot-seiz} \caption{Diagnostic plot of the bootstrap results for the \code{seizure} data.} \end{figure} <<>>= parameters <- parameters(seizMix.bs) Ordering <- factor(as.vector(apply(matrix(parameters[,"coef.(Intercept)"], nrow = 2), 2, order))) Comp1 <- parameters[Ordering == 1,] Comp2 <- parameters[Ordering == 2,] @ For applying the DIP test also an ordering constraint on the intercept is used. The critical value for column \code{Aggregated} is \Sexpr{round(critical_values(nrow(parameters)), digits = digits)} and for the columns of the separate components \Sexpr{round(critical_values(nrow(Comp1)), digits = digits)}. <<>>= dip.values.art <- matrix(nrow = ncol(parameters), ncol = 3, dimnames = list(colnames(parameters), c("Aggregated", "Comp 1", "Comp 2"))) dip.values.art[,"Aggregated"] <- apply(parameters, 2, dip) dip.values.art[,"Comp 1"] <- apply(Comp1, 2, dip) dip.values.art[,"Comp 2"] <- apply(Comp2, 2, dip) dip.values.art @ For the aggregate results the hypothesis of unimodality cannot be rejected for the trend. For the component-specific analyses unimodality cannot be rejected only for the intercept (where the ordering condition was imposed on) and again the trend. For all other parameter estimates unimodality is rejected which indicates that the ordering constraint was able to impose a unique labelling only for the own parameter and not for the other parameters. This suggests identifiability problems. %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \bibliography{mixture} \end{document} flexmix/vignettes/mymclust.R0000644000175100001440000000205312653423105015755 0ustar hornikusersmymclust <- function (formula = .~., diagonal = TRUE) { retval <- new("FLXMC", weighted = TRUE, formula = formula, dist = "mvnorm", name = "my model-based clustering") retval@defineComponent <- function(para) { logLik <- function(x, y) { mvtnorm::dmvnorm(y, mean = para$center, sigma = para$cov, log = TRUE) } predict <- function(x) { matrix(para$center, nrow = nrow(x), ncol = length(para$center), byrow = TRUE) } new("FLXcomponent", parameters = list(center = para$center, cov = para$cov), df = para$df, logLik = logLik, predict = predict) } retval@fit <- function(x, y, w, ...) { para <- cov.wt(y, wt = w)[c("center", "cov")] df <- (3 * ncol(y) + ncol(y)^2)/2 if (diagonal) { para$cov <- diag(diag(para$cov)) df <- 2 * ncol(y) } retval@defineComponent(c(para, df = df)) } retval } flexmix/vignettes/flexmix.bib0000644000175100001440000002336511703222720016113 0ustar hornikusers@STRING{jcgs = {Journal of Computational and Graphical Statistics} } @STRING{tuwien = {Technische Universit{\"a}t Wien, Vienna, Austria} } @STRING{jasa = {Journal of the American Statistical Association} } @Article{ flexmix:Aitkin:1996, author = {Murray Aitkin}, title = {A General Maximum Likelihood Analysis of Overdispersion in Generalized Linear Models}, journal = {Statistics and Computing}, year = 1996, volume = 6, pages = {251--262} } @Article{ flexmix:Aitkin:1999, author = {Murray Aitkin}, title = {A General Maximum Likelihood Analysis of Variance Components in Generalized Linear Models}, journal = {Biometrics}, year = 1999, volume = 55, pages = {117--128} } @Article{ flexmix:Aitkin:1999a, author = {Murray Aitkin}, title = {Meta-Analysis by Random Effect Modelling in Generalized Linear Models}, journal = {Statistics in Medicine}, year = 1999, volume = 18, number = {17--18}, month = {September}, pages = {2343--2351} } @Manual{ flexmix:Buyske:2003, title = {{R} Package \texttt{mmlcr}: Mixed-Mode Latent Class Regression}, author = {Steve Buyske}, year = 2003, note = {version 1.3.2}, url = {http://www.stat.rutgers.edu/~buyske/software.html} } @Book{ flexmix:Chambers:1998, author = {John M. Chambers}, title = {Programming with Data: A Guide to the {S} Language}, publisher = {Springer Verlag}, year = 1998, address = {Berlin, Germany} } @Article{ flexmix:DeSarbo+Cron:1988, author = {Wayne S. DeSarbo and W. L. Cron}, title = {A Maximum Likelihood Methodology for Clusterwise Linear Regression}, journal = {Journal of Classification}, year = 1988, volume = 5, pages = {249--282} } @Article{ flexmix:Dempster+Laird+Rubin:1977, author = {A.P. Dempster and N.M. Laird and D.B. Rubin}, title = {Maximum Likelihood from Incomplete Data via the {EM}-Alogrithm}, journal = {Journal of the Royal Statistical Society, B}, volume = 39, pages = {1--38}, year = 1977 } @Article{ flexmix:Diebolt+Robert:1994, author = {J. Diebolt and C. P. Robert}, title = {Estimation of Finite Mixture Distributions Through {B}ayesian Sampling}, journal = {Journal of the Royal Statistical Society, Series B}, year = 1994, volume = 56, pages = {363--375} } @Book{ flexmix:Everitt+Hand:1981, author = {Brian S. Everitt and David J. Hand}, title = {Finite Mixture Distributions}, publisher = {Chapman and Hall}, address = {London}, year = 1981 } @Article{ flexmix:Follmann+Lambert:1989, author = {Dean A. Follmann and Diane Lambert}, title = {Generalizing Logistic Regression by Non-Parametric Mixing}, journal = jasa, volume = 84, number = 405, month = {March}, pages = {295--300}, year = 1989 } @Article{ flexmix:Fraley+Raftery:2002, author = {Chris Fraley and Adrian E. Raftery}, title = {Model-Based Clustering, Discriminant Analysis and dDnsity Estimation}, journal = jasa, year = 2002, volume = 97, pages = {611-631} } @TechReport{ flexmix:Fraley+Raftery:2002a, author = {Chris Fraley and Adrian E. Raftery}, title = {{MCLUST}: Software for Model-Based Clustering, Discriminant Analysis and Density Estimation}, institution = {Department of Statistics, University of Washington}, year = 2002, number = 415, address = {Seattle, WA, USA}, url = {http://www.stat.washington.edu/raftery} } @Article{ flexmix:Gentleman+Ihaka:2000, author = {Robert Gentleman and Ross Ihaka}, title = {Lexical Scope and Statistical Computing}, journal = jcgs, year = 2000, volume = 9, number = 3, pages = {491--508}, keywords = {statistical computing, function closure, lexical scope, random number generators} } @InProceedings{ flexmix:Gruen+Leisch:2006, author = {Bettina Gr{\" u}n and Friedrich Leisch}, title = {Fitting Finite Mixtures of Linear Regression Models with Varying \& Fixed Effects in \textsf{R}}, booktitle = {Compstat 2006---Proceedings in Computational Statistics}, pages = {853--860}, editor = {Alfredo Rizzi and Maurizio Vichi}, publisher = {Physica Verlag}, address = {Heidelberg, Germany}, isbn = {3-7908-1708-2}, year = 2006 } @InProceedings{ flexmix:Grun+Leisch:2004, author = {Bettina Gr{\" u}n and Friedrich Leisch}, title = {Bootstrapping Finite Mixture Models}, booktitle = {Compstat 2004---Proceedings in Computational Statistics}, year = 2004, editor = {Jaromir Antoch}, publisher = {Physica Verlag}, address = {Heidelberg, Germany}, isbn = {3-7908-1554-3}, pages = {1115--1122}, pdf = {http://www.stat.uni-muenchen.de/~leisch/papers/Grun+Leisch-2004.pdf} } @MastersThesis{ flexmix:Grun:2002, author = {Bettina Gr{\"u}n}, title = {{I}dentifizierbarkeit von multinomialen {M}ischmodellen}, school = tuwien, year = 2002, note = {Kurt Hornik and Friedrich Leisch, advisors} } @Article{ flexmix:Hennig:2000, author = {Christian Hennig}, title = {Identifiability of Models for Clusterwise Linear Regression}, journal = {Journal of Classification}, volume = 17, pages = {273--296}, year = 2000 } @InProceedings{ flexmix:Leisch:2004, author = {Friedrich Leisch}, title = {Exploring the Structure of Mixture Model Components}, booktitle = {Compstat 2004---Proceedings in Computational Statistics}, year = 2004, editor = {Jaromir Antoch}, publisher = {Physica Verlag}, address = {Heidelberg, Germany}, isbn = {3-7908-1554-3}, pages = {1405--1412}, pdf = {http://www.stat.uni-muenchen.de/~leisch/papers/Leisch-2004.pdf} } @Article{ flexmix:Leisch:2004a, author = {Friedrich Leisch}, title = {{FlexMix}: A General Framework for Finite Mixture Models and Latent Class Regression in {R}}, journal = {Journal of Statistical Software}, year = 2004, volume = 11, number = 8, url = {http://www.jstatsoft.org/v11/i08/} } @Book{ flexmix:McLachlan+Peel:2000, author = {Geoffrey McLachlan and David Peel}, title = {Finite Mixture Models}, publisher = {John Wiley and Sons Inc.}, year = 2000 } @Manual{ flexmix:R-Core:2004, title = {R: A Language and Environment for Statistical Computing}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = 2004, isbn = {3-900051-07-0}, url = {http://www.R-project.org} } @InProceedings{ flexmix:Tantrum+Murua+Stuetzle:2003, author = {Jeremy Tantrum and Alejandro Murua and Werner Stuetzle}, title = {Assessment and Pruning of Hierarchical Model Based Clustering}, booktitle = {Proceedings of the ninth ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, pages = {197--205}, year = 2003, publisher = {ACM Press}, address = {New York, NY, USA}, isbn = {1-58113-737-0}, } @Book{ flexmix:Titterington+Smith+Makov:1985, author = {D.M. Titterington and A.F.M. Smith and U.E. Makov}, title = {Statistical Analysis of Finite Mixture Distributions}, publisher = {John Wiley and Sons Inc.}, year = 1985 } @InProceedings{ flexmix:Urbanek+Theus:2003, author = {Simon Urbanek and Martin Theus}, title = {{iPlots}---High Interaction Graphics for {R}}, booktitle = {Proceedings of the 3rd International Workshop on Distributed Statistical Computing, Vienna, Austria}, editor = {Kurt Hornik and Friedrich Leisch and Achim Zeileis}, year = 2003, url = {http://www.ci.tuwien.ac.at/Conferences/DSC-2003/Proceedings/}, note = {{ISSN 1609-395X}} } @Book{ flexmix:Venables+Ripley:2002, title = {Modern Applied Statistics with S}, author = {William N. Venables and Brian D. Ripley}, publisher = {Springer Verlag}, edition = {Fourth}, address = {New York}, year = 2002, isbn = {0-387-95457-0} } @Article{ flexmix:Wang+Cockburn+Puterman:1998, author = {Peiming Wang and Iain M. Cockburn and Martin L. Puterman}, title = {Analysis of Patent Data---{A} Mixed-{P}oisson-Regression-Model Approach}, journal = {Journal of Business \& Economic Statistics}, year = 1998, volume = 16, number = 1, pages = {27--41} } @Article{ flexmix:Wang+Puterman+Cockburn:1996, author = {Peiming Wang and Martin L. Puterman and Iain M. Cockburn and Nhu D. Le}, title = {Mixed {P}oisson Regression Models with Covariate Dependent Rates}, journal = {Biometrics}, year = 1996, volume = 52, pages = {381--400} } @Article{ flexmix:Wang+Puterman:1998, author = {Peiming Wang and Martin L. Puterman}, title = {Mixed Logistic Regression Models}, journal = {Journal of Agricultural, Biological, and Environmental Statistics}, year = 1998, volume = 3, number = 2, pages = {175--200} } @Article{ flexmix:Wedel+DeSarbo:1995, author = {Michel Wedel and Wayne S. DeSarbo}, title = {A Mixture Likelihood Approach for Generalized Linear Models}, journal = {Journal of Classification}, year = 1995, volume = 12, pages = {21--55} } @Book{ flexmix:Wedel+Kamakura:2001, author = {Michel Wedel and Wagner A. Kamakura}, title = {Market Segmentation -- Conceptual and Methodological Foundations}, publisher = {Kluwer Academic Publishers}, year = 2001, address = {Boston, MA, USA}, edition = {2nd} } flexmix/vignettes/.install_extras0000644000175100001440000000004611703256037017015 0ustar hornikusersmyConcomitant.R$ mymclust.R$ ziglm.R$ flexmix/vignettes/mixture-regressions.Rnw0000644000175100001440000022017613675321507020523 0ustar hornikusers% % Copyright (C) 2008 Bettina Gruen and Friedrich Leisch % $Id: mixture-regressions.Rnw $ % \documentclass[nojss]{jss} \usepackage{amsfonts} \title{FlexMix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters} \Plaintitle{FlexMix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters} \Shorttitle{FlexMix Version 2} \author{Bettina Gr{\"u}n\\ Wirtschaftsuniversit{\"a}t Wien \And Friedrich Leisch\\ Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Bettina Gr{\"u}n, Friedrich Leisch} \Address{ Bettina Gr\"un\\ Institute for Statistics and Mathematics\\ Wirtschaftsuniversit{\"a}t Wien\\ Welthandelsplatz 1\\ 1020 Wien, Austria\\ E-mail: \email{Bettina.Gruen@R-project.org}\\ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \Abstract{ This article is a (slightly) modified version of \cite{mixtures:Gruen+Leisch:2008a}, published in the \emph{Journal of Statistical Software}. \pkg{flexmix} provides infrastructure for flexible fitting of finite mixture models in \proglang{R} using the expectation-maximization (EM) algorithm or one of its variants. The functionality of the package was enhanced. Now concomitant variable models as well as varying and constant parameters for the component specific generalized linear regression models can be fitted. The application of the package is demonstrated on several examples, the implementation described and examples given to illustrate how new drivers for the component specific models and the concomitant variable models can be defined. } \Keywords{\proglang{R}, finite mixture models, generalized linear models, concomitant variables} \Plainkeywords{R, finite mixture models, generalized linear models, concomitant variables} \usepackage{amsmath, listings} \def\argmax{\mathop{\rm arg\,max}} %% \usepackage{Sweave} prevent automatic inclusion \SweaveOpts{width=9, height=4.5, eps=FALSE, keep.source=TRUE} <>= options(width=60, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) library("graphics") library("stats") library("flexmix") library("lattice") ltheme <- canonical.theme("postscript", FALSE) lattice.options(default.theme=ltheme) data("NPreg", package = "flexmix") data("dmft", package = "flexmix") source("myConcomitant.R") @ %%\VignetteIndexEntry{FlexMix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters} %%\VignetteDepends{flexmix} %%\VignetteKeywords{R, finite mixture models, model based clustering, latent class regression} %%\VignettePackage{flexmix} \begin{document} %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Introduction}\label{sec:introduction} Finite mixture models are a popular technique for modelling unobserved heterogeneity or to approximate general distribution functions in a semi-parametric way. They are used in a lot of different areas such as astronomy, biology, economics, marketing or medicine. An overview on mixture models is given in \cite{mixtures:Everitt+Hand:1981}, \cite{mixtures:Titterington+Smith+Makov:1985}, \cite{mixtures:McLachlan+Basford:1988}, \cite{mixtures:Boehning:1999}, \cite{mixtures:McLachlan+Peel:2000} and \cite{mixtures:Fruehwirth-Schnatter:2006}. Version 1 of \proglang{R} package \pkg{flexmix} was introduced in \cite{mixtures:Leisch:2004}. The main design principles of the package are extensibility and fast prototyping for new types of mixture models. It uses \proglang{S}4 classes and methods \citep{mixtures:Chambers:1998} as implemented in the \proglang{R} package \pkg{methods} and exploits advanced features of \proglang{R} such as lexical scoping \citep{mixtures:Gentleman+Ihaka:2000}. The package implements a framework for maximum likelihood estimation with the expectation-maximization (EM) algorithm \citep{mixtures:Dempster+Laird+Rubin:1977}. The main focus is on finite mixtures of regression models and it allows for multiple independent responses and repeated measurements. The EM algorithm can be controlled through arguments such as the maximum number of iterations or a minimum improvement in the likelihood to continue. Newly introduced features in the current package version are concomitant variable models \citep{mixtures:Dayton+Macready:1988} and varying and constant parameters in the component specific regressions. Varying parameters follow a finite mixture, i.e., several groups exist in the population which have different parameters. Constant parameters are fixed for the whole population. This model is similar to mixed-effects models \citep{mixtures:Pinheiro+Bates:2000}. The main difference is that in this application the distribution of the varying parameters is unknown and has to be estimated. Thus the model is actually closer to the varying-coefficients modelling framework \citep{mixtures:Hastie+Tibshirani:1993}, using convex combinations of discrete points as functional form for the varying coefficients. The extension to constant and varying parameters allows for example to fit varying intercept models as given in \cite{mixtures:Follmann+Lambert:1989} and \cite{mixtures:Aitkin:1999}. These models are frequently applied to account for overdispersion in the data where the components follow either a binomial or Poisson distribution. The model was also extended to include nested varying parameters, i.e.~this allows to have groups of components with the same parameters \citep{mixtures:Gruen+Leisch:2006, mixtures:Gruen:2006}. In Section~\ref{sec:model-spec-estim} the extended model class is presented together with the parameter estimation using the EM algorithm. In Section~\ref{sec:using-new-funct} examples are given to demonstrate how the new functionality can be used. An overview on the implementational details is given in Section~\ref{sec:implementation}. The new model drivers are presented and changes made to improve the flexibility of the software and to enable the implementation of the new features are discussed. Examples for writing new drivers for the component specific models and the concomitant variable models are given in Section~\ref{sec:writing-your-own}. This paper gives a short overview on finite mixtures and the package in order to be self-contained. A more detailed introduction to finite mixtures and the package \pkg{flexmix} can be found in \cite{mixtures:Leisch:2004}. All computations and graphics in this paper have been done with \pkg{flexmix} version \Sexpr{packageDescription("flexmix",fields="Version")} and \proglang{R} version \Sexpr{getRversion()} using Sweave \citep{mixtures:Leisch:2002}. The newest release version of \pkg{flexmix} is always available from the Comprehensive \proglang{R} Archive Network at \url{http://CRAN.R-project.org/package=flexmix}. An up-to-date version of this paper is contained in the package as a vignette, giving full access to the \proglang{R} code behind all examples shown below. See \code{help("vignette")} or \cite{mixtures:Leisch:2003} for details on handling package vignettes. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Model specification and estimation}\label{sec:model-spec-estim} A general model class of finite mixtures of regression models is considered in the following. The mixture is assumed to consist of $K$ components where each component follows a parametric distribution. Each component has a weight assigned which indicates the a-priori probability for an observation to come from this component and the mixture distribution is given by the weighted sum over the $K$ components. If the weights depend on further variables, these are referred to as concomitant variables. In marketing choice behaviour is often modelled in dependence of marketing mix variables such as price, promotion and display. Under the assumption that groups of respondents with different price, promotion and display elasticities exist mixtures of regressions are fitted to model consumer heterogeneity and segment the market. Socio-demographic variables such as age and gender have often been shown to be related to the different market segments even though they generally do not perform well when used to a-priori segment the market. The relationships between the behavioural and the socio-demographic variables is then modelled through concomitant variable models where the group sizes (i.e.~the weights of the mixture) depend on the socio-demographic variables. The model class is given by \begin{align*} h(y|x, w, \psi) &= \sum_{k = 1}^K \pi_k(w, \alpha) f_k(y|x,\theta_{k})\\ &= \sum_{k = 1}^K \pi_k(w, \alpha) \prod_{d=1}^D f_{kd}(y_d|x_d,\theta_{kd}), \end{align*} where $\psi$ denotes the vector of all parameters for the mixture density $h()$ and is given by $(\alpha, (\theta_k)_{k=1,\ldots,K})$. $y$ denotes the response, $x$ the predictor and $w$ the concomitant variables. $f_k$ is the component specific density function. Multivariate variables $y$ are assumed to be dividable into $D$ subsets where the component densities are independent between the subsets, i.e.~the component density $f_k$ is given by a product over $D$ densities which are defined for the subset variables $y_d$ and $x_d$ for $d=1,\ldots,D$. The component specific parameters are given by $\theta_k = (\theta_{kd})_{d=1,\ldots,D}$. Under the assumption that $N$ observations are available the dimensions of the variables are given by $y = (y_d)_{d=1,\ldots,D} \in \mathbb{R}^{N \times \sum_{d=1}^D k_{yd}}$, $x = (x_d)_{d=1,\ldots,D} \in \mathbb{R}^{N \times \sum_{d=1}^D k_{xd}}$ for all $d = 1,\ldots,D$ and $w \in \mathbb{R}^{N \times k_w}$. In this notation $k_{yd}$ denotes the dimension of the $d^{\textrm{th}}$ response, $k_{xd}$ the dimension of the $d^{\textrm{th}}$ predictors and $k_w$ the dimension of the concomitant variables. For mixtures of GLMs each of the $d$ responses will in general be univariate, i.e.~multivariate responses will be conditionally independent given the segment memberships. For the component weights $\pi_k$ it holds $\forall w$ that \begin{equation}\label{eq:prior} \sum_{k=1}^K \pi_k(w,\alpha) = 1 \quad \textrm{and} \quad \pi_k(w, \alpha) > 0, \, \forall k, \end{equation} where $\alpha$ are the parameters of the concomitant variable model. For the moment focus is given to finite mixtures where the component specific densities are from the same parametric family, i.e.~$f_{kd} \equiv f_d$ for notational simplicity. If $f_d$ is from the exponential family of distributions and for each component a generalized linear model is fitted \citep[GLMs;][]{mixtures:McCullagh+Nelder:1989} these models are also called GLIMMIX models \citep{mixtures:Wedel+DeSarbo:1995}. In this case the component specific parameters are given by $\theta_{kd} = (\beta'_{kd}, \phi_{kd})$ where $\beta_{kd}$ are the regression coefficients and $\phi_{kd}$ is the dispersion parameter. The component specific parameters $\theta_{kd}$ are either restricted to be equal over all components, to vary between groups of components or to vary between all components. The varying between groups is referred to as varying parameters with one level of nesting. A disjoint partition $K_c$, $c = 1,\ldots,C$ of the set $\tilde{K} := \{1\ldots,K\}$ is defined for the regression coefficients. $C$ is the number of groups of the regression coefficients at the nesting level. The regression coefficients are accordingly split into three groups: \begin{align*} \beta_{kd} &= (\beta'_{1d}, \beta'_{2,c(k)d}, \beta'_{3,kd})', \end{align*} where $c(k) = \{c = 1,\ldots, C: k \in K_c\}$. Similar a disjoint partition $K_v$, $v = 1,\ldots,V$, of $\tilde{K}$ can be defined for the dispersion parameters if nested varying parameters are present. $V$ denotes the number of groups of the dispersion parameters at the nesting level. This gives: \begin{align*} \phi_{kd} &= \left\{\begin{array}{ll} \phi_{d} & \textrm{for constant parameters}\\ \phi_{kd} & \textrm{for varying parameters}\\ \phi_{v(k)d} & \textrm{for nested varying parameters} \end{array}\right. \end{align*} where $v(k) = \{v = 1,\ldots,V: k \in K_v\}$. The nesting structure of the component specific parameters is also described in \cite{mixtures:Gruen+Leisch:2006}. Different concomitant variable models are possible to determine the component weights \citep{mixtures:Dayton+Macready:1988}. The mapping function only has to fulfill condition \eqref{eq:prior}. In the following a multinomial logit model is assumed for the $\pi_k$ given by \begin{equation*} \pi_k(w,\alpha) = \frac{e^{w'\alpha_k}}{\sum_{u = 1}^K e^{w'\alpha_u}} \quad \forall k, \end{equation*} with $\alpha = (\alpha'_k)'_{k=1,\ldots,K}$ and $\alpha_1 \equiv 0$. %%------------------------------------------------------------------------- \subsection{Parameter estimation}\label{sec:estimation} The EM algorithm \citep{mixtures:Dempster+Laird+Rubin:1977} is the most common method for maximum likelihood estimation of finite mixture models where the number of components $K$ is fixed. The EM algorithm applies a missing data augmentation scheme. It is assumed that a latent variable $z_n \in \{0,1\}^K$ exists for each observation $n$ which indicates the component membership, i.e.~$z_{nk}$ equals 1 if observation $n$ comes from component $k$ and 0 otherwise. Furthermore it holds that $\sum_{k=1}^K z_{nk}=1$ for all $n$. In the EM algorithm these unobserved component memberships $z_{nk}$ of the observations are treated as missing values and the data is augmented by estimates of the component membership, i.e.~the estimated a-posteriori probabilities $\hat{p}_{nk}$. For a sample of $N$ observations $\{(y_1, x_1, w_1), \ldots, (y_N, x_N, w_N)\}$ the EM algorithm is given by: \begin{description} \item[E-step:] Given the current parameter estimates $\psi^{(i)}$ in the $i$-th iteration, replace the missing data $z_{nk}$ by the estimated a-posteriori probabilities \begin{align*} \hat{p}_{nk} & = \frac{\displaystyle \pi_k(w_n, \alpha^{(i)}) f(y_n| x_n, \theta_k^{(i)}) }{\displaystyle \sum_{u = 1}^K \pi_u(w_n, \alpha^{(i)}) f(y_n |x_n, \theta_u^{(i)}) }. \end{align*} \item[M-step:] Given the estimates for the a-posteriori probabilities $\hat{p}_{nk}$ (which are functions of $\psi^{(i)}$), obtain new estimates $\psi^{(i+1)}$ of the parameters by maximizing \begin{align*} Q(\psi^{(i+1)}|\psi^{(i)}) &= Q_1(\theta^{(i+1)} | \psi^{(i)}) + Q_2(\alpha^{(i+1)} | \psi^{(i)}), \end{align*} where \begin{align*} Q_1(\theta^{(i+1)} | \psi^{(i)}) &= \sum_{n = 1}^N \sum_{k = 1}^K \hat{p}_{nk} \log(f(y_n | x_n, \theta_k^{(i+1)})) \end{align*} and \begin{align*} Q_2(\alpha^{(i+1)}| \psi^{(i)}) &= \sum_{n = 1}^N \sum_{k = 1}^K \hat{p}_{nk} \log(\pi_k(w_n, \alpha^{(i+1)})). \end{align*} $Q_1$ and $Q_2$ can be maximized separately. The maximization of $Q_1$ gives new estimates $\theta^{(i+1)}$ and the maximization of $Q_2$ gives $\alpha^{(i+1)}$. $Q_1$ is maximized separately for each $d=1,\ldots,D$ using weighted ML estimation of GLMs and $Q_2$ using weighted ML estimation of multinomial logit models. \end{description} Different variants of the EM algorithm exist such as the stochastic EM \citep[SEM;][]{mixtures:Diebolt+Ip:1996} or the classification EM \citep[CEM;][]{mixtures:Celeux+Govaert:1992}. These two variants are also implemented in package \pkg{flexmix}. For both variants an additional step is made between the expectation and maximization steps. This step uses the estimated a-posteriori probabilities and assigns each observation to only one component, i.e.~classifies it into one component. For SEM this assignment is determined in a stochastic way while it is a deterministic assignment for CEM. For the SEM algorithm the additional step is given by: \begin{description} \item[S-step:] Given the a-posteriori probabilities draw \begin{align*} \hat{z}_n &\sim \textrm{Mult}((\hat{p}_{nk})_{k=1,\ldots,K}, 1) \end{align*} where $\textrm{Mult}(\theta, T)$ denotes the multinomial distribution with success probabilities $\theta$ and number of trials $T$. \end{description} Afterwards, the $\hat{z}_{nk}$ are used instead of the $\hat{p}_{nk}$ in the M-step. For the CEM the additional step is given by: \begin{description} \item[C-step:] Given the a-posteriori probabilities define \begin{align*} \hat{z}_{nk} &= \left\{\begin{array}{ll} 1&\textrm{if } k = \min\{ l : \hat{p}_{nl} \geq \hat{p}_{nk}\, \forall k=1,\ldots,K\}\\ 0&\textrm{otherwise}. \end{array}\right. \end{align*} \end{description} Please note that in this step the observation is assigned to the component with the smallest index if the same maximum a-posteriori probability is observed for several components. Both of these variants have been proposed to improve the performance of the EM algorithm, because the ordinary EM algorithm tends to converge rather slowly and only to a local optimum. The convergence behavior can be expected to be better for the CEM than ordinary EM algorithm, while SEM can escape convergence to a local optimum. However, the CEM algorithm does not give ML estimates because it maximizes the complete likelihood. For SEM good approximations of the ML estimator are obtained if the parameters where the maximum likelihood was encountered are used as estimates. Another possibility for determining parameter estimates from the SEM algorithm could be the mean after discarding a suitable number of burn-ins. An implementational advantage of both variants is that no weighted maximization is necessary in the M-step. It has been shown that the values of the likelihood are monotonically increased during the EM algorithm. On the one hand this ensures the convergence of the EM algorithm if the likelihood is bounded, but on the other hand only the detection of a local maximum can be guaranteed. Therefore, it is recommended to repeat the EM algorithm with different initializations and choose as final solution the one with the maximum likelihood. Different initialization strategies for the EM algorithm have been proposed, as its convergence to the optimal solution depends on the initialization \citep{mixtures:Biernacki+Celeux+Govaert:2003,mixtures:Karlis+Xekalaki:2003}. Proposed strategies are for example to first make several runs of the SEM or CEM algorithm with different random initializations and then start the EM at the best solution encountered. The component specific parameter estimates can be determined separately for each $d=1,\ldots,D$. For simplicity of presentation the following description assumes $D=1$. If all parameter estimates vary between the component distributions they can be determined separately for each component in the M-step. However, if also constant or nested varying parameters are specified, the component specific estimation problems are not independent from each other any more. Parameters have to be estimated which occur in several or all components and hence, the parameters of the different components have to be determined simultaneously for all components. The estimation problem for all component specific parameters is then obtained by replicating the vector of observations $y = (y_n)_{n=1,\ldots,N}$ $K$ times and defining the covariate matrix $X = (X_{\textrm{constant}}, X_{\textrm{nested}}, X_{\textrm{varying}})$ by \begin{align*} &X_{\textrm{constant}} = \mathbf{1}_K \otimes (x'_{1,n})_{n=1,\ldots,N}\\ &X_{\textrm{nested}} = \mathbf{J} \odot (x'_{2,n})_{n=1,\ldots,N}\\ &X_{\textrm{varying}} = \mathbf{I}_K \otimes(x'_{3,n})_{n=1,\ldots,N}, \end{align*} where $\mathbf{1}_K$ is a vector of 1s of length $K$, $\mathbf{J}$ is the incidence matrix for each component $k=1,\ldots,K$ and each nesting group $c \in C$ and hence is of dimension $K \times |C|$, and $\mathbf{I}_K$ is the identity matrix of dimension $K \times K$. $\otimes$ denotes the Kronecker product and $\odot$ the Khatri-Rao product (i.e., the column-wise Kronecker product). $x_{m,n}$ are the covariates of the corresponding coefficients $\beta_{m,.}$ for $m=1,2,3$. Please note that the weights used for the estimation are the a-posteriori probabilities which are stacked for all components, i.e.~a vector of length $N K$ is obtained. Due to the replication of data in the case of constant or nested varying parameters the amount of memory needed for fitting the mixture model to large datasets is substantially increased and it might be easier to fit only varying coefficients to these datasets. To overcome this problem it could be considered to implement special data structures in order to avoid storing the same data multiple times for large datasets. Before each M-step the average component sizes (over the given data points) are checked and components which are smaller than a given (relative) minimum size are omitted in order to avoid too small components where fitting problems might arise. This strategy has already been recommended for the SEM algorithm \citep{mixtures:Celeux+Diebolt:1988} because it allows to determine the suitable number of components in an automatic way given that the a-priori specified number of components is large enough. This recommendation is based on the assumption that the redundent components will be omitted during the estimation process if the algorithm is started with too many components. If omission of small components is not desired the minimum size required can be set to zero. All components will be then retained throughout the EM algorithm and a mixture with the number of components specified in the initialization will be returned. The algorithm is stopped if the relative change in the log-likelihood is smaller than a pre-specified $\epsilon$ or the maximum number of iterations is reached. For model selection different information criteria are available: AIC, BIC and ICL \citep[Integrated Complete Likelihood;][]{mixtures:Biernacki+Celeux+Govaert:2000}. They are of the form twice the negative loglikelihood plus number of parameters times $k$ where $k=2$ for the AIC and $k$ equals the logarithm of the number of observations for the BIC. The ICL is the same as the BIC except that the complete likelihood (where the missing class memberships are replaced by the assignments induced by the maximum a-posteriori probabilities) instead of the likelihood is used. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Using the new functionality} \label{sec:using-new-funct} In the following model fitting and model selection in \proglang{R} is illustrated on several examples including mixtures of Gaussian, binomial and Poisson regression models, see also \cite{mixtures:Gruen:2006} and \cite{mixtures:Gruen+Leisch:2007a}. More examples for mixtures of GLMs are provided as part of the software package through a collection of artificial and real world datasets, most of which have been previously used in the literature (see references in the online help pages). Each dataset can be loaded to \proglang{R} with \code{data("}\textit{name}\code{")} and the fitting of the proposed models can be replayed using \code{example("}\textit{name}\code{")}. Further details on these examples are given in a user guide which can be accessed using \code{vignette("regression-examples", package="flexmix")} from within \proglang{R}. %%----------------------------------------------------------------------- \subsection{Artificial example}\label{sec:artificial-example} In the following the artificial dataset \code{NPreg} is used which has already been used in \cite{mixtures:Leisch:2004} to illustrate the application of package \pkg{flexmix}. The data comes from two latent classes of size \Sexpr{nrow(NPreg)/2} each and for each of the classes the data is drawn with respect to the following structure: \begin{center} \begin{tabular}{ll} Class~1: & $ \mathit{yn} = 5x+\epsilon$\\ Class~2: & $ \mathit{yn} = 15+10x-x^2+\epsilon$ \end{tabular} \end{center} with $\epsilon\sim N(0,9)$, see the left panel of Figure~\ref{fig:npreg}. The dataset \code{NPreg} also includes a response $\mathit{yp}$ which is given by a generalized linear model following a Poisson distribution and using the logarithm as link function. The parameters of the mean are given for the two classes by: \begin{center} \begin{tabular}{ll} Class~1: & $ \mu_1 = 2 - 0.2x$\\ Class~2: & $ \mu_2 = 1 + 0.1x$. \end{tabular} \end{center} This signifies that given $x$ the response $\mathit{yp}$ in group $k$ follows a Poisson distribution with mean $e^{\mu_k}$, see the right panel of Figure~\ref{fig:npreg}. \setkeys{Gin}{width=\textwidth} \begin{figure} \centering <>= par(mfrow=c(1,2)) plot(yn~x, col=class, pch=class, data=NPreg) plot(yp~x, col=class, pch=class, data=NPreg) @ \caption{Standard regression example (left) and Poisson regression (right).} \label{fig:npreg} \end{figure} This model can be fitted in \proglang{R} using the commands: <<>>= suppressWarnings(RNGversion("3.5.0")) set.seed(1802) library("flexmix") data("NPreg", package = "flexmix") Model_n <- FLXMRglm(yn ~ . + I(x^2)) Model_p <- FLXMRglm(yp ~ ., family = "poisson") m1 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), control = list(verbose = 10)) @ If the dimensions are independent the component specific model for multivariate observations can be specified as a list of models for each dimension. The estimation can be controlled with the \code{control} argument which is specified with an object of class \code{"FLXcontrol"}. For convenience also a named list can be provided which is used to construct and set the respective slots of the \code{"FLXcontrol"} object. Elements of the control object are \code{classify} to select ordinary EM, CEM or SEM, \code{minprior} for the minimum relative size of components, \code{iter.max} for the maximum number of iterations and \code{verbose} for monitoring. If \code{verbose} is a positive integer the log-likelihood is reported every \code{verbose} iterations and at convergence together with the number of iterations made. The default is to not report any log-likelihood information during the fitting process. The estimated model \code{m1} is of class \code{"flexmix"} and the result of the default plot method for this class is given in Figure~\ref{fig:root1}. This plot method uses package \pkg{lattice} \citep{mixtures:Sarkar:2008} and the usual parameters can be specified to alter the plot, e.g.~the argument \code{layout} determines the arrangement of the panels. The returned object is of class \code{"trellis"} and the plotting can also be influenced by the arguments of its show method. The default plot prints rootograms (i.e., a histogram of the square root of counts) of the a-posteriori probabilities of each observation separately for each component. For each component the observations with a-posteriori probabilities less than a pre-specified $\epsilon$ (default is $10^{-4}$) for this component are omitted in order to avoid that the bar at zero dominates the plot \citep{mixtures:Leisch:2004a}. Please note that the labels of the y-axis report the number of observations in each bar, i.e.~the squared values used for the rootograms. \begin{figure} \centering <>= print(plot(m1)) @ \caption{The plot method for \code{"flexmix"} objects, here obtained by \code{plot(m1)}, shows rootograms of the posterior class probabilities.} \label{fig:root1} \end{figure} More detailed information on the estimated parameters with respect to standard deviations and significance tests can be obtained with function \code{refit()}. This function determines the variance-covariance matrix of the estimated parameters by using the inverted negative Hesse matrix as computed by the general purpose optimizer \code{optim()} on the full likelihood of the model. \code{optim()} is initialized in the solution obtained with the EM algorithm. For mixtures of GLMs we also implemented the gradient, which speeds up convergence and gives more precise estimates of the Hessian. Naturally, function \code{refit()} will also work for models which have been determined by applying some model selection strategy depending on the data (AIC, BIC, \ldots). The same caution is necessary as when using \code{summary()} on standard linear models selected using \code{step()}: The p-values shown are not correct because they have not been adjusted for the fact that the same data are used to select the model and compute the p-values. So use them only in an exploratory manner in this context, see also \cite{mixtures:Harrell:2001} for more details on the general problem. The returned object can be inspected using \code{summary()} with arguments \code{which} to specify if information for the component model or the concomitant variable model should be shown and \code{model} to indicate for which dimension of the component models this should be done. Selecting \code{model=1} gives the parameter estimates for the dimension where the response variable follows a Gaussian distribution. <<>>= m1.refit <- refit(m1) summary(m1.refit, which = "model", model = 1) @ \begin{figure} \centering <>= print(plot(m1.refit, layout = c(1,3), bycluster = FALSE, main = expression(paste(yn *tilde(" ")* x + x^2))), split= c(1,1,2,1), more = TRUE) print(plot(m1.refit, model = 2, main = expression(paste(yp *tilde(" ")* x)), layout = c(1,2), bycluster = FALSE), split = c(2,1,2,1)) @ \caption{The default plot for refitted \code{"flexmix"} objects, here obtained by \code{plot(refit(m1), model = 1)} and \code{plot(refit(m1), model = 2)}, shows the coefficient estimates and their confidence intervals.} \label{fig:refit} \end{figure} The default plot method for the refitted \code{"flexmix"} object depicts the estimated coefficients with corresponding confidence intervals and is given in Figure~\ref{fig:refit}. It can be seen that for the first model the confidence intervals of the coefficients of the intercept and the quadratic term of \code{x} overlap with zero. A model where these coefficients are set to zero can be estimated with the model driver function \code{FLXMRglmfix()} and the following commands for specifying the nesting structure. The argument \code{nested} needs input for the number of components in each group (given by \code{k}) and the formula which determines the model matrix for the nesting (given by \code{formula}). This information can be provided in a named list. For the restricted model the element \code{k} is a vector with two 1s because each of the components has different parameters. The formulas specifying the model matrices of these coefficients are \verb/~ 1 + I(x^2)/ for an intercept and a quadratic term of $x$ for component 1 and \code{~ 0} for no additional coefficients for component 2. The EM algorithm is initialized in the previously fitted model by passing the posterior probabilities in the argument \code{cluster}. <<>>= Model_n2 <- FLXMRglmfix(yn ~ . + 0, nested = list(k = c(1, 1), formula = c(~ 1 + I(x^2), ~ 0))) m2 <- flexmix(. ~ x, data = NPreg, cluster = posterior(m1), model = list(Model_n2, Model_p)) m2 @ Model selection based on the BIC would suggest the smaller model which also corresponds to the true underlying model. <<>>= c(BIC(m1), BIC(m2)) @ %%----------------------------------------------------------------------- \subsection{Beta-blockers dataset} \label{sec:beta-blockers} The dataset is analyzed in \cite{mixtures:Aitkin:1999, mixtures:Aitkin:1999a} using a finite mixture of binomial regression models. Furthermore, it is described in \citet[p.~165]{mixtures:McLachlan+Peel:2000}. The dataset is from a 22-center clinical trial of beta-blockers for reducing mortality after myocardial infarction. A two-level model is assumed to represent the data, where centers are at the upper level and patients at the lower level. The data is illustrated in Figure~\ref{fig:beta}. First, the center information is ignored and a binomial logit regression model with treatment as covariate is fitted using \code{glm}, i.e.~$K=1$ and it is assumed that the different centers are comparable: <<>>= data("betablocker", package = "flexmix") betaGlm <- glm(cbind(Deaths, Total - Deaths) ~ Treatment, family = "binomial", data = betablocker) betaGlm @ The residual deviance suggests that overdispersion is present in the data. In the next step the intercept is allowed to follow a mixture distribution given the centers. This signifies that the component membership is fixed for each center. This grouping is specified in \proglang{R} by adding \code{| Center} to the formula similar to the notation used in \pkg{nlme} \citep{mixtures:Pinheiro+Bates:2000}. Under the assumption of homogeneity within centers identifiability of the model class can be ensured as induced by the sufficient conditions for identifability given in \cite{mixtures:Follmann+Lambert:1991} for binomial logit models with varying intercepts and \cite{mixtures:Gruen+Leisch:2008} for multinomial logit models with varying and constant parameters. In order to determine the suitable number of components, the mixture is fitted with different numbers of components. <<>>= betaMixFix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = FLXMRglmfix(family = "binomial", fixed = ~ Treatment), k = 2:4, nrep = 5, data = betablocker) @ The returned object is of class \code{"stepFlexmix"} and printing the object gives the information on the number of iterations until termination of the EM algorithm, a logical indicating if the EM algorithm has converged, the log-likelihood and some model information criteria. The plot method compares the fitted models using the different model information criteria. <<>>= betaMixFix @ A specific \code{"flexmix"} model contained in the \code{"stepFlexmix"} object can be selected using \code{getModel()} with argument \code{which} to specify the selection criterion. The best model with respect to the BIC is selected with: <<>>= betaMixFix_3 <- getModel(betaMixFix, which = "BIC") betaMixFix_3 <- relabel(betaMixFix_3, "model", "Intercept") @ The components of the selected model are ordered with respect to the estimated intercept values. In this case a model with three components is selected with respect to the BIC. The fitted values for the model with three components are given in Figure~\ref{fig:beta} separately for each component and the treatment and control groups. The fitted parameters of the component specific models can be accessed with: <<>>= parameters(betaMixFix_3) @ Please note that the coefficients of variable \code{Treatment} are the same for all three components. \begin{figure} \centering <>= library("grid") betablocker$Center <- with(betablocker, factor(Center, levels = Center[order((Deaths/Total)[1:22])])) clusters <- factor(clusters(betaMixFix_3), labels = paste("Cluster", 1:3)) print(dotplot(Deaths/Total ~ Center | clusters, groups = Treatment, as.table = TRUE, data = betablocker, xlab = "Center", layout = c(3, 1), scales = list(x = list(cex = 0.7, tck = c(1, 0))), key = simpleKey(levels(betablocker$Treatment), lines = TRUE, corner = c(1,0)))) betaMixFix.fitted <- fitted(betaMixFix_3) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[1:22, i], "native"), gp = gpar(lty = 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[23:44, i], "native"), gp = gpar(lty = 2)) } @ \setkeys{Gin}{width=0.8\textwidth} \caption{Relative number of deaths for the treatment and the control group for each center in the beta-blocker dataset. The centers are sorted by the relative number of deaths in the control group. The lines indicate the fitted values for each component of the 3-component mixture model with varying intercept and constant parameters for treatment.} \label{fig:beta} \end{figure} The variable \code{Treatment} can also be included in the varying part of the model. This signifies that a mixture distribution is assumed where for each component different values are allowed for the intercept and the treatment coefficient. This mixture distribution can be specified using function \code{FLXMRglm()}. Again it is assumed that the heterogeneity is only between centers and therefore the aggregated data for each center can be used. <<>>= betaMix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ Treatment | Center, model = FLXMRglm(family = "binomial"), k = 3, nrep = 5, data = betablocker) betaMix <- relabel(betaMix, "model", "Treatment") parameters(betaMix) c(BIC(betaMixFix_3), BIC(betaMix)) @ The difference between model \code{betaMix} and \code{betaMixFix\_3} is that the treatment coefficients are the same for all three components for \code{betaMixFix\_3} while they have different values for \code{betaMix} which can easily be seen when comparing the fitted component specific parameters. The larger model \code{betaMix} which also allows varying parameters for treatment has a higher BIC and therefore the smaller model \code{betaMixFix\_3} would be preferred. The default plot for \code{"flexmix"} objects gives a rootogram of the posterior probabilities for each component. Argument \code{mark} can be used to inspect with which components the specified component overlaps as all observations are coloured in the different panels which are assigned to this component based on the maximum a-posteriori probabilities. \begin{figure} \centering <>= print(plot(betaMixFix_3, nint = 10, mark = 1, col = "grey", layout = c(3, 1))) @ \caption{Default plot of \code{"flexmix"} objects where the observations assigned to the first component are marked.}\label{fig:default} \end{figure} \begin{figure} \centering <>= print(plot(betaMixFix_3, nint = 10, mark = 2, col = "grey", layout = c(3, 1))) @ \caption{Default plot of \code{"flexmix"} objects where the observations assigned to the third component are marked.}\label{fig:default-2} \end{figure} The rootogram indicates that the components are well separated. In Figure~\ref{fig:default} it can be seen that component 1 is completely separated from the other two components, while Figure~\ref{fig:default-2} shows that component 2 has a slight overlap with both other components. The cluster assignments using the maximum a-posteriori probabilities are obtained with: <<>>= table(clusters(betaMix)) @ The estimated probabilities of death for each component for the treated patients and those in the control group can be obtained with: <<>>= predict(betaMix, newdata = data.frame(Treatment = c("Control", "Treated"))) @ or by obtaining the fitted values for two observations (e.g.~rows 1 and 23) with the desired levels of the predictor \code{Treatment} <<>>= betablocker[c(1, 23), ] fitted(betaMix)[c(1, 23), ] @ A further analysis of the model is possible with function \code{refit()} which returns the estimated coefficients together with the standard deviations, z-values and corresponding p-values. Please note that the p-values are only approximate in the sense that they have not been corrected for the fact that the data has already been used to determine the specific fitted model. <<>>= summary(refit(betaMix)) @ Given the estimated treatment coefficients we now also compare this model to a model where the treatment coefficient is assumed to be the same for components 1 and 2. Such a model is specified using the model driver \code{FLXMRglmfix()}. As the first two components are assumed to have the same coeffcients for treatment and for the third component the coefficient for treatment shall be set to zero the argument \code{nested} has \code{k = c(2,1)} and \code{formula = c(\~{}Treatment, \~{})}. <<>>= ModelNested <- FLXMRglmfix(family = "binomial", nested = list(k = c(2, 1), formula = c(~ Treatment, ~ 0))) betaMixNested <- flexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = ModelNested, k = 3, data = betablocker, cluster = posterior(betaMix)) parameters(betaMixNested) c(BIC(betaMix), BIC(betaMixNested), BIC(betaMixFix_3)) @ The comparison of the BIC values suggests that the nested model with the same treatment effect for two components and no treatment effect for the third component is the best. %%----------------------------------------------------------------------- \subsection[Productivity of Ph.D. students in biochemistry]{Productivity of Ph.D.~students in biochemistry} \label{sec:bioChemists} <>= data("bioChemists", package = "flexmix") @ This dataset is taken from \cite{mixtures:Long:1990}. It contains \Sexpr{nrow(bioChemists)} observations from academics who obtained their Ph.D.~degree in biochemistry in the 1950s and 60s. It includes \Sexpr{sum(bioChemists$fem=="Women")} women and \Sexpr{sum(bioChemists$fem=="Men")} men. The productivity was measured by counting the number of publications in scientific journals during the three years period ending the year after the Ph.D.~was received. In addition data on the productivity and the prestige of the mentor and the Ph.D.~department was collected. Two measures of family characteristics were recorded: marriage status and number of children of age 5 and lower by the year of the Ph.D. First, mixtures with one, two and three components and only varying parameters are fitted, and the model minimizing the BIC is selected. This is based on the assumption that unobserved heterogeneity is present in the data due to latent differences between the students in order to be productive and achieve publications. Starting with the most general model to determine the number of components using information criteria and checking for possible model restrictions after having the number of components fixed is a common strategy in finite mixture modelling \citep[see][]{mixtures:Wang+Puterman+Cockburn:1996}. Function \code{refit()} is used to determine confidence intervals for the parameters in order to choose suitable alternative models. However, it has to be noted that in the course of the procedure these confidence intervals will not be correct any more because the specific fitted models have already been determined using the same data. <<>>= data("bioChemists", package = "flexmix") Model1 <- FLXMRglm(family = "poisson") ff_1 <- stepFlexmix(art ~ ., data = bioChemists, k = 1:3, model = Model1) ff_1 <- getModel(ff_1, "BIC") @ The selected model has \Sexpr{ff_1@k} components. The estimated coefficients of the components are given in Figure~\ref{fig:coefficients-1} together with the corresponding 95\% confidence intervals using the plot method for objects returned by \code{refit()}. The plot shows that the confidence intervals of the parameters for \code{kid5}, \code{mar}, \code{ment} and \code{phd} overlap for the two components. In a next step a mixture with two components is therefore fitted where only a varying intercept and a varying coefficient for \code{fem} is specified and all other coefficients are constant. The EM algorithm is initialized with the fitted mixture model using \code{posterior()}. \begin{figure} \centering <>= print(plot(refit(ff_1), bycluster = FALSE, scales = list(x = list(relation = "free")))) @ \caption{Coefficient estimates and confidence intervals for the model with only varying parameters.}\label{fig:coefficients-1} \end{figure} <<>>= Model2 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_2 <- flexmix(art ~ fem + phd, data = bioChemists, cluster = posterior(ff_1), model = Model2) c(BIC(ff_1), BIC(ff_2)) @ If the BIC is used for model comparison the smaller model including only varying coefficients for the intercept and \code{fem} is preferred. The coefficients of the fitted model can be obtained using \code{refit()}: <<>>= summary(refit(ff_2)) @ It can be seen that the coefficient of \code{phd} does for both components not differ significantly from zero and might be omitted. This again improves the BIC. <<>>= Model3 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_3 <- flexmix(art ~ fem, data = bioChemists, cluster = posterior(ff_2), model = Model3) c(BIC(ff_2), BIC(ff_3)) @ The coefficients of the restricted model without \code{phd} are given in Figure~\ref{fig:coefficients-2}. \begin{figure}[t] \centering <>= print(plot(refit(ff_3), bycluster = FALSE, scales = list(x = list(relation = "free")))) @ \caption{Coefficient estimates and confidence intervals for the model with varying and constant parameters where the variable \code{phd} is not used in the regression.}\label{fig:coefficients-2} \end{figure} An alternative model would be to assume that gender does not directly influence the number of articles but has an impact on the segment sizes. <<>>= Model4 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_4 <- flexmix(art ~ 1, data = bioChemists, cluster = posterior(ff_2), concomitant = FLXPmultinom(~ fem), model = Model4) parameters(ff_4) summary(refit(ff_4), which = "concomitant") BIC(ff_4) @ This suggests that the proportion of women is lower in the second component which is the more productive segment. The alternative modelling strategy where homogeneity is assumed at the beginning and a varying interept is added if overdispersion is observed leads to the following model which is the best with respect to the BIC. <<>>= Model5 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + ment + fem) ff_5 <- flexmix(art ~ 1, data = bioChemists, cluster = posterior(ff_2), model = Model5) BIC(ff_5) @ \begin{figure} \centering \setkeys{Gin}{width=0.8\textwidth} <>= pp <- predict(ff_5, newdata = data.frame(kid5 = 0, mar = factor("Married", levels = c("Single", "Married")), fem = c("Men", "Women"), ment = mean(bioChemists$ment))) matplot(0:12, sapply(unlist(pp), function(x) dpois(0:12, x)), type = "b", lty = 1, xlab = "Number of articles", ylab = "Probability") legend("topright", paste("Comp.", rep(1:2, each = 2), ":", c("Men", "Women")), lty = 1, col = 1:4, pch = paste(1:4), bty = "n") @ \caption{The estimated productivity for each compoment for men and women.} \label{fig:estimated} \end{figure} \setkeys{Gin}{width=0.98\textwidth} In Figure~\ref{fig:estimated} the estimated distribution of productivity for model \code{ff\_5} are given separately for men and women as well as for each component where for all other variables the mean values are used for the numeric variables and the most frequent category for the categorical variables. The two components differ in that component 1 contains the students who publish no article or only a single article, while the students in component 2 write on average several articles. With a constant coefficient for gender women publish less articles than men in both components. This example shows that different optimal models are chosen for different modelling procedures. However, the distributions induced by the different variants of the model class may be similar and therefore it is not suprising that they then will have similar BIC values. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Implementation}\label{sec:implementation} The new features extend the available model class described in \cite{mixtures:Leisch:2004} by providing infrastructure for concomitant variable models and for fitting mixtures of GLMs with varying and constant parameters for the component specific parameters. The implementation of the extensions of the model class made it necessary to define a better class structure for the component specific models and to modify the fit functions \code{flexmix()} and \code{FLXfit()}. An overview on the \proglang{S}4 class structure of the package is given in Figure~\ref{fig:class structure}. There is a class for unfitted finite mixture distributions given by \code{"FLXdist"} which contains a list of \code{"FLXM"} objects which determine the component specific models, a list of \code{"FLXcomponent"} objects which specify functions to determine the component specific log-likelihoods and predictions and which contain the component specific parameters, and an object of class \code{"FLXP"} which specifies the concomitant variable model. Class \code{"flexmix"} extends \code{"FLXdist"}. It represents a fitted finite mixture distribution and it contains the information about the fitting with the EM algorithm in the object of class \code{"FLXcontrol"}. Repeated fitting with the EM algorithm with different number of components is provided by function \code{stepFlexmix()} which returns an object of class \code{"stepFlexmix"}. Objects of class \code{"stepFlexmix"} contain the list of the fitted mixture models for each number of components in the slot \code{"models"}. \setkeys{Gin}{width=.9\textwidth} \begin{figure}[t] \centering \includegraphics{flexmix} \caption{UML class diagram \citep[see][]{mixtures:Fowler:2004} of the \pkg{flexmix} package.} \label{fig:class structure} \end{figure} \setkeys{Gin}{width=\textwidth} For the component specific model a virtual class \code{"FLXM"} is introduced which (currently) has two subclasses: \code{"FLXMC"} for model-based clustering and \code{"FLXMR"} for clusterwise regression, where predictor variables are given. Additional slots have been introduced to allow for data preprocessing and the construction of the components was separated from the fit and is implemented using lexical scoping \citep{mixtures:Gentleman+Ihaka:2000} in the slot \code{defineComponent}. \code{"FLXMC"} has an additional slot \code{dist} to specify the name of the distribution of the variable. In the future functionality shall be provided for sampling from a fitted or unfitted finite mixture. Using this slot observations can be generated by using the function which results from adding an \code{r} at the beginnning of the distribution name. This allows to only implement the (missing) random number generator functions and otherwise use the same method for sampling from mixtures with component specific models of class \code{"FLXMC"}. For \code{flexmix()} and \code{FLXfit()} code blocks which are model dependent have been identified and different methods implemented. Finite mixtures of regressions with varying, nested and constant parameters were a suitable model class for this identification task as they are different from models previously implemented. The main differences are: \begin{itemize} \item The number of components is related to the component specific model and the omission of small components during the EM algorithm impacts on the model. \item The parameters of the component specific models can not be determined separately in the M-step and a joint model matrix is needed. \end{itemize} This makes it also necessary to have different model dependent methods for \code{fitted()} which extracts the fitted values from a \code{"flexmix"} object, \code{predict()} which predicts new values for a \code{"flexmix"} object and \code{refit()} which refits an estimated model to obtain additional information for a \code{"flexmix"} object. %%----------------------------------------------------------------------- \subsection{Component specific models with varying and constant parameters}\label{sec:comp-models-with} A new M-step driver is provided which fits finite mixtures of GLMs with constant and nested varying parameters for the coefficients and the dispersion parameters. The class \code{"FLXMRglmfix"} returned by the driver \code{FLXMRglmfix()} has the following additional slots with respect to \code{"FLXMRglm"}: \begin{description} \item[\code{design}:] An incidence matrix indicating which columns of the model matrix are used for which component, i.e.~$\mathbf{D}=(\mathbf{1}_K,\mathbf{J}, \mathbf{I}_K)$. \item[\code{nestedformula}:] An object of class \code{"FLXnested"} containing the formula for the nested regression coefficients and the number of components in each $K_c$, $c \in C$. \item[\code{fixed}:] The formula for the constant regression coefficients. \item[\code{variance}:] A logical indicating if different variances shall be estimated for the components following a Gaussian distribution or a vector specifying the nested structure for estimating these variances. \end{description} The difference between estimating finite mixtures including only varying parameters using models specified with \code{FLXMRglm()} and those with varying and constant parameters using function \code{FLXMRglmfix()} is hidden from the user, as only the specified model is different. The fitted model is also of class \code{"flexmix"} and can be analyzed using the same functions as for any model fitted using package \pkg{flexmix}. The methods used are the same except if the slot containing the model is accessed and method dispatching is made via the model class. New methods are provided for models of class \code{"FLXMRglmfix"} for functions \code{refit()}, \code{fitted()} and \code{predict()} which can be used for analyzing the fitted model. The implementation allows repeated measurements by specifying a grouping variable in the formula argument of \code{flexmix()}. Furthermore, it has to be noticed that the model matrix is determined by updating the formula of the varying parameters successively with the formula of the constant and then of the nested varying parameters. This ensures that if a mixture distribution is fitted for the intercept, the model matrix of a categorical variable includes only the remaining columns for the constant parameters to have full column rank. However, this updating scheme makes it impossible to estimate a constant intercept while allowing varying parameters for a categorical variable. For this model one big model matrix is constructed where the observations are repeated $K$ times and suitable columns of zero added. The coefficients of all $K$ components are determined simultaneously in the M-step, while if only varying parameters are specified the maximization of the likelihood is made separately for all components. For large datasets the estimation of a combination of constant and varying parameters might therefore be more challenging than only varying parameters. %% ----------------------------------------------------------------------- \subsection{Concomitant variable models}\label{sec:conc-vari-models} For representing concomitant variable models the class \code{"FLXP"} is defined. It specifies how the concomitant variable model is fitted using the concomitant variable model matrix as predictor variables and the current a-posteriori probability estimates as response variables. The object has the following slots: \begin{description} \item[\code{fit}:] A \code{function (x, y, ...)} returning the fitted values for the component weights during the EM algorithm. \item[\code{refit}:] A \code{function (x, y, ...)} used for refitting the model. \item[\code{df}:] A \code{function (x, k, ...)} returning the degrees of freedom used for estimating the concomitant variable model given the model matrix \code{x} and the number of components \code{k}. \item[\code{x}:] A matrix containing the model matrix of the concomitant variables. \item[\code{formula}:] The formula for determining the model matrix \code{x}. \item[\code{name}:] A character string describing the model, which is only used for print output. \end{description} Two constructor functions for concomitant variable models are provided at the moment. \code{FLXPconstant()} is for constant component weights without concomitant variables and for multinomial logit models \code{FLXPmultinom()} can be used. \code{FLXPmultinom()} has its own class \code{"FLXPmultinom"} which extends \code{"FLXP"} and has an additional slot \code{coef} for the fitted coefficients. The multinomial logit models are fitted using package \pkg{nnet} \citep{mixtures:Venables+Ripley:2002}. %%----------------------------------------------------------------------- \subsection{Further changes} The estimation of the model with the EM algorithm was improved by adapting the variants to correspond to the CEM and SEM variants as outlined in the literature. To make this more explicit it is now also possible to use \code{"CEM"} or \code{"SEM"} to specify an EM variant in the \code{classify} argument of the \code{"FLXcontrol"} object. Even though the SEM algorithm can in general not be expected to converge the fitting procedure is also terminated for the SEM algorithm if the change in the relative log-likelhood is smaller than the pre-specified threshold. This is motivated by the fact that for well separated clusters the posteriors might converge to an indicator function with all weight concentrated in one component. The fitted model with the maximum likelihood encountered during the SEM algorithm is returned. For discrete data in general multiple observations with the same values are given in a dataset. A \code{weights} argument was added to the fitting function \code{flexmix()} in order to avoid repeating these observations in the provided dataset. The specification is through a \code{formula} in order to allow selecting a column of the data frame given in the \code{data} argument. The weights argument allows to avoid replicating the same observations and hence enables more efficient memory use in these applications. This possibitliy is especially useful in the context of model-based clustering for mixtures of Poisson distributions or latent class analysis with multivariate binary observations. In order to be able to apply different initialization strategies such as for example first running several different random initializations with CEM and then switching to ordinary EM using the best solution found by CEM for initialization a \code{posterior()} function was implemented. \code{posterior()} also takes a \code{newdata} argument and hence, it is possible to apply subset strategies for large datasets as suggested in \cite{mixtures:Wehrens+Buydens+Fraley:2004}. The returned matrix of the posterior probabilities can be used to specify the \code{cluster} argument for \code{flexmix()} and the posteriors are then used as weights in the first M-step. The default plot methods now use trellis graphics as implemented in package \pkg{lattice} \citep{mixtures:Sarkar:2008}. Users familiar with the syntax of these graphics and with the plotting and printing arguments will find the application intuitive as a lot of plotting arguments are passed to functions from \pkg{lattice} as for example \code{xyplot()} and \code{histogram()}. In fact only new panel, pre-panel and group-panel functions were implemented. The returned object is of class \code{"trellis"} and the show method for this class is used to create the plot. Function \code{refit()} was modified and has now two different estimation methods: \code{"optim"} and \code{"mstep"}. The default method \code{"optim"} determines the variance-covariance matrix of the parameters from the inverse Hessian of the full log-likelihood. The general purpose optimizer \code{optim()} is used to maximize the log-likelihood and initialized in the solution obtained with the EM algorithm. For mixtures of GLMs there are also functions implemented to determine the gradient which can be used to speed up convergence. The second method \code{"mstep"} is only a raw approximation. It performs an M-step where the a-posteriori probabilities are treated as given instead of estimated and returns for the component specific models nearly complete \code{"glm"} objects which can be further analyzed. The advantage of this method is that the return value is basically a list of standard \code{"glm"} objects, such that the regular methods for this class can be used. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Writing your own drivers}\label{sec:writing-your-own} Two examples are given in the following to demonstrate how new drivers can be provided for concomitant variable models and for component specific models. Easy extensibility is one of the main implementation aims of the package and it can be seen that writing new drivers requires only a few lines of code for providing the constructor functions which include the fit functions. %%----------------------------------------------------------------------- \subsection{Component specific models: Zero-inflated models}\label{sec:component-models} \lstset{frame=trbl,basicstyle=\small\tt,stepnumber=5,numbers=left} In Poisson or binomial regression models it can be often encountered that the observed number of zeros is higher than expected. A mixture with two components where one has mean zero can be used to model such data. These models are also referred to as zero-inflated models \citep[see for example][]{mixtures:Boehning+Dietz+Schlattmann:1999}. A generalization of this model class would be to fit mixtures with more than two components where one component has a mean fixed at zero. So this model class is a special case of a mixture of generalized linear models where (a) the family is restricted to Poisson and binomial and (b) the parameters of one component are fixed. For simplicity the implementation assumes that the component with mean zero is the first component. In addition we assume that the model matrix contains an intercept and to have the first component absorbing the access zeros the coefficient of the intercept is set to $-\infty$ and all other coefficients are set to zero. Hence, to implement this model using package \pkg{flexmix} an appropriate model class is needed with a corresponding convenience function for construction. During the fitting of the EM algorithm using \code{flexmix()} different methods for this model class are needed when determining the model matrix (to check the presence of an intercept), to check the model after a component is removed and for the M-step to account for the fact that the coefficients of the first component are fixed. For all other methods those available for \code{"FLXMRglm"} can be re-used. The code is given in Figure~\ref{fig:ziglm.R}. \begin{figure} \centering \begin{minipage}{0.98\textwidth} \lstinputlisting{ziglm.R} \end{minipage} \caption{Driver for a zero-inflated component specific model.} \label{fig:ziglm.R} \end{figure} The model class \code{"FLXMRziglm"} is defined as extending \code{"FLXMRglm"} in order to be able to inherit methods from this model class. For construction of a \code{"FLXMRziglm"} class the convenicence function \code{FLXMRziglm()} is used which calls \code{FLXMRglm()}. The only differences are that the family is restricted to binomial or Poisson, that a different name is assigned and that an object of the correct class is returned. The presence of the intercept in the model matrix is checked in \code{FLXgetModelmatrix()} after using the method available for \code{"FLXMRglm"} models as indicated by the call to \code{callNextMethod()}. During the EM algorithm \code{FLXremoveComponent()} is called if one component is removed. For this model class it checks if the first component has been removed and if this is the case the model class is changed to \code{"FLXMRglm"}. In the M-step the coefficients of the first component are fixed and not estimated, while for the remaining components the M-step of \code{"FLXMRglm"} objects can be used. During the EM algorithm \code{FLXmstep()} is called to perform the M-step and returns a list of \code{"FLXcomponent"} objects with the fitted parameters. A new method for this function is needed for \code{"FLXMRziglm"} objects in order to account for the fixed coefficients in the first component, i.e.~for the first component the \code{"FLXcomponent"} object is constructed and concatenated with the list of \code{"FLXcomponent"} objects returned by using the \code{FLXmstep()} method for \code{"FLXMRglm"} models for the remaining components. Similar modifications are necessary in order to be able to use \code{refit()} for this model class. The code for implementing the \code{refit()} method using \code{optim()} for \code{"FLXMRziglm"} is not shown, but can be inspected in the source code of the package. \subsubsection{Example: Using the driver} This new M-step driver can be used to estimate a zero-inflated Poisson model to the data given in \cite{mixtures:Boehning+Dietz+Schlattmann:1999}. The dataset \code{dmft} consists of count data from a dental epidemiological study for evaluation of various programs for reducing caries collected among school children from an urban area of Belo Horizonte (Brazil). The variables included are the number of decayed, missing or filled teeth (DMFT index) at the beginning and at the end of the observation period, the gender, the ethnic background and the specific treatment for \Sexpr{nrow(dmft)} children. The model can be fitted with the new driver function using the following commands: <<>>= data("dmft", package = "flexmix") Model <- FLXMRziglm(family = "poisson") Fitted <- flexmix(End ~ log(Begin + 0.5) + Gender + Ethnic + Treatment, model = Model, k = 2 , data = dmft, control = list(minprior = 0.01)) summary(refit(Fitted)) @ Please note that \cite{mixtures:Boehning+Dietz+Schlattmann:1999} added the predictor \code{log(Begin + 0.5)} to serve as an offset in order to be able to analyse the improvement in the DMFT index from the beginning to the end of the study. The linear predictor with the offset subtracted is intended to be an estimate for $\log(\mathbb{E}(\textrm{End})) - \log(\mathbb{E}(\textrm{Begin}))$. This is justified by the fact that for a Poisson distributed variable $Y$ with mean between 1 and 10 it holds that $\mathbb{E}(\log(Y + 0.5))$ is approximately equal to $\log(\mathbb{E}(Y))$. $\log(\textrm{Begin} + 0.5)$ can therefore be seen as an estimate for $\log(\mathbb{E}(\textrm{Begin}))$. The estimated coefficients with corresponding confidence intervals are given in Figure~\ref{fig:dmft}. As the coefficients of the first component are restricted a-priori to minus infinity for the intercept and to zero for the other variables, they are of no interest and only the second component is plotted. The box ratio can be modified as for \code{barchart()} in package \pkg{lattice}. The code to produce this plot is given by: <>= print(plot(refit(Fitted), components = 2, box.ratio = 3)) @ \begin{figure} \centering \setkeys{Gin}{width=0.9\textwidth} <>= <> @ \caption{The estimated coefficients of the zero-inflated model for the \code{dmft} dataset. The first component is not plotted as this component captures the inflated zeros and its coefficients are fixed a-priori.} \label{fig:dmft} \end{figure} %%----------------------------------------------------------------------- \subsection{Concomitant variable models}\label{sec:concomitant-models} If the concomitant variable is a categorical variable, the multinomial logit model is equivalent to a model where the component weights for each level of the concomitant variable are determined by the mean values of the a-posteriori probabilities. The driver which implements this \code{"FLXP"} model is given in Figure~\ref{fig:myConcomitant.R}. A name for the driver has to be specified and a \code{fit()} function. In the \code{fit()} function the mean posterior probability for all observations with the same covariate points is determined, assigned to the corresponding observations and the full new a-posteriori probability matrix returned. By contrast \code{refit()} only returns the new a-posteriori probability matrix for the number of unique covariate points. \lstset{frame=trbl,basicstyle=\small\tt,stepnumber=5,numbers=left} \begin{figure} \centering \begin{minipage}{0.98\textwidth} \lstinputlisting{myConcomitant.R} \end{minipage} \caption{Driver for a concomitant variable model where the component weights are determined by averaging over the a-posteriori probabilities for each level of the concomitant variable.} \label{fig:myConcomitant.R} \end{figure} \subsubsection{Example: Using the driver} If the concomitant variable model returned by \code{myConcomitant()} is used for the artificial example in Section~\ref{sec:using-new-funct} the same fitted model is returned as if a multinomial logit model is specified. An advantage is that in this case no problems occur if the fitted probabilities are close to zero or one. <>= Concomitant <- FLXPmultinom(~ yb) MyConcomitant <- myConcomitant(~ yb) set.seed(1234) m2 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), concomitant = Concomitant) m3 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), cluster = posterior(m2), concomitant = MyConcomitant) @ <<>>= summary(m2) summary(m3) @ For comparing the estimated component weights for each value of $\mathit{yb}$ the following function can be used: <<>>= determinePrior <- function(object) { object@concomitant@fit(object@concomitant@x, posterior(object))[!duplicated(object@concomitant@x), ] } @ <<>>= determinePrior(m2) determinePrior(m3) @ Obviously the fitted values of the two models correspond to each other. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Summary and outlook}\label{sec:summary-outlook} Package \pkg{flexmix} was extended to cover finite mixtures of GLMs with (nested) varying and constant parameters. This allows for example the estimation of varying intercept models. In order to be able to characterize the components given some variables concomitant variable models can be estimated for the component weights. The implementation of these extensions have triggered some modifications in the class structure and in the fit functions \code{flexmix()} and \code{FLXfit()}. For certain steps, as e.g.~the M-step, methods which depend on the component specific models are defined in order to enable the estimation of finite mixtures of GLMs with only varying parameters and those with (nested) varying and constant parameters with the same fit function. The flexibility of this modified implementation is demonstrated by illustrating how a driver for zero-inflated models can be defined. In the future diagnostic tools based on resampling methods shall be implemented as bootstrap results can give valuable insights into the model fit \citep{mixtures:Gruen+Leisch:2004}. A function which conveniently allows to test linear hypotheses about the parameters using the variance-covariance matrix returned by \code{refit()} would be a further valuable diagnostic tool. The implementation of zero-inflated Poisson and binomial regression models are a first step towards relaxing the assumption that all component specific distributions are from the same parametric family. As mixtures with components which follow distributions from different parametric families can be useful for example to model outliers \citep{mixtures:Dasgupta+Raftery:1998,mixtures:Leisch:2008}, it is intended to also make this functionality available in \pkg{flexmix} in the future. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section*{Computational details} <>= SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") @ All computations and graphics in this paper have been done using \proglang{R} version \Sexpr{getRversion()} with the packages \Sexpr{pkgs}. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section*{Acknowledgments} This research was supported by the the Austrian Science Foundation (FWF) under grants P17382 and T351. Thanks also to Achim Zeileis for helpful discussions on implementation details and an anonymous referee for asking a good question about parameter significance which initiated the new version of function \code{refit()}. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \bibliography{mixture} %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \end{document} flexmix/vignettes/flexmix-intro.Rnw0000644000175100001440000010256513675321507017273 0ustar hornikusers% % Copyright (C) 2004-2005 Friedrich Leisch % $Id: flexmix-intro.Rnw 5187 2020-06-25 17:59:39Z gruen $ % \documentclass[nojss]{jss} \title{FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in \proglang{R}} \Plaintitle{FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in R} \Shorttitle{FlexMix: Finite Mixture Models in \proglang{R}} \author{Friedrich Leisch\\Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Friedrich Leisch} \Address{ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \usepackage[utf8]{inputenc} \usepackage{listings} \newcommand{\R}{\proglang{R}} <>= suppressWarnings(RNGversion("3.5.0")) set.seed(1504) options(width=70, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) grDevices::ps.options(family="Times") library("graphics") library("flexmix") data("NPreg") @ \Abstract{ This article was originally published as \cite{flexmix:Leisch:2004a} in the \emph{Journal of Statistical Software}. FlexMix implements a general framework for fitting discrete mixtures of regression models in the \R{} statistical computing environment: three variants of the EM algorithm can be used for parameter estimation, regressors and responses may be multivariate with arbitrary dimension, data may be grouped, e.g., to account for multiple observations per individual, the usual formula interface of the \proglang{S} language is used for convenient model specification, and a modular concept of driver functions allows to interface many different types of regression models. Existing drivers implement mixtures of standard linear models, generalized linear models and model-based clustering. FlexMix provides the E-step and all data handling, while the M-step can be supplied by the user to easily define new models. } \Keywords{\proglang{R}, finite mixture models, model based clustering, latent class regression} \Plainkeywords{R, finite mixture models, model based clustering, latent class regression} \Volume{11} \Issue{8} \Month{October} \Year{2004} \Submitdate{2004-04-19} \Acceptdate{2004-10-18} %%\usepackage{Sweave} %% already provided by jss.cls %%\VignetteIndexEntry{FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in R} %%\VignetteDepends{flexmix} %%\VignetteKeywords{R, finite mixture models, model based clustering, latent class regression} %%\VignettePackage{flexmix} \begin{document} \section{Introduction} \label{sec:introduction} Finite mixture models have been used for more than 100 years, but have seen a real boost in popularity over the last decade due to the tremendous increase in available computing power. The areas of application of mixture models range from biology and medicine to physics, economics and marketing. On the one hand these models can be applied to data where observations originate from various groups and the group affiliations are not known, and on the other hand to provide approximations for multi-modal distributions \citep{flexmix:Everitt+Hand:1981,flexmix:Titterington+Smith+Makov:1985,flexmix:McLachlan+Peel:2000}. In the 1990s finite mixture models have been extended by mixing standard linear regression models as well as generalized linear models \citep{flexmix:Wedel+DeSarbo:1995}. An important area of application of mixture models is market segmentation \citep{flexmix:Wedel+Kamakura:2001}, where finite mixture models replace more traditional cluster analysis and cluster-wise regression techniques as state of the art. Finite mixture models with a fixed number of components are usually estimated with the expectation-maximization (EM) algorithm within a maximum likelihood framework \citep{flexmix:Dempster+Laird+Rubin:1977} and with MCMC sampling \citep{flexmix:Diebolt+Robert:1994} within a Bayesian framework. \newpage The \R{} environment for statistical computing \citep{flexmix:R-Core:2004} features several packages for finite mixture models, including \pkg{mclust} for mixtures of multivariate Gaussian distributions \citep{flexmix:Fraley+Raftery:2002,flexmix:Fraley+Raftery:2002a}, \pkg{fpc} for mixtures of linear regression models \citep{flexmix:Hennig:2000} and \pkg{mmlcr} for mixed-mode latent class regression \citep{flexmix:Buyske:2003}. There are three main reasons why we have chosen to write yet another software package for EM estimation of mixture models: \begin{itemize} \item The existing implementations did not cover all cases we needed for our own research (mainly marketing applications). \item While all \R{} packages mentioned above are open source and hence can be extended by the user by modifying the source code, we wanted an implementation where extensibility is a main design principle to enable rapid prototyping of new mixture models. \item We include a sampling-based variant of the EM-algorithm for models where weighted maximum likelihood estimation is not available. FlexMix has a clean interface between E- and M-step such that variations of both are easy to combine. \end{itemize} This paper is organized as follows: First we introduce the mathematical models for latent class regression in Section~\ref{sec:latent-class-regr} and shortly discuss parameter estimation and identifiability. Section~\ref{sec:using-flexmix} demonstrates how to use FlexMix to fit models with the standard driver for generalized linear models. Finally, Section~\ref{sec:extending-flexmix} shows how to extend FlexMix by writing new drivers using the well-known model-based clustering procedure as an example. \section{Latent class regression} \label{sec:latent-class-regr} Consider finite mixture models with $K$ components of form \begin{equation}\label{eq:1} h(y|x,\psi) = \sum_{k = 1}^K \pi_k f(y|x,\theta_k) \end{equation} \begin{displaymath} \pi_k \geq 0, \quad \sum_{k = 1}^K \pi_k = 1 \end{displaymath} where $y$ is a (possibly multivariate) dependent variable with conditional density $h$, $x$ is a vector of independent variables, $\pi_k$ is the prior probability of component $k$, $\theta_k$ is the component specific parameter vector for the density function $f$, and $\psi=(\pi_1,,\ldots,\pi_K,\theta_1',\ldots,\theta_K')'$ is the vector of all parameters. If $f$ is a univariate normal density with component-specific mean $\beta_k'x$ and variance $\sigma^2_k$, we have $\theta_k = (\beta_k', \sigma_k^2)'$ and Equation~(\ref{eq:1}) describes a mixture of standard linear regression models, also called \emph{latent class regression} or \emph{cluster-wise regression} \citep{flexmix:DeSarbo+Cron:1988}. If $f$ is a member of the exponential family, we get a mixture of generalized linear models \citep{flexmix:Wedel+DeSarbo:1995}, known as \emph{GLIMMIX} models in the marketing literature \citep{flexmix:Wedel+Kamakura:2001}. For multivariate normal $f$ and $x\equiv1$ we get a mixture of Gaussians without a regression part, also known as \emph{model-based clustering}. The posterior probability that observation $(x,y)$ belongs to class $j$ is given by \begin{equation}\label{eq:3} \Prob(j|x, y, \psi) = \frac{\pi_j f(y | x, \theta_j)}{\sum_k \pi_k f(y | x, \theta_k)} \end{equation} The posterior probabilities can be used to segment data by assigning each observation to the class with maximum posterior probability. In the following we will refer to $f(\cdot|\cdot, \theta_k)$ as \emph{mixture components} or \emph{classes}, and the groups in the data induced by these components as \emph{clusters}. \subsection{Parameter estimation} \label{sec:parameter-estimation} The log-likelihood of a sample of $N$ observations $\{(x_1,y_1),\ldots,(x_N,y_N)\}$ is given by \begin{equation}\label{eq:4} \log L = \sum_{n=1}^N \log h(y_n|x_n,\psi) = \sum_{n=1}^N \log\left(\sum_{k = 1}^K \pi_kf(y_n|x_n,\theta_k) \right) \end{equation} and can usually not be maximized directly. The most popular method for maximum likelihood estimation of the parameter vector $\psi$ is the iterative EM algorithm \citep{flexmix:Dempster+Laird+Rubin:1977}: \begin{description} \item[Estimate] the posterior class probabilities for each observation \begin{displaymath} \hat p_{nk} = \Prob(k|x_n, y_n, \hat \psi) \end{displaymath} using Equation~(\ref{eq:3}) and derive the prior class probabilities as \begin{displaymath} \hat\pi_k = \frac1N \sum_{n=1}^N \hat p_{nk} \end{displaymath} \item[Maximize] the log-likelihood for each component separately using the posterior probabilities as weights \begin{equation}\label{eq:2} \max_{\theta_k} \sum_{n=1}^N \hat p_{nk} \log f(y_n | x_n, \theta_k) \end{equation} \end{description} The E- and M-steps are repeated until the likelihood improvement falls under a pre-specified threshold or a maximum number of iterations is reached. The EM algorithm cannot be used for mixture models only, but rather provides a general framework for fitting models on incomplete data. Suppose we augment each observation $(x_n,y_n)$ with an unobserved multinomial variable $z_n = (z_{n1},\ldots,z_{nK})$, where $z_{nk}=1$ if $(x_n,y_n)$ belongs to class $k$ and $z_{nk}=0$ otherwise. The EM algorithm can be shown to maximize the likelihood on the ``complete data'' $(x_n,y_n,z_n)$; the $z_n$ encode the missing class information. If the $z_n$ were known, maximum likelihood estimation of all parameters would be easy, as we could separate the data set into the $K$ classes and estimate the parameters $\theta_k$ for each class independently from the other classes. If the weighted likelihood estimation in Equation~(\ref{eq:2}) is infeasible for analytical, computational, or other reasons, then we have to resort to approximations of the true EM procedure by assigning the observations to disjoint classes and do unweighted estimation within the groups: \begin{displaymath} \max_{\theta_k} \sum_{n: z_{nk=1}} \log f(y_n | x_n, \theta_k) \end{displaymath} This corresponds to allow only 0 and 1 as weights. Possible ways of assigning the data into the $K$ classes are \begin{itemize} \item \textbf{hard} \label{hard} assignment to the class with maximum posterior probability $p_{nk}$, the resulting procedure is called maximizing the \emph{classification likelihood} by \cite{flexmix:Fraley+Raftery:2002}. Another idea is to do \item \textbf{random} assignment to classes with probabilities $p_{nk}$, which is similar to the sampling techniques used in Bayesian estimation (although for the $z_n$ only). \end{itemize} Well known limitations of the EM algorithm include that convergence can be slow and is to a local maximum of the likelihood surface only. There can also be numerical instabilities at the margin of parameter space, and if a component gets to contain only a few observations during the iterations, parameter estimation in the respective component may be problematic. E.g., the likelihood of Gaussians increases without bounds for $\sigma^2\to 0$. As a result, numerous variations of the basic EM algorithm described above exist, most of them exploiting features of special cases for $f$. \subsection{Identifiability} \label{sec:identifiability} An open question is still identifiability of many mixture models. A comprehensive overview of this topic is beyond the scope of this paper, however, users of mixture models should be aware of the problem: \begin{description} \item[Relabelling of components:] Mixture models are only identifiable up to a permutation of the component labels. For EM-based approaches this only affects interpretation of results, but is no problem for parameter estimation itself. \item[Overfitting:] If a component is empty or two or more components have the same parameters, the data generating process can be represented by a smaller model with fewer components. This kind of unidentifiability can be avoided by requiring that the prior weights $\pi_k$ are not equal to zero and that the component specific parameters are different. \item[Generic unidentifiability:] It has been shown that mixtures of univariate normal, gamma, exponential, Cauchy and Poisson distributions are identifiable, while mixtures of discrete or continuous uniform distributions are not identifiable. A special case is the class of mixtures of binomial and multinomial distributions which are only identifiable if the number of components is limited with respect to, e.g., the number of observations per person. See \cite{flexmix:Everitt+Hand:1981}, \cite{flexmix:Titterington+Smith+Makov:1985}, \cite{flexmix:Grun:2002} and references therein for details. \end{description} FlexMix tries to avoid overfitting because of vanishing prior probabilities by automatically removing components where the prior $\pi_k$ falls below a user-specified threshold. Automated diagnostics for generic identifiability are currently under investigation. Relabelling of components is in some cases more of a nuisance than a real problem (``component 2 of the first run may be component 3 in the second run''), more serious are interactions of component relabelling and categorical predictor variables, see \cite{flexmix:Grun+Leisch:2004} for a discussion and how bootstrapping can be used to assess identifiability of mixture models. \pagebreak[4] \section{Using FlexMix} \label{sec:using-flexmix} \SweaveOpts{width=12,height=8,eps=FALSE,keep.source=TRUE} The standard M-step \texttt{FLXMRglm()} of FlexMix is an interface to R's generalized linear modelling facilities (the \texttt{glm()} function). As a simple example we use artificial data with two latent classes of size \Sexpr{nrow(NPreg)/2} each: \begin{center} \begin{tabular}{ll} Class~1: & $ y = 5x+\epsilon$\\ Class~2: & $ y = 15+10x-x^2+\epsilon$\\ \end{tabular} \end{center} with $\epsilon\sim N(0,9)$ and prior class probabilities $\pi_1=\pi_2=0.5$, see the left panel of Figure~\ref{fig:npreg}. We can fit this model in \R{} using the commands <<>>= library("flexmix") data("NPreg") m1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2) m1 @ and get a first look at the estimated parameters of mixture component~1 by <<>>= parameters(m1, component = 1) @ and <<>>= parameters(m1, component = 2) @ for component~2. The paramter estimates of both components are close to the true values. A cross-tabulation of true classes and cluster memberships can be obtained by <<>>= table(NPreg$class, clusters(m1)) @ The summary method <<>>= summary(m1) @ gives the estimated prior probabilities $\hat\pi_k$, the number of observations assigned to the corresponding clusters, the number of observations where $p_{nk}>\delta$ (with a default of $\delta=10^{-4}$), and the ratio of the latter two numbers. For well-seperated components, a large proportion of observations with non-vanishing posteriors $p_{nk}$ should also be assigned to the corresponding cluster, giving a ratio close to 1. For our example data the ratios of both components are approximately 0.7, indicating the overlap of the classes at the cross-section of line and parabola. \begin{figure}[htbp] \centering <>= par(mfrow=c(1,2)) plot(yn~x, col=class, pch=class, data=NPreg) plot(yp~x, col=class, pch=class, data=NPreg) @ \caption{Standard regression example (left) and Poisson regression (right).} \label{fig:npreg} \end{figure} Histograms or rootograms of the posterior class probabilities can be used to visually assess the cluster structure \citep{flexmix:Tantrum+Murua+Stuetzle:2003}, this is now the default plot method for \texttt{"flexmix"} objects \citep{flexmix:Leisch:2004}. Rootograms are very similar to histograms, the only difference is that the height of the bars correspond to square roots of counts rather than the counts themselves, hence low counts are more visible and peaks less emphasized. \begin{figure}[htbp] \centering <>= print(plot(m1)) @ \caption{The plot method for \texttt{"flexmix"} objects, here obtained by \texttt{plot(m1)}, shows rootograms of the posterior class probabilities.} \label{fig:root1} \end{figure} Usually in each component a lot of observations have posteriors close to zero, resulting in a high count for the corresponing bin in the rootogram which obscures the information in the other bins. To avoid this problem, all probabilities with a posterior below a threshold are ignored (we again use $10^{-4}$). A peak at probability 1 indicates that a mixture component is well seperated from the other components, while no peak at 1 and/or significant mass in the middle of the unit interval indicates overlap with other components. In our simple example the components are medium well separated, see Figure~\ref{fig:root1}. Tests for significance of regression coefficients can be obtained by <<>>= rm1 <- refit(m1) summary(rm1) @ Function \texttt{refit()} fits weighted generalized linear models to each component using the standard \R{} function \texttt{glm()} and the posterior probabilities as weights, see \texttt{help("refit")} for details. The data set \texttt{NPreg} also includes a response from a generalized linear model with a Poisson distribution and exponential link function. The two classes of size \Sexpr{nrow(NPreg)/2} each have parameters \begin{center} \begin{tabular}{ll} Class~1: & $ \mu_1 = 2 - 0.2x$\\ Class~2: & $ \mu_2 = 1 + 0.1x$\\ \end{tabular} \end{center} and given $x$ the response $y$ in group $k$ has a Poisson distribution with mean $e^{\mu_k}$, see the right panel of Figure~\ref{fig:npreg}. The model can be estimated using <>= options(width=55) @ <<>>= m2 <- flexmix(yp ~ x, data = NPreg, k = 2, model = FLXMRglm(family = "poisson")) summary(m2) @ <>= options(width=65) @ \begin{figure}[htbp] \centering <>= print(plot(m2)) @ \caption{\texttt{plot(m2)}} \label{fig:root2} \end{figure} Both the summary table and the rootograms in Figure~\ref{fig:root2} clearly show that the clusters of the Poisson response have much more overlap. For our simple low-dimensional example data the overlap of the classes is obvious by looking at scatterplots of the data. For data in higher dimensions this is not an option. The rootograms and summary tables for \texttt{"flexmix"} objects work off the densities or posterior probabilities of the observations and thus do not depend on the dimensionality of the input space. While we use simple 2-dimensional examples to demonstrate the techniques, they can easily be used on high-dimensional data sets or models with complicated covariate structures. \subsection{Multiple independent responses} \label{sec:mult-indep-resp} If the response $y=(y_1,\ldots,y_D)'$ is $D$-dimensional and the $y_d$ are mutually independent the mixture density in Equation~(\ref{eq:1}) can be written as \begin{eqnarray*} h(y|x,\psi) &=& \sum_{k = 1}^K \pi_k f(y|x,\theta_k)\\ &=& \sum_{k = 1}^K \pi_k \prod_{d=1}^D f_d(y|x,\theta_{kd}) \end{eqnarray*} To specify such models in FlexMix we pass it a list of models, where each list element corresponds to one $f_d$, and each can have a different set of dependent and independent variables. To use the Gaussian and Poisson responses of data \texttt{NPreg} simultaneously, we use the model specification \begin{Sinput} > m3 = flexmix(~x, data=NPreg, k=2, + model=list(FLXMRglm(yn~.+I(x^2)), + FLXMRglm(yp~., family="poisson"))) \end{Sinput} <>= m3 <- flexmix(~ x, data = NPreg, k = 2, model=list(FLXMRglm(yn ~ . + I(x^2)), FLXMRglm(yp ~ ., family = "poisson"))) @ Note that now three model formulas are involved: An overall formula as first argument to function \texttt{flexmix()} and one formula per response. The latter ones are interpreted relative to the overall formula such that common predictors have to be specified only once, see \texttt{help("update.formula")} for details on the syntax. The basic principle is that the dots get replaced by the respective terms from the overall formula. The rootograms show that the posteriors of the two-response model are shifted towards 0 and 1 (compared with either of the two univariate models), the clusters are now well-separated. \begin{figure}[htbp] \centering <>= print(plot(m3)) @ \caption{\texttt{plot(m3)}} \label{fig:root3} \end{figure} \subsection{Repeated measurements} \label{sec:repe-meas} If the data are repeated measurements on $M$ individuals, and we have $N_m$ observations from individual $m$, then the log-likelihood in Equation~(\ref{eq:4}) can be written as \begin{displaymath} \log L = \sum_{m=1}^M \sum_{n=1}^{N_m} \log h(y_{mn}|x_{mn},\psi), \qquad \sum_{m=1}^M N_m = N \end{displaymath} and the posterior probability that individual $m$ belongs to class $j$ is given by \begin{displaymath} \Prob(j|m) = \frac{\pi_j \prod_{n=1}^{N_m} f(y_{mn} | x_{mn}, \theta_j)}{\sum_k \pi_k \prod_{n=1}^{N_m} f(y_{mn} | x_{mn}, \theta_k)} \end{displaymath} where $(x_{mn}, y_{mn})$ is the $n$-th observation from individual $m$. As an example, assume that the data in \texttt{NPreg} are not 200 independent observations, but 4 measurements each from 50 persons such that $\forall m: N_m=4$. Column \texttt{id2} of the data frame encodes such a grouping and can easily be used in FlexMix: <<>>= m4 <- flexmix(yn ~ x + I(x^2) | id2, data = NPreg, k = 2) summary(m4) @ Note that convergence of the EM algorithm is much faster with grouping and the two clusters are now perfectly separated. \subsection{Control of the EM algorithm} \label{sec:control-em-algorithm} Details of the EM algorithm can be tuned using the \texttt{control} argument of function \texttt{flexmix()}. E.g., to use a maximum number of 15 iterations, report the log-likelihood at every 3rd step and use hard assignment of observations to clusters (cf. page~\pageref{hard}) the call is <<>>= m5 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2, control = list(iter.max = 15, verbose = 3, classify = "hard")) @ Another control parameter (\texttt{minprior}, see below for an example) is the minimum prior probability components are enforced to have, components falling below this threshold (the current default is 0.05) are removed during EM iteration to avoid numerical instabilities for components containing only a few observations. Using a minimum prior of 0 disables component removal. \subsection{Automated model search} In real applications the number of components is unknown and has to be estimated. Tuning the minimum prior parameter allows for simplistic model selection, which works surprisingly well in some situations: <<>>= m6 <- flexmix(yp ~ x + I(x^2), data = NPreg, k = 4, control = list(minprior = 0.2)) m6 @ Although we started with four components, the algorithm converged at the correct two component solution. A better approach is to fit models with an increasing number of components and compare them using AIC or BIC. As the EM algorithm converges only to the next local maximum of the likelihood, it should be run repeatedly using different starting values. The function \texttt{stepFlexmix()} can be used to repeatedly fit models, e.g., <<>>= m7 <- stepFlexmix(yp ~ x + I(x^2), data = NPreg, control = list(verbose = 0), k = 1:5, nrep = 5) @ runs \texttt{flexmix()} 5 times for $k=1,2,\ldots,5$ components, totalling in 25 runs. It returns a list with the best solution found for each number of components, each list element is simply an object of class \texttt{"flexmix"}. To find the best model we can use <<>>= getModel(m7, "BIC") @ and choose the number of components minimizing the BIC. \section{Extending FlexMix} \label{sec:extending-flexmix} One of the main design principles of FlexMix was extensibility, users can provide their own M-step for rapid prototyping of new mixture models. FlexMix was written using S4 classes and methods \citep{flexmix:Chambers:1998} as implemented in \R{} package \pkg{methods}. The central classes for writing M-steps are \texttt{"FLXM"} and \texttt{"FLXcomponent"}. Class \texttt{"FLXM"} specifies how the model is fitted using the following slots: \begin{description} \item[fit:] A \texttt{function(x,y,w)} returning an object of class \texttt{"FLXcomponent"}. \item[defineComponent:] Expression or function constructing the object of class \texttt{"FLXcomponent"}. \item[weighted:] Logical, specifies if the model may be fitted using weighted likelihoods. If \texttt{FALSE}, only hard and random classification are allowed (and hard classification becomes the default). \item[formula:] Formula relative to the overall model formula, default is \verb|.~.| \item[name:] A character string describing the model, this is only used for print output. \end{description} The remaining slots of class \texttt{"FLXM"} are used internally by FlexMix to hold data, etc. and omitted here, because they are not needed to write an M-step driver. The most important slot doing all the work is \texttt{fit} holding a function performing the maximum likelihood estimation described in Equation~(\ref{eq:2}). The \texttt{fit()} function returns an object of class \texttt{"FLXcomponent"} which holds a fitted component using the slots: \begin{description} \item[logLik:] A \texttt{function(x,y)} returning the log-likelihood for observations in matrices \texttt{x} and \texttt{y}. \item[predict:] A \texttt{function(x)} predicting \texttt{y} given \texttt{x}. \item[df:] The degrees of freedom used by the component, i.e., the number of estimated parameters. \item[parameters:] An optional list containing model parameters. \end{description} In a nutshell class \texttt{"FLXM"} describes an \emph{unfitted} model, whereas class \texttt{"FLXcomponent"} holds a \emph{fitted} model. \lstset{frame=trbl,basicstyle=\small\tt,stepnumber=5,numbers=left} \begin{figure}[tb] \centering \begin{minipage}{0.94\textwidth} \lstinputlisting{mymclust.R} \end{minipage} \caption{M-step for model-based clustering: \texttt{mymclust} is a simplified version of the standard FlexMix driver \texttt{FLXmclust}.} \label{fig:mymclust.R} \end{figure} \subsection{Writing an M-step driver} \label{sec:writing-an-m} Figure~\ref{fig:mymclust.R} shows an example driver for model-based clustering. We use function \texttt{dmvnorm()} from package \pkg{mvtnorm} for calculation of multivariate Gaussian densities. In line~5 we create a new \texttt{"FLXMC"} object named \texttt{retval}, which is also the return value of the driver. Class \texttt{"FLXMC"} extends \texttt{"FLXM"} and is used for model-based clustering. It contains an additional slot with the name of the distribution used. All drivers should take a formula as their first argument, this formula is directly passed on to \texttt{retval}. In most cases authors of new FlexMix drivers need not worry about formula parsing etc., this is done by \texttt{flexmix} itself. In addition we have to declare whether the driver can do weighted ML estimation (\texttt{weighted=TRUE}) and give a name to our model. The remainder of the driver creates a \texttt{fit()} function, which takes regressors \texttt{x}, response \texttt{y} and weights \texttt{w}. For multivariate Gaussians the maximum likelihood estimates correspond to mean and covariance matrix, the standard R function \texttt{cov.wt()} returns a list containing estimates of the weighted covariance matrix and the mean for given data. Our simple example performs clustering without a regression part, hence $x$ is ignored. If \texttt{y} has $D$ columns, we estimate $D$ parameters for the mean and $D(D-1)/2$ parameters for the covariance matrix, giving a total of $(3D+D^2)/2$ parameters (line~11). As an additional feature we allow the user to specify whether the covariance matrix is assumed to be diagonal or a full matrix. For \texttt{diagonal=TRUE} we use only the main diagonal of the covariance matrix (line~14) and the number of parameters is reduced to $2D$. In addition to parameter estimates, \texttt{flexmix()} needs a function calculating the log-likelihood of given data $x$ and $y$, which in our example is the log-density of a multivariate Gaussian. In addition we have to provide a function predicting $y$ given $x$, in our example simply the mean of the Gaussian. Finally we create a new \texttt{"FLXcomponent"} as return value of function \texttt{fit()}. Note that our internal functions \texttt{fit()}, \texttt{logLik()} and \texttt{predict()} take only \texttt{x}, \texttt{y} and \texttt{w} as arguments, but none of the model-specific parameters like means and covariances, although they use them of course. \R{} uses \emph{lexical scoping} rules for finding free variables \citep{flexmix:Gentleman+Ihaka:2000}, hence it searches for them first in the environment where a function is defined. E.g., the \texttt{fit()} function uses the variable \texttt{diagonal} in line~24, and finds it in the environment where the function itself was defined, which is the body of function \texttt{mymclust()}. Function \texttt{logLik()} uses the list \texttt{para} in lines~8 and 9, and uses the one found in the body of \texttt{defineComponent()}. Function \texttt{flexmix()} on the other hand never sees the model parameters, all it uses are function calls of form \texttt{fit(x,y,w)} or \texttt{logLik(x,y)}, which are exactly the same for all kinds of mixture models. In fact, it would not be necessary to even store the component parameters in the \texttt{"FLXcomponent"} object, they are there only for convenience such that users can easily extract and use them after \texttt{flexmix()} has finished. Lexical scope allows to write clean interfaces in a very elegant way, the driver abstracts all model details from the FlexMix main engine. \subsection{Example: Using the driver} \label{sec:example:-model-based} \SweaveOpts{width=12,height=6,eps=FALSE} <>= library("flexmix") set.seed(1504) options(width=60) grDevices::ps.options(family="Times") suppressMessages(require("ellipse")) suppressMessages(require("mvtnorm")) source("mymclust.R") @ As a simple example we use the four 2-dimensional Gaussian clusters from data set \texttt{Nclus}. Fitting a wrong model with diagonal covariance matrix is done by <<>>= data("Nclus") m1 <- flexmix(Nclus ~ 1, k = 4, model = mymclust()) summary(m1) @ The result can be seen in the left panel of Figure~\ref{fig:ell}, the result is ``wrong'' because we forced the ellipses to be parallel to the axes. The overlap between three of the four clusters can also be inferred from the low ratio statistics in the summary table (around 0.5 for components 1, 3 and 4), while the much better separated upper left cluster has a much higher ratio of 0.85. Using the correct model with a full covariance matrix can be done by setting \texttt{diagonal=FALSE} in the call to our driver \texttt{mymclust()}: <<>>= m2 <- flexmix(Nclus ~ 1, k = 4, model = mymclust(diagonal = FALSE)) summary(m2) @ \begin{figure}[htbp] \centering <>= par(mfrow=1:2) plotEll(m1, Nclus) plotEll(m2, Nclus) @ \caption{Fitting a mixture model with diagonal covariance matrix (left) and full covariance matrix (right).} \label{fig:ell} \end{figure} \pagebreak[4] \section{Summary and outlook} \label{sec:summary} The primary goal of FlexMix is extensibility, this makes the package ideal for rapid development of new mixture models. There is no intent to replace packages implementing more specialized mixture models like \pkg{mclust} for mixtures of Gaussians, FlexMix should rather be seen as a complement to those. By interfacing R's facilities for generalized linear models, FlexMix allows the user to estimate complex latent class regression models. Using lexical scope to resolve model-specific parameters hides all model details from the programming interface, FlexMix can in principle fit almost arbitrary finite mixture models for which the EM algorithm is applicable. The downside of this is that FlexMix can in principle fit almost arbitrary finite mixture models, even models where no proper theoretical results for model identification etc.\ are available. We are currently working on a toolset for diagnostic checks on mixture models to test necessary identifiability conditions for those cases where results are available. We also want to implement newer variations of the classic EM algorithm, especially for faster convergence. Another plan is to have an interactive version of the rootograms using \texttt{iPlots} \citep{flexmix:Urbanek+Theus:2003} such that the user can explore the relations between mixture components, possibly linked to background variables. Other planned extensions include covariates for the prior probabilities and to allow to mix different distributions for components, e.g., to include a Poisson point process for background noise. \section*{Computational details} <>= SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") @ All computations and graphics in this paper have been done using \proglang{R} version \Sexpr{getRversion()} with the packages \Sexpr{pkgs}. \section*{Acknowledgments} This research was supported by the Austrian Science Foundation (FWF) under grant SFB\#010 (`Adaptive Information Systems and Modeling in Economics and Management Science'). Bettina Gr\"un has modified the original version to include and reflect the changes of the package. \bibliography{flexmix} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: flexmix/vignettes/myConcomitant.R0000644000175100001440000000130311703222720016714 0ustar hornikusersmyConcomitant <- function(formula = ~ 1) { z <- new("FLXP", name = "myConcomitant", formula = formula) z@fit <- function(x, y, w, ...) { if (missing(w) || is.null(w)) w <- rep(1, length(x)) f <- as.integer(factor(apply(x, 1, paste, collapse = ""))) AVG <- apply(w*y, 2, tapply, f, mean) (AVG/rowSums(AVG))[f,,drop=FALSE] } z@refit <- function(x, y, w, ...) { if (missing(w) || is.null(w)) w <- rep(1, length(x)) f <- as.integer(factor(apply(x, 1, paste, collapse = ""))) AVG <- apply(w*y, 2, tapply, f, mean) (AVG/rowSums(AVG)) } z } flexmix/vignettes/flexmix.png0000644000175100001440000022746111703222720016146 0ustar hornikusersPNG  IHDRsBITO pHYsjw IDATxi@W7IqW6wUqZX`]ՂhkRn7ԭժuC*+*BByy30f>M9s5IIuu5@ 8P ; 0;;  2=~M,P1ed?˗bg/BPqq1BuPYfݺu; ޣG.uرcbg[rY`_q` $[[۫WPbbbBBY2`RYۋ:&q. eā 8Pׯ3f؉eȊԩSl0F0>>۷*_~}رJ\zS"UWW_p#,]T. .Ѯ.ӽ{ڵ+̙Èm޼2777001cԩSkLryd"""Wd'H?ѣG5jQ#GdEQ20>)}YjO2۶m;uꔺˀ(jqEx[Ņܵkm۶ݻw3֭k/_n )={x{{{yyM>}޽O>-//d׮]ۼyĉ.^@2 ׯkzH۶m7n\c?^Þ2CZT*ǎ˨teǎRvuƌҋ/fΜɑ$2 0TdӤIdlȜv'ODEE1$99l֭m]ӧ~aHHիWklP(<@2 /_fgg#իW՜o>tEd}||˗S|7m޼ѣGׯ ťKٳg;qm۶8=BEFxfKKKCCCARZZZh<}}+11'D~Y˅ >P!ܼyi߾} t]v 6Դ{8p 7w9rՕgJ/ex"}Eͽj8}@EFD˖-`O>wF3OOOuKeee1n!Gή޽{C ~s2\X TqQ~oѐ!C߈.]zHzP"l۶0GJQ }maa^1"C឵G2ĸ۷o`Ν{r111۶m?VBB]k֬O>y#nff6z]veggyF&ܼy399yTG. +hWzW?oe]P(e˖iR޽բ˗/t_3&PCBExxyy22lرr\.7}˶XMԥ2++uEĚ5kSltrݴ֭[׫W޾K.6mz}MP?|/(h=DKu5 ѣGnݚ?g͚EJ~!۷׮]#?~pBjW6mbbbWBi7 B@E̞=ϏȈ;wnFFc_(RTy禵kRثnTVVl2Fw84336lg:u-K-(W^^~=FpN{TG7|߿0UĨK"##=Yn]^^.666;v1M͟?c#JSRR؋mZ A 4HMMUyW8wqJJJ*//-++KNNV٘oVRRBXXXݻ^z<sJ*T?}vUUF4oٹ~\\\tY`ҤI .gСþ}K?IO*R7x:w7|o߾_~j9rȏ?x߾}>;uD_@__)dƍFN<;v.=zJ_6mO4~{Э^=ˏCHH̙3 ())IKKϩmBBBƏ_c+#2f̘v P:p8ȞQ`c_S#"&Gƍ؃7nܥKj^ZZ:}tYF~'߿z*{=1c,_|޼yAAA-x|ώ9BN'jԭՔ)S,YB>\v-.C_ xʔ)|z*#2d\u`&6ʸ5RYa:,7nT|zXwTŋ#Fͥ"K,i޼9 hݛ4iʉ`n>|x׮]ߏ3 oƍ:99e-<<wƍ/ۧO$yvXPPSĀ r"VIP|&"11ρ#%3'N}||oA7m۶ݲe 3FnkO-J=' :ՕgUQtXHG@dT5J@x یG9GׯSu ^zvZNSݻ_6l W9coNP1NGQѣZwIm۷/???''СC* ~ lْ6C<ٹiӦbgP'ܻwqMjJ~P(!!!nݢ% g||_~icc?&MPr6kΝ;OޥKr}Tǎ58mՙs.^855 Yҥםܹ taРA/^=csm۶ۛ駟jݻw 7n,//,ӧ?~LhBĀ &.!88x߾}F^a?BABB; XD -EGAlٲޱ522-[bqՙ {P]4e JJJ¸ۄi_Hcφ r9}F]98802W^E]F LM(P~,Yi&z~GO4^jB:%3A$$$ԫW,.M6mZ^^wh0aBÆ \jF76{_%Qe WѢcǎzldJsaю;85- b2`TPo׮]۶m۷kW_~hh(;Z~}0`#C-2`@7od(=襟s}g/k׮8p ݿ}/_';vHnׯ_qH$^^^|0PRqq1$))i֭Y%%%Z M"hqMw߾}4iB(#FiX_Lрի3gPe_M@kwffY9nӶ:tн ݹ2775{ & f͚XaΜ9~)=yafեdkkKUa(n޼NۦMFq0DYgvӦMcs򢢢kjԡC~8qwѴz͞=oo޼{n=b ,ʀ [6o\,@L7oTR꣭,7sLstܙEѡC(SPPKHHȲeuҥKuO ˀCuƠ߿sNF}K,!.]/;v1bDPPEEE2sްaCvv6=x-OOϐaÆ¢477֭[ϟ?t :&GD804-.yMPyyy`` +oJJ ;T*5k#xӧOטeT&>$<M:щT*ݺu-VLSN-..4!CT0ѣ7f EZZZHHH6mիgiiiooyfeA]j3c(C".T*njszСCꮌ7n+#tSB]j7Tg+22G>mXF<<<Û7oKjen1tϟW[=g ۵k=܌3ؽ1nդYYYUVV2zprrꌧgzzˆFƆ&))|UDDDQQe˖ϟ߱cNvlfffCpeoj_Hb+3fUwv}G`fffF?oܸO?VVV]v8q͛>,-- =uR ---e0}} k] E&EDDП)v  @-[vĉw҃O9s&;s XOOϥK daI.(211Q,t 9b}g޾}wee%=>wAܾ};&&qm۬ [#v 4`,,,իעE ݕPmllDLTB]@8^^^}=(Ǝ{U ƍ'Gzyy e#0(Ѐqvv?=vXV\9k,a=DLTB]@Pg{z0###&&:##ϏTM6=z4++˗vvv۷2dHhhx)_~_nܸ/_* kkF9;;m۶cǎ]vvqq\qf<@*. (TҥKׯ_Vb7nРAjjTuߴӧx<{ٳgΝ[dI\\\hh^2?Ǎw}F۷o߾}kר)ǰQ=~XL\fի'v`v%APˠ. 6mO4T*얫Wnݺ5GWV-))8qbnn,F-s9UVb`RRRƏ/v`>#S'Jg}&((hĉ ~/q"bܹ… (~*Pƍurrڸq#J2<<1˦iӦ 999rɓ'k֬iڴ^=q#2|k׮)ϟ8qbΜ9nnnccGZ uq٭^Zx%{9E؜9s&22¢EQQQgΜ -[tɩ_~K,ySu.29r䈺]G بN:1:uNԴiBz#F`.o>Ԗ!pu4ͣG=z$vBC]@޶m~!C5t#eppu޽{JHHH6m۴i֥K={~J(#/- ƊP:q S@www-5w9rq?lꡅE>}""":21`}L6-//M^^^tt#կ__eKuqt͛7hSYYyaÆM8x ư1 u#ݻw޽{O6+///**O^Q]\GM6ٳgHHϞ={m!쪓R4Dn|zr hu߿Ν`,YBn/]]v;v`V>Fd͚5we333tJ ߿3gmҤ #)ݚrssuNMW:SP].% EEESNet"JnjkkK>Uy5ԩS!Coߞy~nݺgϞUVV]?|'{>}taaiiR|ٳg?SF{+W{LD IDATqʕ+mڴݻ PPZeѢEdQf+Wŋ#G8q(Do_LúPŋekr|dQ&88ʕ+2˗֭22P...fߢE._LDXXɠag͚%jv`@/\.'7RKrw{{UV1Pk0uo޼W={~g}ֶm[KK tu…^bШ ]'ѣMFC߿YYAcƌWsBQ(6m۷C@@֭[TfشnzڵA$''w-99Y8p>_ǂ ޼yu>|j?7@xoHHa˖--[$!!!Cx}Gedd 6I&VVV{:REEE\\_ӦM-,,5jԽ{?Խ? gS `|}}ogϞƍDpp¯Ja̟?bƤCbҲOQ@@z~Y؟C.\3ɼyTNxiݺ5Scu3Aѣ]|< ??/^3wvv7/%ٳgG-Y=D#i*fSBp-(('~dpҤIdP]<__Q5UXX5mϳEVXAO\G l @]z0\]o߾d|ɝ;w***222OFoOX~~~.]xYLL P7?|Sm6m~wvؑ .Z^===8:!}vEE۷ DٙO>۷j޾};w\ĉGIҀ@2ޯ_?Ԣ<_MҧSˑ6חqg8PZZZ^^~Š ]2e ի<ظqc^ؙh^Yp1Y`?| 0.C0P]d:uTwaX=~‚l_^^N*,,li&uisʧ=&22 ۷ ƚ߸qc2k> SϧL&2ÃuiF晙#r}aΝN -;uD:u|jڿ5б=ڽ\]]]]]#GreլY3cZO7-77W}{gC]a}:PgQQQ6utt4+++ a\.1ydrCz9"m4䆭-3::Ғ[ZZN6NMMeE~W_DFȇ}袣QQQ4ˇdSvvZ >}S }͛7c%%%X4mCPK/hjD >룏>b?y$E͛z̐?# ȍ/_h&r ѻwo.*B=rEaz里P+ \="RihϧW:$=_;;Dzd)eQIys}4hЊ+Ξ=[QQnMkg6e1P%uѲeKƮVZSwrr277733333JR*"P0XÆ m333rCPh ȍoɁ"TFu D K>$C
    QFۣG q,>/[?u)BHOO={G}ԸqO?qqv5b32PS7A1r c;BЮ멪R*J1+AeA*o1ài...F^^țjϧ[k=ue 5.Դczyy]t3ח~}j#ӽALo>j $kg6OB 4$[\yy9c;B^$ikM;fff韚t|rs=uuI1>߫W~yq].?O>ݵk_|Aŋo= ZS1L.,X ٻr onƮG۷mۖ צEe8Μ9ç=5nj]Tj#ԋH|KKKGIC#G,-->)]^/ 6~R_.LziÇ1cFEEEZZŋkMܹsBsΑ^gϞe qy* a`iiI4r9^iڞ?_ Cc@h@Z48nڠ?"Cj*( \p{R/$OvƌR{.\8df@@^9qaNr9///B>ܻw,b;/_dVRR2n8r^]q-ꫯ~LUUU5sLz_%{xxd2*.ɨ'NPFww *.;uD:~p$33S&eddߟe . {-..}vlllfj(WF]\:wL2tK.z=z`W*9hР;wdL PT*0`@FFL&{n`` ۷v|j?eʔ)d=z\|^PI7O[zNJɈuFFZԩW^=z͍$&&Fg.`P P19J2))^IJJ2:t`-ZDmWUU͘1C~ǎcPen|T"|???>TWW6" 5,\=G~~v|j?ѣGO 5v'K.d%Sǎ߼y2m'6h ꤴkј~C].&uѡ.cZ.]ԳgO33<ٙ3gҥK.S]]ի绻[XXkϞ=՜_]\2iҤvX[[cʕ^CFn|Kv5x`GGG333[[[p\._~}>}6mjnnnggiӦJ 5ܹW^666666?PVVu>ϛO'}ݻwoԨ\u5>;a2߿޽{m&L.mo'\xq@@СCwޭQ{u? x? u'Ƣ `&MD]3 O<)**rrrrvv;crJ¸WU[nbv֭% dÔ}3gR"##>͛7{zz&%%ٓr )S6lؠ؇Rp1cB:Z orYfQH~L`NXdggӕ߾}{ĉMq>_yT>)J988̛7oܹkז,YRUU%Vn )YdIee%A^tdت3RSr5𕝝?S׬YSRR"b>ƏbiqB]dPeH1!TFP#!1C]40&ː0eFSJPP0 2$Lњ!'(@s.`TN!aʌtlO5eL2$LM+(P0v2 ?Ĕ.z cLԩӁ\]]r 2F=Yf޼y666~-=)3r 2F=Y&88 ɓ'c C]x,#J ”S R7Y)3u#1Y)3u#=Y)3&\@'ː)3QQQTd͚5_}UӦMĭZ*--M,KEE)-#>eH'O^lӧOɇ䔙E %;p=z--D" kZRus Sf{{{?yDDQO谾 ?YUf,ZJ?>//8اp0'T.`\4,C䤧/vtts/ش8ڤ6uLE2$2Gxxرc¨eggKrrr 36u]vbg9t萏Y u#dVV,ׯH.|~>u:??_,@4i.|0"M!a0rA2%UtBPt9}8׮]>|EV/q}Ylll^6mjnnz-NDP(6oܯ_?KKKoٲJe{]N@, 'ː ĭѡCzbBɓ5kd27m`?ŋUUUϟ?OII֭իNT\\7eʔSNVVV(Æ 7oL8A:uWT~w:G?~l!ɨxEEPX=11Q2ZΝ k„ Wbg (>YUf S0d\~}EEA'OgH$/6XjіTʊ}vu?}ѡ. >W*3s%v"޽; Fcǎcƌ 1\BnݛW9D 5Y)3ФICs ~k:u 1ZlEE6lO@tLeH2yhРXYY^Pg@` 2N!a @-T*[ ڙWQ^^EEL2bd7UUUxqqGqss#7ܹnuBn<~PmL2b2d@GG.֨ERk׮qrcǎk'ۛ8wc4eDc2$L:ٙ f<<< Ikqp+++ 6mtYv~Aݱ=|5Xf #mt狝qA]@4,C”OnL:2L|Dn̙3ɓr<'''""ŋzUV_Bϟ?޽{r˗Ǐ}ّ@>}6lpE{{{= b'P 0YDN"k֬ꫯ6m\OK,Yd C;;kײQG58o<U㓬jaaƳ.uͅ בݻ #pb& uA;.Hm OOO3CuLUKgϞ5D+|ѣه5#G3f I/yXXX4nܸe˖}6m_Lɩ PjqEx[Ņܵkm۶ݻw3֭k/_n 5P(JKKsrrΜ90xۧZu`BEF0M4INNfFaITT#(H7n=VYY֭[$%%}ӱc.[pCe"#~EGG3@T2O>o߾|JLLTBbb"us 2~A"#e˖yxx0OGΜ9htReee;vLgWdPPT`qonaaϝ;Ν;۷cbb ,--mfmmu֬Yÿu'ggxiǪPP1^^^L&;v\.ƍc(66Kӳ񬬬Ǐk7Tڰaî].X`ϟ?X u#4{l???F0###&&fܹ]~~~fٹ7T*U޹iڵ;GyfD ~0Q--TҠAF|ժUfhРAjjT{=.NIIIeee*!L @n޼pƒ[$w ,0\9:tWoJR_]6mO4TyWnݺ5CBBfΜYXXHDIIIZZNMMMn2~x-Wg޽7]+,,\|yzzG޾}K H$F9_0 6DDDU!?xCSG>ȑ#h4qD2eʒ%Kȇk׮eO2RU~Ç8rJް0݇P0y7oTH$2d7^x1??_^''7jmxx˫qŋ} N>I1776qQ"bڴit&/FmѢEdQfyyyh IDATOAIGDj޼xuu#?~,pJի퍏Ӣ-Z :zH͑O:tdiio!L 2`ɍŋ;::LF߹s{\.߰a;#8r䈺]GպHj{߾}999R@.^8o<)Q!7\\\I$#G޾}[￯П/_"Icpm۶ۛzaz^}\qD& <== P^^ӧ 7A]\.'7 8HR3LAGd+))qMܰψٰa͛U2W^B6}e}իW366͛7|JHH򲶶nԨQ@@/>$//oލ7677¢UV_xx.|N#16lt9}ĭiӦqˋ֮ &4lؐ%MDFk,`UTT?]ve4(++d2j߬Ebҭ[6XϧmJII1pNVVcT?ϹT( }IMM_ʏ=ƍS($VTT2XqF[[[Q5?^zծ];*^zۿzuT>W0w25rA F]tPׅωp$цA֧&dŊ511Qe*ueXXأGٳg|}}u;y5Ν;kڃ?kZ۵k׶m[vڥ4m4vh-Nf2lfgΜə0akڃB].BB].#J?㌌O>08++YYYQQQdz?+//nJٳEI, l)#JO|(pbǏdTs)F?&sfU*};+-,_A*+j<#]T|ذa8B>}ht9J&G Ie42j(vWӧO'piڥԿ^}'ųYbb"TZY2 h+++ꡅ9 ۷sCaЧa'&&=o߾f3g$j˖-'F A[YYQC_ ɓ'3J$ŋsd7|ӯ_? JT* ߿_MԩS @ndff2Z hDC]ugD;w2۷_d tRSʎ;T^T#ϜʇzڬY3z?A5 z͈|ƕ+W87nw5 ~;wNĨCP˗/3v;v3f w:H$T!%%B wNDnxRE#ڽ(OTgtroER R֭[lmmnM`޽wfܨ+.]ڵk߾}OO\\\>SF0!!AP`Tyy9#BAYPCJT*JU6>.1pT}oo*X˃_fjsEׅ?cAup #""A &v $vE5""PY(2 ('O...LI&5@ĨCPBܹ|L2͛7n0~*z\58{ @ Bdddaa!#8c ___u y|||:/2 g2"ϟ'7u9 /^[AFĨKSc]FQ||}J>}:b5j5 L&`܇:M6kFA۹saO2'O&Μ9Sݽ4EԗCIkq]^gggr###C)ھtij:1e@`:t;wr_5|۷oѧOj&vZjGįs\BQRRrp77{ ؀Ȼt߽{7(((33S.gffݽ{ O(?xݓ/_<~͛KV U;>>>rbB qs9y\.ɉxGu߿?1u˗/:=5VgU`AhBt/&׺uk5|ߦP7&s[MرϹ9Pbbx]]]#JbnݳgςunٲE墏fffV*** [>}Jɡn2#ɴE/xR^^x,,,>uy董ʷʡ1:= Yb͐h᪪Ug(zwΝ9 &_ϋ` jiiiͻᄏpk׮999𬬬ۻQFfffƍط&1?c}377ӧφ .^hooI&eggYXX8993ի_}.)EEE]r ssݻw% X2/_e X[[9s&""Օ|~@ҪU[n͙3GS)iУZe@xVVVE-Z0EԙQ7mݺuvvZ`All,0%%ey!u tZ>{mb[rY T*ٳpBb: 5ʛ7o4h@=ܹ[9ДDG/0_ sgxB] .Dθq1;Sոqcu::3rH0.͛7;S Se.vP'ݎ61 8Pǿc֭XG={L,W]+_ZJ,uL6ٳYegg.ػgm EŝEͥD}i5-Ls->&*[Yk)hVZhfij.YnZ*K2af =\:>3} ~WJA^@e2PΝ;_uAM6w\QGʕeee}ݕ+WrssF^nThărr@h4jժ t: 6DEEU^]ݐ`52pj7o KKKS;p۷oONN>` … Ť̈#233v\/t:݂ -y.7@^N-ZTV-uq}lذ[wN:UVӳN:#G0`ZY͛7WX:Ç*ݾ}cǎF s玩m~~~ʫVXQnڊ+ġBCCg;u$]rAL} eg2Kv%m۶FósFf_cV>\{'X׬YvD(/BVPN:Җٳg#JzP߿3g󓓓}YARSSGe•+Wݻwܹ/^?"##e}F>(333//ȑ#9sذaÎ;&SO=ug>S 9rdĈFG^nsss}}}RRRܹԹsS̼W_}UL8qBV_~EW_},XMFM=z^o߾5k p+;sFbmZ5fPX_P2̣^ 2ceBBB/,,lӦx4saz[Yi5Ǎ7JK4iD *l߾}) !!!~A6իW}}}Řgu:oT,>}tiY&1bS^xA駟=z]Rź˒rq'boo˗/ׯ__NɌˡ^8Ԕ)S||| / %[l1saǎɓ'׬Y#.+KO̭oذmݺ04c覜bڵ ;gϞfѢEfĘ1că"񸸸xͲn7ސׯx\\3EY,3jԨ`ٳgK)q9e96|IYK׮]ŃǏpGlC<r ȁo};Ogee%%%}ݍ7A[n߾}͏`["t{L2((H+X5f`Pl&oooC:f̘1Ғ6fr9el%R;jѠAS-f.С/\ Ҳk̠$eXFDɌK[0pQAxwLj},̐!C?e,"LZʆsSx lȺ1b%3. p . 0ܹs/ٳgAѣG2װa˗ wގ;n۶ڵk>{'Nشi۷;>~t 8099099y))) ӧwަnÇ? }=3+KTRcƌ1U 8P<={ 'MtRϥO>oq1i,/Q25jdIÇw5~К5kz{{{xxծ]}zΜ9~awTZ^x!((֭[;w7oݻw t:݄ RRR>5d IDAT^z-^ޒo?ɼbret1t:]|||KFuSRRRƏoa1M8m`CÖzܾ[_pRmä4f̘%K/ō/^l(a}IY?)effe>,떟&UZ̙3Μ9\;p׮]*uo o_/ZСC- X^z:u*77ɓ*ew?~\>QݭxsluSc*Gcr V,#*3.LEժU۷hϞ={eKeYKdddxxgѢEҖ"ʡڴi#klӦMdd1))҈mעE nzÆ F{mj:,]T٧Yf{i׮V ]j-(8LeDcƌ>*&>Z2O>eȐ!5zg"##WXqL!saY/lgNd-%& da#Ge'6J*رUTٱcΘ1CKTv}M&W'uζp:l~SeYYFUf\H2o ˗ٳjժiӦ# _~v*DW\]XbŊ)))oٲ^JS2)-Zlڴ)Fy&MXanݤ/kԨӽ{wK///iK^^3eۛǰIWQu;t7ߌ=ƍ۷o߾}#G+VD X)YYY;(sXa5;~ի!k[nϞ=K5lo#iAÆ e-ť6)(?֭kI#eDb̤I -3gά^zY͕)/#B~.]_7~}YnF]ZF*UmveB7x#>>Ydk$MZnTF6)(?Z-kbb3lj_^vΝ;Ǐ/f͚$WƹZ"55hrZ9=n?>>#? l޼yƍ61ˈXe% /#UZ!C?ٳg(K*TO(pO>11h;d--淟*j3jҔs˛l^,#bWL>}lr)))?u-ZXfldddJJJY+)nϮ2"Jf2}9tP5:wctCeSZn}iӦiZ(DEEmܸQ,( `SN)KaĈX [geXeƙO6QF.]k׮8qϟ|7޽jԨѴiӎ;4}:z觟~/?x@ϭM!iݻw*U|8PV!%%eڴi]\e9n_ R,x2 hbcc&g@^rb%3c}Ν;6Ywܹ-[f 7od_jԨ1eʔdC^&co^]X_@eA^@eA^@eA^@eA^@/_V+}O^F @sL / KKK!\իWՎi4sL."#/2ygD :˸ hp3e 2 /J(q.d^(?<nvڥvGmڴxm6u)~ʕ+p@2.Fzsݻ+EsCp!&2 /,,/2_#ԎƗ_~o|2.E`SN5/sLNG(WG^F}dX( F^FeV(kE^FMdU(ˣE^@eA^zC /2jSP&dv6~~``Qep>L(8Btt4yh4r[vsL*+_y`*cy _~UCU^5l06aKB?~7nj"//U6hРG'O޳gOAAol #zu-[$!!/5֫WoڲemϽ{L]Z>NOO?x`ll3<ӤI[j|X FlڴIY쟖)kh46mZrrrٸqcnnnIQ[/##W_]t˨Oח{{x `ӧO?yQwSLYb1;;{ȑ?W9N7rlSNի%sYfڴi~=tk֬)eֈׯ_02ӪU]ۨR!mҥ}JJ˗/9se]۪U%KX8F~w.]*E*..^f0c1-[ds9wx|٨(Yoo___犍5u?|S oTqqqvvo6|e(\y@ 8v ^}Ç+73i׮]&._l?W\r׮]+;{ ˸$8HoV.]dgΜ3gΙ3gdt2k,  t:ѝVZe5cǎ <|%[lY׮]kժSN]7o;e{rS8qb̘17jꩧv%5Yٳg 6]s=}v+bp֗ 8zݻwՎ)t:q~~={T yuA(<<<۶m?H?eJ*m޼J^{M<޸q ZlNNΦM;VPN:fo۶-22Ν;7nܸqСCK,Ylٸql^={e edddddݻwРA Z5jԮ] Weff&%%%%% 8p۶mv :e2b7|jGtyp  ՎnGYbŘ1c?\288 2s̬,A޽u_pv͆mj֬9dȐ#FX)BΝ;;eSfgg?>33ӆI˗/7z*11qر~i>}~W}v1c 3.@TKٟ)ѣG8|5THkLVZ%=+#7&zܹs'M$;;aWӦM+V`޼ye(SI֭[{a*)#ZfŋmWq"\kժelPPu;LO8B ~ⱧĉRc=pBيœ'OV#^0aBqqr˗/OKK+((z|PrDXF%>˸r7+W:bŊ@+_ / 52bԫWϊ-b gΟ?/ӧׯ_ۻA3fؿ]pիשSrssO<bOǏ7o\vV`}ѣGtm۶ʩoԩ!CX7lDDDbbx_߼yP~mDDu#["((())3oL8144T:qD3 ٽ{ :tXt?/ӬY={ 'Zw8W--ZTvmN:E^oLݼyK/LXgϞ!!!))) _>//PVza]̖ٳΝ;M/ZLe b̌3Ĥ]v>ӦMfO:Qv䓓'Ǒb͛ӧOfͬժU5ٳGLxxTMЗ_~i2ȝJcDs΍.,,T*,,;wK$&&*mҤŋ%K4nX?߱c:w,7rիK[zG}$djʕ͉'֭[g yPRN111:t8v옴رc:t~Z(W4}o!#..ΰѧx;w6^s=WJEՎ?^=iO?ݲeKi˃vnݺׯ/_wF$S6lp!__3fӧO=tІ ԍu떬qʔ)]ttU ͛7uEDDxzzJ[rrr>iFYn] nݚ8qbݺu4h0sLM0R>:w|0ׯ_Ν;V, I^y/jذaپ}rM`ZdIӦMe_|_mlnݺ/166ÇҖ]~G%;8>F^h<˗/W^%-,Y8Bi':z/bg@@Y>|֭7n:tjժ%W_}%/[0GEe5k֜7oo*m ;yyj֬VltҐY/_.mY|eZjdիב#Gt8trA3(Yr.\hꔷwttc8ZݲeKXXXQQ}Μ9kݺ gϞ]흐Xp??裏+;wn޼y@@Ço߾}۷'$$K/ ~W ]v111oW_=q Ç/((]Ӯ];E :s̙3g,a???{x *p'n魷ҥ̙3QQQsQ@٥KJٟ}k־}@ooo//jժ<\bŋ\_-]駟nԨ y䑧zjkMsĉ1c4nX֯_ڵk_[^gϞ4lǧv=ۭ+++'֭SV.],]Ν;%uv燆V\ӳVZ=\bb%pu :4$$jժ 4ׯ{w5{df%vhvݳgOqno åSffIՎ*ߥ_ R;"$188خs͟?_u:(M]|'ٍ_Z߈J:lBڵ6,f?qĬ,㵁~Zzkzy+Vu:N5\288P.\h߾{wcE$n۶nzj۶U |w}Wy; $&&;6//O>v2z;f̘aD ,Zh3zݻ#FP";yƎg@?}+VP>&UTTv)33!|g}6y={6iD hذa'Om۶7oY&00Px]m<elX/s޽>w޵kVqL&f8ɛCcP/Sد^DScGHOO RRRe;U\YR ر.\P޲s&L{W\իWe--[4Sٞf~nݺI_֨QC٧{җ^^^Җ< Tas='kQ>;1FuJJ=B[eP^ܿ_Rn]U"qi>M<233Lblnnjժ%\۾WrAA6l(k)..6?Q--7iDbQ~ʲGHr eA0]ܹS:Lƍ5j$kܲeˮ]'k)s(gD<0So~pZFGl$ Yv*U v}*T0ѫ,W~օ(nPl攩}uRjUOOO__ 3køqAAAiii5kT7n1ˉ'ƌӸqcV[~zj׮]^߳gπ6lSv{nfn\6);wL8Q֨h6n?qDO3ZJ|ZJYjr9XJ%<젠 ñ޾@-j?~ZjjG#HN[vOg틊\hgN_7o|饗~'oooA  5^={e ػwAZ=j(_333m61RM"##o޼)k2eʓO>)ɓeggffFFF*k:ut9iKll3Z̙3-Vhrte~B7lZڹJMNZZ,$e(qե2NΐIOOVh[m۶ o󸸸իW++T?Z}%n#qKOeܔyeLyKHGʪYiY4SZn߾- G{cǎ7n?ǏK\t:e6z걱酅׮][zue}¬xGjժ}Ұf͚uvc%BV֮]˗/۷o}1/$^>|իW@e˔e(U^@9NYz[wΜ9{yd}MwUk1ߒmbΜ9Ve)8yr2C Qv0}xԩʞCuz2ca0zܹs6!2bŊVc xv|/$^?r` 2Py+2y3Tϲއu vP/Zr_L,B^N:{ɐ}w?~yʳeyxS摗q 2力e+٦M*mڴe=-U9?`?u;%FG)r[ٳ5Kdא:T,A^ /we :7iD(޽{oݺvϖ-[d-TϢEch)**ڲeˬYd=⒓PHnzÆ F{nA:tt^֧Yf{W# ]j|<%M&M$k3;Vݸqcnd[GO4[nҒ=&&fڵ k׮O>}~n^裏j'&QTTTݺugΜitĀ+W>Nx[>}tttu=%:wm-\V}Ԏ\8|K4hн{wc)Tbms/ZeZn-pqC=x@ֳo߾F{VTUT?,O?vHKKSYzPZon]yvwƍ裏VVB UVmݺСC?CKt\xqѢEkذVh4 4۷;cZKa{u{׵kڵk{yyըQ#<<|ɒ%EyT}˻ܽ{W@۶m[Z5OOOV[z͛wm̘1K,IJJRb~_=$$RJߋQn?Aќ>}Zp` 2pΖ)R35}C|MnM078^^^oToco<2A^\U^nlԨQ_|EÁ5<(YYYN߿^zu~*l&ť6)R.]JHH0LLL}zQQK߿qư0䘟nN-o pFeD̸2@ѣ[nҖ={o~ݺu999:.//ʕ+%K[F_ĉ"""5#-ZhӦђ '78 2"Jf\.iӦMo6$''O8ъq+hگՒw}VE nySP}:eLdddllX2裏:<4XzPn5]*)))?u-ZXfldddJJJY+)yȊeڵkr.]Z(q-e+nӦMnlqi\Y#^uñԅ-o pbyi4hi#̸2T^vmƍÇo۶mj<===<<<}%{-ZTV-u)g /PСCvڔ)S>c׮]֭n$sL?N02szALLLV|||;wlfFNjT2`?|톖nݺiUV iӦ-Z4mtӦMY~ѣG7jۻRJ۷_`-3gμ >>>aaa۷o7ڳo#G^{51+>GB 81wE jsϜ9ӧOh?mԫ3֮]ҢE A]z겏KG}Tի^^^'„ bO>]T^륽w3}.\ ~p,2΃zQ/vuV 22RL(|}}LRPVzW ǝ;w.^Xի'LblþTk׮-**!**J8رcz12ӧO]vc6XnNaʔ)\_ ]O6cǎ]v޽mVZŃ# 'k+aAABBBăSN駟.{R^xێ @A^pR9h X(##Cr䈡Ѱ_x?^~[Ys޽#Fd"+BZraYb?nHL@޽{Kg4(%%ٳ?KԎ.'̙3… yyyׯ/m2xz-A.^ةSݻΝ[`AӦMl2!=x'n߾ԩ1c̘1؏ K|||Ϟ=/\dh_paTTIddڵko޼"nhmUɲhѢ>(55^Q^Me !ݸqcԨQҫ/^\x(' .I:uN81-[zyyiN:}WsQ;4 \2{h4wKǨTRtttttQ&fx53]-A[" 5oNY҆ ~ )Ώ : t1K /2`lzFc W_}u}@>|a|}}ٳg_tI(`±cǪJf͚<2q$bB^@/[h!ieU]x 2{lw`ҥKycPyu&2 /Bcqن*wojUbvg~LdW&b2|k[͛7zy\G7nE(DPhԍF#5/3jPfƌō-h0_@cqB~J|۷7kJo%4F/dJEAAر4Chjjj>h'<~899yժUN=4۶m6l÷o^WWUVy{{[YY<&z]sDK=zښѣG]Or;99YZZEDDDѣUV 0M6:t9s7O`ޖtzh$>sT*v8`X)))zoBOO寯>{{JIIIݹ;uj+QT IDAṬGZYYQ]v-**tP)?%={rǷhт?iGx)âmu. tnnqڅFݝy(J#hZlI9;;c @S+\rѣG@S^r2jԨ,\5j(BHZZڌ3̚5Io^zU.ߺuk̘1c~Һ_u„ ԣC]vMMMСbJe_XܬYBBBr' !ׯ_޲eKHHHuuMTT͛7rgϒ pBM;Ԯ4F/~A#/Ӭ|'NPż /˽CNbrY*ãW(>>>WY~W3e@E!:weo۶ggccC177gJrٲe:vD-꾁` 2Ɓ2U=]f`޽T""" X[[ӃG{a{n*pB/VVV&q?)qQfʈb̗#G٬qqqr2gh!D"| S--nK&fB+==J 2uΡ']tJNJSvABȮ] 4%̗/_J޽{J m$ a\1aΝh-SYY)jS@B/_d&\2%@3$Q L:Dkz)ԩ9!֭;Q*z~s_xjum $I8Ď111ÇС M6x1C?:D$UwҖ.]J\lw#B?}SWW[ڵ+0m lq !1L2{ɓ \JesRHHkfiiٺuΝ;;vLP8Mŋ_{ȓ'O>~]1jՊJ</8wCߟJ9sF);s挫맟~P(Mָ>8ҋ3^VFA%ۧӾ̧BDi&PxM۽{Y6mokϞ=7r5U[[[QQQPPaÆ~Ã6zرcY75.h*++7mD?`wN%TvP(6l@Y;L>J_ί9pkܽ{7"IffĆM%-(7nc+ͳ&lݺٳk֬Qw.xffC"Zݖ "GG;vpyp燅2%Ɏ;ZnVUUUBBߓN62\lÆ )zh< ??BRTpÙ[RRR͛ʻw~-uŔJ%ѣoܸP(nܸ1j(*sJu[oE}7^P(rrrƌCOWUG$ӧuoEG[b?B?6mhqy=666ѷnR(ѣyse\.m] ! 0]htݙ hEH=FpBn%~ :[rѢEֵkWkUWWǺ vJ%077?5Jcӧ+3f\}-))R\\LI$;wkHe0w)??_pxiennT*/0]ߧ_*J-ַ➢'O}_.[gddB]/㏅D333wޫʿ{'O* Ν;}f]eeB_`H jժՋ/442_}=su*ѻwoq#Q,]Ϗ|rߒ%KVNoĦT*UܴqFz_~-qX9]v۷С'OPO]%gvwwԩӨQ~}رccǎuss~WƌsaV (|KQQX~~3$ƙ6tz( na/e#/#'R=ڱcرˀ@Z_F`<(fff̏:-[pC駟t6m+++KڵK``{Wyþ}Gh4-$6nRtR'7ncǎU^PPBhu/˹KBO.x n___S @PQ^ˌ/^|!!!"@sꫯLRI?M[~FOM4^^l޽̣vN'MQ N$4h6l:u+**BBB֬Y>裯{ !s̑dÇ_TijX[[9rɉezo \zU]vG־m#:` 4/_5̗iV|u޽+vtb|H֣[ꃂ Ҵkkz,n;SLTVTT\z5**;py={VЅSA >eff]+I*!!AjOVyy` @/Џ?sҥwtt477wtto_!vt ۫;Eͣ_iiiT̙3Tb޼yZTN988}B` 箤C;wn]]3UV111 "//kժ.ʕ+J%1hF~/Z_ke)ݻW_}uҥڲGFFىiXԩsUzlcǎuuuբrVZ}V|mV'O~ᇝ:uܹŋOw:¸ 4Y?޽{Y]taeٳ.p3gϜ9S֯/_}/;fӡ իQ[hhhII +3""Ϗ3x~ɓP\SvZ:j֭K,s$ɖ-[̛7رC,,,Ú O? :t֬Y:f`L:+22RHffS)JL#a皛+vD`XO(J-*~.>Ч:t{k׮ܶv-avM` 54ydVN:|U,66V.HLk֬ii!Fm!۶m Oܣ-ZVרJ̭ʝ!O(pA*-->]B=dkk-okk?2"EY`ӧO ,\SPPpVfXX؞={XXl(QTWWg̘Nsƨ;Q8@ZZZ\hѠAԝ())!տ~2BLrݯzڵtqq4hЗ_~3gΜ<)...,X͛L//͛73s6l*vM]n/ 2zZY:ڴ_6n8`\?; hL0.LO>}믿>eʔAyzz:::>}޽{7s&BT*6mX7+h233333޾}͉@/ sO[YYy{{駕999111ƍ֭y֭}}}:::Z[[ 3;;7ߴJ7n$رںk׮*D?g͚եK++-[{ϟ?W6s!; _C111~~~mڴtppx7/^thj~4:)))blh6Zzz: ;"hdF"##[T*c`ÙwNJJ^+>N|\ZJNNoŋ666<uOwЁY,$$R"={Dtt4wUBT*s`ůQZ\ݻ De+WҥKںu &ܽ{WMVs/&ڲr'qݲJehhh߾}ccc㏲ZY32y^?/^P:RI/@qDB&No23 ő#GG/d4i¸ L&cOЏ_~ӦM6m޻wOPPuuuBZH$jv2 S/4+;{,+~TH3gt:T*?QMM!ך7|C'ΌUVT^e@W ebcc ˗6lSNT͛s+++W^{ ?$$ֱlٲ 3f;އ;33T%C@޽;t钁 鯐 @ &''gرk׮ҥK!Çʼ;[n%L6mӦM?Rc0tK.ꫯܹ3`5kݽ{711qϞ=۵ksN67Z Խ{q :ǧm۶2ܹs~!utT3f\xGyyyZ+hN8a'Kǁ3ߝ`#F&11k$22R;R*1H0A;'%%E/piiN"SFsSWWh"nv۷O]l>WeaӮ~קwѣGdOl Ս=)~fbG&]苳3c[b `kkkkk۽{5kddd8;;e222V\٣G T\vR;bffnݺٳggڵߟM͕JÃ^"eDuT3uԧO@booqv˼s`%|ʔ)G|,88ܪ+]rv04<@!6mر#+{Qwݻ26m|D!vDe!qǎ!Ђn0VD"ٱcG֭ %4-?Æ `eVTT̜9}B`XjU^#4'mҥǎp33333**>33Uoɒ% V[QQ?:u*++-[tuu߿Qu>}ꎺ0k֬bVf@@@bbG^|YQQqEjՊ{ fN6m֯__SSSXXaÆ6m0 <H RsNf=ˎ[;GƄq֯_?ssN<\jթS^y VZ[SNeCݻ3rh9pLXXX=X=z ceΝ;3sX;5Bʴi~muG q!,gf%LSiiG}cggܮFs/%FPVV6w\2sc-tB{!+_~ck*Kr+3f +LL&k DmM>A;z___]8""BjVN֭WYkkkw}n+Ɓ>{h}~zrss Y|KiD0.#Sz`֠rŢEm-\[~qzS__ u1Ա ,6sL:"Z;`\cq33z+33S.gggGbLL+ܹ#޽K==,k._\\,H/]UСCCcƌΖ噙#F`BJDEEݼyS.?{,99A&t?KS[)'O8A~znmyGA5jTVV\.5j9zh5~0.`ʚŷF2|#}CGvZ]]mk׮f`0s9:: <ܹsZ_a.\QGV+bǛˀv0.SMMM=CO9_ee~;}15kffvIf*B{ǏSѣΗdB~iŒgccCp)QRl2Y O1uw}m6*ߟui^'NwBr7u2 BHii Xfff m !?#w <}_-^X <Ǐ]"]vmZAZЫ`@GKKKKz={د_?zr 9yfj)S2h"22RWW}v:߾}T",,MDD&j@\\\.'̙3ݘ"H>s=6ה̟?rȑTi^{R+++:ښ{y|ƎoZ#44hѢA;o…֭cf,XVZ}w+VHJJ:}tfffaaaEED"wuu߿ѣU6ԩSÇ߽{СCΝ}vII\.vvvJ B-wrBH20~EU]z@ E<ϝ/7>L&cPkBX XuJRc !z!\<0͋L<@q0ر.5S9::6}JNX1>|K0*c#ܸqC6753=bw>MeΞ=9<`#FBܹ# . a%OMMC2&zbfիW؊i^dc.82` ~ 6P)SRy.\Kn‰'2s{bccrǺcۺu+wdfuvЁJdff oQFjT2qF=b,ɓDll,sGPwIm b CNNرcoܸQSSs֭geeBqss!?~_~/**-++;yyvza)ߺu&++w޹w.Zr۷kjj'N>|8?+WZEPPON Ɣ|wŎD毑Hb"J$p杓:W\c6yfu+:tUѣG̹*2۷SףR;L lEd2V𖖖GUWO"^d|_}=0CIMM]`\2feqqqNNN߲eKZZZv4^z#`~F'))iܸqoVlRinnS\W%%%ez^9xiennT*//  SVVc֩ @ƻ:@sq`1c7$ceāqq`}"ɘ/߿'V0]vbEK.] $v` b%;;wbGMG>}222;\TRiT< 2u̗RtȐ!bQ~~~jj*} iСe~v)V0%%%1eċāqq`\@eāqq`\@eāqq`\@eāqq`\@eāqq`\@b"H$T^Ht/̗@0@0.ax9&q`\@i.$)S?s֬Y]tjٲe޽W^"dff־ֱoT*ݸq#!dǎ^^^]vݱc󬜜quܼu־Ŭ&&MD5ѹsgw;w'M]Zc^:88;޽{󵻞Liiiѣ/_,DS|wUFv7Ott>Tz.^hcc>CBBB/%ٳgtUV&JJJڵkG׿EeΞ=qvv.--m0jjj+** ^1 TH۷o eEMM2C%(Ǐ'*>2dЙ3gԝ5gΜ\B!|'*`BȳglTn!_~5qh/rff2!!!ԃ'˖-ι(//1c*$8::R7o2+++W^͛7;=o۶m۶mTСCqqq׮]={6nœ`dw'88X/r3<|} [hbڵ۷o`ZExsJKKUnloo)VJOOO*gϞ2ʗdL^^^U_ZZz[%ɮ]z*s z?u$_|b㒘`ddU1Jz (/ pss~o888Ų[.==}666}Yv'Ol5䔑r=zXXXH>ڵk ,!ޞgVWWsɒ%&L:~BHmmmBB333+**ZnݫW)S{'r(gllٳg =<<-ZԪU{w…B++!CDGG߿VZYYYĎz0%w'88X::t<$$R"={{.cY;v,++SW/6#V.^hcc?}_~*+//upO F t^h333R;w{.<<{7|n㒘`ddU1AT ~@RRRĎ@dݺucP֊4Mx8qbuu%Kaaa˗/''$$ЅwF,^8..͛^^^M6+5bĈL\=fBHNN{JHHkRRREEL&KKK b4S^r2jԨ,\5zhBȅ hzYzRt\.QTT!ÇAAA -XBKBBBIIL&ziN~@/]__-VNNN_AH+t#Ǵ+kr:GԡSN;m۶*'h' W(ԡ3g,<i}˳$C&1;w.Ux֭tPBR<~^*!_~5qYllB_|rÆ TzԩƉ[:66ί{0KmZNKK3y6&HHHe˖qϘ1C/ iei֭3r<ˀrrrƎUSSs֭geeBnFHyfPPPvvvMM y&!dȑÆ 3N01rH*|LATtRBȝ;w pȑ2BqƍիWwuziH*++ sΧOk׮͞={F@u9XK 駟FGGLooo]nhD"ٷoѣcǎ;vY_~{:ɓ7oR[GK$~I_3Y>s\ߺuk„ Cڵ۷o.kw!=~g_0_DbŊ0ֶ{k֬pvv6fڵKKKoӦS@@֭[/\жm[ccNNNov˖-mll<}t}offnݺٳggڵߟU &&_״-H2nܸ .L4u~ҴB 2fjٲeެ̌Ȍ !oo?PBիY jX:PN(޽gϞ/^`oܸ[~Ϟ=BߺoߞSVVc ^{be԰27oܮ];[Y9 a\@%A]CHHHPP2AAAfҽhVf۶mu¸ ۱cG-Tuqqٱc.WWW?~ĉb>|.X_tB #- ͛ꫯ4dH4sLM+0_8yCIIIk7,,k׮a\yW@ݫ={~GCk X!FjbJKK̼͛yJKKh&M#GD"=V ,X_-\P}ˆ5sj$\\\z;i$k0.`?߳2;tP[[337iҤc3cJWQ( ~~~͛7H$ ? i߾D"7V^:;BQTFFƸq6m*J>,;~N:ىD&MxyyEGG+ʑYsRRmllƎ{]5]HMM}Iw}p4D}5tPvmݺ]vuE*ڵۊs%/ޕ2Ν;BCC4\OM11Npp^f(..ׯbO>: k+߬į7NJJRU3wյLuu… 륿Ѵ9ZbV;w\K@p%fUƿԿE^_qQfK.պ*i׮3ĺᓓMih[ܪ-ZDFDDpN2Š!YN:1.Baa@2L<'233e2Yfff`` 3foܸrL&{QTTdj*رcǞ={VQQ,rʳgWTTk͚5(kkl5;::ǿz*;;K.$O>I$&&>y򤢢3fv_?5iUͧs-ZT^^96k,,C|¢5+`\8LXϑ#GtիWW:t-sQur`\%3III!e<<<*++Jr… Zן')޽{EEDBBʛ5k#5M_BBBFg8UOnn.jkk:ʚOuk ?.ó9YYYnb撗=z ~jt} e@;!(}"gggVP/0]|4S- 5ˁq0/J FDD &D"p߳gWUUQzdΜ9$Ze-[Ԣ)S/EQ "۷om߾mE}̗pxW [4qqq!/>|H&TBXXؓ'OX̜sfzqXXa= (AO2dsU?wIqO55OTi^PP'vrr"2V/ĸqlTcuՂ-EQ5b)5F@>|AVu븅?SwwwV?1(07%!oߞR}ݱcI:tW/殡rrrx6\~93TnF@k8\.WUˋ$._:DOz%\Æ (̙3|b_Eu/\&H(:q†888DII h 2޷8##CUz丸8\.߲e IO:Uݺu#+WܹdZ͊+s.>}:c PiӦ$իuFwa/Ria-+5zT:O]Gt e,Έ#Hbiii2~~~Eeggeeer&##G>|g@:wl2n߾=`#GVVV޼ys{եo&IL6ҥK/_<}7w%E]x!CbLΞ={ɒ%J F0rHͭرcwWКUEa?~z^P ߿?000==ԩSNbׯ߾}T㏧Nyf׮]k׮d6muĉ7o~;HQԺu~嗜lN8AtGw`֬Yt@ Xn†?~8;;l-vޭ,}T6b嫺E\_z'++իt5e.Ph_HZZ>wzܛA.8::ZYY999&$$TUU/իWFiiiigСu>}ϟ}ŋUVuʪ]vݻwUU:[LKK !]hԨK֨uY#Z֭[G8p`rrPzFL=zٯKj]sv1H0C .d9g Yll," JP]ɵk5w) >p zرcǏ_.]tÆ U%۵kw==*"""..~hxLsηoߦ_* Y _~'sSG:2qn̘17uP۷: 'X:pSGuKNNƸLL2q i`\4@CPPPp H~mm-ә/Ǎ'hrZ$*h0.jJ_z|YUU[8 e-[fpuu5uDP74=2u`@yyy]v5u gxt|G-ZHKK3u,/wFFѣF2a<&ףGw/Moqq nKƁq`J666 vK2X Xˀi5m$`npoeˆ e¸ )aDa\40"Ǘ9"ثWs9002S3`i?^{?W:(Ӷmm۶ 2a 19Gm۶˗/={D"1rl,V 4Lj6P4|=z`ܣw&G{=o^"ۿW~CQTFFƸq6m*J>Cy{{J$UVx[LP$$$5o\"8;;'&&VWW+V&z{{;::b޽{/Y$==]U$pdRRmllƎ{]9YYYCi׮֭[)ڵkW.]R]~(JMM}IHvvv;;w֗A}׉O=c2e zKYܳNʿkRE={={޽{e2j1Nppu~礶#Fp>YB%#wڵ}Ҷ2\z5Ν;?|Y_~JaooO")**֭FevDUrG\]]KKKyͧsZjŬvܹ̗ҥK̪s?*U]]pBYBpm؎=|C.]uU+ޮ];= FGJNN6hxSN B]=EEE˖-SJ?vڥ[%66Yy\\5z|Cii+{:eϞ=[f=inZSShx^M/.2SGy1ĸɇ+H#GCBC7Y IDATn$1x{{_rE&=z(**dzzzd2n[t䞞;vc _2@h 2,2"C`\~;!??[8//UX ;wNM4I;3hztPq?2>>>727l@}||yyybݻWTT0͛7mYf1 U%vH_YYAO$3%%xxx0vap-Z|ּoe#Ǵ Odee޺uK^уbO_rssɐmnn.(0`\bi 2,>"C`\Eq+aM`6l{ァQxbM7['YSRKKKIBj,,pLB Doֽ֭[S~丸>$ c]p5{EV1OOO?T_6'N$#O'N,9eUEGU~¨N zPSի|_``/]jI6]Kq*=;OOO:DeeelkkKQTFX9_}y?DQ5n8 P&>]kk}L7o$LlD"ٻw/w<.f EAAcǸ*N~X e,BƍnjC:1f̘ƍ3sL\\\D"H$ BNOHQcǎ iZ9U),,\jU߾}7nleeբE1cưVS۷ookk+5jk[NƼ`. B@@@fJJJ._\[[Kh֬Y@@]YYSQQv^QQh]QQAA>iF5jÇϟ8qE=}>:v]R'y?dooOzkoذa֭Jc(j۶gϞt=~!q }Ue&Bݻ{ICJ2ٳG/ڷoymm˿ |dɒCVTT?ϙ3g&N_*y S`4ڏ?>vΜ9Iϟ?[W^E —/_j.Ib"uFrv0̰+++wI&CZpT8љgPgM"!QuU*؏ XTǤ0Ǥ]7UsN>MLLKH̭-͛Yے%K6u>})ܲSS_FMlȧ+WobѢEѯڬY36k~.bSÃ2d۶mu!& Ԝ9sf„ ҥK/_LSH^^^˗/*ܯ_? I$דwՖ1k dٙd#\:2DQԉ'XO6AZ=L2G~sl 9y$sf4WPPЬYto&::]Q_)m6R4֬Y@\\\xx8wM[nPQRRp:14E`!Ηeʹl߾b999xNXGKKKOD]k׮2ίG^Ν;G2Ϝ9Cr<<<>1 Ou6Je}u5FTU*$رct&=?mMϢCshllF-60/pe0z7_N<}+**jѢ\\\4B(,,<~СC%-[VgmzYg"H/ÿMŭ͛rl*ӯ_?T'N/ԛ-eX3W\G}Dt%%%2,333&&Tz]s%Bȑ#333+++FMN#7o$ݗGɪsʕϟ/,,zyRR;)]5FTU*ᑓS^^}vM551YtH-[ܵkWQQQEEߐ_2),,TMS/~CRKVZbD~U1!_~56lذiii;w3r+++Ԯ b:6MQT6m8ӗ/_8piӦ>>>zΞ=*ccc*+ٳudX'49 PCLڵke2٦Mnݺ5qD͛߿__!Ĭ\Ksλw_ :uԩS۷oڬ,3###YF믁?~8;;̺w1c^7fHTPP,֭[K<`8| Yu~ƌ_|/F5כZ3BÜd+++sӧOpAu릯ڮ]v}fnN_|U_1K8p`666bcժU/^"}|||}}֮]*H$رc{xxxxxXg< Uj4ץK:kC~=w6fhϞ=)))n$s»_߅̜9sk׮whyyylll|||hh~X'C(--yy{{sWZ&Mbbb.\s]4͛76l󥭭X,s***~3f +ɉ}Cc7f3q󕎳0"a\6mCIKK3¸\.' ˜eob;octƜ-\P}ˆ{j݊X,vpppqqݻIȳ*.((ؽ{w^6oloow}EEEUUUEEEΝ3gΐ!Ch}]`t 2Ν;?ࡡz39"V;]֭[JKrU}`\ L\:uZB"$$dܹyyy2,%%ٙ7nر[xs-//Ζd%%%III ZhRR5uԫWR)233(JMMUϠF Θp1dȐ!C,\u0<C=֯ "[lbefeemݺi0.@̟?rȑ$/(3g/@ XvT^$""B"Ro>U!`tFLfbէ(J(&&& |4jHL/))1\_lI&6id-tԪU+VΊ+a֌>}9Cݺu=zm۶CB7n`0.δ:Q޽/]\\HӧgϞ%S!0HbȐ!CtyI)7ΘDXXؓ'OX̜GDD=~8,,̰om ٻwH$2]`׮]JJJ۴i#H\]],XKLL4n`0.@4mڔʊ$X%ܹCݻw7B`<=x$+n9t.74Çz-cTVVnٲj)iӦ͉'e1bI̟?իG ˗/?w\. RSS؊yCP5jժU999r,%%ejvl1ܛ}lܸ1;;@CˁqPL}'E͘1!0Xˀ%bTAQڵk&F@Fg޽gX@0.Iմ [6uE.P|´D=0`UVfΜyMTqƠN:ىDƍs…ΒdގbW^/NOO)Zl/x ϭ*!!}77jh]ׯO0I,EDDriwR]]e˖_?99Y/>K),,㏽4ibee4z'NРԂ9IKKc^`7cǎFqXW_: f+VRTTԭ[7nQ-NWn _}۷/7oӢէ?~\,NٳL&Su :QP;VK+ UQ{챳SZx Bѣs.]`.\ȼsMuԉCwx`\\#^-((0uD+̗,۷o;wnyyuTTTvvL&+))IJJ4hТEtosʕgϞϯzAbbKmmuv:eŊd‚ozzzEEL&}; Oa<֏?m4DBQԵkײ\r(T:m4W?$$dܹyyy2,%%ٙ7nرURϲy3gά\2Ν;ziEi޽3fx򥭭M +**RSS{ԽАF#v횗288|8EQ'4ǏSVZMSS&O|!/^jٲeׯ(jҤIo`>>?3\}V[[޶mѸ87b˗B0%%eFyyyϞ=޽+rss;t蠪 ]O;vK.ݰabEDD/MuKB!L}K,_&xZxqvv6ń0Ϡ1-_T;o}Zէ9{,3ޚٙgUj> &SVpGGGbӦMݶm9|r5M}c9&K{ )<9& r쨥lhIDATY:uAw^TTD"! g|(z9|ΝIbÇ_fMJJ˗/4)FOv.**JJJ"O.(((_} Ocݛ)We|BҴ#܌3G}||Hj*}h0Lϝ;wH{ke˖-~ee555?xҤIϟ?K^GVpD>}G۶mK)\| Xz:8}… +++bqdd͛7+**5'Lp̙~13N<ٿ[n !3g.^xqϳgϖ/_~qb;v2d˗ w}'Jɤ$$œ>!Z1B&S(j}}ѣGhh]Aq Pukt@ktgɓ'OiӦ{,zEbh!!!d DTJg0$JϓWߠM~c,5=q$~VLFxr$ XW^4iyX&777##(;;ɓ'0$Jϓ!Zѥr~Ojxd0.cABCCGلK.q YFչݺu#+WiC$Aݹs믿(ڿ$ZnmS ֖5 3yd[[[> GQry{+tUV$AFlbѢE)zI`x+**z===mmm {R fXZ 2-66(B1jԨUV򲲲ѣGGGG:޾ɩܹse2YYY fQnݺEGGυ ŋ'Ndթ)4{l5/MBϓvW8#F^j( ">|P(JKKϝ;~a;`?~ܧO7fgg:c@=S $--yuķ~kccýD"ƍUP(FYSYYAM^zUYj@z]NQS^Mw֠eܹ3)-ZєFW_M0JiwlEV-ZpRʶmTۺuC}>=lwҥz 2d#4'ef̘QXXhx24ݯ 2O:ubP( SG Xٳg߻w/&&I,L:ڵkK,QuH$:yƍx l Dr̙M6ݻQFbCaaa7nRuVVVֺuFٺukD"H\]]ǎ{$r8ڴiC3g4m$L]}lEݸqc}qppDj sʕ+H͛5jǎwܡtO&kת$5 8?%M@k0k׮1?[8pv߿߮]P?c4Fpر/.]aEDDD\\299900ЍҫkD*UB3>l`:w\]PN=3l%$$PA][؇u~Gn-Z-,,$ׯ [Cݽ{7xc&LPU^.?LL"05QTb_~}ݺu.]zYVƎ;::ѣG gΜ}#>z_EQ2\ b׮](++kҤIϞ=zYf)~K%#g oAAA׮]7ի4>ю S?.YS&) oǎ5$+M;&05eXāy[4a_0̼2eʭ[(3fLVVL&UKEifVB1r`!!!s˓d)))Eݸqcǎ۷o;wnyyuTTTvvL&+))IJJ4hТE4/ZtsԩdLL@QTjj3}zLӁ0(̗|@eΜ9C*޽\.+**:wL7>et?E <[QSL!:ܸqoN#{DϳԬXBǎhqVJJ )QYYId2r7̗2E(JRSG ~σ)߿$ÙϤX[[GDD(a̗#G$,VxԜ9s|}}YGڵk J=IDDDH$:_*.\n߾}܀ yݻ7:x`֡Cچs޽/]\\HӧgϞ%S!0?d!:<kX_ $Ѷm[!777S4mڔVUU*y޽Iէs2\Pa\ $lllX9";˗$aooop4+Psȹw^x`(vvv$QQQ:ͱ(555z~_xjudkkKj>9¸ J6mH"??u1v4@?}S]]/))c+$qM=V#WWWcs2 2`(^^^$믿]xјHJaa!3zlߟ$ wJz b\˗/9tq0z{8r2,..@ @kÃ$-[걕PTJQTBB¥K֬YVZDFFC(ꭷ"8Oee-[Hڬ60 Q9a„[n7|ݻHbΝ_`Ajj[qss(JP5jժU999r,%%eѪ1bI̟?իjȑ>>>Eeggeee򬬬l@=%5u `b ,Ɂz'77f͚+WFi/b-lE&'++)9o*AMݹsgxx8w]H~%K(0//_~?bs+'Oܒ}MNNn޼9+_]Νo߾MT("|0-[Zk׮bf2uh`mm} ni„ W^3fۚ={{bbbbԩS]jP(777n,_O>zpvv}||;}T |0|z e80_4L7nX[[: S*//7u`0.l+V0u1eL2zM0CIENDB`flexmix/R/0000755000175100001440000000000013740572351012154 5ustar hornikusersflexmix/R/flexmix.R0000644000175100001440000005224413673623016013762 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: flexmix.R 5184 2020-06-20 18:27:29Z gruen $ # log_row_sums <- function(m) { M <- m[cbind(seq_len(nrow(m)), max.col(m, "first"))] M + log(rowSums(exp(m - M))) } ## The following two methods only fill in and rearrange the model argument setMethod("flexmix", signature(formula = "formula", model="missing"), function(formula, data=list(), k=NULL, cluster=NULL, model=NULL, concomitant=NULL, control=NULL, weights=NULL) { mycall = match.call() z <- flexmix(formula=formula, data=data, k=k, cluster=cluster, model=list(FLXMRglm()), concomitant=concomitant, control=control, weights = weights) z@call <- mycall z }) setMethod("flexmix", signature(formula = "formula", model="FLXM"), function(formula, data=list(), k=NULL, cluster=NULL, model=NULL, concomitant=NULL, control=NULL, weights=NULL) { mycall = match.call() z <- flexmix(formula=formula, data=data, k=k, cluster=cluster, model=list(model), concomitant=concomitant, control=control, weights=weights) z@call <- mycall z }) ## This is the real thing setMethod("flexmix", signature(formula = "formula", model="list"), function(formula, data=list(), k=NULL, cluster=NULL, model=NULL, concomitant=NULL, control=NULL, weights=NULL) { mycall = match.call() control = as(control, "FLXcontrol") if (!is(concomitant, "FLXP")) concomitant <- FLXPconstant() groups <- .FLXgetGrouping(formula, data) model <- lapply(model, FLXcheckComponent, k, cluster) k <- unique(unlist(sapply(model, FLXgetK, k))) if (length(k) > 1) stop("number of clusters not specified correctly") model <- lapply(model, FLXgetModelmatrix, data, formula) groups$groupfirst <- if (length(groups$group)) groupFirst(groups$group) else rep(TRUE, FLXgetObs(model[[1]])) if (is(weights, "formula")) { weights <- model.frame(weights, data = data, na.action = NULL)[,1] } ## check if the weights are integer ## if non-integer weights are wanted modifications e.g. ## for classify != weighted and ## plot,flexmix,missing-method are needed if (!is.null(weights) & !identical(weights, as.integer(weights))) stop("only integer weights allowed") ## if weights and grouping is specified the weights within each ## group need to be the same if (!is.null(weights) & length(groups$group)>0) { unequal <- tapply(weights, groups$group, function(x) length(unique(x)) > 1) if (any(unequal)) stop("identical weights within groups needed") } postunscaled <- initPosteriors(k, cluster, FLXgetObs(model[[1]]), groups) if (ncol(postunscaled) == 1L) concomitant <- FLXPconstant() concomitant <- FLXgetModelmatrix(concomitant, data = data, groups = groups) z <- FLXfit(model=model, concomitant=concomitant, control=control, postunscaled=postunscaled, groups=groups, weights = weights) z@formula = formula z@call = mycall z@k0 = as.integer(k) z }) ###********************************************************** setMethod("FLXgetK", signature(model = "FLXM"), function(model, k, ...) k) setMethod("FLXgetObs", signature(model = "FLXM"), function(model) nrow(model@x)) setMethod("FLXcheckComponent", signature(model = "FLXM"), function(model, ...) model) setMethod("FLXremoveComponent", signature(model = "FLXM"), function(model, ...) model) setMethod("FLXmstep", signature(model = "FLXM"), function(model, weights, components, ...) { if ("component" %in% names(formals(model@fit))) sapply(seq_len(ncol(weights)), function(k) model@fit(model@x, model@y, weights[,k], component = components[[k]]@parameters)) else sapply(seq_len(ncol(weights)), function(k) model@fit(model@x, model@y, weights[,k])) }) setMethod("FLXdeterminePostunscaled", signature(model = "FLXM"), function(model, components, ...) { matrix(sapply(components, function(x) x@logLik(model@x, model@y)), nrow = nrow(model@y)) }) ###********************************************************** setMethod("FLXfit", signature(model="list"), function(model, concomitant, control, postunscaled=NULL, groups, weights) { ### initialize k <- ncol(postunscaled) N <- nrow(postunscaled) control <- allweighted(model, control, weights) if(control@verbose>0) cat("Classification:", control@classify, "\n") if (control@classify %in% c("SEM", "random")) iter.rm <- 0 group <- groups$group groupfirst <- groups$groupfirst if(length(group)>0) postunscaled <- groupPosteriors(postunscaled, group) logpostunscaled <- log(postunscaled) postscaled <- exp(logpostunscaled - log_row_sums(logpostunscaled)) llh <- -Inf if (control@classify %in% c("SEM", "random")) llh.max <- -Inf converged <- FALSE components <- rep(list(rep(list(new("FLXcomponent")), k)), length(model)) ### EM for(iter in seq_len(control@iter.max)) { ### M-Step postscaled = .FLXgetOK(postscaled, control, weights) prior <- if (is.null(weights)) ungroupPriors(concomitant@fit(concomitant@x, postscaled[groupfirst,,drop=FALSE]), group, groupfirst) else ungroupPriors(concomitant@fit(concomitant@x, (postscaled/weights)[groupfirst & weights > 0,,drop=FALSE], weights[groupfirst & weights > 0]), group, groupfirst) # Check min.prior nok <- if (nrow(prior) == 1) which(prior < control@minprior) else { if (is.null(weights)) which(colMeans(prior[groupfirst,,drop=FALSE]) < control@minprior) else which(colSums(prior[groupfirst,] * weights[groupfirst])/sum(weights[groupfirst]) < control@minprior) } if(length(nok)) { if(control@verbose>0) cat("*** Removing", length(nok), "component(s) ***\n") prior <- prior[,-nok,drop=FALSE] prior <- prior/rowSums(prior) postscaled <- postscaled[,-nok,drop=FALSE] postscaled[rowSums(postscaled) == 0,] <- if (nrow(prior) > 1) prior[rowSums(postscaled) == 0,] else prior[rep(1, sum(rowSums(postscaled) == 0)),] postscaled <- postscaled/rowSums(postscaled) if (!is.null(weights)) postscaled <- postscaled * weights k <- ncol(prior) if (k == 0) stop("all components removed") if (control@classify=="random") { llh.max <- -Inf iter.rm <- iter } model <- lapply(model, FLXremoveComponent, nok) components <- lapply(components, "[", -nok) } components <- lapply(seq_along(model), function(i) FLXmstep(model[[i]], postscaled, components[[i]])) postunscaled <- matrix(0, nrow = N, ncol = k) for (n in seq_along(model)) postunscaled <- postunscaled + FLXdeterminePostunscaled(model[[n]], components[[n]]) if(length(group)>0) postunscaled <- groupPosteriors(postunscaled, group) ### E-Step ## Code changed thanks to Nicolas Picard ## to avoid problems with small likelihoods postunscaled <- if (nrow(prior) > 1) postunscaled + log(prior) else sweep(postunscaled, 2, log(prior), "+") logpostunscaled <- postunscaled postunscaled <- exp(postunscaled) postscaled <- exp(logpostunscaled - log_row_sums(logpostunscaled)) ##: wenn eine beobachtung in allen Komonenten extrem ## kleine postunscaled-werte hat, ist exp(-postunscaled) ## numerisch Null, und damit postscaled NaN ## log(rowSums(postunscaled)) ist -Inf ## if (any(is.nan(postscaled))) { index <- which(as.logical(rowSums(is.nan(postscaled)))) postscaled[index,] <- if(nrow(prior)==1) rep(prior, each = length(index)) else prior[index,] postunscaled[index,] <- .Machine$double.xmin } ### check convergence llh.old <- llh llh <- if (is.null(weights)) sum(log_row_sums(logpostunscaled[groupfirst,,drop=FALSE])) else sum(log_row_sums(logpostunscaled[groupfirst,,drop=FALSE])*weights[groupfirst]) if(is.na(llh) | is.infinite(llh)) stop(paste(formatC(iter, width=4), "Log-likelihood:", llh)) if (abs(llh-llh.old)/(abs(llh)+0.1) < control@tolerance){ if(control@verbose>0){ printIter(iter, llh) cat("converged\n") } converged <- TRUE break } if (control@classify=="random") { if (llh.max < llh) { components.max <- components prior.max <- prior postscaled.max <- postscaled postunscaled.max <- postunscaled llh.max <- llh } } if(control@verbose && (iter%%control@verbose==0)) printIter(iter, llh) } ### Construct return object if (control@classify=="random") { components <- components.max prior <- prior.max postscaled <- postscaled.max postunscaled <- postunscaled.max llh <- llh.max iter <- control@iter.max - iter.rm } components <- lapply(seq_len(k), function(i) lapply(components, function(x) x[[i]])) names(components) <- paste("Comp", seq_len(k), sep=".") cluster <- max.col(postscaled) size <- if (is.null(weights)) tabulate(cluster, nbins=k) else tabulate(rep(cluster, weights), nbins=k) names(size) <- seq_len(k) concomitant <- FLXfillConcomitant(concomitant, postscaled[groupfirst,,drop=FALSE], weights[groupfirst]) df <- concomitant@df(concomitant@x, k) + sum(sapply(components, sapply, slot, "df")) control@nrep <- 1 prior <- if (is.null(weights)) colMeans(postscaled[groupfirst,,drop=FALSE]) else colSums(postscaled[groupfirst,,drop=FALSE] * weights[groupfirst])/sum(weights[groupfirst]) retval <- new("flexmix", model=model, prior=prior, posterior=list(scaled=postscaled, unscaled=postunscaled), weights = weights, iter=iter, cluster=cluster, size = size, logLik=llh, components=components, concomitant=concomitant, control=control, df=df, group=group, k=as(k, "integer"), converged=converged) retval }) ###********************************************************** .FLXgetOK = function(p, control, weights){ n = ncol(p) N = seq_len(n) if (is.null(weights)) { if (control@classify == "weighted") return(p) else { z = matrix(FALSE, nrow = nrow(p), ncol = n) if(control@classify %in% c("CEM", "hard")) m = max.col(p) else if(control@classify %in% c("SEM", "random")) m = apply(p, 1, function(x) sample(N, size = 1, prob = x)) else stop("Unknown classification method") z[cbind(seq_len(nrow(p)), m)] = TRUE } }else { if(control@classify=="weighted") z <- p * weights else{ z = matrix(FALSE, nrow=nrow(p), ncol=n) if(control@classify %in% c("CEM", "hard")) { m = max.col(p) z[cbind(seq_len(nrow(p)), m)] = TRUE z <- z * weights } else if(control@classify %in% c("SEM", "random")) z = t(sapply(seq_len(nrow(p)), function(i) table(factor(sample(N, size=weights[i], prob=p[i,], replace=TRUE), N)))) else stop("Unknown classification method") } } z } ###********************************************************** RemoveGrouping <- function(formula) { lf <- length(formula) formula1 <- formula if(length(formula[[lf]])>1) { if (deparse(formula[[lf]][[1]]) == "|"){ formula1[[lf]] <- formula[[lf]][[2]] } else if (deparse(formula[[lf]][[1]]) == "("){ form <- formula[[lf]][[2]] if (length(form) == 3 && form[[1]] == "|") formula1[[lf]] <- form[[2]] } } formula1 } .FLXgetGroupingVar <- function(x) { lf <- length(x) while (lf > 1) { x <- x[[lf]] lf <- length(x) } x } .FLXgetGrouping <- function(formula, data) { group <- factor(integer(0)) formula1 <- RemoveGrouping(formula) if (!identical(formula1, formula)) group <- factor(eval(.FLXgetGroupingVar(formula), data)) return(list(group=group, formula=formula1)) } setMethod("FLXgetModelmatrix", signature(model="FLXM"), function(model, data, formula, lhs=TRUE, ...) { formula <- RemoveGrouping(formula) if (length(grep("\\|", deparse(model@formula)))) stop("no grouping variable allowed in the model") if(is.null(model@formula)) model@formula = formula ## model@fullformula = update.formula(formula, model@formula) ## : ist das der richtige weg, wenn ein punkt in beiden ## formeln ist? model@fullformula = update(terms(formula, data=data), model@formula) ## if (lhs) { mf <- if (is.null(model@terms)) model.frame(model@fullformula, data=data, na.action = NULL) else model.frame(model@terms, data=data, na.action = NULL, xlev = model@xlevels) model@terms <- attr(mf, "terms") response <- as.matrix(model.response(mf)) model@y <- model@preproc.y(response) } else { mt1 <- if (is.null(model@terms)) terms(model@fullformula, data=data) else model@terms mf <- model.frame(delete.response(mt1), data=data, na.action = NULL, xlev = model@xlevels) model@terms<- attr(mf, "terms") ## : warum war das da??? ## attr(mt, "intercept") <- attr(mt1, "intercept") ## } X <- model.matrix(model@terms, data=mf) model@contrasts <- attr(X, "contrasts") model@x <- model@preproc.x(X) model@xlevels <- .getXlevels(model@terms, mf) model }) ## groupfirst: for grouped observation we need to be able to use ## the posterior of each group, but for computational simplicity ## post(un)scaled has N rows (with mutiple identical rows for each ## group). postscaled[groupfirst,] extracts posteriors of each ## group ordered as the appear in the data set. groupFirst <- function(x) !duplicated(x) ## if we have a group variable, set the posterior to the product ## of all density values for that group (=sum in logarithm) groupPosteriors <- function(x, group) { if (length(group) > 0) { group <- as.integer(group) x.by.group <- matrix(unname(apply(x, 2, tapply, group, sum)), ncol = ncol(x)) x <- x.by.group[group,, drop = FALSE] } x } ungroupPriors <- function(x, group, groupfirst) { if (!length(group)) group <- seq_along(groupfirst) if (nrow(x) >= length(group[groupfirst])) { x <- x[order(as.integer(group[groupfirst])),,drop=FALSE] x <- x[as.integer(group),,drop=FALSE] } x } setMethod("allweighted", signature(model = "list", control = "ANY", weights = "ANY"), function(model, control, weights) { allweighted <- all(sapply(model, function(x) allweighted(x, control, weights))) if(allweighted){ if(control@classify=="auto") control@classify <- "weighted" } else{ if(control@classify=="auto") control@classify <- "hard" else if (control@classify=="weighted") { warning("only hard classification supported for the modeldrivers") control@classify <- "hard" } if(!is.null(weights)) stop("it is not possible to specify weights for models without weighted ML estimation") } control }) setMethod("allweighted", signature(model = "FLXM", control = "ANY", weights = "ANY"), function(model, control, weights) { model@weighted }) initPosteriors <- function(k, cluster, N, groups) { if(is(cluster, "matrix")){ postunscaled <- cluster if (!is.null(k)) if (k != ncol(postunscaled)) stop("specified k does not match the number of columns of cluster") } else{ if(is.null(cluster)){ if(is.null(k)) stop("either k or cluster must be specified") else cluster <- ungroupPriors(as.matrix(sample(seq_len(k), size = sum(groups$groupfirst), replace=TRUE)), groups$group, groups$groupfirst) } else{ cluster <- as(cluster, "integer") if (!is.null(k)) if (k != max(cluster)) stop("specified k does not match the values in cluster") k <- max(cluster) } postunscaled <- matrix(0.1, nrow=N, ncol=k) for(K in seq_len(k)){ postunscaled[cluster==K, K] <- 0.9 } } postunscaled } ###********************************************************** setMethod("predict", signature(object="FLXdist"), function(object, newdata=list(), aggregate=FALSE, ...){ if (missing(newdata)) return(fitted(object, aggregate=aggregate, drop=FALSE)) x = list() for(m in seq_along(object@model)) { comp <- lapply(object@components, "[[", m) x[[m]] <- predict(object@model[[m]], newdata, comp, ...) } if (aggregate) { prior_weights <- prior(object, newdata) z <- lapply(x, function(z) matrix(rowSums(do.call("cbind", z) * prior_weights), nrow = nrow(z[[1]]))) } else { z <- list() for (k in seq_len(object@k)) { z[[k]] <- do.call("cbind", lapply(x, "[[", k)) } names(z) <- paste("Comp", seq_len(object@k), sep=".") } z }) ###********************************************************** setMethod("parameters", signature(object="FLXdist"), function(object, component=NULL, model=NULL, which = c("model", "concomitant"), simplify=TRUE, drop=TRUE) { which <- match.arg(which) if (is.null(component)) component <- seq_len(object@k) if (is.null(model)) model <- seq_along(object@model) if (which == "model") { if (simplify) { parameters <- sapply(model, function(m) sapply(object@components[component], function(x) unlist(x[[m]]@parameters), simplify=TRUE), simplify = FALSE) } else { parameters <- sapply(model, function(m) sapply(object@components[component], function(x) x[[m]]@parameters, simplify=FALSE), simplify = FALSE) } if (drop) { if (length(component) == 1 && !simplify) parameters <- lapply(parameters, "[[", 1) if (length(model) == 1) parameters <- parameters[[1]] } } else { parameters <- object@concomitant@coef[,component,drop=FALSE] } parameters }) setMethod("prior", signature(object="FLXdist"), function(object, newdata, ...) { if (missing(newdata)) prior <- object@prior else { groups <- .FLXgetGrouping(object@formula, newdata) nobs <- if (is(newdata, "data.frame")) nrow(newdata) else min(sapply(newdata, function(x) { if (is.null(nrow(x))) length(x) else nrow(x) })) group <- if (length(groups$group)) groups$group else factor(seq_len(nobs)) object@concomitant <- FLXgetModelmatrix(object@concomitant, data = newdata, groups = list(group=group, groupfirst = groupFirst(group))) prior <- determinePrior(object@prior, object@concomitant, group)[as.integer(group),] } prior }) setMethod("posterior", signature(object="flexmix", newdata="missing"), function(object, newdata, unscaled = FALSE, ...) { if (unscaled) return(object@posterior$unscaled) else return(object@posterior$scaled) }) setMethod("posterior", signature(object="FLXdist", newdata="listOrdata.frame"), function(object, newdata, unscaled=FALSE,...) { comp <- lapply(object@components, "[[", 1) postunscaled <- posterior(object@model[[1]], newdata, comp, ...) for (m in seq_along(object@model)[-1]) { comp <- lapply(object@components, "[[", m) postunscaled <- postunscaled + posterior(object@model[[m]], newdata, comp, ...) } groups <- .FLXgetGrouping(object@formula, newdata) prior <- prior(object, newdata = newdata) if(length(groups$group)>0) postunscaled <- groupPosteriors(postunscaled, groups$group) postunscaled <- postunscaled + log(prior) if (unscaled) return(exp(postunscaled)) else return(exp(postunscaled - log_row_sums(postunscaled))) }) setMethod("posterior", signature(object="FLXM", newdata="listOrdata.frame"), function(object, newdata, components, ...) { object <- FLXgetModelmatrix(object, newdata, object@fullformula, lhs = TRUE) FLXdeterminePostunscaled(object, components, ...) }) setMethod("clusters", signature(object="flexmix", newdata="missing"), function(object, newdata, ...) { object@cluster }) setMethod("clusters", signature(object="FLXdist", newdata="ANY"), function(object, newdata, ...) { max.col(posterior(object, newdata, ...)) }) ###********************************************************** setMethod("summary", "flexmix", function(object, eps=1e-4, ...){ z <- new("summary.flexmix", call = object@call, AIC = AIC(object), BIC = BIC(object), logLik = logLik(object)) TAB <- data.frame(prior=object@prior, size=object@size) rownames(TAB) <- paste("Comp.", seq_len(nrow(TAB)), sep="") TAB[["post>0"]] <- if (is.null(object@weights)) colSums(object@posterior$scaled > eps) else colSums((object@posterior$scaled > eps) * object@weights) TAB[["ratio"]] <- TAB[["size"]]/TAB[["post>0"]] z@comptab = TAB z }) ###********************************************************** flexmix/R/flxmcsparse.R0000644000175100001440000000225213677562014014633 0ustar hornikuserssetClass("FLXMCsparse", contains = "FLXM") as.data.frame.simple_triplet_matrix <- function(x, ...) { as.data.frame.model.matrix(x, ...) } setMethod("FLXgetModelmatrix", signature(model = "FLXMCsparse"), function(model, data, formula, lhs=TRUE, ...) { formula <- RemoveGrouping(formula) if (length(grep("\\|", deparse(model@formula)))) stop("no grouping variable allowed in the model") if(is.null(model@formula)) model@formula <- formula model@fullformula <- update(terms(formula, data = data), model@formula) fullformula <- terms(model@fullformula, data = data) model@terms <- attr(fullformula, "terms") if (lhs) { env <- environment(fullformula) vars <- attr(fullformula, "variables") varnames <- vapply(vars, function(x) paste(deparse(x, backtick = FALSE), collapse = " "), " ")[-1L] variables <- eval(vars, data, env) resp <- attr(fullformula, "response") response <- variables[[resp]] model@y <- model@preproc.y(response) model@x <- matrix(nrow = nrow(model@y), ncol = 0) } else { model@x <- matrix(nrow = nrow(as.data.frame(data)), ncol = 0) } model }) flexmix/R/ziglm.R0000644000175100001440000000405312653423105013415 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: ziglm.R 5079 2016-01-31 12:21:12Z gruen $ # setClass("FLXMRziglm", contains = "FLXMRglm") FLXMRziglm <- function(formula = . ~ ., family = c("binomial", "poisson"), ...) { family <- match.arg(family) new("FLXMRziglm", FLXMRglm(formula, family, ...), name = paste("FLXMRziglm", family, sep=":")) } setMethod("FLXgetModelmatrix", signature(model="FLXMRziglm"), function(model, data, formula, lhs=TRUE, ...) { model <- callNextMethod(model, data, formula, lhs) if (attr(terms(model@fullformula), "intercept") == 0) stop("please include an intercept") model }) setMethod("FLXremoveComponent", signature(model = "FLXMRziglm"), function(model, nok, ...) if (1 %in% nok) as(model, "FLXMRglm") else model) setMethod("FLXmstep", signature(model = "FLXMRziglm"), function(model, weights, components, ...) { coef <- c(-Inf, rep(0, ncol(model@x)-1)) names(coef) <- colnames(model@x) comp.1 <- model@defineComponent( list(coef = coef, df = 0, offset = NULL, family = model@family)) c(list(comp.1), FLXmstep(as(model, "FLXMRglm"), weights[, -1, drop=FALSE], components[-1])) }) setMethod("FLXgetDesign", signature(object = "FLXMRziglm"), function(object, components) rbind(0, FLXgetDesign(as(object, "FLXMRglm"), components[-1]))) setMethod("FLXreplaceParameters", signature(object="FLXMRziglm"), function(object, components, parms) c(components[[1]], FLXreplaceParameters(as(object, "FLXMRglm"), components[-1], parms))) setMethod("FLXgradlogLikfun", signature(object="FLXMRziglm"), function(object, components, weights, ...) FLXgradlogLikfun(as(object, "FLXMRglm"), components[-1], weights[,-1,drop=FALSE])) setMethod("refit_optim", signature(object = "FLXMRziglm"), function(object, components, ...) { x <- refit_optim(as(object, "FLXMRglm"), components[-1], ...) names(x) <- paste("Comp", 1 + seq_along(x), sep = ".") x }) flexmix/R/z.R0000644000175100001440000000063112653423105012542 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: z.R 5079 2016-01-31 12:21:12Z gruen $ # ###********************************************************** ## Backward compatibility ## component model driver FLXglm <- FLXMRglm FLXglmFix <- FLXMRglmfix FLXmclust <- FLXMCmvnorm FLXbclust <- FLXMCmvbinary ## concomitant model driver FLXmultinom <- FLXPmultinom FLXconstant <- FLXPconstant flexmix/R/models.R0000644000175100001440000002641212653423105013561 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: models.R 5079 2016-01-31 12:21:12Z gruen $ # FLXMRglm <- function(formula=.~., family=c("gaussian", "binomial", "poisson", "Gamma"), offset=NULL) { family <- match.arg(family) glmrefit <- function(x, y, w) { fit <- c(glm.fit(x, y, weights=w, offset=offset, family=get(family, mode="function")()), list(call = sys.call(), offset = offset, control = eval(formals(glm.fit)$control), method = "weighted.glm.fit")) fit$df.null <- sum(w) + fit$df.null - fit$df.residual - fit$rank fit$df.residual <- sum(w) - fit$rank fit$x <- x fit } z <- new("FLXMRglm", weighted=TRUE, formula=formula, name=paste("FLXMRglm", family, sep=":"), offset = offset, family=family, refit=glmrefit) z@preproc.y <- function(x){ if (ncol(x) > 1) stop(paste("for the", family, "family y must be univariate")) x } if(family=="gaussian"){ z@defineComponent <- function(para) { predict <- function(x, ...) { dotarg = list(...) if("offset" %in% names(dotarg)) offset <- dotarg$offset p <- x %*% para$coef if (!is.null(offset)) p <- p + offset p } logLik <- function(x, y, ...) dnorm(y, mean=predict(x, ...), sd=para$sigma, log=TRUE) new("FLXcomponent", parameters=list(coef=para$coef, sigma=para$sigma), logLik=logLik, predict=predict, df=para$df) } z@fit <- function(x, y, w, component){ fit <- lm.wfit(x, y, w=w, offset=offset) z@defineComponent(para = list(coef = coef(fit), df = ncol(x)+1, sigma = sqrt(sum(fit$weights * fit$residuals^2 / mean(fit$weights))/ (nrow(x)-fit$rank)))) } } else if(family=="binomial"){ z@preproc.y <- function(x){ if (ncol(x) != 2) stop("for the binomial family, y must be a 2 column matrix\n", "where col 1 is no. successes and col 2 is no. failures") if (any(x < 0)) stop("negative values are not allowed for the binomial family") x } z@defineComponent <- function(para) { predict <- function(x, ...) { dotarg = list(...) if("offset" %in% names(dotarg)) offset <- dotarg$offset p <- x %*% para$coef if (!is.null(offset)) p <- p + offset get(family, mode = "function")()$linkinv(p) } logLik <- function(x, y, ...) dbinom(y[,1], size=rowSums(y), prob=predict(x, ...), log=TRUE) new("FLXcomponent", parameters=list(coef=para$coef), logLik=logLik, predict=predict, df=para$df) } z@fit <- function(x, y, w, component){ fit <- glm.fit(x, y, weights=w, family=binomial(), offset=offset, start=component$coef) z@defineComponent(para = list(coef = coef(fit), df = ncol(x))) } } else if(family=="poisson"){ z@defineComponent <- function(para) { predict <- function(x, ...) { dotarg = list(...) if("offset" %in% names(dotarg)) offset <- dotarg$offset p <- x %*% para$coef if (!is.null(offset)) p <- p + offset get(family, mode = "function")()$linkinv(p) } logLik <- function(x, y, ...) dpois(y, lambda=predict(x, ...), log=TRUE) new("FLXcomponent", parameters=list(coef=para$coef), logLik=logLik, predict=predict, df=para$df) } z@fit <- function(x, y, w, component){ fit <- glm.fit(x, y, weights=w, family=poisson(), offset=offset, start=component$coef) z@defineComponent(para = list(coef = coef(fit), df = ncol(x))) } } else if(family=="Gamma"){ z@defineComponent <- function(para) { predict <- function(x, ...) { dotarg = list(...) if("offset" %in% names(dotarg)) offset <- dotarg$offset p <- x %*% para$coef if (!is.null(offset)) p <- p + offset get(family, mode = "function")()$linkinv(p) } logLik <- function(x, y, ...) dgamma(y, shape = para$shape, scale=predict(x, ...)/para$shape, log=TRUE) new("FLXcomponent", parameters = list(coef = para$coef, shape = para$shape), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, component){ fit <- glm.fit(x, y, weights=w, family=Gamma(), offset=offset, start=component$coef) z@defineComponent(para = list(coef = coef(fit), df = ncol(x)+1, shape = sum(fit$prior.weights)/fit$deviance)) } } else stop(paste("Unknown family", family)) z } ###********************************************************** FLXMCmvnorm <- function(formula=.~., diagonal=TRUE) { z <- new("FLXMC", weighted=TRUE, formula=formula, dist = "mvnorm", name="model-based Gaussian clustering") z@defineComponent <- function(para) { logLik <- function(x, y) mvtnorm::dmvnorm(y, mean=para$center, sigma=para$cov, log=TRUE) predict <- function(x, ...) matrix(para$center, nrow=nrow(x), ncol=length(para$center), byrow=TRUE) new("FLXcomponent", parameters=list(center = para$center, cov = para$cov), df=para$df, logLik=logLik, predict=predict) } z@fit <- function(x, y, w, ...){ para <- cov.wt(y, wt=w)[c("center","cov")] para$df <- (3*ncol(y) + ncol(y)^2)/2 if(diagonal){ para$cov <- diag(diag(para$cov)) para$df <- 2*ncol(y) } z@defineComponent(para) } z } FLXMCnorm1 <- function(formula=.~.) { z <- new("FLXMC", weighted=TRUE, formula=formula, dist = "mvnorm", name="model-based univariate Gaussian clustering") z@defineComponent <- function(para) { logLik <- function(x, y) dnorm(y, mean=para$center, sd=sqrt(para$cov), log=TRUE) predict <- function(x, ...) matrix(para$center, nrow=nrow(x), ncol=1, byrow=TRUE) new("FLXcomponent", parameters=list(mean = as.vector(para$center), sd = as.vector(sqrt(para$cov))), df=para$df, logLik=logLik, predict=predict) } z@fit <- function(x, y, w, ...){ para <- cov.wt(as.matrix(y), wt=w)[c("center","cov")] z@defineComponent(c(para, list(df = 2))) } z } ###********************************************************** FLXMCmvbinary <- function(formula=.~., truncated = FALSE) { if (truncated) return(MCmvbinary_truncated(formula)) else return(MCmvbinary(formula)) } MCmvbinary <- function(formula=.~.) { z <- new("FLXMC", weighted=TRUE, formula=formula, dist = "mvbinary", name="model-based binary clustering") ## make sure that y is binary z@preproc.y <- function(x){ storage.mode(x) <- "logical" storage.mode(x) <- "integer" x } z@defineComponent <- function(para) { predict <- function(x, ...){ matrix(para$center, nrow=nrow(x), ncol=length(para$center), byrow=TRUE) } logLik <- function(x, y){ p <- matrix(para$center, nrow=nrow(x), ncol=length(para$center), byrow=TRUE) rowSums(log(y*p+(1-y)*(1-p))) } new("FLXcomponent", parameters=list(center=para$center), df=para$df, logLik=logLik, predict=predict) } z@fit <- function(x, y, w, ...) z@defineComponent(list(center = colSums(w*y)/sum(w), df = ncol(y))) z } ###********************************************************** binary_truncated <- function(y, w, maxit = 200, epsilon = .Machine$double.eps) { r_k <- colSums(y*w)/sum(w) r_0 <- 0 llh.old <- -Inf for (i in seq_len(maxit)) { p <- r_k/(1+r_0) llh <- sum((r_k*log(p))[r_k > 0])+ sum(((1 - r_k + r_0) * log(1-p))[(1-r_k+r_0) > 0]) if (abs(llh - llh.old)/(abs(llh) + 0.1) < epsilon) break llh.old <- llh prod_p <- prod(1-p) r_0 <- prod_p/(1-prod_p) } p } MCmvbinary_truncated <- function(formula=.~.) { z <- MCmvbinary(formula=formula) z@defineComponent <- function(para) { predict <- function(x, ...) { matrix(para$center, nrow = nrow(x), ncol = length(para$center), byrow = TRUE) } logLik <- function(x, y) { p <- matrix(para$center, nrow = nrow(x), ncol = length(para$center), byrow = TRUE) rowSums(log(y * p + (1 - y) * (1 - p))) - log(1 - prod(1-para$center)) } new("FLXcomponent", parameters = list(center = para$center), df = para$df, logLik = logLik, predict = predict) } z@fit <- function(x, y, w, ...){ z@defineComponent(list(center = binary_truncated(y, w), df = ncol(y))) } z } ###********************************************************** setClass("FLXMCmvcombi", representation(binary = "vector"), contains = "FLXMC") FLXMCmvcombi <- function(formula=.~.) { z <- new("FLXMCmvcombi", weighted=TRUE, formula=formula, dist = "mvcombi", name="model-based binary-Gaussian clustering") z@defineComponent <- function(para) { predict <- function(x, ...){ matrix(para$center, nrow=nrow(x), ncol=length(para$center), byrow=TRUE) } logLik <- function(x, y){ if(any(para$binary)){ p <- matrix(para$center[para$binary], nrow=nrow(x), ncol=sum(para$binary), byrow=TRUE) z <- rowSums(log(y[,para$binary,drop=FALSE]*p + (1-y[,para$binary,drop=FALSE])*(1-p))) } else z <- rep(0, nrow(x)) if(!all(para$binary)){ if(sum(!para$binary)==1) z <- z + dnorm(y[,!para$binary], mean=para$center[!para$binary], sd=sqrt(para$var), log=TRUE) else z <- z + mvtnorm::dmvnorm(y[,!para$binary,drop=FALSE], mean=para$center[!para$binary], sigma=diag(para$var), log=TRUE) } z } new("FLXcomponent", parameters=list(center=para$center, var=para$var), df=para$df, logLik=logLik, predict=predict) } z@fit <- function(x, y, w, binary, ...){ para <- cov.wt(y, wt=w)[c("center","cov")] para <- list(center = para$center, var = diag(para$cov)[!binary], df = ncol(y) + sum(!binary), binary = binary) z@defineComponent(para) } z } setMethod("FLXgetModelmatrix", signature(model="FLXMCmvcombi"), function(model, data, formula, lhs=TRUE, ...) { model <- callNextMethod(model, data, formula, lhs) model@binary <- apply(model@y, 2, function(z) all(unique(z) %in% c(0,1))) model }) setMethod("FLXmstep", signature(model = "FLXMCmvcombi"), function(model, weights, components) { return(sapply(seq_len(ncol(weights)), function(k) model@fit(model@x, model@y, weights[,k], model@binary))) }) flexmix/R/glmFix.R0000644000175100001440000001622613430515054013525 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: glmFix.R 5156 2019-02-12 08:11:16Z gruen $ # FLXMRglmfix <- function(formula=.~., fixed=~0, varFix = FALSE, nested = NULL, family=c("gaussian", "binomial", "poisson", "Gamma"), offset=NULL) { family <- match.arg(family) nested <- as(nested, "FLXnested") if (length(fixed) == 3) stop("no left hand side allowed for fixed") z <- new("FLXMRglmfix", FLXMRglm(formula, family, offset), fixed=fixed, name=paste("FLXMRglmfix", family, sep=":"), nestedformula=nested, variance = varFix) if(family=="gaussian"){ z@fit <- function(x, y, w, incidence, variance, ...){ fit <- lm.wfit(x, y, w=w, offset=offset) k <- nrow(incidence) n <- nrow(x)/k sigma <- vector(length=k) cumVar <- cumsum(c(0, variance)) for (i in seq_along(variance)) { ind <- cumVar[i]*n + seq_len(n*variance[i]) sigma[cumVar[i] + seq_len(variance[i])] <- sqrt(sum(fit$weights[ind] * fit$residuals[ind]^2 / mean(fit$weights[ind]))/ (length(ind) - sum(incidence[i,]))) } fit <- fit[c("coefficients")] coefs <- coef(fit) names(coefs) <- colnames(incidence) df <- rowSums(incidence/rep(colSums(incidence), each = nrow(incidence))) + rep(1/variance, variance) lapply(seq_len(k), function(K) z@defineComponent( list(coef = coefs[as.logical(incidence[K, ])], sigma = sigma[K], df = df[K]))) } } else if(family=="binomial"){ z@fit <- function(x, y, w, incidence, ...){ fit <- glm.fit(x, y, weights=w, family=binomial(), offset=offset) fit <- fit[c("coefficients","family")] k <- nrow(incidence) coefs <- coef(fit) names(coefs) <- colnames(incidence) df <- rowSums(incidence/rep(colSums(incidence), each = nrow(incidence))) lapply(seq_len(k), function(K) z@defineComponent( list(coef = coefs[as.logical(incidence[K, ])], df = df[K]))) } } else if(family=="poisson"){ z@fit <- function(x, y, w, incidence, ...){ fit <- glm.fit(x, y, weights=w, family=poisson(), offset=offset) fit <- fit[c("coefficients","family")] k <- nrow(incidence) coefs <- coef(fit) names(coefs) <- colnames(incidence) df <- rowSums(incidence/rep(colSums(incidence), each = nrow(incidence))) lapply(seq_len(k), function(K) z@defineComponent( list(coef = coefs[as.logical(incidence[K, ])], df = df[K]))) } } else if(family=="Gamma"){ z@fit <- function(x, y, w, incidence, ...){ fit <- glm.fit(x, y, weights=w, family=Gamma(), offset=offset) shape <- sum(fit$prior.weights)/fit$deviance fit <- fit[c("coefficients","family")] k <- nrow(incidence) coefs <- coef(fit) names(coefs) <- colnames(incidence) df <- rowSums(incidence/rep(colSums(incidence), each = nrow(incidence))) lapply(seq_len(k), function(K) z@defineComponent( list(coef = coefs[as.logical(incidence[K, ])], df = df[K], shape = shape))) } } else stop(paste("Unknown family", family)) z } ###********************************************************** setMethod("refit_mstep", signature(object="FLXMRglmfix", newdata="missing"), function(object, newdata, weights, ...) { warning("Separate regression models are fitted using posterior weights.") lapply(seq_len(ncol(weights)), function(k) { x <- object@x[object@segment[, k], as.logical(object@design[k,]), drop = FALSE] colnames(x) <- colnames(object@design)[as.logical(object@design[k,])] y <- object@y[object@segment[, k],, drop = FALSE] fit <- object@refit(x, y, weights[,k], ...) fit <- c(fit, list(formula = object@fullformula, terms = object@terms, contrasts = object@contrasts, xlevels = object@xlevels)) class(fit) <- c("glm", "lm") fit }) }) ###********************************************************** setMethod("fitted", signature(object="FLXMRglmfix"), function(object, components, ...) { N <- nrow(object@x)/length(components) z <- list() for(n in seq_along(components)){ x <- object@x[(n-1)*N + seq_len(N), as.logical(object@design[n,]), drop=FALSE] z[[n]] <- list(components[[n]]@predict(x)) } z }) ###********************************************************** setMethod("predict", signature(object="FLXMRglmfix"), function(object, newdata, components, ...) { model <- FLXgetModelmatrix(object, newdata, object@fullformula, lhs=FALSE) k <- sum(object@nestedformula@k) N <- nrow(model@x)/k z <- list() for (m in seq_len(k)) { z[[m]] <- components[[m]]@predict(model@x[model@segment[,m], as.logical(model@design[m,]), drop=FALSE], ...) } z }) ###********************************************************** setMethod("FLXgetModelmatrix", signature(model="FLXMRfix"), function(model, data, formula, lhs=TRUE, ...) { formula <- RemoveGrouping(formula) if (length(grep("\\|", deparse(model@formula)))) stop("no grouping variable allowed in the model") if(is.null(model@formula)) model@formula <- formula model@fullformula <- update.formula(formula, model@formula) k <- model@nestedformula mm.all <- modelMatrix(model@fullformula, model@fixed, k@formula, data, lhs, model@xlevels) model@design <- modelDesign(mm.all, k) desNested <- if (sum(sapply(mm.all$nested, ncol))) { rbind(ncol(mm.all$fixed) + seq_len(sum(sapply(mm.all$nested, ncol))), unlist(lapply(seq_along(mm.all$nested), function(i) rep(i, ncol(mm.all$nested[[i]]))))) }else matrix(ncol=0, nrow=2) model@x <- cbind(kronecker(rep(1, sum(k@k)), mm.all$fixed), do.call("cbind", lapply(unique(desNested[2,]), function(i) { kronecker(model@design[,desNested[1, desNested[2, ] == i][1]], mm.all$nested[[i]])})), kronecker(diag(sum(k@k)), mm.all$random)) N <- nrow(model@x)/sum(k@k) model@segment <- matrix(FALSE, ncol = sum(k@k), nrow = nrow(model@x)) for (m in seq_len(sum(k@k))) model@segment[(m - 1) * N + seq_len(N), m] <- TRUE if (lhs) { y <- mm.all$response rownames(y) <- NULL response <- as.matrix(apply(y, 2, rep, sum(k@k))) model@y <- model@preproc.y(response) } model@x <- model@preproc.x(model@x) model@xlevels <- mm.all$xlevels model }) flexmix/R/allGenerics.R0000644000175100001440000000621012653423105014520 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: allGenerics.R 5079 2016-01-31 12:21:12Z gruen $ # setGeneric("flexmix", function(formula, data=list(), k=NULL, cluster=NULL, model=NULL, concomitant=NULL, control=NULL, weights = NULL) standardGeneric("flexmix")) setGeneric("FLXfit", function(model, concomitant, control, postunscaled=NULL, groups, weights) standardGeneric("FLXfit")) ###********************************************************** setGeneric("FLXgetModelmatrix", function(model, data, ...) standardGeneric("FLXgetModelmatrix")) setGeneric("FLXfillConcomitant", function(concomitant, ...) standardGeneric("FLXfillConcomitant")) ###********************************************************** setGeneric("logLik") setGeneric("clogLik", function(object, ...) standardGeneric("clogLik")) setGeneric("EIC", function(object, ...) standardGeneric("EIC")) ###********************************************************** setGeneric("FLXcheckComponent", function(model, ...) standardGeneric("FLXcheckComponent")) setGeneric("FLXgetK", function(model, ...) standardGeneric("FLXgetK")) setGeneric("FLXgetObs", function(model) standardGeneric("FLXgetObs")) setGeneric("FLXmstep", function(model, ...) standardGeneric("FLXmstep")) setGeneric("FLXremoveComponent", function(model, ...) standardGeneric("FLXremoveComponent")) setGeneric("FLXdeterminePostunscaled", function(model, ...) standardGeneric("FLXdeterminePostunscaled")) setGeneric("FLXgetDesign", function(object, ...) standardGeneric("FLXgetDesign")) setGeneric("FLXreplaceParameters", function(object, ...) standardGeneric("FLXreplaceParameters")) setGeneric("FLXlogLikfun", function(object, ...) standardGeneric("FLXlogLikfun")) setGeneric("FLXgradlogLikfun", function(object, ...) standardGeneric("FLXgradlogLikfun")) setGeneric("VarianceCovariance", function(object, ...) standardGeneric("VarianceCovariance")) setGeneric("FLXgetParameters", function(object, ...) standardGeneric("FLXgetParameters")) setGeneric("logLikfun_comp", function(object, ...) standardGeneric("logLikfun_comp")) setGeneric("getPriors", function(object, ...) standardGeneric("getPriors")) setGeneric("existGradient", function(object, ...) standardGeneric("existGradient")) setGeneric("refit_mstep", function(object, newdata, ...) standardGeneric("refit_mstep")) setGeneric("refit_optim", function(object, ...) standardGeneric("refit_optim")) ###********************************************************** setGeneric("group", function(object, ...) standardGeneric("group")) setGeneric("rflexmix", function(object, newdata, ...) standardGeneric("rflexmix")) setGeneric("rFLXM", function(model, components, ...) standardGeneric("rFLXM")) ## just to make sure that some S3 generics are available in S4 setGeneric("fitted", package = "stats") setGeneric("predict", package = "stats") setGeneric("simulate", package = "stats") setGeneric("summary", package = "base") setGeneric("unique", package = "base") setGeneric("allweighted", function(model, control, weights) standardGeneric("allweighted")) flexmix/R/boot.R0000644000175100001440000003401312653423105013235 0ustar hornikuserssetGeneric("boot", function(object, ...) standardGeneric("boot")) setGeneric("LR_test", function(object, ...) standardGeneric("LR_test")) setClass("FLXboot", representation(call="call", object="flexmix", parameters="list", concomitant="list", priors="list", logLik="matrix", k="matrix", converged="matrix", models="list", weights="list")) setMethod("show", "FLXboot", function(object) { cat("\nCall:", deparse(object@call,0.75*getOption("width")), sep="\n") }) generate_weights <- function(object) { if(is.null(object@weights) & is(object@model, "FLXMC")) { X <- do.call("cbind", lapply(object@model, function(z) z@y)) x <- apply(X, 1, paste, collapse = "") x <- as.integer(factor(x, unique(x))) object@weights <- as.vector(table(x)) indices_unique <- !duplicated(x) for (i in seq_along(object@model)) { object@model[[i]]@x <- object@model[[i]]@x[indices_unique,,drop=FALSE] object@model[[i]]@y <- object@model[[i]]@y[indices_unique,,drop=FALSE] } object@concomitant@x <- object@concomitant@x[indices_unique,,drop=FALSE] } object } setGeneric("FLXgetNewModelmatrix", function(object, ...) standardGeneric("FLXgetNewModelmatrix")) setMethod("FLXgetNewModelmatrix", "FLXM", function(object, model, indices, groups) { if (length(groups$group) > 0) { obs_groups <- lapply(groups$group[groups$groupfirst][indices], function(x) which(x == groups$group)) indices_grouped <- unlist(obs_groups) } else { indices_grouped <- indices } object@y <- model@y[indices_grouped,,drop=FALSE] object@x <- model@x[indices_grouped,,drop=FALSE] object }) setMethod("FLXgetNewModelmatrix", "FLXMRglmfix", function(object, model, indices, groups) { if (length(groups$group) > 0) { obs_groups <- lapply(groups$group[groups$groupfirst][indices], function(x) which(x == groups$group)) indices_grouped <- unlist(obs_groups) } else { indices_grouped <- indices } object@y <- do.call("rbind", rep(list(model@y[indices_grouped,,drop=FALSE]), sum(model@nestedformula@k))) object@x <- do.call("rbind", lapply(seq_len(sum(model@nestedformula@k)), function(K) model@x[model@segment[,K],,drop=FALSE][indices_grouped,,drop=FALSE])) N <- nrow(object@x)/sum(model@nestedformula@k) object@segment <- matrix(FALSE, ncol = sum(model@nestedformula@k), nrow = nrow(object@x)) for (m in seq_len(sum(model@nestedformula@k))) object@segment[(m - 1) * N + seq_len(N), m] <- TRUE object }) boot_flexmix <- function(object, R, sim = c("ordinary", "empirical", "parametric"), initialize_solution = FALSE, keep_weights = FALSE, keep_groups = TRUE, verbose = 0, control, k, model = FALSE, ...) { sim <- match.arg(sim) if (missing(R)) stop("R needs to be specified") if (!missing(control)) object@control <- do.call("new", c(list(Class = "FLXcontrol", object@control), control)) if (missing(k)) k <- object@k m <- length(object@model) has_weights <- !keep_weights & !is.null(object@weights) if (has_weights) object <- undo_weights(object) if (!keep_groups & length(object@group)) { object@concomitant@x <- object@concomitant@x[as.integer(object@group),,drop = FALSE] object@group <- factor() } groups <- list() groups$group <- object@group groups$groupfirst <- if (length(groups$group) > 0) groupFirst(groups$group) else rep(TRUE, FLXgetObs(object@model[[1]])) concomitant <- parameters <- priors <- models <- weights <- vector("list", R) logLik <- ks <- converged <- matrix(nrow=R, ncol = length(k), dimnames = list(BS = seq_len(R), k = k)) for (iter in seq_len(R)) { new <- object newgroups <- groups if(verbose && !(iter%%verbose)) cat("* ") if (iter > 1) { if (sim == "parametric") { y <- rflexmix(object, ...)$y for (i in seq_len(m)) new@model[[i]]@y <- matrix(as.vector(t(y[[i]])), nrow = nrow(new@model[[i]]@x), ncol = ncol(y[[i]]), byrow = TRUE) } else { n <- sum(groups$groupfirst) indices <- sample(seq_len(n), n, replace = TRUE) if (length(groups$group) > 0) { obs_groups <- lapply(groups$group[groups$groupfirst][indices], function(x) which(x == groups$group)) newgroups$group <- factor(rep(seq_along(obs_groups), sapply(obs_groups, length))) newgroups$groupfirst <- !duplicated(newgroups$group) } for (i in seq_len(m)) { new@model[[i]] <- FLXgetNewModelmatrix(new@model[[i]], object@model[[i]], indices, groups) } new@concomitant@x <- new@concomitant@x[indices,,drop=FALSE] } } if (has_weights & !length(groups$group) > 0) { new <- generate_weights(new) newgroups$groupfirst <- rep(TRUE, FLXgetObs(new@model[[1]])) } parameters[[iter]] <- concomitant[[iter]] <- priors[[iter]] <- list() NREP <- rep(object@control@nrep, length(k)) if (initialize_solution & object@k %in% k) NREP[k == object@k] <- 1L for (K in seq_along(k)) { fit <- new("flexmix", logLik = -Inf) for (nrep in seq_len(NREP[K])) { if (k[K] != object@k | !initialize_solution) { postunscaled <- initPosteriors(k[K], NULL, FLXgetObs(new@model[[1]]), newgroups) } else { postunscaled <- matrix(0, nrow = FLXgetObs(new@model[[1]]), ncol = k[K]) for (i in seq_len(m)) postunscaled <- postunscaled + FLXdeterminePostunscaled(new@model[[i]], lapply(new@components, function(x) x[[i]])) if(length(newgroups$group)>0) postunscaled <- groupPosteriors(postunscaled, newgroups$group) prior <- evalPrior(new@prior, new@concomitant) postunscaled <- if (is(prior, "matrix")) postunscaled + log(prior) else sweep(postunscaled, 2, log(prior), "+") postunscaled <- exp(postunscaled - log_row_sums(postunscaled)) } x <- try(FLXfit(new@model, new@concomitant, new@control, postunscaled, newgroups, weights = new@weights)) if (!is(x, "try-error")) { if(logLik(x) > logLik(fit)) fit <- x } } if (is.finite(logLik(fit))) { parameters[[iter]][paste(k[K])] <- list(parameters(fit, simplify = FALSE, drop = FALSE)) concomitant[[iter]][paste(k[K])] <- list(parameters(fit, which = "concomitant")) priors[[iter]][[paste(k[K])]] <- prior(fit) logLik[iter, paste(k[K])] <- logLik(fit) ks[iter, paste(k[K])] <- fit@k converged[iter, paste(k[K])] <- fit@converged if (model) { models[[iter]] <- fit@model weights[[iter]] <- fit@weights } } else { parameters[[iter]][[paste(k[K])]] <- concomitant[[iter]][[paste(k[K])]] <- priors[[iter]][[paste(k[K])]] <- NULL } } } if(verbose) cat("\n") new("FLXboot", call = sys.call(-1), object = object, parameters = parameters, concomitant = concomitant, priors = priors, logLik = logLik, k = ks, converged = converged, models = models, weights = weights) } setMethod("boot", signature(object="flexmix"), boot_flexmix) setMethod("LR_test", signature(object="flexmix"), function(object, R, alternative = c("greater", "less"), control, ...) { alternative <- match.arg(alternative) if (missing(control)) control <- object@control if (object@k == 1 & alternative == "less") stop(paste("alternative", alternative, "only possible for a mixture\n", "with at least two components")) k <- object@k + switch(alternative, greater = 0:1, less = 0:-1) names(k) <- k boot <- boot(object, R, sim = "parametric", k = k, initialize_solution = TRUE, control = control, ...) ok <- apply(boot@k, 1, identical, k) lrts <- 2*apply(boot@logLik[ok,order(k)], 1, diff) STATISTIC <- lrts[1] names(STATISTIC) <- "LRTS" PARAMETER <- length(lrts) names(PARAMETER) <- "BS" RETURN <- list(parameter = PARAMETER, p.value = sum(lrts[1] <= lrts)/length(lrts), alternative = alternative, null.value = object@k, method = "Bootstrap likelihood ratio test", data.name = deparse(substitute(object)), bootstrap.results = boot) class(RETURN) <- "htest" RETURN }) setMethod("parameters", "FLXboot", function(object, k, ...) { if (missing(k)) k <- object@object@k Coefs <- lapply(seq_along(object@parameters), function(i) if (is.na(object@k[i])) NULL else do.call("cbind", c(lapply(seq_len(object@k[i]), function(j) unlist(sapply(seq_along(object@object@model), function(m) FLXgetParameters(as(object@object@model[[m]], "FLXMR"), if (is(object@object@model[[m]]@defineComponent, "expression")) list(eval(object@object@model[[m]]@defineComponent, c(object@parameters[[i]][[paste(k)]][[m]][[j]], list(df = object@object@components[[j]][[m]]@df)))) else { list(object@object@model[[m]]@defineComponent( c(object@parameters[[i]][[paste(k)]][[m]][[j]], list(df = object@object@components[[j]][[m]]@df)))) })))), as.list(rep(NA, k - object@k[i]))))) Coefs <- t(do.call("cbind", Coefs)) colnames(Coefs) <- gsub("Comp.1_", "", colnames(Coefs)) Prior <- t(do.call("cbind", lapply(object@concomitant, function(x) do.call("cbind", c(list(x[[paste(k)]]), as.list(rep(NA, k - ifelse(length(x), ncol(x[[paste(k)]]), k)))))))) cbind(Coefs, Prior) }) setMethod("clusters", signature(object = "FLXboot", newdata = "listOrdata.frame"), function(object, newdata, k, ...) { if (missing(k)) k <- object@object@k lapply(seq_len(length(object@priors)), function(i) { new <- object@object new@prior <- object@priors[[i]][[paste(k)]] new@k <- length(new@prior) new@components <- rep(list(vector("list", length(object@object@model))), length(new@prior)) for (m in seq_along(new@model)) { variables <- c("x", "y", "offset", "family") variables <- variables[variables %in% slotNames(new@model[[m]])] for (var in variables) assign(var, slot(new@model[[m]], var)) for (K in seq_len(object@k[i])) { new@components[[K]][[m]] <- if (is(object@object@model[[m]]@defineComponent, "expression")) eval(object@object@model[[m]]@defineComponent, c(object@parameters[[i]][[paste(k)]][[m]][[K]], list(df = object@object@components[[K]][[m]]@df))) else object@object@model[[m]]@defineComponent( c(object@parameters[[i]][[paste(k)]][[m]][[K]], list(df = object@object@components[[K]][[m]]@df))) } } clusters(new, newdata = newdata)}) }) setMethod("posterior", signature(object = "FLXboot", newdata = "listOrdata.frame"), function(object, newdata, k, ...) { if (missing(k)) k <- object@object@k lapply(seq_len(length(object@priors)), function(i) { new <- object@object new@prior <- object@priors[[i]][[paste(k)]] new@k <- length(new@prior) new@components <- rep(list(vector("list", length(object@object@model))), length(new@prior)) for (m in seq_along(new@model)) { variables <- c("x", "y", "offset", "family") variables <- variables[variables %in% slotNames(new@model[[m]])] for (var in variables) assign(var, slot(new@model[[m]], var)) for (K in seq_len(object@k[i])) { new@components[[K]][[m]] <- if (is(object@object@model[[m]]@defineComponent, "expression")) eval(object@object@model[[m]]@defineComponent, c(object@parameters[[i]][[paste(k)]][[m]][[K]], list(df = object@object@components[[K]][[m]]@df))) else object@object@model[[m]]@defineComponent( c(object@parameters[[i]][[paste(k)]][[m]][[K]], list(df = object@object@components[[K]][[m]]@df))) } } posterior(new, newdata = newdata)}) }) setMethod("predict", signature(object = "FLXboot"), function(object, newdata, k, ...) { if (missing(k)) k <- object@object@k lapply(seq_len(length(object@priors)), function(i) { new <- object@object new@components <- vector("list", object@k[i, paste(k)]) new@components <- lapply(new@components, function(x) vector("list", length(new@model))) for (m in seq_along(new@model)) { variables <- c("x", "y", "offset", "family") variables <- variables[variables %in% slotNames(new@model[[m]])] for (var in variables) assign(var, slot(new@model[[m]], var)) for (K in seq_len(object@k[i, paste(k)])) { new@components[[K]][[m]] <- if (is(object@object@model[[m]]@defineComponent, "expression")) eval(object@object@model[[m]]@defineComponent, c(object@parameters[[i]][[paste(k)]][[m]][[K]], list(df = object@object@components[[1]][[m]]@df))) else object@object@model[[m]]@defineComponent( c(object@parameters[[i]][[paste(k)]][[m]][[K]], list(df = object@object@components[[1]][[m]]@df))) } } predict(new, newdata = newdata, ...)}) }) flexmix/R/lattice.R0000644000175100001440000000746612544655362013746 0ustar hornikusers# # Copyright (C) Deepayan Sarkar # Internal code copied from package lattice for use in flexmix # hist.constructor <- function (x, breaks, include.lowest = TRUE, right = TRUE, ...) { if (is.numeric(breaks) && length(breaks) > 1) hist(as.numeric(x), breaks = breaks, plot = FALSE, include.lowest = include.lowest, right = right) else hist(as.numeric(x), breaks = breaks, right = right, plot = FALSE) } checkArgsAndCall <- function (FUN, args) { if (!("..." %in% names(formals(FUN)))) args <- args[intersect(names(args), names(formals(FUN)))] do.call(FUN, args) } formattedTicksAndLabels <- function (x, at = FALSE, used.at = NULL, labels = FALSE, logsc = FALSE, ..., num.limit = NULL, abbreviate = NULL, minlength = 4, format.posixt = NULL, equispaced.log = TRUE) { rng <- if (length(x) == 2) as.numeric(x) else range(as.numeric(x)) if (is.logical(logsc) && logsc) logsc <- 10 have.log <- !is.logical(logsc) if (have.log) logbase <- if (is.numeric(logsc)) logsc else if (logsc == "e") exp(1) else stop("Invalid value of 'log'") logpaste <- if (have.log) paste(as.character(logsc), "^", sep = "") else "" check.overlap <- if (is.logical(at) && is.logical(labels)) TRUE else FALSE if (is.logical(at)) { at <- if (have.log && !equispaced.log) checkArgsAndCall(axisTicks, list(usr = log10(logbase^rng), log = TRUE, axp = NULL, ...)) else checkArgsAndCall(pretty, list(x = x[is.finite(x)], ...)) } else if (have.log && (length(at) > 0)) { if (is.logical(labels)) labels <- as.character(at) at <- log(at, base = logbase) } if (is.logical(labels)) { if (have.log && !equispaced.log) { labels <- as.character(at) at <- log(at, logbase) } else labels <- paste(logpaste, format(at, trim = TRUE), sep = "") } list(at = at, labels = labels, check.overlap = check.overlap, num.limit = rng) } calculateAxisComponents <- function (x, ..., packet.number, packet.list, abbreviate = NULL, minlength = 4) { if (all(is.na(x))) return(list(at = numeric(0), labels = numeric(0), check.overlap = TRUE, num.limit = c(0, 1))) ans <- formattedTicksAndLabels(x, ...) rng <- range(ans$num.limit) ok <- ans$at >= min(rng) & ans$at <= max(rng) ans$at <- ans$at[ok] ans$labels <- ans$labels[ok] if (is.logical(abbreviate) && abbreviate) ans$labels <- abbreviate(ans$labels, minlength) ans } extend.limits <- function (lim, length = 1, axs = "r", prop = if (axs == "i") 0 else lattice.getOption("axis.padding")$numeric) { if (all(is.na(lim))) NA_real_ else if (is.character(lim)) { c(1, length(lim)) + c(-1, 1) * if (axs == "i") 0.5 else lattice.getOption("axis.padding")$factor } else if (length(lim) == 2) { if (lim[1] > lim[2]) { ccall <- match.call() ccall$lim <- rev(lim) ans <- eval.parent(ccall) return(rev(ans)) } if (!missing(length) && !missing(prop)) stop("'length' and 'prop' cannot both be specified") if (length <= 0) stop("'length' must be positive") if (!missing(length)) { prop <- (as.numeric(length) - as.numeric(diff(lim)))/(2 * as.numeric(diff(lim))) } if (lim[1] == lim[2]) lim + 0.5 * c(-length, length) else { d <- diff(as.numeric(lim)) lim + prop * d * c(-1, 1) } } else { print(lim) stop("improper length of 'lim'") } } flexmix/R/utils.R0000644000175100001440000000321712653423105013434 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: utils.R 5079 2016-01-31 12:21:12Z gruen $ # list2object = function(from, to){ n = names(from) s = slotNames(to) p = pmatch(n, s) if(any(is.na(p))) stop(paste("\nInvalid slot name(s) for class", to, ":", paste(n[is.na(p)], collapse=" "))) names(from) = s[p] do.call("new", c(from, Class=to)) } printIter = function(iter, logLik, label="Log-likelihood") cat(formatC(iter, width=4), label, ":", formatC(logLik, width=12, format="f"),"\n") ## library(colorspace) ## dput(x[c(1,3,5,7,2,4,6,8)]) ## x = hcl(seq(0, 360*7/8, length.out = 8), c=30) LightColors <- c("#F9C3CD", "#D0D4A8", "#9DDDD5", "#D1CCF5", "#EDCAB2", "#AFDCB8", "#ACD7ED", "#EFC4E8") ## x = hcl(seq(0, 360*7/8, length.out = 8), c=100, l=65) FullColors <- c("#FF648A", "#96A100", "#00BCA3", "#9885FF", "#DC8400", "#00B430", "#00AEEF", "#F45BE1") ###********************************************************** ## similar defaults to silhouette plots in flexclust unipolarCols <- function(n, hue=0, chr=50, lum = c(55, 90)) { lum <- seq(lum[1], lum[2], length=n) hcl(hue, chr, lum) } bipolarCols <- function(n, hue=c(10, 130), ...) { if(n%%2){ # n odd n2 <- (n-1)/2 c1 <- unipolarCols(n2, hue[1]) c2 <- rev(unipolarCols(n2, hue[2])) return(c(c1, "white", c2)) } else{ # n even n2 <- n/2 c1 <- unipolarCols(n2, hue[1]) c2 <- rev(unipolarCols(n2, hue[2])) return(c(c1, c2)) } } ###********************************************************** flexmix/R/factanal.R0000644000175100001440000000345212064061311014037 0ustar hornikuserssetClass("FLXMCfactanal", contains = "FLXMC") ###********************************************************** FLXMCfactanal <- function(formula=.~., factors = 1, ...) { z <- new("FLXMCfactanal", weighted=TRUE, formula=formula, dist = "mvnorm", name="mixtures of factor analyzers") z@fit <- function(x, y, w, ...){ cov.weighted <- cov.wt(y, wt = w)[c("center","cov")] cov <- cov.weighted$cov; center <- cov.weighted$center fa <- factanal(covmat = cov, factors = factors, ...) Sigma <- fa$loadings %*% t(fa$loadings) + diag(fa$uniquenesses) df <- (factors + 2) * ncol(y) predict <- function(x) matrix(center, nrow=nrow(x), ncol=length(center), byrow=TRUE) logLik <- function(x, y){ sds <- sqrt(diag(cov)) mvtnorm::dmvnorm(y, mean = center, sigma = Sigma * (sds %o% sds), log = TRUE) } new("FLXcomponent", parameters=list(mu = center, variance = diag(cov), loadings = fa$loadings, uniquenesses = fa$uniquenesses), df=df, logLik=logLik, predict=predict) } z } ###********************************************************** setMethod("rFLXM", signature(model = "FLXMCfactanal", components = "FLXcomponent"), function(model, components, class, ...) { FUN <- paste("r", model@dist, sep = "") Sigma <- components@parameters$loadings %*% t(components@parameters$loadings) + diag(components@parameters$uniquenesses) sds <- sqrt(components@parameters$variance) args <- list(n = nrow(model@x), mean = components@parameters$mu, sigma = Sigma * (sds %o% sds)) return(do.call(FUN, args)) }) flexmix/R/initFlexmix.R0000644000175100001440000000355612004175063014577 0ustar hornikuserssetClass("initMethod", representation(step1 = "FLXcontrol", step2 = "FLXcontrol")) initMethod <- function(name = c("tol.em", "cem.em", "sem.em"), step1 = list(tolerance = 10^-2), step2 = list(), control = list(), nrep = 3L) { name <- match.arg(name) z <- new("initMethod", step1 = as(c(step1, control), "FLXcontrol"), step2 = as(c(step2, control), "FLXcontrol")) z@step1@nrep <- as.integer(nrep) z@step2@nrep <- 1L z@step1@classify <- switch(name, cem.em = "CEM", sem.em = "SEM", tol.em = "weighted") z } initFlexmix <- function(..., k, init = list(), control = list(), nrep = 3L, verbose = TRUE, drop = TRUE, unique = FALSE) { MYCALL <- match.call() if (missing(k)) stop("'k' is missing.") if (!missing(control) & is(init, "initMethod")) warning("'control' argument ignored.") init <- do.call("initMethod", c(init, list(control = control, nrep = nrep))) MYCALL1 <- lapply(k, function(K) { MYCALL[["k"]] <- as.numeric(K) MYCALL }) names(MYCALL1) <- paste(k) STEP1 <- stepFlexmix(..., k = k, verbose = verbose, drop = FALSE, unique = FALSE, nrep = init@step1@nrep, control = init@step1) models <- lapply(k, function(K) { if (length(k) > 1 && verbose) cat("* ") new("flexmix", flexmix(..., control = init@step2, cluster = posterior(getModel(STEP1, paste(K)))), k0 = as.integer(K), call = MYCALL1[[paste(K)]]) }) if (length(k) > 1 && verbose) cat("\n") names(models) <- paste(k) if (drop & length(models) == 1) { return(models[[1]]) } else { z <- new("stepFlexmix", models = models, k = as.integer(k), logLiks = STEP1@logLiks, nrep = STEP1@nrep, call = MYCALL) if (unique) z <- unique(z) return(z) } } flexmix/R/plot-FLXboot.R0000644000175100001440000001421012611630631014556 0ustar hornikusersprepanel.parallel.horizontal <- function (x, y, z, horizontal = TRUE, ...) { if (horizontal) list(xlim = extend.limits(c(1, ncol(as.data.frame(z))), prop = 0.03), ylim = c(0, 1), dx = 1, dy = 1) else list(xlim = c(0, 1), ylim = extend.limits(c(1, ncol(as.data.frame(z))), prop = 0.03), dx = 1, dy = 1) } panel.parallel.horizontal <- function (x, y, z, subscripts, groups = NULL, col = superpose.line$col, lwd = superpose.line$lwd, lty = superpose.line$lty, alpha = superpose.line$alpha, common.scale = FALSE, lower = sapply(z, function(x) min(as.numeric(x), na.rm = TRUE)), upper = sapply(z, function(x) max(as.numeric(x), na.rm = TRUE)), horizontal = TRUE, ...) { superpose.line <- trellis.par.get("superpose.line") reference.line <- trellis.par.get("reference.line") n.r <- ncol(z) n.c <- length(subscripts) if (is.null(groups)) { col <- rep(col, length = n.c) lty <- rep(lty, length = n.c) lwd <- rep(lwd, length = n.c) alpha <- rep(alpha, length = n.c) } else { groups <- as.factor(groups)[subscripts] n.g <- nlevels(groups) gnum <- as.numeric(groups) col <- rep(col, length = n.g)[gnum] lty <- rep(lty, length = n.g)[gnum] lwd <- rep(lwd, length = n.g)[gnum] alpha <- rep(alpha, length = n.g)[gnum] } if (is.function(lower)) lower <- sapply(z, lower) if (is.function(upper)) upper <- sapply(z, upper) if (common.scale) { lower <- min(lower) upper <- max(upper) } lower <- rep(lower, length = n.r) upper <- rep(upper, length = n.r) dif <- upper - lower if (n.r > 1) { if (horizontal) panel.segments(y0 = 0, y1 = 1, x0 = seq_len(n.r), x1 = seq_len(n.r), col = reference.line$col, lwd = reference.line$lwd, lty = reference.line$lty) else panel.segments(x0 = 0, x1 = 1, y0 = seq_len(n.r), y1 = seq_len(n.r), col = reference.line$col, lwd = reference.line$lwd, lty = reference.line$lty) }else return(invisible()) for (i in seq_len(n.r - 1)) { x0 <- (as.numeric(z[subscripts, i]) - lower[i])/dif[i] x1 <- (as.numeric(z[subscripts, i + 1]) - lower[i + 1])/dif[i + 1] if (horizontal) panel.segments(y0 = x0, x0 = i, y1 = x1, x1 = i + 1, col = col, lty = lty, lwd = lwd, alpha = alpha, ...) else panel.segments(x0 = x0, y0 = i, x1 = x1, y1 = i + 1, col = col, lty = lty, lwd = lwd, alpha = alpha, ...) } invisible() } confidence.panel.boot <- function(x, y, z, subscripts, lwd = 1, SD = NULL, ..., lower, upper, range = c(0, 1)) { nc <- ncol(z) if (missing(lower)) lower <- sapply(z, function(x) quantile(x, range[1])) if (missing(upper)) upper <- sapply(z, function(x) quantile(x, range[2])) dif <- upper - lower if (!is.null(SD)) { SD <- lapply(SD, function(x) (x - lower)/dif) for (l in seq_along(SD)) { grid.polygon(y = unit(c(SD[[l]][,1], rev(SD[[l]][,3])), "native"), x = unit(c(seq_len(nc),rev(seq_len(nc))), "native"), gp = gpar(fill = rgb(190/225, 190/225, 190/225, 0.5), col = "darkgrey")) } } panel.parallel.horizontal(x, y, z, subscripts, ..., lower = lower, upper = upper) if (!is.null(SD)) { for (l in seq_along(SD)) { llines(y = SD[[l]][,2], x = seq_len(nc), col="white", lwd=lwd, lty = 1) } } } setMethod("plot", signature(x = "FLXboot", y = "missing"), function(x, y, ordering = NULL, range = c(0, 1), ci = FALSE, varnames = colnames(pars), strip_name = NULL, ...) { k <- x@object@k pars <- parameters(x) if (ci) { x_refit <- refit(x@object) sd <- sqrt(diag(x_refit@vcov)) CI <- x_refit@coef + qnorm(0.975) * cbind(-sd, 0, sd) indices_prior <- grep("alpha$", names(x_refit@coef)) if (length(indices_prior)) { z <- mvtnorm::rmvnorm(10000, x_refit@coef[indices_prior,drop=FALSE], x_refit@vcov[indices_prior,indices_prior,drop=FALSE]) Priors <- t(apply(cbind(1, exp(z))/rowSums(cbind(1, exp(z))), 2, quantile, c(0.025, 0.5, 0.975))) indices <- lapply(seq_len(k), function(i) grep(paste("_Comp.", i, sep = ""), names(x_refit@coef[-indices_prior]))) SD <- lapply(seq_len(k), function(i) rbind(CI[indices[[i]], ], prior = Priors[i,])) } else { indices <- lapply(seq_len(k), function(i) grep(paste("_Comp.", i, sep = ""), names(x_refit@coef))) SD <- lapply(seq_len(k), function(i) CI[indices[[i]], ]) mnrow <- max(sapply(SD, nrow)) SD <- lapply(SD, function(x) if (nrow(x) < mnrow) do.call("rbind", c(list(x), as.list(rep(0, mnrow - nrow(x))))) else x) } if (any("gaussian" %in% sapply(x@object@model, function(x) if (is(x, "FLXMRglm")) x@family else ""))) { i <- grep("sigma$", colnames(pars)) pars[,i] <- log(pars[,i]) colnames(pars)[i] <- "log(sigma)" } } else SD <- NULL range_name <- vector(mode = "character", length=2) range_name[1] <- if (range[1] == 0) "Min" else paste(round(range[1]*100), "%", sep = "") range_name[2] <- if (range[2] == 1) "Max" else paste(round(range[2]*100), "%", sep = "") Ordering <- if (is.null(ordering)) NULL else factor(as.vector(apply(matrix(pars[,ordering], nrow = k), 2, function(x) order(order(x))))) if(is.null(strip_name)) formula = ~ pars else { opt.old <- options(useFancyQuotes = FALSE) on.exit(options(opt.old)) formula <- as.formula(paste("~ pars | ", sQuote(strip_name))) } pars <- na.omit(pars) if (!is.null(attr(pars, "na.action"))) Ordering <- Ordering[-attr(na.omit(pars), "na.action")] parallel.plot <- parallelplot(formula, groups = Ordering, default.scales = list(y = list(at = c(0, 1), labels = range_name), x = list(alternating = FALSE, axs = "i", tck = 0, at = seq_len(ncol(pars)))), range = range, panel = confidence.panel.boot, prepanel = prepanel.parallel.horizontal, SD = SD, ...) parallel.plot$x.scales$labels <- varnames parallel.plot }) flexmix/R/flxdist.R0000644000175100001440000000554212653423105013754 0ustar hornikusersFLXdist <- function(formula, k = NULL, model=FLXMRglm(), components, concomitant=FLXPconstant()) { mycall <- match.call() if(is(model, "FLXM")) model <- list(model) if (length(k)==1) prior <- rep(1/k, k) else { prior <- k/sum(k) } concomitant@x <- matrix(c(1, rep(0, ncol(concomitant@coef))[-1]), nrow = 1) prior <- as.vector(evalPrior(prior, concomitant)) lf <- length(formula) formula1 <- formula if(length(formula[[lf]])>1 && deparse(formula[[lf]][[1]]) == "|") formula1[[lf]] <- formula[[lf]][[2]] for(n in seq(along.with=model)) { if(is.null(model[[n]]@formula)) model[[n]]@formula <- formula1 else if(length(model[[n]]@formula) == 3 && model[[n]]@formula[[2]] == ".") model[[n]]@formula <- model[[n]]@formula[-2] model[[n]]@fullformula <- update.formula(formula1, model[[n]]@formula) } if (missing(components)) stop("no parameter values specified") if (length(components) != length(prior)) stop("components not specified correctly") comp <- list() for (k in seq(along.with=prior)) { comp[[k]] <- list() if (length(components[[k]]) != length(model)) stop("components not specified correctly") for (n in seq(along.with=model)) { comp[[k]][[n]] <- FLXcomponent(model[[n]], components[[k]][[n]]) } } new("FLXdist", formula=formula, call=mycall, concomitant=concomitant, prior=prior, k=length(prior), model=model, components=comp) } ###********************************************************** setGeneric("FLXcomponent", function(object, ...) standardGeneric("FLXcomponent")) setMethod("FLXcomponent", signature(object="FLXM"), function(object, components, ...) { components$df <- numeric() if (is(object@defineComponent, "expression")) eval(object@defineComponent, components) else object@defineComponent(components) }) #### setMethod("FLXcomponent", signature(object="FLXMRglm"), function(object, components, ...) { components$df <- numeric() offset <- NULL family <- object@family if (is(object@defineComponent, "expression")) eval(object@defineComponent, components) else object@defineComponent(components) }) ###********************************************************** setMethod("show", "FLXdist", function(object){ cat("\nCall:", deparse(object@call,0.75*getOption("width")), sep="\n") cat("\nPriors:\n") names(object@prior) <- paste("Comp.", seq_along(object@prior), sep="") print(object@prior) cat("\n") }) ###********************************************************** evalPrior <- function(prior, concomitant) prior setGeneric("evalPrior", function(prior, concomitant) standardGeneric("evalPrior")) setMethod("evalPrior", signature(concomitant="FLXPmultinom"), function(prior, concomitant) { exps <- exp(concomitant@x %*% concomitant@coef) exps/rowSums(exps) }) flexmix/R/robust.R0000644000175100001440000000421712653423105013613 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: robust.R 5079 2016-01-31 12:21:12Z gruen $ # ###********************************************************* setClass("FLXMRrobglm", representation(bgw="logical"), prototype(bgw=FALSE), contains = "FLXMRglm") FLXMRrobglm <- function(formula = . ~ ., family=c("gaussian", "poisson"), bgw=FALSE, ...) { family <- match.arg(family) new("FLXMRrobglm", FLXMRglm(formula, family, ...), name = paste("FLXMRrobglm", family, sep=":"), bgw = bgw) } setMethod("FLXgetModelmatrix", signature(model="FLXMRrobglm"), function(model, data, formula, lhs=TRUE, ...) { model <- callNextMethod(model, data, formula, lhs) if (attr(terms(model@fullformula), "intercept")==0) stop("please include an intercept") new("FLXMRrobglm", model) }) setMethod("FLXremoveComponent", signature(model = "FLXMRrobglm"), function(model, nok, ...) { if (1 %in% nok) model <- as(model, "FLXMRglm") model }) setMethod("FLXmstep", signature(model = "FLXMRrobglm"), function(model, weights, ...) { if(model@bgw){ w <- weights[,1] } else{ w <- rep(1, nrow(weights)) } if(model@family=="gaussian") { cwt <- cov.wt(model@y, w) coef <- c(cwt$center, rep(0, ncol(model@x)-1)) names(coef) <- colnames(model@x) comp.1 <- model@defineComponent(list(coef = coef, df = 0, offset = NULL, sigma=sqrt(cwt$cov), family = model@family)) } else if(model@family=="poisson") { cwt <- cov.wt(model@y, w) coef <- c(log(3*cwt$center), rep(0, ncol(model@x)-1)) names(coef) <- colnames(model@x) comp.1 <- model@defineComponent(list(coef = coef, df = 0, offset = NULL, family = model@family)) } else{ stop("Other families not implemented yet!") } c(list(comp.1), FLXmstep(as(model, "FLXMRglm"), weights[, -1, drop=FALSE], ...)) }) flexmix/R/plot-refit.R0000644000175100001440000001125012653423105014355 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: plot-refit.R 5079 2016-01-31 12:21:12Z gruen $ # prepanel.default.coef <- function (x, y, subscripts, groups=NULL, horizontal = TRUE, nlevels, origin = NULL, ...) { if (any(!is.na(x) & !is.na(y))) { if (horizontal) { if (!is.factor(y)) { if (missing(nlevels)) nlevels <- length(unique(y)) y <- factor(y, levels = seq_len(nlevels)) } if (!is.null(groups)) { if (!is.numeric(x)) stop("x must be numeric") x <- rep(x, each = 2) + rep(groups[subscripts], each = 2) *c(-1,1) } list(xlim = if (is.numeric(x)) range(x, origin, finite = TRUE) else levels(x), ylim = levels(y), yat = sort(unique(as.numeric(y))), dx = 1, dy = 1) } else { if (!is.factor(x)) { if (missing(nlevels)) nlevels <- length(unique(x)) x <- factor(x, levels = seq_len(nlevels)) } if (!is.null(groups)) { if (!is.numeric(y)) stop("y must be numeric") y <- rep(as.numeric(y), each = 2) + rep(groups[subscripts], each = 2) *c(-1,1) } list(xlim = levels(x), xat = sort(unique(as.numeric(x))), ylim = if (is.numeric(y)) range(y, origin, finite = TRUE) else levels(y), dx = 1, dy = 1) } } else list(xlim = c(NA, NA), ylim = c(NA, NA), dx = 1, dy = 1) } panel.coef <- function(x, y, subscripts, groups, significant = NULL, horizontal = TRUE, lwd = 2, col, col.line = c("black", "grey"), ...) { col.sig <- rep(col.line[1], length(x)) if (!is.null(significant)) { if (missing(col)) col <- c("grey", "white") col.fill <- rep(col[1], length(x)) col.sig[!significant[subscripts]] <- col.line[2] col.fill[!significant[subscripts]] <- col[2] } else if (missing(col)) col.fill <- "grey" else col.fill <- col panel.barchart(x, y, border = col.sig, col = col.fill, horizontal = horizontal, ...) if (!missing(groups)) { if (horizontal) { z <- x + rep(c(-1,1), each = length(x)) * matrix(rep(groups[subscripts], 2), ncol = 2) for (i in seq_along(x)) { panel.xyplot(z[i,], rep(y[i], 2), type = "l", col = col.sig[i], lwd = lwd) } } else { z <- y + rep(c(-1,1), each = length(y)) * matrix(rep(groups[subscripts], 2), ncol = 2) for (i in seq_along(y)) { panel.xyplot(rep(x[i], 2), z[i,], type = "l", col = col.sig[i], lwd = lwd) } } } } getCoefs <- function(x, alpha = 0.05, components, ...) { names(x) <- sapply(names(x), function(z) strsplit(z, "Comp.")[[1]][2]) x <- x[names(x) %in% components] Comp <- lapply(names(x), function(n) data.frame(Value = x[[n]][,1], SD = x[[n]][,2] * qnorm(1-alpha/2), Variable = rownames(x[[n]]), Component = n, Significance = x[[n]][,4] <= alpha)) do.call("rbind", Comp) } setMethod("plot", signature(x="FLXRoptim", y="missing"), function(x, y, model = 1, which = c("model", "concomitant"), bycluster=TRUE, alpha=0.05, components, labels=NULL, significance = FALSE, xlab = NULL, ylab = NULL, ci = TRUE, scales = list(), as.table = TRUE, horizontal = TRUE, ...) { which <- match.arg(which) if (missing(components)) components <- seq_len(x@k) plot.data <- if (which == "model") getCoefs(x@components[[model]], alpha, components) else getCoefs(x@concomitant, alpha, components) if (!is.null(labels)) plot.data$Variable <- factor(plot.data$Variable, labels = labels) plot.data$Component <- with(plot.data, factor(Component, sort(unique(Component)), labels = paste("Comp.", sort(unique(Component))))) if (bycluster) { formula <- if (horizontal) Variable ~ Value | Component else Value ~ Variable | Component plot.data$Variable <- with(plot.data, factor(Variable, levels = rev(unique(Variable)))) } else { formula <- if (horizontal) Component ~ Value | Variable else Value ~ Component | Variable plot.data$Component <- with(plot.data, factor(Component, levels = rev(levels(Component)))) } groups <- if (ci) plot.data$SD else NULL significant <- if (significance) plot.data$Significance else NULL xyplot(formula, data = plot.data, xlab = xlab, ylab = ylab, origin = 0, horizontal = horizontal, scales = scales, as.table = as.table, significant = significant, groups = groups, prepanel = function(...) prepanel.default.coef(...), panel = function(x, y, subscripts, groups, ...) panel.coef(x, y, subscripts, groups, ...), ...) }) flexmix/R/multinom.R0000644000175100001440000000340112653423105014133 0ustar hornikuserssetClass("FLXMRmultinom", contains = "FLXMRglm") FLXMRmultinom <- function(formula=.~., ...) { z <- new("FLXMRmultinom", weighted=TRUE, formula=formula, family = "multinom", name=paste("FLXMRglm", "multinom", sep=":")) z@preproc.y <- function(x){ x <- as.integer(factor(x)) if (min(x) < 1 | length(unique(x)) != max(x)) stop("x needs to be coercible to an integer vector containing all numbers from 1 to max(x)") y <- matrix(0, nrow = length(x), ncol = max(x)) y[cbind(seq_along(x), x)] <- 1 y } z@defineComponent <- function(para) { predict <- function(x) { p <- tcrossprod(x, para$coef) eta <- cbind(1, exp(p)) eta/rowSums(eta) } logLik <- function(x, y) { log(predict(x))[cbind(seq_len(nrow(y)), max.col(y, "first"))] } new("FLXcomponent", parameters=list(coef=para$coef), logLik=logLik, predict=predict, df=para$df) } z@fit <- function(x, y, w, component){ r <- ncol(x) p <- ncol(y) if (p < 2) stop("Multinom requires at least two components.") mask <- c(rep(0, r + 1), rep(c(0, rep(1, r)), p - 1)) fit <- nnet.default(x, y, w, mask = mask, size = 0, skip = TRUE, softmax = TRUE, censored = FALSE, rang = 0, trace=FALSE, ...) fit$coefnames <- colnames(x) fit$weights <- w fit$vcoefnames <- fit$coefnames[seq_len(ncol(x))] fit$lab <- seq_len(ncol(y)) class(fit) <- c("multinom", "nnet") coef <- coef(fit) z@defineComponent(list(coef = coef, df = length(coef))) } z } setMethod("existGradient", signature(object = "FLXMRmultinom"), function(object) FALSE) flexmix/R/refit.R0000644000175100001440000005270512653423105013413 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: refit.R 5079 2016-01-31 12:21:12Z gruen $ # ###********************************************************* setMethod("FLXgetParameters", signature(object="FLXdist"), function(object, model) { if (missing(model)) model <- seq_along(object@model) coefficients <- unlist(lapply(model, function(m) { Model <- unlist(FLXgetParameters(object@model[[m]], lapply(object@components, "[[", m))) names(Model) <- paste("model.", m, "_", names(Model), sep = "") Model })) c(coefficients, FLXgetParameters(object@concomitant)) }) setMethod("FLXgetParameters", signature(object="FLXM"), function(object, components, ...) { lapply(components, function(x) unlist(slot(x, "parameters"))) }) setMethod("FLXgetParameters", signature(object="FLXMC"), function(object, components, ...) { if (object@dist == "mvnorm") { return(lapply(components, function(x) { pars <- x@parameters if (identical(pars$cov, diag(diag(pars$cov)))) return(c(pars$center, diag(pars$cov))) else return(c(pars$center, pars$cov[lower.tri(pars$cov, diag = TRUE)])) })) } else return(lapply(components, function(x) unlist(slot(x, "parameters")))) }) setMethod("FLXgetParameters", signature(object="FLXMRglm"), function(object, components, ...) { parms <- lapply(components, function(x) unlist(slot(x, "parameters"))) Design <- FLXgetDesign(object, components) if (object@family == "gaussian") { parms <- lapply(parms, function(x) { x["sigma"] <- log(x["sigma"]) x }) colnames(Design) <- gsub("sigma$", "log(sigma)", colnames(Design)) } parms_unique <- vector(length = ncol(Design)) names(parms_unique) <- colnames(Design) for (k in seq_along(parms)) parms_unique[as.logical(Design[k,])] <- parms[[k]] parms_unique }) setMethod("FLXgetParameters", signature(object="FLXP"), function(object, ...) { if (length(object@coef) == 1) return(NULL) alpha <- log(object@coef[-1]) - log(object@coef[1]) names(alpha) <- paste("concomitant", paste("Comp", seq_along(object@coef)[-1], "alpha", sep = "."), sep = "_") return(alpha) }) setMethod("FLXgetParameters", signature(object="FLXPmultinom"), function(object, ...) { coefficients <- object@coef[,-1,drop=FALSE] if (ncol(coefficients) > 0) { Names <- paste("Comp", rep(seq_len(ncol(coefficients)+1)[-1], each = nrow(coefficients)), rownames(coefficients), sep = ".") coefficients <- as.vector(coefficients) names(coefficients) <- paste("concomitant", Names, sep = "_") return(coefficients) }else return(NULL) }) setMethod("VarianceCovariance", signature(object="flexmix"), function(object, model = TRUE, gradient, optim_control = list(), ...) { if (object@control@classify != "weighted") stop("Only for weighted ML estimation possible.") if (length(FLXgetParameters(object)) != object@df) stop("not implemented yet for restricted parameters.") if (missing(gradient)) gradient <- FLXgradlogLikfun(object) optim_control$fnscale <- -1 fit <- optim(fn = FLXlogLikfun(object), par = FLXgetParameters(object), gr = gradient, hessian = TRUE, method = "BFGS", control = optim_control, ...) list(coef = fit$par, vcov = -solve(as.matrix(fit$hessian))) }) setMethod("logLikfun_comp", signature(object="flexmix"), function(object) { postunscaled <- matrix(0, nrow = FLXgetObs(object@model[[1]]), ncol = object@k) for (m in seq_along(object@model)) postunscaled <- postunscaled + FLXdeterminePostunscaled(object@model[[m]], lapply(object@components, "[[", m)) if(length(object@group)>0) postunscaled <- groupPosteriors(postunscaled, object@group) postunscaled }) setMethod("FLXlogLikfun", signature(object="flexmix"), function(object, ...) function(parms) { object <- FLXreplaceParameters(object, parms) groupfirst <- if (length(object@group) > 1) groupFirst(object@group) else rep(TRUE, FLXgetObs(object@model[[1]])) logpostunscaled <- logLikfun_comp(object) + log(getPriors(object@concomitant, object@group, groupfirst)) if (is.null(object@weights)) sum(log_row_sums(logpostunscaled[groupfirst,,drop=FALSE])) else sum(log_row_sums(logpostunscaled[groupfirst,,drop=FALSE])*object@weights[groupfirst]) }) setMethod("getPriors", signature(object="FLXP"), function(object, group, groupfirst) { priors <- matrix(apply(object@coef, 2, function(x) object@x %*% x), nrow = nrow(object@x)) ungroupPriors(priors/rowSums(priors), group, groupfirst) }) setMethod("getPriors", signature(object="FLXPmultinom"), function(object, group, groupfirst) { priors <- matrix(apply(object@coef, 2, function(x) exp(object@x %*% x)), nrow = nrow(object@x)) ungroupPriors(priors/rowSums(priors), group, groupfirst) }) setMethod("FLXreplaceParameters", signature(object="FLXdist"), function(object, parms) { comp_names <- names(object@components) components <- list() for (m in seq_along(object@model)) { indices <- grep(paste("^model.", m, sep = ""), names(parms)) components[[m]] <- FLXreplaceParameters(object@model[[m]], lapply(object@components, "[[", m), parms[indices]) } object@components <- lapply(seq_along(object@components), function(k) lapply(components, "[[", k)) names(object@components) <- comp_names if (object@k > 1) { indices <- grep("^concomitant_", names(parms)) object@concomitant <- FLXreplaceParameters(object@concomitant, parms[indices]) } object }) setMethod("FLXreplaceParameters", signature(object="FLXM"), function(object, components, parms) { Design <- FLXgetDesign(object, components) lapply(seq_along(components), function(k) { Parameters <- list() parms_k <- parms[as.logical(Design[k,])] for (i in seq_along(components[[k]]@parameters)) { Parameters[[i]] <- parms_k[seq_along(components[[k]]@parameters[[i]])] attributes(Parameters[[i]]) <- attributes(components[[k]]@parameters[[i]]) parms_k <- parms_k[-seq_along(components[[k]]@parameters[[i]])] } names(Parameters) <- names(components[[k]]@parameters) Parameters$df <- components[[k]]@df variables <- c("x", "y") for (var in variables) assign(var, slot(object, var)) if (is(object@defineComponent, "expression")) eval(object@defineComponent, Parameters) else object@defineComponent(Parameters) }) }) setMethod("FLXreplaceParameters", signature(object="FLXMC"), function(object, components, parms) { Design <- FLXgetDesign(object, components) if (object@dist == "mvnorm") { p <- sqrt(1/4+ncol(Design)/nrow(Design)) - 1/2 diagonal <- get("diagonal", environment(object@fit)) if (diagonal) { cov <- diag(seq_len(p)) parms_comp <- as.vector(sapply(seq_len(nrow(Design)), function(i) c(parms[(i-1) * 2 * p + seq_len(p)], as.vector(diag(diag(parms[(i-1) * 2 * p + p + seq_len(p)])))))) parms <- c(parms_comp, parms[(nrow(Design) * 2 * p + 1):length(parms)]) } else { cov <- matrix(NA, nrow = p, ncol = p) cov[lower.tri(cov, diag = TRUE)] <- seq_len(sum(lower.tri(cov, diag = TRUE))) cov[upper.tri(cov)] <- t(cov)[upper.tri(cov)] parms <- parms[c(as.vector(sapply(seq_len(nrow(Design)), function(i) (i-1)*(max(cov)+p) + c(seq_len(p), as.vector(cov) + p))), (nrow(Design) * (max(cov) + p)+1):length(parms))] } } callNextMethod(object = object, components = components, parms = parms) }) setMethod("FLXreplaceParameters", signature(object="FLXMRglm"), function(object, components, parms) { Design <- FLXgetDesign(object, components) lapply(seq_along(components), function(k) { Parameters <- list() parms_k <- parms[as.logical(Design[k,])] for (i in seq_along(components[[k]]@parameters)) { Parameters[[i]] <- parms_k[seq_along(components[[k]]@parameters[[i]])] attributes(Parameters[[i]]) <- attributes(components[[k]]@parameters[[i]]) parms_k <- parms_k[-seq_along(components[[k]]@parameters[[i]])] } names(Parameters) <- names(components[[k]]@parameters) if (object@family == "gaussian") { Parameters[["sigma"]] <- exp(Parameters[["sigma"]]) } Parameters$df <- components[[k]]@df variables <- c("x", "y", "offset", "family") for (var in variables) { assign(var, slot(object, var)) } if (is(object@defineComponent, "expression")) eval(object@defineComponent, Parameters) else object@defineComponent(Parameters) }) }) setMethod("FLXreplaceParameters", signature(object="FLXP"), function(object, parms) { parms <- exp(c(0, parms)) parms <- parms/sum(parms) attributes(parms) <- attributes(object@coef) object@coef <- parms object }) setMethod("FLXreplaceParameters", signature(object="FLXPmultinom"), function(object, parms) { parms <- cbind(0, matrix(parms, nrow = nrow(object@coef))) attributes(parms) <- attributes(object@coef) object@coef <- parms object }) setMethod("FLXgradlogLikfun", signature(object="flexmix"), function(object, ...) { existFunction <- all(sapply(object@model, existGradient)) if (object@k > 1) existFunction <- c(existFunction, existGradient(object@concomitant)) if (any(!existFunction)) return(NULL) function(parms) { object <- FLXreplaceParameters(object, parms) groupfirst <- if (length(object@group) > 1) groupFirst(object@group) else rep(TRUE, FLXgetObs(object@model[[1]])) logLik_comp <- logLikfun_comp(object) Priors <- getPriors(object@concomitant, object@group, groupfirst) Priors_Lik_comp <- logLik_comp + log(Priors) weights <- exp(Priors_Lik_comp - log_row_sums(Priors_Lik_comp)) if (object@k > 1) { ConcomitantScores <- FLXgradlogLikfun(object@concomitant, Priors[groupfirst,,drop=FALSE], weights[groupfirst,,drop=FALSE]) if (!is.null(object@weights)) ConcomitantScores <- lapply(ConcomitantScores, "*", object@weights[groupfirst]) } else ConcomitantScores <- list() ModelScores <- lapply(seq_along(object@model), function(m) FLXgradlogLikfun(object@model[[m]], lapply(object@components, "[[", m), weights)) ModelScores <- lapply(ModelScores, lapply, groupPosteriors, object@group) if (!is.null(object@weights)) ModelScores <- lapply(ModelScores, lapply, "*", object@weights) colSums(cbind(do.call("cbind", lapply(ModelScores, function(x) do.call("cbind", x)))[groupfirst,,drop=FALSE], do.call("cbind", ConcomitantScores))) } }) setMethod("existGradient", signature(object = "FLXM"), function(object) FALSE) setMethod("existGradient", signature(object = "FLXMRglm"), function(object) { if (object@family == "Gamma") return(FALSE) TRUE }) setMethod("existGradient", signature(object = "FLXMRglmfix"), function(object) FALSE) setMethod("existGradient", signature(object = "FLXP"), function(object) TRUE) setMethod("FLXgradlogLikfun", signature(object="FLXMRglm"), function(object, components, weights, ...) { lapply(seq_along(components), function(k) { res <- if (object@family == "binomial") as.vector(object@y[,1] - rowSums(object@y)*components[[k]]@predict(object@x)) else as.vector(object@y - components[[k]]@predict(object@x)) Scores <- weights[,k] * res * object@x if (object@family == "gaussian") { Scores <- cbind(Scores/components[[k]]@parameters$sigma^2, weights[,k] * (-1 + res^2/components[[k]]@parameters$sigma^2)) } Scores }) }) setMethod("FLXgradlogLikfun", signature(object="FLXP"), function(object, fitted, weights, ...) { Pi <- lapply(seq_len(ncol(fitted))[-1], function(i) - fitted[,i] + weights[,i]) lapply(Pi, function(p) apply(object@x, 2, "*", p)) }) setMethod("refit", signature(object = "flexmix"), function(object, newdata, method = c("optim", "mstep"), ...) { method <- match.arg(method) if (method == "optim") { VarCov <- VarianceCovariance(object, ...) z <- new("FLXRoptim", call=sys.call(-1), k = object@k, coef = VarCov$coef, vcov = VarCov$vcov) z@components <- lapply(seq_along(object@model), function(m) { begin_name <- paste("^model", m, sep = ".") indices <- grep(begin_name, names(z@coef)) refit_optim(object@model[[m]], components = lapply(object@components, "[[", m), coef = z@coef[indices], se = sqrt(diag(z@vcov)[indices])) }) z@concomitant <- if (object@k > 1) { indices <- grep("^concomitant_", names(z@coef)) refit_optim(object@concomitant, coef = z@coef[indices], se = sqrt(diag(z@vcov)[indices])) } else NULL } else { z <- new("FLXRmstep", call=sys.call(-1), k = object@k) z@components <- lapply(object@model, function(x) { x <- refit_mstep(x, weights=object@posterior$scaled) names(x) <- paste("Comp", seq_len(object@k), sep=".") x }) z@concomitant <- if (object@k > 1) refit_mstep(object@concomitant, posterior = object@posterior$scaled, group = object@group, w = object@weights) else NULL } z }) setMethod("refit_optim", signature(object = "FLXM"), function(object, components, coef, se) { Design <- FLXgetDesign(object, components) x <- lapply(seq_len(nrow(Design)), function(k) { rval <- cbind(Estimate = coef[as.logical(Design[k,])], "Std. Error" = se[as.logical(Design[k,])]) pars <- components[[k]]@parameters[[1]] rval <- rval[seq_along(pars),,drop=FALSE] rownames(rval) <- names(pars) zval <- rval[,1]/rval[,2] new("Coefmat", cbind(rval, "z value" = zval, "Pr(>|z|)" = 2 * pnorm(abs(zval), lower.tail = FALSE))) }) names(x) <- paste("Comp", seq_along(x), sep = ".") x }) setMethod("refit_optim", signature(object = "FLXMC"), function(object, components, coef, se) { Design <- FLXgetDesign(object, components) if (object@dist == "mvnorm") { p <- length(grep("Comp.1_center", colnames(Design), fixed = TRUE)) diagonal <- get("diagonal", environment(object@fit)) if (diagonal) { cov <- diag(seq_len(p)) coef_comp <- as.vector(sapply(seq_len(nrow(Design)), function(i) c(coef[(i-1) * 2 * p + seq_len(p)], as.vector(diag(diag(coef[(i-1) * 2 * p + p + seq_len(p)])))))) coef <- c(coef_comp, coef[(nrow(Design) * 2 * p + 1):length(coef)]) se_comp <- as.vector(sapply(seq_len(nrow(Design)), function(i) c(se[(i-1) * 2 * p + seq_len(p)], as.vector(diag(diag(se[(i-1) * 2 * p + p + seq_len(p)])))))) se <- c(se_comp, se[(nrow(Design) * 2 * p + 1):length(se)]) } else { cov <- matrix(NA, nrow = p, ncol = p) cov[lower.tri(cov, diag = TRUE)] <- seq_len(sum(lower.tri(cov, diag = TRUE))) cov[upper.tri(cov)] <- t(cov)[upper.tri(cov)] coef <- coef[c(as.vector(sapply(seq_len(nrow(Design)), function(i) (i-1)*(max(cov)+p) + c(seq_len(p), as.vector(cov) + p))), (nrow(Design) * (max(cov) + p)+1):length(coef))] se <- se[c(as.vector(sapply(seq_len(nrow(Design)), function(i) (i-1)*(max(cov)+p) + c(seq_len(p), as.vector(cov) + p))), (nrow(Design) * (max(cov) + p)+1):length(se))] } } callNextMethod(object = object, components = components, coef = coef, se = se) }) setMethod("refit_optim", signature(object = "FLXP"), function(object, coef, se) { x <- lapply(seq_len(ncol(object@coef))[-1], function(k) { indices <- grep(paste("Comp", k, sep = "."), names(coef)) rval <- cbind(Estimate = coef[indices], "Std. Error" = se[indices]) rval <- rval[seq_len(nrow(object@coef)),,drop=FALSE] rownames(rval) <- rownames(object@coef) zval <- rval[,1]/rval[,2] new("Coefmat", cbind(rval, "z value" = zval, "Pr(>|z|)" = 2 * pnorm(abs(zval), lower.tail = FALSE))) }) names(x) <- paste("Comp", 1 + seq_along(x), sep = ".") x }) setMethod("FLXgetDesign", signature(object = "FLXM"), function(object, components, ...) { parms <- lapply(components, function(x) unlist(slot(x, "parameters"))) nr_parms <- sapply(parms, length) cumSum <- cumsum(c(0, nr_parms)) Design <- t(sapply(seq_len(length(cumSum)-1), function(i) rep(c(0, 1, 0), c(cumSum[i], nr_parms[i], max(cumSum) - cumSum[i] - nr_parms[i])))) colnames(Design) <- paste(rep(paste("Comp", seq_len(nrow(Design)), sep = "."), nr_parms), unlist(lapply(parms, names)), sep = "_") Design }) setMethod("FLXgetDesign", signature(object = "FLXMRglmfix"), function(object, components, ...) { if (length(components) == 1) return(callNextMethod(object, components, ...)) Design <- object@design if (object@family == "gaussian") { cumSum <- cumsum(c(0, object@variance)) variance <- matrix(sapply(seq_len(length(cumSum)-1), function(i) rep(c(0, 1, 0), c(cumSum[i], object@variance[i], length(components) - cumSum[i] - object@variance[i]))), nrow = length(components)) colnames(variance) <- paste("Comp", apply(variance, 2, function(x) which(x == 1)[1]), "sigma", sep= ".") Design <- cbind(Design, variance) } Design }) ###********************************************************* setMethod("refit_mstep", signature(object="FLXM"), function(object, newdata, weights, ...) { lapply(seq_len(ncol(weights)), function(k) object@fit(object@x, object@y, weights[,k], ...)@parameters) }) setMethod("refit_mstep", signature(object="FLXMRglm"), function(object, newdata, weights, ...) { lapply(seq_len(ncol(weights)), function(k) { fit <- object@refit(object@x, object@y, weights[,k], ...) fit <- c(fit, list(formula = object@fullformula, terms = object@terms, contrasts = object@contrasts, xlevels = object@xlevels)) class(fit) <- c("glm", "lm") fit }) }) ###********************************************************** setMethod("fitted", signature(object="flexmix"), function(object, drop=TRUE, aggregate = FALSE, ...) { x<- list() for(m in seq_along(object@model)) { comp <- lapply(object@components, "[[", m) x[[m]] <- fitted(object@model[[m]], comp, ...) } if (aggregate) { group <- group(object) prior_weights <- determinePrior(object@prior, object@concomitant, group)[as.integer(group),] z <- lapply(x, function(z) matrix(rowSums(do.call("cbind", z) * prior_weights), nrow = nrow(z[[1]]))) if(drop && all(lapply(z, ncol)==1)){ z <- sapply(z, unlist) } } else { z <- list() for (k in seq_len(object@k)) { z[[k]] <- do.call("cbind", lapply(x, "[[", k)) } names(z) <- paste("Comp", seq_len(object@k), sep=".") if(drop && all(lapply(z, ncol)==1)){ z <- sapply(z, unlist) } } z }) setMethod("fitted", signature(object="FLXM"), function(object, components, ...) { lapply(components, function(z) z@predict(object@x)) }) setMethod("predict", signature(object="FLXM"), function(object, newdata, components, ...) { object <- FLXgetModelmatrix(object, newdata, formula = object@fullformula, lhs = FALSE) z <- list() for(k in seq_along(components)) z[[k]] <- components[[k]]@predict(object@x, ...) z }) ###********************************************************** setMethod("Lapply", signature(object="FLXRmstep"), function(object, FUN, model = 1, component = TRUE, ...) { X <- object@components[[model]] lapply(X[component], FUN, ...) }) ###********************************************************* setMethod("refit_mstep", signature(object="flexmix", newdata="listOrdata.frame"), function(object, newdata, ...) { z <- new("FLXR", call=sys.call(-1), k = object@k) z@components <- lapply(object@model, function(x) { x <- refit_mstep(x, newdata = newdata, weights=posterior(object, newdata = newdata)) names(x) <- paste("Comp", seq_len(object@k), sep=".") x }) z@concomitant <- if (object@k > 1) refit_mstep(object@concomitant, newdata, object@posterior$scaled, object@group, w = object@weights) else NULL z }) setMethod("refit_mstep", signature(object="FLXMRglm", newdata="listOrdata.frame"), function(object, newdata, weights, ...) { w <- weights lapply(seq_len(ncol(w)), function(k) { newdata$weights <- weights <- w[,k] weighted.glm(formula = object@fullformula, data = newdata, family = object@family, weights = weights, ...) }) }) weighted.glm <- function(weights, ...) { fit <- eval(as.call(c(as.symbol("glm"), c(list(...), list(weights = weights, x = TRUE))))) fit$df.null <- sum(weights) + fit$df.null - fit$df.residual - fit$rank fit$df.residual <- sum(weights) - fit$rank fit$method <- "weighted.glm.fit" fit } weighted.glm.fit <- function(x, y, weights, offset = NULL, family = "gaussian", ...) { if (!is.function(family) & !is(family, "family")) family <- get(family, mode = "function", envir = parent.frame()) fit <- c(glm.fit(x, y, weights = weights, offset=offset, family=family), list(call = sys.call(), offset = offset, control = eval(formals(glm.fit)$control), method = "weighted.glm.fit")) fit$df.null <- sum(weights) + fit$df.null - fit$df.residual - fit$rank fit$df.residual <- sum(weights) - fit$rank fit$x <- x fit } flexmix/R/flxmcmvpois.R0000644000175100001440000000153712653423105014646 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: flxmcmvpois.R 5079 2016-01-31 12:21:12Z gruen $ # FLXMCmvpois <- function(formula=.~.) { z <- new("FLXMC", weighted=TRUE, formula=formula, dist="mvpois", name="model-based Poisson clustering") z@preproc.y <- function(x){ storage.mode(x) <- "integer" x } z@defineComponent <- function(para) { logLik <- function(x, y){ colSums(dpois(t(y), para$lambda, log=TRUE)) } predict <- function(x, ...){ matrix(para$lambda, nrow = nrow(x), ncol=length(para$lambda), byrow=TRUE) } new("FLXcomponent", parameters=list(lambda=para$lambda), df=para$df, logLik=logLik, predict=predict) } z@fit <- function(x, y, w, ...){ z@defineComponent(list(lambda = colSums(w*y)/sum(w), df = ncol(y))) } z } flexmix/R/allClasses.R0000644000175100001440000002277113674410741014376 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: allClasses.R 5185 2020-06-23 13:24:06Z gruen $ # setClass("FLXcontrol", representation(iter.max="numeric", minprior="numeric", tolerance="numeric", verbose="numeric", classify="character", nrep="numeric"), prototype(iter.max=200, minprior=0.05, tolerance=10e-7, verbose=0, classify="auto", nrep=1), validity=function(object) { (object@iter.max > 0) }) setAs("list", "FLXcontrol", function(from, to){ z = list2object(from, to) z@classify = match.arg(z@classify, c("auto", "weighted", "hard", "random", "SEM", "CEM")) z }) setAs("NULL", "FLXcontrol", function(from, to){ new(to) }) ###********************************************************** setClassUnion("expressionOrfunction", c("expression", "function")) setClass("FLXM", representation(fit="function", defineComponent="expressionOrfunction", weighted="logical", name="character", formula="formula", fullformula="formula", x="matrix", y="ANY", terms="ANY", xlevels="ANY", contrasts="ANY", preproc.x="function", preproc.y="function", "VIRTUAL"), prototype(formula=.~., fullformula=.~., preproc.x = function(x) x, preproc.y = function(x) x)) ## model-based clustering setClass("FLXMC", representation(y="matrix", dist="character"), contains = "FLXM") ## regression setClass("FLXMR", representation(y="matrix", offset="ANY"), contains = "FLXM") setMethod("show", "FLXM", function(object){ cat("FlexMix model of type", object@name,"\n\nformula: ") print(object@formula) cat("Weighted likelihood possible:", object@weighted,"\n\n") if(!is.null(object@x) && nrow(object@x)>0){ cat("Regressors:\n") print(summary(object@x)) } if(!is.null(object@y) && nrow(object@y)>0){ cat("Response:\n") print(summary(object@y)) } cat("\n") }) setClass("FLXcomponent", representation(df="numeric", logLik="function", parameters="list", predict="function")) setMethod("show", "FLXcomponent", function(object){ if(length(object@parameters)>0) print(object@parameters) }) ###********************************************************** setClass("FLXP", representation(name="character", formula="formula", x="matrix", fit="function", refit="function", coef="matrix", df="function"), prototype(formula=~1, df = function(x, k, ...) (k-1)*ncol(x))) setMethod("initialize", signature(.Object="FLXP"), function(.Object, ...) { .Object <- callNextMethod(.Object=.Object, ...) if (is.null(formals(.Object@refit))) .Object@refit <- .Object@fit .Object }) setClass("FLXPmultinom", contains="FLXP") setMethod("show", "FLXP", function(object){ cat("FlexMix concomitant model of type", object@name,"\n\nformula: ") print(object@formula) if(!is.null(object@x) && nrow(object@x)>0){ cat("\nRegressors:\n") print(summary(object@x)) } cat("\n") }) ###********************************************************** setClass("FLXdist", representation(model="list", prior="numeric", components="list", concomitant="FLXP", formula="formula", call="call", k="integer"), validity=function(object) { (object@k == length(object@prior)) }, prototype(formula=.~.)) setClass("flexmix", representation(posterior="ANY", weights="ANY", iter="numeric", cluster="integer", logLik="numeric", df="numeric", control="FLXcontrol", group="factor", size="integer", converged="logical", k0="integer"), prototype(group=(factor(integer(0))), formula=.~.), contains="FLXdist") setMethod("show", "flexmix", function(object){ cat("\nCall:", deparse(object@call,0.75*getOption("width")), sep="\n") cat("\nCluster sizes:\n") print(object@size) cat("\n") if(!object@converged) cat("no ") cat("convergence after", object@iter, "iterations\n") }) ###********************************************************** setClass("summary.flexmix", representation(call="call", AIC="numeric", BIC="numeric", logLik="logLik", comptab="ANY")) setMethod("show", "summary.flexmix", function(object){ cat("\nCall:", deparse(object@call,0.75*getOption("width")), sep="\n") cat("\n") print(object@comptab, digits=3) cat("\n") print(object@logLik) cat("AIC:", object@AIC, " BIC:", object@BIC, "\n") cat("\n") }) ###********************************************************** setClass("FLXMRglm", representation(family="character", refit="function"), contains="FLXMR") setClass("FLXR", representation(k="integer", components = "list", concomitant = "ANY", call="call", "VIRTUAL")) setClass("FLXRoptim", representation(coef="vector", vcov="matrix"), contains="FLXR") setClass("FLXRmstep", contains="FLXR") setMethod("show", signature(object = "FLXR"), function(object) { cat("\nCall:", deparse(object@call,0.75*getOption("width")), sep="\n") cat("\nNumber of components:", object@k, "\n\n") }) setMethod("summary", signature(object = "FLXRoptim"), function(object, model = 1, which = c("model", "concomitant"), ...) { which <- match.arg(which) z <- if (which == "model") object@components[[model]] else object@concomitant show(z) invisible(object) }) setMethod("summary", signature(object = "FLXRmstep"), function(object, model = 1, which = c("model", "concomitant"), ...) { which <- match.arg(which) if (which == "model") { z <- object@components[[model]] if (!is.null(z)) lapply(seq_along(z), function(k) { cat(paste("$", names(z)[k], "\n", sep = "")) printCoefmat(coef(summary(z[[k]]))) cat("\n") }) } else { z <- object@concomitant fitted.summary <- summary(z) k <- nrow(coef(fitted.summary)) + 1 coefs <- lapply(2:k, function(n) { coef.p <- fitted.summary$coefficients[n - 1, , drop = FALSE] s.err <- fitted.summary$standard.errors[n - 1, , drop = FALSE] tvalue <- coef.p/s.err pvalue <- 2 * pnorm(-abs(tvalue)) coef.table <- t(rbind(coef.p, s.err, tvalue, pvalue)) dimnames(coef.table) <- list(colnames(coef.p), c("Estimate", "Std. Error", "z value", "Pr(>|z|)")) new("Coefmat", coef.table) }) names(coefs) <- paste("Comp", 2:k, sep = ".") print(coefs) } invisible(object) }) setClass("Coefmat", contains = "matrix") setMethod("show", signature(object="Coefmat"), function(object) { printCoefmat(object, signif.stars = getOption("show.signif.stars")) }) ###********************************************************** setClass("FLXnested", representation(formula = "list", k = "numeric"), validity = function(object) { length(object@formula) == length(object@k) }) setAs("numeric", "FLXnested", function(from, to) { new("FLXnested", formula = rep(list(~0), length(from)), k = from) }) setAs("list", "FLXnested", function(from, to) { z <- list2object(from, to) }) setAs("NULL", "FLXnested", function(from, to) { new(to) }) setMethod("initialize", "FLXnested", function(.Object, formula = list(), k = numeric(0), ...) { if (is(formula, "formula")) formula <- rep(list(formula), length(k)) .Object <- callNextMethod(.Object, formula = formula, k = k, ...) .Object }) ###********************************************************** setClass("FLXMRfix", representation(design = "matrix", nestedformula = "FLXnested", fixed = "formula", segment = "matrix", variance = "vector"), contains="FLXMR") setClass("FLXMRglmfix", contains=c("FLXMRfix", "FLXMRglm")) ###********************************************************** setClassUnion("listOrdata.frame", c("list", "data.frame")) ###********************************************************** flexmix/R/condlogit.R0000644000175100001440000000553212653423105014260 0ustar hornikuserssetClass("FLXMRcondlogit", representation(strata="ANY", strata_formula="ANY"), contains = "FLXMRglm") FLXMRcondlogit <- function(formula=.~., strata) { z <- new("FLXMRcondlogit", weighted=TRUE, formula=formula, strata_formula=strata, family="multinomial", name=paste("FLXMRcondlogit")) z@defineComponent <- function(para) { predict <- function(x, ...) tcrossprod(x, t(para$coef)) logLik <- function(x, y, strata) { llh_all <- vector("numeric", length = length(y)) eta <- predict(x) llh_all[as.logical(y)] <- eta[as.logical(y)] ((tapply(llh_all, strata, sum) - tapply(exp(eta), strata, function(z) log(sum(z))))/tabulate(strata))[strata] } new("FLXcomponent", parameters=list(coef=para$coef), logLik=logLik, predict=predict, df=para$df) } z@fit <- function(x, y, w, strata){ index <- w > 0 fit <- survival::coxph.fit(x[index,,drop=FALSE], survival::Surv(1-y, y)[index], strata[index], weights=w[index], control = survival::coxph.control(), method = "exact", rownames = seq_len(nrow(y))[index]) coef <- coef(fit) df <- length(coef) z@defineComponent(list(coef = coef, df = df)) } z } setMethod("FLXgetModelmatrix", signature(model="FLXMRcondlogit"), function(model, data, formula, lhs=TRUE, ...) { formula <- RemoveGrouping(formula) if(is.null(model@formula)) model@formula = formula model@fullformula = update(terms(formula, data=data), model@formula) ## Ensure that an intercept is included model@fullformula <- update(model@fullformula, ~ . + 1) if (lhs) { mf <- model.frame(model@fullformula, data=data, na.action = NULL) model@x <- model.matrix(attr(mf, "terms"), data=mf) response <- as.matrix(model.response(mf)) model@y <- model@preproc.y(response) } else { mt1 <- terms(model@fullformula, data=data) mf <- model.frame(delete.response(mt1), data=data, na.action = NULL) mt <- attr(mf, "terms") model@x <- model.matrix(mt, data=mf) } strata <- update(model@strata_formula, ~ . + 0) mf <- model.frame(strata, data=data, na.action=NULL) model@strata <- as.integer(model.matrix(attr(mf, "terms"), data=mf)) ## Omit the intercept for identifiability model@x <- model@x[,attr(model@x, "assign") != 0, drop=FALSE] model@x <- model@preproc.x(model@x) model }) setMethod("FLXmstep", signature(model = "FLXMRcondlogit"), function(model, weights, ...) { apply(weights, 2, function(w) model@fit(model@x, model@y, w, model@strata)) }) setMethod("FLXdeterminePostunscaled", signature(model = "FLXMRcondlogit"), function(model, components, ...) { sapply(components, function(x) x@logLik(model@x, model@y, model@strata)) }) setMethod("existGradient", signature(object = "FLXMRcondlogit"), function(object) FALSE) flexmix/R/lmmc.R0000644000175100001440000006511413431544512013231 0ustar hornikuserssetClass("FLXMRlmc", representation(family = "character", group = "factor", censored = "formula", C = "matrix"), contains = "FLXMR") setClass("FLXMRlmcfix", contains = "FLXMRlmc") setClass("FLXMRlmmc", representation(random = "formula", z = "matrix", which = "ANY"), contains = "FLXMRlmc") setClass("FLXMRlmmcfix", contains = "FLXMRlmmc") setMethod("allweighted", signature(model = "FLXMRlmc", control = "ANY", weights = "ANY"), function(model, control, weights) { if (!control@classify %in% c("auto", "weighted")) stop("Model class only supports weighted ML estimation.") model@weighted }) update.Residual <- function(fit, w, z, C, which, random, censored) { index <- lapply(C, function(x) x == 1) W <- rep(w, sapply(which, function(x) nrow(z[[x]]))) ZGammaZ <- sapply(seq_along(which), function(i) sum(diag(crossprod(z[[which[i]]]) %*% random$Gamma[[i]]))) WHICH <- which(sapply(C, sum) > 0) Residual <- if (length(WHICH) > 0) sum(sapply(WHICH, function(i) w[i] * sum(diag(censored$Sigma[[i]]) - 2 * z[[which[i]]][index[[i]],,drop=FALSE] * censored$psi[[i]]))) else 0 (sum(W * residuals(fit)^2) + Residual + sum(w * ZGammaZ))/sum(W) } update.latent <- function(x, y, C, fit) { AnyMissing <- which(sapply(C, sum) > 0) index <- lapply(C, function(x) x == 1) Sig <- lapply(seq_along(x), function(i) fit$sigma2 * diag(nrow = nrow(x[[i]]))) SIGMA <- rep(list(matrix(nrow = 0, ncol = 0)), length(x)) if (length(AnyMissing) > 0) { SIGMA[AnyMissing] <- lapply(AnyMissing, function(i) { S <- Sig[[i]] SIG <- S[index[[i]], index[[i]]] if (sum(!index[[i]]) > 0) SIG <- SIG - S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% S[!index[[i]],index[[i]]] SIG }) } Sigma <- MU <- rep(list(vector("numeric", length = 0)), length(x)) if (length(AnyMissing) > 0) { MU[AnyMissing] <- lapply(AnyMissing, function(i) { S <- Sig[[i]] Mu <- x[[i]][index[[i]],,drop=FALSE] %*% fit$coef if (sum(!index[[i]]) > 0) Mu <- Mu + S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% (y[[i]][!index[[i]]] - x[[i]][!index[[i]],,drop=FALSE] %*% fit$coef) Mu }) } moments <- lapply(seq_along(x), function(i) { if (sum(index[[i]]) > 0) moments_truncated(MU[[i]], SIGMA[[i]], y[[i]][C[[i]] == 1]) }) Sigma <- lapply(moments, "[[", "variance") censored <- list(mu = lapply(moments, "[[", "mean"), Sigma = Sigma) list(censored = censored) } update.latent.random <- function(x, y, z, C, which, fit) { index <- lapply(C, function(x) x == 1) AnyMissing <- which(sapply(C, sum) > 0) Residual <- fit$sigma2$Residual Psi <- fit$sigma2$Random EVbeta <- lapply(seq_along(z), function(i) solve(1/Residual * crossprod(z[[i]]) + solve(Psi))) Sig <- lapply(seq_along(z), function(i) z[[i]] %*% Psi %*% t(z[[i]]) + Residual * diag(nrow = nrow(z[[i]]))) SIGMA <- rep(list(matrix(nrow = 0, ncol = 0)), length(x)) if (length(AnyMissing) > 0) { SIGMA[AnyMissing] <- lapply(AnyMissing, function(i) { S <- Sig[[which[i]]] SIG <- S[index[[i]], index[[i]]] if (sum(!index[[i]]) > 0) SIG <- SIG - S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% S[!index[[i]],index[[i]]] SIG }) } Sigma <- MU <- rep(list(vector("numeric", length = 0)), length(x)) if (length(AnyMissing) > 0) { MU[AnyMissing] <- lapply(AnyMissing, function(i) { S <- Sig[[which[i]]] Mu <- x[[i]][index[[i]],,drop=FALSE] %*% fit$coef if (sum(!index[[i]]) > 0) { Mu <- Mu + S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% (y[[i]][!index[[i]]] - x[[i]][!index[[i]],,drop=FALSE] %*% fit$coef) } Mu }) } moments <- lapply(seq_along(x), function(i) { if (sum(index[[i]]) > 0) moments_truncated(MU[[i]], SIGMA[[i]], y[[i]][C[[i]] == 1]) }) Sigma <- lapply(moments, "[[", "variance") censored <- list(mu = lapply(moments, "[[", "mean"), Sigma = Sigma, psi = lapply(seq_along(x), function(i) { if (sum(index[[i]]) > 0) return(diag(Sigma[[i]] %*% z[[which[i]]][index[[i]],,drop=FALSE] %*% EVbeta[[which[i]]])/Residual) else return(vector("numeric", length = 0)) })) ybar <- lapply(seq_along(y), function(i) { Y <- y[[i]] Y[index[[i]]] <- censored$mu[[i]] Y }) random <- list(beta = lapply(seq_along(x), function(i) EVbeta[[which[i]]] %*% t(z[[which[i]]]) %*% (ybar[[i]] - x[[i]] %*% fit$coef)/Residual), Gamma = lapply(seq_along(x), function(i) { if (sum(index[[i]]) > 0) { return(EVbeta[[which[i]]] + (EVbeta[[which[i]]] %*% (t(z[[which[i]]][index[[i]],,drop=FALSE]) %*% censored$Sigma[[i]] %*% z[[which[i]]][index[[i]],,drop=FALSE]) %*% t(EVbeta[[which[i]]]))/Residual^2) } else return(EVbeta[[which[i]]]) })) list(random = random, censored = censored) } moments_truncated <- function(mu, Sigma, T, ...) { Sigma <- as.matrix(Sigma) mu <- as.vector(mu) T <- as.vector(T) S <- 1/sqrt(diag(Sigma)) T1 <- S * (T - mu) if (length(mu) == 1) { alpha <- pnorm(T1) dT1 <- dnorm(T1) Ex <- - dT1 / alpha Ex2 <- 1 - T1 * dT1 / alpha } else { R <- S * Sigma * rep(S, each = ncol(Sigma)) diag(R) <- 1L alpha <- mvtnorm::pmvnorm(upper = T1, sigma = R, ...) rq <- lapply(seq_along(T1), function(q) (R - tcrossprod(R[,q]))) R2 <- R^2 Vq <- 1 - R2 Sq <- sqrt(Vq) Rq <- lapply(seq_along(T1), function(q) rq[[q]]/(tcrossprod(Sq[,q]))) Tq <- lapply(seq_along(T1), function(q) (T1 - R[,q] * T1[q])/Sq[,q]) Phiq <- if (length(mu) == 1) 1 else sapply(seq_along(Rq), function(q) mvtnorm::pmvnorm(upper = Tq[[q]][-q], sigma = Rq[[q]][-q,-q], ...)) phi_Phiq <- dnorm(T1) * Phiq Ex <- - (R %*% phi_Phiq)/alpha T2_entries <- lapply(seq_along(T1), function(j) sapply(lapply(seq_along(T1)[seq_len(j)], function(i) R[,i] * T1 * phi_Phiq), function(z) sum(z * R[j,]))) T2 <- diag(length(T1)) T2[upper.tri(T2, diag = TRUE)] <- unlist(T2_entries) T2[lower.tri(T2)] <- t(T2)[lower.tri(T2)] phiqr <- lapply(seq_along(T1), function(q) sapply(seq_along(T1), function(r) { if (r == q) return(0) else return(mvtnorm::dmvnorm(T1[c(q, r)], mean = rep(0, length.out = length(c(q,r))), sigma = R[c(q,r), c(q,r)]))})) if (length(mu) == 2) { Ex2 <- R - T2 / alpha + Reduce("+", lapply(seq_along(Tq), function(q) tcrossprod(R[q,], rowSums(sapply(seq_along(Tq)[-q], function(r) phiqr[[q]][r] * (R[,r] - R[q,r] * R[q,])))))) / alpha } else { betaq <- lapply(seq_along(T1), function(q) sweep(rq[[q]], 2, Vq[,q], "/")) Rqr <- lapply(seq_along(T1), function(q) lapply(seq_along(T1), function(r) if (r == q) return(0) else return((Rq[[q]][-c(q,r),-c(q,r)] - tcrossprod(Rq[[q]][-c(q,r),r]))/tcrossprod(sqrt(1 - Rq[[q]][-c(q,r),r]^2))))) Tqr <- lapply(seq_along(T1), function(q) { lapply(seq_along(T1), function(r) if (r == q) return(0) else return((T1[-c(q,r)] - betaq[[r]][-c(r,q),q] * T1[q] - betaq[[q]][-c(r,q),r] * T1[r])/ (Sq[-c(r,q),q] * sqrt(1 - Rq[[q]][-c(r,q),r]^2))))}) T3 <- Reduce("+", lapply(seq_along(Tq), function(q) tcrossprod(R[q,], rowSums(sapply(seq_along(Tq)[-q], function(r) phiqr[[q]][r] * (R[,r] - R[q,r] * R[q,]) * mvtnorm::pmvnorm(upper = Tqr[[q]][[r]], sigma = Rqr[[q]][[r]], ...)))))) / alpha Ex2 <- R - T2 / alpha + 1/2 * (T3 + t(T3)) } } moments <- list(mean = 1/S * Ex + mu, variance = diag(1/S, nrow = length(T)) %*% (Ex2 - tcrossprod(Ex)) %*% diag(1/S, nrow = length(T))) if (!all(is.finite(unlist(moments))) || any(moments$mean > T) || any(eigen(moments$variance)$values < 0)) { moments <- list(mean = T - abs(diag(Sigma)), variance = Sigma) } moments } FLXMRlmmc <- function(formula = . ~ ., random, censored, varFix, eps = 10^-6, ...) { family <- "gaussian" censored <- if (length(censored) == 3) censored else formula(paste(".", paste(deparse(censored), collapse = ""))) if (missing(random)) { if (missing(varFix)) varFix <- FALSE else if ((length(varFix) > 1) || (is.na(as.logical(varFix)))) stop("varFix has to be a logical vector of length one") object <- new("FLXMRlmc", formula = formula, censored = censored, weighted = TRUE, family = family, name = "FLXMRlmc:gaussian") if (varFix) object <- new("FLXMRlmcfix", object) lmc.wfit <- function(x, y, w, C, censored) { W <- rep(w, sapply(x, nrow)) X <- do.call("rbind", x) AnyMissing <- which(sapply(C, sum) > 0) ybar <- lapply(seq_along(y), function(i) { Y <- y[[i]] Y[C[[i]] == 1] <- censored$mu[[i]] Y }) Y <- do.call("rbind", ybar) fit <- lm.wfit(X, Y, W, ...) fit$sigma2 <- if (length(AnyMissing) > 0) (sum(W * residuals(fit)^2) + sum(sapply(AnyMissing, function(i) w[i] * sum(diag(censored$Sigma[[i]])))))/sum(W) else sum(W * residuals(fit)^2)/sum(W) fit$df <- ncol(X) fit } object@defineComponent <- function(para) { predict <- function(x, ...) lapply(x, function(X) X %*% para$coef) logLik <- function(x, y, C, group, censored, ...) { AnyMissing <- which(sapply(C, sum) > 0) index <- lapply(C, function(x) x == 1) V <- lapply(x, function(X) diag(nrow(X)) * para$sigma2) mu <- predict(x, ...) SIGMA <- rep(list(matrix(nrow = 0, ncol = 0)), length(x)) if (length(AnyMissing) > 0) { SIGMA[AnyMissing] <- lapply(AnyMissing, function(i) { S <- V[[i]] SIG <- S[index[[i]], index[[i]]] if (sum(!index[[i]]) > 0) SIG <- SIG - S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% S[!index[[i]],index[[i]]] SIG }) } MU <- rep(list(vector("numeric", length = 0)), length(x)) if (length(AnyMissing) > 0) { MU[AnyMissing] <- lapply(AnyMissing, function(i) { S <- V[[i]] Mu <- mu[[i]][index[[i]]] if (sum(!index[[i]]) > 0) Mu <- Mu + S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% (y[[i]][!index[[i]]] - mu[[i]][!index[[i]]]) Mu }) } llh <- sapply(seq_along(x), function(i) { LLH <- 0 if (sum(index[[i]]) > 0) LLH <- log(mvtnorm::pmvnorm(upper = y[[i]][index[[i]]], mean = as.vector(MU[[i]]), sigma = SIGMA[[i]])) if (sum(!index[[i]]) > 0) LLH <- LLH + mvtnorm::dmvnorm(t(y[[i]][!index[[i]]]), mean = mu[[i]][!index[[i]]], sigma = V[[i]][!index[[i]], !index[[i]], drop = FALSE], log=TRUE) LLH/nrow(V[[i]]) }) as.vector(ungroupPriors(matrix(llh), group, !duplicated(group))) } new("FLXcomponent", parameters = list(coef = para$coef, sigma2 = para$sigma2, censored = para$censored), logLik = logLik, predict = predict, df = para$df) } object@fit <- if (varFix) { function(x, y, w, C, fit) { any_removed <- any(w <= eps) if (any_removed) { ok <- apply(w, 2, function(x) x > eps) W <- lapply(seq_len(ncol(ok)), function(i) w[ok[,i],i]) X <- lapply(seq_len(ncol(ok)), function(i) x[ok[,i],,drop = FALSE]) y <- lapply(seq_len(ncol(ok)), function(i) y[ok[,i]]) C <- lapply(seq_len(ncol(ok)), function(i) C[ok[,i]]) } else { X <- rep(list(x), ncol(w)) y <- rep(list(y), ncol(w)) C <- rep(list(C), ncol(w)) W <- lapply(seq_len(ncol(w)), function(i) w[,i]) } if ("coef" %in% names(fit[[1]])) fit <- lapply(seq_len(ncol(w)), function(k) update.latent(X[[k]], y[[k]], C[[k]], fit[[k]])) else { fit <- lapply(seq_len(ncol(w)), function(k) list(censored = list(mu = lapply(seq_along(y[[k]]), function(i) y[[k]][[i]][C[[k]][[i]] == 1]), Sigma = lapply(C[[k]], function(x) diag(1, nrow = sum(x)) * var(unlist(y[[k]])))))) } fit <- lapply(seq_len(ncol(w)), function(k) c(lmc.wfit(X[[k]], y[[k]], W[[k]], C[[k]], fit[[k]]$censored), censored = list(fit[[k]]$censored))) sigma2 <- sum(sapply(fit, function(x) x$sigma2) * colMeans(w)) for (k in seq_len(ncol(w))) fit[[k]]$sigma2 <- sigma2 lapply(fit, function(Z) object@defineComponent(list(coef = coef(Z), df = Z$df + 1/ncol(w), sigma2 = Z$sigma2, censored = Z$censored))) } } else { function(x, y, w, C, fit){ any_removed <- any(w <= eps) if (any_removed) { ok <- w > eps w <- w[ok] x <- x[ok,,drop = FALSE] y <- y[ok] C <- C[ok] } if ("coef" %in% names(fit)) { fit <- update.latent(x, y, C, fit) } else { fit$censored <- list(mu = lapply(seq_along(y), function(i) y[[i]][C[[i]] == 1]), Sigma = lapply(C, function(x) diag(1, nrow = sum(x)) * var(unlist(y)))) } fit <- c(lmc.wfit(x, y, w, C, fit$censored), censored = list(fit$censored)) object@defineComponent( list(coef = coef(fit), df = fit$df + 1, sigma2 = fit$sigma2, censored = fit$censored)) } } } else { if (missing(varFix)) varFix <- c(Random = FALSE, Residual = FALSE) else if (length(varFix) != 2 || is.null(names(varFix)) || any(is.na(pmatch(names(varFix), c("Random", "Residual"))))) stop("varFix has to be a named vector of length two") else names(varFix) <- c("Random", "Residual")[pmatch(names(varFix), c("Random", "Residual"))] random <- if (length(random) == 3) random else formula(paste(".", paste(deparse(random), collapse = ""))) object <- new("FLXMRlmmc", formula = formula, random = random, censored = censored, weighted = TRUE, family = family, name = "FLXMRlmmc:gaussian") if (any(varFix)) object <- new("FLXMRlmmcfix", object) add <- function(x) Reduce("+", x) lmmc.wfit <- function(x, y, w, z, C, which, random, censored) { effect <- lapply(seq_along(which), function(i) z[[which[i]]] %*% random$beta[[i]]) Effect <- do.call("rbind", effect) W <- rep(w, sapply(x, nrow)) X <- do.call("rbind", x) ybar <- lapply(seq_along(y), function(i) { Y <- y[[i]] Y[C[[i]] == 1] <- censored$mu[[i]] Y }) Y <- do.call("rbind", ybar) fit <- lm.wfit(X, Y - Effect, W, ...) wGamma <- add(lapply(seq_along(which), function(i) w[i] * random$Gamma[[i]])) bb <- add(lapply(seq_along(which), function(i) tcrossprod(random$beta[[i]]) * w[i])) fit$sigma2 <- list(Random = (wGamma + bb)/sum(w)) fit$df <- ncol(X) fit } object@defineComponent <- function(para) { predict <- function(x, ...) lapply(x, function(X) X %*% para$coef) logLik <- function(x, y, z, C, which, group, censored, ...) { AnyMissing <- which(sapply(C, sum) > 0) index <- lapply(C, function(x) x == 1) V <- lapply(z, function(Z) tcrossprod(tcrossprod(Z, para$sigma2$Random), Z) + diag(nrow(Z)) * para$sigma2$Residual) mu <- predict(x, ...) SIGMA <- rep(list(matrix(nrow = 0, ncol = 0)), length(x)) if (length(AnyMissing) > 0) { SIGMA[AnyMissing] <- lapply(AnyMissing, function(i) { S <- V[[which[i]]] SIG <- S[index[[i]], index[[i]]] if (sum(!index[[i]]) > 0) SIG <- SIG - S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% S[!index[[i]],index[[i]]] SIG }) } MU <- rep(list(vector("numeric", length = 0)), length(x)) if (length(AnyMissing) > 0) { MU[AnyMissing] <- lapply(AnyMissing, function(i) { S <- V[[which[i]]] Mu <- mu[[i]][index[[i]]] if (sum(!index[[i]]) > 0) Mu <- Mu + S[index[[i]],!index[[i]]] %*% solve(S[!index[[i]],!index[[i]]]) %*% (y[[i]][!index[[i]]] - mu[[i]][!index[[i]]]) Mu }) } llh <- sapply(seq_along(x), function(i) { LLH <- 0 if (sum(index[[i]]) > 0) LLH <- log(mvtnorm::pmvnorm(upper = y[[i]][index[[i]]], mean = as.vector(MU[[i]]), sigma = SIGMA[[i]])) if (sum(!index[[i]]) > 0) LLH <- LLH + mvtnorm::dmvnorm(t(y[[i]][!index[[i]]]), mean = mu[[i]][!index[[i]]], sigma = V[[which[i]]][!index[[i]], !index[[i]], drop = FALSE], log=TRUE) LLH/nrow(V[[which[i]]]) }) as.vector(ungroupPriors(matrix(llh), group, !duplicated(group))) } new("FLXcomponent", parameters = list(coef = para$coef, sigma2 = para$sigma2, censored = para$censored, random = para$random), logLik = logLik, predict = predict, df = para$df) } object@fit <- if (any(varFix)) { function(x, y, w, z, C, which, fit) { any_removed <- any(w <= eps) if (any_removed) { ok <- apply(w, 2, function(x) x > eps) W <- lapply(seq_len(ncol(ok)), function(i) w[ok[,i],i]) X <- lapply(seq_len(ncol(ok)), function(i) x[ok[,i],,drop = FALSE]) y <- lapply(seq_len(ncol(ok)), function(i) y[ok[,i]]) C <- lapply(seq_len(ncol(ok)), function(i) C[ok[,i]]) which <- lapply(seq_len(ncol(ok)), function(i) which[ok[,i]]) } else { X <- rep(list(x), ncol(w)) y <- rep(list(y), ncol(w)) C <- rep(list(C), ncol(w)) which <- rep(list(which), ncol(w)) W <- lapply(seq_len(ncol(w)), function(i) w[,i]) } if ("coef" %in% names(fit[[1]])) fit <- lapply(seq_len(ncol(w)), function(k) update.latent.random(X[[k]], y[[k]], z, C[[k]], which[[k]], fit[[k]])) else { fit <- lapply(seq_len(ncol(w)), function(k) list(random = list(beta = lapply(W[[k]], function(i) rep(0, ncol(z[[i]]))), Gamma = lapply(W[[k]], function(i) diag(ncol(z[[i]])))), censored = list(mu = lapply(seq_along(y[[k]]), function(i) y[[k]][[i]][C[[k]][[i]] == 1]), Sigma = lapply(C[[k]], function(x) diag(1, nrow = sum(x)) * var(unlist(y[[k]]))), psi = lapply(C[[k]], function(x) rep(0, sum(x)))))) } fit <- lapply(seq_len(ncol(w)), function(k) c(lmmc.wfit(X[[k]], y[[k]], W[[k]], z, C[[k]], which[[k]], fit[[k]]$random, fit[[k]]$censored), random = list(fit[[k]]$random), censored = list(fit[[k]]$censored))) if (varFix["Random"]) { prior_w <- apply(w, 2, weighted.mean, w = sapply(x, length)) Psi <- add(lapply(seq_len(ncol(w)), function(k) fit[[k]]$sigma2$Random * prior_w[k])) for (k in seq_len(ncol(w))) fit[[k]]$sigma2$Random <- Psi } for (k in seq_len(ncol(w))) fit[[k]]$sigma2$Residual <- update.Residual(fit[[k]], W[[k]], z, C[[k]], which[[k]], fit[[k]]$random, fit[[k]]$censored) if (varFix["Residual"]) { prior <- colMeans(w) Residual <- sum(sapply(fit[[k]]$sigma2$Residual, function(x) x) * prior) for (k in seq_len(ncol(w))) fit[[k]]$sigma2$Residual <- Residual } n <- nrow(fit[[1]]$sigma2$Random) lapply(fit, function(Z) object@defineComponent( list(coef = coef(Z), df = Z$df + n*(n+1)/(2*ifelse(varFix["Random"], ncol(w), 1)) + ifelse(varFix["Residual"], 1/ncol(w), 1), sigma2 = Z$sigma2, random = Z$random, censored = Z$censored))) } } else { function(x, y, w, z, C, which, fit){ any_removed <- any(w <= eps) if (any_removed) { ok <- w > eps w <- w[ok] x <- x[ok,,drop = FALSE] y <- y[ok] C <- C[ok] which <- which[ok] } if ("coef" %in% names(fit)) fit <- update.latent.random(x, y, z, C, which, fit) else { fit <- list(random = list(beta = lapply(which, function(i) rep(0, ncol(z[[i]]))), Gamma = lapply(which, function(i) diag(ncol(z[[i]])))), censored = list(mu = lapply(seq_along(y), function(i) y[[i]][C[[i]] == 1]), Sigma = lapply(C, function(x) diag(1, nrow = sum(x)) * var(unlist(y))), psi = lapply(C, function(x) rep(0, sum(x))))) } fit <- c(lmmc.wfit(x, y, w, z, C, which, fit$random, fit$censored), random = list(fit$random), censored = list(fit$censored)) fit$sigma2$Residual <- update.Residual(fit, w, z, C, which, fit$random, fit$censored) n <- nrow(fit$sigma2$Random) object@defineComponent( list(coef = coef(fit), df = fit$df + n*(n+1)/2 + 1, sigma2 = fit$sigma2, random = fit$random, censored = fit$censored)) } } } object } setMethod("FLXmstep", signature(model = "FLXMRlmc"), function(model, weights, components) { weights <- weights[!duplicated(model@group),,drop=FALSE] return(sapply(1:ncol(weights), function(k) model@fit(model@x, model@y, weights[,k], model@C, components[[k]]@parameters))) }) setMethod("FLXmstep", signature(model = "FLXMRlmcfix"), function(model, weights, components) { weights <- weights[!duplicated(model@group),,drop=FALSE] return(model@fit(model@x, model@y, weights, model@C, lapply(components, function(x) x@parameters))) }) setMethod("FLXmstep", signature(model = "FLXMRlmmc"), function(model, weights, components) { weights <- weights[!duplicated(model@group),,drop=FALSE] return(sapply(1:ncol(weights), function(k) model@fit(model@x, model@y, weights[,k], model@z, model@C, model@which, components[[k]]@parameters))) }) setMethod("FLXmstep", signature(model = "FLXMRlmmcfix"), function(model, weights, components) { weights <- weights[!duplicated(model@group),,drop=FALSE] return(model@fit(model@x, model@y, weights, model@z, model@C, model@which, lapply(components, function(x) x@parameters))) }) setMethod("FLXgetModelmatrix", signature(model="FLXMRlmc"), function(model, data, formula, lhs=TRUE, ...) { formula_nogrouping <- RemoveGrouping(formula) if (formula_nogrouping == formula) stop("please specify a grouping variable") model <- callNextMethod(model, data, formula, lhs) model@fullformula <- update(model@fullformula, paste(".~. |", .FLXgetGroupingVar(formula))) mt2 <- terms(model@censored, data=data) mf2 <- model.frame(delete.response(mt2), data=data, na.action = NULL) model@C <- model.matrix(attr(mf2, "terms"), data) model@group <- grouping <- .FLXgetGrouping(formula, data)$group model@x <- matrix(lapply(unique(grouping), function(g) model@x[grouping == g, , drop = FALSE]), ncol = 1) if (lhs) model@y <- matrix(lapply(unique(grouping), function(g) model@y[grouping == g, , drop = FALSE]), ncol = 1) model@C <- matrix(lapply(unique(grouping), function(g) model@C[grouping == g, , drop = FALSE]), ncol = 1) model }) setMethod("FLXgetModelmatrix", signature(model="FLXMRlmmc"), function(model, data, formula, lhs=TRUE, ...) { model <- callNextMethod(model, data, formula, lhs) mt1 <- terms(model@random, data=data) mf1 <- model.frame(delete.response(mt1), data=data, na.action = NULL) model@z <- model.matrix(attr(mf1, "terms"), data) grouping <- .FLXgetGrouping(formula, data)$group z <- matrix(lapply(unique(grouping), function(g) model@z[grouping == g, , drop = FALSE]), ncol = 1) model@z <- unique(z) model@which <- match(z, model@z) model }) setMethod("FLXgetObs", "FLXMRlmc", function(model) sum(sapply(model@x, nrow))) setMethod("FLXdeterminePostunscaled", signature(model = "FLXMRlmc"), function(model, components, ...) { sapply(components, function(x) x@logLik(model@x, model@y, model@C, model@group, x@parameters$censored)) }) setMethod("FLXdeterminePostunscaled", signature(model = "FLXMRlmmc"), function(model, components, ...) { sapply(components, function(x) x@logLik(model@x, model@y, model@z, model@C, model@which, model@group, x@parameters$censored)) }) setMethod("predict", signature(object="FLXMRlmc"), function(object, newdata, components, ...) { object <- FLXgetModelmatrix(object, newdata, formula = object@fullformula, lhs = FALSE) lapply(components, function(comp) unlist(comp@predict(object@x, ...))) }) setMethod("rFLXM", signature(model = "FLXMRlmc", components = "FLXcomponent"), function(model, components, ...) { stop("This model driver is not implemented yet.") }) flexmix/R/lmer.R0000644000175100001440000001506413431544512013237 0ustar hornikuserssigmaMethod <- getExportedValue(if(getRversion() >= "3.3.0") "stats" else "lme4", "sigma") setClass("FLXMRlmer", representation(random = "formula", lmod = "list", control = "ANY", preproc.z = "function"), prototype(preproc.z = function(x, ...) x), contains = "FLXMRglm") defineComponent_lmer <- function(para) { predict <- function(x, ...) x%*%para$coef logLik <- function(x, y, lmod, ...) { z <- as.matrix(lmod$reTrms$Zt) grouping <- lmod$reTrms$flist[[1]] llh <- vector(length=nrow(x)) for (i in seq_len(nlevels(grouping))) { index1 <- which(grouping == levels(grouping)[i]) index2 <- rownames(z) %in% levels(grouping)[i] V <- crossprod(z[index2,index1,drop=FALSE], para$sigma2$Random) %*% z[index2, index1, drop=FALSE] + diag(length(index1)) * para$sigma2$Residual llh[index1] <- mvtnorm::dmvnorm(y[index1,], mean=predict(x[index1,,drop=FALSE], ...), sigma = V, log=TRUE)/length(index1) } llh } new("FLXcomponent", parameters=list(coef=para$coef, sigma2=para$sigma2), logLik=logLik, predict=predict, df=para$df) } FLXMRlmer <- function(formula = . ~ ., random, weighted = TRUE, control = list(), eps = .Machine$double.eps) { random <- if (length(random) == 3) random else formula(paste(".", paste(deparse(random), collapse = ""))) missCtrl <- missing(control) if (missCtrl || !inherits(control, "lmerControl")) { if (!is.list(control)) stop("'control' is not a list; use lmerControl()") control <- do.call(lme4::lmerControl, control) } object <- new("FLXMRlmer", formula = formula, random = random, control = control, family = "gaussian", weighted = weighted, name = "FLXMRlmer:gaussian") if (weighted) object@preproc.z <- function(lmod) { if (length(unique(names(lmod[["reTrms"]][["flist"]]))) != 1) stop("only a single variable for random effects is allowed") for (i in seq_along(lmod[["reTrms"]][["flist"]])) { DIFF <- t(sapply(levels(lmod[["reTrms"]]$flist[[i]]), function(id) { index1 <- which(lmod[["reTrms"]]$flist[[i]] == id) index2 <- rownames(lmod[["reTrms"]]$Zt) == id sort(apply(lmod[["reTrms"]]$Zt[index2, index1, drop=FALSE], 1, paste, collapse = "")) })) if (length(unique(table(lmod[["reTrms"]][["flist"]][[i]]))) != 1 || nrow(unique(DIFF)) != 1) stop("FLXMRlmer does only work correctly if the covariates of the random effects are the same for all observations") } lmod } lmer.wfit <- function(x, y, w, lmod) { zero.weights <- any(w < eps) if (zero.weights) { ok <- w >= eps w <- w[ok] lmod[["fr"]] <- lmod[["fr"]][ok, , drop = FALSE] lmod[["X"]] <- lmod[["X"]][ok, , drop = FALSE] lmod[["reTrms"]][["Zt"]] <- lmod[["reTrms"]][["Zt"]][, ok, drop = FALSE] for (i in seq_along(lmod[["reTrms"]][["flist"]])) { lmod[["reTrms"]][["flist"]][[i]] <- lmod[["reTrms"]][["flist"]][[i]][ok] } } wts <- sqrt(w) lmod$X <- lmod$X * wts lmod$fr[[1]] <- lmod$fr[[1]] * wts devfun <- do.call(lme4::mkLmerDevfun, c(lmod, list(start = NULL, verbose = FALSE, control = control))) opt <- lme4::optimizeLmer(devfun, optimizer = control$optimizer, restart_edge = control$restart_edge, control = control$optCtrl, verbose = FALSE, start = NULL) mer <- lme4::mkMerMod(environment(devfun), opt, lmod$reTrms, fr = lmod$fr) sigma_res <- sigmaMethod(mer) / sqrt(mean(w)) vc <- lme4::VarCorr(mer) n <- c(0, cumsum(sapply(vc, ncol))) Random <- matrix(0, max(n), max(n)) for (i in seq_along(vc)) { index <- (n[i]+1):n[i+1] Random[index, index] <- vc[[i]] } Random <- Random / mean(w) list(coefficients = lme4::fixef(mer), sigma2 = list(Random = Random, Residual = sigma_res^2), df = length(lme4::fixef(mer)) + 1 + length(mer@theta)) } object@defineComponent <- defineComponent_lmer object@fit <- function(x, y, w, lmod){ fit <- lmer.wfit(x, y, w, lmod) object@defineComponent( list(coef = coef(fit), df = fit$df, sigma2 = fit$sigma2)) } object } setMethod("FLXgetModelmatrix", signature(model="FLXMRlmer"), function(model, data, formula, lhs=TRUE, contrasts = NULL, ...) { formula_nogrouping <- RemoveGrouping(formula) if (identical(paste(deparse(formula_nogrouping), collapse = ""), paste(deparse(formula), collapse = ""))) stop("please specify a grouping variable") model <- callNextMethod(model, data, formula, lhs) random_formula <- update(model@random, paste(".~. |", .FLXgetGroupingVar(formula))) fullformula <- model@fullformula if (!lhs) fullformula <- fullformula[c(1,3)] fullformula <- update(fullformula, paste(ifelse(lhs, ".", ""), "~. + ", paste(deparse(random_formula[[3]]), collapse = ""))) model@fullformula <- update(model@fullformula, paste(ifelse(lhs, ".", ""), "~. |", .FLXgetGroupingVar(formula))) model@lmod <- lme4::lFormula(fullformula, data, REML = FALSE, control = model@control) model@lmod <- model@preproc.z(model@lmod) model }) setMethod("FLXmstep", signature(model = "FLXMRlmer"), function(model, weights, ...) { apply(weights, 2, function(w) model@fit(model@x, model@y, w, model@lmod)) }) setMethod("FLXdeterminePostunscaled", signature(model = "FLXMRlmer"), function(model, components, ...) { sapply(components, function(x) x@logLik(model@x, model@y, model@lmod)) }) setMethod("rFLXM", signature(model = "FLXMRlmer", components="FLXcomponent"), function(model, components, ...) { sigma2 <- components@parameters$sigma2 z <- as.matrix(model@lmod$reTrms$Zt) grouping <- model@lmod$reTrms$flist[[1]] y <- matrix(0, nrow=nrow(model@x), ncol = 1) for (i in seq_len(nlevels(grouping))) { index1 <- which(grouping == levels(grouping)[i]) index2 <- rownames(z) %in% levels(grouping)[i] V <- crossprod(z[index2,index1,drop=FALSE], sigma2$Random) %*% z[index2, index1, drop=FALSE] + diag(length(index1)) * sigma2$Residual y[index1, 1] <- mvtnorm::rmvnorm(1, mean=components@predict(model@x[index1,,drop=FALSE], ...), sigma = V) } y }) flexmix/R/concomitant.R0000644000175100001440000000647412653423105014622 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: concomitant.R 5079 2016-01-31 12:21:12Z gruen $ # FLXPmultinom <- function(formula=~1) { z <- new("FLXPmultinom", name="FLXPmultinom", formula=formula) multinom.fit <- function(x, y, w, ...) { r <- ncol(x) p <- ncol(y) if (p < 2) stop("Multinom requires at least two components.") mask <- c(rep(0, r + 1), rep(c(0, rep(1, r)), p - 1)) nnet.default(x, y, w, mask = mask, size = 0, skip = TRUE, softmax = TRUE, censored = FALSE, rang = 0, trace=FALSE,...) } z@fit <- function(x, y, w, ...) multinom.fit(x, y, w, ...)$fitted.values z@refit <- function(x, y, w, ...) { if (missing(w) || is.null(w)) w <- rep(1, nrow(y)) rownames(y) <- rownames(x) <- NULL fit <- multinom(y ~ 0 + x, weights = w, data = list(y = y, x = x), Hess = TRUE, trace = FALSE) fit$coefnames <- colnames(x) fit$vcoefnames <- fit$coefnames[seq_along(fit$coefnames)] dimnames(fit$Hessian) <- lapply(dim(fit$Hessian) / ncol(x), function(i) paste(rep(seq_len(i) + 1, each = ncol(x)), colnames(x), sep = ":")) fit } z } FLXPconstant <- function() { new("FLXP", name="FLXPconstant", formula = ~1, fit = function(x, y, w, ...){ if (missing(w) || is.null(w)) return(matrix(colMeans(y), ncol=ncol(y), dimnames = list("prior", seq_len(ncol(y))))) else return(matrix(colMeans(w*y)/mean(w), ncol=ncol(y), dimnames = list("prior", seq_len(ncol(y))))) }) } ###********************************************************** setMethod("FLXgetModelmatrix", signature(model="FLXP"), function(model, data, groups, lhs, ...) { mt <- terms(model@formula, data=data) mf <- model.frame(delete.response(mt), data=data, na.action = NULL) X <- model.matrix(mt, data=mf) if (nrow(X)){ if (!checkGroup(X, groups$group)) stop("model variables have to be constant for grouping variable") model@x <- X[groups$groupfirst,,drop=FALSE] } else{ model@x <- matrix(1, nrow=sum(groups$groupfirst)) } model }) checkGroup <- function(x, group) { check <- TRUE for(g in levels(group)){ gok <- group==g if(any(gok)){ check <- all(c(check, apply(x[gok,,drop=FALSE], 2, function(z) length(unique(z)) == 1))) } } check } ###********************************************************** setMethod("refit_mstep", signature(object="FLXP", newdata="missing"), function(object, newdata, posterior, group, ...) NULL) setMethod("refit_mstep", signature(object="FLXPmultinom", newdata="missing"), function(object, newdata, posterior, group, ...) { groupfirst <- if (length(group)) groupFirst(group) else rep(TRUE, nrow(posterior)) object@refit(object@x, posterior[groupfirst,,drop=FALSE], ...) }) ###********************************************************** setMethod("FLXfillConcomitant", signature(concomitant="FLXP"), function(concomitant, posterior, weights) { concomitant@coef <- concomitant@refit(concomitant@x, posterior, weights) concomitant }) setMethod("FLXfillConcomitant", signature(concomitant="FLXPmultinom"), function(concomitant, posterior, weights) { concomitant@coef <- cbind("1" = 0, t(coef(concomitant@refit(concomitant@x, posterior, weights)))) concomitant }) ###********************************************************** flexmix/R/infocrit.R0000644000175100001440000000277612653423105014122 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: infocrit.R 5079 2016-01-31 12:21:12Z gruen $ # setMethod("nobs", signature(object="flexmix"), function(object, ...) { if (is.null(object@weights)) nrow(object@posterior$scaled) else sum(object@weights) }) setMethod("logLik", signature(object="flexmix"), function(object, newdata, ...){ if (missing(newdata)) { z <- object@logLik attr(z, "df") <- object@df attr(z, "nobs") <- nobs(object) class(z) <- "logLik" } else { z <- sum(log(rowSums(posterior(object, newdata = newdata, unscaled = TRUE)))) attr(z, "df") <- object@df attr(z, "nobs") <- nrow(newdata) class(z) <- "logLik" } z }) setMethod("ICL", signature(object="flexmix"), function(object, ...){ -2 * clogLik(object) + object@df * log(nobs(object)) }) setMethod("clogLik", signature(object="flexmix"), function(object, ...){ first <- if (length(object@group)) groupFirst(object@group) else TRUE post <- object@posterior$unscaled[first,,drop=FALSE] n <- nrow(post) sum(log(post[seq_len(n) + (clusters(object)[first] - 1)*n])) }) setMethod("EIC", signature(object="flexmix"), function(object, ...) { first <- if (length(object@group)) groupFirst(object@group) else TRUE post <- object@posterior$scaled[first,,drop=FALSE] n <- nrow(post) lpost <- log(post) if (any(is.infinite(lpost))) lpost[is.infinite(lpost)] <- -10^3 1 + sum(post * lpost)/(n * log(object@k)) }) flexmix/R/mgcv.R0000644000175100001440000001373113430312222013221 0ustar hornikuserssetOldClass("gam.prefit") setClassUnion("listOrgam.prefit", c("list", "gam.prefit")) setClass("FLXMRmgcv", representation(G = "listOrgam.prefit", control = "list"), contains="FLXMRglm") FLXMRmgcv <- function(formula = .~., family = c("gaussian", "binomial", "poisson"), offset = NULL, control = NULL, optimizer = c("outer", "newton"), in.out = NULL, eps = .Machine$double.eps, ...) { if (is.null(control)) control <- mgcv::gam.control() family <- match.arg(family) am <- if (family == "gaussian" && get(family)()$link == "identity") TRUE else FALSE z <- new("FLXMRmgcv", FLXMRglm(formula = formula, family = family, offset = offset), name=paste("FLXMRmgcv", family, sep=":"), control = control) scale <- if (family %in% c("binomial", "poisson")) 1 else -1 gam_fit <- function(G, w) { G$family <- get(family)() G$am <- am G$w <- w G$conv.tol <- control$mgcv.tol G$max.half <- control$mgcv.half zero_weights <- any(w < eps) if (zero_weights) { ok <- w >= eps w <- w[ok] G$X <- G$X[ok,,drop=FALSE] if (is.matrix(G$y)) G$y <- G$y[ok,,drop=FALSE] else G$y <- G$y[ok] G$mf <- G$mf[ok,,drop=FALSE] G$w <- G$w[ok] G$offset <- G$offset[ok] if (G$n.paraPen > 0) { OMIT <- which(colSums(abs(G$X)) == 0) if (length(OMIT) > 0) { Ncol <- ncol(G$X) Assign <- unique(G$assign[OMIT]) G$assign <- G$assign[-OMIT] G$nsdf <- G$nsdf - length(OMIT) G$X <- G$X[,-OMIT,drop=FALSE] G$mf$Grouping <- G$mf$Grouping[,-which(colSums(abs(G$mf$Grouping))==0),drop=FALSE] if (length(G$off) > 1) G$off[2] <- G$off[2] - length(OMIT) for (i in seq_along(G$smooth)) { G$smooth[[i]]$first.para <- G$smooth[[i]]$first.para - length(OMIT) G$smooth[[i]]$last.para <- G$smooth[[i]]$last.para - length(OMIT) } G$S[[1]] <- G$S[[1]][-c(OMIT-sum(G$assign != Assign)), -c(OMIT-sum(G$assign != Assign))] } } } z <- mgcv::gam(G = G, method = "ML", optimizer = optimizer, control = control, scale = scale, in.out = in.out, ...) if (zero_weights) { residuals <- z$residuals z$residuals <- rep(0, length(ok)) z$residuals[ok] <- residuals if (G$n.paraPen > 0 && length(OMIT) > 0) { coefficients <- z$coefficients z$coefficients <- rep(0, Ncol) z$coefficients[-OMIT] <- coefficients } } z } if (family=="gaussian"){ z@fit <- function(x, y, w, G){ gam.fit <- gam_fit(G, w) z@defineComponent(list(coef = gam.fit$coefficients, df = sum(gam.fit$edf)+1, sigma = sqrt(sum(w * gam.fit$residuals^2 / mean(w))/ (nrow(x)-sum(gam.fit$edf))))) } } else if(family %in% c("binomial", "poisson")){ z@fit <- function(x, y, w, G){ gam.fit <- gam_fit(G, w) z@defineComponent( list(coef = gam.fit$coefficients, df = sum(gam.fit$edf))) } } else stop(paste("Unknown family", family)) z } setMethod("FLXmstep", signature(model = "FLXMRmgcv"), function(model, weights, ...) { apply(weights, 2, function(w) model@fit(model@x, model@y, w, model@G)) }) setMethod("FLXgetModelmatrix", signature(model="FLXMRmgcv"), function(model, data, formula, lhs=TRUE, paraPen = list(), ...) { formula <- RemoveGrouping(formula) if (length(grep("\\|", deparse(model@formula)))) stop("no grouping variable allowed in the model") if(is.null(model@formula)) model@formula <- formula model@fullformula <- update(terms(formula, data=data), model@formula) gp <- mgcv::interpret.gam(model@fullformula) if (lhs) { model@terms <- terms(gp$fake.formula, data = data) mf <- model.frame(model@terms, data=data, na.action = NULL, drop.unused.levels = TRUE) response <- as.matrix(model.response(mf, "numeric")) model@y <- model@preproc.y(response) } else { model@terms <- terms(gp$fake.formula, data = data) mf <- model.frame(delete.response(model@terms), data=data, na.action = NULL, drop.unused.levels = TRUE) } model@G <- mgcv::gam(model@fullformula, data = data, fit = FALSE) model@x <- model@G$X model@contrasts <- attr(model@x, "contrasts") model@x <- model@preproc.x(model@x) model@xlevels <- .getXlevels(delete.response(model@terms), mf) model }) setMethod("predict", signature(object="FLXMRmgcv"), function(object, newdata, components, ...) { predict_gam <- function (object, newdata, ...) { nn <- names(newdata) mn <- colnames(object$model) for (i in 1:length(newdata)) if (nn[i] %in% mn && is.factor(object$model[, nn[i]])) { newdata[[i]] <- factor(newdata[[i]], levels = levels(object$model[, nn[i]])) } if (length(newdata) == 1) newdata[[2]] <- newdata[[1]] n.smooth <- length(object$smooth) Terms <- delete.response(object$pterms) X <- matrix(0, nrow(newdata), length(object$coefficients)) Xoff <- matrix(0, nrow(newdata), n.smooth) mf <- model.frame(Terms, newdata, xlev = object$xlevels) if (!is.null(cl <- attr(object$pterms, "dataClasses"))) .checkMFClasses(cl, mf) Xp <- model.matrix(Terms, mf, contrasts = object$contrasts) if (object$nsdf) X[, 1:object$nsdf] <- Xp if (n.smooth) for (k in 1:n.smooth) { Xfrag <- mgcv::PredictMat(object$smooth[[k]], newdata) X[, object$smooth[[k]]$first.para:object$smooth[[k]]$last.para] <- Xfrag Xfrag.off <- attr(Xfrag, "offset") if (!is.null(Xfrag.off)) { Xoff[, k] <- Xfrag.off } } X } object@G$model <- object@G$mf z <- list() for(k in seq_along(components)) { object@G$coefficients <- components[[k]]@parameters$coef X <- predict_gam(object@G, newdata) z[[k]] <- components[[k]]@predict(X, ...) } z }) flexmix/R/rFLXmodel.R0000644000175100001440000000566713431544512014144 0ustar hornikuserssetMethod("rFLXM", signature(model="FLXM", components="list"), function(model, components, class, ...) { y <- NULL for (l in seq_along(components)) { yl <- as.matrix(rFLXM(model, components[[l]], ...)) if (is.null(y)) y <- matrix(NA, nrow = length(class), ncol = ncol(yl)) y[class == l,] <- yl[class==l,] } y }) setMethod("rFLXM", signature(model = "FLXMRglm", components="FLXcomponent"), function(model, components, ...) { family <- model@family n <- nrow(model@x) if(family == "gaussian") { sigma <- components@parameters$sigma y <- rnorm(n, mean = components@predict(model@x, ...), sd = sigma) } else if (family == "binomial") { dotarg = list(...) if ("size" %in% names(dotarg)) size <- dotarg$size else { if (nrow(model@y)!=n) stop("no y values - specify a size argument") size <- rowSums(model@y) } parms <- components@parameters y <- rbinom(n, prob = components@predict(model@x, ...), size=size) y <- cbind(y, size - y) } else if (family == "poisson") { y <- rpois(n, lambda = components@predict(model@x, ...)) } else if (family == "Gamma") { shape <- components@parameters$shape y <- rgamma(n, shape = shape, scale = components@predict(model@x, ...)/shape) } else stop("family not supported") y }) setMethod("rFLXM", signature(model = "FLXMRglmfix", components="list"), function(model, components, class, ...) { k <- sum(model@nestedformula@k) n <- nrow(model@x)/k y <- matrix(NA, nrow = length(class), ncol = ncol(model@y)) model.sub <- as(model, "FLXMRglm") for (l in seq_len(k)) { rok <- (l-1)*n + seq_len(n) model.sub@x <- model@x[rok, as.logical(model@design[l,]), drop=FALSE] model.sub@y <- model@y[rok,,drop=FALSE] yl <- as.matrix(rFLXM(model.sub, components[[l]], ...)) y[class==l,] <- yl[class==l,] } y }) rmvbinom <- function(n, size, prob) sapply(prob, function(p) rbinom(n, size, p)) rmvbinary <- function(n, center) sapply(center, function(p) rbinom(n, 1, p)) setMethod("rFLXM", signature(model = "FLXMC", components = "FLXcomponent"), function(model, components, class, ...) { rmvnorm <- function(n, center, cov) mvtnorm::rmvnorm(n = n, mean = center, sigma = cov) dots <- list(...) FUN <- paste("r", model@dist, sep = "") args <- c(n = nrow(model@x), dots, components@parameters) return(do.call(FUN, args)) }) flexmix/R/relabel.R0000644000175100001440000000555412653423105013710 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id$ # setGeneric("dorelabel", function(object, perm, ...) standardGeneric("dorelabel")) setMethod("dorelabel", signature(object="flexmix", perm="vector"), function(object, perm, ...) { object <- callNextMethod(object, perm) object@posterior$scaled <- object@posterior$scaled[,perm,drop=FALSE] object@posterior$unscaled <- object@posterior$unscaled[,perm,drop=FALSE] object@cluster <- order(perm)[object@cluster] object@size <- object@size[perm] names(object@size) <- seq_along(perm) object }) setMethod("dorelabel", signature(object="FLXdist", perm="vector"), function(object, perm, ...) { if (length(perm) != object@k) stop("length of order argument does not match number of components") if (any(sort(perm) != seq_len(object@k))) stop("order argument not specified correctly") object@prior <- object@prior[perm] object@components <- object@components[perm] names(object@components) <- sapply(seq_along(object@components), function(k) gsub("[0-9]+", k, names(object@components)[k])) object@concomitant <- dorelabel(object@concomitant, perm, ...) object }) setMethod("dorelabel", signature(object="FLXP", perm="vector"), function(object, perm, ...) { object@coef <- object@coef[,perm,drop=FALSE] colnames(object@coef) <- sapply(seq_len(ncol(object@coef)), function(k) gsub("[0-9]+", k, colnames(object@coef)[k])) object }) setMethod("dorelabel", signature(object="FLXPmultinom", perm="vector"), function(object, perm, ...) { object@coef <- object@coef[,perm,drop=FALSE] object@coef <- sweep(object@coef, 1, object@coef[,1], "-") colnames(object@coef) <- sapply(seq_len(ncol(object@coef)), function(k) gsub("[0-9]+", k, colnames(object@coef)[k])) object }) setMethod("relabel", signature(object="FLXdist", by="character"), function(object, by, which=NULL, ...) { by <- match.arg(by, c("prior", "model", "concomitant")) if(by=="prior"){ perm <- order(prior(object), ...) } else if(by %in% c("model", "concomitant")) { pars <- parameters(object, which = by) index <- grep(which, rownames(pars)) if (length(index) != 1) stop("no suitable ordering variable given in 'which'") perm <- order(pars[index,], ...) } object <- dorelabel(object, perm=perm) object }) setMethod("relabel", signature(object="FLXdist", by="missing"), function(object, by, ...) { object <- relabel(object, by="prior", ...) object }) setMethod("relabel", signature(object="FLXdist", by="integer"), function(object, by, ...) { if(!all(sort(by) == seq_len(object@k))) stop("if integer, ", sQuote("by"), " must be a permutation of the numbers 1 to ", object@k) object <- dorelabel(object, by) object }) flexmix/R/plot.R0000644000175100001440000000656512653423105013263 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: plot.R 5079 2016-01-31 12:21:12Z gruen $ # ###********************************************************** plotEll <- function(object, data, which=1:2, model = 1, project=NULL, points=TRUE, eqscale=TRUE, col=NULL, number = TRUE, cex=1.5, numcol="black", pch=NULL, ...) { if(is.null(col)) col <- rep(FullColors, length.out = object@k) if (!is.list(data)) { response <- data data <- list() data[[deparse(object@model[[model]]@fullformula[[2]])]] <- response } else { mf <- model.frame(object@model[[model]]@fullformula, data=data, na.action = NULL) response <- as.matrix(model.response(mf)) response <- object@model[[model]]@preproc.y(response) } clustering <- clusters(object, newdata = data) if(!is.null(project)) response <- predict(project, response) type=ifelse(points, "p", "n") if(is.null(pch)){ pch <- (clustering %% 10) pch[pch==0] <- 10 } else if(length(pch)!=nrow(response)){ pch <- rep(pch, length.out = object@k) pch <- pch[clustering] } if(eqscale) plot(response[,which], asp = 1, col=col[clustering], pch=pch, type=type, ...) else plot(response[,which], col=col[clustering], pch=pch, type=type, ...) for(k in seq_along(object@components)){ p = parameters(object, k, model, simplify=FALSE) if(!is.null(project)){ p <- projCentCov(project, p) } lines(ellipse::ellipse(p$cov[which,which], centre=p$center[which], level=0.5), col=col[k], lwd=2) lines(ellipse::ellipse(p$cov[which,which], centre=p$center[which], level=0.95), col=col[k], lty=2) } ## und nochmal fuer die zentren und nummern (damit die immer oben sind) for(k in seq_along(object@components)){ p = parameters(object, k, model, simplify=FALSE) if(!is.null(project)){ p <- projCentCov(project, p) } if(number){ rad <- ceiling(log10(object@k)) + 1.5 points(p$center[which[1]], p$center[which[2]], col=col[k], pch=21, cex=rad*cex, lwd=cex, bg="white") text(p$center[which[1]], p$center[which[2]], k, cex=cex, col=numcol) } else{ points(p$center[which[1]], p$center[which[2]], pch=16, cex=cex, col=col[k]) } } } projCentCov <- function(object, p) UseMethod("projCentCov") projCentCov.default <- function(object, p) stop(paste("Cannot handle projection objects of class", sQuote(class(object)))) projCentCov.prcomp <- function(object, p) { cent <- matrix(p$center, ncol=length(p$center)) cent <- scale(cent, object$center, object$scale) %*% object$rotation cov <- p$cov if(length(object$scale)>1) cov <- cov/outer(object$scale, object$scale, "*") cov <- t(object$rotation) %*% cov %*% object$rotation list(center=cent, cov=cov) } flexmix/R/rflexmix.R0000644000175100001440000000742112544655362014146 0ustar hornikuserssetMethod("rflexmix", signature(object = "FLXdist", newdata="numeric"), function(object, newdata, ...) { newdata <- data.frame(matrix(nrow = as.integer(newdata), ncol = 0)) rflexmix(object, newdata = newdata, ...) }) setMethod("rflexmix", signature(object = "FLXdist", newdata="listOrdata.frame"), function(object, newdata, ...) { groups <- .FLXgetGrouping(object@formula, newdata) object@model <- lapply(object@model, FLXgetModelmatrix, newdata, object@formula, lhs=FALSE) group <- if (length(groups$group)) groups$group else factor(seq_len(FLXgetObs(object@model[[1]]))) object@concomitant <- FLXgetModelmatrix(object@concomitant, data = newdata, groups = list(group=group, groupfirst = groupFirst(group))) rflexmix(new("flexmix", object, group=group, weights = NULL), ...) }) setMethod("rflexmix", signature(object = "flexmix", newdata="missing"), function(object, newdata, ...) { N <- length(object@model) object <- undo_weights(object) group <- group(object) prior <- determinePrior(object@prior, object@concomitant, group) class <- apply(prior, 1, function(x) rmultinom(1, size = 1, prob = x)) class <- if (is.matrix(class)) t(class) else as.matrix(class) class <- max.col(class)[group] y <- vector("list", N) for (i in seq_len(N)) { comp <- lapply(object@components, function(x) x[[i]]) yi <- rFLXM(object@model[[i]], comp, class, group, ...) form <- object@model[[i]]@fullformula names <- if(length(form) == 3) form[[2]] else paste("y", i, seq_len(ncol(yi)), sep = ".") if (ncol(yi) > 1) { if (inherits(names, "call")) names <- as.character(names[-1]) if (length(names) != ncol(yi)) { if (length(names) == 1) names <- paste(as.character(names)[1], i, seq_len(ncol(yi)), sep = ".") else stop("left hand side not specified correctly") } } else if (inherits(names, "call")) names <- deparse(names) colnames(yi) <- as.character(names) y[[i]] <- yi } list(y = y, group=group, class = class) }) ###********************************************************** determinePrior <- function(prior, concomitant, group) { matrix(prior, nrow = length(unique(group)), ncol = length(prior), byrow=TRUE) } setGeneric("determinePrior", function(prior, concomitant, group) standardGeneric("determinePrior")) setMethod("determinePrior", signature(concomitant="FLXPmultinom"), function(prior, concomitant, group) { exps <- exp(concomitant@x %*% concomitant@coef) exps/rowSums(exps) }) undo_weights <- function(object) { if (!is.null(object@weights)) { for (i in seq_along(object@model)) { object@model[[i]]@x <- apply(object@model[[i]]@x, 2, rep, object@weights) object@model[[i]]@y <- apply(object@model[[i]]@y, 2, rep, object@weights) object@concomitant@x <- apply(object@concomitant@x, 2, rep, object@weights) } if (length(object@group) > 0) object@group <- rep(object@group, object@weights) object@weights <- NULL } object } ###********************************************************** setMethod("simulate", signature("FLXdist"), function(object, nsim, seed = NULL, ...) { if (!exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) runif(1) if (is.null(seed)) RNGstate <- get(".Random.seed", envir = .GlobalEnv, inherits = FALSE) else { R.seed <- get(".Random.seed", envir = .GlobalEnv, inherits = FALSE) set.seed(seed) RNGstate <- structure(seed, kind = as.list(RNGkind())) on.exit(assign(".Random.seed", R.seed, envir = .GlobalEnv, inherits = FALSE)) } ans <- lapply(seq_len(nsim), function(i) rflexmix(object, ...)$y) if (all(sapply(ans, ncol) == 1)) ans <- as.data.frame(ans) attr(ans, "seed") <- RNGstate ans }) flexmix/R/flexmixFix.R0000644000175100001440000001415212653423105014417 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: flexmixFix.R 5079 2016-01-31 12:21:12Z gruen $ # setMethod("FLXcheckComponent", signature(model = "FLXMRfix"), function(model, k, cluster, ...) { if (sum(model@nestedformula@k)) { if (!is.null(k)) { if (k != sum(model@nestedformula@k)) stop("specified k does not match the nestedformula in the model") } else k <- sum(model@nestedformula@k) } else { if (is(cluster, "matrix")) { if (is.null(k)) k <- ncol(cluster) } else if (!is.null(cluster)) { if (is.null(k)) { cluster <- as(cluster, "integer") k <- max(cluster) } } if (is.null(k)) stop("either k, cluster or the nestedformula of the model must be specified") else model@nestedformula <- as(k, "FLXnested") } if (length(model@variance) > 1) { if (sum(model@variance) != k) stop("specified k does not match the specified varFix argument in the model") } else if (model@variance) model@variance <- k else model@variance <- rep(1, k) model }) setMethod("FLXgetObs", signature(model = "FLXMRfix"), function(model) nrow(model@y)/sum(model@nestedformula@k)) setMethod("FLXgetK", signature(model = "FLXMRfix"), function(model, ...) sum(model@nestedformula@k)) setMethod("FLXremoveComponent", signature(model = "FLXMRfix"), function(model, nok, ...) { if (!length(nok)) return(model) K <- model@nestedformula wnok <- sapply(nok, function(i) which(apply(rbind(i > c(0, cumsum(K@k[-length(K@k)])), i <= c(cumsum(K@k))), 2, all))) wnok <- table(wnok) if (length(wnok) > 0) { K@k[as.integer(names(wnok))] <- K@k[as.integer(names(wnok))] - wnok if (any(K@k == 0)) { keep <- K@k != 0 K@k <- K@k[keep] K@formula <- K@formula[keep] } k <- sum(K@k) model@nestedformula <- K } varnok <- sapply(nok, function(i) which(apply(rbind(i > c(0, cumsum(model@variance[-length(model@variance)])), i <= c(cumsum(model@variance))), 2, all))) varnok <- table(varnok) if (length(varnok) > 0) { model@variance[as.integer(names(varnok))] <- model@variance[as.integer(names(varnok))] - varnok if (any(model@variance == 0)) model@variance <- model@variance[model@variance != 0] } rok <- which(!apply(model@segment[,nok,drop=FALSE], 1, function(x) any(x))) model@x <- model@x[rok, which(colSums(model@design[-nok,,drop=FALSE]) > 0), drop=FALSE] model@y <- model@y[rok,, drop=FALSE] model@design <- model@design[-nok,,drop=FALSE] cok <- colSums(model@design) > 0 model@design <- model@design[,cok,drop=FALSE] model@segment <- model@segment[rok,-nok, drop=FALSE] model }) ###********************************************************** setMethod("FLXmstep", signature(model = "FLXMRfix"), function(model, weights, ...) { model@fit(model@x, model@y, as.vector(weights), model@design, model@variance) }) ###********************************************************** setMethod("FLXdeterminePostunscaled", signature(model = "FLXMRfix"), function(model, components, ...) { sapply(seq_along(components), function(m) components[[m]]@logLik(model@x[model@segment[,m], as.logical(model@design[m,]), drop=FALSE], model@y[model@segment[,m],,drop=FALSE])) }) ###********************************************************** modelMatrix <- function(random, fixed, nested, data=list(), lhs, xlevels = NULL) { if (!lhs) random <- random[-2] mf.random <- model.frame(random, data=data, na.action = NULL) response <- if (lhs) as.matrix(model.response(mf.random)) else NULL xlev <- xlevels[names(.getXlevels(terms(mf.random), mf.random))] mm.random <- if (is.null(xlev)) model.matrix(terms(mf.random), data=mf.random) else model.matrix(terms(mf.random), data=data, xlev = xlev) xlevels.random <- .getXlevels(terms(mf.random), mf.random) randomfixed <- if(identical(paste(deparse(fixed), collapse = ""), "~0")) random else update(random, paste("~.+", paste(deparse(fixed[[length(fixed)]]), collapse = ""))) mf.randomfixed <- model.frame(randomfixed, data=data) mm.randomfixed <- model.matrix(terms(mf.randomfixed), data=mf.randomfixed, xlev = xlevels[names(.getXlevels(terms(mf.randomfixed), mf))]) mm.fixed <- mm.randomfixed[,!colnames(mm.randomfixed) %in% colnames(mm.random), drop=FALSE] xlevels.fixed <- .getXlevels(terms(mf.randomfixed), mf.randomfixed) all <- mm.all <- mm.nested <- xlevels.nested <- list() for (l in seq_along(nested)) { all[[l]] <- if (identical(paste(deparse(nested[[l]]), collapse = ""), "~0")) randomfixed else update(randomfixed, paste("~.+", paste(deparse(nested[[l]][[length(nested[[l]])]]), collapse = ""))) mf <- model.frame(all[[l]], data=data) mm.all[[l]] <- model.matrix(terms(mf), data=mf, xlev = xlevels[names(.getXlevels(terms(mf), mf))]) mm.nested[[l]] <- mm.all[[l]][,!colnames(mm.all[[l]]) %in% colnames(mm.randomfixed),drop=FALSE] xlevels.nested[[l]] <- .getXlevels(terms(mf), mf) } return(list(random=mm.random, fixed=mm.fixed, nested=mm.nested, response=response, xlevels=c(xlevels.random, xlevels.fixed, unlist(xlevels.nested)))) } ###********************************************************** modelDesign <- function(mm.all, k) { design <- matrix(1, nrow=sum(k@k), ncol=ncol(mm.all$fixed)) col.names <- colnames(mm.all$fixed) nested <- matrix(0, nrow=sum(k@k), ncol=sum(sapply(mm.all$nested, ncol))) cumK <- c(0, cumsum(k@k)) i <- 0 for (l in seq_along(mm.all$nested)) { if (ncol(mm.all$nested[[l]])) { nested[(cumK[l] + 1):cumK[l+1], i+seq_len(ncol(mm.all$nested[[l]]))] <- 1 i <- i+ncol(mm.all$nested[[l]]) col.names <- c(col.names, colnames(mm.all$nested[[l]])) } } design <- cbind(design, nested) if (ncol(mm.all$random)) design <- cbind(design, kronecker(diag(sum(k@k)), matrix(1, ncol=ncol(mm.all$random)))) colnames(design) <- c(col.names, rep(colnames(mm.all$random), sum(k@k))) design } ###********************************************************** flexmix/R/plot-flexmix.R0000644000175100001440000001353012653423105014723 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: plot-flexmix.R 5079 2016-01-31 12:21:12Z gruen $ # determine_y <- function(h, root) { y <- h$counts if (root) y <- sqrt(y) return(y) } panel.rootogram <- function (x, breaks, equal.widths = TRUE, nint = max(round(log2(length(x)) + 1), 3), alpha = plot.polygon$alpha, col = plot.polygon$col, border = plot.polygon$border, lty = plot.polygon$lty, lwd = plot.polygon$lwd, subscripts, groups, mark, root = TRUE, markcol, ...) { x <- as.numeric(x) plot.polygon <- trellis.par.get("plot.polygon") grid.lines(x = c(0.05, 0.95), y = unit(c(0, 0), "native"), gp = gpar(col = border, lty = lty, lwd = lwd, alpha = alpha), default.units = "npc") if (length(x) > 0) { if (is.null(breaks)) { breaks <- if (equal.widths) do.breaks(range(x, finite = TRUE), nint) else quantile(x, 0:nint/nint, na.rm = TRUE) } h <- hist.constructor(x, breaks = breaks, plot = FALSE, ...) y <- determine_y(h, root) if (!is.null(mark)) { h1 <- hist.constructor(x[groups[subscripts] == mark], breaks = h$breaks, plot = FALSE, ...) y1 <- determine_y(h1, root) } nb <- length(breaks) if (length(y) != nb - 1) warning("problem with hist computations") if (nb > 1) { panel.rect(x = breaks[-nb], y = 0, height = y, width = diff(breaks), col = col, alpha = alpha, border = border, lty = lty, lwd = lwd, just = c("left", "bottom")) if (!is.null(mark)) panel.rect(x = breaks[-nb], y = 0, height = y1, width = diff(breaks), col = markcol, alpha = alpha, border = border, lty = lty, lwd = lwd, just = c("left", "bottom")) } } } prepanel.rootogram <- function (x, breaks, equal.widths = TRUE, nint = max(round(log2(length(x)) + 1), 3), root = TRUE, ...) { if (length(x) < 1) list(xlim = NA, ylim = NA, dx = NA, dy = NA) else { if (is.factor(x)) { isFactor <- TRUE xlimits <- levels(x) } else isFactor <- FALSE if (!is.numeric(x)) x <- as.numeric(x) if (is.null(breaks)) { breaks <- if (equal.widths) do.breaks(range(x, finite = TRUE), nint) else quantile(x, 0:nint/nint, na.rm = TRUE) } h <- hist.constructor(x, breaks = breaks, plot = FALSE, ...) y <- determine_y(h, root) list(xlim = if (isFactor) xlimits else range(x, breaks, finite = TRUE), ylim = range(0, y, finite = TRUE), dx = 1, dy = 1) } } setMethod("plot", signature(x="flexmix", y="missing"), function(x, y, mark=NULL, markcol=NULL, col=NULL, eps=1e-4, root=TRUE, ylim=TRUE, main=NULL, xlab = "", ylab = "", as.table = TRUE, endpoints = c(-0.04, 1.04), ...){ k <- length(x@prior) if(is.null(markcol)) markcol <- FullColors[5] if(is.null(col)) col <- LightColors[4] if(is.null(main)){ main <- ifelse(root, "Rootogram of posterior probabilities", "Histogram of posterior probabilities") main <- paste(main, ">", eps) } groupfirst <- if (length(x@group)) !duplicated(x@group) else TRUE if (is.null(x@weights)) z <- data.frame(posterior = as.vector(x@posterior$scaled[groupfirst,,drop=FALSE]), component = factor(rep(seq_len(x@k), each = nrow(x@posterior$scaled[groupfirst,,drop=FALSE])), levels = seq_len(x@k), labels = paste("Comp.", seq_len(x@k))), cluster = rep(as.vector(x@cluster[groupfirst]), k)) else z <- data.frame(posterior = rep(as.vector(x@posterior$scaled[groupfirst,,drop=FALSE]), rep(x@weights[groupfirst], k)), component = factor(rep(seq_len(x@k), each = sum(x@weights[groupfirst])), seq_len(x@k), paste("Comp.", seq_len(x@k))), cluster = rep(rep(as.vector(x@cluster[groupfirst]), x@weights[groupfirst]), k)) panel <- function(x, subscripts, groups, ...) panel.rootogram(x, root = root, mark = mark, col = col, markcol = markcol, subscripts = subscripts, groups = groups, ...) prepanel <- function(x, ...) prepanel.rootogram(x, root = root, ...) z <- subset(z, posterior > eps) cluster <- NULL # make codetools happy if (is.logical(ylim)) { scales <- if (ylim) list() else list(y = list(relation = "free")) hh <- histogram(~ posterior | component, data = z, main = main, ylab = ylab, xlab = xlab, groups = cluster, panel = panel, prepanel = prepanel, scales = scales, as.table = as.table, endpoints = endpoints, ...) } else hh <- histogram(~ posterior | component, data = z, main = main, ylab = ylab, xlab = xlab, groups = cluster, ylim = ylim, panel = panel, prepanel = prepanel, as.table = as.table, endpoints = endpoints, ...) if (root) { hh$yscale.components <- function (lim, packet.number = 0, packet.list = NULL, right = TRUE, ...) { comps <- calculateAxisComponents(lim, packet.list = packet.list, packet.number = packet.number, ...) comps$at <- sqrt(seq(min(comps$at)^2, max(comps$at)^2, length.out = length(comps$at))) comps$labels <- format(comps$at^2, trim = TRUE) list(num.limit = comps$num.limit, left = list(ticks = list(at = comps$at, tck = 1), labels = list(at = comps$at, labels = comps$labels, cex = 1, check.overlap = comps$check.overlap)), right = right) } } hh }) flexmix/R/examples.R0000644000175100001440000000411312653423105014106 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: examples.R 5079 2016-01-31 12:21:12Z gruen $ # ExNPreg = function(n) { if(n %% 2 != 0) stop("n must be even") x <- runif(2*n, 0, 10) mp <- exp(c(2-0.2*x[1:n], 1+0.1*x[(n+1):(2*n)])) mb <- binomial()$linkinv(c(x[1:n]-5, 5-x[(n+1):(2*n)])) data.frame(x=x, yn=c(5*x[1:n], 40-(x[(n+1):(2*n)]-5)^2)+3*rnorm(n), yp=rpois(2*n, mp), yb=rbinom(2*n, size=1, prob=mb), class = rep(1:2, c(n,n)), id1 = factor(rep(1:n, rep(2, n))), id2 = factor(rep(1:(n/2), rep(4, n/2)))) } ExNclus = function(n=100) { if(n %% 2 != 0) stop("n must be even") rbind(mvtnorm::rmvnorm(n, mean=rep(0,2)), mvtnorm::rmvnorm(n, mean=c(8,0), sigma=diag(1:2)), mvtnorm::rmvnorm(1.5*n, mean=c(-2,6), sigma=diag(2:1)), mvtnorm::rmvnorm(2*n, mean=c(4,4), sigma=matrix(c(1,.9,.9,1), 2))) } ExLinear <- function(beta, n, xdist="runif", xdist.args=NULL, family=c("gaussian", "poisson"), sd=1, ...) { family <- match.arg(family) X <- NULL y <- NULL k <- ncol(beta) d <- nrow(beta)-1 n <- rep(n, length.out=k) if(family=="gaussian") sd <- rep(sd, length.out=k) xdist <- rep(xdist, length.out=d) if(is.null(xdist.args)){ xdist.args <- list(list(...)) } if(!is.list(xdist.args[[1]])) xdist.args <- list(xdist.args) xdist.args <- rep(xdist.args, length.out=d) for(i in 1:k) { X1 <- 1 for(j in 1:d){ xdist.args[[j]]$n <- n[i] X1 <- cbind(X1, do.call(xdist[j], xdist.args[[j]])) } X <- rbind(X, X1) xb <- X1 %*% beta[,i,drop=FALSE] if(family=="gaussian") y1 <- xb + rnorm(n[i], sd=sd[i]) else y1 <- rpois(n[i], exp(xb)) y <- c(y, y1) } X <- X[,-1,drop=FALSE] colnames(X) <- paste("x", 1:d, sep="") z <- data.frame(y=y, X) attr(z, "clusters") <- rep(1:k, n) z } flexmix/R/kldiv.R0000644000175100001440000001006512653423105013404 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: kldiv.R 5079 2016-01-31 12:21:12Z gruen $ # setMethod("KLdiv", "matrix", function(object, eps=10^-4, overlap=TRUE,...) { if(!is.numeric(object)) stop("object must be a numeric matrix\n") z <- matrix(NA, nrow=ncol(object), ncol=ncol(object)) colnames(z) <- rownames(z) <- colnames(object) w <- object < eps if (any(w)) object[w] <- eps object <- sweep(object, 2, colSums(object) , "/") for(k in seq_len(ncol(object)-1)){ for(l in 2:ncol(object)){ ok <- (object[, k] > eps) & (object[, l] > eps) if (!overlap | any(ok)) { z[k,l] <- sum(object[,k] * (log(object[,k]) - log(object[,l]))) z[l,k] <- sum(object[,l] * (log(object[,l]) - log(object[,k]))) } } } diag(z)<-0 z }) setMethod("KLdiv", "flexmix", function(object, method = c("continuous", "discrete"), ...) { method <- match.arg(method) if (method == "discrete") z <- KLdiv(object@posterior$scaled, ...) else { z <- matrix(0, object@k, object@k) for (i in seq_along(object@model)) { comp <- lapply(object@components, "[[", i) z <- z + KLdiv(object@model[[i]], comp) } } z }) setMethod("KLdiv", "FLXMRglm", function(object, components, ...) { z <- matrix(NA, length(components), length(components)) mu <- lapply(components, function(x) x@predict(object@x)) if (object@family == "gaussian") { sigma <- lapply(components, function(x) x@parameters$sigma) for (k in seq_len(ncol(z)-1)) { for (l in seq_len(ncol(z))[-1]) { z[k,l] <- sum(log(sigma[[l]]) - log(sigma[[k]]) + 1/2 * (-1 + ((sigma[[k]]^2 + (mu[[k]] - mu[[l]])^2))/sigma[[l]]^2)) z[l,k] <- sum(log(sigma[[k]]) - log(sigma[[l]]) + 1/2 * (-1 + ((sigma[[l]]^2 + (mu[[l]] - mu[[k]])^2))/sigma[[k]]^2)) } } } else if (object@family == "binomial") { for (k in seq_len(ncol(z)-1)) { for (l in seq_len(ncol(z))[-1]) { z[k,l] <- sum(mu[[k]] * log(mu[[k]]/mu[[l]]) + (1-mu[[k]]) * log((1-mu[[k]])/(1-mu[[l]]))) z[l,k] <- sum(mu[[l]] * log(mu[[l]]/mu[[k]]) + (1-mu[[l]]) * log((1-mu[[l]])/(1-mu[[k]]))) } } } else if (object@family == "poisson") { for (k in seq_len(ncol(z)-1)) { for (l in seq_len(ncol(z))[-1]) { z[k,l] <- sum(mu[[k]] * log(mu[[k]]/mu[[l]]) + mu[[l]] - mu[[k]]) z[l,k] <- sum(mu[[l]] * log(mu[[l]]/mu[[k]]) + mu[[k]] - mu[[l]]) } } } else if (object@family == "gamma") { shape <- lapply(components, function(x) x@parameters$shape) for (k in seq_len(ncol(z)-1)) { for (l in seq_len(ncol(z))[-1]) { X <- mu[[k]]*shape[[l]]/mu[[l]]/shape[[k]] z[k,l] <- sum(log(gamma(shape[[l]])/gamma(shape[[k]])) + shape[[l]] * log(X) - shape[[k]] * (1 - 1/X) + (shape[[k]] - shape[[l]])*digamma(shape[[k]])) z[l,k] <- sum(log(gamma(shape[[k]])/gamma(shape[[l]])) - shape[[k]] * log(X) - shape[[l]] * (1 - X) + (shape[[l]] - shape[[k]])*digamma(shape[[l]])) } } } else stop(paste("Unknown family", object@family)) diag(z) <- 0 z }) setMethod("KLdiv", "FLXMC", function(object, components, ...) { z <- matrix(NA, length(components), length(components)) if (object@dist == "mvnorm") { center <- lapply(components, function(x) x@parameters$center) cov <- lapply(components, function(x) x@parameters$cov) for (k in seq_len(ncol(z)-1)) { for (l in seq_len(ncol(z))[-1]) { z[k,l] <- 1/2 * (log(det(cov[[l]])) - log(det(cov[[k]])) - length(center[[k]]) + sum(diag(solve(cov[[l]]) %*% (cov[[k]] + tcrossprod(center[[k]] - center[[l]]))))) z[l,k] <- 1/2 * (log(det(cov[[k]])) - log(det(cov[[l]])) - length(center[[l]]) + sum(diag(solve(cov[[k]]) %*% (cov[[l]] + tcrossprod(center[[l]] - center[[k]]))))) } } } else stop(paste("Unknown distribution", object@dist)) diag(z) <- 0 z }) ###********************************************************** flexmix/R/group.R0000644000175100001440000000061511373773453013443 0ustar hornikuserssetMethod("group", signature(object="flexmix"), function(object) { group <- object@group if (!length(group)) group <- group(object@model[[1]]) group }) setMethod("group", signature(object="FLXM"), function(object) { factor(seq_len(nrow(object@x))) }) setMethod("group", signature(object="FLXMRglmfix"), function(object) { factor(seq_len(nrow(object@x)/sum(object@nestedformula@k))) }) flexmix/R/FLXMCdist1.R0000644000175100001440000002123112653423105014106 0ustar hornikusers## Note that the implementation of the weighted ML estimation is ## influenced and inspired by the function fitdistr from package MASS ## and function fitdist from package fitdistrplus. FLXMCdist1 <- function(formula=.~., dist, ...) { foo <- paste("FLXMC", dist, sep = "") if (!exists(foo)) stop("This distribution has not been implemented yet.") get(foo)(formula, ...) } prepoc.y.pos.1 <- function(x) { if (ncol(x) > 1) stop("for the inverse gaussian family y must be univariate") if (any(x < 0)) stop("values must be >= 0") x } FLXMClnorm <- function(formula=.~., ...) { z <- new("FLXMC", weighted=TRUE, formula=formula, dist = "lnorm", name="model-based log-normal clustering") z@preproc.y <- prepoc.y.pos.1 z@defineComponent <- function(para) { predict <- function(x, ...) matrix(para$meanlog, nrow = nrow(x), ncol = 1, byrow = TRUE) logLik <- function(x, y) dlnorm(y, meanlog = predict(x, ...), sdlog = para$sdlog, log = TRUE) new("FLXcomponent", parameters = list(meanlog = para$meanlog, sdlog = para$sdlog), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, ...) { logy <- log(y); meanw <- mean(w) meanlog <- mean(w * logy) / meanw sdlog <- sqrt(mean(w * (logy - meanlog)^2) / meanw) z@defineComponent(list(meanlog = meanlog, sdlog = sdlog, df = 2)) } z } FLXMCinvGauss <- function(formula=.~., ...) { z <- new("FLXMC", weighted=TRUE, formula=formula, name = "model-based inverse Gaussian clustering", dist = "invGauss") z@preproc.y <- prepoc.y.pos.1 z@defineComponent <- function(para) { predict <- function(x, ...) matrix(para$nu, nrow = nrow(x), ncol = length(para$nu), byrow = TRUE) logLik <- function(x, y, ...) SuppDists::dinvGauss(y, nu = predict(x, ...), lambda = para$lambda, log = TRUE) new("FLXcomponent", parameters = list(nu = para$nu, lambda = para$lambda), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, ...){ nu <- mean(w * y) / mean(w) lambda <- mean(w) / mean(w * (1 / y - 1 / nu)) z@defineComponent(list(nu = nu, lambda = lambda, df = 2)) } z } FLXMCgamma <- function(formula=.~., method = "Nelder-Mead", warn = -1, ...) { z <- new("FLXMC", weighted=TRUE, formula=formula, name = "model-based gamma clustering", dist = "gamma") z@preproc.y <- prepoc.y.pos.1 z@defineComponent <- function(para) { predict <- function(x, ...) matrix(para$shape, nrow = nrow(x), ncol = length(para$shape), byrow = TRUE) logLik <- function(x, y, ...) dgamma(y, shape = predict(x, ...), rate = para$rate, log = TRUE) new("FLXcomponent", parameters = list(shape = para$shape, rate = para$rate), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, component){ if (!length(component)) { sw <- sum(w) mean <- sum(y * w) / sw var <- (sum(y^2 * w) / sw - mean^2) * sw / (sw - 1) start <- c(mean^2/var, mean/var) } else start <- unname(unlist(component)) control <- list(parscale = c(1, start[2])) f <- function(parms) -sum(dgamma(y, shape = parms[1], rate = parms[2], log = TRUE) * w) oop <- options(warn = warn) on.exit(oop) parms <- optim(start, f, method = method, control = control)$par z@defineComponent(list(shape = parms[1], rate = parms[2], df = 2)) } z } FLXMCexp <- function(formula=.~., ...) { z <- new("FLXMC", weighted=TRUE, formula=formula, name = "model-based exponential clustering", dist = "exp") z@preproc.y <- prepoc.y.pos.1 z@defineComponent <- function(para) { predict <- function(x, ...) matrix(para$rate, nrow = nrow(x), ncol = length(para$rate), byrow = TRUE) logLik <- function(x, y, ...) dexp(y, rate = predict(x, ...), log = TRUE) new("FLXcomponent", parameters = list(rate = para$rate), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, component) z@defineComponent(list(rate = mean(w) / mean(w * y), df = 1)) z } FLXMCweibull <- function(formula=.~., method = "Nelder-Mead", warn = -1, ...) { z <- new("FLXMC", weighted=TRUE, formula=formula, name = "model-based Weibull clustering", dist = "weibull") z@preproc.y <- prepoc.y.pos.1 z@defineComponent <- function(para) { predict <- function(x, ...) matrix(para$shape, nrow = nrow(x), ncol = length(para$shape), byrow = TRUE) logLik <- function(x, y, ...) dweibull(y, shape = predict(x, ...), scale = para$scale, log = TRUE) new("FLXcomponent", parameters = list(shape = para$shape, scale = para$scale), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, component){ if (!length(component)) { ly <- log(y) sw <- sum(w) mean <- sum(ly * w) / sw var <- (sum(ly^2 * w) / sw - mean^2) * sw / (sw - 1) shape <- 1.2/sqrt(var) scale <- exp(mean + 0.572/shape) start <- c(shape, scale) } else start <- unname(unlist(component)) f <- function(parms) -sum(dweibull(y, shape = parms[1], scale = parms[2], log = TRUE) * w) oop <- options(warn = warn) on.exit(oop) parms <- optim(start, f, method = method)$par z@defineComponent(list(shape = parms[1], scale = parms[2], df = 2)) } z } FLXMCburr <- function(formula=.~., start = NULL, method = "Nelder-Mead", warn = -1, ...) { z <- new("FLXMC", weighted=TRUE, formula=formula, name = "model-based Burr clustering", dist = "burr") z@preproc.y <- prepoc.y.pos.1 z@defineComponent <- function(para) { predict <- function(x, ...) matrix(para$shape1, nrow = nrow(x), ncol = length(para$shape1), byrow = TRUE) logLik <- function(x, y, ...) actuar::dburr(y, shape1 = predict(x, ...), shape2 = para$shape2, scale = para$scale, log = TRUE) new("FLXcomponent", parameters = list(shape1 = para$shape1, shape2 = para$shape2, scale = para$scale), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, component){ if (!length(component)) { if (is.null(start)) start <- c(1, 1) } else start <- unname(unlist(component[2:3])) f <- function(parms) { shape1 <- sum(w) / sum(w * log(1 + (y/parms[2])^parms[1])) -sum(actuar::dburr(y, shape1 = shape1, shape2 = parms[1], scale = parms[2], log = TRUE) * w) } oop <- options(warn = warn) on.exit(oop) parms <- optim(start, f, method = method)$par z@defineComponent(list(shape1 = sum(w) / sum(w * log(1 + (y/parms[2])^parms[1])), shape2 = parms[1], scale = parms[2], df = 3)) } z } FLXMCinvburr <- function(formula=.~., start = NULL, warn = -1, ...) { z <- new("FLXMC", weighted=TRUE, formula=formula, name = "model-based Inverse Burr clustering", dist = "invburr") z@preproc.y <- prepoc.y.pos.1 z@defineComponent <- function(para) { predict <- function(x, ...) matrix(para$shape1, nrow = nrow(x), ncol = length(para$shape1), byrow = TRUE) logLik <- function(x, y, ...) actuar::dinvburr(y, shape1 = predict(x, ...), shape2 = para$shape2, scale = para$scale, log = TRUE) new("FLXcomponent", parameters = list(shape1 = para$shape1, shape2 = para$shape2, scale = para$scale), predict = predict, logLik = logLik, df = para$df) } z@fit <- function(x, y, w, component){ if (!length(component)) { if (is.null(start)) start <- c(1, 1) } else start <- unname(unlist(component[2:3])) f <- function(parms) { shape1 <- sum(w) / sum(w * log(1 + (parms[2]/y)^parms[1])) -sum(actuar::dinvburr(y, shape1 = shape1, shape2 = parms[1], scale = parms[2], log = TRUE) * w) } oop <- options(warn = warn) on.exit(oop) parms <- optim(start, f, method = "Nelder-Mead")$par z@defineComponent(list(shape1 = sum(w) / sum(w * log(1 + (parms[2]/y)^parms[1])), shape2 = parms[1], scale = parms[2], df = 3)) } z } flexmix/R/lmm.R0000644000175100001440000002413213673046456013075 0ustar hornikuserssetClass("FLXcomponentlmm", representation(random="list"), contains = "FLXcomponent") setClass("FLXMRlmm", representation(family = "character", random = "formula", group = "factor", z = "matrix", which = "ANY"), contains = "FLXMR") setClass("FLXMRlmmfix", contains = "FLXMRlmm") setMethod("allweighted", signature(model = "FLXMRlmm", control = "ANY", weights = "ANY"), function(model, control, weights) { if (!control@classify %in% c("auto", "weighted")) stop("Model class only supports weighted ML estimation.") model@weighted }) FLXMRlmm <- function(formula = . ~ ., random, lm.fit = c("lm.wfit", "smooth.spline"), varFix = c(Random = FALSE, Residual = FALSE), ...) { family <- "gaussian" lm.fit <- match.arg(lm.fit) if (length(varFix) != 2 || is.null(names(varFix)) || any(is.na(pmatch(names(varFix), c("Random", "Residual"))))) stop("varFix has to be a named vector of length two") else names(varFix) <- c("Random", "Residual")[pmatch(names(varFix), c("Random", "Residual"))] random <- if (length(random) == 3) random else formula(paste(".", paste(deparse(random), collapse = ""))) object <- new("FLXMRlmm", formula = formula, random = random, weighted = TRUE, family = family, name = "FLXMRlmm:gaussian") if (any(varFix)) object <- new("FLXMRlmmfix", object) object@preproc.y <- function(x){ if (ncol(x) > 1) stop(paste("y must be univariate")) x } if (lm.fit == "smooth.spline") { object@preproc.x <- function(x){ if (ncol(x) > 1) stop(paste("x must be univariate")) x } } add <- function(x) Reduce("+", x) lmm.wfit <- function(x, y, w, z, which, random) { effect <- lapply(seq_along(which), function(i) z[[which[i]]] %*% random$beta[[i]]) W <- rep(w, sapply(x, nrow)) X <- do.call("rbind", x) Y <- do.call("rbind", y) Effect <- do.call("rbind", effect) fit <- get(lm.fit)(X, Y - Effect, W, ...) XSigmaX <- sapply(seq_along(z), function(i) sum(diag(crossprod(z[[i]]) %*% random$Sigma[[i]]))) wSum <- tapply(w, which, sum) sigma2 <- (sum(W*residuals(fit)^2) + sum(wSum*XSigmaX))/sum(W) wSigma <- add(lapply(seq_along(z), function(i) wSum[i]*random$Sigma[[i]])) bb <- add(lapply(seq_along(which), function(i) tcrossprod(random$beta[[i]])*w[i])) psi <- (wSigma + bb)/sum(w) list(coefficients = if (is(fit, "smooth.spline")) fit$fit else coef(fit), sigma2 = list(Random = psi, Residual = sigma2), df = if (is(fit, "smooth.spline")) fit$df else ncol(x[[1]])) } object@defineComponent <- function(para) { predict <- function(x, ...) { if (is(para$coef, "smooth.spline.fit")) lapply(x, function(X) getS3method("predict", "smooth.spline.fit")(para$coef, X)$y) else lapply(x, function(X) X %*% para$coef) } logLik <- function(x, y, z, which, group, ...) { V <- lapply(z, function(Z) tcrossprod(tcrossprod(Z, para$sigma2$Random), Z) + diag(nrow(Z)) * para$sigma2$Residual) mu <- predict(x, ...) llh <- sapply(seq_along(x), function(i) mvtnorm::dmvnorm(t(y[[i]]), mean = mu[[i]], sigma = V[[which[i]]], log=TRUE)/nrow(V[[which[i]]])) as.vector(ungroupPriors(matrix(llh), group, !duplicated(group))) } new("FLXcomponentlmm", parameters = list(coef = para$coef, sigma2 = para$sigma2), random = list(), logLik = logLik, predict = predict, df = para$df) } determineRandom <- function(mu, y, z, which, sigma2) { Sigma <- lapply(z, function(Z) solve(crossprod(Z) / sigma2$Residual + solve(sigma2$Random))) Sigma_tilde <- lapply(seq_along(z), function(i) (tcrossprod(Sigma[[i]], z[[i]])/sigma2$Residual)) beta <- lapply(seq_along(which), function(i) Sigma_tilde[[which[i]]] %*% (y[[i]] - mu[[i]])) list(beta = beta, Sigma = Sigma) } object@fit <- if (any(varFix)) { function(x, y, w, z, which, random) { fit <- lapply(seq_len(ncol(w)), function(k) lmm.wfit(x, y, w[,k], z, which, random[[k]])) if (varFix["Random"]) { prior_w <- apply(w, 2, weighted.mean, w = sapply(x, length)) Random <- add(lapply(seq_along(fit), function(i) fit[[i]]$sigma2$Random * prior_w[i])) for (i in seq_along(fit)) fit[[i]]$sigma2$Random <- Random } if (varFix["Residual"]) { prior <- colMeans(w) Residual <- sum(sapply(fit, function(x) x$sigma2$Residual) * prior) for (i in seq_along(fit)) fit[[i]]$sigma2$Residual <- Residual } n <- nrow(fit[[1]]$sigma2$Random) lapply(fit, function(Z) { comp <- object@defineComponent(list(coef = coef(Z), sigma2 = Z$sigma2, df = Z$df + n*(n+1)/(2*ifelse(varFix["Random"], ncol(w), 1)) + ifelse(varFix["Residual"], 1/ncol(w), 1))) comp@random <- determineRandom(comp@predict(x), y, z, which, comp@parameters$sigma2) comp }) } } else { function(x, y, w, z, which, random){ fit <- lmm.wfit(x, y, w, z, which, random) n <- nrow(fit$sigma2$Random) comp <- object@defineComponent( list(coef = coef(fit), df = fit$df + n*(n+1)/2 + 1, sigma2 = fit$sigma2)) comp@random <- determineRandom(comp@predict(x), y, z, which, comp@parameters$sigma2) comp } } object } setMethod("FLXmstep", signature(model = "FLXMRlmm"), function(model, weights, components) { weights <- weights[!duplicated(model@group),,drop=FALSE] if (!is(components[[1]], "FLXcomponentlmm")) { random <- list(beta = lapply(model@which, function(i) rep(0, ncol(model@z[[i]]))), Sigma = lapply(model@z, function(x) diag(ncol(x)))) return(sapply(seq_len(ncol(weights)), function(k) model@fit(model@x, model@y, weights[,k], model@z, model@which, random))) }else { return(sapply(seq_len(ncol(weights)), function(k) model@fit(model@x, model@y, weights[,k], model@z, model@which, components[[k]]@random))) } }) setMethod("FLXmstep", signature(model = "FLXMRlmmfix"), function(model, weights, components) { weights <- weights[!duplicated(model@group),,drop=FALSE] if (!is(components[[1]], "FLXcomponentlmm")) { random <- rep(list(list(beta = lapply(model@which, function(i) rep(0, ncol(model@z[[i]]))), Sigma = lapply(model@z, function(x) diag(ncol(x))))), ncol(weights)) return(model@fit(model@x, model@y, weights, model@z, model@which, random)) }else return(model@fit(model@x, model@y, weights, model@z, model@which, lapply(components, function(x) x@random))) }) setMethod("FLXgetModelmatrix", signature(model="FLXMRlmm"), function(model, data, formula, lhs=TRUE, ...) { formula_nogrouping <- RemoveGrouping(formula) if (identical(paste(deparse(formula_nogrouping), collapse = ""), paste(deparse(formula), collapse = ""))) stop("please specify a grouping variable") model <- callNextMethod(model, data, formula, lhs) model@fullformula <- update(model@fullformula, paste(".~. |", .FLXgetGroupingVar(formula))) mt1 <- terms(model@random, data=data) mf <- model.frame(delete.response(mt1), data=data, na.action = NULL) model@z <- model.matrix(attr(mf, "terms"), data) model@group <- grouping <- .FLXgetGrouping(formula, data)$group rownames(model@z) <- rownames(model@x) <- rownames(model@y) <- NULL model@x <- matrix(lapply(unique(grouping), function(g) model@x[grouping == g, , drop = FALSE]), ncol = 1) if (lhs) model@y <- matrix(lapply(unique(grouping), function(g) model@y[grouping == g, , drop = FALSE]), ncol = 1) z <- lapply(unique(grouping), function(g) model@z[grouping == g, , drop = FALSE]) z1 <- unique(z) if (length(z) == length(z1)) { model@which <- seq_along(z) } else { model@which <- sapply(z, function(y) which(sapply(z1, function(x) isTRUE(all.equal(x, y))))) } model@z <- matrix(z1, ncol = 1) model }) setMethod("FLXgetObs", "FLXMRlmm", function(model) sum(sapply(model@x, nrow))) setMethod("FLXdeterminePostunscaled", signature(model = "FLXMRlmm"), function(model, components, ...) { sapply(components, function(x) x@logLik(model@x, model@y, model@z, model@which, model@group)) }) setMethod("predict", signature(object="FLXMRlmm"), function(object, newdata, components, ...) { object <- FLXgetModelmatrix(object, newdata, formula = object@fullformula, lhs = FALSE) lapply(components, function(comp) unlist(comp@predict(object@x, ...))) }) setMethod("rFLXM", signature(model="FLXMRlmm", components="list"), function(model, components, class, group, ...) { class <- class[!duplicated(group)] y <- NULL for (l in seq_along(components)) { yl <- as.matrix(rFLXM(model, components[[l]], ...)) if (is.null(y)) y <- matrix(NA, nrow = length(class), ncol = ncol(yl)) y[class == l,] <- yl[class==l,,drop=FALSE] y <- matrix(y, ncol = ncol(yl)) } y }) setMethod("rFLXM", signature(model = "FLXMRlmm", components = "FLXcomponent"), function(model, components, ...) { sigma2 <- components@parameters$sigma2 V <- lapply(model@z, function(Z) tcrossprod(tcrossprod(Z, sigma2$Random), Z) + diag(nrow(Z)) * sigma2$Residual) mu <- components@predict(model@x) matrix(lapply(seq_along(model@x), function(i) t(mvtnorm::rmvnorm(1, mean = mu[[i]], sigma = V[[model@which[i]]]))), ncol = 1) }) setMethod("FLXgetNewModelmatrix", "FLXMRlmm", function(object, model, indices, groups) { object@y <- model@y[indices,,drop=FALSE] object@x <- model@x[indices,,drop=FALSE] object@which <- model@which[indices] if (length(unique(object@which)) < length(object@z)) { object@z <- model@z[sort(unique(object@which)),,drop=FALSE] object@which <- match(object@which, sort(unique(object@which))) } object }) flexmix/R/stepFlexmix.R0000644000175100001440000001351312653423105014604 0ustar hornikusers# # Copyright (C) 2004-2016 Friedrich Leisch and Bettina Gruen # $Id: stepFlexmix.R 5079 2016-01-31 12:21:12Z gruen $ # setClass("stepFlexmix", representation(models="list", k="integer", nrep="integer", logLiks="matrix", call="call")) stepFlexmix <- function(..., k=NULL, nrep=3, verbose=TRUE, drop=TRUE, unique=FALSE) { MYCALL <- match.call() MYCALL1 <- MYCALL bestFlexmix <- function(...) { z = new("flexmix", logLik=-Inf) logLiks = rep(NA, length.out = nrep) for(m in seq_len(nrep)){ if(verbose) cat(" *") x = try(flexmix(...)) if (!is(x, "try-error")) { logLiks[m] <- logLik(x) if(logLik(x) > logLik(z)) z = x } } return(list(z = z, logLiks = logLiks)) } z = list() if(is.null(k)){ RET = bestFlexmix(...) z[[1]] <- RET$z logLiks <- as.matrix(RET$logLiks) z[[1]]@call <- MYCALL z[[1]]@control@nrep <- nrep names(z) <- as.character(z[[1]]@k) if(verbose) cat("\n") } else{ k = as.integer(k) logLiks <- matrix(nrow = length(k), ncol = nrep) for(n in seq_along(k)){ ns <- as.character(k[n]) if(verbose) cat(k[n], ":") RET <- bestFlexmix(..., k=k[n]) z[[ns]] = RET$z logLiks[n,] <- RET$logLiks MYCALL1[["k"]] <- as.numeric(k[n]) z[[ns]]@call <- MYCALL1 z[[ns]]@control@nrep <- nrep if(verbose) cat("\n") } } logLiks <- logLiks[is.finite(sapply(z, logLik)),,drop=FALSE] z <- z[is.finite(sapply(z, logLik))] rownames(logLiks) <- names(z) if (!length(z)) stop("no convergence to a suitable mixture") if(drop & (length(z)==1)){ return(z[[1]]) } else{ z <- return(new("stepFlexmix", models=z, k=as.integer(names(z)), nrep=as.integer(nrep), logLiks=logLiks, call=MYCALL)) if(unique) z <- unique(z) return(z) } } ###********************************************************** setMethod("unique", "stepFlexmix", function(x, incomparables=FALSE, ...) { z <- list() K <- sapply(x@models, function(x) x@k) logLiks <- x@logLiks keep <- rep(TRUE, nrow(logLiks)) for(k in sort(unique(K))){ n <- which(k==K) if(length(n)>1){ l <- sapply(x@models[n], logLik) z[as.character(k)] <- x@models[n][which.max(l)] keep[n[-which.max(l)]] <- FALSE } else z[as.character(k)] <- x@models[n] } logLiks <- logLiks[keep,,drop=FALSE] rownames(logLiks) <- names(z) attr(logLiks, "na.action") <- NULL mycall <- x@call mycall["unique"] <- TRUE return(new("stepFlexmix", models=z, k=as.integer(names(z)), nrep=x@nrep, logLiks=logLiks, call=mycall)) }) ###********************************************************** setMethod("show", "stepFlexmix", function(object) { cat("\nCall:", deparse(object@call,0.75*getOption("width")), sep="\n") cat("\n") z <- data.frame(iter = sapply(object@models, function(x) x@iter), converged = sapply(object@models, function(x) x@converged), k = sapply(object@models, function(x) x@k), k0 = sapply(object@models, function(x) x@k0), logLik = sapply(object@models, function(x) logLik(x)), AIC = AIC(object), BIC = BIC(object), ICL = ICL(object)) print(z, na.string="") }) setMethod("nobs", signature(object="stepFlexmix"), function(object, ...) { sapply(object@models, nobs) }) setMethod("logLik", "stepFlexmix", function(object, ..., k = 2) { ll <- lapply(object@models, function(x) logLik(x)) df <- sapply(ll, attr, "df") nobs <- sapply(ll, attr, "nobs") ll <- unlist(ll) attr(ll, "df") <- df attr(ll, "nobs") <- nobs class(ll) <- "logLik" ll }) setMethod("ICL", "stepFlexmix", function(object, ...) { sapply(object@models, function(x) ICL(x, ...)) }) setMethod("EIC", "stepFlexmix", function(object, ...) { sapply(object@models, function(x) EIC(x, ...)) }) ###********************************************************** setMethod("getModel", "stepFlexmix", function(object, which="BIC") { if(which=="AIC") which <- which.min(sapply(object@models, function(x) AIC(x))) if(which=="BIC") which <- which.min(sapply(object@models, function(x) BIC(x))) if(which=="ICL") which <- which.min(sapply(object@models, function(x) ICL(x))) object@models[[which]] } ) ###********************************************************** setMethod("plot", signature(x="stepFlexmix", y="missing"), function(x, y, what=c("AIC", "BIC", "ICL"), xlab=NULL, ylab=NULL, legend="topright", ...) { X <- x@k Y <- NULL for(w in what){ Y <- cbind(Y, do.call(w, list(object=x))) } if(is.null(xlab)) xlab <- "number of components" if(is.null(ylab)){ if(length(what)==1) ylab <- what else ylab <- "" } matplot(X, Y, xlab=xlab, ylab=ylab, type="b", lty=1, pch=seq_along(what), ...) if(legend!=FALSE && length(what)>1) legend(x=legend, legend=what, pch=seq_along(what), col=seq_along(what)) for(n in seq_len(ncol(Y))){ m <- which.min(Y[,n]) points(X[m], Y[m,n], pch=16, cex=1.5, col=n) } }) flexmix/R/glmnet.R0000644000175100001440000000724112653423105013563 0ustar hornikusers#' @title flexmix model driver for adaptive lasso (elastic-net) with GLMs #' @author F. Mortier (fmortier@cirad.fr) and N. Picard (nicolas.picard@cirad.fr) #' @param formula A symbolic description of the model to be fit. #' The general form is y~x|g where y is the response, x the set of predictors and g an #' optional grouping factor for repeated measurements. #' @param family a description of the error distribution and link function to be used in the model. #' "gausian", "poisson" and "binomial" are allowed. #' @param adaptive boolean indicating if algorithm should perform adaptive lasso or not #' @param select boolean vector indicating which covariates will be included in the selection process. #' Others will be included in the model. #' @details Some care is needed to ensure convergence of the #' algorithm, which is computationally more challenging than a standard EM. #' In the proposed method, not only are cluster allocations identified #' and component parameters estimated as commonly done in mixture models, #' but there is also variable selection via penalized regression using #' $k$-fold cross-validation to choose the penalty parameter. #' For the algorithm to converge, it is necessary that the same cross-validation #' partitioning be used across the EM iterations, i.e., #' the subsamples for cross-validation must be defined at the beginning #' This is accomplished using the {\tt foldid} option #' as an additional parameter to be passed to \code{\link{cv.glmnet}} (see \link{glmnet} package documentation). FLXMRglmnet <- function(formula = .~., family = c("gaussian", "binomial", "poisson"), adaptive = TRUE, select = TRUE, offset = NULL, ...) { family <- match.arg(family) z <- FLXMRglm(formula = formula, family = family) z@preproc.x <- function(x) { if (!isTRUE(all.equal(x[, 1], rep(1, nrow(x)), check.attributes = FALSE))) stop("The model needs to include an intercept in the first column.") x } z@fit <- function(x, y, w) { if (all(!select)) { coef <- if (family == "gaussian") lm.wfit(x, y, w = w)$coef else if (family == "binomial") glm.fit(x, y, family = binomial(), weights = w)$coef else if (family == "poisson") glm.fit(x, y, family=poisson(), weights = w)$coef } else { if (adaptive) { coef <- if (family == "gaussian") lm.wfit(x, y, w = w)$coef[-1] else if(family == "binomial") glm.fit(x, y, family = binomial(), weights = w)$coef[-1] else if (family == "poisson") glm.fit(x, y, family = poisson(), weights = w)$coef[-1] penalty <- mean(w) / abs(coef) } else penalty <- rep(1, ncol(x) - 1) if (any(!select)){ select <- which(!select) penalty[select] <- 0 } m <- glmnet::cv.glmnet(x[, -1, drop = FALSE], y, family = family, weights = w, penalty.factor = penalty, ...) coef <- as.vector(coef(m, s = "lambda.min")) } df <- sum(coef != 0) sigma <- if (family == "gaussian") sqrt(sum(w * (y - x %*% coef)^2/mean(w))/(nrow(x) - df)) else NULL z@defineComponent( list(coef = coef, sigma = sigma, df = df + ifelse(family == "gaussian", 1, 0))) } z } flexmix/MD50000644000175100001440000001670313741010604012257 0ustar hornikusers26b9aabc712741ed0e3b5f3077d09d2a *DESCRIPTION b54919342a017b1dd43d2f7bba67eeef *NAMESPACE 88a1e6330ac4ebbddc726522a46dfc34 *R/FLXMCdist1.R 0964dce38a7f3b491c9eef5ecedbcd68 *R/allClasses.R ebb73a41e988babd784db3f85a6b966e *R/allGenerics.R b03125231df0214b1395c7ef7f9bf25d *R/boot.R 889f52aae8df7342a12c941702964959 *R/concomitant.R ffe49b2c72bb7df7681bfd5f450468de *R/condlogit.R 3495256b72a55590ac6bd775f3782028 *R/examples.R 3ebb141d9c261a101e884f66f81a9120 *R/factanal.R c4cbbe2b096216ad85ac881bb13713a1 *R/flexmix.R ac7d510575121174e050def18e1d8f68 *R/flexmixFix.R 3eba12e52c7117b1dc31709f780bace7 *R/flxdist.R e46cc7864775903c177d0fbebf62562f *R/flxmcmvpois.R 5c565a257540fde3a2c29cde0181421b *R/flxmcsparse.R 94cecec609f15f14b8eed8002bb5b792 *R/glmFix.R d49134e08be219e48ebaa680b76e647e *R/glmnet.R c5c5f8a325c65778e15792e456459ff2 *R/group.R f929b19e094c157d3556617cafd46a31 *R/infocrit.R 296476baa3f3e730cc906d1d1663c0a0 *R/initFlexmix.R d509a6bcd55ec42162950011f0e3fedb *R/kldiv.R 2ad7b23c815889ec724736b3b5b0f017 *R/lattice.R 49e5b8eef79f6f8884e4e0323329b78f *R/lmer.R 5e9c1a083238f5e9310c257036db61cc *R/lmm.R bd71d0d6bb0867c1957058595ff5800e *R/lmmc.R 5a7ccfa40918a1075c31b79b9b713c64 *R/mgcv.R 2d40a708cbab9a061aa4f2ab7e8c978a *R/models.R a1543ac30b4c4faca4ebdd23e5fca5f3 *R/multinom.R 7a1d8c2b82999b1bd1e0419b00117498 *R/plot-FLXboot.R 621a422936c28bdebd8fbbe1d9fe7970 *R/plot-flexmix.R 4a0e5ec24c4b8b048afd7473bbbf0cb4 *R/plot-refit.R 2f3409e7007c2e61fc5ee28aaef440d5 *R/plot.R ce8c2d2018c456648e26145ea1cbc038 *R/rFLXmodel.R 2dce928976d164087b04d9edba0771eb *R/refit.R 89f17e9ffcdd456af71b16580a64ab7c *R/relabel.R 942a774a6195a4cf5da06bfefc18adb6 *R/rflexmix.R aee09f6209b75aaf4f4aaea863fb9352 *R/robust.R 6c4c0f1663db73d9c2a8fd48ab78eb2e *R/stepFlexmix.R 06a4c9417ad23fc25ba52d1be38dee42 *R/utils.R 90d0c43f34243c3adbb022664bd0ddf5 *R/z.R 16c7cb035f39de0d66d086ecdb22fbe5 *R/ziglm.R 97b540bc49683218aaf192f4050417bf *build/vignette.rds 484d982c6ffca3ab0f7e0112cdf0acf0 *data/BregFix.RData 2664238d56ca79a95849a7e0728dea2e *data/Mehta.RData 9e7bb707528c159dd8403aa422f6fe67 *data/NPreg.RData f509a39ef9572599b87076839a91912b *data/Nclus.RData c5be3e6ea55852e1fe58e0d829542363 *data/NregFix.RData 63c3b5a803c3420fb2b9b5dd2623fdb2 *data/betablocker.RData 96dbbaa71b3974cc75290e118b3d2865 *data/bioChemists.RData a35d1db8691a5b9fb8b6fbd4c262fd38 *data/candy.RData 9a5a61aac0ea9ad237dd51c8c726e07c *data/dmft.RData 551400514b13a79fc19fe0041650d6e7 *data/fabricfault.RData 59daaf9e3f3c64806433db2fc25f61d5 *data/patent.RData f53cbfa94cbb22c8ba6a8c5d54895e88 *data/salmonellaTA98.txt.gz d63b913a914bd10680aa89a2664d85ee *data/seizure.RData 0224fdba9c8dfe5bb28d9bb6c7aaf7e5 *data/tribolium.RData 84dbf59c93844ed18d669df9b5f81f81 *data/trypanosome.RData 701af3fca0a9d50e320c5cd28e755cc8 *data/whiskey.RData 83e4f2f251e78e3156937d0f20970270 *inst/CITATION 5be9e03d996cbdcb83f46d465ddee703 *inst/NEWS.Rd 66abb9674dc55bc9dda69ea64ec37fcb *inst/doc/bootstrapping.R e2057aa3aa3ee107d93fbe11a6f356d6 *inst/doc/bootstrapping.Rnw 82636aba5c882e84b1fb2e032312ac2a *inst/doc/bootstrapping.pdf 6c97ed30becc0159537caec0aa6f7835 *inst/doc/flexmix-intro.R c5a3e4b887e0caf2b8e1383071e699fd *inst/doc/flexmix-intro.Rnw 00fac81fd9cfd02914eb16a2e9f67362 *inst/doc/flexmix-intro.pdf be0a42d594f1a80d36f502d9f5504e0f *inst/doc/mixture-regressions.R c6745ee38eba2a694d6df5d497adb7b9 *inst/doc/mixture-regressions.Rnw d468d8b56a9613b6a8f331bf6761e41b *inst/doc/mixture-regressions.pdf 6dca73aa5a96343db67a43c9835bb4bf *inst/doc/myConcomitant.R fb9ae81acbfcada421bbd89681834714 *inst/doc/mymclust.R 76f412c774347259ff904027864b759c *inst/doc/regression-examples.R 94b27d5378111289be0df2afaf4bdfab *inst/doc/regression-examples.Rnw 79bef79a14684004bd81a1d0c6b62e99 *inst/doc/regression-examples.pdf 76a28867c7670eb60951e3b1d2d77d33 *inst/doc/ziglm.R 1d39a7829ea8ce6aa54c11a0a06780eb *man/AIC-methods.Rd 00c18dd702febe081d951aa73ebb95d0 *man/BIC-methods.Rd cad198606d9e736399f5c5fc540786a1 *man/BregFix.Rd 85c040578c4b3ca0594b016b90336792 *man/EIC.Rd 85d7f2bae2833443d209050759a2e525 *man/ExLinear.Rd 7ed1926717bdc73c8e6b117c5075eb0e *man/ExNPreg.Rd cf4a61f3fbf44d92894525cbff4ef003 *man/ExNclus.Rd 78e72f66ed96403287e0eb63e33f4ab1 *man/FLXMCdist1.Rd 4c28bd39db43ab9080cbfb2b2d495054 *man/FLXMCfactanal.Rd 692b3facd60fa4125aff97003555a621 *man/FLXMCmvcombi.Rd ba41986c3ff634c81b8f5b44955efe92 *man/FLXMCmvpois.Rd cd2d92661ee530052fd637930c3a1cdd *man/FLXMRcondlogit.Rd 4628f562cd45f409dd16ea2cc7d3eca4 *man/FLXMRglmnet.Rd 9986fd3a37b6a2f810d7200324a92524 *man/FLXMRlmer.Rd fcba2b7fc629a4f86356903bb1c38691 *man/FLXMRlmmc.Rd 94f4aa1616d758b3252d3f0b4b17842e *man/FLXMRmgcv.Rd 55014e2f3276e6b59c0ea5c5d7206bc6 *man/FLXMRmultinom.Rd 9683eb48c27e0a90738af42b16aa0820 *man/FLXMRrobglm.Rd a9623e0383c948ca9803a18b5528f090 *man/FLXMRziglm.Rd 1be70d781f7affbf5b51663f75fa87e0 *man/FLXP-class.Rd e5014d435eb288059e6daa8b9163d8e7 *man/FLXbclust.Rd c87d4220e578ac71869feed74a3d7c47 *man/FLXcomponent-class.Rd 1348b9444773021d770f7463579961ff *man/FLXconcomitant.Rd eff1590dbfbd4e3f1783fe61b20037d6 *man/FLXcontrol-class.Rd f8a1b4148b65b193d78ca1159e888a0d *man/FLXdist-class.Rd 28a563506d19c0836af092f0c3f15775 *man/FLXdist.Rd 47b0ea1622e710755d45534208ad95ea *man/FLXfit.Rd 2c91e46fd8c6120a6fd8bc4ca30a0651 *man/FLXglm.Rd b2fb5d0cee6a2e15ce31819dbd5f540b *man/FLXglmFix.Rd 24a39ce85331b9ddbb500d499932fee1 *man/FLXmclust.Rd c799b22788476c9ca16a38d7dc7f5658 *man/FLXmodel-class.Rd afbfbeb61e91eda57fbaa568a39b38e2 *man/FLXnested-class.Rd 0768bed00f7a8554c33329522dfaa169 *man/ICL.Rd 028fc57ce85d724790cc7da759a24dd7 *man/KLdiv.Rd f6736b5d249d5d684f1464180b8a3b59 *man/Lapply-methods.Rd edab8de219b6630db7a71d22366f70d3 *man/Mehta.Rd 8f55051592bec6c88e23c7d81f57d38b *man/NregFix.Rd fb40ad5bde9b66ddc38d3572ff7429cb *man/betablocker.Rd d67b3b5b0eed42a593c0268b9e6aab21 *man/bioChemists.Rd fdb60dd3f31d2281e7fa21e38a3c8b76 *man/boot.Rd b4db12be29b542f9bea083d3bd0c980e *man/candy.Rd 5a69cda63c913ef33f104c6d5adb3729 *man/dmft.Rd 78db5196994b9a665e4c17fb6653c93f *man/fabricfault.Rd cd0b0ac588e0bd163a930ddbd0d8ae4f *man/fitted.Rd b53ba6892c3f8d98ea7ee048c854a47d *man/flexmix-class.Rd 022f7bae58eaccd9203737c47cf2473d *man/flexmix-internal.Rd 57ab6985b4c34528329c50c5bd67b30c *man/flexmix.Rd 83812639242cedc8bf5bc226f2747c88 *man/group.Rd a187b88ae5b3121c29579aceef270951 *man/logLik-methods.Rd 2b624ed0faa1b3345438a9da35f2f78d *man/patent.Rd 3aae6929d9c9dbe26b4be487330edada *man/plot-methods.Rd b3773bddc048e6fbe106eed18469702d *man/plotEll.Rd 2195e1c45f80a83a7b3baf8d449e5b05 *man/posterior.Rd f8ae3162f10350e983e30a5926fa6025 *man/refit.Rd d627472edfd9f5b2c3ec8e0f56296ae4 *man/relabel.Rd cf67fee780ab0ea895b55f07989aa76c *man/rflexmix.Rd 2aa3384e40b6d464a252378e17f08b1c *man/salmonellaTA98.Rd 4d165b442083a5ba599fa8e1c5e5f28a *man/seizure.Rd 4d457ddbe589788191b3ee5021e0ac6d *man/stepFlexmix.Rd 168fda1db5cdaf8e9d0a5410c145e825 *man/tribolium.Rd b5fad3c3973f6658af8b3663f20f4ac3 *man/trypanosome.Rd 4381e5944c15dc03c92a2151c049fca3 *man/whiskey.Rd e2057aa3aa3ee107d93fbe11a6f356d6 *vignettes/bootstrapping.Rnw c5a3e4b887e0caf2b8e1383071e699fd *vignettes/flexmix-intro.Rnw 509bb7f1d5c2cd61b6b5088e912bd5ef *vignettes/flexmix.bib 0a928bdb28d680f31098902b157e9204 *vignettes/flexmix.png c6745ee38eba2a694d6df5d497adb7b9 *vignettes/mixture-regressions.Rnw b1012b8287285f2b470111025699cce5 *vignettes/mixture.bib 6dca73aa5a96343db67a43c9835bb4bf *vignettes/myConcomitant.R fb9ae81acbfcada421bbd89681834714 *vignettes/mymclust.R 94b27d5378111289be0df2afaf4bdfab *vignettes/regression-examples.Rnw 76a28867c7670eb60951e3b1d2d77d33 *vignettes/ziglm.R flexmix/inst/0000755000175100001440000000000013740572351012730 5ustar hornikusersflexmix/inst/doc/0000755000175100001440000000000013740572351013475 5ustar hornikusersflexmix/inst/doc/regression-examples.Rnw0000644000175100001440000012407213675321507020171 0ustar hornikusers\documentclass[nojss]{jss} \usepackage{amsfonts,bm,amsmath,amssymb} %%\usepackage{Sweave} %% already provided by jss.cls %%%\VignetteIndexEntry{Applications of finite mixtures of regression models} %%\VignetteDepends{flexmix} %%\VignetteKeywords{R, finite mixture model, generalized linear model, latent class regression} %%\VignettePackage{flexmix} \title{Applications of finite mixtures of regression models} <>= library("stats") library("graphics") library("flexmix") @ \author{Bettina Gr{\"u}n\\ Wirtschaftsuniversit{\"a}t Wien \And Friedrich Leisch\\ Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Bettina Gr{\"u}n, Friedrich Leisch} \Address{ Bettina Gr\"un\\ Institute for Statistics and Mathematics\\ Wirtschaftsuniversit{\"a}t Wien\\ Welthandelsplatz 1\\ 1020 Wien, Austria\\ E-mail: \email{Bettina.Gruen@R-project.org}\\ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \Abstract{ Package \pkg{flexmix} provides functionality for fitting finite mixtures of regression models. The available model class includes generalized linear models with varying and fixed effects for the component specific models and multinomial logit models for the concomitant variable models. This model class includes random intercept models where the random part is modelled by a finite mixture instead of a-priori selecting a suitable distribution. The application of the package is illustrated on various datasets which have been previously used in the literature to fit finite mixtures of Gaussian, binomial or Poisson regression models. The \proglang{R} commands are given to fit the proposed models and additional insights are gained by visualizing the data and the fitted models as well as by fitting slightly modified models. } \Keywords{\proglang{R}, finite mixture models, generalized linear models, concomitant variables} \Plainkeywords{R, finite mixture models, generalized linear models, concomitant variables} %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \begin{document} \SweaveOpts{engine=R, echo=true, height=5, width=8, eps=FALSE, keep.source=TRUE} \setkeys{Gin}{width=0.8\textwidth} <>= options(width=70, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) suppressWarnings(RNGversion("3.5.0")) set.seed(1802) library("lattice") ltheme <- canonical.theme("postscript", FALSE) lattice.options(default.theme=ltheme) @ %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \section{Introduction} Package \pkg{flexmix} provides infrastructure for flexible fitting of finite mixtures models. The design principles of the package allow easy extensibility and rapid prototyping. In addition, the main focus of the available functionality is on fitting finite mixtures of regression models, as other packages in \proglang{R} exist which have specialized functionality for model-based clustering, such as e.g.~\pkg{mclust} \citep{flexmix:Fraley+Raftery:2002a} for finite mixtures of Gaussian distributions. \cite{flexmix:Leisch:2004a} gives a general introduction into the package outlining the main implementational principles and illustrating the use of the package. The paper is also contained as a vignette in the package. An example for fitting mixtures of Gaussian regression models is given in \cite{flexmix:Gruen+Leisch:2006}. This paper focuses on examples of finite mixtures of binomial logit and Poisson regression models. Several datasets which have been previously used in the literature to demonstrate the use of finite mixtures of regression models have been selected to illustrate the application of the package. The model class covered are finite mixtures of generalized linear model with focus on binomial logit and Poisson regressions. The regression coefficients as well as the dispersion parameters of the component specific models are assumed to vary for all components, vary between groups of components, i.e.~to have a nesting, or to be fixed over all components. In addition it is possible to specify concomitant variable models in order to be able to characterize the components. Random intercept models are a special case of finite mixtures with varying and fixed effects as fixed effects are assumed for the coefficients of all covariates and varying effects for the intercept. These models are often used to capture overdispersion in the data which can occur for example if important covariates are omitted in the regression. It is then assumed that the influence of these covariates can be captured by allowing a random distribution for the intercept. This illustration does not only show how the package \pkg{flexmix} can be used for fitting finite mixtures of regression models but also indicates the advantages of using an extension package of an environment for statistical computing and graphics instead of a stand-alone package as available visualization techniques can be used for inspecting the data and the fitted models. In addition users already familiar with \proglang{R} and its formula interface should find the model specification and a lot of commands for exploring the fitted model intuitive. %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \section{Model specification} Finite mixtures of Gaussian regressions with concomitant variable models are given by: \begin{align*} H(y\,|\,\bm{x}, \bm{w}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\bm{w}, \bm{\alpha}) \textrm{N}(y\,|\, \mu_s(\bm{x}), \sigma^2_s), \end{align*} where $\textrm{N}(\cdot\,|\, \mu_s(\bm{x}), \sigma^2_s)$ is the Gaussian distribution with mean $\mu_s(\bm{x}) = \bm{x}' \bm{\beta}^s$ and variance $\sigma^2_s$. $\Theta$ denotes the vector of all parameters of the mixture distribution and the dependent variables are $y$, the independent $\bm{x}$ and the concomitant $\bm{w}$. Finite mixtures of binomial regressions with concomitant variable models are given by: \begin{align*} H(y\,|\,T, \bm{x}, \bm{w}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\bm{w}, \bm{\alpha}) \textrm{Bi}(y\,|\,T, \theta_s(\bm{x})), \end{align*} where $\textrm{Bi}(\cdot\,|\,T, \theta_s(\bm{x}))$ is the binomial distribution with number of trials equal to $T$ and success probability $\theta_s(\bm{x}) \in (0,1)$ given by $\textrm{logit}(\theta_s(\bm{x})) = \bm{x}' \bm{\beta}^s$. Finite mixtures of Poisson regressions are given by: \begin{align*} H(y \,|\, \bm{x}, \bm{w}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\bm{w}, \bm{\alpha}) \textrm{Poi} (y \,|\, \lambda_s(\bm{x})), \end{align*} where $\textrm{Poi}(\cdot\,|\,\lambda_s(\bm{x}))$ denotes the Poisson distribution and $\log(\lambda_s(\bm{x})) = \bm{x}'\bm{\beta}^s$. For all these mixture distributions the coefficients are split into three different groups depending on if fixed, nested or varying effects are specified: \begin{align*} \bm{\beta}^s &= (\bm{\beta}_1, \bm{\beta}^{c(s)}_{2}, \bm{\beta}^{s}_3) \end{align*} where the first group represents the fixed, the second the nested and the third the varying effects. For the nested effects a partition $\mathcal{C} = \{c_s \,|\, s = 1,\ldots S\}$ of the $S$ components is determined where $c_s = \{s^* = 1,\ldots,S \,|\, c(s^*) = c(s)\}$. A similar splitting is possible for the variance of mixtures of Gaussian regression models. The function for maximum likelihood (ML) estimation with the Expectation-Maximization (EM) algorithm is \code{flexmix()} which is described in detail in \cite{flexmix:Leisch:2004a}. It takes as arguments a specification of the component specific model and of the concomitant variable model. The component specific model with varying, nested and fixed effects can be specified with the M-step driver \code{FLXMRglmfix()} which has arguments \code{formula} for the varying, \code{nested} for the nested and \code{fixed} for the fixed effects. \code{formula} and \code{fixed} take an argument of class \code{"formula"}, whereas \code{nested} expects an object of class \code{"FLXnested"} or a named list specifying the nested structure with a component \code{k} which is a vector of the number of components in each group of the partition and a component \code{formula} which is a vector of formulas for each group of the partition. In addition there is an argument \code{family} which has to be one of \code{gaussian}, \code{binomial}, \code{poisson} or \code{Gamma} and determines the component specific distribution function as well as an \code{offset} argument. The argument \code{varFix} can be used to determine the structure of the dispersion parameters. If only varying effects are specified the M-step driver \code{FLXMRglm()} can be used which only has an argument \code{formula} for the varying effects and also a \code{family} and an \code{offset} argument. This driver has the advantage that in the M-step the weighted ML estimation is made separately for each component which signifies that smaller model matrices are used. If a mixture model with a lot of components $S$ is fitted to a large data set with $N$ observations and the model matrix used in the M-step of \code{FLXMRglm()} has $N$ rows and $K$ columns, the model matrix used in the M-step of \code{FLXMRglmfix()} has $S N$ rows and up to $S K$ columns. In general the concomitant variable model is assumed to be a multinomial logit model, i.e.~: \begin{align*} \pi_s(\bm{w},\bm{\alpha}) &= \frac{e^{\bm{w}'\bm{\alpha}_s}}{\sum_{u = 1}^S e^{\bm{w}'\bm{\alpha}_u}} \quad \forall s, \end{align*} with $\bm{\alpha} = (\bm{\alpha}'_s)_{s=1,\ldots,S}$ and $\bm{\alpha}_1 \equiv \bm{0}$. This model can be fitted in \pkg{flexmix} with \code{FLXPmultinom()} which takes as argument \code{formula} the formula specification of the multinomial logit part. For fitting the function \code{nnet()} is used from package \pkg{MASS} \citep{flexmix:Venables+Ripley:2002} with the independent variables specified by the formula argument and the dependent variables are given by the a-posteriori probability estimates. %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \section[Using package flexmix]{Using package \pkg{flexmix}} In the following datasets from different areas such as medicine, biology and economics are used. There are three subsections: for finite mixtures of Gaussian regressions, for finite mixtures of binomial regression models and for finite mixtures of Poisson regression models. %%------------------------------------------------------------------------- \subsection{Finite mixtures of Gaussian regressions} This artificial dataset with 200 observations is given in \cite{flexmix:Gruen+Leisch:2006}. The data is generated from a mixture of Gaussian regression models with three components. There is an intercept with varying effects, an independent variable $x1$, which is a numeric variable, with fixed effects and another independent variable $x2$, which is a categorical variable with two levels, with nested effects. The prior probabilities depend on a concomitant variable $w$, which is also a categorical variable with two levels. Fixed effects are also assumed for the variance. The data is illustrated in Figure~\ref{fig:artificialData} and the true underlying model is given by: \begin{align*} H(y\,|\,(x1, x2), w, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(w, \bm{\alpha}) \textrm{N}(y\,|\, \mu_s, \sigma^2), \end{align*} with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \beta^{c(s)}_{\textrm{x1}}, \beta_{\textrm{x2}})$. The nesting signifies that $c(1) = c(2)$ and $\beta^{c(3)}_{\textrm{x1}} = 0$. The mixture model is fitted by first loading the package and the dataset and then specifying the component specific model. In a first step a component specific model with only varying effects is specified. Then the fitting function \code{flexmix()} is called repeatedly using \code{stepFlexmix()}. Finally, we order the components such that they are in ascending order with respect to the coefficients of the variable \code{x1}. <>= set.seed(2807) library("flexmix") data("NregFix", package = "flexmix") Model <- FLXMRglm(~ x2 + x1) fittedModel <- stepFlexmix(y ~ 1, model = Model, nrep = 3, k = 3, data = NregFix, concomitant = FLXPmultinom(~ w)) fittedModel <- relabel(fittedModel, "model", "x1") summary(refit(fittedModel)) @ The estimated coefficients indicate that the components differ for the intercept, but that they are not significantly different for the coefficients of $x2$. For $x1$ the coefficient of the first component is not significantly different from zero and the confidence intervals for the other two components overlap. Therefore we fit a modified model, which is equivalent to the true underlying model. The previously fitted model is used for initializing the EM algorithm: <>= Model2 <- FLXMRglmfix(fixed = ~ x2, nested = list(k = c(1, 2), formula = c(~ 0, ~ x1)), varFix = TRUE) fittedModel2 <- flexmix(y ~ 1, model = Model2, cluster = posterior(fittedModel), data = NregFix, concomitant = FLXPmultinom(~ w)) BIC(fittedModel) BIC(fittedModel2) @ The BIC suggests that the restricted model should be preferred. \begin{figure}[tb] \centering \setkeys{Gin}{width=0.95\textwidth} <>= plotNregFix <- NregFix plotNregFix$w <- factor(NregFix$w, levels = 0:1, labels = paste("w =", 0:1)) plotNregFix$x2 <- factor(NregFix$x2, levels = 0:1, labels = paste("x2 =", 0:1)) plotNregFix$class <- factor(NregFix$class, levels = 1:3, labels = paste("Class", 1:3)) print(xyplot(y ~ x1 | x2*w, groups = class, data = plotNregFix, cex = 0.6, auto.key = list(space="right"), layout = c(2,2))) @ \setkeys{Gin}{width=0.8\textwidth} \caption{Sample with 200 observations from the artificial example.} \label{fig:artificialData} \end{figure} <>= summary(refit(fittedModel2)) @ The coefficients are ordered such that the fixed coefficients are first, the nested varying coefficients second and the varying coefficients last. %%------------------------------------------------------------------------- \subsection{Finite mixtures of binomial logit regressions} %%------------------------------------------------------------------------- \subsubsection{Beta blockers} The dataset is analyzed in \cite{flexmix:Aitkin:1999, flexmix:Aitkin:1999a} using a finite mixture of binomial regression models. Furthermore, it is described in \cite{flexmix:McLachlan+Peel:2000} on page 165. The dataset is from a 22-center clinical trial of beta-blockers for reducing mortality after myocardial infarction. A two-level model is assumed to represent the data, where centers are at the upper level and patients at the lower level. The data is illustrated in Figure~\ref{fig:beta} and the model is given by: \begin{align*} H(\textrm{Deaths} \,|\, \textrm{Total}, \textrm{Treatment}, \textrm{Center}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Bi}( \textrm{Deaths} \,|\, \textrm{Total}, \theta_s). \end{align*} First, the center classification is ignored and a binomial logit regression model with treatment as covariate is fitted using \code{glm}, i.e.~$S=1$: <>= data("betablocker", package = "flexmix") betaGlm <- glm(cbind(Deaths, Total - Deaths) ~ Treatment, family = "binomial", data = betablocker) betaGlm @ In the next step the center classification is included by allowing a random effect for the intercept given the centers, i.e.~the coefficients $\bm{\beta}^s$ are given by $(\beta^s_{\textrm{Intercept|Center}}, \beta_{\textrm{Treatment}})$. This signifies that the component membership is fixed for each center. In order to determine the suitable number of components, the mixture is fitted with different numbers of components and the BIC information criterion is used to select an appropriate model. In this case a model with three components is selected. The fitted values for the model with three components are given in Figure~\ref{fig:beta}. <>= betaMixFix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = FLXMRglmfix(family = "binomial", fixed = ~ Treatment), k = 2:4, nrep = 3, data = betablocker) betaMixFix @ \begin{figure} \centering <>= library("grid") betaMixFix_3 <- getModel(betaMixFix, "3") betaMixFix_3 <- relabel(betaMixFix_3, "model", "Intercept") betablocker$Center <- with(betablocker, factor(Center, levels = Center[order((Deaths/Total)[1:22])])) clusters <- factor(clusters(betaMixFix_3), labels = paste("Cluster", 1:3)) print(dotplot(Deaths/Total ~ Center | clusters, groups = Treatment, as.table = TRUE, data = betablocker, xlab = "Center", layout = c(3, 1), scales = list(x = list(draw = FALSE)), key = simpleKey(levels(betablocker$Treatment), lines = TRUE, corner = c(1,0)))) betaMixFix.fitted <- fitted(betaMixFix_3) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[1:22, i], "native"), gp = gpar(lty = 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[23:44, i], "native"), gp = gpar(lty = 2)) } @ \caption{Relative number of deaths for the treatment and the control group for each center in the beta blocker dataset. The centers are sorted by the relative number of deaths in the control group. The lines indicate the fitted values for each component of the 3-component mixture model with random intercept and fixed effect for treatment.} \label{fig:beta} \end{figure} In addition the treatment effect can also be included in the random part of the model. As then all coefficients for the covariates and the intercept follow a mixture distribution the component specific model can be specified using \code{FLXMRglm()}. The coefficients are $\bm{\beta}^s=(\beta^s_{\textrm{Intercept|Center}}, \beta^s_{\textrm{Treatment|Center}})$, i.e.~it is assumed that the heterogeneity is only between centers and therefore the aggregated data for each center can be used. <>= betaMix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ Treatment | Center, model = FLXMRglm(family = "binomial"), k = 3, nrep = 3, data = betablocker) summary(betaMix) @ The full model with a random effect for treatment has a higher BIC and therefore the smaller would be preferred. The default plot of the returned \code{flexmix} object is a rootogramm of the a-posteriori probabilities where observations with a-posteriori probabilities smaller than \code{eps} are omitted. With argument \code{mark} the component is specified to have those observations marked which are assigned to this component based on the maximum a-posteriori probabilities. This indicates which components overlap. <>= print(plot(betaMixFix_3, mark = 1, col = "grey", markcol = 1)) @ The default plot of the fitted model indicates that the components are well separated. In addition component 1 has a slight overlap with component 2 but none with component 3. The fitted parameters of the component specific models can be accessed with: <>= parameters(betaMix) @ The cluster assignments using the maximum a-posteriori probabilities are obtained with: <>= table(clusters(betaMix)) @ The estimated probabilities for each component for the treated patients and those in the control group can be obtained with: <>= predict(betaMix, newdata = data.frame(Treatment = c("Control", "Treated"))) @ or <>= fitted(betaMix)[c(1, 23), ] @ A further analysis of the model is possible with function \code{refit()} which returns the estimated coefficients together with the standard deviations, z-values and corresponding p-values: <>= summary(refit(getModel(betaMixFix, "3"))) @ The printed coefficients are ordered to have the fixed effects before the varying effects. %%----------------------------------------------------------------------- \subsubsection{Mehta et al. trial} This dataset is similar to the beta blocker dataset and is also analyzed in \cite{flexmix:Aitkin:1999a}. The dataset is visualized in Figure~\ref{fig:mehta}. The observation for the control group in center 15 is slightly conspicuous and might classify as an outlier. The model is given by: \begin{align*} H(\textrm{Response} \,|\, \textrm{Total}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Bi}( \textrm{Response} \,|\, \textrm{Total}, \theta_s), \end{align*} with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept|Site}}, \beta_{\textrm{Drug}})$. This model is fitted with: <>= data("Mehta", package = "flexmix") mehtaMix <- stepFlexmix(cbind(Response, Total - Response)~ 1 | Site, model = FLXMRglmfix(family = "binomial", fixed = ~ Drug), control = list(minprior = 0.04), nrep = 3, k = 3, data = Mehta) summary(mehtaMix) @ One component only contains the observations for center 15 and in order to be able to fit a mixture with such a small component it is necessary to modify the default argument for \code{minprior} which is 0.05. The fitted values for this model are given separately for each component in Figure~\ref{fig:mehta}. \begin{figure} \centering <>= Mehta$Site <- with(Mehta, factor(Site, levels = Site[order((Response/Total)[1:22])])) clusters <- factor(clusters(mehtaMix), labels = paste("Cluster", 1:3)) print(dotplot(Response/Total ~ Site | clusters, groups = Drug, layout = c(3,1), data = Mehta, xlab = "Site", scales = list(x = list(draw = FALSE)), key = simpleKey(levels(Mehta$Drug), lines = TRUE, corner = c(1,0)))) mehtaMix.fitted <- fitted(mehtaMix) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) sapply(1:nlevels(Mehta$Drug), function(j) grid.lines(unit(1:22, "native"), unit(mehtaMix.fitted[Mehta$Drug == levels(Mehta$Drug)[j], i], "native"), gp = gpar(lty = j))) } @ \caption{Relative number of responses for the treatment and the control group for each site in the Mehta et al.~trial dataset together with the fitted values. The sites are sorted by the relative number of responses in the control group.} \label{fig:mehta} \end{figure} If also a random effect for the coefficient of $\textrm{Drug}$ is fitted, i.e.~$\bm{\beta}^s = (\beta^s_{\textrm{Intercept|Site}}, \beta^s_{\textrm{Drug|Site}})$, this is estimated by: <>= mehtaMix <- stepFlexmix(cbind(Response, Total - Response) ~ Drug | Site, model = FLXMRglm(family = "binomial"), k = 3, data = Mehta, nrep = 3, control = list(minprior = 0.04)) summary(mehtaMix) @ The BIC is smaller for the larger model and this indicates that the assumption of an equal drug effect for all centers is not confirmed by the data. Given Figure~\ref{fig:mehta} a two-component model with fixed treatment is also fitted to the data where site 15 is omitted: <>= Mehta.sub <- subset(Mehta, Site != 15) mehtaMix <- stepFlexmix(cbind(Response, Total - Response) ~ 1 | Site, model = FLXMRglmfix(family = "binomial", fixed = ~ Drug), data = Mehta.sub, k = 2, nrep = 3) summary(mehtaMix) @ %%----------------------------------------------------------------------- \subsubsection{Tribolium} A finite mixture of binomial regressions is fitted to the Tribolium dataset given in \cite{flexmix:Wang+Puterman:1998}. The data was collected to investigate whether the adult Tribolium species Castaneum has developed an evolutionary advantage to recognize and avoid eggs of its own species while foraging, as beetles of the genus Tribolium are cannibalistic in the sense that adults eat the eggs of their own species as well as those of closely related species. The experiment isolated a number of adult beetles of the same species and presented them with a vial of 150 eggs (50 of each type), the eggs being thoroughly mixed to ensure uniformity throughout the vial. The data gives the consumption data for adult Castaneum species. It reports the number of Castaneum, Confusum and Madens eggs, respectively, that remain uneaten after two day exposure to the adult beetles. Replicates 1, 2, and 3 correspond to different occasions on which the experiment was conducted. The data is visualized in Figure~\ref{fig:tribolium} and the model is given by: \begin{align*} H(\textrm{Remaining} \,|\, \textrm{Total}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\textrm{Replicate}, \bm{\alpha}) \textrm{Bi}( \textrm{Remaining} \,|\, \textrm{Total}, \theta_s), \end{align*} with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \bm{\beta}_{\textrm{Species}})$. This model is fitted with: <>= data("tribolium", package = "flexmix") TribMix <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, k = 2:3, model = FLXMRglmfix(fixed = ~ Species, family = "binomial"), concomitant = FLXPmultinom(~ Replicate), data = tribolium) @ The model which is selected as the best in \cite{flexmix:Wang+Puterman:1998} can be estimated with: <>= modelWang <- FLXMRglmfix(fixed = ~ I(Species == "Confusum"), family = "binomial") concomitantWang <- FLXPmultinom(~ I(Replicate == 3)) TribMixWang <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, data = tribolium, model = modelWang, concomitant = concomitantWang, k = 2) summary(refit(TribMixWang)) @ \begin{figure} \centering <>= clusters <- factor(clusters(TribMixWang), labels = paste("Cluster", 1:TribMixWang@k)) print(dotplot(Remaining/Total ~ factor(Replicate) | clusters, groups = Species, data = tribolium[rep(1:9, each = 3) + c(0:2)*9,], xlab = "Replicate", auto.key = list(corner = c(1,0)))) @ \caption{Relative number of remaining beetles for the number of replicate. The different panels are according to the cluster assignemnts based on the a-posteriori probabilities of the model suggested in \cite{flexmix:Wang+Puterman:1998}.} \label{fig:tribolium} \end{figure} \cite{flexmix:Wang+Puterman:1998} also considered a model where they omit one conspicuous observation. This model can be estimated with: <>= TribMixWangSub <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, k = 2, data = tribolium[-7,], model = modelWang, concomitant = concomitantWang) @ %%----------------------------------------------------------------------- \subsubsection{Trypanosome} The data is used in \cite{flexmix:Follmann+Lambert:1989}. It is from a dosage-response analysis where the proportion of organisms belonging to different populations shall be assessed. It is assumed that organisms belonging to different populations are indistinguishable other than in terms of their reaction to the stimulus. The experimental technique involved inspection under the microscope of a representative aliquot of a suspension, all organisms appearing within two fields of view being classified either alive or dead. Hence the total numbers of organisms present at each dose and the number showing the quantal response were both random variables. The data is illustrated in Figure~\ref{fig:trypanosome}. The model which is proposed in \cite{flexmix:Follmann+Lambert:1989} is given by: \begin{align*} H(\textrm{Dead} \,|\,\bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Bi}( \textrm{Dead} \,|\, \theta_s), \end{align*} where $\textrm{Dead} \in \{0,1\}$ and with $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \bm{\beta}_{\textrm{log(Dose)}})$. This model is fitted with: <>= data("trypanosome", package = "flexmix") TrypMix <- stepFlexmix(cbind(Dead, 1-Dead) ~ 1, k = 2, nrep = 3, data = trypanosome, model = FLXMRglmfix(family = "binomial", fixed = ~ log(Dose))) summary(refit(TrypMix)) @ The fitted values are given in Figure~\ref{fig:trypanosome} together with the fitted values of a generalized linear model in order to facilitate comparison of the two models. \begin{figure} \centering <>= tab <- with(trypanosome, table(Dead, Dose)) Tryp.dat <- data.frame(Dead = tab["1",], Alive = tab["0",], Dose = as.numeric(colnames(tab))) plot(Dead/(Dead+Alive) ~ Dose, data = Tryp.dat) Tryp.pred <- predict(glm(cbind(Dead, 1-Dead) ~ log(Dose), family = "binomial", data = trypanosome), newdata=Tryp.dat, type = "response") TrypMix.pred <- predict(TrypMix, newdata = Tryp.dat, aggregate = TRUE)[[1]] lines(Tryp.dat$Dose, Tryp.pred, lty = 2) lines(Tryp.dat$Dose, TrypMix.pred, lty = 3) legend(4.7, 1, c("GLM", "Mixture model"), lty=c(2, 3), xjust=0, yjust=1) @ \caption{Relative number of deaths for each dose level together with the fitted values for the generalized linear model (``GLM'') and the random intercept model (``Mixture model'').} \label{fig:trypanosome} \end{figure} %%------------------------------------------------------------------------- \subsection{Finite mixtures of Poisson regressions} % %%----------------------------------------------------------------------- \subsubsection{Fabric faults} The dataset is analyzed using a finite mixture of Poisson regression models in \cite{flexmix:Aitkin:1996}. Furthermore, it is described in \cite{flexmix:McLachlan+Peel:2000} on page 155. It contains 32 observations on the number of faults in rolls of a textile fabric. A random intercept model is used where a fixed effect is assumed for the logarithm of length: <>= data("fabricfault", package = "flexmix") fabricMix <- stepFlexmix(Faults ~ 1, model = FLXMRglmfix(family="poisson", fixed = ~ log(Length)), data = fabricfault, k = 2, nrep = 3) summary(fabricMix) summary(refit(fabricMix)) Lnew <- seq(0, 1000, by = 50) fabricMix.pred <- predict(fabricMix, newdata = data.frame(Length = Lnew)) @ The intercept of the first component is not significantly different from zero for a signficance level of 0.05. We therefore also fit a modified model where the intercept is a-priori set to zero for the first component. This nested structure is given as part of the model specification with argument \code{nested}. <>= fabricMix2 <- flexmix(Faults ~ 0, data = fabricfault, cluster = posterior(fabricMix), model = FLXMRglmfix(family = "poisson", fixed = ~ log(Length), nested = list(k=c(1,1), formula=list(~0,~1)))) summary(refit(fabricMix2)) fabricMix2.pred <- predict(fabricMix2, newdata = data.frame(Length = Lnew)) @ The data and the fitted values for each of the components for both models are given in Figure~\ref{fig:fabric}. \begin{figure} \centering <>= plot(Faults ~ Length, data = fabricfault) sapply(fabricMix.pred, function(y) lines(Lnew, y, lty = 1)) sapply(fabricMix2.pred, function(y) lines(Lnew, y, lty = 2)) legend(190, 25, paste("Model", 1:2), lty=c(1, 2), xjust=0, yjust=1) @ \caption{Observed values of the fabric faults dataset together with the fitted values for the components of each of the two fitted models.} \label{fig:fabric} \end{figure} %%----------------------------------------------------------------------- \subsubsection{Patent} The patent data given in \cite{flexmix:Wang+Cockburn+Puterman:1998} consist of 70 observations on patent applications, R\&D spending and sales in millions of dollar from pharmaceutical and biomedical companies in 1976 taken from the National Bureau of Economic Research R\&D Masterfile. The observations are displayed in Figure~\ref{fig:patent}. The model which is chosen as the best in \cite{flexmix:Wang+Cockburn+Puterman:1998} is given by: \begin{align*} H(\textrm{Patents} \,|\, \textrm{lgRD}, \textrm{RDS}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s(\textrm{RDS}, \bm{\alpha}) \textrm{Poi} ( \textrm{Patents} \,|\, \lambda_s), \end{align*} and $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \beta^s_{\textrm{lgRD}})$. The model is fitted with: <>= data("patent", package = "flexmix") ModelPat <- FLXMRglm(family = "poisson") FittedPat <- stepFlexmix(Patents ~ lgRD, k = 3, nrep = 3, model = ModelPat, data = patent, concomitant = FLXPmultinom(~ RDS)) summary(FittedPat) @ The fitted values for the component specific models and the concomitant variable model are given in Figure~\ref{fig:patent}. The plotting symbol of the observations corresponds to the induced clustering given by \code{clusters(FittedPat)}. This model is modified to have fixed effects for the logarithmized R\&D spendings, i.e.~$\bm(\beta)^s = (\beta^s_{\textrm{Intercept}}, \beta_{\textrm{lgRD}})$. The already fitted model is used for initialization, i.e.~the EM algorithm is started with an M-step given the a-posteriori probabilities. <>= ModelFixed <- FLXMRglmfix(family = "poisson", fixed = ~ lgRD) FittedPatFixed <- flexmix(Patents ~ 1, model = ModelFixed, cluster = posterior(FittedPat), concomitant = FLXPmultinom(~ RDS), data = patent) summary(FittedPatFixed) @ The fitted values for the component specific models and the concomitant variable model of this model are also given in Figure~\ref{fig:patent}. \begin{figure} \centering \setkeys{Gin}{width=0.95\textwidth} <>= lgRDv <- seq(-3, 5, by = 0.05) newdata <- data.frame(lgRD = lgRDv) plotData <- function(fitted) { with(patent, data.frame(Patents = c(Patents, unlist(predict(fitted, newdata = newdata))), lgRD = c(lgRD, rep(lgRDv, 3)), class = c(clusters(fitted), rep(1:3, each = nrow(newdata))), type = rep(c("data", "fit"), c(nrow(patent), nrow(newdata)*3)))) } plotPatents <- cbind(plotData(FittedPat), which = "Wang et al.") plotPatentsFixed <- cbind(plotData(FittedPatFixed), which = "Fixed effects") plotP <- rbind(plotPatents, plotPatentsFixed) rds <- seq(0, 3, by = 0.02) x <- model.matrix(FittedPat@concomitant@formula, data = data.frame(RDS = rds)) plotConc <- function(fitted) { E <- exp(x%*%fitted@concomitant@coef) data.frame(Probability = as.vector(E/rowSums(E)), class = rep(1:3, each = nrow(x)), RDS = rep(rds, 3)) } plotConc1 <- cbind(plotConc(FittedPat), which = "Wang et al.") plotConc2 <- cbind(plotConc(FittedPatFixed), which = "Fixed effects") plotC <- rbind(plotConc1, plotConc2) print(xyplot(Patents ~ lgRD | which, data = plotP, groups=class, xlab = "log(R&D)", panel = "panel.superpose", type = plotP$type, panel.groups = function(x, y, type = "p", subscripts, ...) { ind <- plotP$type[subscripts] == "data" panel.xyplot(x[ind], y[ind], ...) panel.xyplot(x[!ind], y[!ind], type = "l", ...) }, scales = list(alternating=FALSE), layout=c(1,2), as.table=TRUE), more=TRUE, position=c(0,0,0.6, 1)) print(xyplot(Probability ~ RDS | which, groups = class, data = plotC, type = "l", scales = list(alternating=FALSE), layout=c(1,2), as.table=TRUE), position=c(0.6, 0.01, 1, 0.99)) @ \caption{Patent data with the fitted values of the component specific models (left) and the concomitant variable model (right) for the model in \citeauthor{flexmix:Wang+Cockburn+Puterman:1998} and with fixed effects for $\log(\textrm{R\&D})$. The plotting symbol for each observation is determined by the component with the maximum a-posteriori probability.} \label{fig:patent} \end{figure} \setkeys{Gin}{width=0.8\textwidth} With respect to the BIC the full model is better than the model with the fixed effects. However, fixed effects have the advantage that the different components differ only in their baseline and the relation between the components in return of investment for each additional unit of R\&D spending is constant. Due to a-priori domain knowledge this model might seem more plausible. The fitted values for the constrained model are also given in Figure~\ref{fig:patent}. %%----------------------------------------------------------------------- \subsubsection{Seizure} The data is used in \cite{flexmix:Wang+Puterman+Cockburn:1996} and is from a clinical trial where the effect of intravenous gamma-globulin on suppression of epileptic seizures is studied. There are daily observations for a period of 140 days on one patient, where the first 27 days are a baseline period without treatment, the remaining 113 days are the treatment period. The model proposed in \cite{flexmix:Wang+Puterman+Cockburn:1996} is given by: \begin{align*} H(\textrm{Seizures} \,|\, (\textrm{Treatment}, \textrm{log(Day)}, \textrm{log(Hours)}), \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Poi} ( \textrm{Seizures} \,|\, \lambda_s), \end{align*} where $\bm(\beta)^s = (\beta^s_{\textrm{Intercept}}, \beta^s_{\textrm{Treatment}}, \beta^s_{\textrm{log(Day)}}, \beta^s_{\textrm{Treatment:log(Day)}})$ and $\textrm{log(Hours)}$ is used as offset. This model is fitted with: <>= data("seizure", package = "flexmix") seizMix <- stepFlexmix(Seizures ~ Treatment * log(Day), data = seizure, k = 2, nrep = 3, model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix) summary(refit(seizMix)) @ A different model with different contrasts to directly estimate the coefficients for the jump when changing between base and treatment period is given by: <>= seizMix2 <- flexmix(Seizures ~ Treatment * log(Day/27), data = seizure, cluster = posterior(seizMix), model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix2) summary(refit(seizMix2)) @ A different model which allows no jump at the change between base and treatment period is fitted with: <>= seizMix3 <- flexmix(Seizures ~ log(Day/27)/Treatment, data = seizure, cluster = posterior(seizMix), model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix3) summary(refit(seizMix3)) @ With respect to the BIC criterion the smaller model with no jump is preferred. This is also the more intuitive model from a practitioner's point of view, as it does not seem to be plausible that starting the treatment already gives a significant improvement, but improvement develops over time. The data points together with the fitted values for each component of the two models are given in Figure~\ref{fig:seizure}. It can clearly be seen that the fitted values are nearly equal which also supports the smaller model. \begin{figure} \centering <>= plot(Seizures/Hours~Day, pch = c(1,3)[as.integer(Treatment)], data=seizure) abline(v=27.5, lty=2, col="grey") legend(140, 9, c("Baseline", "Treatment"), pch=c(1, 3), xjust=1, yjust=1) matplot(seizure$Day, fitted(seizMix)/seizure$Hours, type="l", add=TRUE, lty = 1, col = 1) matplot(seizure$Day, fitted(seizMix3)/seizure$Hours, type="l", add=TRUE, lty = 3, col = 1) legend(140, 7, paste("Model", c(1,3)), lty=c(1, 3), xjust=1, yjust=1) @ \caption{Observed values for the seizure dataset together with the fitted values for the components of the two different models.} \label{fig:seizure} \end{figure} %%----------------------------------------------------------------------- \subsubsection{Ames salmonella assay data} The ames salomnella assay dataset was used in \cite{flexmix:Wang+Puterman+Cockburn:1996}. They propose a model given by: \begin{align*} H(\textrm{y} \,|\, \textrm{x}, \bm{\Theta}) &= \sum_{s = 1}^S \pi_s \textrm{Poi} ( \textrm{y} \,|\, \lambda_s), \end{align*} where $\bm{\beta}^s = (\beta^s_{\textrm{Intercept}}, \beta_{\textrm{x}}, \beta_{\textrm{log(x+10)}})$. The model is fitted with: <>= data("salmonellaTA98", package = "flexmix") salmonMix <- stepFlexmix(y ~ 1, data = salmonellaTA98, k = 2, nrep = 3, model = FLXMRglmfix(family = "poisson", fixed = ~ x + log(x + 10))) @ \begin{figure} \centering <>= salmonMix.pr <- predict(salmonMix, newdata=salmonellaTA98) plot(y~x, data=salmonellaTA98, pch=as.character(clusters(salmonMix)), xlab="Dose of quinoline", ylab="Number of revertant colonies of salmonella", ylim=range(c(salmonellaTA98$y, unlist(salmonMix.pr)))) for (i in 1:2) lines(salmonellaTA98$x, salmonMix.pr[[i]], lty=i) @ \caption{Means and classification for assay data according to the estimated posterior probabilities based on the fitted model.} \label{fig:almes} \end{figure} %%----------------------------------------------------------------------- \section{Conclusions and future work} Package \pkg{flexmix} can be used to fit finite mixtures of regressions to datasets used in the literature to illustrate these models. The results can be reproduced and additional insights can be gained using visualization methods available in \proglang{R}. The fitted model is an object in \proglang{R} which can be explored using \code{show()}, \code{summary()} or \code{plot()}, as suitable methods have been implemented for objects of class \code{"flexmix"} which are returned by \code{flexmix()}. In the future it would be desirable to have more diagnostic tools available to analyze the model fit and compare different models. The use of resampling methods would be convenient as they can be applied to all kinds of mixtures models and would therefore suit well the purpose of the package which is flexible modelling of various finite mixture models. Furthermore, an additional visualization method for the fitted coefficients of the mixture would facilitate the comparison of the components. %%----------------------------------------------------------------------- \section*{Computational details} <>= SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") @ All computations and graphics in this paper have been done using \proglang{R} version \Sexpr{getRversion()} with the packages \Sexpr{pkgs}. %%----------------------------------------------------------------------- \section*{Acknowledgments} This research was supported by the the Austrian Science Foundation (FWF) under grant P17382 and the Austrian Academy of Sciences ({\"O}AW) through a DOC-FFORTE scholarship for Bettina Gr{\"u}n. %%----------------------------------------------------------------------- \bibliography{flexmix} \end{document} flexmix/inst/doc/regression-examples.pdf0000644000175100001440000137424513740572351020204 0ustar hornikusers%PDF-1.5 % 71 0 obj << /Length 3228 /Filter /FlateDecode >> stream xڍZKsFWHUX<D2rҲ}_~ `z==_?I&Z%QZYZ1J2.:4NMoOo_{u#>՟Ij駞۞+6_ B?Y=:V^ؘn'sMQd}iJҔ{q"~gq|TT0I\&ٿ-yG^&EsX4IquĦ)uDž"$n'dQ*/HC6I%GL4ey1\!$4cU\l;'^$ m]jJ_KMu鋶г )ؓ~ *J;23AX$ʋJꉇKANHiYeU`xóZLs&;n5j˃lN(=œN~V<#5bIK2eP|q]nbE3 _c{'EDiݳNbVߒNiQ$XI1 iCЪ}޴p]u~h }zUĮ<_Tl3㛽,"L xiI{aDQrTOYYAY,⪑L_>EPa6jK\(ף\˅r<*!k٠: :AsB, @*mJJ"X#$W,T05:U=/PΘV)M."7yC⍁JHi}ݕuH^(zї˼FB $p]H O:R]c igl&Ss+Y9buQ1 x_{'LASQ;!-yϔVlS}!};ϞT JfaQ[w: چ<YγKN|-!yCEKyd7$k&HHp 7bemF3 ,{&捘P0 L/3GzČaz^_W Ņ\/SD/*VfʵOey7+E)/(6NWKY-`µA'/NW챒A^\Z`st&:wx^ZwjUƂ mU, r8.aʖieBN]j7QmCr_5qDvE7 N?j|!JeJD75eKo<Y׫Jz+s{"ȉvƶ[߽mK~tp1zڴEq!#KBVMq LaBo\jţ#wkЎߞ7t@Dֳ^O7n@\:S -EX;zG*S^V\:@;6 oټXsP2[( Ģ40QM<`ÆQ8k>R6꛽q[@ߧEtm$XyUQJӒ܃;ૺq~Upkt8 =&0ɱ*kY{+K/~?& endstream endobj 87 0 obj << /Length 3407 /Filter /FlateDecode >> stream x[Ys$5~_яZ: 6` 6P. }x`c"YhQ*cgWr7ohz_5f#]Ƿxwt^[ǀ z{5St9`UV9\̳?Veɋ*w|mye\$-3Gs˕vNм0 ,FO7yT=}϶-qblb ވw(KLjaM i&Nq;d{pc0D)!<W3SX:\=m q|e=>wA6<(TQ ]lc]#8<8Nm b])&.z +!0{Q/g/'`.%;zsO%@FOIGxAb 1c0TB|>ix= N{=n[P[`mzKN)ӎFrx:v,ث){tza*9ĉJw쮙ЯYB 5=4En8#ўSd w)~b  Y*!S|:6FxhcQ>~, Je#"+QCצ*]v)!SVtbV̴PSȿ2JIÝ{Gf#2-Yz_ˬ h!AZ` a-3sBIMVPS47QW}BMR8$jv̂Ǘeln'Ufeiae,HMV!tƲ 0P#l&2g0PO Dake)`lCo|lGo A&2Tƈ"ԅd97P ZSu}t 6u [ȖgtOt J1>kFL ߴZ}5|( RnU@3Ք>ԤIHpFFhB\8h,@FT!Ete:\@#|>j4BZՋ"k`^d2M'J3q:f:aJD*1d!PǫT@aVx`!ӧbYmQ<' <^^;9>&pAJ! .$'d;_1t//Bq8S>ͯ,SJDtL:c~VB@0O ;Ԣ8d9&##d DD#{ѽU}C/RWaX=hxV eQhԞE5"Q=u*I_x\Fbe@7Ϫ۬Dui^X -DUV:j_O~JsaT?(2Ŝ^Fܷٴvkv 3Y5 gm!D9w=PRHw]klW1wlՠSc-Ŝ|OV@0T{d# 3ɉc dY4M2xqFC&*h6Ж,2KmU`T9&O0}N7|HIہ?oDž,';Ɛ{j}O爎{ёTh.mVp!t+Py>=s ᧛g晌q}fze| v2Hx,mYZF{o4p]Aͩc b;_\/; endstream endobj 107 0 obj << /Length 4279 /Filter /FlateDecode >> stream xڵ;Yo#Ǚ>Q\gW~$vE;0IHY|G]ݬiNWWw%9nzLI^n>̴tjq6j~[^/1|gN #l! <SopÚZ[]k?C`ϩ¢_3rUD;s%g kla]v(&6|v48dsctRkt)9E^h,`+pළ ~?K'Z0OGB oya#s&$MOMu>Ijax>!Cn"' -RgBI)R'hA-?77AmCoq >{m/B"L*@? % QR4-@ܔlKp;HJN4z* ÿ fSx>AhӣabGY ԅЕ3%+3zbЗNs`9F(S6yG09Ebp7{[a6KmYuˮmBIPn Iff| CZy@2vtkY Fއh s.ωܽaJΑ#4@ZXCso[Rt_nN=Z0Xz)^lLգ '5#/c5c>oҗ"13d $3cS&i8>.;gqKPv4Ke9VrB Gr(nlkHhNq6~/"-k$ SŮemlWzIa(2ZT) GbOYMtŪ~9aCCiE2YB-z&+PX5N C׉N:j `}?76y@BT<W!%anp,G!|BM]͚_bs`ԅS2g[!pe̙;Zg[b'Mn,Yqxza'zs]ţ֢[L$" *tlӑ3)a9ƶp?MOYD`N(gK0_KB4HsLp%Iow17)PJm])M,,M02ZH%4tUvV" 3T.Z”lfŃf t_ Ad7-S&pb/nUX6~#fEP2ZtI5:A_ VQ ~sW(=pܙAͬעWn_79[?b9DC3 R {7/\R RXqҦ7,ޓF1y'wgRj7ɞh5UKP|`xvhpqT:cCmXĀXm̅ pڊC6%,߰XLr;U Y*ѐ ^V"@Wb{I! 9 Q Xs|oM?W+G5K# jZP8E]ɦSŎ;K#]1%K_s_Uq.F~䧁a  N!U3qrfڅ~87/QËJ]pOܳL nӇ_)[8UyAׅ%C&cr8jjfD%V7C|Si٨][m!f y#e~V%>^%}\Bv 7_q/?fYjju0sm yGݓ<42RepYۍ̚Et[N E|XʬfݑeeLwaXrsa"J5.K>D-l'][u{obц.+mY`z&d ˅QU=Nsx~Ip-ߎ)㴹Y6C}ʢT`rΥ4vނ?10юt_6qۇt姪˔PXAf9(CyTUw ;Q8u 6H/!V@5a]USsO2̽9ߞdT)vN8ڦYc< 0QrCL#_黦f/ͺ/"Fsz>c# VA~#hIkXRZ2C.a"YN22@atp"7!+[pquvB4q`T_F7\U[KޓH sНY&"̒WR׸QfM]\rO}C(\ !>%\ 5gg8z^ Yr ؓՁ|W#W !78p$Xesc ׌HcDیJ]t@H$W/?UA$*% VI7a}ЅnksO¹\tFa^m^l{̟q{V%}Mpm!*Tvdm] 6o7IުiDbMu4e`p3? WuMu GhqP,W ۢ*טqwXqތnA]ܤ`౾9WLU,Dnmuzk-ru!*Y<LCƠFs24T 0  ?0[mΪ>Yۙ`/6Bu8˲$~trO0DzzQ%9Ҹ2>SȪJѰг ei_[){F}qfJ_Um/HUm0,s h5%E_SSb-_.3B&A a dh(-,k62| jؔX D]2QijWPu6h&Cy !KCl Nsc 񟧢''ؕksk>DQ"BES.44o%JH<\ l ImbkOnIJX4jFUBvԞCSGƗR|0OQ_JH?m5!Q> stream xnFڐl\&@[8E =0, VQvlw2á4Vm"9ˈot~8 Dy-'J JSf2D?ɋ DBJa]E۟F͖VKST:L~˅^ס|!B!4f[fXg9`B ÚWo)}CO^ٙ3A/D݈3eC.̷S{ve`uoG&"Zʓymv)\zțֈy]7M8\R+YR_l}LfbeeVdU)ݾڹC х6ANE=roGG}$ږM+Μ8!w㶦dK|aa|c͉*E/Gsw[~ &k]09k^|jOC6yK1 G;[ %U vGw#0~6ı׌kԈ"轒 [|E< citQwlj,)le4VdY"TK1⑊# ,@le8в~*2j2~&+T@zWf r)I:|(^3YWf*b=i^ JQޕ3s?e ޫo@kAܓti , eAjQ] A͗KtVi/&Hot4u͙W`Z% l=RAͭ=jWӋ1ۡ/fUM>2PFvH}ϰ')7; f7 is9,&:`;|a>SΎW+I j{ĩ_395U䡊|NUܾT*יd:Ӳ2ԀBz0m گp8uB؍2rׂ [2D ҧ,j`< ֐>ɻs++l\E,W5:i1,Þsɻ.ovUel:a9콚t:=)yYU]+E&3id%Ue)SU(u֩/ھ VнuEOghޞnnЫR* }aO]ɠ lMw@oMkn,r>f9%i@#/Y:<u.M-yA-`N20gCA+ـy*j>? ~&ٟ#o%t| R,=.aCX;-g g-'tg S2?MF2L,sn:̸Oh|4p&;ŴsgͺN70:Pvbl07|4wǯS> stream xڭWn7}W@v,^6NE H+٨WruIh=Cp+6R̜+Lh\L ^Jɜ)UrKV؂Wڲ9{שL$K:y unkQLpS32ZLZ`zX5yi\xzMFh,)g31R~*sE#¥a nXv2'oVM*C>n5<şKP]j cf݂k2 A.͔w|EYtvsz ":S;Ym͌X&&@Nq{m/~IҢ5Ii,L%3Rĺ}M} :U]9j{PDM 1bUvҟ8n"홋 2BWǽZp/*cx@!Eeŷ$j C'XʥųCxc3Pc<ωEEU7"7.ًEoz hcҬ, dOvWx^.+wk59ц*! G.g=$w7T<):y-h$:.#Jg|F?1Z~XCO0)Lx{7gz- 9zQjTA zNz^~wsk;#lYx'%—T{U3rZ67_MxU2X*= .kۚ m j[{9F;\vR˽! Y_x׳[UTT њF endstream endobj 122 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-artificial-example.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 127 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 128 0 R>> /ExtGState << >>/ColorSpace << /sRGB 129 0 R >>>> /Length 13249 /Filter /FlateDecode >> stream x}Me9< 0 = $ V'A { ΗYGDv8[~>ϟ˧H)Oߕ.~܃Ϸ~ߪPc=1^;z{c.R~\-o~a_~e??.oo|oSv'֌ziO^QkHAm霏C jKs{!/Qw$yK 'io7x^tSM&kz\ i\ǸˣގlymʰT0߼>* TV}\#< 9C~]䖗$9$uY}^/ܬ1_rm Ւ o~CG|.U}imYdoyrEuky=-z/kd!r`In< N lZqQKO?m}RSX'mUzɂz~WH  ׊GH҄˨ 2)5|/׽`>qk<\$8QGWGH(ˤw Bۻ u' (+,>XQOS5vuni n~b`TWk_xXjr$v묅Z( -o:GQ&V}[^)Yofi1xeQ7Qx]<ȇux5\[7wZbeKNK=֧V)OF+]o/{|Vm ##SQWeSkݟeBJk;m͚:|0Us4u^'P%SzYkգhK>V'TLJa qIվ+q__w#ǯ xaU7k}3F fOZʤwjc{DUV_o~0nN/*hJ9hڷUpɻ*(Wwm*W7w^jXIaqU*z8_`˾^,¼*5]$vpz5HxeR k;l(X`.J[ ()$e5@{š*VRDa.ub?O.x>ܓbW]f=uU,)׍V۽'n4˦v{߲ZQ>8l"r~׏7Q.sm 0N%Ip \+?F \{̭Չw`eR k;lkT`mZrV=dCn_[892Wv z[eG@wF߻52ܽHwHy @V&Jw d*SRFVޥq91ap ?u/{%49ۃۃt;NK崋nuv>},<ż z10] )j7q \5%wꄺP+RXCajRy0m+FMuߓJy@V< + U)!Uodb5}bbzc_t nsyj  ת1|0Kܚ]F%}wت1wb9&UFM#p{5F6RcWs=\FIݛnPħG.bO),9q9g6탕޽tP!/8bIn<j۩wZat膃Z/( pS}`HG7r0)P>7 Aн!*rEiFfσcr_St9(>`bIA7&gZBXoݠ0@ٔR`_Vs/YNq?|qgUK"NZAqYK%nZAsjʔw}4jM4fM4w^;lFgsW^vlGwiMpc6aia3ji7qa5^IEZ5D`{;V'42)-W[eGΊ wcyUj$bRCƁᦂaMNZ[(Isa+k O3k8 X0^Ò0_Ky}XROsy\MPGRM9"[ǀnyprY-9-t F,۝[OOć3uR7ΖrZJi o zsjZ1{Za*[^|2#,^p - ,r.Q٦fϓS#qUuޤ;}$+H=bJ&q|!ReܺAỠli/vu udtdW1ͻzҷv_*쭡LOO ^Qwڝ ˖{ڽkl+HwLikh,9 kg|z)t8y#0/ZA@))!ҙFΘ17g4;j| %0:A4NJw .{ G(ԱvkԬ>}0#3s9$=iR8I KNDad O̿}:{}nzz+^Sh|rM HLgm, 2a_Șwzo9 +YHx & ,cJ"oD,& }LIX䴔^t{Xn^t{(ci\酤Čm2.M?n BSywJ~Nm|H?e> |I;f)}?p$  R7Jڗuc9u6?(F9Ҍ -GTY/ĖjY;=EKXk- h ES̳h.]ح!oH񐹽;2s2뽎$ o"\IyӾ6`ə؄5gNnWْ.bOU0Fdyr֮Y./qvF/?gCkh +n6nvJkhn9"~ˏo-?}f# {gS|%L3_οSmogolobn/on$?}|W~5~|/;oK~b?^Vҵk3 .(r{kp;q] '6PyM6n*PtCr,XRS9 a˰atz%3o9"a]/k`LBvMj^+i .(+u$]ÓA@,)"4?dσqY]EYuZŻY^TXa @V< oYDKZ(RXCa+ͯvD[(q@ƈ7[OAxA񂤓['Q0|ZAӀ{wJ-*1haaMm9ͧ㔮f;GµNDž+|%E[*RXCa+Ϳ0=Oΰc^oZoն} Q^ؚQ/bIu N&l 'U*le/v-Zn>K۱oh@]ex/%S-Xc~M9"K[pnYN{;)8A,KAxn;tw(rEi73ϓj ;썭6^(/rɫ*c?hONEِ.`_oi!nspĸY%*bE@NK] .cbJzz.Xuu([ӛ=f4m,x fd6, Ѻi[Z(IR7B+Cop#,=0'Q%KJufԱFjq |+-ܵʦv{}td:ԍvDEw8’Jޠ zcF 7!u;M^jGrQkf;l4\m&| c`I5gYd.:eSN=VSi:Ӥ@8'A*L؄qFc2 #o 5"**rEifHwʦv{ڭA⭫oZF &) Fr’ꊚH/խIM9"[a,d!=yrGlxt籗'P䴋/㴈/wY|g gqUl K<{XRrCPbHw*[r%i`>ONxӸD>&e/4(SI,èfTKwhʖv {?}ygwA;\oߢSOn?tΗލ?hԗKW\|{g6۠~@͚WRMyЌDO k~f'H'93p=ÂccIr"vZhϲ)]ľحͣ|*#no%QȈK [(9Ͷ)-Q6崋}v}{i ?''*lBnmzcEu F$5u]rEiԪip]~ T̿|*F˻*Q%\¢Hq)]Ğv̂$σ=͖/Y*ʚ 8I˨d2jnxV&}*ޓw'=B*ҩ3寫#k~mXp;{DƴQ6崫|>tlg)͓Wn ڈfT6崋neݖ]'g^ڣ tw=hXR=܊VJwL*[<͈rR OE1{7*Bآ -J|-]ؽu/=Om ()ձ4|btH,AA a&ԝ8ʦv{ڭ)4ǵ'Os|ن(UnOd@9ZVTfpW.a+FE]eSN=w}ԇϓIZs)SzH, -/le/v9*ك5_Qִ7ն1 aIHn#Na'u]Y6崋n_셷<;zQ;cg(uJ@lU[w&rR؊Y/ $|} {?FMؚx.H*oO2Gcq砙{~$[j;A.v$H Š9r7'E\irU6aiJީ+~"T_AM*37MyײQI3Ԙ?z. }׬'\NjDتCjEie&ꝖpX;{K㱩^<)͌񪛪/Q΄c;~ =ea*zrg;)KM߬o'b{tXn.n_C-7ʏFI8eEyxHXR9(IwBwd*rݻ0>ph/ fPCvgshR Ct`IG]t;RDٔ.bO Xw"3zWN |"^J,H3zCwcpMySonnt8淄{ݷST|Y~/wv+ ؽclݲXp}M{-J#1 ,:?XoXM9"K S4b\L21sijH/7#DŽHp~tGZ㌐ʄżpںoȘCd4paq# W ^s+ḎX:HiiWMЭX3*\R)Ѝ`)RܯhTXRqbpk[E1Tٔ.bOw&S.k9Hiɼ!ZXQ5xC2;G`sZ]Ğvk#v`r:[<@Kd S~#OeLNEߩEt;SP0&m-ӵuxQ7|u% K )vvk`(X/N s"K[yvU6SKO}ڽ CpR~R`H学1 ,@T6]5=ִHJ|_"jm8a^|`IEj$k뮑@eS.}etU(OPCRoR,V7Ux^ ?#\,ES iWM2i w9 +ܝtt6TVT+nj܇M9řVYZ]=4>vBRR^[t¢3U6崋20.,;@D w5 ^g`%Kj:8h]V.uaJN=Vfw\DTl/W7;63v\Dw$w\eS~C0-W+2aKL(q DMj(2WC+]")Z>M;dP9QNߝ.߿sct5i?&])䛂tPE?{aB}D>” $O>@Z_8}wGپ>)2 :w ``o(,N$q I1$>! H|bEqOHz"N#}IOy$>$}wUkÏcFRkog߱රֺ*p;VW`xe}gav ]ڹ >A5wݟFJrO#XR#]ӽ tw)]Ğv3֍ɴ`(84. >)'聫l(p5"` z@(tG(ʦv{ڭ9ifv r爰,lˬ5Hj3VP4HB’tSpE`E'ʦv{ڽs[ ?O\y6|yNVEy=9lrFXRq 8m`$n.Q6崋V츒 9&F񈡧E<rԥHKg] ݑ1ʦv{R<U?sig&]G@g3awEِ.`_V濤'nx;t.-R󷸼z6Y~ir|/3JwQ6崋n_{`Ӽ}oR{/J쥯;1)zǭ~%#Zwͱ,yXHp "ŔDTO;'y#b2tSwY u{ c3<Ǖ:Dc>_[A+F}q@B`gի(rEi[*q|3J]CX[: _ƶOׄ%b66n4˦v{ڭnK⹻J׻e}[G(GWaI%NB ~`EF-9Jqѡ'o_e_sskxyAo{h!ʾ_ /̆wleW-?Ѝğ9nK7/dϩ!gE`W’.I X{[7(<)]͹N ~qf{ՊSXC[]>nbE/"|E^/ʦv{ڽ}WehdfҫBw7pdGrTOd"ֶnݠiv{ڭly;ڍbZ;{~HݹwHqyGbI MɁ;nH)]ĞvSwgFr؀[hHX-,=7x׷;t﹩ʦGߔ>ؽbW>bWBH[W) [lۥ%UEx8G%ҝtr9ʦv{ڭKSҘ_ObyymLϫ@at|;vk/N<lsU6Mm߱HԻ#5!uӪ>!wzBXQ]߃lwIw(rEi΁9*IɈZߞfN!XRqB68g$"*qB6ʦv{-? Ri Y!J&-Gf+aIj9C؂쫕X6崋n͑駓b_>w~莅>rĒJXXKu([r%iu2\Sҗk%D-DQsOsz2Нcm^eS#?-?5oTyqgE^Qk 3E;<^\ll ҝ ˦ve]{-w_iG(N"H=Uoʧ%USַʦv{ڭ8Uk֞'gleA˜c0ZU"8CKdNPeSN=V_@AE+|NQZ?זcGCkjCO7C;8Gٔ.bO~J70.olDg}~oޏK}aAx֯ 9T6崋+"}G_/ ѽ[>nmB~%:i|Hw,*[r_:9;7h>c|"-Q%`.,ҽ*rEi0E3OfU NRixDa){SDq<X#DM9"[mL{g.\wucl^6ַЅHeC.}[y]I- GVt Ǒ0Z|`N^A®poݠb$zm9}i1FW)>872F\r?+J7(r}Ye% >r}Yz˶^F-?zo'_~yI?]J]JԳy- vs4}s 7jLP[ݏ +k?Xn~Gِ.`_{݊/c41<2 c ֯ YKQ6 2>;k_t6dΗ!9~,"Np|d.#t'勲!]}/>GG endstream endobj 131 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 140 0 obj << /Length 2196 /Filter /FlateDecode >> stream xَ}B0JVt<8q<XCVc@ilSW7dlE8jˋW/h֪֓ғ2/擫פǗUieA0n:9~?Zx7k#܂An;ñv?2 /HR3iU,` - W AdJ󺀥6ͳW@絬jzrcW:'d4:t~2 qˈhgYZ np}; kbtɡ=eΓ\deydpUScxf傃H?dKGusMpuR Z81srIW;2] h+q97&lFIu3|UƂj"I T{\D"i=@'3&_aX쭿#'bM} <I:shp󴰥0_j`^tZ6$Ck'eQ`Xg-T؋RY~rvb 7;@KIDQ~ؔ7XZSffFbp\&3aWsRkG1Ye6B췕}#:}X0i'auyoɿŗo[|qe ZWakiA^A-nj*rj:$#3\J>xQ"ғ-Ilx|ta(( DC788?(M&.b Yܻ۱ĢvλܡM'``nHRiynPU’e6\^(5F.RX_;FlxدR'xWK gQ殕|qlO~ sؠaQi~y`ɦ4ɜ Ck ]|sp;i _O:///&3W\G !_u3Z {!bo.hHLz}0A7Э[,,m$*> ETx ȝqNv"5-؃PwɅ~jZt-HEN/<<_TPQJBY-Ilw(b#Nf KmI`a"KZו#i%G1u0FV]{Ilͮ7q붭^HJ0 qƫ%{,*V'#,qas1%M:};$z"!ñ*axVe3m;{ qEp"L%IJ!Ne:^/'CsjZ+w ~ɨ'H!Eo ~w~@7Luѿk0&jV˻Kh< *@ YVj:{c A6- K)hXcLu z'4uj 5+6KRV0kT[_j|nD/=!c1#h!Sh_+e (s<jwx,$R~ eSUiP~ A& Z-)K̦S  Skeuf]o !ɑB2 5M|-gR3ϙ.JŘ|punj2/ɓxyVeU8eaKq]Pۘ8s0vP#o5eɑym9qԘWQC MKW mT by'l q "],&IҺ#- 'c3ĭ*H;uU賍tI#tn#R]{7*U58ng&ą .5PzaYGU>pMGlFH#8iE?#64]Y(&?W1ߣ^Q^Vr S &NW G&'N-;t#୼y[It꜓`㸨os(>v@wCk}1|bgN [V/7A6÷2:GQ1*f0s4\Bt@K]fGi޳A?\]&ӵ endstream endobj 153 0 obj << /Length 2193 /Filter /FlateDecode >> stream xYoB'yu")JԶe><`@8v`ٽ;=o)GNޡE@E>|9OVIxxq\k,n]fJTjcE|f*=ȳ¿f67Ƥgmbufrp<.})/qNfhrItӇ^`# ڂJB4J#yQdnlʒ' +҆:ڤ;hpꄢ7I hn.d@Sw;h G# ^U^TZ3ADfL^ 'se2[Ԭ5j/

    .sA2\b.n6/*eӯ@j <ͤz**@Pg{~.'gE >p:"}D+$v]z( ٠I dUbhr7'j9#KӐv݊y4Ll)7Ӂ-ET /L7Խ:OWk ߡJm!!uHgfsX.QuD&#Z;Jw}.UDUetj+:SARCf W$;Qܦ4fU̲tOHWfUQNIg#"ɼʢ(fG;ux"Դ0ј̸ҋ P]uB%m3UW n$$U]]ʲ9ǥ9lC>1uW&&cx;)@ GỸt3ZrqN >!G;$h@6!M#7DAq悁=|7{%r(ɯ+E.&^kbx3P2Oy{i kd9n5'<{IeǛ+_[Є"+Cf73ޯggĤ ^5%&#OAx;D 5[vȄ%64WP ꏃK!kS9g`G{kyP6 2ih;~D&I l>09' 0 ;K%$dg3k̖}g`,7StDNqdyO&xųzq7h8_f=bE 3*'' ]eVW>@]M"&&ҿ@sG0)=9b^¡ CXBMy>>SN3Q/_2mi5'Gpg^[Rkop%xϿČo"q'yh I?~qb]DȌ/5$ "f?O̶9\85ǻsMrEwf-t?"6hFD鷦ӻo$c5' eOP<5a*;Igf3Ծ5!=Oiy2PĢ$TYa4m\yN_iR YοZYפܨDP<0ěHV3*Te+*jhBb|-Đ3raLSU҅$F1c})gDT4y )"BR,̓h!-}Z=Ȟש`:H`+KEؔ\xV* ykg]!r`p畳\}o~tגN_6[3v/7Q熫1  s jaJ^Ĭ{N`uJ-H W 0`<_6J6%hSi<g}jZ/}‚C/ V L앍a'C˒[di<u,mZ S]YQTzj];dL3Pr Na7qA2.t ;kU}J̯p"s`Yeɰ{[2 Ö9ҍaK[۟t{nUt~*bL z=7s b4[uT㰻?9㷤=:#U'e{D Sl Rqy!i71boON Nk/@H{PJSO@3'\~pӗ_ 6qO2MQRg"#g {9niDa!^ o] endstream endobj 159 0 obj << /Length 1687 /Filter /FlateDecode >> stream xڍi6{~E/uHca {tʖ]-tKqI҉\])ezzzf?L'7j4fQ|55gsI8J8qv,˓|8&tr}[vg=4qqA؆-Qճd =Q{?huHjYMI/pp2's[z$͛EtʦSlDgP' Y$E}Qlpc=6 Vkwt2 qI ¯2;1vyXyDe-(|3 -P#p-llyg(=8 8}hqf"rA_KĔDcq,,.l1W eW4 mS P.(鹷uMiɣ }OF%F{aɍ"4;f 3j~IRґmBŶ2 9(P+Jq8y16'g6 CHbP۶ @.uu$wR)2QCάIh8~XXinduVA}$H-%jD(Gw"HZY`[3BvP&ur%KOĵpM SCtK |FL6Ό+;COKq5+M=/e4iUߙ8AٱQgn6ta6cz]Hluᄢ!wF`''֒+7Ek(v`වT/ŏ*ΟƏ$ BHX0>EjX לMHv{B&/8 үd05I:7Dvc4Dmlir wl ڥAB_7E%u-.Ws6y:}u-\!fĖ:*vh8͹S&؞Ӕo;5-2ҬxẂ[h,"&w|wߎIDtV6 pD1v22g4,5VXVu=Pkv];F90ݥ 9 =kk "kv Ex)cdpLL勉("f𮓣'-#A]L7E(Ss1իZ~Il#W ϓX?E*M&R?IdMhWKcQWm K8k<ݝN\)m/r8ݕq T$JNDc(h70nc"X{w%]%7E+Þd7T8/ݮS;7[^;6{\*>zU[ޫů9Jc7󛋍 TxC򩟰| ]7yϸvA~/2RW~w#/ZA endstream endobj 150 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-beta-fig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 161 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 162 0 R>> /ExtGState << >>/ColorSpace << /sRGB 163 0 R >>>> /Length 3983 /Filter /FlateDecode >> stream x[KǍ_K{1W?L00H,, EA`ڈ HC[Z@S,"Tueq)Wou۶%}ꗇPE_RW }^o./~_:F2oi]zE7w}o|뻟|>fcΥfcokۖmu.^o}zËxc,x㟖mCY~??0XQ^,/(-ńS^4&% <ʿyn=O+arnk9qJ?GmeRZE}^/Qwg͊4 .?A PǺo(s=GcbCI,%O!7RbR/YrhږljXΪOx3~z^.:6{yWyõ(3{Bz6bTx_{_aT:!We纇͞{vm0d:?x8Ch+1mCU#ǵE^=E}h`cQL'%'~u٭JCf!meMupmu$aϮ2LL'esz\ZY\ױkAfp.z:6{pg61a`:?a>jS>y6'sD\|r:6{3X:̆=H|N/cv7GdI. 0R`K-\` Cz]V?RzkNN) H)Lym0p= ^RjFyz&'et99%mS w-lH&\:6{39Œ6LN``:ٿҾһL 39)ao&LʣQgHgr'_~j+j;~vg%lbF:s??{%`"!mm[=›MR'g_!̟pfR`O>}~R$0dɛs<0u;hym\Aj1(a zهA}re›SK۴`(-g*ytRNfRU):9tv#$Te{eyhSבFoHC\(- d9to~.VuM/JbvGKE(|޻6U_RQa{E<Ʀ~Q7{CN9.?rAdU[\lqs]"؆wl9 ]%۴ oKU" FRU W$D'D5% uJDf"7!SWZ u߼rP[dX#1s* ybDh|*tݝؐ_н9&Z-{]k?VF"(iȍ.{;k ݪcSNlF!ֱh9"S,D6v( %ڽEZnݽؔ/fy/}ls[N=Ckس.;zCduw5K "M]8N)_~3_*}-~%8L՗F"ӺSI:2荖~يL~mYoM9of[.=xR$D(a<JCl7[,c]W:m7v9n"Z1`}VnzBAHs%G2lDL@]N:v9ucCw2[1Cs#"g5.p]"FoV)+UP06)to~?ul넾`i;*Y{ w]GfҚV-8&Ʀ~A]fYZ8Q$G)L\溆Xm46 rXj9K#wv&KZ7v&؃!j`P@QNE]Gf;3Y$6ٙuwvnL:!mgP@uvfgHRv=- ۆ2;s9ndrcgrjai_|tczsiؽ˻~}<9HݫK޽Nqtl'v0>啭 M_!mZ~G| Uj񭾏 )^3/yR rqR  ݿK^1YMߊPOjVSJo}uj0r7O  YCoGQ?vt9+6p>ÝۀLJؔ4~.8Lh+~uX72%~DQy Bݣ+Oyt!@]Gn@D7 ;E7 ѝТ Dt'g݀CFwBn@D<:s֕~hYz|ew,~rW ˎքlb\ IG`~J@/{EV`O9 ||XCMdBattxu/#<#|`_F{I~3|`F>0#?1"!Gnv /oVpb?H~X1N3f?H44x$<21~ ,e:#P$f[1c{'t yr<|`F~bD>0#f3#|`F~bDޱG>0#fK =? endstream endobj 165 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 168 0 obj << /Length 1116 /Filter /FlateDecode >> stream xڝnF HԤgp)ց@4EDQ:z-CmFn G!ѻ")Z2Z"L2*MDm!~&2>$Z|\iQEE:&űn]wI;~'l&QeH$&z{\f2%PJW]CTHUFM{D4p{~ KiʹY"MVjIvm ,cqE^{|q# 2Rn IꂳО@5HԖ2 C ӲPAw zoYI -;Zx?ӨLʒu|Q*ufb3gߩL)E3Յ$"5 Ad:ls5 RıPt *>E-:#Rde]-9oKte4>x4m !I`:y`a@ Xm!0s ԶRAd{GS,:; ; 6 p)}&S<ӹb7T ?Ϥ+T!E4G=a7Lcٙ{׆GSS$h NY Mȍ{*F ÙOj2.YbOKέٓSt]0#XLvUzI*>k$A1v@yļzօ aN S"iLA8n6a~ X͝PDNXit y~&W-Slt[whht>}b<}K( <2p"R2MA!V7YeD(Zo__?y&@65v^U d$ yLzM?V _.o+_Z]鴔HLڎߧ~ onQO,ێBPt14v y}І›{{כÚH҆Z85= 4Gj%2I05r^c2u}1E}z&i endstream endobj 156 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-default-plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 170 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 171 0 R/F3 172 0 R>> /ExtGState << >>/ColorSpace << /sRGB 173 0 R >>>> /Length 1265 /Filter /FlateDecode >> stream xXKo7>!g`#)` !!GmCqXKhM݃},Ѽ8Z\-n[W~;%R>|>z* G5@2ZOޭ׏?ފWq~x^ߋSJ?}tA*/ʜ~n?€:=uPR{q%+9r!.o ?% Z\fЛs> ]N 5J⛸Yl7B;Q ;2rLjVrc,blrӴz DFҺ b!mg'Ype,&wL%߇'X$M>DYXm-l%F *"ikγ;bmK'c[{Y/(E9 \B9+΁oxsWMSVd&%w0wUN" mE7v3ʉi!HGt=eĚP -4=\.3ŔB2LrHm !mllM5-nnAp)?Lg@O Ŏn>F{!^ V ;AtVRfI4o!PfgeX,؏< vZ >uF6[_ @kᾚ9In^Yi^_Rc5Ua¾c{L~zeGrOozrR]rǠ ê XSO,oϡ4LMl /Vix6B& &8[l:`{4<l.6W#oF[WtCǢzݸF)G^ 菽[Jw_-ZuCN딓 ݘ0ʜ0ڠuɌnYeYmYeYmYeYmyx{^ m<%ɫ!;508H vmh2i=s$ r 7/=kg1}e7/& ud6/O]}  endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 814 /Length 2317 /Filter /FlateDecode >> stream xZn}G }D^vְM=P̈C*$gcssH5 yxiX,2)-IɈ0$iL[0`(L LYfg15S99ôf^: k=A1B0XT1f Ŧfah Z LI6h&Nre8䭀M8sF$x#dh$ƛ  Wx:&Nb>`)N$b.X)Oz[&)143x:?3JT`FSLwq 2ƺDyRgƓ7dd&; o"vZAAUYI 6V=5PO$AT0gN/qGgS:p4XXἂfAtB+ .b6p|/ f:_G짟&OcG}3MaLw,amMݮL_ eWyq_$W8<[NnVe]:H6uo|ue^SM밬jb)[c9[`#;L5ᬬY~ݖR6ۢQ y|0jv\/qER!}YJyũ[X:3 afՊn˳*糕.5kfia=tGwc)G,/TCgmY D>ul1*?}ů]V*)IVK?wYq]^͚:UՐ-yߨ3|DF B$n_5uQ9zjdBȍ-N}dqٟ'oWeC ȅ NkmC~iZ/pp< P_HN C_4a kd˰A$Cd/vq^>%H'\֒{z 8_B6ҷ>ߞ)!T>x )/sY[? Ўú AD^${ʮBFA?6V-h#[-7:!tJF.7\(uYoynsL2eynchal#@:M dPսC Dwcpc7KvGݪBaDX}hn`c}N_t ,>,Qp= 99EъT%c=@Fec9UHvI-) y.P#ɻ\CMq>seQ> ">Quu.WaE\끼_K>U1>$ɩT>$(E^}`1"r#xs yL-Y+\å{XG SYf^Z?5g4ӬÕ69X_s##M@/:p[z^^Pe"ζ@lʚɁ`~r,G@cBEzݶZ` z*؎s ;e큝#wKg6}my\*eKވľ.P 4{=yV #RaL8fz粯0i/eѱ_ռ?6Y\\-jhh(Рdg4y d?ԗE>T͔^N^OG۬V,g)uWn_ "YY;$~yӧ*(L6mp+6#ey1SVm1&f}YMS6ˋ6AK@i-8 qγ{gbXUz˼}\4ůuWyCm,&blAf;ӷMS?Iq1a,J/Y^&m]nC)% _S:pm ؁(˲~&cxA,U^xdU6VHsJRW/P/ŗ*~H"$7AlYhm: a.q:n5\E=Z:wB-1r@L6ݛhŸ$"]E= 1Vm+m{;'o]p`҆{U ;Q1el7.3~.\矋O4Oӆx,&UzoO{ BԹ?VJ endstream endobj 176 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 182 0 obj << /Length 1587 /Filter /FlateDecode >> stream xY[o6~ϯ0Eb( Moi[IPl%sa0sύC9/F,`<jtp1Tryۋ<,tDFjxUK&56ko;J1 zIt@W ޿M[bM^:N6Dxj\k|&Jv,L"2sXm ߔo7·߽l/7QFش ^}ȫr#~N"'į*VEb8Eq@.s^3%1Uiؒx~MW͠!<3Sm"RSiZ/-=̔P<3">l/U}2{>-" 鸌 G~4zix1AJoYH^xwfa߾3 =W>:PM0Z]Űi֩h-ZǣI?F}:SODpXW$w>]d`NLQ)#)wF"3Cs_0}OG9`;q _rd2i[RH:sByC0]2 @I_UWEc*>ӹ~z}brW34iٛ#֓:.͈hR+Qf'O}*Y'/C]t,.LY|}< OxH7xoOp?WzkHZly[: Ox}bQygU(·\Ă~pbh X64SX.m=EEdeM5a% }=1Du Ņ8Ps1UK ,k.\F\yN]aRϏf1ޙ."`AT^6jT.DgS<'/#aqSV8Ζn*:6]?a Q۳r/| mQzk/^Ds endstream endobj 190 0 obj << /Length 1796 /Filter /FlateDecode >> stream xnF=_a-n6H T)탳e/HUsc*ΜmfNdrуݓpM2ahC zA̿}؄:23g8즛1ŎDA An|Ĥ2&:XA}w+hǣ >۪BuD :P\p\QEX˱ 4t ᢬d+JReA`N0uKNO)Y C;?x~>"p ·-BrnOe(Ok*=L0V<9E%xIuʘ[f-9FU,һ W\ad+ˉ-,Ai#{-lSق2۷̌W{.mKƈ&Aw1#]% 98{&X0*HXe#ϙE|8X4]1n4@hgc ԗad 7Ľ0|JFEe▝d}ڦ>Yo.(~Օ/5`Ik Fu^Y$聄QpI0LȂQQiK6s}t k#_T|k+[m:}VcUR.ÑګX_if:,eRdd ~Sb~["B`)'WĮ;RW[GRJUjSd5qu^L북?U1`"h.0yms5R*8QftXz/C>k< Lj?l!֛tśH6n2G4azF ٢ !gEO"@RU]%6)^MBY$'@_ma"cVJ)9eLG++7WV5瀼 ȱK'YkV^WY>{t동:޼60TX/fW]tme77 ãVS&S+y+U ¶ rtle7-LjɪAѻ-3-{F?WJWNT# %lMI"TKd&܃ykk iP pS.`HgDS@cvyq~tK06#B#S0* ط1u"s7eqHR(ow\>@V_ʅ/TFVO;`vZFK5F7ew0\q;f7_-uAnxlGlOũjqt/ endstream endobj 195 0 obj << /Length 1408 /Filter /FlateDecode >> stream xXKoFWTjCRHHP AhIi:dEyrWh.wf=;F(G磓,TҙTE)Yf*z?VzǓR,Iӫ-/pa#A"oVh?׊ ﭬsͺJ ZT+fxyν{֣7?l^ˏ!"8tm ד?ue qqERmӦO |.[WCəJF/4R\|^ yaL+Xj ?&ś +vK9ىFX:s!휅.ŜD cW)?3E+^ _?wZACc A'Bx|>HWaOVU{ywBm H]'~| xp+B HgMs;b ~-[KֹN"^Ys yeNUF0 ʔj'uf& 6:dTYVUe\pޥǽí*Ri~pm 2wIFf'YHTH"ӿҠT>jZ}PAV/%bB'a_[xNRvEUg\N9ȯY6N[7e F [iYS^oe;^A34='Llea&m9H8N92hhW]mӡ!=ծ374kme`pǸ %B<đ_/3 A@Bx l8ӋL5~BA<ٷ뽻iJD:QtfڠMFdxeS[ g@F 3g{?*BQ仦;@}(E̔bٝM 삟]zت!w9lAa^::V{ ,~NXhad@'CD[_);gt=!PSYx9#[a^? 6%Vi O _/aKЏ% bX/{,Qmy endstream endobj 187 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-mehta-fig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 197 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 198 0 R>> /ExtGState << >>/ColorSpace << /sRGB 199 0 R >>>> /Length 3559 /Filter /FlateDecode >> stream x[O 律c|d$Fk@h@A ]{yH[k?Qp$Ci͒?_=wjyf[m[w/|,:R__/_gn~# }=GkOc}ϟIm_=ay~֚|Xʶg_~~eys@_o嗛X7iF~~IO7maWW-I0۹r@X ]^R/C]o-n粧Ahni=lr `V@{v˚LxvP {oa~[^__Y&K6’z` b.I,y;>gfh8]A`ٛQ̠O.HP芆>ܪtŘ "77);?ZSW6DIx'tPx)WSó}> >w{,a_y}Oﻘ߶Oş#5㣂Q2aJw2տ޽#/ݜsO,#0'ܽ`_`vvj]c#7:;IC,k΁¦ٴù%pP;2c~\d)֠;lru}РS`֠;kVlcR 6 \Ǿr+rI Yi49ЁʾnǔUH>4WUt1MlL/p%6}_;t.cЁMx/ &ԋf_ǤllG^zLboLp=>Eѿ1MlL/p%ףƹat>u[skiSG00i>Ǥl!k\;賡(_ƓzM @IwS@+nԓV+Ƥl~~D^3>nS,# "_ZusLJz+gyRZ44nPhIVl"-*!6iRУ^jK[ȭ^ܴy_E隣4{&ozz/9&d ^"}68mF*@_m-g>@z HNcR 6Ћ\-l{I[[lacj #9bN)ck3]C>;$,!z.(]0-6R)ٛ4jџ($&G@U5Svbg)'¤ D@"8UVq!SU¤7@*s Y@*L 6)df5d]>K*z]ju+BVaRL@ޒ|U!0)P/p*Z*ZY(K j`z*h5dmY@*L 65df5dqm[Ky]qm#CrM.QJ.F amc`*'Ӌ/$r1HoQ?LRaL&SC1s6u )'SFF.R.+贰/7K BA) ՐjKdm*@H5LlL/pL5[L5$szj(]Z1Vu<՜b`C"h:B!TcR}z#e0&h>k` "׋T#\#l n8R)XD-ؾN:b1mCߐvf35Pr"Z GElnUAL8 %EOVug7S? Y"̩; I t*WKDAa >0v-!cqtdjo^%j$C  $ >gUyJ5B6 P!V=pLJz+Ç|r +ـ9* \)Rzhzl@ّz(HҪ?)Ǥl^VA+z}ҔcR`re.X޷1!%EFס9u>|Wcaq =,^AEcC&Od}6`K^1K|\|mJ.H4scb ~Jo @W+H_f 4>Hz}jll~Z^؁ g=&.vL(clzj]ѰaZ~ـLEm2j'c*Okh!lVcZ-Gиh5j&hkz "}4IV}iRk!_oOR rga7*?Kxci^yo,}E2rg˸i5(1Չo߼wYѹ}4:quhvgtY (em@+^_^K +DŽlb`_fџ%hQ&"d ߤ#3(Ah Kh 㳍o=q%k\|e5)7|Nh>w>>>>X}>w ;V;sysca?yЅGl{>>+Ħ -;|8z 'LMN578.3)tkÄ 4!KqC5!nL{ 4|q&2O-`NNOO;{OO;TO'''1>>v>>>6(o׻} endstream endobj 201 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 209 0 obj << /Length 2576 /Filter /FlateDecode >> stream xY۸}~m#m 4i'E,&v>(-|Xٿ(YsebM~ xyQLqiFEdf<*7-F?_3>ȳj_5&I2~߳FFI\qÄ-Q;}ψn"| ,h|b5qf¦Oϓsj:(b鹉;45i"%Idkyhjȥ%E~ds89v1ldh.s/md/!gLCMa_[aiւb\WlHa9P7"RWyTi铞I9Sg0UCT=[/=%eam=)J/6Rԕhdx{v)uۿ.7HM(6iW/߈DL᱓q!ALIkv<0" go')'a*u򅋲$L浨"7D"uQE`LTavPR&+QHz.urk;@\2֎eE>%q+(VEC-YMr~nv:n2;'z3)f6w4e2bbN>yq1STp&U;Z 8_U%Q) 2 %=Ymz?1Ӵ4R/r7^:D?Ld\5절W50ФҴCmTMhv6e?(ؽ,h6ϮF9JR*B)54?yA[~ز:D YVTOPu⓭PQ|=y>*ejjvulڛw]Z55ڮanJ^ BT5/Gf/6]c%e)aJl,6+}àӈlN5MJYiSvW-/Nc(NM:؋*Ms0^$G&.T;Q xGBw1@e:X@Y ua,]WZ#wI" ":vo @d; 74W۽((=rWUŷ!ԒE.O> f̊߀mA[ĜɨOg@KwH]HМPϫ@ZV?pFtRp5GX,惆"s(+ͺyb ᒴu5GNd?}31y%7COBnAZ;NE8 OH۝4-<8k x}ߧevs ߠ$G=m^ce4Xu+mPB+#LXN01SɣT\7Lt45/3 -VϰkNjtp7am8ڌT99J;fZl틽^d4gS(o|?YlTsəqZcAǪebLUi+*εل#Bi bwUJq 'NS39<坓gPLI_COizĒpI%dvOpv.gh4*B! 8pl]d _2arTkd-FyT1L"+G` <[5\: #' v`W8!,J)͐.#1$EhM HuI,t@}^8>8+iܭ1EٲMb%Fqv@*izidSiw+hņ8O:;X߄H$ɩ?tQ9^ xлvi6D; )R9XGľsz7&0C!]8#5` TV=1 (o{I,$ߕ[&h L:2AIlj0 tK7w݋mDvw$7\n?+VOnP$ʀY7~ Z+ MJORsF_kn<'pt_L}6w}fߕnI/$\uG4{{>iݢ=r&*ܵxWfCB1 x%Nc5>Ko6/!ZW|d9> stream xnF]_AJ&' \@kȃepC\ C wspV@o?G'ZR$(d0 rd6K m89:6E"1An#޸=hͳj^(Z*|'Y0&Y`Ep9qS|VqGbcAN`x<H7qRDE`m*AeDhfTpt:ws[,kNLo')FмT ,{FkTQw0tdI0pq@45gsu#17sx_Am(ٓpyE} KXS F C>hܼ,Q_q1u\4##Xт.1 +#CY)I щ3*цWQl_p5`nѫ4ɴ$gNkGᡢg cՙDVc{`W9䴷̍*8q?aHb%D$L'*1npkN(, K41v#0*^o|k+iCyΦKWn/ZYvld/?>cT{Rop+Q)ܓ#~B1 i5dHޓlP}vFˎ)<-+$jkk+ ʈrZ2^rQ+WӃ4D٪͏羢['dǵ$.wIߣunU}Ŝ-\J/ )WŬ˽. .8<`ӴV}׻?Qf u[^? }xUn:w[wӃy{֧N J ms EMX c endstream endobj 216 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-tribolium.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 230 0 R /BBox [0 0 576 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 231 0 R>> /ExtGState << >>/ColorSpace << /sRGB 232 0 R >>>> /Length 2164 /Filter /FlateDecode >> stream xZKoU7_q[P[ J%@,K@IhIP~73!,/|\?Ϗw._|_/bKزӿ>ON.w?׍q0|p˓OW'gO./ŭYJp%.ki rq_ |7megwd_[[]Ζ#ֆ\fBz~MIV}>:ž*M.vw]mNFg|otdF#bզ}OA'mNq>] {])O2t-o sbӛ덭/$Ee>Y4bn :E3AxE`gّr W:&ikaaa %My$&6jlD7c-h2|XB_]bol[%ꑫbYB&։[FĢzX˛b 9{Ƣ#eHADZ=dY@s. _(µKg /e> T bHvkTh1feBtgg:KH~== {#Ί=PۺG̋&:6?>juCi *cQ"&U&!Z8Cx9rѢ HA,KhGčiuM/Zޛ_KXkU( H@|V\+VQ0^Ćqv}# hr[Ex $ #1 5WL A#<0 -"=.ys\"۪l'b֔&q,Kh)zTlhnIEK6߸@#=0!W5Y&z'mzXVc%og^Tx)M,͏2B5XH $mcI&"zfX{W;e.27ΒG[,yS}W_q|SjV4:ʬg_.N?/z!e:UqK#nTKr٘NTS,Khfӈ b{>ŷ艗`-o{ǎypMOv>, *Ex >cUB4Gx vlȴM¾iDy!vlP6d !1{=,Kڤl6(j[̋rLG{of=q,KZTrKmk9Yϼkyo2f2~\QRuŤ"hդdLjo4 l= ۪I t/:5,'~E=m`YEGQ,'j[zXǽg#X˵I\җkWt% %-uKvR5/g/Eϼkyob1131zX=&#,lo/ZޛK`+^|)_ٮ/BXfRHjHٮd4 !hUTqCq|vG] .W?ҥѻN.N.N?Jꦬyn>]rxgťqcU;5?K>$}RZ>%JjSRMl*}@5$A^⓵Ćq7NMzk #M̥SfJ!X@&FwqVI00pg㇒b_pL^i)BƱQhjh W=şGo 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 245 0 obj << /Length 2661 /Filter /FlateDecode >> stream xZ[o~ h2/fY@a>-D(ۛېCvt"0d3gΜ˜P'D'N^<;-hU$grIrl8yQOd/Uәsn nw}x.Vi~vhe0dHa< tK&yScK۷gNdNʬhDNcTEYd*GMsOr|z=Ml걩t2Q*] z dQ|X|Em[RNڷ")PD}$hf -Mbr>((M')`(3SMg9z/!j6"^Rj̰n@llѠB>b3D/XS>-[uغ$`+ҿĶ-isI Ѝ6-ЭI%.su?i +4רT (tŦJUL!N|x\jȃtHguFZψI÷( 5,E wE *PX:H@ iDv jK@VȨ<"m!5߷h>@zSx2p@WuHiCǺce0גN@hVzoXo2<@ Q]9!}TiM6zm#\0A?iCm'2"i̍f+yuۣ Y#]K4X]<$'`v%,r{XYM{Xgn"! qhMXnPed[:8iFPyԱd h`>t%+&\:h +Mz@>\AzF`b+Sq1 ̆t%_5бYl!E!i؟1Z%B0YIc҃ g1`v4BC,n^ߪOjwX)Q`mU 8JVWl_^&bJH ϲf-.p֫NLy(u ,jYȠ8,:6.6("s"7EСZ>Es˙o^zѸ\E VY)%wcei(aQIm:f?ۈ$UxhN9̏4hb\hA\>*s$E4y ,07@\TZ!S|nV45K&Ό̙) s`z\j$z^$-EX2|d9mI1VZ“j:TvX+٫ y$ͨ@1뢓#N*Q=aSg jފ[1WB|1Wk@Ȟ3p!_yܙ|l8`S,ʄ`~ͫ7nN~Li\^,t;I%S |B]7i^Dn=KH-͠켑 aFXzn@;Xn o3oMW JTiJr]POc E|%'v? "Vre1#Hq?o^{ P=tu9FEuCwz ė,؆rHG ]CcS45*@;1Z8]{!-ˡw7u%#|xfيFS%}94n^$Ԏ޷[Z7|e,VDnJ_YQ]wÕw@WU0%Y| bؿ=S{y!6w2Վ?&ry A~VF_$.b9< C5 M!3/Ж25ʥ+f#3b.AI6F~#^/B n',} 5J]P(8+OR%K2t/.vh/g&a/)ڮ=kE[U]`r*egr}#t#x">DBd{7GdL݁xoz[ u>J@EB!\鲼?Iۣ$0Kc0C8gj`:d]yy :BhHN/+hk99V£ڿ{M&G9bꞎꖛSL?x#8}ܫx^Vl{3JL|]FQX/D)>tz3OueX-!ovsejr0\uwm8ڇq$"ЎN.bqouE淟!:*u*J{mza@;-NF eWmtf. f.DSN:'@Eu޷THtղAkJoCG) NKqm0a=D{qo\bxȖ\}Ё Il< K>ADev2#AX׻.tZ?4ƒ"뾯/; QN=>#*rz#1Sk>ܐj!{Vk=~h Bx ªQtϛRLpv:\_ endstream endobj 255 0 obj << /Length 1223 /Filter /FlateDecode >> stream xW[o6~J)Q@EX3? XIJ?v _؜oӠNU:xgA^,1zS`=MgνQeM-8{[eޏu=٣j }@Ne@pqF<Sm[ fc,K\oa ; qYD *73ŤԤ֍u!$xBMH#6VljÌ%|RMm'Lк*lʡJ"#Ml^LvoIi"0M(Ty'"Uąd~+!ƺ7BkMQ=x'n?Q P>8 =#XTЪ^r1oK R%6@xd8YU%L-ɹmq%Z"Ҹw~ZQq [k,kڿl;9Ϭ5ޚCr0 m---A7d}۴JRJOBn^#} K-M8,[P͕ke+3U&𜛶~ 6D9[|F'E)qfZ"806vM?ʿd+9FY8*<X8lBxGjO+(!/GqBtܰ?yRmx*@Q _[g!m1BPZAJJ:Jt 8kl[I[e\_C1Q@]DL\F|XYMhrwөr8l$JF)~:Ni>+e{yW'?l%+~f P}wyZ;1"41|^JP%F# BerEa] Ga4:2wp_Sx9m l3)@dbeInjFfnwd"5Q({ۂRQMBdBA(JFc`N(zKx Ϯ7Hfr*|}C}NBb=="#Sd^;eviy2n]Rӣز W,7$~/R_ ,e endstream endobj 238 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-trypanosome.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 257 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 258 0 R>> /ExtGState << >>/ColorSpace << /sRGB 259 0 R >>>> /Length 1205 /Filter /FlateDecode >> stream xWKoG ﯘ"̼&iuTzHr(d!5H/9$wF#XH#q8\̍q|ZޘO&5є1X3o/so~5,~y¼,fy3JK2.okgn~qd`ncJPLuP9 $SjjTL)`ޑ]Tנu;BJݮ%:9S|e.Tړs|1AˈjD1)\GpfkD(upwGZfܓy/p/&qdʕPMP].c'E(+SW-zKsܲex/*AQu) ) =fzpul͒ +QE/q $nKXp/7Jqjr01hv:C_O\F웭ER(7g7#U/ w[Ұz{I=!FDhVzѢYVIX7[PoF}/%=]28K%ZDQx4!-IP.Gq-Hf;[\%9nKxx',`="?rZvݺ^*꾻JmIQըoFV%9n S_w e/`6^1.jC/M'=wUp^^ ^*EdV{x$;~fA1>,>4l ok_~vɎ̮|t5XxOg.`7<Ύ)A}vT6σ2t(GөQb4GZE'=^{o8 T?S3ٔ&<%aA >^g%Y菾' =^NofH1?zqdw2K±L Xagۃ՘oYV*6 LJş4Sz{jwa3>siﮯߛ 9\S yGGNO8^r(u\4RuXֱ㠗ωhd<}`8{<q2NqatF׸i]r.#.1NqaO: G qHld7:6_v-:Nl< >/o_fus-X6 TcF~ﯿ1Ǐw:z=/$ endstream endobj 261 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 271 0 obj << /Length 1839 /Filter /FlateDecode >> stream xZ[o6~ϯaXEeX.)6t@n-Fm9v-B4Ɋa+D+"ZD"z|iGRą(dt>c(3Y\hϢXvܖS'ZcvSdTEMD4/HNaηo@c:)j I,RNqc<-u}{ _Dh4*{/;z}@{7gAj@3޻q\v7!n*;FvGH93/ܫ>v aN_^D7\Ԧ =fNOwTXA2aD]_# mjR^p4 8h>r^;>aI rO P n4VRJ]]o5ހje E>B18z>5ǎxot%l6/h'\ vn8}0Zao[iXQƳźЀfKqZƬzٹ]ix,r+GtalApNlh:R{ )tǹ߶VbID`O#`}e گг"ʆV}5,bnXۥˬ]!`O8}RǴfyXBsq7U{p;Tbu@pwʌ/tGڔxJCLJ|4=48wicKVrZֽLuQO_+|Y2ix)n> GN$o{G7@(w(m{a.FO/[BVRL>.{ޱ}MӰupKb8Ը82QCiD}zyU~w7}?j{Ɂ'dw+jt%Up.+>TP8+ UpU>\90Ý NN1b+U:g,k<-٦ 4XiMA2dY&Y6j܌ queؤTW$$CbW .ݏ>;^k0*Q QTd@O0g[fhR婦* %-h 8׳G L5J/3i1 b1O]Uﮊ TծXev^c%{)t'5GQk"葚:MZO9%uuYbp}_>kݸ8*J3Al@3 ZmE: I᠂!Dr *Fg_ڏhJ{h۾v!%WE-VVA}F",l-1i] ޻_:_:'LVw{ L endstream endobj 278 0 obj << /Length 1552 /Filter /FlateDecode >> stream xX[o6~ϯ0Ēoʖ%[u+A'{{o9D9[l@@Mw>,<UeDfeUi*nOKxWq E>IQeķ_snh嚰iv mP&gmX 夐6;8O LHxUeZH.0^E-ldyť"Z,* p;&f!aHGN e]+Lc:n"]ihטmC ì Uo:և&[2'Xojķrt&a],ըK,+G¾\{_W p-D4b@B{V57>WdưnƊ"%1@jـ[d)!sJTk^1kt0XՑ0058 io}i +&z6,G&z|m$(`)eH>m|뵟hKxEU!V#հIa(Hū|i-J^7a0vEj 惇cLj(i>teqx zuPG>NӐMPhu:xn paڛ>q*oft21Usw 16ݐǓk76&dhop|CIE~(IR0'l.J#B@? |^ /T{2wvOB}NANw0,o5?<$1\p/ϒ 菓_l5y_m"9Q6X;E qW̷~ᦻFH+MNkh.ER8^$u;hʜH]r$7"B$@p-] k׾F=􂞚jΜ1R|nBo+G1FٻN@{UVzM{*_}cidCxxXZ'Cu*Π |$US"pV*_+}ɡ>:܉»S@\Km;:t endstream endobj 263 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-fabric-fig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 280 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 281 0 R>> /ExtGState << >>/ColorSpace << /sRGB 282 0 R >>>> /Length 2893 /Filter /FlateDecode >> stream xZK] _q":&h MtdQLS&Y$wH(")ՑwLJf%zԳGhۗǯb1|gvG<~x8J#x99Nɓ\B;@P<:P0(ѭf(ӱ iVJFcnaoox|O/88p&F*z \!06Bh 9v[RiiagO7Q 'Q3DTf*Y Jthp'/,lј[fb/vZ2G5)kq9mlD0Imet 3/iÂ:rx\ڦ[(!]v#fƟ7iT2pv:Gt|QC+Ʃ1)ѭI<.[(1r%ث݈AA)=T=ΑPYL>!e:RӒpnXP[Gd-r-*7{[גJTqJ)1mb$GM:;;FnmP6Bn 9v1bȜБ)1$-N%(QD&o] °ҭֹMKkֶ=yj1tg}-yaZ3EEZXPk-{ nc=]--n=g3]֒$abX Z0a)cg(RbCu3~} eɋdJ`Zun`Qס{rnK\T<9\f2GX,X<9Grc%Onc>.^FNA⢧C?T_g'UJ<OVXP[Gt+un.`w/~9SeK2 V]O{?)R79EM^XsT~u{?sC{΋446?Nptt))}rGפ' J&lM k%VխK-'k8ۡ ~Z϶}Z ?ko ~7k_lna8~]<5O{!h{DK~rs,(?ΑX9ۮϾ 9vg>9>}p'[\#kΑ^ױҕn}naݖe<NcՍzQѭE9x[r%w,(ѭ\JtBh-KWW˾8G|[h^/wX&] 9[NJ] 9vgҵuΑ B]‘^]ذGkaUmn]ֵPVb _t(U}t,BI&P[ؚ&O -dҵ+82NLmPfP_"8 tHEJI]LN'8/Q+`Xӽ"vۍZ*|H%WDg%oT8WH%pT UvۍlEyP8G'M E兢mef7,yӰYMʼ6.^ S^(# |+@MkzdhK^e{ _(# u ϭrKm_8E?tW. ƷJF5jG_ \{ܐ.^ZS祃tt5ýiHǺ:J0zY)5;H爧 ^mrnu][rV/&L["Y^KV~Goڭ]uzwcP?1Ujz4^T5 j(ֱh$HEp^%)O5$FK@-S٫+FٳW˓E#Fyrd Jvrݞ|na݈R9j *Ѹ] ݟ\5}.4>W'|nQS^Dd+p 1Mar%79z\r%<y49M|Yf Uk>֟r\Հ` Ӫjwz9YP~>g~ t$ Z`dzC%6X3ү><$_EmXmǎAAYw/yIsWʏxgm?)mJ7R$2-`;R* Mo 5%*xDƞ`|o$UioC"t~=/T2ӕVݓ#Aԑk`=G"j&&ר<~JXs$1;[qyԕ)׫/i-ulEC|I&37_RcXK7_R;uLμ|TD_f2Kʚ/M/38m._k܆R #s7(g|̍&'~wri99©prqs2 ˻sb_-'svk;-`+1i8_1n[KjK"Zhe XjZɀe,EwL9GݝYXr&y93ǬN?_g\vߜP*[-b3o۷=lEl) qEli,bٹSi=u"_9)gs*'hdHar> 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 298 0 obj << /Length 2794 /Filter /FlateDecode >> stream xkT4W\ H'Q:5x$;_vg@Zx$Y$x㋲4JM.WjRdERlr:}(f3}d:1i9-yҿite' bVZ8q%=bz 9I4[:hU!УT||Z5,)g<-\;nJ2y4W >\eqlsUM-<M!zUjC \IZHdfIn V(\2ERr%lFJLf|\UpF.Y/2kScIsZO$_\(əYL@eLb6`"Sry lnKdG!㑆/0iR?5d4j;|ׂaݠ-L=BR yB4-xt 0]mN_ޱΞWۈ/RLs+A(swlIEP9uʦkai 1vz=`O$tpţɯ48#,IFm1f@x˔+N2qW,x@vEa׉NsȚ^Bh1A.f@\oX"SۨV&1:w.9$$%]|Bl o)pձLr7vg*H9p'6 h#BK`չ~uk"@?࿆!,szo`=YuȬuo)@[x'(imА#xV44} USdHJaI,PDyR~ޞ!NDֈ8f47-C}g\Hkeq&~plYo%#G0kK)s6YFuX1 8d=ήls-,2\}F"M:@Ei1"͙ma36G+519Ɂm)3SRHb8:nXZ[@Tk~˰K@T.~V;2]$i*Ƀ) ʡIEeѩ ݽA~GK2 F~hz=Ag PE*]I׉Ob-S^.>;yMۓmji,h:dDб)f$Z5M rza|%.G9:-<,>^;AT>sP.u>d-* új,L[fJ r?r\%Pt:eDE8܊ǧζe(&؆iAp.&% endstream endobj 174 0 obj << /Type /ObjStm /N 100 /First 892 /Length 2388 /Filter /FlateDecode >> stream xZ[oF~ׯg܃@boi$]4E;dVPbYC[h^t8͹wJ@"sB'}V p E|LB+'N D|Y ~&*b@'|)&:EA`ԔaYHB xdy QQe&6 )# )+<ƱQ&&~Bdi> ,U"ؒQOX-a2' HlmAXpJsbP9 V8.0Pg'' ' \¤Ќ=Z"F&H[V&`Nۉ&,G^"8x||';WC'F%%}`0uhr' wFDpDh5O"oELNޗ܏ĊDpC/'C '<6Y< )0R7EV?LzPJuu-W™ ޱu36O'<?-τ{ >P֘q$/^7u;>,OoIK~${/JO쏲|.iUu? \9?^5eo` sXy>_֋߇i9/\#Bv^wٴ_e5gM]~Ί[|ɋxCqX~׿"%r6ۈu|EŸk䂕q/AT+J #dzXIMlkڊmkIv:eE9w~"WWq7\r=7Z5c ckqgH %${[՟|ZλqS&;cƈYeDn!y!I[)0r>c#`'EՖe~R6dG崓ab 9Rb+@I- _2] :[Ki.`ν#>r+or1@.΅؍zs8c,IK3X/8h4I% \"M?O&"9}la-sf,k`a^eVM}xrL9N=LOXaOދOU./i(J~o= .`KD\d>"w\RQ#;x\@(e0\}BT\k DQ.^ Q.~Qh~TfHzd6n09r-ϞHMTRaebs&idGLrB klpb|(lA,q-tIB:Amf\djpTlGl<H܁YT q!qCg@.CyR].ԻOm.ŝK~ϤW *FpK%cK͗`%٘b_*æ5ZzXs ('-7c~/G)q^*ͧ$CcLôFZIgh$l) .itKCKdiSrh,M= SOc}V}V}V4&uf':g|/(yA}lOy iD%P|6Q5etZx>c]Q눪1m4jo%4I> stream x}TKo0 W4+_wХN[`vq9Y1iD~)-:}q-FJWFa x,ͽ%$!{7'YaT>ilG֛º c ʎӄ ;CVn0@Bő*2 @JNKLM-0X|tn/Nr nZLSےq|N^I>Nr[ȯq$A(TPy#dPȯ(e8=h pDZ \b lB}2 cNctYn67WUnb2UGB|e{}* izB@eC%c``ìѻ{=GOR{;B}${r㕲H:^Ird(gL{*ꛘMk٥MFT,sul^^q819a?'K* iHWj@L[nw =DQX1M<֘s?E͠M*ߛLx/|4LY/0]{џ.t3le7bB endstream endobj 288 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-Poisson.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 308 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 309 0 R>> /ExtGState << >>/ColorSpace << /sRGB 310 0 R >>>> /Length 19065 /Filter /FlateDecode >> stream xŽK.9r:_GF@79_{a@. }d\{3bEFS]jd$>#}࿿ww}|>o~ r~?ſϿǯoOh/=Soז?>?~_>~W[gs|#n=??\_@]:?}>jwn4>Jk}|X?~Rvs{EOӽBrbQ?ˣY˾KH>}<C}ֹS1Y֭W|ꭇh2fƬϚY}>Jm60Em>nosSK?͵2l~'<,8px9" ]+=]+ӧ{!/O|!od/`|,cϹ$|oNUoԣ,3sgeow6>s%)7sB>Ssz$RO5_ѕmj4Fҭ-_{^x y1$}Wϱn~AYRl0=B.jޛuc,e@W$}I*ے˴߯,U_ҕm,y&}mCB۸/~s`ω1==}f>t$I>Sn^wKlWd|.]k)jgOgކ]K,Yi߼w6o>~uu%y۸%{/MɯƽO=W9վt{/boiB z&.%oWd>͇ۆqoճ_ԍַ?|ۻ/glϿU7N7HJ>[ۛmZ%;Iچqoճ_ԍ ^K,ٓ^s߾;R˟iJ¼Y4 {} ]J6fIW{% myoԫ_}2=q ϢOe߾aC;ۀ`԰ڻ=9xɰ ޝ)j/gISߟX %lNZз}$oWt&әvɯֽQ~Ao.wa ̘s~enDq!K.*u޽ާn7e b}/*n/$U:_ta}@. E%{> øn7e/rG.G&g{q 3Z9]r}%~8ͥ7d!7_3 KIΎ|:|{>1LC?r+wbr#N{zt;fп–}-9?[udly/6'ϊώ ss q[&}{>IvN\^!7[ gMYm/D761:^sXԳҀN/W˸~>Ɉm=moGK ŀ&gҀ{޿ Sj=id xd!}3 훯F& ݟ&}}Ĵ5|_elp~O}?|HH#!pD%C8NcJAPإK,)6/lon:z߂=jUϭ*n~9J^8G}wV@hSR7>~ӶKhf=EoMHf/ĩh wKL XBb۸S.]_N۔@->WO귈릭Uܱz:h{^@/~ӕtUtp]mwݛM[|׍@RgQ S@lZf}.,*AhV ~Ao?6=Q g\{DC8OSXP۰Û9+Vi{b_e;P}ڋL#c3zrn~6{#zAG-K+IΩtۆqoգ_ҍ\Uu+U{ ^0l_CG$qo-]J6fonuC풸j7/~Y;~%8]Nqhn7$opK|);Gj'7A mުo:vkdK96^Rpp ﷺ$ty`ip=m˦bnuڦ$N%~Q7r e>Ε=)( adKR9'Ad:D3j ݛ)t_ֳ'kn%8j9*ɁcTn=;ҥt-@Xw8˷z-@xoֳ_}[̚QaWjQWR>_J56$[t_#޵+٫07{c2$bQжGdnvCmCgOjh;}R`_eK޸l˖fwlC˖:qR' .[˖6ⲥ*^7-=eKs-ote-_˖.-].-6[ɦ-dĖv#[ڱ?li'%c{NvKlinHrwwN6IlinÖv^li;z 6`.[Ŗv-Rӗ-v[ v`Ŗ>bK7[l ;+t`7}a?k`K;=l{rҁÇÖ3-dŖr7~AvTl$[-t}[:~-I6OldĖNbK'>ÖN_YlŖ.dKUKl5n MI~:[j2QgK={eⰥNZt[j2n&/\lΖ$aKM^`7 li!;$$[ZÖVybK+wŖ鰥bĖvÖv_l0R߇-IvXl|t%vl}-2&f vlM-Ml!R6"[ǼlMli(4q[8-MWliZ8[]udKPli.RL×-<][_e9[/tO=ɖזv--ד--Ul*-ݯ l<2-=ɖUG-ŖȖ2!-ݯ tOdKH=#[ RC`ObKmlNCȖNݏl;L/-jdKI-[Z|)OdK ٻ'_bO쌒xq6Ir M~&uoB=sJDNd2^ Mϸ~ ]I:% ԭTνQ~AoY9Y#r{}يvY=+'r*&]njr7{d^ϳXG!fR6Y|η @yⳜϳ{^2ZB]Tw;!{fZ_˞j;RJn{-k]bwjdA 9d1KL)~OfJf*itaYz ~s YNIY<[G|[zǺY]<)].l<˹74f1ߖSX3}Y`wd)yIϼn|>&ެgچY(cL%'<8wwgY;TB ҵm1{^^*+^l<{ G[?T[gQ ެg-{>҉TZCKץt1tm;7/~_ 1,c,kjŵ\/݌ ]&]Tq4􋺱zLNJ',tdD!<ːw+R9@]+W mÁe7>rs,vf:zu%]r6gV=WǪ`宠vβuDZM_\ww7]d|mpEpGP]Af=Eo yYT,}4)[@Y^w1γl٤,7\UuOWy{ xrGՕt`K}l~/7/~ XHVN/4Y@i҈<:F&\]HB8I]Z@`!{ӿ﹏>:nnrS4뺏U+mJg^7r]?>:^%܋U܋1C؋VCsqmCm"tW.o|J0i:89N6&d籃n 'y{P{ѽQ~A{Z(c !&Xr/L9ԥb,^܋k㼜־28dͫtYݱ/?!㺔KӅJfx׍Ƴ 78 CLpk"/h:h.7[; G=ՀүՋ}N#EVm ,ex4H~n4jR:"Nrڦ$r3g-q3/ ύ! ֘MQ$-eNX?`L]J޶@A ;ܠ{nh^'J Q7%6QoGWW-҉3I~=mSb_CU_[R6<՗XR:%/[!R'Ni2ᤛ6mJczEo-)9l], pԖZX?).B\|BwIѽYo}nFRIuU%Xddĸa}1~^!T|c9m?tҽQ~AoH]܇Fꊋ3pZWqgs4@#+E#D4#A<@#ެr^zWy{[ cXµ\io??r r J{[ c⧹r\kXoZ 燓ˍG !Kx`)qp:xYАXВXДXO29-Q=?dBsc"?IY$XOR+$eBc"?IYOR+k:+4l:+l,,K|˚˦痾,W:L]r",W:-sd"&YtZrEM\ԐJ`^~~lJ"˕.?/???"?NKhyq:\7h"?C~~[~~w59`M~a/?A Zbr-`Rï +\劃VXLMO\qZeX. rB3o+^~|C,7`&[6>,WO' x\㋖+=X8,W5Q(I~nww&?#??Qߘۓ_?~~ Ko_劙aG˕'cr=ib۟+,qhZ2]˕/+[<̟+h\+ CBYh3ZeߏrMh%=ek}. 0:jGiZ$ä$G{Ǿ/~>~˿h?Û``?cǚ*5zfF-[kX_e3zySg'Ѷ'Npr1ͣqL&6vV "ohx LTO1c8o=$lSiA-[{+o]l)+AR-V2>_/~ OX7+ }ƺ~2CBw?N1`!0G:Kuݛ:Khu~/֡O {/߻crX2p~ªԃV!JY=kapd-חyf> H ݇y%kayI=,@7}SB__ !,~7PRqY:M'*N-zCWux-"8{ G ᰨKHM= mp=YP/V;$ QmkjgDq GXHGztAH73 hzm)hnoEo9ݪe=CCɨ@EtQxNU4 AP/<}x ;} —DfF?WEtbzAGP uĻ@pS酾 ̃ 0 0X aafqnAa=5{pC__ף* \_x0Gxv";(<7L'7B@~Ozo<*VX?c AXփK* H+_y Nޓb__݃nm{IU1ka4L= 1GZҳ*`OZ b__1]C g=8 Lqΐg|AH' ,8^V!hE b__aYC"Z#|yC-W%QKQbz ~Oֲ7Ћ}}EoxACS}-ޯ>ZB__ç~Ώç`DtYOz8jtqO&"N }}lGn2͙aއj[z.y'HFT-GWxEa P] ۫O^ݨwv޽ Ztz(`7D}DW}cj>Zvz/039;< WKyXz[jypOբ7 }}%ȇӔ{#-!#rFz`Anᔏy= !{CW *sU)Xԣ\sF/I=ljPӋ}}ast6=}ҥo2 9f1 l5}SB__I0!4!b3T0C$6?5zOpt)y۸%xX WުGJ~ "m_6IX|fQ E](Z ?fט'B}2A2Hgp oC٧`~A{w r/' (s$LEj9@= wd&@ ya=Uꅾ< l9_'"B&`-G! DD*Ggw__NqiLI+8ڀ% GSՋ8yO"_",[,\",[ȋEG;wBqaBa=Uz/qz8N 9p`Y;*]#"N{zZSB_c&R99e"al2|@oz7{}pؿWCI=s wͦBء; qVTm<ᄒ}8^1߇?[:s!RNJl'QxH{"a1x"TF'/ǎrK$#isec*=R$!M_Hb!Urq:iDE+dv^']©!'|`s\.'Mxq&\pbb+զYĊ[&Ma8lb"|EDrW6Cc24ͤ)'LLӉ;\F1{6_&MA`ҖIܿ)KLDS.1#\Et{!VyD\쇶mQ!)JzCmN!p*i?S(\JpQb.D'l?Iy4IқĠ{p&; _Cʨ=$#Gҙ^I/I8Cҙz.$]SAp HoGzw{t9ydȹZ#=2&=)d 1BӮ;p^2ӈmiT -d4W`=:lqOc0X(\B<6N<8Gydj>=\oitpgHt+Ȕg S$m{}}em GQ4*#jK0@tz`M_ `PA/5&j$dЌH.9dK,L/3I FyD{ĽXp{=X[ e?WBSDƼfX="Zdb")d ͼ,D D^ sK$*I D/8m_DFW_Y|oc"[m#sPJn(wnz8oK5VI>n 0Hk{^߯E֗ƬE]F jUf!JY+%l'ugBmg soֳ_}h9G> uc-QBQ4Q܇z*=~jS}}j3EZLV=yZ7V=ޡ֋Vl V52lEN)iHdV#AZmaGZmVcej4H1i5T! jI-xV[ @Zm178i5ՖX6jKLYR/_ZMy]H-S!,V[ }BZ;"jK@G;]@V6MZ@ٶ0d_h\×SdZ+ hZIJ9fI35i M&bZOJ?䴚{CnIVkVK(9jV9ס:8V3Prv`$AmqH-MfBTev!cZM iNZ ZWF8!DҢ*2jqH5 bVSl"jHZ9ZDu+j CZmi5e_:% +PWjD-gC jCYA %i6HV8xg\h-"C h0!Fa-hQ ZmT Zm4 BjxZmjiE|eYKkIM~f")ZmfwhdqZm/6/h505VEZmvvjs&mHT1֣<8cM8 2$h5ќV[L@) iGZVxY$|B g|BJ .~Alɔ7 Fa @TCCI%$T ),Bͷ]=4[yxl%3i؆4[Q#lk$V;Hluq4fk_2i@`t@GSA ANz=\iZ#=*.EvQ*퀌e-GWV5Q`ڞK70jEz.㠂^^ҁd-7(|; %zX†k3%zFGzc}Ă*^d-W`ب W&ض G k>zm `=Z`ۂ{^+ 13-j֐zNU0{lvd-{WY@X"=JxȞcLTp> 9z)>(=3JC+J<(ir)wh]* , 9T-zCW^|!]F^t!ktlj|zB7 }}&}t64لiP УpMT0AKd=gS_VCv_0_Im>':%&em}=7/~G u!XAX0u_NCHbF8VjI,ם^}}ET#T1!F`Dt*zNܮ+NS4Kᄒ(-aʋ$6 (Hb͗}$QFA2yAWyy$yA*w6 F^z|cUnlIȋbOx(ȋ(ȋ⊏yȫWiȋ{ #/2X^{(ȋJ)&IcUuEy 2*!eUB,+ȋZF^eEQF^1iuĬT핐] N~ .i%F^G$sG##눝KII )X5yRF^G2q8jJ 6XlT$ب&H:O:lT9$ب&GQM` F54j2id6hlTS_Qm%Ք lTS8QQmaզ^[jS+W@(;lT/8 eT,D{6+1(SbQFGQ}皴f;fFuC42spSEr*j(98NzLLVG)y%4*/8h ZF^sc䅋ed\Oaw>}OҠS^!>1Mf&H'TyuاIg #q(ج^GnDm~GYY[?~o?)ȃڿo dOYy W17 fsᖎ7~wSV,Ci閷!9U?SF_>;`:Z5+$+{WHWnWHW)WH>WO#++$+~WfݗS%eٲB f0+(+{+ +l Fu t3fg? `Fwoto+sP߮ܛէ{I@}A'1ֲ2q3xEjBCMWܡ+4tjBCMWܡ+Pa}g/ fG}<9Q_}Lv>0U\;#Ւ'0GIv9D:v5˪dftN.TO%*gvWR9)[ל(W4|rxyrtQEy*s xcrRN-Y9^EI:)W:r2厜WGtd:Ʌ{g>QuԩS.m"ґrJ#RW|LW>(/@GY򕳒@RF(>V|Li>5Sg><| s=ϙ%r~)!Qk>n{!q{k>6yk>nz([ʯ^S|^1q~;ryk>ni㖟|rzmq>69-|_5ܑ5<_qK.V|Jzǭ|Jy9^5_?^y _ 8l!=;qp؃08,3WpXiYt;p0#Awf,haF: Ef'vMa&'n]lq$T-$B7"s&5 qp;:3 fsA݁ӺB}Y(0A#3Xrm1qnKf$a9&qɞ;8}3Fa7 ;*hqm.ò̇ҩn0gaY<sa&S"1Te&32'3fe%EK1,-KfDr22VqXVnX0}$3s0?òr88;/ɵpXvJ8k4ǖp U.V+qX|_af*}et,V&V_da.a{?C+⃉J#%+4+y,Vʋ}Na% m'Ma.a3aLa3e r'' #uG8̌ g"E88,ga9c˴ˌ;$a|Jh  %N YhىqXya9߅ÒDWᰤԈk,sLyq؞~`+yqXEpXpX&Kaa)q$K8,q_(e^*0Fsqܖ{B{'P8!{K8XÞP8pa0{:KxF8iMaO)f zⰇVUaOn{*83Sa̓"sbnߠ jo7Fot6fpo[7ޛGi}tgEkVdehYQVwVuŝufE]qgE]YQWYO_T~)p)2U {d;O4''{ИhJ  !;WWAI5os{ԘpRN2w0 ]0ADC"@<bI: t„#D]ѷWLF+\yœg[LJbbrf1}(bS\I(|nLC\7jW7#a{8AhRt犃p(*84u;犉-㷐0mC<&<-9&ڄ$[(؄g&<3lw&BC 3W`Vbd Ob0;FKV- e%=Z[ ={}}v13d 003{={:#s`nr vH&?#d`ҮlOXc =°`/{231Υjb'q=컁٩m $-Ycln_f5}me 7c/sڿY* xb"50UK?@k3!\ptq-m#Z9 Z2Zr $Xk|Pk%"g @kx@->f% pGYS  k2d1֜4ĚSsl6x5et̬;@). +$9jruMQCS LH%u"-Ip©M/jJP[|S5hI5{B4߁i i0-4-Ɣյ#'d*;i l;np6 DM *A|N4̵'Ӛ2v4:,Ҡ >Ҡ'h/jȎXi4AJDJ]<q$yM~UcЏϰ1T~U?ܾ endstream endobj 312 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 315 0 obj << /Length 1776 /Filter /FlateDecode >> stream xY[o6~ϯUu@o6aö/vPKݰ>Жss$M3=9x0<{TUȆ'SȬV&_%R*o2#UVp+ Y묛>-;n̏ +iS$y:q3n=RY VJ*y R8NJf"+aUY"S7q&Ș@j_$TUNA+eIQy-'FRLHIqWv%S$Ʋ>m""eVX&@'yq 뼙ϚXUi/,A!J x.FApIL5V}< \!-ActTЬ5EkWܜ+&V,E᷃HEш<_PPu{Mswt/?Ɯ oap,Y/EG NJأh%XoAKn㟏* zDۈmwHl}WL6d-#g="-=Bg֧0~"g<'=d V{ݷDeq{\(t%o:s|;j8Ahj߮u T2 ɚ 캋b2I|H4S?晄WUiI?QB׬@mCpjCCod}F[ghy/tjEXE"縴έ9^wC 0p0rA\\xAt% F LWJ$ o:*ON"]uY |,}"ɋyJ|ťDhìa{Zс:#c{2 ٶ J7}pO}|,-f؆ V͗;'d x1}r£v'آ|E.-_n1;{sGA~OJﹾDOʂ VmhkM`SYRFDi#:Z(BaCl[,COþ OHԎn"9jhTcifQRnڧnN˴*e%hֹF_馳WNfOܿ ۯo: endstream endobj 319 0 obj << /Length 1456 /Filter /FlateDecode >> stream xY[oE~ϯJ.Ґ@QP$vbMvBU93s{vqT#as9s kݴX뻣 Z5yoUe)j[֯:?\TY]0S7tt?hW;|gΥ٤o"{ø㸝#/ g=q%h΅ɮ횡c13MeσEU^װy;Bfs'=J'o5}x ;cDfar==CFh~ݷXkշoh'N^?Ԛ̒sYhU{տZ;]Y"T~\kQBS8&/lI^#a$3R~fQ>$8uLK GV{cǍ&HO%O}KB1}$ UamAt p%֓3$?5 lR}0#~xB@ѱYT~-[)p2Օib^oϡ1?4#Q 9vQ2!=Uɸ3%< Z LU[)R[m,;ݰdJ7YRVK_$.Jiƥc cbiR0'oͼ3|Q01XmH*Ea| 3^B;s1HZLZCH/Z u}74 ']f{yz*WUQ %9ɸQIKv\9j5k{?޽'˯~ƺKҵ> &>DB<9r,C=mcK2~i𼬸,=CTF4ԐҘ!*EMV]7 RGQ'K8K\Ts,jȦ(q_ۻlJco "M +] Ri0c|KX Ziehvxt }ʒlj"d_g y4Y+t*@b&E䅒r eJĴx*t%v/Eo?Q2ɊJ^~ѫ֐-X#Ie`Bo֡XEO{o z  fI[.Wx5=(*(L3K$Sq_Cad͑DA$;}7r_Aoz2Ŝ (V7Ն #Ibd_k$`G~GkO۹˅\\Ee$<oURFn}gw8n{p0Hݖ۞GjP7;.]qvxA c "t"ubss4vjK1w=#iNʓ00kaȇ|vm@xҏ?f  Xr< U endstream endobj 328 0 obj << /Length 2424 /Filter /FlateDecode >> stream xێ}B0D[\80SgH@KƺU h6!UQș3~ j&N\<>~U^ZO..'ܖzR*\'?M,Nt/~Z;}^uLnd*/>s8(@'J||U<+5ȖYU3 Fȡ /sNo #f{#PN B~orA4=b+Y<sy׏%\W*$еL=Pj+hKmh຺[7"oeIon?r$WdU-=>1&v3\v}*W`H|#HV.HmT/ؿʻf#ˊSŗ49IuC\$$ e?-_Iq#:$x:"rK?ߤ"Z g$&n=@u2?8"c}ĘӋ$s9e.2N\m_/Z>҉j1ef2&%H8I˹FSV@ޫ=UfQ*RT!G4l`ю8Λ{7ș4埖;mk-V#-uΣJi}U^ZXE(8Ik惂?Y2q9;T~:^$*PE5~ 1{2/,Tv6%eY&Cw59*rý%z?$/O3$aT>R8jP<ǣ733oq/Z`/#BXi7 pRE5X`5 .C gO;0m>1hP$@XN7 }K~{-x{(\\YildՋ?WDXۢKEįDuDi }S "yS 'Ep螬PZQ{#[TT"5֬YnMhQP(5 +toUB>dzFJ|KnwX;V1[֖:j%%4AnyLxbPЧ#EŜޞ\utftl2 p ¢v$9@ޡ6q`k$A *iuh:ޞfDO峓ONd%cJNĎDZ6H  8,6#XSPp_֍hCfJ[;mVN8jy. қP[0B4U b휉;x۵@mEBNnj ˆmnv웱8eUo #,aׁEP-͢jny!K l#n`/x`;e5+W_Bwmt9)`S3:zy8t#u]]^*O%?6-TS\W=LR=+tjO%kZ<1] n6g^u}cSF?28(3q媄c*3h*'di ^rT]?OXô0 N5gz>s!$V,s2%hǵ_hh#w,;- 8huƍGnvoː)Gݺu^bm"ыdcӕQ(@j-=ZGDX0[;?hԱ2p d+1VJbGU;+tJI)A۽7W]ԮրᖛqGrUogI!ͥrAS@ys}5zD !XN*^RwNJ|7芩c{M7rwS.C%眫A!ogcSٞ}n>.=?ƒEw-W.>b!?Ś>HkӋB' endstream endobj 334 0 obj << /Length 1924 /Filter /FlateDecode >> stream xڕXKs6Whz:!_iI/}oMDKj$Q$ί>`'% X.v}QV39;#gJF6jv8լ**јbvi;ۻlJ`BDosE{rO>ynG{#];٭1>w\WlI h|#/7 3 !fV(- ]nD D0>ц?n͟r1Xkk*nw+@ 5By~itC[7p܁j9s{6=/ 7\qսj:cۉU?LTl/Vރ/|trқ7`뼫ܕ>ܢNxa,,K_ZFz\~% g(xNI\z8"fNET Vn^V8ƈi :j82cّr#FY F/JHvCpZ^TJocj?*)FV1.Ҟ.(D)gL^Lj q¹ؐr*c댏H̱wV=.]0Itk:– bX(6d eÐ\j1ܓA xE2XB]MOie-x /50)am5򄩔1MCGے:'c"nWB"g>3ɚ#.Hjis[N7Fs| I<ӌ(.c#&/|F*vt:A,VۑxhiwU ivp{t#^N=DSեʭkpYFY: lI=:_(b#4k}nvB9J4~:tʣ?EF :P: '=mtD:Vu#6Ҕ<6nێ,:k3^@E8E\M@GZrMXDڅ;-g%4WHf \ Ssh!E U& ~S٧Ҟ;r F@v&"ܡWM.շNtN[k[doCE0A=&c4 to.&wD#dk0iҍ2k6\!8Fx ž۱xE>&b3|,{?ӹ endstream endobj 322 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-seizure.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 337 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 338 0 R>> /ExtGState << >>/ColorSpace << /sRGB 339 0 R >>>> /Length 7713 /Filter /FlateDecode >> stream x\ˮm9ê%$ZꮒzڧUV׷3"2s+uOӯ s#=~ϑ9gˏ>=O߼]_?o߿%1곌G3~0gOўm.!=gy Yl-Jz*xz?kJU٧J5@X9=#ߏmiҼeChexi'43׫϶[ꓥ αjy3smVliÆ`F-n= hU`51]ZVRТX*hwUR#X#Vz(E`=b^alU^haҶo?X3֑-ݞyuTh0=JI1S=Hϫz#3ZE>UP_QʪLуYWYByw,6t4y[[EU=2] jfj}Tã9V H歸uAai9YFw:J5چt-!5ߒ iZtR 9$-[s$4k}5{ߴ#ؙ^ġ+ m4Lu3mC5B*׸{BW,R-7֬=DHo)ў[2ccUQ`\Km(CvYMٷk=s)=ROJjW8V[IJop'|ECR߻˟Lt;l{wo/H{}o:RoNIN6\pvsz[Wui툽o/Ha> wJtC u%'E mYqk.l M'{>U[6wrƇ-I2tkm-o/׸{y%EO&\NM cK\$3_u m4lze!:ok\0n|.z̦d[II]9]Ih2LksMVƭx¼Y\7ZS%d.BWfm=iϞn;UusrK}.5?f_}*%WgjQnl뺄Y[Ou0mHVE4i|rp*dcY+)+^^fD?B B):Y*qQø5*:ƓWaӆQ +IuJ/q[Iq݄mz޷5..qk.zf+l|^vI ʤFm=KmSu\>[}.ljlڠ(/l,8LyWJSɊ6%f*׸aܚK'LY~?p-TIoAˇRCWfm=w]S߹rK}.fX- O pOMH/ oU/;K)?eV:):5.,OH|.zrJm씚zJR2vH%z#k @3j vO5ܚ^"/Lpr6*2j$ֱ»c\n.=!B+LZ1m^#v[1c ͂(ƀ.?zUf{OR;e*jXfz1y84zkzKjV^|eaq.~2kt#v) mP^QcQ|FG"xn{7osrl^;%1hn : @@-||B^ "ohdsr+T,cQcVax"^ö &QD@fëE:BA巙HÄQ&N, s&QcٰsvAy1Fl Y< 9l_nTv)k8zaLh$?'^^峢`8IffmP^5 \j2 i]2)YcC֛4A|Yˁj,"˛YKbK\xab +@6}^J$;pa+xϱMa/Xs"/tۯNPS߼F.oD`w8(PeבLܮ{% @%ؿ,-^% &aF qd6 n" Ylj wyPS6w_es_ X?Cic+}.̜U]aX& Nƹ"˫ٻȰ!r#hC"ڥvyn5  ([bg½b.'k" %/9!vbՌc88(+_e /o;1"F'c+TfAPrޞobam0$/NN*2(ZؚeּUlMkpoM{k5~#X5:vrybb` >D#v=@G4/N}OпyS \Qł̈́$.l&L%m,S19谺݆䣍P 7SVܷĈp3𺛑݌=HwQ U)fqvOw2Ђ( Nj5c.y>q5x{}o@neYApoon # 86Ar 5Jb}ڌ&m.Vo=v fmkpٜm;l;ɦS/5؄dPX^c2pat].FشBH7(ĭ~+ Wu7OЯH{r;vh H#|D˨1b>$/KǞ3U"˛u û&S=mٰD޶Le3c/,\o&ӷ>C<2O3Sm}~E|rC3_VkDѿ5lR&l$ֿ2+Xzyj?Z'}>Kc+Y׆n#_;>S`Ӻ%f_[2^_ah56eE9;;;Cڕb{PW]ox! Qꞿ]=WX?`~1 o]ޟ]1C߱aj`#HqZC%Ç ,>u۵˻W1~r߰E7R BpOv~>}ȭoHQ>)ƍĽ-_1;̜r(yR=6ή+g.F<e+ޥ]R<,E=45X6 qUeST߰,G:N}ӏ:|Mܹ}GLeda5oD-mqz5kHX.xc7BCAZNdjm]A9r& s(#m qϡ]`<5)f 1Mi#{%m^j GK.^j ;9)uoU:O ; }-9u 2hy(H5\g3ۊ}cNd-#/֟/k+A)u[OI̕DŔhcK$rG9( xģ9)r/?L7fo?8Y(]퟿E[hg/QreW0 @Zp+/QDm7w%kL^=kؤ=cqڌ. v&(M/q\QO|1ߟPyU寛h_llG~/( ;r~| o"5AEc gW{]@Xȴ꯾|||_/'n&8o>ço?Q 9lx|,Yhv/RL~R)h-.]'8Ig*Z6TIߡ6?T:7[ץ]w aۦĶٷk\=myMau=E\=nqra{}ghgw_60kQƏ~?Oa0Mnb7~ 4d>-qRyѭKħo-ꍟY]Vݑo7}܄ Y%ܶG6\YT߼ v܃t`7r$QD rTd?&a';΢=%2w_-Y8 ƫe3'['v"Ad%G07O0\RWL{H9J'p0@A9O) ^5L CNp&{.&,,Lܙ `¨83}q!}> Lt٣L/rL?D#0\/v:L!0QLTUnD@&jr0az/Є}(ylE;^a_ڹ"UKK8"6! |,YWX ߕ23'ZLxDl>D&/q.;7>M+}Y7eeHa|ߑ~x 4 ܎i[(?0[`dU[`D)R6??՞җL{*R?!>F&(4A_)a8,v 0)6]H|'`|&'l5!%0ɍrco&_@9ևdG[ br?@ɌD!|\t"z((0DSP$" {I"ЈpDMM 1yP"1MdBbٞ_No_|ȑ ~&v8#"6+֗d>N Md'eWm[F_l:@ zyJ1b U>@B*&\&8 MY#vM`֛szA\|Nt Ndd | z_ATGHqZH:Nmz ؖD志!: z z5u#D2NHnzئGx0z$e & z4ŦG2u:nzczd`geGѦG\A@w#7=Dx#$m6=Ax9M=GقI|#CXGȇ8=2YDGȇ8=B*§Mhd LozgASADfH9`Tz H> @|!yF##A@7 NI#$@"z #A=B1@sz vzD鑛NHS0#A0h#ZIAgHzK4葦 Gĭk&=#w`bN1FHqzDHX`b\N#bL" 0Az?(G—#U&0`]oA8}HG."i##Y#51F8=R/E}Gn;DqzDq1}=<=".9=" z$>4ަGnB #7'ՃzdH?_L(=ozdzw03z$0ö)¦G2MG#|N=뗠G.^=BL!zd~Md9=tȦG[!GAmzUG)mE#/`I1KAp#G Gzw z=rL=Ex##N//zz7]x#hDx# Nh=2t]q:鑡9=xΠGHJrzk邉N8}躠G3Gk#AT?mb#IA?bnyGWgR>%q2S2hkR> 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 346 0 obj << /Length 2176 /Filter /FlateDecode >> stream xڕXKs6W%U0 MؓIɬGvreZRŢǩ_O?\2A<nP&D&NΧ'gW%JR*>$Z;ar>QU3zHRdIС,黟`Isj2X2q{jo6hSk 3%rmA%A[t"y9=QЀVȲL"Nw"rE2dҷh gWJ&o'0i$;Bp'S̮);gi%"X^r|[֊l0 4O +g#\yk`+H0iѺziJXa9`CΝ1 O[>o^h+< ގM/yγ,GA;ʆ|-rh.!Q6 wNw} hQKv;?pC " r2J+*S]>U99<ՙ}wp:SViG+45h6ԁL#Lhڄr"xF|b HlHjBE+Wxzġl'6tfvE)ʲK[g>!'$h\1lrOi)Ai~NN3CRȬerڪkqW%FbCز8`ΥGꑔ, )3+p/;3~p{g去L('*:O0tZ1 vk}f}J%kCaeHoF2Ƞ8;_yh\IWX{T{zQ@ܰǘcL.d1 thB4o+ʝ`*$ʠf{aOATpvăB;\5:]%F*{jXs 1!n Gc7gR./H7#λ2̋6#QR7@P"**VT`)\WDwTQ8Y4A̕Q 01 X9ylx꣜=3l[T~VH܍0=9/rȃ+JoQCY7P&cmG2CUVQ 'x?[c/s9x;`~r1!ݜIҾ)2P`^PqqqEmFŚ\*+-~]Y/?=ox>.@͗'5?`y#=-Pmw?shr,8y^EwC\u RqU!AgE*O}yȎR`Nc/!cll -d`Z+K\>8gl(]) Ac:>6 8whء}3U.(ѱ}aOBcjfkf46 O?l! |JTƛj}+@Sߙ}~"LU~l1H=wA?y[!᷉=ۖt2Γ+<4bCR2| 'pGzoaNW/^mW(} k9?N# u7,:ϲ/VM9m3Zy5+/|k')}ܟxE'5PLA^}1tnJeW( ꜢE{2():e)?-}K~CߥC).]:~\A|"ˈ߽/W_`Z8tl| ӥ^[V : 'P3 *=rּ\қ}X00BHj^w%̢j.xڪjX2diSxLZҥ^gt:| endstream endobj 325 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/regression-examples-salmonella.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 350 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 351 0 R>> /ExtGState << >>/ColorSpace << /sRGB 352 0 R >>>> /Length 722 /Filter /FlateDecode >> stream xVNAW>LĖr@Y$6$ه-Xkk<]3]W@wxQzfa[OX| J)~@h>,k{ ޣ\|*>/ObtaV;Tm@6Z&VmԴ7Rbveen(`HK7Q,7D1; Ԛ[\N7V^¸ޘT^7p=O9Rg8 u|aVJefh{ӻw$c>eƫ)uOR j}rƦ'sĴP+%\?|ۇuwWu5ifW_כq](\u9\WMme`g.? r;37fX҃jYUu7U/ *+C(EV{:#aQ.m$f$-7G'n|CO6t2lc`cIx _ PCrKQA,oR(n`w n7ܺ! X:Mv endstream endobj 354 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 359 0 obj << /Length 1797 /Filter /FlateDecode >> stream xXKSF+rHi0O=|2C.ׂJ9 `mvEiHT寧_+-]pktkѪԥ^ 3CJF?}sP])K $73ZS38u%mE?qyxw-,xB~ Ti`֌S'8oii%uAYS֌Ao9݀ 5Yhҫqu2995<.AU@wq{!?I4RZ}K/(Z-ȣ4pSI7(zGLG? ؜rDmK>9Y2bllR0ڠUok^h2YWf'W a/ B.Pe|1UA=jz8ASq"!dGΥ& EJ !,E^ fj\yFAmL#!wP!S F2 yvTAMppҿ"wBrZ'NduGfLr^c8َ|%|UQџNv Z̉?!uԨAod*"}"P}ҙU_>JtP|uM?H`O`{b+s*]7[2PR#M{5H NpgmCr68`sΆ_[Xu)x|_s~qh#d}:uEPP K>"Wj Ļ1⠝F#Ҿ{ &M@SN,ӬmcVAkpٓZSAbx鴉+v!,X2JOSڰ,\%́#n?o][i̾5_uV*TtX}x-.]" ^23qE췽%o rr$QiU/6 fw΢BI.ٽΏ_U"tVMeW/9: M٬$)e'I^56{VmDl0ԁ,MAaTyrܙUo6!gbqL|fδ"n著$txo?A[qFr5}uaCچ wtm,VDgœ6*y{vqcNzM0{L>$KYx%Ob T_3=L(? uYp&DOw> stream xڍP[ 5 ]6=[Awww wsޚ*}Zݫ߁DQAdl*sf`adʉ0Y((T-mL#FP7ut@]&fn'ȸX,<,<Vff19Č\-Mr(yPi,ܜmM-Fv9#g SF6QPY8;011:1hneS'SGWS_ lMɌja\dfh xXM=\LLTe vc@Om,,_Dv; [{#;K;s)@ABݙ`dg򗡑ȍJىy( ,Me`f@nv^fv&f%abϤfgb*-w3`0uZ0Eaoo{>^ {{>f_^NFgGS+7B`aXƦvŦfwt0 dgeRMOՉ^ Vvf >F?aW '2OĮi  sɃ޻@uٙX?.:/&I[6{Ӻ8} ?C+1:ig13o-$,MM-?rfTdR003`{C2}}d׀s<ޯX'01ځ]@';I/?$qD8L Ib0IA,;; `RYTY . ` 䯺2\&N+{FXsk~zGfb} ;_!_?A.70||ƿc~O_=gﻀ_x~&wwӿQ}HA_+pԑ]T}-MU@rx_=7xUw_ctqt|/g/!SSwS dUVawbW#kѱ 6&+`N8yue[Vh븭6=Q ^yja'dѱp6E%r"3UV?;ԟ:E\ǠrL?. \7`:pR@IELQ&iXM6RfMhJF nBL QB5b3%j򬶪_X _N*3"8Ԕ3O.!` +Fy[!{XK`1j%wHMH.f!NYzK/|Sv!h܏g),յL6/[já7[]qo,'+۰FU3Q>!!G),L}qv>!up؞=0n۪xgYQmJ!''>E6o@Z0>=ЇoinU8`PMsA䞻x ~0'P ſ|/ զTԞkHBwe.WHE9P3-=\E\"ب1Ms']'.qKğ1grӀ-Dg;En/p0,2d0rcr3aoZn SgQ9eԼ;x,2cBsC<i!"΍qIb2žWteZ{RA¬_)f˾}EʊrnBQ;'R11k-fNIR\l?4(ML)Uz 7KrSd.RLKE𲏕x3Yx[ SEϹfЮkz>N(N@= HԢ1ag^O\PQR}ј!<Z[8aa~gEC SNǿhfw|UG۱"zY8&xd@dOsӮdPa3.K2xO-J?is _0&D~ 0kXƂt v[}Y2upxFVՓ ;l68 X+d eBbtD|d:5Qb|~ 9\I®kD\XlyIrWC$IYM`CjW7=grEj.Av ~-{k :q໱0BF՗ ܇w@S\RXK4^b9ETHD*9٤xtX^~Ձďykt(YN+oR&o1J}<zL5b1J㧸ӝ[VS:4:+nO:R吆Je-|^?piLzV:|?;@NpC3/ާPW60Y}z&]ysF M}=j}dz7hFcz䌊3PP̞8XGuo֋ܱa5mV\{|n>JD&v~ikOUH[Af'X]`8Œ~Bh&27!S=#4mnP|c15AW,,;+;9ooHZɸJrOYxZH󩘖>tAuʼnAUPUimz gNĐ49_sl<HHm#/vzs6Ryk[]/nx=wvd)I!fw:C͈rP .KKĠm8|{;ZQft0RJ5aٙC!IDnyj36߄eoq|&WՏq@X}}FѺz~,0R9~ǖH_6|X S} & "?9rmïO;l+FH`qϱ[L{Ra{l`#;^1 { "FU/V=>eRL`lN' w)'-g1RVMi{x3*W7oـɍWBs]H8n}<(x3O~-2/rI!ٵj}gϭn= VSUcyq,JNÙTr 9PAzגB31x\UqiC⋦G<z<gtj( ~r1{Ex??_ 5MdO$[  Ui=ԀL%BFwqL.[.X$s:tɪ}=9aK!͍fSՄ^C`~JMoE Aލ|6-E]L(Uw(zw랾IYR@ӭ*]|H%1PPw$-WaYď=-bt%Q%w R*~iC"*Y_G+gǚ؝ANnv(i8j)^']UQ2+Htfxg0'L8'1nIrɪj(K&6TG,<ʑm.7'gOa 09֝RyؽTAk?`mZrb]s,?h럀\KDdqd]s-D/ObIFn j):H-!xΔJ^ eسV=I՚uDNYWh7a$Z{,}PqC 3T3=ۤrk}> L+ejI2׃fr3H7G)G'ȊI].ݐ-F2 yB\++.ҏ2El56n2K85|={zjnU[[YЯĀ?)>"%>OLa}$!ޘ@ Ղ-4[5:ĉd1BY )ÿ|y :8glA(Faɷk潎 M]EaGͣ,MpQ"W QQQ^VhN/0,-n]n'rg:Tuli4ZL"oT$Al)=5p6  *Q<ߍs!F1cmUA/jnUjnx7wNd M__ϝͩ)|W-WY>q'gN w`SiB2̆gc_ L<|E6 .Mэ օ2ORi߿|ul R"H뒥ѝɋ$)+RVJ\Ƽ㺝"$,rj9^/ QhZJy`&0eᕚ,)P'DA_W8}5QdIH?``ùy\gTo(]$q y#!NnŅT pR2Ŗѭd~Kt"lCQ.TKC 1j!ptE4gLw$>%-CpnUA`s)CfQE+s X.|y%hy]HZ'xw]ؤ7-w ٌϙE6+؜$ץ oh~ Frֲ݃PBjИ%FuiUil^RE3|<38kuǫl`Z% ȫ;. e(=OR@fI)E+sEbn-Nh:5A8=K||>g{k^V>B u,u 8oqgvۊMO'x-7.|7pGMۥ`fI䯈=zK<},;AOJ҈);fVCQ49Jӗ?NQcN؋ %w1̯x2u e\?QkDnLPAsY{ޫ:ۡ%gB|?q R\ JnåT%[I"%>&WY>Yrf &/cp3Goo_&\+=֝eN:b4/Cb#BۗH]Zhisx#ZScMZ$/(h @MHNn|Xt]\;>`PAZ -@tA%l5QKpsˆj_Sw p8C6|o3u37r1Y\f[I3l&1u2yd*d4+f!y#Џ ;XeKsp*GXbʗۦi]ȦlbyxeW{OXwHˌ>^MKKD`Y]ӫX$M8ɟQ\D]уٽO-%=yGWցcӈ1Sn=WQa-X؜ qR4r[ acCK$ (r+hH̑慫Rb%6!*8%)c>5& 2NIF1d`ΉCT鵻ĕM=wP 9.[ >t!{4*%.-hNdɎAt(G~ҏt115hJ%4c~_\Iz`"M aE Xu5V~REXЇyR}X-j[4-r@6}ݢFIZU8usG0B$q|KգZpp$ېoۻ䝥 gwb 黉Փp>=zPzfQ߃h҈'`2)ʹޓRAxLCΫUC4N}޺evA'YT FWtzEg~d9႙.e@/tFc mv}<`X1ɧ'P __ ӻ'tc6%*}÷"Ty*--oC#R}/mdxpU5jEίo_?S80SZ y׮1@z|<,HOqGczzMXtBIX,7~a 43& җ[ti8Y{`{>uP\*z|3!JL#MB Dg& o$ m+Q<4i_g4Tf0yΖq;˿2aFl;1~9:r[ߕҥjY>C77K1~İb}yNX-IΏ=BFKvvm 13Ph\_e2 cc~ZɊ.kOc6ao棣%6KZ2ZJofZ.<¼ze5$[`ͯBh+^w󁒈>K}4/VvAQOi( Pqv(Q v2I>ݸYq\} #"jF-9׸Å@BϵL:s.S2"g-'F/ 70|L2tKzԟJ[Y=d{WtxSDu7?W/xNw$=!`Ği.$WzPgYn \^Y~.QPsm)'CK:97d[{Z'J$&Zbߍv®u ~U[6wg3~&]:jGĶk)ICYD[ᆈVcB-JP'm20'}":q`WsHruR-z,9'n>,K-:C;B#-USh [)t+:ĝ;bl}.#|#S\p'VK3" 'z@79_\U*YjoD cy?s`ӓ(?s V]搣'΢0J/ckʰ:HQOn @ oBB֖.fIsLcyD;ϬL:BR<3O^^F6SD&x2o9\t_(@t}Rς?ɥN~kPgbdu&xNv~6ɒeO r`r9xIE[HT_B` 4`xWcQ2 ?n)۱BmScEj$xJb:#R'q쑿(&a RM;+Ό6,W L}#s[G#kPDb,o}}钵5(4Ǭܕ\L$>ə7鲲%腻SCŴ߃'NTkzԢoF.Ӽ׷# ջI6/6Ai.]5(75)OoGzlzz_:Bl:7Ya1dz YQ$ACJI8EbZ`Or3O-Yj,HoHd*p&4MCz/?\IP0f_J}{gRPQb*v`()o>ֲ-m`L8RVneR=xdELQ'~h#s(š*+߬;0mbLV~hFHс\mCx9K~6k<*/yN~K@Yumk $0EEMvJ(5?ﲛ!,]tB@C%1T_!!fM̹=j+4 }odz&[S.өz [Udn7ngMuJlz+Kx-ɓtjƀD:楍gSw;3ȥ#PSFbsOMrUoj*VShZzxLyynmF (~ ͟PDݡ[bfh&y\")=6%2sqxtY^ ߋ.\VڥzVXB<${BṒs;(. *v2JJJnX|׾.M( "sS~J1ϳHRfctd~0z!R&87EUp_5]`f 5'/0Ŏk0pA>u@"0qiBRG)OaXܣWlkT3šf,Ҡd2ft"sĝ @+}GOŧho }SX\3x[߲ܤ}O402템^(,c">X~JV?`E!P}jPt W"{f*4FTw骧q ;&j*3>7`ipʌh KT?f/2\vfCޏ3cp-b٬橝9PcQj'4KAl?XWUu[Z`~v@,)sRmXM$W!(e_^qw&b7T9ǎy" m7F/!%SRwzc3"KCuN`ExrVH'T1] [5a4IzO#zcv̾\"gw14rb;/?\ VR%5{E ʸվyM]krI(ܛМ_3 b i  uC1 qI8J_fE1EX\J7H^17K+ATFf׶ [{ͮ1~2=r 1q;""+Z5op䳣oqJ{@pA{Ne2p9r0]cV?o. G]u@\62 o}<\lE[uzwYh҂-#nag~$JwϏ1ӳJi[a 4>B`!j$y z)U@;,\1"p~ȍOq^\"AbQȅ4O%QaR[WSsi%kL8IXmW*2ai )IȖaj݃I|fA^-KhcB搡:f>[9_eq C|﹵tKnhˉ~LQV_ wG\KCj-rYk7U40%(DQ 2 ~Z-TOH4 z.wj6C^&=J4yIK\1тsDW\-827I:FG EOdӈ8x6qb!=wD#Fo Fs~ĥ)DXfj(̪UqmCpa"pF(;}y/=\%r?QՕG~5!>qr0 Ǹ꿋0YpK)?r+)6 QWG ?oFn7g!Ocoz iϦ<;mazOdf:n(3+}P&J3bm2'!V"c5:Ap&gx?(` '12#猸vO8,^U* -#Lp6ѧP3:/$<3[xɥ ˸Vʹ)|e|,OV捌OJ@4 $DYV?;K?G>[ l>7ӯ )Avs&,>ŌEGk!:w7{Ɂ6z]J7j9vdh<Éw1!܂"rc#硈mSz^(ӝΔW%ܞu>S/ti-EV .!aciؘ;0'y:Uf(Yx״Gjρ0ǀ/5vƸrrA4bbMbKT8Sʌm`=dbZ_Q%<ӺEu\[sko4As7pr'S-*u&|:7N |Zn?ҳse X>@=tv%7([kM:8p3^[l:+`a~8 i`K}a ~H1\7z M"2/rYh@*75VΜ.p/Q)`= ;V0Ċ)+Rp/lg6WGɉE$ƪ).5I^!v[g`q J}zõnL׷s7>omNP&:I߄|=542>Dnt6e `704{| \XJY Xqɼ`#'jqF" $ ߽7ȟl |j!k@5N&im ٔ޵uSNfIt|G,j>v/ dGޕr.nl&˖)=<#1jLwxkED W~_R L*  $Yz}w&.YMtH"WWKS<-G&W cOG389"&1hQ}l{KR:1-9arije3_;[.R ƽYZj^9CnKLhS,Nk F/BF:E'K>}a ,vu9/r3z=SsAPYxm, _wקÐѻogk30sZ5ekxU) &I< w #¹mI%!}" */YflTZ}靤eS_S_8uc=Mqez)*iTz,N}]^.k#'F Gq ɯ-7gc5L?/ttO|{ Yq`&]c|.. Ȯ߱ҡ8e`G)KZ|a C9T4/(Zx%7+v:5`ڪqؿ1܋p8V[/G]7&y.ܺuӖfnsB&AmT6.wrE{\B]qO~&63z (cn֪~'6e20%TTz9t. + Elr͇?(>-|2+MXѤT2Whu)DHۘvKIaPu$I0gN2<é֣.Zy']фH3\˹6n3fd?4# _LqBM 6GtScL#my!ʶ>ؾ78RGXD773q<^fopLېy,YJ'i|NI0.8=LղHNA0EfB_v\J>[*Fp?tN i|>>c~[>>ZBne4e <9o% "v'HC'^N-n 5KAݤ`ZQ ~ΰ]șX(vߏ} S-T+9-dk\HjgP,S` Gx eWH0]ȉX_b(upD~xEˤ'.eZ,4`̃5"@&+pB~E tLd,ۿx~ZҡT3[)tĪn޿LCBNclSCK4hkdJ#0 >V&Sq_3U)"'7Frz%aLv5^iI\AbR>ޖ,K_|I-͠"uRV$AP:7n֜64O5pQobDŽؗd<|GR*ěz+/үKP#LɽcjuJ׫m♋mC~h8͜HQe~[5*G($qR)_WhxƩPP؀O[4!-9M^rh3p_t]S۩. C6QIy endstream endobj 385 0 obj << /Length1 1411 /Length2 6274 /Length3 0 /Length 7236 /Filter /FlateDecode >> stream xڍt4]׶A[רщ>2=ނDKh!JtA.ZD$O}5ksεg_3+: j8_H,(( 0XD &`g7ݠ&P$ KC 1 !  $I K0,7T 0@GD(veƜ$%~P$t hg;D{`A~%F{H @Q7C;P u~ BܡJ `a G 0 Ga\P$90y@".W?޿࿝!wwanP@7 v!>T>=F `njsͪpe;FOcOOs]x;GW^pTCs;`0X\LzP_{g_y@~<# h#@A O?wBB A`pGPǿ#a#?!Fa߿[,hkpO2*)!|;b0 $$& cA?|5@t1w4g@E` -tK=#oE_ysEwF^h 0o)UB9M ̂"_C|z0_r 75hn08TzZ~!0lw<(&瑪p{ï)tDB0MBqtV1 (G1. $Qa@B`@*ݠ? #{/$-Lv< 'GKGTG4W)ȎfpL"{H|`yN6u0tP{#]~YMj#[ k:/<M\q[4<$H (}:}k:KUiZ}fϷag%|p8z3wI3 h;NEpɘl0֜f0GMꉀ◱9":ǴLhYh%Y-l>YH7A]^RSlM 9`e0L6v}غc@#%uPb9;X`dX]/kuJޭ~ UT\maEU#~\hw9B_ j3;o/Z{,(‡l%—")#4HeKtkf̃(Q8CfÝ$Jwnn~܍#},b3O/,lEb'G !WJ{`7ntf-d\4T/ڝaɧK*={+i0%4(Ksgmh!`9O͊@ ND&1>_9q<%o 6?fd SKJM؁4Fퟎ.I۽[>andۏYq,'Y z4Ty5No6o7U[A (~&ךĴ!/eJoթ+5X(͢fT9?ʭò'ɰ()|b^>~ e4[WCG >ػ|g7Tv\ص'}V&K!n7ϸ]s_CNIp_h)In~$&WgEyptckĪ1ʍ"xAP%Ur0s ߾~ x'k>tB;l'\^v''l*hIz%t_؋Ul>V &wur0uKDͳlݑz*ٶJjQs|ݍ5S*ACxتE- [EE[Ed4eL\uuɧ5I;5F19#foS69?zQ89>Xoȭiy^P,.dGc1<`c)o$)(GTDzf@}"7Ⰴ2K5m*D6:H}1DܻD2[O9'Z.|:(f9s-?rm2gAM /D״Fvѧ:<nv!ܱ-50$JJ#^;8XEqcW7z< hjяoceEe㊖;;udrs$=E2+o1|*{{jj“Q%zqPp<ئE16m#3|GrMd߿H?fKuX`3 #S^}g]4,Q>W?+'ޕN>З'V#CFWD0l'XyIvA`Eزo%dUL}ɸ/= ?Ŝ,@GdNudOSzu ΑMD:[pWp-YU og'Mc~ՄNY#NŽX$ڤuwE\/Vs퇨 _^e ΔiUXNlҰ*= [R\w`?8Ѻ1me#G[5mAXd 9|8ָdSvpnYCC1ȇdRD 糾Q-v&^nwRWd>#:bd=CQVl> p)i҆4`CAT S|5$χD%ȸ;^wcޜ-00lr}r$hRZDfof:`hl3'rd_Γrۊt^+8ន ƪ.b_lؿfW=0hRUOxN?wJ,rӁ?JysUT OiەlL8,NVϒh~01"]^~u{SjsšEMt}B"O3o*F f~ލ7w2W_L la)$~m7WNmUו <'=!}x5 ~F=&"2Q2`:-ps+ \5|{p֣8Ek{ 9Y^F~{L|/GA"%AhQKyyN6 $'ͻAgs_JxT$Is-Ayn})U9q9+AW cH?9~X{_9gYITZRc_΃OKTSEr`2E6=,(zjr}c6m9N^tpG(nJ endstream endobj 387 0 obj << /Length1 1413 /Length2 6118 /Length3 0 /Length 7081 /Filter /FlateDecode >> stream xڍtT]6 RH!Jw0 0 C CH#%"t)J"- H*)!J>>>}kֺ>>{s]7' !B"5] @DDLHDD'4 |p0&Bu0=_P JɊDEDd&u +A|8^(y߯0/(##%; A@ @txy`(G yW$KVX_#G( HW8~ yB&D 0qÝ p!0_`"E9Pr~'`\P@_SG`N M>9~h@7z!}|fU5`NjpOO C?u(9wuaWP1|MaPo_M1 !"#*%) x `W_ A h/f H0rGAH/$?WD@ F!.Pѿ߄!o Xכœ0Կ鿯XXB@UU8@PTFRHIY$kÜ9{#?FϿn#"!yz*#M_8_yB=P7E@~cS!yWoT _ ф@ H_+nkPuED 1 s#?R;2$@PD7|7t2@XGޤn 8DTZ ~1EDBE n[#7z$&"j#[NUW>sg gdiU#g4x^7c>1l>l4L45LxSIDy5;, g4A!ՉV@]ϫ'V W$_L4M {1Y3Nώd& 5vx25D[b%hѤrQ; V؇GЪk&ѥ%sEclI^ZJG&aHwln Z}ǠPմ-UH G38\XMr5]L\6&hrR< Z!$b=%QϤzrhe| lU A(P~ŒM/nū=I`S> _?gݤ /O\&M/v+UJzX r8m9 IyZi WBGnJOR5u OBOf )̯[X a{SmBw$ znb}9cɎg{Wf?|QRb3@$WZE'4#۩g픅a5=sE*i#.-NCX# z^JQ7/m3`fcgTLnc4wk̢tSKCBV+xN֠%ق-a ZżNpvFVYTl4&FF(%g p"?x{̱H~E &&E|:yLJ:L*1&Wrm*x؎l=˾~]Q$Ŷ#OG}·V4'ʥJϨ6(6Nj%dW[݋b5aΝ&d-.:E*m([Q~zدǡSɍi#3+ʠ+ܷЊ-e=\@U *-_g~#<-+汛Iѵ5m}i\jݶ88Ο!FMV[S)-)g:u^;U츘L9ԧ.6/'"o?껷6xtnK+۷Y>-;ڳF'\})PX2'RC?KΪ$Yf4(9~ړ%> /4]Ǭ,]%c]hO{6uo%y|65DYm*ԿWBkdՋa[&V2Tr G<""J՘*gf;CxI !!{GIsYsXT_l26 5v/ZggJz5p.KT9͹eM . #z.h۪Oe.|xhH]+/LWOC]s 1a~韕a39X-+? oTWF=lu+"+| H^;r ~G͞?Ͷ겔AN/6Do0 WݗpTR$'СQ9ߦ&ҫ:ȭ*joԭ4eCצ2}.tqp|T:l (SwC2Ŭ~S㮬.܈Tkm#JPob]؄w1'-/l˒٠}EmUd5VOH3c*əoB} ;AKӊ#߶yMBڿ=c^*N $MH.3r'pHPƄjL u#%9dc2+=RSyf[p~~_<yGCKfHv@W ;ofz鹣,'h)>ePR&*ڶ%6"ʁ5m\`csrÒh4.@Qy+CxұO=ƅw՜FA6$|z{!dehQ.\g<2+#(I_Y8v1kқİږ" rs&ѽF/mb2jgpx@wPuO \# YqP LPW'j<<˺Hg>^!}0IbS[l݂ KRơ;4Pou0ȦiQ[.\FUmna ^n$`/4Op& Ҥ>]_姃cB2݆bA2Jc}熙< -D"m ۦ:BWIf^O7<..$2.iԏ%T$,%P ֘ {8Q:1HK3%(јșwdl§\ x;FN[AyP T;V${NaMoEطWI|r|)uuQ ҿxF`yиn/p4Eh9yJMVuiƀʮ)&w S~P oRL@L=/ JREժAc[T|}+Mzm^o~sZB?9 eX2G·~ *8#~UT׸5ufwl-(&W6sÙϑWG. N2,a jmLIX qbeopnAIFn'QQ6Ǚ(?Yf mYoIuz44jL֖i?\O7-Ux{jiӎJR%hŠQIdG]4'PP]g_ڀf}?37)BS&gSdERptR{P52V&+ڴ0l[@Si99nmwn$fGDD<҃Zg5B=c2ZRjGe*BƱG:E³SzVBTcp8evVꥈK:$n1Y.w 1#וpN&FG r TևƯCWOr"S;XE,h9m_̙7"ux5laq-hIj|Wϛa2=a<"){w,=}{_b, jPT~5s[di܆Luc8 tx8th9nY.v+VD*༉bh6Sޜф!'ϧ԰v(Yh gkD71\6kwaIS[ToM8rrs&—[eB?p_;`BEi7͊<} BBsMzmtRa{>&ꝛ]5ѷ*_S2MJ}"M,PNZ|E"8Y؞4KpaX=^Ƥl_3tIrJ4`G-Pj)\28YC󀆪xEV!H.۲ɇr8${t+L#TtW/]ڎNadlˆ ӄXwy{\_:u7^Ml-UӋਔm7BOSh/F=IdV42`nKSASYEyeefF~qXˀ8|U.fމػnq9FϚRԗqEi^{|6_hB3s1]wsP!-;/*>uMz%5^c}~.Sj/TWԈ j>Ny-rh㈐v^*Yr"Qh:T=nihONCCiCkY;{91ͨ~dM8-H$U _k]{-=z'B(m+nKL6ĭ];c"w涄a4.}JCxCy$d6N}~ \I4>>/ : ư_ (u) $J;^bpsZ05c$dlCQZ ~&qo[=Ȩy伏1-ɢ9G+ZIOXEZc[ttw3||aZ [ryLo$ ƲOE"t䌻wlNHb =kD5diŇŧJwE 1F_*_-jRy+* PkϥUM/R "XRL~2sdHϵK8>yq0i}ҌWp5);ݱ'~)Kjv b_I- |c$vjv1EjH]*:n [*%6cġe.Tw$ggKn\ZSH[7 ,ZWkwfx@8XO W*u 9KagP5> w7Ƙi7Fo,sYȱ~A n>#=1.]ydMI)u7XF=ԬU]1Q[\Se`HdhLcO/J5,5j4R CRU;=v5-Js@WQG|6=U7oI{E@w{"e!vh/+Kc\bav=xWob~`t{  Al199) Ebg5}uI\.be$c;&1{YdO&=-Jڣ 5/ZP6zLQΜkS8{bn} )mE328QY}b,"ΠЁTn <^1j8wڴrTeV> stream xڍTk6 -H+%CJ3tw4H0P3  J HJJ)! R͇Yy}g /t8`3(UWW@^N Qtǎè# Pg1d`&BաWG7/[@[P!B"9 P:8P'bk??f+ i'0brv`@bvH$Lݝm%X@ր-4@NZaA:t6Hw 78BΈWgk0p:@GY ;IVrܜ+w" ++ q@M5NrM9" 7dyOt@AZ Vp D@;5;[BH p{r5\g w֮0.=g+XY/ν -  .t=a?ܿ=zà0}`_ rpWp+$l q'l'?0ˏ^aPgGKKEN_Ov@=<~ '~y\P}g_ {Ђ<.ߦ??K$ tA|.ݿ}K0AXe7?ȹC{rsUq_, OJ{+x >>ŽU%7}a_Wn ]o?0l3=  n9tXCO=73Bȏ/͜Q-QV0oאq9Z~VKSwAiKcfD( e{P^PGt`KZ0>y^5DR ҢQUFF%l]?~<{ujIDF:XN{%R@a7ugT[C(P^JR=uvN:"ԎuO"Kyơ)-sbEM45!lD&i=F'pJ(}Z(_vP Q]vUMQ6̮/~[[f*pM,e&}/۹S cT]9fCB^^<7Hj>W>|So/Gmm2L3.Q1D^Ks>y.>YUGz;-Tz,9A}˽Z.}'h#cr6GЕϮv<+C}cRSzy@6 mAq+ AMhK^ꏵ Ef%ќ$ mlb%nc{OּF$Lq])Ηx9/D?h+utqSvx5G-EX?2wym))2ii,2Ty t4?Qf|ZnA_* 4Xyܣ5>+I`;1JoYWm"ȶ۲)ScfSh(hʘ hxPc"ynCjG /clf 4t:t>Zj6KUֲz$%@8Xb2dBub_^va7O?l`n]\rﳍ?xkP_3f]eFyH |W41Օ?Ob][#; yj3*X76Z^zOÈ1F@5ox^<}H/f8}~gL^&lW;@X͗hZA@˧|GwnvfJ>&SF;ݑn%O@-u`t7h-op4O1.ҎkY3,l´Jk ~Ti,7DϻdQ[L Q8C.\H,!=C aOڛw}qz)U0K]%~[όn^o5"D\f$4fǔPiA0QDM[>KUoTD6).UT46.K9؞85ՁJJ\I F՞P {)5:h&,O$7Uȟ]`S:BrɼlRR(ې0* Hp)hdFo7xIM,kG G uZ4SK5_.~ݧgZ5o)E3'S{!W7DCbCGdތD>aGxYtڌb89̢mT\pK5 j Z+YE9˨y)&Yx?I4aRڕ'ܗ~܏;T:ܯ%p&'z=W4}A~̡A{CA^$5JvFDͬ|j-Ldg*-S|3:,O\cςѽrGqV'݌{x4 1eB+yg:t'UZ6koZܸœAz J2N9q 7Rkx~##w잷h݌C6Jmeф9@_gſ;,,'PnNlxuӣQ@U 3ӦcG99p9ff2s2Se85r _B{v$o\́VvӸ{T՚^x{i!_W +2d'ɅLYc#ܮ@SENqOzss5_b!ցL CǦd㫏*o|xYE/C.jC27i"[?G8>:JY oPQ۬njš2 -d9w.0{rxxYh˨=Uݹx ٪KMb]nޔ7mVCN0(v .C܌މԇVنOVP fLo#œM觰Љ#A#94Ӧk cν1 (T8嫧8q|tmࠃN$u]!n2p4(o7)I%^Hz*%E 5RK馘j#qw{W>`< XI~Ե\o_llnIl(Up_l,.zg;c80wH|C>N9sl ^/L$Qޜy14_;!Zy6]Aǯze/MVMy 5%kU!=fǽ;E gBy fzĕ.u'GtwnQNo Qb$S/79"m}J<!5u5V$Dk(/ώiXH). 8KФ+uEDhHq^|!EFHF_"I7tw(iKⳚI+3R! ~krB^;;B<6ۮ=xW0/y S44woRBehS@XP6)3 qa_};O2XN.Ohiec=E~g@l)HU~ˣy=M'M2<.N{YS ''M|ٟ^jߟ XhsY^T * 77t;|~f̓W=L1ƮJoz٤ఄI@ep@{hOዉ-m'o. $kЯt+!x\sQGm>jt4G?k(Ikf3W">T32]FfxS9`~UǼGZ[)X;rbU< Wu :}V<Ddcder6HoF-I2]ʙyL4oU7Իc0_f1$/thU$/6T)32jَ"r& < ߣ<&am(;+Fz\YQ-r3i=޾V|Cѐv\sV|Jg7UTuK(`"moF䭈pʺĕO" U,>'h{/oA圱+jS"ΞZu6?Z /򐬷SuVAT.kȵ_ai"!.r_r/jͱCH{!j0!)OKy,n{ف~>8^J'GX!%/{☛`i^M^ǃ-ů} ( ˞Q(Bd|\>UqH<!gbIMpV=x8ꕗZp6,U_R~szlY, R-Lh2e|Mˢu$$vf6jGM~sz TF] [J嘦zw&˞f=̣;K?X|'f/3*$"c]c Jq챧\t;A9}e.ǝPbqy"Z98Ux6uƟbmLVv0 xj=[?t xķʨi*m  "sZzmT[8Wv&n]_y_- u?x%b[^~(aÖv'U9kPeb Q;0n)LuUR_Ijy/|[N|ՉQeF0N!a_?!!j%ED~"ˎlmXLCB~Ч-;&}!mi`rXЙC>rLMn5$:6W #QѰҼV :L(ꚭ |ϟ+.C#p5E8[wJSX7muFBJ X7=P2C4.U!u 4-B85=<=~=7@S6h+Hb { BD0 Zֶ_O>tQp -k l%0EvVmKլ%#PU13xh%{np`KOremBےqj蟺))ǒSZg?E7V &gzRڦa)YIgPJob>\,:r=Vnײi"l2WqV_5_ӤZ @Jh85"䰶zR!mX"3-J/c벼;Dj8\d:l,ጼ'mUn8gRd̘Kx 4m[e>ud]|5/@3o?VN%%t5C#ᦿ\-R5H$pTЃy[B?ubR$TM+zޠ3;[cZ2zVw&~l n]dE[πMMrM skΊsaOGw=xOtߖ<:eTSU,A^GgBʽt~HxC3_@aL'PN8]?v)-w*f1Qb.2"{,5Mǽ³ϞXwwz,:aI?vR3];k5XSC駡l7YtI/|&xoRQ|SY! }FŐp#f l'qЩ8FĤ㘦B@WFez?'=h}rcqHPWXET"WpDCqлц (Rv.)cn /gg#mbfU~x"pH-xLRu?bLp0XEfY,h:O"7nS/s Ț~}+,9QoL`_(.k}9IWtzk($sʼk9 7'-k167U'މ ~aڈ=jwF(VB=urcKh"[kgic{W+)!݀@EPqSH[pQy~m?,JX2#C1O)hN)0`yYԄ)h=?8zC~UbRIU.N[Nfbuz2`.2u׈b3&=<Hl$owB\T~jq 8jE;OXE}yNaѧ;Q^+~]̕h ʳ JKW"jhϿI-JQ-~cER{W"Rݼ yhIn_ \r/f m ׁ- D3^Ci>"/S |6|c6z/c'!bU0K>b0^HGOYA }%4\ohE!i;z/ҞlGs2|#ٳg)0jaח9Eҫɯ!rğ~RzkI{1F6y6ơ6Zhn$_X*-"ǠR0⯒V@olosO뇣s[jpk )`a>xLf:fo[?E~X,0H@H`z׊[!QbLƩxjKt0hm6}NE_#:>K);{ iU,l_ܕZ[9Cor|7bPJk)t ^z{HXʭ:?qhl{ǣcDz*FL?ځWNACN̳b>T|<,kW)X&Tϕ iEFjR[a{|=Aʐo*JVPseIZ2g]!$=30i?^xmR7(pdpb >⮫ IoYPخp U 8vRCHB3Oa4)kAINFc@f(1Re2`9ĥWu1Ls+do|9c#1U@AFl~/in,#W<J5Г7%oD&J7.|`URhR&̌ ~4n`CߒLϯ.ޔK7SC,k2LgV)Ԏ&s7K zC(5S\"k4)fa 76AѬυ=[A^Blߔ;]j(7%L>|׿G9]F!^igot2^HvDufJVb[T`,u,c'T$&ÆS 9)ǿ簛,/Z7^4\};KS^0όf4?z^pS<|XfF<[~N!D9Kr+3_=?x\[$Μy.P|8q>`O:e"U7,4t.=p MsLisAC[p bOM%?BB`Dᕨ %t(/C]'*1l<)d76E){Z(i2GZa:&=~[О2fـBy6~qa0lU|f#Ͼ~guERv>)2.\C(솝NvNz}Yef\,0CԏB9N8&?m7W^aEJsE.c73=\}u=iYS\w[fIdhZ/OQLUyDj>BD)RFo+SZeQߗ S A4kql,4oPJ4g/[ջQ ayܗ" ߺbGO&N.UH6&]n\E V͟O/m}7!NSo䖕L~F7j%=nUD|$5ȯ?^+&NU*EDIwxcߑYJ#uӵ/\vi|-[Ғ5WMl΅N`|{x60}cLxk$eKLzmx+ !ĝZOŠߘ}-1ҏF4b=o iPt vXHDeM\Z?'Xe&8u턍{YeᰌW\ R=/3_]Po`ۨC`p {qU?'c]aSͻwUX]{At*`379g1 NBG H= aȇGNf3_(x!F5:)wL!'}swc7Jb)nx 8<OB^nȹ{zYiJ;k:.r{C{dio_ќ᝵ı7F?r%9j8mAqIֵ=5CDƐtQ`LEq[u mdoWIp-w$}Fw#i֒yfG)q* <"Ubȅs%8v(Z턫[eSsS2T[:仍^6v~~leAIz^i8E 8pDl|j*-yY[<R/JK2̜-^}]ad619DqRr K[tuyEZ4F3_dKLmzgJӎYY&X=-O i閏ĭǑ(dv߱0kh!uh/: endstream endobj 391 0 obj << /Length1 1400 /Length2 6235 /Length3 0 /Length 7188 /Filter /FlateDecode >> stream xڍt4oRZ{ڵ{{Ϣ% FB.YjKcDQZj(-UV=꟎y}yߓs}]p;d"<3g) Ax Gz#08/0z8 $wѿ!!P(G 78' H/G  xߝC`c?hK kD_i𷬁Hh86D" $0oQs$" Hee@'u[ (pB8^8o?%rC@1Ix5_>} tѵ3m(?@ $f1 vO6tu!g2p@n B7+ 0Cn ߮?Շm@DPA:, J#?8:/!p#ۂˆ~xq“ {d8NC E~NLR A!%I<~# *Da!AGךA I/_Q [G77:=Ku8%DA]j[^ / +\8~v ӫ1fl3O\: T=>}_@8yq@8$$U#S4Uvt/[WW`NI/Hqؤ JW}!gg{h5A͠('l7~Im!7d9ӵpFvWvbe]iOFeEQ7`Q[ws:z "ZGp_+eac &PӔZ oghPu$k•)[<)a䆘+kmPE,Aܵ-8vr^ ~/d5N-[;SF')T`(+(iό GMу^wY1zsg;KΓ>Xf7nʼnRpGxO%@'؜B@=\GɕuXYM*&2 ۮo繹7Z:\ ҚO#}R[^0?P;lgB.UO<_mFv$(mN΅9VaAeU[Z\1JWj=da̕8x?̴5~{&-~gw; hc|na yY Kⲥ}cv &ƽNx[%8ÁUW^Du Ȑ|L?$R/\Mb?P?}%eR, Δe}W|[qy5Ks qJqMX#,AΧ70[b_^нUY#w3{;cP) O1=wPPB#k+%Xߢ[M_w%HJ,}kyohc47ڬ5RNB#Zo 8;hן '&vhy)QѧK{q0WbVi3a %9y z6*4Y4*Z({9z48[?Pa1@# ,Ī3BJ4[@x!ưZ׶[qm֢Nl_@[WInerF(b$eOSCkqz\@лO3c*|i3~9JO9d1K*^2"ZcJk[xmEIf@?=[g.Tی+Ʒj$W֦]pd}v˗\lk.U$B_oO$-ޡbO2yrcq%82BΙ7XAŖ3=uݝՖE ^eoI0,B|#c'$uP #v{L]}SM`QM79`NyH<` 'Uu&rvm^st-zAA`RߡׇWCOCg/mE glXݑJL~Y9wx氰|POY#܅A؛'ڈ-g.flq6so9lBvm;7b}]=ҽd_>PG4/zvSur%V9aw,ph\4^l\Ξ} /:=2G| *ukL@ޮzDQ5Uzm%ck%JQ\tjN'L {OHLJ{nxRV&zn*_2ڕ:ފ.ܛL/yM5oǨHd# 20@J7jTQ3g:X_NP5VO5qLPb_%Nɴf'ZTD2Y\psd(nOCɴ]hzkN:*t [W"uFȳ Y/]}|JqBzXu vV{"TlBX@sGݳ/ၡͬĭGjO:UTqc8s U۾l$DM)&wL(m&,&\9 %y0X,sC003ľx(>h Ϋ^-m^Zl'C@B#:C óG)y=W-75ŞS0c.*)q&Gm+\Բ;)T:\x~%5_[*z2tҥü.AˣT={w8!dE |7nԫʆ3թƕ,oPH| 0㪣tRD':-=6gjAܥ`$]WLo!dU1Β+#\ώgw'%y?~Ѿ9ŕ7<}gA(Mqe I+ZԠ8]yٷHi(QrCG<ٲ0+0 kSxh`L-\3 TaYL |_te. :T(ԯA A [bMG2zDÁ؞nƻ6op]`41_qE8Ge7n@!Υ…r̠b'w WzV;ߴ_5s}r\մ}@K|E[DB6Gjv/DŽul646nXOI]\rh#0Q ju7lɴC‹`Wl-p&~H#'Rdwgك>C:^]OjbyQAT75oH+<)eCvh;vo %3eֆ+3-[ª&gYd_gXt0mGn?&р˛-z.urJM}]Kw&7`"Q NF*.gmH)li'ɋZ{umAN,0kcqR/Jdt[[aaZ/hM(Hߺj}+-=R 7?/jߪ@e߮#qox{dl}XZ=D<v_ a%Ԭw'biY Z-VyVȴo" 1m@gp%3gxBkg×o&WodS9g )2_'k"Q>=UA[\쳏_.JS}:4NBBu4ycISj:TI"2# >KZ z;iքrCL}C.nn:VA6trnM;}(΃}Wx}<+ s4x 2;"v=. ;^&9Z7F|b*4#O%{E2Tvk:mЊG~$ (Y=@Ϻ{&% Ջ`_羑ll)eHSM5D7Gbl'? s. G54ҔK^]E~ghZ# Azrt֕ Rkffz_kH7qG18JFQ _Ĺ7tT`BVG n6d3gAH@ƲŵMb4bĹ$%D|͎]*C(IO.NOZ^rŒӱK}z-/1[ά9[SOC/x/-mwwXŷϩD/+ؙ?isj mڵtdbu)-٬bK/Sx%۝OPx䥤.|fNK΍}0ʨEr Q.3\`>"<ś].o;Ok87$tj+GG{afD{Ԃ%ESLo/88P~`cl:;jsIR>Dنν#촞K&/j JSf0]p ^e2E`#7AcOqM%>:A(9Ys] R릇T_[R ڒ<> י gEI%(]q(?KTWˍr9kU9qrSw5}9*q_={,8_X좺>G+ :צL<8OR?&/V̭@451Rl0߅RN*!.MɧVUǻY_4\+L8 [ǡ} 'X7!w3%Ë7/]U{L2cbBP+B6z@ Y[&U9jnjLlMg**uރZ9cy1N Tv<x9Etl[<9O›\"0".g,rvу$UfBb3ءGd265z/yOz&Ԯmeֆkpi6e^h V4HP~K*l̽ b_J"=7VՑ9m:KJ^o pSk 3I/E κ˪@ C1tc)#}]!\ onkPP5 _oZ+} $f:(XEY!"$huy%VUf| ;E EUgEyk*jAfy2gMy:Og؀ X+/Bg~&)Osjugܸ`8-)~L݌\gHI-dC^9#FbxcR?wRN8e]S>0*]?+MO}FtI:Ae䋭r3,P6qVbcO,>5؄7iqDQ:70!6g r76QR[$ܞ翍лtZs4xtՠfZ%ݠ~n9#Ӧt[GĨna>[pեܓ(X67(%~)@-eٯݾ_>ucT4R9;oXu հº-::N|.s_Vu&1#-RXXtZ#ÛRk?O\s2܎Deܶȷȡ5/Ҍ<3:?|[xܶ sS(q^F Q7^2׌FbGv/.-*X#; ]LӱC)K/!ǣ2%GXYofl@=o:D/Yl8 Jx},Tmldl-U9 w'=Sp)SOnGZp JH:dF}X% dv۲*MbV]\X-[2e >C'_U0<#mR1:q5@UطJiQ"]QUg{:gnY=4 endstream endobj 393 0 obj << /Length1 1466 /Length2 6743 /Length3 0 /Length 7737 /Filter /FlateDecode >> stream xڍtT6 J)! 3HIR043 -% )( %)( t|=Yg_;}]7#3-N)sLGqUU%A12j[`x0'5.2N0 BP8UA@ W I q6r"0$ ̿^,PVHHHw:@d E(ZP("jB9ssrA\'KqV5 Cœ\`_ ?q1p-;k( Dg8aNZJ*uOʟ_gq]_ΐ!P(w[,`uy. !| b9 /k<$BZW)e08 ?Yk'}6k G=2,0wvց[;:Ôd ACxc0 07N/=`emCy"!.0Zx ,xWG0?6zNn@4@߿ߌ2G_n])Mu])?'-pxr8y@/^, bWs:wsW.1/uYL - 7 ` ;G_U7wCvv,bomW(Th;TG0skg* h%H-lqHyk73kg:fg =C ]., |hAmM?.65ah=98aKx<`~ ⎇^=NNA~ =Ŀ߷ L""65MgUR+Ewy8?Euʍ,JOU.۴I;e|:\}֝ɛ[qTt1i :1QGJ[vj1d4H^iPZskUQ )%MTY 9s>:{aXZ h9kJ…9.+{ ("9*Y>JݹW.[)Ğf $2Zٴx=29 W86iaVqx[sRIqpOsyyM憩Q셾e{Í,i/ʊ|"l+9`$lPP[FgArsTPL_%ݔƕN4'*Kf[sVup6"VTӄM~fbb) -T 9.y(@L1ÜlIwbLz'B' l βONpq0d(a#5̪I[ZLebxt|g7bNͰK&`Ϩ%qtVB%[9Y߳RTvS}&_P\dO5 8< 795Rm?=Y))`pt87jThI2:HR$ ਘ}YWNdnׅ&ꤽJe#*iK ICv=u^7EsvT .PuZ⛪dA)' ҅>3&5Y g ^GlF%Na(?a#!ڈZo|^tUBϓ^$sl{G %bqG $3XaK]q jٗvE*1m6AU^{ӪRVR;9E?Y{/^GH3,;Y>+5&ٚ)Yt0q Ec/ծ@$O1gs:V1 UrdenL%'?E@{^` * k_xNj0^IJb u>iXflO^),~e/2GM׹.m͑>8GsH/`Ff!y\s4Ju>S/n o.Gծx6W^,J+9dҋ(Ͳښ%E,VmqJw.hVpKVSN;E嚓\^mܞb&+pF H4\Ft?R-tdJocyQ3 ](}Q~Zh 2ğ"7/2 wP*zud@I*G'*p&w>PݐYZIOKHZԱ֬mg DؓXͅVg)74qwL w>܍ǎI9l{^|3n8*k56?Fkq>qT,X_@6-g6(9lTX;)KIG!Y<꛽Xh7ȕUUҼN~g3`NFهwP{|CfW)Ԁ 'xJBԻsi8cSqN :;Bw \m[&P$F"TV 1_gy?ص֊;0cm])߆dˈm\SSŚ]\AO\adj>}^t79kf6_M氵 {n(Nj/-t S͖C[wVX_TP;nm`;#v>;M[ 7?ǘ<ÍkB;uʦ xVL}@fv]$8R&O*떂~Cm:[t;҇iA>uXTL;fnN xG7' I9ѕx86IKQ--zElnno~"w8JOMbUaw\Mah6 R(mٶ(>$1-i) U]WXi;(~(zMπsZP_ޡ; r^vb0EY`cmUiFF yJzJ Bg(cؿ *. 9P^}xJ>̊T$v ]Y#?ۜ̓J4Ii@^<a3p -܃Ki&2:m6*ukFC *_"\H{qz܏5qCKCR{2YttcRtP_MяYO. >S(Lh$'X`(#\9}.Hgm쬞Rvx2QUcASM ׫ċɴX/O&d'*qGa紐Ϯh^հ#WA \oR̞N5m2hnޝd6ڬU1Q ̣s9b#zOu/BD (w*|R 8>)?llA9?WE Ϡ~G)|*Vi*~ރBcgK.oXbpU}B;F;b`PYAOAIIXނ~OP.1%\$: uxo`Ԛ xB O͚ٺ]|C *~4Z=mbBN*تӝ*VKs#B)>瓛6 2ԕ 8+Փo-H%CSS)% [IL#@}/ QC]HZ-TZJhC>;:9TPV,ďqj17k WPT{j4;ExRmM~BKF2"\s]'] a(ېB_;)41/Jlb,9gg+paFY)_dBdތG?Xl6=i[:  8M'w2a+fV]kIJH3rJѥ WnSӬ1kۣci{E Id]?{ˤӹXBDFўL&章f^L|F>Tىke4"5&Rޙ7t)} H|H3Ї*}_ϋѢm҉crf1``:pk{2J /NwFR U}9?_^N`YcrǎhJ~ui>moS1S "d I{l^}KdݷNPIt,bn6*PRpbGH )q4M7tw Ljm\VX_T?{0Dqrʺԙ(;b5,n2]j=Iw\ܣa[G Eiby6!|/:wy5%ȸAmjdI0gN_zɷ%oc9K+:g=?OF 'c/W:2sÐX- Sfr }(XWq {&4>ׁ7~\;0iôNR>/;%跬:OQz? xPtB`l7`m~H3+xr0~pI we} +#.7Y˙U2AVqnCIod]6"N.*F J5h/Z} ڷ3IxLQ.*y|0EJڻg_$3dqDAJa RZЗ@u~{Pدbw#&S;> u ;]m,$+H!]3#hmEVGF#+=Rϑg;0%s?HI9'fJs[09_к5SqS ?*;_DfJtkIؼW\Jf—6bW=lxk-lgY~ ٭(^+֠>E~%8@ވtN_ ]y%-FnkqHrg}!MՋ#I\Bl}I_ 5s&XCT24<'ƳtsD1:J)CnW-XkϞtkuD(h$^ܵ *')(MҧN e@N{sq[>䓆T3%ZVefnkƔ/mIB wІM6 Cؚ29><E7._iwꛒ[4/Fx]-~*.f0y gPCU"jwJ\Q~ú,]*GnqվeȎӠWG鬨Zt M!Y;Sx`Z_6M:Vq?\a/⏾T{̷XG?]'셄]_!2x`DԯS#k1ouQaD7JQÊ?iϕmCOwְ0+&z8'V\f|c6r ǒf!5Nح?$chV<"ӘW< ^<'2nS5KK{>q,ي\8aQ7.q5NGlƹEܳcn`2yeK ]q.]T}!Npg;w.oь|řR^|[mTlQE.bȀQ -R)o%ML_2.,m͵1;w(}_Sb!Je,|W\;ATH]1 NC lf$#6/Vyq ɚZ0aN$.; JؓLZ_\bNܫbImt.&jreLʷvM *js)ojyJjgJ 2A+ XDd>| LK7c?elw$al/nLj|~n^zO`?R)4IJ4E1˹`s,x-iU?|7==e?lSk"pln7b Hm` 싫#QLS<,"y rOR C0$cb|f/ endstream endobj 395 0 obj << /Length1 1394 /Length2 6717 /Length3 0 /Length 7668 /Filter /FlateDecode >> stream xڍwuTT6 R:faZ )$FRp  zy~~Z߷Z}?A{ CD  b"`(9 @bвAQ¡󒩋AwPD HBd`@ jPo+Š<7?,r?LH ]X$ tNpaP`!~_Mz` B 0{pwӀOo"</1K1^h80:O@߉?P E!ю:"BEy`.P$ jIS;P6-ݠ t@~7 WW8Ӄw}jH,vy~AD ߍ8x^p-I1G' "  . xbo0OD;% Ge_J ϿV6"sQ~e=S##3[/ H¢`" .B#0_^?5{-D\zK,] ߒS,o4P?DM(b.fXr>-O@(/E- #=4p'/C=.υ 0AX,ԏ/- r9qp?2@"hepYz`إ@P7" @d_Rh? a䓟1?*3/_؏= 3[Tg^1 U]գ G?7D /j].OV5# =%by_ HSgs4"pS}oi,kMSifSA#RiikMYMe*GF=jLJ,tL #әׯid+<[mdҾ?,3$4{jfLtO19iu0B]:M݊L:ijwx^J*ٸ?ExA[m6"G$DugM"I)|dIʭ=;_{<"i?|i$'7UV?3L{fIdZX#ijvƲ^prs?-[3yqB`ҔChTh);uU2xŮהփ`y;s2Iq̠ŜAT۷-A%Z٩m]*wcd[񕱏J$uR03 V{e7dgd2j 7RWX-3ޤD'ׯ:f囩פ},]'φKkK*,+MՃ ۹ӣ 9rYoXZ{يfVR9,AX3#(+ xiLŝcU-X]?9^cW^ފO*S| ~iw7?HDӣ8+,N\_|.z=z0 ,zǟ0g8zXEZ!|e7hDԮy7sEzn]lN<\5;TXpg]黕+D6z}DQh`6}a[aM Z|#7phmwͭ׿*O&7XViԸZ >V1V7v]b${Ԉ{i{`BH:<.$tn.CQ~ Eͱ|hҢ/-"R\Qy'_u$0O3VVXUx@)i4vi+u>KI1FDX8=r#:g#ag>u4id!QjC%$S|iϻ':a۹"J{%>} ;-0OzJʽ,v+Ә؃TQ9V \򾩊b1)ژDzr8,;Xa>}p_ т׿.hnk6* d I=3u>~E5$A:f4g=ܥ}T.ռk!|"<)#{ Շ55۵???|6lQ,a1竹?dsE:ZJFlߕ.,{봳Yr03vK4!B&aPdzHxb﫚!·w-Bfn?yg6i} IX^lm \9϶e~HT Iي֪ve $]V|5%[Tw5L]'bu0I*Il'*gj>#895y j()):Vkq̡T2bu+Aʹ>˴QHi/p%S,~ ý$ [_&qcB,l7ei-'ZaXs n1y' V]ڗl)KY?6w"a, *c V $wgO!)BR!9)`=9yׇyJ{v ՠWǼ3$~.9wыSNm-T\-bMyV$^V 6zBrKQMr|e j'O$9A=/jOXWW fqOnG891˨YUbJ(|%l?K2h﵏n;m:m`p? Μ#k=32]w|,@5 2CKuۍSo ih2XEoّt4j ]e6_?ʒ<\)3]DD%ۨoOan49.m<wG6hb?|)9@C }ecL- ƽ9|]&mOUta+:jZN-L]('J3%(EkXnm/"0[“]VHc[j)ݤS%ˤ~yPFԶRwyOtXVRtЋz=QEqà2)?5UP&u_Iܥ!EcqWFѮemSȓH^BH-GvzϪg;AӪY_P_ GK)DHeȥ}/L"ET\:eRq+v? F9U`+Sqr=@ͨ1ۍZ~UxAU ~li/FdeKrkUwE Ҧ`bVwHfξm z^ 6][ f 7.+{kru<jE2U1?_yl<Q+]fyc J9WTZ\~|QTIo8X~pؘZfU"??O|E<~ʣX7F"]kW9뢒wƓG$.D+)<!S Sa˞]>A&~񝏺wOJfQ ghڍ͚yN/e'x+#O؏g9w=%/xC|Sj,f87U]ʹ:mMpxUޮ0elAmQ5eljwe_v>n P,Q c]{Aoăi忤<6َ#cU~1 >ޟDԳ3=&tb\M>,j4SW*;ń4dʽd 2H.9f朐TNb EgnF9 l@%+n̂%l!A xoYU"9&~I%)D9RV?4 u"v1yM(-;ˏĊSt h,vXÇiX?I Pzt*eΧDRϥrc棸;Q7 itqo;Zo(F_V!z^>i 1Ҵ)h>Ww|lvBabrnrh?U\~RyWf  Cw}wgRd*(D0`}&e`Za_k #_6p;u-Ng7%^r C2#ңXiRw3ӧ5t+}OTL|g)Ԃc)ֶ7̿c$<&ft,";u>ygeʛu1x2ڏ΢n %wji{Gڵ36%),$bZ`l S]! ri@mhJZ?CŇ+V;\oaiFIcUE_ywǣ063ͯyKxa0zY&`{'~Q_ҽv_!q]OuKj۰o^7'!nxg? esK isOZkw+&%?Koϗ,XXOB fc~|6W'aS1y` pj }}T8hF3YP eYif@+`͚Y\RdEm9-MU\Qc{2*lae֭t\<#v# գbBy9 q5DӟcVʴdhsy׫* 串&8%DA"kUxMaTx:ߒZK7,>6gU@U, G[?iКh{|,"RRqj?bkBC2&"J$;D.v'f%0wwLJ5 <{HO:HT+Zע| C8ӝf$QaC-mBq]pDǘeM _ n$l[G= e6єV<?RE^p+ؿ p5$ >BЦ%[AtD(C5pY i!3/[TN3QsTȆyǢM2^2*J~5orf][mfzS/|cfC%ȦR`hi/BB)x)b@:!!y[/!.]eܕ˷#CfT+ovGyD_wcBߤ˟U@GR;%Ddf ʯ-q@,)Wf|eloq'JzM߳ GI endstream endobj 397 0 obj << /Length1 1411 /Length2 6211 /Length3 0 /Length 7179 /Filter /FlateDecode >> stream xڍtTk-]:HGZ(H B EZBIJ.TH J*#R|?߽kݻ֛wf3/m]~[ DE--5$ hg~b0w_Ew)APpĥ$@0(7. PxmZu$"RDИs~pCyBRR| .0w8hA0̉P3 >*-FJ zyy @\PHw{9>Ї`0[؟p_ `p( ¤x la5M+ X/SOBpdtq |{k |Bb!3:V@0uQ(\2VCQĿSà{\' eGUw)`\ahPRBD `P_~~13"]v1`p;E,$C=AOufٿ;7 lgW,𡖱?~!1 $,).?j;$@Wg?$i#1ԅa9P <;F_ULο8#-$F .l154#=B@p Յ//90]$ I+ AaW({lFSnDE8!c0*y&7@PDcRvHw_{pTz6uo`y%@B:VU*0y~%:<"4蹮(P$?jJ}l-նpu r?#JnfJ|!ff-k:s_TPqZwn7RO1Q7$%EHqB[[+@U c8QvX?2:žtͼÆ/g0mmjeoɥotҰr}P&"^*UF9ϳ,fU~sw*9<\ ZȻlo!U&LɎΫw"ZXGY~Äa\jQЏ; ҉9&W/(C[_N\L{vPe:ݟNlQ#1>7<7dNnuT%uYS^&˭S?cvrafqwA=wGG.{ontXȷ5mD>ytV wYm5=x)<^UP\D"M:i~ISd?䐭:ky xo@JCJS#T3GD+'N,c)J[9g uA_&j3QJfCE ޓ^(RzfxZR0?EM!K9u!@Y7yS!,ɴoue3?S Ont#ާLQkӝnhbZ42vi(ӛѩ-cLv}ì+ؽdF՗u꽙l!iED΢>XMrָgӓ`)gAa?+b_#;+ ݢ+}CπzC!bEĘHf퉢}PQ ;.pwz$|ޖD\\dn%)USzkf'5G e5xSnMo#(y(A"@KIy4Nt6 ԏu;:n{مNe\J8T!gxtdħ};x| @T5ZkV@4WNa$i?SSCꮚ4}BBTJe0z_T:"xqR}ަB2P9f;PdcQ<%.z^ >yע'[qo5"&#&[ ^U{yzEo2s n@utRx|ޥl-CT~u[#܆|$) k@ 5Mi >ffs] /6*8ӛBilj\)Ij!bՅ\Dj= ~!&rF#O{$nXgr~ɚZ콧JlU\m/ٕ؟ioƣ8F^otJϒ)pOVs N^РSO6dzߎ*yVXڙ7*i*7ZDvS^2l)Rn`29QmyqJz,xT{Mr}Ia%ԎAVh4&Ց,}\KTj<; Ta% Yµ?E{} 9KU`EΏ|D̰ s-YW+ib&C1D`-@'e~C=IzR3SxS0h!/VGb{)6!R]15R}=BZ;v-N^|K#z^i)MVUN+ {4 Y;d4Ad^}뎧{9%[z)LJ"W1bBva: i=ˊ Pj2Z+.Fec^Q&"/`[EQ+IJxaļ"b=` lvߪXU&wQʷ\v*d0zQo#Ql13() Xt f0[m5`&t2Wk{SD݁:#7/{$4d+t׻0KOn=.Ћ l;Wn~q=. qxpCmMzWI@/v|ŹxT h )Ԧ(_Cp%~~NE3}MRY{I*2|ZU=ؐ`aqQnـ2EĔ ygݘ'Ƃ>lH% 9®f%ʀL#'"{F=.#?!] =J'2M57 J r,ќUW8=l؇Y'fe{O˫Rͦuw|oo;<} OBg^Q8Vxτpe i$[#>gO٣Tf՘ofn0Qٓ^FLwF&D޾ Eq_~; %!R 24o,0ΧM뺯ije,NSw #섋Yo,̴3n jF^#8yvQ18=ޑ8AIJ35FlWKR:Χ#n e]X o-zbyN6pJ^%GzR"a RV⸀Vw~G=i,$\">.ƬKU4vӔvuJ ~yk*@^lŷ+._FZC O7MYrx>7w3O1},m[%Z29M!i/i?$~Ӽ}+U+[+7dDU6, !!/R) ;fx5 kl< { n7 4=:IMDz|7?*p틍9c$|aG˥tEk 0%p6nWX5.T>^EnQ%#aɗ7jKH2ws~$m,ܸqva=SfGsqbG(Huа^!%.BHEܧ, v rime(kl q:b 2V뫔xXM7|ݍ+N~ a`i*o|l<{Yxw| YX5ث=p"N꼝A](i2U'P}>gNQUKzAOdfW=Uw NII'n^ I fLq-J/o]zN2;~~qu|ito̳o:E C i, 敋D^8dF"~iP<ӗdEdkݴ;_+Y,{&zf.d,w<>\z";`ɺ$61RnA_H2W֚MR׬6"z_gVHZ)LI1+ @v6l|2ֱbvf VaD^,tAng:+K"~ӽ% 6PK :f}La*W+jiKoe;;!0p{G?]$QD m#2G=>%@IliҚ-Os =+.^p_'*%%2!UpGHҼof9Vk3݆+t Tyj"k'tKȪRbL-b4*^{XPsF zSIbdHmcG5t97v--κ*g&*<00{!^@nRVYYptuZekͭ M8-ГNƯ3-On!Etɩ–)n{*[]~rTimdNnZoe4X톂`]Խ)ay YC.AF#8T^bXR<Gu, Vj S _otf2bM膽ddDA^s X!DIqK N1i[7WR]N0U<LDx 63e^X[1ǒc{#ȵ [Zm*R;BG93!rݵ7j:#1 J`jLT$Zged]}3m&P5-({]sd72)"DU9*5Zx=?r|ja" Pq>Uqk)=\J~P3M ssq KW((ИkꩃHNl}'ˊn{ݑ86'c3āz-S2j!S9^a^MhTɍgm,B?C  {66~!u'W'ӎWn~j\#,nr.s J y >&jorco]%5]Ү*ثuEKAEvB|pϿ ]yR+-A-G|hR{$ d8զSLR˿Y@iUCP}lӘU-]jZי %icn;)n>ﳅP|%>Z Gq 4UB|l mfy4m(u&`H?bD]؁YĽ1) w#@R._e/;asεعtHqV9C$!Uc7,aN]^힊y|mvZ*{%աl4몂kp1ZX;lI'gz1,S{9!dҺ B[*25OeX՚z1]A]HzcWgS oGk:-eBX u}lJ};_4 O j ٥>}aj>ZoZ{rܽp(왖@΅u[p.^HFHf7ȰM,7UIFJV"&*s&!SSpI {TΦ>\nKMkRfCK>kɱQjb}\o+ѧC1ŭ9̕Ihv)Q }]GC7\:gQaVcQ>3R2 6ח,MY.EydAg[[M /ۤ6$}90%~,KlZEB5[&k`&@JlRkzM gռnLY%s wlEQJlw+{gkzGR#ߔ8}\\-rV|D]X5jS!SpGSqftt4΁PFM <Ķ~foœ#Ȓ3Zx[%)R_0yô&?31 ?O-Y˨h~SVBK`D:Cjenח " ,[95=3-*sSp*eW-whFfu~*;+4N 3ܡ=Eqg.ՀYf9|yu5G\Vb9kxߊW?or$.s YLc㈆'o(HA4F˧W'ipF'*c>tdP6Qz(7 Ϣ~ʘ*&If'mX`T֍-#x3aN endstream endobj 399 0 obj << /Length1 2610 /Length2 22673 /Length3 0 /Length 24153 /Filter /FlateDecode >> stream xڌTU-LwwiޔnII钒FBSSn{1k>1^  ufQ 3ȕM `cdac@Ѱq[Dtvq e 4u$L]v #+`cCg@  ш;8z9XY#ޜ/w=P4uڃ#m^EA/d(bjl%q]@ J*cAhX۸#Wwt0u;s : eG c ?tMd)dX\=] ߆v.`SwS;S327HL<sgGW%wYd!`o Ohn?}rXڀ,,aȪ qrJ,B#x9@'ܚ7#_Jbp~>Kp@?K ;[`ac 0Zـ@0x6}6~^ ;?/?G'& ab0sp//iTLm_ K?ق?{} Rro-@g ظW_.;!)7;Mmm^Z7W(:M"ke]M Om\l<*6l?rWfg8~_:i:\+/|9Rd`8yΦ^H!7|@-1 vX:8#(7U`xUJX v`8UGW pt?]?]S p< 5 ?NG'ajj؀f?3wH~K^?t6@g Mz^p701/G[ |A/N09C?!mW4՟Ict7ra$rJ ۿ 9]1xHU fn+|-q d//hg<\:ԸYӟ};9/FN?&G qW.Opo|VWkg_K /p'!izW`ᅡq6xiOzk9x h8`.b=(i]4fE64d֝oD1V%Eȟ}jÛU[}&w[& DkHI5D||C7Av:|+[ UݫG~*bь6*3˚%se&Exu>s}33J.ψwY裷{?ZIHMG@ }52I#v"?SRҿ$THʔŒrYejvYlgMc$V6;S*VGaVs[huYڦ,OռfPu|kVoR#`#i,I [: թ `ZrO{5 p!@ľUƦ9Brʝ{WQwԾ19oẹj֑z~^@h)i9>/ScZw`LpFDBu!t|P/{|S ͖O;Q̣uAb7[7_:hݟWxD nj}lW tQN*ݞA4:soCx=YT&+ACW'(h QC-PuC 6;z4ۆ.^Ĉ5Pyo@OnSܦ0(mrGCRof\|l\]"ΜQq J>)2%fnyg<5t1s-A.$Ļ͟{O<9Sy;6U4sIH  (-Cu> `F!@l ~KPṾaƤxECb]..7!ZA *HkghvNf8*tMjʃR;)B=ڷ5AUhl,yĿ^(!U~ڐZnza B]ݷoM]!'_yqϒ^uXBGIojswc?|q>9wE@6oNFcthܼǥNi|+YMny:KE{]8wu9sP%'[,)]yyC ]L>zbmHd^hta=lZ<*v̉G3ѡ"ByZ$*[t&7r^57-oPQNw͗O3g 1~ipnZAt;v#Nȣ-q:B@1`lIfn\PÓωBbr]5zPH .<{ہ@ފ!\͵MCu@;YnybRpuh )^<:R%! nKRoUw%? %Џ<>Y+=(cءgqam:i)4hφUTدѰ-y08K\OdɲkQ ePS`*;._ͲщLOռ KDHQ[pH1>2} uPD6ƞN\!oCQ'̺7(Q~dovb}VF*T9ZG#P*Y7lZΑZ5x!B) /ug߮kGogUٕd6UJxP62`ޔKۈ?+VacH! Lw||E~B7a,y3rdᗲ`w%(Ei^~jYD+Mdbrݥ7+7Eʇ+asI$\OA4sXR3:O-%,JC*obG.,Ұg1ԸF] q^2 >J3Q s;$I=!/D+]EA nlZw?@&T`y1E%͂yjl&VAȱŷ?e7rl۫=|wpxN/w3pP?Z{t M)g R <)xwuE /Bs+S)">?JG|S T+,M6M){inSƀr>{X90\U +idRO\U&4Wa-Di r5j~Cڈ{J:HC(^51#R51S#y,܊U0{8gر-u%}y~k&IG$e;s:Mp2#,$" ܯ)ƿA+AOۮJ wkxFơV8 uxq1&d&NJy]+UHIvaD_L3tg^«ҡ5] UۊZ,I&=,8֌[:^<C0[1ha-NA=Q=J?4Un'j›]\$_ǟ 81U.Eqi8$َb8j- eY^X3IkrU |bRaFwd:PP1∬!q:-jmD_5LLy)7@QEWtvB&t_/*T;0au}s0rVOpÐmm\g+)H{,KsUUyS+ziS2]?1XNHyg4 4-k!.C" ۚp tAaeI} 1֪.2jf6$ M]Cno]r<LY+h,}}Aˀ-FlTS>]Ot$}J;{;hz``}$4sk2e* ܩ˟yp6M5aF@2]9wtH*4'\v,-y)g@y A:mDC,Ƌ&PIc-AƻV{;A)ޛ,M5Ir+8jّuv:-iVؽs6yv #$`#0$jǐKٻf-FO$=o(Y2.d;P",k"zO^Y5݉V+;.ԃXV>ja'/F]N @4OQn &x e@K*Dy)}$ԄX9\~ݻ>`_yzu{HG8c&EDeu^%]*3eTRکE9Ư{M-XKXoSvyܿib~Z&TH}+> 1Nws|s o%0ĸ[.RaXT3ti݇^~GV"Q*y 9P\eҶ6Ql~2 8ђMmnA,w<@$xJOHRnm@}0'z5I&%FLG0*6"PfkyL** gKCn;R-G BUK$?Ex,PyniF`–j7is*sH<4o6eD8^.@7_~l:vd@e٬}kq(Yܹ:2G[9'+5xd$xKOp?\m'3E_"q+;'+_Gܻ}!/kCǓ>}R&٥#@ai9 F5Rˊ:7]pW dLY6e\#R>eopw щۡF8J=ޅBaΩ&A~H̶Hov#ϑ幈ތ3ίjDVIq={ J# 7mK ;>˃P7KIJ`K#ȅKzo. Z ܱJj1'mSHLa@|(utVꟚdWE:T:G1GH$"47OzD2Boߴe=^xڍq"!~*֤,o&=\ %ɤbPĢӈMB@:<0Trv%F2*׾<:k}/sn!hKvT\8Թ?B0.eW8SY WD8=.lMKW*ɯMaUА2$Lʽ0QDK@InYit`$ޗm@D* VBJ |fE#"E9[ FtXNByocԤϰLNؔ(%FɴMzh_t[_SeSʭ5Q=&>%/c}R[ #Bj &ɝZ(QDC=rk#2"f2z;9ʹz_g9sqa6CW{> ۇSN QЧ SMшːd|>pQ$ĕ-c^tlF-H,cKb,w묜 G_V? /mφ̷SJ\폌߇\oҐvjmk+$*90<%rg~T98t0-]I߈?A3P1,(בּ;Ba5O=|fŁw orZ)KQצBɏ 'r|9鯅ee&Tn4v3*p3%3 AdʩMŇy: (G;CHTمPFeTf/JboZ::>__[1Au#tg }ftCD W}cd1l2/[u wXKZO[R#1:K%> Z 2HnO aNvφ, 2Ro@:nl8EKBR=B{{ `LdBME3%E'mO`o9-QkYpLZ @%g]yAkcU/([XN212dQ"i!H|ݴ!rWt\ښwnmLga*D:%خs'U/}RMu:p% zyjB(9I/L#ATjBL^fϓ~!#Zvv8rfZxIs lR͔uZaT*e!+<u)̒{,a16gʹ>t;A01¡O >M<{V'J&tQXZ{;_>$k&*> }^լyM-UWT v/Ο24J{a l ^nhb=h| %6N>^Wo2УռRw+{'Ti>>so6rn⥋N&[)_o`1=5)tg"JMp%!3΅șφ<;'5by[uWkLcT>TB_=QyN0ʅ1%ٻrG.̎D+vĖA3}*'L[ÞKbVfàpZv iWJ+1}ITcф)aM%1bCt?Mv+0|~Cj\|SAiGЦ$+b쫌; ÏI-䁠ol%#e2OGHch 뙤h:wWԖzJB%oɘ/5QU~H8eYĽNDE/O{Yf۵)ew@sO/umΠ@e+!U(}C ihhtEzz%㢡&gKo۵KF@}SN0Z ]%cE7֔Ztz%eh>v^"Dۄ\3LVtO!/:6(F\lJg-3E ?=Nx\f)E;-cV 4~ e\0c\ tnJ?;ׯ{ 0h5 8h 6պC`@?FX9zB3 Wȑ|2MJ7X~x~/\ *:"7HbN=? \;a#;$&F8R3Nx!bgKBdRggGpI#|)v6(6)T}x́FQt~}GbU7,+ߙk9 9 $wr6t2}שZwn]'oGH'ʋ69#DB:)TQhoU/}wN:7R4瓻Mg;aU: PY0 ߔ. ıh l P~؈;q$+HO;asCҤ)wc;xĈMn]@%ѥHf[ȫ<i6n`oO݉5}\gڸ]^riҴ\3i cOa?yл 7ӡ{zU" Z)1Ofd]7Q}2),rP;@h'oZ%P&A*\Pwe6&KهSvI-} q&{aOJWъL9^&,_+z,EG +)Ob=6&.;pM78Dgu7IUc&M3<+H觙2d-oLDh]"ٛVsQz:eL9Z }_6LBf5ܠ>5MNMko?!j Ƒqz5af~i|,RǟYBŘtCzwkT*E)쾱b]y >%U rԀI#DBW<ŪM0nº J/yLl>8Թ-!GU'0W:E~VdVrTjݨ)nf,&[ ̊.j҇˥{كL8ٸuQK% M[ eLa@ngXI&hnf`Ak}m2wQ^wS3K}I$)ճIR8A_@!O/b"爼i! :i$zb]-fp'YZ˂$Qo՚ԶJ[Jb9( lIz{l慨$}ooZnAღtᖡ7^3 U՛oLD<6_*ޔtR:Gvaat[W 'xgۚ/%C1.!1z$0Ҵ81B^dtMqxY=k.J7[0#Q3S"1ʾg0xkkfJGvȘH1@aE?C8UZz>AK@6}A[YƨGUյM5YLO91#(y4[W|D4P4fJ/4&h9}!1;Ɂ"K5YGdGLQ p@TYГe ܍xqh S[C[&ʪT )]ُ"gf7ܿbN/UA5E ãO}t)eόo*Y"^ᙽNJ~On_qvJi{uG\g1fu/d-Gi[fwmOIR&ŖKsd$IFZAR8˚1&}DZJ>:3B"QX,*;h[ rQ~gk I؏Lcl?zXĕ9r#} H*62q 3I ~1l5;<%$pAcMcv)Z*I!}刚4Nx89a̴:W-ݧG\ +70G%ܲu2CP;iC303 IO#2N#?ln٢m'§„֪J"$@*^5+~:qi&9BFTRppP^<)QA{>Ϩ !gWqI`ʣ`[6+GDs[]{%$wJbIa9Wע|z[֑լ+kWN$٠q;c/_;QfFd{r{ z}GgUHVZ㾑~HS9VNF}SԀ9|(˚x'uQhzQS*4BJV( ƋXT'wƲ䙋'_z rMK@@ y9/3]%Z! RK %bqh|Ke>6Ǝ׎0}I>1Ieyvu'l*2"VX<*݃j$~|/*wϙwf9nJ~`p"|a x~ /xnxɳRrb>?7δ=w0lEղlj|Ѕ5Z=p<\rAGK<^V:E{)§ #}̤bhdM :[jxr, |h**nD:ØyS$!h4hN>9(Sw^pi/mR1u@^SƬ#V4Oj :wWb3!.;:`Vŝ80H際aG:e~(&d|nhhpe\hؾ4:\~h=BU=]oUc |>x60tGmXzޞ1%ϻ>L5nLϋkK]}A3%=B&GIT2D_j3i<6K} HS<}+t $EDP:~5X8]EY&XT忀pTj̺#]R#Q{v8r+v>ă1C5IԈ-{ijȱyFZ l AFW}B*nr[lX޹,ڍ2Ug@$ҸD &z67|.N,QʋyM.h{ئۅ'Z89t[0_,Ӧ]"fdZDhy[ʙ p[k]x6L.ڟu>*+ 'Ml\AjӌZ6O)7ӁEOJ濷vU;}Ek7[ޖb_\A7mnцta{ XQ02J 8fuc"5:CCjLi?l"YŝFQˢׁYS$E^J~23^]4lZNaPcwK`xcǶ$ sa`@qYϩBHgaF^tN]]}b3է99i; |{&{Թ˂[0l$xHc?g6ŨP)‡;"Y+bFvr]ot1:>" ԋ>PSQDatfWLMQJ)t'U:1sݷ% s,5 W}Bu < )*"dʻbf&߷!(Yj:V.5 CiL`DzKp|[,mBPnV2u]8\駃B*"0-N&5+I^)`K$@H1Wa#Z^+i2|ךu1D)ң۱l/=µ$$l/;ɽݹh D*y~}N0T7R8,0jQim:0s?}\,|i_uJ?z-~L!Iȷ8Zuۼ/xX6C{ Aק~sihϋgUgEFx|Y֢aCn5i `톼%V#y9D AILBB$Т,MDDyxBNFpFOE띅GsE?=NW7<3|ydM#cɑjRjEBv?lKe:M{ sXv-HJ\Raơ("Pl~Kg}$+8!C%= d26sJ z id4!8Ւgz݊G0U=uENxzVy:`3CldK2} BG7< ݴ'"a8r>ɽp\N{kqJ K|Zt/9ز藰&bV 62!(:zksw <-4{Քkŀm+˖F{(/r;ms$I^6ohcuEpeyAK9w_ksVXǨPէ"mDCFҝ&jJ,D><&TKמ4 Ce.w1['ھ B+xs[!ψ,=N5#Y-+!U.ۆB!4^i07\>"WH!&xbo]{%")ĴQ ÊUJSr!b?5юӖL2B\?\.er[7@l,4,vH2twZ}g%2Aϐ]aغ22a6THm Ds$TߕsTQ-N. 2d˯|+P&Qa8 }dlgJ^$ƿ57:>by,>{6Jy0Z?%uD|<DS1.Ab]QMzcg X<50%m2n>տVR1sTW8/Yv`a(k9JpV=7ЩV+Q6FѺԓ%+,vr|N52T#ђc@xd| |čB# zz@I?ڏjd/7վU/ 5[aq[0Lɡ }sp^r::|Į:@De {_<|+Y0ZZq`p)1XW!) o <RWp]Fix$pX'wW/ٺd6HdGSbOn/.qe v4Ϣ]=mQgI$R?G9zPr2c}G!HkF?K D6G$epFSi*Q#)JO? tنڎVz MȌťa%9Z}qz̗(oTk,?N)ԎGX@AkQ݀ 0v$桐> Khhd+}1͹9w~HBwW`6j Qń%hevbfJ?v{ZR*Z]%D?BôHOUVEPqe'IbJ"12> Sygs",.1P0cd̬^ܴΒF*w߹RSP-?1bT4Պ&:#oWB%RpT w(s)nm4/Mv.mMAzVWܿΐQZ@\X < Bk W ;EϯHU) 5t'#pY2׻U2F8.'QnR2TLjl_7B(wk 52޾/RP-2iVaL-. GAeܪ{xמ_Z}mGa༼s4 ǰyD qOFVJ3LYKz(}r,8!8$U_5[i99-!ö dhͫKdDyGO=D}U+[ڷRLF@\8@bC0R ʨ*şIqk/[Y-?wlB('af("Odq\佟`\S0׮E`sA dw͐ DV5\c1eDQHen r0k0ޛ> EPQ g_kE8Ey KU(72[O,j;'.: ĤșbJCR.s`՜~b4)f hzU MA6jH{'p]1*`ʺW ,9,jg즎@P: iOZ+U~♭U^TGL:qygpk`,toK1Sq Q- I"Cf<ќێ^*guP8`p"زwNj׬Q-Nxnc=qYw\Vy>u歕 *O;)EIjjja-چmy1 ĝdpM7Մ `o%FbjN g=_ V$IP.AbGHBa#;c"5)Z.ډb&!=nsډӖ훹M _DI $QVѷJ%n'Q;<(E_@D!WGM|.6ZX8sgb1&=?K\Zyj̊u2kyk!ĸJ j[c~>iuyy ^d4?us7n.4\gpwhWn3?F<~>%u%[ٻ0_}).6,"MkhsWwq7_h{=wb_.|PG1ٓ+Π4@Bր77UJ4.EP$q(pcy&FTal_jg_P|O7u- x(gY4~:0 v<3YBiƵ$1ܿ<dQhl!՞HIn{  ?}gՠ7bN $N$9VK#kFxO2'$,u"=,T=0N4bB6c˛49?zNm_5д04 D;b/ Q !O*;MfkG7m{,(0AIK-9m:#cf@&[_c /TW . AlUW@TZ@kdV3"Ts7hRq&;d~1H"-73Z ݷK=8*V]:xǝ{ڈ*-\8WmrG SEC֊fkpgR;^cq5LgӔ׏JaYcb+fp{dlēx64\(ބ_SKHiGЧzVfQ9 }83 `}Hr\7.]0Q 2mc Z÷8﮷~#2v΃"obI_ڒ#)kZbR"^c|O t=}.Nu%ЋT璒ihKƣX|QrAW6yk9)+1eB0͹qf@_̝)eHrYKSESĴa6%-Z&ud҄E|W_oݒzGke8{S)4Zlj_mOƂU'" dnZ>M_h=hC#i<#GնDBE/?EPF31Q{QgUx֭fWهk\*'yflbpLRm=xC W$[R~sڊ|\MRnRE.ҩ3lGN\l)Vyas>nP wyX&׳A8؟$؞ m(\ ~/Zm (4Or?@xv9.h&%g9&3/L8f f1ym+2Ӈ׋)bM6`%-thr6+Rw)i-%T&I"_?bYdqѴ)Qg,xmFl]ijO2`֠^!Z+N-J`H=*\Fz9^^0KAle[&.,mEPJo'lޱ[&'1r'6-dni4b#ca@v p,|iX%YVO dAera؏ QjꄵJ",_C _; GS|`8+J\(;3PټNl[DT']5h}0|x "'8H lL̵2.iAzQ#TO6 Gu~Na"{|a:~,>9(l* :,Q6^[MYj4m'9jD6܃tYIɘ 'yV`ZnxP|@,EQaT+E2\XWx5-*0+{6!qWMmE^$8=E [<oNuwu:Y?kgRi'AE羶V]jߤɸ6qˇV"Ҙ5}t >P|F@4(0UHx48 亙xZɀ?څV7pm ɟX<{hOM.do GSlQ-ę[酜 PPֽSMVeզY+F q?"+6?ca!Maܝ2OO-ĝ\ k'kWQ+ފNj?$XF.,6!T̓㷿5AK۬;܄!؞ӧ4ؖR6DA?1(֠+i%J\ >bDMzwbK\;A 20ˆGȄv(_ z & bꥐQM 9+&"w&w0M (kY[~g)*YIuΐi,%rO LeVUJf Fo3eȨ\[? i\t4:3jP=N 8OzŬ)CR,&Cm F0G#!ŅkPLDeu0qUu>ol'ī;|DfRJqekaYXmNz42һ[jA8yPK=,{C\^Mp3474ws\mʴvk>݋j(rF %l T2X$X}z'ꢈ-FLW޾MOm914z]dQ*fSXRCǯ?]I.$o 6b4/0O381$ (9q|t#[D.*G%F["~ 2 rQ3z֤0` x{{_2]\ gaSFg}"8_*iCot-۬^]T 70muڵjAj1TH#ATd< *-w+NF)]a8{|0&d | x]~l#[ZZҔv\}J_Զ-Igh6ۅ=rĺ$bcW8^.Zͥ(ޚg2'CwV'BX-Jə:(L $ eF7 *钾#!e '-`)0 zPz!]zBuݠ㩄F∫-W&>2R4)$N38TdD6҄X^ڻ ze'u \) C?;DY ]9F W)yzQ(7kߐ ZS!gГmޞn"CU|QڷFN婮b[EXe4ҭPgutF,Bj 2lLj9W^vs!9gG I:`r>K֍IW!ϴ w϶5zAbDbDJ৉4ڸ9v@T-51hjůO26z!k S oSʖ} +8k o$T)хLA%5*e2 mYyɾT~mFq&`s_Ί;JByM]|pXzMtb,~i&U4EPeWc÷deqD.&nzk;\HG-PDa<]p0WhM0F]i8h-> stream xڍP-w NCpo,hX=k.=  w;3_^u}ڧZ*uV13; d+88^qppjXA?Z G'+; cLlh9 WC;G@ g9Ҋٻ;ZYXB`0eyYpقL!Ec%91ngjW7P;+0# j P9]@fmA4ƆJ аrSngu5v`+Sbr<*A?4`5 wlljjgko qX̭  064;=[M ( % 0~LNlNV3ߟOefc+J*K3ߪoy /QT_Yb]}߱ 0Cpn?gQ/z? /3_W{j\WEje; =D+')+7O)``+H`rpyLm g>=/ڙ.Nn;?#n'y @n0>9O^oџ.7} `qA:]o`7q?g0? Jis.Anտs?9wvCg7_Q???0O^-~.`Cq|.Z?ktSC]K@yO nUWz!s"Sk8Zt[Ze8 Pd)j␎wZ(M|!o+"7 ٮ"D~#ǪV6SߥU 0㪙na$OV KW)ڳZZDnH]a\ɳHւ}XFJNYLxlW'W̏rvͧiO/ t!iU3H{Vxai = qhG~F <}K2 7O{?\SB+kޗo$a(MRJ iF6QEJ:1VXvt y/:/m~\FX C3{j5 EN&9ÛF~^]s;҄imnxo]h:d@,ЄV?n%ق:;mqP6e1,nIf#eϺÃXvjq_<֮u<:MGzf꣠DҬ؜q r#g^ {3G?lf@y$8%,&]cy38G?n5܎ !'.&YG=!(Z?wvʰ(*_yM^r@3tӾŌj/oeԤCEJ g9kqr$ޛqDmxdͻ:CrE 15!OX5F$ϴxuA3Oƙu{䷖/*b5QИnm ߐ:}bE-Ic㺴N%"nT6ljػDI&"QF-bѤ|:b6ovW myIO nIC<\k0tRċVF(Q8}_9=q;KTҋl[މͿۘ&D<4e8 v#ɝg&8u{\VS 9T0a2 HKMpݏmBYQ5 g3bo鏽 L7]8` zÒ ׮h]j%$[ɺ} x>N0_c`I";=n[ %!#C>2%#G;|pLXU 5wl)=8LlI`5"6tSmr99\g߻-ߑgqo5F5S ^NrTblf[nwB;=T>6K[$||$qSygۧyۯK!y`S@Mg}Nf5TA#}aF4 :[qu2TYbY '6g1_b&{iy;uW [Ş ]1Uң? x'X*l6%xKxeIĒgA畞_rDFYU.5VhYI"yԩof$ܿ֡+* J.qv{xabݭos#0??k 3>6ԾBrS:5gU,FN_lIaMy$1??h&C-J% o0*Z/?ƯODz1W@[뭕y{2̷lTj({ īw;ѰcYk(o:|l&9+Ɉ/lcnxf$yŷjo},ʀ-;0cs%'V/WCG]/v*jFRݪ9@ֈ$~_w)B #$?62ynR7'!Ý|P4pb5?LMZhOozOiMk.ӑW S<ƥ¨.^Կaa~k՜/9UcXke"B# e5#__,L/3o]%QYmW`*?ghYͰAC3B @j۬XQl%Qv+Lc&.n(O]њnF7c\Rh_ RS h#OcƏf?ފ;^qȵW+M@t mI=qbk7@&񡴒UYXd|c5iCOD_֊T%vZC?Yl+w7Mo3|:W{'f;XʤA sb‘O 6]y(gZ<7ZJb̓-y"kD)Xs}GZ1Hy&"^C]U~z3{(w,2 S$Ĺr5?G[ !_-[HdX }UDMifArVԿBo s2b VzF(EMˤwGIJ'ylv#>`QjtH\d-kp7NN0H%y)V;yC gȪckp~b'!#,d%&`k !Go' o?hZtuxDV&g^qVqKc/[E7oy,CԱ輏Fҹ:{"2ի*L\FScaxlf`;lɰظz X^Rb%b_*4YiXEDtK:Af#PAbln6P9cb>F r0~,܅(XThF~]d !+ԡڔn'}?߼v&f)XmsyѰ{e4,)=Z"vj"˩.9Mz ])[YNZ5߻r!>Ӊ5(A"skNb.~tw2/DŽKAWkfѧIE:ќXՊ?lrFx98ж {_dR++$N#Z(c-jZ9͛X{V$ϥqaN޵(SE8gs^EryGeX~,nCW]>:hE0)n 潹?UyKR.^ar2Vk-!y"1߫ћq{IOMMF,="|ăJ]oZ| ACewRA)-l cC\k v=mK0Oi{#49((S2IbuB(Bxf"]c ^x i û%XwJ^}.". KpU2NCi+#}~fR"8};msr7#i^Cv_ظNFSK0m4Ns6Lv[i~{xhTb" weB2qd9`o-VT:<:N~V6o V%BT[m!E“$M6HpqV]Ά?׭K.eU#1Vtu=I U`|;e? )t`ȋBZVFPv򪀤@pT2j8>w5!KrɾG牆FIB))v4,eX;0k-L+r; Ό2oC 1[N2ȜGsB?FDQ4Dcj}h&/}c0Iovgõ{EUq0`M>JДUoV֪E]O7 yeo61S \ 0eaE*Tϝlq`_|WB/lH.zxtSSԽLQq}* P"sAaUԛ(ut7hYR4Ih&/2])vn!6Cq`wT˕jo1tpi6 =>x$ M{CӹBu(CHE% "?_s^cиj!b!]"1>,8'2T?7VĨ Kn7r -]b^2 ۢā4ֈ캅"X,"’6mMf yح d4} od9^k|9{H2X;I] 7C@2RR( 9Փ7xDzLu^]V 0G׼xm; (3eP?3 ?5i|ӑۑ8w颪׸ɴkQC ]6:mqe_Y|ӦU;F7j92))͓y)O [ŗEY놃Xd[٥؂`‚*Q1[]y;cXd4T'q]Uada`XRj=ytֺean+'(BٕA(ύI&[HlX8JL4͝b ҽc :&_ "rdJ%JNIM\>K#(E5+KGWj]Oѫh&t'QfwHS} Fz&7H04iz&2&out\Ɨ_SJGʣ5ljuYE{wp3`WW~"F0-a$-u._2[I Gsunƫwg#3Pg hʗ.JkDU͢SizbXx*M8ftι{oF 锉m4RmI::\I-HT/9/hu; (EPnQ5FҜ:x2J:WW߆d񰨩 9t3IӾ&HYTX8yJ  iL+hsG/iݭ;YTͩY_ ʷ#RFݚ?YɖY? !\͂ioBKvF :4cڵ"|ui{V$n1Fa*iEߍ˫ф#>!O|Lnld\ۛtev,s;Y7S=;Li8e.M;?SloF oNBiqȞ0&+>p$y6*-oKZ Q; $l3Hh6G,,t_Tb5DW&B9\~ Vs~?C9I!EȽM`X?`֛k'EL#~a.޵(G`zѝQPh]eTJvo 7Ld*9{a.ze#w|Wi^'?v*:g\{*îDIc_(MP6.j}ڴNlVbn3 PvT$)}XJ@a {QW ~ Y0N#J j# Ԥ A24quZ!+- W)5(ϴUQ,;!PCL@l$ɺ|dcM =+]? l K> \@S6V"qŰIש}9@+CLbkXahTT yZ;YK·?c[Zr֩TCSף{+{ҡ+`m*qaѣw/}e֪dղy<${FtKh Vŕ[yJJRcoˋ_f- bH\_ϙ5M1V_4bzەᝤ>|~*@|F}(pnyo:-SsT/c48ii"S$j\c3diOs~6<A& F8Άgl㲲mjBCFAw*vCkfF7%H>qxjm c`oW4`gmqef OY'ckxëO0'YzZR<೴fm`2GUcU0\SZHJ?ܩY0or83%C_ʲJ,j&_r)yt7CX3 |we4ث垭ӗY4?л;c]8jj|W W?)`ؿ2d' "A=5)7UVi߾i㟴{Q6HjM϶&~vvO;Ocb\NFhlZH$4".&WBh@8>4>zU'n0`=x2m3nwv-^]VDx }:-E>vqK' 7DGin}7/(}*3G/1D~RF_R﹉:G"iu$A&|\|KMf[ipHfsh?`#/ )[Y%٢4 okx6>BO=$9ҕn>l$w5;+y{,ߖD}oѨ T/t !|7X}sنʦ[`c/x>/s9UY;Dz5\zW҃ wu#>TM)w ά?k&Yr 뺯Hl+|**5H]փ%IkRM\A jJSk=>0^-;Oپ~q}ye^ [e&Ă3`Fd;2b领5C= \XFTk.x/czܕ@նΞLuG->#ˊQk䄪_ϩwI%0=3lh?E٨\bJmc_x~S(՗_I짞;eRWEr͆Ѱ{ 3dTX ;f8?'Rί˥YeTY(;KbڌQp.M%RU].}NGm1r,'6:R8 "U%56tVN_U` v!.O!s@ܝuS}6D|$Qi)5 endstream endobj 403 0 obj << /Length1 1754 /Length2 11136 /Length3 0 /Length 12250 /Filter /FlateDecode >> stream xڍP Bqk (ŝ"$;w"hqww(.ŝK;I~ZϲwN2$SRa@@P#+ @T^E†LI vGLC!|0D@21Cg<qXXXXl,,!BbN`<@ #SBm\fq1r3eZƆ99@j 9 s>ffggg&Ck{&-`Pك@&% AƄL P5P:8ځ+1bl1T6 d _wXvelhl 1!fS(!0&ZC VFτR7H? +>{c;==w̿<8Djm 8#O l2~>wWk :CLe80A i8"ef ' 7/d 3jK[\ `\l z@v7tA*!L#g1o; @yX,_}{0(__-fVTVS""P;#~~_?JVb 9'ef/4. 'qߔ:7# G+4`+ϓ]_ՕVyfe[ Lrf w̿T߰c]c"?qY, PgsSrqE#.7 Y_ `=3x̆"^3zd6=[Av _s< l3e0c`>k/| f9 999%>N?Jx;=nmsJA 1 Ԙ?2ƙq{<QcKi烟{n}G[S&GJ|u+SM1,{9Gmm!&fx'Η“ g{TOkP_F!𰣾 hT'Zٟ Kݦ qn.1S^ %vr~LRnuG]6ϐ;:?Ьx c@և4i*ⴳo[\Iq4X+CTRj ^ pЫ`@9i~_JW;X4:1 VN ea&E:%mP.rT9%6#~ QDF}!FKWMDd8\ҔVYǐhzϵJ qh\< ׫Ϡnn&jk W7-Z(?ul4u:\"oh7.ԧ̎@lmtlV9Te%F+F6h6y&|*V5|v"Zi"Xo}9p+du-B/~2I"Jzڮ%Ce\Z\AQ9gupJsCp8omɣI{kޤD yum\eN2ʴ(4ɤGeB6M'Hr]M]0Q;HՑlNG8Ѐ>9D#Y>5c˴mfn+?Y{dI8=ϧ~4)C8 Z\2dzUUx|#TÊǐ? ۄ#i1E\dc^;׋rVx赯cm~r)5u1*35fJ9x{2'$}v$2>nZ5cd:/E"X Ap16@O,v*^0" /qκͩpJ.DBȄ_Hdчc/7p\.}x\}%ZU"dD~wj)5Or/_7fݶ"uOԿPϯޭZt :TLI ? 2k4YPH@K2a/Gx[Z 'X))˲dl'%M>6>3.x(sp)`VЕ Iz[LmHrkTѫnҘĊqtzML{.Y窘{{p1{{Syp 1YjZl9n848{Z\#GkH8ȏڤ\xۉꭏޕqncZ9G(dch2wHv+tB5TG| ggǏ4 Jup,H`*^GV[E: 72BOX_/UP_;Dk^1L OHmަ* *b( jzjw~f=胁t^xH8HR@e\"1h/HB(]#}Q#XvxI[އgDAn@&Fiee2 Λ9Fjjhө!F{Y=OT^E[w!-ŏG~H{fشOL r@:7].iX!a~V◫IئgQ2?u݉`\ EHIXmD ƆL(jEib $XSuouVOJ8KFD8 x"JZ +';OūK! Ԫ/Bqty<6V q@,&b3/G`3~ ݩIͳmJЫ|xN^Ҥy9k5u}t,ոCV< h,3cA=mV1@؃7>w|59rٮ$*O8H"5)&lhFx>M/jټte[ 6^1ëC.z9Yđ3JH^mWJWRsT5.E/ G_Rz(=/[@]v hF:oyrB' {.El/|eGeRmWk䶹 P4=te͓[=3rMIb/x%CNChVcl,y=GAUa!Akq>(4(,t> OCU֕ lѽY pEBl9mwAR,Yم8/7Qh9".azy:Y3v~W" `TWx3!;dctzn +qh?WU[wGk.~n <@_kp(r hAk}ךD4R|P Íe7j~)ٜybk)JT~iH#OsZ&VD$3@P2NRT(S`YA"\0Xy(d'"5_à Tr&=Ci+E3X)BfB5sQqDLYK0{1VZe JfQ^_(1hoPCQB&0dRHFZ,C&bs2MӝA:,yEv{.cɋ} eS1;~lӅޚ >-lTB-\hd7Db!Yl鬨.yM7^}VǑ AU.)W?Mۜ?ϚG8 DtI+6#y3/Υ9V)ȴ.({up(ލJ1mj=BO/aFfu(ʛ0%ahCGkb'W'ĺ6-KtѾkb sy'nZ6#OUNМ 3'JeЯ+>݉ۃ (>k%UPkM8V^_fl!XZ6jsAa^](-ƲzǠKZ STX?mE̘oS;6ЎԿSce  ¸rrzєFY|<ؽ{ vFrsRw=D A˸6tj49~7<2/YOjDlYW;d$R"{`E2s՚)zic#1%Usǎ؏Ie&Z/#r;oG9z:UlA{ d]4MCy*tXZfT~—~O"\! ~,c\9Q!;ox7Ǣ2^ 3%S6C|q>y-c:w^tOUqSi ZxmM+S.*GJ vb2 b̍ؑ =E+ Xjszn)1)>]^heoAٹFn]01csfM.|ag/ODC^/jxm#`;L[>{]`'"z}Y)Sp1ەͷ)G)w,9|2]sFWt[1F$FVK'vէ rOƀcD,_ Rtx^z] 'u evl⨅ bݔ;d֡ C,BpG AƂuk-iv^={$o鰔^:5NvzqFu:z&Ċ&@H:s,D1kI|e;G.F%ldͱF[l9!fz|c!0PhڦqޘB"2i{C(f$#\U..q  ˍtf68mO@ˠ-; Xuv+} I|_)KԧeR.9 z$Gf> ~bp3cY& 6ǔ}W.+73^gF`GQŲ pjpOɸ^(K<w"XiIuIvgPWy*{0N}A] T䵑y{矒e[:ݞ$a>313tJw5ǻotǦsuU.3 ~>|v+\S|6h9N}Mw?^" 8!]m_U-tYTGTp󻣼x?Ae& _[\q-`]b˭fE?+v#od/Wͫb>`.lO7p B#e2KF QFifF0 %j\w2Aܾ$0%T9*eeU586׳9!{H㒵qIS}Nx#X*S^ 㶌\&ž||8ab8Ve0jM&V1CyCq#s%oP{I\2T[E2XǢEe"5{9.뜐\x6|&7EGplfq| E?2J ~#mIrsl*V@*E'ӏ/IӟfOH %'h$pMb +%ӾXl?MnmiC)?7S2s<+N P#f,k<ʄՊNT^Wd2m!sp`0xq@A5Ss_TmNEһVH@l*۳0,%QDwzx<U>d~ltXFO ~с,-8(yl*$\TSݝy`K5*y'QE4ǂrD>GWFCb]䤙ʌin~v ۇv \W111Ɉifq{$S6p¥O;F¶@k#Z)jOb_9w~}T&`$d'_vl/VnjJz`YHvCUtaN(~`~3oL^(~ @Z'T0d)"~yRrU(#ڽÞC, ͬT Ue8R .'fkR>ݫM?| y%lz\5&0b4:fVeM:@ 37pGmLg(-U~i`~A2S⴦dV4J$K㯓 B;8i~Q^R!˘BF-fWS)9`DQLD aଵs-䇴b'бO5O/'?goE!CH1:Y+n#%;CF_IS nHZvy&9$H£NWiôKd=Ĩ 6 | -uSa5鸵rPꡁȉH~g}`|M)8"ͧ+J-XR?.:֝S %.G'G'CHJs3XS;ف]y rvsg${ՐpԉL{D^;Za/73j} O-{|{a\DMuP+K񛕇gLlpm=/wI/=iOt%F>Nw*e]yq\Jw=%zZ?Kk;_ Ê20Ga)DnB0`DmN_ &mf='3?3òt:,JPΑ̅4;ۜr ?:ծA+>3R@o! zlbLrl;%:.#?8˼6`[\lɍ8R9]lXqzJHw>bzy)ԏJlc@onj'k$Bk. "+'sRzt ua{tz #n9yj}4g.@\]9D*tU)/O!f}E`PQ.}Ej ʝ3з<A2Po*_8&K-;\YO4f~=^v_vuf'\_&a ;|=8P X?P!(}Vf>$M*![\sEe?8D[6ZFlҐ(])ad3 F&t{~_rzwܞ0)8<- ;/R,V? ie[mM& xywgW}2_k>uzBzxa} vkIS]8Ϙ13m+mҕ(|E ѷ8. vo@RǜLSBؑw]7^opCe(5M/.azT慲ٰ^'*HXiQZו(M?;L.fH\̼ a0fq_CCIOɒ27s]oQplP^c5؋]P$Q;mO?D3HLS-ga p0J*-\'bAF{0wz"(7`ʲwJ9!F%j@54GhWU.Pz _Lύ= {F=%`%Thsz/cߗb,~M'|}xqG /^ojFbO Js,,kn}'=x6c]+i}z zd#Q:6?Ҹ)_wAy1Ȉv {r.>'I9(Tn o`>=SfɜhEa]?'3aѲ"<^^ZY_`Qex+תZ!_ʼiV1L2n2mb~GgyI,Nd~L?cc*y'@9,z&ȣ7R9{gKU 7  #'gJ`z;"懘jOa5֙GB^qRQ.^E2l~xTܔSR#ɰL%=ny VWƽm޽ ž|+˶v@Tí 0s1{Ƃ h\7mC_fߑwI?V]z '`N[pO"U( Ѹ /W$ άS& Sip^秲2_չJjQB8S#x6Qk(n<LjN4(Zv5߭`*0QPϖ7ԏ4 L\eufBtQ;N妹~B9z:nOQT2؞])eI9 -:'EwR40.xawLk)hU%S㢐'bsƨ"ϷDIn#;)>l ߅]\oI1cءP̘(~@S *~`W2e[U9bhIA USwq!e$R,34}L-; V5/UGBXB׸jF㪚P./qkŗ-pwta`Wbq$-:Ps]B U{> TJͮ*[)1n"ՙ_e6 wwE \.rd6H~_#aS_zᰒѮ(c]|' ׼-RbT׸+tÉ퇖829bm)QЅ hVč1^չjeDŽ8NBät#]Lnb endstream endobj 302 0 obj << /Type /ObjStm /N 100 /First 903 /Length 4863 /Filter /FlateDecode >> stream x\Ys7~篘ǸRܗ˵J|Evlg]~#1E*1$(SzkS uG']B'S(i c4>]aSg*SE0R "D#>c=#S QPFKt:FB$:tˆ-TTxIZ^3 IozFy倎KAZc11+"18ՠ>o` 6}#lI fb`IUX)UF0xt-/ZXiyiC{b$6N;\K:SXa?#Y8Rӛ"m,GUluMň4ЉK>W$)Q 򖴊]B58M@9 bPz<2OHhQ&"ڤHE[lxjCJgeR4XO  udzM$';L"Gl]SGR@"Md fRA"@8IDc;rl$ AYW_OBǓ'^?4p'LzN"V{X]|Qu)ީKMLi.SQNq~!^դ{aS˽7󦞞Tw'=So=ws.Ne\PzK.)GNۗ;ZƤW\FYJ6{ X B1!Hl]d=Jɸa"OxF>HiRvJz,H kkܰ aA} cb:鿬aB{XWxnQ73JH49̧zƩփa``pɕaK\er64K,-wޝU3.~ػ*D8s;M6#<9(MaV<7;)=,v YlpT=:g^jx\>Ͱ_Od0q ARbwbweCl\olz7<iQ}ؐfCq4>բ#XD8O(D3 jqR0A)U[̆3Q6PLðQJɅZkp:;bO"^9'ϟYS5jv 9ɸs1Yvs=sau# ti)k2hu  ZJ8ڊV#2ߊVEhnW9ְSHe$PÌ 7Emq\/)Kb=tWoIZQlrؔ(lce¡'C Lj7~T* %PxbB>yN'͙ԤHLBp:a|Rg|U3`V`%kAVz㷡8o^[@ck:mKߊpW].-ʌjA2A_PK?Ѩeh8M#+㙆Vy}~'6ud.ZݙEߺh9YyBoq hԷ9鳥?G,P*Vo&.4uA[uRʖ=HxVo5yUՃgC$?W]9:,v 'Ҵgy]3:x=hRSRc"!AxI"i, /z~WQҀA ҧA##KX"m|#LL)QX6zҚE'-ﬧlF̛CI[[C%<_3bUE?5cxX<@, Ĥa8CZ [`(v&sw۴JriW'ݽןM]6Qq{$ۡ )2s,Un`""3D`۶+B9Z WOrl >cuQEI P 5J3xF%X L,ma=wXE2~{Vc1uWmW6oYtj]w:nrk+]t%< v졯>SPvDwֱӸ4,iW܏d_}8_S/ܚ7]C*;۵ꉎӽ\)2*ufK,Ps cic[fHfc,bF;X2,-ʁh(*D'"9/rB|6R2$>E#^`.Kxys^<8xLB-vm!}ji^rEEMݕHXњ`<-J?LBG Y9dp]* KME`w3r@\ӱ5mVn ˙9g˥. DuF4XUIދsKEn[ޱB4K[*J!|/ R#C{|} \X+(pMK?,Uǁ&pc=U=E&]lQ W22ib-a ]K3:q+9vŞ$q٦Va{Icc>Qq /L!haKLݱ PKRFCk4[78ۦt.Ţ\pXGצiͧ5e6 ؟r?t\?#u B+!+ _bs8ǗY]wYVr.OWhzqϺ0.pYڶ6tXl,{!Zln'L2_?dq@6x|ss׳勳kt{?6iPhVL_]͑.ޙ k֞حNã( څUpFhTXeSB'޶?8bG<x$T*h2՛rUġ8< S-Gp2#q,11Td b&f/Ey",?kM5ogIo7Vѧn*qJIKt.xox~(/!+z-ʮx#yp6td3+l~r¯Qu5_u)U׿=O7IiAa7h.3]]4荒>gWGɇA%N >[iæ;HWcօP m-i"65a0waa%m5nҔΉw%,F4Wna.o>2Wkk~͋l[Eu[ >t5}d:d-+0#Mq >mtƜzO~ȟ9?4M'I:Ϊ񠓞C_A5;89F7#w\zl2HˤpܛmP_JLi[rEP6U|MW|r/6@y+&~i6GPB-3ݺX[gteޣOY&x> stream xڌvuT[. FSrӰNAB@Ks}{1g3c͹~LIQd 932UXY,,L,,lHTTj6$* %Ȏ1G3X&n 6d]lV.>Vn> Fy&,D%p4pG4&V^^n"@GK#; 2:{{ gg{>ff777&#['& -t:M P0[@* l,MvN`';S#*#Pc,?2K￈,v621yXڙ,mEI9&gwg_F6N 1"#pى*7ZT dk svB+?qKG 7635S{fu;K"2s3|@Ă juxكfR>f@$/'#W ++` 4C)pt貀ϿdgfVSբ w#  7U '_p'g \ 4]{v _,stۂL/ #[K؀G RoSM?[,4tZg#ZؙG;T1GX@N]5FV5:qO* x; c9:y  ^NS `f9] }f G,`bY70KY̒+Y7b0KFfO7ǓE<JS7sFf\o#hx:+85#'Kؘs%oW0 0v42?)p{m\`v}86؀4ܞ !dcd 8߉/hfg G cpp29Qsc1@pT? s3y࿮<Gpg:9@w Ȅ?ت>VЍqW.WRm&><2BqQ j]hyhxBn7k^.&x̷!P'L Ph&.X$Dy JUjS auI* hyq~TU惛g KCi|An>{[Յi8;/7*\nL]=ˢp7OW wrЉ8qɹ1E}{7`9t+D3b 韱e\4gyS=S )vaP-hFJ߾$Jr%|4hG~Mr@C&Qq d@uV6`[HtM?A9zasWBRM=yzpϤU_缷r#a\~>Ldяu]?P R ]DbrŴ,-  i4ON/kwNjdJ$z)ew& XzZAi(anw~u81`9 ;]?k%5e˓I$h6AԴ2&B˵?(fpbԨ/,j= hz4:}KTd].nPNfpluJ([$<ډ"Q9RϬEشӛoXbyNCH eҖ 𠜨o/'o!K@-=L֛*qlGc; o0*bLeXD@,*(#djufT %QKr|^7R{ sk"%ǪyM3>-+ő!th MZ>`fJGgwlJ%ZIc&O:Y,|(_ &ZqJL$j_c6d .i cIKV-d%9N5`|PӔo0rD[I&I^v=9xE >b K}ޤ׿qѥ>X{cqBmcMۛ鉑*2jb%IJg:~؂*7/|T;=SMMi#]ĉ4zX=vqѸ %u;j ,:zˎp_쓋 YeǤ{ '9cG!]q% OyEc=۷huA+r,Fbm3# S5YaՌ)?bմ֏@!^o^6 >49@x.PϧqkV vrV2QL ZP,akB0${hxM q5:[As o@eKRSㅲVgv>^:]XwvN y򺴸@5[ρ1:ÂD 8D+o[:gi]9K}eYOeuX4&TTc#$AO n\p n͙w!At%ZX ϳ^s7M#پl( MZ)몙0[!rvٹv8t`ڽ-EU|zb'Ws[6_uk |ibtvyܾ8e74I/V;{پ:&oNJ]CKgR!&lu)/ܷ9ҳ=)*hg1'97H~A;Ghc]C  xF8Q +zR$W w91dPv*2Tns*z[s9Hs#gWu1XC*nZP2wFN-`N΍ɞb;2tZ@ "C#"yW‘P"eJ~bӀx3潓<i`!::D7sjN]≬//o1 ~v&nDF2 FW#ytBk ^/8i$t29;E  ґ{zEFG4yZ( THw:C! ic(m`R!O1NҮr(4nA&^Fkt{ TDW֒>0_H }`@Row@o$ˤ [WE5Gjş/8ʤ]F/ ُ^=OSD 2(0L BjBF9_ VՉo?ԿY?'b &x|MEUΚ tnRl ėkjDA{qNXv~2uENI_⟀{Sw$4ʎ'ieshIIgΘa'HdPv>X9Hi='ktRGp9a֡6H=߉hceŽV lwq*U?N5_/kP`t;]БoؿiϞ<S*a^دMߋXjZJ9Brq6) [0p,/Q ^ `"dWT)SȩHS.+ Ǟu.!= mLF .ؾitmTXQs5),$zv0<j;F*t jHI%@rl:9ton<],}PlK'^:Ʋlm] sl0] ri=kb+Rg3n";;+"hBx +jZ (mh F=6͋nHp. KAO*/sW W[@8ٹa<?wiuX&cd'ʓ8AT24שj/pgm^~|aPVdh ,ıO6hi/<t ?&]ZDzOQ.Qj2_c <,vUMmlS>8q^u.C9pi{VyBoңӺu Sv;p'^öy#?` ry}oDƂhw|mh7sUĖ׃RrN@|ja: d&̆iTudę;AFل*a$xIs]Hd!w^jgMZxul˥c /0U2XʜCA7/1EL=1SAa5l*=%_Xt>Ι{hzׄZFH2 3 BX2DR*(|F~&WY_j3*of!P'C*4`)-ٯs} s9sF9Lܰ+jb5旦+i,j̳T“>;MG& [ {ϱ^d4Uce!"#P3Z//}N(hs!K:-ݔW[,$Ό49k\MyR̛ﻨl ˚jhLB<T2iT-_fj8ivr\bw^PP<55im)aFڨRA{:xl6bϗ }B%Źz#ܼqz%| [E[Ywt.ݶp wȱZ(Ғ129⁁C"M'gH%%,.xGhS(JUX٦4}ƒMi{|9ᕪg];. n< ci^u128tnaO.kjD*TI\W=8nGRC[I'VLLG=Dr"#τ~ ͫ'?*`+QOxxLB%ƷLïBLqrZ6&{IQk7*@DnHP;Q._qFUJU"{Xlj5ܐ+bkص%j1tF-UzH~5Mq8u0`KA{.uY7&Cv ^͸/ِם 'Z)PA1taL $41yڽT(2lWbI$_>˹VTֈDES#9" "CŪ: )*.6T-\1vTؤnZ]{QVXuNy9p1Ȑ1SJm/ Y1;\Z؆e8O,cXsȏRSL[9(^AZ B>c-4;ƾ9P)Q\/ U@E_s!z;:]$8_Zj=CaLsj __ߦ0:]9>P#H[Q>*}-ȅǵB)1oW_6۬9'}M67YpŧZӮI=;B]~@N%Wb,ڻs4J[c}-ޯN5 V0TF.%|v*WDɛmC0~2s*)ڭ_csl)8H)8%]o>A{Xr(F ٜ_i)&F "9St^f>L M_Ϧ;d˲P".8a z!u˙.Bv}chsx 6VSVXOGm^Q.?N[ lt/]|%-y9o{ݲ&]ZUQHK jpB^kN;sM[ /įt~BfVM!]ސ.eQ6Ukԇe\i,kcoܹ_lgu9cIgdmHhSpΛC&_vW3iGN}KZ뭔zLSGCv r5jrSDŽqAʃ3_خftP{?GY)LpVkH]dڎ[%sxR'Dy/mmW<€^Sz~[ w(q9hcZ~,WI"Nv)r0qo璡&:| CQ}C|U1V)8Dž{%Ƨlupm.m`ZP"8ԍ&ͪűBQ& j̶KSfsH͂޵;spi(cYJ;(i1q"بz˾Q^w }_|>4KMBC-'un^5)D [00m|'~UJp7T% LQF]t']KID^(=){\;ڞVcх.'g1thZldq'Q_p堇wP/)BgT[77Nes$ )oMkkhaK(%sxt$PBҿz1x׬"~Ι w6$&=Ԁ9ro!U"^x@ظN!hB?L21/K)B)s3>9cW=Q*ժG#v&wU҃aCO)nɭU*`;s0SH_&z =]LeA>#D*&RKSez珘.+HJe8޼,'%CLC`>p|0DvW+`=A泥44~9>yJVikȠPU =kw##|0 ـ}-pv"m'zKmb7`<#-5g8LN?`-%2 3.l 8,s@\El O~r+ݕXEl}~`d?ij:ӑ'3YD֢LzrV؀AU1eEm(WĬb]+N\Pă=$Z"DM}bދxa Ue!OJ*hY[$WI3M==g<ƉnDdQWSlДoyn_s Wgnη^I#bVEz9xW.>"B_&`Wht TaPi%j ];Y\)#@j`Qһv6\ a2pPJU mXEo~VH#05 JfĘǷHy1ͺPg^/` WzIZ];*.AƋ!mIىy%mn#o>rd%YP9q{?ژ?qy2аݸ x_PT_q"Ljhn䠏 ͌R{[|NL7I 'ٺ[ 8Ju~ݏ}kPY%索 =a˶DvMk=Ljrʶ0S[ Ԯg9+k Pї&{)=,ȟ YY ct4-UZ$zhuў:Df?/N}yR\?O L#!눊Y1'dR~l=Z 4!qvW˭!4KL ܤ5(=~]1o|~くH 5X %{Bq:-S׽8vp Ꮳ87r(ifE}'7v!Q2*qئiPNH᩷#+ %L*"EF*!y W_¨yy)URԀ. LR4K% >ƾIiH Z:B gU&$}Jt'$w۱. 3ȋTڄgˡt_T|B&-"{Sb!\+1/{q9 g*ΫF^(kdner"-96aacwQuٴq̍V4e4I!pYp#D(PxW`y*籸ZEa *yhX<#$G#`@=AGEpfAI {Am!u-gI I2k NUtieڍ_ʫBT/,@jJe0qjKIB#x|>ED|C\ aHd 6Q ^L& SpŸLkmI뿜ۍ/kQ)穩D=!W*s;-WLP/gIF#v-X3nn+Sw/7v}B ľԻ;̡N4E;qޠ \UbڕQYݹN M/.oyvC; yd3 11AYYhK_G[9GXuhyMBڎ`u>n%sjPB:cj~Og/vp3_[̞ "Ь st|qd?.SP_o *K@v8aѤM™fy3G3u^Ƭ/?kxQP%Ѕd:4<`is׊k>Id!edre@jA P#3"/}/g#7d}xB =Q*JM˸ 7e!;ŸojӰvO2Ώb{uˇ| -2b32b/ Sz"Ry϶ -&;WGT& Kjm@^2b|hD xnKL(SIbM#PO3tW݉$.Mڸ|lR~(H Ha x}O4K5+ym|z*wFT1|kV͡v|oǷ8CO䉄[&yCr_x@?cj 1PJn^0|?f>~gy뮓o$)Y݇LCY>4l.rXBg/:A=TNX -q72 rwp}g䧱iFѥ5停:zFA>g'VNG`3 ;9I{\ʡ>d`o6ױ꘨+9Y)58uCc.%Nǩm?k41Rc>izhsx&˲̏f7|! {emLڊY{'=Jfo}$# ?Eh^~يgNggڶ71^͑#<*+GNą9<;ͤg,3){:~*IR"1q瞻yOؠi ԘU]Ȃ7#ِxT5/ߤ$ڎ@4za\߃Wb̬-2˦$7͐ /TH4ސjed1>Yl cpAXO4ާzDQG|IQ?F[UQR=7Dabl5]c` 6P8R (OV,6S,Is|&f5HT M w|?&1gCNX㍋zc*ciӢ1 Bi5|޼{BVǐW)߁a@CjZ5&cXE&ޜT]كy~p2,=U>Y*UsgAla]3..c: V. º )y'!فe.}k}+lelnǃ2SʿrvA iCBJC7Ҋ Ɓv8̓X=+Ƭ+Uzn ztɆoH(pœuVuF4fƉ[ lCtHDZcoQՀɃ=7Y;q =u .=$ <]ޏuH:"N** %!`78+vLlny ӎejGM ADxac39TL*@S^K\iէ]IK^ VB΄ Lns^׫8|H3M&5ch5-~wmUBV]yjt+B{ݡuuBDo'os.iך|aM+?%ay{8.ӼAg<DfH݅C২P_$/V**#~E:嫕^͉ M |:٬vt8N |=%^g5[@τ,ƯxHۉAy@)xV!\kv $)"gV#+YY@|M'/lJԀ۠e#܆Zp=E] R m7/{0 Aؓ/PIJPpP~iC;R˛̛]H1P:F&Cw i17UՆ'zm{I玮;l ։fHÜcR`'QBƠ$lF,j]SNTB/Z9 UlS&&NJa~x͚iL&sS뫛zo'> ^nʞh T#ZnE#[i$K>?ugȲZ2cb7Ox֬P S?2_JvlbmzB^({ǷF5eB?ZNvfa#w]L7V^Wp7^ɥԸūM G>hpZ-;Hgfi\(\:Zr 6fߞ코 ȅVy^04JWqס%>^oSIQ~k%O&`9O4ЏxvE|$F9M+ (x*BbWM_0l] 5kg@ȫa|N^l€F*:mWk3o_`{(ڡ濺߅rDŽڬҌ9HRH/wGY=Ya>zlݧ/o}CN-7fd-p@2A6S:x?jhݴ W5mf2&oKsm#?kKd\"s맓xU (e|VK-54z2Ԫ 3;̷?nP@#:E^71pW^L^{2jD'_i!Y  Vy(T+p7_ 4xR}*[۪+NlfĖEJ-A݈FB6FQXŇF1xm1g~TrlR寤g- ibn׷03Û\!DZfINU_*[نen3JُK&oy h&$iCGsJ7A!oIN$,16)Nk8ySйp Vȳ_| /iIPP*-ŔY/ŐO{SJgV ң:Eְ^$gS|(]iXFrI|ؒu33B>}c[ɷ*z۷1^V.?]O lnyua^Agf7[b_RAK@QwiҕzKn) )!1=8|xPP]vUSq]Luc e؁6ܪ~BP6͈ǕX{?Xa>&}(nh!4ojxf7ү cb+;B8T9Ev0p]3lĉ^W0?ɥGO]%XGhS`ۂvwtp)H!%m7al5| KOehgSJ8[$ tsSHѭrJ"p9{jd4k6x$xix&mNh]1q#/ TBuO[do.W<4GD 7h:WU%H<+DX(E'QU\km&{b$?f53Z}fZD:­GJKg'EaB_%CvXEnّddh]o5Nw#\as['GM*woNju]Z:}![Lt(cy/r}&)yҗC^XqCL$W{'UZTKϹk4V 6a~hbݚGon'jW)hr)%L.krEC+jmC@7LT/wMJ0;o/U6I<4y!'1AhZ5NS?B#Gl~u61vӃ8~MX Ӎy۫-!VN L;S2/3%K0#[d&lg)ێ>a,u!:iCrur&>NaqC 1"/fuH$(n4퓭ۡMfFTxr1iXQ52[?db@|lʲt(b+( #/z&\*၏HS` >[x$ *Pa`%&`nte\֭00kO9ZEԺ ^I0`VCe.q*f*{ũbRhNe~eK" B&U0qni 4=ɸbY41yEMݵ:ôVUNp}× endstream endobj 408 0 obj << /Length1 1370 /Length2 5960 /Length3 0 /Length 6892 /Filter /FlateDecode >> stream xڍwT6R HK7 tw03 ] !-4()%!ݍ}[us]ZD%m(aH.^n @ ~nItma҇!p d `Ma @$7&ȁ=67 A8Lpo7=ߏ5+**;vA0@ 8V;:pk(H'7 wd؀R AC$w񃝡NuGފ@ ~+C )W buwo|+iӿ E(@ 6P_|ˮKiNPDz\ nex@ܒ rYm~ɌOPq@\|yohMcGކp7_w*h2#ۭ~_mͿϿ xAq&ա-gUT\˟0[z"_s}U?q)'Hќ, b92 KVA,qvAhlvS&hQ[$L\ wV\"VE7g脀. +ݺmDǸhdJGfꮫ5w*Cqd۷ޞ|Jp" be(H2(2'c](1G[iuiexE}gmF_CE)"W`|d}hF/jN~0(.5IҪSPbE,f촗oC!vv5!}Yw_,a!o.oqهW؁G[U,JLقdOhBS+B>1| 3^iAK c݇'EB/=${&Q%:(wDq"F4g]L21~by*WH 4:t8|-0B ja)-9'Vuj:0 @{<=- mE ݖJ6rJeCޖ7FcsC;۫MAU-gi@1 ELCӳВe # '%EIP?I{pC2bo7j9>B ]MbeFtsWc ?mO9uJКoD^):4$Fչݣ 9x)&UTǾi1 טmJrHƑH)z!%_B 2~Xrz]Z^|.̣8*oX!YI:4DF:ɢ85鵣v]E+ %r$s۱s(e3C$vol6 Gkч AI9*4Gv;?+$GvoK-$Y-^ayr+!@Yg)ǡ%,gAt\ZM~™ԴzgvQI0l72ʎ_9 LQ`gYS7޴Fwt~n0#7W&DX%/KRTH#P71v,3V\hj$\ۺd`8 XdM:$w*@^EWk'銳#], jL|1܋3iwcݹ7^݈n/Hn>}0Xy'A `?->P*t.WtPD:xX-dL.Z{|J Dr^x@ݻ@Pg ]h9sēSIa/ Id?A9[IP >=~fMk0#(3uVHw BGfo`3ZHڼ)͝۝R*c9kG{?LFOokw-qaKP_з fVd=џoK#3df½̭ eԜC ۂ.pjRUpY˻LXkP~+h;+ӱð<wE&\ǫ8{X͍pNX]ꛃW .s Ke6@FqO 5YH aQCs;N)v x8aN˕SdCЭuop,a2jL@GR+=_v7e2t=3h18P .Q̛dݲ:#cAN([ߦVV=>EN]ZyZL.dk*ƭٗ d:ep9xBr;֋p3V? O&-& |ga0$_/cY##Loz#< a~ɠ?IUD|GֱrwE "Y[7@f|,Lz2͜ߪP dΞ^hBOhggs$t8@6\AubTWj<,Ue_޴ͻ#p_ɂjͥ־3N*C&F:9Տދ:D-XW`/q.R.+DWzJR̾i}.zv:~P/F !-rMN *,P~ ߞ jV_ Yçb4%7h|}Z^O/=+ʊ٫O9XӕnegM^Э2KYTruÛ`T;e U"o6o)cSh4&l&"7%"a wã:mL*yloIkew͚XU@fù))o,].` gmc;uM) _0v! KҜ%G Z\ݯ7GJL|pu+!y]>KR,IyCUrUMӐm3[˲cV-CRJ V>Ԋ Dy>mtU >CH:\wX}s-#5{(^c+)RE;}two$P$$Zڶ膔E0Zq? 2⦓L8uRI1mg21oL)˴R|îrC+`2?,KDIlK-9.hq,ܩ}fjs˨{sS<*{۟:#AZ؏DrZ+nt$% 0Pe+4M+?qbdJѦhi#IXԹ> &CP8vI!Cu3\CVݷ.У&%B]ϓ'>‚^ &sFt':z\͵srKO̺o(J|m=I!Jt.e6 n"V'Gq*OR{8O`̚AYrVD0EW1lL'KVT,IJDlεQNx3etr 8z ;I9kyW++mC\+iy63b6 = ]졯{xlPǽ l+Kz|,G^c ԟ2.j8$hF$\8! d)/de[ o r! mp Ű\2PfŸ4,*8F|Y_WmdL|;+fVll]Wcb$*F/jdZ%̄j,*eHFoTl֙.6ƃ<@;zB~tPV A>/zMY@i.[>wW/ҳ+QȾ: 3𨟿$r bj`Dz0Tq_~0=T$r ޳7 }?@Li eb % :{&22JG{j:&_Q:>/` 5uP]̰q>`}ì֊*Hm#PjV;?M2/&~N6fXHJctFCMʻ,n(ZRD^H3_hI(NY3sa^=nq0FphOLZIL&5Rpv]3S+7a/~Mg%S?Q]);"J^(SJȺT0V HH}<ϗ4Mg@Z/:.{,n5ܘU ?4\0Pb{2# G::6 >[dbAN;zv#&]zU>ص> '^ HDJ~F`7 Ҫ!gC?ʏ׺B7ǭFLZ Go`2*NZ[*&O4J_3֢pؖp]cF+ ajƼcuXameđMAl]5v]2I?T6WTa!+kY7lH "|~1-fv֫̀.b9(&#> stream xڍx4־ Z { {e0f0{/х%]Fo"]""7ɛ[<}6f]>9{XC J ̄"xll$7f @@0`(xHDZp@ I K %&=$@/=@xl p7_ߏN@HBB;@a-  H7Iooo~+ A:d64~<6z( a'@0P踁a5"@__x v@pW7 s8@`&? PB@;w@O} G@juJ0{+DOWOs]`po+WnF0'XMs#bbB;r7! p@8Qx+!e^9p_p /j@.[o5CW 6aQ1苇5j% BM=緘08@p{j8@@{%$(z < 0XWQY \`wO / rۣԡ($auE'G";ibgLP<] r1c67x%CԿ!W8#N8!,zkGUx˭.Ķ>PzF̜AG5cf]CY'zXdzM\B;h~nX$d //&r\[+VAFCΜ?2HC./zPBSa+sh=yPijQ[!Γft~1fꖔh'޺glhgÙ_kE[xY&8'"[BVЇ^ȋBFL>\=JѲah3;yReʔ ;iy1yg@1dڙ߷ZM=1^cmÕ8_ޥ"e.+0ɒh,BThH2ok&.tKbϥCZ>|4ytGQ ~^ϏIvG8]NeIy# '?o6}-0k2FuOmؼe4H|3yɑtyyDf7"9VjNmSX6jvx:48zfӤg"c!\BdF)?&~q"ɦ9?C3&TFeѾklK IåY/2Y[=$DO/]Lu<߶2qS jŊ2{ZvBRd8;Zdty-a#z'D3MC>I'84fbVJ;.=jMA?ɞ eR $Awzɨof"'Jpa(-Y r8LPj25CeA+Q,_j*]#6C4*uŽys>ɍ rD*{[栧,J$h=߿E>+C1һN`VaO#STM{j֥?L( -y41IK||6QVeR9=jJ𮗾BB f ጬ o H.Q )et[NB!{1^mHυt.31f(`HW_cb Ae̬PmEaM6B,ЈTG+ /FgyXYʴdNeRݸĽ穤t*D)G"ц:Eh}J#C[u gqT/S^8GNZ(:}<}Y䟕.>7xf`1!p⻲^g3r楬aj=Vܝ#fFiÛ*9#@JG(.\)vj}78;f ;3yqOHB7_#Z $[se3~{ $8A_8ٰFiR(~if''z%&/MT[2J` :  -φ޹`CK3f+ +Bо:!~TZ״)C6?W Vd[! Nbɷ:Q^=6eX Ik Cf=sܷItboJ3v6%\}I(TS|ݤh74BGaV9v~* 2,l!o1}֭׭﹆:/sT~km'&@`M u$HěxI|:&GS}ӓ|Do/lZUi1mQRW?~ އ*sW_3c?+&p宥;0޵x#[{lE},W",O.5A.űN{/T}ɸodT.ĽYÎ4ެ%UBǻ֊k#Iģ-=W"/r2c5w2s <F AdK|+cLʍ&ts(PxYM艃wZG2km1,`|'ZnBݧsn_#፲u6G{rA"ezƧOX$(bdU;ywkmDEK8t7<ȓ9+"]t5q4BĴfeAv cdqqOx N7:?(.H^~e g_~ؔk:۰8eXAu"{仏|/r= i{%_ёڍ%}QPW-.rjV\TZDAE[f&ڐx,Yrnd+,:례GλhHo+y@5O>p=@<2 pcB/}T;GDŽcoIa'" dJk_鴃0Sٙq>fY|Ƚ54R+r_@xzCzaU.bR pIow"Z ?+ڶ-2υŅ~-ȡ𲖸]$CxH37&^ThLr ;M' Sݻbʑtcj$I= v=ްNP6Mynn6XGBؕ+dᴵ0}m>F-J:2=\AvĪOö|OGWկȩ:z/X/Y_I~ ϕٳq[TfϢqkfK)ؿX˼;IS'D|]LBK G0 U8,3ܸ0kΰnrmIg9[/sJii55x7+~Fk4G4xz'S":&.tcyj* b+7ei6Vq@5]%ޒr%Am_~"e;K%7**Pjzw蠾T6 !/sVƴ2nؾSZuWؔCz# U4th7Z` E=U92[v}4w|[YIhNzm6P(CeSuma" S]\$/xkm4Hc?WkfEDf>1Bꇤ 9SR8q]uaL)edkjR2̆Q{gFV/CSLcn]6yT W6{#N5A'NΣ|_~ur|`^3}?P7]$B?Tp|d*Q'nGΑ OdCRYČoc|Л a]9 [W2z_,?ET4Tys `~9W1y/۰ NAJqXt51Y{@]bSw Γeͅ k>r:S!B7V&`sƭGMui\ ^$[tQMfµ9¹![ |#Dtn\'˜Glg=`ԈrĬ)&"5NrX4l4?8TM& U?v1t))D1}2Q٫yp{%<qct2%5H66#:k5Gs]r231'M$Wx]w>,][s^Z)z#k3$ì"=9byꇣ`Ͱh?Eq80۾-0N[JjBƵw]+9va/~2N)h$Pdz~*eWnYɹN%lS)XD@-&Q?O 9,!`gFUXa1GH/YIO{dJOs_W,/xDX-@k}>qyoR V`y(mPj5cd?NH.5W5Nt-}/|<φ-+#vrXN̲b\fEr'I5y}2vWvh_ R GvPfvĶ₩b.uznYodsx~`~$S14j,>:u:s=D>vqqN'; sX+9vGg~RjJwߎEyhῖŒy. Fo1r^,dnT^-!̏9hq[˾g~ڶ{E{zTg%-p?$a{Ѡ<]OgM^}qNͻ6&֢q?KN- O<Bԭg94_B;DKgOA0|n2// HҘM +>=V"qo0;%EdXbwOL2C)%Y3u"0 /^AEDtT7JJNV^Uc+?{lv#=b5cUh|Yvmh I n#GeI[Yx6N&ѹgj%s^LpAj)qjAwDŰg|kUjB53ּdTG&Ai4L[o'Zj­jN-A}虪"F/ǥXoNcXnѵZ`dMGgqc3R4z3O7I͗a'u5v-c)2)b8s<߫lYz̊QqXzjo0FAޗhhz/s TA:/Nfv447~luDgғUҺeCyj+tnSRvm);\pr1i#rFzt/d)#-f`ɭ #ɧ w'MzhbVbϾSیwgSIP;{zS4.ۄ߅Y:2v聾E/WSL3{A|kvlm<BehYɫ} lmV,@OdμvU-KI]v'd$ %g$."5K> RF+̺jG9bgoqyfw˵b^C[y^GQӬj5˚$a摁58aE/Z3jiP,~+nZmB׀Y3&(xRv!*p]C/=)|+etg3y N?Ma] endstream endobj 412 0 obj << /Length1 1371 /Length2 5926 /Length3 0 /Length 6873 /Filter /FlateDecode >> stream xڍvP-ҫ4Ԑ{E!$"$:JҋtPRW JSH)_,ߛyo2k9k&\"p=B Ɖ Y$@b&H /Lkp"1hEPvG@qxLt1h ,KʂdA $/"]D@R*c\}ܑN86z`)E Puc`H%p8WYQQ/// bo 8'pD(e@ ^78༠pAh,> G5u0@U 0(W(v8 ]}5 ' ῈP,"]xΡ5EC/<,H_E*AhW*Hw >nB]8 p_"hBS/QsD@xÜD7qEx~W^"Pa\Q8#hT?k# ЯϿǠ]|C}ZƦB;HDd$vHIKY?h @OSWÞlYK7-ۀ  )77;;(_޳8u1)@7gfup꿣8(~юx/% ?8F 8MM 0`^-,b9_X-羪hk ;ԇwmd(Sx;ůkB)QqF 0i L.~uHq"0R[dew.I`acl_Gm:ΧjT?+tD\c9JL-ΚfiTjӳ6쪕&(>Je*mF[rX X]qN04}{F;Rja:.c`n/;M|@udy+W`b/+SBV=O r<%7O߈{ BJ*"#.%k)\ߺ_"0~>z6# vVwAzpqۚ,}ɬVط< sb/7sO?'h $!Zu];4ؿ4F̗L]zS1}%aSBI -Fy+cv`>T:%ɿf| <7|pdO%fDP2'Kڕ4Xk>->al8|j{)ԔƼ֒mǴՈ~Ϡn9miI^Y˯Ez_6fJq_ZoK0s:ptl캣6wwWZd~%Z/JTT F\/SmWZdpOxl%>xx {ꥌpqB"Xl"cd5 M+E^?t ]XKUM0{`QA~Nӻ/M\/E%ڧ- Փ4Gl3X:1_bxmtCeŬfI|1ʯ2}`().Y2Cw^籐Nsfm Bonc.8 wƚ5m?Q?rNQ[;ٔrIa] XOͯ*ٹ!\c]YeF}:U4N+QBJgējviEli(!n-&Js+x Y5ZKl '!ڠܩ-*0Gc*YdA![Xތt|e oƓ9 _snHtI=փi?WѐCtL)Xj_#ؑF^毮jLzN6vbi;Xۀ˩E}4%JedkdپOO Qܸ]ݑ1%8!{V:{8y#$c)$E6EY.\f'yT0S*UfZuIl*A"/Mn'{=yP]_Pt}kp|ͣB2{C]=%ʗI _Ωv nEkO:\W#+:;!1Pv14BYbq3%zjXbLjk^7{ysB@x-_ޠoFFWVVXs:"/Z| /PU%DvB1"^Ʊc]Ǟ:Vـ;7roY|zuT܁iYg'/XF9kCdဥ8xջ6v1N/?sf$pئjcL1-(9FR1gQdz4C°F~Αj^^n=q5޳ks v*s g ,#L=.j zu2n"bF(QEF]yY`en*};8yH\S/bYSj¬Rߊm=rŗ@E'mhV*ҍ[b@5)Out`@xZFwUN.h`T+#64Bv=oS(=uyr^{R9 oTl>Br\}VSi_Q.).HeiZc2 -Uذċt#%и6)|QtH(9۪ $3%q Tx _Sq/Ԍexn,4MZ6A>^7p/#E-{ށ^T_ԟMf2#eЎy "VB1Y}ą>2,og3DcN-mơf YCm:ߨ< <%5gaSImmFGQߕT&fVS2Agg_S'"[N.%80 Z߻fϨ+-UA>er#ė쓇'rϒ[H$)#EJOZC">%Q<-'z#;f>8IӋ q̕uĀ(sS Jrc}#몑VnLIdu |bm1zʟ>g.(M5(`/>?aq|U%'5krMɛɫޭL$oy?s %k784PGm}CQH1՜t)-eȖBjA#O[WJ鋳/)Gf/]7n.DY͇{w"%rOT"e|kQK8i/P% 8W !ϦR+׿sxg31M*ȜD\Y%:2q9[!~ I[Q?5_>T|w{])M{v2e~(fŧqeOT廏r⑧l^c* ,oEțE׸@V˵zw{erlae생&K>,ъ"4*%~o_tZ2 >]wE.47M.yE[sM,v5/i(yrC/zvd*H6:f\m Dx~)=>mR }Ȕ6at=Hp6 b,;H-i/W(mdUa+e+}j0)=O6OImtc,MSZy9m^ڎ7o=<&4y[Km~RZ]`@וIbB6'>#ĨIpټ jKZ6-sdڒVioa:|GrCJ&x]v#zU\4'0D/3yuGbg\&$n\32~RkqOXE~KvͪFI$h[+qzE!s!c+] .PD=BrGM fIw=/:O ZE!G%&Oɒ"b<q #&4>ܓ7̴o#1 g'VaFUw$q4~vp-b<"{pJ1zL#oBZI 3<1T In_O3f7Pm:>t%3ۙ }0 :j3$eDHݴ|@3bC(H_H M /CӘ~A.:QT3fyLف&^Qհ}2Ytk+[Ajո NǓDm~>󣇨X۟nFf1N LNW950at FR7#LG|O2] Z-QڮGܵe}0(D2ax)@4EE+U rfNS,`stc}[ZZ}G_ec?Ky ȡ+aQdF2XjƽT}yKFLS5.}Jd ^^Y¦bF;f݆eqY_ |Fj'=|]HbKnu1B!+s ubIv7Hel$GM)OjtEP!#}J2Y{u4K tQkbOI;%__:.!j(Yb/KK o]c Bkʍ9.dKW~|4G(R/wd|84GjǵL0JkB{1A9_sLǵw%&J{&ZFfG9+^ $^lT/kAk) VcƋ:y¸@w=ʨ϶IQޔ.Sal6ૅ:ovn׍~Z\|ͣb2v'OX3d?.{kDC {βڎb$CjpO];6Xw^-3͕Vo_H۱s^.O"8ưx/3d]fޯ#g?]^БtMۊi~h_ 3œ sr<0bxG3M2Ts_St8YaoCq>t=Dk+v[֏]e**Ƚpp=*'/.;n({].wC7ڧ4G}NxcDSYXG=[杦U\?7K7LܔN ~"ܱ='((rJ 3B;W|yYº$9X}'lEp`T壊cNtޞU O۝bwugdrBlRi019>xҙV?&;P =Vq> stream xڍuTo6-N eti;tlFlFJD )i%DBiAx{=;g'O\w,zP-> Ju %" AAa 8L`(4_(Tts ĥ$‚RrD*`w8j"04C⅂c  III*:Ppca!`'!a[q $N `hj 40 Np F!0{9PCCq;HFJGC Hg0 >;AO r;x;: c` 4W`*#a >8 KfHc8WP7c  0@1A)qqQ)  Jomc;qAcð?4Ġ`~>@HC0@[Ov, {]> rO('k,HW@U]偊?ۦĀBBb@ )?O1(ZU_p Cr+A1AKCo E.辛o3oa;Ý:`I @]MaDݜ۪cÒ_H$(=aP=8b2p_Rs#`zH4׻%(_6 &V>WABLXLF^A,  d`C(hlp#v q!Aq-o@T(c G 7 To`0`f q i>Rd_@52޼;B 9^Zژ#hTI_FCVY)/08KJ;9'{v;P$ݰDjvmG\L'C%:D*V/ZkR߁CrFSx,_0ͭc)QinFx#%ss}Y=ݩ"ZaTޚ,4 Y hN%CxVWaKw0}ֵ (0ZNiClwkt;R 5oE@O57VⱾ:{MzɈIsd> 6z6;(A#KK?fF2y+v{VUQE*s)8>RfnzX{֗Rk˺:3@*'qj{=_Y-xr.Si|j뤳/{sFȳ]wmW܇YYƩb>laQ]~ܗbBqx񨕋/6-æCmɔ[V? _y5eŠ9ZW5xCj uO]xm87K cH-GH,dD]ll*)ɸ#gi0Kty$2ӷc@3wXIx :مe/~|Q"UbljLMFMD G.~Z1D|^"r׻)B+A{["GkC-!Q*I#yu:nGɞG^xD4Q횦TXskd*1{FD;L{" wkwu:W?LYD7/^Cm;uWsH c>O-=pIy eԗ8%[7I,]&mN]l%tk**9CiJDb)*Ƞ%Y3w_" yeo’IlTޱj\,:7/HG5? ŕG+,NhK?T7w{OEp[ ;y=7UdVe"Ve%ktnqЙgW0fo( d{ȬMy1‹mOv8'ҬN]JP? ?`nhW,YP1&oq3:: PrUVyY*$,l!A\I'æwTvnnʪF#ri biEʴl\KOʕL.GݡM4R׵svFwG½ѯeF7h,KG BTO;6bxˬ )$ (1 F\^$i' <YW=W=u݀p&@82W=ҕ<ұ_oʗp [^N)B1DW̘U[ ɳWI⨯UL]Y7ZOB󧎉 ֖e<ƚ_\m .R/ݿCc:QfSJϵo ^37-wXN//0Xy] gA''fݛ_DDs*RMoVxJ?Fzx/3JZp#fdyڔ.JsD ~zntLfrC{#t@>+(i}>YҥO"p\_ҰE͈%Uz0޼]#~(W~Sr5㻾بc=_ T'Ws),%}3^]1mSZ4/&֤v4f3P%Ѵ)&^}~^3YYB \Se!=;}%ji_FwqJ1[BROr0);+'9@/"r`EiVz~ %Yr.H9U{RX\m7JYs}$EMvj>̏w%cu;9k8x(lpy>4+\<T;`(h}urqh6 6~/=u3:]YK"2-!  K^2E:w[ kdr0y0Rv]գu>$-BCՑ\; $ab<)DZqR=N]F1a:#}r=1g%(LiT8+dC|7N+kӱfK[Ʋwpkwc 4]sFQlir?U]fl:/2 $(/Wq6h,u9& jJHgy%A}u"Yv> q㲄mLOo>YlG+H'nhDsNkh] xcDΜ9A?;wkG+W駡^gJ僩2#/蕖Z>4+j}V1kVfR8.6:sLwzIm3uA)@Ju/rdd.;Co9:>)cI`%ܘH<pa$؏|oKQ 8j}+B|0%Ϋ@p=H̛;27W̦|[IH9W],Ѿ@RH2 u#\ &mbQڒrAb͓WڜͣB ξw|B3&x'=Eπ5§mƇϱ'TSn[DTWsY1m.J%A[ӄjhz9>|f'@)]T)qNx ?iYS-lOewf rFV+;O|[ <$ݻ=fnU,*Ym)* oP70)}kMʗ>'ΗTbEqa;! 62d02>n蚡Y{ x1iㄶwk6sB{m0w6幜s`'BU6h `v#[$WEָuIROY9$R`Qc ?{gVNNQ ٭eq=Gk#:  @)/Ͼfw َ[0"3xܝN,d? !p!7X]Fi65 mz6F_Uٚt妶)ݑ 藙]Y{%q$k{D87ZX>u5zD LL:-Uj*O;=QpK_SO;Fb!oTow]Cy&Q+1%j 5Fc*dWcylU;_N>w5nk_{D J?S}t.>iz8&՟2+wܡB~oˆ=}rN05ݽƟտsiTLY(=`?|Mkz] %&>!C:w3}y3x B 'F?,C+6h 7;neLAv-;C Tipops}{FxrT]lJ̭t'XV*t?ܛZ=VE\F);!ز+:p$˲lٹ{q wLO5Ƕ).wPq.=q#AT*]rƧ뻸mk떕'e$n{LOlYI_:X!6eƗ \4|XfV wn YvlDsOTcJp35/WAQۆwYClmW_穝QBH%M]PIhNaJKi]͗LS}8e&qng-Y'ۮt^Vn˩BqGzmPzMǨIRl[bm9U hS֧kbkpZz(qD̊ %rPk&^\TՊ\> stream xڌP]k #=o݃Fl- %{p˙339ս^Ov݋DQ峐P "*`ddgddPpGOwqBh.5t|7L,&vn&nFF3## m&9z O!bcfoaf~^4&..Ɔ 9DcC+(ym\\\ mi.eh+e5ߩST-Vؘ:+ c dP(Am@wqLL_D9X,@fS + @A\Ց`2_ą;?c{ [Gz rdb kk D-uwcZl\@A ӿ0qePY9Dm.#3:99@;؜TlR2%~`` 8;<_00v,@@ӿ[ۏ ofbrc+fQSVwU ۸<>>31Y/^ˣhh8+2p{{B_.y4#s_7"q'+6Z[Xsߧ@}@TM,V}@fo+D[׼YY6mw/F{2c-ޚRgۘ5llC{{C7~Gl4 w{^S{. o`8 "A쿈 wN?EOb0(A,?S𿈅Y۾w_K6"?^՗ ǃhmb`M 4p&fX cfk[X,3|O|o/?ߣ~YL#xX$tx_F 8C~EN8Gb{=?v7vK  4_1 Zz_)yw2VcG y__%'bQsv/a1s[&޺gJ7Rm+6GcY'=-Y˵ 6\ڡ/ec] U ="xd '' "D`PZ[plåi2jQi:}yu TgƃGgH̡90 #/ُСx5?QpyYy#*!p f}NHEDލ%= bJj-׺yY8Ѳ ڐ(@< uir``.Z&,g){lsȞ w %K0]' (8p(`?-_SĿDuˑf8̌&޸6a(0gy XMhP`9IaSNHjT:&?B0@]e@#CMx*!P&oh:HlS%Nn}RXnNH:1AV,}YY%{Kˠ2)6/EB| d;ZEn+vN/@ǭIѤny}QΗBOXS!F ~8o$ r6偋~ (nM榓(RCp#IWrfʷģOnV%jOpE{{7U\mxUOQ {t|g3|yB ˶Cxuq[:~&$b-^v۬:Q$#u.#WrXte!{/Y, cxzOnqEˏ%`8Dl02vyyzG^W Z|A$s,Z:YIRC0? 'uVRd.T?B#jp$Fk~u|:4ܑ!IZBmb[5=m\2(>@b VODd`~`m):bK1QF6B˕viL`vJTiXʌ c[{6&7W՜}9qAa{q wrP]Nҟb׊׵浽`cm⨘RY5{㞤"b.^{i}my,WAJN2]ڮiA"6`5Ɇ5tHn:0_p8v'&*MF:Zcm@Т;|>SaKYlϡprFșHOP0L} ~gS(S r.}- `#>LS,B4$0&WvYSϧ̂=hOey<ꘫE.Tz]#JF)!9 9=zW]s_ p T@,n@=!ZQ 5ɲ;2f|x0妫4b>O!T)'1q|3.ZdI/=Y{W;}m_ -Dw B8- [VtxZy"0ܯJfVT[Qol~5ĈW5;E#N )|{*DZfk=54eŸK;X`TE).Fy(7wγ3ɬ8}j,CvYM1@ 8#"&kɯaL^v/-%X'yCޡ#Պ6!'[||hpW)yΩ!WW%CcjlM3G]S4@h>aFHT$|lq2;PJ@mm;0F xm.oF|qqڠ1A!ĭ8:کs%Yk#ۆl`p]Kt#t&lSpoqfCBLcFFD>2vk%hJQ]PHA( 6 T.z4г Bl/7 P~3R1hk^sRC^Ij|L{j\Zdn( 2x^h|s1 _AD 6Y_YAj4 H6Tg*\߶~D FKo@r|Scqx1ׁb&\D:^pw&jzOW|O](L'e8޲D`z6F_W (+8Q\h e7T7t%ӥi Kp/"B(lYn\B6G(L#ȕŃaaY* B -sM|VFk9CՃ=:mӅ5R0i7m*jBg9`3q䃢^q77@>SYO~)͆ jDmCqኔsgh25-Y}PG]>aB GUFJͷ١լe(:AՀ ׻Yܟ+[g 6&܁swq|7;sIh(%$a54^ǝ>Ap=o AFRVxj K?̷X'ɜ;;I"|o98D*+2Yfi[/PrpU4 UcaA_'$O] _Xst9 f{.Q,گ>WЋ` C_j.eNͷK<Q4:~c5F߬t9I49ylsFY,j\b:h&[0Nu$ZNzCů:~TkN)nNF& DŽw[ٍ~ՠ%ĊXdl/j[ ǦOM74;yį؈bko8)zcP_BWaPU-Vnz3%ҭ!Je~/\@[)ZWC- | X \Sұd4 a ])!}յۣy [-@Wn/zGn"׫"F8e -)8y>Dv ׈?i-ǚyyrtӬD1xJXFž=B-f|I,6& .=dN I)#C><`fG "!ȍ ݤT-{!m g30/G:|-JZHcT[PO%D6OUZ1ti*CNzJzd#ehR=9u*D2[ՇH?i6 %%T}2x^IS A lɸڽ2}2f`WFaap羚8ޱD@$FT i:Q ,h*X+WƩ/}g2/qLkIY _,3|.\x{`U }<_S*G {{p(h`$xJD%SpXD[Jߐ'fE=zUMd#K9_ >t:Oĩ)Ğ %gd-v'a1yӂDOفZ]ퟜΟ֎jZoiLctHa_^lǎd&V+m>6╈ۭ:̯7F[o\hu*cx~D6 2Eҡ0hS5[1 [h@c7+ٲ1 C.h 2G1QIwJ{ %3Dmx nk@cж:},;b@P곓'&~Ekw\Bd̳C)8W̏ю:m5"ZJmíg<O񶻍|yR>8'8c 89$ 6'zA2wǂ 7u'zNG(+G Z:pp{㷂@鼉݌_ 3-ĩԛtZ* ެhخJ >DZ\. 3x X. 7h/Xd4Lt2MKr]ݴK}y/`֮W̶!gxA`1qnI<&ń灮eaF%eC%64|j1C}㑵BJVjdؑ q(OF}3oٜA)'3+nz~;ā۾f4̫hR@F'iuKj -:mMY|ձATD)Yஎ % F$%8)AgA-_I1kO>_:Q|fGԌ0,/Qh+(%>Q+?7*CC@ ?<-_.Cbn5/:5FXݩxDI "d_w證LdQ H318s>goB"/[ nemEE!iujk\rc+rRgs ̎X\]ʹ@(:LH r]\HKVw9Z=fUD+q%$|dQp!L6ucU!Too? 7;-Sf'y}>Igb#gh[Ŝm͟XѶQCrT .tη0|ℌէL #M%6\d%6,5{݈Rq]}Wx 8PO?}Q}qۻyKΘ둝H""|M<,lH,& VQ fd8"?0O-sm& IE ir*GxgUs 6%"{D{%.'4cV½/1M=vIIp/h\s\/4,P$ϝRP pd2(E:u~"<,:eJOY!e,VhcBhM- \f//e/bNRaxxJa^$ 8TMZ2HyzaF!]M}? B¼KlCq^Tֳg ỗc{ @uz_ԩs=!mOVRn8n(*AyNVõ߰C*U\`ywwg՚;eHEsI&kՍ) an 6|e sPk~9.\1oe\ ? [#eB΂@pхisyLQICTi>ŸQ0~FGGG*㽖2sZ ~@@iK([l˜-_㣢{WjG(U6;b"yWu?̡ОԸ*sd'#?pP'"]ڡ.D>pX5o*`yo0')%cȉD7/7I^9[ 1nUїp_j&ǖu" åK4 QƇSrVYGjCVM[,a@ =|a]ohPd]K'M觶#:glpr^ Q0>d# j£ҧZVXKĸ WCKlu"W[גOz HPu Zb]:2IogHꞕ#\d ]al/s) f(( "oeE; peȳN/J4yuB :2kh{:ЪB_6(SOG/nY< YWao6j&dzptk[SκU-'f@A}^\T` e*!}E<[yhy|joA9EqPbn1=atbn]]8Y]|G>:M.f&zۮGx 8kE0A >{1wSUt{VUJB +S'l\%?q}sT}E X{saN'6V__LVVgw1R0`![5qX3a:;I0ΘC9O"¨nT U %%98$8}4@-R*HOb$y!>icm R_O B[qӲhctWP]LjQ"gqHk`ES"rUyyYR/6+#>_fbZ-dҶ*ZV,|%N--{ y)N}3ȡfWFMi;mvH.c)1z1EmoadK* j }ΏtSş_E:Byź예ec!#u`1-V"we]n :Q'M{4@T=U-矺}\ICM}OVq S8_F+L>dάbhL$u#Ssۤ?6W;S: #gnJOӆcv{pj,}ꏖ9[}D^WΪMOX8xPe\=G oetIGS= GV}TwM NArE5Df$<6nA54wbRR1mr9afýkMV20vrT8^rt*L#Q(;̠HBwks:6E O\-o0'aNջ0Ũi_,pl Ke ],}5Ye^B$4ZMR2Jj d2NU[ %%l 0ȂD4 Tfܚ~z l%²$o&Gk2?5j\P(U㣊զ`jiw,P#?#\JȄVBjgY]_a6|,/)-3ɔT@5':n9xw`nD­֥h`]GBe9#ߧsa6ҒFܵ`64.;(EBIe;˲k1 |1@ŀ &vԢ Iexw_-U c2ZiK$80Fys1=*ђ| <4L_~.e)Fo%-q+qŚ.<3_iGK9a:q%'&(*{tfK U,DԻ,rn$4W/Fx \G^zE};ˑo۽2PN9rq9c|2ꔔڥjt& y[ࣰL+M1FN #9NB@vLHg |W26`BjiĠ``Oϔr\npC+TꕆŚ ( qĆDMlI j䕖978%MNI>R*;t4S˴d.JiXSmڵPsBv_|W!ͧJ%)±>-|3kQ}WNt詗/.Kg/)3k%`qt~Fegs2ڔ|s\ 9a1ڇrNĉA(&,f*Abf<;*nqIPreTuA045¦L%SI`i gͤAYkkM^ov_tmBҳX.4ktސ7̃=pCDڃl= .V%7 f}~*wGOX01-5>(2 }O${nku(ڸ۶8WƋMCܓOgA$N?3ɫJ̉iI>P*QY.:CzeL3:I ~ےz.@< |~4R:OM!Ң(p>*%0Lq2fͱOds%sU?CeOi \9]ܝ8ǵw_$Ǩ= oizհ&eo5~MzXd_`!(uQ/y1QYA$;&nC[BI92{:,=m5﨑2zs 6zNf2^hw pYdi~q]?-^uw>ٞކ~B-ܵsf"AKƌ^ƹ0&)%c9>30t-LfK,Q6%3o_[̫A{,1l k7ë(mu_N9[Og[$WVaCf]4^6qK qv=) Ԃ0LfDMҏ@©(IFD>-H ۪" |/"͈X :21*O<fpLk0oyDvWDڅ'%.4 Қ''/3 ^Y~Wh 5Q.xlLe,֛ٗTJ: mhWMWCYoVep'u) 5N%-rpqR'GŞ@kgt'ZD5|&A*&3m0 R-2|Asj/)9Ê1F L!9(uw ON5>"aE*o4=mn`2mqW}HXO,$flұi`96u[ǜF2OHqֿy'uo{)k(=阚ɮy Q[Wюys5DRv2`furط K|>qR0..aevf &Kq#bqxpa@9{\5wH2"7̪yL#xLH;_'uV"DM&>qT]H: p) !,ؔ}d) ܊#M#/r ×(%֔Gv+9t.$;m^.ƯD>0үJ j(Ť`Ū-_>!1kj[RbiˁFd~u}Nq&WWQ7Ji: &CʣCU3É0)ʕAR\Zz畽91C#|.)t 5nA=ӧ /giA|$볽}jߔ]4Gո .R2K_dS͙a2P Zŝ>d.Tz)aVӞDV&".duj>!( eԠm0v'crX)TMG} ]$2֬3Sr8J7IhJBA\iJVxƯV583e.Q㸄. יSa12T?pʩ:;YG=XDBv9%Nz_3EG;D~C4Sh|\~)j21ʡj -AVtZg3$㶬b|+%rF{[CʖdN4lxj</j.OeQ4R`ArQN~f$LZIOt\,`oQf亹jWA-w :NC!y WH5 | XJ9F-SةQ!UQ9Meim&ȇ~ *mû걵oQ6>"S{ Fmx}Ir{|K 7r|+I-$?ܵ΃Zۍ.6keЂeNmJ-Al-+p}r#D 77$b-cTV}>pBk~ᴆH:fSDDyeNc1o2+vCrI$ cuٴ3A`މ\ |x(`󗱲.KR,Sbbf;)S^%1&ʣֵh`J '4Iog{نHFW}m&577'Ed";^]Kh TB$^- T*8gz /o0 c[FKBϦ6DEj8}MH=)/r mz]y,Ϥ23lvĦ>)X5KT*($rK*/@g| X'^6bdТrY7|fi #vwvH&v[rPdl:+:ay?m`ZYN/`MJ{sj ٥vhS`t>iQ ./j?TSfH|Fሾ]I.f["K/z5G ̱ endstream endobj 418 0 obj << /Length1 1776 /Length2 11632 /Length3 0 /Length 12757 /Filter /FlateDecode >> stream xڍP ) H(.8wwSl9g~̽$y'Tԙ, f@)؅MAQCƁBMrGBtrA4uyI*B9W;;'GW C@ dPdA@gO'k|Йyt@`55@bxO:!kVVwwwS{g=b P:܀?Z(na rKtq7u^v s ltf*࿌2`}8v@ Φ{S'lR ,..LSvΐWS7S٫TݟřdGy=fI=G} '{}`;?d [Xц& U fcc@sk?hx:T!~|m ~x;.N@_+P s F'h޿:~?^f:a?^1<-W).x3s9l^n6Q1]?`Kr_?%=t/=c)A^'g ظ_?.(+rSOd人n"uT*-@W+b b`׉ffbaKry-T@.M_r?@A,4GY ԅ#vgBFޑ$tW twY(=}}Qdfk'3Zlg[YcOKτla֬6~~bw.PZ  f<6-'LHXvGxl,dRûr&hf&uHA/$`zWC]u{H PZOHӠUv)m0I|\2N0%YRPбV-mIZ%L>#H@,)`B[cETN|2O՜UF19HocK")Nwȵ6SʪބZ SdžC.\[r\+2CQ|/c$MESyRXDaJ˥=n-'B9J%= K7fyfNp8Q4Ь3xurGt C4Q o톡աprEk ͆lIW $v\$`59r~%j?BP/ U7ƥ糢}M_::윮=% I qš'ubfǷ?4P2oŀ}ݭ`O4* Zdɏ+%F^mǂ< m8WU*)mͅXLX\6]$K6bX ݓX'kV獵4O<\An²O= e*0emа@zv8! a8 )&X1?0?78z}wӮi~Go49]jc2KErtm D(16+3}EU##f+Jen/`ae~H~mxhdVl$!sS[Mϝ``lAtY–J6|b~'`?pQ49J* k\lgdv\Uv'FBoA*9ѷ}~kdQނx rq޶AtͮgvF!% -(,}M2o\/QȎ멐MY&N<@P =a>&^* N2ёܢM%ۀE{oA^T`U՝$[{d'+aj-bە;)?86O| k DZv/Yzcq_;4<8d[2ߌ?lBM^.ZAeAe:\(Ďy&bBiiԭ˕~čouA㍁[cD*1n;Qiq!VVɲYT O4z@[L@_FP,LB>ݟ2rSFy@8~8:0j=]{qKkom (U"JKmSҞ`PnCuI]?yGZ=3m[\={J١m'j42H{Ĵr6dt̫P+H=p~>X*?:Y6Wv"!иL/F;L7I@y#>1ml~គ N9-cvXwZԗ|e/+\dUa&#ccte[jێe){m(ݖ&]n1gFRAt3v2ҍ ^9>;fAD @<XܼL)%H0D{j'43W&QAZIW#4Q{M1'h'XPu0L0E"`4IX;RL[]p=ɉځw2uշڧ[S"v!IoKH%R ;LJ^5ws2Mǐ .Z@v#"fVJHvrc1'{s/-n{_}Q)uc-NyxkTZ3P~mڢÕ  f}T Ef@Z,ePLwN)Rg w'jZu(6:eI9iݔ4"Adh Ό]C"YJ9VXcsSEZС6=P}c1C3R]Ygfp*,'͚# hlASg{Z^'z 41 Cd諸(BX0ר;'$P0LTΒO~r.\n#hL8 5[%~ RjcB42\dVLiJ2< C&>%GG1$(z[ƌIHҮAbpY_-b07&o }fZp.i$ɿS?œ^tb>IrWVa=FIsCϭ0Pr೩4k^[2כS""A}L x: E" T7Y #x*F޺0?D2XV7R7$`qGʟ~&A v/ˆYl(! GQn~4q򠥓^|~$&qXSr38,q@~96\>n[5 TM$sW8$Z9;V(1XS U%$!R^Eq6슗bo39JUl哏MO‹oVIx> ꁿ@{jKG5I+-=` [ pawtخkY(r+5(">Xo&Z.CvT˓By]F2?rLP0K>9L?HӖ4%_fP>VvH|sr}Pk޶B"nL7/GxU=Dv)렞 J3眐>cAQnU~p](F!0S@6)$KA@"37G@ö~W>Չ|yX}tg:/ե#ŦtfY:q.aY*&ٍyfK =~k]mc\k)Bt:\>DC#H⼔Q#uXۣTcOyJiU. 1g^ol8L񞕷j(;њѼVl5H95㲏+]ZrI5𲤉 vHML|Q.N=!U(*4 +qL=L+(g}86/@_M,(-' 򝽙UdK7E=T/$/\H O2n%3]{s^o(M"ik]wr" $3H>Qv=CC䍏rv'"rzO.ͱ&@Yl%Kęԓ]9KiS71`,h>tȣWz/> &ܤvu&r"hz[4r>M;bN±Z$Zb6bAh}{w߸Jiyz_:]BwWхzwЯ:Տ$؎=Pgcΰ0-O²HF9JְsU=cVhML9h=Fh> {P1t .ȆWT,ǐPsI{XIA+aLx9?U^4]#dŐ*cafCS;˿zvaȖ*#@Nf5>-Ԟ9%TC9٢ScH~[Z6h#PZMW8 ̈AF5gρ`oTQ<2ٔ'840%#ƥ OF|j\TA1/Q,Һ" q(M[&V&81uu Iّ_ e fxJL{ڞ#mI*;h<2GͰi #:~8sZʌ8> !vĖ?٨WP@r| AߕkVMrH:^Mb5 _V+Y яɝ#q|X- Ic>Y=c>_tOolA|oC< {{sQD:rP?+mhY\~hޔڬ@f=~7ɩw&&ww|~>MR$*n`:7q#ҎQ|*?(&P2ͽs?D RukŠܦHNQPB rlo)bכ$g>+$/S^'}w*VnVSct GM-8H! @OiSa+J iW;_֗^X!©䀟W#-Gsй-Q B4,"1?"k{n_,2$%!qU=M]C2qQy!fnH+&d̮s_Ȣ{ymF~/*PYzE#&J[rF\הo-]*-}hmt~JK>}}=l+ro; zar\]9S%8Pg)ឧV1cRG=36B0`6X۱%#4ZO?ʹ Cl= cg\vUpLU8Fܨ^EМS{J6&|,2 _J_P9u\ǣ:2\Tg=9.]Ļ3Eҵ`\KziUi}^MQV'i<zw@СzfϓhZ+7(?,_jui&n:24s!= 4s-D5Ǭ^) QbsRt,`{dF ى{TJUqBZiGA6'O]шYM b Лrқaܛ)zt:C"CUOzkh],!lDZzz'k++TҴS^3itP-Xzw^V 9«$eVҍG׭V CPZbMggVْk521VMPb8{Q,Xmum'Xz>D*_a~H?+A-`'soKt!4( im/|@9^)r`CM_t[b=zP:0^ݝ fG J̵_! r.V#~H;e)}4`$dloә6Gbst-i|<'rU49 ܘH;I849IuON"R>ާf A84r%#61j1k)Kn]9X`:FťMG"C~n[󹚐|@Ɏ}{{b/~7i.L~U N*M¤]-Mk᭝+5Q)a`;p.*6=:x r XC_te F!o_~>|ZK،H^@򨕘^zל+S[InBސ%ut6=gV._쥌Y냁2A9;ୀ~WAùⵈM.ѼDɊq@\}L@^\ S4E~u=۳ISz %`ͤwH]GÁ2]ƀ5K&G7( d-; EuVdHdDhAE=^}P?&bk;Y;U4R+Rr0?u2 {EfɌQYTN%FTݟ䥵籼Q"\tVvD$I_tmm LW|4&mk׏(-Ug ou:PzY`'7ElKe `6:ŧ+Li^!U))FYhFdk&Hg홽 b:rePݿl=-זAMAX?PbϑJV^/$5L\R$ܯ%RlPtجZ ف_qe71N"Pv'0ԥ| iypbR$E4bw~}nfs+ivȃʃg8rs}>Q6y6vDV[D#]+/Cz-$Am90@V'4o4m$R39pP>" )';`,6+~- /yg@#Y,mf~l=Нi T& 'z󂹒 K>ARw Ym\J֌7O b(t %dY;^w41MBc`&Q)U+*0MAdvӡmʏ1=Z?֗Ŷr{E0$\\1ZC&rSkUt[Myi_q K6 _YWþ\Î^n ,K`aX7)ʏ_G}Lc"J)-gdy&1"ecdFF%M>QZ-U/אb/usPy_;D<x&OzA.d[A-N2aA7Vԛ}s}P!g+rVXbd0Mĵ?H:QR_Ef}Ϙj9Ն ⤜O!Lw2Fn{/x^mi})*w{!u֧Ͽܰ599޿RHndߛidANjzOo_r5S(蒱0T0s֪,-s~C;^bhc#Z@i`GJߦ@5ctxE$}!Ѣޮ'LB0 _)ۡaZ=%r/?a:iM]!lyfN_!UԍgΌwj Xs㺍z5䣋ЭiJguBdњ$.umrm'*\CwңjpNzs~|H'-íww6EvvvJq5btFTZmy˿6Zu^ZyMA#ݗ8] uQ3{:W~KٷLs4˴?pdchZ y?)4c% 6Ҷ^sB;hnowhCKfVTZ D[0FcHJu7p&c։TOfTZJi5 xZ>f*-1;*t]^ݙx;f÷dIq9=jNr"uK{P{c>&-PVwer7uQɋЀ_4mG(k+ѧmB޸RCr+*P,b2I%WЂHClЮumolnэ# 2'9F/m [Vt+4!w5NAseL/luۑS#.ĥaI0R( C(bZbd,dsdUz2pVIpeEtP&3} NQ /Մ3MsqXaM<'Γu.q'CIwa S i*a2+z^D5e+ڟW47ocSޙ)+y]i|+W RcafIJvO.zş5x &;f4rƘ~n3PB5JM-EVҸvjo!ѽ +!4!jlz[ع VN9i/䕻wߏD`>OȆVt^+H}Lǵ!2,AETo[$%>X t)V  < m8e+iv,ZnxKc(!y~s!QYPrb8\fkX.]7U1nm"'_(񴚟rV؛'ωd8bgFsvOԣ )lfpgЄu<ՠmO#v20a>!_YZl7Z&ߓC;^ )\!2~h{D\;Z廖s1t\^_)+^]f6 endstream endobj 420 0 obj << /Length1 2542 /Length2 18095 /Length3 0 /Length 19573 /Filter /FlateDecode >> stream xڌP c=6ww ݂ӸCpww .%[p\_ܹ+ז}NCNL/dlkqgf`Ȫ03XXU̝Ómmxq8d @6)g+3+ _C['sc,@O.bk`njߏ*#j377'!k @ h hd`P52:#+#5 t: 3S<9@? e['W $278\mPt @hci_"2`bnȋ089 l24r[ N &0UO}FvN V ͢6"@'Gd4ݝõu/2116 cg;FUs{gl@"2S݌ n[TTh898=T/gf9 6Ab0Lc0'ЄX65UUh)_ @ `gppsE,1p'YP?@zPK4@1dyv7Ho= VX M,,j% @ dcjo#݀ NFfĪ확 P@t2[F15kX9LIbagx2ll@.Pu[(?(qE~#.߈(/d0FF߈(%#P<O7œq"(F NĩU~#P}S7ՠ/E71R3p421_9_bx;Zn(o&P?@ZCjP{  ,G7ٚZ䩵0^؃KCy>>C)|,YZɿD9>H5Mrƣ-#d->N^яoGSgwCk*&/RRkஈ2_krI?y4[%NK7[ŝiaVB E%p.K(j\q]|B6W<)m IԜVVoKs:A F&.VPaa^`8D$EI>[(8fv&arUX#W5b}Jie:|ʳ -=o(1E7; :_?kj- DՅ~W7{A޸6KM?cp`2%weLqfkȬl,u<־fu ƸX;OO=^+rxuk̼K6FJAZgZQaG$jοx[? jH_Oa ))&$%1JkQ]o1q#\AQn5VXx;/B\i\"mnYU?9={/CihJATCuZDa+2!P~@!18#4 :Ku|$B{9㔾\ʌL_M?-8{O?`F SaS];meNt ޼i&NLWI0>+)몯+F7) '87c篜3G [i#E4)ۆČ|m,Xv:0c]<ߏHfFD@2Y+[;L;,~*51=%{3$',CvxUWfPr}zߩg&/w^*7Vq4eRlU2Xjxv/zf0mhA|q(> 2| <ׯǕq:wJJ"E"P5/ζi }>_SBNO *<(^K?4i$LgYz@;Y!J|پX.6O@T5K mH M"3D)) G#{*΢sΖ ż.J_1,{ww9WOV奮rժv%UU;ܵ?0L w8|Oi0£nOk>ڞvXXEקe ݇#Ya#є9}ן~w,% D⇪dnݿU힩,e<|OOqJD#= rj>!͝&1HeGyM(l/&w9"}:xNJppݞ.Y kpNNNk@QD^ӧ9cFH3d.n X#<:o[?iSsO!iG]B}Abv7.U&:znYp%!X5_CyDˮBƼKqB\Dj"bP_w`Iz*^=2Pse:ӦL/'VW!z`xVTO"BP38I-0Ak8 7:D<ʼn2-Ԥ݁ Wfz*'Ύhϵ3:acD| $q7C .-e%B/[1CZa|52vhwjѷ-GXNTl Elz;`jq,̉Wo;DZqlwM0n!$({ep/V h\28 >3>a XZJ7zp>Ӂ[yUPt}A6)# 'v$pʩzjt;SF j"26~P1T SX* MƉ.B5TAZ1l+ߧUiJ!\YOxaA-yP0@t3 mF'gvJp/ܪ/bR5v:}+F&͢zs'{K/CT!<6dB!y#yo5nȖBy GvtӅ'9UhH2̸kS6PA"T֜ʾP0dBjBE %Ky(WvS"w2x)hFE1(ljx@x,7 ɼIAηlgqBV P8(٣sSqVù0a \ [к*:C14z nJ?k0=Mԅ}U738<"~v' +LIVX]dXfK$2PWd0DMCw_ `V yѭxO8dpV74 oT:I$L-ywu0[leK}-@1K$q:xĮe0ޔPCy- D1&cUD&8Wv3M)ZzGl ϧN%RnI\óJ ؟=Gߴ1KɏZY{b9>;I7FN]UYV!Կ꒷Nī\٧mQO;ΫDRߧ&݂)Tj8a}6 %Ì%^aX=`aɸb/2yWQlCCg ϗ8v)~Kca~z0[O7kCnjW;mj?|_"~zSY%M'}|֓l͘bՅp7vqC2'~DڜYZkP*ۥm=1l,5T0[gʫ/ߕ" BR lT*'+" (=e=+<MO, zyʖ2@e^J\Ѥb-WHӜӆƷ/21$E ?NئsV$Ǔ(a|O:kZ~O\|6#Bºmdd2h^nV/u-i A!qW5kU<0.D4|DG;rߥ1_GCpTކ syOt.5 9K@k`u@P:[y@7ic2"~ݤEf¼]=/Mb{)_=A@.TXI]|b=8Z RO"sz.jX!&9finy_fΆfUYLE~b(W`|֔x 뚽J=WR'Q4SWK(E:sWJṲ0AD>,+X')1U!QieS?CbGvzLv '%f#~s7NJU8.ikHU^ѪL *儾̀70%c %{_{ڇPʭovwWAXŸ$~š*P+еX*y*aa9S&s9szNy,B ȞF_s*J=hRiΰb [a@v: @0mu[C2n*^^;\_RJA(L>InB6C8퐿^A!1(½`Ϋӡ9O蕔kUn@CO.vfD2 AfNMoxaϙ;*@/{n@3yj.<.a|0w@Ѿ)?Wx#-^wd"3D@w`Ou[]Cx^Bqbۚl0KR%G>o%h9JD Ix%9~~HԀlq(p(D'ui agEswÉk(쟓W$1'qĈJ C<5w WJye% Nv#N6.-~\=*HmnWr4 hg" Vs ts_9aǕn(y"FPIV- rxwS&nR"UJ&DeGaI9+eac1RW)E'،ģbX}A`0l-F8.MBf{ [xO있u~xu wRt|njIe}OsOs|$d_e7d$^%1DI&05hdD.N[Z&nc"=fP~`$g*kɮe;`4>InxRD]jneꮩ(fAԜ%}09F};ɝ#sG18*F큏^"ś`:7HA-t"``XኧRz5[Df%sGIxGw tU~;?0N,M14ΐܷQ mw7%beO(vQAX`+yfU|At8ަVީEAuk"{aM)+l9 (K|(idlyvA&b~5]y㖹(ai~_pzthOvV&rGȢ8^.UD$Wuԅk^H{. ~gQv=[f9m5GM{|!_/"{dls > ӻMqPG u0q FLT2gHUђGLļKzr"ASi$w1] Ibksv/u͇2mYMwD8IFBU}-3wͯl^%0٥G݄Goۓp=_™xNhR"!67( Wsr$;'Cf/?6\z-ņz̎;@{^5v ƛL^36KFSF{En/rFWI =?Z`x![#sP8!|^h'WedpSKEvEfڻF \+>&#rAZ!8 a}zYh Ylvyկ}f$Z H DXjZ wW:esBgk >~ÉDVLѳ{l:"fEzfc_tCLcn/pkb,0]R{xp@e2MĪڥC&UvW l&1FE 2l.Łg8C@Mо_D|mC#=KHQ=ڝU_,7~Nb7_M5tЊ[2,}Xcѵ/Ri8dTo.yyiv}}^pİs ip*oɢ|'SYjQRk&gS>v~zƴ Bl(ɨ :GNU7wJVJ;}k&__C+r\:'#mU ;<ǁ4>ٖt,8V>$ZܮYLZCLPKɬTQ1'|&pA$"qdB{k)'!u㎸Fנ{hQH<EB7|_XcF%FϨ>"MR qmkA ļ 9b /ɜѸx!L*"j f؜q`Ǔ<{&Ş WlŔT<Ar y^1{)kL}So |>BEßn{CrK=dtEJIJ:U8 40H=5[u(.RvKx>u*$s>&.EK A&,jܱNݿғijٝGe`o+t8 NBީv(_R#vŎAEtnx{(dH^Pwr+՝W' _*xAlEaF1V$L)몽{kYd/Qad喯֠{ &4p(a.?9K`FsжB66&E:Im%= Ewz{Q x;4/:>C3* sʠ fI9uH;wF,a.CORҖRJD't_2c Hܡ_!zX]X~vh潣 PϹB.RpZg\@5Hxe#l -eٽ*B?_F6Cry'@$QaFTq.zvf}-poxîHgP<غ'_lHueZ NhN3X\F}qқt/̹N\y9|qC—gqĻۻvY[YSg CI̒^Li|PƁJ$ ']K38L0&<]^L٧[+n@2Nq궁MGř~ ziCs_ W($n7 4;vdděCȷ.˚:S 5AN-F6SVD/ˊ Xj_%C! BM{oI'#rJLdo}kiq e!@vQt^IQNw|"j,q,r9w 1SHjqxM 0c*u%NveY/X*C.<{J[@w~jpfmlGrY<#ϖB[J,||/ͽ vVkGHwYZuw}fnSVXŅOY/÷$ * \閃RVNu|OM|],(ѯTU9lTVZ} ,LyMpdG({]}}Ra@l3 Q׃'U(Xp񧜰 rƙS`=Pٲc?N$s(cϜ m8R)=%m<xڴj; |pgI\,P!9y&ƽ~E{ =_o#| {r95ys gv}K jGbB!!̹!Ig !Nfb?IƓ&NJa!3t~qTp- Yýw̮{,z#պ+U\@GLHt2wk _C]w"=S]"ap=jBEբ֤K ͢b>T.DN-z@&):I ˘pAFSZ4X>/$ܜ[2dMbց 6$^p$>\b+[5Var o-HPv ;Hq@H43x$jEΖS4tW /b]W*"5Ͷ0Z/yU.qSw=j[M]wi68`FP_"Rϖ ?ʵŠg-r=Jҩ(EMZ!>= ōL_v ;C?אEk׏bGi񡳿إyxw!^q>d$떕e s5@~N 6ГjxGV_ӊ'}|Lub~ߒ07W9 ,** Li《*EwotZ#YY^ԼV} F7a]iթ:ѯԟs}X!,gQ ۙ=:qrcUN.˴IڑoR*Q\tv%FPZ#6J (b#}k`_No\YiWڶ9RN0< =JVƊmTF"xfDmC3u1HOKzf5me>B6|ʏNȅ`.H A2>L14ƭ!_3!&;.o av":O.ր5~s(b~gM:Z/88*6}nشOl3p'HqQئذ̧we/`m.|m2VڋQd98™흨9zziRD>& fP9Bb!kMLU' ORuG%-Kv=䁮tKZCa_o87sTSj!{sUf`_V᪙y#q'mp7|=C|c#lk@ΉIīUuJ\eB=/JϳR+L9+T$hESE? :jM.Q^,}u C2YyVweg hd$Ca!b['T(ᰟMْ;gˮA 81%7)zx.pa2aI{\Rz8K?$ڄn 6,ƣbU2o/ auu,`d+.O^m(j7wFu"tA"LR+TRU䊥ධCaG2L.P6#U!4=r&kNR@O%gzQLI񙐜F?FﶩL*d۟2iq) cVy'i|{wLo-5g*Ixv=5!/2IP%sYfzR=1T{@̋V5+w_%W%PaMS tPX|0:|>|4"P{QHkT>|.jK'۽p7'4a'|NW8yCl)6v"!'9gϷ~^x)OB'ش-ab4gxfEGT J=΁oM+#(owR4l߻m ()ߘy4 GsXI;ZÔi\?2M6@t/Z0SN 52wQhE>Y۰DtN|4/}$YHM3g~uƲ[,aA4_ԟf(QhM;qaJM/}aw^_>oi_߄qZSa3n06?4ؕp-bo.q]+Xt28֐h6<~vM4!DceƋ=!P=J>#|i=>~\ᕇ{g"o^Xl.0qSF4xDz$б&lu p~h%Q2Ɓ??˳5l!zzQtfBouAMҧ'U~S(`f#Q ^h%a3~A!LQL@Oä,?.W#kt q䉿,|Dh9U: *y.sRC=hg0)WÅ>U}fh&0 vy"UZ2w"7Zh*t/'b~O{WЌ]XXfn;6~g7=$o<٩ bĜp8y?!B}EVۯ࢈_ZRjF2,i dwv2ܔyL9U~X ģ?)ysV7!Ga#)RĀn')N0cZz"[kyލ贎"%ҧt\[Z#w 8szO]XVJiw98Llz_U1\}QhLk1(vGhXt0k,G,fzTym|tm" I(X%+=[X/tȏz{I6=WЩ̳Vw3 Tqm~Axˑ"z_p.1ɸD4svGInܦ<@]UYp1@N`.Zmp0RXk0+a'Lw&.-]QnvN?j;|32VǸlc_m:[0ZVHbnD52?B?kUSX _vވHG>,=%)>o<nU.VhJ&ƴ30`&?ij ntHMi[CwE F #)m&-Gk^ARYI &XӀqImOs 3Z‹'AzPFnK%=)l΢\(Xc* şJ1rSg7Ak\$Vx}}إɹ<ҞZqH >mJ|.S֍\IEEN}7 hIGJg˵SM;UyK=n.\v4bՃߤ8CBu13o ^So\CeQgL Lq/YCniEt#3RDT"Y H2<=.T3nR +zm U@X.mTNz~->w9AրR`BRJ:GA|`b}=LԲCl/&CFX_go]7DZ}Y2ujd+-脣4mqS (? Fz+'(1h|쀾ƟP8 HaPǹi}+mu߷ n*u4DN~^sխ9*P"P[I]5Kp š'kr Wh.7V*A59|&V瑨? U9ND1U q|Nw΋.2qz&l3?1>4ҩ_:֥DL>Һ!~*)8.{׭ xj*m>L04-OY*04U.ssSҍhsh^9E twϮ]GI>X.;Cqe3 ]ѷ(!C=Kz^9Ib>O] ߁<nm!t]R ^T V+?3B;uzZp<W0NCgvJeM+ĎngnV嗚ÉnOzXkzAԔwmhGvcx+.4>Cu^}hեZ9g_#k=\[ܪ,xFep! =x.h. nlA*-fr*:YahpӔҘKqZy%ݪ_5ikXD+S ."`l2;K-PmPdxED%j%zш*pA!F#BiSWkQǯBAnf-IƞxD֦D['4f6~*#7=s}\ݴc9LtIȂoD;I}nް'j0X_τ.{ϲY40xbyIŰ#ˁUք@ T>DZ<*:N.ָ']q-꺤H]`v<$+BYInAP,U"1=a654Z?3Lr+hy ݵ*yy,!BBjqV202΃vVg Q6uRHxG>1^9yz{HpaZWѾt)fgIENs;dqIk[r6NM#!E@Zr̲PinQK"taJ$@/*rD `uJqb@}ȼn`|]sK̂ g65e,}0Eќ'oRI+ *22#TqM*&|F5,*"ucmxvlKJ*ݪ4$XX!̠6~noi 9{("%n [* YL[@_#SOWT _ ^r #)rPCiB Bez*׎8eBHvolA8Cj =k7@o ㍠t z6<4wnox]2v_8ZS&aBQմ,Y@;ku0 Bbe_BcB7D;㶊!}:l爈Qы]u8ѳ~6H#T5ԩ+T栿WV~NA *;1!r1r6p ~>"/si!ПMZԠ;Ruܙ)uUt`ÐεCXѺ/;d'&<_sKڪАFgKl<%pT-{19tڠިqoרm.ta̚s{D4DQZ^W?]12x>NKADb]lBC 'uyk髛ze4p5KH7F E֟}kN.`kCgE'?1go{WҸC8'>h1)%τ %^R=M*60) rz ?lA:ABjN6v bEUyS %tHt K֗,-ɤA9Zl0t(hNVocJ?Llgj9b%}cwZu%'+g\8ɪFMs1M̸OW*Wk( 6pNV6sB l%2wy F\a:xW뙷RF2jm99= VS ܊M5nsxwu6Bc8LLģI#gT §i4ixq 2m9ۑX7)wen endstream endobj 422 0 obj << /Length1 725 /Length2 16161 /Length3 0 /Length 16663 /Filter /FlateDecode >> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> endobj 407 0 obj << /Type /ObjStm /N 71 /First 607 /Length 3024 /Filter /FlateDecode >> stream xڭZr}WcR.w.SSS5qƊ-m^S2|MD~1n8@s#D.QLJ{.*j¹%\>`L$BHn@{՜p\ s""LH"5 p8ą AqSQU'ɟϮ(D`eS0G X7S88+ѓ<^$7[02w06tbr}z@={zB9WN'zC?; aF3I i0}6yd}HtJIw>Β(yC# "jO`NCЇdG0}x21 3hdiL064 ]Eآۻ{&3Lr3hJ3o`14J ]e<3i6MRCѿwC1iHq*(;FGK ?ڻ{w <(KZ}H7>VTO7[ejVf$&\xj#2X>t hzؕK(fP<.]h.e0 AU~*>S`k,D&$ѤfɆK jP}gJ>Nnn,%N?# 6%Pz+|EM3Q?8lÁvkOjH vY5y?\6 t2T°G9Vj'{z }wuX̶ѢBϰm5eKF=Vh߱6Wvg&d]]d2$Er-ǖĂ{I{ ALM6˛O\k?g/yʎӭ[n]|Δ9xߞf#wgÓ1N{'7H K({O*K@ucc$["tx@Ç`+ȟү[%X />*~|2x)Z2=,G zpGs8˟2C)X>9?M|iѕO.Nk{ѷۛw~~҇0k_~~otAkwo/o,); rs[ A>-=|UD5-J{W[t%7xtyu`wNݵ-Yo;w _ t OʆN-[^ wZ^=~|R6Gou9_bwh96T78[X\w>_nm÷_.|-6/:U'"Y@_s@֛}ٟVAUh28c&K|-sSlO MRƊkQ *m_AZ6W\vm/v({! B~ ]^Ww{ -D*Z`[J3 1!Uij gBW= `/w<,8R?؇HU!?m1Gty>B)Ujg*JU5UYMSiJ kҡ =_6:f25fTL7JWfD͊<$~ܱ)*SʍME=>lXS =`1S'Q,D)z| W2O Emm^U/V%z+9[l; /WX/Uc&Vg R=!+߈Ul@ozsLw'yoIFL4x'q&eߒ'3)-4|Jm ~@E0}F>|q|Q$F 2 UY*ϨRsyUl|anu Y1ާ,Xh,yA*_k>yXΣ1B#D5{Y!kƚxu*J&-rH< ƺDc)cU!U1I.(( Ndnh'L/8ћﺊ-> ƒe[.U ROLĄb޼; y(Y ,7 f ˵^?oHay:UoJ~a$t8y;gޤ9H{> 2?vܤ?~ 0K0> q"9ӧ(wPa4n5z&oMG&۹{qs?@g_`õTVnY[ɟyC2닁S *T[GSSsHcm C-[,`!e;ynעuRhVbNJ dIuHj`Ajm*J1ԫ%[%p>Q#<0-Eh+ilxĩcb) WB0EqI}rj nNcy!g!8vؚXǵՔ {&l=X%uO:&fѨځԜF=wCVu8 \Qrh Yz+z߫]^|LQe򴨊LZ`N\s6|kk /5nmW@qRҕ*cWkc_kdT81xT|z4TU{ݴ5\>|S7yu0|/5es endstream endobj 446 0 obj << /Type /XRef /Index [0 447] /Size 447 /W [1 3 1] /Root 444 0 R /Info 445 0 R /ID [<326DD6127F73BDE7E5C3DB5B51219007> <326DD6127F73BDE7E5C3DB5B51219007>] /Length 1127 /Filter /FlateDecode >> stream x%KLWh<! "" (:jb:jBAMH4ANubҦvĨ4MlMcRc:iDz|Y{Y{BJBH/HNg;Qp\*PNkG*㨝`F.v|7c{@!FrG @1~rm%Yre`/sZrrSV\3Uk&!P AP@#hj!iaue(堊T-:̀>_nPOMQ{@(Z"P~p+]ЃN3BzFW*˦$;-eLj,|(ՠpC<pg.K`LIpL1 kk0j^tnY wy0cqY +  -ܛde _PRH yb{ S~Gpé grR$^dW^haC*xK-l>@%\@x';v 8֫-@ceal|rBz:SY:̱c3li N9%Ԫ=(t<=fqHSipwվ)sCJo|جMW5ǎY4*#:0PXz C>f7Fu }sb@.YEi,uiAVojb N@[X`SXb@!M+Ҵ^gQ' i2ʒ *m)Tqxp:?j "V@%%B׋=$hzCQQPW6p43*}=t3 s-Fq0&eppEIiKq̀Y0gI/z%kJ-XaԢ%KR7,iQjɒZTGR7-՝e7n[j}^jRHZ:wY2? sWaK*kR)KT?He,tM*23Jwkv08Ʋ݀$8 BePש|DZY6*MoO?_ endstream endobj startxref 389950 %%EOF flexmix/inst/doc/flexmix-intro.pdf0000644000175100001440000131357613740572321017012 0ustar hornikusers%PDF-1.5 % 73 0 obj << /Length 2940 /Filter /FlateDecode >> stream xڝr6Q$I&lN0ɁiY5x%zJ h4MG&W< <41<88Oal>.~;k-륵2IOY; ןM8'^x?CÓ?]sOA5, |^GB{_k&^ ? p0 FdUEaVJ"?45 Kk PaCe=2}H/<@Ba1!O0q) e{C g0mB[0h> ƙjJ1Ow)Soi"b' b_WNd|bE۫FA @iELPm`-_Vjwɐ_0aAZڰQWȤtM|:E- eheL*10 BIb?@VPk-XOC^{B^d|d}aKn۫#axל$?4*xaȮNƸ1f*{~U閤ys>/OL'TR8 knSPwL".de3bSGDj9ؙk(LJLMXt']mŧtA*laxyFO "QlEs Ȣ /ʖ5Au\*GW]bqaL-2y.řx$0kHX\ #2;8Q5ڐs  D5ī4^n|flewFN/LӷY!{6ֶ 2c$T+g]!,{i2B/GJS EP\ ɍ x"ZhVȇb[\pO8XZ"VQD~ tCHkK*IT> /#B?rM-́&D!+IRxD"5Q:_itpBsfBr9j׎ŰkypFsdth 3Z+:h{{n&jw3 ԹW:z!7HCьN$Kĉfn4uL4,˓ :ݬ յ2j* !$gPե)J ]#BĐv@zV= ı})QCSƞT_l`UhbR^%TPAkga!VRu7e~^J^|_xT-{\+r*58ѐnp3ǥM3oɾ Q7|&Mwڔ\Q⡥T!P9qrvD"Og!Vnf/xTdЕwH8_c %3~ǭs.4ƴjCprї+Nz!D: šZ!39بS?0i$^{ud_{AJL/ T:& R*蟅b4gv\IgЎN=,R{Yy&.Z wDƩDהXPxI5 -.O{䄳5Qg0&5ϊ Ɋ09N/l1fQ1cCn}"[Ia%ϬWo(϶/9&W9s`.߯ #D=;nI̿Lr T4-o|ʶùCjiV$q1fRܢߑ&pEގCjsv +eiwa?5 j\b2 `+@7e>\E=CY:;|dk܍(]N 5x6V{5~p/\h}5ɧ50Bsxn` V'1svq7hP_Nm\Ư=߸`?VΤ/LVH nweTf潦0m.Ph~LG%D~>G'I?^ڍoF}' i<,]Gڐc/jI2y=^r1d)0UD2~=[:.W.7U/v~]/˖ ;Pn& 0>ftW_m endstream endobj 114 0 obj << /Length 4008 /Filter /FlateDecode >> stream xY6= VCբ/&n[M4vglOL_EiX)grRN^=ͳ^rʢ)5ys3jRWuјjf1y~y^UIWԕ3h+5{{W3k -y]W3c eq?\]t=]$}:J*Õ~=Js ̔P~;ǯY\n׺np@VZ-J;p¿n =$Oov{4# ߜwe#vKo˪XOQM2|lό.  .G8opn} d7WLv3,`7`n.>[3|q)*JDvzʷWU5msw- p}C G@$ cn{N %pqx.1hl\)ac m" A=!n rqU-] ȯop]q+T]HpۯS#>{4%l龽/xȂ?7>{qgzhj#7j)1)yIYPUGlƴDv={8$D$/ЀO5d'v9em{i!',/{P@hAkFo9f^^ &Q :%n~",85.@Wľ-)OB9G0`fʁ1 R,2F@WdnӲ*Cg\Z?AU])a:9ݧvBЫ^)f]cY۽|mi<"dWyVb[6`DR;bl҆#{ȟ7)~WBY*T6o*:!0,̖QB [I/x,(1BӚi;䣈IY*VmDUJsHzN|bЋߋd)ńḮ3 ??T* 4P Ou֣l|nف$wd $ wb] hMU{vl7Dr9av+аZy?& ,x5^`EWjܐ'q!]VQ0Nt}#ʷwUr6=扄?)i܊.BqbxQ[uÉ 1DZ!N~H`%MVX ,}\@堺Ein랉q#K# 'Sؕ9- )~߻/ -MYsvM*`ٽ#RnH=,w$LYmxCtn|&4-O':'گaML%6HoÉ4d ,-,0 F(,VJh3uD5~2}Zy.M, Ї b`H)KbN-ްЪk|o~9~: Da ”Cx=8%j L{%Og5h 9i& L$ ޵{v#K¦%yV!ŷ遜:?1)R>+)r?z>b MVL?> !MgP\??jCB5%FJ: 6)Ϡ7| ܅Z.SXK]R{y訽')mf̮X@8qĥwȸ$DLP9J^LD&9Jρi|kݵT9J~Z@$7ä\U&&Lzp<]Fewآl MCnb+1^H3O3dxdL;;e<W3Jmi,>|Qy\J!2KL2E\UO4+_c= SVP;(F>쳅#/Up8~l`QJA]?V-uf%5X)|DW(4hǑ5 Bm>JkQ UMMua̓V_Pm4n.emc~Ү$jTa(ЮR)IcP[X|Q"C|a({N_br$.>%}3 ^'1uNax|κv{3T<2ڮyT{0E'Q=Rr%>3Yc$1ib+sn:P0jtCS?!wQI]Y*#(9'";lRf&ay6ιO}K a`a (K=fƨ۾1OdofgeFU&m}%>B2\wR Jjca4A Cؒd؜ߤ.6k0f l/ᰪvatF+9>U!$~<.72YtO(J d!KÌaUCF|R͑ɦ3ѥ/ RE +AnmmLgvoB\7%E*ɤo#pѧ˾)a:5{sU|z`f9{XN4jG"yFV]ߛU1dBZI5C<U  :DsCU߻;FMa@f]@+͕~ Uo)8}RlׁסP5C_$exAl\iZ+T},4)7p4ܾ,E=/0rYS>^E%zT0;<nO9YMŴOFG M_@y%qWZ4I$4\`d L1h\ェv&A 6 Rw槬DfkR š4>ݥGT20;EmY|X| nWgYWZG],]eIW!I3*A0Mܥ7 ňz)NWҸChf#b&oO_\6B>\P9]Ż\K+o1-kpuxo,Av.^y3EGZ= ||_߀OhfRP w/YGUr TEfKԙxQsїVꏅ[oIGH1Ò6_`;\ endstream endobj 147 0 obj << /Length 3481 /Filter /FlateDecode >> stream xn$]_1i7n~ 8kNFcwyk_:H6|Xݬ.uUO&o3QWm݊DZUg\*3|;}sRL:qC#nz9SJNͮ?y i*i`aBLfZL[腛>^Τnv{z%[\mI;}D6c~}xH5!C[gpCz}Ÿk؞AT6`'v}#jydn xi,㤽H!L U27+m=}BDLvzh@3["{i~=7jZ]45@v'ԉ!5hm+iL$uH"A&p&!^W<#ۄ|~Ϝé R2-J՟3;h1 fLW䖗;)AL+4)̙z4ZT u qtJ/5؇:28*MP2|Eg2P6bPjSjqC ybD\V+cX4iH&&-[LX.܉Z"/UZK0{k/CisFݗY5=uĒ]d7fy\&9)15[֋7]om~ QyE@7peO%]PSF1T@r~\]WCD~.xT @I4+jlX*&  VMo'70RpOlr??PJJ͙TJXDn~Gykdaڟcǽ 4VSm6:Ny#R˜zӼ"(^,&_#*w#g>|̈s 7͐. ||F JFܫZ+}I/<0l0r,,&hmt nXv-! fz`+DW9ljΪތ՛_u֙gQB| Ӑêנk|szr x5ZGǃ-%Ersow@&';1u98NgmCÅиmB ݁:>+w3d-jy2#Rͺ!g6@2Iģ>##!Y6$I qjA2 > >CƇ\ z!_s']68CUMB):y {^p:۝֑A"9'IM\x;Ɏ^!mӻ$hƺ Yc2 x th~ Aqoס#=nP^? teQI In%_0W"twA\^a.&i!f'݇c-y\ d)R8:/(^F 3),پi{ i^eCk}"%uLJj'!> siI`C yۻZ GdGR]6i$ <8sˆ =ᶗ+0>B-Zھ;?{y T6Ru:KYDYDJhjM}N $&E6>@]F$aT'skG_0oThZs8!tj9`H9e {NMЍ5g*Q4gOY]>qJʍhj*a}:_+i"U .jX}/(VZ<(ԙcvQ!&f%%hR_BLn pQ.6_G;EUYE%\1Gϧt͏-)Td'7|2t+ДlV5>qN.sHTU>>Fzz{> stream xڵZKW(9Q&l> Y$paG$’G^S&q6 _ZbH|,YI\'u.tQ23,~}iC4+fh/_OÛ<=i2\Rb8HH0} oā?+E0Z 5Vё/  ѳTF\pǭӞ9+桁"f[/(.^Il!QTlC\@؅["̄-qN`Kɨ^iY4p=V )Â(ԑ =du)e\'lByfw҆/~&ig'2:(:SH]ldǡ9MJ0kB`~+t~pd&1`20jay`/Ro5IXФ׳fnRc ŖpgP&L3@wi<03 5zΛԡs*/bJ3Ui![Wqc5P7 iP(O^>ضIʤJGiJrUm)+rq0 ANT{cs g; aV$ë[?iW"7X䋂𧛶Q.w#Gp-iٯfa݋Iv Q:1 *׼xPU rx>^ai}=' .')qkj:0p/9Gw/r~%6`3:y6:LgM!K_6ns3oJ&g z:AQ}3ސ@wz~{37þ3 KG;= oxc-J{ oCJbrG83ӨS$&#ڦvV;ndNx /vʼne&r$s(X H WM}V9P&VGWmlFԀ7SVa,W&p9nȏ$R;:Y;Y2Rd5>&8v+R!AؠHgCEljԹmUtNPYUP~İu\MSyjVhӀ7Fmf =$F2჎׫Wt?Z$ D@cHF]]E>wT͆NҰi'*ֹmI|59Ic#Kt?&U#Aί%ZX=;q (T&䇹J"-{\)_c^ym"QCIAA;9 (Dj>/gqʘsYvN&s ɥW-N.;\INVl/9ۡA9!!=|Jy=MviJ|kc,E"_'mWw p&kޖ)$+ia |ld+_8-p׹H"?ESj`,T}/ eV t ڴ*(d6D[qYeYTؙ[@KЅ$uY]Vƚ8Smv)Pk'K-pC]We ǵL82ʼY2thBaKn|duq<\VVJ׺_!`k8(Z zu'֑s6sO'_9u1 f ]<``f~ yٯXow>a+@Ҍ:a_Sk;t'ad-ZV G4vc4aHർ[nJ"C XMx4Q/} tιX*|7c,ĵ^*L诔O) ?72?̰u @zj9?;⺞tOH zFI~ kU`Ryn\hO4cjob'uȭ̸sloH endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 813 /Length 2555 /Filter /FlateDecode >> stream xZn9}WqP,I1Yfж:N#j S}#͸gQMb6I(u D %FAFh+Ae::AQ :'ttΣ%+/*K’'x5bHmHxbdpXApV›hAi9r4N`JIv Nx-:y(MjgN<4x`VC#PPA#L /Xa%BF(p ֵ e* +~i`(TgfyH N`%(a # x-^ \cB5&tNeG' P+nBMlz!QECEbQZG^##6Elۧ^EM[ضhVoVoVJl eT)fn˯˲U:.k t\@^af #t{!eQ3tQ<{/ϴR6kfmTˀi@ᏘâK C 皌C&d$ݰ`Eu}F-* e[&٤*I& ha!bf`D M'轱}0[^l$Z8x8`€PH$N'/ly!缀ՈW#z-tOK|J'A5 \)Lލi,.Jks^)$A=2g%V-*2Z6D/dxRi-Cb8GkO@]Z)!F:_\#gE5;:]_KLom#֬b0Zp X>:-/bG K0 ԇG&6!y@F> A׿#%(bE Hwt3d@jg4#c1!t aE?DM?TY[>ӏM}ܣBD>ǐԒԒZRPju#UڒRwJە+}WT\yTޤIA"f,xC`,{Dӟ^UP#A3:,*^N,I!} uQW<=:>#2:=be{"Iqk3η7rY\Iw;AzN󱽒6a81& $WգCe7kaOT/׷M0#:)\ڠ2V𷃢a+#JxB=cQӇp/}`h t$Kp^c}0mNG4tÃڄ y7O3c.$ @$Tއ4UU2;qL v B= llYqgƊ' =q sk ; wF/Pz>0 _tO _ &݀UG25 Հ%| )ߥ؃톍xIqi>0'a|_I$Y+=_:ߥ|z~m{hѦo{#P^4! YQdo4vv19UHz"N3O` Jc؝qrSD-j}`ФpO oNt+14d$߽~!bp,tݤ]8}Нn 08jª؟~v`|A 6QNI{Ɣct'lfKYQ{JwJ@깾;]Vu)PA~KXcɶl t{3 R1s@4qa+EVxBǷ`4 lyD:`7fpol} N}O 2f$oRj{%c7ƻG`?b endstream endobj 173 0 obj << /Length 1659 /Filter /FlateDecode >> stream xYo5=b (R(*j+Ԃ4ٝ$fB'uTE{}zr1ѓ;=zUk39=)X)}j'ɛʳd-h|jr:sf/[\N|j_)0!r}>1ryavfKJg'3UU|Ʃ,]3Zwɮk+d:^٢Nbxr:6' 5GQ n}bF "S/yeFW^`RZWI[6X4m2.bQf>Ȋ>qh;ZkC+RfJ$ UaK8:Ge˙ȍ'2'TACZ"'hج0[QpP j{=I?1d~@dNȽ&G,A尛g|PP,Ѣw 9:вKak{5;E(:獶6(l+&H gLJc1E"6.&eJexVqӘ _8h@0e2Ԑ+v,54D]-~n>([j,&PJa,Tj/ Ԧ(Snk4_["# +HaT\Z'M_8AN?iBJ\`:)Q6kN8”ft9U ϲ]RLpO¤ojp|U8)&m y~>} E }o8N8X]ˉ5<&I)4L[T(Z*ˋT OvIyz 5l (AJ' iϜzcy8#ƗUl_[*iw7WrLf*xLnV+qm䈋|>,DMš_Uno3o]mZo> l}B(J]~QZ(-^k~}"#`ӻ7T oy(>X2٣L􄇔Hr~6N?3(t1^?lh眺[frd,CPL8? +z;>wm}t5wnl4K9 &g[&E|˕q5b[" hw2"ԥR-/E;fȉ+ ASN|) qK_G5v\oVm̿PV{v.2 T;ƽ3M*KmἽnrK}^ v?b3sݺ[z]YGWoŋA̷9V8+rYZ"*AfDzW9h{ptB O z)"x2_>"sa9SnOҹQC Ѿ X#4d^~>?CM>ZxɚZE<|wRg7'npFȻOD!鹌.*V+~x N9NvfynE^Rp;0 {~;0KC,Ϟ&- d>\!+<^ȇvt!ށk cKYE] 7B Pۜ"Mӣ! endstream endobj 187 0 obj << /Length 1881 /Filter /FlateDecode >> stream xڍX6~E*5y Thipߠrnw{Yr*Zyx7GGHG\<|iudteUTpч8y…Dpx˙wЖ̒,4vRk-Av<̒8;!N,RD*yEz4ZyBRzVޅ׾V6=-+At30nfY JLLVAos=Rc'Ď59ѥd@ORa2kb\mnHGq`C R2q/=~~@ "t_'SjY@=,s7) r$LhsZ <7@@(xKp)Zʥ-nIfCn9H>o=sI{’QX\K>Snü{*jH @$Oq~ɄdAzO*z&T*Y9gz|EQ4# Զ-z (饦~,ۡ7B<\#fI -U^@zkj ] l?5A=lGJ0ܕ8q!twǾХE-5fxebV[qϪl-$Rbt !\OeuE{dov|@BMiM oKګ0WO1wQVw%}w)IK|>v` חxj{$94  (*.Ti%#:|7O=Iy' &5hQQUcwCf$D,߻)*tƸB&/Z;[ [<[I~]`k덇M|OW TOTϿn7[XAA} uN#8_ ,:a"-] [~! a_n;( /ÀSiH\~90KٜQ$%+!\Ԯ#W$۶1&~s2q.~Ɨ<0$WQmDB<;~ K'ZqkN,x:33u+l_2ɝ$&/03ԳA'9i^~^/=樕7 /Y+wch>S3_.* XS HFT.y9S76)RŞ3R 5' endstream endobj 178 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/flexmix-intro-007.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 190 0 R /BBox [0 0 864 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 191 0 R>> /ExtGState << >>/ColorSpace << /sRGB 192 0 R >>>> /Length 16444 /Filter /FlateDecode >> stream x}Ko;r|=;zNR$BetAwD~r}ӝdp>UGlhϫ<~?m<~>hQ?[>b=m]gG, $on@,E\rY磵[|{BWַc1JzkmB(m9Z㳭 nmo[eol?EsDŽfL}uB{Eb,-9=϶<I**7Kx =>WŜQQb]ׄ. G0)^A/J݀XZmneDv1F*f1&4G͆!mI+i!yG{tۢK.V[F9X~bsi" sߋ~>Wfias$Km%xc,>>Kbﳧt0Fa\~$>ku1y{gۢK.V]-߷_s;ssh!ݵqRxnfǪKm%x-cNY~`*}L,8?[1 ɸI߷Ͼxn6Eȼ{Mum%xcgεxWlQ8vOj2q0?,^Abd3`M;km$%Kn9b Bk1;F霟s-sQ:n춄$ZdzoXku0;R7 r-"Kn93:b0b!qp%%@hLmS1s2|Dۡ6tO5؜L߱W-MTcJ݀~z{nX%&}P[ >ԱSmqs\~|WPPOCSW݄Xm.[9w~Do1c7[6{  :R\!yYum.Iɉfg[0OgO١"t K^A/@/V݄m%y_rkcxBO ]Y|𙉘r3Z#$_@jTIC*H2F**f ž5톑+! c=.zG55?,-̜[vV gۦK.ְ7b: \yXQO&LBk /׽-KnXօ},1B|˰A7"[.ml۵V0 kL RnX\7 VۢK.V[;vPtvQKw8GtK.,FI&a^CsbZxw =6ެ1gۤ[.~7lX76PWRa D⎉bzzo^Ci$f*J-y/JKm.[o30vZ̗\m)@EC;J^A,y)˺]r-xlE_cs/yhA~󳳽O ڼ3? 4]r%},g(vc7k4>yD~c2+pww >-"K/ 0W(qpҲ[g'}.5ٕ#V-2>K.a_W<ƌ0BӍ142ĞM2y9ƌc6'r#ǘ]rʝjK8<ԽSm⊭hV66 F`8D}b1* =f!:RRJUY);O S5 E +EIw UQ`BjEȣ3ِ=Έ47/9Aڤ4AILô4/{%]rʭc-c0gBg7婄 G:y3gp=u3M"Kn;3_Tv1Nv*ttA4ns?&3Zc7?;l[t%*=G.O0vqfw᭍!{GK//^C۞``Nρ&X {?do[;%i5(HL8}>"a^C90@{pP݄PZm.^2:gaⅳ10Fa k1'\V8T7!ͶM\rkh41聯Zk>̀]V[RO @d|j'MR% v>p>s5gV~iHӯtjJʴ;nb?e sa޹U7!fĤ}2I[Lq#:<{FcγS’"yrZQ9*FY+eRUY=+!ĮO4!& :cD8c^A[Fiss[Km)y_rK)jD^#PPqOE&|/YmB}˴5ְ_ sAF#lp~vNyg'4;8cde݂lw= QIݠ`k3;1''iMPm"Kn;Ο75NU^6µEL]n.sh{'a &>a*Gzd<5梅ȕ7 9k^A XY]+]r%찯9\9?cps3)yѐ?H^A{Yc`&/X\JrqۢK.VP`b&-} zt<=At]p\nbhTxm%xV6j9OLBt\B,;bBI,ؓM?o);MٶTU b 'eF*x7 ~[avA-# ̤2HۤO=4R%` &]6z;b'Ĩ$VE"-^C]̥4FZ窛fۦS.VE'p0_tz<̓gEǭ7['t0e!ZwI!_Ց4{I (mOQu 4!ҧ,^C=4oҏE\}ɽ"gŊ&9gl!F1VB\]My_.Kc¼;w{O]r%[eӱ2~i#@L=Sҕ$^A-}DNވ 9mN[١cȔhѓTΨy22WЖ#R9+~9"ubim:2o[儃G0#n2\`1 &:ynY/H^uBi-%%Kn}x$o,_q]Q3b/Eܱ+Jŏ|r=2IAvI!_$mHJC/&uJ cK^Ac ӱ8n+-Pm.[v(U?`QNH,!7FLIӏ&ᔅ]H%ɺ&r%F,&9g8`\¹AI}~TIWЕ9s0?V\u16]rʽC3a90SX觥s\HȤ0}.6ĺtB][nBtȱm%)y_rKO<`Dt 8Oq0Bt;U##Zӱ`V@{R%+\ ;b7QiDvC\[1Mym΅5fcOކ<e*=؝Mf0<0#L0d IbF7Au>l[t%*r ?o,1|^Å6#b[60-%p90oVubim:2oۚŬ+Wh8L;|*m+*ޛٮdz˼Un5s=G˘)U|rjZf8gO*{táa^{n[t%*=~ǯ ɓe]cs.f]%=N,^CkC(Y{sf-"Kn:W s}mL6!<!a\8l޼5ĴP{"uM\r/+%񴩿*ܴ{u!J=:W˱ڰ4BU5ڼvk=yήy.fۤ[.vZ)LIV1HZ#+;о 4g%&xwg{O6]rufFֿ*#hSn,Tu\p;"!Q5=oa݄m%x_r;;g?kbNv+ŁY:f#G3nk$qcAN_1ȶE\rCl=.|+.]o L&s?1:F{EmbR.^ொ0#k)pustC'o0=mEcW݄ٶK/4&!1bjL@3 qS2Qtȳ<%*t{b.{Zq6ݏǴMg0 =yoPfj-o{h~+`y$V0GVo&6m 6`mѼx* HIAߡxI\}ɽE6>'XK.f7M$΀<7XLmo^AXs(nBl[tKJޗܞ//kxGb3x~Ұ&13!:J jnI tubi)K.V`]^DŽ<4)&ĵM?qy5bِT(ރJc];M\rZnоoL'qqxt]"޼;bݱ&l[t%ޗ֓!թ[c/.z1=tkeO Sc潸7k]jt%ޗ+9'GJ'/.9t%EJiaқ(y1ʺӡm7-\k9u71;'"2~Ϭi/fy7]r%n9>d:< i֌ Et' ~ ^Da~DAl?bӂk!&A%nϐm5ïb6n|c%hs>x~zky`q8޾TΧ^5?J(y9mfaȌS 2$s6( -8MO`աo:d¯#OD q&&FT\%b{ʣFkmYCíT;})Í8=c2rxcQC  G.fJ>~ל[i=8.Y6O[Y6:oB)p-k6 Bo6L٦'.G <s[ߜٜg~xkR1gN Wwy͆41Eܠqm^H< G<+B++kւky|WalEzNbEk&AQC\rԽsF -UcGpm<0p t` _ًa=X@lډ\{< j?UZi;:/ m,a6<#rưr, NV !e&W!?v݄p-Ͻ\H\`oFZZGy3m_of9pB_s瞨\G :xk㏄_ǰPaX x%V+{pEc\p-^lȎ#ɭ`DQ.:^LF2` .U~ fxw\ e,6UWy78E?p.cX&Q4N# t؂ky q15Cn'\Sjr= P<.\3!.v5*;UP#f<ōWý ft"+6 \k6z켭tiPcA0*M7m|A> | ] ڲoUNo&\p:ZY5/nj>Ư_)}cY5x1q lp $ B3FwkM3,s|?ty(լW⁳`VpÊ&HXq{o}/,/9ZAI0 pq,2ߺV 9 \sTDnH;7/)\qp-o61(YW_O\ :p8,:xhµi1wy*}g=nBv^<ⶮn*uT/{//I~2,u鑍?ˁN~2`-/X *<\(;a5pZL=)¹<_D_,<Z5 mzaPZ*}b> 8BiYoTޙpX㰞cky vN.Nz =#7NVOȥYp-!iVs4v7/#1*l‡ۄSU*li Z\0J"<}'X =)p-58-^^P|kodB!y8,H:E78.pXUܔ~ꜟt?N~[UGoE5 /g>8ܷx?7ԍ{鼸.{㙦۲J׃7"qtТ69EXI:EǛEWzl3} .5H_{tǿ+Cl\(8?|?ƌ c3>ǯl 󹡗pҤo(%`{.}GOpDjn ~h<1;su_;lp*b;@SO;#N;%4-ޝm.[f1tpSbEC㜡;oV$]w|ng`1Yw&dۤ[.o Oxxj.1DknK I2R潡nB,ͶM\r'>÷Kbз,|e]n$};K-ou9_1zN͇srjPymy |I |b>d9_m%xܺ2f?$T_}E\vi&\cӛO^|ta^Cռ Mum%x-lcb|#е~wAhAo-޼c:xouBim:Kn_)K@{Cxlr{;y ׼CyKY]-nte*yR]aߞ8~?q~旺.K.¨oū~W廨m)x_rkhW ] wcսr<*:N!+~g^k/\+-; ]=wer-:Rk(1[].n[t%ޗܾެunCK1wý"Pi>y8k>Z)*_[Jknhq՟r~9 ^AeF5yVu׭m.[t_^>ҫ/ξ:\S\aSouR]k~ )*_՗C_1pBCWY|zLű X A1GU_mJiWdH5xEˉ1_#u&nA/Rt+hi;ζE\r{leqmdl-={<ʆ~ӝ&H7l讻nl˼)2ª4#oBUFpȋ4 CϼT ]RݶKUn+7<0Ui&tꪓ47+(PB]F{ơS]Mw]ޙ&(@B]M^{֝%&r%$v$3G$)}Bo])Aޑ:h^CKb)dۢK.ok.o1_X֣C}t~1ǼuI\}mxÅ UF 0G`V;;! Z 0VbF\]`]=$:2oEcnz8tCt -5wk'!EO=|v-o[ Ƌ3l XTp7^R+G1Z w*╂Ete*p3d\}7{8kz$-^Ck q"^!]Ƙ6r%ߐqc(Or#gxsgC^C#y+YUw-jte*X8yT_c(n}9%o=Wchduem)yvU̓(`3}Gݼ־o nj_WeWۢ[.^Kd=;$SzD^qsy -=캗I\}ɭ·w1F}+zo}p;/]aߊ߅u¶M\U%c̅S_$q=C/^#|λ+gXsa'$hichR7VWȞj/[Ev_:i+bGCoZ{mѷ:>_rk;ںm~^51,;^τtx8ȝ7ͼl1nAv-]Cr{]L|!hǁ(; {1oGL=g>hīeMQ)6%S4yYC1%~eJCsм2Uw1%նgj)`>own#O!T|lպ>ҐʪYT O f[ޔ;"{-3ۢr'4y1ٶKUnYf1SOe8Ci&Z3Rz:v/^Iޗ^y)b yi)Ү:E]5E07/^Sm>ym>n w|XރO}|]Wݍ-^ުjt%*K\Gchv\uoeǎ7[zԹ_Y( -@:tztۢK.V>%m ;)v:.iI9B0,m^] im%x.n% {>2{]3(|+|&!Yw/jtEޗa/+enaJyJy^Vx5_X)j[eܿR΁j=C 7:jjY}ϢGadW֡.֣6rʭ1vk1'k_}W] 1f ljy9\cn[^cR[%DDXF+(Q1QKmQRY=EN:=u]6P2E!k*̶M\"UnNoM%%1P=1jKd9Dc- 9T[!^%-jteޗ^qn a"Mx o4L?9+hMcWˬ^Sm.[oyV&1̦{/r{5MI)*_ce~q"H\Mĭ7yP0ɧHZ%f&S,*ʁ>^WbgKK>\5B_V>16/]v\r[䙈F8,{ũݷȤ-;jвOrS? o{R~1g+$cN~1ǼuE\rz<%FUҌ{Ҍ:\iF VҌkMfM?K[n;Ŋi IyNjT%|μi @RCtKtۢK.V<|vY\j:ʨ,eqWвd^ZT{Y\ntEޗ+<ޚ1ycw{Irx~a *g9Y,^ꍥHuߵ׷ -/=L.{{( <#8߁cC1V`u< XPv|KeK 6TXe[j2Rb ּw׽6(lo]x%r vÀut f7NKLa Znc6/ٮ{ݶKUn-5U1 A ՠ*O:B+UQ`Te+ZLwM/p_|F: huSw+hc8|qۢK.Ve= # A:|U1.iKXC]G-%%Kn'i4%bTӑڙVF}ˈШ~WnEsN[^ `J{UvH^< vu_ ]kIdJK-U⸩%RۢS2eCü4I\2YܶKUnUGU1t=xvN9+Gx0 `^AˉGq䵓uW'N^rS$J,(NB8ؔe 8*Mac2f&!m%xv3˽+DwDnt1t>RNބ]{6Hn+O'NPtu5[N_bq5nϚW~urev˹o^9z7~wrWwr/r+Go{mыS_HXc="B^K8ۗr;tkg%1'rkm%xܞ/[Nkb3h=Ƿָ|*9 1 ZW-]^j^rZr{ӹrZM\:Voj '|޼BZmgY[\r;pKEʉ{cxjQo{9/E׼$Nܷz݊yu^ujte*U0]+SND O A!}^e-5TND onU]OD>%ld|"ʽ@W+12GqS<_HVYW으n"ySr]@Gq3Yl߾ˍ$R'я>_K91DV@9}s0֢NMQ)QKw?xkxjUq$| %Ϧǥ+7+q QCtw;vy?|p6%Il;>,:7\Wm xTR{vJdaoKVl;<<<\ᛕ &?jxgffJ{nv\۱bܛ\[є8kV¯5[975O=TZ2Ac_Nq !7rv?:|\+k^kkʳ'AXqL~|{A寬eq_^RO=0O'0_k~W?] +_;P endstream endobj 194 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 199 0 obj << /Length 1916 /Filter /FlateDecode >> stream xY[o6~ϯZI.a[=؊Ͷ2i`?~Frl (Qw.<2ɓO9;y򲴉ʳ*Trvhg2)mU&gMr2+D,|t5_~xvi ENrA/N4`^Ju.oO<Ɋ: xrwMib)Lg[Whu3eN*OV آs2w,xv5U΂g7@7Jó$~4^ګha"Mx2uJ&@GkTr9f)B8^ 6U6+J[.;Ld.w?Y>RA&4ܾdN k р5Ey}.N߬e* `jf }+8"] FYxra[M,=p/'8a^ŏ=C!ʻѲH' ^h/]0|w>M`CS֤cUk}iN1c*jFD[W_ flrzNh{ )v̀#MM<4hk6G0]= ˎr ·Oc ̑MP^sA/!_81n Sk=l!!E7Q=wl2v䊧=WAQOlҷ ElĔztZ? ws=9]Oh9{0 ʜO!4*+Ks4.t9Op(j XUT8E_31/9&X0CL15wJ[)M=\N@%X4@1*2m+]eRÐ)$6(.0I 2Jaz=8k(]ooţ*}*'p{{m8E@ODݮ%6 */UGfʈY/M`ј%qK70<qFR։$9'7b?־w=ypy#zz&^_ё:p_'*}”r&Ja#@dL|d=<#9:A3DY qڭ4Ү?0e(] : :cҼ $ w,eϰ`sH n@Ϡ9GL'Ipד% 2S_r"*MYdF!r$P_'Z{;ѱEO2A{_;8m㴁ppΩ B) x ~wR;۔6sOVf~!_Ra(U՘VSd}(1x*+gxf (4=Ӧh#JlV#QO*Y\ W e֕ j 8Q_$ā*c@?|HIL:loDv&դ߶@/ƇbOUDE2eLU@1DDT( U ӓXOC@`"Y3a '\ endstream endobj 183 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/flexmix-intro-008.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 203 0 R /BBox [0 0 720 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 204 0 R/F3 205 0 R>> /ExtGState << >>/ColorSpace << /sRGB 206 0 R >>>> /Length 1000 /Filter /FlateDecode >> stream xWnKW2YtW7w^H -@,P"ߧz1I&x|NMNu+}xzx >)п Ӕ +Ǩ"ZXoɛveap^;ٝJ8~uL]iF P4Za4UBy][Vy:Ez ?wA z5p;JjPP0cpQ`7H;Feqchmӄ+čqțnp* bq!2#+a nxZ c+a+ÄXd;txH#bb*žz \V*ΥSqixsTh*dA9MˢM%HJt*}Y˧eóQM;g/Ф U۵o'ֺte57hCV&ۑ GsSLJxZ™4!*.\=JȨu*D /Y9ZRNP4kg4ML|h1MsQ&qЮpɏyNAx v-XeC93YScg:ηSN{&=fkgv ӴpḹcBe133Q~a4ό(0?"zqkou: TI\8ژ͆Z|_?5n_%f+j8Y? ?_rJm<-x|{'X endstream endobj 208 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 214 0 obj << /Length 1920 /Filter /FlateDecode >> stream xXK6r (-M)" P kkZ+ײ;/(Eqyq:Y':ٓN'FR&J T|rJަ~d\w x^L?s<ſr9tcZ3ېeL!IRT Fͽ)NRUSfZgT 6<[ jg#Q4o}T.^(™zA+ʅz5A"f/9)hi5ac. UYٹVN<1y\I$/"$&ڊWΚy*~>e=գbG]w1&.1)mɼ ʗ:`k|^qjwlK qu3ҟ~ŜLaJ+9{AVb]57P/,W˕M7 xO%{v *5%O%iюvNL*B2^̱GH9l*FTڸ\BМ\*wו 9dwsH-3gfTJ*Ԍ\z29\1JE~VƇ)s11͸4=lMۿa/kӯ5&Oz1P&xq-I$C-]qt%,9켦3~zmݒ @T}3-w҇bYb1.D]Qϧ wb@]tzD(}ybB.l!s3j` R-TuNQ4C@ 2e1^;i r^_ ?=Nn󨸂hہ}7M م.$jc|S z Ѕ)(Ѥd7Ny.rK1"Bcnh[pS~=%ݠ%BFaaҥp+x~^-Y6H0b#<=Fʐq[ gP?6rU5lPL ˅l( f~Tħ H ;A"y(Ww&;YB>8=0  egM~2O]|C<=}0|(&h|kԁ0ˌ1 p':$:R4fpqmوKq5Hp*`VDW 8m^92XTLx9#MBǝn͕x~\M u)un+X|=(K+ -CGw;>O8fRcP܏^ʹO bDYo6(=)y컩67c$> /ExtGState << >>/ColorSpace << /sRGB 220 0 R >>>> /Length 987 /Filter /FlateDecode >> stream xWMo1ﯘc{H48 |%%g;ؤ[4l3yoc=N)|tRH)}nN^kY^21Ĩ"ZXǣ~}VWp_Wk[J8Z}^|!'Xw,Bi0(TV hP֗~0X_O [>7RZzJ~S0ap\Q`3HFiqehmS8r np* bq!T(.0G-M?V|")?is'ubp',pw9]psƳ+>H삳3u]'ki("sTpr=G$@DǕަmVuZK:&/ E魡w$8iQm4R"I9J;B΍Q:R hr K+'+cS=Fi#{%7c60q %Öɱ&fVv=UaZWcLb@ǨvKbXq !:w}4]6unX@6–lu{w ‘v/bݳ)MWM1&ؘW*qà˕pY_9ntEfWƓ;1VG=6(}F1Љ> 3J~$:ggiF6*lόgՙ,֊,8ǨgV|eYbwggv&4Ŷ3홑{fT5 *U]^qWUg&In7>ytxvPz[ ämdNmibOZGZv41<.{r Qk b})记 endstream endobj 222 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 228 0 obj << /Length 3611 /Filter /FlateDecode >> stream xioO4b89dHl6l"IZ]IԊr6wp($;](Z,d8l1tyKWNT7E&]޸)'ɏfs-Ϝ7;.=o|O_b4uY纄iA d2VMb9.?5Nwtw>Սvp{{7?e_M^Œ^-2IjA1lـX WfZ+D?x}1W*^$lWjRr)]׮DPv9moc`@Ԍ&@#;RbRq9Y%Б^{p dQ߾G2;S".lvZJ<=|h]MKyS)1lTvz5]WԒvl 'wAަ0yį?6)KЦ"Ҥi&"!fK +)B*kySl ,Z2ػ N.bMF%y]j2WA]Y7NL.t2]^7`KMّ$!R!?M Q+۪Y4|7?RShcL鞽@vHSk#v-jbl xݠL*D/kCIfb倗*]^UOi'&OL}cPX)W$ԭOe%KK_y 늝v~%44>n– O/U1k,3ܝX] `136 psK Y,/>BTrac xGa#; $ J'rǐ`ps#qBk`8qBГ+_SуĤQަ!爉:uިP^{4^vmp )!v}KkK2PA͎cȱ0IqÆ,mA Fi -j/jZdU M`l5jKr)<39]hn)v 9x zŚ?hL/$keWA]ͽdlޓu3\~:%Lh/rRqrB<-5,ms)̂eqR]ʄKo8ve91Wy;7^wݭZSOj| nۍ $ZF :b>" E$k iGN%W+F<_=ym1b&bAj'ݗ _\=ci[kOэ/ݰ_=/D~C+B* # h~KQAT_}]` _\ 7g< p%+pH1B"oW|"e G=$_" kjh;} ?e+E=F,^{*d*~? qA\lNQ&:cžwص 1]hɤh IڭLL܌lNlڨ-T;ںօś11P:G#q7TO&zUm[ beF"a򝡓NeXY*i#\!UP J22Y-daRW ]UrDUm0O"0=\zFV.5֜b-8deSʆE҅-ֆK2{S7#r[nɾ-WEzTڟwGJòIFP&y^,v\rTD}5bQTHE cƥFq uymGRo lٹ˧Mk3./ R3W=Zuu9B}Fxq ~"zJ$}nͣV36TȮf@mrMN4);GyrcS$~Djm=HͿg jRe4& N"ք>| O~N?ýh[wԿiLduA7n(ºy<:ޮCg%(۠)(!tB.4^-Fe0ަ;*J'wfծN "dn z$ok.+yi y/c n.`Tz { rDϷ fII~&;.ޟ) DW f2[s1 $yLK$rn,\c3VQSPZ ՆNHM>} 懃! {1̧m*,V=/ޮy]hW< <_sɧ~˘NSyܨ8j;9GNy(T,?w~JVU7qyUAtt^ׁО{JF,*~|^T7"`~-Y+f_ '.R0T*SW٨J g+C endstream endobj 235 0 obj << /Length 1368 /Filter /FlateDecode >> stream xXYoF~ׯ R 7܋h) MQKrEqst Er99K$K^ΞY3UeNVI>9[&:[|ݣ3d0! =5K,R,m^BgTZtnem)K\D='VG*Zټ *EY&L,N*\&Oיrm Yxjgُ4pM#^6ީ4Vi/y] wV6> Ud>z-ߊ'|婞pu1\Y$ Y'KaUsVTHQ#?wR< 44'߹CK|K8sV~ݺIUS{Ĩ;-򸋘 6}O˕ + NrdQJcT{6.Bi ׫`w8o|pZ(zQ vť.SvcN 9*h sk ds]ͧ6?~W=T:̄Uau8=_C.d`"= .ЪinTa8\"Eiʒ)CJYl8;.N~'ϔ@vQqbv0f\+P |!߮c^XnKWH;usF %hw!B!:<۝H,#mb4I?,cC!n?hH^а͊k?]ۗF2Xed75Wm43ޝ:u?]1?@)GO1~eUTpߎh)DǛyTCv8+e& yr7 :dP< a|R +QPm% [/n7HS){Pd jIx/jDޱ 1bPt2^ρ?f endstream endobj 224 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/flexmix-intro-015.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 239 0 R /BBox [0 0 720 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 240 0 R/F3 241 0 R>> /ExtGState << >>/ColorSpace << /sRGB 242 0 R >>>> /Length 1023 /Filter /FlateDecode >> stream xWnGW:=  lv@i*~zvKi%n lVNc$\;kx?/0B@}cxNf (0lnsy op;O}Ι_FTF(#Xzޡ> 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 247 0 obj << /Length 2014 /Filter /FlateDecode >> stream xY[o6~0$o*.: -!6 Cnb+K ,i߾s(Gͺv@:$#-G/=="2*"Lai|58]i_ oLz2& ҏο{zj k[iGXiXY3NZ` s̃u.";&BBB8xو)/Ol ȱp[gΓ07 !JIu^@ rK)U-0-I&&hِӠBͨȘ] OXE mZNr|!*v@ zyv3.;[unT CRΌW?W:kˣ`Ǻێ[`tX=r9v nk9:3'\iuMY]9xim}'(`OjxY*3EKV85J޺(}n]eKsEqpQsKٵ5qOH^%ǃjl㰴6T mB'%CTبC#cl(q&E?QnIYO%1 +۝syn꫿ % HоWuv1GY¹0KD{ϱ:I!KR0p5^0&Kdg]+)\ dbq$:> stream xY[ۺ~ϯ0d1#R.Z I[CZ*ys9w"w V5$3of~xwi2ήnf0UgWOswlK -|W}k],,[Re,Wikߎ+klı;B#Je>P&KUGyB_XxxX2sc_,K҅ce,"+[*zk,iY*UH`QwdI)9Ӡ "O!mA]a B"Y_U,]QkMC bi})l1+yh+sѭd5}l-?n_C(l:!b>.}Zr~{؅ކ u jߎ7xwqġpzh췢%gmD6 uGX;.}R_ k+!@snE-c >$+7XK+q4rSNte_(}QI3W`J-+Yd2Ѩ%"p!NS5c7CFTʇw&NB=6HXf#]N}$!w"<4XpgwQ9-mV*+Ml8 *\1{h+ E _'x4( ad(w2iDy' HQ'$P%s,@(pt2p6pfG#g,3Yh%yn|hPYqgBo6ZqMŇIyȿ+zS!!ؐ;n9*=WV骄ϦUq+B+MjEl(}h*ɱXQ4&[˓k91j-dr#i畞ޝA'i"p'ecMJ{^=7q endstream endobj 261 0 obj << /Length 3871 /Filter /FlateDecode >> stream x[[۸~ϯ0&'sD S=\ß&jgmS"Z ڜc Vh]~ pVup26Rt(Y$iRx=31XC)J=C@ `gZ}2 Ҵ)'bh_թ?vE#wS{F?Ӌi𶸢;w4wZ}%\tbn*l2+\dpqS_V Y;0{NXʊǏWRw1{z=5$u; h;N߃i ~v@@P^}(x̵RhVyNbY,@E,>S[ -ϐ<'ɞ"!&x]F_6PP>#΅vI'3V%9Irvq } @+e;P*E4h$@K+dikiz5a9CKecR{ڄ$lW.}FU+.G}8شu O|m2jlDQl :l4@w7R禮7Hw } 8q}  GރSQ?}B{&4pI!6b^G;ήQ8wvWcXo`> G`)BYe<&ѴN+L̰T<$i2@ЪxVdl*^jy?Yj>A3 h׃ߤ^;OP6J#hd6 S7j8wD,.˲EΝBw/M:u~k H} ѝNY(!׻2NúsGL'X7^wg3" !}ܧÉ6tg%JA,@kC{dS )z%%#n/BTh|g0n|VJ!C6iY+'9W%Kǣ=J4BI>҆RLBi 8?b噔W곑L!nI+F,v3rAhFD ӇGQ+h,NOef}NsF \#IBx(ء^]L!`hCxo^Aw@KqXtܔg̠3>n|UIr99 * AyL.逻rȆ[e|8_W^5` Z?Ki^6&+~@+X ocab.~MXMfH<  k(%( j64+ Pꉑħ^J =CJB )Cp667i6fG%lmWdjTcCDU>\BICuON8b%Sf 1)ݲ+B}d;X\~Waޙg` m:fYcBp$w߃o|A; ";7[|= "PW 7 xw<7c+8ia9ߞ՞X s,OWifjt٫uδ}oMcIkPDU> stream xZmoF_kܝ}}I 1p hWYL)ݯg($;Epr9;;gf^ %B;F^Wp $\r*4[m:L/ELkw8;N67u"v^}#&)󶪗gy[ȴJkm%{Ϋv'oū&*VԵ']Q6J%fN)OY<6_Ue[,벨/U}ur1fb߫媺}|V]^P,[⽰. S[W墼lQl^W*j,/̊)kFϬ2΋^f4Xl+lVe`ffɏ*oE޵Y}U/_"g~OyQ^'EȻI){t8ϗ-|StwmWY.AFHHH(k\TJ̀J@2 i21G? ݇dGQH#-I};@ΧL _?5n$OiSx wa~ _!G4wˋz1 MغX <qq49ZӷЗ CڅGAǐL)YVU@r#qQn>LpHadž[Cl cA;J,?.;7S( JIŅAYPf8Ȍ 4}B'rnѣբV­ŝp7#v=&/x V_&{&=\`6d|!a'B,&32`uS03P&aL{ݔA~8TnTvdbWV)m&ZR;)=ezJdWg?kx}]{d\=8ds atkCiz~GϦ:x̓ظ C}"sKJkxF~H㟛 Rq8F`8$h5SSD$㋈JD8=xo]f$[Ha4>e7 HwW(ZP|qZp!FAZ;s8[ktf> endstream endobj 303 0 obj << /Length 3595 /Filter /FlateDecode >> stream xɎ>_!FZeBg< ΁#QKFb+ݝC=obێ9H, f޽7_`TUzi=zV楪l>4e( MFk/a7 , wĿ{u<=J4koxvb|1>[.*;-l|QnOlo';>VQea± Km! Kà[-qF'4Y; ]0Qdž5+WοQ|VD\cB5h&_^N%x ]52d3E4hvx?lnq-|h2:bQl5KhJG`Vn#b Z:x`M+'t$#Ih9; >#SMᕩ7 6+0be C#b")b9>" uĠ;P<׆Q(Yp-ûMeZw?: \c|<FTzp= GJߞGR~>d*8y1$ϤRbB}g>9E'QS*_'9^8p/hjpϻeTޛ+V(ӫ[&htc&uqy'N"f!@%QFV+N% D(b/'IxB^ydU xX &i?BV4]biyQ_M[+Zw IV$ڑ"b+=  KS7}ԷN :^lC,< @_Z <&NыQ}t~L쳐{!FetQ*{2*> \O1oÇ-_w<DZ"B@!*Y@&pUG<}m&aR>1[>"ts>- y`j%wE5?ǐXa>4/)G#?gh]H]y^CN2Le} x&}q6ʖr{lӼY޳},<Ƒu̐èH|ZDK=zUVB7aa,C8wS \4}{'p_Hg`c\I+yg',bp7]*!ZF7ʊ( JrSEϐwЗd'8c^:!CgbRތ "5HW_ _rABDuֲn]wv+!!75UyB-I0>snQYWg}ƁL;KႳxҽb:P ann0)`@:~o;L^mDԓ>blUY F9Ԯqcۣ4HC A{:d9hC_YRez+ђ.s)-2IK,xGbb|Jՙ^ M0Qjf`uA0:\"W(zuRkPF2FŤ21ZX#ftHͭTѯ!63&Z$6 "=`Y}0D?{7n-,Fvii%]c$Xi YU%p-s]fW [- +9rŌڱDAMHLw%ۅI=`TeT>[V&7=\8Ziv5_fv>r7gm;nO T&_IľK2 lHqW_h`NId@IJ%7[0<\{2mr/T._*P-x}@\>J_$<_ h?\D<<+zLDykd[aq =W1Ghʍ٥[0%Y+=4`&B86zɮ ?@sW(3ia ?b^ClL%aMv330ߋqڑ ąTǿO>ؓ@+0OM8bڬ]Xv~vXy)Ay:zïYħƏLV4V`I.??E֩#pm 5<{<2/=])c˜,-&hTwߒq[.joOo I endstream endobj 312 0 obj << /Length 1433 /Filter /FlateDecode >> stream xnF z) 4g47RFJIqCo.=1۷y4izr>]ҤLKׁL;˓Ҹ` އQa6R ~tE1:|C[H"Qf(׷HZ%E1L4C0d&$bMV#(=I_8AbaX9QVa.EXxC(aBA$:I- gL &brwLp H:ʲ;\/] ~GEQ3++{5 EP%8QVDcIߧa(&`īZ|![t})[yt:ʉAFO 끨6 0/ {0 LY{e]th([5+ n}|' Ӷ[H MXn5i>  .d@%թ?>t.2=f2X]%V.,x15WSH ܥX7* dhc|H0y5:jJHEsW-I/sEQĞ C;U:)rJ'&/}pMw5-e˵c^"2쬀w+|詤 SI`Q~%6-%zqXOM.+R͜!dvp$ =OF1p>CL -  endstream endobj 309 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/flexmix-intro-024.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 315 0 R /BBox [0 0 864 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 316 0 R>> /ExtGState << >>/ColorSpace << /sRGB 317 0 R >>>> /Length 42657 /Filter /FlateDecode >> stream xˮf6ϧȡ ȩ;9` `v7QY-Ԗ-@߅prT ş3~۟?϶~=(jYj5ϼ֯~ͿyϯQo/?-#G?i_Lszϯi_u?H%WhA3[3>G7y\Ђh+b0H5тʿzHGW~ 8Z'jg x$ YZ_*hɆ"_wB y~_%]En0GxKЂ*-1ČY֌C=-VIs𻀏KEN-*va EuXʏ~튍s00Zwc$ʘ$xߵ|ס(ьÞwAһǂ'Fj75~],aʈɋH︺aW9]Tگ>0 }f J -/{Kq;8QwkJ_ũ$'[kjN_+1`Q#ZϑwA{ Ż9ZvZ0[_)1OeF{%-sP.|cjrW -\0g,J1g <`[Gg.-aָ-V.UN~2mI=عE㘤я>p4 `bƆ98ci)ʨ:=: 0iM^ǺRXX{26{_Y X9l1~HqAxJh8sSAQ%YAޏqA/YF1~ah8f̘wi=}e1)aK&=}9κ&zݜ3#uܻ4Yȵfc~Z-@zph19aӐ[ zme:-~`DJM^NmھAO E!<نF_{ܣX{(D.4'hr#1x6b8_X{US Ag=[C;9~ aS{Oc[1ՆhVAVa;RIM<ܴ%8 B-g}`B0e8jn%B%B9MEx(9u&e{t=hr~ &u|@J4zK'r۴$lQ!$xc]̯3WT>'ZC*yd4 -8NYGʆ-į ^>r ʃPwGsy˧/]C>}/˧|w)0GHGIdj#=o PH +c>'Xyelm,b,1 չX  E:nt_\1czM|.h!a˖:0uBKBd f2L׌$q>3pB6$E|849c%-dc ˧A{֢~X^Mst0\c5/\r DzC#+Ȅo^!Svg,{e\vLJewxlCKК[Ӻlvu -i=F)b`SٚZ[_j6 ~UP&\(9я\ N'TJ];^wSV 򇅤`p=?Bސ;=GWŶPP\qI `K[@&.}8OO;v1m<F|coy, %%%͖ Aִ__MI,yԳTB'AJ'Kl  c/񭔔xvEʲdЪaAdK\ ݲ0ϯ-qNe#<>$Lݬ@B<֗%<ʫnY' sK2 86csjms7׶U;NdIi>}a kZtչ-}u1bكТX  ᗿl{P%Oq\i3˰m!?0H5̈́^'Luyil9hw*M=(:[eq! j{ܽ`q^hv<AJ,3 {>攇Ԇe)z ^zöyf`8lkPAulx얔NŞg?Qڪ19c-)+%󞏱 I3{>0NZ.|#قMߓǤQ"ݶ9jZ˼!~ˊ&FFB}V%b$mxXG.G঄b0qh< J4TЂ;`K#/3VzIR_酖Aa8Ng RNba?ęì [R*!H5l1cBm-!0[ x47/m>|<0#Ǿ YSáxHǛ$ǘфrcZܷ߅Mi@gseݼR7ĺMIu:'U ǟ#ca-aG| rua-.௫GMݰirmHJ=ssdE g6/ U#}W-{i_5Qk㬇#% 3Hg.6oh/c謇.o[5u!t}ѫQH#o$/2nP o y*\N-0mNgJ ~G0[ bxm~&mC7#4DJG<ӡډG[{>cm"S/%= c+#=_" #IpGcb)]EKdzivY5= 85s^m`9X7 ~w!]0[ P^>^WrihՒL~@o|tQg`P,iGibyA_a][bծh+~,%i˰%1%G&`GX%GȅGȁiaߔnJ:$a_cr|nJCQ8sRTeg0^'xyy7oռa[^OT/[@2FJj`s67>%ه7['G8VnI)eÖ?,IGMtS_Yz:|%a3Y&*|o[C dI}gS )Ōfس^07>Gi_HlY钶^`C{%lKX= -RvРG:)]lx]H7d|ǰ6O8:{hх*`hNYcmWI}<'[[![oh7,rSgۺGAemam}š"< sqϨ C9桅% 7~ [e8,OWžӠl.e~CEBbN{'R3ķ>=2x4Ovlj9&Npj[|@50⅞f9K2.QZ/E{ɆO3%OaAç2~6 {= c+mP'f1A-߯TI#dar,5o뎇 kO 8gF,OӠڄ=Ac3V)൩eULQ:4ȖC&=EٚnN8K y ;)+>pY[4qJqJudBH.8Y>}H}*[ XH[b Y;.u[ p6=&G>°)X–>'OϾaw|0YcUϣ-j:7?FȺ|nĉ2?|Lxc>(f JH'Nar թfg[{zqxRB8ZaO>Z5úՏzX0UD.%,/EIb{kl=zhߔH3U^t.:]Ea=W잜M 9 RCNM7;|h,qp 1%wQ/=ibrm`Mn?\)~(j8x>ӻTnO* QNg Xͅ 7\lJ;w/~(T#~w*Ϻ=gST4dFWT38}y#MtP&Ul{]Wб,a:(vx)&x7 r 7<EODPM2ß9k \~^\w{Xc7&-d8ns<\{h^6|+,j2!E=uw{d`` nnO[!"I=1נyuBpgsw{$ J +.󐓄w{ӂbG]~-ɪ'yQ$9<~ӂ8'-=sw{I8_LWw,&= ȟ R@I#0M;qU\37| l= l-I4֑h!_{Ȏc"ݞ`fkm1V?C5/`@f 9w{S#n#&]6 ʴMt1( ؆H%"6 ޞ~4>9!YEG{&N_ ŐDԮ*)PԜ/no8'Rø9ey=|&ߪ 'ў; 1BC4R^jC4:|'i'e_dti ջ=9)x+tXQ/=y6X%Цkݱ&hQx =C^St!Z<6Π k]G{ R #owJ զwMܮ hO[OgV/}9kFU&|jN;1EgOw.n1rwVɅyzlˈ໽XW!Vp=&,IvBSʁ?zRADy8yG{Kۆ@#HkT3}!Yt[͞uwm&W 399G{$nw=žx.n ϶߬)' ܈=wd^S)YӮ ny>F= 7VuDmƮwA 714Ti"z&# F֐+Bg{89ݿ;t)֢2ڠ\.&`uFg>ҖeoСlnoy:SOhMm+u'{vīWAYa"6ў&<֒<T%H|'}M͚xzDu໽L&Je,J[c/I:o(Ơ=8nOy,z*WB  m fѾ[τ#M =+l@|w(m=89[SIښiϓա,&Topqw{|D q6ckiPQ6-Jni8%K?W&@ sW/>cJ6 *&MC֓A?ElBNIo6?ݞ|Rrkg|} 9+@¶&+9sxʗ=bo4 }RDžE(noԛdK+|໽yV攥ge3Ϻ໽}u,P dX:C7|V#DN7~[p*/vc@2<iB`ېJ8_G{RZf YR#~7#/n@s[rRG{-BE)8~ i~ޞwʗK ? h$Fũy+}K;$uРaw{[x1E'CoK]|f]|~|o^=nD<2NZ y;Mb-(oʸ7!5R6oւrzܶbZbzJwEk}>UCНO߄|Wq?57 X=P |6ڢ2%bYMJ`$5{}n &wM>pq[{WI.fh2o'.\d}?&ץ͸1|E aZ1gPuܢ+#[켋 XҾq/ȪKN b۶qgpMYkx1>Â|*6Y4znyrwFۯ,9-A)aEm2ZeH^!z-G;/"7_(ж-SIp+}omϩoBw&#i{r&9R >YCm/s'+K]B׋peUߗTv%{-6vfDK]uҼS]1n1*um>0pAOkf{l]?qo{ZC v원ڒߌ{OXkj^wZ Td(0}`iA[-1GE Sn~K'c)p.'hBs&cAY2y\CۻwR/dt<"Ǹ[Lgi cܱKN bAaZGJ2xVEI2dJ'q|*jj^fE܏q,'{`mve㼩~أgm }Ǯ yk\½EphcV5,9-;R C050`iA [fex$݇~`ivߟefTho7O ,\CT‹Mǐ5z,ךlFCd96#`iAOK%*ӓ(Ui[9̹j\AۧeP; 7-#Sq _38Ldnmggb)xz-~);[q (V\޸PPU@+[vS 2 NBCp M#ꛐm3TqFI,Y3 jz-DLH@,9-Ct0~|z-=?d&¸\cK*/OUJG5S=hb%7K}JNRkMY:pq:>GB SufxN8&%[䴘Wlߏm sf(cViO.jǶp6hB2[$1g&)BFA>!Ȼ) L\A);[;MЦb}{De%ӡHj]|NJqnIoB:NؑoQ)2tNrl[ DC3dg9nBv `|y:UY/f^ƛv~_ALBuhJwJж>SOGqkUL5x^o^=g%vJT6 {zFWй H7n(rnۮ縌{ۿeK%L2.;n}O\|r?7s ۍC6…72=.~x`3# ډjM^Ĵ>e7cmwzkJ71$W}mwCvp7jǩn wcLqIb dxmwZKcM<Ƶq cQ|ݺ zblӂҚB'󝢻dQ -'\B}^VoDB㻗Zۮ׸14GD*eܸN-"\"miXqV80=k}iTk;B%Bbpz>Z{4OU%j<}ګ5N%{[NC*qmZ ݢt^0d#./ޠqow\6ɳ{鍅Y7 *^Ǹ {`1,)=Hߓ1 B-|ƅK}A+c4zTf8H D%-w _E-ƖЁWc;O"MFmblp%SWw%qpqw/f۶2s(u[nm.<3uT y5OC=Uϫ]%ҥ"Eumk\½m9ofzEF+35~)>Bt <5tJ; =[:7ņܥ(9a'`4Q.vc+tKj o5nqq+,}3LdߌZ Ʒt0BM|*N*_( a䝂ʪp7!9.~{ O={V랙³eGK$ę'ver[dhl,=G^<`iA W+,Ņ?C˹,ԢUgUL6Ko]rZ/cf&JXBi5hEuE37) 0!~&c׸1ssXa"iCMjND~<|sx-c,꘺9ʃy 9&]?xYڎtr }2k\w*na2-XrZb7&։d }<~EZ(Y;T%U|&v3yʈ k`.o{w\n]}k`*)J4oB5Dz)˔^}@<.QL.Pyֲ+/oSBIZz;}ϫo^ڱ&K -9GV]+(oj$s\}?2o^=Gmo~)-ǐ{JS=ի$5'fw:z}[pqG)ꚙ̪_v bX*Xlviu״>nr6d[4[<~OWлDȾNn G-XrZnx#MtW )q /Ly-t_zH|^.6Ezzx!S mP>RRitnt<)Og>y<<5.>ޱ+k缬s#Q(0Gק!4N=m "qE*ݿOCcyמumr::6%fUi#]Ў=~rWwz>l}!o^=n[,ͯpܥ;R͖m^XJۏL[ptPTO̚z˸L;+x–8ުū9c1/KN bPJۅ }9|1<-XrZ{>WIF²KEQ%ľ}~7n8O߄|ns?ps}rcC@<ݓulMX)!*Ȋ*&@׸1#i 3cxҲ[ Inl g%m'R[)O\j^P wLA.sκpq\c~Hð3-yvvA bJ sr=oB>/K,}bwud.;1ńjzޖ1t<\V M[ء{U]ۧiO{}7^r>$qAjB0_\ r}5ΝRoB>7gH5um۫N.AgMn0"3c-]?xF$Snd ޮJV.{'׌!'*&3?rY>ϲ׶א w7'cly@:;č JCMFN:bu\-670Wc4>fZ _ȉhP5E!|kPm mFL*7֣ӱ۪O;ߌSK{UDd;ř9;ɲ,{}y.g/ۮOo 3| A ?eK-BN GՂ%1675f:^;43ox01OW =\a=d]2yӟݷp[xy b:ߓ1cz_[Pgsz?#SPNGm J&>ymk\½]>7u& a˺5|}N7ky!ӊĝ}l%wS3dySq wgz|{ӺvnPh ώr;o,彀%W[) |[ XCsޏmڭE+ rm̆}tM'tf:moBqzKOnJ܏S.Q "X0Ja#O=S[WPݞcP$wޞc;Qt,K/,9-o.XfN]r\Z ƶst$y`iAe=XG ab$~<.<|[0uE5e/,P +yP/ qK.4 (I̓kn_K(7ݟ!k9Wz]DAuy`.Zd_o}(_H?}Buf2ԅS/woxT੏-; }}/wR3ቜgC8Ğ"a?~Gt=.^-2Dp[77\T+~*Tcw:x  <믯߿9+i;x-2ޯ-_oᢩ_o ފh 2gtck3Ԓ??gM_O/?w?E scaOv4E.Gny̕%i['X]_QiOMA/"8˟'?^?pX$vxMۙ÷pߠzLrDk7d*j7 c<Ȃ0__"0$(2% ~0+7^,]kcknxnDqkMβ͜F|M7w3h 3"OÌz^֠?G L=ce'Q@8$=ſ?wq%,0,ϭggK(toK-=a^/F^$IP.'~#S2_*[61>0#a)?Tm> 26`Pny?#WaV^4?ӯv\p';k-=u?&C|1#2Dw6Kw4>CRzB70' *}d:Z .Q=idxD-f/mޝvxdMK;KO7ۓO*8(b\8S! ncq s"? 2LudSn=צ)18C}OHW% )}Et~ ߟ~J{jU,F@/$hPN +)GQd,N)9#Nød"0l+(<EXIQX期J3׳lή?y+xF*MZh[q\E7lam1g0>s6EKrgk){cZ&.ɒQi!oH8Tqhv7x}/_W['ϛJ\}΢~8)~13 ؝<?% JNy?k?<OM߬ '3Ȃg>N ¾+A)dy[}ʗ$;=VG˖yC*[q rnTe}&FXd, ~}ʣY }e )-9H$fq q u bx=L%^F=RT +W55n!' "U %GS|.He`CM>aLlvQ* |bWxtaһ*H>eB3S)CnFSFk$WKFᔭSp5ܞ5n4/\j7#\^Za^/y߮U 8aJYmJ@h?tҿc~+'5O f!'vKA*oϏDje3T{HIʤ׫ߙjqVjjzN{_Ry|m1\Q$><ߒBGV 9_,?T'c\=M&[=rDK)|:12L0SvFG0d6#oJ 8wʾpp%)pgFė.%Sʼ(EG<͑n)sҵK4=RN^Cub)OJp2dz8Gl)0~ ?WM)^6eɱ3 zRw{8܈/~r|_ULR1ԉgF~p{"B{9r6zDK+ɔɩ$/K?ݠb-_ Y]~%nJ%z=)% Z[,lN0Ĝ9owof(|WS2mO1"PrBjhGI/gkLi,= T|(ikq:ӡcs Kb^&]쯦#ugH3x3ŒP߆sT.\Fmt7gCu+K.z1l;:v8Nݫ8. QZ{ ?)nJOgpғMvDKl|Ⅺaw~Z3_N7 )+RJ{ȼc=|v3Tː0  cS}fr'Vȭs}9xj>9rHp?) oc> <_υPbm!56eR!CLȄ*~AͩI[IHqR?:eeuЙ4vILC6N^F0 ٘0nkUMHx /*3ME'3EF$JΟY=LX.H#&<>3RSd(GPK0NsCb;:y#XlQpb.d 7 5!1,1ޚ yNoG` Ũ4U|>4=V|kS sTEC2WoPZaMKZaO<^1L1nNjM\#=a"ml`׳Bz<<00F߮Z:[qMn_{' %xMHDe0%XYІUb]Ovwt_&LCЕ hzin&!,.R4nݤޯwTx ݮ O"Pp+ZY-qJya oSWz'W+҇La.gB6X"?6ƣXʼniX[*c|,C|a94u. ƹ=Y%;`i{KIcӰ^Y02)3'`fqQF) Hta3oN#[JI `p!iծP阯1/}he,Y*/qwa^jNԍ;lbH"qٯiw*w5q ob[(]n5.~*%7D - Hb~`ϟ;_w htح#ajP+G\2;}t-mk\?g*J1y 5g^A>07jte%S3S1Dik(U2~> 7׸1֮9jWܕǚ>mf|A#ެ̛DMjЬ_ľ% nS &WH1T&+w1aXC\1ϟ1abV]/}P#^!bzU]O'q '+%0o\x^wɊYqcLH [\R0!lM&qgw/}bk~[q?ƭߒzu,/{A-au=%ľ[Pq'>7!U ~Ky{|.<Țh腎YB^Aծnq=~>%)oBlo2=nJb.LM1 |B$Mw 獋w1V%{->}1 /Hϼ MְzfF2}Q}[pq]7cهL|y )9I)oB>/Op?߉>w fÃ4!zC4^Nu}}/fh'tIś>ƥ}X9.D33[#9P}hK &xMiTo<|8l\Cgϸ(+>{fE܏qsU|IK w gm5_(q)Yi z % woBlo2=nSMb&]7@"x)Mұf3w=b6jlɻqu7zK͙qM)`.3/"A4~ o԰n\܌}Uq Xijٰ]2B3S?/k %Pa!Hwφo^"ǸM5q%u_>ֲ@]B2J>pn\AƂ]q d)Sq  YW}deܰ:3-ܱݭU΍HzKE( y4%p/%mee.?*$]_) WPrKpzn.Yqc>/o_YE% }~ ri\CW2@}C'7z˸/I6,y @) U" a߸%qiv߄$;N%{ܖdaOԖ\ M%zΣB ]\slrIlq'2oBbۮ縌{g/&Db:z|J UEr$Yq|pC\Oq'hT5RH_*0Ɇ$NasyM~z;CDK}[A M:pqNUIoLtRl3hȃ.O?p&]!zJzQIGȥq;Z۪׸1#eԴ TRIJ$йnr( [&%!bt@ظwߏVƕL7o&мK1i£bma#g۫~R.|.AEq"mk\) CH*AFІ.ހ~ * H.H6=.~R9\ێ% d҆3#*^ z7%ľMP Yo#%Ǹ[zy*P;/숅Q|N=+ڸ7[޸[ۮH{vBdk1.%(Hk|k)o}!;7.ooBlo^#=ns]+=_w te5T}$h E@۪׸1CZ3$|%8I^п!}>;a͍\E;ono"Ǹ-E{.u%!A>$pq=/s<,,i܊[Wvc^ \tK$Z\].ؙYBFU}>&\Ce >q"|lQV}spq{]#1.A$x$UwPfw=E5%RpJ1{]f{\*K.frCiɬݐ٪Sn}{J %j?w۪׸{z}]@zuf-Az>+\Zظ=E9$}[pq ֕%a Î YGJ4-%.Axq'oB']zy)%S^ ִ%$XdZ#Զu%7ep[pq9Y1,-]/#`=3msϑ- =ͪL \AȖ*AfW2&d9]qc F_TcbwbMe/E;mdh}f-`=%E^qd ƫwEJHW7!.yͣ^Ǹ[ڤc|%< aرkyWurdkٸ<x,my,4.~a:myĻsK;mlm\vj7-r,6=.~49.L}ؓ6NȌS?u JGcIɸ|}Eַ]q oFW{z>-YŃάlUm㊛q =[CP _0ncd&dV%܏q_%N~~,9Zr: Y-΃;Wo@]qcGzKA{)({GcZ8p%fU>/ñh\C;x}qlYqc7C.YGNat=Cqxfb߶آdNg5R>L +mO0:-Kg ytzj]Kwz#}ms\ƽDq2}%p(K# !ʲLت5mA  } 5.~x{Vudگm.%d̻"Gq =;R[%1!Ɲ mN}W .|Ʃ;3fbr3dV7r=oMfkqirωӷ] mbKZya'}6iMBĉwC.P2.VモO5̘{Ǧ$)?;DŽ$"`2#dY.okA: hjMܨSq u## Rn|]%L0HJ _w}-O>p߄;wL3㳀y>HVI~ЯP!,fq b<*AKq} VN7[9qyђsUhM =C[ϧ m6K ڶv9*oӱg/ZtlIy`Ūy6[s'>%\A;%7oBmk½K@ *F +ŻO3d[|+~Q>ct i 7xa} ׸{D'#c 'γU9lXsLOZTg=P۞' ewvw[pqXXrr]%S/) %,';G^K}y;d-c߄LW)q?m;LcH<u zoH>O7dd[INP޻% V w߄7zK[p,񍴯$t=ʛrP]}?((pj}cԷ]q9вoX 5ř ؈/kf}o)Zz3`wuhpq_|uqI\honD˽p ..ȗ~۪׸1Oe$*w̕Jt3u Ah+뮗?RK OpӶ۪׸1Gy2wtֿwz< c\CH *Af$FȾ yG0=.~alK'##ׄ,ˆvzFnWгw*i^g{ پS9w=.Azw ާ/vC[O=cZ+o^$fڸ>j]ZV%{Gyxkcyx/m{"322̃~4 3sz5fxzͳfd'9:mCRygQt5x_իig5M|׼4E%0zXW#\ًh)SAڢk>'%;0ZE.gwϋc?m}%eT {;A=âބ򥮄cIXXGg=ƾ~h2#Z4rfAԚCQ][O$Zk&~Qhޛ)ʭ_*|~1wy_aP([xcy1ϻ XXT?.]lyi;ɄP3\i͎dE\LSWhP^8]AA7kXArUS*GpX?Ȉ~R-{|!Kq;D ^gB4= kh ʽ;:3\=j=LKdl$yJvδd>]i41$Gc'V%ѳ楱]:aF>,bLjܔq~/4PRZqjz~׼4E凲9$%,jjֵHYO~ ;RW;R0cɼy;qʀO2/ZI= yTj +yT:~e2"f }uQ"bv@hlx)_j=+٠f؏y?Дq#ۃl>aЇwͱbͭ16xt lyqǼ{ePQ%oCs{g>vig+վ֪ ggwKcyeKlZ:iMVSDl'@kh>[SO΄n7R5ű7[6a=>raÈz{|b} wÍ ^% d Ȳ'bân^{楱/?S+ ΃EH Jc3NZ&k(9^aޗN ͯ9/}mUWÔF+CψAm= ao2EcT+h* }oB`&Ҽy踞h]IyFn|f7m>鎭*ϽۍԳ)Ec?o' ͅ޶ `ʃ6>_+ɋW{fa}1p@ߨɔK&?r183Ͱ-lbrF+#]C;gNWmr18̖[e+C#juV?Wt~U3͛Gy1pm[gd3Hfdy2nW O6U鑨W.Gmwozkl`B(*h./s.F NC%{m-`vNTRݯ~ r04'2b!NT7 qyC۬]ES]+C#TElT"`Po̴9qrŶmy|bʃlR -00pA+FTvTH(yMƨgM;0C!Ga|qW.Gmķݬ9>0t`h>MYuct}9cCO?[G{E``e캄dR蟐륖i< waQABuu5H+O(м`#2.zfXtF`0b`ifơAKibp) c97( klT # c ןbs3(0q ȉ2/\ *]_ ^d9قR%rH GPKI9_^/ -@lZс+#(ft'GdYct1c|ci'td r1p6vZ(Е~an?0xbGg\Y3hއ7c:7_iɼBYY+#|)nhDŽbKQ-(}y9^a>!NiaN'j;0c4h8~^*W q<r1 3ux t́r18TwRikofa! Hl_@LMVx1xb 7SE21]cvavf_ TJR~F{BJDӒ~Q~`(QYH ~bѡejlXl3Ɛ5X7B=H$-,1+ƨU7Ar18_rM6ckMQE I$0Eac\g;tZmzG3 L 4߆ٌ.0K;|UrN< }نaS{0)cs2)|o+x :k ``LlyӞeLS߳7 L v(=A8ZNn. 58ab58:`T2芭Y;" J65j.!\:bE t;<3bxu:8as`bV*ӆw:o;hSU$ /-Ѱ BgIA 19-Ov6!&HA!m'tkVRzKz-z02N=hy=j6nH+%b8;Od.M00:NLJ䄉SȞ4 Vk3."`b .4nyurq,æ$_/Fa~2#habza8:h~sYMXӕP'w͢UJf zN29mgx#of;Û[7lUs澼OZp>m 'ͧ}+/>{~mjcc{5LY4`bLr.]X*cOQStކI+=т#B FľOZBy 7Ů2]P~+ ~@Kq%b]x-vfOLVЋN6}o7pZd*uc[娄 i ]ak/GxgKl-!+ȔX\5<4Pڷ01ZIyYR5vHf-a[Jly .'&V`Z$K+`L<>O~Dj- i<;tVBԗaKOZ&rTנ<ɲ kd\R_muD"v[aLY/Op ml! cSRT~`kehB&v7l y}gDx5kIJٚgZRi! xn=*-.*;]jb&*giц(ԘEu6l١* {.|x$򥖂{[odYl|Nu犷nʘm;t}09QpMJ(SH)gTOu%X6N `SI;뱟)ZH/lX)Xp0aN#.9H^u* MS/y0Je$LS |xe;Ж {Gx1aKN7dkΔ,BhN:{%zFE*UOlDnt[Hpթ*v+8y6i eؚV^G#cz5ͻȗ$xkǥ98]Vy{y7.# Z8yU']%U]7Ll=KJQL:L$D+jPGAeHZ}o2vFA5"9pQf@m=Oq;Ъܘс T}vw!qŠ_/>֡zQdu8iCf9>fلbqqoQ#.O#zyH_t.hԷ{| ف+8Xf5~y@", &\vX/>E B?X6+|j!QwT_0kHx|$4R r}`LAf1iϷ`%DF8A;iCXfQX~_+ҢBD4Mj>郞IaƦW(y|!gE!}c4v8]sfx6c'Po!f}C4v|fUR/>ޢ)SIt1x' m@HgisO|D2ZJ Oނ섰xP@Yirѽb~q|f4_|ܡ K'"Q '~-À77v[tsQʅ؃a/Y;98Il IbAQJ{)PzZX9~Й5wg xHة9@a|+%֚3;F-r~|kOC{9pą_s6qԥ-euV7Ir+I2Oh(&^7睌JIЁ`T.$P它@NZ\fz|HL-[~@Dž?52դwjzY.s0 ZQ$_3X9J{s_|RZ#!c=}˽k3a]+_1לX|P%9F%O?OwC\1&z=>hYMgŞ,6~S B[҂;7DZtˢco]Vw4 4oy9/IbLr_{sbWq9치CKTzjq.J~w{Yw(*(<~oZ5XE io>ifVެPr+IGEVr ݇CP>O|r&AnfbwbywSn9-lb~'+fSC~Fs$~#`O̫yߴZY~a: h% &}$+7ɒX{Zs4ǑOjf~6e9T9~liؖ$N {ā_|[0G{"z'gRf݅_|r*Ornim7Ǒu7s~p/=2*?B;<bIfX6ǞZ+Gх_|K8jM;C}=>9t;8‚@:]oj?[~ER'RŅnru/%/53B2=˔@,]?fJ#ho_&8(ϓ W'w~-ej NͲd7EsڴđX/Hx/nJ?Y#&UF/i5NJf dŷLaZj7s?m+a|̌9) d|wuȬ]n-DEpwnz2s}ߴz.z ZS|ӇMI(/֣,q~Ozj*H>df%Bk$As?)O2quijbְ[~YlT%K=7ڃ*-2oI P&_-C?}7-ʨe^7NZ !IUeIu/7ɋE"Q曈990DcH gONXdUkFkxV5ʒp<9odjLv6l]dT?Ma*=Rϴ]_z'?mq%2{tI>v\o(nrFݴ:_|ܡ %ϱ}-܍V9fP 0 l0lRGMzF=J$\^?Ny۲h7 RNɼef ڇU(Ő~o,{5MR:/s%%D:y{ _|ߡϠ da#YSOJxߴ^8fupn> \IC5Æ60r9C]瞔o@(+3z R~tsC_n۫[~ V}iKb2z%/߾f_+H6uI|[&M+.=+xurC Gª\?q_| 1?q&J3o[KIXHw' uɪOd/H݉ئ2?:S`oE~ڑG۪|I(?B lt>?$R* _|_PCDct ozmֶQ EyݯF$tn3r ћj4+teU_&#yݨ둟ЛމR *y%ZTCxq<&0_Pz%$bΧC[UQHo*|`ec~|RU ΃=pSΕ$j_jrcVrrOG|&P!Qcɬ*`;6g;x +ENgU<`ծA*'N_x iXc/Eh*'uOz9xuOnc+)gF!ϲG7ia((nܟ77Uo[k[SFB_a^JWP-zsb:E^8O˪8oߺ2ꢦUbFGٰq tG"xm?H͉Ҋ^7;U=!7>ޗ -snH%!#;Oaf}~m2k}`W"Ks ږhQGLl+$?7"!8{>\9 P$^+i?7vI_r&$8j^yo^_ :/?5"Xi_9 ptoI'mltFgRƸ8顪V,ǯHNd[~0)k{px~:x jQ~ KHt_'wbgz4倂ߛ(Kp2/eVkHZhiR+]v;R7GQFTHO [&wNgX_fљ 6~_߫+)"I~5[Y99t2k%aֈ$|$gY>8<8RM+~4GxԾM8y̲|8{EalQaBom޴AI$ΌD){}ܔ35}iȓ~(AUl9WpZ,9 Kx'څ&(oNdG#*ݜ04tGdL$w=(1y#ߠu٢#!92 ), ~ec⼒d:~q=%ɰx|I:H- ZaM,VkSɚ#+1Plͬ)$,/,8 U2 a.څw&{\՟ȃ5K֪> ]|2֮ã_O5d26kط|fjjyYAD]3}3? 3\]5A†ݘO z]&!jϚJ0Ckn@/,Tgc8{{EZY#NNXfK4?T~2:gېXwFu}GR͢ C yaOTee#vWŜ[}$Y/'g&Cُz>]#$R޸>ձV]!\jWgFx/,<[rLprN*k<.O1m8 27w&u.:S=UogFJfDٰwӶ_kgsb2+Jꨐ쓆=+Sκ)dWti ؒ`x O2(~1#g?_-r;#&nP+ՠHD^Mr mb+SܪA+Ʈ !WRɶkF 숧IsNR7(˳\B!/.6v*|jL*'ٺ@m.w>xPaK N|TT`)W8VEyr1[&EGRμ:5QQPO)Q#7 xfɘ4RANS%9 A&Ga}36(f+4MFU5Ѭ\$pӒ#94q .ι!Lɕy̪>qUXIJ ]0Cg1k0}dHg̊ꨛ@٘AsD߃~nV30FRY2֦6Qf}|BV`]~b:"~/>j>#zN]Rl(I?`5z+3*?`e@%MY:]G5+N-@+Se5`Չ "&&@;2y.WF2j*4I*kvjfP^*S~ni<`=0 S I1֛*7jA̰ͪ~Z]VgIE?VVEqtGחqV{ziA )bU}Jܯ3*?|.'SߦoNǖ yCѬLiI>]'tKc(*KJ:V+j/'M+bwŲair7y ,ᑾv!A2#l?l;c~˿I8s$ *GI)~!e+fbmreeCe>3(DvP0MJxX KW'jZRjǛFLFm|vVOv -:dI<]wV۳;kLJᯩUl'-(|O2Ǔ .E9WQ}2G*4(/%| 5XbH(hUۣ Kt(?*Q7tZ{e_R(/EPs+d7&rɉy+H FQk+?SFNR H%3>uq$wXt:=|rӕyry/ޯrcWRVwͬ64ʼ+j&}LrN"Ѳ߷BNXKm~뽴yCY0i?藒c= ɈukD|nWe"TXKIbOħWQ-}h32AGZL~Kub} ,3"*gRp'{ Ç3~J3+BbѲB~Y.O>\{~AtWvOj֏Q2`稼oKkQĩ:u߆`)LJGeR?/_2Ux[6-"?LڵsQMyɑ؋ui}6O峥EJNx.uY*ʜ 9e9'oe5\V9䙭e"sREZv8r**XY;? G{'{(O+ v^KRN` *<w4  qğq?D͡ :Lx']*<BwƗuCYO;cC dpd1cHp$E/+Q+3(J(/OWݬZRIɦ%U<֎n>kR~<-ю=unW'%?ۖ=t~Qo'UӯB“ ʥݔJS+S'm3ʲBϬi/˿+>WK7FVg[YIìbߠHӰ/oEWAwHɬK^?3@| wnEL*)*#KGg`Y}Xŝ`܏| ky?֧mG/KHFWc}z5Wk#ފu:mH~3+78cDq9_O6e/(y#oN%Ug*MsFne9̈́~!;6' Zeu/)KeMVQ)#3!8I#;+NBqLD4$'M|pź:UW"{2_X+8'+cdW \L7]';Ԇ,6Ex=-Fzx|4~boݯ|}߶|%j5{Lzt<˳{g?2{^~$PyyFo|q|9X6^Y vD@uA\ ؕ~ BXA7u2;{=S/*,'YP~υ=i]NP ++H:Aƿ;P.*W;{ غ ߛRϋc?g-|.B]c)?BKyи;C5{WsNc8]l>ۿk^1?g) ,c)?+ŚOb{eSFtqa-yXA7uV1a [)~YԡOLd ~v endstream endobj 319 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 325 0 obj << /Length 3418 /Filter /FlateDecode >> stream xڕZYo~_a$Kݼ͞ $ۛ} Zea$: $=u6T{ 4lQ]]tr>K>}}$ڜޟU˸NO)u2g6)Mzn-_`E4_p"MS_ [F+D%f*&,&NJY99yLiVXe]-<1s|sMv;Ay禃 6Y2?SA.L[¦q|,)Gh<;&Kh7[y*]mX2l "dFVmTitklNrA!kV^usQw=9MQT'nDQ+R@ŅIE\P, &=R~ܒXZ:0=6wO73ZX7O*b#ڥ,jp6"U@h+a2S[p *73( F&zH]nC(e1*Vac8`mhY`u GDx~GJn'91@Zfѕ epOPtdk% y4`~:Vu)A%еը!+ `$sJ =7[3k\hѲD6# "Na75;8>GZm|_wp_D.EBN6H'-&sb%$_opU{P [rt:g71Z]$t4ph5uYOukFwb2o_hTA/9ZXՈpT{~ ='_  DCEtJbӬI%d,dt Gt)đN%\zG$xQBsH/+: b!~ﻁ&$6XBr+FoA!QCE. 6ՁǜƏP=9*Sˉp@n{&f2+9f"tdT^]yMx]5ZSݸBuq Ꝅ%!  ے 22zdz"abɜY\Y4<7K&)8(mùkRAfG[%F$7ގ*nB-Ӹ.\y_\V UUT.9_Wg? *T÷_Td6׃G]D$I'eFjleƑtNzIu-s$L&Ի{zН1y6.B_Q /ȑNj0KBΝg#@z >dw^-=z7k&~ASD8=QtV6aJ1MjXjw pk&HؠѼuY} 9ׅdɠ9GBi; 4sCJ`;jGp+Y,5Hc)"8_^AoK$J{5u}I\[xZo% 6F2:.\7JؿY/- e1 c==h*S6`"ġGϣuS1qcZ!"ZqT#'28\aLl2w;1b",-o G&I%3 \eYU1!+cd,E4יzujhQƕq2L<Æw2u1,IڗfBezUZZ7 )ݡ-OwЪ9,3&g  qCu\&G "8)c~1Kо9yo\~-NdL`3RtGX^ݧY:^sdv禘KM1tBwE4 |khmgǢ*OP ẹQ{wW<~SNl_Rػ{kVyDccV ԏԚHr; iB[:LwAT6Dmy#AV2v'b.8Zɿ(X+D+o:T71B1C%(Tb C{Qm#&XI}PfS@m%DD>JʐH:pXLnpRE^3[ X1U<E@Qg)w3V7;c~/f&35kt"6PW3L.<:*$cH=hC%+BX-ۿk\ >!Ԭ`ZדkbLdSCAW3_ 8?kٞ/Ոrq'|i(/$Ǿk@dB.v4 ]"S `)iK!Ɩu'aӥH59R=w_,@%X0U ]BR;[B^h>~{18Y?dI(!&F˱I@< wZ#aSnz&)"q=b&}y]? [ .}~uW8}t':V6\VCȬ*{N2ˆY29$ rWGGu83FNVf~|w/:Qt;)aSH}n-~A $|k_Cq eiɊ>ΪKW[3m}dKQ, >ń#ͼkCDkZW0z3^Ex_Qr;@V9 ^q͜eS".r7#%樐6KK f#&x]qjynJ7{2ΓT5 %ϡ@CpwX)@{B>F3#>覝sܩ_*n^\a!Ny8L A?H"0xS@ S.d\~ 8`ij+̻W*} endstream endobj 336 0 obj << /Length 3384 /Filter /FlateDecode >> stream xڭZIsFWrJ(ٲH)$'&!cTE>okAʁD~F2$/_<@%qjp}3Щ&sY\7s*W7&CEWXiksI:S<IU}^$`d4ephr 'EG\\asVm-q ԪPTP{D)cjYՒǮnyKiNԫ$ߥa-m065=%|45g8t3=r}68\"̃2 =q~`d*dKcesϜ~5*]39/>pٺ<,*NV6$x<ٮ<רeÕǽdtq6Ʃkͥ}ݚYHMjL^TY|0&:(:_k>JJ$_ I{o3W`IY8wOE~E#BR蕘شi6D26vN5Aa JAyBH D\?_-^VgY钶r}}'}"$IVUʎzrYs`:yT+n՚8tE('ZMew \4il3w w4[xJ( GM3WK5[x4.ta".;[v[x{*X:@]0ZV\xWa&tD"| xJ62G$BB4"E. #>> 8acMUpe]W,``R:&MN/1T2XH-Xt/)⼅&Z^k”򌥭G/K/H&3aI@kЉ KLnE*9'Q Jl҉fitmr k72"3NAT_.}Zm8E_N O¼\DgK>OTfcqn5,׹Tu'@J:8MpVb.d4ꋹ+8-,d˭znϳ@ Pb35D&]B~&^W]|HR`0m>G>B{ow=֐+å$)~qBmxGN@Rg ,wQ$gӎ1G:_4́ Nʬ|J[FH̊ϽTnהوeOj 6g$6u}AF4`@OR ʿP&<"|8q1v0ț#"6K&wHI-esYm7:bCtEC <˘g`^{b2I =.hyv Fb[F?C jbϫ:pz i(4EJ=z[ IY]txӸb損d|ʩp[۷4]FjaNoa& sn L#OS#Alpe& t%8Cs eⲫgnlλd+;olG8y9,!QeuK+nC?tby8sua%L%)űg9q_KIa",h }N{ "y+YasHu4۞48'EM2[4+TƷ2aʀ62(E|@jo; Wlڿzp}ũ޾K q-S C  C}# }\;iI ݥˌVYOVfyo}AII+>sXIꁠ_V)f3xK[ܡA?k7! Bj.p q ;Bb utCU 󗔽ϴ:HRj%~NS)z( +Djua-_aޤXFf\}3}.dܖF# qŹM{PrXYaᏅhJZM0Ah-1wqp$xB1+ bvt8Ёo#rׄ ̎ g<;xS'~^xR4wFqgk\{,/3 I~a,^ӏ MrI^-t>~|̸45%}T ?^9' \9 .X$k1?|'M >L$G~[}`pNҚnh \Yj>)+:;J&NsL>=b)=i#g}wu8g6UNmfr7ec4#4`-)CG(]Rƥ^"&Bzd.*=DvԖ5RA`V~縛p7g FlF4.ׇ3*.6ߎ)\?lΘ endstream endobj 344 0 obj << /Length 941 /Filter /FlateDecode >> stream xڕVMo0WD'R+!v!lv6[mZB␬=g{ ^k, X]9DM!ѷL QB X[|G|-0D >-zb5nb5)v+62:}J@B>:֠cmD<ʓqIVlK|Uw)?p i$Π( "tRb>h&R9O,~OlukNrICы[*'[dr6L(I`L(iݝ )}: Ԇjo(`E;WꅄdVf( У _I>H<@ ՎQPg*Td+"ĥ@J~$ӔȱzQ1{L 5f:piq_0"N*|b7d'~Jabqޒs_[PX֪(T e(X mSbrR"5 ~,оp+:: br]Y8YkH|SlVhgF+aQ:|&KG cm.i!$ FL:,o8D34pCջ{>YckYSl9 祈8uOЀ-@$/~1j4\yM&ݰZR//&$7?l4_B]d_͊~R$Eb8wj9d*gg㣭gگl$e˲Bjhؘ})NL[^^@4ڸ# 2aCtOtzZ]#aode;Fə[߸^ۋ16iof[t endstream endobj 367 0 obj << /Length1 2137 /Length2 15309 /Length3 0 /Length 16584 /Filter /FlateDecode >> stream xڍt.t̎JVXbf۶m۶:N}\.R"YZ~+==-#'@PJLKJhboThkgbeA[LHN ``d0r2q208ʖ hbHXY`I]lM?#BF;hkk ҵ7Z|d5(X]+5'=/%  : HZŌhlb/-!07Z}x8Xm k忌%e@2YW_Z`hbȈH;t- 25u510r]@ۚXٙE0,li hea>![Dzkg,, M, "a`Mdibɇh`a```cem@g}c+XV-`fme 0 01~:@*22 Lz@#K??@ͷ5qh0|#4?K/$'$'F/ X9hYL, FlFVeW j?*vwP{8(Kk?MAvߚ$`noGkabou)1ߦ* ։~Nh kbo^\37Zٙuhc>[N)loe׀1tmmu]`??&w ,?\<V'+ /ѿ^ 1E F XGL?#GL? @/}T>T>bq| ?@}b[,HZsz^ K0/s+00o1~ჹ?=Ǒ@'ˇGCAOgRToGkkyAV?B@a088|Ĵ(w WHKcg:aM[*qhwyfHwU)iݖl(+R}7lㆺV S-7B5ȵ8:U~{) W S0K6Ҟ J;D5I8s&SZ"]'6 :>-A[a~B:[ȯe_(pDw LhF aIy=\QUVg3yCX~c(l-k\Or^lcm r2iτ&ROPQץ38뱓&LZF͋m+D.BDѲCI6'(X=qH{ }.i|YBPsďj_Imal0~` Bxaϲ2_zSؑ>%y"3|rM>mc>{7 _r#<=O !1ڽ򢽏sSnFx =a) mE4?H e~wMH g7it0_Q/m6A(N 2sfҙOxlr!,Džpu&':9rl)O쪶(/V!_KY,nˣJ9_vRDz?"!X|Y^Am̋k b'dt~0m0#N|0sqH"'i8q7_&0pVXN Dek32@^/{ b4D/RKDp":}&1bdW2XIm׋ME[/E.4wD\%dI$mF}! /qo KTs *,vfKȉXNj'gѤ՜p*+0SJo߸6HOHr; ]>}3k% ]?Zzj=1!^G.WL[yA/ؚi>Sǥc.73cM QbH%b2!Y^&YawK#wܾNJ_;}l.,a\32bx Q`Oػ`HI`)APR" NX#x}buN>o_/1-mr99}j{ͺa5nh>eR8o+M1( 3B~\Ҽ#¾CI1@z2$4XKTذmO&PH:jU؀ k~P0H|w 4@F F,>$9/'9܏O=Ն.*Y{|mFӇSRX+%v<` 1gdzž+ݪکTK R#mלe @8`B)Pn%6ykeSri**.L;YlGl@&IG GcǧP!G7jSI>ũ5 ul#QA-@]%0 @$x勐]X!غP7ϻ+iI1s s";9?(Z0J ;׆N]o\dK^?M:MYmL mկqlL7nbŌh3ӄN@P_ʞ;YSu(SX *o\h}60|LyoouNq#h53][ogx1JO` N}sdȃVfIv~NB6u,g1[XR9*X`~ %9F]U 25't;>rmauP$e)4;m"ņH}6a@rF8NJr\BG7]|{ fH9`i5CFUG\ۦdU&ƸPYz%g 4A`U `I} IG3";yX/wjCVM9/yI¸fBuݞ|h؎UAtQ,f@?t1Yj s4 _uM&w8!#%jupf2:2uF,1Qrgh꣩[;b~LؽM׎4ZDpeDfJ1 &ս[4<fjSvΑf> AD9om'0#Qt/ƟEeSwf~_-R3+Vٷ uImOR;cVEF1 e_d(I=kNDY6NlY %U &=XMX5﷟jC)ӝ8'W\=A-Rm|^ .q:>urA#aen870#3}n '#Kq^y38ɔRXjq"ǫCQ: 6|Fq]A!= ;>OF&rZ>;φF^aLFrӗ##NXF|Ƶ){3q.2[6%skLcfAeE&f_>ZШg5_@8;뽂@ˁx3Ll?۫-AoκST[z@pe4ՊuE3 T|Q auJT[yZq:d_AOb 6նW&hf =z2CBkޙOMZb´i05fԈze)MDP)_6"&0O$L3{c(C|V]3"3nX]$O&6Z6b ݹ[r24Hjz"T:li0Tv| a$.맆L#+3щi)WP֮t ҬH1J0|Q1،J0#k-ߟqJDΤ}W N^>%F<' TQ5SsAal8sVz04C[@3:vk\NՄvbE'ga_O(Q8a[,:կWB!_Pod#4s!uZ㼪,fiq9Cf*y*k2`)<0i/L zPhx|jN7BW|vŏh ,^[nEƓCrNjE3Zg]fQ1 {轊1+yٗKIPmd0A]aȷ> [2Fr?hy C\D$6Ϧ%+NS >ڹ8(CbiLxlFˡ* qm^ڇG$1ٍwϜk']Tqo3Fg">(˃ԜB=B5l= #vV_$]ۅ3zQ\ߵ x`x}w$F{>f__WAŅ,ELap% 5z"Ö[<o>_% ķ#98-GH4ƙ 3} ͙Yg(QehSkn4Cx5Z3bQ~{rTYպBeCy1mq OPBSL|bK۴L"('̓||xZ("gIjʞDf"dyҕ}U>(V[nNx:JN~]ܻ 8;(W&gF'1cmլ R6 "fsMm2j4զwިp6X߾x%!?kFR(m#Py"6؃aFDtj]P.U5[qg;:a@7"%`ZYנRߕh(dlA;C$O sHK.c V؇OVTYD^w+| OyûKbHE@!GXJP9dUD5sICu;J{!PH<홣Iz©LϘ|ͅ*4c7W Z CRslr־9UgD=JZ"7;BH7`x[(̆$AܒCg2S/:a ^jW%Hnb`1ܦ4s%:Ј'8$k.w pBLLB,S5p^ ס`#v9p'%VL )#S0Ofxǚ#.;V8s Q`y. ruNrZ[m ]AIy,>[m)5 4l+h>YE=Lly1v/RS Un7iD+$[Tb_S`WZ:qx0#DlsJA |D$v=0]wk_KA&PJ0\ 1wsƝd @2D{8ϬuxR?5G9\bQwrL2$ m($<8'H=DIrո$xR=:FGA㣎;SCFjQz*!}sZbe zly 9oҰ;L}ȰFgaBO2'3 *41OJ`V\@ɓr{uY.y}EbD.pdgIWQ'OSaT|.^e;m gœ=OgRn̿`$Uppt,MPF7LXPai'܍.:_ _h#WsyJjӈxgRob,,3Ʋaz%} X(Q{ՄE[74tB _\шĨ{{--QWqcY@fV-2^OJ'oId9hQj~KEHіR=':OSt?KyكگBb|+$2rǾ"H32Rݟ ;,WPPaLNƝh xJ\yu mBmN^8dOXe`[\st&I>K_㺷GWFqZ_i[E szAP|i\q*KaU_կ2EAn+DD'AstpZbd_l "Hk5.;Pn6Q[RynIȥn{)f#j#_%kN/DI1ENzo"5%\dW* o]S7-g y=#p]!wK*é=0HW%*>Lќ=ڏ bb]C{o4 ެ mA5.]'蜒mֽ~^̟8Fd<ӉD5 Ny[zne17lHD]kr#0 Q'!hA%8n"@CTBMu.ii4̾fMBE ~'ҳߦM=̐s' _4JӜǁ{+§_sڄʚd p4|rJtiSK^Py;K!!Ǭ?fw~S0*O2]?(N@{]AECO%˽Km|$߻Hˇ0⾁t -*©u˻{؅EDM*UY& zlN w+])@68ȉ,6P];^>NP)JSxu74<1_A(/40WS?~>',?ÐaOEs:":D:+b~ݫBUVs_ᆑ7tʅRro l Q@>.WZI ܁WV #2yGbNF(oT%=Aǒ̫C0vDsg fFS39c̐ԕM~ R$w 4l%j v36ɹ#Sj ?pDD)+CGo ϋtMkKj7{S{͍G7@P L5QP{84NR]1O{ĉ﵄}$AX:k1JjG&SO!Iy8u]uj!%0E'Gnt~ςٯ Zx:LMpSPO @Ωz,wY ('GQ3y;o#^n8 ~8x)wQ̡U\1B 賈tڐ~rbzAe,5 rOJ.J'{2ZvlTUMX#MITafYM+esS7L9W"akSWֈ3kb&) >,܉PW=wIYq@tX S0Ĥ.vxbTىj$1DꪡP( '&7躭:ٺ+ P)ǖђ^ˑLd"uu ?r(]Z8BӍؖ{'4=:5U(47R^R5D z++`2h;ٍI)Ӊc*J{<dPGD9U2WkI+9t/ zw/$9H 6bu7'%"蒫|_GOZm|nZu(0bqDůİ1%HW_9-!3Ue^lԒd~%l3ɯ]КZ_%z>݁;/M8-|.mn:JVӷDoV#U ܄H&> 4fcWӠ;3x@3 ͛+4ޅKV\n䞨'Ě& T'?P.cmrsFhYe"*ߕu(hUP~cW'[fn#x(-O js¦1Wr$}[1\a@xZҾ\ťI޸om'm>khyҷTwz 3s wx*LfW؛֋mб]Oq˴OѮMEZS;T!1M{QOkiۡ6⒐d;Ε c=sÕ7k! /\vߔ`d(b9wΚo7q1F A=@Hp0w>'rr>r=8>/n`'*D{;|'%~j-rwC2t^5W2Q!K\dV Ny kF'֙8>e?zR}dDgM>7\ ނɌvcxW٥NW{8)qcԣq 5gĩǧkO '+^e8]X=5q2&!=VxElǴ'bλ[w0G#8¯x]+((̭!]1-?Y.t%s hi.gGP3 & ur/T{UCT/JuXA|i2߬`T *op _ԽAZS ᩉH@PK(X}#ڬ&2_ZF ?5g ea1}1=mDzp!mhrc0q7[~2nC7X*`f B |}_ֺ- !cl0o+am&}Mz3wg=UC(TgĔ(* Kz|^>v`{o09 dzƟ&Ѹw-p^>vHtG.Y7E^nt XoSSVaOZt N; =Cl WEj>6ձ=\tQ vU.߆2fw5l'fYLiÕos!TMuqY) =rozsǷ ʵr\B|{U~d$!3z LpuFIxzS[ji8Dѳ@+ h'}5+U00MXHH_T'4P>Vc U⍴+t\ƳY#Zqg5)ZnRj{{+3E\h9tlI/Ѣ6V*㓺UW;~nn E5YO'aʎ3Y PZ+Vъ~ܓϏ5ɯru%m "5dkb2JC $?- gG#ض}|걓dQzԢlխ7z{(ࢵ2)$t;&Wo7G9&;g0|y,*`({\Ej܉F$'ZVvU/Zmy[(>;Q`ɷ)'c}6h Lfve+OQl?r=>m$2ǴKɣg n?l:ɢ6"/ía9[)SJjdObn4pNfjHNZ$F+cI9j>-Tb 4I&J wR.V-^KfOל6ʉE䲤}pQ!|C? ({b!3A*Vhd+}ܘ  TIlD8mz](eǽ࢜1Ǡn1/`:׶h>4a߱ T_wO Lh*tP'pUf,u9tqY .T m寛S_ #S HQBVc2)'c,G}(|.!yNϲa rAV}kؘG^UT. s&R{puA&Fto|'p4rrLJi\Mz*wwBt1o%Dx.c؞.(Lzp*\V:]Y1]T1)^%t_{U،=4o]BZ%OlE B\դjE U CPFXN~U5(W􉯠o!\OfEbNs=<@kGD#Rs𥅞wui r,1 ee )8APj'$ ]ت^bV=sIkUr@GV6_0igRYHjMf 4xSwzcD D1D ydT09mCg} C\⽧fB4ŠZ1 1 uu!/E.V@=pjx n9dz$-̾~}bJꍨo4pt_G<⤫JZY'[2/(yLQ_*1T>ee6C+8O'(plR>Ч>閣sW)uE 3yaOP$J㨛qwhxn%XXHh_QR.ΌjE!&]h[f daZ.6Z,\,T~6fVqo*>m w!D̺ci7~?/Qp}61ձړE+:x |BylUt%^w;ɸ#K@}9 .-=C U(עHJeu 'gT,mvJG|de@?s,YzS/ |weJeLCS󃟁vwH3ANf9;WX$TCnf T#,i ԑFC Yȭ!xPc2I;9#=iSAYua ݆`?JHRRb*:*u`흔-Ȃqnh'prKV#CvzJ 5gc$Y^i1dGPH NU@s$:AWY#jçM059PnZtSW0=@NTy_a=} 2=w%Dp |!eWCb(SV1<#kv2u~-,uD ܶ˝wFsetʘ&o!ېaۖ.lmuϖ6k6bZWC1Bז ﬐ endstream endobj 369 0 obj << /Length1 1517 /Length2 6757 /Length3 0 /Length 7768 /Filter /FlateDecode >> stream xڍvTk6)t"Cwtw C0t7(tIR (H !]cs~Z߷y}]{{&z-]N5DCrxDr F@/.ˎdAA0`! M%aN (( E#D  @ 2]P;{>}X/w3`u|#ЅB#.ܞ\ g7.8N Et nd4.\&=7 Ez n]a6vw@MVMi;_ 0yCav[ƅBr@0D:o Re F@]n\nP5r sfCOopapO_+[(g6.0;DEք  ؞z._ _ ?ruy@H;?p@ XC0ߚ!׷珀zLyn|2U si)oPVp!!^ig- ;FVcio t3_.?*3Rtwr& uø;v o!Cl A sP7EF VoYs Zp7 /v7ۭ,A 00 @oW_D@~ #o]lܟg v`N[,':A"nF@\@@!$ ]"N<:Txۄֿn Ɲ^\Ĵf;hsNZq*2E4r"=Kw+v˥ߕeZ Em^z~?\ ћP3庺 j哞{(y}\^TŻ*ӏ5 .gʳΚbf#9;~r$ $v\8"_% =^&T4'$Fn>-)Z,uQ2= F:g2 PhkGC\U);p!p%#Ϝ'r6X#2zT8Z(5+|g3- !כE!]#\v1p㲋KcBEMnLGV9|ʟ {x!-8{4SG._i(SԻyvfB+KE,]uCR`1ضGqy _1ny?yMlؾVAAw~lx#lbWH.Hgb/F>,nCh% g^Բ3tpZ) nv|V*2)Xv&XZ#Vu/Eb*43mʯ ՟:X  iN OLd^o@l39[Lp Y;%0,q|tF߮39H)ޙ<~s^Z0-! wÐ0_޲d"gGKWzzl4-*j9jY{MIҸ%V=ޖp2y> }>rPYL%tx4A"S~4k :Cbu6Ē YzKTKIٳW5K:C)"XHgQ2GOh$}TZkC ̸Bhq{Mr[A=F[ϷLeSuٵm)ucBɠ^3ȼewVK·kf6h*{ LjTۢX$SOBsBrw?lٖnga7wA$7[n Ev{Xޞ݌ms&Ya^8[>uPgMS)$/\KӺ\'Zy= _>+6o]5erW;QMw)fh`o|εo%=o|Bf6:.ױ2jtt{"6st5|@]u!1rG .n:=cR"ZG`3vijժ%@Ha eDiN="w5;Pc  tZM񥔌.^X0^i|ȓ]MA$? -¾W QLs(6|alafI(K0,ŠqE*<ʵ[ӂ(e+q}h7K͂Bd_UjXܶlx[=M%{Qh4bDĄg?? Xh3E>AɁ ipNUuWDaQ)4׍8GgE\\Afa[VUT84cqէLOS}'QDqYwM `nesN5ԣL0e\,s2SyH;=ǂ\PMc |= :`l-Q1مU/Kg3d8USy:NQ[r#b¼؞cp {28iՃ!}~n%ƉJqc1$N9. S/_YKl֭5gB7#vNTp\T3P&E'=TD_vӐ}eZDvzb}#! )+x\z(UIX 70]j/\ ~+Ld3c_vYڿ;2$ё_IOqO FgǶ;A*L"h}E#"^{~]>ɐ)Nav0ϓTXWmE;Q"q9=e{B;ɽʹQ+K)X"0ofA}w + e}π < i/k|@q) {+iB' _ʦtMCXk9z&!`>V'YWwExto#NA͆<Ԙ?Ăj.뤔4(_.ﮣSIgtox=~x ,^Έsw?Q?"$hIj(AylYNtog5yO' Suȡ%݋MQ"3^9|T곋EhӈcPB7;H]ԦM-=I=;djzC C%5IJjP"77-I K?s=:lex.s,MJY?[)8AQͳOKϐ\k8?d݊_CbC-5(Lm+En&oٹػ` A8Vw.?X,mDgo"r`ܔsނ^eÑ5[bj'sфoq|2Ng6qZ,&ZQ^LtmTPӚG)__~2ڤk6 )KJlqw'+o.|=p`{zI~B f!;c7$p11~ޝT vT3}f8H ήFB$lPk0DI٩꒍m'=W2?o6{a܅Ju50)/҇d>Y}"HCçOSR$8))d.BX}IUدj o'>B:'|am֎&KN[.`hKPFncAY6mx :ŧb5(5Pa kѢm{g?a%a+8Nm'˾6`\4bpbs."j:M8 =.LT^u'\z'kEc!%kwkz (Kk_=%0P(CʥE0`+ 8U+L^ڞK\Y.?f$u[í+lxcBǃQ)YOq>i02:lxe%9l=ºc̻#YkDM0uݔCzĦB&'rƧwPꂚ>hv.rп~C,\!۬Rp*܆f[FBg #::ĢFjLOl+9L\UTUE*mGٽ7ԶRE#S|*nZqK^ے0gg/a,@"s6RZd~bXKW}id;@Qwr>wŏ;e+] 4eS(&:W֭ks~0W9kћ7ubcP`RkSz!Cduq錟|c㽆' ע"[[ّf! l G,[Odb]LMFc^(۝h9CB XܤW5Vf5`{-3(T e یң 9pKU 4}R719QHuЙ{<# T'ڑpYKykG~6 S7yV#-R\;t(%5v['TP!Ff?#?i,XK@\+k#8i\oUVO[I+5)=s{D<-iU[n,qZ3opM$Sㄖnn*QSE.ѫԨPG57Zj¾5>ЇZ[lE(qR^|KsLG4@ n:ro>T7'kjx8)kMi F<2dl|R=D*Y h]eyrpe%0ڵ)QC?!N*kp& z[F߉gb SN^ r)l+L5.kG|86^,N۸/,J֔Y]0\yq8oQ,A!9#Y>H㗠`+psRzl΃~JFëOKx%*; (\cdQ=|/Nwf͖A[sFU- 1XE1o3}l2?d||C*Ѯ thY4O.L"SrTT z }ERPʍ;m,u鹿 sO8_Pj$ `kyAOE)m E[uA5_:w|ђXdӮGMXa "SM'ZxBꏭ2~jz^&; cb{\aԎj\nn2,7뚧Y}HW(ېion֥b6uΡ`; x W2ш ^p}ٖ-z92DA ,\ +j ܭ`D:-WJ-)K&٢R;=tƙFܘ6s-Lxwԏ:~UOFwsaN=QfK\Zk*` )D K<1E7Y:&Cƺ\(O)bp|cLOn.\e: fmC9 +''n,|3w&f3ITK*lhơVw7G<$*>;j:%ⷉs*-[r7Ss> w0ivĉ{gY]"}^%$$VS@< juyLONDղ>.:n#T\C6A*=k߸ch-tBLy6 3…O$2v*:rO ݂M]P1:Br-gƟ+7O߯oN2\A3?jP|/ <{tӍՠq]'7tƻC|_!9ў7Cdc$ endstream endobj 298 0 obj << /Type /ObjStm /N 100 /First 872 /Length 3750 /Filter /FlateDecode >> stream x[[sH~#)EM-$C͝T$;ka~ȉD.0U%u>};זSĈ-ѸB+4QB{"D @dat C'S8 d ^š{"ETL3RHHQ* BDB0! nFB9cqpLanC VRėяL Sy;5z" E9Hhky&fia7`+k)zl0f#؏%5DXmPȀjblHQ@5Cp=s R􁆔t2 5AYH&gBcQЯ&}b {%IKK '`D2a@d2L6I;2NaPؗؼd; q7!x2`w(#V(G¦B^)yV n)ぁdw!xRR('^%,R\/Ñ8(P,(-5!eTydr8[iU* A2> g*FS?oPeTF;ֆ20ָ2ف|)SWv1VRa|M T0[i%"'[" S<;UEċ0[Q5 " r ( V9;tyI.mF.IF Z w"tl8SDyģdZjS"Zq3|-~x׼Qݼ* ۟U̦U[C-)1++{Xivt/=/Ϋf(~Yv{s,^֌67N:/u:1 S5U|_Om3FxvLO *Gi`F<'#V{ˬfdfhh.oWY3].?-g+fbшyxb36ZUl*k`J5C9f!J>s-PdR;OӓjZ]~\bv^$lP8@q 2$%$ws':BGrmP[dzђ-H[H =ۊS0Z0vXaXaXabwݵM.c|s,Gv?"-Љtvޚ{w~l^1zqήk j\ N\8(I?IPrr6?boB^v:! EHFQGh`qgP(gHؘHz4+)vܔ򢩧e5.ʪ>/STT.v7K o, :+<>Y*A RnO(AJFtb,Q u U(Za:p>ք 1 ^Za7"ոz7lk8M! ӚrT>kaRK v*" Co%Tj&yS͛ic,Ƨ{;{JfP}*~l s;;Ad:ܙ_wC/^l Rph&~8oVw˄_NVQ~w`K~Hץ}A#7G6ny@[&iDgm2W IJu nA;`K4ʚDE?@D#1;5z6 C)~A"˗۞$OHḪc*ˤ˿/Ri?Dh#WQ@4_aQtO|qJ W ۨLF(kƶyvKɩ$ȀiA8#pl{G1Ese%Hgt!裔c"V)yL^ ZV@č>q8: O8zKn3ލYM;wxQ2l[wE,60" }+Rҷ8PQ55|IQ"f_NkwCZ@$yM.{zė}oJdb UM޵=!j ' l!8r*ǡK)'َI;2I h>Ңy.@C=} gQ9Yא? Gr4DP09y#[<D?R O@B|pLEG&!8@z%*mi< sdkgIRBGRG@!+GZ9I9D*}I\2(V2$Clj3:I9.d3*vAfGE(#|r,:{UwtitWz:ݛk<՗U촖N1(>/+7\eKT'u$OIj.3zav>Sí"<i_^F?,lt Tff]گjzYM/uqʥuN5;R"}5/دοS> stream xڍT ThheWhN2a Y E`H&0̄,(( hQQ\XD"RDqb.- bV {wrdl`ƣOY(p A)dE"Qy 1 n>wXD }q s4;VĘ'lKq n8_*@cbEDW`24b*ʂ1 bёsAB&bE"DyB .q2I(E a!QHd #8G @8( Dc#@^>Gi4̜Qhd T2b<>IQ,pP.>Dd`-\!NÉ0ʅ 0tY`bř, )B+[*+Cvy< IQ"^Jx O’ߛcsd|j&/"} "` A bR>2)|8"H A?RNDH FR?|jh4FY"ĠCupmT$[Oc\-S<׸>K@2 @gAʧeatf204;q Lf$b >ECxoO7˪o>˝ PtBW,"r> EبyKpbR[l(ʹz폊XSvE1 AT!Ti[erX $`-q.وd̀JpSd7`*K暲h=r?2(IT ,@@Hr-ĀDH=81=6$n6z;bR.Wwy?cz6%+ruVWA.3O#.)L.jۢTǔL-ڝАQd'+ |TDY2q)C*5:ϺCq[nxuJIf=\l7\IՎEs8{elYVƃ,;'{}7*?_X-ݩS x kzc~vϾ >j`ydedZkCOQqzAM]jkeEY#VJYU JJ)5s_d».˞WTixshpV}Hn>*w?!M;sRG®vMͲw5 %6< iCCS9}ʑ̢j^qK+vQSқ D>_s>AQ{\R cEY3`sC!pkZ{!ȧ;ao[鏏|u!l iBfsqm]9 Aue~CVnp =\|JQ+.BQ`#yB7Dh<@ Mo}1.n.Z7jA\kOXAIՇ2ƯɳiK:]#_υIML6^+ {{jOpʤ]R{iAc22SZY|p7gLʗJ!mw:ՂoO@FmX[ಷ3:Ej炿g#s<7frdFyS{n*2K%wË^x` 59?_\rNnB7ZݨC_r+L.V=wիv 6p<ڗ?@`G6+6d ?8$NS(bBGvra: .t:io TW.s;suXYQhP?'DkXZ~,y7YxcFCgv״6V8wo'2.eI:t #cPۊ@U/3LN,9YO_{~[y:ZE!+Q?Hb3#FNww~ih|~ݥ;sK2vޥr|ܶ3BB3iUYz~@~׼RDYռl1.ђh^rm?Qhξ#;ںۯ'VAIiy| endstream endobj 374 0 obj << /Length1 1827 /Length2 11563 /Length3 0 /Length 12734 /Filter /FlateDecode >> stream xڍT-Lpw 8$iơqwww!@!8 wxdfkzoWSuήԯUԙDMlR6L@>,+3lG+Z`(ֆ_ q0&r|&*䜬V.>Vn> h9CL9[0ZbftV^^n?`1r4[?h CnVюŅd eu0c@j`(l2@ d 5fTj9C< `s :@]Vl'XYNWD?Aƶv 7b(K)0;:2@6& +s<=(U;? Xwm18BQ'q?_kicbd 11݆ ,+ل pp948Y{򰳵>?P= g0 o#TVV `6ؠ 6? |+޳Llmq,RbR SL`bX<ΣUǿbemLmyS_"kBLY`?J???UV$deOXx(>Rή"d^YG8ژ=KMT O؀UlWs?)3|F>됴15=}l\ 'yLMlcx `jx,M ngy, n?9No`1;6pXo,տ8Bg=Ͽ 8ϙM\|hP3 >Wm/\saC|NxG_mOO-= C|?ym(_2 WY\sۿ"óRgq'`cԹ[c@QQk6}d> xy2^V)}N%13z7K& ]3 ؙS W3X-0`T"PMԩ|m0Nww^v]S-to:i. "bn \ 5)Q-=#oÎ\y{pPBkpG(S!ך4Cc|:jKQ<7ʹzt0mA+&n*`{1-FcDDM֒LDo/Cf-<8g7#yu)Ia@ddk@KT`T'1fSVF*tT9.0؄%RS夌Ѕ/䅬wI?jY-W`"vufʕ< ;̣|辸 86֥Z$Ӂv6CK5'VoʣAµ{d7f PH8ܵvmV; "qIf聴 `(\FH_í 1č}<Ż[cyXڍulCvwapBC2z_,ýY67 KV<:vu9Y2L^7pkbq1n:1_gpNYa xY:'7bmǦ M_ 6 l\68N` zi Ryx]cMnXtԼvSa 4]]C:YCEWG+B~x ?m\'PC3Ǩ,(amd_~`z8nQr;zun'M$Ȅ6Y$)뷯aSwhfzMEVT[ۮlG+>-40' Gw(%V=7ALލ믊t6 #ۡCIZEwwp㔕{B_5l IZߺνCJ%fqg#j&x'=zd%K\EkHydTțg ]r= }sHPmOEF~wa.x{Ý9 y^Prp0ҽbJټGZ5"FXÀbVGB.:2j]q?ynJ1QePfῦmtPU3rܳ(hͲDT"䨜DI;__|04Q-C-QФ3&# ޣҥ@ͻ)%r fp^3a<QSt\d@:Qr8ůiE2Clӈeok.؎q)5[ AG^f=4H~136bSPM귤TE*QzZU1`\w)D_,pV\d(nu.^22,Է FI jl]ǚ,R\?}pky)ܖ/DL~@1Hb %t_1MM5_5%U%dn?)N/jREu$1y\ el#*e(%!ѕK#7!}Y"15dBL~m6 dܺbTH(F\{T-2r n)\Cn@* B24X1 ,4I(Pjޖ@[KȑRLK DzSkve'y*%eѷ۳]&p(SpQ]Qvÿ~!,&>X]d›t(Sny!Ǘtح_Ka&(Dx䑎DW 7;,X`_¼}z,"Il{-a>N`hK%΢ҷϥ1R *+n|,}זe䕇QF|x<Ubm i@OXMұ#Ÿ&J[L8#p􍴅t}ˣT@%Y/%e CrqEm aEv| ˻c0[a\dgE7ư`~}:V dܵT嵫s\02Up# )|1 F*q+[ibC~־Ɩ >!#+_$C#ūzhtd3R>Xh~5t_ks0yi'|}:tZ|tU.x1/`tP4vNOqx r1V߯r|Z9j y;d;գeథz]g_Pϡr-#[G%ͧhv xU$IY"Sm?($4R;߾r$9j+(R'fusgCyW{կd{cڳԡm8Dc6UBZ2 RՏُ^ڙ{L'kPCWlvCE !/]bulA% vtP_>axLɹ3&J85vqXlyס7@/VNتwF59aɑ5+8#ऄ;-ĽDی\op<8av_O&nm}H8_gE^'7yoJLGxt'߯4$|{0e\&:lK[,5+ ֍ /U}3W p0vs#P2um`Yu0RUf7R]X=ccVMoeC"Q8G|%ŅF+?vpWNwLR*bjɪYsIBx=F|Fۑ %7!i}(5)Nnj~pϿHHʿuzLj}s_߷pݣH3rn #V;*̀rj)#k A8zgݫp9UЯԴwv 2l4Lvh5aF$TSi$-jzoWdnؠdyM+w f ߔ٦fp6ţr"vkb O3+i:Ӕ$YzC ;4SL|Co' A'aɛmy z|Tl(T,3v04?V 4:JD*4ylc7VF"6 g#jq6aln߃ 皼?xSj-2;Ne(+{P-!GPb/XnD:5X^Wqy7m29sAXF/r-~|nK RrƂ{ {1&N8k K'd<%}_'=6%9]jWVr-&E̳M!׫~X8G Q!rH.MRfN ԍPr~A xwlnu;:0ˋo"ȍE EowFih !~@[sbt5R)k#2rppΖ§(8Rs7ĹN$k"7FdO:YU ~fbҰdvp}ҟ1+ٖ2q+Z!=wӱwkUs"VgokƋimLtmڄ+9Ss(w|wGiSߙ 'Z3+ f/FYj:iX4$N?S(E/HD1h)b@u!G Dɗ$v@xV2x6չNX b5h,`- Z'S6|y!oR'V;y((>5}%ͣz2ڢ't$a4HkA\`*X'>RSH0,r .כTaK$ @/.Qhe6,1Mo̫sۃ5  뚗'j5 I'~q0+RƻD_V K_؞i j3§׷whBC4*:Oh߅6 L"B`20Dا?+|'|kW)L9fD=~7o웺+΅;MZ^:rx2LLB,W!ֲ@>p%xan\ctZ.P!-D gyq,3CU:ÓUՁ={+Nz@|ŕjP2dNizCojR%=#fv]+6p0X&q?{puPZQĺzDq>XE$hm=fB81rB&ҺelGdEQg[``8k  j:X$|FkBʭ0i .-_ MەJޙ,:l$p] *:}E҉QGڤ>؏2}~rpd] UT3KsF1谪Tޔ\4Y58ێ+\+4,g׵H !Gaui'In02Qja^6U(0lH˜bTڿ|5J~1d0U"l1sRV`fGI8J=Z K~)̂Wݞ \l+Q{:呺[3GKK1NJޙ[߼~/y~tk&߿{M3!-ͯLeDy􄔶Yp ߖ%\/|??B 8BNAgMP57 K!~9MTn OY}}x 1ZcT\6ooMXpG8(c;F c*GԤC8>WygH&}b+t񍈺Pht+sv܏am‹!ga?!!\j2,m_P4zi;X: ũ!5b:plneɟrb[TڌTsq郶bO*1wVD|9Ⓝ27k_d2\&"q IVEF2@NN\1XhJjLbb: ]-g}NԘ,[iЍO3b;;SRD=uRj|tI;V^(_.3ʋZc\jU>]N)≅yCKNDIFl' nMC*Șpi d`'Wc+o2ύ*_i[5@AV祹-bY vkjS>U9ωKqL 5,_.SH˽;W)ؗt?sٽx*oN'R'W$NuZ3|ę`gjIبjNg";j+OWU\TV;icK`+ȤM#$*I*eeM(Έ2Bd$n ֕?9 _6΅In13Ӑu0m֜T>80XMĻh9bE̚h[|yk#6jDw&~kd?dc˚4q(H{CpI+IVˬ _‹eǓZWP#V+( x-ʌ|z`#mSGl|(>mZbn<"Rh?4sQc$N$דc XmG1Ӎs}P]AX |ox$Li%ZW C}(t1]Oxs؞w8b|@[bG3` nvGE() SNywp$h-ZۂHOtl5g5ݓ8̾ۜr$Ej3pxNI7K v7{u(t%FY?oG`2#Dqdrfl:Li;/H%&DLq)ϫ϶$S~ѳ2jN ə2CGD<'_lm('4/uE?ˤo-J rĵּo~27t%њ*eaJ8wlT#\痒( ^<y~[N맡XA3zeX%`%$IADVA b]s) $V1=F"ےF{< gE`$;Dx#R[)`x%;V{0 qcJ}+hrIa>KO-sTV\)Wo^6֤R|^YFM'b9NO,]+RP%Fj2O kPp4, Mj}J^HZkmx^7$8(Minzף*DCUљʩ%&cf&b֢pl C w_?X"@1߽ay;\ܬ/g qTKY@ig[fd r`c0#Ro@YkNTXb;Y.X/MEL~RnZ#VcqO"~-n #^t$}FX=@*fz.3R~eÌ*Ԅ>BiC׉>i֧Gz!pB4sE=%D`yfPLFMx:LWq Kh_ T>zTa+FK;0h׬vKJQ JԮ|q̽tS !Aߞv-|@gvȧi tc[f纳k ]ܶFk&$P8>Q>|©LEgܯ&{U"fɛUocAsG6|VɌvKZ-z[=ycbO(\3LQYcLDk<ޟ>$F &5}2T, PR K%@U<4 U/osvXU\ldyLתaQ7(;N<ƚWv"*hP+#K'L劧dN$m~陁k1=Ck9rk!|Wvo"*hnLS( ס_P%3Lx['xezj9*XhU0$6|gF >4q'鴵|nE`=Nk^j^#QvG%IWhKټAQ@DSVH3'ϟ"itk_:>Nl-9Wnne x(2z{N^wn*\eR 5.Ӆ!HnLSi,T2Bd jPxo8}1|~_C#ƶ,JYdU,VqO2]*ߵΰx5-T)~?Ƿ֓47qV[ĸ_TafI\ʁ =(S;>!pT^j%QuX b 4O\΋tiKzce4R2KH⯤k1NA"G}@L4 Rw|8"ȗESaJo@Dh/s͊/I\gJwNMqVW˵ok!"閌{_˞WLVFSRi*2ōcpH,zL`(ZǢ[,{P`gp]Ff̺VTcUg=3LV=#H6Sڙ UXc 06G]A:YQȪ3ت>'=OM(u'C#Y8m^+r ь1A)}q*!XAvEOmd.uQVɼ2 |DLK[ۊ83#4KItEa,;I,X%%; n>|Pex4ր\`fu7e4@oZ]:BQ!_P <HW"hWӼ"?PD,|+5Z7m V1> R\|oX^u\"=\>6G{Nʜu:O$X_#}O2;dvJr 2Q7dxOwv%mvJJ=4,,a(J*"aE@jp(l2ΕDϻ*/cS/$>#IbE潄 gx3֜/IKuKb:,Q-:)21s(&%%6շyyZyU7ؽ'R7"+LrV}/jm DƇ2$l{QH.x˿t`IT^ endstream endobj 376 0 obj << /Length1 1415 /Length2 6642 /Length3 0 /Length 7605 /Filter /FlateDecode >> stream xڍtTo7)-J7ftR#A@alFl0F%%-8b(%4 HH 9W_}}>7 i!hqQ@MOO[J||&p 쯚 # A q:u0秇Dt<]qqY  RP(@y!|QpG4̿~@\^^Vw8@CsU]HJh(CrPxю# ~ L&J0q{#` S!0.cm]=7⏳a߻;_`F{ p+A /G]v8ߝ C7< (CkD_ip!]]a(wb6@z# pPO71S"GCrr;q [   p`/oJ(0?2n( Þ8H?+ji)gTU>\M i @\BJ ;g0oBH8OkW^Lġ@i ey6f+h8 z0(h0*EĥDRp5! Goj.pࢀqƽ8\1=pdC^/ x'!-P`_rq4 8Ba> E Ѹn@=Ek@Y/_Q CU!(`/7a0|f Q w o>y-:Dqb!!2!)[cf)8'{.4%zԦ~wj_#NІ]Sc6)zi Ũn<konCnVuN?AWՉho}$[Ml{`g*}t3o5!suT~&]Sdk}s׻cBtBW>F_PcS"4+zW쵕IoI`ˈO a);)uKA:~*)&7!42 nmxxŅh6O˒GA*1NKQ|.AoAS<]'~FkM<,g}iG8iſ 9M"i! y6)6k~}:E Ɯ3_ ܯp èX^o]2z< o+G u~AMs{L;yLI\aqtrl %SVòqҧHLV:jg9xΔ6'?zhp72OH[rv/z6ֻrU{ıw̞,# C,-U+q|xa 9*> JnQF%(c ))i`Xlh]ynBYo*ĉzSF<xO)@/ԘB@=\CɓIlnxG]*&YY};}[osrn[*7ŵ95IKn5kM+1ǿNzJHIoFWw#-ǹH:4vR|:dDqO&Y*tsww=oͦ%ÎnJ5ZoNWV"WQkۭ8.K;yۨU!q^5[jMAmvlw `酁Q!ZɧDyC"eDKU}32)kZPl1>}ƙ| _%Ո[5GG=H޹ Ô$zn9X6LŐA s;c˯߈l;^Fx>ۈ}~ś1|"ӴDfU''𡝂P|KһD_Λ{|׽QYGDEK\ؗSP]:ރ*!1Lk-eڳdS=:>d  9g"I3mz$p'2mi0~;)įK9=ʂzfz_2'_杂 1Mwُҹ,\`/-3Yk87t j|A`VߣӃUB~Ov緋#o@gAk{_&Y{B<ゾA]i>NR=b'2>?95a-ZnU.~zM8;(lvve V}LbQqIVJy5In{2z=gOgmBңz*- p?! Fꤧ}Wd-\ʥ~9LMOR"V}S;S}6)x?lq-eErI(ݽFTfs*ŏdJ OSQaT+#2$^[vBG;>$ yrThClGiOib(b%b˷IЃ~FC&^Q!5a59wq/)+h ֺ!H\GDV$qm|9x`bX\-X2 Fv<5svDmZ<^fu=>ׄuR[lE3{[LJýl"Rs{L` F]s4{,Be1X+}}^ DwNRYMo/9Nni0Eti5dT] w0#uVck' _)h63QA]r])IehrpWd=`mNU[O7i$w%L٨5 ]"_?|ڣw 7/B`!4ڹtA ;3_sߔz"ޓf{UK6G׉`O+\ )#^V;K#u>I1T-"v!CZCdćy`NqQJhї@pfI*Rn2ho2{ƣ^\ CòK#i|oo|xc~]>;VI޳A<%K>G1L u~973VG x^G J9<{@; }+"RTui[c 5<?-4 /$Qid|Vuj]>Ā7_F`)w*XסrE|XX>w]KWF(J'#$bͲAv&D}<\r74k37w6aB9Z>gݙ~*zzxn/Km)7l1<`{l8UXP75D)cm^کXFZjэ-K~h\&OP OWΚB"'=In809F@)#?Ni\,zo)w|{j_Xй}/A/#=+ 9,Ks+Ke%slj8y\|ӤCӗ2Qsu'Yi]vFok^(3UG'T˃)^!wU._;sxRwŝY"!cGen5[:6-.E=9Oڟyr7gePAYϒk##Ej Hsy_J ỏ^Fw'nk޶҉-t_F>j&0*]gv5ƨYHA= P #e(=y&Z s:l-@ n2Ձ4lj4p؍Fifu9|Fa'BbNv[JՏ.hA@m"J"̪IZegзZgi^b5nUK|D4}$mSYɼ⓵:1 Ar 3/w%"}̑Md7+^)LW=|в|R&q-b?[Z젾dYy9]c pǂ}ڲߺ9+hk`JwcBh?Qb؇(H?@$$}n+XAZ^PmTj>zUw 1L$'l!IRLlw82"Ǖ1W8_}Z5Ŭ ]E<#~yɐSZ^FQ7ghlR=(dO=bf4GM? p&<7*Rzq6+`Kkr9:3,s7zd|cs-`\)Or3c[Hh}yԭg'ҒT M0CO 9HDu]NuO8yVvӣ6{"JCOn^EJmnef>>Zds~G\جc86F:gsӵ^m#U*(Ѳ o*a ]},>8*M9O u[k,8ݵṛ w{!XIԽmAKeWwED%E:ؖ XԢw#І'zM|}}@FERGME:wIXQ2 !٤$%.άk~Ɵ{EJM8@ZqFL44–S+Ju"fF_UOaJ#F…՝,=k}!m\e/NEB|CRRl llm~'q\80Ddr}O^UlF@ɴ8Hwn Tn-lI(NY<ѷ'MVoa/u/ 1h}INu"NAznѰ^^'r[W{vq1WSP}gCkDr*lp3a}.;3u>Cs7j.F_:%7*Q5T Jd vT0ٰP?6a~C)}ypWn`^\L~#Jb:O!͋ N5W"WM-jbo96m2Ѿ,O^H ~D_S;x(߇ }RL Yy *_+͕IHh'NnWK^*~5sՏ:o꺮tNvZo]dUP㋼n's**y{qFy=)Մg2-U"U~Jom } ;CԏNܵԷ frautQ( AӋɡZaʇ9-ĩ'T+/8@G$݆2~%E%"1mTAs|*ֈr24'6Dz[Cdx?A0(6 蒳Pbїȃ2Bωl3yov>lmOx;uOwZV{ *R[7"/N|M! :G> stream xڍT6NH*RC7%03%%- (- )! ][oγg:*5M6q+Xue Ĥӂ:6c]T?.`sG#O(9@\ Op"\R+2;@1$aN^.0Z2@|`9lj v| ]+ #b# 4p; a#1Z_vM hpX79@S^ EV l vп;'d@m0@UFӕ`M4w!?d  gC~;)KC$a`+w}R{quPo` ZYn͉C qvKMy4acx|\\3ii;؁ `b ~􁛻.n`?t7VKW'l~|'=񣼬`PCAWBJO寎퓐y|8l<@~Fwb0#OVd*Gق|'O⿳Tɸ98q3 us}e@ kjV7ʻ?N8Ql nv _v\ RZڿgߏc?|@e6?됆Z¬~'/ 8V`?pCa!Ǟ0mx >?葩ov8}5jw_[<>̿ [bM,BjCZ.I=6 _q}+4Aw7]MΚW,ɘصH8_,͜lQ{qQPZ$L?#N&\QO|BM,qAP#mѤeM',SmQim.RzA&cMõɢOk1Cc|zQdJpfGׁn@͟axB}dRhU: ط%>/441$ ni"m0qdlҮx:r'm|e4ZfƉ.PV663fھ/=y?(m^iiƮ&g>h { j._*xQx㰑oቻvĺjƬCyJulɞ*ǧ^'ag, /Rzl%\Ś:~@. x%I=:yօ JS,2 `8 G?m&G#us~z'6I._: W(SD*`5r1f4~)[~<' LS--;WS]([yЁ\y1pS3#fٶ4,)Sb#a`Y64HfG`mA?j Wwqݺ柗n30Og>BNl giI ԡDɣ.ܽS z83 brι0g HM(=g_4y *)}~lW&z%zNh)"8 NL!캦1p ٫)[>p6|GgPny|IgW0hTK2֕R{J Wv6C3K̪~gUelfk3w٘y :n\ ]ܴf6c2*>8?WAXuG7Ǻ?㥶ro-:[ |~R5}lPZ(@S.ΔCq+ڒI5ذ֝=F eT{MīOQ @&v;`^ r*AOXU}\l?pܽsnS2_&U٫\vƅ ĕ Dc%x/hݥ't t"m \MiOHz-1ֺCLMZU2']W}!Z(,F61WEU䓍վ1uڙyb5b~Obx 8iܓ4co%|ߠ>_+mG%!hEd&U7QV'?P2C^c1~aZoo%CɉH4қ7+n:34'Y"^џ3WP2{ z{9ogW7]Ϧ#orչ( JbG,esBL^P{8Oq1G!yڳ!zo,p̍M 0N vҙ҉y"`la蜐Sh{2Jr-*ߎd;|(_k3'bY|#.ŰCu%0B ߧҝ=J:{mobA:*HY1-ۥҚ?lm"H,u#I#s+Zz(=iQKc"p>+@tEo qŝ VNEb _hC?c ^m]P\J#+:Ѡ?l->@Oyb ihnڋ?t+k);yd3ynSZkȾ NM>,ޠW,Bګr> }^7x,ˆu%wB=y/pUGrĽG^lޛ\t7B)Q![wx 'sQvZlݦƔ470aPĴz~Ft9rIyt5=X1Wj7ok +)6QSŢ~%EXv'lb2rEֳB37o7mw)t'7)Qd=Dr0"[w酀$ *us.V\xMXz;z9*5։jf?zATS[JV]}, P'VI aOyܚ+V6p]4k T~ /Nҽ |,lNa!&:}h5?zSSHo[8N;h.ޭMm%5P X%ɻQR+ol ;ٽ4#?;Xe=n3MUF-SVwa)<ֵ_gm?F0˖rw\v^~>eqeӋoW*:J'%/.ĕ|لٮ/KnJ; Hǭ@3lL)#5'soĐj7aJd<~4g)uZ]9Ѯ{g%l4~wΊ6s=푯!9.TŸ2t]s3.^%aKjgØRlՈyB5oT{5xOZF~I„%S9; OL4npn.ۛQ1yI=Ji;晄 ˷:7$8>$*,W(2yҟ8Fnv:B TkBI[\̱Gim,L@UHsG}<䶃nFvUSG֛4t!ar" !:XZ)L7[wLNoX!Pƞ -Pׄ9dIߊ>黒JKW:N|ȊYK*?VX.P_dR2L/ eN~xb}mhvR幞2>s ɜ%m,~X4SFʳ64'= kǔ\x_xft6?p2ڀpQ鉞g8E4"ɑ'4*|vX&eARJ]~0/b"Y _Pf"1ZOۄuѓHAXnEa_GantjSz jAO#ԎnԒ-rc nD>U I:ME`E4bh~I'"}p3OjIhZDwٶA(Y^iې N[N8u>O+`4B=uq"׉ݱ K{r O0*l7A:@Mtn!#CafQTK׏{-(>Iݙ"PfQ“O(Ѱ>/XrB˶oޛ%lF!f!ʻ)_b42eGG7a]”wNT XP lmBF=dg) =KBZm  =a}gZCW~[6^K;7F `$ÖxB-$Lj~Y-cFi8}CatK\# /9pE5fߍZ6@l 'Ӥ+^ͻ8K*dug`QC[!!4aEU3 Kv[ 5+B,szM|ne_*>EMR;WȫœA w48{W=v*A#)g%LHi;  +LxI7__VKf(_"{S0s+n=wV…%& Vv17UnÃr+A)rHv٥f a3NVb?:=obe!h@ݛ&Z>p7,dp*\4Y9#2!fq}n>~U CY3Ӥ\I*{ѩi*TS1oܨD*= D~%qDܲɣRMg~𥪽M,Z UP 01:]!f?vt@! ,6;fES7+q~5=Ԧx"3hq? RN Ei}x~D^-`-&3noCs8_ısAN K[풺bvmgŇCD=1ݽMJDgvoH{FdŎ=<)B"5 rک9?jUId&ޙ^HVhƬ!BWnh\CU 9bizc0G/ZAe4䣔^kk9YC<(5^Y8n/nM%'qc;(<Ta%(VB06Y_%kKɱGcKOeه@8F-Fw\LwQOY45 Xu̱5y; ,G9"3! Ei[ZMɄDr2d)lϭr&Zտ4"Y[,F]x8.VsQ&t(PctU\%^uw72$9pP#v=;YXzuWJRt4.)]/mG=EZCQ_Ucƌw ?狒Cxr;!-dj3* 3SV$b*Z/Y;-k =8nD9wץ7Y)GtC7gڅ_hHOfQ]jyՔ˧Fw(5fZC(_UDhi9nxv`]~C]XY AC#NN&Eʹ-BVo=9bh׮]>DFueMץ_SRa}+; /&ddq:}x'jԓWKFΙ>/0: WN-,9M|헽7~U74zTk( {>AƱ[sV .2uɽX84݄D~Yofqg]go#D$q80$;Y\`@a1YX\ZxNf*mVVQb=Ftzv UCXڣu` W"; &B)3 .5tb ,^ԖZ'EJ5Tyk]'<ېSH48&N &4:okw,Oşbw?l^$B/HAM/zo&q[9G"xi/tex8n缑&D5c=<׃؞‹=0ZtÈnH5W| _wιEQw` 7 =~b'E>g9Ur+ݦ[PșNK܏+HGS3~݊"|>>z7SMfG&ƣT Z/?ͤd߬ru6}`xu?LǬFY m<,] -\V8{9Z ".%R$4if^ٰ&+7z}P觓!j'٪eƅA&ZpIv٩x/a C> stream xڌt Fc'FۨmOlqX hl6;}k2ϵ}P*(3 lYX"J,v&6JJ gkj@G' ;[D 3HO b `errXXxh5t02lN"vfΠ0yXyye:Zd ́6Ɔe;c 0wvcfvssc2qbs4@pp6(@r6*cB[8#W3uv3t@k c(K큶(woLuo?,lelhllgcohaak0dݝ& @ֆF enR wyNƎNLNJdO&"v66@[g'?Z8Am`gVvn^&0qgVppJ[$Bx,,,ܼnlǽ=_Ġ |">@+++`4ExM;ZY@cID/;[k7͗Y^U8?LX`dd!7(Z;l%mMd j2v7h%gb-@FrNcT?Fiuslhcaoi]A kZgie&.6TBfm;D#We@;'? 4sZ-c+俎ߐlL'4dxv/lA&Py>S;G?0 o,x̢o鿈,Xo ,̒o,@H!P.2o"@rQxCJo] !Pt7@(E/EzC ;73zC ;749A&v vGGtケCf7 jbt:7%Po~A73c_2P@[Ǐ hQ\zlA A?/ 9@׷XޜsQsq+H쿐 453 B6\Pط9@Z@ۿ4@bu/j_4+毊Ax 2-H.6FnM2)A>b)cP {Ыh65KgbA-8@mvE:F@P4;g ry-_e?Dk% 2rX/9]'ȉ~pzd?eeav6wE}P#2p Fe{AA{ oɁI&2C2;} pۆ*vo j>L}G2yp *v+ ~JZe"d+`Yȯw>ƻ_[>{?}2[^K%J.vPJbcXtm,p!Ϻ¢ >Lxʙ}SVw.׾>6g톮%j3<ϜAZMvί٫Ԋb2l&"M~|I0\S2Ֆ\EpƑ:[ےa=;2P J~N)B?fOT]ImQU?ntxrc(_>⽠;/ߍW'M )Je$~` 0}:XuNGO#3":tn{ӰUU7Eª>009l; c @^uڪL>=l|g#Itr'U:kCUweNg+|۶M @aév44X#x-lK`s::B CS6i#_5˸jBO(s1U7L Wxx̬ AU8s/93721΄h P W;Eѽ$D ztbV"oWچAլ?ԏx_+p]w[DEJijqva=`]U ;vsYĔϭ.싯11ΚÙNs.<+vdsNYMV߮q8>Qɥԃl&Kpn¬}71a;;;ȄtIMieiAN_^"ZmDK4(a!l,SjI\ ֿKqֵ;p#pxsTlf F_R\|eKzp=W]RLs}oۅ\2spcOt1-݆ιYsǢ߶0*GnmY&r:"ycl$<2&[vG۬jOHY:5<(N({~N bmnw?Jg ۜձ' xpt,Đ pel9/ݨ*+2= yqPm ?J>=zmˣPY!e\gl-~tP 6τ,Q,$C=|?Ɏ_g6NnTĖG&D,,ü+P}ʉQ,!vn_5ԁHC<m+G 4o٣C~a$YNQcv*Im0 c[v˯$J9NP(9L$݃VbHhY~#{~ax2Ev}55֑)dry&u VY`:U~'ǶGYXw/ME6$ lv:0{sW[DH'%M*wDN' M-drJeۨ)R&\l"H~W6n%e:\B*8FKiwOkta}?mbaC:uFdvc6C?*oֳ98lNwX+҉ 8V1\BMB i RJ0z'.4FJp߱UHw_FU?_DOIv̠JDPW}RE\Xw~ML.j2MG;Ф^2W龠p#eE\76sRH6`йN ވjZ˳4ؓXOo:QH_-YKf5GV8ë֛/j+sIgayª?/b c\zڽߐ!*цgMM91攻--"|U yVoFs]䎥ȀA|g$^ܩџDW *ƣ֢/uV0\GIXHI{~֜f:_5lAY,FTKj̖y ٤> GT~۳M0k{Βyef4 /mJ_.w!?m9 A3 &'}_^2Ì4 ?)z\&mDoS>6$mGH}C]%s$?25^ ߶3T!{IM'_XKQE V*M3bl]eDX5z#Is==YE;sX}l#%RY\LQ7wm8՟a޴KaeZMS.>?{{ a0UCߎH%5w 2)?U4N}/0,K z jF3GV 1/d Uv|0*h͌BEBMha rŭM#ܧ~@Lln +}9alEEURu?UbK` ĶgACǜ-Ic0Ae DWָS(-XΖZU1{aG=f1i9tbј fSԣ[dEhe{ԦN$>Ou =uz~s#gp#Q$_G/?nJ5fT.#P,.QLR}&j9/MnXZLj"8,NV2|`nVrɀ•ܠZ:zNS͔BׯcOgG ͏ NSx\<)/W ;tsvz>Τ?w2;gZI\f,є_a?0n\xfJhPFw#{n GzPɩl6ֳ-8Zj)w8tGd5'!o:lըtzJoÄN=%2`Dy3+RSksPW_!©/ {_73s4z9:*2Pߢ|awMx) {ud &ĥo9K`Z%΄ M4,\JV/&Ύ'5EG.*C⅜ѐc0i7 7x \^pyzT 5(7! s=$i_[-qKvxwPznbuŸhFҷ=j 7p*=&]ݯާEpʜ1<rvh;O]ndžHٞ2A8>*~vG=SMٱbKRaQ*/{<'$2T!Ϥ > j ) sNW~:lvjyJ5kP4~}5(Î >r@slp;*ƥV,k"ECct⑮bnW GԹz2@dՓ+_qǴ}yW)1ͅeBd^!JlϲN;?~[Jj\ǙM@n=X ix7Ԓ27JǢ&q>2о}nϦ8E7r;\*h_ɗpe^9F N>Qu?|1Qev*[cn,r7E-}x". -rDbOܗ`I+nn-u.gw~&*5ܬ3Q 6ӧ2 4h F6*};E>Հ"v|7Iȟ} @pzU}ONWd0w'o"a"Q+4B;Ylte+[4Qmտ ] Yfgu$];q1w rTEa:Ur#$UNp^a5:WXJi[ga8LḌkT h'm|C?a_W!j"F*AVdD$;}@f&:b.q~~/nAD`$vp#^C>\ʺWN֩ZU唴 幊L6Iq˗E)g[w;1GHVFS,$R&Z:M{E=E$m7wQ̵E{3,2_^k_9C7+B7g#OӤZE#(%,rOf'nQa U- #xF4$Ch `K<(BMk\S,Q4 FĶ.H5x Jr2LϢZH7g">Dl ۟;E~8j%GMe,pbK[*?DO[PD;ﱺtчl8.'>K:aBKL~nK»!URh~<R1to1r132& خe;.W-Chvn#!p'?\0L[]@4_ThBSpBCq5͸ؘ6zlj8:"bqnD{W*sG+ ۏD>4噤*H^ + E#NQ[[En ,[%g&Dڬ`xlŮk?N'1l= bႫfu~ &'=%7 R'ʤcP9DO6h9*a'u\hC8ʨUWikupF1~G#[ͺ}ˇTGpπx`eAi3IL=r([El[0?VC"ڻD'%,4 RH2{j $:q3>K.߰=*`%Nc oNwJkG(1jRsI5SS1e48S0l_ѵi% YWJ/SjO'>|W ?p\XY\T'S%\~!ʘx3Zhs>vcAʣqWZ?D@|cAT_i7^ E?H2\2\c,ۼ+OT 6O(U[qbO¬q B~v81j1u6JxCوbKZր]\D ; ǯ8!%xYw> PH4^Go< j8b^yO 2xaOPc|B?#4ղ͇d3<$-H<3|{ ۀҋJt-W>Y(+x99߆,0:R BW$ ѓ sT~JA[z әMML2okD[ꅤwV4Ks1R]6PPUG^ASKb=8ⰋNs=w7(Q#ǹ&Zx^w[=1~ t(dTHC[~bȅ-cwM(=6NZQRinO'Y4&b|{b,u-T4%e`傟 ho-$Huz9 3YBZ }m7vrp<%Fvȟ}$qc/ΫIfr&Dgi, O(#ިwI{G]QFˑ0٭:8 bEO*0<)=M4N _O5V\ K$i2.& xY6 -QۢIT3Zn;Y;324:OŠ8t#}Cm^g-t1Jin;Ijh_JgU?ViTǴW|AT^>^2z3s~ZMTR?l~reFH o8;=B]CpX͂l=' E.ֵW?25L٦bziHc)"E'sIט딾\3ӣK"qLGvti㺇x˯DHߤq.Ũy\jJ莠Qk \wo.عV,}gEN3:%8@G#F%(,H݀v؁: wS 0V)^).r~.kpϚSOMDsg|%]!sZ+l'ۨ=9f:pQGeRIГqeo]YA0.q5_JBJH#ijˁ2 #TD ^!|S~E曡є@zyR3ٺy}:cD|M ɨ0w5q@FoU8x?!3(]_j] qU jD tcez=k\lj2I:DV4D;eiҥ"7X\b7K>rgj7bPECޡ -|<ۊNry@JvP38oE7CENf%ܯTx_'i> .f~<, nDdhrǂ&BHǿ\\.1(;a>'#3|H~=UMЃ#Zl3ԻiZ"$Qk{~ T<+==IdRD3GDuVD QB˥>;9pzxWE%MuĺQPtHdѦ-Ck)x52DZ3 :8%)h o*toUb8W&C@tqi]ot5iV/A~Rw.'ovBO  f]WlH)]9:lŮȁ>Jc /ĒlkQ;B󱡻VحZ H-@~-K$+/X@][PH ?êUDl3(mFV F>_H穐I KR@k,Y~e{sOW:ȁtAҶQ/O":/MX N)$ښ?[7yE' &$Gĵi̘sx,fFʑP5uȊjƑ!lڔ]nc;Iq͚gRC)$$^03pMIiRD=UyAuް37>qq7񛻕o_eRoh"8ݢiשI= p#UC[]fEOp;sy5~r讅JκG|'.eMZؗ=??h%2YI- ̄|«DIG$q2Cl_ଦӕE`2 _Kr6QvH!қ`pQG,;dOM`f/Fƛ龷ʍlq7)Vfiw?[XOe[1ZqXO&e|a>^T*J3lbkoԫBsxYd4\Isw؉!eVc*2J CلQ =cHڎ3Z Eݲl\'C66 L+s[,%+_l2=!mj?o*29R޲Vw T#:bG"Zcj lFFKc@VȮ@)̳Q]|b6e4t]Fz[mѭ 8Ư;pz兎ڔԜ~RI2 貤x!˩s7k-)zSqÎ^v!Wq_cR$7wp Ϧ58rkP=#BW^%0#~ꋘn_|j2+d5XUicgݗj/9'^˶VY.{oߏ%D|'@S b烗g#8C| xOR8b[BTDS:In&Z\Bb|].hʲW R}K!vyQe&=N4WoL?j颓:g<+V1+"2gȑmaZxXնj~oݎ&* %9 /hvn^./WIipB;KC1<?"UpCi<׉d_y6~2lE]hHk9h%Ur-׮RMpi{Pm#,3;/%\k`òyBw?&4w:+Rkچ(*< q-wp;ei|as7$ܫ_ 8'Bgmxτƭ_vj3}5Z44ZcxQ}/3]пhnU,qt{kHP<cЇEKWSO:u2:9fl?Y$ %\:%9_,K$M>fqJA?^а$vmcN;zAY k%%;/)9s7I>5zQK:ϡ&>>gtDv{76CoWE0vʳt_¿{Ϻ:ۡ(՛r.&(#ZYjZ>B PR}€a[uQ& TaGwz(# ɚ, u=30O#J2wryC^hwH"0]C\O$0gMUuJ䱖|ˇގ?>l4Y4X6u+]!۰wIm )f7b~<0}|x_~blBR+9 xYT}1q<蛴KΏg\i꽣N?dz;-u.,6O ]DlS7&p#NHTGFUj6gU ڄܹ s@vZE:u໱%c[):~o&7êq;9a~4,Rj]P# F:頋>s?>*,`JƆH[Jv~rYsmѴft[{>mhS~`ֽ-Y |Rw=9Y5Vv :*/V| rg+,!I%SK4b7vcImP? Q0뷁;SXܞz?c!1W9;5"]`K86 ޡsr,Yʫ?u9|hk3H!9^f~|9;ȿRmDe;E{?~ag 1ԑCMqSwcW{VXn UgJnE.̤#2jdn եˑ}ANO:1ʌ-^ޱm~2Ssm9uώfk۪7Qj?S.wGrmZw/v$|"*3$!3  _g%D_At61FY0 ю։UlR'j+N9!aY9vV%)n#\祜@0 vNhrTg`㳉S8SS"xp)z&jr3 wv҅2wuøUCW@Gr+q6:c,y~@]>u(U?\R2C/ׯIu_VMjۼ"ý:SK9ɑ0jUOvDy챉/| Seaz{9C)Rq~o!=,l?[WI㴇kf/Ԝdx%#32!`DF{{8~\6 $pߠB@X^'Њ W┞}UUV򡇈̧?+6u!yor'ހ 2dTz8ʷzΣ:T5g9n9z$=KI(<**}a1>l|"yUŇtD3Z{7O:3j&10V1 Qfi s@91\'\l⁀}HQCE7U|'ҟ7@z В$&M_(HP 7Io--&w\QQӗ1\+K *<,dցZ"#dtF:RW(gD | -{&YWh1/f-jw\,|sgxmϩE9ATC| o&Gv"|,7=A?jHu #7hKsHx;ؐ)FUńPAYO:EܡAQPbqU1t6m!2MS)icli~IGnUeʎ[3ÝkO;SM2&,'o`$exp{7cNp}P"\.RٙBa*'}$:^dt6 /bν؎ѝ qsЀmuI¯ $pDPr X[=Hѐ^R<"^JיVܪBV<2vYI-Ft}h^0  fiYo};W{$UC*L2ǨR6^yHSIS3B}{ݪbosԃlCkLE\XGАL\MlݜLu2!KR7ja-fq3m\'=7OMZW3)0ak݅c& )_wF] T_ H2^I9;$R^FkԸyhz}МpRl@}^]~V'kQ"=mk;7mNK7r=%uͮA;2x_XXK5!+`&1>U ?AS(>Gp{~{A_m!8D+O+8/; Y1y0)Gg)l9QʋnlbDTȠ tÈKގYʍ )eFvKGZQ/rw?WWx%EޏugqɳK&2#tڀy\T-|8`" |#5'olޭ g'0M1Z7şNI< PIKzz"% $-= OUYW4&I28WLBm}rA%~|}\pqF$ Q4#.^`9M6y"܉D=hvn;`0vvrB`Պx6=Y? ~S/S\B沐8w9KKr>9ք\tQͱ~kIr2XU1XB|qG:/0=u|z*I8-|^4{$h26-;0I{_.i/ʐ߳ݻj_".GQw,ì <|T瘲61{ZekEp?[=b,P_T,/u[);~F(wVU^^nckޟ3yΘx0wk)2 vC ́K U9thLL\v\2-TNDiixm愧Ա;66? &Zs?J)CuS,].s NO6*rR42Ә\Y @&ko(f"Ki:BǙl,O-NqڳL,jJӰ6KTW0Y҉ l%?ؠwBrSo3}^j\- {򾁛 %gP#6ac*d*\][f7![kQ9zȈK\%LٯZ𒼾e:4k4crZbqdnYcMUP78jH,Rtvm{}y@]|v@ۜ@|.. ̄^>KNVҺNݾaeЂUk5o :-ρjX_OU$H;Q>;(K!#E|x9gJ&^4 O+Mӻt&i-etONB w}8,l>NFI}$kbNx.nR qjo8B09ERI d./T`~IG+H_ZfE= ev/ x&濤 ~!.O#|+9y%K3씴{ʗ؊PNJ9-8RP}hivcZ^,w«M5t"BmŸIָZ䇜hRZ4 ML%Iyw2~aG!^#I`d;}d.p`aq{"N{EBkUaѧPGtit(fؤEiJ-!V~bd3G2 ŁB8҈F0!n}ÑYqSz381!H+w'Aۖ!* Wîwɢljy1E9(Ϩ0_{FwSZcje5|e_*[>(-m61EphZ[Jm?jFsg<9`/Yٱi-_#;iC.K" :K AF[bnҹZdͻJS/ Lj&I2Eq?17ir 3Y`<|l{,L%)F-toQB`Unb2p+^g$#ڮ@'pnosu?Xkb1%ɯ8j4zDdcP_1!̱2j1|ؕy. L5}42=LN\n{dGgsz{\& >dU#ѽG)ras@Zs#k,lwOpbg|{B>FzjudI)Nˎ zud19}FtdֆڎkRёUUYYp2 ib;L lUbWjiӊz"dv%k%p\q1@º^_Yu,<%aife;zWOЪpt,V JrU%GNsNc5bbR &Yg ,DC5hQKM%d$݊#w tz ^I%ɓN"@Wp*ƹ F#pQg̉MCk]&-N[F|h%#ߩ.Vw*b:B.LE+{mbԟJ_s f?]!О3}kuW'*6V\I {@tYV9G:".,gBCXQeV.ojcB'9-b1Ws[+#\-Eg/e ̃4/ktPx):j}HNED[LmDBk!}!C6RFELr}t{ӵ(-b:}:9ƆXe}5yg"CV"#DK_CG! 9( UN.JW799 |;Tw_ݜ!p\ H*2"§e0 CYw: pSmr 96d /" 3 B2CHO*e+ʕ8o.XK[VPPj=})m8V^/cJwlŃ 㓒rfQȰiەX'DAD[*TV ǡ1 0 P7 VVRJ sAeCI[VvG5EM3E2dD9xm- 8O pyѯz~}i of\~#v΢iU6p ~ օHhS~HAxߞ5xBZv4'dd> QM鲖߀_/Nc^WOnC[@Nu;tSt1!W~Hů5$٘ *M.:$F䏊j ̢J˞(w[ij&ҷ=rm=v1ө6N$f:50jYAM,H} (4Ug ?vg5/CȖL=30m&.׊NpI ~'G3ߩGǒ%pv “ 5*uυ3g[%`{ lڻa =A\Ԥ3"L輼{2[F,%SJwU/pjiu7+c;`9$|7C>&CsK&SBr2",OO}!W!ؖa>_ .=*>8~=|@JrMJ$E)A"գw}F0Y_8ґ40'D[!9Mf an%zRz!7ic2%γT88EF`@[`1K- qSnνOWrHm5@r(ږ9BC,6Nd4M$PΞ PkwN`vL(!ڑh*di7oVI'wˠft$po9| q= endstream endobj 382 0 obj << /Length1 1375 /Length2 6041 /Length3 0 /Length 6987 /Filter /FlateDecode >> stream xڍwTl7*KA a-HH#!R""ݍAHHH~罟;ٮ] ab.pj#ha1<@LI@@ KJak`4N F p@L &-/&#A "PM/`(C@ qYuAbrr2BjP  h7'.#0G@`P4!h[rUn37 un`iLpy%6G(('Aporu H(/c  &"p{qC O$].0(X@A p߆`o yp L`\w AhooE Y ӄԱG:.[pAZa^>P]Ϳ-p"\h@P Mwp ,G)[?(@\p-@`.PE7 @|A[A08Pͣ`-<1'{p,WLOV#0aq@X\ Ab]?p@bqSWoobC,ہ@ܗ7;]-o{<qxAo1ߦпjuxV q@ !¼a q *- a_: G?*(4L K\JFX ܊q7)@PDE4k/@Qާ@僛:NG")=THApD\a5B(fm'j7WƁOfQo|ΨIkr—Q?/|;Rcji }ؚjWCk-oP] s'l{Rҟ|_>1zjtFZ|L82.tX;IM&@89N7|Ů,H Q`"x:Xi!b|(OFލ˨Lo?yylca%dЍ_nYʑB"!-d2'/XsbtkymaHxSKZC/$UFr2xCO5kQzݩERRlyl?jIJf Ѵb.h|sd"-;:ɈU鶸)IE4D>O6.AcoQܱ34Gbpf51ͤFoۛѬUQKwf;״-\>poUf-5xU?ƴloCLvKWeH,W6'W`"㬽%w}tQ:)hh#f4`.]a6G<-7V"P:X(#aFq5wߦbkp d9//$d2/+=F4"~?W>дCj甲lB- H.FV 3¢fc쳁NxamlD0!)a,Z-'!q ;m~O:c=lJyCi0h? 74(=,00q5RX/v*]ukPy^ hu\AiYe{+ϳc2uV*E׃쉿$9F Pnp>'{<Y9 j. (}tap/.a_UzԞUrQI*Qק~^)DgsR]k7m&..~a9Mq}G{}1= 9?e_-ę?>6,#[laQ 1)˓a>yJ;tIOlIWC֜?^WlWL*+iTy7 4` W`+VscńW@U& >y$B1IDq.aQAFֺ0у!M#l s/ނ+,954v.nu)i:/СG\/fSb g3ՔN_0fWѸU Uߦ8>,y_/g…N #rIq:e9SkG֗M ~0j焦los [mK8?k/ݶL)JVU4(Zo?7Kk *:;D^57"?dH>Ǭ)g\|`{FXvKL>Qi/ˏOfgI䒜qL$$>}-kq[VdŽV؊:&{t-.] 5*F2^@7`FFlWqSAlprU<@CR|ɹB^nٵ௽Y6o؛axP}n҆kJ3/9y[72.{p'L>~T8:kǟoxrpy<ᢕ&umh$w љ)Ɉ(_G0zIm++Lh&c c!<n3lfJϜ9ر[9пj,}_ayxV9u gKiob:|gS7d͗:$ϛ$2dJ*0e<|S1$[NoEK/4Kez6^fS|uUp@Rx{|ˠauw{0m`õ㷖iU:o{{=J,֤ 8+oO]®}J 0@ḎBv[g}>6K71yּ+{j+܄^#@T%& J t[i{hdt%Aaƅg!EԷ{OCr*FGBwnHdf%=y̠&8HLlÓ˛ܭL8r‰H3)hhU_EڛAtB?יa,d==7yo5ce&Dej: D^V݁O<Á0ZD`LQڒeE'(˳1]8F6>/A XÏ&P;UXoD|qD;es/8ma&|/sN^[7rҠMpYZ5W16:k\^dn{䕙?#*JIL-v~G/6ƂhK~dTw*Z͢eE|M)Rjqtsd]ֵO,L}xIJ&5Q'IqEhM>,;|gQ Bu$J]i}IO-%8YAJ\={D犕0+i,U|(2U ɩ8yk7OjV*MOxusDIR|tSڋ;DV ޡVz7Y]`Ұpy6I*fSf,B4wz{Oei~ldDs7笖!BJC$dƩ R5.Ym|lӥ1Z:ɉHC:xu涬ƛ&α߄h+CG.J- OG).lf Q*֘[hJIsøNuf- etq[{&&YQ:½K39ÎUՃU~ öwbnv_Y{מ) .;[M>#5&ȦCyzzo7b~TE 8Qdʒt,^<#.zg1T1C4A".;ia+iy=vϭ-{%'OPsy1AY Kg|UK()Jh!bj-7Fn1z9S/hމ!Wd^f47I:6TM1mirPs( Rk=4Fgӄ3Np&%NS4\\D"c$nW`&m]mbˇFR<}QrTt|͙YWZdڒჁ̪Ձ#fsPǦp0=c?'XxXcD"Ҷ "&{@xƔ4⊑YvXQrG%*67HEG#_D7 [CۂWKnKl?D6׎qk5](UTT#*sݹsJ;bFS\ڔ<$ e\c^n2J&PlTospAVk)8CW|ZC`ˬo`^{nص2TscFw t}gTBbVI2Ϛsl6EF" ,6)"[l`ׇ6뎗S߻eʷUd",8È6|Y DSZ}c{^: 8 ۉGcjX߾Wܐ4Mx0sp粇r"WjajN\<Ϩ=r+!|2Xאs(+I᭛3UQҭ~~G{~T ЄZPOq<{="Ά'WG˥ -~%jǨ_Swf6Hu+?ަ' w= xlfBDx -Bl;VQ䵘d+8,inQĈ7VύC%6j=dkWR>~A{12Թi3L]wwP[z82ЛKmί`2>x(]UTI\zjlZ\tmTb(R;FTVhܳbG+ POg,o)RqvgI8 |4z=H&~c8/jk,) 3Ŀ+|CT{&4 >%|l%,moS^duJ_ѮI5f <]wgr@S9 NDSxF=.|J/ ժM^( dʟHEC[}s<(Jj 4sFYq_ /M#Uzo)8[&]+19L8pMl#$2xb ط+RM.t endstream endobj 384 0 obj << /Length1 1426 /Length2 6661 /Length3 0 /Length 7640 /Filter /FlateDecode >> stream xڍvTZ6]J 1t4% 303tKKtJ#((]-z{Zfsg}>g >-"REM= 0 A ،@p_"dDaJVH& PwP\JP $((! .Pr40(AsS^8m@IIqyglchZ!@Ψm } WH3 #z *e ]?Vp@6 (jm^_W/_V660g+jC@m ~'`ehAPVV`5wVy]C.H? U0KV*œAP$W~J`8u^y@}P[_%غBn 5,P?= @^.o `*~|V Ŀw@ lXP`ݟ=p'T%< @?g(m 7W@IX^Ew`>a1 ((.G-E WA`?ɢn>_w,-J ?7A}e_Q|T ,/`x^ݐ(kPo'? 97B̀<K#T [0T t`/5U6NGo  .!Q1nEj1j' [~( r)*APǣ߈ ruCoDT `s޲ HqQ[=~@ O F:}HY<Ɛ8Ɠ4.>xn We%|J'5ecYko5 IW z_F_b3v5 r¬GoUgsu '?T*ݬ{|t/0,hu$53xd,wQ=o7FɲPBƄl`Gai7KId d{CK ӜmXZB-*zQsS"HOzkv"V"Ȣ~:!&I'50;IYۦB)Zg8? .eK?2S~~ H?—LLH3Ɓ^k,HitIҲѦ{[!?Xt|Nʨ{!p\%5ޚW oR3'{_>jf`ӊi>S!1HiK]&4V4ŃiH@'Ɉŕ`.JuclBM3b6U{c#̙$B`@4356v?if D7_ K:=))$B(g|jD4{&=8d4mtV'HSd#y^zFN orc_p5Ѽ3Lb"fE[ht< %b遯/+mL(w hbHӌ)۲y mg}_w!L5B))%(X]iIQL2d&-􁬻'@Ը[&9h%){į CGe1jvKB8vi"Z WɍHyfT]r?vq $Ѡ?z4m}jY#įSԲG mn$(SZ*Wm1>S1w u7}7S6uvgcj8$ghN#poNE]NӓH@=CfcK76}N5nRu8z3/_ H'_ >mZ8o]\}QTT pTq. q1k|E?9%1!jvϚnaTMtq?Hvzc bT~{:D*s4ݪ+WdsEA/L'LxAFcaX& {OT_㜻Ajg"LE~xΎSe֚dR9+{'F(C_fKWz9 Ⱥcr(C Θ)F̕/.DcUW3AM +3|Q|C8KNz:'V|'}3Wm}&W\oŹ~_"uF;&>7}ƙ<."'4O͛(Stv2Fgy}㱃{&&мoY=;S^h҅{D *.3 `w7X nEݔ/8dזATg[Ew85'*ٱy~tfCGWi w}Jl}L'k wZ3M{aOS~}udq_ *adtug6e*-rbpՕ;|Uʵ"Ş]>ciD?rϜ3J]ב> 8p)$V2y =~%\ϲ-PsS(+J9g4dƭH.B\.ԄްEM9Z|ָO ޫ+,6&#Q;-~p+ To\crs]J!U-igH3Td~2Hs6Ƅ, QEN cxYwÇi;{ĨttѬ S b̫T`u*l/"h! &T8H2Jמv\WNn ^YxJJv5Yֈ$oDg>Ěn 鴣7!dY.=d?}"!5:r铷J >J] 'tꁋ9#,ac([5wk7r<nZxvkh9}e"I{VKʷ q~M/aq^ Pf}7'/wfwsJSEt"}KCh!S m z6NM3yywEM&:=c"]_ TSxrj@hr-:MtgIWYTRje3\e*X@QmF`g8^ٚ만yu/;e 4s{nsT}ȗahpV*2bFM^ާ8H7nO&z?߮B :]Wު|->[cMhNLaU0ZIfQۼY~^EP;i|9q%w5v5(/vNn%Eao\|8Iix_jťƾS,Cy#񷞺 J}e;Qt==D5P9  5vJ[߆ԃfmנU̙u"=B`EH0ay`CuT*qQXv:;ÿ{5"*3N?(K'0}Ob=|ieSo+u=?OO`g6/ 1M9SXNs+G $Lp;4,T>ϯVz0n|_K˾:԰v68Tawnxqk.Z}oq"b ȣYYZ.gҮkZjJ4K#)+#gWG zekwwԽ#ɬH~qPK i JF4fRڄ>x|>ԶPr\`Ѹp;-Ef9U 0қ|HuZuųgF$*0 1ϰL?ZbwT\zG}ٲS,(S$J`0=?/rS}%<,+G߁X:G KMeI'ǝ:s:Ք/' eFi7YD'ůM3EL987 .>U7cvƦIp~x&%H>UcphiV-']|[qemzP)QB} ΄84]NvG|0NLQ-ID݀{֑cvC\@;p⿎ʡaD'ψ<׼Q;:E1&+3`ܜszz zK>3M17gPe)f~')Ncˇ/R܊}KjdxKx#MזSdxSyJ`w0\z_ǩwq&y\ Lb t%r)UUt:$H T/b:} ~5ݰAH'f>ujyάB#ݗ"_+eGF! RMxRYlzG<=wg ݺn+-gF=w4Q$'+}󋜩],郋T&=`fmg i6i{5h ZoI'8P\gJY z:1˟QPY֪Ӧ&|[JmHyDFk5J/N G'AyqZwq;#)IЬyS(fsjc32C:h1@~ӝs3Vc/dw5ׯq*;_½l4gYdX[[2>y֋K$$] [enmy; 6}UX=nx/ix]nŰĦ#bCyFpKٚ{W.:UAW}>=}6rT7ÊIdʄ=_d`%r=I¹]1O/~{*pVv%mne6A ]Hr~@=bб~䱲\g{8]u'p،K"ˣb2)6"-KkSv8%ϯ^3% JŽ0E:| [} Gƛ-Y/4Oc=58Gcf[~߇6. K@]WoZqkDf_i3\Fgsǃu:DBd:Ln8jyڜDKQvl6Zz -㽺aBJGݜ`U9=}ko}S{.3(JG2ԻS[)07oCR{ػe1^ufky ܍w) ]`#=NODȜ1sl61m=# yn"LU̢qsc/7X%S!]eIjT^}wrT-@z`2Z⋯vG֎y Y'ϞBr{/NЍp:hL%Epc%-<1@Fvjɥ7ǃdkƪo o+%Kr82UY W䌢X -EdQgV4땘Mh5Cxr@/͊"! kiTP AU@ ]٠z)ѐ͢}l%һRºݪ#|,ě^JtՖ%DJ=A/$58ܞ-T*%\";m7<Ҿ#Wv]acꛤ#UqIm9oEt2i6&v4aiq]IԏsZ .;uaI(:4$P`S/8/~%եi2Sҋ>I7 խ5':fmC&njo9FA\cY}?H0"hBjW;8'2d]Cbe ĭph9cxG2)sVKQj\g]GkHęGKzsЁ= E[BRAɘ" ~ f}ZSO-֠E~%P/Nl#b%iOs4.22Pr+k&!4zZiYϷ;,߻B;6Dr endstream endobj 386 0 obj << /Length1 1615 /Length2 9345 /Length3 0 /Length 10397 /Filter /FlateDecode >> stream xڍT-Pŵ@R]Cq(AšPJqwwwww+N)ΣG9|sk=NBM$ &6fV~+Z` ێJ كE@O6 c@E( h `qYYN` @ Qš0:?hMl||<Dm@01h`yZ5\Vٙƞ 3c8,j { ndl5fTjO:< S#V*mA? `96f #jck qCf`k@YJŁ` 4>;M( % 0~Ma`[{f{Y~ɏ ''k8b-u- yZSL pgf0s9+HSo")Gk?6`k׿"4ЧYoU6u0~Q94. Oi{ܬ 0iL.'e=/+ 1;73vE}:'pg{J -X!PS3( X~DE?bOem]= _ X rXOt'inXOT'*p?1kMa+? rMCM-JEI91>]ڔ$rQ> m^>`}g2\H ǟl|nf1-ts`Ⱦ-Ңkת:_L0ڝnMI -UdqLSas(2!//:hJSXd3RĮv|FxZ">Eʾpn;7(`z]6߇~P@Qv%XDе#&Z%!dA[YcS+J*^ gԳʗuD- j=8Ў;+a_(TU,2B6#XԗPF_~0 }lQz&NTŁ4LŒN&mq0hAgZj ϫ'G vjP3uYtvMJ῭.X=i1W:8z_՘;^- l kND3̶^d(oUQBSoqZ`)2^ocTOR \E#Y'%a|[{HQt'FF`BLSV..GT2S{N=;nKEd . ;}ػ䔟 s.QtK#ВY&߫Y4)tiCL\bÝÂ"~ju[G젬U??y\ _"ọu+:DJX#>6b#5om=xI:T<%}n̓# R"eZ b4$lq6ISA6WOMZ0 los0{ylr]AXAҽe} xݳk,H 80ŬDvv (uqpoH"Vջ% T0C"lJ#u8ד(z 8WjRFh =XUfq}2$~p"y{Md_3 43Gm : IڎBKG kQymُ~|cd3֪|rCiq@Z)Q]87֤͜ߏ+JWM&aVJ:@bhw5O(\ЌB-Ш5h{7 W$;&+XKP} ^1 }Љ'Mǭ/OV_y2PX Xawr%9Kz l#Vn;z1V=a nK~NǍ>p=>|D3]7jřt;;FġbCQH彃Fuy>ѐڂ@ 蘑8\i1Q ؑb=\QEGD2|eⱖY}>9S3A^ј9rw>d8rD7IھNiAW-dT*8PBFFY ~o0Jq jjZ>δHc.PHL0 U2=>pѝ6| l ..n|Ok7x $ʕ#?cL%l\=,$dz! xʞXk0iAY4r( ga$,EV/]xnHN3vVA4R1P m;,^B9oLm}y/J5'-34 bן]aOnb C.w\Tf.vM2>nWBF1g4iEi-FNz#-_\YLLQ׽r*k?qCٟ|bF">~ԫ\tluNs v0mYccڙfnID{媇Jy'Vo1!'{Ʀ`MF/CDbc קhh׎}Mp}&] 64˙/?, Kj[17'Y'`'lqKyW2t}ՓS=|UE|/`jNC, \Π9)?N  A^&9퓸Os:rv:?,gp.R ='tV{eCԤ_)>K10*gnYE*ͽ>B%6cu> uy HϦ>K<URvYMX^/s`\lc"pt.RS{:`F+rǷ"g;K]acKYcFEZƂn.V-JI~@6{/ha(-E$Oշ8YeqVhbߚ[gVԥF=(49K$_N,0]_u0dceǗ26wwSɄkm&| fF'XP2V,=rr"b;vݭu,KA(},|>P0 I{`Y<*k',{8n@LA"eٻ\2{\n9@}.ոI(_ƣVv^Jz0tyuɉ^t&.6%S3&AGN!o/h{C2 Ö^L# 4"6qa3ӓgvQFw ŤQc> '~smSϩS& Qbķ >?š2}wɎ.'?s@y̰'pzFU"|I? e<ߚ)o"ZVmXдfx2㊷>2Бrz*k|%W?DtnmAoθ`oKn6h`Fʪ6JfhT̞%KQظ3%e&L؂; Ä'rȴUåٱJAt=}D`z\#bh(W^P)~to}̨Ҳ})QekC:BZU_]e"u_hSC?"ûqyUkˢ MT}=k f\ tAqs~V-@H.ܡi1{&xJc3qy~C0g/+v8 w{.)NϡqA~Wc+b>~Ţ0k/UjWb͜Qj?\ b4F֝8Ef}>VT9irT+k-m. =Hy uO&{IaS`-xw 9|#LnndIt(XfY+3r>,Ьh3ĿXX?o6JOYCG}v߮DƓU1$T:Ѷ1mԈb_¶k;m=,z(|@3#&\8ߥ%%=csΊ&RZy-n?b.uZ㠨h&{?}؆ƑCj:rV[oXi{b^ T rya4k7q][1_'v>흪`nw,jl V8c>pŬ 岼eZZMCM+}; R+/d=(Xp4}tJq yaЀ"={y. -#aRF3 lزcbhsBmmg/~X-y#:QMV?dR)w:H-~XO4?ew'Cs;%:БW Al8nK E8^1`=1juO;cAe7NN`[K)6-bedp{Mv^[1Qb~[vJiB:gϾ`rS9uks/;5|t‰3ܷ IEؤ%x}ݎ|jKE‡.23qs'cܑաR kٞ,ii ]/u 3_]'o1+Z`&nW2騰yЗ6l >obŭ6c*oz~YѕjWei6?Tjqc vVܮ6;.tGj:ihu0(kcοRZfg -4 ~M1ʲm ]܊Z4~-]*glh9)s|NU+7s^iC9!"zvCʤ;mлԮX|?)lD\f7B=i aK3[ZۼsUZ$fN7t4=|>g'uhێ})g 2?oxqUWm \#@O@]s-ɚ(mi>+^+"f" VrSZ[I YO:6I뇚֡jE3%Ua47Er,Fk̪z5Rވ+ f3ji9{$o %/t?^=1DD۾½&H6 **M 0ÞBz wB(X/Sudk*U~-۠,0[{O6EI0djJLV!t.ëU:rԃD&. emhֆZM/ljpc'vێIF %6ڝzL K$wR4q. De,lfBgzvHc?zSJkL zc) ;I6E[~+J< i%YYyo[hR% xH 5<ۭ:|/+6'+['1:*^u~_^&gAm9f6}R51:D_GN.I5z\pUK[YR^7+8i15G>c)Ѿ xAܱK ~ I4Q<eLZ^Xd}ϑDyW,qÐd!ЍjAFejrUuت<"Jft`4JbyW#NbjW@nPO] LÆ3Z15TI8=VT kM;^Â*- o9ēV:z R'NYZh|@^gAA !Aٖ90J9dAOPUMDfCke [_NR4ꔳGy2 ʣ}L=)VP̸omlĂt} R5M8g,x&=h򙗏od놋I [ōd> stream xڍuT;(Pݽ 6k h-ťӽwwZ3$O&y|5&9P ffgaH*k*ii8Y8Pl?jH_IW"2CN #+`c/U eak Pf(8n(ԒNޮ6`I 2ewZf`#D 3-?.l`gVVOOO3G7'Wkz&-tz-9IecJ i @@d t@h+TJ)wd uTeX^`&7 boaf`f!@F\`?Y:Xl~g KI'GG ;>)[Wެ\=[ق,~b̪ uqKYn666>]@/ ߇hy;RCuvrXARZ!?(nf@o"vv`Ɛ.pA?cHY:hVIM9UG-!e`0sprxy<<uff@e*r/P?@9/'Ht݈2j^I/)/8vCA 2K=@K[wABd imf~.Ŷn2^@K5[_mX9؂jNnW faY'nK* p=s<3WW3o6HSqps|!i , '0`jyE# ` ^6HAV?ExQ* >?A|jA;?ħAn9x:X!łQCqCNO/ 9_>!c' Io=B(w2.xm/*D\7|Rj6"5ʰID,دña OXTΑ&.3JzʝWSHakF8"VDV={*.0K.$2Uy'j돝ئs܁3(ss" ^nNE.WL%_`S(]yc_JdN8nU=Egв쐭'I=9C?\L+?vc`D5mi LA6zF'RjY(s rbLjr)S/48Q,m|1 %m2tL-Y8^5:F >렰"tLN!r m ͬA(Gi9ybH00zP7TxYl[T6D׆`*NHĴa|ۨvnݫ8׌vG[Y|_ k;rr # 87K8(/?":,WnY@B49PT~8Pc1uz;}MX d_. kTJcM,C >k;-xRA'\ˍTF*Zmd&plru[뫆OZlaL dD jfgA™KEH0nzLVAǷaХN-!,>Gc; 1T_cU?&\XʳJ845YTWl*-iyq(^7lLJT[[8Uo3ܥA5ۢ2[v#Wo․t]k]'Kz6TWڳ˼󨘋F'Y|gq` a<,ah'zhUoȫ]ǫY.=o(p4|ҁsG;TWhȝE:Iiׇ _Y-WQɌMF[.|/>C/UkЮsp"JV YJx!c`m$hhBk|9ڼiD*HCL&{ؤv%vDT` QK[Zn3}MaTeEUHBP$;"y1y ]&&BzN7ǭPgWG\,eX||*k4ځfGd$le$I#̀8G 5([=Bv_+]͂aR!rmE(pR~"ސ*6Shi?AA}ɩg >03k(a[]פD 3\١ro\UA =Y.1/m=B(M˔棏fsQ-J_UKg}旕#YKm-Cĉ4fd35nqgA*F'L8|&ژ-; zGw4yeW<7sw!gE%,eUs#\Q+Jl`3Ϛ3#LTS695?\%h鋌ܭ9qB>{$|iyCwZןD[S4 }kU,u~UY6SBzYфd MƏ1gxFhKM{zM>>y Yd c]y W"irR5L =UoWR^t^ɾ3d[d`p^#2Yba!{+]cԂ25=h5/'/.g2L~ e崰IUWtw`++ T"nYTf{7y5YvCzmuػ.֌n,b7=ϯiX->ߖI>Ǡ7+1& T@ Ś4FLx@*r`~޼ˋ ~h\"v`@03ISz(LRY?#7$^%GzL&Xb]_&A\Hjkưg{Ȉ @G}a/#M鵏S7b^4*}Nj N^uo8"xP|YܰJOӌYe <&ٽ^i|AAɨoB=x;wDGƒoȯ=f\8G9̇KysG'?}uAu+7d)gf(Km 9G?2Mz#u(9-z/pb2U^OpqqGMoNt_.Djэ ;P1Qo8K"u gO n~) T K[/&mZRKJ5Tv"Xx6hп>‹4.-ʏk~N#PH&{2])vl5ZyQ1ӹC{!^S uעbLT ' QT4/lL'8} S:2 Vs5јc#L=Ysd:ruwͫ;cx[v ի+{wۥ^ΪYл)@bҪ Ò1\>ֵJs0?X8,7/<6PܓB 5Lyq  ے~lgVz N3$wSwq7|.TZ o>'򺺛=݂&Ng2Ǝy(UN(1$ñ^o^պұ~'@M2A(H]_]b~퇺޲5f)rb}6KqPz|I7e0kG&6؝ӧ_.o'hԏ%q=2qdXOԪZrN>=|2VWyC~ R2uVy U'Quo Q kzxAlr|%ۣ1Iό"xfp^3+-GX0w<%"7a@+?U:7sJ$mc"Aj is;\ڑ+<О;>56pɏ*+ʦMnDk}5W$^{SәQ_\mkƯm|CoH^^Z31p8gӴ χz_f=pfƵk,MGfi8ƫL<4ì*7~D7Oj@æ;Zcn<1;\Kc3fI2(C< lb|)WEv~X c4 w7veU眓ͯՙZnEV<7mi9,*l΁Ƨ+6@h|(̼`IpD q$q;xpe35bbi= /}H|^M ]O6ܣ_4ywkϠ*8mͱ)φa;|:,"2ێbW1-b1T\aVȘ"ArB_]"PrVQ*t6WLhtԙ%V VT۹ 7`+gs#h q3 =W5ajg5Ix(@%LP:bο-^"N^uxM!6쨥x4Qg3.6ڊI{UD%FHLf$&y7qidJvnVېȄm_MBe- oCH;P rYܵ6g{]ߧ'˚~0eòV3׻x*o%]]g#rT>lU.D4_ћXzVݚ+CY klvtN+早4k]4 i=)>j8(lvmhú-5H؄'UVwaȸHgpLuJ߭h,&O!://I`b܉2*Kw0yk7efb r瑨rw;-CgT'd\=ʽ3`Ne&Qɲ%ޯ2-2kev:J Ӝ|mhᔔbVm,M-(Fa CaT\¥MH8wZ55n'$Z_up&{*#>t/I҇n}dSZ΃Rx.hJܭ{V,ͷ1/Ḡi.!瓣-UNRs5c$b8;ި1ܠbTf e(b/Bcmf L ގjE*֙(<Ȣ7J;_݃#ZRqfroΕuA n9nR.ݔ@ }ѮM$R[VRј&Ы2_Xb2WaYdmb{-d'RUt !2 fo#Y>Yvr*Rr{@b,h>.^oĬ O99=֬s]idӠO&;fChEu w<yR zk$L lENԒᙫw?n&T$_]+BR_Oy`+Z' w7 s^=H1qI !%wBL3C᷹mxu[*GhP\A79K J;;/'K}MQ/a8O-7X틳N&<aSMd2_E#R+C';sjuL8Cŗh1:2 5W]Lۅ.In1M7ӳ1PC~_ѳ7Ч8Isu5 9P]AԳ0*&7wE-AJmBK \̷w mNPD n]Q,~]F*#pdiiG*}+*RW p.#$ |\p#y"sBr4s%U@8/EQ Pί]~i%ch};rsȣRa7$l/Io}h>d-=CĩK+~&"@vXJ&rT ïXI >h{ uIua*aVR HE+.?^oÕe=jjd^sK$re,ifwhHAYil &0AZFݰ8\–ǧᩥ#F)"ljO 2ќ `sW׍U "HY?פ2zuk B/^8c):PB)"w2S^c6DTw UmQ ; 2"Gxxa8S\25Br??nK,cqg }HL\-Tt[^0<9X7rd6K4Pg*5XI;'k;qH @A[/7T(-%9O|}o8wSST=\~<|]~VZiQ{yzqbouac!I26̛n+7pLNȥ{Aֿ¼5~?(| @sBRwԒRy&xI]&~4P]G+bhXFvU|otcO{k#hjDVFDnZtWkLp ?.-^ rw+gdA3 xsu`wDY#|Z%ll8tݜ8S :$oƘ5C&Z[T0.?.bɳkmǹқtQOϨY=rX'N.mn#?xU7bC;Lߺn Y!dz=B:![GKH[*.[2`dݠ c?LR5u%[lph`4D ʫ}֫5Jbb^4Z/ XӃX#)(oƒȒ2$i<.7Qfc&Kx1 ZRmkѝo/ZQ||+2cܓީ9P ?="êi?rMEq[Y (&"Q\\08eh_ҒG,2jdc}xuٜ RrPݺ29ֆicͤCM67 %`ˎG/uF]g|ept'dLDaNƥ=}V[Af  _raTJ _Cc&ޑ)+ϸ Od5(uD&>OZ,D}rP v?^F 77H2޲IejG'g19AJL88Uʉjc4N5|jXOάOɜrf=*4h;2sEZ/lUz3yS&%mRK nӨ|fDtRYgsS&őNuz̼ˑYc_Qm9)GW*T&5#we#&^z(x˓HYRUKk];{bڷ4+No=MEum{lSn|Oi~yswq~^v>e7G䘾B}SVvv ]${7|̀ky8LCo 9G֠ўέ,΁g@_ P>'.¡TXLR4XjFacЯ/Q*x4--B#'GUbI~hd KU8Q'Vj"͇̫ 1E|T+ d&pd 5g\gzC#fo](SQ"_[UyVuGmVNEqPVdh+V$q Q!H_IaQ+ޒ7SÑ2Z\ZU{$>[ {j W]ۛFujsClE<__,g:7/̻skֈr@QuLZ9(21e"i]ϵhι[9^/I. @ D:^)ؑ4 ̠z͆eePUzGHLWSC _/~^:imn?2 بE#jq}^ Qtv@쌣Zg !޵ QԉJ47aox~,H##+yS:zycpQМ">݋vgɛv~ARX%rKh~#"`AL/-JȆ\sepmFU[EPn0zڰTycabSrh_-:~y˺"4`2rGbނ[%o%Ӎ~Pt_zQm: 47 ϺdR&8Wo٦dPǍX- 9dPՊ>7Bu(>1* j[ (oE ?4wWqTr5sŭTuKJmB6~lrjÝtEQ58aA ]?y[ oG~veC$ Q Y$2V[tP} IEpBqgƯ8U_Kq)]COl*-?wdeZ~9bpK f I"UO kHtVXZK!uOkn=VYOʓmyx`kz%^5@6*uG&3]jr6wm{ɄZ)2*$xT!_&{,GƉ"^WW3Z #Ps̺g "?[(42f'u$:bDS. N.L,>%v)EU&d+P^)WzF7}!MNlř=}N7EsB!!dvo~'1#k29$pɉӖ;޹5+QT![TH.5fzFjj<m<^Đ((&BFE6 'aßi EӵtM&1& ?s] nMBc+e~]O=L]V7( FBHUDKՀ1ۊE#'N #zrQʐ̕NJF{X WNu]ys^m{}zae*1'uhaLEHu_t4켄9hvo1M %'L:M5Ԟj(>Ғwjn|5xɵ˱xXo%!iepu L$qƲ޼uͯh;4ָK RT >ڦS6鹱 ''~.͓;2fL7 ç5/1bRӬ_YB7$Ff&Y)g.ѐ]-̤{of6wkJ(uחa^f_cHم+Nņс@yj|?} ~°Gخ< Z҅=5Cf4TYLB sNENuY&V'&[VÊ*Ot3Nb(H^Zeb/~$ }pc{!1E&!8toG.)j{In61\,k{Yj,Uw<4.ī-rpd 9/9fNvV#!V#]'#ekRϏ'FRk2S~7?WU,&1lRRש}g"PEH+j[F'B5*`?v0gx sX*h+{~N;sҦ/]{A28}?Vm+=ah.ēlKHE3uQ(dP`41wG4qQt{sew+Y>QYf"HMPs`iݝ?72ry(Ij:ZUvv9j\p7#=%˜D\[\5,&[&1 3o ۾JDܜN s<`aY2YprIYJPK Yd8jgwecbb) j}.NƛʟLovȲޞ ZK=u;чN sNw/q-N4֚*+,t3X 9q4GDroO%4}SSOv50(&HN|$)~IAƄkdj nпL4;8 o Ng c* e%58g O- YTl62"dC9g3!v,6J`X endstream endobj 390 0 obj << /Length1 1398 /Length2 6207 /Length3 0 /Length 7155 /Filter /FlateDecode >> stream xڍwT6Rn_An= ($?;- 8@ax~o@7@??zao+2TT򿂊po_\RRR2`1#U f~O{sLO\ 6<7lol#*+{"U_q߀'vAu#-` 5VQ5F 0$ BQ\0. n@!F=l8F >x. ~B7zx1 (nR{8JAݟߖ0 oK4eq_o!o-V&̩2rbctiGcđ!R= |GƝ*6Ҟ,ť}H9xV!^ANKΜ'ZʄLH4EDݑ6ܞC[6zmGzY)?ؚ`m$0iIJU\Z1;'*I{eD&9 mĎv a>B'Ϭ&D`,Q] cw%,ͥ/rI8kCTڜVr\:DxUcMJt^qKJFthe EOo<(Oe|NpZZFIHJ o4Pݜm͙cD̋ݏcmTwo߳ZN52i1w#5Ӡ_>Ò,|7u^65sd?Y8$q#Eu8_M͢UFVTs_K}民>(׾-^yQ[u#QXn; Iּ]!/bUM3R:D V8ېF7ǔ=s%O]N:?ڹW}n#Bxf?@V~xҳ>4{k4[b \_v˔jcӓ?oɩ5*;3怅`=ybVT Za5Z}QN֜_ 5pvFe6_B<ʱn4c*F%ܐ m 9bGQ'`&_ˤ )kKSsʱWμFY+5}'LG&<"u@Im¾ڲ8YZh>cDH >IՐy}ST\Ip(c f|?̗&f]e{n;`t=rNli =a4A$DdJȷ6TPݔ6nn*BI6a3:_mjijlL\v-|jb~6 Z2lHԣ PX.4I9GRP<ֲ9&0Qm赪S/ h^/%4e۽YQazgP^Q|-ueV}jBPII<ҌzFuf:뒜d ZDSL2M+_FNy4g [jK/SSRH*`vOz,-{碑RW1\>d*̲zJD!kMl+u'h*8)G&WÝ11HaX9|prH?wP~ &,+~*K@&|y>CW3 (k%1:T3ltMWXL7KӤf5U Ѿ~أ> Ќu]Al}Aqv 0w}Ämz醴 +xd?jseLP-VA#W_*}#k ǔH:#x5ЍqJнM;kmɓ@󠈾C ovTN6񖿅~M? aVFOT /{3Ucov&h@3",gzc7[O#)Dy>7zj҃JOr`u s1S(Ȗ Ly\铄j__^$jT|>͠16od$ -xJ#)8E>WkcIz#LJ~w^`mZy!$vh|Ő6;^,ۙ3*okwiT<+w o{:*?LČ6Ͻ-GN^ԵdOVhkbHoˮ6ÖrIkcZJ?RDqʰAc|Xɠ̈́ᲞO;9o#^Fv][sIY RUbwq!ϠݵDNSn_<ax5H:凵{(BT8|Oc 7qZPWnv~|[gw/#j$@[a8I4“e{])k 8ȃ!%9j|ycr\[6ԜiJWe$U^Ȅ"Ŧ^RtXf{ nͱ$ᯪHshxz騥0$W=e}?kdTW@~"=aɄeHuw~<E qke1|+h({(ߔi$pv l_xP0Ԡ 5vP{t!UΕ#y)ۼqZU7\Q 7u?*5>tt|$bKsJZ/Q,|p:%Gj0+Ny`(-]cُd@rDrCs0gn_ 2F -ߔԣiRxP Ƥ-ԩMLp%%ߋ 䉈n&-ML%cdk~ceWͪk]KӍEzU,A֖,9U)GSbSZ%2ѷ#>.s(&5nUɕ4&+a@ZH,-1%4nj~ Y\|_c:є̂_8TESl/5 j-p$OIZ6U-]T`/'sWJ%矒TVbqBE6_ l»L1WbLN]pE: n5 ~0!ȷ\I XJ?Co.b?Hkviڪ`Wt.*Tf%I]ZY b!~w%Q\{Sl|_4aȰ:CM.'_\p T ޽-fӃj|g6پ^nd!X 9]ĞlE nfN.5A$c$'iߍȵ#6[@-B2KOvdmd=̹z!|ZF?y |vQ /I 7ݯ-㔄nHTj՜ЄV?.˒(pc~,{%G9z ЭeM7`S"!bAmZGF[9\D &v!!G\hB{ k<2]NVSTޔtJ##'\tꖤ5z-U~PM}w];!"3dK᮲_ZFĚ4k,.^H.,spY&XWӠz"4'<"-#b!'w8tAj\BeAsb`ѱuF{Wh5ؤMY m [\ܴ+i]nMHX+;X,]Q"kl#"SoΨBHWkSŠgp12MO.ZG6SJ3Ǫ1 \38=B]V-{&=AyT 4w8k? Ri#2mz|RSGQk&H/T`Nc~QvtF:8OtŋѪV7|%SLL$\_Uns3M~({72݄ɩ2 [([7)'rZancKWaV+%qE)E~$?\5*5 (Lxlw^t6$(Rx93\KpXzEOEOՇSG̖ Sx&^ؒ]y?@gE`^/PK /ee"D/QusR(9i;Jp>E1WE4]1UʬPu')g4jee⒗޲,ԽIp3Zgp =un34ZACʥOos>9$RFLUig.y¯=z90?Q".~^'(JX!sUb=D T_B jbڬ28YNMu 䴃lcc/ bxܣ?=>me2(N{$A›W{O^G$h[v}Ӧ}U79ʖJ)iW_(*=\lywWP5p83NYG_ 0Awg3VŮ"ԋ.(m~ o~^4/%SԶ>` iWqsԄƖxktFe]m1򑧈;r.G#]eAf#+]D7xݛDu vChѾnF} Ԧf5Qc%ߧ,طP grrx[,fRWYۚܗ*bQ[9X+G7-1$N:x)VNl-Ulec iZ x+qcyNߘʎ +oư7JooPw@) 3g(S%PrKB+#,e/mw~xԼh L/ր$"gԣ uͧkT>ԍB2&R+oP &toM;I6-E aS?t}vzq'Z3/ծ0}g2>ړ~(]]L15R~_ģfC s⠷܉+쒟Z1͝Ow#CU>h˧mX8+w zފY zGh50w_H[{K/;l\[THy22va٣AtZ&Yrv=|fʈj&ќr2%^5iGiCNc8 kuj& (@shASJN,ĶcBeO;b+}6T}q |1j34}d_lyp}|vpѪ2d!eTk\3s勜SӶ%/wTu鷡ط \"e=+CQ&sHeo6U_7̟᪄*s 44oNV#ìL!Ϩ]9dֈR>7]hc ΐyw((6LnHc}2߾۵R\ﻷk5yGz3mdMh! wv,8Kʶoo3j92 WrSt G}RBێaBwuogF1"9>j'~QqE˞& ˌ*rc]9t/mm86Ȧ͊R -Vgj/vM-\nD0sݾEBk{JYLUb3&IM\^l]wU4e['rh:# m9 מV> k)$ash*k# endstream endobj 392 0 obj << /Length1 1385 /Length2 5961 /Length3 0 /Length 6893 /Filter /FlateDecode >> stream xڍTuXIHO$6fñ9BZA;iDDAIIAJnз~dz纮>χ!=Bbx| 0 @66#8'`3(`0ʧ\AQHE$ P BK p{6PQ>h_@N(,..;(Cá$Pq\uB@C*qqCex^pC{쁿@\`/`90^4 x@0U^ku]a?Zxܟٿ !P(#p Ň!H_@u+!@y} j?7tw>w8ז\2^CbSaЫ"Q^H?ik{W~c$'A Hs¼N~W{c]Q@U`p1h??`0`p$Wn po芄` 7+٣/_GP[S+(X^Q0W@Łb +ANHPNꯡ=dB0 ? WS/ Ϥ@Fp_ '+=hTo)+S@T!tD}pw7^:A?ƿ$#az(w  WJgЇW+fdH(E4+K_ @~>$ sZB~ݪ P4Jf/_oM`0(`r u m<]"N=~ ;Ph}өjCp iE#4R;gQ(h]g0~6B '@&kn;~ў7\/CyM3U֨2oLn ]_:e8R5LG`9c%1?¿ѵ '8S9u}6YwWqׄi쁵RT?mO?c5~;3Y ,Ÿ/+t<-yT(ÇibK xWŚe-lx٢ mequpu}  t};dZ[0Nm۵RзqNO^2PJmJԧޯק{3];l{-<$aO@g6jz.YA Pbە!]hWW.D`Se "&B-Y7 ˬ:|,?~[bqA'ld yi;BnV<1bmp XDg_4X\?)xTM@!&>S U2TKx.'n*.jDHUT1=yzm][־_c=.4$y 'RUHjNܙJY&-P@!i4AA'=paVhzJ˔xWTtF6wrl|#qLhnRٜ躰Iyq -Y[\ ! u%dz˽] "b̧^MӸ K!Htqgw3%K3L@zSYPMB^DsGpLYC:4#DeJE%KOTq 7:wx^2]|$މLrqzn YqB έ7Rig.\cP]Hb(נW45{>Ln!;N yl9'˺5řL &1XgWqc3,xgO !3[NE bDOiaƤ)~r~+v{zkLNfJ%vBSu%u0chd \`vPr}')~֑e6L袂 WF#eu|`'"xtzPp"3lTd^v }tb{b_cۖ/gэ!~hT@zo>TWQ8uC2%TlEI^R<6咎–?.] L,ܓ,~deGS2Ikg Na׈u"oHỌ83ZX9Ckn'~ `,g0#&Y9st{ŪDQBvLekxn>V3]8樃iZ}s 9mK3hSSӍ'n܏RoP<>4۽gE=kQb+cCv >IOJZje Сsqo Y4=H_.`[FkE|י8\\1@tay`۹{!hR-8oZa|ǣ:Qw܊:XL+&yG͵R3l ^[+7ޝKMV,# *ួqv: س-o&:;߯s UW6ͦ\hfH/]D&-zmώ(r$qiKC$.tX+_M^ɅvE}⭜V3kvb̺.6d$9f;wFo}EGfJ,?$xVZH./Մ."N$6h$܅68cM* ҁ.gmULZ -r8%M)=zk`cϾ=PLe]nMtVY-Uɭc6\V/V֝.fg9:y6F<_@CN)&CCiumr$~ lSA~ "b6[2N4#kMO~'eE:ӵlınu];bl( ^IJ\KgH^*;u菉Xxws/YG [a'3=Ƨ'_^y&u gH;1} "EaC/79m[23ueaxBZϨ/ܧnԕX[ :B-3 3h΍o)SOiE_^|(-\n3b_'>wMtĩpl\kLeS*z>!!"K5Mޢ2xDc̰y慯&'yOTW,/0uic^/W 4FA3+ft$o=Qj OҰ&\S;]Z w`ePYcWU {46CVUå.?T lLͨsrx;< I>z]Bw;41)l_sx($XmD aM1.g|asn'D|Ne›_S»0>Q{W&Oū԰x?GmI4w.8xP>?%. ?R&"(|SEFQkFejōGppk&2[Ѱq "Tjح 5rdҠ|> stream xڍwX>!C 0J;G+1ƀQ҈ Ғ]M8q<{:|E'o h>A~$PQ VA a~HnG;v؍a(w8!E ؔ h Rjx8%$A $*A<@m~s+"]}Pp{4_@N(PPBBw8PC!6sTB`$C+*) qqGex^pCyl@\``:vh/ Pば@PNgDp`tq |{UG{y/ xB w>ݡ(+ڝkH_i0UDhw(>{iGUw+ ˜ah(D܀0o>N_fHWf?Ce ecmECf۫IDA@APLTDzG: _Fճ4S$\Ab rCG Qs?Sw鿲dT<8D? OhA jC0[{$Z aazp4a78g8tz`B@adu113č\a%3Tc$+0IڰHl$~e-c^( U444fhQ3Ho-kl: Epd/>Y~Ϊ)p H*!1E{7 M,$rxEvf:*ŃM۶wc/ _sąΒ|5S5Kmu~ƌ=t` M͉4D zTs8a.GÄO!tHxd)B3gNOkJijH'&lF 嫡 /ҙ-X-?@@ 0$ ~LJˀ_XN)\JB훗,ݥy%Zb`6 _K T@%׳YFFf^9a?Es4RrJ]|0,~gyDpL XmgvW5jQ:&^QPO鄲wmN~ԧ),xϤˬ>JۨGZMTxطWEŢ7kh"Ljp_=xxI Ȫ]&e.~@ieI^8MƔ&LK>a+SIiheGO蛐jAvMOM1Q7aͬr8#o 58)b²83[] b$ʶ y9u}iy]3Pa)$JeXطqwdP'[M2/+KB)L^P",euPZO^煩OwayzIvb`oq_uߨOZ$($eJyj8%3pQXc6~v ټEh6 &ZsE)5_LG}*4>/Z 7Zdpuze1Mُw'oUn>).ZEв,%m=I@Hϊ7 Yd(O(w QOMO[Ac]7=|}<(dDSP7WUJ1@h7]$zT#wiT/Mpj޶oy#wTDiT$?L 󢂚y]a=2;ѧJԍU9Օ+L[@by g1V@#Ƀ2S%Jo,YgڭRrjvLE(aKL]7=[Fl.D4qÉ!P2QvMVg ~2yl=W=CH¸KkT`Z*akguDibA̋F-_83XXNHo6߭Y|Wdi.⑒RDcQ*PkIDU6 z5Sij.zjji_s~{qg~*qaA\>msy㵠 0ᚄķecl8ʃW(U2,8>XK'1~8sȸCRE꣠Wc @O"1Ss1jc5a R O+捖I +.m21)J}u{]4+fKnp}6(aNE,w2FSNvׂ/srX9Uf_hn0]|;qQ=]9}{]ijA5ys-́k0q93ȝ穂,A/8<³VdĴ2`5~-ާJ?X>dP$D q+M--LhY2)H- :W[9b Ӓ {\l~:sd~+£O^AuHAF#y=$ fzs2lWQo64.=Un&3GoUh, V.۷]dxmed4iO<ܩAMz+^^ |Ѫ4W7eu1;<2<&݌9|şp 3U{Vⷌ'RxIkxfZ<56=I!*k }84'=UcX"L<"-n Y[#3ɗz3' hAɳn$/k4eΪ6.IgE@ԺTKš~~8 0E-2X?Nyw[hea%3ntpոΏm\PE)kwlxWMEэPE9SBq+'F 'T}ȳdH.kq^Ys vByÌ6%qd>imܵBؽίVRG ,4w(Kd1$Tv|#cpR7',d,r 'gLO4\xžLyZʩIe  nGb&j!.z}ƛU(,h_--$0fDfocfaY)kMQ>JһOAɚ:/&iTGdSUn (6HVi>EkD {$UpYLgӄMȥ^;cc:ptA؍Kw/dݲ4C*Y͓ 󪓱TFz3 V26m*c0O➒@R'OH1} EVv_>n!,bUm͠0!ҾSksKSiRۀ/f dо5EFh@m7;ŰݼB_fIOAZ#|̈fY|$J<ߙa`6HV$els|2|g)mvMVˋ 2(ARIǟ ^*epm.;dB?_X^?㪍 QЦϹfJm ` FДM#On>ۢs?8Rng/'WI/I cv7;?7 /ް8F$Yn=Ͳ)="14\xt}ON~)?Sm&ueyR ̍R !\W4jZ97_IEN[ J~ -i|onQLYgCI|ѳBcŸ7X)9;VthvUfnUohMGUe5#/WmOr2 㟅h $i 'x;!ZK.l(ΰL\wNWi6ξ[!GS<ѐdG|E,[%Q:;GxjK]tх'w}6RY?/Rx~8Ǣ9JAdfv,ٽk@*'k40  * &o6EjLٶ#1hZabjc/ 7T3v5}L̅BR x2`0RPv%$,cםk[BRN Eh|YB@[xBHH{]yl.w2*mz\Kþ&ϭE? =eBUPz9u;D'm:/o-gbZ-8rۨbb?M<_ƖJ?Zg >:D尢hS`GbDMAb&*K˓4TKt*]]dXф5nߧ"R:ZZXDCZܔk}fkWJڼ1_ʎi=S$AJK7 /OoP'np◛z!_ukzÁ7_! Տ,Y,̈́!o(fytwt O_2Q } . -JY 5KfQ&Lwa!qe$.hlb7v٦';IjYàw)?$e3)vNKVw{RӗfS[OB-F&'_2?o472p8*r K:ؖ0G`2%itq` F:qE}N!~oZ,umо낵 {S׾ $H@dr"fK2HNWS SHEUKJ鿀f}urDv:V9 rny.[gD]| endstream endobj 396 0 obj << /Length1 1583 /Length2 7251 /Length3 0 /Length 8314 /Filter /FlateDecode >> stream xڍxTZ-Hj@zJ7)!H"UH ҋ4I*қH}ZIΞ=sf9)Lz;  H ́!>A|VV#( g5x  )Ph6B$PLR@ ( 7! PyA| gUDz@P}~ sb<(hPNW` `C!(!BI{{{\|LJ<o( `AB< _%t@?ȿ 7@0(G]<zw@ p@>+#\@p_(A*Z|(E? Єߩ*?!P7 W1+8 +?%>w_?u#p{_e{áu?4AD$DEE;v7! p@ :@/H+| `vG(hR-? @Yf|n1:ר Jx%D@ P &&8z <w@$J}NGthBoE 3R~9"v+V' =,j kt!PO@i;  "U>{=( j !_7 K@l!o$ZM p0װ @ _|t+?=b( ]cBB~vma(/@ x ^wn<3(h"JAT6`p) e%Sar^~U~d]PO!er28ެ=svB2.eQT,ӆ3.'n* 7^k8sI٬FsɧAS. *DG^ʄ4ɤ <8~xKI7f@u! fnmJ8ڰ`>|(6pmhC^Q7Nr"-`Qɝ6F-cӻw{S6|/No J0DZ?SF[NDp·Ѐ\߱dyMVwvxK_c|U"KOh3;_yDg +Sw:fHs&||3=C+UfRZ?>gbp͓q+T>ArQ^FsOt}GZdN׌*9vߊ*#`DV=xa^ӈPn{;{``HJ@u2502X&uکڟ]۠L2:Gxq<(CqO~HJ +Xvn$*QTTӂ5bE .WKnlO]}Ň> =k8d^tIpԼ-o׫;n2cnNZhx]%=XWyY0;k˞Ȯ$q̈́yR|"VUI tER։;h}"Bu9UMO?JXpha?bܚLiDz-?#BLEW|RЁ]wKrV`F8;{(-Ka]rc@b"B .b1J| zfNiƁ+GayvE*dkNPiɦ4!ޑ*D*pcSc5R'ocw;Ow!z-UXgٿ5(BKKU&E48 HrfKYU|ʲSUef y TʹY:*|@oeY`{B{ޯt 1b";b ]VY\Ҿ":>CPcVDgi~h\<9nL=l7Zu F{$ʖWW IXi)ʰd^SmrPЧo\tLͻT7R\>.q,LY α `_^bļ'ق=v EL-BYqR܂O r&+׃c?c%jW2Pb]A2lyo0XboTs5L[V-h:ЙR-yTeg/7qtM ?_k{t_NJ[C4EӱJD^dݻ&vU%Qv>S(7/!Ҹ" o{j@N18(ރ7&λw7w>q5|[o:B^<8Dpp0ՒyKQR [ԓpb^DLشˤ J?$Up|YJ:НMb9HrUI~x8Ж)59W" ,O*qs|A>ѱZk;LI߼<AݴQ[2YoFG;G[JВ+ˢCI&oK0R1 q0v 8|,s>#Xg)16`k>|O5OcrA2ӄUis|[*%tt(앖hL>fzo-M'^KڌѾF\u͗m@/[ &'OX%[eY7_{cWِ;Nu P\ڕ/)^;v8LrkiB71 ~|Zއ;<3}'m/= ->u{~&l3L&.p{/ =Hrc XhF2&3!D^e\e|88o [8ezu]r>zh5mH=yDQmlilO"P2vaI{_Q&JMH`-iU'9I`ay<69NF4[ u,@%X˽K :'hlϗq'+"3%ܘl:0d9XNHW2l.XF^[vp"vŹ6u #Dc,V{┼4[SؿWN*}saqqaީ}vhʻ"mUm*w4|Si}~$v+%nǷ_%wL߶'KwՌg󓒞 v=ZQ~,%M7rď'[*JÙ3c6r٧aCbف%jbQW+ Z !ٲrB`NR+2Tii V.5^ڌ)EW+؃n4@ \2ZHS$*eO7ە8639k9/ [ˆ `4hY 뼍<m-cz9ϸy_T?KQn|ܪ>f4ƺ8/WI_ZC '2iy_|HUS?2u;Hk[bUi W9?S՜s{Ʋvd"ޡҤÝ;S1lџ O,wpHBp}tq#<5Ą^n9Z< h꟭=$$;Tꇤ)f_'މ*6#[Qe2*4"vN^&LE_\%F= Z SxbMԎ꣓Ƀ7\ztr6;H&B`zIi: /ONS#?QYԘZ T TN7^BjeiRT_ paɗ: ƊʮK:cdH~ߍCoprcE.U=%aHa{\W$jڜxN6Q^egjTq2X>^{>}{Ouh#]b^V1OGH;?Xǻfx$# Orv $Fi*E0fcҾ͂ rld4;蔙_󱭾fwGJIQlAWo%f[7h܁ʝܲ"El0fpǓ;*=xCc~bgAEWb]L/\ K1ͪCkI({kgu>k!?"gH#f<:b7KV9Y˰:qm~AC4u6О֋9f8y}oVS[b*{coH$U2gu;&)Dy7{"`[$K@.ފҸO}k?k6$WRmW:HP\du-F]5,";W[6ۂ磩ܷIwQ=eՖc54yץr !K[D9/GvG&*C"7]Կ Jf.~~?;0hI9픋k~s!"B|5W-O'*^Z&ZS1A)Y[+b9Y[ Rf\f:ZBACʍYz<˗墊ܛV ^ێ!btuQjT+E,~CX^dP:?NhI󹣈JR65备lozd=Ped:`F3:?_. >DyLKz'PyZP3' U|f>Z5U$Tdťppr(2|ThM"/Uqgnd}-/B|FMK(fݲKf V|tI7ߵ{*/k0rEBՆzMzդҾ vb0&6Cl҈)xy?{m?\gNo/mWW9Y̳e,S?tuGʳQn%.ڄr8r=B)ޡ([V=M~72{ʐDsb#vZ<7"kiO awsN4~^4KA_k=ҡȋ۸\=RYNhS#9)x5& $'i'#g%1t꛶ ս> ̥t N.7g\^#ݖl~/myJt Ht FZqExTUD'`'fH#o+XGrbFLGٛvc%5'mcFqLmnOϣO8fOZVt@!?/m w,' 4vA.f[3 NoWY ;1j{)>zU7J:"ڳV+Y+H]msUֵ_|>Lѭ,W췡Rj嬻 /rU"ĝja+.0dP<#AKÃA>VgWNz 4Sv&.û`eT_z[~Jo~Ng4*@b*#_lA Fsu<>WH:1l5 zZdA>UC%ûĤ9-ͿV]/ň7 jmLD=.O QŠ.tXג}צ@wLۻW8e4LP\獁N_4ۮTv*w$y{,b 2F g}k~yJn-ϜSf^j0n w5o>>pVmveB)*3 B7JU*jښba.'8I^mrG1h#Q)R5X_aZ4Ery.7*`&؉uvf `Lp- 鶉χB~|eoUɝ|+bmHfڈnj ̭׽Sk2yA5,~Q&4*V%E=MyBǶpdEs+EI87b]w۩D/N{/?p;i!{?0ddz%̬zu/n,pA!wB7;* mw-jU&<%MxVg-v c3O_b2KMzu[ޚSGs)&RPRHW7ǹݲMe~bYǼ)tP}ܬsH}6@M'eɇ{@D%wAffk N^Ұ\?W,y1ALzEq;Jqkc(ޔHt+w-IAq8> stream xڍuTݶ-A@%Bґ.А%$ޫHQR Ht)"IX9?ɷk 2mFD@`Y4 ..$p!0X$%Ԡ8A4B`Ok`]+d q^P \0 @ ~s.P CC=Hf*DN`hW7(r#]@; 7NE.X4> E@ߝCw P0H7EQW)hWW O A#fQh/߅=5Mt@h!0("܁o&>nA_0~?7?"iPO@?W  H?07kO ^^p4?+lnvJC~Bb`PDDZ(%% g(oj@?_{_sY.Z?"Ka/oN)W;..üGtK7oSL#=\;⍠rYHD#ws#?/ Q4݂+u;`h/JH I~"xC޿ 8| ?cV0PB@a7 `- |#Z68ፀ'0pMGU,^B_ߓ~d-|{9Kc]>zTIȄ? Ѡu[N\zעʶP^n0$H&}1YTJry vJ;-@9;a%;Kk $Dt0ptI|7;ۛݕ.Q)YID͖۟D0GK"qZ5{1 ix2\~pN6b%HԨJ@ 0naH.qQsg ;(*kK^m~}wYg ?ΓWnw cOHg(|P7Ꭹv0߷/S4L =|zd7QTpu0IGOC2MQK i]— #@߅|v\ܛ?CʂbIBD7 EG߽|_kKMעM;>ATXG6:ax>P;M c,c6M(#CpII̝,3M ueV `~[gEm`R\=H%Ss+ufov' xÔզ6Em&CgpL.ktڿHd6?8v͒-v6b.H} 5)" Rl7f<&?ur*'k`)gͷ9M^бK5?WX|T [£eI( Fnc{|0:3"OX;ApdpKV2KgVefA Gu'- ZJ^z? AN%|Ʋh^w16lx'qj9L^1=߅04i,v_ H]-%%_~- 38{P,0l1[ۋpRR  1ȎKS% ȺaPHsS,YOw=6(~Wާb[MDV-Xsa{d3Eŵ_J;"sajAmNuVDՆ?f*:b 3WxEqBXn=4<mO xuӓgD _ɑn@b{'yxAU,]IfRCaW.-O>DBis^|Q{Z2)ґ{:$&~jy-RsJ$Pʬ|+M%,tXOMTrR!O:ln [T<5"P֕cg71\h9<`U8di}i>2 b6w˗6ߣB Ip7]d?9p@mpj5i`(\ҝmYx%9^{;4rHiaY)\Mwr%Ϗ^\&RZhstt74_l ? OeZ@7W?GK $KWk$*RYà|PyRR@]NZSMR63mhU7C7^J ~;GtNg/oEru's`HuIƺ}ɓY'K̭x4ͭEvr>N_bTD"6wޏ-8Ky;VNu$8BsӰ9Cwl[.۲/rwNNsFavf!VyxbY*--J4 j$?e YGs8\!pheIk?gѹg:Ee;ӟ4od98̮y@KuFQSONEN}HgQafk_ d}X2o}iqhS]EgbyiL&*m}e>^F(_lDBN3ioc@{ZܴXL.a8_Hx'Cu bG0ʁ|C%yEu:(CQWkH(ty m| xeAԭY(µ@ڵ全)to,hkhR3j>69t.-/ICQ7Mla0MoUIyBqekVzEv)fET`꧸e!!qk[KikNdS]RK hu9yaDJ݂1T4C 3 F )bb4([;)"8bPP]~<W}]tsIF:FN mh˂(flѡb9~̉θq[_qm{>rJxh,c;x =1eI.g] .w'Ie=⶜算Wod4(3`+yamk:iZmzHUc&?/1t|H_Ɩ"N6|tI$ڍ<>|/vץɖ{bK`M~d E{@X'6р&ͦSτ]߀J*ǩf.WIp]7ߍ\rFz?Aha(ß_&ϓm:j0*Xjj̢VWbs,F6%# Yz?A-3=sQKKʉ7ekuҨ_"1 ZvBd&՞VB:i`8 ?z zX45&7PJ.?̮k'@Z<^l94nS2>yP3N_,{Z\+W !*PVںvc-\Q c֒"S({4G>WZy7M䖒(4Lǘśbд0@W47Pw[:2 4|'l^M "'ӎJn{D5?s!Qj͈ 8x$N.{h$+;ѵTK,R%Ty '`9"* }j~lރ[+93ܭŖZ^Ma-RWC}.UߋNdH,"x(G ) wU@1HU=-:" h j}A |dmvfojivzh˶']S|6to_nzn]Snڭ+"%ȼf̎}[|~j_̩} 2w#"*уϯKik?-wk]b=F5y]eO~rQ,pdAPʈa|OW({GU WOf&}? ^n}OZBf ?Xnc%N `Y}5R. y ۿ7}ۺ ]畇yV*P4EMQpr¯'<{m~4 @R\fWqcDISY53Ǥ;g3O`=Ԩ ].o5  d<8Έ.C逵23Nj$2y9m3_>xyhY ܇Az HkWLQg (?"XY՛G+;;%M\ٍiyGTh;5<[ݹԚ[BB <.#}q#vm2,]ޅնޫ`Ik7,/d~`Ns r~sݟޜq@;G Twb⽆J Xy79tmj zfhK\żd xZw 8lnA_!*xIIVBߐ+ Vc&mR}<۵tXZ E!ODN\!i˸-u*OdbZ >.TL(Tu)ȭyuѭ\a?>V]wo.n.bv[Ltob;,]fI;{"/*aXY;RZ3N}.-y5xs2(Q%6] hv=z8ݫQIRTb΢ &{~ endstream endobj 400 0 obj << /Length1 2215 /Length2 18715 /Length3 0 /Length 20038 /Filter /FlateDecode >> stream xڌP[ 4qww[48Cp[p _Μə~k\UY $0 $4l66N66jjM=?rjm#X. SȫLjȻ9<ll66:Lm,J,yG0Z?:sz;??/ӿ sS0@b rxhnjp4A'5$bb%BXA w/eSпP4m\Vh8ZB>4f+_Jį|4@~6WSw ;;0YـQD,Ưb g{?v_>N#UQa7*%$=>̜fn6;;㨚}Jv {AKurA?nfyo:"7{6ћ:{ur [ k{u@6nW n8uٹXظ۸x,Tm Or Rutybc?%3{E\_G_*o^i_0uq1By=W aJ 翆v^9,]P:Xn_UJA|V?*_`'qX kv?5k?f^3hA1ט:+#"W3^ٚq_?.$:KVמUd9XZCJ|GJ&OA?a;5\ݷra*|m?+s׶8?B^wھ~-^opa-k2 xW.n\_G_=_{H Svuދ 'ea\mJqQ.K$-i"@I ίӿ#q8^t߰E Ym4d?pUtޮg zsҨ>q)6EO|='+D f4: SxFw*6 Q[!_}%L6i$N "wxLS[]҄qt->ҙkR fηVr밽qٞfڥ~D,$kxsrӖt #L~fVUH0tMΜJ+`JǭWոc0G rah}h;go8oƔC&nj8{ ; ';O~`memI`=:&ﶸqe4 E Ϫ2EsWp2ոOa.*$̳ک7o$4 .bOXN=5m| #~:yIO;M+ }vIf\ж{t'#ECĦGG57N̠} l%H\kWR\jfd_Pf˿{BaM nѴ0b_*{ 66wv%-"<)̅>([GP,Jo38-YϮur2~@yYTptiG`eIR91/'Uw%tFbN|DN*)#N} g3nb҂50c u7!pD]W rNe 0m^q6L݄Ƈu4I&O{뺮5;}#B/u1ڼ8߭)s)I5"r!hpdV?՟8LS>WZO] g=k)3ml{zPۯ-ǵ7 }_$rP53dm"`Ef%2ODY-pF_Ғ Pį/E&qz6&i6ǗP<<1X. WP1Gm?ߔTGt>k ia}ڈ,rRpx$h;)x;ISRHb$42mdl-pIu.݄-K]<䭅v\.Τ)b#wt+%^ Ţ%KP!R!߹ȸIHoo >7. iե>6@ɝ4G;'Dp_a#U/'~(TS }qx瘇 A rg6`?UoUiAw+̨<=U0D/ex(uB[ It;_޻Q.--s ?j\a1 "=7ϒ=@kI.M^nkhZ:+kDc Pʲw/U/ktk{GZ eK5G})$+=$~g}gIt̥&֯٣,9zU(jZÄ=!q"utlܠ.oRtgh["{ ޹܏a8hLCTGPx<թ- &s8OsFVc|>⚢0"Π,PX`BhRZ5h2Ewh.ge;" I2))Sךͤ_ٽMr~m_eW1+K h-DUliUx0_wi/zbT;XE'XQ|9<ȾKy!Z~[aozOCH۴ߧ`-y?&:4E㉂FXMXj=mLCWKn(%M [Уh&VKˆ?ҁnxA2$VSi%]fsN/:zoZl gHmّUtabcǣװ.MP5BLUMߢH> |Mވʠer ƟmI&a?HTs.b|#MaNQ^.@n@G~tg~22H/(/e"l]nːiE˶eP  hձ׷+9U qSU|?u8TT+1 3ꀕczn/7ٸz^Mxe%ЌG3/M'I/ggQ6pɻ({anu T;mq, O")!X̫qћvXsTTsBi {snSWn]/A6X)aajՍk.ǻo;X/ ӧC/.JזFn0Q;'.A?7 <5OGc5K}"1 m/g1i/uÜjl4DA5/KtLym4G#7 Aޛ=1v%5ձQoͬb£/Ɗb!7%ʓd-tF{D>aTdޝwLzffFZji 9BTfĠdZ]TX#9 {8_|f5= ~yU-zesGs8d.C!OorsE?$D Dg&wޑUP'CWքP8=.M]؋6]+q$CP2!/FlB"G 8'>3V53k7'Rk¾ js(gtd]l~&ڕZn#b^\jAw&{KDCL:\/~q>>}L|ʒ\*hI9k30Mvfc_a} Z}N'jDhhIW:ڭ6Z'_WZdw3A–}#uGL#i높e{1I%BK kswY/|s>c[[8^uvF%fz`%wI3IL3(XУx({epؾ7h v.\ػtNdƄ 嚫e,rGnA(4qgԍQ lt-tbe&2,}N(}d.GFΛrCAZM%!1O[T,JDDKw/ʃۚP u; "koR#揪5ѹdW)A#VUg`qs2 3 c-Č ~֮|?E$: yQr8I{n2Hs.0MXTfs<}E3qHMMw\k8^0v+}/Nw2ՕܨtwPw '㻋xbqv-UO|1M!CtXbߐĴ|="* |5;ʸ^vfYM/ODo~ٚvq|rÄqQϱJ֏ӛ{l1>ꋴ aȀ(0+*eD@[`oh` x-dYL؉2㗝3{U'K%Nb`&/.R7#?z=2 tM9(Qb` t4^ݹ_"}!L2 /CK9'#Ae /9xJ zH# KP@qXGgV[}4/4I36rT4d^\Ĥ [u+:_,*tq2 ,2l9=O6| u< nq+K[Ɍ]Okk0+т+0Sa›%Jܐ;6 ކNeMI1),] Ӭ+4;x8bu<$ȿ^&<  q[(? ZR&"\i::O[aXAD@G|,/$. Lv Vb-sRcd۴H5%b&X ,KP rD["_tz]:=%.Gf!Jwt2aS|K򛟕*}e(oMkP7cKjǎjݫ7wZ'_a-A] uL.!fDHJ~j:WZZۈ3Np"9f>&uн+!AǢ5BvqxJidKBQ״_(Ad 7_ajQmrE7njn2b$-iE͖20RCrN sp`?cw84aG? 49zG8LiRܡχov!(LcwI%w#(G~::u/ yyʗ9Q xܯjcP/ >u./ ʶߥm0Q聪rI5c;+Ƅe' ps.4oj=U^`O>wagZϱ,ߊ?&d j]}S>_ȢTOnNlzOFgщ N70W SEP/nV/W\3'gSn߽;p t<j#7)"ՄRyt͗_Idf=Eg64(F%m绤CyE+LvH y%1q_0,Y2pHdzt̚Y Hu`Kޚxp㖦ȇ;b7 k9^qP7W$8Dg`fkg _q)c{ Q8joldJ;hRUwr96*#GUsT @ HQf 2zC?xIsk.}R]+\:ǢzCnGڔX9D-bOvC*߿mr[DqD_ %L6 A!(T #b+"^DZZ)؞~Suz,9xei-ҐIƁ9o-/A m=J.wJsDd{4֭ 6 " ޭM V%|Oe Ҿ--jkt@H[3cfw8, :,m~S?34+doŒc^=a]΀sM0]S͸Ν?FBL[tG^ؿ?H?6N N2eYx WQjV";+Y禎=sBRz;>8î[3~τBqz_"\PR{̣!6}tSU:m ,3MfwCr" qtޒONX_q:|Rsp :,w[T #Wy25<ڔ;4bpi}׀(1m&;zE?ֵ_txNG{H"ցhJ<y4NzU%_rmH9!g-#ۧTRL;HA^9*Ir˓!_`LQ٩NJY8n"_3"3NbE/{62LuQ Wu#MdjDkѣ9zmV2Yp3RL6>n\A(_^C|iafz,O[lh(K9c8-I\ `>AD?˫Qs1+!4vV@-9sEk,7Q/ey5'2cfOx/V6oy)d.{ –,]nX]:8+#~T 0ylcWvH墘Rs%a/.D'90jLz!jq2/O0?l"w 墪̔a]dd+OR61R3ةe7,Dm8Nix(Y˲)n?jX].`=:[BَϳV!Z.q ^&",HEK( ΗaS+ڟLb}F]hI*4ApIzOM逩FA132AKWe\MܣEa=RD|F^w9%tͪwڊmK&(ؚ#L9?UН+7v6u''Y j la Ja/2д0dn8R>4|/SB'͊Eo1ůdja,fPmV,%`$I2`9^%Mp)I|;ݼ}]qMWt6kbs/'~iåذŹdS~o$P赔/P P$ͨY&:ѹlRʟH=;a#E8N|_>24E/{?>#0bRx 12{%Pe熂"<$A*n:}!c:g6>O]k2<ʁSu}ĴF pƠX ~4)ЌYCp4P{+\?Q?X\BYAo#q9Ol5vL34}Q;W2wS5t?P葂+:8vx!~oK[V?惘zJۅ2MkVsv4 K+8 zVd@\)\+%;0|gI r.v|( 4Og;쑾ٞ9I Wfz}vխ|N)]iFe-UbC*]߽~+s}r"#R?~27b~rPM w^ƒWrJfegI;15_T2}˳JɎխ!M +1]H.\$8_#_҆+J DcS})12{7 fE{8~FJVimwp8oʟ>q{Â-J 2.I)h45OsLs)/X㺶<ܱ8ĀD-d'xd2142X о2T7K\k6MCĽqN}>=!h<(qp;}2V_LOxO-hJҝ&x7>l- )"1_,y (@zV5Cwte_Ϡ >k/"^ Dy3}Ո:2wn/h^NSj^g洚=0yTG]mIM'NPl"|߶kߟY:>sC8J >XBׯP3Z|dj; - ̍KV}ު] oAM)B+Q9:0ۡjLH_Z"v;fd擫\;N{ E^Q ĺQN*֡zM^ Տ߈(a\hQ-hn1RlhF/Abٱ.PW.O)[7{ }.L4[#u|>)V&S *H|8jJ, ZhT'g.֨kCÇIYRX^@+&G!LcY-M (N~WV2R'#hEC1Y&dD:p 'DKNvkh7y5tv8y"E#g6DM祥:M&<Ե"*ypp!؂ -ֈ<#+w΍ U.} j4P܁~kH)컡oۺW AG+솋ѳKqVް3C6  zvY$r;703hR=|H탈GrkD$]3a^/ݢƦCN=b1e-~.lNhk(|t|uN"F`6JK`åq=,o,}^]i"YsJodm kAD*X|zL*\ˇ9ݯ pEL7{$֘{b|狞YP3b!bm-K~>*C Ǝ\1мЧ IS_uiسgL1Ҿ9"{/#63"*tڢ4H!LŽB2 LdQ]S]t~/Gyh|X6i6bbR 5'c@`JQ_Y?yp7nNJ|DRLs/ׁCzo ٍb MeG_{ˎ:)t#T9W+n#!\^ga?O%eJָ+CZ?s'rsun~:Vatҭ~OZOB܀Tn7GTafJq`*ḥ8Oـ~ }X@^&[5Zew!7bwۮ8Gu{ 1 TP I|l_uZQnRcóN/0|q[ʺ&uڸc^t̿HH5ڏq"GiMTKVIJrO0o~ڕִ9X53e{S1廙$`"L~fDxYJ jw2;y5{ Z0G"_~>E] `a3SUI!~ @Y|&ٹ8\rp4ܗ & ,("C lF:ܥ u|0i(G%\dX>1i`gǣf5>8HQس#%70<;Z5nۭ3j ߼ 0 ր @tXe ~FK¹Mj-l"R\#PF{ A02|w^v?tg}P@vҺnalPIfF[Sa!@+Pr|C RdQt̺ŠLCWpܰ[ ]VR%*vSsW9 )Upoe8brDL.#$b*-x64}9:bt8σV1 r89鑿6%H#CC sgY KFz`J8!*o@9lncHuzsY9Mn68i椐=d!u.)O xcI:y.t[ Q|L~%2LEά0I?oMD>)-5u{|mS^m`R6KVղ3PMnhb0G5Ϙ]Y: yH'Ҋ47ʠb.̐tc$R>@KϦ&Vt7BQm~phXYzdJ޴%)z楄B/ucj KUt5 'Z{RVT+$L{؈)w^ 9E%=`$jEs@A1DV9x,[fD6qDƇr>%TNO(H:ݠ+7ÐZauBW7%s8<6|=ϫGvPw K@&s{#Sem@4b=cVMdlد3'=B ,/Qe%*~UƾP 1$F 7>ȈD*,guމ&u[X3B%=nV 変̊}k=; gMH%hW+35 ,sxialbc;L߾tJt.qP@1; <[_0?#|mwkv2fWuk# eЍ~]JO!}KUxo%vk1HzE=o)c0k ^Ϙ/դAN*=DF#[5c5bl敳Nl4C+S3U p߸M { EXȿY|W{qЕ]ysX?$E/QN*~c=/bDENXԎXܜIs}7w_v=~/xP {y~6om'*(AE{d9,%NJjw$vO8QyX#)7'%; 7P©e4DM̕P_$ם XN̒ɭ)`fGWV j{6Y%et=2?\7Z(Zݶ]a~9݆"0^puK7ٜ0˦Bo>'T5#LeG߶gDl~{j_j])jX_eK|K&VF3xDnaӏ?sR:~n`xE%|N+qըk)8smbJӠVKdĽdb/V)1;"tV!lWQ>TQQմ[>G˕x0e^\{O!DOНH fX1U$ˁݧ3L>gI.woKyBy]zK$=!M 1*ϵK~D t=Ҏ*h ED,uƦߴ܎]_œT֛Pl9Ȱnf`TՊ' ^+`*4onHӧ qf;vls> hQ {}>7-obR?Z0-7% Si M( [RO@hN'z0]v.wf +$L{>rԭ~4[i|y_#YBdkMgv;kg3p7Dhg?Q᷀g |Pӻr ,#lorb/L R =Su~X~O5P` Mieih7~G9FVu4xVQPfcI XY2)-w_ZK$5V;f(Bk>`vhB+Omz:95ງTy_Y:7xQb>zԾ2*dƞ1I5" |c&8 $%; Phd*gnHݦwWZt<>SX;1il/{Hd)*"' 5P >n!:܇2n-htKHl 0_1"UE+yoPPj'%L# )X1ӌ1`apyZP3'\+("z}{(%DCdɑ 2 ꡄj*{lܿf+8sEL:<A{Cf'̃GO'&-R>gd!go#GE ?mk!@|v~S)$~[ȍP3flr{f40OH`xHsUm8` \ # 5/,e:it#GX^BD+BTk_dJ- 1"Y0w}zx |,W03{͛El@;h>喝MyE R~>k3N (Aj|ܧaRRJ6QIFs6"L;Ukjoi |k:h5@̆#&Q>}/tѢ74ԕ]2/NY@I+f's-FLtH` ۘh\etͲh;y"~Pè<:&{V$C]HstY'3AkQӊݬ.`M-~IY=XsVaRa]$U{ `DC_`R;9+ W'Si]ƀ-^qɧQ>YT`Ѵ+eTͷ4:702^(T)CĈh[;M胘:Xuے|%|lcBF>3 ,˔V390$'OE$=wk>}ĹF.ǂ`#7nCAXHZD*:{a#!3LJn* *GI2짚ݒ6IIˋN` f(#*vrϱE[8䳁V!!m}˿)r];d>%=vnDLZƌbH;d4$/72E\܎/8VƸ*dud<X:QELMÏ+-߫}x%GLc΁Gi=$jt(6*ϵFkTx#:mJ endstream endobj 402 0 obj << /Length1 2566 /Length2 18050 /Length3 0 /Length 19542 /Filter /FlateDecode >> stream xڌP -]CpwwP[qbšXq{'3I%ϒwP(19%]Xyb ,ff6FffV u+W[@g+{?,ĜƮ +P f `app23Xyk 7v2(0d.b^V8 6p:[]-vƶ5S+PP[:21yxx0۹0:8[<\-@; WEc;?1"P-\Ps0w0v@[+S E1=XY/"+MM-V@<+=/Cc[ ԍ"*cPblbeWLр,ao&`gwuA+?q+g)^L_e92i[9e~,fffn6V 4d+#o%_bP ~>sP@?+s puv_02u-~@`;[y>0Əo 3sm3)h)SJQQO; /?Y)coO.7a&/hncl zc<X_f$fk??zc;+[,@s &_S-Whff2Ơ]V.V@3e+WS˿g?bb``af?:rڀnHv#J؛:dcggc/f$rp|X@h{L :?3_G`K `Lb7I70ILI7qF Nĩ/(F&ĩ#P S_g]LLMrp5+ggK +ߥE&(sgcS-1?lȿl,]Ǟ_q鿈-h-/&5fLfB6Pf i~w4XL ]@2JnXf-zt4nP,-XdV@P@A1' o=eeZ?&8?jPE 2GгN); G`8>%vPm~gꍓ+S`Ih =]8B@?2w=g* P.3L?T ? @P<Dwr &oB%h ) _ h`ju_'7-@AJS|+:6~cWFx礽 6#Y0QunaukdDqA]xW3W"ɍEcHʳqd~-si+>e%+4`ľ$geаmx&:ԌiOPVp=<$ J G#"?*zoAȝ5|`*M%C>wouV9yϠ̩羧ZHO7آOޣepQ%ԣt|]t~V0-Ae2S"aJlmxY)>+hyBLXY\)B]aE*]@I4ԢnNq@[kA F4.nHaQAp28Ti8å[0ip,m[#?TgS`>_JY~+oԏJW[Pn{{Xb$`~ƤB׸hmlCD -J G`Yh{K|<a~~=s7֌/q G<>-(.zڵ-aԤcL n 3:W%80r W3X2ޗ@}[˶5ؠĎŇNry%aNSz/ҧ1I9b.a,u. '%ehFo tV|~ I:7+n]9t:~M*.V`=s9tDZ3KZ\bpp=uv~lsQYZAO3|߲DG5WƽN2"1b3PGASvGī?JԿSUͪ+2x!%rM'E` ͱpRo)>=dثT.sҤzAxU ԻPQzȲӕYnk:[F炨sFD`Mԩ T0v , S fKl)+*DIsm 1\,`iQ~= btϻz 6(\Sp*5SCbăd'ie(h\}>Z$xWˉD?j3 6johfI]LtGK!jTU`ڷݠەo2"MjJʨ|޹2SGhu #SPja^FS)9^OatEvOCȽkљCrKvl9L&L9ѧI2taܦZ/+@x:Z4c`u8NCy7 phF`.P:GoEaH<* `~i=O\yU:D:ĆCx2KԊh:| '']6F+ U=H2dGV{g F"ٮFtk)p5ȁ!F$ƴ5Sf P42N+D̐N?;kB1h~z7ȣ7Ùqdiv3U+I\~+g̨#y#w%YJ͛5PG<4j Ӫtw\VEp\>Q4i(Ѷm7BBO?;= 9t:ckHT-/Jl% n9:L1mx}T 6!^Ӿdt42xf{ @],*oc#cgaLn{[Iم80jLy6םlEK(`j#¾Mĩ#ekoHn0tsHOǬ1fhѻ&.T{3Z"Mq^ J86dԯ#1t[gg|u?庾)?az6r.|f7r3Q;[0%gpEYטO/6U W=Jֽx5tMZ@Yr%- Kˉ,>32Yy,!tQ!t,I~vsم{˪$BhCK!5ǿ{WƾجpxpTr`4Bwds1UZM \*j'rf.f~哨?ϖVKh݌^O6u=@i + UDz޿%aQxS^n1W9ahWҹz]bHRJ#YvkRXYL2QgFK|`xz,£pyذnPp3@WBK*xE1t'O4' t-"h_g w:9)gSx휡}Ю(x#d_[SWZH 55z*|_y H&oK!2o"J_CmOҞpyMCIZOb!LgXY!(&wYL @0mǀ&0GdA'{jcIaՂ]U#ϐ.=à.5Ћ$4x9̇Ei֞o R 8m*=C_.~>*"4xǮ[VlnhlYN&D'IGO}\&"~aAy8SA,^vC46%uc^r[ʀHѧM*yIdc ј&m@N|ږC$c@p!j^rtGk Ub R0u^>OA׎43!j 'Aⷓjw`,m"%b9*9ӫNWɴ ʨ.-_ U;mm}N/T<vU"?{_d \#.?}etUjR{^`! nOa)QUUr* +RO03l4Yd>Bf-7[Li;EQʪ17$fTu>(CWg Z(p: 9|AP2o鏽y&5 |2I>*cfLBU2#o8R+d٣<5Ӈ!]_>M0}cg%P6z.h00%((#YC-"E#tn$1ƫ/C wU_LzSJpӍ}Ld4B=,ؒ|U{P/*탫=.;,k ~շZV`lxjNP5JB$,{,B8i(dByyvq'ߌRQ]0eI~O~p,m 8;I]\o1T ?U}h}k~ݨzܑͣ5`+ 6gEPLjeKSz?N5("#лa30rK'oSS5Ocaqme1c~ӹZYwmX˿".Fg?tDmi,"Í?`kp38w1>Xrl(5Qy #ѣ5Xi7z)Lg=P/Kքklv6I\D)裕Co~LGe9[/_kf  ]Q;<~Yi#q$,Tɲ`_P;efDsфlQkM,"s%T7Z\'N%2Fu"Kd V "ƳʀD i*`k gT>}7O.cy ><íssDw]׵N\³% ןQy?}ydsX`~wzBmWmo5KS"QҟyJ[L̐b?^V۴YVQQ^CP95,B1l?)IDL_.҂nGB_18>7!|N~Hf82"t>5D|y(0CLjx.o@[>H~ƳT bDJ+({v8m~#ZAƌD5 Z]$[O"O.[$HxM2ģlf[< !.sLm o`dbW X  mQUZgN^8שdE,U-5}Kq= 7\̷Z4z|bLa:Q0~^^h`RCt¥H^{|Մ1{#g-P_K"J|I3W|J̑Ma2hT NAy 1%vzꔎZ ks3˂T.^{ 8'*~HSua=1+UƬ~jOPܚaPkbQ"mWYlB ~GnB$}GW]Mz(O#lcnwQÜܴz+ϕ HfbiB΃=}XKp"r"gL轃t0Sv"? 8׻^3E~`If0A!f!T \PhlExWҒfsrkS'„ͣ!LQ+(Q6gXN짬$$+Qc+T g-Һ9KZ( + ?##wJQm>s&(Qjּ.Z ^e8"_1pQmE00nR;2y+Nhv_ubbk4J w^JVŢFFR\3t*Y_/x`ˆ 2 Fh=*?7S.~8&Ȁhv:8Pk*4Khd@fڍ6+,fA-`;J7YN?4rИqPsTy?ި޳f8rÛ.1te\ml{ sVN`qaڿD1ܞ)8,) ᥨ dk;،$]_f,xZajǙ3rwiЪP¸76~ $w-ji֞%KSxjNۓiE|'ϯ'<י !p3)G7VXT}n3 FZs-+.2JZnɲN\1EiS 􉆦eќwp߾s>`P^Fi"UhP@.R D;wuG*]VM^T;dw B` ys ̯-l5CˌSyj)i6Z/tpZ»v)0}U]z!dZ>lJh srOQ$euv-7za[iI7ī6"K <XXKNR}[7J96&qyi8ji.R'P+PcʅqD`JQEݒ4JxW}Đ*vMJ̠Ϙ%Mb;JzN}ҷ_t(b.-Gynbj4b|r=^_ҡ\ sL}}m]Ӯ"_6 F5O}闟dGjO*͹@N` nw٥b>JԞWÈmiaý33[0׬\?;[`Laqݰ0I఩O/ b7]b|lkPBm;׭pziL%xt pA-~%ԧ_`[jۀMȼfxߠGǠ{u_Nzxw 6I^ Kֹ-R]8G.,åqP(Nj㿯T?xS*V cƵ@v2($,F/6 _7JO6WBGr7ۇͽbeu R NN93ʣ cJj0JeD:Ȳu5ШG d譌Sɧk7a{Dt͈pT9pg:¶`aҾ ]V)|6E72 OB!K~N <@'Yp,ToʲLSl ZkgvkvKR;8.;?`U~Beo0by25oe{MClU@͛LCciz%Dz2"ds+`X sE<@N3媉Zحao;69a9FKT$| $mVkZH:W`+ LgV\ ;C$S8M|&ר:v0bA mrJvdNQ@ S~}%8D,ק㷥gYhpgUqwɉe<'_ .t4w-+nxɆTmA5'!@^A)r;\{%dlE}I-QAkePCuU8}G9E*̠6FiWd"O ?Ļ n6_f\ A )7m Ddz2.X2U)=d>lG#6GNF0RN߹佁i3T\8TkV߲*Y|CTRoZ5X&t1© G19i݈QQy:7mQS['+ӹ%Am g_uƔ DD7 ;Wu_l1 #J6.?iN _c''s9I!z5] l~zmDjS2Y8ch tgM?P&DNX=v_О,ZzR{ɜyLsݲKZ>l+VG>xYp+Ԑ@C ^MOg>Z>=ԣv[s ͤ1'b)OJ]>y|ke{4;*BuHaҊ.YX*ܜjgۏ戣Uۗ,{*8Wj k\)8&X)٭m3/χ¨ ]?΅әHHLW$e Q1YВo;է;:frt]Kç%0QJQ2l8NSPD=""H6' ̑2n\*w(q55Ph^筕'Ae գcF(vJ/zyH(|RS7<;J><}5N1Kuqb@ΚZxSp}==\Ʌ=/p%!W9۴e)oB՞ 0eJʶ53:M7d+lqN bۇpHFuCW_?Mm6mb#,LjY]"ar5L3HCjAv [`W3$q܄NѺ"`Gfj l汱÷cO :wHf.Ȳ[(GKCL7֋٭y|NL|}'H'(fyLY@4s%f7=E( b+VpddG\Y2?R4UBhħr̿wLOSisA(].>J+|8Lb"#|4; 'u?Ao}KL^X~kve'N7%Ha"C-ǽ4%|i2ؿ&CD1THx<?.k9> C 5ɉO9C!⡿otZc3daߜə$̩vGg;sy!߭:Q0_SXveD yIFhw??ɰIHR''jMkX=h#y]<~~jQ%D߲S}?ۑ̌\-}pZIC LQd6.%B,TT IV^M ܙO xVܫ&Ѵ_y[QΛu|uѨ)z2 4+{Ϙ~WRGïϊvj%L=kFQLh7t`I΄Q/ꍼJ-CB;b|/{Nv00uZejC8/AvnŲq$B3C_1_l2MM}%͛!{ (B>䑚;0̢͒#3%/L SŌuif+ 7.C7Usz1J\wEEp}Z2ՉCyDZ{2_NЦ+x@Xiu."ʈކ N$BFt86K`#Qw*Z~ ګ\nromP^ ,I~D/_*NleJShk}u\f6<ʒ(f1XG"}XbworԸpX uvClzBˀmO3d=5|y$F zaRa;9O_EOM h֖R7%A1!N]S=\ZyHH6I) mkT„ئt_1KּS!Rcg(޷u]Z6&DP÷$I<8,s;Uh[Ɗ q5缏;˴'cD1?̀h :*1{ ZN5\JË_W:)X ![ EiE̥-Jê)rIXMGv!)F7 WI.ȹ}1ף~h!f\e..nh % &y.AaAc}i;qRCƴYdc͉U%AUbQv?TEJdSn|-O5Phm-Evڡ!6mq+ c+&L]D [h \-&]OBߛ"'fd")rwI_.6r?݅df=c|.n܀Rm|cl^c?Q[YgFyɜtŒLpŮRպҒx9"H¿pfRE* ׍*I-)9ˎ%#J&>rܳ1.Qml EǀzwAv794)Ns5$^qG)tr UL é39Bg{d ia2 A3Ŵ_*kM,ƪ/]Kӄ[XVTJ;+&F{SXkZ.Z淘ѐzkiIN4!R[ZkrWyЌ=T3ѝ}'8iZUL?/M){$xmEEa]w M?owk-"ߡ.c$!²+eV51LR*H(?"-[o /7+ ܈}xr\Λ3JJR#.yYI/NF{n8o7Uyt 'UHGx z W2R@\]Ȍ0#CdjC|Rhwbe+N w|H61K}VUb:D̅YN9 yQoT+.{V> hⳠp/v%>}85 _?l-+2> ,G"eCh}VqvC\MgW|WiR8&zgj'<+MIBTT,Ùhe "oguC\hg{F]tEӃz?Br1`MI]9x?O9g =l+mPn#?aT̥MEv443M FQKoW(l0_Oh)@YFS2׳ u3S;}*ٻÐ>L>v5M{$͞BTazD=}x. p2U \([OIXfWTduԾ.cYVus\hiKDt2_L=XQ_ 䵍A7 3Vfї٩prʈd~I/)/ ЈFTOh N?C|iC7D{l!{ATE (-,^\jPQTQV[ L82Zo8"|xs2<3Qt:bᢞ}F{haSl#Ɯ3L N[I_z38oXϭ'Jтꠜ(bϟLx#Xk^ 'm>ЕCػQdUCMӹs> = @w谘t+\`+%L#k(K{%Z5!v<YVڵ% }8}HM|هX9[$mn]ԣAGh-0d178sjAuz(ɝ[)O![uR!vĕ͋AZB$)J k_%}odEv4$Ӵ G/'zUF^b_K _m <_դ.V+8&xz_9uCk 6g-[G kϽG<47k1Zl=oIk9J?!Ď yu5>{z1J޵U"q1 =Rl#^aba[B vTl%.[v1 KLhU?kbkqLyXl#G9'S_jIV"6u9`Ӄ;oRQ:̌=b?C5Q0߇4@Z]3sB3-8cVzr"FVB΃C;aw\j 56kS> Foc'? sh3`w\| %%#%dECk\N-dq!)iܜ$^4Ҽ3f,).b v8eq`s)q/,#vr- J| ZLKu2A$q>>J"?./'8UQb i)cKDs*NeAv'9Bip:(z`V'KC\)AcSY]p_ 7BwBAC]Wl#^71FCH^u\c˦L) 5a4oo|9KYlёA2Dg}'9J;Brw}Aз'K[ wcxz,&򋺏+ٻ&rS&4;6C{n:  ac#;"4;4)l߲ ʒ 駎f͝E5ǒq ~XPE,3򅔇㇑Wڸޱuu̵FEIwI[b!svyq6xqW7;s m:#*`c=yu704rINͯ$V”Qd{nXp\vg)7b xtZfD4| .VH(<(|Fje9ҼN)ocq?g&NU5<_ᾜjKתLTAfV/F0+"0@I.o SrR!Pv.+V8&Q#9iq~,9,:@|pNЖFNWkKb]yNeF-}# R, z8>A9i46_O)?!9ibd 6t> 6BcG# GW gP o;̺a7nvJ{:0q*}΀9ցʀd[ETO jPiR.XS3{^n:Rw׊őXxAFKE3%2UtèM슱0LN \6ʩ0hvDZ|LIRSwGA)%Uk6K{D &,xn727@R<kgc q1 T 4RB*`@p LmSFZǘ +kӎ}0o,Z!h[EM5[^.&ѱIM(J>H&_$?͹I쉏ժαKX'vbWg(1GY)حGB'hI1|m^\q{U "V>kQu0"Ȭ]kaYח6F1`@k>!_JM,|()B.3rmicVUalB#ɈX:ौ>Bhz_3͋,sA!1ٽQE0PMOn Pr -[T*%<@ٶRGrn$T5>(0Lx`pxJxD𦥌!vg 5V(655uSsO;q3! endstream endobj 404 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> 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 406 0 obj << /Length1 725 /Length2 16161 /Length3 0 /Length 16663 /Filter /FlateDecode >> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> endobj 373 0 obj << /Type /ObjStm /N 81 /First 722 /Length 3773 /Filter /FlateDecode >> stream xڵ[[s۸~c3Eٙܛ&N8i:%$w%YWN{fH&A ;0 Xt xè%5\TXuLA]&Ņ6`+&̆Lӆ_{ 蹽8rx7<]RzoBE_>Xoض a2Qajؔȱ Dq3]]E}ja 2+`V!I^Dz!KrEF<#hTZ&~jgX AU'BP!Q) y>PڢULfdNe9W!3`z I臊ŃaE$"4bb1oqX*!WQ`LOv$jk$s!bHODVGg򯊣Zx@!<>oon0Ͼ?|n.34G8ŎD@i@G dMNYmw G"1:?}\ofx}ћ\XvwHi@B|M9p?DMw*x 'Xz/֩^hOa.|BxAR?3j"O#+ꯊ9_ S:8T7,mmv-vzOgk@5v덪*P+:RQe/׷GHtoZzcÆ%NsJfxջX֫xvR@;fEv?> -!,laoު%Y:` aa0'̢pX1/X2W&>u$pMAP$_ܭ΂;m>C}FXQG^L_=Qk9qV+i:O@*m~5gNuw̦z^U/ݵv(_;ko]j6ճz׭ǺPoA߸l'ߒo5;-SCoVԳ7nݖz 7.%mi5N%.M弩\TΦtw+nk{oݼhjoŜUwz%7@o&4 hE5ʊww7yHnw[aGuoXqCmS+d-VmTom|ƹ|UYq쮽q k*w7)﮻yX+ǯ7Jߠyh/: ~oob -^Ĭ-U rO[Kk3ڴye#6}f*Mh“>Ǹ{oسїzՎ?-[TP}7X1G?\'M:SL\䂿zRۗthJ8% ]$3.)*p4uM<{UfCJC]zhui#YkBvH.7˪XtaaM>+NLԔ*@fUndb%ӰafoFT鰆t39M6uJ&8DTږC,u]dٖM-ɦf,Aoɮ)հhlIhlxyI4^`fIGypq4]tuzp奠?0'$Y$G;<٣YG3 Q.Nai[7$xXx y(zBq} ?mrMƠ%%T8L%tࢹb ~IZ-IsVA/ST-oxJp8 eKVZp=#tyQ?yt̢O ӎ*hœy6jd{BwԵu4<ƼT-m7S鳷ϼG2s*s'~=K3{x!!3Sו,k5hxG!JN/WO78Ξ ؚmյR竇(H7@OYSVDK]rg 8NCY!{(P /^̽'MlI*^)?QQmr: LX/]F~Par4߰E\{P'z4&T+]1{ŪF*gѭoVӕJ Evҋ߾4 ck>yOH `u1}?xz*g퐼WΆ()/`-xg7򸑄\-6+"kDZfגGE*3qjMX̺ǨTc-28X>뺀iVxL'˟<imj:*| 'W:}y-r_ }}~:fWHc9|5nn"o8'yn @iɋkW35%j}icm* endstream endobj 435 0 obj << /Type /XRef /Index [0 436] /Size 436 /W [1 3 1] /Root 433 0 R /Info 434 0 R /ID [<21C711DEC8B0BA118F7943F553016B0C> <21C711DEC8B0BA118F7943F553016B0C>] /Length 1061 /Filter /FlateDecode >> stream x%KlUU:>oP蛶@{7--B)-G[Dzy(@#Fg3B̘ԉ +$!&h51&ƁƁqb~'_ξg׿־!_B,|PU2W͠RkĦQPSĎ2uaX&6ŰMd;̰;ClFq`gu[1:&vnQ t ^0` ВBXgv:j~0JlYPd&yQya+ J,8I0)Pp,e,49zN8JGt^C N<'=y7IK"p^@$]UQy \WUp lb6 `e6Mpl$/pjeu /4B=.]izzox)WPjQE;>"t{,|RM`Q;nw> r)ԇZbv)'箭 [r{1 ?-Eq:Cy]1ةxDZ'j u+;Vv_SMƧ^{b`\yp,Z橄1bVx \WU up Mn pw%V%YR^ڲ Tp4XkXuϓEԒ2uj,}MZK?(UgI[־K5ZTѲ7J5YTe/zZ0TH)7}78 t /.k'I纉r| \8"DbS{u endstream endobj startxref 365145 %%EOF flexmix/inst/doc/ziglm.R0000644000175100001440000000220511740757251014743 0ustar hornikuserssetClass("FLXMRziglm", contains = "FLXMRglm") FLXMRziglm <- function(formula = . ~ ., family = c("binomial", "poisson"), ...) { family <- match.arg(family) new("FLXMRziglm", FLXMRglm(formula, family, ...), name = paste("FLXMRziglm", family, sep=":")) } setMethod("FLXgetModelmatrix", signature(model="FLXMRziglm"), function(model, data, formula, lhs=TRUE, ...) { model <- callNextMethod(model, data, formula, lhs) if (attr(terms(model@fullformula), "intercept") == 0) stop("please include an intercept") model }) setMethod("FLXremoveComponent", signature(model = "FLXMRziglm"), function(model, nok, ...) { if (1 %in% nok) as(model, "FLXMRglm") else model }) setMethod("FLXmstep", signature(model = "FLXMRziglm"), function(model, weights, components, ...) { coef <- c(-Inf, rep(0, ncol(model@x)-1)) names(coef) <- colnames(model@x) comp.1 <- with(list(coef = coef, df = 0, offset = NULL, family = model@family), eval(model@defineComponent)) c(list(comp.1), FLXmstep(as(model, "FLXMRglm"), weights[, -1, drop=FALSE], components[-1])) }) flexmix/inst/doc/bootstrapping.R0000644000175100001440000001652713740572307016527 0ustar hornikusers### R code from vignette source 'bootstrapping.Rnw' ################################################### ### code chunk number 1: bootstrapping.Rnw:11-34 ################################################### options(useFancyQuotes = FALSE) digits <- 3 Colors <- c("#E495A5", "#39BEB1") critical_values <- function(n, p = "0.95") { data("qDiptab", package = "diptest") if (n %in% rownames(qDiptab)) { return(qDiptab[as.character(n), p]) }else { n.approx <- as.numeric(rownames(qDiptab)[which.min(abs(n - as.numeric(rownames(qDiptab))))]) return(sqrt(n.approx)/sqrt(n) * qDiptab[as.character(n.approx), p]) } } library("graphics") library("flexmix") combine <- function(x, sep, width) { cs <- cumsum(nchar(x)) remaining <- if (any(cs[-1] > width)) combine(x[c(FALSE, cs[-1] > width)], sep, width) c(paste(x[c(TRUE, cs[-1] <= width)], collapse= sep), remaining) } prettyPrint <- function(x, sep = " ", linebreak = "\n\t", width = getOption("width")) { x <- strsplit(x, sep)[[1]] paste(combine(x, sep, width), collapse = paste(sep, linebreak, collapse = "")) } ################################################### ### code chunk number 2: bootstrapping.Rnw:94-99 ################################################### cat(prettyPrint(gsub("boot_flexmix", "boot", prompt(flexmix:::boot_flexmix, filename = NA)$usage[[2]]), sep = ", ", linebreak = paste("\n", paste(rep(" ", 2), collapse = ""), sep= ""), width = 70)) ################################################### ### code chunk number 3: bootstrapping.Rnw:194-199 ################################################### library("flexmix") Component_1 <- list(Model_1 = list(coef = c(1, -2), sigma = sqrt(0.1))) Component_2 <- list(Model_1 = list(coef = c(2, 2), sigma = sqrt(0.1))) ArtEx.mix <- FLXdist(y ~ x, k = rep(0.5, 2), components = list(Component_1, Component_2)) ################################################### ### code chunk number 4: bootstrapping.Rnw:210-216 ################################################### ArtEx.data <- data.frame(x = rep(0:1, each = 100/2)) suppressWarnings(RNGversion("3.5.0")) set.seed(123) ArtEx.sim <- rflexmix(ArtEx.mix, newdata = ArtEx.data) ArtEx.data$y <- ArtEx.sim$y[[1]] ArtEx.data$class <- ArtEx.sim$class ################################################### ### code chunk number 5: bootstrapping.Rnw:225-230 ################################################### par(mar = c(5, 4, 2, 0) + 0.1) plot(y ~ x, data = ArtEx.data, pch = with(ArtEx.data, 2*class + x)) pars <- list(matrix(c(1, -2, 2, 2), ncol = 2), matrix(c(1, 3, 2, -3), ncol = 2)) for (i in 1:2) apply(pars[[i]], 2, abline, col = Colors[i]) ################################################### ### code chunk number 6: bootstrapping.Rnw:238-241 ################################################### set.seed(123) ArtEx.fit <- stepFlexmix(y ~ x, data = ArtEx.data, k = 2, nrep = 5, control = list(iter = 1000, tol = 1e-8, verbose = 0)) ################################################### ### code chunk number 7: bootstrapping.Rnw:246-248 ################################################### summary(ArtEx.fit) parameters(ArtEx.fit) ################################################### ### code chunk number 8: bootstrapping.Rnw:256-258 ################################################### ArtEx.refit <- refit(ArtEx.fit) summary(ArtEx.refit) ################################################### ### code chunk number 9: bootstrapping.Rnw:274-277 (eval = FALSE) ################################################### ## set.seed(123) ## ArtEx.bs <- boot(ArtEx.fit, R = 200, sim = "parametric") ## ArtEx.bs ################################################### ### code chunk number 10: bootstrapping.Rnw:279-287 ################################################### if (file.exists("ArtEx.bs.rda")) { load("ArtEx.bs.rda") } else { set.seed(123) ArtEx.bs <- boot(ArtEx.fit, R = 200, sim = "parametric") save(ArtEx.bs, file = "ArtEx.bs.rda") } ArtEx.bs ################################################### ### code chunk number 11: bootstrapping.Rnw:303-304 ################################################### print(plot(ArtEx.bs, ordering = "coef.x", col = Colors)) ################################################### ### code chunk number 12: bootstrapping.Rnw:321-334 ################################################### require("diptest") parameters <- parameters(ArtEx.bs) Ordering <- factor(as.vector(apply(matrix(parameters[,"coef.x"], nrow = 2), 2, order))) Comp1 <- parameters[Ordering == 1,] Comp2 <- parameters[Ordering == 2,] dip.values.art <- matrix(nrow = ncol(parameters), ncol = 3, dimnames=list(colnames(parameters), c("Aggregated", "Comp 1", "Comp 2"))) dip.values.art[,"Aggregated"] <- apply(parameters, 2, dip) dip.values.art[,"Comp 1"] <- apply(Comp1, 2, dip) dip.values.art[,"Comp 2"] <- apply(Comp2, 2, dip) dip.values.art ################################################### ### code chunk number 13: bootstrapping.Rnw:376-382 ################################################### data("seizure", package = "flexmix") model <- FLXMRglm(family = "poisson", offset = log(seizure$Hours)) control <- list(iter = 1000, tol = 1e-10, verbose = 0) set.seed(123) seizMix <- stepFlexmix(Seizures ~ Treatment * log(Day), data = seizure, k = 2, nrep = 5, model = model, control = control) ################################################### ### code chunk number 14: bootstrapping.Rnw:390-395 ################################################### par(mar = c(5, 4, 2, 0) + 0.1) plot(Seizures/Hours~Day, data=seizure, pch = as.integer(seizure$Treatment)) abline(v = 27.5, lty = 2, col = "grey") matplot(seizure$Day, fitted(seizMix)/seizure$Hours, type="l", add = TRUE, col = 1, lty = 1, lwd = 2) ################################################### ### code chunk number 15: bootstrapping.Rnw:415-418 (eval = FALSE) ################################################### ## set.seed(123) ## seizMix.bs <- boot(seizMix, R = 200, sim = "parametric") ## seizMix.bs ################################################### ### code chunk number 16: bootstrapping.Rnw:420-428 ################################################### if (file.exists("seizMix.bs.rda")) { load("seizMix.bs.rda") } else { set.seed(123) seizMix.bs <- boot(seizMix, R = 200, sim = "parametric") save(seizMix.bs, file = "seizMix.bs.rda") } seizMix.bs ################################################### ### code chunk number 17: bootstrapping.Rnw:433-434 ################################################### print(plot(seizMix.bs, ordering = "coef.(Intercept)", col = Colors)) ################################################### ### code chunk number 18: bootstrapping.Rnw:441-446 ################################################### parameters <- parameters(seizMix.bs) Ordering <- factor(as.vector(apply(matrix(parameters[,"coef.(Intercept)"], nrow = 2), 2, order))) Comp1 <- parameters[Ordering == 1,] Comp2 <- parameters[Ordering == 2,] ################################################### ### code chunk number 19: bootstrapping.Rnw:455-462 ################################################### dip.values.art <- matrix(nrow = ncol(parameters), ncol = 3, dimnames = list(colnames(parameters), c("Aggregated", "Comp 1", "Comp 2"))) dip.values.art[,"Aggregated"] <- apply(parameters, 2, dip) dip.values.art[,"Comp 1"] <- apply(Comp1, 2, dip) dip.values.art[,"Comp 2"] <- apply(Comp2, 2, dip) dip.values.art flexmix/inst/doc/flexmix-intro.R0000644000175100001440000001333413740572321016426 0ustar hornikusers### R code from vignette source 'flexmix-intro.Rnw' ################################################### ### code chunk number 1: flexmix-intro.Rnw:30-37 ################################################### suppressWarnings(RNGversion("3.5.0")) set.seed(1504) options(width=70, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) grDevices::ps.options(family="Times") library("graphics") library("flexmix") data("NPreg") ################################################### ### code chunk number 2: flexmix-intro.Rnw:323-327 ################################################### library("flexmix") data("NPreg") m1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2) m1 ################################################### ### code chunk number 3: flexmix-intro.Rnw:330-331 ################################################### parameters(m1, component = 1) ################################################### ### code chunk number 4: flexmix-intro.Rnw:334-335 ################################################### parameters(m1, component = 2) ################################################### ### code chunk number 5: flexmix-intro.Rnw:340-341 ################################################### table(NPreg$class, clusters(m1)) ################################################### ### code chunk number 6: flexmix-intro.Rnw:344-345 ################################################### summary(m1) ################################################### ### code chunk number 7: flexmix-intro.Rnw:361-364 ################################################### par(mfrow=c(1,2)) plot(yn~x, col=class, pch=class, data=NPreg) plot(yp~x, col=class, pch=class, data=NPreg) ################################################### ### code chunk number 8: flexmix-intro.Rnw:382-383 ################################################### print(plot(m1)) ################################################### ### code chunk number 9: flexmix-intro.Rnw:403-405 ################################################### rm1 <- refit(m1) summary(rm1) ################################################### ### code chunk number 10: flexmix-intro.Rnw:426-427 ################################################### options(width=55) ################################################### ### code chunk number 11: flexmix-intro.Rnw:429-432 ################################################### m2 <- flexmix(yp ~ x, data = NPreg, k = 2, model = FLXMRglm(family = "poisson")) summary(m2) ################################################### ### code chunk number 12: flexmix-intro.Rnw:434-435 ################################################### options(width=65) ################################################### ### code chunk number 13: flexmix-intro.Rnw:439-440 ################################################### print(plot(m2)) ################################################### ### code chunk number 14: flexmix-intro.Rnw:483-486 ################################################### m3 <- flexmix(~ x, data = NPreg, k = 2, model=list(FLXMRglm(yn ~ . + I(x^2)), FLXMRglm(yp ~ ., family = "poisson"))) ################################################### ### code chunk number 15: flexmix-intro.Rnw:501-502 ################################################### print(plot(m3)) ################################################### ### code chunk number 16: flexmix-intro.Rnw:531-533 ################################################### m4 <- flexmix(yn ~ x + I(x^2) | id2, data = NPreg, k = 2) summary(m4) ################################################### ### code chunk number 17: flexmix-intro.Rnw:549-551 ################################################### m5 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2, control = list(iter.max = 15, verbose = 3, classify = "hard")) ################################################### ### code chunk number 18: flexmix-intro.Rnw:568-572 ################################################### m6 <- flexmix(yp ~ x + I(x^2), data = NPreg, k = 4, control = list(minprior = 0.2)) m6 ################################################### ### code chunk number 19: flexmix-intro.Rnw:582-585 ################################################### m7 <- stepFlexmix(yp ~ x + I(x^2), data = NPreg, control = list(verbose = 0), k = 1:5, nrep = 5) ################################################### ### code chunk number 20: flexmix-intro.Rnw:591-592 ################################################### getModel(m7, "BIC") ################################################### ### code chunk number 21: flexmix-intro.Rnw:727-734 ################################################### library("flexmix") set.seed(1504) options(width=60) grDevices::ps.options(family="Times") suppressMessages(require("ellipse")) suppressMessages(require("mvtnorm")) source("mymclust.R") ################################################### ### code chunk number 22: flexmix-intro.Rnw:740-743 ################################################### data("Nclus") m1 <- flexmix(Nclus ~ 1, k = 4, model = mymclust()) summary(m1) ################################################### ### code chunk number 23: flexmix-intro.Rnw:754-756 ################################################### m2 <- flexmix(Nclus ~ 1, k = 4, model = mymclust(diagonal = FALSE)) summary(m2) ################################################### ### code chunk number 24: flexmix-intro.Rnw:761-764 ################################################### par(mfrow=1:2) plotEll(m1, Nclus) plotEll(m2, Nclus) ################################################### ### code chunk number 25: flexmix-intro.Rnw:803-807 ################################################### SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") flexmix/inst/doc/mixture-regressions.pdf0000644000175100001440000176642413740572337020256 0ustar hornikusers%PDF-1.5 % 101 0 obj << /Length 3357 /Filter /FlateDecode >> stream xڝv6v>'$vҞLY]2-ĔTQns (Q& $p\CiU*ϗW{](+.}<ɬJ%c:~ߗkM-|o͚gw75'p=p!n0l`?lpbwݬM oiuV27wyWDgP?Ѝ<ϮlxobBčI xAH8`L_Ҫmjy K&MqFӉ64:o:q5P'I3 = K:(>]jP udCL\FHgz(F X$HSm+2:wy['yM.og\3s+g[^xɊv 0 K =){8[zu{UDYTeQʚ&ZWK{L[WAs}Wc0T&EK*;{d/MSx։1w])v^0angpy*R@rǟ^ȊpMyd`x Bn7WGyC,![Ĕm{qVIZpxvS i)uC)MVZ&B,ޢHCW-:)FVF2H\g*(t6S 'eY^^"QYV{_-0`;k'ڌRL ΢WkzvVºusn,CYjA" w@w »/ĐQhM[ {^̜OṂ^`UHSIzSUz7&iY+)/[.v^|/B8M{EMs50u&$rCB)?=b]҂e3u ;kVGzwK p.ƅkrϬ_~N4 4)Fak|"ȼ(]z*ń!A}“xA0 6G1= XJ#kn81. ,(tK2B5MKrӐ ԉxi),X5;K3"t,:r ^5|5rdžaVj}F;A>Bs9Q0/@iDOUr\6'lVL$z؋=otDMV XqkY#D!73g8 `"!3ed+<,8 >wfC+3 ay>2 "qՃVsω YfeH/K$1Ź@od!6h ?h4sf ~IYKO&O 3uHyIyʼnO $B x["HY&6cZhZZ~̳O;fߩi٬9եI ĺ5 VUi%hFr8syZVfqZ'`q2bL<8 ?Dt!qN|R%wrShVߊ_rIZ?_۬7|+Q۱ bJQ;xΫ&MY$# EnD.1Zq.^X\Q@܉ 5@[aMGǷ [gXH!Ko^7FNd>!IՖ6RDHJ6N 7Ơ&~#Nuvm1_^;4*djg 5 endstream endobj 145 0 obj << /Length 3702 /Filter /FlateDecode >> stream xڥrPDU0;'Y*Qr"!I09sɯ筽$'ۗo67ͷot41qTǵ{MQ7w_?cLDI4Y~~_vUhc?p7& ,ueGUQ-p,ָ~Mx[a'$484kNmCLm]'5' 7aKw> p]m^,˭d!hfsqptKKJ@ҤQՌGܯMœ\5# =7oIAvԋ Hut̲dqK*w{ F;펻:7Y\\gp7"{׏|[e@T` 6K$W1c$m0a*7Oix'r?+>9JK9j%)j.NHqx\OHuag5t ki2upml!4$o=8Eڊ oV;kwԡU6h,`IW3X`j^U\$c# sH瑷& B%O jyhx j]bHB%RSF2#}VG-tCk-b:W&q\Lghb=Ѝՠ_Y=Gۜ)ߑ7/~nC+dӺpLgM,'ijƑ:{zNk#޴n3(?B($`Y@8S1]:sz~$^Mٳᩓp~F ^{\^XC~기F;'n@ 1`ԭS4߿4هkɰL9#[<fCSFz8;u&]8 [hM y+% ͦraڷ([[']k@Z(9Bϱzk#q(M67j aΩNAG-IIEI@*8/?*6rԻMZmܫغEt&fNq=1buY ΐ7Ե-"Ku-¹ ҔšjçJȦ19-xj%q=;??& 51hý9̔6 $b U垰WI3D}ŁɚYz#.˯&wV[iVlN/6ϝ*MafW*Kdtч_l՘ntn &Ny?8:/#7r"<_!wZGmE8OR=}{$Oe[W? HȜGiod6IVD&+.#'5`ʼnrhk$3SRBpdܖk՟-ωv,=VD&FǬK`Bh #7k`&C} Qɦ T Kjj0"L EDey⬲5C%eGFxKlBQF(I\GuRJH;hhۍd)LYTY<xh}Piu>BD526%xRjeSXJklڲ,J3K,c:mg^nJI `XKkⲮ K^-.Sw{.|9$0xA?]g|I8mi̥ha锤uqN#8B a)d6% (i@<)Jp;8H֬\y6?rJ#wҬt)`keo uIiTI{VU[!Ih6,bIdw0qd GNpݔ#Y._jʮ FLiPw"oC6|gU0u=0ve)^f+]y+/ˠkxQ3y yk A}%CkDO=srrgqQJ@z\iuZ?[?-*fv4uC~"v̑/.m**[5Y=NlV> stream x\mo_`nnd@׆8(5MMQ2ITIv띙}ޑ ѽ>0rL^=W/M'g!Ozrv>yOw g~2RN_oghd&)?7=U|r?ӗ'N'pNWD{%>vOӯ^ʦYqf)̶ZƙH^փØYoۧktey BEC3Z#RZbPJj o=|X8 pHEmo4O[܃cEo`l`O  p9qWėx'4>{x&rF3U_y{E\kNZoO3u]g yfZDeop5|eNwe o{ {L7OC7iKug7[;$=oaVvk:]=0.^¨0m]yMiu f Qw-s])b"pX% to]\Br^l=oc.|CXmpPWe.JcN=uz>tpB ,;wetW:FO[g50Y\CM9yM8Snj]zç C_2çO]B+2$&,bLCxF#c,75ؕ (?"w~WQ5,uZ{nj`ďU㐪!) fDբk,d-e>U;QRb,L!= 9|0cvۛcY\wxL~9(Ӊi=jK:]T# kjS5mbpiG&,(xА9h U>#2Ap)'muD(?(#SQ5~4#JAl̟o!*ַ(\MW [ڻMB(݀ &;cl* K&]0G G\P"k(TVvێFzr`GPZ13 \k3"ՈY#nY/j싐L@lqaReXtʀm;ma4FjP8o4<  ‘>gc"jd_JSF5B-/=d.bBDۘIS_{6t`2PAGΔDhd+n܄ݗ7{XNz#'Zday(svsFy O`b=nEY:ԺlzydsmcݥbWDk_dZ s ToRGsȓhrUxD XƖg7Ť)a]:F܈ \=M5Gϲ\ȻDg 7qȭ22 {߱q:lwEa.?RyXB(}`H*T:ڑnU7]}MAjVM_{x7=^L S'1Dy 1^8 fhL/e^WCtq^ 3߾ j!0/E4hH'@WA$Ur>^(Emaq[dS|swLݣ$ J X3P"zr PG#KTfYwƩcU8ֽ͔CƘwoP-2|ʻB*%, Oaq8ASU_ID8qJ93!Jl1tP8tɶMluu=yq`e4tDDz*>"p7t`E,{( oHu\|Syp@[JUt_hY2 BԋaܚLf{n{u% CDS%m>%%&|^2c4;u~ r5dq:s$S x'G+Whdum˩w$6as0M;;ʅF˘q< r|> ZEԇa{N% |+< eӓ V_=L &]/<;r!Oޏ[זe-۴6 qYnB$A^ ^޾?*U;Sŧ=L+^@ I=_+QWN!Hiq'ior@U%»^IĞ;t'q9 !Xy>4*Ct+a["Y[ U9~ZZiTtYpn9!уc=\ \5$/&1b2UYpԁ`w@ˆ{KWz*ӊU,\[,--IA2q7Roǡ4m89d<I0AЎ՞y*X7x#2r*+mQ^BYw-sIb͠u{ڲ!+wGdSm([u19rTu><uf<(]Ae W6!zs'jL :}Y.b!x,GFM,Uhp$Ke+ h>+E:Q:/S}bwz 3Z=3FX82H8~3p< D!(YC֥״nt7[Ͳvor$M?}>j]6}N'q\ӚTp_iٶczq%j&>O }ug'8D(NHt^^.4gPˈyX^hi9,.R5=:|X69NI]涰"qRKu)wIR^Xд6I?m+cWiq#G ]>qTH}L"*#= tE#aM/Xʆ 3c3(Į8$ݳE#QUމ7#4Pȃz0 T_@OqA5#n!T+25R/!m6<."QbZ~4b2;kZ;x"q,1gC:wzD25Zje!yh hFDr!ߜE?Ě!"b"%*dW NM[Cݪ[:1Ru+s"ᇁ<?[0EkXǹ D!bC1:JѶĔ!zSv>˗h r(]MN["RϐiBG,%MdUoY~F8WJ9~o;B cfo=CaJ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 814 /Length 2700 /Filter /FlateDecode >> stream xZ[SH~IQiBSE* S;Y-[l9 ~ӒIK\9ݖL0ˌe9"1)Liäaz5@UtRGc(CzP .=SES]j<* .a{P&8PC tO} $'g-CK!z!4&OIO"Dr[zr#299eYgh7#v1WꂠqAMU||QlS_ ح.֠?kH2O+ӫI$}uoU/& r7h޳u >Gc~Ũ4^,}Vq1-ze5V9[~ʊuq4G[Nt2hu=+t_wU3&Y͘s΅u5o۫k͗W.ZPFKb7(0`^ ipe~6)nXud^Qp1G4EBް݆2Yt d4+?:ubºҴ[q.*f˲:M1.彚[g%v%l\/{0vx@Q4!N)ͤ/uH3{'?lN髽A`Q~Q 2hIFss۰!=PU} J!4#Gv߯(ƴmʷҭo6 ڦ!hE -ZhBZТ%(E-JlQb[آtpK_IAOhd٨%m.{ uJ6V[I6 Jtg:l >-6Y1}3[ǻJ'B oV}{m9AF{$]kŝ sl#29d<%(m9#)dKr,xG0ꢩ·LDmD՚vR ZRnM BOG9}',~ =w*^Rڰ=UHbtV>~\עvX(sRћ@Cd=a" WHnX\P+rǒ4WYcTKXf+$  Z-'` ?ΤWV菅r(#~ZKYi5`<UѰo𴇌bZ$Kh1og0r`$x/ o``HUHJ1bdx-8lD&d4<;+y@mOBjp ߣhiEQz `b!׎SHFN =dN$VGg'q\f˫Y?zv]K :_Aœv[3 Bҏ*RMOQ}ιLܜ4Qֽg0 FDb Oj~A|Lt*~7﭂7nnkov7aY1{MO.|W;su12Ud]W:k%jUT=@ْthh5 _w~/&2 J\ZĜrz{uJ!OIAsM?Q19(NYMEKiC@`䊝"m` endstream endobj 192 0 obj << /Length 3796 /Filter /FlateDecode >> stream x[s_Gj"o_:=Lj2J$֤zwuGɴ]vlFףfg'_͈66ήFr9:8?}+r"ja)/os6 n7xwuo3 Lt9'\Kf ӭ3/qb?o)39g= B$ `UFR껆@lF J8ZE$h= @Y2"%~/(T#\ Og:P)ޣ(Y_ JkO[Lu!Ȯ@^FLoOAA^+ۛP W` xD {,éT_:c`TH4nwl*p,4c(ƲAA+-9qLw[f%4N% pe>ɜ3TӇ6G{ڑd1" ('B Zؾ*6$Bʽlåb*7ĘDtBg?"tK JfUnh"yS1HKrZq]KeTuga"Qo6\kzTY|¯. )phK8͝PŻ`VwpLq6+ҭ9Y#ɹc&nLC^~tcvkG!4{~ t 7_uc n:ve/St̚Fu^VxA 1/ar3^ SAc^onB62k-W!ޞ`C@TxӺyV2i3 ,,\_ɄVroNNeͯoA;AMqtؓ/H8E?Ԁ.Bҹ\G6RkLF'jا3?rߡ(tw|db Ր%#&l6 +wbx1c .byO}3Q.GPD1.F?geR BUR '47q$amt`X^2@"mV4 (OɒR+N+ ۭ\>!A}TO)td#lq{m@*w!!jICRM4550Ǭͯ)|Nכʽy4`ͰϞ={7XqZMOP[j֬N 6z0ZU߹a҆xȨ\dXbBC; 1Dctܸf1 hh㗮6_֭Ȟjd@5s.%k ȵH5m("k$} H&Hnw?~ìRB~=d;Y]WЦ3?mX"c<}BlowJ+^A0-7Kb.x1IchN E[)Ss|Pq3vu,$ěs-CR#h{m,e+U245c(09a0u^6%LohA mTWkzzkky)pk'b 'j*ppv3y^1_g-W!VDmR\[\oM>Єq6bj YpDy 9`vfhBQFJ42.z\;\T=ղ& & oO!E.MW\GkXޚiF-!^䎠07yCL6BJ'^l=14i E\Ou^Cބ/[tw Ɨ+$4 /nq21_]79XKbW ڶ f1-ȦX>NxFY;-9t2_t3u(HxucdE2szv4p;͸[^]ջ€DV v@B0 QؐnOj!RɅ) 9`(#>VDHe1Yėژ(ic6{;aړjE!}g]ᛎLǔt 嚊#|S1mėژ(|S;fV|jzs݇IΉ9/=t01+ې C#d+`[ZCX'U贯 "%)bKo2HZݯy뾠M 0ddk5M5y4Ǽ2#ANNbs$n#*Ƞ҇<4ny[*xŒcGօ,c%\]IMex* =Egf`Ncs  }Z_Ǟ[c>x<7R b|]l}1TĦH5coHQ~rmoA 96&4qUzL~ܩn)CL0@ ;0_Nw8_$MT~1{Am뿪6oQ"c5%75iXtdw︂)e*RJ񈫱e;*8W(b*{fb=>i(yNx< XDJ ?Ki= K<;9=vE4JqBg= ?gYX :: c)<ޯi<]`𸩍T.y{dw1=v;߇u kmX\LV|=PjA!)is1ݞ]f]wm_E^݇.EQG=f-0;{=09s*yur/xZvl 1 d_оcBw\>q=يc~&_% }^PL<͐yP,eE;@>+R1D!ؑn`WJBa"`? O+Uk"z1^ŵx"lZ:sVֈF$5!^ufDXF;(Q  }>!4dLJmfG]QJ|_UJ_T?D(G/˰(eXF]u,T6]fW DmU6P`YjĒ ߮v6ȷgX|:.!;m?5r =!/3˳BI endstream endobj 207 0 obj << /Length 3703 /Filter /FlateDecode >> stream xYs}iĐ Hli$ -Ǭ$zD){;Ploigg-p|䳛Y>{_~טYgm1MVU.kjv2?+{?٢,huì2Y7Eن'ôv0eN7 aM`E-<3n~ o{C/,we>9-TP!̋\p`/lQfθ٢yejh Xv)PEjwW[" ަ ,ΞY{.aSW5:[zǦ $ODe}!;j?V{ l pD"b}opL3G>z~n9  my_scg2 g-pU.pMWė]b!5K$.\Vю"Z Xo{no#l}R*&ͣvqm'ȤGx:K/Eey/n=KSTl掹V_:0ϯ7nԿMq﫴90sW0f0EjX٢%w~:BYgM;F$0l;7*bc~͆jf$h7{{1cVڢ}&ݣ*ӺfA@f27m: H5ìRP4"u3'3_ FʲNw3US+A2w p3tP3N|{|W?&6kkU6k|f zi2#/JS/bSd&Սm4uLRɊ:B(낃\SO$Ҳ^)*aO xsq@$_*߳%N'=V<* MI4Z48[m *aC$WS(G5pz=6gfj{%lFYŠYpRW]}iq=`"NeCb*ֵ8uָ)Ck\opQkRNUgɳddaӶGeI^> ʅǮ›g!8?ӈIqC %kE S;hݯ8.Zj4NY>4"$awbuk{͓:B. >~dE}NA/;9nDĤkmٽL*o5ΗIq=gG$8Ph&u Si*&LRN%qݳS4aaʬK)WU0-G8AlL N`dP :6%#^pps ?,kC>]7:P'rUSK#C?H*'& 5 fƙ0Rr$_[M~T#Ŕ_0u^^|,V̿QV+^)ԖDɛPQj0yyTs0GSkL7@֘?{ҁJ^u%u)O>T9P My% ߉}phw[@b__ endstream endobj 220 0 obj << /Length 4397 /Filter /FlateDecode >> stream xڽr}rՊ!^3#ݤR+$DڱDEw5Tl@4Bw^W߿z{wߙJEWvUWMn6W\ku Z]h|wݧ1z,zh8:Y#W[tK4U57@`| ;n(- w=~ q0*q@-@P/6o3 zpW4FLs4GlXh5ՙ7DKevL륮xfR"]\cXH =2 .˨o܂l-ֈiɆC@o_;bZ őv3=;@9zp{Yg "HT] ቻAָ{dfuY47&aHX=Qni.*UrST*(,^O?ork00Kj֒09c]3?!LDPر =߀(rnG"ǘjGb1G%SE[AU8nڅrxf:~\򱙪Ҧ DR$]PU(,#gR0 NTuO4 _WnkV[~5͸>JvĕX|"L5\T^d @,GO?#mh_!dwNx%r0 9{It17S*{NL{U^bImY%ھ#V%|);D'lͽĈ)oz)/-Y 0\%φ(- X|"9S0S?l{=x /# Ƞ+[Τ|ోdHB&|E65㉛xNARt >3 YV*V\r㴬ȍ-~86{p'9\8l XB?"3F:4f^ð /U6x.0"8dIF[X**97MS"ط q]f0g*<'Y\Hz7DJ+Beߊ qFZ0+XnmlOY]#Í*sTSLWp)iJQ*jnܬGP0ʠB׶)*T(BLjy?g f U4Y٢2hV ?F;LO=V+U3/pH'C)VU߭vͲ@U%t/>(M}3+c*:hss3ڶ)8`cofN5G_B$C==:H14u-[S(`6E$mfW 4lӁ _yU{HQ]Oob@wٹ*r )Dž)=%CRAA|=GDϘ=& nPP]O\q_KpMpɽ{9F(暳En j آ!ay2$jyRT'7=u{\jM-gqk4ƒC6q.1zyᰈlvˋ#d8k7zgH~zNYf0RJ$ը ^g.Dr97sMy? /XY̌m SEV6 4xp^dG:4CwN%P2y'<}8)~}pf9EALuى_Fs:٪"9J@X ܮn]ϻ)%AZY7 '|Z/)]ǹ=(Y7DO+e[M`?Vvyd gp1dFqIh"58aV%8]GFr#tKH׬rkQ8;N._椞Ti&fe<j8o5[BIvqE=q -߈(59Qm==1(.Ի)]jj,|nx8GnN)U=zt=M&=m#JJKrKGͰP3On٤rK9%'VOVJ'ILg!nISƴ,r(Ȍ>Ź8e:S6B6|Wx {6Iw(cЗcRb6%W$OK(0KRV+qCKE;LҿI f}M!/-RnuYw4b Qeimcg*('1*od2M,.q;\c`jt\`y7 <"nBEC5fl|Hu828/ OYoﳬ&R) [wa ٪"8Z;͒Ό/UF |r$gjˀơOJBo$#XL[Y'ncshiՆBzerd:11ڔ3e"v{&wE.*aNXˏ?Sȡ ">#M:*.Lv&>QRk~=;@iI:BaL\Ik֍?PO {p'N.2DQ"!\>NW'nvCVWsyГIy .Lj~Íwuxêu(M^6G;8wAaoDKHh 66xSipNRQGw?kʳr<ݨYЏr|wBU9AESR܏B!BRku EEy|q)\_>v5v8TzFE1Bb11}ǘ3O4&ޒ"4w7a#o mm} +wtÝTwol4;;|` VkmBsQ+!:);?b2_\_CU-L)/k\ ~YkkWgo{dn|3tBkr0.u-.3 B̔\x_/[5ai dsȰT:T#y<r_!XVr-I ǣW~p{1X#2ρ`2[v? 7O/)ZuI_Qn9s}.A)teT pEYج|e0Vr1, hd⠐DGѢ\Wᾳw*+*{T&\K\7' /ZWI(ݍ| A$dkb[h} Tw?rNoޱxנ ŏMyWq|QF4o%T|:D_+g稣 K7@}dO/q.2멳ni+~*+w{K>xcv7!5.ثM`9CX%ùb\GϧI+3 Z\ZIN[Ùn;\#q'_`;/G%輠>̤-lvj7?9XMψtĬ C =qŏ HsLY^Vp?s }Kjը|ZK}'JZ9y5(Þ$M!-]&C1(x9W^W*MȬlЧrt#H~{mDd endstream endobj 236 0 obj << /Length 3042 /Filter /FlateDecode >> stream xڭZBȧ=ڐ>ܺ@F +Z n=i%R."G:0dQp8r&_}{wh֪֓Ę* =)m֙'?'߶7:9~ 57,˒knw7U'.0|f7LVLŞ߼@\%ZDWJ8湞L3VE|ZXBIur퍩c?}αJıyvD ^h"uGZtd;7Mc5|ckaufZ tܚ9[Rt>ځLed5^4獛R>'O <3m49,#Ȓuxdc"_nv6"@̧L7"[X q"8\& Z+s&$mRmei'О"UnI?N>4FDRBV؈-paOw|MYF6/vL'(RZNM (Ґ][ <&wَؠpH4,~Dw㸑vy`aCCAYNe22n'@R;9 p'i !`Y!(r(U& JQ] .(fhV4c4kZ9GpxkݫNRo i :&>"l1daf*C#`lpPl{.W GNCw@-*C7XakfgI,W1_ÙvkE0 K{4ss$+@ 0D( i(>CXY4ӭ_+2HNyGmr׬r㎰.ڮ!Uʑ8␴د_G֖,TD2;RW<™pMޖu{f 9WVG/сU0#JblfPp_;ag-6?Ȝ >t'FkR]cnL5"o5贼VU %YYs$89EU^Uh/ =PE*z2ԣш LsSei!Pd>щd1r $"`Qiü-yKOO5z_>s FtvW q`DmdY%P{g6(>pF]ĞS>H&YtX%0bp3PQ* vĥb A\2Ex0ٻ+w?s>brn (7؃ŕ&5fS/"]|}vAY]۸vǣk G_Bf]Jxsk˝Z)n>:BXDP=bx[ B155rgoAPï kcڅ*`NA^7s쯖;~ 0l=mކ[rX,Yͨ]Via=Q& l9-/r92\1/bxr >)^ւSW(pa͛1 ;tMm!T|a 9|$dm(kz{tQFWg,K(jt X.r8f6(C{#&\r:b\'˅E6XTPE&kM\U'g#vzXixduei1HZf+h]KJ]*  >Uhɤ _y~5 w"]}a HF}vѳT4EkI1s) R{qrGK"/ufwaIOK̓+*X;-1|YPi6EШL&z,L9Lf[b[86*q4&: umDBN^}Heo-Y?FXw b'h݅ugSoJ )Z!nyj5x]dyuT!.58>Vq("G  {1WdF:__t +)m20v$B;p1/tCG+ 4~'1?΅ {ʒ?Rxc?(~OW__=)HHIc_]<=;t/w1< x NXO?-09f2gj 揽l=(^G2c v׊ٝL4-32qꌵ*5[~'{iF/ ^ADso>େuY-J >ϥ^TAےQ§쭢Y,G. endstream endobj 251 0 obj << /Length 2670 /Filter /FlateDecode >> stream xڭZݏ߿ȓ yHJr) mEZ[uβ6}IQvA[*bG-lf6.]4OjX)rxǕ]׼??Z;/ܲ~9DHBŶUJLiJZkwwO+خ356 _mLfxgpK{' Wv/R옂/~@T>xȣ1kpzq_٣eADȹד(F[5=)xR{vZ6ڌQJ~1l4=xK֤c*:Eʾ= #DKežsxռ9zHdzvbpQ/,FSM* 4u᳸oGg\o ]J_yp/|u2rĭ^; (// a3uTgQ<Ș>wTP= s*(=7@)ɿIbvF)Ee¨ZptIy%#eWy?9-5Tyt #Wņ1K|QT̊m8ykʪ`=KPp+sRI5uRo/bC#qV4+$U\Bݙ=(REyyMQTVC&Dd7IyaMJnI`XbFU0[9\[ !57YSbC ]E<!;~ -sAaۻ9m Ze} [x #kgT |JaMZ6 S( >(ٓ,ya܆gyWFP3FvL Z)xT2$W~uӬ_Mr7P^ <U<wNȞT^. ncCk>+zhK]܌7 UIh7y7f[H2" ϳ!>D|@L2,i.u(#xN%RB9a>$4jWJd04FBPEEΪYGnszQNL4^^K5&,B'Z0aݟ nms}h& [D^U1Zr2p'ܾ3::%S|,#3Y7{Ac;n9nsعF7w38A/q/h`ŎȬWz&T!MMQL I օ&KxL~ժ P'(FZGYE_$`ݩ;/w>R'0F9!:^\kx$Y6sq+ʜu-.Pn$iQ54,M<_ʈt,"K.ɹ<_+ħaA^}H>PV\SQ I~Нԅ`Mqs\ܺʍqÎ?>_6_`Oɗ3a[:2vqhzJzI z9%hx6ߙ"6 G/iu.f| v3m-U3 7f  endstream endobj 233 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-002.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 253 0 R /BBox [0 0 648 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 254 0 R>> /ExtGState << >>/ColorSpace << /sRGB 255 0 R >>>> /Length 16264 /Filter /FlateDecode >> stream x}K/r|5+m=MH@ J PFDgE o&$׿\vu]>|ϣ}gklw(ooq??_Go~(~|||WƼQ&(e@g g&sB,-L<{gMն钋?n գ|>ň㭵yo|>wRϾV ]~މWfiaLz}nB,ͶM\rYY!7^}S;{'Pw1*ŋ=ĺնKYn o߶>)Mې{Mz-eB(m9}ĺնKYn>K zƛʘ{!rٯE?+􈚘y{DuTm%xzcq=/sl/:x0[B{c $z){ku0?Cn@j[tEMn=]5iѵ]]X}Dڻ/xnD皼cHubo[j\;<ϋM]>~U zB,-L,u ! ݶ蒋cmL1ov~xl&!v'_FyndzoMn-"&_XL,ƠιA/-A'8>|YP7J3wP݄X76]r72j$R=^X17>bL@c/fON95ty3T;qm-y7׺?P 5}`JHx=4f/poWj40/g,95?62/O2CGkѰ7mYW161ku0gu䭶E\ֳ,+c*E|<CA7ň1 OKm)y|u$9dF:;kuQxaOdQmFȓ> HI1Y,:|f+[EQkuem.ě=sJEʘ uP m;Ɲy~>1yUM-ocL0ZK5'1s荦x թsbnOU7!ͶM\rY$>d)N L\49r܆$X'`4i/N L6Mm.ě1ƿ`т>j̐c@%1s@( ċAE19_5!E$Ĕ~JYj}\kM,<'̹Xk!t߃=3T_N541 OCq?W݄`i"$97V.%WƜdl; Z<slKȱ<%,7et1b&K΅wwѝq㮓::# Z GnɩqhORP Lnk̋?-<t1YfMcL(G[%^Ak;yV݄Xm.ě5fZcFwkSD4ĩpLu}>Zc.+m4Uwvnv ŻɭgGg>NLbNʘ ?AO-=yCڢfibwUW݄;aۢsMtN5%D0f 4E$t Ox:!Ed`2k&dKk֖[thȵ-_s(u#);~;ysa1/Y9W-o{"xn_O w0|׎a7S1cߍ`6km6&|YV_|-h ùh9C|1# F b[A$y0\}zy8/3D /bvrhP4H",uK^Ž}=!1]w3yX]%u bi=TYn%tv!bwخX{Lݡo!W-(y|^ t|eXBE$nG4]8G`h n9g3/1m.ě;:\aV04+!!I^݀a|i[ H=LI"2Q^Aab 9`cB\{HL%ĺYZxt |Mr{BmLG2榦s9EzQ~j t^WPS$0$֋P7 VۢK.f,R~yf_jxQE? 4OϹxnARxVV݄hGm%)y7 Š0᰹+NzP'D=PpQW붏xPZurMP;ÿ81-fPDu!D=zit]BvrD  :51%f{7um%x]"#\+LR=CY ZZ#>ȵgĺJFU7!:&nIɻg/j\_ n1Xmwӡ]GQONdDŽ$;U~>Ee O&jE܎- "4G2DAۂSS`Iu܋.5ޞflڹ61"$7Au9B},+ḾX3yCnAD=[.nr;`&ʘa芾op$s; 1aU7!fۦK.f"":U:̯aXr*;nbB^b̊>搶x ݞ'نm!El[t%,YHxP@]`>;L{; To [EI I9J&ʘZD>tĕ 1x!LmzG_5 f`E=M<e,'Hxiv F8Bk7&&zaGQ >gFwV}%x|38wKELE6$12.b Q0&UbSBPP% +\_\OaPCPLe{rs3r=jޙXϕ멶OG>kr;<7h2r@\SAdCcљNnKwia*xnP݀{[.nr[1m g0o(ԡ GF,N<7_H6/!u9y`>C/\qR%˒P#cd'^ubm.NwbO Q 0hs3)O5< mI54j=ypm%x^ȯJ$<a_ IW)A|xdž+aO3=u׾ٶTYnרuμҋpR/CK#5S16m"&@btiG.Azz$@r[G&|tx])WiLYЙ/6$Ugˆ%[{ۀԆ 5|P& J[;Z1&|ɾ{M̍T?$a}w/:vL^A[v"Z9Fm-y73>^Bc:ZEG,Wp6'9Ţ=0cz 6開~^>17fVΣzMň';[9^TgۢKӝHu; гf!!,_'uB]/@ b,- Gx)T7!NUl[tKJMC(/5}01 Ofy%x3'bړ0(o9/MrvٳU#Ƽ'VIl*\s[m;\ZCtx&:5ocl7vo 46]r7mi̷F"LC{tX`QūFr5T-Ĕ7nBHm%xܶ93إa F5h)!~ P oۙU 46]r7m.բpY$-t6D7+CHGX,T⭜T7!ͶMxy8g(UB/H>Dwcզ#y yx:ym-|o{Z#ڶ,k䥂z"ֹ5khZ#Ϥxi\htI*,mt~LO73itH9ǘh(N5Ԗ' vLފs]gz]r7yw5 X bf;0fP3Wazs.yR?/99Y|'ݒwn ƵùSվ`b?jIZBhze,CQ15y#}Mٶ 7mQCWnjzb:/q؆Bs }fqN0xȡubi-o{%4f1ki]R87tpy3u׹m.ěRX[ftߓ10 N1W篲<9\'_UV݄MrY*RA"]V wY΃(+O1;f^FI\b^DDdEX>Wv]o:+(ubiM"&Md1S-@+6'q.-́%{!gu_3m3.Jy?ۘJpPe~]ƾ2cW#2j-X7!ltIJMn [kW1ט/"͔ήK&+'w f*1'B':S9ܶKY6.)11}*~?Rػ!GB[Ysؗ^`b͉{ˏ)Oz}x Xx^Xlu5G CÿSXxD1o\=ùE=G{ԁTr=E,qۣojsy v&i@w㷟p.o@xtjCM<7\~N̂C# &|kLosy|RaŢ(%ؿH4tigi,x+@++:͓-qUp<׺ 9rzs7uup.Oų0C gEqruMVSO:M_䊹`yXT%9iztnΨ5לp.>)I(22X*|ޟV2TjDF5t8q $CޕVzӤ %ر&{PwJtfS0.8GWѻbϠ28FhYVتc pUP 6FB;_.H|ܙp.ϮD|>$6^p.5. {kp72؃=} &:{\tD%DN?ǟ:?~?? C} }~o~ߣ-k⭿+m_Bt0نһx_#x|Ya.+}#6B 1.Do0&`?P'9&:ŝ%}~3u{[^zoOn7pMĿ#}}N?{984*O}ta̟'vt?{ ceM"& IE6Ni<мx1}^;-%%&K<31oޯHCE.ޙ.uܚ"j>tQ"6Bݮu&ʻMQ) d ]ača]'O=&hL: O^A{@#u*tۦS.f,<1?1B'9gS.c:O#y+YUwzm:2o[pG~c,7i׳ܧOJI>)wFW,jRpδ}%85PuZonS<>yȊ##6ܖs[z,uM}m/4:t9yb ߭y].n[t%MnKu ib"@'_޸G|ɹ\">Z/jTHc$Zݏ}u?J^Vo@muaKZ[ɫ{+WV^{[\ݏW|[[ҫ_^wRz3)+_j]Bm i̗d -O@RpHB.P'`O dY|iyݚORNI.b̍j+N;yl&A.^C}.61wtvܶ^ EBEwnC\+/}IZEuEmN̛ryfz.YO|x*+(-HO$ۛߥUFۦKRf'F''艰Ė&خMO=ƦೞH DHO$5A՚D)=HOLzpc:c_kxX5iz)i 7>uuOMi pGr)`04$VcG ;L ^]7!O1f]n Z 21MZ} Y*ILٝWzc,ճ,u o[Cdq1le ~s8Ͳ:R:/1[4um)x7F)N&)  xZ ,4dWrwE4L &/.u0]r7˭gсI5z̑Nݓ8|~Z:0[+Vu'WmȻi~rdQέΦ{x>&xՇTwcjte,%Ҵw{3ld>Y'ٻZ"dUYԶgw7ުb~r^KME6 %[|\UZզF|Iֵ3kHRv+6\~H1߰6l aRuKvۦKRf)pPDb3_6ӧhH5!%>SqX|٬5} )*ѧH.M>L4poD ~DmtO/ mMPm^8d繌w˻E,L#vkCW:pֹ,BFymDldm%x"śHtVj6^\uq?YJL5κJm.ě*S.m;d5ꘊ;'뜵&۝m i̗dxw. c^ܝ'f碠l#\l@՝mDl0 =SWzCCˎ#)n膦FXRe)ئ|IV}^pQz^|+9x-7vN:K(pc8W N 6]7m?SY#a9̒FPˤ#$3ynL{p-o#kn~9ȱ s4Da7?!qLImOc t^ AX~!t!!lպt)*"dU:BchNflԑYXwnPP2 i'^}{n[tEMnr2a)"aZLÏ40~2uL-oCm!ƒ8c7P0ʝ!B(aɻ@!¶Mr{AGn_"B?r.^; זʻ'` !AZQReYrm0坭&K9!BJF B&m i̗dhQAFNi iT SqQ!z{5 )*_j.?>b uoƃd>ҸtnX2C¼7\GܶKYnM˳d+'[md[xxlݙm LYwlu4閔v΋1\ȮE29?v_KE.d""E\rmj)uޜ;RYy6輵ͼV1L3/S\J1sۢK.fO0t9a(O\ԧEgg):Prov]۞Řֹ~s%x^J})ZO蔢YVxy秋WcHY)՝-M"& WV'J)*MSA<kS+^(϶E\vLڗ#4D}!mI(fιK'bȇEõ%mz%e՟J\<˜*naLOx%x:^KړW֥uMQ)9Do=^utGL 0n UκmO$o[6c5jz7G#G L#GīnSRۦapMK.hWv d҆ Zڰ1hKmu/mm.ě^6o?xQ.9;awFVz;}6遮ěv\ײ㾬+ۈ~c`>F$Bdd#M"$ 6Y)^P:/Axl&g*N_1_ӭ=31i56iƘdg2^6#Kw /@e<Լz +oNm$o |HCT+' _fv y e0YkYwzmRʾr\o!*a$O9=ΧCTe;.+( {,={,N_={ɽe'f!pw랶l[3r;a]h aSs6O29[P&Yu5λtٶwR.vr{4 étqMڶk*8/КTj^N{Mn[tEMqlM-RY8(2ǪΎU#@UCU|ZD9m iӘd*r eCd4 QZȞpC)xdyixem%xɓb銋!yls9bǕx-W1t8׽\un[t%,9D(aTRJKy7#rP.]k!`R%YpӺKOny᷽?u̽|I?~']l̓&#np.g5]_^䀣N"qɱ+ù|z1Ru +q1U`Xkq7ù<": mb-C8WSp-?yg8x-\|pMx+˹ܣ{cWzPOx+ ٣A:Ep.>=Oe}r 2<*2#4(8ǛTYd#T o!C-S7؎GVco29߽p.h  '،]<8j=н7>3tMA50Ik\.Ls5AOsy |8$ǃw.8 qrjK2k·\Opߗ{S)޽hQl¹<"V}.iZqwa?^U }8Qݿa¹ӃQ=/Xp.^ >9n<\pfj\DC^IȐNOSkܻ\Oq߀hY}Jp.U˜ -]=2u?Y$(`N0K{j72ysV~׾nۺ]ոk@%LoƸV᭼ ձN]y*5\pH\hbUm\g.Ή8sk$39bkq+ބ+,Oa4\߂+qŝc>Lp.&[7rW" -^F<.^u8VIMoR{W>w۾s0З^u5sy{oZٽ7kJ {oK՗ enܼnʐ7_\ev|$_\1L7᭻?<9X~50\u8̃zF;}<稺kqZ]={ֆyers> 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 265 0 obj << /Length 2273 /Filter /FlateDecode >> stream xڭێ}0@rx k'[$E*D^@~=J)`Aq8s̹_f`W7/n.l`⨌KQ wyT&.o„gyvG$I¯`.~glEM̪&HE~GFͤIAYo;xdҘ(YDCn9QFc=!:RRްj к!\NYk%(lgMO*i-фå/Ey,_Uj/|B=`llդ7(!}fjE j p} K{ ̒Q~U)hip%RQy'#sK4Ǫ(tʠ|8 O-}U3.iR`k>4Qaqst{o.:W!xK_N_X2(UhJeǮ O(Eu@QF˒2_֫*ҍ~UYQofA}Ji{u.*L*{ '-09G^hiپ8+98Q頵,PQ[;*9zG4F9}l| 's L#uLQ(mqꜬfes;zD)*pOcBrdT*jSL^ ( 8 hI 1\]fT3md#m?%:I +"]<>Lnp(W A|8i%ϕc|=Hr] c؆. H5t+5߻BU[$C2zRW}]M,WZ!$SՒ&J¶ݪI k0pBWwm, ca ̨osVQ% &vYT@`_ri qE Ïfǩygpq({#8K_ `|zUH%/AJHM? &~%uOtHoSD {~"8 ګ8l*E칕kE8+^rSS“ƐTV`q-u"x6${e@;(^-T(eӬP{\89$*sGBϟE4,\+hXt{ń!&*% sc 1T endstream endobj 248 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-004.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 267 0 R /BBox [0 0 648 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 268 0 R/F3 269 0 R>> /ExtGState << >>/ColorSpace << /sRGB 270 0 R >>>> /Length 1008 /Filter /FlateDecode >> stream xW9oMWTh4]wB` ,"0˚]K}ϱ=~"ر߼WW]p{x'RB5<fPLGpt"Xozcyp_.;I8~^?φ:m I`VXF9|_Uqcӷ3| gp\Ǜȡp6PZOX !Y75©NQpUP 7NQpU(iUQqUd;ҦA4E|3xO*` QP3xO ;6>?ƣ){㓼p|?cX_F_~T hmi BX/6&Brc1%*tb 6>GR3GO9 aP<ᘷiwy9DkZ`͋u~bo. 8 9Npux.m^H,ypX>)~ՏOXDkuiaL0F\##g>vqjE(',3mI~JYӧY6MϚ1o$zg7K3ǽo bZWxn<p2c93I݈ru\D`g1l8KS&ąhW0()8nl"uT\O)ʤ+ryUQ* ʊ֩(5ZbNT5']Z걵Hu? a'|| 6>{f3䗕Ok^h7K:v*zȂ2P6P:>݅(ʍ(ڕ(ʝ(ڥim,yg߰{M@o>Rk\3SR1ͱk깆à3iV4:Ʃ8ʴiq4w6?t97aW`  endstream endobj 272 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 278 0 obj << /Length 1861 /Filter /FlateDecode >> stream xYY6~)JA[GlmbѮ&A|g8CJI1XhEf8i-2=|7ddd<+Uqx=˕1Rgҋ@$Lz4T <+3@@t[s#Ñ'ت+Xîhc1튭t!^hֳjJjXTˡsuAtH0Ѓd赁)CPl#>:,:5&n}Da} ~o K/ *e0> ]  M~pr{W*}\⺠+-5m?Ue¦U]!BVlן 0*AǙ(&)X`v)G{~g^{~CLp,y#QN^tŎ6SnX㈍BpضH] G69<-]^&ES$J~Lx ]@x[Q,?p)i}$SUĮUIX|TH(|" o}^U2PۊW7V';>觌)c|g+TPj:^regM9u1wIE錺۱tv|CxrR$1:61 s'7. RpJq(˜hq+脓xX"(tZB*C8r-pfEkqbksRx2>_qb*v@]oTBL< Yl>y<ȞSJWG:0k `%Bt잓 oLp7B _@Q8| vRT[g2m_bC_ԏ&-:aC%*E6N&}gnywEopcNg OwwOx6oEQ.]VJ6=Q "@p8zMpW$/FQ篇#t!K6,Б O1*LD~~_uˆzP&VVy޺4qA;RN5ң:Pox+TÑdKZ'b 9&-UDݮc5 ݢhvj"([t )F"Q=(,cօdrcH.N"'J83RM$e&XSx᫤y:FE[ [:'!WMb<+[v1XbK!aK np3&XjAMDw!> /ExtGState << >>/ColorSpace << /sRGB 285 0 R >>>> /Length 1466 /Filter /FlateDecode >> stream xYMo7 ϯFaEԷ6"Z]=uFuM/%Gg8>,$% IGjA |N/wx*%R>\ ~hs+ ?mѿvrc f;bI$ҩ9+Cc2+ _#6{hK ܣuBCHP"XA|l3tGgmqH }Q\&y&hOf:*~x\8ԺkXvd-si.FM;-$(A1ЖOYl^AWݯVZF[4hdl~6CjRnzRX$LGa32هEqv>|$xOszS:'/ChCq^ruͧWǏw WO”w7FLE2lhH||j\G }FbX>bVbTv.Tc+*G_ ' <,>CZz22q?F<~5!F39uIjn ˪TSc](I({#(^|ѫZ[WG_~ӯӻ2ۀ6 ̣0V,]`j0i:.] Sہ wh\WyiT,F<ҕFٮff;JٺXf,&ʅ9 9 .rN"o9|[vSbAMOsJ‚f?>C_1SPu9h%bvPОPK9#idM vf:YW96̽u3D$ϸuQ)d9f޺YWXr*ƸPhlѓr@kEm@mQƝFLCF7 !LqRQMc-nՀ8G`2 6@xzNnO&8n .o| -S^ { endstream endobj 287 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 296 0 obj << /Length 2166 /Filter /FlateDecode >> stream xˎF $!&nA`IHi"QLJ쯧^nRԬaCfOwBo'O>kOA[= J%YPDg\:m_9(q;/AqH}E3"1MdP ~f Ɲ̱ RJA)z$Ӕ!QE>OjE\)w˦F  ~ -i`װl bw?2#[?h d[ZJ;;fMىd18  ČAt%FA4+ǚ rz$.hDG3ş-/ ~OT0~b{hV&"^}$5|hJ֌+J Cڮ0(e@AdTe'׳U۠oYYlF*VMYWIiehuVxK+_dNK]} QQ u7B3 %k2%-v ,}^+?|Ce,tZfb˕  ar/2W|O섾@+{,qeL"$o;~@y4ۋ 5Ym. xT$uylO%p!Zkkbv^~nK2w{[CdF8aQX>bHyu)$dKʆ6ӡNE>3qF{)CDH?ۑGKbkt^_V  =tnL΄k$01f*sе;z6'q1 d!Õ}&A+TLʙOH˕0RACA;5^f%-J5S"n4M<$wNsg݃vNkm/8ςܹ(LVk[:Sߓq!fAm k\93B0tvLJr\:frwD?3UgS.}|7~W$鯍e6oO~_Q endstream endobj 309 0 obj << /Length 2545 /Filter /FlateDecode >> stream xk۸{~Ov[+"\AIQ{E~nlya{/ΓdWB+=Ch=JG{֥#&uZjTQIbq[TeR% !ۉY>¿wl'SʍqKuӬN2#|\ɠy'gan"ͭ7b;^KޓȈ2ANӮغ hD/R`U y^'KA0'E.d&+w@smLNuM : rSW;V!Q~/=<9!zMcmK`VQd=sy9ydžۀ^Sz*\97 ʍ fV4M '\YQ+Y wd@lj3 >B5pA[O,樄,M\,rDyرE"A-+Eo ) W9H Ǻ%JMF~E^dE6.wأ xGE1/H,X.Kd|h" >PpE9bބu{lba$5P[q5T'&Ii@@_+| 91I 2Cj?q,1"9K6kP@&!AW$y?9V2{9yX?Y YdGn6 dy5Ah#!3LH8pG$ڢSLXunRD:2Ș2#|G3 j@"Cӊ?Cesq?.L;u(WT4M;@öeVN\EqyO减+ِV9ǭXFC I[Uoh0mẁ &hj'+ٜ˼ApDA"YG4'U/Yf6&PT!1 8ˀdzW'uᕕf # {JA 3|?Y>w5N ݃EV#hzVY,;8~/$:SR#Ia1?}Nj 4A9դygaa '.6fuNl6Sn^ w(K"GL NCm7A+W6^? !~|]-p+-:sb렦(cjo"A߉@VBY *yeyOlσ5$F~ 15WnО_i;yZDT4mC7w0Bv忹gӳG5R1Ý5 APK8⮸dUbJd_SI1cm[bq>\T'7(S} %x*M]p1)}ҢtQ~p ktSAE9L>L\>̛] = E7٦8€7'!:8qp2\͙;'<ϴO:@keЁrB'*^$cۀqp&[:*rIg>4߫nxMEk[r9X@>`[/=#DFny@}0ڱ ^鱘M,wޠ橻?]\nו6b!ȮUD&w>Ғ$sVdۺh&ͅV.uW\\)[k8GUn3e[o:FdjoLW*/5 > stream x[n9}Wqcd$Mv$fC[j;%OK S-ZVێѶz`dTI(C& VE:a=!{+A*\%931 m7Ao9@xQ:?;fEIӣѯZͨ$=Ú$Y:_gK(^=|c7Fؼi !7#f+ߴv~y` rA^ 7ZoRKQ|-f_TxQVb#f 3*>TW֥U|1&KN&D!#|l#W>a{u {eeejk~G[Fŋy3:*^o}@G<1!)/Ud%3oQvR?\@'~JߖZ<}լ۪^I ٽ[|rYgRPF; pB%sM^:o:X,fmY7zi0H6 A2!%݋: J=Af]ۦl̀trX ) ǭBm\6ZpjKR,ץ%⬃Cޑ u7;t裛uu<.\@#G#G,xFHqAr~5V^ͿUdt4`\+6"I~p qg( ӲM.'|QWͬ{p~̀7خpFJ?Dy%Ke3{rZ& (yieǤ>wGvC~]"ه2!LnLK?-iK0h'Ԗ@t Akf68g4>lC$0g["pp0Pk'7"?&N0ꇄ W[*}QèQaԔ1SeecMwMw z$g^( "V&8[Ai <3kB9҂D/ё&s Ea7dQAwsYɆP&^Vb P+F8-E(/yðeە>ݖ Y-6;.ĻR{q}ZՐaz4Tyz$c=^U:xƛ-wd0z,ɤm Cn6Hn6Lv67UyP.+l61Od>Or7īRb|cW RIz5GOY޲~G?s~G0rQP_e=.Gg;,tyX9 aCa]q^V |jDvlb28mʯUQW˪xu~2z:rgqS1& IuR4v1OlVr,YuVKoqQ t5;΀+/`*ހ< G߁ l0t+DnX?*̡ТvQ"Z4!!dE{;bpmW>"N)IPB:Lӥ5- ajY87|Dݠ ov sO>zX=4v~igZM,ɋuj 2l".N] gk#假=yˋmW|F~qbC׮Baw:mC!O蟲oSvϧ׽O+u|fWG#ӆ3E ui&ծq ,]ɢUش*l>G<ښtPʇ tEֱ󢊉mM==ؒҐo@{.nP1c HpmPE0Tfw0HdBn[q5w˴=η^He5tRQ|n%#{׳׽^근|ƒ<޽cNtEuh.c=/|U&{KK?h)d:ki/_ϾTu3{k1q:i9,?18mËO3XpFKmw?_m endstream endobj 319 0 obj << /Length 1848 /Filter /FlateDecode >> stream xڵXo6_!I*Em-E ? hAX$g,Ow_(Ynn!"ǻy/W7TQ彧uƙ48+,g_8_Csm0 /¤IS?t2#L^t,O\`E-x izMdNTTTD(i?./4`W(/U:LuşaVDiNN鸺m/3C ~dձ@idEMGԹAU3?yaq &Imlqt7{{՘{wBBÂ=$[.v`[9Dz'$cCzHH͡5Q~{/.u'վ:8|jQ#e VQ9O9d#3Sba([)L e|->и>N58< Y.lQ3V}{aVuܸ`k˾w<%itP&{yx>7 (G&Gt ("W=ZI!< m1jvx4d9AdJ47nw?U3Z&~I bZ8d( H9*ؒ*!̈́'ҜXl7g,@3Tmw(F]=a{(95s4L3{vg&a*QZǜQ*΀N]cZwgš念EYjÂ!Q'ccyWS*Q:  QE0'SG.7DB>IʝPN0LntCed0كg02k̉wGSPtH|h늻6p(cT A̐Je%*g]dS`N0G!rE-֙#m8DGZlL}@zgy#A ٓ;2\}~p~'nj[Ǐ8oj'ۀ' Μd͙JM(rx!;ͥy0 /n,1">&8~7ouCk!m/ꀚݐ7Vaܜ\[+$psZSV5֕[UJS夹G<[Y^8OmG endstream endobj 316 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-014.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 322 0 R /BBox [0 0 648 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 323 0 R>> /ExtGState << >>/ColorSpace << /sRGB 324 0 R >>>> /Length 4919 /Filter /FlateDecode >> stream x\KFr_-Eh`  b0 C 0$;}1wXbWuuU<~}ӿߏ~ǧy~|\=J@?[%^|>O[HCi+ZFA?tOϏ?ۘcӼ=>QujyLJ|9Չ~7j]SyL~}*">h{jy2 җiN ziYOmB?{.S I&w~623N77^=u3?ܥ@J@mZgQ:Ocs*PPiAUT}q*Sը@N-3=dA'SZנNLt=maaD :n04P/iK&B(`o3 NtzG~Nk zS7tVNLtDWop ѮYѳqU$88kƚ9UέrgʹV{pz N딓<8:6[⼬RT&6ZgYc^MGg`*=k^ir‡g|kB&|$Yȶ" x4xlcǾODqSz7oJZE7l[ /6Dҭ֣d8T I"yzEW du%Ye5#e@[Fց7Z ?Nqf<%AXJS'˧/$6NXv~HҧeBShoOS,{5!'[ӱCc1)*10YI-NvSV© Fz+C { >X%z?pa8/)s N|銞.8rkntӰ!_pw N]ERlzpj]0Zj-;on}766 YcFaQGJ$ ]0sVĞ3-(GiF\r4}9Di${DJUε[$(GiF(x6;G-rxi-V4C.fQ}}A {HB^?I)Q5 3^Ew&kx܄(GiFr4.tA線:}MM`q_ޛn;h{9.;˽{m|i*w˭{ߛ$-]Azxƒ^}PXzd_IɹA;=z}Pʾ<'oDzf c]}Sx9Fs>h++/s9Gsnޗ"i~{AwA7tAWtqAzGWK"kWkvE{=CE+դWV鲓{8]r ۅ8WڣV9eo<ʠpwrM(&Wya唽ry%})J7 7ao|& d {EǠHwxoZ6^y`[c7ˍCEu|tL/EL.۠ErN_$@ҷ^9꼍޷ cjW`Eփ_7bK&"&Iˁ *V*,fHֱroeam1}[/xq~=ܪ١"=ry6 Yj0, oV^ͭ(yW7+٪*BkqU}w%ؠC.#=.n#{E#n}#0Gоl\[efG0Z5{.RY+=t,#P%oJYo@wKwe`tr=,5fCUV({/=,-~[PF\rX`4 w=?|Bihy_f?~Nron~A3E?Ed Oor :<}؅-}jXri* X@\654Εj 6&* _G^x(K(z1wOFz; w?DKc!^~I0oւ$#Q# #""A"!ׅDŽ ASA@U?_z[/m^E^C^C^CPCUCUo@QCUCUCUCUCUCUo@QCUAססס7`poӱfۮvom u [B VV;n0a|`|`|`|`CUɄ endstream endobj 326 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 333 0 obj << /Length 2119 /Filter /FlateDecode >> stream xڭYmo6_a Zk^-AQ`[ؾ@7@~7ENm(ppNfY2ի$:ͪtVe\|vln*KUu JHfF;xl?Zy*#EG ^%bȫ4f(xA\hs1󑛿₋GB{x$F{3~I^-rMIFnnqY;S.u)K #|~כTyV3/TR礮uo ZD~-wb?GPt#= 0P܄WMuKKWxaJvRDԙ0)YWǓ/6. ?ؕu2߲~YįeB_EDXo'VɛὨ:<Z2I.b4̳vGlЪ2iX$UvxȠ[ -N᭳kJOa,?*usM7!m"ccit\U[ E^< hUP(9guBb&.KdJ;{!Q8;=W3bTtrKTy`z|jT{ 'Ӯ>t&xd{4-Iw'i.}QGTfᖅiqLj.E!eN [ZG ]٩-:aϭ>,9u8!Wׅ8 _4_o_Q<ʭ04܈fo7O2>FؚKǓ%f<vOg!X ,ymI<3˔7+$ءqvI b⸰ !q0N!ԅN"EM[{;Χ8azaqNn xCY[) p6&4"9Sqikvsv 00n*5Uˣq7,́G{,7LVmi%9%;\o2.ov7 C/{/&.Śͣk콋A_z/³!G$,7Ye.:Kv'V_ '=Z-' Լ}{ endstream endobj 339 0 obj << /Length 508 /Filter /FlateDecode >> stream xڵMo0 BO0+cѥذ߶i5qW'n#e v c_Rcnbe],Q3PRzôx`Y5/[0>{kDih>;4*RIɏ]Y6E/ET`,|VBoO^],:قRpP!M]"0 jW|/ʅ)SFα*Q饩vH:VC7G:s+J#wE+rmhǻ4s~Ovwva8Y08.0dR ٍɾ87Ks1Kt_D,JCT4gSl;ژ)p7h oJ4I[Kz}G HgDZ::߽(T MJ fݥ7bioeP#5T)dL!c \< ~zt^,2)2H;-NxA_zyyK%י+ ?CQ9 endstream endobj 327 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-016.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 341 0 R /BBox [0 0 648 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 342 0 R/F3 343 0 R>> /ExtGState << >>/ColorSpace << /sRGB 344 0 R >>>> /Length 1339 /Filter /FlateDecode >> stream xXMoFW>t3K6Z )lD+,V%As7#gw^ͺ{ B{$'G"\L {v{~öv|{`W?<|~x~߳$;~Y)Ǖe 9 z2ٟK6]Xjo};{g mX+>U[`( [+"8[,rtJ[$=+8=Š%׺z|/_C)ŋzW -_Wk~o܁n7Sfpi\]vׂw7ܧ4HTڥ qO&:Š;2V|؏q7&>_\Iy8"GZ{#o3!۝ $sQjj.T$=nUUW_ 7ƇvYÝ ?REG˭!@"mjxQH I E7NXMa$kpn4q歊GJۂbyV҆&R_Wbh/@ ~9.))}jkg28_0$Qn7OLjvLtn,blͅ3jo͸VG֢5l!2 Efmpp,B&Q-27hHŢRcMZ6rѥ% pѦ%?Jл$Fhf`%B}f>L|j3V|XXoDgMn'[P GB?3;(m)*Ah|[M_RvAi׺HSdƝ?"^~U4{qP N\Edܑx ;sѴz=s%-uEɱ?w{!ԧV@ 7|ix9TdɢLE1'2cy-)sHcdQ̧RA:/:̈+wSʦok:5"Q!)ZnM-Ư B[ESȺ4-)ܾ%_4Ek34y9M]E3;5F:zE?CɅHGW1U; endstream endobj 346 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 328 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-017.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 347 0 R /BBox [0 0 648 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 348 0 R/F3 349 0 R>> /ExtGState << >>/ColorSpace << /sRGB 350 0 R >>>> /Length 1314 /Filter /FlateDecode >> stream xXKo7> {FR@ $CCNa#\@~Z+m1Cη{`vojսڽ}u !X{F+#L {Vkfgq6_ftl`O?۱&^rXÔ2z`?wo=M\_WL/Š!z~J=cg÷冶܁ Kzo܁n7auzT9}Z#rp'Mi 1kNib*l<É|c,|S+AoPE+6 +!3>Vg#PCef>ǺL|~K5)*0]^/J?B_2vдi5-) An-QHWAю{>~"MZLոs>GˁU z^2Wѣt"s|e!cpYs|D#;:F)3L/:HU g -/lqt"babp0+ƀK&&vҐ +> V|H@,|~ EQDO(੓MW'/Z?R'N^S'/WL}jPqn>A5eNi̜,ʜ9YAs(hGѢ5'4lNe<: })ebF\ZL)*aϊ7jh5b6H oM!֔ES1["FSf,b~> 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 355 0 obj << /Length 1451 /Filter /FlateDecode >> stream xXKo6WPrQ)")QRQ,nXt^[vIǢ?Dr6 Rř=JV9MPAU)ߘ@#۳X_?t¤%XVx4ʌRIW{X 5 qj XVNr>&τTy+!B(.2^9{^3(JjQVhf7c4@=Jlň_JbCG*8M)Fg|QM)u?o벂@mifdi*/#>;^.)6v`Ju0p+$@AhYp ywC J֜Sg1hfW3v K6*v;q !󖞉~ 8nnE#loJ`#=31&.Z۞^E lˁ^lH1,ߚ4w[ #8RX*T*L%L*ͺ$W  3L0w74l=vrsݛؕ9PUʼn~q9iWs~eTR]w#~I_y];>N{QzN8 KVcbMlX𗮗ߐaKN`i]v$+"!>+3ĴǷCiFִq̍?TM+VlMi AR]h%灲4\&7uVPimڱN,nI/JDҽx?t endstream endobj 359 0 obj << /Length 1670 /Filter /FlateDecode >> stream xn7_ TjrIQ6Z$E@$Ck'p]Q@(.I<󓽧GUHբYU jeIf|:kn  S>Ww'%&ϔTdMykزhXi8~ArpA /8Y@HZfEn@$KA'XȧG@?NILVmx+"g, DTcRA ZƽVB+4 cI}jrBK5<@QDRFVXe$*3&NX5 04c9͂YaPBN:KXK5ow" ;f2u%GSZ3J"L Ϭ^,bii= bxERfZ)&L78LVAtXVfmDl/hQŵ q 9ȗ;0bRTyGkrȰƣqY7Iu#7Epgp9eeՍCky'dmT!i8F2v;8)[m"T6Em:v->yP|T] {-9Ov\DǮe +1\_RuaUK'yk?T1Hyl_PNš 6ylrRi!mⰳs‘]K[!1 QiGbY,qY(jcO3%*,o$^Q0DnB7Dpe{VQ4uVO-]בڹƲ5Boם!/d65v?V@Qz8scra7j'8CWE?CB(?X,qdko+?=6s̻s ʶ-Ê?E|ToY7Q2=xяġg}>m "ϴ76wBKL}FZĊuUpS]݆ckhOHHQAjP«@_wDy~Z0;%c'0sʫvܚx,6sgmm?gζ3ou>; l'"}Կ;Ỡ{ْDUxQB?ϙ˃ 7oMEz|ņMjڐ#3֚k f-_'{yw endstream endobj 369 0 obj << /Length 3050 /Filter /FlateDecode >> stream xڭZ>/;q H'QZgCswɣtvt\7+EWg/o}:(*Y_UafW7߾}]&>U\a^^_>={"Me4 c#i g2b ,,,󜗹0?σ%:!^yq,opW<:˃Cn=4@z^-O7qH`ՐRhgՄ2pk뤄~P(kaf*HsHHkc85s9Hc1-Enn9 7"߁w k'wl}KDU5ht6:O mR>DV72B!w.$Nt 9 &ICnUE7=rnMf{l "jKhaƝ#%lr8z|bHv''F`%].8wjʵg'f8`L񋠊== rә kH[INEwU:0Sȋ >xFe2gLYKUĪ>ŏ#х9S$ GdV^} ?3Ȏm{.0F*^4 46v=?{fnEMNq[T"$D@.HȠұ;Y J%qCظ*]\ghbTo )A ?an'Eu!1;06yd|8-^2*I&.% BGҵP2G(Hl/qq4Kj 1B۪ >helDV1*6K2z]cǘэəZf.1ΐLafgO :S}- M0ъ6^0^7 ){jI[Ef7EUe-FO#[+NTWD o(l9g{O;Q*dȦ.8>hlӚJw-qM07^dTGqɋ| zO 7,7H {0Ԡ7Q';OoT[C悛X\Ͽ䋆"^֔=EXC'YR5{{FhO,Yi{dy$b{s;)[CfG 0[rGpxt*3S8INlW<[KzPSzW' bSxvX-9o.z L5>~n)A#Gzd FLlԠv8eh9]N+䖻{ )no\Zٲz)4{[P< $8oz /l]y;[U"U~H⊲cQNbKI ߶9s}8B27*H>u_-z6 , @(-)8櫑=AGdF} ' # 6c埽gW3:,Lh=h7ٜ’MCSXH3"A>FcfvmaR$]ͲCc ^'PFmwTB] 97RhsMdbUXEx> 9>3Q}Re MJi7<:I 7;^[~sy 8Q'X9EzL0{"޳ ~!4nHX S".lZ* ~jA>Kpeija4O(H4z߿dЉmgeUE9ʻ;:iWE _;րd~6{ȹL2"B_st!.aERa\6.y֏ߧy ѯZH*N!^ zo-s^+DߍƦ;-7n7vɗIW5_$7AzͳG. endstream endobj 377 0 obj << /Length 369 /Filter /FlateDecode >> stream xmRMO@+&vcUnH hi5=ם٥MLCyfޛE $,y AI\A0,Dn(x-S~z6=Uc{/ H\ H™>! ,ѓ 4S33Y4F^lHu# *HNCeu}FRd"f]CS[ &-Ӥ2n]gcn`GmߤJinJl{'ҲdU1*&zXHj ajwaϺ.t 7%c8or)H촕vUGۼ_p endstream endobj 366 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-025.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 380 0 R /BBox [0 0 583 388] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 381 0 R>> /ExtGState << >>/ColorSpace << /sRGB 382 0 R >>>> /Length 1496 /Filter /FlateDecode >> stream xřKo7 +t\Hj-j Z!!7HܮKYx&aI 5Jv$an|armHM`.q/cOFy3v~\?ΰ6?27]f#ɀ$wr؞YY]&>?J?? |y+^}aet:xvgw'L N>/W)ORpOIS\M{Eu K]Y,z {[ \-pk,\-, @-E.*npG=\io9}M/xZq sjzw ?x΃&~?#qZt҄ÙÇ'?F(. ;Mf}Vj\oLV܈:ggA)--B܊B1 {KZʑxZlI.Lsw>uyOS':" i.)6̆.^?l}=~895zK f^\e1k+~jfY. bQjaRbTGJP }f3+!30U!<+Co`*vݮ[+$}_дȅsZHXZ4eSZ8*bbav0M^x}X8؃3-p}8~ 4a6kQ.+e(wd\*g"xRxǤcm7^}7UzkUZh(6R6ٍA{9Bv}xe[e':Y"Rȝ(F(JbsM!H"N|=ܖ!PIltDG[AV}ɑM2ZwwIcKx}ԡ[@s@좤zK t~퐌l Nd x>Oo?ߟS,vVG_d>5#[sW(64ʣbŔPQz$6z幮c-~׃68 ֔zggWQ綘qSQ@͏Bp.Ew~LD<НY8Yle Jex>0y%|9*{>Zg.7Z$6z"VbU6Iz>+YaaL>}qNM)/-õ]ee"{ Om|K]zKrKo"0\czt?0-2A4,4&$u2 Ϥ#YF@",Pmeu,s|JY%M$mhCdg?qel endstream endobj 384 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 << /Length 1917 /Filter /FlateDecode >> stream xko6{~1 V*Tl֢):ۀ\[vXv~x#EJl EF==ytvTgEj>:*>2ԣU&wN+Cem,t:ʎ܎q.~W2k®U;x#3hO1V1ȥ.D2~nq̤ ZgaGM FAO@`Rd2$喉lo쑝?{s _\lY)^_CᴒY^w4 oaFZ,vC˱.-MBN5Kp8vuĴpYhU~xsJTnzkfOΙ*Wr`a=d( iJ`I_f_3gd&;;wXh_%dvpy$aQ{'#$jޑ y7DѾ.bU,ʂ 9l@y*4 ّ(s2ɨ>]_ {NK>- fZK;1,bxw$kӉ})zrLEb_NDTP9F h׈PM|R1*1N0ž‡wQԐ?> 2 i~ѝR9^xgyD25GȻrul#yE7بK#<) h\K"r7I,med3ڬov`Y vID4s)0A-t!qȻ"Cl˗KvdYf>oIe %m_ ]2[of Ji|T2u !~܁!,0]rGWQFW~u`5Bx@PV:čT^v Gk V©ΥMd/^3_wQeS4y\BVܰZ'Ή"f,x:,ށ],{ݗ5s©ze0 o@Fޫc5q)?Zxz1,GWnW w"e}c%1>Vs qiBϢOI"=D9e!vȦwHx1boW.mCV#GM<(ӎGT>V[6;֯xU <4P4~viVT/!̸;G]CF5B.Q|{pfYB|X`:@h6H; d<-/^ UrȰ`LZG37a3^r0uTvWZv-V+,bS> Ijf ƥ:2Z[--7=WI;i$S n@zfP;C:Pztb!McO%5u\e@pɟe endstream endobj 394 0 obj << /Length 1220 /Filter /FlateDecode >> stream xڭWm6 _a foN~)~Rth 0sg윤y튡$ʒcgHEX(!Jhtlr1-x()iɢ2 "cQrR :aG*Isn?f?GA(Dпfx)#|#G8I!<fc<"/kb*hd$ \28BNl`'ERD"Lf3-w.^Ez |V @j62Bin!NW%I*3_\Qi`Jx7:X=h}KzǕJa^"״j +Ua1QY\:e,^zB k->ukdǍ[F)D!{U4aSPUbE@; pEŕVnkK# f$+Yh1hc$ACAӶ^#G͵}561I/ŔQbHY).,7pi*.WZWUڭMTs%`oLt c;(.Uݠ> wwdECF}Be~l5[,,ZcFinֈFŢB{@mQeoev^%m?B il{(GgW>"O{'>hNQ b8 Q@w - 4*/#4eJy=noNW%h: g1L=1c"qH4ǰAX_sOlLCz4\P)2?C ʜN9 q#z42Ƿ97a䈣UCGnnx{tPa)Gldt}}Ao^@ ȿo)^VUf\^ BahׅQf}'dQ5u?O[:cGO!$`H>U5 VvSxOdEJyֆ>@D*9$λbDOl0#޽u 0sM5exLOWYfbD ~~7V#d"wD A9N?U ?zyY|)k1_7Ee *Wu"Vr\+Hvol endstream endobj 386 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-029.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 396 0 R /BBox [0 0 583 388] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 397 0 R>> /ExtGState << >>/ColorSpace << /sRGB 398 0 R >>>> /Length 1270 /Filter /FlateDecode >> stream xYKoF Wq}dy_mA @rpr rR@~9Ҽ}&gH.ap3Ђ` -w7{YW\_&C> `Y IDn#_9d@G2QˈHz`vlݲ8Ë/l}ww"~;ԲD"+""WHtp*H$:KܓU|\_.lӗ p-˧ht,C~y dx쉳D*@,!@ɗf (`UVa\b3%1 ZCPY3 4(,2I,5{Bq;эIVb5r+Dw>>=ʯBf;l G~V.=0t5zZYDDd:(DGl%,!\PL *jL/GpVs%78XV;V%n7 8xm؆o> \|NL oUܫ,m۔;h|h#3Aaoh4`6ˏvl3yen h- 肣s_hB:eH(j+D C~?E.9YBSUr/M_J[ 4p6).}^)gmusԈ\a}u%ㄜU{nH&Xv[U !mH.M]DQb*p$pt*pX۫Wԝ a.CFBև#M|z Qe LϞЍn&Qي #Ďd'QߓwŸ?Uqp0>uPDU'Srr|r gAXu7trdEh(*E2tS1IJ~^ ďgg)Fty({pӾEkۯ>?_K*ëe/2z'MRl>5,ݺH~`dGnژ= ` 5D Zmi )%`yFXS5rF`҇)0 %҅PNHY`<փM_B 忀~%aն,4BHU! ,\bTk1 ê<.ڳ6v؛  endstream endobj 400 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 405 0 obj << /Length 1764 /Filter /FlateDecode >> stream xڥێD=_axha"@R[!q8Iw·snsqݪB9gΜۜCo6=eX*o iq-;?<\{#>q̋o`8*'Pϟ3SQeaDQ,0d gJ On?M],4C|BJ b/) Wٞ(1KS~7_$I/wv NU'({T cr}i?4Ѕ5A#ϛFȎ=ѡisGl}zSe`(7*L],UF -qH ;`HxYcK:Q`"PL8FD*Zhȍ-xẼ@")ۭ-g>Nw*HaGUgh E\VZ{28E88' MMf҉Rv҇h\d̂B8Hw{''xs'"YaSg~5xġ&8X{.-\˩dΎoɽT/ JcWdf6'Wnnw">S gkts /@ aZI-k \x$6aim01xL_ T& )Wkxb@]gȦ׆bB؜:jA S:s Zq'9-s-u9P0w_޽ 8t\E9q(9e0]o0L؝Cdq%+zaj? |̴ {gөQ5NW 5&"Ў-L{:ki1p,a0us=#inp<_vL8_ꅹiP/KTQ U)εBD}A aCs+` AX* @+IS[.*r!M|km9>,']skRq~489d]e[fEј,ίx~]j; endstream endobj 401 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-032.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 408 0 R /BBox [0 0 504 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 409 0 R>> /ExtGState << >>/ColorSpace << /sRGB 410 0 R >>>> /Length 1631 /Filter /FlateDecode >> stream xYMo7 >D $hj99ĩ$ƍ>ffc!RO'ԙ"Y}ݽV_8vN9r:LڳRoԗw\8mQkwʨwdzKFSF 6hJZcb' 5{E4:ÑΤ($!ՉuN?AL*Q*9YUbd 0)lj{Qx\axk|s,V>To6nbOm;CK[{`th~N)}!cWV #icÀX] ϻ.ҏcƙ[3 F8LHC,`ڎo;gQ(mWL:al(%G7ذc}=LGc?+~E'*٘d㡹ilZp᥽ u8ۭ5K{.`{m8^gzqR\0[XsvƆἛi vvgI8Oު:btWf-MZL vsd.&ކ {dw|>[x>"Qr 1GDS=5f> gvᱷ9|/UCPM8~ >wSSGIT)6՟˫[uQ=U<'>};}.Ξщ87/?] II|:~4FDGbd1⒝8 42ήNnױaߔ1dHj@yNv]2 chP(h0 :IL]aJ }Z cala>ç co (QpƮ( Vv\DHMw]E,b']0vM`xXS#ص.#ص.H$SI$fc; /UP$??s.4fpNsD(I~ D xK)DjV&&7rxJOa)l[>˅ط52 J!gp y3mk Ɖτo߆>h(|V*u>uJOda!g(er~X n#='WRZ,+IW&oQ5*w[ !'34--3u=?FKd ?drHÝd$;dQaRR6mDh#?m wN,Q#sVnOZC鑔@ ;I%/'lҀǥ0@xvXikAi>חDlܸ]}IWuu;2Ob2$d_0/n"ԉGfo00f6XީT?[Z endstream endobj 412 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 423 0 obj << /Length 2980 /Filter /FlateDecode >> stream xڭZI|7bLlÁ$N`&Ė(E)=ov4U[Tg,ͻ:,mFfy^TFnnz{hSճ,55/7CGޘ>Ò5.ϓwzXR ~Ja{ը(Au aGvurjO"}?Eؽ*UZ㖹I\kj4y򄼦YwO"~ɝAM]w#d[;'f,;XuJV, VI' SNm 4NF|}Œi!$@ :-Ļ'RjIZ0ٚ\d N !_RDx &ԍpX>ZUᵖسecwD./7!"+ىm@HE;Z~":-k)zU>m*>]\"96YtG)Xf6f{Q=Hdے[2DkG\Z`3\;X(كvi&ۚ`Jlx',!؎O]]d ˋ&@l2jOwhCl|䑅EAdjoiEZwN~#i!G<siN -掛AIk89!OgQ ~>DJ^ə4NV;%EBEF5uJUSyɫor7k/enr,f0KS6 g ZNiG\vTشGuB!@/̱G7_/{O%6t!Z1j} Цb9zZdnb$ ĖZ5EuK؁aqvNުzqBg8Q&6ڧY +X*R(bz GM?.p֟!*63ARE5r?]#,L,gqIdt-Lj,"..oUYIz_##hqe# ln6OI9DWD[0 ޺[MZym`UAylzQS0Ew`O/M2đ,Ԩ;fJ C׼߯-'ò,=^ ev6]VV)a{"C,%M+BhV01Z9jS8"Z0iJM+𬍾/O%*b  H |COp PZ]%?>l2V2 &kǘqyM MZd0Q pktZfE*E4o&(t&'l@AFa9n'a<6/n~gx2d'0>Mqi&n8| ,JQwVD.h[A粏) ̲%c=QoiUYEig&鄨Jr[ɳMulO"pjYc:e6’H&e4h va|͙uG฾.DE5F{WWjv [B| Ȫz b/ Z7Új73ޣ`AI?_p=u`yR]+jZ6y'Cq%dbE0_26.(fGD(ARڤF5BD| jc6J)F׺hHcڑUUF:(VB?WppX44U+ڢ+\4_UZS\Χ\\оZQE Z @9Voii!22fp)Rg[I"T_GXb2F &G_-R5C<:r'\<_Wu2ٞAC0a-Us3YzTtEc{`࿪sm7^REo~RpœV.8\~ZBi^tl,9eNNpMB* +lET8ZtS&?.>ch@֭qN.2W(-$Q m)j'A}QmCL"i<b{ gZrMT۰ ȲZ2t>q?K8fHZf 0"H8}$Bu !|ߩoy{50(B'~[4ϲl ?@Xn:6W=v'pv4USOht2m:#^@LP, 6.o*38Y" 5Q0$={z24{p.oh~ud]0ɇ^U6&ʀyDooڭKa'>$/ha dm؊պuFLZȂ[^`cGO%aQ'#s~MdDɂ,%W,hEm=x ,hGg yE`ٿ'Od$.T/]Z;*Vʕ 86Zah>};V'2 N蹦J,ypE~~+`׋/&[1_<4I.j z[l]ӏ4#'=[&v endstream endobj 416 0 obj << /Type /XObject /Subtype /Image /Width 1501 /Height 776 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 64794 /Filter /FlateDecode >> stream xy|tJ[zp-* t "( +*VPqu9AKqAP@ ,c~4d2G$\m'f2_u%~_ ,,dJdذa}T7o 2Ϯt>l!Ynݺ)ʬyde*c_6JYd ,CY,d{dtڤI2, aQ{f͚EA!ˠ# ͐ePّesef2292`3dTvdd2W\ 0d!8 Y8Yl&Hd7n,[o587esefe\,esefeA,292`32 Y:esef,2ރ Y:esef,2Z Y:esef,2 t# 5TdjԨSO߿,292`3~2LnnYesefL2> YFesefL2:,#2927ٙFC p>aaaEEEZ!###$$D1?e5kTZUt6lвjΞ=}{9&$$p S ,eseo,kU8mj_{W1yzݎwի+Ɵ?U[f9rsjd30`1d$dAA :̖-[*ψ#/ݻ[oh S 8n|ܸqZiرWܓ~I ڶmQ~ۏ3?wY,߿ .T8s$=zPOSqq8yyy7pb>}j;vK.+W䘁Y C5Rᣏ>EbbOHK^zuOQDGG2G;tP6 {[ YѤI_OZ-پ}OKyfs-YDo߾ڵkjL$//y٥گ1+A,ŦMR)Rߺ믿ֲjo3gwu.]ߘd … s˗/2K.:N:)ӲeKJG}Th ER_k֬w}W1<::~оH??쳊I[q4ga3 5Ȑe+,,LJJRgΜ9kqW/ׯבP:k$*ͦY07P28p`S^^>!j߾MeժU>-R޽CCC]:~qqq֭GSRRs:u* e,2%|hd>? ODDā߯jժ }*Nwueٳ 6ސ!C-[v22R1W_ձH7v+:P1?e˂ YF^zI=m^J|~=/`Vz1$GU_WJ)+[G񲦥Wܹ3Yg@ JNN~QOٰaE*))k=zEz]ڵKĉxҤIڵk+pAey+ YF2w}'?F$bdv:v(-榞6;n]:u(F8 Pc3 GӧOkONN7o;q~>u8;ƿ뮻m_ULUZZaӳlگA,ѱcj֬EP ?~\"^(y,3ϲn:8򋟎a Pc3 j ̧QFF~nE.\бj"i]O#\uAJ昁?'!!!11 52ŋ%KHEEE] K~(>>ʕ+ZVꡇR3bdg@KKKǩ1*|m·~oE䁱/^lԨ<$&&FўyƏ1dΝ;o0zoO?82擘,2½}1:JO?-WPr ƕrqD6d@k }dqS?{'?sZ.O>ofΜ)=zAqK͓FKMMU!--c2׿~QFYg2zxOHHH-fn)++rp޲e<0,,ɓWbd@ 2Zn^ZR:u*11ԪUŋ:VM4m񅧙wIig ޽c~2p+ YFe˖yZUO2dk_)כK!g@$%%%O>qD#|8s_ԱH 9Ϟ=g~'il6k2ΐe6le>|,yfyHjď%4[l!B8x5F Ν;X !?ԩH9W^껞*{?P/Rll[Vx ţbXe3,Ӷm]ƈ2[fkz_ 1,#$%%gϞ=}t>ob[ox֯_Jd<,kWъoݻp>رcjذ+?+y;taĉ7n'/8`bw8w\BB.bTH͓6jϟJq_,d *)S(G]Bęݾ}CݺuSuŭcԟo۴iSn1@eLV^pתYF"=y_WJf0,e,CA'n111o Ss!fm۶LFݾ}{nO?.Rzzb-[G.^hDZ> k17ΐe;{sŏmWyL8Gu\o#]ߞIezW8[׮]] 2T˰+-&N2dX_~Q􋎎?|pTCO%Mx+WjUۺub^{- $˘g2 #GuRRR׸R#AyJKKΝ;eʞevn_(A=(:Y,{72-Oߚ4ixtsɲ-Z(ԩ?V7TAPeq,h4k,??_A|~j*xVWW@U*C]|ŒO|1c e leϰ2d8O?y8aS cǎ "ϵh"lb=93,c$8'077u]$UVݱch۷oW~gϞ5}մ!==v*&dT, }E!z`SkVVVv=(7o\}F#rJbbbWM69703dO5p@SLQ?ɓc4(Y揫oT3,e@ >n"ːeIBB'={L6mRߙ^zSHL\0Μ91 2r͛K _rey-e 2&Ɛe28ӪU+Ż2BNN|׷/ܹرCDlf?O>QZhhh߾}#Y QY8N!ːe2 YF\ P?裏zƩS lq}oW[nذadddDDY7pȑ#.\Z2Yd,C89gePe`@?ccd ef2 Y>!,f5~2"Xe$^ Y>!,k ,S! Lm!'d e@>d efe$8CO2@0 @,}2"Cq,e`@Ye*D ,#9}+bp&dG!, !T,6lYdG!, !T,6CAeGY dCYl,ʎ, 2Ї,S! YYd(eYBd *;  2P @L2`3dTvd e ,SY T,6CAeG,SEeË'4hjȐ!FYƔ#oʋ,SGnݻ^x'ˀ,iY5Rᣏ>4ҥK'&&^pfYqLe_WСC2 pZ6mCLLLVVzLbd18]S!yyw(Y, ːe@2eɓ'gҭ[rʺvsʔ)!2[,Ce,2`k:t dSBaaaRRz>sq^S,&'˘eY Y@&i2 L?ODDā/Zjb !:X[o^Lm6MTzLQ0FMYcK/gնm+W/ԏC*c _|e* > l Oʺt颞O<㏫$yٗ_~Yl%Zj 6̙q5]iiڵkǍסC鹪VݠA0`̙V:u*bn #|;e2 Yd,,#;vf͚UJ1PvqscccȪSoVٳgO-tL 2dYƭo+8ӧ2/{Xx3%KxϜ9s*ɋ/h<=zT-;2dY`, n{ba lc# 6L-2 ːe2 ,]nnn=-CBB|gʚ7o~ג8ѣ<ntO]\\b˗2-+]|k!ːedYƚ,vZ!F2yRRb]v3eI&'N;w7|SGXew+M,Ce23s%$$x?s#÷0Y, 2AeV^[ӦMZpOX|`ҥ hذx`2s2dY@ ,sYMlJ|L{|nq׮]feWbv޽lٲiӦߐumg K!2Lpfg5ydGyD!CQӓO>M,ȑ#k׮MeL3|D d 8dO?T=f͚K#/6mgժUY b,ӣGoz(& SVF hYYY2 ߞf! Y`\pf_sss#TZuǎm߾]}UIϞ=:ZYYYfիWo޼yO...>u8[q뮻nڴi~8qxXK.mݺoWL?I ц d_5ߘd , T,3p@SLQ?ɓc4H1ڦMG_R1w&MR׈#j~2ךG Y@e*WYb͛K _rb9sT ?Yq999ڹsg2 ːe2@g8ۗvv!FPL>PX$&&W]t~JJ;̚5>d Y, 2&fzG?ԩSSY}饗n喸^~lE1©SV^s }|X,}x&2p`h2ó|5ƫe[!C/߬Ud2b1t,۳gݻ囮TVmϞ=1{ԩe˖7Np=5~Z, ˀ,T5>C 3f)'gF{58p@ r7Jݫ>-YOKKf2e-QDWORR)Y˽Giy,؞=;/^ؤIkV Zj„ Ned 3Y`,sȑp;vx2U*JͽI,TF%ݑw2RQ|YFZ$ayˣ>* Yree2.nnndd9?bOWϗzM2b?gȑ:ǂi4Zjl1}}'_!_6`G;L4E-s5_Zx&le)˰k!T";wl߾}ժUN*_!+~~eYfӦMg :ÇG?aÂ9X~Lvر{1!6ldZmj67%˴jժH.v؉C7nԱ^xg.eeeSLq{4}'FNt .ouE㝩rrr\֩SgϚefϞ~$ǚ4ĉ7 zޭ}}vJ-[*nueu/Ty3Y@@wٵkWBCCqie{1_1P<,#\|YVZGEEr-+V~{QF5mT)N^{ t YFe˖u]+::Z os׊ҺuVNzy^II%ujݺ?8ǚi49;;j߾}LL9ֲ<5j8rCGh[ձWzz/(~4jԨU⋾}._mLi|d@%ވG0R2qK,SI;6$$D^s?\nW 7. YHN AرcWjZΝ;gp,jժdgSQ`"P2h̘1oUqYNG&ˀv/l,YKe$\0'5'd;G&ˀv/l,Y\//D1Ze,Nٿ P\*3f"xAq 8mgf2B} ̘Ҕ Fq Y^*3ƨe,6C8Op?Pcdd"͐e0H}LϞ=`12ef2TM6\0c,@d F/Yb.N'`Fq Y#ԗʔEEE\0#8Yl,n.p ,@d yTF37ef2R 2D!Ke$\0"8Yl,Z.p YI&w7e,iTF3 2_LNNc=-?Sv2T./p 2dJe7n~FX} ~ f@!T,3i$)s`>ױv ,d,@R ̀,C\YiӦSdeeU1YY2.YFlxk.kLjդ#~'pH˫6`"}H`dgd[p:65,eV'۱cLR ̀, 2Z^\iS!Y}=u?Я_u놅5nO>s|ͱ 4x8`Fַ#JJJ{ݻŅ{p 3e2 p8#H`de f̚5kSv] ~TL䭷 H9{lNNعsgt>@!ˀ,F.p 2,c~XIL\QYd؉'fff_ 7n깥IFFFΘ1###CLuܹwru#Ow$_KSSS٧2v2KuZXXY?TF3 ˀ,C .wM1Ifffddx(44t͊G˟~i7ƍq\"/**CKcͲL۶meKe׫\0e,c,W_?y4<>>^1ӥƏo~8ȑ#qJQF_}2 0R ,d"XÂ,sY%%%bxC۶m`?jJ$&##CPzzPrrl,!.p Bq 5,2#&Y4GSժUK'//)XLLl,!0H` 8Yd퓄HKJJ,؏ XJKK8W= l,t^*#,@dk2ׄYƖWT+ l,\TF30,@dkh\63@KKK]䘘e{l߾݂qVZI㤧+:x!MW= l,\TF30,@v2ժUwx q]N::/41`{e>Ϛ8CӐeȯ]`FeNYfر7t/~$isΕFߴiӕ+W&LPN0oMlY099YwǺu2¢E*44_7~MBrrr|ZG 22r, `Ke$\0 eӧtM111.W,#>C'yXXXzo߾?Ll5k֬.]' OHH:tt7]Y\\֭[7H_>˛,[Q 25H`daX#PYm!8 S(.s*sq 4"8Yl,%Ȑe`YqKe,3Ј,@d+LA,2S_*c=.d"Xe4 #0(p #8YlYF[-[FY2 Ke`e,6,Sa۷l"GY2 :rA\IHH02_2DGd$d, U&ӟ_e,6cn5H20Y@`e`%ef2$ȳhe @Y22d&%%3g^{58br_zZ⺷0vX @Y224[S#Bxxb>Fؿbq &u]gϞƳPYY٥K'^EFF*Fk֬YY ˀ,N2 2d^z%z]J|&-^xw1$Gr$2}}>dE2Ded$duE='xW#I4.RǎԓߦSNf˗//ueYV"8YlS&H2:vX͚5׷6ю?}K,:uOn?Ⱥ_tI1Z&M|8dE2DQg+De3Ofeŋke%K|Z8 .t_CW\17,ZH1ڰa22Yd{,)))::ڔSJi f믿 65dA^!FQ~i7pC<2ZyyK;c ͊uD 2d `ƍ~C'!!!k׮2eͭ_eHHH#2YYYoVy˖-'O2Z<:6 YYd YؤIcrN ,de4hY?~'2Aee˖yZUO2dRn@q͚5,,e@AkڴtLfeeU! Yf3d݆ i;l޼uggg+.,?&dde2d P<},YИeObJVEܹsy.^h,vZQμ,ޟ={&''RnZj龋YYd YfePIJ8dpܹ /;[y5jLwW~ @eYʕ+hcM?fΞ=۩S'Kչsg/ ,pHh8~뭷 ˗/˷m!NS[nEجY31V̚5k&U̿]v~,8t>e,3d_^Z=7kUG V#X GrJ޽գmݺ,,e`qV^/# ٳ x㍈3g=zTL+VE;wnvvvaaw}'NKO>d@LlLidb4555SI#DFFΘ1###CL(ίׯ_ߵkWSbݻqb3<#={hܭ~=25>,;qL7n/ M/~$&ǘՇ-_ Y'gϞU.vHHȶ}>E&WG,z. @YFw|qqq6mv>Li3gd_߬Y3Phh/b\)\"O'l޼Y1q,eV?Z^^Ok^}U9L=83{\/\Pޭ[7cLYOq,g5ydGyD!׾.RJJX~f22 ːe2_)zwFe{g}{WӧOxF)5j!s1_{yyy=/ku19Y櫯r~Iix||YF1c,cz!h駟ӬY|iSWVұH{Zn_LAAAݺucN0,,e`eP<$Hi˄W:tܰaÇ=#`S?Tr7Jm۶߻̙3!N=Q' ,2gϞu^RR",ӱpN1186z_\-oU۷T~}7)f~ϓee ,2yyyڵk{033S*~i?IjO!P(YOWuϥ/"L 88,ӱpZ1%ΐe4fG2e&OsРAeN:W_% dXe'C⥚ ?Ы^rz)ł SSq<Iv1<5k<~ӲIe}ǘՇ38CђeVX~yCW\Yw75ee@!ːe ^rQ>ʗ1I ,zyn'4ˈsI-!ːeg2>q}';wzz;vT߂Yf׮]AE@2&ˤ+o"^9=nl ֪U+OOqAOO!da*]//--u.wL2Fc,C&ΐe*2 P?裏zƩS ,#tI17L@2&̟?_G#G4rzSOIci,؈#<');w.}~뭷*W|)_~Y~~)#ːe3}0gT.dde2dg֭Z***izzxĉ1f^l#}L2FY*sϞ=殾c,C&>"ˀ,,e,#={8p@ԩS%%%Ν۴i###oLSSS<(Bۻwoi`JJ%g:$&pW_}%,ɓ'cԩt:/N;v(ʓ`2e?b5a„:uꘘe엱cJtMk41 Y8CYY bwKZlySNI_WX{(t!''ӄ-r_ȹ6),,LNNVlu֙et'NM6\#ːeg2 d0ˈ?o9֭[Ϟ=;??'OΜ9cǎ11149..W^ ,pI֖-XqqqZZZnի&_~*hvvYt"& OHH:t} oVR)C%&&J[҆2=/bӧtMibqe23dee e l, YF)ΐe`Y@`e`%efe$8CdE2D x , Dq Ldgƌc<2Nc,s^noIY,C!Yd V VZEY,C!Y, Y dse2 ːe @Y2de2Y, Y, ːe@DFFvYÆ 2 ːe2 Yddk xced"͐e`3d2pef2 pd8 YƁ2`3N2QQQ7֭K2de2dY& ,e2 ːe2 Yd @2 2 ːe Yd Y@!ˀ,C2Yd 2˔sEIuʔ)%%%d,CY,C-''GNJJQdhQVV,֚5k={mbdBd8 YƁ2Nٍ7V_ Ё,cW˖-sݳӧOge2T f*; YBq 믬/٧ Y~ԗpLeG#Q2DA^eE_e2\0cdBd8 YƁe\OHW\y뭷FGGkIII=ewy]vjJIIY~z3gΈC111uMMM]fM`޽{\\\xxG .ztOKr7ƊiР>Kҽ_IL:1} E}̸qϟ3d,CY,C#))Omڴڲe ?3ţgΜG_:Z~~~fͤ?,//8ϕʕ+ptb͛s_ZfO?2`٧N:|ڴip1) =:|…nݺ_ec:VdRqjpqm. `,e2 ːe2_r)zwFe{g}VW?*NFܾ^`F)5j!CǏ/+..6h@.FpHꫯ\-2S^1&e}ǘYR!.!ˠ.d Yd3L^^!1Dzv^&jr{))(( ԂQ22ˉ\D955)Ŀ{qXg}СCb .|Wb>ޟڧߺ;wV,3w\ixŶʚ0aB:uL2Fرc o5\}}Y, ӥ2.qf)--]v8<:t ~ F&::A۷0`̙3٫jR榥 8UV111\U|WϨkv[Æ ź5[_~e/s3fׯ?33Sؕ޽{>('Z%11W^k֬q}% ׿6nXl䄄>}XB1q2Y,,ݒ-[9sƔq!5[Iƚ{(WP凧 -ZJM &-Zo޼Ě,SXX8׭[gnѽ_N8!^h Oucd OH`ƁYfϞ=/q}z/\tiSN-((~dɒXsSG}$YӛnI=7,_*^մo^=Nǎ]'t=OZ .2{~j}㘸Rd,Cw_GtU[={v~~''O9s /"..W^ ,pI֖-XqqqZZZnի&_~rvvYt"&o>sI=_xJeGz(11Q6YF~SS$E:8M2:1 YLǥ2.qT9zO41:tH,i۵k\1ŋ ;wn#oFxՏ״U~G,xRPPඟ&No㘵Rd,C k!',[^+{ t\*#GeaÆ+'' >Mޮ];}|x)ä1˘_hdK,QU-[_N:U~|cJe Y,@3gΔ@7@ATF32޽gΜٴiӛ7onEEFF>3EEE.]/U2ePN~;++ԩS?]'iѢ T1kW_}Ubn'9shY`S}_) @!˸މeyَ 2A`yWc؈⯢dB2.qNQ_pEcn޼;4eo߮Y~ رF+s8**jY!]6 Y՗_4H ݻw駟 + B׮]G1ݻ&9N Y ːevE ^*#d,_TeƏ17mڤW_O]wu7"#$$$9N Y ːedKe$\0,&MN8qܹ|M'>eq6ynϫSyڵ;Ř2&СC^#^kw .t!++K=/jTTJe Y@Ar fe򗿬YƔ,SF ??w`]pA1fݺuuBeONn:X; ddd(# 7YJe Y@Ar fe 64h@O#F[<)+E2a2.qHquܹݻwciڴi n鶢e<[F WYeeL\}|}EU,cd2Yz_*#eWGQ ׮][=ZHHb4q4z1c#g1x$iӦ)ƬeL\}IFFFWDGGx8.]uo]q",RLmذa;o)JKKgbǏoܸ^JIIOc+<ԩ;} `GM,C!ˀ,2Yde@! 2pN̐e2 @Yde2@K]*f͚e2e@7vmlTRdq͙2YFme,2YFme@ߍnD2@7 l,c{̦s De`d#@; De`d3l=!JdYA*ư,+endY2 YV"2 U1m(dX,t#626V lFG!JdYA1 |E2@7 l,ccUL–t De`d#WdX,{wE(l|rHHbH, #Ȱ2z',:( "3"%!lcB$'$:_:UݕJ^PVuUuX4 <YƃePSd8YF x0 j,g"2dFAMeLd`Y,2 ,L#ce<M5B3e֭[rrrxY ˀ, 2d \X,w,3= @YYeudaԨQ9R#Fhz'7mҤIFViĉƏ _hh8ѣ /,C!d@Y,C@YLnnnƍKͲuVuֵW2d Ydeddej=Q-!444++K;833Sܤ,f?pM[r,_F%K2d YdePY78S#֡_~g~A T %ːe(3de@YYdW2ŋj׮]]_Ңs'ހ]tI;˅ _qcKQڲe2d Mde@@YELeeenݴK1cK/.Y RNҴ(ߦs2o֞7rssx 6)5?/6x׶|-55u-Z ߿]_#~of}ѦMՋ4h2 ˘s.???i(""ⱪX;.TUU+.<~2d:thYYY6/3?0ײ YddeeM6yyRiiidd 6(ǯ]VaÆeee27nT 3f_jǩ 8(L>]~G]\\ܡC1?ck n2itVOh'6FU0|w*޽[;>55U5LLQ^YW^?cqqɓ',ѣǩS2qqq[2 ؒeƏۨQ2dee@,3fk0vXY믿Vl)4t\uVgU?H1AY&!!T [V~g[JpU'^ԩSd 22 JWC 0e ,9sĚnTMw`HH\~_q#9zőbːc֬YSXXD'de2 ˀ,c#,[͛՞v"[wyGظqc噔q-lqU,e.^PRRZ- Y,CY, 2eFm$nY-ŷ־ ޓeo߮UVM;vp,ch&M***TVZ=)He…de\PUUզMYFSL$ˀ,C!ːe)77q%|fٺuv|LLL^^ 8],Mׯ_~|I(>999.e?m6?P]4{L5N:dejرK/$mԋ/()&2 ːe2d;}ڿ7YYY&(8d˳õ7M>]mPr,#tY5K.G.]TFFFGGG%KH.\P-Yfdejĉۤ(M&M"ˀ,C!ːe~{:KG1 2p_-R}7,<,̞=[s+rH?sl@qW,SRR]˕Ö-[(fY#eM6 4hMח-[&^ J_x ##6ڵkZׯ+VIlݧ~jynݺ#FLJ%&MwҥW\q*? 2p,#8zWe2d 2deLoڥKqڦګaڏ\aq/WR]jRv|UU+屸X̕7dw7tв2͛{l ׹ 6_LܰaCz,.Mk['ONN~MڴiҞt*e@eS^, YdeYFشi77o_ιsbccM;=z4""b/TxV=C:cy믿>>>oť9hΝdkx_ݢE Ծ}k׮9h2 א_s-bHH]aaa͚5ѣi۶md YƎY&//oŊ{nԨ9Xø!ːeFY1_mb._mz222'otoLΝ;?ueZbircQ5}@2JYd,7dG#ːe@!xjɉCgY[;8ShWSNڏYYYW\Yz-*vI%՚={Gjũv7Μ9F@Μ9SZZ*>jx|J+A2 xns2de2e?:=|v[K@GVNٻwjޠӧOfSU#ż^z'OLHH8GSIMMjQ0ڟ6I&۶m+,,?hgϞ:rڏM{oJde 2e̙cЀ,CY,Yf̘1aرN*߿_5rҥX% 2Yd2o;o-.,CY,yY?_ ZIII{1~3X?nq7|g6lؠfB+Fs_hj!nMMMJ}շo_GYd,ggPՕY,CgdWxyf_*a֖q[,^[Ϩd\:uJde 2e!ːe@!xRٹsvi-[lѢv],.ĕϖ1̍qe=dw-de 2eLŪ;"|ݺu#F SN&MtRd>T333####ծpjjqG```LLLFUU>>ҞHiLNn1_,cnFŒe @,{^m۶e󓓓ԩXiӦig.--~ ХK2iLIIɃ>өS'E7^ygh? 2::T^]Fe2]3j(Kt'OV|6N>]geF]\\lȞys*Qd ,cr>Srbcc/Z?lR;>S-СCa ,UWꫯT֭[7==]5"FݻuLPPl-VN|#<0prxX7nرcGf],2 ːe Y^C[f߸x___͛7YF;] $Mosohde2d?YƏ4lP▒v QQQ7nPRϞ=ثW;w^v 55uΜ9᪕իW?(EB)3 \ > bVZ\mmoݺ'oaݻw~`jݺub۷o} (fTƌi93de 2eL)ٻwo՘ٳg9s4??:SN.jҥ{K)-_^/cz7ھQd ,cc1bvdȑ#GCcm12{*HM/,Ƌ?+e%^:7O#k,Ot2 de-9rD5 رca:uR Æ 3cͽzO9a7d`[!*Cرcm4gFe2 2 mN Y&11Yןkƍnel( YOYd:Tp 2>jV+##3p֭nzӜel(}d x ly͇#y0\-}-bnӦM۶mӟz)2oY,'ˀ, kt‘fxCgۿXf1AAAiiigϞ!M6xFe2 ʼ 0֬Y3[̙3g֭ai82},bF2( YO@`T[n0p֭S2EEE ^6z1bF1 f;nY,' Ҟ*gޖe$6m3fLŋ8 ޽ ,Yg?}EB7,CaeehY|*(~221qfe@!ːeѣ>xM&ɩS&y2Y 2wfe@!ːerÆ QQQҞ?8rHC0cƌ)s ^-waT ' ˀ,C!8xi&e4 d dnʖSe$0.2P!8Y?~cǎ/'_|EO1Qܤ?/Y`dMxf؎,seĉ}||RSSNL7M4Igv 2;T 'Y*d ˸ٳgX^^.&,#*#6Rew۾};Y,},cY p:UF 3e YddT ' ˀ,C!˸2 @"{fe@!ːe22eSe$0, Y,C@H8ai )B_ 22pЩ2Nɯ 8YƫeF܅Np Hv,U2#¡H8alA3e Y`d-8T '-2p&W!,'*#0E-pW!,>*#0,'#x 2S*#j00,'#x 2Ӟ*d0yeA2^,x0 ⴧ8'> 믿~ 5j( @|~ 'YdUA#d1~xhix8M2 4yvԩS۴i+^maWehnݺ ˀ,C!_{y#ˀ,,de2d'O2E0vl~%2 66̶mGjٲe͛K}22@YȮ+ @PYY؂,x0 8ȅ,'#x2B<YsBeLAA焄vk׮|TW{S_|C</^?]^,YfW7m޼9..NX^N<9nܸ͛׫W?~~~駟 ҠA;n߾odG;vlر*0Z 2# ,Ue^}Z`}^ nٲE7͵=˨65i$?}||>\kT^pA+;?MqT=y$b%x ~22@2,ӫW/i JOO/--=}t>}Ϯj_kjueddiF\ ,\\\/S^x1e?Ǎ'ϵb ibnݎ?.իW̙#MLLLStB ݹsg~~~II7|3tPw`ׯ_K>yرc:2#㘸-; vD*2퓖ֶmry8loݺ{e^駟Jvjp5t̙3g?Ϟ=ryڵf؇Ow#co߾mbu4h@y\Y`dpY,Ue|}}-6(Nq,c&+ TUUe[|3|2#C2Ed,1g2.YF:5E68[]eFPfP2^Y&11wˤydxHnn]E.Sms2,x0 8@,ZD*2&L~zMV,.M)))v2eva}.yf͚/+#,; ˠve#m۶\^RRҺuk@]tܹS8edsI+ޭ[Tw;f;#sɫT^/n]r%Y.,x0 ۑe#ЫW/i :sLYYӧ#ò̼y Ν+..~w#""eW_}Ucǎ7o͟?_;sɫԨQ-[䔔:uj1rde2pd,믿i_^u2999QQQ-ٺuLeeԩS-GFF~Gs_ŋE@/l2de"YF}yz۷ieg># ڵ'e$&Lhٲ؟^:tl2m9}4~xiAA߾}>̯ ,:̠֑e ZG<Y&A*deF#Ee Y`de2pdB<Y`dp \YƫeF<Y,W@*deFG e Y`deAh2udB<Y}'nBCCvx2Yd,lwaÆd, @2Ye 22 dde@@YY de Y528F:u2Gv2 ^Y}8B2 ˠe Y`dD, jYƫeFAd92{ɠe Y`dD, j YƫeFAd92{!ˠe#g^wׯ u,ްdD,;F ,U0ظ>e6m\2,8Ypwd8Yƫ8CLd /H+9vlsLG d}geLdBq{ׁXVVg7Z,e"nV&!x7i%+++=o%*dD,[M ,U2 < ! dj֨\z/GuֿY4M62GDD5mT33S<4oAovi֭n 3gNFF͛{ѣz:JL&6, @.YqDY,S[UPVV&Odzbt_آ"y=11ѥ_|axRyǔ7l Mٳj@qAYeL<-m>Yd, Ydx^7n4lݺu֮]+4a'JWZE>̞={&{yvBٻwr˗9stɓg\&6A20,8Yp_d8YƫN=PtDt[eӭRYDqê7nPN+F5< ta32w "Aܗe&M~^,U\'˄H U7H7ELq,#7jwreeYw3gd.OKs dD,/z ,U\'Z;stSYj=(cd:qB1>49eiin,2seE3e-# YFnG+VpG,SYYi,g_d "kY剿{nԨQ:u,uֵW߽6dggGDDye7˄;ڳ2 5?,-&'$$(KKK۷O9ˡC+IplIFFFPP4_tmҽ{wiƍ d,/H'GV; xy n%YdZ24eR$W̔߁L~#rJY| 7,YYfΜ9`d2_, "ˬ]VZxRRٳg G={F80==]0@اOB[w~I1,%daժU{Ky뭷7xGdqt3eʔp;fwޑn |ijEW^^޽{SBg=to5x27$ˀ,SYFHNN.D.GڑSN5iZWb,?xaU;vիW]y2Y= eܹӯ_?#~7>*;v~vl|-YX.޽˻I&:gT)))ILLTmݻe7:t-_~q1PxZe@,#^˗+-[L;F܉ٍoڗ_~im5S 7'zaўd( 2,߬"~֭ٳ='+~~wu.\PP0o޼81>88{M|bqeWW~+g!''cLL 6L?v2Rj?~nGGG=,9sfĻtWv2&derR-9uxQ-GO^G3֨<#io/O^``jXllf^r5 @aO,Z2ΗckAAeŋkծ]ƿEwM.]rm4%(mٲEÎ~`qkv kʕ͛7'92^Ś-zGy20#LeeenݴK1cK/.[;B;SNbiYoӹsgf۷okOoƆ 4jH%;;]Ƿh"000&&vR>ݴiSzу ھ}dW ;*EEE?)_PINe@YƠÇK[eee2,#\tIy,ߢ|#t~AM9<@g{2f2dw2۷_xqjj۷Ϟ=+_'11Fo 2eM69~߼ysVIqQ8axҡ8oٸqjؘ1cU?N%,XAYf:;zbID;:0svs=' ?~V|rd,CYeʉ/,CAmesoGuС!(Ef͒y++^7{l3L<('O3gˊSRR,.oA1ee^Ο?,6o޼fydBB1=z8u#V&..N{s 2#{~ȑ枊d,e@2e1cX[cǚ2_xdggN?,묶Cӟ,e_-EB֭ߙ,_KQN2o֞bd\ @2 db,#(OX`̙3&&&tjCBBtD7GZ);(˨ 9++K;f͚51AAAN2ٳgR^ʖo#d, @ḙ}͛7=D 3J3J=i־8""B5rʔ)a{QWޤegUǛ @2 dLM#xUۛ#Gh?u o;J%rssc&̺uġDyyyVV֊+,~ewf_)ӦMmj?Sds͏]=X{}N"ˀ,e2,3b퀩Sj+99Y;rȑe\ҥKUÎ9k.,yfgZdӦM2$55w`?/"Yd,Ce۷komժUqqDqv;\<җ4iҤB5lժUړT.\Y̙3u۰a4o/3e2@Y5v&Y^e_ѣG]JJ|Y۶mӎE# }Tԩ=Y(!!A;Fu-kLj/,"ːe, 2d 9 >\{qڴiڹĢ\<;wVҥőK.ڵkddtt?dɒlq Ti֬d~Z;M6/Vod e@q q.uNj,gfEIߟd72 &?e@!˰x2 @:p1)))]~=,YF># ~20,/ڵ[dɑ#G~⬬/駟^I8+#Ye8gxEAdox!5N:_5A2,Fd,00YfW7m޼9..N,?66V]'O7ybKիw}͟????;d7~ᰰ0??x`ڴi'Np b[oNj, .ˈ2d <&,^X/..ի4={˱cu/_~*M4IOÇ+^^bU%pƗob$%%25^ 2,s)/  Y},2ԷoӧO9sf޽{+'&&Ν;w޽YYY%%%׿.\ fdd܋=66vΝbofС//399_ bٳ7N^+ݺu;~ثWΙ3G^=1Ŗ`nĉ(ĉbX ֯_C~,.de`w [wWXXXfz!nڶmb ːe22,,m۶n2e˖IǏs/o ._^3g?Ϟ=ryY233i_ɓ'K{=Ӈo|DEEI#WGgW2.de 22d׮]wߕnzg]Ε+W:믛[OeJ"kmJDD4̙3)j'Nnׯ|7#>UAYe20,8Yƕe؈,se3L222ڶm[r*++ϼ?`n=˗yϊ _^cǎG򋊊L^(0`ҥK::3V8(˘^ 22d btS O8!VC`YU>>>:rjWN {s"",S2«*g;vܼySKZZ󥻨v:tw)s믳+**n߾gϞVZIϙ3̺u'%%={^Y|2p,W_AAAd Y2 ,^&!!~(ZիWO8۞ej|sYrԩ/GY[_~Ee֮dnƛXRRR[YFlX;c첽/ =p YY,'dmz衠.\XTT_PP0o޼m'ĉgGƗo.'L nĖ;Сòen߾nٯ>뫳Q5]s̙E۷qw ' Q7|֭k,cz{kxe@@! ːePYYdd Yd,e 2CG2 ̝;w 1c/>dklݺU;>&&&//" !,Ad2}||TK 78R20,x0 ej1څSu=zhGN:;/Vեe` W@ Lfr/_l2D1w>^K! 2D.9uꔿj9uIKK>}ZS5 @%R# 2D,#,^Xvڕ%~޺dye\YeF +dnݺi6cƌ^zI;] T[nmٲeرw_DD_XXX۶mG[o?^g_K,0`@֭+đr-ZtE{ڵkZׯ۰aA}b#fn-**Zre.]Ľbd 2Ye\3.]Zݥ(Uަ_69•+WFJ"PÇ# 6ԫW2fϷjJ9Qed 2Y}Yƕi&#a9w\ll1>zhDDcǎ3s_TrrLvvvLLz9a2de Y}k:T5%\|9::veddhOrY8W}>ȎYGxދ6,CY ːe ˸EɉbzQ5W^OII:ujHHv;uꤚ7<<*//rի՘Ν;۾9se?;eq܆e2 d d2lmM>|X;%ѣG+ݻW5oPPӧU3)bjp&MmۖWXX(~ S ٳL@@/^RR"aϞ=w†e2 d dw2cƌcǎ՟wɪYg'LőC=3{&,,,33S9fͪ15rPٳgOl8Y, @!@q,믆3{RRjNJHHP~q#D=h"B2338(ˌ36,CYFlٮ_.^aċvݺumoe 谽v#yf+a֖tE[,^[h?TTTW_ֆe2 ːe";;iӦ2K,CqB=zv|I# sGĒ;wX)ij",oֆe2 ˸Qq׮^xAHovv dCΝ;Kkٲe-weq!|-;,8[,{Uu&@!q97n^]erwˈveWp YdLMHVYYcM,CrF]Trrt'O}X<ڵkرchhoDD}TzI_pav%MΡjb{t&֭QFO=TZZpW3+Ffq85mTYeiذ[dSRRÎ9=c$**ƍUٳ{;wcVM}Μ9᪕Сj^l՗/_.//o>׬Y#t68u ^gffZ;g7,Cs… PFq;dȐjnݪ˔(XܯwYfڒ,2{srٵk?o߾VvG_1ܹvj| d2#F:u#Wffn1̙32O?t6 'ːe,#Q?}8 Oƕ+W֩Sgܹ.\^xQ Hz쒒oFJ_y{!4x`>bb|ۥ~[N8gΜ q_|Ϟ=:78_/f"˄=/]I6`4Jgiu\'@,}vZ^KZMJ⭾7nGo .FaGutqe2pNIHHPmJ7|ӧiӴsEYiӦ1cƴk.<<ϯAIII~7ϟ?s_.\XhQ~5kشiӾ}.\P^G\0*!!~rb N!9Y&##Cu"3Ν;cǎȯJ{s[~ay2ڵJOOcyavN1pne7UTTS;\)1ؙ3gm| d,se U7)M 4ЙqGbHybUAA|G),&yk8'K~ZYWx{le0,Fd,2 J_-f|}GZZ#[Q Iܹ~u;fd#s_}_}e]d6"'d5k֨n4n8[B_}Ui׀+M0AeVZe,#۔)SjyWv7_+WӿK;fd#/_kڵg>YE`# qB/--mⵀkz/ԩSG߿Xv˗?(8p@r֭[1w! XWIwq dݻK6nܨ>h ;frzJHHP6[ _i߾}d22d8!ˈgT~!jFF={=/;>rJEE͛7?y@rz%"DXӧOG̷KMkvYq_yyy{8p&N(ءCoV%˼[Ұ BlxVV֔)Se\s'WUU4LCzzX%HœM!@@! Yf޼ymӦ͵k֮]+۷_z5..N;x…ﺦ*qƠ `__+VXۢ_~%**`)))ILLTݻe=7*;v~z,YYd[?.]ݕ`";˗/ϝ;SN`<22ׯv킂yUz衇zc,#dggϟ?[nsѣG[$9sf-r,#>l0ieM?֭ٳX%i}]k&@@!ːee e؈,s2#`Y20GenzNe^PKuF,,w2<Y 22ee2 d@@YYZqa: ;\z=,ڲe uЁ,dd ːe,,n׮])qD=/#<Yl e e e e e e e e e e e e e e e e e e edypx*d0,|Yq,1/\OQ -1/^2`Y2`Y2`,`#00YfW7m޼9..N,?66Vܹs+V:thVhhhXs^vMuÇI&ݺuKS.8ܓ_|C=$6<$$Gxx5z>+;vlر*zǏ'ːeݳksNwgGO /ɓ'˒=Ƀ̦MTرcYYXƣi` kN;22tĴrJYmG| darr(qӸеkׯWUU>|xܸq&G7s^{M)1c(?155UYKt`…v:@mme˖aaayyyuVٯnS~ܶm6QGGGgddTTT{イ74x=}y<ܤJ?۷oqbc&N̾G,l6QgϞbhԩruֹi<&&FL۽;\c~~^z5ڊ+d崴4բ~Z.t]fu,3}t/ 2ߞ>>lRI0ת\- Dcs:[lQ-ʒFqG'a"uU" vEYk׮E%%%ח l|>tRXTT$ cccuvM,{xгI_}UYG1M4ׯ %***䢄7?~ŏuuuf5ؚnõKQ$1n#GõkהBe!!!:wXFӧsf1B,4X&**J mA);@7nܰntzJnݾw]JJJtttHHưb,Ng}F~1%>>W4o2`Lex'lWc555r%&KV j#+(2*2`Le; ͛>{f%={Zr劫NOw}{Da92N)++J,{˨1~˄$Zcnmim6Xf_\u7,M?~|92ѲT ̟c1Cw*FѦM}*߼y{wbj/ ,2bȪyfo2ƎgW]_|9 a,#͙3o߾ʭb]=h]tiժUXXXJJʊ+nܸa8cM,s/^ܳgO퐐12e?+ӧߺ@ʥ?2B~~>ڶm[1Ad[}<9EdZn=bĈ4bX@ ceD,0X!` C,$b0XI2` eb&12L"ceD,0X!` C,$b0XI2` eb&12L"ceD,g,nզ=B,M"ce?ؿ&ٳgGpb ~5beX2 @,bX˸u]|XqݻvUv#="^رc"""gϺ/fl/.//o]N<9vvډo֭f/խ]vС'qqqÇ߰a0#;v,55۳M6wߒ%K_n~{ؿw}7qD%qȍ5ȑ#222$l2xq~w:6/:țMTkuرU˗kHL/_]:,,M<iii5xk׮ui0^te<:~E9NggΜ1= 2v T &p/e }̙R2c Q2|cjj$AQQQw7|U}11bĩSsssnj#y7ܵkׯWUU>|xܸq MEdQFeggΈG- Eܷ?V2nGʕ+Pȑ#b{^|y%ܿoܸX|ر'68ˀX ~U%O?|,3}t/ rU?11q^[[۳gOh߾}֊qz9޽[VHJJQkQ"}7nZcOXFSXXhDؕUUUO:UV^nWM*:)pZee@,cyO16:tH),**ꧧYF.z\̴=55UVP-ݓ&Oe:te?sΕ%[lQ%9+S&}Weѷf1B,bXa,#O'T%_f38ކEi9$$U}yŅ}:G%! @,|xTb8Mo޼Z$JvڹZƍ^GDDLyy\eci,Ѣ*?ⶠ۔N3@ %+|ee@,fxZnƣދv n:#i٣Xx@qwTvq TˀX 2:\-a'ojF?rv2 m[e! (2 (c7IJJʹ=11Ugrrr\uVSe^=RVVXFE1Z[bB,0Yzj$TL'MP{rQZZb+xe?`YN6+LAA8駟To]VV6a2JڴisY{XX2 XFFyԩ1caÆl^__/N=ztNNLnnx- E#I,xb%*((\fMLLWbaΜ9Jm۶WVWWggg/YDc.uaӦM%%%UUU'NHKK띈e@,bՏc8Yt夤$/x:7└_ZZbam޼[n5kg8./_XX2 XF_:pVcٲefdd 2$:::$$$66vС֭b'裏m6,,lРAr XF9'OܥKgŻXƍ&7t)--Mvu#F8p@3! @,'Os\!12 XI20XP! 0X*2 b&b@XD,$bC,eD,cebP2,B,ce; ӎ><3<%x駵k=߫W͛7WUU/ XI20XFXcǎ?Ze:uvEGGZ>`)e@2L"12?2ž={T-DFF?^[P,RUݻƏq XI20XFXF9s!C._?Y24W^ ̃XD,$bC,#O,SUUmwub mda 2!!!x0eD,ce$q9qfSӲelYԩSG{ŊvrJff>9gΜ<e@2L"12_2˵Mի6B6%>~xU;}@,@"` !-ֶ6{rQYbKqqqx0eD,ce$em۶U6U|jjjT5m6[ 2 b&bcaÆ zͻqFte$b e` 0v,#7}7DOQeD,ce$eJJJ\}Cs\?m߾|`  5XƣT:@bC,Z2–-[\A,bhRppp^^^ 2 bgGls !1]l|&L'Nbh/ sRb49Ws !1]ld[lA,@"` !Q'1]z}QATKk?_ b e` ꯘ_2= 巿G]Rl=z4iҟ  0X˨O,mK.s|>R  Yv|]]ڵkka%;v,55i[d4~ɱcǶk.44_~[nuYPPrqu-<<\.###E ^r};v8p`XXXDD?~Y7C&N( hԨQGx}09^WU[<ٻO>6nؽ{wv*^x0|Wj/ eeNiiAAAn/XX4XFi_v|,h"I̙3e1w7Ìعs7mڤ߱cDz2mgvj#A;^-ˮ>tb;ӱ_|Q;h&tˀXXƊvymS3gΔK_~eg}XXU,c`?bYmԨQѣG1cƘlʕJs˗,X EE]fff^~ƍs)*,\p׮]ϟjkk-[,44T.yyyN[Ȩ^Yoj;3|&7nX\\,رc'Nx}XF*++_{5dƌDn>; lR/ eeh/ж#>ć ^tE[G|޽[IJJQkQ"}7/,,lNϞ=TqԩS֭sxLL+d iiiN[>}|xРAvN>-gjj A,sb\c~~Dl.c^xгI=ڿ2 !ӎk/;xcoVURbbDcTY'##C(==].rѣG|SCx 2NUfkA!% c[jvCEXm6bbcY͛ErQdddZt2gw7iVVeDGGhceݮg8ڵs=Cx 2K|s(GYT__}^zɣ=#M$x}0z3M$X2M=?~vѫ_yZ)bbb"ho` 򘡏?~Pn\|d,籌Ӎi!222@ # I,G999C|MbƧ}2 Wgբ+Wx%#k\TVVXZ[F" (2 Lhhl*&MuUV^ӊ/3Psn+2y5m㵎㍎?RxA2VhbC,|ˈl<++UZ$14i/DxYA4yQ8駟TK&L`f 8q±{J, M6gϞU-}2[? [gdyffR8m42VhˀX 2:M2E6rjmaÆjGɩeȑ#]!#??U9sj۶mzIvv%Kbbb\MuNÕ1&%%߿_\^^w޲q:tiӦ'Ni2/V6iAAAee5knLc%hˀX 2z;wNSRRV߿iiv޸y܃6k,}gf&bxUM6V,jAAA˗/x'Tu؈an޼[ǃG@1e@,49999h*++V,#͙3o߾ʭ\ڌ!CDGG:tݺuuuu>}nYw]tiժUXXXJJʊ+nܸa>(//_xqϞ=EbF9eʔ~U#beiiirb#F8pb!??Gm۶A[ǃX% @,ӄ{wh\'6b ebbX b22eb22 eeb2e@,[,3f̘4;w&eˀX iNNA!` !Te'bR2L"12 D,XXI20XP!eK0X*2 `)b&b@X",E,$bu;vcƌСt>p@#f[PP/EMM bXe.\W^wpX @,2pC=ŋK.22 b2h2@3e***e2e@,LII믿ަMM6 eˠ2/#J uڵџĤ22eb2h T٪@XX e &5V,4! ,80N20D,>qP"86L"_%b@ŗL  `)bc$bU"T| de(eK0X>fecGyX `)b&, b],` ӹsKP!,E,$b%Te2> w-j6"ٳlOv(KE5cǎ}6MBw}K,~Yɓ'ǎۮ]~mݺU?hݺxEݸqCx]]ڵk+j >|Æ NV\)Z ӧ+7;v 80,,L ?{\)yEwu'|"mܸ{buUnӿ}ĉeGubbx4XC;Og7x OkzgM+--mⴓXXX qlmڥwE5բE9NgggΜq1+&b#W)ToHݻwtc;8xk׮iO~z|xoYvُ ?;v,++3y睎;⋎?8pǃv]5D'ybb~ det'EHŸgWl޼Y[SN瓞*::zժUxeee.\ V/_v\$~Ŀ㢕+W*Ǒ#GE dQcVTڵkff׫>9sfeek̘1C̟?_&Uپ}7;6qN,bOb3 ~{ RyymBHUYw^C?~R' DcaȐ!A1v,wee7TdN:Un:7111UD83IJJYY{nY"98VoOHH媫n2<^2ӧOW Y(>2|Uӧ叽z&AxxxZ22 71xd̙FkkΚ5+C^ybbbXFO? w,Ν+˷l٢j*++K.9rYjs"QZC%*O<ٱ\8NbC)EEE066|,# #uUMꫯ:o|n@7e@,C,@2N;qr-[fgg N?j+VK`|P[sΜ92 eƏ@P%ⶠ۔)svN͛7U˕/˒?\7B-~ꩧ5<^c%>8K@Nj:u;Xh0m4 (֔72뱌{C$&&?PX#eee^e|p7|ˈEhT$/&J׿9>n8鼷 տӧO7󠠠4HlB^@^DDqZ܉2@3e{DZ}j?qBO?M0[LbbbuuR.d.ݻW~%1::|mmŋ?7F܉2@eT]TӔm۶WVWWggg/YD^XFF)Zg2>,GÆ GɑkY(ZP,Fo>Gƍ;w֭mcXfJrUPPPYYf52>8 tC6mWUUU'NHKK Gcp^9|s. XbWN+blbCSb<=lǎSQ6#t].oұv͛7 Q!CٵkNVN:&JT5źe˜>}ڱ}7WYf9lϼ,[L#ˎ]}7=Z߽2^e+yfo2N\uI |22Xfƌ'Y1繿72[~W-ڡXFü=bیc &.y&:ݫ mLTTTaac7tAɓUufϞWgu ez#>ͺtҪU+VܸqcͿoaŋ˵fddS萐ءC[N[9771bDǎCo/Ǝ矻yXX;=m۶=rJX̉|(81{1B,eol~ϱLe)wp= Obo!*Xˌ7Ե5ׯ_XA|&hnxM W˖-G,#NUu  +X9WVLNNnH,4XN7#`1Lhhln`bXˈvmm2ir#+իW۷o>?D5/2ڵ]ߟxUUU:/Cl6OfhyTQQ`S $J׮]Sl۶mcDbX o?'&XF2!15ˈulll=&M?*zZS}^[BՎ*KS[GOov _n13 uuubډ2 bx11}!<ı'cbbBBB:w,.]o 0 ***88C?|vvW6!G֭6lX\\Ty׻OXƗ 233uE4RiI<ԩSM.1֔WX:4bX e*.q,#+{x_JGk׮u|Tᇍ˔b&4c1<|3obG\젠tc-[h˗H,2{2@,&˘L?|$&\Q@,5}ݻw>HZFF\`<ܹvOK7rQFegg.kQDnZh^ege<3h9s\/k>,S'f^p!::ڋ6r,_2iii ӦfϞ铘eb  'p,_~,2dj°0(88x߾}F޽{ٚZ_omo ߻u ~_|񅶝]*7/97S,#3UG111[n駟>Kel:7B6mT?lΗ_5QU%wE,  GjqYZeܹrԩS}u*dddE'O6?|+b+™e<\IIrq-[}EXF$FT\7|06|b32:c~Z[a֬Y9s2gϞ>XfҤI5hqO82 bxh{*m۶eeeDDD:7oT-*//"##X[ ֭[KuբP,߶m[eW^y[hСCܺ}TTTJ}'2e@,C,c(_娫X&88U?E&148/..~}СCIKJJG,SSSFk۶  ,YD0e?S;)7v" @,X22v/2jē32 Ǐ]$wtz=hy2c=ߢE}.ZH9vGyg6hXF:s[o5rȻUVaaa;w1bIJeN>o;X @,bb?$$iP\\XF+ILLu7vQccጟ2 `)b&f˄W:Ǣ|#ŋ_}c9siӦy:cY{^Z.JMM5?|=e$ -bR2L"1&/~!geeY1Cj~cc=Xܹs-[!!!׮tRod%zJJJr|4޽. gl6[߾}e"` i6̔)Sdb:oQǬ|܃tϞ=555ϟ6mZttcaժUrQXXآE{]vm׮]GvO6r}}!Cd5ч%QdE ge2e@,\g㪜;w.!!U-JNN^8_z7>VZiUppʕ+MndcT{ү_bG bX e9Ν

    |Ν;.>NBe\xq~"##[6z۷{k2 eebb2k׮u|f}c7sؠyiW)))ѣG3_Xˈ'K|\ҏ>+tj޽{WWWIرc)c͛7ii &:h2 eebb2尰 剙իWw&''/\p׮]ϟxƍ۷o/[UL2E.:t/:s挘D8Xd*grrr-[:7{_LTT Eݻwǻ }{SDD#bo;{|wyfY3<<>(**;|_7?|b22 c1Rlpp}TK\`+[0`jQBB\t%XXF?~+8k\TzǬJgx !Cԩӎ;TK_b]|p?:-Z8.ڵ|~ˀX 1L>} ))XhܹseSNAR[[+[h׮joFgkVA,W_:qqqbPuA Jgćc dy||zzʊcEdڥrE' @,c&DM(ӧlϟiIҢE U}.1Æ [t]ݼU|;jbj, w!KĢF| ԱN%zL+1վk҂Te@, \,Ӷm[lYYuܲeKnm۶ ]Xnj] XF7ocɒ'|Rʐia`,,,4Œ*+++LX2 b)2JQWWg̟??''J.wȮ]s^VA,sYY-$$D|B(r9s-{͐.2TV1惃_yZt) 3' @,C,Xh.6lj*բk׮5ŋl2m4f,رcݼU,e|Pݸet.2o^c⃃_yy$ @,c޽{@wu>(o=]W"##e51AV-:|gMMʹiӔ_УU,e6n(kv޽W^ 2=}ػ9uMETTC,bXKc9sfM\}񣲲Rh=|*27oT]8ѦMQظi,cf߼*׭ѳO>[*2 Kcs)mHH.]jxSfIIIڎ;Ϝ9ɓ/~ Կ /8ɓ'741ػ9$ҳ_+Gwt…72 1p#YnںIceUVɖ-Z_SSsڵ]v=Uzz\Gnu|rYC;w/;;u.99y…rJ]]ݍ7ĺݺu,X}#2C,ӽi,cl{:pb2e\1%%guuu[.^(ΫWٳgԩ}XuYc|o;F,C,6>VZiO#W\j-q*2rO>|8[>F,c6Р٤2TLV:;2Btt4>C,e***-[֫Wַ=۶msک 3P'!!!;wիnzxҥ7xcQQQ:tx糳 D~ipխ[nذaqqq6M#_Uaf2 D,Fe\=8.]jQ,c]tXf6M~޽]=nڵVF>FeJKKtA9X X ?,3fLnnS:ujĈʅ^X|sEw1DEEM>Plݻw>HZFF\`<իWw)ww7εĎF-$'i٣b2 Qe={UʫwN,>y'ׯ_/ˇ Z0,,L, ޷oji}}y|޽[IJJQʫE\o[|cI&׬YZj*b̮]/\ U̝;W.:uE1VjjZ.MeJKK{ŨVӧ\tb`-͕"2߰(i۶l͛E2cݮse;Y4kEDD4###"2߰( v5\bo=)((HY4k[X2\-㴚nb,,iX2=zpuw@eBBBNꋋ(o-; )wJJJ2?||âXfɲkת}ǁj/^t,ꫯ̙3GO6Ӂua+JOOW-Zz\j~!E޽{e={Uʫ&2y.=駟:?c^eΝ;ײeKQ~K.u_ͬ,_3j!Mw6?||âXF6lls̘1yyybz~ԩÇh"b>@V߳gMXFXj\hѢ|^׮]۵kѣsʔ)rŔ~}}!Cd5ч%Qd8 D 2߰.|rXlY 2UUUɪl/һ駟jJW\骇ΝKHHo힪QJ~=# Y.u;/NLLlZ8p֭[uβz,#K:u }ꩧ?~˫V-Ydn߾s=' ܹsSRR"##Z{%jkk322 "$xfW&Kc)" B, U,|}@`ԩ b @, e eMK endstream endobj 429 0 obj << /Length 3478 /Filter /FlateDecode >> stream xڵZKﯘISCS98琚J*΁+Q)QקxPhI! hʛMy?ݿ򻦼ʢ/~}U7κo_/WչNV'Ÿ]ԋvb oÖfQ#702N'klѵ-OE8~N ~|z>-̈vfjB^% >3ZW8ÓNQ/kn^rH8m |<6]) DXʼ3!@ k%me'~eےU9n-\ ;NX]ڠ]dϘ ;-D{xۺ[8 }}/! Lw>՘v8c*?zt/$04`LWeMaM1(ȸf<$؎aA岿0r;ӕ#d(A5q :̠F9MbžJ}-S4-6uLDv,cuwqPQMxmDHXyIYyK^%6eS_02ze¤?r/aљ )߇="},^ԌHfQaeW`u|PN'5ӧdaROY?5^{eEy_@U$´EӃ˫Ma\Wa;rYwvAb;cCƭXݱzl)j4v=wPqҒ[AhR? z cmL_pjSZ޴;sd*fQeOݽ ˈ8:Z./͝]]C4^7 h%m#E!RÄՎb2rR wHI>j Q =^_'nhl3M:ͳF2u˞)K$kc/E"7]y,TԮI}䕛)j+ =VN{~ 1M$F/cG"-0z;[\0vxMkr1SK:2}QמGY{`yPcLbClT+jiJ7${0cP2ڦpK6m Q{"k="ovzヨEy7|.p3C!tEJdYB "9~5OsQL^`UּNzH|jhUyOИ25U*͊"(q6N !.%c1B?D{sa8蚢g -RTYwlF){E(xUekMa1 NRS@Jp7gpI" 8R H+4I ٰArT.!n;@| $g1?4IH@$J#K2bb뱭wSxE2|V`1CI>ƅl%_/(jl [.)lS=(TFV4fαb r ZX͌XhItj (O E*@'n#wB+ '~( a>"S|&X%4Lrk<_q),=HW4I*Y d݆ٿjFWZs4)7+I1d#lk]WTst; ]2(cXub1"W/&D]a_c0-Wgx Y%K(As'X$wS ݤ";EyEUd1 5xN*ma*UR!):>Ϊ|S.PC#Nձe.`(5+GYSLr%(Mt7G?贀_ dž|c@;r')";S(Ѧ8\9shm6fJ.~ԔVwAtGWj[}({ftSv> lK[O@Jt%aBFz'κ2Eԩmb~ͼ5B=)RujE2_ B]= Чhlz[dk:& `p9ɛ J} C8kR31ΛR3a,.\ #j<: ȍ?Z]+J5Mɳ>! b323#X<-[͢[5[kδ ԤᑥG7LMMzqc뚢-յU7ԂU2s^ ' XfVwV@=@Q3hEdk 7E84?Gd{iLhcQ!j&z6GRc J谋h&Ъ7zLu5HB*τR&m'n?SϜRQdn ~}aC̿\I ˪].:{Ԏ[>/l3tw06]-t#UT9+vj biX_dʨ+nVi{$t & @JRr ;O| pN!ŗ<<_EEU_ E5ڣ]ٳyp/;:UӀSo_[3%Xt^gd>R¯s"U~<'tu-hq@S'FXl p}݌g'6bk'dAGeMі^F@51q6@]ۘܐ e.`ϓ8^z!f|B}%7P*LA¶>r)[jl$^w(^ 74zjգl3;NAfL䳨(EA\h4eQo endstream endobj 437 0 obj << /Length 3157 /Filter /FlateDecode >> stream xڽَ6}ȓX3I]dGXd&նwlat^[twOSdXE7o~WE&kBZ2_TES,7o|y߾ڻ1f Owdb)[Kx#IU˿gwbll/j&ي"ܨ6A@Ow+xy"١r\#c ̞t\(}a؍n#mMlz]:1,2zfQ{ d-U%-(Ad`KEr;ۉհHK@^֭#p;HȆ_ R~Je-hoUŢ%! wȷ7*a3OFYtAt^'w'aMn>dN(Ph7O læ_Ŧo oHHkZhMx}:+ɋ#ř5e0d6ϖ,/QpN<)QY2rƃ.j$4n&j}t-)F6^G> 2\Fa3\Y1>ʙ90-]bN_DLO'Lל"Vz)YuT;PLp%@Xo`ScUq& pMǣ avM5V0hu9?[Gvtl E;Ap[Mf|1A0A܎ h\; v2#e/"WXkésbS&bZ!n*C<q2FDRJrB&2@fvYi2#R1UqTS)\y9h6D-t-9YLa,z9Q<4IDS\B;-seyӯ߿O}:ikWr,IG$T${#'!߬ZU 9sg˟UYV$Kǘ_8UPH:GNcc sg4a a&;K_F']p"H6q`T9$px}OAUcXȅEQjD?Xs޳M l,chBZM  +(D1!$m\{8Y2N+/P0[zJ\3û(T5N-VMO4y@3$KȏYQn3a(ɔ,-9ykR~'C{"#"=NJyRY1/>^'Zy>s4^UEUoe/"5,Ր/G"_r9DoEA}jv%g]D}Ǜ0l݅ <]k@*+C؞ +q2‚j7۞){ SRJ1}4 ctnDhK^[4>v|Yv]"JRYi˻_{0fA9!SNH *KO](Tfƨ#҂zm'ª }D]BCSO(;8v\/7lwǃ+]+=*P?Zr'GڷVh°`M\~npvāk&9埫\[[#Dٽu.g`[BDQGp)ILn |TB4#Pbq:HN;o/g ).gʔ~Pfn8?Nrr2w TVQE3?VrYUp5.E"Ɩ UPT daXkq6ućRi`"q=Em mM Dž-QPAx=/`(]r]VF;,j䮉9p ] %xdJpM+ 5*y*UV:n\B N;|_;|"I~8H 7Ю%sTkkDkltд'lvEcՃ}C58>m|!oH endstream endobj 313 0 obj << /Type /ObjStm /N 100 /First 887 /Length 2244 /Filter /FlateDecode >> stream xZmo8_GeV ɥwž\RNbljDko{@Qg!i %rBV;C(Ż1"81ސHߝHю[m:2JhKhQ\] tE4IhP4N0N0*%-~cynlr8Ņ L0Ø S&Y8-ضGy,=3u~q_84yrct G1pJڌ *f!4"&$[ $=XL3;\,x3M46k- ;$ > ςyM ko!jL٤`3ް,31zє06A+<x~/|`|rzDP"K$`Xi`^Ac@M3= ^&9(DH 0dEԁ"Z!4ԓ@D]1.$yrJ di,m'5 q T6yǪi$ -JkзVq У/F/ egm>Wu3)TQQD;%NG&IX  }-ݸl 9+???Y^U䳳iU) n+s(bo8E2@&Yt:HPĉ+VdAɘDNO9d v|5ki-Lvr  ${vw&*C/>t]vE1DQs|9Kh^/q1[1)W'%' 'Ɯ AP$Ve0K7#7Eޖuu3 ,c#Փޗ-o&PE{hNVJj[8}EgR3n3P|^tkPL+rVzRVY˓h'\{2o~.ռm>( HE~"eZ*ٿu[LJ@٤2hߊ,/"x1;NlΚ4$8٤rIͤ8i~SaQ]b6mV_U12O>ݽ\[$BJ7{#حyyÓt.6Q $]窭(/?}x~Qq5JY1ךq[T"9"<gey/} u.v1=- _;kR Ww[I: I@'er3ѥ˿]{ϠN1q~8-G*dT?u!6J2ihgasfa8}>4mo&1T/Xn'9s?4{KyhWOzazNl{Py > MDݐH[|̗eJ'u. 1'Eyu~=xh*KTܲ`8~y6#v :@ݬ 1|A{0m݈BkdKiV̓T ay{;H[½{E²{*e 2:* 5hona)mZnBjDb;1/Dz6$?uH=:]W:)݃:Է:BU2ޓM_2I:yCmOX0Hm{|B9 -a{Ca|]%ν@ R'鎛!E}tL$9APۭucA =,5^=鮞9 ]f)IpJIfXvJP#Oi%;-dt fB `舴(S@SY׹BT %9@.'EF*WN7{ ;WZ^Nε ݊ǜŴCz{_!U25ݔmKh]H2D'{xc &ϝ 8YO'tbY5rZI$'$zpV߻ q^.k2گ_5ڍ)ڑ:ZڥGED #vCx{]cGSQg.-/lfԠX@u7F d?}8 endstream endobj 452 0 obj << /Length 3775 /Filter /FlateDecode >> stream xڭZ[~_1ȓnykM ɶA/%ɯ﹒-N`1ks!ӻ]z>eiRuvq}Wewe^&>>0>o*ʪ2)&Ng==/5WvB0b-zl ӾKK*IU eUs.k({> A~`喿=m\a7tՁfB{쁣GDpP KS@d~l N3'sw_.p-Z6d \f6]\gaA+@EO\C|&&9vZBbsa yZN'T+TMERf(, zlIxRSW)V׀\uXWU>\+@c]!*P!2s"k74(o\TAFyP1!kA RϹelH*_XQ,^ie)m9s7X>Z҈9`=qetߟV jcYmϚ5Go 1 BNLe*,6 Mh^.Vj#;L@N ,چh򊩀߳ЂaNΑ"~Jņ4q{Ji3Jߦ'>IOz [!XY%9xC4"\&/RDߑc:J+D L "btkpIR6,lVOR3 [fE3!|G oݵ%ꨁ 7^.Հ*/̭poD3 v pefNAB6۵Ć&Y;8k$f b((a:E36g6}@ء?s%[S*^ovzZ0slv:)yMe}1Pv:p ZaYRLJh:_)9{E <\5KE ERTF +Sbo)Ѷڋ=$a" Dp/PY|Xz-=$ֲ*,e; X׍\^ ߝ 6$ Gn:٩MuG+6G+n)tfB !؍n1"$EO4i*T,,`=ɏc.-̸iTbYL2d] \=l R(yZ2R&TXDj& ;(KU \xpfFX v:JǖD7rc,p3RB1`7`GP& J=ga,ga=D>a]aٔmb5zS҃` $3$Y1.YIV>4\*^&YݰP +ϦybM~ ›TI*I}g쳼W*AN 2AZ%l㵓dH,soB u)&Ymc#?gsǶIb ϳ6r!-xF:Qfr1uv%IylۗXoy\GSJ'5GO¬pjɠ ڹ r0$T}5σ1 YGWw1rV*4o K٘N=k6eTwrifylbwV<C\ۖU|mSGHkZM$>%/SHAr%Ke â0 MZ2OԤuRfƞM7z,ZZL-*J΍RWSNC5brfXpoRMr{g=92pv6s)3a_IqNU]`'MaAh֘KI ˲tCff.4L.: B$֋oB_WZ\qh)K=ol:^bq41g2Vr.!yG.'Hxo_ڣDR6;2G8\w2hyF\'q1WSCZbt4\=4q4@ր.u ~CVlzr;]_g$Qs\.~tk 'U.G V=5@qOĺ.P&q^YX1U]}c .gnN%(Y-NѠ&8Ydn#62M.OfY$_ytkeOu lj_ڇ'aK&xtUGF#!sUu+vEԉ@ 4uWʶW=Pxҭe89ER1椱Dbצe!` ^lľ'!nm_]q` ͒, #?ۋT %o0Z2˫):Uظz endstream endobj 461 0 obj << /Length 4071 /Filter /FlateDecode >> stream xڵ[[~"f8V7v6. $}J\I\ҿsRZ'q8"3gm33˷/zYnִ&+|VujeOou7(?o>+mVf0kxlf S_t;}8kV7{l9VXׅ%l`k&g ٢(xw-7\8Hp[C -7#OӰO+Լ! [{|ÝUH"7W<;Z^=w8S'2P?'gfJ2oU5 Gn|נF&h/o $񀳛E_ylLǍ4@#>pr=.=s y$=272Y흌a [VS 3̪v~>qT|>t1U $JYϿV@|ƟW2 NܯXsjans 2 Q!^yZսmێgdoˠ.:3:vGچ 2  'Rz-5-5GcQ[1:"Uhf.E#fBD=p=N] 5M]={))vbyDUg0v.73M6^ԀpU] #.2< 61sd.ȒMGR\>LH-vw^WG2Fu&<:lHҩEm>Zln#q1hR; b?WaOMhE:ʹ~=%t'>~㓃If2aA8A^m[rχx )'|Μ|/ Th+x|R_5F|stP$ .>ýS%f橔U~\9qL#wyFKΙ Wh#rgRMa#{H{؅h\:UV7؊,3'vqzㄉǐHQ\G#O߫dJ{l7ePEOzhD:M0lz)ׁ~Rqy.=T#4'ۡ*㳗c4P 8 rynn)m<:}n&e@%vcנj_8U4[DHς +m0zP%|.G7%HE l%| | &T?Fz/R0SV`2Wcng$]!٠ 7>ٷ|:'_`nOȑx`EXY0EfTڟ~ ~9a &rWv ewߤI2gnbbL$Q8}*HnO>m -G&f)®;w;~4o2S7Qȍh2K6U:d؟^S, |*F?ˣ?"eUe9Xb{ysu}ċŧnu| k|y]q)Q NI E޶d,?{Kdž'@7Ǝ8G QY ۂiWTTQ-#>I=fTv $9AY{Qr ]BD-g.Hry;>Y*qygAcJ)x> 7b v@D3p=%`-A?rHS{^:Z 1p)eZ 'QAMD\fB?=*<3]8TGTͥUY'g!jɰi/-/,?my6+ږ圿?-ח/ardTI^/5].¢)~ *5ƃRQQu$2JUeimf }@(&f 1ҴKn:0>IּN6N&; Z_ӧHvM n%"esǿׁl< nqmY[H*=O3ԔQB3Kb]/2Zr&^b 9W|h@lL!бu$4Wqrb_8A>2D0gDq(uHٺ"7([782UXWL=oӸt]t۴܆51nC!E5,ԓCFc 'E.$n6<3YJVn -!|QQ,l="r u "A(ÙTdS7Mv= LÓDknA5|Bp%q}y<[|Q+忕ڧc V-),MA ,>t̚ޯdTL>qԎfc*_K͔0#?_w|l,[_Ɔ̓cLƺ}kpH|;xwL\_]F._ Rbdn-nTxC'c.93E6Z&+[˻{=l`$b'+Ez]H3 V_~o87T/xG%=?JgIfӠnzw:wFF@7U)6?*rǥަ I+U]W!N1UɁlca@Gw>٨x|qE`(x](ϟ_aH6)qIo2ϪPw^s;u&KӴl6 VY3$~uU#m-k-X"TV5gQJhnJJKs&gGw}.:tMznX]hp\Yo4RRd.M~#0t895`ʽ-Cjt> stream x[[o#~ 5%mݢn&N`%Z^R9#JLHΜskTIscg1Gh+m Ǚe>Ht1L]gyto@WOc Om?R`Ư@} =Q=9;n<ar_9kU1+yѿ7( .:Da& 3L.k-ӫ<{ a"S<ɶG3 2ny@vt[Y!gC+]_G x_ӏIn V (U m* qE˖#E"T3,OpMzا&8T8T`T*`L070Uiz?6VZJ@멤I3 9/J OqDbh 0|62[M b.R} ߃'(e"Mp&TX!"_Mu6Gge\ڶi!f.L5@= ckZsEiq/Aԉs0NqZ#U`e%cEbcd¦,$Sx!{eyم!)ڥy ڏE_YȫlmѪp>\n]3(Lbu9y1Mn|?qȌaѕj{ @Zѯю! 1 b6})ruQkJu)#vS\ ".^+19G7֟2o8R{ !b)ƊJaTh+Wq0!)!9!/,ri)BsWa$IYP u<-p9ydZ}J TЬRc*8ȄӮ+2(Q~ACr ~)^*x5*RS΃y~]x8ʢ7SN1~gF~2y?_7`נ/K{Sn4 U1ȝ`){*m C1,%&Ý2P)> stream xڽZmoܸ_ T*HRдv8 j싻+' )Jq CDϼSf$9{=?{qQUV|52mJ|9yn"i_=I)7x2D,KUIkۡ!Ԥk!8qLt.j x5KjkCe:=\pͩǪNP{2+dP P$! jAvY6 jU2A".Qa-SaOׄY`5<.ucYt;l;OGaqÍU0wbx fZtGϊkԷBGba*;(:OD?w v;ڶ"zOlgzAAHZ`q"PtxE$G":ZW6:.ҝQa,vݱox`םݮv^}zIQ,21'Ԝt~o3 _ڌCjggg8ꚩq&m`+=6T 7E`dAl3<; ` bĻnGȯyZ$O8 bh>1sn[F_357tlDt@ŹPjm E#[Gt{n<`e#49;z.Y{}™AS\;hpfX>]qV$2@WkDz4.2NO@Yyeuiy;F`Jc>"S&GgBByh݂;B( ,EQXE t9 -_qwi[f*ÉWpG\ 2Fob3:#9Y,¹9!v)bƳYspgJTY+|9J5 `>$tE6]ɢwF3&"t $+KdtkqLeAL9;XU0T6)ы똧qxHs t!UXPwV6+yDsARdM!`"ZT=dܥ"#"(t%U)/C\.džLH1pSX mĨp ;ҼStK}gqI}p`r⪉ R ƌ gCGNi];+Hx-䊚k9@8?]-ƥ:"b"Hǥ_1ʤYU=n'xu8>|E*xL*fĩ`P?EE@x)7u|;Kox㓹m""UR?>ztZH(z0fR &Z9q݊*ͫKA>R\ PeKŸԈ⑊O+}R\w*OBwU+Pcy/RTz62OF&CtxWnyR=9V>=l1T _pPMs?Ys) i4atP͂zxpP{U 'rCۂSB[z.13;ee-F,\i}Kdk,m.h'ːe>].dž8sln.|᥾>tvvE]l ձ&;糀SAܓS۰C`n0/t*U7 f@q lZ^8,o +UwozGjt ʴ | kxwze@7Y=/+D8Ki ^|@._\%ʋXX472L 6RL7J4e1X Ye*r0)LnUWlT/vSDftKh-w*`CJy5T6ĞXi68{7F-BS /)y4%ϦP!js49_{S횚qϟĭZs[lʨmMWmQUn 0?V_%Ц_#"t?<@Ee&Tw똗1f2<+k j9կ1y]~ 5tRK|IV}cŴ2`T9ÔP|Fq"ba'SjxY _* 5(}ODQ{?.SD endstream endobj 521 0 obj << /Length 2029 /Filter /FlateDecode >> stream xڕXmD~"#5 H-PT!|>_i]u\Aevvvv晙EW6[,m,YTJ׷?-:L]eS"z4~# ~<}Yۤ㈣8c^e"~2`7f,JZtwWiUWB&t <3fp JY"*(\҅ӡ#q]Ȋm'!ߵoyóCJ2SBC~kZ22p_8qak> +[-M#7]WiJ\]Z15{S%׼IjpN cSW4̪paG-[R ǹA[Q8 0ZLװ]Jإ'm†g.G.׀sK%k}܈l@ue'1Vl}HT(GGkWz6҉!?rהP'6Rl~$ }$kZ %Q_Ečۛf|&ן&'G}tUA "v+2 C$\`9Vp`f,4~[7 sE~uMk=O2y UW Shadү7i6Lڰy0)4 6[C9& {H:T ?ԕuDydi L; m= d*Ί A MƂ͖?:{۵ 'zF*߳x4d5kaH%fXmf"S70P;<~v+0Z$ =b%i5`knga 44@³{9TfrS:)>$ î.bN4 A{׳uQ=V0yq]ŸQ) 7d](vYEN9g3:#ȣHAj/%UwK!cVj ۏ~?90g&_=S&p}d~9?-6@'5vCqjl7"F4ѭW6QyÉ!ӌS(=9]¢vN٫P LhXOq=y)tdZukoQGj4@aGJJlmn<>]rBӻCTGe ^ Yi!%;K\~眆PyR7rII{R"wyc/qQx $bdzeP\weo,hz'`JH`rRl&S֗ +P жHWf;2p|qƹdMV ͑5A i;c`@Bi7G-E4h]\?̀HFN ,?Mު'v8>CDĿf{WO^t+n賈u\&.%so19/ud~G1;P͐NV𡺎{? KXhc)tW@DKt:# endstream endobj 516 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/mixture-regressions-035.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 525 0 R /BBox [0 0 504 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 526 0 R>> /ExtGState << >>/ColorSpace << /sRGB 527 0 R >>>> /Length 984 /Filter /FlateDecode >> stream xWKoG QB!fޏ4h% 8Wr%%U%wkHo9ku~@RQ(#h0DPZG8>,j B@~·gpIc'?wR;T#!ѠsUG*"Ǩ+"6cOC'7IzЙF/ * FE>U(ч1-"*ArPҢ9l[UeF,)|A?ϰޯ}۰ oQiOsXH ,JKudSԴxIUW<{s%\`>y5Gָ[Kƾ=l֏gZ&%z7?E.0! ڡhf/7e=7]ēN'Ӧzvrs_Zjo'Ӱ$VrEPd9 TV\ceo MM僤|A4|2AFd>Ȉ #*dD惌|჌|2"AFT>8| ?]Њܳq)Wo,+te3F:B[$8Umw(^qi 8`(I TO $I?|R/|LBOSSP6z RKت%ZbB)N9?4o*H4Zg(!(|)NbP<})N#Bh4MWKi!XA\Ix uFGn^EI\]%D-NѕL$ֿ~\MkHݔK%+ =}e%Qz(\Bm&W/t{*ׄ+X[p endstream endobj 529 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 533 0 obj << /Length 2310 /Filter /FlateDecode >> stream xZ[o[~ׯ8K[qH i-ŋBR_yH Cp˽~,y6xɓs/3YAdLJϔ3eq&>|%`_Bq5x{mf$SgCδCP!Ϊ{<2?x A'N09WaJKN'<-EyɤTSIX[[U=P<)yoM \jРM4|WaZc4h%pEa$gιX"0+cUQX"mdH`\ $ -0=oHnHʞTϿf) G/$:؅"xPWi AҢ-_b-\ [6p,i*QbyA-T~J#r1ڀ~?"gz!]!1BACD"cOa͙1<ay=4ct@' C8( n4AhwР,s+!].фuY<1mI тTD|9h|7m7i+DucӦ':hkeצb\L. E#GfxO*u +Uү˿"9% $1e8&rM "&kMF&oỔ YP}9qѴQfئ=YG R1?-DP@\ȥRT$9+ţ!Xܔ^俒_CG5(.{swJLJCu# ʨ;OQWi$ 3A:f*0pr8YfӝÌ @_;:6$'DYYT:%G Ry@]ǎ749ItRZ]Q@ QsDrU8%BŪ~ymw~a^=J~{U hs*G9;*I3xSE2vB:㘗t&]y$_b%q!G$ ^;*[+ZɊV(sHS9I)NiYgM,)f1G߄\[VwH,;!O'1j ](֍xѢdu*j(FFL-ΟF?#yA5ɯc)/aCt7'7a0I:v&kۺqiX$ZoZ(U7-W74ZBaWֲíoB١|[oC:؟h>gYvh :Grc5w `zeg?aTݲ?g=YY( d/韰tc-2)E3 'o{qߓϝu߸c֩7$u2f`+~\lϙpٝuѤ 82Cׄ!x5MÌXl-bI˸E_ C 3RK㗁Dn{L6Gင%Mz=Z v|TW. A1cI|j¿0'V.ѺMlzIq:VS#[Wi8ME)kE@E1;!G8E|QYl7RMv>Ln"c;,߾#mlWowQ.#iy2mjx8OqAmiGes8; !_F.3}ʋZGma,"s/Ҩd&iX4&=)0 偵ł?Eg Z[IuyT9&W<>Nl/n:\,LkXESYkU<(Et Z7~3HHpZ]wm`ʭ>8g]S73{7Oq>;&3ȍ[~DkYK> stream xYmo7~AHF Fm-].IMR$zǏǏg3Iha3sE~"< xzV; ^Jx9E8M D i70Ih4ldyi|" Ga 0c1x&h`J@6hE-L# L'=1*0:4xLYLfbE#8 ) QL3Yc,FrZbagF} ȎH@nlFq$6Gq9/|NôM7.3YnS8~nm,g/j#|٪0SZ?GShc8^q3uz?N?݇zffzY4!J-"Ig G#ĞM cؒu;6z2P-/Cs'Z·aeRPNZBcdS@jP UڝV \q !8C"SV_=;cK NlQ#1 o%O؊[qd#@lF@ףEkH!"ZxLdL`!(':H>jM=NףlQyuN"ӹTIO4\b6yD7 $)2')TD㋽X~{M8NMzv U *ݖD xJ$(68 _?v 8m&'M1ϧ+h02YvBYSP8h[(KH\2kh[&c >xɅxG4 qM\="^guq2D"ـ1(,u(B!.iXe,cΒo;Jdm22\2B܈D .K(R!.R_M%v!Qp 2$*:&)*Z̋>㐷9(w`vka_w U-X˷Tw**U⛰Iz̜5EElP>%l/ u$Õ;@}G6 fe`|'$䖱]u^CߩC -XK%GD [Ţ<[uհ:_TQ}|PuxˏU`gM282j 3^7.>PD2!JNZ2śa^ #kܷ&LaN.WfAݫ1*S||7Ih÷iT4}(L1*9P&K8 7d8/ KӅKx|_n4ݻ,i endstream endobj 563 0 obj << /Length 1881 /Filter /FlateDecode >> stream xYoE|,vE BHm.6#)8 BDC-`499<,]f0+\q=IĐGU2YsE(GYZ1ѕYb|~d [a̺  83v,+u@hi[=hV7B,ϲaܤWә‰0/ E~ w;:us`X(Q>kw=Ƣ{?[,. -oIz4>z56^ R&qbA=cQb G&+PgEd<ZlRe^2=jyؾSҧ~P_Jf`$Ots& O}ŔX8e-/ŇפOC atF{,U{+eJFʚ%'O+ R(qamo$O+iYљ)o4DqvS|.h 9^orTR8zɻ d&Gc09yC2lG'в- $3#'~fyT5,i}{+JoΚ8m|ٷkiuFw{N@#o @v]͢ ;ǩ5{`]]?.oD&k<ʒHVfV2?^IP yԫo"xc# =$8ԃra/ſk^I?>58nf'tX^qcǿN..&*휥%uou!Y)B)P[9/ +Qr*BDQdaq8wȱJޫ؇R pXXԪB^L|M`A)U E ?4p N('P wX\خh Fx (6z%jٞtr\R9Fmt-W4v)bMM\2N qA'rImnEЎToQł^_wԪtɾWh&iә%>&u \}[Rj"1Kߚ)k=X'5(#Ǽ=4K)RxDŞ<(䝲T*^:۶pFfΣͽS\iC@4q H&RJ elZRnP/и]IKgMŢ+B3r<@7i~2SCs7H885XL$*){IR~/u?UٞE?ZL6IW~? bz+__gJ&aaU8Q|^̱aSnNT2X༴ArGFir*Ny\ \\ho*VX Z2%iÁ> stream xڥZYo~a<\v7G$kmgYBd7D+CZ?䯧nrıeLꮪle/^]Meg&K6U 3+}Ϯng&ڹIz[mfp%o0fަ.f,+_j[|)ۗ8&oU&.pKow3erC޵V xMZX[A/2lfp>G [_ŷHn xz#7;<\mݟ)I\;:YP\4eȃE[E$2BwUms#*%+ WڎG4ûc$Ӌq r*@d*JH{w.tf11ŦQόu-ǃn{yτ:7yz+d?wBV K%i'nCݝ" Жa;:օMj33F+dQ|;|n0b`/t d{݀Z'_F2[bZa‡<q=7l'񴏞#X2( lg::Ц4az;F(nJVW)k"w7{pD ,{ܲ4U++ˬJ.:AG^\z>7AFi;RKqn jQ頎#!u~ʁ;+q<'C1*A#P=| B!^{w!2 -ʾ6[~ {~|M]Äk ThWg|K6 X@#ԍA`|(uF |IZ5rb9W%M:`+=wb}04.'[X[TNscԙ7}F@η\U`BB,jdYF'fCtFصxCApG-#P->88Ya}bSaLj >! )4/ w"(L[ h9ǁS#{evS:n6| -&ISU0 fa^NѷuBή{ l'Uڦ !y:;BP w]?IoFK('<;ML2l"}3V*43cmȳI9#*d=UWiYHQY9\I?.C" ޾o'[-L*{LY?cyMӸm2 nWusEȐdn<5.]sqֵg s;2j"OkI՚ һ8oX̀ϋ( 4ͮD4%Ŏ7qEd?ao8:iڭdx]t`Sʨ B쮫2rrQϯ>A4R_HdfE ʺxhs(9#;(W5\G[s 1 ,\UŨvJš 0Wl-QrjFbT>M!ٓHX~2Wо)' f>giT  =Pk5 !2ҡviTuА/O0nzYD'$,H޶*J5vEQ"PeQ/j\"f'5BDc+4!E`՗p;Rrt;-]rcm%17D :R 6.w_,9i1d͑蕆 BY3Kyjoør@$]meQuZ,zA$TُR@ZVs$2Cԇ5A\fNiϱߦ&$î)ioCV}@]lKXˍ%AJ&s듧cM)Jl)" q,0:i&>Zͷ$Dk+&RK @*KYf Cd lGց&=`-uJ77(wX2q/r>ϯTZf(ی|iАn2(Ͽ%6c\O OV86 jKU0P|51OhW#pSN9;uEB꧱ܕh.=:9A5aO[$⬻?MYCs|ͷ L,/yC.ΠLK{Yo߱~vz[]Z8z š`5\G/52l$3Td1R~"OR`AX d`&~&H6 ]6'h$qrRWV1\MF 7?^~@p)R$O[! endstream endobj 579 0 obj << /Length 3224 /Filter /FlateDecode >> stream xڽZKSHpaCzKz:vxۯE?GT2 sX*#/,Ӂ9y[-R(nAfvp3+fU-z:c ?padgy4і{|kjI $;~(KF^OUV:nV[n8 MAY c\<]l=B:9Ky)=6_YG%V#e2`j(s`h14L(#T<=A1 >* =]X%z.oÚpM+2uU|_n8t|,ՈNX ES'jWJ*qkBNRm_gkBvj]ein#O/N,3\l J+ǯCHIn ]Ѹ5hXf&hRofTQA %Xpe6M!VO[}vx;pm{Q2py!cP>1ƾ-$o| `'@oo7D\Sckc:aݍn-#|¦C} (eS}Ot\T:.A94K+r`e‡.oGH4)S ҦϤ!pk7S2@ y$=4kWA6;$ca+ hlf9,Z=%T+uv~nU*\SbwYdPKqXjhKr;04G4a2_|v=#iʏv̼OjC"縚Ernoi)d2ڟ\:@ڽS J_a9}ț/ ~ag~%S G!a%LO:qxϾ^{2i>)KL{Q.}(.seSɻ2Tt^C-@_QsuaEpp8wZ[,7 %|V5[УVPժ3tC< o1l?يg$ aVEKԙ.]j `HM)7ʑ{Ñ`Ok1Hiz&MMB1}Ƹ/#d DӝտwZ_+fOоٮBQgƎ^VJ蓛W0!fBEZA |/InU5E'qrټ&#"!"ۯL_T#/6˃|q~n,<#2&̸ cؘBKv1wQ/( p?*˕ `H/ :ۅCt枍k"* B"G-TLv-l l d&^e ΂4Av!ޏy>g+;|1~:c4᫜:Md[eݪ4ыx,)o/(#1G$CȄ:Rno! 3b0u'+t"ҶY`#4tA\sy.j' vZNro)nES"mwJPȄ2Vj,9I ݻ) ES\]4Ev9ns`T+¨x NZHa=<%nGEcZ `DT.2{'yi}ǸɂpSɓ +)-$_6)wXVt[Xh&l˧ܳQ gU@P޺^7L4:n>yzWϸhc?o!53>1l> stream xZIsFWBI%˱$35,4"زBj zo1FœO,-B.>;ƍ.FNJ̗S'Ƙ.^NMF,'AР ;joa;q0 X䚇eӴ¢ߟVvp$8$CGkhb\g4P&UJ?J%P,~-|j@ tPTPLT2DJI) :|;_*IJV"+I-NO@O.Te`v^9tp5O3),$5ϖG9oO\[Frw>VΦ6w~B;\'`'ʓwpYJUsE `hMDfw[>-ҵE ^d<і+=T*֫x$S!}-op>@=Ϥ5WKn&iʙ,Ā#p :B@n зj͇+x/ܶgi.-s&!+|N7K ց k-{H[Bco86􌄇  1ٌ@j@^o^ \̶o-/NjdqVSDa ?,Bt/FP 1뒅5PF!Lgu;RB' JKA?>w&7;oWۢM`l4P8w*% [~PMi4/ tiosFWAԟ;\ GxX/yuևs N,K~ŗJ^:vZUt@hl^<+<o4/#]78AvytJѥbgp@(WHu]EC>G|GnnH.ܽ z"]tHW4l䷼p)ZEg,?(VЈ,Ei,ZlXcK{RV/=3U;.NhNJVoBKb0 \i`a&зjwn4RH{ lћ ևwbr\sx1Tu4=WV\+iaC僮f9X``ۊ;_[v`"ڦD˼*8'^@,}jbhٲkӂ0rpU)}ԇZk֠̐X*Hƹ8HUٱ;Br!46&^' t^$f^H0e "0׺lgIM v+5Amc6To2Y߷c2}`>Bָ$'1Y,J]s aR r0K:>\běHoMϧطʱ#W1sX~VHEvat\A9Pk@p1` ) `>p/G*>ǍVrHT4[R*c웕_ k. uSv}%iva}1FPpjd9gYvdMIXTGQV~VL]+CQX6)oyW=7|8ݘ悔7d$GqH5GM:m !]}zM(S5,զㇰQ.oY-qc#Nlk9̯뢢x2=emf}d{q V endstream endobj 595 0 obj << /Length 1949 /Filter /FlateDecode >> stream xXKoHW{XPO>rˎl#= =0-k-KDœa֫IJ=$6Q]]WԣH>\Ѫԥ]ߎ 3CJF?u/'2E2!4dl?~?Ʃs6<.\RCz[-q%žӢs_4n,m?%(};S[7h@(I mx:hxZkhh*>q^8t{b9$ 68깁6s&KW`h^Tw;le2eBՐ: &r:(jNIOZٖ ,(3M dVε(Sx\S̀ d:uE+2VH5(ΚuJp%<]7S[3 o 2l-~z[4(-N ʫFtj@XU2|c`'|iQV!'JC >| k!,J }v AW:s)zN]EQ>::eVM^ιG(j;1/,Gq\rx"T$sYݏm߹MhېjЏ|M,}r8,+؏~Z3oHْ@d-@~긕 THπ\Csud"rwv|ɩUNe[TXɗld%HLyJU gi&Zcr H:i=A`>iYx, Ldb#Dm t$ѬnDb}xQ?c pz5 c&2@t?q!/v%$jx@4%mՒUg2SxƇ?TzHNeYϋc~a\f-JҐqz*7+|Yp:#+z%BǓ#"4 y75XG%mK^Әoø4lMb u`bmEO.vIkRH{W^̹b%3}^bFV[!k"+nv0PN089 ]k8SHs)/Wq/B<|Qw-D5>C#Tm¯0k8Kx:o7'[0タ'"md>K.Lr#(1&((`=gAC+2/ xN |^J ys'iCvA>Ptl$o'\f YE{D6^'2t]\L@=NvX7{q@^?Mz@C`6vB3tk +03U~BEr?.Eq;o6̻>%R*iO|fHإ7o$ 9d7]-jڅQL<{>I$*Ji%7ΫW판Oa 2O8vIX7U8+me~%sbyw( endstream endobj 558 0 obj << /Type /ObjStm /N 100 /First 876 /Length 2311 /Filter /FlateDecode >> stream xZo7~_qI FQ'{zwgAuDm*I$[w=rÙoș!WbU29ƓG]ObD &DB 9 B*2ätAG@R0&}lA䨵7šNxG 0/`,c}L f .Y%!yX# &}%AG*:< x/=ѳa"t X^CCUL!x(@S>E WF)nSpx'4 P@&I@Ԙ 4$*!X0L',П(D X 3bET44H&GR T =I8+ړ!P8 C]K+԰0{È-=L ʬ0hڪRb8CA%^PN6pz]I`Xӹ I1&:X%U$@F4I$4dbF1(W,\O\`ggLd cH6@'~{/]DȪ-[h%De7&WPFLV/y;CnuƗ `խ&6m.9>6)VN˽ylAԮ Vˋޜ{5ԛ^aӷI%lI:|ҝ.Weڵo7's4]d6טm XʙF܆i 'ϣ 7`ם"Dh>18na`ܝ,KpNdAuRmt/_- żl͏Ż>hLF0sD=xeI !:fSz=gM :(՘ԝ ~\t/_z\;#=,"C6v7!؂cf5<^g'gZ U7ˋl1xy#aR)N2+)B UCL2 cOaoa|8!MbLpzcĚGBu,Y6CpmLR#HQ_)A-bzF&ZNX\h&ZH+l_GYl" `, 6|85eMZڻMFi"ggg H `5?UϙϳD}Nֽzэa8 wcXDLaDmŭGos9c8Ha;es"zk #'c!jS1<;%DŤ0hlַkYFEuV3REB4k^CEXj|GD`efҋ+':+6Q{C'T\ =lFnf_/wmzDLGZvgx^GvrW~2Æle_X6mr5>_ꬲ=U'_f7pN7ySZ|dX=zsz:s@P}H9QJcK;eAV''_U c_Ƶޅp7 Ah` _UUW8|Xv\wTH҇RJ"eLT/{I3kU^Ӫ7*m:1A$ Am*MRY?޳nR8@ a^UM yBՒ>%mK{-%r{&cuw 틬{ixA endstream endobj 624 0 obj << /Length1 2204 /Length2 15869 /Length3 0 /Length 17181 /Filter /FlateDecode >> stream xڌP۶ n54.;w'8wNp<{*SZc9א+ mm"LFFzFFf822es'+pd@Gs[8 >lNq6ig+ ?Qsc,=@G&bk`nj<(L\\F6Y'3NJFV%[#s5srf`puu7vu0姢;@1/Ñ+ٚ88+s#G18@IJ g'XZj`g/"2;`bnȉ;9 l 4r7p1020{q!s4r0srw4K"_4U189?QsG9YKscD;1ؘ;Dac3:9ؙ@{Ȍ/zew;ο =l&"&/8OG oFpLLcs#'!h8|s7G1I磽mm} *²24(OX I cfc01~,i J٘Gg.i s}Z Ok31}aXߚnHo7>cdm?Za[+r2!SQ h,oddOcWkƬm]*:&F,#ˏ!v?/)fcdk׀1  ><>&w ml>R&p';A/? qD N`/`0AL? } } _"1?c*_} EЇ""DZa0?́@ǏOЇv.>d_dc !d`Wÿ?L? Y?fngۿgPe/QY *TVH_q:W*Ͽ1}OB@aw4$|pd|prW‡. \uVZo& 1~n@#E[# Z!]1;7ӶF /^z3p?1N`T-@9 ]H5 ,+԰-V/'7^&r#FtCC͝M(O}Ss9icRٱGu|S(Ekɳ8jo)#DWcỈzP{# ~\hȡP_G#~49Rk_d L' S6820$ϋ.$as  1O2~BN2+odݘ1! !Gz ÍU3iP[wwuk?AN:ٿ )֎{HZuTesOO;2-fTO;|ɶreEkxWI'C# x89\\ BoE\Z:xJpUC$LS%3y ӣ`pEl,F9()DHyaSy?b{kf)EW3֭Z*ӊF BF g Qm6ٓѕ)\ R7 Ѿx5 [x 8{i̕EQ+_/Wi}&Li|dWڋ[^*J쿢s˱;Xn$SI3+[+VO{faS_ԟy{: 9J@qA-Y?PV60X? vE M1~;i}cՏa4B<и9h(Im`dH,z҇ؾ;M׋ `P)9C՜X<M ^Z'ATvW ޹ 9[ZqKv|:TR01ِ%^g< <3)o_Hڏ8{ o2ҟ&¦ԦVAC31-+˓{FUݥG2| #M#tW's+#ppu#/ fzKѕ^yk}딏+No 5_|~"fzf$MvȉbQy+]U:v߾V\9-Wtu876Pp]";ڌ߂2w'y&xv몧Xچ:ll~LPՒ9^n~|\a[8A/nt 3CͩqwxAg'.mi-Vp Lv9: uawXu'YNh|DU:tTRLEHҰ7*s2޼C/ҠwAn/pʤB_W8{xMLn< 40Nu!(fW~&Ky_7"G] ,~RNsyi#cm\2_7}ˀS ҕ?wL9"~2],H^ bTIȭ1ѳX.U]=@95]9[dT5J50<9ʄ[ioL+Jhf_?0_15=qzu?AJ;x4-1Al~*d\Ĩ*qUIW7u38VVqYr*46g9nJ;^"gĂHEaMĬ]DL_ _ϽKi`Q=XC ۈ; <ԉU71}e-.6Kو&鐗/ꈥ U;x4ܙDkK" Gu)~ԀLBonkzyL6Sx; w()IY~sIaI~= U%Z n)AX}4;ͯ9+ @E$R=; d:QfW$,⛘qrw rt!2]+ũ^Vsnz`LOV%j3*,><[dg,E ȡUxd}'ug0Ey X4 7_`i0*XJu7ә:xMr$Q#AcaqO"#fh>(▔gȣ7~1(Hxpa%3'G))J9g_k%։2 :936~$}_v*ۚ7+V'L܊mηgBgPzh7웎xؼm7ƠWZrD `Ǩ1N럍ÿKr]đt/]<?W$P&k!8+xT2S[$k6C: k{F [="Baꄊa. =&=> .$=9LI=׃KJ(+Y|z)j8E0WVZK q9a$5'd?s<^81ԭH{Z!h ]ql^SۿCP`]'q_Ryiֵz'^}22|'˴;M6aF!}~:$'QrnEjnx{Vd-Uシ/ h_KI֜u~x0VQX\y~M%pɼc !s콣ۣ*k9JOV/^B m-K#ں^J3c+Z*,4R;g)h/qE^"ίhDZ.H&5Z\H߲61tDp|AwPWa"#0m"ḞܝG`v!9kyc\sD!`HtLx9=v3S1e33FKikC닧3oǩ48A#0}?L^{"|P@*n-xGxвݳ?&,NԽͨWCDfy> }P1r)<*yoy'*/y;Ood,!Bӗ7{b+!+h6 _֧~h+. ՐթOA*xΙT(MM5/z(~xJJ/.Nkx^(_~Ey%y7CN^dl>Q/Q,A?2៱kLM{/B;хU,CG(Kv&_h`SK5$˰8*/;KC6ݗyw'vB*qs9UbKi2c;])ni Y9)_qr[B^-bǵ<ϋiS  9$jm"ƪJlZ<_U_\*sʄ28eo*넟les7طiL6+KCV#&lXcS$ԡj n-ۘu-z[ W%Ud!i_ @|Ÿ *AIV *7#s9uCiyM/O[cdF7wk2`0GMQ6G-h<. z0YҤ7KXsx=;32v'f Oxaz.shFLO#|&[;xw rCA 1m>ӬYveD 5햀pM!%#Hꬄs{11_=~5WЕBOq{1"2=b1UFՃkpۘxrA[נVt@V>t`\h.35CAݽIbd HbaQoڪJFCGR!%B|Yp@R_J [&0)U8~R4(IUYZֽɫ{\ѻ7w }* Oud3M㻈 d[) [9#;k? f7 ǁѪ5ʖjŹ8YAJ|RRբcvwtRMD:Ƞ$f[;\ϗXRh;Pʍ1co#_xz6̂du?ͮc>i7a]MMϲGqtzEVf<0_C[O"xF^G``r̟i /З$Kʭ"2E\>K#E?u#gd5R9$, XE7'#uAL-j2᱇~rVz4:GdPBX8>qWì1ˆ՜ nrU>覡2hBu]4]Jw/ 8X_ΚY eEÉQ Jʧ8!AE\w&֧Yͻ1Ξ#qU#ϯްF>WKvmm[0K̕w:MgE ( õ-b8%ApwKLx5'|Jz 4`qبaSݏzqhX(7#@m UD`9 @Gp+€v'D|_&\Е-{+ yW`1h=Hbu|,r+ EzOK%qnV|TCI7fzF"f0Dxd;ϷV)˗ VWـfDE#5wLrV>?x<ydj"o;R^4Ql!5xfzѾ)ZH~Mx Ŧsaxk45OdaWg"`:?$yya2h9gߎN LIQVQMX&"N,В*L5߈6Unmm.Uɸ|A5dMWMJV{1) e*nܴcƚ"vEد5-` >cT3!/:۠ag5|!`kRL3Ɂq&$#fAӆ/P/'=,[ %j{aۇ<ƎW@o^K ,AX^򹲥HėTgݩ.FoN|HobJM%`ؿ$fǖ8X7[7 ZʨY>oReR%QU aL>ݝx0/7P .͛ՃŇ#:q3m ƎAemHTx}olbSq_zb%:*vn+QJ| #~Ko4:>D~@1MJh6i6hfX02(~' Vvx%1P?A8|;{lF$VCrog!Vp]Ldw%y /OUH߃]ժ-!dZ]b8n}N:^;T vђRCdG}M=Y&ZN(T%AZ-avKEEd䶾T-"#L+W]6Zj|b6x,`~d MB.̺Hŝc Tc$xKyzRM Go ܍yoKEY}u鰤_ M{ϬX!g͑]D#K3ԽƼB^LP?S'0W=f4B)9{H޵8OIĤ5)X0:,H/BA+:b2E_׼RXK7R(83bܤa/zhfć:1.{juМbNՀ;9$Q$M5H;)0&]'>5QrMA+$3m\6aBz2 22l+lqf^qK- 5cA0R6>GN8\J0UH'$q & ӈ=SX(Uy!|;-DȨqӟ!L!3+V%8i8ƓפQ Of7+}U_$[Rx!WTj~.@o~GcHB`]s ~%8YG/p`` } !䅎3B{ D2b1Hn=1,c(nq;0jX~|G(~5pl^ :ߟܓ#]MoNmLBm%#L-z^;ѴSnx m9o1 !2Hq!^j]3 ٖ{.3s+c+78& ٹ ׎dOx/ ~1 ";z5Ç!Κ/W xj |弱fҷqC&XMeeСDŽ_eJ~oM3T{n4se4_c8wGÒBċ3~c'L N ܙTeo֥e@tx]Ն V_Ȍ2S/4V#1+q9LPc 63M M{Cٞi3W!="ISQ[[]iq$W.S!4dGW{wv(UÚ~iz\n)g֛- Hj{R#a6+SMAxuTsJi\J :`EFPUx=깶Ta1H6Ȗ 0op4+ 2&f;͌,3RHso◶Z\[ۖ|vŝw0nnOLl6?ۙ )> yB /`M+rUfKl,2i麉Yz}N?3U;B&ul^Yt$Sn qX[.k-Yo {AL'}juOj';V,NR XPT[Qt?}SeYӪM؊[#"O$7WDYObF&0:x(%u 8o~.MDצ$kYTSo_:ul<0}QDSCwQ ,}OK,hY"zV}oa.}!a5Q灢Woܩ>l0oI[QH0'ڮֳ 9y86!PG gJN1g'6rUTvk.\э wnCm"-p&J&'!yɴe\0pg }˲%ہ_ l0] `&߆$FX]kHa KT&9+4ͥmt-(>YiGKgOM1vX{=gpu wވK86Y4 eRPW&EYd[ZZOQFtgGAw29~s[_DPfei`VPR=JB`!΄^彴|T]7=a+!>R2jOӏ.7I#¦9cWa>s* [K/0'te[cI^L[PXuO`ȕ`P8 rҁ6S!& U/1ה'[/D EJ!Y>gˠ*EY&L ֬IYAv.uK,j f^Y5nZ:XQW.mb%msU”7<:F'Y?gEdGwXsPT"2Svʣּ m5F#4QpWjN'>}¿vI+~Ο6~zΛFx@E*8KSa%1JS{`j >@+硫y"=D}E5MkJyٜjx 5=]ןTÔRz^f/lk=OԔPAWL?Y*|0'FGwk4aרiI C[v2Q;֐%^2=Vvr`_)?)x9%-nN^b_0JDMjG`h> i+S}_n\J4A?.ܷbS%N/DyѺe QvvzJɕ-N{"5GЄOۜ9T i%x&sF =""D#+SVݯL5^N|&(ޮ]Zm\9=SRG:*:of!ok˩*~0{ƺO`؇ Vә\g)<"]iHQvN_IrٙuVѶ~|j'4/v5ǰ?20#xv-z>fał#:a͖zUx"/@Hyݥ'xb**0Q8Cc?CB-+ݧP!_bt\)FR)L2(AN؆Oz rg=%j,3FCi6 A[|L^T"N]?%T6inJ:L5yqQl"}z~ӞRc8ک %WalJ ns]"ܗZz2j&=V I.MiIU0ʮt[dIo lK1+8D=qV.!=OU>L[BtK,YG\:_$^JR5-e` ]V[KDJ0%$dWc6/N"rs[.^543C󰐘jk_)< <(3;bHS[)pT|8r Ht]_!ViM;]ś[:% y6'QI;!U@jBlq$=5&{}}Ǥk:ڜ s ItJR^v/ [0L`X1"Q$enZR T }Й nnn"gEOԯs'dC+6yPGspbb(bJpP2b Ljx6,O!q~} ]{U#aэvF<`X-N.ȾS[m8ԶlcgKji)M<fCȅI~Q{,-*޴+pxO3^R^82+ܡ]?쑾 lorѠ*e 4J$ *~^Fp=⨓L\gyq̓!^]yeB̰SI3rij |J\g=W*x@qz>0=oi ̅Ȯ yGv'nH5rX乴Ŋ׽/iMuK6VIg^86w'|Ʃaf-2+UiY .c-uzR7!K6FPM@8d/%"c#RЛݍDffFmdN9,5ƵhNdwe 7U7u(x7I.+3vM\7j΀r,G_$Nw^ZA ^I.!ĻKX˅b-N$~UtE F< +{LlL.1|S䡔/O.,Ѡ/%p{68bklY5I1a >݌g_Gy#!?V)2\7]o)hMM &}/𰘜ʝ1B~nx0_<3sszu%p/='Dz?$O"CVrKH@(Ƨ:g,?9uKsRމfp_Y>'Q . Q+UO+.Pg p^ Yz[:bj])F ~Vy\{',9mMc|h37G<]L(2BC'qqX_ɲ94Z"Μ&IKs%痖ÈBT- ȠzB/&|un/0 5|cݕJxeZA fק%?VD3d!uq]G/ūDXM+{f, >,.cb,^1H]r>;ۻΡqitL'1W|DJ9PY?iQ(YF+f8nT=ۄD{"Z,b16ꚪ՛zoDhgi"/sG#kW|#LeM^1{(? n]RReStƽEDsA}|:rk< ce@U@gO]e~Mݝ)AՇbh8[/6-![ k;-6!vVn KLo>r-Je#2S+)д@P YӁqNkboDZZy6O4FVCI _`Sʜq)F4u*Z ;AM{|,MmoCj) g؆ Z3@(P,پJ%h@ f+_?ROa!#ZQ|zߨ(Z.GXIg[r`G:D'F:w%qT"|paTr# 4HN$S9`~&$a~{'058մs:ra4;OPrRauuBS؞Cun pݷ5r&v`z)#L* [50\_ǃ~t9ίŦ~,<8_HE\ a^ |"Y t=5o~ᱭ&6H㮝W}GbbWx$0Dv0'z&/0.2ӳ_paBD~*#@&ۂ%>;W$Wp7euM򓌆vG!/YoJƅb?r=sϋ_gikJv$Z5 |Z_Z,!'Hjwlx2ceΦSֿ_hg?UEu eU4d/EqWIV޹4`PqV9r;M; ; X4%i% AT@[(Zή&2F6Gpܖie ƫ "4/&t݉'Y"7p/xQ}..d.`q_Ű,SLA{#˷OQ6 ! euȳ}Ƽy:tLJ!> stream xڍt4]6R эc FafDoADDމQ#zAIMyy[=g}}>+>-yyA  ?yA VVDp@( `4ƧFcZ8 "   D Ep(Uꍄ;1!t@Ap@ v`v}E{* vA"܀' AQP52 v0p #О`$8a(IqBfw@_Mx  9_d*NC W0`Pࡲ&/ ᶿ`gÜ6.Lg> sExQ0_3*9f% G~CB!ssNp'o5+!US HDXP/߯ ]ܘ}]f ?#E=?-~~A6P{1n_60/ ?0[W̧k"g^/aGD0 jp; Wse?`#B|tc*+#ewgqOs0QCIWl1549RyAmu`h_toKh08TzZ~buA0 !(F^8I0v$МO%"ѿ-!O_y~hDb$ BPr9ZOAQ5T);[e// {;HgWd/|6T7&6[덬5L*WEOc wgtU5]N.gWUWL52a O<цQYsl2ƨoy8oy|>85tŨE-tQ dg@FsƔ6_To&2ELv&i0P#C y҃4[eyBґF!m>cok]b)KoU,䂅^?ۖ];Ca+_B,8AC)喌|vX,|WEEWu]9qb>/I%J3xfSukCYM9e0UX0ZR0V{(o= 1 !6H̭ыoE23;A"U -FZ ɼ ^GluSL45sI׌ή 8 $YCkJ1+kwsX z1}ѣt#lU|1\!<F_|rqT#PGu/.y[yBvqW;kah:h2T.;;^枮[Qxݭ1p3}-e:1'NzJt~>ŭtL |4{x#r"-2ř2{=%8G"*+30]v pl<`M%*nٰ.n}Zg1~>|¬r"*TM; ObyæbW7ۑo$6E1,_kR9|drhbiD.1M7)bط$TW%ٓduOX@~~Sry&!avID K33v1}=zηBrn}[orJҘ[WZFoZkvlĞX4}7]=f\JX룴rnU*/i-Qp.6,&tO eV\/+.*{po&:B[Znʿ? ^0W zDnuX1FN4M1EAms}xw%[A`"Vh1.{_?e{V)RM@mpvI Y+scΖ2V-dŘ*&͟v\I}-Z?b~`u9\+^p7_ژb!UW[-ֻA]TD QǏ8lteص"m=*u/oE?KC䏺{fGP uGH1%r oXzu֎O"waI~wDX-Ad;Eγ1iΔg ὎$YdwqNK3)Y3!AX>ߦmGd7sW̺Tt$6rsZ"~?Kޒ֢Z!kĵM"yyS?RIMyqr7pY]5]2bV!#Ѽllƍ ;c[N|ӞbO'Ko +} ɗ+P SM: %1 ? %/[uc!UeGdN ݋'߻> $Z#ƚb 4IwHuD?f s&UJK5~ݫ}v/.3v-88NBU)~`h8"Ty\R6-Xl<M\W[$3[0m>[ҝyeEf Y$ήgDΧ'+\eXa~#O~XfxGwl$OhEN^~Bk>&)'kQ 0(;ܸSas`%IxیN\'Nǎv"ڢ8zAIƇz$צ0eőt%FV22o᥏g J`f@#|h%m)moJ  'qQFh`&T?ѱBZIg0-CRifwqBu#R_+D 7 䭱uuV[dKs?zK|6";I=U#c 7CA"VmTqgi_Fs9S0W_ IݵUϑ8ʠR*(˔E::j)MAUOeƤ=)Ei|:U7-9AuJ7?{p*ݪžX%P#­E2)748đ!4OtzkXRs4xxue0h#7`JLl𾈶.&FˇbVII)'k3%:~tNw^)_n?As\x㘟j&*&מ*XʱaM #1k2=8ˎg8.5WĎ~jy'8n1s( c5g  ƌ44y0Xs--䇷VҿP.)u%xKdOXӵ Kr{BDteLCh}M2ׄC5ofꝈXatDY>2qC 39kϕ4,mgXۘ\Gjte{\Lf[4z:2yIM\IbJT,@vs,X [[dC]%~µqjN% ꅓj2k+WOw;UDqTB ֍B;6ݟ|A3&oeC;T.烲]+G2}Vkδ >Ziq\PqQ࠙Xk md-$S4t{`[NȬvHjfI-O 7Gq&z?4.VV$e7Vҥʅe7Ȣ~ Fi>8܌d'[x@sZ;7@ZIۄXGk}Sу$^CH9^\\j},A-^rʕ9h^~RT?̛Ӟ/i`ZdK Q9$A:/=4^̼21fQCDƴΒ-C{ZCn)=( eN?uWkzo[]:L՛]~7!۩qgW5^qSu (hdPMPCinLm`$ra[n&W>ݤ!L)A0 (Ȫ))$BO~@c[﹙$qU#N_A_G 4V9)o1M}\\oڣ-*[m^}&M/}4oMZhx E1\b iH6eN5_t\׎w{r]R3~\A~ÐF߀W'W?)fOIJ>꫑J -q#cWvd"s׿۸Qla[s=ez߳³=+Q3;RK˱J@Z(,f^Yh_]y+VUOknFN.N齕QI72 Yܘy{Ug%`u@p_aU9uHqܖ}dwڏC‵ABٟ>z:&H'yuTmJr4 \@?Hlr:w G_QPP%o2ݲ+oY\9FmO}+#5'VשׁXLQVٷ{К5e65j;j /jido Dg%U# a +]CAYi86县){g*Zr6lixE.g&K*[-5Axn%oE9#yB/g^(vsSYe-݌jZMbEdn܉-ls$fZDKq>z"/; g$ I9WDcyfR>A}ur85 b <&@!pH'Duym\&) v<;@W9 mŤ?K! q43KY钎9bS_˲?36Lfm³_R{dΚ*.jc$YvVU);Wcs3|r۴>/^;Q=tpPQv;A)D]emMli0VdYա׭Ti{dRPNh Y/RO[J|%n.ņ*9]ie*azd*h5y'.`^0T7#oiO,xmTZB+w S4z5 2X7C@TeEQ+%$i\g8TCX )c_Qy[q\]%-;SB;$h}wn9GCrvyO9X <6W 7 q2y=b6tS0͠S7B /JFG|-"3iWJG`OJ%|dO|:R 7hdycE`* /P-y0vC"= endstream endobj 628 0 obj << /Length1 1464 /Length2 6967 /Length3 0 /Length 7949 /Filter /FlateDecode >> stream xڍWuTݷKRj$aftDPAZi.SSRWwwksX~7tiH)~h%gk$՟" y/ms5 3 'E @ QQ~  wv? vz"ABܡ@ [@k h 9S þe 4ݒe~3k?ͧa@q 0/ *6g'lNմL`S(҄2 dA 7_lUA ! N0G?1vCA~ AAwzl%:a xܞ% U57|pm vB? AhE|_?,q -a `a1E|rC nUKe"PO8J2Ⱦ"LփgQc<%u@GYar-ka?ȶo)A$(*m,}o#ԚM :[R~8v=XK|$;.[/!Ɨ0\j11ABFr&zw}KӅw[[D.j)[҉E=|VbdV<18֒zr{ Q/?։iO.%;7:vh_% =zE_#d1-d&ލ^F;\ӓxe!̴޴4G zAs;i-B͜]ɧ-]Pv34g8ẀoO-(*l nbT<6نUMM69}ndy;šl3L O--uw 1|~<) /gCHڢ4B .+$?}ٮL*7s=)uPQ:clbƘ8) 2Gx/'(f}ȪϋȸTOU&c1l'p+UGß؜tHN<_*v"[v+'k}$fESKCP/iM-X@chU/!yh%k/"qᧄxxYp~'a6/-PZ+Sfȳ3iaJyTtxH=;O=N4k@ @æVSt'X*jʼn\]3V`ʺg}B>J3Ѻ7ʸzTv~K?bԶ( 7pט80Jopcתi?A-hll`pm=fVk*CqUZ\/IWl>6Ugq22;_ۃ iO2}A[Nwjls7Ttn':~%AIgq\#of s<* z~Hu^4?P+ ݩm,kK[vCmrؗX٤xb a,{9ţ0JebB=UfG<)_Q<"$T;ڝ 6Q@Ԕ_<~Ph.O8#&&?RWūhlkʹ@Qm=n&vw>sKc~A=ZZ TZGdٟ ğQ|L)X][1\-C':-+b9-VcE 49 tIΉ G84Gc-ާ ycO*u?VĴD6naYlǺl/pYϖL'i[Dzv5} Q'׆7hUJOT[ ?ƀzޝv3j&+/9z/+&)`AiH+mM8I{?Q7A`*Eo4"Zhn736ұGM,_;p\[S v =`ssj\bi%,ӌ&?4=rUg{;tk++m5,qc:ZEYoT}zEp@#߾GUNftE9Ep{aAi,{1LB/-%<}"ˤ # +nX *󋠏4di]$Zh\I7h[ آ+6 I,X Ջv )) E8 hdtz𥫖™Xgp&f?ܰʇg\ I8EC'/fFj'|+1}p5EGi(и)7pQ-~ZHȰ(.Rvb2{ѣƶz,&J,pq8U,%߃7TJac۶6ZHnuR[ KAp*Dac}2vm|a5+X^G#)gxwy^kvm8/E^Z;)=}>: 9.,fvq4OG? 3絕Y{ρ)ߟ?ktm;d.*aӨ]Fg*{mJwEǾվ) wLO(,4rF-B{H/git1βqE3QQ1iKeǕ/{r;^:>j,ߩ}g00Hb4! 1bhţV9]7) L*ž@tnU Z9pv׮w)ZӨ›;5:r}j`0pWFtRUp ҳ2*@Ldt9^w>%')Y!tLFkc8)d$@O$$z:`hMcoIM Iq0lm5͍3H8i(oVl2ucTF 9}f]<} >5,u1ê\~+?( c_l. hIVfh$n5%gM#d x=XݎBB935t#Ҹt`g/`#BtuºX:Py[:/\np=/H { v=e>a yO2FޱͷiARɣ8NO7nj j/s>^< X`ck!v깽"^bJ^R k2[=Yu$/ueg|\hem"53Phݍx?ρ"?0aKLPc\oo_WK+xs8]Vs݂s:A=ZB]gU4?bS,ز_u_~1Ѫ{2%l:&>:[D1cRws98}p[=T`[4@?W.4 a|q( ,yj;Cx_2ZOy1AƎz*^I59ÃՈf+$K@B"R]֠x sɎdXDq:Z] DhPqR]WZmUNgCU7g-46LqfF_uo Ͻ'RaG%SROf+x%fIfV!l-(\0崖FjڶO\8YRoq;B* $Iύh tKkj+qsPJl}lYM׃i8_SB3lUFͬ^xD6Zy&$9z:Ht[uob G˲4+U#K+w2Zt'XWݱD[ F>M#s?j;>Հ3ˣ}E %b!d,G=&&M^-@iN O'tO/ץ'qN[MZɷsy!NXP |*]^b+7iוp>?2&NJ7ђ>vDSK{L(,'!U6[{vC[l~ ٍ˹6覻ZvEGU1 ^KU ł'z+7YbK=Z/Q93 fu.EOaG @Wbbnw *T&=4:z0[ [ɺt"s?MKqК]cr[!ͻ4tX9@. Z-?%[ctϞܦ ]ɗR#8ex 5Ҵ}Lk!wU˓5aX-<2ZBO ͳ0o$$Qd-$GGu}t q~/ʦ/8ʳL3 m(ޢ?^GS"v $ ͧe{- O4)f_LŮg@1O ڋc&ailDlb_eسWl~GRgiT6C{] ~i OvZ)aqH {Mxٕ%%o џ)gNr*{/h?= Cb+2(Kժ#H7?%m<9(#Ro洷.e8 nP`ר2ʠ {|5x~6A/HadunvuBloٓ;n} :LiGH4&gƇw1e"/l /^0\E4HVƣ.(q?%x$Z[)ME=yM yS1lBZ{،fGR.K.Ld߂H; [ VI|ߜٶF~S %LP>겖Q^rjs1f%Y0|zȠK/90c2CetӤ9Z*]Q,&MuAK贻%T?/A`Tw:e=Z/"V<s/]83#osECg@<&鴿B1Jcߺ^p>Wܳw! [ʵ~cԋD<*EF1nМ+Ḋ5&GK9'wzwi{̃ށB6|_ endstream endobj 630 0 obj << /Length1 1539 /Length2 6846 /Length3 0 /Length 7864 /Filter /FlateDecode >> stream xڍu4\m׶ޢw {{ c Faޢ=!-BN^C<}[g92* p' PV1 XYHW_r'+"^uoǨ чyBK'Y 򦨙8\GDgn5p' X&]L/U zv$J2rzӰ)|5PW\ +ƥN0yͣ<2FyԘQASz}Cl2=WY4꛶{6T 11#a[J1~މ՗{޺rKbuX4Q$}.{"ݓOn0[lwۡUC:4%EjX=  YEr?PxmI0vȡ^!Jӂ'/J% UhTC*CG#EǹG-Ŧ" =\rz :ڞM?iLAZܣ 8k74]ĝ&!6DzԺw~aKvS's"6*&Ŷm=(@]]sbpWck8;7ThW;ch}BGRۜ]̽W-u(ۡ X)Ooc jeV^ &pbGV%bd$RuK}ޯNQL`2z:378*+ i SxҮ_ѡHi%8u & _K(x"fn.!M@ {p`g<^Va~ cQWӽǔm-4Rk/_˩'P X?Dw_Ч m:j-t&7j y~K@uf*!'plz k,y.tՓsZiWsLuÐC (݇'q4jk߯#ZF?@ 0@1Zo5c.#0h)i Ҭ6sP3X㭅at% iF?~œ]iKHS#ʖ:8*ISLܟ썸|]]zxJ%a2J"eN_`-49tqծ Fʑ}hsff+׋<{'zeahjO3ov6=:J?Oa4rHoQʭ-2{2jl0!1Kb.§3cz C6ME~]bc?8)W)V10j7@O^ek۽#*q5S$ŷpmwPsn+*w k7=EU>`W٫η#X_LNuu7VXr=KFL'"g+ 0ZVz@;$g+qv"*v[|1 g@']g8VÊ~`l<¾Ag1qbB}F.w78'}JK J~N+n˅ŞU"CESX)F Gd>qhs7n")SA|jf]8C%X%PGLҘ%E%pk i~z'&dq8^Bi*xT׳&h庝e m6q\w \K1$A.O%8PgC0 B,| vS|s7=aGJǴɸ؜?<=?1bz!S oZ2e8 w ͰAؖ/qXY]&&q\m[ayƦh:b 쬼`NB9^:?˷s|}eQ nyG]O#ϰ;_yĸA˞;1+m}~aCڱ(箁{j?AX#4D٫o(Q\\rL)|~zNIT:ӣc@{n"k v}1Yo}bW!5ǖ~3Sks΂8㘲Bl,',3E_m#n[Ša~/$uo&匓CJS K"@A)6+z&:u}:3lW|Lƾ߂ 22#%u_~NeعQ h'Yղkj; `ZWJaTWuG?j4eE,XKN%>Izw(6OL4ď2Nx6PIM6aԐi=ieOP-!B^ec)t)5 ]Q(9@/q2uK%3#nۜX%NّK % %l?Uo{'K&yM7T?fu*xa) "*$/,q#vLCs0/Wu񚾗 =<e-I&ΘVhKh*)5;yL W ~s=}=׮e'WBSvn$nːwc|zc'QӋ(#ޗ>|֐xקa!KLYYC᪟] 6MlTغgkxف`V7^4˘ÒE7/ ~^򛚹R$V[w9u9deĺoXs|.Sk!y6-fcd05LdTcԲg Hh$^FtvIS<$Ϧ3 BR0"upmzŰE-ph Hj_1k)+i$QVMdhϛeCFx(;ɸ|ԥJ~xh0ds ~: >/Okݨ'D!ý4?)&)%(zv`..Ft- MV}Z䛾pOytz?}w =ԆtԵߣ4 ypFttd rA,YqS(l.X9ni`hgXqmIGyѭ~)mh0J6Ɋ+(1n佥un?nMPV4Ȯžώ޾LH+:BEP¿"?T@'|HQ\y~B4!  :wb=Ӹ>m e$ GapvvDP1 l3V#9ʄ#yl|~3򳧞9ܶHŲP2*Fy;׌bmZ7_Vh\\j"Չ<>u#0{h]'GU";\ڃC5rF'yu=3f!< YRܷ!Fo7;G ERt3QwSh%`hIY#sDYMsiދp_˜{_G_YLGKrė;D i#D|xړY[*"nFU%:я%MAt%90{F>E%]LsĦ t+CYLqIMk+2R+Ԇ]%UjA&-2$(.޲0aJ2 oX625q"_ř)hsM ,}h4q'썫$)ߌP^Lwh*H8Cr_4őS^ҲZVhD#CSh=Hi.|{iY=G9JWՄc@k giX0lWMXNXC3ƴن9Iyb'EU>}ˉ'd$5lq2?1/e2wݜo *XVPcf'$s,Υ)(|)~2~.6j?LXj6DUp0#LWV |KVpo"_5/Md#.))#)3hw]&s0wb]WFs%#wFFbڸҔc蒻Z2-3^傌S@Y;),}^qp Q\"NX/uk:AnY=;,cĝg/a0w.Z.s+x1vo6  ,I RyFII &3@Op/Um *Qa oNU:--g=]nLdyGt?lRZDW47ÏK -)iJ vo;kh?=(l t>&(*C!̉OBJZ6'1{UqƮ[q.<;;g+x]'zYDgA!kD۞z~$L~aW2&}!~~ŌPȘٓ YxycV;M>ztXqر6n-⍢D͝+iۨZq :ދզ3UkSs<򮞘+ 6,zض]zA9[DLuXQ#zF?%N;,6)6&3]}~*K9oɹ@'Ig;>+߅[W2hy(lD ӰZ\txX>A{|V-"ɊyBzpk>p}A}WILeQK"LJ+-AT:7[<- VK 0皠&vgԼQf"~,!+ Po qv!-ֈ2sFN Ӽk4Q?w^|{ۋ \lJe endstream endobj 632 0 obj << /Length1 1376 /Length2 5906 /Length3 0 /Length 6851 /Filter /FlateDecode >> stream xڍtTTtt(J@!F!ff``HIAAiA@BZ DI?ƽ߷9gϳ!ªpB dHB'3Cz|_u,}aӀz_ 0h&IbRrbr   P$0nb/r>u?}Q_L#H @]aPoPp{`.JB/0Ex!>8k`39`c`}Xpa@!aE G`DW0@{;_P E#.3E( Eya.>P$ t9R5 Ezx{x!QFb5pu;E? $v?'{E]8#p_Cqh'ra" AR@\E7@v2_L/@!@/AG¼' Mfc~ {b? z1hWTba@aqi@X\ R

    @ E;c?^ӿZsA[ ۂ KConH Bv n;pZ 0:@7G8^]oT.o#K 釀#anKf($aBWa1|ڂݾ;.8ۅ?Kja/( ']PI.Gf1 *x_,^8wW7%`8,BfIpQ_ߚF 0|[UDKUv_!qI7ѻ_5Y}Lv$|Tms4G*^t^;i1rL5-DN BwFWq^v@]6L{}wU 2 yn-punM(.EFF?U5BRx.׶zUGio_L!WVWљUɮuu{%vaGin)H;ҟ\[REŦGhgf},]Ke~7/S*DpTsm9;rciSy⹂Υ i7^99tM[կ鼡#7f p[=SN `NpE{!HHh2P t MMfTa%G}K_YN?R'^٭r $ax2gs%17f hSYi%_03m0;`yu8Aߩl!/؆KNI:LA=[/ǘ\ܭQBf¸z B 쵣޹/$-7~B>6+)b6p?  ¸ozB[rwm!PQv,YćHR5-HҏԶrm'ETEkӻIbŧ-DƤroYuG,>kw}b]Ybr>h+:u;=}Tڢ0p3",#ug  WؼPLԟ@: _Ӥ8%pDj,yZ v]2(F˗ D7{Z`쫒)C-/=VmE'_x]2Z7(Ҟn{+%qF#az޴~j][&x[+1^jQsN0q]sz Ti=ũ0x[Bru|uc nNQUN1g>!8c<~uB[#li+oPm-[cۦǛ^J~L"hIB6:tj+4_R-i4p3~%1j&v-4+c?;|<`ivvX(#PWٜQfDjd#s%j9v2mHV5^`Ss3ewDkbG W6 7̓$Z9Rく{wPtJI(NH3̱KsςJߩJY%"!GuOڏN7|40PV0Bȑ1|M?H\wYm kiYi5e<MMI-)BsNţ7I|D7¡,}ӛGX=JLcFUiLEjv} C1Ih|i26{|)FI>S/Խ׺hW +lDvѮ{&fcQ&_=%Ÿs d ?w^cr "?xGE;C[)+bV%y2J}z)Y2 !:RklL Z."B#fB%l '5/!pm\ UFxg1bC.sEOq6U dc #މ(jn(.* 9 k SQ4}mo7m"ZK~4bSF%%D1޳h&3W`eHҧpd#7xzT@+'L]4)0 6-yZKeЙﶖ+YyBfϊ d[jXk48Ou*`%}DK}2O8s7_L)'0%}6._ܐ{笭S<k,4mSY/QډGeێ> ; 7fOx9YpSeG˕KbL>emUJu5.:u@$T:}v!]|Vj72WC9OVvj9qnZ=7PwLN2(;r;]7#;xT͸|kuMe|pe*vy +dY?yNvnn}O5P2Ҋh1bW2ޜjRHJ3fZ7d&Ǭ3±-V@qPf*Wp:#G"I_ e紀k*O}GYgI}5֓eK}/PI݂?//Nh:\-ڐ:?b?e8|4h-u2ݍ5ꪋVʷz6TC:J?">q[Ѵ>N{ݩT]62'*$qx9]] b{mb7gyJyT6اYS]2?]E(W:Qv ]w=yZĂ`J"zW5 ߯P\^Lw2{ۛCi6kB߅Tox8M !n>59%tPыu J7d .Ԫ3I~(!G7=w5>/qjA:zVFiM$`ԢZ"*(i51{W|;G NAٮOgt?):S~zqP[ZƳИ™!hwVRф{|' xfГd"v_`*@GC{?}&Ӊm6yGm]f64qG3[|7jF.#q?d$T-):Z'ОQUuqW9d0)%9 '&)uū_²ŹOJ(%5_q5UV7shJe׍5k7_a7 瞟ug%5}E=fטOLte %xN hqkIKLyvHpcuҭ^'qM҉Sgzr߰`vr5t3hR'n7d*p2%Rt2L N].3jfc ޸Sj?(]yQ,cŃ=>.4~(r]Dzߴ철{0JL#lW$~JrSqձ*Y/92;.фa 1l0ܒhoMKsZ}u@AōzdɥuS/1a#mSK'J??7FXlm\eBL9(~]f,6k`\Z#Oޱ\q$FUIm!}s}$GaF*"gב "+aAފ*~Iߡd܉_D¯0z6 rY Sۖc}効‘ԢHDass)}FM7RNl(Nߙ3}?Ϊ>pD_eZrk灹=>'fIXb޽ hu8eIdb6mbjLΌP+Io ,&渹o){iYVf.W)_*Rmd%}x]^a%e7*"wcP@ò mG|1kKz{mq\␥l5';T%cf' },ebqJv׭Ao_%B?(,8E$':j2uah+(G3cYqjХ+B.M7:/>պjt&_Y-gvϒ ,cNhi8()/?H:%b0!SXj9 UgD=߹P> stream xڍP ܂A;ww28 -;A#9*ն{^rbe:Ac!P dHDdb02322Ó;Zc'W;l!l4p|8ʂlRNV&;.FF3##A\gsc,=@ dt'ٺٛ9J#*'ڿ@{s#D#+2?%(ym\\\ A|TsG3h 4 3=<9@_e=n2788%e@+[ l`d5q31[b2􎮎?V|gs+Z7 *  ʼYXdm qtӟ=}n \KN 6vN@IǼl_X8@;Ȍ*nLsuc΍Hlߔ0ft>,r#Xz!W}A8J'i29皞x b/RArU2jǛJM*;l؟6"CRIy\*QQ{ wɂQEEXa*ՖsR< Jרk.Ͷ/t)w~1nt@j!lfB0֓b.ѽZI`)$83$$5HI+Z}-$sU"( f:աI@n?U-eд:GY _2g`* Gg U${0WBv6h˞9gL R#]7n=+]7tdA^l'sQ .QfaGX`$6}s(IV2cbk?~P+ s_x*@޶'nS>pڷ $y_)VkAƑ%&jAv\m4Nԍ sqf^tKQ1#Zׯ©O[y`9KҏYLpy @z΅a/INp3Һ .@_c瓟3_6DȵOI݈xݜ.ei& U3Y|0-F`2loJanYdCpfEhF۽)k0Ī'u?tF3:Xg -(])4ݕodNQHGE"Ui0̛ a{bűg[s!Avg\O\m̚REAj$M F#%+_qjͥߐ})RiL"{.ۡIS=Ϲse*޵5J ]o@̰Cʸo?t\ ШLECV͓rP#oC[Cw?TAJ.S\!i3xK}.lLF$E܀f/v&^hߩ9 4ܰx-u[7Q;U3=#*KAk;ce^9KX{f|aha0."@kc^Csc u,5~B}M'D ri]=xk_* |j|_Ïn d)c5l_Y3y4'<ߌ$q )eIC}}V~3lܲ^ڧ8-URwIH/T{j_kĕ=cE*ݠ y^%xV94P=xi)%nUgSB3 w[,$򧻥#wҁE~co%¶-k4CZ ud8=a*ŏD¶=` 1-p砇B1H{f IyX[YN+w ql7&~Uӭh}ax̪54b':mY[C)^3Tu zT|uK=; B.X*؆2^ |clhw._0ٞq%a(’U1?ȗ?~mq炅z΂T'Cc?r2A,lmh$`Q&[X1QJ9GsrZn.OJ ;d6vK1orTL p5+8ݷfE%iܱ%L5xZ`)F3fI @]ޔn1q+Jv@V=ar0PB #)i$@:AMeM]wj+s&B H}eSeVʻuW s}*[=tM:䃪fxevGV+-a`Y`GzT_S(Hʎ T؎G7A}l(2"a>/}r`2'&"#65Kˑ?'J">,Fl>ۯVA^jA4 %DW@!O@gj¼̮QeN1938]'x6SVcfQ ռСZ4e'Zl\?HVX ~ޝ<ՉKKт(쌴>8EX|t_K4n&NƆ+n]kMԈ#,^/;*w͓ sʎ)v7=nŀ6UO{^hw#~1gpG!¢ܷ1Ƽxռ"_tf4Moa_9"+^QBl0^dc2aBL(ɩk?H2 gFY# Ls:߈Ֆ @qbP\G&#NL"j k5qMi<͊ՒE8˗`Oo[fB`郎8on!eeZ9T콀.ֽ}l0,]pS-1 i pLk[Y2iv}`CFv }DC i+z(_4Џ$!۴m>)AqX&3cKfԡnm,sP(tdqPP0nct'fV_뺳Fḓ2[*F ; }Ӈ om5C_O 'Ni $(9"#wT~ƥS ntmW6t<1o+=vc)XXDPvsB}ch@ew3fu,J 2J4w\NzO 1w}C̈F xV-oqݥIVfn 9S(W/uUY+RoζHJߜ;o,^Q" vu%+j:j0ж_ yKtLQ < /O ;kAicѣ[䨡cd/m^Ɍ}؈e63&m. '{oMrp#\ֽ]9@dV ?͹pGķ{M =W%_M~q!?r\ aQ7<#˸|'苍_E7W "]ͫ~!Ǝ4V~/G3͗⦳6lg}ʟI?_ ]xqsܙ]${6nyk%i&;P@'NT$ycAda\ULӋ[:D_$?BJG:=[5(W'=ۢzF.RPDRGp-W2Y ȋĊRpWNjp?@gQV;2&\~Y aJ C> 5ܺf!uR<Ky$]kQ; A[$Xg,?*<f<fB?#ʮYg#E!hҖ)A72 î4^ZE-Uh63\-K;ѦjN]Ojpl{@ɝ By*G@(he"RlMf\(xp%fBa˾Ji)FDf(WPFB|VOYAhԀTJgq1plfŤ"8Y F?0  1ܤW^Ÿy4߲~={x^6M_0wU =m[[_3x;ŋ(˱Jkׯ\^(L%nXd] (g?zJ!P]KhCAcx~tVN>(_m)kB-oG`&~N z>%_Vn :ʄpLT3& }:l'Z"(ZSqPo-&rRs'Xk;GaMU/T%s-]6Bhq??poG%,_+MBzia[ :ryACT- ˠŮ@ ?4txg"6q!fKĸ޽"56oSʇ%$c DcKu/;vnJ<t 14NݍR+/f(dRMK>ڏ2T#wP0x\)S6Ei 3|j,t$/Me&Rf}Q9ٹ_ b=wfw.dO*#:HԬSwATT7d@Åmdx2Cƀ*U.иO8pӕ({"5P9 @MW@=7Y|<ͬuSͩK_Q!n֟J$IQq5 ;V(`5CvMZTILz̈Vԡm +X;[?qY~St [\Pg=YgoCGc1%i$UB"_BN?H$ښ7e`[Q,p5upS``oɺƿ $=wQ?r21|qIi-~LE T C&Z Oh{(|"s%,=f/ydS1%T=x9Ր|Rp$|JA9*xa!Xv?r釻AlGumݟo#d S.v @uCIf&W9[e)χBQh /uw͠H>Jۃz7emxL23*s0)8ȌPT[U.69ETkm1)<̘BuSjK9ln{*߮dl@~%=Tu]k%eh"AwaqxqVh=[qzMFiΞƥ#q"XGEǍmim$BRk6u՘4$,a)V;64GЈ k$dF"HF{uԴ$uKOB"2Pص7]&ybbP4|rb;Lrh1J]*?2fOH?Q2ꏮj1_u\}IS>Oȟݯ۞*4Ǽ`GB (.у)KiJyl`Sa?6F16L/w :&5AR8Ρߙ‘2I8A9%-b][Q=YzeBTx6sm⤢KW<8.UՉ͚!fj%6p[?3e8fN .E Rה&f^( XO~ېwhgk:VT$ZG˱Zg_=}64樄xMQҸemF^j| 7H k^hQsu:]]F <(Of]41gr}TI@̺Ejv'>򃧍//[o7]e]xJ$sYZVXq̧ pӢMkw5 &v =,Lۏ(e"x ʂšA &R.z-_~c˝ŧO,B'`SE?<3 QW@t3Wx^ \ߐjڧҼ7b61tzӎ(!PU'N-~XEf&"7<́(nW㩴ws}`嫈-8&_EzFa{%#.oR &o%rxFf ]6Zja=6Bg%B}(~@6k{T,CаM'H1'o)@uۧ3-]nyP~{D04,&7?(+R6*ȜC27yXL 0l5؅PaMr 3CН: 43]Ѷ62-JX#Qͅ!28~/z,Ƴ_un5 Iְ<`KA ;$:>ͫ"5V5!~nno7—>63ޟ]I~c5L(:Bt5p;C\k|A̛_jQW-X-\8BjRoC2!k?P/ׅ A/j ӻw>W09U/S~z{-'ir:P@';}MV)͐ 8{9RCSJu Y[ $tѺ<]D EPO% ,ΠYڷbyglJ8 gG.eQ'#Ya(QYA /Z|Z5܎e×d! 5Vʗer"Jw Gv]xe3 &R6_FTf|ډ( Rei.ItkOd" ?\6MƮ?jV?뚑0;1uC}a60bG)D1fN(sb.nYc83"1)457xI@./<JwpUo!{,vDBgd/ki DTC#xZ XY=oZQQ //O?E w[:Sk!Hl;sqyŹY{dV:n[>JsOHӷ@w3D o^W8HvI71?|VM0quzE7 [şHjnBru{)Y6UWͽCMq0'̑ex# HMyTSqI^<'N!iOPAUsĐrt%;ܥ 9:+8VMrhKV\)~͹#SB7aFz 닁y^<OJ!AehB VQD Icv$P6l)/˹eZ9Mޖ+'Q9@=G.n"58~t\U2V ԁ`^@pPƛ>@Vo>)5m,#K*wd$E \_+kBqR':CL{2|m|4d(@?o nPV>f$ %&U>jlpe*- 'sX5 ƣZI|O^t1^uxu}~8faɺu`^irVvjŚ%K)HeVt,Cߔ{jxLfx;kT1F>]w )~ *Wibi|GΤȶ*/mP@ߐCWQӤÊ'.7aHq ;yEVS%L"ryrwJGVqu&d\ڈ=w^:LPAmPΏiz7H[H^ oya!kAqfLVP! K+mze|96?ԛ9㾺K|yrh#DbNG@QWih˩_fݦKNU0}"I|!1_FK[RT AN'ИUL_Nˇv`!k sLG/sdg賚D \_ ‘ڙ1`T ],;R#5kU-Oxip JO% h>_2q~>ӧ [5w,>[wӕ]m?!0+.cY/*{$N-OKQ5VtgK8Sc>-׍'Nͻ|NI c~@!骰YA⟴ueL_8"`{]q1CkytyC.uK ..)%ʌg]iKTV{ P} DŽmPlJ7?|l4։uvDn_L>W"22|nT+=EӤeL"! QЁe'-_e7 Wkiej+#ХN+RunL1S.]hX᧾{"P6_baCjGV tqAK vΕE7X@ x42/e$ ;]Jzg;k4%ྗYqI*y8Qk{<֦d0(,X-V^SF^5)qmO}[QAP"}B-\6^#lcZ>Hý> 'V-g`*/ ~T^TsSPYk^ՇCϪbZXP {Nq%+V<6^';OU,\**boYC w)XUVy?Rxap]+27 "ΔҲ}{@gOB!@'G{$[$/d3GooXY'̰/Rф<= rezU[u|}HyB!è/uuTH!/|] J!p&f*1P|GMtnZGE}2fs6-:y +dJKfl3_;rg#sbA<1Ė-cJwWo `Ѿ dIl0o$})QS] k$V{Kf`gר*jzƀ]Ce@taW?G7JLֹ_ M'Y] ~Splh˛;eW[%a\)~AQ$i/bg4P𙄕?A3SMbg~$|^"\ЄʤȲ"egZ!SB5,l]:QD䤊(;D~T"]B6GQ)F"dI+Vuf3 Ue3'3+bKVɓriU`t y13I&_C<:l$a)dX w#8{5,?+-= pw1@-ڃާQ6nEqblM%Vv)7& Ա="jV" 74dUD.k"[4RDAѶ([r+R`y,|Zdj8 fS`!NF<˭i>|[E?oKF,=M8]Пq!X؈KKA"a= EKN>IS:?ĩz޿'jX 06$LL,Ng55>vWPЪ$a 4(<.?^QBSV%ƢQ~p Oϴױ!T4N˺'nY1l>@3jx 9NCEEEI9bS_V:iL=QPNu=݇J ՜ ~_9U.q![.2̖X3׻j+!-fbpOliݚuG,/"<o|z,I'"ê|ãOcU"Z۱1uĺ5a{b :P^0"lGK})")> su>Be]MR'̼ٹsRO0VY ~5s&:'UwyrLġדCjAeՂ G]# \7n<Ӻ%0b28N]"= XU(YWVUuʜ3n$a-*:>'ƅwQ:o :j+< viA~ρ0vh_\1q?nBO ]*B$ԩ u5p/RIkePQTr$X$."-so͟')(G fS( r6eh}Bȿ#)'Ċ>$`(4EnĉP\#n e^ endstream endobj 636 0 obj << /Length1 1474 /Length2 7521 /Length3 0 /Length 8513 /Filter /FlateDecode >> stream xڍuT6 - CJt%=  1!)H4R% HH 7s[~b5TCBUp PHDiHDDĄDDD a(_fB.c(G Fal`&4=]@1PR(%#"W )P{ !& RB"a(6Zx!|t+ u r(Ct'P( jE va&D0ty Q`$1 P&nE0 4:nP`?_ٿ ࿓ 0(@GUKv.L> sb~w* an(!/¿`NYnpuQS!̱ Yg8t6=`L(])@8 *om0wC1$0{(@t;:Wǘ00F{@ȯϿWy!._a}%3 GۧcEŁ)"Ut;UnEt9ux>?i#0x?KwOῪo"T=]\~y7WF(1w Ђv0OjAP;`,cy|v0d؍~ Ex~-,a y?<0{` a(fه 5w0 %\=I`P;oe&G ]]/o#aRa!=J\@o!H$oa ~5P(pn w o=->"wc?TTpʄJAs=@U+mEOղ n:&<Şz>Cֈ$]EK9v xjgzsSJiFj}]LIxgUdo.qLǓ9":C;\awr`M'*LU W%^jJ4ltJMtWNϢnӑfob]aw3#bUۛ>DNОX\s!z;#U N3A! ;&5`O޻G2F<?Ya[isE2~nHִXʸuq }MOŷ+O+[Q|dM,wj|"MosK6e;8[zG- 8UЋ7#"g93O9]V/'"63x́usI,a hP9J^`g'^[TX }JK[r *T(X䍟έ"(a6嚋}.u0H7K" *j;B CbLzie[щr" "@JOE\]9oSPe?Jopu'ν"x!o"+d~Q|ͩ#u7LEհŎl]4'\ s*pnw87_Fxŧ0ݡ]Jw F_SKy H|Z0Uf",nJzO:C]u:ABC L'}{)S{Fd#h8)E}ei{vzn܈ϑ}4fN,O}O%(Ö顬.4( I6/X^JMܙvjiuT(d:J:{upS^g)saJ/5YLqWUl۸yqQoFzk=ی{3sD U,eq1;|x0[~V^ o^)^I8l'VR?.Ue l6r6FUHRK=}nP酬ڤG KنSi+P2lUך}$2 ĿW0z*z53]hIw!EovTAla\'X!b~ɌV7 ӗ'?Ɖ>1HdSooI>/wIxr%ӹIxWk(0Vns 5ZMX(WL/H[{sW0x]@O`V2S[xmEI"9\yYm]+m^4{_g).;',.7oL8YR?[Ѫ:M:doO'|y0ΕKukV5n:OYϝM,֖D,eQMKh"ҨFs8/w3Y&G K5T a5сg$N=y"}l$6W{MևV"{j.4q{;ĊW>A+}! 7{;Qv)MIf|BxYndzHKJx2G ѝkAڈ=VGf1%swER9IE_g594ۉv^v~|ZIK$y̽ߠ#YLw۟}m㗏S%Aqi\dl] Ye>\Rۄ2ZGcxI¦[CmlU|= V8ƻJ u2Վ.KyRmxW(sc48nz{$y]<3HS,ޭ`xfF7Y»f+y$1[ɨIC^)x4ۻC4^M-1tS^- if Jm5a=W~کX>AQn8(hǨ)[pj}PPL䍛GWdf7Z/ž<yɩ]`yv'W q~y5ZCj7JK' f2% \"uWy|=$NDqv$L F\gFn)^}&S3,:z(922ԧA IJeqKD-ѻ y"eedx^ O&E,Șqާ(]TyAn@cX,s !s-EZUnlvȞ `^-r/-2ͦsJn.`ƦeߵK%W241$Q4XV.jX͓tvT9>5&vq_E&ݦuۍ6t}H|Z]+2NBo3z[(LcFhPչ>EIށA៚*T]OkbYVTP#w' ɞ<.Oů|JAW< 8=w%hOuk[yՎA*1j36gWVvXn ]K3b;f\?~ 鮥Yn0|+LI16\"zrI ߷`Ə$sO1D1/Z|V*@Z;9z'O"eؔk*}";Ļ.$ŹS}鋬LƝz78AVۏ(*IQ֟/\O̬D*#J*VяˆQ~H>.کby դi嚸Aq b÷hZ<%į+in~w9yU2M0{r3!N5YQ@}a8B^yMxCiڌFp7|9s}Na?;NounIf$RcMGyngMmAiՏܬ j=AG?OXFor<8z}`BW|3`eBdmWSH1~~Z UU:<`p^<6hdR?Bs7խ`$>_UD$3+< ,Ahܧ +y|X]@zAe %a4pUhfB3ɰ^j= ?MXdNI锂笪6 W}I ǝ9=7lqCQ>&/?۪y_!3h~߰ԙeK!ͫQ@.2֪Krj[u"\S`OlaR&Ə6G.n/šhv,)|&sf, {TTe{$8LDn -L ۲b8\I\7& 5+qmgjКz:*6tQu9MnGJ 9U_DѣeFl& Z.~=rZ9+j.H{Yv(TC!jz>E'oy} IS!tlZSE:!oh JKS]wbS XLx,xD>iP 7_pƂ.{_d ޷9t,1ƛOU9kRTTs*WN}JXeqm}OJiYFfld\/T"/"0mI9vm,`"Q<F,m(C>rz1݁Yri)w "YVЀ< -scW6GDQ;o* $Eâ`qY2zG,EުK~.zڹ7pB!ht9t-A 2lM7ݞ(k)՗6ZnYpS5oށ.ACth6uGxx/sF@/UĂ^.q>tMu6P2ޫ'#Z̑ZE7JL}FGU(aK/ɾFuUCOMiqRV&έ"sZcל"488R>Y[N"@k.o?P ?B`'n_8lQuߩA_=[;xSXYT- SA:(uK^{WŸp|exE@Pxh{F67@vHGoKyչꝎԼxT%@*+,&pLs>CJKr ޒ,~4+Q7Z 3tfL[sIsSrn, {#ia^»~*ͰDGTJ>٬@=bv_] &&xKc$ʊQ_Q<8H$J#P9251ެh>'%Fx^~ugX0Q!}C>w@eTgAdlI;3[k5{fd+ꉉ11D2nwb 'oZ6K ۚ[FIbkѽ6V1Iz7=C/<+dy~OV6ηӾŰQ^"i8mnzh宩N,3^[nskT\|u"eaJG,)ݧ1#3mYXV!(meuˢO^qbLXZ?3qf'Tz;9w\5Q%pa `)=dVIde|Ds|c7orZ=~|X8jI\z w˚樿r^ܒAHݰnSs~c-R>)/tI?kW|u#SfEVY;q'jNqNZbdN\@d񹵤a)K•ZFq྘qɣRlqՀQ&Ff} afcþV"T{HrB<5JVsS9,feŀ1A/[#Vj{$ԗW/*,q@M!2 rFYYàVBڟ9<.lc lD PMdGF Jh3~9n,؇ףSI?new"{IX}&[%q ܞ2i$@GRfgvVFxh(@˦\:6Z|taERi+kETIC8ȬNյ6+֣Sc4K?ރjyb"-PrfT*|L endstream endobj 638 0 obj << /Length1 1662 /Length2 9886 /Length3 0 /Length 10972 /Filter /FlateDecode >> stream xڍT\-LKF68H!Xpk @pCwdfkzg]JMUjB`@6<NˌFvqB lR S2Pps@^'.)%@ ]$N^.6c ``yYH;]l-@2fv|:ЄZ؂a^E(d9 {xx]٠."L,[ @ vq[~7 P9 ec]jO[ 0) b v<ДW:!+n@6te& :: ^k*@߁ WS>d2 r@F\zj\-\l`l[dMtKI#sE] ڽ= XB,~7aĮ uvKdBf x8x`g†7'?' \~>v7B09l'~'I{@oOB cjo `@ӋӨl*\yGOR_o2lTna?k?f qsp9:xZ7(C򿡺?Vli^yi!Ojfrqpiu[,l̟v߻` A]m\88`O'a>m1}:!Pߋrqy= |Oj Cv6x`uA=|vߦ?/]S=id`FOkwOvO_<1C9)I`|bwS?_U?ݵ0XA=h P PmWcBHiWzc&(>IӵͬEr^]UܩF=e+̶5NjgӉ>dԳpy)%.}pjQ8]}tؾ >'z*ttՖf*$d>sFĐ#(2U%ZQ-gn/ywT{m8 WZpLFg).}/\KM<* "ODFw4zv6h{D?l\<=!|9o},e4;>E M^. m8wM2fTkF٥U[g_1{Xp_~ yfu h.o_+xQx>f%uwqь^ {VJcEF#"rì8cIbOx>i* |~JW,alKrgu1x9p#4.Di+JZfo kyVM\Xv z$=Vr8\o.ZR;;$qq8P.6G*!T)"XdkIݞ:yMW:̐ 0Hkks4$տ۾i0t 8xkzbc6'Wظ](/fuq0"kL5FѵiF CXo۲Y#76LjyҶT9sS,‚KQP syLww:PM\ugO#[6"Ai@+(iG;-.#K2l~x[4GKcv2TdWY9"4L<#Q`!%P0_lPXLSNѠMH8:Cx1hYh%u^Š+|NsK<3LU5C;n K몛ڌ?6[qZr}x BMe7.G.o;i фJ/6Χ*̿ #a#-y/7zM*b S}}B=b^J-}>tXVCS.֔]is Q {A$Az\xFTKo]7U( 4Ѷ0 &U# |Y3Ez$ݮwnv_ޝ$xmEz|UGzNQRN&)Ո67e8d28U_qT8wI%˿Hm =5CbnXuϟXAkrL~S!Ӥ^Jn2_&>5' 9l~>$ƅfQ RUwi'[Gz^ㄸʣv} e>/CHuHݙ>nKiB!qVZqT^^wHK"nzDkgLujՉI"E * U-{ &n:4JQ"A/?=©qD֟*2 \25R0/<ȹН*)x&Qm/b ijy乿6CK}#~ ^ cS?L׼F"꣸ם0SLa_qsrFzmpkլ~klc[dE2䗍Eci>T'ƀ;ΏWy?z"+M}aǐm5qehk}'[{y::2N %j*#V-q_}7+/<Um¿Q`r#Ppz䲷 2TOWgIM&E;or MR0xB,zu;OYIkW4b8QJ[߄A}x fܢ塠ʿwJr"ME׹6_jY+Wx?7w SE2( \ `G'Ђa)Z eKC RzQ;CfQO\]5JM&_*aE<ٱŦd^e&=|y#C?#57\vT〔lqS_>PBe{ 0bN8"0,585LmQp Yf-SEp-o\h!WHuwOfhڋq ]g$, i>]{N听(OHd lJ|jU㽩;=ͽ`UfTmU(rPI L\r2BeF!V jɹC˘cMkx2ewr_EV#*KCW^pb;KR:YtƒnBסS)7b_h57t vSk6Iӯ/ ~~&_GN'|m36Nyo,֖t닦!v- !91"fc|K|gya+)pU.]t͊1 k9WA4omՇt;#6RBG ;pfoo(i m߫>h|ȭ_lDnj |] Ȣ Xkb[&|y[wpj`#Y?a0kG*1[U?m1&t{g]ФX1|J kdfk{7|xEt?Ř8e'krgד.ĹuJ"ԟrzi|d(譃Tj{nV %Zd{q,DJJ((wy&*Lqi!g?x~< a-sy6"/tìS%8̗Eզ(DtNJ<еHj%M+`n SnZ-BǞS_o٘`].F dp$soDܶh”87uyTD{ZGNc'#Ѣ%YIC9{14ReP+È_^3tpD'r2h`bZ8·z HbM^AmlE?HX T|KE)xվ4'gp4@HJ,7{k7ej vX(7/\$`ghἿTO14T^X\t1\6 `cx84#J9HAWS]_r=M+|ci*&㼰cJҌivԮ;!ft7!VG}-uzB܇t7эbrď3od /i) ,A*g~zq52Do̭,$z Ϋ7! *?>3F8|WK .JyV㩿sF(?ǗMO h{\Jg;8UZNrJ;G iԟzBrYݸՉ:Mq;~;zo0U=1bXFPƤZÃvx3v= t:r0".0CCMn!KvXKۇj=#Xɼՙ/~I'z2g!_o-wLgx2D.lji_eFbī쑿h5˭ Đj0~%WCeEo'`4d]u1pX]HCl}(jz%E= wd`M|# ܕ]qA7鍣+~4ީ;.zjn蜽$7}eսZQz,j>Q⺼hRcf*G~@CHYm9`hasZut^ɤizDEĜe].RۿܞfZַ4A~ 'CӍ|&<Z鈉+(o/VrBK}s8"[sZ=tp-&nMcArNM=I&/-ey{8Pn#缧X۴BpQtUۄ4 (56򓾁kL vԔhߍ'3< /{lQ1^MI ;u{*G.w*KdJn_sudi>)Ԩ$uWa;g ONSZR=tƅY?Z;|_S&1pn|SF1|i̯U&fj iʸx,غ˙~pwnc,Po?ىHE5"2T﩯e{lM汐2ʢhm=K)LSe3g5;j%Qԯbw!e2P 2F2|&srNkWkdk!I1*7O&J h /[mY$$0K<8Əfxu7RB',B5UG*Tae|lD51&jZ潩}ݮR!X8m]:?o'pGTwfŝ?b} 곀hF<|BopO"YVOzUBy*=);Y M ~dOna2_hq9˕[LsgIsj~/5 9d hDA/9Faɣ^܎mArQi!N|?47%޼CkMmr~xaa)5)V覛ӳ:K#*1nہJx#YfyV4J;  7Ǒwd^s 5ZR&oBY=jMyi uʡ8[&Qۥ}!Nj];=A83BXebZ]w>'ڗqZPpi!}bӓyy DYqQĩ1:|eO?*!ƀ./ĕtU{ S.xV~s[A+rD7tcnD Vq!z3yS:p ۹IK GnAYT]qen3-ÎoYD@}"6!A厐:Tj$W|ÓͼyHȌd=_g95+Tn7,rݸbOX2i#Y /k'mbfCwAўeA^#%&I,Pgn{ڙԟKzYU:?$*LwB)-NY!n}NʯyeK,N3^r0qy͉AU3BнY&i"lݺ[QCtg;O\4[[ *P|SkgLo^—iW:[kx†O}Zqw8./i^#1=^3Fu_n xrlRg {wG:. :JA3n'889?}†C @?;(Ll*uo';dO- X}nbPjK3NE|V nvAR"kFJtCC~pL. -9̠8e:Q%i8 G-:2hEe*)z欩H<ۄnlhpK'訹P~Sa)/֫-fE<;JV7?TG⸶Moڰ]auk~Ӑ>ߛӴU`Fd0~gh@Eb_mty0~XվsQ- R _ma˝-N-s _ gr (2w,"ݱ1`pjUĦ{72m.U0Nap{t̢yϙtsYW: p|ߞ+"E?6b>(2~!ݨKbʧl;3"}q.zkC2-龓p}s1;!)|ԁX0o`+&2"Xb44_^t{Xm{4/&u~oOpADF$`<=:~Ffc`&Z'WRA,<6}e ^IU]vԒ_ /jiI~^gL\/:!FEwYS[eӪkEsqٿj’:{(QHtȺWϻ5}vOp@Ba?(Ps.i~Z">v*ߤu;)=y6mQTM'Ytdhst0)soS̵ iRdCwȘAL+xSJOҿ]Ғݧz(!i-U :5ajϺ!(t+®t*0H{82_:)Q _T 6>bTYjF24AAԀӍ- a{?~6^,e?ް_7 endstream endobj 640 0 obj << /Length1 2731 /Length2 24075 /Length3 0 /Length 25621 /Filter /FlateDecode >> stream xڌP ,!ݽH#--HtwtYose㺟gȔ՘DLLl̬1U6V++3++;":o1"&`3,7q)8dll6n~6~VV;++ & s3@H% rWwdfbP0qځ3@@W A+hlbl)DZT.@gw9OE;:cF[\%Wsp0q[fotdJ@ˀؘq613ss4[,@@<+#dkb 6r s1s90l' xbvv@{W?f{k6> {s?M9h؃܀26_e@W+++zY GG `n!n@? 3W)d,Z 豂`o`z;z_M U u_' `C2 lw[8U-xLq7@+YXl?F[?j?j;׿ us _G4_ D-m;F$h r5[%se { c^сOpS|9RωsqLMK#.́l vX88#(77DBW`{EW`/aH"6+bH"+Ⱦ"p-r\+ע("p-JEZ_8+gW{E]k"pvWήuu_俈gb>?ڀ쿈\iQ@fnvGc` $ OW?cy.tƯF_/ο&+85 xl`AWVG돹_sl߭Ӿ reU+{ x`6A;:52|#qx-?jpjp0Gh NKgC\`r#9<3G[gNLW rp*73۟68_s{tځ\lm mNp?. kZ{lb2xu W<_/kH@ǵ3x[P'# h4`&b]~UЃio ՞V*ϒs*\]ufІHpOe'z *m}T'q& Eԅ}|5m[ R:*c{IyWs!=M3EkDRfᑿqe"ǼDy;3B*ǀwQ䣻לZ:K>%.1O)jdٷ >_V=[HsPSVЙ3AM5KlI݄&l#gr%6H, aZfu 2t `E8w]XJpNVDlVz+)ecP]Z@lte$GXPAKBVV]^^Q3\~  /܊/R.. 8$3h2$?ШfX.6+qKH㷹/)8ez#􃼬0iVjrD26ݚnߖ9hS5 E)MJ$ngT]ԝ̮)MKXWc8MђBܑG%E^¸~6v(B g}_0nҼ|&%TSϧބ]!>Cc[_ J&[ HxGlѼ!RLT1;8`?d1`'d[o{g ?4rѯ])ZNKrC}GiO<r]P5|b6<;t":(P xCHx9ژKU,e<& ITYjfإZ1qY2^75]ss ב,# \1jᔾ/*)HHSHXK}^ێ~-f[]lT74|~5O1.h.^R5 ';׉{ie4f?g97#btziک[/<f$TNJdzFw2_q" X7˯d)VƸpo%s9A'fO1f|+5"c.+*݁HBB!Gˮ:R-LIi衢)^,pl8~_nt2Ѵ(~ >qaZItDo7 픹bJEZ잤NdU;v4YD c\9#E+wF*HQȃD- m ?"H*5\ !+*}qK_ͧ>h[YZ g <㤳@Kn=b}"Es9^Wz-kl"neYȎ"zj f3E hR?yɇrGBO|Lm)D5.LՖdZd&36U^7k7%k! F)*D\O!T !|L-6IωÔ ]\tφe,r x)%W(Yaqi_E>Q7U= S}ᅘQ8)2wFlm(bHͭ"犞ߧyI;X!Xe.]| R1(bơGV}T8* E}SeSw| |'.|!iw*IPN~+& Ll"~ciHJYj덴O9ˮuU:pgRGT52K/iRlUR>C(I_ Rǽ>4Tܚ(Q)T3͟9e<:q,!E-|T~AԐ?~ CmUGYt*}IBGk5n\C3bӨ{I?bod-+O,X{}2AGNac&tScB<Ȗ~pLs|΄TJ,g;3$잁+{ hww#.?/2M}H#}ޚ3k6쳾G4u tQN5dҿ͠tٌf!y/b|{0Qwǜo~\\ث iR@Ƌ?Whc gOAGKehTZ/[,w2_MAkg&zAʞҡ8?VHu9Do﷤gܳ%q)9 ȶ>]7@E4Zޔz0 Um%H7RpcS?yUс#܇{nD~;3]R(?[>V@7uafRߺqٱ8QPv 鍒QWv9%KE{rdtxNWEX&yȔF븆F+ qbIN~~ k^%kFJ<FP?C֘%ZN ٰ'+ll` ZVV'ϥ64-قNnbl }1D>lbj ]DlHPjcH #!I3 $a=;GE.9H'`/]ItrnL5[߷ޛ/o5SdߓuN~@"2/GuhV$Q|B;Ҩa;L+ꨞJU^5g/.Tܤ L4L[Pa)Z8!aqi;.88AɈ=B˓y6)U˶}_tSMMwd դ_``XYAD;5e&"d^^;3 fdA X,863K&cTX(L͒jki<=6455D".PY IwG*I}&5)pv?n[=6`r mF} W`qݗ xY&Li"faGZ W1o!J(V&u|W9|m܉[idls7k~($濑N=7hrhhudmtx\J|vhgi`.U5n/}۩ڷB[eT <"|v|+Tv$u!OqA2c]4ڋ*@Q}^v;l{\;b΂jlDM*q'wA;fL1%[GR<|dbuvG Rn\FRp Klſ\Yf7G/79?հUڇs|ðoQfgEI@\tܭWB6]gs/"A: ޫiLg#b1$pEkW cXFlVV >x<>x>uRm]F`m(HB/vkt.2.?_+.8om,X6h ]󃾉LoW K.AHc{a(_Ren3l&yC(zӝ=ݰ'&$y+y~#_D{k5¥tjOZm^:2i3RԑI~z7 Uqrڷa ??l}Q4eXi\v G^*@ha9f9֭^2w*MKkbꁾj6AO,tI'yCmf仢I4il/"a,O 7\~h[fNAoLQO6|]vbiZ#oab>zV?ܙ}rEsea]L ѥП_F$byт52<.,"8o[ST[9 "e80#AKWL~/{^yիaEXٵp_!Ï׫3oZLx_%$5;Y xk5@ȁsNUT3{/$U}Dzll&bcJH꺠F6?L{3[SŶUQ5.:l:C]CR~7+(7t8Q ;؊dΕ:EEaoSDeYmF"28 ִ#ǪDʤhpVMNJ/NJ+t&9fƔP[0HC apN%Ҳapdh yT19aL;eSO vuG"EU;%'-%2fJaCCrHUbMTm,j Z(zXycdqiQ VDR$> (LKt;_kPC eEFAhρ>?_]7?Qp2ERToTo͋Feʶ%'GQI[_5̍Nݢ,I&Tn.d2URFFd=)J~=Vfan VmPSpT\ lONa|{.oYԫ޳_ѥck.B-|ȟP'&7軥/``Oli@5A z$Of~vW"9t"͡.l1_q CnCч~Y!;bpրYCM8]Da~ur W: 7q?-vawc8 jjE?=İ pERwb iB#sh sv-+@ڹ/`= @[æ8㡤4uIrxa9\h8LoہIuyٖPJBu ^hNX[·>8[ܺSrP0IG|i|$E]ha5<ܤ GᗼNKcv Uum7w)¨] R3b?@|6u-* G^,ʖQfd15-=ۮ?4;âAe&&s_Hʎ5L.J:uI>!<:AaXbA MEl[;Mi&lŽF〰6-+=#Y%A{uh /w~2g(dH{rIxZ[qi݇ HSȿ8ҎuKx wGīa6He#:iWz&;8;_kkE,C, -se2]'AŃ qmG?5R0vnIEx 5'C5<z~gלl}4*~OO~<}m]ZCW)vI%ؘ aݫ+]]z oӾ%,H6M/1y;ꆚvr PzHvԭjHڿҐ%X/p[@Ж7dНsbGmXM9Se\ -اX`Jҳ,WեÏƮ*GXOwKNI)X|7fx45S-s/."kP@@Nm֒`8WKV%/fP5(Mjt'{ݼX6łտÂ)V\ن7?wa򐶕 :ϵM/ 2:#mCMxA}ȧZBQ[~5HxE?K/;9VQrѫG| ɰF1EF&)F :ZZTP/Ub؋1e1jBM*#L^-OTe]&R Vx]1 6M,C'Z ik)d>/n{vhM'woz>bfl🛳2\.ypZ[8/ E~Ntj6Cj|i s[N8Ap4m_9j>AZ@M1m<3mhbWAӡaEb擩ޝz H&$6PI"+BT] 8=x{>A"0=H^^]aNTŨ~w6RB'ɝU͸Dq&qTY?i<F?wF)l0f3:dc"r!jr)C~oSҁa,A{۰ii' .U~bu)wR e_>7~D]a:QǩV8FIcيtVePx$C8DPdָe@'U;%E7A8# #^ u1l(`1>Z,aZ|*9hv HKQ9'f+ԥ-I72Tu]yppx*irKl(^(㵲2S9QQ՟2E q}bwpuO:+C|- H?Gc&))KvW$[$[v mٕ۞'duZ;~;䄙XJ%)nM6hԐ=Wj-ATt88K&B4*@;5@]&t++1 C^. v!6DÃD*xxTM(|w7帤D*Y!'1Gc#yepN;;ĭ4rjE#OC~>fX|wV`KqzY)B ΚVݨMv#E}X>|Ov؈hMGN/-UɅ]sA;|`Rb9A.Ljz,2W|}kr}A@h{x_-`awޱxZ^E7,o_@lM01hMGqVVkroB] q}\ي!_qƾ,@5'$/AO4dF0q;`ʽ(eS~aI~Wea)\_/1pzԵd$`ż2](-DۤFb6<%N'Lt8*MYb9Ed7ōAdFA'!ڜT4> ڝmn%ai|:a \(ZPe`pg@'[| ,@g/{[u{>ثmS!BPv-N hfSqd㯞!ꯥ'$8nNsENƹL$n膎G#wɣiYʞSo$fbضÅ24.dIg$㰵#q~2UmM0t/7ÖSS8x06s鱰HҼl՟o{]3J.5 f Lk̘Q p)u0:iè3Ĥ6ڱ^gN޼VAP-D2z HU.; 㡪`K6m[RLuxAmK:\9yNQF/6f?9ŞÄѰ4xPQ+> dcJ.]|k!H- ԒZlLi| n Ul] Vg;xd3ߚqNp2%vx9rM(O@yL_55 C i# —f]#82LrIF9,ͫBf}i` 2gP1h%R`I t/:)of U6Uk}4qRROm|~.0Yfda lnyt$';:\&bt0:Ld =k`̞W"YmR>j$-4]Ūr=P7k./- :T ,eKyx z5xxU%o}f~ ncck|,z+(d< ZcKjb%Ss{Ka=d$H-ٔ Ir*Ʊ'oV5QH*+Ӆu/oR|c3Ca~6}ρQT ×wjʣXP\s]K1pM< ;K1S5eFB|r=*\%b侫ep>.rƳݭbEp XS1Y)*,DLL7oi9C;0Οv| ,Ug'iJaOw#]%"e4Ok~؝( nSƆJ">J"GKsnUKnf-"qt|2VZ); Kd~sJ9+~l횿"?61^ZիmL$Y<0jyQظT1FkAwXY0i)vQ%"N{Z}TO,79>"zT9{~G6mA1sM+x+x{D%d#ūK,/ԿþI!?]Z@Lt8[k(-T2$po8;: 9~[zg!l-d|(UȾ:8{.aB #Л+ .NNsc} ;22Ϟ.8irmBP92! 2۝˵N`L)ЮG$\0haT4SP=΂N20~xF*6/֋H@ᴮ LIǪ@ȨFBSJ.vMa3ց@9F802EtuFswcpYSKi:q\+~+QnD[}C,sA8G^/`[ N4:Iݘnqic-b)@1>۱-'-&CӵDFsbg52'dQUQ>)l}ط] NqD>kv)Z&KG6#Ch#RzK9w" 8wY7 m9rG rEo@eiZI=1 ug(#9!FYUErXQ72.%DO>D['RgLhTE וX=^EJ`QzK`Rarq$VL̄6k." ^"p-z59șF{ǫ|u"< B:Ǎ[=6$I!l:< d6&\D}t5۔ʦoXg1Ikh%pxJ Mu9L=ʬ+)s.E(RmʾULg-jCp0#rQ1p&itRg9Ы~OK M6x7l$s}QŜ}$ex3ƾ!f 퉙`.f+_uA j)H-(KY)A3l:;W1 2xP^La_~rGZ#b>^dZC :E!Hj }I}Dtϖ3)3@^OpY ؚ-Q̊^U] P9: ?ݞjDsڝFƱCRfu+DEn^ e^.8Lh:8CgN6l?4qZ\{>0xZ ?I5tҲ[q՗ Zc1;Cf9HF?o}_1õR]\4N{6M&R:UMjʑR7ѭaq^yaLA&`.B(OzP_ybI%Zh eDɞ'!,8 tfXEƔ>9ckb{37$lՆLNJmY$b_ɄϘowsh0*5Bfy#t3W>p9Fu߿],.+C*aptϼ26S&"K]|Tim0]q\].Nf咩cCR5nU{>?}_'c"|2 !JLQ1T~G+dKv|p1Y;Յ.6WV5 ߆L{E^x[= w\o ;RUȮȂ=~{uz<]r> ~R:*~PGYNIl1#.U ]9NOaϊF+'WfFZ(#k[=8+SFG9SJy]cPEDVIq;}"eN+RpH;"fIbTN*MqPfBp悵H89ƞ;H֝&L~eFmT ;p) 2QclLX߷vV6mqh*[7v0$vdCm lEB2h8dRPVmN4횔Txt:84ϸ#'iז4 ^2ŦBn!t%cnfe2X }Ri|G0/A=~Cteʶ soi&CK̔K)Rч4/"݃Oᾪ6wlG !t~4)xmH¨+Y׏eG`v[a^g+DsiYfZX:Y@uID3{ Ѕ \|"7E&@D`Jsv!L+ʳ,Zy dE'DwqO|orvk[;菾_ >' ĥtWdҼRGH돝׉P$xݵ $zd*>^///I#}( j;socNN,%-/ϥYWHtcyUQ EV[X 9{ T,π.bx;;ƚa6 d;9ӗ:0(AALW)^"9Kdu&6ւrzFI0`\I7W\qOnuIxZE s5^NGp2]+ht_Mb݌ eZ%gga?K'Wwh)M]"KEˏ%vU*5NsWr꣪xy*JCx Y=FM,CuԖg- KݘRn)T @MnBH cZ OnWsz7['"vUEߜȐ)ln$p}oW|ɗ\Q;׋['7p3gOhp"T";vk 9DRX}NW\ *=o| +7kNU)ı2s1_Qe6`AM -:GLŤJ2EU˅VE ĖOHP&˩AYbƗ #9LV"Lq}>D,WVܦT$kVG8A#[i&*6 M%:e4Bm3cU=|Rt!%ޖeTNx*z̈/=Ub#7;T{gP.k:gim+hS/6'ā4@J&)gsRIeJY)Qf#5rFWء[chS:]ecZWq3ʓⓠD{34_p c$^rց =0GjzԆ:jC|>0K Mg'nS{=nÏ q[/A)ai\HlW zXFa#*-'Jp4R~3ϲP'M"KbU e3).J$=ܖZD= ģ>ǙsK23st9σ,iٖABP`)Zv=樣C4[ *1h-B1רS/o$:~|t>\ 604*=MJE`[)Hф!]|pEB\W+6\>H4S啯/̬OܙI$ dO{cofUOOz?u E̟52>xm_:'2*F*Af kyw 2kiSGv 4/ߺvw 9nC-Tջ5WtueT H]=y[}׎ul9(J53ۼJؠ ]r6E6 ~YEK ǁa`8Kx%$2!nL>SZ|/؄> 2ʴ>M@̓.5pY90 }Lp1{c.O@HqݡԮ8JkT<ǣ^ZQkwU>fخW`E_LQ2Œ.enN@lu 8]Ϥ|,,'HݒI2n^iIM}*Bc3&^=(sAoЊ64[ljSQ+/EF#Oj;% kA 卛jiw}*}n~RE>rH|֢w xi5TO@EVYU(D{8:!ҖLȓ;ȗCyyI߇g,堠B*R2{p TUjӺL$ǁLh;P_cZT^h!T8Ig\Zh.FRDWm^Z+{XmaHH z-|cPiRBTcJQ-`_:.m R;Pq\u r\ͶR#"MP$ -U$%d`J]f ٲ_L;7[9bp (MgY fY$% =:ѱQ2+}'.j8p8+pٳ$|+W X{\.x r%5,pLڵ#R<=Flp<@RT۝Q"/'hQZP5Οc <":lO Nm4})Q BۅhQ&+32!MbDϷȑ{yd1yA R>v ^HVwǨp-(ۚ`D2  /K AÏich㹅dXQV_vE,&T <[= ͑m mnLM-M`Lu4 )ܷ E^N+6v3.5_) M,-@2 X7tpWc(Zwr3iڮ$Qr MPGK@+'DM Q&MLˮC}m܄H=5Vl8|LΚq\ x$x ف`̴* òErֵ'Ö3œ/s;珯sCT5h$+lWhMkV$#Ɲ?ʸ錬߹OeJD2"֙Eч0F-Kf~r ʪULߢӳVQѤvzV'QARfnw?<8-YGPY+pGƧ2nOo_n5&\IoIR20&WxΨ[t9nǢ:wq̈́bd0%J}bFp\:3^4QG  &8'E|B>/OkLsd=g$^\?rIѼ.,i ʼn'9H">uZ#v604$h;M{bfKIQ">"Eh9u.8|FllcVjB6 TvE!ܵmgPȜ>2 z ̽}$bɎa|BK/c[#AMu!b? F#.ϛ+ wY'WEܻ^ (b֠[YklZX 7q(DCj}SbM6O+ꘞ T6iˉ1@x)@o3+{KVTh';g<^7-xS֧̃Q阩]p vv?:U+|sKYdn^Z*7|ީ=!s LQL F=xDc\uk4QrV0ѹh6GYL ն gLNTP7_ɋIst"ia0xHHxԠSwUPB$6 qlXp]Dí޻SL 7)-pnn9Pp: S/0XKgIlk<~Tyc64oz1/ޡD;31^?ƹJYW ze]oZ5%B3|7ce(1Λ\oIAxƾZ" )L]o4Ê )4O9BrՉ023pU,U:?0{ UWZaua GBt@^ȳ@& ~>q8^?63MH8W* {>_HnYzo25y |Q@cO=~[ZQ$"; /_=d񨜘cΐ|4 L }vP]:Ѧ4.WfN, TتjE!3 PsE$`͆-tKp;[N&{vW\>M$^{TD*;Գj'Jņ޼' t2K4t J5o2$?wj1&ѨS/Ǧii7NHh 6p ||~!gwz3)(PNƪ" s7g Üh 9b.ikI7*AAc+18ͼG{2`h_ ;@q>v9c4sַҧ.E5ΒvH&ϕQK qsAB!)e4y_`l>W2m@JEKTYr+RjuuFQ.u Hu۹{-QiMՖ,1gѽ3$TՕ3MfY9ܹ2@ n>&\d2k\ )}'5Ҳc~XqL]]|yRz9=6KP#K?^d2q$Q%-uO0G?T &b\g51EAo.qĜd\͏)e@= CJ""`Cj;wHz é&D("5ˏ+۟C jbRk>a7I$G*ܴԆ.HEr&{Sǟ!_rJ+Knu &n̿St~zoH345$IrZWD#<ʔJA0UQL}rbqSjM|?OP4R5Xd5@ےMmlr O|ImեM*Vvh be.4g(gGǘE6Sh}GW_Ag ?ӷ,>Hg>cks~)#%.c#etZκ#yL(SG p?ĐXGF!BpOl~ɱrG7cIW endstream endobj 642 0 obj << /Length1 1375 /Length2 6041 /Length3 0 /Length 6987 /Filter /FlateDecode >> stream xڍwTl7*KA a-HH#!R""ݍAHHH~罟;ٮ] ab.pj#ha1<@LI@@ KJak`4N F p@L &-/&#A "PM/`(C@ qYuAbrr2BjP  h7'.#0G@`P4!h[rUn37 un`iLpy%6G(('Aporu H(/c  &"p{qC O$].0(X@A p߆`o yp L`\w AhooE Y ӄԱG:.[pAZa^>P]Ϳ-p"\h@P Mwp ,G)[?(@\p-@`.PE7 @|A[A08Pͣ`-<1'{p,WLOV#0aq@X\ Ab]?p@bqSWoobC,ہ@ܗ7;]-o{<qxAo1ߦпjuxV q@ !¼a q *- a_: G?*(4L K\JFX ܊q7)@PDE4k/@Qާ@僛:NG")=THApD\a5B(fm'j7WƁOfQo|ΨIkr—Q?/|;Rcji }ؚjWCk-oP] s'l{Rҟ|_>1zjtFZ|L82.tX;IM&@89N7|Ů,H Q`"x:Xi!b|(OFލ˨Lo?yylca%dЍ_nYʑB"!-d2'/XsbtkymaHxSKZC/$UFr2xCO5kQzݩERRlyl?jIJf Ѵb.h|sd"-;:ɈU鶸)IE4D>O6.AcoQܱ34Gbpf51ͤFoۛѬUQKwf;״-\>poUf-5xU?ƴloCLvKWeH,W6'W`"㬽%w}tQ:)hh#f4`.]a6G<-7V"P:X(#aFq5wߦbkp d9//$d2/+=F4"~?W>дCj甲lB- H.FV 3¢fc쳁NxamlD0!)a,Z-'!q ;m~O:c=lJyCi0h? 74(=,00q5RX/v*]ukPy^ hu\AiYe{+ϳc2uV*E׃쉿$9F Pnp>'{<Y9 j. (}tap/.a_UzԞUrQI*Qק~^)DgsR]k7m&..~a9Mq}G{}1= 9?e_-ę?>6,#[laQ 1)˓a>yJ;tIOlIWC֜?^WlWL*+iTy7 4` W`+VscńW@U& >y$B1IDq.aQAFֺ0у!M#l s/ނ+,954v.nu)i:/СG\/fSb g3ՔN_0fWѸU Uߦ8>,y_/g…N #rIq:e9SkG֗M ~0j焦los [mK8?k/ݶL)JVU4(Zo?7Kk *:;D^57"?dH>Ǭ)g\|`{FXvKL>Qi/ˏOfgI䒜qL$$>}-kq[VdŽV؊:&{t-.] 5*F2^@7`FFlWqSAlprU<@CR|ɹB^nٵ௽Y6o؛axP}n҆kJ3/9y[72.{p'L>~T8:kǟoxrpy<ᢕ&umh$w љ)Ɉ(_G0zIm++Lh&c c!<n3lfJϜ9ر[9пj,}_ayxV9u gKiob:|gS7d͗:$ϛ$2dJ*0e<|S1$[NoEK/4Kez6^fS|uUp@Rx{|ˠauw{0m`õ㷖iU:o{{=J,֤ 8+oO]®}J 0@ḎBv[g}>6K71yּ+{j+܄^#@T%& J t[i{hdt%Aaƅg!EԷ{OCr*FGBwnHdf%=y̠&8HLlÓ˛ܭL8r‰H3)hhU_EڛAtB?יa,d==7yo5ce&Dej: D^V݁O<Á0ZD`LQڒeE'(˳1]8F6>/A XÏ&P;UXoD|qD;es/8ma&|/sN^[7rҠMpYZ5W16:k\^dn{䕙?#*JIL-v~G/6ƂhK~dTw*Z͢eE|M)Rjqtsd]ֵO,L}xIJ&5Q'IqEhM>,;|gQ Bu$J]i}IO-%8YAJ\={D犕0+i,U|(2U ɩ8yk7OjV*MOxusDIR|tSڋ;DV ޡVz7Y]`Ұpy6I*fSf,B4wz{Oei~ldDs7笖!BJC$dƩ R5.Ym|lӥ1Z:ɉHC:xu涬ƛ&α߄h+CG.J- OG).lf Q*֘[hJIsøNuf- etq[{&&YQ:½K39ÎUՃU~ öwbnv_Y{מ) .;[M>#5&ȦCyzzo7b~TE 8Qdʒt,^<#.zg1T1C4A".;ia+iy=vϭ-{%'OPsy1AY Kg|UK()Jh!bj-7Fn1z9S/hމ!Wd^f47I:6TM1mirPs( Rk=4Fgӄ3Np&%NS4\\D"c$nW`&m]mbˇFR<}QrTt|͙YWZdڒჁ̪Ձ#fsPǦp0=c?'XxXcD"Ҷ "&{@xƔ4⊑YvXQrG%*67HEG#_D7 [CۂWKnKl?D6׎qk5](UTT#*sݹsJ;bFS\ڔ<$ e\c^n2J&PlTospAVk)8CW|ZC`ˬo`^{nص2TscFw t}gTBbVI2Ϛsl6EF" ,6)"[l`ׇ6뎗S߻eʷUd",8È6|Y DSZ}c{^: 8 ۉGcjX߾Wܐ4Mx0sp粇r"WjajN\<Ϩ=r+!|2Xאs(+I᭛3UQҭ~~G{~T ЄZPOq<{="Ά'WG˥ -~%jǨ_Swf6Hu+?ަ' w= xlfBDx -Bl;VQ䵘d+8,inQĈ7VύC%6j=dkWR>~A{12Թi3L]wwP[z82ЛKmί`2>x(]UTI\zjlZ\tmTb(R;FTVhܳbG+ POg,o)RqvgI8 |4z=H&~c8/jk,) 3Ŀ+|CT{&4 >%|l%,moS^duJ_ѮI5f <]wgr@S9 NDSxF=.|J/ ժM^( dʟHEC[}s<(Jj 4sFYq_ /M#Uzo)8[&]+19L8pMl#$2xb ط+RM.t endstream endobj 644 0 obj << /Length1 1696 /Length2 9315 /Length3 0 /Length 10412 /Filter /FlateDecode >> stream xڍTk6Lt# C#5 )!!"] C "H#%HttHKI7ssZ߷fgq}`}!ing 9@\i A'7#b1j v0ɥ&GNb(9C _$ 0@bP(NXvK+-9X̞@BB$m3@n} д3E ]]]9Ml8-_(ŲayExpG]My,iq;S0PS#3yJm')x~,XvJ"m^MAY<6T5.w GY(ȁĊˍ qEqhG Jn Njq5@Q׉xuJfW~5pBvE0Y{hX7b >%4$[ kPL!WW7 ʩǽÑNKMy3>ɔh^ڐIUH?K}I\*pP )E{"{s6p_Yķ^(d1F62aȣEv&ǛBOc OM Nu]Krϡ*xubQqU\.?2ʫtO}B/PcԸyb hEwf- gykpzp;%N0HI ޓzZQ-+N25*Y^Z+Yn0㚄]%{]Z2p "6fK8Æ oMU#~b .D~J+V3jo=}`1[9uJhmK*(2rhMld' p)'Y8³HT2Nn+/Pqŧ}[7 x.qt/uLǸ8H^{f+ּDlwY2dT .n~fʤ( OHB1vTT-Y4ߞ54K K.ɷE@vpa8>j6ԙAճym٫wky(kƨ3c~gz40F{kSo>Q-Q 9ǹljmnPߑNfk-JS RkX'4' RfsDz( x͎w`gmOg$^ >>%bc0qmzs)9;%1@U_p?*m"7- q[hCj{GWxА쐷0s>ԦraHؼm) Z]ˊG}׳8_g49'byĉ2,ZR9fڪ5^4##%N{DknW<6eSX~gb'sԦ\tcZjh~XĒCeh]*g*Qv4ܔ'|4m  qHL=K ]"d)2P.eW #,hV{6gmc'npB_@Rts9siY57k,k9V)t[sƂkzv<8wn|ϙn,"@.F$9rJZ }iվ5=ͩ$DҺ7&nnLYW9|ekNsa"-Gry̆T9*{;`hZKOot [fwtcvi$lnϕ=+w`"P5ndKi˗H{zH~*xDw9stF'/y(]t<.h,(Z/9rm#~Mq{>Zǐ"`-ێv~tiU6@DgZ~Aa6{&sTus5f-{H@.tyS7/luXM 5 & #Gk`2NrްNjt n&7/jOL5e;k6zY*ve3 Fdm[: DD',o( FJ-{gs˅?ΪK#6MMMnE2W37x!h}l7B;lȆڊO]<$fX%RM1߷AykMОk.|NkT4|i@KY,ѻbr R{ѽ9E|NÜk#J{cC;$t^w $YLj%;yET'=khxsnQە+:fh8fz;"\&-pxʬq-'C4W ?ſKE-ª)RGv]K6jF]a0zjw4kx_;p0i+FCmIK!Y{+kN dГ͘kݵh{FpRtӬ>)*zbžO(@Fhjگ'oLi* GX[У7"#1 »!UUbwJxzo>4zt ,4Q uS2+-e]mЃNGA03T\QD "_=O;9-h@84ğb&/CU`-6.t|e<(y_, Wa>YרAnc4<QoYHϥKqVSy%kV8ᵃ;7uCzv؍Rs؍Ɓ ג}$JC@>D "l^ܚo0 $9oiL$^l 0Q#K&`Ά,m; E24@84nG|&'ͧ u()2+Z[;C-eCp=xfum_}o7waoFNYROikHqo&b|Szl82[HՍ.T@noW}QT-K@#q3͏.wתɖ6JC][%e@r D!][4Hs,!TiT(cwY-{^ÜX]tT2yL{w:H>N*`r2м$Wh!"S2@1Pш[66)Bc(;kldsYfMb* ^T:B 3]MdYz('wY ߃2BHYVxϬ?DZ|/3=vf9>'Rw^KsL #F#b#!@;5> -H*"f}dz/ZBiFHISdVIζƁ'(22=j+2j˃8/\X4t= ڨE`mTQҦ`Q"+-Hfe$/Ohqch Β"L^.A*YYyvG6ۜw!]YLƈiBg_A}ɵf龋'00V֖:jֳ,,Y#7%ȩi,hM%I/ÒAi 3c0M7HfoZ/~zQɼi55 $6c MWt1[F'6D>[JO%]igFL9HuuW=h rCՋ1OQ0l= 4nP0X]H_ zDZ!{γI\Z_Y^.KST g䐄V1Xҗ?17zVB3-m_r;; &e Wqܻ5|ѿyē4C--a?Ha;rϷ.؈T[7h 6nPUhYӤ<ȦoSz.[e{%Cħkh3qB~#, نVPPq#QE}z{W==4'!-\nbλ(&G#f*čJ? mk"hJڶʋfL 5hYHFiZ_6`k.IC|O'cT谌Wӝp:sCȗ.߮$E&fjw>E 3PNe" cep:^8kR  P3Q[^|C} ];_zQ *c[L$wьҊ(E=۳ee>D6 HM@1SƖ雙NGJm1U*:q.(6/?/hz%1 O2qJ `M ./^I a[~ i1y)9u3EFz+_2Mq@-GKg"#)ЗedhtחNeNC£I&6iCDH9iwYn1iDz]'/̣ 2^yp9;e|t\g7<У Xa{eT0 8L+'ƅ-Eg45l=4O-R.X7ԛγ4w4@nC[; =wnL4É6Rdo?2czD&_-juzJvŦ< sɀ?}&c3KNkGq[.vPAPqDZXQri, h׌4IN۾ g~ˏ& p+-{k-^+kbW餠;S^;ۻFD]ǽ_^H;~bbm| ϶6Q̦Xob?Z44y6BCG ,4&ף-(W`K!Ӭ6OjȳMX5udJP<Ū4 =CIݚpw8iNP?iAϮHc&aD>Ju^uqaVQhEjG6 xD2smśdq!*]f:xŸ n^t;98"6* M ן0 &+t_Z7_{mpm$@TCoLi3T/tڅ0 *67Cr'@)(px,䙬Ǫ5SuW~=K;,ٮqĎ¥9Y I q;$'-x8hlWr>_]j'%)R/_LR3;Q"+9q(k!C 7jlwa"g "+cr@l<X5bҢKK`Ec=Y5mc4-Ɨ:XkeN8E p$EDTC۸Eau{#19!/Oxj2 K=tf U3A`P|ݰ#CQBޓٵrJ+)gW>9s;cL 'yJ_VEH<!MM6ot.XӨg/69y_kL}Us*UUHՏ7=銎Ql608G0r?R }^{`؛$jl3w{U-XF9ۈlBT/>˶/uP:IY/ q>֨3&HL&bLgNy<:LDLVq&F{@aqQ9N3P$Xw(965Ց o/VcIG:ޢcX:"=(A[xgPQ\] +ݓ ,)9r@+[3ٻ>@ųoP*;]pHaقj/H֍lpTn3[iLT J7Xs_t?9t^{^(4c0#)~GG7C(XO^UMIKuev  D1iT ;ɸ/Q!msWm~͡9V>ÐKێT[aELuMVUgG>5[_YU漧CchJM`%P?tK ﲶ?96Ifa>po:"O٦S,7bͮ+ȯ 3端֪L88M56p)߾6 xEwd;mN5<@ή~ ԭn׽* %"Pπ-@wXdИ3I4 #*ڣd(0QtD2p.t-ȟ%tBrWHNrF"˛_,%KKSPGMy$$?Ĭlݓ%m!:)jS?'kR;Nѽ92y#XߝRsN fv6sX+a2f0ݦR"'֍zg闝ufԍkW}(?->CW: M졬zǽO _k-FKFוS5h$76&bK =[TY[JT`LdbV5H=MwAxiܞ({޾~8LlҷնGb"uę!GKC#U*OؔR)jJ4Z#ۛMb fwذ)+x؀]}>P}T#^Yl ^x;}mÚN c@6z{vu%'z}<~xs|@f=:_ƳyҤ*IVqܕͣ|m-M iH-չT.gCFR0XCϋE{Siy-g/[LoR3fUKFF{HS #C?_'run7Ԙ2^ y}.'y^R2.:vXrx\߄XKI|AD,4l݉1>:bH-wfɲ`i-vp;vHc?a+&G7n,K}:M-=ņ.'% <\(#,cK#NE} `N,}P[Gos.;x JV >\ :|Mi j[ĈC"g5[S$ȳS70'sDkۍ Yu` Fxo&K6؋u<2vȊG\Wbx7jeܰz Up\KIgH>;2aJ.W}5!VZ9/YhC+^Q.<7LHq_Rqb N- -PW+Nn4%mRq-YJ&Yyŕ"ʒri`{\%&[=erQK^_T蟬Mg&]X'\qSs3: ܄D.:O\]hc6xlGpkK4P+4C AS۞o\ot.g'S0s]n^xZ4fL,d'40' ĉhY$BpiPHf҃0IY(?!yd3"J>ު APV'k,]C0(Z!f"PlReȗczTbw}ò+:iޡ^D[0GA5-Bwi[zam7)_yZǝ8e\GF~]A!DjmdQ?mw"la6:1ŒKS)"9Sah UQ89'4H PyO\jt擠R$"Tݫ'/#pf6 +~kFV ;,#7pE+rVO,} ?\hEe-GG endstream endobj 646 0 obj << /Length1 1709 /Length2 10191 /Length3 0 /Length 11287 /Filter /FlateDecode >> stream xڍP.L A w60 2 !]{ !%XdwUT|Ov[RjpS !TPpppqppjBl jCpпӣL HT6Nn''C?D@ pVntzG#SPs5J 'KcD3 @n8 K'';!vvWWW6#B uC!.0we-iP?ps'W(A`&00!P$+I`u8N6οe1 nkCas " G=>H@UɑjFnYB`N:@ݝZ0 s( l  j (BGfqrpp %v?ŏ5x{e@tOG  :'' 5sB,0?!;@o9Ǐ㄁0"_%N* wXi{׸x ;c/q)?f;=K.[8GTؕF:xx]5;h B w?\ n,yA?q'a]+.ceN.;1YwW̜/?鱃܎ }nn&hU•us,Ά4˶9wn,cr+zoZWj\m :(;3זB{ 7 lAtܨ>z!>Hb9FG1*}ӑpTņr*d+3x !.޵b'{{Xv {b);]|d & ڍ.i@?Sǯi36Fdώ2ukqƢYp0j`ӟuU:7zcÏ4٪L!=Sk_ 9w2l@qX_+^ǿ~|Tud|TVMcf'C *)Rdǔ_Z^ PRł֓}J-PO|YL߅9lu球[L{}a;&81f*!nXx=}>6}hie󓜕+.>POz[ϣEơsICfDWGmJۊai$~6j%yX|/ּB6Е.eEl/kSև$CCh.88R$OLd] 1"is3RG 1$ /Es@)f8 9v$ yO#m|oV i!}#V( s3)d.aN;x}<RF-[z`I?uʜ09 JO Mۊ-~Jٮ³rLwlB:+ m׿j$RӅ0ǖNI&t&m~zc=FX+k Hb5bok;CpS9[bЬi?U'Fi wyd5~ج{7&;7ClHQӉk x}ctFv/OWS6T Xygr7--+_~ڳ-;%Q:aП~]y%,ҩfAW(A] 4 1v$p^5uh"[~~o*QqCPs>EgSrλR@?_zH! BVGS_+51dfM/yږ ^:un5/hzq\kboARh'Jo"n pcT͚֧;egYzdEӑa+XijlQHzQ&T|D]s0omcD2^ȴn'+c.ܶPii,IC)^f"ك|Rv wzNI؈Cc"@o¶'QtPE4 YfZo1ZXSi׻3ғ8QNl4ٞKvţ-& {J0Gp۫e|;Hyys1* ɫmj+|i;C/)/"Iცb@Lc&SjקUM3U C,2ݐpd֦6pG`Wn7{~s tex?/k#!݂Դɤ_dt+7gFID5:`1zr7A=:xg%dl %׍FRr1 rw5# 1Uiy63^y,u!{|iYCqZF/ 2gI;}Z9PK0!w{J2C6D~WMtR /h6>MPIԂdr1ρQÅ9ˉ&&rv>)Ã@>fY៧>U(>dՏ|*3Žœ4/ny r?bF!3 `,qɚUeJbX5GĔ7#Êݴ旅fw\/r݋w^ҾQt9MZB.У**zW2ֲީP2m#9xo'ظ*TDV*b1-l$ͅy;c*`ڻo8{XdN--v3vi),n~'QGK (ʒnژ(ϑoJĹG]͞vqu FgL#䞊9ׇtua6G{U۳!柾BzimMVE*NjC[e[{.VؿNi`p2%ZթҼ <$);ZǕK-x2'=;6zV/쒂~pHG4AKd\DB^.E|K-awPڶs}.cuc&Iڲ?g) dmX`z?\ N ś>bxjvV/%ld$b)DV:j}c#Z[,cuϏqOM+lj*Ye߈:װ~lh -zJĝ_ wGs!=+}?1.hbZ A:QN539P3C^),vSZ'r{wV#8^=;_g~!?~)gĿ˹&6o,PJmWȝs\<]C)?qn-.DVWeC Vdnc+JtBÒ=Kx%yx a2J&,X1fy 5% 9V r~bnzκ )Y}d)_S*7%{H{vߥLʟ[ӢErR>ծ!sԄr6Pڮw7k-*n8x@~dyx> OelSjV[c3;D6̄\D\}EL_?zzӝ7.g<"! Q 4趍(zhe-p?\\\h&?FXʰ?&;C pgBuMGZ+HҼ\2 ݐHsF7/{{l3NY +M72Ƿ 6'՛ sOGdFr34~S]x{\4tj$ 'YՀ%Nj6nj-&FQ5>_8jPoͰ3łA~4@D&`Q>9F}ryJw2r*̉"BJmR;,{ŨryP=6w{7*>b[?H,@7fA˘WqPGwWUfk?;Aڬ̇@i%Ȇ4V-.K'&gZ/E$iB;miԩ<nkR;xdw{e$ı샸a<TxV昉Qb+ʌ*3ְzdǎ%h 1˳tq_rxz3o7㓔>Lj/E[\GSzQ}ܔ$|vPzksOԿyuwi4Me}sZ X8o,(Y_AfA&4hY)_bKST3CeHbCC.'(]3ȵ^(;츆 /'X P>b\F,{=(}=sW Ɣ J"v&fxyij-ɞ 9]d'N4|2 $.T )8W[hg{Q'ۢo#@A\))g}L"dR-k݁L.0yuT5ZgmIMvTmU,3*0F3]\6:ҌR9ĥNJi5Op5%i>f|'7^q3MV}6z̡/<){JY0nK+x9_l?mwFŊud\z: JeK׍;B;J65F8Ѓ>Lޠ6?q  V#<"|sb~FT0e.a]PfzToH:MOA&HA3~HG.G'oTp[kBۅ//+8 ? v!( q=_QLUh;6x/9ћZĔ)=I/|eX ke>LB-NQBm)^ue_:<d1>l~G]M3VuUOE*Y =>ٟӗ](IԲYA?+l5)XA>C+&F:ӄ*a__j=:H 5 }d" ÆO|~ƇUn.۹m#i.2e gw&w['A1!ZŒ(O&(V=UQ7h5GpbM D$TNӆN *P]8^UPSQqdǁ&yfg0/+~Cˬ;6yiRTKw}bN;&c""l5VĶN1i#} Q,uzZaCZ%QES$N *}ŚhojAIF'Wl2 WƎџt-.5N9`뚎쳢$~&r.t/k8j^+p`;1R|<~|~_}sU;82HFۖtHyc0M}%(KBZ"Mu# {}0^dڙlCt_'G|9̨N.vl}K @qB>IOTXP%k_}"0wYD%c@Ğ4RxN "`{+&<Ձ=C\ZeAh-~5$/$ʚo٧!_"|ϐBO =R@rWdy_ŬZGM:lr8t%z\gzob$оF{u酕Wn)2;$ei fgBaO0,H1!A޲OpX=4Zyxelm"Y-ZHŢ n8c#f.">ʎ ']O`,KW_͸6} <'F^} F B J55eu~mwHJثg~rc)Ar aGMx+Qpj5 W N֥<٘h -9ݲsqX|&y':JF č{smD#RK/msR(w"f55<$9}*~(YUQKSXB%zPud^ِ #AYW_.㹃Aeo*c撊-PTFu'S-ØlwQK,0o ƒQp/q?r[s㰱 m'E%X*B;,*]]Ɔ:mtlɥds#c,k`1eRA@JZW髨%7 E/:^;Eu>mC!RAu&Lxc%ZuZOVoC&b{EiBXٖq$t4NH4Ձ:[ʣA,ϙ6a(A'j=A=\CϨߩ Sm<|FJj =`޿sk‹QG (<`bRʄ $l ;fa➆jFOL6Ju/wlAqhG%6bj*{Nbb=pZd6a`TFΣi I:ON$;.$n>S+uUԬ{Y(ϖwB6"8ٸ'*6Xh~CguU_D?8KQ^*/uía/Şe t{#z(WLJÚSlc`H okȧig(wn_"OQ s^ * xnTd#oR|^7 :mcˊg9D:D'4H: H}ān&3dU`GW[ }cfO] h߃H)dZR1"f\jP0LE1c.󟇿1΋aA:/:sLh&̟̅( lK ?2aeé endstream endobj 648 0 obj << /Length1 2506 /Length2 15805 /Length3 0 /Length 17266 /Filter /FlateDecode >> stream xڌstV5il6mcŶvvmV㛽9={c9grby%Zc[C-#@HFIZYLGNld#W:8pa#4pz 8$F6.Fv. m.: \=(>99ivX̍ l2Nf@FV%[#sldEOJg`Hg`jdP:\ƀXmlfJxXmߝm% ic hp+FFv66s+ @NT͉``cD=CG#s;'G:Gs+Ell6Np'l4z;GlicjՊ3PB?V"2S`_I+igk0yomn|t4pޞ*12͍@Ss@; Z $d0;όmm}rj6ZP Iebf18H?*acb Af?{ dm P6+߬E[5YX[N c6T ͝V}-lLߩMIQ h,odd7MvV6@y[G-#ѽuοUU߬"6F+TLO4g=ӻ Co_GKb Fz߈@//bgЋFz߈@/g3FdE1#&oWޣFQE:_9#NV]e=NZC?:&NY#g ?̍EZS$ֿC{=2w~_J wX1,0台m û$zӿ?Mk7̀6X[>MO꯽ߔzmnCހoc?=k}8vVοc~ꏤ?>?a|; KdLދtr}^ο'ß> ?x>%]G:SYFcr~l,j~U 1wܽ9EYnӁű,gɽH6 bwlFCF;,˅pC9qЍPȽONWhM)/{9(|² XOXgrV> \P3 )𒝍'hs=3!bpN%\LfR?h #r(i }HxZ#? Ν2}ӱs CH5q?.4?f/9c<6i>5O Ug\ PqC`ܻ7]Q8]z\X~ $?eIղ}S <p״V>eGc[6b,QϔEW^{Hݸ$#u\d/8N@k+O<>L'`E'1 AXV29B8wf[{o%QJ952G- m<՗Cqu%YԻEWc:R,/eB*qrD:H)tD#e/r7픾z@ZB 0]N.$Ay.8pQp$Wa#R!89\C>9?uE=ڥiAWo/Cp[ruM+7H:GM|⴨Z 񵴋[X#i}.I$iyg0ںze N`"|Iys?<0Gru(;;oxMtx1]LiG>7; ȉĨz -:i&i D٣ $TyB!48ĤnHtpIP#vk'WK꽸7SVZӊp2hX> OjyPb=.<ȣD(k;/ڐϻ\̏7%[z)Z5e9WF8NQE͒lʘr#$|}j`z̳E<1:!IsšơEqZl 癗]AX^ tr7x혓w$ o.j)M }a#|ui[ܳ+N-u>ի';:JN4 +.B$.C7fjےه ƙ)C˵w0f.b=Qm8vɍݮh N>m}_u+WBJoBgE 9前%>ۙ>)g6:uhY;x--3]=m{ òěU؝qXTIh1b%24E㬲,jX܈U-Tz2ydǩu#'p8S|&vfv858Tݡ_W<"zei,clz| 3Ekݒ^1xF\_tkbDӇlTh':蓛4;QeN$oy |7|5+rSh,FU%ztBi/Ya'o!I]xz`RI(?oPc$"k! VT0FS:CѿFjyWRg[ C`$mq{;ӯxE9J#Ri-zQ_n0QaD%u 0,XIz9MJKܰr!R@!w@nUvǐA7pUR?*fI>n/ ZHxRֈi8 _Zq{L# !p:-;=uK'r$ }W¾tM`osީ9 (#yB>Mltw**2o -h>ZI):Tq%O<5(H?[bPhn;8׉6`K*A엺zdp8B "cdl4R{6f_3 -@aZ 1i7K_fo,>J2P^C,KjhЧ7KkPZhP'4. >a\e2}8P&]i?sP6T9o"e@1^9l%uS~&ᅵ͗0ؙ3f"4Aw㙙=!efZLlkcs`Ft7eLƛ[EXࠜiq^1沯k]?eogVq$|ݸieԎ.9d'a1FH.SC_sg^DŽJ0PuH]*O6?T{ y(c'Wmvq_"oAH>Sn ̯sW'i 7v}A[N.Om筯ۖm);W>zlxjS_r_Sb \pŴz#=R~g5 eux5GՆtgp?XԶwլq8@LƗsew-`V_FX`O)2pr (O(Ӈ%]ջny!L^\IS!X;E3lܭ魯ԩy[ʞ2~uz\=~Y-hlj$&gp˦Bά8\E cY^.57pE 0' ־u6yT%Wbj8aϦzrBdw(a@1Gpesrڊc< LAt&0ޖ9W48.y Do Syzå0!@%=D'BI(BSMĨ-W8TZj Ab;< GG449\@7 %~6# w&EsATdmSWq1[ њ1]x:xEյpd+$!bי[,.^ldPnmvgb};IG[ӭ(#ر=xR-igmZK*G_J `3ALgV:Fb-vZq;}؍R1?VVd`5!_hZ+}_|gfϯ `ñJP 0?pǁ—EWA3wkǫwt'-Urzrx?Ĭ#0oI۫d]*d^(WwCw87q|zxBʆmEBWsC]JfIuri/`Axێ]ߒ~=rKV0=^͍ ZX_Y6)i 0P d/VԈPVO!P٘ȓձ5[GY&SCo:ܫQXe,;„@o^Gqf>i1(H, hRhϺlnQFLQ{)rؼ Ţ2A(* ugOYMmDyuw TT@ ;߀.q۸n3&JQ+1dl3pX CZ")f7X zx<'l>bF;Қ?^EZНh#*uE_ROS|振9.K|aiCл-#~2)`e,;xvN\2kjX S4wI#7 T"t_t5.,5`/B TlwdV1xs>\r잸e=M ڶP`;Q;v]o&F\vb3hBMB!DHwEkDT!̓_ֺYR5s+$RMWBUŜ5rxZ"Q閑D ZcX$]⊪찘05bg+ uu*&k$zj'hiܱ߫DWK1gY 4r.g ?rHof."2{fۄ#Uy B V7^AW-J0dyte^G+)!k䮺rg/Uz)~DƗmb'bZGөm*^FWM2А4`RFw-t~A9;ho 8hEhMW4aMaɀu&<՜r N>Zڊ S qfDʎz"vGAIN aF7 D~];C3HK4@] F.m!U.IVŌ6X.0.aFKGş fc?TɆ*$c^&s荅#+,', ^7("ߞRZKBLЌa=A3cu _]$}&0CO$Fr-yR۝~zEv Lqov9ϴ+'8]Yh{WV"LQYLOGL_HvVzȻװj;?` pe;:5r(C 'l8,hvcu RyU{6)6``RxĤi (9wuPG9H5f9] ~Pڈ K#k7v["ӊvcoWCl0yjcٮ&h8ʲa Ryfz_5-ͼ;7C&>M#^TXn}+Ⱦ'}r@ԌB7Q6lƤʕ<#K0S[w  M ].(B5J`PEJ{WX;0iX%Lqܛx%CdEWa=wнY6A ^,'_yM[8xO:$i?yy%kY18byUpLr*Cy?̹5t>|zv/@ ˌ|?䢇B4iAD#;pDPu; DVseƍ_$mWYAњ3B*MmX?QA8?ufGVS&djia2:d^m9G(KcZG} CHhxu/BVlԳM[ÕzH2+}a-F bu3`͕̇ O`(6d #ѻA9UOhLtqq_8P9%GrP)3 uiuĻ!E0% {a`:hvT:ƺ+=F78eYwf3$FmZIɄ"&30:N9IvR$6dðűQ&Jo~pDZS][S<>s#d~rFG12N7TDKo'P*k>^A0ç+d}YAmi2Szu82C"f@ATZE]|F3Yt;<qd(%vBos y(gAdqjA!.@C_ryE,ŢQ:| r.D$fSUp\:8h>IVśX:4rlܓ &hC[.ߜ^UFBiv0lHہ^u~@}u~޲ݍS2,o5 mb\#'j_eCųhN_Jʇ($"IJ?M66E*>O4D߉pwPAް]S֑>#i[ m|# p#(!* iw"DP4LQeQf mۅP ݊ƯFfvc˙#T3u/?@ZJ^.ЫɸɇzsFG=?! ucǏM.x5 HKi?XM;u[볟Z*-Mn@/n HxÄQ/s =#7:Nw'B靉u{u1 Y2yDZQN/0N CQw4d vʗ;t#/\<_޼=Eq=}ѕG>8GCD/Q.,|ػ*rzi}~qywfܗϢ 8>z(<jm;4xJ[`(fꯄxS --fM+0-"^IPǴtkZdpBZp U!ffk k{kYUy* 7v8qz;PȮ.~KkMHߔclC@&0UWwp ƒ7|)H8YHLG( Sz;%(E.: p-0F52s͡\m蜟p]}|\fr<ʍB7q:PTB”+-%+Ee + ;͞"m V Y!s-0FќF3ˆ%%C;gn#諡_宆( 4RnQ;o,Cxw@ [,(נ+~m+ SBb3[X[!wE t9O|3sܫe#39,$lKpAS72O~BO23 Z`Cr8Պjڪ]Gr^#u;os73,{Z?֋Z/w?Wz?U;~.Daapf&fQSFb+Lbq[zXs۝_֍mfPGB2)SkxVu}i6'n% Ae(lRdn`=2dtG,6v(k_{W`]G2Rz˄-}-+ QZ(! (P]to 4R__.p\*+~V OE]8R _5ZS rN)._?G2b*Vq;^VR0KFb-¹MujΑKݢ'FJ@_QCpxl}rhYVn N)8=! lnUv?P;Gt j\Ks;(? PJWss(Nf<$`;ذ&N{}#ꊍk*Lٚzzh*+a[_}a +l^^hcZci yYbvz*zGND{9)8+8nK%p͏2Cq"7/20.`n,"5ձ`_J֣.~0vrTaN_@*tHPܔ=pwRD Ǵjqo GXEr }sH]+5J_tA}ѝSv[z؀ؼf&{6 )ozB3SQ4h1)6pM󠇼Ӳ0%sa 6qZ.KʠrAMwPf6VqVCi_"de`>O1Z-K=E I2piĐQ)Rpc=!Fe5sH'dI+4wYrp-OQLpd'xj ^;==t> &һBY~X8WeEۤ-g0Nw?f3H;JD5YtAz1zo wD 1%t1e̯J *g%DO!T0 Ga~Zs73Y0{>g5Woh$38| {dC"[]gH;N2:3D˿6 lePљ#ugvSzɸ2k|z9L:jAFG LfQj +6Z~\KBd)w vaARgms"މpdUAOvK="9%>Go4Mls%Qh<%DBt]\$Ń)vXS7F3W-Iv{5Kjw#ڴJSTYT/_-n7r/*YtVzh|yz\#M 8݊U5sCdWTWquAFPN0a/H_7ܴ9E'l몦bC/XyxEl y  @nsRt1do&8dvqVtyGaQ%ab![[NлBW&}_,pS aLyߖ %Έf,Y5:NO]53ΪIMUs )7ىyHirmzpst{4EKx}5z4ڮuIշ+QMr0aȆr_ʹ/jZk2vme #"oW+6Eg}(Զ[x* ~oX؍R J|)ʒ[C Ic0/Ff$7VE3&5q$M*R#+S!O-Je9Sߩvݯ@QM=@̵/1J Xi?$[TVpTXk4SDUkr,'gQ9D|N}n^ \1BFEeĵY&G\=Ķ¢Wy-?0Id BQՁ93=Fٯ)M8nZj Rv3Nbg yk؁+}уZk@hiqF7t}fKҹ{<4OPԾxtFljJSg?&M6ǓF!^B J]: U,Ƈ -2[v˫iz>+%[HjlEqUt+3z'Ek}.2ucũ4쿧* -x$b oZ]P6}uHepZod̴S0:w0TE(YL"p} CgY㿨Zp*'ls(fI؂E5S5<Il`e!b10:ՄYAia 4Ab6*a^UiK~b鹑VY7F*6I _Tk%Ba@+x9 FP!^/:dR y|tROn \~mubB%ivk)s?Mq؛OV{wL!Q4LPe*~u+r*}}FKj@Uit 1kٸ+T^Wd̡4vnl|?xrk'եl;N~Yb(m&%V9\*99|6w56RY -sr_B>c1_~'`Q8X7:2}h.0"}ΰ[yI5^Iᶋ$\ah~8rUwY'89"sס .DUɊ95bm#BV1*SLH ۊX!B Ld儏m#v,_pVl'#K*;{(rXVjT|1JġF᭛q찝0|%hFN3/Z\\: Vj3k{JH{O'px̋xsqh|DM`=_k AKcBlGҞ Ӆ&XP:>a] 8{l k=&lpQ).dG"$Nݬ(--_QWk^|}Oc@3~5P' y D+qKNL,)τsзnWg~3)suZaܸaΘ (s8ߨg]oȷ$QP܃GL2 ?,j*,0]6@\@ޠ[gg*f(EZ[I` &&jBulu~?/焏"? ;̈˻* +"dT#`KPXxպFa,_$NΣGerX0${jR]4tWG5'`U+A #dnsSafCpi]5GG=7rl>YcWŦ:,>YL'9z~DIl#F%]@5ӱqy5I5 ӂUOl9K/I}}Z4Rۡ؆k]8p3|[Ghgam7+ $23Q P*Ps)qRxqpjO0b{ W]Ts*ke yFQp]H(GV{l&1@3/Nu럛Z0Q,ηPSvkqY:?o"eŝ}ĞBK_b~KK!5 rKpep r Y(EiZ Q#Ƌu Q𵼮9VHp۬J,oa&j|@~-Qc[ojB.]ig9 +.8,|n6̾Aah -i$GdSQϤ ;^Yi+e~wlw!˰D7)֌R_IE)נm/sL#(ô+@_ ^v`9j 讽Cz! /h0(k)W HjHFX+f}JwwM cB5Aʉr) 1}a}ɺeJiqŤ, `6wVt ui,yN[+"ǁ+Vyi+I$5 INx;t'gE|cXG*pC~`CEl er43NaJIY,V-(]ˌ|r~./~'j4FR:7Q^59`{ZokkO#-u Gc+-:ȑ/ER-TRd18{٫>_G໙MEx@_B1 8]@ uS<Yq9(GmPc"WŶ0|lT-[U0u)59ʘ2 Cg sKoK;em pp]d/х1`LGh>c+=l,/+}' a RtԬi5љu=1[U(HҮy^C24ZY%;OxmEaS={ߴu#J2HSZ}]ıJ,ꦼCMWR{ʈ4î>C99Wl-q*kW :`̢>I!zcqKYbL7+xB$Db)IlEhCH}kBdeYծk> stream xڍwT6" "0t Jw0 ] "HJI H"tw#~{y}k֚y׮gae㕳C@p4HP $ʪC;CB(.$)@ PuwQI1I$""fh8ϪpF >?t@قqh v0%8hWI~~OOO> p0 AA;ʀ&g5>|V@+G{ Q)p;詨Z_`<UOB0d- =h)<n vF!`3{t0,7 sEP0_;*s}Jp; FO^7u#<[05] 07w̵ >( @ qq ^{B~~wuEk@a|_ `h] ˾$ 0]Oav`GxD$*p{ ״(G?ki" 8ssK)?'Rvwv .0g?k⺣EFwT a^;m/74g@~[^bu~I;V?[*mvd&(" H7>K"" ^i z=u/_G[w$Zkp=oaC ^[1TcEhi'R|SsH4l_[JzNj‡hO[Ӄfe1:wysZz; t@,)jN{eXJr&Ԋ2&Ңe6m`F0̣?ƒ!͒U ~`FbOcϼbS>)3IhZ{hIjrU̞ƥ֢0EvF1{> od$y܌y뽭M Úm\qI2}+PkVaD}lE^)qz&B2'1#']3ʦ@+qX\K"L$_pNrf{|H},6|^ZQMTsiyMϒtT2ThEmURTV<ȥ A&h8 ߺu/$LWf/@CM |w[t35>ODh-u?(xjA4b&xbC8dscQt)n <97cnn\+,`="EL k~S@s5کl&hiBAԇd{N;3F Y|swF)j7UN[o$QÙx-x?i=>O)N9tx5^N)CXS\uBĎEɫ'eoq?Tǽ s0&.ƬcjjL C=9U ¦4oL#-ҝƲh]Wūń뺒@­7j".Zn+yk.p虍O@ /LD6oۯC:}r j 0?pJRru߮4Hv|DÍ{Us[%׊"Lɱgv.G~۟ƱVlhtaJMM6>/5&X\\K륤l~5׆A$qamP4GD74>1_:.jRGd򝈱@frMNI" G{a3og1Tm)Iv^]xM\Uy['IAKh^y-;5l8s)3eMc.oLNj'[{qA YRjnɇ"2_іУwb^)H"Gk< O>՚C^zH 4M(C4@J@aM6UWjJδk.~[%ߣGn<|(`֛ϓuI~f^8%jP2T-ꨢWO"s={aN,iJ?S)sHܮ}۹J,'SNY`xsw8rjX 7Őh@ӌa/ƶhb2~5D&MRHhZ E4~oa|t:IIA8aIQ_ƕzLXMQWb#ˌX pqq s;let;Hϸ,TM { &[48N%[ %>^GdCIJžBz|٦,ʼwi+^ lRyȌ|6cw" ڶwHQ3 %IZbGLuaKerJ"̓56^VnVÀkt}I2I.{"uQvJ,֨Ѹ:bQpQ1MAJv̎*-j)1UeWRG'(<6nK:ybW_TCҝBx֊G-@;[ :?,* #%/>dͱ__ ߺS^1CLVmŒ-v3{wK4E^;9\a5L5Q䥡t5|*O=/u^R̰NwΪ}P.Wa6lae:KZ;q֗$og//6?k$juG?⩹Tʨ |OR"ik(zvrCt*91j-y60:,1u䐊O5:A jCbF %Fki Y[XU$#[7Bzc?gn̅<ʺt`3o?aZe`,e K nMQLPx-^2/1EbҞ͒D/}ayxQ=]y2;IϬ: REt}^ki 6LkK;lAW,wGdib *17t=.q=/60oT%5}U$Ή [Z7"2?Ik Wc>V̄?\INSI9YVE d?􊆶1ӏ:L+ c1Eˏ cpC a6w!$ ݗ" {!4l䜾zX7C ٘I[GUf% 5š,$~)ےMĐlsfM~Uq|AO|X5;AL{c̈'e3EX&Lܨ@FĦҥSD[9Nah\;@ӒTb*IKM0gʕ4[A4A~Zssf68K~2-;Oo0 jUR 毮ߑ0+E)[3_ -6}2_sa=τE;~!CL<~E`H&ay%" {ä #藨*pڝw}_AB/kt5Y;8/8]hLF, hsUՂÌfd Y^~'?4u2* 35YJVWސH QV&YŒ!w6|%EvPN~sC;.<=xSo;ZJ69aH\is+o!q5{ǾPId=$is9ޡ?@_ayc*r= t:@lDݗj*=˹zؚGs,̊IOA/{[5Sk.$6r(9iHQ67c뇀2G38V 8R]5onTI?]]UJ ߄"U02]|G|Qmd"jB[(ÇUQfU7;<%>8S|S\NTjz)I.Yyӥк'˷v4R^bd*GQ(a?;)^P#U-ynȳ]U{P מtΛ2:Xʯ# ۨvz֒4bg/ֲ]Ďѻ/'ڏ+mxE+uw~# tdV!HZepŒI^EEnk꼯@9`5mW\v+l!su>.c7J B{R ަ'a";KeJZ"6EZ<%* .QBRzHlM,,)m:vnM4ۋ8xU6qV*}(nz]Gs&fC5czE?&-ڳ^Wet>-t*g;gwη %H]m,/-RM'^>r164EJH0PҮ ތ{ok`];'zJĻ1{),<2 ~kӊxgCbeR}H MM~9+\tJv<݋=8(cN!;ZkS5 o&%)cr4v\<19Q9y; N.tvv}YixƅVƃLv[B?4XN#x/t􅛆[ N燼X7d]r|B㓪s&u{Md]|N8*_rm9No_tZmл(g:2zn٣FpJ t-ɩN< 3=T}ӄdŸ?v:ѥ70| `5f+>Q43DzAA9pO.h!pը0u5O'snl5\~MNޓk6Jnlz=A]R-H]>8ѪBXpn89pC.;`/y(pq{#bbxU˘alwI!Bհg`q [;Q-鉒c`1Z;5X4U/\fKԴ; 'TiſЛ(/]G& h1ZclVRD@qYZHrgIǠ2qcud{2IYt =,O n`\NbC}nc2DŽV`>Ok|7&˂ T 7w*>rHP<by8CdQY7ħKzoNXYlj/ ցs{$6[sW_0EoRSMV$D3h ;;(92)6b"g)N\4ή> stream xڍwX>!5n 9EQr ct#")) tHHHtt;}]9<<}?XtV8 ʪ* ?7`aу" , ,bD,(:Tquyx@ $YA@8 `;y"vHB=œӁҎl [" @]8 Az$m G>~ t": b 54Pl又.nQ(sA¬! jyP yy.gBPdK0d l6PPSAZ¬-\|K7K wK65P' א<ʠYf- wt._A0j=y:0;o 5> QrB@A$ʂ8!`;_Ky:A~yQSz;6A Pb"_ `$ b rClQ@@=OA(A^?Hf 9x}<*zJwTFr aa(߅,608P~QWnҀO<^? 73NnI7Ot:x A:%C !Xb uu2% i-\|8. P 5) h].T _1Q C< %7>A!%a @5zti Mf 7 DQmsy~<:X@ݿ-A j 8c .a y\j@Zy_ Ń˃JiݹV%vόspC iS f2g '\ Vc'#qާkв ehZtD-xRֶ,>mq U^6h4Q5^AZuQf.:FXz,/f;V25Zs򸁕K%bTy7V2O^mI}. &5"M=@}~kN{YlR$$EK<ĦVXף7].~tݽ,0Xh øvJTz1VrnYk׃bvzs!*uk3w3xdFea>n3 -OXpJQ\pctvLqO^",OXrD߅1|\V:AOO=MOeRNegRAdgBWɚGOcI^O" Z2HO0no\Ԝe+P &^\պT~,@!9?%k9?oNF1nh(κf2䳼t[xPpBHPCbk X]`%>ls7EFeq8c"O򙞻uARGd~a{_w4ɇkr &T(.wi=v勔l檦\|Pղlv`:vXA]4_~w)heNεܯ? {uDt_{v/MMl".v)]b7aYsN*]+S-Yk1ˊtAY.!T |%Œ!jUMfvf3HŸ'ˆMJлSE[G}-J޷0+HX$9^,[#k,15:4X#M"R/E6#ïd)ᆸD)WMs3uٮC!ϟť[Rn9+nJ=4V3jefǨptJȨ~=\ʒ_ =[G].l_EAf0"ٴXVMi'in˖řWI I$'ԇ^C1t? XfAcEhɢVE=5k5:R?j~fh۹gMI~8Q )>//aW}AK93: +1L-w}#]p脺k d@jrQ W CܚaG KSmo8li< #ͦ~&5- [.)Ak?XTU5$> kn?;IՐiNjI{I"XWuOUUV=i>\QmٮyuG 7jS 0a4Jr nM⭋ '|ɪf!DWFo<,#]r e͑dž&ՠd۲:Ŭ3ef?8/H=C4-էgJT-诼$*9EO/+ M~)+)3*^'?yM".feS}TS _;Iв>L{@p @4t6{'Tԡ$J(hΰN̷wCb&Yzڞ/.[RIeJ}13'$ 1|. T\T|I*³SBil|԰]1 Ԏͼ,_=?!}@5 2QM7&C'&wӪ\e1Ij2l=}h "껨M2Q z{jOCo4gC'4~`r,[x~d'f$CB3FNQ_v1&V ^%Zfߊqg=?2-Y)(q6%bqE-f5{x@0b7ZьxLUN]e͒>+7~\D;ʱMNOt4I읯p8ȚM2ŬEehL&nk]_=dQ@ΩV |>H&LoӸ `"ffU'7zFmM-|Xcg|lb!,ߘg∏ntA?')6N|i2>OOWqͥ}ZNцoD_QhL^ja.vccWijܪx g{|Sl~VK2jhfi'Try{ Ұ $Œ*4zM6)],g:6_(OACL,jmћk;rA[!;#Db׷&fFX/p ũO˘ -Bs-H~8sߜ5U7vOOgOE~Liz+f^PRq>9K gef &rRrrnv @p F S2–O#G"ͩ|۵žCkA$4Ma>.Y>lmMr^͇* D՞NסA}]Bp[931^)Q+ߘSRoefLXv?bt8V}o\1Q6{֣ޅgo}41F%Vp>۪}`PG'h HB.,h*0 1Rk}_qp*{ǞN̨+fJfmpvSk[h5/,Mv^W\jwq'~R<.K!՝ç K6+[f?4yrV|̌cΧk##%88Lw֊5@Ȏ+5ijX}GDGQg (+t~~:͡Ok.S wX޹6=w5F¢x>1 ~FQ\ 69i'6`x8i oևʷ2S6Q:+<| -.eP|hέbVt}.MNx1=t*ZXUdn<VN8'YI͕X I/+{8HUV]jǾGyꜘ0ެ/wRQ]dp :m֍:KDlMp{p3S#fi2wΞ;qCu? >;$݉:\MS]iG;f0 o1d^g|~`>axA>aUz֟Ax<.\zXn.eHV{Y雥VS#"_ozMUjہY8oIK&@"f̘xžDWB>dTrVŏ]Ig(iyS*skyh';y+j#1A~ǪkE!CRZB$~4HM@]iQqqhyATURkv3/uhJJW_=\ ix bϒ2V\ovň 矾8Md&dQhM?X6dzb= viD$%#0j )dBc~KhKOXdL{^cu}E'cUL+mb-O(=EPC3h/=kŽb|/@ᢀ>/^PZuj~_->ɹƥ 7*dO[N|7pޥRˀኔ{=W6=HN %#N!b_6U~l6=6)T)+S͑rdqł'^VB _ $:_>8ƿj;UL0\[AIF&KNQ}*%$hKNbfT4O$`qu1 ; 9S6}}eiSJԺ 6a|'IM߳yS [яc)5`آ&|證M[ n,pWk-"8dAJqw`]u`}gGBGLY~6/uxj3/b Γߴtb&W&&[{Nf֑͐~bΰ OwxuSk1" &B>H|1{cZ[^\LÝwפRgAf$iqg ( p{y˜Saq3%g;G[tt9lKX_NL}Z-y3Cx]ϻѧlO%kŪXTn[ͫS44ΫۇkeGW,xR/-'؆adgUiXUS/ph-kxX  endstream endobj 654 0 obj << /Length1 1644 /Length2 7878 /Length3 0 /Length 8967 /Filter /FlateDecode >> stream xڍT[64Hw; ݍtw7H3 00 " ҠtJ()]%%%H 7z<9k}ߚf}]{_YD%k)p.>n^1)/W Ʊ@n`T_ y7 )DM DxyanbO@ܱa>n`G8"ߏV OTT;@@6pG "#Ї `p]xxm\ܹanRl/0ryZhٸƍ0peЇýl@APw@dj]Aп86pC;0WC@m% n7`E66`-t.܁n`W;;G_a۬pw_)@@ľ9\g(  Ն+!@p :J` m #zsm 'w+l>>؂P#`_kfxdP y *)pi?F997_%* ; OUاK?XZ0rAn+ D?E +R@~Y"6.`Bph_1ف=\ת AL,h.>An^pdR_y ; bȀΈ[!&b;"5lB77lY#VB?>Tځ .D{ڸBpvB@vF]< p+ؿMFxM?tiA8WAn3B"E<`(b"##M/q#_-#6 %?9knnjb^@ o{aw oE_[I43ϽsVz&gmb8CgIoS`a\$#f[.-KMH/E;OE. tj ټ!Ssx"7LU[K8>fYC++s2N {DS 'P&5#1 ]ȗ%2PD2X.4 %P;pɣ&4+׽zJcc%9Ƒ&Qb([$^߹t9 +-4@^l 2Aqe";"Mdk9a밽DXGEic1'}JG)ݖCQ0#ZҩDfUOFZ9X[B^t^~λNe2 Fs;HZXbxGoG^IH= \8~5vn4D[c~LKΧ֥Z,jpDpAͮTȱjܝaqYywG?ĤvMmZxO~kOKڎJ1퐲Cx1)AM~4ЬFӭ{ľ٥Vn7ןD,o4EPqp?!µh 埅r#97aoA _+_Ь /QCXc-GU{xcaZ!T=Tp,4afDGXӊrJ6%>KW;ŵ#ZlӒìքi̩GJdAz|olOJތpDAp,%Kݬ430q\̓Gi j4 /.[ڃS~P|#OgudxȰ>O?4|nR%7j5Fcɳ-ktw}#Ze)NsMizhziŨ ؔx2VydùDd/l!;W:Y^ %v*άK0t!_ uTGݩ"pFM yz~H7+h9Oע] sB$zx)3iѰTS@z=ŕ}6\o\rI=`S?EH+YX -`}[$G$*U-Wd^V2Nuk3= KBsB ـ y,g>5VoX鞤BDQ~y}#-I~xW)3kH.[pqFŎ' lu9]c3s٩HZV{+sxč Klz`3u}ݴK$lY,a9I¥BOR&曬vrb QAt4`@1Wf \PoL?*HsZEd[UF[ca]638ȇHJ#pҽvgU)Hh>E^C"ee][t8>d*>T s'C cp[_eyiPJnmb=]/ͭb;۱TlwQs6|G0D-tQ/ GT?-{2|pqF\RM})-;Ƴ<%OZV#q\2DF,p"|;ZRTb0ӰKg-FJr{K=kz3LȲ7_]!ōA]` Rn /yI쟒G`bQ>]ob#0SJfϛ Z|ʍ (;rAGaShAY8+F~E#_,yT֭VX*H=1[աOe? HM@ kEOZm7J_)1 *6R=տn9XŒN9"S-0C2v,Љaox'ؗt"y9/FQ]`%^L| e䥝 i1w<*w1~h2%cY鈃eYҷmD}mD˯ے2#Jaqn3 `NՆNmXW|5u'8=9oOQB.t ӎ5tW>+|8vEvQ'Et? );%,_hװ6i4O\Z?CGGN${:pe$ 垍~9}Paxb3kD򕛡:][f0MՖx! dd!nѷl'_h J. ++GbV* 1oi=iN8)7c Pk7)*vF~g6LdWj%ʲﵫܴƠ"ЇES(a_MľwH gj# MfIv#}6(SξbލdlDv zt1~Ơ='+qIcl O鞥֬X]r 7 ɪaԵRcBFtB.o%guzwݳEOJSرi9\e9k8?H;U |I^ݘ1OCĽǣTFM=:[]oEf8RQvmͺEdjj7CeJ7tIE $[H*w_yU[ \+9Lw *[VInxIFXĉ#:8g7h^%|XyW2}>ux8w@AÑ2NѬT`MmvR$śwTpx=icYXx lbVu[y-eB% t2$3!3g2Wٽz3LUM*~qYGwI7dVCqo4YV"\ ?I˽i*:zV se<@ P ↹y_bm(㲓n갆~#&I Ї嫻D^+U'rn-ohRx}e,g&Rj ZW:l/ۚJ1,)"DUT2R׳gh Ru*M>A%L~¸/tQcCq945>aa'}flz s>.wd?o>L[(y̺YmʹWAMPJ߮Kzn#WQ573䢃: ׌׌u$TCrdlTx343HL*4=TY{yv3\;(kHnCe y6W67lwV jgX[sjja7և>dn_Bjx^eD6^sJ tީEFrTOvDy+Y.0v XMU o[ϐ|TkxjT֖/qʀ_W؀d6%'+FO* FTҮ>$:LJB/. uZPU1 |Wv$SnBX "fXoWC1˂ 7 m`j"/N=΃ԗr5W^kZ3'!|Af!.(+Ԅ8[g]U\:ޠ(ٝ+ʅ۰dIػB c݂5R>Ց!(>jYKU_IA䃰f8CW\Aplx^~Zzgwz.wL\AU*`悁_ZW=sSܔ3'ܷvl<A]8B%sV 9Ҏt7]P{ ؏/bVR[D*ڹyؤ%,[°nNki}O J '15I$$͎TCQXk 3._iKK(ʇ'yI<)"G_=eg)QQ:na"2noA(\\R7Al}*r"zfc4O0 P:<͑G0d]x K- mxArm*L_vBk5?^YwGѺ}^rIr* 9⭵>3shc\ʜ5qeeA_ eBzb_zhCvy\VW0P7z`g*8zjKPaԶ~cu~\!w$RRbxR"o2qkĆl^)cpn%5al$\!jEbST -R|sSt^i~Ld l9sV2߬-Ϗ'|ݗ<!J5jx)+R]SMɕZǵqn⹓y'_UPڊbfS2ȭ v\VJrƼKR(w׶|,bS^q%{ Lꚫ+Igw~}dw*].Oω"CkIy͝ `ܧEtcSf@lḞĎtjr,T/QGIFv0dC.R'6ZUP$5.H6 ZEWSg4_K\{dhs /fp35rCިݟ$-gn$p~A+EEɀ4 9xnqgLC[CZE=ˇ*}ZTVLD/C_Y6' GH'2MQQHB76Nݹ`HL,V6"@R;vƜNT^Kנ1%>pY@jܲ^~,7Rgw&:`}.Zf^B z]PCji2@@Уf0m ;޻@Qk (E!%. g?1V7zAO^a|vo{ݓRK_y#Ts"Qޒ (#M Uhzoeul3^Jb+P֊Zgy />eR<۲MU5<-! لk^:çTm>IJ:Y5ꬳY)P-Q 9&\zeWW[mn딿;wȐBS.T*&.A ЉPt[i]t18 x0 2Y\էD֩BDm%}*cq5UoO:M<yQ5C[v՘wt4p akKqb-|A8_98}YL:c@*sj4oyl|/3+Azis1ZnW8m@4f*TRcud]飓d}KPB^o +ɧ"+$@;i%j#D\2Jh؊ f]Z:P9mQZ0sIUkgjڏtz+(v^1,sQA3R$#VnO(^[-5 R\1Q7șBW\`꘥l2??zj5)񧑋hh]?8dOx|e51i,43Vݫ %5YTS?`N 8#:ۜ qP@oMzy<7ηJ^[Z$7/slg {9d B#?yx5VYҠSm?Z 4V)~:.:cK;Mהdwf_kRFRgۘՕ}}k}ђ3 Fޒ&3Yd&1>oT;kcuݳ};wtX%b,nDbBSV>-'Q }WV9ڒa|xlOr j ZDC&r#猹s56xWXZZ,6I"4Ɇ*>ݯ |Lx7N3o8I.? qYEH⩸t?~dVu:oŶcԩP﯊<az=ڍk>:gu`Dfa@qȷN Od["s\c~%3NY3Yhv-nf:z5O:/(N"PkuM.څ]\b֪[Nx?MFyuLG]27}'؄F|ZTd "_"|mK|c+6+FiYINX4qI91;ntjX׼ʇ  kT;qLJ@ +&ҲBB1+ RsQ endstream endobj 656 0 obj << /Length1 1371 /Length2 5926 /Length3 0 /Length 6873 /Filter /FlateDecode >> stream xڍvP-ҫ4Ԑ{E!$"$:JҋtPRW JSH)_,ߛyo2k9k&\"p=B Ɖ Y$@b&H /Lkp"1hEPvG@qxLt1h ,KʂdA $/"]D@R*c\}ܑN86z`)E Puc`H%p8WYQQ/// bo 8'pD(e@ ^78༠pAh,> G5u0@U 0(W(v8 ]}5 ' ῈP,"]xΡ5EC/<,H_E*AhW*Hw >nB]8 p_"hBS/QsD@xÜD7qEx~W^"Pa\Q8#hT?k# ЯϿǠ]|C}ZƦB;HDd$vHIKY?h @OSWÞlYK7-ۀ  )77;;(_޳8u1)@7gfup꿣8(~юx/% ?8F 8MM 0`^-,b9_X-羪hk ;ԇwmd(Sx;ůkB)QqF 0i L.~uHq"0R[dew.I`acl_Gm:ΧjT?+tD\c9JL-ΚfiTjӳ6쪕&(>Je*mF[rX X]qN04}{F;Rja:.c`n/;M|@udy+W`b/+SBV=O r<%7O߈{ BJ*"#.%k)\ߺ_"0~>z6# vVwAzpqۚ,}ɬVط< sb/7sO?'h $!Zu];4ؿ4F̗L]zS1}%aSBI -Fy+cv`>T:%ɿf| <7|pdO%fDP2'Kڕ4Xk>->al8|j{)ԔƼ֒mǴՈ~Ϡn9miI^Y˯Ez_6fJq_ZoK0s:ptl캣6wwWZd~%Z/JTT F\/SmWZdpOxl%>xx {ꥌpqB"Xl"cd5 M+E^?t ]XKUM0{`QA~Nӻ/M\/E%ڧ- Փ4Gl3X:1_bxmtCeŬfI|1ʯ2}`().Y2Cw^籐Nsfm Bonc.8 wƚ5m?Q?rNQ[;ٔrIa] XOͯ*ٹ!\c]YeF}:U4N+QBJgējviEli(!n-&Js+x Y5ZKl '!ڠܩ-*0Gc*YdA![Xތt|e oƓ9 _snHtI=փi?WѐCtL)Xj_#ؑF^毮jLzN6vbi;Xۀ˩E}4%JedkdپOO Qܸ]ݑ1%8!{V:{8y#$c)$E6EY.\f'yT0S*UfZuIl*A"/Mn'{=yP]_Pt}kp|ͣB2{C]=%ʗI _Ωv nEkO:\W#+:;!1Pv14BYbq3%zjXbLjk^7{ysB@x-_ޠoFFWVVXs:"/Z| /PU%DvB1"^Ʊc]Ǟ:Vـ;7roY|zuT܁iYg'/XF9kCdဥ8xջ6v1N/?sf$pئjcL1-(9FR1gQdz4C°F~Αj^^n=q5޳ks v*s g ,#L=.j zu2n"bF(QEF]yY`en*};8yH\S/bYSj¬Rߊm=rŗ@E'mhV*ҍ[b@5)Out`@xZFwUN.h`T+#64Bv=oS(=uyr^{R9 oTl>Br\}VSi_Q.).HeiZc2 -Uذċt#%и6)|QtH(9۪ $3%q Tx _Sq/Ԍexn,4MZ6A>^7p/#E-{ށ^T_ԟMf2#eЎy "VB1Y}ą>2,og3DcN-mơf YCm:ߨ< <%5gaSImmFGQߕT&fVS2Agg_S'"[N.%80 Z߻fϨ+-UA>er#ė쓇'rϒ[H$)#EJOZC">%Q<-'z#;f>8IӋ q̕uĀ(sS Jrc}#몑VnLIdu |bm1zʟ>g.(M5(`/>?aq|U%'5krMɛɫޭL$oy?s %k784PGm}CQH1՜t)-eȖBjA#O[WJ鋳/)Gf/]7n.DY͇{w"%rOT"e|kQK8i/P% 8W !ϦR+׿sxg31M*ȜD\Y%:2q9[!~ I[Q?5_>T|w{])M{v2e~(fŧqeOT廏r⑧l^c* ,oEțE׸@V˵zw{erlae생&K>,ъ"4*%~o_tZ2 >]wE.47M.yE[sM,v5/i(yrC/zvd*H6:f\m Dx~)=>mR }Ȕ6at=Hp6 b,;H-i/W(mdUa+e+}j0)=O6OImtc,MSZy9m^ڎ7o=<&4y[Km~RZ]`@וIbB6'>#ĨIpټ jKZ6-sdڒVioa:|GrCJ&x]v#zU\4'0D/3yuGbg\&$n\32~RkqOXE~KvͪFI$h[+qzE!s!c+] .PD=BrGM fIw=/:O ZE!G%&Oɒ"b<q #&4>ܓ7̴o#1 g'VaFUw$q4~vp-b<"{pJ1zL#oBZI 3<1T In_O3f7Pm:>t%3ۙ }0 :j3$eDHݴ|@3bC(H_H M /CӘ~A.:QT3fyLف&^Qհ}2Ytk+[Ajո NǓDm~>󣇨X۟nFf1N LNW950at FR7#LG|O2] Z-QڮGܵe}0(D2ax)@4EE+U rfNS,`stc}[ZZ}G_ec?Ky ȡ+aQdF2XjƽT}yKFLS5.}Jd ^^Y¦bF;f݆eqY_ |Fj'=|]HbKnu1B!+s ubIv7Hel$GM)OjtEP!#}J2Y{u4K tQkbOI;%__:.!j(Yb/KK o]c Bkʍ9.dKW~|4G(R/wd|84GjǵL0JkB{1A9_sLǵw%&J{&ZFfG9+^ $^lT/kAk) VcƋ:y¸@w=ʨ϶IQޔ.Sal6ૅ:ovn׍~Z\|ͣb2v'OX3d?.{kDC {βڎb$CjpO];6Xw^-3͕Vo_H۱s^.O"8ưx/3d]fޯ#g?]^БtMۊi~h_ 3œ sr<0bxG3M2Ts_St8YaoCq>t=Dk+v[֏]e**Ƚpp=*'/.;n({].wC7ڧ4G}NxcDSYXG=[杦U\?7K7LܔN ~"ܱ='((rJ 3B;W|yYº$9X}'lEp`T壊cNtޞU O۝bwugdrBlRi019>xҙV?&;P =Vq> stream xڍuT6N et)tm 4)P HKHH?=}پ}]q *Pv($VPYH`Q,4F`]`)A2A `q*E!Z.@aQ  vDeO jp SF88bqe~@yҒJp4 Au!XG+"4BApϿR9bn2BB^^^ +B; XG!G{aA\'8Ǝoe@‘\GqŁF:@=78oAI'g"W0 EA>a@A! sx(ŀ0# L۲ru#Th8v7Dy!H!`nB&H\S 9@q4{C~7q2 q܀!{8xX<} a(hw@ dpg@+0{@lp􂡐.>_!K%K sǦ @aa)q40i!?mDڣҿŭ=8xuc-ɭ`(KBo En讇/3/a"\|8H @]E !<\۪tYPX #0wp> uM߸O p}݂ˆxuՐPD%4$o?a ap_L (,.1hB~^+(@z`~E I܎~"@q:E\sC3(lSMXqw Z-ı\SuH2ܕoOg:nOxS^R?kw߆%Ӣ("`Ehl<\Ctbj)tR2a)nZr|¾B[{k _"⏔N|3etiwVJGP3j $2>jq)LIdcx5On|0d<~.+"U ,nfNs0pfT.4tn[k"U"޿_L yoQޔ| 9)Y.Fv'%X {`Lihf_#Ob*XCsqDe%S{TZLS  Kн}RTH97wWWZ'܀Їsti, J<^8(ȺC.~祋paQY{RZ /z5z9eoszG8eo^eStN_ {vr_H:+G8u?"}OȥEuAD>JTEw ^ո}~V>LMoUF j14a AR pӘBs Emdk.X`k-N\3ţ}( d>%SJGHHC%Zh &g?1SpQr r;p~ 0Sq,D>>FMC'@?K [F"SGft{.S@x0}IS,H~u"s?,Jr:!1:vW' {V s{MK=WB>PVyGJg9anܼec]x= (yB0l)k[jn ;\$t+pfww,9}٢⺂O/=je %'\D·q|"m6jK$pna§)U(M={`7蠾Ɗ@_fH! ?-\!~ 4x}*epua#Y`7۵{ng%ʪ@*rYZG)͓N9RcjM oYkM]ßsrA<3?]kW$˗\Ɣ||`i/r54P!d=2(Q{hUI x9e¡N -tg #J Ͳ_.>9%U32:nzq-T}F衤DwriX?(rO*LNkd%Pڕ}w/)L@o5<`YK$xbDa0KekBYh^h ql?NU G-?U1< CEk]S<+{\Mkb9b2n)7a]ļIc<,v?w:Zu$4\eh;hh𶲂o515 ox):Dܟ4AUps*Nq,\^q*?&rcvR3ro_bNE?Q&aq1\Zo]6&6ܣ_FGm#kmBR, {q)`uѤ}=O0buUgm؎^1ó]Ӕ& o~j^a5\jTBD N-"Rz#RWiߋ{^B2jh즮Ucj>GVTgJeW&f|TVbd/XM}K"-켢)ۈk݂Oam# #Pu!kC`\nͯb]CFclVؤ4„C?"Ԡ gie %)7fWJ1f<6kG׵>vPQuWlȫ$7IEtPV܍4Kv]1/qQ[*M)a>;ϫ;$ O n,nF &,2b_$%}mh\̟a|+V;ėTf` @>(!8zJyC ~d~FPuN2d~6 ֯vNt"WPa/Zs rɨi/?ȟ hK,8B?i"0%-Qe(V6W:SyT`W^(E7ʙ~-Mfhgû@앓i'Kb[Q;Ju<ׄqQ"9/LmvZIlʗ:T}b]J&/8aP.nxB`PpDB{KsIm(O3zGRfQ%;J+#B}EuLΊ[2k1Jg' r}9t^Ĥ9,!Ԍ7<(?CN+rg|:Pէ=X+z]т֋+L S%tn"(8*聶i禮]ZV̆c5VRL_ 5%5b¼%J^jg}]'"ligL.ˑ{5?g30\Hvl"K]cQV#*UՏ Ӌ{r4-tXM//hY0Z!BxRBN$N@3%iͻ}^q&ZHxr'McVv=;B{N9ef o1%[`*Z9gO[wh$QRqn|QB!`ؒjݡ|wGfWuMܺA]\k.Ee [~e^UuI!󩹉M:a(gva(u2mKc|3O+ݶ{UiVXIkYU2gNvD8/07;7)@G ":0z n]TlqR(K'eQ(.[c"@Yb[*N=ynRtР_: Y=N^<@4<`(1a31P2S7i21UrkCiX).ye$wwrNe7<@ARI|W6$˪[S|-q(mrp_KD6ksS+Y KVq8cLPp=K&mC#Xi Ԟ57 ˲>olXDp_<zGbp~Y{\>&{7Ay鰪fcl96od*WnV6dѧ3@CVgr#|SyeLs\ wL6[sT< t*(g1f^;Y!ds8?el D%d,hQYN( oY7<}] R4@J5Y@xl' ݩmE/h'h앩7IuNڅ 4oQﷵ:?8m1޸.AbN}Uxxo;6Kn׼`n8օHMԫM'=VR4Ӧ푸7{i͕:dg l͜LU+J16u꘣ZTgN%H8|hZM)†@-~7{Dso/_ RL(}aVEK*jWv%gNhUr~WU8xʽz^?;w{9W͕[z փ?nE3q% =8QS䐘4;w]Y/2j=a¥y#HN5ݽ&MԿVN[*?iK9ZO=_X[8K:w# sy#x J #aOSvBJ6P73F2O.Wnrr=$]٠#GN"u`ֹ//(PtN4y q6NulIkzg_zɔMq(t | kp6&Y45SHrDɦ<`\$*%|՛3 ӠGbfnz(!ؘ*ͺ54$O4\w#,g>e51M n?1lQ-X ,-%:y>ɈNͨw (0Ɵrs0FPfpcB'*mi1^]8@Xҏxjwu  S w- "~.'cù馾-yKI_bmd>F6uaJہ6F?ҭgӵߊ]86VX0CBk MW _%WsD׋ endstream endobj 660 0 obj << /Length1 2277 /Length2 19487 /Length3 0 /Length 20835 /Filter /FlateDecode >> stream xڌT[ n]%3gfr]>eOU6*ꌢf&@){WFV&>,+ R9&@cWLd`sXXXXl,,1tpH[r@JqG/g+ KW4V^^nDVEcWK`jt4|Lv.LB +WK4U2@Ҙ(V.+]=hrq7:@uY#oc nW +9:9{Y[̭le)&WOW_ƶ. cwc+[cR7HA>Sg+GW&+ۿjd+ ͒fvv@{Wrõw273 37GVNn@YۀDd@W' zZ2E/1?GG9 9b:|_ 02u-Dc;[y>ƏO 3sc#fUwU9x|9l,VV67[;ڛ;xNԧ7hr?b yo:7#)7[i6Yz4n-Pt5@3+7u5mhY9X8[HYyT\M-7[+{_7 ȋ@KfjE\@/C+io`ײqr@g BVV=5f&{W Tᯃ0%q nlA<f?,_`X;Y0A v?Į bW/Alf?Į5 ?Į_ b7/b9K6 3u$ID뼙A}X T aOȿ?A-A9ꏥ% ? (I@PlAMujA8I?jP1ԠD@c~G].OA5(?@Pit ;-qi& D㬺miU#U営(Y.!jd ٬Y{c&77F%yN9a*td+88EB+{ުQUr\Tj=fY{g%z^rL+\kAD;m| xtqK#> BUCcXW^VBp K᲎ //\@ 2X$ٷLUQ"|&..NXa@4gr[0/q*B7Oz4>OLm`V8Ƞ9?\t[/?,:dFz3`͞d/X(j] =`=ZS0}{_{0sCcO 0 #y^//.^}r) us $'zxXxq2-+,|1<:.K&i6 LLnOxgm$C]/ t WSTy6!P]@p<ͥ! YxOCT@ Z'/⊾v[|')e@Q /Tu( }^zl2o)x@λE&[v`zC4,-'X1^M%jNt'iRvѹ4»j;H>b^EaMåedrnjс”/dA`gqK;U>a7 wK`YA|) ^A$z:x"A1a K=AY@\%Ηpx $kq 6f`X\$jc&<+֥9\$vNp㒪$ȓ. +*qḠHuVbOyU`5귫 e/σֈdo3Eo1-ZK Z5GWw5mJؖc\m-5(J 5,N^nLy ^ji+rj~L0.?sW~r~j5G9A읥=ڍm?񽿶.Ġ4C KKA.uWܛ6穭ޅ;6xY Oxs:͜ށ7VȪr\B/Tly8ͺZo݊|*=zg=SEw"-S[ I"eJs-0!~RkfpqcgQSmƊ%9ygD&&lNA!hFPdGX ?#C=b* 0J 3#.#?$%ڞ6P1wY姇#tY4 R ;{GȐ]|va {q;j;4l8>TmhwcZR)"FhٌڴfR5)q؍j!VLY|.a@)_r2Sd4z;u@XM .^ 7C`9MI'$ H ֓g7_>`rtm6,:MT^I1>)Ȅ-Vk{xUGC<r<B9q8Ae(@)USAuJIl_mӴqu7٘4+&θAzT(sO6O1"q+}r 4WEr@44k.k>^u#<>4G﨧wiϕas.yk:=p|`^Zi~]-\]ՈeQv_}VS=1_3} \\75{1Z4M@BEY6`vzz{9r#3}QiZLI*x(^͖0C!fdZCQ@D}6($FUH`_-Pq[[YhC Ehߵ JȜ}RC?x˓ I0JUK-k|% zE_cD q֫.5Cs68] Γ:,zX+m)6V ] k Ot. d.(e# 1Ⱦl/q~畜`h9oUnZY5|5f(&p!UϦ1d ٵXlaó]WFsX.立3@ɺl;zo"v֏r.Aa-enB07سg9Jq,W5.~As(hS^amɠw_t9SC1jG<1/hVl }?/7GpKk:ɍBUc'_{7}/6=ѿְZz bMMf(O\ah'@3vv|fDЇ&M?3.6MRiC/`rDZ'܂Bh-HA싷z3Z`9™v g?.alU?793xq,L z*7fk?!Bz4,R1v' ~ |`ڰ71|5WBͼNNFKsT:XC:nᙕ'KfI7j =v7Ӧ7!`/]T1oVKxⴙD 4FjfuW-+- ;@^N Ko] [ٟShBDgs/`uGshC= KD(җdѾ5ӈc%27]/Wo}NJ֑Dd&ᾉ5۵OTXj_"– =5<>b#!#*Nަ.W/G#w1~ w5,Y+Mވ`V\L &U }k9" eV57 ɵB  dϐˣO\-À!9JFT<ˡο vL`S$&RiqD~HA6o/J Bf[^9R烦TUbEviDw6}/+8NIK@ "MQ3FwZP*^k/i<g*7ePWrZ!V9B: nvIow}O`RsT ۲v'0dp5ӑA6rf:p*D6D-nMz4ILRcw^ʌMY_E㧑wb l{KA$5yr> Jό\?Lwc^.@bV>ڟ7n%&K[^`\yT}ɩZd\ 52vyp€9"~`v|7 hr{! :k.ˀ:XDp _A#rsM,ϞoКZ6q(zSt(ZL2%=g+8|cQk*}MPl2fO%}MZϞrQ_+&KiΊ"H"fertWβI1IB!k.~rH&@CIGg3Za-qL@T)Kn(z:aC# {ht:6jˆ_o7VyM[p7F=a_~:Ql:OȣqMf}N$6H)umNN:%n'QM 4W'1p 2!w "P!M#kz0=|i\#Viǒ07cMYՙp|떪ƒ9a3\aҐB@~9wL~/{f_yպ\NsV>2f Ε)WGKoAd'XUzmšӔ,ho&SI=ʌRr;!Ξ7!)Y9h>6$fe~/-O0P;X/R  iq.ܳ̿*cġfO5QJmCzg%= ļޘ.Ѥ\.%(irvێ?תc#B[n0[' .HEPr3ܪ{ `F;r^B8@tWUE#O_iH.0aFVfRRWf{Fԅ4GAiYyd3v߼w|ꀰ>]bM"ä s$h_CcUT%! di  ٪F_3 gOPZz`#t~:V*ʰC51Wcf| Aj9^"BI?^\ϠˠȝlhWqaoS^lZmG6x?@GmP֏nfu2Lϼ;0WW sa<ܭlMNE8S2 H45B[Eq#4oPD,8W6CJ DVt&:[ǮUyk8Wc_[V<Ƞr?LޑgǢp0,f)_𪯢1ܔ6nD=$4Rt瘥%&}TlodZĹUt|$ NiUA'z& (!.F)NG huǧ}27{%)8jP <:ژ3 zw S·'}%L΃]>D0G<!KVZ{-*iS1zTUKyf$vz0{B Y° T⑋%r2󵿶AcĝƉU|@ ;"2u|mz7qEFk6XV[Q޸@SsL 3aO+U=M2U$'EEfSW&c󹮹CT$e_xxa ݊H~q4ˑs!On"l'9>$$*k>~ĮLUB~nRgr-(1#%Ѡv줣ȏ33.lSZn oj&b"W[ tu66+.h1b-fR,r(ghW4/͋[>nAUw`zX O9t=GOR ֮1F K'՟n8bl, "a!D-]5Έu休xl܍%UIC'OKޙS,ED|&pk4Iku,%fX㙨ÝN2n!PxMўI#ؼ6Dq sqA}J=g|mKnk%AG?VM4:ݑ{ŧ?Xڎ0ibw:U%b7(ܖNCAñ1췌6ʡ91na~>!aF4L#CVs) K ݷAY(ZŢAQh}Fem~\Vf!;hOO|biVO G39a{cxhN+3Qy$r=SetOϋQ!em7A"S3ORHvL.Qs9Hd9=I'lFaS-)y"W{CǟB^łOG>nu21<kjrJk"9 5IiF[N~;J6IOP!  :TGI}./5]cA|{E$,ɓ5s5F@vGRD`(1uMTÈʒc'B+)~gX6t{LI@qw:b] CE&t+avYp8o`roʎ*JLzuF&&(W 2' k])B!lן IFJe6^ۊ?^ֆO(d7.?RVP/ņ{_?7 D*I,M͹OWίyj=RJvȪU@7;5$d*[{":'$R{'\`W-:m\o.S{,q_r[nOi|ov aCJ0R5ٻOz!W[GnJ[q~ȾUfm[0Z9u=;.CͻK`拘\ ;_2%+GP5>  +_4m:!P6bs m #bN aϰ_]iUe<` %5TFL`I!V&ӂztLo Cy5LBPW$+J%?kvf~IY kqS2h1-6QL8ZzcBȣFӎ8v4% Fpq\ɞ]@u\g&}9@bJO X3=wKLy+2SYE@ƥ>5%ӹ+f01VSJyJ3:\Qa $6"s'wsᦒ@ѵ8=ձjM̀@WVH33AFjPJ94; ԰*+_C˔%M9_Q%~7Klij߇_A .xsUe2S pI~QB?ЖN"^QB;lU ,݊ĬV#&zS1[b9ٯ (J? עC`Ȕ-h @|lrϝ"S-LtmЖ7it2қ:0[!ްUK0  r"7SJϰs^|&4ct+1srs4 vLxOyCr~ SwG1Mo[r a6kuJ ZGS =]Z`*5CKfewRNFq~0چ"4<=^Q`$gGvUA]R>Kqdp7II5Yy`3p7~՝ϽWg=>]>0jdo~-i!s5 #%OS.p\d&I#uXV74ݡ;H[kW} (L.pͮ(w>U[Md0#ց&N`mEٽZ S4~@gۚ`Տp`b>]ۼ!RZ#$C60Dbh[!FBFB sK 1jt#,Ʈ-%|)*m3/ba!C b]Q{>ǥ}*Sn2{b?^DB<w="Kp<;,O2qZ:m9UQTڐZҷQ=9P{CFZNǹJx8}Y˹( xFڼIʝJٙׄBDsQR濑hq^j%U+ 殣\u1Va̠p%-bɚ.Q=;W#wF(^_0wqRx*0ŋL^%Ϳvqb`sa\ qφYut-/uW?܌!Ery ϕ lmKN6=L"#fZuZјY$$1HdNlQvپ7w 8Ra1H^e̮Cit1Ϡ?V2?G|T5**_ud ;S?6 40:)y0_.)|VH؟T&UTJ\(5_w} 14{V!˘d-]֙ _q):,<OYȭ8u[3l|Aq:^A^yEWA*]+N*3BS+D\vU"2憋M]I Q噉Ejǭ'|PY؞J$>K%vo3QPƦקl򬚶Qa*9: Ms rpבDKljƬlD1P)bSO%%gh᝽H쐮}31[%A1rC>.y=8 ^!f zM ԟE$L&?={kD/z1~ZŞ^(!r*PۏTkɢ)͸eƺj|r?My["UJv(mҿYs4L=@DjrKbv2pםY&M=p\C\7 T}S7/{椑FD\OjX/QSSL̛p&1mKp8O&Wax=K euAEq'uM עq[}tٰlV|$2BZBlxW~ aQXwmg K]:݉HHĕqY9}x evR'\6~ͷNb5g4}xm(:6kMP'8hC5#s+ \f+q_H66f&hۿ86޿L:t8{)*X'wEN=1f'?O I!*1W,z(|K~.ql[NGK}=#W9F=GRsh.+āvםV@[ 'K{B7[np];1$R{4r (B->6O'F_`O5x&RYީ amNwv_=flrk"쪼 .HBQFM, Nf-5"~.e`(@@Sכp?;1i'HP/bcg/d?D9Ѐ$,#46"Oq2o acm4ÇU\h=+ :'`2+L BR)/ڠ!;e끨7J Kӌ+:A֘F2rBԌ&)FOmy"ERR]}y&~'VsDb-G{\²TL+e'HJE7= {QD%,/|;atV kwo6Xo !t6W6x:a;::Ň2M!t2nkՠ0Y}6Rdz xAŗaGg4R03pC0gK8) ܘ lvҳ8t?9%&]9O1Y0 {>XU1;Y#w,*rdWr5m1JgiK.r'#bBG?|Ս*ˇU*B~ djᏔ㿔xʍ-,rձw X6JAxA?à䋜 ujߺ^*NZVi/`9B 8G[ { l>K5:y'y$nMG:)H^9̘˧>pr!{Qs"d3È,0 V .X=aߋB6 7˅ w?}r˗J7VHB%b:jR頎F`cL$~~I,QÚj̈k%PnW-Ю "0nvgP 5$b s퉱7upFQU"+Ǯ\߂:zp"+-ĕ pۥAtlaYO3_T*K6lҒBEJgk3xD( Dk [DYإ h&*-B(?^Gi)N7iY ]g|؇E֘2NH89*ǥ2ee4'"z~=<@ڏ*YOW WM}4Y&>e1t0pN7X'B Tj5Ì-߃6@A-ogqc|R W9T@e*g! 2R2근\ {{!l:K (!=8a waS<>Q[>bVJ/~DOxDøgZQNWd}Ac_f*~e!#[ 6tZD[sLB}(sLَxJG&ݝfgήLyM>#l}5poYAa>5aA-ZX<bvc8ϊHw*l0MWE)< n ]T*&3V R@ ^(CD/Xq?m %ֿN>SY+ZAD(+D2BHP=Yww|4BJPc~"z3 9Me^Gk}M:q 5SH1ƓDU T3kv5Dܕğ);iK{ Kfo3O`MVR(2vzpؚߨ(bP6a8zEB%G*d #Lf/6E":r]D^ W1\. kj2O~QW&Xfc{E9´[Q^ F[03hpn s<77L߇I'TQNˑw[I$\> fb9d7# -LW]_p*WZt5&_0#r SX/ȃՖ=@RqCqy JٜBώ Wr~vƶdacgۓYGBpmw{[s:;?EAG"{[WY̴j/qree^s6e,Іϣ9qM1$x•B2p/72iSW]4r*q?̈ݍ\d䃦qSCW~l55i'֞f F30, 0[Eӆ\HO:ľ endstream endobj 662 0 obj << /Length1 1632 /Length2 9536 /Length3 0 /Length 10599 /Filter /FlateDecode >> stream xڍP\-  .44Hphw4{  9rϹjWcktTؤ, y(ĕS prsrri]AQtA.`(D_2 3g볡*Prp99ܜBBf`K*;@ @6y0Z0XpH9f 9=@ jzWFQWWGav3v8+jA-@ƎBжЂZz9{9*uGOc? X pylfaup4x!+=. 0X64w>̟ ( /0{\,..`=rKLO^IB3 %8Z | =P A>ט?Џ/FpQj^Cz\.(ȫW2v)G%h gte~0Ɛ/h %jO}m@ҀVCUbXX!Ƨ=u4Q[lQč Z|6>럵7v 4@pEKҟ%ăhJIJ-8wUW:fʲŸ|iw0TuEhgLX]0:eX%zboIDgT]+[4X`/=i-cxg;͚2nE +ԣOf\t9ôm?!8}Rz L@7'3&M ȹ^rFd\"\FĩM6ƹC]$9+Z-wp 4$,[Vp߉aT, @M#zaJ:XwuXVBx 2:+mp?ƂFBQSNe V婢~5E !mr*,*R U6Fw5|g IND`n樭,ܞL3*Qv'2 עZ ɿEyiNkL%Hȏ{: aF fn``ónw:3UJt-   bi^!CŊ}#d_CeӷCeY-{2?[;lo$DR %TV,^|jݓ>s1|-)Z(~JY-,EQ ZDJb# C}^!鏾*a\3Jݿm{{P.mN4(r/;=x0Z$pQ W NK~0N{^B.LaG[jBTĎr:%Z(U3m4"CԽ4o-= 縁!F@\gEl%%҂Ӳe_%guG/2Wqɠ9B9Z2qfcsVv;M8?Ix7yj0m#mZ:m^`z:)yjsL'FeS~ ۄ!87jx'%mz&(WRL_MjpîJ;\-)jsE`Dr3l8j" T/ྉr*و1}1L0}mjLV_hc ;Gˠ1 aY2x(fĞ k@IJ/{Gz׶7omIy#jF;.s)9 |gW| kVsn(K+V_ѡIL\᧑Z ҽp9TYT)V:{Wxl`AZ"]&,upb<'q@A83r9J@wd? :FV7 D:'6OSC)2NxWJA򹏈ޭK˼FabU!H+L{rycãٻ%@*B+0|پT1'ږz?J:\=}qwMZAM k~Dy,02mR>}iB %SRtY'@|gt2H?}nu0n"0]FN`Vdnx(^T}c^4S\GD3E$֞KZRirsFX͗r wM櫒>чݵ9:Pd6D0չRlې! T/kW(ڷ\y&NM' <_lK˹+XjYGqx]e3ob.0+03>n2vFwhԩw֗3rU"$§J HG?v&cj烒CZ&<6BԙGEQߙgp*ng? ү-_NOcKFdf9 # & =:0q1iס:载{ ЋhGbN)М \XD,:7g2T ad XcO* {dk +k)+l!-7ٕ3Os.$c {-0loz=sCeI:j]I܆s^ɆAL֦*#A=0\O= tyon|{?WΔcZIaN 0GbF_Oa2hhT$gASڲ 9ĻMoI]~Tsxń{UC7jk'FJ1cp %:p\&l&-@,5\ ن>H>:̕v 'Wm Jٌ:3ƖLQ[- Mg4e[i8r:!JO< 4?S HHMIJ,ʂQ_Έ&cs+T25}#P㭙wG~|eRQgϐ92 T(C*Q\jB3oq o_ˉMl&+jp8}RĚ_zt|& 6(­ZVj .6Xjyt4_ɇKRx_ vϬ ^ 62Y(#DBu.W\щ{V/DZY ^ܮ ÛAe@'Ig-Oix={z /&awqF?Hq(m6ě]|M8&hսO%|/dy/ȻX!̥t;=w|)Ljv905$XX#·o.Ȱ!/nf7";1b0"BIBQ r#PP+ҩ`!ˋJT {1b3q(<7K )LX^6Vօ6˅ׯ0W-ڴ(u|S&rSSv+WupIƁ>" aޏR4 5"{'4} nYyRr' udT^6ac~3YLR=?%gPxECa̭59x'H͓؝Y9yRW2^t ߞ>U2\<[_ětn.$΄-45T9y:(lѭOG,Z`uRm4+٭,Wk<1׷MqGN.}+4f^ɷe ȵ*#3߹z=W:XZXڰV:܆tp7omܣE- 3iF+Zi3jt.+RÍRhDp4&#Hl zi&[g~.*Tۋ ^n#g6nD;%7AL릈!Wh}s8ы o8й(cSqh[mm:qitD66⣀ؖWfp)b)b}XyG1H#h(jeg0HtW{zMZ5mii y TNϸtN J} G<\ѰIq#󃱀v&/06&&~MI/]A_\%0%iOۡ6nLOsbfFy|t$g|C\wC|GĤvz{/ﴠsz]Yo.Znw^~m->hf٣ZGvz `1" n*@aJ5ĆTEId=,On{@o,HiNCԨ/lF7`P_9դ+#G_*_Ӻ+Ӂ1;'E= ET5w~k]]ئfKvT<rg{'_3[177f_Ǐ|и^^(f .p ^l^ZaS;ʾULСu{̽H Ԭ_b 9L$W9=MQdAo皱&[y . #S۩8 yee$h54im' ] UbϮV%[. m>xLȳoWr5"hadm iƼ0˩.Rʐ^,ڿZكi'Xn@Y'xGWwOmmV~ dʆ{)dVюs\3R_Ul jJ07 rڭ^'p~z6 ߱С2 v)3:۸Cj(icYۡ"ʨku>%ke͹8foO(sih{ G [@+E욬KwS,^7;.rB+c}mHٗO1:۱%ݏ{S`GS6A>!8k^`֑ñqR-gZ8cA+Ai}c6ڎ|hgr ;#R7듚xpM#j&&&NBta/\"6v@#4tl؇ս,2Խ*\.,),8D>d+Z8W-$TcF$p3NUctTc ͟h*>;꘧[al†', р߾[y1sc@RH{Q E,UEF0T?DG6oKJ4t)o.3uN8}PWUoV7\EXaqEIw2ﲠ6ycg%&x,XC઒3]~z +l%%—(RuClCSuA6LhkyɊ^Plj4)pG?u (]6R|c}uzJоsTÎSu, ms wK$=WFR2X"aIdV!cb&SRM &=aA?Tq{J|>eZV3fJu*#-pXweQ^_t akP2#>;nٷ:SPxƲMz7Uk|i)$WP8=t/Ȥa;gNC@RajS^vܽ+Pk ߛ2 3PߌI"3Aip-Ȇ.pc!} ̳S+̋XM(]sL7{2 o_Y-)+C[(>G_qЋRrڐt41^&m6bKnuwW MmE2ZR @ܱȄKk\Ƭ:%/dWy Rm|V IRTEg\9}!p9QEƳoWSI595y/Q zTG5|K9(xHHG*:h~V.T:L"ܸfUZDo <ȶѿHA>iXw bÒK44Ocmۢi[tvsg|e.,/UKJ [+$Ts4_YCn[Ҋwz| /4ZOgreH>¢80*RB29uQ*zw;=q>KqØq;vmS wo4oE&ghR{_fi=균T2c R &{/0ӈ~!ks_Bf,|÷Z3ws4dx+'PP}-Z Y% ٻJZ30GX4 9FN{и?yQ b^ ߃PgZR 8<*پ^qgGJ1;Ż}ǘin<_ТM|8\78zaf? endstream endobj 664 0 obj << /Length1 2673 /Length2 18920 /Length3 0 /Length 20457 /Filter /FlateDecode >> stream xڌPX4Nи;/ ,d񇧂  w./a&`K[ [q\/1z99Golxn<;o5*@k{/UӿZ{Z5u~홓 Pafpxx$R߈2.V _K pwCbO' @߿l@H&K7IF|6߈& dE|6߈&q~#pA7GP9#Nolڿ"O7E`o𰲷wrW<67'8L`pUV@'bҿlWGf/'crݿ%p8;n¯drK993Nb ؿ]N_jן1&z_,Opv+wXfgܜk c&-P<`.7;;3?jpE`2WSG3_l@w)_2{ww\~y<֖ XGS9-Nlߡe<`olpNv3/U`s1xpsxdp̿xX#Լ}X#0>9g|=o8@/ ied%>A؇eoZdfO/%`Ž C}^ě]U򧀓f4Οf)s{HgFfJN$IIXu!{i ݼԋ}|&4yY^$/Y]"d!E`:E_]*y!WLaB :}U`͙cFӣАkr6@0CS@EY–ȧ|vVa^oF XN+rAMla(y{Z殌]O>0}(2FqgVNW scprt"zS[ >_`Cn%uc̩ᆵVH̙|ɛlt 쒜V>FlnczNKD~1UY5VgoEYJ?}|HZgx,R@e1,U)5 S+Y׉uʞBNDUƤezp"v(zh6"C[I N<ꮰÒ4HpW7Yq1Ķng_uVZ8pt/-[&p~< ,P0΋^0q+rQq|E S^עjdtIK'|t/s;M3}AdwK)߰Ma"3 OV^$FAfZ| y?#ijW,8Tic]jy496R7-QCnqMɝfnTi=ϓյķ/Lb%O?2,ףgxB!dqO.zg` )#dZ2s`(朩9D3:8Rd%:tT:qJ=@hCe\ 2DuUa:ZNs׻@RC2.U#mAѩ=يUD ~(oxu,L#sوEx5gdXIy3eNWjQC#q)Cj-리taX=HR>=ǐ1Cv4֋D~A!MC Pl5 |}}:g~7zY$n]㤍Z~DS|gk;1]2]d;1ic2&Ao+^usNˡ:WDi6Q%[}!_E@`yQW 9Эg-KNF֫<O5b}^6r2>zB?_eK%Zllm!iC TF--RƒzSZL WCеAD|PE͞H9(~Xy]GRcxYEÌCxBC苣A X>KGJox#K>}2oY2~vd k'cz1J,#WUqi}Q:P3KiE=QbMPidJBu7Ez/470ԟ-\weMs$ɖ5!yXqS佞30SiyFE6].A5bMiC@ #|/MxlRz5 r!fO;&iaqFrѦ"<ͱEK3LOxa~8Tc.8 n\\4OTjOL'rl2 [ċW U7khӄ}~xC9rT,mZd'5͍B(H.#_8c}p 9(q`gayR nѴݽ ^Ʒ2OQX^!DEz{$[F #6[laѺ)a%&b"rhkY^CP2g("$w^dVVN<2_>^{u k,T&M[oյ(^H鑿/jiꔕ{/-htS>M{]iЬN jm1 ewj:pMx4Okb\)HUΜǜ$Xq&t{3zU٢LHOPe<^["dڗi1_\>`<6w? {?{+64I8`k7樝?&߀Kx"yseSlc{&5n}fx= ҬGʒnfvz3'LMa0w- ߏ}Ն{Oqkn>B]]"b˖+GuK0HEeSĻ 5K+N %!JNwhe?> rg~^b۶/60jg~61`zvR6Cx/Lg_jV<*]qIĖۨiޟAjG2ږ-K9f\qgpܚGIx%g[ϿV3i{q D+#GOY tӋH$_&cT#; ` 5ni8-We2E~z[5:~ܱѪ: |"(:!Wxݨ:+ IB-ʢiPy J ti\ܴ%;}&!Yf27tW!Mzdj#HnZVX( {QE~Gr_ܞVd#; p\F RuIQqY[M_R\xwqwy,1Tޓ(B1cw|s2mi^򃄖y)J.*cK(շ!\ڴJ>ʹ X9/'%I"FAe9':?G#2pO9BsvVG(ZXoSЖ(r;zQ3z1 7ૌ߆ 89fATQЕp  ξVÜ$of{t f Ȥ ̑@MmHz Q4y!r `̨J<O)2776C{l ֐%l+lϷNjPd25s񆱔%e)YQߪQ^AUY(,FPyI產}N&Y/!҂jO+\uԼj<ƻfkwiج^;#[?Д!NlgKf fHU]f|;4pPFa1T<>yfYRTe RQqo%~zlSi7B(zۮGe8pxy#UC]Bt2hdC[B sؘ+V-xsUz؅yj@r!xw_zI^ܾL#, 7Dz }. wG=qvǧS{ڤ -^% '.(LWpFctWX037no. 0FSb]Iz]ݸ"&j3CIy)s_J!n.91-}Be~HP|YgmZWfi9&RZPyA(SUq=)KώB}7M`Hu_K!N(K|.[r :??J+.A]r 7*;܇hs;Lj/πڎu.Tm6gծAזhwwb9" oZģid\'zhVDnεJW 9~ٙ&yЊ*ޕ+-2.waG{UI+zr;弄-6=9~^d"弯MbnrT-,,QfGM8Sw*Tx/P|=e&/1W,-Ƶ,0/nd>CU/YARjW>uwTͦաj'OQxvCA!p`K)yevζipZ DbWDY YM7w(6NNMlmÓyփEN۷S\.2XpꔣQQT\Kw;*E xx8!' W]5um:*8f4bxvIws˪e't^_m>QXTKm/?w,g:G^sGboc?R !ESX eh 9x\28K)Ad %fAn u5vb9t AiKoSi|. [Mȅ}K44/G?X̪~`.|#)Ť@z>RA{i y.W9G6 jzz>xmkܙj930_yAۖ_l6͌ض# n&. RǻqGO{o!\s#1vܫܖu)B{ |0P<:^7K8y߈<.y/V 1#NC ݓAU?\) #ͅUBI~4av^[h&E)ui7j+'bf"!W1CyL~%9QaPJVc!k f)#M3Z ?8^gU dԬ3j0QTy{uX\Ӡ⤊Ic8F{䧢cbꂖfS@2 kJX]?TA}\ͩ+ޜg=膋E@[K*P<'~2U/AP\38"*S˒]  kEd'KSa$( (@tXeoeoM`j.Lx4Ȉlִˆ?٤߿̪$/*m(Secۇ܋zAcxFiSؾt~xh#,Q26{*sa3y!"WAFAg%[O $f[S[E)ThoMkZP-} ?9( whxzMZԅזqQ֫y ؟ǚ =odnNl  rSdyM#,\XX! M!ʲ6wL#<&;l>һUWjvOnYFI3I 9L?IB"8Nj. N@ {ۙd,< kr-(,3  8NwIHۥ//oKs6x: 󂃉3j)1|E~u 6 J|UWYR&SpX&F|H,iI\u 3~f;t<^Nl:=hOSXJ0 ˳y|r?nuP$>yY7(1sLzS+hR"lQꞪD,(wK\8ӝr St Kc:ɐ vsŚC`$:fNfm@G{z*Jm[= 攻}bfrn$ZQ>F$Ž}O7Upy-)XȊGt"DyǙ-j짥p"-ɒV dqQ.Xn1f%CT`勋Rb7X<*r6~)zt͉4L]ٿS ,fճ O,if[:ȝ^K&Q si4@d7s|M/bxE'#Fp:6R ̫;Wo_A|Dn0d* }$ޱTB?yH;.K-8!j$/H6 X'꿡uJ>*gYDez1MU{daزؽOl$z1l( 5/EǍ |׿+R%:$U}+}'!cW*?O;OnOk)x1Nٴ_V\枧|ڛ &qpN\_<C`\XL3ฒ^q᧻ܣ2BBaSldWA灻AɎРL2Y/*$5t,t/zxj6l9c~Z'}z?E-Z#jVq(]ݗ+u}4pW@GGtTjX1 bj.eOA!6/j }[Q?C^x"@a1;srSZ~c|Il oeICΌ?VDSuX6?] x98P!1Yn0]43dϳ]g8gEߊZ;BW<N8/}ӡ>ݧ܄c~CsF>KFu\kZ #ӛ>YwT dh ՃWk+tԝ2xpyx*PdJT7֩D9sުe$GK٢y~h.d< })"Kxl唖q ׅ.LBi~E䆛1(׹Tvq,=f6N"J |-;~ /Q0os<8zȹunŬS^|`,^Y &8Z;zy/~I@5Ɓ^F ]tsEOPm ua L5bPRBhH)v i_'vV&iq90-YKQe8¦Hx0=EfLNzMc3G6VJm\uו[&bDkPx:/e)o&3Ed̑7DE`!v84Cq4zsYEf2ߟ ٫^WʳwMO]se kvn&QgB&uZ|USߠ]kzzx8 %M2ؼ_'%oe$*Մh*A"[߼R9&#ލog3HZqT܀`;`b!P\[˳5pZ6KxNԊ={RaoB#`Nf$|9G޹Ue([b3ddz@Ձޕ;ͦOW:,6NNkwa+y)'T٫&;:v8[;^Zq5R4E iVi&K(q-nX 'A|XH0_ ԏf>> DbK5K;ˊ\!䝎}l=%@̵Ko8Y[}'u1E?7!>H=_#h׎Šr^vϺZ =z@j 4Cg<^"Un9>Jmc4 n6:/o|S{zO̮% õO. 0e9awDR0 S*a2mѶ^ido\n-u[ cIS$-F_ |.i_֏p_ool?^e% *nJA$ł $$dc+7! `Ečb}u{Gkxq[V!g-dxԠ;I$fͽgLa]٫ejyJ m)(pGkWZDh=F5$nB>|B /*EfA Vv.G“>|+hUÚGgE4޳azG0ppfs78^X(҅ϰr7~ ^j/R{Z69 B8+A(KE{4s"R&:KJtg!{I~ ʶZu.u<'%fth=;RvoPjٜ?H.)h,eZ <ȾnV0SWBuJlҨmÈλ>z:saPTX({1Hqc%(⋼ !{(1%֫kHw7XVҧ(/ME~nQJׁ;tN!PLh/Ɂ92]m- /h&jd! :n\$IF ]xp.1{ƭA[3VB._z7xYV'4M|yeCDŏ=(-wㄉI#p>_X}/4.-h@ip ɻ_aeKyΒ4(gd2K$Y\; /V"v#>qBdVH.d<,U-+.@NiL6::hԘɩ0ՉIt&Tk+!ʪaĴ}ST-WD1@r^Z!dC[:dG2L@Eaxk.̾o@IF$ Uq۴ph>^5OXZ`%/wPe!d|A] L!8I &D dFkn-Vz–@{9 p clGȮʹQo QuI Em&O `_TS%8-g7'Gl ȧ[rҨqga ʠ>,7EX# ~<Äu QK*@y9R1[f*ʜ|ξs~PML}vҜ {rHgS ^ՑTZ棳7h3TSG, wqu91_wvY& r.$,Kx/;ǔ歩uľ= 1`ɒ>2>)~gb>?F2HY ݐc!V΀<+- EtaE(u(8$h^ȑIKcnScP*5r\  m0^uEBL9DBa $q,J{OP˪F. VǀxnNdR{^VH?%muq 쓻#sEoEy iRu*C.ͭh]7e,t>f,P>r>z4-9F94a˓iAl)Wlҋ3] z3v"*68:]gWBچsfj[c08E*GU}5Fǽ?M`]>ߑDrQ-76cHt%UP?GO;mDjS@\8˲%h׵Mz 6Re-r_6D%VP}^cE l`o }ﲑB¡xc^ " V 2j ia{"M?z00Z7#.qKSfLFR,vϿڿzY>Fp˅[ZȬUkt%]2؀I%sLe>6'Q(6'f҂.Tӻ!|cTu+u.nHz=v#+|ccT^sU ' (7"][)jmj=Y>>v=̝;-Lú|"hruW_'<=7GC+Onf6?ZDZ0Wsl^>4d- 1T =vK^4+CT:F?%ʒݖy>F0'2?K %f|!Z#nWR0[ƣɛLC8^CbMPP6T;H,dJZ0eRVN(?>wdFޣd..+f谇jDݣdc-Y,)Lµa'xPC\j0F6;S:ޓa veqk۠2P' $&ևA4W~w+mW@R|'_UP t&f6i)N/OBC#/N Eh-{EŲń>ˤxӢc")o &6q S"!5\iA7Ѡ=M|Z'Gxb%6af C/7(H^ZLe٫cnݷm!bN\RJlo#1u22&z'Zx>6t ]0i$7^Hl'UK$klE@ZJϞ-`}q*ƅ 9Sb6563^K,1F&*VѕZ&]ͤփ}RÁK iVVgF5[)x=x G+l<[逜 KCрV̭UT{K;-8C~A w?W7c0|fGw\*EE0g؊3ğTt)f}GJ W/0a{]rCu~V@"+pNgS\KQH>ityWͺjCRFЅdֱZ8ŋ/+C !Q*JárT hhi` n)m/btQxOAgsjQ".pǞ [{2M@$hCG -/,!5tJ* bb 0ĞKc*|%,\pw@Yfj:)LI"gkʙ 4oFsd%D7$Qx(=QeE_L{ӚeGɊȧQcmޔh+(E5]{CO!h2E@3뇮pt, C{Hqt. ;K}8*=x:ϧ:E@ .t`HIC   toSh}muBf]ᣤl91L{CQt R~̠6{2("ԋP(o#jRn-n|݉bdX-%%4VVwIhE C7y,pH\;R}% ԌB0| 5E?d.6~|P6ʀaN]Kԏmʏm R%Z.׃&_:Faz-Ͷ d1m+Tn;D"'j$Ocmt;6|F9HqnD^3 $PO 5M8.(Lȥdc ƞ7NGwpDuq%7{mtk)y$$D}!aSo坍BM\Ҥx{6N.ڰ|N & 0w ~sD f!k3U$Lb{}ѽե2y,#hUkdr&b7e`՜2rJ- Ґ]}<)nEcN`%j},sa8Q R}Q'k?=jYk Km@3qh f:nt0+<_]>QtRu$CG̸AU 9Г+`{ivnŠڥRsP1 ?Z.޼j bt}@XIwЊC,K4\qQE=rI 1LќW^ H=a"dD$*{ir{d~ʤnu3NQF`CJ+y0"ouuq/뻘M I,)|]HG3 oIBIF' r5s}e3Wy4;o$q,`DSsIՓN3hQ5/ Il&[ׇ+P?)&edcmr^\D_/dCku ZbIDuFFnlO'{Mvf#KR8z}\w)۵KV+; ^s ĕ5a`Ȁ| Ȅ4Ym.n0ȗj 1ڼ&r٣AV>L/:(ӓ^ bȃ*\Ӟ` -`S:SԊX5ep,P LU0E6nyU>lC^^&&.~ZTJ`aeO*P|2bgM=!KbyȻn'~ LDť~Hlsoԃvt[hҰӛl0mAA6ۼkMamӝ5Hti(f+F 3dV!4 $V=> stream xڍS 8Ty/AD"ea]G[Hr̜03gf*mEjlW$"EْbE%%D-{ն<{Ww (OdLi֕DD"O$q^t}`Ay!0$tHDyY$ Hf4"DO@T@P$x`!NKHH>?>͌݁  L\!Q(22!D,|B*iBTT D!P aA$ąg[tW("1xlQ$ L'\<,Xv~ü fe޴3d\>ē F80EcɀGbP$p` 0]:6u8۟)@"!^pd=da1;Xv( DB>{D3K QOز6Xb>Da'Y }х"@%RHp43 K%FLG"lHb86%XSSۿH(}~mBy n϶hkFc*1RL({~Bfr9}*9rbb̅D&!tvo,EDgE 13mן" Álgf!b?N"^!Y:Ci=k_e΄L5@IpD dla1$Xp4 CE E pL5-a%xLK_%aVUI>L(")|ҕ"(J[ne/6&? S~K}hs73՗S}Չ۳RimW汃7Zɽ(i݂V{'0m̍%>Jdhxoj˺8D(/S_nWϻ״u670EOZkP>d=yue"~=9ǢVS"Bԫ&?zAh@\#o1^Hdō9iS{J[CFFmEZAdcP&S|닫Л_Uvx`UqGTvy줠֥ uV#{y_Z[k|UjL:dP%l5uܭ͊?IUR<A?u(#foԧuǵڄkxD5݆Rzv`(ٷkŐ H<^)) a!ժ`4EXLj ܍]*{QɹIj4]R|*FESHPŷuh(|>meNdz>~nI qŝdVQt7+9F.ʊA_DaȂށjal> 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 670 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\[s8~L,Nrjkb;'2gh$E%n@HSc |Р5Xpً|CԽXq#$4žGD=)''M H!zJ*Ù*614tOEӶ'FYg$p'A54/f]Pz 4F^zFBJ8C(7{Q.{20F^Ljp+a 1I0hh lq! O@ V.h!p:8!Ex Y04r*s)4I΀ҠPCWq{:J6]aCH c}1.H$U k4Bvsvr\ oFONv4+ R;ݸdMw&ؤ"Ԯ+$4aK(9"U#RV>q V8½g цl0 qfA/ІM1gV!/E$X 1p0&~DOGKd VΏa~h}$B hC:bjvxPX-"Ga A׈ ,d`?i^AYYH780&HR3B2ҠoFljFIPKކ66)bDMBRQ8Y!oCYm%S)M{P.z{Z id 1 {#Uz[mm!A}kS8Q?m:>_#uN>}>]vy%b+W2NV:ʺg.]~3xs`7rIip,+bWZk|$])aMvwݕ$nJb6Z Q6ȓ`L2M:{'v-u"LPrp?Lzwn6$vهw/Θ/hK't(:CR|k O @i@ iRpߒ& ཊY39.NwygBδn@^n}x mbn~VyY;rPPW ΂]ڟx(p^Co+](M(4OJD~D{@yaYmK MRjE۲уm  Y#g}'$FCDžU <ω "XLGYn䵝Wq:ޕ1q]x>~VE^/lV7\TD:;tQwo'ƾ5yipÃ^yD_eXI+0t4[&FNpLJTʾ&y:ܱٕMoiV>l PMg,u)dT7yǝ8{9Է1XRad~PdFwb/Ͼ|ɁL[0Qѽ7VŽ㗋7^;Y󈉞XwWkxbm[gg--}5;qwoO,bScg]>PmhC̃,6^\y.w=_Ob ޡ+{vrDjV!pЯ4;o^:9_0k| 2WXdW|Hg8P¼ϧ(?dKshqS-v}%}UCFY1/rۤ ٨$&oæz{C׾iꏛwG:^za< K]{KrTǗra﮼mBSzZ pwWMkqe{7M=|onhW|v?GƄ7>{zUfSZ) \|cTu wG­kvR 0{MRC^jdPgii_<]У=oi_ Z1{nvxTz>M{(owh*7y{,{@CFv~7MkA}TtRue+*VWOwi Ұ)\ Hc"ɧXtܥs8{ z:d#8MXxviz<¦}O؍}T[}U%BK^:R t/|{:BC٢:!Ci_?١Oͭmw½th6ŀȮ6'V(nqwX@alPNrB-<\ -2({_yxpv^o|vIrQ_{/T]Me0_vUq_8'L {q0W5`Y f+/-kUA6A~BE5ewՔjT}򵬈VDF3IUbA 85( LT"ꋲODBX 3ghQͣV1vfB 8+ky`&x&&-cqxV-=Vq?ȗ7]ծ,@̆WeR@JNKVl6Jaav נؑLGDb1r4)H|ĉ]jNpJk5F >Y?~ξuiml Lvgt=Ÿ43ؒf{,Y+li@R |mϊW!KhQ D|pM>ރKRBEY![4-^/ƃBfq:eHrםU`l0T?=#y߲r_Hl:/;a_'ƾr %8,ӕ^1nAT ^, H+ 8BU/i1;̦yR H}3> &My7 AKO`˵0c!7`-Y&rQߞe}6qdhcȲ8nt4g4O/g_(1%Ԯ< Yt<'YZݿ!pI2]:4o._K le{3KEl3Gj[rc8@j]d~x(er FP~,gY2,du%N~dŨ!g趂d[wRAY!K>E$h<Ss2rF>qtLDoyZ`+^[')[{?3 Znz 'Kuit'.ٹh%h@l>;_u2})#Cd(ş24x(As;%oCgTFƫ(ʼYL32[#MRټ)O>U, <m`z^oZq{ 67[Wn2llxn?Odc~6%Y1Z21Wy4[p\ͺH|l:Nb J]Bk\%}R8Xnݼ?tak}E5Z*tEԼABSu%lbQ?ÙfQLSPn4lc 5`$nf8Z c:x"q㮲Ou;f^rr݁K] $]}oٍL鞀5ǗoZ\ZE )*%wri_ ý^v+օ;6bم)s|^pH z?bi+c}x TؗR=%xdOT h͝kȭc% endstream endobj 716 0 obj << /Producer (pdfTeX-1.40.21) /Author(Bettina Gr\374n, Friedrich Leisch)/Title(FlexMix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters)/Subject()/Creator(LaTeX with hyperref)/Keywords(R, finite mixture models, generalized linear models, concomitant variables) /CreationDate (D:20201011140446+02'00') /ModDate (D:20201011140446+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/Debian) kpathsea version 6.3.2) >> endobj 689 0 obj << /Type /ObjStm /N 27 /First 236 /Length 1173 /Filter /FlateDecode >> stream xڅXMo$5ϯ%]v^VB@E,fM2"DOn{\Fns^}elbwQFgyd2C)G4"l\$c.xIVVɇ3bo|,d<(|DCv̆ al(p$[ ,ZgY9CixC9 G |,8lo7lﺃC=^ Lլ͜ $iH5$)RP O˟vw^%yiny sN3x BB@ QC«~ecJѲ⑕e#+EˊDe'cPq~Y9,<--D@T@z'VFk1HҘ>FNZ%MZ~]u)5:k $Z2BU ICܐ5 eūd[(h5{(4$`Š uY QK "OZx* -v]p>PZ QZ15f ?Q"s|Yχ09Nn8d+%H\$s$4ekqfsg@LEia@gYŅM\ UDS%hu^yk~(NZ0š9QӒ)`Y/C91qbjwwǧcsf񍷖urvuu:Vv9Z_Zv7ۿ0Zڭ^K#in.kj-\_M\[= hnML%=Tr/ziˍ&R}BJu1<DZzPxя_UKﻃ(YaCg.AzdԪ3nC7MnMx endstream endobj 717 0 obj << /Type /XRef /Index [0 718] /Size 718 /W [1 3 1] /Root 715 0 R /Info 716 0 R /ID [<7CDF4097E5781E66735DC256BF082FF3> <7CDF4097E5781E66735DC256BF082FF3>] /Length 1733 /Filter /FlateDecode >> stream x%YlUUϺm)@r)- (N(y3&1bbF4$j$7#(ƄcPBT^LSZkϾARA ,{u ,)p4V peĦp C$nF8n(&ᖀ4o #6[*!v Ǽí5BbGpkJbFq*bV;"vw-XGln#hʻQ%afփ `#6VV" l;@' . zn{@/ @?Sq-*T}`?ϼ=@6nB;A#T0vڨʟҁVH9&J  cIp⥣"d6O}x4Y{,s<']]c &`܋ybrωSG:!G,X~r_ݚIgtƤ3etƤ3&qoim?ޔUfჯe[A㢬 +QVݒUe/Za.- ~UcdZzmY+-,}㌬UՖUoJY [5tGZ\|u[,Ѳj#-{5Y-}zAz0,21UDUESjt/ )@Lb S$_;lP$ H(@B P$9 ]#A NjOP{D Q'/,&|A endstream endobj startxref 517455 %%EOF flexmix/inst/doc/mixture-regressions.R0000644000175100001440000003131213740572337017662 0ustar hornikusers### R code from vignette source 'mixture-regressions.Rnw' ################################################### ### code chunk number 1: mixture-regressions.Rnw:62-72 ################################################### options(width=60, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) library("graphics") library("stats") library("flexmix") library("lattice") ltheme <- canonical.theme("postscript", FALSE) lattice.options(default.theme=ltheme) data("NPreg", package = "flexmix") data("dmft", package = "flexmix") source("myConcomitant.R") ################################################### ### code chunk number 2: mixture-regressions.Rnw:499-502 ################################################### par(mfrow=c(1,2)) plot(yn~x, col=class, pch=class, data=NPreg) plot(yp~x, col=class, pch=class, data=NPreg) ################################################### ### code chunk number 3: mixture-regressions.Rnw:509-517 ################################################### suppressWarnings(RNGversion("3.5.0")) set.seed(1802) library("flexmix") data("NPreg", package = "flexmix") Model_n <- FLXMRglm(yn ~ . + I(x^2)) Model_p <- FLXMRglm(yp ~ ., family = "poisson") m1 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), control = list(verbose = 10)) ################################################### ### code chunk number 4: mixture-regressions.Rnw:558-559 ################################################### print(plot(m1)) ################################################### ### code chunk number 5: mixture-regressions.Rnw:598-600 ################################################### m1.refit <- refit(m1) summary(m1.refit, which = "model", model = 1) ################################################### ### code chunk number 6: mixture-regressions.Rnw:605-612 ################################################### print(plot(m1.refit, layout = c(1,3), bycluster = FALSE, main = expression(paste(yn *tilde(" ")* x + x^2))), split= c(1,1,2,1), more = TRUE) print(plot(m1.refit, model = 2, main = expression(paste(yp *tilde(" ")* x)), layout = c(1,2), bycluster = FALSE), split = c(2,1,2,1)) ################################################### ### code chunk number 7: mixture-regressions.Rnw:643-648 ################################################### Model_n2 <- FLXMRglmfix(yn ~ . + 0, nested = list(k = c(1, 1), formula = c(~ 1 + I(x^2), ~ 0))) m2 <- flexmix(. ~ x, data = NPreg, cluster = posterior(m1), model = list(Model_n2, Model_p)) m2 ################################################### ### code chunk number 8: mixture-regressions.Rnw:653-654 ################################################### c(BIC(m1), BIC(m2)) ################################################### ### code chunk number 9: mixture-regressions.Rnw:672-676 ################################################### data("betablocker", package = "flexmix") betaGlm <- glm(cbind(Deaths, Total - Deaths) ~ Treatment, family = "binomial", data = betablocker) betaGlm ################################################### ### code chunk number 10: mixture-regressions.Rnw:693-696 ################################################### betaMixFix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = FLXMRglmfix(family = "binomial", fixed = ~ Treatment), k = 2:4, nrep = 5, data = betablocker) ################################################### ### code chunk number 11: mixture-regressions.Rnw:705-706 ################################################### betaMixFix ################################################### ### code chunk number 12: mixture-regressions.Rnw:713-715 ################################################### betaMixFix_3 <- getModel(betaMixFix, which = "BIC") betaMixFix_3 <- relabel(betaMixFix_3, "model", "Intercept") ################################################### ### code chunk number 13: mixture-regressions.Rnw:728-729 ################################################### parameters(betaMixFix_3) ################################################### ### code chunk number 14: mixture-regressions.Rnw:737-750 ################################################### library("grid") betablocker$Center <- with(betablocker, factor(Center, levels = Center[order((Deaths/Total)[1:22])])) clusters <- factor(clusters(betaMixFix_3), labels = paste("Cluster", 1:3)) print(dotplot(Deaths/Total ~ Center | clusters, groups = Treatment, as.table = TRUE, data = betablocker, xlab = "Center", layout = c(3, 1), scales = list(x = list(cex = 0.7, tck = c(1, 0))), key = simpleKey(levels(betablocker$Treatment), lines = TRUE, corner = c(1,0)))) betaMixFix.fitted <- fitted(betaMixFix_3) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[1:22, i], "native"), gp = gpar(lty = 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[23:44, i], "native"), gp = gpar(lty = 2)) } ################################################### ### code chunk number 15: mixture-regressions.Rnw:769-775 ################################################### betaMix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ Treatment | Center, model = FLXMRglm(family = "binomial"), k = 3, nrep = 5, data = betablocker) betaMix <- relabel(betaMix, "model", "Treatment") parameters(betaMix) c(BIC(betaMixFix_3), BIC(betaMix)) ################################################### ### code chunk number 16: mixture-regressions.Rnw:795-796 ################################################### print(plot(betaMixFix_3, nint = 10, mark = 1, col = "grey", layout = c(3, 1))) ################################################### ### code chunk number 17: mixture-regressions.Rnw:805-806 ################################################### print(plot(betaMixFix_3, nint = 10, mark = 2, col = "grey", layout = c(3, 1))) ################################################### ### code chunk number 18: mixture-regressions.Rnw:820-821 ################################################### table(clusters(betaMix)) ################################################### ### code chunk number 19: mixture-regressions.Rnw:826-828 ################################################### predict(betaMix, newdata = data.frame(Treatment = c("Control", "Treated"))) ################################################### ### code chunk number 20: mixture-regressions.Rnw:834-836 ################################################### betablocker[c(1, 23), ] fitted(betaMix)[c(1, 23), ] ################################################### ### code chunk number 21: mixture-regressions.Rnw:846-847 ################################################### summary(refit(betaMix)) ################################################### ### code chunk number 22: mixture-regressions.Rnw:858-865 ################################################### ModelNested <- FLXMRglmfix(family = "binomial", nested = list(k = c(2, 1), formula = c(~ Treatment, ~ 0))) betaMixNested <- flexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = ModelNested, k = 3, data = betablocker, cluster = posterior(betaMix)) parameters(betaMixNested) c(BIC(betaMix), BIC(betaMixNested), BIC(betaMixFix_3)) ################################################### ### code chunk number 23: mixture-regressions.Rnw:876-877 ################################################### data("bioChemists", package = "flexmix") ################################################### ### code chunk number 24: mixture-regressions.Rnw:908-912 ################################################### data("bioChemists", package = "flexmix") Model1 <- FLXMRglm(family = "poisson") ff_1 <- stepFlexmix(art ~ ., data = bioChemists, k = 1:3, model = Model1) ff_1 <- getModel(ff_1, "BIC") ################################################### ### code chunk number 25: mixture-regressions.Rnw:929-931 ################################################### print(plot(refit(ff_1), bycluster = FALSE, scales = list(x = list(relation = "free")))) ################################################### ### code chunk number 26: mixture-regressions.Rnw:938-942 ################################################### Model2 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_2 <- flexmix(art ~ fem + phd, data = bioChemists, cluster = posterior(ff_1), model = Model2) c(BIC(ff_1), BIC(ff_2)) ################################################### ### code chunk number 27: mixture-regressions.Rnw:950-951 ################################################### summary(refit(ff_2)) ################################################### ### code chunk number 28: mixture-regressions.Rnw:958-962 ################################################### Model3 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_3 <- flexmix(art ~ fem, data = bioChemists, cluster = posterior(ff_2), model = Model3) c(BIC(ff_2), BIC(ff_3)) ################################################### ### code chunk number 29: mixture-regressions.Rnw:970-971 ################################################### print(plot(refit(ff_3), bycluster = FALSE, scales = list(x = list(relation = "free")))) ################################################### ### code chunk number 30: mixture-regressions.Rnw:981-987 ################################################### Model4 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_4 <- flexmix(art ~ 1, data = bioChemists, cluster = posterior(ff_2), concomitant = FLXPmultinom(~ fem), model = Model4) parameters(ff_4) summary(refit(ff_4), which = "concomitant") BIC(ff_4) ################################################### ### code chunk number 31: mixture-regressions.Rnw:996-1000 ################################################### Model5 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + ment + fem) ff_5 <- flexmix(art ~ 1, data = bioChemists, cluster = posterior(ff_2), model = Model5) BIC(ff_5) ################################################### ### code chunk number 32: mixture-regressions.Rnw:1006-1013 ################################################### pp <- predict(ff_5, newdata = data.frame(kid5 = 0, mar = factor("Married", levels = c("Single", "Married")), fem = c("Men", "Women"), ment = mean(bioChemists$ment))) matplot(0:12, sapply(unlist(pp), function(x) dpois(0:12, x)), type = "b", lty = 1, xlab = "Number of articles", ylab = "Probability") legend("topright", paste("Comp.", rep(1:2, each = 2), ":", c("Men", "Women")), lty = 1, col = 1:4, pch = paste(1:4), bty = "n") ################################################### ### code chunk number 33: mixture-regressions.Rnw:1362-1367 ################################################### data("dmft", package = "flexmix") Model <- FLXMRziglm(family = "poisson") Fitted <- flexmix(End ~ log(Begin + 0.5) + Gender + Ethnic + Treatment, model = Model, k = 2 , data = dmft, control = list(minprior = 0.01)) summary(refit(Fitted)) ################################################### ### code chunk number 34: refit (eval = FALSE) ################################################### ## print(plot(refit(Fitted), components = 2, box.ratio = 3)) ################################################### ### code chunk number 35: mixture-regressions.Rnw:1396-1397 ################################################### print(plot(refit(Fitted), components = 2, box.ratio = 3)) ################################################### ### code chunk number 36: mixture-regressions.Rnw:1442-1449 ################################################### Concomitant <- FLXPmultinom(~ yb) MyConcomitant <- myConcomitant(~ yb) set.seed(1234) m2 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), concomitant = Concomitant) m3 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), cluster = posterior(m2), concomitant = MyConcomitant) ################################################### ### code chunk number 37: mixture-regressions.Rnw:1451-1453 ################################################### summary(m2) summary(m3) ################################################### ### code chunk number 38: mixture-regressions.Rnw:1458-1462 ################################################### determinePrior <- function(object) { object@concomitant@fit(object@concomitant@x, posterior(object))[!duplicated(object@concomitant@x), ] } ################################################### ### code chunk number 39: mixture-regressions.Rnw:1465-1467 ################################################### determinePrior(m2) determinePrior(m3) ################################################### ### code chunk number 40: mixture-regressions.Rnw:1509-1513 ################################################### SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") flexmix/inst/doc/bootstrapping.Rnw0000644000175100001440000004660013675321507017070 0ustar hornikusers\documentclass[nojss]{jss} \usepackage{amsfonts,bm,amsmath,amssymb} %%\usepackage{Sweave} %% already provided by jss.cls %%%\VignetteIndexEntry{Finite Mixture Model Diagnostics Using Resampling Methods} %%\VignetteDepends{flexmix} %%\VignetteKeywords{R, finite mixture model, resampling, bootstrap} %%\VignettePackage{flexmix} \title{Finite Mixture Model Diagnostics Using Resampling Methods} <>= options(useFancyQuotes = FALSE) digits <- 3 Colors <- c("#E495A5", "#39BEB1") critical_values <- function(n, p = "0.95") { data("qDiptab", package = "diptest") if (n %in% rownames(qDiptab)) { return(qDiptab[as.character(n), p]) }else { n.approx <- as.numeric(rownames(qDiptab)[which.min(abs(n - as.numeric(rownames(qDiptab))))]) return(sqrt(n.approx)/sqrt(n) * qDiptab[as.character(n.approx), p]) } } library("graphics") library("flexmix") combine <- function(x, sep, width) { cs <- cumsum(nchar(x)) remaining <- if (any(cs[-1] > width)) combine(x[c(FALSE, cs[-1] > width)], sep, width) c(paste(x[c(TRUE, cs[-1] <= width)], collapse= sep), remaining) } prettyPrint <- function(x, sep = " ", linebreak = "\n\t", width = getOption("width")) { x <- strsplit(x, sep)[[1]] paste(combine(x, sep, width), collapse = paste(sep, linebreak, collapse = "")) } @ \author{Bettina Gr{\"u}n\\ Wirtschaftsuniversit{\"a}t Wien \And Friedrich Leisch\\ Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Bettina Gr{\"u}n, Friedrich Leisch} \Address{ Bettina Gr\"un\\ Institute for Statistics and Mathematics\\ Wirtschaftsuniversit{\"a}t Wien\\ Welthandelsplatz 1\\ 1020 Wien, Austria\\ E-mail: \email{Bettina.Gruen@R-project.org}\\ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \Abstract{ This paper illustrates the implementation of resampling methods in \pkg{flexmix} as well as the application of resampling methods for model diagnostics of fitted finite mixture models. Convenience functions to perform these methods are available in package \pkg{flexmix}. The use of the methods is illustrated with an artificial example and the \code{seizure} data set. } \Keywords{\proglang{R}, finite mixture models, resampling, bootstrap} \Plainkeywords{R, finite mixture models, resampling, bootstrap} %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \begin{document} \SweaveOpts{engine=R, echo=true, height=5, width=8, eps=FALSE, keep.source=TRUE} \setkeys{Gin}{width=0.95\textwidth} \section{Implementation of resampling methods}\label{sec:implementation} The proposed framework for model diagnostics using resampling \citep{mixtures:gruen+leisch:2004} equally allows to investigate model fit for all kinds of mixture models. The procedure is applicable to mixture models with different component specific models and does not impose any limitation such as for example on the dimension of the parameter space of the component specific model. In addition to the fitting step different component specific models only require different random number generators for the parametric bootstrap. The \code{boot()} function in \pkg{flexmix} is a generic \proglang{S4} function with a method for fitted finite mixtures of class \code{"flexmix"} and is applicable to general finite mixture models. The function with arguments and their defaults is given by: <>= cat(prettyPrint(gsub("boot_flexmix", "boot", prompt(flexmix:::boot_flexmix, filename = NA)$usage[[2]]), sep = ", ", linebreak = paste("\n", paste(rep(" ", 2), collapse = ""), sep= ""), width = 70)) @ The interface is similar to the \code{boot()} function in package \pkg{boot} \citep{mixtures:Davison+Hinkley:1997, mixtures:Canty+Ripley:2010}. The \code{object} is a fitted finite mixture of class \code{"flexmix"} and \code{R} denotes the number of resamples. The possible bootstrapping method are \code{"empirical"} (also available as \code{"ordinary"}) and \code{"parametric"}. For the parametric bootstrap sampling from the fitted mixture is performed using \code{rflexmix()}. For mixture models with different component specific models \code{rflexmix()} requires a sampling method for the component specific model. Argument \code{initialize\_solution} allows to select if the EM algorithm is started in the original finite mixture solution or if random initialization is performed. The fitted mixture model might contain weights and group indicators. The weights are case weights and allow to reduce the amount of data if observations are identical. This is useful for example for latent class analysis of multivariate binary data. The argument \code{keep\_weights} allows to indicate if they should be kept for the bootstrapping. Group indicators allow to specify that the component membership is identical over several observations, e.g., for repeated measurements of the same individual. Argument \code{keep\_groups} allows to indicate if the grouping information should also be used in the bootstrapping. \code{verbose} indicates if information on the progress should be printed. The \code{control} argument allows to control the EM algorithm for fitting the model to each of the bootstrap samples. By default the \code{control} argument is extracted from the fitted model provided by \code{object}. \code{k} allows to specify the number of components and by default this is also taken from the fitted model provided. The \code{model} argument determines if also the model and the weights slot for each sample are stored and returned. The returned object is of class \code{"FLXboot"} and otherwise only contains the fitted parameters, the fitted priors, the log likelihoods, the number of components of the fitted mixtures and the information if the EM algorithm has converged. The likelihood ratio test is implemented based on \code{boot()} in function \code{LR\_test()} and returns an object of class \code{"htest"} containing the number of valid bootstrap replicates, the p-value, the double negative log likelihood ratio test statistics for the original data and the bootstrap replicates. The \code{plot} method for \code{"FLXboot"} objects returns a parallel coordinate plot with the fitted parameters separately for each of the components. \section{Artificial data set} In the following a finite mixture model is used as the underlying data generating process which is theoretically not identifiable. We are assuming a finite mixture of linear regression models with two components of equal size where the coverage condition is not fulfilled \citep{mixtures:Hennig:2000}. Hence, intra-component label switching is possible, i.e., there exist two parameterizations implying the same mixture distribution which differ how the components between the covariate points are combined. We assume that one measurement per object and a single categorical regressor with two levels are given. The usual design matrix for a model with intercept uses the two covariate points $\mathbf{x}_1 = (1, 0)'$ and $\mathbf{x}_2 = (1, 1)'$. The mixture distribution is given by \begin{eqnarray*} H(y|\mathbf{x}, \Theta) &=& \frac{1}{2} N(\mu_1, 0.1) + \frac{1}{2} N(\mu_2, 0.1), \end{eqnarray*} where $\mu_k(\mathbf{x}) = \mathbf{x}'\bm{\alpha}_k$ and $N(\mu, \sigma^2)$ is the normal distribution. Now let $\mu_1(\mathbf{x}_1) = 1$, $\mu_2(\mathbf{x}_1) = 2$, $\mu_1(\mathbf{x}_2) = -1$ and $\mu_2(\mathbf{x}_2) = 4$. As Gaussian mixture distributions are generically identifiable the means, variances and component weights are uniquely determined in each covariate point given the mixture distribution. However, as the coverage condition is not fulfilled, the two possible solutions for $\bm{\alpha}$ are: \begin{description} \item[Solution 1:] $\bm{\alpha}_1^{(1)} = (2,\phantom{-}2)'$, $\bm{\alpha}_2^{(1)} = (1,-2)'$, \item[Solution 2:] $\bm{\alpha}_1^{(2)} = (2,-3)'$, $\bm{\alpha}_2^{(2)} = (1,\phantom{-}3)'$. \end{description} We specify this artificial mixture distribution using \code{FLXdist()}. \code{FLXdist()} returns an unfitted finite mixture of class \code{"FLXdist"}. The class of fitted finite mixture models \code{"flexmix"} extends class \code{"FLXdist"}. Each component follows a normal distribution. The parameters specified in a named list therefore consist of the regression coefficients and the standard deviation. Function \code{FLXdist()} has an argument \code{formula} for specifying the regression in each of the components, an argument \code{k} for the component weights and \code{components} for the parameters of each of the components. <<>>= library("flexmix") Component_1 <- list(Model_1 = list(coef = c(1, -2), sigma = sqrt(0.1))) Component_2 <- list(Model_1 = list(coef = c(2, 2), sigma = sqrt(0.1))) ArtEx.mix <- FLXdist(y ~ x, k = rep(0.5, 2), components = list(Component_1, Component_2)) @ We draw a balanced sample with 50 observations in each covariate point from the mixture model using \code{rflexmix()} after defining the data points for the covariates. \code{rflexmix()} can either have an unfitted or a fitted finite mixture as input. For unfitted mixtures data has to be provided using the \code{newdata} argument. For already fitted mixtures data can be optionally provided, otherwise the data used for fitting the mixture is used. <<>>= ArtEx.data <- data.frame(x = rep(0:1, each = 100/2)) suppressWarnings(RNGversion("3.5.0")) set.seed(123) ArtEx.sim <- rflexmix(ArtEx.mix, newdata = ArtEx.data) ArtEx.data$y <- ArtEx.sim$y[[1]] ArtEx.data$class <- ArtEx.sim$class @ In Figure~\ref{fig:art} the sample is plotted together with the two solutions for combining $x_1$ and $x_2$, i.e., this illustrates intra-component label switching. \begin{figure} \centering <>= par(mar = c(5, 4, 2, 0) + 0.1) plot(y ~ x, data = ArtEx.data, pch = with(ArtEx.data, 2*class + x)) pars <- list(matrix(c(1, -2, 2, 2), ncol = 2), matrix(c(1, 3, 2, -3), ncol = 2)) for (i in 1:2) apply(pars[[i]], 2, abline, col = Colors[i]) @ \caption{Balanced sample from the artificial example with the two theoretical solutions.} \label{fig:art} \end{figure} We fit a finite mixture to the sample using \code{stepFlexmix()}. <<>>= set.seed(123) ArtEx.fit <- stepFlexmix(y ~ x, data = ArtEx.data, k = 2, nrep = 5, control = list(iter = 1000, tol = 1e-8, verbose = 0)) @ The fitted mixture can be inspected using \code{summary()} and \code{parameters()}. <<>>= summary(ArtEx.fit) parameters(ArtEx.fit) @ Obviously the fitted mixture parameters correspond to the parameterization we used to specify the mixture distribution. Using standard asymptotic theory to analyze the fitted mixture model gives the following estimates for the standard deviations. <<>>= ArtEx.refit <- refit(ArtEx.fit) summary(ArtEx.refit) @ The fitted mixture can also be analyzed using resampling techniques. For analyzing the stability of the parameter estimates where the possibility of identifiability problems is also taken into account the parametric bootstrap is used with random initialization. Function \code{boot()} can be used for empirical or parametric bootstrap (specified by the argument \code{sim}). The logical argument \code{initialize_solution} specifies if the initialization is in the original solution or random. By default random initialization is made. The number of bootstrap samples is set by the argument \code{R}. Please note that the arguments are chosen to correspond to those for function \code{boot} in package \pkg{boot} \citep{mixtures:Davison+Hinkley:1997}. <>= set.seed(123) ArtEx.bs <- boot(ArtEx.fit, R = 200, sim = "parametric") ArtEx.bs @ <>= if (file.exists("ArtEx.bs.rda")) { load("ArtEx.bs.rda") } else { set.seed(123) ArtEx.bs <- boot(ArtEx.fit, R = 200, sim = "parametric") save(ArtEx.bs, file = "ArtEx.bs.rda") } ArtEx.bs @ Function \code{boot()} returns an object of class \code{"\Sexpr{class(ArtEx.bs)}"}. The default plot compares the bootstrap parameter estimates to the confidence intervals derived using standard asymptotic theory in a parallel coordinate plot (see Figure~\ref{fig:plot.FLXboot-art}). Clearly two groups of parameter estimates can be distinguished which are about of equal size. One subset of the parameter estimates stays within the confidence intervals induced by standard asymptotic theory, while the second group corresponds to the second solution and clusters around these parameter values. \begin{figure}[h!] \centering <>= print(plot(ArtEx.bs, ordering = "coef.x", col = Colors)) @ \caption{Diagnostic plot of the bootstrap results for the artificial example.} \label{fig:plot.FLXboot-art} \end{figure} In the following the DIP-test is applied to check if the parameter estimates follow a unimodal distribution. This is done for the aggregated parameter esimates where unimodality implies that this parameter is not suitable for imposing an ordering constraint which induces a unique labelling. For the separate component analysis which is made after imposing an ordering constraint on the coefficient of $x$ rejection the null hypothesis of unimodality implies that identifiability problems are present, e.g.~due to intra-component label switching. <<>>= require("diptest") parameters <- parameters(ArtEx.bs) Ordering <- factor(as.vector(apply(matrix(parameters[,"coef.x"], nrow = 2), 2, order))) Comp1 <- parameters[Ordering == 1,] Comp2 <- parameters[Ordering == 2,] dip.values.art <- matrix(nrow = ncol(parameters), ncol = 3, dimnames=list(colnames(parameters), c("Aggregated", "Comp 1", "Comp 2"))) dip.values.art[,"Aggregated"] <- apply(parameters, 2, dip) dip.values.art[,"Comp 1"] <- apply(Comp1, 2, dip) dip.values.art[,"Comp 2"] <- apply(Comp2, 2, dip) dip.values.art @ The critical value for column \code{Aggregated} is \Sexpr{round(critical_values(nrow(parameters)), digits = digits)} and for the columns of the separate components \Sexpr{round(critical_values(nrow(Comp1)), digits = digits)}. The component sizes as well as the standard deviations follow a unimodal distribution for the aggregated data as well as for each of the components. The regression coefficients are multimodal for the aggregate data as well as for each of the components. While from the aggregated case it might be concluded that imposing an ordering constraint on the intercept or the coefficient of $x$ is suitable, the component-specific analyses reveal that a unique labelling was not achieved. \section{Seizure} In \cite{mixtures:Wang+Puterman+Cockburn:1996} a Poisson mixture regression is fitted to data from a clinical trial where the effect of intravenous gammaglobulin on suppression of epileptic seizures is investigated. The data used were 140 observations from one treated patient, where treatment started on the $28^\textrm{th}$ day. In the regression model three independent variables were included: treatment, trend and interaction treatment-trend. Treatment is a dummy variable indicating if the treatment period has already started. Furthermore, the number of parental observation hours per day were available and it is assumed that the number of epileptic seizures per observation hour follows a Poisson mixture distribution. The number of epileptic seizures per parental observation hour for each day are plotted in Figure~\ref{fig:seizure}. The fitted mixture distribution consists of two components which can be interpreted as representing 'good' and 'bad' days of the patients. The mixture model can be formulated by \begin{equation*} H(y|\mathbf{x}, \Theta) = \pi_1 P(\lambda_1) + \pi_2 P(\lambda_2), \end{equation*} where $\lambda_k = e^{\mathbf{x}'\bm{\alpha}_k}$ for $k = 1,2$ and $P(\lambda)$ is the Poisson distribution. The data is loaded and the mixture fitted with two components. <<>>= data("seizure", package = "flexmix") model <- FLXMRglm(family = "poisson", offset = log(seizure$Hours)) control <- list(iter = 1000, tol = 1e-10, verbose = 0) set.seed(123) seizMix <- stepFlexmix(Seizures ~ Treatment * log(Day), data = seizure, k = 2, nrep = 5, model = model, control = control) @ The fitted regression lines for each of the two components are shown in Figure~\ref{fig:seizure}. \begin{figure}[h!] \begin{center} <>= par(mar = c(5, 4, 2, 0) + 0.1) plot(Seizures/Hours~Day, data=seizure, pch = as.integer(seizure$Treatment)) abline(v = 27.5, lty = 2, col = "grey") matplot(seizure$Day, fitted(seizMix)/seizure$Hours, type="l", add = TRUE, col = 1, lty = 1, lwd = 2) @ \caption{Seizure data with the fitted values for the \citeauthor{mixtures:Wang+Puterman+Cockburn:1996} model. The plotting character for the observed values in the base period is a circle and for those in the treatment period a triangle.} \label{fig:seizure} \end{center} \end{figure} The parameteric bootstrap with random initialization is used to investigate identifiability problems and parameter stability. The diagnostic plot is given in Figure~\ref{fig:plot.FLXboot-seiz}. The coloring is according to an ordering constraint on the intercept. Clearly the parameter estimates corresponding to the solution where the bad days from the base period are combined with the good days from the treatement period and vice versa for the good days of the base period can be distinguished and indicate the slight identifiability problems of the fitted mixture. <>= set.seed(123) seizMix.bs <- boot(seizMix, R = 200, sim = "parametric") seizMix.bs @ <>= if (file.exists("seizMix.bs.rda")) { load("seizMix.bs.rda") } else { set.seed(123) seizMix.bs <- boot(seizMix, R = 200, sim = "parametric") save(seizMix.bs, file = "seizMix.bs.rda") } seizMix.bs @ \begin{figure}[h!] \centering <>= print(plot(seizMix.bs, ordering = "coef.(Intercept)", col = Colors)) @ \label{fig:plot.FLXboot-seiz} \caption{Diagnostic plot of the bootstrap results for the \code{seizure} data.} \end{figure} <<>>= parameters <- parameters(seizMix.bs) Ordering <- factor(as.vector(apply(matrix(parameters[,"coef.(Intercept)"], nrow = 2), 2, order))) Comp1 <- parameters[Ordering == 1,] Comp2 <- parameters[Ordering == 2,] @ For applying the DIP test also an ordering constraint on the intercept is used. The critical value for column \code{Aggregated} is \Sexpr{round(critical_values(nrow(parameters)), digits = digits)} and for the columns of the separate components \Sexpr{round(critical_values(nrow(Comp1)), digits = digits)}. <<>>= dip.values.art <- matrix(nrow = ncol(parameters), ncol = 3, dimnames = list(colnames(parameters), c("Aggregated", "Comp 1", "Comp 2"))) dip.values.art[,"Aggregated"] <- apply(parameters, 2, dip) dip.values.art[,"Comp 1"] <- apply(Comp1, 2, dip) dip.values.art[,"Comp 2"] <- apply(Comp2, 2, dip) dip.values.art @ For the aggregate results the hypothesis of unimodality cannot be rejected for the trend. For the component-specific analyses unimodality cannot be rejected only for the intercept (where the ordering condition was imposed on) and again the trend. For all other parameter estimates unimodality is rejected which indicates that the ordering constraint was able to impose a unique labelling only for the own parameter and not for the other parameters. This suggests identifiability problems. %%------------------------------------------------------------------------- %%------------------------------------------------------------------------- \bibliography{mixture} \end{document} flexmix/inst/doc/mymclust.R0000644000175100001440000000205312653423105015467 0ustar hornikusersmymclust <- function (formula = .~., diagonal = TRUE) { retval <- new("FLXMC", weighted = TRUE, formula = formula, dist = "mvnorm", name = "my model-based clustering") retval@defineComponent <- function(para) { logLik <- function(x, y) { mvtnorm::dmvnorm(y, mean = para$center, sigma = para$cov, log = TRUE) } predict <- function(x) { matrix(para$center, nrow = nrow(x), ncol = length(para$center), byrow = TRUE) } new("FLXcomponent", parameters = list(center = para$center, cov = para$cov), df = para$df, logLik = logLik, predict = predict) } retval@fit <- function(x, y, w, ...) { para <- cov.wt(y, wt = w)[c("center", "cov")] df <- (3 * ncol(y) + ncol(y)^2)/2 if (diagonal) { para$cov <- diag(diag(para$cov)) df <- 2 * ncol(y) } retval@defineComponent(c(para, df = df)) } retval } flexmix/inst/doc/bootstrapping.pdf0000644000175100001440000105260413740572307017074 0ustar hornikusers%PDF-1.5 % 23 0 obj << /Length 3142 /Filter /FlateDecode >> stream xڵɒ_*r:qb2nWŖeYT{f|ɯmXHەD{xx;X*^_U_5PM}*U6uW4ZvaյZlǿp}c^|/Np} -w}!zq>,G{6{[cYAHwGo^.7@^&W} |Ĺ3ƝtMt3%I4>2p[Te] 'Kc)Z XvUkەeJ/ 5}^&cHi3եj-b۔=g6%JW׭] Qq ĥoYuٮRO[24 u/BQvV]B@lFiؿC M'A%52̈C:2 8] "9 #qn{Ջn;9gy=w΁rB%mBR-EZS֝׉"Yjm>XK_w ~Q}>+~sW~/ϓw"8K[#'fA`WsJm3Qba(‚E0NY ^ȕJlI)X۩jj@4N?Gqs:Sg؅St)uY or4eej?Ozv!jI/Q9"`qe5Gϳ x^BiKck:ꮬtWXʪAWh9Y|,ĩ /Ps[ŔyHFk-tQmggM&Q̹I6|D꽍!D;-i AHd1opURl:'Ot|I G0\?*X538AjڙE^Ãش#4W82`mې.~lD7omYGJr/G`H>$T~OhgOIc5M*7lE Џc;*+x,c ~rZǀ= h>p;yfNs5])7N|o]]bumsCF$ &֡>D!7za~0$wﺣS89ߥ C4lَ_ʏe\,wJ]̑^W6^I}E19&+lb[)B*1C$nG'QO8Z`EzɗqdAv1^tE!dj BaE=d*Ҳ G⹖+͝[.ɭ1_tO% ~EKA709L] 2d-mӺ yd l@TIdH]Uѐ[9 RXu!U}'-K;H k_8=docD ugX[VHf<0mOT XX72mJaFNשS`V\5䗇9 j% i o< Ϭ4c'psǓOTc焥\gnLx aTV̏#_n*Oؑg w{#yW')&22&yBh`WX`TԽ.UT?º*b\3Fcz&ūa*tG& V2R~8jhz)hevoW2\i0UMLջ &6G}ZxŸ[DK(,goR {~yZFS^,Ѳ ~@$NN?:`i$58!žj' 6~9aSu͒)vrTM,ܵ;t_!"HIص~ҝÖ\]ۺ4༏hs&H*T_b*lG!}<5hS0sxhE]Q~܉$h:v+|1I>q2\!{f5)01|؅6<{.zdqyπ0 mg[&żMJGJ$:Zh>3:M> stream xk >yѳ">Jph4٢Эbyo;/RL{7Mgyqf8'I>곛>7DY7jrs7դ*1f>nGMT@So᯻c_I;i?}뙮sl\cYFQ[Q[p7v=G}D3,zU.}&"˒w{\`74mti'dVXȨ쎴- ~̖z- s!m{䥄<ʹ]i0ÀglNks3 cLcǖGoq#8S&+l`|G-e#G@Y#bxZsm--=Z5Ϸ{#ַE1ml;$h7nin'3heXh|m{m8 "V- H*b[ŗ{ )kcL5N;F0;Y`OxT(]VDF‰>&ız CbhJ"ÆPxGS %Ү{B:STWhi}7Hs{+|1zn~lf8ʽ7BwͭJF&IJB Y#ь &w.Ga8yebDnF<У"7Ufa*@1"ݜ4lfjzsv)j6kmVuPIb*Ӳ~l&$X3C iнWK-+G O<}+{tI ÄV^7AIr^gUabQ[u *';cf6\!za)n2¸,1HmCU24)tn1;ZiCBz+Elω*=:boĪz?8 z+|˩`P}"MSx'&G8?Ac3nXYY>1 < 5^Np h+q9L}(KrxD=!=‡E<^+ ({EA[vζ H>6$zF=s聓gFd.&(0沢Tq'Ctǿ) -ź5/)nWX5E$p2`;$GF>F aZ~- -axKJ"J|pnH"~,y]lϏHoC pm)^`u^ HNyb}Qdnpm/ώq"gw^do@:yT&200Ǟn" Co4v Onu/έwFZ)rqB ^V2__DLS1A`8TLt t eċ8#)9GdJ A"ȱkKaL)e3cK͙2u3IZCN5 Bdt ̚kg~ m2 CKsWE,$e.a-C 6aB{7l:uĞ HŹ/ɜ =/`[aPB Nq`CJ֭3K.M}&7J&*Ew^;VGs L 7}@ũ%З\|@F kBK8A_t81"` Ed;n4&"zUO %5;[~Nk׷s [Z x8w.vv 9/+&o|_v[@@yAQS,%-DW(zhgLmR*H1r*(UՕED]0,%PrmG5aPݤ y+rg)z9Mzu /.%O$hUbpw# Eχp`,k Mh/QtE{QЗy޳- 7q\pDd!+ϻM[;SM]$sf`CxmU_M5贐M[P,j0Q3i4ѿ MDgl37wʁ+}j"2xF,E%LiK8}2|_v>/܈t6'eAGsYg1%&X&+P'<ľY+2dVg@`jWo~R(zzbrMT=\}C>C'X̂=d דo rsd:cQor|}SX ]&n~UMU= `ER8:Lb|Vz'⚆-^䚱ikn?"L5}kwZb&UƨR;1QYŪp\d  LMTĤwcI@zMYUWcg;=f-crOQmzI~r'3J'WhLBr_q4_1a#ѱy.U'q8eLAQ.JM ZCSv8_=yA s{?j^&UOś'Ϲ8nZ?}q Nn1D(Ԕ1O5C@ 1BO{6_PO߻2-7aO48ٛQМ ,KpQ|jZKD'\n7]몋 UHoNJ3Rg HƧ~$R., ew/u5wD‚rY [=9C\WmT_I$ 9\e媉 _ME7G%Zj.=-5-z^Ռh}^1\<эщcܡ%<)ʻQqWxy5|6-IDH.5+F(BՃБuVCxh\,InE Mԏ$W)bV!P +Gaj sn\ 6:ٹr|?C"K&J2'ĘUajymGqQ\¿o g endstream endobj 56 0 obj << /Length 2104 /Filter /FlateDecode >> stream xY[~_A*֘shAH!X  %VVڊڮ݇f8VmyHϜ(ϖYxuun2&otvuS+[**"Zdo'Zmঢ়άrCVe:L?Ӹls$7ix=5jrSt8ťV)$`qE.6f3t6˒'{4c 3+Ayo'*t84,JkOgNדv#w}y fjj`:O]*]T5M$DϮ)6#8*%ݱn:3夛I9 jwL%z }cJzĠ>8{:c26i װz-ڃzUw ԩ9Ζw ijB$ߏyQ."D[zF'mocMG4|]Sb֌VXKKTL.;ѿJȒ|v{a9qn43\]/K?X|p2jX9ľRoX_;V5 sTR Zh>. Tuwa&OwdXL0&i 72|)v '/e$:0wa>߃Aþҹ~Yw*IC{>`Ĕ@8h$ ,*}f:#/ɠ9(,3E?!>X%-V@8*P-u [מ*+jh/OzkE}=- PI18~w-K:M\X2$j֗Qd햸j]#eNpH+ tw݉:~RAs&0kEn,:n?^^L䵖ߥ6qnOwhzTGFmA$Gf {"c$XɆ&{!{F=Df~Euvp`T{ǩ(`_^*SDAq0oa_&r(H|.a(z0U:Y `Vd}NTw~HpdI*vԿTqùE{ E =OܰvX$G{U>J3; 10f! H2uo%|8Lk'ܼ"z-x)$$]lbd*BюFGΆ $NH7"cQ&>4 >^s`l!? P62< ]_Fy8_ Z>t~56}ʀ.r"?"{ VӰ%JxJEUwކ xR\qˏH"o7=ϖw9AJZG5s$zLTdJx)J5UΈIxiUZ9 V5>eѬ&jldѮ|L,94WZQ[lصx0?r2(mѯy[9 E[W*6W6Bħ1$XA +>|u@r ࠪu;y:};I|~=0ispN<8P"}}A*(jEܵXcN9b|#M1K}dؾКS?~Jߊ}}}bq[U;/{*M>4݄"1@S;Z#ĺZU@1(ӥܼV.rl!V!ƨ,R. gϫJfh3K3ui&C OͷrE%uQ0Y|]J/ n&> stream xWo6~_/R1Xda=m{Pm1`Yq?~wQlA< M<}w<~'dɛJDpVJ$eRU*OfTOzqUVʀ +r5КiJ{ݍ׺i&M -WnOsۻ]z +7Gu{d M4zGo&l"`qH*ɸ,meɿfQ CŻV$oy^$#Y;Dk ]*}cp'JBkzT|ͅFUP3eI_;>ʍey N;lF ފCz,:g\aJ[$+ zRFߩo=w6CM%.$P'*V)iLLj`lٽ!eUtM$u r]9]sopw֜7!nA+ F gn3c/'4Xq`*adTZcÕ×2D -sj= Y(]"c9ҝr0|"bane_? BtNNm>֓[خ \#Ry ShxgZs2M앦m'brN9<Ǝ* iJ|nj(6 n˦QŸ*SsGvnHdžb%kh_B"IS<4'4.lň ߔP76|u?еHG[QU'V%={)gŏAzEO"}K(de;B_# [ڄ`* "Uɪ|*(@RT1qpy).%gFg_{Q\ (u:$ o)ت84CB|빁s!GTO藀 7FsMON`~6ž' endstream endobj 53 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/bootstrapping-005.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 65 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 66 0 R>> /ExtGState << >>/ColorSpace << /sRGB 67 0 R >>>> /Length 2185 /Filter /FlateDecode >> stream xZˏ5!HHH{XqqHDZ8!v|wƛ7ygr.mJ&ls0!g_K뇳9?_oZƙ|G< 0?j) ռ56nK539oy[&HػfkS< /2ޣ霾A$ӧ8ى˃ DbAbkGe4WmA$ٻ.poٺ7'olplKV7煃grAvo}H kwWLtY8x&kg{@$UoC:dA$FHԜO<5W9mH `%T)6^8x&G6#HlJz^839G939F{c^hj ڝ@$L> 񖺍oDbVZ(`7"/`"1JN^U|nHنU[@$֒w$/NI.  뺊UUW&n s *?oۥ6loU6uR jHKX 验K4A$Fѯs$"1ڜZl 휝9 Db]{ѱxbjju5\uq8Db>)~0U҅h[QT(W?:֬|V9[:k,(h~j51!_]Mеݵ{/Eu b2"6'N ?_Jda\yUcjl>+;י-?eJ] BݑgAWA$ѓ=_,: Jpi }7i?HFwsDώ h;1 ;Lx`AIm;; ijL7&T̀+QLkPm_{{$NI}†+]!Jx>wX˩@܊ xKy~+3ŝvy5U]Tm廨.fs՞uʵjOZXǑ ٕN+o~)aW. ?4r>r'xJ-4(>&o~d'B~LS%ޚ3qf_z>;eI;}:we]>; ԒOΉ{Hk3\AOr~Ȝxc xeP~O xxP)~TQfc[5 bf~A_8sl0Ǘ3mX4;^Ykz y3c \ĒIvr7!/'IzR.֓_B#;~=t*p,B09Sr 㼚8$xL3^[ox*1J@z endstream endobj 69 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 76 0 obj << /Length 2849 /Filter /FlateDecode >> stream xko{~/ېGrR+pI\C\Ph$ɗsw); R%wvvfvt2Zg/o}w]OFiOI:M'Fo/۫tk*2ƌ_pw/"MR$k^oz/I>rdg:7UV soz~wmyY, MM@YxN) ;=00@N$ktrsvWE9n-/A$ڮG hU ߼~6zD }@{1JD~ qPSCN+ɤ@bv GY3\b {ɗGQ*U Dp=[=.O}s=/}J^-^89I9tBvJ?W^[SNXǦt4G$|9T{jl`;QQɕ ާx:MX,:'5\?wQH(/0 "RJncV8˜@<$&yriqb<)8Tn`iFBZqf7 lMEi%IˏJ/yT 6ъCZ3KڜXZҨ I;{1y0{m{LцJ 4uULKOy3s4sppۻ ǂP&]j dA?bT9U2X:Rg CC:ոDbB/vENo~xʝ)`}M0I:Bt[{_h MکdȞ1勌\mR62 cI͠}(q$;' E'])^72`vh^ɞa:bUAQ<⠿p=җZoFtgnl=[?]{j5Doc>3ۦCަ= E~&-R.P;?{^x'NT8jUCe_~ S}wcl} \8'1|5\-x˾oߟͳ% endstream endobj 84 0 obj << /Length 1902 /Filter /FlateDecode >> stream xڕXKoFW9I@Hs-&qTEIDB%8ί[I35)1}dSMTw,gi.?hR2Jaw/i5_.3Q E`:,}8}+ u&Qn3ͨ-'DaX86[& &Mx^b::!TA/=EtGO]>dܰq@6"nRD03.OF%f%lU؏w jy? Qt8,wgڍS1RF)Ekmsz:BpK5[)NqӪU`\o6*6g*qPRUm/7 L+ A ΜCvJ4N9Y*4G;|xڠQ} uȓkH֟]qGE@-ұv0~ҥєZ.`LCq Cs O8Fa # G$pk!LJ>=q`~{,[(uxbE$TvP[S*= 4:ia, kMs96[ *$5$pCg|%Jcb ݣf4EWugȚuDc\ _$cķ/ly-5Z8xvׄ$:4Jܒ2*!$زJD'G'*ȓ2Vjp t,-(,ѓ7h4Wn=[^SQ`GVmFFs"A1SUVAͯ(C'):,<ִ"4GN<}䥡E< tٲB9}Z7rͲңN<ܩP1 #O #Q-k8ߝ$> /ExtGState << >>/ColorSpace << /sRGB 89 0 R >>>> /Length 10266 /Filter /FlateDecode >> stream x]ˮ-9߯êAo~LAݨK%T-JMUHH;|({ :"b}}o^^!yj}r5mx}_~G?~䗟'7>7/'擕~-w,?{;?~/oudǏ9k__gg!y~o?}ͧ6S~y{sw/V?}]_~ׯ?ןח_p w&s/?E>99E}oνs wgws!ŐtoIOR26~?l|@Ijոζs2OjΖwG>_0~T޽ Gv.jVWbjإ&v\V\BVU.63x3zJc6oRØcj,ƈŤc<ˁ'o[זpv\^d δ5W7+ؙnퟤ]8,gi]گRdOB{R.S2Q™o!n֞MIz՝VcMӹy95Co7?z,pDOss}npYf֣5OpYS䂊 ;VMm>+Cτ4h/̬E=7sf>4gfYhqyY !F%Y{#2ZK4#ZgGc&Z A6a)=q7w>&U9x 4u=r>0-tTg޶܁E"Gk1fO՜&%d">Y' ph?,Zc7R٣ߚA]{FR\8[*"%p} $Yny u&l¯ul`Thf?+hv6%uFFuہ̶hmf՝]LS Pc/:ߤ/N)HEsxpg!V_FY,af7 Q(*{+JIJ3SZ7"Xd/ ǝ1:!mR[3$6Jl"&okhQ*Y"p[92q zڌ  w&LFVߍMO#S=]=>`%!AțxP;ђH 6u0!N;dL-C;z=F '^YL .`1Qf :$173 a8YmUl|B$Rx~v[<; !K6!SBn|+S[_P-˄3LpoHH|ރ"Ą(g0+ Bf08H\ }zԍ"!zPB~9 D`9JEJ#%fjݢY| 5,l`R( )0,wC@JJW,2p\;@&&#@b Ey[b j-5f`#wT"UL-b)2`<4kgpXh1T X@nWIC8LѹpMB/eQP yEtyb!>D|6,Eٷ'DT$ ִHu2PQNjVrGql*Z4 *-U΢cRvUZJTd cOPiknJ]A|vUJCW-űpvNwiC*r~5Q͚9Ԋ<߬}/$:PHG4k>5焇da5+;ƲU,h*!F`#SIp>bÉv+9Emoj\R2\77F9 J"bxs075 Lϓ.%iǘ@t= WҘIQ (,~6˓e&/ @H_=HϵzxrdO jR=1ő0Ci%' `C`d. #"[ " Z[J={` RZ ȰdxDa$BF')5aLs+h좥UD%'JsV:B(K_Ώ~E[p:d` ӻG&>YkCb]܂e7L\eƵ[E(Dž9/9=[L*< jpj_ѿcG/k h1ڋ&+ipTʏrղdQ+N:ۻsc!oPC&CoHVk։Rpk,RQOIƤmI)8;'$1fET6l4E 8ƇJBJp\'[+ bީ^G ݺ1"8&9;^}406CZHaU`d6싔vI2!R00a5PM^&tv¡Jԥ.bSSx[B|I jybKi]0ʜ0  49JniA@=4'MiXjI1Ɨn)o`*(2k _ux&RW:U; U-I݋_beaCR !XG>"u â4Dt'-VWjLmc+8gT+՝PxuۢʏWޑ?TT4ɕ[rMx2 :K ,yA%}Ӭ] jv~]; n t 1]->u %^o@OnEE,$Ѕ}^g~*:So_ԦODJWDબUԭ"Pe.JD۰2TˬL\n"g@x(Ӿ⬁6㳖𺟕V&թcpP52/m<>JyuR5uruF:<顐6Dpa]vVNRIZž0ܲThwIrIZSs{dl mOnʖajHv1j!ϲ.μ,a(NEAF_'ŷq'=Xݟ١43/-*bDj~t@"^ #ODּ':[Hh _Hɽ1]_b;žTe+@,TtW F$egE5ԙmn=Kh;;{gFz;mH{ 'qE)^FB -a˼R^ۨ0R xA R_x4?Rg.`9w0Snh4W#3B;^=NmϬLZ@(&j4kt ltpG&BF qkԉ8Hh7UH]ܞ3F-rx+S_[[udH` JҨ:Xr#:w(Pj"|XnpAuhxuY5 ¿Hn0) ?yJS ^%7CLV[ /*R.p:4Flvξ'< ҕZ! _\ `V>(3zPBȦ:J j2lC+5 ?s47RF(Þ ƶVdV#s٘,*"au\۝W:l)[55[4ħ$=N{6w 895ܥSu, \'YҞ`0̓AzOKIHD.uZ~T1f>Nˍ+ddU*`͙]X-5а;`>hBt ,#R;%Ro{ݟpʔ}#:^oWoTx){pR%kE(?S nwQUVӑCO8p?^uwk ʰ{ 5\:>N2s8>@Mڴ;@p{Cvd2`drWdNON.Mkٴa#&uV Qm[pL\o_//ZPxU (6 tTl0|**[pn57҇7jpCGZ BPx~añ4zM9(%2['?! M(j)tT `SA%v<z wХ #Y3tr.\VE+I', VZEv:!+^9%q?.v@"\DRƮCQWH Be1-?#[O%J_NEiVdz\vu>~Ybp#:_8EdNIۿFC%DRvCI$bCJ 9Ku97*glkH B;;ۜ%zԛ;Jw9+I;loD $Ab@)ѓ)k3b >NFYhfw?#w@ A>E W8M|DNz#՛18@N!0mTeAdɇjl[ʌ[$SJ;dC72 'fDDwu3.2\;IzB9낊{jg *I~Sɑ1t-aXH{y?DNӧ ҙ" YJv: c2׿@yie4DnD3֩`2蕖AZ=qw5}a`싧L`(u`i'Hyk%UsXsivk9Q(Cajn]Wt<~w{ieQ)4q_]D&yE'Sɑ(mS2:"8AgsKΆt:;8.; W2sU p&_i9?:HTZ(e麚`0S}u( _R ;EN57j0YTzmm4#}՛iin;ݝ"q߮73){c/R-._NjPUq PJ}ߤl 527XHb):̎C_>rv`3 /(8Ց@[/tB-u"vpI Hқ;_JTq;VQK e~e,KW~a")PSk1ԡ70_d.+VL25u:d:>pΪquG,cQ\{1~٧ 档~A|^IN깼w :}j hU7KΖtڒm}t,ΓRq Pkw?30lRd CZJo~0CDy*JAN)R|"*SC ?OXeJۭ}PNE02;`#rR˼QNvs2fe%Íe?Q2~ʾJ%z|UV N l{W:c/e<.Q}3Vd&8ʄSS-yK vZL׺{uOO>U(/1F;;Ux1~*&u?;^0oc=Hvw"?c~⦸`<2\O31NO52w<;iwad}QGLj”$R+O8v6`גh_d2NGk>햸m]{lj0?#8t(SJG&t<℔t|y|ufQ-ۼSeL;~JbmzFKF;)yYo+ﮟY\xV bT8UI4Nӵ [u:e@)6XЇ{ZK"{ Yy* T4Hu,=Q[4;4ߟpnfMdpau]tf:n`Թ9d2-}SNX5&SA0-ȲD $\[hCe,5 <[0qUT Z"*acӠbLLw IqMm;7մ !]<9? 4Fi&}olq{iUImړ>~J.ٮ{lnidQ&V:mpjӡڥ,'W[e63HFF:aQC0&W28bPAlD2nn aaK ْTȢu\CMuCOI7H2T;Hϫv=,*P`Rom \R'Srxx׃YOŸD!-K Si70-f0yK e'$, YUŸOBRcgN(*|''jLnҦ)pA|S "[S0쥬| "DIFO)hУNzy?U2'FO@¥ŝGOBGw":NH.[\W.J% z7(B bN̡q;%̡:=:Β%s$[`!Y*KSF,CdžT8v:T9m)_u'SX|Rrx1A0WT@?" ~tVIs\fNu6=&n?;qr9b)*cy;X&G'{t JO2賹=LH2mU >=A!)|z ei_ZNdp'BǭRƛ B=B/N9 EMGX2f:j0@A0ڜZvzʒ;6jҍ$RbrzM@T# jY8bkkzJ*7iQEXf)Ïލjvz Z;o6Si" 2hm_4D^yRX6s߶t➄l*=iD16/ac=ԘSy_L:y@\gwSX@-B!^G,6Υ Al73C1WP3n-{]A:لי}iul(S)2s6h<Jq0eILWxWBJJB92u+@p&s(Pe|e:eu>/k*bퟏS ' z=em>ؿN\p'G  77z,Hb &TqOFԅS]g8]@Q3u5$JB!:Ş:C+ᡊK3ri&瀜.iG.I ;Q3f1%c*1DjЌP IdBo T,{ T쁌s%ÓW,{]ZK⛜%::;Kv:˞(%W9b\ɢ3J1@ܸtSF-N{jv=a,z> 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 101 0 obj << /Length 2459 /Filter /FlateDecode >> stream xێ_A,5=rH*hn"A wyJ\bDk HQ43gmΜVEHE>r%*i=DZq'Qaxn}]NeUIoa|8Ue4QqV=* JK7c#X{#d{+ludc]0sts_5Ӗhq_ʞ^ R8mω'թpŎH+1;ocr"+b``S^#ʲɐ0I}$qDX\w0&Q2*,uZ ! ИpX~a}4VSb!b5KzǪnZ,G7!u i"P&](!)_$"yz!$R;M4O\\F}4"6EѿFɂ\]K479 =viy@2$IQH>DP$:ɤ5b oj 7@@ lqhc2Iyi@=DTz8+HLg,c> LvHN}؏)Brմg1^)Gg{|KPZNmG[v$auJ)SIR©ns#>(6*$K qȽM x&F^MecR&~gsmVib8 )~5- 9|%?*.s1ld'2^ ol:-X z PXE4(V<NxϏVVBL{.-}\tFʳf(~+<VqspN;b;c%f(jZyzΖ^ĕ!&b(>8|-[l{b#"c3CuPnϘ3g1[ws-Mo^:i^Oټx"9p13T9 _h<@'.ͩU\Jĩ,%,qYar@@qp9=ҰܴM" }+ yDm0)]0#_ Vk#aVYMh)4\I[z$3S)mP *b5!^z͞je-c [XԶȏi(|4:xUn7v>z+[ xj8PYKKH4)r2fNatʶݪEZG1.0;ZbI}-QC#, !tWm r[%-6m=SE߄zn%_éKЃFnj$#X1$.T|5Lvv.IS%fT4L(ɘVv,UCD[<|P0@~|}zo'*%EkG3jj[5zc{حԾY{^CU]o@PDbV]D0)O]pA? |VC 8^{>zvݙu\yp;Y3e6I1nɟ͗DC.GPbmlq< Ǎko P(uҲYx]wk?C)d܏IVBb rJt%cFPr YBQa*}X endstream endobj 111 0 obj << /Length 1441 /Filter /FlateDecode >> stream xXo6 _a`cIvln0 {p8޺#%ʢ?ҦB-Q$$M zoO+z" 0tK$TMލ?L_'J K&  c?p?i+#s\/D%Z4z?+p|iC pdfcJAQ,s}0m%Mqn#a=JZa޾v a7 ;*F6F$j!aaH @=:-T|ND9f/<9l453Sr1eV-UN%EN aB(7$C|患B8+n_=a> ϙK"c9 =>Ap_'sƆ3nJ_81Xzpb\x9g"'Ӂe!z B9"1 TzA*!M=F []_nO (D43ʦj)_|e&yh9AdҀM l&x 09ޤ#,m&&_{g M0TSRZ&"`^ TH%m1i$mY08C[+9ԿіHfY jD3~hgU_Ag$fUƬ ( Ch>\^.^cY{9N`0#/hMҊґԚtU6tlmM*^7t2e6qul{UCJFn=%JYׂG }h&ʐB@IS#v$KH*] gY3.Fөͧ [Җ -l,2|`O.`X. ַW`)Չy*ɋ 7hu^C'Tsn˝ӽrXm pً6^OD+pg v@AхPӂJtK[Ke1i2_d@9nA\GL\/zbki )RzyGTD)5ZTE#!f5"DT1n fz>mVw1>J;HϽ>ʈD q /#>7Xg&4B2w`#=Tý oO p/ "H_ڣ8W\|W+U^?hgݓ*uՇo¦kpA{@v!cJyIb廝iW-5N3c)%Ƥc}GϳD*iWFbK(w H urfܖr.Օ,jKUj,GAZv > /ExtGState << >>/ColorSpace << /sRGB 115 0 R >>>> /Length 5724 /Filter /FlateDecode >> stream x\MfmݿYڋ^J&pg., j̛69t$,<#(QgW|O:P^-_JWM˕^7?Oo !??gk~_oǷhz{ZZ{^GÜyG\w{z{#QWo UCp4F%)T!)o^-QNp_Devn"kDoF5RoW/>*/JY|ǻ^wjhWD}LЯL@t{+,>j(ΗGТ`N44{J'~LޏP1Q^9;LqN7@} S L kT_z% NY%~֮R)& !H`n{{)0*HP!ZsQ |Q4U_ZQ?qYi5\#S|5$ے6Xcur9)Td3qrG׹+I y칏/{R#ڳ-ɉMNO6宎0|~پU4y qlR/u{lN}qԨoQmoZO%BD2pؤVK y#VZVEއ9]3oi8c6_+z;|7y06Rlg,ތccuw\=o);y?[ /M>eط/q̝7pjV)K9^-td)#Jo?cQ\7۝wiM֩~-sF#K/B{aeK B`z?WcZ-pNY=6Z%xO[2xKUQ'2Yrspؤf\ph~弧-{/ -aΎ0-S\suU%%cu*_r!@pSK,q  t BcR(x3+бfEއ-pcZ69B8Ghkzs,o|ca/ɀ0P;1-&?eaۍuk~s nt*W6>9?]u4+Gi#tj@Jb姕iҾ=GH6C~@$i`[}.9LaPkî;#@FF`BCM'=G2$m1M.Foh7<;}s߶Zw &7t>)6nļ[Aox;"}m3r(@}o|cH}qɉZ?9=MK䖮YɞOzllvx6ob +"z/$hv'=G4Ŷ53%څOz3kӥ=ILn|>?gݖ b94ALn(|Ɂ,硿^ bp(֎ n\S]y䦲}\~k({Ã|@&,{7" &7wK,w1@ Bl[ɪ} 䦒}x,t7ɯbӳ!d},|sz6y(ᷤN?x# y6:M^Fb8#4pMut,xjӗ9?nj_ 6n#a:9[̠?9ޑn{KZn> on\r'y<-Ov"O] )1-t( cǂh1b!#!aP^ Cby?9ttc4ALn*\V0g\unr7<-gĔLNPOz~,x< }͛96gh{ÃP%nʅ^yX,[I }~ymu즀$&7}nCnfHwu|=]'k*M <-=rmP`z@E߶6KSP1Jko\vkֺþ<}ӧYzC 䦒7nMOAL&"OZCbpӐ۞ J^$&7k[{,r_ &7WN brCKz?<< _yCIEY.x ^sX8bp子<9;ALnz)ǎMMa w" U*.07IFnObr3a\ 6Y7<^^K7Z*tdWXbp|,?B >_~\b~Tn2s*7A F%YipX&8+'1='&*r[bru~ȡ bpNL8 iTTILy5x~^b==Il߽~~F4_ӯLUw ̦~ݯ ~ͽ_+ wnuGwo>kqO,/훿xYn/ECy-^___|/Zhv>7ol"̈-ǃ33`a89p/2{pds^3ջ~פ6Uw4Kw굂8Vѯj|'<-Wv?A{Xy7(my>O?lك}q"x3[7eުynb8$B, 6"巺nw_}=?8ʠef_?/_?˽6=y%[퟾|PhѮuu@ ˙wUAhSJE"ݏЬWIY0.ҰH'Q nVCYF^olH}ȟW11y*cmUM0+Rt ( !T9}AU&VE0EzUݨ4̺VͣES>FftBf,BɺF )vNfװ 泆e>QEJo}v}չa>Ud?Q\6ʣJb,͈Lb &$OX*rg V6%Ի,6@ϳEit#rkWTul+da&`T6)L>gzgʪFhO9#34/>-j+φҥ#YR:?c8H~-B2C7t+ϓYj0H|dܿAꀩ+L䑉 ۙ(2μO)PQZ0rJkMJ86f03jd~

    KQ}҅峔;X>˼Z(|RU*(|U9|,%W>mM0YUѪA؝7[Í}3IJ:cveg A峄YpY@cU$ʧlmԾ|YYUTFeB3+Ө!hŒYUXtVFr_^iDWe P hOKX-5}QU 'k?GJc1c-<.֚߫'ݯUWՠw2}8',rXYTJLX E*[2!^6b .,T%PGҋxv#H/|x%M%733m| 1FςL-x}HM̍$7 11T_uG vOI20b$9[ի>(agbg;Sꉎ߉NL%z;QNB4d8lj3QR6}W{65[Pz4r<uyF2syϜN'#M܌Vy'àt)'#O"4_;$i(EWqUQ^&g1a: JH737*,R2!>#D޾{?B endstream endobj 117 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 122 0 obj << /Length 2017 /Filter /FlateDecode >> stream xڍXYsD~ϯP]M4*a$KzxPl1XJ>kFR0 R4{%$K98U3UeNfw1N _dH~4S=yg4NnM⍲Yr%/T.黟`td j3brS.^ztnNx8PᜃLG:Us:IQվɖŪl?g>iݨ^#+J๕9A+,dp%O_ܼμ@ h.m׫~ p=4`ׯف |Us2$Ta h ICat]<=”TDֱ͔6ySe'1O;}1Qvr&rvd4Fmyq}ijr0O Pl]a{2Ա`[#DžSei_IgUUF PϡUL`|6H -„lqŏj`ZEuB(ɛ57_/kމGM ݜ1q횱NId=^jTy~d,IUUlf2,tz3ꦸ-hG)'y"5I_# z'3&2FB%~Ӱ%5Tm8NzbGa @PgHfū鹑 [ؤhq1Q40wd%DAς }Fe*jy\Qhq/<][*Qn j( 9e]n%\AcJ\w м ɟcI{VY- rZ L1{=l I'Lgle9&{|Nai;BdNNZc^apZxӻ]&O]70~>- +#WnuQS#߂}6^H"@^ VaDfnxb&?3Kv#wiޠs^d\|~Pn_s$}1cVcw ^I604u,jJRO"S{3npX?B`n@n3냫%*PGRdAH濑$б g*ܱ endstream endobj 98 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp9VwLCH/Rbuild18293879bdfbfe/flexmix/vignettes/bootstrapping-017.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 125 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 126 0 R>> /ExtGState << >>/ColorSpace << /sRGB 127 0 R >>>> /Length 13500 /Filter /FlateDecode >> stream x}M-q,|Y^JIA % 쪮˩3whW_HX>sHz>|?o97?߿>|y>s>C\Y},n}?᷿Ƴ~Ͽ柃L#?_?~˾~X#?s^Ϝ?BKkqՏ_|/Ï_}w>{s? O~ /o_~3֝a\2Y/?X} r^9X: Ug m?ָ~Q} zG/?T1| @cve<ּgϝy>kɿKk>E9ka~6@)ΰ 3My>]Wkc>b$)4oJMzqbYņ#.6\gQ~b~?SZr\<ذ2f>DžOVa?v:>vbu8>;%y؊,Ң?>Ѥtavj-ș}tKũsntj8^s7=~F᰺2v|ݚxqj~51yB~xDXl91jC}j UN'p u} 57. Sg -x;0 yx]͒*Q/>|Š9x8&FnsNw3\ZӞ嬿İXge34j]VYp N@VOETϘ?" mp]JkaՀq@`#7}FX'W J}#FuOlU3Gx?ٔ~G; 򳜝GZ绩jŗ3v0bg@ޅxyO^Cd'Q%u#d8kРYݠpG'PN d\=@Ӓ"1޾m&tY+H^c^o\zLс KgY}{ 'mcM Lͩ{ڊ!Ǟ}dG&F& s˗LG 7bdk:f`Ueȉ ldQ K>Tez,ɇM^)I.LvFR 8 ,*a5X S <pK@!A<2e| <:m0P z4Ptu҅"kRn4@(]'Lzdtȁ2DkehbfCǜi0Rcb7 x/ڋ$Xa|K̮howѡ~Kة!DhqE,Xt6!2p->v\,#hLC0ِ8v$ b@N˾ʝ:+`ḻjby~阅dŃ#jDNOS6Kᣫ3@)pP%>]7 nL&4#.Ղ uDSѩDц5gqj+-) 00[iYfxNR Xj| % g {p!yC 0 X<jKP ;<{%lcynuϻb}f@Kj~*s ] PN!U aYb| pOV̨w&3X}O( Ii W KZɾ#/ uX꺋D(HXx,o70dxLP:tގC'0~qNHn "N~E?`%16?FIH6 00) o*47eq2"ˇhP P>dzb+R-Qƛ҂AD(~_qSȹGS0w3ATaqnmz+3RnVk׵|1s$ЌtJT)㹛4@*ym$M#rķ3Vŋd;E Jx2SC$2eb3d#&p6o;'Ā<^7{ PN;v&3m+[dDT`2Z)"f $%S]_oyF.8SD9GA$) .ɃC+ySEWb t uƄ`b\L0Kpȶc5Vzl\*EHc4l ACd닅R\yIaI1)阔ȁcz%t)f6]$ 9 `fvD]!crg(l}v}/z{[-`q.A{BOBKɞVب5)@j^Q#]L@DK q7QMݢ20K`@ rԨfBfPlY&ϔߔ [F1SԦuίb7[v–0*CbP=D@ضfʓa/Ef8?/Fn+":/e{#rJ{C 2:&TLFA4 Y( 08`Ef !"2zWW>jM#4?"af01քbP6jP[! bzԝh\+kM*OTC(iTې2k 8{]{>DD?,.E”ɴ3=Q[j֘eu-0Y{04  {jhOyvWqo8%{#Pdb"KFtգۼu*XS"ԃcJѲQ"hZS=B<.q tDe2 x)8;woILMLkIfr3;qf:OLZH D͔b,C!njpdQ\Gp&T` آÞԨBvJ& C9:LIX)9#*SjX߻F%|"TFP}G+zk侞(ܲ".J^8IQD<9k.rSBxV8-z#8&rz{m7S*PsNM1nY?һ3k0b62Nc0OĈJB"^b_6ZGt\cG}Cu}Ÿmủ ^ݩm}infjpX0ۑP,D `JwS>"(DƔ%+)6{ԩp&c3яtc{G,ciO1Ԯޑ|s* 料=f1ؘbc4}^jc"ȊO1+.`_Ԅ9<2'zER3PˤCfk $G!f4Ц@t+GlH{.&;|Ɇղ *IkHH)~Wdee071Csn/s8;NW3p3\n*x1~YHΒHi/ Yt Pˉ;@ ?NJqArOƔԂ``Ų:ebcSu <0D t$\*uYHcCn ZwFnjzG0TZ ˘`={Vwڊ,֎g!2̀;l_)ilȝG 4S .G5 =, c42@ ̡ \/tPy{34B%nj, Pg%kGfɛAwS$9b)pEEN)q mZg@MV"ŲM`V`ʜ!"6<jcS}CDoRzFUl쨲>TK\i2,3L&; }2'4eJ<ŤS sGȖ.pGy+d.=l*.8J~~cPc#cLSc35[g ;*/A*3Dg )\8 h`Ou0 w05Оr[Hjo8OkX_U7ub_lN6`O!4Z\x~@=}[/=kܟx{Y`3d(`<~h ۯ-.uӤ1lG+/2j]j9q HK "3>~`#U i 7-4pG# LOE0QiPITTҀ3:g/b.P|餁]5rs*peSYLj˗frsVHM^+Tb߽LSαQM$&`~==`②0b6 &;%vR>Fd^UG0gL (²1>jld=C4BnQ7 |@1.5$Z:k])O5`.X\Rk@F]Obk\QŪE)$R Dvt$7S_ktaKhop\{v_f>aԙ`Tאar)'5uT&]k`hR^Cb2}|I=%q%IL5QLe 5aLj?KM\E`#3%ؔol95OM6$)Xq]3Ib/ÍBOL%6uǜnL>i0bSgxƦ`X!bXyE ۱)IDeޤu/M6Ƿ:2WKo8Nwů3%MCjM]2RM%T̯5j`h;Ͼ٠XqܿbE;mZ%{o5q7* Awb<:W]qTUw 9?[{T,&szV85 KQ5t13UjYzmI}*\P.B{ִJ̯s?};'Y[ \ɮ-Ŕqw} v 3Y`W(s׶б #E,MZ׷rq{V/6~gAڷfxV~_zK\ڴphI%7% zG^^x%|¿ԇTwe6{Y{Ey gq['7S4;RtQs~b;W,Ֆi%ʱ_Tj#yUi3W~(H &~.m^,Hixv>K/控Rl[榘^r&hz=ъ];TH7E;*O'|z&1uQJY@kFz Há\Rmph̙;rM(_qw嬂s0bf)զ~9=g{RmK&`Ȇ*!ִV?94\)צ7sǫʙ{%^&;Ulf@50wm._[EE2/$\6Vumý*Ȑsb\Nwr%!OJlnn%P}AL&lm}ڬ?ǼscaZyG}_.b}TB>k{7J\CnbGQ;}vU:.z6|nvQ r02^=b(#KlSB6(Ҳ`b6 ш `8:G1*ʶf>\QhڞسъG2tlAA)צS%`}w4HSe0% pTQŅ,L6G%AbZ9W`>7k|w|ݹxwM#na4 R2||DUP&޲QלCNL6 'z gq2Ĕz 8T[Xw_^5jEyPu cp \5ɇ<өnHF-;}ktl-.*NT!.(Nh9IrmsH1ɎM68GM齫B/^۳B/dx4r])~/i[9=HdVʵ)l d(7 |V! 6FǛrm*< ^G0ZJP6"1sVUXŏ?w<9s@/Q]KMC= l"pXrA/Q60i\mYQ5l"l4(W667\Iwg%*B4ɖ̍L6]V˛(M|L6ᲹetЀϐKo%F̽4 S#j:q:\U kAҊ&0U6)\۔mP9@=;{؍ӱ8$$S_mEU`ю.ym+mM͔imӎЈlt~&-aH K0ئdzֶNg؛I{`cO32v ENPjj3T۞۞2~ nZQqפ*4P?'82zSa{0.1tͷ9`YmS1c.mӏnj@.6u2Wi˦+/YJ0F/(b0(AaoQ r } ǝmpǦBLF(NM\p܎y KMezdH/6DEXH<[@56'&3lexUx<t rߥÌ-6 Ll\bK C8ٌ}S#m=x۔%O"J%4ljLt09eOɎ0}ʤs)g.6pGsE6'`j^YmR镼NNEKKR43 vrj J:@2Ehfr)ئk,mFYJkoG5O6 KM-QŨT^mF\^K c7y]Cҟ\yVrdޖ!#^z`)aB̥׆kSZvzMhItLwVsm/E f?Nw-sZ}Mtp{u=)tX߫l⓾ڋrb@/ j{HN=FEcǝE6]DTC6%}\z6WC=i!oI=FSﯩ.ek|:vgGԬj{NWnk-g̣3UGЏQwBHo8Ҷ߃zVfʹEAoS&'R=7@^m n~x)gIl5MRi{ y\6;\"6DY/Mq.Yo~+4ɶm +Hh0SM-|hS)Jjڹ"\=>zH٣(x>$ qq7a:z#rttP Zț:e!\?7P!sKWB Ox2|}t9ؘy,@VMR#mvh:,"nA ,y6e\\eyΦ|S?kz,͚K++ojt ^s1ŽBlfvL8(^8#i*_p,Y*WynD1>^[ %st*=,w}-/̽G#Na60c! K 0~K1h=@mDxcW1a5b,6,<.U60,`qpg>R{j$qHRŽeg蹖ϳ{հcJM|9\*گj׵&ww~m dq\kꗇ$8.fCsyJr)tWׅZ[[&Y{ݕS_&HT(G $ގ=}CbAl̃9AAKlM}Ÿ ;nJ\'tW{jkeƹ2+kV5pX.5)4T11]r)U %Ta_B!wJϩ™rZdb x!;O5YrFt6!.M/ :kjA1v|W2kbedɬ0ghD $;IףYR)מa;՞Dְ4L5,)PNeFrXiXtX%7g)"aI= 4KbYHi=p=cOC>t>%y2"/"N{y ʶ^'#kCdܟcVhv(b꫁W䪝GɆUjdzf&aZ!\!B^MH'l]jivʋ$WVkMI%S] ,i7pzK')Ȧ_䣉n[J5;),xK?hI9o dui)7V/gT&b!0C/m5 ,詭+Lk=Lz~.Zj1RVSl*󫾶? 8يa~ȰU8jJf hP|g79ČYl"`E95k}4텊SRM-{lPA/jTJNS*G!YkuEI Vь3αp3SQM=fZLVp )1~rtU:zRV=ԀGrjhB>vNh#jW`IGS 4,95n%{3C4i.15}Z{73!+*|w2/,%5@~m+UP9)}UkLQ$yb}*I X=cY ֌]M5Y[Ayh}=/R$K@ IToY{^i_ ~D%@7͖Suw!q\‚CQ{;1 FG_2L"/ g 0gV;i)RP{a:! j32℈mëP]S@ p C-5Řv%z¶9qT /4HS234_9)@Hxun:E`2[zU&iQ%NCSuO öKMq S; h #VkꝮ߮~?s7_݇oW}f-5e/X!AVlX?k\|A-* endstream endobj 129 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 133 0 obj << /Length 688 /Filter /FlateDecode >> stream xTKo0 W"Y~5h!Kú8Y)^GJ]m))>}`;&r2_Of %\ -zRɒ(ZEla_<)_7EG# 1̙Tz{X%n b+dENS?H h +SM9lu} VZ#>LQ`}L-ɤ:._EĀ Àq / S ӍAlA! a{cmr"958cV> stream xZ[oF~ׯ~ E{趁EM67RTuЖ5 90Ǥ,2-Lit)21 q S#`'zɤ‹2=S@i0_i|6ȁ& #5H`;c0CF҂ m" 98'$ 8pw 1e1滀>Ndc9;ؒ'A CF 7"؉# L4A"c+ǬBoI*`n`/QNbDv6|0Ր *)3`yDMօ&QBAX zej0V*DRt;@ZU"v/   !.+YeiC$-ˆ! IJ& #+j|SQ^8on=wWXulqQꦸ*"aڤOfWO)~|ތs`,9. $,^*j$ArOivHV_ع -Bƒx1Aet}hemۅmDɶb$g˦}(? U=qONCќ5F幃(s :CҀy74/_bݼQB!.#=ً NG!'"AHiGbRcQuK U3yz)ETyʜQQȌ<(݃ôl>-n6%mN/ 6"n!R VNGMPLZs3.pñ[;F2 ")?{FWaD%Ξt矀*PWYVccYXkԈuWVTwkSwiiuX* 0DI)pf˲&W$viGs5UGh [[!Tಚ"OFF3SYt a :F:]3sUFFdReUٚT٪tX/w nL (0pUqHc y.pK!lx@pm ܽgHha Q̈\D-"Pi5cь唽ۛ"y,ml8joVEC{;$>/) Ac:o zNV|9o,$+jHɸ ''!uJP `Kn˹J|ޏ %6Yse1>ŕI|YBv~uQ{Ti@E{Qb]46pIO(5'`hQVD]A@UBT1;+5R^5I'+gnJ˲蹆 le =!G)dwewg@+ɵ;0ڳч=7TmfSe0Pw znݖNsW-t5V;"[2^%3^9)cFƍ}{!֫:*aw&oWph5#8ffh@r߮7Yu4oG~ۺ"U}OP^VUjo2:ߐ[Tc w^H+!~Q~rSrpZaq,C;%`l:j}=rTi$J˙>NQSy7MQݗ{DZX Hk<1<ȇu /OSf<]D#o+z3e=wNphysg[w?pC:פ/OmlԧEY&)Oi<<:_o1xwRr9kUo" A;gmY:9kDUKDv8uO W  endstream endobj 156 0 obj << /Length1 1988 /Length2 13226 /Length3 0 /Length 14441 /Filter /FlateDecode >> stream xڍP\k;%}p!w'C x.{/;_uoQ5v۽֐)( [':&zFn0#LL hM&jf' H;[XLL܌fFF19pD ],Li-Ld`afv|PS8hr, mN@  c 5wrf`puu7q9S\-J@G ` *˕AN@hlktPm6ۀOoLL @9l m-l@ -䷡# B÷)ɑw üuYDdcur ߬-051]3PJ7 n ëR%~d0}+ma |h898=ocbX;fp;Xf ?tdkePVR脅AnO:vf3#x/F4+ek p['cw,9\yrQoCwKM6vmh@T MNm lͬD Gq 7߳\Y[@*:&F{[,c@)fk 2`lCCw+~#6'&a-V7> BE;AqDC?`C,?EqdC?rQq\?3Y$;`bXo?Fo5oA72W7l,_f·p·Rgv_m/?fn-Q?귻{[2п4[..N?G&+_ovWn·=dcgG_O1@؞up+ >fViFmp52d&v/Q E֨OZ?mTC~v` juSV@qcEDx_)vV9S VmNlTJuyenB# %ܳD4H'{Gv=dUϛxobZ>}XGbή:"{8*-VE[P.!υL<yLXr@9qG 0! "񝇵-VrVޓ*+'4v087QS٨Y@i&1Ӷ֣E9> n4 ,JtQt3R& zwߐ9!z VQl`oJLt/$0.\J^v3)Ǵ +Tbtٲs 7DIXk/B&+i:~꘴NH&]s2p…;я$ }/E,iΜ(Ȏ)e>0hkzD ; m:,r(0й.7H/q3**rT,o3mׄhFxo!;X- aaօ"/tF?00;;ĉy |4v;s +B`rMWg1bĝ|k:S+C&9HJ_ٽxtC;+Dg|v0HK=2+fROݷͲtD𽫤 P5pze;9E_ @o[9આh^KgAlvSӧ>cpب/59()}m <<ef! EO3`֭Zz2 bz g ڑM{e S3`6nDx4FUpҦ^܆3-8'}L|d: +?T;^n 8Or˱w:X$S H?ڔ(U7OxfbS֝y{W;k>9J@qA-4&SV63X^ > :n!$<ٱD} !Srh؈SVe43' |~maVj߹ϙE[Z!iM,F '^\9N«"lf=7M9^|^j"68JoagsJ%H_t@mam8tZ}6ݼϋ*&4-f,Xzz1d@['B@fgx3L#ppMgn[XL mF2|)W)<[dDg\%`)S&$ vbQk=5:}-(0qsڮvř=Wpnl `!zD­_7_d 7s!L&Ԏ4AQ:FllLPՒ^gnG|A\i?p>[>һ3 5v\CVbzR\~;>tiŭK=h-̂gr˶]}Y̒{0BT{eE#QEY7Z-6yBɂv*zcvj:ݳRYb*9>\`ۗG8RMKe(E8ӯfǿ=_ 40_jðQ-n/|MAAr #P I.VUٶ(ݹu1Z/ʊҡ锳O$~ߛDCa u/2r~'VY**iKxeCNcsMWWu O2*B1E}{r,6)''j/1DLG by A"ff+8ntߞ4 f"qF^LUH<({)vZ;N"{ %EqB?F퐛--=-ѡG}. @se`ɀBш; E^BjlL$1M/%o++*Kwpic͈6Ή$*0֤t]S3p%f dܰW'Ds-șlڶy; 7 $Icz.(8N z~= Q#Z&siċFpj+Gw"3z9aOj1 F#(8E|S:H*Y*?_Cu8pά}9>f'&`]Tn_ο;ʢq.#)E9J//jgpC0D͚U'XxZ4 _+XJu/7Ә:r4fKQ#BO%–jDFL׺U-)l4̷aׄ=l"xc)%?lRQa*GICfu }v+Gpo4h {rbulbMqíQ1t ^? J}1%g0Q>mR2m Oؽ$;FqT`|ֶ'ʹ,tKKҽLv4 :\hHZy'lj\:}z+R`)5o l3rnp?^ň]P$^r ة.>ub|Yջ–=^ԯPqs+Œ$H\IM_gp~5 9Wl6L@l7vdn ˨slK-kK0c#͕+`ôrQXxtph|(&V,κVӘiVLכ& '@OA$ hȌ'E^WLlF`X@|zN v$Z >WOpL+#eC J#$[ܽKy`]tSQОa}/C!|Y wyq{|}mX8> EvTyҼz%{ՔNQK̒Juɿ JAƲ,qXɳa8h`hוc>F!}~2$'~JNeJNX%+_U: bw gi/a'G$V1W/@cI+\/z}{xCUlpׯwӏ^B> Ju"ZJO1Nl@3u9Şr# |yW 5#E-wcI^o%6^,v.7Yd,D:d/#kl)S+юH;ҝ, l/?p˲|bZ 6)zݢz!*ޒa=9憉.b!~*c8"#|MwJXqH,}}u*2i-yR,D3o@l>{}g,:Vp97S2D78| O#_Nxw݌GKLh#tHô{_B늧3ǩu R?|?HZ"UD*nAնݶ?ŋ,=M>hTCDfz>ZA(cefFى cj}߃AR(y;Goh,Bӗ=ul#!'h> _֧ 4OVahY4I +7b#.sn8,Bhycۀυ4ZLbd-W2G+an#m' Cx\a2I73z~(ŀk잦̕]+1ݏзߘ촠wjmf-c U`: ЬZuD5n33BJ*G] bb;|0PԓBKv~4"2|LmX4{1fy҃}28V4'?ԩ˸˽2lMNʃM˿{ U͏xڞ$Fd/5/QU6jߗj ZUBAjruTb!Z`:j\sd+U@HZeqom;ͅu}ާx_{"a:}EMzXQ!~*Fh#j1?Y|B7+#uFB-f:ᱍb~|ꖯɺ?:GroXBX0>q?`EajrE>ARոA/,|@C*9W;}90+pGfFjE{!rlhR .5ԝOA7OP>UҢ%yd o19̈́ܳAb{D{m<+N4H 0ע{uCQs Q'ں_;Mﯕ0+T k"UQsS{&_~qGA[ZW5A]'B (ZWP4uFƀ?j>zI_uO(ByH47B#oZ9[⩇L=@7 lsf-Y``v1/j>m)G91KB E܆`f 8(J4C9I?F-xGr83Bd{uLoK.'8zQ J ZS0Bfsp^M*W5v? R_l,A2Xrk[ՐcpfVn dsHbX+zÕ]?[n8btbD*ɘR}%͂UW::D^X3f 0<')!A!CtI*F_-d33nxP*l<(Xgy/[ڱWlsB&I4 zن 7 3G}0(8E[EC)ү̋<0{R!!RHarhLĞ NU[d$j?X 5?pKj; ᎻO;c?zU Gؗ-Gp1 mzJԶŹ-U69타F x3,<ף)Ǟb 6R%kCںv1ӣ:: 32e}mc/EH89L ?|Yܗ-y{8wf"~aƻe+NFZYc+&R:b$y~ǾC]Z-ٸ I wof)Ea 5eVZo >SPS} LzK=}܉=>8Gu`E 5}gM7m_DZP"d0_WG( =@y@1O=.40p[R<(uH=;#>ǤyħU*Kp 1*?r1Wn[* ޿Hߴe0Meqs('*|-=)w\v_ALȸ@cek;Bw@O,5ndzeݮݚwp؋V^6B6{POޔ2h-Gu}i|"^$xl4wTF:\v W-^vj_8-ZrjͺJ:@XgINY{}⾾"9hCy[V:T~>ql;LK$|*HH[^{/g\fJ> ɳodv%Ӧ8C(Zczbí4pb\jK5帔VR,x1( Dr܂6Hc*{$D?b 4UH_2JDSuWf, RoAGG)Jlj.6Π^|q>F-l?L.,32 vj=+̱YOhh# Rֱ?~gQe4?䖩uR;Ν0Ǽ.ol]$8QۻE0ǔn#2#wd\EV=AC,,Mn(PvèBD6KfX#Ug g~Lol#8@kԙGtڴa9|fVEZf)7z# L%z Jn|/@k|*9"hjjܺFa8Liyyl jb2K&y}T: U2#%\g33>n$ӚV}Hb*; j#IظXQU-K15x8̓Dldۯ 0ф0OQ|C}c.I]!7>)Ʊ|~A7wG~#9x",,jXμw9Q)WgO%BzeIu=?.-{n609ɑiz+H&tx|›ڊL:Ar ua'4nVћ,&*켺N3cnoh\U#CN/N L"~`M1]DŽ5U$T$uCs!jfP9yA‰%8ċ>pA@ ΍T4BzGD қUٹCyU'oz _`F:q )wWN>h~9auɶt8Z.SL;f|g:`hƉֻyKkEyXܣQ Ys`R(ǢxpԵ+Ճ#/;썹^Tc0yuH|diZ7#giA}Z\X@eW]N*뒧YH?DFs%]8P%SR$lw?9bl|DRt[lFq|g)*1=CF(d_F/;b]15)n2+fkWZ1S― lxA;EVwK\lnBʧ#MQk/uD%TiQx:9ߓNCJyYpt=kaځyUU1(Xl醩t]3NŘ")liUl1i^{]C1nY`*hDQ eGx13?Bpҩ Aᮌ` Q)ich$IbI^.R=":@)6/Hϣvw;=a Cy<άmC^ᡷt.R'%m5K'B B-a[pFnK*`8&D//  6 ϥ1/P_ @'S~"$ n9M#L43d4rP&CFp wwh"PF"DŽ%*lsӒ(t1>ܳ]= f aP6bʣ ~Ep-c"Qd h¨hO6U c}UK4,&Mոۑ cDZI糰ѯWސމ5A}td8JXȹwHs!r`QM>&ײr@JQG^Ph8Z~:C?kd,28VWL"/1>Y+RyWҵ%B5C:N}~h*[$',$l=nNoK!f`CE~)S31ˍYe5Xȸ<ȌVwrrDWeR/-N"<MUUB=O+CV]y˘ "o@zV(rRT =r_{٫{Y.@F(LnGz&Q(7K5҅e#b.!_a:B1N&=چis}d$I؍e1XL7Q=Id29k"yB[ 4j0b͵eĹK|@,:8{G,P=]HnxEC "]$R\W/*VDuXQ ȲGp2-J_8%tʋ@hdxʊ?2uɆ^)UE~+sluӢΌFbŤݕB4!WK@ʩ%ߑqu!\mkWT`#j5o2#~7|r~F_]jH3GFe^*&T\sFɳV(#VM.ˣ= =}yJ'm \#f 1Iz5#pw{xa 9Z-]w{(#Z1VчْoֈCi0QU【fM]{?CjAp?i]s2$4Dh2+R| 1x^V1@lH$VwA]7fҰ.!h>+֣j_?}rC #eFutRP뾎3p0sH$lsr =~ 5ƼuPtC n53n:GKv`F ^|4}3[`OUI |';ݤ#O/"j9* jlzM|֏Ez?7f %LXw(/{ک69Cn(nzϓ+{dž8(%T"ģ U@!*?&? @2D mk?>#uJ] >$MB7GO4cjtge}2RQ L}]yJ }(h@B TQSfeY &%hxAY92jK:4)bKj+x^[10|8zꑜUә FO%208& ukxI_p^&6dKv޸,,nr!q= 5R.So R?iU6!!}ʷ'a)dX% ZS"|L6y;]tu~;v O!97F3s<=Nʱ(XunL~{XP x :r>*$12fT{*>V"64!3q"'wT`MeWR(jPZLqCڶCeWxuBrZީUO4Xi&˿$5;>hd$ + G_&$иs +ݮXo7g_,ںZd(POe0+\$CБuc-fjN y1E`0y KhwVH-uQ5_^0cL'}'6ʘˉ XV[WWƶt4߀mZ]Zu fH"P$-J HF vxMwuK*[QbIV`-] R!"Xbn++z4y+4~49j0_)?L[`J_ܤDTV;Y@jIGtȦo%'E+L+)XFR$An>F,BZڵ}X ڊ,AEvr>Rܒòxn$UGl fBlB5cuO'ڠVo^>OɪvY؀bToD^Zw?LAZ򢜸wY{ (Tr?=ͿvBÀĘN7˟ozR.ҵ1s>GnG3FɼP!!lzP ܒ̙ g`N1lz{7I(FgWXlE% n6C?􋘳Hg&1Hܼ{y1z<*ҾJ(;ݵH~";TyD sȨ`kL, ?[zl7K%g%E5H.л8|G刯tD'_Kw"b1K9"z=4ڇ->:"'b[ !X{.xͥm?2>]cY'7ۊZK! (",H-HsA-8:GF&e0nH8,ĕO$hU>0sftUA}qqstk)I*rD;UwH;}NΗ,m_IGևw1Cn׻~;}.e~ u'㡾g endstream endobj 158 0 obj << /Length1 1370 /Length2 6122 /Length3 0 /Length 7057 /Filter /FlateDecode >> stream xڍt4\6ѣAlFD 1h#BDD$DD.Z5$os{[֞u羮Ƭgȫ"h^>$h&@ !>HA@((.%$ؔh P4=a *) &  @RP{A>@ٔH3SWÞ(AP{0!n``BоH!FK{{{P|,' E;q~ F#dG7 0GaB<$jh!x? +ݟ_`{{; ;P͇A`/ B`^`( ln *`̄C#h 5#4kV;(! p4WP$s Gx>9Bpt7C=#V$jsO 3.\o[D@C,%w s`7(\O4F: 5%]E}h0F p'ؿR@h{`P8D 0w|>PNvA0gI=1#`_B̒1'O#Go|p` H_>lkDb{KNM T?n9T]c[5MB5%3O&V*D.JFyc-C ?eӲ@2sQ~:<ɤM#|A0t\ .9-Cv?g4~Ee&Ş}~ܕ8eBG|\+Fy=> 319&d1@N/Y Ͱvi1nO:vHr5+P)xDM7 [y*?y|y]BY~"<ӫ]Ov-޹ע:țU"by-x%T/1 oY4ATn(ca3mfncYJfw(A c"݃l2CVw% Ʒ= -ҭ?fׂ&S`oٙLyk%(;<jw* ۵BUy\Wc36^k% U3U4ϟK/nUzkkrی໌.xiM3Xzk{J$j(L<|Ǿ jT5Oaiy>4C*[Y´X넜,Ki,^o)Q*ʙ@nAml%B~Koy g]s{ߞm!HqNJb:DU[oPk$!F Qd¦-b w9U 4_8Y6ľ Ys<Цq!gEx?7m$aRB۟g|j)ޔe+3z'NvDD!e.Rr0nRN'8Cr/;RF(y Wn j?/cWMgi[m8Tr\c(xfղg僻-CU"Y{D SXԮX*u1nJX~ūp>^&ךJ)xAdo)+4X|gO["ʮCZ:ɰ(}*=;_=J4\*ؓ5#yhpJ;Hzֳ~tw;%άհYӧk}o]pN\GNm_Smk UI$lZQ띨y<0Ck*a1u(E܀ gYW eBi҅OO9SɃGv=1] Ӳ"$5ؖPMZ$_6ZvB"ctx ./~~{N]lA]WPΜWx +[/wg"LT-]i dיn_TW㶾W0O'BH8'r漝lһNOpLj,yh' Z&xKkdRRApben )_Z"IeEjm ' >VLzo ",({"tB12L[>7])"0xX%+C$ pHC\˼jCXщQ!b7q,G9XDfl,L yj dq oXnN-#+&'ػ{ 22C'Cd:kr\CƲ*b}xpDNq ( iQĹ+sω:'IK9TX\ukw,+wm1o;# %Q_df37W:SgVX(~ff̐ٲNY n[G, id&w[--:/脯bo4'=I:2Kh|YOYzdNM[Uh~!X>pD⠍\)0~:5ns9GT*c#ÔXO8#,[姝B64#}Km#9 17~{ 3(J͙kmlyӰ8fG+ SM#׵F %vgM]q#XwI\+50$Z B#^Ͷ8TI'z"ٝ4=o=XLъRy E'V/^ީ>wW|bxKΈFLl@j3u>8.:Օ镨BsE~'kxȏpIApF&O <1 :U$.1 !$b֮{I#qS݂wIߍ mA"q8g Q|>JS=9ڌR,5VoG h4艳%fhox?nw=f13 9{['a[.@M5J̮f,7 `*%f*umYXQvZ@ҹJZln@3͌2wh3pUܹԵKo zB˴i0K{QrPe,9 t8ƓL2ޡr 3ͯ ;;ud>R_nFd窯r߉gStۨ&m\p n;RmCkMEd;d7 F?fT&Wʴ},Wy7>;a548IF{ZԎgfh%Esbj[t2 8ɷib6{}!k@E%yAF+*y$&L+Ww϶DUrloNXǷOtdN3GhPۏGJM;(ZpV9  _Ωcv0NInA'`JbGӺooRvx< TgWl+/UFKj`fP+rh9} 1?%Xea҂$4ycS&\D^w(Yqʺ6oѴiݥvJneBΈ@?_IS54]n=+ Q|6yv;&*Vv[샆e% t4No:#ӷFs;S1%=KuPȓ:ںZ"ۜU66fw (Kf]B*X])eQcz57S@Z+!]= c57tXFiu*UB *Չhe后g6q殥D!>9+݉h*}@Cdfw9ibъnK^QƱdN@{c[:.A9R6ii"Wk3W.ez G_^m?Ap]ʥ0}*(0]\]~9#MK`V#l 1;;"qdݴi.K>ݪ{'9o 1_p* L`MHdU8  Ǝ56{!1xHo鱸Q<r^6ܞG@םsSl ?m"s5^Jq8*p1C#mfWi2L븖2}}&ǪtxZuaF![Š5;鉝$~gxh#BEaǕaVwIG%猳 &OGtZ?_FE=-5-F7b mDȃ8su5jZ+^Ъ}ȥ"E;7@Kn`Cݡ5cgEAQbfc2UT$w]zi$0̬G&E~4K>HTi$mx-.βeŞZ1dӰV{w͕4zeG8>& c֗q N: V);dځ}7q.) F&zmp3ny&=vۘtrIJJ|{nID쵈>bɰ5hX1'c5[Dw(;'G^@ PT<ߦ 0DCG)Ԏ-t߶6mbQs{ `jwNxeDIQ1XπʦRo|՜olPMxn>dr;+ֳ^|Thم8ORO+"FzrםzR%)d+e*O  W}/򸴔=]s?4?o|p#dˬ:*oƽ9+rF/eh !p{T҇+3|ynأI .<ar[;$5ޕr[i&[8v'Gqˌ\%]/-P+ejTVw٨nrks򼁥QBk֬'n=8{;>"ct _MG=x)^d1hEm4̠Za&yÕæުN˻W '):lҝ{R?pm6?jƌs[AhL7nͿ='??K.1`M<j9IG6>^b7~᫅e]T*3vA _(i> stream xڍwT6ҡt 4 % 20 13 "(!A( RRtǸ59{?{~wb3P l >@I[AD\\F0_3 !@ {`l` NhxEb(/ y Aڂ "RB acp%%\H{8B]1'ځ];)=< y{{ ]Q,?0H/(a3A".# n#f0p 0TAZwwѿ࿃vvW70w\]U-A? ]PL< sb+T`LC!an(AWB`nYQBB(_)ÐP;̵3 !x aPu?6@(QWz#7o/3?74fżP`/( ߎ';  C, 0 .>)ߟSTD~( cL-Xu= Z5b+?s 0CrK(#M!7"0 i==0F`do)h.{12P;a(U уy9/P= ˇ3Á ?T! HfĘ(OD!A84G ~Sو1k[P(jG4= s k;y-: 3ʵjGo &H!{eCKׯ"[R[/% M tn)w12 ɯ_8㼾ѡ)AWpĻS ]U/bbUFL|D 82d+8;M^hãQkVd>"E~拠q߹J#-='93!U? IWc%|v[WW{j!-ydtBQ iYU-.k-YqT`ZPIjBպbw;?ؖ3pκNXS&fj}1DF8V⫾t&{yP@q~ -5N98o0FmW\^IP>I#K1wszAͩ/"-P'C)GCrک4pu™(d1. 5è>E+K{11'ClfkXj~Wcblƍ/W'_5)diV3lͩdQWy|R,/j*7iqLlD(?.[O_]HbcC*Ef=XL5%Y4 r+ԥs{[1zsmڶ!cZKU֢4zf qm҆&q޲RpB[}[TW;G(JυܐN` ItYz R0 U}r ç#{_sA+HAkN8laXn8vms4;vaCa$9LG:譁6`)H=!@SN1tH'5aV)w?fw[FY_>fZkyH|np=-Q4ގnK; OA; 'ȒyRO_]~~eFihSm_0t֪0!y ]e,.nݕLpN|D(G--Mz%½OySn[ްSOF?|yoi\ ՄwQI*aYGly*(U 9߰/\K𳚸ax$[UI0NJy0){ ݥf;sBj$gD-A3 %$Wf?<)eAYߑ0z0J(JrܤbDAg& *N!u^"}0(C>O-" 8KE[U艊7E$q馽G3i>] %ڸ}5LV/c.4}f&q{0.BmD1gW`Fjg8GfgH̄lb&֘<&1L,M,;vď b$>7ۊzw6{b *~ya-ɠ:34_15g'Yn({(- >&&.h; Ϳ,, p% z[qP4/>0P{wU aqdgP-Ba۰uΖ;&L}3$sVԏ[fiSGm ,E&tf jP(bs1 f+l'gxid?$jSZ;_pr9]tki|VB*]]39<-Yə˹N"Vhx m N޿nI Ne}qut0؛~ ",'@Ww87GwޤmԤ./[i8u5F$ ۇ<}}K_3^#j%XAu~XבN7p&ߴPV@dZGfLA&Dv+YVI-dF4[:Oy F7 0_]:MP=TtI\rŵ9gVDA)ys>ndUyJH!RAPR]ֵU%RUj+G@Fa:^Z^y1+L ry~܍=Vx?+ۆ|R:y D4{o**=hŇVgcnoS]`šK_T戒$0߈X/(e(܃M"nlG6ӝgI+v/e%@qMU|0>A :̳L{]{r9BDڍgQds-Ra`yE^ĉ Kg K2|}z([quƓo&hOb>ؕ@1IH2PtŬ7>Ѳ%)|)x:Kt{&h%#+[ds˙yFJЈ )!)NPA,;c"gFD+礂ɤs( /߽ za?a j[?I}C 7k48->eZ1l Ba.h.ʞ `9+~{l٩OumY*Y?_UKx;޿$2xGi֐R|Z}AS6)ª;16oW6z5%_frٹc B9ZF nc蘺 Q'lC mEwccu}8ŒCo#6]ٰs{O!Q"- {o&VrB.询7͌z飯+,nqL}O!Fd 9$FJ6C};-^X%ufyC%ͺɷC*5^ = ٔoȫc13kkyÃ.cӦqQ1twF_l%榙OK)tos-v MD{l&揹%SDMHdŰ<w<G{je^ ۚR[^A}:PƳx655is% (3_G7&MU4]trXm3tI[7T\p˜[⍬7nV7iKMJ_(g*wc|`yz?9ER"}[8r:7ʊJõUDCl 䘬 S(CFf%jg|%loIᯯWp?_V&yQul[bE"l5`D~d 5&-VWyŋWSCOϓ9 d .K6 r|iiĒTwK_N ZRvw, ǎ)ŶS󀼌TBϜrїt4e~Z\qVyҏkCA `[W6|ʻ`E_WmDˢ:_Ab> stream xڍTo7RCѣDr!Htw Hw( t_>glu|̠)c(aHN.(@NCC@ ^##Wq7}_b|[x-2Z %YiX,.<~hQ#zWj> /t_B*. - j|R5qBWoV8 ϣ,(rf=UPpNpp]rd{V* hFy|ط}Td5Q#y]K?'<KrĸN㶼h֩:}2 .ٻ|vԏ%M-/_|h~ }9' p\\|`{Q5,y"g>'a8syu]vUw[jϲ> ַ&, ЄZB Y^rNΘW3xN>G[0ݣZXtM_jBEdPFlޫeǸ8|̟>m8`P~ Y2,҅K9{yG\Wo"1$Gl(7\Л+u f__d/: <[Ht?Qf0<[ifh/,/y0+ ʱvAhǶ0#g15>G:S˞`A+ X˶q5bP)ȧg ;m?Ԯ_M19:.1[;3gqočlߢyKI}Jܜ{VD(b{K9Z&;,x6!E˼s5 =tWr:;\g/pdמ_24꾹|Oiα Q?jc \V76|^a,d >@!0XXlW=`( 4k tL3  ]#Be0|~fMjEjJ x¸Eņ&T|TIf*4ʭVu%ӿ2wUcR͵q7SC4zt S&V#\íTtԎ| 1@Ҵ/*l&T|S̝ʫ\+X=brwUYitNhuN^SZsK 8QIxj Q\G0R|(4PזJhy)WqzpN2dY/>/F}9;[LS~ -Q#cQԓ,^褪05RR8nP&cplȂh*߱[Nǁ%'4#3=|~## n/gI6x}ry6#-;ιԙ1j]6)tOpL}osONх(8bDץL xNkF/v5՟Q 4ngys 6 04:Nf̉H߮+!-O\OԿha׎K1Ak @<.G&=̀f)']z~&<0,~n&{[q<A7m Heh+,ȧ+u#έ$Sl::wTwVY@%qwA2/8/= XGSı-w0ձdC9zQzɢXS8L\iyXџ?#-$;̞|ƴ{@=XyJN(0IS^e?1Ľ2gCО72] R~=j\MKЎarp CC˖Ūӹ-Ӏ.џ-PBд>oua"~ȤPƺhrb1{92elw P_pTIVǚ6(T¹4ѹWB΃]J?j:?r0^"l:Z;7_m.cU :搫v=c yFR58e:oWGj#5ٶbוϴaM9bg4֩<%&?]7RqBLQ%Ш^K\OtnЮK,IѝmcJ ,[RCEd+Ԗ)9k" pSi$~.OOlo 8&o&;-״\w&wKSr+Yyo|M[o shLbS!A=|ŭD4H,Y ٚ[l9: ({Wƪ̸a3{Ӈh&HBtr)FYH܇Aa%fH-DR.a7w*sA)QCRq^6!0iwj%~&4-J]l~/kaTɍ;+R{Ֆ~Z_CLYl- 'nNq!b[DF\e6gJ q\%iX/hma+AXk͛*vŚ<͖gL?nr5_${Z`xqwf뭊PD37~b?aWYTՌ%;&ixo tW0Qo$M#o>u>Ӟ7n,M8ztDʴ&FϨ{o!t^e~K |q= <`um3pe\~^ / V:KA@m1‘vrpW^\ryVeAN[ؼ|%hASo(zw)WgWr[nNU@^Ş MuV2vO O/|C"$zwjwR jYY, GEnLL&_bf\vTc5[d l. BS'V011݄Xnb$ǰf-jo䦸(v{NP(X'UIlGV>Rv7-˸$dn=752V;CEWNN>ǠLp{&iᦔ/]YʓUGżDiK?U|ֻceSLjlrI)yq⬛)?+-m+}"y֒ϴq)LϭAWØ'a)x +IH6.8B-HkGN'&A4⅏0 KX=S5hF`ĻG#cotHp:PHǩn-:eOĊ)HT<" 9¯wI7i5Z"a2c8$,b޾1]. w[ !@c[>y羳QcU4.ϓDrAU "8Ts] HlzKwS|zɍޛ >CNPhq#~L l ֿ0Y 2UU]Іݪ1gGGrZ>59Y远 gꙩkFvn%(++X~Lâ[d,WkuZˎ+P @S[ Nd.{1bL?"#iG 핔7Jo8kՉ1C1I~ gQ_>.Rb;'Sճ#ъ2/F8ExN*0o\ xdMM%‹>__Po5.r~^ӳ#@{) ,x-nU€oYEiYLbJNVQ;a5%rOQϱQQ'!fZCg>rk~eKAC$Q#Ό]EqdLd8,B+Ϧ?4E (an.H-OZ1O\cZӷ$ Xqޔ=dt1 b\R}ӭߺD7t6qgwf?ܸǩ,aĝ,:hSpk]t6WyP6eJॐ5Z%6Ke+}^-0nѺyT%y663I?f0]Txx|IƜ]2έwN>໼&m`'Spz]GPO?m.WX>@Lև{e4YLgk#K~-귕5}c 8 }1N^S07b#"*Ku:arg]Xgg_dw  ={3y-VBd; ۃk[|gyu`]=o>$*T%, 2z+ظZ*}o^j]2|NzLW֟ ^@+ L LIj7c[e"OMTߐt$0~PlNAW[]AKS`@$|ם~M#fGf~&{7|coIZQu1i{pg,lvI+d-hzF (F*~!W5?3ulBRASWI8vP/NϠۜ\=oAMZyt#$-X|k(`ԗrZ":+FƁKL~R !*UL"籿;LJ*J_w.f4T koA4v,K"BcP鴓0F]} eT8%ݒ]@9W=4uy>1&k~h(?^5z2,d`QØqw7h1_{J׏pOPu;r$/LlΊ苕vYk~M#9l.d%KXSW1Op ޓ< - nLJXˋZ4շ:aE/i.zotf+m,}'f޹`ɩzV2p?K(O>y/B:LfǠ}wZBDXX9ȪqaX y)Lld}OE`}[|h<:~s怐9u~/"a}i#>sݜj$3Ȭ+ io$1 û n\4:z*rqlU$tkm9FO$OPm:8k 5=ѪXę*}hLS_5 4nPOԓ@\|vKf @3"ag˔?=A VW uڎz:S"0[_;1ɸ'tԿp8PZ!FiWS*H12 5HsR Du\Di'][wf1u*ubЕBW4!Tx%1<ϢS) d ٞNj[]Tꊲo  t)4k:8e 2Y7OyJQ^&P \ &|pCY譠@E_Vo-]a>fw$3љYG꺮BfN?-߮2܀9sƣb Ki N0v-+ _.wދ )>Lt\6빜zUeWtTVX@,1'"AԘ&GYg[R`5%4E=ic;%RZ޲%0+"TnDž1bH/?TJ2T`7D;S@g%SYσt ~܂[bS҆VUl)6'Ur%H萟dԳ||DE~vR(gH+1Ԟ8CzVvK*>o]o}|Jwm;;C3_ ue6z{Ii{*L5U"ƎM!4dz!Ľ)"uv,xl[#RbI %#|Zv e݊bG!Z>;||YupE1NlP=ƋwiSj*jگ%5n\+4y0F[IEߍr.pne9%l.@YJ endstream endobj 164 0 obj << /Length1 1385 /Length2 6093 /Length3 0 /Length 7039 /Filter /FlateDecode >> stream xڍt4oY[EĬY3-1"vR{Q*VRRZjyysok_}}>7 e(P- %D@qJ>>SWMgG{"PH堆C0x:G!:^$-@Qh9:tPH'%pt @2¿*np4 A!'" 0AAp?R(8a0rbb>>>7OQQIP8p7503(% Gor@p^ኀ‘/$ Lw?z;_(A!+p' H/G'  \!xߝC`#? OZVCxUAHR(G#|0C2f@ Q_o > /_PO65x: $;q)iQWHl(3Ph_keb.t B__orp($ *\rBGdeXt7R\d}rLƸbInΌ.< wn7P8a?s-Wxݑ>a}r1IFir%C諯)n{LhtM%ܠщh1h{y#֒1ɾtEꀙ?->l9&* 뺮B)eOՅk!:ޡ+_yaiKU^9/̢ פSc4mLٯVҴlsCfLLZuBJHuJ8qi҅ϮTGrx8?{V$9j%"jQ{M{ :n+ִћaq76F?j|caKU(S?f u;'ֲ2A:O'p^ SADn P>ޘ`䭢ecR 6|mL 1J7pɅK(FnNs.M AMQfRGABvҍ`x[ 쫹" *@Fڅ*D!mD)j0^W;FOpʇO0-"XQ*ވh#^ǓkQdZ)Ie$Tf!سwy<7WҟxZKllsAګ"Iނ)fo@Sh{$X+Փ$*ֻ{^!o[DqɭlKc$wdӵyع&o%Q$>daȕ< >fTWIK0*m`}#+B''/ԽMJ-CП}*ZsPh=!<(>:D)$H^LnxS ~UV  )!g8"n%ByȠ=;(%Ѩ-v,A׈0;cfK/^lP:]D=_y7cΗE""StU[$5' PgPBC+R1$׿D􊝷&HJ l}y/Gh#4[YkjGĴdq_uh,iן '$ٜi%Qx~̮Z鍮X3i+ɱSгNPkeӐۨZkȦ@&tXP,8w[?Pa>@f!#TydO|.ZߺWqeƼN|WO̳J z]LCՌGcԂX]$77 /Ze'uP֚ xoazf+q8́4ORԭcmQaCO V+%w{ҭ3./\YѠh%9I[C~Hǝm˵YĻ Dۣ|ёJqLs&6uPU/),O]t&s%i93qԅ@ϣ )aC*H66+v2ӢzO*_ra^WRy^H<`7eMbܫsZ#|W\ 6_^:K^IJ8%DZ~hV >8\jQ{}j¾G΁~G/ÁYmXzT/7A} ;z}y[Vyϴ0\V)UOxjRjM-찶0j,ku@gCL!\~깾FWm1(t vu̟3(NsS+4H6iJyþ=jQ5c+<6sZMm*F. Y +XeHb =mPCp( ({KEhSڑxX-V gYF GK>]a ݻͦ(: xMu uHp~,͋ n3޽GhlH^o?|ӌ=6prvr,][lM Q8&K/kpO.G24Z=>%NKSQԘ+#2&\EXuFL:?ĿyvBFiOj 8!ՔKx]h{v&Ds.50cBo/+o3GQ;<qjD%JKϗh r21sJ~%qf}aqҖf\RK4ITOD~)% g$龩ܺxoO~\ќJTfosSj 6wdau.>ĭZ`J?(UH膗cWIi=g~vSG}ƾu2eфqqvOe~Xeoq5K~ ] 1ڷh$e!b꿸kdN]YXgib m?٫wwhLӬ6qIR|]ًWYv  gER&%(][ke2os6&sb+ kk]:)u[?{"0_\줹W5yM: {'MMes_&/և6CMMLbT[`dǾ$A$?OΧVW9Z^4\)L8 ۸ϥ}/'\7L~Bi#IՃR[ld&`Z M*ksóZizDn lmFל=R'ts?Rv8|9Oglk5OҋRܿ|bbM9+Tvq9-AI|WsR= jv2k5xBt[F^hhTT)<=Sؘ{i(bT@Z2}Wvhw92W픂w LY>ײ o.a Yy$18&9S;m5NI;Zm^-Bz''ӻET6h.]~ӭ`jC>FlU۳7nt32]VZPRuyVV`` z%O)O2@2\A<#J]z)D:83Qn[+Uӏoo?r+bi;hS%3ʻO $taN'Jƍ{O]P=cs1ulUK~Զ>\S$ZBll dc0N K)MH&iD )w6>- 6DZ,QuF,ZEkQ(靲8Kqzs? jY&:w]@[6͇WVC6޾CPO{k?{bLf\74y,+u|੯~k$>s)+v4:=j|ʒ#s&/_&^#XY#bL.#4H6?<-%SI,m>5um7>޶_BaU 6llXk}Urlj4p32~yx}þܞv>Wt ;F7ֹHd˜$rA ڪN̢WTW fL=NJW@\k 6XYiS$E'J+Ҷ^U!1#t+xٴ 2__{qS ]ª&jܢEsmt a5ﱮL+ GJ9NĚ *5I#9\~qG9DQڸ׿g󽦐5r !T endstream endobj 166 0 obj << /Length1 1386 /Length2 6102 /Length3 0 /Length 7056 /Filter /FlateDecode >> stream xڍt4\5Qr5zD F޻ z$-AOʽ߷Y{?{{y3-D!<`1@NCCEy`>"ff}8MlsGsA<i 3 Bba10EDPO-"0nW͆ sNd\`p(Ѐ`.m΀C*uA s^p C=aM d6@z!vpݯ!l=\y p7_E= EEqU^;Lt0Cv0 Ep4` #S1w{A߿1E"}_^MCcme?;&+n>A0@0%emCv1=2:؁Dbh r3 sw⿪X )z8;a /Z4FH 5QQ4=?j68oKkpL`af00jC^/?P@ m OPC}0XP[oj<$`fD  N|Dk970nfC4;wl}R/CŽ^w'Ę}Gar9EIZl7D±]S$oqo~} ISWG&RiH^`eҋ`iŒvJ16Ib](Z"W.]K>5T+.aejf3IxՑ.' Q ]eD) _{~&VQȠKE'Wro!+ɛ/S~0 (?[E඗QcdzK7:F[rAA2zY6mL6fVmǪX<ij!ĕ )>\S t䲶`CSd/s^gh&BCYޮLlgͣruDvDZe(4| _>d꯷Kh=l4ʻ|CGsf1/g/uQ,k#ȟС#܆Z/c%EB LvB}q)~ڣ{98")%|t~ڽRSNI< T J[B8vp' R^'愑s{TYTy$hС< Ky4(-%1z_7#}K$hֲ! Diѝ3sR緤 L_DEb9J눰[+ƭC6^H%9}5im_ޭB0ᆅGjގų1ݹ;eWK'\dr)xl_sQS`U9ށ2{);Q_U⭽y;(j@"I *w$_g+| /G3Uy3  =Wg9Q/ V¢VNbjzk#x{_ ðʨx`8 Y23[1 0!P::1YVw>|}Yٙ"gj 1ωRL WיQ0 n0tEJHzuTToALHhJ҄`:A}E #k\]YD}/_Cqæ'h|8zN>ZvgeՆ|N^{%IST̈́2x*]5ɗ@,z:~i@ާxaCv5 4لm ?kXiX Z%2LX:IVɪ]_ Yn4(8(ѕ~&#Pq4N(,$oX?\'M(u-Cw2,*C|s ԌR,Cs) <;(Tl0۸ҢeQ4 NؾeͰ|a8 }j*e ^NlnR.H涫 'o1a~د3&[ MCF2$3Ls6_H¦ ?*~R<-|.:`Ok_&m:ˬi_g4DxXhs+J:U$DDcv&]rMƟBpK73㵈ã(r5A1h28NU_d6 6n5% =~Sw;o56Cۈs<؉b5*Knݭ3-2>fdZq0+z1gP!n)zwŧ85,31-%ݱ:[>a| c]kJB&auHgs.g]'3KRg0-gRi&P.aO ̜<8)]\S$0 %4( 0tKi)J\6NV-Ë|")'[zz eBOwD^5(q;n@á_]C?':qz/oYGTu#(*995U1*܎QU>⛃MUE@A0T ĄQRӭuY`~1đ͓,͇u1Mݵi ߿8g#.cw@T7Hwo62oes~2XǾ6ҠHuYWT{: WG 1xEi䤅F~t*UCgґuU/#OBYtnzrw.E'' ֮ފw-jtnD2Sx15x YTo6SNA|[szf GFd,+YQcS'gQfej=*VP^0twtNJy0wjkf`e8[>Z)}I Pi{ޔU&l^z[ܖ&ޒHtԧwM=!v܊KjP&.< y87K)=X_w)'qe@1٧ab/'VӱbLHH"F<9$`rn=q,xYF%a Q ,[1̽/B=uZŤ(% r'FAp٥44~5|avEPquCb c $Q[cz φorbr='g VeTl`ϯ?$ IwLʫ䉡3hdu»e*2!>h#ޥO݆뽷GOCl˭JEER8.= pz3.gvpQ)x_fYLi&\UZ拾/'nd!~|6z"t0cDFB 䒰yuk{8Wjc)a$۠H sGxS !5,/*UYϻSǂñ/WA  AÛEZhלb_)MfE*{&TXz΂=k v:MSBEWJ"|U 1їwsy?DOl5sDyuSdAb۫wrfG'qDɸX,O!|Y"@vndwxzoCۜZd,]ԑ[H, ,#zMᆱmf޻UON7 Hv_h@䃠/YNJ;3Y{2*m.cͩՄ;iJ*UKCb,D#cb%\wCT_a1d.,9a!o{GΏoV)5żX;pDE봣h)^< i\c4y1t=+kqɆ.M`ŌP(w..l >7uNsMb/3> 3 u!uQRA&0T>,K=n7Enɍ=_IIShfԻj.[uPq6J>`ee~^J<o!䋅D''G"C_m`>D(WlgռWw&g? +#e3NJll?}fKf&ByD35Z+D@j:9|2ZӇl3u'JyHȴ|Ғ?< <$n5*ͱfsBmt'նL3[rO=Z9y* ׾"rnDqSe__ݚO5a-wX~6N~s3=n#=q7`vg+04\d˙F}lv =KѦ/]Qw|F..o.T3kY|úR<@kDY>S2l@{؝JSXOU+zf'ZOŗ>|!T'x\5#lǠClc {#ɷSM,oViyʢ+HOu~:#ݸ}c:(aVn'Eyij.r$Jϴ&ߑ(k5iEPI8 8כbuÞk+PŞ=f VK"4ttRǼ5F2{ΘoƵLՎU-Vr_)39|ރY R \wƏACfyV25N_(d̈qݔo3T.kw'0QlܷStHSk@mBʿu"G]=K-?s)2&) y9n;TKzȌȸ`qoKlsD<:yb7SVJrcX$W#d\S|M.l$ު[ \cC\\j~v] R0䣃Nɞ@{OE^Q2X(>lɊLcjH~6Zdtd 8 aG+һLJf%7tZԼ  Y ۯ(y:;ǘI[Τ5Ū]G@׬D/҉0| K~PEpL*s:5 @588_};J(Nz{Q7~-O B`V8n ;!I蘿PvQscyQ~WEW++WE{xgX,XꀂZ+>wI9\⥉5j< X.S)~=[)fMXW Jo4W)Zat`/2}K:so3\g U(jk~t=94д\BhъȺy:'sT{&(,)w+J endstream endobj 168 0 obj << /Length1 1347 /Length2 5981 /Length3 0 /Length 6903 /Filter /FlateDecode >> stream xڍwuTT{?Hs萘AI f`JJJBR" H("ݍJyuwݟ1׀c]X ^"V 4!` @V(</HAa1J!xN' /H9% H8%@ꇂu,zPnxB0L(*ʋv4<8 x7'!# ,0nxGsUQx7!'$@O%AF/􀥁` 6 u;Dpy v`XO/(&q(405( E` P?( u!~t5(ſP^x WYzz"0xЯQ8pKD0pF^70(o__ o+Ȃ7IJamR zHB#A|~E(pA0G'?epL` zur$ Š =eI k3W_VMMl$ĥdD "! dEU`X@z w~@%K`/7`?S鿢dt}B!OXc,a!0 AX4mx(a!40RCd$2Q> I?P䗌 ?``XE84D"A #~`Pz@&F`$#4#=\B޿ @ `OXص(ʨ/5dh:ltX#|~voLҽ3 RE`{JUHyA>FRKv1pW:.}a+b޻٫zʂuGen۔B5IQ((H_$jn*|1<րgO!ꏌ)ٹ1bl~꣕96[Bqp~cTOYjJqg X62}+0v@f #n-DF3pf/H>4Х J^qذ~lW .e-ӵlD#9vJg.xKrf3DCVeQ eF'{F:/w>q09x`g?pi) M]Q3"ac/ D{+e*>N;U}7)ڠ%u&gE3U=d GJAW<ٌȧG =PP~Kx g S\pyȌuj&kYR6Owa_$#]НtM +ܜ<ُi Tg܉VءƸʵ< msUl͚b%x۫H7$8 S. m6bnN&yY7 )p`Xz=MLrBZvF[F֦&4q;Y~4|2ո9ƱDT=x;79R;+@]dW1|`jyu1' ǡ.8e%~dv7Y?-u!Zh$HZ;)Z"+9GG3'SU3+|홫W$juSm8vd-+EB;|qM#E ;N^-S9G`.2e9I6_{@Wv0~HګDFh9iLr4,Ld޻.sD XUk~EVr-pppPr硶 33"RFhkT"++iQjt':xLD@AN\,1erd+I#U$3УcMqlʼP?B-D:s01%=6m6<,?>r&P >e?nLN3%Կ ɦ^CUMW`Ltnߖqif(S[*KK{֚& %K+ӜسrrrP}n{1Qv|!eEQf(/HR>Mgߑ߽Mdmd(0 ҩpٛ6;xD^mcQcagf1?)oRR貂&o` >Hɫ٪)!vмY]o1Q?&˺ &UA]ɭ2WO:}SYwY[KT.?a ɻVmE]Q3XޘMEkfkwQSKœV!`g9NOɪ.qQ=2tN4V 7KF.4&)G CLr80Ͷ0+F5Lf]$W?.khwdv~Cq o2B"2t^.C6%͙pVo(H[mzx/6@RJ<e{b6Yh??Tr7>Y& fh.f#? >*>gQBL71VwWBk<,{|>jCxmf]7J+Z?]qzy}OC Ok|]QVyY|AWm >ʴ22)֭> ^ꚵ(wڈ3&-rd: T3A}\ O.R8MnP}WUWSqA.̜ÚI1J$?/k^=guJ:DZj?("$IZ L ZzRZpH~&N.$ZG{|q/O>p-bL%Kx[;E46QW#cVBnqL3eM| 82Nc7mJ^ff=ƱV!X-t1;Z{"!2Al6 cz=]%0Hk`έud-M%LZ&VA+`sCgy+k3OQ/_t{8'17V&o7yN_Ҏʠtax7Oյ%#ٕ\c& mIs"_<_u&߻M;~FMs~)IS_Z!z[vdrj.Nƒ=_Grnc* OnF(o.\py&HygyB⑴x=tKg4j0 kMvҵ_ӹۈ^iRajb[g}BM:N3cd_!RhLl_Qr2S_MQ #pѺoGf͊krV|RYya&ɭ'Cq:-Ki)鹚$0^| h?,a1x%U]֗WPgIR\+<*V)l8;6'^4+}DYE"ˍ1VUjgGSEHa>o J]]:s$ϩVMY:a]k1[ϓLIdMh~ J.Q9xu$"`ޡ;~MNG*#t̼![)T?qT|ƞآYyohTOj#~ vX4U)}y^ ̊r#=Vȥ}dn&|^=qcͤt'AL ԡ~lF_xt$B?䞰Cˌ[-q𝲗su ޱEKo(q:St4L;鉝'd7rk˖;Rfa~S+&5& Ja[Ko+x-Sh2Nv򑆍> g>c,sd-uACMIk&#QR oh-*#-a{SP ꡪHkLQx+@L݋qkG2rϢ}Fb e1I-rIrfh=rwI0FJ8|(ռSF+5ARx'!Z[Ϟ+[mݕ: V@ HB Fn"r,^U4!=lv; $oApgFSI.Mo7jGC;*?>?E:)ּe%7j[[r]ZبւLm']_D7F)ڷ E96 Wt,M/+չTb̓H>KX 領U(#*pu|s*8atb.)W۞-Hw\K܌sխUzjyi'nt7;cm3{m Q@8za'P>`!, :;K~F>s" b t_5 NŸ^QQػfhM39,fGXt?Ovr\Lc/w.8A&]sSz{S,Ի.8Wӡ-o2,~u/~+To>PPBIcY kskaoI4_RL9,i/! amXfwa:c˒O^^*1{qB-.r,VIMFꛗ޼L5y@%II vaI*. =Anf3ٯx̉1n*j~-z;mUx$L%Gk/ٸO>Ūш 6':?w 7>^sMĪ;]wW C۵?``bATx%큾7,lW?$S.*SNڎ>,}|4rĤmƠ@v$1i P =k|.n7(t5%1ձsL{)O+ 6u'1>=XI&5U]V/USe&0eJa +_cCaTUR%,iI |{Lj/"m;FnwU`a[-SػѵW39IK0:>2wdjWʮ odE[n'%~ଽ~ƹT/X/(uDT1 KQC$>d{yŧս} Bif4 崝UװIod$w+zߐU_f_3IRTֱuUw9nz4:'mKfbŚskVǵQODNc/}| EiWF/F2%]u'IW_ܜ#J O$QNj#ReWY*7hs:n+?x5_u?DXvEӀp'F]bNGW}uA[umZŶ)8 e}[eAV~.&$%I}pʚEP ɾqE示>h DX9/AUBݼA_iY?nfuB1G>|adӔ):!ٔvo96z D-p2ҍ#bT|7}a{EjlC([tbrǚo@4=FqjUx rn%$EUr-q#6IJ6.o_ {y9(sA Pp:ZC(JM?] endstream endobj 170 0 obj << /Length1 1396 /Length2 5956 /Length3 0 /Length 6916 /Filter /FlateDecode >> stream xڍwPk- "*]iDZBA {oJ/"M:i J(#RXw;sd&ykY }y5A `)*T sEaR >E8ĠjN@".#`ɿ7)"eaH,G톲EI;ҁH7jqHg|G A8\<==XA,Xseg5A;$(#" "]H/._AO7~_ e|p$߁[hBH;Oui߿ ϓ9a6?_W,dz@W B/D ( ,B% ;с'WmB3{!.S f`10V2';9q3O]w^ 5B.d1U/yQA Cy!mtP8oԛ `Q?040bx!o,Cp,^q_F5AO nnpoW Bh įŸ~3Bp'{O7_nn޿(KHA q i;gXz',JٳOjENJn=cQh7K/~QRmmheN6V"h;&>}QxͦgWn5| zuYBB(]> Z#?:R+n3 =瞩r~Bԧ uJu.VCQ/]Jd U+j,|VMkmٷn5{3aE|fARei5ߐ20zH],hS+,=>GD'zShRyqiB9uq1PGB?˝E[TìnF>΁Γ/f3iw/uCE?H> \S!kzWO]-ݓĤj2[EcJ%tUFoiI)~5Υ\%&ffYk AnWP!ŏ GP^d2S T7~eO:BH![>pDV:?~E d_Zv.⋪ 7D<Ļ#jwގ8 "J g?R+%exh1E-꼴,֌ۀެ}rg kD9=zyӃ4;g}::by.uMNp6b|Ry1Ue~ֹTvᛓdӀf BB!It%'OKq~}ˣ ˏCU7Ab1{]tʇme*7;)v=I|Ҭ= *W ʼn|/[:rȩPɺA"+%tzL6CGBò+ U͋x׼ $U  E, n'D/oOlq OdS*a!YmauVD[/Gm\;P'_d5+լ>|D7mc=4ԵieTuGp'GЗʳ$E z*.|445]}"^,Y8 IPNuN$1 ٔx-w9W RW5O 665>l!{QiƗj)V+3p/@t1?(놵ku,M4Wm 9t UY4dPCwʡg~tkYN"JE);4TUp X-$njAf`2)ԙJⷿr#N+5ܒQt["nXV6{rFQ:3 Eۢ1䠒Tr"Z%Ͱ}._ok( 1guF,!C|"b}Z/ I/^([>ߠrV,}xzdmvw5Ax>=0)U?_$˟E2yv]żQk/y֚ȿͼb:L}k8hnPIHwx{ enB6"7S8 x+(xh@RӋqOp7{U}q6@ n؟F*["l}EZϼv< >2f /ȫt.}f]{p:;n 5+D+_uspakǺO0\V(yaknJ BB=Cvxwi+seu1>[\p_q|xu;}}+=Iz skC=gXP*@UKKvݕtL%}+igLl<"Fp3鱠5r;*%owK{{g"as+1 UI{\?#-ԾO y\ؚqG[-}}L~rFL :m؋珣i`EK'FWw0Ǵ|d{ 6_l}cB2{)c4ƚm.8)AJSA>c,e0=ݗⶣCc<9^ֆT#O|@ѼK/{V9؉9f=Qo$\l=~rz~p=,Q?{qWmb!469V OUJC~PiVgbŔ˽ jӫ,wErs9Ek,K>jd_<{*;CqYL]N%G`}Y*LsZ H=}/h0p}R U󨄱LcJ$S΁08Yp2tYe@!;`_E.iD~GR:Z Fjez}SOc{f x]qmK5<$Çq1;R(C-U1r_ςuMe,;> ?V En+0_7Z&en|G`n̊6(Xms~pbhBb%sG9vZOEE =h7GWnL5~koixwH\e;rAKaLI\Ʌx.u6I^ oNΕozQ0jr̄נt")g)Xe%Y/Lu9gszKzۖhc[ȁ)6_szwkLeXyְƔk'L&|LH CWŌե>b3Bٯn-",t蔏YՅ,-6500 [30n+HsNpv6qP5vlǢzjf_WtyQ S{FGL!' i":90Lruhl׎d'|n>p'6 [ mfٱ)H J`FtrG >)%s: $ BY|C΁f#DԞ{jb4쒠oM  9tf)z+H*XKgmaO{h(0s9=lN7.iKP:*YPoIxwspbgCNHz 65a1*!;gmF \g| a13?Vk"R˹HfxeΘ0 iSKhW}bҷ5,Rzҭ꤈`\djٷʍXdH|#_J* ^m xrl̽m7`G ~tpduԪQoTĭ$yi(")7*.N͘!rWf;JαQ1#{K6 Q%*+1q*tBd;E+]:j 2s7%":bqI ;ńS(d~NMN>[Dj=%'!Z A>W+J41Bd3=i뼭avX}c! όɆOʛ+ڏ{Ol[ m[7cxU\y#@z:Qkq{L:[~TPI/,ҾMwۭun]y+'{$;a%AB9Wṇ%TS )L+%H@)S˚J &YدW57+ali(c,萎I}Zy-i-Z&h|!1  hc]Fa_|vw{2cB \JH?LEyt-V,}0})(< ӎ~"5 ھfoz"uMuK^Uu,o缊CQG+ aGRes]|J"?5zy_'dプ%UF؅pϵ)d{^qՉLZ?vor&\unaku 7ott%T0_, v%WPdZkCCp*c%ՌucUN,GYMp%ҷ)bOvlӣ2Vi@V;YQXݐ U%&Oˍ4 |w+y\hb\Q.vžH\}:TEpCuW\_~(P endstream endobj 172 0 obj << /Length1 2592 /Length2 22364 /Length3 0 /Length 23844 /Filter /FlateDecode >> stream xڌP. ݽnݍtH%ݥ gmϜ3ȺzR(1;%Xyb ,ff6FffVx uk7;@WkG޿ \&n N n`app23Xyх namP`::])]-@i#ڌE/w=`fe439Yݼ+5/'+ = tx (ne\ ̀ ws &#Pr:c,=߽0'ܿv%Pgtr864suxXۙ  )0\\\]~; b@7Wĭ]f{33Y[GO ksE;1i8X;emY\weW[PǿAX,>3U߆[MH_j?j{k; t 3pߦZVhnn2n&CqO]%nfVl?rWfgTvt@_:iقWJK]p0s4}boxАAEs׿rX8('I `Lb7I0Iq1$  `L2;Iq@\ ?EqQqQ@U Pv?]?dnt3@t4  "gșqtfvi5`2YAͭ.@WЛd vl7Pu1q3>#T2 ?7o_A&Z %z] ( ++o'+_ _7xN$mec_Vx&3E߳Qa tH!ߋf-DYBgwn$bA)CzN998X"ӼERh7BXZK/ۻy7b$:x82_EuV^\r\]B[YJ_ѓtYeߊ2D ֜zkOY T)*0\H0뻌b> O>[nviYd5uN|5;o3܇gt>k XzJXEof@UM`Яyq?C}c+ef Q3޿R겝'A[闌R\+6 p*F`BHN-x7|2v庱h`oG]%*$g1 '-A!a*eIļx8gJv.Abߖ.?ٓJFlUaHߪxnC0Vm[ kc5\xܣu26͟xjd>;`s$_g}j|YvI$Աѯ["krgd0=lSgҀJ-2:|=<'v:W-[j^pmqHp3GϜis^RE*#ѸK$˳`؟Qo>АZiÚ/Ra6&TEWf(" eJ:#$\:(&;&VF9 ,Hsf`tqIz?:rIrғT#5Z$_[ T¬q@+ sl7Ǖܭ1˭o-- 9BcB\XFPziY ܦ֐8:]Yjvm!Zz 0#v2c&R}T(aHI]s)p&eHSӑcܐ>FG-5.k)+*ODN-G>'且w@> !*CQs+eȊ%7x,\RdRθGxʇ9bf)0b 9+.f65;i>^<Ƞtb87^Wަ{mU{'iF=VST:3[eE D&i QA5~.Ξ&DI &AFGT@j"vm?X7~쯒>] ]kw.et F]Ebp |OkmYC#5 (wC# Oʺ[`t"thcyt2&UXk/+b$D xog9xr-6mw4Ǣ!P*ޏ<-R baߊvz)0UR${fQC>W%βu+,ƹDS!i=*ߎ C[5$ deDA8"_`պ@o >S1}+9$UX>>5@+fػ*V\XJZ?$mՆ:ϸCEQqHizbWB=,jҙKY3п )Ip yEdXAp])d7^ AυVSy?~ӡZX7oUIaa;! BV :]L6|m"dmVscuR"!H4 ΣbL."o?\0t!h*]o/s0L}`IĈc|`>趞]1c; :Y*g3O-P;}DkGC}86Jg15]Bk(S7Q~* urĀ6I 7b=|z* <ס$AϰwYvKjRunơS$%%r#Ւ SMPn{2Eu=Xǀ2޻ƺ7cMVE!ݗS&ep_1Qyh%'po>^0SR8^uyּǖ+8>5\nlcxU7HP3KMub8IUGOtwX9prcIpLe;'-:ϕ ( ީN"U˦+Qo!%2;)rqkhWLkwt;4 T@chfI뤝}{$Y]9/81+o?## :!cr DBS a8 Psy6((HU.@@Vbań s&onR?& " KDb`{m1 ,Mfԭ Qדe7\i,f$}rFڄeդ)ߠ@=у$ 5?U ]Ԋx{w7#)J6Vx]egN9qdT2BufX[K]g%!pafrDEdEsoVJvk+'[7^qY7f{AXgI%cWaasroj1D}ɉ!BЊթ-q^ۏ}.Wift}$/yOgH iy ?+ SJj~~uq?d9#Oq F8oU4Λ"PQ}MNtGC6a-zYZx#1b:Ŷ]4Ń*pĞjRm_kb+XSz)w#Uݘb^w&.wأ>:Dw;"'|7Px4^1됒㨆.9"FOE}/:3!_sd}%oo3p<&$хV+L֡Ck|&-/RnuL8Z`19,h/ 9cAqsEqz/cUB_ h1^Tw+M-ֻ?o;ŭku^[~49Oto,@~lyDn]Hՠ?B:{8g*۰oYؘq~,9yKf:K!1]gE7_pU~&VGÏlydo-J*sg!ަ_~ѡ~Ԗ8+OGeK;3@J+ƅԻCTKpuaHH9*r"(KG,mb!9Gj:N|TciRKtX5R;LcwVC5D5>nh9' +‚64ZV ݑocosMqENmdr1QaQ w%ɩ|PѤrwdSImHOx/ )x|Yp~U o*C/3Ty*l|^dljU6nI0LEJo?r ]4q :i. Z !8?H+RVP[WFRT铹^!R=^>V|CQd_Cen!)fθҤP j(!RW]sF A!N ӿpw=ߺva-`C2*%)Ozq';iݘGZf}RL 65ca4eO4u_1xwm:70#`Gr]: IkTf"U=t|\‚KУx-E..XpVRes7j p}a9vyƬ띭{ŝ觗#jNJL̅|Q m% ^[2wص!WO:4dy{дRkz ]pBfHR;S_N'b.#o`jw<+ǎG;$ǀUv3Y'R%E25437!q2#Շ]Ots5(9&l=*W@f𓕂_h/phYÇ_N`O߉ay\R&5||s\ (cEUԝTUʣK_8͇wkI3ND 갏6(6&ºڵыmEL$⫈F 3$1{oWڤT''(Z ^_ߚ]8k\:Y"Fout>AI.[A"S@ 6a)}z\'VO"Z7X**f;{EiwjM2D=NNY2͛Em!M=C"h궮uyz Q%>"^,%`@Mpyِ {ة)A <ҏx]fc(c})4 SMd  ;*8 /.E&R~1OM|OÍ H$^y'rw##]'z`oܷHs*oeN h6_rg &}&T1 t1WC 5O*+|/L^=0~$ݚ-J!HW˜ܞ upgnuۆQ&ܛ|k5QKn XdSRg݉˕ ,b]>*xor/PI~U ݎ2o3,zRDdWRaWt{f}bZh q`Cʚe=Vd,D'TyD 5bHLjgblP] V7+b=QMu2*)˂)rGhZ!PfVjUb/[UgGYox?ZTLwWW0|!g5ʋLʵe+G=HCjwۏhc囑+H@Uc(:c'~6e|Q2,& ;>IO&r}L'4$i݊W `%;3PΪ~@DRSHmJߎP=E5,RM1VB_ZhFa`,ro\> -Nޱp("HaҰ2]|yD0q1915\D<@֌@ ^F>m|dp$ŝU'9WkrXy!-]ubM"UfT!i\gqHͺ<v' K=?&Rjl'2%4M21@@ %paH=h]ND vzPR, }g*B9wsW[ ~<4Wsi6D2+8\)@GBDek'2)oO]f8>x/|7H 5T "wBTC˿ńđ4üNXfq.Z)])~4p\m:`f0ܒ(˨.'9b$sM g ڼNJO7b")m]pO0dD= LfZOβ'S2RC1EmZmPv?h6SVrvGxYʍҴ[2MOW$CiS];kN\#d"SelqFj5JxE,sm{h/PfJ AR*E.5`PUM/oMy ]){=L 6K3O~x,DCNEWEY,RH!\/ly ۋn#Z4ӈEo9QHnFQ&w׌ZV(/<2 ];w`:[M﷍pCϚ~1 2)H_ÉL;9~(Ԏ<ӟ?xKZ1dL w!HlQ,dc[UOA$iS>#y{$q~ˇ+ ߄+jlۮOyP8WTq~uw9p&\GuOe4^ 9֙Č Nu %'3}~C/sZ߭ &Jd6 0 \σI;:7=CH<Չ0eTF0uH(ۉ8w;pEpJ3 eЅ^~}OGzP$U~P2Rq1ȧrWPx+ތGՍe ~]#MDDt"C[\{9l8u^}Wt7_dM"z*1U븮5Q\'K$D.WaxMKp j-Quvt;7tNU_ÅpLYA* \aQP];JW`ES GDe7K0bِAzY^Q0"8Â/W6yl i*o1$p)> `C t{~vpI?z X/,*꒞Pf xWc97 4!oz 2i-)!gx6Qq/<8/V:JO}mѨO7^]ؑce#eN?q$)oq.vO9 .-ԯ+i1 6»wVdlVԢXu;4*3?-lsU|R\6 4*:AIP+%!#QԚ^^$l JRQz(`d 98Z-i#yVw-0WۿԚ ^zREn%ۿj597T$ )Vt(UkJ2_z["T %Ⰸ (~F<,R)|I/F^jHܶ [ң^N62⻒2+?;K>ŒOg ~ өv)d=p]&??#/&="xVؠ0D6k0?vaUhS\9O Mr/*zHFFuŅ%Z΍_V!|$ʢOS f-z$(I)1%ȯk1d(t=ĹSd9bL\7,Q so͑&4廲JE -UUڪU-aajEsXK6!C5*e 4hIjIYaaEQds*2na Ģd;)->go5_>q%nT8ycHP7:۪{ 8ynxy> 9-3((TB"/[6 ]( DgK*6.oEJ@#"(ɂ sw]9;0}/ByciWW0V*)ɢ94 t]X>CAA/Sh7'm+pc:4WMCµy2_5BBwx=aq^eA?Nz|h ~ ~LY[mŭ>}'LlŃVLS\.czPS{[N:ti h0;W~^L6{21ڞ~>@fSR(Tq+\`7+Й(k^16$CNߩE'Vv%yhNU'~'}ew%ko~WsB+—?=oAKc_S)v4&6@/m#$g#GL*8Jtx[Sgb;|ʠ5O!oL%#=AbɈhHѬx ,>6F+q04W*eϼ1TEY駾"'A/:tqu&S]썑cN?x :h0p1=#obe)rכ >F5mjT8&#K]x4Mk` :'%ļEEq|*fݳ љTzÓ1[ % E|E)jI67wy7P6 %0Kb~_}|:q{Mr$ T7yXȏ@^/9|ӸS4/Fkf)'*$xmI表GQpTc-|\8o+c90Ѐ.>S>W t.2KwURYR *j6Lj ӏwyYF_ZtQ#6aUb!T2&jFw^ov귊DP:$M7{~PΦ֡gf%iXEO3 6Q_K}+vs}?⁣])lo5=֎7&&/LZҡUk*D*5t1KS鷲+8e0 Eq<֨1wԚ$wi?O`,[j8LA?s$ ܡ"Pd2vm8``$5Ф`tjc7cIq"d~z@`SycHɖ"]!9"Xq-{+J6JSӕ1 AE>8X )BQuYqݎC i)]L,Tj9e7gvMZvwC*d&V7ٮBeZ)E}LܡÓ\Z#aK!a̾&8[\L(%#|UA..k0.ϐ6gyw ]@S7Nf%Ȃ xh%ݕLZ3 -=ky:WA; B鵆QǺ5uJK(Inf&b]\? Vo1̦ަW7"RBig(_mX f׷ f2p~$7 %R+g_ΜrA3'~ CUC;ڪX>~v`XBJ-]BxA}B"׵!I6vp.K) zU~i0y8Qkdp8Sng]z*AxdFQ,?-k[Y>T=9*fyᝥ$@/*:b(5 a{w=.BCBZwXDVpءi5&NXbld*,og7hXNP$Om "iq۴og=)ГȉТq&Uu׋%iPXKN}{.kpנaSbs#Χߴ8eF4`G)]Z`GX5xuRWAIf܉8Uv5@#TwPK<0@C]7TYoJg_'n.{v]aR4|6f>R ̹2r "NͪEJBcRHqwgKv_7ÇL{H~hv&p"ĖRl)GPěVde=&U] %Wo rv B# 'uSe3C fAm8!@P8 IwSFJ{l̈>p-e](UZ6 e׻xP= 1\0nGYJ RnsT3F{֙N@YKJh+S__ . B6_ fF3^ &[#X{Q%^sJCi9~y hX<2]p9s"~֡A_x/|Co@M5ݿ曯aYu/]\}7Zzo4ߎ'B;|AC}XHx_$fm8twV%6vj=3 AՅA@*Kz> l2EDQixЧlnmIS+Umɕ Yۥ@ ͸lc$ 䄳. }u*)rm4{*Ȟ"EZC@- Ev\X}!UpؑM&۾M{nL_K,&%,0'GuU5ԏ %ݡ '+hQs{V~S,/};vZdȾ?<gkD>ۼ(X]B Ƚ6F7X̰PYaW[a 4Z] V4m62?8wEFI?*w.l\tEʐn5y0HY_˧gj&2}ڡqjEC X1n*ci^.O?jtIKXeyXTZ'hpR&Oe'ME #6 ui9*l'yo+]'אw:{gf- {#&R,w 5~^i#_BF'F:eh{i/d'1p711@`{Uf@R1pZ@.91G _0TX]<\<+ěm$+]6}&BoHfE+"`Q״o~BYO;VDKX\qx G?veLkP@ -Ufٶm#at;-Ϸc,GA Yw5K;Rbě^PZZJl=]!OeSb 1 څx=,87׺,Ƒth%3nGxd޾;?x~!}Hklj3.Up.N_kYN f-Q[) AZ Oe$|Ȫc9Xsi F.-uuk oJizD0yE%Och ZmKyoІ-Ubp].#]Icrܖ'{4̠䓼wD\'GPYFU$OyI(.vR-_腳;]Sy4)xTDP)9SRһߏDzXz JFBnI^,RW* W uj>1[xNV,"qDo`cFDI ʾ4`aO4TA&妤(5"f7R7靷| }<~GQ$ppx5M>~3ׄghw]aina%E?w/ \C4֓=f̆/n uRh²$zgo%||&Bܑ0%-F7ֆRFh) Jxnq.Kaazp?&eݨ;;,ܑWQҐ/ƁYCdԔ}2&I#܇Ty,2_*>4٧U8{ndyˋg5Y.[3m VfUi;z~> #_]8`.20gʾRgjGthFNK}18 /9H˨P"^Æ]/&PoCnqYWniThò A EnD5SB[wxS2%i"mx ;bV'9/Ȩn>X_Qz챮лNDʚZsQK3X1_;)ɈGzk=~G{NwyB&`eXK8ŲYaKPio$k)2cJ4F-X]v2l_4_i=Whʪ\Gc0<5fNDFdB8ZHK/zk0Ģ$fNX8jxww 2S t !C9K|>ne~9G'CWV0ߨȂS7{ ^* ëD`rT"r+J6P+XU- 8crIm /+d> !0mٷ/PE3XscFϟ L Ą[V),S= ɟ In޻sѣPk3J?b\VwB2Y6ѓB^ߍ46}lyȌg^N 7ׯ|s9Lzlkݑ]:h9IbUMv eyOx:98%vcVr7griW̺ k,Dw >2WMu1<͆UC 3q`YqN"rF-Iwk)'OyI hSw XG҄S]^A͌e_tBG$WɝEh]NlSZix\Z>@ܫ#0\zNInxd 2v*|1}hX^nV أ3 `Έ?oExk(70PBBdczvw}5ܜvL#ؙy e=R&)L8Hm?q$nUg`/F_3Y6B;lc^bIg2`%b+;-{ǝ7 q]q.}B9xk7wt0qj[2P̸͘45ǥ #uD02%SL 5S׷mz?_>AP!%$G}uۄ&L\J=ᕀF7VM>t)BA+֧"1[L0|uثژń7Q ֻILq^BK'05I6UٲZ.oTieUe $ᶷ;șOo<{X} Lx[#(MWfofE':ca)bĄPKr+TRZ JwAklp%Yd F!)կ ZdHF"`ɡAbDF!&ub>jFL /nӘ&Ŷ?:{\ <{"\>yIf(ܦR=e]cqee H!*F"tuA|WzC8N*OSebRÎZNjxj3d %|HeI)GRv!fSm3TE:_Jf{)CWuhoö"54,4K?bGYOzaE4d8pK蝉CZ|Jt',1]\bi9ڱ^ƂR#=Ĉz&lLӧmy͸47wD)]Lv jJ*+<^QU.'s@Or39u\[t~ ^C:J|U\!tٝ'Pik\ U 2c0s-S+-.~˽g]'yyYWHW շCV u5"M=T ZyP/84H'0N\k`rW/qhЮACnSdhcF/xN>݋ A#hU>ñ0 \;Vj ` QPmW-M Lv3)!)P]o@i1c^1,^WdtTL=cz)aJ&IL8p&ˬԲ;[Yžh`Ⱦ;4S)_ NU)!Z}ルͿG7[`+Կitjq{q鮟TȥlcXTxpMYYޤ!#^YO+pRvad/9)y0҄߆6Z`1@̃Y( w'.hU4?4Q-bPUneX*nh/N!Y!|n_YC\t)7Ck!!C#ԡ̻?Z}] b,~O#\8ueA&Θ! 7P0]/s0*s'OWCV=y<ܖ=}pQټhɯgllhѪu}ak:/D BS@j(l^C">@]5#w(+Z L33+;|ۃYtZ~o؆f*&i2RϺ t0HMH蘢i.İUzHJC{7"a3cMG8t; ;o5`L#J8>[~gj!rD|ܚBNrK6ncS"7UÊ^ _mn;M(k1T.Ԙ8=f1 )3OI¼^GL,@e'&5 kUɰc [垒F:R-mQjz`U2nQc V*IX?E{(+|щ:TL_=wCjx;sꜸZ-w},7hc|{ha(B?eBTb|hz6z˙ty6ĤN\<й`]L:M{^@A2<;OwSd7pǘ ^%ճ;ft yҗ8)с/颔H|$瞜&-g,0r_6*0,֠HqK$!<39XOO{  MRJ63΍m'^dŪ+qH8"ĎI GN CUyQ>@_#EDwGR4$/ D~ynǷ c%Cu`C~a=HڮTVz\y ڕ=\Ui雴ˎP";_,M!8]FPߢ6!?AeJ3HfѸ=V<"ȁyUkW@3c瞏]\H*8_P_5hne&Ba2$Tňx#Ff&C~Fw2!va\I[ npM*ڸ 3d <[qzBU:굏/b /zJ2c/[WsLtM$)M sYg+nK0(˺vb!^=ֶKø U5 8Ͽ\/}.$bSD.{~GhVW $eyt;˛he~脖ìz \H39I_vՖEzqt]f_>+nU[_ /.aW{Qs%8:x+KM \yk7 Zm3-21\LI(<3N u IP;>C ~,b3LRd'auvB j'Y}*;$ jUN{~GϝbxX;?xѾջbpǦ}ǚ-0Nacj]QO!7ioMWE v*Sld(f m= UQV^PyeZug-i6pqauђP&?(%Zm^A,I]b>3OCЙۢF^ piyܠh+DbF]dWj;EtVc*P|j}O*fy$QcL/Y ٩uEto ]!H[μ!_y8Pl%nw?KvrԌFzx J:3fsO$V #{ CG{AKtYAqrm?C¢ ⽵XX&5s˯% 0<[ +.%sYn' k֔+|2-sװ^%(s\]I޸(UٔRs PJDʻ.,z҉ _!ZX7r3:ܨK2E:8&ĆӋMEBsn8xKT*5^ {7D7 `$ F0ىb LG=Zy9` VOG?o:dg]=%|t'}_N Ç6ˋEHe¹%So$v獶,Y9ŮlmuOrt"!]zp팾!Mܕ} HCT7M"1hpoF᷌vVŷ}u\UQjWbhR9b\axd ]%4]R#iԷCێ&?t?0 d'*36޳3M:>LEgEvPÀ$eA[vKI/];9|U(ր9r Y8s^D- u\Z%\.aL40K2HܜNjs%Jӛ-jUGr/ۧcl9wmJX'Ӳ|gXw-ڨ-\+%>C]%iʛّIU]"qdjZ* Jtva/ }e? \uAYli//w  î5[+-9%ѷ_эY^cvmY PӽMUu_&yq/ 2WnݾfXes[W5!޶GL@g։hhSWj+02#> ,YޙLEGp叞n2ADd-@pgXa8:" 7-m 1"@= endstream endobj 174 0 obj << /Length1 1448 /Length2 6652 /Length3 0 /Length 7630 /Filter /FlateDecode >> stream xڍtTk/H#] CH# " 3 !-"- ߨ;kݻf<ٿ5` yȨjxyyyptpˤ rvàbK/ 2#1Ys8L(B@~PH (, ,5w[T0(I #o`dEE9@`Ks(@n r@hih, B>xxݹ\a6O8`-@ rvY~ P3w. c vkì -AP+ @ VR;Upzpy v698C=P5˫p=s/Cs of[ ~'n#:Kg#܅ U!ϯ0GZ@P d K{n=sC` vr)epl@p //(r<,my~tV#akd v1wή V[V`K8d ;=H~9#eB<1\U5 G/yyQ4e,N5lR! Cp#^A^KM.7v # ֲRZs0/=p$Ua KПqUY][7G΀4Gȃ=@V`_0 Ҁ-tȩG. $@ȡrPKկ;;{"[@Z<~3 .dy5W?_oQ@RȼGnB@P_ BDdMɀ f'9 :=$SEG{EZ,szLe@IvJ24lYe硤iU dkSMy 3Ө+%RxrbC!}@e.q;up ixV!ďIIu 8Ggr>JRcW_|Kɷל!8bC<W w*?#/X\,sg}1}4),*ʥ OOUw1z{Kɪơ.SŴV!&fqylLHĎx>|򆣦Cs"YKև@y6]%n,>ZQlΉV_s}4e u>~0& XIFƔᇱv/~q19-r--k9o:Aeiw_t JK =XjTKr&W%įA>7oԓx&-+B>_<_3il i~¦Z2zdX8r@{lF@T;jhF X h9&:Bm)?IGw}CbrA~iA406gK@o¨+X;(hG ^v;H/~͂M[nZ.(cQ7oGK s{Ƕ 8 j6ڨak)6&I)Uҡ܃gje mzѲ`=>_bN壶ނ,׳h>CxZg1i *أO|a ߅B=^t:4E[=vk*! mh"j!|߲V?m\n!&D-4`Ws[l&n]®Ly4*E*BCˆlA1"XVecNl郴d+53d Ϝ7E<\/c.!g_Wsio'q^5D~7N(6p) ٦ǜRO0g#/H;:?qL(2"tz9Z@;1!Zn?"L=HZvL=~k 3^&y啳ivK+ӡiM<&4 ĩ``wL\ ki!K u?i q\9ڈzJzBTQbˍHPIwZ2U9騣`I^aNtǟF%J2=TC'|]6o㣒qHM~xB@PzLmES18$Gi)_׬u=^B~AXzga g2rvm٨ZѲiBEhwzbuYo $-6P e>#Ry\94v_D߷^[d␈ӹZmiz9u3p2LK[O;\<^g? lލ_}~=dqv VX rCB2bAΕ;mcrO}y!=hp $䇶Zi N% TߊB}[$'gFM@4N!` ăt K%м.nɗlb#E)4Wä;ȾF<-P윓ߖpF}zEKjC;ER"_m.jP<#IE+nz3+H:Ǖ~=~7sٚ5])J_*GC?D6CSniAWe̦I˓ڬ]j+x,ULRtdWi/J+Mg]|K]仦l/OQ7[?v;uDW( },s.W $4qHX1t4e+h{}"+RRwrP-QL'~ 2y&C\u3Q2!y̤X ʾS\E˂N]܇X7Ud﵄]lXנCC+vքv8|5ģ'F笛jq!bNM)U`]GAÑA8((G3JRfEz%"g{=C7"aoh㱠i_4tuBrOwL"MWZH1۽8o>vD26p qƍY. ?XK^}8#}ܰuGBѧ~g9w4| 󖞧ɱ?u(~?gђsʖ3 u-ǣeADϫv-Hƨcm 1ՙٝ.gLWUΩ6*̾`k$ 0s?s{.(;\"qV(06!3`H^%UIoU\Pg`2F %p[Q>!NŇGAI}bzٓ0t|+{\ZՔJoC8 VM͖³,-͎Bm'GP.z«6cfDb?wMrE,x^QIG_tG_& b߱>$qKw<|$m?CI*:Ը+ݩ΄/.jO ? X\wOJ1 S;QQJru^)j2O;I$Vt6S+vGy7;\uc!Gxogϔ4UG{>RΟC7FBsfWd-Veլ*7x{OkD+&oOWH*_iWg0G0]ҍ8itF Rc[|+":hGX<݂ҦO$ }XZaQ1U>&u|\fM _81BK<IͿ)[Dzm~m7Y@R"v|s;C4@u}$I!l z+BI J4:h{=<"1.yR Kq =02& +\H0vpP \ |VO=Y8W/wp+)Hј c Eta&:iRwrCf..sDQ[V!'O2CFhASDבɁØ[")ԃ6>\`++,e׍؇)qK>;+)6оG `}Fp;R/Hd\]:ȷ3x;_=-f~F4a/=3R_<<'I&9u^|⛽W8@MX0/ŕnDmU֢W1zFtB̪b~{̜44  +s9-t=6uzYoJǠ1sF*~;Uўd q@8ck}< CKH žM)f"{Jd]%ۼ^雟` % βj3Z͆oOۋ*>R3#awts-:(.5o̖dYd,{wW:mU:竩bTg7b7(@7F|L8^ D&Ț`G8:KnEW'E9IUpՅ0G1>Vf75L[\P]*R2s 瘿UAo8˫5YR Xr@K V'5mNs/tvbtU(l$DZ| B%H)'S`Do _S+/ӓ+&Hk㖳0RN0LDMȡe;?򯭌Vots]DQF03vq-(YLpNOuF䟠'3^.84j> stream xڍP Np 2@ݝ 0`  8!B hppr{kfާi[ݽZ*5Mqs{S=.TT`ssj huN {N@ȋLBT\l\^A>Avv';N)W9@`:J;;, /q7cp1i:Le%-@  za+A͍ΙRX4@'W9*&vKcEhYRh[@L- v~1q/JU /_f߇`pilbffo`v- [ @UF0LMl_M\M@&/?S7ȈL^*>g3'ędGly9fi qF#?)n d[Q6"BGf x@GjfG-wJ?/5x{:;,^z,/?h&@o"49 0Zhx-/wA_ƏO/fnugŕ.J {(3!xrNfXi_yI'31mAΣb4BۓrzuSѡwJutFV=UENmXe9f; 9kmwkaFx/!^1"J:݀2qq"PR8<)\m{A5U-9+XE?L]|I4-Q.ǫ #?F.tf-ų-v$ӲUoJ:wS4Ԉ[l#KM}M8`9 rk;Ogx ?9O2SF+IIDB՘( z|/kId"m!u%SG67pqM,cD#,8ɼֳҽpF&Xj0"ݘ5nJhT' ݎb'`qB[dhQ䞞qO ͗]uQϫ!-kA*4)[6\$mg;t|7wFK)ŗ+F|$mDܮkM+̈I3?3aVD$ZC$n Kd EF 3aQdaʓus#{f`;|p%yԢbB ~ƞvd8S2NA )iN+}|.q Y&X >0HfܐAl(7D]nmkc74AX2ew堂P%.O)?cѳrK(re2N/LlRY n(v0K>I*F/Z;#iݚ ҝ[ <ųjz6Qҿ!J$?6>`<|8M_Xli)o2oHI͟!Ua E7b97v?Bgף2*q>qk7*ȏn$\VAErƫp2Q d@Ԭ|ٱ7=tpN)Hp!7v=F;~yaw%b-$"`m'*ˀxZhm?,CmĪRu*FCNm[jηi7,2= KEpob=qD!GP^0v/?MOtC,? Z$ U]KmMe"I4w$<'e:Ax̞,Q?(A,hXĊWo^nQs9Gݾ/B^hZbQW 0}rTO?LEidJzH8nV8ּAGčeTTROSYhJadW[+JvnI(mq.Tmu]jԌ+bS{tpU3?RG6eh Lv3K.aSn3E~S {`y@ʇ ]'P<7 J))]U]2d+t Ä=@8}Ln5JmBkV"IO'uYfԹffFrYYcIzv9p2#{Y'uN%蝗@B0u4N,¾^20x@lzb Uh}[SқI%ff2o|R3TxjݞԈO}' DTG (VeuΤpmz/$_M t--q=hNv;nBs~1^lw/+DF ӿ*S:7LH W8_~s/:$XVmw"oӛ;jSMb?t޶)Lnrĕ,2q~,N;:3)<(M6&_8#RpPpt'vlG>4@eHOl,-1h-8&Q}>`cV#ݱ5QY";F1ؑFD.~ȿ|5ps *N0G{&yd>knZFy~ag*t|+<ڌG#( ({|֡naw{.>UqnĠv/#M*^Y{CmྉU>BAЖ H2!g LVx[PuyQq_oAاA;*2Κ/RY"ެS*V̷4ldN57zjeJN(Qy``kڝ ʢ,Oo &{3WaaxR֚U=O[}J P P)pDWEL-Wя0q<ꉕ^^Kı. qm)s&zH~].ﮃbtb5Tb4Ba-ۘf㦪#s8U{ȝ ,$co8*kȿ)h̿[E.Mdt4]zzoQрs^V KvH,EMٙA >J3F /Qg^1W_tDxGy/)wW`wg6KKX)+c gb?{Z$\̦A/IK)O}h2mI+~{?(8>!K鑴q"j12;bn6}"& ٍӽUddl4W njz8O|un;.Uh~n5.Er#!ׁ3.ldaRp@9QSp.sojš&w|,\Nz{J뽳R>M q96!zzԗItD%?|0SawY=bK֦56S0n h͐ǘӀ!_é=v842Ń̃ҕX rb~%OC$2}*rr تo)n( .!+9A}v:\ZLp[/}");Bd0%Xb\_$R^uhsJ;K0ϫty#ذ' "B(Jei8+FKa|t-C&(Ȱ>'R~h&]chg6@wIF CD4R:ɻ'b:677X# T 3b%'VR0oupӇ? !Sº x4ɣo g/} c:Ƈ&Ѡ+X~1 R۾"?iu)X(4erPfOo7uykNmE{7ȑRGϳdjlZؐʯ?pr|VO_= Ml7ɊAXe%'M߇XEtR&3gh@lXS9=mv(A Hw vi{zcXH i>!էZf9gM(^>طWHL<5%Ɩ" k-]ȱI相\tP}aR.^$=nd=V!ΗWۦM4J!١9cҘj1Hʡo7c+:n,d_ax}h ԎvN2W)]r1Dž7b pr,m߻豻w* ۋ  Dl'geRzRqͭ)=l M2sp߲: G JÁ4VN qg:kliCNta(#K^3*PFnάF3aQդ$){]޸h.]mQoeǥǥƞQIQvɮ-|<2.HF#;)MO%cHjf"V~~hߛca';'$CUHNfEVNQ:{{:~&ʁ)LǸ.gJlQ\zX& [DEۘPiG"gYsc\ZcU+>8GMy.]}b=ƲmF󨸴pIi weхi}j`o8)EpO:Į"AJgS69gIc?ׁEwa[^uۆg vkA 3xR!TXlZcOV"v M٪ѽF`ѩۤ1@{(=\-;Gq\w[yU; ۩kjkfY>U\x_U/ `/2+=8+ 3oٖ.6&9~{̮=0fNaä$d_KW5grK;_j4ï\¡Ĝ^l-Ŷz5VߵWL zmQ*@m7@ԃQ}fQC (:Z+}cqg^^?W4 L95f@fy%ƶ«5J7_=ro#7h^7 [2K$/.>~;)6uH{JNy3i],iYyNLJncpk%`C_ 1qlUtYf`/9ۓOW/R%Mc'jy͵tfW*pl]L*'SġOi~UIwY.(9.;iNCYnl"X:sIövA̖;"[۽iMK-Wрi9B[L(FA\_ M2!UրNA߾,dD֓$_ɾTaۈ^2n@P}1!3m䈞:|>J;6L+%k )Wx]wx 7$y2nM ~D%|+봕M+DOgGbS9 κbyLV_ȴ0 $>tV KOIX+.p`o<[rA_7fw,;|^Jl?{ՒÞho穸Nq_>"';H3xO#-i@~>a; Mۨ+U}Fdggֵq]j_洗˕_MqXr(Uqfn2NÍb҅t$#cR|6r6S+]o=*H}豈N4U9{V4Mm1?H=|!mg8Ӳ2V19)!ƒF\ʫM6`\ u%h _ʵteTF*vġ iYsPL >|-7̶j۝9+<_$2dZLBuc2N0T{W6T~jY%TjcE 0DŽ@-CL,qHkZG+j4{y Ik(9gMCkm.@ǽxʊ `;R#d̦۩ pW6 {2>n9üY pH+و ^{:NNI@}7Ǒb]㡨nUKH&E/*ٖM|"E_+̧yum{4g623+x]5Ka&utÉۨZMA }Tpub"CU^B];h>3eHKV*{[YfuL o>eV[֎1 "f5+{˞.[g"}g Z$b53Ox1%mbdmϞXe&+;gvoxMGd{dcfh+L6Xi>JF{99g8*1ehרa ]v'f샃5#x8|ux5vђ҆|wFg ÙVQ0ǏyE!$w<|i.YD"9ib2+:n򒝬=3Eo36/t/Uj1GWA5.XTty?\坯99XEYbs, t&#9WD7c, f `Zu 2oWBLz=y!QFS b9%>UȓbNFPڈ|}j-FxYs2ohYD%,6N8ཎvsR⢝W{l䮔^ts˧Zhx80ߠf0IMky5Ω^M-e!fӨQ`l?Blf B_'o2gKƢ7:p=|1b) 17;'t1K\[| mȊϨfp!o~M9bt ҠsBa]F)޾V(- j\2;1ӷ.5N0N7khmK`7q]ݣM9~RBcfuw\5e5 DūTxmPGZcjpda6|>`n.qLo\];ýyrq8^"ӲB…M~7rʀFP@yXOo+h=uhM&{Ɠ4>oM|3+ , N R@K!wAn*;'Պ`*WfDpeJqFsK-"fFUŇ,RWQj6j.NE5ЁUXs˼>Q//G6Org>n%J b^'|cgi<ΎZ A({ Y-,BZ7?M0|gTC(Ŏ@Y$A}M2'3>ג;b[/G쯶 BGsYR<,DŽa= J6ϖ~l4D±))vԔ'9ؙ݈.oK &@#rM{m'v<FW+W'ahsݳ*< {ڋjm6Lmf՞~c~0>Ǯ-DmXVA øKL /d _qm)ء[Dg]=e{t׺08?S(M6vj$z]=C KqFw;\5hOm.}fg!UNiJqԾ@|@A^^|1+VSCel% Y&.­T /]~1rC4lK9m.FQD0Wi2L aJQ]en[lHA.C<c0㹡Fj+ 3/8syN03y6rbp)c|oT{V8B9Si{_4ayXT3Ζ%FO6AfS\Gr\_Q4j'L%ں04S65]R!YXH]zZˀ8fpPXƨ)W0f 7״Ot=[U=W~`xv0#iYuޞPr#BЊfkCК FШJ+0f?ރ*$nJ=3#Gw,"C}Z[jd| /=m"^uT+`,F08ׇrT=+mvfbsdFݱ/7:˔2Dz퐅0i׾Ȗ\˻TF'V6IS%Pvp Zj,\8)?kT;5-8كU oYj|k]*`A@C +Pk-UTÛljr6>BfNs]eZ^K^ ǽ][i׌ke~-Eyg\y+q:2Ld'ʳ^`K¼ Ea&Ŭ͖qj*6@9xs:`]}0bl"oDZo^=;aPDKU%2mbh]y661;SE+R*$uEj&_(OX[ͣ޲cVc,^t٧JR݋H_ž#8Aʕ;B!|]kuͩ#h֡&Q&cʟ?yCJ+*|e9w>$M@ag Rx u / Q;%CʦJQpƠIM">3"]:C{Ax_]v !Qǐ-оnQ(:1eI}]Id F,,fǶ`^@: [%9`%Pj@6?(ַ2 IJ͖}%a>P'gپjg ͖Nj;xc{>\M$UU\9nK3ר'. 3p;rބ fo35~#]2RQڷ-Ū1x \G_Ѝ"~ Gjf҃revmiJg ݬ &YrIi/iբO|Q>s 6v_^!t~v/[O-0] oD6*,T!|Ӳ#̓Q)є$ 5lRp< kKJ)l7ҁQx7ϼJB)>ٟR :k0mŽ,˜5|||Oq_c܈>O؏8s ;9ϭ0ySWK>2rPu>.9p}:7$'TgqupDmoW6b6"mnWwehr\zE SxxUVdf[p]`B{|PVIjͳ:#?a3SY?[U - & H{倾m1=AhN( ڻ!*u endstream endobj 178 0 obj << /Length1 2502 /Length2 16207 /Length3 0 /Length 17667 /Filter /FlateDecode >> stream xڌvstZnl7Ķ4pbmm5Fcw9wfy~ޛTYQ(`WPWWge3!PR[s(5.V|Ȉ;]A4 cW=@`cca3@ u P;8z9[YX<_)-ou`j y459Z]#3 - t: P4%@3"Z]@Jnf@g?@MFGX`eb2dePgrteۛ%hl7v756 1@JT` ?:[90X%_f@7wڻ 3Ty/[lca[ٛ#PF?R oj, 4dˉ#o&_dP|T́cw O#VV+hae: 4BV_ߍfVUU7bbF6#;;߆2bv gOhmK4@ygd1}O*aǼlmK?2vsh)-VYo1h-D-@EhljjCkl.V5FV횩 8qM, h۫_;0vv6B` ''f@Ͽd R20wpF\fѿH no`x̒"no `~#vo`@~#?O_lFfoϫ9YZ`e7) QxN:4V2q(*DӔ zყY(Uj*%=L}|c4)meS&rqERՐySp(LаN?Tx 6t16RlGEAAQCEqa'@3՚-^3V"T_Ƹ=ɫ[Yag,Sɮ~kmZ6SJA0 0%ټː*HN\g0I|?U Pr}`2S22򾔹Ѵش*0<ԫ|x0H5(''R >.5+U?/ t8$'լ<:B ӽ/(nxf,+(hz =T d*e֯}ȺZ -.>U2ԕd[pqd}^RvA)Z WB,Ȝoi7nYobl3xu`^Yec |8\Jm{{b|nCmUlXVs ۽EDfR瘛#3VԘ( ]HeeQVD4!MvʡG)Mc a q/0Ԟ&kD^ZdK``YOQp4]]g+x ۩Jki%xi+pc3:Lޢt y~_.j>)chjL1};(ޒQοڤ)V ^yn)+qVנ 4E=KQ//O_0/ bN0F`&Ƽœ_ 98ٮlJ{ C?S>biׇrY:{8j;p"h5\Q+}`[K>3!RE" bF8 pҧ&t=$oƦz*#a˖TD.4;_h7zxg/)M㦒 eOtef%nJKVuj0,InS*Q@Ȼvcvԥ}G=gdPڈ&<4mc KQZ\sF+J'CqQ pкa!n6`Q/D>^m77 ͥ]3N]#~zя={iڶd!T*dݵR#ǹ*v֘][}kV \̺ vݴ+}LTȯ6פOoiB_l+x2Ȟgo:#$ڝ6l!C oLu9)x_Hm7g}peI/t'Lw1'7v+(ڪ.܀)tĕ5.8Dn _a<urgtZ(Й$|l/pgb9$]^ݛLdYF(-lh8D- ZuZJy!riⰄSϘI _?1oyvv'Gṛq 2]1ޠ;0b kI{blCM|^L{p~t}HNO޲u]kpVBiL8gk v@DA )c&Ǯz7%Hu *g^ưe^K9Pw|/9D;dմ̌iJ/@Fixm޳ HH|qφi=2< qj87AiPn{'£!T2k{2>gsY4R_Yw8Yڃ/ObqdvwCK=-}Ɓ{N J*ՠ2''Σ4-ޮ۪u;؇´5t~èg+ҡ+&lrܘ.5'cnWQXׂ 鴔b[N]" *|_YJ6B1DFy@|XA:{ $]`bj>rU6ٹ釒RiV fy(p_|ֻ)/P:q1#\M%Ūd4 mP6vAoXH4WjBVW77TmnV+SG͘ \:?ف[zEX}l\-W:OQLlfWs;%[0nq+AxzMX7uzmq7w0 k#2~s1LZ\X!SdRQ\I#o,t]rʱs7"%XzU-#{}TH;0]e2ɯH7-7tE1#n[1-"*gWn:V!]ph7!֨ i_:݄)`y;~'\~[$3;d p{IPqc59;-(b`I~чRt?Zwwgԭu9BJ'Pp~uK+ی/'mvvQP> fA~cQfUoOnx=VMK=(QbifsN`9$T9oK}@v6rdsN1^+wS>pF3{y 3Xd&T=^+t g4)Q)FՒڐc5^%U۴aXV+> ajPݤKp0YB>Xx_&4-Ԥ/xEbȏwgX#sT}i8?ǀ2B /ìt}%_U4/q+A uK٥OLx ^t9AK>߲-l`1ᗦ+m(>jΜ<ȳu'ua~C!l- fL;sRTFz,_ARQJ}N1HXtJyHkAc1KS $uUsoVVhﲎgkI5\o"Q  7{.ΦsWn{c'59""8LJ4˽ǩ Nt| GW|ρ{ >d.ahCx}Q+D,FS+`NAjz TÐkk3tD$TH~9Ma$}0`GIc<,R9"T߬b<~jCBuFɅcM,JfXND恵%iT-S{GBl3I+e>DEA ѡ|_ 8I__%qdk;k@<2₞^%c¤"\mAep&<үR񇊕iHHŧUac5Bŕg;Č ?"[;2pz%MSw!:LMvbUxϬVuf<%*mjjTF]5HfK.Ʉ?mzgg3`Ǔ"Jl {;4Jٝ}OBu(=jDZ"IَL VSx }!{ 0[䶄zݨz - Cy3/4)!Lͅxc]* t>vLpT{(] ^᪻/`8ǂAҨӒz=fKQ+VGF?1we,1%K .4Z=5u?QkW?vf%9}<9g9CH Əxsy╸Y9 | -ai=1Ch5YnCa{Upqte6zC&3oLȳ!{;}BUzfʌK//9əڒtɘ I[DJO u7eFQ5v# Ms(ɖb''-* #niW0u]Rܪczzp*r i+^ݲ_Xg[bC-$Af!vă<뤾k.<`sݭ38z7OSc|tHcg& :{892\0`/;uŘ0\aDZ 9# ցOLjEv;cYr6{JԣX)?F>9eT1p}/T{v"s/#>G׏hjo( X8P:"L}uq:0!eH>qJwQpezPuڍ:F(f;;;EVo!51.\!MS~lWU7]Ti5y2h4mz,aKL)uZX xzV61S-]s8y~ > lA18,a!vPfF 1Sܼf[j\ ^"-A.JLYT' /Jԭ?6B;vQ<ӻ3ez[FU?dlw3EHv M;q҃{Lݴ)GS;<:dޔ9EX&Di4 '{ZӶm5 FWI;hwP֪9n+1=ѾV0ڊ!3淙t֗.%Z=ʏ߻L}f3p>\wS=?O> bTUw1r@em>̓O)yVJt;EŃ ¥6-X9 wYZIz޶g$n5U8>!>jB!D΃k-p*jL6_nebvz^ܓP33;Zjvn BRiXޟ{15a+y&%{! Bv^9"W&/w-K<ǗNgH"bWiN|=ؐMsmgUS#ˈv"Lf܏z`1K!o獪D7vR[!=Lfmg}(Ʒ*^ɺ.mQX5J º'MLbm[h4~/ c*zC)JPD!OIGMx6da0G sZAFo?)=U> ֤K} R snQ[+B--O-;tZV6-+%Ы9NC5?KLp-h}CH-4\\ͼw]77%g^ޙC@`uPϬu?6[׬5b9X*s߻] H?<y P:Ȣ.jPGjZׅspYFcI݉s]?R/%AlXpX=H9B p ۧl )n^Sa(ש ˉ,{'wH%-Z2<5ˁ[e( {j"O\d\Щf*t um:{_k>׾Y/tuWb('5_yq n[#TGp=V`=ZP+@_N'CEֹݗ2l0쬷>Ϯq!QW9ʼ^AS\wʒ:iw[QuC{Բ$s9(~y#Fe'O&{%k}=Br1BlH>i8D95PF}mmI7h2#\(A?u33Gd bڦ^2݄eS%("uiaDn& E2+GZCN׆z̀jRKOŒ۫T<˸=$|]{A7㶺8\exQW^G9,zc-ӡnЛOʜ#Rb" ^N%J͜6PzA bަE=+'J3ȇ5dgeFRDڟSF)ݷ (- cj[^u z7'a&b'.Eay%!Ĥ- Ky Bhx r¶!B=<8¸&cϧ8.{+tClP=Jnj6/v›%u\dOh_얮H}lܕ:E'9$ ȽinU>މׯ S@FeVE]*T;7M"]1ka8/#VL|;\݁X3aj{JSnި{l'VF]ͰK"O3(D'Y*r(. ٷ%nی1S dEM~Jb=}8].48*:uz"&+CeCs(9I ~xNL SKqiʈPX>y'|~ -کF”z9+8oLm+UhZiY{€cɗ2BxOe7fR*:rrqx hp3{\Oa2.o(>9Y_doDçҚKBARI =ʝ8նc`bc5IlP]_ax.R~$zzp".- N 7Bo`?_zѣolX=mf(2OxrY&Q(Inq]^6 so6+y մ`x)v ݆݇EW5%y@֍KSp$b?vU2 #^R lƶ] v{-a T:H#ln*4.4!VX߳^(3T4R`u8h 2n"Ssk6 u9P<Wv`U NMhTHQh哲y@̙fA_c.cPi+E\ N.C~ӝ[d8O:ѐ#*ᡳ!D"z 88Lɟ6eM\`p`ka"J|sڞVxMw ?Ϋ|g@K+Z`I@ܖ4GzLUߙ_<↻p˪a31yŷ OZpi*seU7*''?ԉ55<(C=O!sP=mmSwX:)V1-J˄MbAVH٬ [7\a%i̻P[H慨4ƆTOtTI.*>.dwQYg>Mhfuzb^tx'H%h.=]3ӂ?`HkZS#Ίf.s@tNjB`CaOp4deJw\\_,QJBDKَ%`u1InZ,ŭ7&|>`Cli ^z>f5XqX}o6tД_AVQJu,_p]沞vxN3ӋlgCk&s9*S7zzQ"~mg>º GͲ8Nh[v٥Yڦ% D<͵dI X}PcgFpE@ඤX/0AEtlO#bNyxI3TCVٸ콿|[Iٽvyk=n07;2%ң #oS145C^g4I/_L<;05Y}"OM( m&y-ʈ~w#=Ka{:%S,G/Bf$ 5fY̗qR?NolTZ3kXn8K22TR˚m,dd+jє< 2:A i>~ڤNLj bT4Fœimop0Mn0I6dMd%WE2"񲀩,E "lNr:TWer6 (%[M!f숎ؖ』Q1%^yX7$d=-DZnФDiI7**{\מ fA!˞}6JRT1@I޸/`L%xiX!M~0_6,NFG;{ PUS5\&[/-kNPK9L.eP91uoRREiT؀RylKCq=~gעgJ)h\!*"8XEVBYK[TY"Һc]9ȳDn",:R*5"VOԂKrqn[|s  ՃdꯦO,b"'Jd&C I*ڑIv;|ϑשcajZ숋N -yB ra9swô`|׍ODBӺ(}<,1_&~qTn@pRe] _@Tܶ:RxGniL<6+~LCoQ郻Je{wӻ|P%e F ʠwqGݕgc˺BfDTx+i"P(z{y{UI`O%&% +V"]Ǭ-&L $#氦724a#)>\Pzli{r N,}pVvv_`F,şǛGVή'=QH)t>n23Dsr^␜_ fj3E<)vo9|F1&ؙP y8I%#҃;HB0ώSuzk S~VܳĞ~ZPp<ϙ[l]rfYA©tó: (A#'%J.Yъ[jՀS@e]M"| S_VB0oH:9|2KٍǁK MIQH c ^RLK0'hIN֢voڜG<C3ňu#v4P ݮ \9*x}^i"?6&KnFSsscfk/0 9J8ϛS^M~uYQ*Eoy$$W>bnKkD1c9rFXo qܳ^{GxaԒZa} ;ً] $93.ks灞0+nK=cAjw_R_簃7'7 er 9G#&qBQm֖š`;^ ñLUZ-Ij[/}Zr4 oM>@Jˍc bJSz\خhays$֊xbWzb9 B%BxQQf8I= ۛIFf%Icmg/jۅ $ʼ\ZipR*H rOӐ&$\h,O-={EtMlx1lmcD(;qfowmȥVHeP*;#$Z:HWPw?2./1~?I8bzD𽈠̟ $-cΓ  x 8E?뼖lL/EbsAvvT?+ S<0jPRe8!BJ P4qc]&Z2 ^#» \"900g!h>pĹKVUJXoߢ.֪Ru[[*M&fxT$ȑʴ %&ꋩgjD9B#cŦF 570t&ٓbSC.![Ezf}ݶ2^S`v)E\7iL\h欿6Y _E8zde<l:/q d+z7]λ1_::;td65LRtu no#dOUH`Ucuʗ 5 obbt1ӗF橉Ԕ3m-Eb~ KE3R:e9f_MeC^WY};GbBe~ÈKț@_?lr4S!n|D+U VOqoLĺ$`HTQZ4ij\7Hĵ}%Œ@9WΡuIllܟ`;+r 9)˲qnv(OxF\A#D&[BueX(uW:]WBro|2>.ﲍg遀K0w{$\-z FSե;gg6)l*U%2"O;(d: sfNUOˁ{bH(D972cn@ּ~pEҸfW\S.8tkB)'!''yKUAnI퉕&<3S}l(R}fr*r\gxx<Kc i*b3`hF胚Gr>xO{H*/٣:}L,oLxD?(ݣ~խ \љzKЇnVTDIJ W!MDMH ูv @ +ui'2Qii V_wuS wG~ ȱf TREbU{yz*;F ΙeBV4b6%0c6蹆oXA-q_N& Q[%{{zh {, uJmB.hLOpy8E˹3o_D.V](f5/pQK@&sFzhkoFpF!47{µ:LA~ 5YJ.[E)V#kQ]Ϊ u?mFnR>};HZ"4$Kv~efd"p,Gͫ펹_Yi0&t=X*8̐EW. k5 PN :iW_{@U5C#bKo ),*lZAeNmnټ9]Z5PYFO>hx&v-XD< ("Mx a#!Cl6u8=N4+F^! (qzYܲ2~}y`?.P[}]lz@| ܭɈn_ Y1cٽ&Ò J7h2DNfKSYgHUIs)OZq;F|dnS ֞!;d\`u%GЕ:WVisZS`x$7ӫi4aPv>|f% jyO^ qbDwCS]…ɕn[2xMN`֦qH4F [y'oW;ɾ~$L 4ܷk g(TZ+݊3?vc endstream endobj 180 0 obj << /Length1 1401 /Length2 6203 /Length3 0 /Length 7154 /Filter /FlateDecode >> stream xڍw4ֶhQ 3z Qm0e[tB$^ !D{Z߷fg}v5:rvp2I  XY (~E0 j. *) &  @8BP{BM>@  Xn>#ߏ-' !!+s ` F9B\o:ڂ]}-G iGMˋ#d8y/(Ѓ !Ose@ +`EQ^`q@m!0Mn9@O_d,J]0(@me >7~.HM> u~t͆C"n($sGenY fwuPH)Bۛss0o #sD@ 8Ho[G | ?7;5 P{ PHi vP[`q] m? n'~~dq0;8_W̯gހ+($$$1 et?cG*H8g-- q!ǿyn| +GUWD..O u!F)j\M(`.:H(R ӁlO@a8 @yC_!ȍzR f )3AQ@}@7\nhEcGݤ7p;~~[B,=񏮶č~1f_J@!xcp[0J9Z/Os MDPl9~[ەQ%LD r xe&dДxs{ vpAEx]:Bk3L3pvUSM(;o>Y4KkOFwWK ѲRj2_5Ƭ>Pg!ENJvG:r>bo 8LĈƸfӰ6qA>F\u߆ֈY=WD/%1Aެ_lC$v[pK=d?ɵ,TN@qIW,~>w6͗Ỏt* B~' pۑKdH xԯl'o`&-Ʊ݆49&љ+h|qҞɹ6";=+;%(J7}cNr)n\memL(66=~BmrjͣΌ1`>XCI 1U]Z5W\v.5ᬀ a \ZX! gLR }d6@A3G(ʤLk4d7A]9#0wQNS*E}Cj\vdp#Ri5T7O,ډ-$uFhSٶdh(џTg=41L9=vi }(w06C.=Gzޫ29٣yԔ}bSCmi?y "r$x%=[-VTAvS_NZHm( $ޞxqN`.ٶ=Z$ZήMll~6 Z4lHbҥ >[h8qj>$" xZZӪ;pW4XcߪA-?($Mr$҄ kvjdGi1~q`"̲fJX. +2V^|TpbT;}Bʑr/I!(K7bީ0Aiu<\ />ڜ#$nzH+ M(} P@iK2]ZP n Jɲk~VO9m{~өD#IoC06!H +'o !Sp,NkPO -\3\ \*3"H}A/U\vBSo}n5~49Tݷ_*X>LČmsu,FLZ3ŞP+c;巄򂞑rIkcj*?RDQKn9.DF.! e]Ns 5S~AfvMGsqY BuB葯wq!ϐWk}xl3_V4^1_vU'rsx.E_2..H2'H-;9z!,z`ѯ%١S>ŞbBnr@IuػNMKֻ*ch^Q/B&)tO.;O(5Dd~ز9dGL}kUMS#%R*)2U@}V|b>SK@%nͱ$Hshx:z騥H_ogRz~~FȊާ~|aػEcWA#Mݝ+᳄-!Xb?$ ,Lz<28Oh!+;Ei4~YKթL ZJ|j_Òd kgvts' ,3IK wP$$$|;O]9i+!%[?W駷8T LgicmbZG 0F!Mt|W *&sTxj }RZ±au6[4|[aX}qM쳶MCXe_9w9[e-K nOST6HRG{+N2S2S"} $/=^Bįf)Uߥ/HqTn#Tܣ-t9Z!5y^ p39F,+KtRș;61v6\b:[\!ą_ߍY6~޳9ffufoYS @~õ!%Ƃxy#*,kK&;l, ɲ4Sb[z]}_Y] ZXF`jV dJIvrc ~ĖПƷƌ~YXx_k:ѐȄ_8\MFSlϵrmpD6)UMcY`'c7}*{VbqB 6 j bzDB{04ld~kda8xY HKu, I$˶0Hcvij`Pw.*TbÇIY+MS,x|l_ ~\KL=1`=?+/oxnc{ +W}ũPt!..!I61;Hkr:_yXtwޙj}.6jSbir"Dp'Jjs;Y!J)-MS∈dם1P>\+l[1x.~Gfn˓KiYF LUu\k)'Se%VoU 2kͤĚX˹AޙcHv-}o.J\ s=O[ ~FA$?{,L!=Q93jYOnjgcCDz$^B;ƙ^,P+bn*zn1\(2Rk?Q^P…h -%qY _-32s\{\Rp1, 4p -;{DWZ-[S$c_SxwNsVV&.[W0o?W/.zk5фfLN1uX4m"G$PojԢ\4돣j-◍L5eb1qWxu9G/&J/d+$j̇h7!C]k)A-[' ~ЏkIP f2VZ̗>/=aOE-*:Tycb!), ˬ *^ }Lړ'˿QyFORct99b̽ Xa}ڗi?}UAG9>ഃ`m`-K'{c mǶX2ncxsPA|嫽'#,{@Jԩߔҥu Ց;sfLG{ mo/>U?R8ΣSpnŃ࠻Y3~2V]Mh[]>[G$hNB#c.EMgӞm֨ -V/b+>7r>[3 Kj]e~F33MD83AMw*ZS/<ڨ1SO_[o(l2W8?Om})4|0-ĺ)s 䥔{Lu=j.%PewZ)e?} 7©V)9n]}3qY@k`{eսͽFk {m#k}l/DQ‡OXlQDS^&Ɲ(U8u w }nA]h#VcVrɒؖ" i@ Jo!A/Gm< m^Go j`._t#ԑt ^\#ĸ :|2b1}e(wVJ~>HQ|ڈ}Q%b|Hi241MUD,}{iJktp_W)"T\~pMrtUpjY fDv{~sVoЄgw_^T$0i~OTrs,l;]Jb.oisgx;:;S!s=TTCL'%#jE&Z 78alk8 1f |_U0r̓ј7;xI426>@q|FȖR:׼J;T%u9 WCUCW#%;EFN(96}#ɕ':)ߊ endstream endobj 182 0 obj << /Length1 1396 /Length2 5966 /Length3 0 /Length 6925 /Filter /FlateDecode >> stream xڍx4\ڶF{'ä5z.D'A5BѢE 7ɛ_֬g?}ykϬfh"t#hAPgb@Q! PCqCP0$B?*^P0cS1@=$ D qi4"`@OD@QD*HO/+S[Pz `@vz`*Bp G{^._` EA|N_#? qL]a&Hg/ 0„x#^Lu. @gs !п @`? pu]!ZF8($&u%#3P/'%(+ fN*H("՟* 컿uG }a'_c8y{ !`Z0ѿm.P4@ (%..@~W_L=͘=g`3E@h/ohp:"N0u!c:Ɯ`0'$o#757S3H?@@PJ@ 1@?aX-3 W}e?#^?s#1̅xM{@1 s;_YWwGpo?_ 0FcThP _Ճ:=۫cԠp0ZtWx/; :׿X0z`aDq\Z~cOdE幕.v&o_8$概Dl3C(YJJt^(T .qy*WIJdsBչhdφakΕ gUI{/DEKӉ`8ʅ-l0yJ|n+=錢@h>Y;%m3|KI1w!IkX3r.=%~8ɈVsx!`̪x_ϫ ,Ŋ{9锲ˆIOFC|Rg9]*NV="%|H-Pd銥ibvGq6&Z̧iNҨĥiONNwc&(T]?n)g_\(D8s/=yh aLo@0H玠tC'ꮻ93@Z!R2'w9|ql޳>|1>=snWɱ-$<3y+2pښo.f({`aq6˄X&y;$HI8G\YbcN4'a=j꼊VL0$80vjpXh&!S.u<^\o8XM_uʉVsTj{_JYk~c|(\k{0+@.g4鵯7y(b1g3<*KLYuv<;?Emf u@>(R8Ҷv)1@CE3<T˶ݐ5&8ZflEϮ]Ijw˜k6{Z_` 38$,0&#b/%xy=i@R/`jmpzRț~!EXGYQ "*{7 @JskFɳ*Ip)R% .OUDTE}ymƬ>}v"@lX d; Uw6iFP'a<RZҟ Iz|'Mop3f=|Ε&47zPiG`]C<3AQm3X.eBV=F엕xZD3uWw @껣іzr} ч[u#To $ Tlg6l=QZ%m|J?ߪ n׼.2 C0G5=B˝˻|fJV&'9?šj`=q'[A=eN?Ms=>=Z_Ee>$pe{ MX~ԁh $3#AYH:}3*?vc_઺F8a-iqU >T3H4H",OM#/Ȥ@[jy87\&c ۱f +{4.p ?s M0&{4z0K^E7Jyo"&n5ΚvfP,ꎯjة*mʏQZEzپP/\ae&f$T+"+A+λY).Tg@H?1 dƮ0|u\?Op/[{r쥛m%DR^8@aAu?TN"F#91><$1J Z@Iz/IZۅmi(qc ͞@4a 9B4[ wwwۻ{u4G:\,ѓg:V{h>yd~[}JǬEZb-@ٞB0uě ڦ'_h[@eg܏ D)MjJ7={jJo^ l2ʥ' z̡^6KSu؜AQ2\GxРr Yμk&V\P#Sڀi[7eg2n8*洹;W8oⓅWJ/\>AzkK6,Z,*KN;&mA/CMÚEg&̚v3’*YpUKFʹ4 t3ΙƳ4)Ě^ƇzUpؑt-W'7 3aEsIdg2:.wߟL%ȼei`5ztUABvDp:P=P~ L$}dfJn/ jgy?mPPhQhU#-Eًڧ/%P6G LTĮ4\p$='})JvuO/2#=MnP8^ιˢ[5][EFoZs9,y~G|z/)%t=Wѱ QW +KZO"\NojoI+3SM !n"*6ek $-.JG-#0ʚU<(tr[D#%'ι%k mD#ů&pO 8`{V Ck yaǻ$2'VVYg?X}T;9l9j ndRkO^+$,$(%T~S%x5H-k6`A)#MFhh,]7plzn^tN]e F3VL7k2P,K _!A7GDchv\;3Www z o9EǴl/v. bhtz2GT44lC3ZdEI;pY~3@3@x)_Y(C37ZqZ|v򔫉5e2)θm#r|7 j8 ÍH>85`<βh(7? j<2r?F!5P*{a7 }s!Ll]SҹV/&0bw)ӒVZlߛ˙[HGnˏE8 |`}_gj÷= bdzk<2cpK\?BJ{;z[S?7ubO~ȿ v^[x] y<E_[r^ݐ{ o;,vdJ>7 |ZDn\n._ݰ Hjg9+}vR L9ݐLW4l+>M!H`֑D/O*a&S1b=1O!#A4l߁Mt}Ofe |aVo0w)Bn\Dz{5hWe2u亣0]5<,@![;Wq^z/{\/ffF&9y=.^Vi&V]/ԣ**fr5zpzTo,r83c/= O]u~NK 5ӣCRR iC?JO3-Lb߽Ng'1hapu*.Av!H$ƊjU]= 9Mgv#Z+ WosVIl(&}퍀)c- r, ٷ=V,.7{U8-7x\T {+{}0Qf;,X( qdBk1pbQ*sph8ED t'SȾ$0ģ)VuCyZnk PqD xMa+U{Eʗ̼S\x!6Ϲ$ij<&T}|,MpMFި6 *c8M /x%KO > stream xڍvP-ҫ4Ԑ{E!$"$:JҋtPRW JSH)_,ߛyo2k9k&\"p=B Ɖ Y$@b&H /Lkp"1hEPvG@qxLt1h ,KʂdA $/"]D@R*c\}ܑN86z`)E Puc`H%p8WYQQ/// bo 8'pD(e@ ^78༠pAh,> G5u0@U 0(W(v8 ]}5 ' ῈP,"]xΡ5EC/<,H_E*AhW*Hw >nB]8 p_"hBS/QsD@xÜD7qEx~W^"Pa\Q8#hT?k# ЯϿǠ]|C}ZƦB;HDd$vHIKY?h @OSWÞlYK7-ۀ  )77;;(_޳8u1)@7gfup꿣8(~юx/% ?8F 8MM 0`^-,b9_X-羪hk ;ԇwmd(Sx;ůkB)QqF 0i L.~uHq"0R[dew.I`acl_Gm:ΧjT?+tD\c9JL-ΚfiTjӳ6쪕&(>Je*mF[rX X]qN04}{F;Rja:.c`n/;M|@udy+W`b/+SBV=O r<%7O߈{ BJ*"#.%k)\ߺ_"0~>z6# vVwAzpqۚ,}ɬVط< sb/7sO?'h $!Zu];4ؿ4F̗L]zS1}%aSBI -Fy+cv`>T:%ɿf| <7|pdO%fDP2'Kڕ4Xk>->al8|j{)ԔƼ֒mǴՈ~Ϡn9miI^Y˯Ez_6fJq_ZoK0s:ptl캣6wwWZd~%Z/JTT F\/SmWZdpOxl%>xx {ꥌpqB"Xl"cd5 M+E^?t ]XKUM0{`QA~Nӻ/M\/E%ڧ- Փ4Gl3X:1_bxmtCeŬfI|1ʯ2}`().Y2Cw^籐Nsfm Bonc.8 wƚ5m?Q?rNQ[;ٔrIa] XOͯ*ٹ!\c]YeF}:U4N+QBJgējviEli(!n-&Js+x Y5ZKl '!ڠܩ-*0Gc*YdA![Xތt|e oƓ9 _snHtI=փi?WѐCtL)Xj_#ؑF^毮jLzN6vbi;Xۀ˩E}4%JedkdپOO Qܸ]ݑ1%8!{V:{8y#$c)$E6EY.\f'yT0S*UfZuIl*A"/Mn'{=yP]_Pt}kp|ͣB2{C]=%ʗI _Ωv nEkO:\W#+:;!1Pv14BYbq3%zjXbLjk^7{ysB@x-_ޠoFFWVVXs:"/Z| /PU%DvB1"^Ʊc]Ǟ:Vـ;7roY|zuT܁iYg'/XF9kCdဥ8xջ6v1N/?sf$pئjcL1-(9FR1gQdz4C°F~Αj^^n=q5޳ks v*s g ,#L=.j zu2n"bF(QEF]yY`en*};8yH\S/bYSj¬Rߊm=rŗ@E'mhV*ҍ[b@5)Out`@xZFwUN.h`T+#64Bv=oS(=uyr^{R9 oTl>Br\}VSi_Q.).HeiZc2 -Uذċt#%и6)|QtH(9۪ $3%q Tx _Sq/Ԍexn,4MZ6A>^7p/#E-{ށ^T_ԟMf2#eЎy "VB1Y}ą>2,og3DcN-mơf YCm:ߨ< <%5gaSImmFGQߕT&fVS2Agg_S'"[N.%80 Z߻fϨ+-UA>er#ė쓇'rϒ[H$)#EJOZC">%Q<-'z#;f>8IӋ q̕uĀ(sS Jrc}#몑VnLIdu |bm1zʟ>g.(M5(`/>?aq|U%'5krMɛɫޭL$oy?s %k784PGm}CQH1՜t)-eȖBjA#O[WJ鋳/)Gf/]7n.DY͇{w"%rOT"e|kQK8i/P% 8W !ϦR+׿sxg31M*ȜD\Y%:2q9[!~ I[Q?5_>T|w{])M{v2e~(fŧqeOT廏r⑧l^c* ,oEțE׸@V˵zw{erlae생&K>,ъ"4*%~o_tZ2 >]wE.47M.yE[sM,v5/i(yrC/zvd*H6:f\m Dx~)=>mR }Ȕ6at=Hp6 b,;H-i/W(mdUa+e+}j0)=O6OImtc,MSZy9m^ڎ7o=<&4y[Km~RZ]`@וIbB6'>#ĨIpټ jKZ6-sdڒVioa:|GrCJ&x]v#zU\4'0D/3yuGbg\&$n\32~RkqOXE~KvͪFI$h[+qzE!s!c+] .PD=BrGM fIw=/:O ZE!G%&Oɒ"b<q #&4>ܓ7̴o#1 g'VaFUw$q4~vp-b<"{pJ1zL#oBZI 3<1T In_O3f7Pm:>t%3ۙ }0 :j3$eDHݴ|@3bC(H_H M /CӘ~A.:QT3fyLف&^Qհ}2Ytk+[Ajո NǓDm~>󣇨X۟nFf1N LNW950at FR7#LG|O2] Z-QڮGܵe}0(D2ax)@4EE+U rfNS,`stc}[ZZ}G_ec?Ky ȡ+aQdF2XjƽT}yKFLS5.}Jd ^^Y¦bF;f݆eqY_ |Fj'=|]HbKnu1B!+s ubIv7Hel$GM)OjtEP!#}J2Y{u4K tQkbOI;%__:.!j(Yb/KK o]c Bkʍ9.dKW~|4G(R/wd|84GjǵL0JkB{1A9_sLǵw%&J{&ZFfG9+^ $^lT/kAk) VcƋ:y¸@w=ʨ϶IQޔ.Sal6ૅ:ovn׍~Z\|ͣb2v'OX3d?.{kDC {βڎb$CjpO];6Xw^-3͕Vo_H۱s^.O"8ưx/3d]fޯ#g?]^БtMۊi~h_ 3œ sr<0bxG3M2Ts_St8YaoCq>t=Dk+v[֏]e**Ƚpp=*'/.;n({].wC7ڧ4G}NxcDSYXG=[杦U\?7K7LܔN ~"ܱ='((rJ 3B;W|yYº$9X}'lEp`T壊cNtޞU O۝bwugdrBlRi019>xҙV?&;P =Vq> stream xڍuTݶ-A@%Bґ.А%$A JEDtKA91#\ss~b30Rw(, T3b 0XeĹ .3DdAQ@mPDRVDJ 2"1@5'(v qmEdd]$ AqW0  C"p>(+ù {yyX'BF,㉀ uE 8"pc= A @a(8o4!PȺg_P E Q@{ G (/"C=Hs(!xXÂH_# *?eu\@ᰀ_!1}ܬ3 G{ -<%22@; sU ;( Ov@ 0 "#a8:FY/Bx>~ F~Z 17OH HKd,cEm\-=([1cϿk>?kEUG` 0 %-)77twwC].> xzCmo9ipGpPQx1 p$7@`$7e5$ a"[Y`9X.xs_u 3Q I x9OoH8 Og ڣ1_*. v a?J<0~+ֿ@x#` 4L.ܩ:RK{_Zb-%pܓu/gj܇]O3z92¿q8mݖ2G޵%w怸G3; I,Po>2IyB yl>q!.\Tpւ]Y RYpsZc-8YZS` &ZCg8#H|ƻ4< ɲHZ&:_m&GXn})L]#爠]8(S凛va#VbLj 춺g8Ј4G’g7WyH)Z$ vn+憯rǁw)e%md$"t2tթjܞwKT(]y7w{0!ט>Vxb quC 5~fҶfgwYߎkuz_<ٿ5v1vZ4[:mϧ)~x[~鞰0lFaP`y{s%I:|ڕiZxUH|V?*/}i;`R$1QKA^zCLtog;UD~+3 DEpd㧏h^@idJrM\UC4 e5k6AeLWwK`9w)B |E r!n+uw7NJUԀ4t/X 6L6 ^xV٩"j@ټ0;ŸkjXGLJ3=(N\G&7inzha?7r[:ikz|c| d#q2|PPgmKqS%PDYٯ{>o={1)]="&njyXE`9P^xN(e?>ޕ}@:G&*9rd٧Z6'b-*]m(GʱCИa `rv* RYelptcq>2h?|wBuuZT!<,z,w5IGj'ƒ*˟Oi8fsNCzorIw.`gd؟Kx^x0#ye)p6yIʗ4?{~rKkG#4 Gdn>y,ȼa<AҾ4PN""1 7/JI딖a f&l^- &v^^ao@ug(3$#5#x ;X{O>}:Ktxqqc Ng)6gAKig/+޾~c9ψw7A`P "E] nS̴SPTb)sc,RG0ϟGd6M~䗆(o:0X BEO>ȯ fMtCdh킻 `"y'*f:DflYd&eK.a Ob]^}2jD;"޴&:<ǛTnupEWf5³ &N9)+yi+Jn+d~= .-1桽έhetn~Z^ƒcXi_x-0=آKCIQ秛ȟĂmHnEOZd08vwvxg "Y;#6>ݲ&8a_bEvYi:,$#IzCmַ  acx9R]4naK %nS nQ'}o{uyKCiqő($I_c gng^ËՏ-'8Pzf&I.1 LRV,xF( ܋^R;}OX5s#(|ijCf&{=ɅĪx bO 5[2 !PǍD5=3eXUhRqS3g;j T PV3Q֟}+mфC#-_GFoQ;e:GuҢW!{YɶZ8n6#gَVe[<5߼S.%gpg'sPpH)TR{ )h/|/xEY'Q2n?իo#|$%um%=K_'S_v4ײyE8+m~!q(O4Uԍ~a a{ RYd]~S.(@d Of.AblMJ]fԗo7Ǐ]b5?i,/HH|ꄻ^ Xtl0ZЖQ$KC{kĨUqfb7Iv7}|j3VY9>#rUw{bmYˢ\8Lo-Y#yH Ѽtӿlx8cXl MN~e˛{r]^UҤb6`Lg.Okx1^|? Hm!UJtkѠu@RdavK"n,qqg1O̸.mSM#]ܛk="Z$IAua ( nl: ˯|b~(v:S4JigS 0b,ktm73%`SPF~F$ImtV:"3I˔ {0kHmťQ1QMsɬvEaRTE|!v//ˆvGEZ]U(*b P[9ZTu EݥTdU{$/Ȗ~!۞WLv}J&hݺ}N`+<`vsrN])AU0fv_Umۓn1c=3Y*ȼ [G^#Җ~|[,ּďpԖwZku>yIEmvc*|7tAZ#6qrxYh%Y ǜGqAzؐrHɢkWL%Qg (?"XۤY}՛y۷%M\ ٍizGTok95<[پԚSLB8*%yy#vm2,]Ֆޫ`Ik7,/*d~`N~D9IP|›<x'k"U q^C%t7J Wܠ/\hѩmn>ҋe{ŕOL>}7ڄ 1b!O7I0i.*'?2\E5ʰPi/U:Sv`nɋ5@OWg.4kfqqzqaEDBQR3}uPO{.pAOUћl֊J$v=g;`kՁ[p)\2'e WzVt<T' Ru endstream endobj 188 0 obj << /Length1 2013 /Length2 15256 /Length3 0 /Length 16492 /Filter /FlateDecode >> stream xڍP )][qBq^hqÒϜ3Iv}d&$J ¦@ {; #3@T^M OAf OtrN3 d\l,lNO<Vff;Č\-M{;3<j 7'?¶@'K#;hjob y j> ȁ͍֙\f N@S)lOPtjor3r 6&@;w;S;@UZKX/z0S`fi(J1A#;?l\,m  ! 0zM,@ΌΖ62ۙ@'f4y͵w235# S&u;KG2$h@ tM,p=/{{@K3+rrx`ji-Nd>~,?^=O?IIXRYVwx1qX9,,Oddwҕ3p{3@ז .3qSߔauoD.66Zx->.-+ ku偦.+ 2za;f`agdfn,a4UX557K;7̻3/->;~LMX6VN{}+M3x`fGc99LB&''f?$z"zדqޭ(XL* 6?݃M俈gbo^P+ d}w^W#gf/wd?ӿM 1Xx8X;_=flK/k_=:v6@3?T-vx_E=e?Crw,]r|_U|9{6qqzޘ?&@;Ǣ W5~N# ]_j+=\G, xB?f-ykfNmfK=x,K[ǐEeZhBơ$eK] U #"TT ."N*Z.irK ;C+e۩d3R8e gs{}O_P;O fJ\J]EIH oA&CnŒo gSvHT+d*+/CX=Zǘ&-W;:朘9ZH?Ѥz2k7mI/Icdc0 U/GB A x":& ( >JxbbjAg:=7}̱_d0 X ˪5Bt#u0T}Lb()3o ]o yQ&hdIz9Zͽ}|=|KOQl&MkRbrHcoR~0͗+0Ӭ%?Aw@_fAk C4Ϊ+ޔV5"P~3|9r&ߥGL&8m{k ʂ,'c*tx.JN$b#Qv(m^\F#u#9cC*Ψ{S=\>obOeeի`b_qAUD0ώ&y)>JT*kmÐODv$>ݑ6RT7Iݰu+Š6 _Yd ?Os!Ck{]>O%@fg|G)e@6A7Xy( uI?yTC(Zg}7=,UH&mC*s̱Cݚ loN$~ p̃FsϲM{rP=.l&k MNO= T,n_rSޤ5n>"2; (\ؕy\eS:D}]oA`YW5M<@鋳5Lb R@?&tM[4uMEIʟQ ": >R5b&kOn39Zjފ\ڵG *qPoL9US*'.1J2[%GazN]KX l`^`$#&c[ӄQpІTeh9?>L: ZBdS0]E3^P9Gj3wY\L2Sb/Y^=f'Wϱ%\O.kS}(6hhqLkiTԬJz|pvws6[<ۑT sAXqo@':d¢<JY8(b{qOX)m߲?DÊJ-tM B*\Wj0|;Ksx o;82j $V3.a]|g߼g#}a*8LW5u|^[!)ghpFo ؃9(Y/.;u4_y;&ztO{܊nۙ\Z޶  |#f 7~1lHĤ?)ؘO+=q M9 +j!4)ʒ=Sx0[>l>&F7Œ0mBo(6x4 @G@冠.PG]$u HTfna <' %,D= ͎v gàgLw4̯j ᜦ`MRg7k#'] !jf$P>sQpĤ,k\taLdk;"Ty r"sxo$Z+_Xu9.9n=EX=u0D#D3zrYn4U7T7? bׅqelj?RKZLnzdy=@ȁ" a [Pszp p sq ה媎) F$l_mӰvq5ޘ4:^R/@II qSѩh.uO6O>"q#y| 7FٲG7m.k>\vGx Mι=W3b鈝Я+'ãJUhz! ^r׻yӚ2ϑ-#O,u ރ!9N-# tI &*  $ .(dT|J3Y&-`&FB- qM7䓏#Tj|B_:[*&?Xeeu6 ȓ/-SU@ߠ "![z.O&̛&~0PZThY-,HXU~62kX:+1 z=Kjz ]Z;v=/ν6)oͱ@;T<i1`ISHMÚ%#m/rq|GgUh%p9~j;߹V=~7dB~&[PyymGg\jg'Uˡv=պɇ%#bR@RI'xB0}߭Wӎ'ܧ3"U\BŮ{'?aÓvP$ ZxvIj \PԱACT4kCf]\Q>I^GQ=zʼvn4P>MvVBQ^BWH I MA:mNW~mt:}$}(VAkpZ dGG=\ >3讐ޘs(eJ rnz^~ Ĩk؝( *Q8E 1~9'C[p[G  IW+#n\(ʔֿG9%ωAsY થB?*iI>~?t1QTu6!/*71Ik[L2.0fJFH۰Y:S Ĕ)K!HHh3C8S)wmU$w&ue_ YS5 eykaJgUH O$XyÈH7w>olH]yL144%kPI,X*7iabsv:vA-Hoi3^S⹡zӽEsq:D5FIi u曇GͿUo6>d*"~mϺ[[A[~:fR4+MQgt<2;x3Cq*-W2)M4D-J .f{K0AY߃}g/,QIL Fn?7~e*kj+"XĀI@% ToљT*^S#X{E>ۄ7i'y1Z/`{Y~hRsG]&+ bXć _qB!uй9}Ցd+~'頕5scێB2F訫 HxMOx5+sh'mL61*/y$29܏gD!x-vJxǁ j*gs5W%QEo`w%jRPw*g.{pK8N 47ԩվ̧dC/z,9)hG=hQSgsSdw^HNw>Λ"1əG-;G!M| mAv$ `=mI`J#;\Y! $IՈdVUpgʷv tmzR`-f_n7Z] G\o4D"tL7I,%vīM0l2g)^r ClLkz~-q{g>>kB1)zW{\-,`jN$F{G)<$^k0/g+j8BDvA B"(YFX̱N7d.S_YBѱ4K8]O t_!6ʦex[y*LPv>? wW si1Wr%:EHq>dv1ZN$pMx 2Q(L# Dq(aj~i)}E=`Bk~"JjNb`>_m ?cY`tk{oΙ-c0š==Os u$oQ˧&Eׁ E ]ƻ/ؿzju# #g14\\> _ih~~66N37Ww;c:b,"J(#CNfq[.d>qW_H饗Ju$/)U[[kLz:E!p_MU\|  0e_< 374#-s=5Ļ)˞HRmsS:NYO-A@+s2}Q0NbOYKȶntbEY`us'5 0&biιBLP{|?ί[ ~c^=$1 !\uvq5:y}j>CQW] %_olJrBqٚ0*a]:rCee<ܛ /S:R_}z /KD4@LOIS_ZA:,B-XuK|C h)'.I=m' r4\5#J 'L2j3kP@+=qIMk]U#D{kT$+=r xnjB7<$Ul:KHVZKXC)A2@l:(5cBѺGs2ӚRGa'L ]sHv`򱭾!6Y]K>e} (uuWGƒ&ҷ(X#܏A~h ^yӕ!;FP5(_V2B>'t"W[R؊;PP/Xx5mתYڳ aѮ@.YRW6GYX(EntӥZb:"''$뙪y/u5AO?:pT~%FпInn1 ֤-dyw VSxs?*Lpwa0{nƭ|@=V'cgq6irAk gOC15Q?mjx'eY2mW!F`{KZ ]e>dqg1P&M5;`kb6$ѱeVzY 9{GHN򚃷2fmLWy.z9COA⢃q?5R0G{+G"Ҳ֡Q@3-Y D)MP7V\10Vh$3ض[m;S^F}1(?a*g.A9S2![hE@ .GIT Ha*5b$#yzU6Y]z~̔k2t/Ǭg4q!RX7yi?6y)&50JF&ȶ( z$ZnȦ/WתyBvypk3'M9NNr&UdUEk4Luv b+J4hȹ-?nsr-[NP>m1kdyNOt~w3Opޱ8p+ @9Op s l8VF:X58uEFnGwL ~2OS78 XȒ-Njŕd,7ٝ{ b#XN2)βGf.PkfLH" 4o3TɮN`^gQ~+.sk UlHVh9: $TEtW#?8e>UG_i 5?E:8Xݱ5@b}Anwb!vn!XН^,J`Yw1:qa^ xR=k#r01`UH7~pkZ/U& bf(V^- Vr3?i˯5.J'16RG+yDT$FNͪG/_ a*]4Wڈ_fu)iѯNBfZc_brc42b?V dSKyII5Y|p'boŠc_3wM+$.rJD<@n)yq^G$NZXLgs Kq;s 7]sDuGIa%kM4N# X|7ӗޡKUW1O ;o#8fr_c iRCKu6?JҔ'XD tQ'"MϛjLg -]$~1Q1PZ7IZ`݋Qq`vEO0ЭƙAodnHNAHo&t>fki0b5nqII?WhvUn|[z=Thw`_c*ij]ДM15w$A?mTR(5re#ajSڻX!lfE=jacZ"=x%v)DʸNXq^Vg;PۇBhZ\OE9C758Gږ{w;*?{WԎۓٵlLԥV,V &wKaN3?YX N6%OesHC'i2LX[zh[QARC{*7 |98:֓ڲy1g)rA&4&:Y :r-;\wHGchѷ:VRoSqqc {N[0AMkn$ 3(f|4鉖3:lꂸ!R茢!Va j.k߰_?}*x-.!qO>ۍ D_5F{]oΒ4(є<7^ݲsi:ysP}9LݙV I%tU[^uihzX#_s-Xz,Np`v/>(NaD5O--YúžH춚AQhG?ePÙ^.Le;L2 : JD) P` %7ɦ5z XiǪyy>~3C޽a%@C'Teq PqblC LWyJ)i.V;{pQt_- [(r#d" \gv FO^I,-/Nhxe}i,boϨ^oȭO,Fܦ'FttZcj8A^fOdty}. ЌUeލ43^|kM󤅚)Gy;WUjFd% Oůso)ʨ:[)W[6 0ôξwy#4AafK1s&̣Z/śVcKz vGik35s;~ 'LRQqn(xPd[Zcn9aX y{ mHwggPBO{Uc1߷|o_;dP'd^Ot"c\'3^=YysD+Av՗6,pueL$IsE{s!fh@'ftvtQ0ئ p[ f{yƽhpV#XmF0[Ǵ=2ִ-)==a_ܥNў=wgȞ^ܤy[7^J쁟Hm,=*я"Sz5^7ͺ"[Erؠ'H':Q&}t/EdNQ5X 8.t_~gm(z>9-)C|sBgAZ24[ÒiUɺ̋Q]&uȇ^+v鹸R 8#FpNÉS}+4 M(. ,UxlUsBRqc`=5ȑxdX(r~aڋPDY~3N~;:IlT}}!c̾6ٚHx,p=0līfl\JEh UՁڎ?(WSsQ->7<20$ZxtkYd|!TJon/pǒmU=\&.\Wڢ/ǐeR箄5WwBœd9r~"P:BKP9ѵ^ Mx^-sO5?(N)(iKZ4mHϚ1(vjZP[E֕hsIZ;V`ana&k\3X=R8 TX];1ӯ' !ʹ< W-◛$Q6N:oE~z:m<7N>fD[ \j9N"Q17Vji"6^q爷M 9mUJ!7,d S5lmR!.~ԐRIևjnrGuQ׏1R&d* hYLRsw/O0"WBW<͟?  "J&lTƄ's}1'kpI09OwU,o-sד 9ьiG%$*SJdC}'ܯ{3j!Bj+ ]4U9GMJU;-ڥb Q?}|SY.׹Z(sp˒!Zԛ  n"8VN'!4c[g]L7RFv:}cԩ-j}WὸKԱXU:d/prKg{b F:37m_f8RVELZ ĘfAsFk' Ϋ=J17Fcc`mla!] N1sk.tQ:+Ybn8 i$x'8X'9Rג!@32,;qvEM/]55d:[W?9K :$7-YW;5?KWLWҬjWt51iXOOs\}ٮCt Wݑ NjTf1;[M׳4΀/%:MiZGF\-uxa˻_F(Sel:R^uJkP"ދօ{'M9}F%}2 '[~*V*.S\ 3PAmD? Ye7IaG)ޣ['e3VmGtX KRmƬjy}>c =#pc3yZ Pwo氅7yэdvOX pLL(,m^iQ4U+tX;^{W&oB(ךM!ю $=d¢%R?yaΡ4YܸԔ> H*P IV 4 ^t8G(b)bO`H=N-/iV 0dVf|_.Eh c"槤/]GlpnhAe0`p,-۲汓N%Idp{t>PO6ywl(,ucyɖXRDw>v*J zzJe^?5;ax)ޅOi.CWE؀yL%휾ZU(Ÿ0k)˒2H͎J"ET^M IзXVi +rFVGPup0bRsOD]S'YW;Bsлig8;(u6!xt gP^ʬd?ct.'Mj&G,, MFC)J6DIPO=-@=+Gw4:(,RDA6zj$B(r:K$sAƒ GQ%qNeS*Gpv%94e4CQ M%r"g8BJ@hm;ܜ+K4sB&)ٸ fqwԱZIvK"RoD` utuGch'? =,}Q$g ek.oK v[%ƢCK!Iclw⌡fOj2F Pa&}c>O K4h?!\|96&vAk9dk[u9ޜiFƜkZf.c|?ͧJ2DcL\ܗv@[5|]y endstream endobj 190 0 obj << /Length1 2480 /Length2 17650 /Length3 0 /Length 19111 /Filter /FlateDecode >> stream xڌP\ \C'X. !H]_s=꽢1}5ڻ)HUDm 6N ,̼155f33#33+rO@Gs[?,N P l`app23Xykh 7p17(0dmmbvfN< 6p: ̀֠FVU[#s7srebruue4vdu0;T@1௖ZcD;GjkjVF@G1P(mc,z?XY _mv6023q71[JNnN mA.V K7H|:?G#s;'GFGszd+ f c1[kk#_;@3s66E&6&al(# H[f tp033s_ +YzzA< \'g矊E,,cs#'!wth :s763hXM4aƶ6V>bOrb*ZtRT ``ecpq8y8E*1XK- g=hK4@1a`6}]_Q_V$le??zks+,@s[&_SuWhll2N]1HsGIs7߳ǿlh``af?:rYnGHv3Jdwf$rp&;V . M] Azӿo?M@D :? sXkATZ{w*P,`:AVف6V@<#uzAm؁SQal46tX@l/t.#7'G+G?BR.t2998GPN8b8FPοF"uADz 2rv1tl,jE\v)vSi<~8?&Te;܊$ D[ٖ^"y+;nTqd B]'ctMP3Z_C |7F(`EHsh2-mk&cHhQD d?EځIF54i SԮȤ})d&WR>˯: 5@tK{;aQOtւ@UTmhM:v!X%Fn,akw{zG͜痱蜥aiUh>טiiZ7{)X#'+Ȍv&^eه_tͼ'TDf 3nV(Wp"W=XK௞}O XMd)VYQxRRF`%=DgQ]gѫq#1\FҖj+*V ~.#\:mfYUGwrzW6m䥼L!봈D~}`p^4/%^'JLp`0fS~gdr^4ZpuQ `oaO 1M؇\t?DZl-23@i~cu(/>$WMO ![zcɚNn 9M%UwB ۓ庶&@FQ0Ӄ#Sf#ic4]w>ܶ*.lZLy, g5\//؉Ϸ7^L-va19-=YE[VTÆҷMxEE;KhX{Q9D.ӧc&HFX_>=?16[Q:Xv ,޶~r`'g" DBtao<4/L 0b"%lpXOPWG}'ċW!^8Ÿ_C\Ī"ےP5kч[Je}y4y"Nt)cGGp~X{^c`id_Èi!sOZje#BQrjf>p`j[x}Z]ORO%s~-V€k"|SS4UyP"XڂX>wtƗ>-/p\Uvkwh(016,VNll=[p>jHfHUn:DZ, nٷ2om%Ǩ{e̗ uj\0:HJ<3=w[Z5x>Ӄ[zQM( ͐߆u_iD"癗X.1WbD#1|!pn^R8]txNVSA;if&>B 5$b\կ!2e}&q~jd&QdPBW"xcDbVy0N( !3nʑwLh& 8-a NhM ?X95y?Xoqq%.cjlyW/.$ꇋUG: ?aGkS1pь|"IH6 5vP4{|lykeYj5kTBpwI'K {Yyl!L!L â](g&FM?M|R84Uw/t>rJ;n<ݬ;bjDg9wMn4+PYIf /c3VÝa ل #}t]גml|OcÆi#KeC8>ܚ2Aj#UJɧ OrDO)%Ra]?e,,gnj7t5itzI !m^v2t'fؠ>쓎-ӷSzvC"ډMٔ/]Ե&BǸ#C .V*pxq(`]iG`S,xetS8fWQt"v guW*Pq|($ #z fndR]h or Ԧ>$ڍYdK5`㣺)+G>}D r}5C$ oBgUFIlY28XRuS4j_}Y.MN>aC֔x oI=SQ!U4SWMȏE8sS WKUaVC%]QAfNL{*^Q_ h+h>0+`^ҕRŁUqԒ|#nBd$lXM>3am闾'QQ%ԣ)U& f~hwj妖!m0pW|ʉw? eT3EKYVU3H .0y1c]:zQ)%Fdsl(p:'CpIʮ1-ɾ/CL,Ο{ q q >wXw @2~s6pA%uKhޢ"aqt-]VcF$ф÷NJD19khn.Z+ KYF52S)=u>Unʇ0z~r[k3x8] dɱLS׽ћ5wlٞ3Ԃ^\7>nH&:*PfQ!EfvPE/߻l~ urxgk(q?1QA\﨏+&nwm%N~#E6-uT3$DcvƵ)H-:  8vìs \S()Qۥ^Y"2FPYϧɏ}Z%ݔGNp\I}PTF)jvcxАKjbEUa~wlowؤㇰ4s`{~q.EU;b> bb+o 3T* ~N!=i<2Ws')0b&ʜĐ9L ~_5hD*NW\nER8D{\E9P)%}H賩%m*aqv]IN/3 ǣah9ۦܘMB aLv0Ec[ŏNL=^|b`۳7A!"#o?k~ 6+8F"d'W+?0H,TK14ːٳdu֔-k6+NݞHu\qVfN첮@du'!yUTܮ at.QCdAߧKJ|7 ݰ5Y#Ռ/J 7{l3~F'F jLl ߵOT޲^W dy,J LXxbІ\}Dx:fB q<[#o)l/g٠c9,刱{phs?n:u(#(ED*ψn?YaScP*D\z2Ϲmf,_|&uZ"-#U?cCY]ՠ;o>E Z2b1,!"Zu;xJqRp6$Xm1x̷9 _jI\"#cZ%Թ+d4?RφHVM6IiyGPR7=8?\u8%7@N~(85[/cR|l5M 17ifT\u}5ef,;s*r =. ukHy3\ 4u~M!Wqqdamo&04-j^.ª |THRB,f7~mNixޱM^c o^g7DBo$!:uexxh{>"/>g_$[;-&'G{(=kB >$r>U+~(%0$ڌujb`< UI=*+jR ]QH" Nt}rFVH/=XTLS]͚D_E+p.*ܡ 9 }(4*z]vi`#.$,Ej u0ԻŪ.1ay2ʄ!lOĝH;/guP,tǐWm4X>B_o-y]pza\cgy#4,ْ)iAn$UH r۟yvXct2}qٗBȋ"K$fƹ( Ĉ'c䷈ >R6$g=${/N`_= D^o/(oƥֳFi\Njؤ?N-%O3f=&9U mqeLC\{.jf]vOs%R՟ c}V;3}] "!h5Z6M &0dH}8a&"dmo?`MxyX$i+oXxI0]h}ح洆FӤRQJME>3BzV6yt*8ҿ\0ӚD*P2ൗ'@bTeV<ӽڢw#Fyt@%TY::Q@Pddfϟ}0못TCp>)l tI{hCny |.(%B6 IЀ|6я׮ p+GlnpB6ZtbVGƸE"%zp7!Hηv{6T;d;w2)&%}7 F5+,'+rnXl/0nrpz͌w{y6?j\xV-4nHXdT9P+Q9[ZV'$2aqJ;v"#,bO~.$AVV}6>0Rv+EZ0!x)\L0؟N,JV,nI<cBް7}mv8sWOQQ=O!3?V؀ƒ0nfEc3Ћ/!Sr 7a 2oFTS5<}kZ̏:=ruWGm2W35&X'+K4f4"_ka fŽ͜'пSͮdbCPU,&+M*Ǫ:ZW3 s¶ܒʼnxb4cFõs>}=_Q8rWS8EO+s !иT1d]s-UfTzL9]L3Cbb, r: p/kپR\!9ۗ%ebtH~YW@ha ӕZ["۬? bٓ9LTIYbɪYt*gT'V yJn}?}FY kq{nGE2nT{KؔWe82勍(iLG;t7O3/Ԋ䨬5p ^tȲʅgkNt7ֽUfUt6pѯLT.Gjq:Ȓ)ż[z)5cKNiCO&pB5?ׇ赇 ځ3U/piTV_y4[p?U'(PB=>I}Nvk7@@Q4Ҿy $"r,m$ jҧ) E]Ji $_5О^e(wń/J-7a*@(=U[V.*^IofvbohGAYW4%h8]q5c=yqKȝί61$- E LjE0Gy9ve)jw/4T8a]1Kj/"=Ff`5<+nUZu-΄Vc}yz' E8kP}%TM Z-٨iU+' TR <&5uyH>ruj d~ڏu"z.A8cVJtn[\5c-ZM~ܽl ̕뇉]Q7^sC1'RY6QoJL,A8A{kaREқ6+RLhѠԀmtơNcm\ڢ}W=aVMPubhtDOwU-5z[TT)쭱:VGmk\T'5g~m8/ߊ671ڸ2wtםN7SWQJr 6~kr"ln͡ <6[yu~jCB1N'ގ }?etY$ Cr,i e/|bbjYJڮǹhrtbo|}C\@j]߃B!Asú7wTz+ g 2W+,3t|g*OyCC2z>%9w*soiNa_Jqԇa+Lu˜Z_f$Ǧʧ9VpMԟ z`2o `UQ*wP~ !}mG-e%)dw ٱ̠Y\z@9 Ny)'+*Zjzr5#BKo53QGF.=|FRt$3KLJc 5^F_KQaq`Buƹ0`|&+_4r[q`fs[f7ϔxgr\27q?(Sv eOꋁ,+Lx$eG./`zuNYܵ+ߣhd1eB -36Y5dH6t呙KM8UH۰rqjKœe2Ƙo m}jXg{޻F!rZҶ 6 +>v}ߌPWu(2s8R |F;Lʯv.ufϒ;aXppIּX&#{tЪƾEaJCFJuYpUbg>c\Q][ڠMͤ욵6b]Ek3ٺzZ`whЅgȼl8Tm^:\OT'|wxHRs̵l'lF9˛7; W4Wk0D΄BkeAë!^){+\ J;RI\KUڣMFOa`i62A!葷 ~z*br \9QG3|<3 spHsL36qKX;Us"YJa W+aZ}VINAƬi}qBC/I稡?원ZJ0o3j,&Ȳ 5Ӌ_>~K9 Z]|b:{R_rي. fPjmN^3AB]aڽ#B$Y6 !.LfY XXbc+/ъ6 l`0We(V(5XeT;LFГFʀ*+ZzA,;yƌ1AOI~]W;\ 2C;JdPZ*}NLT岿tOanșZU'(ס\.>aWv5I%'p9]pU%e= .: +N1/tydӘ}/ vpr!ޚ~v_ן6 4^ DX nrGTa:}T.O'k@>Vֿ6e[f m̤Xxz?7'FU=]@ B2MK! ݤG7?1(GǙo}ȼua3q+Y!PkbEfSZ;JCWY#>4WC!^C^+~I$7k,6ц &9ɕƧLcFkk7)j.N6E=~hH;!E{io\G=J~!8K4̉ɦߑfԬ? ?O }x;"(mF \3uKq;QuɃv810UMd+!]4^m C9= Q#Bf= E,;8_O8%tzbا4Ov)'êssk#,FSjqN5FHUo 9"@+VTAmS5 Knĸ#r5fl1KJЅYAQ;kAҕA)Lyz1zXgK wmZ!1gsAkO&}/9|x?Cp8OΑޟEHI2g?Ӡ'Q`l *SBb?kab|۠A2pLp>ŞAq!p&P%XZ3qCAngf)ܚ&/Ax!^ƻiah_ٻ9nPwNSqz*qh:=/pyxSE"&8sU*XR pe g^Ţ{G:v-]b8STŎKZ)r$1Yېu H(h#9B3J  oX7uR/͐G``7F1&O4cyH-G 2rX%z4%!zXE~38V#&޻BL.3q>LisNe{l@oChߵLYտepQ(1d攵ߡ/WraMVixBy!}zbs2HG4Zo.3 d 3p!f"˃Nxy!EnTϟ)[.x(2IX}kJ~6j;wW70^Bx-}兮Χ,ҸDvߒ\]՘bG+Xyo繶 L dUTiFHbA Щf_P2l(QK)7 S*>_Kw ^ [M{?B2V,Y;+ݹO$?$;l+YsP0iPXɜ4HGѤs?pdQI͞- DƍapOjw6aATe% )Q)J~5A%i_9s E}:H;*ndmM8ԀآVҎj}m= \MbQ OyLG^7JGa\/R"uV'B.C TEui[02yAv#ÆQ/8EqA0z]ygIpisɑbzѡ UY^Pz%I<2$Sj CXoE{* b?5޹ZHTrYxFQ72gmIj.jje|z6rs>.<ȓ}>E$ƹ8W7qamw J7ܕ}WJ,e~#ɱ6E\Iڝ Cݓc|UNj¥,kDv PiS. 8"TJhKѭJt%"xtү_dfo&cO k çXi)&'H]G3t]]$v($ hZstyEU fހ[o3&`6b`Zg2n4a(D`?d~[q#t*q ^X^>몕 o6Np+4z86vp+& [94+kbȾ vgVK' |&(c2z^$ŪA rW#}Vdڀ1@΍PL'tMP; j?nEXSH -WuTҬ/oF}` Ugr6tRv-r&::ts˘FIBeP< h Kgc^UT8;4WLZ@ i{kI*(1$6YSof4edeEa.D&&Vʭ'A} %絢zH/[cFj[_ trQn=؉XwwD>BuJ|&KaW >t.tΓy[/m7ݤduB0t+{G|T=G0XGu=E(AX:nuEExH/DuQMZߵ3΄K+$vaHz(ùhPK]*a,$ $ S*ͯچd_gf%WzUK'܆</H&baդWJ`I%s s]cQO] h}r&rؙj6=oxC̪l cgcTMYi[-QW͓^JyqA:s{e|hǔ;ʪSwyW2dpx=Җwcu$kp.qM sJN9)a^MeKG;t ɾ 4/A7nKĤE|Y.S9$dLbcX I×Y y/?vde+VCk$_J\EqV 4 ڨr'#A6! S%:Srg1)1yQC7qDmAPTu@qԒGz#ԶN+3`uE3BvM!۟Ww>?6S'JT S;P#=k|HQ>0QJee5/ӷ{FqQ W0ۦ |T~adُ7-!Ii'3=7Q0t/!,dͤ q$Dw="_#hJ ֺ 9'Cz*gC!<kr;1:imF[,4E:tY<1&:├[ E=%V#Wap5.ip0fs*-w~>rp?G[UߦvD%rDžHh.j~O1 O^>Y`c}Um  0ng;0|e*mtR`qRca,7eڥZzSr}&/?9=IaE.g2LGϡ.L!R~6`A.GU(t;+.W4O* +i3)yu#X2zQ?&^a+[8]# _Bl@(-Xy YY1tެT9KD)Ս15ej~?Z{9A(Y=)%GQj޽ԑV%!d?qSkWgJ΢l$Aڳ OCdavi^@Q[9Y,z=$=l|%G+̓g$=ËnUcm?4NF;sY_e-JCs=suNUDj}s9mPlK0dzcULrrwڬ@Cx\X$ 0T[9~GĭJU2*HȒG6kEq2ۭ=^sə:LG.¾ ćp "W2_|cH Eő,+/ΚU#ߌ#>)N ΁vr[%tAh/%}Fo*\1?gGÂYsGs;  . tr~j/sD$|j:vZÐqaF:r;^~fR$zeo!< x‡w)cSQ>a?> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> endobj 147 0 obj << /Type /ObjStm /N 63 /First 569 /Length 3440 /Filter /FlateDecode >> stream x[YoH~ׯc  'X2<2ms#R$~)IX`nVդ&uB&mo0YLOV8  idµU0PZ$9c@'bHy$إM%JX`oh؈DYhƘD+A{ TƙYn|Fbk(2|KܭK1֦'e8NS j j8Ky8РJN8CX&` T F%&e $`7Aʘ "& +`E.H1 @@0(wZ (JrGH=.Чq7 c)XP00qWʊH4}F UfI ʩo>jj~9R+G$Qt`5KY%l WV0_ t Jel؀{Fy:&#+Y'edza-_WHAS{4ȑSuJ>BD%cY )EWmR_m=gS@+ G W9q 0w KQ`ޛb|Lћڠ 1-S %z"<24gϡ[JJ%_ڂ>ACqEhmMvX cє@ g_NMuwH"!0`'cq:5d~`wUi!nB] )npΧފиCazT}cehsAIXP(**_@a  qVZ,Dc|v7Z#@u*/4{F(SzlcWK o&=끲~o!]kU5{],]]+ _?S  <b1=}]4}̵]&aeύ`3޴Aԫ<2X!CsuuC@yF+D ئ>~[*k\ "'l*zb֨Fz<"b,:|@>ڂ%GcmUU 1ዬWT*1w;}+N#T}9,OsoO@j3K`!hom$~]Y?Dz0rrdJoDk͓g*c(٤DX{d+{70GP {nf%~Pf3|#&xܦAV&/$d%dc2 $%dHtBUͲ"/HFuN/0rKr2"c2!S2de|zEf E%,#S2'_d _~Q=?x] LVm]l9 cmT&Ώώ.N-g䊬aLW:M&uo<;`E=Eut*g{6IL-vᆭp ACxHC-xBNn2yFkm2TZRH6J[5OG[t>&zrT@?vw ]3'ƺ[$κ,2f^̢5TI 0 z B.~5|'߳ٴN`pbѸm[} ٩mlT!uKS{q ;< QGG:I\[)xq:‚8]b$s?&y=Ia*!fKRr?gjfLGtԏ~8vQVs=:p#,94OY1β3SKywFzuq kt>&۟eЇo ۩#nAZN3>jEO;IG|2/Fu NO}~-mL? 0X &,gusS/Nޜ>)yxj29\өFmc 9itRv!ܭB;s}ofBY٪Nx`{`T*4jFܨ:]yR0](rtO!~3Np "(\:S\PL ﬽5AZ|V4<~9ϯl^<$έ)ޭ5t%_/lww[M)xYoajJWkSx+o:9Mփ~ >. =Zx/H5ew쵰c: 9|n_ ;|hvT`-D]~]UC];OK Ԕx5'^y)|=l$'˔3O0tn-\>6|'!ޱǼzB_?5X;"pD?$0{QzpΛ7~^~'7=I8@%DIIȈOpܩW9 ߂':)0 g{ O$0ˍy Up.Mh}It}ץ5&j)~&~cM8>7/׃2/b |:nS N:ˊnAlӫ^&΁7fe~tWiwHmԼ?YXpa^fq◭tR~{uZ~Q#Nt]>92l&ׂtrh^bښ?_g_&f6&FY^ oC* 7 tmmE_74@5;eR P0^EsJh,VDkuFQAx`1U YSjM-ob}Dd[@Crw<ȶ/ MV _Gӛ^r(Q6s&;^eV5]6, endstream endobj 205 0 obj << /Type /XRef /Index [0 206] /Size 206 /W [1 3 1] /Root 203 0 R /Info 204 0 R /ID [<6D6C98CDF39A9837A42639932460DD8C> <6D6C98CDF39A9837A42639932460DD8C>] /Length 534 /Filter /FlateDecode >> stream x%KOA[JiR,"hUD+PYjLX0.x5Nbl+ $]4ƍ?gw陙cfY0)H$A6H8BZ5jPhfcu`+xD&3pZe|V 6 B2]NY n* ݲE⫬#lH$藕 {a f]7 *xUò> ?0![SØ7T`d k9G,{5_L8`R.pôsqN1Y8.]=K0$=g \kpp&܂۰SjDZ9ʑ4pm#miX+e:iS賧TAZMǬ#)'yQ!SkO /{+=(y멠^3OmJ_+?CɇNΉtIsHq&e&P Ag# endstream endobj startxref 283246 %%EOF flexmix/inst/doc/mixture-regressions.Rnw0000644000175100001440000022017613675321507020235 0ustar hornikusers% % Copyright (C) 2008 Bettina Gruen and Friedrich Leisch % $Id: mixture-regressions.Rnw $ % \documentclass[nojss]{jss} \usepackage{amsfonts} \title{FlexMix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters} \Plaintitle{FlexMix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters} \Shorttitle{FlexMix Version 2} \author{Bettina Gr{\"u}n\\ Wirtschaftsuniversit{\"a}t Wien \And Friedrich Leisch\\ Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Bettina Gr{\"u}n, Friedrich Leisch} \Address{ Bettina Gr\"un\\ Institute for Statistics and Mathematics\\ Wirtschaftsuniversit{\"a}t Wien\\ Welthandelsplatz 1\\ 1020 Wien, Austria\\ E-mail: \email{Bettina.Gruen@R-project.org}\\ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \Abstract{ This article is a (slightly) modified version of \cite{mixtures:Gruen+Leisch:2008a}, published in the \emph{Journal of Statistical Software}. \pkg{flexmix} provides infrastructure for flexible fitting of finite mixture models in \proglang{R} using the expectation-maximization (EM) algorithm or one of its variants. The functionality of the package was enhanced. Now concomitant variable models as well as varying and constant parameters for the component specific generalized linear regression models can be fitted. The application of the package is demonstrated on several examples, the implementation described and examples given to illustrate how new drivers for the component specific models and the concomitant variable models can be defined. } \Keywords{\proglang{R}, finite mixture models, generalized linear models, concomitant variables} \Plainkeywords{R, finite mixture models, generalized linear models, concomitant variables} \usepackage{amsmath, listings} \def\argmax{\mathop{\rm arg\,max}} %% \usepackage{Sweave} prevent automatic inclusion \SweaveOpts{width=9, height=4.5, eps=FALSE, keep.source=TRUE} <>= options(width=60, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) library("graphics") library("stats") library("flexmix") library("lattice") ltheme <- canonical.theme("postscript", FALSE) lattice.options(default.theme=ltheme) data("NPreg", package = "flexmix") data("dmft", package = "flexmix") source("myConcomitant.R") @ %%\VignetteIndexEntry{FlexMix Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters} %%\VignetteDepends{flexmix} %%\VignetteKeywords{R, finite mixture models, model based clustering, latent class regression} %%\VignettePackage{flexmix} \begin{document} %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Introduction}\label{sec:introduction} Finite mixture models are a popular technique for modelling unobserved heterogeneity or to approximate general distribution functions in a semi-parametric way. They are used in a lot of different areas such as astronomy, biology, economics, marketing or medicine. An overview on mixture models is given in \cite{mixtures:Everitt+Hand:1981}, \cite{mixtures:Titterington+Smith+Makov:1985}, \cite{mixtures:McLachlan+Basford:1988}, \cite{mixtures:Boehning:1999}, \cite{mixtures:McLachlan+Peel:2000} and \cite{mixtures:Fruehwirth-Schnatter:2006}. Version 1 of \proglang{R} package \pkg{flexmix} was introduced in \cite{mixtures:Leisch:2004}. The main design principles of the package are extensibility and fast prototyping for new types of mixture models. It uses \proglang{S}4 classes and methods \citep{mixtures:Chambers:1998} as implemented in the \proglang{R} package \pkg{methods} and exploits advanced features of \proglang{R} such as lexical scoping \citep{mixtures:Gentleman+Ihaka:2000}. The package implements a framework for maximum likelihood estimation with the expectation-maximization (EM) algorithm \citep{mixtures:Dempster+Laird+Rubin:1977}. The main focus is on finite mixtures of regression models and it allows for multiple independent responses and repeated measurements. The EM algorithm can be controlled through arguments such as the maximum number of iterations or a minimum improvement in the likelihood to continue. Newly introduced features in the current package version are concomitant variable models \citep{mixtures:Dayton+Macready:1988} and varying and constant parameters in the component specific regressions. Varying parameters follow a finite mixture, i.e., several groups exist in the population which have different parameters. Constant parameters are fixed for the whole population. This model is similar to mixed-effects models \citep{mixtures:Pinheiro+Bates:2000}. The main difference is that in this application the distribution of the varying parameters is unknown and has to be estimated. Thus the model is actually closer to the varying-coefficients modelling framework \citep{mixtures:Hastie+Tibshirani:1993}, using convex combinations of discrete points as functional form for the varying coefficients. The extension to constant and varying parameters allows for example to fit varying intercept models as given in \cite{mixtures:Follmann+Lambert:1989} and \cite{mixtures:Aitkin:1999}. These models are frequently applied to account for overdispersion in the data where the components follow either a binomial or Poisson distribution. The model was also extended to include nested varying parameters, i.e.~this allows to have groups of components with the same parameters \citep{mixtures:Gruen+Leisch:2006, mixtures:Gruen:2006}. In Section~\ref{sec:model-spec-estim} the extended model class is presented together with the parameter estimation using the EM algorithm. In Section~\ref{sec:using-new-funct} examples are given to demonstrate how the new functionality can be used. An overview on the implementational details is given in Section~\ref{sec:implementation}. The new model drivers are presented and changes made to improve the flexibility of the software and to enable the implementation of the new features are discussed. Examples for writing new drivers for the component specific models and the concomitant variable models are given in Section~\ref{sec:writing-your-own}. This paper gives a short overview on finite mixtures and the package in order to be self-contained. A more detailed introduction to finite mixtures and the package \pkg{flexmix} can be found in \cite{mixtures:Leisch:2004}. All computations and graphics in this paper have been done with \pkg{flexmix} version \Sexpr{packageDescription("flexmix",fields="Version")} and \proglang{R} version \Sexpr{getRversion()} using Sweave \citep{mixtures:Leisch:2002}. The newest release version of \pkg{flexmix} is always available from the Comprehensive \proglang{R} Archive Network at \url{http://CRAN.R-project.org/package=flexmix}. An up-to-date version of this paper is contained in the package as a vignette, giving full access to the \proglang{R} code behind all examples shown below. See \code{help("vignette")} or \cite{mixtures:Leisch:2003} for details on handling package vignettes. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Model specification and estimation}\label{sec:model-spec-estim} A general model class of finite mixtures of regression models is considered in the following. The mixture is assumed to consist of $K$ components where each component follows a parametric distribution. Each component has a weight assigned which indicates the a-priori probability for an observation to come from this component and the mixture distribution is given by the weighted sum over the $K$ components. If the weights depend on further variables, these are referred to as concomitant variables. In marketing choice behaviour is often modelled in dependence of marketing mix variables such as price, promotion and display. Under the assumption that groups of respondents with different price, promotion and display elasticities exist mixtures of regressions are fitted to model consumer heterogeneity and segment the market. Socio-demographic variables such as age and gender have often been shown to be related to the different market segments even though they generally do not perform well when used to a-priori segment the market. The relationships between the behavioural and the socio-demographic variables is then modelled through concomitant variable models where the group sizes (i.e.~the weights of the mixture) depend on the socio-demographic variables. The model class is given by \begin{align*} h(y|x, w, \psi) &= \sum_{k = 1}^K \pi_k(w, \alpha) f_k(y|x,\theta_{k})\\ &= \sum_{k = 1}^K \pi_k(w, \alpha) \prod_{d=1}^D f_{kd}(y_d|x_d,\theta_{kd}), \end{align*} where $\psi$ denotes the vector of all parameters for the mixture density $h()$ and is given by $(\alpha, (\theta_k)_{k=1,\ldots,K})$. $y$ denotes the response, $x$ the predictor and $w$ the concomitant variables. $f_k$ is the component specific density function. Multivariate variables $y$ are assumed to be dividable into $D$ subsets where the component densities are independent between the subsets, i.e.~the component density $f_k$ is given by a product over $D$ densities which are defined for the subset variables $y_d$ and $x_d$ for $d=1,\ldots,D$. The component specific parameters are given by $\theta_k = (\theta_{kd})_{d=1,\ldots,D}$. Under the assumption that $N$ observations are available the dimensions of the variables are given by $y = (y_d)_{d=1,\ldots,D} \in \mathbb{R}^{N \times \sum_{d=1}^D k_{yd}}$, $x = (x_d)_{d=1,\ldots,D} \in \mathbb{R}^{N \times \sum_{d=1}^D k_{xd}}$ for all $d = 1,\ldots,D$ and $w \in \mathbb{R}^{N \times k_w}$. In this notation $k_{yd}$ denotes the dimension of the $d^{\textrm{th}}$ response, $k_{xd}$ the dimension of the $d^{\textrm{th}}$ predictors and $k_w$ the dimension of the concomitant variables. For mixtures of GLMs each of the $d$ responses will in general be univariate, i.e.~multivariate responses will be conditionally independent given the segment memberships. For the component weights $\pi_k$ it holds $\forall w$ that \begin{equation}\label{eq:prior} \sum_{k=1}^K \pi_k(w,\alpha) = 1 \quad \textrm{and} \quad \pi_k(w, \alpha) > 0, \, \forall k, \end{equation} where $\alpha$ are the parameters of the concomitant variable model. For the moment focus is given to finite mixtures where the component specific densities are from the same parametric family, i.e.~$f_{kd} \equiv f_d$ for notational simplicity. If $f_d$ is from the exponential family of distributions and for each component a generalized linear model is fitted \citep[GLMs;][]{mixtures:McCullagh+Nelder:1989} these models are also called GLIMMIX models \citep{mixtures:Wedel+DeSarbo:1995}. In this case the component specific parameters are given by $\theta_{kd} = (\beta'_{kd}, \phi_{kd})$ where $\beta_{kd}$ are the regression coefficients and $\phi_{kd}$ is the dispersion parameter. The component specific parameters $\theta_{kd}$ are either restricted to be equal over all components, to vary between groups of components or to vary between all components. The varying between groups is referred to as varying parameters with one level of nesting. A disjoint partition $K_c$, $c = 1,\ldots,C$ of the set $\tilde{K} := \{1\ldots,K\}$ is defined for the regression coefficients. $C$ is the number of groups of the regression coefficients at the nesting level. The regression coefficients are accordingly split into three groups: \begin{align*} \beta_{kd} &= (\beta'_{1d}, \beta'_{2,c(k)d}, \beta'_{3,kd})', \end{align*} where $c(k) = \{c = 1,\ldots, C: k \in K_c\}$. Similar a disjoint partition $K_v$, $v = 1,\ldots,V$, of $\tilde{K}$ can be defined for the dispersion parameters if nested varying parameters are present. $V$ denotes the number of groups of the dispersion parameters at the nesting level. This gives: \begin{align*} \phi_{kd} &= \left\{\begin{array}{ll} \phi_{d} & \textrm{for constant parameters}\\ \phi_{kd} & \textrm{for varying parameters}\\ \phi_{v(k)d} & \textrm{for nested varying parameters} \end{array}\right. \end{align*} where $v(k) = \{v = 1,\ldots,V: k \in K_v\}$. The nesting structure of the component specific parameters is also described in \cite{mixtures:Gruen+Leisch:2006}. Different concomitant variable models are possible to determine the component weights \citep{mixtures:Dayton+Macready:1988}. The mapping function only has to fulfill condition \eqref{eq:prior}. In the following a multinomial logit model is assumed for the $\pi_k$ given by \begin{equation*} \pi_k(w,\alpha) = \frac{e^{w'\alpha_k}}{\sum_{u = 1}^K e^{w'\alpha_u}} \quad \forall k, \end{equation*} with $\alpha = (\alpha'_k)'_{k=1,\ldots,K}$ and $\alpha_1 \equiv 0$. %%------------------------------------------------------------------------- \subsection{Parameter estimation}\label{sec:estimation} The EM algorithm \citep{mixtures:Dempster+Laird+Rubin:1977} is the most common method for maximum likelihood estimation of finite mixture models where the number of components $K$ is fixed. The EM algorithm applies a missing data augmentation scheme. It is assumed that a latent variable $z_n \in \{0,1\}^K$ exists for each observation $n$ which indicates the component membership, i.e.~$z_{nk}$ equals 1 if observation $n$ comes from component $k$ and 0 otherwise. Furthermore it holds that $\sum_{k=1}^K z_{nk}=1$ for all $n$. In the EM algorithm these unobserved component memberships $z_{nk}$ of the observations are treated as missing values and the data is augmented by estimates of the component membership, i.e.~the estimated a-posteriori probabilities $\hat{p}_{nk}$. For a sample of $N$ observations $\{(y_1, x_1, w_1), \ldots, (y_N, x_N, w_N)\}$ the EM algorithm is given by: \begin{description} \item[E-step:] Given the current parameter estimates $\psi^{(i)}$ in the $i$-th iteration, replace the missing data $z_{nk}$ by the estimated a-posteriori probabilities \begin{align*} \hat{p}_{nk} & = \frac{\displaystyle \pi_k(w_n, \alpha^{(i)}) f(y_n| x_n, \theta_k^{(i)}) }{\displaystyle \sum_{u = 1}^K \pi_u(w_n, \alpha^{(i)}) f(y_n |x_n, \theta_u^{(i)}) }. \end{align*} \item[M-step:] Given the estimates for the a-posteriori probabilities $\hat{p}_{nk}$ (which are functions of $\psi^{(i)}$), obtain new estimates $\psi^{(i+1)}$ of the parameters by maximizing \begin{align*} Q(\psi^{(i+1)}|\psi^{(i)}) &= Q_1(\theta^{(i+1)} | \psi^{(i)}) + Q_2(\alpha^{(i+1)} | \psi^{(i)}), \end{align*} where \begin{align*} Q_1(\theta^{(i+1)} | \psi^{(i)}) &= \sum_{n = 1}^N \sum_{k = 1}^K \hat{p}_{nk} \log(f(y_n | x_n, \theta_k^{(i+1)})) \end{align*} and \begin{align*} Q_2(\alpha^{(i+1)}| \psi^{(i)}) &= \sum_{n = 1}^N \sum_{k = 1}^K \hat{p}_{nk} \log(\pi_k(w_n, \alpha^{(i+1)})). \end{align*} $Q_1$ and $Q_2$ can be maximized separately. The maximization of $Q_1$ gives new estimates $\theta^{(i+1)}$ and the maximization of $Q_2$ gives $\alpha^{(i+1)}$. $Q_1$ is maximized separately for each $d=1,\ldots,D$ using weighted ML estimation of GLMs and $Q_2$ using weighted ML estimation of multinomial logit models. \end{description} Different variants of the EM algorithm exist such as the stochastic EM \citep[SEM;][]{mixtures:Diebolt+Ip:1996} or the classification EM \citep[CEM;][]{mixtures:Celeux+Govaert:1992}. These two variants are also implemented in package \pkg{flexmix}. For both variants an additional step is made between the expectation and maximization steps. This step uses the estimated a-posteriori probabilities and assigns each observation to only one component, i.e.~classifies it into one component. For SEM this assignment is determined in a stochastic way while it is a deterministic assignment for CEM. For the SEM algorithm the additional step is given by: \begin{description} \item[S-step:] Given the a-posteriori probabilities draw \begin{align*} \hat{z}_n &\sim \textrm{Mult}((\hat{p}_{nk})_{k=1,\ldots,K}, 1) \end{align*} where $\textrm{Mult}(\theta, T)$ denotes the multinomial distribution with success probabilities $\theta$ and number of trials $T$. \end{description} Afterwards, the $\hat{z}_{nk}$ are used instead of the $\hat{p}_{nk}$ in the M-step. For the CEM the additional step is given by: \begin{description} \item[C-step:] Given the a-posteriori probabilities define \begin{align*} \hat{z}_{nk} &= \left\{\begin{array}{ll} 1&\textrm{if } k = \min\{ l : \hat{p}_{nl} \geq \hat{p}_{nk}\, \forall k=1,\ldots,K\}\\ 0&\textrm{otherwise}. \end{array}\right. \end{align*} \end{description} Please note that in this step the observation is assigned to the component with the smallest index if the same maximum a-posteriori probability is observed for several components. Both of these variants have been proposed to improve the performance of the EM algorithm, because the ordinary EM algorithm tends to converge rather slowly and only to a local optimum. The convergence behavior can be expected to be better for the CEM than ordinary EM algorithm, while SEM can escape convergence to a local optimum. However, the CEM algorithm does not give ML estimates because it maximizes the complete likelihood. For SEM good approximations of the ML estimator are obtained if the parameters where the maximum likelihood was encountered are used as estimates. Another possibility for determining parameter estimates from the SEM algorithm could be the mean after discarding a suitable number of burn-ins. An implementational advantage of both variants is that no weighted maximization is necessary in the M-step. It has been shown that the values of the likelihood are monotonically increased during the EM algorithm. On the one hand this ensures the convergence of the EM algorithm if the likelihood is bounded, but on the other hand only the detection of a local maximum can be guaranteed. Therefore, it is recommended to repeat the EM algorithm with different initializations and choose as final solution the one with the maximum likelihood. Different initialization strategies for the EM algorithm have been proposed, as its convergence to the optimal solution depends on the initialization \citep{mixtures:Biernacki+Celeux+Govaert:2003,mixtures:Karlis+Xekalaki:2003}. Proposed strategies are for example to first make several runs of the SEM or CEM algorithm with different random initializations and then start the EM at the best solution encountered. The component specific parameter estimates can be determined separately for each $d=1,\ldots,D$. For simplicity of presentation the following description assumes $D=1$. If all parameter estimates vary between the component distributions they can be determined separately for each component in the M-step. However, if also constant or nested varying parameters are specified, the component specific estimation problems are not independent from each other any more. Parameters have to be estimated which occur in several or all components and hence, the parameters of the different components have to be determined simultaneously for all components. The estimation problem for all component specific parameters is then obtained by replicating the vector of observations $y = (y_n)_{n=1,\ldots,N}$ $K$ times and defining the covariate matrix $X = (X_{\textrm{constant}}, X_{\textrm{nested}}, X_{\textrm{varying}})$ by \begin{align*} &X_{\textrm{constant}} = \mathbf{1}_K \otimes (x'_{1,n})_{n=1,\ldots,N}\\ &X_{\textrm{nested}} = \mathbf{J} \odot (x'_{2,n})_{n=1,\ldots,N}\\ &X_{\textrm{varying}} = \mathbf{I}_K \otimes(x'_{3,n})_{n=1,\ldots,N}, \end{align*} where $\mathbf{1}_K$ is a vector of 1s of length $K$, $\mathbf{J}$ is the incidence matrix for each component $k=1,\ldots,K$ and each nesting group $c \in C$ and hence is of dimension $K \times |C|$, and $\mathbf{I}_K$ is the identity matrix of dimension $K \times K$. $\otimes$ denotes the Kronecker product and $\odot$ the Khatri-Rao product (i.e., the column-wise Kronecker product). $x_{m,n}$ are the covariates of the corresponding coefficients $\beta_{m,.}$ for $m=1,2,3$. Please note that the weights used for the estimation are the a-posteriori probabilities which are stacked for all components, i.e.~a vector of length $N K$ is obtained. Due to the replication of data in the case of constant or nested varying parameters the amount of memory needed for fitting the mixture model to large datasets is substantially increased and it might be easier to fit only varying coefficients to these datasets. To overcome this problem it could be considered to implement special data structures in order to avoid storing the same data multiple times for large datasets. Before each M-step the average component sizes (over the given data points) are checked and components which are smaller than a given (relative) minimum size are omitted in order to avoid too small components where fitting problems might arise. This strategy has already been recommended for the SEM algorithm \citep{mixtures:Celeux+Diebolt:1988} because it allows to determine the suitable number of components in an automatic way given that the a-priori specified number of components is large enough. This recommendation is based on the assumption that the redundent components will be omitted during the estimation process if the algorithm is started with too many components. If omission of small components is not desired the minimum size required can be set to zero. All components will be then retained throughout the EM algorithm and a mixture with the number of components specified in the initialization will be returned. The algorithm is stopped if the relative change in the log-likelihood is smaller than a pre-specified $\epsilon$ or the maximum number of iterations is reached. For model selection different information criteria are available: AIC, BIC and ICL \citep[Integrated Complete Likelihood;][]{mixtures:Biernacki+Celeux+Govaert:2000}. They are of the form twice the negative loglikelihood plus number of parameters times $k$ where $k=2$ for the AIC and $k$ equals the logarithm of the number of observations for the BIC. The ICL is the same as the BIC except that the complete likelihood (where the missing class memberships are replaced by the assignments induced by the maximum a-posteriori probabilities) instead of the likelihood is used. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Using the new functionality} \label{sec:using-new-funct} In the following model fitting and model selection in \proglang{R} is illustrated on several examples including mixtures of Gaussian, binomial and Poisson regression models, see also \cite{mixtures:Gruen:2006} and \cite{mixtures:Gruen+Leisch:2007a}. More examples for mixtures of GLMs are provided as part of the software package through a collection of artificial and real world datasets, most of which have been previously used in the literature (see references in the online help pages). Each dataset can be loaded to \proglang{R} with \code{data("}\textit{name}\code{")} and the fitting of the proposed models can be replayed using \code{example("}\textit{name}\code{")}. Further details on these examples are given in a user guide which can be accessed using \code{vignette("regression-examples", package="flexmix")} from within \proglang{R}. %%----------------------------------------------------------------------- \subsection{Artificial example}\label{sec:artificial-example} In the following the artificial dataset \code{NPreg} is used which has already been used in \cite{mixtures:Leisch:2004} to illustrate the application of package \pkg{flexmix}. The data comes from two latent classes of size \Sexpr{nrow(NPreg)/2} each and for each of the classes the data is drawn with respect to the following structure: \begin{center} \begin{tabular}{ll} Class~1: & $ \mathit{yn} = 5x+\epsilon$\\ Class~2: & $ \mathit{yn} = 15+10x-x^2+\epsilon$ \end{tabular} \end{center} with $\epsilon\sim N(0,9)$, see the left panel of Figure~\ref{fig:npreg}. The dataset \code{NPreg} also includes a response $\mathit{yp}$ which is given by a generalized linear model following a Poisson distribution and using the logarithm as link function. The parameters of the mean are given for the two classes by: \begin{center} \begin{tabular}{ll} Class~1: & $ \mu_1 = 2 - 0.2x$\\ Class~2: & $ \mu_2 = 1 + 0.1x$. \end{tabular} \end{center} This signifies that given $x$ the response $\mathit{yp}$ in group $k$ follows a Poisson distribution with mean $e^{\mu_k}$, see the right panel of Figure~\ref{fig:npreg}. \setkeys{Gin}{width=\textwidth} \begin{figure} \centering <>= par(mfrow=c(1,2)) plot(yn~x, col=class, pch=class, data=NPreg) plot(yp~x, col=class, pch=class, data=NPreg) @ \caption{Standard regression example (left) and Poisson regression (right).} \label{fig:npreg} \end{figure} This model can be fitted in \proglang{R} using the commands: <<>>= suppressWarnings(RNGversion("3.5.0")) set.seed(1802) library("flexmix") data("NPreg", package = "flexmix") Model_n <- FLXMRglm(yn ~ . + I(x^2)) Model_p <- FLXMRglm(yp ~ ., family = "poisson") m1 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), control = list(verbose = 10)) @ If the dimensions are independent the component specific model for multivariate observations can be specified as a list of models for each dimension. The estimation can be controlled with the \code{control} argument which is specified with an object of class \code{"FLXcontrol"}. For convenience also a named list can be provided which is used to construct and set the respective slots of the \code{"FLXcontrol"} object. Elements of the control object are \code{classify} to select ordinary EM, CEM or SEM, \code{minprior} for the minimum relative size of components, \code{iter.max} for the maximum number of iterations and \code{verbose} for monitoring. If \code{verbose} is a positive integer the log-likelihood is reported every \code{verbose} iterations and at convergence together with the number of iterations made. The default is to not report any log-likelihood information during the fitting process. The estimated model \code{m1} is of class \code{"flexmix"} and the result of the default plot method for this class is given in Figure~\ref{fig:root1}. This plot method uses package \pkg{lattice} \citep{mixtures:Sarkar:2008} and the usual parameters can be specified to alter the plot, e.g.~the argument \code{layout} determines the arrangement of the panels. The returned object is of class \code{"trellis"} and the plotting can also be influenced by the arguments of its show method. The default plot prints rootograms (i.e., a histogram of the square root of counts) of the a-posteriori probabilities of each observation separately for each component. For each component the observations with a-posteriori probabilities less than a pre-specified $\epsilon$ (default is $10^{-4}$) for this component are omitted in order to avoid that the bar at zero dominates the plot \citep{mixtures:Leisch:2004a}. Please note that the labels of the y-axis report the number of observations in each bar, i.e.~the squared values used for the rootograms. \begin{figure} \centering <>= print(plot(m1)) @ \caption{The plot method for \code{"flexmix"} objects, here obtained by \code{plot(m1)}, shows rootograms of the posterior class probabilities.} \label{fig:root1} \end{figure} More detailed information on the estimated parameters with respect to standard deviations and significance tests can be obtained with function \code{refit()}. This function determines the variance-covariance matrix of the estimated parameters by using the inverted negative Hesse matrix as computed by the general purpose optimizer \code{optim()} on the full likelihood of the model. \code{optim()} is initialized in the solution obtained with the EM algorithm. For mixtures of GLMs we also implemented the gradient, which speeds up convergence and gives more precise estimates of the Hessian. Naturally, function \code{refit()} will also work for models which have been determined by applying some model selection strategy depending on the data (AIC, BIC, \ldots). The same caution is necessary as when using \code{summary()} on standard linear models selected using \code{step()}: The p-values shown are not correct because they have not been adjusted for the fact that the same data are used to select the model and compute the p-values. So use them only in an exploratory manner in this context, see also \cite{mixtures:Harrell:2001} for more details on the general problem. The returned object can be inspected using \code{summary()} with arguments \code{which} to specify if information for the component model or the concomitant variable model should be shown and \code{model} to indicate for which dimension of the component models this should be done. Selecting \code{model=1} gives the parameter estimates for the dimension where the response variable follows a Gaussian distribution. <<>>= m1.refit <- refit(m1) summary(m1.refit, which = "model", model = 1) @ \begin{figure} \centering <>= print(plot(m1.refit, layout = c(1,3), bycluster = FALSE, main = expression(paste(yn *tilde(" ")* x + x^2))), split= c(1,1,2,1), more = TRUE) print(plot(m1.refit, model = 2, main = expression(paste(yp *tilde(" ")* x)), layout = c(1,2), bycluster = FALSE), split = c(2,1,2,1)) @ \caption{The default plot for refitted \code{"flexmix"} objects, here obtained by \code{plot(refit(m1), model = 1)} and \code{plot(refit(m1), model = 2)}, shows the coefficient estimates and their confidence intervals.} \label{fig:refit} \end{figure} The default plot method for the refitted \code{"flexmix"} object depicts the estimated coefficients with corresponding confidence intervals and is given in Figure~\ref{fig:refit}. It can be seen that for the first model the confidence intervals of the coefficients of the intercept and the quadratic term of \code{x} overlap with zero. A model where these coefficients are set to zero can be estimated with the model driver function \code{FLXMRglmfix()} and the following commands for specifying the nesting structure. The argument \code{nested} needs input for the number of components in each group (given by \code{k}) and the formula which determines the model matrix for the nesting (given by \code{formula}). This information can be provided in a named list. For the restricted model the element \code{k} is a vector with two 1s because each of the components has different parameters. The formulas specifying the model matrices of these coefficients are \verb/~ 1 + I(x^2)/ for an intercept and a quadratic term of $x$ for component 1 and \code{~ 0} for no additional coefficients for component 2. The EM algorithm is initialized in the previously fitted model by passing the posterior probabilities in the argument \code{cluster}. <<>>= Model_n2 <- FLXMRglmfix(yn ~ . + 0, nested = list(k = c(1, 1), formula = c(~ 1 + I(x^2), ~ 0))) m2 <- flexmix(. ~ x, data = NPreg, cluster = posterior(m1), model = list(Model_n2, Model_p)) m2 @ Model selection based on the BIC would suggest the smaller model which also corresponds to the true underlying model. <<>>= c(BIC(m1), BIC(m2)) @ %%----------------------------------------------------------------------- \subsection{Beta-blockers dataset} \label{sec:beta-blockers} The dataset is analyzed in \cite{mixtures:Aitkin:1999, mixtures:Aitkin:1999a} using a finite mixture of binomial regression models. Furthermore, it is described in \citet[p.~165]{mixtures:McLachlan+Peel:2000}. The dataset is from a 22-center clinical trial of beta-blockers for reducing mortality after myocardial infarction. A two-level model is assumed to represent the data, where centers are at the upper level and patients at the lower level. The data is illustrated in Figure~\ref{fig:beta}. First, the center information is ignored and a binomial logit regression model with treatment as covariate is fitted using \code{glm}, i.e.~$K=1$ and it is assumed that the different centers are comparable: <<>>= data("betablocker", package = "flexmix") betaGlm <- glm(cbind(Deaths, Total - Deaths) ~ Treatment, family = "binomial", data = betablocker) betaGlm @ The residual deviance suggests that overdispersion is present in the data. In the next step the intercept is allowed to follow a mixture distribution given the centers. This signifies that the component membership is fixed for each center. This grouping is specified in \proglang{R} by adding \code{| Center} to the formula similar to the notation used in \pkg{nlme} \citep{mixtures:Pinheiro+Bates:2000}. Under the assumption of homogeneity within centers identifiability of the model class can be ensured as induced by the sufficient conditions for identifability given in \cite{mixtures:Follmann+Lambert:1991} for binomial logit models with varying intercepts and \cite{mixtures:Gruen+Leisch:2008} for multinomial logit models with varying and constant parameters. In order to determine the suitable number of components, the mixture is fitted with different numbers of components. <<>>= betaMixFix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = FLXMRglmfix(family = "binomial", fixed = ~ Treatment), k = 2:4, nrep = 5, data = betablocker) @ The returned object is of class \code{"stepFlexmix"} and printing the object gives the information on the number of iterations until termination of the EM algorithm, a logical indicating if the EM algorithm has converged, the log-likelihood and some model information criteria. The plot method compares the fitted models using the different model information criteria. <<>>= betaMixFix @ A specific \code{"flexmix"} model contained in the \code{"stepFlexmix"} object can be selected using \code{getModel()} with argument \code{which} to specify the selection criterion. The best model with respect to the BIC is selected with: <<>>= betaMixFix_3 <- getModel(betaMixFix, which = "BIC") betaMixFix_3 <- relabel(betaMixFix_3, "model", "Intercept") @ The components of the selected model are ordered with respect to the estimated intercept values. In this case a model with three components is selected with respect to the BIC. The fitted values for the model with three components are given in Figure~\ref{fig:beta} separately for each component and the treatment and control groups. The fitted parameters of the component specific models can be accessed with: <<>>= parameters(betaMixFix_3) @ Please note that the coefficients of variable \code{Treatment} are the same for all three components. \begin{figure} \centering <>= library("grid") betablocker$Center <- with(betablocker, factor(Center, levels = Center[order((Deaths/Total)[1:22])])) clusters <- factor(clusters(betaMixFix_3), labels = paste("Cluster", 1:3)) print(dotplot(Deaths/Total ~ Center | clusters, groups = Treatment, as.table = TRUE, data = betablocker, xlab = "Center", layout = c(3, 1), scales = list(x = list(cex = 0.7, tck = c(1, 0))), key = simpleKey(levels(betablocker$Treatment), lines = TRUE, corner = c(1,0)))) betaMixFix.fitted <- fitted(betaMixFix_3) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[1:22, i], "native"), gp = gpar(lty = 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[23:44, i], "native"), gp = gpar(lty = 2)) } @ \setkeys{Gin}{width=0.8\textwidth} \caption{Relative number of deaths for the treatment and the control group for each center in the beta-blocker dataset. The centers are sorted by the relative number of deaths in the control group. The lines indicate the fitted values for each component of the 3-component mixture model with varying intercept and constant parameters for treatment.} \label{fig:beta} \end{figure} The variable \code{Treatment} can also be included in the varying part of the model. This signifies that a mixture distribution is assumed where for each component different values are allowed for the intercept and the treatment coefficient. This mixture distribution can be specified using function \code{FLXMRglm()}. Again it is assumed that the heterogeneity is only between centers and therefore the aggregated data for each center can be used. <<>>= betaMix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ Treatment | Center, model = FLXMRglm(family = "binomial"), k = 3, nrep = 5, data = betablocker) betaMix <- relabel(betaMix, "model", "Treatment") parameters(betaMix) c(BIC(betaMixFix_3), BIC(betaMix)) @ The difference between model \code{betaMix} and \code{betaMixFix\_3} is that the treatment coefficients are the same for all three components for \code{betaMixFix\_3} while they have different values for \code{betaMix} which can easily be seen when comparing the fitted component specific parameters. The larger model \code{betaMix} which also allows varying parameters for treatment has a higher BIC and therefore the smaller model \code{betaMixFix\_3} would be preferred. The default plot for \code{"flexmix"} objects gives a rootogram of the posterior probabilities for each component. Argument \code{mark} can be used to inspect with which components the specified component overlaps as all observations are coloured in the different panels which are assigned to this component based on the maximum a-posteriori probabilities. \begin{figure} \centering <>= print(plot(betaMixFix_3, nint = 10, mark = 1, col = "grey", layout = c(3, 1))) @ \caption{Default plot of \code{"flexmix"} objects where the observations assigned to the first component are marked.}\label{fig:default} \end{figure} \begin{figure} \centering <>= print(plot(betaMixFix_3, nint = 10, mark = 2, col = "grey", layout = c(3, 1))) @ \caption{Default plot of \code{"flexmix"} objects where the observations assigned to the third component are marked.}\label{fig:default-2} \end{figure} The rootogram indicates that the components are well separated. In Figure~\ref{fig:default} it can be seen that component 1 is completely separated from the other two components, while Figure~\ref{fig:default-2} shows that component 2 has a slight overlap with both other components. The cluster assignments using the maximum a-posteriori probabilities are obtained with: <<>>= table(clusters(betaMix)) @ The estimated probabilities of death for each component for the treated patients and those in the control group can be obtained with: <<>>= predict(betaMix, newdata = data.frame(Treatment = c("Control", "Treated"))) @ or by obtaining the fitted values for two observations (e.g.~rows 1 and 23) with the desired levels of the predictor \code{Treatment} <<>>= betablocker[c(1, 23), ] fitted(betaMix)[c(1, 23), ] @ A further analysis of the model is possible with function \code{refit()} which returns the estimated coefficients together with the standard deviations, z-values and corresponding p-values. Please note that the p-values are only approximate in the sense that they have not been corrected for the fact that the data has already been used to determine the specific fitted model. <<>>= summary(refit(betaMix)) @ Given the estimated treatment coefficients we now also compare this model to a model where the treatment coefficient is assumed to be the same for components 1 and 2. Such a model is specified using the model driver \code{FLXMRglmfix()}. As the first two components are assumed to have the same coeffcients for treatment and for the third component the coefficient for treatment shall be set to zero the argument \code{nested} has \code{k = c(2,1)} and \code{formula = c(\~{}Treatment, \~{})}. <<>>= ModelNested <- FLXMRglmfix(family = "binomial", nested = list(k = c(2, 1), formula = c(~ Treatment, ~ 0))) betaMixNested <- flexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = ModelNested, k = 3, data = betablocker, cluster = posterior(betaMix)) parameters(betaMixNested) c(BIC(betaMix), BIC(betaMixNested), BIC(betaMixFix_3)) @ The comparison of the BIC values suggests that the nested model with the same treatment effect for two components and no treatment effect for the third component is the best. %%----------------------------------------------------------------------- \subsection[Productivity of Ph.D. students in biochemistry]{Productivity of Ph.D.~students in biochemistry} \label{sec:bioChemists} <>= data("bioChemists", package = "flexmix") @ This dataset is taken from \cite{mixtures:Long:1990}. It contains \Sexpr{nrow(bioChemists)} observations from academics who obtained their Ph.D.~degree in biochemistry in the 1950s and 60s. It includes \Sexpr{sum(bioChemists$fem=="Women")} women and \Sexpr{sum(bioChemists$fem=="Men")} men. The productivity was measured by counting the number of publications in scientific journals during the three years period ending the year after the Ph.D.~was received. In addition data on the productivity and the prestige of the mentor and the Ph.D.~department was collected. Two measures of family characteristics were recorded: marriage status and number of children of age 5 and lower by the year of the Ph.D. First, mixtures with one, two and three components and only varying parameters are fitted, and the model minimizing the BIC is selected. This is based on the assumption that unobserved heterogeneity is present in the data due to latent differences between the students in order to be productive and achieve publications. Starting with the most general model to determine the number of components using information criteria and checking for possible model restrictions after having the number of components fixed is a common strategy in finite mixture modelling \citep[see][]{mixtures:Wang+Puterman+Cockburn:1996}. Function \code{refit()} is used to determine confidence intervals for the parameters in order to choose suitable alternative models. However, it has to be noted that in the course of the procedure these confidence intervals will not be correct any more because the specific fitted models have already been determined using the same data. <<>>= data("bioChemists", package = "flexmix") Model1 <- FLXMRglm(family = "poisson") ff_1 <- stepFlexmix(art ~ ., data = bioChemists, k = 1:3, model = Model1) ff_1 <- getModel(ff_1, "BIC") @ The selected model has \Sexpr{ff_1@k} components. The estimated coefficients of the components are given in Figure~\ref{fig:coefficients-1} together with the corresponding 95\% confidence intervals using the plot method for objects returned by \code{refit()}. The plot shows that the confidence intervals of the parameters for \code{kid5}, \code{mar}, \code{ment} and \code{phd} overlap for the two components. In a next step a mixture with two components is therefore fitted where only a varying intercept and a varying coefficient for \code{fem} is specified and all other coefficients are constant. The EM algorithm is initialized with the fitted mixture model using \code{posterior()}. \begin{figure} \centering <>= print(plot(refit(ff_1), bycluster = FALSE, scales = list(x = list(relation = "free")))) @ \caption{Coefficient estimates and confidence intervals for the model with only varying parameters.}\label{fig:coefficients-1} \end{figure} <<>>= Model2 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_2 <- flexmix(art ~ fem + phd, data = bioChemists, cluster = posterior(ff_1), model = Model2) c(BIC(ff_1), BIC(ff_2)) @ If the BIC is used for model comparison the smaller model including only varying coefficients for the intercept and \code{fem} is preferred. The coefficients of the fitted model can be obtained using \code{refit()}: <<>>= summary(refit(ff_2)) @ It can be seen that the coefficient of \code{phd} does for both components not differ significantly from zero and might be omitted. This again improves the BIC. <<>>= Model3 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_3 <- flexmix(art ~ fem, data = bioChemists, cluster = posterior(ff_2), model = Model3) c(BIC(ff_2), BIC(ff_3)) @ The coefficients of the restricted model without \code{phd} are given in Figure~\ref{fig:coefficients-2}. \begin{figure}[t] \centering <>= print(plot(refit(ff_3), bycluster = FALSE, scales = list(x = list(relation = "free")))) @ \caption{Coefficient estimates and confidence intervals for the model with varying and constant parameters where the variable \code{phd} is not used in the regression.}\label{fig:coefficients-2} \end{figure} An alternative model would be to assume that gender does not directly influence the number of articles but has an impact on the segment sizes. <<>>= Model4 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + mar + ment) ff_4 <- flexmix(art ~ 1, data = bioChemists, cluster = posterior(ff_2), concomitant = FLXPmultinom(~ fem), model = Model4) parameters(ff_4) summary(refit(ff_4), which = "concomitant") BIC(ff_4) @ This suggests that the proportion of women is lower in the second component which is the more productive segment. The alternative modelling strategy where homogeneity is assumed at the beginning and a varying interept is added if overdispersion is observed leads to the following model which is the best with respect to the BIC. <<>>= Model5 <- FLXMRglmfix(family = "poisson", fixed = ~ kid5 + ment + fem) ff_5 <- flexmix(art ~ 1, data = bioChemists, cluster = posterior(ff_2), model = Model5) BIC(ff_5) @ \begin{figure} \centering \setkeys{Gin}{width=0.8\textwidth} <>= pp <- predict(ff_5, newdata = data.frame(kid5 = 0, mar = factor("Married", levels = c("Single", "Married")), fem = c("Men", "Women"), ment = mean(bioChemists$ment))) matplot(0:12, sapply(unlist(pp), function(x) dpois(0:12, x)), type = "b", lty = 1, xlab = "Number of articles", ylab = "Probability") legend("topright", paste("Comp.", rep(1:2, each = 2), ":", c("Men", "Women")), lty = 1, col = 1:4, pch = paste(1:4), bty = "n") @ \caption{The estimated productivity for each compoment for men and women.} \label{fig:estimated} \end{figure} \setkeys{Gin}{width=0.98\textwidth} In Figure~\ref{fig:estimated} the estimated distribution of productivity for model \code{ff\_5} are given separately for men and women as well as for each component where for all other variables the mean values are used for the numeric variables and the most frequent category for the categorical variables. The two components differ in that component 1 contains the students who publish no article or only a single article, while the students in component 2 write on average several articles. With a constant coefficient for gender women publish less articles than men in both components. This example shows that different optimal models are chosen for different modelling procedures. However, the distributions induced by the different variants of the model class may be similar and therefore it is not suprising that they then will have similar BIC values. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Implementation}\label{sec:implementation} The new features extend the available model class described in \cite{mixtures:Leisch:2004} by providing infrastructure for concomitant variable models and for fitting mixtures of GLMs with varying and constant parameters for the component specific parameters. The implementation of the extensions of the model class made it necessary to define a better class structure for the component specific models and to modify the fit functions \code{flexmix()} and \code{FLXfit()}. An overview on the \proglang{S}4 class structure of the package is given in Figure~\ref{fig:class structure}. There is a class for unfitted finite mixture distributions given by \code{"FLXdist"} which contains a list of \code{"FLXM"} objects which determine the component specific models, a list of \code{"FLXcomponent"} objects which specify functions to determine the component specific log-likelihoods and predictions and which contain the component specific parameters, and an object of class \code{"FLXP"} which specifies the concomitant variable model. Class \code{"flexmix"} extends \code{"FLXdist"}. It represents a fitted finite mixture distribution and it contains the information about the fitting with the EM algorithm in the object of class \code{"FLXcontrol"}. Repeated fitting with the EM algorithm with different number of components is provided by function \code{stepFlexmix()} which returns an object of class \code{"stepFlexmix"}. Objects of class \code{"stepFlexmix"} contain the list of the fitted mixture models for each number of components in the slot \code{"models"}. \setkeys{Gin}{width=.9\textwidth} \begin{figure}[t] \centering \includegraphics{flexmix} \caption{UML class diagram \citep[see][]{mixtures:Fowler:2004} of the \pkg{flexmix} package.} \label{fig:class structure} \end{figure} \setkeys{Gin}{width=\textwidth} For the component specific model a virtual class \code{"FLXM"} is introduced which (currently) has two subclasses: \code{"FLXMC"} for model-based clustering and \code{"FLXMR"} for clusterwise regression, where predictor variables are given. Additional slots have been introduced to allow for data preprocessing and the construction of the components was separated from the fit and is implemented using lexical scoping \citep{mixtures:Gentleman+Ihaka:2000} in the slot \code{defineComponent}. \code{"FLXMC"} has an additional slot \code{dist} to specify the name of the distribution of the variable. In the future functionality shall be provided for sampling from a fitted or unfitted finite mixture. Using this slot observations can be generated by using the function which results from adding an \code{r} at the beginnning of the distribution name. This allows to only implement the (missing) random number generator functions and otherwise use the same method for sampling from mixtures with component specific models of class \code{"FLXMC"}. For \code{flexmix()} and \code{FLXfit()} code blocks which are model dependent have been identified and different methods implemented. Finite mixtures of regressions with varying, nested and constant parameters were a suitable model class for this identification task as they are different from models previously implemented. The main differences are: \begin{itemize} \item The number of components is related to the component specific model and the omission of small components during the EM algorithm impacts on the model. \item The parameters of the component specific models can not be determined separately in the M-step and a joint model matrix is needed. \end{itemize} This makes it also necessary to have different model dependent methods for \code{fitted()} which extracts the fitted values from a \code{"flexmix"} object, \code{predict()} which predicts new values for a \code{"flexmix"} object and \code{refit()} which refits an estimated model to obtain additional information for a \code{"flexmix"} object. %%----------------------------------------------------------------------- \subsection{Component specific models with varying and constant parameters}\label{sec:comp-models-with} A new M-step driver is provided which fits finite mixtures of GLMs with constant and nested varying parameters for the coefficients and the dispersion parameters. The class \code{"FLXMRglmfix"} returned by the driver \code{FLXMRglmfix()} has the following additional slots with respect to \code{"FLXMRglm"}: \begin{description} \item[\code{design}:] An incidence matrix indicating which columns of the model matrix are used for which component, i.e.~$\mathbf{D}=(\mathbf{1}_K,\mathbf{J}, \mathbf{I}_K)$. \item[\code{nestedformula}:] An object of class \code{"FLXnested"} containing the formula for the nested regression coefficients and the number of components in each $K_c$, $c \in C$. \item[\code{fixed}:] The formula for the constant regression coefficients. \item[\code{variance}:] A logical indicating if different variances shall be estimated for the components following a Gaussian distribution or a vector specifying the nested structure for estimating these variances. \end{description} The difference between estimating finite mixtures including only varying parameters using models specified with \code{FLXMRglm()} and those with varying and constant parameters using function \code{FLXMRglmfix()} is hidden from the user, as only the specified model is different. The fitted model is also of class \code{"flexmix"} and can be analyzed using the same functions as for any model fitted using package \pkg{flexmix}. The methods used are the same except if the slot containing the model is accessed and method dispatching is made via the model class. New methods are provided for models of class \code{"FLXMRglmfix"} for functions \code{refit()}, \code{fitted()} and \code{predict()} which can be used for analyzing the fitted model. The implementation allows repeated measurements by specifying a grouping variable in the formula argument of \code{flexmix()}. Furthermore, it has to be noticed that the model matrix is determined by updating the formula of the varying parameters successively with the formula of the constant and then of the nested varying parameters. This ensures that if a mixture distribution is fitted for the intercept, the model matrix of a categorical variable includes only the remaining columns for the constant parameters to have full column rank. However, this updating scheme makes it impossible to estimate a constant intercept while allowing varying parameters for a categorical variable. For this model one big model matrix is constructed where the observations are repeated $K$ times and suitable columns of zero added. The coefficients of all $K$ components are determined simultaneously in the M-step, while if only varying parameters are specified the maximization of the likelihood is made separately for all components. For large datasets the estimation of a combination of constant and varying parameters might therefore be more challenging than only varying parameters. %% ----------------------------------------------------------------------- \subsection{Concomitant variable models}\label{sec:conc-vari-models} For representing concomitant variable models the class \code{"FLXP"} is defined. It specifies how the concomitant variable model is fitted using the concomitant variable model matrix as predictor variables and the current a-posteriori probability estimates as response variables. The object has the following slots: \begin{description} \item[\code{fit}:] A \code{function (x, y, ...)} returning the fitted values for the component weights during the EM algorithm. \item[\code{refit}:] A \code{function (x, y, ...)} used for refitting the model. \item[\code{df}:] A \code{function (x, k, ...)} returning the degrees of freedom used for estimating the concomitant variable model given the model matrix \code{x} and the number of components \code{k}. \item[\code{x}:] A matrix containing the model matrix of the concomitant variables. \item[\code{formula}:] The formula for determining the model matrix \code{x}. \item[\code{name}:] A character string describing the model, which is only used for print output. \end{description} Two constructor functions for concomitant variable models are provided at the moment. \code{FLXPconstant()} is for constant component weights without concomitant variables and for multinomial logit models \code{FLXPmultinom()} can be used. \code{FLXPmultinom()} has its own class \code{"FLXPmultinom"} which extends \code{"FLXP"} and has an additional slot \code{coef} for the fitted coefficients. The multinomial logit models are fitted using package \pkg{nnet} \citep{mixtures:Venables+Ripley:2002}. %%----------------------------------------------------------------------- \subsection{Further changes} The estimation of the model with the EM algorithm was improved by adapting the variants to correspond to the CEM and SEM variants as outlined in the literature. To make this more explicit it is now also possible to use \code{"CEM"} or \code{"SEM"} to specify an EM variant in the \code{classify} argument of the \code{"FLXcontrol"} object. Even though the SEM algorithm can in general not be expected to converge the fitting procedure is also terminated for the SEM algorithm if the change in the relative log-likelhood is smaller than the pre-specified threshold. This is motivated by the fact that for well separated clusters the posteriors might converge to an indicator function with all weight concentrated in one component. The fitted model with the maximum likelihood encountered during the SEM algorithm is returned. For discrete data in general multiple observations with the same values are given in a dataset. A \code{weights} argument was added to the fitting function \code{flexmix()} in order to avoid repeating these observations in the provided dataset. The specification is through a \code{formula} in order to allow selecting a column of the data frame given in the \code{data} argument. The weights argument allows to avoid replicating the same observations and hence enables more efficient memory use in these applications. This possibitliy is especially useful in the context of model-based clustering for mixtures of Poisson distributions or latent class analysis with multivariate binary observations. In order to be able to apply different initialization strategies such as for example first running several different random initializations with CEM and then switching to ordinary EM using the best solution found by CEM for initialization a \code{posterior()} function was implemented. \code{posterior()} also takes a \code{newdata} argument and hence, it is possible to apply subset strategies for large datasets as suggested in \cite{mixtures:Wehrens+Buydens+Fraley:2004}. The returned matrix of the posterior probabilities can be used to specify the \code{cluster} argument for \code{flexmix()} and the posteriors are then used as weights in the first M-step. The default plot methods now use trellis graphics as implemented in package \pkg{lattice} \citep{mixtures:Sarkar:2008}. Users familiar with the syntax of these graphics and with the plotting and printing arguments will find the application intuitive as a lot of plotting arguments are passed to functions from \pkg{lattice} as for example \code{xyplot()} and \code{histogram()}. In fact only new panel, pre-panel and group-panel functions were implemented. The returned object is of class \code{"trellis"} and the show method for this class is used to create the plot. Function \code{refit()} was modified and has now two different estimation methods: \code{"optim"} and \code{"mstep"}. The default method \code{"optim"} determines the variance-covariance matrix of the parameters from the inverse Hessian of the full log-likelihood. The general purpose optimizer \code{optim()} is used to maximize the log-likelihood and initialized in the solution obtained with the EM algorithm. For mixtures of GLMs there are also functions implemented to determine the gradient which can be used to speed up convergence. The second method \code{"mstep"} is only a raw approximation. It performs an M-step where the a-posteriori probabilities are treated as given instead of estimated and returns for the component specific models nearly complete \code{"glm"} objects which can be further analyzed. The advantage of this method is that the return value is basically a list of standard \code{"glm"} objects, such that the regular methods for this class can be used. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Writing your own drivers}\label{sec:writing-your-own} Two examples are given in the following to demonstrate how new drivers can be provided for concomitant variable models and for component specific models. Easy extensibility is one of the main implementation aims of the package and it can be seen that writing new drivers requires only a few lines of code for providing the constructor functions which include the fit functions. %%----------------------------------------------------------------------- \subsection{Component specific models: Zero-inflated models}\label{sec:component-models} \lstset{frame=trbl,basicstyle=\small\tt,stepnumber=5,numbers=left} In Poisson or binomial regression models it can be often encountered that the observed number of zeros is higher than expected. A mixture with two components where one has mean zero can be used to model such data. These models are also referred to as zero-inflated models \citep[see for example][]{mixtures:Boehning+Dietz+Schlattmann:1999}. A generalization of this model class would be to fit mixtures with more than two components where one component has a mean fixed at zero. So this model class is a special case of a mixture of generalized linear models where (a) the family is restricted to Poisson and binomial and (b) the parameters of one component are fixed. For simplicity the implementation assumes that the component with mean zero is the first component. In addition we assume that the model matrix contains an intercept and to have the first component absorbing the access zeros the coefficient of the intercept is set to $-\infty$ and all other coefficients are set to zero. Hence, to implement this model using package \pkg{flexmix} an appropriate model class is needed with a corresponding convenience function for construction. During the fitting of the EM algorithm using \code{flexmix()} different methods for this model class are needed when determining the model matrix (to check the presence of an intercept), to check the model after a component is removed and for the M-step to account for the fact that the coefficients of the first component are fixed. For all other methods those available for \code{"FLXMRglm"} can be re-used. The code is given in Figure~\ref{fig:ziglm.R}. \begin{figure} \centering \begin{minipage}{0.98\textwidth} \lstinputlisting{ziglm.R} \end{minipage} \caption{Driver for a zero-inflated component specific model.} \label{fig:ziglm.R} \end{figure} The model class \code{"FLXMRziglm"} is defined as extending \code{"FLXMRglm"} in order to be able to inherit methods from this model class. For construction of a \code{"FLXMRziglm"} class the convenicence function \code{FLXMRziglm()} is used which calls \code{FLXMRglm()}. The only differences are that the family is restricted to binomial or Poisson, that a different name is assigned and that an object of the correct class is returned. The presence of the intercept in the model matrix is checked in \code{FLXgetModelmatrix()} after using the method available for \code{"FLXMRglm"} models as indicated by the call to \code{callNextMethod()}. During the EM algorithm \code{FLXremoveComponent()} is called if one component is removed. For this model class it checks if the first component has been removed and if this is the case the model class is changed to \code{"FLXMRglm"}. In the M-step the coefficients of the first component are fixed and not estimated, while for the remaining components the M-step of \code{"FLXMRglm"} objects can be used. During the EM algorithm \code{FLXmstep()} is called to perform the M-step and returns a list of \code{"FLXcomponent"} objects with the fitted parameters. A new method for this function is needed for \code{"FLXMRziglm"} objects in order to account for the fixed coefficients in the first component, i.e.~for the first component the \code{"FLXcomponent"} object is constructed and concatenated with the list of \code{"FLXcomponent"} objects returned by using the \code{FLXmstep()} method for \code{"FLXMRglm"} models for the remaining components. Similar modifications are necessary in order to be able to use \code{refit()} for this model class. The code for implementing the \code{refit()} method using \code{optim()} for \code{"FLXMRziglm"} is not shown, but can be inspected in the source code of the package. \subsubsection{Example: Using the driver} This new M-step driver can be used to estimate a zero-inflated Poisson model to the data given in \cite{mixtures:Boehning+Dietz+Schlattmann:1999}. The dataset \code{dmft} consists of count data from a dental epidemiological study for evaluation of various programs for reducing caries collected among school children from an urban area of Belo Horizonte (Brazil). The variables included are the number of decayed, missing or filled teeth (DMFT index) at the beginning and at the end of the observation period, the gender, the ethnic background and the specific treatment for \Sexpr{nrow(dmft)} children. The model can be fitted with the new driver function using the following commands: <<>>= data("dmft", package = "flexmix") Model <- FLXMRziglm(family = "poisson") Fitted <- flexmix(End ~ log(Begin + 0.5) + Gender + Ethnic + Treatment, model = Model, k = 2 , data = dmft, control = list(minprior = 0.01)) summary(refit(Fitted)) @ Please note that \cite{mixtures:Boehning+Dietz+Schlattmann:1999} added the predictor \code{log(Begin + 0.5)} to serve as an offset in order to be able to analyse the improvement in the DMFT index from the beginning to the end of the study. The linear predictor with the offset subtracted is intended to be an estimate for $\log(\mathbb{E}(\textrm{End})) - \log(\mathbb{E}(\textrm{Begin}))$. This is justified by the fact that for a Poisson distributed variable $Y$ with mean between 1 and 10 it holds that $\mathbb{E}(\log(Y + 0.5))$ is approximately equal to $\log(\mathbb{E}(Y))$. $\log(\textrm{Begin} + 0.5)$ can therefore be seen as an estimate for $\log(\mathbb{E}(\textrm{Begin}))$. The estimated coefficients with corresponding confidence intervals are given in Figure~\ref{fig:dmft}. As the coefficients of the first component are restricted a-priori to minus infinity for the intercept and to zero for the other variables, they are of no interest and only the second component is plotted. The box ratio can be modified as for \code{barchart()} in package \pkg{lattice}. The code to produce this plot is given by: <>= print(plot(refit(Fitted), components = 2, box.ratio = 3)) @ \begin{figure} \centering \setkeys{Gin}{width=0.9\textwidth} <>= <> @ \caption{The estimated coefficients of the zero-inflated model for the \code{dmft} dataset. The first component is not plotted as this component captures the inflated zeros and its coefficients are fixed a-priori.} \label{fig:dmft} \end{figure} %%----------------------------------------------------------------------- \subsection{Concomitant variable models}\label{sec:concomitant-models} If the concomitant variable is a categorical variable, the multinomial logit model is equivalent to a model where the component weights for each level of the concomitant variable are determined by the mean values of the a-posteriori probabilities. The driver which implements this \code{"FLXP"} model is given in Figure~\ref{fig:myConcomitant.R}. A name for the driver has to be specified and a \code{fit()} function. In the \code{fit()} function the mean posterior probability for all observations with the same covariate points is determined, assigned to the corresponding observations and the full new a-posteriori probability matrix returned. By contrast \code{refit()} only returns the new a-posteriori probability matrix for the number of unique covariate points. \lstset{frame=trbl,basicstyle=\small\tt,stepnumber=5,numbers=left} \begin{figure} \centering \begin{minipage}{0.98\textwidth} \lstinputlisting{myConcomitant.R} \end{minipage} \caption{Driver for a concomitant variable model where the component weights are determined by averaging over the a-posteriori probabilities for each level of the concomitant variable.} \label{fig:myConcomitant.R} \end{figure} \subsubsection{Example: Using the driver} If the concomitant variable model returned by \code{myConcomitant()} is used for the artificial example in Section~\ref{sec:using-new-funct} the same fitted model is returned as if a multinomial logit model is specified. An advantage is that in this case no problems occur if the fitted probabilities are close to zero or one. <>= Concomitant <- FLXPmultinom(~ yb) MyConcomitant <- myConcomitant(~ yb) set.seed(1234) m2 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), concomitant = Concomitant) m3 <- flexmix(. ~ x, data = NPreg, k = 2, model = list(Model_n, Model_p), cluster = posterior(m2), concomitant = MyConcomitant) @ <<>>= summary(m2) summary(m3) @ For comparing the estimated component weights for each value of $\mathit{yb}$ the following function can be used: <<>>= determinePrior <- function(object) { object@concomitant@fit(object@concomitant@x, posterior(object))[!duplicated(object@concomitant@x), ] } @ <<>>= determinePrior(m2) determinePrior(m3) @ Obviously the fitted values of the two models correspond to each other. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section{Summary and outlook}\label{sec:summary-outlook} Package \pkg{flexmix} was extended to cover finite mixtures of GLMs with (nested) varying and constant parameters. This allows for example the estimation of varying intercept models. In order to be able to characterize the components given some variables concomitant variable models can be estimated for the component weights. The implementation of these extensions have triggered some modifications in the class structure and in the fit functions \code{flexmix()} and \code{FLXfit()}. For certain steps, as e.g.~the M-step, methods which depend on the component specific models are defined in order to enable the estimation of finite mixtures of GLMs with only varying parameters and those with (nested) varying and constant parameters with the same fit function. The flexibility of this modified implementation is demonstrated by illustrating how a driver for zero-inflated models can be defined. In the future diagnostic tools based on resampling methods shall be implemented as bootstrap results can give valuable insights into the model fit \citep{mixtures:Gruen+Leisch:2004}. A function which conveniently allows to test linear hypotheses about the parameters using the variance-covariance matrix returned by \code{refit()} would be a further valuable diagnostic tool. The implementation of zero-inflated Poisson and binomial regression models are a first step towards relaxing the assumption that all component specific distributions are from the same parametric family. As mixtures with components which follow distributions from different parametric families can be useful for example to model outliers \citep{mixtures:Dasgupta+Raftery:1998,mixtures:Leisch:2008}, it is intended to also make this functionality available in \pkg{flexmix} in the future. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section*{Computational details} <>= SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") @ All computations and graphics in this paper have been done using \proglang{R} version \Sexpr{getRversion()} with the packages \Sexpr{pkgs}. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \section*{Acknowledgments} This research was supported by the the Austrian Science Foundation (FWF) under grants P17382 and T351. Thanks also to Achim Zeileis for helpful discussions on implementation details and an anonymous referee for asking a good question about parameter significance which initiated the new version of function \code{refit()}. %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \bibliography{mixture} %%----------------------------------------------------------------------- %%----------------------------------------------------------------------- \end{document} flexmix/inst/doc/flexmix-intro.Rnw0000644000175100001440000010256513675321507017005 0ustar hornikusers% % Copyright (C) 2004-2005 Friedrich Leisch % $Id: flexmix-intro.Rnw 5187 2020-06-25 17:59:39Z gruen $ % \documentclass[nojss]{jss} \title{FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in \proglang{R}} \Plaintitle{FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in R} \Shorttitle{FlexMix: Finite Mixture Models in \proglang{R}} \author{Friedrich Leisch\\Universit\"at f\"ur Bodenkultur Wien} \Plainauthor{Friedrich Leisch} \Address{ Friedrich Leisch\\ Institut f\"ur Angewandte Statistik und EDV\\ Universit\"at f\"ur Bodenkultur Wien\\ Peter Jordan Stra\ss{}e 82\\ 1190 Wien, Austria\\ E-mail: \email{Friedrich.Leisch@boku.ac.at} } \usepackage[utf8]{inputenc} \usepackage{listings} \newcommand{\R}{\proglang{R}} <>= suppressWarnings(RNGversion("3.5.0")) set.seed(1504) options(width=70, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) grDevices::ps.options(family="Times") library("graphics") library("flexmix") data("NPreg") @ \Abstract{ This article was originally published as \cite{flexmix:Leisch:2004a} in the \emph{Journal of Statistical Software}. FlexMix implements a general framework for fitting discrete mixtures of regression models in the \R{} statistical computing environment: three variants of the EM algorithm can be used for parameter estimation, regressors and responses may be multivariate with arbitrary dimension, data may be grouped, e.g., to account for multiple observations per individual, the usual formula interface of the \proglang{S} language is used for convenient model specification, and a modular concept of driver functions allows to interface many different types of regression models. Existing drivers implement mixtures of standard linear models, generalized linear models and model-based clustering. FlexMix provides the E-step and all data handling, while the M-step can be supplied by the user to easily define new models. } \Keywords{\proglang{R}, finite mixture models, model based clustering, latent class regression} \Plainkeywords{R, finite mixture models, model based clustering, latent class regression} \Volume{11} \Issue{8} \Month{October} \Year{2004} \Submitdate{2004-04-19} \Acceptdate{2004-10-18} %%\usepackage{Sweave} %% already provided by jss.cls %%\VignetteIndexEntry{FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in R} %%\VignetteDepends{flexmix} %%\VignetteKeywords{R, finite mixture models, model based clustering, latent class regression} %%\VignettePackage{flexmix} \begin{document} \section{Introduction} \label{sec:introduction} Finite mixture models have been used for more than 100 years, but have seen a real boost in popularity over the last decade due to the tremendous increase in available computing power. The areas of application of mixture models range from biology and medicine to physics, economics and marketing. On the one hand these models can be applied to data where observations originate from various groups and the group affiliations are not known, and on the other hand to provide approximations for multi-modal distributions \citep{flexmix:Everitt+Hand:1981,flexmix:Titterington+Smith+Makov:1985,flexmix:McLachlan+Peel:2000}. In the 1990s finite mixture models have been extended by mixing standard linear regression models as well as generalized linear models \citep{flexmix:Wedel+DeSarbo:1995}. An important area of application of mixture models is market segmentation \citep{flexmix:Wedel+Kamakura:2001}, where finite mixture models replace more traditional cluster analysis and cluster-wise regression techniques as state of the art. Finite mixture models with a fixed number of components are usually estimated with the expectation-maximization (EM) algorithm within a maximum likelihood framework \citep{flexmix:Dempster+Laird+Rubin:1977} and with MCMC sampling \citep{flexmix:Diebolt+Robert:1994} within a Bayesian framework. \newpage The \R{} environment for statistical computing \citep{flexmix:R-Core:2004} features several packages for finite mixture models, including \pkg{mclust} for mixtures of multivariate Gaussian distributions \citep{flexmix:Fraley+Raftery:2002,flexmix:Fraley+Raftery:2002a}, \pkg{fpc} for mixtures of linear regression models \citep{flexmix:Hennig:2000} and \pkg{mmlcr} for mixed-mode latent class regression \citep{flexmix:Buyske:2003}. There are three main reasons why we have chosen to write yet another software package for EM estimation of mixture models: \begin{itemize} \item The existing implementations did not cover all cases we needed for our own research (mainly marketing applications). \item While all \R{} packages mentioned above are open source and hence can be extended by the user by modifying the source code, we wanted an implementation where extensibility is a main design principle to enable rapid prototyping of new mixture models. \item We include a sampling-based variant of the EM-algorithm for models where weighted maximum likelihood estimation is not available. FlexMix has a clean interface between E- and M-step such that variations of both are easy to combine. \end{itemize} This paper is organized as follows: First we introduce the mathematical models for latent class regression in Section~\ref{sec:latent-class-regr} and shortly discuss parameter estimation and identifiability. Section~\ref{sec:using-flexmix} demonstrates how to use FlexMix to fit models with the standard driver for generalized linear models. Finally, Section~\ref{sec:extending-flexmix} shows how to extend FlexMix by writing new drivers using the well-known model-based clustering procedure as an example. \section{Latent class regression} \label{sec:latent-class-regr} Consider finite mixture models with $K$ components of form \begin{equation}\label{eq:1} h(y|x,\psi) = \sum_{k = 1}^K \pi_k f(y|x,\theta_k) \end{equation} \begin{displaymath} \pi_k \geq 0, \quad \sum_{k = 1}^K \pi_k = 1 \end{displaymath} where $y$ is a (possibly multivariate) dependent variable with conditional density $h$, $x$ is a vector of independent variables, $\pi_k$ is the prior probability of component $k$, $\theta_k$ is the component specific parameter vector for the density function $f$, and $\psi=(\pi_1,,\ldots,\pi_K,\theta_1',\ldots,\theta_K')'$ is the vector of all parameters. If $f$ is a univariate normal density with component-specific mean $\beta_k'x$ and variance $\sigma^2_k$, we have $\theta_k = (\beta_k', \sigma_k^2)'$ and Equation~(\ref{eq:1}) describes a mixture of standard linear regression models, also called \emph{latent class regression} or \emph{cluster-wise regression} \citep{flexmix:DeSarbo+Cron:1988}. If $f$ is a member of the exponential family, we get a mixture of generalized linear models \citep{flexmix:Wedel+DeSarbo:1995}, known as \emph{GLIMMIX} models in the marketing literature \citep{flexmix:Wedel+Kamakura:2001}. For multivariate normal $f$ and $x\equiv1$ we get a mixture of Gaussians without a regression part, also known as \emph{model-based clustering}. The posterior probability that observation $(x,y)$ belongs to class $j$ is given by \begin{equation}\label{eq:3} \Prob(j|x, y, \psi) = \frac{\pi_j f(y | x, \theta_j)}{\sum_k \pi_k f(y | x, \theta_k)} \end{equation} The posterior probabilities can be used to segment data by assigning each observation to the class with maximum posterior probability. In the following we will refer to $f(\cdot|\cdot, \theta_k)$ as \emph{mixture components} or \emph{classes}, and the groups in the data induced by these components as \emph{clusters}. \subsection{Parameter estimation} \label{sec:parameter-estimation} The log-likelihood of a sample of $N$ observations $\{(x_1,y_1),\ldots,(x_N,y_N)\}$ is given by \begin{equation}\label{eq:4} \log L = \sum_{n=1}^N \log h(y_n|x_n,\psi) = \sum_{n=1}^N \log\left(\sum_{k = 1}^K \pi_kf(y_n|x_n,\theta_k) \right) \end{equation} and can usually not be maximized directly. The most popular method for maximum likelihood estimation of the parameter vector $\psi$ is the iterative EM algorithm \citep{flexmix:Dempster+Laird+Rubin:1977}: \begin{description} \item[Estimate] the posterior class probabilities for each observation \begin{displaymath} \hat p_{nk} = \Prob(k|x_n, y_n, \hat \psi) \end{displaymath} using Equation~(\ref{eq:3}) and derive the prior class probabilities as \begin{displaymath} \hat\pi_k = \frac1N \sum_{n=1}^N \hat p_{nk} \end{displaymath} \item[Maximize] the log-likelihood for each component separately using the posterior probabilities as weights \begin{equation}\label{eq:2} \max_{\theta_k} \sum_{n=1}^N \hat p_{nk} \log f(y_n | x_n, \theta_k) \end{equation} \end{description} The E- and M-steps are repeated until the likelihood improvement falls under a pre-specified threshold or a maximum number of iterations is reached. The EM algorithm cannot be used for mixture models only, but rather provides a general framework for fitting models on incomplete data. Suppose we augment each observation $(x_n,y_n)$ with an unobserved multinomial variable $z_n = (z_{n1},\ldots,z_{nK})$, where $z_{nk}=1$ if $(x_n,y_n)$ belongs to class $k$ and $z_{nk}=0$ otherwise. The EM algorithm can be shown to maximize the likelihood on the ``complete data'' $(x_n,y_n,z_n)$; the $z_n$ encode the missing class information. If the $z_n$ were known, maximum likelihood estimation of all parameters would be easy, as we could separate the data set into the $K$ classes and estimate the parameters $\theta_k$ for each class independently from the other classes. If the weighted likelihood estimation in Equation~(\ref{eq:2}) is infeasible for analytical, computational, or other reasons, then we have to resort to approximations of the true EM procedure by assigning the observations to disjoint classes and do unweighted estimation within the groups: \begin{displaymath} \max_{\theta_k} \sum_{n: z_{nk=1}} \log f(y_n | x_n, \theta_k) \end{displaymath} This corresponds to allow only 0 and 1 as weights. Possible ways of assigning the data into the $K$ classes are \begin{itemize} \item \textbf{hard} \label{hard} assignment to the class with maximum posterior probability $p_{nk}$, the resulting procedure is called maximizing the \emph{classification likelihood} by \cite{flexmix:Fraley+Raftery:2002}. Another idea is to do \item \textbf{random} assignment to classes with probabilities $p_{nk}$, which is similar to the sampling techniques used in Bayesian estimation (although for the $z_n$ only). \end{itemize} Well known limitations of the EM algorithm include that convergence can be slow and is to a local maximum of the likelihood surface only. There can also be numerical instabilities at the margin of parameter space, and if a component gets to contain only a few observations during the iterations, parameter estimation in the respective component may be problematic. E.g., the likelihood of Gaussians increases without bounds for $\sigma^2\to 0$. As a result, numerous variations of the basic EM algorithm described above exist, most of them exploiting features of special cases for $f$. \subsection{Identifiability} \label{sec:identifiability} An open question is still identifiability of many mixture models. A comprehensive overview of this topic is beyond the scope of this paper, however, users of mixture models should be aware of the problem: \begin{description} \item[Relabelling of components:] Mixture models are only identifiable up to a permutation of the component labels. For EM-based approaches this only affects interpretation of results, but is no problem for parameter estimation itself. \item[Overfitting:] If a component is empty or two or more components have the same parameters, the data generating process can be represented by a smaller model with fewer components. This kind of unidentifiability can be avoided by requiring that the prior weights $\pi_k$ are not equal to zero and that the component specific parameters are different. \item[Generic unidentifiability:] It has been shown that mixtures of univariate normal, gamma, exponential, Cauchy and Poisson distributions are identifiable, while mixtures of discrete or continuous uniform distributions are not identifiable. A special case is the class of mixtures of binomial and multinomial distributions which are only identifiable if the number of components is limited with respect to, e.g., the number of observations per person. See \cite{flexmix:Everitt+Hand:1981}, \cite{flexmix:Titterington+Smith+Makov:1985}, \cite{flexmix:Grun:2002} and references therein for details. \end{description} FlexMix tries to avoid overfitting because of vanishing prior probabilities by automatically removing components where the prior $\pi_k$ falls below a user-specified threshold. Automated diagnostics for generic identifiability are currently under investigation. Relabelling of components is in some cases more of a nuisance than a real problem (``component 2 of the first run may be component 3 in the second run''), more serious are interactions of component relabelling and categorical predictor variables, see \cite{flexmix:Grun+Leisch:2004} for a discussion and how bootstrapping can be used to assess identifiability of mixture models. \pagebreak[4] \section{Using FlexMix} \label{sec:using-flexmix} \SweaveOpts{width=12,height=8,eps=FALSE,keep.source=TRUE} The standard M-step \texttt{FLXMRglm()} of FlexMix is an interface to R's generalized linear modelling facilities (the \texttt{glm()} function). As a simple example we use artificial data with two latent classes of size \Sexpr{nrow(NPreg)/2} each: \begin{center} \begin{tabular}{ll} Class~1: & $ y = 5x+\epsilon$\\ Class~2: & $ y = 15+10x-x^2+\epsilon$\\ \end{tabular} \end{center} with $\epsilon\sim N(0,9)$ and prior class probabilities $\pi_1=\pi_2=0.5$, see the left panel of Figure~\ref{fig:npreg}. We can fit this model in \R{} using the commands <<>>= library("flexmix") data("NPreg") m1 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2) m1 @ and get a first look at the estimated parameters of mixture component~1 by <<>>= parameters(m1, component = 1) @ and <<>>= parameters(m1, component = 2) @ for component~2. The paramter estimates of both components are close to the true values. A cross-tabulation of true classes and cluster memberships can be obtained by <<>>= table(NPreg$class, clusters(m1)) @ The summary method <<>>= summary(m1) @ gives the estimated prior probabilities $\hat\pi_k$, the number of observations assigned to the corresponding clusters, the number of observations where $p_{nk}>\delta$ (with a default of $\delta=10^{-4}$), and the ratio of the latter two numbers. For well-seperated components, a large proportion of observations with non-vanishing posteriors $p_{nk}$ should also be assigned to the corresponding cluster, giving a ratio close to 1. For our example data the ratios of both components are approximately 0.7, indicating the overlap of the classes at the cross-section of line and parabola. \begin{figure}[htbp] \centering <>= par(mfrow=c(1,2)) plot(yn~x, col=class, pch=class, data=NPreg) plot(yp~x, col=class, pch=class, data=NPreg) @ \caption{Standard regression example (left) and Poisson regression (right).} \label{fig:npreg} \end{figure} Histograms or rootograms of the posterior class probabilities can be used to visually assess the cluster structure \citep{flexmix:Tantrum+Murua+Stuetzle:2003}, this is now the default plot method for \texttt{"flexmix"} objects \citep{flexmix:Leisch:2004}. Rootograms are very similar to histograms, the only difference is that the height of the bars correspond to square roots of counts rather than the counts themselves, hence low counts are more visible and peaks less emphasized. \begin{figure}[htbp] \centering <>= print(plot(m1)) @ \caption{The plot method for \texttt{"flexmix"} objects, here obtained by \texttt{plot(m1)}, shows rootograms of the posterior class probabilities.} \label{fig:root1} \end{figure} Usually in each component a lot of observations have posteriors close to zero, resulting in a high count for the corresponing bin in the rootogram which obscures the information in the other bins. To avoid this problem, all probabilities with a posterior below a threshold are ignored (we again use $10^{-4}$). A peak at probability 1 indicates that a mixture component is well seperated from the other components, while no peak at 1 and/or significant mass in the middle of the unit interval indicates overlap with other components. In our simple example the components are medium well separated, see Figure~\ref{fig:root1}. Tests for significance of regression coefficients can be obtained by <<>>= rm1 <- refit(m1) summary(rm1) @ Function \texttt{refit()} fits weighted generalized linear models to each component using the standard \R{} function \texttt{glm()} and the posterior probabilities as weights, see \texttt{help("refit")} for details. The data set \texttt{NPreg} also includes a response from a generalized linear model with a Poisson distribution and exponential link function. The two classes of size \Sexpr{nrow(NPreg)/2} each have parameters \begin{center} \begin{tabular}{ll} Class~1: & $ \mu_1 = 2 - 0.2x$\\ Class~2: & $ \mu_2 = 1 + 0.1x$\\ \end{tabular} \end{center} and given $x$ the response $y$ in group $k$ has a Poisson distribution with mean $e^{\mu_k}$, see the right panel of Figure~\ref{fig:npreg}. The model can be estimated using <>= options(width=55) @ <<>>= m2 <- flexmix(yp ~ x, data = NPreg, k = 2, model = FLXMRglm(family = "poisson")) summary(m2) @ <>= options(width=65) @ \begin{figure}[htbp] \centering <>= print(plot(m2)) @ \caption{\texttt{plot(m2)}} \label{fig:root2} \end{figure} Both the summary table and the rootograms in Figure~\ref{fig:root2} clearly show that the clusters of the Poisson response have much more overlap. For our simple low-dimensional example data the overlap of the classes is obvious by looking at scatterplots of the data. For data in higher dimensions this is not an option. The rootograms and summary tables for \texttt{"flexmix"} objects work off the densities or posterior probabilities of the observations and thus do not depend on the dimensionality of the input space. While we use simple 2-dimensional examples to demonstrate the techniques, they can easily be used on high-dimensional data sets or models with complicated covariate structures. \subsection{Multiple independent responses} \label{sec:mult-indep-resp} If the response $y=(y_1,\ldots,y_D)'$ is $D$-dimensional and the $y_d$ are mutually independent the mixture density in Equation~(\ref{eq:1}) can be written as \begin{eqnarray*} h(y|x,\psi) &=& \sum_{k = 1}^K \pi_k f(y|x,\theta_k)\\ &=& \sum_{k = 1}^K \pi_k \prod_{d=1}^D f_d(y|x,\theta_{kd}) \end{eqnarray*} To specify such models in FlexMix we pass it a list of models, where each list element corresponds to one $f_d$, and each can have a different set of dependent and independent variables. To use the Gaussian and Poisson responses of data \texttt{NPreg} simultaneously, we use the model specification \begin{Sinput} > m3 = flexmix(~x, data=NPreg, k=2, + model=list(FLXMRglm(yn~.+I(x^2)), + FLXMRglm(yp~., family="poisson"))) \end{Sinput} <>= m3 <- flexmix(~ x, data = NPreg, k = 2, model=list(FLXMRglm(yn ~ . + I(x^2)), FLXMRglm(yp ~ ., family = "poisson"))) @ Note that now three model formulas are involved: An overall formula as first argument to function \texttt{flexmix()} and one formula per response. The latter ones are interpreted relative to the overall formula such that common predictors have to be specified only once, see \texttt{help("update.formula")} for details on the syntax. The basic principle is that the dots get replaced by the respective terms from the overall formula. The rootograms show that the posteriors of the two-response model are shifted towards 0 and 1 (compared with either of the two univariate models), the clusters are now well-separated. \begin{figure}[htbp] \centering <>= print(plot(m3)) @ \caption{\texttt{plot(m3)}} \label{fig:root3} \end{figure} \subsection{Repeated measurements} \label{sec:repe-meas} If the data are repeated measurements on $M$ individuals, and we have $N_m$ observations from individual $m$, then the log-likelihood in Equation~(\ref{eq:4}) can be written as \begin{displaymath} \log L = \sum_{m=1}^M \sum_{n=1}^{N_m} \log h(y_{mn}|x_{mn},\psi), \qquad \sum_{m=1}^M N_m = N \end{displaymath} and the posterior probability that individual $m$ belongs to class $j$ is given by \begin{displaymath} \Prob(j|m) = \frac{\pi_j \prod_{n=1}^{N_m} f(y_{mn} | x_{mn}, \theta_j)}{\sum_k \pi_k \prod_{n=1}^{N_m} f(y_{mn} | x_{mn}, \theta_k)} \end{displaymath} where $(x_{mn}, y_{mn})$ is the $n$-th observation from individual $m$. As an example, assume that the data in \texttt{NPreg} are not 200 independent observations, but 4 measurements each from 50 persons such that $\forall m: N_m=4$. Column \texttt{id2} of the data frame encodes such a grouping and can easily be used in FlexMix: <<>>= m4 <- flexmix(yn ~ x + I(x^2) | id2, data = NPreg, k = 2) summary(m4) @ Note that convergence of the EM algorithm is much faster with grouping and the two clusters are now perfectly separated. \subsection{Control of the EM algorithm} \label{sec:control-em-algorithm} Details of the EM algorithm can be tuned using the \texttt{control} argument of function \texttt{flexmix()}. E.g., to use a maximum number of 15 iterations, report the log-likelihood at every 3rd step and use hard assignment of observations to clusters (cf. page~\pageref{hard}) the call is <<>>= m5 <- flexmix(yn ~ x + I(x^2), data = NPreg, k = 2, control = list(iter.max = 15, verbose = 3, classify = "hard")) @ Another control parameter (\texttt{minprior}, see below for an example) is the minimum prior probability components are enforced to have, components falling below this threshold (the current default is 0.05) are removed during EM iteration to avoid numerical instabilities for components containing only a few observations. Using a minimum prior of 0 disables component removal. \subsection{Automated model search} In real applications the number of components is unknown and has to be estimated. Tuning the minimum prior parameter allows for simplistic model selection, which works surprisingly well in some situations: <<>>= m6 <- flexmix(yp ~ x + I(x^2), data = NPreg, k = 4, control = list(minprior = 0.2)) m6 @ Although we started with four components, the algorithm converged at the correct two component solution. A better approach is to fit models with an increasing number of components and compare them using AIC or BIC. As the EM algorithm converges only to the next local maximum of the likelihood, it should be run repeatedly using different starting values. The function \texttt{stepFlexmix()} can be used to repeatedly fit models, e.g., <<>>= m7 <- stepFlexmix(yp ~ x + I(x^2), data = NPreg, control = list(verbose = 0), k = 1:5, nrep = 5) @ runs \texttt{flexmix()} 5 times for $k=1,2,\ldots,5$ components, totalling in 25 runs. It returns a list with the best solution found for each number of components, each list element is simply an object of class \texttt{"flexmix"}. To find the best model we can use <<>>= getModel(m7, "BIC") @ and choose the number of components minimizing the BIC. \section{Extending FlexMix} \label{sec:extending-flexmix} One of the main design principles of FlexMix was extensibility, users can provide their own M-step for rapid prototyping of new mixture models. FlexMix was written using S4 classes and methods \citep{flexmix:Chambers:1998} as implemented in \R{} package \pkg{methods}. The central classes for writing M-steps are \texttt{"FLXM"} and \texttt{"FLXcomponent"}. Class \texttt{"FLXM"} specifies how the model is fitted using the following slots: \begin{description} \item[fit:] A \texttt{function(x,y,w)} returning an object of class \texttt{"FLXcomponent"}. \item[defineComponent:] Expression or function constructing the object of class \texttt{"FLXcomponent"}. \item[weighted:] Logical, specifies if the model may be fitted using weighted likelihoods. If \texttt{FALSE}, only hard and random classification are allowed (and hard classification becomes the default). \item[formula:] Formula relative to the overall model formula, default is \verb|.~.| \item[name:] A character string describing the model, this is only used for print output. \end{description} The remaining slots of class \texttt{"FLXM"} are used internally by FlexMix to hold data, etc. and omitted here, because they are not needed to write an M-step driver. The most important slot doing all the work is \texttt{fit} holding a function performing the maximum likelihood estimation described in Equation~(\ref{eq:2}). The \texttt{fit()} function returns an object of class \texttt{"FLXcomponent"} which holds a fitted component using the slots: \begin{description} \item[logLik:] A \texttt{function(x,y)} returning the log-likelihood for observations in matrices \texttt{x} and \texttt{y}. \item[predict:] A \texttt{function(x)} predicting \texttt{y} given \texttt{x}. \item[df:] The degrees of freedom used by the component, i.e., the number of estimated parameters. \item[parameters:] An optional list containing model parameters. \end{description} In a nutshell class \texttt{"FLXM"} describes an \emph{unfitted} model, whereas class \texttt{"FLXcomponent"} holds a \emph{fitted} model. \lstset{frame=trbl,basicstyle=\small\tt,stepnumber=5,numbers=left} \begin{figure}[tb] \centering \begin{minipage}{0.94\textwidth} \lstinputlisting{mymclust.R} \end{minipage} \caption{M-step for model-based clustering: \texttt{mymclust} is a simplified version of the standard FlexMix driver \texttt{FLXmclust}.} \label{fig:mymclust.R} \end{figure} \subsection{Writing an M-step driver} \label{sec:writing-an-m} Figure~\ref{fig:mymclust.R} shows an example driver for model-based clustering. We use function \texttt{dmvnorm()} from package \pkg{mvtnorm} for calculation of multivariate Gaussian densities. In line~5 we create a new \texttt{"FLXMC"} object named \texttt{retval}, which is also the return value of the driver. Class \texttt{"FLXMC"} extends \texttt{"FLXM"} and is used for model-based clustering. It contains an additional slot with the name of the distribution used. All drivers should take a formula as their first argument, this formula is directly passed on to \texttt{retval}. In most cases authors of new FlexMix drivers need not worry about formula parsing etc., this is done by \texttt{flexmix} itself. In addition we have to declare whether the driver can do weighted ML estimation (\texttt{weighted=TRUE}) and give a name to our model. The remainder of the driver creates a \texttt{fit()} function, which takes regressors \texttt{x}, response \texttt{y} and weights \texttt{w}. For multivariate Gaussians the maximum likelihood estimates correspond to mean and covariance matrix, the standard R function \texttt{cov.wt()} returns a list containing estimates of the weighted covariance matrix and the mean for given data. Our simple example performs clustering without a regression part, hence $x$ is ignored. If \texttt{y} has $D$ columns, we estimate $D$ parameters for the mean and $D(D-1)/2$ parameters for the covariance matrix, giving a total of $(3D+D^2)/2$ parameters (line~11). As an additional feature we allow the user to specify whether the covariance matrix is assumed to be diagonal or a full matrix. For \texttt{diagonal=TRUE} we use only the main diagonal of the covariance matrix (line~14) and the number of parameters is reduced to $2D$. In addition to parameter estimates, \texttt{flexmix()} needs a function calculating the log-likelihood of given data $x$ and $y$, which in our example is the log-density of a multivariate Gaussian. In addition we have to provide a function predicting $y$ given $x$, in our example simply the mean of the Gaussian. Finally we create a new \texttt{"FLXcomponent"} as return value of function \texttt{fit()}. Note that our internal functions \texttt{fit()}, \texttt{logLik()} and \texttt{predict()} take only \texttt{x}, \texttt{y} and \texttt{w} as arguments, but none of the model-specific parameters like means and covariances, although they use them of course. \R{} uses \emph{lexical scoping} rules for finding free variables \citep{flexmix:Gentleman+Ihaka:2000}, hence it searches for them first in the environment where a function is defined. E.g., the \texttt{fit()} function uses the variable \texttt{diagonal} in line~24, and finds it in the environment where the function itself was defined, which is the body of function \texttt{mymclust()}. Function \texttt{logLik()} uses the list \texttt{para} in lines~8 and 9, and uses the one found in the body of \texttt{defineComponent()}. Function \texttt{flexmix()} on the other hand never sees the model parameters, all it uses are function calls of form \texttt{fit(x,y,w)} or \texttt{logLik(x,y)}, which are exactly the same for all kinds of mixture models. In fact, it would not be necessary to even store the component parameters in the \texttt{"FLXcomponent"} object, they are there only for convenience such that users can easily extract and use them after \texttt{flexmix()} has finished. Lexical scope allows to write clean interfaces in a very elegant way, the driver abstracts all model details from the FlexMix main engine. \subsection{Example: Using the driver} \label{sec:example:-model-based} \SweaveOpts{width=12,height=6,eps=FALSE} <>= library("flexmix") set.seed(1504) options(width=60) grDevices::ps.options(family="Times") suppressMessages(require("ellipse")) suppressMessages(require("mvtnorm")) source("mymclust.R") @ As a simple example we use the four 2-dimensional Gaussian clusters from data set \texttt{Nclus}. Fitting a wrong model with diagonal covariance matrix is done by <<>>= data("Nclus") m1 <- flexmix(Nclus ~ 1, k = 4, model = mymclust()) summary(m1) @ The result can be seen in the left panel of Figure~\ref{fig:ell}, the result is ``wrong'' because we forced the ellipses to be parallel to the axes. The overlap between three of the four clusters can also be inferred from the low ratio statistics in the summary table (around 0.5 for components 1, 3 and 4), while the much better separated upper left cluster has a much higher ratio of 0.85. Using the correct model with a full covariance matrix can be done by setting \texttt{diagonal=FALSE} in the call to our driver \texttt{mymclust()}: <<>>= m2 <- flexmix(Nclus ~ 1, k = 4, model = mymclust(diagonal = FALSE)) summary(m2) @ \begin{figure}[htbp] \centering <>= par(mfrow=1:2) plotEll(m1, Nclus) plotEll(m2, Nclus) @ \caption{Fitting a mixture model with diagonal covariance matrix (left) and full covariance matrix (right).} \label{fig:ell} \end{figure} \pagebreak[4] \section{Summary and outlook} \label{sec:summary} The primary goal of FlexMix is extensibility, this makes the package ideal for rapid development of new mixture models. There is no intent to replace packages implementing more specialized mixture models like \pkg{mclust} for mixtures of Gaussians, FlexMix should rather be seen as a complement to those. By interfacing R's facilities for generalized linear models, FlexMix allows the user to estimate complex latent class regression models. Using lexical scope to resolve model-specific parameters hides all model details from the programming interface, FlexMix can in principle fit almost arbitrary finite mixture models for which the EM algorithm is applicable. The downside of this is that FlexMix can in principle fit almost arbitrary finite mixture models, even models where no proper theoretical results for model identification etc.\ are available. We are currently working on a toolset for diagnostic checks on mixture models to test necessary identifiability conditions for those cases where results are available. We also want to implement newer variations of the classic EM algorithm, especially for faster convergence. Another plan is to have an interactive version of the rootograms using \texttt{iPlots} \citep{flexmix:Urbanek+Theus:2003} such that the user can explore the relations between mixture components, possibly linked to background variables. Other planned extensions include covariates for the prior probabilities and to allow to mix different distributions for components, e.g., to include a Poisson point process for background noise. \section*{Computational details} <>= SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") @ All computations and graphics in this paper have been done using \proglang{R} version \Sexpr{getRversion()} with the packages \Sexpr{pkgs}. \section*{Acknowledgments} This research was supported by the Austrian Science Foundation (FWF) under grant SFB\#010 (`Adaptive Information Systems and Modeling in Economics and Management Science'). Bettina Gr\"un has modified the original version to include and reflect the changes of the package. \bibliography{flexmix} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: flexmix/inst/doc/regression-examples.R0000644000175100001440000004066313740572351017625 0ustar hornikusers### R code from vignette source 'regression-examples.Rnw' ################################################### ### code chunk number 1: regression-examples.Rnw:11-14 ################################################### library("stats") library("graphics") library("flexmix") ################################################### ### code chunk number 2: start ################################################### options(width=70, prompt = "R> ", continue = "+ ", useFancyQuotes = FALSE) suppressWarnings(RNGversion("3.5.0")) set.seed(1802) library("lattice") ltheme <- canonical.theme("postscript", FALSE) lattice.options(default.theme=ltheme) ################################################### ### code chunk number 3: NregFix ################################################### set.seed(2807) library("flexmix") data("NregFix", package = "flexmix") Model <- FLXMRglm(~ x2 + x1) fittedModel <- stepFlexmix(y ~ 1, model = Model, nrep = 3, k = 3, data = NregFix, concomitant = FLXPmultinom(~ w)) fittedModel <- relabel(fittedModel, "model", "x1") summary(refit(fittedModel)) ################################################### ### code chunk number 4: diffModel ################################################### Model2 <- FLXMRglmfix(fixed = ~ x2, nested = list(k = c(1, 2), formula = c(~ 0, ~ x1)), varFix = TRUE) fittedModel2 <- flexmix(y ~ 1, model = Model2, cluster = posterior(fittedModel), data = NregFix, concomitant = FLXPmultinom(~ w)) BIC(fittedModel) BIC(fittedModel2) ################################################### ### code chunk number 5: artificial-example ################################################### plotNregFix <- NregFix plotNregFix$w <- factor(NregFix$w, levels = 0:1, labels = paste("w =", 0:1)) plotNregFix$x2 <- factor(NregFix$x2, levels = 0:1, labels = paste("x2 =", 0:1)) plotNregFix$class <- factor(NregFix$class, levels = 1:3, labels = paste("Class", 1:3)) print(xyplot(y ~ x1 | x2*w, groups = class, data = plotNregFix, cex = 0.6, auto.key = list(space="right"), layout = c(2,2))) ################################################### ### code chunk number 6: refit ################################################### summary(refit(fittedModel2)) ################################################### ### code chunk number 7: beta-glm ################################################### data("betablocker", package = "flexmix") betaGlm <- glm(cbind(Deaths, Total - Deaths) ~ Treatment, family = "binomial", data = betablocker) betaGlm ################################################### ### code chunk number 8: beta-fix ################################################### betaMixFix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ 1 | Center, model = FLXMRglmfix(family = "binomial", fixed = ~ Treatment), k = 2:4, nrep = 3, data = betablocker) betaMixFix ################################################### ### code chunk number 9: beta-fig ################################################### library("grid") betaMixFix_3 <- getModel(betaMixFix, "3") betaMixFix_3 <- relabel(betaMixFix_3, "model", "Intercept") betablocker$Center <- with(betablocker, factor(Center, levels = Center[order((Deaths/Total)[1:22])])) clusters <- factor(clusters(betaMixFix_3), labels = paste("Cluster", 1:3)) print(dotplot(Deaths/Total ~ Center | clusters, groups = Treatment, as.table = TRUE, data = betablocker, xlab = "Center", layout = c(3, 1), scales = list(x = list(draw = FALSE)), key = simpleKey(levels(betablocker$Treatment), lines = TRUE, corner = c(1,0)))) betaMixFix.fitted <- fitted(betaMixFix_3) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[1:22, i], "native"), gp = gpar(lty = 1)) grid.lines(unit(1:22, "native"), unit(betaMixFix.fitted[23:44, i], "native"), gp = gpar(lty = 2)) } ################################################### ### code chunk number 10: beta-full ################################################### betaMix <- stepFlexmix(cbind(Deaths, Total - Deaths) ~ Treatment | Center, model = FLXMRglm(family = "binomial"), k = 3, nrep = 3, data = betablocker) summary(betaMix) ################################################### ### code chunk number 11: default-plot ################################################### print(plot(betaMixFix_3, mark = 1, col = "grey", markcol = 1)) ################################################### ### code chunk number 12: parameters ################################################### parameters(betaMix) ################################################### ### code chunk number 13: cluster ################################################### table(clusters(betaMix)) ################################################### ### code chunk number 14: predict ################################################### predict(betaMix, newdata = data.frame(Treatment = c("Control", "Treated"))) ################################################### ### code chunk number 15: fitted ################################################### fitted(betaMix)[c(1, 23), ] ################################################### ### code chunk number 16: refit ################################################### summary(refit(getModel(betaMixFix, "3"))) ################################################### ### code chunk number 17: mehta-fix ################################################### data("Mehta", package = "flexmix") mehtaMix <- stepFlexmix(cbind(Response, Total - Response)~ 1 | Site, model = FLXMRglmfix(family = "binomial", fixed = ~ Drug), control = list(minprior = 0.04), nrep = 3, k = 3, data = Mehta) summary(mehtaMix) ################################################### ### code chunk number 18: mehta-fig ################################################### Mehta$Site <- with(Mehta, factor(Site, levels = Site[order((Response/Total)[1:22])])) clusters <- factor(clusters(mehtaMix), labels = paste("Cluster", 1:3)) print(dotplot(Response/Total ~ Site | clusters, groups = Drug, layout = c(3,1), data = Mehta, xlab = "Site", scales = list(x = list(draw = FALSE)), key = simpleKey(levels(Mehta$Drug), lines = TRUE, corner = c(1,0)))) mehtaMix.fitted <- fitted(mehtaMix) for (i in 1:3) { seekViewport(trellis.vpname("panel", i, 1)) sapply(1:nlevels(Mehta$Drug), function(j) grid.lines(unit(1:22, "native"), unit(mehtaMix.fitted[Mehta$Drug == levels(Mehta$Drug)[j], i], "native"), gp = gpar(lty = j))) } ################################################### ### code chunk number 19: mehta-full ################################################### mehtaMix <- stepFlexmix(cbind(Response, Total - Response) ~ Drug | Site, model = FLXMRglm(family = "binomial"), k = 3, data = Mehta, nrep = 3, control = list(minprior = 0.04)) summary(mehtaMix) ################################################### ### code chunk number 20: mehta-sub ################################################### Mehta.sub <- subset(Mehta, Site != 15) mehtaMix <- stepFlexmix(cbind(Response, Total - Response) ~ 1 | Site, model = FLXMRglmfix(family = "binomial", fixed = ~ Drug), data = Mehta.sub, k = 2, nrep = 3) summary(mehtaMix) ################################################### ### code chunk number 21: tribolium ################################################### data("tribolium", package = "flexmix") TribMix <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, k = 2:3, model = FLXMRglmfix(fixed = ~ Species, family = "binomial"), concomitant = FLXPmultinom(~ Replicate), data = tribolium) ################################################### ### code chunk number 22: wang-model ################################################### modelWang <- FLXMRglmfix(fixed = ~ I(Species == "Confusum"), family = "binomial") concomitantWang <- FLXPmultinom(~ I(Replicate == 3)) TribMixWang <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, data = tribolium, model = modelWang, concomitant = concomitantWang, k = 2) summary(refit(TribMixWang)) ################################################### ### code chunk number 23: tribolium ################################################### clusters <- factor(clusters(TribMixWang), labels = paste("Cluster", 1:TribMixWang@k)) print(dotplot(Remaining/Total ~ factor(Replicate) | clusters, groups = Species, data = tribolium[rep(1:9, each = 3) + c(0:2)*9,], xlab = "Replicate", auto.key = list(corner = c(1,0)))) ################################################### ### code chunk number 24: subset ################################################### TribMixWangSub <- stepFlexmix(cbind(Remaining, Total - Remaining) ~ 1, k = 2, data = tribolium[-7,], model = modelWang, concomitant = concomitantWang) ################################################### ### code chunk number 25: trypanosome ################################################### data("trypanosome", package = "flexmix") TrypMix <- stepFlexmix(cbind(Dead, 1-Dead) ~ 1, k = 2, nrep = 3, data = trypanosome, model = FLXMRglmfix(family = "binomial", fixed = ~ log(Dose))) summary(refit(TrypMix)) ################################################### ### code chunk number 26: trypanosome ################################################### tab <- with(trypanosome, table(Dead, Dose)) Tryp.dat <- data.frame(Dead = tab["1",], Alive = tab["0",], Dose = as.numeric(colnames(tab))) plot(Dead/(Dead+Alive) ~ Dose, data = Tryp.dat) Tryp.pred <- predict(glm(cbind(Dead, 1-Dead) ~ log(Dose), family = "binomial", data = trypanosome), newdata=Tryp.dat, type = "response") TrypMix.pred <- predict(TrypMix, newdata = Tryp.dat, aggregate = TRUE)[[1]] lines(Tryp.dat$Dose, Tryp.pred, lty = 2) lines(Tryp.dat$Dose, TrypMix.pred, lty = 3) legend(4.7, 1, c("GLM", "Mixture model"), lty=c(2, 3), xjust=0, yjust=1) ################################################### ### code chunk number 27: fabric-fix ################################################### data("fabricfault", package = "flexmix") fabricMix <- stepFlexmix(Faults ~ 1, model = FLXMRglmfix(family="poisson", fixed = ~ log(Length)), data = fabricfault, k = 2, nrep = 3) summary(fabricMix) summary(refit(fabricMix)) Lnew <- seq(0, 1000, by = 50) fabricMix.pred <- predict(fabricMix, newdata = data.frame(Length = Lnew)) ################################################### ### code chunk number 28: fabric-fix-nested ################################################### fabricMix2 <- flexmix(Faults ~ 0, data = fabricfault, cluster = posterior(fabricMix), model = FLXMRglmfix(family = "poisson", fixed = ~ log(Length), nested = list(k=c(1,1), formula=list(~0,~1)))) summary(refit(fabricMix2)) fabricMix2.pred <- predict(fabricMix2, newdata = data.frame(Length = Lnew)) ################################################### ### code chunk number 29: fabric-fig ################################################### plot(Faults ~ Length, data = fabricfault) sapply(fabricMix.pred, function(y) lines(Lnew, y, lty = 1)) sapply(fabricMix2.pred, function(y) lines(Lnew, y, lty = 2)) legend(190, 25, paste("Model", 1:2), lty=c(1, 2), xjust=0, yjust=1) ################################################### ### code chunk number 30: patent ################################################### data("patent", package = "flexmix") ModelPat <- FLXMRglm(family = "poisson") FittedPat <- stepFlexmix(Patents ~ lgRD, k = 3, nrep = 3, model = ModelPat, data = patent, concomitant = FLXPmultinom(~ RDS)) summary(FittedPat) ################################################### ### code chunk number 31: patent-fixed ################################################### ModelFixed <- FLXMRglmfix(family = "poisson", fixed = ~ lgRD) FittedPatFixed <- flexmix(Patents ~ 1, model = ModelFixed, cluster = posterior(FittedPat), concomitant = FLXPmultinom(~ RDS), data = patent) summary(FittedPatFixed) ################################################### ### code chunk number 32: Poisson ################################################### lgRDv <- seq(-3, 5, by = 0.05) newdata <- data.frame(lgRD = lgRDv) plotData <- function(fitted) { with(patent, data.frame(Patents = c(Patents, unlist(predict(fitted, newdata = newdata))), lgRD = c(lgRD, rep(lgRDv, 3)), class = c(clusters(fitted), rep(1:3, each = nrow(newdata))), type = rep(c("data", "fit"), c(nrow(patent), nrow(newdata)*3)))) } plotPatents <- cbind(plotData(FittedPat), which = "Wang et al.") plotPatentsFixed <- cbind(plotData(FittedPatFixed), which = "Fixed effects") plotP <- rbind(plotPatents, plotPatentsFixed) rds <- seq(0, 3, by = 0.02) x <- model.matrix(FittedPat@concomitant@formula, data = data.frame(RDS = rds)) plotConc <- function(fitted) { E <- exp(x%*%fitted@concomitant@coef) data.frame(Probability = as.vector(E/rowSums(E)), class = rep(1:3, each = nrow(x)), RDS = rep(rds, 3)) } plotConc1 <- cbind(plotConc(FittedPat), which = "Wang et al.") plotConc2 <- cbind(plotConc(FittedPatFixed), which = "Fixed effects") plotC <- rbind(plotConc1, plotConc2) print(xyplot(Patents ~ lgRD | which, data = plotP, groups=class, xlab = "log(R&D)", panel = "panel.superpose", type = plotP$type, panel.groups = function(x, y, type = "p", subscripts, ...) { ind <- plotP$type[subscripts] == "data" panel.xyplot(x[ind], y[ind], ...) panel.xyplot(x[!ind], y[!ind], type = "l", ...) }, scales = list(alternating=FALSE), layout=c(1,2), as.table=TRUE), more=TRUE, position=c(0,0,0.6, 1)) print(xyplot(Probability ~ RDS | which, groups = class, data = plotC, type = "l", scales = list(alternating=FALSE), layout=c(1,2), as.table=TRUE), position=c(0.6, 0.01, 1, 0.99)) ################################################### ### code chunk number 33: seizure ################################################### data("seizure", package = "flexmix") seizMix <- stepFlexmix(Seizures ~ Treatment * log(Day), data = seizure, k = 2, nrep = 3, model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix) summary(refit(seizMix)) ################################################### ### code chunk number 34: seizure ################################################### seizMix2 <- flexmix(Seizures ~ Treatment * log(Day/27), data = seizure, cluster = posterior(seizMix), model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix2) summary(refit(seizMix2)) ################################################### ### code chunk number 35: seizure ################################################### seizMix3 <- flexmix(Seizures ~ log(Day/27)/Treatment, data = seizure, cluster = posterior(seizMix), model = FLXMRglm(family = "poisson", offset = log(seizure$Hours))) summary(seizMix3) summary(refit(seizMix3)) ################################################### ### code chunk number 36: seizure ################################################### plot(Seizures/Hours~Day, pch = c(1,3)[as.integer(Treatment)], data=seizure) abline(v=27.5, lty=2, col="grey") legend(140, 9, c("Baseline", "Treatment"), pch=c(1, 3), xjust=1, yjust=1) matplot(seizure$Day, fitted(seizMix)/seizure$Hours, type="l", add=TRUE, lty = 1, col = 1) matplot(seizure$Day, fitted(seizMix3)/seizure$Hours, type="l", add=TRUE, lty = 3, col = 1) legend(140, 7, paste("Model", c(1,3)), lty=c(1, 3), xjust=1, yjust=1) ################################################### ### code chunk number 37: salmonella ################################################### data("salmonellaTA98", package = "flexmix") salmonMix <- stepFlexmix(y ~ 1, data = salmonellaTA98, k = 2, nrep = 3, model = FLXMRglmfix(family = "poisson", fixed = ~ x + log(x + 10))) ################################################### ### code chunk number 38: salmonella ################################################### salmonMix.pr <- predict(salmonMix, newdata=salmonellaTA98) plot(y~x, data=salmonellaTA98, pch=as.character(clusters(salmonMix)), xlab="Dose of quinoline", ylab="Number of revertant colonies of salmonella", ylim=range(c(salmonellaTA98$y, unlist(salmonMix.pr)))) for (i in 1:2) lines(salmonellaTA98$x, salmonMix.pr[[i]], lty=i) ################################################### ### code chunk number 39: regression-examples.Rnw:923-927 ################################################### SI <- sessionInfo() pkgs <- paste(sapply(c(SI$otherPkgs, SI$loadedOnly), function(x) paste("\\\\pkg{", x$Package, "} ", x$Version, sep = "")), collapse = ", ") flexmix/inst/doc/myConcomitant.R0000644000175100001440000000130311703222720016426 0ustar hornikusersmyConcomitant <- function(formula = ~ 1) { z <- new("FLXP", name = "myConcomitant", formula = formula) z@fit <- function(x, y, w, ...) { if (missing(w) || is.null(w)) w <- rep(1, length(x)) f <- as.integer(factor(apply(x, 1, paste, collapse = ""))) AVG <- apply(w*y, 2, tapply, f, mean) (AVG/rowSums(AVG))[f,,drop=FALSE] } z@refit <- function(x, y, w, ...) { if (missing(w) || is.null(w)) w <- rep(1, length(x)) f <- as.integer(factor(apply(x, 1, paste, collapse = ""))) AVG <- apply(w*y, 2, tapply, f, mean) (AVG/rowSums(AVG)) } z } flexmix/inst/CITATION0000644000175100001440000000441713740553643014076 0ustar hornikuserscitHeader("To cite package flexmix in publications use:") citEntry(entry="Article", title = "{FlexMix}: A General Framework for Finite Mixture Models and Latent Class Regression in {R}", author = person(given="Friedrich", family="Leisch"), journal = "Journal of Statistical Software", year = "2004", volume = "11", number = "8", pages = "1--18", doi = "10.18637/jss.v011.i08", url = "https://www.jstatsoft.org/v11/i08/", textVersion = paste("Friedrich Leisch. FlexMix: A general framework for finite mixture models", "and latent class regression in R. Journal of Statistical Software, 11(8), 1-18, 2004.", "doi:10.18637/jss.v011.i08") ) citEntry(entry="Article", title = "Fitting Finite Mixtures of Generalized Linear Regressions in {R}", author = personList(person(given="Bettina", family="Gr\\\"un"), person(given="Friedrich", family="Leisch")), journal = "Computational Statistics \\& Data Analysis", year = "2007", volume = "51", number = "11", pages = "5247--5252", doi = "10.1016/j.csda.2006.08.014", textVersion = paste("Bettina Gruen and Friedrich Leisch. Fitting finite mixtures", "of generalized linear regressions in R. Computational Statistics", "& Data Analysis, 51(11), 5247-5252, 2007.", "doi:10.1016/j.csda.2006.08.014") ) citEntry(entry="Article", title = "{FlexMix} Version 2: Finite Mixtures with Concomitant Variables and Varying and Constant Parameters", author = personList(person(given="Bettina", family="Gr\\\"un"), person(given="Friedrich", family="Leisch")), journal = "Journal of Statistical Software", year = "2008", volume = "28", number = "4", pages = "1--35", doi = "10.18637/jss.v028.i04", url = "https://www.jstatsoft.org/v28/i04/", textVersion = paste("Bettina Gruen and Friedrich Leisch. FlexMix Version 2: Finite mixtures with", "concomitant variables and varying and constant parameters", "Journal of Statistical Software, 28(4), 1-35, 2008.", "doi:10.18637/jss.v028.i04") ) flexmix/inst/NEWS.Rd0000644000175100001440000004610513740553643014004 0ustar hornikusers\name{NEWS} \title{News for Package 'flexmix'} \section{Changes in flexmix version 2.3-17}{ \itemize{ \item A model class for sparse model-based clustering added with a suitable method to resolve the formula and extract the data. \item There was a bug with dimensions being dropped if only a single individual was used for grouping. Thanks to Adam Hulman for pointing this issue out. \item The \code{FLXgetModelmatrix} method for `\code{FLXMRlmm}' objects has been improved. Thanks to Adam Hulman for pointing out that this might be unnecessarily slow. } } \section{Changes in flexmix version 2.3-16}{ \itemize{ \item The vignette explaining model diagnostics using resampling methods was modified to use more replications. Thanks to Eric Book for pointing this issue out. } } \section{Changes in flexmix version 2.3-15}{ \itemize{ \item Modified the internal function \code{groupPosteriors} to be more efficient for a large number of groups. Thanks to Marnix Koops for pointing the problem out. \item Model driver \code{FLXMRlmer()} adapted for \pkg{lme4} (>= 1.1). Thanks to Mark Senior for pointing the problem out. \item Model driver \code{FLXMRmgcv()} adapted for \pkg{mgcv} (>= 1.8-27). \item Data set \code{Catsup} is now loaded from package \pkg{Ecdat} instead of \pkg{mlogit}. } } \section{Changes in flexmix version 2.3-14}{ \itemize{ \item A bug fixed for \code{FLXMRcondlogit()} to ensure that the formula for the strata is also stored and can be used for predicting, etc. new data. Thanks to Peter Fraser-Mackenziefor for pointing the problem out. \item A bug fixed for \code{FLXMRglmfix()} which occurred if several components were simultaneously omitted. Thanks to Moritz Berger for pointing the problem out. \item For mixtures of mixed effects models and with censored data only weighted ML estimation is implemented. This is now checked and an error is given if a different estimation method is requested. \item A generic function \code{sigma()} is available for R >= 3.3.0 and thus different versions of \code{sigma()} need to be called depending on the R version. Thanks also to Stephen Martin for pointing the issue out. \item Components are now generated using functions instead of expressions. \item Functions from the base packages \pkg{stats}, \pkg{graphics} and \pkg{grDevices} are now correctly imported before being used. \item Function \code{FLXMCdist1} implements model drivers for univariate mixtures of different distributions. } } \section{Changes in flexmix version 2.3-13}{ \itemize{ \item A model driver for mixtures of regression models with (adaptive) lasso and elastic net penalizations for the coefficients building on \pkg{glmnet} was provided by Frederic Mortier and Nicolas Picard. \item A bug in a coerce method to class \code{"FLXnested"} fixed. } } \section{Changes in flexmix version 2.3-12}{ \itemize{ \item Construction of model matrices changed to re-use levels of factors while fitting for prediction. Thanks to Robert Poos for pointing the problem out. \item Package mgcv of version at least 1.8-0 is required in order to avoid loading of the package for formula evaluation. } } \section{Changes in flexmix version 2.3-11}{ \itemize{ \item Examples changed to be less time consuming. \item Bug fixed in ungroupPriors() and getPriors() to work with a grouping where only one unique value is contained. Thanks to Christine Koehler for pointing the problem out. \item The \code{logLik()} method for \code{"flexmix"} objects now also has a \code{newdata} argument. \item In the M-step only the parameters of the previously fitted components are passed over to avoid nesting of environments. Thanks to Dominik Ernst for pointing the problem out. \item Function \code{boot()} was fixed to work correctly with grouped data if the groups are kept and if fixed effects are fitted. \item Authors@R used in DESCRIPTION. Deepayan Sarkar listed as contributor due to internal code copied from package lattice used for the plots in flexmix. \item Model driver \code{FLXMRlmer()} adapted for \pkg{lme4} (>= 1.0). } } \section{Changes in flexmix version 2.3-10}{ \itemize{ \item Parallel processing disabled in \code{stepFlexmix()}. } } \section{Changes in flexmix version 2.3-9}{ \itemize{ \item Package dependencies, imports and suggests modified suitably for R >= 2.15.0. \item NEWS file adapted to a NEWS.Rd file. \item Parallel processing is enabled in \code{stepFlexmix()}. See \pkg{flexclust} for details. \item New model drivers \code{FLXMRmultinom()} and \code{FLXMRcondlogit()} are included which allow to fit finite mixtures of multinomial logit and conditional logit models. Identifiability problems might arise for this model class. Details on sufficient identifiability conditions are given in Gruen and Leisch (2008). \item A bug in \code{FLXMRlmm()} was fixed which did not allow to specify restrictions on the variances of the random effects and / or the residuals. Thanks to Gregory Matthews for pointing the problem out. } } \section{Changes in flexmix version 2.3-8}{ \itemize{ \item The fit function in the M-step by default now is called with an argument containing the fitted component. This allows to use the parameter estimates from the previous step for initialization. Fit functions which do not require this now need a \code{...} argument. Thanks to Hannah Frick and Achim Zeileis for requesting this feature. \item Function \code{initFlexmix()} was added which is an alternative to \code{stepFlexmix()} where first several short runs of EM, SEM or CEM are performed followed by a long run of EM. } } \section{Changes in flexmix version 2.3-7}{ \itemize{ \item A bug fixed in \code{predict()} and \code{fitted()} if a concomitant variable model is specified and \code{aggregate = TRUE}. Thanks to Julia Schiffner for pointing this out. \item A bug fixed in \code{FLXMRmgcv()} if observations were removed in the M-step because their a-posterior probabilities were smaller than eps. Thanks to Ghislain Geniaux for pointing the problem out. } } \section{Changes in flexmix version 2.3-6}{ \itemize{ \item Vignettes moved from /inst/doc to /vignettes. \item \code{stepFlexmix()} can now be called with a concomitant variable model \code{FLXPmultinom()} for \code{k} starting with 1 without getting an error. The concomitant variable model is internally replaced by \code{FLXPconstant()}. \item The \code{boot()} method for \code{"flexmix"} objects is extended to mixture models with concomitant variables and mixtures of linear mixed models. \item A bug fixed in the \code{summary()} method for \code{"flexmix"} objects. The column post > 0 did not give the correct results if weights were used for fitting the mixture. \item A bug fixed in the \code{unique()} method for \code{"stepFlexmix"} objects. This only occurred if components were dropped as well as if the EM algorithm did not converge for all repetitions. Thanks to Sebastian Meyer for pointing this out. } } \section{Changes in flexmix version 2.3-5}{ \itemize{ \item A bug fixed in \code{posterior()}. Fixed priors were always used, also if a concomitant variable model was present. \item A method added for \code{prior()} such that if newdata is supplied and the object is of class \code{"flexmix"} the prior class probabilities for each observation are returned. } } \section{Changes in flexmix version 2.3-4}{ \itemize{ \item A generic method for \code{nobs()} is introduced in \pkg{stats4} for \R 2.13.0. \pkg{flexmix} now does not define this generic function and \code{logLik()}, \code{AIC()} and \code{BIC()} methods were modified to better exploit already available methods. Thanks to Prof. Brian D. Ripley for suggesting the modification. } } \section{Changes in flexmix version 2.3-3}{ \itemize{ \item A bug for \code{boot()} fixed for \code{"flexmix"} objects with an unbalanced grouping variable. Thanks to Laszlo Sandor for pointing this out. } } \section{Changes in flexmix version 2.3-2}{ \itemize{ \item A bug for \code{rflexmix()} fixed for \code{"flexmix"} objects with a concomitant variable model. Thanks to Greg Petroski for pointing this out. } } \section{Changes in flexmix version 2.3-1}{ \itemize{ \item Functionality for bootstrapping finite mixture models added. } } \section{Changes in flexmix version 2.2-11}{ \itemize{ \item More generics and methods exported to use the \code{refit()} method when extending \pkg{flexmix} in other packages. } } \section{Changes in flexmix version 2.2-10}{ \itemize{ \item For long formulas \code{FLXMRglmfix()} did not work properly due to the splitting of the formula into several parts by \code{deparse()}. This is fixed by pasting them together again. Thanks to Dustin Tingley for the bug report. } } \section{Changes in flexmix version 2.2-9}{ \itemize{ \item A new model driver \code{FLXMRmgcv()} is added which allows to fit regularized linear models in the components. \item More generics and methods exported to allow extending \pkg{flexmix} in other packages. } } \section{Changes in flexmix version 2.2-8}{ \itemize{ \item The a-posteriori probabilities are now also determined as changed for \code{FLXfit()} for version 2.2-6 for \code{refit()}. \item Bug fixed for FLXfillconcomitant and refit when weights and grouping are present. A check was added that weights are identical within groups. \item Function \code{group()} is now exported. } } \section{Changes in flexmix version 2.2-7}{ \itemize{ \item Bug in the \code{FLXgetModelmatrix()} method for the \code{"FLXMRlmm"} class fixed when determining identical random effects covariates for the grouping. \item A new model driver for finite mixtures of linear mixed effects models with left-censored observations is added. } } \section{Changes in flexmix version 2.2-6}{ \itemize{ \item Determination of the a-posteriori probabilities made numerically more stable for small likelihoods. Thanks to Nicolas Picard for the code patch. \item \code{summary()} for \code{"FLXMRmstep"} objects now returns similar output for \code{which = "concomitant"} as for \pkg{flexmix} version 2.0-1. \item New demo driver \code{FLXMCnorm1()} for univariate Gaussian clustering. \item Non-postive values for the maximum number of iterations for the \code{"FLXcontrol"} object are not valid. A validity check for this is now included. } } \section{Changes in flexmix version 2.2-5}{ \itemize{ \item Model class \code{"FLXMRfix"} introduced which is a subclass of \code{"FLXMR"} and a superclass for \code{"FLXMRglmfix"} which also extends \code{"FLXMRglm"}. \item Model driver \code{FLXMCfactanal()} added which allows to fit finite mixtures of Gaussian distributions where the variance-covariance matrix is estimated using factor analyzers. \item Comparison of formulas now done using \code{identical()}. } } \section{Changes in flexmix version 2.2-4}{ \itemize{ \item Model drivers \code{FLXMRlmer()} and \code{FLXMRlmm()} added for fitting finite mixtures of linear mixed effects models. \item \code{EIC()} added as additional information criterion for assessing model fit. \item Bug fixed in \code{plot()} method for \code{"flexmix"} objects introduced in version 2.2-3. } } \section{Changes in flexmix version 2.2-3}{ \itemize{ \item New model driver \code{FLXMCmvcombi()} which is a combination of Gaussian and binary. \item \code{parameters()} now also has a which argument in order to allow to access the parameters of the concomitant variable model. \item Bug fixed in \code{refit()}. \item \code{nobs()} now returns the number of rows in the data.frame and not the number of individuals (similar as for example by lme). } } \section{Changes in flexmix version 2.2-0}{ \itemize{ \item vignette describing Version 2 added \item isTRUE(\code{all.equal()}) replaced with \code{identical()}. \item Bug fixed for prior in \code{flexmix()}. \item New function \code{relabel()} to sort components (generic is in modeltools). \item New example data generator \code{ExLinear()}. \item Fixed a bug in handling groups (gave an error for empty design matrices). \item Added new model \code{FLXMRrobglm()} for robust estimation of GLMs. } } \section{Changes in flexmix version 2.1-0}{ \itemize{ \item Renamed \code{cluster()} to \code{clusters()} to avoid conflict with \code{cluster()} from package survival \item Bug fixed in internal functions using S4 generics and methods. } } \section{Changes in flexmix version 2.0-2}{ \itemize{ \item \code{refit()} now has a method argument. For method \code{"optim"} the variance-covariance matrix is determined using \code{optim()} to maximize the likelihood initialized in the solution found by the EM algorithm. Method \code{"mstep"} refits the component specific and concomitant models treating the posterior probabilities as given, i.e. performs an M-step of the EM algorithm. } } \section{Changes in flexmix version 2.0-1}{ \itemize{ \item \code{Lapply()} added which allows to apply a function to each component of a finite mixture \item \code{KLdiv()} modified to allow for determination with a discrete and a continuous version of the KL divergence } } \section{Changes in flexmix version 2.0-0}{ \itemize{ \item Model driver for zero-inflated component specific models. \item Latent class analysis for binary multivariate data is now possible to estimate for truncated data where the number of observations with pattern only zeros is missing. \item new argument newdata for \code{cluster()} \item new \code{unique()} method for \code{"stepFlexmix"} objects } } \section{Changes in flexmix version 1.9-0}{ \itemize{ \item New class definitions for component specific models and concomitant variable models. \item \code{fitted()} and \code{predict()} now have an aggregate argument in order to be able to determine the aggregated values over all components. \item The package has now a vignette presenting several applications of finite mixtures of regression models with varying and fixed effects on artificial and real data which can be a accessed using the command vignette("regression-examples"). \item The vignette "flexmix-intro" was adapted to reflect the changes made in the package. \item \code{stepFlexmix()} now returns an object of class \code{"stepFlexmix"} which has a \code{print()} and \code{plot()} method. In addition \code{getModel()} can be used to select an appropriate model. \item \code{flexmix()} now has a weights argument for multiple identical observations. \item New model drivers for latent class analysis with Bernoulli and Poisson distributed multivariate observations. \item Variants of the EM algorithm have been modified to correspond to CEM and SEM. These names can now also be used for specifying the classify slot of the \code{"FLXcontrol"} object. } } \section{Changes in flexmix version 1.8-1}{ \itemize{ \item The package can now fit concomitant variable models. \item New M-step driver for regression models with varying and fixed effects. \item ICL information criterion added. } } \section{Changes in flexmix version 1.1-2}{ \itemize{ \item Fixed a bug that made the log-likelihood infinity for observations where all posteriors are numerically zero. \item Fixed a bug for formulae with dots. \item \code{posterior()} now has a newdata argument. \item New demo driver for model-based clustering of binary data. \item Adapted to changes in \code{summary.glm()} of \R version 2.3.0. } } \section{Changes in flexmix version 1.1-1}{ \itemize{ \item The \code{cluster} argument of \code{flexmix()} may now also be a matrix of posterior probabilities. \item Fixed a bug to make size table work in case of empty clusters. \item Fixed a bug in likelihood computation for grouped observations. \item The artificial NPreg data now also have a binomial response, added example to help(\code{"flexmix"}). } } \section{Changes in flexmix version 1.1-0}{ \itemize{ \item The \code{FLXglm()} driver now has an offset argument. \item New data set seizure as example for a Poisson GLM with an offset. \item \code{fitted()} can be used to extract fitted values from \code{"flexmix"} and \code{"FLXrefit"} objects. \item New accessor methods \code{cluster()} and \code{posterior()}. \item The package now uses lazy loading and has a namespace. } } \section{Changes in flexmix version 1.0-0}{ \itemize{ \item The package has now an introductionary vignette which can be accessed using the command vignette("flexmix-intro"). The vignette has been published in the Journal of Statistical Software, Volume 11, Issue 8 (\url{https://www.jstatsoft.org/v11/i08}), and the paper should be used as citation for \pkg{flexmix}, run \code{citation("flexmix")} in \R 2.0.0 or newer for details. \item Several typos in help pages have been fixed. } } \section{Changes in flexmix version 0.9-1}{ \itemize{ \item Adjusted for \R 2.0.0. \item Fixed a bug in the \code{summary()} and \code{plot()} methods of \code{"flexmix"} objects in case of empty clusters. \item \code{stepFlexmix()} takes two new arguments: \code{compare} allows fo find minimum AIC/BIC solutions in addition to maximum likelihood, \code{verbose} gives some information about progress. \item Use a default of \code{verbose = 0} in \code{FLXcontrol()} (better in combination with \code{stepFlexmix()}). } } \section{Changes in flexmix version 0.9-0}{ \itemize{ \item New \code{summary()} and \code{plot()} methods for \code{"flexmix"} objects. \item \code{"FLXglm"} objects can now be automatically \code{refit()}ted to get table of significance tests for coefficients. \item New function \code{stepFlexmix()} for more automated model search. \item The artificial example data now have functions to create them and a pre-stored data sets, new function \code{plotEll()} to plot 2d Gaussians with confidence ellipses. \item New function \code{KLdiv()} to compute Kullback-Leibler divergence of components. \item The calculation of the degrees of freedom for \code{FLXmclust()} was wrong } } \section{Changes in flexmix version 0.7-1}{ \itemize{ \item Fixed some codoc problems (missing aliases). \item First version released on CRAN: 0.7-0 } }